From 421f424b20c45111ea17d021b33cf571983da138 Mon Sep 17 00:00:00 2001 From: psperl Date: Mon, 1 Oct 2007 18:08:27 +0000 Subject: [PATCH] Windows Libraries + FTGL and Textures working on Win32 git-svn-id: https://projectm.svn.sourceforge.net/svnroot/projectm/trunk@494 6778bc44-b910-0410-a7a0-be141de4315d --- src/WinLibs/FTGL/COPYING.txt | 481 + src/WinLibs/FTGL/HISTORY.txt | 307 + src/WinLibs/FTGL/README.txt | 51 + src/WinLibs/FTGL/cleanup | 4 + src/WinLibs/FTGL/demo/FTGLDemo.cpp | 498 + src/WinLibs/FTGL/demo/README.txt | 15 + src/WinLibs/FTGL/demo/tb.c | 127 + src/WinLibs/FTGL/demo/tb.h | 103 + src/WinLibs/FTGL/demo/trackball.c | 324 + src/WinLibs/FTGL/demo/trackball.h | 85 + src/WinLibs/FTGL/docs/FTGL.html | 332 + src/WinLibs/FTGL/docs/FTGL_1_3.gif | Bin 0 -> 42553 bytes src/WinLibs/FTGL/docs/ftgl_dox | 211 + src/WinLibs/FTGL/docs/html.tar.gz | Bin 0 -> 106540 bytes src/WinLibs/FTGL/docs/images/ftgldemo.jpg | Bin 0 -> 34812 bytes src/WinLibs/FTGL/docs/images/metrics.png | Bin 0 -> 2219 bytes src/WinLibs/FTGL/include/FTBBox.h | 124 + src/WinLibs/FTGL/include/FTBitmapGlyph.h | 76 + .../FTGL/include/FTCharToGlyphIndexMap.h | 130 + src/WinLibs/FTGL/include/FTCharmap.h | 136 + src/WinLibs/FTGL/include/FTContour.h | 88 + src/WinLibs/FTGL/include/FTExtrdGlyph.h | 69 + src/WinLibs/FTGL/include/FTFace.h | 147 + src/WinLibs/FTGL/include/FTFont.h | 276 + src/WinLibs/FTGL/include/FTGL.h | 86 + src/WinLibs/FTGL/include/FTGLBitmapFont.h | 65 + src/WinLibs/FTGL/include/FTGLExtrdFont.h | 63 + src/WinLibs/FTGL/include/FTGLOutlineFont.h | 64 + src/WinLibs/FTGL/include/FTGLPixmapFont.h | 68 + src/WinLibs/FTGL/include/FTGLPolygonFont.h | 53 + src/WinLibs/FTGL/include/FTGLTextureFont.h | 151 + src/WinLibs/FTGL/include/FTGlyph.h | 101 + src/WinLibs/FTGL/include/FTGlyphContainer.h | 127 + src/WinLibs/FTGL/include/FTLibrary.h | 97 + src/WinLibs/FTGL/include/FTList.h | 112 + src/WinLibs/FTGL/include/FTOutlineGlyph.h | 57 + src/WinLibs/FTGL/include/FTPixmapGlyph.h | 68 + src/WinLibs/FTGL/include/FTPoint.h | 162 + src/WinLibs/FTGL/include/FTPolyGlyph.h | 59 + src/WinLibs/FTGL/include/FTSize.h | 138 + src/WinLibs/FTGL/include/FTTextureGlyph.h | 94 + src/WinLibs/FTGL/include/FTVector.h | 190 + src/WinLibs/FTGL/include/FTVectoriser.h | 275 + src/WinLibs/FTGL/license.txt | 27 + src/WinLibs/FTGL/mac/FTGL.xcode/henry.mode1 | 1350 ++ src/WinLibs/FTGL/mac/FTGL.xcode/henry.pbxuser | 2333 +++ .../FTGL/mac/FTGL.xcode/project.pbxproj | 1996 +++ src/WinLibs/FTGL/mac/README.txt | 20 + src/WinLibs/FTGL/src/FTBitmapGlyph.cpp | 65 + src/WinLibs/FTGL/src/FTCharmap.cpp | 62 + src/WinLibs/FTGL/src/FTContour.cpp | 147 + src/WinLibs/FTGL/src/FTExtrdGlyph.cpp | 173 + src/WinLibs/FTGL/src/FTFace.cpp | 143 + src/WinLibs/FTGL/src/FTFont.cpp | 297 + src/WinLibs/FTGL/src/FTGLBitmapFont.cpp | 66 + src/WinLibs/FTGL/src/FTGLExtrdFont.cpp | 35 + src/WinLibs/FTGL/src/FTGLOutlineFont.cpp | 66 + src/WinLibs/FTGL/src/FTGLPixmapFont.cpp | 83 + src/WinLibs/FTGL/src/FTGLPolygonFont.cpp | 33 + src/WinLibs/FTGL/src/FTGLTextureFont.cpp | 182 + src/WinLibs/FTGL/src/FTGlyph.cpp | 17 + src/WinLibs/FTGL/src/FTGlyphContainer.cpp | 91 + src/WinLibs/FTGL/src/FTLibrary.cpp | 64 + src/WinLibs/FTGL/src/FTOutlineGlyph.cpp | 66 + src/WinLibs/FTGL/src/FTPixmapGlyph.cpp | 73 + src/WinLibs/FTGL/src/FTPoint.cpp | 19 + src/WinLibs/FTGL/src/FTPolyGlyph.cpp | 77 + src/WinLibs/FTGL/src/FTSize.cpp | 104 + src/WinLibs/FTGL/src/FTTextureGlyph.cpp | 84 + src/WinLibs/FTGL/src/FTVectoriser.cpp | 225 + src/WinLibs/FTGL/test/FTBBox-Test.cpp | 154 + src/WinLibs/FTGL/test/FTBitmapGlyph-Test.cpp | 84 + .../FTGL/test/FTCharToGlyphIndexMap-Test.cpp | 64 + src/WinLibs/FTGL/test/FTCharmap-Test.cpp | 143 + src/WinLibs/FTGL/test/FTContour-Test.cpp | 226 + src/WinLibs/FTGL/test/FTExtrdGlyph-Test.cpp | 91 + src/WinLibs/FTGL/test/FTFace-Test.cpp | 130 + src/WinLibs/FTGL/test/FTFont-Test.cpp | 294 + src/WinLibs/FTGL/test/FTGLBitmapFont-Test.cpp | 109 + .../FTGL/test/FTGLExtrdFont.cpp-Test.cpp | 104 + .../FTGL/test/FTGLOutlineFont-Test.cpp | 104 + src/WinLibs/FTGL/test/FTGLPixmapFont-Test.cpp | 85 + .../FTGL/test/FTGLPolygonFont-Test.cpp | 105 + .../FTGL/test/FTGLTextureFont-Test.cpp | 101 + src/WinLibs/FTGL/test/FTGlyph-Test.cpp | 104 + .../FTGL/test/FTGlyphContainer-Test.cpp | 122 + src/WinLibs/FTGL/test/FTLibrary-Test.cpp | 51 + src/WinLibs/FTGL/test/FTList-Test.cpp | 81 + src/WinLibs/FTGL/test/FTMesh-Test.cpp | 142 + src/WinLibs/FTGL/test/FTOutlineGlyph-Test.cpp | 89 + src/WinLibs/FTGL/test/FTPixmapGlyph-Test.cpp | 97 + src/WinLibs/FTGL/test/FTPoint-Test.cpp | 162 + src/WinLibs/FTGL/test/FTPolyGlyph-Test.cpp | 91 + src/WinLibs/FTGL/test/FTSize-Test.cpp | 94 + src/WinLibs/FTGL/test/FTTesselation-Test.cpp | 73 + src/WinLibs/FTGL/test/FTTextureGlyph-Test.cpp | 117 + src/WinLibs/FTGL/test/FTVector-Test.cpp | 86 + src/WinLibs/FTGL/test/FTVectoriser-Test.cpp | 465 + src/WinLibs/FTGL/test/FTlayout-Test.cpp | 40 + src/WinLibs/FTGL/test/Fontdefs.h | 39 + src/WinLibs/FTGL/test/HPGCalc_afm.cpp | 70 + src/WinLibs/FTGL/test/HPGCalc_pfb.cpp | 275 + src/WinLibs/FTGL/test/README.txt | 22 + src/WinLibs/FTGL/test/TestMain.cpp | 44 + src/WinLibs/FTGL/test/demo.cpp | 324 + src/WinLibs/FTGL/test/font_pack/README.txt | 19 + src/WinLibs/FTGL/test/mmgr.cpp | 1742 ++ src/WinLibs/FTGL/test/mmgr.h | 172 + src/WinLibs/FTGL/test/nommgr.h | 60 + src/WinLibs/FTGL/unix/Make.conf.in | 66 + src/WinLibs/FTGL/unix/Make.rules | 33 + src/WinLibs/FTGL/unix/Makefile | 47 + src/WinLibs/FTGL/unix/README.txt | 51 + src/WinLibs/FTGL/unix/acinclude.m4 | 341 + src/WinLibs/FTGL/unix/aclocal.m4 | 3988 +++++ src/WinLibs/FTGL/unix/bootstrap | 9 + src/WinLibs/FTGL/unix/config.guess | 1409 ++ src/WinLibs/FTGL/unix/config.sub | 1473 ++ src/WinLibs/FTGL/unix/configure | 11386 +++++++++++++ src/WinLibs/FTGL/unix/configure.ac | 47 + src/WinLibs/FTGL/unix/demo/Makefile | 50 + src/WinLibs/FTGL/unix/docs/Makefile | 25 + src/WinLibs/FTGL/unix/ftgl.pc.in | 11 + src/WinLibs/FTGL/unix/install-sh | 251 + src/WinLibs/FTGL/unix/ltmain.sh | 5107 ++++++ src/WinLibs/FTGL/unix/m4/cxx.m4 | 29 + src/WinLibs/FTGL/unix/m4/freetype2.m4 | 112 + src/WinLibs/FTGL/unix/m4/gl.m4 | 100 + src/WinLibs/FTGL/unix/m4/glut.m4 | 100 + src/WinLibs/FTGL/unix/src/Makefile | 89 + src/WinLibs/FTGL/win32_vcpp/README_WIN32.txt | 206 + .../win32_vcpp/build/ftgl_static_MT_d.lib | Bin 0 -> 752982 bytes src/WinLibs/FTGL/win32_vcpp/ftgl.dsw | 92 + .../FTGL/win32_vcpp/ftgl_demo/demo.cpp | 604 + .../FTGL/win32_vcpp/ftgl_demo/ftgl_demo.dsp | 154 + .../FTGL/win32_vcpp/ftgl_demo/ftgl_demo_2.dsp | 170 + .../FTGL/win32_vcpp/ftgl_dll/ftgl_dll.dsp | 357 + .../ftgl_static_lib/Debug_ST/BuildLog.htm | Bin 0 -> 68442 bytes .../Debug_ST/FTBitmapGlyph.obj | Bin 0 -> 40505 bytes .../ftgl_static_lib/Debug_ST/FTCharmap.obj | Bin 0 -> 27012 bytes .../ftgl_static_lib/Debug_ST/FTContour.obj | Bin 0 -> 38188 bytes .../ftgl_static_lib/Debug_ST/FTExtrdGlyph.obj | Bin 0 -> 59291 bytes .../ftgl_static_lib/Debug_ST/FTFace.obj | Bin 0 -> 28167 bytes .../ftgl_static_lib/Debug_ST/FTFont.obj | Bin 0 -> 51535 bytes .../Debug_ST/FTGLBitmapFont.obj | Bin 0 -> 23488 bytes .../Debug_ST/FTGLExtrdFont.obj | Bin 0 -> 21028 bytes .../Debug_ST/FTGLOutlineFont.obj | Bin 0 -> 23639 bytes .../Debug_ST/FTGLPixmapFont.obj | Bin 0 -> 25384 bytes .../Debug_ST/FTGLPolygonFont.obj | Bin 0 -> 20864 bytes .../Debug_ST/FTGLTextureFont.obj | Bin 0 -> 63399 bytes .../ftgl_static_lib/Debug_ST/FTGlyph.obj | Bin 0 -> 20652 bytes .../Debug_ST/FTGlyphContainer.obj | Bin 0 -> 38812 bytes .../ftgl_static_lib/Debug_ST/FTLibrary.obj | Bin 0 -> 15414 bytes .../Debug_ST/FTOutlineGlyph.obj | Bin 0 -> 27460 bytes .../Debug_ST/FTPixmapGlyph.obj | Bin 0 -> 24357 bytes .../ftgl_static_lib/Debug_ST/FTPoint.obj | Bin 0 -> 14336 bytes .../ftgl_static_lib/Debug_ST/FTPolyGlyph.obj | Bin 0 -> 30557 bytes .../ftgl_static_lib/Debug_ST/FTSize.obj | Bin 0 -> 19954 bytes .../Debug_ST/FTTextureGlyph.obj | Bin 0 -> 26162 bytes .../ftgl_static_lib/Debug_ST/FTVectoriser.obj | Bin 0 -> 77345 bytes .../ftgl_static_lib/Debug_ST/vc80.idb | Bin 0 -> 584704 bytes .../ftgl_static_lib/Debug_ST/vc80.pdb | Bin 0 -> 241664 bytes .../ftgl_static_lib/Release_ST/BuildLog.htm | Bin 0 -> 62786 bytes .../ftgl_static_lib/ftgl_static_lib.dsp | 338 + .../ftgl_static_lib/ftgl_static_lib.vcproj | 1326 ++ ...ftgl_static_lib.vcproj.CYBERDEV2.DEV2.user | 121 + .../FTGL/win32_vcpp/unit_tests/unit_tests.dsp | 168 + src/WinLibs/freetype-2.3.5/ChangeLog | 2457 +++ src/WinLibs/freetype-2.3.5/ChangeLog.20 | 2613 +++ src/WinLibs/freetype-2.3.5/ChangeLog.21 | 9439 +++++++++++ src/WinLibs/freetype-2.3.5/ChangeLog.22 | 2837 ++++ src/WinLibs/freetype-2.3.5/Jamfile | 203 + src/WinLibs/freetype-2.3.5/Jamrules | 71 + src/WinLibs/freetype-2.3.5/Makefile | 34 + src/WinLibs/freetype-2.3.5/README | 64 + src/WinLibs/freetype-2.3.5/README.CVS | 50 + src/WinLibs/freetype-2.3.5/autogen.sh | 61 + .../freetype-2.3.5/builds/amiga/README | 110 + .../amiga/include/freetype/config/ftconfig.h | 55 + .../amiga/include/freetype/config/ftmodule.h | 160 + .../freetype-2.3.5/builds/amiga/makefile | 284 + .../freetype-2.3.5/builds/amiga/makefile.os4 | 287 + .../freetype-2.3.5/builds/amiga/smakefile | 291 + .../builds/amiga/src/base/ftdebug.c | 279 + .../builds/amiga/src/base/ftsystem.c | 522 + .../freetype-2.3.5/builds/ansi/ansi-def.mk | 74 + .../freetype-2.3.5/builds/ansi/ansi.mk | 21 + .../freetype-2.3.5/builds/atari/ATARI.H | 16 + .../freetype-2.3.5/builds/atari/FNames.SIC | 37 + .../freetype-2.3.5/builds/atari/FREETYPE.PRJ | 32 + .../freetype-2.3.5/builds/atari/README.TXT | 51 + .../freetype-2.3.5/builds/beos/beos-def.mk | 76 + .../freetype-2.3.5/builds/beos/beos.mk | 19 + .../freetype-2.3.5/builds/beos/detect.mk | 41 + .../freetype-2.3.5/builds/compiler/ansi-cc.mk | 80 + .../freetype-2.3.5/builds/compiler/bcc-dev.mk | 78 + .../freetype-2.3.5/builds/compiler/bcc.mk | 78 + .../freetype-2.3.5/builds/compiler/emx.mk | 77 + .../freetype-2.3.5/builds/compiler/gcc-dev.mk | 95 + .../freetype-2.3.5/builds/compiler/gcc.mk | 77 + .../freetype-2.3.5/builds/compiler/intelc.mk | 85 + .../builds/compiler/unix-lcc.mk | 83 + .../builds/compiler/visualage.mk | 76 + .../freetype-2.3.5/builds/compiler/visualc.mk | 82 + .../freetype-2.3.5/builds/compiler/watcom.mk | 81 + .../freetype-2.3.5/builds/compiler/win-lcc.mk | 81 + src/WinLibs/freetype-2.3.5/builds/detect.mk | 154 + .../freetype-2.3.5/builds/dos/detect.mk | 142 + .../freetype-2.3.5/builds/dos/dos-def.mk | 45 + .../freetype-2.3.5/builds/dos/dos-emx.mk | 21 + .../freetype-2.3.5/builds/dos/dos-gcc.mk | 21 + .../freetype-2.3.5/builds/dos/dos-wat.mk | 20 + src/WinLibs/freetype-2.3.5/builds/exports.mk | 76 + src/WinLibs/freetype-2.3.5/builds/freetype.mk | 361 + src/WinLibs/freetype-2.3.5/builds/link_dos.mk | 42 + src/WinLibs/freetype-2.3.5/builds/link_std.mk | 42 + .../builds/mac/FreeType.m68k_cfm.make.txt | 202 + .../builds/mac/FreeType.m68k_far.make.txt | 201 + .../builds/mac/FreeType.ppc_carbon.make.txt | 202 + .../builds/mac/FreeType.ppc_classic.make.txt | 203 + src/WinLibs/freetype-2.3.5/builds/mac/README | 403 + .../freetype-2.3.5/builds/mac/ascii2mpw.py | 24 + .../freetype-2.3.5/builds/mac/ftlib.prj.xml | 1194 ++ src/WinLibs/freetype-2.3.5/builds/mac/ftmac.c | 1566 ++ src/WinLibs/freetype-2.3.5/builds/modules.mk | 79 + src/WinLibs/freetype-2.3.5/builds/newline | 1 + .../freetype-2.3.5/builds/os2/detect.mk | 73 + .../freetype-2.3.5/builds/os2/os2-def.mk | 44 + .../freetype-2.3.5/builds/os2/os2-dev.mk | 30 + .../freetype-2.3.5/builds/os2/os2-gcc.mk | 26 + src/WinLibs/freetype-2.3.5/builds/toplevel.mk | 245 + .../freetype-2.3.5/builds/unix/config.guess | 1516 ++ .../freetype-2.3.5/builds/unix/config.sub | 1626 ++ .../freetype-2.3.5/builds/unix/configure.ac | 529 + .../freetype-2.3.5/builds/unix/configure.raw | 529 + .../freetype-2.3.5/builds/unix/detect.mk | 91 + .../builds/unix/freetype-config.in | 157 + .../freetype-2.3.5/builds/unix/freetype2.in | 11 + .../freetype-2.3.5/builds/unix/freetype2.m4 | 192 + .../freetype-2.3.5/builds/unix/ft-munmap.m4 | 32 + .../freetype-2.3.5/builds/unix/ft2unix.h | 61 + .../freetype-2.3.5/builds/unix/ftconfig.in | 349 + .../freetype-2.3.5/builds/unix/ftsystem.c | 414 + .../freetype-2.3.5/builds/unix/install-sh | 519 + .../freetype-2.3.5/builds/unix/install.mk | 97 + .../freetype-2.3.5/builds/unix/mkinstalldirs | 161 + .../freetype-2.3.5/builds/unix/unix-cc.in | 113 + .../freetype-2.3.5/builds/unix/unix-def.in | 81 + .../freetype-2.3.5/builds/unix/unix-dev.mk | 26 + .../freetype-2.3.5/builds/unix/unix-lcc.mk | 24 + .../freetype-2.3.5/builds/unix/unix.mk | 62 + .../freetype-2.3.5/builds/unix/unixddef.mk | 45 + .../freetype-2.3.5/builds/vms/ftconfig.h | 338 + .../freetype-2.3.5/builds/vms/ftsystem.c | 321 + .../freetype-2.3.5/builds/win32/detect.mk | 183 + .../freetype-2.3.5/builds/win32/ftdebug.c | 213 + .../builds/win32/visualc/freetype.dsp | 396 + .../builds/win32/visualc/freetype.dsw | 29 + .../builds/win32/visualc/freetype.sln | 31 + .../builds/win32/visualc/freetype.vcproj | 2155 +++ .../freetype.vcproj.CYBERDEV2.DEV2.user | 177 + .../builds/win32/visualc/index.html | 37 + .../builds/win32/visualce/freetype.dsp | 396 + .../builds/win32/visualce/freetype.dsw | 29 + .../builds/win32/visualce/freetype.vcproj | 13861 ++++++++++++++++ .../builds/win32/visualce/index.html | 47 + .../freetype-2.3.5/builds/win32/w32-bcc.mk | 28 + .../freetype-2.3.5/builds/win32/w32-bccd.mk | 26 + .../freetype-2.3.5/builds/win32/w32-dev.mk | 32 + .../freetype-2.3.5/builds/win32/w32-gcc.mk | 31 + .../freetype-2.3.5/builds/win32/w32-icc.mk | 28 + .../freetype-2.3.5/builds/win32/w32-intl.mk | 28 + .../freetype-2.3.5/builds/win32/w32-lcc.mk | 24 + .../builds/win32/w32-mingw32.mk | 33 + .../freetype-2.3.5/builds/win32/w32-vcc.mk | 28 + .../freetype-2.3.5/builds/win32/w32-wat.mk | 28 + .../freetype-2.3.5/builds/win32/win32-def.mk | 46 + src/WinLibs/freetype-2.3.5/configure | 100 + src/WinLibs/freetype-2.3.5/devel/ft2build.h | 41 + src/WinLibs/freetype-2.3.5/devel/ftoption.h | 670 + src/WinLibs/freetype-2.3.5/docs/CHANGES | 3086 ++++ src/WinLibs/freetype-2.3.5/docs/CUSTOMIZE | 150 + src/WinLibs/freetype-2.3.5/docs/DEBUG | 199 + src/WinLibs/freetype-2.3.5/docs/FTL.TXT | 169 + src/WinLibs/freetype-2.3.5/docs/GPL.TXT | 340 + src/WinLibs/freetype-2.3.5/docs/INSTALL | 89 + src/WinLibs/freetype-2.3.5/docs/INSTALL.ANY | 139 + src/WinLibs/freetype-2.3.5/docs/INSTALL.CROSS | 135 + src/WinLibs/freetype-2.3.5/docs/INSTALL.GNU | 159 + src/WinLibs/freetype-2.3.5/docs/INSTALL.MAC | 4 + src/WinLibs/freetype-2.3.5/docs/INSTALL.UNIX | 96 + src/WinLibs/freetype-2.3.5/docs/INSTALL.VMS | 62 + src/WinLibs/freetype-2.3.5/docs/LICENSE.TXT | 28 + src/WinLibs/freetype-2.3.5/docs/MAKEPP | 5 + src/WinLibs/freetype-2.3.5/docs/PATENTS | 27 + src/WinLibs/freetype-2.3.5/docs/PROBLEMS | 52 + src/WinLibs/freetype-2.3.5/docs/TODO | 40 + src/WinLibs/freetype-2.3.5/docs/TRUETYPE | 40 + src/WinLibs/freetype-2.3.5/docs/UPGRADE.UNIX | 137 + src/WinLibs/freetype-2.3.5/docs/VERSION.DLL | 131 + src/WinLibs/freetype-2.3.5/docs/formats.txt | 154 + src/WinLibs/freetype-2.3.5/docs/raster.txt | 635 + .../freetype-2.3.5/docs/reference/README | 5 + .../docs/reference/ft2-base_interface.html | 3219 ++++ .../docs/reference/ft2-basic_types.html | 1035 ++ .../docs/reference/ft2-bdf_fonts.html | 241 + .../docs/reference/ft2-bitmap_handling.html | 249 + .../docs/reference/ft2-cache_subsystem.html | 1087 ++ .../docs/reference/ft2-computations.html | 777 + .../docs/reference/ft2-font_formats.html | 75 + .../docs/reference/ft2-gasp_table.html | 131 + .../docs/reference/ft2-glyph_management.html | 601 + .../docs/reference/ft2-glyph_stroker.html | 874 + .../docs/reference/ft2-gx_validation.html | 335 + .../docs/reference/ft2-gzip.html | 86 + .../reference/ft2-header_file_macros.html | 851 + .../docs/reference/ft2-incremental.html | 356 + .../docs/reference/ft2-index.html | 266 + .../docs/reference/ft2-lcd_filtering.html | 139 + .../docs/reference/ft2-list_processing.html | 452 + .../docs/reference/ft2-lzw.html | 86 + .../docs/reference/ft2-mac_specific.html | 339 + .../docs/reference/ft2-module_management.html | 498 + .../docs/reference/ft2-multiple_masters.html | 479 + .../docs/reference/ft2-ot_validation.html | 190 + .../reference/ft2-outline_processing.html | 1028 ++ .../docs/reference/ft2-pfr_fonts.html | 191 + .../docs/reference/ft2-raster.html | 574 + .../docs/reference/ft2-sfnt_names.html | 177 + .../docs/reference/ft2-sizes_management.html | 151 + .../docs/reference/ft2-system_interface.html | 392 + .../docs/reference/ft2-toc.html | 193 + .../docs/reference/ft2-truetype_engine.html | 122 + .../docs/reference/ft2-truetype_tables.html | 794 + .../docs/reference/ft2-type1_tables.html | 758 + .../docs/reference/ft2-user_allocation.html | 41 + .../docs/reference/ft2-version.html | 198 + .../docs/reference/ft2-winfnt_fonts.html | 246 + src/WinLibs/freetype-2.3.5/docs/release | 151 + .../include/freetype/config/ftconfig.h | 363 + .../include/freetype/config/ftheader.h | 729 + .../include/freetype/config/ftmodule.h | 32 + .../include/freetype/config/ftoption.h | 669 + .../include/freetype/config/ftstdlib.h | 180 + .../include/freetype/freetype.h | 3434 ++++ .../freetype-2.3.5/include/freetype/ftbbox.h | 94 + .../freetype-2.3.5/include/freetype/ftbdf.h | 200 + .../include/freetype/ftbitmap.h | 206 + .../freetype-2.3.5/include/freetype/ftcache.h | 1110 ++ .../include/freetype/ftchapters.h | 100 + .../include/freetype/fterrdef.h | 239 + .../include/freetype/fterrors.h | 206 + .../freetype-2.3.5/include/freetype/ftgasp.h | 113 + .../freetype-2.3.5/include/freetype/ftglyph.h | 575 + .../freetype-2.3.5/include/freetype/ftgxval.h | 358 + .../freetype-2.3.5/include/freetype/ftgzip.h | 102 + .../freetype-2.3.5/include/freetype/ftimage.h | 1237 ++ .../include/freetype/ftincrem.h | 331 + .../include/freetype/ftlcdfil.h | 166 + .../freetype-2.3.5/include/freetype/ftlist.h | 273 + .../freetype-2.3.5/include/freetype/ftlzw.h | 99 + .../freetype-2.3.5/include/freetype/ftmac.h | 272 + .../freetype-2.3.5/include/freetype/ftmm.h | 378 + .../include/freetype/ftmodapi.h | 406 + .../include/freetype/ftmoderr.h | 155 + .../freetype-2.3.5/include/freetype/ftotval.h | 198 + .../freetype-2.3.5/include/freetype/ftoutln.h | 526 + .../freetype-2.3.5/include/freetype/ftpfr.h | 172 + .../include/freetype/ftrender.h | 229 + .../freetype-2.3.5/include/freetype/ftsizes.h | 159 + .../include/freetype/ftsnames.h | 170 + .../include/freetype/ftstroke.h | 716 + .../freetype-2.3.5/include/freetype/ftsynth.h | 73 + .../include/freetype/ftsystem.h | 346 + .../include/freetype/fttrigon.h | 350 + .../freetype-2.3.5/include/freetype/fttypes.h | 583 + .../include/freetype/ftwinfnt.h | 263 + .../freetype-2.3.5/include/freetype/ftxf86.h | 80 + .../include/freetype/internal/autohint.h | 205 + .../include/freetype/internal/ftcalc.h | 153 + .../include/freetype/internal/ftdebug.h | 244 + .../include/freetype/internal/ftdriver.h | 252 + .../include/freetype/internal/ftgloadr.h | 168 + .../include/freetype/internal/ftmemory.h | 368 + .../include/freetype/internal/ftobjs.h | 820 + .../include/freetype/internal/ftrfork.h | 184 + .../include/freetype/internal/ftserv.h | 327 + .../include/freetype/internal/ftstream.h | 539 + .../include/freetype/internal/fttrace.h | 133 + .../include/freetype/internal/ftvalid.h | 150 + .../include/freetype/internal/internal.h | 50 + .../include/freetype/internal/pcftypes.h | 56 + .../include/freetype/internal/psaux.h | 879 + .../include/freetype/internal/pshints.h | 687 + .../freetype/internal/services/svbdf.h | 57 + .../freetype/internal/services/svgldict.h | 60 + .../freetype/internal/services/svgxval.h | 72 + .../freetype/internal/services/svkern.h | 51 + .../include/freetype/internal/services/svmm.h | 79 + .../freetype/internal/services/svotval.h | 55 + .../freetype/internal/services/svpfr.h | 66 + .../freetype/internal/services/svpostnm.h | 58 + .../freetype/internal/services/svpscmap.h | 129 + .../freetype/internal/services/svpsinfo.h | 60 + .../freetype/internal/services/svsfnt.h | 80 + .../freetype/internal/services/svttcmap.h | 78 + .../freetype/internal/services/svtteng.h | 53 + .../freetype/internal/services/svttglyf.h | 48 + .../freetype/internal/services/svwinfnt.h | 50 + .../freetype/internal/services/svxf86nm.h | 55 + .../include/freetype/internal/sfnt.h | 762 + .../include/freetype/internal/t1types.h | 252 + .../include/freetype/internal/tttypes.h | 1543 ++ .../include/freetype/t1tables.h | 450 + .../include/freetype/ttnameid.h | 1132 ++ .../include/freetype/tttables.h | 756 + .../freetype-2.3.5/include/freetype/tttags.h | 99 + .../freetype-2.3.5/include/freetype/ttunpat.h | 59 + src/WinLibs/freetype-2.3.5/include/ft2build.h | 39 + src/WinLibs/freetype-2.3.5/modules.cfg | 240 + src/WinLibs/freetype-2.3.5/objs/README | 2 + .../freetype-2.3.5/objs/debug/BuildLog.htm | Bin 0 -> 20310 bytes .../freetype-2.3.5/objs/debug/autofit.obj | Bin 0 -> 114358 bytes src/WinLibs/freetype-2.3.5/objs/debug/bdf.obj | Bin 0 -> 85783 bytes src/WinLibs/freetype-2.3.5/objs/debug/cff.obj | Bin 0 -> 149592 bytes .../freetype-2.3.5/objs/debug/ftbase.obj | Bin 0 -> 218151 bytes .../freetype-2.3.5/objs/debug/ftbbox.obj | Bin 0 -> 13643 bytes .../freetype-2.3.5/objs/debug/ftbitmap.obj | Bin 0 -> 23161 bytes .../freetype-2.3.5/objs/debug/ftcache.obj | Bin 0 -> 97130 bytes .../freetype-2.3.5/objs/debug/ftdebug.obj | Bin 0 -> 24656 bytes .../freetype-2.3.5/objs/debug/ftgasp.obj | Bin 0 -> 12817 bytes .../freetype-2.3.5/objs/debug/ftglyph.obj | Bin 0 -> 26885 bytes .../freetype-2.3.5/objs/debug/ftgzip.obj | Bin 0 -> 64037 bytes .../freetype-2.3.5/objs/debug/ftinit.obj | Bin 0 -> 14661 bytes .../freetype-2.3.5/objs/debug/ftlzw.obj | Bin 0 -> 24270 bytes .../freetype-2.3.5/objs/debug/ftmm.obj | Bin 0 -> 17053 bytes .../freetype-2.3.5/objs/debug/ftpfr.obj | Bin 0 -> 13546 bytes .../freetype-2.3.5/objs/debug/ftstroke.obj | Bin 0 -> 62193 bytes .../freetype-2.3.5/objs/debug/ftsynth.obj | Bin 0 -> 13645 bytes .../freetype-2.3.5/objs/debug/ftsystem.obj | Bin 0 -> 12676 bytes .../freetype-2.3.5/objs/debug/fttype1.obj | Bin 0 -> 13487 bytes .../freetype-2.3.5/objs/debug/ftwinfnt.obj | Bin 0 -> 11405 bytes src/WinLibs/freetype-2.3.5/objs/debug/pcf.obj | Bin 0 -> 57216 bytes src/WinLibs/freetype-2.3.5/objs/debug/pfr.obj | Bin 0 -> 84656 bytes .../freetype-2.3.5/objs/debug/psaux.obj | Bin 0 -> 118363 bytes .../freetype-2.3.5/objs/debug/pshinter.obj | Bin 0 -> 92481 bytes .../freetype-2.3.5/objs/debug/psmodule.obj | Bin 0 -> 82244 bytes .../freetype-2.3.5/objs/debug/raster.obj | Bin 0 -> 57681 bytes .../freetype-2.3.5/objs/debug/sfnt.obj | Bin 0 -> 170189 bytes .../freetype-2.3.5/objs/debug/smooth.obj | Bin 0 -> 48006 bytes .../freetype-2.3.5/objs/debug/truetype.obj | Bin 0 -> 212107 bytes .../freetype-2.3.5/objs/debug/type1.obj | Bin 0 -> 115616 bytes .../freetype-2.3.5/objs/debug/type1cid.obj | Bin 0 -> 58890 bytes .../freetype-2.3.5/objs/debug/type42.obj | Bin 0 -> 61121 bytes .../freetype-2.3.5/objs/debug/vc80.idb | Bin 0 -> 609280 bytes .../freetype-2.3.5/objs/debug/vc80.pdb | Bin 0 -> 290816 bytes .../freetype-2.3.5/objs/debug/winfnt.obj | Bin 0 -> 36016 bytes .../freetype-2.3.5/objs/freetype235_D.lib | Bin 0 -> 2225658 bytes .../freetype-2.3.5/objs/release/BuildLog.htm | Bin 0 -> 17924 bytes src/WinLibs/freetype-2.3.5/src/Jamfile | 25 + .../freetype-2.3.5/src/autofit/Jamfile | 39 + .../freetype-2.3.5/src/autofit/afangles.c | 292 + .../freetype-2.3.5/src/autofit/afangles.h | 7 + .../freetype-2.3.5/src/autofit/afcjk.c | 1506 ++ .../freetype-2.3.5/src/autofit/afcjk.h | 41 + .../freetype-2.3.5/src/autofit/afdummy.c | 62 + .../freetype-2.3.5/src/autofit/afdummy.h | 43 + .../freetype-2.3.5/src/autofit/aferrors.h | 40 + .../freetype-2.3.5/src/autofit/afglobal.c | 289 + .../freetype-2.3.5/src/autofit/afglobal.h | 67 + .../freetype-2.3.5/src/autofit/afhints.c | 1264 ++ .../freetype-2.3.5/src/autofit/afhints.h | 333 + .../freetype-2.3.5/src/autofit/afindic.c | 134 + .../freetype-2.3.5/src/autofit/afindic.h | 41 + .../freetype-2.3.5/src/autofit/aflatin.c | 2166 +++ .../freetype-2.3.5/src/autofit/aflatin.h | 209 + .../freetype-2.3.5/src/autofit/aflatin2.c | 2286 +++ .../freetype-2.3.5/src/autofit/aflatin2.h | 40 + .../freetype-2.3.5/src/autofit/afloader.c | 530 + .../freetype-2.3.5/src/autofit/afloader.h | 73 + .../freetype-2.3.5/src/autofit/afmodule.c | 97 + .../freetype-2.3.5/src/autofit/afmodule.h | 37 + .../freetype-2.3.5/src/autofit/aftypes.h | 349 + .../freetype-2.3.5/src/autofit/afwarp.c | 338 + .../freetype-2.3.5/src/autofit/afwarp.h | 64 + .../freetype-2.3.5/src/autofit/autofit.c | 40 + .../freetype-2.3.5/src/autofit/module.mk | 23 + .../freetype-2.3.5/src/autofit/rules.mk | 78 + src/WinLibs/freetype-2.3.5/src/base/Jamfile | 50 + src/WinLibs/freetype-2.3.5/src/base/ftapi.c | 121 + src/WinLibs/freetype-2.3.5/src/base/ftbase.c | 38 + src/WinLibs/freetype-2.3.5/src/base/ftbbox.c | 659 + src/WinLibs/freetype-2.3.5/src/base/ftbdf.c | 88 + .../freetype-2.3.5/src/base/ftbitmap.c | 630 + src/WinLibs/freetype-2.3.5/src/base/ftcalc.c | 822 + .../freetype-2.3.5/src/base/ftdbgmem.c | 998 ++ src/WinLibs/freetype-2.3.5/src/base/ftdebug.c | 246 + src/WinLibs/freetype-2.3.5/src/base/ftgasp.c | 61 + .../freetype-2.3.5/src/base/ftgloadr.c | 394 + src/WinLibs/freetype-2.3.5/src/base/ftglyph.c | 682 + src/WinLibs/freetype-2.3.5/src/base/ftgxval.c | 129 + src/WinLibs/freetype-2.3.5/src/base/ftinit.c | 163 + .../freetype-2.3.5/src/base/ftlcdfil.c | 351 + src/WinLibs/freetype-2.3.5/src/base/ftmac.c | 1096 ++ src/WinLibs/freetype-2.3.5/src/base/ftmm.c | 202 + src/WinLibs/freetype-2.3.5/src/base/ftnames.c | 94 + src/WinLibs/freetype-2.3.5/src/base/ftobjs.c | 3993 +++++ src/WinLibs/freetype-2.3.5/src/base/ftotval.c | 83 + src/WinLibs/freetype-2.3.5/src/base/ftoutln.c | 1088 ++ .../freetype-2.3.5/src/base/ftpatent.c | 281 + src/WinLibs/freetype-2.3.5/src/base/ftpfr.c | 132 + src/WinLibs/freetype-2.3.5/src/base/ftrfork.c | 728 + .../freetype-2.3.5/src/base/ftstream.c | 842 + .../freetype-2.3.5/src/base/ftstroke.c | 2010 +++ src/WinLibs/freetype-2.3.5/src/base/ftsynth.c | 159 + .../freetype-2.3.5/src/base/ftsystem.c | 301 + .../freetype-2.3.5/src/base/fttrigon.c | 546 + src/WinLibs/freetype-2.3.5/src/base/fttype1.c | 94 + src/WinLibs/freetype-2.3.5/src/base/ftutil.c | 501 + .../freetype-2.3.5/src/base/ftwinfnt.c | 51 + src/WinLibs/freetype-2.3.5/src/base/ftxf86.c | 40 + src/WinLibs/freetype-2.3.5/src/base/rules.mk | 90 + src/WinLibs/freetype-2.3.5/src/bdf/Jamfile | 29 + src/WinLibs/freetype-2.3.5/src/bdf/README | 148 + src/WinLibs/freetype-2.3.5/src/bdf/bdf.c | 34 + src/WinLibs/freetype-2.3.5/src/bdf/bdf.h | 295 + src/WinLibs/freetype-2.3.5/src/bdf/bdfdrivr.c | 848 + src/WinLibs/freetype-2.3.5/src/bdf/bdfdrivr.h | 76 + src/WinLibs/freetype-2.3.5/src/bdf/bdferror.h | 44 + src/WinLibs/freetype-2.3.5/src/bdf/bdflib.c | 2472 +++ src/WinLibs/freetype-2.3.5/src/bdf/module.mk | 34 + src/WinLibs/freetype-2.3.5/src/bdf/rules.mk | 80 + src/WinLibs/freetype-2.3.5/src/cache/Jamfile | 43 + .../freetype-2.3.5/src/cache/ftcache.c | 31 + .../freetype-2.3.5/src/cache/ftcbasic.c | 811 + .../freetype-2.3.5/src/cache/ftccache.c | 592 + .../freetype-2.3.5/src/cache/ftccache.h | 317 + .../freetype-2.3.5/src/cache/ftccback.h | 90 + .../freetype-2.3.5/src/cache/ftccmap.c | 413 + .../freetype-2.3.5/src/cache/ftcerror.h | 40 + .../freetype-2.3.5/src/cache/ftcglyph.c | 211 + .../freetype-2.3.5/src/cache/ftcglyph.h | 322 + .../freetype-2.3.5/src/cache/ftcimage.c | 163 + .../freetype-2.3.5/src/cache/ftcimage.h | 107 + .../freetype-2.3.5/src/cache/ftcmanag.c | 732 + .../freetype-2.3.5/src/cache/ftcmanag.h | 175 + src/WinLibs/freetype-2.3.5/src/cache/ftcmru.c | 357 + src/WinLibs/freetype-2.3.5/src/cache/ftcmru.h | 247 + .../freetype-2.3.5/src/cache/ftcsbits.c | 401 + .../freetype-2.3.5/src/cache/ftcsbits.h | 98 + src/WinLibs/freetype-2.3.5/src/cache/rules.mk | 78 + src/WinLibs/freetype-2.3.5/src/cff/Jamfile | 29 + src/WinLibs/freetype-2.3.5/src/cff/cff.c | 29 + src/WinLibs/freetype-2.3.5/src/cff/cffcmap.c | 220 + src/WinLibs/freetype-2.3.5/src/cff/cffcmap.h | 69 + src/WinLibs/freetype-2.3.5/src/cff/cffdrivr.c | 499 + src/WinLibs/freetype-2.3.5/src/cff/cffdrivr.h | 39 + src/WinLibs/freetype-2.3.5/src/cff/cfferrs.h | 41 + src/WinLibs/freetype-2.3.5/src/cff/cffgload.c | 2634 +++ src/WinLibs/freetype-2.3.5/src/cff/cffgload.h | 208 + src/WinLibs/freetype-2.3.5/src/cff/cffload.c | 1598 ++ src/WinLibs/freetype-2.3.5/src/cff/cffload.h | 79 + src/WinLibs/freetype-2.3.5/src/cff/cffobjs.c | 782 + src/WinLibs/freetype-2.3.5/src/cff/cffobjs.h | 165 + src/WinLibs/freetype-2.3.5/src/cff/cffparse.c | 688 + src/WinLibs/freetype-2.3.5/src/cff/cffparse.h | 69 + src/WinLibs/freetype-2.3.5/src/cff/cfftoken.h | 97 + src/WinLibs/freetype-2.3.5/src/cff/cfftypes.h | 270 + src/WinLibs/freetype-2.3.5/src/cff/module.mk | 23 + src/WinLibs/freetype-2.3.5/src/cff/rules.mk | 72 + src/WinLibs/freetype-2.3.5/src/cid/Jamfile | 29 + src/WinLibs/freetype-2.3.5/src/cid/ciderrs.h | 40 + src/WinLibs/freetype-2.3.5/src/cid/cidgload.c | 433 + src/WinLibs/freetype-2.3.5/src/cid/cidgload.h | 51 + src/WinLibs/freetype-2.3.5/src/cid/cidload.c | 644 + src/WinLibs/freetype-2.3.5/src/cid/cidload.h | 53 + src/WinLibs/freetype-2.3.5/src/cid/cidobjs.c | 480 + src/WinLibs/freetype-2.3.5/src/cid/cidobjs.h | 154 + src/WinLibs/freetype-2.3.5/src/cid/cidparse.c | 226 + src/WinLibs/freetype-2.3.5/src/cid/cidparse.h | 123 + src/WinLibs/freetype-2.3.5/src/cid/cidriver.c | 163 + src/WinLibs/freetype-2.3.5/src/cid/cidriver.h | 39 + src/WinLibs/freetype-2.3.5/src/cid/cidtoken.h | 103 + src/WinLibs/freetype-2.3.5/src/cid/module.mk | 23 + src/WinLibs/freetype-2.3.5/src/cid/rules.mk | 70 + src/WinLibs/freetype-2.3.5/src/cid/type1cid.c | 29 + .../freetype-2.3.5/src/gxvalid/Jamfile | 33 + src/WinLibs/freetype-2.3.5/src/gxvalid/README | 532 + .../freetype-2.3.5/src/gxvalid/gxvalid.c | 46 + .../freetype-2.3.5/src/gxvalid/gxvalid.h | 107 + .../freetype-2.3.5/src/gxvalid/gxvbsln.c | 333 + .../freetype-2.3.5/src/gxvalid/gxvcommn.c | 1758 ++ .../freetype-2.3.5/src/gxvalid/gxvcommn.h | 560 + .../freetype-2.3.5/src/gxvalid/gxverror.h | 51 + .../freetype-2.3.5/src/gxvalid/gxvfeat.c | 343 + .../freetype-2.3.5/src/gxvalid/gxvfeat.h | 172 + .../freetype-2.3.5/src/gxvalid/gxvfgen.c | 482 + .../freetype-2.3.5/src/gxvalid/gxvjust.c | 630 + .../freetype-2.3.5/src/gxvalid/gxvkern.c | 876 + .../freetype-2.3.5/src/gxvalid/gxvlcar.c | 223 + .../freetype-2.3.5/src/gxvalid/gxvmod.c | 285 + .../freetype-2.3.5/src/gxvalid/gxvmod.h | 46 + .../freetype-2.3.5/src/gxvalid/gxvmort.c | 285 + .../freetype-2.3.5/src/gxvalid/gxvmort.h | 93 + .../freetype-2.3.5/src/gxvalid/gxvmort0.c | 137 + .../freetype-2.3.5/src/gxvalid/gxvmort1.c | 258 + .../freetype-2.3.5/src/gxvalid/gxvmort2.c | 282 + .../freetype-2.3.5/src/gxvalid/gxvmort4.c | 125 + .../freetype-2.3.5/src/gxvalid/gxvmort5.c | 226 + .../freetype-2.3.5/src/gxvalid/gxvmorx.c | 183 + .../freetype-2.3.5/src/gxvalid/gxvmorx.h | 67 + .../freetype-2.3.5/src/gxvalid/gxvmorx0.c | 103 + .../freetype-2.3.5/src/gxvalid/gxvmorx1.c | 274 + .../freetype-2.3.5/src/gxvalid/gxvmorx2.c | 285 + .../freetype-2.3.5/src/gxvalid/gxvmorx4.c | 55 + .../freetype-2.3.5/src/gxvalid/gxvmorx5.c | 217 + .../freetype-2.3.5/src/gxvalid/gxvopbd.c | 217 + .../freetype-2.3.5/src/gxvalid/gxvprop.c | 301 + .../freetype-2.3.5/src/gxvalid/gxvtrak.c | 277 + .../freetype-2.3.5/src/gxvalid/module.mk | 23 + .../freetype-2.3.5/src/gxvalid/rules.mk | 94 + src/WinLibs/freetype-2.3.5/src/gzip/Jamfile | 16 + src/WinLibs/freetype-2.3.5/src/gzip/adler32.c | 48 + src/WinLibs/freetype-2.3.5/src/gzip/ftgzip.c | 682 + .../freetype-2.3.5/src/gzip/infblock.c | 387 + .../freetype-2.3.5/src/gzip/infblock.h | 36 + .../freetype-2.3.5/src/gzip/infcodes.c | 250 + .../freetype-2.3.5/src/gzip/infcodes.h | 31 + .../freetype-2.3.5/src/gzip/inffixed.h | 151 + src/WinLibs/freetype-2.3.5/src/gzip/inflate.c | 273 + .../freetype-2.3.5/src/gzip/inftrees.c | 465 + .../freetype-2.3.5/src/gzip/inftrees.h | 63 + src/WinLibs/freetype-2.3.5/src/gzip/infutil.c | 86 + src/WinLibs/freetype-2.3.5/src/gzip/infutil.h | 98 + src/WinLibs/freetype-2.3.5/src/gzip/rules.mk | 75 + src/WinLibs/freetype-2.3.5/src/gzip/zconf.h | 278 + src/WinLibs/freetype-2.3.5/src/gzip/zlib.h | 830 + src/WinLibs/freetype-2.3.5/src/gzip/zutil.c | 181 + src/WinLibs/freetype-2.3.5/src/gzip/zutil.h | 215 + src/WinLibs/freetype-2.3.5/src/lzw/Jamfile | 16 + src/WinLibs/freetype-2.3.5/src/lzw/ftlzw.c | 413 + src/WinLibs/freetype-2.3.5/src/lzw/ftzopen.c | 398 + src/WinLibs/freetype-2.3.5/src/lzw/ftzopen.h | 171 + src/WinLibs/freetype-2.3.5/src/lzw/rules.mk | 70 + .../freetype-2.3.5/src/otvalid/Jamfile | 29 + .../freetype-2.3.5/src/otvalid/module.mk | 23 + .../freetype-2.3.5/src/otvalid/otvalid.c | 30 + .../freetype-2.3.5/src/otvalid/otvalid.h | 72 + .../freetype-2.3.5/src/otvalid/otvbase.c | 318 + .../freetype-2.3.5/src/otvalid/otvcommn.c | 1055 ++ .../freetype-2.3.5/src/otvalid/otvcommn.h | 436 + .../freetype-2.3.5/src/otvalid/otverror.h | 43 + .../freetype-2.3.5/src/otvalid/otvgdef.c | 219 + .../freetype-2.3.5/src/otvalid/otvgpos.c | 1013 ++ .../freetype-2.3.5/src/otvalid/otvgpos.h | 36 + .../freetype-2.3.5/src/otvalid/otvgsub.c | 584 + .../freetype-2.3.5/src/otvalid/otvjstf.c | 258 + .../freetype-2.3.5/src/otvalid/otvmod.c | 242 + .../freetype-2.3.5/src/otvalid/otvmod.h | 39 + .../freetype-2.3.5/src/otvalid/rules.mk | 77 + src/WinLibs/freetype-2.3.5/src/pcf/Jamfile | 29 + src/WinLibs/freetype-2.3.5/src/pcf/README | 114 + src/WinLibs/freetype-2.3.5/src/pcf/module.mk | 34 + src/WinLibs/freetype-2.3.5/src/pcf/pcf.c | 36 + src/WinLibs/freetype-2.3.5/src/pcf/pcf.h | 237 + src/WinLibs/freetype-2.3.5/src/pcf/pcfdrivr.c | 668 + src/WinLibs/freetype-2.3.5/src/pcf/pcfdrivr.h | 44 + src/WinLibs/freetype-2.3.5/src/pcf/pcferror.h | 40 + src/WinLibs/freetype-2.3.5/src/pcf/pcfread.c | 1267 ++ src/WinLibs/freetype-2.3.5/src/pcf/pcfread.h | 45 + src/WinLibs/freetype-2.3.5/src/pcf/pcfutil.c | 104 + src/WinLibs/freetype-2.3.5/src/pcf/pcfutil.h | 55 + src/WinLibs/freetype-2.3.5/src/pcf/rules.mk | 80 + src/WinLibs/freetype-2.3.5/src/pfr/Jamfile | 29 + src/WinLibs/freetype-2.3.5/src/pfr/module.mk | 23 + src/WinLibs/freetype-2.3.5/src/pfr/pfr.c | 29 + src/WinLibs/freetype-2.3.5/src/pfr/pfrcmap.c | 163 + src/WinLibs/freetype-2.3.5/src/pfr/pfrcmap.h | 46 + src/WinLibs/freetype-2.3.5/src/pfr/pfrdrivr.c | 207 + src/WinLibs/freetype-2.3.5/src/pfr/pfrdrivr.h | 39 + src/WinLibs/freetype-2.3.5/src/pfr/pfrerror.h | 40 + src/WinLibs/freetype-2.3.5/src/pfr/pfrgload.c | 828 + src/WinLibs/freetype-2.3.5/src/pfr/pfrgload.h | 49 + src/WinLibs/freetype-2.3.5/src/pfr/pfrload.c | 938 ++ src/WinLibs/freetype-2.3.5/src/pfr/pfrload.h | 118 + src/WinLibs/freetype-2.3.5/src/pfr/pfrobjs.c | 576 + src/WinLibs/freetype-2.3.5/src/pfr/pfrobjs.h | 96 + src/WinLibs/freetype-2.3.5/src/pfr/pfrsbit.c | 680 + src/WinLibs/freetype-2.3.5/src/pfr/pfrsbit.h | 36 + src/WinLibs/freetype-2.3.5/src/pfr/pfrtypes.h | 362 + src/WinLibs/freetype-2.3.5/src/pfr/rules.mk | 73 + src/WinLibs/freetype-2.3.5/src/psaux/Jamfile | 31 + .../freetype-2.3.5/src/psaux/afmparse.c | 960 ++ .../freetype-2.3.5/src/psaux/afmparse.h | 87 + .../freetype-2.3.5/src/psaux/module.mk | 23 + src/WinLibs/freetype-2.3.5/src/psaux/psaux.c | 34 + .../freetype-2.3.5/src/psaux/psauxerr.h | 41 + .../freetype-2.3.5/src/psaux/psauxmod.c | 139 + .../freetype-2.3.5/src/psaux/psauxmod.h | 38 + src/WinLibs/freetype-2.3.5/src/psaux/psconv.c | 466 + src/WinLibs/freetype-2.3.5/src/psaux/psconv.h | 71 + src/WinLibs/freetype-2.3.5/src/psaux/psobjs.c | 1698 ++ src/WinLibs/freetype-2.3.5/src/psaux/psobjs.h | 212 + src/WinLibs/freetype-2.3.5/src/psaux/rules.mk | 73 + src/WinLibs/freetype-2.3.5/src/psaux/t1cmap.c | 333 + src/WinLibs/freetype-2.3.5/src/psaux/t1cmap.h | 105 + .../freetype-2.3.5/src/psaux/t1decode.c | 1474 ++ .../freetype-2.3.5/src/psaux/t1decode.h | 64 + .../freetype-2.3.5/src/pshinter/Jamfile | 29 + .../freetype-2.3.5/src/pshinter/module.mk | 23 + .../freetype-2.3.5/src/pshinter/pshalgo.c | 2291 +++ .../freetype-2.3.5/src/pshinter/pshalgo.h | 255 + .../freetype-2.3.5/src/pshinter/pshglob.c | 750 + .../freetype-2.3.5/src/pshinter/pshglob.h | 196 + .../freetype-2.3.5/src/pshinter/pshinter.c | 28 + .../freetype-2.3.5/src/pshinter/pshmod.c | 121 + .../freetype-2.3.5/src/pshinter/pshmod.h | 39 + .../freetype-2.3.5/src/pshinter/pshnterr.h | 40 + .../freetype-2.3.5/src/pshinter/pshrec.c | 1215 ++ .../freetype-2.3.5/src/pshinter/pshrec.h | 176 + .../freetype-2.3.5/src/pshinter/rules.mk | 72 + .../freetype-2.3.5/src/psnames/Jamfile | 29 + .../freetype-2.3.5/src/psnames/module.mk | 23 + .../freetype-2.3.5/src/psnames/psmodule.c | 458 + .../freetype-2.3.5/src/psnames/psmodule.h | 38 + .../freetype-2.3.5/src/psnames/psnamerr.h | 41 + .../freetype-2.3.5/src/psnames/psnames.c | 25 + .../freetype-2.3.5/src/psnames/pstables.h | 4090 +++++ .../freetype-2.3.5/src/psnames/rules.mk | 70 + src/WinLibs/freetype-2.3.5/src/raster/Jamfile | 29 + .../freetype-2.3.5/src/raster/ftmisc.h | 83 + .../freetype-2.3.5/src/raster/ftraster.c | 3369 ++++ .../freetype-2.3.5/src/raster/ftraster.h | 46 + .../freetype-2.3.5/src/raster/ftrend1.c | 273 + .../freetype-2.3.5/src/raster/ftrend1.h | 44 + .../freetype-2.3.5/src/raster/module.mk | 23 + .../freetype-2.3.5/src/raster/raster.c | 26 + .../freetype-2.3.5/src/raster/rasterrs.h | 41 + .../freetype-2.3.5/src/raster/rules.mk | 69 + src/WinLibs/freetype-2.3.5/src/sfnt/Jamfile | 29 + src/WinLibs/freetype-2.3.5/src/sfnt/module.mk | 23 + src/WinLibs/freetype-2.3.5/src/sfnt/rules.mk | 76 + .../freetype-2.3.5/src/sfnt/sfdriver.c | 618 + .../freetype-2.3.5/src/sfnt/sfdriver.h | 38 + .../freetype-2.3.5/src/sfnt/sferrors.h | 41 + src/WinLibs/freetype-2.3.5/src/sfnt/sfnt.c | 41 + src/WinLibs/freetype-2.3.5/src/sfnt/sfobjs.c | 1070 ++ src/WinLibs/freetype-2.3.5/src/sfnt/sfobjs.h | 54 + src/WinLibs/freetype-2.3.5/src/sfnt/ttbdf.c | 250 + src/WinLibs/freetype-2.3.5/src/sfnt/ttbdf.h | 46 + src/WinLibs/freetype-2.3.5/src/sfnt/ttcmap.c | 2356 +++ src/WinLibs/freetype-2.3.5/src/sfnt/ttcmap.h | 85 + src/WinLibs/freetype-2.3.5/src/sfnt/ttkern.c | 292 + src/WinLibs/freetype-2.3.5/src/sfnt/ttkern.h | 52 + src/WinLibs/freetype-2.3.5/src/sfnt/ttload.c | 1176 ++ src/WinLibs/freetype-2.3.5/src/sfnt/ttload.h | 112 + src/WinLibs/freetype-2.3.5/src/sfnt/ttmtx.c | 465 + src/WinLibs/freetype-2.3.5/src/sfnt/ttmtx.h | 55 + src/WinLibs/freetype-2.3.5/src/sfnt/ttpost.c | 521 + src/WinLibs/freetype-2.3.5/src/sfnt/ttpost.h | 46 + src/WinLibs/freetype-2.3.5/src/sfnt/ttsbit.c | 1501 ++ src/WinLibs/freetype-2.3.5/src/sfnt/ttsbit.h | 79 + src/WinLibs/freetype-2.3.5/src/sfnt/ttsbit0.c | 996 ++ src/WinLibs/freetype-2.3.5/src/smooth/Jamfile | 29 + .../freetype-2.3.5/src/smooth/ftgrays.c | 1983 +++ .../freetype-2.3.5/src/smooth/ftgrays.h | 57 + .../freetype-2.3.5/src/smooth/ftsmerrs.h | 41 + .../freetype-2.3.5/src/smooth/ftsmooth.c | 467 + .../freetype-2.3.5/src/smooth/ftsmooth.h | 49 + .../freetype-2.3.5/src/smooth/module.mk | 27 + .../freetype-2.3.5/src/smooth/rules.mk | 69 + .../freetype-2.3.5/src/smooth/smooth.c | 26 + src/WinLibs/freetype-2.3.5/src/tools/Jamfile | 5 + .../freetype-2.3.5/src/tools/apinames.c | 443 + .../freetype-2.3.5/src/tools/cordic.py | 79 + .../src/tools/docmaker/content.py | 588 + .../src/tools/docmaker/docbeauty.py | 109 + .../src/tools/docmaker/docmaker.py | 107 + .../src/tools/docmaker/formatter.py | 204 + .../src/tools/docmaker/sources.py | 358 + .../src/tools/docmaker/tohtml.py | 538 + .../src/tools/docmaker/utils.py | 132 + .../src/tools/ftrandom/Makefile | 35 + .../freetype-2.3.5/src/tools/ftrandom/README | 48 + .../src/tools/ftrandom/ftrandom.c | 659 + .../freetype-2.3.5/src/tools/glnames.py | 5282 ++++++ .../freetype-2.3.5/src/tools/test_afm.c | 157 + .../freetype-2.3.5/src/tools/test_bbox.c | 160 + .../freetype-2.3.5/src/tools/test_trig.c | 236 + .../freetype-2.3.5/src/truetype/Jamfile | 29 + .../freetype-2.3.5/src/truetype/module.mk | 23 + .../freetype-2.3.5/src/truetype/rules.mk | 72 + .../freetype-2.3.5/src/truetype/truetype.c | 36 + .../freetype-2.3.5/src/truetype/ttdriver.c | 418 + .../freetype-2.3.5/src/truetype/ttdriver.h | 38 + .../freetype-2.3.5/src/truetype/tterrors.h | 40 + .../freetype-2.3.5/src/truetype/ttgload.c | 1957 +++ .../freetype-2.3.5/src/truetype/ttgload.h | 49 + .../freetype-2.3.5/src/truetype/ttgxvar.c | 1536 ++ .../freetype-2.3.5/src/truetype/ttgxvar.h | 182 + .../freetype-2.3.5/src/truetype/ttinterp.c | 7809 +++++++++ .../freetype-2.3.5/src/truetype/ttinterp.h | 311 + .../freetype-2.3.5/src/truetype/ttobjs.c | 937 ++ .../freetype-2.3.5/src/truetype/ttobjs.h | 459 + .../freetype-2.3.5/src/truetype/ttpload.c | 523 + .../freetype-2.3.5/src/truetype/ttpload.h | 75 + src/WinLibs/freetype-2.3.5/src/type1/Jamfile | 29 + .../freetype-2.3.5/src/type1/module.mk | 23 + src/WinLibs/freetype-2.3.5/src/type1/rules.mk | 73 + src/WinLibs/freetype-2.3.5/src/type1/t1afm.c | 385 + src/WinLibs/freetype-2.3.5/src/type1/t1afm.h | 54 + .../freetype-2.3.5/src/type1/t1driver.c | 313 + .../freetype-2.3.5/src/type1/t1driver.h | 38 + .../freetype-2.3.5/src/type1/t1errors.h | 40 + .../freetype-2.3.5/src/type1/t1gload.c | 422 + .../freetype-2.3.5/src/type1/t1gload.h | 46 + src/WinLibs/freetype-2.3.5/src/type1/t1load.c | 2221 +++ src/WinLibs/freetype-2.3.5/src/type1/t1load.h | 102 + src/WinLibs/freetype-2.3.5/src/type1/t1objs.c | 566 + src/WinLibs/freetype-2.3.5/src/type1/t1objs.h | 171 + .../freetype-2.3.5/src/type1/t1parse.c | 479 + .../freetype-2.3.5/src/type1/t1parse.h | 135 + .../freetype-2.3.5/src/type1/t1tokens.h | 134 + src/WinLibs/freetype-2.3.5/src/type1/type1.c | 33 + src/WinLibs/freetype-2.3.5/src/type42/Jamfile | 29 + .../freetype-2.3.5/src/type42/module.mk | 23 + .../freetype-2.3.5/src/type42/rules.mk | 69 + .../freetype-2.3.5/src/type42/t42drivr.c | 232 + .../freetype-2.3.5/src/type42/t42drivr.h | 38 + .../freetype-2.3.5/src/type42/t42error.h | 40 + .../freetype-2.3.5/src/type42/t42objs.c | 647 + .../freetype-2.3.5/src/type42/t42objs.h | 124 + .../freetype-2.3.5/src/type42/t42parse.c | 1167 ++ .../freetype-2.3.5/src/type42/t42parse.h | 90 + .../freetype-2.3.5/src/type42/t42types.h | 54 + .../freetype-2.3.5/src/type42/type42.c | 25 + .../freetype-2.3.5/src/winfonts/Jamfile | 16 + .../freetype-2.3.5/src/winfonts/fnterrs.h | 41 + .../freetype-2.3.5/src/winfonts/module.mk | 23 + .../freetype-2.3.5/src/winfonts/rules.mk | 65 + .../freetype-2.3.5/src/winfonts/winfnt.c | 1122 ++ .../freetype-2.3.5/src/winfonts/winfnt.h | 167 + src/WinLibs/freetype-2.3.5/version.sed | 5 + src/WinLibs/freetype-2.3.5/vms_make.com | 1286 ++ src/projectM-wmp/projectM-wmp.sln | 88 +- src/projectM-wmp/projectM-wmp.suo | Bin 46080 -> 54784 bytes .../projectM-wmp/Debug/BuildLog.htm | Bin 10150 -> 23984 bytes .../projectM-wmp/Release/BuildLog.htm | Bin 10652 -> 14032 bytes .../projectM-wmp/projectM-wmp.cpp | 2 +- .../projectM-wmp/projectM-wmp.vcproj | 13 +- .../projectM-wmp/projectM-wmp_i.c | 2 +- .../projectM-wmp/projectM-wmpevents.cpp | 9 +- 852 files changed, 292967 insertions(+), 13 deletions(-) create mode 100644 src/WinLibs/FTGL/COPYING.txt create mode 100644 src/WinLibs/FTGL/HISTORY.txt create mode 100644 src/WinLibs/FTGL/README.txt create mode 100644 src/WinLibs/FTGL/cleanup create mode 100644 src/WinLibs/FTGL/demo/FTGLDemo.cpp create mode 100644 src/WinLibs/FTGL/demo/README.txt create mode 100644 src/WinLibs/FTGL/demo/tb.c create mode 100644 src/WinLibs/FTGL/demo/tb.h create mode 100644 src/WinLibs/FTGL/demo/trackball.c create mode 100644 src/WinLibs/FTGL/demo/trackball.h create mode 100644 src/WinLibs/FTGL/docs/FTGL.html create mode 100644 src/WinLibs/FTGL/docs/FTGL_1_3.gif create mode 100644 src/WinLibs/FTGL/docs/ftgl_dox create mode 100644 src/WinLibs/FTGL/docs/html.tar.gz create mode 100644 src/WinLibs/FTGL/docs/images/ftgldemo.jpg create mode 100644 src/WinLibs/FTGL/docs/images/metrics.png create mode 100644 src/WinLibs/FTGL/include/FTBBox.h create mode 100644 src/WinLibs/FTGL/include/FTBitmapGlyph.h create mode 100644 src/WinLibs/FTGL/include/FTCharToGlyphIndexMap.h create mode 100644 src/WinLibs/FTGL/include/FTCharmap.h create mode 100644 src/WinLibs/FTGL/include/FTContour.h create mode 100644 src/WinLibs/FTGL/include/FTExtrdGlyph.h create mode 100644 src/WinLibs/FTGL/include/FTFace.h create mode 100644 src/WinLibs/FTGL/include/FTFont.h create mode 100644 src/WinLibs/FTGL/include/FTGL.h create mode 100644 src/WinLibs/FTGL/include/FTGLBitmapFont.h create mode 100644 src/WinLibs/FTGL/include/FTGLExtrdFont.h create mode 100644 src/WinLibs/FTGL/include/FTGLOutlineFont.h create mode 100644 src/WinLibs/FTGL/include/FTGLPixmapFont.h create mode 100644 src/WinLibs/FTGL/include/FTGLPolygonFont.h create mode 100644 src/WinLibs/FTGL/include/FTGLTextureFont.h create mode 100644 src/WinLibs/FTGL/include/FTGlyph.h create mode 100644 src/WinLibs/FTGL/include/FTGlyphContainer.h create mode 100644 src/WinLibs/FTGL/include/FTLibrary.h create mode 100644 src/WinLibs/FTGL/include/FTList.h create mode 100644 src/WinLibs/FTGL/include/FTOutlineGlyph.h create mode 100644 src/WinLibs/FTGL/include/FTPixmapGlyph.h create mode 100644 src/WinLibs/FTGL/include/FTPoint.h create mode 100644 src/WinLibs/FTGL/include/FTPolyGlyph.h create mode 100644 src/WinLibs/FTGL/include/FTSize.h create mode 100644 src/WinLibs/FTGL/include/FTTextureGlyph.h create mode 100644 src/WinLibs/FTGL/include/FTVector.h create mode 100644 src/WinLibs/FTGL/include/FTVectoriser.h create mode 100644 src/WinLibs/FTGL/license.txt create mode 100644 src/WinLibs/FTGL/mac/FTGL.xcode/henry.mode1 create mode 100644 src/WinLibs/FTGL/mac/FTGL.xcode/henry.pbxuser create mode 100644 src/WinLibs/FTGL/mac/FTGL.xcode/project.pbxproj create mode 100644 src/WinLibs/FTGL/mac/README.txt create mode 100644 src/WinLibs/FTGL/src/FTBitmapGlyph.cpp create mode 100644 src/WinLibs/FTGL/src/FTCharmap.cpp create mode 100644 src/WinLibs/FTGL/src/FTContour.cpp create mode 100644 src/WinLibs/FTGL/src/FTExtrdGlyph.cpp create mode 100644 src/WinLibs/FTGL/src/FTFace.cpp create mode 100644 src/WinLibs/FTGL/src/FTFont.cpp create mode 100644 src/WinLibs/FTGL/src/FTGLBitmapFont.cpp create mode 100644 src/WinLibs/FTGL/src/FTGLExtrdFont.cpp create mode 100644 src/WinLibs/FTGL/src/FTGLOutlineFont.cpp create mode 100644 src/WinLibs/FTGL/src/FTGLPixmapFont.cpp create mode 100644 src/WinLibs/FTGL/src/FTGLPolygonFont.cpp create mode 100644 src/WinLibs/FTGL/src/FTGLTextureFont.cpp create mode 100644 src/WinLibs/FTGL/src/FTGlyph.cpp create mode 100644 src/WinLibs/FTGL/src/FTGlyphContainer.cpp create mode 100644 src/WinLibs/FTGL/src/FTLibrary.cpp create mode 100644 src/WinLibs/FTGL/src/FTOutlineGlyph.cpp create mode 100644 src/WinLibs/FTGL/src/FTPixmapGlyph.cpp create mode 100644 src/WinLibs/FTGL/src/FTPoint.cpp create mode 100644 src/WinLibs/FTGL/src/FTPolyGlyph.cpp create mode 100644 src/WinLibs/FTGL/src/FTSize.cpp create mode 100644 src/WinLibs/FTGL/src/FTTextureGlyph.cpp create mode 100644 src/WinLibs/FTGL/src/FTVectoriser.cpp create mode 100644 src/WinLibs/FTGL/test/FTBBox-Test.cpp create mode 100644 src/WinLibs/FTGL/test/FTBitmapGlyph-Test.cpp create mode 100644 src/WinLibs/FTGL/test/FTCharToGlyphIndexMap-Test.cpp create mode 100644 src/WinLibs/FTGL/test/FTCharmap-Test.cpp create mode 100644 src/WinLibs/FTGL/test/FTContour-Test.cpp create mode 100644 src/WinLibs/FTGL/test/FTExtrdGlyph-Test.cpp create mode 100644 src/WinLibs/FTGL/test/FTFace-Test.cpp create mode 100644 src/WinLibs/FTGL/test/FTFont-Test.cpp create mode 100644 src/WinLibs/FTGL/test/FTGLBitmapFont-Test.cpp create mode 100644 src/WinLibs/FTGL/test/FTGLExtrdFont.cpp-Test.cpp create mode 100644 src/WinLibs/FTGL/test/FTGLOutlineFont-Test.cpp create mode 100644 src/WinLibs/FTGL/test/FTGLPixmapFont-Test.cpp create mode 100644 src/WinLibs/FTGL/test/FTGLPolygonFont-Test.cpp create mode 100644 src/WinLibs/FTGL/test/FTGLTextureFont-Test.cpp create mode 100644 src/WinLibs/FTGL/test/FTGlyph-Test.cpp create mode 100644 src/WinLibs/FTGL/test/FTGlyphContainer-Test.cpp create mode 100644 src/WinLibs/FTGL/test/FTLibrary-Test.cpp create mode 100644 src/WinLibs/FTGL/test/FTList-Test.cpp create mode 100644 src/WinLibs/FTGL/test/FTMesh-Test.cpp create mode 100644 src/WinLibs/FTGL/test/FTOutlineGlyph-Test.cpp create mode 100644 src/WinLibs/FTGL/test/FTPixmapGlyph-Test.cpp create mode 100644 src/WinLibs/FTGL/test/FTPoint-Test.cpp create mode 100644 src/WinLibs/FTGL/test/FTPolyGlyph-Test.cpp create mode 100644 src/WinLibs/FTGL/test/FTSize-Test.cpp create mode 100644 src/WinLibs/FTGL/test/FTTesselation-Test.cpp create mode 100644 src/WinLibs/FTGL/test/FTTextureGlyph-Test.cpp create mode 100644 src/WinLibs/FTGL/test/FTVector-Test.cpp create mode 100644 src/WinLibs/FTGL/test/FTVectoriser-Test.cpp create mode 100644 src/WinLibs/FTGL/test/FTlayout-Test.cpp create mode 100644 src/WinLibs/FTGL/test/Fontdefs.h create mode 100644 src/WinLibs/FTGL/test/HPGCalc_afm.cpp create mode 100644 src/WinLibs/FTGL/test/HPGCalc_pfb.cpp create mode 100644 src/WinLibs/FTGL/test/README.txt create mode 100644 src/WinLibs/FTGL/test/TestMain.cpp create mode 100644 src/WinLibs/FTGL/test/demo.cpp create mode 100644 src/WinLibs/FTGL/test/font_pack/README.txt create mode 100644 src/WinLibs/FTGL/test/mmgr.cpp create mode 100644 src/WinLibs/FTGL/test/mmgr.h create mode 100644 src/WinLibs/FTGL/test/nommgr.h create mode 100644 src/WinLibs/FTGL/unix/Make.conf.in create mode 100644 src/WinLibs/FTGL/unix/Make.rules create mode 100644 src/WinLibs/FTGL/unix/Makefile create mode 100644 src/WinLibs/FTGL/unix/README.txt create mode 100644 src/WinLibs/FTGL/unix/acinclude.m4 create mode 100644 src/WinLibs/FTGL/unix/aclocal.m4 create mode 100644 src/WinLibs/FTGL/unix/bootstrap create mode 100644 src/WinLibs/FTGL/unix/config.guess create mode 100644 src/WinLibs/FTGL/unix/config.sub create mode 100644 src/WinLibs/FTGL/unix/configure create mode 100644 src/WinLibs/FTGL/unix/configure.ac create mode 100644 src/WinLibs/FTGL/unix/demo/Makefile create mode 100644 src/WinLibs/FTGL/unix/docs/Makefile create mode 100644 src/WinLibs/FTGL/unix/ftgl.pc.in create mode 100644 src/WinLibs/FTGL/unix/install-sh create mode 100644 src/WinLibs/FTGL/unix/ltmain.sh create mode 100644 src/WinLibs/FTGL/unix/m4/cxx.m4 create mode 100644 src/WinLibs/FTGL/unix/m4/freetype2.m4 create mode 100644 src/WinLibs/FTGL/unix/m4/gl.m4 create mode 100644 src/WinLibs/FTGL/unix/m4/glut.m4 create mode 100644 src/WinLibs/FTGL/unix/src/Makefile create mode 100644 src/WinLibs/FTGL/win32_vcpp/README_WIN32.txt create mode 100644 src/WinLibs/FTGL/win32_vcpp/build/ftgl_static_MT_d.lib create mode 100644 src/WinLibs/FTGL/win32_vcpp/ftgl.dsw create mode 100644 src/WinLibs/FTGL/win32_vcpp/ftgl_demo/demo.cpp create mode 100644 src/WinLibs/FTGL/win32_vcpp/ftgl_demo/ftgl_demo.dsp create mode 100644 src/WinLibs/FTGL/win32_vcpp/ftgl_demo/ftgl_demo_2.dsp create mode 100644 src/WinLibs/FTGL/win32_vcpp/ftgl_dll/ftgl_dll.dsp create mode 100644 src/WinLibs/FTGL/win32_vcpp/ftgl_static_lib/Debug_ST/BuildLog.htm create mode 100644 src/WinLibs/FTGL/win32_vcpp/ftgl_static_lib/Debug_ST/FTBitmapGlyph.obj create mode 100644 src/WinLibs/FTGL/win32_vcpp/ftgl_static_lib/Debug_ST/FTCharmap.obj create mode 100644 src/WinLibs/FTGL/win32_vcpp/ftgl_static_lib/Debug_ST/FTContour.obj create mode 100644 src/WinLibs/FTGL/win32_vcpp/ftgl_static_lib/Debug_ST/FTExtrdGlyph.obj create mode 100644 src/WinLibs/FTGL/win32_vcpp/ftgl_static_lib/Debug_ST/FTFace.obj create mode 100644 src/WinLibs/FTGL/win32_vcpp/ftgl_static_lib/Debug_ST/FTFont.obj create mode 100644 src/WinLibs/FTGL/win32_vcpp/ftgl_static_lib/Debug_ST/FTGLBitmapFont.obj create mode 100644 src/WinLibs/FTGL/win32_vcpp/ftgl_static_lib/Debug_ST/FTGLExtrdFont.obj create mode 100644 src/WinLibs/FTGL/win32_vcpp/ftgl_static_lib/Debug_ST/FTGLOutlineFont.obj create mode 100644 src/WinLibs/FTGL/win32_vcpp/ftgl_static_lib/Debug_ST/FTGLPixmapFont.obj create mode 100644 src/WinLibs/FTGL/win32_vcpp/ftgl_static_lib/Debug_ST/FTGLPolygonFont.obj create mode 100644 src/WinLibs/FTGL/win32_vcpp/ftgl_static_lib/Debug_ST/FTGLTextureFont.obj create mode 100644 src/WinLibs/FTGL/win32_vcpp/ftgl_static_lib/Debug_ST/FTGlyph.obj create mode 100644 src/WinLibs/FTGL/win32_vcpp/ftgl_static_lib/Debug_ST/FTGlyphContainer.obj create mode 100644 src/WinLibs/FTGL/win32_vcpp/ftgl_static_lib/Debug_ST/FTLibrary.obj create mode 100644 src/WinLibs/FTGL/win32_vcpp/ftgl_static_lib/Debug_ST/FTOutlineGlyph.obj create mode 100644 src/WinLibs/FTGL/win32_vcpp/ftgl_static_lib/Debug_ST/FTPixmapGlyph.obj create mode 100644 src/WinLibs/FTGL/win32_vcpp/ftgl_static_lib/Debug_ST/FTPoint.obj create mode 100644 src/WinLibs/FTGL/win32_vcpp/ftgl_static_lib/Debug_ST/FTPolyGlyph.obj create mode 100644 src/WinLibs/FTGL/win32_vcpp/ftgl_static_lib/Debug_ST/FTSize.obj create mode 100644 src/WinLibs/FTGL/win32_vcpp/ftgl_static_lib/Debug_ST/FTTextureGlyph.obj create mode 100644 src/WinLibs/FTGL/win32_vcpp/ftgl_static_lib/Debug_ST/FTVectoriser.obj create mode 100644 src/WinLibs/FTGL/win32_vcpp/ftgl_static_lib/Debug_ST/vc80.idb create mode 100644 src/WinLibs/FTGL/win32_vcpp/ftgl_static_lib/Debug_ST/vc80.pdb create mode 100644 src/WinLibs/FTGL/win32_vcpp/ftgl_static_lib/Release_ST/BuildLog.htm create mode 100644 src/WinLibs/FTGL/win32_vcpp/ftgl_static_lib/ftgl_static_lib.dsp create mode 100644 src/WinLibs/FTGL/win32_vcpp/ftgl_static_lib/ftgl_static_lib.vcproj create mode 100644 src/WinLibs/FTGL/win32_vcpp/ftgl_static_lib/ftgl_static_lib.vcproj.CYBERDEV2.DEV2.user create mode 100644 src/WinLibs/FTGL/win32_vcpp/unit_tests/unit_tests.dsp create mode 100644 src/WinLibs/freetype-2.3.5/ChangeLog create mode 100644 src/WinLibs/freetype-2.3.5/ChangeLog.20 create mode 100644 src/WinLibs/freetype-2.3.5/ChangeLog.21 create mode 100644 src/WinLibs/freetype-2.3.5/ChangeLog.22 create mode 100644 src/WinLibs/freetype-2.3.5/Jamfile create mode 100644 src/WinLibs/freetype-2.3.5/Jamrules create mode 100644 src/WinLibs/freetype-2.3.5/Makefile create mode 100644 src/WinLibs/freetype-2.3.5/README create mode 100644 src/WinLibs/freetype-2.3.5/README.CVS create mode 100644 src/WinLibs/freetype-2.3.5/autogen.sh create mode 100644 src/WinLibs/freetype-2.3.5/builds/amiga/README create mode 100644 src/WinLibs/freetype-2.3.5/builds/amiga/include/freetype/config/ftconfig.h create mode 100644 src/WinLibs/freetype-2.3.5/builds/amiga/include/freetype/config/ftmodule.h create mode 100644 src/WinLibs/freetype-2.3.5/builds/amiga/makefile create mode 100644 src/WinLibs/freetype-2.3.5/builds/amiga/makefile.os4 create mode 100644 src/WinLibs/freetype-2.3.5/builds/amiga/smakefile create mode 100644 src/WinLibs/freetype-2.3.5/builds/amiga/src/base/ftdebug.c create mode 100644 src/WinLibs/freetype-2.3.5/builds/amiga/src/base/ftsystem.c create mode 100644 src/WinLibs/freetype-2.3.5/builds/ansi/ansi-def.mk create mode 100644 src/WinLibs/freetype-2.3.5/builds/ansi/ansi.mk create mode 100644 src/WinLibs/freetype-2.3.5/builds/atari/ATARI.H create mode 100644 src/WinLibs/freetype-2.3.5/builds/atari/FNames.SIC create mode 100644 src/WinLibs/freetype-2.3.5/builds/atari/FREETYPE.PRJ create mode 100644 src/WinLibs/freetype-2.3.5/builds/atari/README.TXT create mode 100644 src/WinLibs/freetype-2.3.5/builds/beos/beos-def.mk create mode 100644 src/WinLibs/freetype-2.3.5/builds/beos/beos.mk create mode 100644 src/WinLibs/freetype-2.3.5/builds/beos/detect.mk create mode 100644 src/WinLibs/freetype-2.3.5/builds/compiler/ansi-cc.mk create mode 100644 src/WinLibs/freetype-2.3.5/builds/compiler/bcc-dev.mk create mode 100644 src/WinLibs/freetype-2.3.5/builds/compiler/bcc.mk create mode 100644 src/WinLibs/freetype-2.3.5/builds/compiler/emx.mk create mode 100644 src/WinLibs/freetype-2.3.5/builds/compiler/gcc-dev.mk create mode 100644 src/WinLibs/freetype-2.3.5/builds/compiler/gcc.mk create mode 100644 src/WinLibs/freetype-2.3.5/builds/compiler/intelc.mk create mode 100644 src/WinLibs/freetype-2.3.5/builds/compiler/unix-lcc.mk create mode 100644 src/WinLibs/freetype-2.3.5/builds/compiler/visualage.mk create mode 100644 src/WinLibs/freetype-2.3.5/builds/compiler/visualc.mk create mode 100644 src/WinLibs/freetype-2.3.5/builds/compiler/watcom.mk create mode 100644 src/WinLibs/freetype-2.3.5/builds/compiler/win-lcc.mk create mode 100644 src/WinLibs/freetype-2.3.5/builds/detect.mk create mode 100644 src/WinLibs/freetype-2.3.5/builds/dos/detect.mk create mode 100644 src/WinLibs/freetype-2.3.5/builds/dos/dos-def.mk create mode 100644 src/WinLibs/freetype-2.3.5/builds/dos/dos-emx.mk create mode 100644 src/WinLibs/freetype-2.3.5/builds/dos/dos-gcc.mk create mode 100644 src/WinLibs/freetype-2.3.5/builds/dos/dos-wat.mk create mode 100644 src/WinLibs/freetype-2.3.5/builds/exports.mk create mode 100644 src/WinLibs/freetype-2.3.5/builds/freetype.mk create mode 100644 src/WinLibs/freetype-2.3.5/builds/link_dos.mk create mode 100644 src/WinLibs/freetype-2.3.5/builds/link_std.mk create mode 100644 src/WinLibs/freetype-2.3.5/builds/mac/FreeType.m68k_cfm.make.txt create mode 100644 src/WinLibs/freetype-2.3.5/builds/mac/FreeType.m68k_far.make.txt create mode 100644 src/WinLibs/freetype-2.3.5/builds/mac/FreeType.ppc_carbon.make.txt create mode 100644 src/WinLibs/freetype-2.3.5/builds/mac/FreeType.ppc_classic.make.txt create mode 100644 src/WinLibs/freetype-2.3.5/builds/mac/README create mode 100644 src/WinLibs/freetype-2.3.5/builds/mac/ascii2mpw.py create mode 100644 src/WinLibs/freetype-2.3.5/builds/mac/ftlib.prj.xml create mode 100644 src/WinLibs/freetype-2.3.5/builds/mac/ftmac.c create mode 100644 src/WinLibs/freetype-2.3.5/builds/modules.mk create mode 100644 src/WinLibs/freetype-2.3.5/builds/newline create mode 100644 src/WinLibs/freetype-2.3.5/builds/os2/detect.mk create mode 100644 src/WinLibs/freetype-2.3.5/builds/os2/os2-def.mk create mode 100644 src/WinLibs/freetype-2.3.5/builds/os2/os2-dev.mk create mode 100644 src/WinLibs/freetype-2.3.5/builds/os2/os2-gcc.mk create mode 100644 src/WinLibs/freetype-2.3.5/builds/toplevel.mk create mode 100644 src/WinLibs/freetype-2.3.5/builds/unix/config.guess create mode 100644 src/WinLibs/freetype-2.3.5/builds/unix/config.sub create mode 100644 src/WinLibs/freetype-2.3.5/builds/unix/configure.ac create mode 100644 src/WinLibs/freetype-2.3.5/builds/unix/configure.raw create mode 100644 src/WinLibs/freetype-2.3.5/builds/unix/detect.mk create mode 100644 src/WinLibs/freetype-2.3.5/builds/unix/freetype-config.in create mode 100644 src/WinLibs/freetype-2.3.5/builds/unix/freetype2.in create mode 100644 src/WinLibs/freetype-2.3.5/builds/unix/freetype2.m4 create mode 100644 src/WinLibs/freetype-2.3.5/builds/unix/ft-munmap.m4 create mode 100644 src/WinLibs/freetype-2.3.5/builds/unix/ft2unix.h create mode 100644 src/WinLibs/freetype-2.3.5/builds/unix/ftconfig.in create mode 100644 src/WinLibs/freetype-2.3.5/builds/unix/ftsystem.c create mode 100644 src/WinLibs/freetype-2.3.5/builds/unix/install-sh create mode 100644 src/WinLibs/freetype-2.3.5/builds/unix/install.mk create mode 100644 src/WinLibs/freetype-2.3.5/builds/unix/mkinstalldirs create mode 100644 src/WinLibs/freetype-2.3.5/builds/unix/unix-cc.in create mode 100644 src/WinLibs/freetype-2.3.5/builds/unix/unix-def.in create mode 100644 src/WinLibs/freetype-2.3.5/builds/unix/unix-dev.mk create mode 100644 src/WinLibs/freetype-2.3.5/builds/unix/unix-lcc.mk create mode 100644 src/WinLibs/freetype-2.3.5/builds/unix/unix.mk create mode 100644 src/WinLibs/freetype-2.3.5/builds/unix/unixddef.mk create mode 100644 src/WinLibs/freetype-2.3.5/builds/vms/ftconfig.h create mode 100644 src/WinLibs/freetype-2.3.5/builds/vms/ftsystem.c create mode 100644 src/WinLibs/freetype-2.3.5/builds/win32/detect.mk create mode 100644 src/WinLibs/freetype-2.3.5/builds/win32/ftdebug.c create mode 100644 src/WinLibs/freetype-2.3.5/builds/win32/visualc/freetype.dsp create mode 100644 src/WinLibs/freetype-2.3.5/builds/win32/visualc/freetype.dsw create mode 100644 src/WinLibs/freetype-2.3.5/builds/win32/visualc/freetype.sln create mode 100644 src/WinLibs/freetype-2.3.5/builds/win32/visualc/freetype.vcproj create mode 100644 src/WinLibs/freetype-2.3.5/builds/win32/visualc/freetype.vcproj.CYBERDEV2.DEV2.user create mode 100644 src/WinLibs/freetype-2.3.5/builds/win32/visualc/index.html create mode 100644 src/WinLibs/freetype-2.3.5/builds/win32/visualce/freetype.dsp create mode 100644 src/WinLibs/freetype-2.3.5/builds/win32/visualce/freetype.dsw create mode 100644 src/WinLibs/freetype-2.3.5/builds/win32/visualce/freetype.vcproj create mode 100644 src/WinLibs/freetype-2.3.5/builds/win32/visualce/index.html create mode 100644 src/WinLibs/freetype-2.3.5/builds/win32/w32-bcc.mk create mode 100644 src/WinLibs/freetype-2.3.5/builds/win32/w32-bccd.mk create mode 100644 src/WinLibs/freetype-2.3.5/builds/win32/w32-dev.mk create mode 100644 src/WinLibs/freetype-2.3.5/builds/win32/w32-gcc.mk create mode 100644 src/WinLibs/freetype-2.3.5/builds/win32/w32-icc.mk create mode 100644 src/WinLibs/freetype-2.3.5/builds/win32/w32-intl.mk create mode 100644 src/WinLibs/freetype-2.3.5/builds/win32/w32-lcc.mk create mode 100644 src/WinLibs/freetype-2.3.5/builds/win32/w32-mingw32.mk create mode 100644 src/WinLibs/freetype-2.3.5/builds/win32/w32-vcc.mk create mode 100644 src/WinLibs/freetype-2.3.5/builds/win32/w32-wat.mk create mode 100644 src/WinLibs/freetype-2.3.5/builds/win32/win32-def.mk create mode 100644 src/WinLibs/freetype-2.3.5/configure create mode 100644 src/WinLibs/freetype-2.3.5/devel/ft2build.h create mode 100644 src/WinLibs/freetype-2.3.5/devel/ftoption.h create mode 100644 src/WinLibs/freetype-2.3.5/docs/CHANGES create mode 100644 src/WinLibs/freetype-2.3.5/docs/CUSTOMIZE create mode 100644 src/WinLibs/freetype-2.3.5/docs/DEBUG create mode 100644 src/WinLibs/freetype-2.3.5/docs/FTL.TXT create mode 100644 src/WinLibs/freetype-2.3.5/docs/GPL.TXT create mode 100644 src/WinLibs/freetype-2.3.5/docs/INSTALL create mode 100644 src/WinLibs/freetype-2.3.5/docs/INSTALL.ANY create mode 100644 src/WinLibs/freetype-2.3.5/docs/INSTALL.CROSS create mode 100644 src/WinLibs/freetype-2.3.5/docs/INSTALL.GNU create mode 100644 src/WinLibs/freetype-2.3.5/docs/INSTALL.MAC create mode 100644 src/WinLibs/freetype-2.3.5/docs/INSTALL.UNIX create mode 100644 src/WinLibs/freetype-2.3.5/docs/INSTALL.VMS create mode 100644 src/WinLibs/freetype-2.3.5/docs/LICENSE.TXT create mode 100644 src/WinLibs/freetype-2.3.5/docs/MAKEPP create mode 100644 src/WinLibs/freetype-2.3.5/docs/PATENTS create mode 100644 src/WinLibs/freetype-2.3.5/docs/PROBLEMS create mode 100644 src/WinLibs/freetype-2.3.5/docs/TODO create mode 100644 src/WinLibs/freetype-2.3.5/docs/TRUETYPE create mode 100644 src/WinLibs/freetype-2.3.5/docs/UPGRADE.UNIX create mode 100644 src/WinLibs/freetype-2.3.5/docs/VERSION.DLL create mode 100644 src/WinLibs/freetype-2.3.5/docs/formats.txt create mode 100644 src/WinLibs/freetype-2.3.5/docs/raster.txt create mode 100644 src/WinLibs/freetype-2.3.5/docs/reference/README create mode 100644 src/WinLibs/freetype-2.3.5/docs/reference/ft2-base_interface.html create mode 100644 src/WinLibs/freetype-2.3.5/docs/reference/ft2-basic_types.html create mode 100644 src/WinLibs/freetype-2.3.5/docs/reference/ft2-bdf_fonts.html create mode 100644 src/WinLibs/freetype-2.3.5/docs/reference/ft2-bitmap_handling.html create mode 100644 src/WinLibs/freetype-2.3.5/docs/reference/ft2-cache_subsystem.html create mode 100644 src/WinLibs/freetype-2.3.5/docs/reference/ft2-computations.html create mode 100644 src/WinLibs/freetype-2.3.5/docs/reference/ft2-font_formats.html create mode 100644 src/WinLibs/freetype-2.3.5/docs/reference/ft2-gasp_table.html create mode 100644 src/WinLibs/freetype-2.3.5/docs/reference/ft2-glyph_management.html create mode 100644 src/WinLibs/freetype-2.3.5/docs/reference/ft2-glyph_stroker.html create mode 100644 src/WinLibs/freetype-2.3.5/docs/reference/ft2-gx_validation.html create mode 100644 src/WinLibs/freetype-2.3.5/docs/reference/ft2-gzip.html create mode 100644 src/WinLibs/freetype-2.3.5/docs/reference/ft2-header_file_macros.html create mode 100644 src/WinLibs/freetype-2.3.5/docs/reference/ft2-incremental.html create mode 100644 src/WinLibs/freetype-2.3.5/docs/reference/ft2-index.html create mode 100644 src/WinLibs/freetype-2.3.5/docs/reference/ft2-lcd_filtering.html create mode 100644 src/WinLibs/freetype-2.3.5/docs/reference/ft2-list_processing.html create mode 100644 src/WinLibs/freetype-2.3.5/docs/reference/ft2-lzw.html create mode 100644 src/WinLibs/freetype-2.3.5/docs/reference/ft2-mac_specific.html create mode 100644 src/WinLibs/freetype-2.3.5/docs/reference/ft2-module_management.html create mode 100644 src/WinLibs/freetype-2.3.5/docs/reference/ft2-multiple_masters.html create mode 100644 src/WinLibs/freetype-2.3.5/docs/reference/ft2-ot_validation.html create mode 100644 src/WinLibs/freetype-2.3.5/docs/reference/ft2-outline_processing.html create mode 100644 src/WinLibs/freetype-2.3.5/docs/reference/ft2-pfr_fonts.html create mode 100644 src/WinLibs/freetype-2.3.5/docs/reference/ft2-raster.html create mode 100644 src/WinLibs/freetype-2.3.5/docs/reference/ft2-sfnt_names.html create mode 100644 src/WinLibs/freetype-2.3.5/docs/reference/ft2-sizes_management.html create mode 100644 src/WinLibs/freetype-2.3.5/docs/reference/ft2-system_interface.html create mode 100644 src/WinLibs/freetype-2.3.5/docs/reference/ft2-toc.html create mode 100644 src/WinLibs/freetype-2.3.5/docs/reference/ft2-truetype_engine.html create mode 100644 src/WinLibs/freetype-2.3.5/docs/reference/ft2-truetype_tables.html create mode 100644 src/WinLibs/freetype-2.3.5/docs/reference/ft2-type1_tables.html create mode 100644 src/WinLibs/freetype-2.3.5/docs/reference/ft2-user_allocation.html create mode 100644 src/WinLibs/freetype-2.3.5/docs/reference/ft2-version.html create mode 100644 src/WinLibs/freetype-2.3.5/docs/reference/ft2-winfnt_fonts.html create mode 100644 src/WinLibs/freetype-2.3.5/docs/release create mode 100644 src/WinLibs/freetype-2.3.5/include/freetype/config/ftconfig.h create mode 100644 src/WinLibs/freetype-2.3.5/include/freetype/config/ftheader.h create mode 100644 src/WinLibs/freetype-2.3.5/include/freetype/config/ftmodule.h create mode 100644 src/WinLibs/freetype-2.3.5/include/freetype/config/ftoption.h create mode 100644 src/WinLibs/freetype-2.3.5/include/freetype/config/ftstdlib.h create mode 100644 src/WinLibs/freetype-2.3.5/include/freetype/freetype.h create mode 100644 src/WinLibs/freetype-2.3.5/include/freetype/ftbbox.h create mode 100644 src/WinLibs/freetype-2.3.5/include/freetype/ftbdf.h create mode 100644 src/WinLibs/freetype-2.3.5/include/freetype/ftbitmap.h create mode 100644 src/WinLibs/freetype-2.3.5/include/freetype/ftcache.h create mode 100644 src/WinLibs/freetype-2.3.5/include/freetype/ftchapters.h create mode 100644 src/WinLibs/freetype-2.3.5/include/freetype/fterrdef.h create mode 100644 src/WinLibs/freetype-2.3.5/include/freetype/fterrors.h create mode 100644 src/WinLibs/freetype-2.3.5/include/freetype/ftgasp.h create mode 100644 src/WinLibs/freetype-2.3.5/include/freetype/ftglyph.h create mode 100644 src/WinLibs/freetype-2.3.5/include/freetype/ftgxval.h create mode 100644 src/WinLibs/freetype-2.3.5/include/freetype/ftgzip.h create mode 100644 src/WinLibs/freetype-2.3.5/include/freetype/ftimage.h create mode 100644 src/WinLibs/freetype-2.3.5/include/freetype/ftincrem.h create mode 100644 src/WinLibs/freetype-2.3.5/include/freetype/ftlcdfil.h create mode 100644 src/WinLibs/freetype-2.3.5/include/freetype/ftlist.h create mode 100644 src/WinLibs/freetype-2.3.5/include/freetype/ftlzw.h create mode 100644 src/WinLibs/freetype-2.3.5/include/freetype/ftmac.h create mode 100644 src/WinLibs/freetype-2.3.5/include/freetype/ftmm.h create mode 100644 src/WinLibs/freetype-2.3.5/include/freetype/ftmodapi.h create mode 100644 src/WinLibs/freetype-2.3.5/include/freetype/ftmoderr.h create mode 100644 src/WinLibs/freetype-2.3.5/include/freetype/ftotval.h create mode 100644 src/WinLibs/freetype-2.3.5/include/freetype/ftoutln.h create mode 100644 src/WinLibs/freetype-2.3.5/include/freetype/ftpfr.h create mode 100644 src/WinLibs/freetype-2.3.5/include/freetype/ftrender.h create mode 100644 src/WinLibs/freetype-2.3.5/include/freetype/ftsizes.h create mode 100644 src/WinLibs/freetype-2.3.5/include/freetype/ftsnames.h create mode 100644 src/WinLibs/freetype-2.3.5/include/freetype/ftstroke.h create mode 100644 src/WinLibs/freetype-2.3.5/include/freetype/ftsynth.h create mode 100644 src/WinLibs/freetype-2.3.5/include/freetype/ftsystem.h create mode 100644 src/WinLibs/freetype-2.3.5/include/freetype/fttrigon.h create mode 100644 src/WinLibs/freetype-2.3.5/include/freetype/fttypes.h create mode 100644 src/WinLibs/freetype-2.3.5/include/freetype/ftwinfnt.h create mode 100644 src/WinLibs/freetype-2.3.5/include/freetype/ftxf86.h create mode 100644 src/WinLibs/freetype-2.3.5/include/freetype/internal/autohint.h create mode 100644 src/WinLibs/freetype-2.3.5/include/freetype/internal/ftcalc.h create mode 100644 src/WinLibs/freetype-2.3.5/include/freetype/internal/ftdebug.h create mode 100644 src/WinLibs/freetype-2.3.5/include/freetype/internal/ftdriver.h create mode 100644 src/WinLibs/freetype-2.3.5/include/freetype/internal/ftgloadr.h create mode 100644 src/WinLibs/freetype-2.3.5/include/freetype/internal/ftmemory.h create mode 100644 src/WinLibs/freetype-2.3.5/include/freetype/internal/ftobjs.h create mode 100644 src/WinLibs/freetype-2.3.5/include/freetype/internal/ftrfork.h create mode 100644 src/WinLibs/freetype-2.3.5/include/freetype/internal/ftserv.h create mode 100644 src/WinLibs/freetype-2.3.5/include/freetype/internal/ftstream.h create mode 100644 src/WinLibs/freetype-2.3.5/include/freetype/internal/fttrace.h create mode 100644 src/WinLibs/freetype-2.3.5/include/freetype/internal/ftvalid.h create mode 100644 src/WinLibs/freetype-2.3.5/include/freetype/internal/internal.h create mode 100644 src/WinLibs/freetype-2.3.5/include/freetype/internal/pcftypes.h create mode 100644 src/WinLibs/freetype-2.3.5/include/freetype/internal/psaux.h create mode 100644 src/WinLibs/freetype-2.3.5/include/freetype/internal/pshints.h create mode 100644 src/WinLibs/freetype-2.3.5/include/freetype/internal/services/svbdf.h create mode 100644 src/WinLibs/freetype-2.3.5/include/freetype/internal/services/svgldict.h create mode 100644 src/WinLibs/freetype-2.3.5/include/freetype/internal/services/svgxval.h create mode 100644 src/WinLibs/freetype-2.3.5/include/freetype/internal/services/svkern.h create mode 100644 src/WinLibs/freetype-2.3.5/include/freetype/internal/services/svmm.h create mode 100644 src/WinLibs/freetype-2.3.5/include/freetype/internal/services/svotval.h create mode 100644 src/WinLibs/freetype-2.3.5/include/freetype/internal/services/svpfr.h create mode 100644 src/WinLibs/freetype-2.3.5/include/freetype/internal/services/svpostnm.h create mode 100644 src/WinLibs/freetype-2.3.5/include/freetype/internal/services/svpscmap.h create mode 100644 src/WinLibs/freetype-2.3.5/include/freetype/internal/services/svpsinfo.h create mode 100644 src/WinLibs/freetype-2.3.5/include/freetype/internal/services/svsfnt.h create mode 100644 src/WinLibs/freetype-2.3.5/include/freetype/internal/services/svttcmap.h create mode 100644 src/WinLibs/freetype-2.3.5/include/freetype/internal/services/svtteng.h create mode 100644 src/WinLibs/freetype-2.3.5/include/freetype/internal/services/svttglyf.h create mode 100644 src/WinLibs/freetype-2.3.5/include/freetype/internal/services/svwinfnt.h create mode 100644 src/WinLibs/freetype-2.3.5/include/freetype/internal/services/svxf86nm.h create mode 100644 src/WinLibs/freetype-2.3.5/include/freetype/internal/sfnt.h create mode 100644 src/WinLibs/freetype-2.3.5/include/freetype/internal/t1types.h create mode 100644 src/WinLibs/freetype-2.3.5/include/freetype/internal/tttypes.h create mode 100644 src/WinLibs/freetype-2.3.5/include/freetype/t1tables.h create mode 100644 src/WinLibs/freetype-2.3.5/include/freetype/ttnameid.h create mode 100644 src/WinLibs/freetype-2.3.5/include/freetype/tttables.h create mode 100644 src/WinLibs/freetype-2.3.5/include/freetype/tttags.h create mode 100644 src/WinLibs/freetype-2.3.5/include/freetype/ttunpat.h create mode 100644 src/WinLibs/freetype-2.3.5/include/ft2build.h create mode 100644 src/WinLibs/freetype-2.3.5/modules.cfg create mode 100644 src/WinLibs/freetype-2.3.5/objs/README create mode 100644 src/WinLibs/freetype-2.3.5/objs/debug/BuildLog.htm create mode 100644 src/WinLibs/freetype-2.3.5/objs/debug/autofit.obj create mode 100644 src/WinLibs/freetype-2.3.5/objs/debug/bdf.obj create mode 100644 src/WinLibs/freetype-2.3.5/objs/debug/cff.obj create mode 100644 src/WinLibs/freetype-2.3.5/objs/debug/ftbase.obj create mode 100644 src/WinLibs/freetype-2.3.5/objs/debug/ftbbox.obj create mode 100644 src/WinLibs/freetype-2.3.5/objs/debug/ftbitmap.obj create mode 100644 src/WinLibs/freetype-2.3.5/objs/debug/ftcache.obj create mode 100644 src/WinLibs/freetype-2.3.5/objs/debug/ftdebug.obj create mode 100644 src/WinLibs/freetype-2.3.5/objs/debug/ftgasp.obj create mode 100644 src/WinLibs/freetype-2.3.5/objs/debug/ftglyph.obj create mode 100644 src/WinLibs/freetype-2.3.5/objs/debug/ftgzip.obj create mode 100644 src/WinLibs/freetype-2.3.5/objs/debug/ftinit.obj create mode 100644 src/WinLibs/freetype-2.3.5/objs/debug/ftlzw.obj create mode 100644 src/WinLibs/freetype-2.3.5/objs/debug/ftmm.obj create mode 100644 src/WinLibs/freetype-2.3.5/objs/debug/ftpfr.obj create mode 100644 src/WinLibs/freetype-2.3.5/objs/debug/ftstroke.obj create mode 100644 src/WinLibs/freetype-2.3.5/objs/debug/ftsynth.obj create mode 100644 src/WinLibs/freetype-2.3.5/objs/debug/ftsystem.obj create mode 100644 src/WinLibs/freetype-2.3.5/objs/debug/fttype1.obj create mode 100644 src/WinLibs/freetype-2.3.5/objs/debug/ftwinfnt.obj create mode 100644 src/WinLibs/freetype-2.3.5/objs/debug/pcf.obj create mode 100644 src/WinLibs/freetype-2.3.5/objs/debug/pfr.obj create mode 100644 src/WinLibs/freetype-2.3.5/objs/debug/psaux.obj create mode 100644 src/WinLibs/freetype-2.3.5/objs/debug/pshinter.obj create mode 100644 src/WinLibs/freetype-2.3.5/objs/debug/psmodule.obj create mode 100644 src/WinLibs/freetype-2.3.5/objs/debug/raster.obj create mode 100644 src/WinLibs/freetype-2.3.5/objs/debug/sfnt.obj create mode 100644 src/WinLibs/freetype-2.3.5/objs/debug/smooth.obj create mode 100644 src/WinLibs/freetype-2.3.5/objs/debug/truetype.obj create mode 100644 src/WinLibs/freetype-2.3.5/objs/debug/type1.obj create mode 100644 src/WinLibs/freetype-2.3.5/objs/debug/type1cid.obj create mode 100644 src/WinLibs/freetype-2.3.5/objs/debug/type42.obj create mode 100644 src/WinLibs/freetype-2.3.5/objs/debug/vc80.idb create mode 100644 src/WinLibs/freetype-2.3.5/objs/debug/vc80.pdb create mode 100644 src/WinLibs/freetype-2.3.5/objs/debug/winfnt.obj create mode 100644 src/WinLibs/freetype-2.3.5/objs/freetype235_D.lib create mode 100644 src/WinLibs/freetype-2.3.5/objs/release/BuildLog.htm create mode 100644 src/WinLibs/freetype-2.3.5/src/Jamfile create mode 100644 src/WinLibs/freetype-2.3.5/src/autofit/Jamfile create mode 100644 src/WinLibs/freetype-2.3.5/src/autofit/afangles.c create mode 100644 src/WinLibs/freetype-2.3.5/src/autofit/afangles.h create mode 100644 src/WinLibs/freetype-2.3.5/src/autofit/afcjk.c create mode 100644 src/WinLibs/freetype-2.3.5/src/autofit/afcjk.h create mode 100644 src/WinLibs/freetype-2.3.5/src/autofit/afdummy.c create mode 100644 src/WinLibs/freetype-2.3.5/src/autofit/afdummy.h create mode 100644 src/WinLibs/freetype-2.3.5/src/autofit/aferrors.h create mode 100644 src/WinLibs/freetype-2.3.5/src/autofit/afglobal.c create mode 100644 src/WinLibs/freetype-2.3.5/src/autofit/afglobal.h create mode 100644 src/WinLibs/freetype-2.3.5/src/autofit/afhints.c create mode 100644 src/WinLibs/freetype-2.3.5/src/autofit/afhints.h create mode 100644 src/WinLibs/freetype-2.3.5/src/autofit/afindic.c create mode 100644 src/WinLibs/freetype-2.3.5/src/autofit/afindic.h create mode 100644 src/WinLibs/freetype-2.3.5/src/autofit/aflatin.c create mode 100644 src/WinLibs/freetype-2.3.5/src/autofit/aflatin.h create mode 100644 src/WinLibs/freetype-2.3.5/src/autofit/aflatin2.c create mode 100644 src/WinLibs/freetype-2.3.5/src/autofit/aflatin2.h create mode 100644 src/WinLibs/freetype-2.3.5/src/autofit/afloader.c create mode 100644 src/WinLibs/freetype-2.3.5/src/autofit/afloader.h create mode 100644 src/WinLibs/freetype-2.3.5/src/autofit/afmodule.c create mode 100644 src/WinLibs/freetype-2.3.5/src/autofit/afmodule.h create mode 100644 src/WinLibs/freetype-2.3.5/src/autofit/aftypes.h create mode 100644 src/WinLibs/freetype-2.3.5/src/autofit/afwarp.c create mode 100644 src/WinLibs/freetype-2.3.5/src/autofit/afwarp.h create mode 100644 src/WinLibs/freetype-2.3.5/src/autofit/autofit.c create mode 100644 src/WinLibs/freetype-2.3.5/src/autofit/module.mk create mode 100644 src/WinLibs/freetype-2.3.5/src/autofit/rules.mk create mode 100644 src/WinLibs/freetype-2.3.5/src/base/Jamfile create mode 100644 src/WinLibs/freetype-2.3.5/src/base/ftapi.c create mode 100644 src/WinLibs/freetype-2.3.5/src/base/ftbase.c create mode 100644 src/WinLibs/freetype-2.3.5/src/base/ftbbox.c create mode 100644 src/WinLibs/freetype-2.3.5/src/base/ftbdf.c create mode 100644 src/WinLibs/freetype-2.3.5/src/base/ftbitmap.c create mode 100644 src/WinLibs/freetype-2.3.5/src/base/ftcalc.c create mode 100644 src/WinLibs/freetype-2.3.5/src/base/ftdbgmem.c create mode 100644 src/WinLibs/freetype-2.3.5/src/base/ftdebug.c create mode 100644 src/WinLibs/freetype-2.3.5/src/base/ftgasp.c create mode 100644 src/WinLibs/freetype-2.3.5/src/base/ftgloadr.c create mode 100644 src/WinLibs/freetype-2.3.5/src/base/ftglyph.c create mode 100644 src/WinLibs/freetype-2.3.5/src/base/ftgxval.c create mode 100644 src/WinLibs/freetype-2.3.5/src/base/ftinit.c create mode 100644 src/WinLibs/freetype-2.3.5/src/base/ftlcdfil.c create mode 100644 src/WinLibs/freetype-2.3.5/src/base/ftmac.c create mode 100644 src/WinLibs/freetype-2.3.5/src/base/ftmm.c create mode 100644 src/WinLibs/freetype-2.3.5/src/base/ftnames.c create mode 100644 src/WinLibs/freetype-2.3.5/src/base/ftobjs.c create mode 100644 src/WinLibs/freetype-2.3.5/src/base/ftotval.c create mode 100644 src/WinLibs/freetype-2.3.5/src/base/ftoutln.c create mode 100644 src/WinLibs/freetype-2.3.5/src/base/ftpatent.c create mode 100644 src/WinLibs/freetype-2.3.5/src/base/ftpfr.c create mode 100644 src/WinLibs/freetype-2.3.5/src/base/ftrfork.c create mode 100644 src/WinLibs/freetype-2.3.5/src/base/ftstream.c create mode 100644 src/WinLibs/freetype-2.3.5/src/base/ftstroke.c create mode 100644 src/WinLibs/freetype-2.3.5/src/base/ftsynth.c create mode 100644 src/WinLibs/freetype-2.3.5/src/base/ftsystem.c create mode 100644 src/WinLibs/freetype-2.3.5/src/base/fttrigon.c create mode 100644 src/WinLibs/freetype-2.3.5/src/base/fttype1.c create mode 100644 src/WinLibs/freetype-2.3.5/src/base/ftutil.c create mode 100644 src/WinLibs/freetype-2.3.5/src/base/ftwinfnt.c create mode 100644 src/WinLibs/freetype-2.3.5/src/base/ftxf86.c create mode 100644 src/WinLibs/freetype-2.3.5/src/base/rules.mk create mode 100644 src/WinLibs/freetype-2.3.5/src/bdf/Jamfile create mode 100644 src/WinLibs/freetype-2.3.5/src/bdf/README create mode 100644 src/WinLibs/freetype-2.3.5/src/bdf/bdf.c create mode 100644 src/WinLibs/freetype-2.3.5/src/bdf/bdf.h create mode 100644 src/WinLibs/freetype-2.3.5/src/bdf/bdfdrivr.c create mode 100644 src/WinLibs/freetype-2.3.5/src/bdf/bdfdrivr.h create mode 100644 src/WinLibs/freetype-2.3.5/src/bdf/bdferror.h create mode 100644 src/WinLibs/freetype-2.3.5/src/bdf/bdflib.c create mode 100644 src/WinLibs/freetype-2.3.5/src/bdf/module.mk create mode 100644 src/WinLibs/freetype-2.3.5/src/bdf/rules.mk create mode 100644 src/WinLibs/freetype-2.3.5/src/cache/Jamfile create mode 100644 src/WinLibs/freetype-2.3.5/src/cache/ftcache.c create mode 100644 src/WinLibs/freetype-2.3.5/src/cache/ftcbasic.c create mode 100644 src/WinLibs/freetype-2.3.5/src/cache/ftccache.c create mode 100644 src/WinLibs/freetype-2.3.5/src/cache/ftccache.h create mode 100644 src/WinLibs/freetype-2.3.5/src/cache/ftccback.h create mode 100644 src/WinLibs/freetype-2.3.5/src/cache/ftccmap.c create mode 100644 src/WinLibs/freetype-2.3.5/src/cache/ftcerror.h create mode 100644 src/WinLibs/freetype-2.3.5/src/cache/ftcglyph.c create mode 100644 src/WinLibs/freetype-2.3.5/src/cache/ftcglyph.h create mode 100644 src/WinLibs/freetype-2.3.5/src/cache/ftcimage.c create mode 100644 src/WinLibs/freetype-2.3.5/src/cache/ftcimage.h create mode 100644 src/WinLibs/freetype-2.3.5/src/cache/ftcmanag.c create mode 100644 src/WinLibs/freetype-2.3.5/src/cache/ftcmanag.h create mode 100644 src/WinLibs/freetype-2.3.5/src/cache/ftcmru.c create mode 100644 src/WinLibs/freetype-2.3.5/src/cache/ftcmru.h create mode 100644 src/WinLibs/freetype-2.3.5/src/cache/ftcsbits.c create mode 100644 src/WinLibs/freetype-2.3.5/src/cache/ftcsbits.h create mode 100644 src/WinLibs/freetype-2.3.5/src/cache/rules.mk create mode 100644 src/WinLibs/freetype-2.3.5/src/cff/Jamfile create mode 100644 src/WinLibs/freetype-2.3.5/src/cff/cff.c create mode 100644 src/WinLibs/freetype-2.3.5/src/cff/cffcmap.c create mode 100644 src/WinLibs/freetype-2.3.5/src/cff/cffcmap.h create mode 100644 src/WinLibs/freetype-2.3.5/src/cff/cffdrivr.c create mode 100644 src/WinLibs/freetype-2.3.5/src/cff/cffdrivr.h create mode 100644 src/WinLibs/freetype-2.3.5/src/cff/cfferrs.h create mode 100644 src/WinLibs/freetype-2.3.5/src/cff/cffgload.c create mode 100644 src/WinLibs/freetype-2.3.5/src/cff/cffgload.h create mode 100644 src/WinLibs/freetype-2.3.5/src/cff/cffload.c create mode 100644 src/WinLibs/freetype-2.3.5/src/cff/cffload.h create mode 100644 src/WinLibs/freetype-2.3.5/src/cff/cffobjs.c create mode 100644 src/WinLibs/freetype-2.3.5/src/cff/cffobjs.h create mode 100644 src/WinLibs/freetype-2.3.5/src/cff/cffparse.c create mode 100644 src/WinLibs/freetype-2.3.5/src/cff/cffparse.h create mode 100644 src/WinLibs/freetype-2.3.5/src/cff/cfftoken.h create mode 100644 src/WinLibs/freetype-2.3.5/src/cff/cfftypes.h create mode 100644 src/WinLibs/freetype-2.3.5/src/cff/module.mk create mode 100644 src/WinLibs/freetype-2.3.5/src/cff/rules.mk create mode 100644 src/WinLibs/freetype-2.3.5/src/cid/Jamfile create mode 100644 src/WinLibs/freetype-2.3.5/src/cid/ciderrs.h create mode 100644 src/WinLibs/freetype-2.3.5/src/cid/cidgload.c create mode 100644 src/WinLibs/freetype-2.3.5/src/cid/cidgload.h create mode 100644 src/WinLibs/freetype-2.3.5/src/cid/cidload.c create mode 100644 src/WinLibs/freetype-2.3.5/src/cid/cidload.h create mode 100644 src/WinLibs/freetype-2.3.5/src/cid/cidobjs.c create mode 100644 src/WinLibs/freetype-2.3.5/src/cid/cidobjs.h create mode 100644 src/WinLibs/freetype-2.3.5/src/cid/cidparse.c create mode 100644 src/WinLibs/freetype-2.3.5/src/cid/cidparse.h create mode 100644 src/WinLibs/freetype-2.3.5/src/cid/cidriver.c create mode 100644 src/WinLibs/freetype-2.3.5/src/cid/cidriver.h create mode 100644 src/WinLibs/freetype-2.3.5/src/cid/cidtoken.h create mode 100644 src/WinLibs/freetype-2.3.5/src/cid/module.mk create mode 100644 src/WinLibs/freetype-2.3.5/src/cid/rules.mk create mode 100644 src/WinLibs/freetype-2.3.5/src/cid/type1cid.c create mode 100644 src/WinLibs/freetype-2.3.5/src/gxvalid/Jamfile create mode 100644 src/WinLibs/freetype-2.3.5/src/gxvalid/README create mode 100644 src/WinLibs/freetype-2.3.5/src/gxvalid/gxvalid.c create mode 100644 src/WinLibs/freetype-2.3.5/src/gxvalid/gxvalid.h create mode 100644 src/WinLibs/freetype-2.3.5/src/gxvalid/gxvbsln.c create mode 100644 src/WinLibs/freetype-2.3.5/src/gxvalid/gxvcommn.c create mode 100644 src/WinLibs/freetype-2.3.5/src/gxvalid/gxvcommn.h create mode 100644 src/WinLibs/freetype-2.3.5/src/gxvalid/gxverror.h create mode 100644 src/WinLibs/freetype-2.3.5/src/gxvalid/gxvfeat.c create mode 100644 src/WinLibs/freetype-2.3.5/src/gxvalid/gxvfeat.h create mode 100644 src/WinLibs/freetype-2.3.5/src/gxvalid/gxvfgen.c create mode 100644 src/WinLibs/freetype-2.3.5/src/gxvalid/gxvjust.c create mode 100644 src/WinLibs/freetype-2.3.5/src/gxvalid/gxvkern.c create mode 100644 src/WinLibs/freetype-2.3.5/src/gxvalid/gxvlcar.c create mode 100644 src/WinLibs/freetype-2.3.5/src/gxvalid/gxvmod.c create mode 100644 src/WinLibs/freetype-2.3.5/src/gxvalid/gxvmod.h create mode 100644 src/WinLibs/freetype-2.3.5/src/gxvalid/gxvmort.c create mode 100644 src/WinLibs/freetype-2.3.5/src/gxvalid/gxvmort.h create mode 100644 src/WinLibs/freetype-2.3.5/src/gxvalid/gxvmort0.c create mode 100644 src/WinLibs/freetype-2.3.5/src/gxvalid/gxvmort1.c create mode 100644 src/WinLibs/freetype-2.3.5/src/gxvalid/gxvmort2.c create mode 100644 src/WinLibs/freetype-2.3.5/src/gxvalid/gxvmort4.c create mode 100644 src/WinLibs/freetype-2.3.5/src/gxvalid/gxvmort5.c create mode 100644 src/WinLibs/freetype-2.3.5/src/gxvalid/gxvmorx.c create mode 100644 src/WinLibs/freetype-2.3.5/src/gxvalid/gxvmorx.h create mode 100644 src/WinLibs/freetype-2.3.5/src/gxvalid/gxvmorx0.c create mode 100644 src/WinLibs/freetype-2.3.5/src/gxvalid/gxvmorx1.c create mode 100644 src/WinLibs/freetype-2.3.5/src/gxvalid/gxvmorx2.c create mode 100644 src/WinLibs/freetype-2.3.5/src/gxvalid/gxvmorx4.c create mode 100644 src/WinLibs/freetype-2.3.5/src/gxvalid/gxvmorx5.c create mode 100644 src/WinLibs/freetype-2.3.5/src/gxvalid/gxvopbd.c create mode 100644 src/WinLibs/freetype-2.3.5/src/gxvalid/gxvprop.c create mode 100644 src/WinLibs/freetype-2.3.5/src/gxvalid/gxvtrak.c create mode 100644 src/WinLibs/freetype-2.3.5/src/gxvalid/module.mk create mode 100644 src/WinLibs/freetype-2.3.5/src/gxvalid/rules.mk create mode 100644 src/WinLibs/freetype-2.3.5/src/gzip/Jamfile create mode 100644 src/WinLibs/freetype-2.3.5/src/gzip/adler32.c create mode 100644 src/WinLibs/freetype-2.3.5/src/gzip/ftgzip.c create mode 100644 src/WinLibs/freetype-2.3.5/src/gzip/infblock.c create mode 100644 src/WinLibs/freetype-2.3.5/src/gzip/infblock.h create mode 100644 src/WinLibs/freetype-2.3.5/src/gzip/infcodes.c create mode 100644 src/WinLibs/freetype-2.3.5/src/gzip/infcodes.h create mode 100644 src/WinLibs/freetype-2.3.5/src/gzip/inffixed.h create mode 100644 src/WinLibs/freetype-2.3.5/src/gzip/inflate.c create mode 100644 src/WinLibs/freetype-2.3.5/src/gzip/inftrees.c create mode 100644 src/WinLibs/freetype-2.3.5/src/gzip/inftrees.h create mode 100644 src/WinLibs/freetype-2.3.5/src/gzip/infutil.c create mode 100644 src/WinLibs/freetype-2.3.5/src/gzip/infutil.h create mode 100644 src/WinLibs/freetype-2.3.5/src/gzip/rules.mk create mode 100644 src/WinLibs/freetype-2.3.5/src/gzip/zconf.h create mode 100644 src/WinLibs/freetype-2.3.5/src/gzip/zlib.h create mode 100644 src/WinLibs/freetype-2.3.5/src/gzip/zutil.c create mode 100644 src/WinLibs/freetype-2.3.5/src/gzip/zutil.h create mode 100644 src/WinLibs/freetype-2.3.5/src/lzw/Jamfile create mode 100644 src/WinLibs/freetype-2.3.5/src/lzw/ftlzw.c create mode 100644 src/WinLibs/freetype-2.3.5/src/lzw/ftzopen.c create mode 100644 src/WinLibs/freetype-2.3.5/src/lzw/ftzopen.h create mode 100644 src/WinLibs/freetype-2.3.5/src/lzw/rules.mk create mode 100644 src/WinLibs/freetype-2.3.5/src/otvalid/Jamfile create mode 100644 src/WinLibs/freetype-2.3.5/src/otvalid/module.mk create mode 100644 src/WinLibs/freetype-2.3.5/src/otvalid/otvalid.c create mode 100644 src/WinLibs/freetype-2.3.5/src/otvalid/otvalid.h create mode 100644 src/WinLibs/freetype-2.3.5/src/otvalid/otvbase.c create mode 100644 src/WinLibs/freetype-2.3.5/src/otvalid/otvcommn.c create mode 100644 src/WinLibs/freetype-2.3.5/src/otvalid/otvcommn.h create mode 100644 src/WinLibs/freetype-2.3.5/src/otvalid/otverror.h create mode 100644 src/WinLibs/freetype-2.3.5/src/otvalid/otvgdef.c create mode 100644 src/WinLibs/freetype-2.3.5/src/otvalid/otvgpos.c create mode 100644 src/WinLibs/freetype-2.3.5/src/otvalid/otvgpos.h create mode 100644 src/WinLibs/freetype-2.3.5/src/otvalid/otvgsub.c create mode 100644 src/WinLibs/freetype-2.3.5/src/otvalid/otvjstf.c create mode 100644 src/WinLibs/freetype-2.3.5/src/otvalid/otvmod.c create mode 100644 src/WinLibs/freetype-2.3.5/src/otvalid/otvmod.h create mode 100644 src/WinLibs/freetype-2.3.5/src/otvalid/rules.mk create mode 100644 src/WinLibs/freetype-2.3.5/src/pcf/Jamfile create mode 100644 src/WinLibs/freetype-2.3.5/src/pcf/README create mode 100644 src/WinLibs/freetype-2.3.5/src/pcf/module.mk create mode 100644 src/WinLibs/freetype-2.3.5/src/pcf/pcf.c create mode 100644 src/WinLibs/freetype-2.3.5/src/pcf/pcf.h create mode 100644 src/WinLibs/freetype-2.3.5/src/pcf/pcfdrivr.c create mode 100644 src/WinLibs/freetype-2.3.5/src/pcf/pcfdrivr.h create mode 100644 src/WinLibs/freetype-2.3.5/src/pcf/pcferror.h create mode 100644 src/WinLibs/freetype-2.3.5/src/pcf/pcfread.c create mode 100644 src/WinLibs/freetype-2.3.5/src/pcf/pcfread.h create mode 100644 src/WinLibs/freetype-2.3.5/src/pcf/pcfutil.c create mode 100644 src/WinLibs/freetype-2.3.5/src/pcf/pcfutil.h create mode 100644 src/WinLibs/freetype-2.3.5/src/pcf/rules.mk create mode 100644 src/WinLibs/freetype-2.3.5/src/pfr/Jamfile create mode 100644 src/WinLibs/freetype-2.3.5/src/pfr/module.mk create mode 100644 src/WinLibs/freetype-2.3.5/src/pfr/pfr.c create mode 100644 src/WinLibs/freetype-2.3.5/src/pfr/pfrcmap.c create mode 100644 src/WinLibs/freetype-2.3.5/src/pfr/pfrcmap.h create mode 100644 src/WinLibs/freetype-2.3.5/src/pfr/pfrdrivr.c create mode 100644 src/WinLibs/freetype-2.3.5/src/pfr/pfrdrivr.h create mode 100644 src/WinLibs/freetype-2.3.5/src/pfr/pfrerror.h create mode 100644 src/WinLibs/freetype-2.3.5/src/pfr/pfrgload.c create mode 100644 src/WinLibs/freetype-2.3.5/src/pfr/pfrgload.h create mode 100644 src/WinLibs/freetype-2.3.5/src/pfr/pfrload.c create mode 100644 src/WinLibs/freetype-2.3.5/src/pfr/pfrload.h create mode 100644 src/WinLibs/freetype-2.3.5/src/pfr/pfrobjs.c create mode 100644 src/WinLibs/freetype-2.3.5/src/pfr/pfrobjs.h create mode 100644 src/WinLibs/freetype-2.3.5/src/pfr/pfrsbit.c create mode 100644 src/WinLibs/freetype-2.3.5/src/pfr/pfrsbit.h create mode 100644 src/WinLibs/freetype-2.3.5/src/pfr/pfrtypes.h create mode 100644 src/WinLibs/freetype-2.3.5/src/pfr/rules.mk create mode 100644 src/WinLibs/freetype-2.3.5/src/psaux/Jamfile create mode 100644 src/WinLibs/freetype-2.3.5/src/psaux/afmparse.c create mode 100644 src/WinLibs/freetype-2.3.5/src/psaux/afmparse.h create mode 100644 src/WinLibs/freetype-2.3.5/src/psaux/module.mk create mode 100644 src/WinLibs/freetype-2.3.5/src/psaux/psaux.c create mode 100644 src/WinLibs/freetype-2.3.5/src/psaux/psauxerr.h create mode 100644 src/WinLibs/freetype-2.3.5/src/psaux/psauxmod.c create mode 100644 src/WinLibs/freetype-2.3.5/src/psaux/psauxmod.h create mode 100644 src/WinLibs/freetype-2.3.5/src/psaux/psconv.c create mode 100644 src/WinLibs/freetype-2.3.5/src/psaux/psconv.h create mode 100644 src/WinLibs/freetype-2.3.5/src/psaux/psobjs.c create mode 100644 src/WinLibs/freetype-2.3.5/src/psaux/psobjs.h create mode 100644 src/WinLibs/freetype-2.3.5/src/psaux/rules.mk create mode 100644 src/WinLibs/freetype-2.3.5/src/psaux/t1cmap.c create mode 100644 src/WinLibs/freetype-2.3.5/src/psaux/t1cmap.h create mode 100644 src/WinLibs/freetype-2.3.5/src/psaux/t1decode.c create mode 100644 src/WinLibs/freetype-2.3.5/src/psaux/t1decode.h create mode 100644 src/WinLibs/freetype-2.3.5/src/pshinter/Jamfile create mode 100644 src/WinLibs/freetype-2.3.5/src/pshinter/module.mk create mode 100644 src/WinLibs/freetype-2.3.5/src/pshinter/pshalgo.c create mode 100644 src/WinLibs/freetype-2.3.5/src/pshinter/pshalgo.h create mode 100644 src/WinLibs/freetype-2.3.5/src/pshinter/pshglob.c create mode 100644 src/WinLibs/freetype-2.3.5/src/pshinter/pshglob.h create mode 100644 src/WinLibs/freetype-2.3.5/src/pshinter/pshinter.c create mode 100644 src/WinLibs/freetype-2.3.5/src/pshinter/pshmod.c create mode 100644 src/WinLibs/freetype-2.3.5/src/pshinter/pshmod.h create mode 100644 src/WinLibs/freetype-2.3.5/src/pshinter/pshnterr.h create mode 100644 src/WinLibs/freetype-2.3.5/src/pshinter/pshrec.c create mode 100644 src/WinLibs/freetype-2.3.5/src/pshinter/pshrec.h create mode 100644 src/WinLibs/freetype-2.3.5/src/pshinter/rules.mk create mode 100644 src/WinLibs/freetype-2.3.5/src/psnames/Jamfile create mode 100644 src/WinLibs/freetype-2.3.5/src/psnames/module.mk create mode 100644 src/WinLibs/freetype-2.3.5/src/psnames/psmodule.c create mode 100644 src/WinLibs/freetype-2.3.5/src/psnames/psmodule.h create mode 100644 src/WinLibs/freetype-2.3.5/src/psnames/psnamerr.h create mode 100644 src/WinLibs/freetype-2.3.5/src/psnames/psnames.c create mode 100644 src/WinLibs/freetype-2.3.5/src/psnames/pstables.h create mode 100644 src/WinLibs/freetype-2.3.5/src/psnames/rules.mk create mode 100644 src/WinLibs/freetype-2.3.5/src/raster/Jamfile create mode 100644 src/WinLibs/freetype-2.3.5/src/raster/ftmisc.h create mode 100644 src/WinLibs/freetype-2.3.5/src/raster/ftraster.c create mode 100644 src/WinLibs/freetype-2.3.5/src/raster/ftraster.h create mode 100644 src/WinLibs/freetype-2.3.5/src/raster/ftrend1.c create mode 100644 src/WinLibs/freetype-2.3.5/src/raster/ftrend1.h create mode 100644 src/WinLibs/freetype-2.3.5/src/raster/module.mk create mode 100644 src/WinLibs/freetype-2.3.5/src/raster/raster.c create mode 100644 src/WinLibs/freetype-2.3.5/src/raster/rasterrs.h create mode 100644 src/WinLibs/freetype-2.3.5/src/raster/rules.mk create mode 100644 src/WinLibs/freetype-2.3.5/src/sfnt/Jamfile create mode 100644 src/WinLibs/freetype-2.3.5/src/sfnt/module.mk create mode 100644 src/WinLibs/freetype-2.3.5/src/sfnt/rules.mk create mode 100644 src/WinLibs/freetype-2.3.5/src/sfnt/sfdriver.c create mode 100644 src/WinLibs/freetype-2.3.5/src/sfnt/sfdriver.h create mode 100644 src/WinLibs/freetype-2.3.5/src/sfnt/sferrors.h create mode 100644 src/WinLibs/freetype-2.3.5/src/sfnt/sfnt.c create mode 100644 src/WinLibs/freetype-2.3.5/src/sfnt/sfobjs.c create mode 100644 src/WinLibs/freetype-2.3.5/src/sfnt/sfobjs.h create mode 100644 src/WinLibs/freetype-2.3.5/src/sfnt/ttbdf.c create mode 100644 src/WinLibs/freetype-2.3.5/src/sfnt/ttbdf.h create mode 100644 src/WinLibs/freetype-2.3.5/src/sfnt/ttcmap.c create mode 100644 src/WinLibs/freetype-2.3.5/src/sfnt/ttcmap.h create mode 100644 src/WinLibs/freetype-2.3.5/src/sfnt/ttkern.c create mode 100644 src/WinLibs/freetype-2.3.5/src/sfnt/ttkern.h create mode 100644 src/WinLibs/freetype-2.3.5/src/sfnt/ttload.c create mode 100644 src/WinLibs/freetype-2.3.5/src/sfnt/ttload.h create mode 100644 src/WinLibs/freetype-2.3.5/src/sfnt/ttmtx.c create mode 100644 src/WinLibs/freetype-2.3.5/src/sfnt/ttmtx.h create mode 100644 src/WinLibs/freetype-2.3.5/src/sfnt/ttpost.c create mode 100644 src/WinLibs/freetype-2.3.5/src/sfnt/ttpost.h create mode 100644 src/WinLibs/freetype-2.3.5/src/sfnt/ttsbit.c create mode 100644 src/WinLibs/freetype-2.3.5/src/sfnt/ttsbit.h create mode 100644 src/WinLibs/freetype-2.3.5/src/sfnt/ttsbit0.c create mode 100644 src/WinLibs/freetype-2.3.5/src/smooth/Jamfile create mode 100644 src/WinLibs/freetype-2.3.5/src/smooth/ftgrays.c create mode 100644 src/WinLibs/freetype-2.3.5/src/smooth/ftgrays.h create mode 100644 src/WinLibs/freetype-2.3.5/src/smooth/ftsmerrs.h create mode 100644 src/WinLibs/freetype-2.3.5/src/smooth/ftsmooth.c create mode 100644 src/WinLibs/freetype-2.3.5/src/smooth/ftsmooth.h create mode 100644 src/WinLibs/freetype-2.3.5/src/smooth/module.mk create mode 100644 src/WinLibs/freetype-2.3.5/src/smooth/rules.mk create mode 100644 src/WinLibs/freetype-2.3.5/src/smooth/smooth.c create mode 100644 src/WinLibs/freetype-2.3.5/src/tools/Jamfile create mode 100644 src/WinLibs/freetype-2.3.5/src/tools/apinames.c create mode 100644 src/WinLibs/freetype-2.3.5/src/tools/cordic.py create mode 100644 src/WinLibs/freetype-2.3.5/src/tools/docmaker/content.py create mode 100644 src/WinLibs/freetype-2.3.5/src/tools/docmaker/docbeauty.py create mode 100644 src/WinLibs/freetype-2.3.5/src/tools/docmaker/docmaker.py create mode 100644 src/WinLibs/freetype-2.3.5/src/tools/docmaker/formatter.py create mode 100644 src/WinLibs/freetype-2.3.5/src/tools/docmaker/sources.py create mode 100644 src/WinLibs/freetype-2.3.5/src/tools/docmaker/tohtml.py create mode 100644 src/WinLibs/freetype-2.3.5/src/tools/docmaker/utils.py create mode 100644 src/WinLibs/freetype-2.3.5/src/tools/ftrandom/Makefile create mode 100644 src/WinLibs/freetype-2.3.5/src/tools/ftrandom/README create mode 100644 src/WinLibs/freetype-2.3.5/src/tools/ftrandom/ftrandom.c create mode 100644 src/WinLibs/freetype-2.3.5/src/tools/glnames.py create mode 100644 src/WinLibs/freetype-2.3.5/src/tools/test_afm.c create mode 100644 src/WinLibs/freetype-2.3.5/src/tools/test_bbox.c create mode 100644 src/WinLibs/freetype-2.3.5/src/tools/test_trig.c create mode 100644 src/WinLibs/freetype-2.3.5/src/truetype/Jamfile create mode 100644 src/WinLibs/freetype-2.3.5/src/truetype/module.mk create mode 100644 src/WinLibs/freetype-2.3.5/src/truetype/rules.mk create mode 100644 src/WinLibs/freetype-2.3.5/src/truetype/truetype.c create mode 100644 src/WinLibs/freetype-2.3.5/src/truetype/ttdriver.c create mode 100644 src/WinLibs/freetype-2.3.5/src/truetype/ttdriver.h create mode 100644 src/WinLibs/freetype-2.3.5/src/truetype/tterrors.h create mode 100644 src/WinLibs/freetype-2.3.5/src/truetype/ttgload.c create mode 100644 src/WinLibs/freetype-2.3.5/src/truetype/ttgload.h create mode 100644 src/WinLibs/freetype-2.3.5/src/truetype/ttgxvar.c create mode 100644 src/WinLibs/freetype-2.3.5/src/truetype/ttgxvar.h create mode 100644 src/WinLibs/freetype-2.3.5/src/truetype/ttinterp.c create mode 100644 src/WinLibs/freetype-2.3.5/src/truetype/ttinterp.h create mode 100644 src/WinLibs/freetype-2.3.5/src/truetype/ttobjs.c create mode 100644 src/WinLibs/freetype-2.3.5/src/truetype/ttobjs.h create mode 100644 src/WinLibs/freetype-2.3.5/src/truetype/ttpload.c create mode 100644 src/WinLibs/freetype-2.3.5/src/truetype/ttpload.h create mode 100644 src/WinLibs/freetype-2.3.5/src/type1/Jamfile create mode 100644 src/WinLibs/freetype-2.3.5/src/type1/module.mk create mode 100644 src/WinLibs/freetype-2.3.5/src/type1/rules.mk create mode 100644 src/WinLibs/freetype-2.3.5/src/type1/t1afm.c create mode 100644 src/WinLibs/freetype-2.3.5/src/type1/t1afm.h create mode 100644 src/WinLibs/freetype-2.3.5/src/type1/t1driver.c create mode 100644 src/WinLibs/freetype-2.3.5/src/type1/t1driver.h create mode 100644 src/WinLibs/freetype-2.3.5/src/type1/t1errors.h create mode 100644 src/WinLibs/freetype-2.3.5/src/type1/t1gload.c create mode 100644 src/WinLibs/freetype-2.3.5/src/type1/t1gload.h create mode 100644 src/WinLibs/freetype-2.3.5/src/type1/t1load.c create mode 100644 src/WinLibs/freetype-2.3.5/src/type1/t1load.h create mode 100644 src/WinLibs/freetype-2.3.5/src/type1/t1objs.c create mode 100644 src/WinLibs/freetype-2.3.5/src/type1/t1objs.h create mode 100644 src/WinLibs/freetype-2.3.5/src/type1/t1parse.c create mode 100644 src/WinLibs/freetype-2.3.5/src/type1/t1parse.h create mode 100644 src/WinLibs/freetype-2.3.5/src/type1/t1tokens.h create mode 100644 src/WinLibs/freetype-2.3.5/src/type1/type1.c create mode 100644 src/WinLibs/freetype-2.3.5/src/type42/Jamfile create mode 100644 src/WinLibs/freetype-2.3.5/src/type42/module.mk create mode 100644 src/WinLibs/freetype-2.3.5/src/type42/rules.mk create mode 100644 src/WinLibs/freetype-2.3.5/src/type42/t42drivr.c create mode 100644 src/WinLibs/freetype-2.3.5/src/type42/t42drivr.h create mode 100644 src/WinLibs/freetype-2.3.5/src/type42/t42error.h create mode 100644 src/WinLibs/freetype-2.3.5/src/type42/t42objs.c create mode 100644 src/WinLibs/freetype-2.3.5/src/type42/t42objs.h create mode 100644 src/WinLibs/freetype-2.3.5/src/type42/t42parse.c create mode 100644 src/WinLibs/freetype-2.3.5/src/type42/t42parse.h create mode 100644 src/WinLibs/freetype-2.3.5/src/type42/t42types.h create mode 100644 src/WinLibs/freetype-2.3.5/src/type42/type42.c create mode 100644 src/WinLibs/freetype-2.3.5/src/winfonts/Jamfile create mode 100644 src/WinLibs/freetype-2.3.5/src/winfonts/fnterrs.h create mode 100644 src/WinLibs/freetype-2.3.5/src/winfonts/module.mk create mode 100644 src/WinLibs/freetype-2.3.5/src/winfonts/rules.mk create mode 100644 src/WinLibs/freetype-2.3.5/src/winfonts/winfnt.c create mode 100644 src/WinLibs/freetype-2.3.5/src/winfonts/winfnt.h create mode 100644 src/WinLibs/freetype-2.3.5/version.sed create mode 100644 src/WinLibs/freetype-2.3.5/vms_make.com diff --git a/src/WinLibs/FTGL/COPYING.txt b/src/WinLibs/FTGL/COPYING.txt new file mode 100644 index 000000000..92b8903ff --- /dev/null +++ b/src/WinLibs/FTGL/COPYING.txt @@ -0,0 +1,481 @@ + GNU LIBRARY GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 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 library GPL. It is + numbered 2 because it goes with version 2 of the ordinary GPL.] + + 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 Library General Public License, applies to some +specially designated Free Software Foundation software, and to any +other libraries whose authors decide to use it. You can use it for +your libraries, 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 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 a program 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. + + Our method of protecting your rights has two steps: (1) copyright +the library, and (2) offer you this license which gives you legal +permission to copy, distribute and/or modify the library. + + Also, for each distributor's protection, we want to make certain +that everyone understands that there is no warranty for this free +library. If the library is modified by someone else and passed on, we +want its recipients to know that what they have is not the original +version, 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 companies distributing free +software will individually obtain patent licenses, thus in effect +transforming the program into proprietary software. To prevent this, +we have made it clear that any patent must be licensed for everyone's +free use or not licensed at all. + + Most GNU software, including some libraries, is covered by the ordinary +GNU General Public License, which was designed for utility programs. This +license, the GNU Library General Public License, applies to certain +designated libraries. This license is quite different from the ordinary +one; be sure to read it in full, and don't assume that anything in it is +the same as in the ordinary license. + + The reason we have a separate public license for some libraries is that +they blur the distinction we usually make between modifying or adding to a +program and simply using it. Linking a program with a library, without +changing the library, is in some sense simply using the library, and is +analogous to running a utility program or application program. However, in +a textual and legal sense, the linked executable is a combined work, a +derivative of the original library, and the ordinary General Public License +treats it as such. + + Because of this blurred distinction, using the ordinary General +Public License for libraries did not effectively promote software +sharing, because most developers did not use the libraries. We +concluded that weaker conditions might promote sharing better. + + However, unrestricted linking of non-free programs would deprive the +users of those programs of all benefit from the free status of the +libraries themselves. This Library General Public License is intended to +permit developers of non-free programs to use free libraries, while +preserving your freedom as a user of such programs to change the free +libraries that are incorporated in them. (We have not seen how to achieve +this as regards changes in header files, but we have achieved it as regards +changes in the actual functions of the Library.) The hope is that this +will lead to faster development of free libraries. + + 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, while the latter only +works together with the library. + + Note that it is possible for a library to be covered by the ordinary +General Public License rather than by this special one. + + GNU LIBRARY GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library which +contains a notice placed by the copyright holder or other authorized +party saying it may be distributed under the terms of this Library +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 compile 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) 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. + + c) 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. + + d) 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 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. + + 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 to +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 Library 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 + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. 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 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 + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! diff --git a/src/WinLibs/FTGL/HISTORY.txt b/src/WinLibs/FTGL/HISTORY.txt new file mode 100644 index 000000000..838e5449b --- /dev/null +++ b/src/WinLibs/FTGL/HISTORY.txt @@ -0,0 +1,307 @@ +FTGL 2.1.2 (FTGL_2_1_2) +11 December 2004 + - Changed the way the colour is specified for Pixmap fonts. It can now be + done per string rather than at start up as previous. + - Fixed a couple of compilation errors caused by the new FTPoint stuff, + mostly... + - More const correctness. It's like a virus! + +5 December 2004 + 2.1.1 (FTGL_2_1_1) + - Added the xCode project properly this time. + +5 December 2004 + 2.1.0 (FTGL_2_1_0) + - Added texture co-ordinates to the geometry based font types. + - Added the ability to turn off (or on) glDisplayList creation inside FTGL. + - Removed unnecessary translates in the glyph rendering code. + - Moved the Mac project to XCode. + - Added a line height function to FTFont. + - Got rid of the GL_TEXTURE_2D_BINDING_EXT call and replaced it with a + static member. + - Fixed a bug where resizing FTGLTextureFont caused a GL error. + - Refactored FTPoint quite a bit. + - More unit tests. Fixed a heap of bugs. + +16 August 2004 + 2.0.11 (FTGL_2_0_11) + - Updated FTFont( *pBufferBytes, bufferSizeInBytes) documentation. + +16 August 2004 + 2.0.10 (FTGL_2_0_10) + - Fixed tab problem in unix Makefile. + - Added CYGWIN GLUTesselatorFunction define to FTVectoriser. + +21 April 2004 + 2.0.9 (FTGL_2_0_9) + - Fixed includes for pre 2.1.7 versions of freetype + - Changed unix build to create FTGL subdir for includes + +9 April 2004 + 2.0.8 (FTGL_2_0_8) + - Fixes for deprecated identifiers in 2.1.5 + - Changed the internals to use FTGlyphSlot instead of FTGlyph + - Added a unit test for FTBitmapGlyph, FTCharToGlyphIndexMap. + - Fixed a memory leak in FTGlyphContainer. + - Added the ability to get the list of charmaps in the font. + - Changed FTGLTextureFont to use FTVector for texture id list. + +31 August 2003 + 2.07 (FTGL_2_0_7) + - Minor fix for unix build scripts. + - Minor fix for unit tests. + +25 August 2003 + 2.06 (FTGL_2_0_6) + - Updated the unix build scripts. + +25 August 2003 + 2.05 (FTGL_2_0_5) + - Refactored FTGlyphContainer & FTCharmap. They now store FTGlyphs + sequentially rather than by glyph index. This should save a heap of + memory and a bit of time at startup. + - Changed the Mac font paths in the demos. + - Changed the unit tests for new hinter in Freetype 2.1.4. + - Added a test for broken contour tags. + +12 April 2003 + 2.04 (FTGL_2_0_4) + - Fixed resize behavior in FTGLTextureFont. + +9 April 2003 + 2.03 (FTGL_2_0_3) + - Fix in FTContour to handle broken contours. + +3 April 2003 + 2.02 (FTGL_2_0_2) + - Fixed memory leaks + +14 March 2003 + 2.01 (FTGL_2_0_1) + - Minor changes to autoconf to detect glu + +11 March 2003 + 2.0 (FTGL_2_0_0) + - Fixed some alignment bugs caused by changes to Freetype ( > 2.0.9). + - Minor fixes to float declarations. + - Moved FTBBox and FTPoint to their own files and added Move() and + operator += to FTBBox + - Replaced FT_Vector with FTPoint for kerning. + - Fixed the glPushAttrib calls. + - Changed gluTess callback def. + - Rewriting FTGLDemo. + - Minor fixes for irix. + - Removed a bunch of redundant members and made them function locals. + - Removed the Open() & Close() functions from FTFont because there was + no way to handle Close correctly which makes Open redundant. + - Removed Open() from FTface. + - Improved the robustness of some of the error handling. + - Removed the FTCharmap Platform/Encoding function. + - Added unit tests. + - Removed the precache flag. + - Unvirtualised functions in FTLibrary and FTGlyphContainer. + - Fixed empty string bug in FTFont::BBox. + - Refactored FTContour and moved it to it's own file. + - Removed unnecessary memory allocations in vector Glyphs. They now + access the vector data directly. + - Made vectoriser a local variable in vector glyphs. + - Fixed a long standing visual bug in FTVectoriser. + - Changed size calculations to use floats instead of ints. This includes + FTBBox. + - Refactored FTGlyph. Now calculates advance (as a float) and bbox. + - Changed contourList from FTVector to an array in FTVectoriser. + - Made function and member names more consistant. + - Moved header files to include directory. + - Mesh now uses a list for glCombine points. + - Delete the display lists. + - Unix AutoConf support. + - Attach 'files' from memory. + +October 23 2002 + 1.4 (FTGL_1_4) + - FTGL now requires 2.0.9 or later. See below for reason. + - Merged 1.32 branch with main tree + - Glyph loading has been optimised for pixel based glyphs. + - Removed mmgr + - Added FTFont::Attach + - Updated API docs + - Removed stl map and vector. Replaced by code supplied by Sebastien Barre + - Removed work around for Type1 height and width bug in freetype. It seems + to be fixed in 2.0.9 + - Added a test target to the Mac OSX project + - Inline some private functions. + +April 23 2002 + 1.32 (FTGL_1_3_2) + - Fixed enable state attribute in FTGLBitmapFont + - Wrapped tb.h & trackball.h in EXTERN "C" + - Renamed FTGLDemo to .cpp + Ellers... + - New MSVC projects updated to v1.3 + - Removed a lot of unnecessary Windows stuff from ftgl.h + - Added functions to load font from memory. + - Fixed a couple of Windows 'for' scope problems in FTExtrdGlyph + - FTGLDemo - Added #define for windows font + +January 30 2002 + 1.31 (FTGL_1_3_1) + - Forgot to update readme etc for 1.3 + +January 27 2002 + 1.3b5 (FTGL_1_3_BETA_5) + - FTBbox now uses float rather then int + - Fixed some more warnings (size_t) + - Removed the contour winding function because it didn't fix the problem!! + - Fixed up some state settings in fonts. + +December 11 2001 + 1.3b4 (FTGL_1_3_BETA_4) + - Added MAC OSX project (Project Builder) + - Added a function for extruded glyphs that calculates the winding order of + the glyph contour. + - Added FTGL_DEBUG to include memory debugger. + - Added a couple of typedefs to FTGL.h, mainly to aid debugging + - Cleaned up the includes. + +November 13 2001 + 1.3b3 (FTGL_1_3_BETA_3) + - Texture fonts now behave the same as the others and can be loaded on + demand. This made FTGLTextureFont MUCH simpler!!!! It has also improved + the grid fitting so less texture mem is needed. + - Refactored FTVectoriser... + This now builds contours and meshes internally and then passes the raw + point data onto the glyphs. The gluTess data is captured in an internal + non static data structure fixing a memory Leak in PolyGlyph (glCombine). + This has enabled... + - Extruded fonts. FTGLExtrdFont & FTExtrdGlyph. + - Reversed the winding for polyglyphs, extruded glyphs and texture glyphs to + make them CCW + - Bounding box function + - Fixed the != and == operators in ftPoint + - Un-virtualised some functions in FTFont + - Added a demo app to dist. + +November 9 2001 + 1.21 (FTGL_1_2_1) + - Visual Studio projects updated for .cpp source file extensions. + - A couple of windows 'cast' warnings have been fixed. + +November 6 2001 + 1.2 (FTGL_1_2_0) + - Glyphs can now be loaded on the fly instead of being pre-cached. If + FTFont::Open() is called with false, FTGlyphContainer will build a list of + null pointers. Then when ever a glyph needs to be access eg by + FTFont::advance or FTFont::render, it will be built and slotted into the + glyphlist in the correct position. + - Removed glext.h from FTGL.h and replaced it with a test for + GL_EXT_texture_object. + - Added padding to texture size calculations. + - Fixed a NASTY bug in FTGLTextureFont. Only came to light after changes to + the glyph preprocessing. + +October 31 2001 + 1.1 (FTGL_1_1_0) + - Renamed the source to .cpp + - Removed the static activeTextureID from FTTextureGlyph and replaced it + with a call to + glGetIntegerv( GL_TEXTURE_2D_BINDING_EXT, &activeTextureID); + - Added an include for glext.h in FTGL.h + - Tidied up the glbegin/glEnd pairs in FTTextureGlyph & FTGLTextureFont + - Fixed the problem with doc filenames. + - Tidied up some implicit type conversions. + - Fixed FTCharMap to ensure that a valid default charmap is always created + by the c_stor. + +October 26 2001 + 1.01 (FTGL_1_0_1) + - Removed the glEnable( GL_TEXTURE_2D) from FTGLTextureFont + - Removed the redundant tempGlyph members in the FTGLXXXXFont classes + - Made a change in FTGL.h to include correct headers for MAC OSX + - FTGL.h now includes glu.h + - Minor fixes to get rid of Project Builder warnings (MAC OSX) + - Fixed some of the docs + +October 24 2001 + 1.0 (FTGL_1_0_0) + - Version 1.0 release + +September 29 2001 + 1.0b7 (FTGL_1_0_BETA_7) + - Tesselation winding rules + - Fixed bug in FTContour Add point function + - Cleaned up disposal of FTCharmap in FTFace + - renamed FTVectorGlyph to FTOutlineGlyph + - New distribution structure + - Minor changes for windows (VC 6) + - Windows and Linux ports. + +September 20 2001 + 1.0b6 (FTGL_1_0_BETA_6) + - Implemented the new FTCharmap class. The performance improvement is + dramatic. + - Tidied up the way the freetype FT_Face object is disposed of by FTFont and + FTFace. This was a potential crash. + - FTVectorGlyph and FTPolyGlyph now disposes of the freetype glyph correctly + after initialsation. This was a potential crash. + - Preliminary support for unicode...wchar_t Tested with non european fonts. + - Added function to calc the advance width of a string. + - Minor tidy ups. + +August 29 2001 + 1.0b5 (FTGL_1_0_BETA_5) + - Settled on integers for FTSize stuff. NOTE the FTGlyph stuff is still up + in the air. + - Fixed the positional stuff. + - Added Java Doc comments. NOT COMPLETE + - Fixes for linux, mainly to clear warnings. + - changed the return type for FTFace::Glyph() from a reference to a pointer + so it can return NULL on failure. + - Related to above...better error handling and reporting in + FTGLXXXFont::MakeGlyphList() + - Fixed a bug in FTVectoriser that was ignoring non printing characters. + This meant that the pen wasn't advanced for spaces etc. It affected + polygon and outline font rendering. + - Minor tidy ups. + +August 21 2001 + 1.0b4 + - Changed the mode for FT_Load_Glyph to FT_LOAD_NO_HINTING | + FT_LOAD_NO_BITMAP for outline and polygon fonts & FT_LOAD_NO_HINTING for + texture fonts. Seems to produce better looking glyphs. + - FTGLTextureFont can now use multiple textures to render glyphs if they + don't fit within one GL_MAX_TEXTURE_SIZE texture. + - Changed FTSize to use bbox for global width and height. Needs more work + (eg float or int?) and need to check inconsistancies in freetype. + - Being more strict with types eg integer indices and sizes are now + unsigned. + +August 8 2001 + 1.0b3 (FTGL_1_0_BETA_3) + - I've made fundamental change to the way the glyphlist is built. This is to + get round the problems I was having with charmaps. At this stage it is a + temporary solution. Previously the glyphList was indexed by char code. Now + it's indexed by glyph index and the conversion is done by the freetype + function FT_Get_Char_Index(). If this proves to be too slow I'll make my + own charmap and use it to index into the glyphlist. This has fixed all the + charmap related problems/bugs. + - Enabled alpha blend in Pixmap font. + - Enabled LINE_SMOOTH in Outline font + - Fixed bug that prevented the display of chars >127 + - Moved pixel store stuff out of BitmapGlyph into BitmapFont. + - Minor changes for IRIX (compiles but isn't tested) + - Pixmap fonts can now be in colour. It uses the current colour when the + font is CREATED. This isn't ideal but is better than the alternatives. + - Tidied up the error handling. + - Minor code clean ups. + +August 6 2001 + BETA release 1.0b2 (FTGL_1_0_BETA_2) + - Minor tidy ups for first public release. + +August 3 2001 + First BETA release 1.0b1 (FTGL_1_0_BETA_1) + - All font types are now working, Bitmaps, Pixmaps, Texture, Outline and + Polygons. Quality of output and performance varies wildly:) + +July 22 2001 + First ALPHA Release 1.0a1 diff --git a/src/WinLibs/FTGL/README.txt b/src/WinLibs/FTGL/README.txt new file mode 100644 index 000000000..6802941e0 --- /dev/null +++ b/src/WinLibs/FTGL/README.txt @@ -0,0 +1,51 @@ +FTGL 2.1 +5 December 2004 + +DESCRIPTION: + +FTGL is a free open source library to enable developers to use arbitrary +fonts in their OpenGL (www.opengl.org) applications. +Unlike other OpenGL font libraries FTGL uses standard font file formats +so doesn't need a preprocessing step to convert the high quality font data +into a lesser quality, proprietary format. +FTGL uses the Freetype (www.freetype.org) font library to open and 'decode' +the fonts. It then takes that output and stores it in a format most efficient +for OpenGL rendering. + +Rendering modes supported are +- Bit maps +- Antialiased Pix maps +- Texture maps +- Outlines +- Polygon meshes +- Extruded polygon meshes + +FTGL is designed to be used in commercial quality software. It has been +written with performance, robustness and simplicity in mind. + +USAGE: + + FTGLPixmapFont font( "Fonts:Arial"); + + font.FaceSize( 72); + + font.render( "Hello World!"); + +This library was inspired by gltt, Copyright (C) 1998-1999 Stephane Rehel +(http://gltt.sourceforge.net) +Bezier curve code contributed by Jed Soane. +Demo, Linux port, extrusion code and gltt maintainance by Gerard Lanois. +Linux port by Matthias Kretz. +Windows port by Andrew Ellerton & Max Rheiner. +Bug fixes by Robert Osfield, Marcelo E. Magallon, Markku Rontu, Mark A. Fox, +Patrick Rogers, Kai Huettemann. +Containers and optimisations by Sebastien Barre. +Autoconf Marcelo E. Magallon. +Pixmap font modifications by Robert Bell. + +Please contact me if you have any suggestions, feature requests, or problems. + +Henry Maddocks +ftgl@opengl.geek.nz +http://homepages.paradise.net.nz/henryj/ + diff --git a/src/WinLibs/FTGL/cleanup b/src/WinLibs/FTGL/cleanup new file mode 100644 index 000000000..c6d24edb2 --- /dev/null +++ b/src/WinLibs/FTGL/cleanup @@ -0,0 +1,4 @@ +#!/bin/sh -fx +# script to get rid of the grabage that MAC OSX drops in all the directories + +find . -name .DS_Store -print -exec rm {} \; diff --git a/src/WinLibs/FTGL/demo/FTGLDemo.cpp b/src/WinLibs/FTGL/demo/FTGLDemo.cpp new file mode 100644 index 000000000..908366f3c --- /dev/null +++ b/src/WinLibs/FTGL/demo/FTGLDemo.cpp @@ -0,0 +1,498 @@ +#ifdef __APPLE_CC__ + #include +#else + #include +#endif + +#include +#include + +#include "tb.h" + +#include "FTGLExtrdFont.h" +#include "FTGLOutlineFont.h" +#include "FTGLPolygonFont.h" +#include "FTGLTextureFont.h" +#include "FTGLPixmapFont.h" +#include "FTGLBitmapFont.h" + +// YOU'LL PROBABLY WANT TO CHANGE THESE +#ifdef __linux__ + #define FONT_FILE "/usr/share/fonts/truetype/arial.ttf" +#endif +#ifdef __APPLE_CC__ + #define FONT_FILE "/Users/henry/Development/PROJECTS/FTGL/test/font_pack/arial.ttf" +#endif +#ifdef WIN32 + #define FONT_FILE "C:\\WINNT\\Fonts\\arial.ttf" +#endif +#ifndef FONT_FILE + #define FONT_FILE 0 +#endif + +#define EDITING 1 +#define INTERACTIVE 2 + +#define FTGL_BITMAP 0 +#define FTGL_PIXMAP 1 +#define FTGL_OUTLINE 2 +#define FTGL_POLYGON 3 +#define FTGL_EXTRUDE 4 +#define FTGL_TEXTURE 5 + +char* fontfile = FONT_FILE; +int current_font = FTGL_EXTRUDE; + +GLint w_win = 640, h_win = 480; +int mode = INTERACTIVE; +int carat = 0; + +//wchar_t myString[16] = { 0x6FB3, 0x9580}; +wchar_t myString[16]; + +static FTFont* fonts[6]; +static FTGLPixmapFont* infoFont; + +static float texture[] = { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 1.0, 1.0, 1.0, 1.0, 1.0, 1.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.0, 1.0, 1.0, 1.0, 1.0, 1.0, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0}; + +static GLuint textureID; + +void SetCamera(void); + +void setUpLighting() +{ + // Set up lighting. + float light1_ambient[4] = { 1.0, 1.0, 1.0, 1.0 }; + float light1_diffuse[4] = { 1.0, 0.9, 0.9, 1.0 }; + float light1_specular[4] = { 1.0, 0.7, 0.7, 1.0 }; + float light1_position[4] = { -1.0, 1.0, 1.0, 0.0 }; + glLightfv(GL_LIGHT1, GL_AMBIENT, light1_ambient); + glLightfv(GL_LIGHT1, GL_DIFFUSE, light1_diffuse); + glLightfv(GL_LIGHT1, GL_SPECULAR, light1_specular); + glLightfv(GL_LIGHT1, GL_POSITION, light1_position); + glEnable(GL_LIGHT1); + + float light2_ambient[4] = { 0.2, 0.2, 0.2, 1.0 }; + float light2_diffuse[4] = { 0.9, 0.9, 0.9, 1.0 }; + float light2_specular[4] = { 0.7, 0.7, 0.7, 1.0 }; + float light2_position[4] = { 1.0, -1.0, -1.0, 0.0 }; + glLightfv(GL_LIGHT2, GL_AMBIENT, light2_ambient); + glLightfv(GL_LIGHT2, GL_DIFFUSE, light2_diffuse); + glLightfv(GL_LIGHT2, GL_SPECULAR, light2_specular); + glLightfv(GL_LIGHT2, GL_POSITION, light2_position); +// glEnable(GL_LIGHT2); + + float front_emission[4] = { 0.3, 0.2, 0.1, 0.0 }; + float front_ambient[4] = { 0.2, 0.2, 0.2, 0.0 }; + float front_diffuse[4] = { 0.95, 0.95, 0.8, 0.0 }; + float front_specular[4] = { 0.6, 0.6, 0.6, 0.0 }; + glMaterialfv(GL_FRONT, GL_EMISSION, front_emission); + glMaterialfv(GL_FRONT, GL_AMBIENT, front_ambient); + glMaterialfv(GL_FRONT, GL_DIFFUSE, front_diffuse); + glMaterialfv(GL_FRONT, GL_SPECULAR, front_specular); + glMaterialf(GL_FRONT, GL_SHININESS, 16.0); + glColor4fv(front_diffuse); + + glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_FALSE); + glColorMaterial(GL_FRONT, GL_DIFFUSE); + glEnable(GL_COLOR_MATERIAL); + + glEnable(GL_LIGHTING); +} + + +void setUpFonts( const char* fontfile) +{ + fonts[FTGL_BITMAP] = new FTGLBitmapFont( fontfile); + fonts[FTGL_PIXMAP] = new FTGLPixmapFont( fontfile); + fonts[FTGL_OUTLINE] = new FTGLOutlineFont( fontfile); + fonts[FTGL_POLYGON] = new FTGLPolygonFont( fontfile); + fonts[FTGL_EXTRUDE] = new FTGLExtrdFont( fontfile); + fonts[FTGL_TEXTURE] = new FTGLTextureFont( fontfile); + + for( int x = 0; x < 6; ++x) + { + if( fonts[x]->Error()) + { + fprintf( stderr, "Failed to open font %s", fontfile); + exit(1); + } + + if( !fonts[x]->FaceSize( 144)) + { + fprintf( stderr, "Failed to set size"); + exit(1); + } + + fonts[x]->Depth(20); + + fonts[x]->CharMap(ft_encoding_unicode); + } + + infoFont = new FTGLPixmapFont( fontfile); + + if( infoFont->Error()) + { + fprintf( stderr, "Failed to open font %s", fontfile); + exit(1); + } + + infoFont->FaceSize( 18); + + myString[0] = 65; + myString[1] = 0; +} + + +void renderFontmetrics() +{ + float x1, y1, z1, x2, y2, z2; + fonts[current_font]->BBox( myString, x1, y1, z1, x2, y2, z2); + + // Draw the bounding box + glDisable( GL_LIGHTING); + glDisable( GL_TEXTURE_2D); + glEnable( GL_LINE_SMOOTH); + glEnable(GL_BLEND); + glBlendFunc( GL_SRC_ALPHA, GL_ONE); // GL_ONE_MINUS_SRC_ALPHA + + glColor3f( 0.0, 1.0, 0.0); + // Draw the front face + glBegin( GL_LINE_LOOP); + glVertex3f( x1, y1, z1); + glVertex3f( x1, y2, z1); + glVertex3f( x2, y2, z1); + glVertex3f( x2, y1, z1); + glEnd(); + // Draw the back face + if( current_font == FTGL_EXTRUDE && z1 != z2) + { + glBegin( GL_LINE_LOOP); + glVertex3f( x1, y1, z2); + glVertex3f( x1, y2, z2); + glVertex3f( x2, y2, z2); + glVertex3f( x2, y1, z2); + glEnd(); + // Join the faces + glBegin( GL_LINES); + glVertex3f( x1, y1, z1); + glVertex3f( x1, y1, z2); + + glVertex3f( x1, y2, z1); + glVertex3f( x1, y2, z2); + + glVertex3f( x2, y2, z1); + glVertex3f( x2, y2, z2); + + glVertex3f( x2, y1, z1); + glVertex3f( x2, y1, z2); + glEnd(); + } + + // Draw the baseline, Ascender and Descender + glBegin( GL_LINES); + glColor3f( 0.0, 0.0, 1.0); + glVertex3f( 0.0, 0.0, 0.0); + glVertex3f( fonts[current_font]->Advance( myString), 0.0, 0.0); + glVertex3f( 0.0, fonts[current_font]->Ascender(), 0.0); + glVertex3f( 0.0, fonts[current_font]->Descender(), 0.0); + + glEnd(); + + // Draw the origin + glColor3f( 1.0, 0.0, 0.0); + glPointSize( 5.0); + glBegin( GL_POINTS); + glVertex3f( 0.0, 0.0, 0.0); + glEnd(); +} + + +void renderFontInfo() +{ + glMatrixMode( GL_PROJECTION); + glLoadIdentity(); + gluOrtho2D(0, w_win, 0, h_win); + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + + // draw mode + glColor3f( 1.0, 1.0, 1.0); + glRasterPos2f( 20.0f , h_win - ( 20.0f + infoFont->Ascender())); + + switch( mode) + { + case EDITING: + infoFont->Render("Edit Mode"); + break; + case INTERACTIVE: + break; + } + + // draw font type + glRasterPos2i( 20 , 20); + switch( current_font) + { + case FTGL_BITMAP: + infoFont->Render("Bitmap Font"); + break; + case FTGL_PIXMAP: + infoFont->Render("Pixmap Font"); + break; + case FTGL_OUTLINE: + infoFont->Render("Outline Font"); + break; + case FTGL_POLYGON: + infoFont->Render("Polygon Font"); + break; + case FTGL_EXTRUDE: + infoFont->Render("Extruded Font"); + break; + case FTGL_TEXTURE: + infoFont->Render("Texture Font"); + break; + } + + glRasterPos2f( 20.0f , 20.0f + infoFont->LineHeight()); + infoFont->Render(fontfile); +} + + +void do_display (void) +{ + switch( current_font) + { + case FTGL_BITMAP: + case FTGL_PIXMAP: + case FTGL_OUTLINE: + break; + case FTGL_POLYGON: + glEnable( GL_TEXTURE_2D); + glBindTexture(GL_TEXTURE_2D, textureID); + glDisable( GL_BLEND); + setUpLighting(); + break; + case FTGL_EXTRUDE: + glEnable( GL_DEPTH_TEST); + glDisable( GL_BLEND); + glEnable( GL_TEXTURE_2D); + glBindTexture(GL_TEXTURE_2D, textureID); + setUpLighting(); + break; + case FTGL_TEXTURE: + glEnable( GL_TEXTURE_2D); + glDisable( GL_DEPTH_TEST); + setUpLighting(); + glNormal3f( 0.0, 0.0, 1.0); + break; + + } + + glColor3f( 1.0, 1.0, 1.0); +// If you do want to switch the color of bitmaps rendered with glBitmap, +// you will need to explicitly call glRasterPos3f (or its ilk) to lock +// in a changed current color. + + glPushMatrix(); + fonts[current_font]->Render( myString); + glPopMatrix(); + + glPushMatrix(); + renderFontmetrics(); + glPopMatrix(); + + renderFontInfo(); +} + + +void display(void) +{ + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + SetCamera(); + + switch( current_font) + { + case FTGL_BITMAP: + case FTGL_PIXMAP: + glRasterPos2i( w_win / 2, h_win / 2); + glTranslatef( w_win / 2, h_win / 2, 0.0); + break; + case FTGL_OUTLINE: + case FTGL_POLYGON: + case FTGL_EXTRUDE: + case FTGL_TEXTURE: + tbMatrix(); + break; + } + + glPushMatrix(); + + do_display(); + + glPopMatrix(); + + glutSwapBuffers(); +} + + +void myinit( const char* fontfile) +{ + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + glClearColor( 0.13, 0.17, 0.32, 0.0); + glColor3f( 1.0, 1.0, 1.0); + + glEnable( GL_CULL_FACE); + glFrontFace( GL_CCW); + + glEnable( GL_DEPTH_TEST); + glEnable(GL_CULL_FACE); + glShadeModel(GL_SMOOTH); + + glEnable( GL_POLYGON_OFFSET_LINE); + glPolygonOffset( 1.0, 1.0); // ???? + + SetCamera(); + + tbInit(GLUT_LEFT_BUTTON); + tbAnimate( GL_FALSE); + + setUpFonts( fontfile); + + glGenTextures(1, &textureID); + glBindTexture(GL_TEXTURE_2D, textureID); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 4, 4, 0, GL_RGB, GL_FLOAT, texture); + + +} + + +void parsekey(unsigned char key, int x, int y) +{ + switch (key) + { + case 27: exit(0); break; + case 13: + if( mode == EDITING) + { + mode = INTERACTIVE; + } + else + { + mode = EDITING; + carat = 0; + } + break; + case ' ': + current_font++; + if(current_font > 5) + current_font = 0; + break; + default: + if( mode == INTERACTIVE) + { + myString[0] = key; + myString[1] = 0; + break; + } + else + { + myString[carat] = key; + myString[carat + 1] = 0; + carat = carat > 14 ? 14 : ++carat; + } + } + + glutPostRedisplay(); + +} + + +void motion(int x, int y) +{ + tbMotion( x, y); +} + +void mouse(int button, int state, int x, int y) +{ + tbMouse( button, state, x, y); +} + +void myReshape(int w, int h) +{ + glMatrixMode (GL_MODELVIEW); + glViewport (0, 0, w, h); + glLoadIdentity(); + + w_win = w; + h_win = h; + SetCamera(); + + tbReshape(w_win, h_win); +} + +void SetCamera(void) +{ + switch( current_font) + { + case FTGL_BITMAP: + case FTGL_PIXMAP: + glMatrixMode( GL_PROJECTION); + glLoadIdentity(); + gluOrtho2D(0, w_win, 0, h_win); + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + break; + case FTGL_OUTLINE: + case FTGL_POLYGON: + case FTGL_EXTRUDE: + case FTGL_TEXTURE: + glMatrixMode (GL_PROJECTION); + glLoadIdentity (); + gluPerspective( 90, (float)w_win / (float)h_win, 1, 1000); + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + gluLookAt( 0.0, 0.0, (float)h_win / 2.0f, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); + break; + } +} + + +int main(int argc, char *argv[]) +{ +#ifndef __APPLE_CC__ // Bloody finder args??? + if (argc == 2) + fontfile = argv[1]; +#endif + + if (!fontfile) + { + fprintf(stderr, "A font file must be specified on the command line\n"); + exit(1); + } + + glutInit( &argc, argv); + glutInitDisplayMode(GLUT_DEPTH | GLUT_RGB | GLUT_DOUBLE | GLUT_MULTISAMPLE); + glutInitWindowPosition(50, 50); + glutInitWindowSize( w_win, h_win); + glutCreateWindow("FTGL TEST"); + glutDisplayFunc(display); + glutKeyboardFunc(parsekey); + glutMouseFunc(mouse); + glutMotionFunc(motion); + glutReshapeFunc(myReshape); + glutIdleFunc(display); + + myinit( fontfile); + + glutMainLoop(); + + return 0; +} diff --git a/src/WinLibs/FTGL/demo/README.txt b/src/WinLibs/FTGL/demo/README.txt new file mode 100644 index 000000000..4f3da7124 --- /dev/null +++ b/src/WinLibs/FTGL/demo/README.txt @@ -0,0 +1,15 @@ +FTGL Version 2.0 Demo + +This demo demonstrates the different rendering styles available with FTGL. +Press to change the font rendering style. +Press to enable edit mode. + +When compiling you will need to check the paths to the font files as they are +hard coded. See #define FONT_FILE and #define FONT_INFO in FTGLDemo.c + + +Please contact me if you have any suggestions, feature requests, or problems. + +Henry Maddocks +henryj@paradise.net.nz +http://homepages.paradise.net.nz/henryj/ diff --git a/src/WinLibs/FTGL/demo/tb.c b/src/WinLibs/FTGL/demo/tb.c new file mode 100644 index 000000000..7c4ad8eac --- /dev/null +++ b/src/WinLibs/FTGL/demo/tb.c @@ -0,0 +1,127 @@ +/* + * Simple trackball-like motion adapted (ripped off) from projtex.c + * (written by David Yu and David Blythe). See the SIGGRAPH '96 + * Advanced OpenGL course notes. + */ + + +/* includes */ +#include +#include +#ifdef __APPLE_CC__ + #include +#else + #include +#endif +#include "tb.h" +#include "trackball.h" + +/* globals */ +static GLuint tb_lasttime; + +float curquat[4]; +float lastquat[4]; +int beginx, beginy; + +static GLuint tb_width; +static GLuint tb_height; + +static GLint tb_button = -1; +static GLboolean tb_tracking = GL_FALSE; +static GLboolean tb_animate = GL_TRUE; + +static void +_tbAnimate(void) +{ + add_quats(lastquat, curquat, curquat); + glutPostRedisplay(); +} + +void +_tbStartMotion(int x, int y, int time) +{ + assert(tb_button != -1); + + glutIdleFunc(0); + tb_tracking = GL_TRUE; + tb_lasttime = time; + beginx = x; + beginy = y; +} + +void +_tbStopMotion(unsigned time) +{ + assert(tb_button != -1); + + tb_tracking = GL_FALSE; + + if (time == tb_lasttime && tb_animate) { + glutIdleFunc(_tbAnimate); + } else { + if (tb_animate) { + glutIdleFunc(0); + } + } +} + +void +tbAnimate(GLboolean animate) +{ + tb_animate = animate; +} + +void +tbInit(GLuint button) +{ + tb_button = button; + trackball(curquat, 0.0, 0.0, 0.0, 0.0); +} + +void +tbMatrix(void) +{ + GLfloat m[4][4]; + + assert(tb_button != -1); + build_rotmatrix(m, curquat); + glMultMatrixf(&m[0][0]); +} + +void +tbReshape(int width, int height) +{ + assert(tb_button != -1); + + tb_width = width; + tb_height = height; +} + +void +tbMouse(int button, int state, int x, int y) +{ + assert(tb_button != -1); + + if (state == GLUT_DOWN && button == tb_button) + _tbStartMotion(x, y, glutGet(GLUT_ELAPSED_TIME)); + else if (state == GLUT_UP && button == tb_button) + _tbStopMotion(glutGet(GLUT_ELAPSED_TIME)); +} + +void +tbMotion(int x, int y) +{ + if (tb_tracking) { + trackball(lastquat, + (2.0 * beginx - tb_width) / tb_width, + (tb_height - 2.0 * beginy) / tb_height, + (2.0 * x - tb_width) / tb_width, + (tb_height - 2.0 * y) / tb_height + ); + beginx = x; + beginy = y; + tb_animate = 1; + tb_lasttime = glutGet(GLUT_ELAPSED_TIME); + _tbAnimate(); + } +} diff --git a/src/WinLibs/FTGL/demo/tb.h b/src/WinLibs/FTGL/demo/tb.h new file mode 100644 index 000000000..3ac0ea81c --- /dev/null +++ b/src/WinLibs/FTGL/demo/tb.h @@ -0,0 +1,103 @@ +/* + * Simple trackball-like motion adapted (ripped off) from projtex.c + * (written by David Yu and David Blythe). See the SIGGRAPH '96 + * Advanced OpenGL course notes. + * + * + * Usage: + * + * o call tbInit() in before any other tb call + * o call tbReshape() from the reshape callback + * o call tbMatrix() to get the trackball matrix rotation + * o call tbStartMotion() to begin trackball movememt + * o call tbStopMotion() to stop trackball movememt + * o call tbMotion() from the motion callback + * o call tbAnimate(GL_TRUE) if you want the trackball to continue + * spinning after the mouse button has been released + * o call tbAnimate(GL_FALSE) if you want the trackball to stop + * spinning after the mouse button has been released + * + * Typical setup: + * + * + void + init(void) + { + tbInit(GLUT_MIDDLE_BUTTON); + tbAnimate(GL_TRUE); + . . . + } + + void + reshape(int width, int height) + { + tbReshape(width, height); + . . . + } + + void + display(void) + { + glPushMatrix(); + + tbMatrix(); + . . . draw the scene . . . + + glPopMatrix(); + } + + void + mouse(int button, int state, int x, int y) + { + tbMouse(button, state, x, y); + . . . + } + + void + motion(int x, int y) + { + tbMotion(x, y); + . . . + } + + int + main(int argc, char** argv) + { + . . . + init(); + glutReshapeFunc(reshape); + glutDisplayFunc(display); + glutMouseFunc(mouse); + glutMotionFunc(motion); + . . . + } + * + * */ + + +/* functions */ +#ifdef __cplusplus +extern "C" { +#endif + +void +tbInit(GLuint button); + +void +tbMatrix(void); + +void +tbReshape(int width, int height); + +void +tbMouse(int button, int state, int x, int y); + +void +tbMotion(int x, int y); + +void +tbAnimate(GLboolean animate); + +#ifdef __cplusplus +} +#endif diff --git a/src/WinLibs/FTGL/demo/trackball.c b/src/WinLibs/FTGL/demo/trackball.c new file mode 100644 index 000000000..4843457f3 --- /dev/null +++ b/src/WinLibs/FTGL/demo/trackball.c @@ -0,0 +1,324 @@ +/* + * (c) Copyright 1993, 1994, Silicon Graphics, Inc. + * ALL RIGHTS RESERVED + * Permission to use, copy, modify, and distribute this software for + * any purpose and without fee is hereby granted, provided that the above + * copyright notice appear in all copies and that both the copyright notice + * and this permission notice appear in supporting documentation, and that + * the name of Silicon Graphics, Inc. not be used in advertising + * or publicity pertaining to distribution of the software without specific, + * written prior permission. + * + * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS" + * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR + * FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON + * GRAPHICS, INC. BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT, + * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY + * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION, + * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF + * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC. HAS BEEN + * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE + * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE. + * + * US Government Users Restricted Rights + * Use, duplication, or disclosure by the Government is subject to + * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph + * (c)(1)(ii) of the Rights in Technical Data and Computer Software + * clause at DFARS 252.227-7013 and/or in similar or successor + * clauses in the FAR or the DOD or NASA FAR Supplement. + * Unpublished-- rights reserved under the copyright laws of the + * United States. Contractor/manufacturer is Silicon Graphics, + * Inc., 2011 N. Shoreline Blvd., Mountain View, CA 94039-7311. + * + * OpenGL(TM) is a trademark of Silicon Graphics, Inc. + */ +/* + * Trackball code: + * + * Implementation of a virtual trackball. + * Implemented by Gavin Bell, lots of ideas from Thant Tessman and + * the August '88 issue of Siggraph's "Computer Graphics," pp. 121-129. + * + * Vector manip code: + * + * Original code from: + * David M. Ciemiewicz, Mark Grossman, Henry Moreton, and Paul Haeberli + * + * Much mucking with by: + * Gavin Bell + */ +#include +#include "trackball.h" + +/* + * This size should really be based on the distance from the center of + * rotation to the point on the object underneath the mouse. That + * point would then track the mouse as closely as possible. This is a + * simple example, though, so that is left as an Exercise for the + * Programmer. + */ +#define TRACKBALLSIZE (0.4) + +/* + * Local function prototypes (not defined in trackball.h) + */ +static float tb_project_to_sphere(float, float, float); +static void normalize_quat(float [4]); + +void +vzero(float *v) +{ + v[0] = 0.0; + v[1] = 0.0; + v[2] = 0.0; +} + +void +vset(float *v, float x, float y, float z) +{ + v[0] = x; + v[1] = y; + v[2] = z; +} + +void +vsub(const float *src1, const float *src2, float *dst) +{ + dst[0] = src1[0] - src2[0]; + dst[1] = src1[1] - src2[1]; + dst[2] = src1[2] - src2[2]; +} + +void +vcopy(const float *v1, float *v2) +{ + register int i; + for (i = 0 ; i < 3 ; i++) + v2[i] = v1[i]; +} + +void +vcross(const float *v1, const float *v2, float *cross) +{ + float temp[3]; + + temp[0] = (v1[1] * v2[2]) - (v1[2] * v2[1]); + temp[1] = (v1[2] * v2[0]) - (v1[0] * v2[2]); + temp[2] = (v1[0] * v2[1]) - (v1[1] * v2[0]); + vcopy(temp, cross); +} + +float +vlength(const float *v) +{ + return sqrt(v[0] * v[0] + v[1] * v[1] + v[2] * v[2]); +} + +void +vscale(float *v, float div) +{ + v[0] *= div; + v[1] *= div; + v[2] *= div; +} + +void +vnormal(float *v) +{ + vscale(v,1.0/vlength(v)); +} + +float +vdot(const float *v1, const float *v2) +{ + return v1[0]*v2[0] + v1[1]*v2[1] + v1[2]*v2[2]; +} + +void +vadd(const float *src1, const float *src2, float *dst) +{ + dst[0] = src1[0] + src2[0]; + dst[1] = src1[1] + src2[1]; + dst[2] = src1[2] + src2[2]; +} + +/* + * Ok, simulate a track-ball. Project the points onto the virtual + * trackball, then figure out the axis of rotation, which is the cross + * product of P1 P2 and O P1 (O is the center of the ball, 0,0,0) + * Note: This is a deformed trackball-- is a trackball in the center, + * but is deformed into a hyperbolic sheet of rotation away from the + * center. This particular function was chosen after trying out + * several variations. + * + * It is assumed that the arguments to this routine are in the range + * (-1.0 ... 1.0) + */ +void +trackball(float q[4], float p1x, float p1y, float p2x, float p2y) +{ + float a[3]; /* Axis of rotation */ + float phi; /* how much to rotate about axis */ + float p1[3], p2[3], d[3]; + float t; + + if (p1x == p2x && p1y == p2y) { + /* Zero rotation */ + vzero(q); + q[3] = 1.0; + return; + } + + /* + * First, figure out z-coordinates for projection of P1 and P2 to + * deformed sphere + */ + vset(p1,p1x,p1y,tb_project_to_sphere(TRACKBALLSIZE,p1x,p1y)); + vset(p2,p2x,p2y,tb_project_to_sphere(TRACKBALLSIZE,p2x,p2y)); + + /* + * Now, we want the cross product of P1 and P2 + */ + vcross(p2,p1,a); + + /* + * Figure out how much to rotate around that axis. + */ + vsub(p1,p2,d); + t = vlength(d) / (2.0*TRACKBALLSIZE); + + /* + * Avoid problems with out-of-control values... + */ + if (t > 1.0) t = 1.0; + if (t < -1.0) t = -1.0; + phi = 2.0 * asin(t); + + axis_to_quat(a,phi,q); +} + +/* + * Given an axis and angle, compute quaternion. + */ +void +axis_to_quat(float a[3], float phi, float q[4]) +{ + vnormal(a); + vcopy(a,q); + vscale(q,sin(phi/2.0)); + q[3] = cos(phi/2.0); +} + +/* + * Project an x,y pair onto a sphere of radius r OR a hyperbolic sheet + * if we are away from the center of the sphere. + */ +static float +tb_project_to_sphere(float r, float x, float y) +{ + float d, t, z; + + d = sqrt(x*x + y*y); + if (d < r * 0.70710678118654752440) { /* Inside sphere */ + z = sqrt(r*r - d*d); + } else { /* On hyperbola */ + t = r / 1.41421356237309504880; + z = t*t / d; + } + return z; +} + +/* + * Given two rotations, e1 and e2, expressed as quaternion rotations, + * figure out the equivalent single rotation and stuff it into dest. + * + * This routine also normalizes the result every RENORMCOUNT times it is + * called, to keep error from creeping in. + * + * NOTE: This routine is written so that q1 or q2 may be the same + * as dest (or each other). + */ + +#define RENORMCOUNT 97 + +void +add_quats(float q1[4], float q2[4], float dest[4]) +{ + static int count=0; + float t1[4], t2[4], t3[4]; + float tf[4]; + + vcopy(q1,t1); + vscale(t1,q2[3]); + + vcopy(q2,t2); + vscale(t2,q1[3]); + + vcross(q2,q1,t3); + vadd(t1,t2,tf); + vadd(t3,tf,tf); + tf[3] = q1[3] * q2[3] - vdot(q1,q2); + + dest[0] = tf[0]; + dest[1] = tf[1]; + dest[2] = tf[2]; + dest[3] = tf[3]; + + if (++count > RENORMCOUNT) { + count = 0; + normalize_quat(dest); + } +} + +/* + * Quaternions always obey: a^2 + b^2 + c^2 + d^2 = 1.0 + * If they don't add up to 1.0, dividing by their magnitued will + * renormalize them. + * + * Note: See the following for more information on quaternions: + * + * - Shoemake, K., Animating rotation with quaternion curves, Computer + * Graphics 19, No 3 (Proc. SIGGRAPH'85), 245-254, 1985. + * - Pletinckx, D., Quaternion calculus as a basic tool in computer + * graphics, The Visual Computer 5, 2-13, 1989. + */ +static void +normalize_quat(float q[4]) +{ + int i; + float mag; + + mag = (q[0]*q[0] + q[1]*q[1] + q[2]*q[2] + q[3]*q[3]); + for (i = 0; i < 4; i++) q[i] /= mag; +} + +/* + * Build a rotation matrix, given a quaternion rotation. + * + */ +void +build_rotmatrix(float m[4][4], float q[4]) +{ + m[0][0] = 1.0 - 2.0 * (q[1] * q[1] + q[2] * q[2]); + m[0][1] = 2.0 * (q[0] * q[1] - q[2] * q[3]); + m[0][2] = 2.0 * (q[2] * q[0] + q[1] * q[3]); + m[0][3] = 0.0; + + m[1][0] = 2.0 * (q[0] * q[1] + q[2] * q[3]); + m[1][1]= 1.0 - 2.0 * (q[2] * q[2] + q[0] * q[0]); + m[1][2] = 2.0 * (q[1] * q[2] - q[0] * q[3]); + m[1][3] = 0.0; + + m[2][0] = 2.0 * (q[2] * q[0] - q[1] * q[3]); + m[2][1] = 2.0 * (q[1] * q[2] + q[0] * q[3]); + m[2][2] = 1.0 - 2.0 * (q[1] * q[1] + q[0] * q[0]); + m[2][3] = 0.0; + + m[3][0] = 0.0; + m[3][1] = 0.0; + m[3][2] = 0.0; + m[3][3] = 1.0; +} + diff --git a/src/WinLibs/FTGL/demo/trackball.h b/src/WinLibs/FTGL/demo/trackball.h new file mode 100644 index 000000000..3aea4ee5e --- /dev/null +++ b/src/WinLibs/FTGL/demo/trackball.h @@ -0,0 +1,85 @@ +/* + * (c) Copyright 1993, 1994, Silicon Graphics, Inc. + * ALL RIGHTS RESERVED + * Permission to use, copy, modify, and distribute this software for + * any purpose and without fee is hereby granted, provided that the above + * copyright notice appear in all copies and that both the copyright notice + * and this permission notice appear in supporting documentation, and that + * the name of Silicon Graphics, Inc. not be used in advertising + * or publicity pertaining to distribution of the software without specific, + * written prior permission. + * + * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS" + * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR + * FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON + * GRAPHICS, INC. BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT, + * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY + * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION, + * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF + * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC. HAS BEEN + * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE + * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE. + * + * US Government Users Restricted Rights + * Use, duplication, or disclosure by the Government is subject to + * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph + * (c)(1)(ii) of the Rights in Technical Data and Computer Software + * clause at DFARS 252.227-7013 and/or in similar or successor + * clauses in the FAR or the DOD or NASA FAR Supplement. + * Unpublished-- rights reserved under the copyright laws of the + * United States. Contractor/manufacturer is Silicon Graphics, + * Inc., 2011 N. Shoreline Blvd., Mountain View, CA 94039-7311. + * + * OpenGL(TM) is a trademark of Silicon Graphics, Inc. + */ +/* + * trackball.h + * A virtual trackball implementation + * Written by Gavin Bell for Silicon Graphics, November 1988. + */ + +#ifdef __cpluscplus +extern "C" { +#endif + +/* + * Pass the x and y coordinates of the last and current positions of + * the mouse, scaled so they are from (-1.0 ... 1.0). + * + * The resulting rotation is returned as a quaternion rotation in the + * first paramater. + */ +void +trackball(float q[4], float p1x, float p1y, float p2x, float p2y); + +/* + * Given two quaternions, add them together to get a third quaternion. + * Adding quaternions to get a compound rotation is analagous to adding + * translations to get a compound translation. When incrementally + * adding rotations, the first argument here should be the new + * rotation, the second and third the total rotation (which will be + * over-written with the resulting new total rotation). + */ +void +add_quats(float *q1, float *q2, float *dest); + +/* + * A useful function, builds a rotation matrix in Matrix based on + * given quaternion. + */ +void +build_rotmatrix(float m[4][4], float q[4]); + +/* + * This function computes a quaternion based on an axis (defined by + * the given vector) and an angle about which to rotate. The angle is + * expressed in radians. The result is put into the third argument. + */ +void +axis_to_quat(float a[3], float phi, float q[4]); + +#ifdef __cpluscplus +} +#endif diff --git a/src/WinLibs/FTGL/docs/FTGL.html b/src/WinLibs/FTGL/docs/FTGL.html new file mode 100644 index 000000000..d09b75859 --- /dev/null +++ b/src/WinLibs/FTGL/docs/FTGL.html @@ -0,0 +1,332 @@ + + + + FTGL User Guide + + + + + + + +
+ +

FTGL User Guide +

+

(work in progress) +

+

+FTGL Demo screen shot +

+ +

Contents

+ +
+ +

Introduction +

+

+OpenGL doesn't provide direct font support, so the application must use any of OpenGL's other features for font rendering, such as drawing bitmaps or pixmaps, creating texture maps containing an entire character set, drawing character outlines, or creating 3D geometry for each character. +

+ + +

http://www.opengl.org/developers/faqs/technical/fonts.htm

+

http://www.opengl.org/developers/code/features/fontsurvey/index.html

+

+?????One thing all of these systems have in comman is they require a pre-processing stage to take the native fonts and convert them into proprietry format. +

+ +

+FTGL was borne out of the need to treat fonts in OpenGL applications just like any other application. For example when using Adobe Photoshop or Microsoft Word you don't need an intermediate pre-processing step to use high quality scalable fonts. +

+ +
+
+

Choosing a font type

+

+FTGL supports 6 font output types in 3 groups, raster fonts, vector fonts and texure fonts which are a mixture of both. Each font type has it's advantages and disadvantages +

+The two raster types are +
    +
  • Bitmapped
  • +
  • Antialiased pixmapped
  • +
+ + + +The vector types are +
    +
  • Outline
  • +
  • Polygonal
  • +
  • Extruded polygon
  • +
+ + + + +
    +
  • Texture mapped
  • +
+

+This is probably the most versatile type. It is fast, antialised and can be transformed just like any openGL primitive. +

+ +
+ +
+

Creating a font +

+
+    FTGLPixmapFont font;
+    
+    font.Open( "Fonts:Arial");
+    font.FaceSize( 72);
+    
+    font.render( "Hello World!");
+
+    FTFont::Open( string, cache);
+    const char* string;    
+    bool cache;            
+
+

+

+		bool Open( fontname, preCache = true);
+        const char* fontname:   
+        bool preCache:          
+
+
+ + +

+A side effect of this is you can specify a sub set of glyphs to be pre-loaded. This will let you use larger higher quality glyphs without consuming huge amounts of ram as you would if you loaded the entire font. For example if your application only needs numbers, eg for scores, you can use the following code to preload them. +

+ +
+    // Open the font with pre-cache set to false
+    font.Open( "Fonts:Arial", false);
+    
+    // Set the size
+    font.FaceSize( 72);
+    
+    // Cause the font to preload the number chars without rendering them.
+    font.Advance( "0123456789");
+
+ + + +
+ +
+

More font commands

+

Font Metrics

+

+glyph metrics +

+ +

+If you ask a font to render at 0.0, 0.0 the bottom left most pixel or polygon may not be aligned to 0.0, 0.0. +

+ +
+        int    FTFont::Ascender() const;
+        int    FTFont::Descender() const;
+
+        float FTFont::Advance( string);
+
+ + +

+With these three functions an approximate bounding box can be calculated. For an exact bounding box use the FTFont::BBox function. +

+ +
+        void FTFont::BBox( string, llx, lly, llz, urx, ury, urz);
+        const char* string:    String of text to be tested
+        float& llx:            The bottom left near most ?? in the x axis
+        float& lly:            The bottom left near most ?? in the y axis
+        float& llz:            The bottom left near most ?? in the z axis
+        float& urx:            The top right far most ?? in the x axis
+        float& ury:            The top right far most ?? in the y axis
+        float& urz:            The top right far most ?? in the z axis
+
+ +

+This function returns the extent of the volume containing 'string'. 0.0 on the y axis will be aligned with the font baseline. +

+ +

Specifying a character map encoding. +

+From the freetype docs...
+"By default, when a new face object is created, (freetype) lists all the charmaps contained in the font face and selects the one that supports Unicode character codes if it finds one. Otherwise, it tries to find support for Latin-1, then ASCII." +
+It then gives up. In this case FTGL will set the charmap to the first it finds in the fonts charmap list. + +You can expilcitly set the char encoding with Charmap: +
+    bool FTFont::CharMap( encoding);
+    FT_Encoding encoding;    Freetype code
+
+ +Valid encodings as at Freetype 2.0.4 +
+    ft_encoding_none
+    ft_encoding_symbol
+    ft_encoding_unicode
+    ft_encoding_latin_2
+    ft_encoding_sjis
+    ft_encoding_gb2312
+    ft_encoding_big5
+    ft_encoding_wansung
+    ft_encoding_johab
+    ft_encoding_adobe_standard
+    ft_encoding_adobe_expert
+    ft_encoding_adobe_custom
+    ft_encoding_apple_roman
+
+ +for example... +
+font.CharMap( ft_encoding_apple_roman);
+
+ +This will return an error if the requested encoding can't be found in the font. + + + +
+ +
+

FAQ

+ +WhenI try to compile FTGL it complains about a missing file from the include: + +#include + +FTGL relies on freetype 2 for opening and decoding font files. This include is the main include for freetype. You will need to download Freetype 2 and install it. Then make sure that the FTGL project that you are using points to your freetype installation. + + +2) Is it possible to map a font to a "unit" size? My application relies on +the fonts being a certain "physical" height (in OpenGL coordinate space) +rather than a point size in display space. Any thoughts/suggestions? + + +We can do anything:) It would be easy to allow you to set the size in pixels, though I'm not sure this is what you want. Setting the size to 'opengl units' may be a bit harder. What does 1.0 in opengl space mean and how does that relate to point size? For one person it might mean scaling the font up, for someone else it may mean scaling down. Plus bitmaps and pixmaps have a pixel to pixel relationship that you can't change. + +Here's some guidelines for vector and texture fonts. Take note that I say 'should' a lot:) +One point in pixel space maps to 1 unit in opengl space, so a glyph that is 18 points high should be 18.0 units high. +If you set an ortho projection to the window size and draw a glyph it's screen size should be the correct physical size ie a 72 point glyph on a 72dpi screen will be 1 inch high. Also if you set a perspective projection that maps 0.0 in the z axis to screen size you will get the same eg... + gluPerspective( 90, window_height / 2 , small_number, large_number); +So basically it all depends on your projection matrix. Obviously you can use glScale but I understand if you don't want to. +Couple of extra things to note. The quality of vector glyphs will not change when you change the size. ie a really small polygon glyph up close will look exactly the same as a big one from far away. They both contain the same amount of data. This doesn't apply to texture fonts. Secondly there is a bug in the advance/ kerning code that will cause ugliness at really small point sizes. This is because the advance and kerning use ints so an advance of 0.4 will become zero. If this is going to be a probelm, I can fix this. + +Early on I did a lot of head scratching over the opengl unit to font size thing because when I was first integrating FTGL into my engine the fonts weren't the size I was expecting. I was tempted to build in some scaling but I decided doing nothing was the best approach because you can't please everyone. Plus it's 'correct' as it is. + + + +

Sample font manager class.

+ + +
+FTGLTextureFont* myFont = FTGLFontManager::Instance().GetFont( "arial.ttf", 72);
+
+#include    <map>
+#include    <string>
+#include    "FTGLTextureFont.h"
+
+using namespace std;
+
+typedef map< string, FTFont*> FontList;
+typedef FontList::const_iterator FontIter;
+
+class FTGLFontManager
+{
+    public:
+        // NOTE
+        // This is shown here for brevity. The implementation should be in the source
+        // file otherwise your compiler may inline the function resulting in 
+        // multiple instances of FTGLFontManager
+        static FTGLFontManager& Instance()
+        {
+            static FTGLFontManager tm;
+            return tm;
+        }
+        
+        ~FTGLFontManager()
+        {
+            FontIter font;
+            for( font = fonts.begin(); font != fonts.end(); font++)
+            {
+                delete (*font).second;;
+            }
+    
+            fonts.clear();
+        }
+
+        
+        FTFont* GetFont( const char *filename, int size)
+        {
+            char buf[256];
+            sprintf(buf, "%s%i", filename, size);
+            string fontKey = string(buf);
+            
+            FontIter result = fonts.find( fontKey);
+            if( result != fonts.end())
+            {
+                LOGMSG( "Found font %s in list", filename);
+                return result->second;
+            }
+        
+            FTFont* font = new FTGLTextureFont;
+            
+            string fullname = path + string( filename);
+            
+            if( !font->Open( fullname.c_str()))
+            {
+                LOGERROR( "Font %s failed to open", fullname.c_str());
+                delete font;
+                return NULL;
+            }
+            
+            if( !font->FaceSize( size))
+            {
+                LOGERROR( "Font %s failed to set size %i", filename, size);
+                delete font;
+                return NULL;
+            }
+        
+            fonts[fontKey] = font;
+            
+            return font;
+        
+        }
+    
+        
+    private:
+        // Hide these 'cause this is a singleton.
+        FTGLFontManager(){}
+        FTGLFontManager( const FTGLFontManager&){};
+        FTGLFontManager& operator = ( const FTGLFontManager&){ return *this;};
+        
+        // container for fonts
+        FontList fonts;
+    
+};
+
+ + +
+ +
+

Glossary

+ + +
+ + diff --git a/src/WinLibs/FTGL/docs/FTGL_1_3.gif b/src/WinLibs/FTGL/docs/FTGL_1_3.gif new file mode 100644 index 0000000000000000000000000000000000000000..ac0627ee40ce8cc869c88b6bdeddc9209696ff37 GIT binary patch literal 42553 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 Me`2L4&;YO#0HN9n8~^|S literal 0 HcmV?d00001 diff --git a/src/WinLibs/FTGL/docs/images/ftgldemo.jpg b/src/WinLibs/FTGL/docs/images/ftgldemo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..55adddec7c042f0d684762a131f2f57b5dab4f35 GIT binary patch literal 34812 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 literal 0 HcmV?d00001 diff --git a/src/WinLibs/FTGL/include/FTBBox.h b/src/WinLibs/FTGL/include/FTBBox.h new file mode 100644 index 000000000..672356d6b --- /dev/null +++ b/src/WinLibs/FTGL/include/FTBBox.h @@ -0,0 +1,124 @@ +#ifndef __FTBBox__ +#define __FTBBox__ + +#include +#include FT_FREETYPE_H +//#include FT_GLYPH_H +#include FT_OUTLINE_H + +#include "FTGL.h" +#include "FTPoint.h" + + +/** + * FTBBox is a convenience class for handling bounding boxes. + */ +class FTGL_EXPORT FTBBox +{ + public: + /** + * Default constructor. Bounding box is set to zero. + */ + FTBBox() + : lowerX(0.0f), + lowerY(0.0f), + lowerZ(0.0f), + upperX(0.0f), + upperY(0.0f), + upperZ(0.0f) + {} + + /** + * Constructor. + */ + FTBBox( float lx, float ly, float lz, float ux, float uy, float uz) + : lowerX(lx), + lowerY(ly), + lowerZ(lz), + upperX(ux), + upperY(uy), + upperZ(uz) + {} + + /** + * Constructor. Extracts a bounding box from a freetype glyph. Uses + * the control box for the glyph. FT_Glyph_Get_CBox() + * + * @param glyph A freetype glyph + */ + FTBBox( FT_GlyphSlot glyph) + : lowerX(0.0f), + lowerY(0.0f), + lowerZ(0.0f), + upperX(0.0f), + upperY(0.0f), + upperZ(0.0f) + { + FT_BBox bbox; + FT_Outline_Get_CBox( &(glyph->outline), &bbox); + + lowerX = static_cast( bbox.xMin) / 64.0f; + lowerY = static_cast( bbox.yMin) / 64.0f; + lowerZ = 0.0f; + upperX = static_cast( bbox.xMax) / 64.0f; + upperY = static_cast( bbox.yMax) / 64.0f; + upperZ = 0.0f; + + } + + /** + * Destructor + */ + ~FTBBox() + {} + + + /** + * Move the Bounding Box by a vector. + * + * @param distance The distance to move the bbox in 3D space. + */ + FTBBox& Move( FTPoint distance) + { + lowerX += distance.X(); + lowerY += distance.Y(); + lowerZ += distance.Z(); + upperX += distance.X(); + upperY += distance.Y(); + upperZ += distance.Z(); + return *this; + } + + FTBBox& operator += ( const FTBBox& bbox) + { + lowerX = bbox.lowerX < lowerX? bbox.lowerX: lowerX; + lowerY = bbox.lowerY < lowerY? bbox.lowerY: lowerY; + lowerZ = bbox.lowerZ < lowerZ? bbox.lowerZ: lowerZ; + upperX = bbox.upperX > upperX? bbox.upperX: upperX; + upperY = bbox.upperY > upperY? bbox.upperY: upperY; + upperZ = bbox.upperZ > upperZ? bbox.upperZ: upperZ; + + return *this; + } + + void SetDepth( float depth) + { + upperZ = lowerZ + depth; + } + + + /** + * The bounds of the box + */ + // Make these ftPoints & private + float lowerX, lowerY, lowerZ, upperX, upperY, upperZ; + protected: + + + private: + +}; + + +#endif // __FTBBox__ + diff --git a/src/WinLibs/FTGL/include/FTBitmapGlyph.h b/src/WinLibs/FTGL/include/FTBitmapGlyph.h new file mode 100644 index 000000000..a9909df89 --- /dev/null +++ b/src/WinLibs/FTGL/include/FTBitmapGlyph.h @@ -0,0 +1,76 @@ +#ifndef __FTBitmapGlyph__ +#define __FTBitmapGlyph__ + + +#include +#include FT_FREETYPE_H +#include FT_GLYPH_H + +#include "FTGL.h" +#include "FTGlyph.h" + + +/** + * FTBitmapGlyph is a specialisation of FTGlyph for creating bitmaps. + * + * It provides the interface between Freetype glyphs and their openGL + * Renderable counterparts. This is an abstract class and derived classes + * must implement the Render function. + * + * @see FTGlyphContainer + * + */ +class FTGL_EXPORT FTBitmapGlyph : public FTGlyph +{ + public: + /** + * Constructor + * + * @param glyph The Freetype glyph to be processed + */ + FTBitmapGlyph( FT_GlyphSlot glyph); + + /** + * Destructor + */ + virtual ~FTBitmapGlyph(); + + /** + * Renders this glyph at the current pen position. + * + * @param pen The current pen position. + * @return The advance distance for this glyph. + */ + virtual const FTPoint& Render( const FTPoint& pen); + + private: + /** + * The width of the glyph 'image' + */ + unsigned int destWidth; + + /** + * The height of the glyph 'image' + */ + unsigned int destHeight; + + /** + * The pitch of the glyph 'image' + */ + unsigned int destPitch; + + /** + * Vector from the pen position to the topleft corner of the bitmap + */ + FTPoint pos; + + /** + * Pointer to the 'image' data + */ + unsigned char* data; + +}; + + +#endif // __FTBitmapGlyph__ + diff --git a/src/WinLibs/FTGL/include/FTCharToGlyphIndexMap.h b/src/WinLibs/FTGL/include/FTCharToGlyphIndexMap.h new file mode 100644 index 000000000..6e40d3c95 --- /dev/null +++ b/src/WinLibs/FTGL/include/FTCharToGlyphIndexMap.h @@ -0,0 +1,130 @@ +#ifndef __FTCharToGlyphIndexMap__ +#define __FTCharToGlyphIndexMap__ + +#include + +#include "FTGL.h" + +/** + * Provides a non-STL alternative to the STL map + * which maps character codes to glyph indices inside FTCharmap. + * + * Implementation: + * - NumberOfBuckets buckets are considered. + * - Each bucket has BucketSize entries. + * - When the glyph index for the character code C has to be stored, the + * bucket this character belongs to is found using 'C div BucketSize'. + * If this bucket has not been allocated yet, do it now. + * The entry in the bucked is found using 'C mod BucketSize'. + * If it is set to IndexNotFound, then the glyph entry has not been set. + * - Try to mimic the calls made to the STL map API. + * + * Caveats: + * - The glyph index is now a signed long instead of unsigned long, so + * the special value IndexNotFound (= -1) can be used to specify that the + * glyph index has not been stored yet. + */ +class FTGL_EXPORT FTCharToGlyphIndexMap +{ + public: + + typedef unsigned long CharacterCode; + typedef signed long GlyphIndex; + + enum + { + NumberOfBuckets = 256, + BucketSize = 256, + IndexNotFound = -1 + }; + + FTCharToGlyphIndexMap() + { + this->Indices = 0; + } + + virtual ~FTCharToGlyphIndexMap() + { + if( this->Indices) + { + // Free all buckets + this->clear(); + + // Free main structure + delete [] this->Indices; + this->Indices = 0; + } + } + + void clear() + { + if(this->Indices) + { + for( int i = 0; i < FTCharToGlyphIndexMap::NumberOfBuckets; i++) + { + if( this->Indices[i]) + { + delete [] this->Indices[i]; + this->Indices[i] = 0; + } + } + } + } + + const GlyphIndex find( CharacterCode c) + { + if( !this->Indices) + { + return 0; + } + + // Find position of char code in buckets + div_t pos = div( c, FTCharToGlyphIndexMap::BucketSize); + + if( !this->Indices[pos.quot]) + { + return 0; + } + + const FTCharToGlyphIndexMap::GlyphIndex *ptr = &this->Indices[pos.quot][pos.rem]; + if( *ptr == FTCharToGlyphIndexMap::IndexNotFound) + { + return 0; + } + + return *ptr; + } + + void insert( CharacterCode c, GlyphIndex g) + { + if( !this->Indices) + { + this->Indices = new GlyphIndex* [FTCharToGlyphIndexMap::NumberOfBuckets]; + for( int i = 0; i < FTCharToGlyphIndexMap::NumberOfBuckets; i++) + { + this->Indices[i] = 0; + } + } + + // Find position of char code in buckets + div_t pos = div(c, FTCharToGlyphIndexMap::BucketSize); + + // Allocate bucket if does not exist yet + if( !this->Indices[pos.quot]) + { + this->Indices[pos.quot] = new GlyphIndex [FTCharToGlyphIndexMap::BucketSize]; + for( int i = 0; i < FTCharToGlyphIndexMap::BucketSize; i++) + { + this->Indices[pos.quot][i] = FTCharToGlyphIndexMap::IndexNotFound; + } + } + + this->Indices[pos.quot][pos.rem] = g; + } + + private: + GlyphIndex** Indices; +}; + + +#endif // __FTCharToGlyphIndexMap__ diff --git a/src/WinLibs/FTGL/include/FTCharmap.h b/src/WinLibs/FTGL/include/FTCharmap.h new file mode 100644 index 000000000..74ca6f2ca --- /dev/null +++ b/src/WinLibs/FTGL/include/FTCharmap.h @@ -0,0 +1,136 @@ +#ifndef __FTCharmap__ +#define __FTCharmap__ + + +#include +#include FT_FREETYPE_H +#include FT_GLYPH_H + +#include "FTCharToGlyphIndexMap.h" + +#include "FTGL.h" + + +/** + * FTCharmap takes care of specifying the encoding for a font and mapping + * character codes to glyph indices. + * + * It doesn't preprocess all indices, only on an as needed basis. This may + * seem like a performance penalty but it is quicker than using the 'raw' + * freetype calls and will save significant amounts of memory when dealing + * with unicode encoding + * + * @see "Freetype 2 Documentation" + * + */ + +class FTFace; + +class FTGL_EXPORT FTCharmap +{ + public: + /** + * Constructor + */ + FTCharmap( FTFace* face); + + /** + * Destructor + */ + virtual ~FTCharmap(); + + /** + * Queries for the current character map code. + * + * @return The current character map code. + */ + FT_Encoding Encoding() const { return ftEncoding;} + + /** + * Sets the character map for the face. + * Valid encodings as at Freetype 2.0.4 + * ft_encoding_none + * ft_encoding_symbol + * ft_encoding_unicode + * ft_encoding_latin_2 + * ft_encoding_sjis + * ft_encoding_gb2312 + * ft_encoding_big5 + * ft_encoding_wansung + * ft_encoding_johab + * ft_encoding_adobe_standard + * ft_encoding_adobe_expert + * ft_encoding_adobe_custom + * ft_encoding_apple_roman + * + * @param encoding the Freetype encoding symbol. See above. + * @return true if charmap was valid and set + * correctly. If the requested encoding is + * unavailable it will be set to ft_encoding_none. + */ + bool CharMap( FT_Encoding encoding); + + /** + * Get the FTGlyphContainer index of the input character. + * + * @param characterCode The character code of the requested glyph in + * the current encoding eg apple roman. + * @return The FTGlyphContainer index for the character or zero + * if it wasn't found + */ + unsigned int GlyphListIndex( const unsigned int characterCode); + + /** + * Get the font glyph index of the input character. + * + * @param characterCode The character code of the requested glyph in + * the current encoding eg apple roman. + * @return The glyph index for the character. + */ + unsigned int FontIndex( const unsigned int characterCode); + + /** + * Set the FTGlyphContainer index of the character code. + * + * @param characterCode The character code of the requested glyph in + * the current encoding eg apple roman. + * @param containerIndex The index into the FTGlyphContainer of the + * character code. + */ + void InsertIndex( const unsigned int characterCode, const unsigned int containerIndex); + + /** + * Queries for errors. + * + * @return The current error code. Zero means no error. + */ + FT_Error Error() const { return err;} + + private: + /** + * Current character map code. + */ + FT_Encoding ftEncoding; + + /** + * The current Freetype face. + */ + const FT_Face ftFace; + + /** + * A structure that maps glyph indices to character codes + * + * < character code, face glyph index> + */ + typedef FTCharToGlyphIndexMap CharacterMap; + CharacterMap charMap; + + /** + * Current error code. + */ + FT_Error err; + +}; + + +#endif // __FTCharmap__ diff --git a/src/WinLibs/FTGL/include/FTContour.h b/src/WinLibs/FTGL/include/FTContour.h new file mode 100644 index 000000000..895d9edef --- /dev/null +++ b/src/WinLibs/FTGL/include/FTContour.h @@ -0,0 +1,88 @@ +#ifndef __FTContour__ +#define __FTContour__ + +#include "FTPoint.h" +#include "FTVector.h" +#include "FTGL.h" + + +/** + * FTContour class is a container of points that describe a vector font + * outline. It is used as a container for the output of the bezier curve + * evaluator in FTVectoriser. + * + * @see FTOutlineGlyph + * @see FTPolyGlyph + * @see FTPoint + */ +class FTGL_EXPORT FTContour +{ + public: + /** + * Constructor + * + * @param contour + * @param pointTags + * @param numberOfPoints + */ + FTContour( FT_Vector* contour, char* pointTags, unsigned int numberOfPoints); + + /** + * Destructor + */ + ~FTContour() + { + pointList.clear(); + } + + /** + * Return a point at index. + * + * @param index of the point in the curve. + * @return const point reference + */ + const FTPoint& Point( unsigned int index) const { return pointList[index];} + + /** + * How many points define this contour + * + * @return the number of points in this contour + */ + size_t PointCount() const { return pointList.size();} + + private: + /** + * Add a point to this contour. This function tests for duplicate + * points. + * + * @param point The point to be added to the contour. + */ + inline void AddPoint( FTPoint point); + + inline void AddPoint( float x, float y); + + /** + * De Casteljau (bezier) algorithm contributed by Jed Soane + * Evaluates a quadratic or conic (second degree) curve + */ + inline void evaluateQuadraticCurve(); + + /** + * De Casteljau (bezier) algorithm contributed by Jed Soane + * Evaluates a cubic (third degree) curve + */ + inline void evaluateCubicCurve(); + + /** + * The list of points in this contour + */ + typedef FTVector PointVector; + PointVector pointList; + + /** + * 2D array storing values of de Casteljau algorithm. + */ + float controlPoints[4][2]; +}; + +#endif // __FTContour__ diff --git a/src/WinLibs/FTGL/include/FTExtrdGlyph.h b/src/WinLibs/FTGL/include/FTExtrdGlyph.h new file mode 100644 index 000000000..e0e8a56bf --- /dev/null +++ b/src/WinLibs/FTGL/include/FTExtrdGlyph.h @@ -0,0 +1,69 @@ +#ifndef __FTExtrdGlyph__ +#define __FTExtrdGlyph__ + +#include +#include FT_FREETYPE_H +#include FT_GLYPH_H + +#include "FTGL.h" +#include "FTGlyph.h" + +class FTVectoriser; + +/** + * FTExtrdGlyph is a specialisation of FTGlyph for creating tessellated + * extruded polygon glyphs. + * + * @see FTGlyphContainer + * @see FTVectoriser + * + */ +class FTGL_EXPORT FTExtrdGlyph : public FTGlyph +{ + public: + /** + * Constructor. Sets the Error to Invalid_Outline if the glyph isn't an outline. + * + * @param glyph The Freetype glyph to be processed + * @param depth The distance along the z axis to extrude the glyph + * @param useDisplayList Enable or disable the use of Display Lists for this glyph + * true turns ON display lists. + * false turns OFF display lists. + */ + FTExtrdGlyph( FT_GlyphSlot glyph, float depth, bool useDisplayList); + + /** + * Destructor + */ + virtual ~FTExtrdGlyph(); + + /** + * Renders this glyph at the current pen position. + * + * @param pen The current pen position. + * @return The advance distance for this glyph. + */ + virtual const FTPoint& Render( const FTPoint& pen); + + private: + /** + * Calculate the normal vector to 2 points. This is 2D and ignores + * the z component. The normal will be normalised + * + * @param a + * @param b + * @return + */ + FTPoint GetNormal( const FTPoint &a, const FTPoint &b); + + + /** + * OpenGL display list + */ + GLuint glList; + +}; + + +#endif // __FTExtrdGlyph__ + diff --git a/src/WinLibs/FTGL/include/FTFace.h b/src/WinLibs/FTGL/include/FTFace.h new file mode 100644 index 000000000..356abd539 --- /dev/null +++ b/src/WinLibs/FTGL/include/FTFace.h @@ -0,0 +1,147 @@ +#ifndef __FTFace__ +#define __FTFace__ + +#include +#include FT_FREETYPE_H +#include FT_GLYPH_H + +#include "FTGL.h" +#include "FTPoint.h" +#include "FTSize.h" + +/** + * FTFace class provides an abstraction layer for the Freetype Face. + * + * @see "Freetype 2 Documentation" + * + */ +class FTGL_EXPORT FTFace +{ + public: + /** + * Opens and reads a face file. Error is set. + * + * @param fontFilePath font file path. + */ + FTFace( const char* fontFilePath); + + /** + * Read face data from an in-memory buffer. Error is set. + * + * @param pBufferBytes the in-memory buffer + * @param bufferSizeInBytes the length of the buffer in bytes + */ + FTFace( const unsigned char *pBufferBytes, size_t bufferSizeInBytes ); + + /** + * Destructor + * + * Disposes of the current Freetype Face. + */ + virtual ~FTFace(); + + /** + * Attach auxilliary file to font (e.g., font metrics). + * + * @param fontFilePath auxilliary font file path. + * @return true if file has opened + * successfully. + */ + bool Attach( const char* fontFilePath); + + /** + * Attach auxilliary data to font (e.g., font metrics) from memory + * + * @param pBufferBytes the in-memory buffer + * @param bufferSizeInBytes the length of the buffer in bytes + * @return true if file has opened + * successfully. + */ + bool Attach( const unsigned char *pBufferBytes, size_t bufferSizeInBytes); + + /** + * Get the freetype face object.. + * + * @return pointer to an FT_Face. + */ + FT_Face* Face() const { return ftFace;} + + /** + * Sets the char size for the current face. + * + * This doesn't guarantee that the size was set correctly. Clients + * should check errors. + * + * @param size the face size in points (1/72 inch) + * @param res the resolution of the target device. + * @return FTSize object + */ + const FTSize& Size( const unsigned int size, const unsigned int res); + + /** + * Get the number of character maps in this face. + * + * @return character map count. + */ + unsigned int CharMapCount(); + + /** + * Get a list of character maps in this face. + * + * @return pointer to the first encoding. + */ + FT_Encoding* CharMapList(); + + /** + * Gets the kerning vector between two glyphs + */ + FTPoint KernAdvance( unsigned int index1, unsigned int index2); + + /** + * Loads and creates a Freetype glyph. + */ + FT_GlyphSlot Glyph( unsigned int index, FT_Int load_flags); + + /** + * Gets the number of glyphs in the current face. + */ + unsigned int GlyphCount() const { return numGlyphs;} + + /** + * Queries for errors. + * + * @return The current error code. + */ + FT_Error Error() const { return err; } + + private: + /** + * The Freetype face + */ + FT_Face* ftFace; + + /** + * The size object associated with this face + */ + FTSize charSize; + + /** + * The number of glyphs in this face + */ + int numGlyphs; + + FT_Encoding* fontEncodingList; + + /** + * This face has kerning tables + */ + bool hasKerningTable; + + /** + * Current error code. Zero means no error. + */ + FT_Error err; +}; + + +#endif // __FTFace__ diff --git a/src/WinLibs/FTGL/include/FTFont.h b/src/WinLibs/FTGL/include/FTFont.h new file mode 100644 index 000000000..bce8de6ac --- /dev/null +++ b/src/WinLibs/FTGL/include/FTFont.h @@ -0,0 +1,276 @@ +#ifndef __FTFont__ +#define __FTFont__ + +#include +#include FT_FREETYPE_H + +#include "FTFace.h" +#include "FTGL.h" + +class FTGlyphContainer; +class FTGlyph; + + +/** + * FTFont is the public interface for the FTGL library. + * + * Specific font classes are derived from this class. It uses the helper + * classes FTFace and FTSize to access the Freetype library. This class + * is abstract and deriving classes must implement the protected + * MakeGlyph function to create glyphs of the + * appropriate type. + * + * It is good practice after using these functions to test the error + * code returned. FT_Error Error(). Check the freetype file fterrdef.h + * for error definitions. + * + * @see FTFace + * @see FTSize + * @see FTGlyphContainer + * @see FTGlyph + */ +class FTGL_EXPORT FTFont +{ + public: + /** + * Open and read a font file. Sets Error flag. + * + * @param fontFilePath font file path. + */ + FTFont( const char* fontFilePath); + + /** + * Open and read a font from a buffer in memory. Sets Error flag. + * The buffer is owned by the client and is NOT copied by FTGL. The + * pointer must be valid while using FTGL. + * + * @param pBufferBytes the in-memory buffer + * @param bufferSizeInBytes the length of the buffer in bytes + */ + FTFont( const unsigned char *pBufferBytes, size_t bufferSizeInBytes); + + /** + * Destructor + */ + virtual ~FTFont(); + + /** + * Attach auxilliary file to font e.g font metrics. + * + * Note: not all font formats implement this function. + * + * @param fontFilePath auxilliary font file path. + * @return true if file has been attached + * successfully. + */ + bool Attach( const char* fontFilePath); + + /** + * Attach auxilliary data to font e.g font metrics, from memory + * + * Note: not all font formats implement this function. + * + * @param pBufferBytes the in-memory buffer + * @param bufferSizeInBytes the length of the buffer in bytes + * @return true if file has been attached + * successfully. + */ + bool Attach( const unsigned char *pBufferBytes, size_t bufferSizeInBytes); + + /** + * Set the character map for the face. + * + * @param encoding Freetype enumerate for char map code. + * @return true if charmap was valid and + * set correctly + */ + bool CharMap( FT_Encoding encoding ); + + /** + * Get the number of character maps in this face. + * + * @return character map count. + */ + unsigned int CharMapCount(); + + /** + * Get a list of character maps in this face. + * + * @return pointer to the first encoding. + */ + FT_Encoding* CharMapList(); + + /** + * Set the char size for the current face. + * + * @param size the face size in points (1/72 inch) + * @param res the resolution of the target device. + * @return true if size was set correctly + */ + virtual bool FaceSize( const unsigned int size, const unsigned int res = 72); + + /** + * Get the current face size in points. + * + * @return face size + */ + unsigned int FaceSize() const; + + /** + * Set the extrusion distance for the font. Only implemented by + * FTGLExtrdFont + * + * @param depth The extrusion distance. + */ + virtual void Depth( float depth){} + + /** + * Enable or disable the use of Display Lists inside FTGL + * + * @param useList true turns ON display lists. + * false turns OFF display lists. + */ + void UseDisplayList( bool useList); + + /** + * Get the global ascender height for the face. + * + * @return Ascender height + */ + float Ascender() const; + + /** + * Gets the global descender height for the face. + * + * @return Descender height + */ + float Descender() const; + + /** + * Gets the line spacing for the font. + * + * @return Line height + */ + float LineHeight() const; + + /** + * Get the bounding box for a string. + * + * @param string a char string + * @param llx lower left near x coord + * @param lly lower left near y coord + * @param llz lower left near z coord + * @param urx upper right far x coord + * @param ury upper right far y coord + * @param urz upper right far z coord + */ + void BBox( const char* string, float& llx, float& lly, float& llz, float& urx, float& ury, float& urz); + + /** + * Get the bounding box for a string. + * + * @param string a wchar_t string + * @param llx lower left near x coord + * @param lly lower left near y coord + * @param llz lower left near z coord + * @param urx upper right far x coord + * @param ury upper right far y coord + * @param urz upper right far z coord + */ + void BBox( const wchar_t* string, float& llx, float& lly, float& llz, float& urx, float& ury, float& urz); + + /** + * Get the advance width for a string. + * + * @param string a wchar_t string + * @return advance width + */ + float Advance( const wchar_t* string); + + /** + * Get the advance width for a string. + * + * @param string a char string + * @return advance width + */ + float Advance( const char* string); + + /** + * Render a string of characters + * + * @param string 'C' style string to be output. + */ + virtual void Render( const char* string ); + + /** + * Render a string of characters + * + * @param string wchar_t string to be output. + */ + virtual void Render( const wchar_t* string ); + + /** + * Queries the Font for errors. + * + * @return The current error code. + */ + FT_Error Error() const { return err;} + + protected: + /** + * Construct a glyph of the correct type. + * + * Clients must overide the function and return their specialised + * FTGlyph. + * + * @param g The glyph index NOT the char code. + * @return An FT****Glyph or null on failure. + */ + virtual FTGlyph* MakeGlyph( unsigned int g) = 0; + + /** + * Current face object + */ + FTFace face; + + /** + * Current size object + */ + FTSize charSize; + + /** + * Flag to enable or disable the use of Display Lists inside FTGL + * true turns ON display lists. + * false turns OFF display lists. + */ + bool useDisplayLists; + + /** + * Current error code. Zero means no error. + */ + FT_Error err; + + private: + /** + * Check that the glyph at chr exist. If not load it. + * + * @param chr character index + * @return true if the glyph can be created. + */ + inline bool CheckGlyph( const unsigned int chr); + + /** + * An object that holds a list of glyphs + */ + FTGlyphContainer* glyphList; + + /** + * Current pen or cursor position; + */ + FTPoint pen; + +}; + + +#endif // __FTFont__ + diff --git a/src/WinLibs/FTGL/include/FTGL.h b/src/WinLibs/FTGL/include/FTGL.h new file mode 100644 index 000000000..f338ae9c7 --- /dev/null +++ b/src/WinLibs/FTGL/include/FTGL.h @@ -0,0 +1,86 @@ +#ifndef __FTGL__ +#define __FTGL__ + + +typedef double FTGL_DOUBLE; +typedef float FTGL_FLOAT; + +// Fixes for deprecated identifiers in 2.1.5 +#ifndef FT_OPEN_MEMORY + #define FT_OPEN_MEMORY (FT_Open_Flags)1 +#endif + +#ifndef FT_RENDER_MODE_MONO + #define FT_RENDER_MODE_MONO ft_render_mode_mono +#endif + +#ifndef FT_RENDER_MODE_NORMAL + #define FT_RENDER_MODE_NORMAL ft_render_mode_normal +#endif + + +#ifdef WIN32 + + // Under windows avoid including is overrated. + // Sure, it can be avoided and "name space pollution" can be + // avoided, but why? It really doesn't make that much difference + // these days. + #define WIN32_LEAN_AND_MEAN + #include + + #ifndef __gl_h_ + #include + #include + #endif + +#else + + // Non windows platforms - don't require nonsense as seen above :-) + #ifndef __gl_h_ + #ifdef __APPLE_CC__ + #include + #include + #else + #include + #include + #endif + + #endif + + // Required for compatibility with glext.h style function definitions of + // OpenGL extensions, such as in src/osg/Point.cpp. + #ifndef APIENTRY + #define APIENTRY + #endif +#endif + +// Compiler-specific conditional compilation +#ifdef _MSC_VER // MS Visual C++ + + // Disable various warning. + // 4786: template name too long + #pragma warning( disable : 4251 ) + #pragma warning( disable : 4275 ) + #pragma warning( disable : 4786 ) + + // The following definitions control how symbols are exported. + // If the target is a static library ensure that FTGL_LIBRARY_STATIC + // is defined. If building a dynamic library (ie DLL) ensure the + // FTGL_LIBRARY macro is defined, as it will mark symbols for + // export. If compiling a project to _use_ the _dynamic_ library + // version of the library, no definition is required. + #ifdef FTGL_LIBRARY_STATIC // static lib - no special export required + # define FTGL_EXPORT + #elif FTGL_LIBRARY // dynamic lib - must export/import symbols appropriately. + # define FTGL_EXPORT __declspec(dllexport) + #else + # define FTGL_EXPORT __declspec(dllimport) + #endif + +#else + // Compiler that is not MS Visual C++. + // Ensure that the export symbol is defined (and blank) + #define FTGL_EXPORT +#endif + +#endif // __FTGL__ diff --git a/src/WinLibs/FTGL/include/FTGLBitmapFont.h b/src/WinLibs/FTGL/include/FTGLBitmapFont.h new file mode 100644 index 000000000..3e6aa32fd --- /dev/null +++ b/src/WinLibs/FTGL/include/FTGLBitmapFont.h @@ -0,0 +1,65 @@ +#ifndef __FTGLBitmapFont__ +#define __FTGLBitmapFont__ + +#include "FTFont.h" +#include "FTGL.h" + + +class FTGlyph; + +/** + * FTGLBitmapFont is a specialisation of the FTFont class for handling + * Bitmap fonts + * + * @see FTFont + */ +class FTGL_EXPORT FTGLBitmapFont : public FTFont +{ + public: + /** + * Open and read a font file. Sets Error flag. + * + * @param fontFilePath font file path. + */ + FTGLBitmapFont( const char* fontFilePath); + + /** + * Open and read a font from a buffer in memory. Sets Error flag. + * + * @param pBufferBytes the in-memory buffer + * @param bufferSizeInBytes the length of the buffer in bytes + */ + FTGLBitmapFont( const unsigned char *pBufferBytes, size_t bufferSizeInBytes); + + /** + * Destructor + */ + ~FTGLBitmapFont(); + + /** + * Renders a string of characters + * + * @param string 'C' style string to be output. + */ + void Render( const char* string); + + /** + * Renders a string of characters + * + * @param string 'C' style wide string to be output. + */ + void Render( const wchar_t* string); + + // attributes + + private: + /** + * Construct a FTBitmapGlyph. + * + * @param g The glyph index NOT the char code. + * @return An FTBitmapGlyph or null on failure. + */ + inline virtual FTGlyph* MakeGlyph( unsigned int g); + +}; +#endif // __FTGLBitmapFont__ diff --git a/src/WinLibs/FTGL/include/FTGLExtrdFont.h b/src/WinLibs/FTGL/include/FTGLExtrdFont.h new file mode 100644 index 000000000..d23446192 --- /dev/null +++ b/src/WinLibs/FTGL/include/FTGLExtrdFont.h @@ -0,0 +1,63 @@ +#ifndef __FTGLExtrdFont__ +#define __FTGLExtrdFont__ + +#include "FTFont.h" +#include "FTGL.h" + +class FTGlyph; + +/** + * FTGLExtrdFont is a specialisation of the FTFont class for handling + * extruded Polygon fonts + * + * @see FTFont + * @see FTGLPolygonFont + */ +class FTGL_EXPORT FTGLExtrdFont : public FTFont +{ + public: + /** + * Open and read a font file. Sets Error flag. + * + * @param fontFilePath font file path. + */ + FTGLExtrdFont( const char* fontFilePath); + + /** + * Open and read a font from a buffer in memory. Sets Error flag. + * + * @param pBufferBytes the in-memory buffer + * @param bufferSizeInBytes the length of the buffer in bytes + */ + FTGLExtrdFont( const unsigned char *pBufferBytes, size_t bufferSizeInBytes); + + /** + * Destructor + */ + ~FTGLExtrdFont(); + + /** + * Set the extrusion distance for the font. + * + * @param d The extrusion distance. + */ + void Depth( float d) { depth = d;} + + private: + /** + * Construct a FTPolyGlyph. + * + * @param glyphIndex The glyph index NOT the char code. + * @return An FTExtrdGlyph or null on failure. + */ + inline virtual FTGlyph* MakeGlyph( unsigned int glyphIndex); + + /** + * The extrusion distance for the font. + */ + float depth; +}; + + +#endif // __FTGLExtrdFont__ + diff --git a/src/WinLibs/FTGL/include/FTGLOutlineFont.h b/src/WinLibs/FTGL/include/FTGLOutlineFont.h new file mode 100644 index 000000000..fce7cf574 --- /dev/null +++ b/src/WinLibs/FTGL/include/FTGLOutlineFont.h @@ -0,0 +1,64 @@ +#ifndef __FTGLOutlineFont__ +#define __FTGLOutlineFont__ + + +#include "FTFont.h" +#include "FTGL.h" + +class FTGlyph; + + +/** + * FTGLOutlineFont is a specialisation of the FTFont class for handling + * Vector Outline fonts + * + * @see FTFont + */ +class FTGL_EXPORT FTGLOutlineFont : public FTFont +{ + public: + /** + * Open and read a font file. Sets Error flag. + * + * @param fontFilePath font file path. + */ + FTGLOutlineFont( const char* fontFilePath); + + /** + * Open and read a font from a buffer in memory. Sets Error flag. + * + * @param pBufferBytes the in-memory buffer + * @param bufferSizeInBytes the length of the buffer in bytes + */ + FTGLOutlineFont( const unsigned char *pBufferBytes, size_t bufferSizeInBytes); + + /** + * Destructor + */ + ~FTGLOutlineFont(); + + /** + * Renders a string of characters + * + * @param string 'C' style string to be output. + */ + void Render( const char* string); + + /** + * Renders a string of characters + * + * @param string wchar_t string to be output. + */ + void Render( const wchar_t* string); + + private: + /** + * Construct a FTOutlineGlyph. + * + * @param g The glyph index NOT the char code. + * @return An FTOutlineGlyph or null on failure. + */ + inline virtual FTGlyph* MakeGlyph( unsigned int g); + +}; +#endif // __FTGLOutlineFont__ diff --git a/src/WinLibs/FTGL/include/FTGLPixmapFont.h b/src/WinLibs/FTGL/include/FTGLPixmapFont.h new file mode 100644 index 000000000..053427bf7 --- /dev/null +++ b/src/WinLibs/FTGL/include/FTGLPixmapFont.h @@ -0,0 +1,68 @@ +#ifndef __FTGLPixmapFont__ +#define __FTGLPixmapFont__ + + +#include "FTFont.h" +#include "FTGL.h" + + +class FTGlyph; + + +/** + * FTGLPixmapFont is a specialisation of the FTFont class for handling + * Pixmap (Grey Scale) fonts + * + * @see FTFont + */ +class FTGL_EXPORT FTGLPixmapFont : public FTFont +{ + public: + /** + * Open and read a font file. Sets Error flag. + * + * @param fontFilePath font file path. + */ + FTGLPixmapFont( const char* fontFilePath); + + /** + * Open and read a font from a buffer in memory. Sets Error flag. + * + * @param pBufferBytes the in-memory buffer + * @param bufferSizeInBytes the length of the buffer in bytes + */ + FTGLPixmapFont( const unsigned char *pBufferBytes, size_t bufferSizeInBytes); + + /** + * Destructor + */ + ~FTGLPixmapFont(); + + /** + * Renders a string of characters + * + * @param string 'C' style string to be output. + */ + void Render( const char* string); + + /** + * Renders a string of characters + * + * @param string wchar_t string to be output. + */ + void Render( const wchar_t* string); + + private: + /** + * Construct a FTPixmapGlyph. + * + * @param g The glyph index NOT the char code. + * @return An FTPixmapGlyph or null on failure. + */ + inline virtual FTGlyph* MakeGlyph( unsigned int g); + +}; + + +#endif // __FTGLPixmapFont__ + diff --git a/src/WinLibs/FTGL/include/FTGLPolygonFont.h b/src/WinLibs/FTGL/include/FTGLPolygonFont.h new file mode 100644 index 000000000..3a07de155 --- /dev/null +++ b/src/WinLibs/FTGL/include/FTGLPolygonFont.h @@ -0,0 +1,53 @@ +#ifndef __FTGLPolygonFont__ +#define __FTGLPolygonFont__ + + +#include "FTFont.h" +#include "FTGL.h" + +class FTGlyph; + + +/** + * FTGLPolygonFont is a specialisation of the FTFont class for handling + * tesselated Polygon Mesh fonts + * + * @see FTFont + */ +class FTGL_EXPORT FTGLPolygonFont : public FTFont +{ + public: + /** + * Open and read a font file. Sets Error flag. + * + * @param fontFilePath font file path. + */ + FTGLPolygonFont( const char* fontFilePath); + + /** + * Open and read a font from a buffer in memory. Sets Error flag. + * + * @param pBufferBytes the in-memory buffer + * @param bufferSizeInBytes the length of the buffer in bytes + */ + FTGLPolygonFont( const unsigned char *pBufferBytes, size_t bufferSizeInBytes); + + /** + * Destructor + */ + ~FTGLPolygonFont(); + + private: + /** + * Construct a FTPolyGlyph. + * + * @param g The glyph index NOT the char code. + * @return An FTPolyGlyph or null on failure. + */ + inline virtual FTGlyph* MakeGlyph( unsigned int g); + +}; + + +#endif // __FTGLPolygonFont__ + diff --git a/src/WinLibs/FTGL/include/FTGLTextureFont.h b/src/WinLibs/FTGL/include/FTGLTextureFont.h new file mode 100644 index 000000000..7e97d6cc3 --- /dev/null +++ b/src/WinLibs/FTGL/include/FTGLTextureFont.h @@ -0,0 +1,151 @@ +#ifndef __FTGLTextureFont__ +#define __FTGLTextureFont__ + +#include "FTFont.h" +#include "FTVector.h" +#include "FTGL.h" + +class FTTextureGlyph; + + +/** + * FTGLTextureFont is a specialisation of the FTFont class for handling + * Texture mapped fonts + * + * @see FTFont + */ +class FTGL_EXPORT FTGLTextureFont : public FTFont +{ + public: + /** + * Open and read a font file. Sets Error flag. + * + * @param fontFilePath font file path. + */ + FTGLTextureFont( const char* fontFilePath); + + /** + * Open and read a font from a buffer in memory. Sets Error flag. + * + * @param pBufferBytes the in-memory buffer + * @param bufferSizeInBytes the length of the buffer in bytes + */ + FTGLTextureFont( const unsigned char *pBufferBytes, size_t bufferSizeInBytes); + + /** + * Destructor + */ + virtual ~FTGLTextureFont(); + + /** + * Set the char size for the current face. + * + * @param size the face size in points (1/72 inch) + * @param res the resolution of the target device. + * @return true if size was set correctly + */ + virtual bool FaceSize( const unsigned int size, const unsigned int res = 72); + + /** + * Renders a string of characters + * + * @param string 'C' style string to be output. + */ + virtual void Render( const char* string); + + /** + * Renders a string of characters + * + * @param string wchar_t string to be output. + */ + virtual void Render( const wchar_t* string); + + + private: + /** + * Construct a FTTextureGlyph. + * + * @param glyphIndex The glyph index NOT the char code. + * @return An FTTextureGlyph or null on failure. + */ + inline virtual FTGlyph* MakeGlyph( unsigned int glyphIndex); + + /** + * Get the size of a block of memory required to layout the glyphs + * + * Calculates a width and height based on the glyph sizes and the + * number of glyphs. It over estimates. + */ + inline void CalculateTextureSize(); + + /** + * Creates a 'blank' OpenGL texture object. + * + * The format is GL_ALPHA and the params are + * GL_TEXTURE_WRAP_S = GL_CLAMP + * GL_TEXTURE_WRAP_T = GL_CLAMP + * GL_TEXTURE_MAG_FILTER = GL_LINEAR + * GL_TEXTURE_MIN_FILTER = GL_LINEAR + * Note that mipmapping is NOT used + */ + inline GLuint CreateTexture(); + + /** + * The maximum texture dimension on this OpenGL implemetation + */ + GLsizei maximumGLTextureSize; + + /** + * The minimum texture width required to hold the glyphs + */ + GLsizei textureWidth; + + /** + * The minimum texture height required to hold the glyphs + */ + GLsizei textureHeight; + + /** + *An array of texture ids + */ + FTVector textureIDList; + + /** + * The max height for glyphs in the current font + */ + int glyphHeight; + + /** + * The max width for glyphs in the current font + */ + int glyphWidth; + + /** + * A value to be added to the height and width to ensure that + * glyphs don't overlap in the texture + */ + unsigned int padding; + + /** + * + */ + unsigned int numGlyphs; + + /** + */ + unsigned int remGlyphs; + + /** + */ + int xOffset; + + /** + */ + int yOffset; + +}; + + +#endif // __FTGLTextureFont__ + + diff --git a/src/WinLibs/FTGL/include/FTGlyph.h b/src/WinLibs/FTGL/include/FTGlyph.h new file mode 100644 index 000000000..b4bef0892 --- /dev/null +++ b/src/WinLibs/FTGL/include/FTGlyph.h @@ -0,0 +1,101 @@ +#ifndef __FTGlyph__ +#define __FTGlyph__ + +#include +#include FT_FREETYPE_H +#include FT_GLYPH_H + +#include "FTBBox.h" +#include "FTPoint.h" +#include "FTGL.h" + + +/** + * FTGlyph is the base class for FTGL glyphs. + * + * It provides the interface between Freetype glyphs and their openGL + * renderable counterparts. This is an abstract class and derived classes + * must implement the render function. + * + * @see FTGlyphContainer + * @see FTBBox + * @see FTPoint + * + */ +class FTGL_EXPORT FTGlyph +{ + public: + /** + * Constructor + * + * @param glyph The Freetype glyph to be processed + * @param useDisplayList Enable or disable the use of Display Lists for this glyph + * true turns ON display lists. + * false turns OFF display lists. + */ + FTGlyph( FT_GlyphSlot glyph, bool useDisplayList = true); + + /** + * Destructor + */ + virtual ~FTGlyph(); + + /** + * Renders this glyph at the current pen position. + * + * @param pen The current pen position. + * @return The advance distance for this glyph. + */ + virtual const FTPoint& Render( const FTPoint& pen) = 0; + + /** + * Return the advance width for this glyph. + * + * @return advance width. + */ + const FTPoint& Advance() const { return advance;} + + /** + * Return the bounding box for this glyph. + * + * @return bounding box. + */ + const FTBBox& BBox() const { return bBox;} + + /** + * Queries for errors. + * + * @return The current error code. + */ + FT_Error Error() const { return err;} + + protected: + /** + * The advance distance for this glyph + */ + FTPoint advance; + + /** + * The bounding box of this glyph. + */ + FTBBox bBox; + + /** + * Flag to enable or disable the use of Display Lists inside FTGL + * true turns ON display lists. + * false turns OFF display lists. + */ + bool useDisplayList; + + /** + * Current error code. Zero means no error. + */ + FT_Error err; + + private: + +}; + + +#endif // __FTGlyph__ + diff --git a/src/WinLibs/FTGL/include/FTGlyphContainer.h b/src/WinLibs/FTGL/include/FTGlyphContainer.h new file mode 100644 index 000000000..de668b61d --- /dev/null +++ b/src/WinLibs/FTGL/include/FTGlyphContainer.h @@ -0,0 +1,127 @@ +#ifndef __FTGlyphContainer__ +#define __FTGlyphContainer__ + +#include +#include FT_FREETYPE_H +#include FT_GLYPH_H + +#include "FTGL.h" +#include "FTBBox.h" +#include "FTPoint.h" +#include "FTVector.h" + +class FTFace; +class FTGlyph; +class FTCharmap; + +/** + * FTGlyphContainer holds the post processed FTGlyph objects. + * + * @see FTGlyph + */ +class FTGL_EXPORT FTGlyphContainer +{ + typedef FTVector GlyphVector; + public: + /** + * Constructor + * + * @param face The Freetype face + */ + FTGlyphContainer( FTFace* face); + + /** + * Destructor + */ + ~FTGlyphContainer(); + + /** + * Sets the character map for the face. + * + * @param encoding the Freetype encoding symbol. See above. + * @return true if charmap was valid + * and set correctly + */ + bool CharMap( FT_Encoding encoding); + + /** + * Get the font index of the input character. + * + * @param characterCode The character code of the requested glyph in the + * current encoding eg apple roman. + * @return The font index for the character. + */ + unsigned int FontIndex( const unsigned int characterCode ) const; + + /** + * Adds a glyph to this glyph list. + * + * @param glyph The FTGlyph to be inserted into the container + * @param characterCode The char code of the glyph NOT the glyph index. + */ + void Add( FTGlyph* glyph, const unsigned int characterCode); + + /** + * Get a glyph from the glyph list + * + * @param characterCode The char code of the glyph NOT the glyph index + * @return An FTGlyph or null is it hasn't been + * loaded. + */ + const FTGlyph* const Glyph( const unsigned int characterCode) const; + + /** + * Get the bounding box for a character. + * @param characterCode The char code of the glyph NOT the glyph index + */ + FTBBox BBox( const unsigned int characterCode) const; + + /** + * Returns the kerned advance width for a glyph. + * + * @param characterCode glyph index of the character + * @param nextCharacterCode the next glyph in a string + * @return advance width + */ + float Advance( const unsigned int characterCode, const unsigned int nextCharacterCode); + + /** + * Renders a character + * @param characterCode the glyph to be Rendered + * @param nextCharacterCode the next glyph in the string. Used for kerning. + * @param penPosition the position to Render the glyph + * @return The distance to advance the pen position after Rendering + */ + FTPoint Render( const unsigned int characterCode, const unsigned int nextCharacterCode, FTPoint penPosition); + + /** + * Queries the Font for errors. + * + * @return The current error code. + */ + FT_Error Error() const { return err;} + + private: + /** + * The FTGL face + */ + FTFace* face; + + /** + * The Character Map object associated with the current face + */ + FTCharmap* charMap; + + /** + * A structure to hold the glyphs + */ + GlyphVector glyphs; + + /** + * Current error code. Zero means no error. + */ + FT_Error err; +}; + + +#endif // __FTGlyphContainer__ diff --git a/src/WinLibs/FTGL/include/FTLibrary.h b/src/WinLibs/FTGL/include/FTLibrary.h new file mode 100644 index 000000000..e4f53f548 --- /dev/null +++ b/src/WinLibs/FTGL/include/FTLibrary.h @@ -0,0 +1,97 @@ +#ifndef __FTLibrary__ +#define __FTLibrary__ + +#include +#include FT_FREETYPE_H +//#include FT_CACHE_H + +#include "FTGL.h" + + +/** + * FTLibrary class is the global accessor for the Freetype library. + * + * This class encapsulates the Freetype Library. This is a singleton class + * and ensures that only one FT_Library is in existence at any one time. + * All constructors are private therefore clients cannot create or + * instantiate this class themselves and must access it's methods via the + * static FTLibrary::Instance() function. + * + * Just because this class returns a valid FTLibrary object + * doesn't mean that the Freetype Library has been successfully initialised. + * Clients should check for errors. You can initialse the library AND check + * for errors using the following code... + * err = FTLibrary::Instance().Error(); + * + * @see "Freetype 2 Documentation" + * + */ +class FTGL_EXPORT FTLibrary +{ + public: + /** + * Global acces point to the single FTLibrary object. + * + * @return The global FTLibrary object. + */ + static const FTLibrary& Instance(); + + /** + * Gets a pointer to the native Freetype library. + * + * @return A handle to a FreeType library instance. + */ + const FT_Library* const GetLibrary() const { return library;} + + /** + * Queries the library for errors. + * + * @return The current error code. + */ + FT_Error Error() const { return err;} + + /** + * Destructor + * + * Disposes of the Freetype library + */ + ~FTLibrary(); + + private: + /** + * Default constructors. + * + * Made private to stop clients creating there own FTLibrary + * objects. + */ + FTLibrary(); + FTLibrary( const FT_Library&){} + FTLibrary& operator=( const FT_Library&) { return *this; } + + /** + * Initialises the Freetype library + * + * Even though this function indicates success via the return value, + * clients can't see this so must check the error codes. This function + * is only ever called by the default c_stor + * + * @return true if the Freetype library was + * successfully initialised, false + * otherwise. + */ + bool Initialise(); + + /** + * Freetype library handle. + */ + FT_Library* library; +// FTC_Manager* manager; + + /** + * Current error code. Zero means no error. + */ + FT_Error err; + +}; + +#endif // __FTLibrary__ diff --git a/src/WinLibs/FTGL/include/FTList.h b/src/WinLibs/FTGL/include/FTList.h new file mode 100644 index 000000000..349921681 --- /dev/null +++ b/src/WinLibs/FTGL/include/FTList.h @@ -0,0 +1,112 @@ +#ifndef __FTList__ +#define __FTList__ + +#include "FTGL.h" + +/** +* Provides a non-STL alternative to the STL list + */ +template +class FTGL_EXPORT FTList +{ + public: + typedef FT_LIST_ITEM_TYPE value_type; + typedef value_type& reference; + typedef const value_type& const_reference; + typedef size_t size_type; + + /** + * Constructor + */ + FTList() + : listSize(0), + tail(0) + { + tail = NULL; + head = new Node; + } + + /** + * Destructor + */ + ~FTList() + { + Node* next; + + for( Node *walk = head; walk; walk = next) + { + next = walk->next; + delete walk; + } + } + + /** + * Get the number of items in the list + */ + size_type size() const + { + return listSize; + } + + /** + * Add an item to the end of the list + */ + void push_back( const value_type& item) + { + Node* node = new Node( item); + + if( head->next == NULL) + { + head->next = node; + } + + if( tail) + { + tail->next = node; + } + tail = node; + ++listSize; + } + + /** + * Get the item at the front of the list + */ + reference front() const + { + return head->next->payload; + } + + /** + * Get the item at the end of the list + */ + reference back() const + { + return tail->payload; + } + + private: + struct Node + { + Node() + : next(NULL) + {} + + Node( const value_type& item) + : next(NULL) + { + payload = item; + } + + Node* next; + + value_type payload; + }; + + size_type listSize; + + Node* head; + Node* tail; +}; + +#endif // __FTList__ + diff --git a/src/WinLibs/FTGL/include/FTOutlineGlyph.h b/src/WinLibs/FTGL/include/FTOutlineGlyph.h new file mode 100644 index 000000000..3e3578c32 --- /dev/null +++ b/src/WinLibs/FTGL/include/FTOutlineGlyph.h @@ -0,0 +1,57 @@ +#ifndef __FTOutlineGlyph__ +#define __FTOutlineGlyph__ + +#include +#include FT_FREETYPE_H +#include FT_GLYPH_H + +#include "FTGL.h" +#include "FTGlyph.h" + +class FTVectoriser; + + +/** + * FTOutlineGlyph is a specialisation of FTGlyph for creating outlines. + * + * @see FTGlyphContainer + * @see FTVectoriser + * + */ +class FTGL_EXPORT FTOutlineGlyph : public FTGlyph +{ + public: + /** + * Constructor. Sets the Error to Invalid_Outline if the glyphs isn't an outline. + * + * @param glyph The Freetype glyph to be processed + * @param useDisplayList Enable or disable the use of Display Lists for this glyph + * true turns ON display lists. + * false turns OFF display lists. + */ + FTOutlineGlyph( FT_GlyphSlot glyph, bool useDisplayList); + + /** + * Destructor + */ + virtual ~FTOutlineGlyph(); + + /** + * Renders this glyph at the current pen position. + * + * @param pen The current pen position. + * @return The advance distance for this glyph. + */ + virtual const FTPoint& Render( const FTPoint& pen); + + private: + /** + * OpenGL display list + */ + GLuint glList; + +}; + + +#endif // __FTOutlineGlyph__ + diff --git a/src/WinLibs/FTGL/include/FTPixmapGlyph.h b/src/WinLibs/FTGL/include/FTPixmapGlyph.h new file mode 100644 index 000000000..503934682 --- /dev/null +++ b/src/WinLibs/FTGL/include/FTPixmapGlyph.h @@ -0,0 +1,68 @@ +#ifndef __FTPixmapGlyph__ +#define __FTPixmapGlyph__ + + +#include +#include FT_FREETYPE_H +#include FT_GLYPH_H + +#include "FTGL.h" +#include "FTGlyph.h" + + +/** + * FTPixmapGlyph is a specialisation of FTGlyph for creating pixmaps. + * + * @see FTGlyphContainer + * + */ +class FTGL_EXPORT FTPixmapGlyph : public FTGlyph +{ + public: + /** + * Constructor + * + * @param glyph The Freetype glyph to be processed + */ + FTPixmapGlyph( FT_GlyphSlot glyph); + + /** + * Destructor + */ + virtual ~FTPixmapGlyph(); + + /** + * Renders this glyph at the current pen position. + * + * @param pen The current pen position. + * @return The advance distance for this glyph. + */ + virtual const FTPoint& Render( const FTPoint& pen); + + // attributes + + private: + /** + * The width of the glyph 'image' + */ + int destWidth; + + /** + * The height of the glyph 'image' + */ + int destHeight; + + /** + * Vector from the pen position to the topleft corner of the pixmap + */ + FTPoint pos; + + /** + * Pointer to the 'image' data + */ + unsigned char* data; + +}; + + +#endif // __FTPixmapGlyph__ diff --git a/src/WinLibs/FTGL/include/FTPoint.h b/src/WinLibs/FTGL/include/FTPoint.h new file mode 100644 index 000000000..13d25a587 --- /dev/null +++ b/src/WinLibs/FTGL/include/FTPoint.h @@ -0,0 +1,162 @@ +#ifndef __FTPoint__ +#define __FTPoint__ + +#include +#include FT_FREETYPE_H +#include FT_GLYPH_H + +#include "FTGL.h" + +/** + * FTPoint class is a basic 3 dimensional point or vector. + */ +class FTGL_EXPORT FTPoint +{ + public: + /** + * Default constructor. Point is set to zero. + */ + FTPoint() + { + values[0] = 0; + values[1] = 0; + values[2] = 0; + } + + /** + * Constructor. + * + * @param x First component + * @param y Second component + * @param z Third component + */ + FTPoint( const FTGL_DOUBLE x, const FTGL_DOUBLE y, const FTGL_DOUBLE z) + { + values[0] = x; + values[1] = y; + values[2] = z; + } + + /** + * Constructor. This converts an FT_Vector to an FT_Point + * + * @param ft_vector A freetype vector + */ + FTPoint( const FT_Vector& ft_vector) + { + values[0] = ft_vector.x; + values[1] = ft_vector.y; + values[2] = 0; + } + + /** + * Operator += In Place Addition. + * + * @param point + * @return this plus point. + */ + FTPoint& operator += ( const FTPoint& point) + { + values[0] += point.values[0]; + values[1] += point.values[1]; + values[2] += point.values[2]; + + return *this; + } + + /** + * Operator + + * + * @param point + * @return this plus point. + */ + FTPoint operator + ( const FTPoint& point) + { + FTPoint temp; + temp.values[0] = values[0] + point.values[0]; + temp.values[1] = values[1] + point.values[1]; + temp.values[2] = values[2] + point.values[2]; + + return temp; + } + + + /** + * Operator * + * + * @param multiplier + * @return this multiplied by multiplier. + */ + FTPoint operator * ( double multiplier) + { + FTPoint temp; + temp.values[0] = values[0] * multiplier; + temp.values[1] = values[1] * multiplier; + temp.values[2] = values[2] * multiplier; + + return temp; + } + + + /** + * Operator * + * + * @param point + * @param multiplier + * @return multiplier multiplied by point. + */ + friend FTPoint operator*( double multiplier, FTPoint& point); + + + /** + * Operator == Tests for eqaulity + * + * @param a + * @param b + * @return true if a & b are equal + */ + friend bool operator == ( const FTPoint &a, const FTPoint &b); + + /** + * Operator != Tests for non equality + * + * @param a + * @param b + * @return true if a & b are not equal + */ + friend bool operator != ( const FTPoint &a, const FTPoint &b); + + + /** + * Cast to FTGL_DOUBLE* + */ + operator const FTGL_DOUBLE*() const + { + return values; + } + + + /** + * Setters + */ + void X( FTGL_DOUBLE x) { values[0] = x;}; + void Y( FTGL_DOUBLE y) { values[1] = y;}; + void Z( FTGL_DOUBLE z) { values[2] = z;}; + + + /** + * Getters + */ + FTGL_DOUBLE X() const { return values[0];}; + FTGL_DOUBLE Y() const { return values[1];}; + FTGL_DOUBLE Z() const { return values[2];}; + + private: + /** + * The point data + */ + FTGL_DOUBLE values[3]; +}; + +#endif // __FTPoint__ + diff --git a/src/WinLibs/FTGL/include/FTPolyGlyph.h b/src/WinLibs/FTGL/include/FTPolyGlyph.h new file mode 100644 index 000000000..9cd3dcf55 --- /dev/null +++ b/src/WinLibs/FTGL/include/FTPolyGlyph.h @@ -0,0 +1,59 @@ +#ifndef __FTPolyGlyph__ +#define __FTPolyGlyph__ + + +#include +#include FT_FREETYPE_H +#include FT_GLYPH_H + +#include "FTGL.h" +#include "FTGlyph.h" + +class FTVectoriser; + +/** + * FTPolyGlyph is a specialisation of FTGlyph for creating tessellated + * polygon glyphs. + * + * @see FTGlyphContainer + * @see FTVectoriser + * + */ +class FTGL_EXPORT FTPolyGlyph : public FTGlyph +{ + public: + /** + * Constructor. Sets the Error to Invalid_Outline if the glyphs isn't an outline. + * + * @param glyph The Freetype glyph to be processed + * @param glyph The Freetype glyph to be processed + * @param useDisplayList Enable or disable the use of Display Lists for this glyph + * true turns ON display lists. + * false turns OFF display lists. + */ + FTPolyGlyph( FT_GlyphSlot glyph, bool useDisplayList); + + /** + * Destructor + */ + virtual ~FTPolyGlyph(); + + /** + * Renders this glyph at the current pen position. + * + * @param pen The current pen position. + * @return The advance distance for this glyph. + */ + virtual const FTPoint& Render( const FTPoint& pen); + + private: + /** + * OpenGL display list + */ + GLuint glList; + +}; + + +#endif // __FTPolyGlyph__ + diff --git a/src/WinLibs/FTGL/include/FTSize.h b/src/WinLibs/FTGL/include/FTSize.h new file mode 100644 index 000000000..d18d70eb0 --- /dev/null +++ b/src/WinLibs/FTGL/include/FTSize.h @@ -0,0 +1,138 @@ +#ifndef __FTSize__ +#define __FTSize__ + + +#include +#include FT_FREETYPE_H + +#include "FTGL.h" + + + +/** + * FTSize class provides an abstraction layer for the Freetype Size. + * + * @see "Freetype 2 Documentation" + * + */ +class FTGL_EXPORT FTSize +{ + public: + /** + * Default Constructor + */ + FTSize(); + + /** + * Destructor + */ + virtual ~FTSize(); + + /** + * Sets the char size for the current face. + * + * This doesn't guarantee that the size was set correctly. Clients + * should check errors. + * + * @param face Parent face for this size object + * @param point_size the face size in points (1/72 inch) + * @param x_resolution the horizontal resolution of the target device. + * @param y_resolution the vertical resolution of the target device. + * @return true if the size has been set. Clients should check Error() for more information if this function returns false() + */ + bool CharSize( FT_Face* face, unsigned int point_size, unsigned int x_resolution, unsigned int y_resolution); + + /** + * get the char size for the current face. + * + * @return The char size in points + */ + unsigned int CharSize() const; + + /** + * Gets the global ascender height for the face in pixels. + * + * @return Ascender height + */ + float Ascender() const; + + /** + * Gets the global descender height for the face in pixels. + * + * @return Ascender height + */ + float Descender() const; + + /** + * Gets the global face height for the face. + * + * If the face is scalable this returns the height of the global + * bounding box which ensures that any glyph will be less than or + * equal to this height. If the font isn't scalable there is no + * guarantee that glyphs will not be taller than this value. + * + * @return height in pixels. + */ + float Height() const; + + /** + * Gets the global face width for the face. + * + * If the face is scalable this returns the width of the global + * bounding box which ensures that any glyph will be less than or + * equal to this width. If the font isn't scalable this value is + * the max_advance for the face. + * + * @return width in pixels. + */ + float Width() const; + + /** + * Gets the underline position for the face. + * + * @return underline position in pixels + */ + float Underline() const; + + /** + * Queries for errors. + * + * @return The current error code. + */ + FT_Error Error() const { return err; } + + private: + /** + * The current Freetype face that this FTSize object relates to. + */ + FT_Face* ftFace; + + /** + * The Freetype size. + */ + FT_Size ftSize; + + /** + * The size in points. + */ + unsigned int size; + + /** + * The horizontal resolution. + */ + unsigned int xResolution; + + /** + * The vertical resolution. + */ + unsigned int yResolution; + + /** + * Current error code. Zero means no error. + */ + FT_Error err; + +}; + +#endif // __FTSize__ + diff --git a/src/WinLibs/FTGL/include/FTTextureGlyph.h b/src/WinLibs/FTGL/include/FTTextureGlyph.h new file mode 100644 index 000000000..c263f7262 --- /dev/null +++ b/src/WinLibs/FTGL/include/FTTextureGlyph.h @@ -0,0 +1,94 @@ +#ifndef __FTTextureGlyph__ +#define __FTTextureGlyph__ + + +#include +#include FT_FREETYPE_H +#include FT_GLYPH_H + +#include "FTGL.h" +#include "FTGlyph.h" + + +/** + * FTTextureGlyph is a specialisation of FTGlyph for creating texture + * glyphs. + * + * @see FTGlyphContainer + * + */ +class FTGL_EXPORT FTTextureGlyph : public FTGlyph +{ + public: + /** + * Constructor + * + * @param glyph The Freetype glyph to be processed + * @param id The id of the texture that this glyph will be + * drawn in + * @param xOffset The x offset into the parent texture to draw + * this glyph + * @param yOffset The y offset into the parent texture to draw + * this glyph + * @param width The width of the parent texture + * @param height The height (number of rows) of the parent texture + */ + FTTextureGlyph( FT_GlyphSlot glyph, int id, int xOffset, int yOffset, GLsizei width, GLsizei height); + + /** + * Destructor + */ + virtual ~FTTextureGlyph(); + + /** + * Renders this glyph at the current pen position. + * + * @param pen The current pen position. + * @return The advance distance for this glyph. + */ + virtual const FTPoint& Render( const FTPoint& pen); + + /** + * Reset the currently active texture to zero to get into a known state before + * drawing a string. This is to get round possible threading issues. + */ + static void FTTextureGlyph::ResetActiveTexture(){ activeTextureID = 0;} + + private: + /** + * The width of the glyph 'image' + */ + int destWidth; + + /** + * The height of the glyph 'image' + */ + int destHeight; + + /** + * Vector from the pen position to the topleft corner of the pixmap + */ + FTPoint pos; + + /** + * The texture co-ords of this glyph within the texture. + */ + FTPoint uv[2]; + + /** + * The texture index that this glyph is contained in. + */ + int glTextureID; + + /** + * The texture index of the currently active texture + * + * We keep track of the currently active texture to try to reduce the number + * of texture bind operations. + */ + static GLint activeTextureID; + +}; + + +#endif // __FTTextureGlyph__ diff --git a/src/WinLibs/FTGL/include/FTVector.h b/src/WinLibs/FTGL/include/FTVector.h new file mode 100644 index 000000000..6147f522c --- /dev/null +++ b/src/WinLibs/FTGL/include/FTVector.h @@ -0,0 +1,190 @@ +#ifndef __FTVector__ +#define __FTVector__ + +#include "FTGL.h" + +/** + * Provides a non-STL alternative to the STL vector + */ +template +class FTGL_EXPORT FTVector +{ + public: + typedef FT_VECTOR_ITEM_TYPE value_type; + typedef value_type& reference; + typedef const value_type& const_reference; + typedef value_type* iterator; + typedef const value_type* const_iterator; + typedef size_t size_type; + + FTVector() + { + Capacity = Size = 0; + Items = 0; + } + + + virtual ~FTVector() + { + clear(); + } + + FTVector& operator =(const FTVector& v) + { + reserve(v.capacity()); + + iterator ptr = begin(); + const_iterator vbegin = v.begin(); + const_iterator vend = v.end(); + + while( vbegin != vend) + { + *ptr++ = *vbegin++; + } + + Size = v.size(); + return *this; + } + + size_type size() const + { + return Size; + } + + size_type capacity() const + { + return Capacity; + } + + iterator begin() + { + return Items; + } + + const_iterator begin() const + { + return Items; + } + + iterator end() + { + return begin() + size(); + } + + const_iterator end() const + { + return begin() + size(); + } + + bool empty() const + { + return size() == 0; + } + + reference operator [](size_type pos) + { + return( *(begin() + pos)); + } + + const_reference operator []( size_type pos) const + { + return( *(begin() + pos)); + } + + void clear() + { + if( Capacity) + { + delete [] Items; + Capacity = Size = 0; + Items = 0; + } + } + + void reserve( size_type n) + { + if( capacity() < n) + { + expand(n); + } + } + + void push_back(const value_type& x) + { + if( size() == capacity()) + { + expand(); + } + + ( *this)[size()] = x; + ++Size; + } + + void resize(size_type n, value_type x) + { + if( n == size()) + { + return; + } + + reserve(n); + iterator begin, end; + + if( n >= Size) + { + begin = this->end(); + end = this->begin() + n; + } + else + { + begin = this->begin() + n; + end = this->end(); + } + + while( begin != end) + { + *begin++ = x; + } + + Size = n; + } + + + private: + void expand(size_type capacity_hint = 0) + { + size_type new_capacity =( capacity() == 0) ? 256 : capacity()* 2; + if( capacity_hint) + { + while( new_capacity < capacity_hint) + { + new_capacity *= 2; + } + } + + value_type *new_items = new value_type[new_capacity]; + + iterator begin = this->begin(); + iterator end = this->end(); + value_type *ptr = new_items; + + while( begin != end) + { + *ptr++ = *begin++; + } + + if( Capacity) + { + delete [] Items; + } + + Items = new_items; + Capacity = new_capacity; + } + + size_type Capacity; + size_type Size; + value_type* Items; +}; + +#endif // __FTVector__ diff --git a/src/WinLibs/FTGL/include/FTVectoriser.h b/src/WinLibs/FTGL/include/FTVectoriser.h new file mode 100644 index 000000000..e2d54ee71 --- /dev/null +++ b/src/WinLibs/FTGL/include/FTVectoriser.h @@ -0,0 +1,275 @@ +#ifndef __FTVectoriser__ +#define __FTVectoriser__ + + +#include "FTContour.h" +#include "FTList.h" +#include "FTPoint.h" +#include "FTVector.h" +#include "FTGL.h" + + +#ifndef CALLBACK +#define CALLBACK +#endif + + +/** + * FTTesselation captures points that are output by OpenGL's gluTesselator. + */ +class FTGL_EXPORT FTTesselation +{ + public: + /** + * Default constructor + */ + FTTesselation( GLenum m) + : meshType(m) + { + pointList.reserve( 128); + } + + /** + * Destructor + */ + ~FTTesselation() + { + pointList.clear(); + } + + /** + * Add a point to the mesh. + */ + void AddPoint( const FTGL_DOUBLE x, const FTGL_DOUBLE y, const FTGL_DOUBLE z) + { + pointList.push_back( FTPoint( x, y, z)); + } + + /** + * The number of points in this mesh + */ + size_t PointCount() const { return pointList.size();} + + /** + * + */ + const FTPoint& Point( unsigned int index) const { return pointList[index];} + + /** + * Return the OpenGL polygon type. + */ + GLenum PolygonType() const { return meshType;} + + private: + /** + * Points generated by gluTesselator. + */ + typedef FTVector PointVector; + PointVector pointList; + + /** + * OpenGL primitive type from gluTesselator. + */ + GLenum meshType; +}; + + +/** + * FTMesh is a container of FTTesselation's that make up a polygon glyph + */ +class FTGL_EXPORT FTMesh +{ + typedef FTVector TesselationVector; + typedef FTList PointList; + + public: + /** + * Default constructor + */ + FTMesh(); + + /** + * Destructor + */ + ~FTMesh(); + + /** + * Add a point to the mesh + */ + void AddPoint( const FTGL_DOUBLE x, const FTGL_DOUBLE y, const FTGL_DOUBLE z); + + /** + * Create a combine point for the gluTesselator + */ + const FTGL_DOUBLE* Combine( const FTGL_DOUBLE x, const FTGL_DOUBLE y, const FTGL_DOUBLE z); + + /** + * Begin a new polygon + */ + void Begin( GLenum meshType); + + /** + * End a polygon + */ + void End(); + + /** + * Record a gluTesselation error + */ + void Error( GLenum e) { err = e;} + + /** + * The number of tesselations in the mesh + */ + unsigned int TesselationCount() const { return tesselationList.size();} + + /** + * Get a tesselation by index + */ + const FTTesselation* const Tesselation( unsigned int index) const; + + /** + * Return the temporary point list. For testing only. + */ + const PointList& TempPointList() const { return tempPointList;} + + /** + * Get the GL ERROR returned by the glu tesselator + */ + GLenum Error() const { return err;} + + private: + /** + * The current sub mesh that we are constructing. + */ + FTTesselation* currentTesselation; + + /** + * Holds each sub mesh that comprises this glyph. + */ + TesselationVector tesselationList; + + /** + * Holds extra points created by gluTesselator. See ftglCombine. + */ + PointList tempPointList; + + /** + * GL ERROR returned by the glu tesselator + */ + GLenum err; + +}; + +const FTGL_DOUBLE FTGL_FRONT_FACING = 1.0; +const FTGL_DOUBLE FTGL_BACK_FACING = -1.0; + +/** + * FTVectoriser class is a helper class that converts font outlines into + * point data. + * + * @see FTExtrdGlyph + * @see FTOutlineGlyph + * @see FTPolyGlyph + * @see FTContour + * @see FTPoint + * + */ +class FTGL_EXPORT FTVectoriser +{ + public: + /** + * Constructor + * + * @param glyph The freetype glyph to be processed + */ + FTVectoriser( const FT_GlyphSlot glyph); + + /** + * Destructor + */ + virtual ~FTVectoriser(); + + /** + * Build an FTMesh from the vector outline data. + * + * @param zNormal The direction of the z axis of the normal + * for this mesh + */ + void MakeMesh( FTGL_DOUBLE zNormal = FTGL_FRONT_FACING); + + /** + * Get the current mesh. + */ + const FTMesh* const GetMesh() const { return mesh;} + + /** + * Get the total count of points in this outline + * + * @return the number of points + */ + size_t PointCount(); + + /** + * Get the count of contours in this outline + * + * @return the number of contours + */ + size_t ContourCount() const { return ftContourCount;} + + /** + * Return a contour at index + * + * @return the number of contours + */ + const FTContour* const Contour( unsigned int index) const; + + /** + * Get the number of points in a specific contour in this outline + * + * @param c The contour index + * @return the number of points in contour[c] + */ + size_t ContourSize( int c) const { return contourList[c]->PointCount();} + + /** + * Get the flag for the tesselation rule for this outline + * + * @return The contour flag + */ + int ContourFlag() const { return contourFlag;} + + private: + /** + * Process the freetype outline data into contours of points + */ + void ProcessContours(); + + /** + * The list of contours in the glyph + */ + FTContour** contourList; + + /** + * A Mesh for tesselations + */ + FTMesh* mesh; + + /** + * The number of contours reported by Freetype + */ + short ftContourCount; + + /** + * A flag indicating the tesselation rule for the glyph + */ + int contourFlag; + + /** + * A Freetype outline + */ + FT_Outline outline; +}; + + +#endif // __FTVectoriser__ diff --git a/src/WinLibs/FTGL/license.txt b/src/WinLibs/FTGL/license.txt new file mode 100644 index 000000000..b9fd0dbb5 --- /dev/null +++ b/src/WinLibs/FTGL/license.txt @@ -0,0 +1,27 @@ +FTGL + +Herewith is a license. I've also chucked in a gnu (see COPYING.txt) license +for those that are that way inclined. Basically I want you to use this +software and if you think this license is preventing you from doing so +let me know. + +Copyright (C) 2001-3 Henry Maddocks + +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. diff --git a/src/WinLibs/FTGL/mac/FTGL.xcode/henry.mode1 b/src/WinLibs/FTGL/mac/FTGL.xcode/henry.mode1 new file mode 100644 index 000000000..69e4ec8c6 --- /dev/null +++ b/src/WinLibs/FTGL/mac/FTGL.xcode/henry.mode1 @@ -0,0 +1,1350 @@ + + + + + ActivePerspectiveName + Project + AllowedModules + + + BundleLoadPath + + MaxInstances + n + Module + PBXSmartGroupTreeModule + Name + Groups and Files Outline View + + + BundleLoadPath + + MaxInstances + n + Module + PBXNavigatorGroup + Name + Editor + + + BundleLoadPath + + MaxInstances + n + Module + XCTaskListModule + Name + Task List + + + BundleLoadPath + + MaxInstances + n + Module + XCDetailModule + Name + File and Smart Group Detail Viewer + + + BundleLoadPath + + MaxInstances + 1 + Module + PBXBuildResultsModule + Name + Detailed Build Results Viewer + + + BundleLoadPath + + MaxInstances + 1 + Module + PBXProjectFindModule + Name + Project Batch Find Tool + + + BundleLoadPath + + MaxInstances + n + Module + PBXRunSessionModule + Name + Run Log + + + BundleLoadPath + + MaxInstances + n + Module + PBXBookmarksModule + Name + Bookmarks Tool + + + BundleLoadPath + + MaxInstances + n + Module + PBXClassBrowserModule + Name + Class Browser + + + BundleLoadPath + + MaxInstances + n + Module + PBXCVSModule + Name + Source Code Control Tool + + + BundleLoadPath + + MaxInstances + n + Module + PBXDebugBreakpointsModule + Name + Debug Breakpoints Tool + + + BundleLoadPath + + MaxInstances + n + Module + XCDockableInspector + Name + Inspector + + + BundleLoadPath + + MaxInstances + n + Module + PBXOpenQuicklyModule + Name + Open Quickly Tool + + + BundleLoadPath + + MaxInstances + 1 + Module + PBXDebugSessionModule + Name + Debugger + + + BundleLoadPath + + MaxInstances + 1 + Module + PBXDebugCLIModule + Name + Debug Console + + + Description + This workspace mimics that found in Xcode 1.2, with various minor improvements such as including attached editors to the build results window and the project find window. + DockingSystemVisible + + Extension + mode1 + FirstTimeWindowDisplayed + + Identifier + com.apple.perspectives.project.mode1 + MajorVersion + 31 + MinorVersion + 0 + Name + Default Workspace + Notifications + + OpenEditors + + Perspectives + + + ChosenToolbarItems + + active-target-popup + active-buildstyle-popup + action + NSToolbarFlexibleSpaceItem + servicesModulerun + buildOrClean + build-and-runOrDebug + com.apple.ide.PBXToolbarStopButton + get-info + toggle-editor + NSToolbarFlexibleSpaceItem + com.apple.pbx.toolbar.searchfield + + ControllerClassBaseName + + IconName + WindowOfProject + Identifier + perspective.project + IsVertical + + Layout + + + BecomeActive + + ContentConfiguration + + PBXBottomSmartGroupGIDs + + 1C37FBAC04509CD000000102 + 1C37FAAC04509CD000000102 + 1C08E77C0454961000C914BD + 1C37FABC05509CD000000102 + 1C37FABC05539CD112110102 + E2644B35053B69B200211256 + 1C37FABC04509CD000100104 + 1CC0EA4004350EF90044410B + 1CC0EA4004350EF90041110B + + PBXProjectModuleGUID + 1CE0B1FE06471DED0097A5F4 + PBXProjectModuleLabel + Files + PBXProjectStructureProvided + yes + PBXSmartGroupTreeModuleColumnData + + PBXSmartGroupTreeModuleColumnWidthsKey + + 22 + 22 + 211 + + PBXSmartGroupTreeModuleColumnsKey_v4 + + SCMStatusColumn + TargetStatusColumn + MainColumn + + + PBXSmartGroupTreeModuleOutlineStateKey_v7 + + PBXSmartGroupTreeModuleOutlineStateExpansionKey + + BA63B0BC06D1C62B00CD5F16 + 1C37FBAC04509CD000000102 + + PBXSmartGroupTreeModuleOutlineStateSelectionKey + + + 0 + + + PBXSmartGroupTreeModuleOutlineStateVisibleRectKey + {{0, 0}, {255, 712}} + + PBXTopSmartGroupGIDs + + + GeometryConfiguration + + Frame + {{0, 0}, {272, 730}} + GroupTreeTableConfiguration + + SCMStatusColumn + 22 + TargetStatusColumn + 22 + MainColumn + 211 + + RubberWindowFrame + 0 60 1280 772 0 0 1280 832 + + Module + PBXSmartGroupTreeModule + Proportion + 272pt + + + Dock + + + ContentConfiguration + + PBXProjectModuleGUID + 1CE0B20306471E060097A5F4 + PBXProjectModuleLabel + FTVectoriser.cpp + PBXSplitModuleInNavigatorKey + + Split0 + + PBXProjectModuleGUID + 1CE0B20406471E060097A5F4 + PBXProjectModuleLabel + FTVectoriser.cpp + bookmark + BAB886C9076A513000E15DEF + history + + BAA7C11C071CC20F00B139B5 + BA514271071DCFA400479336 + BA51427A071DD02B00479336 + BA514283071DD60600479336 + BA5142C8071E034800479336 + BA9EEBA7071F71A100DA4FC6 + BAF9DE3B0721E76900698F3A + BAF9DE970721EBE300698F3A + BAF9DEF20721F26200698F3A + BAF9DEF30721F26200698F3A + BAF9DEF70721F26200698F3A + BAF9DEF80721F26200698F3A + BAF9DEF90721F26200698F3A + BAF9DEFA0721F26200698F3A + BAF9DEFB0721F26200698F3A + BAF9DEFD0721F26200698F3A + BAF9DEFF0721F26200698F3A + BAF9DF000721F26200698F3A + BAF9DF020721F26200698F3A + BAF9DF380721F4CC00698F3A + BAF9DF4C0722064A00698F3A + BAF9DF5C0722070100698F3A + BA6A383C07261AE2006BFEAE + BAE83F4907289E59007C557D + BAE83F4A07289E59007C557D + BA1F9BEC072F06F400EE6DC2 + BA711EC5073587C600B5EF8E + BA49A362074981D200A87295 + BA579C10076306ED00F095FF + BA579C170763078900F095FF + BA579C1E07630C6100F095FF + BA579C2E07630D1500F095FF + BA4BA79707646A5C006E3FE1 + BA9E7A1D0764F73200AF32B6 + BA9E7A300764F8B100AF32B6 + BA9E7B2C0765120600AF32B6 + BA9E7B2E0765120600AF32B6 + BA9E7B2F0765120600AF32B6 + BA9E7B570765137500AF32B6 + BA9E7DC607654D7200AF32B6 + BA877F8A076644DA00FEB55B + BA877F9D0766460000FEB55B + BA877F9E0766460000FEB55B + BAB886C00769A94B00E15DEF + BAB886C10769A94B00E15DEF + + prevStack + + BAA7C11E071CC20F00B139B5 + BAA7C127071CC2DF00B139B5 + BAA7C128071CC2DF00B139B5 + BAA7C131071CC30800B139B5 + BA514277071DCFA400479336 + BA51427C071DD02B00479336 + BA51427D071DD02B00479336 + BA5142CC071E034800479336 + BA9EEBA9071F71A100DA4FC6 + BA9EEBAA071F71A100DA4FC6 + BA9EEBAB071F71A100DA4FC6 + BAF9DD780721D40300698F3A + BAF9DD7C0721D40300698F3A + BAF9DD7D0721D40300698F3A + BAF9DD7E0721D40300698F3A + BAF9DD810721D40300698F3A + BAF9DD820721D40300698F3A + BAF9DD830721D40300698F3A + BAF9DD840721D40300698F3A + BAF9DD850721D40300698F3A + BAF9DD860721D40300698F3A + BAF9DD870721D40300698F3A + BAF9DDB20721D64500698F3A + BAF9DE510721E76900698F3A + BAF9DE520721E76900698F3A + BAF9DE570721E76900698F3A + BAF9DE5D0721E76900698F3A + BAF9DE650721E76900698F3A + BAF9DE690721E76900698F3A + BAF9DE6C0721E76900698F3A + BAF9DE6E0721E76900698F3A + BAF9DE7D0721E79B00698F3A + BAF9DF430722051600698F3A + BAF9DF500722064A00698F3A + BAF9DF510722064A00698F3A + BA6A385507261C05006BFEAE + BA6A385B07261C2C006BFEAE + BA6A386E07261CC5006BFEAE + BA6A387007261CC5006BFEAE + BA49A364074981D200A87295 + BA579C12076306ED00F095FF + BADFB8780763ABC700DC5643 + BA4BA77C076467D6006E3FE1 + BA9E7A220764F73200AF32B6 + BA9E7B360765120600AF32B6 + BAB886A50769A51000E15DEF + BAB886C20769A94B00E15DEF + BAB886C30769A94B00E15DEF + + + SplitCount + 1 + + StatusBarVisibility + + + GeometryConfiguration + + Frame + {{0, 0}, {1002, 532}} + RubberWindowFrame + 0 60 1280 772 0 0 1280 832 + + Module + PBXNavigatorGroup + Proportion + 532pt + + + ContentConfiguration + + PBXProjectModuleGUID + 1CE0B20506471E060097A5F4 + PBXProjectModuleLabel + Errors & Warnings + + GeometryConfiguration + + Frame + {{0, 539}, {1002, 191}} + RubberWindowFrame + 0 60 1280 772 0 0 1280 832 + + Module + XCDetailModule + Proportion + 191pt + + + Proportion + 1002pt + + + Name + Project + ServiceClasses + + XCModuleDock + PBXSmartGroupTreeModule + XCModuleDock + PBXNavigatorGroup + XCDetailModule + + TableOfContents + + BAB886A70769A51000E15DEF + 1CE0B1FE06471DED0097A5F4 + BAB886A80769A51000E15DEF + 1CE0B20306471E060097A5F4 + 1CE0B20506471E060097A5F4 + + ToolbarConfiguration + xcode.toolbar.config.default + + + PerspectivesBarVisible + + StatusbarIsVisible + + TimeStamp + 0.0 + ToolbarDisplayMode + 1 + ToolbarIsVisible + + ToolbarSizeMode + 1 + Type + Perspectives + UpdateMessage + + WindowJustification + 5 + WindowOrderList + + 1C0AD2B3069F1EA900FABCE6 + BA311C7406DB4DF300C3B9DF + /Users/henry/Development/PROJECTS/FTGL/mac/FTGL.xcode + + WindowString + 0 60 1280 772 0 0 1280 832 + WindowTools + + + FirstTimeWindowDisplayed + + Identifier + windowTool.build + Layout + + + Dock + + + ContentConfiguration + + PBXProjectModuleGUID + 1CD0528F0623707200166675 + PBXProjectModuleLabel + FTExtrdGlyph.cpp + PBXSplitModuleInNavigatorKey + + Split0 + + PBXProjectModuleGUID + 1CD052900623707200166675 + PBXProjectModuleLabel + FTExtrdGlyph.cpp + bookmark + BA9E7D040765231300AF32B6 + history + + BA9E7B1E076511DA00AF32B6 + BA9E7B1F076511DA00AF32B6 + BA9E7B3D0765125B00AF32B6 + BA9E7B4E0765133D00AF32B6 + BA9E7B4F0765133D00AF32B6 + + prevStack + + BA9E7B0F076510D500AF32B6 + BA9E7B22076511DA00AF32B6 + BA9E7B23076511DA00AF32B6 + BA9E7B24076511DA00AF32B6 + BA9E7B25076511DA00AF32B6 + BA9E7B3F0765125B00AF32B6 + BA9E7B500765133D00AF32B6 + + + SplitCount + 1 + + StatusBarVisibility + + + GeometryConfiguration + + Frame + {{0, 0}, {1024, 319}} + RubberWindowFrame + 156 136 1024 686 0 0 1280 832 + + Module + PBXNavigatorGroup + Proportion + 319pt + + + BecomeActive + + ContentConfiguration + + PBXProjectModuleGUID + XCMainBuildResultsModuleGUID + PBXProjectModuleLabel + Build + XCBuildResultsTrigger_Collapse + 1022 + XCBuildResultsTrigger_Open + 1011 + + GeometryConfiguration + + Frame + {{0, 326}, {1024, 318}} + RubberWindowFrame + 156 136 1024 686 0 0 1280 832 + + Module + PBXBuildResultsModule + Proportion + 318pt + + + Proportion + 644pt + + + Name + Build Results + ServiceClasses + + PBXBuildResultsModule + + StatusbarIsVisible + + TableOfContents + + BA63B15806D1C7F500CD5F16 + BA9E7B11076510D500AF32B6 + 1CD0528F0623707200166675 + XCMainBuildResultsModuleGUID + + ToolbarConfiguration + xcode.toolbar.config.build + WindowString + 156 136 1024 686 0 0 1280 832 + WindowToolGUID + BA63B15806D1C7F500CD5F16 + WindowToolIsVisible + + + + FirstTimeWindowDisplayed + + Identifier + windowTool.debugger + Layout + + + Dock + + + ContentConfiguration + + Debugger + + HorizontalSplitView + + _collapsingFrameDimension + 0.0 + _indexOfCollapsedView + 0 + _percentageOfCollapsedView + 0.0 + isCollapsed + yes + sizes + + {{0, 0}, {425, 225}} + {{425, 0}, {612, 225}} + + + VerticalSplitView + + _collapsingFrameDimension + 0.0 + _indexOfCollapsedView + 0 + _percentageOfCollapsedView + 0.0 + isCollapsed + yes + sizes + + {{0, 0}, {1037, 225}} + {{0, 225}, {1037, 463}} + + + + LauncherConfigVersion + 8 + PBXProjectModuleGUID + 1C162984064C10D400B95A72 + PBXProjectModuleLabel + Debug - FTGL (FTGL Test) + + GeometryConfiguration + + DebugConsoleDrawerSize + {100, 120} + DebugConsoleVisible + None + DebugConsoleWindowFrame + {{200, 200}, {500, 300}} + DebugSTDIOWindowFrame + {{200, 200}, {500, 300}} + Frame + {{0, 0}, {1037, 688}} + RubberWindowFrame + 194 102 1037 730 0 0 1280 832 + + Module + PBXDebugSessionModule + Proportion + 688pt + + + Proportion + 688pt + + + Name + Debugger + ServiceClasses + + PBXDebugSessionModule + + StatusbarIsVisible + + TableOfContents + + 1CD10A99069EF8BA00B06720 + BA6A384807261B02006BFEAE + 1C162984064C10D400B95A72 + BA6A384907261B02006BFEAE + + ToolbarConfiguration + xcode.toolbar.config.debug + WindowString + 194 102 1037 730 0 0 1280 832 + WindowToolGUID + 1CD10A99069EF8BA00B06720 + WindowToolIsVisible + + + + FirstTimeWindowDisplayed + + Identifier + windowTool.find + Layout + + + Dock + + + Dock + + + ContentConfiguration + + PBXProjectModuleGUID + 1CDD528C0622207200134675 + PBXProjectModuleLabel + FTFont.cpp + PBXSplitModuleInNavigatorKey + + Split0 + + PBXProjectModuleGUID + 1CD0528D0623707200166675 + PBXProjectModuleLabel + FTFont.cpp + + SplitCount + 1 + + StatusBarVisibility + + + GeometryConfiguration + + Frame + {{0, 0}, {1024, 420}} + RubberWindowFrame + 256 90 1024 742 0 0 1280 832 + + Module + PBXNavigatorGroup + Proportion + 1024pt + + + Proportion + 420pt + + + ContentConfiguration + + PBXProjectModuleGUID + 1CD0528E0623707200166675 + PBXProjectModuleLabel + Project Find + + GeometryConfiguration + + Frame + {{0, 427}, {1024, 273}} + RubberWindowFrame + 256 90 1024 742 0 0 1280 832 + + Module + PBXProjectFindModule + Proportion + 273pt + + + Proportion + 700pt + + + Name + Project Find + ServiceClasses + + PBXProjectFindModule + + StatusbarIsVisible + + TableOfContents + + 1C530D57069F1CE1000CFCEE + BAFA5829072CF33700E6BCCA + BAFA582A072CF33700E6BCCA + 1CDD528C0622207200134675 + 1CD0528E0623707200166675 + + WindowString + 256 90 1024 742 0 0 1280 832 + WindowToolGUID + 1C530D57069F1CE1000CFCEE + WindowToolIsVisible + + + + Identifier + MENUSEPARATOR + + + FirstTimeWindowDisplayed + + Identifier + windowTool.debuggerConsole + Layout + + + Dock + + + BecomeActive + + ContentConfiguration + + PBXProjectModuleGUID + 1C78EAAC065D492600B07095 + PBXProjectModuleLabel + Debugger Console + + GeometryConfiguration + + Frame + {{0, 0}, {817, 379}} + RubberWindowFrame + 436 209 817 421 0 0 1280 832 + + Module + PBXDebugCLIModule + Proportion + 379pt + + + Proportion + 379pt + + + Name + Debugger Console + ServiceClasses + + PBXDebugCLIModule + + StatusbarIsVisible + + TableOfContents + + BAEDDDD006D3696E008BB47D + BA6A384A07261B02006BFEAE + 1C78EAAC065D492600B07095 + + WindowString + 436 209 817 421 0 0 1280 832 + WindowToolGUID + BAEDDDD006D3696E008BB47D + WindowToolIsVisible + + + + FirstTimeWindowDisplayed + + Identifier + windowTool.run + Layout + + + Dock + + + ContentConfiguration + + LauncherConfigVersion + 3 + PBXProjectModuleGUID + 1CD0528B0623707200166675 + PBXProjectModuleLabel + Run + Runner + + HorizontalSplitView + + _collapsingFrameDimension + 0.0 + _indexOfCollapsedView + 0 + _percentageOfCollapsedView + 0.0 + isCollapsed + yes + sizes + + {{0, 0}, {493, 167}} + {{0, 176}, {493, 267}} + + + VerticalSplitView + + _collapsingFrameDimension + 0.0 + _indexOfCollapsedView + 0 + _percentageOfCollapsedView + 0.0 + isCollapsed + yes + sizes + + {{0, 0}, {405, 443}} + {{414, 0}, {514, 443}} + + + + + GeometryConfiguration + + Frame + {{0, 0}, {865, 518}} + RubberWindowFrame + 179 234 865 560 0 0 1280 832 + + Module + PBXRunSessionModule + Proportion + 518pt + + + Proportion + 518pt + + + Name + Run Log + ServiceClasses + + PBXRunSessionModule + + StatusbarIsVisible + + TableOfContents + + 1C0AD2B3069F1EA900FABCE6 + BAB886C50769A94B00E15DEF + 1CD0528B0623707200166675 + BAB886C60769A94B00E15DEF + + ToolbarConfiguration + xcode.toolbar.config.run + WindowString + 179 234 865 560 0 0 1280 832 + WindowToolGUID + 1C0AD2B3069F1EA900FABCE6 + WindowToolIsVisible + + + + FirstTimeWindowDisplayed + + Identifier + windowTool.scm + Layout + + + Dock + + + ContentConfiguration + + PBXProjectModuleGUID + 1C78EAB2065D492600B07095 + PBXProjectModuleLabel + FTExtrdGlyph.cpp + PBXSplitModuleInNavigatorKey + + Split0 + + PBXProjectModuleGUID + 1C78EAB3065D492600B07095 + PBXProjectModuleLabel + FTExtrdGlyph.cpp + + SplitCount + 1 + + StatusBarVisibility + + + GeometryConfiguration + + Frame + {{0, 0}, {860, 223}} + RubberWindowFrame + 184 141 860 649 0 0 1280 832 + + Module + PBXNavigatorGroup + Proportion + 223pt + + + BecomeActive + + ContentConfiguration + + PBXProjectModuleGUID + 1CD052920623707200166675 + PBXProjectModuleLabel + SCM + + GeometryConfiguration + + ConsoleFrame + {{0, 312}, {860, 65}} + Frame + {{0, 230}, {860, 377}} + RubberWindowFrame + 184 141 860 649 0 0 1280 832 + TableConfiguration + + Status + 30 + FileName + 199 + Path + 605.094970703125 + + TableFrame + {{0, 0}, {860, 303}} + + Module + PBXCVSModule + Proportion + 377pt + + + Proportion + 607pt + + + Name + SCM + ServiceClasses + + PBXCVSModule + + StatusbarIsVisible + + TableOfContents + + BA311C7406DB4DF300C3B9DF + BAB886B30769A94200E15DEF + 1C78EAB2065D492600B07095 + 1CD052920623707200166675 + + WindowString + 184 141 860 649 0 0 1280 832 + WindowToolGUID + BA311C7406DB4DF300C3B9DF + WindowToolIsVisible + + + + FirstTimeWindowDisplayed + + Identifier + windowTool.breakpoints + Layout + + + Dock + + + BecomeActive + + ContentConfiguration + + PBXProjectModuleGUID + 1CD052930623707200166675 + PBXProjectModuleLabel + Breakpoints + + GeometryConfiguration + + BreakpointsTreeTableConfiguration + + enabledColumn + 16 + breakpointColumn + 201.5830078125 + + Frame + {{0, 0}, {240, 195}} + RubberWindowFrame + 28 589 240 216 0 0 1280 832 + + Module + PBXDebugBreakpointsModule + Proportion + 195pt + + + Proportion + 195pt + + + Name + Breakpoints + ServiceClasses + + PBXDebugBreakpointsModule + + StatusbarIsVisible + + TableOfContents + + 1C0AD2AD069F1E9B00FABCE6 + BA7422C2071A258A00CA279A + 1CD052930623707200166675 + + WindowString + 28 589 240 216 0 0 1280 832 + WindowToolGUID + 1C0AD2AD069F1E9B00FABCE6 + WindowToolIsVisible + + + + Identifier + windowTool.bookmarks + Layout + + + Dock + + + Module + PBXBookmarksModule + Proportion + 166pt + + + Proportion + 166pt + + + Name + Bookmarks + ServiceClasses + + PBXBookmarksModule + + StatusbarIsVisible + + WindowString + 538 42 401 187 0 0 1280 1002 + + + FirstTimeWindowDisplayed + + Identifier + windowTool.classBrowser + Layout + + + Dock + + + ContentConfiguration + + OptionsSetName + Hierarchy, all classes + PBXProjectModuleGUID + 1CA6456E063B45B4001379D8 + PBXProjectModuleLabel + Class Browser - TestGlyph + + GeometryConfiguration + + ClassesFrame + {{0, 0}, {374, 96}} + ClassesTreeTableConfiguration + + PBXClassNameColumnIdentifier + 208 + PBXClassBookColumnIdentifier + 22 + + Frame + {{0, 0}, {630, 331}} + MembersFrame + {{0, 105}, {374, 226}} + MembersTreeTableConfiguration + + PBXMemberTypeIconColumnIdentifier + 22 + PBXMemberNameColumnIdentifier + 216 + PBXMemberTypeColumnIdentifier + 97 + PBXMemberBookColumnIdentifier + 22 + + PBXModuleWindowStatusBarHidden2 + + RubberWindowFrame + 185 312 630 352 0 0 1024 746 + + Module + PBXClassBrowserModule + Proportion + 331pt + + + Proportion + 331pt + + + Name + Class Browser + ServiceClasses + + PBXClassBrowserModule + + StatusbarIsVisible + + TableOfContents + + 1C0AD2AF069F1E9B00FABCE6 + BA63B1D006D1CAE800CD5F16 + 1CA6456E063B45B4001379D8 + + ToolbarConfiguration + xcode.toolbar.config.classbrowser + WindowString + 185 312 630 352 0 0 1024 746 + WindowToolGUID + 1C0AD2AF069F1E9B00FABCE6 + WindowToolIsVisible + + + + FirstTimeWindowDisplayed + + Identifier + BA63B1D506D1CAFC00CD5F16 + Layout + + + Dock + + + ContentConfiguration + + OptionsSetName + Hierarchy, all classes + PBXProjectModuleGUID + 1CA6456E063B45B4001379D8 + PBXProjectModuleLabel + Class Browser - TestGlyph + + GeometryConfiguration + + ClassesFrame + {{0, 0}, {374, 96}} + ClassesTreeTableConfiguration + + PBXClassNameColumnIdentifier + 208 + PBXClassBookColumnIdentifier + 22 + + Frame + {{0, 0}, {630, 331}} + MembersFrame + {{0, 105}, {374, 226}} + MembersTreeTableConfiguration + + PBXMemberTypeIconColumnIdentifier + 22 + PBXMemberNameColumnIdentifier + 216 + PBXMemberTypeColumnIdentifier + 97 + PBXMemberBookColumnIdentifier + 22 + + PBXModuleWindowStatusBarHidden2 + + RubberWindowFrame + 279 228 630 352 0 0 1024 746 + + Module + PBXClassBrowserModule + Proportion + 331pt + + + Proportion + 331pt + + + Name + Class Browser + ServiceClasses + + PBXClassBrowserModule + + StatusbarIsVisible + + TableOfContents + + BA63B1D606D1CB0100CD5F16 + BA63B1D706D1CB0100CD5F16 + 1CA6456E063B45B4001379D8 + + ToolbarConfiguration + xcode.toolbar.config.classbrowser + WindowString + 279 228 630 352 0 0 1024 746 + WindowToolGUID + BA63B1D606D1CB0100CD5F16 + WindowToolIsVisible + + + + + diff --git a/src/WinLibs/FTGL/mac/FTGL.xcode/henry.pbxuser b/src/WinLibs/FTGL/mac/FTGL.xcode/henry.pbxuser new file mode 100644 index 000000000..71948575d --- /dev/null +++ b/src/WinLibs/FTGL/mac/FTGL.xcode/henry.pbxuser @@ -0,0 +1,2333 @@ +// !$*UTF8*$! +{ + BA1F9BEC072F06F400EE6DC2 = { + fRef = BA63B12206D1C72100CD5F16; + isa = PBXTextBookmark; + name = "FTCharmap::CharMap"; + rLen = 18; + rLoc = 331; + rType = 0; + vrLen = 654; + vrLoc = 407; + }; + BA49A362074981D200A87295 = { + fRef = BA63B0ED06D1C70900CD5F16; + isa = PBXTextBookmark; + name = bufferSizeInBytes; + rLen = 17; + rLoc = 1447; + rType = 0; + vrLen = 953; + vrLoc = 67; + }; + BA49A364074981D200A87295 = { + fRef = BA63B0ED06D1C70900CD5F16; + isa = PBXTextBookmark; + name = bufferSizeInBytes; + rLen = 17; + rLoc = 1447; + rType = 0; + vrLen = 953; + vrLoc = 67; + }; + BA4BA77C076467D6006E3FE1 = { + fRef = BA63B12B06D1C72100CD5F16; + isa = PBXTextBookmark; + name = "FTGLPixmapFont.cpp: 51"; + rLen = 0; + rLoc = 1233; + rType = 0; + vrLen = 1008; + vrLoc = 616; + }; + BA4BA79707646A5C006E3FE1 = { + fRef = BA4DCBB306D84BD30090441D; + isa = PBXTextBookmark; + name = "demo.cpp: 213"; + rLen = 0; + rLoc = 4414; + rType = 0; + vrLen = 946; + vrLoc = 4133; + }; + BA4DCB0B06D848A60090441D = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {698, 1791}}"; + sepNavSelRange = "{0, 0}"; + sepNavVisRect = "{{0, 0}, {698, 414}}"; + }; + }; + BA4DCB0C06D848A60090441D = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {955, 6985}}"; + sepNavSelRange = "{10309, 33}"; + sepNavVisRect = "{{0, 0}, {955, 500}}"; + sepNavWindowFrame = "{{15, 183}, {750, 558}}"; + }; + }; + BA4DCB0F06D848A60090441D = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {698, 4549}}"; + sepNavSelRange = "{0, 0}"; + sepNavVisRect = "{{0, 0}, {698, 414}}"; + }; + }; + BA4DCB1E06D8494E0090441D = { + activeExec = 0; + executables = ( + BA4DCB2006D8494E0090441D, + ); + }; + BA4DCB2006D8494E0090441D = { + activeArgIndex = 2147483647; + activeArgIndices = ( + ); + argumentStrings = ( + ); + configStateDict = { + }; + cppStopOnCatchEnabled = 0; + cppStopOnThrowEnabled = 0; + customDataFormattersEnabled = 1; + debuggerPlugin = GDBDebugging; + disassemblyDisplayState = 0; + dylibVariantSuffix = ""; + enableDebugStr = 1; + environmentEntries = ( + ); + isa = PBXExecutable; + libgmallocEnabled = 0; + name = "FTGL Demo"; + shlibInfoDictList = ( + ); + sourceDirectories = ( + ); + }; + BA4DCBAC06D84BA70090441D = { + activeExec = 0; + executables = ( + BA4DCBAE06D84BA70090441D, + ); + }; + BA4DCBAE06D84BA70090441D = { + activeArgIndex = 2147483647; + activeArgIndices = ( + ); + argumentStrings = ( + ); + configStateDict = { + }; + cppStopOnCatchEnabled = 0; + cppStopOnThrowEnabled = 0; + customDataFormattersEnabled = 1; + debuggerPlugin = GDBDebugging; + disassemblyDisplayState = 0; + dylibVariantSuffix = ""; + enableDebugStr = 1; + environmentEntries = ( + ); + isa = PBXExecutable; + libgmallocEnabled = 0; + name = "FTGL Test"; + shlibInfoDictList = ( + ); + sourceDirectories = ( + ); + }; + BA4DCBB306D84BD30090441D = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {955, 4549}}"; + sepNavSelRange = "{4414, 0}"; + sepNavVisRect = "{{0, 2855}, {955, 500}}"; + }; + }; + BA514271071DCFA400479336 = { + fRef = BA63B18306D1C95D00CD5F16; + isa = PBXTextBookmark; + name = "Fontdefs.h: 11"; + rLen = 0; + rLoc = 469; + rType = 0; + vrLen = 1435; + vrLoc = 0; + }; + BA514277071DCFA400479336 = { + fRef = BA63B18606D1C95D00CD5F16; + isa = PBXTextBookmark; + name = testSetEncoding; + rLen = 15; + rLoc = 1179; + rType = 0; + vrLen = 1123; + vrLoc = 743; + }; + BA51427A071DD02B00479336 = { + fRef = BA63B18506D1C95D00CD5F16; + isa = PBXTextBookmark; + name = "FTBitmapGlyph-Test.cpp: 55"; + rLen = 0; + rLoc = 1464; + rType = 0; + vrLen = 941; + vrLoc = 1309; + }; + BA51427C071DD02B00479336 = { + fRef = BA63B12206D1C72100CD5F16; + isa = PBXTextBookmark; + name = "FTCharmap::CharMap"; + rLen = 18; + rLoc = 331; + rType = 0; + vrLen = 510; + vrLoc = 273; + }; + BA51427D071DD02B00479336 = { + fRef = BA63B18506D1C95D00CD5F16; + isa = PBXTextBookmark; + name = " FT_Library library;\n FT_Face face;\n \n void setUpFreetype()\n {\n FT_Error error = FT_Init_FreeType( &library);\n assert(!error);\n error = FT_New_Face( library, FONT_FILE, 0, &face);\n assert(!error);\n \n FT_Set_Char_Size( face, 0L, FONT_POINT_SIZE * 64, RESOLUTION, RESOLUTION);\n \n error = FT_Load_Char( face, CHARACTER_CODE_A, FT_LOAD_DEFAULT);\n assert( !error); \n }\n \n void tearDownFreetype()\n {\n FT_Done_Face( face);\n FT_Done_FreeType( library);\n }\n"; + rLen = 657; + rLoc = 1535; + rType = 0; + vrLen = 883; + vrLoc = 1367; + }; + BA514283071DD60600479336 = { + fRef = BA63B18606D1C95D00CD5F16; + isa = PBXTextBookmark; + name = testSetEncoding; + rLen = 15; + rLoc = 1179; + rType = 0; + vrLen = 1693; + vrLoc = 1866; + }; + BA5142C8071E034800479336 = { + fRef = BA63B18906D1C95D00CD5F16; + isa = PBXTextBookmark; + name = "FTFace-Test.cpp: 101"; + rLen = 0; + rLoc = 3106; + rType = 0; + vrLen = 1113; + vrLoc = 2601; + }; + BA5142CC071E034800479336 = { + fRef = BA63B12E06D1C72100CD5F16; + isa = PBXTextBookmark; + name = .x; + rLen = 0; + rLoc = 215; + rType = 0; + vrLen = 291; + vrLoc = 0; + }; + BA579C10076306ED00F095FF = { + fRef = BA905B92070903D8006A5A17; + isa = PBXTextBookmark; + name = "FTGLBitmapFont-Test.cpp: 81"; + rLen = 0; + rLoc = 2485; + rType = 0; + vrLen = 1041; + vrLoc = 2022; + }; + BA579C12076306ED00F095FF = { + fRef = BA905B92070903D8006A5A17; + isa = PBXTextBookmark; + name = "FTGLBitmapFont-Test.cpp: 81"; + rLen = 0; + rLoc = 2485; + rType = 0; + vrLen = 1041; + vrLoc = 2022; + }; + BA579C170763078900F095FF = { + fRef = BA63B18D06D1C95D00CD5F16; + isa = PBXTextBookmark; + name = "FTLibrary-Test.cpp: 33"; + rLen = 0; + rLoc = 928; + rType = 0; + vrLen = 870; + vrLoc = 365; + }; + BA579C1E07630C6100F095FF = { + fRef = BA63B0F806D1C70900CD5F16; + isa = PBXTextBookmark; + name = "FTLibrary.h: 19"; + rLen = 0; + rLoc = 562; + rType = 0; + vrLen = 1040; + vrLoc = 1710; + }; + BA579C2E07630D1500F095FF = { + fRef = BA63B13006D1C72100CD5F16; + isa = PBXTextBookmark; + name = const; + rLen = 5; + rLoc = 28; + rType = 0; + vrLen = 457; + vrLoc = 0; + }; + BA63B0C006D1C62B00CD5F16 = { + activeBuildStyle = BA63B0BF06D1C62B00CD5F16; + activeExecutable = BA63B16F06D1C8FD00CD5F16; + activeTarget = BA63B16D06D1C8FD00CD5F16; + addToTargets = ( + BA63B16D06D1C8FD00CD5F16, + ); + breakpoints = ( + ); + codeSenseManager = BA63B0C206D1C62B00CD5F16; + executables = ( + BA63B16F06D1C8FD00CD5F16, + BA4DCB2006D8494E0090441D, + BA4DCBAE06D84BA70090441D, + ); + expressions = ( + "(this)->err", + "charMap->GlyphListIndex( characterCode)", + "glyphs[1]", + err, + ); + perUserDictionary = { + PBXConfiguration.PBXFileTableDataSource3.PBXErrorsWarningsDataSource = { + PBXFileTableDataSourceColumnSortingDirectionKey = "-1"; + PBXFileTableDataSourceColumnSortingKey = PBXErrorsWarningsDataSource_TypeID; + PBXFileTableDataSourceColumnWidthsKey = ( + 20, + 620.8799, + 332.2085, + ); + PBXFileTableDataSourceColumnsKey = ( + PBXErrorsWarningsDataSource_TypeID, + PBXErrorsWarningsDataSource_MessageID, + PBXErrorsWarningsDataSource_LocationID, + ); + }; + PBXConfiguration.PBXFileTableDataSource3.PBXFileTableDataSource = { + PBXFileTableDataSourceColumnSortingDirectionKey = "-1"; + PBXFileTableDataSourceColumnSortingKey = PBXFileDataSource_Filename_ColumnID; + PBXFileTableDataSourceColumnWidthsKey = ( + 20, + 688, + 20, + 123, + 43, + 43, + 20, + ); + PBXFileTableDataSourceColumnsKey = ( + PBXFileDataSource_FiletypeID, + PBXFileDataSource_Filename_ColumnID, + PBXFileDataSource_Built_ColumnID, + PBXFileDataSource_ObjectSize_ColumnID, + PBXFileDataSource_Errors_ColumnID, + PBXFileDataSource_Warnings_ColumnID, + PBXFileDataSource_Target_ColumnID, + ); + }; + PBXConfiguration.PBXFileTableDataSource3.PBXFindDataSource = { + PBXFileTableDataSourceColumnSortingDirectionKey = "-1"; + PBXFileTableDataSourceColumnSortingKey = PBXFindDataSource_LocationID; + PBXFileTableDataSourceColumnWidthsKey = ( + 487.2974, + 489.2085, + ); + PBXFileTableDataSourceColumnsKey = ( + PBXFindDataSource_MessageID, + PBXFindDataSource_LocationID, + ); + }; + PBXConfiguration.PBXFileTableDataSource3.PBXSymbolsDataSource = { + PBXFileTableDataSourceColumnSortingDirectionKey = "-1"; + PBXFileTableDataSourceColumnSortingKey = PBXSymbolsDataSource_SymbolNameID; + PBXFileTableDataSourceColumnWidthsKey = ( + 16, + 305.8008, + 335.0356, + 312.2085, + ); + PBXFileTableDataSourceColumnsKey = ( + PBXSymbolsDataSource_SymbolTypeIconID, + PBXSymbolsDataSource_SymbolNameID, + PBXSymbolsDataSource_SymbolTypeID, + PBXSymbolsDataSource_ReferenceNameID, + ); + }; + PBXConfiguration.PBXFileTableDataSource3.XCSCMDataSource = { + PBXFileTableDataSourceColumnSortingDirectionKey = "-1"; + PBXFileTableDataSourceColumnSortingKey = PBXFileDataSource_Filename_ColumnID; + PBXFileTableDataSourceColumnWidthsKey = ( + 20, + 20, + 499, + 20, + 79, + 43, + 43, + 20, + ); + PBXFileTableDataSourceColumnsKey = ( + PBXFileDataSource_SCM_ColumnID, + PBXFileDataSource_FiletypeID, + PBXFileDataSource_Filename_ColumnID, + PBXFileDataSource_Built_ColumnID, + PBXFileDataSource_ObjectSize_ColumnID, + PBXFileDataSource_Errors_ColumnID, + PBXFileDataSource_Warnings_ColumnID, + PBXFileDataSource_Target_ColumnID, + ); + }; + PBXConfiguration.PBXTargetDataSource.PBXTargetDataSource = { + PBXFileTableDataSourceColumnSortingDirectionKey = "-1"; + PBXFileTableDataSourceColumnSortingKey = PBXFileDataSource_Filename_ColumnID; + PBXFileTableDataSourceColumnWidthsKey = ( + 20, + 583, + 124, + 20, + 124, + 43, + 43, + ); + PBXFileTableDataSourceColumnsKey = ( + PBXFileDataSource_FiletypeID, + PBXFileDataSource_Filename_ColumnID, + PBXTargetDataSource_PrimaryAttribute, + PBXFileDataSource_Built_ColumnID, + PBXFileDataSource_ObjectSize_ColumnID, + PBXFileDataSource_Errors_ColumnID, + PBXFileDataSource_Warnings_ColumnID, + ); + }; + PBXPerProjectTemplateStateSaveDate = 124364015; + PBXPrepackagedSmartGroups_v2 = ( + { + PBXTransientLocationAtTop = bottom; + absolutePathToBundle = ""; + activationKey = OldTargetSmartGroup; + clz = PBXTargetSmartGroup; + description = "Displays all targets of the project."; + globalID = 1C37FABC04509CD000000102; + name = Targets; + preferences = { + image = Targets; + }; + }, + { + PBXTransientLocationAtTop = bottom; + absolutePathToBundle = ""; + clz = PBXTargetSmartGroup2; + description = "Displays all targets of the project as well as nested build phases."; + globalID = 1C37FBAC04509CD000000102; + name = Targets; + preferences = { + image = Targets; + }; + }, + { + PBXTransientLocationAtTop = bottom; + absolutePathToBundle = ""; + clz = PBXExecutablesSmartGroup; + description = "Displays all executables of the project."; + globalID = 1C37FAAC04509CD000000102; + name = Executables; + preferences = { + image = Executable; + }; + }, + { + " PBXTransientLocationAtTop " = bottom; + absolutePathToBundle = ""; + clz = PBXErrorsWarningsSmartGroup; + description = "Displays files with errors or warnings."; + globalID = 1C08E77C0454961000C914BD; + name = "Errors and Warnings"; + preferences = { + fnmatch = ""; + image = WarningsErrors; + recursive = 1; + regex = ""; + root = ""; + }; + }, + { + PBXTransientLocationAtTop = bottom; + absolutePathToBundle = ""; + clz = PBXFilenameSmartGroup; + description = "Filters items in a given group (potentially recursively) based on matching the name with the regular expression of the filter."; + globalID = 1CC0EA4004350EF90044410B; + name = "Implementation Files"; + preferences = { + canSave = 1; + fnmatch = ""; + image = SmartFolder; + isLeaf = 0; + recursive = 1; + regex = "?*\\.[mcMC]"; + root = ""; + }; + }, + { + PBXTransientLocationAtTop = bottom; + absolutePathToBundle = ""; + clz = PBXFilenameSmartGroup; + description = "This group displays Interface Builder NIB Files."; + globalID = 1CC0EA4004350EF90041110B; + name = "NIB Files"; + preferences = { + canSave = 1; + fnmatch = "*.nib"; + image = SmartFolder; + isLeaf = 0; + recursive = 1; + regex = ""; + root = ""; + }; + }, + { + PBXTransientLocationAtTop = no; + absolutePathToBundle = ""; + clz = PBXFindSmartGroup; + description = "Displays Find Results."; + globalID = 1C37FABC05509CD000000102; + name = "Find Results"; + preferences = { + image = spyglass; + }; + }, + { + PBXTransientLocationAtTop = no; + absolutePathToBundle = ""; + clz = PBXBookmarksSmartGroup; + description = "Displays Project Bookmarks."; + globalID = 1C37FABC05539CD112110102; + name = Bookmarks; + preferences = { + image = Bookmarks; + }; + }, + { + PBXTransientLocationAtTop = bottom; + absolutePathToBundle = ""; + clz = XCSCMSmartGroup; + description = "Displays files with interesting SCM status."; + globalID = E2644B35053B69B200211256; + name = SCM; + preferences = { + image = PBXRepository; + isLeaf = 0; + }; + }, + { + PBXTransientLocationAtTop = bottom; + absolutePathToBundle = ""; + clz = PBXSymbolsSmartGroup; + description = "Displays all symbols for the project."; + globalID = 1C37FABC04509CD000100104; + name = "Project Symbols"; + preferences = { + image = ProjectSymbols; + isLeaf = 1; + }; + }, + { + PBXTransientLocationAtTop = bottom; + absolutePathToBundle = ""; + clz = PBXFilenameSmartGroup; + description = "Filters items in a given group (potentially recursively) based on matching the name with the regular expression of the filter."; + globalID = PBXTemplateMarker; + name = "Simple Filter SmartGroup"; + preferences = { + canSave = 1; + fnmatch = "*.nib"; + image = SmartFolder; + isLeaf = 0; + recursive = 1; + regex = ""; + root = ""; + }; + }, + { + PBXTransientLocationAtTop = bottom; + absolutePathToBundle = ""; + clz = PBXFilenameSmartGroup; + description = "Filters items in a given group (potentially recursively) based on matching the name with the regular expression of the filter."; + globalID = PBXTemplateMarker; + name = "Simple Regular Expression SmartGroup"; + preferences = { + canSave = 1; + fnmatch = ""; + image = SmartFolder; + isLeaf = 0; + recursive = 1; + regex = "?*\\.[mcMC]"; + root = ""; + }; + }, + { + PBXTransientLocationAtTop = bottom; + clz = XDDesignSmartGroup; + description = "Displays Xdesign models"; + globalID = 2E4A936305E6979E00701470; + name = Design; + preferences = { + image = Design; + isLeaf = 0; + }; + }, + ); + PBXWorkspaceContents = ( + { + PBXProjectWorkspaceModule_StateKey_Rev39 = { + PBXProjectWorkspaceModule_DEGV_Geometry = { + _collapsingFrameDimension = 0; + _indexOfCollapsedView = 0; + _percentageOfCollapsedView = 0; + isCollapsed = yes; + sizes = ( + "{{0, 0}, {1031, 263}}", + "{{0, 263}, {1031, 483}}", + ); + }; + PBXProjectWorkspaceModule_DataSourceSelectionKey_Rev6 = { + BoundsStr = "{{0, 0}, {1016, 246}}"; + Rows = ( + ); + VisibleRectStr = "{{0, 0}, {1016, 246}}"; + }; + PBXProjectWorkspaceModule_EditorOpen = true; + PBXProjectWorkspaceModule_EmbeddedNavigatorGroup = { + PBXSplitModuleInNavigatorKey = { + Split0 = { + bookmark = BA1B0626071CBCFA0053F600; + history = ( + BA1B05F7071CB9350053F600, + BA1B05F8071CB9350053F600, + BA1B061F071CBAD60053F600, + BA1B0620071CBAD60053F600, + BA1B0623071CBAD60053F600, + ); + prevStack = ( + BA1B05FC071CB9350053F600, + BA1B05FD071CB9350053F600, + BA1B05FE071CB9350053F600, + BA1B05FF071CB9350053F600, + BA1B0600071CB9350053F600, + ); + }; + SplitCount = 1; + }; + }; + PBXProjectWorkspaceModule_GeometryKey_Rev15 = { + PBXProjectWorkspaceModule_SGTM_Geometry = { + _collapsingFrameDimension = 0; + _indexOfCollapsedView = 0; + _percentageOfCollapsedView = 0; + sizes = ( + "{{0, 0}, {249, 746}}", + "{{249, 0}, {1031, 746}}", + ); + }; + }; + PBXProjectWorkspaceModule_OldDetailFrame = "{{0, 0}, {1031, 263}}"; + PBXProjectWorkspaceModule_OldEditorFrame = "{{0, 263}, {1031, 483}}"; + PBXProjectWorkspaceModule_OldSuperviewFrame = "{{249, 0}, {1031, 746}}"; + PBXProjectWorkspaceModule_SGTM = { + PBXBottomSmartGroupGIDs = ( + 1C37FBAC04509CD000000102, + 1C37FAAC04509CD000000102, + 1C08E77C0454961000C914BD, + 1CC0EA4004350EF90044410B, + 1CC0EA4004350EF90041110B, + 1C37FABC05509CD000000102, + 1C37FABC05539CD112110102, + E2644B35053B69B200211256, + 1C37FABC04509CD000100104, + ); + PBXSmartGroupTreeModuleColumnData = { + PBXSmartGroupTreeModuleColumnWidthsKey = ( + 22, + 22, + 188, + ); + PBXSmartGroupTreeModuleColumnsKey_v4 = ( + TargetStatusColumn, + SCMStatusColumn, + MainColumn, + ); + }; + PBXSmartGroupTreeModuleOutlineStateKey_v7 = { + PBXSmartGroupTreeModuleOutlineStateExpansionKey = ( + BA63B0BC06D1C62B00CD5F16, + BA63B17706D1C95D00CD5F16, + ); + PBXSmartGroupTreeModuleOutlineStateSelectionKey = ( + ( + 45, + ), + ); + PBXSmartGroupTreeModuleOutlineStateVisibleRectKey = "{{0, 135}, {232, 728}}"; + }; + PBXTopSmartGroupGIDs = ( + ); + }; + }; + }, + ); + "PBXWorkspaceContents:PBXConfiguration.PBXModule.PBXBuildResultsModule" = { + }; + "PBXWorkspaceContents:PBXConfiguration.PBXModule.PBXDebugCLIModule" = { + }; + "PBXWorkspaceContents:PBXConfiguration.PBXModule.PBXDebugSessionModule" = { + Debugger = { + HorizontalSplitView = { + _collapsingFrameDimension = 0; + _indexOfCollapsedView = 0; + _percentageOfCollapsedView = 0; + isCollapsed = yes; + sizes = ( + "{{0, 0}, {486, 360}}", + "{{486, 0}, {794, 360}}", + ); + }; + VerticalSplitView = { + _collapsingFrameDimension = 0; + _indexOfCollapsedView = 0; + _percentageOfCollapsedView = 0; + isCollapsed = yes; + sizes = ( + "{{0, 0}, {1280, 360}}", + "{{0, 360}, {1280, 370}}", + ); + }; + }; + LauncherConfigVersion = 8; + }; + "PBXWorkspaceContents:PBXConfiguration.PBXModule.PBXProjectWorkspaceModule" = { + PBXProjectWorkspaceModule_StateKey_Rev39 = { + PBXProjectWorkspaceModule_DataSourceSelectionKey_Rev6 = { + BoundsStr = "{{0, 0}, {1083, 1530}}"; + Rows = ( + 0, + ); + VisibleRectStr = "{{0, 0}, {1083, 729}}"; + }; + PBXProjectWorkspaceModule_EditorOpen = false; + PBXProjectWorkspaceModule_EmbeddedNavigatorGroup = { + PBXSplitModuleInNavigatorKey = { + SplitCount = 1; + }; + }; + PBXProjectWorkspaceModule_GeometryKey_Rev15 = { + PBXProjectWorkspaceModule_SGTM_Geometry = { + _collapsingFrameDimension = 0; + _indexOfCollapsedView = 0; + _percentageOfCollapsedView = 0; + sizes = ( + "{{0, 0}, {182, 746}}", + "{{182, 0}, {1098, 746}}", + ); + }; + }; + PBXProjectWorkspaceModule_OldDetailFrame = "{{0, 0}, {1098, 746}}"; + PBXProjectWorkspaceModule_OldEditorFrame = "{{0, 0}, {750, 480}}"; + PBXProjectWorkspaceModule_OldSuperviewFrame = "{{182, 0}, {1098, 746}}"; + PBXProjectWorkspaceModule_SGTM = { + PBXBottomSmartGroupGIDs = ( + 1C37FBAC04509CD000000102, + 1C37FAAC04509CD000000102, + 1C08E77C0454961000C914BD, + 1CC0EA4004350EF90044410B, + 1CC0EA4004350EF90041110B, + 1C37FABC05509CD000000102, + 1C37FABC05539CD112110102, + E2644B35053B69B200211256, + 1C37FABC04509CD000100104, + ); + PBXSmartGroupTreeModuleColumnData = { + PBXSmartGroupTreeModuleColumnWidthsKey = ( + 165, + ); + PBXSmartGroupTreeModuleColumnsKey_v4 = ( + MainColumn, + ); + }; + PBXSmartGroupTreeModuleOutlineStateKey_v7 = { + PBXSmartGroupTreeModuleOutlineStateExpansionKey = ( + ); + PBXSmartGroupTreeModuleOutlineStateSelectionKey = ( + ( + 0, + ), + ); + PBXSmartGroupTreeModuleOutlineStateVisibleRectKey = "{{0, 0}, {165, 728}}"; + }; + PBXTopSmartGroupGIDs = ( + ); + }; + }; + }; + "PBXWorkspaceContents:PBXConfiguration.PBXModule.PBXRunSessionModule" = { + LauncherConfigVersion = 3; + Runner = { + HorizontalSplitView = { + _collapsingFrameDimension = 0; + _indexOfCollapsedView = 0; + _percentageOfCollapsedView = 0; + isCollapsed = yes; + sizes = ( + "{{0, 0}, {491, 167}}", + "{{0, 176}, {491, 267}}", + ); + }; + VerticalSplitView = { + _collapsingFrameDimension = 0; + _indexOfCollapsedView = 0; + _percentageOfCollapsedView = 0; + isCollapsed = yes; + sizes = ( + "{{0, 0}, {405, 443}}", + "{{414, 0}, {514, 443}}", + ); + }; + }; + }; + PBXWorkspaceGeometries = ( + { + Frame = "{{0, 0}, {1280, 746}}"; + PBXProjectWorkspaceModule_GeometryKey_Rev15 = { + }; + RubberWindowFrame = "0 44 1280 788 0 0 1280 832 "; + }, + ); + "PBXWorkspaceGeometries:PBXConfiguration.PBXModule.PBXBuildResultsModule" = { + Frame = "{{0, 0}, {480, 217}}"; + PBXModuleWindowStatusBarHidden = YES; + RubberWindowFrame = "400 465 480 238 0 0 1280 832 "; + }; + "PBXWorkspaceGeometries:PBXConfiguration.PBXModule.PBXDebugCLIModule" = { + Frame = "{{0, 0}, {400, 201}}"; + PBXModuleWindowStatusBarHidden = YES; + RubberWindowFrame = "50 804 400 222 0 0 1280 832 "; + }; + "PBXWorkspaceGeometries:PBXConfiguration.PBXModule.PBXDebugSessionModule" = { + DebugConsoleDrawerSize = "{100, 120}"; + DebugConsoleVisible = None; + DebugConsoleWindowFrame = "{{200, 200}, {500, 300}}"; + DebugSTDIOWindowFrame = "{{200, 200}, {500, 300}}"; + Frame = "{{0, 0}, {1280, 730}}"; + RubberWindowFrame = "0 60 1280 772 0 0 1280 832 "; + }; + "PBXWorkspaceGeometries:PBXConfiguration.PBXModule.PBXProjectWorkspaceModule" = { + Frame = "{{0, 0}, {1280, 746}}"; + PBXProjectWorkspaceModule_GeometryKey_Rev15 = { + }; + RubberWindowFrame = "0 44 1280 788 0 0 1280 832 "; + }; + "PBXWorkspaceGeometries:PBXConfiguration.PBXModule.PBXRunSessionModule" = { + Frame = "{{0, 0}, {745, 443}}"; + PBXModuleWindowStatusBarHidden = YES; + RubberWindowFrame = "267 352 745 464 0 0 1280 832 "; + }; + PBXWorkspaceStateSaveDate = 124364015; + }; + perUserProjectItems = { + BA1F9BEC072F06F400EE6DC2 = BA1F9BEC072F06F400EE6DC2; + BA49A362074981D200A87295 = BA49A362074981D200A87295; + BA49A364074981D200A87295 = BA49A364074981D200A87295; + BA4BA77C076467D6006E3FE1 = BA4BA77C076467D6006E3FE1; + BA4BA79707646A5C006E3FE1 = BA4BA79707646A5C006E3FE1; + BA514271071DCFA400479336 = BA514271071DCFA400479336; + BA514277071DCFA400479336 = BA514277071DCFA400479336; + BA51427A071DD02B00479336 = BA51427A071DD02B00479336; + BA51427C071DD02B00479336 = BA51427C071DD02B00479336; + BA51427D071DD02B00479336 = BA51427D071DD02B00479336; + BA514283071DD60600479336 = BA514283071DD60600479336; + BA5142C8071E034800479336 = BA5142C8071E034800479336; + BA5142CC071E034800479336 = BA5142CC071E034800479336; + BA579C10076306ED00F095FF = BA579C10076306ED00F095FF; + BA579C12076306ED00F095FF = BA579C12076306ED00F095FF; + BA579C170763078900F095FF = BA579C170763078900F095FF; + BA579C1E07630C6100F095FF = BA579C1E07630C6100F095FF; + BA579C2E07630D1500F095FF = BA579C2E07630D1500F095FF; + BA6A383C07261AE2006BFEAE = BA6A383C07261AE2006BFEAE; + BA6A385507261C05006BFEAE = BA6A385507261C05006BFEAE; + BA6A385B07261C2C006BFEAE = BA6A385B07261C2C006BFEAE; + BA6A386E07261CC5006BFEAE = BA6A386E07261CC5006BFEAE; + BA6A387007261CC5006BFEAE = BA6A387007261CC5006BFEAE; + BA711EC5073587C600B5EF8E = BA711EC5073587C600B5EF8E; + BA877F8A076644DA00FEB55B = BA877F8A076644DA00FEB55B; + BA877F9D0766460000FEB55B = BA877F9D0766460000FEB55B; + BA877F9E0766460000FEB55B = BA877F9E0766460000FEB55B; + BA9E7A1D0764F73200AF32B6 = BA9E7A1D0764F73200AF32B6; + BA9E7A220764F73200AF32B6 = BA9E7A220764F73200AF32B6; + BA9E7A300764F8B100AF32B6 = BA9E7A300764F8B100AF32B6; + BA9E7B2C0765120600AF32B6 = BA9E7B2C0765120600AF32B6; + BA9E7B2E0765120600AF32B6 = BA9E7B2E0765120600AF32B6; + BA9E7B2F0765120600AF32B6 = BA9E7B2F0765120600AF32B6; + BA9E7B360765120600AF32B6 = BA9E7B360765120600AF32B6; + BA9E7B570765137500AF32B6 = BA9E7B570765137500AF32B6; + BA9E7DC607654D7200AF32B6 = BA9E7DC607654D7200AF32B6; + BA9EEBA7071F71A100DA4FC6 = BA9EEBA7071F71A100DA4FC6; + BA9EEBA9071F71A100DA4FC6 = BA9EEBA9071F71A100DA4FC6; + BA9EEBAA071F71A100DA4FC6 = BA9EEBAA071F71A100DA4FC6; + BA9EEBAB071F71A100DA4FC6 = BA9EEBAB071F71A100DA4FC6; + BAA7C11C071CC20F00B139B5 = BAA7C11C071CC20F00B139B5; + BAA7C11E071CC20F00B139B5 = BAA7C11E071CC20F00B139B5; + BAA7C127071CC2DF00B139B5 = BAA7C127071CC2DF00B139B5; + BAA7C128071CC2DF00B139B5 = BAA7C128071CC2DF00B139B5; + BAA7C131071CC30800B139B5 = BAA7C131071CC30800B139B5; + BAB886A50769A51000E15DEF = BAB886A50769A51000E15DEF; + BAB886C00769A94B00E15DEF = BAB886C00769A94B00E15DEF; + BAB886C10769A94B00E15DEF = BAB886C10769A94B00E15DEF; + BAB886C20769A94B00E15DEF = BAB886C20769A94B00E15DEF; + BAB886C30769A94B00E15DEF = BAB886C30769A94B00E15DEF; + BAB886C9076A513000E15DEF = BAB886C9076A513000E15DEF; + BADFB8780763ABC700DC5643 = BADFB8780763ABC700DC5643; + BAE83F4907289E59007C557D = BAE83F4907289E59007C557D; + BAE83F4A07289E59007C557D = BAE83F4A07289E59007C557D; + BAF9DD780721D40300698F3A = BAF9DD780721D40300698F3A; + BAF9DD7C0721D40300698F3A = BAF9DD7C0721D40300698F3A; + BAF9DD7D0721D40300698F3A = BAF9DD7D0721D40300698F3A; + BAF9DD7E0721D40300698F3A = BAF9DD7E0721D40300698F3A; + BAF9DD810721D40300698F3A = BAF9DD810721D40300698F3A; + BAF9DD820721D40300698F3A = BAF9DD820721D40300698F3A; + BAF9DD830721D40300698F3A = BAF9DD830721D40300698F3A; + BAF9DD840721D40300698F3A = BAF9DD840721D40300698F3A; + BAF9DD850721D40300698F3A = BAF9DD850721D40300698F3A; + BAF9DD860721D40300698F3A = BAF9DD860721D40300698F3A; + BAF9DD870721D40300698F3A = BAF9DD870721D40300698F3A; + BAF9DDB20721D64500698F3A = BAF9DDB20721D64500698F3A; + BAF9DE3B0721E76900698F3A = BAF9DE3B0721E76900698F3A; + BAF9DE510721E76900698F3A = BAF9DE510721E76900698F3A; + BAF9DE520721E76900698F3A = BAF9DE520721E76900698F3A; + BAF9DE570721E76900698F3A = BAF9DE570721E76900698F3A; + BAF9DE5D0721E76900698F3A = BAF9DE5D0721E76900698F3A; + BAF9DE650721E76900698F3A = BAF9DE650721E76900698F3A; + BAF9DE690721E76900698F3A = BAF9DE690721E76900698F3A; + BAF9DE6C0721E76900698F3A = BAF9DE6C0721E76900698F3A; + BAF9DE6E0721E76900698F3A = BAF9DE6E0721E76900698F3A; + BAF9DE7D0721E79B00698F3A = BAF9DE7D0721E79B00698F3A; + BAF9DE970721EBE300698F3A = BAF9DE970721EBE300698F3A; + BAF9DEF20721F26200698F3A = BAF9DEF20721F26200698F3A; + BAF9DEF30721F26200698F3A = BAF9DEF30721F26200698F3A; + BAF9DEF70721F26200698F3A = BAF9DEF70721F26200698F3A; + BAF9DEF80721F26200698F3A = BAF9DEF80721F26200698F3A; + BAF9DEF90721F26200698F3A = BAF9DEF90721F26200698F3A; + BAF9DEFA0721F26200698F3A = BAF9DEFA0721F26200698F3A; + BAF9DEFB0721F26200698F3A = BAF9DEFB0721F26200698F3A; + BAF9DEFD0721F26200698F3A = BAF9DEFD0721F26200698F3A; + BAF9DEFF0721F26200698F3A = BAF9DEFF0721F26200698F3A; + BAF9DF000721F26200698F3A = BAF9DF000721F26200698F3A; + BAF9DF020721F26200698F3A = BAF9DF020721F26200698F3A; + BAF9DF380721F4CC00698F3A = BAF9DF380721F4CC00698F3A; + BAF9DF430722051600698F3A = BAF9DF430722051600698F3A; + BAF9DF4C0722064A00698F3A = BAF9DF4C0722064A00698F3A; + BAF9DF500722064A00698F3A = BAF9DF500722064A00698F3A; + BAF9DF510722064A00698F3A = BAF9DF510722064A00698F3A; + BAF9DF5C0722070100698F3A = BAF9DF5C0722070100698F3A; + }; + sourceControlManager = BA63B0C106D1C62B00CD5F16; + userBuildSettings = { + }; + }; + BA63B0C106D1C62B00CD5F16 = { + fallbackIsa = XCSourceControlManager; + isSCMEnabled = 1; + isa = PBXSourceControlManager; + scmConfiguration = { + }; + scmType = scm.cvs; + }; + BA63B0C206D1C62B00CD5F16 = { + indexTemplatePath = ""; + isa = PBXCodeSenseManager; + usesDefaults = 1; + wantsCodeCompletion = 1; + wantsCodeCompletionAutoSuggestions = 1; + wantsCodeCompletionCaseSensitivity = 1; + wantsCodeCompletionListAlways = 1; + wantsCodeCompletionOnlyMatchingItems = 1; + wantsCodeCompletionParametersIncluded = 1; + wantsCodeCompletionPlaceholdersInserted = 1; + wantsCodeCompletionTabCompletes = 1; + wantsIndex = 1; + }; + BA63B0DD06D1C6D900CD5F16 = { + activeExec = 0; + }; + BA63B0E506D1C70900CD5F16 = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {977, 1749}}"; + sepNavSelRange = "{155, 21}"; + sepNavVisRect = "{{0, 0}, {977, 287}}"; + }; + }; + BA63B0E606D1C70900CD5F16 = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {955, 1077}}"; + sepNavSelRange = "{1020, 0}"; + sepNavVisRect = "{{0, 359}, {955, 500}}"; + }; + }; + BA63B0E806D1C70900CD5F16 = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {746, 1917}}"; + sepNavSelRange = "{1881, 16}"; + sepNavVisRect = "{{0, 583}, {746, 500}}"; + }; + }; + BA63B0E906D1C70900CD5F16 = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {973, 1833}}"; + sepNavSelRange = "{2133, 0}"; + sepNavVisRect = "{{0, 813}, {973, 461}}"; + }; + }; + BA63B0EA06D1C70900CD5F16 = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {955, 1245}}"; + sepNavSelRange = "{1010, 0}"; + sepNavVisRect = "{{0, 272}, {955, 500}}"; + }; + }; + BA63B0EB06D1C70900CD5F16 = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {955, 979}}"; + sepNavSelRange = "{491, 0}"; + sepNavVisRect = "{{0, 452}, {955, 500}}"; + sepNavWindowFrame = "{{38, 248}, {750, 558}}"; + }; + }; + BA63B0EC06D1C70900CD5F16 = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {813, 2071}}"; + sepNavSelRange = "{2318, 0}"; + sepNavVisRect = "{{0, 994}, {813, 191}}"; + }; + }; + BA63B0ED06D1C70900CD5F16 = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {955, 3877}}"; + sepNavSelRange = "{1447, 17}"; + sepNavVisRect = "{{0, 56}, {955, 500}}"; + sepNavWindowFrame = "{{15, 269}, {750, 558}}"; + }; + }; + BA63B0EE06D1C70900CD5F16 = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {746, 1217}}"; + sepNavSelRange = "{2442, 0}"; + sepNavVisRect = "{{0, 0}, {746, 500}}"; + }; + }; + BA63B0EF06D1C70900CD5F16 = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {977, 923}}"; + sepNavSelRange = "{477, 0}"; + sepNavVisRect = "{{0, 0}, {977, 388}}"; + }; + }; + BA63B0F106D1C70900CD5F16 = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {977, 895}}"; + sepNavSelRange = "{503, 0}"; + sepNavVisRect = "{{0, 0}, {977, 388}}"; + }; + }; + BA63B0F206D1C70900CD5F16 = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {977, 909}}"; + sepNavSelRange = "{499, 0}"; + sepNavVisRect = "{{0, 0}, {977, 388}}"; + }; + }; + BA63B0F306D1C70900CD5F16 = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {977, 965}}"; + sepNavSelRange = "{500, 0}"; + sepNavVisRect = "{{0, 0}, {977, 388}}"; + }; + }; + BA63B0F406D1C70900CD5F16 = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {977, 755}}"; + sepNavSelRange = "{508, 0}"; + sepNavVisRect = "{{0, 0}, {977, 388}}"; + }; + }; + BA63B0F506D1C70900CD5F16 = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {977, 2127}}"; + sepNavSelRange = "{528, 0}"; + sepNavVisRect = "{{0, 32}, {977, 388}}"; + }; + }; + BA63B0F606D1C70900CD5F16 = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {955, 1427}}"; + sepNavSelRange = "{1240, 64}"; + sepNavVisRect = "{{0, 429}, {955, 500}}"; + }; + }; + BA63B0F706D1C70900CD5F16 = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {955, 1791}}"; + sepNavSelRange = "{0, 0}"; + sepNavVisRect = "{{0, 0}, {955, 500}}"; + }; + }; + BA63B0F806D1C70900CD5F16 = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {955, 1371}}"; + sepNavSelRange = "{562, 0}"; + sepNavVisRect = "{{0, 812}, {955, 500}}"; + }; + }; + BA63B0F906D1C70900CD5F16 = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {698, 1581}}"; + sepNavSelRange = "{0, 0}"; + sepNavVisRect = "{{0, 0}, {698, 414}}"; + }; + }; + BA63B0FA06D1C70900CD5F16 = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {955, 811}}"; + sepNavSelRange = "{1187, 0}"; + sepNavVisRect = "{{0, 311}, {955, 500}}"; + }; + }; + BA63B0FB06D1C70900CD5F16 = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {955, 965}}"; + sepNavSelRange = "{821, 0}"; + sepNavVisRect = "{{0, 303}, {955, 500}}"; + }; + }; + BA63B0FC06D1C70900CD5F16 = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {955, 2281}}"; + sepNavSelRange = "{3209, 0}"; + sepNavVisRect = "{{0, 1667}, {955, 500}}"; + sepNavWindowFrame = "{{38, 162}, {750, 558}}"; + }; + }; + BA63B0FD06D1C70900CD5F16 = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {955, 839}}"; + sepNavSelRange = "{1261, 0}"; + sepNavVisRect = "{{0, 339}, {955, 500}}"; + }; + }; + BA63B0FE06D1C70900CD5F16 = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {955, 1945}}"; + sepNavSelRange = "{1105, 8}"; + sepNavVisRect = "{{0, 625}, {955, 500}}"; + }; + }; + BA63B0FF06D1C70900CD5F16 = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {955, 1329}}"; + sepNavSelRange = "{1378, 0}"; + sepNavVisRect = "{{0, 429}, {955, 500}}"; + }; + }; + BA63B10006D1C70900CD5F16 = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {955, 2673}}"; + sepNavSelRange = "{1735, 11}"; + sepNavVisRect = "{{0, 952}, {955, 500}}"; + }; + }; + BA63B10106D1C70900CD5F16 = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {813, 3863}}"; + sepNavSelRange = "{2131, 0}"; + sepNavVisRect = "{{0, 1354}, {813, 191}}"; + sepNavWindowFrame = "{{15, 183}, {750, 558}}"; + }; + }; + BA63B12006D1C72100CD5F16 = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {955, 923}}"; + sepNavSelRange = "{22, 27}"; + sepNavVisRect = "{{0, 406}, {955, 500}}"; + }; + }; + BA63B12206D1C72100CD5F16 = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {955, 881}}"; + sepNavSelRange = "{331, 18}"; + sepNavVisRect = "{{0, 364}, {955, 500}}"; + }; + }; + BA63B12306D1C72100CD5F16 = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {955, 2071}}"; + sepNavSelRange = "{2528, 20}"; + sepNavVisRect = "{{0, 815}, {955, 500}}"; + }; + }; + BA63B12406D1C72100CD5F16 = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {813, 2435}}"; + sepNavSelRange = "{3523, 0}"; + sepNavVisRect = "{{0, 1354}, {813, 191}}"; + }; + }; + BA63B12506D1C72100CD5F16 = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {955, 2015}}"; + sepNavSelRange = "{2412, 43}"; + sepNavVisRect = "{{0, 1515}, {955, 500}}"; + }; + }; + BA63B12606D1C72100CD5F16 = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {955, 4171}}"; + sepNavSelRange = "{3946, 28}"; + sepNavVisRect = "{{0, 3543}, {955, 500}}"; + sepNavWindowFrame = "{{15, 269}, {750, 558}}"; + }; + }; + BA63B12706D1C72100CD5F16 = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {955, 937}}"; + sepNavSelRange = "{139, 0}"; + sepNavVisRect = "{{0, 410}, {955, 500}}"; + }; + }; + BA63B12906D1C72100CD5F16 = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {955, 503}}"; + sepNavSelRange = "{141, 0}"; + sepNavVisRect = "{{0, 0}, {955, 500}}"; + }; + }; + BA63B12A06D1C72100CD5F16 = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {955, 937}}"; + sepNavSelRange = "{149, 0}"; + sepNavVisRect = "{{0, 329}, {955, 500}}"; + }; + }; + BA63B12B06D1C72100CD5F16 = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {955, 1175}}"; + sepNavSelRange = "{940, 0}"; + sepNavVisRect = "{{0, 560}, {955, 500}}"; + }; + }; + BA63B12C06D1C72100CD5F16 = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {977, 475}}"; + sepNavSelRange = "{146, 0}"; + sepNavVisRect = "{{0, 0}, {977, 388}}"; + sepNavWindowFrame = "{{0, 4}, {1024, 742}}"; + }; + }; + BA63B12D06D1C72100CD5F16 = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {955, 2561}}"; + sepNavSelRange = "{51, 0}"; + sepNavVisRect = "{{0, 0}, {955, 500}}"; + }; + }; + BA63B12E06D1C72100CD5F16 = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {955, 500}}"; + sepNavSelRange = "{234, 0}"; + sepNavVisRect = "{{0, 0}, {955, 500}}"; + }; + }; + BA63B12F06D1C72100CD5F16 = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {955, 1287}}"; + sepNavSelRange = "{1670, 0}"; + sepNavVisRect = "{{0, 787}, {955, 500}}"; + }; + }; + BA63B13006D1C72100CD5F16 = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {955, 909}}"; + sepNavSelRange = "{28, 5}"; + sepNavVisRect = "{{0, 0}, {955, 500}}"; + }; + }; + BA63B13106D1C72100CD5F16 = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {955, 937}}"; + sepNavSelRange = "{1160, 0}"; + sepNavVisRect = "{{0, 437}, {955, 500}}"; + }; + }; + BA63B13206D1C72100CD5F16 = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {955, 1035}}"; + sepNavSelRange = "{1170, 0}"; + sepNavVisRect = "{{0, 275}, {955, 500}}"; + }; + }; + BA63B13306D1C72100CD5F16 = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {813, 279}}"; + sepNavSelRange = "{414, 4}"; + sepNavVisRect = "{{0, 88}, {813, 191}}"; + }; + }; + BA63B13406D1C72100CD5F16 = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {955, 1091}}"; + sepNavSelRange = "{1671, 0}"; + sepNavVisRect = "{{0, 583}, {955, 500}}"; + sepNavWindowFrame = "{{0, 4}, {1024, 742}}"; + }; + }; + BA63B13506D1C72100CD5F16 = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {956, 1469}}"; + sepNavSelRange = "{1883, 1}"; + sepNavVisRect = "{{0, 132}, {955, 500}}"; + sepNavWindowFrame = "{{61, 141}, {750, 558}}"; + }; + }; + BA63B13606D1C72100CD5F16 = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {955, 1189}}"; + sepNavSelRange = "{1541, 22}"; + sepNavVisRect = "{{0, 56}, {955, 500}}"; + }; + }; + BA63B13706D1C72100CD5F16 = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {955, 3163}}"; + sepNavSelRange = "{4631, 0}"; + sepNavVisRect = "{{0, 4}, {955, 500}}"; + }; + }; + BA63B16D06D1C8FD00CD5F16 = { + activeExec = 0; + executables = ( + BA63B16F06D1C8FD00CD5F16, + ); + }; + BA63B16F06D1C8FD00CD5F16 = { + activeArgIndex = 2147483647; + activeArgIndices = ( + ); + argumentStrings = ( + ); + configStateDict = { + }; + cppStopOnCatchEnabled = 0; + cppStopOnThrowEnabled = 0; + customDataFormattersEnabled = 1; + debuggerPlugin = GDBDebugging; + disassemblyDisplayState = 0; + dylibVariantSuffix = ""; + enableDebugStr = 1; + environmentEntries = ( + ); + isa = PBXExecutable; + libgmallocEnabled = 0; + name = "Unit Tests"; + savedGlobals = { + }; + shlibInfoDictList = ( + ); + sourceDirectories = ( + ); + }; + BA63B18306D1C95D00CD5F16 = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {955, 546}}"; + sepNavSelRange = "{469, 0}"; + sepNavVisRect = "{{0, 0}, {955, 500}}"; + }; + }; + BA63B18406D1C95D00CD5F16 = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {977, 2169}}"; + sepNavSelRange = "{0, 0}"; + sepNavVisRect = "{{0, 0}, {977, 287}}"; + }; + }; + BA63B18506D1C95D00CD5F16 = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {955, 1189}}"; + sepNavSelRange = "{1464, 0}"; + sepNavVisRect = "{{0, 667}, {955, 500}}"; + }; + }; + BA63B18606D1C95D00CD5F16 = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {955, 2015}}"; + sepNavSelRange = "{1179, 15}"; + sepNavVisRect = "{{0, 964}, {955, 500}}"; + }; + }; + BA63B18806D1C95D00CD5F16 = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {955, 3177}}"; + sepNavSelRange = "{0, 0}"; + sepNavVisRect = "{{0, 333}, {955, 500}}"; + }; + }; + BA63B18906D1C95D00CD5F16 = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {955, 1833}}"; + sepNavSelRange = "{3106, 0}"; + sepNavVisRect = "{{0, 1204}, {955, 500}}"; + }; + }; + BA63B18A06D1C95D00CD5F16 = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {955, 4129}}"; + sepNavSelRange = "{360, 0}"; + sepNavVisRect = "{{0, 0}, {955, 500}}"; + }; + }; + BA63B18B06D1C95D00CD5F16 = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {955, 1721}}"; + sepNavSelRange = "{434, 0}"; + sepNavVisRect = "{{0, 0}, {955, 500}}"; + }; + }; + BA63B18D06D1C95D00CD5F16 = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {955, 727}}"; + sepNavSelRange = "{928, 0}"; + sepNavVisRect = "{{0, 196}, {955, 500}}"; + }; + }; + BA63B18E06D1C95D00CD5F16 = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {698, 1147}}"; + sepNavSelRange = "{0, 0}"; + sepNavVisRect = "{{0, 0}, {698, 420}}"; + }; + }; + BA63B18F06D1C95D00CD5F16 = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {813, 2001}}"; + sepNavSelRange = "{3855, 0}"; + sepNavVisRect = "{{0, 1564}, {813, 191}}"; + }; + }; + BA63B19006D1C95D00CD5F16 = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {955, 1371}}"; + sepNavSelRange = "{1878, 658}"; + sepNavVisRect = "{{0, 844}, {955, 500}}"; + }; + }; + BA63B19106D1C95D00CD5F16 = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {813, 2281}}"; + sepNavSelRange = "{3561, 0}"; + sepNavVisRect = "{{0, 1620}, {813, 191}}"; + }; + }; + BA63B19206D1C95D00CD5F16 = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {746, 1329}}"; + sepNavSelRange = "{432, 0}"; + sepNavVisRect = "{{0, 0}, {746, 500}}"; + }; + }; + BA63B19506D1C95D00CD5F16 = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {955, 6523}}"; + sepNavSelRange = "{9689, 0}"; + sepNavVisRect = "{{0, 266}, {955, 500}}"; + }; + }; + BA63B19606D1C95D00CD5F16 = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {9260, 993}}"; + sepNavSelRange = "{182, 16}"; + sepNavVisRect = "{{0, 0}, {746, 500}}"; + }; + }; + BA63B19706D1C95D00CD5F16 = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {9260, 3332}}"; + sepNavSelRange = "{186, 0}"; + sepNavVisRect = "{{0, 903}, {746, 500}}"; + }; + }; + BA63B19806D1C95D00CD5F16 = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1592, 24401}}"; + sepNavSelRange = "{474, 0}"; + sepNavVisRect = "{{0, 0}, {977, 388}}"; + }; + }; + BA63B19906D1C95D00CD5F16 = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {977, 2421}}"; + sepNavSelRange = "{6314, 0}"; + sepNavVisRect = "{{0, 1787}, {977, 388}}"; + }; + }; + BA63B19A06D1C95D00CD5F16 = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {812, 853}}"; + sepNavSelRange = "{311, 59}"; + sepNavVisRect = "{{0, 0}, {698, 420}}"; + }; + }; + BA63B19C06D1C95D00CD5F16 = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {955, 629}}"; + sepNavSelRange = "{845, 0}"; + sepNavVisRect = "{{0, 102}, {955, 500}}"; + }; + }; + BA6A383C07261AE2006BFEAE = { + fRef = BA63B0EB06D1C70900CD5F16; + isa = PBXTextBookmark; + name = "FTExtrdGlyph.h: 25"; + rLen = 0; + rLoc = 491; + rType = 0; + vrLen = 871; + vrLoc = 910; + }; + BA6A385507261C05006BFEAE = { + fRef = BA63B18D06D1C95D00CD5F16; + isa = PBXTextBookmark; + name = "FTLibrary-Test.cpp: 24"; + rLen = 0; + rLoc = 660; + rType = 0; + vrLen = 849; + vrLoc = 365; + }; + BA6A385B07261C2C006BFEAE = { + fRef = BA63B13006D1C72100CD5F16; + isa = PBXTextBookmark; + name = "FTLibrary.cpp: 15"; + rLen = 0; + rLoc = 174; + rType = 0; + vrLen = 523; + vrLoc = 375; + }; + BA6A386E07261CC5006BFEAE = { + fRef = BA63B19106D1C95D00CD5F16; + isa = PBXTextBookmark; + name = "FTPoint-Test.cpp: 92"; + rLen = 0; + rLoc = 2734; + rType = 0; + vrLen = 989; + vrLoc = 2175; + }; + BA6A387007261CC5006BFEAE = { + fRef = BA63B0F806D1C70900CD5F16; + isa = PBXTextBookmark; + name = "FTLibrary.h: Instance"; + rLen = 0; + rLoc = 1152; + rType = 0; + vrLen = 1072; + vrLoc = 560; + }; + BA711EC5073587C600B5EF8E = { + fRef = BA63B19506D1C95D00CD5F16; + isa = PBXTextBookmark; + name = "FTVectoriser-Test.cpp: 368"; + rLen = 0; + rLoc = 9689; + rType = 0; + vrLen = 945; + vrLoc = 404; + }; + BA877F8A076644DA00FEB55B = { + fRef = BA63B12B06D1C72100CD5F16; + isa = PBXTextBookmark; + name = "FTGLPixmapFont.cpp: 45"; + rLen = 0; + rLoc = 940; + rType = 0; + vrLen = 1008; + vrLoc = 880; + }; + BA877F9D0766460000FEB55B = { + fRef = BA63B0FC06D1C70900CD5F16; + isa = PBXTextBookmark; + name = "FTPoint.h: operator const"; + rLen = 0; + rLoc = 3209; + rType = 0; + vrLen = 842; + vrLoc = 2873; + }; + BA877F9E0766460000FEB55B = { + fRef = BA63B13606D1C72100CD5F16; + isa = PBXTextBookmark; + name = "FTTextureGlyph::Render"; + rLen = 22; + rLoc = 1541; + rType = 0; + vrLen = 990; + vrLoc = 77; + }; + BA905B1C0708FD55006A5A17 = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {894, 1287}}"; + sepNavSelRange = "{1291, 0}"; + sepNavVisRect = "{{0, 342}, {894, 414}}"; + }; + }; + BA905B3E0708FDF0006A5A17 = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {746, 1259}}"; + sepNavSelRange = "{910, 0}"; + sepNavVisRect = "{{0, 420}, {746, 500}}"; + }; + }; + BA905B460708FE5E006A5A17 = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {746, 1651}}"; + sepNavSelRange = "{1709, 0}"; + sepNavVisRect = "{{0, 480}, {746, 500}}"; + }; + }; + BA905B470708FE5E006A5A17 = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {746, 1287}}"; + sepNavSelRange = "{892, 0}"; + sepNavVisRect = "{{0, 247}, {746, 500}}"; + }; + }; + BA905B7207090095006A5A17 = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {746, 1483}}"; + sepNavSelRange = "{505, 0}"; + sepNavVisRect = "{{0, 912}, {746, 500}}"; + }; + }; + BA905B8D070903D8006A5A17 = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {813, 1469}}"; + sepNavSelRange = "{418, 87}"; + sepNavVisRect = "{{0, 0}, {813, 324}}"; + }; + }; + BA905B8E070903D8006A5A17 = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {955, 1203}}"; + sepNavSelRange = "{1456, 25}"; + sepNavVisRect = "{{0, 452}, {955, 500}}"; + }; + }; + BA905B8F070903D8006A5A17 = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {746, 1469}}"; + sepNavSelRange = "{499, 0}"; + sepNavVisRect = "{{0, 756}, {746, 500}}"; + }; + }; + BA905B90070903D8006A5A17 = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {746, 1427}}"; + sepNavSelRange = "{2676, 0}"; + sepNavVisRect = "{{0, 900}, {746, 500}}"; + }; + }; + BA905B92070903D8006A5A17 = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {955, 1539}}"; + sepNavSelRange = "{2485, 0}"; + sepNavVisRect = "{{0, 966}, {955, 500}}"; + }; + }; + BA9E7A1D0764F73200AF32B6 = { + fRef = BA63B12706D1C72100CD5F16; + isa = PBXTextBookmark; + name = "FTGLBitmapFont.cpp: 6"; + rLen = 0; + rLoc = 139; + rType = 0; + vrLen = 718; + vrLoc = 587; + }; + BA9E7A220764F73200AF32B6 = { + fRef = BA63B12706D1C72100CD5F16; + isa = PBXTextBookmark; + name = "FTGLBitmapFont.cpp: 6"; + rLen = 0; + rLoc = 139; + rType = 0; + vrLen = 718; + vrLoc = 587; + }; + BA9E7A300764F8B100AF32B6 = { + fRef = BA63B12006D1C72100CD5F16; + isa = PBXTextBookmark; + name = "#include \"FTBitmapGlyph.h\"\n"; + rLen = 27; + rLoc = 22; + rType = 0; + vrLen = 885; + vrLoc = 665; + }; + BA9E7B2C0765120600AF32B6 = { + fRef = BA63B13306D1C72100CD5F16; + isa = PBXTextBookmark; + name = " "; + rLen = 4; + rLoc = 414; + rType = 0; + vrLen = 456; + vrLoc = 0; + }; + BA9E7B2E0765120600AF32B6 = { + fRef = BA63B18F06D1C95D00CD5F16; + isa = PBXTextBookmark; + name = "FTMesh-Test.cpp: 119"; + rLen = 0; + rLoc = 3855; + rType = 0; + vrLen = 1079; + vrLoc = 3254; + }; + BA9E7B2F0765120600AF32B6 = { + fRef = BA63B19106D1C95D00CD5F16; + isa = PBXTextBookmark; + name = "FTPoint-Test.cpp: 123"; + rLen = 0; + rLoc = 3561; + rType = 0; + vrLen = 971; + vrLoc = 3098; + }; + BA9E7B360765120600AF32B6 = { + fRef = BA63B18F06D1C95D00CD5F16; + isa = PBXTextBookmark; + name = "FTMesh-Test.cpp: 119"; + rLen = 0; + rLoc = 3855; + rType = 0; + vrLen = 1079; + vrLoc = 3254; + }; + BA9E7B570765137500AF32B6 = { + fRef = BA63B12406D1C72100CD5F16; + isa = PBXTextBookmark; + name = "FTExtrdGlyph.cpp: 104"; + rLen = 0; + rLoc = 3516; + rType = 0; + vrLen = 1659; + vrLoc = 2662; + }; + BA9E7DC607654D7200AF32B6 = { + fRef = BA63B13206D1C72100CD5F16; + isa = PBXTextBookmark; + name = "FTPixmapGlyph.cpp: 51"; + rLen = 0; + rLoc = 1170; + rType = 0; + vrLen = 831; + vrLoc = 397; + }; + BA9EEBA7071F71A100DA4FC6 = { + fRef = BA63B0FE06D1C70900CD5F16; + isa = PBXTextBookmark; + name = CharSize; + rLen = 8; + rLoc = 1105; + rType = 0; + vrLen = 1148; + vrLoc = 1219; + }; + BA9EEBA9071F71A100DA4FC6 = { + fRef = BA63B0F606D1C70900CD5F16; + isa = PBXTextBookmark; + name = "FTGlyph.h: 1"; + rLen = 0; + rLoc = 0; + rType = 0; + vrLen = 959; + vrLoc = 0; + }; + BA9EEBAA071F71A100DA4FC6 = { + fRef = BA63B13506D1C72100CD5F16; + isa = PBXTextBookmark; + name = "/ 64"; + rLen = 4; + rLoc = 1867; + rType = 0; + vrLen = 747; + vrLoc = 1192; + }; + BA9EEBAB071F71A100DA4FC6 = { + fRef = BA63B0FE06D1C70900CD5F16; + isa = PBXTextBookmark; + name = CharSize; + rLen = 8; + rLoc = 1105; + rType = 0; + vrLen = 1148; + vrLoc = 1219; + }; + BAA7C11C071CC20F00B139B5 = { + fRef = BA63B0E506D1C70900CD5F16; + isa = PBXTextBookmark; + name = "FTBBox.h: 110"; + rLen = 0; + rLoc = 2853; + rType = 0; + vrLen = 919; + vrLoc = 2161; + }; + BAA7C11E071CC20F00B139B5 = { + fRef = BA63B0E506D1C70900CD5F16; + isa = PBXTextBookmark; + name = "FTBBox.h: 110"; + rLen = 0; + rLoc = 2853; + rType = 0; + vrLen = 919; + vrLoc = 2161; + }; + BAA7C127071CC2DF00B139B5 = { + fRef = BA63B18306D1C95D00CD5F16; + isa = PBXTextBookmark; + name = "Fontdefs.h: BBC_FONT_FILE"; + rLen = 0; + rLoc = 542; + rType = 0; + vrLen = 1486; + vrLoc = 0; + }; + BAA7C128071CC2DF00B139B5 = { + fRef = BA63B18906D1C95D00CD5F16; + isa = PBXTextBookmark; + name = "FTFace-Test.cpp: 101"; + rLen = 0; + rLoc = 3106; + rType = 0; + vrLen = 1204; + vrLoc = 2406; + }; + BAA7C131071CC30800B139B5 = { + fRef = BA63B12506D1C72100CD5F16; + isa = PBXTextBookmark; + name = " err = FT_Get_Kerning( *ftFace, index1, ind"; + rLen = 43; + rLoc = 2412; + rType = 0; + vrLen = 756; + vrLoc = 2117; + }; + BAB886A50769A51000E15DEF = { + fRef = BA63B12D06D1C72100CD5F16; + isa = PBXTextBookmark; + name = "FTGLTextureFont.cpp: 3"; + rLen = 0; + rLoc = 51; + rType = 0; + vrLen = 591; + vrLoc = 0; + }; + BAB886C00769A94B00E15DEF = { + fRef = BA63B12D06D1C72100CD5F16; + isa = PBXTextBookmark; + name = "FTGLTextureFont.cpp: 3"; + rLen = 0; + rLoc = 51; + rType = 0; + vrLen = 591; + vrLoc = 0; + }; + BAB886C10769A94B00E15DEF = { + fRef = BA63B13706D1C72100CD5F16; + isa = PBXTextBookmark; + name = "FTVectoriser.cpp: 202"; + rLen = 0; + rLoc = 4631; + rType = 0; + vrLen = 1090; + vrLoc = 0; + }; + BAB886C20769A94B00E15DEF = { + fRef = BA63B13706D1C72100CD5F16; + isa = PBXTextBookmark; + name = "FTVectoriser.cpp: 202"; + rLen = 0; + rLoc = 4631; + rType = 0; + vrLen = 1090; + vrLoc = 0; + }; + BAB886C30769A94B00E15DEF = { + fRef = BA63B12D06D1C72100CD5F16; + isa = PBXTextBookmark; + name = "FTGLTextureFont.cpp: 3"; + rLen = 0; + rLoc = 51; + rType = 0; + vrLen = 591; + vrLoc = 0; + }; + BAB886C9076A513000E15DEF = { + fRef = BA63B13706D1C72100CD5F16; + isa = PBXTextBookmark; + name = "FTVectoriser.cpp: 202"; + rLen = 0; + rLoc = 4631; + rType = 0; + vrLen = 1090; + vrLoc = 0; + }; + BADFB8780763ABC700DC5643 = { + fRef = BA4DCBB306D84BD30090441D; + isa = PBXTextBookmark; + name = "demo.cpp: 298"; + rLen = 0; + rLoc = 6044; + rType = 0; + vrLen = 847; + vrLoc = 1760; + }; + BAE83F4907289E59007C557D = { + fRef = BA63B13506D1C72100CD5F16; + isa = PBXTextBookmark; + name = " +"; + rLen = 1; + rLoc = 1883; + rType = 0; + vrLen = 736; + vrLoc = 125; + }; + BAE83F4A07289E59007C557D = { + fRef = BA63B12506D1C72100CD5F16; + isa = PBXTextBookmark; + name = " err = FT_Get_Kerning( *ftFace, index1, ind"; + rLen = 43; + rLoc = 2412; + rType = 0; + vrLen = 737; + vrLoc = 2169; + }; + BAEF90D30707DB760052C597 = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {955, 1469}}"; + sepNavSelRange = "{383, 0}"; + sepNavVisRect = "{{0, 870}, {955, 500}}"; + sepNavWindowFrame = "{{15, 269}, {750, 558}}"; + }; + }; + BAF9DD780721D40300698F3A = { + fRef = BA63B13706D1C72100CD5F16; + isa = PBXTextBookmark; + name = " FTGL_DOUBLE* d = (FTGL_DOUBLE*)(contour->Point(p)); // FIXME use c++ cast\n"; + rLen = 69; + rLoc = 4986; + rType = 0; + vrLen = 850; + vrLoc = 2482; + }; + BAF9DD7C0721D40300698F3A = { + fRef = BA63B13306D1C72100CD5F16; + isa = PBXTextBookmark; + name = "FTPoint operator*( double multiplier, const FTPoint& point)\n"; + rLen = 54; + rLoc = 358; + rType = 0; + vrLen = 460; + vrLoc = 0; + }; + BAF9DD7D0721D40300698F3A = { + fRef = BA63B0FC06D1C70900CD5F16; + isa = PBXTextBookmark; + name = "FTPoint.h: 53"; + rLen = 0; + rLoc = 1193; + rType = 0; + vrLen = 865; + vrLoc = 695; + }; + BAF9DD7E0721D40300698F3A = { + fRef = BA63B12006D1C72100CD5F16; + isa = PBXTextBookmark; + name = "#include \"FTBitmapGlyph.h\"\n"; + rLen = 27; + rLoc = 22; + rType = 0; + vrLen = 886; + vrLoc = 0; + }; + BAF9DD810721D40300698F3A = { + fRef = BA63B12406D1C72100CD5F16; + isa = PBXTextBookmark; + name = "FTExtrdGlyph.cpp: 147"; + rLen = 0; + rLoc = 4594; + rType = 0; + vrLen = 658; + vrLoc = 4389; + }; + BAF9DD820721D40300698F3A = { + fRef = BA63B13106D1C72100CD5F16; + isa = PBXTextBookmark; + name = "FTOutlineGlyph.cpp: 64"; + rLen = 0; + rLoc = 1324; + rType = 0; + vrLen = 632; + vrLoc = 699; + }; + BAF9DD830721D40300698F3A = { + fRef = BA63B13206D1C72100CD5F16; + isa = PBXTextBookmark; + name = "FTPixmapGlyph.cpp: 98"; + rLen = 0; + rLoc = 1716; + rType = 0; + vrLen = 0; + vrLoc = 1716; + }; + BAF9DD840721D40300698F3A = { + fRef = BA63B13406D1C72100CD5F16; + isa = PBXTextBookmark; + name = "FTPolyGlyph.cpp: 76"; + rLen = 0; + rLoc = 1838; + rType = 0; + vrLen = 644; + vrLoc = 1200; + }; + BAF9DD850721D40300698F3A = { + fRef = BA63B13606D1C72100CD5F16; + isa = PBXTextBookmark; + name = "FTTextureGlyph.cpp: 82"; + rLen = 0; + rLoc = 2234; + rType = 0; + vrLen = 789; + vrLoc = 1452; + }; + BAF9DD860721D40300698F3A = { + fRef = BA63B18A06D1C95D00CD5F16; + isa = PBXTextBookmark; + name = "FTFont-Test.cpp: Render"; + rLen = 0; + rLoc = 397; + rType = 0; + vrLen = 828; + vrLoc = 0; + }; + BAF9DD870721D40300698F3A = { + fRef = BA63B18B06D1C95D00CD5F16; + isa = PBXTextBookmark; + name = "FTGlyphContainer-Test.cpp: Render"; + rLen = 0; + rLoc = 473; + rType = 0; + vrLen = 856; + vrLoc = 107; + }; + BAF9DDB20721D64500698F3A = { + fRef = BA63B12D06D1C72100CD5F16; + isa = PBXTextBookmark; + name = "FTGLTextureFont.cpp: 22"; + rLen = 0; + rLoc = 377; + rType = 0; + vrLen = 667; + vrLoc = 0; + }; + BAF9DE3B0721E76900698F3A = { + fRef = BA63B12606D1C72100CD5F16; + isa = PBXTextBookmark; + name = " urz = totalBBox.upperZ;\n"; + rLen = 28; + rLoc = 3946; + rType = 0; + vrLen = 720; + vrLoc = 4728; + }; + BAF9DE510721E76900698F3A = { + fRef = BA63B12606D1C72100CD5F16; + isa = PBXTextBookmark; + name = " urz = totalBBox.upperZ;\n"; + rLen = 28; + rLoc = 3946; + rType = 0; + vrLen = 720; + vrLoc = 4728; + }; + BAF9DE520721E76900698F3A = { + fRef = BA63B12F06D1C72100CD5F16; + isa = PBXTextBookmark; + name = "FTGlyphContainer.cpp: 78"; + rLen = 0; + rLoc = 1858; + rType = 0; + vrLen = 1121; + vrLoc = 1235; + }; + BAF9DE570721E76900698F3A = { + fRef = BA63B0E606D1C70900CD5F16; + isa = PBXTextBookmark; + name = "FTBitmapGlyph.h: Render"; + rLen = 0; + rLoc = 1013; + rType = 0; + vrLen = 834; + vrLoc = 542; + }; + BAF9DE5D0721E76900698F3A = { + fRef = BA63B0EB06D1C70900CD5F16; + isa = PBXTextBookmark; + name = "FTExtrdGlyph.h: Render"; + rLen = 0; + rLoc = 1296; + rType = 0; + vrLen = 1164; + vrLoc = 581; + }; + BAF9DE650721E76900698F3A = { + fRef = BA63B0FA06D1C70900CD5F16; + isa = PBXTextBookmark; + name = "FTOutlineGlyph.h: Render"; + rLen = 0; + rLoc = 1180; + rType = 0; + vrLen = 979; + vrLoc = 370; + }; + BAF9DE690721E76900698F3A = { + fRef = BA63B0FB06D1C70900CD5F16; + isa = PBXTextBookmark; + name = "FTPixmapGlyph.h: Render"; + rLen = 0; + rLoc = 814; + rType = 0; + vrLen = 857; + vrLoc = 343; + }; + BAF9DE6C0721E76900698F3A = { + fRef = BA63B0FD06D1C70900CD5F16; + isa = PBXTextBookmark; + name = "FTPolyGlyph.h: Render"; + rLen = 0; + rLoc = 1254; + rType = 0; + vrLen = 1026; + vrLoc = 397; + }; + BAF9DE6E0721E76900698F3A = { + fRef = BA63B0FF06D1C70900CD5F16; + isa = PBXTextBookmark; + name = "FTTextureGlyph.h: Render"; + rLen = 0; + rLoc = 1371; + rType = 0; + vrLen = 1194; + vrLoc = 688; + }; + BAF9DE7D0721E79B00698F3A = { + fRef = BAEF90D30707DB760052C597; + isa = PBXTextBookmark; + name = "FTGlyph-Test.cpp: Render"; + rLen = 0; + rLoc = 378; + rType = 0; + vrLen = 870; + vrLoc = 0; + }; + BAF9DE970721EBE300698F3A = { + fRef = BA63B12F06D1C72100CD5F16; + isa = PBXTextBookmark; + name = "FTGlyphContainer.cpp: 69"; + rLen = 0; + rLoc = 1670; + rType = 0; + vrLen = 1075; + vrLoc = 1162; + }; + BAF9DEF20721F26200698F3A = { + fRef = BA63B12E06D1C72100CD5F16; + isa = PBXTextBookmark; + name = "FTGlyph.cpp: 11"; + rLen = 0; + rLoc = 234; + rType = 0; + vrLen = 293; + vrLoc = 0; + }; + BAF9DEF30721F26200698F3A = { + fRef = BA63B0E606D1C70900CD5F16; + isa = PBXTextBookmark; + name = "FTBitmapGlyph.h: Render"; + rLen = 0; + rLoc = 1020; + rType = 0; + vrLen = 841; + vrLoc = 542; + }; + BAF9DEF70721F26200698F3A = { + fRef = BA63B0FA06D1C70900CD5F16; + isa = PBXTextBookmark; + name = "FTOutlineGlyph.h: Render"; + rLen = 0; + rLoc = 1187; + rType = 0; + vrLen = 986; + vrLoc = 370; + }; + BAF9DEF80721F26200698F3A = { + fRef = BA63B0FB06D1C70900CD5F16; + isa = PBXTextBookmark; + name = "FTPixmapGlyph.h: Render"; + rLen = 0; + rLoc = 821; + rType = 0; + vrLen = 864; + vrLoc = 343; + }; + BAF9DEF90721F26200698F3A = { + fRef = BA63B0FD06D1C70900CD5F16; + isa = PBXTextBookmark; + name = "FTPolyGlyph.h: Render"; + rLen = 0; + rLoc = 1261; + rType = 0; + vrLen = 1033; + vrLoc = 397; + }; + BAF9DEFA0721F26200698F3A = { + fRef = BA63B0FF06D1C70900CD5F16; + isa = PBXTextBookmark; + name = "FTTextureGlyph.h: Render"; + rLen = 0; + rLoc = 1378; + rType = 0; + vrLen = 1201; + vrLoc = 688; + }; + BAF9DEFB0721F26200698F3A = { + fRef = BA63B13106D1C72100CD5F16; + isa = PBXTextBookmark; + name = "FTOutlineGlyph.cpp: Render"; + rLen = 0; + rLoc = 1160; + rType = 0; + vrLen = 637; + vrLoc = 699; + }; + BAF9DEFD0721F26200698F3A = { + fRef = BA63B13406D1C72100CD5F16; + isa = PBXTextBookmark; + name = "FTPolyGlyph.cpp: Render"; + rLen = 0; + rLoc = 1671; + rType = 0; + vrLen = 709; + vrLoc = 1140; + }; + BAF9DEFF0721F26200698F3A = { + fRef = BA63B18A06D1C95D00CD5F16; + isa = PBXTextBookmark; + name = "FTFont-Test.cpp: Render"; + rLen = 0; + rLoc = 360; + rType = 0; + vrLen = 833; + vrLoc = 0; + }; + BAF9DF000721F26200698F3A = { + fRef = BA63B0F606D1C70900CD5F16; + isa = PBXTextBookmark; + name = " virtual const FTPoint& Render( const FTPoint& pen) = 0;\n"; + rLen = 64; + rLoc = 1240; + rType = 0; + vrLen = 1157; + vrLoc = 579; + }; + BAF9DF020721F26200698F3A = { + fRef = BA63B18B06D1C95D00CD5F16; + isa = PBXTextBookmark; + name = "FTGlyphContainer-Test.cpp: Render"; + rLen = 0; + rLoc = 434; + rType = 0; + vrLen = 821; + vrLoc = 0; + }; + BAF9DF380721F4CC00698F3A = { + fRef = BAEF90D30707DB760052C597; + isa = PBXTextBookmark; + name = "FTGlyph-Test.cpp: Render"; + rLen = 0; + rLoc = 383; + rType = 0; + vrLen = 997; + vrLoc = 1642; + }; + BAF9DF430722051600698F3A = { + fRef = BA63B12306D1C72100CD5F16; + isa = PBXTextBookmark; + name = "FTContour::FTContour"; + rLen = 20; + rLoc = 2528; + rType = 0; + vrLen = 1915; + vrLoc = 3738; + }; + BAF9DF4C0722064A00698F3A = { + fRef = BA63B18806D1C95D00CD5F16; + isa = PBXTextBookmark; + name = "FTContour-Test.cpp: 1"; + rLen = 0; + rLoc = 0; + rType = 0; + vrLen = 503; + vrLoc = 409; + }; + BAF9DF500722064A00698F3A = { + fRef = BA63B19506D1C95D00CD5F16; + isa = PBXTextBookmark; + name = "FTVectoriser-Test.cpp: 368"; + rLen = 0; + rLoc = 9689; + rType = 0; + vrLen = 993; + vrLoc = 9706; + }; + BAF9DF510722064A00698F3A = { + fRef = BA63B18806D1C95D00CD5F16; + isa = PBXTextBookmark; + name = "FTContour-Test.cpp: 1"; + rLen = 0; + rLoc = 0; + rType = 0; + vrLen = 503; + vrLoc = 409; + }; + BAF9DF5C0722070100698F3A = { + fRef = BA63B12306D1C72100CD5F16; + isa = PBXTextBookmark; + name = "FTContour::FTContour"; + rLen = 20; + rLoc = 2528; + rType = 0; + vrLen = 1487; + vrLoc = 1918; + }; +} diff --git a/src/WinLibs/FTGL/mac/FTGL.xcode/project.pbxproj b/src/WinLibs/FTGL/mac/FTGL.xcode/project.pbxproj new file mode 100644 index 000000000..ba60e1f9c --- /dev/null +++ b/src/WinLibs/FTGL/mac/FTGL.xcode/project.pbxproj @@ -0,0 +1,1996 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 39; + objects = { + BA46EBA206D84F4D000A57FF = { + containerPortal = BA63B0C006D1C62B00CD5F16; + isa = PBXContainerItemProxy; + proxyType = 1; + remoteGlobalIDString = BA63B0DD06D1C6D900CD5F16; + remoteInfo = ftgl; + }; + BA46EBA306D84F4D000A57FF = { + isa = PBXTargetDependency; + target = BA63B0DD06D1C6D900CD5F16; + targetProxy = BA46EBA206D84F4D000A57FF; + }; + BA46EBA406D84F6A000A57FF = { + containerPortal = BA63B0C006D1C62B00CD5F16; + isa = PBXContainerItemProxy; + proxyType = 1; + remoteGlobalIDString = BA63B0DD06D1C6D900CD5F16; + remoteInfo = ftgl; + }; + BA46EBA506D84F6A000A57FF = { + isa = PBXTargetDependency; + target = BA63B0DD06D1C6D900CD5F16; + targetProxy = BA46EBA406D84F6A000A57FF; + }; + BA46EBA606D84F74000A57FF = { + containerPortal = BA63B0C006D1C62B00CD5F16; + isa = PBXContainerItemProxy; + proxyType = 1; + remoteGlobalIDString = BA63B0DD06D1C6D900CD5F16; + remoteInfo = ftgl; + }; + BA46EBA706D84F74000A57FF = { + isa = PBXTargetDependency; + target = BA63B0DD06D1C6D900CD5F16; + targetProxy = BA46EBA606D84F74000A57FF; + }; + BA4DCB0006D8487A0090441D = { + children = ( + BA4DCB0B06D848A60090441D, + BA4DCB0C06D848A60090441D, + BA4DCB0D06D848A60090441D, + BA4DCB0E06D848A60090441D, + BA4DCB0F06D848A60090441D, + ); + isa = PBXGroup; + name = "FTGL Demo"; + refType = 4; + sourceTree = ""; + }; + BA4DCB0B06D848A60090441D = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.c; + name = tb.c; + path = /Users/henry/Development/PROJECTS/FTGL/demo/tb.c; + refType = 0; + sourceTree = ""; + }; + BA4DCB0C06D848A60090441D = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.cpp; + name = FTGLDemo.cpp; + path = /Users/henry/Development/PROJECTS/FTGL/demo/FTGLDemo.cpp; + refType = 0; + sourceTree = ""; + }; + BA4DCB0D06D848A60090441D = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + name = trackball.h; + path = /Users/henry/Development/PROJECTS/FTGL/demo/trackball.h; + refType = 0; + sourceTree = ""; + }; + BA4DCB0E06D848A60090441D = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + name = tb.h; + path = /Users/henry/Development/PROJECTS/FTGL/demo/tb.h; + refType = 0; + sourceTree = ""; + }; + BA4DCB0F06D848A60090441D = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.c; + name = trackball.c; + path = /Users/henry/Development/PROJECTS/FTGL/demo/trackball.c; + refType = 0; + sourceTree = ""; + }; + BA4DCB1C06D8494E0090441D = { + buildActionMask = 2147483647; + files = ( + BA4DCB2106D849640090441D, + BA4DCB2206D849650090441D, + BA4DCB2306D849660090441D, + ); + isa = PBXSourcesBuildPhase; + runOnlyForDeploymentPostprocessing = 0; + }; + BA4DCB1D06D8494E0090441D = { + buildActionMask = 2147483647; + files = ( + BA4DCB2506D849870090441D, + BA4DCB2706D849AB0090441D, + BA4DCB7206D84A0F0090441D, + BA4DCB8406D84A330090441D, + BA4DCB9606D84B220090441D, + BA4DCB9806D84B390090441D, + ); + isa = PBXFrameworksBuildPhase; + runOnlyForDeploymentPostprocessing = 0; + }; + BA4DCB1E06D8494E0090441D = { + buildPhases = ( + BA4DCB1C06D8494E0090441D, + BA4DCB1D06D8494E0090441D, + ); + buildRules = ( + ); + buildSettings = { + HEADER_SEARCH_PATHS = "../mac/Includes ../include"; + INSTALL_PATH = /usr/local/bin; + LIBRARY_SEARCH_PATHS = ../mac/Libraries; + OTHER_CFLAGS = ""; + OTHER_LDFLAGS = ""; + OTHER_REZFLAGS = ""; + PRODUCT_NAME = FTGLDemo; + SECTORDER_FLAGS = ""; + WARNING_CFLAGS = "-Wmost -Wno-four-char-constants -Wno-unknown-pragmas"; + }; + dependencies = ( + BA46EBA506D84F6A000A57FF, + ); + isa = PBXNativeTarget; + name = "FTGL Demo"; + productName = FTGLDemo; + productReference = BA4DCB1F06D8494E0090441D; + productType = "com.apple.product-type.tool"; + }; + BA4DCB1F06D8494E0090441D = { + explicitFileType = "compiled.mach-o.executable"; + includeInIndex = 0; + isa = PBXFileReference; + path = FTGLDemo; + refType = 3; + sourceTree = BUILT_PRODUCTS_DIR; + }; + BA4DCB2106D849640090441D = { + fileRef = BA4DCB0B06D848A60090441D; + isa = PBXBuildFile; + settings = { + }; + }; + BA4DCB2206D849650090441D = { + fileRef = BA4DCB0C06D848A60090441D; + isa = PBXBuildFile; + settings = { + }; + }; + BA4DCB2306D849660090441D = { + fileRef = BA4DCB0F06D848A60090441D; + isa = PBXBuildFile; + settings = { + }; + }; + BA4DCB2506D849870090441D = { + fileRef = BA63B0DE06D1C6D900CD5F16; + isa = PBXBuildFile; + settings = { + }; + }; + BA4DCB2606D849AB0090441D = { + isa = PBXFileReference; + lastKnownFileType = wrapper.framework; + name = GLUT.framework; + path = /System/Library/Frameworks/GLUT.framework; + refType = 0; + sourceTree = ""; + }; + BA4DCB2706D849AB0090441D = { + fileRef = BA4DCB2606D849AB0090441D; + isa = PBXBuildFile; + settings = { + }; + }; + BA4DCB7206D84A0F0090441D = { + fileRef = BA8E5B8B06D2A8BC00DA18F2; + isa = PBXBuildFile; + settings = { + }; + }; + BA4DCB8306D84A330090441D = { + isa = PBXFileReference; + lastKnownFileType = wrapper.framework; + name = Cocoa.framework; + path = /System/Library/Frameworks/Cocoa.framework; + refType = 0; + sourceTree = ""; + }; + BA4DCB8406D84A330090441D = { + fileRef = BA4DCB8306D84A330090441D; + isa = PBXBuildFile; + settings = { + }; + }; + BA4DCB9606D84B220090441D = { + fileRef = BA8E5B8606D2A88200DA18F2; + isa = PBXBuildFile; + settings = { + }; + }; + BA4DCB9806D84B390090441D = { + fileRef = BAB1B55D06D368A800C8A3FF; + isa = PBXBuildFile; + settings = { + }; + }; + BA4DCBAA06D84BA70090441D = { + buildActionMask = 2147483647; + files = ( + BA4DCBB406D84BD30090441D, + ); + isa = PBXSourcesBuildPhase; + runOnlyForDeploymentPostprocessing = 0; + }; + BA4DCBAB06D84BA70090441D = { + buildActionMask = 2147483647; + files = ( + BA4DCBB506D84BDE0090441D, + BA4DCBB606D84BDF0090441D, + BA4DCBB706D84BE40090441D, + BA4DCBB806D84BE50090441D, + BA4DCBB906D84BE60090441D, + BA4DCBBA06D84BE90090441D, + ); + isa = PBXFrameworksBuildPhase; + runOnlyForDeploymentPostprocessing = 0; + }; + BA4DCBAC06D84BA70090441D = { + buildPhases = ( + BA4DCBAA06D84BA70090441D, + BA4DCBAB06D84BA70090441D, + ); + buildRules = ( + ); + buildSettings = { + HEADER_SEARCH_PATHS = ../mac/Includes; + INSTALL_PATH = /usr/local/bin; + LIBRARY_SEARCH_PATHS = ../mac/Libraries; + OTHER_CFLAGS = ""; + OTHER_LDFLAGS = ""; + OTHER_REZFLAGS = ""; + PRODUCT_NAME = FTGLTest; + SECTORDER_FLAGS = ""; + WARNING_CFLAGS = "-Wmost -Wno-four-char-constants -Wno-unknown-pragmas"; + }; + dependencies = ( + BA46EBA706D84F74000A57FF, + ); + isa = PBXNativeTarget; + name = "FTGL Test"; + productName = FTGLTest; + productReference = BA4DCBAD06D84BA70090441D; + productType = "com.apple.product-type.tool"; + }; + BA4DCBAD06D84BA70090441D = { + explicitFileType = "compiled.mach-o.executable"; + includeInIndex = 0; + isa = PBXFileReference; + path = FTGLTest; + refType = 3; + sourceTree = BUILT_PRODUCTS_DIR; + }; + BA4DCBAF06D84BBA0090441D = { + children = ( + BA4DCBB306D84BD30090441D, + ); + isa = PBXGroup; + name = "FTGL Test"; + refType = 4; + sourceTree = ""; + }; + BA4DCBB306D84BD30090441D = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.cpp; + name = demo.cpp; + path = /Users/henry/Development/PROJECTS/FTGL/test/demo.cpp; + refType = 0; + sourceTree = ""; + }; + BA4DCBB406D84BD30090441D = { + fileRef = BA4DCBB306D84BD30090441D; + isa = PBXBuildFile; + settings = { + }; + }; + BA4DCBB506D84BDE0090441D = { + fileRef = BA4DCB8306D84A330090441D; + isa = PBXBuildFile; + settings = { + }; + }; + BA4DCBB606D84BDF0090441D = { + fileRef = BA4DCB2606D849AB0090441D; + isa = PBXBuildFile; + settings = { + }; + }; + BA4DCBB706D84BE40090441D = { + fileRef = BAB1B55D06D368A800C8A3FF; + isa = PBXBuildFile; + settings = { + }; + }; + BA4DCBB806D84BE50090441D = { + fileRef = BA8E5B8B06D2A8BC00DA18F2; + isa = PBXBuildFile; + settings = { + }; + }; + BA4DCBB906D84BE60090441D = { + fileRef = BA8E5B8606D2A88200DA18F2; + isa = PBXBuildFile; + settings = { + }; + }; + BA4DCBBA06D84BE90090441D = { + fileRef = BA63B0DE06D1C6D900CD5F16; + isa = PBXBuildFile; + settings = { + }; + }; + BA63B0BC06D1C62B00CD5F16 = { + children = ( + BA63B11F06D1C72100CD5F16, + BA63B0E406D1C70900CD5F16, + BA63B17706D1C95D00CD5F16, + BA4DCBAF06D84BBA0090441D, + BA4DCB0006D8487A0090441D, + BAB1B51906D3688300C8A3FF, + BA63B0CB06D1C65E00CD5F16, + ); + isa = PBXGroup; + refType = 4; + sourceTree = ""; + }; + BA63B0BE06D1C62B00CD5F16 = { + buildSettings = { + COPY_PHASE_STRIP = NO; + }; + isa = PBXBuildStyle; + name = Development; + }; + BA63B0BF06D1C62B00CD5F16 = { + buildSettings = { + COPY_PHASE_STRIP = YES; + }; + isa = PBXBuildStyle; + name = Deployment; + }; + BA63B0C006D1C62B00CD5F16 = { + buildSettings = { + }; + buildStyles = ( + BA63B0BE06D1C62B00CD5F16, + BA63B0BF06D1C62B00CD5F16, + ); + hasScannedForEncodings = 1; + isa = PBXProject; + mainGroup = BA63B0BC06D1C62B00CD5F16; + productRefGroup = BA63B0CB06D1C65E00CD5F16; + projectDirPath = ""; + targets = ( + BA63B0DD06D1C6D900CD5F16, + BA63B16D06D1C8FD00CD5F16, + BA4DCB1E06D8494E0090441D, + BA4DCBAC06D84BA70090441D, + ); + }; + BA63B0CB06D1C65E00CD5F16 = { + children = ( + BA63B0DE06D1C6D900CD5F16, + BA63B16E06D1C8FD00CD5F16, + BA4DCB1F06D8494E0090441D, + BA4DCBAD06D84BA70090441D, + ); + isa = PBXGroup; + name = Products; + refType = 4; + sourceTree = ""; + }; + BA63B0DA06D1C6D900CD5F16 = { + buildActionMask = 2147483647; + files = ( + BA63B10206D1C70900CD5F16, + BA63B10306D1C70900CD5F16, + BA63B10506D1C70900CD5F16, + BA63B10606D1C70900CD5F16, + BA63B10706D1C70900CD5F16, + BA63B10806D1C70900CD5F16, + BA63B10906D1C70900CD5F16, + BA63B10A06D1C70900CD5F16, + BA63B10B06D1C70900CD5F16, + BA63B10C06D1C70900CD5F16, + BA63B10E06D1C70900CD5F16, + BA63B10F06D1C70900CD5F16, + BA63B11006D1C70900CD5F16, + BA63B11106D1C70900CD5F16, + BA63B11206D1C70900CD5F16, + BA63B11306D1C70900CD5F16, + BA63B11406D1C70900CD5F16, + BA63B11506D1C70900CD5F16, + BA63B11606D1C70900CD5F16, + BA63B11706D1C70900CD5F16, + BA63B11806D1C70900CD5F16, + BA63B11906D1C70900CD5F16, + BA63B11A06D1C70900CD5F16, + BA63B11B06D1C70900CD5F16, + BA63B11C06D1C70900CD5F16, + BA63B11D06D1C70900CD5F16, + BA63B11E06D1C70900CD5F16, + ); + isa = PBXHeadersBuildPhase; + runOnlyForDeploymentPostprocessing = 0; + }; + BA63B0DB06D1C6D900CD5F16 = { + buildActionMask = 2147483647; + files = ( + BA63B13806D1C72100CD5F16, + BA63B13A06D1C72100CD5F16, + BA63B13B06D1C72100CD5F16, + BA63B13C06D1C72100CD5F16, + BA63B13D06D1C72100CD5F16, + BA63B13E06D1C72100CD5F16, + BA63B13F06D1C72100CD5F16, + BA63B14106D1C72100CD5F16, + BA63B14206D1C72100CD5F16, + BA63B14306D1C72100CD5F16, + BA63B14406D1C72100CD5F16, + BA63B14506D1C72100CD5F16, + BA63B14606D1C72100CD5F16, + BA63B14706D1C72100CD5F16, + BA63B14806D1C72100CD5F16, + BA63B14906D1C72100CD5F16, + BA63B14A06D1C72100CD5F16, + BA63B14B06D1C72100CD5F16, + BA63B14C06D1C72100CD5F16, + BA63B14D06D1C72100CD5F16, + BA63B14E06D1C72100CD5F16, + BA63B14F06D1C72100CD5F16, + ); + isa = PBXSourcesBuildPhase; + runOnlyForDeploymentPostprocessing = 0; + }; + BA63B0DC06D1C6D900CD5F16 = { + buildActionMask = 2147483647; + files = ( + ); + isa = PBXFrameworksBuildPhase; + runOnlyForDeploymentPostprocessing = 0; + }; + BA63B0DD06D1C6D900CD5F16 = { + buildPhases = ( + BA63B0DA06D1C6D900CD5F16, + BA63B0DB06D1C6D900CD5F16, + BA63B0DC06D1C6D900CD5F16, + ); + buildRules = ( + ); + buildSettings = { + GCC_ENABLE_CPP_EXCEPTIONS = NO; + GCC_ENABLE_CPP_RTTI = NO; + GCC_ENABLE_PASCAL_STRINGS = NO; + HEADER_SEARCH_PATHS = Includes; + INSTALL_PATH = /usr/local/lib; + LIBRARY_STYLE = STATIC; + OTHER_CFLAGS = ""; + OTHER_LDFLAGS = ""; + OTHER_REZFLAGS = ""; + PRODUCT_NAME = ftgl; + SECTORDER_FLAGS = ""; + WARNING_CFLAGS = "-Wmost -Wno-four-char-constants -Wno-unknown-pragmas"; + }; + dependencies = ( + ); + isa = PBXNativeTarget; + name = ftgl; + productName = ftgl; + productReference = BA63B0DE06D1C6D900CD5F16; + productType = "com.apple.product-type.library.static"; + }; + BA63B0DE06D1C6D900CD5F16 = { + explicitFileType = archive.ar; + includeInIndex = 0; + isa = PBXFileReference; + path = libftgl.a; + refType = 3; + sourceTree = BUILT_PRODUCTS_DIR; + }; + BA63B0E406D1C70900CD5F16 = { + children = ( + BA63B0E506D1C70900CD5F16, + BA63B0E606D1C70900CD5F16, + BA63B0E806D1C70900CD5F16, + BA63B0E906D1C70900CD5F16, + BA63B0EA06D1C70900CD5F16, + BA63B0EB06D1C70900CD5F16, + BA63B0EC06D1C70900CD5F16, + BA63B0ED06D1C70900CD5F16, + BA63B0EE06D1C70900CD5F16, + BA63B0EF06D1C70900CD5F16, + BA63B0F106D1C70900CD5F16, + BA63B0F206D1C70900CD5F16, + BA63B0F306D1C70900CD5F16, + BA63B0F406D1C70900CD5F16, + BA63B0F506D1C70900CD5F16, + BA63B0F606D1C70900CD5F16, + BA63B0F706D1C70900CD5F16, + BA63B0F806D1C70900CD5F16, + BA63B0F906D1C70900CD5F16, + BA63B0FA06D1C70900CD5F16, + BA63B0FB06D1C70900CD5F16, + BA63B0FC06D1C70900CD5F16, + BA63B0FD06D1C70900CD5F16, + BA63B0FE06D1C70900CD5F16, + BA63B0FF06D1C70900CD5F16, + BA63B10006D1C70900CD5F16, + BA63B10106D1C70900CD5F16, + ); + isa = PBXGroup; + name = include; + path = /Users/henry/Development/PROJECTS/FTGL/include; + refType = 0; + sourceTree = ""; + }; + BA63B0E506D1C70900CD5F16 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + path = FTBBox.h; + refType = 4; + sourceTree = ""; + }; + BA63B0E606D1C70900CD5F16 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + path = FTBitmapGlyph.h; + refType = 4; + sourceTree = ""; + }; + BA63B0E806D1C70900CD5F16 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + path = FTCharmap.h; + refType = 4; + sourceTree = ""; + }; + BA63B0E906D1C70900CD5F16 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + path = FTCharToGlyphIndexMap.h; + refType = 4; + sourceTree = ""; + }; + BA63B0EA06D1C70900CD5F16 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + path = FTContour.h; + refType = 4; + sourceTree = ""; + }; + BA63B0EB06D1C70900CD5F16 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + path = FTExtrdGlyph.h; + refType = 4; + sourceTree = ""; + }; + BA63B0EC06D1C70900CD5F16 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + path = FTFace.h; + refType = 4; + sourceTree = ""; + }; + BA63B0ED06D1C70900CD5F16 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + path = FTFont.h; + refType = 4; + sourceTree = ""; + }; + BA63B0EE06D1C70900CD5F16 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + path = FTGL.h; + refType = 4; + sourceTree = ""; + }; + BA63B0EF06D1C70900CD5F16 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + path = FTGLBitmapFont.h; + refType = 4; + sourceTree = ""; + }; + BA63B0F106D1C70900CD5F16 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + path = FTGLExtrdFont.h; + refType = 4; + sourceTree = ""; + }; + BA63B0F206D1C70900CD5F16 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + path = FTGLOutlineFont.h; + refType = 4; + sourceTree = ""; + }; + BA63B0F306D1C70900CD5F16 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + path = FTGLPixmapFont.h; + refType = 4; + sourceTree = ""; + }; + BA63B0F406D1C70900CD5F16 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + path = FTGLPolygonFont.h; + refType = 4; + sourceTree = ""; + }; + BA63B0F506D1C70900CD5F16 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + path = FTGLTextureFont.h; + refType = 4; + sourceTree = ""; + }; + BA63B0F606D1C70900CD5F16 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + path = FTGlyph.h; + refType = 4; + sourceTree = ""; + }; + BA63B0F706D1C70900CD5F16 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + path = FTGlyphContainer.h; + refType = 4; + sourceTree = ""; + }; + BA63B0F806D1C70900CD5F16 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + path = FTLibrary.h; + refType = 4; + sourceTree = ""; + }; + BA63B0F906D1C70900CD5F16 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + path = FTList.h; + refType = 4; + sourceTree = ""; + }; + BA63B0FA06D1C70900CD5F16 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + path = FTOutlineGlyph.h; + refType = 4; + sourceTree = ""; + }; + BA63B0FB06D1C70900CD5F16 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + path = FTPixmapGlyph.h; + refType = 4; + sourceTree = ""; + }; + BA63B0FC06D1C70900CD5F16 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + path = FTPoint.h; + refType = 4; + sourceTree = ""; + }; + BA63B0FD06D1C70900CD5F16 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + path = FTPolyGlyph.h; + refType = 4; + sourceTree = ""; + }; + BA63B0FE06D1C70900CD5F16 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + path = FTSize.h; + refType = 4; + sourceTree = ""; + }; + BA63B0FF06D1C70900CD5F16 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + path = FTTextureGlyph.h; + refType = 4; + sourceTree = ""; + }; + BA63B10006D1C70900CD5F16 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + path = FTVector.h; + refType = 4; + sourceTree = ""; + }; + BA63B10106D1C70900CD5F16 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + path = FTVectoriser.h; + refType = 4; + sourceTree = ""; + }; + BA63B10206D1C70900CD5F16 = { + fileRef = BA63B0E506D1C70900CD5F16; + isa = PBXBuildFile; + settings = { + }; + }; + BA63B10306D1C70900CD5F16 = { + fileRef = BA63B0E606D1C70900CD5F16; + isa = PBXBuildFile; + settings = { + }; + }; + BA63B10506D1C70900CD5F16 = { + fileRef = BA63B0E806D1C70900CD5F16; + isa = PBXBuildFile; + settings = { + }; + }; + BA63B10606D1C70900CD5F16 = { + fileRef = BA63B0E906D1C70900CD5F16; + isa = PBXBuildFile; + settings = { + }; + }; + BA63B10706D1C70900CD5F16 = { + fileRef = BA63B0EA06D1C70900CD5F16; + isa = PBXBuildFile; + settings = { + }; + }; + BA63B10806D1C70900CD5F16 = { + fileRef = BA63B0EB06D1C70900CD5F16; + isa = PBXBuildFile; + settings = { + }; + }; + BA63B10906D1C70900CD5F16 = { + fileRef = BA63B0EC06D1C70900CD5F16; + isa = PBXBuildFile; + settings = { + }; + }; + BA63B10A06D1C70900CD5F16 = { + fileRef = BA63B0ED06D1C70900CD5F16; + isa = PBXBuildFile; + settings = { + }; + }; + BA63B10B06D1C70900CD5F16 = { + fileRef = BA63B0EE06D1C70900CD5F16; + isa = PBXBuildFile; + settings = { + }; + }; + BA63B10C06D1C70900CD5F16 = { + fileRef = BA63B0EF06D1C70900CD5F16; + isa = PBXBuildFile; + settings = { + }; + }; + BA63B10E06D1C70900CD5F16 = { + fileRef = BA63B0F106D1C70900CD5F16; + isa = PBXBuildFile; + settings = { + }; + }; + BA63B10F06D1C70900CD5F16 = { + fileRef = BA63B0F206D1C70900CD5F16; + isa = PBXBuildFile; + settings = { + }; + }; + BA63B11006D1C70900CD5F16 = { + fileRef = BA63B0F306D1C70900CD5F16; + isa = PBXBuildFile; + settings = { + }; + }; + BA63B11106D1C70900CD5F16 = { + fileRef = BA63B0F406D1C70900CD5F16; + isa = PBXBuildFile; + settings = { + }; + }; + BA63B11206D1C70900CD5F16 = { + fileRef = BA63B0F506D1C70900CD5F16; + isa = PBXBuildFile; + settings = { + }; + }; + BA63B11306D1C70900CD5F16 = { + fileRef = BA63B0F606D1C70900CD5F16; + isa = PBXBuildFile; + settings = { + }; + }; + BA63B11406D1C70900CD5F16 = { + fileRef = BA63B0F706D1C70900CD5F16; + isa = PBXBuildFile; + settings = { + }; + }; + BA63B11506D1C70900CD5F16 = { + fileRef = BA63B0F806D1C70900CD5F16; + isa = PBXBuildFile; + settings = { + }; + }; + BA63B11606D1C70900CD5F16 = { + fileRef = BA63B0F906D1C70900CD5F16; + isa = PBXBuildFile; + settings = { + }; + }; + BA63B11706D1C70900CD5F16 = { + fileRef = BA63B0FA06D1C70900CD5F16; + isa = PBXBuildFile; + settings = { + }; + }; + BA63B11806D1C70900CD5F16 = { + fileRef = BA63B0FB06D1C70900CD5F16; + isa = PBXBuildFile; + settings = { + }; + }; + BA63B11906D1C70900CD5F16 = { + fileRef = BA63B0FC06D1C70900CD5F16; + isa = PBXBuildFile; + settings = { + }; + }; + BA63B11A06D1C70900CD5F16 = { + fileRef = BA63B0FD06D1C70900CD5F16; + isa = PBXBuildFile; + settings = { + }; + }; + BA63B11B06D1C70900CD5F16 = { + fileRef = BA63B0FE06D1C70900CD5F16; + isa = PBXBuildFile; + settings = { + }; + }; + BA63B11C06D1C70900CD5F16 = { + fileRef = BA63B0FF06D1C70900CD5F16; + isa = PBXBuildFile; + settings = { + }; + }; + BA63B11D06D1C70900CD5F16 = { + fileRef = BA63B10006D1C70900CD5F16; + isa = PBXBuildFile; + settings = { + }; + }; + BA63B11E06D1C70900CD5F16 = { + fileRef = BA63B10106D1C70900CD5F16; + isa = PBXBuildFile; + settings = { + }; + }; + BA63B11F06D1C72100CD5F16 = { + children = ( + BA63B12006D1C72100CD5F16, + BA63B12206D1C72100CD5F16, + BA63B12306D1C72100CD5F16, + BA63B12406D1C72100CD5F16, + BA63B12506D1C72100CD5F16, + BA63B12606D1C72100CD5F16, + BA63B12706D1C72100CD5F16, + BA63B12906D1C72100CD5F16, + BA63B12A06D1C72100CD5F16, + BA63B12B06D1C72100CD5F16, + BA63B12D06D1C72100CD5F16, + BA63B12E06D1C72100CD5F16, + BA63B12C06D1C72100CD5F16, + BA63B12F06D1C72100CD5F16, + BA63B13006D1C72100CD5F16, + BA63B13106D1C72100CD5F16, + BA63B13206D1C72100CD5F16, + BA63B13306D1C72100CD5F16, + BA63B13406D1C72100CD5F16, + BA63B13506D1C72100CD5F16, + BA63B13606D1C72100CD5F16, + BA63B13706D1C72100CD5F16, + ); + isa = PBXGroup; + name = src; + path = /Users/henry/Development/PROJECTS/FTGL/src; + refType = 0; + sourceTree = ""; + }; + BA63B12006D1C72100CD5F16 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.cpp; + path = FTBitmapGlyph.cpp; + refType = 4; + sourceTree = ""; + }; + BA63B12206D1C72100CD5F16 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.cpp; + path = FTCharmap.cpp; + refType = 4; + sourceTree = ""; + }; + BA63B12306D1C72100CD5F16 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.cpp; + path = FTContour.cpp; + refType = 4; + sourceTree = ""; + }; + BA63B12406D1C72100CD5F16 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.cpp; + path = FTExtrdGlyph.cpp; + refType = 4; + sourceTree = ""; + }; + BA63B12506D1C72100CD5F16 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.cpp; + path = FTFace.cpp; + refType = 4; + sourceTree = ""; + }; + BA63B12606D1C72100CD5F16 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.cpp; + path = FTFont.cpp; + refType = 4; + sourceTree = ""; + }; + BA63B12706D1C72100CD5F16 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.cpp; + path = FTGLBitmapFont.cpp; + refType = 4; + sourceTree = ""; + }; + BA63B12906D1C72100CD5F16 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.cpp; + path = FTGLExtrdFont.cpp; + refType = 4; + sourceTree = ""; + }; + BA63B12A06D1C72100CD5F16 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.cpp; + path = FTGLOutlineFont.cpp; + refType = 4; + sourceTree = ""; + }; + BA63B12B06D1C72100CD5F16 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.cpp; + path = FTGLPixmapFont.cpp; + refType = 4; + sourceTree = ""; + }; + BA63B12C06D1C72100CD5F16 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.cpp; + path = FTGLPolygonFont.cpp; + refType = 4; + sourceTree = ""; + }; + BA63B12D06D1C72100CD5F16 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.cpp; + path = FTGLTextureFont.cpp; + refType = 4; + sourceTree = ""; + }; + BA63B12E06D1C72100CD5F16 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.cpp; + path = FTGlyph.cpp; + refType = 4; + sourceTree = ""; + }; + BA63B12F06D1C72100CD5F16 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.cpp; + path = FTGlyphContainer.cpp; + refType = 4; + sourceTree = ""; + }; + BA63B13006D1C72100CD5F16 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.cpp; + path = FTLibrary.cpp; + refType = 4; + sourceTree = ""; + }; + BA63B13106D1C72100CD5F16 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.cpp; + path = FTOutlineGlyph.cpp; + refType = 4; + sourceTree = ""; + }; + BA63B13206D1C72100CD5F16 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.cpp; + path = FTPixmapGlyph.cpp; + refType = 4; + sourceTree = ""; + }; + BA63B13306D1C72100CD5F16 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.cpp; + path = FTPoint.cpp; + refType = 4; + sourceTree = ""; + }; + BA63B13406D1C72100CD5F16 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.cpp; + path = FTPolyGlyph.cpp; + refType = 4; + sourceTree = ""; + }; + BA63B13506D1C72100CD5F16 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.cpp; + path = FTSize.cpp; + refType = 4; + sourceTree = ""; + }; + BA63B13606D1C72100CD5F16 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.cpp; + path = FTTextureGlyph.cpp; + refType = 4; + sourceTree = ""; + }; + BA63B13706D1C72100CD5F16 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.cpp; + path = FTVectoriser.cpp; + refType = 4; + sourceTree = ""; + }; + BA63B13806D1C72100CD5F16 = { + fileRef = BA63B12006D1C72100CD5F16; + isa = PBXBuildFile; + settings = { + }; + }; + BA63B13A06D1C72100CD5F16 = { + fileRef = BA63B12206D1C72100CD5F16; + isa = PBXBuildFile; + settings = { + }; + }; + BA63B13B06D1C72100CD5F16 = { + fileRef = BA63B12306D1C72100CD5F16; + isa = PBXBuildFile; + settings = { + }; + }; + BA63B13C06D1C72100CD5F16 = { + fileRef = BA63B12406D1C72100CD5F16; + isa = PBXBuildFile; + settings = { + }; + }; + BA63B13D06D1C72100CD5F16 = { + fileRef = BA63B12506D1C72100CD5F16; + isa = PBXBuildFile; + settings = { + }; + }; + BA63B13E06D1C72100CD5F16 = { + fileRef = BA63B12606D1C72100CD5F16; + isa = PBXBuildFile; + settings = { + }; + }; + BA63B13F06D1C72100CD5F16 = { + fileRef = BA63B12706D1C72100CD5F16; + isa = PBXBuildFile; + settings = { + }; + }; + BA63B14106D1C72100CD5F16 = { + fileRef = BA63B12906D1C72100CD5F16; + isa = PBXBuildFile; + settings = { + }; + }; + BA63B14206D1C72100CD5F16 = { + fileRef = BA63B12A06D1C72100CD5F16; + isa = PBXBuildFile; + settings = { + }; + }; + BA63B14306D1C72100CD5F16 = { + fileRef = BA63B12B06D1C72100CD5F16; + isa = PBXBuildFile; + settings = { + }; + }; + BA63B14406D1C72100CD5F16 = { + fileRef = BA63B12C06D1C72100CD5F16; + isa = PBXBuildFile; + settings = { + }; + }; + BA63B14506D1C72100CD5F16 = { + fileRef = BA63B12D06D1C72100CD5F16; + isa = PBXBuildFile; + settings = { + }; + }; + BA63B14606D1C72100CD5F16 = { + fileRef = BA63B12E06D1C72100CD5F16; + isa = PBXBuildFile; + settings = { + }; + }; + BA63B14706D1C72100CD5F16 = { + fileRef = BA63B12F06D1C72100CD5F16; + isa = PBXBuildFile; + settings = { + }; + }; + BA63B14806D1C72100CD5F16 = { + fileRef = BA63B13006D1C72100CD5F16; + isa = PBXBuildFile; + settings = { + }; + }; + BA63B14906D1C72100CD5F16 = { + fileRef = BA63B13106D1C72100CD5F16; + isa = PBXBuildFile; + settings = { + }; + }; + BA63B14A06D1C72100CD5F16 = { + fileRef = BA63B13206D1C72100CD5F16; + isa = PBXBuildFile; + settings = { + }; + }; + BA63B14B06D1C72100CD5F16 = { + fileRef = BA63B13306D1C72100CD5F16; + isa = PBXBuildFile; + settings = { + }; + }; + BA63B14C06D1C72100CD5F16 = { + fileRef = BA63B13406D1C72100CD5F16; + isa = PBXBuildFile; + settings = { + }; + }; + BA63B14D06D1C72100CD5F16 = { + fileRef = BA63B13506D1C72100CD5F16; + isa = PBXBuildFile; + settings = { + }; + }; + BA63B14E06D1C72100CD5F16 = { + fileRef = BA63B13606D1C72100CD5F16; + isa = PBXBuildFile; + settings = { + }; + }; + BA63B14F06D1C72100CD5F16 = { + fileRef = BA63B13706D1C72100CD5F16; + isa = PBXBuildFile; + settings = { + }; + }; + BA63B16B06D1C8FD00CD5F16 = { + buildActionMask = 2147483647; + files = ( + BA63B19E06D1C95D00CD5F16, + BA63B19F06D1C95D00CD5F16, + BA63B1A006D1C95D00CD5F16, + BA63B1A106D1C95D00CD5F16, + BA63B1A206D1C95D00CD5F16, + BA63B1A306D1C95D00CD5F16, + BA63B1A406D1C95D00CD5F16, + BA63B1A506D1C95D00CD5F16, + BA63B1A706D1C95D00CD5F16, + BA63B1A806D1C95D00CD5F16, + BA63B1A906D1C95D00CD5F16, + BA63B1AB06D1C95D00CD5F16, + BA63B1AC06D1C95D00CD5F16, + BA63B1AD06D1C95D00CD5F16, + BA63B1AE06D1C95D00CD5F16, + BA63B1AF06D1C95D00CD5F16, + BA63B1B006D1C95D00CD5F16, + BA63B1B106D1C95D00CD5F16, + BA63B1B306D1C95D00CD5F16, + BAEF90D40707DB760052C597, + BA905A900708DE37006A5A17, + BA905B1D0708FD55006A5A17, + BA905B3F0708FDF0006A5A17, + BA905B480708FE5E006A5A17, + BA905B490708FE5E006A5A17, + BA6D07310709821200AB5B26, + BA6D073F070984F900AB5B26, + BA6D0740070984F900AB5B26, + BA6D0741070984FA00AB5B26, + BA6D0742070984FB00AB5B26, + BA6D0743070984FC00AB5B26, + ); + isa = PBXSourcesBuildPhase; + runOnlyForDeploymentPostprocessing = 0; + }; + BA63B16C06D1C8FD00CD5F16 = { + buildActionMask = 2147483647; + files = ( + BA63B17006D1C90600CD5F16, + BA8E5B8706D2A88200DA18F2, + BA8E5B8806D2A88200DA18F2, + BA8E5B8C06D2A8BC00DA18F2, + BAB1B55E06D368A800C8A3FF, + BAB1B56106D368EB00C8A3FF, + BAEDDD0D06D3692A008BB47D, + BA905A9F0708DF13006A5A17, + BA905AB40708DF27006A5A17, + ); + isa = PBXFrameworksBuildPhase; + runOnlyForDeploymentPostprocessing = 0; + }; + BA63B16D06D1C8FD00CD5F16 = { + buildPhases = ( + BA63B16B06D1C8FD00CD5F16, + BA63B16C06D1C8FD00CD5F16, + ); + buildRules = ( + BA63B1FC06D1E6FD00CD5F16, + ); + buildSettings = { + GCC_TREAT_WARNINGS_AS_ERRORS = YES; + GCC_WARN_EFFECTIVE_CPLUSPLUS_VIOLATIONS = NO; + HEADER_SEARCH_PATHS = "../includes Includes"; + INSTALL_PATH = /usr/local/bin; + LIBRARY_SEARCH_PATHS = Libraries; + OTHER_CFLAGS = ""; + OTHER_LDFLAGS = ""; + OTHER_REZFLAGS = ""; + PRODUCT_NAME = UnitTests; + SECTORDER_FLAGS = ""; + WARNING_CFLAGS = "-Wmost -Wno-four-char-constants -Wno-unknown-pragmas"; + }; + dependencies = ( + BA46EBA306D84F4D000A57FF, + ); + isa = PBXNativeTarget; + name = "Unit Tests"; + productName = UnitTests; + productReference = BA63B16E06D1C8FD00CD5F16; + productType = "com.apple.product-type.tool"; + }; + BA63B16E06D1C8FD00CD5F16 = { + explicitFileType = "compiled.mach-o.executable"; + includeInIndex = 0; + isa = PBXFileReference; + path = UnitTests; + refType = 3; + sourceTree = BUILT_PRODUCTS_DIR; + }; + BA63B17006D1C90600CD5F16 = { + fileRef = BA63B0DE06D1C6D900CD5F16; + isa = PBXBuildFile; + settings = { + }; + }; + BA63B17706D1C95D00CD5F16 = { + children = ( + BA63B18306D1C95D00CD5F16, + BA63B18406D1C95D00CD5F16, + BA63B18506D1C95D00CD5F16, + BA63B18606D1C95D00CD5F16, + BA63B18706D1C95D00CD5F16, + BA63B18806D1C95D00CD5F16, + BA905B1C0708FD55006A5A17, + BA63B18906D1C95D00CD5F16, + BA63B18A06D1C95D00CD5F16, + BA905B92070903D8006A5A17, + BA905B8F070903D8006A5A17, + BA905B8D070903D8006A5A17, + BA905B8E070903D8006A5A17, + BA905B7207090095006A5A17, + BA905B90070903D8006A5A17, + BAEF90D30707DB760052C597, + BA63B18B06D1C95D00CD5F16, + BA63B18D06D1C95D00CD5F16, + BA63B18E06D1C95D00CD5F16, + BA63B18F06D1C95D00CD5F16, + BA905B3E0708FDF0006A5A17, + BA63B19006D1C95D00CD5F16, + BA905B470708FE5E006A5A17, + BA63B19106D1C95D00CD5F16, + BA905B460708FE5E006A5A17, + BA63B19206D1C95D00CD5F16, + BA63B19306D1C95D00CD5F16, + BA63B19406D1C95D00CD5F16, + BA63B19506D1C95D00CD5F16, + BA63B19606D1C95D00CD5F16, + BA63B19706D1C95D00CD5F16, + BA63B19806D1C95D00CD5F16, + BA63B19906D1C95D00CD5F16, + BA63B19A06D1C95D00CD5F16, + BA63B19C06D1C95D00CD5F16, + ); + isa = PBXGroup; + name = "Unit Tests"; + path = /Users/henry/Development/PROJECTS/FTGL/test; + refType = 0; + sourceTree = ""; + }; + BA63B18306D1C95D00CD5F16 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + path = Fontdefs.h; + refType = 4; + sourceTree = ""; + }; + BA63B18406D1C95D00CD5F16 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.cpp; + path = "FTBBox-Test.cpp"; + refType = 4; + sourceTree = ""; + }; + BA63B18506D1C95D00CD5F16 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.cpp; + path = "FTBitmapGlyph-Test.cpp"; + refType = 4; + sourceTree = ""; + }; + BA63B18606D1C95D00CD5F16 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.cpp; + path = "FTCharmap-Test.cpp"; + refType = 4; + sourceTree = ""; + }; + BA63B18706D1C95D00CD5F16 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.cpp; + path = "FTCharToGlyphIndexMap-Test.cpp"; + refType = 4; + sourceTree = ""; + }; + BA63B18806D1C95D00CD5F16 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.cpp; + path = "FTContour-Test.cpp"; + refType = 4; + sourceTree = ""; + }; + BA63B18906D1C95D00CD5F16 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.cpp; + path = "FTFace-Test.cpp"; + refType = 4; + sourceTree = ""; + }; + BA63B18A06D1C95D00CD5F16 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.cpp; + path = "FTFont-Test.cpp"; + refType = 4; + sourceTree = ""; + }; + BA63B18B06D1C95D00CD5F16 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.cpp; + path = "FTGlyphContainer-Test.cpp"; + refType = 4; + sourceTree = ""; + }; + BA63B18D06D1C95D00CD5F16 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.cpp; + path = "FTLibrary-Test.cpp"; + refType = 4; + sourceTree = ""; + }; + BA63B18E06D1C95D00CD5F16 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.cpp; + path = "FTList-Test.cpp"; + refType = 4; + sourceTree = ""; + }; + BA63B18F06D1C95D00CD5F16 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.cpp; + path = "FTMesh-Test.cpp"; + refType = 4; + sourceTree = ""; + }; + BA63B19006D1C95D00CD5F16 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.cpp; + path = "FTPixmapGlyph-Test.cpp"; + refType = 4; + sourceTree = ""; + }; + BA63B19106D1C95D00CD5F16 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.cpp; + path = "FTPoint-Test.cpp"; + refType = 4; + sourceTree = ""; + }; + BA63B19206D1C95D00CD5F16 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.cpp; + path = "FTSize-Test.cpp"; + refType = 4; + sourceTree = ""; + }; + BA63B19306D1C95D00CD5F16 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.cpp; + path = "FTTesselation-Test.cpp"; + refType = 4; + sourceTree = ""; + }; + BA63B19406D1C95D00CD5F16 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.cpp; + path = "FTVector-Test.cpp"; + refType = 4; + sourceTree = ""; + }; + BA63B19506D1C95D00CD5F16 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.cpp; + path = "FTVectoriser-Test.cpp"; + refType = 4; + sourceTree = ""; + }; + BA63B19606D1C95D00CD5F16 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.cpp; + path = HPGCalc_afm.cpp; + refType = 4; + sourceTree = ""; + }; + BA63B19706D1C95D00CD5F16 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.cpp; + path = HPGCalc_pfb.cpp; + refType = 4; + sourceTree = ""; + }; + BA63B19806D1C95D00CD5F16 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.cpp; + path = mmgr.cpp; + refType = 4; + sourceTree = ""; + }; + BA63B19906D1C95D00CD5F16 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + path = mmgr.h; + refType = 4; + sourceTree = ""; + }; + BA63B19A06D1C95D00CD5F16 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + path = nommgr.h; + refType = 4; + sourceTree = ""; + }; + BA63B19C06D1C95D00CD5F16 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.cpp; + path = TestMain.cpp; + refType = 4; + sourceTree = ""; + }; + BA63B19E06D1C95D00CD5F16 = { + fileRef = BA63B18406D1C95D00CD5F16; + isa = PBXBuildFile; + settings = { + }; + }; + BA63B19F06D1C95D00CD5F16 = { + fileRef = BA63B18506D1C95D00CD5F16; + isa = PBXBuildFile; + settings = { + }; + }; + BA63B1A006D1C95D00CD5F16 = { + fileRef = BA63B18606D1C95D00CD5F16; + isa = PBXBuildFile; + settings = { + }; + }; + BA63B1A106D1C95D00CD5F16 = { + fileRef = BA63B18706D1C95D00CD5F16; + isa = PBXBuildFile; + settings = { + }; + }; + BA63B1A206D1C95D00CD5F16 = { + fileRef = BA63B18806D1C95D00CD5F16; + isa = PBXBuildFile; + settings = { + }; + }; + BA63B1A306D1C95D00CD5F16 = { + fileRef = BA63B18906D1C95D00CD5F16; + isa = PBXBuildFile; + settings = { + }; + }; + BA63B1A406D1C95D00CD5F16 = { + fileRef = BA63B18A06D1C95D00CD5F16; + isa = PBXBuildFile; + settings = { + }; + }; + BA63B1A506D1C95D00CD5F16 = { + fileRef = BA63B18B06D1C95D00CD5F16; + isa = PBXBuildFile; + settings = { + }; + }; + BA63B1A706D1C95D00CD5F16 = { + fileRef = BA63B18D06D1C95D00CD5F16; + isa = PBXBuildFile; + settings = { + }; + }; + BA63B1A806D1C95D00CD5F16 = { + fileRef = BA63B18E06D1C95D00CD5F16; + isa = PBXBuildFile; + settings = { + }; + }; + BA63B1A906D1C95D00CD5F16 = { + fileRef = BA63B18F06D1C95D00CD5F16; + isa = PBXBuildFile; + settings = { + }; + }; + BA63B1AB06D1C95D00CD5F16 = { + fileRef = BA63B19106D1C95D00CD5F16; + isa = PBXBuildFile; + settings = { + }; + }; + BA63B1AC06D1C95D00CD5F16 = { + fileRef = BA63B19206D1C95D00CD5F16; + isa = PBXBuildFile; + settings = { + }; + }; + BA63B1AD06D1C95D00CD5F16 = { + fileRef = BA63B19306D1C95D00CD5F16; + isa = PBXBuildFile; + settings = { + }; + }; + BA63B1AE06D1C95D00CD5F16 = { + fileRef = BA63B19406D1C95D00CD5F16; + isa = PBXBuildFile; + settings = { + }; + }; + BA63B1AF06D1C95D00CD5F16 = { + fileRef = BA63B19506D1C95D00CD5F16; + isa = PBXBuildFile; + settings = { + }; + }; + BA63B1B006D1C95D00CD5F16 = { + fileRef = BA63B19606D1C95D00CD5F16; + isa = PBXBuildFile; + settings = { + }; + }; + BA63B1B106D1C95D00CD5F16 = { + fileRef = BA63B19706D1C95D00CD5F16; + isa = PBXBuildFile; + settings = { + }; + }; + BA63B1B306D1C95D00CD5F16 = { + fileRef = BA63B19C06D1C95D00CD5F16; + isa = PBXBuildFile; + settings = { + }; + }; + BA63B1FC06D1E6FD00CD5F16 = { + compilerSpec = com.apple.compilers.gcc; + fileType = sourcecode.cpp; + isEditable = 1; + isa = PBXBuildRule; + outputFiles = ( + ); + }; + BA6D07310709821200AB5B26 = { + fileRef = BA905B8E070903D8006A5A17; + isa = PBXBuildFile; + settings = { + }; + }; + BA6D073F070984F900AB5B26 = { + fileRef = BA905B92070903D8006A5A17; + isa = PBXBuildFile; + settings = { + }; + }; + BA6D0740070984F900AB5B26 = { + fileRef = BA905B8F070903D8006A5A17; + isa = PBXBuildFile; + settings = { + }; + }; + BA6D0741070984FA00AB5B26 = { + fileRef = BA905B8D070903D8006A5A17; + isa = PBXBuildFile; + settings = { + }; + }; + BA6D0742070984FB00AB5B26 = { + fileRef = BA905B7207090095006A5A17; + isa = PBXBuildFile; + settings = { + }; + }; + BA6D0743070984FC00AB5B26 = { + fileRef = BA905B90070903D8006A5A17; + isa = PBXBuildFile; + settings = { + }; + }; + BA8E5B8506D2A88200DA18F2 = { + isa = PBXFileReference; + lastKnownFileType = archive.ar; + name = libcppunit.a; + path = Libraries/libcppunit.a; + refType = 4; + sourceTree = ""; + }; + BA8E5B8606D2A88200DA18F2 = { + isa = PBXFileReference; + lastKnownFileType = archive.ar; + name = libfreetype.a; + path = Libraries/libfreetype.a; + refType = 4; + sourceTree = ""; + }; + BA8E5B8706D2A88200DA18F2 = { + fileRef = BA8E5B8506D2A88200DA18F2; + isa = PBXBuildFile; + settings = { + }; + }; + BA8E5B8806D2A88200DA18F2 = { + fileRef = BA8E5B8606D2A88200DA18F2; + isa = PBXBuildFile; + settings = { + }; + }; + BA8E5B8B06D2A8BC00DA18F2 = { + isa = PBXFileReference; + lastKnownFileType = wrapper.framework; + name = OpenGL.framework; + path = /System/Library/Frameworks/OpenGL.framework; + refType = 0; + sourceTree = ""; + }; + BA8E5B8C06D2A8BC00DA18F2 = { + fileRef = BA8E5B8B06D2A8BC00DA18F2; + isa = PBXBuildFile; + settings = { + }; + }; + BA905A900708DE37006A5A17 = { + fileRef = BA63B19006D1C95D00CD5F16; + isa = PBXBuildFile; + settings = { + }; + }; + BA905A9F0708DF13006A5A17 = { + fileRef = BA4DCB2606D849AB0090441D; + isa = PBXBuildFile; + settings = { + }; + }; + BA905AB40708DF27006A5A17 = { + fileRef = BA4DCB8306D84A330090441D; + isa = PBXBuildFile; + settings = { + }; + }; + BA905B1C0708FD55006A5A17 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.cpp; + path = "FTExtrdGlyph-Test.cpp"; + refType = 4; + sourceTree = ""; + }; + BA905B1D0708FD55006A5A17 = { + fileRef = BA905B1C0708FD55006A5A17; + isa = PBXBuildFile; + settings = { + }; + }; + BA905B3E0708FDF0006A5A17 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.cpp; + path = "FTOutlineGlyph-Test.cpp"; + refType = 4; + sourceTree = ""; + }; + BA905B3F0708FDF0006A5A17 = { + fileRef = BA905B3E0708FDF0006A5A17; + isa = PBXBuildFile; + settings = { + }; + }; + BA905B460708FE5E006A5A17 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.cpp; + path = "FTTextureGlyph-Test.cpp"; + refType = 4; + sourceTree = ""; + }; + BA905B470708FE5E006A5A17 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.cpp; + path = "FTPolyGlyph-Test.cpp"; + refType = 4; + sourceTree = ""; + }; + BA905B480708FE5E006A5A17 = { + fileRef = BA905B460708FE5E006A5A17; + isa = PBXBuildFile; + settings = { + }; + }; + BA905B490708FE5E006A5A17 = { + fileRef = BA905B470708FE5E006A5A17; + isa = PBXBuildFile; + settings = { + }; + }; + BA905B7207090095006A5A17 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.cpp; + path = "FTGLPolygonFont-Test.cpp"; + refType = 4; + sourceTree = ""; + }; + BA905B8D070903D8006A5A17 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.cpp; + path = "FTGLOutlineFont-Test.cpp"; + refType = 4; + sourceTree = ""; + }; + BA905B8E070903D8006A5A17 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.cpp; + path = "FTGLPixmapFont-Test.cpp"; + refType = 4; + sourceTree = ""; + }; + BA905B8F070903D8006A5A17 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.cpp; + path = "FTGLExtrdFont.cpp-Test.cpp"; + refType = 4; + sourceTree = ""; + }; + BA905B90070903D8006A5A17 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.cpp; + path = "FTGLTextureFont-Test.cpp"; + refType = 4; + sourceTree = ""; + }; + BA905B92070903D8006A5A17 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.cpp; + path = "FTGLBitmapFont-Test.cpp"; + refType = 4; + sourceTree = ""; + }; + BAB1B51906D3688300C8A3FF = { + children = ( + BA4DCB8306D84A330090441D, + BA4DCB2606D849AB0090441D, + BAEDDD0C06D3692A008BB47D, + BAB1B56006D368EB00C8A3FF, + BAB1B55D06D368A800C8A3FF, + BA8E5B8B06D2A8BC00DA18F2, + BA8E5B8506D2A88200DA18F2, + BA8E5B8606D2A88200DA18F2, + ); + isa = PBXGroup; + name = Libraries; + refType = 4; + sourceTree = ""; + }; + BAB1B55D06D368A800C8A3FF = { + isa = PBXFileReference; + lastKnownFileType = "compiled.mach-o.dylib"; + name = libz.dylib; + path = /usr/lib/libz.dylib; + refType = 0; + sourceTree = ""; + }; + BAB1B55E06D368A800C8A3FF = { + fileRef = BAB1B55D06D368A800C8A3FF; + isa = PBXBuildFile; + settings = { + }; + }; + BAB1B56006D368EB00C8A3FF = { + isa = PBXFileReference; + lastKnownFileType = wrapper.framework; + name = CoreServices.framework; + path = /System/Library/Frameworks/CoreServices.framework; + refType = 0; + sourceTree = ""; + }; + BAB1B56106D368EB00C8A3FF = { + fileRef = BAB1B56006D368EB00C8A3FF; + isa = PBXBuildFile; + settings = { + }; + }; + BAEDDD0C06D3692A008BB47D = { + isa = PBXFileReference; + lastKnownFileType = wrapper.framework; + name = ApplicationServices.framework; + path = /System/Library/Frameworks/ApplicationServices.framework; + refType = 0; + sourceTree = ""; + }; + BAEDDD0D06D3692A008BB47D = { + fileRef = BAEDDD0C06D3692A008BB47D; + isa = PBXBuildFile; + settings = { + }; + }; + BAEF90D30707DB760052C597 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.cpp; + path = "FTGlyph-Test.cpp"; + refType = 4; + sourceTree = ""; + }; + BAEF90D40707DB760052C597 = { + fileRef = BAEF90D30707DB760052C597; + isa = PBXBuildFile; + settings = { + }; + }; + }; + rootObject = BA63B0C006D1C62B00CD5F16; +} diff --git a/src/WinLibs/FTGL/mac/README.txt b/src/WinLibs/FTGL/mac/README.txt new file mode 100644 index 000000000..4e937466c --- /dev/null +++ b/src/WinLibs/FTGL/mac/README.txt @@ -0,0 +1,20 @@ +FTGL Version 2.0 + +This project will build a static library (archive) in this directory. + +FTGL requires the Freetype2 library (version 2.0.9 or later) and OpenGL (glu +version 1.2 or later). You may need to edit the paths to point to the correct +place. + +To use FTGL in your own projects you will need to link against this lib. Your +project will also need to point to Freetype and OpenGL. + +For instructions on using Freetype go to www.freetype.org +For instructions on using OpenGL go to www.opengl.org + +Please contact me if you have any suggestions, feature requests, or problems. + + +Henry Maddocks +henryj@paradise.net.nz +http://homepages.paradise.net.nz/henryj/ diff --git a/src/WinLibs/FTGL/src/FTBitmapGlyph.cpp b/src/WinLibs/FTGL/src/FTBitmapGlyph.cpp new file mode 100644 index 000000000..f37ef1010 --- /dev/null +++ b/src/WinLibs/FTGL/src/FTBitmapGlyph.cpp @@ -0,0 +1,65 @@ +#include + +#include "FTBitmapGlyph.h" + +FTBitmapGlyph::FTBitmapGlyph( FT_GlyphSlot glyph) +: FTGlyph( glyph), + destWidth(0), + destHeight(0), + data(0) +{ + err = FT_Render_Glyph( glyph, FT_RENDER_MODE_MONO); + if( err || ft_glyph_format_bitmap != glyph->format) + { + return; + } + + FT_Bitmap bitmap = glyph->bitmap; + + unsigned int srcWidth = bitmap.width; + unsigned int srcHeight = bitmap.rows; + unsigned int srcPitch = bitmap.pitch; + + destWidth = srcWidth; + destHeight = srcHeight; + destPitch = srcPitch; + + if( destWidth && destHeight) + { + data = new unsigned char[destPitch * destHeight]; + unsigned char* dest = data + (( destHeight - 1) * destPitch); + + unsigned char* src = bitmap.buffer; + + for( unsigned int y = 0; y < srcHeight; ++y) + { + memcpy( dest, src, srcPitch); + dest -= destPitch; + src += srcPitch; + } + } + + pos = FTPoint(glyph->bitmap_left, static_cast(srcHeight) - glyph->bitmap_top, 0.0); +} + + +FTBitmapGlyph::~FTBitmapGlyph() +{ + delete [] data; +} + + +const FTPoint& FTBitmapGlyph::Render( const FTPoint& pen) +{ + glBitmap( 0, 0, 0.0f, 0.0f, pen.X() + pos.X(), pen.Y() - pos.Y(), (const GLubyte*)0 ); + + if( data) + { + glPixelStorei( GL_UNPACK_ROW_LENGTH, destPitch * 8); + glBitmap( destWidth, destHeight, 0.0f, 0.0, 0.0, 0.0, (const GLubyte*)data); + } + + glBitmap( 0, 0, 0.0f, 0.0f, -pos.X(), pos.Y(), (const GLubyte*)0 ); + + return advance; +} diff --git a/src/WinLibs/FTGL/src/FTCharmap.cpp b/src/WinLibs/FTGL/src/FTCharmap.cpp new file mode 100644 index 000000000..f2400eea0 --- /dev/null +++ b/src/WinLibs/FTGL/src/FTCharmap.cpp @@ -0,0 +1,62 @@ +#include "FTFace.h" +#include "FTCharmap.h" + + +FTCharmap::FTCharmap( FTFace* face) +: ftFace( *(face->Face())), + err(0) +{ + if( !ftFace->charmap) + { + err = FT_Set_Charmap( ftFace, ftFace->charmaps[0]); + } + + ftEncoding = ftFace->charmap->encoding; +} + + +FTCharmap::~FTCharmap() +{ + charMap.clear(); +} + + +bool FTCharmap::CharMap( FT_Encoding encoding) +{ + if( ftEncoding == encoding) + { + return true; + } + + err = FT_Select_Charmap( ftFace, encoding ); + + if( !err) + { + ftEncoding = encoding; + } + else + { + ftEncoding = ft_encoding_none; + } + + charMap.clear(); + return !err; +} + + +unsigned int FTCharmap::GlyphListIndex( unsigned int characterCode ) +{ + return charMap.find( characterCode); +} + + +unsigned int FTCharmap::FontIndex( unsigned int characterCode ) +{ + return FT_Get_Char_Index( ftFace, characterCode); +} + + +void FTCharmap::InsertIndex( const unsigned int characterCode, const unsigned int containerIndex) +{ + charMap.insert( characterCode, containerIndex); +} diff --git a/src/WinLibs/FTGL/src/FTContour.cpp b/src/WinLibs/FTGL/src/FTContour.cpp new file mode 100644 index 000000000..a9a95790f --- /dev/null +++ b/src/WinLibs/FTGL/src/FTContour.cpp @@ -0,0 +1,147 @@ +#include "FTContour.h" + +static const float BEZIER_STEP_SIZE = 0.2f; + + +void FTContour::AddPoint( FTPoint point) +{ + if( pointList.empty() || point != pointList[pointList.size() - 1]) + { + pointList.push_back( point); + } +} + + +void FTContour::AddPoint( float x, float y) +{ + AddPoint( FTPoint( x, y, 0.0f)); +} + + +void FTContour::evaluateQuadraticCurve() +{ + for( unsigned int i = 0; i <= ( 1.0f / BEZIER_STEP_SIZE); i++) + { + float bezierValues[2][2]; + + float t = static_cast(i) * BEZIER_STEP_SIZE; + + bezierValues[0][0] = (1.0f - t) * controlPoints[0][0] + t * controlPoints[1][0]; + bezierValues[0][1] = (1.0f - t) * controlPoints[0][1] + t * controlPoints[1][1]; + + bezierValues[1][0] = (1.0f - t) * controlPoints[1][0] + t * controlPoints[2][0]; + bezierValues[1][1] = (1.0f - t) * controlPoints[1][1] + t * controlPoints[2][1]; + + bezierValues[0][0] = (1.0f - t) * bezierValues[0][0] + t * bezierValues[1][0]; + bezierValues[0][1] = (1.0f - t) * bezierValues[0][1] + t * bezierValues[1][1]; + + AddPoint( bezierValues[0][0], bezierValues[0][1]); + } +} + +void FTContour::evaluateCubicCurve() +{ + for( unsigned int i = 0; i <= ( 1.0f / BEZIER_STEP_SIZE); i++) + { + float bezierValues[3][2]; + + float t = static_cast(i) * BEZIER_STEP_SIZE; + + bezierValues[0][0] = (1.0f - t) * controlPoints[0][0] + t * controlPoints[1][0]; + bezierValues[0][1] = (1.0f - t) * controlPoints[0][1] + t * controlPoints[1][1]; + + bezierValues[1][0] = (1.0f - t) * controlPoints[1][0] + t * controlPoints[2][0]; + bezierValues[1][1] = (1.0f - t) * controlPoints[1][1] + t * controlPoints[2][1]; + + bezierValues[2][0] = (1.0f - t) * controlPoints[2][0] + t * controlPoints[3][0]; + bezierValues[2][1] = (1.0f - t) * controlPoints[2][1] + t * controlPoints[3][1]; + + bezierValues[0][0] = (1.0f - t) * bezierValues[0][0] + t * bezierValues[1][0]; + bezierValues[0][1] = (1.0f - t) * bezierValues[0][1] + t * bezierValues[1][1]; + + bezierValues[1][0] = (1.0f - t) * bezierValues[1][0] + t * bezierValues[2][0]; + bezierValues[1][1] = (1.0f - t) * bezierValues[1][1] + t * bezierValues[2][1]; + + bezierValues[0][0] = (1.0f - t) * bezierValues[0][0] + t * bezierValues[1][0]; + bezierValues[0][1] = (1.0f - t) * bezierValues[0][1] + t * bezierValues[1][1]; + + AddPoint( bezierValues[0][0], bezierValues[0][1]); + } +} + + +FTContour::FTContour( FT_Vector* contour, char* pointTags, unsigned int numberOfPoints) +{ + for( unsigned int pointIndex = 0; pointIndex < numberOfPoints; ++ pointIndex) + { + char pointTag = pointTags[pointIndex]; + + if( pointTag == FT_Curve_Tag_On || numberOfPoints < 2) + { + AddPoint( contour[pointIndex].x, contour[pointIndex].y); + continue; + } + + FTPoint controlPoint( contour[pointIndex]); + FTPoint previousPoint = ( 0 == pointIndex) + ? FTPoint( contour[numberOfPoints - 1]) + : pointList[pointList.size() - 1]; + + FTPoint nextPoint = ( pointIndex == numberOfPoints - 1) + ? pointList[0] + : FTPoint( contour[pointIndex + 1]); + + if( pointTag == FT_Curve_Tag_Conic) + { + char nextPointTag = ( pointIndex == numberOfPoints - 1) + ? pointTags[0] + : pointTags[pointIndex + 1]; + + while( nextPointTag == FT_Curve_Tag_Conic) + { + nextPoint = ( controlPoint + nextPoint) * 0.5f; + + controlPoints[0][0] = previousPoint.X(); controlPoints[0][1] = previousPoint.Y(); + controlPoints[1][0] = controlPoint.X(); controlPoints[1][1] = controlPoint.Y(); + controlPoints[2][0] = nextPoint.X(); controlPoints[2][1] = nextPoint.Y(); + + evaluateQuadraticCurve(); + ++pointIndex; + + previousPoint = nextPoint; + controlPoint = FTPoint( contour[pointIndex]); + nextPoint = ( pointIndex == numberOfPoints - 1) + ? pointList[0] + : FTPoint( contour[pointIndex + 1]); + nextPointTag = ( pointIndex == numberOfPoints - 1) + ? pointTags[0] + : pointTags[pointIndex + 1]; + } + + controlPoints[0][0] = previousPoint.X(); controlPoints[0][1] = previousPoint.Y(); + controlPoints[1][0] = controlPoint.X(); controlPoints[1][1] = controlPoint.Y(); + controlPoints[2][0] = nextPoint.X(); controlPoints[2][1] = nextPoint.Y(); + + evaluateQuadraticCurve(); + continue; + } + + if( pointTag == FT_Curve_Tag_Cubic) + { + FTPoint controlPoint2 = nextPoint; + + FTPoint nextPoint = ( pointIndex == numberOfPoints - 2) + ? pointList[0] + : FTPoint( contour[pointIndex + 2]); + + controlPoints[0][0] = previousPoint.X(); controlPoints[0][1] = previousPoint.Y(); + controlPoints[1][0] = controlPoint.X(); controlPoints[1][1] = controlPoint.Y(); + controlPoints[2][0] = controlPoint2.X(); controlPoints[2][1] = controlPoint2.Y(); + controlPoints[3][0] = nextPoint.X(); controlPoints[3][1] = nextPoint.Y(); + + evaluateCubicCurve(); + ++pointIndex; + continue; + } + } +} diff --git a/src/WinLibs/FTGL/src/FTExtrdGlyph.cpp b/src/WinLibs/FTGL/src/FTExtrdGlyph.cpp new file mode 100644 index 000000000..9539eecd7 --- /dev/null +++ b/src/WinLibs/FTGL/src/FTExtrdGlyph.cpp @@ -0,0 +1,173 @@ +#include + +#include + +#include "FTExtrdGlyph.h" +#include "FTVectoriser.h" + + +FTExtrdGlyph::FTExtrdGlyph( FT_GlyphSlot glyph, float depth, bool useDisplayList) +: FTGlyph( glyph), + glList(0) +{ + bBox.SetDepth( -depth); + + if( ft_glyph_format_outline != glyph->format) + { + err = 0x14; // Invalid_Outline + return; + } + + FTVectoriser vectoriser( glyph); + if( ( vectoriser.ContourCount() < 1) || ( vectoriser.PointCount() < 3)) + { + return; + } + + unsigned int tesselationIndex; + + if(useDisplayList) + { + glList = glGenLists(1); + glNewList( glList, GL_COMPILE); + } + + vectoriser.MakeMesh( 1.0); + glNormal3d(0.0, 0.0, 1.0); + + unsigned int horizontalTextureScale = glyph->face->size->metrics.x_ppem * 64; + unsigned int verticalTextureScale = glyph->face->size->metrics.y_ppem * 64; + + const FTMesh* mesh = vectoriser.GetMesh(); + for( tesselationIndex = 0; tesselationIndex < mesh->TesselationCount(); ++tesselationIndex) + { + const FTTesselation* subMesh = mesh->Tesselation( tesselationIndex); + unsigned int polyonType = subMesh->PolygonType(); + + glBegin( polyonType); + for( unsigned int pointIndex = 0; pointIndex < subMesh->PointCount(); ++pointIndex) + { + FTPoint point = subMesh->Point(pointIndex); + + glTexCoord2f( point.X() / horizontalTextureScale, + point.Y() / verticalTextureScale); + + glVertex3f( point.X() / 64.0f, + point.Y() / 64.0f, + 0.0f); + } + glEnd(); + } + + vectoriser.MakeMesh( -1.0); + glNormal3d(0.0, 0.0, -1.0); + + mesh = vectoriser.GetMesh(); + for( tesselationIndex = 0; tesselationIndex < mesh->TesselationCount(); ++tesselationIndex) + { + const FTTesselation* subMesh = mesh->Tesselation( tesselationIndex); + unsigned int polyonType = subMesh->PolygonType(); + + glBegin( polyonType); + for( unsigned int pointIndex = 0; pointIndex < subMesh->PointCount(); ++pointIndex) + { + FTPoint point = subMesh->Point(pointIndex); + + glTexCoord2f( subMesh->Point(pointIndex).X() / horizontalTextureScale, + subMesh->Point(pointIndex).Y() / verticalTextureScale); + + glVertex3f( subMesh->Point( pointIndex).X() / 64.0f, + subMesh->Point( pointIndex).Y() / 64.0f, + -depth); + } + glEnd(); + } + + int contourFlag = vectoriser.ContourFlag(); + + for( size_t c = 0; c < vectoriser.ContourCount(); ++c) + { + const FTContour* contour = vectoriser.Contour(c); + unsigned int numberOfPoints = contour->PointCount(); + + glBegin( GL_QUAD_STRIP); + for( unsigned int j = 0; j <= numberOfPoints; ++j) + { + unsigned int pointIndex = ( j == numberOfPoints) ? 0 : j; + unsigned int nextPointIndex = ( pointIndex == numberOfPoints - 1) ? 0 : pointIndex + 1; + + FTPoint point = contour->Point(pointIndex); + + FTPoint normal = GetNormal( point, contour->Point(nextPointIndex)); + if(normal != FTPoint( 0.0f, 0.0f, 0.0f)) + { + glNormal3dv(static_cast(normal)); + } + + if( contourFlag & ft_outline_reverse_fill) + { + glTexCoord2f( point.X() / horizontalTextureScale, + point.X() / verticalTextureScale); + + glVertex3f( point.X() / 64.0f, point.Y() / 64.0f, 0.0f); + glVertex3f( point.X() / 64.0f, point.Y() / 64.0f, -depth); + } + else + { + glTexCoord2f( point.X() / horizontalTextureScale, + point.Y() / verticalTextureScale); + + glVertex3f( point.X() / 64.0f, point.Y() / 64.0f, -depth); + glVertex3f( point.X() / 64.0f, point.Y() / 64.0f, 0.0f); + } + } + glEnd(); + } + + if(useDisplayList) + { + glEndList(); + } +} + + +FTExtrdGlyph::~FTExtrdGlyph() +{ + glDeleteLists( glList, 1); +} + + +const FTPoint& FTExtrdGlyph::Render( const FTPoint& pen) +{ + glTranslatef( pen.X(), pen.Y(), 0); + + if( glList) + { + glCallList( glList); + } + + return advance; +} + + +FTPoint FTExtrdGlyph::GetNormal( const FTPoint &a, const FTPoint &b) +{ + float vectorX = a.X() - b.X(); + float vectorY = a.Y() - b.Y(); + + float length = sqrt( vectorX * vectorX + vectorY * vectorY ); + + if( length > 0.01f) + { + length = 1 / length; + } + else + { + length = 0.0f; + } + + return FTPoint( -vectorY * length, + vectorX * length, + 0.0f); +} + diff --git a/src/WinLibs/FTGL/src/FTFace.cpp b/src/WinLibs/FTGL/src/FTFace.cpp new file mode 100644 index 000000000..2f081c03f --- /dev/null +++ b/src/WinLibs/FTGL/src/FTFace.cpp @@ -0,0 +1,143 @@ +#include "FTFace.h" +#include "FTLibrary.h" + +#include FT_TRUETYPE_TABLES_H + +FTFace::FTFace( const char* fontFilePath) +: numGlyphs(0), + fontEncodingList(0), + err(0) +{ + const FT_Long DEFAULT_FACE_INDEX = 0; + ftFace = new FT_Face; + + err = FT_New_Face( *FTLibrary::Instance().GetLibrary(), fontFilePath, DEFAULT_FACE_INDEX, ftFace); + + if( err) + { + delete ftFace; + ftFace = 0; + } + else + { + numGlyphs = (*ftFace)->num_glyphs; + hasKerningTable = FT_HAS_KERNING((*ftFace)); + } +} + + +FTFace::FTFace( const unsigned char *pBufferBytes, size_t bufferSizeInBytes) +: numGlyphs(0), + err(0) +{ + const FT_Long DEFAULT_FACE_INDEX = 0; + ftFace = new FT_Face; + + err = FT_New_Memory_Face( *FTLibrary::Instance().GetLibrary(), (FT_Byte *)pBufferBytes, bufferSizeInBytes, DEFAULT_FACE_INDEX, ftFace); + + if( err) + { + delete ftFace; + ftFace = 0; + } + else + { + numGlyphs = (*ftFace)->num_glyphs; + } +} + + +FTFace::~FTFace() +{ + if( ftFace) + { + FT_Done_Face( *ftFace); + delete ftFace; + ftFace = 0; + } +} + + +bool FTFace::Attach( const char* fontFilePath) +{ + err = FT_Attach_File( *ftFace, fontFilePath); + return !err; +} + + +bool FTFace::Attach( const unsigned char *pBufferBytes, size_t bufferSizeInBytes) +{ + FT_Open_Args open; + + open.flags = FT_OPEN_MEMORY; + open.memory_base = (FT_Byte *)pBufferBytes; + open.memory_size = bufferSizeInBytes; + + err = FT_Attach_Stream( *ftFace, &open); + return !err; +} + + +const FTSize& FTFace::Size( const unsigned int size, const unsigned int res) +{ + charSize.CharSize( ftFace, size, res, res); + err = charSize.Error(); + + return charSize; +} + + +unsigned int FTFace::CharMapCount() +{ + return (*ftFace)->num_charmaps; +} + + +FT_Encoding* FTFace::CharMapList() +{ + if( 0 == fontEncodingList) + { + fontEncodingList = new FT_Encoding[CharMapCount()]; + for( size_t encodingIndex = 0; encodingIndex < CharMapCount(); ++encodingIndex) + { + fontEncodingList[encodingIndex] = (*ftFace)->charmaps[encodingIndex]->encoding; + } + } + + return fontEncodingList; +} + + +FTPoint FTFace::KernAdvance( unsigned int index1, unsigned int index2) +{ + float x, y; + x = y = 0.0f; + + if( hasKerningTable && index1 && index2) + { + FT_Vector kernAdvance; + kernAdvance.x = kernAdvance.y = 0; + + err = FT_Get_Kerning( *ftFace, index1, index2, ft_kerning_unfitted, &kernAdvance); + if( !err) + { + x = static_cast( kernAdvance.x) / 64.0f; + y = static_cast( kernAdvance.y) / 64.0f; + } + } + + return FTPoint( x, y, 0.0); +} + + +FT_GlyphSlot FTFace::Glyph( unsigned int index, FT_Int load_flags) +{ + err = FT_Load_Glyph( *ftFace, index, load_flags); + if( err) + { + return NULL; + } + + return (*ftFace)->glyph; +} + diff --git a/src/WinLibs/FTGL/src/FTFont.cpp b/src/WinLibs/FTGL/src/FTFont.cpp new file mode 100644 index 000000000..f519f33e7 --- /dev/null +++ b/src/WinLibs/FTGL/src/FTFont.cpp @@ -0,0 +1,297 @@ +#include "FTFace.h" +#include "FTFont.h" +#include "FTGlyphContainer.h" +#include "FTBBox.h" + + +FTFont::FTFont( const char* fontFilePath) +: face( fontFilePath), + useDisplayLists(true), + glyphList(0) +{ + err = face.Error(); + if( err == 0) + { + glyphList = new FTGlyphContainer( &face); + } +} + + +FTFont::FTFont( const unsigned char *pBufferBytes, size_t bufferSizeInBytes) +: face( pBufferBytes, bufferSizeInBytes), + glyphList(0) +{ + err = face.Error(); + if( err == 0) + { + glyphList = new FTGlyphContainer( &face); + } +} + + +FTFont::~FTFont() +{ + delete glyphList; +} + + +bool FTFont::Attach( const char* fontFilePath) +{ + if( face.Attach( fontFilePath)) + { + err = 0; + return true; + } + else + { + err = face.Error(); + return false; + } +} + + +bool FTFont::Attach( const unsigned char *pBufferBytes, size_t bufferSizeInBytes) +{ + if( face.Attach( pBufferBytes, bufferSizeInBytes)) + { + err = 0; + return true; + } + else + { + err = face.Error(); + return false; + } +} + + +bool FTFont::FaceSize( const unsigned int size, const unsigned int res ) +{ + charSize = face.Size( size, res); + err = face.Error(); + + if( err != 0) + { + return false; + } + + if( glyphList != NULL) + { + delete glyphList; + } + + glyphList = new FTGlyphContainer( &face); + return true; +} + + +unsigned int FTFont::FaceSize() const +{ + return charSize.CharSize(); +} + + +bool FTFont::CharMap( FT_Encoding encoding) +{ + bool result = glyphList->CharMap( encoding); + err = glyphList->Error(); + return result; +} + + +unsigned int FTFont::CharMapCount() +{ + return face.CharMapCount(); +} + + +FT_Encoding* FTFont::CharMapList() +{ + return face.CharMapList(); +} + + +void FTFont::UseDisplayList( bool useList) +{ + useDisplayLists = useList; +} + +float FTFont::Ascender() const +{ + return charSize.Ascender(); +} + + +float FTFont::Descender() const +{ + return charSize.Descender(); +} + +float FTFont::LineHeight() const +{ + return charSize.Height(); +} + +void FTFont::BBox( const char* string, + float& llx, float& lly, float& llz, float& urx, float& ury, float& urz) +{ + FTBBox totalBBox; + + if((NULL != string) && ('\0' != *string)) + { + const unsigned char* c = (unsigned char*)string; + float advance = 0; + + if(CheckGlyph( *c)) + { + totalBBox = glyphList->BBox( *c); + advance = glyphList->Advance( *c, *(c + 1)); + } + + while( *++c) + { + if(CheckGlyph( *c)) + { + FTBBox tempBBox = glyphList->BBox( *c); + tempBBox.Move( FTPoint( advance, 0.0f, 0.0f)); + totalBBox += tempBBox; + advance += glyphList->Advance( *c, *(c + 1)); + } + } + } + + llx = totalBBox.lowerX; + lly = totalBBox.lowerY; + llz = totalBBox.lowerZ; + urx = totalBBox.upperX; + ury = totalBBox.upperY; + urz = totalBBox.upperZ; +} + + +void FTFont::BBox( const wchar_t* string, + float& llx, float& lly, float& llz, float& urx, float& ury, float& urz) +{ + FTBBox totalBBox; + + if((NULL != string) && ('\0' != *string)) + { + const wchar_t* c = string; + float advance = 0; + + if(CheckGlyph( *c)) + { + totalBBox = glyphList->BBox( *c); + advance = glyphList->Advance( *c, *(c + 1)); + } + + while( *++c) + { + if(CheckGlyph( *c)) + { + FTBBox tempBBox = glyphList->BBox( *c); + tempBBox.Move( FTPoint( advance, 0.0f, 0.0f)); + totalBBox += tempBBox; + advance += glyphList->Advance( *c, *(c + 1)); + } + } + } + + llx = totalBBox.lowerX; + lly = totalBBox.lowerY; + llz = totalBBox.lowerZ; + urx = totalBBox.upperX; + ury = totalBBox.upperY; + urz = totalBBox.upperZ; +} + + +float FTFont::Advance( const wchar_t* string) +{ + const wchar_t* c = string; + float width = 0.0f; + + while( *c) + { + if(CheckGlyph( *c)) + { + width += glyphList->Advance( *c, *(c + 1)); + } + ++c; + } + + return width; +} + + +float FTFont::Advance( const char* string) +{ + const unsigned char* c = (unsigned char*)string; + float width = 0.0f; + + while( *c) + { + if(CheckGlyph( *c)) + { + width += glyphList->Advance( *c, *(c + 1)); + } + ++c; + } + + return width; +} + + +void FTFont::Render( const char* string ) +{ + const unsigned char* c = (unsigned char*)string; + pen.X(0); pen.Y(0); + + while( *c) + { + if(CheckGlyph( *c)) + { + pen = glyphList->Render( *c, *(c + 1), pen); + } + ++c; + } +} + + +void FTFont::Render( const wchar_t* string ) +{ + const wchar_t* c = string; + pen.X(0); pen.Y(0); + + while( *c) + { + if(CheckGlyph( *c)) + { + pen = glyphList->Render( *c, *(c + 1), pen); + } + ++c; + } +} + + +bool FTFont::CheckGlyph( const unsigned int characterCode) +{ + if( NULL == glyphList->Glyph( characterCode)) + { + unsigned int glyphIndex = glyphList->FontIndex( characterCode); + FTGlyph* tempGlyph = MakeGlyph( glyphIndex); + if( NULL == tempGlyph) + { + if( 0 == err) + { + err = 0x13; + } + + return false; + } + glyphList->Add( tempGlyph, characterCode); + } + + return true; +} + diff --git a/src/WinLibs/FTGL/src/FTGLBitmapFont.cpp b/src/WinLibs/FTGL/src/FTGLBitmapFont.cpp new file mode 100644 index 000000000..5844427ad --- /dev/null +++ b/src/WinLibs/FTGL/src/FTGLBitmapFont.cpp @@ -0,0 +1,66 @@ +#include "FTGLBitmapFont.h" +#include "FTBitmapGlyph.h" + + +FTGLBitmapFont::FTGLBitmapFont( const char* fontFilePath) +: FTFont( fontFilePath) +{} + + +FTGLBitmapFont::FTGLBitmapFont( const unsigned char *pBufferBytes, size_t bufferSizeInBytes) +: FTFont( pBufferBytes, bufferSizeInBytes) +{} + + +FTGLBitmapFont::~FTGLBitmapFont() +{} + + +FTGlyph* FTGLBitmapFont::MakeGlyph( unsigned int g) +{ + FT_GlyphSlot ftGlyph = face.Glyph( g, FT_LOAD_DEFAULT); + + if( ftGlyph) + { + FTBitmapGlyph* tempGlyph = new FTBitmapGlyph( ftGlyph); + return tempGlyph; + } + + err = face.Error(); + return NULL; +} + + +void FTGLBitmapFont::Render( const char* string) +{ + glPushClientAttrib( GL_CLIENT_PIXEL_STORE_BIT); + glPushAttrib( GL_ENABLE_BIT); + + glPixelStorei( GL_UNPACK_LSB_FIRST, GL_FALSE); + glPixelStorei( GL_UNPACK_ALIGNMENT, 1); + + glDisable( GL_BLEND); + + FTFont::Render( string); + + glPopAttrib(); + glPopClientAttrib(); +} + + +void FTGLBitmapFont::Render( const wchar_t* string) +{ + glPushClientAttrib( GL_CLIENT_PIXEL_STORE_BIT); + glPushAttrib( GL_ENABLE_BIT); + + glPixelStorei( GL_UNPACK_LSB_FIRST, GL_FALSE); + glPixelStorei( GL_UNPACK_ALIGNMENT, 1); + + glDisable( GL_BLEND); + + FTFont::Render( string); + + glPopAttrib(); + glPopClientAttrib(); +} + diff --git a/src/WinLibs/FTGL/src/FTGLExtrdFont.cpp b/src/WinLibs/FTGL/src/FTGLExtrdFont.cpp new file mode 100644 index 000000000..7bd0ff785 --- /dev/null +++ b/src/WinLibs/FTGL/src/FTGLExtrdFont.cpp @@ -0,0 +1,35 @@ +#include "FTGLExtrdFont.h" +#include "FTExtrdGlyph.h" + + +FTGLExtrdFont::FTGLExtrdFont( const char* fontFilePath) +: FTFont( fontFilePath), + depth( 0.0f) +{} + + +FTGLExtrdFont::FTGLExtrdFont( const unsigned char *pBufferBytes, size_t bufferSizeInBytes) +: FTFont( pBufferBytes, bufferSizeInBytes), + depth( 0.0f) +{} + + +FTGLExtrdFont::~FTGLExtrdFont() +{} + + +FTGlyph* FTGLExtrdFont::MakeGlyph( unsigned int glyphIndex) +{ + FT_GlyphSlot ftGlyph = face.Glyph( glyphIndex, FT_LOAD_NO_HINTING); + + if( ftGlyph) + { + FTExtrdGlyph* tempGlyph = new FTExtrdGlyph( ftGlyph, depth, useDisplayLists); + return tempGlyph; + } + + err = face.Error(); + return NULL; +} + + diff --git a/src/WinLibs/FTGL/src/FTGLOutlineFont.cpp b/src/WinLibs/FTGL/src/FTGLOutlineFont.cpp new file mode 100644 index 000000000..182eca01f --- /dev/null +++ b/src/WinLibs/FTGL/src/FTGLOutlineFont.cpp @@ -0,0 +1,66 @@ +#include "FTGLOutlineFont.h" +#include "FTOutlineGlyph.h" + + +FTGLOutlineFont::FTGLOutlineFont( const char* fontFilePath) +: FTFont( fontFilePath) +{} + + +FTGLOutlineFont::FTGLOutlineFont( const unsigned char *pBufferBytes, size_t bufferSizeInBytes) +: FTFont( pBufferBytes, bufferSizeInBytes) +{} + + +FTGLOutlineFont::~FTGLOutlineFont() +{} + + +FTGlyph* FTGLOutlineFont::MakeGlyph( unsigned int g) +{ + FT_GlyphSlot ftGlyph = face.Glyph( g, FT_LOAD_NO_HINTING); + + if( ftGlyph) + { + FTOutlineGlyph* tempGlyph = new FTOutlineGlyph( ftGlyph, useDisplayLists); + return tempGlyph; + } + + err = face.Error(); + return NULL; +} + + +void FTGLOutlineFont::Render( const char* string) +{ + glPushAttrib( GL_ENABLE_BIT | GL_HINT_BIT | GL_LINE_BIT | GL_COLOR_BUFFER_BIT); + + glDisable( GL_TEXTURE_2D); + + glEnable( GL_LINE_SMOOTH); + glHint( GL_LINE_SMOOTH_HINT, GL_DONT_CARE); + glEnable(GL_BLEND); + glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // GL_ONE + + FTFont::Render( string); + + glPopAttrib(); +} + + +void FTGLOutlineFont::Render( const wchar_t* string) +{ + glPushAttrib( GL_ENABLE_BIT | GL_HINT_BIT | GL_LINE_BIT | GL_COLOR_BUFFER_BIT); + + glDisable( GL_TEXTURE_2D); + + glEnable( GL_LINE_SMOOTH); + glHint( GL_LINE_SMOOTH_HINT, GL_DONT_CARE); + glEnable(GL_BLEND); + glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // GL_ONE + + FTFont::Render( string); + + glPopAttrib(); +} + diff --git a/src/WinLibs/FTGL/src/FTGLPixmapFont.cpp b/src/WinLibs/FTGL/src/FTGLPixmapFont.cpp new file mode 100644 index 000000000..cdb99087b --- /dev/null +++ b/src/WinLibs/FTGL/src/FTGLPixmapFont.cpp @@ -0,0 +1,83 @@ +#include "FTGLPixmapFont.h" +#include "FTPixmapGlyph.h" + + +FTGLPixmapFont::FTGLPixmapFont( const char* fontFilePath) +: FTFont( fontFilePath) +{} + + +FTGLPixmapFont::FTGLPixmapFont( const unsigned char *pBufferBytes, size_t bufferSizeInBytes) +: FTFont( pBufferBytes, bufferSizeInBytes) +{} + + +FTGLPixmapFont::~FTGLPixmapFont() +{} + + +FTGlyph* FTGLPixmapFont::MakeGlyph( unsigned int g) +{ + FT_GlyphSlot ftGlyph = face.Glyph( g, FT_LOAD_NO_HINTING); + + if( ftGlyph) + { + FTPixmapGlyph* tempGlyph = new FTPixmapGlyph( ftGlyph); + return tempGlyph; + } + + err = face.Error(); + return NULL; +} + + +void FTGLPixmapFont::Render( const char* string) +{ + glPushAttrib( GL_ENABLE_BIT | GL_PIXEL_MODE_BIT | GL_COLOR_BUFFER_BIT); + glPushClientAttrib( GL_CLIENT_PIXEL_STORE_BIT); + + glEnable(GL_BLEND); + glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + + glDisable( GL_TEXTURE_2D); + + GLfloat ftglColour[4]; + glGetFloatv( GL_CURRENT_RASTER_COLOR, ftglColour); + + glPixelTransferf(GL_RED_SCALE, ftglColour[0]); + glPixelTransferf(GL_GREEN_SCALE, ftglColour[1]); + glPixelTransferf(GL_BLUE_SCALE, ftglColour[2]); + glPixelTransferf(GL_ALPHA_SCALE, ftglColour[3]); + + FTFont::Render( string); + + glPopClientAttrib(); + glPopAttrib(); +} + + +void FTGLPixmapFont::Render( const wchar_t* string) +{ + glPushAttrib( GL_ENABLE_BIT | GL_PIXEL_MODE_BIT | GL_COLOR_BUFFER_BIT); + glPushClientAttrib( GL_CLIENT_PIXEL_STORE_BIT); + + glEnable(GL_BLEND); + glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + + glDisable( GL_TEXTURE_2D); + + GLfloat ftglColour[4]; + glGetFloatv( GL_CURRENT_RASTER_COLOR, ftglColour); + + glPixelTransferf(GL_RED_SCALE, ftglColour[0]); + glPixelTransferf(GL_GREEN_SCALE, ftglColour[1]); + glPixelTransferf(GL_BLUE_SCALE, ftglColour[2]); + glPixelTransferf(GL_ALPHA_SCALE, ftglColour[3]); + + FTFont::Render( string); + + glPopClientAttrib(); + glPopAttrib(); +} + + diff --git a/src/WinLibs/FTGL/src/FTGLPolygonFont.cpp b/src/WinLibs/FTGL/src/FTGLPolygonFont.cpp new file mode 100644 index 000000000..47a8af41a --- /dev/null +++ b/src/WinLibs/FTGL/src/FTGLPolygonFont.cpp @@ -0,0 +1,33 @@ +#include "FTGLPolygonFont.h" +#include "FTPolyGlyph.h" + + +FTGLPolygonFont::FTGLPolygonFont( const char* fontFilePath) +: FTFont( fontFilePath) +{} + + +FTGLPolygonFont::FTGLPolygonFont( const unsigned char *pBufferBytes, size_t bufferSizeInBytes) +: FTFont( pBufferBytes, bufferSizeInBytes) +{} + + +FTGLPolygonFont::~FTGLPolygonFont() +{} + + +FTGlyph* FTGLPolygonFont::MakeGlyph( unsigned int g) +{ + FT_GlyphSlot ftGlyph = face.Glyph( g, FT_LOAD_NO_HINTING); + + if( ftGlyph) + { + FTPolyGlyph* tempGlyph = new FTPolyGlyph( ftGlyph, useDisplayLists); + return tempGlyph; + } + + err = face.Error(); + return NULL; +} + + diff --git a/src/WinLibs/FTGL/src/FTGLTextureFont.cpp b/src/WinLibs/FTGL/src/FTGLTextureFont.cpp new file mode 100644 index 000000000..3b8836ef0 --- /dev/null +++ b/src/WinLibs/FTGL/src/FTGLTextureFont.cpp @@ -0,0 +1,182 @@ +#include +#include // For memset + +#include "FTGLTextureFont.h" +#include "FTTextureGlyph.h" + + +inline GLuint NextPowerOf2( GLuint in) +{ + in -= 1; + + in |= in >> 16; + in |= in >> 8; + in |= in >> 4; + in |= in >> 2; + in |= in >> 1; + + return in + 1; +} + + +FTGLTextureFont::FTGLTextureFont( const char* fontFilePath) +: FTFont( fontFilePath), + maximumGLTextureSize(0), + textureWidth(0), + textureHeight(0), + glyphHeight(0), + glyphWidth(0), + padding(3), + xOffset(0), + yOffset(0) +{ + remGlyphs = numGlyphs = face.GlyphCount(); +} + + +FTGLTextureFont::FTGLTextureFont( const unsigned char *pBufferBytes, size_t bufferSizeInBytes) +: FTFont( pBufferBytes, bufferSizeInBytes), + maximumGLTextureSize(0), + textureWidth(0), + textureHeight(0), + glyphHeight(0), + glyphWidth(0), + padding(3), + xOffset(0), + yOffset(0) +{ + remGlyphs = numGlyphs = face.GlyphCount(); +} + + +FTGLTextureFont::~FTGLTextureFont() +{ + glDeleteTextures( textureIDList.size(), (const GLuint*)&textureIDList[0]); +} + + +FTGlyph* FTGLTextureFont::MakeGlyph( unsigned int glyphIndex) +{ + FT_GlyphSlot ftGlyph = face.Glyph( glyphIndex, FT_LOAD_NO_HINTING); + + if( ftGlyph) + { + glyphHeight = static_cast( charSize.Height()); + glyphWidth = static_cast( charSize.Width()); + + if( textureIDList.empty()) + { + textureIDList.push_back( CreateTexture()); + xOffset = yOffset = padding; + } + + if( xOffset > ( textureWidth - glyphWidth)) + { + xOffset = padding; + yOffset += glyphHeight; + + if( yOffset > ( textureHeight - glyphHeight)) + { + textureIDList.push_back( CreateTexture()); + yOffset = padding; + } + } + + FTTextureGlyph* tempGlyph = new FTTextureGlyph( ftGlyph, textureIDList[textureIDList.size() - 1], + xOffset, yOffset, textureWidth, textureHeight); + xOffset += static_cast( tempGlyph->BBox().upperX - tempGlyph->BBox().lowerX + padding); + + --remGlyphs; + return tempGlyph; + } + + err = face.Error(); + return NULL; +} + + +void FTGLTextureFont::CalculateTextureSize() +{ + if( !maximumGLTextureSize) + { + glGetIntegerv( GL_MAX_TEXTURE_SIZE, (GLint*)&maximumGLTextureSize); + assert(maximumGLTextureSize); // If you hit this then you have an invalid OpenGL context. + } + + textureWidth = NextPowerOf2( (remGlyphs * glyphWidth) + ( padding * 2)); + textureWidth = textureWidth > maximumGLTextureSize ? maximumGLTextureSize : textureWidth; + + int h = static_cast( (textureWidth - ( padding * 2)) / glyphWidth); + + textureHeight = NextPowerOf2( (( numGlyphs / h) + 1) * glyphHeight); + textureHeight = textureHeight > maximumGLTextureSize ? maximumGLTextureSize : textureHeight; +} + + +GLuint FTGLTextureFont::CreateTexture() +{ + CalculateTextureSize(); + + int totalMemory = textureWidth * textureHeight; + unsigned char* textureMemory = new unsigned char[totalMemory]; + memset( textureMemory, 0, totalMemory); + + GLuint textID; + glGenTextures( 1, (GLuint*)&textID); + + glBindTexture( GL_TEXTURE_2D, textID); + glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); + glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); + glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + + glTexImage2D( GL_TEXTURE_2D, 0, GL_ALPHA, textureWidth, textureHeight, 0, GL_ALPHA, GL_UNSIGNED_BYTE, textureMemory); + + delete [] textureMemory; + + return textID; +} + + +bool FTGLTextureFont::FaceSize( const unsigned int size, const unsigned int res) +{ + if( !textureIDList.empty()) + { + glDeleteTextures( textureIDList.size(), (const GLuint*)&textureIDList[0]); + textureIDList.clear(); + remGlyphs = numGlyphs = face.GlyphCount(); + } + + return FTFont::FaceSize( size, res); +} + + +void FTGLTextureFont::Render( const char* string) +{ + glPushAttrib( GL_ENABLE_BIT | GL_COLOR_BUFFER_BIT); + + glEnable(GL_BLEND); + glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // GL_ONE + + FTTextureGlyph::ResetActiveTexture(); + + FTFont::Render( string); + + glPopAttrib(); +} + + +void FTGLTextureFont::Render( const wchar_t* string) +{ + glPushAttrib( GL_ENABLE_BIT | GL_COLOR_BUFFER_BIT); + + glEnable(GL_BLEND); + glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // GL_ONE + + FTTextureGlyph::ResetActiveTexture(); + + FTFont::Render( string); + + glPopAttrib(); +} + diff --git a/src/WinLibs/FTGL/src/FTGlyph.cpp b/src/WinLibs/FTGL/src/FTGlyph.cpp new file mode 100644 index 000000000..d969bddb8 --- /dev/null +++ b/src/WinLibs/FTGL/src/FTGlyph.cpp @@ -0,0 +1,17 @@ +#include "FTGlyph.h" + + +FTGlyph::FTGlyph( FT_GlyphSlot glyph, bool useList) +: useDisplayList(useList), + err(0) +{ + if( glyph) + { + bBox = FTBBox( glyph); + advance = FTPoint( glyph->advance.x / 64.0f, glyph->advance.y / 64.0f, 0.0f); + } +} + + +FTGlyph::~FTGlyph() +{} diff --git a/src/WinLibs/FTGL/src/FTGlyphContainer.cpp b/src/WinLibs/FTGL/src/FTGlyphContainer.cpp new file mode 100644 index 000000000..7b088de29 --- /dev/null +++ b/src/WinLibs/FTGL/src/FTGlyphContainer.cpp @@ -0,0 +1,91 @@ +#include "FTGlyphContainer.h" +#include "FTGlyph.h" +#include "FTFace.h" +#include "FTCharmap.h" + + +FTGlyphContainer::FTGlyphContainer( FTFace* f) +: face(f), + err(0) +{ + glyphs.push_back( NULL); + charMap = new FTCharmap( face); +} + + +FTGlyphContainer::~FTGlyphContainer() +{ + GlyphVector::iterator glyphIterator; + for( glyphIterator = glyphs.begin(); glyphIterator != glyphs.end(); ++glyphIterator) + { + delete *glyphIterator; + } + + glyphs.clear(); + delete charMap; +} + + +bool FTGlyphContainer::CharMap( FT_Encoding encoding) +{ + bool result = charMap->CharMap( encoding); + err = charMap->Error(); + return result; +} + + +unsigned int FTGlyphContainer::FontIndex( const unsigned int characterCode) const +{ + return charMap->FontIndex( characterCode); +} + + +void FTGlyphContainer::Add( FTGlyph* tempGlyph, const unsigned int characterCode) +{ + charMap->InsertIndex( characterCode, glyphs.size()); + glyphs.push_back( tempGlyph); +} + + +const FTGlyph* const FTGlyphContainer::Glyph( const unsigned int characterCode) const +{ + signed int index = charMap->GlyphListIndex( characterCode); + return glyphs[index]; +} + + +FTBBox FTGlyphContainer::BBox( const unsigned int characterCode) const +{ + return glyphs[charMap->GlyphListIndex( characterCode)]->BBox(); +} + + +float FTGlyphContainer::Advance( const unsigned int characterCode, const unsigned int nextCharacterCode) +{ + unsigned int left = charMap->FontIndex( characterCode); + unsigned int right = charMap->FontIndex( nextCharacterCode); + + float width = face->KernAdvance( left, right).X(); + width += glyphs[charMap->GlyphListIndex( characterCode)]->Advance().X(); + + return width; +} + + +FTPoint FTGlyphContainer::Render( const unsigned int characterCode, const unsigned int nextCharacterCode, FTPoint penPosition) +{ + FTPoint kernAdvance, advance; + + unsigned int left = charMap->FontIndex( characterCode); + unsigned int right = charMap->FontIndex( nextCharacterCode); + + kernAdvance = face->KernAdvance( left, right); + + if( !face->Error()) + { + advance = glyphs[charMap->GlyphListIndex( characterCode)]->Render( penPosition); + } + + kernAdvance += advance; + return kernAdvance; +} diff --git a/src/WinLibs/FTGL/src/FTLibrary.cpp b/src/WinLibs/FTGL/src/FTLibrary.cpp new file mode 100644 index 000000000..06e4b4560 --- /dev/null +++ b/src/WinLibs/FTGL/src/FTLibrary.cpp @@ -0,0 +1,64 @@ +#include "FTLibrary.h" + + +const FTLibrary& FTLibrary::Instance() +{ + static FTLibrary ftlib; + return ftlib; +} + + +FTLibrary::~FTLibrary() +{ + if( library != 0) + { + FT_Done_FreeType( *library); + + delete library; + library= 0; + } + +// if( manager != 0) +// { +// FTC_Manager_Done( manager ); +// +// delete manager; +// manager= 0; +// } +} + + +FTLibrary::FTLibrary() +: library(0), + err(0) +{ + Initialise(); +} + + +bool FTLibrary::Initialise() +{ + if( library != 0) + return true; + + library = new FT_Library; + + err = FT_Init_FreeType( library); + if( err) + { + delete library; + library = 0; + return false; + } + +// FTC_Manager* manager; +// +// if( FTC_Manager_New( lib, 0, 0, 0, my_face_requester, 0, manager ) +// { +// delete manager; +// manager= 0; +// return false; +// } + + return true; +} diff --git a/src/WinLibs/FTGL/src/FTOutlineGlyph.cpp b/src/WinLibs/FTGL/src/FTOutlineGlyph.cpp new file mode 100644 index 000000000..d6427564c --- /dev/null +++ b/src/WinLibs/FTGL/src/FTOutlineGlyph.cpp @@ -0,0 +1,66 @@ +#include "FTOutlineGlyph.h" +#include "FTVectoriser.h" + + +FTOutlineGlyph::FTOutlineGlyph( FT_GlyphSlot glyph, bool useDisplayList) +: FTGlyph( glyph), + glList(0) +{ + if( ft_glyph_format_outline != glyph->format) + { + err = 0x14; // Invalid_Outline + return; + } + + FTVectoriser vectoriser( glyph); + + size_t numContours = vectoriser.ContourCount(); + if ( ( numContours < 1) || ( vectoriser.PointCount() < 3)) + { + return; + } + + if(useDisplayList) + { + glList = glGenLists(1); + glNewList( glList, GL_COMPILE); + } + + for( unsigned int c = 0; c < numContours; ++c) + { + const FTContour* contour = vectoriser.Contour(c); + + glBegin( GL_LINE_LOOP); + for( unsigned int pointIndex = 0; pointIndex < contour->PointCount(); ++pointIndex) + { + FTPoint point = contour->Point(pointIndex); + glVertex2f( point.X() / 64.0f, point.Y() / 64.0f); + } + glEnd(); + } + + if(useDisplayList) + { + glEndList(); + } +} + + +FTOutlineGlyph::~FTOutlineGlyph() +{ + glDeleteLists( glList, 1); +} + + +const FTPoint& FTOutlineGlyph::Render( const FTPoint& pen) +{ + glTranslatef( pen.X(), pen.Y(), 0.0f); + + if( glList) + { + glCallList( glList); + } + + return advance; +} + diff --git a/src/WinLibs/FTGL/src/FTPixmapGlyph.cpp b/src/WinLibs/FTGL/src/FTPixmapGlyph.cpp new file mode 100644 index 000000000..a109587b2 --- /dev/null +++ b/src/WinLibs/FTGL/src/FTPixmapGlyph.cpp @@ -0,0 +1,73 @@ +#include "FTPixmapGlyph.h" + +FTPixmapGlyph::FTPixmapGlyph( FT_GlyphSlot glyph) +: FTGlyph( glyph), + destWidth(0), + destHeight(0), + data(0) +{ + err = FT_Render_Glyph( glyph, FT_RENDER_MODE_NORMAL); + if( err || ft_glyph_format_bitmap != glyph->format) + { + return; + } + + FT_Bitmap bitmap = glyph->bitmap; + + //check the pixel mode + //ft_pixel_mode_grays + + int srcWidth = bitmap.width; + int srcHeight = bitmap.rows; + + destWidth = srcWidth; + destHeight = srcHeight; + + if( destWidth && destHeight) + { + data = new unsigned char[destWidth * destHeight * 2]; + unsigned char* src = bitmap.buffer; + + unsigned char* dest = data + ((destHeight - 1) * destWidth * 2); + size_t destStep = destWidth * 2 * 2; + + for( int y = 0; y < srcHeight; ++y) + { + for( int x = 0; x < srcWidth; ++x) + { + *dest++ = static_cast(255); + *dest++ = *src++; + } + dest -= destStep; + } + + destHeight = srcHeight; + } + + pos.X(glyph->bitmap_left); + pos.Y(srcHeight - glyph->bitmap_top); +} + + +FTPixmapGlyph::~FTPixmapGlyph() +{ + delete [] data; +} + + +const FTPoint& FTPixmapGlyph::Render( const FTPoint& pen) +{ + glBitmap( 0, 0, 0.0f, 0.0f, pen.X() + pos.X(), pen.Y() - pos.Y(), (const GLubyte*)0); + + if( data) + { + glPixelStorei( GL_UNPACK_ROW_LENGTH, 0); + glPixelStorei( GL_UNPACK_ALIGNMENT, 2); + + glDrawPixels( destWidth, destHeight, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, (const GLvoid*)data); + } + + glBitmap( 0, 0, 0.0f, 0.0f, -pos.X(), pos.Y(), (const GLubyte*)0); + + return advance; +} diff --git a/src/WinLibs/FTGL/src/FTPoint.cpp b/src/WinLibs/FTGL/src/FTPoint.cpp new file mode 100644 index 000000000..bf6c46c2d --- /dev/null +++ b/src/WinLibs/FTGL/src/FTPoint.cpp @@ -0,0 +1,19 @@ +#include "FTPoint.h" + + +bool operator == ( const FTPoint &a, const FTPoint &b) +{ + return((a.values[0] == b.values[0]) && (a.values[1] == b.values[1]) && (a.values[2] == b.values[2])); +} + +bool operator != ( const FTPoint &a, const FTPoint &b) +{ + return((a.values[0] != b.values[0]) || (a.values[1] != b.values[1]) || (a.values[2] != b.values[2])); +} + + +FTPoint operator*( double multiplier, FTPoint& point) +{ + return point * multiplier; +} + diff --git a/src/WinLibs/FTGL/src/FTPolyGlyph.cpp b/src/WinLibs/FTGL/src/FTPolyGlyph.cpp new file mode 100644 index 000000000..1e69f405c --- /dev/null +++ b/src/WinLibs/FTGL/src/FTPolyGlyph.cpp @@ -0,0 +1,77 @@ +#include "FTPolyGlyph.h" +#include "FTVectoriser.h" + + +FTPolyGlyph::FTPolyGlyph( FT_GlyphSlot glyph, bool useDisplayList) +: FTGlyph( glyph), + glList(0) +{ + if( ft_glyph_format_outline != glyph->format) + { + err = 0x14; // Invalid_Outline + return; + } + + FTVectoriser vectoriser( glyph); + + if(( vectoriser.ContourCount() < 1) || ( vectoriser.PointCount() < 3)) + { + return; + } + + unsigned int horizontalTextureScale = glyph->face->size->metrics.x_ppem * 64; + unsigned int verticalTextureScale = glyph->face->size->metrics.y_ppem * 64; + + vectoriser.MakeMesh( 1.0); + + if( useDisplayList) + { + glList = glGenLists( 1); + glNewList( glList, GL_COMPILE); + } + + const FTMesh* mesh = vectoriser.GetMesh(); + for( unsigned int index = 0; index < mesh->TesselationCount(); ++index) + { + const FTTesselation* subMesh = mesh->Tesselation( index); + unsigned int polyonType = subMesh->PolygonType(); + + glBegin( polyonType); + for( unsigned int pointIndex = 0; pointIndex < subMesh->PointCount(); ++pointIndex) + { + FTPoint point = subMesh->Point(pointIndex); + + glTexCoord2f( point.X() / horizontalTextureScale, + point.Y() / verticalTextureScale); + + glVertex3f( point.X() / 64.0f, + point.Y() / 64.0f, + 0.0f); + } + glEnd(); + } + + if(useDisplayList) + { + glEndList(); + } +} + + +FTPolyGlyph::~FTPolyGlyph() +{ + glDeleteLists( glList, 1); +} + + +const FTPoint& FTPolyGlyph::Render( const FTPoint& pen) +{ + glTranslatef( pen.X(), pen.Y(), 0.0f); + + if( glList) + { + glCallList( glList); + } + + return advance; +} diff --git a/src/WinLibs/FTGL/src/FTSize.cpp b/src/WinLibs/FTGL/src/FTSize.cpp new file mode 100644 index 000000000..07a5b833b --- /dev/null +++ b/src/WinLibs/FTGL/src/FTSize.cpp @@ -0,0 +1,104 @@ +#include "FTSize.h" + + +FTSize::FTSize() +: ftFace(0), + ftSize(0), + size(0), + xResolution(0), + yResolution(0), + err(0) +{} + + +FTSize::~FTSize() +{} + + +bool FTSize::CharSize( FT_Face* face, unsigned int pointSize, unsigned int xRes, unsigned int yRes ) +{ + if( size != pointSize || xResolution != xRes || yResolution != yRes) + { + err = FT_Set_Char_Size( *face, 0L, pointSize * 64, xResolution, yResolution); + + if( !err) + { + ftFace = face; + size = pointSize; + xResolution = xRes; + yResolution = yRes; + ftSize = (*ftFace)->size; + } + else + { + ftFace = 0; + size = 0; + xResolution = 0; + yResolution = 0; + ftSize = 0; + } + } + + return !err; +} + + +unsigned int FTSize::CharSize() const +{ + return size; +} + + +float FTSize::Ascender() const +{ + return ftSize == 0 ? 0.0f : static_cast( ftSize->metrics.ascender) / 64.0f; +} + + +float FTSize::Descender() const +{ + return ftSize == 0 ? 0.0f : static_cast( ftSize->metrics.descender) / 64.0f; +} + + +float FTSize::Height() const +{ + if( 0 == ftSize) + { + return 0.0f; + } + + if( FT_IS_SCALABLE((*ftFace))) + { + return ( (*ftFace)->bbox.yMax - (*ftFace)->bbox.yMin) * ( (float)ftSize->metrics.y_ppem / (float)(*ftFace)->units_per_EM); + } + else + { + return static_cast( ftSize->metrics.height) / 64.0f; + } +} + + +float FTSize::Width() const +{ + if( 0 == ftSize) + { + return 0.0f; + } + + if( FT_IS_SCALABLE((*ftFace))) + { + return ( (*ftFace)->bbox.xMax - (*ftFace)->bbox.xMin) * ( static_cast(ftSize->metrics.x_ppem) / static_cast((*ftFace)->units_per_EM)); + } + else + { + return static_cast( ftSize->metrics.max_advance) / 64.0f; + } +} + + +float FTSize::Underline() const +{ + return 0.0f; +} + diff --git a/src/WinLibs/FTGL/src/FTTextureGlyph.cpp b/src/WinLibs/FTGL/src/FTTextureGlyph.cpp new file mode 100644 index 000000000..7bf6e32cd --- /dev/null +++ b/src/WinLibs/FTGL/src/FTTextureGlyph.cpp @@ -0,0 +1,84 @@ +#include "FTTextureGlyph.h" + +GLint FTTextureGlyph::activeTextureID = 0; + +FTTextureGlyph::FTTextureGlyph( FT_GlyphSlot glyph, int id, int xOffset, int yOffset, GLsizei width, GLsizei height) +: FTGlyph( glyph), + destWidth(0), + destHeight(0), + glTextureID(id) +{ + err = FT_Render_Glyph( glyph, FT_RENDER_MODE_NORMAL); + if( err || glyph->format != ft_glyph_format_bitmap) + { + return; + } + + FT_Bitmap bitmap = glyph->bitmap; + + destWidth = bitmap.width; + destHeight = bitmap.rows; + + if( destWidth && destHeight) + { + glPushClientAttrib( GL_CLIENT_PIXEL_STORE_BIT); + glPixelStorei( GL_UNPACK_LSB_FIRST, GL_FALSE); + glPixelStorei( GL_UNPACK_ROW_LENGTH, 0); + glPixelStorei( GL_UNPACK_ALIGNMENT, 1); + + glBindTexture( GL_TEXTURE_2D, glTextureID); + glTexSubImage2D( GL_TEXTURE_2D, 0, xOffset, yOffset, destWidth, destHeight, GL_ALPHA, GL_UNSIGNED_BYTE, bitmap.buffer); + + glPopClientAttrib(); + } + + +// 0 +// +----+ +// | | +// | | +// | | +// +----+ +// 1 + + uv[0].X( static_cast(xOffset) / static_cast(width)); + uv[0].Y( static_cast(yOffset) / static_cast(height)); + uv[1].X( static_cast( xOffset + destWidth) / static_cast(width)); + uv[1].Y( static_cast( yOffset + destHeight) / static_cast(height)); + + pos.X( glyph->bitmap_left); + pos.Y( glyph->bitmap_top); +} + + +FTTextureGlyph::~FTTextureGlyph() +{} + + +const FTPoint& FTTextureGlyph::Render( const FTPoint& pen) +{ + if( activeTextureID != glTextureID) + { + glBindTexture( GL_TEXTURE_2D, (GLuint)glTextureID); + activeTextureID = glTextureID; + } + + glTranslatef( pen.X(), pen.Y(), 0.0f); + + glBegin( GL_QUADS); + glTexCoord2f( uv[0].X(), uv[0].Y()); + glVertex2f( pos.X(), pos.Y()); + + glTexCoord2f( uv[0].X(), uv[1].Y()); + glVertex2f( pos.X(), pos.Y() - destHeight); + + glTexCoord2f( uv[1].X(), uv[1].Y()); + glVertex2f( destWidth + pos.X(), pos.Y() - destHeight); + + glTexCoord2f( uv[1].X(), uv[0].Y()); + glVertex2f( destWidth + pos.X(), pos.Y()); + glEnd(); + + return advance; +} + diff --git a/src/WinLibs/FTGL/src/FTVectoriser.cpp b/src/WinLibs/FTGL/src/FTVectoriser.cpp new file mode 100644 index 000000000..d7f87741d --- /dev/null +++ b/src/WinLibs/FTGL/src/FTVectoriser.cpp @@ -0,0 +1,225 @@ +#include "FTVectoriser.h" +#include "FTGL.h" + +#ifndef CALLBACK +#define CALLBACK +#endif + +#ifdef __APPLE_CC__ + typedef GLvoid (*GLUTesselatorFunction)(...); +#elif defined( __mips ) || defined( __linux__ ) || defined( __FreeBSD__ ) || defined( __OpenBSD__ ) || defined( __sun ) || defined (__CYGWIN__) + typedef GLvoid (*GLUTesselatorFunction)(); +#elif defined ( WIN32) + typedef GLvoid (CALLBACK *GLUTesselatorFunction)( ); +#else + #error "Error - need to define type GLUTesselatorFunction for this platform/compiler" +#endif + + +void CALLBACK ftglError( GLenum errCode, FTMesh* mesh) +{ + mesh->Error( errCode); +} + + +void CALLBACK ftglVertex( void* data, FTMesh* mesh) +{ + FTGL_DOUBLE* vertex = static_cast(data); + mesh->AddPoint( vertex[0], vertex[1], vertex[2]); +} + + +void CALLBACK ftglCombine( FTGL_DOUBLE coords[3], void* vertex_data[4], GLfloat weight[4], void** outData, FTMesh* mesh) +{ + const FTGL_DOUBLE* vertex = static_cast(coords); + *outData = const_cast(mesh->Combine( vertex[0], vertex[1], vertex[2])); +} + + +void CALLBACK ftglBegin( GLenum type, FTMesh* mesh) +{ + mesh->Begin( type); +} + + +void CALLBACK ftglEnd( FTMesh* mesh) +{ + mesh->End(); +} + + +FTMesh::FTMesh() +: currentTesselation(0), + err(0) +{ + tesselationList.reserve( 16); +} + + +FTMesh::~FTMesh() +{ + for( size_t t = 0; t < tesselationList.size(); ++t) + { + delete tesselationList[t]; + } + + tesselationList.clear(); +} + + +void FTMesh::AddPoint( const FTGL_DOUBLE x, const FTGL_DOUBLE y, const FTGL_DOUBLE z) +{ + currentTesselation->AddPoint( x, y, z); +} + + +const FTGL_DOUBLE* FTMesh::Combine( const FTGL_DOUBLE x, const FTGL_DOUBLE y, const FTGL_DOUBLE z) +{ + tempPointList.push_back( FTPoint( x, y,z)); + return static_cast(tempPointList.back()); +} + + +void FTMesh::Begin( GLenum meshType) +{ + currentTesselation = new FTTesselation( meshType); +} + + +void FTMesh::End() +{ + tesselationList.push_back( currentTesselation); +} + + +const FTTesselation* const FTMesh::Tesselation( unsigned int index) const +{ + return ( index < tesselationList.size()) ? tesselationList[index] : NULL; +} + + +FTVectoriser::FTVectoriser( const FT_GlyphSlot glyph) +: contourList(0), + mesh(0), + ftContourCount(0), + contourFlag(0) +{ + if( glyph) + { + outline = glyph->outline; + + ftContourCount = outline.n_contours; + contourList = 0; + contourFlag = outline.flags; + + ProcessContours(); + } +} + + +FTVectoriser::~FTVectoriser() +{ + for( size_t c = 0; c < ContourCount(); ++c) + { + delete contourList[c]; + } + + delete [] contourList; + delete mesh; +} + + +void FTVectoriser::ProcessContours() +{ + short contourLength = 0; + short startIndex = 0; + short endIndex = 0; + + contourList = new FTContour*[ftContourCount]; + + for( short contourIndex = 0; contourIndex < ftContourCount; ++contourIndex) + { + FT_Vector* pointList = &outline.points[startIndex]; + char* tagList = &outline.tags[startIndex]; + + endIndex = outline.contours[contourIndex]; + contourLength = ( endIndex - startIndex) + 1; + + FTContour* contour = new FTContour( pointList, tagList, contourLength); + + contourList[contourIndex] = contour; + + startIndex = endIndex + 1; + } +} + + +size_t FTVectoriser::PointCount() +{ + size_t s = 0; + for( size_t c = 0; c < ContourCount(); ++c) + { + s += contourList[c]->PointCount(); + } + + return s; +} + + +const FTContour* const FTVectoriser::Contour( unsigned int index) const +{ + return ( index < ContourCount()) ? contourList[index] : NULL; +} + + +void FTVectoriser::MakeMesh( FTGL_DOUBLE zNormal) +{ + if( mesh) + { + delete mesh; + } + + mesh = new FTMesh; + + GLUtesselator* tobj = gluNewTess(); + + gluTessCallback( tobj, GLU_TESS_BEGIN_DATA, (GLUTesselatorFunction)ftglBegin); + gluTessCallback( tobj, GLU_TESS_VERTEX_DATA, (GLUTesselatorFunction)ftglVertex); + gluTessCallback( tobj, GLU_TESS_COMBINE_DATA, (GLUTesselatorFunction)ftglCombine); + gluTessCallback( tobj, GLU_TESS_END_DATA, (GLUTesselatorFunction)ftglEnd); + gluTessCallback( tobj, GLU_TESS_ERROR_DATA, (GLUTesselatorFunction)ftglError); + + if( contourFlag & ft_outline_even_odd_fill) // ft_outline_reverse_fill + { + gluTessProperty( tobj, GLU_TESS_WINDING_RULE, GLU_TESS_WINDING_ODD); + } + else + { + gluTessProperty( tobj, GLU_TESS_WINDING_RULE, GLU_TESS_WINDING_NONZERO); + } + + + gluTessProperty( tobj, GLU_TESS_TOLERANCE, 0); + gluTessNormal( tobj, 0.0f, 0.0f, zNormal); + gluTessBeginPolygon( tobj, mesh); + + for( size_t c = 0; c < ContourCount(); ++c) + { + const FTContour* contour = contourList[c]; + + gluTessBeginContour( tobj); + + for( size_t p = 0; p < contour->PointCount(); ++p) + { + const FTGL_DOUBLE* d = contour->Point(p); + gluTessVertex( tobj, (GLdouble*)d, (GLdouble*)d); + } + + gluTessEndContour( tobj); + } + + gluTessEndPolygon( tobj); + + gluDeleteTess( tobj); +} + diff --git a/src/WinLibs/FTGL/test/FTBBox-Test.cpp b/src/WinLibs/FTGL/test/FTBBox-Test.cpp new file mode 100644 index 000000000..a4b461a63 --- /dev/null +++ b/src/WinLibs/FTGL/test/FTBBox-Test.cpp @@ -0,0 +1,154 @@ +#include +#include +#include +#include +#include + +#include +#include FT_FREETYPE_H +#include FT_GLYPH_H + +#include "Fontdefs.h" +#include "FTBBox.h" + + +class FTBBoxTest : public CppUnit::TestCase +{ + CPPUNIT_TEST_SUITE( FTBBoxTest); + CPPUNIT_TEST( testDefaultConstructor); + CPPUNIT_TEST( testGlyphConstructor); + CPPUNIT_TEST( testMoveBBox); + CPPUNIT_TEST( testPlusEquals); + CPPUNIT_TEST_SUITE_END(); + + public: + FTBBoxTest() : CppUnit::TestCase( "FTBBox Test") + {} + + FTBBoxTest( const std::string& name) : CppUnit::TestCase(name) {} + + void testDefaultConstructor() + { + FTBBox boundingBox; + + CPPUNIT_ASSERT( boundingBox.lowerX == 0.0f); + CPPUNIT_ASSERT( boundingBox.lowerY == 0.0f); + CPPUNIT_ASSERT( boundingBox.lowerZ == 0.0f); + CPPUNIT_ASSERT( boundingBox.upperX == 0.0f); + CPPUNIT_ASSERT( boundingBox.upperY == 0.0f); + CPPUNIT_ASSERT( boundingBox.upperZ == 0.0f); + } + + + void testGlyphConstructor() + { + setUpFreetype(); + + FTBBox boundingBox( face->glyph); + + CPPUNIT_ASSERT_DOUBLES_EQUAL( 2, boundingBox.lowerX, 0.01); + CPPUNIT_ASSERT_DOUBLES_EQUAL( -15, boundingBox.lowerY, 0.01); + CPPUNIT_ASSERT_DOUBLES_EQUAL( 0, boundingBox.lowerZ, 0.01); + CPPUNIT_ASSERT_DOUBLES_EQUAL( 35, boundingBox.upperX, 0.01); + CPPUNIT_ASSERT_DOUBLES_EQUAL( 38, boundingBox.upperY, 0.01); + CPPUNIT_ASSERT_DOUBLES_EQUAL( 0, boundingBox.upperZ, 0.01); + + tearDownFreetype(); + } + + void testMoveBBox() + { + FTBBox boundingBox; + FTPoint firstMove( 3.5f, 1.0f, -2.5f); + FTPoint secondMove( -3.5f, -1.0f, 2.5f); + + boundingBox.Move( firstMove); + + CPPUNIT_ASSERT( boundingBox.lowerX == 3.5f); + CPPUNIT_ASSERT( boundingBox.lowerY == 1.0f); + CPPUNIT_ASSERT( boundingBox.lowerZ == -2.5f); + CPPUNIT_ASSERT( boundingBox.upperX == 3.5f); + CPPUNIT_ASSERT( boundingBox.upperY == 1.0f); + CPPUNIT_ASSERT( boundingBox.upperZ == -2.5f); + + boundingBox.Move( secondMove); + + CPPUNIT_ASSERT( boundingBox.lowerX == 0.0f); + CPPUNIT_ASSERT( boundingBox.lowerY == 0.0f); + CPPUNIT_ASSERT( boundingBox.lowerZ == 0.0f); + CPPUNIT_ASSERT( boundingBox.upperX == 0.0f); + CPPUNIT_ASSERT( boundingBox.upperY == 0.0f); + CPPUNIT_ASSERT( boundingBox.upperZ == 0.0f); + } + + void testPlusEquals() + { + setUpFreetype(); + + FTBBox boundingBox1; + FTBBox boundingBox2( face->glyph); + + boundingBox1 += boundingBox2; + + CPPUNIT_ASSERT_DOUBLES_EQUAL( 2, boundingBox2.lowerX, 0.01); + CPPUNIT_ASSERT_DOUBLES_EQUAL( -15, boundingBox2.lowerY, 0.01); + CPPUNIT_ASSERT_DOUBLES_EQUAL( 0, boundingBox2.lowerZ, 0.01); + CPPUNIT_ASSERT_DOUBLES_EQUAL( 35, boundingBox2.upperX, 0.01); + CPPUNIT_ASSERT_DOUBLES_EQUAL( 38, boundingBox2.upperY, 0.01); + CPPUNIT_ASSERT_DOUBLES_EQUAL( 0, boundingBox2.upperZ, 0.01); + + float advance = 40; + + boundingBox2.Move( FTPoint( advance, 0, 0)); + boundingBox1 += boundingBox2; + + CPPUNIT_ASSERT_DOUBLES_EQUAL( 42, boundingBox2.lowerX, 0.01); + CPPUNIT_ASSERT_DOUBLES_EQUAL( -15, boundingBox2.lowerY, 0.01); + CPPUNIT_ASSERT_DOUBLES_EQUAL( 0, boundingBox2.lowerZ, 0.01); + CPPUNIT_ASSERT_DOUBLES_EQUAL( 75, boundingBox2.upperX, 0.01); + CPPUNIT_ASSERT_DOUBLES_EQUAL( 38, boundingBox2.upperY, 0.01); + CPPUNIT_ASSERT_DOUBLES_EQUAL( 0, boundingBox2.upperZ, 0.01); + + tearDownFreetype(); + } + + void setUp() + {} + + + void tearDown() + {} + + private: + FT_Library library; + FT_Face face; + FT_Glyph glyph; + + void setUpFreetype() + { + FT_Error error = FT_Init_FreeType( &library); + CPPUNIT_ASSERT(!error); + error = FT_New_Face( library, GOOD_FONT_FILE, 0, &face); + CPPUNIT_ASSERT(!error); + + long glyphIndex = FT_Get_Char_Index( face, CHARACTER_CODE_G); + + FT_Set_Char_Size( face, 0L, FONT_POINT_SIZE * 64, RESOLUTION, RESOLUTION); + + error = FT_Load_Glyph( face, glyphIndex, FT_LOAD_DEFAULT); + CPPUNIT_ASSERT(!error); + error = FT_Get_Glyph( face->glyph, &glyph); + CPPUNIT_ASSERT(!error); + } + + void tearDownFreetype() + { + FT_Done_Glyph( glyph); + FT_Done_Face( face); + FT_Done_FreeType( library); + } + +}; + +CPPUNIT_TEST_SUITE_REGISTRATION( FTBBoxTest); + diff --git a/src/WinLibs/FTGL/test/FTBitmapGlyph-Test.cpp b/src/WinLibs/FTGL/test/FTBitmapGlyph-Test.cpp new file mode 100644 index 000000000..e690a7af3 --- /dev/null +++ b/src/WinLibs/FTGL/test/FTBitmapGlyph-Test.cpp @@ -0,0 +1,84 @@ +#include +#include +#include +#include +#include + +#include "Fontdefs.h" +#include "FTBitmapGlyph.h" + +class FTBitmapGlyphTest : public CppUnit::TestCase +{ + CPPUNIT_TEST_SUITE( FTBitmapGlyphTest); + CPPUNIT_TEST( testConstructor); + CPPUNIT_TEST( testRender); + CPPUNIT_TEST_SUITE_END(); + + public: + FTBitmapGlyphTest() : CppUnit::TestCase( "FTBitmapGlyph Test") + { + } + + FTBitmapGlyphTest( const std::string& name) : CppUnit::TestCase(name) {} + + ~FTBitmapGlyphTest() + { + } + + void testConstructor() + { + setUpFreetype(); + + FTBitmapGlyph* bitmapGlyph = new FTBitmapGlyph( face->glyph); + CPPUNIT_ASSERT( bitmapGlyph->Error() == 0); + + CPPUNIT_ASSERT( glGetError() == GL_NO_ERROR); + + tearDownFreetype(); + } + + void testRender() + { + setUpFreetype(); + + FTBitmapGlyph* bitmapGlyph = new FTBitmapGlyph( face->glyph); + CPPUNIT_ASSERT( bitmapGlyph->Error() == 0); + bitmapGlyph->Render(FTPoint( 0, 0, 0)); + + CPPUNIT_ASSERT( glGetError() == GL_NO_ERROR); + + tearDownFreetype(); + } + + void setUp() + {} + + void tearDown() + {} + + private: + FT_Library library; + FT_Face face; + + void setUpFreetype() + { + FT_Error error = FT_Init_FreeType( &library); + assert(!error); + error = FT_New_Face( library, FONT_FILE, 0, &face); + assert(!error); + + FT_Set_Char_Size( face, 0L, FONT_POINT_SIZE * 64, RESOLUTION, RESOLUTION); + + error = FT_Load_Char( face, CHARACTER_CODE_A, FT_LOAD_DEFAULT); + assert( !error); + } + + void tearDownFreetype() + { + FT_Done_Face( face); + FT_Done_FreeType( library); + } +}; + +CPPUNIT_TEST_SUITE_REGISTRATION( FTBitmapGlyphTest); + diff --git a/src/WinLibs/FTGL/test/FTCharToGlyphIndexMap-Test.cpp b/src/WinLibs/FTGL/test/FTCharToGlyphIndexMap-Test.cpp new file mode 100644 index 000000000..9635c393f --- /dev/null +++ b/src/WinLibs/FTGL/test/FTCharToGlyphIndexMap-Test.cpp @@ -0,0 +1,64 @@ +#include +#include +#include +#include + +#include "FTCharToGlyphIndexMap.h" + + +class FTCharToGlyphIndexMapTest : public CppUnit::TestCase +{ + CPPUNIT_TEST_SUITE( FTCharToGlyphIndexMapTest); + CPPUNIT_TEST( testConstructor); + CPPUNIT_TEST( testInsert); + CPPUNIT_TEST( testClear); + CPPUNIT_TEST_SUITE_END(); + + public: + FTCharToGlyphIndexMapTest() : CppUnit::TestCase( "FTCharToGlyphIndexMap Test") + {} + + FTCharToGlyphIndexMapTest( const std::string& name) : CppUnit::TestCase(name) {} + + void testConstructor() + { + FTCharToGlyphIndexMap testMap; + + CPPUNIT_ASSERT( testMap.find( 2) == 0); + CPPUNIT_ASSERT( testMap.find( 5) == 0); + } + + void testInsert() + { + FTCharToGlyphIndexMap testMap; + + testMap.insert( 2, 37); + + CPPUNIT_ASSERT( testMap.find( 2) == 37); + CPPUNIT_ASSERT( testMap.find( 5) == 0); + } + + void testClear() + { + FTCharToGlyphIndexMap testMap; + + testMap.insert( 2, 37); + testMap.clear(); + + CPPUNIT_ASSERT( testMap.find( 2) == 0); + CPPUNIT_ASSERT( testMap.find( 5) == 0); + } + + + void setUp() + {} + + + void tearDown() + {} + + private: +}; + +CPPUNIT_TEST_SUITE_REGISTRATION( FTCharToGlyphIndexMapTest); + diff --git a/src/WinLibs/FTGL/test/FTCharmap-Test.cpp b/src/WinLibs/FTGL/test/FTCharmap-Test.cpp new file mode 100644 index 000000000..06b9c8b6b --- /dev/null +++ b/src/WinLibs/FTGL/test/FTCharmap-Test.cpp @@ -0,0 +1,143 @@ +#include + +#include +#include +#include +#include +#include + +#include +#include FT_FREETYPE_H +#include FT_GLYPH_H + + +#include "Fontdefs.h" +#include "FTFace.h" +#include "FTCharmap.h" + + +class FTCharmapTest : public CppUnit::TestCase +{ + CPPUNIT_TEST_SUITE( FTCharmapTest); + CPPUNIT_TEST( testConstructor); + CPPUNIT_TEST( testSetEncoding); + CPPUNIT_TEST( testGetGlyphListIndex); + CPPUNIT_TEST( testGetFontIndex); + CPPUNIT_TEST( testInsertCharacterIndex); + CPPUNIT_TEST_SUITE_END(); + + public: + FTCharmapTest() : CppUnit::TestCase( "FTCharmap Test") + { + setUpFreetype(); + } + + FTCharmapTest( const std::string& name) : CppUnit::TestCase(name) {} + + ~FTCharmapTest() + { + tearDownFreetype(); + } + + + void testConstructor() + { + CPPUNIT_ASSERT( charmap->Error() == 0); + CPPUNIT_ASSERT( charmap->Encoding() == ft_encoding_unicode); + } + + + void testSetEncoding() + { + CPPUNIT_ASSERT( charmap->CharMap( ft_encoding_unicode)); + + CPPUNIT_ASSERT( charmap->Error() == 0); + CPPUNIT_ASSERT( charmap->Encoding() == ft_encoding_unicode); + + CPPUNIT_ASSERT( !charmap->CharMap( ft_encoding_johab)); + + CPPUNIT_ASSERT( charmap->Error() == 0x06); // invalid argument + CPPUNIT_ASSERT( charmap->Encoding() == ft_encoding_none); + } + + + void testGetGlyphListIndex() + { + charmap->CharMap( ft_encoding_johab); + + CPPUNIT_ASSERT( charmap->Error() == 0x06); // invalid argument + CPPUNIT_ASSERT( charmap->GlyphListIndex( CHARACTER_CODE_A) == 0); + CPPUNIT_ASSERT( charmap->GlyphListIndex( BIG_CHARACTER_CODE) == 0); + CPPUNIT_ASSERT( charmap->GlyphListIndex( NULL_CHARACTER_CODE) == 0); + + charmap->CharMap( ft_encoding_unicode); + + CPPUNIT_ASSERT( charmap->Error() == 0); + CPPUNIT_ASSERT( charmap->GlyphListIndex( CHARACTER_CODE_A) == 0); + CPPUNIT_ASSERT( charmap->GlyphListIndex( BIG_CHARACTER_CODE) == 0); + CPPUNIT_ASSERT( charmap->GlyphListIndex( NULL_CHARACTER_CODE) == 0); + + } + + + void testGetFontIndex() + { + charmap->CharMap( ft_encoding_johab); + + CPPUNIT_ASSERT( charmap->Error() == 0x06); // invalid argument + CPPUNIT_ASSERT( charmap->FontIndex( CHARACTER_CODE_A) == FONT_INDEX_OF_A); + CPPUNIT_ASSERT( charmap->FontIndex( BIG_CHARACTER_CODE) == BIG_FONT_INDEX); + CPPUNIT_ASSERT( charmap->FontIndex( NULL_CHARACTER_CODE) == NULL_FONT_INDEX); + charmap->CharMap( ft_encoding_unicode); + + CPPUNIT_ASSERT( charmap->Error() == 0); + + CPPUNIT_ASSERT( charmap->FontIndex( CHARACTER_CODE_A) == FONT_INDEX_OF_A); + CPPUNIT_ASSERT( charmap->FontIndex( BIG_CHARACTER_CODE) == BIG_FONT_INDEX); + CPPUNIT_ASSERT( charmap->FontIndex( NULL_CHARACTER_CODE) == NULL_FONT_INDEX); + + } + + + void testInsertCharacterIndex() + { + CPPUNIT_ASSERT( charmap->GlyphListIndex( CHARACTER_CODE_A) == 0); + CPPUNIT_ASSERT( charmap->FontIndex( CHARACTER_CODE_A) == FONT_INDEX_OF_A); + + charmap->InsertIndex( CHARACTER_CODE_A, 69); + CPPUNIT_ASSERT( charmap->FontIndex( CHARACTER_CODE_A) == FONT_INDEX_OF_A); + CPPUNIT_ASSERT( charmap->GlyphListIndex( CHARACTER_CODE_A) == 69); + + charmap->InsertIndex( CHARACTER_CODE_G, 999); + CPPUNIT_ASSERT( charmap->GlyphListIndex( CHARACTER_CODE_G) == 999); + } + + void setUp() + { + charmap = new FTCharmap( face); + } + + + void tearDown() + { + delete charmap; + } + + private: + FTFace* face; + FTCharmap* charmap; + + void setUpFreetype() + { + face = new FTFace( GOOD_FONT_FILE); + CPPUNIT_ASSERT( !face->Error()); + } + + void tearDownFreetype() + { + delete face; + } +}; + +CPPUNIT_TEST_SUITE_REGISTRATION( FTCharmapTest); + diff --git a/src/WinLibs/FTGL/test/FTContour-Test.cpp b/src/WinLibs/FTGL/test/FTContour-Test.cpp new file mode 100644 index 000000000..5f13a3b0a --- /dev/null +++ b/src/WinLibs/FTGL/test/FTContour-Test.cpp @@ -0,0 +1,226 @@ +#include +#include +#include +#include + +#include "FTContour.h" + +// FT_Curve_Tag_On 1 +// FT_Curve_Tag_Conic 0 +// FT_Curve_Tag_Cubic 2 + +static FT_Vector shortLine[2] = +{ + { 1, 1}, + { 2, 2}, +}; + +static FT_Vector straightLinePoints[3] = +{ + { 0, 0}, + { 6, 7}, + { 9, -2} +}; + +static char straightLineTags[3] = +{ + FT_Curve_Tag_On, + FT_Curve_Tag_On, + FT_Curve_Tag_On +}; + +static char brokenTags[3] = +{ + FT_Curve_Tag_Conic, + 69, + FT_Curve_Tag_On +}; + +static FT_Vector simpleConicPoints[3] = +{ + { 0, 0}, + { 6, 7}, + { 9, -2} +}; + +static FT_Vector brokenPoints[3] = +{ + { 0, 0}, + { 0, 0}, + { 0, 0} +}; + +static char simpleConicTags[3] = +{ + FT_Curve_Tag_Conic, + FT_Curve_Tag_On, + FT_Curve_Tag_On +}; + +static FT_Vector doubleConicPoints[4] = +{ + { 0, 0}, + { 6, 7}, + { 9, -2}, + { 4, 0} +}; + +static char doubleConicTags[4] = +{ + FT_Curve_Tag_On, + FT_Curve_Tag_On, + FT_Curve_Tag_Conic, + FT_Curve_Tag_Conic +}; + +static FT_Vector cubicPoints[4] = +{ + { 0, 0}, + { 6, 7}, + { 9, -2}, + { 4, 0} +}; + +static char cubicTags[4] = +{ + FT_Curve_Tag_On, + FT_Curve_Tag_On, + FT_Curve_Tag_Cubic, + FT_Curve_Tag_Cubic +}; + + +// ARIAl 'd' +static FT_Vector compositePoints[18] = +{ + { 1856, 0}, + { 1856, 279}, + { 1625, -64}, + { 1175, -64}, + { 884, -64}, + { 396, 251}, + { 128, 815}, + { 128, 1182}, + { 128, 1539}, + { 370, 2121}, + { 855, 2432}, + { 1156, 2432}, + { 1375, 2432}, + { 1718, 2257}, + { 1826, 2118}, + { 1826, 3264}, + { 2240, 3264}, + { 2240, 0}, +}; + +static char compositeTags[18] = +{ + FT_Curve_Tag_On, + FT_Curve_Tag_On, + FT_Curve_Tag_Conic, + FT_Curve_Tag_On, + FT_Curve_Tag_Conic, + FT_Curve_Tag_Conic, + FT_Curve_Tag_Conic, + FT_Curve_Tag_On, + FT_Curve_Tag_Conic, + FT_Curve_Tag_Conic, + FT_Curve_Tag_Conic, + FT_Curve_Tag_On, + FT_Curve_Tag_Conic, + FT_Curve_Tag_Conic, + FT_Curve_Tag_On, + FT_Curve_Tag_On, + FT_Curve_Tag_On, + FT_Curve_Tag_On +}; + +class FTContourTest : public CppUnit::TestCase +{ + CPPUNIT_TEST_SUITE( FTContourTest); + CPPUNIT_TEST( testNullCurve); + CPPUNIT_TEST( testBrokenCurve); + CPPUNIT_TEST( testStraightLine); + CPPUNIT_TEST( testConicCurve); + CPPUNIT_TEST( testDoubleConicCurve); + CPPUNIT_TEST( testCubicCurve); + CPPUNIT_TEST( testCompositeCurve); + CPPUNIT_TEST_SUITE_END(); + + public: + FTContourTest() : CppUnit::TestCase( "FTContour Test") + {} + + FTContourTest( const std::string& name) : CppUnit::TestCase(name) + {} + + void testNullCurve() + { + FTContour contour( NULL, NULL, 0); + CPPUNIT_ASSERT( contour.PointCount() == 0); + } + + + void testBrokenCurve() + { + FTContour contour( brokenPoints, simpleConicTags, 3); + CPPUNIT_ASSERT( contour.PointCount() == 1); + + FTContour shortContour( shortLine, simpleConicTags, 2); + CPPUNIT_ASSERT( shortContour.PointCount() == 6); + + FTContour reallyShortContour( shortLine, simpleConicTags, 1); + CPPUNIT_ASSERT( reallyShortContour.PointCount() == 1); + + FTContour brokenTagtContour( shortLine, brokenTags, 3); + CPPUNIT_ASSERT( brokenTagtContour.PointCount() == 7); + } + + + void testStraightLine() + { + FTContour contour( straightLinePoints, straightLineTags, 3); + CPPUNIT_ASSERT( contour.PointCount() == 3); + } + + + void testConicCurve() + { + FTContour contour( simpleConicPoints, simpleConicTags, 3); + CPPUNIT_ASSERT( contour.PointCount() == 7); + } + + + void testDoubleConicCurve() + { + FTContour contour( doubleConicPoints, doubleConicTags, 4); + CPPUNIT_ASSERT( contour.PointCount() == 12); + } + + + void testCubicCurve() + { + FTContour contour( cubicPoints, cubicTags, 4); + CPPUNIT_ASSERT( contour.PointCount() == 7); + } + + + void testCompositeCurve() + { + FTContour contour( compositePoints, compositeTags, 18); + CPPUNIT_ASSERT( contour.PointCount() == 50); + } + + + void setUp() + {} + + + void tearDown() + {} + + private: +}; + +CPPUNIT_TEST_SUITE_REGISTRATION( FTContourTest); + diff --git a/src/WinLibs/FTGL/test/FTExtrdGlyph-Test.cpp b/src/WinLibs/FTGL/test/FTExtrdGlyph-Test.cpp new file mode 100644 index 000000000..7a2120f39 --- /dev/null +++ b/src/WinLibs/FTGL/test/FTExtrdGlyph-Test.cpp @@ -0,0 +1,91 @@ +#include +#include +#include +#include +#include + +#include "Fontdefs.h" +#include "FTExtrdGlyph.h" + +extern void buildGLContext(); + +class FTExtrdGlyphTest : public CppUnit::TestCase +{ + CPPUNIT_TEST_SUITE( FTExtrdGlyphTest); + CPPUNIT_TEST( testConstructor); + CPPUNIT_TEST( testRender); + CPPUNIT_TEST_SUITE_END(); + + public: + FTExtrdGlyphTest() : CppUnit::TestCase( "FTExtrdGlyph Test") + { + } + + FTExtrdGlyphTest( const std::string& name) : CppUnit::TestCase(name) {} + + ~FTExtrdGlyphTest() + { + } + + void testConstructor() + { + setUpFreetype(); + + buildGLContext(); + + FTExtrdGlyph* extrudedGlyph = new FTExtrdGlyph( face->glyph, 0.0f, true); + CPPUNIT_ASSERT( extrudedGlyph->Error() == 0); + + CPPUNIT_ASSERT( glGetError() == GL_NO_ERROR); + + tearDownFreetype(); + } + + void testRender() + { + setUpFreetype(); + + buildGLContext(); + + FTExtrdGlyph* extrudedGlyph = new FTExtrdGlyph( face->glyph, 0.0f, true); + CPPUNIT_ASSERT( extrudedGlyph->Error() == 0); + extrudedGlyph->Render(FTPoint(0, 0, 0)); + + CPPUNIT_ASSERT( glGetError() == GL_NO_ERROR); + + tearDownFreetype(); + } + + void setUp() + {} + + void tearDown() + {} + + private: + FT_Library library; + FT_Face face; + + void setUpFreetype() + { + FT_Error error = FT_Init_FreeType( &library); + assert(!error); + error = FT_New_Face( library, FONT_FILE, 0, &face); + assert(!error); + + FT_Set_Char_Size( face, 0L, FONT_POINT_SIZE * 64, RESOLUTION, RESOLUTION); + + error = FT_Load_Char( face, CHARACTER_CODE_A, FT_LOAD_DEFAULT); + assert( !error); + } + + void tearDownFreetype() + { + FT_Done_Face( face); + FT_Done_FreeType( library); + } + +}; + +CPPUNIT_TEST_SUITE_REGISTRATION( FTExtrdGlyphTest); + diff --git a/src/WinLibs/FTGL/test/FTFace-Test.cpp b/src/WinLibs/FTGL/test/FTFace-Test.cpp new file mode 100644 index 000000000..0f0935580 --- /dev/null +++ b/src/WinLibs/FTGL/test/FTFace-Test.cpp @@ -0,0 +1,130 @@ +#include "cppunit/extensions/HelperMacros.h" +#include "cppunit/TestCaller.h" +#include "cppunit/TestCase.h" +#include "cppunit/TestSuite.h" + +#include "Fontdefs.h" +#include "FTFace.h" + + +class FTFaceTest : public CppUnit::TestCase +{ + CPPUNIT_TEST_SUITE( FTFaceTest); + CPPUNIT_TEST( testOpenFace); + CPPUNIT_TEST( testOpenFaceFromMemory); + CPPUNIT_TEST( testAttachFile); + CPPUNIT_TEST( testAttachMemoryData); + CPPUNIT_TEST( testGlyphCount); + CPPUNIT_TEST( testSetFontSize); + CPPUNIT_TEST( testGetCharmapList); + CPPUNIT_TEST( testKerning); + CPPUNIT_TEST_SUITE_END(); + + public: + FTFaceTest() : CppUnit::TestCase( "FTFace test") {}; + FTFaceTest( const std::string& name) : CppUnit::TestCase(name) {}; + + + void testOpenFace() + { + FTFace face1( BAD_FONT_FILE); + CPPUNIT_ASSERT( face1.Error() == 0x06); + + FTFace face2( GOOD_FONT_FILE); + CPPUNIT_ASSERT( face2.Error() == 0); + } + + + void testOpenFaceFromMemory() + { + FTFace face1( (unsigned char*)100, 0); + CPPUNIT_ASSERT( face1.Error() == 0x02); + + FTFace face2( HPGCalc_pfb.dataBytes, HPGCalc_pfb.numBytes); + CPPUNIT_ASSERT( face2.Error() == 0); + } + + + void testAttachFile() + { + CPPUNIT_ASSERT( !testFace->Attach( TYPE1_AFM_FILE)); + CPPUNIT_ASSERT( testFace->Error() == 0x07); // unimplemented feature + + FTFace test( TYPE1_FONT_FILE); + CPPUNIT_ASSERT( test.Error() == 0); + + CPPUNIT_ASSERT( test.Attach( TYPE1_AFM_FILE)); + CPPUNIT_ASSERT( test.Error() == 0); + } + + + void testAttachMemoryData() + { + CPPUNIT_ASSERT( !testFace->Attach((unsigned char*)100, 0)); + CPPUNIT_ASSERT( testFace->Error() == 0x07); // unimplemented feature + + FTFace test( TYPE1_FONT_FILE); + CPPUNIT_ASSERT( test.Error() == 0); + + CPPUNIT_ASSERT( test.Attach( HPGCalc_afm.dataBytes, HPGCalc_afm.numBytes)); + CPPUNIT_ASSERT( test.Error() == 0); + } + + + void testGlyphCount() + { + CPPUNIT_ASSERT( testFace->GlyphCount() == 14099); + } + + + void testSetFontSize() + { + FTSize size = testFace->Size( FONT_POINT_SIZE, RESOLUTION); + CPPUNIT_ASSERT( testFace->Error() == 0); + } + + + void testGetCharmapList() + { + CPPUNIT_ASSERT( testFace->CharMapCount() == 2); + + FT_Encoding* charmapList = testFace->CharMapList(); + + CPPUNIT_ASSERT( charmapList[0] == ft_encoding_unicode); + CPPUNIT_ASSERT( charmapList[1] == ft_encoding_adobe_standard); + } + + + void testKerning() + { + FTFace test(ARIAL_FONT_FILE); + FTPoint kerningVector = test.KernAdvance( 'A', 'A'); + CPPUNIT_ASSERT( kerningVector.X() == 0); + CPPUNIT_ASSERT( kerningVector.Y() == 0); + CPPUNIT_ASSERT( kerningVector.Z() == 0); + + kerningVector = test.KernAdvance( 0x6FB3, 0x9580); + CPPUNIT_ASSERT( kerningVector.X() == 0); + CPPUNIT_ASSERT( kerningVector.Y() == 0); + CPPUNIT_ASSERT( kerningVector.Z() == 0); + } + + + void setUp() + { + testFace = new FTFace( GOOD_FONT_FILE); + } + + + void tearDown() + { + delete testFace; + } + + private: + FTFace* testFace; + +}; + +CPPUNIT_TEST_SUITE_REGISTRATION( FTFaceTest); + diff --git a/src/WinLibs/FTGL/test/FTFont-Test.cpp b/src/WinLibs/FTGL/test/FTFont-Test.cpp new file mode 100644 index 000000000..8ad9f2105 --- /dev/null +++ b/src/WinLibs/FTGL/test/FTFont-Test.cpp @@ -0,0 +1,294 @@ +#include "cppunit/extensions/HelperMacros.h" +#include "cppunit/TestCaller.h" +#include "cppunit/TestCase.h" +#include "cppunit/TestSuite.h" + +#include "Fontdefs.h" +#include "FTGlyph.h" +#include "FTFont.h" + + +class TestGlyph : public FTGlyph +{ + public: + TestGlyph( FT_GlyphSlot glyph) + : FTGlyph( glyph) + {} + + const FTPoint& Render( const FTPoint& pen){ return advance;} +}; + + +class TestFont : public FTFont +{ + public: + TestFont( const char* fontFilePath) + : FTFont( fontFilePath) + {} + + TestFont( const unsigned char *pBufferBytes, size_t bufferSizeInBytes) + : FTFont( pBufferBytes, bufferSizeInBytes) + {} + + FTGlyph* MakeGlyph( unsigned int g) + { + FT_GlyphSlot ftGlyph = face.Glyph( g, FT_LOAD_NO_HINTING); + + if( ftGlyph) + { + TestGlyph* tempGlyph = new TestGlyph( ftGlyph); + return tempGlyph; + } + + err = face.Error(); + return NULL; + } +}; + + +class BadGlyphTestFont : public FTFont +{ + public: + BadGlyphTestFont( const char* fontFilePath) + : FTFont( fontFilePath) + {} + + FTGlyph* MakeGlyph( unsigned int g) + { + FT_GlyphSlot ftGlyph = face.Glyph( g, FT_LOAD_NO_HINTING); + + if( ftGlyph) + { + TestGlyph* tempGlyph = new TestGlyph( ftGlyph); + return tempGlyph; + } + + err = face.Error(); + return NULL; + } + + private: + bool CheckGlyph( const unsigned int chr) + { + static bool succeed = false; + + if( succeed == false) + { + succeed = true; + return false; + } + + return true; + } + +}; + + +class FTFontTest : public CppUnit::TestCase +{ + CPPUNIT_TEST_SUITE( FTFontTest); + CPPUNIT_TEST( testOpenFont); + CPPUNIT_TEST( testOpenFontFromMemory); + CPPUNIT_TEST( testAttachFile); + CPPUNIT_TEST( testAttachData); + CPPUNIT_TEST( testSetFontSize); + CPPUNIT_TEST( testSetCharMap); + CPPUNIT_TEST( testGetCharmapList); + CPPUNIT_TEST( testBoundingBox); + CPPUNIT_TEST( testCheckGlyphFailure); + CPPUNIT_TEST( testAdvance); + CPPUNIT_TEST( testRender); + CPPUNIT_TEST_SUITE_END(); + + public: + FTFontTest() : CppUnit::TestCase( "FTFont test") {}; + FTFontTest( const std::string& name) : CppUnit::TestCase(name) {}; + + + void testOpenFont() + { + TestFont badFont( BAD_FONT_FILE); + CPPUNIT_ASSERT( badFont.Error() == 0x06); // invalid argument + + TestFont goodFont( GOOD_FONT_FILE); + CPPUNIT_ASSERT( goodFont.Error() == 0); + } + + + void testOpenFontFromMemory() + { + TestFont badFont( (unsigned char*)100, 0); + CPPUNIT_ASSERT( badFont.Error() == 0x02); + + TestFont goodFont( HPGCalc_pfb.dataBytes, HPGCalc_pfb.numBytes); + CPPUNIT_ASSERT( goodFont.Error() == 0); + } + + + void testAttachFile() + { + testFont->Attach( TYPE1_AFM_FILE); + CPPUNIT_ASSERT( testFont->Error() == 0x07); // unimplemented feature + } + + + void testAttachData() + { + testFont->Attach( (unsigned char*)100, 0); + CPPUNIT_ASSERT( testFont->Error() == 0x07); // unimplemented feature + } + + + void testSetFontSize() + { + CPPUNIT_ASSERT_DOUBLES_EQUAL( 0, testFont->Ascender(), 0.01); + CPPUNIT_ASSERT_DOUBLES_EQUAL( 0, testFont->Descender(), 0.01); + CPPUNIT_ASSERT_DOUBLES_EQUAL( 0, testFont->LineHeight(), 0.01); + + float advance = testFont->Advance( GOOD_UNICODE_TEST_STRING); + CPPUNIT_ASSERT( advance == 0); + + CPPUNIT_ASSERT( testFont->FaceSize( FONT_POINT_SIZE)); + CPPUNIT_ASSERT( testFont->Error() == 0); + + CPPUNIT_ASSERT( testFont->FaceSize() == FONT_POINT_SIZE); + + CPPUNIT_ASSERT_DOUBLES_EQUAL( 52, testFont->Ascender(), 0.01); + CPPUNIT_ASSERT_DOUBLES_EQUAL( -15, testFont->Descender(), 0.01); + CPPUNIT_ASSERT_DOUBLES_EQUAL( 81.86, testFont->LineHeight(), 0.01); + + CPPUNIT_ASSERT( testFont->FaceSize( FONT_POINT_SIZE * 2)); + CPPUNIT_ASSERT( testFont->Error() == 0); + + CPPUNIT_ASSERT( testFont->FaceSize() == FONT_POINT_SIZE * 2); + + CPPUNIT_ASSERT_DOUBLES_EQUAL( 104, testFont->Ascender(), 0.01); + CPPUNIT_ASSERT_DOUBLES_EQUAL( -29, testFont->Descender(), 0.01); + CPPUNIT_ASSERT_DOUBLES_EQUAL( 163.72, testFont->LineHeight(), 0.01); + } + + + void testSetCharMap() + { + CPPUNIT_ASSERT( true == testFont->CharMap( ft_encoding_unicode)); + CPPUNIT_ASSERT( testFont->Error() == 0); + CPPUNIT_ASSERT( false == testFont->CharMap( ft_encoding_johab)); + CPPUNIT_ASSERT( testFont->Error() == 0x06); // invalid argument + } + + + void testGetCharmapList() + { + CPPUNIT_ASSERT( testFont->CharMapCount() == 2); + + FT_Encoding* charmapList = testFont->CharMapList(); + + CPPUNIT_ASSERT( charmapList[0] == ft_encoding_unicode); + CPPUNIT_ASSERT( charmapList[1] == ft_encoding_adobe_standard); + } + + + void testBoundingBox() + { + CPPUNIT_ASSERT( testFont->FaceSize( FONT_POINT_SIZE)); + CPPUNIT_ASSERT( testFont->Error() == 0); + + float llx, lly, llz, urx, ury, urz; + + testFont->BBox( GOOD_ASCII_TEST_STRING, llx, lly, llz, urx, ury, urz); + + CPPUNIT_ASSERT_DOUBLES_EQUAL( 1.21, llx, 0.01); + CPPUNIT_ASSERT_DOUBLES_EQUAL( -15.12, lly, 0.01); + CPPUNIT_ASSERT_DOUBLES_EQUAL( 0.00, llz, 0.01); + CPPUNIT_ASSERT_DOUBLES_EQUAL( 307.43, urx, 0.01); + CPPUNIT_ASSERT_DOUBLES_EQUAL( 51.54, ury, 0.01); + CPPUNIT_ASSERT_DOUBLES_EQUAL( 0.00, urz, 0.01); + + testFont->BBox( BAD_ASCII_TEST_STRING, llx, lly, llz, urx, ury, urz); + + CPPUNIT_ASSERT_DOUBLES_EQUAL( 0, llx, 0.01); + CPPUNIT_ASSERT_DOUBLES_EQUAL( 0, lly, 0.01); + CPPUNIT_ASSERT_DOUBLES_EQUAL( 0, llz, 0.01); + CPPUNIT_ASSERT_DOUBLES_EQUAL( 0, urx, 0.01); + CPPUNIT_ASSERT_DOUBLES_EQUAL( 0, ury, 0.01); + CPPUNIT_ASSERT_DOUBLES_EQUAL( 0, urz, 0.01); + + testFont->BBox( GOOD_UNICODE_TEST_STRING, llx, lly, llz, urx, ury, urz); + + CPPUNIT_ASSERT_DOUBLES_EQUAL( 2.15, llx, 0.01); + CPPUNIT_ASSERT_DOUBLES_EQUAL( -6.12, lly, 0.01); + CPPUNIT_ASSERT_DOUBLES_EQUAL( 0.00, llz, 0.01); + CPPUNIT_ASSERT_DOUBLES_EQUAL( 134.28, urx, 0.01); + CPPUNIT_ASSERT_DOUBLES_EQUAL( 61.12, ury, 0.01); + CPPUNIT_ASSERT_DOUBLES_EQUAL( 0.00, urz, 0.01); + + testFont->BBox( BAD_UNICODE_TEST_STRING, llx, lly, llz, urx, ury, urz); + + CPPUNIT_ASSERT_DOUBLES_EQUAL( 0, llx, 0.01); + CPPUNIT_ASSERT_DOUBLES_EQUAL( 0, lly, 0.01); + CPPUNIT_ASSERT_DOUBLES_EQUAL( 0, llz, 0.01); + CPPUNIT_ASSERT_DOUBLES_EQUAL( 0, urx, 0.01); + CPPUNIT_ASSERT_DOUBLES_EQUAL( 0, ury, 0.01); + CPPUNIT_ASSERT_DOUBLES_EQUAL( 0, urz, 0.01); + + testFont->BBox( (char*)0, llx, lly, llz, urx, ury, urz); + + CPPUNIT_ASSERT_DOUBLES_EQUAL( 0, llx, 0.01); + CPPUNIT_ASSERT_DOUBLES_EQUAL( 0, lly, 0.01); + CPPUNIT_ASSERT_DOUBLES_EQUAL( 0, llz, 0.01); + CPPUNIT_ASSERT_DOUBLES_EQUAL( 0, urx, 0.01); + CPPUNIT_ASSERT_DOUBLES_EQUAL( 0, ury, 0.01); + CPPUNIT_ASSERT_DOUBLES_EQUAL( 0, urz, 0.01); + } + + void testCheckGlyphFailure() + { + BadGlyphTestFont* testFont = new BadGlyphTestFont(GOOD_FONT_FILE); + + float advance = testFont->Advance( GOOD_ASCII_TEST_STRING); + CPPUNIT_ASSERT_DOUBLES_EQUAL( 0.0, advance, 0.01); + } + + void testAdvance() + { + CPPUNIT_ASSERT( testFont->FaceSize( FONT_POINT_SIZE)); + CPPUNIT_ASSERT( testFont->Error() == 0); + + float advance = testFont->Advance( GOOD_ASCII_TEST_STRING); + CPPUNIT_ASSERT_DOUBLES_EQUAL( 312.10, advance, 0.01); + + advance = testFont->Advance( BAD_ASCII_TEST_STRING); + CPPUNIT_ASSERT_DOUBLES_EQUAL( 0, advance, 0.01); + + advance = testFont->Advance( GOOD_UNICODE_TEST_STRING); + CPPUNIT_ASSERT_DOUBLES_EQUAL( 144, advance, 0.01); + + advance = testFont->Advance( BAD_UNICODE_TEST_STRING); + CPPUNIT_ASSERT_DOUBLES_EQUAL( 0, advance, 0.01); + } + + void testRender() + { + testFont->Render(GOOD_ASCII_TEST_STRING); + CPPUNIT_ASSERT( testFont->Error() == 0); + } + + + void setUp() + { + testFont = new TestFont( GOOD_FONT_FILE); + } + + + void tearDown() + { + delete testFont; + } + + private: + TestFont* testFont; + +}; + +CPPUNIT_TEST_SUITE_REGISTRATION( FTFontTest); + diff --git a/src/WinLibs/FTGL/test/FTGLBitmapFont-Test.cpp b/src/WinLibs/FTGL/test/FTGLBitmapFont-Test.cpp new file mode 100644 index 000000000..5926c1762 --- /dev/null +++ b/src/WinLibs/FTGL/test/FTGLBitmapFont-Test.cpp @@ -0,0 +1,109 @@ +#include +#include +#include +#include +#include + +#include "Fontdefs.h" +#include "FTGLBitmapFont.h" + +extern void buildGLContext(); + +class FTGLBitmapFontTest : public CppUnit::TestCase +{ + CPPUNIT_TEST_SUITE( FTGLBitmapFontTest); + CPPUNIT_TEST( testConstructor); + CPPUNIT_TEST( testRender); + CPPUNIT_TEST( testPenPosition); + CPPUNIT_TEST( testDisplayList); + CPPUNIT_TEST_SUITE_END(); + + public: + FTGLBitmapFontTest() : CppUnit::TestCase( "FTGLBitmapFont Test") + { + } + + FTGLBitmapFontTest( const std::string& name) : CppUnit::TestCase(name) {} + + ~FTGLBitmapFontTest() + { + } + + void testConstructor() + { + buildGLContext(); + + FTGLBitmapFont* bitmapFont = new FTGLBitmapFont( FONT_FILE); + CPPUNIT_ASSERT( bitmapFont->Error() == 0); + + CPPUNIT_ASSERT( glGetError() == GL_NO_ERROR); + } + + void testRender() + { + buildGLContext(); + + FTGLBitmapFont* bitmapFont = new FTGLBitmapFont( FONT_FILE); + bitmapFont->Render(GOOD_ASCII_TEST_STRING); + + CPPUNIT_ASSERT( bitmapFont->Error() == 0); + CPPUNIT_ASSERT( glGetError() == GL_NO_ERROR); + + bitmapFont->FaceSize(18); + bitmapFont->Render(GOOD_ASCII_TEST_STRING); + + CPPUNIT_ASSERT( bitmapFont->Error() == 0); + CPPUNIT_ASSERT( glGetError() == GL_NO_ERROR); + } + + + void testPenPosition() + { + buildGLContext(); + float rasterPosition[4]; + + glRasterPos2f(0.0f,0.0f); + + glGetFloatv(GL_CURRENT_RASTER_POSITION, rasterPosition); + CPPUNIT_ASSERT_DOUBLES_EQUAL( 0.0, rasterPosition[0], 0.01); + + FTGLBitmapFont* bitmapFont = new FTGLBitmapFont( FONT_FILE); + bitmapFont->FaceSize(18); + + bitmapFont->Render(GOOD_ASCII_TEST_STRING); + bitmapFont->Render(GOOD_ASCII_TEST_STRING); + + glGetFloatv(GL_CURRENT_RASTER_POSITION, rasterPosition); + CPPUNIT_ASSERT_DOUBLES_EQUAL( 122, rasterPosition[0], 0.01); + CPPUNIT_ASSERT_DOUBLES_EQUAL( 0.0, rasterPosition[1], 0.01); + } + + + void testDisplayList() + { + buildGLContext(); + + FTGLBitmapFont* bitmapFont = new FTGLBitmapFont( FONT_FILE); + bitmapFont->FaceSize(18); + + int glList = glGenLists(1); + glNewList( glList, GL_COMPILE); + + bitmapFont->Render(GOOD_ASCII_TEST_STRING); + + glEndList(); + + CPPUNIT_ASSERT( glGetError() == GL_NO_ERROR); + } + + void setUp() + {} + + void tearDown() + {} + + private: +}; + +CPPUNIT_TEST_SUITE_REGISTRATION( FTGLBitmapFontTest); + diff --git a/src/WinLibs/FTGL/test/FTGLExtrdFont.cpp-Test.cpp b/src/WinLibs/FTGL/test/FTGLExtrdFont.cpp-Test.cpp new file mode 100644 index 000000000..971bcfedb --- /dev/null +++ b/src/WinLibs/FTGL/test/FTGLExtrdFont.cpp-Test.cpp @@ -0,0 +1,104 @@ +#include +#include +#include +#include +#include + +#include "Fontdefs.h" +#include "FTGLExtrdFont.h" + +extern void buildGLContext(); + +class FTGLExtrdFontTest : public CppUnit::TestCase +{ + CPPUNIT_TEST_SUITE( FTGLExtrdFontTest); + CPPUNIT_TEST( testConstructor); + CPPUNIT_TEST( testRender); + CPPUNIT_TEST( testBadDisplayList); + CPPUNIT_TEST( testGoodDisplayList); + CPPUNIT_TEST_SUITE_END(); + + public: + FTGLExtrdFontTest() : CppUnit::TestCase( "FTGLExtrdFont Test") + { + } + + FTGLExtrdFontTest( const std::string& name) : CppUnit::TestCase(name) {} + + ~FTGLExtrdFontTest() + { + } + + void testConstructor() + { + buildGLContext(); + + FTGLExtrdFont* extrudedFont = new FTGLExtrdFont( FONT_FILE); + CPPUNIT_ASSERT( extrudedFont->Error() == 0); + + CPPUNIT_ASSERT( glGetError() == GL_NO_ERROR); + } + + void testRender() + { + buildGLContext(); + + FTGLExtrdFont* extrudedFont = new FTGLExtrdFont( FONT_FILE); + extrudedFont->Render(GOOD_ASCII_TEST_STRING); + + CPPUNIT_ASSERT( extrudedFont->Error() == 0x97); // Invalid pixels per em + CPPUNIT_ASSERT( glGetError() == GL_NO_ERROR); + + extrudedFont->FaceSize(18); + extrudedFont->Render(GOOD_ASCII_TEST_STRING); + + CPPUNIT_ASSERT( extrudedFont->Error() == 0); + CPPUNIT_ASSERT( glGetError() == GL_NO_ERROR); + } + + void testBadDisplayList() + { + buildGLContext(); + + FTGLExtrdFont* extrudedFont = new FTGLExtrdFont( FONT_FILE); + extrudedFont->FaceSize(18); + + int glList = glGenLists(1); + glNewList( glList, GL_COMPILE); + + extrudedFont->Render(GOOD_ASCII_TEST_STRING); + + glEndList(); + + CPPUNIT_ASSERT( glGetError() == GL_INVALID_OPERATION); + } + + void testGoodDisplayList() + { + buildGLContext(); + + FTGLExtrdFont* extrudedFont = new FTGLExtrdFont( FONT_FILE); + extrudedFont->FaceSize(18); + + extrudedFont->UseDisplayList(false); + int glList = glGenLists(1); + glNewList( glList, GL_COMPILE); + + extrudedFont->Render(GOOD_ASCII_TEST_STRING); + + glEndList(); + + CPPUNIT_ASSERT( glGetError() == GL_NO_ERROR); + } + + void setUp() + {} + + void tearDown() + {} + + private: +}; + +CPPUNIT_TEST_SUITE_REGISTRATION( FTGLExtrdFontTest); + diff --git a/src/WinLibs/FTGL/test/FTGLOutlineFont-Test.cpp b/src/WinLibs/FTGL/test/FTGLOutlineFont-Test.cpp new file mode 100644 index 000000000..ed8b50dd3 --- /dev/null +++ b/src/WinLibs/FTGL/test/FTGLOutlineFont-Test.cpp @@ -0,0 +1,104 @@ +#include +#include +#include +#include +#include + +#include "Fontdefs.h" +#include "FTGLOutlineFont.h" + +extern void buildGLContext(); + +class FTGLOutlineFontTest : public CppUnit::TestCase +{ + CPPUNIT_TEST_SUITE( FTGLOutlineFontTest); + CPPUNIT_TEST( testConstructor); + CPPUNIT_TEST( testRender); + CPPUNIT_TEST( testBadDisplayList); + CPPUNIT_TEST( testGoodDisplayList); + CPPUNIT_TEST_SUITE_END(); + + public: + FTGLOutlineFontTest() : CppUnit::TestCase( "FTGLOutlineFont Test") + { + } + + FTGLOutlineFontTest( const std::string& name) : CppUnit::TestCase(name) {} + + ~FTGLOutlineFontTest() + { + } + + void testConstructor() + { + buildGLContext(); + + FTGLOutlineFont* outlineFont = new FTGLOutlineFont( FONT_FILE); + CPPUNIT_ASSERT( outlineFont->Error() == 0); + + CPPUNIT_ASSERT( glGetError() == GL_NO_ERROR); + } + + void testRender() + { + buildGLContext(); + + FTGLOutlineFont* outlineFont = new FTGLOutlineFont( FONT_FILE); + outlineFont->Render(GOOD_ASCII_TEST_STRING); + + CPPUNIT_ASSERT( outlineFont->Error() == 0x97); // Invalid pixels per em + CPPUNIT_ASSERT( glGetError() == GL_NO_ERROR); + + outlineFont->FaceSize(18); + outlineFont->Render(GOOD_ASCII_TEST_STRING); + + CPPUNIT_ASSERT( outlineFont->Error() == 0); + CPPUNIT_ASSERT( glGetError() == GL_NO_ERROR); + } + + void testBadDisplayList() + { + buildGLContext(); + + FTGLOutlineFont* outlineFont = new FTGLOutlineFont( FONT_FILE); + outlineFont->FaceSize(18); + + int glList = glGenLists(1); + glNewList( glList, GL_COMPILE); + + outlineFont->Render(GOOD_ASCII_TEST_STRING); + + glEndList(); + + CPPUNIT_ASSERT( glGetError() == GL_INVALID_OPERATION); + } + + void testGoodDisplayList() + { + buildGLContext(); + + FTGLOutlineFont* outlineFont = new FTGLOutlineFont( FONT_FILE); + outlineFont->FaceSize(18); + + outlineFont->UseDisplayList(false); + int glList = glGenLists(1); + glNewList( glList, GL_COMPILE); + + outlineFont->Render(GOOD_ASCII_TEST_STRING); + + glEndList(); + + CPPUNIT_ASSERT( glGetError() == GL_NO_ERROR); + } + + void setUp() + {} + + void tearDown() + {} + + private: +}; + +CPPUNIT_TEST_SUITE_REGISTRATION( FTGLOutlineFontTest); + diff --git a/src/WinLibs/FTGL/test/FTGLPixmapFont-Test.cpp b/src/WinLibs/FTGL/test/FTGLPixmapFont-Test.cpp new file mode 100644 index 000000000..4c821489c --- /dev/null +++ b/src/WinLibs/FTGL/test/FTGLPixmapFont-Test.cpp @@ -0,0 +1,85 @@ +#include +#include +#include +#include +#include + +#include "Fontdefs.h" +#include "FTGLPixmapFont.h" + +extern void buildGLContext(); + +class FTGLPixmapFontTest : public CppUnit::TestCase +{ + CPPUNIT_TEST_SUITE( FTGLPixmapFontTest); + CPPUNIT_TEST( testConstructor); + CPPUNIT_TEST( testRender); + CPPUNIT_TEST( testDisplayList); + CPPUNIT_TEST_SUITE_END(); + + public: + FTGLPixmapFontTest() : CppUnit::TestCase( "FTGLPixmapFont Test") + { + } + + FTGLPixmapFontTest( const std::string& name) : CppUnit::TestCase(name) {} + + ~FTGLPixmapFontTest() + { + } + + void testConstructor() + { + buildGLContext(); + + FTGLPixmapFont* pixmapFont = new FTGLPixmapFont( FONT_FILE); + CPPUNIT_ASSERT( pixmapFont->Error() == 0); + + CPPUNIT_ASSERT( glGetError() == GL_NO_ERROR); + } + + void testRender() + { + buildGLContext(); + + FTGLPixmapFont* pixmapFont = new FTGLPixmapFont( FONT_FILE); + + pixmapFont->Render(GOOD_ASCII_TEST_STRING); + CPPUNIT_ASSERT( pixmapFont->Error() == 0x97); // Invalid pixels per em + CPPUNIT_ASSERT( glGetError() == GL_NO_ERROR); + + pixmapFont->FaceSize(18); + pixmapFont->Render(GOOD_ASCII_TEST_STRING); + + CPPUNIT_ASSERT( pixmapFont->Error() == 0); + CPPUNIT_ASSERT( glGetError() == GL_NO_ERROR); + } + + void testDisplayList() + { + buildGLContext(); + + FTGLPixmapFont* pixmapFont = new FTGLPixmapFont( FONT_FILE); + pixmapFont->FaceSize(18); + + int glList = glGenLists(1); + glNewList( glList, GL_COMPILE); + + pixmapFont->Render(GOOD_ASCII_TEST_STRING); + + glEndList(); + + CPPUNIT_ASSERT( glGetError() == GL_NO_ERROR); + } + + void setUp() + {} + + void tearDown() + {} + + private: +}; + +CPPUNIT_TEST_SUITE_REGISTRATION( FTGLPixmapFontTest); + diff --git a/src/WinLibs/FTGL/test/FTGLPolygonFont-Test.cpp b/src/WinLibs/FTGL/test/FTGLPolygonFont-Test.cpp new file mode 100644 index 000000000..08a40e2a8 --- /dev/null +++ b/src/WinLibs/FTGL/test/FTGLPolygonFont-Test.cpp @@ -0,0 +1,105 @@ +#include +#include +#include +#include +#include + +#include "Fontdefs.h" +#include "FTGLPolygonFont.h" + +extern void buildGLContext(); + +class FTGLPolygonFontTest : public CppUnit::TestCase +{ + CPPUNIT_TEST_SUITE( FTGLPolygonFontTest); + CPPUNIT_TEST( testConstructor); + CPPUNIT_TEST( testRender); + CPPUNIT_TEST( testBadDisplayList); + CPPUNIT_TEST( testGoodDisplayList); + CPPUNIT_TEST_SUITE_END(); + + public: + FTGLPolygonFontTest() : CppUnit::TestCase( "FTGLPolygonFont Test") + { + } + + FTGLPolygonFontTest( const std::string& name) : CppUnit::TestCase(name) {} + + ~FTGLPolygonFontTest() + { + } + + void testConstructor() + { + buildGLContext(); + + FTGLPolygonFont* polygonFont = new FTGLPolygonFont( FONT_FILE); + CPPUNIT_ASSERT( polygonFont->Error() == 0); + + CPPUNIT_ASSERT( glGetError() == GL_NO_ERROR); + } + + void testRender() + { + buildGLContext(); + + FTGLPolygonFont* polygonFont = new FTGLPolygonFont( FONT_FILE); + + polygonFont->Render(GOOD_ASCII_TEST_STRING); + + CPPUNIT_ASSERT( polygonFont->Error() == 0x97); // Invalid pixels per em + CPPUNIT_ASSERT( glGetError() == GL_NO_ERROR); + + polygonFont->FaceSize(18); + polygonFont->Render(GOOD_ASCII_TEST_STRING); + + CPPUNIT_ASSERT( polygonFont->Error() == 0); + CPPUNIT_ASSERT( glGetError() == GL_NO_ERROR); + } + + void testBadDisplayList() + { + buildGLContext(); + + FTGLPolygonFont* polygonFont = new FTGLPolygonFont( FONT_FILE); + polygonFont->FaceSize(18); + + int glList = glGenLists(1); + glNewList( glList, GL_COMPILE); + + polygonFont->Render(GOOD_ASCII_TEST_STRING); + + glEndList(); + + CPPUNIT_ASSERT( glGetError() == GL_INVALID_OPERATION); + } + + void testGoodDisplayList() + { + buildGLContext(); + + FTGLPolygonFont* polygonFont = new FTGLPolygonFont( FONT_FILE); + polygonFont->FaceSize(18); + + polygonFont->UseDisplayList(false); + int glList = glGenLists(1); + glNewList( glList, GL_COMPILE); + + polygonFont->Render(GOOD_ASCII_TEST_STRING); + + glEndList(); + + CPPUNIT_ASSERT( glGetError() == GL_NO_ERROR); + } + + void setUp() + {} + + void tearDown() + {} + + private: +}; + +CPPUNIT_TEST_SUITE_REGISTRATION( FTGLPolygonFontTest); + diff --git a/src/WinLibs/FTGL/test/FTGLTextureFont-Test.cpp b/src/WinLibs/FTGL/test/FTGLTextureFont-Test.cpp new file mode 100644 index 000000000..923780627 --- /dev/null +++ b/src/WinLibs/FTGL/test/FTGLTextureFont-Test.cpp @@ -0,0 +1,101 @@ +#include +#include +#include +#include +#include + +#include "Fontdefs.h" +#include "FTGLTextureFont.h" + +extern void buildGLContext(); + +class FTGLTextureFontTest : public CppUnit::TestCase +{ + CPPUNIT_TEST_SUITE( FTGLTextureFontTest); + CPPUNIT_TEST( testConstructor); + CPPUNIT_TEST( testResizeBug); + CPPUNIT_TEST( testRender); + CPPUNIT_TEST( testDisplayList); + CPPUNIT_TEST_SUITE_END(); + + public: + FTGLTextureFontTest() : CppUnit::TestCase( "FTGLTextureFontTest Test") + { + } + + FTGLTextureFontTest( const std::string& name) : CppUnit::TestCase(name) {} + + ~FTGLTextureFontTest() + { + } + + void testConstructor() + { + buildGLContext(); + + FTGLTextureFont* textureFont = new FTGLTextureFont( FONT_FILE); + CPPUNIT_ASSERT( textureFont->Error() == 0); + CPPUNIT_ASSERT( glGetError() == GL_NO_ERROR); + } + + void testResizeBug() + { + buildGLContext(); + + FTGLTextureFont* textureFont = new FTGLTextureFont( FONT_FILE); + CPPUNIT_ASSERT( textureFont->Error() == 0); + + textureFont->FaceSize(18); + textureFont->Render("first"); + + textureFont->FaceSize(38); + textureFont->Render("second"); + + CPPUNIT_ASSERT( glGetError() == GL_NO_ERROR); + } + + void testRender() + { + buildGLContext(); + + FTGLTextureFont* textureFont = new FTGLTextureFont( FONT_FILE); + + textureFont->Render(GOOD_ASCII_TEST_STRING); + CPPUNIT_ASSERT( textureFont->Error() == 0x97); // Invalid pixels per em + CPPUNIT_ASSERT( glGetError() == GL_NO_ERROR); + + textureFont->FaceSize(18); + textureFont->Render(GOOD_ASCII_TEST_STRING); + + CPPUNIT_ASSERT( textureFont->Error() == 0); + CPPUNIT_ASSERT( glGetError() == GL_NO_ERROR); + } + + void testDisplayList() + { + buildGLContext(); + + FTGLTextureFont* textureFont = new FTGLTextureFont( FONT_FILE); + textureFont->FaceSize(18); + + int glList = glGenLists(1); + glNewList( glList, GL_COMPILE); + + textureFont->Render(GOOD_ASCII_TEST_STRING); + + glEndList(); + + CPPUNIT_ASSERT( glGetError() == GL_NO_ERROR); + } + + void setUp() + {} + + void tearDown() + {} + + private: +}; + +CPPUNIT_TEST_SUITE_REGISTRATION( FTGLTextureFontTest); + diff --git a/src/WinLibs/FTGL/test/FTGlyph-Test.cpp b/src/WinLibs/FTGL/test/FTGlyph-Test.cpp new file mode 100644 index 000000000..a8d936456 --- /dev/null +++ b/src/WinLibs/FTGL/test/FTGlyph-Test.cpp @@ -0,0 +1,104 @@ +#include +#include +#include +#include + +#include "Fontdefs.h" +#include "FTGlyph.h" + +class TestGlyph : public FTGlyph +{ + public: + TestGlyph( FT_GlyphSlot glyph) + : FTGlyph(glyph) + {} + + const FTPoint& Render( const FTPoint& pen) { return advance;}; +}; + + +class FTGlyphTest : public CppUnit::TestCase +{ + CPPUNIT_TEST_SUITE( FTGlyphTest); + CPPUNIT_TEST( testBadConstructor); + CPPUNIT_TEST( testGoodConstructor); + CPPUNIT_TEST_SUITE_END(); + + public: + FTGlyphTest() : CppUnit::TestCase( "FTGlyph Test") + {} + + FTGlyphTest( const std::string& name) : CppUnit::TestCase(name) {} + + void testBadConstructor() + { + TestGlyph testGlyph(0); + + FTPoint testPoint; + + CPPUNIT_ASSERT( testPoint == testGlyph.Advance()); + + CPPUNIT_ASSERT_DOUBLES_EQUAL( 0, testGlyph.BBox().upperY, 0.01); + + CPPUNIT_ASSERT( testGlyph.Error() == 0); + } + + + void testGoodConstructor() + { + setUpFreetype( CHARACTER_CODE_A); + TestGlyph testGlyph(face->glyph); + + FTPoint testPoint(47.0f, 0.0f, 0.0f); + + CPPUNIT_ASSERT( testPoint == testGlyph.Advance()); + + CPPUNIT_ASSERT_DOUBLES_EQUAL( 51.39, testGlyph.BBox().upperY, 0.01); + + CPPUNIT_ASSERT( testGlyph.Error() == 0); + + tearDownFreetype(); + } + + + void setUp() + {} + + + void tearDown() + {} + + private: + FT_Library library; + FT_Face face; + + void setUpFreetype( unsigned int characterIndex) + { + FT_Error error = FT_Init_FreeType( &library); + assert(!error); + error = FT_New_Face( library, ARIAL_FONT_FILE, 0, &face); + assert(!error); + + loadGlyph( characterIndex); + } + + void loadGlyph( unsigned int characterIndex) + { + long glyphIndex = FT_Get_Char_Index( face, characterIndex); + + FT_Set_Char_Size( face, 0L, FONT_POINT_SIZE * 64, RESOLUTION, RESOLUTION); + + FT_Error error = FT_Load_Glyph( face, glyphIndex, FT_LOAD_DEFAULT); + assert(!error); + } + + void tearDownFreetype() + { + FT_Done_Face( face); + FT_Done_FreeType( library); + } + +}; + +CPPUNIT_TEST_SUITE_REGISTRATION( FTGlyphTest); + diff --git a/src/WinLibs/FTGL/test/FTGlyphContainer-Test.cpp b/src/WinLibs/FTGL/test/FTGlyphContainer-Test.cpp new file mode 100644 index 000000000..9ade50f66 --- /dev/null +++ b/src/WinLibs/FTGL/test/FTGlyphContainer-Test.cpp @@ -0,0 +1,122 @@ +#include +#include +#include +#include + + +#include "Fontdefs.h" +#include "FTFace.h" +#include "FTGlyph.h" +#include "FTGlyphContainer.h" + + +class TestGlyph : public FTGlyph +{ + public: + TestGlyph() + : FTGlyph(0) + { + advance = FTPoint(50.0f, 0.0f, 0.0f); + } + + virtual const FTPoint& Render( const FTPoint& pen){ return advance;} +}; + + +class FTGlyphContainerTest : public CppUnit::TestCase +{ + CPPUNIT_TEST_SUITE( FTGlyphContainerTest); + CPPUNIT_TEST( testAdd); + CPPUNIT_TEST( testSetCharMap); + CPPUNIT_TEST( testGlyphIndex); + CPPUNIT_TEST( testAdvance); + CPPUNIT_TEST( testRender); + CPPUNIT_TEST_SUITE_END(); + + public: + FTGlyphContainerTest() : CppUnit::TestCase( "FTGlyphContainer Test") + { + face = new FTFace( GOOD_FONT_FILE); + face->Size( 72, 72); + } + + FTGlyphContainerTest( const std::string& name) : CppUnit::TestCase(name) + { + delete face; + } + + void testAdd() + { + TestGlyph* glyph = new TestGlyph(); + CPPUNIT_ASSERT( glyphContainer->Glyph( CHARACTER_CODE_A) == NULL); + + glyphContainer->Add( glyph, CHARACTER_CODE_A); + glyphContainer->Add( NULL, 0); + + CPPUNIT_ASSERT( glyphContainer->Glyph( 0) == NULL); + CPPUNIT_ASSERT( glyphContainer->Glyph( 999) == NULL); + CPPUNIT_ASSERT( glyphContainer->Glyph( CHARACTER_CODE_A) == glyph); + } + + + void testSetCharMap() + { + CPPUNIT_ASSERT( glyphContainer->CharMap( ft_encoding_unicode)); + CPPUNIT_ASSERT( glyphContainer->Error() == 0); + + CPPUNIT_ASSERT( !glyphContainer->CharMap( ft_encoding_johab)); + CPPUNIT_ASSERT( glyphContainer->Error() == 0x06); // invalid argument + } + + + void testGlyphIndex() + { + CPPUNIT_ASSERT( glyphContainer->FontIndex( CHARACTER_CODE_A) == FONT_INDEX_OF_A); + CPPUNIT_ASSERT( glyphContainer->FontIndex( BIG_CHARACTER_CODE) == BIG_FONT_INDEX); + } + + + void testAdvance() + { + TestGlyph* glyph = new TestGlyph(); + + glyphContainer->Add( glyph, CHARACTER_CODE_A); + float advance = glyphContainer->Advance( CHARACTER_CODE_A, 0); + + CPPUNIT_ASSERT_DOUBLES_EQUAL( 50, advance, 0.01); + } + + + void testRender() + { + TestGlyph* glyph = new TestGlyph(); + + glyphContainer->Add( glyph, 'A'); + + FTPoint pen; + + float advance = glyphContainer->Render( 'A', 0, pen).X(); + + CPPUNIT_ASSERT_DOUBLES_EQUAL( 50, advance, 0.01); + } + + + void setUp() + { + glyphContainer = new FTGlyphContainer( face); + } + + + void tearDown() + { + delete glyphContainer; + } + + private: + FTFace* face; + FTGlyphContainer* glyphContainer; + +}; + +CPPUNIT_TEST_SUITE_REGISTRATION( FTGlyphContainerTest); + diff --git a/src/WinLibs/FTGL/test/FTLibrary-Test.cpp b/src/WinLibs/FTGL/test/FTLibrary-Test.cpp new file mode 100644 index 000000000..28a978c4d --- /dev/null +++ b/src/WinLibs/FTGL/test/FTLibrary-Test.cpp @@ -0,0 +1,51 @@ +#include +#include +#include +#include + +#include "FTLibrary.h" + +class FTLibraryTest : public CppUnit::TestCase +{ + CPPUNIT_TEST_SUITE( FTLibraryTest); + CPPUNIT_TEST( testConstructor); + CPPUNIT_TEST( testError); + CPPUNIT_TEST_SUITE_END(); + + public: + FTLibraryTest() : CppUnit::TestCase( "FTLibrary Test") + {} + + FTLibraryTest( const std::string& name) : CppUnit::TestCase(name) {} + + void testConstructor() + { + const FTLibrary& libraryOne = FTLibrary::Instance(); + const FTLibrary& libraryTwo = FTLibrary::Instance(); + + CPPUNIT_ASSERT( &libraryOne == &libraryTwo); + CPPUNIT_ASSERT( &libraryOne == &FTLibrary::Instance()); + } + + + void testError() + { + const FTLibrary& library = FTLibrary::Instance(); + + CPPUNIT_ASSERT( library.Error() == 0); + } + + + void setUp() + {} + + + void tearDown() + {} + + private: + +}; + +CPPUNIT_TEST_SUITE_REGISTRATION( FTLibraryTest); + diff --git a/src/WinLibs/FTGL/test/FTList-Test.cpp b/src/WinLibs/FTGL/test/FTList-Test.cpp new file mode 100644 index 000000000..7d3011879 --- /dev/null +++ b/src/WinLibs/FTGL/test/FTList-Test.cpp @@ -0,0 +1,81 @@ +#include +#include +#include +#include + +#include "FTList.h" + + +class FTListTest : public CppUnit::TestCase +{ + CPPUNIT_TEST_SUITE( FTListTest); + CPPUNIT_TEST( testConstructor); + CPPUNIT_TEST( testPushBack); + CPPUNIT_TEST( testGetBack); + CPPUNIT_TEST( testGetFront); + CPPUNIT_TEST_SUITE_END(); + + public: + FTListTest() : CppUnit::TestCase( "FTList Test") + {} + + FTListTest( const std::string& name) : CppUnit::TestCase(name) {} + + void testConstructor() + { + FTList listOfFloats; + + CPPUNIT_ASSERT( listOfFloats.size() == 0); + } + + + void testPushBack() + { + FTList listOfFloats; + + CPPUNIT_ASSERT( listOfFloats.size() == 0); + + listOfFloats.push_back( 0.1); + listOfFloats.push_back( 1.2); + listOfFloats.push_back( 2.3); + + CPPUNIT_ASSERT( listOfFloats.size() == 3); + } + + + void testGetBack() + { + FTList listOfIntegers; + + listOfIntegers.push_back( 0); + listOfIntegers.push_back( 1); + listOfIntegers.push_back( 2); + + CPPUNIT_ASSERT( listOfIntegers.back() == 2); + } + + + void testGetFront() + { + FTList listOfChars; + + listOfChars.push_back( 'a'); + listOfChars.push_back( 'b'); + listOfChars.push_back( 'c'); + + CPPUNIT_ASSERT( listOfChars.front() == 'a'); + } + + + void setUp() + {} + + + void tearDown() + {} + + private: +}; + +CPPUNIT_TEST_SUITE_REGISTRATION( FTListTest); + diff --git a/src/WinLibs/FTGL/test/FTMesh-Test.cpp b/src/WinLibs/FTGL/test/FTMesh-Test.cpp new file mode 100644 index 000000000..1cd2a2dc4 --- /dev/null +++ b/src/WinLibs/FTGL/test/FTMesh-Test.cpp @@ -0,0 +1,142 @@ +#include +#include +#include +#include + +#include "FTVectoriser.h" + + +void CALLBACK ftglError( GLenum errCode, FTMesh* mesh); +void CALLBACK ftglVertex( void* data, FTMesh* mesh); +void CALLBACK ftglBegin( GLenum type, FTMesh* mesh); +void CALLBACK ftglEnd( FTMesh* mesh); +void CALLBACK ftglCombine( FTGL_DOUBLE coords[3], void* vertex_data[4], GLfloat weight[4], void** outData, FTMesh* mesh); + + +static float POINT_DATA[] = +{ + 10, 3, 0.7, + -53, 2000, 23, + 77, -2.4, 765, + 117.5, 0.02, -99, + 10, 3, -0.87, + 117.5, 0.02, 34.76, + 0.27, 44.4, 3000, + 10, 3, 0 +}; + +class FTMeshTest : public CppUnit::TestCase +{ + CPPUNIT_TEST_SUITE( FTMeshTest); + CPPUNIT_TEST( testGetTesselation); + CPPUNIT_TEST( testAddPoint); + CPPUNIT_TEST( testTooManyPoints); + CPPUNIT_TEST_SUITE_END(); + + public: + FTMeshTest() : CppUnit::TestCase( "FTMesh Test") + {} + + FTMeshTest( const std::string& name) : CppUnit::TestCase(name) + {} + + void testGetTesselation() + { + FTMesh mesh; + + CPPUNIT_ASSERT( mesh.Tesselation(0) == NULL); + + ftglBegin( GL_TRIANGLES, &mesh); + ftglVertex( &POINT_DATA[0], &mesh); + ftglVertex( &POINT_DATA[3], &mesh); + ftglVertex( &POINT_DATA[6], &mesh); + ftglVertex( &POINT_DATA[9], &mesh); + ftglEnd( &mesh); + + CPPUNIT_ASSERT( mesh.Tesselation(0)); + CPPUNIT_ASSERT( mesh.Tesselation(10) == NULL); + } + + + void testAddPoint() + { + FTGL_DOUBLE testPoint[3] = { 1, 2, 3}; + FTGL_DOUBLE* hole[] = { 0, 0, 0, 0}; + + FTMesh mesh; + CPPUNIT_ASSERT( mesh.TesselationCount() == 0); + + ftglBegin( GL_TRIANGLES, &mesh); + ftglVertex( &POINT_DATA[0], &mesh); + ftglVertex( &POINT_DATA[3], &mesh); + ftglVertex( &POINT_DATA[6], &mesh); + ftglVertex( &POINT_DATA[9], &mesh); + ftglEnd( &mesh); + + CPPUNIT_ASSERT( mesh.TesselationCount() == 1); + CPPUNIT_ASSERT( mesh.Tesselation(0)->PolygonType() == GL_TRIANGLES); + CPPUNIT_ASSERT( mesh.Tesselation(0)->PointCount() == 4); + CPPUNIT_ASSERT( mesh.Error() == 0); + + ftglBegin( GL_QUADS, &mesh); + ftglVertex( &POINT_DATA[12], &mesh); + ftglVertex( &POINT_DATA[15], &mesh); + ftglError( 2, &mesh); + ftglVertex( &POINT_DATA[18], &mesh); + ftglCombine( testPoint, NULL, NULL, (void**)hole, &mesh); + ftglVertex( &POINT_DATA[21], &mesh); + ftglError( 3, &mesh); + ftglEnd( &mesh); + + CPPUNIT_ASSERT( mesh.TesselationCount() == 2); + CPPUNIT_ASSERT( mesh.Tesselation(0)->PointCount() == 4); + CPPUNIT_ASSERT( mesh.Tesselation(1)->PolygonType() == GL_QUADS); + CPPUNIT_ASSERT( mesh.Tesselation(1)->PointCount() == 4); + CPPUNIT_ASSERT( mesh.Error() == 3); + + CPPUNIT_ASSERT( mesh.TesselationCount() == 2); + } + + + void testTooManyPoints() + { + FTGL_DOUBLE testPoint[3] = { 1, 2, 3}; + + FTGL_DOUBLE* testOutput[] = { 0, 0, 0, 0}; + FTGL_DOUBLE* hole[] = { 0, 0, 0, 0}; + + FTMesh mesh; + unsigned int x; + + ftglBegin( GL_TRIANGLES, &mesh); + ftglCombine( testPoint, NULL, NULL, (void**)testOutput, &mesh); + + for( x = 0; x < 200; ++x) + { + ftglCombine( testPoint, NULL, NULL, (void**)hole, &mesh); + } + + CPPUNIT_ASSERT( *testOutput == static_cast(mesh.TempPointList().front())); + + for( x = 201; x < 300; ++x) + { + ftglCombine( testPoint, NULL, NULL, (void**)hole, &mesh); + } + + ftglEnd( &mesh); + + CPPUNIT_ASSERT( *testOutput == static_cast(mesh.TempPointList().front())); + } + + void setUp() + {} + + + void tearDown() + {} + + private: +}; + +CPPUNIT_TEST_SUITE_REGISTRATION( FTMeshTest); + diff --git a/src/WinLibs/FTGL/test/FTOutlineGlyph-Test.cpp b/src/WinLibs/FTGL/test/FTOutlineGlyph-Test.cpp new file mode 100644 index 000000000..d65219645 --- /dev/null +++ b/src/WinLibs/FTGL/test/FTOutlineGlyph-Test.cpp @@ -0,0 +1,89 @@ +#include +#include +#include +#include +#include + +#include "Fontdefs.h" +#include "FTOutlineGlyph.h" + +extern void buildGLContext(); + +class FTOutlineGlyphTest : public CppUnit::TestCase +{ + CPPUNIT_TEST_SUITE( FTOutlineGlyphTest); + CPPUNIT_TEST( testConstructor); + CPPUNIT_TEST( testRender); + CPPUNIT_TEST_SUITE_END(); + + public: + FTOutlineGlyphTest() : CppUnit::TestCase( "FTOutlineGlyph Test") + { + } + + FTOutlineGlyphTest( const std::string& name) : CppUnit::TestCase(name) {} + + ~FTOutlineGlyphTest() + { + } + + void testConstructor() + { + setUpFreetype(); + + buildGLContext(); + + FTOutlineGlyph* outlineGlyph = new FTOutlineGlyph( face->glyph, true); + CPPUNIT_ASSERT( outlineGlyph->Error() == 0); + CPPUNIT_ASSERT( glGetError() == GL_NO_ERROR); + + tearDownFreetype(); + } + + void testRender() + { + setUpFreetype(); + + buildGLContext(); + + FTOutlineGlyph* outlineGlyph = new FTOutlineGlyph( face->glyph, true); + outlineGlyph->Render(FTPoint( 0, 0, 0)); + CPPUNIT_ASSERT( outlineGlyph->Error() == 0); + CPPUNIT_ASSERT( glGetError() == GL_NO_ERROR); + + tearDownFreetype(); + } + + void setUp() + {} + + void tearDown() + {} + + private: + FT_Library library; + FT_Face face; + + void setUpFreetype() + { + FT_Error error = FT_Init_FreeType( &library); + assert(!error); + error = FT_New_Face( library, FONT_FILE, 0, &face); + assert(!error); + + FT_Set_Char_Size( face, 0L, FONT_POINT_SIZE * 64, RESOLUTION, RESOLUTION); + + error = FT_Load_Char( face, CHARACTER_CODE_A, FT_LOAD_DEFAULT); + assert( !error); + } + + void tearDownFreetype() + { + FT_Done_Face( face); + FT_Done_FreeType( library); + } + +}; + +CPPUNIT_TEST_SUITE_REGISTRATION( FTOutlineGlyphTest); + diff --git a/src/WinLibs/FTGL/test/FTPixmapGlyph-Test.cpp b/src/WinLibs/FTGL/test/FTPixmapGlyph-Test.cpp new file mode 100644 index 000000000..e0a92b05b --- /dev/null +++ b/src/WinLibs/FTGL/test/FTPixmapGlyph-Test.cpp @@ -0,0 +1,97 @@ +#include + +#include +#include +#include +#include +#include + +#include "Fontdefs.h" +#include "FTPixmapGlyph.h" + +#define GL_ASSERT() {GLenum sci_err; while ((sci_err = glGetError()) != GL_NO_ERROR) \ + std::cerr << "OpenGL error: " << (char *)gluErrorString(sci_err) << " at " << __FILE__ <<":" << __LINE__ << std::endl;} + + +extern void buildGLContext(); + +class FTPixmapGlyphTest : public CppUnit::TestCase +{ + CPPUNIT_TEST_SUITE( FTPixmapGlyphTest); + CPPUNIT_TEST( testConstructor); + CPPUNIT_TEST( testRender); + CPPUNIT_TEST_SUITE_END(); + + public: + FTPixmapGlyphTest() : CppUnit::TestCase( "FTPixmapGlyph Test") + { + } + + FTPixmapGlyphTest( const std::string& name) : CppUnit::TestCase(name) {} + + ~FTPixmapGlyphTest() + { + } + + void testConstructor() + { + setUpFreetype(); + + buildGLContext(); + + FTPixmapGlyph* PixmapGlyph = new FTPixmapGlyph( face->glyph); + CPPUNIT_ASSERT( PixmapGlyph->Error() == 0); + + CPPUNIT_ASSERT( glGetError() == GL_NO_ERROR); + + tearDownFreetype(); + } + + void testRender() + { + setUpFreetype(); + + buildGLContext(); + + FTPixmapGlyph* pixmapGlyph = new FTPixmapGlyph( face->glyph); + CPPUNIT_ASSERT( pixmapGlyph->Error() == 0); + pixmapGlyph->Render(FTPoint( 0, 0, 0)); + + CPPUNIT_ASSERT( glGetError() == GL_NO_ERROR); + + tearDownFreetype(); + } + + void setUp() + {} + + void tearDown() + {} + + private: + FT_Library library; + FT_Face face; + + void setUpFreetype() + { + FT_Error error = FT_Init_FreeType( &library); + assert(!error); + error = FT_New_Face( library, FONT_FILE, 0, &face); + assert(!error); + + FT_Set_Char_Size( face, 0L, FONT_POINT_SIZE * 64, RESOLUTION, RESOLUTION); + + error = FT_Load_Char( face, CHARACTER_CODE_A, FT_LOAD_DEFAULT); + assert( !error); + } + + void tearDownFreetype() + { + FT_Done_Face( face); + FT_Done_FreeType( library); + } + +}; + +CPPUNIT_TEST_SUITE_REGISTRATION( FTPixmapGlyphTest); + diff --git a/src/WinLibs/FTGL/test/FTPoint-Test.cpp b/src/WinLibs/FTGL/test/FTPoint-Test.cpp new file mode 100644 index 000000000..7535c6659 --- /dev/null +++ b/src/WinLibs/FTGL/test/FTPoint-Test.cpp @@ -0,0 +1,162 @@ +#include +#include +#include +#include + +#include "FTPoint.h" + + +class FTPointTest : public CppUnit::TestCase +{ + CPPUNIT_TEST_SUITE( FTPointTest); + CPPUNIT_TEST( testConstructor); + CPPUNIT_TEST( testOperatorEqual); + CPPUNIT_TEST( testOperatorPlus); + CPPUNIT_TEST( testOperatorMultiply); + CPPUNIT_TEST( testOperatorNotEqual); + CPPUNIT_TEST( testOperatorPlusEquals); + CPPUNIT_TEST( testOperatorDouble); + CPPUNIT_TEST( testSetters); + CPPUNIT_TEST( testGetters); + CPPUNIT_TEST_SUITE_END(); + + public: + FTPointTest() : CppUnit::TestCase( "FTPoint Test") + {} + + FTPointTest( const std::string& name) : CppUnit::TestCase(name) {} + + void testConstructor() + { + FTPoint point1; + + CPPUNIT_ASSERT( point1.X() == 0.0f); + CPPUNIT_ASSERT( point1.Y() == 0.0f); + CPPUNIT_ASSERT( point1.Z() == 0.0f); + + FTPoint point2( 1.0f, 2.0f, 3.0f); + + CPPUNIT_ASSERT( point2.X() == 1.0f); + CPPUNIT_ASSERT( point2.Y() == 2.0f); + CPPUNIT_ASSERT( point2.Z() == 3.0f); + + FT_Vector ftVector; + ftVector.x = 4; + ftVector.y = 23; + + FTPoint point3( ftVector); + + CPPUNIT_ASSERT( point3.X() == 4.0f); + CPPUNIT_ASSERT( point3.Y() == 23.0f); + CPPUNIT_ASSERT( point3.Z() == 0.0f); + } + + + void testOperatorEqual() + { + FTPoint point1( 1.0f, 2.0f, 3.0f); + FTPoint point2( 1.0f, 2.0f, 3.0f); + FTPoint point3( -1.0f, 2.3f, 23.0f); + + CPPUNIT_ASSERT( point1 == point1); + CPPUNIT_ASSERT( point1 == point2); + CPPUNIT_ASSERT( !(point1 == point3)); + } + + + void testOperatorNotEqual() + { + FTPoint point1( 1.0f, 2.0f, 3.0f); + FTPoint point2( 1.0f, 2.0f, 3.0f); + FTPoint point3( -1.0f, 2.3f, 23.0f); + + CPPUNIT_ASSERT( !(point1 != point1)); + CPPUNIT_ASSERT( !(point1 != point2)); + CPPUNIT_ASSERT( point1 != point3); + } + + + void testOperatorPlus() + { + FTPoint point1( 1.0f, 2.0f, 3.0f); + FTPoint point2( 1.0f, 2.0f, 3.0f); + + FTPoint point3( 2.0f, 4.0f, 6.0f); + FTPoint point4 = point1 + point2; + + CPPUNIT_ASSERT( point4 == point3); + } + + + void testOperatorMultiply() + { + FTPoint point1( 1.0f, 2.0f, 3.0f); + FTPoint point2( 1.0f, 2.0f, 3.0f); + + FTPoint point3( 2.0f, 4.0f, 6.0f); + FTPoint point4 = point1 * 2.0; + + CPPUNIT_ASSERT( point4 == point3); + + point4 = 2.0 * point2; + + CPPUNIT_ASSERT( point4 == point3); + } + + + void testOperatorPlusEquals() + { + FTPoint point1( 1.0f, 2.0f, 3.0f); + FTPoint point2( -2.0f, 21.0f, 0.0f); + FTPoint point3( -1.0f, 23.0f, 3.0f); + + point1 += point2; + + CPPUNIT_ASSERT( point1 == point3); + } + + + void testOperatorDouble() + { + FTPoint point1( 1.0f, 2.0f, 3.0f); + + const double* pointer = static_cast(point1); + CPPUNIT_ASSERT(pointer[0] == 1.0f); + CPPUNIT_ASSERT(pointer[1] == 2.0f); + CPPUNIT_ASSERT(pointer[2] == 3.0f); + } + + void testSetters() + { + FTPoint point; + FTPoint point1( 1, 2, 3); + + point.X(1); + point.Y(2); + point.Z(3); + + CPPUNIT_ASSERT(point == point1); + } + + void testGetters() + { + FTPoint point( 1.0f, 2.0f, 3.0f); + + CPPUNIT_ASSERT(point.X() == 1.0); + CPPUNIT_ASSERT(point.Y() == 2.0); + CPPUNIT_ASSERT(point.Z() == 3.0); + } + + + void setUp() + {} + + + void tearDown() + {} + + private: +}; + +CPPUNIT_TEST_SUITE_REGISTRATION( FTPointTest); + diff --git a/src/WinLibs/FTGL/test/FTPolyGlyph-Test.cpp b/src/WinLibs/FTGL/test/FTPolyGlyph-Test.cpp new file mode 100644 index 000000000..0993ec817 --- /dev/null +++ b/src/WinLibs/FTGL/test/FTPolyGlyph-Test.cpp @@ -0,0 +1,91 @@ +#include +#include +#include +#include +#include + +#include "Fontdefs.h" +#include "FTPolyGlyph.h" + +extern void buildGLContext(); + +class FTPolyGlyphTest : public CppUnit::TestCase +{ + CPPUNIT_TEST_SUITE( FTPolyGlyphTest); + CPPUNIT_TEST( testConstructor); + CPPUNIT_TEST( testRender); + CPPUNIT_TEST_SUITE_END(); + + public: + FTPolyGlyphTest() : CppUnit::TestCase( "FTPolyGlyph Test") + { + } + + FTPolyGlyphTest( const std::string& name) : CppUnit::TestCase(name) {} + + ~FTPolyGlyphTest() + { + } + + void testConstructor() + { + setUpFreetype(); + + buildGLContext(); + + FTPolyGlyph* polyGlyph = new FTPolyGlyph( face->glyph, true); + CPPUNIT_ASSERT( polyGlyph->Error() == 0); + + CPPUNIT_ASSERT( glGetError() == GL_NO_ERROR); + + tearDownFreetype(); + } + + void testRender() + { + setUpFreetype(); + + buildGLContext(); + + FTPolyGlyph* polyGlyph = new FTPolyGlyph( face->glyph, true); + polyGlyph->Render(FTPoint( 0, 0, 0)); + CPPUNIT_ASSERT( polyGlyph->Error() == 0); + + CPPUNIT_ASSERT( glGetError() == GL_NO_ERROR); + + tearDownFreetype(); + } + + void setUp() + {} + + void tearDown() + {} + + private: + FT_Library library; + FT_Face face; + + void setUpFreetype() + { + FT_Error error = FT_Init_FreeType( &library); + assert(!error); + error = FT_New_Face( library, FONT_FILE, 0, &face); + assert(!error); + + FT_Set_Char_Size( face, 0L, FONT_POINT_SIZE * 64, RESOLUTION, RESOLUTION); + + error = FT_Load_Char( face, CHARACTER_CODE_A, FT_LOAD_DEFAULT); + assert( !error); + } + + void tearDownFreetype() + { + FT_Done_Face( face); + FT_Done_FreeType( library); + } + +}; + +CPPUNIT_TEST_SUITE_REGISTRATION( FTPolyGlyphTest); + diff --git a/src/WinLibs/FTGL/test/FTSize-Test.cpp b/src/WinLibs/FTGL/test/FTSize-Test.cpp new file mode 100644 index 000000000..f203783e6 --- /dev/null +++ b/src/WinLibs/FTGL/test/FTSize-Test.cpp @@ -0,0 +1,94 @@ +#include +#include +#include +#include +#include + +#include +#include FT_FREETYPE_H +#include FT_GLYPH_H + +#include "Fontdefs.h" +#include "FTSize.h" + + +class FTSizeTest : public CppUnit::TestCase +{ + CPPUNIT_TEST_SUITE( FTSizeTest); + CPPUNIT_TEST( testConstructor); + CPPUNIT_TEST( testSetCharSize); + CPPUNIT_TEST_SUITE_END(); + + public: + FTSizeTest() : CppUnit::TestCase( "FTSize Test") + {} + + FTSizeTest( const std::string& name) : CppUnit::TestCase(name) {} + + void testConstructor() + { + FTSize size; + + CPPUNIT_ASSERT_DOUBLES_EQUAL( 0, size.CharSize(), 0.01); + CPPUNIT_ASSERT_DOUBLES_EQUAL( 0, size.Ascender(), 0.01); + CPPUNIT_ASSERT_DOUBLES_EQUAL( 0, size.Descender(), 0.01); + + CPPUNIT_ASSERT_DOUBLES_EQUAL( 0, size.Height(), 0.01); + CPPUNIT_ASSERT_DOUBLES_EQUAL( 0, size.Width(), 0.01); + + CPPUNIT_ASSERT_DOUBLES_EQUAL( 0, size.Underline(), 0.01); + + } + + + void testSetCharSize() + { + setUpFreetype(); + + FTSize size; + + CPPUNIT_ASSERT( size.CharSize( &face, FONT_POINT_SIZE, RESOLUTION, RESOLUTION)); + CPPUNIT_ASSERT( size.Error() == 0); + + CPPUNIT_ASSERT_DOUBLES_EQUAL( 72, size.CharSize(), 0.01); + CPPUNIT_ASSERT_DOUBLES_EQUAL( 52, size.Ascender(), 0.01); + CPPUNIT_ASSERT_DOUBLES_EQUAL( -15, size.Descender(), 0.01); + + CPPUNIT_ASSERT_DOUBLES_EQUAL( 81.86, size.Height(), 0.01); + CPPUNIT_ASSERT_DOUBLES_EQUAL( 76.32, size.Width(), 0.01); + + CPPUNIT_ASSERT_DOUBLES_EQUAL( 0, size.Underline(), 0.01); + + tearDownFreetype(); + } + + + void setUp() + {} + + + void tearDown() + {} + + private: + FT_Library library; + FT_Face face; + + void setUpFreetype() + { + FT_Error error = FT_Init_FreeType( &library); + assert(!error); + error = FT_New_Face( library, GOOD_FONT_FILE, 0, &face); + assert(!error); + } + + void tearDownFreetype() + { + FT_Done_Face( face); + FT_Done_FreeType( library); + } + +}; + +CPPUNIT_TEST_SUITE_REGISTRATION( FTSizeTest); + diff --git a/src/WinLibs/FTGL/test/FTTesselation-Test.cpp b/src/WinLibs/FTGL/test/FTTesselation-Test.cpp new file mode 100644 index 000000000..441c6b8f4 --- /dev/null +++ b/src/WinLibs/FTGL/test/FTTesselation-Test.cpp @@ -0,0 +1,73 @@ +#include +#include +#include +#include + +#include "FTVectoriser.h" + + +class FTTesselationTest : public CppUnit::TestCase +{ + CPPUNIT_TEST_SUITE( FTTesselationTest); + CPPUNIT_TEST( testAddPoint); + CPPUNIT_TEST( testGetPoint); + CPPUNIT_TEST_SUITE_END(); + + public: + FTTesselationTest() : CppUnit::TestCase( "FTTesselation Test") + {} + + FTTesselationTest( const std::string& name) : CppUnit::TestCase(name) + {} + + void testAddPoint() + { + FTTesselation tesselation( 1); + + CPPUNIT_ASSERT( tesselation.PointCount() == 0); + + tesselation.AddPoint( 10, 3, 0.7); + tesselation.AddPoint( -53, 2000, 23); + tesselation.AddPoint( 77, -2.4, 765); + tesselation.AddPoint( 117.5, 0.02, -99); + + CPPUNIT_ASSERT( tesselation.PointCount() == 4); + + tesselation.AddPoint( 10, 3, -0.87); + tesselation.AddPoint( 117.5, 0.02, 34.76); + tesselation.AddPoint( 0.27, 44.4, 3000); + tesselation.AddPoint( 10, 3, 0); + + CPPUNIT_ASSERT( tesselation.PointCount() == 8); + } + + + void testGetPoint() + { + FTTesselation tesselation(1); + + CPPUNIT_ASSERT( tesselation.PointCount() == 0); + + tesselation.AddPoint( 10, 3, 0.7); + tesselation.AddPoint( -53, 2000, 23); + tesselation.AddPoint( 77, -2.4, 765); + tesselation.AddPoint( 117.5, 0.02, -99); + + CPPUNIT_ASSERT( tesselation.PointCount() == 4); + CPPUNIT_ASSERT( tesselation.Point(2) == FTPoint( 77, -2.4, 765)); + CPPUNIT_ASSERT( tesselation.Point(20) != FTPoint( 77, -2.4, 765)); + } + + + void setUp() + {} + + + void tearDown() + {} + + private: +}; + +CPPUNIT_TEST_SUITE_REGISTRATION( FTTesselationTest); + diff --git a/src/WinLibs/FTGL/test/FTTextureGlyph-Test.cpp b/src/WinLibs/FTGL/test/FTTextureGlyph-Test.cpp new file mode 100644 index 000000000..5b319a27f --- /dev/null +++ b/src/WinLibs/FTGL/test/FTTextureGlyph-Test.cpp @@ -0,0 +1,117 @@ +#include +#include +#include +#include +#include + +#include "Fontdefs.h" +#include "FTTextureGlyph.h" + +extern void buildGLContext(); + +class FTTextureGlyphTest : public CppUnit::TestCase +{ + CPPUNIT_TEST_SUITE( FTTextureGlyphTest); + CPPUNIT_TEST( testConstructor); + CPPUNIT_TEST( testRender); + CPPUNIT_TEST_SUITE_END(); + + public: + FTTextureGlyphTest() : CppUnit::TestCase( "FTTextureGlyph Test") + { + } + + FTTextureGlyphTest( const std::string& name) : CppUnit::TestCase(name) {} + + ~FTTextureGlyphTest() + { + } + + void testConstructor() + { + setUpFreetype(); + + buildGLContext(); + + GLuint textureID; + glGenTextures(1, &textureID); + + char* texture[64*64]; + + glBindTexture( GL_TEXTURE_2D, textureID); + glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); + glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); + glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + + glTexImage2D( GL_TEXTURE_2D, 0, GL_ALPHA, 64, 64, 0, GL_ALPHA, GL_UNSIGNED_BYTE, texture); + + FTTextureGlyph* textureGlyph = new FTTextureGlyph( face->glyph, textureID, 0, 0, 64, 64); + + CPPUNIT_ASSERT( textureGlyph->Error() == 0); + CPPUNIT_ASSERT( glGetError() == GL_NO_ERROR); + + tearDownFreetype(); + } + + void testRender() + { + setUpFreetype(); + + buildGLContext(); + + GLuint textureID; + glGenTextures(1, &textureID); + + char* texture[64*64]; + + glBindTexture( GL_TEXTURE_2D, textureID); + glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); + glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); + glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + + glTexImage2D( GL_TEXTURE_2D, 0, GL_ALPHA, 64, 64, 0, GL_ALPHA, GL_UNSIGNED_BYTE, texture); + + FTTextureGlyph* textureGlyph = new FTTextureGlyph( face->glyph, textureID, 0, 0, 64, 64); + textureGlyph->Render(FTPoint( 0, 0, 0)); + CPPUNIT_ASSERT( textureGlyph->Error() == 0); + + CPPUNIT_ASSERT( glGetError() == GL_NO_ERROR); + + tearDownFreetype(); + } + + void setUp() + {} + + void tearDown() + {} + + private: + FT_Library library; + FT_Face face; + + void setUpFreetype() + { + FT_Error error = FT_Init_FreeType( &library); + assert(!error); + error = FT_New_Face( library, FONT_FILE, 0, &face); + assert(!error); + + FT_Set_Char_Size( face, 0L, FONT_POINT_SIZE * 64, RESOLUTION, RESOLUTION); + + error = FT_Load_Char( face, CHARACTER_CODE_A, FT_LOAD_DEFAULT); + assert( !error); + } + + void tearDownFreetype() + { + FT_Done_Face( face); + FT_Done_FreeType( library); + } + +}; + +CPPUNIT_TEST_SUITE_REGISTRATION( FTTextureGlyphTest); + diff --git a/src/WinLibs/FTGL/test/FTVector-Test.cpp b/src/WinLibs/FTGL/test/FTVector-Test.cpp new file mode 100644 index 000000000..4a1aa5e88 --- /dev/null +++ b/src/WinLibs/FTGL/test/FTVector-Test.cpp @@ -0,0 +1,86 @@ +#include +#include +#include +#include + +#include "FTVector.h" + + +class FTVectorTest : public CppUnit::TestCase +{ + CPPUNIT_TEST_SUITE( FTVectorTest); + CPPUNIT_TEST( testConstructor); + CPPUNIT_TEST( testReserve); + CPPUNIT_TEST( testPushBack); + CPPUNIT_TEST( testOperatorSquareBrackets); + CPPUNIT_TEST_SUITE_END(); + + public: + FTVectorTest() : CppUnit::TestCase( "FTVector Test") + {} + + FTVectorTest( const std::string& name) : CppUnit::TestCase(name) {} + + void testConstructor() + { + FTVector floatVector; + + CPPUNIT_ASSERT( floatVector.size() == 0); + CPPUNIT_ASSERT( floatVector.empty()); + CPPUNIT_ASSERT( floatVector.capacity() == 0); + } + + + void testReserve() + { + FTVector floatVector; + + floatVector.reserve(128); + CPPUNIT_ASSERT( floatVector.capacity() == 256); + CPPUNIT_ASSERT( floatVector.empty()); + CPPUNIT_ASSERT( floatVector.size() == 0); + } + + + void testPushBack() + { + FTVector integerVector; + + CPPUNIT_ASSERT( integerVector.size() == 0); + + integerVector.push_back(0); + integerVector.push_back(1); + integerVector.push_back(2); + integerVector.push_back(3); + + CPPUNIT_ASSERT( !integerVector.empty()); + CPPUNIT_ASSERT( integerVector.size() == 4); + } + + + void testOperatorSquareBrackets() + { + FTVector integerVector; + + integerVector.push_back(1); + integerVector.push_back(2); + integerVector.push_back(4); + integerVector.push_back(8); + + CPPUNIT_ASSERT( integerVector[0] == 1); + CPPUNIT_ASSERT( integerVector[2] == 4); + } + + + void setUp() + {} + + + void tearDown() + {} + + private: +}; + +CPPUNIT_TEST_SUITE_REGISTRATION( FTVectorTest); + diff --git a/src/WinLibs/FTGL/test/FTVectoriser-Test.cpp b/src/WinLibs/FTGL/test/FTVectoriser-Test.cpp new file mode 100644 index 000000000..af5495b62 --- /dev/null +++ b/src/WinLibs/FTGL/test/FTVectoriser-Test.cpp @@ -0,0 +1,465 @@ +#include +#include +#include +#include +#include + +#include "Fontdefs.h" +#include "FTVectoriser.h" + + +static double testOutline[] = +{ + 28, 0, 0.0, + 28, 4.53125, 0.0, + 26.4756, 2.54, 0.0, + 24.69, 0.99125, 0.0, + 22.6431, -0.115, 0.0, + 20.335, -0.77875, 0.0, + 17.7656, -1, 0.0, + 16.0434, -0.901563, 0.0, + 14.3769, -0.60625, 0.0, + 12.7659, -0.114062, 0.0, + 11.2106, 0.575, 0.0, + 9.71094, 1.46094, 0.0, + 8.30562, 2.52344, 0.0, + 7.03344, 3.74219, 0.0, + 5.89437, 5.11719, 0.0, + 4.88844, 6.64844, 0.0, + 4.01562, 8.33594, 0.0, + 3.29, 10.1538, 0.0, + 2.72563, 12.0759, 0.0, + 2.3225, 14.1025, 0.0, + 2.08063, 16.2334, 0.0, + 2, 18.4688, 0.0, + 2.07312, 20.6591, 0.0, + 2.2925, 22.7675, 0.0, + 2.65812, 24.7941, 0.0, + 3.17, 26.7388, 0.0, + 3.82812, 28.6016, 0.0, + 4.6325, 30.3381, 0.0, + 5.58313, 31.9041, 0.0, + 6.68, 33.2994, 0.0, + 7.92313, 34.5241, 0.0, + 9.3125, 35.5781, 0.0, + 10.8088, 36.45, 0.0, + 12.3725, 37.1281, 0.0, + 14.0038, 37.6125, 0.0, + 15.7025, 37.9031, 0.0, + 17.4688, 38, 0.0, + 18.7647, 37.9438, 0.0, + 20.0025, 37.775, 0.0, + 21.1822, 37.4938, 0.0, + 22.3038, 37.1, 0.0, + 23.3672, 36.5938, 0.0, + 24.3631, 35.9975, 0.0, + 25.2822, 35.3338, 0.0, + 26.1244, 34.6025, 0.0, + 26.8897, 33.8037, 0.0, + 27.5781, 32.9375, 0.0, + 27.5781, 51, 0.0, + 34, 51, 0.0, + 34, 0, 0.0, + 8.375, 18.4844, 0.0, + 8.49312, 15.7491, 0.0, + 8.8475, 13.3056, 0.0, + 9.43813, 11.1541, 0.0, + 10.265, 9.29437, 0.0, + 11.3281, 7.72656, 0.0, + 12.5519, 6.44688, 0.0, + 13.8606, 5.45156, 0.0, + 15.2544, 4.74062, 0.0, + 16.7331, 4.31406, 0.0, + 18.2969, 4.17188, 0.0, + 19.8669, 4.30781, 0.0, + 21.3394, 4.71563, 0.0, + 22.7144, 5.39531, 0.0, + 23.9919, 6.34688, 0.0, + 25.1719, 7.57031, 0.0, + 26.19, 9.07312, 0.0, + 26.9819, 10.8628, 0.0, + 27.5475, 12.9394, 0.0, + 27.8869, 15.3028, 0.0, + 28, 17.9531, 0.0, + 27.8847, 20.8591, 0.0, + 27.5388, 23.4394, 0.0, + 26.9622, 25.6941, 0.0, + 26.155, 27.6231, 0.0, + 25.1172, 29.2266, 0.0, + 23.9106, 30.5231, 0.0, + 22.5972, 31.5316, 0.0, + 21.1769, 32.2519, 0.0, + 19.6497, 32.6841, 0.0, + 18.0156, 32.8281, 0.0, + 16.4203, 32.69, 0.0, + 14.9344, 32.2756, 0.0, + 13.5578, 31.585, 0.0, + 12.2906, 30.6181, 0.0, + 11.1328, 29.375, 0.0, + 10.14, 27.8344, 0.0, + 9.36781, 25.975, 0.0, + 8.81625, 23.7969, 0.0, + 8.48531, 21.3, 0.0, + 8.375, 18.4844, 0.0 +}; + + +static GLenum testMeshPolygonTypes[] = +{ + GL_TRIANGLE_FAN, + GL_TRIANGLE_STRIP, + GL_TRIANGLE_STRIP, + GL_TRIANGLE_STRIP, + GL_TRIANGLE_STRIP, + GL_TRIANGLE_STRIP, + GL_TRIANGLE_FAN, + GL_TRIANGLE_FAN, + GL_TRIANGLE_FAN, + GL_TRIANGLE_STRIP, + GL_TRIANGLE_STRIP, + GL_TRIANGLE_FAN, + GL_TRIANGLE_STRIP, + GL_TRIANGLES +}; + + +static unsigned int testMeshPointCount[] = +{ + 8, 7, 7, 11, 7, 9, 5, 6, 6, 7, 17, 6, 19, 3, +}; + + +static double testMesh[] = +{ + 28, 4.53125, 0.0, + 28, 0, 0.0, + 34, 0, 0.0, + 28, 17.9531, 0.0, + 27.8869, 15.3028, 0.0, + 27.5475, 12.9394, 0.0, + 26.9819, 10.8628, 0.0, + 26.4756, 2.54, 0.0, + 26.9819, 10.8628, 0.0, + 26.19, 9.07312, 0.0, + 26.4756, 2.54, 0.0, + 25.1719, 7.57031, 0.0, + 24.69, 0.99125, 0.0, + 23.9919, 6.34688, 0.0, + 22.7144, 5.39531, 0.0, + 24.69, 0.99125, 0.0, + 22.7144, 5.39531, 0.0, + 22.6431, -0.115, 0.0, + 21.3394, 4.71563, 0.0, + 20.335, -0.77875, 0.0, + 19.8669, 4.30781, 0.0, + 18.2969, 4.17188, 0.0, + 20.335, -0.77875, 0.0, + 18.2969, 4.17188, 0.0, + 17.7656, -1, 0.0, + 16.7331, 4.31406, 0.0, + 16.0434, -0.901563, 0.0, + 15.2544, 4.74062, 0.0, + 14.3769, -0.60625, 0.0, + 13.8606, 5.45156, 0.0, + 12.7659, -0.114062, 0.0, + 12.5519, 6.44688, 0.0, + 11.3281, 7.72656, 0.0, + 12.7659, -0.114062, 0.0, + 11.3281, 7.72656, 0.0, + 11.2106, 0.575, 0.0, + 10.265, 9.29437, 0.0, + 9.71094, 1.46094, 0.0, + 9.43813, 11.1541, 0.0, + 8.8475, 13.3056, 0.0, + 8.81625, 23.7969, 0.0, + 9.3125, 35.5781, 0.0, + 8.48531, 21.3, 0.0, + 7.92313, 34.5241, 0.0, + 8.375, 18.4844, 0.0, + 8.30562, 2.52344, 0.0, + 8.49312, 15.7491, 0.0, + 9.71094, 1.46094, 0.0, + 8.8475, 13.3056, 0.0, + 34, 51, 0.0, + 27.5781, 51, 0.0, + 27.8847, 20.8591, 0.0, + 28, 17.9531, 0.0, + 34, 0, 0.0, + 27.5781, 32.9375, 0.0, + 26.8897, 33.8037, 0.0, + 26.9622, 25.6941, 0.0, + 27.5388, 23.4394, 0.0, + 27.8847, 20.8591, 0.0, + 27.5781, 51, 0.0, + 26.155, 27.6231, 0.0, + 26.9622, 25.6941, 0.0, + 26.8897, 33.8037, 0.0, + 26.1244, 34.6025, 0.0, + 25.2822, 35.3338, 0.0, + 25.1172, 29.2266, 0.0, + 22.3038, 37.1, 0.0, + 22.5972, 31.5316, 0.0, + 23.3672, 36.5938, 0.0, + 23.9106, 30.5231, 0.0, + 24.3631, 35.9975, 0.0, + 25.1172, 29.2266, 0.0, + 25.2822, 35.3338, 0.0, + 11.1328, 29.375, 0.0, + 12.2906, 30.6181, 0.0, + 12.3725, 37.1281, 0.0, + 13.5578, 31.585, 0.0, + 14.0038, 37.6125, 0.0, + 14.9344, 32.2756, 0.0, + 15.7025, 37.9031, 0.0, + 16.4203, 32.69, 0.0, + 17.4688, 38, 0.0, + 18.0156, 32.8281, 0.0, + 18.7647, 37.9438, 0.0, + 19.6497, 32.6841, 0.0, + 20.0025, 37.775, 0.0, + 21.1769, 32.2519, 0.0, + 21.1822, 37.4938, 0.0, + 22.5972, 31.5316, 0.0, + 22.3038, 37.1, 0.0, + 10.8088, 36.45, 0.0, + 9.3125, 35.5781, 0.0, + 9.36781, 25.975, 0.0, + 10.14, 27.8344, 0.0, + 11.1328, 29.375, 0.0, + 12.3725, 37.1281, 0.0, + 8.30562, 2.52344, 0.0, + 7.92313, 34.5241, 0.0, + 7.03344, 3.74219, 0.0, + 6.68, 33.2994, 0.0, + 5.89437, 5.11719, 0.0, + 5.58313, 31.9041, 0.0, + 4.88844, 6.64844, 0.0, + 4.6325, 30.3381, 0.0, + 4.01562, 8.33594, 0.0, + 3.82812, 28.6016, 0.0, + 3.29, 10.1538, 0.0, + 3.17, 26.7388, 0.0, + 2.72563, 12.0759, 0.0, + 2.65812, 24.7941, 0.0, + 2.3225, 14.1025, 0.0, + 2.2925, 22.7675, 0.0, + 2.08063, 16.2334, 0.0, + 2.07312, 20.6591, 0.0, + 2, 18.4688, 0.0, + 9.3125, 35.5781, 0.0, + 8.81625, 23.7969, 0.0, + 9.36781, 25.975, 0.0 +}; + + +class FTVectoriserTest : public CppUnit::TestCase +{ + CPPUNIT_TEST_SUITE( FTVectoriserTest); + CPPUNIT_TEST( testFreetypeVersion); + CPPUNIT_TEST( testNullGlyphProcess); + CPPUNIT_TEST( testBadGlyphProcess); + CPPUNIT_TEST( testSimpleGlyphProcess); + CPPUNIT_TEST( testComplexGlyphProcess); + CPPUNIT_TEST( testGetContour); + CPPUNIT_TEST( testGetOutline); + CPPUNIT_TEST( testGetMesh); + CPPUNIT_TEST( testMakeMesh); + CPPUNIT_TEST_SUITE_END(); + + public: + FTVectoriserTest() : CppUnit::TestCase( "FTVectoriser Test") + {} + + FTVectoriserTest( const std::string& name) : CppUnit::TestCase(name) + {} + + + void testFreetypeVersion() + { + setUpFreetype( NULL_CHARACTER_INDEX); + + FT_Int major; + FT_Int minor; + FT_Int patch; + + FT_Library_Version( library, &major, &minor, &patch); + + // If you hit these asserts then you have the wrong library version to run the tests. + // You can still run the tests but some will fail because the hinter changed in 2.1.4 + CPPUNIT_ASSERT( major == 2); + CPPUNIT_ASSERT( minor == 1); + CPPUNIT_ASSERT( patch >= 4); + + tearDownFreetype(); + } + + + void testNullGlyphProcess() + { + FTVectoriser vectoriser( NULL); + CPPUNIT_ASSERT( vectoriser.ContourCount() == 0); + } + + + void testBadGlyphProcess() + { + setUpFreetype( NULL_CHARACTER_INDEX); + + FTVectoriser vectoriser( face->glyph); + CPPUNIT_ASSERT( vectoriser.ContourCount() == 0); + + tearDownFreetype(); + } + + + void testSimpleGlyphProcess() + { + setUpFreetype( SIMPLE_CHARACTER_INDEX); + + FTVectoriser vectoriser( face->glyph); + + CPPUNIT_ASSERT( vectoriser.ContourCount() == 2); + CPPUNIT_ASSERT( vectoriser.PointCount() == 8); + + tearDownFreetype(); + } + + + void testComplexGlyphProcess() + { + setUpFreetype( COMPLEX_CHARACTER_INDEX); + + FTVectoriser vectoriser( face->glyph); + + CPPUNIT_ASSERT( vectoriser.ContourCount() == 2); + CPPUNIT_ASSERT( vectoriser.PointCount() == 91); + + tearDownFreetype(); + } + + + void testGetContour() + { + setUpFreetype( SIMPLE_CHARACTER_INDEX); + + FTVectoriser vectoriser( face->glyph); + + CPPUNIT_ASSERT( vectoriser.Contour(1)); + CPPUNIT_ASSERT( vectoriser.Contour(99) == NULL); + + tearDownFreetype(); + } + + + void testGetOutline() + { + setUpFreetype( COMPLEX_CHARACTER_INDEX); + + FTVectoriser vectoriser( face->glyph); + + unsigned int d = 0; + for( size_t c = 0; c < vectoriser.ContourCount(); ++c) + { + const FTContour* contour = vectoriser.Contour(c); + + for( size_t p = 0; p < contour->PointCount(); ++p) + { + CPPUNIT_ASSERT_DOUBLES_EQUAL( *(testOutline + d), contour->Point(p).X() / 64.0f, 0.01); + CPPUNIT_ASSERT_DOUBLES_EQUAL( *(testOutline + d + 1), contour->Point(p).Y() / 64.0f, 0.01); + d += 3; + } + } + + tearDownFreetype(); + } + + + void testGetMesh() + { + setUpFreetype( SIMPLE_CHARACTER_INDEX); + + FTVectoriser vectoriser( face->glyph); + CPPUNIT_ASSERT( vectoriser.GetMesh() == NULL); + + vectoriser.MakeMesh( FTGL_FRONT_FACING); + + CPPUNIT_ASSERT( vectoriser.GetMesh()); + } + + + void testMakeMesh() + { + setUpFreetype( COMPLEX_CHARACTER_INDEX); + + FTVectoriser vectoriser( face->glyph); + + vectoriser.MakeMesh( FTGL_FRONT_FACING); + + int d = 0; + const FTMesh* mesh = vectoriser.GetMesh(); + unsigned int tesselations = mesh->TesselationCount(); + CPPUNIT_ASSERT( tesselations == 14); + + for( unsigned int index = 0; index < tesselations; ++index) + { + const FTTesselation* subMesh = mesh->Tesselation( index); + + unsigned int polyType = subMesh->PolygonType(); + CPPUNIT_ASSERT( testMeshPolygonTypes[index] == polyType); + + unsigned int numberOfVertices = subMesh->PointCount(); + CPPUNIT_ASSERT( testMeshPointCount[index] == numberOfVertices); + + for( unsigned int x = 0; x < numberOfVertices; ++x) + { + CPPUNIT_ASSERT_DOUBLES_EQUAL( *(testMesh + d), subMesh->Point(x).X() / 64, 0.01); + CPPUNIT_ASSERT_DOUBLES_EQUAL( *(testMesh + d + 1), subMesh->Point(x).Y() / 64, 0.01); + d += 3; + } + } + + tearDownFreetype(); + } + + + void setUp() + {} + + + void tearDown() + {} + + private: + FT_Library library; + FT_Face face; + + void setUpFreetype( unsigned int characterIndex) + { + FT_Error error = FT_Init_FreeType( &library); + assert(!error); + error = FT_New_Face( library, ARIAL_FONT_FILE, 0, &face); + assert(!error); + + loadGlyph( characterIndex); + } + + void loadGlyph( unsigned int characterIndex) + { + long glyphIndex = FT_Get_Char_Index( face, characterIndex); + + FT_Set_Char_Size( face, 0L, FONT_POINT_SIZE * 64, RESOLUTION, RESOLUTION); + + FT_Error error = FT_Load_Glyph( face, glyphIndex, FT_LOAD_DEFAULT); + assert(!error); + } + + void tearDownFreetype() + { + FT_Done_Face( face); + FT_Done_FreeType( library); + } + +}; + +CPPUNIT_TEST_SUITE_REGISTRATION( FTVectoriserTest); + diff --git a/src/WinLibs/FTGL/test/FTlayout-Test.cpp b/src/WinLibs/FTGL/test/FTlayout-Test.cpp new file mode 100644 index 000000000..880469b49 --- /dev/null +++ b/src/WinLibs/FTGL/test/FTlayout-Test.cpp @@ -0,0 +1,40 @@ +#include +#include +#include +#include + +#include "Fontdefs.h" +#include "layout/FTLayoutFont.h" + +static const int SCRIPT = 2; // arabic + +class FTLayoutTest : public CppUnit::TestCase +{ + CPPUNIT_TEST_SUITE( FTLayoutTest); + CPPUNIT_TEST( testConstructor); + CPPUNIT_TEST_SUITE_END(); + + public: + FTLayoutTest() : CppUnit::TestCase( "FTLayout Test") + {} + + FTLayoutTest( const std::string& name) : CppUnit::TestCase(name) {} + + void testConstructor() + { + FTLayoutFont font( FONT_FILE, SCRIPT); + CPPUNIT_ASSERT( font.Error() == 0); + } + + void setUp() + {} + + + void tearDown() + {} + + private: +}; + +CPPUNIT_TEST_SUITE_REGISTRATION( FTLayoutTest); + diff --git a/src/WinLibs/FTGL/test/Fontdefs.h b/src/WinLibs/FTGL/test/Fontdefs.h new file mode 100644 index 000000000..7a0e19069 --- /dev/null +++ b/src/WinLibs/FTGL/test/Fontdefs.h @@ -0,0 +1,39 @@ +#ifndef __Font_defs__ +#define __Font_defs__ + + +const char* const BAD_FONT_FILE = "missing_font.ttf"; +const char* const GOOD_FONT_FILE = "../../test/font_pack/MHei-Medium-Acro"; +const char* const ARIAL_FONT_FILE = "../../test/font_pack/arial.ttf"; +const char* const FONT_FILE = "../../test/font_pack/times.ttf"; +const char* const TYPE1_FONT_FILE = "../../test/font_pack/HPGCalc.pfb"; +const char* const TYPE1_AFM_FILE = "../../test/font_pack/HPGCalc.afm"; + +const char* const GOOD_ASCII_TEST_STRING = "test string"; +const char* const BAD_ASCII_TEST_STRING = ""; +const wchar_t GOOD_UNICODE_TEST_STRING[4] = { 0x6FB3, 0x9580, 0x0}; +const wchar_t* const BAD_UNICODE_TEST_STRING = L""; + +const unsigned int FONT_POINT_SIZE = 72; +const unsigned int RESOLUTION = 72; + +const unsigned int CHARACTER_CODE_A = 'A'; +const unsigned int CHARACTER_CODE_G = 'g'; +const unsigned int BIG_CHARACTER_CODE = 0x6FB3; +const unsigned int NULL_CHARACTER_CODE = 512; +const unsigned int NULL_CHARACTER_INDEX = ' '; +const unsigned int SIMPLE_CHARACTER_INDEX = 'i'; +const unsigned int COMPLEX_CHARACTER_INDEX = 'd'; + +const unsigned int FONT_INDEX_OF_A = 34; +const unsigned int BIG_FONT_INDEX = 4838; +const unsigned int NULL_FONT_INDEX = 0; + +const unsigned int NUMBER_OF_GLYPHS = 50; +const unsigned int TOO_MANY_GLYPHS = 14100; // MHei-Medium-Acro has 14099 + + +#include "HPGCalc_pfb.cpp" +#include "HPGCalc_afm.cpp" + +#endif // __Font_defs__ \ No newline at end of file diff --git a/src/WinLibs/FTGL/test/HPGCalc_afm.cpp b/src/WinLibs/FTGL/test/HPGCalc_afm.cpp new file mode 100644 index 000000000..d10acd4f8 --- /dev/null +++ b/src/WinLibs/FTGL/test/HPGCalc_afm.cpp @@ -0,0 +1,70 @@ +/* + * Conversion of HPGCalc.afm + */ + +#ifndef DEFINED_BINARYFILEDUMP +#define DEFINED_BINARYFILEDUMP + +typedef struct BINARYFILEDUMP_struct { + const unsigned char * dataBytes; + int numBytes; +} BINARYFILEDUMP; + +#endif + +const unsigned char byte_data_HPGCalc_afm[ ] = +{ + 0x53, 0x74, 0x61, 0x72, 0x74, 0x46, 0x6f, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x20, 0x32, 0x2e, 0x30, 0x0d, 0x0a, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x70, 0x66, 0x61, 0x65, 0x64, 0x69, 0x74, 0x0d, 0x0a, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x43, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x44, 0x61, 0x74, 0x65, 0x3a, 0x20, 0x54, 0x68, 0x75, 0x20, 0x4f, 0x63, 0x74, 0x20, 0x33, 0x31, 0x20, 0x31, 0x37, 0x3a, 0x33, 0x31, 0x3a, 0x30, 0x33, 0x20, 0x32, 0x30, 0x30, 0x32, 0x0d, 0x0a, 0x46, 0x6f, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x20, 0x48, 0x50, 0x47, 0x43, 0x61, 0x6c, 0x63, 0x0d, 0x0a, 0x46, 0x75, 0x6c, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x20, 0x48, 0x50, 0x20, 0x47, 0x72, 0x61, 0x70, 0x68, 0x69, 0x6e, 0x67, 0x20, 0x43, 0x61, 0x6c, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x6f, 0x72, 0x20, 0x44, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x0d, 0x0a, 0x46, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x20, 0x48, 0x50, 0x47, 0x43, 0x61, 0x6c, 0x63, 0x0d, 0x0a, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x20, 0x4d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x0d, 0x0a, 0x4e, 0x6f, 0x74, 0x69, 0x63, 0x65, 0x20, 0x28, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x4a, 0x6f, 0x73, 0x68, 0x75, 0x61, 0x20, 0x4b, 0x69, 0x6e, 0x67, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x50, 0x66, 0x61, 0x45, 0x64, 0x69, 0x74, 0x20, 0x31, 0x2e, 0x30, 0x20, 0x28, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x70, 0x66, 0x61, 0x65, 0x64, + 0x69, 0x74, 0x2e, 0x73, 0x66, 0x2e, 0x6e, 0x65, 0x74, 0x29, 0x20, 0x53, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x73, 0x20, 0x61, 0x72, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x20, 0x64, 0x65, 0x73, 0x69, 0x67, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x48, 0x65, 0x77, 0x6c, 0x65, 0x74, 0x74, 0x20, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x72, 0x64, 0x20, 0x61, 0x73, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x69, 0x72, 0x20, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x6e, 0x67, 0x20, 0x63, 0x61, 0x6c, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x20, 0x48, 0x50, 0x33, 0x38, 0x47, 0x2c, 0x20, 0x48, 0x50, 0x33, 0x39, 0x47, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x48, 0x50, 0x34, 0x30, 0x47, 0x2e, 0x29, 0x0d, 0x0a, 0x49, 0x74, 0x61, 0x6c, 0x69, 0x63, 0x41, 0x6e, 0x67, 0x6c, 0x65, 0x20, 0x30, 0x0d, 0x0a, 0x49, 0x73, 0x46, 0x69, 0x78, 0x65, 0x64, 0x50, 0x69, 0x74, 0x63, 0x68, 0x20, 0x74, 0x72, 0x75, 0x65, 0x0d, 0x0a, 0x55, 0x6e, 0x64, 0x65, 0x72, 0x6c, 0x69, 0x6e, 0x65, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x2d, 0x31, 0x30, 0x30, 0x0d, 0x0a, 0x55, 0x6e, 0x64, 0x65, 0x72, 0x6c, 0x69, 0x6e, 0x65, 0x54, 0x68, 0x69, 0x63, 0x6b, 0x6e, 0x65, 0x73, 0x73, 0x20, 0x35, 0x30, 0x0d, 0x0a, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x30, 0x30, 0x34, 0x2e, 0x30, 0x30, 0x30, 0x0d, 0x0a, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x20, 0x46, 0x6f, 0x6e, 0x74, 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x0d, 0x0a, 0x46, 0x6f, 0x6e, + 0x74, 0x42, 0x42, 0x6f, 0x78, 0x20, 0x33, 0x37, 0x20, 0x34, 0x31, 0x20, 0x35, 0x35, 0x39, 0x20, 0x39, 0x30, 0x32, 0x0d, 0x0a, 0x43, 0x61, 0x70, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x20, 0x39, 0x30, 0x31, 0x0d, 0x0a, 0x58, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x20, 0x36, 0x34, 0x34, 0x0d, 0x0a, 0x41, 0x73, 0x63, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x20, 0x39, 0x30, 0x31, 0x0d, 0x0a, 0x44, 0x65, 0x73, 0x63, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x20, 0x34, 0x33, 0x0d, 0x0a, 0x53, 0x74, 0x61, 0x72, 0x74, 0x43, 0x68, 0x61, 0x72, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x20, 0x32, 0x32, 0x36, 0x0d, 0x0a, 0x43, 0x20, 0x30, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x2e, 0x6e, 0x6f, 0x74, 0x64, 0x65, 0x66, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x30, 0x20, 0x30, 0x20, 0x30, 0x20, 0x30, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x33, 0x32, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x73, 0x70, 0x61, 0x63, 0x65, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x30, 0x20, 0x30, 0x20, 0x30, 0x20, 0x30, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x33, 0x33, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x65, 0x78, 0x63, 0x6c, 0x61, 0x6d, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x32, 0x35, 0x34, 0x20, 0x31, 0x32, 0x39, 0x20, 0x33, 0x34, 0x31, 0x20, 0x39, 0x30, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x33, 0x34, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x64, 0x62, 0x6c, 0x20, 0x3b, 0x20, 0x42, + 0x20, 0x31, 0x36, 0x39, 0x20, 0x35, 0x35, 0x38, 0x20, 0x34, 0x32, 0x37, 0x20, 0x39, 0x30, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x33, 0x35, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x69, 0x67, 0x6e, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x31, 0x32, 0x39, 0x20, 0x35, 0x31, 0x33, 0x20, 0x39, 0x30, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x33, 0x36, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x31, 0x32, 0x39, 0x20, 0x35, 0x31, 0x33, 0x20, 0x39, 0x30, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x33, 0x37, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x31, 0x32, 0x39, 0x20, 0x35, 0x31, 0x33, 0x20, 0x39, 0x30, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x33, 0x38, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x61, 0x6d, 0x70, 0x65, 0x72, 0x73, 0x61, 0x6e, 0x64, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x31, 0x32, 0x39, 0x20, 0x35, 0x31, 0x33, 0x20, 0x39, 0x30, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x33, 0x39, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x73, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x32, 0x35, 0x34, 0x20, 0x35, 0x35, + 0x38, 0x20, 0x33, 0x34, 0x31, 0x20, 0x39, 0x30, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x34, 0x30, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x6c, 0x65, 0x66, 0x74, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x31, 0x36, 0x39, 0x20, 0x31, 0x32, 0x39, 0x20, 0x34, 0x32, 0x37, 0x20, 0x39, 0x30, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x34, 0x31, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x31, 0x36, 0x39, 0x20, 0x31, 0x32, 0x39, 0x20, 0x34, 0x32, 0x37, 0x20, 0x39, 0x30, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x34, 0x32, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x61, 0x73, 0x74, 0x65, 0x72, 0x69, 0x73, 0x6b, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x33, 0x30, 0x30, 0x20, 0x35, 0x31, 0x33, 0x20, 0x37, 0x33, 0x31, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x34, 0x33, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x70, 0x6c, 0x75, 0x73, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x33, 0x30, 0x30, 0x20, 0x35, 0x31, 0x33, 0x20, 0x37, 0x33, 0x31, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x34, 0x34, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x32, 0x31, 0x31, 0x20, 0x34, 0x33, 0x20, 0x33, 0x38, 0x34, 0x20, 0x33, 0x38, 0x37, 0x20, 0x3b, 0x0d, 0x0a, + 0x43, 0x20, 0x34, 0x35, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x68, 0x79, 0x70, 0x68, 0x65, 0x6e, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x34, 0x37, 0x32, 0x20, 0x35, 0x31, 0x33, 0x20, 0x35, 0x35, 0x39, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x34, 0x36, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x32, 0x31, 0x31, 0x20, 0x31, 0x32, 0x39, 0x20, 0x33, 0x38, 0x34, 0x20, 0x33, 0x30, 0x31, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x34, 0x37, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x33, 0x30, 0x30, 0x20, 0x35, 0x31, 0x33, 0x20, 0x37, 0x33, 0x31, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x34, 0x38, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x7a, 0x65, 0x72, 0x6f, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x31, 0x32, 0x39, 0x20, 0x35, 0x31, 0x33, 0x20, 0x39, 0x30, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x34, 0x39, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x31, 0x36, 0x39, 0x20, 0x31, 0x32, 0x39, 0x20, 0x34, 0x32, 0x37, 0x20, 0x39, 0x30, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x35, 0x30, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x74, 0x77, 0x6f, 0x20, 0x3b, 0x20, 0x42, + 0x20, 0x38, 0x33, 0x20, 0x31, 0x32, 0x39, 0x20, 0x35, 0x31, 0x33, 0x20, 0x39, 0x30, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x35, 0x31, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x74, 0x68, 0x72, 0x65, 0x65, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x31, 0x32, 0x39, 0x20, 0x35, 0x31, 0x33, 0x20, 0x39, 0x30, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x35, 0x32, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x66, 0x6f, 0x75, 0x72, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x31, 0x32, 0x39, 0x20, 0x35, 0x31, 0x33, 0x20, 0x39, 0x30, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x35, 0x33, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x66, 0x69, 0x76, 0x65, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x31, 0x32, 0x39, 0x20, 0x35, 0x31, 0x33, 0x20, 0x39, 0x30, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x35, 0x34, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x73, 0x69, 0x78, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x31, 0x32, 0x39, 0x20, 0x35, 0x31, 0x33, 0x20, 0x39, 0x30, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x35, 0x35, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x73, 0x65, 0x76, 0x65, 0x6e, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x31, 0x32, 0x39, 0x20, 0x35, 0x31, 0x33, 0x20, 0x39, 0x30, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x35, 0x36, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, + 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x65, 0x69, 0x67, 0x68, 0x74, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x31, 0x32, 0x39, 0x20, 0x35, 0x31, 0x33, 0x20, 0x39, 0x30, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x35, 0x37, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x6e, 0x69, 0x6e, 0x65, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x31, 0x32, 0x39, 0x20, 0x35, 0x31, 0x33, 0x20, 0x39, 0x30, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x35, 0x38, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x6e, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x32, 0x31, 0x31, 0x20, 0x33, 0x30, 0x30, 0x20, 0x33, 0x38, 0x34, 0x20, 0x37, 0x33, 0x31, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x35, 0x39, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x73, 0x65, 0x6d, 0x69, 0x63, 0x6f, 0x6c, 0x6f, 0x6e, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x32, 0x31, 0x31, 0x20, 0x34, 0x33, 0x20, 0x33, 0x38, 0x34, 0x20, 0x37, 0x33, 0x31, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x36, 0x30, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x31, 0x32, 0x39, 0x20, 0x35, 0x31, 0x33, 0x20, 0x39, 0x30, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x36, 0x31, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x33, 0x38, 0x36, + 0x20, 0x35, 0x31, 0x33, 0x20, 0x36, 0x34, 0x35, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x36, 0x32, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x31, 0x32, 0x39, 0x20, 0x35, 0x31, 0x33, 0x20, 0x39, 0x30, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x36, 0x33, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x71, 0x75, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x31, 0x32, 0x39, 0x20, 0x35, 0x31, 0x33, 0x20, 0x39, 0x30, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x36, 0x34, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x61, 0x74, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x31, 0x32, 0x39, 0x20, 0x35, 0x31, 0x33, 0x20, 0x39, 0x30, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x36, 0x35, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x41, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x31, 0x32, 0x39, 0x20, 0x35, 0x31, 0x33, 0x20, 0x39, 0x30, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x36, 0x36, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x42, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x31, 0x32, 0x39, 0x20, 0x35, 0x31, 0x33, 0x20, 0x39, 0x30, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x36, 0x37, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x43, 0x20, + 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x31, 0x32, 0x39, 0x20, 0x35, 0x31, 0x33, 0x20, 0x39, 0x30, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x36, 0x38, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x44, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x31, 0x32, 0x39, 0x20, 0x35, 0x31, 0x33, 0x20, 0x39, 0x30, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x36, 0x39, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x45, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x31, 0x32, 0x39, 0x20, 0x35, 0x31, 0x33, 0x20, 0x39, 0x30, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x37, 0x30, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x46, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x31, 0x32, 0x39, 0x20, 0x35, 0x31, 0x33, 0x20, 0x39, 0x30, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x37, 0x31, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x47, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x31, 0x32, 0x39, 0x20, 0x35, 0x31, 0x33, 0x20, 0x39, 0x30, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x37, 0x32, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x48, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x31, 0x32, 0x39, 0x20, 0x35, 0x31, 0x33, 0x20, 0x39, 0x30, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x37, 0x33, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x49, 0x20, 0x3b, 0x20, 0x42, 0x20, + 0x31, 0x36, 0x39, 0x20, 0x31, 0x32, 0x39, 0x20, 0x34, 0x32, 0x37, 0x20, 0x39, 0x30, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x37, 0x34, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x4a, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x31, 0x32, 0x39, 0x20, 0x35, 0x31, 0x33, 0x20, 0x39, 0x30, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x37, 0x35, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x4b, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x31, 0x32, 0x39, 0x20, 0x35, 0x31, 0x33, 0x20, 0x39, 0x30, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x37, 0x36, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x4c, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x31, 0x32, 0x39, 0x20, 0x35, 0x31, 0x33, 0x20, 0x39, 0x30, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x37, 0x37, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x4d, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x31, 0x32, 0x39, 0x20, 0x35, 0x31, 0x33, 0x20, 0x39, 0x30, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x37, 0x38, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x4e, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x31, 0x32, 0x39, 0x20, 0x35, 0x31, 0x33, 0x20, 0x39, 0x30, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x37, 0x39, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x4f, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, + 0x31, 0x32, 0x39, 0x20, 0x35, 0x31, 0x33, 0x20, 0x39, 0x30, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x38, 0x30, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x50, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x31, 0x32, 0x39, 0x20, 0x35, 0x31, 0x33, 0x20, 0x39, 0x30, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x38, 0x31, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x51, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x31, 0x32, 0x39, 0x20, 0x35, 0x31, 0x33, 0x20, 0x39, 0x30, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x38, 0x32, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x52, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x31, 0x32, 0x39, 0x20, 0x35, 0x31, 0x33, 0x20, 0x39, 0x30, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x38, 0x33, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x53, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x31, 0x32, 0x39, 0x20, 0x35, 0x31, 0x33, 0x20, 0x39, 0x30, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x38, 0x34, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x54, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x31, 0x32, 0x39, 0x20, 0x35, 0x31, 0x33, 0x20, 0x39, 0x30, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x38, 0x35, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x55, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x31, 0x32, 0x39, 0x20, + 0x35, 0x31, 0x33, 0x20, 0x39, 0x30, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x38, 0x36, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x56, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x31, 0x32, 0x39, 0x20, 0x35, 0x31, 0x33, 0x20, 0x39, 0x30, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x38, 0x37, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x57, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x31, 0x32, 0x39, 0x20, 0x35, 0x31, 0x33, 0x20, 0x39, 0x30, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x38, 0x38, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x58, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x31, 0x32, 0x39, 0x20, 0x35, 0x31, 0x33, 0x20, 0x39, 0x30, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x38, 0x39, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x59, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x31, 0x32, 0x39, 0x20, 0x35, 0x31, 0x33, 0x20, 0x39, 0x30, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x39, 0x30, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x5a, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x31, 0x32, 0x39, 0x20, 0x35, 0x31, 0x33, 0x20, 0x39, 0x30, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x39, 0x31, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x62, 0x72, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x6c, 0x65, 0x66, 0x74, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x31, + 0x36, 0x39, 0x20, 0x31, 0x32, 0x39, 0x20, 0x34, 0x32, 0x37, 0x20, 0x39, 0x30, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x39, 0x32, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x62, 0x61, 0x63, 0x6b, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x33, 0x30, 0x30, 0x20, 0x35, 0x31, 0x33, 0x20, 0x37, 0x33, 0x31, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x39, 0x33, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x62, 0x72, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x31, 0x36, 0x39, 0x20, 0x31, 0x32, 0x39, 0x20, 0x34, 0x32, 0x37, 0x20, 0x39, 0x30, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x39, 0x34, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x61, 0x73, 0x63, 0x69, 0x69, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x36, 0x34, 0x34, 0x20, 0x35, 0x31, 0x33, 0x20, 0x39, 0x30, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x31, 0x32, 0x39, 0x20, 0x35, 0x31, 0x33, 0x20, 0x32, 0x31, 0x35, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x39, 0x36, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x67, 0x72, 0x61, 0x76, 0x65, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x32, 0x31, 0x31, + 0x20, 0x36, 0x34, 0x34, 0x20, 0x33, 0x38, 0x34, 0x20, 0x39, 0x30, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x39, 0x37, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x61, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x31, 0x32, 0x39, 0x20, 0x35, 0x31, 0x33, 0x20, 0x36, 0x34, 0x35, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x39, 0x38, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x62, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x31, 0x32, 0x39, 0x20, 0x35, 0x31, 0x33, 0x20, 0x39, 0x30, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x39, 0x39, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x63, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x31, 0x32, 0x39, 0x20, 0x35, 0x31, 0x33, 0x20, 0x36, 0x34, 0x35, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x31, 0x30, 0x30, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x64, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x31, 0x32, 0x39, 0x20, 0x35, 0x31, 0x33, 0x20, 0x39, 0x30, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x31, 0x30, 0x31, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x65, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x31, 0x32, 0x39, 0x20, 0x35, 0x31, 0x33, 0x20, 0x36, 0x34, 0x35, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x31, 0x30, 0x32, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x66, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, + 0x31, 0x32, 0x39, 0x20, 0x35, 0x31, 0x33, 0x20, 0x39, 0x30, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x31, 0x30, 0x33, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x67, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x34, 0x33, 0x20, 0x35, 0x31, 0x33, 0x20, 0x36, 0x34, 0x35, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x31, 0x30, 0x34, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x68, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x31, 0x32, 0x39, 0x20, 0x35, 0x31, 0x33, 0x20, 0x39, 0x30, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x31, 0x30, 0x35, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x69, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x31, 0x36, 0x39, 0x20, 0x31, 0x32, 0x39, 0x20, 0x34, 0x32, 0x37, 0x20, 0x38, 0x31, 0x36, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x31, 0x30, 0x36, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x6a, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x31, 0x32, 0x36, 0x20, 0x34, 0x33, 0x20, 0x34, 0x37, 0x30, 0x20, 0x38, 0x31, 0x36, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x31, 0x30, 0x37, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x6b, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x31, 0x32, 0x36, 0x20, 0x31, 0x32, 0x39, 0x20, 0x34, 0x37, 0x30, 0x20, 0x39, 0x30, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x31, 0x30, 0x38, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x6c, 0x20, 0x3b, 0x20, 0x42, 0x20, + 0x31, 0x36, 0x39, 0x20, 0x31, 0x32, 0x39, 0x20, 0x34, 0x32, 0x37, 0x20, 0x39, 0x30, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x31, 0x30, 0x39, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x6d, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x31, 0x32, 0x39, 0x20, 0x35, 0x31, 0x33, 0x20, 0x36, 0x34, 0x35, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x31, 0x31, 0x30, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x6e, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x31, 0x32, 0x39, 0x20, 0x35, 0x31, 0x33, 0x20, 0x36, 0x34, 0x35, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x31, 0x31, 0x31, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x6f, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x31, 0x32, 0x39, 0x20, 0x35, 0x31, 0x33, 0x20, 0x36, 0x34, 0x35, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x31, 0x31, 0x32, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x70, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x34, 0x33, 0x20, 0x35, 0x31, 0x33, 0x20, 0x36, 0x34, 0x35, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x31, 0x31, 0x33, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x71, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x34, 0x33, 0x20, 0x35, 0x31, 0x33, 0x20, 0x36, 0x34, 0x35, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x31, 0x31, 0x34, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x72, 0x20, 0x3b, 0x20, 0x42, + 0x20, 0x38, 0x33, 0x20, 0x31, 0x32, 0x39, 0x20, 0x35, 0x31, 0x33, 0x20, 0x36, 0x34, 0x35, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x31, 0x31, 0x35, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x73, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x31, 0x32, 0x39, 0x20, 0x35, 0x31, 0x33, 0x20, 0x36, 0x34, 0x35, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x31, 0x31, 0x36, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x74, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x31, 0x32, 0x36, 0x20, 0x31, 0x32, 0x39, 0x20, 0x34, 0x37, 0x30, 0x20, 0x39, 0x30, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x31, 0x31, 0x37, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x75, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x31, 0x32, 0x39, 0x20, 0x35, 0x31, 0x33, 0x20, 0x36, 0x34, 0x35, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x31, 0x31, 0x38, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x76, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x31, 0x32, 0x39, 0x20, 0x35, 0x31, 0x33, 0x20, 0x36, 0x34, 0x35, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x31, 0x31, 0x39, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x77, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x31, 0x32, 0x39, 0x20, 0x35, 0x31, 0x33, 0x20, 0x36, 0x34, 0x35, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x31, 0x32, 0x30, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x78, 0x20, + 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x31, 0x32, 0x39, 0x20, 0x35, 0x31, 0x33, 0x20, 0x36, 0x34, 0x35, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x31, 0x32, 0x31, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x79, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x34, 0x33, 0x20, 0x35, 0x31, 0x33, 0x20, 0x36, 0x34, 0x35, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x31, 0x32, 0x32, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x7a, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x31, 0x32, 0x39, 0x20, 0x35, 0x31, 0x33, 0x20, 0x36, 0x34, 0x35, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x31, 0x32, 0x33, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x62, 0x72, 0x61, 0x63, 0x65, 0x6c, 0x65, 0x66, 0x74, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x31, 0x32, 0x36, 0x20, 0x31, 0x32, 0x39, 0x20, 0x34, 0x37, 0x30, 0x20, 0x39, 0x30, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x31, 0x32, 0x34, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x62, 0x61, 0x72, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x32, 0x35, 0x34, 0x20, 0x31, 0x32, 0x39, 0x20, 0x33, 0x34, 0x31, 0x20, 0x39, 0x30, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x31, 0x32, 0x35, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x62, 0x72, 0x61, 0x63, 0x65, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x31, 0x32, 0x36, 0x20, 0x31, 0x32, 0x39, 0x20, 0x34, 0x37, 0x30, 0x20, 0x39, 0x30, 0x32, 0x20, 0x3b, + 0x0d, 0x0a, 0x43, 0x20, 0x31, 0x32, 0x36, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x61, 0x73, 0x63, 0x69, 0x69, 0x74, 0x69, 0x6c, 0x64, 0x65, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x34, 0x37, 0x32, 0x20, 0x35, 0x31, 0x33, 0x20, 0x37, 0x33, 0x31, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x31, 0x32, 0x37, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x73, 0x68, 0x61, 0x64, 0x65, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x39, 0x20, 0x31, 0x32, 0x35, 0x20, 0x35, 0x30, 0x37, 0x20, 0x38, 0x37, 0x36, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x31, 0x32, 0x38, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x32, 0x31, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x39, 0x20, 0x32, 0x30, 0x38, 0x20, 0x35, 0x30, 0x37, 0x20, 0x37, 0x35, 0x31, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x31, 0x32, 0x39, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x63, 0x68, 0x69, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x39, 0x20, 0x31, 0x32, 0x35, 0x20, 0x35, 0x30, 0x37, 0x20, 0x37, 0x30, 0x39, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x31, 0x33, 0x30, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x67, 0x72, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x74, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x39, 0x20, 0x32, 0x39, 0x31, 0x20, 0x35, 0x30, 0x37, 0x20, 0x37, 0x30, 0x39, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x31, 0x33, 0x31, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, + 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x72, 0x61, 0x64, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x39, 0x20, 0x31, 0x32, 0x35, 0x20, 0x35, 0x30, 0x37, 0x20, 0x38, 0x37, 0x36, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x31, 0x33, 0x32, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x6c, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x39, 0x20, 0x31, 0x32, 0x35, 0x20, 0x35, 0x30, 0x37, 0x20, 0x38, 0x37, 0x36, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x31, 0x33, 0x33, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x53, 0x69, 0x67, 0x6d, 0x61, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x39, 0x20, 0x31, 0x32, 0x35, 0x20, 0x35, 0x30, 0x37, 0x20, 0x38, 0x37, 0x36, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x31, 0x33, 0x34, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x32, 0x33, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x39, 0x20, 0x31, 0x32, 0x35, 0x20, 0x35, 0x30, 0x37, 0x20, 0x38, 0x37, 0x36, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x31, 0x33, 0x35, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x70, 0x69, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x39, 0x20, 0x36, 0x30, 0x20, 0x35, 0x30, 0x37, 0x20, 0x35, 0x31, 0x31, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x31, 0x33, 0x36, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x70, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x64, 0x69, 0x66, + 0x66, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x39, 0x20, 0x31, 0x32, 0x35, 0x20, 0x35, 0x30, 0x37, 0x20, 0x38, 0x37, 0x36, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x31, 0x33, 0x37, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x6c, 0x65, 0x73, 0x73, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x39, 0x20, 0x32, 0x30, 0x38, 0x20, 0x35, 0x30, 0x37, 0x20, 0x37, 0x39, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x31, 0x33, 0x38, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x39, 0x20, 0x32, 0x30, 0x38, 0x20, 0x35, 0x30, 0x37, 0x20, 0x37, 0x39, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x31, 0x33, 0x39, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x67, 0x75, 0x69, 0x6c, 0x73, 0x69, 0x6e, 0x67, 0x6c, 0x6c, 0x65, 0x66, 0x74, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x39, 0x20, 0x32, 0x30, 0x38, 0x20, 0x35, 0x30, 0x37, 0x20, 0x37, 0x39, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x31, 0x34, 0x30, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x39, 0x20, 0x31, 0x32, 0x35, 0x20, 0x35, 0x30, 0x37, 0x20, 0x35, 0x34, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x31, 0x34, 0x31, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x72, + 0x69, 0x67, 0x68, 0x74, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x39, 0x20, 0x32, 0x35, 0x30, 0x20, 0x35, 0x30, 0x37, 0x20, 0x37, 0x35, 0x31, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x31, 0x34, 0x32, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x6c, 0x65, 0x66, 0x74, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x39, 0x20, 0x32, 0x35, 0x30, 0x20, 0x35, 0x30, 0x37, 0x20, 0x37, 0x35, 0x31, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x31, 0x34, 0x33, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x64, 0x6f, 0x77, 0x6e, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x39, 0x20, 0x31, 0x32, 0x35, 0x20, 0x35, 0x30, 0x37, 0x20, 0x38, 0x37, 0x36, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x31, 0x34, 0x34, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x75, 0x70, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x39, 0x20, 0x31, 0x32, 0x35, 0x20, 0x35, 0x30, 0x37, 0x20, 0x38, 0x37, 0x36, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x31, 0x34, 0x35, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x67, 0x61, 0x6d, 0x6d, 0x61, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x39, 0x20, 0x31, 0x32, 0x35, 0x20, 0x35, 0x30, 0x37, 0x20, 0x35, 0x34, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x31, 0x34, 0x36, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x39, + 0x20, 0x31, 0x32, 0x35, 0x20, 0x35, 0x30, 0x37, 0x20, 0x38, 0x37, 0x36, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x31, 0x34, 0x37, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x65, 0x70, 0x73, 0x69, 0x6c, 0x6f, 0x6e, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x39, 0x20, 0x31, 0x32, 0x35, 0x20, 0x35, 0x30, 0x37, 0x20, 0x35, 0x34, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x31, 0x34, 0x38, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x65, 0x74, 0x61, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x39, 0x20, 0x31, 0x32, 0x35, 0x20, 0x35, 0x30, 0x37, 0x20, 0x37, 0x30, 0x39, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x31, 0x34, 0x39, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x74, 0x68, 0x65, 0x74, 0x61, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x39, 0x20, 0x31, 0x32, 0x35, 0x20, 0x35, 0x30, 0x37, 0x20, 0x38, 0x37, 0x36, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x31, 0x35, 0x30, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x6c, 0x61, 0x6d, 0x62, 0x64, 0x61, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x39, 0x20, 0x31, 0x32, 0x35, 0x20, 0x35, 0x30, 0x37, 0x20, 0x37, 0x32, 0x38, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x31, 0x35, 0x31, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x72, 0x68, 0x6f, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x39, 0x20, 0x34, 0x31, 0x20, 0x35, 0x30, 0x37, 0x20, 0x36, 0x32, 0x36, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x31, 0x35, 0x32, 0x20, 0x3b, + 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x73, 0x69, 0x67, 0x6d, 0x61, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x39, 0x20, 0x31, 0x32, 0x35, 0x20, 0x35, 0x30, 0x37, 0x20, 0x35, 0x34, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x31, 0x35, 0x33, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x74, 0x61, 0x75, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x39, 0x20, 0x31, 0x32, 0x35, 0x20, 0x35, 0x30, 0x37, 0x20, 0x37, 0x30, 0x39, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x31, 0x35, 0x34, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x6f, 0x6d, 0x65, 0x67, 0x61, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x39, 0x20, 0x31, 0x32, 0x35, 0x20, 0x35, 0x30, 0x37, 0x20, 0x36, 0x32, 0x36, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x31, 0x35, 0x35, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x39, 0x20, 0x32, 0x39, 0x31, 0x20, 0x35, 0x30, 0x37, 0x20, 0x36, 0x32, 0x36, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x31, 0x35, 0x36, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x50, 0x69, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x39, 0x20, 0x31, 0x32, 0x35, 0x20, 0x35, 0x30, 0x37, 0x20, 0x38, 0x37, 0x36, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x31, 0x35, 0x37, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x4f, 0x6d, 0x65, 0x67, 0x61, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x39, 0x20, 0x31, + 0x32, 0x35, 0x20, 0x35, 0x30, 0x37, 0x20, 0x38, 0x37, 0x36, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x31, 0x35, 0x38, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x62, 0x75, 0x6c, 0x6c, 0x65, 0x74, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x31, 0x37, 0x32, 0x20, 0x32, 0x39, 0x31, 0x20, 0x34, 0x32, 0x33, 0x20, 0x36, 0x32, 0x36, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x31, 0x35, 0x39, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x69, 0x6e, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x79, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x33, 0x37, 0x20, 0x39, 0x32, 0x20, 0x35, 0x35, 0x39, 0x20, 0x34, 0x31, 0x35, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x31, 0x36, 0x30, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x6e, 0x6f, 0x6e, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x73, 0x70, 0x61, 0x63, 0x65, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x39, 0x20, 0x31, 0x32, 0x35, 0x20, 0x35, 0x30, 0x37, 0x20, 0x32, 0x39, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x31, 0x36, 0x31, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x65, 0x78, 0x63, 0x6c, 0x61, 0x6d, 0x64, 0x6f, 0x77, 0x6e, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x32, 0x35, 0x34, 0x20, 0x31, 0x32, 0x39, 0x20, 0x33, 0x34, 0x31, 0x20, 0x39, 0x30, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x31, 0x36, 0x32, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x63, 0x65, 0x6e, 0x74, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x34, 0x33, + 0x20, 0x35, 0x31, 0x33, 0x20, 0x37, 0x33, 0x31, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x31, 0x36, 0x33, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x73, 0x74, 0x65, 0x72, 0x6c, 0x69, 0x6e, 0x67, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x31, 0x32, 0x39, 0x20, 0x35, 0x31, 0x33, 0x20, 0x39, 0x30, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x31, 0x36, 0x34, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x39, 0x20, 0x31, 0x32, 0x35, 0x20, 0x35, 0x30, 0x37, 0x20, 0x37, 0x30, 0x39, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x31, 0x36, 0x35, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x79, 0x65, 0x6e, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x31, 0x32, 0x39, 0x20, 0x35, 0x31, 0x33, 0x20, 0x39, 0x30, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x31, 0x36, 0x36, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x62, 0x72, 0x6f, 0x6b, 0x65, 0x6e, 0x62, 0x61, 0x72, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x32, 0x35, 0x34, 0x20, 0x31, 0x32, 0x39, 0x20, 0x33, 0x34, 0x31, 0x20, 0x39, 0x30, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x31, 0x36, 0x37, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x31, 0x37, 0x32, 0x20, 0x31, 0x32, 0x35, 0x20, 0x34, 0x32, 0x33, 0x20, 0x38, 0x37, 0x36, 0x20, + 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x31, 0x36, 0x38, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x31, 0x36, 0x39, 0x20, 0x38, 0x31, 0x35, 0x20, 0x34, 0x32, 0x37, 0x20, 0x39, 0x30, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x31, 0x36, 0x39, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x63, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x32, 0x35, 0x37, 0x20, 0x35, 0x31, 0x33, 0x20, 0x39, 0x30, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x31, 0x37, 0x30, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x6f, 0x72, 0x64, 0x66, 0x65, 0x6d, 0x69, 0x6e, 0x69, 0x6e, 0x65, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x31, 0x32, 0x36, 0x20, 0x33, 0x38, 0x36, 0x20, 0x34, 0x37, 0x30, 0x20, 0x39, 0x30, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x31, 0x37, 0x31, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x67, 0x75, 0x69, 0x6c, 0x6c, 0x65, 0x6d, 0x6f, 0x74, 0x6c, 0x65, 0x66, 0x74, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x33, 0x30, 0x30, 0x20, 0x35, 0x31, 0x33, 0x20, 0x37, 0x33, 0x31, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x31, 0x37, 0x32, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x6c, 0x6f, 0x67, 0x69, 0x63, 0x61, 0x6c, 0x6e, 0x6f, 0x74, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x31, 0x32, 0x36, 0x20, 0x33, 0x38, 0x36, 0x20, + 0x34, 0x37, 0x30, 0x20, 0x35, 0x35, 0x39, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x31, 0x37, 0x33, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x75, 0x6e, 0x69, 0x30, 0x30, 0x41, 0x44, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x31, 0x32, 0x36, 0x20, 0x35, 0x35, 0x38, 0x20, 0x34, 0x37, 0x30, 0x20, 0x36, 0x34, 0x35, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x31, 0x37, 0x34, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x33, 0x30, 0x30, 0x20, 0x35, 0x31, 0x33, 0x20, 0x39, 0x30, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x31, 0x37, 0x35, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x6e, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x38, 0x31, 0x35, 0x20, 0x35, 0x31, 0x33, 0x20, 0x39, 0x30, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x31, 0x37, 0x36, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x64, 0x65, 0x67, 0x72, 0x65, 0x65, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x31, 0x36, 0x39, 0x20, 0x36, 0x34, 0x34, 0x20, 0x34, 0x32, 0x37, 0x20, 0x39, 0x30, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x31, 0x37, 0x37, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x70, 0x6c, 0x75, 0x73, 0x6d, 0x69, 0x6e, 0x75, 0x73, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x32, 0x31, 0x34, 0x20, 0x35, 0x31, 0x33, 0x20, 0x37, 0x33, + 0x31, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x31, 0x37, 0x38, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x74, 0x77, 0x6f, 0x73, 0x75, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x72, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x31, 0x36, 0x39, 0x20, 0x34, 0x37, 0x32, 0x20, 0x34, 0x32, 0x37, 0x20, 0x39, 0x30, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x31, 0x37, 0x39, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x74, 0x68, 0x72, 0x65, 0x65, 0x73, 0x75, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x72, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x31, 0x36, 0x39, 0x20, 0x34, 0x37, 0x32, 0x20, 0x34, 0x32, 0x37, 0x20, 0x39, 0x30, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x31, 0x38, 0x30, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x61, 0x63, 0x75, 0x74, 0x65, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x32, 0x31, 0x32, 0x20, 0x37, 0x33, 0x30, 0x20, 0x33, 0x38, 0x34, 0x20, 0x39, 0x30, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x31, 0x38, 0x31, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x6d, 0x75, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x34, 0x33, 0x20, 0x35, 0x31, 0x33, 0x20, 0x36, 0x34, 0x35, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x31, 0x38, 0x32, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x70, 0x61, 0x72, 0x61, 0x67, 0x72, 0x61, 0x70, 0x68, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x31, 0x32, 0x39, 0x20, 0x35, 0x31, 0x33, 0x20, 0x38, 0x31, 0x36, 0x20, 0x3b, 0x0d, + 0x0a, 0x43, 0x20, 0x31, 0x38, 0x33, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x65, 0x64, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x32, 0x31, 0x31, 0x20, 0x33, 0x38, 0x36, 0x20, 0x33, 0x38, 0x34, 0x20, 0x35, 0x35, 0x39, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x31, 0x38, 0x34, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x63, 0x65, 0x64, 0x69, 0x6c, 0x6c, 0x61, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x31, 0x36, 0x39, 0x20, 0x31, 0x32, 0x39, 0x20, 0x34, 0x32, 0x37, 0x20, 0x33, 0x38, 0x37, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x31, 0x38, 0x35, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x6f, 0x6e, 0x65, 0x73, 0x75, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x72, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x31, 0x36, 0x39, 0x20, 0x34, 0x37, 0x32, 0x20, 0x34, 0x32, 0x37, 0x20, 0x39, 0x30, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x31, 0x38, 0x36, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x6f, 0x72, 0x64, 0x6d, 0x61, 0x73, 0x63, 0x75, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x31, 0x36, 0x33, 0x20, 0x33, 0x38, 0x34, 0x20, 0x34, 0x33, 0x32, 0x20, 0x39, 0x30, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x31, 0x38, 0x37, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x67, 0x75, 0x69, 0x6c, 0x6c, 0x65, 0x6d, 0x6f, 0x74, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, + 0x33, 0x20, 0x33, 0x30, 0x30, 0x20, 0x35, 0x31, 0x33, 0x20, 0x37, 0x33, 0x31, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x31, 0x38, 0x38, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x6f, 0x6e, 0x65, 0x71, 0x75, 0x61, 0x72, 0x74, 0x65, 0x72, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x32, 0x31, 0x34, 0x20, 0x35, 0x31, 0x33, 0x20, 0x39, 0x30, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x31, 0x38, 0x39, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x6f, 0x6e, 0x65, 0x68, 0x61, 0x6c, 0x66, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x31, 0x32, 0x39, 0x20, 0x35, 0x31, 0x33, 0x20, 0x39, 0x30, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x31, 0x39, 0x30, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x74, 0x68, 0x72, 0x65, 0x65, 0x71, 0x75, 0x61, 0x72, 0x74, 0x65, 0x72, 0x73, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x32, 0x31, 0x34, 0x20, 0x35, 0x31, 0x33, 0x20, 0x39, 0x30, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x31, 0x39, 0x31, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x71, 0x75, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x64, 0x6f, 0x77, 0x6e, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x31, 0x32, 0x39, 0x20, 0x35, 0x31, 0x33, 0x20, 0x39, 0x30, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x31, 0x39, 0x32, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x41, 0x67, 0x72, 0x61, 0x76, 0x65, 0x20, 0x3b, 0x20, 0x42, + 0x20, 0x38, 0x33, 0x20, 0x31, 0x32, 0x39, 0x20, 0x35, 0x31, 0x33, 0x20, 0x39, 0x30, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x31, 0x39, 0x33, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x41, 0x61, 0x63, 0x75, 0x74, 0x65, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x31, 0x32, 0x39, 0x20, 0x35, 0x31, 0x33, 0x20, 0x39, 0x30, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x31, 0x39, 0x34, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x41, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, 0x78, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x31, 0x32, 0x39, 0x20, 0x35, 0x31, 0x33, 0x20, 0x39, 0x30, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x31, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x41, 0x74, 0x69, 0x6c, 0x64, 0x65, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x31, 0x32, 0x39, 0x20, 0x35, 0x31, 0x33, 0x20, 0x39, 0x30, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x31, 0x39, 0x36, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x41, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x31, 0x32, 0x39, 0x20, 0x35, 0x31, 0x33, 0x20, 0x39, 0x30, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x31, 0x39, 0x37, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x41, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x31, 0x32, 0x39, 0x20, 0x35, + 0x31, 0x33, 0x20, 0x39, 0x30, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x31, 0x39, 0x38, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x41, 0x45, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x31, 0x32, 0x39, 0x20, 0x35, 0x31, 0x33, 0x20, 0x39, 0x30, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x31, 0x39, 0x39, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x43, 0x63, 0x65, 0x64, 0x69, 0x6c, 0x6c, 0x61, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x34, 0x33, 0x20, 0x35, 0x31, 0x33, 0x20, 0x39, 0x30, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x32, 0x30, 0x30, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x45, 0x67, 0x72, 0x61, 0x76, 0x65, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x31, 0x32, 0x39, 0x20, 0x35, 0x31, 0x33, 0x20, 0x39, 0x30, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x32, 0x30, 0x31, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x45, 0x61, 0x63, 0x75, 0x74, 0x65, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x31, 0x32, 0x39, 0x20, 0x35, 0x31, 0x33, 0x20, 0x39, 0x30, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x32, 0x30, 0x32, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x45, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, 0x78, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x31, 0x32, 0x39, 0x20, 0x35, 0x31, 0x33, 0x20, 0x39, 0x30, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x32, 0x30, + 0x33, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x45, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x31, 0x32, 0x39, 0x20, 0x35, 0x31, 0x33, 0x20, 0x39, 0x30, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x32, 0x30, 0x34, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x49, 0x67, 0x72, 0x61, 0x76, 0x65, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x31, 0x36, 0x39, 0x20, 0x31, 0x32, 0x39, 0x20, 0x34, 0x32, 0x37, 0x20, 0x39, 0x30, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x32, 0x30, 0x35, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x49, 0x61, 0x63, 0x75, 0x74, 0x65, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x31, 0x36, 0x39, 0x20, 0x31, 0x32, 0x39, 0x20, 0x34, 0x32, 0x37, 0x20, 0x39, 0x30, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x32, 0x30, 0x36, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x49, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, 0x78, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x31, 0x36, 0x39, 0x20, 0x31, 0x32, 0x39, 0x20, 0x34, 0x32, 0x37, 0x20, 0x39, 0x30, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x32, 0x30, 0x37, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x49, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x31, 0x36, 0x39, 0x20, 0x31, 0x32, 0x39, 0x20, 0x34, 0x32, 0x37, 0x20, 0x39, 0x30, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x32, 0x30, 0x38, + 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x45, 0x74, 0x68, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x31, 0x32, 0x39, 0x20, 0x35, 0x31, 0x33, 0x20, 0x39, 0x30, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x32, 0x30, 0x39, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x4e, 0x74, 0x69, 0x6c, 0x64, 0x65, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x31, 0x32, 0x39, 0x20, 0x35, 0x31, 0x33, 0x20, 0x39, 0x30, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x32, 0x31, 0x30, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x4f, 0x67, 0x72, 0x61, 0x76, 0x65, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x31, 0x32, 0x39, 0x20, 0x35, 0x31, 0x33, 0x20, 0x39, 0x30, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x32, 0x31, 0x31, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x4f, 0x61, 0x63, 0x75, 0x74, 0x65, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x31, 0x32, 0x39, 0x20, 0x35, 0x31, 0x33, 0x20, 0x39, 0x30, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x32, 0x31, 0x32, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x4f, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, 0x78, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x31, 0x32, 0x39, 0x20, 0x35, 0x31, 0x33, 0x20, 0x39, 0x30, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x32, 0x31, 0x33, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, + 0x4f, 0x74, 0x69, 0x6c, 0x64, 0x65, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x31, 0x32, 0x39, 0x20, 0x35, 0x31, 0x33, 0x20, 0x39, 0x30, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x32, 0x31, 0x34, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x4f, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x31, 0x32, 0x39, 0x20, 0x35, 0x31, 0x33, 0x20, 0x39, 0x30, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x32, 0x31, 0x35, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x79, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x33, 0x30, 0x30, 0x20, 0x35, 0x31, 0x33, 0x20, 0x37, 0x33, 0x31, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x32, 0x31, 0x36, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x4f, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x31, 0x32, 0x39, 0x20, 0x35, 0x31, 0x33, 0x20, 0x39, 0x30, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x32, 0x31, 0x37, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x55, 0x67, 0x72, 0x61, 0x76, 0x65, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x31, 0x32, 0x39, 0x20, 0x35, 0x31, 0x33, 0x20, 0x39, 0x30, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x32, 0x31, 0x38, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x55, 0x61, 0x63, 0x75, 0x74, 0x65, 0x20, 0x3b, 0x20, 0x42, 0x20, + 0x38, 0x33, 0x20, 0x31, 0x32, 0x39, 0x20, 0x35, 0x31, 0x33, 0x20, 0x39, 0x30, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x32, 0x31, 0x39, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x55, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, 0x78, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x31, 0x32, 0x39, 0x20, 0x35, 0x31, 0x33, 0x20, 0x39, 0x30, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x32, 0x32, 0x30, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x55, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x31, 0x32, 0x39, 0x20, 0x35, 0x31, 0x33, 0x20, 0x39, 0x30, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x32, 0x32, 0x31, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x59, 0x61, 0x63, 0x75, 0x74, 0x65, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x31, 0x32, 0x39, 0x20, 0x35, 0x31, 0x33, 0x20, 0x39, 0x30, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x32, 0x32, 0x32, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x54, 0x68, 0x6f, 0x72, 0x6e, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x31, 0x32, 0x39, 0x20, 0x35, 0x31, 0x33, 0x20, 0x38, 0x31, 0x36, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x32, 0x32, 0x33, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x62, 0x65, 0x74, 0x61, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x34, 0x33, 0x20, 0x35, 0x31, 0x33, 0x20, 0x39, + 0x30, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x32, 0x32, 0x34, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x61, 0x67, 0x72, 0x61, 0x76, 0x65, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x31, 0x32, 0x39, 0x20, 0x35, 0x31, 0x33, 0x20, 0x39, 0x30, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x32, 0x32, 0x35, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x61, 0x61, 0x63, 0x75, 0x74, 0x65, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x31, 0x32, 0x39, 0x20, 0x35, 0x31, 0x33, 0x20, 0x39, 0x30, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x32, 0x32, 0x36, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x61, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, 0x78, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x31, 0x32, 0x39, 0x20, 0x35, 0x31, 0x33, 0x20, 0x39, 0x30, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x32, 0x32, 0x37, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x61, 0x74, 0x69, 0x6c, 0x64, 0x65, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x31, 0x32, 0x39, 0x20, 0x35, 0x31, 0x33, 0x20, 0x39, 0x30, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x32, 0x32, 0x38, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x61, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x31, 0x32, 0x39, 0x20, 0x35, 0x31, 0x33, 0x20, 0x38, 0x31, 0x36, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, + 0x32, 0x32, 0x39, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x31, 0x32, 0x39, 0x20, 0x35, 0x31, 0x33, 0x20, 0x39, 0x30, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x32, 0x33, 0x30, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x61, 0x65, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x31, 0x32, 0x39, 0x20, 0x35, 0x31, 0x33, 0x20, 0x36, 0x34, 0x35, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x32, 0x33, 0x31, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x63, 0x63, 0x65, 0x64, 0x69, 0x6c, 0x6c, 0x61, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x34, 0x33, 0x20, 0x35, 0x31, 0x33, 0x20, 0x37, 0x33, 0x31, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x32, 0x33, 0x32, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x65, 0x67, 0x72, 0x61, 0x76, 0x65, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x31, 0x32, 0x39, 0x20, 0x35, 0x31, 0x33, 0x20, 0x39, 0x30, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x32, 0x33, 0x33, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x65, 0x61, 0x63, 0x75, 0x74, 0x65, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x31, 0x32, 0x39, 0x20, 0x35, 0x31, 0x33, 0x20, 0x39, 0x30, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x32, 0x33, 0x34, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x65, 0x63, 0x69, + 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, 0x78, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x31, 0x32, 0x39, 0x20, 0x35, 0x31, 0x33, 0x20, 0x39, 0x30, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x32, 0x33, 0x35, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x65, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x31, 0x32, 0x39, 0x20, 0x35, 0x31, 0x33, 0x20, 0x38, 0x31, 0x36, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x32, 0x33, 0x36, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x69, 0x67, 0x72, 0x61, 0x76, 0x65, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x31, 0x36, 0x39, 0x20, 0x31, 0x32, 0x39, 0x20, 0x34, 0x32, 0x37, 0x20, 0x39, 0x30, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x32, 0x33, 0x37, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x69, 0x61, 0x63, 0x75, 0x74, 0x65, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x31, 0x36, 0x39, 0x20, 0x31, 0x32, 0x39, 0x20, 0x34, 0x32, 0x37, 0x20, 0x39, 0x30, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x32, 0x33, 0x38, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x69, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, 0x78, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x31, 0x36, 0x39, 0x20, 0x31, 0x32, 0x39, 0x20, 0x34, 0x32, 0x37, 0x20, 0x39, 0x30, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x32, 0x33, 0x39, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x69, 0x64, 0x69, + 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x31, 0x36, 0x39, 0x20, 0x31, 0x32, 0x39, 0x20, 0x34, 0x32, 0x37, 0x20, 0x38, 0x31, 0x36, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x32, 0x34, 0x30, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x65, 0x74, 0x68, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x31, 0x32, 0x39, 0x20, 0x35, 0x31, 0x33, 0x20, 0x39, 0x30, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x32, 0x34, 0x31, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x6e, 0x74, 0x69, 0x6c, 0x64, 0x65, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x31, 0x32, 0x39, 0x20, 0x35, 0x31, 0x33, 0x20, 0x39, 0x30, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x32, 0x34, 0x32, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x6f, 0x67, 0x72, 0x61, 0x76, 0x65, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x31, 0x32, 0x39, 0x20, 0x35, 0x31, 0x33, 0x20, 0x39, 0x30, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x32, 0x34, 0x33, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x6f, 0x61, 0x63, 0x75, 0x74, 0x65, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x31, 0x32, 0x39, 0x20, 0x35, 0x31, 0x33, 0x20, 0x39, 0x30, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x32, 0x34, 0x34, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x6f, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, 0x78, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, + 0x20, 0x31, 0x32, 0x39, 0x20, 0x35, 0x31, 0x33, 0x20, 0x39, 0x30, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x32, 0x34, 0x35, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x6f, 0x74, 0x69, 0x6c, 0x64, 0x65, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x31, 0x32, 0x39, 0x20, 0x35, 0x31, 0x33, 0x20, 0x39, 0x30, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x32, 0x34, 0x36, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x6f, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x31, 0x32, 0x39, 0x20, 0x35, 0x31, 0x33, 0x20, 0x38, 0x31, 0x36, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x32, 0x34, 0x37, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x64, 0x69, 0x76, 0x69, 0x64, 0x65, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x33, 0x30, 0x30, 0x20, 0x35, 0x31, 0x33, 0x20, 0x37, 0x33, 0x31, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x32, 0x34, 0x38, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x6f, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x31, 0x32, 0x39, 0x20, 0x35, 0x31, 0x33, 0x20, 0x35, 0x35, 0x39, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x32, 0x34, 0x39, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x75, 0x67, 0x72, 0x61, 0x76, 0x65, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x31, 0x32, 0x39, 0x20, 0x35, 0x31, 0x33, 0x20, 0x39, 0x30, 0x32, 0x20, + 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x32, 0x35, 0x30, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x75, 0x61, 0x63, 0x75, 0x74, 0x65, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x31, 0x32, 0x39, 0x20, 0x35, 0x31, 0x33, 0x20, 0x39, 0x30, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x32, 0x35, 0x31, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x75, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, 0x78, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x31, 0x32, 0x39, 0x20, 0x35, 0x31, 0x33, 0x20, 0x39, 0x30, 0x32, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x32, 0x35, 0x32, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x75, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x31, 0x32, 0x39, 0x20, 0x35, 0x31, 0x33, 0x20, 0x38, 0x31, 0x36, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x32, 0x35, 0x33, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x79, 0x61, 0x63, 0x75, 0x74, 0x65, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x34, 0x33, 0x20, 0x35, 0x31, 0x33, 0x20, 0x38, 0x31, 0x36, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x32, 0x35, 0x34, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x74, 0x68, 0x6f, 0x72, 0x6e, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x34, 0x33, 0x20, 0x35, 0x31, 0x33, 0x20, 0x38, 0x31, 0x36, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x32, 0x35, 0x35, 0x20, 0x3b, 0x20, + 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x79, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x38, 0x33, 0x20, 0x34, 0x33, 0x20, 0x35, 0x31, 0x33, 0x20, 0x38, 0x31, 0x36, 0x20, 0x3b, 0x0d, 0x0a, 0x43, 0x20, 0x2d, 0x31, 0x20, 0x3b, 0x20, 0x57, 0x58, 0x20, 0x35, 0x39, 0x35, 0x20, 0x3b, 0x20, 0x4e, 0x20, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x65, 0x64, 0x20, 0x3b, 0x20, 0x42, 0x20, 0x32, 0x31, 0x31, 0x20, 0x33, 0x38, 0x36, 0x20, 0x33, 0x38, 0x34, 0x20, 0x35, 0x35, 0x39, 0x20, 0x3b, 0x0d, 0x0a, 0x45, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x72, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x0d, 0x0a, 0x45, 0x6e, 0x64, 0x46, 0x6f, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x0d, 0x0a, +}; + +const int byte_size_HPGCalc_afm = 11394; + +BINARYFILEDUMP const HPGCalc_afm = +{ + byte_data_HPGCalc_afm, + byte_size_HPGCalc_afm +}; diff --git a/src/WinLibs/FTGL/test/HPGCalc_pfb.cpp b/src/WinLibs/FTGL/test/HPGCalc_pfb.cpp new file mode 100644 index 000000000..d0654f45f --- /dev/null +++ b/src/WinLibs/FTGL/test/HPGCalc_pfb.cpp @@ -0,0 +1,275 @@ +/* + * Conversion of HPGCalc.pfb + */ + +#ifndef DEFINED_BINARYFILEDUMP +#define DEFINED_BINARYFILEDUMP + +typedef struct BINARYFILEDUMP_struct { + const unsigned char * dataBytes; + int numBytes; +} BINARYFILEDUMP; + +#endif + +const unsigned char byte_data_HPGCalc_pfb[ ] = +{ + 0x80, 0x01, 0xc9, 0x15, 0x00, 0x00, 0x25, 0x21, 0x50, 0x53, 0x2d, 0x41, 0x64, 0x6f, 0x62, 0x65, 0x46, 0x6f, 0x6e, 0x74, 0x2d, 0x31, 0x2e, 0x30, 0x3a, 0x20, 0x48, 0x50, 0x47, 0x43, 0x61, 0x6c, 0x63, 0x20, 0x30, 0x30, 0x34, 0x2e, 0x30, 0x30, 0x30, 0x0a, 0x25, 0x25, 0x54, 0x69, 0x74, 0x6c, 0x65, 0x3a, 0x20, 0x48, 0x50, 0x47, 0x43, 0x61, 0x6c, 0x63, 0x0a, 0x25, 0x25, 0x43, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x65, 0x3a, 0x20, 0x54, 0x68, 0x75, 0x20, 0x4f, 0x63, 0x74, 0x20, 0x33, 0x31, 0x20, 0x31, 0x37, 0x3a, 0x33, 0x31, 0x3a, 0x30, 0x33, 0x20, 0x32, 0x30, 0x30, 0x32, 0x0a, 0x25, 0x25, 0x43, 0x72, 0x65, 0x61, 0x74, 0x6f, 0x72, 0x3a, 0x20, 0x4a, 0x6f, 0x73, 0x68, 0x75, 0x61, 0x20, 0x4b, 0x69, 0x6e, 0x67, 0x2c, 0x2c, 0x2c, 0x28, 0x30, 0x38, 0x29, 0x20, 0x39, 0x34, 0x30, 0x31, 0x20, 0x37, 0x32, 0x36, 0x39, 0x0a, 0x25, 0x25, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x75, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x3a, 0x20, 0x66, 0x6f, 0x6e, 0x74, 0x20, 0x48, 0x50, 0x47, 0x43, 0x61, 0x6c, 0x63, 0x0a, 0x25, 0x20, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x4a, 0x6f, 0x73, 0x68, 0x75, 0x61, 0x20, 0x4b, 0x69, 0x6e, 0x67, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x50, 0x66, 0x61, 0x45, 0x64, 0x69, 0x74, 0x20, 0x31, 0x2e, 0x30, 0x20, 0x28, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x70, 0x66, 0x61, 0x65, 0x64, 0x69, 0x74, 0x2e, 0x73, 0x66, 0x2e, 0x6e, 0x65, 0x74, 0x29, 0x20, 0x53, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x0a, 0x25, + 0x20, 0x32, 0x30, 0x30, 0x32, 0x2d, 0x31, 0x30, 0x2d, 0x33, 0x31, 0x3a, 0x20, 0x46, 0x69, 0x78, 0x65, 0x64, 0x20, 0x6d, 0x61, 0x70, 0x20, 0x6f, 0x66, 0x20, 0x58, 0x20, 0x42, 0x61, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x68, 0x69, 0x20, 0x2d, 0x20, 0x6e, 0x6f, 0x20, 0x58, 0x20, 0x42, 0x61, 0x72, 0x20, 0x69, 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x20, 0x55, 0x6e, 0x69, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x66, 0x6f, 0x6e, 0x74, 0x73, 0x2e, 0x20, 0x0a, 0x25, 0x20, 0x32, 0x30, 0x30, 0x32, 0x2d, 0x31, 0x30, 0x2d, 0x31, 0x33, 0x3a, 0x20, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x2e, 0x0a, 0x25, 0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x50, 0x66, 0x61, 0x45, 0x64, 0x69, 0x74, 0x20, 0x31, 0x2e, 0x30, 0x20, 0x28, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x70, 0x66, 0x61, 0x65, 0x64, 0x69, 0x74, 0x2e, 0x73, 0x66, 0x2e, 0x6e, 0x65, 0x74, 0x2f, 0x29, 0x0a, 0x25, 0x25, 0x45, 0x6e, 0x64, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x0a, 0x46, 0x6f, 0x6e, 0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x2f, 0x48, 0x50, 0x47, 0x43, 0x61, 0x6c, 0x63, 0x20, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x7b, 0x2f, 0x48, 0x50, 0x47, 0x43, 0x61, 0x6c, 0x63, 0x20, 0x66, 0x69, 0x6e, 0x64, 0x66, 0x6f, 0x6e, 0x74, 0x20, 0x64, 0x75, 0x70, 0x2f, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x49, 0x44, 0x20, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x7b, 0x64, 0x75, 0x70, 0x0a, 0x2f, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x49, 0x44, 0x20, 0x67, 0x65, 0x74, 0x20, 0x34, 0x32, 0x35, 0x38, 0x38, 0x39, 0x30, 0x20, + 0x65, 0x71, 0x20, 0x65, 0x78, 0x63, 0x68, 0x2f, 0x46, 0x6f, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x20, 0x67, 0x65, 0x74, 0x20, 0x31, 0x20, 0x65, 0x71, 0x20, 0x61, 0x6e, 0x64, 0x7d, 0x7b, 0x70, 0x6f, 0x70, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x7d, 0x69, 0x66, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x7b, 0x73, 0x61, 0x76, 0x65, 0x20, 0x74, 0x72, 0x75, 0x65, 0x7d, 0x7b, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x7d, 0x69, 0x66, 0x65, 0x6c, 0x73, 0x65, 0x7d, 0x7b, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x7d, 0x69, 0x66, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x31, 0x31, 0x20, 0x64, 0x69, 0x63, 0x74, 0x20, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x0a, 0x2f, 0x46, 0x6f, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x20, 0x31, 0x20, 0x64, 0x65, 0x66, 0x0a, 0x2f, 0x46, 0x6f, 0x6e, 0x74, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x20, 0x5b, 0x30, 0x2e, 0x30, 0x30, 0x30, 0x32, 0x32, 0x39, 0x37, 0x37, 0x39, 0x20, 0x30, 0x20, 0x30, 0x20, 0x30, 0x2e, 0x30, 0x30, 0x30, 0x32, 0x32, 0x39, 0x37, 0x37, 0x39, 0x20, 0x30, 0x20, 0x30, 0x20, 0x5d, 0x72, 0x65, 0x61, 0x64, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x64, 0x65, 0x66, 0x0a, 0x2f, 0x46, 0x6f, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x20, 0x2f, 0x48, 0x50, 0x47, 0x43, 0x61, 0x6c, 0x63, 0x20, 0x64, 0x65, 0x66, 0x0a, 0x2f, 0x46, 0x6f, 0x6e, 0x74, 0x42, 0x42, 0x6f, 0x78, 0x20, 0x5b, 0x31, 0x36, 0x31, 0x20, 0x31, 0x38, 0x32, 0x20, 0x32, 0x34, 0x33, 0x31, 0x20, 0x33, 0x39, 0x32, 0x34, 0x20, 0x5d, 0x72, 0x65, 0x61, 0x64, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x64, 0x65, 0x66, 0x0a, 0x2f, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x49, 0x44, 0x20, 0x34, 0x32, 0x35, 0x38, + 0x38, 0x39, 0x30, 0x20, 0x64, 0x65, 0x66, 0x0a, 0x2f, 0x50, 0x61, 0x69, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x20, 0x30, 0x20, 0x64, 0x65, 0x66, 0x0a, 0x2f, 0x46, 0x6f, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x20, 0x31, 0x31, 0x20, 0x64, 0x69, 0x63, 0x74, 0x20, 0x64, 0x75, 0x70, 0x20, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x0a, 0x20, 0x2f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x30, 0x30, 0x34, 0x2e, 0x30, 0x30, 0x30, 0x29, 0x20, 0x72, 0x65, 0x61, 0x64, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x64, 0x65, 0x66, 0x0a, 0x20, 0x2f, 0x4e, 0x6f, 0x74, 0x69, 0x63, 0x65, 0x20, 0x28, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x4a, 0x6f, 0x73, 0x68, 0x75, 0x61, 0x20, 0x4b, 0x69, 0x6e, 0x67, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x50, 0x66, 0x61, 0x45, 0x64, 0x69, 0x74, 0x20, 0x31, 0x2e, 0x30, 0x20, 0x5c, 0x30, 0x35, 0x30, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x70, 0x66, 0x61, 0x65, 0x64, 0x69, 0x74, 0x2e, 0x73, 0x66, 0x2e, 0x6e, 0x65, 0x74, 0x5c, 0x30, 0x35, 0x31, 0x20, 0x53, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x73, 0x20, 0x61, 0x72, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x20, 0x64, 0x65, 0x73, 0x69, 0x67, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x48, 0x65, 0x77, 0x6c, 0x65, 0x74, 0x74, 0x20, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x72, 0x64, 0x20, 0x61, 0x73, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x69, 0x72, 0x20, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x6e, 0x67, 0x20, 0x63, 0x61, 0x6c, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x20, 0x48, + 0x50, 0x33, 0x38, 0x47, 0x2c, 0x20, 0x48, 0x50, 0x33, 0x39, 0x47, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x48, 0x50, 0x34, 0x30, 0x47, 0x2e, 0x29, 0x20, 0x72, 0x65, 0x61, 0x64, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x64, 0x65, 0x66, 0x0a, 0x20, 0x2f, 0x46, 0x75, 0x6c, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x20, 0x28, 0x48, 0x50, 0x20, 0x47, 0x72, 0x61, 0x70, 0x68, 0x69, 0x6e, 0x67, 0x20, 0x43, 0x61, 0x6c, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x6f, 0x72, 0x20, 0x44, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x29, 0x20, 0x72, 0x65, 0x61, 0x64, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x64, 0x65, 0x66, 0x0a, 0x20, 0x2f, 0x46, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x20, 0x28, 0x48, 0x50, 0x47, 0x43, 0x61, 0x6c, 0x63, 0x29, 0x20, 0x72, 0x65, 0x61, 0x64, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x64, 0x65, 0x66, 0x0a, 0x20, 0x2f, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x20, 0x28, 0x4d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x29, 0x20, 0x72, 0x65, 0x61, 0x64, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x64, 0x65, 0x66, 0x0a, 0x20, 0x2f, 0x46, 0x53, 0x54, 0x79, 0x70, 0x65, 0x20, 0x30, 0x20, 0x64, 0x65, 0x66, 0x0a, 0x20, 0x2f, 0x49, 0x74, 0x61, 0x6c, 0x69, 0x63, 0x41, 0x6e, 0x67, 0x6c, 0x65, 0x20, 0x30, 0x20, 0x64, 0x65, 0x66, 0x0a, 0x20, 0x2f, 0x69, 0x73, 0x46, 0x69, 0x78, 0x65, 0x64, 0x50, 0x69, 0x74, 0x63, 0x68, 0x20, 0x74, 0x72, 0x75, 0x65, 0x20, 0x64, 0x65, 0x66, 0x0a, 0x20, 0x2f, 0x55, 0x6e, 0x64, 0x65, 0x72, 0x6c, 0x69, 0x6e, 0x65, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x2d, 0x31, 0x30, 0x30, 0x20, 0x64, 0x65, 0x66, 0x0a, 0x20, 0x2f, 0x55, 0x6e, 0x64, 0x65, 0x72, + 0x6c, 0x69, 0x6e, 0x65, 0x54, 0x68, 0x69, 0x63, 0x6b, 0x6e, 0x65, 0x73, 0x73, 0x20, 0x35, 0x30, 0x20, 0x64, 0x65, 0x66, 0x0a, 0x20, 0x2f, 0x61, 0x73, 0x63, 0x65, 0x6e, 0x74, 0x20, 0x34, 0x30, 0x36, 0x35, 0x20, 0x64, 0x65, 0x66, 0x0a, 0x65, 0x6e, 0x64, 0x20, 0x72, 0x65, 0x61, 0x64, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x64, 0x65, 0x66, 0x0a, 0x2f, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x32, 0x35, 0x36, 0x20, 0x61, 0x72, 0x72, 0x61, 0x79, 0x0a, 0x20, 0x30, 0x20, 0x31, 0x20, 0x32, 0x35, 0x35, 0x20, 0x7b, 0x20, 0x31, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x2f, 0x2e, 0x6e, 0x6f, 0x74, 0x64, 0x65, 0x66, 0x20, 0x70, 0x75, 0x74, 0x7d, 0x20, 0x66, 0x6f, 0x72, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x33, 0x32, 0x2f, 0x73, 0x70, 0x61, 0x63, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x33, 0x33, 0x2f, 0x65, 0x78, 0x63, 0x6c, 0x61, 0x6d, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x33, 0x34, 0x2f, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x64, 0x62, 0x6c, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x33, 0x35, 0x2f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x69, 0x67, 0x6e, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x33, 0x36, 0x2f, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x33, 0x37, 0x2f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x33, 0x38, 0x2f, 0x61, 0x6d, 0x70, 0x65, 0x72, 0x73, 0x61, 0x6e, 0x64, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, + 0x20, 0x33, 0x39, 0x2f, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x73, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x34, 0x30, 0x2f, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x6c, 0x65, 0x66, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x34, 0x31, 0x2f, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x34, 0x32, 0x2f, 0x61, 0x73, 0x74, 0x65, 0x72, 0x69, 0x73, 0x6b, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x34, 0x33, 0x2f, 0x70, 0x6c, 0x75, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x34, 0x34, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x34, 0x35, 0x2f, 0x68, 0x79, 0x70, 0x68, 0x65, 0x6e, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x34, 0x36, 0x2f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x34, 0x37, 0x2f, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x34, 0x38, 0x2f, 0x7a, 0x65, 0x72, 0x6f, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x34, 0x39, 0x2f, 0x6f, 0x6e, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x35, 0x30, 0x2f, 0x74, 0x77, 0x6f, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x35, 0x31, 0x2f, 0x74, 0x68, 0x72, 0x65, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x35, 0x32, 0x2f, 0x66, 0x6f, 0x75, 0x72, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x35, 0x33, 0x2f, 0x66, + 0x69, 0x76, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x35, 0x34, 0x2f, 0x73, 0x69, 0x78, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x35, 0x35, 0x2f, 0x73, 0x65, 0x76, 0x65, 0x6e, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x35, 0x36, 0x2f, 0x65, 0x69, 0x67, 0x68, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x35, 0x37, 0x2f, 0x6e, 0x69, 0x6e, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x35, 0x38, 0x2f, 0x63, 0x6f, 0x6c, 0x6f, 0x6e, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x35, 0x39, 0x2f, 0x73, 0x65, 0x6d, 0x69, 0x63, 0x6f, 0x6c, 0x6f, 0x6e, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x36, 0x30, 0x2f, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x36, 0x31, 0x2f, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x36, 0x32, 0x2f, 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x36, 0x33, 0x2f, 0x71, 0x75, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x36, 0x34, 0x2f, 0x61, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x36, 0x35, 0x2f, 0x41, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x36, 0x36, 0x2f, 0x42, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x36, 0x37, 0x2f, 0x43, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x36, 0x38, 0x2f, 0x44, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x36, 0x39, 0x2f, + 0x45, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x37, 0x30, 0x2f, 0x46, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x37, 0x31, 0x2f, 0x47, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x37, 0x32, 0x2f, 0x48, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x37, 0x33, 0x2f, 0x49, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x37, 0x34, 0x2f, 0x4a, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x37, 0x35, 0x2f, 0x4b, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x37, 0x36, 0x2f, 0x4c, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x37, 0x37, 0x2f, 0x4d, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x37, 0x38, 0x2f, 0x4e, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x37, 0x39, 0x2f, 0x4f, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x38, 0x30, 0x2f, 0x50, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x38, 0x31, 0x2f, 0x51, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x38, 0x32, 0x2f, 0x52, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x38, 0x33, 0x2f, 0x53, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x38, 0x34, 0x2f, 0x54, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x38, 0x35, 0x2f, 0x55, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x38, 0x36, 0x2f, 0x56, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x38, 0x37, 0x2f, 0x57, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x38, 0x38, 0x2f, 0x58, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, + 0x20, 0x38, 0x39, 0x2f, 0x59, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x39, 0x30, 0x2f, 0x5a, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x39, 0x31, 0x2f, 0x62, 0x72, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x6c, 0x65, 0x66, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x39, 0x32, 0x2f, 0x62, 0x61, 0x63, 0x6b, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x39, 0x33, 0x2f, 0x62, 0x72, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x39, 0x34, 0x2f, 0x61, 0x73, 0x63, 0x69, 0x69, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x39, 0x35, 0x2f, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x39, 0x36, 0x2f, 0x67, 0x72, 0x61, 0x76, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x39, 0x37, 0x2f, 0x61, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x39, 0x38, 0x2f, 0x62, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x39, 0x39, 0x2f, 0x63, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x31, 0x30, 0x30, 0x2f, 0x64, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x31, 0x30, 0x31, 0x2f, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x31, 0x30, 0x32, 0x2f, 0x66, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x31, 0x30, 0x33, 0x2f, 0x67, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x31, 0x30, 0x34, 0x2f, + 0x68, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x31, 0x30, 0x35, 0x2f, 0x69, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x31, 0x30, 0x36, 0x2f, 0x6a, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x31, 0x30, 0x37, 0x2f, 0x6b, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x31, 0x30, 0x38, 0x2f, 0x6c, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x31, 0x30, 0x39, 0x2f, 0x6d, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x31, 0x31, 0x30, 0x2f, 0x6e, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x31, 0x31, 0x31, 0x2f, 0x6f, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x31, 0x31, 0x32, 0x2f, 0x70, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x31, 0x31, 0x33, 0x2f, 0x71, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x31, 0x31, 0x34, 0x2f, 0x72, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x31, 0x31, 0x35, 0x2f, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x31, 0x31, 0x36, 0x2f, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x31, 0x31, 0x37, 0x2f, 0x75, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x31, 0x31, 0x38, 0x2f, 0x76, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x31, 0x31, 0x39, 0x2f, 0x77, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x31, 0x32, 0x30, 0x2f, 0x78, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x31, 0x32, 0x31, 0x2f, 0x79, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x31, 0x32, 0x32, 0x2f, 0x7a, 0x20, 0x70, 0x75, + 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x31, 0x32, 0x33, 0x2f, 0x62, 0x72, 0x61, 0x63, 0x65, 0x6c, 0x65, 0x66, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x31, 0x32, 0x34, 0x2f, 0x62, 0x61, 0x72, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x31, 0x32, 0x35, 0x2f, 0x62, 0x72, 0x61, 0x63, 0x65, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x31, 0x32, 0x36, 0x2f, 0x61, 0x73, 0x63, 0x69, 0x69, 0x74, 0x69, 0x6c, 0x64, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x31, 0x32, 0x37, 0x2f, 0x73, 0x68, 0x61, 0x64, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x31, 0x32, 0x38, 0x2f, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x32, 0x31, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x31, 0x32, 0x39, 0x2f, 0x63, 0x68, 0x69, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x31, 0x33, 0x30, 0x2f, 0x67, 0x72, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x31, 0x33, 0x31, 0x2f, 0x72, 0x61, 0x64, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x31, 0x33, 0x32, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x6c, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x31, 0x33, 0x33, 0x2f, 0x53, 0x69, 0x67, 0x6d, 0x61, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x31, 0x33, 0x34, 0x2f, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x32, 0x33, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x31, 0x33, 0x35, 0x2f, 0x70, 0x69, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, + 0x75, 0x70, 0x20, 0x31, 0x33, 0x36, 0x2f, 0x70, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x64, 0x69, 0x66, 0x66, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x31, 0x33, 0x37, 0x2f, 0x6c, 0x65, 0x73, 0x73, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x31, 0x33, 0x38, 0x2f, 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x31, 0x33, 0x39, 0x2f, 0x67, 0x75, 0x69, 0x6c, 0x73, 0x69, 0x6e, 0x67, 0x6c, 0x6c, 0x65, 0x66, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x31, 0x34, 0x30, 0x2f, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x31, 0x34, 0x31, 0x2f, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x31, 0x34, 0x32, 0x2f, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x6c, 0x65, 0x66, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x31, 0x34, 0x33, 0x2f, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x64, 0x6f, 0x77, 0x6e, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x31, 0x34, 0x34, 0x2f, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x75, 0x70, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x31, 0x34, 0x35, 0x2f, 0x67, 0x61, 0x6d, 0x6d, 0x61, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x31, 0x34, 0x36, 0x2f, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x31, 0x34, 0x37, 0x2f, 0x65, 0x70, 0x73, 0x69, 0x6c, 0x6f, 0x6e, 0x20, 0x70, 0x75, 0x74, + 0x0a, 0x64, 0x75, 0x70, 0x20, 0x31, 0x34, 0x38, 0x2f, 0x65, 0x74, 0x61, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x31, 0x34, 0x39, 0x2f, 0x74, 0x68, 0x65, 0x74, 0x61, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x31, 0x35, 0x30, 0x2f, 0x6c, 0x61, 0x6d, 0x62, 0x64, 0x61, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x31, 0x35, 0x31, 0x2f, 0x72, 0x68, 0x6f, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x31, 0x35, 0x32, 0x2f, 0x73, 0x69, 0x67, 0x6d, 0x61, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x31, 0x35, 0x33, 0x2f, 0x74, 0x61, 0x75, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x31, 0x35, 0x34, 0x2f, 0x6f, 0x6d, 0x65, 0x67, 0x61, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x31, 0x35, 0x35, 0x2f, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x31, 0x35, 0x36, 0x2f, 0x50, 0x69, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x31, 0x35, 0x37, 0x2f, 0x4f, 0x6d, 0x65, 0x67, 0x61, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x31, 0x35, 0x38, 0x2f, 0x62, 0x75, 0x6c, 0x6c, 0x65, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x31, 0x35, 0x39, 0x2f, 0x69, 0x6e, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x79, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x31, 0x36, 0x30, 0x2f, 0x6e, 0x6f, 0x6e, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x73, 0x70, 0x61, 0x63, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x31, 0x36, 0x31, 0x2f, 0x65, 0x78, 0x63, 0x6c, 0x61, 0x6d, + 0x64, 0x6f, 0x77, 0x6e, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x31, 0x36, 0x32, 0x2f, 0x63, 0x65, 0x6e, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x31, 0x36, 0x33, 0x2f, 0x73, 0x74, 0x65, 0x72, 0x6c, 0x69, 0x6e, 0x67, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x31, 0x36, 0x34, 0x2f, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x31, 0x36, 0x35, 0x2f, 0x79, 0x65, 0x6e, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x31, 0x36, 0x36, 0x2f, 0x62, 0x72, 0x6f, 0x6b, 0x65, 0x6e, 0x62, 0x61, 0x72, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x31, 0x36, 0x37, 0x2f, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x31, 0x36, 0x38, 0x2f, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x31, 0x36, 0x39, 0x2f, 0x63, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x31, 0x37, 0x30, 0x2f, 0x6f, 0x72, 0x64, 0x66, 0x65, 0x6d, 0x69, 0x6e, 0x69, 0x6e, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x31, 0x37, 0x31, 0x2f, 0x67, 0x75, 0x69, 0x6c, 0x6c, 0x65, 0x6d, 0x6f, 0x74, 0x6c, 0x65, 0x66, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x31, 0x37, 0x32, 0x2f, 0x6c, 0x6f, 0x67, 0x69, 0x63, 0x61, 0x6c, 0x6e, 0x6f, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x31, 0x37, 0x33, 0x2f, 0x75, 0x6e, 0x69, 0x30, 0x30, 0x41, + 0x44, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x31, 0x37, 0x34, 0x2f, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x31, 0x37, 0x35, 0x2f, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x6e, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x31, 0x37, 0x36, 0x2f, 0x64, 0x65, 0x67, 0x72, 0x65, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x31, 0x37, 0x37, 0x2f, 0x70, 0x6c, 0x75, 0x73, 0x6d, 0x69, 0x6e, 0x75, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x31, 0x37, 0x38, 0x2f, 0x74, 0x77, 0x6f, 0x73, 0x75, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x72, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x31, 0x37, 0x39, 0x2f, 0x74, 0x68, 0x72, 0x65, 0x65, 0x73, 0x75, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x72, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x31, 0x38, 0x30, 0x2f, 0x61, 0x63, 0x75, 0x74, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x31, 0x38, 0x31, 0x2f, 0x6d, 0x75, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x31, 0x38, 0x32, 0x2f, 0x70, 0x61, 0x72, 0x61, 0x67, 0x72, 0x61, 0x70, 0x68, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x31, 0x38, 0x33, 0x2f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x65, 0x64, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x31, 0x38, 0x34, 0x2f, 0x63, 0x65, 0x64, 0x69, 0x6c, 0x6c, 0x61, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x31, 0x38, 0x35, 0x2f, 0x6f, 0x6e, 0x65, 0x73, 0x75, 0x70, 0x65, + 0x72, 0x69, 0x6f, 0x72, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x31, 0x38, 0x36, 0x2f, 0x6f, 0x72, 0x64, 0x6d, 0x61, 0x73, 0x63, 0x75, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x31, 0x38, 0x37, 0x2f, 0x67, 0x75, 0x69, 0x6c, 0x6c, 0x65, 0x6d, 0x6f, 0x74, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x31, 0x38, 0x38, 0x2f, 0x6f, 0x6e, 0x65, 0x71, 0x75, 0x61, 0x72, 0x74, 0x65, 0x72, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x31, 0x38, 0x39, 0x2f, 0x6f, 0x6e, 0x65, 0x68, 0x61, 0x6c, 0x66, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x31, 0x39, 0x30, 0x2f, 0x74, 0x68, 0x72, 0x65, 0x65, 0x71, 0x75, 0x61, 0x72, 0x74, 0x65, 0x72, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x31, 0x39, 0x31, 0x2f, 0x71, 0x75, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x64, 0x6f, 0x77, 0x6e, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x31, 0x39, 0x32, 0x2f, 0x41, 0x67, 0x72, 0x61, 0x76, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x31, 0x39, 0x33, 0x2f, 0x41, 0x61, 0x63, 0x75, 0x74, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x31, 0x39, 0x34, 0x2f, 0x41, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, 0x78, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x31, 0x39, 0x35, 0x2f, 0x41, 0x74, 0x69, 0x6c, 0x64, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x31, 0x39, 0x36, 0x2f, 0x41, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x20, 0x70, 0x75, + 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x31, 0x39, 0x37, 0x2f, 0x41, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x31, 0x39, 0x38, 0x2f, 0x41, 0x45, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x31, 0x39, 0x39, 0x2f, 0x43, 0x63, 0x65, 0x64, 0x69, 0x6c, 0x6c, 0x61, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x32, 0x30, 0x30, 0x2f, 0x45, 0x67, 0x72, 0x61, 0x76, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x32, 0x30, 0x31, 0x2f, 0x45, 0x61, 0x63, 0x75, 0x74, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x32, 0x30, 0x32, 0x2f, 0x45, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, 0x78, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x32, 0x30, 0x33, 0x2f, 0x45, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x32, 0x30, 0x34, 0x2f, 0x49, 0x67, 0x72, 0x61, 0x76, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x32, 0x30, 0x35, 0x2f, 0x49, 0x61, 0x63, 0x75, 0x74, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x32, 0x30, 0x36, 0x2f, 0x49, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, 0x78, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x32, 0x30, 0x37, 0x2f, 0x49, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x32, 0x30, 0x38, 0x2f, 0x45, 0x74, 0x68, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x32, 0x30, 0x39, 0x2f, 0x4e, 0x74, 0x69, 0x6c, 0x64, 0x65, 0x20, 0x70, + 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x32, 0x31, 0x30, 0x2f, 0x4f, 0x67, 0x72, 0x61, 0x76, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x32, 0x31, 0x31, 0x2f, 0x4f, 0x61, 0x63, 0x75, 0x74, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x32, 0x31, 0x32, 0x2f, 0x4f, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, 0x78, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x32, 0x31, 0x33, 0x2f, 0x4f, 0x74, 0x69, 0x6c, 0x64, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x32, 0x31, 0x34, 0x2f, 0x4f, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x32, 0x31, 0x35, 0x2f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x79, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x32, 0x31, 0x36, 0x2f, 0x4f, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x32, 0x31, 0x37, 0x2f, 0x55, 0x67, 0x72, 0x61, 0x76, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x32, 0x31, 0x38, 0x2f, 0x55, 0x61, 0x63, 0x75, 0x74, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x32, 0x31, 0x39, 0x2f, 0x55, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, 0x78, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x32, 0x32, 0x30, 0x2f, 0x55, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x32, 0x32, 0x31, 0x2f, 0x59, 0x61, 0x63, 0x75, 0x74, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x32, 0x32, 0x32, + 0x2f, 0x54, 0x68, 0x6f, 0x72, 0x6e, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x32, 0x32, 0x33, 0x2f, 0x62, 0x65, 0x74, 0x61, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x32, 0x32, 0x34, 0x2f, 0x61, 0x67, 0x72, 0x61, 0x76, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x32, 0x32, 0x35, 0x2f, 0x61, 0x61, 0x63, 0x75, 0x74, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x32, 0x32, 0x36, 0x2f, 0x61, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, 0x78, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x32, 0x32, 0x37, 0x2f, 0x61, 0x74, 0x69, 0x6c, 0x64, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x32, 0x32, 0x38, 0x2f, 0x61, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x32, 0x32, 0x39, 0x2f, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x32, 0x33, 0x30, 0x2f, 0x61, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x32, 0x33, 0x31, 0x2f, 0x63, 0x63, 0x65, 0x64, 0x69, 0x6c, 0x6c, 0x61, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x32, 0x33, 0x32, 0x2f, 0x65, 0x67, 0x72, 0x61, 0x76, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x32, 0x33, 0x33, 0x2f, 0x65, 0x61, 0x63, 0x75, 0x74, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x32, 0x33, 0x34, 0x2f, 0x65, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, 0x78, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x32, 0x33, 0x35, 0x2f, 0x65, + 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x32, 0x33, 0x36, 0x2f, 0x69, 0x67, 0x72, 0x61, 0x76, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x32, 0x33, 0x37, 0x2f, 0x69, 0x61, 0x63, 0x75, 0x74, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x32, 0x33, 0x38, 0x2f, 0x69, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, 0x78, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x32, 0x33, 0x39, 0x2f, 0x69, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x32, 0x34, 0x30, 0x2f, 0x65, 0x74, 0x68, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x32, 0x34, 0x31, 0x2f, 0x6e, 0x74, 0x69, 0x6c, 0x64, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x32, 0x34, 0x32, 0x2f, 0x6f, 0x67, 0x72, 0x61, 0x76, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x32, 0x34, 0x33, 0x2f, 0x6f, 0x61, 0x63, 0x75, 0x74, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x32, 0x34, 0x34, 0x2f, 0x6f, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, 0x78, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x32, 0x34, 0x35, 0x2f, 0x6f, 0x74, 0x69, 0x6c, 0x64, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x32, 0x34, 0x36, 0x2f, 0x6f, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x32, 0x34, 0x37, 0x2f, 0x64, 0x69, 0x76, 0x69, 0x64, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, + 0x70, 0x20, 0x32, 0x34, 0x38, 0x2f, 0x6f, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x32, 0x34, 0x39, 0x2f, 0x75, 0x67, 0x72, 0x61, 0x76, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x32, 0x35, 0x30, 0x2f, 0x75, 0x61, 0x63, 0x75, 0x74, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x32, 0x35, 0x31, 0x2f, 0x75, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, 0x78, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x32, 0x35, 0x32, 0x2f, 0x75, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x32, 0x35, 0x33, 0x2f, 0x79, 0x61, 0x63, 0x75, 0x74, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x32, 0x35, 0x34, 0x2f, 0x74, 0x68, 0x6f, 0x72, 0x6e, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x64, 0x75, 0x70, 0x20, 0x32, 0x35, 0x35, 0x2f, 0x79, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0a, 0x72, 0x65, 0x61, 0x64, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x64, 0x65, 0x66, 0x0a, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x64, 0x69, 0x63, 0x74, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x65, 0x65, 0x78, 0x65, 0x63, 0x0a, 0x80, 0x02, 0x88, 0xe1, 0x00, 0x00, 0x74, 0x3f, 0x84, 0x13, 0xf3, 0x63, 0x6c, 0xa8, 0x5a, 0x9f, 0xfe, 0xfb, 0x50, 0xb4, 0xbb, 0x27, 0x30, 0x2a, 0x5d, 0x8f, 0x83, 0x1c, 0x8e, 0x74, 0x03, 0xc0, 0x10, 0x6a, 0x13, 0x2f, 0xf5, 0x9d, 0x98, 0x09, 0x2c, 0x95, 0xdc, 0x41, 0xd4, 0xc9, 0x24, 0x1f, 0x1b, + 0xd1, 0x42, 0x71, 0x8d, 0xbf, 0xc7, 0x99, 0x07, 0x62, 0xd5, 0x70, 0x2d, 0xf0, 0xa9, 0xeb, 0x70, 0x21, 0xa4, 0xe2, 0x96, 0x3a, 0x13, 0x09, 0x2e, 0xe8, 0xce, 0x8d, 0x54, 0x20, 0x16, 0x93, 0xd0, 0x23, 0x65, 0x29, 0x0e, 0xaa, 0x96, 0x62, 0x9c, 0x38, 0x7b, 0x0c, 0x4d, 0x1d, 0x8f, 0x02, 0xeb, 0x5e, 0x20, 0x64, 0x99, 0xe0, 0x40, 0x31, 0x88, 0x7f, 0x3d, 0x83, 0x26, 0xe1, 0xd5, 0x2d, 0xe4, 0x89, 0xda, 0xf6, 0x38, 0x5a, 0x0d, 0xf2, 0xc9, 0x4a, 0x15, 0xe4, 0x8c, 0x4f, 0x20, 0xa9, 0xa6, 0xe4, 0x9e, 0xd4, 0x48, 0x89, 0xe5, 0x2c, 0xb5, 0xc4, 0x2b, 0x50, 0x9b, 0x29, 0xa2, 0xe2, 0x1e, 0x2f, 0x65, 0xed, 0xb8, 0x49, 0x6a, 0x92, 0x80, 0x4f, 0x43, 0xe4, 0x5e, 0x2a, 0x5f, 0x7c, 0x70, 0x1d, 0xc5, 0x25, 0x1f, 0x45, 0x7e, 0x33, 0x8e, 0x2c, 0x67, 0xaf, 0xbf, 0xff, 0xc9, 0xf1, 0xdc, 0x88, 0x9e, 0xe3, 0x1b, 0x6a, 0xc7, 0x0d, 0xff, 0x59, 0x76, 0x6b, 0xc9, 0x55, 0xc3, 0x17, 0xa7, 0x9d, 0x28, 0x36, 0x48, 0x84, 0xcb, 0x3b, 0x14, 0x85, 0xa8, 0xcf, 0x42, 0xf0, 0xeb, 0x33, 0xe3, 0xa8, 0x90, 0x26, 0xb9, 0xbb, 0x30, 0x82, 0xa4, 0x35, 0x7f, 0xcc, 0x5b, 0xc2, 0xfd, 0x65, 0xbd, 0x33, 0x12, 0x1b, 0x1c, 0xd5, 0x8c, 0x34, 0x32, 0xdb, 0x8b, 0x63, 0x63, 0x75, 0x9e, 0x7a, 0x68, 0x31, 0xd3, 0x96, 0x3a, 0xc1, 0x76, 0x3b, 0xb0, 0x52, 0x8c, 0x8b, 0x85, 0xac, 0xb8, 0x46, 0x3e, 0xf1, 0xd6, 0x09, 0x94, 0x75, 0x79, 0x3b, 0xee, 0xc8, 0x43, 0x09, 0xf0, 0x9c, 0x04, 0x2b, 0xcb, 0x83, 0x57, 0x42, 0x20, 0xc4, 0x07, 0xf8, 0x19, 0x73, 0x28, 0xb7, 0xc7, 0xef, 0xb2, 0x87, 0x58, 0x97, 0xf1, 0x2e, 0xaa, 0xb7, 0x6d, 0x4e, 0xb0, 0x1a, 0x35, 0xf0, 0x9a, 0x78, 0x58, 0xc6, 0x78, + 0x37, 0x3d, 0x9e, 0xab, 0xa1, 0xce, 0x93, 0xbb, 0x4e, 0xba, 0x3a, 0xa8, 0xa7, 0x0d, 0x0f, 0x98, 0xd4, 0xea, 0x11, 0x3f, 0xe3, 0x26, 0xa9, 0x98, 0xbd, 0xd7, 0x49, 0xc5, 0x74, 0xc7, 0xe6, 0x76, 0x98, 0xc8, 0x07, 0x07, 0xab, 0x84, 0xc2, 0xe3, 0x08, 0x38, 0x79, 0x52, 0xea, 0x38, 0x2f, 0x26, 0xb8, 0xe4, 0x03, 0xd4, 0x96, 0xf7, 0x53, 0x81, 0x60, 0xc7, 0xe4, 0xb4, 0xf0, 0xb7, 0x79, 0x1e, 0x85, 0x6b, 0xb3, 0x18, 0xf8, 0x8d, 0x59, 0xb7, 0x7f, 0xcf, 0xb2, 0x73, 0xca, 0x2d, 0x68, 0x94, 0xa4, 0x78, 0x5f, 0xcf, 0xe2, 0xad, 0x7a, 0xbd, 0x1e, 0xa1, 0xda, 0xf7, 0x7a, 0xea, 0xe0, 0x11, 0xd3, 0xf8, 0x7d, 0xf0, 0x35, 0x07, 0x0f, 0x4f, 0x4d, 0x9d, 0xc9, 0xa9, 0x43, 0x28, 0xf3, 0x20, 0x73, 0xb4, 0xf2, 0xac, 0x1c, 0xf4, 0xad, 0xcc, 0x1c, 0xc5, 0x74, 0x45, 0xa7, 0x26, 0xc0, 0xeb, 0x6b, 0x04, 0x9a, 0x63, 0x56, 0xbe, 0x8e, 0xfa, 0xdc, 0xc4, 0x63, 0x41, 0x16, 0xe9, 0xe4, 0x59, 0x61, 0x33, 0xb4, 0xd5, 0x1b, 0xa4, 0x42, 0x18, 0xbb, 0x0b, 0xfa, 0x1c, 0x84, 0x36, 0x99, 0x53, 0xfd, 0x3a, 0xc3, 0xa0, 0xb9, 0xc1, 0xf8, 0x49, 0xb6, 0x57, 0x63, 0xec, 0x9b, 0xaa, 0x6c, 0x71, 0x80, 0x5b, 0x90, 0xf2, 0x08, 0x71, 0xce, 0x13, 0x20, 0x5d, 0x39, 0x45, 0x76, 0x74, 0xb7, 0x10, 0xa0, 0xd5, 0x02, 0x74, 0x69, 0x8f, 0xf9, 0x37, 0x4e, 0xd2, 0x9d, 0x6e, 0x0c, 0x7b, 0xb8, 0xcb, 0xaa, 0x5e, 0x83, 0xfe, 0x36, 0x15, 0x80, 0xdd, 0xfb, 0x5a, 0x57, 0xf1, 0x50, 0x06, 0x2d, 0xb0, 0x9d, 0x6b, 0x89, 0x7a, 0x53, 0x0a, 0x1c, 0xa1, 0x22, 0xba, 0x6b, 0x07, 0xef, 0x55, 0x21, 0x8f, 0xb5, 0x66, 0x56, 0x65, 0xd7, 0xb4, 0x91, 0x14, 0x39, 0x0c, 0x6e, 0x89, 0x99, 0xc1, 0xc1, 0xf2, + 0xa6, 0x68, 0x54, 0x1e, 0xe8, 0x66, 0x87, 0x66, 0x8b, 0x29, 0xfc, 0x88, 0x46, 0xc9, 0x88, 0xdb, 0x39, 0x58, 0xa2, 0x18, 0xdd, 0xa6, 0xf2, 0xb5, 0xfd, 0xea, 0x28, 0x20, 0x4f, 0x50, 0x7e, 0x6c, 0x13, 0x7a, 0x45, 0x1f, 0xdb, 0x2f, 0x3b, 0xf9, 0x62, 0xdd, 0xa8, 0x2a, 0x51, 0xe1, 0x5f, 0x64, 0xb1, 0x25, 0xfe, 0xa7, 0x23, 0x81, 0xe2, 0x9f, 0xf5, 0xb5, 0x79, 0x8b, 0x85, 0x1a, 0xac, 0x3d, 0x17, 0x07, 0x3b, 0xd0, 0x0c, 0x6d, 0x14, 0x79, 0xd8, 0x97, 0x6c, 0x79, 0x1c, 0x51, 0xd0, 0x3d, 0x0a, 0xc5, 0x7d, 0x77, 0x84, 0x84, 0x92, 0x98, 0xe7, 0xd6, 0xbd, 0x97, 0x56, 0x26, 0x55, 0x0f, 0x84, 0x11, 0x1d, 0x3b, 0x16, 0x34, 0x5e, 0x2e, 0x69, 0x01, 0xfe, 0x99, 0x7e, 0x83, 0x01, 0xf9, 0x52, 0x66, 0xb8, 0xb0, 0x9d, 0x9a, 0x07, 0x2d, 0x98, 0x24, 0x4f, 0x6c, 0xfb, 0xef, 0xcf, 0x9b, 0x59, 0xe0, 0xf4, 0x3b, 0xbe, 0xe0, 0x0b, 0xb7, 0xd7, 0x2d, 0x21, 0xaf, 0x0c, 0xa2, 0xab, 0xe1, 0x5e, 0x68, 0xa9, 0xa0, 0x51, 0x76, 0xcf, 0x41, 0x11, 0xcb, 0x27, 0xc5, 0x4b, 0xc8, 0xb4, 0xbb, 0xe3, 0x37, 0x4c, 0xec, 0x13, 0x45, 0x39, 0xb1, 0x4a, 0x4b, 0x3c, 0x4e, 0xd8, 0x01, 0xfe, 0x59, 0x67, 0x29, 0xe8, 0x62, 0xae, 0xd4, 0x8b, 0xb0, 0xf5, 0x28, 0x7a, 0xab, 0x77, 0x25, 0xe1, 0x9e, 0x81, 0xe6, 0x6b, 0x03, 0xc9, 0xed, 0x3f, 0x75, 0xa1, 0x1d, 0x1a, 0xa3, 0x8b, 0x25, 0xa3, 0x56, 0x38, 0xba, 0x65, 0x33, 0x14, 0xb7, 0x3e, 0x8d, 0x48, 0x11, 0xa8, 0xfc, 0x92, 0x9a, 0xad, 0x69, 0x11, 0xda, 0xa8, 0x6b, 0x87, 0x2e, 0x52, 0x13, 0xcb, 0xcb, 0x4d, 0xbd, 0x18, 0x38, 0xfb, 0xb1, 0xfb, 0xbf, 0x12, 0x4b, 0xf0, 0xb1, 0x08, 0x91, 0xbc, 0x1f, 0xbf, 0x5e, 0xea, 0xba, 0x4a, 0x0e, + 0xc1, 0x07, 0xe9, 0x51, 0x01, 0xdd, 0xda, 0x66, 0x89, 0x15, 0xa9, 0x83, 0xd2, 0x16, 0x78, 0x21, 0xb3, 0x7b, 0x41, 0x46, 0x5d, 0xcb, 0x45, 0xd1, 0xe6, 0xa6, 0x09, 0x4b, 0xaf, 0x8e, 0x88, 0x90, 0xf6, 0xe4, 0x0f, 0xa0, 0x9c, 0x0c, 0xa9, 0x55, 0xf3, 0x11, 0xd6, 0x90, 0x10, 0x53, 0x9f, 0x96, 0xbc, 0xdc, 0xd1, 0xd9, 0x17, 0xcb, 0x49, 0x88, 0xae, 0xae, 0xf7, 0xcb, 0xc6, 0x42, 0xf6, 0xe4, 0x47, 0xc4, 0x1e, 0x6a, 0x4c, 0x98, 0x96, 0xf9, 0x6c, 0x53, 0xde, 0xe4, 0x62, 0xdc, 0x1a, 0x39, 0xed, 0x2f, 0xbd, 0x7d, 0xef, 0x97, 0xf8, 0xb3, 0x2c, 0x53, 0x0c, 0xe7, 0x96, 0xa9, 0x4f, 0x81, 0xc5, 0x06, 0x4f, 0xb2, 0xcf, 0x73, 0xa7, 0xe3, 0xbe, 0x87, 0x39, 0x92, 0xe2, 0xe4, 0xcd, 0x58, 0x70, 0xa1, 0x02, 0xe8, 0x62, 0x30, 0xce, 0x1f, 0x18, 0x89, 0xb1, 0x67, 0xfe, 0x02, 0x14, 0xb6, 0xe6, 0x13, 0x4f, 0x3f, 0xf8, 0xbc, 0x36, 0x59, 0xbe, 0x2f, 0x0a, 0x01, 0x32, 0x6a, 0x91, 0xe3, 0x6a, 0xff, 0xfe, 0xa0, 0x0a, 0xa4, 0x9e, 0x26, 0x92, 0xbd, 0xc1, 0x77, 0x26, 0x4a, 0x1c, 0xb4, 0x88, 0x0d, 0x1b, 0x8b, 0x3b, 0x23, 0x15, 0x04, 0xc3, 0x43, 0xfa, 0x03, 0xdc, 0x7c, 0xa8, 0xec, 0x1c, 0xe8, 0x30, 0xb7, 0x78, 0x2c, 0xe9, 0x87, 0xaf, 0x02, 0x32, 0x49, 0x16, 0xc5, 0xba, 0x19, 0xf0, 0x19, 0x57, 0xa7, 0xa0, 0xe1, 0x34, 0x8c, 0x9a, 0xba, 0x06, 0x26, 0x03, 0x22, 0x6d, 0x80, 0x04, 0x38, 0x0a, 0x57, 0x40, 0x9f, 0x7f, 0xbd, 0x05, 0x7e, 0x6b, 0x75, 0xc3, 0x9a, 0x66, 0x70, 0x35, 0x9f, 0x27, 0xe1, 0x18, 0xe6, 0x73, 0x79, 0x7e, 0xef, 0x86, 0xa0, 0xe7, 0x7e, 0x80, 0x9c, 0x4b, 0xbe, 0xe6, 0xc8, 0x23, 0xdb, 0xa4, 0x89, 0xd7, 0x5f, 0xce, 0xb5, 0x5c, 0xe6, 0xa0, 0x19, + 0x1b, 0xe7, 0x45, 0x32, 0xc7, 0x55, 0xdb, 0x61, 0xbb, 0x64, 0xa0, 0x7a, 0x1c, 0x3e, 0xf4, 0x40, 0x47, 0x5e, 0xf5, 0x82, 0x9d, 0xdf, 0xfb, 0x1e, 0x67, 0x64, 0xf2, 0x8c, 0xb8, 0xca, 0x4f, 0xae, 0xdc, 0x8d, 0xb3, 0x06, 0xdb, 0xf4, 0xd2, 0x60, 0x22, 0x22, 0x32, 0x62, 0xc4, 0x93, 0x3c, 0xf1, 0xb2, 0x3b, 0x95, 0x5d, 0xd5, 0x04, 0x0e, 0xfa, 0x62, 0x64, 0xef, 0x52, 0x8d, 0x57, 0xeb, 0xfe, 0x31, 0xd2, 0x22, 0x4e, 0xcd, 0x87, 0x65, 0x51, 0xef, 0x8a, 0x8f, 0xde, 0x70, 0xbd, 0xd5, 0xcd, 0x50, 0xfb, 0x8d, 0x96, 0x82, 0x5d, 0x98, 0xeb, 0x76, 0xa7, 0xed, 0xac, 0x6e, 0x93, 0x53, 0xb0, 0x76, 0xb4, 0x7b, 0x32, 0xd4, 0x92, 0x9b, 0x70, 0x7e, 0xed, 0xd8, 0xfb, 0xd6, 0x6f, 0x40, 0xa6, 0xe1, 0x86, 0xca, 0x7d, 0xed, 0x91, 0x60, 0x5d, 0xbe, 0xbb, 0x39, 0xa4, 0x0b, 0xc7, 0xa6, 0x7a, 0x96, 0x5f, 0x6e, 0x34, 0x10, 0x4a, 0xdd, 0x77, 0x62, 0x85, 0x60, 0xc6, 0xd5, 0x36, 0x7a, 0x0c, 0xb8, 0xba, 0xd7, 0x0c, 0xe8, 0x68, 0x5b, 0x2b, 0x2f, 0x68, 0xe0, 0x54, 0xb7, 0x7d, 0x0d, 0xf5, 0x49, 0x2a, 0xbd, 0x64, 0x10, 0x1e, 0x4c, 0xa4, 0x81, 0x79, 0x80, 0x55, 0x28, 0x8f, 0xec, 0x4a, 0x31, 0x04, 0xeb, 0x12, 0x89, 0x71, 0x2f, 0xb7, 0x4c, 0xe6, 0xc3, 0x7b, 0x21, 0x92, 0x63, 0xc0, 0x97, 0x78, 0xe1, 0x8a, 0x61, 0x9b, 0x1c, 0x43, 0x84, 0x20, 0x60, 0x39, 0xa8, 0xf9, 0x4f, 0x4b, 0xdd, 0xea, 0x98, 0xb1, 0x8b, 0x92, 0xde, 0x33, 0x17, 0x09, 0x52, 0x11, 0x3e, 0xce, 0xae, 0xc0, 0xaa, 0xe1, 0xf2, 0xa9, 0x26, 0x98, 0x6f, 0x00, 0x0b, 0x30, 0x2c, 0xee, 0x07, 0xcf, 0x39, 0x6b, 0xbe, 0xd0, 0xd4, 0xa1, 0x3f, 0xad, 0x3b, 0x7a, 0xed, 0x44, 0x89, 0x30, 0x4f, 0x69, 0x1a, 0xb6, + 0x4f, 0x51, 0x86, 0xc2, 0x45, 0x79, 0x64, 0x3e, 0x65, 0xae, 0x69, 0x86, 0x00, 0xa7, 0xa6, 0x69, 0x99, 0xe6, 0x92, 0x41, 0x49, 0x60, 0x92, 0xbd, 0x85, 0x3f, 0xf4, 0x99, 0x08, 0x3e, 0xe4, 0x57, 0xd7, 0xbc, 0x64, 0x52, 0xb1, 0x01, 0x99, 0x21, 0x1e, 0xb1, 0x18, 0x25, 0x62, 0x03, 0x37, 0xaa, 0xbb, 0x28, 0xe9, 0xb3, 0x34, 0xb6, 0x60, 0x1e, 0x91, 0x62, 0x6d, 0x47, 0x6f, 0x09, 0x24, 0xad, 0x18, 0xf7, 0x69, 0x32, 0x92, 0x91, 0x49, 0xf6, 0xe3, 0xf6, 0x97, 0xd4, 0x3f, 0x46, 0x5e, 0x99, 0x2e, 0xe3, 0x60, 0x1a, 0x34, 0x9b, 0x08, 0xd1, 0x78, 0x06, 0xfc, 0x58, 0x0a, 0x0d, 0xdf, 0xc3, 0x44, 0x2c, 0x29, 0x0f, 0xab, 0xbf, 0x0e, 0x28, 0x22, 0x67, 0xca, 0x3d, 0xd4, 0xf3, 0xfb, 0xf8, 0xa1, 0x2f, 0x55, 0x0f, 0x9d, 0xfd, 0x27, 0x9d, 0xdd, 0x28, 0xfd, 0x01, 0x8c, 0x98, 0x6c, 0x6f, 0x16, 0x9b, 0x66, 0x54, 0xbf, 0x77, 0xa7, 0x12, 0xab, 0x53, 0x30, 0xfa, 0x83, 0x42, 0x8f, 0x2d, 0x02, 0x41, 0x6b, 0xca, 0x3d, 0xbf, 0x67, 0x1d, 0x8e, 0x8a, 0xc9, 0x3c, 0x1f, 0x8e, 0x32, 0x3b, 0xa9, 0x19, 0x7f, 0xfe, 0x70, 0x7d, 0xb0, 0x8c, 0x53, 0x4d, 0x96, 0x6d, 0x58, 0x2c, 0xaa, 0x15, 0x01, 0x6f, 0xf5, 0xaf, 0xd6, 0xe5, 0x11, 0x04, 0x91, 0xbd, 0x59, 0x96, 0xd4, 0xc6, 0x14, 0x77, 0xef, 0xbe, 0xa7, 0x13, 0x96, 0xfe, 0x04, 0xc7, 0x2c, 0xff, 0x31, 0x3b, 0xdc, 0x55, 0x41, 0x21, 0x03, 0x2f, 0xa5, 0xcc, 0xed, 0xb8, 0xc1, 0x6b, 0xa6, 0x3f, 0xb9, 0xe4, 0xdb, 0xef, 0x2f, 0xcf, 0x73, 0x32, 0xd0, 0xc6, 0xaf, 0x39, 0x56, 0xa7, 0xb0, 0x96, 0x75, 0xd7, 0xa1, 0x9f, 0x02, 0xf7, 0x6c, 0x36, 0xe5, 0x2d, 0x2b, 0x35, 0xe9, 0x86, 0x58, 0x89, 0x63, 0x08, 0xd1, 0x5f, 0x4a, 0xd3, + 0xde, 0xb4, 0x0b, 0xf0, 0xe4, 0x0c, 0x0a, 0x79, 0x86, 0x3e, 0x63, 0x5e, 0x84, 0xcd, 0x26, 0x46, 0xca, 0x10, 0xec, 0xb1, 0x05, 0x43, 0xf5, 0x02, 0x2d, 0x22, 0x03, 0xbe, 0x76, 0xa2, 0xe3, 0xc2, 0x1e, 0xd8, 0x1f, 0x75, 0x75, 0xa6, 0xeb, 0x3e, 0x5d, 0x63, 0x43, 0x51, 0x2f, 0x6a, 0x63, 0x85, 0xa2, 0xd5, 0x6b, 0xf5, 0x55, 0x31, 0x7f, 0x77, 0xff, 0x33, 0xbe, 0x97, 0x9e, 0x81, 0xdd, 0xc6, 0x1d, 0x9a, 0xfc, 0xd0, 0x9a, 0xeb, 0x07, 0x70, 0x0d, 0x37, 0xf5, 0xff, 0x9b, 0x4e, 0x90, 0x25, 0x37, 0xae, 0x63, 0x1f, 0x8b, 0xb7, 0x23, 0x9c, 0xfd, 0xcb, 0x85, 0x05, 0x3b, 0xbc, 0x7a, 0x8e, 0xe8, 0xe2, 0xa2, 0x38, 0x44, 0xc2, 0xdc, 0x51, 0xac, 0x1d, 0xb6, 0xa3, 0x14, 0x9a, 0xc6, 0x26, 0xbe, 0xb7, 0x5a, 0x50, 0x67, 0x8a, 0x63, 0x15, 0x2c, 0x76, 0x17, 0xe4, 0x69, 0x7d, 0x64, 0x51, 0x5d, 0x2b, 0xc3, 0x1a, 0x90, 0x9f, 0x07, 0x10, 0xdf, 0x72, 0xe9, 0x7a, 0xe4, 0x3c, 0xe5, 0x30, 0x3c, 0x2a, 0xb3, 0x44, 0x50, 0xc0, 0x0d, 0x4e, 0x4e, 0x9e, 0x72, 0x9e, 0x6f, 0xc3, 0x04, 0x17, 0x0c, 0xc5, 0x3b, 0x6f, 0xa5, 0x1a, 0xb6, 0xa4, 0xbd, 0x49, 0xd3, 0x9a, 0x36, 0x0c, 0xc9, 0xcf, 0x3b, 0x2b, 0xe0, 0xcc, 0x58, 0x47, 0xfd, 0x65, 0xc8, 0x2a, 0xdd, 0xe6, 0x1c, 0x8e, 0x05, 0xb3, 0x44, 0xaf, 0xb9, 0x22, 0xbf, 0x34, 0x9b, 0x59, 0x62, 0x05, 0xc7, 0x5a, 0xdb, 0x45, 0x88, 0xb8, 0x2b, 0x3a, 0xa4, 0x5d, 0x86, 0x88, 0x96, 0xe7, 0xce, 0x90, 0x07, 0x3e, 0x12, 0x78, 0x57, 0x59, 0x06, 0xed, 0x7b, 0x43, 0xd2, 0xf0, 0xf7, 0x6c, 0xb9, 0x60, 0xf3, 0xd2, 0xd1, 0x08, 0x16, 0xe4, 0x04, 0x72, 0xfd, 0x0e, 0x6e, 0xc9, 0xaa, 0xa9, 0xe1, 0x4a, 0x60, 0x1d, 0xfc, 0x97, 0xfd, 0x6c, + 0x13, 0x8e, 0xd0, 0xbc, 0x21, 0x6d, 0xa1, 0x27, 0x83, 0x7f, 0xf0, 0xa8, 0xa6, 0xe3, 0x4b, 0xa9, 0xd4, 0x0d, 0x28, 0x67, 0x0e, 0x6a, 0x59, 0x6e, 0xd8, 0x00, 0x8b, 0xac, 0x4f, 0x08, 0x72, 0xe3, 0x5a, 0x03, 0x37, 0x66, 0x43, 0x15, 0xbe, 0x16, 0xa5, 0x5a, 0xc8, 0x83, 0x94, 0xe6, 0xcd, 0x9f, 0x05, 0xe5, 0xfb, 0xb2, 0x9d, 0x33, 0x3b, 0xa6, 0x1f, 0x16, 0xdb, 0x63, 0x95, 0x3d, 0x5e, 0x6f, 0xf4, 0x13, 0x50, 0xc8, 0x9a, 0xa9, 0xaf, 0x36, 0xf9, 0xc9, 0x37, 0xce, 0x78, 0xaf, 0xe0, 0x14, 0xa8, 0x1f, 0xda, 0x23, 0xd9, 0x82, 0x6c, 0x63, 0x9e, 0xf9, 0xc4, 0x9c, 0x5b, 0xaf, 0xf9, 0x9e, 0xbd, 0xa0, 0x47, 0x92, 0xf3, 0xbd, 0xae, 0x0c, 0x91, 0x32, 0xa7, 0x97, 0x06, 0x80, 0x56, 0x5c, 0x11, 0x23, 0x99, 0x14, 0x8f, 0xf5, 0x23, 0xd6, 0xcb, 0xa7, 0x73, 0x6a, 0xfb, 0x10, 0x85, 0xaf, 0xf2, 0xb5, 0xb4, 0x61, 0x96, 0xa4, 0x8f, 0x57, 0x1f, 0xa3, 0x32, 0x76, 0xfd, 0x0a, 0xb1, 0x04, 0x9d, 0x4d, 0x1a, 0xd5, 0xbe, 0xe1, 0xb0, 0x78, 0x3b, 0x82, 0x6b, 0x6e, 0xbc, 0x7d, 0xc0, 0xe5, 0xbe, 0x9b, 0xcc, 0x11, 0xe2, 0x33, 0x8c, 0xc7, 0x97, 0x13, 0x1b, 0xac, 0x8e, 0x48, 0x03, 0x3b, 0x7e, 0x19, 0x2d, 0x08, 0xb7, 0xeb, 0xa1, 0x37, 0xb7, 0xaf, 0xe1, 0x47, 0x0e, 0xf1, 0x26, 0x11, 0x6f, 0xc6, 0xc0, 0x17, 0x90, 0xcf, 0xa3, 0x16, 0x2f, 0x19, 0xce, 0xcc, 0x82, 0x78, 0x59, 0xa9, 0x58, 0x11, 0x9a, 0x84, 0xe5, 0x6d, 0xb6, 0x90, 0x2e, 0x33, 0x78, 0x6e, 0x90, 0x1f, 0x8f, 0x82, 0x89, 0x6b, 0x9d, 0x26, 0x2e, 0xe5, 0x61, 0x5f, 0xe0, 0xf0, 0x77, 0xdb, 0xeb, 0xf8, 0x31, 0xd5, 0xf3, 0x18, 0xc5, 0xb6, 0xe0, 0x86, 0xc0, 0x52, 0x85, 0x56, 0x41, 0x8f, 0xb6, 0x1f, 0x58, 0x88, + 0xa1, 0x24, 0x0c, 0x24, 0x8c, 0x29, 0x8c, 0xa9, 0x08, 0x3e, 0x12, 0x09, 0x0b, 0xc2, 0x3b, 0x28, 0x8b, 0xd6, 0xb7, 0x86, 0x2d, 0x86, 0xf8, 0x0c, 0x21, 0xd6, 0x61, 0xb9, 0xf3, 0x47, 0xb2, 0x2d, 0x36, 0xcf, 0x7e, 0x3c, 0xce, 0xc6, 0x11, 0x04, 0x17, 0x97, 0xca, 0x36, 0x65, 0x32, 0x45, 0xde, 0x30, 0x33, 0x1e, 0x8c, 0x52, 0xed, 0x8e, 0xac, 0x15, 0x14, 0x07, 0xa2, 0xa5, 0x2e, 0xad, 0x6d, 0x0e, 0x16, 0x5e, 0x29, 0xb7, 0x0c, 0xc9, 0x55, 0xaa, 0x11, 0x08, 0x28, 0xd0, 0x8f, 0x95, 0x6b, 0xce, 0x56, 0xbe, 0x26, 0xb5, 0xbb, 0xa7, 0x52, 0x91, 0x71, 0xf9, 0xf6, 0x49, 0xc3, 0x51, 0x25, 0xfe, 0xbb, 0xc7, 0x84, 0xe5, 0x48, 0x5a, 0x1e, 0xca, 0x18, 0x7a, 0xb3, 0xc3, 0x0c, 0xa5, 0xdd, 0x58, 0xe4, 0xf4, 0xdd, 0x31, 0x38, 0x54, 0xfc, 0x26, 0xb9, 0x42, 0x48, 0xc7, 0xba, 0x37, 0x9d, 0x76, 0xd4, 0x32, 0x5c, 0x33, 0xf5, 0x4c, 0x93, 0x75, 0x0e, 0xb4, 0xc5, 0x08, 0x0a, 0x69, 0xb8, 0x1e, 0xee, 0x11, 0x2f, 0x35, 0x5f, 0x27, 0x8b, 0xdf, 0x48, 0x59, 0x52, 0x0d, 0x44, 0x90, 0x55, 0xec, 0x86, 0x7c, 0xe1, 0x94, 0x1f, 0x11, 0x07, 0xae, 0x17, 0x8c, 0xbd, 0x4f, 0xd4, 0xa7, 0x1a, 0x6e, 0x08, 0x93, 0xea, 0x61, 0xdf, 0xc9, 0x57, 0x61, 0x9f, 0x0c, 0x6c, 0x41, 0xa2, 0xd0, 0x7b, 0x56, 0x40, 0x0b, 0xb1, 0xb1, 0x00, 0x13, 0xde, 0x51, 0xaf, 0x36, 0xf6, 0xa5, 0xf1, 0x86, 0x76, 0x38, 0x5c, 0x30, 0x68, 0xe2, 0x50, 0x46, 0xc9, 0x90, 0xae, 0x05, 0xf3, 0xef, 0x55, 0xe3, 0xb6, 0x44, 0xd9, 0xfa, 0x29, 0x35, 0x80, 0x3a, 0x86, 0x24, 0x75, 0x84, 0xbc, 0xf9, 0x3f, 0x23, 0x00, 0x39, 0x2a, 0xe3, 0x40, 0x09, 0x4f, 0xb4, 0xff, 0x13, 0xf3, 0x03, 0x45, 0x8c, 0x30, 0xcc, 0x59, + 0xfd, 0xde, 0xd6, 0x69, 0x7d, 0x33, 0xa0, 0xe4, 0x3f, 0xf7, 0x69, 0xf6, 0x92, 0xd8, 0xb7, 0xf6, 0xac, 0xc5, 0x55, 0x26, 0x1f, 0xcb, 0x98, 0x85, 0x7a, 0x6b, 0x69, 0x99, 0x42, 0x91, 0x83, 0x06, 0x38, 0x94, 0x9b, 0xed, 0x42, 0x33, 0x87, 0xda, 0x2d, 0x45, 0x5a, 0x3c, 0x9d, 0x9a, 0x53, 0xf0, 0x29, 0x35, 0xd8, 0xc3, 0xb8, 0xbb, 0xb0, 0x3c, 0xa1, 0x0b, 0x8c, 0x60, 0xe2, 0x65, 0x45, 0x1c, 0x80, 0x4c, 0x60, 0x31, 0xb2, 0x55, 0x89, 0xd9, 0x3c, 0xe3, 0xe8, 0x12, 0x2c, 0x27, 0x87, 0x1e, 0xe7, 0x9f, 0x79, 0x3a, 0xd6, 0xb7, 0xba, 0x08, 0x79, 0x77, 0xe4, 0xa8, 0x2f, 0x67, 0xb8, 0x3d, 0x4b, 0x05, 0x8e, 0x64, 0x7a, 0x65, 0xc4, 0x6e, 0xac, 0x7f, 0x1a, 0x74, 0x55, 0x1b, 0x10, 0x4c, 0x7e, 0xef, 0x05, 0xf0, 0x57, 0x9b, 0x20, 0x3e, 0x07, 0x38, 0x91, 0x2e, 0x10, 0x26, 0xba, 0xc3, 0x24, 0x35, 0x7f, 0x27, 0x9b, 0x86, 0xf6, 0xd5, 0xed, 0x8b, 0xcd, 0x2f, 0x47, 0xb0, 0xdd, 0x75, 0xb9, 0x88, 0x9f, 0x1b, 0x01, 0xb6, 0x11, 0xa5, 0x4b, 0x19, 0xf8, 0x84, 0x71, 0x12, 0xba, 0xc9, 0xd0, 0x8e, 0xf9, 0x9b, 0x4a, 0x1d, 0x9e, 0xcf, 0xfb, 0xad, 0x79, 0x44, 0x1c, 0x1b, 0xc1, 0xbb, 0x5d, 0xab, 0x5e, 0x2f, 0xb1, 0xe6, 0x1c, 0x13, 0xcc, 0x12, 0xdc, 0x7a, 0x75, 0xd9, 0xe2, 0x8f, 0x7e, 0x8d, 0x0a, 0x55, 0x9d, 0x72, 0x47, 0x10, 0x77, 0xd5, 0x28, 0xe9, 0xce, 0x05, 0x6f, 0xb6, 0x05, 0x2a, 0xab, 0x76, 0xe8, 0xaf, 0xc5, 0xa5, 0x26, 0x83, 0x3c, 0xf3, 0x7f, 0x37, 0x0e, 0xc0, 0xbc, 0x0b, 0x09, 0x2b, 0x0d, 0xac, 0xc7, 0xe9, 0xfb, 0x06, 0xcf, 0xfb, 0x57, 0x6c, 0x30, 0xba, 0x5e, 0xd5, 0x57, 0x2d, 0x97, 0x30, 0xa1, 0xd3, 0x15, 0x26, 0xa7, 0x1e, 0xed, 0xa5, 0x48, 0xae, + 0x1a, 0xf2, 0xbd, 0xd2, 0xdb, 0x90, 0xbd, 0x0e, 0xfb, 0x71, 0x4e, 0xb0, 0x62, 0xf6, 0x26, 0x36, 0xa5, 0xfc, 0xc4, 0xf8, 0xa7, 0x60, 0x9e, 0x96, 0x49, 0x53, 0x7b, 0x62, 0x0a, 0x5c, 0x9e, 0x25, 0x4d, 0x38, 0x18, 0xeb, 0xf7, 0x8c, 0xef, 0x81, 0x02, 0xd2, 0x1f, 0xa5, 0x71, 0xd5, 0x71, 0xbc, 0x01, 0x48, 0x42, 0x31, 0xfa, 0x02, 0x08, 0x86, 0xc6, 0x0a, 0x4c, 0x4d, 0x25, 0xab, 0x0f, 0xe9, 0x18, 0x2f, 0x26, 0x7f, 0x7e, 0x81, 0x75, 0xcd, 0x93, 0x3b, 0x36, 0xaf, 0x88, 0x2f, 0x64, 0xd6, 0x9c, 0x58, 0x2c, 0x79, 0x4c, 0x4c, 0x74, 0x48, 0x6f, 0x4c, 0xb1, 0x37, 0x28, 0x77, 0xfa, 0xa8, 0xd8, 0xac, 0x5b, 0x3c, 0xb0, 0x33, 0xf9, 0x2f, 0x4c, 0x24, 0xcf, 0xa8, 0x2b, 0xfc, 0x95, 0xfa, 0x54, 0xf8, 0x26, 0x2e, 0xd2, 0x99, 0x95, 0xd4, 0xa4, 0x0c, 0x9e, 0xab, 0x87, 0xe7, 0x34, 0x84, 0x08, 0xb8, 0x0a, 0x29, 0x6d, 0x59, 0xd7, 0x7e, 0x8f, 0xdc, 0x46, 0x8c, 0x38, 0xb7, 0xf6, 0x11, 0x3b, 0x70, 0x58, 0x81, 0xdb, 0x22, 0x48, 0xbb, 0x98, 0xee, 0xc2, 0xa7, 0xa6, 0x12, 0x6e, 0xbe, 0x61, 0x8d, 0x86, 0x13, 0x75, 0xed, 0x41, 0x5a, 0xfb, 0x8d, 0x10, 0xfa, 0x0e, 0x8d, 0x97, 0xcf, 0x9a, 0x30, 0x3f, 0xcd, 0x55, 0x8e, 0x33, 0xc2, 0x43, 0x44, 0xcf, 0x36, 0xac, 0xa3, 0x1f, 0x81, 0x1f, 0x14, 0x72, 0x97, 0x9f, 0xbd, 0x5c, 0xda, 0xb9, 0xac, 0x61, 0x8b, 0x36, 0xb8, 0x17, 0xe2, 0x98, 0x9f, 0xb7, 0xb7, 0x5e, 0x98, 0xa1, 0x9e, 0x0a, 0xf9, 0x16, 0x0e, 0x15, 0xcf, 0xb9, 0x42, 0x56, 0x77, 0x2f, 0x9d, 0x27, 0x08, 0xd4, 0x08, 0xbd, 0x07, 0x6f, 0x65, 0x92, 0x71, 0x5a, 0x17, 0x04, 0x46, 0x9f, 0x06, 0x6c, 0x0d, 0x14, 0x4c, 0x51, 0x06, 0x5b, 0x48, 0x45, 0x7d, 0xb3, 0x96, + 0xb7, 0x76, 0x84, 0x59, 0x46, 0x49, 0xb8, 0x17, 0x42, 0x2d, 0x8a, 0x5d, 0x28, 0x5c, 0xd1, 0xa5, 0x6d, 0x8b, 0x32, 0x74, 0x2b, 0x7a, 0x35, 0x0d, 0xeb, 0xf1, 0x1b, 0x4d, 0x38, 0x94, 0x3f, 0x8d, 0x03, 0xa9, 0x9f, 0x9c, 0x7f, 0x2a, 0x08, 0xd9, 0x85, 0x0d, 0xc6, 0xb2, 0x48, 0xd5, 0x5c, 0xf1, 0x8d, 0x0a, 0x9d, 0x7a, 0xbd, 0x27, 0x20, 0xbb, 0x9f, 0x7b, 0xe1, 0x3b, 0x6b, 0x40, 0xc6, 0x7f, 0xbe, 0x70, 0x8e, 0x61, 0xe6, 0x93, 0x2f, 0x84, 0xe7, 0x0f, 0xa9, 0xc3, 0x5f, 0x58, 0x21, 0xa2, 0x5c, 0x0c, 0xc1, 0x7e, 0x76, 0x9f, 0x38, 0x09, 0x9f, 0x9f, 0x11, 0xc0, 0xf1, 0x46, 0x9f, 0x30, 0x70, 0x47, 0x47, 0xf4, 0xd2, 0xe5, 0x25, 0x47, 0xe9, 0x09, 0xae, 0xde, 0x76, 0xcd, 0x09, 0xc4, 0x0c, 0xd8, 0x82, 0xae, 0x71, 0xe1, 0x1f, 0x9b, 0x19, 0xb0, 0xaf, 0xc3, 0x4c, 0xd3, 0xad, 0xdd, 0x7a, 0x69, 0x41, 0xec, 0x1e, 0xa6, 0xf8, 0xba, 0x96, 0xdd, 0x81, 0x5d, 0xe6, 0xc5, 0x33, 0xef, 0xf9, 0x14, 0xe3, 0x75, 0xf5, 0x2e, 0x6e, 0x8a, 0xf7, 0xe0, 0x6f, 0xb8, 0x55, 0x41, 0xc7, 0xa6, 0x9c, 0xd3, 0xe3, 0x92, 0x36, 0x85, 0x17, 0x7a, 0x60, 0xfa, 0xf9, 0xff, 0x35, 0x0f, 0x2d, 0x0d, 0x69, 0xaf, 0x47, 0x79, 0xdf, 0xe3, 0x15, 0x99, 0x87, 0x81, 0xdf, 0xac, 0x0c, 0xde, 0x08, 0x76, 0x1a, 0x89, 0x0b, 0x39, 0x3f, 0xf6, 0xa5, 0x3f, 0x34, 0x06, 0x0d, 0x9d, 0x84, 0x68, 0xdb, 0x7b, 0x84, 0x34, 0x1e, 0x68, 0x2e, 0x91, 0x6b, 0x48, 0x39, 0x08, 0xca, 0x8b, 0xf2, 0xda, 0xd3, 0x61, 0x43, 0x09, 0x35, 0x52, 0xd1, 0x5c, 0x41, 0x9c, 0x8a, 0x91, 0x23, 0xd0, 0xc1, 0x8c, 0xc9, 0x48, 0xf7, 0x7b, 0x41, 0xdf, 0x8b, 0xa7, 0xd1, 0x9e, 0x92, 0x0b, 0xbb, 0xc6, 0xd9, 0x70, 0x19, 0x8c, + 0x5c, 0x3a, 0x0d, 0x1d, 0x83, 0x2f, 0xc1, 0x27, 0xe0, 0x1b, 0x9d, 0xc5, 0x40, 0xe4, 0xe0, 0x78, 0x5b, 0x38, 0x15, 0xee, 0x31, 0x07, 0xfb, 0x52, 0x78, 0x43, 0x6d, 0x85, 0x6a, 0x82, 0x74, 0xf2, 0x76, 0x0f, 0xcc, 0x92, 0x0e, 0xf6, 0x00, 0x3b, 0xcb, 0x83, 0x41, 0x60, 0x96, 0xbc, 0x09, 0x40, 0x81, 0xcf, 0x19, 0xdc, 0x0e, 0x5d, 0x04, 0x9a, 0x07, 0xdd, 0x9f, 0xbe, 0x7b, 0x07, 0xca, 0xfa, 0x8a, 0x6b, 0x06, 0xba, 0x2c, 0x0d, 0x73, 0x43, 0x33, 0x4c, 0x79, 0x93, 0x63, 0xe5, 0x78, 0x53, 0xe3, 0xc7, 0xd2, 0x36, 0xb3, 0x36, 0x1e, 0x7b, 0xe3, 0x05, 0xcb, 0x99, 0xd7, 0x2b, 0x56, 0x04, 0xb1, 0x49, 0x8c, 0x3e, 0x78, 0x69, 0x0a, 0x26, 0x86, 0x4d, 0x01, 0x58, 0xdb, 0x54, 0x0b, 0x1f, 0xfd, 0x44, 0x80, 0x2d, 0x60, 0xc7, 0xdb, 0x2c, 0x2c, 0xcb, 0x35, 0xe1, 0x2a, 0x79, 0x6c, 0xee, 0x13, 0xea, 0x94, 0x12, 0x32, 0xef, 0xcf, 0x36, 0x2b, 0x39, 0x4c, 0xa2, 0xaf, 0x02, 0x76, 0x4f, 0x1f, 0x01, 0x9b, 0x11, 0xb2, 0xf0, 0x52, 0x1f, 0xb8, 0x48, 0x5b, 0x04, 0xb1, 0xd9, 0x02, 0x09, 0xd2, 0xf1, 0xac, 0x2b, 0x71, 0x6b, 0xaa, 0x9f, 0xeb, 0x2c, 0x41, 0xee, 0xbf, 0x6c, 0x5f, 0x02, 0xfd, 0xf6, 0x1d, 0x58, 0x60, 0x32, 0xe1, 0x3f, 0x4a, 0x59, 0x7c, 0x26, 0x3a, 0x4d, 0x9e, 0x1b, 0x29, 0x12, 0x7e, 0x3d, 0x5e, 0xdc, 0xb9, 0x34, 0x69, 0x9a, 0xc5, 0xf9, 0xae, 0x18, 0x38, 0x59, 0x1d, 0x97, 0x9b, 0x2a, 0x16, 0xb0, 0xdf, 0xc0, 0x3f, 0x78, 0xd7, 0x0f, 0xa5, 0x18, 0xda, 0xe2, 0x3a, 0x30, 0xdf, 0x76, 0x84, 0xd2, 0x8f, 0xae, 0x71, 0x56, 0x81, 0x32, 0xd7, 0x38, 0x71, 0xcd, 0x95, 0x00, 0x30, 0xff, 0x95, 0x25, 0x79, 0x12, 0xd4, 0x7a, 0x66, 0x78, 0xc6, 0x28, 0xab, 0x34, + 0x7b, 0xf5, 0xaf, 0xf2, 0x93, 0x75, 0xe6, 0x9f, 0x63, 0x79, 0xfb, 0xae, 0x57, 0x4e, 0x53, 0x6b, 0x70, 0x67, 0x1e, 0x57, 0xac, 0x5c, 0xbb, 0x48, 0x2a, 0x81, 0x0c, 0x72, 0x16, 0x53, 0xa3, 0x7c, 0x75, 0x70, 0xf0, 0x08, 0x77, 0x89, 0xf6, 0x16, 0x95, 0xd9, 0x69, 0x2d, 0x74, 0x9b, 0xc9, 0x65, 0x25, 0x36, 0x9d, 0xa3, 0x6e, 0x92, 0xbd, 0x43, 0x3e, 0xaf, 0x8d, 0xa4, 0x61, 0x18, 0x95, 0x05, 0xbd, 0x67, 0x1f, 0x7e, 0x38, 0x17, 0x10, 0x6d, 0x31, 0x96, 0x16, 0xcd, 0xc0, 0x07, 0xcc, 0x2b, 0x9e, 0x22, 0x49, 0xb7, 0x12, 0x2d, 0x07, 0xa4, 0xb7, 0x9c, 0xc0, 0x23, 0x8a, 0xf3, 0x30, 0xda, 0xc8, 0x48, 0xed, 0x6e, 0x8b, 0xd7, 0x5f, 0x4a, 0xd8, 0x03, 0x9f, 0x06, 0xbf, 0x98, 0x15, 0xba, 0x49, 0x08, 0x10, 0x17, 0xc5, 0x6e, 0x9b, 0x31, 0x6d, 0xc1, 0xf5, 0x5d, 0x9c, 0xa9, 0xdb, 0xc6, 0x17, 0xd3, 0x94, 0xa8, 0xdd, 0xbf, 0xdd, 0x13, 0x21, 0xb8, 0xa2, 0xb1, 0x46, 0x79, 0xe2, 0x36, 0xf6, 0x67, 0x09, 0x8a, 0x0e, 0x1c, 0x04, 0x9d, 0xfc, 0xc8, 0x82, 0x67, 0xe4, 0x0d, 0x29, 0x82, 0x4c, 0x6a, 0xbc, 0xb5, 0xaf, 0xd8, 0x44, 0x0a, 0xb8, 0xb9, 0x10, 0x15, 0x33, 0x0e, 0x0d, 0xb2, 0x73, 0x8f, 0xc6, 0xee, 0x19, 0x31, 0xe2, 0xaf, 0x26, 0x47, 0x9a, 0x16, 0x05, 0xe0, 0xf8, 0x70, 0xfa, 0x06, 0x4a, 0x4a, 0x3e, 0x1d, 0x6a, 0x62, 0x76, 0x6e, 0x18, 0x64, 0xde, 0x7c, 0x80, 0xad, 0x6d, 0x2c, 0x16, 0xb4, 0x9d, 0xf1, 0x7c, 0xf4, 0x87, 0x60, 0xb5, 0x68, 0x29, 0x54, 0xa5, 0xb0, 0x5d, 0x26, 0x31, 0xe3, 0xb7, 0xf4, 0x33, 0x21, 0x3d, 0x5f, 0x83, 0x32, 0x82, 0x1b, 0x91, 0xa7, 0x5f, 0x88, 0x00, 0x85, 0x2d, 0x4b, 0xe8, 0xbd, 0xd0, 0x55, 0x3a, 0xce, 0xe8, 0x01, 0x54, 0x0c, + 0x75, 0x6c, 0xc1, 0xbb, 0xfe, 0xf2, 0xca, 0x10, 0x52, 0xbe, 0x06, 0x6e, 0xc3, 0xa9, 0xd6, 0xab, 0x88, 0x73, 0x77, 0x8e, 0x90, 0x10, 0x0d, 0x42, 0x0f, 0x82, 0x56, 0x70, 0x92, 0x3b, 0x57, 0x76, 0x49, 0x59, 0x96, 0xc1, 0xe7, 0x9b, 0x6e, 0x21, 0x21, 0x27, 0x0b, 0x92, 0xd5, 0x31, 0x90, 0x72, 0x46, 0x8d, 0x2c, 0xe9, 0xf6, 0x67, 0x8b, 0xf0, 0xeb, 0x85, 0xae, 0x5e, 0x22, 0x11, 0xa5, 0x55, 0xbf, 0x85, 0xda, 0xbb, 0x3d, 0x9e, 0xff, 0x99, 0xfd, 0x1e, 0x2e, 0x59, 0x40, 0x1b, 0xe1, 0xf2, 0x9d, 0x07, 0xe2, 0x37, 0x13, 0x42, 0x96, 0xbd, 0xa2, 0x75, 0xea, 0xe8, 0x4a, 0x70, 0x6c, 0xce, 0x3b, 0x18, 0xeb, 0xf4, 0xec, 0xec, 0xf3, 0xc6, 0x09, 0x3c, 0x02, 0x18, 0x4e, 0xc5, 0xe9, 0x22, 0x0a, 0x31, 0x66, 0x76, 0x3a, 0x85, 0x6c, 0x4e, 0x61, 0xec, 0x57, 0xa5, 0xb0, 0xda, 0xb5, 0xc9, 0x3a, 0xb8, 0x11, 0x20, 0x98, 0x58, 0x3a, 0x4c, 0xf1, 0x16, 0x76, 0x03, 0xdb, 0x7a, 0x3b, 0xcc, 0x87, 0x87, 0xf9, 0x11, 0xb1, 0x9f, 0x82, 0xd1, 0xa9, 0x57, 0x76, 0x54, 0x5b, 0xf9, 0x66, 0x2f, 0x21, 0x79, 0xd6, 0xf1, 0x8d, 0x15, 0xe3, 0x1c, 0xb8, 0x4a, 0xc3, 0x45, 0x54, 0x12, 0xbb, 0xce, 0x11, 0x77, 0x24, 0xc8, 0xaa, 0x15, 0x69, 0x16, 0x09, 0xf8, 0x61, 0x34, 0x41, 0x6e, 0x9a, 0x04, 0xb7, 0x5b, 0x91, 0xc3, 0xd0, 0xf9, 0x47, 0xf7, 0x53, 0x8b, 0xba, 0x0c, 0x25, 0x25, 0xbc, 0x4c, 0xbc, 0xb7, 0x99, 0xe5, 0xc5, 0x36, 0x21, 0x71, 0x63, 0xc2, 0xda, 0x82, 0xe0, 0x90, 0xc9, 0xf1, 0xcb, 0xd3, 0xa6, 0x69, 0xbd, 0x77, 0x52, 0x9e, 0xb2, 0xa5, 0x64, 0x99, 0x7d, 0xc5, 0xe5, 0xde, 0xb7, 0x35, 0xaf, 0xe4, 0xd4, 0x12, 0x09, 0xf0, 0x95, 0x80, 0xbd, 0xbf, 0x58, 0x9b, 0x37, 0xde, + 0x9f, 0xc1, 0x4a, 0x7b, 0xfe, 0x08, 0x38, 0x16, 0x16, 0x26, 0x55, 0x1c, 0x27, 0x8b, 0x1d, 0xba, 0x00, 0xdf, 0xc4, 0xcb, 0x1e, 0xf6, 0xce, 0xf6, 0x48, 0x63, 0x0b, 0x54, 0x79, 0x0b, 0xfb, 0x41, 0xb6, 0xb0, 0x73, 0xce, 0x58, 0x59, 0xd1, 0xfe, 0xa3, 0xf2, 0xee, 0x3d, 0x28, 0xc8, 0x91, 0x16, 0x1b, 0x50, 0x0a, 0x3b, 0x14, 0xb6, 0x4f, 0x24, 0x18, 0x85, 0x62, 0xcd, 0x22, 0xb3, 0x43, 0xcd, 0xd8, 0x65, 0xf2, 0x41, 0x65, 0xb6, 0x4a, 0x62, 0x09, 0xbc, 0xa4, 0xe4, 0x1e, 0xc9, 0x08, 0x0d, 0x8d, 0x36, 0xea, 0x38, 0x0b, 0xec, 0x15, 0x0a, 0x6b, 0x62, 0x65, 0xd0, 0xd9, 0xa8, 0xbb, 0x68, 0x59, 0xf1, 0xde, 0x87, 0xdf, 0x4d, 0x10, 0xfd, 0x12, 0xaf, 0xc5, 0x54, 0x16, 0x5b, 0xc1, 0x21, 0x73, 0xd5, 0x26, 0x9a, 0x57, 0x14, 0x7d, 0x3b, 0xe3, 0x12, 0x9b, 0x78, 0xe9, 0x8a, 0x52, 0xe8, 0x4a, 0x85, 0xfb, 0x6a, 0x79, 0x0d, 0x16, 0x23, 0xd5, 0x0e, 0xf5, 0x2e, 0x2c, 0xba, 0xdf, 0x72, 0x07, 0x1a, 0xfd, 0xb4, 0x48, 0x6c, 0x90, 0x5c, 0x4e, 0xcf, 0xc3, 0xe6, 0x92, 0x1b, 0x16, 0xbe, 0x95, 0x00, 0x47, 0xc3, 0x31, 0x64, 0xdf, 0x69, 0x83, 0x9e, 0xf4, 0xcc, 0xc9, 0x62, 0xa8, 0x64, 0xf8, 0x91, 0xf0, 0xab, 0x67, 0xf9, 0xcb, 0xcf, 0x5d, 0x31, 0xdb, 0x18, 0x45, 0xc0, 0x0a, 0x84, 0x8c, 0x26, 0x58, 0xb0, 0xaf, 0x79, 0x30, 0xe2, 0x68, 0x1e, 0x0c, 0x0f, 0xdd, 0xdb, 0x03, 0xc7, 0x34, 0x36, 0x15, 0x70, 0xd9, 0x64, 0x8e, 0xc1, 0x3d, 0x9d, 0xc6, 0x3b, 0x67, 0x2f, 0x0f, 0x77, 0x62, 0x7a, 0x9a, 0x9d, 0xb4, 0xd0, 0x83, 0xe9, 0xb7, 0x4d, 0x16, 0x28, 0x2a, 0x75, 0x50, 0x08, 0xb9, 0xa3, 0x08, 0xf3, 0x82, 0x02, 0xbb, 0xbb, 0xef, 0x3b, 0x5e, 0x6c, 0x57, 0xc8, 0xdb, 0x90, + 0x99, 0x3a, 0xb3, 0x5f, 0x0d, 0x8f, 0xc1, 0x6c, 0x62, 0x91, 0x93, 0x4a, 0x0a, 0x42, 0xb2, 0xe9, 0x8a, 0x57, 0xf0, 0x3a, 0xd3, 0x2e, 0x7e, 0x21, 0xab, 0x7e, 0x4f, 0x77, 0xd9, 0x61, 0x80, 0x4e, 0x56, 0x95, 0x0e, 0xc2, 0x34, 0xe8, 0x97, 0xe2, 0x5a, 0xc6, 0xcb, 0x2a, 0xd2, 0x9e, 0x35, 0x98, 0x18, 0x04, 0x42, 0x94, 0xd2, 0xc9, 0xf4, 0xc9, 0xc0, 0x89, 0x5c, 0x8b, 0x4f, 0x9d, 0x5d, 0x25, 0x26, 0xb0, 0x4c, 0xe6, 0x34, 0x85, 0x32, 0x55, 0x74, 0x30, 0x3f, 0xba, 0xa7, 0x94, 0x82, 0xa6, 0xfb, 0x6f, 0x9f, 0xdf, 0x81, 0x5f, 0xd4, 0x08, 0x1c, 0xc1, 0x44, 0x87, 0x3c, 0x4f, 0x13, 0x89, 0x99, 0xfe, 0x70, 0x16, 0x8a, 0x8b, 0xfb, 0x6f, 0x25, 0x3c, 0x39, 0xd0, 0x8d, 0x81, 0x37, 0x68, 0x08, 0x0b, 0x78, 0x56, 0xd5, 0xb1, 0x82, 0x2b, 0xb5, 0x71, 0xef, 0xf1, 0x29, 0x2d, 0xf1, 0x5f, 0x15, 0x1e, 0xa7, 0xe9, 0xd2, 0xcc, 0xdf, 0x05, 0xea, 0x7d, 0x8e, 0x65, 0xf0, 0x16, 0xc3, 0xaf, 0x20, 0x64, 0xf3, 0xd6, 0x58, 0x93, 0xe0, 0x12, 0x14, 0xdc, 0xac, 0x61, 0x89, 0xcd, 0xfd, 0x55, 0xa5, 0xe4, 0xf7, 0xea, 0xdd, 0x19, 0x71, 0x00, 0xec, 0x61, 0xef, 0x0b, 0xd7, 0xc6, 0x0d, 0x09, 0x5b, 0x59, 0x2c, 0xc1, 0xca, 0x6f, 0x54, 0x17, 0x74, 0x69, 0x3f, 0xe4, 0xca, 0x9a, 0x02, 0xee, 0x17, 0xa8, 0xde, 0x21, 0xa8, 0xfc, 0xec, 0x4c, 0xd0, 0x6c, 0x92, 0xdb, 0x4f, 0xeb, 0x0f, 0xcb, 0xdf, 0x86, 0x50, 0x71, 0x8b, 0x55, 0x64, 0xc6, 0xf4, 0xc0, 0x2a, 0x8b, 0xeb, 0xdf, 0x7d, 0x02, 0x60, 0x38, 0x6a, 0xce, 0x85, 0x46, 0xee, 0x91, 0xd6, 0x33, 0xa8, 0x50, 0x06, 0x3d, 0x52, 0x69, 0x59, 0x00, 0x43, 0xca, 0x7b, 0x62, 0xa6, 0x21, 0xa0, 0x96, 0xcc, 0x47, 0x20, 0xcd, 0x21, 0xd3, + 0x73, 0x9c, 0x2b, 0x54, 0xb0, 0xfb, 0xcc, 0x6d, 0x6d, 0x05, 0xb9, 0x79, 0xa9, 0x32, 0xb9, 0x5e, 0x34, 0x61, 0xcd, 0xe3, 0xb6, 0x1b, 0xd9, 0x62, 0xe4, 0x40, 0xda, 0x30, 0x6c, 0x46, 0x29, 0xcc, 0xc6, 0x45, 0x43, 0x31, 0x9d, 0xa7, 0x9f, 0x06, 0xd1, 0xfe, 0x86, 0x2d, 0x62, 0x86, 0x6f, 0x6f, 0xc1, 0x06, 0x4c, 0x1e, 0xf4, 0x77, 0xf5, 0x16, 0xe6, 0xcb, 0xb9, 0x15, 0x2b, 0xd3, 0x12, 0xc1, 0x28, 0xe0, 0x6d, 0xc0, 0xc5, 0x4b, 0xe6, 0xc2, 0x06, 0x88, 0x5b, 0xb5, 0x30, 0x5a, 0xd1, 0xa0, 0x14, 0x2d, 0xaa, 0x95, 0xb7, 0x3c, 0x69, 0x81, 0x26, 0x58, 0xa9, 0x65, 0xd0, 0x82, 0x6c, 0x5f, 0x17, 0xb5, 0xc2, 0xec, 0xec, 0x9e, 0x43, 0x86, 0xb5, 0x65, 0xa2, 0x5e, 0x08, 0x29, 0xac, 0x36, 0x19, 0xb2, 0x47, 0xbf, 0x31, 0x11, 0x7e, 0x71, 0x28, 0x17, 0xf9, 0x8d, 0x61, 0x09, 0x25, 0x75, 0xff, 0x96, 0xba, 0x89, 0xd0, 0xc4, 0xee, 0xad, 0x88, 0xd7, 0xaf, 0x47, 0x0e, 0x40, 0xf8, 0x7f, 0xf6, 0x8e, 0x20, 0x37, 0x0d, 0xc7, 0x9d, 0x56, 0x0c, 0x8c, 0x24, 0x0d, 0x77, 0x28, 0x8b, 0xb5, 0x37, 0x5f, 0xea, 0xe8, 0xa7, 0x83, 0xb6, 0x7f, 0x80, 0xdc, 0x5b, 0x46, 0x58, 0x3d, 0x39, 0x1a, 0xef, 0x9b, 0x5a, 0xa0, 0xce, 0x21, 0x94, 0xd8, 0x70, 0xeb, 0x97, 0xa3, 0x88, 0x88, 0x51, 0x02, 0xd7, 0xaf, 0x72, 0xd6, 0xae, 0xab, 0x99, 0x05, 0x0c, 0x05, 0xce, 0x33, 0xd2, 0x6e, 0xdb, 0x30, 0x63, 0x77, 0x33, 0x42, 0xa9, 0xb3, 0xeb, 0xb5, 0x4a, 0x33, 0x54, 0x4e, 0xed, 0x0c, 0x94, 0x96, 0xad, 0xbc, 0xc0, 0x10, 0x41, 0x45, 0xcc, 0xc1, 0xdf, 0xeb, 0x3f, 0x10, 0xa4, 0x02, 0x8a, 0x9c, 0xba, 0x77, 0x88, 0x6a, 0xc7, 0x57, 0x2c, 0x28, 0xb6, 0x3a, 0x35, 0x8a, 0x9c, 0x55, 0xd0, 0x0e, + 0x2c, 0xc1, 0x26, 0x1b, 0x20, 0x39, 0x7f, 0xef, 0xf9, 0x1f, 0x94, 0x0c, 0xc6, 0x9d, 0xee, 0xce, 0x33, 0x42, 0x62, 0x75, 0x9c, 0x98, 0x67, 0xa2, 0x3f, 0x89, 0x53, 0xc2, 0xef, 0x12, 0xff, 0xf1, 0x90, 0x3f, 0xe0, 0x9c, 0x83, 0x65, 0x75, 0x46, 0x39, 0xfa, 0x71, 0x6c, 0xe4, 0x77, 0xb3, 0x27, 0xd1, 0x38, 0xbc, 0x10, 0x8d, 0x30, 0xf3, 0x49, 0x87, 0xeb, 0xa0, 0xec, 0x7f, 0x61, 0xdd, 0x4d, 0x8a, 0xf9, 0x2a, 0x8b, 0x67, 0xbb, 0x70, 0xab, 0x4b, 0xf2, 0xc5, 0xac, 0x1a, 0xfc, 0x71, 0x02, 0xd4, 0xa9, 0x07, 0x84, 0x02, 0xf5, 0x9f, 0x1a, 0x9e, 0x96, 0xb9, 0xc7, 0xcd, 0x5e, 0x1d, 0x56, 0x3f, 0x8c, 0x61, 0xd6, 0xa4, 0x8d, 0xc5, 0x6c, 0x5e, 0x01, 0x0f, 0x95, 0x9a, 0x36, 0xec, 0x4b, 0x82, 0xfa, 0xe1, 0x14, 0xea, 0x1c, 0x5e, 0xfb, 0x50, 0xd2, 0x3c, 0x4f, 0xb2, 0x59, 0x39, 0xd3, 0x22, 0xa5, 0xf2, 0xde, 0x14, 0xf5, 0xa0, 0xaf, 0x32, 0x29, 0x36, 0x9b, 0x8c, 0x43, 0x22, 0xa2, 0xdd, 0x47, 0xc8, 0x27, 0xc2, 0xf6, 0x29, 0x5f, 0xda, 0xc7, 0xc8, 0xa8, 0x2b, 0x08, 0xb0, 0x36, 0xcb, 0x3a, 0x5d, 0xa5, 0xc4, 0x90, 0xb3, 0xf4, 0xc5, 0x5d, 0x10, 0x8e, 0x78, 0x03, 0x62, 0x1d, 0x29, 0xb3, 0xa2, 0xd4, 0x08, 0x51, 0xa8, 0xf2, 0x83, 0x60, 0x15, 0x42, 0x27, 0xef, 0xda, 0xd6, 0xa8, 0x74, 0x90, 0x81, 0xfc, 0xb4, 0x8b, 0xf8, 0x50, 0x88, 0x04, 0x31, 0x4a, 0x27, 0x43, 0xeb, 0x2b, 0x97, 0x24, 0x45, 0x61, 0xb3, 0x49, 0xe1, 0x35, 0x54, 0xbd, 0x24, 0x25, 0x94, 0x76, 0x72, 0xaf, 0x7c, 0xcb, 0xdc, 0xee, 0x9e, 0xfa, 0x6f, 0x1f, 0x12, 0x20, 0xee, 0xb1, 0xe1, 0xc9, 0x97, 0x43, 0x22, 0x3b, 0xc9, 0x9a, 0x6c, 0x3c, 0x98, 0xce, 0xe4, 0x06, 0x75, 0x98, 0xcf, 0xab, 0x2b, + 0x1b, 0xe4, 0x76, 0xf6, 0xd2, 0xb5, 0xc7, 0x4e, 0xde, 0xc6, 0xa7, 0x45, 0x9d, 0x1d, 0xdb, 0x71, 0xb3, 0xe5, 0xbf, 0x43, 0x50, 0xf7, 0x7f, 0xe6, 0x23, 0xb5, 0x89, 0x02, 0x26, 0x51, 0xc9, 0x3c, 0x50, 0xfd, 0x62, 0xf9, 0x98, 0xcd, 0x06, 0x88, 0x72, 0x8f, 0xa0, 0x3e, 0x37, 0x3f, 0x12, 0x39, 0x16, 0x12, 0xb6, 0x3c, 0x68, 0xd3, 0x2f, 0x87, 0x61, 0x35, 0x2f, 0xbe, 0x4e, 0xdb, 0x7e, 0xf2, 0xcd, 0xb9, 0xad, 0x5d, 0xc8, 0xcd, 0xd3, 0x51, 0x95, 0x9d, 0x84, 0x95, 0xfc, 0x50, 0x21, 0xe4, 0x35, 0x01, 0x83, 0xf2, 0xcf, 0x9c, 0x27, 0x3b, 0x26, 0xf6, 0x30, 0x76, 0xcb, 0x44, 0x08, 0x0f, 0x3b, 0x44, 0xf8, 0x30, 0x04, 0xaa, 0x54, 0x59, 0x9d, 0x87, 0x52, 0xc3, 0x70, 0x98, 0x20, 0x0e, 0xe3, 0x70, 0x72, 0x76, 0xee, 0x72, 0x08, 0x1a, 0xa4, 0x0a, 0x57, 0xd1, 0xc7, 0x93, 0xda, 0xd5, 0x5f, 0x51, 0xf5, 0x2c, 0xb2, 0x0c, 0x49, 0x04, 0x03, 0xea, 0x4d, 0x68, 0x61, 0x61, 0x1b, 0xb2, 0x06, 0x5c, 0xfd, 0xf4, 0x2f, 0x2a, 0x0e, 0xb0, 0xdd, 0xaa, 0xd8, 0x66, 0xea, 0xc4, 0xae, 0x69, 0x60, 0x9b, 0xce, 0xc6, 0x31, 0x69, 0xd7, 0x2e, 0x7c, 0x7a, 0x2e, 0xb4, 0x26, 0xff, 0xe0, 0xfe, 0xa2, 0xc7, 0xe7, 0x38, 0x6b, 0x70, 0xcd, 0xf3, 0x80, 0xe7, 0x69, 0xd9, 0xb1, 0xa4, 0x34, 0x97, 0x80, 0xe9, 0x71, 0x7e, 0xcb, 0x42, 0xba, 0x99, 0x87, 0xe1, 0xe8, 0x4f, 0x52, 0x16, 0xd9, 0x8f, 0x89, 0x37, 0xe4, 0xab, 0xf9, 0xe5, 0x12, 0xd0, 0x32, 0x11, 0x5c, 0x81, 0x7d, 0x52, 0x35, 0x90, 0x10, 0xcd, 0x6a, 0x0f, 0x40, 0xd5, 0x16, 0xb5, 0x51, 0xf1, 0xec, 0xf3, 0x5e, 0x26, 0x6d, 0x44, 0x1a, 0x71, 0x9a, 0x00, 0xc7, 0x50, 0xb1, 0x5d, 0xa8, 0x2c, 0x69, 0x3c, 0x7d, 0x0f, 0xcc, 0x66, + 0x82, 0x57, 0x3f, 0x7f, 0x77, 0x3d, 0x20, 0xd9, 0xf8, 0xbe, 0xe5, 0x18, 0xf0, 0x6d, 0xcd, 0x8f, 0xed, 0x48, 0xbf, 0xbf, 0xdd, 0x46, 0x89, 0xe7, 0x0d, 0xeb, 0xb8, 0x51, 0xda, 0x1e, 0xdd, 0x0c, 0xa2, 0x38, 0x74, 0x85, 0x06, 0x36, 0x6f, 0x51, 0x6e, 0x91, 0xbf, 0x14, 0x74, 0x63, 0x8e, 0x14, 0x84, 0x21, 0x4c, 0x5c, 0x4f, 0x9c, 0x41, 0x52, 0xed, 0x03, 0xf0, 0x4e, 0x7f, 0x80, 0xb3, 0x40, 0x48, 0x0a, 0xe6, 0x82, 0xcf, 0xe3, 0x3f, 0x2a, 0xb8, 0x85, 0x0f, 0xf2, 0x39, 0x8c, 0x0a, 0xa7, 0xfd, 0x0d, 0xb6, 0x2a, 0xd9, 0xfe, 0xa5, 0x45, 0x28, 0x39, 0xdd, 0xcd, 0x0b, 0xb7, 0xbd, 0xaa, 0x39, 0xa2, 0x25, 0x0d, 0x2f, 0xa4, 0x5b, 0xb3, 0x25, 0xb1, 0xd2, 0xe7, 0xd4, 0xad, 0xb5, 0xcc, 0x3b, 0xfb, 0x1b, 0xf4, 0x42, 0xb9, 0xe1, 0x34, 0x8e, 0x3b, 0xe4, 0x50, 0xbf, 0x43, 0x0f, 0x3c, 0x76, 0x5c, 0xa6, 0x31, 0x08, 0x6c, 0x93, 0xec, 0x81, 0x7c, 0xe7, 0x4b, 0xfc, 0x0c, 0x04, 0xac, 0x57, 0xa9, 0xf7, 0xa9, 0x2c, 0x62, 0x26, 0x68, 0xee, 0xec, 0x62, 0x7a, 0x2a, 0xe6, 0xf5, 0x55, 0xba, 0x97, 0xb4, 0xe5, 0xb0, 0x55, 0xcc, 0xb4, 0xdf, 0xd1, 0x8b, 0x9e, 0x4a, 0x4f, 0x84, 0xc9, 0x64, 0xaf, 0x48, 0x57, 0x99, 0x47, 0xf7, 0x24, 0x23, 0x6d, 0xf4, 0x0b, 0xe7, 0xf7, 0xa3, 0x71, 0x68, 0x8f, 0xf0, 0x9a, 0xba, 0x66, 0x99, 0xed, 0x62, 0x2e, 0xf1, 0x90, 0x74, 0x0f, 0xd0, 0xa0, 0x3e, 0xe5, 0x0e, 0x80, 0x27, 0x0a, 0x72, 0x12, 0x40, 0x84, 0x9a, 0xb7, 0xf4, 0x1c, 0xf9, 0x5f, 0x00, 0x17, 0xc4, 0x7c, 0xb7, 0xf0, 0x80, 0x47, 0xe5, 0x9f, 0xd0, 0x4b, 0xfb, 0x56, 0x9e, 0xa1, 0x0e, 0x45, 0x3e, 0x85, 0xc3, 0x27, 0x17, 0xb3, 0xd0, 0xe2, 0x58, 0xc1, 0x3a, 0x8e, 0x01, 0x50, + 0xbc, 0x5b, 0x22, 0xa6, 0x13, 0xf0, 0x60, 0x14, 0x1a, 0x22, 0xe1, 0xd4, 0x9e, 0xad, 0x53, 0x55, 0xe8, 0x95, 0x5c, 0x96, 0xea, 0x66, 0xdf, 0xf0, 0xe0, 0x2f, 0x2d, 0x06, 0x9e, 0x8e, 0xd4, 0x3b, 0x34, 0xdd, 0x35, 0x7a, 0x98, 0x93, 0xb3, 0xfe, 0xed, 0x92, 0x26, 0xba, 0xdc, 0x6d, 0xac, 0xbf, 0x59, 0x3a, 0xbb, 0x8c, 0xab, 0x78, 0xee, 0x50, 0xf7, 0x16, 0x0f, 0x6b, 0xa0, 0x74, 0x23, 0xa4, 0x0b, 0xa6, 0x76, 0x99, 0x63, 0x50, 0x5d, 0xf9, 0xc1, 0x3e, 0xf0, 0x5b, 0x39, 0x6c, 0x1d, 0x7b, 0x8c, 0xb0, 0x8d, 0x35, 0x80, 0xc9, 0x9d, 0x93, 0x6f, 0xbe, 0x4a, 0x3e, 0x31, 0x7b, 0x11, 0x94, 0x20, 0xb8, 0xfd, 0x04, 0x81, 0xe4, 0xa7, 0xc8, 0x1f, 0xba, 0x36, 0x6c, 0x40, 0x55, 0xe0, 0xe0, 0xd2, 0x3c, 0x13, 0xfc, 0xf6, 0x91, 0x23, 0x5b, 0x09, 0x6d, 0x00, 0xae, 0xb4, 0xcf, 0x60, 0x1f, 0x6f, 0xb3, 0x81, 0xbe, 0x35, 0x0e, 0xee, 0x78, 0x61, 0xf0, 0x85, 0xd5, 0xed, 0x73, 0x72, 0xc4, 0x81, 0xa5, 0x30, 0x6d, 0x95, 0xc0, 0xfa, 0x5b, 0xf2, 0xa7, 0x9a, 0x5a, 0xc8, 0xc9, 0xdc, 0xcc, 0xb7, 0x58, 0x0c, 0x2a, 0x92, 0x22, 0x8f, 0xab, 0xa1, 0xe8, 0xbf, 0x2c, 0x3d, 0xab, 0x0b, 0xf0, 0x69, 0xaf, 0x32, 0xf2, 0x74, 0x4e, 0x9b, 0xb9, 0xb0, 0xc8, 0x58, 0xcb, 0xc9, 0x3c, 0x01, 0x59, 0x15, 0x61, 0x8a, 0xec, 0x56, 0xd2, 0x3d, 0xc6, 0x62, 0x07, 0x75, 0x33, 0xed, 0x52, 0x88, 0x14, 0xa7, 0xee, 0xb8, 0x98, 0x62, 0x16, 0x18, 0x5f, 0x47, 0x7b, 0x15, 0x4d, 0x50, 0xcc, 0x20, 0xd9, 0x4e, 0x2c, 0xb4, 0x62, 0x6a, 0x64, 0xe3, 0x63, 0x59, 0xcb, 0x95, 0x66, 0xa7, 0xa6, 0x08, 0xd9, 0x66, 0x3f, 0xec, 0xb0, 0x54, 0xb0, 0xbb, 0x4b, 0x38, 0x35, 0x94, 0xe2, 0xec, 0x06, 0xce, 0xbf, + 0x71, 0xd2, 0xe1, 0x1e, 0x1e, 0x3b, 0x34, 0x00, 0x6c, 0x7f, 0x98, 0xc7, 0xc7, 0xb6, 0x08, 0x00, 0xb3, 0x65, 0xc3, 0x23, 0xa4, 0x7a, 0x24, 0x94, 0x32, 0x8f, 0x24, 0xc2, 0xab, 0xff, 0x36, 0xa5, 0x8b, 0x53, 0x3f, 0xd5, 0xf8, 0x93, 0xcd, 0x45, 0xa0, 0x5f, 0x6a, 0xdb, 0xe6, 0x22, 0x38, 0x66, 0x4d, 0x1a, 0xfc, 0x05, 0xce, 0x5e, 0x04, 0x80, 0x75, 0x22, 0x90, 0x77, 0xcb, 0x8c, 0xdd, 0xf1, 0x83, 0x21, 0xa5, 0x86, 0xcf, 0x8c, 0x99, 0x77, 0xcc, 0xb5, 0xe0, 0x21, 0x15, 0x44, 0x6b, 0x70, 0xa3, 0xd7, 0x2a, 0x86, 0x98, 0x7d, 0xb2, 0x79, 0x94, 0x57, 0x51, 0x8b, 0xf0, 0x09, 0x43, 0x5f, 0x84, 0x91, 0x1b, 0x4e, 0xd9, 0xd5, 0x22, 0x1d, 0x01, 0xa9, 0x5d, 0x00, 0x48, 0x0b, 0xb1, 0xbf, 0xfc, 0x9a, 0x2d, 0xf2, 0x6e, 0xd0, 0x22, 0xd9, 0xb4, 0xb3, 0xb8, 0x6a, 0x80, 0x7a, 0x6c, 0x39, 0xbc, 0xb2, 0x94, 0x67, 0xc6, 0x0a, 0xb6, 0xd6, 0xf6, 0x7c, 0x37, 0x5f, 0x43, 0xf4, 0x88, 0x3b, 0xf8, 0x5f, 0xbe, 0x29, 0xa4, 0x41, 0x0d, 0xc0, 0x93, 0x1e, 0x5f, 0x38, 0x6f, 0x6b, 0xc3, 0x3d, 0xd5, 0x68, 0x84, 0xc3, 0xc1, 0x9a, 0xb9, 0xd8, 0x93, 0x39, 0x89, 0x9c, 0x53, 0x74, 0x38, 0x2b, 0x04, 0x83, 0xda, 0xb6, 0x91, 0x8f, 0xd9, 0xca, 0x09, 0x2c, 0x17, 0xd2, 0x18, 0xc6, 0xba, 0x64, 0xa2, 0x56, 0xd0, 0x0a, 0xda, 0x2c, 0x53, 0xcc, 0x0e, 0x13, 0xb5, 0x4e, 0xcb, 0xec, 0x15, 0x85, 0x56, 0x3c, 0xae, 0x1f, 0x5c, 0xe8, 0x7c, 0x31, 0x77, 0x26, 0x18, 0x13, 0xf5, 0xee, 0x04, 0x58, 0x56, 0xdd, 0xb7, 0x76, 0x60, 0xec, 0x0a, 0x69, 0x6e, 0xb1, 0x0f, 0xf8, 0x1d, 0x0b, 0x87, 0x61, 0xd9, 0xac, 0xdd, 0x01, 0x29, 0x02, 0xac, 0xce, 0xbb, 0xec, 0xd9, 0xde, 0xc1, 0x20, 0xef, 0x41, + 0xad, 0xdc, 0xbe, 0xc5, 0xd7, 0x12, 0xe1, 0x93, 0xcd, 0x53, 0x28, 0x2a, 0xe0, 0xd6, 0x68, 0x98, 0x4e, 0x1f, 0x61, 0x5f, 0xb9, 0x8a, 0x61, 0x32, 0xfd, 0xf2, 0xfb, 0x9d, 0xb1, 0x7d, 0x7e, 0x7a, 0xbb, 0x88, 0x49, 0xdf, 0x2a, 0xef, 0x61, 0x24, 0xf0, 0x8c, 0x9a, 0x23, 0x45, 0x31, 0xdf, 0xda, 0xea, 0x04, 0xcc, 0x46, 0x88, 0x2a, 0x0a, 0x7f, 0xe4, 0x9b, 0x4a, 0x9d, 0x1a, 0x3c, 0xba, 0x84, 0x33, 0xda, 0xc0, 0xeb, 0xbb, 0x56, 0x17, 0x2c, 0x94, 0xd2, 0x93, 0xed, 0x84, 0x0a, 0xd6, 0x9a, 0xf3, 0x87, 0x78, 0x87, 0x78, 0xc8, 0x79, 0x00, 0x23, 0x95, 0xd6, 0x5b, 0x2f, 0x34, 0x91, 0x17, 0x22, 0xd6, 0x9c, 0x94, 0x4b, 0xaa, 0xfd, 0xd3, 0xd6, 0x45, 0x9b, 0xac, 0x01, 0x8e, 0x61, 0x6c, 0x39, 0x2e, 0xf2, 0x9a, 0xa3, 0xa0, 0x33, 0x01, 0x3f, 0x7d, 0xce, 0x1c, 0x91, 0x7a, 0xea, 0x78, 0xee, 0x71, 0x95, 0xba, 0x4c, 0xad, 0xbe, 0xed, 0xc8, 0xea, 0x14, 0x1f, 0x95, 0x42, 0x57, 0x45, 0x62, 0x52, 0xb0, 0xf9, 0x69, 0x3c, 0x95, 0xed, 0x34, 0x84, 0x36, 0xa0, 0x25, 0xb5, 0x8a, 0x0c, 0x17, 0xe5, 0x02, 0x3e, 0xb2, 0xc1, 0x45, 0x1e, 0x03, 0xdb, 0x64, 0x4f, 0x98, 0xc7, 0xf3, 0x85, 0xcc, 0x57, 0x30, 0x83, 0x8d, 0x6e, 0x79, 0xa3, 0x8e, 0x68, 0x21, 0xe3, 0xa7, 0xf4, 0x75, 0x40, 0x69, 0xa4, 0x41, 0xa1, 0x65, 0x9c, 0x24, 0xa0, 0x80, 0xa0, 0x84, 0x4d, 0xc3, 0x65, 0x4a, 0xa8, 0x03, 0x16, 0x07, 0xdf, 0x98, 0x95, 0x52, 0x7f, 0x26, 0xe4, 0xd5, 0x21, 0x01, 0x6b, 0x7a, 0xd3, 0xc4, 0x00, 0x05, 0x7e, 0xf8, 0x0c, 0x90, 0x77, 0x94, 0x14, 0xcf, 0x55, 0x29, 0x03, 0x89, 0xd3, 0xab, 0xa4, 0x20, 0xe1, 0x59, 0x9a, 0x23, 0xba, 0x87, 0x0b, 0x84, 0x1c, 0xbc, 0xc5, 0xdf, 0x25, + 0x03, 0xd3, 0xc0, 0x20, 0x8a, 0xe0, 0xb0, 0xfb, 0xa3, 0xd5, 0x37, 0x65, 0x89, 0x0e, 0x3c, 0x92, 0x8d, 0xe3, 0x74, 0x78, 0x56, 0xf6, 0x52, 0x22, 0xa4, 0x71, 0x02, 0x05, 0x3b, 0xe8, 0x59, 0xfe, 0x7e, 0x67, 0xc1, 0x6f, 0xfa, 0x26, 0x69, 0xc2, 0x2e, 0xcd, 0x7d, 0xc6, 0x82, 0x25, 0x07, 0xea, 0xc7, 0x2a, 0x76, 0x68, 0xad, 0xce, 0xd4, 0x36, 0x18, 0x7e, 0x6d, 0x94, 0xcc, 0xca, 0x7e, 0xe0, 0x2f, 0xe2, 0x09, 0xa5, 0xc5, 0x98, 0xa0, 0x4a, 0x71, 0x12, 0x6a, 0xb7, 0xec, 0xd8, 0x4c, 0xfd, 0xf1, 0x9d, 0x26, 0x24, 0x6c, 0xaf, 0x41, 0x77, 0xb7, 0xff, 0xc1, 0x72, 0x1e, 0x6f, 0xe9, 0x3c, 0xdd, 0x67, 0xd4, 0xdb, 0xce, 0x7a, 0x31, 0xf0, 0x17, 0xeb, 0xd5, 0x7b, 0x9a, 0xc4, 0x02, 0x3c, 0x90, 0x96, 0xab, 0x0e, 0x40, 0x7e, 0xc2, 0x8b, 0xea, 0x06, 0x98, 0x7a, 0x84, 0x85, 0x1b, 0xce, 0xfe, 0xa3, 0x06, 0x29, 0x07, 0x81, 0x17, 0x87, 0x80, 0xde, 0x5a, 0x8e, 0xce, 0x51, 0x2d, 0x50, 0xfa, 0xad, 0xba, 0x4c, 0x72, 0x82, 0x64, 0x0d, 0x35, 0x18, 0xe8, 0x58, 0x2f, 0xe9, 0x63, 0x7f, 0xb6, 0xcb, 0x55, 0xa6, 0xb9, 0x8d, 0xaf, 0xd2, 0xf3, 0x72, 0xcb, 0x40, 0xc9, 0xcc, 0xd3, 0x32, 0xf4, 0x2c, 0x07, 0xec, 0x9a, 0x12, 0x19, 0xf2, 0xf5, 0x4b, 0xdc, 0x5a, 0xc9, 0xdf, 0xa7, 0x38, 0x1c, 0x5f, 0x09, 0x98, 0x93, 0x77, 0x3c, 0x2b, 0xfb, 0x9e, 0xe3, 0x2f, 0x17, 0x13, 0x4a, 0x50, 0xfa, 0x78, 0x86, 0x10, 0xee, 0x01, 0x25, 0x6a, 0xb7, 0xfe, 0xa8, 0x84, 0xdd, 0x5a, 0xcb, 0x2c, 0x90, 0x31, 0xce, 0xa1, 0x02, 0x49, 0x86, 0x8d, 0x46, 0xfd, 0x41, 0x24, 0xd0, 0xbb, 0x0f, 0xd8, 0x51, 0xe8, 0xb2, 0x24, 0x62, 0xba, 0x47, 0x0b, 0x1a, 0xe1, 0x72, 0xb5, 0x38, 0x57, 0x46, 0x09, + 0xc2, 0x7b, 0x61, 0xc6, 0x86, 0x0f, 0x45, 0xa7, 0xb9, 0x56, 0xb9, 0xc9, 0xa2, 0xe6, 0x89, 0x8f, 0xff, 0xe3, 0x92, 0x9b, 0x63, 0x9d, 0x87, 0x3a, 0xf6, 0x59, 0xd7, 0x9e, 0x70, 0x0a, 0xa5, 0x28, 0x5e, 0xcd, 0xc2, 0xe6, 0x35, 0xb9, 0x65, 0x61, 0xc6, 0xd7, 0xe9, 0x03, 0xe5, 0x49, 0x4f, 0x92, 0x9b, 0xa0, 0x18, 0x17, 0x82, 0x03, 0x24, 0x62, 0xdd, 0xe6, 0xf5, 0x14, 0x06, 0x43, 0x56, 0xa1, 0x2f, 0xe3, 0xc7, 0xb7, 0xcf, 0x63, 0x57, 0xcc, 0xab, 0xf9, 0x22, 0x03, 0xd3, 0x34, 0xe7, 0x95, 0xef, 0xa2, 0xb4, 0x48, 0x05, 0x54, 0x2f, 0x97, 0x95, 0x86, 0x98, 0x90, 0x92, 0x34, 0x39, 0xd7, 0xb6, 0xf7, 0x4c, 0x23, 0xdc, 0xf1, 0x39, 0xeb, 0x16, 0x47, 0xae, 0x74, 0xe7, 0xbc, 0x29, 0x90, 0xbc, 0xd6, 0x13, 0x4f, 0x59, 0xb9, 0x50, 0x38, 0x32, 0xa8, 0x90, 0xa7, 0x9a, 0x54, 0x6a, 0x21, 0x2d, 0xb6, 0x0d, 0x52, 0x45, 0x06, 0xc0, 0x24, 0xae, 0xbc, 0xf3, 0x8c, 0xc4, 0x9e, 0x38, 0x33, 0x39, 0xe9, 0x19, 0xdd, 0xaf, 0x44, 0x49, 0x46, 0x6d, 0xb0, 0x91, 0x68, 0x32, 0xef, 0x65, 0xb3, 0x09, 0xa1, 0x93, 0x7e, 0x5d, 0xc6, 0xd2, 0x0e, 0x02, 0xa9, 0x23, 0x8a, 0xec, 0xae, 0x0e, 0xed, 0xe6, 0x61, 0x61, 0x0a, 0x73, 0x77, 0x79, 0xee, 0xdf, 0x7f, 0x7c, 0xef, 0x73, 0x26, 0xb0, 0xc6, 0xe8, 0x14, 0x65, 0x6c, 0xff, 0xdf, 0x94, 0xbd, 0xec, 0x87, 0xbb, 0x96, 0xd4, 0xec, 0xb1, 0x70, 0x9f, 0x40, 0x91, 0x37, 0x1b, 0xa3, 0x51, 0x7b, 0x92, 0x6c, 0x74, 0x46, 0x73, 0x59, 0xd0, 0x73, 0xc1, 0x75, 0xd6, 0x94, 0x64, 0xd6, 0xb3, 0x13, 0x9a, 0x50, 0x03, 0xf0, 0x3c, 0x91, 0x6f, 0x0d, 0x00, 0xdd, 0x23, 0xec, 0xeb, 0xb8, 0x15, 0x2b, 0x90, 0x43, 0xd3, 0x65, 0x22, 0xc2, 0xa2, 0x06, + 0x17, 0xef, 0xf4, 0x9a, 0x20, 0xc5, 0x27, 0x53, 0xec, 0xc5, 0xfd, 0xa3, 0xc1, 0x0b, 0x72, 0x52, 0x97, 0x06, 0x9e, 0xd7, 0x36, 0xd9, 0xa4, 0x51, 0x93, 0xbc, 0x13, 0x45, 0x6d, 0xc2, 0x69, 0x9a, 0x56, 0xaf, 0x44, 0x91, 0xb6, 0xc4, 0xdb, 0x37, 0x76, 0x9b, 0xb4, 0xb7, 0x72, 0xe0, 0x78, 0xbd, 0x26, 0x70, 0xaa, 0xbc, 0x28, 0xc7, 0x3b, 0x9d, 0x0e, 0x3d, 0x77, 0xbf, 0x56, 0xce, 0x50, 0x03, 0x03, 0xe1, 0x2a, 0x80, 0x18, 0xa4, 0x74, 0x33, 0x87, 0xf4, 0x06, 0x76, 0x79, 0x51, 0x6f, 0x03, 0x19, 0xbd, 0xf7, 0xa0, 0x32, 0xd4, 0xdb, 0xec, 0xf6, 0x21, 0xe9, 0x70, 0x3f, 0x8a, 0x04, 0x9f, 0x05, 0x7f, 0x11, 0xea, 0x42, 0xc1, 0xff, 0xdf, 0x3b, 0xf8, 0x95, 0x8c, 0x08, 0x1a, 0xf7, 0xaa, 0x40, 0xe7, 0x7a, 0x89, 0x95, 0x74, 0x29, 0xd4, 0xd1, 0x2f, 0xa2, 0x17, 0x29, 0xfa, 0x51, 0xf6, 0xb6, 0x8d, 0x4b, 0x67, 0x2d, 0xb7, 0x73, 0x61, 0xec, 0xd8, 0x3d, 0xfb, 0x6c, 0x40, 0x28, 0xea, 0xa7, 0x25, 0x02, 0xa2, 0xe5, 0xd6, 0xba, 0xac, 0xa2, 0x6f, 0xfa, 0x9f, 0x87, 0x50, 0x20, 0x23, 0x18, 0x96, 0xf5, 0x8c, 0x95, 0x91, 0x7f, 0x6e, 0x49, 0x8b, 0xf1, 0xd7, 0xe4, 0x4d, 0xeb, 0xa2, 0xe0, 0x95, 0x4f, 0x9f, 0xdd, 0x54, 0xb9, 0x12, 0x5c, 0x87, 0x35, 0xe0, 0xa7, 0x91, 0x9f, 0x49, 0x34, 0x35, 0xf5, 0x2a, 0xc6, 0xa7, 0xad, 0xfd, 0x4d, 0xf6, 0xfd, 0x3f, 0xad, 0xc7, 0x74, 0x21, 0xf6, 0xa8, 0x2c, 0xa1, 0xe7, 0x1c, 0x39, 0x93, 0x5f, 0x10, 0xc1, 0xff, 0xd4, 0xb7, 0xa5, 0x85, 0x4c, 0x2a, 0x99, 0x03, 0xe9, 0x8c, 0x37, 0x7f, 0xd4, 0x03, 0xd6, 0x12, 0xf7, 0xec, 0xb1, 0x6b, 0xd7, 0x98, 0xc4, 0xf7, 0xe5, 0x96, 0xda, 0x5b, 0x06, 0x27, 0x26, 0x59, 0xe5, 0x6d, 0x4e, 0x62, + 0x8c, 0x0e, 0x13, 0x70, 0x7e, 0x95, 0x83, 0x9a, 0x20, 0x06, 0xde, 0xca, 0x4e, 0x41, 0xcd, 0xf5, 0xe6, 0x33, 0xca, 0x0f, 0x27, 0x84, 0xfb, 0xfa, 0x76, 0x71, 0xce, 0x9c, 0xb9, 0x19, 0xe2, 0x88, 0x36, 0x5b, 0xa5, 0xb5, 0xe2, 0x5e, 0x19, 0x12, 0x01, 0xa5, 0x04, 0x99, 0xfa, 0x9c, 0x6f, 0x9e, 0x34, 0x4f, 0xc0, 0x34, 0x71, 0x44, 0x36, 0x57, 0xbb, 0x4d, 0xc8, 0x84, 0x35, 0xf0, 0x47, 0x30, 0x0d, 0x60, 0x74, 0x77, 0x18, 0xf1, 0xf7, 0xab, 0xc1, 0x19, 0x88, 0x38, 0xfa, 0x64, 0xcd, 0xe5, 0x8e, 0x9d, 0x4b, 0x70, 0x71, 0x68, 0xae, 0x61, 0xb7, 0x0b, 0x4a, 0xf1, 0x3e, 0x23, 0x64, 0x97, 0xb4, 0x81, 0x33, 0x88, 0xe2, 0x08, 0xdf, 0xa1, 0x85, 0x09, 0x14, 0xf7, 0xb8, 0x65, 0x1f, 0x7e, 0x90, 0xdd, 0xf5, 0xd3, 0xd5, 0x27, 0x80, 0x69, 0x67, 0xcc, 0x97, 0xb5, 0x44, 0x7b, 0x22, 0x88, 0xc0, 0xcd, 0x07, 0x30, 0xa9, 0xb8, 0x69, 0x56, 0x7b, 0x7e, 0x0d, 0xac, 0xc8, 0x92, 0x48, 0x4d, 0x21, 0xe7, 0x76, 0xa9, 0xdd, 0x42, 0x88, 0x30, 0x3f, 0xdb, 0x47, 0x0e, 0x72, 0x09, 0xff, 0xae, 0x6c, 0x1b, 0xa3, 0x34, 0x02, 0xda, 0xc7, 0x4a, 0xe8, 0xf7, 0x72, 0xcb, 0x5c, 0x66, 0x46, 0xc3, 0x43, 0x3d, 0xd3, 0xee, 0x2e, 0x03, 0x5f, 0xc7, 0x77, 0x2a, 0x5d, 0x49, 0x21, 0xe5, 0x13, 0xab, 0x80, 0x22, 0x73, 0xce, 0x54, 0x67, 0x6c, 0xbd, 0xcf, 0x5a, 0x96, 0xfa, 0x32, 0x15, 0xda, 0x3f, 0x1d, 0xae, 0x29, 0xa7, 0xe6, 0x76, 0x94, 0x9f, 0x58, 0x3b, 0x1c, 0x35, 0x7e, 0xc9, 0xd2, 0x7b, 0x3a, 0x42, 0x62, 0x1d, 0x22, 0xbb, 0x80, 0x0a, 0x96, 0xb2, 0x72, 0x29, 0x61, 0xaf, 0x51, 0x24, 0xb3, 0xb9, 0xab, 0x0a, 0x69, 0x07, 0x3f, 0x55, 0x6f, 0x7f, 0x42, 0xe1, 0x0f, 0xa2, 0xe9, 0x08, + 0x13, 0xde, 0x9e, 0x26, 0xe1, 0xe3, 0xd9, 0x0f, 0x5b, 0xa2, 0x6a, 0xcb, 0x9b, 0xcb, 0x81, 0x47, 0xb2, 0xd1, 0x45, 0x39, 0x36, 0x86, 0xe9, 0x9a, 0x1d, 0xbd, 0xa6, 0x45, 0xec, 0xba, 0xee, 0x63, 0x01, 0x3e, 0xb5, 0xf7, 0x3c, 0xdc, 0x43, 0x32, 0x53, 0xc1, 0x09, 0x2e, 0x75, 0xae, 0xc0, 0xd0, 0x03, 0xd7, 0x17, 0x8e, 0x73, 0x7c, 0x23, 0x10, 0x92, 0x70, 0x49, 0x9a, 0x2c, 0x30, 0xa8, 0x5e, 0xd6, 0x98, 0xe3, 0x2b, 0x2a, 0xee, 0xbe, 0x99, 0x38, 0x20, 0xca, 0x5b, 0x80, 0xc3, 0xa3, 0x89, 0xf9, 0x62, 0x66, 0x11, 0xa9, 0x0e, 0x62, 0x3a, 0x44, 0x88, 0xd3, 0x74, 0xd9, 0xae, 0xd7, 0xf0, 0xa8, 0x5a, 0x6d, 0x7a, 0xf1, 0xd4, 0x98, 0x02, 0x24, 0xfc, 0x37, 0x5c, 0xbf, 0xad, 0x51, 0x08, 0xfb, 0x2c, 0x6d, 0xe7, 0x4e, 0xb5, 0x38, 0x35, 0xca, 0x1b, 0x05, 0x96, 0xd4, 0x1d, 0xf8, 0x13, 0x04, 0x8c, 0x68, 0x59, 0x5e, 0x32, 0xff, 0x2d, 0xc7, 0x37, 0x30, 0x84, 0x14, 0x16, 0x6a, 0x37, 0xa5, 0x2b, 0xb9, 0x69, 0x26, 0xba, 0xdf, 0xa2, 0x3f, 0x44, 0x23, 0x38, 0x1e, 0x32, 0xff, 0x0b, 0x62, 0x58, 0xbb, 0x43, 0x9d, 0x72, 0xa5, 0x7b, 0xd4, 0x63, 0x7d, 0xa2, 0x9a, 0xea, 0x44, 0xa0, 0xc2, 0x7a, 0x85, 0xb5, 0x2e, 0x66, 0x8c, 0x34, 0x03, 0xa4, 0x16, 0x07, 0x80, 0x48, 0xbe, 0x0d, 0x3b, 0xae, 0x2f, 0xa6, 0x1f, 0x3a, 0x69, 0xb0, 0x1d, 0xdb, 0xd9, 0x4c, 0x1a, 0xf3, 0x4e, 0x8a, 0x85, 0xd3, 0x17, 0x48, 0xc3, 0xd0, 0xc4, 0x8b, 0xbd, 0x7b, 0x59, 0x29, 0x05, 0xbc, 0xf7, 0xf8, 0x95, 0x77, 0x24, 0x02, 0x81, 0x97, 0x01, 0x25, 0x34, 0xc8, 0x9c, 0x25, 0x5d, 0x7a, 0x6e, 0xd5, 0x45, 0x06, 0xfb, 0x14, 0x7e, 0xf3, 0xcf, 0xbb, 0x17, 0xce, 0x5c, 0x03, 0x42, 0xd1, 0x0c, 0x84, + 0xf4, 0xa4, 0xe1, 0xca, 0x20, 0x9d, 0x6d, 0xe2, 0xfa, 0xdc, 0x06, 0xf3, 0xcf, 0x9f, 0x33, 0xa6, 0x0a, 0x44, 0xfa, 0x85, 0x2f, 0x66, 0xe3, 0x29, 0x2f, 0x07, 0x99, 0x2a, 0xd8, 0xef, 0x2e, 0x3e, 0x92, 0x3c, 0x69, 0x6d, 0xf6, 0x84, 0x55, 0xee, 0x29, 0xc8, 0x27, 0x35, 0x29, 0x36, 0x6a, 0x75, 0x39, 0xb0, 0xfb, 0x10, 0xf8, 0xd4, 0xd2, 0x02, 0x2b, 0xde, 0x54, 0xb0, 0x9b, 0xe6, 0x52, 0xe0, 0xae, 0xe2, 0xda, 0x8e, 0x59, 0x00, 0xc8, 0xb4, 0x2d, 0x3f, 0xe0, 0xb0, 0x90, 0x5d, 0x1c, 0x3e, 0x31, 0x3f, 0xda, 0x4e, 0xcf, 0x57, 0x1c, 0xe6, 0x35, 0x83, 0xc2, 0xe2, 0x8b, 0xc5, 0xc9, 0x55, 0xf6, 0xa4, 0x9b, 0x24, 0x3a, 0xc3, 0x80, 0x4e, 0xe3, 0x68, 0xcd, 0x15, 0x0f, 0x6d, 0x34, 0x1b, 0x24, 0xfc, 0x1a, 0x5a, 0x24, 0xea, 0x79, 0x81, 0x06, 0xe7, 0x4c, 0x99, 0xd3, 0xdd, 0x6b, 0xc4, 0xc2, 0xd7, 0x8d, 0x82, 0x97, 0xda, 0x3f, 0xc7, 0x5f, 0xbb, 0x8b, 0x2f, 0x7a, 0x1b, 0x0d, 0xfb, 0x88, 0xc3, 0x3c, 0x06, 0xed, 0x38, 0x84, 0x9a, 0x2b, 0x65, 0x4b, 0x84, 0xbc, 0xaa, 0x06, 0xb6, 0xfe, 0x35, 0x6c, 0xcb, 0xe2, 0x5d, 0x85, 0x17, 0xcd, 0x69, 0x82, 0xbb, 0xc9, 0x3e, 0xe2, 0x87, 0xc5, 0xa7, 0x45, 0xea, 0xcf, 0x24, 0xb6, 0x0b, 0x75, 0x5b, 0xa4, 0x0c, 0xdb, 0x39, 0x1d, 0x1c, 0x58, 0xfe, 0x19, 0x9e, 0xff, 0xc5, 0x67, 0x15, 0x43, 0x9d, 0xba, 0x43, 0xa0, 0xe5, 0xff, 0xf2, 0xf9, 0xae, 0xbe, 0xf3, 0x22, 0x64, 0x8f, 0x56, 0xea, 0x12, 0xf7, 0x98, 0x02, 0x42, 0x06, 0x73, 0xfb, 0xcd, 0xe9, 0xa0, 0x6e, 0x86, 0xdf, 0x8e, 0x0f, 0xc5, 0x70, 0x53, 0x57, 0x55, 0xe3, 0x31, 0x97, 0x56, 0xe1, 0x4c, 0x20, 0xf7, 0xe9, 0x30, 0x74, 0x5d, 0xb4, 0xc0, 0x62, 0x13, 0xdc, 0x51, + 0x07, 0x79, 0x9c, 0x2c, 0x84, 0xc4, 0x49, 0x18, 0x65, 0x2f, 0xe9, 0x11, 0x6a, 0xc8, 0x5e, 0x0c, 0xf9, 0x6a, 0x36, 0x91, 0xac, 0xf5, 0xc4, 0x47, 0x1a, 0x26, 0x2c, 0x99, 0x74, 0x82, 0xbf, 0xef, 0x07, 0xa1, 0xe8, 0xe0, 0xc3, 0x45, 0xeb, 0x8d, 0x20, 0x40, 0xab, 0x79, 0x56, 0xdd, 0x0c, 0x66, 0x58, 0xfc, 0x3b, 0x98, 0x7b, 0xdf, 0x86, 0xf7, 0x7e, 0xc9, 0x1a, 0x6f, 0x5d, 0x3b, 0x6f, 0x1b, 0x6c, 0xac, 0x02, 0x2a, 0x2b, 0xd3, 0xa8, 0x4c, 0x1a, 0x66, 0x3b, 0xbf, 0x1f, 0x28, 0xd0, 0x95, 0x96, 0x8c, 0x52, 0xde, 0x63, 0x89, 0x2b, 0x0c, 0xb2, 0x88, 0x69, 0x79, 0x3d, 0xa4, 0x82, 0x46, 0x10, 0xc8, 0xa3, 0x9d, 0x93, 0x96, 0xed, 0x8d, 0x07, 0x36, 0xd2, 0x22, 0x89, 0x6b, 0xcf, 0xaf, 0x5e, 0xb2, 0xbc, 0x14, 0x5f, 0x3a, 0x02, 0x89, 0x61, 0x7c, 0x06, 0x57, 0xef, 0x89, 0x54, 0xfb, 0xd0, 0x2c, 0xe8, 0xa4, 0xfa, 0xe3, 0x5d, 0x10, 0x66, 0x4f, 0x60, 0x28, 0x6d, 0x3f, 0xb1, 0x86, 0x9e, 0x5b, 0xd0, 0x54, 0xac, 0x09, 0x98, 0x22, 0x7e, 0x8f, 0xc2, 0xb8, 0x70, 0x72, 0x4b, 0x30, 0xec, 0x23, 0xe8, 0x22, 0x28, 0x05, 0xe8, 0x36, 0x64, 0xaf, 0x20, 0xae, 0x6e, 0x5a, 0xf1, 0xaf, 0x0f, 0x1f, 0x26, 0x17, 0xe2, 0xe6, 0x62, 0xe1, 0x51, 0x1c, 0x92, 0x4f, 0xa7, 0x6b, 0x3c, 0xae, 0x4f, 0xd8, 0x77, 0xa7, 0x48, 0x4c, 0xc6, 0xc2, 0x37, 0x2f, 0x07, 0xb1, 0x0f, 0x43, 0xf7, 0x8c, 0xdf, 0xc4, 0x29, 0x50, 0x47, 0xe2, 0xc2, 0x06, 0xc2, 0x7f, 0x57, 0x71, 0xae, 0xd1, 0x87, 0x6f, 0x20, 0xfa, 0x15, 0x34, 0x51, 0x3c, 0x19, 0x49, 0x39, 0x7f, 0x0a, 0xb5, 0x3e, 0x9b, 0x75, 0xb6, 0xc6, 0x23, 0xdd, 0xc0, 0xe2, 0x1d, 0x2a, 0x1d, 0x79, 0x86, 0x53, 0xcf, 0x98, 0x3e, 0x34, 0xe1, + 0x65, 0x5a, 0x5b, 0x5b, 0xe8, 0x2a, 0xcb, 0x7c, 0x1c, 0x8c, 0x85, 0x8b, 0x2c, 0xd5, 0x3c, 0xc3, 0x99, 0xe6, 0x6a, 0x15, 0x56, 0x9c, 0xec, 0xd5, 0x43, 0x20, 0x7e, 0x8b, 0x55, 0x0f, 0x4c, 0x9e, 0x7c, 0xa5, 0xb7, 0xa0, 0x4b, 0x57, 0xf2, 0x47, 0x1d, 0x31, 0xf9, 0x9b, 0x0e, 0xf5, 0x4a, 0xe6, 0x68, 0x6e, 0xbb, 0xb9, 0x49, 0x4d, 0xcb, 0x80, 0xa2, 0xd1, 0x64, 0x80, 0xa5, 0x42, 0xe3, 0xed, 0x29, 0x72, 0x76, 0xc7, 0xca, 0x69, 0x4c, 0x80, 0x29, 0x66, 0xa7, 0xe1, 0x5e, 0x01, 0xa1, 0xb7, 0xdd, 0xd3, 0x7f, 0xbc, 0xfc, 0x9e, 0xa8, 0x09, 0x51, 0xe4, 0x92, 0x0a, 0xa6, 0x8f, 0xf6, 0x68, 0xd3, 0x9e, 0x50, 0xcd, 0x9f, 0x54, 0x24, 0x9d, 0x41, 0xb5, 0x47, 0x3d, 0xbd, 0x7c, 0x29, 0x74, 0x8d, 0xba, 0xb6, 0x89, 0x4c, 0xc1, 0x04, 0x63, 0xef, 0x9f, 0x37, 0x0b, 0x51, 0xb3, 0x54, 0x93, 0x30, 0xe4, 0x66, 0x51, 0xe3, 0x6e, 0x61, 0xb0, 0x10, 0xb9, 0x2e, 0x85, 0xd8, 0x26, 0x80, 0x8f, 0xa8, 0xc5, 0x2a, 0x89, 0x54, 0x08, 0xd9, 0x5d, 0x29, 0x1b, 0xcd, 0x98, 0x1d, 0xc5, 0x19, 0xf5, 0x01, 0xad, 0x24, 0x9f, 0x2b, 0x98, 0x5b, 0xa5, 0xbc, 0x91, 0xd1, 0xb7, 0x70, 0xd3, 0x55, 0xa6, 0xb0, 0x49, 0x42, 0x9d, 0x1e, 0xc4, 0x0e, 0xf0, 0x1b, 0x02, 0x0d, 0x2f, 0x39, 0xb4, 0x54, 0x88, 0xb8, 0x90, 0x19, 0x6a, 0xcf, 0x42, 0xbc, 0xdc, 0xd4, 0xdd, 0x68, 0xcc, 0xfb, 0x37, 0x9c, 0x6b, 0x90, 0x5a, 0x84, 0xb6, 0x3c, 0xd3, 0xc0, 0xa4, 0x0a, 0x55, 0x69, 0xba, 0x84, 0x39, 0x8f, 0x4d, 0x07, 0x4a, 0x61, 0x8b, 0xfe, 0xf9, 0x2a, 0xde, 0x75, 0x4e, 0x1d, 0x75, 0x0c, 0x98, 0x18, 0xd7, 0x43, 0x95, 0x13, 0x64, 0x04, 0xe7, 0x69, 0x10, 0x9a, 0x3c, 0xea, 0x18, 0x47, 0xa0, 0x9a, 0xb0, + 0x95, 0x3a, 0x98, 0x45, 0x2e, 0x98, 0xda, 0x2f, 0xc8, 0xc8, 0xc9, 0xac, 0x08, 0xef, 0xb4, 0x3b, 0x82, 0x39, 0xe8, 0xa2, 0xe8, 0xd4, 0xf9, 0x16, 0x2e, 0x54, 0x7c, 0x66, 0x34, 0x40, 0xed, 0x03, 0x0f, 0x60, 0x09, 0x92, 0xf2, 0x62, 0x37, 0x75, 0x0f, 0x85, 0xfa, 0xdb, 0xf2, 0xf7, 0xe0, 0x39, 0xf7, 0x1b, 0xd4, 0x24, 0x14, 0xc6, 0xf5, 0xde, 0xee, 0xcc, 0x21, 0x0e, 0x65, 0x22, 0x4f, 0x11, 0xfc, 0x55, 0x40, 0x93, 0x5f, 0xad, 0xc4, 0x5d, 0x78, 0xdd, 0x13, 0x42, 0x57, 0x81, 0x52, 0xeb, 0x91, 0x0f, 0x1c, 0xe1, 0x69, 0xa3, 0x34, 0xe2, 0x8c, 0xdc, 0x81, 0xf8, 0x5d, 0xb0, 0x51, 0x7c, 0x4f, 0x53, 0x5c, 0xf7, 0xf4, 0xb6, 0xcd, 0xc2, 0x16, 0x5e, 0x49, 0x6f, 0xf6, 0x1d, 0x5e, 0xe9, 0xdf, 0xf1, 0xec, 0x84, 0x05, 0xaf, 0x69, 0xd0, 0x3c, 0x2e, 0x87, 0x3e, 0x65, 0xf5, 0x0f, 0x87, 0x77, 0xa2, 0x04, 0x6d, 0x23, 0xf6, 0xb0, 0x6a, 0xfd, 0x1f, 0xd3, 0xc0, 0x06, 0x29, 0xb5, 0x1e, 0x11, 0xe8, 0x9c, 0x2c, 0x79, 0xd8, 0x31, 0x9f, 0x5b, 0x50, 0x09, 0xed, 0x40, 0x85, 0x49, 0xc6, 0x2d, 0xdd, 0x0f, 0xd8, 0xa3, 0x26, 0xf9, 0x67, 0xfb, 0xae, 0x1c, 0x63, 0x4f, 0x47, 0x71, 0x64, 0x47, 0xe2, 0x4b, 0x20, 0xcc, 0xf4, 0xe8, 0x19, 0x95, 0x70, 0xc6, 0x07, 0xcd, 0x0d, 0x32, 0x92, 0xc0, 0xec, 0xc7, 0x9d, 0x63, 0xd0, 0x5f, 0xad, 0x7c, 0x9c, 0x3c, 0x6e, 0x61, 0x41, 0x8c, 0x1d, 0x3c, 0x9e, 0x52, 0xee, 0x7f, 0x18, 0x1b, 0xd5, 0x04, 0x91, 0x30, 0xfd, 0xb1, 0x1f, 0x45, 0xdd, 0xee, 0xf8, 0x20, 0x37, 0x27, 0x42, 0xf1, 0xf5, 0xd5, 0x0b, 0x66, 0x7d, 0x8e, 0x6e, 0xb1, 0x87, 0x13, 0xb4, 0x5b, 0x63, 0x16, 0x78, 0x25, 0xa3, 0xdb, 0x7d, 0x7c, 0xc2, 0xb1, 0x6f, 0x6f, 0x2d, + 0x1b, 0x3a, 0xef, 0x43, 0xf5, 0x13, 0xc2, 0x14, 0x3e, 0x0c, 0x4e, 0x7a, 0xb5, 0x16, 0x80, 0xcb, 0x0b, 0x77, 0x03, 0x9c, 0x8f, 0x43, 0x55, 0x5f, 0x60, 0xc9, 0x2e, 0xdd, 0xe1, 0x3a, 0x9a, 0x01, 0x24, 0xe6, 0xf7, 0x25, 0x4c, 0x69, 0x61, 0x67, 0xd0, 0x99, 0x65, 0x1e, 0xa4, 0xb8, 0x99, 0x0c, 0xa9, 0x5b, 0x88, 0xc2, 0x64, 0x92, 0x2b, 0x31, 0xe7, 0x55, 0x46, 0xa7, 0x81, 0x0d, 0xc0, 0x22, 0x02, 0x6c, 0xd7, 0x1c, 0xf0, 0xc9, 0x36, 0xb0, 0x24, 0x44, 0xe0, 0xc1, 0x84, 0x9c, 0xfa, 0xaa, 0x50, 0xf0, 0x46, 0xb0, 0x10, 0x18, 0xbf, 0xb2, 0x6e, 0x1a, 0x9b, 0x47, 0xe0, 0x0a, 0x00, 0x88, 0x44, 0xca, 0xc4, 0xd8, 0xee, 0xa9, 0xdc, 0x0a, 0x34, 0x44, 0xe1, 0x14, 0x7c, 0x0e, 0xc7, 0x87, 0xbc, 0x84, 0x9e, 0xd6, 0x9c, 0x76, 0x96, 0x4c, 0xca, 0xe6, 0x51, 0x9c, 0x92, 0x1c, 0xb4, 0xea, 0xed, 0x95, 0xc0, 0x1f, 0x8f, 0xcd, 0x11, 0x6e, 0xbd, 0xb5, 0xaa, 0xf6, 0x08, 0x52, 0x25, 0x4f, 0x7a, 0xfd, 0x1a, 0xe5, 0x9c, 0x07, 0x8e, 0x83, 0x50, 0xae, 0xcf, 0x9f, 0x14, 0x4d, 0xf7, 0x52, 0x86, 0x7b, 0x09, 0xfc, 0x48, 0x36, 0x97, 0xcc, 0xef, 0x18, 0x66, 0xb2, 0x84, 0x5f, 0x11, 0x47, 0x3c, 0xc1, 0x2e, 0x19, 0x5e, 0xda, 0x95, 0xe5, 0x63, 0xb3, 0x15, 0x58, 0x49, 0x52, 0xe2, 0x7c, 0x44, 0x7d, 0xbe, 0xdd, 0xbf, 0x7d, 0x89, 0x0d, 0xd6, 0x5f, 0xaa, 0x27, 0xc8, 0x9d, 0xfb, 0x57, 0x4a, 0xfd, 0x41, 0x00, 0xb4, 0x8b, 0x61, 0xc6, 0x93, 0xa9, 0xf2, 0x68, 0x66, 0x5e, 0xb1, 0xb4, 0x06, 0x75, 0xa6, 0xcb, 0x29, 0x03, 0x31, 0xd0, 0x0c, 0x68, 0x7c, 0x74, 0x86, 0xf9, 0xa9, 0x58, 0x37, 0xe1, 0xdf, 0x59, 0xe3, 0x22, 0x92, 0x1d, 0x49, 0xc5, 0x91, 0x09, 0xcd, 0xb3, 0xa2, 0x31, + 0x98, 0x5b, 0x66, 0xd9, 0xa9, 0xf8, 0xc8, 0xf3, 0xce, 0x4f, 0xf8, 0x23, 0xed, 0x85, 0xd9, 0xa3, 0xee, 0xb2, 0x53, 0x78, 0x5d, 0x05, 0x30, 0xee, 0xf5, 0xce, 0x24, 0x9d, 0x0b, 0x4c, 0x76, 0xa1, 0xa8, 0x02, 0x81, 0xd5, 0xdd, 0xe4, 0xbd, 0x2e, 0x6a, 0x97, 0x7f, 0x64, 0x76, 0x18, 0x2c, 0x06, 0x8e, 0x53, 0xfd, 0x91, 0xea, 0x8a, 0xfa, 0xeb, 0xc6, 0x9a, 0xe0, 0xf6, 0x37, 0x64, 0xd2, 0x02, 0xa2, 0x0d, 0x33, 0x97, 0xdd, 0x70, 0x3e, 0x40, 0x5c, 0x7e, 0xf6, 0xc9, 0x90, 0x28, 0xa8, 0x36, 0xf7, 0x9b, 0x8b, 0x88, 0xc2, 0xea, 0xe3, 0xe7, 0x4d, 0x4e, 0x69, 0x1e, 0x4c, 0x15, 0xcc, 0x09, 0xad, 0xf9, 0xd0, 0x38, 0xb0, 0xf0, 0x1c, 0x91, 0x5d, 0xf4, 0x0b, 0x18, 0xae, 0x5f, 0xad, 0xf5, 0x1a, 0x25, 0x07, 0x68, 0x82, 0x47, 0x53, 0x29, 0x53, 0xd6, 0x12, 0x1d, 0x41, 0xf4, 0xc5, 0x11, 0x84, 0xd0, 0xd4, 0x1e, 0x64, 0x37, 0xab, 0xe9, 0x18, 0x8e, 0x24, 0x4d, 0x90, 0xe5, 0x86, 0x58, 0x18, 0x7c, 0x8e, 0x34, 0x6d, 0x82, 0x3b, 0x98, 0x0a, 0x71, 0x9b, 0x0b, 0x6b, 0x7d, 0xfb, 0xf6, 0x4f, 0xed, 0x2f, 0x3a, 0xcd, 0x2a, 0x21, 0xb3, 0xc1, 0x70, 0x66, 0x4e, 0x6d, 0xa6, 0x54, 0x6e, 0x8f, 0x20, 0x6f, 0x05, 0xd9, 0x7d, 0xdb, 0x20, 0xf9, 0xb7, 0x00, 0x50, 0xb8, 0xce, 0x46, 0xeb, 0xce, 0xce, 0xdf, 0xea, 0x11, 0x28, 0xd5, 0x31, 0xbb, 0x13, 0xdb, 0x09, 0x27, 0x54, 0x01, 0x40, 0xbc, 0xa6, 0x1d, 0x4a, 0x4b, 0x3c, 0xca, 0x97, 0xe1, 0xbd, 0x2d, 0x22, 0x13, 0x18, 0x1d, 0x1d, 0xd3, 0x17, 0xa0, 0x1f, 0x87, 0xb4, 0xea, 0x8e, 0xb3, 0x9a, 0xb1, 0x55, 0xc3, 0x90, 0x8d, 0x01, 0xc8, 0x96, 0x24, 0x64, 0xb7, 0xe7, 0x21, 0x88, 0xcc, 0xa1, 0x5b, 0x14, 0x05, 0x85, 0x8f, 0x37, + 0x69, 0x17, 0x36, 0x8a, 0x3d, 0xed, 0xf1, 0xa9, 0x25, 0x62, 0x0f, 0x5e, 0x17, 0xd4, 0xaa, 0x06, 0x1c, 0x69, 0xb0, 0x15, 0x28, 0x98, 0x27, 0xc3, 0x6a, 0x94, 0xd0, 0xb1, 0x07, 0xad, 0xd3, 0xbb, 0x62, 0x82, 0xcd, 0xc4, 0xf2, 0xe6, 0x80, 0x69, 0x82, 0x41, 0x18, 0x65, 0x5c, 0xfa, 0x44, 0xfd, 0x39, 0x57, 0x49, 0x2f, 0xef, 0x08, 0x75, 0x18, 0xce, 0x37, 0x2c, 0xeb, 0xf4, 0x0e, 0x62, 0xd1, 0x82, 0x93, 0x88, 0x9f, 0xb7, 0x8c, 0x07, 0x78, 0x21, 0x0b, 0x06, 0x90, 0x5c, 0xf2, 0x68, 0x74, 0x0e, 0x72, 0x48, 0xd8, 0x2f, 0x5c, 0x5a, 0xea, 0xba, 0x1b, 0x34, 0x3f, 0x48, 0x69, 0x15, 0xf0, 0x73, 0x56, 0x88, 0x82, 0x57, 0xab, 0xdc, 0x84, 0x50, 0xbf, 0xfc, 0x59, 0xdb, 0xe5, 0x65, 0x6d, 0x67, 0xd5, 0xba, 0x12, 0x98, 0x1d, 0x64, 0x5e, 0x8a, 0xe9, 0xf6, 0x44, 0x06, 0x5f, 0x9c, 0x51, 0x9d, 0xd9, 0x69, 0x9b, 0xcc, 0x6c, 0x89, 0xd1, 0xc8, 0xdd, 0x76, 0xd6, 0x8e, 0xd2, 0x1a, 0xd0, 0x36, 0xf1, 0xd3, 0x30, 0x86, 0x6d, 0x9a, 0x16, 0xb7, 0x40, 0x7a, 0xaf, 0x89, 0x9e, 0xbf, 0xc7, 0x7a, 0x7f, 0xee, 0xf8, 0x1a, 0xff, 0x4e, 0x74, 0x91, 0xd6, 0x79, 0x95, 0x2e, 0xe9, 0x3b, 0x10, 0xed, 0x64, 0xb8, 0xfb, 0x65, 0xa5, 0xab, 0xab, 0x06, 0x9a, 0x20, 0x13, 0xe4, 0xc0, 0x79, 0x1d, 0x4d, 0x18, 0xea, 0x38, 0xc9, 0x1c, 0x8a, 0xec, 0x41, 0xae, 0x90, 0x5d, 0x3a, 0x29, 0x2f, 0x06, 0x20, 0x71, 0xbf, 0x13, 0x11, 0x02, 0x5f, 0x00, 0x66, 0x92, 0x93, 0x77, 0xef, 0x0d, 0x81, 0x7e, 0x9d, 0xd9, 0x57, 0x52, 0xda, 0x43, 0x41, 0xb9, 0xef, 0x99, 0x88, 0xda, 0xa9, 0xb1, 0x78, 0x3c, 0x7c, 0xda, 0xfc, 0xd7, 0x69, 0xdc, 0x72, 0x5c, 0xab, 0xc3, 0x5c, 0x0e, 0xf5, 0xf3, 0xfa, 0x20, + 0x5d, 0x6e, 0x20, 0x29, 0xa4, 0xd5, 0x58, 0x76, 0x4a, 0xfd, 0x9e, 0xb9, 0x58, 0x87, 0x07, 0x76, 0x94, 0x50, 0x88, 0xdd, 0x39, 0x59, 0xd9, 0x4c, 0x5b, 0xdf, 0xec, 0xa8, 0x56, 0x2f, 0x09, 0xf5, 0x97, 0xb1, 0x41, 0x8d, 0x73, 0xa7, 0xf5, 0x73, 0x74, 0xef, 0x34, 0x45, 0x90, 0x1a, 0x7c, 0x2e, 0x84, 0x2b, 0x45, 0xe7, 0x1d, 0x2a, 0x6c, 0xbf, 0xa9, 0xc0, 0x94, 0x1e, 0xf7, 0x26, 0x11, 0x34, 0x02, 0xec, 0x74, 0x83, 0xd2, 0xa9, 0x34, 0x7b, 0x3c, 0x41, 0x9a, 0x53, 0xe6, 0x91, 0x2d, 0x0b, 0x7a, 0xef, 0x14, 0xb0, 0x34, 0x19, 0xfe, 0xed, 0x7b, 0x77, 0x30, 0x87, 0x90, 0x5c, 0xef, 0xcf, 0x46, 0x6c, 0x59, 0xe6, 0xda, 0x62, 0xb4, 0xf4, 0xd5, 0xb9, 0x9b, 0xc7, 0x86, 0x5d, 0x1b, 0x42, 0x8f, 0x15, 0x70, 0xb6, 0x69, 0xd3, 0x7f, 0x05, 0xb5, 0x9b, 0xbc, 0xa4, 0xc3, 0xcc, 0xb1, 0x38, 0x61, 0x39, 0x51, 0x96, 0x45, 0x21, 0xab, 0x98, 0x21, 0xc3, 0x84, 0x3c, 0x9d, 0xce, 0x2e, 0x71, 0xba, 0x14, 0xbd, 0xcb, 0xe8, 0x99, 0x7b, 0x27, 0xd9, 0x39, 0x5b, 0xba, 0x98, 0x63, 0x28, 0xf5, 0xbe, 0x12, 0x8b, 0x2f, 0x60, 0xa2, 0x5e, 0xdf, 0xed, 0x13, 0x05, 0x9f, 0x54, 0xfe, 0x75, 0xa6, 0x41, 0xaf, 0x64, 0x19, 0x8a, 0xb7, 0xd5, 0xf7, 0x68, 0xc1, 0xe4, 0x0f, 0x0a, 0x6d, 0x41, 0x2a, 0x7e, 0x3c, 0xc2, 0xe2, 0x47, 0xe6, 0xbf, 0xba, 0x8d, 0x4d, 0xda, 0x8f, 0xc9, 0x47, 0x3a, 0x8b, 0x22, 0xd1, 0x66, 0x9f, 0xf0, 0xd0, 0x07, 0x33, 0x67, 0xf7, 0xb5, 0x36, 0x06, 0x8d, 0xe6, 0x6e, 0x73, 0xd8, 0xe2, 0x88, 0x3b, 0x0f, 0x48, 0xd7, 0xd6, 0x5a, 0x87, 0x27, 0x52, 0xe8, 0x51, 0x30, 0xe1, 0x91, 0x8a, 0x15, 0x0c, 0x03, 0x4f, 0x24, 0x85, 0xbf, 0x1f, 0xa0, 0x74, 0x8c, 0xa5, 0xbd, + 0xf1, 0xff, 0x39, 0x9c, 0x65, 0xc3, 0x97, 0xa4, 0xb8, 0xca, 0xaa, 0xa8, 0xc7, 0xdb, 0x9f, 0x88, 0xbc, 0x41, 0x22, 0x3e, 0x13, 0x51, 0x73, 0xf4, 0xb7, 0xce, 0xd3, 0xe7, 0x93, 0xb3, 0x29, 0xce, 0x81, 0xe9, 0x39, 0x81, 0x8d, 0x0f, 0xb3, 0xe8, 0x28, 0x8f, 0x16, 0x66, 0x41, 0xa5, 0xea, 0xbc, 0x93, 0xc5, 0x21, 0x0c, 0xeb, 0xa1, 0x0a, 0x1d, 0xea, 0xe8, 0x8e, 0xaa, 0xfb, 0x9d, 0xe6, 0xff, 0x40, 0x3e, 0xa3, 0x4f, 0xf9, 0x30, 0xeb, 0x9d, 0xe4, 0x88, 0x60, 0xe6, 0xb5, 0x36, 0x0e, 0x5e, 0x3b, 0x9c, 0x5a, 0xdd, 0x61, 0x88, 0x0b, 0xae, 0x03, 0xa7, 0xe1, 0xa4, 0xe4, 0xf3, 0x7f, 0x16, 0x72, 0xf4, 0x57, 0x94, 0x32, 0x73, 0x0f, 0x04, 0xa7, 0x1c, 0x42, 0x40, 0xb1, 0xc9, 0xd8, 0x8b, 0x50, 0x9a, 0x43, 0x3b, 0x8a, 0xd5, 0xfc, 0xd3, 0x99, 0x57, 0x78, 0x1a, 0xc2, 0xc8, 0xa4, 0x63, 0x84, 0x25, 0xab, 0xf4, 0x67, 0x76, 0x41, 0x9b, 0x14, 0x9f, 0x7b, 0x57, 0xb9, 0x05, 0x4f, 0xe1, 0xa9, 0x30, 0x37, 0x1f, 0xd0, 0x59, 0xdb, 0x19, 0x81, 0xdd, 0xb7, 0x5c, 0x1e, 0x8d, 0x0e, 0xe7, 0x1c, 0xca, 0xb6, 0x6c, 0xb6, 0x8d, 0xd0, 0xa5, 0xcb, 0x80, 0x30, 0xc6, 0xb2, 0xe9, 0xe1, 0xf9, 0xec, 0xfe, 0x76, 0xac, 0x46, 0xa4, 0xe1, 0xf0, 0x53, 0x70, 0x83, 0x5a, 0x54, 0xdd, 0x50, 0x4a, 0xfa, 0x17, 0x2f, 0x18, 0xf7, 0x2f, 0x6c, 0x78, 0x6d, 0xc6, 0xf4, 0x3e, 0x27, 0x76, 0x18, 0xe2, 0xa7, 0x01, 0xd9, 0x7d, 0x14, 0xdf, 0x33, 0xea, 0x8a, 0x72, 0x42, 0xf4, 0x6d, 0xd8, 0x2f, 0xd2, 0x4b, 0x53, 0x0c, 0xff, 0x4c, 0x83, 0x5e, 0xbc, 0xc8, 0xcf, 0x92, 0xc9, 0xf5, 0xb5, 0x0d, 0x81, 0xae, 0xa4, 0xb6, 0xda, 0xda, 0xb9, 0xcd, 0x12, 0x6e, 0xe3, 0x1d, 0xbe, 0xf1, 0xf5, 0x81, 0x7c, + 0x04, 0x19, 0xe9, 0xef, 0xe7, 0xe7, 0x90, 0x9e, 0x9a, 0x1c, 0x04, 0x2b, 0x2c, 0xb7, 0xb4, 0x1a, 0x17, 0xe9, 0x43, 0xf2, 0xed, 0xdc, 0x0e, 0x00, 0x0c, 0x4b, 0xd9, 0xda, 0xd7, 0x35, 0x8c, 0xbd, 0x4b, 0x4a, 0xc9, 0xed, 0xb1, 0x1b, 0x52, 0xc3, 0xe7, 0x22, 0x7a, 0x2b, 0x77, 0x23, 0x2a, 0x12, 0x02, 0x80, 0xc2, 0xdf, 0xb4, 0xcf, 0x07, 0x64, 0x63, 0x4f, 0xdc, 0x69, 0xb3, 0x05, 0x67, 0x43, 0x0b, 0xaa, 0x76, 0xb6, 0x9a, 0x38, 0xfa, 0x97, 0x76, 0xa7, 0x09, 0x35, 0x4f, 0x9f, 0x73, 0x87, 0x07, 0xb8, 0x41, 0xe4, 0xa5, 0x47, 0xcc, 0x98, 0x1d, 0x58, 0x35, 0xce, 0xeb, 0xb6, 0x19, 0x0e, 0x84, 0xab, 0x63, 0x04, 0x0f, 0xb2, 0xaa, 0xde, 0x10, 0xd4, 0xfd, 0xbc, 0x80, 0x30, 0xf8, 0x3f, 0xb4, 0x1b, 0x41, 0x40, 0x99, 0x49, 0x1e, 0xa8, 0xf3, 0xa3, 0x65, 0x19, 0x94, 0xb3, 0xd1, 0x07, 0xc6, 0x2f, 0x0b, 0xdb, 0xac, 0xff, 0xd5, 0x61, 0x9a, 0x6b, 0x95, 0xdb, 0xc4, 0xfd, 0xff, 0x13, 0xaa, 0x42, 0x1c, 0xf1, 0xcb, 0x04, 0x93, 0x64, 0x26, 0x91, 0x81, 0x0a, 0x4e, 0x78, 0xe0, 0x76, 0x5f, 0x6e, 0xd6, 0x03, 0x75, 0xab, 0xba, 0x77, 0x87, 0xbc, 0x85, 0xc9, 0x4e, 0xc4, 0x1c, 0xf6, 0xd6, 0xd6, 0xd1, 0x5f, 0x3e, 0xb9, 0xf3, 0x34, 0xc9, 0x94, 0xf8, 0xf7, 0x33, 0x61, 0xd8, 0x45, 0x7b, 0xcb, 0x64, 0x27, 0xdb, 0x3f, 0x39, 0xf9, 0xb1, 0x25, 0x42, 0xd2, 0xa7, 0x27, 0x94, 0xb7, 0x93, 0xdd, 0x2e, 0xbb, 0x12, 0x06, 0xb5, 0xb7, 0x49, 0x0d, 0xcc, 0xe2, 0xb4, 0x0e, 0x49, 0x73, 0xa1, 0xd5, 0x49, 0xd4, 0x13, 0x4e, 0x7b, 0x19, 0x59, 0xfc, 0x62, 0x9e, 0xda, 0x07, 0xfb, 0x76, 0x82, 0xaf, 0xb5, 0x21, 0xcd, 0xbb, 0x88, 0x3d, 0xbf, 0xe9, 0x75, 0x20, 0x2a, 0x00, 0xb8, 0x57, + 0xcc, 0xcc, 0x41, 0xd6, 0x8b, 0x64, 0x59, 0x59, 0x97, 0xa0, 0xf4, 0x6f, 0x1e, 0x51, 0xbe, 0x68, 0x0d, 0x95, 0x55, 0x74, 0x9e, 0xe0, 0xff, 0xd1, 0xbd, 0x4f, 0x01, 0xf7, 0x9b, 0xfc, 0x78, 0x77, 0x5b, 0xba, 0x67, 0xab, 0xed, 0x78, 0x0f, 0x03, 0x62, 0x57, 0x7b, 0x0b, 0x40, 0x53, 0x47, 0xfc, 0x28, 0xed, 0x4f, 0x8d, 0xa4, 0x7e, 0x90, 0x29, 0xb3, 0xe6, 0xd3, 0x7d, 0x39, 0xc8, 0x4d, 0xf0, 0xca, 0xfc, 0x84, 0x34, 0xc5, 0x29, 0xa1, 0x5f, 0x7b, 0xd7, 0x46, 0x97, 0xf8, 0x17, 0x2e, 0x4b, 0xa8, 0x68, 0xfd, 0xbd, 0x05, 0xea, 0x94, 0xaf, 0xf0, 0x8f, 0x06, 0x99, 0x70, 0x40, 0x2e, 0xba, 0xf0, 0x63, 0xe0, 0x6a, 0x92, 0x3c, 0xe4, 0x43, 0xa0, 0x62, 0x01, 0x7c, 0x11, 0xeb, 0xe7, 0x7d, 0xd0, 0xfd, 0xb3, 0x1a, 0xa9, 0xae, 0xe4, 0x0c, 0x22, 0xfc, 0xdd, 0x5d, 0x05, 0x74, 0x54, 0x20, 0x30, 0x95, 0x08, 0x28, 0x49, 0x6d, 0x2c, 0x86, 0x50, 0x9d, 0xfc, 0x3d, 0xf2, 0xa9, 0xef, 0xef, 0xec, 0xe0, 0x36, 0xd3, 0x1f, 0x53, 0x24, 0xfb, 0xd9, 0xe4, 0xe1, 0x30, 0x43, 0x47, 0x6b, 0x25, 0x1c, 0xa3, 0x26, 0xdc, 0x0d, 0x75, 0x05, 0xa7, 0x63, 0x6c, 0x6d, 0x71, 0x63, 0xa7, 0xcb, 0x3e, 0x89, 0xe5, 0x15, 0x4e, 0x1e, 0x73, 0xbb, 0xdc, 0xc6, 0x35, 0xe9, 0x3d, 0x93, 0x0e, 0x7a, 0xc8, 0x0a, 0x63, 0x02, 0xa9, 0xd8, 0x2c, 0xa6, 0x69, 0xb9, 0x53, 0xb9, 0x8c, 0xe7, 0x26, 0xbe, 0x2b, 0xc0, 0x13, 0x3a, 0xd9, 0x10, 0x83, 0x9d, 0xca, 0x35, 0x8e, 0x28, 0x9b, 0x88, 0x37, 0xe2, 0x2d, 0x97, 0x9f, 0x7a, 0xf1, 0xbc, 0x37, 0x79, 0x51, 0x13, 0xc1, 0xd5, 0x08, 0xeb, 0x9a, 0xa9, 0x01, 0xa8, 0x40, 0x3d, 0xf2, 0xc2, 0x41, 0x2b, 0x7f, 0x2a, 0xcb, 0xf4, 0x42, 0xb5, 0x39, 0x2d, 0xd8, + 0xa7, 0x33, 0x71, 0x75, 0x59, 0xfa, 0x96, 0xe2, 0x49, 0xe2, 0xbb, 0xf5, 0xd8, 0xc9, 0xf9, 0x16, 0x04, 0xc1, 0x5f, 0x46, 0x6f, 0xfa, 0x8d, 0x7c, 0x53, 0x84, 0x04, 0xc5, 0xc5, 0x97, 0xb5, 0xba, 0x5d, 0xaa, 0x85, 0xf7, 0x6d, 0xe3, 0x70, 0x39, 0xda, 0x12, 0xe3, 0x3c, 0x62, 0x58, 0x0e, 0x16, 0x5f, 0xcc, 0x58, 0x28, 0x02, 0x45, 0xfd, 0xea, 0xfb, 0x91, 0xb9, 0x08, 0x80, 0x28, 0x7c, 0x3d, 0x86, 0xf6, 0x0f, 0xa3, 0x79, 0xdf, 0x38, 0xb5, 0x5f, 0x4e, 0x4d, 0x85, 0xf0, 0x5a, 0xd7, 0x33, 0xc8, 0x6b, 0x5b, 0x2f, 0xb8, 0x33, 0x0e, 0x18, 0x8b, 0xa0, 0x72, 0x37, 0xb7, 0xad, 0xce, 0xd6, 0x79, 0xd0, 0xfc, 0x2b, 0xda, 0xa1, 0x69, 0x66, 0xa1, 0x38, 0x45, 0xae, 0x1e, 0x95, 0xbd, 0x18, 0x24, 0x7a, 0x27, 0xb2, 0xc7, 0xb4, 0x2d, 0x4a, 0xdb, 0xce, 0x80, 0x45, 0x83, 0x54, 0xc9, 0x67, 0xee, 0xb2, 0x0e, 0x0d, 0xb2, 0xe9, 0x27, 0xf4, 0xdc, 0x2f, 0xc4, 0xe9, 0xb5, 0x48, 0x27, 0xcc, 0xfc, 0xb9, 0xfd, 0x75, 0x11, 0xf5, 0xdd, 0xb2, 0xc9, 0x1d, 0xbe, 0x04, 0x49, 0x93, 0x4a, 0x76, 0x75, 0x3f, 0x50, 0x1f, 0x41, 0x44, 0xee, 0xcf, 0xa6, 0x6c, 0xdd, 0xaa, 0x4e, 0xee, 0x12, 0x78, 0xca, 0x72, 0xb3, 0xbc, 0x39, 0x08, 0xc2, 0xcf, 0x47, 0x51, 0x78, 0xe1, 0x55, 0x10, 0x32, 0x3c, 0xcd, 0x95, 0x6e, 0x1a, 0x39, 0x34, 0x3b, 0xf4, 0x95, 0x52, 0xc3, 0x93, 0xb8, 0xc8, 0x4e, 0x81, 0x03, 0x96, 0x69, 0x42, 0x59, 0xc8, 0x9b, 0x2c, 0x64, 0x56, 0x5b, 0x53, 0x86, 0x2f, 0x4b, 0x8f, 0xef, 0x37, 0xc7, 0x2f, 0xe2, 0xb3, 0x40, 0x89, 0xf1, 0x60, 0x74, 0x34, 0x85, 0xfa, 0xaa, 0xc7, 0x40, 0x5a, 0xc7, 0x7f, 0xe7, 0x83, 0xf9, 0x75, 0x19, 0x43, 0x1b, 0x1e, 0xaa, 0xdf, 0x75, 0xa3, + 0x56, 0xf6, 0xb8, 0xcb, 0xad, 0xd3, 0xcd, 0x88, 0xed, 0x8e, 0xe6, 0xc8, 0xd7, 0x4b, 0x9b, 0x64, 0x97, 0x78, 0x84, 0xf3, 0x20, 0xfa, 0xbe, 0xdc, 0x0b, 0x27, 0x84, 0x90, 0x15, 0x00, 0x26, 0x73, 0x86, 0xed, 0xd7, 0x69, 0xd7, 0x3d, 0xce, 0x6f, 0x6a, 0x83, 0x27, 0x11, 0x86, 0xb1, 0xf1, 0xa1, 0xf7, 0x10, 0x50, 0x66, 0xe4, 0xdf, 0xcb, 0x64, 0xdf, 0xfd, 0x24, 0xee, 0xc1, 0xbf, 0xbe, 0xf4, 0x5f, 0x95, 0x6d, 0x01, 0x3e, 0x4a, 0xd9, 0x09, 0xa2, 0x25, 0x5c, 0x0b, 0x3f, 0xac, 0x29, 0x51, 0xa8, 0x09, 0xd2, 0x76, 0xd7, 0x0c, 0x91, 0x07, 0xcc, 0x2b, 0x53, 0x65, 0x4c, 0xb9, 0xa6, 0x6a, 0x64, 0xc8, 0xdb, 0x14, 0xe0, 0x5a, 0xd5, 0x3b, 0xf1, 0x02, 0x4c, 0x4d, 0xb8, 0x4a, 0xa2, 0x42, 0x1f, 0x7b, 0xdf, 0x5a, 0xf2, 0x1f, 0xc4, 0xd6, 0x42, 0xf6, 0x50, 0xec, 0x78, 0xb5, 0xa6, 0xa7, 0xbc, 0x46, 0xdf, 0x2d, 0xb2, 0xea, 0x4b, 0xb0, 0x63, 0xd3, 0xe6, 0x8a, 0xaa, 0x79, 0x42, 0x97, 0xce, 0x04, 0xf5, 0x5a, 0x5f, 0x6b, 0x70, 0xba, 0x85, 0x36, 0x6b, 0xe3, 0x42, 0x59, 0x16, 0x99, 0x30, 0x4b, 0xcd, 0xba, 0xc0, 0xd0, 0xd8, 0xcb, 0x0a, 0x9b, 0xbf, 0x7b, 0x70, 0x41, 0x83, 0x80, 0xf6, 0x6a, 0xea, 0x4d, 0xa7, 0x2b, 0xe8, 0x07, 0x10, 0xbf, 0xfa, 0x19, 0x09, 0x57, 0x74, 0xe8, 0x0c, 0xdb, 0xea, 0xdb, 0xe8, 0x3b, 0xf8, 0x63, 0x5f, 0xaf, 0xf4, 0x3a, 0xa9, 0xf2, 0x54, 0xd0, 0x7e, 0x6a, 0x24, 0x77, 0x08, 0x77, 0x82, 0x02, 0xc5, 0x39, 0xdd, 0x28, 0xe8, 0xb7, 0x9d, 0x73, 0xfd, 0x72, 0x29, 0x3d, 0xa6, 0x0c, 0x4e, 0x5a, 0x83, 0xe5, 0x81, 0x09, 0xab, 0xd4, 0x68, 0xdc, 0x3a, 0x9f, 0x19, 0x89, 0x2a, 0x1a, 0x4c, 0xbe, 0x24, 0x56, 0xe4, 0x39, 0xb0, 0x36, 0x5a, 0x85, + 0xfd, 0xb6, 0xfb, 0x5f, 0x6a, 0x7f, 0x9e, 0xd4, 0xd1, 0x17, 0x31, 0x43, 0x1f, 0xa5, 0xfd, 0x03, 0xdb, 0x18, 0x4c, 0xba, 0x35, 0xbd, 0xd5, 0x42, 0xb8, 0xd4, 0x19, 0x4d, 0xb0, 0xd4, 0x10, 0x95, 0x9e, 0x24, 0x4c, 0x64, 0x30, 0xa6, 0x0d, 0xcb, 0xaf, 0xdc, 0x83, 0xdb, 0x16, 0x7f, 0x5b, 0x5c, 0xed, 0x79, 0xc2, 0xa5, 0x79, 0xa6, 0x2a, 0xf4, 0xdf, 0xf8, 0x05, 0xc7, 0x5c, 0xa4, 0xd3, 0x28, 0xd7, 0x74, 0x5b, 0x99, 0xef, 0xb6, 0x03, 0xa4, 0x9e, 0xcd, 0x38, 0x8c, 0xb8, 0xab, 0x4c, 0xb6, 0x7c, 0x27, 0x62, 0x72, 0xf2, 0x2b, 0x97, 0xdd, 0xac, 0xbe, 0x00, 0x71, 0xc6, 0x54, 0x8b, 0x9e, 0xc3, 0xd3, 0x51, 0xf4, 0x9d, 0xea, 0x33, 0xdf, 0x63, 0x91, 0xb5, 0x1a, 0x06, 0x1b, 0x60, 0x2d, 0x84, 0xb0, 0x49, 0x1d, 0xe9, 0x5b, 0xcb, 0xaa, 0x1c, 0x0a, 0x2e, 0x33, 0x68, 0x47, 0x07, 0xf3, 0x63, 0x3c, 0x55, 0xfd, 0xf1, 0xc1, 0x73, 0xe4, 0xc1, 0xb8, 0x2d, 0x9f, 0xad, 0x96, 0x26, 0x0f, 0x7f, 0x12, 0x34, 0x57, 0xa6, 0xbe, 0x40, 0x33, 0xd5, 0xd7, 0xdc, 0xc3, 0x35, 0x2c, 0x39, 0xb8, 0x83, 0x7e, 0xe7, 0xa8, 0x4c, 0x26, 0x41, 0xcf, 0x93, 0x7c, 0x4d, 0x17, 0x07, 0x5b, 0xd6, 0x43, 0x8a, 0x7b, 0x77, 0x1e, 0xdf, 0x75, 0xbf, 0x56, 0x8d, 0x4c, 0x55, 0x3e, 0x35, 0x61, 0xaf, 0x42, 0xd4, 0x18, 0x79, 0x56, 0x1d, 0xde, 0x7a, 0x5d, 0x5b, 0x86, 0xed, 0x20, 0x08, 0xa5, 0xde, 0xdb, 0x76, 0x60, 0x19, 0x68, 0xbe, 0x11, 0xe5, 0x09, 0x01, 0x40, 0xce, 0xcd, 0x89, 0x8b, 0x5d, 0x02, 0xb1, 0xea, 0x17, 0xef, 0xef, 0x08, 0xe3, 0x11, 0x15, 0x91, 0xac, 0xb6, 0x86, 0xf8, 0x69, 0x05, 0x37, 0x53, 0x71, 0xe4, 0x66, 0x22, 0x07, 0x57, 0x0b, 0xc5, 0x92, 0x9d, 0xbc, 0x3f, 0xa6, 0x46, + 0x3b, 0x5a, 0xac, 0xf1, 0xe5, 0xca, 0x98, 0x49, 0x33, 0xf9, 0xde, 0xda, 0x5e, 0x10, 0x79, 0x21, 0x87, 0xd3, 0xde, 0xc4, 0x39, 0x8f, 0xe0, 0x34, 0xf9, 0x01, 0x87, 0xd6, 0x67, 0x2d, 0xe6, 0x6c, 0xec, 0x01, 0xb7, 0x17, 0x76, 0x89, 0xe4, 0xbc, 0xc3, 0x62, 0x21, 0xe7, 0x5f, 0x18, 0x95, 0x56, 0x43, 0x21, 0x12, 0x0e, 0x74, 0x99, 0x32, 0xdd, 0x9e, 0xbe, 0x48, 0xc9, 0xb0, 0x8f, 0x3a, 0x06, 0x56, 0x62, 0x29, 0x65, 0xdb, 0xb3, 0xe6, 0x06, 0xc0, 0x57, 0xa8, 0xf2, 0x67, 0x2d, 0x87, 0x67, 0xfe, 0x7d, 0xd6, 0x15, 0x61, 0xef, 0xf4, 0xa1, 0xb1, 0x21, 0xde, 0x47, 0xe5, 0xd3, 0x98, 0x14, 0xa6, 0x16, 0x3a, 0x98, 0x58, 0xce, 0xad, 0x7d, 0x85, 0x53, 0xc3, 0x91, 0xcc, 0x41, 0x7e, 0x53, 0x99, 0xde, 0xf4, 0x44, 0x29, 0xb1, 0xe0, 0xb8, 0x5a, 0xd7, 0x5c, 0x00, 0x84, 0x41, 0xe9, 0x8e, 0x2c, 0xfd, 0x00, 0x7a, 0x36, 0x1d, 0x83, 0x1a, 0x3a, 0x40, 0x2e, 0x95, 0xf3, 0x55, 0xf3, 0x6e, 0x71, 0xea, 0x30, 0xad, 0x5c, 0x8a, 0x4a, 0xc9, 0x70, 0x6f, 0xc6, 0x3a, 0x45, 0xb2, 0xc2, 0xf7, 0xdb, 0xba, 0xb5, 0x63, 0xb7, 0x32, 0x4f, 0x23, 0x95, 0x55, 0xe1, 0x99, 0x1f, 0x97, 0xff, 0x44, 0xe2, 0xb4, 0x40, 0x3d, 0xc8, 0x59, 0xe2, 0xe9, 0x5c, 0x6e, 0x42, 0x84, 0xc1, 0xbf, 0x49, 0x2d, 0xcf, 0xe8, 0x6a, 0x5a, 0x8c, 0xc8, 0x52, 0x20, 0x7f, 0x07, 0xde, 0xdc, 0x28, 0x85, 0xa3, 0x69, 0x4c, 0x55, 0x93, 0xf7, 0x68, 0xa2, 0xaf, 0xa9, 0xbd, 0x3b, 0x87, 0xa8, 0xf3, 0x44, 0x52, 0x67, 0xc0, 0x65, 0xca, 0x10, 0xb3, 0x65, 0x1b, 0x8d, 0x42, 0x06, 0xc5, 0xed, 0xa3, 0x42, 0xe8, 0xdc, 0xc1, 0xfd, 0xf9, 0xed, 0x05, 0xbc, 0xaa, 0xeb, 0x8e, 0xbc, 0xa3, 0x15, 0x4f, 0x61, 0x85, 0x26, + 0xf8, 0xd3, 0xe3, 0xd7, 0x0e, 0xd4, 0x9c, 0xc8, 0xec, 0x02, 0xe4, 0xac, 0x26, 0x2b, 0x4c, 0x7f, 0xcb, 0x05, 0x7c, 0x9d, 0x6b, 0xfd, 0x4d, 0x1f, 0x5e, 0x65, 0x6d, 0xd2, 0xb5, 0x6c, 0xb1, 0x3a, 0xfc, 0xec, 0x13, 0xc6, 0xb8, 0x2a, 0xb7, 0x56, 0x64, 0x0a, 0x66, 0xee, 0x5e, 0xd1, 0x31, 0x34, 0x77, 0xc7, 0x08, 0xaa, 0xae, 0xc7, 0x92, 0xf6, 0xd4, 0xf2, 0x29, 0x54, 0x16, 0xcd, 0x99, 0x38, 0x35, 0x1d, 0xce, 0xf1, 0x30, 0xe8, 0x9b, 0xae, 0x7d, 0xb1, 0x20, 0x3f, 0x35, 0x03, 0xfa, 0x5d, 0x27, 0xdb, 0x46, 0x09, 0xef, 0xae, 0x65, 0xe1, 0xdf, 0xc2, 0x90, 0x3b, 0x71, 0xb7, 0xd5, 0xde, 0xab, 0x00, 0x62, 0x2e, 0x46, 0x93, 0xa6, 0xb9, 0x9e, 0xda, 0xba, 0x0d, 0xd8, 0x67, 0x5a, 0x85, 0x86, 0xe7, 0xf9, 0x54, 0x1e, 0x21, 0xb1, 0xc8, 0x5c, 0x4f, 0x20, 0xd0, 0xea, 0x01, 0xe2, 0x70, 0x1f, 0x69, 0x4d, 0xb5, 0x20, 0x6a, 0xff, 0x20, 0x2a, 0x98, 0xf3, 0xab, 0x00, 0xe7, 0x77, 0x08, 0xd6, 0x9b, 0x51, 0xb1, 0xbf, 0xe7, 0xb2, 0xfa, 0xe8, 0xa3, 0xa2, 0x2d, 0xdb, 0x9a, 0x8b, 0x65, 0xf4, 0xcd, 0x65, 0xea, 0x6a, 0xc8, 0x11, 0xe1, 0x41, 0x46, 0x15, 0x92, 0x43, 0xc6, 0x9d, 0x41, 0xd5, 0xe8, 0xd5, 0xc5, 0xa1, 0xe0, 0x1e, 0x90, 0x6f, 0x6e, 0xb0, 0x71, 0xe5, 0xd7, 0x9e, 0xc0, 0x06, 0xaa, 0x72, 0xf4, 0xd2, 0xc1, 0x87, 0xf5, 0x48, 0xba, 0x21, 0xc7, 0xce, 0xc0, 0x73, 0x39, 0x99, 0xbe, 0xd5, 0x91, 0xfd, 0x3b, 0x94, 0x1a, 0x6a, 0xbb, 0xb5, 0xf3, 0xe7, 0x90, 0x00, 0xa2, 0x7d, 0x22, 0x63, 0x6c, 0x80, 0x7d, 0xbb, 0xb8, 0x22, 0x38, 0xb9, 0x7b, 0x36, 0xb5, 0xc8, 0x24, 0x69, 0xdd, 0x97, 0x1e, 0xd0, 0xf2, 0xfa, 0x4b, 0x0b, 0x9f, 0x18, 0xba, 0x60, 0xec, 0x04, 0x8d, + 0xfe, 0x12, 0xd9, 0xb2, 0x70, 0xdb, 0xef, 0x5d, 0x32, 0xd8, 0x65, 0x56, 0x76, 0xb0, 0x69, 0x16, 0x7d, 0xb6, 0x1c, 0x2b, 0xfe, 0x0c, 0x4c, 0xeb, 0x06, 0xe7, 0x92, 0xeb, 0x9a, 0x94, 0x4a, 0x66, 0x61, 0x2f, 0xf5, 0x4a, 0x6e, 0x6c, 0x64, 0xb3, 0x67, 0xfe, 0xc5, 0xd0, 0xd8, 0x19, 0x7a, 0xb9, 0xec, 0xd5, 0x3b, 0xd3, 0xd3, 0x8c, 0x76, 0x23, 0x7a, 0x9e, 0x8c, 0x47, 0x1f, 0xc9, 0x9c, 0xe9, 0xd2, 0xd1, 0x30, 0x7d, 0xc2, 0x1d, 0x0e, 0x57, 0x7e, 0x6c, 0xc8, 0xec, 0x7a, 0x4d, 0x7c, 0xa1, 0xb1, 0xcc, 0x77, 0x9f, 0x9e, 0xbc, 0x89, 0xa3, 0x44, 0x04, 0x85, 0xd2, 0x69, 0x8a, 0x07, 0xf4, 0x6d, 0x1c, 0x97, 0x53, 0xcc, 0x6d, 0xc4, 0x32, 0xf4, 0x71, 0x18, 0xbd, 0x90, 0xff, 0x99, 0x71, 0x53, 0x1d, 0x7e, 0x9e, 0xf0, 0x3d, 0x00, 0xa8, 0xf4, 0x97, 0x7d, 0xd7, 0x21, 0x7b, 0x4d, 0x63, 0x86, 0xb7, 0x28, 0xa5, 0xb6, 0xf7, 0xd4, 0xb1, 0xb9, 0xab, 0x0a, 0x69, 0x66, 0x0c, 0x38, 0x37, 0x98, 0x67, 0xc6, 0x1e, 0xc4, 0xe4, 0xa2, 0xb9, 0xb7, 0xe7, 0xbe, 0x12, 0x3b, 0x10, 0xfc, 0x27, 0x56, 0xe9, 0xfd, 0xc1, 0xe9, 0xc1, 0x85, 0xf8, 0x16, 0xff, 0x4a, 0x1e, 0xed, 0x88, 0xcd, 0xe7, 0x88, 0xc7, 0xf5, 0xb1, 0x02, 0x52, 0xd1, 0xd2, 0xc2, 0x61, 0x25, 0x58, 0x4c, 0x4a, 0x92, 0x56, 0xc6, 0xc1, 0x7d, 0xd4, 0xd0, 0xfa, 0x35, 0xe6, 0xb7, 0xda, 0xd5, 0x4f, 0xae, 0x80, 0x26, 0xe4, 0x35, 0x80, 0x9f, 0xbc, 0xa4, 0xc8, 0xea, 0x7c, 0x8a, 0x80, 0xac, 0xb1, 0x24, 0x9e, 0xc0, 0x61, 0xd0, 0xa4, 0x3d, 0xd3, 0x94, 0xad, 0x59, 0x32, 0x65, 0xe8, 0xd4, 0x5c, 0x91, 0xc3, 0xbd, 0xd0, 0x4f, 0x9a, 0x9c, 0xe6, 0x45, 0x9a, 0x73, 0x85, 0xe1, 0x26, 0xc4, 0xd3, 0x07, 0x80, 0x26, 0x69, + 0x6e, 0x16, 0x94, 0x9a, 0x74, 0xa9, 0xb7, 0xa2, 0x77, 0x71, 0xd3, 0xdd, 0x2e, 0x50, 0x64, 0xa2, 0x60, 0x30, 0xd7, 0x29, 0x78, 0x91, 0xde, 0x99, 0xfa, 0x28, 0x7e, 0x7a, 0x5e, 0x1b, 0xe0, 0x9c, 0x3c, 0x6a, 0x6f, 0x31, 0xce, 0x2c, 0x90, 0x58, 0xc5, 0x9c, 0x53, 0xa4, 0x1a, 0xe8, 0x1e, 0x33, 0x00, 0xc3, 0x9f, 0x35, 0x98, 0xe6, 0x37, 0xf5, 0x7b, 0x1b, 0xd4, 0x76, 0x1b, 0x71, 0x57, 0xa4, 0x9f, 0x5f, 0x28, 0x39, 0x15, 0x04, 0xfe, 0x58, 0x25, 0x1f, 0xc8, 0xf0, 0xaf, 0x7a, 0x0c, 0x21, 0x00, 0x88, 0x00, 0xe1, 0xb8, 0xb0, 0x93, 0xc9, 0xf2, 0xbe, 0xc9, 0xa5, 0x4f, 0x67, 0x50, 0x89, 0xa9, 0x1f, 0x0a, 0xb1, 0x90, 0x03, 0x25, 0xca, 0x76, 0x0c, 0xac, 0x9c, 0xb3, 0x9d, 0xb4, 0x36, 0x98, 0x80, 0xe9, 0xe5, 0x54, 0x79, 0xec, 0x43, 0x0c, 0x0a, 0x58, 0xcc, 0x2e, 0x55, 0x55, 0x52, 0x87, 0x74, 0xad, 0x4b, 0x93, 0x90, 0xb8, 0xf3, 0xf8, 0x9e, 0x1c, 0x3a, 0xfa, 0x66, 0xba, 0x50, 0x37, 0xc5, 0x73, 0x27, 0xb4, 0xfa, 0x2a, 0xbd, 0x9b, 0x0a, 0x55, 0x11, 0xbb, 0xff, 0xe2, 0x07, 0x71, 0x91, 0x91, 0xb7, 0x6c, 0xd1, 0x1a, 0xec, 0xbb, 0xc0, 0x62, 0x36, 0x86, 0x8c, 0x3d, 0x7c, 0x97, 0x95, 0x54, 0xf8, 0xe6, 0xcb, 0x9c, 0xe2, 0xf1, 0x7a, 0x30, 0xa5, 0x2f, 0x5f, 0xad, 0x5c, 0x8d, 0x60, 0xc4, 0x14, 0x77, 0x5c, 0x70, 0x91, 0xac, 0x6b, 0x94, 0x4b, 0x9e, 0xb2, 0x42, 0xfd, 0x9a, 0xfb, 0x96, 0xa1, 0x70, 0x4e, 0x6e, 0x12, 0x37, 0x5f, 0x87, 0xf5, 0x7c, 0x86, 0xa7, 0xd0, 0xf5, 0x53, 0xa0, 0xa3, 0x52, 0xe6, 0xe7, 0x9f, 0xac, 0x40, 0xb2, 0xe3, 0xd7, 0xac, 0xc8, 0xf6, 0xbf, 0x27, 0xf9, 0xd0, 0xd7, 0xe1, 0xa6, 0xd7, 0xa2, 0x53, 0x62, 0xe8, 0xa5, 0x0f, 0x6b, 0x2f, + 0x31, 0xe4, 0xfc, 0x3d, 0x82, 0x19, 0xfc, 0xb6, 0x74, 0xf0, 0xe5, 0x89, 0x5b, 0x9a, 0x52, 0xb5, 0x17, 0x72, 0x77, 0xb4, 0x40, 0x27, 0xac, 0x7c, 0x24, 0x7a, 0x0b, 0x54, 0xaf, 0x86, 0x0f, 0x82, 0x9f, 0xa6, 0x05, 0xdb, 0x5e, 0x21, 0xb8, 0x11, 0xbe, 0xde, 0x98, 0x3f, 0x91, 0x79, 0x5b, 0x09, 0x33, 0x5b, 0x8b, 0x69, 0xe9, 0x99, 0x9e, 0x52, 0xfe, 0xe0, 0x6e, 0xc1, 0xe4, 0x76, 0xa3, 0x8c, 0x07, 0x30, 0xee, 0xd2, 0x43, 0x7c, 0xae, 0xe6, 0xaa, 0xb8, 0x7a, 0x40, 0x62, 0xba, 0xca, 0xb3, 0x30, 0x74, 0xca, 0x3f, 0x71, 0x61, 0x34, 0x3a, 0xa3, 0xa8, 0x6d, 0x30, 0x3d, 0xd9, 0xa3, 0xc8, 0x32, 0x80, 0x26, 0x41, 0xb0, 0x65, 0x1f, 0x45, 0x97, 0x6c, 0x1d, 0xaa, 0x34, 0xac, 0x18, 0xef, 0xcc, 0x14, 0xc2, 0x51, 0x02, 0x9d, 0x14, 0x1b, 0x50, 0x96, 0xf6, 0xc4, 0xbb, 0x88, 0x7e, 0x45, 0xc1, 0xd2, 0xc8, 0x48, 0xf7, 0x09, 0x8d, 0xf6, 0xf1, 0x94, 0xc7, 0xf9, 0x9f, 0x3f, 0x79, 0x04, 0xcc, 0x9c, 0xba, 0x26, 0x59, 0x85, 0x01, 0x81, 0xd5, 0x5d, 0x40, 0xdc, 0xe6, 0x06, 0x12, 0xfd, 0x6e, 0xde, 0x12, 0x25, 0x28, 0x65, 0xd4, 0x91, 0x50, 0x27, 0x98, 0x29, 0x77, 0xbc, 0xbd, 0xc8, 0x17, 0xb7, 0x8d, 0x65, 0xfc, 0x1f, 0xf8, 0xa7, 0x01, 0xda, 0xe8, 0xa2, 0xa8, 0x58, 0xe6, 0x82, 0xaf, 0xf3, 0x77, 0xa1, 0x0a, 0x4a, 0xf8, 0x4e, 0x26, 0x09, 0x57, 0xea, 0x2c, 0x5c, 0x03, 0x4c, 0x39, 0x9d, 0xb7, 0xb4, 0xe3, 0x78, 0xa2, 0x6b, 0x4e, 0x14, 0x50, 0x8e, 0x5f, 0xf0, 0xcd, 0x46, 0x0d, 0x35, 0x5d, 0x5c, 0xb0, 0xe7, 0x02, 0x3f, 0x93, 0xcb, 0xd8, 0x6f, 0xce, 0x7a, 0x38, 0x88, 0xa1, 0x1d, 0xa8, 0x78, 0x4b, 0x2c, 0x2b, 0x89, 0x5d, 0xba, 0x8a, 0x0b, 0xb2, 0xf2, 0x0d, 0x53, + 0x7e, 0x18, 0x83, 0x45, 0x84, 0xc1, 0x7f, 0x44, 0x49, 0x50, 0xf8, 0x83, 0xa0, 0x2b, 0xa1, 0x7a, 0x01, 0x89, 0x8e, 0xd9, 0xca, 0x03, 0xc0, 0x0d, 0x84, 0x05, 0x10, 0x6b, 0x83, 0xd7, 0xb3, 0x33, 0xdc, 0x80, 0xb6, 0xf4, 0x91, 0x5b, 0x75, 0xe5, 0x02, 0x07, 0x97, 0xa8, 0x8b, 0xf8, 0xfd, 0x47, 0x1e, 0x91, 0xda, 0xc0, 0x9b, 0x8c, 0xbc, 0x07, 0xb0, 0x7c, 0xa6, 0x83, 0x2e, 0x24, 0xb8, 0x5a, 0x0e, 0xeb, 0xe5, 0x2a, 0xb0, 0xea, 0x71, 0x05, 0x77, 0x02, 0xcb, 0xe3, 0xfc, 0x5d, 0x85, 0x37, 0x1c, 0x95, 0x02, 0x56, 0xec, 0x10, 0x7f, 0x97, 0x3a, 0x5f, 0x58, 0xcf, 0x76, 0xac, 0xd8, 0x82, 0x8e, 0xb0, 0x4a, 0xf5, 0x36, 0x62, 0xf7, 0x68, 0x58, 0x9b, 0x17, 0xe1, 0x14, 0xc2, 0x12, 0x2f, 0x1d, 0x53, 0x98, 0x82, 0x5c, 0xb0, 0xd6, 0x9d, 0x73, 0x40, 0xb0, 0xe0, 0x01, 0xf4, 0x8b, 0x81, 0x1d, 0x6f, 0x6e, 0x34, 0xdb, 0x94, 0x2a, 0x68, 0x56, 0x29, 0x13, 0xee, 0x11, 0xc6, 0x90, 0x63, 0xa0, 0x6c, 0x90, 0x82, 0x3f, 0xbc, 0x12, 0x3f, 0xde, 0x40, 0x46, 0xe1, 0xec, 0xba, 0xfc, 0xd0, 0xaf, 0xc1, 0xf0, 0x32, 0xbc, 0xef, 0x53, 0x97, 0xb4, 0x26, 0xa1, 0x8f, 0x4d, 0xe9, 0xd5, 0x58, 0x7d, 0xbd, 0x26, 0xa1, 0xd6, 0x61, 0x83, 0x2d, 0x4b, 0x60, 0xdd, 0x2d, 0xd8, 0xdc, 0x90, 0xe2, 0xcd, 0xd9, 0xeb, 0x99, 0x00, 0x0a, 0x58, 0x8d, 0x1c, 0x4a, 0x3d, 0x8f, 0xa3, 0x57, 0x94, 0x59, 0xaa, 0x9a, 0x02, 0x17, 0xa5, 0x39, 0x20, 0x6f, 0xc9, 0x2f, 0xc4, 0x48, 0xdf, 0xff, 0x41, 0x26, 0x7b, 0x52, 0x67, 0xac, 0xd6, 0x4a, 0xda, 0x80, 0xb3, 0xa3, 0xc6, 0x24, 0xbf, 0x82, 0xe8, 0x3c, 0x68, 0xbe, 0xa9, 0xc0, 0xb0, 0xa6, 0x30, 0xfa, 0xb0, 0x89, 0x26, 0xdf, 0x91, 0xaa, 0x89, 0xbc, + 0x23, 0x2b, 0x53, 0xfd, 0x2c, 0x09, 0x5b, 0x09, 0xb4, 0xdd, 0xf8, 0x10, 0x65, 0x1a, 0x9b, 0x47, 0xbf, 0x23, 0x6d, 0x22, 0x88, 0x7a, 0x21, 0x29, 0x87, 0xb7, 0xb6, 0xbf, 0x74, 0xfb, 0xc1, 0x15, 0x93, 0x72, 0xf4, 0x46, 0x95, 0x24, 0x2e, 0x5a, 0xe1, 0x23, 0x94, 0x30, 0x42, 0x42, 0xba, 0x08, 0x81, 0x26, 0x01, 0xe3, 0x6e, 0x2a, 0x44, 0x13, 0x81, 0x2d, 0xc4, 0xc2, 0xcb, 0xa5, 0xa4, 0x97, 0xe7, 0xb6, 0xe2, 0x43, 0x50, 0x79, 0xe9, 0x29, 0xfc, 0xab, 0x88, 0x77, 0xbe, 0xa1, 0xc8, 0x6a, 0xc3, 0xd6, 0xd6, 0x90, 0x64, 0xb4, 0x8b, 0x29, 0x29, 0xb5, 0xa9, 0xee, 0x59, 0xba, 0x5b, 0xda, 0x51, 0xb2, 0xd3, 0x13, 0x45, 0x0a, 0x47, 0xbe, 0xa9, 0xba, 0xb6, 0xf2, 0xc7, 0x78, 0xde, 0x08, 0xa9, 0x28, 0xc7, 0x1a, 0x8a, 0x63, 0xb2, 0xf0, 0x4f, 0x18, 0x97, 0x90, 0xc8, 0xb4, 0x27, 0xa7, 0x6c, 0x1d, 0xe9, 0xa0, 0x6a, 0x7a, 0x2f, 0x6f, 0xc1, 0x0d, 0x7b, 0x88, 0x9b, 0x52, 0xd8, 0x71, 0x4e, 0xe0, 0xed, 0x86, 0x4f, 0xc3, 0xfb, 0x51, 0xe3, 0x85, 0x17, 0x46, 0x18, 0x2f, 0xde, 0x94, 0xaa, 0x46, 0xa9, 0xc8, 0x8a, 0x9b, 0x90, 0x46, 0xe9, 0x87, 0x13, 0x10, 0x3d, 0xcd, 0xca, 0x02, 0xd6, 0x82, 0x05, 0xca, 0x38, 0x79, 0xd2, 0xb6, 0x6e, 0x8e, 0x26, 0xfe, 0xd4, 0xb5, 0x9c, 0x27, 0x6e, 0xdf, 0xee, 0x90, 0xfa, 0x2f, 0xcf, 0x2b, 0x33, 0x2a, 0xd6, 0x1a, 0xc0, 0xe3, 0x60, 0x6c, 0xf4, 0xcb, 0x3d, 0x9c, 0x0b, 0x95, 0xd3, 0xb5, 0x98, 0x59, 0x85, 0x30, 0x02, 0x2c, 0xb5, 0x93, 0x50, 0x39, 0xf9, 0x70, 0x4d, 0xc1, 0x66, 0xaf, 0x78, 0xd6, 0x61, 0xac, 0x4c, 0x6b, 0x37, 0xfe, 0x02, 0xa6, 0xbd, 0xc5, 0xa3, 0x20, 0xff, 0x89, 0xef, 0x84, 0x4b, 0x76, 0xa4, 0x23, 0xfc, 0x8a, + 0xdf, 0x1a, 0xc2, 0x12, 0x0c, 0xfc, 0x87, 0x7e, 0x58, 0x5c, 0x8f, 0x9a, 0xb6, 0x0e, 0xa1, 0x86, 0xd4, 0xec, 0x4d, 0xe6, 0x04, 0xfa, 0x59, 0xf4, 0x20, 0xeb, 0xcf, 0x12, 0x39, 0x7c, 0xe7, 0x12, 0x9a, 0x94, 0x9e, 0x93, 0x64, 0x0b, 0x39, 0x9f, 0xb7, 0xf2, 0x5f, 0x78, 0x76, 0x84, 0xcc, 0x76, 0x20, 0xf5, 0x43, 0xd9, 0x10, 0x5f, 0x5f, 0xac, 0xe8, 0x80, 0xa9, 0xbd, 0x14, 0x96, 0x45, 0x9f, 0x56, 0x92, 0x00, 0x94, 0x0a, 0x46, 0x0a, 0x09, 0x3c, 0xce, 0x28, 0x15, 0x17, 0x4c, 0xa5, 0x84, 0x74, 0x24, 0x2d, 0xa5, 0x42, 0x1b, 0x81, 0x91, 0x22, 0x3b, 0xb7, 0x24, 0x30, 0x7f, 0x52, 0x61, 0x7c, 0xb3, 0x36, 0xb3, 0xee, 0x54, 0xcf, 0xab, 0x43, 0xa9, 0xbf, 0x45, 0x0c, 0xfe, 0x89, 0xf9, 0x39, 0x70, 0x18, 0x7e, 0x86, 0x86, 0x1e, 0x03, 0xd6, 0xd6, 0x0b, 0x5d, 0x5a, 0x6e, 0x2a, 0x57, 0x01, 0x18, 0x6c, 0x09, 0xa1, 0xbc, 0xd0, 0x20, 0x14, 0x41, 0x00, 0x5e, 0xdb, 0xe1, 0x86, 0xb5, 0x11, 0xf5, 0x21, 0x50, 0x07, 0xdc, 0xae, 0x4e, 0x69, 0x8d, 0x85, 0x2c, 0x6f, 0x9f, 0x12, 0x4f, 0xf5, 0xec, 0x98, 0x45, 0x34, 0x3a, 0x6c, 0xe5, 0xad, 0xbb, 0xf4, 0x0c, 0xfb, 0xf6, 0x65, 0xe4, 0xbe, 0x8a, 0xb1, 0x3e, 0x2f, 0xe3, 0xa0, 0x12, 0x19, 0x24, 0x4e, 0x43, 0x74, 0xf3, 0x2f, 0x5d, 0xcd, 0xa4, 0x69, 0x86, 0x1c, 0xe1, 0x21, 0x14, 0x94, 0x0d, 0x65, 0xc5, 0xd2, 0x6b, 0x4a, 0x2b, 0x0d, 0x0a, 0x70, 0x2f, 0xfa, 0x94, 0x77, 0x3e, 0xcb, 0xdd, 0x8f, 0x8e, 0x5d, 0x1d, 0xb4, 0xca, 0x7c, 0x95, 0xb8, 0x37, 0x22, 0xe2, 0xb1, 0xb3, 0xa7, 0xc4, 0x25, 0x9f, 0xd9, 0x8c, 0x38, 0xff, 0xb6, 0xb1, 0x77, 0x5c, 0x24, 0x8e, 0xa1, 0x6e, 0xa7, 0x8f, 0x8d, 0xd1, 0xd9, 0x9c, 0xaa, 0x60, + 0x60, 0x7e, 0xe6, 0x46, 0x29, 0x9b, 0xaa, 0xa9, 0x99, 0xb5, 0xb0, 0x6e, 0x34, 0xa3, 0x8a, 0x90, 0x3e, 0x2f, 0xc2, 0x0c, 0xdf, 0xca, 0xf8, 0x65, 0xca, 0x2c, 0x6d, 0x2e, 0x6d, 0xe6, 0x2a, 0x70, 0x01, 0xcb, 0xbe, 0xac, 0x47, 0x17, 0x90, 0xb0, 0xe1, 0xa3, 0xc6, 0xdf, 0x87, 0x3a, 0xde, 0x39, 0xb5, 0xb4, 0xc1, 0xb7, 0x60, 0x51, 0xe2, 0x2c, 0x2e, 0xab, 0x32, 0x10, 0x53, 0x1a, 0xab, 0x7c, 0x8d, 0x3e, 0xca, 0x55, 0x3d, 0x27, 0x9d, 0x44, 0xa0, 0x68, 0xa6, 0x30, 0x1c, 0x47, 0xb5, 0xe8, 0xce, 0x4a, 0xac, 0xa4, 0xe4, 0x54, 0x0a, 0xa9, 0x92, 0xdd, 0x4b, 0x6c, 0xa3, 0xd1, 0xbc, 0x66, 0x47, 0x48, 0xf3, 0xb5, 0x83, 0x94, 0xe0, 0x29, 0xf1, 0xf8, 0x4e, 0x01, 0x92, 0xa8, 0x17, 0xd5, 0x06, 0x6c, 0x87, 0x79, 0xd8, 0x8b, 0x1c, 0xa4, 0x8b, 0xe0, 0x01, 0x25, 0xa4, 0xe2, 0xe4, 0x43, 0xfa, 0x97, 0x8c, 0x22, 0x4a, 0x64, 0x4e, 0xb6, 0x54, 0xf8, 0x73, 0x22, 0xaf, 0x41, 0x86, 0x34, 0x2a, 0xbf, 0xe0, 0x74, 0xdb, 0xb1, 0x08, 0x66, 0x64, 0x16, 0xb6, 0x34, 0xb2, 0xd6, 0x51, 0xd9, 0x88, 0x93, 0x0b, 0x14, 0x0e, 0x82, 0x8b, 0xe0, 0xbb, 0x33, 0x18, 0x71, 0x50, 0x44, 0x81, 0xbf, 0x26, 0xde, 0x1e, 0x5a, 0x7b, 0xff, 0xbb, 0xdb, 0x34, 0x88, 0x48, 0xcf, 0x88, 0x9f, 0x96, 0x9e, 0xf0, 0x46, 0x3c, 0x33, 0xb4, 0x7a, 0x2a, 0xa1, 0xdc, 0x02, 0xa8, 0x4c, 0x0f, 0x5d, 0x1e, 0x5e, 0x3e, 0xdc, 0xab, 0xc0, 0x40, 0x02, 0x54, 0xdc, 0xd8, 0xaa, 0x36, 0x11, 0x3d, 0x51, 0x6b, 0x44, 0x02, 0x42, 0x2a, 0x6d, 0x23, 0x45, 0x3d, 0xfb, 0xa8, 0xcc, 0xe7, 0xdc, 0xd9, 0x56, 0xc9, 0x2b, 0x43, 0x0e, 0xa6, 0x01, 0x84, 0x13, 0xb0, 0x57, 0x60, 0x81, 0x9e, 0x66, 0x04, 0x0d, 0x83, 0x86, + 0x48, 0xb9, 0xca, 0x5f, 0xf8, 0x07, 0x14, 0x7c, 0x20, 0xd6, 0x91, 0x11, 0xb4, 0x8b, 0x9a, 0x1a, 0xe0, 0xa6, 0xf8, 0x50, 0x66, 0x6b, 0x51, 0xcc, 0x2e, 0xdb, 0x57, 0x1e, 0x01, 0xc9, 0x5a, 0xaa, 0x8e, 0xd7, 0x0a, 0x10, 0xe7, 0x89, 0x93, 0xfb, 0x2b, 0x2d, 0x56, 0x10, 0xbc, 0x15, 0xf7, 0xa2, 0x49, 0x68, 0x88, 0x4f, 0x6e, 0x2a, 0xc2, 0x72, 0x46, 0x61, 0x45, 0x9a, 0x28, 0x39, 0xcb, 0x73, 0x6d, 0xac, 0xed, 0x3b, 0x45, 0x43, 0x06, 0x76, 0xb4, 0x9e, 0xe0, 0xab, 0x28, 0x44, 0x2d, 0x03, 0xbb, 0x38, 0x09, 0x46, 0x6a, 0xe3, 0x09, 0xd8, 0xf9, 0x98, 0xaf, 0x9c, 0xde, 0x51, 0x07, 0xde, 0x2d, 0x10, 0xcc, 0xa7, 0x25, 0xea, 0xf3, 0xe6, 0x95, 0x16, 0x77, 0xcd, 0x80, 0xf7, 0x41, 0x12, 0x41, 0x2a, 0x80, 0x9a, 0x6d, 0xba, 0xf3, 0x96, 0xf9, 0x3b, 0x6c, 0xb5, 0x5c, 0x89, 0x6e, 0x53, 0x0a, 0x36, 0xaf, 0xd0, 0xe2, 0xf3, 0xdc, 0x28, 0xad, 0xb6, 0xf8, 0xc6, 0x98, 0x43, 0xe5, 0xca, 0x83, 0xa7, 0xc6, 0xb2, 0xc7, 0x4b, 0xa7, 0xc7, 0xe6, 0xb2, 0x89, 0x3d, 0x08, 0x6f, 0x15, 0xe4, 0x1c, 0x26, 0xc5, 0x8c, 0xfa, 0x77, 0xb3, 0x50, 0xad, 0x60, 0xfd, 0xb6, 0x29, 0x48, 0x3c, 0xc9, 0x9d, 0xb8, 0x0c, 0xf5, 0x35, 0x3f, 0x0a, 0x26, 0xd1, 0xf4, 0x04, 0xb3, 0xe4, 0x1a, 0xb4, 0xf0, 0xdf, 0x8d, 0x4a, 0x31, 0xe5, 0x06, 0x13, 0x32, 0x8c, 0x19, 0xe7, 0x56, 0x59, 0x6f, 0x24, 0xe0, 0x7f, 0xd0, 0xcf, 0x67, 0x72, 0x2e, 0x19, 0x50, 0x1b, 0x47, 0x18, 0xca, 0x28, 0xc7, 0xeb, 0x41, 0x79, 0x77, 0x69, 0x95, 0x86, 0x1f, 0x19, 0x54, 0xe5, 0x7b, 0xf2, 0x08, 0xa8, 0x49, 0x73, 0x21, 0xaf, 0x1c, 0xad, 0x5e, 0xa8, 0x4a, 0xf1, 0x1c, 0xd3, 0x03, 0x61, 0xb4, 0xe5, 0x50, 0x36, 0xed, + 0x60, 0x82, 0x26, 0x87, 0xd0, 0x73, 0xeb, 0xf7, 0xf9, 0x21, 0xcf, 0xeb, 0x38, 0x66, 0x73, 0x24, 0x58, 0xc3, 0xce, 0x8b, 0x0d, 0x75, 0x80, 0x3b, 0xe5, 0x6b, 0x75, 0x25, 0x8c, 0x01, 0x51, 0xbb, 0x7e, 0x3b, 0x1e, 0xf4, 0xca, 0xb2, 0xf5, 0x37, 0x34, 0x43, 0x2b, 0x92, 0x00, 0x06, 0x50, 0x10, 0x6d, 0xd1, 0xe3, 0xca, 0xb7, 0xc7, 0x13, 0x43, 0xbe, 0x31, 0xa9, 0x27, 0x40, 0x4f, 0x70, 0x5b, 0x25, 0x9a, 0xef, 0xba, 0xff, 0xfe, 0x47, 0xda, 0x97, 0x5b, 0x45, 0x7c, 0x49, 0xff, 0x72, 0xba, 0x5a, 0x8b, 0x56, 0xc3, 0xbd, 0x68, 0x9f, 0xf6, 0x47, 0x70, 0x55, 0xba, 0x07, 0x95, 0x4f, 0x86, 0xe1, 0xec, 0xb3, 0x81, 0x1d, 0x82, 0x99, 0xf6, 0x09, 0x2b, 0xb8, 0xd5, 0x5e, 0x29, 0xf0, 0xa5, 0x22, 0x8f, 0x6e, 0xc9, 0x57, 0x9d, 0xf8, 0xf9, 0x9a, 0xe0, 0xf6, 0x1b, 0x30, 0x2b, 0x50, 0x16, 0x74, 0xe1, 0x29, 0xd6, 0x3f, 0x65, 0x5e, 0x63, 0x0c, 0x65, 0xf3, 0xf5, 0x43, 0x38, 0x14, 0x7a, 0x70, 0x3c, 0x94, 0xf7, 0x97, 0x66, 0x14, 0x49, 0xe2, 0x07, 0x3f, 0x30, 0x53, 0xcc, 0x91, 0x11, 0x37, 0x23, 0xac, 0x3c, 0x02, 0xc1, 0x7d, 0xce, 0x2b, 0x00, 0x5b, 0x46, 0x90, 0x23, 0xd8, 0xa2, 0x14, 0x63, 0xb7, 0x11, 0x5e, 0x5a, 0xb3, 0x94, 0x10, 0x5e, 0x4f, 0x6d, 0x09, 0xbf, 0xdc, 0x14, 0xcf, 0x63, 0x65, 0xe7, 0xe2, 0xcd, 0xd1, 0x38, 0xa2, 0x3b, 0xfc, 0x54, 0xa6, 0x8a, 0x59, 0x1b, 0x0a, 0x38, 0xe0, 0xdc, 0x06, 0x7d, 0x8a, 0xba, 0x8d, 0x33, 0x80, 0x8d, 0xde, 0xba, 0x43, 0x1c, 0x94, 0x60, 0x09, 0x9a, 0x75, 0x9d, 0xe6, 0xff, 0x79, 0xe1, 0xb2, 0xec, 0x73, 0x8b, 0xd3, 0x04, 0x5b, 0xb8, 0x01, 0xab, 0x7a, 0xb6, 0x13, 0x51, 0xf7, 0xeb, 0x9d, 0x45, 0x6c, 0xbc, 0xd3, 0xc8, + 0x65, 0xa7, 0xec, 0x8c, 0xfb, 0x9c, 0x82, 0x73, 0x9d, 0xf1, 0x82, 0x83, 0xab, 0x97, 0x88, 0x23, 0xde, 0x10, 0xcb, 0x83, 0x14, 0xce, 0x5b, 0x71, 0xe4, 0x43, 0x93, 0xe4, 0xdc, 0x3a, 0x20, 0x2b, 0xd8, 0x68, 0x48, 0xaa, 0xdd, 0x17, 0x95, 0xa8, 0x57, 0xe0, 0x0b, 0xf4, 0xd2, 0x15, 0x54, 0x05, 0x3b, 0x09, 0x29, 0x2a, 0x80, 0xff, 0xca, 0xcd, 0xfd, 0x82, 0x73, 0x38, 0x45, 0x35, 0xa1, 0x8d, 0x08, 0x61, 0x1d, 0x50, 0x3f, 0x05, 0x52, 0xca, 0xac, 0x54, 0x19, 0xf4, 0x63, 0x9b, 0xb1, 0xa7, 0x2a, 0x08, 0xae, 0xc1, 0x07, 0xec, 0xb0, 0xdb, 0x00, 0x8c, 0x6a, 0x3c, 0xf7, 0xda, 0xda, 0x2b, 0x30, 0x62, 0xa7, 0x6e, 0x39, 0x22, 0xd0, 0xa9, 0x00, 0x4e, 0xd9, 0x47, 0x5c, 0x7d, 0x9f, 0x04, 0x91, 0x44, 0x76, 0x93, 0x83, 0x3f, 0xbb, 0x37, 0xb0, 0xa3, 0x39, 0xa7, 0xae, 0x43, 0xde, 0x5a, 0x9e, 0x22, 0x9a, 0x7b, 0xae, 0xa8, 0xa0, 0xe2, 0x89, 0x76, 0x6b, 0x92, 0x54, 0x5b, 0xc4, 0x23, 0xf6, 0xe9, 0xf7, 0x4c, 0x4b, 0x51, 0xf1, 0x61, 0x77, 0x12, 0x36, 0xb1, 0xe1, 0x3c, 0x6f, 0x2f, 0x19, 0x64, 0x5a, 0xa7, 0x29, 0xc6, 0x1e, 0x0f, 0x29, 0xb1, 0xf6, 0x06, 0x64, 0xe5, 0xc4, 0xac, 0xe1, 0x3e, 0x66, 0x9b, 0x06, 0x00, 0xc8, 0xdc, 0x2f, 0x7c, 0xa6, 0x7a, 0x30, 0x84, 0xfd, 0x75, 0xd7, 0xa4, 0x3c, 0x16, 0x4d, 0xae, 0x08, 0x00, 0x85, 0x84, 0xfb, 0x58, 0x07, 0x2c, 0xda, 0x3a, 0x76, 0x05, 0x47, 0xc3, 0xba, 0xa8, 0x23, 0xee, 0xed, 0xdc, 0xfe, 0x6c, 0x01, 0x93, 0xc2, 0x3d, 0x95, 0xde, 0x99, 0x2c, 0xce, 0x3c, 0x16, 0x90, 0x39, 0x5b, 0x74, 0x08, 0xc5, 0xdc, 0x40, 0xa2, 0xe8, 0x74, 0xfc, 0xbc, 0x00, 0x95, 0xcd, 0x10, 0xac, 0xd3, 0x06, 0x8e, 0x3a, 0x6b, 0xfe, 0xb9, + 0x03, 0x09, 0x4e, 0x79, 0x8c, 0xd6, 0x84, 0x3a, 0x5e, 0x97, 0x20, 0x41, 0x68, 0xba, 0xe2, 0x32, 0xd3, 0xe0, 0x7c, 0xe7, 0x7b, 0x60, 0x7d, 0xe7, 0xac, 0x94, 0xec, 0x69, 0x8d, 0x70, 0x8c, 0x00, 0x70, 0xf6, 0x7e, 0x57, 0x3e, 0x42, 0xd8, 0x06, 0x3d, 0xd9, 0x54, 0xe8, 0x05, 0x77, 0xc2, 0x9b, 0x7d, 0x89, 0xda, 0xd7, 0x35, 0xd5, 0x83, 0xf1, 0xb8, 0x35, 0xd9, 0x41, 0x04, 0x5a, 0x60, 0xb8, 0x7a, 0xe8, 0x25, 0x38, 0x92, 0xa6, 0x24, 0xfa, 0x57, 0xd8, 0xa8, 0x27, 0xf1, 0xba, 0x08, 0xc1, 0xc8, 0xf8, 0x7e, 0xd2, 0xb4, 0x4d, 0xca, 0x3a, 0x51, 0xa2, 0x6b, 0x63, 0xe8, 0xe8, 0x03, 0x61, 0xaa, 0xf4, 0xc1, 0x04, 0xa7, 0x91, 0xff, 0x73, 0xa9, 0xfb, 0x29, 0x5e, 0xb1, 0x87, 0x11, 0x06, 0x7c, 0xf4, 0xb8, 0x4c, 0x86, 0x2b, 0x19, 0x93, 0xb5, 0x90, 0xb9, 0xfd, 0xbf, 0x40, 0x54, 0x9c, 0xa1, 0x9b, 0xc8, 0x5d, 0x4b, 0xd5, 0xfa, 0x00, 0x4b, 0xeb, 0x30, 0x23, 0x3c, 0x24, 0x13, 0x0c, 0x33, 0x48, 0x75, 0xba, 0x16, 0x5a, 0xd4, 0xce, 0x24, 0xb2, 0x8a, 0x3b, 0xcd, 0x9a, 0x5e, 0xa6, 0x2e, 0x46, 0xbf, 0xcf, 0x93, 0x4c, 0x58, 0x89, 0xf1, 0xb3, 0x5a, 0x5d, 0x6d, 0xf4, 0x0c, 0xb6, 0xd5, 0x7e, 0x77, 0x97, 0x74, 0xc8, 0xbc, 0xed, 0x04, 0x75, 0x63, 0x21, 0x89, 0xce, 0xc0, 0x9a, 0x2a, 0x73, 0x30, 0x69, 0x10, 0xeb, 0xb8, 0x96, 0x98, 0xde, 0xf4, 0x9d, 0x7b, 0x1d, 0xba, 0x13, 0x59, 0xfc, 0x88, 0x38, 0xef, 0x6e, 0xd6, 0x3a, 0x08, 0xd3, 0x63, 0x31, 0xd6, 0x2d, 0x33, 0xb4, 0x14, 0x5a, 0x4a, 0x16, 0xd0, 0x27, 0x9b, 0x41, 0xee, 0xe4, 0xba, 0x14, 0x39, 0xa0, 0x3a, 0x63, 0x76, 0x3b, 0xf0, 0xd9, 0x0e, 0xf4, 0x9b, 0x6f, 0xa7, 0x56, 0x24, 0x96, 0xb0, 0x31, 0x62, 0x7f, + 0xb7, 0x78, 0xd1, 0x3c, 0xfc, 0x69, 0x9d, 0x6b, 0xd8, 0x48, 0xb3, 0x9a, 0xa2, 0x41, 0x66, 0x8f, 0xe4, 0x89, 0x01, 0x0b, 0x92, 0xf3, 0x4e, 0x43, 0xec, 0xaa, 0x16, 0xb0, 0xbb, 0x5c, 0xf5, 0xe3, 0xbd, 0x97, 0xbd, 0x7c, 0xc3, 0xad, 0xf4, 0x4e, 0xf1, 0x1c, 0x05, 0x5b, 0xa1, 0x6f, 0x95, 0x2d, 0xd9, 0x3c, 0x04, 0x86, 0x58, 0xde, 0x5b, 0x56, 0xcf, 0xec, 0x4f, 0x56, 0x72, 0xb9, 0xf9, 0x81, 0x22, 0x47, 0x5f, 0x3a, 0x62, 0xb3, 0xf1, 0x65, 0x38, 0xfa, 0xf8, 0xcb, 0x61, 0xe3, 0x28, 0x0c, 0xcb, 0x56, 0x21, 0x96, 0x8f, 0xcc, 0xfc, 0x34, 0x92, 0x78, 0xe3, 0xe7, 0x9a, 0x46, 0x87, 0x68, 0xee, 0x9d, 0x0d, 0x56, 0xce, 0xfa, 0xd1, 0xf4, 0xf9, 0xdb, 0xbb, 0xda, 0x67, 0x7f, 0x4b, 0x2a, 0xbd, 0x3c, 0x8c, 0xaf, 0xf9, 0x84, 0xdd, 0xc8, 0xa4, 0x6b, 0xe2, 0x0c, 0x5e, 0xdb, 0x39, 0x38, 0x90, 0x92, 0x71, 0x35, 0xcf, 0x6e, 0xfa, 0xd3, 0xd9, 0x88, 0x77, 0x26, 0x35, 0x87, 0x7e, 0xa7, 0x2f, 0x48, 0xbc, 0x3c, 0xc7, 0x23, 0x57, 0xca, 0x6c, 0x5a, 0x1f, 0x86, 0x52, 0x1a, 0x20, 0x89, 0xb2, 0xd8, 0xba, 0xc0, 0x72, 0x68, 0x16, 0x1c, 0x4f, 0xad, 0xdd, 0xf7, 0x7a, 0xca, 0x00, 0x07, 0xab, 0x0e, 0xab, 0xff, 0xe7, 0x87, 0x38, 0x37, 0x30, 0x1b, 0x53, 0x97, 0xa5, 0x07, 0xc0, 0x82, 0x93, 0xb3, 0x7e, 0xed, 0x49, 0x7a, 0x5c, 0x5e, 0x05, 0x13, 0x2f, 0x8b, 0xa1, 0x72, 0xe5, 0xfe, 0xf4, 0x89, 0xc7, 0xb0, 0xd6, 0xc4, 0xfd, 0x39, 0xd9, 0xbd, 0x54, 0xe2, 0x14, 0xc3, 0x9f, 0xec, 0xf6, 0x39, 0x55, 0xa1, 0xd5, 0x81, 0x56, 0x48, 0x40, 0xed, 0xbe, 0x1a, 0xb3, 0xee, 0x4b, 0xde, 0xd6, 0x73, 0x0c, 0xe3, 0x34, 0xec, 0xb5, 0x9a, 0xdd, 0x90, 0x29, 0x6b, 0x72, 0xe7, 0xfd, 0x48, + 0x7b, 0x8c, 0xb7, 0x10, 0xea, 0xc5, 0x74, 0x78, 0x8f, 0x24, 0x48, 0xda, 0x4c, 0xf1, 0xae, 0xb8, 0xac, 0x2d, 0xc3, 0x74, 0xa1, 0xce, 0x5e, 0x20, 0x3c, 0x43, 0x9c, 0xfb, 0xa1, 0x99, 0x65, 0xe5, 0x99, 0x22, 0xdf, 0x04, 0x2f, 0x08, 0xe5, 0x29, 0xc4, 0xac, 0x10, 0x9a, 0xe9, 0x85, 0xbc, 0x0d, 0xaa, 0x50, 0x22, 0xe7, 0xc6, 0x99, 0x00, 0x6b, 0x9a, 0x25, 0x38, 0x48, 0x4e, 0x8b, 0x76, 0xc6, 0xad, 0x00, 0x1b, 0xba, 0xae, 0xf3, 0x7b, 0x31, 0x1d, 0xac, 0x2f, 0x03, 0xae, 0x8b, 0x28, 0x37, 0x8c, 0x0d, 0xdf, 0x63, 0x33, 0x38, 0xea, 0x4b, 0xbd, 0x19, 0x4f, 0xf2, 0xca, 0x0e, 0x6c, 0x50, 0xbf, 0x6c, 0x88, 0xeb, 0xf7, 0x36, 0xd5, 0xbd, 0x82, 0x1b, 0x3b, 0xc7, 0xb0, 0xc6, 0xa6, 0xb7, 0x21, 0x1b, 0xa8, 0x91, 0xfd, 0x23, 0xdd, 0x8c, 0x5d, 0xea, 0x0c, 0xf5, 0xdf, 0x89, 0xdd, 0xdc, 0xcc, 0xb6, 0xc2, 0x9c, 0x0f, 0xb9, 0xe6, 0xf7, 0xd2, 0xe8, 0xea, 0x4f, 0x28, 0xdf, 0x8b, 0xf8, 0xa8, 0xdd, 0x72, 0xa3, 0xba, 0x72, 0xb7, 0xf2, 0xbd, 0xb3, 0x1d, 0x9a, 0xff, 0x59, 0x78, 0x26, 0xfa, 0x34, 0x35, 0xe0, 0xec, 0x34, 0xd2, 0x1a, 0xd8, 0x8c, 0xe4, 0x8b, 0xf0, 0xff, 0x23, 0xc9, 0x18, 0x5c, 0x3a, 0x89, 0x3f, 0x6b, 0xbe, 0xb4, 0x2a, 0xac, 0xb4, 0x78, 0x9e, 0x70, 0xbe, 0x84, 0x56, 0xd2, 0xcb, 0xa4, 0x63, 0x66, 0x9e, 0xd6, 0xea, 0xc6, 0x02, 0x50, 0xf5, 0x3e, 0xf3, 0xff, 0x54, 0x1f, 0xae, 0x7f, 0x0c, 0xfb, 0x2e, 0xd5, 0x96, 0x3f, 0xad, 0x6a, 0x2f, 0x30, 0xa5, 0xba, 0xb5, 0xc1, 0xae, 0xd0, 0xfa, 0x45, 0xda, 0x94, 0x3b, 0x48, 0xd2, 0x24, 0x16, 0x33, 0x50, 0x7e, 0x7d, 0x50, 0x0c, 0x76, 0x81, 0x41, 0x86, 0xea, 0xcc, 0xf7, 0x09, 0x56, 0x2f, 0x97, 0xdb, 0xa3, + 0x02, 0x90, 0xf1, 0x3c, 0xae, 0x5b, 0xc5, 0x67, 0xcf, 0x84, 0xfc, 0x13, 0xc5, 0x7f, 0x7c, 0xf9, 0x14, 0x93, 0xe4, 0x16, 0xf6, 0x70, 0x36, 0x72, 0x73, 0x72, 0x3d, 0xfe, 0x6e, 0x27, 0x23, 0x6e, 0x07, 0x58, 0x26, 0x6a, 0xae, 0x83, 0xf9, 0xcb, 0x94, 0x47, 0xaf, 0xb8, 0xb2, 0x1e, 0x77, 0xe0, 0xd6, 0x16, 0xc1, 0x7a, 0xc9, 0x3f, 0x77, 0x86, 0xe4, 0x62, 0xed, 0xe2, 0x6e, 0x05, 0xbf, 0x8a, 0x2a, 0x56, 0x1d, 0xea, 0x8f, 0x55, 0x18, 0xc5, 0x7c, 0xe3, 0x1e, 0x31, 0xef, 0x5c, 0xa7, 0x8b, 0x91, 0x62, 0x6c, 0xbd, 0x28, 0xe3, 0x76, 0xfd, 0x41, 0xd5, 0xc8, 0xfc, 0xb4, 0x51, 0x96, 0x25, 0xf8, 0xbb, 0x2f, 0xcf, 0x21, 0x06, 0x5b, 0x84, 0x13, 0x2f, 0xd7, 0xef, 0x16, 0xc9, 0x54, 0x5a, 0xc5, 0x28, 0x66, 0x5f, 0x62, 0xd4, 0xfb, 0x8b, 0x09, 0xb6, 0xaf, 0x8e, 0xdf, 0x27, 0x69, 0x24, 0xa4, 0x11, 0x13, 0x99, 0x9e, 0x7b, 0x5c, 0xb2, 0xaf, 0xd2, 0x6d, 0xa3, 0xb0, 0xe6, 0xeb, 0x3d, 0x12, 0x2b, 0xf9, 0x74, 0xf6, 0x22, 0xbc, 0xad, 0x81, 0x49, 0xeb, 0x6a, 0x18, 0x70, 0x08, 0xbc, 0x7d, 0xde, 0x3b, 0xab, 0x24, 0x07, 0x3a, 0x33, 0x6b, 0x91, 0x76, 0x45, 0xe9, 0x5b, 0xdc, 0x46, 0x8a, 0x14, 0x59, 0x6f, 0xfb, 0x76, 0xb6, 0x57, 0x17, 0x98, 0xf6, 0xaa, 0x5f, 0xe7, 0x67, 0xcf, 0x88, 0x65, 0xae, 0x07, 0x0c, 0x83, 0xa7, 0x88, 0xcf, 0x33, 0x3d, 0xb5, 0x04, 0x81, 0xe2, 0x2d, 0x99, 0xf2, 0xed, 0x98, 0x87, 0x18, 0x59, 0x62, 0xbc, 0x57, 0x06, 0x0d, 0xc4, 0xb0, 0x2f, 0x02, 0xc2, 0x84, 0x6c, 0x4a, 0x5e, 0x5d, 0x8b, 0xfd, 0x23, 0x43, 0x89, 0x55, 0x22, 0x08, 0xc1, 0x61, 0x93, 0xab, 0x08, 0x35, 0x82, 0x12, 0xa3, 0xa3, 0x28, 0x89, 0x8c, 0xfe, 0x96, 0x41, 0x9c, 0x17, + 0xbd, 0xd8, 0x4d, 0x75, 0xf6, 0x21, 0x2b, 0x35, 0xff, 0x49, 0x79, 0x1e, 0x90, 0x50, 0x70, 0x66, 0x8f, 0x0b, 0x3b, 0x40, 0x2c, 0xb4, 0xda, 0x29, 0xf0, 0x6d, 0xab, 0x84, 0xd2, 0x82, 0x19, 0x4b, 0x1a, 0xc4, 0x57, 0x28, 0xf2, 0x5e, 0x88, 0xc4, 0x0d, 0x8e, 0x46, 0xda, 0xec, 0xe0, 0xbe, 0x45, 0x2a, 0x3a, 0x1b, 0xee, 0xd3, 0xff, 0x95, 0xa6, 0x27, 0x9b, 0xd2, 0xb2, 0x75, 0xfb, 0xeb, 0x09, 0xcd, 0xc9, 0x3c, 0x46, 0x2a, 0x91, 0xe6, 0x86, 0x86, 0x22, 0xc2, 0xfa, 0x4d, 0xd3, 0xd7, 0xbc, 0x31, 0x0c, 0xec, 0xa8, 0x4a, 0xd2, 0xf2, 0x78, 0xa1, 0xee, 0xba, 0x08, 0x06, 0xbe, 0xa6, 0xf3, 0x06, 0x92, 0x15, 0x4f, 0xac, 0xcf, 0x2f, 0x86, 0xe3, 0xff, 0x7f, 0x9d, 0x5d, 0x34, 0xfa, 0x21, 0xf9, 0xf4, 0x37, 0x48, 0xb9, 0xfd, 0x50, 0x6a, 0xdc, 0x32, 0xee, 0xf5, 0x48, 0x11, 0x1e, 0xfc, 0x22, 0x15, 0xee, 0x1f, 0x20, 0xd3, 0xc2, 0xb9, 0x72, 0x78, 0x79, 0x2e, 0x21, 0xd5, 0x3f, 0x9c, 0xbb, 0x7f, 0xab, 0x61, 0x93, 0x6b, 0x79, 0xaf, 0x42, 0xa9, 0x71, 0xd9, 0x48, 0x71, 0xb8, 0xde, 0x47, 0x06, 0xed, 0xe4, 0x69, 0xfa, 0x27, 0x4b, 0xb2, 0x75, 0xfd, 0x50, 0x74, 0xc4, 0xc2, 0x2d, 0x58, 0x28, 0x31, 0x26, 0x11, 0x79, 0x60, 0x23, 0x5d, 0x10, 0x19, 0xd3, 0x1b, 0x0c, 0xab, 0xa0, 0xd7, 0x49, 0x36, 0xed, 0x60, 0xd7, 0xdd, 0xd2, 0x96, 0x3c, 0x52, 0xcd, 0x5f, 0x53, 0x73, 0x1e, 0x5f, 0x95, 0x5a, 0xc4, 0x72, 0x3a, 0xb7, 0x1e, 0xb6, 0x26, 0xa7, 0x79, 0x7a, 0xac, 0x04, 0x86, 0x3c, 0x1c, 0x6b, 0xe1, 0x9e, 0xba, 0xd8, 0x5a, 0xb2, 0x0f, 0xae, 0x3d, 0xc8, 0x8c, 0x7c, 0x9c, 0x23, 0x19, 0x5d, 0x3d, 0x52, 0x28, 0x4d, 0x9c, 0x00, 0x3b, 0x6a, 0xa2, 0xc5, 0x0e, 0x50, 0x13, + 0x20, 0xca, 0xc7, 0x2d, 0x3d, 0xa8, 0x20, 0xa9, 0x01, 0xcd, 0xa7, 0x2f, 0xec, 0x43, 0x52, 0x2e, 0xa0, 0x96, 0xf9, 0x8f, 0x84, 0x33, 0x64, 0x0e, 0x10, 0xa8, 0xb3, 0x1c, 0xfc, 0x2a, 0xe1, 0x99, 0x07, 0xa8, 0xb0, 0xb4, 0x79, 0x38, 0x34, 0x5a, 0x68, 0x8a, 0xe9, 0x6c, 0x79, 0x17, 0xdb, 0x49, 0xe2, 0x56, 0xf4, 0xc5, 0xa5, 0xe3, 0x5f, 0x7d, 0xbd, 0x75, 0xcf, 0xe6, 0xf5, 0x2e, 0xfe, 0x6f, 0xb2, 0xfd, 0x3d, 0x47, 0x55, 0x6c, 0xea, 0x2d, 0xee, 0x95, 0xeb, 0xc4, 0xac, 0x17, 0xe5, 0xc5, 0xfe, 0x32, 0x8f, 0xd9, 0xd9, 0x14, 0x88, 0x20, 0xb9, 0x40, 0x3e, 0xe3, 0x3a, 0xcc, 0xe6, 0xb5, 0x70, 0x79, 0x44, 0xe1, 0x80, 0x14, 0x7c, 0x98, 0x2d, 0x4b, 0x98, 0xd9, 0x63, 0x1a, 0xdc, 0xdd, 0x19, 0x65, 0x6a, 0x50, 0x39, 0x92, 0x11, 0x64, 0xe6, 0x2c, 0xf9, 0xcf, 0x50, 0xc6, 0x75, 0xbf, 0x90, 0x12, 0xcd, 0x02, 0x73, 0x9d, 0x40, 0xf8, 0xa9, 0x78, 0x0b, 0x91, 0x1f, 0x14, 0xc2, 0xf8, 0xf5, 0x96, 0xe1, 0x01, 0x17, 0x8f, 0x5c, 0xb1, 0x96, 0x63, 0xec, 0xaa, 0x62, 0x56, 0x5b, 0xce, 0x26, 0xc4, 0xb0, 0x31, 0xa7, 0x8d, 0x20, 0xdd, 0xff, 0x26, 0x07, 0x90, 0xa4, 0x25, 0x0c, 0x5e, 0x14, 0x21, 0x52, 0x47, 0xc9, 0x8c, 0xea, 0xfd, 0x2d, 0x44, 0x55, 0x7e, 0x21, 0x90, 0x25, 0x83, 0x80, 0xc4, 0x12, 0xb7, 0x60, 0xec, 0xf0, 0xdf, 0x60, 0x8f, 0xa3, 0x46, 0xca, 0x58, 0x8a, 0x9e, 0x32, 0x3a, 0x36, 0x82, 0xef, 0x20, 0x26, 0x8b, 0xda, 0xf5, 0x11, 0x1f, 0x9e, 0xf4, 0x73, 0x18, 0xa7, 0xcf, 0x04, 0x80, 0x77, 0xdf, 0x46, 0x89, 0x4d, 0xdc, 0xc7, 0x2c, 0x3c, 0xf2, 0x8c, 0x94, 0x21, 0xcc, 0xc4, 0xc1, 0x3f, 0x2f, 0x0e, 0x24, 0x52, 0x91, 0x6a, 0xa8, 0xd4, 0x86, 0x5e, 0x9b, + 0x54, 0x3a, 0x4a, 0x94, 0x0e, 0xb0, 0x70, 0xa2, 0x5a, 0xd5, 0x29, 0x98, 0x6a, 0x3e, 0xe0, 0xc9, 0xa5, 0x27, 0x3e, 0xc8, 0x5b, 0xa5, 0x4e, 0x85, 0x7c, 0xdc, 0xc9, 0x6e, 0x82, 0x64, 0x14, 0x00, 0x8e, 0xa3, 0x6a, 0x45, 0x30, 0x3b, 0x98, 0x68, 0xbc, 0xef, 0x91, 0x05, 0xfa, 0x99, 0xfd, 0x1c, 0x29, 0x4a, 0x74, 0xb3, 0xad, 0xb1, 0x7a, 0xa9, 0x5e, 0x83, 0x48, 0x81, 0xb5, 0x7e, 0x61, 0xec, 0xd2, 0xc2, 0xab, 0xd6, 0xb5, 0x83, 0xf0, 0x42, 0xcd, 0x04, 0xc0, 0x55, 0xf9, 0x1d, 0x1c, 0x57, 0xbf, 0xac, 0x14, 0xbc, 0x51, 0x61, 0x7b, 0xf1, 0x4d, 0x70, 0xbf, 0x8c, 0x04, 0xdc, 0x20, 0x6f, 0x86, 0x59, 0xc5, 0xd7, 0xde, 0x0d, 0xd2, 0xa4, 0x14, 0x09, 0xb9, 0x06, 0xc6, 0x1c, 0x25, 0x53, 0xbd, 0x4b, 0x1f, 0x06, 0xd2, 0xca, 0xc1, 0xc2, 0xef, 0xc3, 0xd0, 0xab, 0xf1, 0xda, 0x19, 0x67, 0xf7, 0x89, 0xb6, 0x61, 0x06, 0x0c, 0x67, 0x7f, 0x07, 0x5e, 0x35, 0xd3, 0xdc, 0x32, 0xb1, 0xe7, 0xbe, 0xbc, 0x5b, 0xed, 0x2b, 0xf0, 0x95, 0x35, 0xc3, 0xcb, 0x30, 0x85, 0x84, 0xd8, 0xec, 0x31, 0x89, 0xcb, 0x69, 0x78, 0xbf, 0x2a, 0x46, 0x04, 0x79, 0xde, 0xdd, 0x29, 0xd6, 0x40, 0xf6, 0xf6, 0x71, 0x9c, 0x88, 0x16, 0x4b, 0x20, 0xb6, 0x72, 0x74, 0x8a, 0x2a, 0x42, 0x0b, 0xd8, 0x89, 0x21, 0xa9, 0x8e, 0x47, 0x36, 0xcb, 0x0b, 0xd2, 0xde, 0x8b, 0x7e, 0xe6, 0x23, 0x82, 0x19, 0xe1, 0xdf, 0xe1, 0xd5, 0xdf, 0xc4, 0xaa, 0x14, 0x9c, 0xd3, 0x19, 0xb1, 0x5a, 0x60, 0x18, 0x53, 0x19, 0x4c, 0x2d, 0xf5, 0x36, 0xc3, 0x91, 0x4a, 0xed, 0x85, 0xd9, 0xbe, 0x50, 0x37, 0xe9, 0x36, 0xcb, 0xc5, 0xa1, 0x1b, 0x70, 0xe5, 0x5d, 0x25, 0x3c, 0x2d, 0xd8, 0xaa, 0x3c, 0xcb, 0xc1, 0x9e, 0xf9, 0x61, + 0x4c, 0xec, 0xf2, 0x4c, 0x1e, 0x7c, 0x45, 0x7a, 0x0d, 0x26, 0xcb, 0x6c, 0xd3, 0x21, 0x20, 0x61, 0x44, 0xef, 0xee, 0x73, 0x6e, 0x39, 0x68, 0x02, 0x2f, 0x36, 0x2d, 0xae, 0xd9, 0x34, 0x7e, 0x0b, 0x48, 0x2e, 0xa5, 0x1c, 0x9a, 0x2e, 0x2e, 0xd3, 0x4a, 0x69, 0x69, 0xf2, 0x5d, 0x91, 0xde, 0x4d, 0x0e, 0x21, 0xd6, 0xad, 0x91, 0xb0, 0xf2, 0x45, 0x21, 0x8d, 0x96, 0x51, 0x77, 0x7d, 0x18, 0xc1, 0xd3, 0x89, 0x0c, 0x17, 0xdb, 0xbf, 0x3d, 0xbf, 0x8d, 0x4c, 0x6f, 0x2a, 0x85, 0x38, 0x54, 0x2c, 0xc7, 0x63, 0x60, 0x8f, 0x4c, 0xce, 0x56, 0x39, 0xdb, 0x3e, 0x39, 0x4e, 0x3d, 0x54, 0xb6, 0x70, 0x19, 0xc1, 0xa9, 0xb0, 0x82, 0x33, 0x94, 0x09, 0x35, 0xd9, 0xce, 0x09, 0x7c, 0x91, 0x36, 0x8e, 0x2f, 0x28, 0x2e, 0xf6, 0xf4, 0x72, 0x84, 0xe7, 0x3a, 0xab, 0xf7, 0xcd, 0x71, 0xcc, 0xf8, 0xe9, 0x8e, 0x9e, 0x1b, 0x50, 0x0c, 0xe9, 0x49, 0xc1, 0xc0, 0xcd, 0x20, 0xa9, 0x2f, 0x59, 0xed, 0x24, 0x8e, 0x1d, 0xf0, 0x01, 0x76, 0x79, 0x7d, 0xef, 0x1c, 0x81, 0x68, 0x6f, 0x41, 0x26, 0x67, 0xc6, 0xe7, 0x84, 0x48, 0xeb, 0x02, 0xd5, 0x15, 0xc9, 0x25, 0xd2, 0x05, 0x4a, 0x37, 0xf1, 0x13, 0x26, 0x62, 0x3b, 0x6a, 0x5f, 0x1e, 0x77, 0x85, 0xaa, 0x54, 0x52, 0xbd, 0x06, 0x98, 0x9a, 0x8e, 0xba, 0x1a, 0x67, 0x0d, 0xda, 0xc4, 0xe9, 0x8f, 0x63, 0x30, 0x4f, 0xd7, 0x4c, 0xa9, 0xf8, 0xa0, 0xf1, 0x84, 0x31, 0x42, 0xd0, 0x70, 0xa2, 0x88, 0x61, 0x15, 0x08, 0x0a, 0x8a, 0xcc, 0xbc, 0x88, 0xc2, 0x77, 0x97, 0x2a, 0xa5, 0x5b, 0x92, 0x11, 0xf1, 0x3f, 0x93, 0x67, 0x97, 0x25, 0x7c, 0x78, 0x62, 0x3a, 0xfb, 0xe1, 0x7a, 0x5b, 0x27, 0xfe, 0x2e, 0xa0, 0x04, 0x8a, 0x2d, 0xf8, 0x73, 0xdd, 0x5a, + 0xf6, 0xc3, 0x6a, 0x1d, 0x87, 0x5b, 0x14, 0x05, 0xab, 0xcf, 0xfe, 0x1a, 0x34, 0xd8, 0x92, 0xda, 0x54, 0x3f, 0x9e, 0x15, 0x30, 0xcf, 0x24, 0x93, 0x5f, 0x71, 0x42, 0x13, 0xf4, 0xbb, 0x69, 0xbc, 0x30, 0x4b, 0x00, 0x4a, 0x0f, 0x2d, 0xb3, 0xc3, 0x28, 0xfd, 0xc3, 0x8c, 0xd9, 0xbc, 0x1c, 0x65, 0x8e, 0xf1, 0xae, 0x63, 0x28, 0x84, 0x54, 0xbd, 0x3a, 0x31, 0xf1, 0xd8, 0x00, 0x2f, 0x0d, 0xbe, 0x8d, 0x2a, 0x5d, 0xea, 0x70, 0x78, 0x8b, 0x9e, 0xdd, 0x5f, 0x9e, 0x20, 0x32, 0x60, 0x16, 0x28, 0x0f, 0x84, 0x26, 0xa8, 0x8c, 0x5f, 0x47, 0xc9, 0x2b, 0xb9, 0xeb, 0x79, 0xea, 0xdb, 0x12, 0x7c, 0xc0, 0xea, 0xd6, 0x0e, 0xd0, 0x43, 0x2f, 0x22, 0xda, 0xbe, 0xfd, 0x98, 0x02, 0x0a, 0xf8, 0x47, 0x3e, 0x4c, 0x8e, 0x80, 0x06, 0xc0, 0xb1, 0xa0, 0x39, 0x50, 0x84, 0x5d, 0xd6, 0x9f, 0x91, 0x6d, 0x9f, 0xd1, 0xac, 0xb1, 0x05, 0x77, 0x24, 0x88, 0x1e, 0xa4, 0x86, 0x72, 0x95, 0x3d, 0x8d, 0xe2, 0x64, 0x21, 0x9f, 0xa3, 0x9e, 0x70, 0x02, 0x53, 0x26, 0xbc, 0xc3, 0x52, 0x2f, 0x97, 0x8f, 0xd0, 0x21, 0xd2, 0xb9, 0x79, 0x09, 0xff, 0xcc, 0xfb, 0x56, 0xfd, 0x56, 0x1d, 0x4a, 0xd3, 0xd3, 0x08, 0x10, 0x82, 0xa3, 0xfc, 0xa2, 0x91, 0xe4, 0x32, 0xae, 0x3d, 0x27, 0x5a, 0xeb, 0x78, 0x27, 0xd9, 0x08, 0x32, 0xc4, 0x9c, 0x3d, 0x93, 0x65, 0xe6, 0xb9, 0xe1, 0xd5, 0x49, 0x30, 0x61, 0x14, 0xa8, 0x86, 0xb9, 0x63, 0x37, 0x0a, 0x16, 0x7c, 0x34, 0x08, 0x92, 0xa7, 0xde, 0x6a, 0xd7, 0x1d, 0xef, 0x20, 0xa8, 0x24, 0x25, 0x27, 0x6a, 0x3a, 0x7b, 0x35, 0xa4, 0x36, 0x3e, 0xdf, 0xd7, 0xa8, 0x83, 0x21, 0x2e, 0xb0, 0xb3, 0x48, 0x70, 0x48, 0x1d, 0x3c, 0xb9, 0xb2, 0x4e, 0x09, 0xea, 0xef, 0x20, + 0x4b, 0x80, 0x9a, 0xbb, 0x0a, 0x16, 0x3d, 0x18, 0x46, 0x02, 0x49, 0x4a, 0x90, 0x85, 0x9f, 0x4b, 0xcb, 0x82, 0xe0, 0x91, 0x9b, 0x0e, 0x33, 0x23, 0xd7, 0x26, 0x15, 0x28, 0x2d, 0xc3, 0xb7, 0xb8, 0xb3, 0x08, 0x56, 0x37, 0xa0, 0x37, 0x65, 0x33, 0x13, 0x10, 0x1a, 0x68, 0x2c, 0xd0, 0xde, 0x70, 0x75, 0x78, 0xf2, 0x47, 0xb5, 0x7d, 0xf4, 0x8e, 0x06, 0x32, 0x9d, 0x3d, 0x02, 0xf4, 0x8f, 0x27, 0x10, 0x23, 0x47, 0xc1, 0xb4, 0x24, 0x00, 0x0e, 0x5e, 0x61, 0xab, 0x2c, 0x4b, 0x34, 0xd8, 0x40, 0xba, 0xe0, 0x33, 0x4a, 0xe2, 0x97, 0x36, 0xeb, 0x85, 0xbb, 0x28, 0xaa, 0xd0, 0xaf, 0x87, 0x7f, 0x15, 0x7d, 0xa9, 0xb2, 0x35, 0xbc, 0x6d, 0xd2, 0x88, 0x69, 0x65, 0x6c, 0x53, 0x53, 0xb7, 0x1c, 0x13, 0xf5, 0xb9, 0x9e, 0x45, 0x96, 0x4d, 0x26, 0x96, 0x82, 0xa7, 0x90, 0xad, 0x53, 0x84, 0x58, 0x67, 0xdf, 0x00, 0x54, 0x38, 0x6b, 0xe8, 0xe2, 0x9a, 0x91, 0xc5, 0xfe, 0x84, 0x2c, 0x91, 0x80, 0xf3, 0xaf, 0x2d, 0xd6, 0x12, 0x65, 0x38, 0xc4, 0x96, 0x13, 0x41, 0x20, 0x4f, 0x6e, 0x9b, 0x14, 0x5c, 0x9e, 0xe1, 0x7f, 0x83, 0xe4, 0xac, 0x28, 0x61, 0xc9, 0xda, 0x81, 0xdc, 0x77, 0x22, 0x2b, 0x20, 0x57, 0x98, 0x03, 0x0d, 0x78, 0x95, 0xd7, 0xda, 0xaf, 0xb9, 0x85, 0x32, 0xd7, 0x74, 0x90, 0xab, 0x82, 0xaf, 0x88, 0xbf, 0x49, 0x36, 0x09, 0xbc, 0xe6, 0xcc, 0xc4, 0xf5, 0xa3, 0x0c, 0x48, 0xd2, 0x46, 0x9c, 0x3d, 0xe5, 0xde, 0xdd, 0x87, 0x34, 0x4a, 0x0a, 0x3c, 0xb5, 0xfc, 0x03, 0x0f, 0x65, 0x13, 0x38, 0x91, 0x56, 0xc6, 0xbe, 0x1e, 0xbc, 0xce, 0xdb, 0xfb, 0xff, 0x1e, 0xdf, 0x4f, 0xed, 0x26, 0xdf, 0xc1, 0xef, 0xcd, 0xbe, 0x9d, 0x52, 0x53, 0x13, 0x0d, 0x28, 0x32, 0x38, 0x03, + 0x69, 0xf6, 0x91, 0x89, 0xed, 0xdc, 0xca, 0xb8, 0xfe, 0x66, 0x60, 0x94, 0x14, 0xdf, 0xef, 0x65, 0x9e, 0x5a, 0x0e, 0x66, 0x1d, 0x9d, 0x22, 0xdf, 0x4e, 0x8f, 0xed, 0x91, 0xef, 0x45, 0x27, 0x80, 0x1a, 0x66, 0xb3, 0xd7, 0xcf, 0xb8, 0xa8, 0x70, 0x5c, 0xaa, 0xc2, 0xf2, 0x26, 0xa9, 0x31, 0xdf, 0x96, 0x81, 0x0b, 0x8d, 0x5e, 0xf9, 0x0e, 0x8b, 0xf4, 0x08, 0x89, 0xd7, 0xa0, 0x37, 0xca, 0x41, 0x56, 0x5c, 0x71, 0xbf, 0x44, 0x7f, 0x1d, 0x59, 0xb4, 0x08, 0x16, 0xf9, 0x1d, 0x50, 0x71, 0x2f, 0x6e, 0xb3, 0xc1, 0x8e, 0x7a, 0x90, 0x78, 0x91, 0x80, 0xf8, 0x14, 0xf5, 0xfd, 0x76, 0x96, 0x7e, 0x77, 0xde, 0x59, 0x7c, 0x88, 0x8c, 0x0a, 0xfb, 0x78, 0x8b, 0x0a, 0x50, 0x40, 0x91, 0xf1, 0xa8, 0xd4, 0xa7, 0xea, 0xd2, 0x16, 0x05, 0xb3, 0x25, 0x0c, 0xe8, 0x92, 0x6b, 0x45, 0x4e, 0x19, 0x7a, 0x4e, 0x47, 0x67, 0x5b, 0x88, 0xf6, 0x56, 0x65, 0x56, 0x83, 0x31, 0x2f, 0x37, 0xe7, 0xef, 0x00, 0x72, 0x06, 0xe8, 0xaa, 0x02, 0x16, 0x4f, 0x19, 0x35, 0x9e, 0x79, 0x8f, 0xff, 0x66, 0x30, 0x9f, 0xd8, 0xc6, 0xe3, 0xe2, 0x57, 0x7e, 0x0e, 0x6d, 0x88, 0x0d, 0x0f, 0xd7, 0xf4, 0x09, 0xbd, 0x29, 0x3c, 0x69, 0x98, 0x3b, 0xa4, 0x38, 0x59, 0x70, 0xdc, 0x7e, 0x89, 0x9f, 0xf1, 0xbd, 0x2c, 0xa8, 0xb8, 0xea, 0x83, 0xa1, 0x3d, 0x6f, 0x05, 0x3a, 0x0b, 0x26, 0x3e, 0xa6, 0xd4, 0xd5, 0x1d, 0x42, 0x5e, 0x23, 0x22, 0x1a, 0xb5, 0x59, 0x6a, 0x47, 0xd6, 0x50, 0x25, 0x03, 0x69, 0xba, 0x4b, 0x44, 0x46, 0x8c, 0x19, 0xf8, 0x13, 0xb5, 0xba, 0x11, 0xf1, 0x7d, 0x65, 0x5b, 0x09, 0xf1, 0xb5, 0x9f, 0x1c, 0x72, 0x5b, 0xfd, 0x45, 0x2b, 0x04, 0x3d, 0x21, 0x1e, 0x5f, 0x82, 0xc7, 0xf8, 0xb7, 0xff, + 0x6e, 0x28, 0xf9, 0x6f, 0xaf, 0x81, 0x50, 0x94, 0xdd, 0x04, 0xe5, 0xb0, 0x31, 0x68, 0xdd, 0x93, 0xac, 0x18, 0x78, 0x31, 0x8e, 0xfd, 0x93, 0x33, 0xa5, 0x38, 0x88, 0xec, 0x9e, 0xdb, 0xa3, 0xaa, 0xb3, 0xc5, 0x75, 0x38, 0x28, 0x8e, 0xa0, 0xc2, 0x75, 0x13, 0xa8, 0x7f, 0xc1, 0x8c, 0x6f, 0xc8, 0xdb, 0xc9, 0x7b, 0x86, 0xf2, 0x35, 0xc6, 0xef, 0x5b, 0xac, 0xa4, 0x2e, 0xd5, 0x7d, 0x58, 0x78, 0x39, 0xd4, 0xe8, 0x8a, 0x4c, 0xa1, 0x2e, 0xea, 0x8c, 0x16, 0xfc, 0x0d, 0x8b, 0x06, 0xbf, 0x4d, 0xb2, 0x9a, 0x02, 0xa8, 0x22, 0xb6, 0x85, 0x73, 0x64, 0xaf, 0x7e, 0xfb, 0x7c, 0x25, 0x4f, 0x7f, 0x21, 0x92, 0x96, 0x6a, 0xdd, 0x84, 0x76, 0x80, 0x4a, 0x2c, 0xf1, 0xf2, 0x74, 0xd3, 0xb5, 0xb0, 0x66, 0xb5, 0xf6, 0x1d, 0xd0, 0x61, 0x3c, 0x22, 0x76, 0xb7, 0x04, 0xbb, 0x5b, 0x0b, 0x99, 0x41, 0xb7, 0x00, 0x57, 0x86, 0x38, 0x2c, 0x00, 0x12, 0x0f, 0x3d, 0xd8, 0x6c, 0x19, 0x23, 0xdd, 0xc4, 0xc9, 0x56, 0xaa, 0x7d, 0xf5, 0x47, 0x45, 0xa9, 0xb4, 0x45, 0xef, 0x73, 0xc4, 0x26, 0x89, 0x94, 0x51, 0xe4, 0x17, 0x12, 0x77, 0x09, 0xc8, 0x10, 0xcb, 0x72, 0x82, 0x0e, 0x59, 0x70, 0x64, 0x34, 0x21, 0x46, 0xc6, 0x02, 0x06, 0x6f, 0xff, 0x6e, 0xbf, 0xc3, 0xee, 0x88, 0x57, 0xac, 0x29, 0x51, 0x5d, 0xd8, 0x82, 0xd3, 0x54, 0x15, 0x5e, 0x14, 0x04, 0x12, 0x7b, 0x11, 0x78, 0x49, 0x5c, 0xc9, 0x4d, 0xac, 0xef, 0x93, 0x76, 0x32, 0x1c, 0x65, 0x45, 0x65, 0x25, 0x5a, 0xea, 0x74, 0x02, 0x85, 0xaa, 0xdd, 0x7d, 0x74, 0xa2, 0xea, 0xb1, 0xfb, 0x6b, 0x6c, 0x31, 0xbe, 0x8a, 0x50, 0xcd, 0xda, 0x25, 0x9d, 0x27, 0x97, 0xac, 0x78, 0xe1, 0x51, 0x31, 0x5f, 0xfe, 0x13, 0xca, 0xc7, 0x65, 0x57, + 0xa5, 0xf8, 0x78, 0x5f, 0xed, 0xa7, 0xcd, 0x49, 0x23, 0x66, 0x73, 0x5d, 0x91, 0x14, 0x25, 0xd2, 0x6b, 0x93, 0x5a, 0x60, 0x64, 0xd0, 0xf7, 0x55, 0x50, 0xfb, 0xf4, 0xdf, 0x8d, 0x2a, 0xe6, 0x35, 0x18, 0xed, 0xb1, 0x64, 0x4d, 0x1b, 0x0d, 0x09, 0xbc, 0xf3, 0x1b, 0xf3, 0x6d, 0x99, 0xf8, 0x4c, 0xfd, 0xb4, 0x50, 0xfb, 0x46, 0x53, 0x44, 0x46, 0x8f, 0x4b, 0xff, 0x79, 0x47, 0x44, 0xd2, 0xc7, 0xc0, 0x86, 0x8e, 0x99, 0x8d, 0x40, 0xc3, 0x20, 0xe5, 0x82, 0xc5, 0xb2, 0xd2, 0x85, 0x74, 0xe9, 0x11, 0x1e, 0x9e, 0x54, 0x45, 0xeb, 0xf6, 0x1a, 0xde, 0xd3, 0x9f, 0xea, 0xfc, 0x6d, 0x92, 0xe1, 0xdf, 0x51, 0x4d, 0x4b, 0x3c, 0x92, 0xb8, 0xaf, 0xac, 0x94, 0x93, 0x8b, 0x53, 0x1a, 0x76, 0x1d, 0xe7, 0xe0, 0xa5, 0xe2, 0x70, 0x5c, 0x9a, 0x5a, 0x12, 0xda, 0x4c, 0x77, 0x70, 0x94, 0xbe, 0x49, 0x1b, 0x46, 0x0a, 0x9c, 0x31, 0xf2, 0xae, 0x2f, 0xf8, 0xb4, 0x1d, 0x0e, 0xd4, 0x62, 0x87, 0xf6, 0x84, 0xdb, 0x64, 0xd8, 0x9f, 0xdf, 0xcc, 0x97, 0x0e, 0x6c, 0x3a, 0x24, 0xb7, 0x11, 0xe9, 0xc8, 0x97, 0x9b, 0x35, 0x65, 0x47, 0xb4, 0xf8, 0x03, 0xb3, 0x6a, 0x46, 0x29, 0x0e, 0xa9, 0x82, 0xf8, 0x9c, 0x28, 0xaf, 0x46, 0xd3, 0xbc, 0x21, 0xc6, 0x1f, 0x92, 0xef, 0x81, 0x79, 0xb7, 0xc4, 0x2f, 0x32, 0x77, 0x49, 0x68, 0xdb, 0xd1, 0x1a, 0xe6, 0x25, 0x13, 0x76, 0x4e, 0xf0, 0x93, 0xaa, 0x61, 0x8d, 0x31, 0x69, 0x75, 0x5d, 0xf4, 0xa6, 0xc4, 0xc3, 0xc2, 0x0b, 0x08, 0x99, 0x4b, 0x3c, 0x8d, 0x34, 0x6d, 0xfb, 0x12, 0xf2, 0xc9, 0x32, 0x63, 0xec, 0x73, 0x65, 0x29, 0x71, 0xdc, 0x3c, 0xac, 0xd4, 0x62, 0xe1, 0x8b, 0x94, 0xb0, 0x28, 0x9c, 0xbf, 0x69, 0xef, 0x18, 0x7e, 0xb4, 0x54, 0xa8, + 0xcf, 0xab, 0x0f, 0x1b, 0xd0, 0x7d, 0xb3, 0xe4, 0x5b, 0x24, 0xe4, 0x00, 0xff, 0xc3, 0x32, 0xa0, 0x07, 0xe2, 0x9c, 0x0f, 0xfb, 0x68, 0xa9, 0x2a, 0x05, 0xec, 0x9d, 0x7f, 0x30, 0x75, 0x87, 0xf3, 0x63, 0x26, 0x26, 0x88, 0xde, 0x5f, 0x87, 0xf0, 0xbc, 0x42, 0xe3, 0x8c, 0x8c, 0x96, 0x0f, 0xfd, 0xdf, 0x8b, 0xcd, 0x58, 0x24, 0xe7, 0x88, 0x76, 0x50, 0xdf, 0xbe, 0xda, 0x55, 0x94, 0xd2, 0xc5, 0x6e, 0xcf, 0x49, 0x0b, 0x58, 0x7e, 0x94, 0x64, 0x0f, 0x39, 0xae, 0x64, 0x96, 0x3b, 0xa5, 0xd3, 0xc7, 0x5f, 0x53, 0x79, 0x82, 0xef, 0x48, 0xa5, 0x7c, 0x56, 0xa2, 0x96, 0xa1, 0x27, 0xbe, 0x23, 0x8e, 0x76, 0xd4, 0x24, 0x1c, 0xb4, 0xb4, 0xb5, 0x9c, 0xf7, 0x42, 0xb3, 0x57, 0x29, 0xfc, 0xc8, 0xa1, 0x80, 0x0d, 0xf8, 0x2d, 0x17, 0x3f, 0x99, 0x09, 0x3d, 0x44, 0xf2, 0x33, 0x19, 0xe7, 0xfd, 0x0d, 0x8e, 0xbd, 0xe7, 0x86, 0x89, 0x15, 0x2f, 0x6e, 0xcc, 0xcd, 0xb2, 0xd6, 0xc7, 0xa8, 0x85, 0x72, 0x7f, 0xc4, 0x17, 0x2b, 0x8f, 0x7b, 0x4b, 0x8e, 0x5f, 0x96, 0xc2, 0xe7, 0xc2, 0x7c, 0x40, 0x6d, 0xda, 0x2a, 0x8b, 0xfe, 0xbc, 0xc8, 0xee, 0x03, 0x7e, 0x91, 0xd5, 0xef, 0xd8, 0xc0, 0xe2, 0xb5, 0x51, 0x26, 0xf4, 0x1a, 0xd3, 0x0a, 0x0b, 0x2b, 0x81, 0xe6, 0xdc, 0x59, 0x88, 0x65, 0x99, 0xa6, 0xd9, 0xa8, 0x37, 0x20, 0xf1, 0x78, 0x33, 0x11, 0xe8, 0xaf, 0xce, 0x9c, 0xe6, 0xe0, 0x7b, 0x14, 0x90, 0xb6, 0x59, 0x65, 0x00, 0x82, 0xb8, 0xd1, 0x8d, 0xe9, 0xac, 0xd2, 0xd0, 0xb8, 0xad, 0x6d, 0x04, 0x94, 0x58, 0x45, 0x9d, 0xb3, 0x46, 0x7d, 0x51, 0x33, 0xae, 0x0e, 0x39, 0x8c, 0x28, 0x03, 0x39, 0xd6, 0x39, 0x72, 0xc3, 0x96, 0x62, 0x76, 0xd3, 0x94, 0xe6, 0xb3, 0xd2, 0x21, 0x43, + 0x21, 0x8c, 0x93, 0xad, 0xb9, 0xbe, 0xf6, 0x2c, 0x7b, 0xb2, 0x84, 0xf0, 0x35, 0x25, 0xa0, 0x8a, 0xe2, 0x40, 0x95, 0xcb, 0x1a, 0x54, 0x20, 0x04, 0x2c, 0x03, 0x4b, 0xcf, 0x76, 0x5f, 0xc7, 0xa7, 0xec, 0x9f, 0xbc, 0xdf, 0x77, 0xf4, 0x85, 0xe0, 0x5a, 0xda, 0x9b, 0x1e, 0xc2, 0x84, 0x9d, 0xa8, 0xc8, 0x36, 0x87, 0x0f, 0xea, 0x4c, 0x48, 0xa9, 0xa5, 0x3b, 0x80, 0x7d, 0x52, 0x1d, 0x8e, 0x65, 0x4a, 0x1d, 0x42, 0x87, 0x95, 0x94, 0xa2, 0x42, 0xb7, 0x93, 0x1d, 0xd3, 0x63, 0x74, 0x18, 0x1e, 0x65, 0x4a, 0x08, 0x13, 0x38, 0xea, 0xf4, 0x66, 0x33, 0x6d, 0x09, 0xf8, 0x9e, 0x04, 0x3c, 0x88, 0x39, 0x38, 0xb0, 0x37, 0xbf, 0x65, 0x9e, 0x50, 0xca, 0x2d, 0x43, 0xbe, 0x46, 0x93, 0xc6, 0xb6, 0x0c, 0x81, 0x46, 0xc7, 0xcf, 0x33, 0xce, 0xbc, 0x9e, 0xdf, 0x5b, 0x71, 0xf9, 0x35, 0x2f, 0xae, 0x6c, 0xac, 0xdf, 0x83, 0xbb, 0x1c, 0xe7, 0x81, 0x3d, 0x40, 0x3a, 0x65, 0x0d, 0x34, 0xf8, 0x58, 0xce, 0x5c, 0x30, 0xef, 0x85, 0x5f, 0xc7, 0xa5, 0x40, 0x01, 0x0f, 0xd1, 0x65, 0xf9, 0x29, 0xd9, 0x82, 0xaa, 0x2c, 0x6a, 0x48, 0x1c, 0xb9, 0x35, 0x8a, 0xb9, 0x3e, 0x23, 0xee, 0x68, 0x08, 0xa9, 0xd7, 0xb7, 0xca, 0x19, 0x8e, 0xa0, 0x76, 0x8d, 0xd0, 0x57, 0xaf, 0xb6, 0x78, 0xed, 0x6b, 0x28, 0x53, 0x16, 0x43, 0x72, 0x31, 0xbf, 0x07, 0xb5, 0xd3, 0xe0, 0xbf, 0x71, 0x63, 0xc9, 0x7a, 0x1d, 0xf0, 0x98, 0x83, 0x92, 0x85, 0x98, 0xe9, 0xaa, 0xfc, 0xcc, 0x55, 0x28, 0xdd, 0x12, 0x26, 0xe6, 0xba, 0xab, 0x62, 0x89, 0x5a, 0x58, 0x08, 0xad, 0x93, 0x44, 0xad, 0xda, 0xcf, 0x48, 0xc1, 0x8e, 0xb5, 0x83, 0x39, 0xf6, 0xe7, 0x24, 0x74, 0x82, 0xaf, 0x95, 0x7a, 0xa7, 0xc7, 0x70, 0xcc, 0xc6, + 0x26, 0xe4, 0xfe, 0x26, 0x55, 0x48, 0xad, 0xd0, 0xee, 0x89, 0xf4, 0x49, 0xa1, 0x07, 0x0b, 0x86, 0x98, 0x90, 0x51, 0xcd, 0x72, 0xcb, 0x70, 0xe2, 0xf4, 0xe1, 0xd9, 0x47, 0xca, 0xe9, 0xb0, 0xa1, 0x66, 0x94, 0x34, 0x81, 0x56, 0xf3, 0x2a, 0xdd, 0xb4, 0x07, 0x55, 0xdb, 0xb9, 0x7d, 0xc8, 0xe7, 0x30, 0x7c, 0x84, 0xa7, 0xa3, 0x25, 0x71, 0x2b, 0x6f, 0xd3, 0xd1, 0x2a, 0x9a, 0x22, 0x28, 0x58, 0x15, 0x06, 0xdb, 0x5a, 0xfb, 0x5f, 0x2c, 0x61, 0xfd, 0x76, 0xc9, 0x7d, 0xa8, 0xad, 0x43, 0xff, 0xf8, 0xcf, 0x71, 0xf7, 0x83, 0x29, 0xcb, 0x24, 0x5d, 0x0c, 0x74, 0x02, 0x2d, 0xec, 0x35, 0xec, 0x3e, 0xaf, 0x6d, 0xa9, 0x5a, 0xb3, 0x42, 0x31, 0x23, 0x38, 0x79, 0x77, 0x40, 0xb7, 0xb3, 0x74, 0xf7, 0xf0, 0xaa, 0xed, 0xf8, 0x91, 0x60, 0x1b, 0xeb, 0x43, 0x88, 0x6e, 0x48, 0x86, 0xcc, 0x64, 0xf6, 0xa7, 0xad, 0xa1, 0x48, 0xb1, 0x83, 0xe4, 0x3e, 0xb4, 0xf8, 0x63, 0xeb, 0x6e, 0x52, 0x53, 0xd4, 0x99, 0x52, 0x63, 0x23, 0x35, 0xe7, 0x90, 0x5a, 0xeb, 0x2e, 0xa5, 0x55, 0x50, 0xf0, 0x14, 0xc4, 0xa4, 0x93, 0xbe, 0xd7, 0xeb, 0xf9, 0x24, 0x63, 0x71, 0x81, 0x24, 0xd3, 0x49, 0xa1, 0x09, 0x56, 0xc2, 0x3c, 0xf7, 0xe1, 0xf0, 0x91, 0x52, 0x09, 0xb6, 0xf8, 0x96, 0xe6, 0xb0, 0x77, 0x5d, 0xd2, 0x81, 0x92, 0x66, 0x4d, 0x2b, 0x8b, 0x6e, 0xd6, 0x56, 0x86, 0x5c, 0xf8, 0xbc, 0x6c, 0xb4, 0x14, 0x9c, 0x29, 0x30, 0x2d, 0xfd, 0x58, 0x8b, 0xbd, 0x01, 0x89, 0xd3, 0xe8, 0xfd, 0x80, 0x2e, 0x10, 0x93, 0x25, 0x0f, 0x42, 0xcf, 0x36, 0x8a, 0xd8, 0xef, 0xa7, 0xe1, 0xcd, 0x67, 0xde, 0xef, 0xfe, 0x2e, 0xe4, 0xa3, 0x20, 0x07, 0x10, 0xb9, 0xfb, 0xa4, 0x7a, 0x5c, 0x21, 0xe6, 0x77, 0x75, + 0x75, 0x94, 0x13, 0x3c, 0x5e, 0xb9, 0xe4, 0xb8, 0xfd, 0xa3, 0x77, 0xb5, 0x44, 0x30, 0x8f, 0x24, 0x77, 0x22, 0x16, 0xb8, 0x0c, 0x96, 0x81, 0x9d, 0xe3, 0xe1, 0xc1, 0x68, 0xa3, 0x98, 0x1f, 0xcd, 0x10, 0x93, 0x38, 0x85, 0x17, 0x12, 0x4f, 0xc6, 0x14, 0xd3, 0x3f, 0xdd, 0x9c, 0xde, 0x75, 0xd5, 0xac, 0xf1, 0x4a, 0xbd, 0x32, 0xcd, 0x45, 0xb5, 0x81, 0xca, 0x3e, 0x97, 0x3c, 0x7f, 0xea, 0xfc, 0x6a, 0x8a, 0xbc, 0x6c, 0xe3, 0x70, 0x5e, 0xc4, 0xaa, 0x0f, 0xc4, 0x18, 0xb6, 0xea, 0xb3, 0xa4, 0x9e, 0x9b, 0x57, 0x41, 0xf3, 0x72, 0xe4, 0x11, 0xc0, 0xd8, 0x52, 0x61, 0xde, 0x0f, 0x7a, 0x89, 0x9e, 0x5f, 0xd6, 0x21, 0x60, 0x3c, 0x8d, 0x49, 0x3f, 0x2a, 0xfe, 0xb8, 0xc2, 0xb1, 0x70, 0x1b, 0x84, 0x84, 0x0d, 0xb9, 0xff, 0xd1, 0x67, 0x90, 0x46, 0x99, 0xe5, 0x23, 0xc0, 0x04, 0x9a, 0x06, 0x02, 0x56, 0xf3, 0x5d, 0xfd, 0xf9, 0x00, 0xb7, 0x28, 0xba, 0x06, 0x4e, 0x47, 0x86, 0xfe, 0x0a, 0x7b, 0x70, 0xcf, 0x25, 0xd5, 0x52, 0xfe, 0xb0, 0x20, 0x3b, 0x62, 0x0a, 0x65, 0x03, 0x90, 0x81, 0xa4, 0x19, 0x4d, 0xe4, 0xfb, 0x4d, 0xe2, 0x36, 0x10, 0x37, 0x1b, 0xda, 0xb4, 0x80, 0x1d, 0xf2, 0xd4, 0x0f, 0x43, 0x6d, 0x90, 0xa1, 0xb4, 0x4f, 0x35, 0xdd, 0x0f, 0xf2, 0x91, 0xff, 0xc6, 0x9b, 0x69, 0xe0, 0x69, 0x66, 0xdb, 0x55, 0x68, 0x2c, 0xd9, 0x84, 0x92, 0x67, 0x9f, 0x3b, 0xfc, 0x0b, 0x68, 0xb9, 0xfa, 0x9f, 0x06, 0xdf, 0xef, 0x79, 0x68, 0x5e, 0x96, 0xe5, 0xd2, 0x1d, 0xd6, 0xe4, 0xc8, 0x05, 0x62, 0x34, 0x67, 0x47, 0x9c, 0x12, 0xe2, 0x05, 0x2e, 0x40, 0x78, 0x33, 0x2d, 0xe7, 0x10, 0x4f, 0x5c, 0xaa, 0xc1, 0x1c, 0x2d, 0xf5, 0x03, 0x94, 0x9f, 0x10, 0xd2, 0xc1, 0x2c, 0x59, + 0xd5, 0x5e, 0x94, 0xa6, 0xc5, 0x95, 0xfa, 0xfb, 0xfe, 0xcd, 0x2b, 0xaf, 0x71, 0xc7, 0x62, 0x51, 0x7f, 0x5e, 0x47, 0xf4, 0xe2, 0xc5, 0xa0, 0x84, 0xbb, 0x2d, 0xde, 0xa2, 0xf8, 0x2a, 0x77, 0xe5, 0x71, 0xd8, 0x9f, 0x8e, 0xe5, 0x3d, 0x02, 0x6a, 0x7e, 0x2b, 0xae, 0x7b, 0x4a, 0x9e, 0x5b, 0xa2, 0x03, 0x0e, 0xd7, 0xe8, 0x59, 0x7e, 0x7c, 0x13, 0xab, 0xe4, 0x59, 0x75, 0x18, 0x26, 0xa2, 0x12, 0x84, 0xca, 0xad, 0xa4, 0xa0, 0x4c, 0xd1, 0x38, 0xa5, 0x55, 0xbe, 0xb1, 0x3f, 0x71, 0xac, 0x72, 0x3e, 0x71, 0xe7, 0x02, 0x9a, 0x93, 0xaa, 0x70, 0xeb, 0xec, 0xe4, 0xcf, 0x3e, 0x1c, 0xd6, 0xa3, 0x25, 0xd3, 0x61, 0x3d, 0xa8, 0x9e, 0xc1, 0x87, 0x16, 0xda, 0x98, 0x76, 0x3e, 0x1a, 0xd1, 0x48, 0xae, 0x6b, 0xfa, 0xde, 0x44, 0xe1, 0xdd, 0xea, 0xdb, 0xc0, 0x6a, 0xb5, 0xe9, 0xce, 0x83, 0x8e, 0xed, 0x8b, 0x20, 0xd5, 0x09, 0x02, 0x31, 0x7d, 0x53, 0x28, 0x2c, 0xef, 0x70, 0x59, 0xba, 0xde, 0x6c, 0xde, 0x40, 0x5d, 0xfd, 0xfe, 0xc4, 0xd7, 0x50, 0x48, 0xf0, 0x84, 0xd1, 0xa6, 0xc7, 0xbd, 0xb8, 0xe2, 0xdf, 0xae, 0x77, 0x7c, 0x13, 0x41, 0xef, 0x37, 0x2b, 0xae, 0x4d, 0xbe, 0xf7, 0xf4, 0xc9, 0x7b, 0x70, 0x28, 0xa9, 0x95, 0x31, 0x3c, 0xc4, 0x58, 0x44, 0xb6, 0xe2, 0x7a, 0xcf, 0x3b, 0x43, 0x50, 0x40, 0x17, 0xcf, 0xfb, 0xe8, 0x49, 0x5b, 0x28, 0x72, 0x66, 0x27, 0x6f, 0xfc, 0x85, 0x7c, 0x5f, 0x8e, 0xb5, 0x1a, 0x01, 0xf5, 0x92, 0xce, 0x36, 0x74, 0xa6, 0x7a, 0x5b, 0x78, 0xe4, 0x6a, 0xa1, 0x0a, 0x70, 0x9a, 0x6b, 0xe1, 0x55, 0xda, 0x89, 0x99, 0xca, 0x98, 0x2a, 0xb9, 0x1e, 0x25, 0x86, 0x3f, 0x78, 0x68, 0x77, 0x4c, 0x3e, 0xd4, 0xd9, 0x97, 0x0c, 0x47, 0x4b, 0xec, 0xae, + 0xf9, 0x16, 0x35, 0xfc, 0x8c, 0x97, 0xa2, 0xa2, 0x74, 0x9d, 0x15, 0xf5, 0xb5, 0xdb, 0x19, 0xbc, 0x3e, 0x04, 0x99, 0x4a, 0x31, 0xb2, 0x2c, 0x21, 0x9d, 0x36, 0x02, 0x5e, 0x56, 0x03, 0x7e, 0x30, 0x1a, 0x56, 0x4d, 0xce, 0x75, 0x23, 0x8f, 0xa7, 0x00, 0xa5, 0x33, 0x0f, 0x7f, 0x9b, 0x96, 0x66, 0x7e, 0x90, 0xac, 0x0c, 0xd6, 0xfc, 0xa5, 0x51, 0xd1, 0x3b, 0x66, 0xf6, 0x7d, 0x47, 0xb8, 0xe7, 0xf9, 0x21, 0x94, 0x96, 0xdd, 0xb9, 0x94, 0xc5, 0x58, 0x57, 0xb1, 0x8c, 0x87, 0x6e, 0x98, 0x84, 0xf3, 0x00, 0x50, 0x80, 0x45, 0x9f, 0x71, 0xef, 0xef, 0xa7, 0x08, 0xd2, 0x9e, 0xa1, 0xf8, 0x3a, 0x6f, 0x83, 0xb8, 0x8b, 0x42, 0x73, 0x0a, 0x8e, 0x2b, 0xca, 0x5e, 0x2a, 0x17, 0x83, 0x26, 0x60, 0x46, 0xef, 0x27, 0x82, 0x38, 0x84, 0xbe, 0x53, 0x03, 0x44, 0x27, 0x6a, 0x8d, 0xf6, 0x44, 0xa4, 0x93, 0x33, 0xad, 0x23, 0x80, 0xc9, 0x3d, 0x1d, 0xd8, 0x3d, 0xa7, 0xfc, 0x0d, 0x90, 0xd2, 0x8e, 0xc8, 0xc7, 0xbb, 0xb6, 0x0f, 0x97, 0xfe, 0x6e, 0x4a, 0x77, 0x1a, 0xad, 0x6c, 0x9d, 0xa1, 0xa1, 0x3a, 0x88, 0x3f, 0x2b, 0x95, 0x85, 0xdf, 0xe0, 0x0f, 0x37, 0x7b, 0x4c, 0x69, 0x15, 0x3d, 0x06, 0xbb, 0xca, 0x08, 0x9b, 0x48, 0x94, 0x04, 0x39, 0xf8, 0x4e, 0x76, 0x22, 0xff, 0x4f, 0x80, 0x52, 0xc9, 0xb9, 0x06, 0x36, 0x69, 0xdb, 0x73, 0xae, 0x22, 0xcf, 0xfc, 0xf4, 0x04, 0xf9, 0x37, 0x8e, 0xc6, 0xd8, 0x1e, 0xf2, 0x38, 0xdd, 0x57, 0x45, 0x13, 0x56, 0x13, 0x39, 0x12, 0xfb, 0x38, 0xdf, 0xe4, 0x19, 0x65, 0x05, 0x23, 0x32, 0x40, 0xf8, 0x74, 0x3c, 0xc3, 0xcf, 0xf1, 0x52, 0x49, 0xa3, 0xc7, 0xf3, 0x77, 0x28, 0x82, 0x35, 0xaf, 0x40, 0x9f, 0xcc, 0x1f, 0x06, 0x57, 0x29, 0xa2, 0x75, + 0xb8, 0x96, 0xa4, 0xcf, 0x19, 0x49, 0x5a, 0xd9, 0x28, 0x56, 0x00, 0xab, 0x11, 0x37, 0xbd, 0x3b, 0x3c, 0xb5, 0x83, 0xcf, 0xfd, 0xdc, 0x8f, 0xe0, 0xc2, 0xec, 0x8c, 0x21, 0xa3, 0xd0, 0xa8, 0x36, 0xc2, 0x27, 0x17, 0x17, 0x36, 0x0a, 0x8e, 0xe1, 0xf1, 0xf6, 0x47, 0xaa, 0x30, 0x4a, 0xad, 0xcd, 0x00, 0x1d, 0x50, 0xf7, 0xe2, 0x40, 0xc6, 0xa2, 0xd6, 0x26, 0x8d, 0x0b, 0x5b, 0xbc, 0x71, 0x43, 0xa4, 0x4b, 0x65, 0x90, 0x42, 0x72, 0x7d, 0xd9, 0x4a, 0x66, 0xeb, 0xec, 0x3f, 0x81, 0x75, 0x16, 0x7d, 0xec, 0xc9, 0x34, 0xb8, 0x28, 0x56, 0x82, 0x8a, 0xb5, 0x5e, 0x4c, 0xa0, 0xbe, 0x56, 0x6c, 0xb0, 0x7e, 0x90, 0xa2, 0xba, 0x89, 0xbf, 0xc7, 0x5c, 0xda, 0xf0, 0x68, 0x8b, 0xc8, 0xf8, 0xa1, 0x09, 0x9b, 0x27, 0x89, 0xef, 0xfb, 0x6f, 0xb5, 0xaf, 0x31, 0x69, 0xd4, 0x6b, 0x72, 0xd7, 0x41, 0x38, 0x61, 0xec, 0x80, 0x08, 0x5e, 0xd5, 0xe7, 0x49, 0x1a, 0x8e, 0x61, 0xfc, 0x73, 0x41, 0xba, 0x51, 0x62, 0x0c, 0x71, 0x67, 0x2d, 0x4f, 0x84, 0x44, 0xce, 0x9d, 0xc9, 0x40, 0x04, 0xca, 0x0a, 0xca, 0xd4, 0xbc, 0xfa, 0xa9, 0x1f, 0xfb, 0x5e, 0xe2, 0x97, 0x70, 0xfa, 0x9a, 0x7b, 0x8f, 0x9c, 0x7d, 0x66, 0x25, 0x11, 0xae, 0x7a, 0x72, 0xc5, 0x9e, 0x0b, 0x7f, 0xf6, 0xf4, 0x36, 0x79, 0xc2, 0x0d, 0xf0, 0x82, 0x9a, 0x75, 0xaa, 0x3b, 0x8f, 0x8f, 0x62, 0xdf, 0x35, 0x14, 0x82, 0x5b, 0xa0, 0x6c, 0x9b, 0xa3, 0xf2, 0xcd, 0xb2, 0x43, 0x26, 0x4c, 0x70, 0x86, 0x42, 0xe2, 0x2f, 0xe3, 0xfa, 0x35, 0x57, 0x70, 0xa5, 0x2f, 0xdc, 0x22, 0x25, 0xdc, 0xf3, 0xef, 0xc1, 0x83, 0x3c, 0xda, 0x39, 0x3b, 0x23, 0x9b, 0x6b, 0xab, 0xa7, 0x51, 0x35, 0x4b, 0xbd, 0xef, 0xa5, 0x76, 0x28, 0x22, 0x91, + 0xd6, 0x3b, 0x83, 0x34, 0x74, 0xec, 0xff, 0x19, 0x02, 0xb7, 0x8b, 0x48, 0x70, 0xac, 0x32, 0x0d, 0x03, 0x3d, 0x5d, 0x20, 0xa3, 0x74, 0x98, 0xe7, 0xb5, 0x68, 0x8a, 0xf0, 0xf2, 0x7f, 0xeb, 0x31, 0xa2, 0x00, 0x52, 0xa9, 0x93, 0xa0, 0x03, 0x8a, 0xe6, 0x61, 0x43, 0x3c, 0x72, 0x9f, 0x84, 0xc1, 0x4f, 0xaf, 0x6c, 0x1f, 0xbf, 0x21, 0x96, 0xb0, 0x31, 0x81, 0x2e, 0xbf, 0x17, 0x7c, 0x98, 0x04, 0x41, 0x87, 0xd4, 0xf9, 0xc9, 0x17, 0x10, 0x8b, 0x66, 0xba, 0x92, 0x48, 0x29, 0x7f, 0x93, 0x99, 0x33, 0x7c, 0x6d, 0x11, 0xf2, 0x1d, 0x0d, 0x78, 0xbb, 0xe5, 0xe9, 0x2b, 0x6b, 0x82, 0x1a, 0x1a, 0xb5, 0x12, 0x42, 0x38, 0x64, 0x95, 0x72, 0x9c, 0x8d, 0xec, 0x65, 0x9f, 0x12, 0xdc, 0x87, 0x0f, 0x11, 0x20, 0x87, 0x65, 0x81, 0x37, 0x5f, 0x8c, 0x7d, 0xe6, 0x38, 0x42, 0xe4, 0x51, 0xa3, 0xc4, 0x06, 0xa9, 0x2f, 0x66, 0x82, 0xf3, 0x3e, 0x10, 0xf4, 0x78, 0xa1, 0x08, 0x31, 0x26, 0x63, 0xfa, 0x8c, 0x3e, 0x29, 0x8a, 0x9d, 0x4e, 0x6b, 0x8c, 0x7f, 0xd5, 0x74, 0x32, 0x28, 0xcb, 0xca, 0xb3, 0x79, 0xda, 0xc1, 0x9a, 0x9e, 0xf4, 0xea, 0x7f, 0x2d, 0x65, 0x20, 0xd9, 0x9e, 0xa3, 0x9e, 0x05, 0x04, 0x99, 0x1d, 0x22, 0x70, 0xb3, 0x45, 0x55, 0x0f, 0x2f, 0x0b, 0xb2, 0x8f, 0x7a, 0x6a, 0xfb, 0x5e, 0xd5, 0x4e, 0x7c, 0x38, 0xee, 0xb0, 0x66, 0xef, 0xf2, 0x3e, 0xd8, 0xb7, 0x51, 0xa0, 0xad, 0x12, 0xde, 0x86, 0xf6, 0x3b, 0x15, 0xbe, 0x97, 0x96, 0x1b, 0x7c, 0x3c, 0x42, 0x55, 0x3b, 0xd9, 0xa1, 0xe0, 0x95, 0x86, 0xf8, 0xbf, 0x61, 0xc5, 0x74, 0x25, 0xfd, 0x6e, 0x73, 0x4e, 0x40, 0xd1, 0x83, 0x3e, 0x4e, 0x70, 0x5b, 0x78, 0x14, 0x58, 0xd2, 0x20, 0x1d, 0x8c, 0x72, 0x32, 0x9e, 0x3a, + 0xeb, 0x3c, 0xff, 0x80, 0x45, 0x49, 0x6a, 0x39, 0x9b, 0xd3, 0xb2, 0x5b, 0xe7, 0x24, 0xcb, 0x98, 0xc0, 0x6d, 0x2f, 0x24, 0xd1, 0x27, 0x95, 0x81, 0x29, 0x24, 0x2c, 0xd8, 0x7c, 0xf8, 0x05, 0x7b, 0x96, 0xb3, 0xfc, 0xe9, 0x88, 0xc6, 0xb4, 0xdd, 0xe5, 0x21, 0xf6, 0x61, 0xa2, 0x1d, 0x24, 0x86, 0xbe, 0x69, 0xda, 0x7e, 0xec, 0xcc, 0xa9, 0xad, 0x35, 0x8f, 0x1c, 0x1e, 0x2b, 0xe8, 0xd0, 0x21, 0x9c, 0x01, 0x2d, 0x50, 0xc9, 0x79, 0xad, 0x7b, 0xd4, 0x8d, 0xa8, 0xe2, 0xc7, 0x2b, 0x26, 0xd2, 0xac, 0x0e, 0xbd, 0xcd, 0xaa, 0x65, 0x64, 0x33, 0xa5, 0x66, 0x18, 0x0e, 0x33, 0x41, 0x4a, 0x0a, 0xf9, 0x24, 0xae, 0x7a, 0xf0, 0x78, 0x67, 0x24, 0x59, 0x36, 0xec, 0x62, 0x94, 0x4a, 0xae, 0xec, 0xac, 0x4b, 0xb5, 0x4b, 0x89, 0x72, 0xcd, 0xa5, 0xad, 0xc7, 0x43, 0x89, 0xf9, 0xae, 0x66, 0xfb, 0xc9, 0xd6, 0xf6, 0x56, 0x3b, 0x2a, 0x5a, 0x01, 0xed, 0x5f, 0x46, 0x7e, 0xe1, 0x12, 0x99, 0xe7, 0x39, 0x0d, 0xd2, 0xd5, 0x6a, 0xc4, 0xc5, 0x8a, 0xd7, 0xc4, 0x78, 0x53, 0xea, 0x1b, 0x90, 0xd8, 0x64, 0xdd, 0xa8, 0x7c, 0x7a, 0xe4, 0x8a, 0x4f, 0x37, 0xaf, 0x8c, 0x3a, 0xe5, 0x3a, 0x45, 0xc9, 0xe6, 0x22, 0xd7, 0xa6, 0xe5, 0x59, 0x80, 0x40, 0xc3, 0x04, 0x50, 0x71, 0x84, 0x0d, 0xf9, 0x6c, 0xda, 0x3e, 0xd3, 0x97, 0x8b, 0xf1, 0xd6, 0x14, 0x50, 0x78, 0x39, 0x00, 0x42, 0xab, 0xd8, 0xc9, 0xb6, 0xd0, 0x1c, 0xb3, 0x62, 0xd2, 0xd6, 0x06, 0xa8, 0x25, 0xbc, 0x58, 0x9d, 0xbf, 0x65, 0x48, 0x43, 0x4b, 0x65, 0x53, 0x62, 0xd4, 0xc1, 0x64, 0xad, 0x9b, 0x4a, 0x84, 0xc7, 0x15, 0x20, 0x62, 0x3d, 0x9a, 0x15, 0x83, 0x2f, 0xe1, 0xc6, 0x4a, 0x30, 0x50, 0x7a, 0x83, 0x1b, 0x88, 0x4b, 0x93, + 0xd6, 0x0f, 0x89, 0xc4, 0xf7, 0xf3, 0x74, 0x76, 0xa1, 0xca, 0x80, 0x62, 0x79, 0x37, 0x64, 0xdb, 0xc7, 0xd5, 0xcd, 0x4b, 0x33, 0x5b, 0x8a, 0x3b, 0x50, 0x4c, 0x2c, 0x08, 0x7d, 0x4a, 0x90, 0x99, 0xdc, 0xf9, 0x9e, 0x76, 0xee, 0xc2, 0xd0, 0x28, 0x24, 0x00, 0xdc, 0x0c, 0x9a, 0x98, 0xf0, 0x27, 0xf9, 0xd3, 0x57, 0xa2, 0x2b, 0xb5, 0x8e, 0x88, 0x51, 0x4b, 0xf1, 0xfc, 0xad, 0x97, 0x0d, 0x42, 0x23, 0x5d, 0x1f, 0x86, 0xda, 0xbc, 0x9d, 0x4e, 0xd0, 0x61, 0xb6, 0x2f, 0x54, 0x42, 0x03, 0x25, 0xff, 0x4b, 0xdf, 0xff, 0x3e, 0x97, 0xc9, 0x4e, 0xba, 0x48, 0xcc, 0x3d, 0x58, 0x2c, 0x17, 0x67, 0x57, 0x34, 0xef, 0x66, 0x12, 0xce, 0x83, 0x58, 0x8e, 0xab, 0x65, 0x9a, 0xd1, 0xc6, 0x32, 0xd8, 0xfb, 0x9d, 0xc2, 0x84, 0xd9, 0x3f, 0xb2, 0x8e, 0x38, 0xc4, 0x0a, 0xb2, 0xc0, 0x48, 0x88, 0xdd, 0x70, 0x3a, 0x94, 0x43, 0x58, 0x48, 0xf6, 0x90, 0x08, 0xca, 0xff, 0xc6, 0xbe, 0xf4, 0xff, 0xf7, 0xa5, 0x91, 0x74, 0x33, 0xbd, 0x43, 0xd5, 0xda, 0x69, 0xa1, 0x47, 0x74, 0x67, 0x78, 0xdf, 0xa3, 0x57, 0x33, 0x62, 0xd6, 0x07, 0x55, 0x9e, 0x7b, 0xc4, 0x69, 0x75, 0x4d, 0x1a, 0x56, 0xf2, 0x30, 0xdd, 0x51, 0x87, 0x22, 0x4a, 0x38, 0x77, 0xac, 0xe9, 0xc8, 0xe5, 0x55, 0xdc, 0x06, 0xb2, 0x2a, 0xb6, 0x80, 0xb5, 0xc8, 0xd7, 0x1d, 0x04, 0xd8, 0xdd, 0x43, 0xc1, 0xcc, 0x81, 0xb5, 0x7c, 0x15, 0xd4, 0x21, 0x2a, 0x23, 0xe9, 0xbd, 0x4a, 0xab, 0x59, 0xc9, 0x25, 0xfe, 0x2b, 0xb8, 0x00, 0x20, 0xe2, 0x95, 0xb3, 0xfe, 0xa2, 0xc2, 0x5a, 0x1c, 0x78, 0x9d, 0x39, 0xbe, 0x21, 0xfe, 0x8f, 0xfa, 0x74, 0xf2, 0x90, 0x23, 0xe0, 0x30, 0xd1, 0xc4, 0x10, 0x2d, 0xcb, 0x90, 0x94, 0x03, 0xe3, 0xcc, + 0x50, 0xa2, 0x2d, 0xea, 0x6e, 0x84, 0x43, 0xfc, 0xbf, 0x74, 0x84, 0x6d, 0xaa, 0x7f, 0x97, 0x46, 0x60, 0xb4, 0x26, 0xf1, 0x3a, 0x42, 0x2d, 0x21, 0xb7, 0xa2, 0x3d, 0x81, 0x7d, 0xe8, 0x92, 0x34, 0x5f, 0x30, 0x7b, 0x51, 0xeb, 0x05, 0x70, 0x8f, 0xd3, 0x1d, 0x2e, 0x5b, 0x0c, 0xb8, 0x72, 0x4e, 0x58, 0x5b, 0x47, 0xc2, 0x5c, 0xdf, 0x5c, 0x4e, 0x58, 0xde, 0x1d, 0xe9, 0x51, 0xe5, 0x2b, 0x58, 0x66, 0x64, 0x21, 0xee, 0x8f, 0x0d, 0x30, 0x6a, 0xed, 0x5a, 0x55, 0xa4, 0x51, 0x99, 0x55, 0x3d, 0x55, 0x28, 0x0f, 0xe7, 0x46, 0x7a, 0x5e, 0x49, 0x76, 0xdb, 0xa8, 0x9b, 0xde, 0x01, 0x9a, 0x13, 0x0e, 0x49, 0x10, 0xc7, 0xd4, 0xc8, 0xd4, 0xc5, 0xb4, 0x49, 0xdd, 0x74, 0xc8, 0x24, 0x37, 0x4e, 0xfa, 0x09, 0xcb, 0x9c, 0x70, 0x7f, 0xab, 0xe9, 0xf2, 0x2e, 0xc3, 0x33, 0x0d, 0xcc, 0x79, 0xbb, 0x64, 0x94, 0x6e, 0xe9, 0xcf, 0xcb, 0x0a, 0x85, 0x9a, 0xbb, 0x4a, 0x87, 0x8b, 0xcb, 0x63, 0x6f, 0xad, 0x5e, 0x1a, 0x85, 0xd1, 0x0c, 0x7c, 0xbd, 0x1f, 0x76, 0xad, 0x26, 0x96, 0xb6, 0x33, 0xce, 0xce, 0xde, 0x50, 0x51, 0x30, 0x44, 0x78, 0x57, 0xdb, 0x89, 0xe2, 0x13, 0x5a, 0x91, 0x61, 0xbc, 0x0b, 0xc0, 0xf1, 0x74, 0x27, 0xcc, 0xeb, 0x64, 0xaa, 0x29, 0xf9, 0x59, 0x3b, 0x53, 0xd5, 0x4f, 0x03, 0x78, 0xab, 0xf6, 0xb5, 0x73, 0x1a, 0xcc, 0x17, 0x1b, 0xee, 0x41, 0x82, 0x0b, 0x54, 0x61, 0x66, 0x30, 0x01, 0xcd, 0x4c, 0x6f, 0xfb, 0x96, 0xd9, 0x8b, 0x72, 0x70, 0x6c, 0xec, 0xbd, 0x14, 0x7d, 0x58, 0xce, 0x7e, 0xaa, 0xad, 0xa0, 0x9e, 0xba, 0x79, 0xed, 0x73, 0x56, 0x46, 0xcb, 0x38, 0x9c, 0xf9, 0x10, 0x67, 0x84, 0xd5, 0x6c, 0xd9, 0x22, 0x9c, 0x55, 0x22, 0x0f, 0xe6, 0xad, 0x86, + 0xf9, 0xbc, 0xb9, 0xb1, 0x43, 0x93, 0x1e, 0x3a, 0xa4, 0xf0, 0x70, 0x8b, 0xf0, 0xbd, 0x5d, 0xb2, 0x09, 0x3c, 0xf9, 0xa0, 0xc8, 0xb9, 0x3e, 0xfd, 0xef, 0x10, 0x22, 0x0c, 0x44, 0x28, 0x82, 0x75, 0xcf, 0xbe, 0x24, 0xb5, 0x10, 0x3a, 0x56, 0x56, 0x0d, 0x66, 0x5f, 0x92, 0x13, 0xc2, 0xd7, 0x02, 0xc6, 0x65, 0x75, 0xf2, 0xea, 0x43, 0x8c, 0xa1, 0x16, 0x13, 0xe0, 0x94, 0xfa, 0xce, 0x34, 0xaf, 0xf5, 0x15, 0xa2, 0x63, 0x5b, 0x99, 0x90, 0x21, 0xdf, 0x0d, 0x6f, 0x82, 0x4b, 0xde, 0xe3, 0x29, 0x81, 0x71, 0x5b, 0xee, 0x0c, 0x83, 0x48, 0x43, 0xa8, 0x26, 0x6b, 0x65, 0xe0, 0xc4, 0xce, 0x09, 0xbb, 0xba, 0x94, 0x05, 0x86, 0xb2, 0xde, 0x9c, 0x21, 0x07, 0xa3, 0xaf, 0x73, 0x6a, 0x94, 0x77, 0x1d, 0xbd, 0xde, 0x5f, 0xbc, 0x9d, 0x8a, 0x99, 0x9e, 0x74, 0x7a, 0xd2, 0x7e, 0xf1, 0x2f, 0x24, 0x03, 0xdb, 0xda, 0x00, 0x0b, 0xb2, 0xab, 0x59, 0x6d, 0x87, 0x99, 0xf4, 0x22, 0xfd, 0xb4, 0xb9, 0x11, 0x23, 0x91, 0xdb, 0x09, 0xae, 0xdf, 0xe4, 0x6d, 0x8e, 0xec, 0xc1, 0x99, 0xbf, 0x24, 0x50, 0xbf, 0xb5, 0x3b, 0xf5, 0x2f, 0x30, 0xd5, 0x79, 0x4a, 0xa0, 0x5d, 0xff, 0x52, 0x46, 0x00, 0x1e, 0x11, 0x16, 0x1e, 0xa0, 0x77, 0x25, 0x4a, 0xd6, 0xb5, 0xf5, 0x67, 0x1d, 0x97, 0x7c, 0xc7, 0xd8, 0x0a, 0x3f, 0xe2, 0x77, 0x31, 0xe0, 0x69, 0x33, 0x1a, 0x29, 0xd3, 0x6d, 0x6e, 0x1c, 0xf9, 0x5c, 0x97, 0x48, 0xb1, 0x33, 0xcb, 0x4c, 0x1d, 0x0a, 0xd3, 0xdc, 0xeb, 0x73, 0xfb, 0xee, 0xe8, 0xf1, 0xca, 0xc8, 0x55, 0x4e, 0xbd, 0x4a, 0x22, 0x25, 0xc8, 0xb2, 0x84, 0x0c, 0x76, 0x7f, 0x7c, 0xda, 0xd1, 0xe6, 0x2d, 0x3f, 0x58, 0x5b, 0x80, 0x76, 0x04, 0xe5, 0xf6, 0x3a, 0x71, 0x60, 0x28, 0x56, + 0x62, 0x26, 0xc2, 0xf6, 0x04, 0x25, 0xcd, 0xed, 0x5d, 0x22, 0xd7, 0x91, 0x41, 0x0c, 0x0f, 0x88, 0x6d, 0xd4, 0xdb, 0x80, 0x2a, 0xad, 0xf2, 0x69, 0x56, 0x80, 0x39, 0xdd, 0x5f, 0xa0, 0xfe, 0x61, 0xf6, 0x4b, 0xb4, 0x69, 0x58, 0x57, 0xdf, 0x65, 0x63, 0x51, 0x80, 0x7b, 0x82, 0x73, 0x94, 0x21, 0xe0, 0xaa, 0x67, 0x9c, 0x89, 0xa3, 0x3c, 0x2c, 0x79, 0x97, 0xec, 0x39, 0xdb, 0xdf, 0x72, 0x9b, 0x5e, 0xe7, 0xd4, 0xb5, 0xa8, 0x29, 0x20, 0x22, 0x30, 0xdb, 0x45, 0x8b, 0x41, 0x23, 0xf4, 0x7c, 0x1b, 0x74, 0xf9, 0x48, 0x92, 0x57, 0xa0, 0x3b, 0x84, 0x51, 0xd9, 0x00, 0x7d, 0xf8, 0xa4, 0x06, 0xbc, 0xa0, 0x19, 0x55, 0xeb, 0xa9, 0x18, 0x93, 0x46, 0x84, 0xae, 0x8b, 0x11, 0xed, 0xe1, 0xad, 0x25, 0xc9, 0xb1, 0x14, 0x03, 0x38, 0x41, 0x61, 0xa4, 0x19, 0xd7, 0xfb, 0x50, 0xc5, 0x43, 0xa4, 0x6a, 0xff, 0x4f, 0xd7, 0xfa, 0xc9, 0xf8, 0x1a, 0x69, 0x1e, 0xba, 0x78, 0x30, 0x71, 0x30, 0xd2, 0xa3, 0x63, 0x72, 0x11, 0xee, 0xd1, 0xb7, 0xad, 0xdd, 0x65, 0x1a, 0x6a, 0x68, 0x3b, 0x53, 0x27, 0x3d, 0x2e, 0xc9, 0x28, 0x32, 0xa2, 0x66, 0xc5, 0x4e, 0xea, 0x27, 0xe4, 0x1a, 0x82, 0x5e, 0x07, 0xd6, 0x8b, 0x2b, 0x80, 0xea, 0x99, 0x02, 0x46, 0x72, 0x74, 0x77, 0x1a, 0xe3, 0x04, 0x53, 0xc5, 0xc7, 0xbe, 0x41, 0x42, 0x76, 0xee, 0x8a, 0x2e, 0x0a, 0x09, 0x7c, 0x96, 0xfb, 0x2d, 0x58, 0x68, 0x29, 0x5f, 0x68, 0x16, 0x16, 0x60, 0x2d, 0x61, 0x04, 0x7f, 0x4a, 0x68, 0x32, 0xfe, 0x22, 0x7c, 0xe5, 0xba, 0x27, 0xbb, 0xfa, 0x9f, 0xc4, 0xeb, 0x05, 0xcc, 0xb5, 0x96, 0xb9, 0xab, 0x59, 0x30, 0x1a, 0x68, 0x5c, 0x60, 0x9e, 0x86, 0x68, 0xf2, 0xe5, 0xae, 0x9c, 0x93, 0xa0, 0xf0, 0x78, 0x36, + 0x44, 0x81, 0x16, 0x7f, 0xd7, 0x8b, 0xdb, 0x40, 0xfa, 0x8b, 0x34, 0x22, 0xc3, 0xcd, 0xc3, 0x69, 0xa8, 0x1e, 0xd4, 0x83, 0xa9, 0xe1, 0x4a, 0xa4, 0xf3, 0x8b, 0x93, 0x06, 0xaf, 0xe0, 0x37, 0x4a, 0x88, 0x45, 0x0f, 0x3c, 0xf4, 0x47, 0xd6, 0x34, 0x87, 0x34, 0x14, 0xa5, 0xbb, 0x67, 0xde, 0xb9, 0xa8, 0xd8, 0xba, 0xf7, 0xd9, 0x3a, 0xea, 0xb5, 0xef, 0x88, 0x9a, 0xf8, 0x71, 0x4d, 0x4b, 0xa9, 0x15, 0xd7, 0x8f, 0x42, 0x83, 0x6f, 0xcd, 0x14, 0xfc, 0x67, 0x4c, 0xbe, 0xff, 0xd6, 0x4b, 0x9c, 0xcc, 0x63, 0x98, 0x0e, 0x77, 0x5b, 0xca, 0x00, 0x72, 0xc9, 0xe4, 0x20, 0x05, 0x8b, 0xa9, 0x81, 0x21, 0xff, 0x9d, 0x8f, 0x06, 0x7d, 0xd8, 0xbd, 0xfe, 0x75, 0x1f, 0x62, 0x77, 0xfd, 0x2c, 0x6a, 0x91, 0xb4, 0xc3, 0x02, 0x10, 0xa6, 0xec, 0x9a, 0x27, 0xac, 0x43, 0x43, 0x49, 0x30, 0xd3, 0x13, 0x58, 0xef, 0x55, 0x5b, 0x9c, 0xcf, 0x57, 0xba, 0xef, 0xc8, 0x58, 0xc4, 0x36, 0x0c, 0x06, 0xbc, 0x5c, 0xe1, 0xfe, 0x38, 0x4d, 0xb2, 0xe5, 0x8b, 0x8d, 0xeb, 0xec, 0x55, 0x47, 0xe0, 0x34, 0xd2, 0x42, 0x46, 0xcf, 0x29, 0x17, 0xfe, 0x03, 0x4f, 0x0f, 0x0f, 0x2d, 0x73, 0x06, 0xd5, 0xc6, 0xd6, 0x01, 0x63, 0xd1, 0x76, 0x7f, 0x58, 0x29, 0x88, 0xdd, 0xde, 0x32, 0xe1, 0xe3, 0xb6, 0xa2, 0x6f, 0x22, 0x76, 0x4b, 0x49, 0x8a, 0xb0, 0xa7, 0xbf, 0x4d, 0x0b, 0xf8, 0x30, 0x40, 0xa1, 0xc6, 0x76, 0x45, 0x93, 0xf2, 0x98, 0x22, 0x8a, 0xa1, 0x1c, 0xd8, 0xb4, 0x42, 0x2e, 0x75, 0x0f, 0xb1, 0x23, 0x91, 0x53, 0xeb, 0xbd, 0xee, 0x9d, 0x8d, 0x82, 0xbe, 0x50, 0x69, 0x7e, 0x46, 0xde, 0x8f, 0x11, 0xa3, 0x21, 0xab, 0x8a, 0xc6, 0x56, 0x5e, 0x3b, 0xd9, 0x0c, 0x50, 0x55, 0xd4, 0x6f, 0x40, 0x9f, + 0x94, 0x88, 0x9f, 0x93, 0x75, 0x19, 0x76, 0x2d, 0xe1, 0xad, 0x43, 0x09, 0x61, 0x3d, 0x21, 0x02, 0xcf, 0x63, 0xee, 0x91, 0x6c, 0xb2, 0xb7, 0xe8, 0xbb, 0xda, 0x39, 0x12, 0x53, 0xdc, 0xaf, 0x84, 0x03, 0x63, 0x11, 0xba, 0x23, 0x29, 0x3e, 0x8e, 0x91, 0x70, 0x2f, 0x5a, 0x0d, 0xa5, 0x1c, 0x18, 0x98, 0x0a, 0x1a, 0x26, 0x4b, 0x09, 0x14, 0x5c, 0x54, 0x7a, 0x70, 0xd8, 0x84, 0xcf, 0x98, 0x6e, 0xcb, 0x9f, 0x86, 0xed, 0x7a, 0xbc, 0x57, 0x30, 0x7e, 0x05, 0x72, 0x64, 0x8d, 0x74, 0xf8, 0x9b, 0x5b, 0xa2, 0xbc, 0x6a, 0x26, 0x22, 0x23, 0xa9, 0x09, 0xb4, 0xf4, 0x92, 0x8a, 0xb0, 0x09, 0xe1, 0x76, 0x48, 0x51, 0x87, 0x54, 0x67, 0x06, 0xf2, 0x25, 0xa9, 0xb5, 0x07, 0x5d, 0x9f, 0xa9, 0x8b, 0xdc, 0x57, 0x61, 0x3d, 0x18, 0xaf, 0x62, 0x66, 0x2b, 0x2a, 0xff, 0x5c, 0x29, 0xd1, 0x14, 0xd1, 0xd4, 0x82, 0xed, 0x8d, 0x24, 0x94, 0xba, 0xc0, 0x72, 0xf5, 0x42, 0xa3, 0xd8, 0x3d, 0x3d, 0x2c, 0x4e, 0x7d, 0xfb, 0x0e, 0xc3, 0xa9, 0xb6, 0xba, 0xd9, 0x0b, 0xb0, 0x0a, 0xce, 0x63, 0x59, 0xac, 0x23, 0xc0, 0x4c, 0x9b, 0x80, 0xdb, 0x56, 0x1f, 0x79, 0xa4, 0xb9, 0x91, 0xad, 0x45, 0x13, 0x69, 0x2f, 0xb2, 0xdb, 0x1d, 0x09, 0x63, 0xaa, 0x87, 0x43, 0xc8, 0x91, 0xf3, 0xf4, 0x39, 0xd5, 0x05, 0x68, 0x94, 0x84, 0x96, 0xc1, 0xd0, 0xc1, 0x05, 0xf8, 0x12, 0x47, 0xe4, 0xf7, 0x8e, 0xc4, 0xda, 0x8d, 0x1d, 0x16, 0x93, 0x82, 0x50, 0x15, 0x74, 0x79, 0xf3, 0x0f, 0x47, 0xee, 0xeb, 0x49, 0x65, 0x1a, 0x98, 0x92, 0x97, 0x1d, 0x48, 0x3a, 0x76, 0x08, 0x53, 0x22, 0x35, 0xd2, 0xcb, 0xcd, 0x17, 0xa6, 0x1c, 0x78, 0xb7, 0x13, 0xd3, 0x9a, 0x9f, 0x8e, 0x5d, 0xa1, 0xe0, 0x6f, 0xb9, 0xef, 0x99, + 0xd9, 0xcd, 0x58, 0xc2, 0x69, 0x81, 0x59, 0x2c, 0x24, 0xdd, 0x21, 0xc6, 0x7e, 0xdc, 0xb4, 0x39, 0x5c, 0xe0, 0x22, 0x26, 0x4d, 0xa3, 0x9d, 0xf0, 0x00, 0x59, 0x63, 0x6d, 0x54, 0xc6, 0xc2, 0x61, 0x6e, 0xf4, 0xac, 0x0c, 0x61, 0x68, 0x43, 0xcd, 0x71, 0xa7, 0x51, 0x62, 0x91, 0xe8, 0xff, 0x4c, 0x02, 0xb9, 0xfa, 0x42, 0xc7, 0x14, 0xf3, 0x0f, 0xfe, 0x2c, 0x3d, 0x7a, 0x0b, 0x3a, 0x54, 0xd9, 0x5d, 0x98, 0x78, 0xbb, 0x25, 0x36, 0xcc, 0x81, 0x4f, 0xea, 0xa7, 0x3b, 0x5e, 0x4f, 0xb5, 0xc0, 0x6a, 0x9c, 0xf8, 0xef, 0x2e, 0x50, 0x52, 0xf7, 0xd4, 0xb1, 0xf0, 0x34, 0x42, 0x99, 0xf8, 0x1a, 0xaa, 0xe8, 0x34, 0x82, 0xb2, 0xba, 0xb7, 0xbd, 0x6e, 0xdc, 0x9b, 0xda, 0x71, 0x7f, 0xed, 0x6b, 0x72, 0x9e, 0xd1, 0xd2, 0xe5, 0x43, 0x0e, 0x21, 0x55, 0x68, 0xd8, 0x6c, 0x32, 0x89, 0xc0, 0x8d, 0xad, 0xa8, 0x63, 0x26, 0x82, 0xda, 0xdf, 0xdd, 0xb8, 0x6b, 0x8f, 0x2f, 0x1a, 0x69, 0x1f, 0xb0, 0xdc, 0x98, 0xa9, 0x1e, 0x05, 0x7e, 0x06, 0x21, 0x22, 0x9f, 0x38, 0xb9, 0xe2, 0x0b, 0xd9, 0x84, 0x63, 0x99, 0x7a, 0x8c, 0xf4, 0x57, 0xb5, 0xc4, 0xc1, 0xbb, 0xf4, 0xbc, 0x82, 0x4a, 0xad, 0x35, 0x76, 0xca, 0x21, 0x0b, 0xd5, 0x02, 0xf1, 0xed, 0x19, 0xbd, 0x8d, 0xc7, 0x74, 0x5a, 0xa0, 0xf6, 0xd8, 0xe2, 0x39, 0x8a, 0x2a, 0xf1, 0x52, 0x64, 0x63, 0x63, 0x29, 0xb3, 0xf5, 0x58, 0x3d, 0xdd, 0x0f, 0xb2, 0x29, 0x0a, 0x90, 0xfe, 0xfa, 0x7b, 0x9f, 0x93, 0x4e, 0x72, 0xb7, 0x7f, 0x0f, 0x25, 0x75, 0x70, 0x88, 0x82, 0x1c, 0x25, 0xfe, 0x5a, 0x58, 0x59, 0x4f, 0xea, 0xd2, 0xf6, 0xd4, 0x12, 0xac, 0x63, 0x01, 0xc1, 0xab, 0x95, 0x0c, 0x50, 0x34, 0x5e, 0xf6, 0x67, 0xdf, 0xb7, 0x24, 0x30, + 0x06, 0x98, 0xfd, 0x00, 0xc4, 0xaf, 0x52, 0x93, 0x2d, 0xff, 0xe7, 0x50, 0x05, 0x0b, 0x8c, 0x72, 0xc4, 0x42, 0x9b, 0xb3, 0x48, 0x99, 0xf2, 0xde, 0x15, 0xa7, 0x18, 0xd0, 0x01, 0x0f, 0x21, 0x8b, 0x75, 0xc8, 0xfc, 0x05, 0xba, 0xe3, 0x4c, 0x83, 0x7e, 0x3a, 0xcd, 0x21, 0x75, 0x4e, 0x32, 0x6c, 0xf8, 0xf7, 0xf4, 0x17, 0x06, 0xc9, 0x87, 0x20, 0xef, 0xee, 0x04, 0x33, 0x8a, 0xad, 0xbe, 0xc9, 0x50, 0xb3, 0x85, 0xc2, 0x6f, 0x29, 0x84, 0x8e, 0x28, 0xef, 0x98, 0x14, 0x09, 0x9c, 0xeb, 0xec, 0x4f, 0x9f, 0x1e, 0x3b, 0x5e, 0xd1, 0x7f, 0x1f, 0xd5, 0x9b, 0x65, 0x63, 0xca, 0x1e, 0xb1, 0x85, 0xd1, 0xa0, 0x4d, 0x5c, 0x7f, 0x27, 0x84, 0x0e, 0x9b, 0x7c, 0x6e, 0x7c, 0x2c, 0xc8, 0xdc, 0xcf, 0x90, 0xaa, 0x71, 0xf8, 0xb4, 0xe8, 0x6a, 0xd1, 0xb6, 0x2a, 0xe0, 0xd8, 0xeb, 0xdf, 0xe4, 0x18, 0xed, 0x31, 0x0f, 0xfe, 0xe3, 0xa6, 0xcf, 0x5a, 0x3b, 0xa5, 0x8f, 0xe6, 0x51, 0xf8, 0x86, 0x90, 0x78, 0x2c, 0xf2, 0x90, 0x16, 0x75, 0xa0, 0xd4, 0xf0, 0xcc, 0x5f, 0x7c, 0x58, 0x09, 0x6b, 0xee, 0x81, 0x28, 0xe5, 0x66, 0x89, 0x2b, 0x14, 0x8c, 0x32, 0x7a, 0xee, 0x62, 0x8e, 0xe4, 0x82, 0x12, 0x35, 0x20, 0xe6, 0xf5, 0xc7, 0x88, 0x76, 0x60, 0x00, 0xe1, 0xc0, 0xed, 0x61, 0x10, 0x9e, 0x20, 0x4a, 0xe5, 0xdd, 0x74, 0xc3, 0x65, 0x11, 0x73, 0xfe, 0x41, 0xd0, 0xc9, 0x4b, 0xcd, 0xb5, 0x3b, 0x39, 0x95, 0x8d, 0xaf, 0xd2, 0x29, 0x6c, 0x67, 0xf0, 0x07, 0xa3, 0x6e, 0x30, 0xbe, 0xd5, 0x34, 0xcb, 0xb0, 0xcc, 0x3a, 0xe5, 0x7c, 0xe5, 0xf1, 0x55, 0x75, 0x6c, 0xca, 0x0b, 0x0e, 0x23, 0x53, 0x76, 0x6d, 0xfa, 0xa9, 0xae, 0x28, 0x92, 0xf7, 0xfd, 0xef, 0x76, 0x2c, 0x21, 0xd9, 0xe3, 0x52, + 0x6a, 0x19, 0x12, 0x35, 0xf1, 0x1e, 0x38, 0x27, 0x13, 0xe6, 0xac, 0x6e, 0x3a, 0x86, 0x7c, 0x8b, 0xe9, 0x6e, 0xc8, 0x63, 0x77, 0xfc, 0x2d, 0x23, 0x43, 0x90, 0x47, 0xbd, 0xd8, 0xfa, 0x9a, 0xad, 0x65, 0xe5, 0x69, 0xc8, 0x97, 0x23, 0x41, 0xf6, 0x77, 0x02, 0x6d, 0xa9, 0xe3, 0xc3, 0xc6, 0x8f, 0x83, 0x0d, 0x1d, 0x70, 0x39, 0xae, 0xbd, 0xdb, 0x6c, 0x2f, 0xf9, 0x8e, 0x07, 0xf7, 0xab, 0x5d, 0xa0, 0x83, 0x44, 0x51, 0xca, 0xf6, 0x0c, 0x14, 0xe4, 0x0f, 0x1b, 0xdd, 0x9f, 0xed, 0x72, 0x97, 0xec, 0x86, 0x10, 0x3f, 0xd6, 0xa8, 0x31, 0x17, 0x8a, 0xae, 0x0e, 0xc7, 0x39, 0x8d, 0x8a, 0x2d, 0xfb, 0x3c, 0x06, 0x4a, 0x99, 0x92, 0x88, 0xbc, 0xe4, 0xe4, 0xf8, 0xfb, 0x15, 0xc3, 0xcd, 0xab, 0x95, 0xbd, 0x15, 0xde, 0xef, 0xb5, 0x2e, 0xa0, 0x9f, 0xa0, 0xbf, 0x24, 0x11, 0x33, 0x5e, 0x7e, 0xae, 0x9c, 0x47, 0x12, 0x00, 0x16, 0x9f, 0x4c, 0x4c, 0x49, 0x47, 0x9a, 0x35, 0x26, 0x97, 0xdb, 0x95, 0x60, 0x9d, 0x2c, 0x2f, 0xad, 0x1e, 0xee, 0x3d, 0x35, 0x0a, 0x8e, 0x3d, 0x0a, 0xc9, 0xc4, 0x3d, 0x09, 0xcb, 0x1c, 0x3c, 0x96, 0xfd, 0x9f, 0x43, 0xbe, 0x92, 0x28, 0xf1, 0x81, 0xb1, 0x34, 0xa6, 0x59, 0x16, 0xda, 0x56, 0xe2, 0x3b, 0x45, 0x01, 0x79, 0xb6, 0x6b, 0x0b, 0x36, 0x01, 0x15, 0xb4, 0x61, 0x88, 0xef, 0x68, 0x9f, 0x0b, 0x28, 0x15, 0xe1, 0x11, 0x94, 0x37, 0x42, 0x62, 0xd6, 0xb2, 0xa1, 0x9b, 0x1c, 0x47, 0xab, 0x62, 0xa8, 0xe9, 0x00, 0xfa, 0x37, 0xf5, 0xaa, 0x31, 0x31, 0x77, 0xca, 0x47, 0xa5, 0x9c, 0xf3, 0x4a, 0x92, 0x18, 0xbb, 0xa2, 0x1a, 0x15, 0xa1, 0x4b, 0xe9, 0xd0, 0x35, 0xef, 0xbe, 0x72, 0x0a, 0x48, 0xf1, 0x44, 0x22, 0xb1, 0xae, 0xcd, 0x95, 0xc5, 0x76, + 0x46, 0x1e, 0xb9, 0x21, 0x92, 0x59, 0x56, 0xb9, 0x3c, 0x3f, 0x0b, 0xf4, 0x4d, 0x12, 0x9d, 0x68, 0xca, 0x68, 0xb5, 0x85, 0x30, 0xb6, 0x4c, 0x06, 0x0b, 0x68, 0xc0, 0xff, 0x9c, 0x0a, 0x5e, 0x5c, 0xa5, 0xac, 0xb2, 0x48, 0xfa, 0x02, 0xe5, 0xe9, 0x2f, 0x8e, 0x68, 0x47, 0xa8, 0xd1, 0xa0, 0xc1, 0xbc, 0xcd, 0xea, 0x39, 0x89, 0x83, 0xe5, 0x60, 0xc3, 0x97, 0x4a, 0xf9, 0xf8, 0x5a, 0x7f, 0x74, 0x16, 0x49, 0x8c, 0x77, 0xba, 0x3b, 0x09, 0xa1, 0xf8, 0xe3, 0x09, 0xa7, 0x38, 0xdd, 0xf0, 0x31, 0x1d, 0xda, 0x4f, 0x0e, 0x09, 0xad, 0xaa, 0x44, 0x6d, 0x2c, 0x0c, 0x29, 0x18, 0x84, 0x51, 0xd7, 0x0d, 0x28, 0xd2, 0x3a, 0x03, 0x41, 0x80, 0x48, 0xfc, 0xb6, 0x90, 0xed, 0xd5, 0x45, 0xcf, 0xd9, 0x93, 0x2a, 0x98, 0x57, 0x5e, 0x44, 0x0d, 0x69, 0xdd, 0xe5, 0x5c, 0x12, 0x65, 0xf5, 0xdc, 0xe5, 0xb1, 0xef, 0xf9, 0x0d, 0xbc, 0xe2, 0xc7, 0x07, 0xf5, 0xf2, 0xd3, 0xfe, 0x63, 0x73, 0x73, 0xd8, 0x41, 0x81, 0xde, 0x4c, 0x41, 0xe3, 0x31, 0xaf, 0xb7, 0xaf, 0x41, 0x36, 0xb0, 0xdd, 0xe7, 0xb5, 0x4b, 0x97, 0x5c, 0x63, 0x02, 0x90, 0xeb, 0xd6, 0xcc, 0x7c, 0x85, 0x67, 0xa2, 0x32, 0x60, 0xf6, 0x92, 0xa5, 0x82, 0xf3, 0x5e, 0xf2, 0x17, 0x29, 0xe0, 0x28, 0xe4, 0x6f, 0x07, 0x98, 0x7f, 0x80, 0x93, 0x99, 0x81, 0xf0, 0xe1, 0x35, 0x28, 0xe1, 0x60, 0x2d, 0xf9, 0xb7, 0x56, 0x55, 0x1c, 0x52, 0xa0, 0x9b, 0x33, 0xe3, 0xff, 0x49, 0x0d, 0x9f, 0xe0, 0xa0, 0xa4, 0xb6, 0x5a, 0x1e, 0x69, 0x2d, 0x1e, 0x90, 0x95, 0x04, 0x2d, 0xd5, 0xea, 0xd5, 0xf8, 0xb8, 0x4f, 0xe7, 0xc5, 0xa1, 0xf4, 0x16, 0xaa, 0x4b, 0xef, 0x43, 0x21, 0xb4, 0x53, 0xb3, 0x2b, 0xe4, 0x28, 0x8f, 0x3d, 0xf2, 0x86, 0xa1, + 0xff, 0xff, 0x51, 0x4f, 0x1d, 0x07, 0xd3, 0x1d, 0x61, 0x86, 0xbf, 0xc1, 0x5a, 0xa4, 0x96, 0x57, 0x4c, 0xcb, 0xcf, 0x98, 0x0c, 0x29, 0x1f, 0x55, 0xa8, 0x0f, 0x58, 0x03, 0xa5, 0x53, 0xfa, 0x3b, 0xd8, 0x6a, 0xf1, 0x9d, 0xdb, 0x83, 0x12, 0x96, 0x42, 0xf7, 0x9e, 0xe0, 0x21, 0xba, 0x77, 0x10, 0x01, 0x89, 0xfa, 0xd7, 0x6b, 0x89, 0x32, 0xe8, 0x4e, 0xe9, 0x09, 0x56, 0x3b, 0x82, 0x64, 0xbf, 0xfc, 0x8e, 0xcc, 0x8e, 0x0f, 0xd3, 0x37, 0x4a, 0x5f, 0xa3, 0x30, 0x88, 0x3d, 0x74, 0x2c, 0xb6, 0xcc, 0x82, 0x4e, 0x93, 0x06, 0xec, 0x32, 0x25, 0xc6, 0xf5, 0x65, 0x16, 0x8d, 0x25, 0x8d, 0x2b, 0xc9, 0x5e, 0x7b, 0x90, 0xf2, 0xb4, 0x4f, 0x31, 0x77, 0x7b, 0xbd, 0x74, 0xb5, 0x4a, 0x24, 0x00, 0x9d, 0x86, 0x9a, 0x19, 0x44, 0x16, 0xec, 0x1f, 0x93, 0xe0, 0x8f, 0x45, 0x1f, 0x7b, 0x8b, 0xc1, 0x82, 0xda, 0x47, 0x4c, 0x16, 0x9f, 0xd3, 0x9f, 0x84, 0xf8, 0x37, 0x1b, 0x2d, 0xd9, 0x83, 0x70, 0xdd, 0x4e, 0xac, 0x6f, 0x62, 0xd3, 0xc2, 0x46, 0xeb, 0x61, 0xe3, 0xb4, 0xc8, 0x5e, 0xe9, 0x9f, 0x35, 0x0b, 0xf0, 0x08, 0xf2, 0x31, 0x2d, 0xf6, 0x7d, 0xc6, 0xe1, 0x9d, 0x6d, 0xe7, 0xa3, 0x50, 0x03, 0x42, 0xb8, 0xdc, 0x7a, 0x8b, 0x5e, 0x24, 0x65, 0x30, 0x85, 0x3f, 0x23, 0x68, 0xf0, 0x5c, 0xdd, 0x1a, 0xbe, 0x87, 0xf5, 0x1c, 0xa8, 0x4e, 0x53, 0x8d, 0xeb, 0xaf, 0x71, 0xd0, 0x87, 0xed, 0xbc, 0x6a, 0x44, 0x2f, 0xe5, 0x3c, 0x83, 0x10, 0xb1, 0x26, 0x18, 0xb1, 0x9c, 0xd8, 0x16, 0x0e, 0xde, 0x3c, 0x5b, 0xfd, 0x0a, 0xc8, 0x42, 0x9a, 0x7f, 0xce, 0x89, 0x62, 0xb9, 0xab, 0x62, 0x10, 0xb3, 0x8a, 0x27, 0xac, 0xe9, 0xfa, 0x1c, 0x09, 0x7d, 0x53, 0x0b, 0x1a, 0xa1, 0xde, 0x96, 0xa4, + 0xb0, 0x44, 0x71, 0x4d, 0xe1, 0xbe, 0xfd, 0x69, 0xf6, 0x40, 0x58, 0xa4, 0x84, 0xb2, 0x27, 0xe8, 0xd3, 0x71, 0x17, 0x0e, 0xfb, 0x13, 0x19, 0xad, 0x6d, 0xdb, 0xc3, 0x2c, 0x0e, 0xee, 0x71, 0x7c, 0xd9, 0xcf, 0x0d, 0x2e, 0xd5, 0x15, 0xfb, 0xe7, 0xba, 0x89, 0x22, 0xab, 0xea, 0x5b, 0xb0, 0x6a, 0x5f, 0x4c, 0x78, 0x2d, 0x46, 0xf8, 0xee, 0x52, 0x87, 0x2b, 0x34, 0x36, 0x69, 0xbf, 0xea, 0xb3, 0xf3, 0x71, 0x49, 0x34, 0xd1, 0x45, 0x72, 0x74, 0xd2, 0xe4, 0x2e, 0x22, 0xb9, 0xfb, 0x5b, 0x94, 0xc4, 0x4a, 0x23, 0x59, 0x74, 0x0f, 0x5e, 0x99, 0xbf, 0xf5, 0x70, 0x86, 0x7c, 0x4a, 0x0e, 0x02, 0xe0, 0x1c, 0xcf, 0xdb, 0x78, 0x47, 0xaa, 0x78, 0x6b, 0xbd, 0x88, 0x15, 0xfc, 0x7f, 0x2e, 0x3b, 0x4f, 0x39, 0x10, 0xa4, 0x93, 0x47, 0xab, 0xaf, 0xd1, 0x80, 0xde, 0xd2, 0x36, 0x8b, 0x51, 0x51, 0x3f, 0xbb, 0xb5, 0x9a, 0x02, 0xc0, 0xac, 0x0a, 0x56, 0xcf, 0xea, 0x5c, 0x41, 0x8c, 0xb8, 0x55, 0x13, 0x31, 0xbf, 0x82, 0x8c, 0xf9, 0xdc, 0x67, 0xe9, 0x85, 0x3d, 0x17, 0xd1, 0x3b, 0x59, 0xbc, 0x66, 0x8d, 0x52, 0x84, 0xe7, 0x28, 0x90, 0xed, 0xb2, 0xa9, 0xa8, 0xdf, 0xeb, 0xd2, 0x31, 0xc0, 0xcb, 0x53, 0xe2, 0xc2, 0xc4, 0x42, 0xf8, 0x06, 0x7a, 0x37, 0x8e, 0x4b, 0x51, 0x57, 0x2d, 0x76, 0x96, 0x7e, 0x40, 0xbc, 0x00, 0x1a, 0x61, 0xc1, 0x16, 0x7f, 0x9c, 0x8a, 0x04, 0xe2, 0x77, 0x1f, 0x50, 0xc4, 0x36, 0x4b, 0xf2, 0x52, 0x74, 0x4f, 0x80, 0x59, 0xf1, 0x15, 0xbf, 0x08, 0xbc, 0xd7, 0x6e, 0x1f, 0x98, 0x1c, 0x58, 0x42, 0x2e, 0x67, 0xbe, 0xdb, 0x41, 0x26, 0x92, 0x47, 0xb5, 0x36, 0x53, 0x88, 0xdd, 0x83, 0xe3, 0x02, 0xa3, 0xc5, 0xe8, 0xfb, 0xf5, 0x42, 0x5a, 0xa3, 0x8b, 0x9c, + 0xdd, 0xdf, 0x26, 0x30, 0x1f, 0xa0, 0x5a, 0xdb, 0xad, 0xec, 0xb4, 0x31, 0xcb, 0x89, 0x6e, 0x94, 0x41, 0x88, 0xcc, 0xc3, 0xc7, 0x74, 0x80, 0x44, 0x25, 0x91, 0x57, 0xde, 0x35, 0xca, 0x7e, 0x75, 0xd6, 0x39, 0x49, 0x37, 0x93, 0xb3, 0xd7, 0xe5, 0xc9, 0x74, 0x8f, 0xe7, 0x18, 0xf9, 0x42, 0x76, 0xca, 0x66, 0xb0, 0x97, 0x89, 0x91, 0x14, 0x53, 0x40, 0x57, 0x5d, 0xdc, 0x22, 0x2b, 0xfd, 0xc4, 0xc9, 0xe0, 0x48, 0x98, 0x94, 0x6d, 0xc0, 0x87, 0x48, 0xbd, 0x1e, 0x79, 0x9f, 0x89, 0xea, 0xbe, 0xa8, 0x53, 0x88, 0x2b, 0x41, 0x61, 0xfc, 0xd5, 0x88, 0xfc, 0xe3, 0xae, 0xdb, 0xa4, 0xfa, 0xf1, 0x86, 0xa2, 0xbb, 0x40, 0x9c, 0x29, 0x94, 0xbb, 0x56, 0x8a, 0xa9, 0xc6, 0x2d, 0xf9, 0xd2, 0x83, 0xf4, 0x11, 0x54, 0xf2, 0x8a, 0x49, 0xea, 0xf7, 0xa5, 0xfd, 0x0f, 0xbf, 0x84, 0xf5, 0x50, 0x15, 0x46, 0x57, 0xf1, 0x4e, 0xd1, 0x7f, 0x94, 0x6f, 0x9a, 0xc8, 0x99, 0x42, 0x29, 0xed, 0x95, 0x3b, 0x2e, 0x7a, 0x63, 0xf3, 0x08, 0xdb, 0x51, 0xd3, 0x97, 0xb4, 0xef, 0x91, 0x1f, 0x4e, 0x9d, 0x96, 0x4f, 0xf8, 0x1f, 0xc9, 0xe4, 0x89, 0xe5, 0xf7, 0x6a, 0x73, 0xbb, 0x6b, 0x08, 0x56, 0xb8, 0x6d, 0x30, 0x13, 0x9e, 0xc0, 0xf4, 0x62, 0x56, 0x6e, 0xe0, 0xb6, 0x4d, 0xd9, 0xb7, 0x95, 0x9d, 0x6d, 0x59, 0x2f, 0xaa, 0x6e, 0xfa, 0x01, 0x67, 0x4a, 0x3e, 0xa6, 0xe1, 0x49, 0xe1, 0x1a, 0xe8, 0x1c, 0xe4, 0x0d, 0xb5, 0xa0, 0xa8, 0x68, 0x99, 0x08, 0xc2, 0xe1, 0xef, 0xca, 0x54, 0xdb, 0xc0, 0x94, 0x9f, 0xf7, 0x0a, 0xb1, 0x21, 0x02, 0xe5, 0x87, 0x4e, 0x2a, 0xe2, 0xa9, 0xb8, 0x00, 0xb8, 0xff, 0x9e, 0xc2, 0x2f, 0x96, 0xb1, 0xd3, 0xf3, 0xea, 0xa8, 0xd9, 0xf7, 0x57, 0x31, 0xf7, 0x8d, 0xc7, + 0x88, 0x1a, 0xdb, 0x98, 0x64, 0xb5, 0xb9, 0xfc, 0xf2, 0x2a, 0x78, 0xd4, 0x54, 0x1a, 0x75, 0xea, 0xd5, 0xe8, 0x79, 0x92, 0x99, 0xa4, 0xff, 0xb2, 0x80, 0xa9, 0x2f, 0xd7, 0x09, 0x11, 0x86, 0x73, 0x5b, 0x67, 0x31, 0x17, 0xf9, 0xcf, 0xd3, 0x40, 0x1b, 0x43, 0x0c, 0x2f, 0x0e, 0x00, 0xca, 0x6b, 0xce, 0xf0, 0x64, 0x61, 0x13, 0xf2, 0x80, 0x3e, 0xc4, 0x61, 0x6a, 0x8e, 0x94, 0x10, 0x62, 0xd3, 0xf6, 0x4c, 0xf5, 0xe0, 0x89, 0xa7, 0x09, 0x4a, 0x6e, 0xdb, 0x8b, 0x2e, 0x05, 0x3a, 0xef, 0xbc, 0x3c, 0x9d, 0x4a, 0x1e, 0xb3, 0xbe, 0xe1, 0x31, 0xd5, 0xb7, 0x53, 0x1d, 0x53, 0xfe, 0xab, 0xc0, 0x2e, 0x64, 0x77, 0xc1, 0xf0, 0x87, 0x99, 0xd8, 0xdb, 0xd4, 0xdf, 0xe5, 0x74, 0xf4, 0xf6, 0x19, 0x70, 0x02, 0x4c, 0xac, 0xb4, 0xa2, 0x8e, 0x36, 0x84, 0x67, 0xf7, 0x45, 0x18, 0x82, 0xa0, 0xbf, 0xb3, 0x02, 0xa7, 0x4d, 0xaa, 0x29, 0xf8, 0xfa, 0xed, 0x25, 0xf3, 0x9f, 0xba, 0xd0, 0xb2, 0x47, 0x14, 0x1d, 0x4e, 0x9f, 0x10, 0x12, 0x6c, 0x6e, 0x62, 0x2f, 0x25, 0x37, 0x62, 0x20, 0x7e, 0xae, 0x26, 0x4a, 0x23, 0xa0, 0x7b, 0x73, 0x00, 0x13, 0x26, 0xa9, 0x62, 0xab, 0x5e, 0x49, 0xc0, 0x25, 0x30, 0xa8, 0xd8, 0x41, 0x27, 0x9d, 0x52, 0xc4, 0x15, 0xa8, 0x00, 0x5a, 0xeb, 0x43, 0x21, 0x9b, 0x6b, 0x20, 0x91, 0x51, 0x31, 0x33, 0x4f, 0x70, 0xf1, 0xd8, 0x43, 0xd8, 0x0a, 0x4b, 0xed, 0x8c, 0xfb, 0xd8, 0xcb, 0xac, 0x14, 0x90, 0x5c, 0x2d, 0x3c, 0xc2, 0x1a, 0x0e, 0xa2, 0x40, 0x7f, 0xb9, 0xd1, 0x2a, 0x5b, 0xfb, 0x3c, 0x93, 0x7a, 0x10, 0xdc, 0x5b, 0xee, 0x34, 0x3a, 0x70, 0x3b, 0xc8, 0x6b, 0x5b, 0x90, 0xdb, 0xa5, 0x5b, 0xe0, 0x0f, 0x3a, 0x88, 0xed, 0x0a, 0x04, 0x2c, 0xcc, 0xb1, + 0x6c, 0x76, 0x29, 0x32, 0xce, 0x11, 0xcc, 0x82, 0xe3, 0xe1, 0x85, 0x76, 0x3b, 0xfb, 0x19, 0xa2, 0x21, 0x74, 0xab, 0x4e, 0x84, 0x54, 0x2d, 0xe5, 0xc8, 0x1b, 0x57, 0x35, 0x4c, 0xd3, 0x4f, 0xc6, 0x21, 0x77, 0x65, 0x03, 0x8a, 0x03, 0xb3, 0x63, 0x64, 0xc1, 0xba, 0x7e, 0x25, 0x3e, 0x2c, 0x03, 0xc7, 0xbe, 0xe8, 0x2e, 0x13, 0x41, 0x04, 0x0f, 0x6b, 0xfc, 0xff, 0xa6, 0xd0, 0x87, 0x28, 0x12, 0xaf, 0xff, 0xfc, 0x8e, 0x85, 0x12, 0x7a, 0x94, 0x5f, 0xb0, 0x35, 0xad, 0x60, 0x43, 0x4b, 0xe0, 0xa9, 0x70, 0x44, 0xe2, 0x9b, 0x48, 0x90, 0x69, 0x08, 0x7b, 0x41, 0xc5, 0xc5, 0x42, 0x6c, 0x9e, 0xc9, 0x31, 0x43, 0x84, 0xfe, 0x58, 0x32, 0x31, 0x7f, 0x8b, 0x3c, 0x47, 0xed, 0x26, 0x1d, 0x1b, 0xba, 0xae, 0x2f, 0xe3, 0x8d, 0xd0, 0xb7, 0xa3, 0xd9, 0x3d, 0x3a, 0x26, 0x71, 0xf9, 0xe8, 0xd1, 0x56, 0x59, 0xd3, 0x1d, 0x20, 0x03, 0xad, 0xf1, 0x0e, 0x8d, 0x8a, 0xfd, 0xbe, 0x64, 0x9a, 0x2f, 0x75, 0x79, 0x9e, 0xcb, 0x1e, 0x21, 0xaf, 0xe5, 0xc4, 0x33, 0x5e, 0x5c, 0xfc, 0x20, 0x56, 0x48, 0xbf, 0xb7, 0xd9, 0xfd, 0x62, 0x53, 0xb2, 0xc8, 0x42, 0xc9, 0x22, 0x2c, 0x76, 0xcb, 0x3f, 0xc9, 0xca, 0x89, 0x72, 0x96, 0x9f, 0x5d, 0xbd, 0x52, 0x97, 0x84, 0xd7, 0x97, 0xe5, 0x1a, 0xed, 0x6b, 0x19, 0x23, 0x8e, 0x38, 0x8d, 0x6a, 0x69, 0x2e, 0xda, 0xfb, 0x3a, 0xc9, 0xb2, 0x2b, 0x5a, 0xbc, 0xd2, 0x60, 0x20, 0x24, 0x43, 0xec, 0x84, 0xbb, 0xc9, 0x49, 0xff, 0xd7, 0x53, 0xec, 0x2d, 0x27, 0x0c, 0xd7, 0x8f, 0x84, 0x46, 0x25, 0x97, 0x1f, 0x74, 0x8e, 0xab, 0x77, 0x82, 0x8b, 0x5e, 0x6d, 0x32, 0x84, 0xb8, 0x3a, 0xcd, 0x0f, 0x7a, 0x00, 0x1f, 0x0d, 0x09, 0x63, 0xed, 0xe4, 0xf2, 0x37, + 0x12, 0x7f, 0x1a, 0xb7, 0xb2, 0x01, 0x70, 0xc1, 0x7b, 0xa4, 0xe9, 0xa0, 0x50, 0xe7, 0xe4, 0x23, 0xcf, 0x2a, 0xfa, 0x95, 0x1e, 0xc6, 0xb1, 0x40, 0x0c, 0xf8, 0xa5, 0x8c, 0x2c, 0x92, 0xc9, 0xc5, 0x29, 0x24, 0xa1, 0x3a, 0x14, 0x3f, 0x7b, 0x00, 0xc5, 0x84, 0x43, 0x7b, 0xeb, 0xaf, 0x7f, 0x93, 0x9d, 0x05, 0xd0, 0x8a, 0x1d, 0x7f, 0x00, 0xac, 0xb1, 0xd4, 0xd4, 0xe2, 0x65, 0x47, 0x4e, 0xa0, 0x7c, 0x66, 0xca, 0xd6, 0xc3, 0x01, 0xee, 0x28, 0xbd, 0x25, 0xf9, 0x05, 0xa3, 0x37, 0x6c, 0x15, 0xa8, 0x4b, 0xf1, 0x09, 0x7a, 0x2c, 0xc6, 0xa7, 0xc4, 0x1a, 0xb2, 0x32, 0x3d, 0xd2, 0x0b, 0xb9, 0x98, 0x8b, 0x49, 0x31, 0xd9, 0xb9, 0xda, 0x0c, 0x76, 0x96, 0x5a, 0xec, 0x0b, 0x03, 0x07, 0x55, 0x0b, 0x74, 0xac, 0x96, 0x75, 0x62, 0x1c, 0x7e, 0xd1, 0x05, 0xcc, 0xaf, 0xad, 0xee, 0xaa, 0xbf, 0x7b, 0xda, 0xe1, 0x00, 0xd1, 0x2c, 0xbf, 0x8b, 0x7d, 0x42, 0xc7, 0x2d, 0xb0, 0x32, 0x48, 0x88, 0xbc, 0xbe, 0xd9, 0x54, 0x6b, 0x2d, 0x2e, 0xff, 0x7f, 0x9c, 0x06, 0x95, 0xde, 0xc8, 0x45, 0x11, 0x55, 0x4a, 0x38, 0x0b, 0x65, 0xd9, 0x0f, 0x2f, 0x2c, 0x66, 0x9d, 0x61, 0x21, 0xe4, 0x2c, 0x96, 0xd3, 0xb9, 0x7d, 0x3e, 0xf6, 0x02, 0x34, 0xcd, 0x50, 0x80, 0xe1, 0xc3, 0xf0, 0x49, 0x48, 0x14, 0xbe, 0xb7, 0xc3, 0xe6, 0x3d, 0x7d, 0x5d, 0x6d, 0x79, 0x62, 0x26, 0xbd, 0x19, 0x16, 0xa8, 0x4b, 0x5a, 0xec, 0xb6, 0xf9, 0x43, 0xc0, 0x5e, 0x4c, 0xd5, 0x8b, 0x21, 0xb6, 0x68, 0xda, 0x5a, 0x0a, 0xa2, 0xbf, 0xe1, 0x94, 0x49, 0x66, 0x54, 0xc1, 0xff, 0x90, 0x27, 0xd4, 0xc8, 0x1a, 0xf0, 0xc2, 0x99, 0xdc, 0x5d, 0xc0, 0x0b, 0xfb, 0x29, 0xab, 0xab, 0x64, 0x0f, 0xff, 0xc1, 0xa5, 0x90, 0x60, + 0xfc, 0xdf, 0x8e, 0x7a, 0x0d, 0xe9, 0x28, 0xc7, 0x42, 0xb0, 0xa1, 0x16, 0xbb, 0x64, 0x0a, 0x0c, 0x76, 0x74, 0xc5, 0x40, 0x90, 0xcd, 0xa3, 0xae, 0xc7, 0x76, 0x2b, 0xac, 0xd7, 0x4d, 0x17, 0x61, 0x8c, 0x25, 0x49, 0x4e, 0xbd, 0x0b, 0xd8, 0x77, 0x4d, 0x80, 0xaf, 0x33, 0x2e, 0xd2, 0x29, 0xbc, 0x77, 0xb2, 0x12, 0x56, 0xa9, 0x6b, 0xf0, 0x67, 0xe2, 0x55, 0xac, 0xfd, 0xad, 0xc5, 0xc8, 0xd8, 0x30, 0xbc, 0x3b, 0x4c, 0x1b, 0x12, 0x4f, 0x8e, 0x3d, 0x4e, 0x36, 0xbb, 0x52, 0xfa, 0x13, 0xd4, 0x95, 0xb8, 0x56, 0xa6, 0x4a, 0xb5, 0x38, 0x98, 0x8f, 0x0d, 0x90, 0x7c, 0xfb, 0x2b, 0xcb, 0xed, 0xe1, 0x05, 0x28, 0xc6, 0xfc, 0x0a, 0x43, 0x72, 0xfe, 0xbc, 0xa2, 0x80, 0xaf, 0x69, 0x62, 0x83, 0x70, 0x1d, 0xd9, 0xc3, 0xff, 0x14, 0x7b, 0x8a, 0x37, 0x0a, 0x3b, 0x70, 0x3d, 0x67, 0x75, 0xa7, 0x59, 0xfe, 0xe9, 0xd7, 0x9d, 0xda, 0x5f, 0xa4, 0xfd, 0x77, 0x4c, 0x09, 0x97, 0x68, 0x24, 0x87, 0x6e, 0x34, 0xa0, 0x5e, 0x1c, 0xf8, 0x38, 0x92, 0x41, 0x91, 0x03, 0xc7, 0x24, 0xc6, 0x01, 0x0d, 0x56, 0xe7, 0xaa, 0x96, 0x3d, 0xf4, 0x69, 0xe0, 0xd0, 0xc4, 0x5d, 0x76, 0xfb, 0xd3, 0xd9, 0xbb, 0x5f, 0xc9, 0x01, 0xac, 0x5e, 0x93, 0x10, 0x47, 0x8f, 0x28, 0x65, 0x3e, 0x33, 0xcc, 0x99, 0x6a, 0xa4, 0x02, 0x1a, 0xa5, 0x92, 0x04, 0x57, 0x57, 0x74, 0x5f, 0x95, 0x2a, 0x31, 0x57, 0x94, 0xd2, 0x7e, 0x44, 0x73, 0x80, 0x50, 0x18, 0xfb, 0x71, 0xbf, 0xc2, 0x02, 0x29, 0x3a, 0x99, 0x84, 0xd9, 0x0e, 0x30, 0x8b, 0x65, 0x22, 0xd4, 0x36, 0x04, 0xc4, 0xe3, 0x9d, 0x7f, 0x40, 0xad, 0x1b, 0x3d, 0x90, 0x76, 0xf3, 0x0c, 0x88, 0x72, 0x77, 0x5e, 0x13, 0x7e, 0x4f, 0x3a, 0x54, 0xea, 0x4b, 0x8f, + 0x91, 0xf4, 0x19, 0x0f, 0xcc, 0x65, 0xae, 0xcc, 0x93, 0x47, 0x8f, 0xa8, 0x95, 0xab, 0x5c, 0x46, 0x66, 0x91, 0x81, 0xce, 0xe9, 0x17, 0x21, 0xf0, 0x8e, 0x58, 0xe1, 0x62, 0xf6, 0x4c, 0x3d, 0x3a, 0xf0, 0xee, 0x16, 0x23, 0x3e, 0x9a, 0xcf, 0x0d, 0xb7, 0x0f, 0xe3, 0xc5, 0xf7, 0xbb, 0x25, 0xf4, 0xe9, 0xc7, 0x71, 0xf8, 0xc5, 0x30, 0xda, 0x25, 0xe2, 0x78, 0x29, 0x2c, 0xd1, 0xa8, 0x43, 0x06, 0x19, 0xca, 0x4e, 0xc1, 0xa5, 0xc9, 0xab, 0xa5, 0x3b, 0xdf, 0x55, 0xd6, 0x29, 0xdb, 0x5f, 0x30, 0x23, 0xd9, 0xfc, 0x05, 0x0f, 0x04, 0x05, 0xa8, 0x88, 0x23, 0x8c, 0x50, 0xc5, 0xaf, 0x3a, 0x4a, 0x95, 0x0f, 0x9f, 0x95, 0x52, 0xfd, 0x6f, 0xa4, 0x82, 0x27, 0xba, 0x19, 0x67, 0x02, 0x2e, 0x14, 0xd8, 0x44, 0xf8, 0xd4, 0xc6, 0x67, 0xf9, 0xa8, 0x2e, 0x61, 0x76, 0x91, 0x69, 0x6e, 0x86, 0xfc, 0xfa, 0x59, 0x21, 0xb1, 0x98, 0x0f, 0xee, 0x93, 0x5e, 0x09, 0x60, 0x42, 0xb1, 0x9b, 0x32, 0x0b, 0x09, 0xd4, 0x1d, 0xdf, 0xa3, 0x62, 0x93, 0x3f, 0x6f, 0xaa, 0xe7, 0x32, 0xf9, 0x5b, 0xd1, 0xbe, 0x4f, 0x32, 0x81, 0x50, 0xb7, 0xfd, 0xd7, 0x83, 0x02, 0xcf, 0xfa, 0xe7, 0x4c, 0xfe, 0x86, 0xf4, 0xf8, 0xbc, 0xd2, 0x66, 0xb3, 0xf8, 0x41, 0x89, 0x9b, 0x12, 0xd3, 0x18, 0x96, 0x67, 0xf1, 0x5b, 0xa8, 0x3a, 0x17, 0x6d, 0x4a, 0x55, 0xf7, 0x8a, 0x3c, 0x7f, 0x93, 0x23, 0xf5, 0xe9, 0x65, 0x1e, 0xc9, 0x95, 0x69, 0x0c, 0x38, 0xe7, 0xd3, 0x68, 0xd3, 0x77, 0xf5, 0x6e, 0xce, 0x29, 0x25, 0x0a, 0x28, 0xe2, 0x4d, 0xb0, 0x7d, 0xd3, 0x59, 0x5c, 0xd0, 0xcd, 0xfc, 0xac, 0x1a, 0x4e, 0x18, 0x6c, 0xac, 0x0e, 0x8d, 0xc5, 0xb8, 0x21, 0x2e, 0x75, 0xa9, 0xcf, 0xa7, 0xa7, 0x1d, 0x9f, 0x18, 0x9d, + 0x8a, 0x63, 0x9a, 0x6a, 0xf1, 0x98, 0xed, 0x12, 0xe1, 0x70, 0x1e, 0x9e, 0x34, 0x38, 0x2b, 0x3e, 0x0f, 0xc5, 0xfb, 0x00, 0x0a, 0xe3, 0x33, 0xb6, 0x00, 0x79, 0xbe, 0x5d, 0xce, 0x90, 0x11, 0x29, 0x18, 0xaa, 0xf6, 0x4d, 0x16, 0x43, 0x10, 0xc5, 0xf0, 0x6f, 0xf0, 0xb5, 0xde, 0xfb, 0x0b, 0xb2, 0x74, 0x66, 0xa8, 0x7e, 0x42, 0xdb, 0xdf, 0xff, 0x82, 0x32, 0x19, 0xbb, 0xfe, 0x3f, 0x00, 0xf0, 0x34, 0xe1, 0x72, 0xf7, 0x0d, 0x3e, 0x27, 0xc0, 0x0f, 0x68, 0x60, 0x21, 0xe1, 0x0f, 0x1f, 0xef, 0xbd, 0x81, 0xf0, 0xc8, 0xa8, 0xf6, 0x57, 0x80, 0xea, 0xc5, 0xcc, 0x26, 0xee, 0x9e, 0xb5, 0xd9, 0x47, 0x92, 0xfa, 0xc5, 0x8b, 0xee, 0x36, 0x5b, 0x88, 0xbb, 0xfa, 0x86, 0xc8, 0xd8, 0x57, 0x78, 0x1b, 0x87, 0x4c, 0x0b, 0xae, 0x50, 0x05, 0x24, 0xd4, 0x0b, 0x35, 0xc4, 0x07, 0x4f, 0xb0, 0xac, 0xd2, 0x16, 0xea, 0x64, 0x6a, 0x67, 0x34, 0x6c, 0x3e, 0x0f, 0xde, 0x9d, 0x24, 0x14, 0x9b, 0x20, 0x2f, 0x0f, 0x0b, 0x6c, 0x00, 0x09, 0x87, 0xf9, 0x02, 0x28, 0xb7, 0x05, 0x40, 0x96, 0x77, 0xa3, 0x4e, 0x8e, 0xb5, 0xe6, 0x0d, 0xce, 0xb9, 0xc6, 0x76, 0xb1, 0x4d, 0xa3, 0xe8, 0x32, 0xff, 0xef, 0xb4, 0xee, 0x57, 0x83, 0x2d, 0xba, 0xba, 0x31, 0x2a, 0xe0, 0xd7, 0xee, 0x4c, 0xd6, 0x28, 0x1e, 0x85, 0x21, 0x97, 0x9a, 0x6e, 0x22, 0xd9, 0x0c, 0xd1, 0xe3, 0xdf, 0x7f, 0xe7, 0x74, 0x54, 0xdc, 0xa9, 0x87, 0x21, 0x26, 0xfc, 0x17, 0x73, 0x90, 0x38, 0xc4, 0x4b, 0x80, 0xf1, 0x6f, 0xcf, 0x5c, 0x1e, 0x6e, 0x65, 0xe7, 0x11, 0x49, 0x7f, 0x92, 0x63, 0x22, 0xa7, 0xda, 0xf1, 0xa0, 0x1e, 0xba, 0xc3, 0x65, 0xbe, 0x44, 0xef, 0x6e, 0x61, 0x21, 0xc3, 0x6e, 0x1b, 0xf8, 0x77, 0x4e, 0xf6, 0x9b, + 0x12, 0x60, 0x21, 0x92, 0x16, 0xc1, 0xef, 0xd1, 0x07, 0x9e, 0x98, 0xe6, 0x20, 0x43, 0x14, 0xae, 0x82, 0x4a, 0x59, 0x78, 0xa2, 0x8a, 0xc0, 0xa8, 0xfb, 0xcc, 0x8e, 0x7e, 0xf5, 0x9e, 0xff, 0xb5, 0xf1, 0xf7, 0x3a, 0x7c, 0x15, 0xf1, 0x51, 0x8e, 0xb2, 0x39, 0xeb, 0xc9, 0x21, 0x3e, 0xcd, 0x7d, 0x3e, 0xbe, 0x57, 0x16, 0x25, 0x21, 0x64, 0xdb, 0x26, 0x62, 0x4e, 0x9f, 0x63, 0x85, 0x2a, 0x04, 0xb7, 0xc0, 0x58, 0xa7, 0x37, 0xd4, 0xc2, 0xf2, 0x25, 0x66, 0xc9, 0x98, 0x7e, 0xba, 0xd2, 0xbf, 0x52, 0x8e, 0xcf, 0x15, 0x0d, 0xa4, 0xc3, 0xa5, 0x4f, 0xf4, 0xa2, 0x32, 0x18, 0xc2, 0x12, 0x6c, 0x4f, 0x6b, 0x01, 0xce, 0xe8, 0xe5, 0xc7, 0x20, 0x3e, 0xe9, 0xb1, 0x16, 0x55, 0x67, 0xae, 0x89, 0x58, 0x41, 0x5b, 0x58, 0x42, 0x04, 0xfb, 0x20, 0x39, 0xd6, 0x57, 0x36, 0x12, 0xd6, 0xbb, 0x58, 0x9f, 0x4e, 0xc3, 0xc1, 0x0f, 0xf8, 0xe6, 0x2f, 0xe0, 0x7e, 0x14, 0xe0, 0x8e, 0x58, 0xe5, 0x3f, 0x90, 0xce, 0xce, 0x35, 0xc7, 0xcd, 0xa7, 0x60, 0xa1, 0xe2, 0xde, 0xee, 0x43, 0x52, 0x56, 0xb3, 0x4f, 0x6f, 0xcf, 0x33, 0xce, 0x64, 0x10, 0xae, 0x94, 0xbf, 0x6d, 0x01, 0x72, 0x38, 0x82, 0x6f, 0x97, 0x3a, 0x68, 0xd8, 0xde, 0xdb, 0x34, 0x55, 0x65, 0xa2, 0x5e, 0x95, 0xcb, 0x6e, 0xdf, 0xed, 0xdb, 0x27, 0x5c, 0xdb, 0x5b, 0x2f, 0x90, 0xc7, 0x0d, 0x41, 0x14, 0x85, 0xbb, 0xf9, 0x0f, 0xb3, 0x5b, 0x31, 0x9e, 0x98, 0xf3, 0x5a, 0x4a, 0x49, 0x30, 0x6e, 0xa1, 0x18, 0xdd, 0xaf, 0x51, 0x25, 0xc5, 0x53, 0x62, 0xe7, 0x4c, 0x6c, 0xfb, 0x6d, 0x7e, 0x6c, 0x25, 0xc1, 0x2f, 0x86, 0x08, 0xd6, 0xc4, 0xdf, 0xa8, 0x18, 0x7f, 0x78, 0x23, 0x73, 0x0f, 0x8d, 0xe1, 0xa4, 0x83, 0xe5, 0x18, 0xfe, + 0x2c, 0xb1, 0x39, 0x76, 0x08, 0xf9, 0x8d, 0xa2, 0x5a, 0x52, 0x75, 0x95, 0x1d, 0x5c, 0x80, 0x17, 0x15, 0xe5, 0x61, 0xf7, 0xe6, 0xc2, 0xab, 0x59, 0x25, 0x66, 0x7e, 0xc5, 0x7a, 0x40, 0x39, 0x23, 0x25, 0xf8, 0xf8, 0x8d, 0xea, 0xc8, 0x22, 0x24, 0x75, 0x65, 0xd5, 0xee, 0x02, 0xb2, 0x17, 0xb5, 0xf0, 0x22, 0xc1, 0x2d, 0x55, 0x1a, 0xee, 0xa4, 0x1b, 0x23, 0x08, 0x20, 0xc5, 0xb8, 0x60, 0xf4, 0x78, 0xb7, 0xa8, 0x1c, 0x1e, 0xa8, 0xf0, 0xc3, 0xab, 0x11, 0x3f, 0xc5, 0x93, 0x43, 0x37, 0xfa, 0x55, 0xb5, 0x2c, 0x02, 0x50, 0x04, 0x13, 0x90, 0x9e, 0xcc, 0x9f, 0x25, 0x6a, 0x2c, 0xef, 0x9a, 0x4f, 0x0c, 0x6d, 0x0c, 0x54, 0xd6, 0xa1, 0xba, 0xc7, 0xef, 0x81, 0x98, 0x81, 0xf4, 0x24, 0xa7, 0x89, 0x26, 0xbd, 0x50, 0xf8, 0x76, 0x80, 0xe3, 0xa2, 0xf3, 0x8f, 0x4b, 0x9b, 0x76, 0xdc, 0x7d, 0xbe, 0x9f, 0x33, 0x2d, 0x8c, 0x74, 0xf0, 0xa8, 0x11, 0x52, 0x10, 0x39, 0xa4, 0xfa, 0x7e, 0x25, 0x1b, 0x4b, 0x22, 0xc7, 0x2d, 0x87, 0xf7, 0xf2, 0xb5, 0x0a, 0x66, 0x3d, 0x3e, 0xd2, 0x98, 0xd1, 0x65, 0x83, 0x71, 0x43, 0x0f, 0x1f, 0x65, 0x10, 0xd8, 0xc1, 0x38, 0x33, 0x84, 0xf6, 0x45, 0xea, 0x82, 0xec, 0x53, 0x0e, 0x58, 0x76, 0xa5, 0xfe, 0x32, 0xe8, 0xa7, 0xc7, 0x5a, 0x24, 0xc9, 0x44, 0x68, 0x1e, 0x49, 0x49, 0xb0, 0xe3, 0x49, 0xb1, 0x3e, 0xc9, 0xb4, 0x2c, 0x33, 0x6c, 0x7c, 0xfe, 0xf3, 0x0c, 0x3c, 0x30, 0x67, 0xba, 0xc2, 0xd4, 0x9b, 0x14, 0x1c, 0xd4, 0x8b, 0xdd, 0xbc, 0xdc, 0x9b, 0x20, 0xd9, 0x75, 0xfa, 0x4d, 0x03, 0x06, 0x83, 0x7e, 0x7b, 0x6b, 0x17, 0x09, 0xcb, 0x91, 0xfd, 0x6a, 0x0d, 0x64, 0x53, 0x52, 0x76, 0xb0, 0x42, 0xb5, 0x6d, 0xa6, 0x32, 0x27, 0x4d, 0x32, + 0xd0, 0x2b, 0x39, 0x15, 0x61, 0x8f, 0xec, 0x45, 0x1e, 0x82, 0xb9, 0x32, 0x8c, 0xd7, 0xb8, 0x89, 0x10, 0xed, 0x87, 0xf6, 0x15, 0xfa, 0xb9, 0xe7, 0xea, 0xc2, 0xab, 0x4e, 0xb1, 0x81, 0xd2, 0x94, 0x0f, 0x47, 0x04, 0xb1, 0x44, 0x06, 0x0c, 0xdf, 0xbc, 0x02, 0x50, 0x36, 0xc9, 0x72, 0x30, 0x5a, 0xf1, 0x5e, 0xc9, 0xec, 0x60, 0xc4, 0xdb, 0x75, 0xca, 0xfe, 0x5d, 0x15, 0x3b, 0xc3, 0x88, 0xfb, 0x4b, 0x57, 0x0c, 0xec, 0x00, 0xbb, 0x4b, 0x38, 0xa1, 0x70, 0xcd, 0xb6, 0x4b, 0xce, 0x04, 0xa5, 0x5e, 0x78, 0xa4, 0x5e, 0xbf, 0x25, 0x4f, 0x97, 0x0f, 0x68, 0x54, 0x1b, 0xed, 0x58, 0x9c, 0x37, 0xf6, 0x3d, 0xa2, 0x76, 0x3d, 0x5a, 0x79, 0x04, 0xa0, 0x9b, 0x0b, 0x69, 0xc6, 0x40, 0xc3, 0xf0, 0xcc, 0xb9, 0x42, 0x7a, 0x0d, 0x73, 0x09, 0x8c, 0x42, 0xb1, 0x23, 0xb0, 0x11, 0xcb, 0x9a, 0x5a, 0x02, 0x84, 0x7d, 0xab, 0x3c, 0xb9, 0xaf, 0x71, 0xd6, 0xa0, 0xe5, 0x8d, 0x97, 0xbd, 0x5e, 0x47, 0x2a, 0xb3, 0xfe, 0x82, 0x7b, 0x7a, 0xe8, 0x39, 0xec, 0xe0, 0xe0, 0xb7, 0xfc, 0x07, 0x51, 0x0e, 0x84, 0xbc, 0xd9, 0x5d, 0xf8, 0x4d, 0xe5, 0x33, 0x4e, 0x78, 0xbe, 0x12, 0x34, 0x88, 0x7d, 0xcb, 0xe2, 0xab, 0xe0, 0x49, 0x42, 0x01, 0xf9, 0x85, 0x18, 0xcc, 0xf7, 0x1a, 0xb3, 0x81, 0x58, 0x8f, 0xdd, 0x68, 0x05, 0x82, 0x5d, 0xb3, 0xde, 0x6b, 0x39, 0x9b, 0xdd, 0x03, 0x26, 0x77, 0xc3, 0x6f, 0xa5, 0xd1, 0xd2, 0x47, 0x3d, 0x0d, 0xbe, 0x35, 0x12, 0x88, 0x7f, 0xbd, 0xa6, 0xd1, 0xf5, 0x6d, 0x31, 0x6b, 0x08, 0x7c, 0xae, 0xbf, 0x5a, 0xc3, 0xe8, 0xf2, 0x03, 0xe4, 0x0e, 0xe6, 0xcc, 0x6f, 0xf7, 0xcd, 0x46, 0xa6, 0x2c, 0x0e, 0xae, 0x13, 0x84, 0x7c, 0x17, 0x95, 0x7b, 0x83, 0xd1, 0x16, + 0xef, 0x82, 0x55, 0x09, 0xe9, 0x3f, 0x68, 0x13, 0x90, 0xe9, 0xad, 0x64, 0x98, 0x43, 0x83, 0xb8, 0x6a, 0x55, 0xfa, 0x29, 0x3c, 0xca, 0xe5, 0x09, 0x76, 0x3a, 0xe3, 0x2d, 0x00, 0xd5, 0xd1, 0xce, 0x1f, 0x2c, 0xee, 0xbc, 0xed, 0xd8, 0x6e, 0x98, 0xf1, 0xf9, 0x25, 0x09, 0x67, 0xe0, 0xdc, 0x64, 0xb9, 0xed, 0x4c, 0xa7, 0x88, 0x41, 0xbc, 0x70, 0xfe, 0x4c, 0xfb, 0x2c, 0x7c, 0xf3, 0xc5, 0x80, 0xf9, 0xb5, 0xbb, 0x9c, 0x56, 0xfb, 0xf0, 0x0f, 0xe2, 0x58, 0xa2, 0xa1, 0x7b, 0x43, 0x74, 0x13, 0x7a, 0x63, 0x68, 0x26, 0xc8, 0x9b, 0xb5, 0x45, 0x1a, 0xb3, 0xc4, 0x92, 0xa0, 0x3a, 0x00, 0x1a, 0x9e, 0x45, 0x9d, 0x6e, 0x70, 0x5c, 0x30, 0xb3, 0xf0, 0x4c, 0x48, 0xc4, 0x01, 0xdd, 0xc9, 0x9b, 0xd4, 0x54, 0xd9, 0x35, 0x13, 0x99, 0x3b, 0xb7, 0xd2, 0x88, 0xe9, 0x90, 0x25, 0xad, 0xc5, 0xa7, 0x99, 0x1f, 0x44, 0xe6, 0x5c, 0x5b, 0x3f, 0xc2, 0xb5, 0x91, 0x08, 0x5e, 0x6a, 0xe9, 0xba, 0x08, 0xa9, 0x6e, 0x75, 0x33, 0x25, 0xf2, 0xe8, 0x19, 0xae, 0xcc, 0x6c, 0xc2, 0x32, 0x0c, 0x1d, 0x3c, 0x05, 0x8f, 0x6d, 0xe4, 0xe9, 0x99, 0x2f, 0xbf, 0x9b, 0x0c, 0x9d, 0x88, 0x63, 0x91, 0x24, 0x99, 0x63, 0x92, 0x50, 0xcb, 0x2f, 0xe2, 0x76, 0x8a, 0xd5, 0x95, 0x6c, 0x38, 0x98, 0x3a, 0x16, 0x07, 0x7f, 0x58, 0x2d, 0x27, 0x1f, 0x98, 0x1f, 0x87, 0x38, 0x3b, 0xea, 0x39, 0x05, 0xab, 0x18, 0xae, 0x25, 0xf8, 0xe7, 0x7e, 0xa3, 0x0f, 0x12, 0xa4, 0xd9, 0x19, 0xa9, 0x5d, 0xda, 0xa3, 0x7b, 0xfb, 0x20, 0x81, 0x0e, 0x1f, 0x7a, 0xfa, 0x08, 0x3e, 0xd8, 0x9d, 0xd2, 0xe5, 0x2a, 0x9c, 0xb4, 0x22, 0x17, 0x5e, 0x06, 0x76, 0x07, 0xef, 0xb8, 0x78, 0x87, 0xb5, 0x60, 0xca, 0x2f, 0x5f, 0xc5, 0x82, + 0x08, 0x7e, 0xe0, 0x90, 0x71, 0xc2, 0x4f, 0x29, 0xa2, 0x63, 0x7c, 0x2d, 0xab, 0xab, 0xc5, 0xbd, 0xcc, 0x40, 0xe3, 0x0d, 0x52, 0xfe, 0x3d, 0x4c, 0x34, 0xaa, 0xdb, 0xac, 0x4f, 0xeb, 0x5a, 0x1f, 0xef, 0x06, 0x72, 0x08, 0xe8, 0x36, 0x2a, 0x2f, 0x9e, 0xdf, 0x90, 0x8a, 0x0f, 0x23, 0x61, 0xa2, 0x29, 0x88, 0x84, 0xb4, 0xb7, 0xd0, 0x24, 0x5a, 0xde, 0x7e, 0x94, 0x03, 0x1d, 0x48, 0x81, 0x13, 0x1b, 0x46, 0xa4, 0x14, 0x4d, 0x02, 0x47, 0x66, 0x0d, 0xce, 0x81, 0x78, 0x15, 0xc4, 0x04, 0x2d, 0xbb, 0xcc, 0x2f, 0xba, 0x8e, 0x53, 0x1e, 0x47, 0x8e, 0xd4, 0xa5, 0x99, 0x02, 0xc8, 0x19, 0x40, 0x99, 0x4f, 0xb6, 0xc8, 0x8e, 0xd3, 0xab, 0x72, 0xdc, 0x05, 0xe1, 0x16, 0x4d, 0xea, 0x2d, 0x8b, 0xeb, 0xd3, 0xf9, 0xd2, 0x74, 0x26, 0x2c, 0x36, 0x81, 0xfe, 0x06, 0xe0, 0x5f, 0x66, 0x32, 0xc9, 0xd0, 0x04, 0x0b, 0xd0, 0x34, 0xb8, 0xe0, 0xb7, 0x90, 0x2f, 0xe5, 0xf2, 0xb9, 0x6a, 0x0e, 0xee, 0x5c, 0xdd, 0x05, 0xe1, 0xc4, 0xdb, 0xb9, 0xf3, 0xf2, 0x3e, 0xc7, 0x34, 0xc4, 0x36, 0x3a, 0xb1, 0xe1, 0x16, 0x92, 0xa3, 0xc5, 0x7f, 0xc3, 0x96, 0x22, 0x54, 0x48, 0x5b, 0x12, 0x44, 0x5b, 0x1d, 0xb7, 0xa4, 0xcb, 0x7c, 0x32, 0x4d, 0x3d, 0x73, 0x4a, 0x41, 0x78, 0xc2, 0x9a, 0x2a, 0xe2, 0x59, 0xf6, 0xd9, 0xf3, 0xc3, 0xfe, 0xba, 0x28, 0x7c, 0xa9, 0x9f, 0xe8, 0x8f, 0xdb, 0x40, 0x73, 0x7d, 0xc8, 0xf3, 0x9c, 0x18, 0xb6, 0x64, 0xd7, 0x8a, 0x53, 0xc5, 0x0c, 0x76, 0x00, 0x4d, 0x9b, 0xdb, 0xcd, 0x8a, 0x99, 0x94, 0x4a, 0x52, 0x8f, 0x0d, 0xb9, 0x6a, 0x19, 0x83, 0x0c, 0x6f, 0xa5, 0x4f, 0x93, 0x90, 0x88, 0x1a, 0xbb, 0xf8, 0x47, 0xd6, 0xa2, 0x38, 0x35, 0x63, 0x9d, 0xaa, 0x8a, 0x40, + 0x72, 0x42, 0x90, 0xb9, 0x78, 0xc9, 0x94, 0x53, 0xe7, 0x70, 0xf8, 0xf8, 0x7e, 0x4a, 0x7a, 0xb2, 0x31, 0x77, 0x0c, 0xaa, 0x66, 0x99, 0x31, 0x50, 0x60, 0xf3, 0xbd, 0xcf, 0xbf, 0xf1, 0xcb, 0xcc, 0xe4, 0xb2, 0xd1, 0x77, 0xd0, 0xcf, 0x75, 0x94, 0xff, 0x99, 0xd4, 0x89, 0xa6, 0xb9, 0xc7, 0x4b, 0x88, 0x07, 0x41, 0x46, 0xe0, 0xbd, 0x01, 0xf8, 0xb9, 0xae, 0xb7, 0x31, 0x3d, 0xb3, 0xab, 0x63, 0xda, 0xef, 0x42, 0x8e, 0x10, 0x3b, 0xc9, 0x8b, 0x2c, 0x35, 0xcb, 0x6c, 0xa9, 0x7d, 0x50, 0x04, 0x18, 0xa6, 0x8d, 0xab, 0x19, 0x90, 0x1c, 0xf6, 0x64, 0x18, 0xd7, 0x17, 0x68, 0xa4, 0xd2, 0x67, 0xaf, 0x66, 0x0c, 0xe5, 0x5f, 0x0c, 0x31, 0xc7, 0xbd, 0x9b, 0x19, 0xbb, 0x67, 0x7a, 0xce, 0x04, 0xa6, 0x75, 0x1c, 0x9a, 0xb0, 0xef, 0x4b, 0xf6, 0x02, 0x46, 0x41, 0xfb, 0x9d, 0x93, 0x03, 0x8f, 0x02, 0xe8, 0x71, 0x53, 0x0c, 0x55, 0x4a, 0x75, 0x8d, 0x40, 0xed, 0x31, 0x01, 0x33, 0x9a, 0x01, 0x17, 0xbb, 0xf4, 0xfb, 0x4a, 0xda, 0xe3, 0xf6, 0x3c, 0x17, 0x11, 0xa4, 0x24, 0xb5, 0x95, 0x8c, 0x6c, 0x62, 0x38, 0xff, 0x4f, 0xdc, 0xb4, 0x6e, 0xc1, 0x4d, 0x59, 0xc8, 0x7c, 0x5a, 0x1b, 0x2e, 0x9e, 0xec, 0xf0, 0xfe, 0x47, 0x22, 0xce, 0x5d, 0x76, 0x2e, 0x52, 0x1f, 0xb7, 0xe9, 0xae, 0xfe, 0xc8, 0x58, 0xe2, 0xc7, 0x9e, 0xd0, 0x66, 0x31, 0xfe, 0xfd, 0x3c, 0x8b, 0x80, 0x8f, 0x6f, 0xec, 0x49, 0x28, 0x0c, 0x0c, 0x00, 0xe2, 0xe3, 0xab, 0x73, 0x45, 0x27, 0x6f, 0x11, 0xd5, 0xba, 0x38, 0xe6, 0x72, 0x41, 0x4b, 0x1a, 0x09, 0xe5, 0x8c, 0x0d, 0x34, 0x9a, 0x71, 0x32, 0x45, 0x46, 0xee, 0xb6, 0x00, 0xa0, 0x86, 0x03, 0xd9, 0x7d, 0x56, 0xa4, 0xc8, 0x21, 0x96, 0x1b, 0xf1, 0xe3, 0x54, + 0x44, 0x88, 0x07, 0x87, 0xe7, 0xd5, 0xbd, 0x22, 0xbf, 0xae, 0x92, 0x7a, 0x3c, 0xd5, 0x1f, 0x37, 0x00, 0x27, 0x94, 0x73, 0x1d, 0x32, 0x3e, 0x90, 0x89, 0xcf, 0xdd, 0x7a, 0x78, 0x9c, 0xc2, 0x8e, 0x55, 0x40, 0xf4, 0x88, 0xd2, 0xcf, 0x58, 0xe1, 0xdd, 0x71, 0x4f, 0xaf, 0x06, 0x7e, 0xd8, 0xd7, 0x4e, 0xb8, 0xd0, 0x0c, 0x76, 0x21, 0x50, 0xda, 0x49, 0x98, 0xa8, 0x0b, 0x34, 0xce, 0xe0, 0xba, 0xf1, 0xcf, 0x44, 0x87, 0x9e, 0x65, 0x08, 0x0c, 0xd6, 0xda, 0x1f, 0x2e, 0x71, 0x08, 0xf3, 0xbe, 0xe0, 0x25, 0x93, 0xea, 0x4e, 0xef, 0xb5, 0x2a, 0x17, 0x27, 0xfb, 0x67, 0xe0, 0xd2, 0x8b, 0x3b, 0x2b, 0x2a, 0x7b, 0x9e, 0x35, 0x6f, 0x11, 0x9d, 0xd9, 0x46, 0x57, 0xd7, 0x2a, 0x7e, 0x15, 0xaf, 0x92, 0x7b, 0xfd, 0xd4, 0x08, 0xe1, 0x9f, 0x66, 0xca, 0x0b, 0x8d, 0x95, 0x24, 0x27, 0x79, 0xf0, 0xc0, 0x6a, 0xec, 0xb9, 0x53, 0x69, 0x14, 0xc7, 0xd7, 0x37, 0x54, 0x66, 0xfa, 0x89, 0x46, 0xc3, 0xf4, 0x54, 0x41, 0x58, 0x0b, 0xcf, 0x22, 0x59, 0x0b, 0xbc, 0x14, 0xbf, 0x8e, 0x07, 0xd2, 0x9c, 0x9a, 0x10, 0x54, 0x95, 0x7f, 0x8e, 0x4a, 0x3f, 0xa0, 0xb9, 0x0f, 0x56, 0xa4, 0xe8, 0x8e, 0xd1, 0x7d, 0x28, 0xa0, 0x63, 0xa4, 0xd5, 0xfa, 0xea, 0xc2, 0x0c, 0x1c, 0xd5, 0xc5, 0x02, 0x7e, 0xf7, 0x46, 0x3f, 0xa2, 0x5f, 0x0f, 0xdc, 0x14, 0x98, 0xa2, 0xe7, 0x4b, 0x84, 0x6c, 0xf2, 0xee, 0x70, 0xcc, 0xd0, 0x2a, 0x6f, 0xf2, 0x4e, 0xf8, 0xfd, 0x5e, 0x37, 0x9a, 0xe8, 0x70, 0x16, 0xb8, 0xf8, 0xc2, 0x0b, 0x1e, 0x46, 0x20, 0xa9, 0xc3, 0xae, 0x55, 0x66, 0x18, 0x51, 0x93, 0x02, 0xf3, 0x67, 0xa4, 0xa2, 0xa3, 0x47, 0x20, 0x35, 0x88, 0xfa, 0x40, 0x3c, 0xce, 0x17, 0x90, 0x76, 0x3d, 0xbd, + 0x5c, 0x80, 0xb8, 0xca, 0xff, 0x57, 0x66, 0xb2, 0xd3, 0x06, 0xcd, 0x91, 0xf5, 0x6a, 0xd7, 0x42, 0x99, 0x79, 0xd9, 0x67, 0xe1, 0x90, 0x6d, 0x58, 0x54, 0xf6, 0xf2, 0x1f, 0xbd, 0x6e, 0x3c, 0xfe, 0x52, 0xca, 0x56, 0x46, 0xb4, 0x3d, 0x13, 0xdc, 0xc0, 0xb9, 0xe4, 0x7d, 0xac, 0xd8, 0x60, 0x0d, 0xbc, 0xa3, 0x38, 0x1c, 0xab, 0x20, 0xfb, 0x92, 0x40, 0x29, 0x43, 0xbe, 0x5d, 0x18, 0x5a, 0xa5, 0x6a, 0x11, 0xbf, 0x15, 0xdd, 0xe6, 0x2d, 0xf4, 0x8e, 0x14, 0x2c, 0xb7, 0x26, 0xa9, 0xfc, 0xe2, 0xcd, 0x82, 0x52, 0x96, 0x26, 0x66, 0x78, 0x0b, 0x25, 0x67, 0xdb, 0x33, 0xff, 0x06, 0x94, 0x52, 0x3e, 0x8c, 0x69, 0x21, 0xe1, 0x4e, 0xdf, 0x8e, 0x88, 0xbd, 0x3e, 0xe9, 0xf6, 0x3c, 0xf0, 0x17, 0x98, 0x35, 0x59, 0x68, 0xd0, 0x09, 0x58, 0x22, 0x0a, 0x14, 0x25, 0xb7, 0xad, 0xb3, 0x94, 0x65, 0x59, 0x2a, 0x26, 0x38, 0x78, 0x10, 0xd8, 0x87, 0x73, 0x15, 0x56, 0x48, 0xc4, 0xc2, 0xa0, 0xcc, 0x2c, 0xf8, 0xeb, 0xe2, 0x8c, 0x92, 0xfe, 0x1c, 0x57, 0xb4, 0xbb, 0x33, 0x9b, 0xa3, 0x15, 0x0a, 0xaa, 0xb2, 0x83, 0xd8, 0xeb, 0xc5, 0x21, 0xbc, 0x36, 0x77, 0x22, 0x50, 0x9b, 0x12, 0xe9, 0x54, 0xf5, 0x97, 0x2e, 0xba, 0x45, 0x2c, 0xf8, 0x2f, 0xaa, 0x9b, 0xa8, 0x62, 0x8e, 0x72, 0x65, 0x95, 0xe6, 0x4f, 0x8b, 0x6f, 0xc9, 0x89, 0x67, 0x88, 0x22, 0x2e, 0xdf, 0xd9, 0x8d, 0xfa, 0xb5, 0x90, 0x5c, 0xa1, 0x34, 0x01, 0x85, 0x9f, 0x7c, 0x70, 0x1e, 0xfd, 0x68, 0xe8, 0x84, 0x3f, 0x13, 0x04, 0xaa, 0x8f, 0x3f, 0x1b, 0x58, 0xbd, 0x3a, 0x3c, 0x83, 0x10, 0xac, 0x6d, 0x62, 0x9d, 0x10, 0x19, 0xf6, 0x84, 0xd2, 0x86, 0x96, 0x84, 0xc5, 0x36, 0x87, 0xc1, 0x59, 0xc9, 0x35, 0x17, 0xb1, 0x9c, + 0x82, 0x89, 0x49, 0x44, 0x71, 0x64, 0x83, 0x7f, 0x8c, 0x80, 0x14, 0xf7, 0x1d, 0x40, 0x61, 0x1f, 0xec, 0x12, 0x0d, 0xf3, 0x68, 0x56, 0x1d, 0xef, 0xce, 0x05, 0x9c, 0xd0, 0xb8, 0x4a, 0xa9, 0x4f, 0x00, 0x14, 0x52, 0x76, 0xc1, 0xb2, 0x91, 0xb0, 0xfb, 0x42, 0x3e, 0xa1, 0xb7, 0xfa, 0x1a, 0x1f, 0x36, 0x72, 0x68, 0x19, 0x79, 0x3f, 0xda, 0xd0, 0xf2, 0x97, 0x96, 0x16, 0xdf, 0x86, 0xd0, 0xc7, 0x3f, 0x53, 0x55, 0x3c, 0x90, 0x27, 0xed, 0x8d, 0x56, 0x2f, 0xde, 0x59, 0x90, 0xf1, 0xf5, 0x83, 0xc0, 0x5e, 0xf1, 0xbb, 0xbf, 0xf3, 0xf7, 0xaa, 0x8b, 0x26, 0xe5, 0x05, 0x59, 0x81, 0x06, 0x81, 0x50, 0x84, 0x1f, 0x41, 0x8b, 0xc8, 0x8d, 0xf1, 0x97, 0xf1, 0x00, 0xb7, 0x5f, 0x65, 0x52, 0xb5, 0x9c, 0x5f, 0x0d, 0x7f, 0xa4, 0xc5, 0x63, 0x31, 0xa7, 0x64, 0xed, 0x49, 0xf3, 0x33, 0x02, 0xa2, 0xb8, 0xa9, 0xa0, 0xd4, 0xe6, 0x5c, 0x46, 0x4c, 0x24, 0x60, 0x1a, 0x59, 0x10, 0xfb, 0xbe, 0xdc, 0xe0, 0x5e, 0x15, 0xe1, 0x4e, 0xb4, 0x7f, 0x9a, 0xc9, 0xc9, 0xca, 0xa5, 0x68, 0xd2, 0x62, 0x3e, 0x74, 0x75, 0x53, 0x1c, 0x79, 0x53, 0xa3, 0x0a, 0xbf, 0x79, 0xa6, 0xae, 0xba, 0xc8, 0x59, 0xc0, 0x35, 0xd1, 0x1a, 0x8e, 0x3e, 0xf7, 0x9e, 0x80, 0x63, 0xfb, 0x38, 0x88, 0x7f, 0x9f, 0xd9, 0x35, 0xdf, 0xdb, 0x5a, 0xae, 0x3a, 0xf3, 0x1e, 0x69, 0x90, 0x26, 0xe2, 0xe2, 0x74, 0x5e, 0x9b, 0x75, 0x74, 0x0f, 0x8b, 0xb8, 0x44, 0x37, 0x97, 0x60, 0x7a, 0x32, 0x51, 0x6c, 0x33, 0xf8, 0x02, 0x85, 0x79, 0xa4, 0x60, 0x01, 0xea, 0x27, 0xb8, 0xc8, 0xc0, 0x2f, 0x9a, 0x73, 0x6f, 0xbf, 0x41, 0x74, 0x98, 0x4c, 0x5d, 0xf3, 0x4b, 0x44, 0xe1, 0x7e, 0xac, 0x79, 0x67, 0xe2, 0x14, 0xee, 0x0d, 0xd5, + 0xfc, 0x19, 0x80, 0x95, 0xa6, 0xd5, 0x53, 0xa6, 0xce, 0xe2, 0xef, 0x8e, 0xd6, 0x2c, 0x7c, 0x65, 0x17, 0x8d, 0x43, 0x60, 0xde, 0x31, 0xe0, 0xed, 0x42, 0x56, 0x60, 0x54, 0x8e, 0x51, 0xd1, 0x43, 0xd7, 0x9d, 0x49, 0xe5, 0xf3, 0x30, 0xbf, 0xbb, 0x95, 0x00, 0xa4, 0x42, 0xba, 0xea, 0x26, 0xc3, 0x4f, 0xb8, 0xa5, 0xea, 0xb1, 0x95, 0x1e, 0x02, 0x89, 0x14, 0x71, 0x39, 0x72, 0xb4, 0x08, 0xad, 0xb8, 0x94, 0x87, 0x2b, 0x1c, 0x79, 0x34, 0x63, 0xb7, 0xc8, 0x19, 0x7a, 0xf9, 0xe6, 0xd8, 0x2b, 0x42, 0xba, 0x41, 0xd4, 0x7d, 0xe1, 0x46, 0x9e, 0x58, 0x0b, 0x98, 0x7e, 0xd7, 0xe5, 0x5f, 0xc1, 0xce, 0x5c, 0xbc, 0x6e, 0x9f, 0x86, 0xc4, 0x77, 0x49, 0x54, 0x59, 0x8a, 0x52, 0x7b, 0x0b, 0x1c, 0xba, 0x22, 0xb9, 0x52, 0x91, 0x34, 0x41, 0x21, 0xd4, 0x61, 0x89, 0xad, 0xda, 0xd5, 0x3f, 0xfb, 0x3d, 0xe1, 0xf5, 0x1e, 0x0c, 0xe2, 0x83, 0xb9, 0x95, 0x32, 0xde, 0x64, 0xe7, 0x99, 0x1d, 0x27, 0x1a, 0x28, 0x73, 0x41, 0x40, 0x4b, 0x9f, 0x04, 0xaf, 0x8f, 0x17, 0x52, 0x64, 0xfa, 0xd7, 0x9f, 0xbc, 0x97, 0x08, 0x9f, 0x16, 0x20, 0x9d, 0x66, 0x7a, 0x7b, 0xdd, 0xd3, 0x38, 0x8f, 0x8d, 0x0b, 0x31, 0xc5, 0xb5, 0x95, 0xc4, 0x6b, 0xff, 0xb7, 0x14, 0xa1, 0xa3, 0x54, 0x37, 0x22, 0x93, 0xdb, 0xbd, 0xea, 0x56, 0x5e, 0x89, 0x10, 0x1e, 0x09, 0x20, 0x5d, 0x45, 0xd5, 0x00, 0x83, 0x4a, 0xe5, 0x66, 0xb6, 0x8f, 0x8b, 0x4d, 0xc7, 0x4c, 0x43, 0x31, 0x83, 0x7d, 0xb4, 0x46, 0x09, 0xa5, 0x8f, 0xd5, 0xae, 0xbd, 0x1b, 0xcc, 0x1c, 0x07, 0x75, 0x28, 0x2d, 0xfd, 0xc6, 0x91, 0xc8, 0xa0, 0xf9, 0x18, 0x91, 0x68, 0x4b, 0x73, 0x98, 0xfd, 0xb3, 0x34, 0x25, 0x5e, 0x97, 0x85, 0x77, 0xb2, 0x81, + 0x4b, 0xce, 0xbb, 0xf7, 0x07, 0xfb, 0x00, 0x4d, 0xd6, 0xc0, 0x89, 0xb9, 0x22, 0x39, 0xb6, 0xd2, 0x80, 0x54, 0xed, 0x9b, 0x9b, 0x5a, 0xe8, 0xd4, 0x5c, 0x59, 0xba, 0x86, 0xa4, 0x8e, 0xe1, 0xde, 0x49, 0xde, 0x0e, 0x1a, 0x51, 0x4f, 0x61, 0x92, 0x5f, 0xd0, 0xe1, 0x62, 0x6b, 0xf4, 0x2d, 0xfc, 0x90, 0x4d, 0x6c, 0x56, 0xc7, 0x34, 0x50, 0xf5, 0x6e, 0xe4, 0x12, 0x33, 0x77, 0xb8, 0x43, 0x75, 0x80, 0x8c, 0xb5, 0x8b, 0x8f, 0x9a, 0x26, 0x7c, 0xf5, 0xc6, 0x37, 0x57, 0xc9, 0x88, 0x4b, 0xbe, 0x01, 0x40, 0x8a, 0x04, 0xb3, 0x5b, 0x6f, 0x51, 0xb5, 0x19, 0x73, 0xd0, 0xf2, 0xf9, 0x9c, 0xd8, 0xf8, 0x69, 0xb1, 0xd3, 0xd7, 0x44, 0xae, 0x53, 0xe1, 0xd5, 0x6b, 0xda, 0x62, 0xf6, 0x64, 0x08, 0x67, 0x77, 0x29, 0x6a, 0xec, 0x97, 0x98, 0x8f, 0x11, 0x03, 0xd2, 0x1e, 0xf4, 0x5c, 0x42, 0xff, 0xf9, 0xe9, 0xb0, 0xb2, 0x51, 0x87, 0x78, 0x56, 0x21, 0x04, 0x04, 0xd7, 0x36, 0xf9, 0x75, 0xd0, 0x14, 0x90, 0x1b, 0xd0, 0x0d, 0x0d, 0x68, 0x5a, 0xa9, 0x18, 0xd9, 0x0e, 0x64, 0xfd, 0x0d, 0x40, 0x24, 0xec, 0xfc, 0x3c, 0x30, 0x2f, 0xa5, 0x2f, 0x02, 0x0a, 0xf6, 0x11, 0x4c, 0xc9, 0xa0, 0xf0, 0x5d, 0x50, 0xa7, 0xb1, 0x16, 0xd8, 0xff, 0xb8, 0x03, 0x3d, 0xd1, 0x6c, 0x60, 0x29, 0x9b, 0x53, 0xb3, 0x19, 0x4c, 0x97, 0xf4, 0xef, 0x49, 0x3f, 0x22, 0x94, 0x4a, 0x26, 0x47, 0x47, 0xb0, 0x26, 0x02, 0xae, 0x2b, 0xb8, 0xc5, 0x43, 0xd8, 0x51, 0x46, 0x50, 0x23, 0x69, 0xd0, 0x68, 0xf7, 0x71, 0x02, 0xd0, 0x82, 0xb1, 0x66, 0x92, 0x5a, 0xd0, 0x94, 0xe7, 0xe5, 0xae, 0x98, 0x21, 0xeb, 0x9c, 0x6d, 0x4f, 0xe0, 0xa2, 0x89, 0x97, 0x29, 0x52, 0x43, 0x14, 0x0d, 0xdf, 0xd7, 0xc3, 0xfb, 0x3c, + 0x3f, 0x41, 0x92, 0x74, 0x5e, 0x8b, 0x24, 0x27, 0x89, 0xf1, 0x96, 0x17, 0x10, 0x36, 0xdf, 0xeb, 0x93, 0x1b, 0xaa, 0x57, 0xfc, 0xf7, 0x8e, 0x4c, 0x5c, 0x78, 0xd4, 0x21, 0xab, 0x5a, 0x9c, 0xbb, 0xaa, 0x88, 0x27, 0x84, 0x0b, 0x3c, 0x80, 0x07, 0x0e, 0x7b, 0x59, 0x19, 0x33, 0x33, 0x44, 0x8e, 0xd4, 0x50, 0x85, 0x71, 0x97, 0xbb, 0x72, 0x52, 0xa0, 0x88, 0x8e, 0x79, 0xd0, 0x86, 0xde, 0xd7, 0xb3, 0x5d, 0x45, 0x5d, 0xc1, 0xb1, 0x98, 0x9e, 0x14, 0x59, 0x7f, 0x6d, 0xac, 0xad, 0x10, 0xe5, 0xb1, 0x0b, 0x49, 0x29, 0x12, 0xe6, 0xc5, 0x29, 0x1c, 0x65, 0xc8, 0x75, 0xa7, 0xca, 0xdc, 0x22, 0x58, 0xb9, 0x92, 0x8c, 0x23, 0xc9, 0xea, 0xc9, 0x1d, 0xbd, 0x06, 0x67, 0xb0, 0x4d, 0xcf, 0xab, 0x5f, 0x0d, 0x41, 0x9a, 0x91, 0x21, 0xaa, 0xc1, 0x41, 0x34, 0x3b, 0x83, 0xed, 0x18, 0xee, 0xc2, 0xb3, 0x62, 0xe3, 0x75, 0xd0, 0x3c, 0xc7, 0x3f, 0x00, 0xf1, 0x05, 0xcb, 0xa2, 0x9f, 0x14, 0xbf, 0x0e, 0x0b, 0x31, 0x8b, 0x5d, 0x05, 0x06, 0xc3, 0x82, 0x27, 0xc6, 0x4b, 0x74, 0x82, 0x90, 0x56, 0x07, 0x57, 0x6a, 0xed, 0x71, 0x0e, 0x22, 0xcd, 0x27, 0x16, 0xb4, 0x97, 0xd1, 0x8d, 0x8f, 0xda, 0x5b, 0xa2, 0x3b, 0x02, 0xaa, 0x9a, 0x2a, 0x47, 0x80, 0xb9, 0xe7, 0x58, 0x93, 0x57, 0x6c, 0xb1, 0x6a, 0xfe, 0x9e, 0xd6, 0x29, 0x6a, 0x07, 0xb4, 0xfb, 0xea, 0xb7, 0x6a, 0x03, 0xa4, 0xc4, 0xfc, 0x73, 0xdc, 0x1d, 0x9e, 0x89, 0xc4, 0xd2, 0xe2, 0x41, 0x51, 0xb6, 0xbd, 0xb8, 0x7a, 0xa2, 0x7d, 0x12, 0x78, 0x9c, 0xe7, 0x81, 0xcd, 0x56, 0x0f, 0x69, 0x25, 0x22, 0xca, 0x53, 0xa5, 0x3b, 0xb8, 0x07, 0x9c, 0x6d, 0x76, 0xd0, 0xae, 0x64, 0xa1, 0xc5, 0xea, 0xc0, 0xec, 0x83, 0xda, 0xf7, 0xc9, + 0x04, 0xd5, 0x1a, 0xe5, 0x86, 0x0e, 0x3f, 0x17, 0x3f, 0x4e, 0x22, 0x3f, 0x45, 0x32, 0x04, 0xae, 0x01, 0xb4, 0x52, 0xce, 0x25, 0x48, 0xdb, 0x0a, 0x07, 0x70, 0x71, 0x21, 0xa4, 0x2b, 0xbc, 0x8e, 0xd6, 0x42, 0xfa, 0x74, 0x85, 0x0d, 0xb9, 0x86, 0x2f, 0x1b, 0x82, 0xed, 0x04, 0x7f, 0x35, 0x93, 0xf1, 0x07, 0xc6, 0xac, 0xda, 0xcb, 0xe7, 0x62, 0xc0, 0x4b, 0xcf, 0xe4, 0x1c, 0xf5, 0x15, 0x3c, 0xa1, 0x14, 0x00, 0xcc, 0xb2, 0xcc, 0x21, 0x51, 0x1d, 0x5c, 0x4f, 0x94, 0x5b, 0xe3, 0x90, 0x09, 0x27, 0x91, 0x30, 0x20, 0xe5, 0x54, 0x73, 0xc2, 0x68, 0xc9, 0xf7, 0xb3, 0xc1, 0x1c, 0xfb, 0xf1, 0x8d, 0x30, 0x9f, 0x87, 0x0e, 0x05, 0x34, 0x35, 0x00, 0x92, 0x32, 0x70, 0xa8, 0xcc, 0x64, 0x45, 0x68, 0xae, 0x15, 0xb4, 0xfa, 0x4a, 0x7f, 0xd4, 0xaf, 0xe5, 0x35, 0x1b, 0x88, 0x91, 0x4b, 0x0a, 0x7a, 0x3f, 0x7f, 0x66, 0x6e, 0xb8, 0x2b, 0xfa, 0xb5, 0x09, 0x2c, 0x45, 0x28, 0x96, 0xaa, 0x1a, 0x1c, 0x74, 0x87, 0x76, 0x6d, 0x6a, 0xa1, 0xa3, 0xa0, 0x6c, 0x39, 0xa0, 0x72, 0xb0, 0xe2, 0x66, 0xd3, 0x95, 0x1c, 0x91, 0xfd, 0x4d, 0x7d, 0x42, 0xa2, 0xde, 0x0f, 0x2c, 0x88, 0x3b, 0xa9, 0x14, 0x7b, 0x1d, 0xe4, 0x78, 0x6b, 0xb4, 0xda, 0x65, 0xa0, 0x96, 0x9e, 0xc2, 0xfe, 0x8d, 0xe8, 0x79, 0x98, 0x19, 0xf7, 0x77, 0xe5, 0x08, 0x58, 0xc9, 0x97, 0x97, 0x4d, 0x1f, 0x10, 0x1e, 0x96, 0x96, 0x44, 0x2a, 0x5b, 0xbe, 0x32, 0xca, 0x79, 0x0e, 0xb2, 0x49, 0x50, 0x74, 0x7c, 0x7f, 0x4d, 0xa7, 0xd2, 0x8d, 0x09, 0x44, 0xa9, 0xd7, 0x40, 0x47, 0x96, 0xb4, 0x3a, 0x5e, 0xdb, 0xb2, 0xf3, 0xc4, 0x4f, 0xf7, 0x5a, 0xdb, 0xbe, 0x04, 0x2f, 0x54, 0x75, 0xee, 0x5d, 0x62, 0x23, 0x69, 0x5d, 0x08, + 0x4a, 0x7a, 0x1a, 0x4a, 0x97, 0x8d, 0xb8, 0xbd, 0x8d, 0x30, 0xe5, 0x70, 0x73, 0x59, 0x89, 0xdd, 0x37, 0xc5, 0xaf, 0x04, 0x79, 0x26, 0x69, 0xde, 0xc0, 0x8b, 0x2a, 0xe9, 0x33, 0x24, 0xae, 0x01, 0xeb, 0x60, 0xce, 0xca, 0x90, 0xdd, 0x9b, 0x2f, 0x15, 0x55, 0x6c, 0x95, 0x26, 0xbb, 0x8d, 0x84, 0x85, 0x45, 0xd6, 0xf8, 0x0b, 0x3a, 0x67, 0x24, 0xdd, 0x0b, 0x49, 0xac, 0x5d, 0x47, 0x11, 0xd0, 0x4f, 0x86, 0x5c, 0xbe, 0x01, 0xfd, 0x9a, 0xbf, 0x1c, 0x9d, 0x96, 0x09, 0x4b, 0xcf, 0x15, 0x91, 0xf7, 0xc1, 0xdf, 0xfc, 0xe2, 0x97, 0xdc, 0x01, 0x73, 0x61, 0x6c, 0x01, 0xbb, 0xf4, 0xcc, 0x72, 0x1b, 0x81, 0xe6, 0xe9, 0x9f, 0x05, 0xe5, 0xac, 0xbe, 0x9e, 0x48, 0x7d, 0xe3, 0x69, 0xde, 0x54, 0xc7, 0x72, 0xb2, 0x84, 0x8b, 0x8b, 0x2e, 0xd5, 0xa3, 0x18, 0xfc, 0xc9, 0x68, 0xe6, 0xcc, 0x23, 0x58, 0x6a, 0xe9, 0xa0, 0xd0, 0x82, 0x04, 0x8f, 0x34, 0x19, 0xf8, 0x55, 0xbf, 0x66, 0xbe, 0x9e, 0xc1, 0xbc, 0x41, 0xc4, 0xfa, 0xb2, 0x67, 0x31, 0x18, 0xf1, 0xe1, 0xa1, 0x37, 0xe0, 0x61, 0xaf, 0x44, 0x2f, 0x47, 0x17, 0x78, 0xfb, 0x97, 0x3d, 0xca, 0x43, 0xfe, 0x27, 0xdf, 0xcf, 0x76, 0x1d, 0x9c, 0x57, 0xf3, 0x3a, 0x4a, 0x93, 0xcc, 0x51, 0xc1, 0xfa, 0x6e, 0xbc, 0x28, 0x97, 0x1f, 0x9a, 0x84, 0x15, 0xef, 0x87, 0x0f, 0x49, 0x50, 0xee, 0x0e, 0xf6, 0x35, 0x0b, 0x09, 0x7a, 0x43, 0x8b, 0x94, 0xf4, 0xfb, 0x4c, 0x1e, 0x54, 0x09, 0x9f, 0x83, 0x6d, 0x20, 0xfc, 0x81, 0x70, 0x5f, 0x85, 0xd1, 0x1a, 0xc7, 0x17, 0x05, 0x6b, 0x51, 0xa3, 0x37, 0x57, 0x24, 0xae, 0x2e, 0x60, 0x98, 0x20, 0x7c, 0x4c, 0x17, 0xb5, 0x8e, 0x75, 0x57, 0x04, 0xa9, 0xb6, 0xa4, 0x79, 0x82, 0xa1, 0x09, 0x80, + 0xb8, 0x07, 0xe8, 0xe1, 0x82, 0xcd, 0xc3, 0xc3, 0x45, 0x76, 0x68, 0xb0, 0xb2, 0x8b, 0xa1, 0xbc, 0xaf, 0x6c, 0x88, 0x1d, 0x76, 0x02, 0xe0, 0x77, 0x23, 0x73, 0xab, 0xa5, 0x68, 0x2d, 0x15, 0x4b, 0xf1, 0xdd, 0xb8, 0x85, 0xe6, 0x30, 0xac, 0x25, 0x2a, 0x16, 0x2c, 0x3e, 0x48, 0xd4, 0x0a, 0x62, 0x2a, 0x34, 0x5f, 0xd6, 0x8e, 0x24, 0x81, 0xde, 0x4c, 0x23, 0x49, 0x92, 0xde, 0xa4, 0xba, 0xb6, 0x7d, 0x03, 0x46, 0x09, 0x8c, 0x4f, 0x52, 0x64, 0x6a, 0x95, 0x24, 0x57, 0x3a, 0xdd, 0x01, 0xd5, 0x95, 0x71, 0xaf, 0x18, 0x03, 0x10, 0x92, 0x3e, 0xbc, 0x76, 0x92, 0x37, 0xc8, 0x91, 0xfe, 0x5e, 0x59, 0xb5, 0x53, 0x4b, 0x44, 0x90, 0x7e, 0x4e, 0xcc, 0x2f, 0xc4, 0xa1, 0x6a, 0xca, 0xe5, 0xf8, 0x16, 0xfc, 0xd8, 0x86, 0x15, 0x6c, 0xd3, 0x0c, 0x9a, 0xc7, 0xad, 0x07, 0x73, 0x9a, 0x7e, 0xb2, 0x5e, 0x56, 0xa1, 0x8f, 0xa1, 0x18, 0x84, 0x58, 0x5a, 0x0b, 0x7a, 0xe6, 0x10, 0x92, 0x5b, 0xd0, 0x4c, 0x75, 0x46, 0x2a, 0x0b, 0x3a, 0xe1, 0x41, 0xee, 0x5b, 0xad, 0x09, 0x31, 0x13, 0xdf, 0x90, 0x19, 0x65, 0x92, 0x03, 0x59, 0x18, 0x78, 0xdb, 0xdc, 0x6d, 0x11, 0xda, 0x68, 0x77, 0x47, 0xce, 0xd0, 0x79, 0xa3, 0xf0, 0x91, 0x8e, 0x13, 0x24, 0xe6, 0x23, 0x5b, 0xa1, 0x2b, 0xca, 0x53, 0x31, 0x38, 0xe3, 0xd2, 0x86, 0xc4, 0x8a, 0xdb, 0xad, 0xe8, 0xa2, 0x29, 0xef, 0x24, 0xa8, 0x0d, 0xf0, 0x23, 0x7a, 0x25, 0x03, 0xc6, 0xd8, 0xb7, 0xe4, 0x57, 0xf7, 0x8f, 0xf9, 0xaf, 0x7f, 0x3a, 0x26, 0x84, 0xe8, 0x3c, 0x71, 0x32, 0x72, 0x6d, 0x2f, 0x39, 0x4e, 0x67, 0x6b, 0xfc, 0xdd, 0x39, 0x91, 0x6f, 0xa4, 0xbe, 0xed, 0xa3, 0xb3, 0x15, 0xa2, 0x38, 0xbc, 0x5b, 0x5d, 0x23, 0x50, 0x13, 0x5c, + 0x56, 0xd6, 0x87, 0x3c, 0x9d, 0x60, 0xbd, 0x4b, 0x5f, 0x50, 0x01, 0x42, 0xaa, 0x7e, 0x41, 0xc0, 0x9f, 0x25, 0x97, 0x24, 0x4b, 0xa5, 0x1d, 0x34, 0x1c, 0x14, 0xd7, 0x95, 0x63, 0x5e, 0xc2, 0x23, 0x97, 0x41, 0x51, 0xbb, 0x3d, 0x65, 0x3a, 0xd9, 0xbd, 0x6b, 0x5b, 0xc4, 0xd3, 0x07, 0xde, 0x82, 0x1f, 0xf8, 0x55, 0x67, 0x37, 0x17, 0x30, 0x6c, 0xba, 0x9e, 0x77, 0x78, 0xc5, 0xbe, 0xc2, 0xe8, 0x91, 0x65, 0x7b, 0xad, 0xf7, 0x88, 0x4b, 0x21, 0xe8, 0xc0, 0xae, 0x7e, 0x5b, 0x16, 0x74, 0x92, 0xfa, 0xbd, 0x9c, 0x23, 0x7c, 0x16, 0xce, 0x46, 0xf2, 0xcb, 0xba, 0x01, 0xd5, 0x56, 0x7e, 0xf8, 0x1e, 0xe8, 0x91, 0x8c, 0xf6, 0x12, 0xde, 0xb4, 0x7f, 0x69, 0x9f, 0xdc, 0xac, 0xf9, 0x80, 0xc7, 0xc7, 0xb7, 0xe1, 0xde, 0xa7, 0x5e, 0xd7, 0x27, 0x31, 0x7e, 0xf3, 0x17, 0x71, 0x61, 0x04, 0xae, 0x6a, 0x95, 0x85, 0x9e, 0x6d, 0x06, 0xf9, 0xf2, 0x3a, 0x72, 0x02, 0x9e, 0x87, 0xcb, 0xc9, 0x7a, 0xa1, 0x2f, 0xdc, 0x50, 0xbe, 0xdf, 0x1c, 0xfa, 0x3c, 0x1f, 0xc3, 0x68, 0xcd, 0x73, 0xd5, 0xa0, 0x20, 0xf4, 0xb9, 0x41, 0xf5, 0x14, 0x6f, 0x01, 0x05, 0xc5, 0x6b, 0xc1, 0xdc, 0x8a, 0xed, 0x71, 0xdf, 0xc9, 0xb0, 0x7a, 0xb0, 0x5b, 0x00, 0xf5, 0xeb, 0xb8, 0xa4, 0x6c, 0xe3, 0x91, 0x7c, 0x8c, 0x42, 0x90, 0xc4, 0x90, 0x98, 0x33, 0xc1, 0xca, 0x61, 0x77, 0x88, 0xac, 0x46, 0x9d, 0x98, 0xbc, 0x61, 0xe5, 0x2a, 0xa9, 0x9f, 0x29, 0x60, 0xd9, 0xcd, 0xcc, 0x9f, 0x06, 0x2e, 0x60, 0x2f, 0x5c, 0x88, 0xd9, 0xa3, 0x39, 0x31, 0xc1, 0xd6, 0x84, 0xdc, 0xc8, 0x28, 0x77, 0x6b, 0x54, 0x16, 0x0e, 0x0c, 0xa8, 0xbe, 0xbb, 0x3a, 0x46, 0x2d, 0x63, 0x69, 0xe1, 0x68, 0xf5, 0xbc, 0x42, 0x58, 0x7d, + 0x2e, 0xdc, 0xe8, 0x29, 0x84, 0xf8, 0x94, 0x9b, 0x2c, 0x77, 0x14, 0x20, 0x04, 0x44, 0xf9, 0xe9, 0x81, 0x22, 0xb5, 0x00, 0xd7, 0xd9, 0x97, 0x55, 0xc1, 0x82, 0xd6, 0x8a, 0x13, 0xea, 0xa7, 0xb3, 0xf2, 0xbe, 0x94, 0xeb, 0x5e, 0x66, 0x32, 0x8b, 0xbf, 0xd6, 0xdd, 0x34, 0xbb, 0x71, 0xf3, 0x92, 0x7e, 0x29, 0x30, 0x44, 0x2f, 0xb8, 0x13, 0xdf, 0xd6, 0x19, 0xf1, 0x0a, 0xc4, 0x05, 0x37, 0xe4, 0xdc, 0x98, 0x59, 0xac, 0xf0, 0x0b, 0xce, 0x9e, 0x1c, 0xb7, 0x67, 0x10, 0x93, 0x26, 0xb3, 0xee, 0x15, 0x45, 0x57, 0x21, 0xa0, 0x56, 0x8f, 0xbe, 0x1c, 0xc0, 0x65, 0x76, 0xfa, 0x07, 0xf8, 0xb1, 0x94, 0x1b, 0x81, 0xa9, 0x34, 0xe8, 0x0b, 0xb0, 0x75, 0xf0, 0xd6, 0x79, 0x71, 0xcb, 0xb3, 0x7d, 0x7f, 0x29, 0x35, 0x8f, 0x72, 0xe0, 0x2b, 0xd3, 0x2f, 0x63, 0xfe, 0xd1, 0x7d, 0x23, 0x33, 0x85, 0x4d, 0x5a, 0x58, 0x45, 0xd0, 0x0d, 0xc2, 0x02, 0x1a, 0x90, 0x1d, 0xdf, 0x2e, 0xa6, 0x95, 0x01, 0xff, 0x62, 0xa5, 0x7a, 0x0a, 0x36, 0xb8, 0xed, 0xd4, 0xc0, 0x1e, 0x3d, 0x25, 0x99, 0x33, 0x3d, 0xf6, 0xde, 0x2f, 0x49, 0x20, 0x7a, 0xcd, 0x9c, 0x29, 0x81, 0xf7, 0x0b, 0xb8, 0x65, 0xfc, 0xee, 0x35, 0xfc, 0x4c, 0x21, 0x57, 0x3d, 0x34, 0xaf, 0x72, 0x03, 0x5f, 0xa7, 0x01, 0x15, 0xf5, 0xf0, 0x32, 0xb9, 0x7f, 0x02, 0x1b, 0x2f, 0x76, 0xdd, 0x06, 0x9d, 0x5c, 0x93, 0xb6, 0xeb, 0x3f, 0x78, 0x42, 0x1f, 0xa9, 0x64, 0xdc, 0x00, 0x0e, 0x2e, 0xc4, 0x6a, 0x25, 0x09, 0x27, 0x54, 0x52, 0xae, 0xb8, 0x13, 0xc0, 0x08, 0xce, 0x12, 0x32, 0xcc, 0x75, 0x0e, 0xa3, 0x00, 0x7b, 0xa8, 0x9e, 0xef, 0x7c, 0x20, 0x38, 0xd3, 0x50, 0xf8, 0x75, 0xaf, 0x8a, 0x78, 0xf3, 0xc5, 0xef, 0xe9, 0xbc, 0xed, + 0x79, 0x5a, 0x6c, 0xc4, 0xaf, 0x90, 0x5f, 0x02, 0x20, 0xd1, 0xb8, 0x08, 0x41, 0xf1, 0x49, 0x16, 0x5a, 0xb4, 0x1c, 0x65, 0xc4, 0xc9, 0x6b, 0x0a, 0x55, 0x47, 0x94, 0x3c, 0x5a, 0x65, 0x98, 0xdd, 0x78, 0x7c, 0x50, 0x8d, 0x2d, 0x83, 0xdd, 0x34, 0xf3, 0x75, 0xe2, 0x63, 0x61, 0xa6, 0x03, 0xc4, 0x86, 0xac, 0x74, 0x89, 0x60, 0xb6, 0x08, 0x43, 0x8d, 0xfb, 0x2e, 0x39, 0x07, 0x4d, 0x38, 0x42, 0x58, 0xe5, 0xaf, 0x77, 0x6d, 0xf7, 0xad, 0x07, 0xa4, 0xb0, 0x4c, 0xaf, 0x9c, 0x8f, 0xfd, 0xc7, 0xe6, 0x44, 0xa9, 0x78, 0x15, 0x43, 0x9c, 0x4a, 0x72, 0x7c, 0xdd, 0xfd, 0x6a, 0xb9, 0x63, 0xd3, 0xd9, 0xa8, 0xb4, 0x06, 0x28, 0x2f, 0xe6, 0x17, 0x38, 0x67, 0xbd, 0x57, 0xd6, 0xe7, 0x28, 0xc8, 0x1b, 0x74, 0x1f, 0x0e, 0x21, 0xe3, 0x7e, 0x1b, 0x4b, 0x1f, 0x27, 0xdb, 0xe7, 0x0c, 0x60, 0xc4, 0xb9, 0xb8, 0xf0, 0x78, 0xdc, 0xe1, 0xca, 0xa1, 0x26, 0x78, 0xbe, 0x5f, 0xa9, 0x04, 0xe7, 0xa9, 0x36, 0xfb, 0x55, 0xc9, 0xbf, 0x36, 0x5b, 0xd0, 0x2d, 0x8c, 0xae, 0x66, 0x85, 0x0b, 0x67, 0x0f, 0x31, 0x8e, 0x3d, 0x2b, 0x94, 0x12, 0x19, 0xc3, 0xfa, 0xd9, 0x0d, 0x12, 0xfd, 0x97, 0x70, 0x02, 0x0e, 0xd5, 0xb7, 0x24, 0x9f, 0x79, 0x0f, 0x24, 0x43, 0x60, 0x01, 0x05, 0xc2, 0xd2, 0xa3, 0x34, 0xe0, 0x45, 0xc2, 0x4f, 0xf2, 0x23, 0x71, 0x18, 0x6a, 0xc0, 0x3b, 0x51, 0x5c, 0xad, 0x77, 0x50, 0x5d, 0xbc, 0x7c, 0x21, 0xe8, 0x1f, 0x29, 0x20, 0x73, 0xc3, 0xba, 0xa1, 0x00, 0x00, 0x43, 0x9f, 0xe6, 0xf5, 0x39, 0x71, 0x6a, 0x66, 0x06, 0xaa, 0x95, 0x37, 0xec, 0xdf, 0xe7, 0x07, 0x3f, 0x50, 0xa5, 0x13, 0x1c, 0x99, 0xca, 0xcd, 0xa8, 0x81, 0x78, 0x20, 0xa7, 0x51, 0x44, 0xe7, 0x2c, 0x7f, + 0xca, 0x5a, 0xc4, 0xb3, 0x48, 0xc4, 0xaf, 0x80, 0xa8, 0xf1, 0x7d, 0x3c, 0x5d, 0xd5, 0x3d, 0x3b, 0xbe, 0x74, 0xd3, 0xb6, 0x0f, 0xdc, 0x10, 0x6a, 0xe1, 0xbc, 0x37, 0xf3, 0xfe, 0x58, 0x9d, 0x3f, 0x71, 0xff, 0xf9, 0x71, 0x9f, 0xb9, 0xf3, 0x00, 0x18, 0x4c, 0x3d, 0x85, 0xe5, 0xcb, 0x9c, 0x2b, 0x9b, 0x30, 0xff, 0x71, 0x17, 0x88, 0x01, 0x5b, 0x7e, 0xa2, 0x0b, 0xc5, 0x9a, 0x07, 0x6d, 0xd4, 0x09, 0x2a, 0x89, 0xe0, 0x5f, 0x93, 0xda, 0xa0, 0x69, 0xc0, 0x84, 0x9b, 0x70, 0xcd, 0x1a, 0x47, 0x68, 0x78, 0xcd, 0x10, 0xe8, 0xbd, 0xbc, 0xe1, 0x73, 0xa4, 0xd7, 0x8c, 0xa6, 0x51, 0xab, 0x44, 0xe3, 0xaf, 0x79, 0xd5, 0xa3, 0x1f, 0x74, 0x48, 0xbf, 0xfe, 0xbc, 0xd5, 0xcd, 0xf5, 0x3e, 0x76, 0x52, 0x11, 0x9a, 0xe3, 0x5d, 0xf3, 0xe2, 0x94, 0x11, 0x6e, 0x8b, 0x41, 0x4a, 0x58, 0xa1, 0x77, 0x72, 0xcd, 0x3a, 0x9b, 0x92, 0xa7, 0x8b, 0xca, 0x7b, 0x3f, 0x9a, 0x8d, 0xb7, 0xb3, 0x61, 0x6d, 0xf8, 0x85, 0x16, 0x64, 0x7c, 0x62, 0xcc, 0x07, 0x5f, 0xaa, 0xdd, 0x41, 0xc3, 0xc6, 0xfd, 0x2e, 0x7a, 0x66, 0xc8, 0x76, 0x3d, 0x1a, 0x0e, 0xcb, 0x9e, 0xf6, 0x01, 0xa1, 0xe5, 0x2a, 0xd5, 0xd7, 0x7e, 0xc7, 0x46, 0x24, 0xc3, 0xe2, 0x33, 0x50, 0xe9, 0x0c, 0x9f, 0xa4, 0xb8, 0x0d, 0xa6, 0x18, 0x5c, 0x05, 0xe1, 0x44, 0xd5, 0xe2, 0xe8, 0x51, 0x29, 0xfc, 0x0f, 0xbb, 0x8a, 0xed, 0xb9, 0xd2, 0xa7, 0x13, 0xcb, 0x6d, 0x05, 0x35, 0xd4, 0x32, 0xd1, 0x67, 0x53, 0x26, 0xb2, 0x2b, 0x29, 0xd1, 0x4c, 0x54, 0xb1, 0x26, 0x75, 0x64, 0xb9, 0xdd, 0x27, 0x67, 0x54, 0xd5, 0xa5, 0xb4, 0x0f, 0xad, 0x26, 0xb8, 0x4e, 0x5b, 0xa3, 0x3f, 0x46, 0x39, 0x03, 0x95, 0xb0, 0x35, 0x18, 0x35, 0x81, 0xa2, + 0x65, 0xd0, 0x96, 0x9a, 0x9d, 0xf3, 0x59, 0xab, 0x3d, 0x73, 0x68, 0xf1, 0xac, 0xa0, 0xd5, 0xde, 0x85, 0x9b, 0x6b, 0xf5, 0x3c, 0x2f, 0x0d, 0x15, 0xd0, 0x91, 0x1d, 0xd5, 0x49, 0x3b, 0x09, 0x0d, 0xc4, 0x3f, 0x66, 0x3b, 0x60, 0x48, 0xf9, 0xa3, 0x03, 0xe5, 0x63, 0x3a, 0xcd, 0x65, 0x4a, 0x70, 0x89, 0x9a, 0x5c, 0x30, 0x92, 0x92, 0xb6, 0xcf, 0x0c, 0x7e, 0x81, 0xb2, 0xc5, 0xc8, 0xba, 0x54, 0xb7, 0x54, 0x27, 0x36, 0x6f, 0xd7, 0x2b, 0xf5, 0xad, 0xad, 0xbb, 0xd8, 0xeb, 0x5b, 0xa0, 0x18, 0xa6, 0x82, 0x52, 0x85, 0x2f, 0x76, 0xf1, 0x61, 0x22, 0x73, 0xcf, 0x10, 0x56, 0x3f, 0xd3, 0x0e, 0xdb, 0x0a, 0x6d, 0xb4, 0x17, 0x83, 0x11, 0x92, 0x7f, 0x58, 0x2f, 0xee, 0xb7, 0x4e, 0xdc, 0x91, 0xf4, 0x35, 0x66, 0x3c, 0xa3, 0xe3, 0x0b, 0x7a, 0xad, 0x7d, 0x9d, 0xce, 0x11, 0x66, 0xbe, 0x17, 0xce, 0xc3, 0xae, 0x14, 0xcb, 0x4f, 0xd0, 0xee, 0xf7, 0x0d, 0xaa, 0x89, 0x5f, 0x7c, 0x0d, 0x86, 0xb0, 0x8c, 0xcc, 0x2d, 0x95, 0x5a, 0xe2, 0x5c, 0xa8, 0xe4, 0xbb, 0x91, 0x8b, 0x84, 0x05, 0xa1, 0xd7, 0xe8, 0x6a, 0x4e, 0x47, 0x7f, 0x49, 0x5f, 0x25, 0x16, 0x9d, 0xeb, 0x81, 0x18, 0x91, 0x69, 0x16, 0x75, 0xb2, 0xec, 0x3b, 0x42, 0xa6, 0x95, 0xa0, 0xbb, 0x0d, 0x18, 0xd5, 0xc7, 0xfd, 0x85, 0x05, 0x8b, 0xd9, 0x20, 0xf9, 0x1a, 0x41, 0xb8, 0xc0, 0x6a, 0xb3, 0x91, 0xa3, 0x94, 0x8f, 0xaa, 0x2a, 0xb2, 0xe7, 0x14, 0x3b, 0x95, 0x08, 0x47, 0xff, 0xde, 0x8b, 0x15, 0x98, 0x2d, 0x33, 0x0d, 0xf2, 0x03, 0xe2, 0xda, 0x64, 0x00, 0x50, 0x53, 0x7e, 0x64, 0xd0, 0x75, 0x4d, 0x1c, 0x31, 0x1e, 0xc4, 0xc0, 0xf8, 0x9b, 0xc1, 0x12, 0x76, 0xef, 0xa1, 0x24, 0xa1, 0x2a, 0xa3, 0xa3, 0x07, 0x89, + 0x6c, 0xd3, 0x14, 0xe5, 0x81, 0xd1, 0x22, 0xf9, 0x4a, 0x4e, 0x79, 0xb9, 0x1b, 0x96, 0x50, 0x28, 0xea, 0xdf, 0xbb, 0x26, 0x93, 0xb2, 0x5d, 0xae, 0x97, 0xa8, 0xed, 0x5c, 0xf9, 0x6f, 0xea, 0x61, 0x81, 0xb6, 0x24, 0xe2, 0xa6, 0x2d, 0x04, 0x51, 0x4c, 0x9f, 0xc8, 0xec, 0x1a, 0x05, 0x0b, 0x9d, 0x2d, 0x09, 0x98, 0x46, 0x71, 0xb6, 0x01, 0x3f, 0x64, 0x15, 0xae, 0xd4, 0x8e, 0xb3, 0xde, 0x98, 0x32, 0xb5, 0xc6, 0x7e, 0xbb, 0xd4, 0x8e, 0x58, 0x4c, 0x9f, 0x39, 0x69, 0x18, 0xb5, 0x77, 0x1a, 0x9d, 0x39, 0x1b, 0xee, 0xa4, 0x4a, 0x93, 0x6c, 0x3b, 0x29, 0x28, 0x43, 0x40, 0x0b, 0x7c, 0x97, 0xfc, 0x72, 0xb5, 0x97, 0xb4, 0x21, 0x79, 0xe3, 0x05, 0xaa, 0xa6, 0xa1, 0x06, 0x08, 0xc3, 0x5f, 0xee, 0x0c, 0x1f, 0xd9, 0xfd, 0xfe, 0x8c, 0x26, 0xa4, 0xf5, 0xcc, 0x33, 0xb9, 0xa8, 0x4f, 0x4b, 0x29, 0x65, 0x20, 0x84, 0x20, 0x01, 0x5c, 0x4a, 0x2b, 0x07, 0xd3, 0x23, 0x17, 0xc0, 0x54, 0xf4, 0x6d, 0x70, 0x0e, 0x9e, 0x01, 0x3e, 0xb9, 0xb6, 0xa9, 0xf7, 0x4c, 0x5a, 0xba, 0xe2, 0xfa, 0x70, 0xcd, 0x49, 0x05, 0xe1, 0x55, 0x23, 0x62, 0xea, 0xf7, 0x01, 0xe5, 0xf9, 0xdc, 0x40, 0x19, 0xfa, 0x49, 0x66, 0x86, 0xba, 0x90, 0xa6, 0x5b, 0x3b, 0x30, 0x85, 0x20, 0x5f, 0xac, 0x2b, 0x59, 0x20, 0xcb, 0xd6, 0x64, 0x5a, 0x9c, 0x26, 0x5d, 0xf8, 0x7a, 0x76, 0x97, 0x19, 0xb6, 0xfc, 0xab, 0x6c, 0x30, 0xbe, 0x92, 0x53, 0x7c, 0xe3, 0xa3, 0xfb, 0xdf, 0x64, 0x59, 0xe8, 0x25, 0x8b, 0x41, 0xc9, 0x48, 0x35, 0xb3, 0x72, 0x5d, 0x47, 0x98, 0x6f, 0x84, 0x15, 0x58, 0x24, 0x25, 0xd8, 0xe0, 0x37, 0x85, 0xd5, 0x32, 0xc2, 0xec, 0xba, 0x36, 0x5c, 0x48, 0x8a, 0xeb, 0x61, 0x85, 0xdf, 0x29, 0xdd, + 0x5d, 0x46, 0xe5, 0x83, 0x89, 0x9d, 0xd3, 0x5d, 0x6b, 0x06, 0xd2, 0x4c, 0xbb, 0x49, 0x74, 0xad, 0x32, 0x89, 0xd1, 0x1a, 0xbf, 0x32, 0x9f, 0x04, 0xc3, 0x75, 0x0e, 0x67, 0xab, 0xac, 0x09, 0x8f, 0xea, 0x6c, 0xbf, 0x02, 0xac, 0xfa, 0xb1, 0xe9, 0x9c, 0x8b, 0xb4, 0xbe, 0x24, 0xb6, 0x6d, 0x7e, 0x00, 0x02, 0xa4, 0xee, 0x8d, 0x02, 0xa2, 0xfa, 0x00, 0xea, 0xda, 0xcd, 0xf5, 0xb9, 0xb2, 0x8d, 0x5a, 0x48, 0x79, 0xa0, 0x4b, 0x75, 0xcf, 0xfa, 0x04, 0x0c, 0xbe, 0x08, 0x42, 0xb4, 0xf9, 0xb4, 0x66, 0x4b, 0x2b, 0x9a, 0x24, 0x09, 0xd9, 0x22, 0xb3, 0x7f, 0x07, 0x43, 0xee, 0x57, 0x54, 0x6d, 0xe4, 0xd7, 0x73, 0x2b, 0x3b, 0xf6, 0x4c, 0x98, 0x8c, 0xf4, 0xe8, 0x95, 0xfb, 0x12, 0xd4, 0xc1, 0x53, 0x51, 0x62, 0x21, 0xe8, 0x6b, 0xd2, 0x93, 0x01, 0x9d, 0xa6, 0x59, 0xbb, 0x70, 0xae, 0x01, 0x0c, 0xa2, 0x9e, 0xac, 0xd2, 0x1e, 0x80, 0x39, 0xa2, 0xae, 0x2f, 0x41, 0xc4, 0xa8, 0x7f, 0x29, 0xc8, 0xf7, 0xdb, 0x5c, 0x06, 0xc8, 0x36, 0x70, 0xe8, 0x65, 0x9e, 0xf0, 0x2e, 0xf3, 0x55, 0x4c, 0xb0, 0x0c, 0x52, 0xeb, 0xa7, 0xe8, 0xc8, 0x7a, 0x29, 0xe0, 0x47, 0xfd, 0x96, 0xe2, 0xfb, 0x9b, 0x46, 0x17, 0x52, 0xc3, 0x79, 0xf3, 0xbe, 0x05, 0x20, 0x1c, 0x25, 0xdd, 0x77, 0x5e, 0xd1, 0x4b, 0xf1, 0xc8, 0xd9, 0x99, 0xaf, 0x0b, 0x7a, 0x3e, 0xa2, 0x90, 0x3f, 0x01, 0x9e, 0x5c, 0x9a, 0xbd, 0x6e, 0xca, 0x10, 0xd7, 0x25, 0x64, 0xe5, 0xe1, 0xf9, 0x56, 0x8f, 0x43, 0x2a, 0x4f, 0x0b, 0xe4, 0x53, 0xf7, 0xd7, 0x0f, 0x58, 0xff, 0x47, 0x1b, 0x4a, 0xfc, 0xca, 0xf2, 0x32, 0xfc, 0xce, 0x22, 0xbe, 0x5a, 0xd4, 0xb8, 0x5d, 0x84, 0xb5, 0xb0, 0x42, 0x21, 0xc1, 0x9d, 0xbf, 0xb4, 0xac, 0x08, + 0x91, 0xc1, 0x2e, 0x88, 0xbb, 0xf0, 0x51, 0xfd, 0xcc, 0x98, 0x3f, 0xd1, 0x73, 0x37, 0xad, 0xf1, 0x39, 0xe3, 0x09, 0x31, 0xe5, 0xa7, 0x85, 0x21, 0xdc, 0xc5, 0xc0, 0x4e, 0x02, 0x41, 0x82, 0x7f, 0x88, 0x19, 0xcf, 0x79, 0x0f, 0x0a, 0x04, 0x0b, 0x88, 0xc5, 0x1b, 0xa2, 0x85, 0x03, 0x0a, 0xd4, 0x36, 0x7c, 0xf9, 0x49, 0x77, 0x8b, 0x39, 0x33, 0xc9, 0xa0, 0xac, 0xdb, 0x3b, 0xfb, 0xf5, 0x79, 0x53, 0x8f, 0x34, 0xc1, 0xfb, 0x99, 0x41, 0x4c, 0x97, 0x91, 0x30, 0xce, 0x53, 0xf4, 0x6f, 0x62, 0x79, 0xb6, 0x78, 0x87, 0xec, 0x97, 0xaf, 0xf7, 0x04, 0x63, 0x5f, 0xd6, 0x7a, 0x66, 0x3d, 0xd0, 0x4c, 0x55, 0x38, 0x75, 0xc6, 0xe1, 0xc5, 0x35, 0x1e, 0x61, 0xdb, 0x6b, 0xce, 0xc5, 0x3e, 0x17, 0x8a, 0x01, 0x98, 0xdc, 0xdb, 0x6a, 0x8a, 0xc5, 0x59, 0x84, 0x5e, 0xb4, 0x0c, 0xf0, 0x83, 0xab, 0xef, 0x1c, 0x45, 0x4c, 0x3d, 0xa4, 0x71, 0x90, 0xe1, 0xb8, 0xf6, 0xaf, 0x1c, 0xe3, 0x6d, 0x9e, 0x98, 0xe3, 0xfe, 0xf0, 0x18, 0x74, 0x4f, 0xea, 0x00, 0xbf, 0x3b, 0xfe, 0xb6, 0x5f, 0x07, 0x55, 0xdd, 0x6f, 0xc5, 0x52, 0xf7, 0xe7, 0xfa, 0x71, 0x85, 0x41, 0xc0, 0xf1, 0x90, 0xf3, 0x1a, 0x89, 0xa5, 0x70, 0x56, 0xf1, 0x22, 0x58, 0x3d, 0xa3, 0xf0, 0x37, 0x5d, 0x81, 0x37, 0x23, 0x28, 0x92, 0x8e, 0x69, 0xe3, 0x45, 0x74, 0x33, 0x8f, 0x25, 0xe9, 0xb6, 0x9e, 0xd0, 0x63, 0x96, 0x6d, 0xf6, 0xf8, 0x7a, 0x03, 0xe1, 0x06, 0xaf, 0xb9, 0x78, 0x40, 0x19, 0xa3, 0x8d, 0xa0, 0x07, 0x5d, 0x83, 0x1d, 0xb5, 0x32, 0xe8, 0xb1, 0x50, 0x80, 0x3a, 0x52, 0xd9, 0xbb, 0xb1, 0x69, 0x90, 0xe1, 0xb0, 0x0b, 0x15, 0x99, 0xff, 0xf7, 0xb0, 0xf0, 0xaa, 0x70, 0xd6, 0x9e, 0x20, 0xd5, 0x5b, 0x62, 0xb1, + 0x01, 0xb8, 0xaa, 0x20, 0x07, 0xa4, 0x52, 0x8c, 0x7d, 0x24, 0xa5, 0xc3, 0xa1, 0x45, 0x9b, 0x5f, 0x96, 0xcf, 0x66, 0xf5, 0xbb, 0x28, 0x6b, 0x0c, 0x13, 0xb7, 0x98, 0x9b, 0x18, 0x35, 0xfd, 0x1c, 0x73, 0x50, 0xa9, 0x71, 0x6b, 0x5b, 0x6f, 0x81, 0x6e, 0x62, 0x45, 0x57, 0x67, 0x7c, 0x8e, 0xfb, 0x73, 0x71, 0x72, 0x1c, 0x44, 0xa6, 0x23, 0x2c, 0x67, 0xf3, 0xd2, 0x7d, 0x81, 0xa4, 0x97, 0xa1, 0x04, 0x59, 0x53, 0x08, 0xe8, 0xe2, 0xa8, 0x36, 0xd8, 0x6f, 0x9e, 0x80, 0x9f, 0x54, 0x0e, 0x05, 0xa5, 0xbb, 0x42, 0xfb, 0xa4, 0x6f, 0x42, 0xd3, 0x11, 0x07, 0x74, 0x14, 0xa8, 0xb4, 0x6a, 0x46, 0xfc, 0xc6, 0x17, 0x6f, 0xee, 0xac, 0x73, 0x8d, 0xc4, 0x6e, 0xef, 0x83, 0x03, 0x4c, 0xe7, 0x59, 0xd3, 0x02, 0x8b, 0x5f, 0x0e, 0xd9, 0x18, 0x77, 0xb5, 0xc7, 0x10, 0xb7, 0x00, 0x35, 0xd0, 0xbc, 0x62, 0x88, 0xc0, 0x3e, 0x75, 0xdf, 0xeb, 0x00, 0xd8, 0x40, 0x11, 0x4f, 0xce, 0x28, 0xfc, 0x1b, 0x58, 0xdf, 0x1d, 0xf7, 0xc5, 0x90, 0x71, 0xbc, 0xb0, 0x76, 0x33, 0xa0, 0x04, 0xa2, 0x45, 0xd2, 0x5d, 0x24, 0x8a, 0x71, 0x68, 0x28, 0x4e, 0xa1, 0x99, 0x3b, 0xe0, 0x12, 0xb3, 0xd1, 0x94, 0x7a, 0x79, 0x50, 0xee, 0x21, 0x50, 0xd6, 0xb1, 0x34, 0xb2, 0xdf, 0x73, 0xf0, 0x4f, 0x59, 0x84, 0x80, 0xc2, 0xb7, 0xb1, 0xf2, 0xa0, 0x43, 0x53, 0xfd, 0x70, 0xd7, 0x23, 0xdb, 0x47, 0x29, 0xb5, 0xb1, 0xdd, 0xf1, 0x8c, 0xdf, 0x91, 0x85, 0x4c, 0xb5, 0x7c, 0x49, 0x83, 0xea, 0xf1, 0x31, 0x06, 0xcb, 0xb3, 0xd5, 0xf1, 0x2e, 0x63, 0xb6, 0xa5, 0x5c, 0x9b, 0x0e, 0x96, 0xe7, 0x49, 0x2c, 0x83, 0xb3, 0x6b, 0x03, 0x4a, 0xec, 0x6b, 0xa7, 0xea, 0x09, 0xf1, 0xf9, 0x9f, 0x82, 0x95, 0x8c, 0x3e, 0xcf, + 0x68, 0x53, 0x4d, 0x95, 0x69, 0x10, 0x26, 0x33, 0x05, 0xdf, 0xd5, 0xec, 0xe5, 0xdf, 0x28, 0x57, 0x2d, 0x5d, 0x50, 0x30, 0x96, 0x85, 0x99, 0x9b, 0x23, 0x4b, 0xda, 0x2b, 0x67, 0x34, 0x70, 0xba, 0x91, 0x8a, 0xce, 0xbb, 0x0c, 0xb4, 0xcd, 0x28, 0x8a, 0xac, 0xce, 0xbb, 0xa5, 0x17, 0x24, 0x2c, 0x62, 0x4f, 0xed, 0x9b, 0x39, 0x6b, 0x52, 0xe1, 0xd6, 0x8d, 0x0d, 0x4b, 0xc5, 0x09, 0x39, 0x1d, 0x04, 0x87, 0x07, 0x63, 0x8a, 0x9d, 0x48, 0x53, 0x63, 0x48, 0x9c, 0x4d, 0x06, 0xab, 0x36, 0x7c, 0x05, 0x21, 0x31, 0xaa, 0xbb, 0x94, 0x02, 0x93, 0x4c, 0x29, 0x50, 0x45, 0xf0, 0xfd, 0xb4, 0x0a, 0x18, 0xd1, 0x9a, 0xbe, 0x83, 0x8e, 0xe5, 0x08, 0x50, 0x1d, 0x0b, 0x98, 0x73, 0x48, 0x02, 0x3b, 0xf9, 0x98, 0x89, 0xef, 0x6c, 0x00, 0x1a, 0xe1, 0x99, 0x90, 0xfc, 0x51, 0x17, 0x4f, 0x8d, 0x76, 0x58, 0xbb, 0x2b, 0x0b, 0x0b, 0x39, 0xe1, 0xcc, 0xca, 0xd3, 0x1a, 0x40, 0x64, 0xf8, 0x66, 0xbc, 0xf2, 0xae, 0x6b, 0x9b, 0xc3, 0xb7, 0x65, 0x43, 0xd8, 0xd4, 0x01, 0x67, 0xf1, 0xb5, 0x65, 0x8c, 0xb0, 0xd6, 0x63, 0x9b, 0xf7, 0xf1, 0xe2, 0xc6, 0x61, 0x99, 0xee, 0xc5, 0xdf, 0x9c, 0xdb, 0x0c, 0x5c, 0x88, 0x04, 0x98, 0x95, 0x9f, 0xa2, 0x5f, 0x76, 0xb0, 0x3e, 0x57, 0x23, 0xdb, 0x25, 0xb3, 0xba, 0x2e, 0x17, 0xbc, 0x74, 0x56, 0x96, 0x76, 0xd8, 0x06, 0x88, 0xc3, 0x0b, 0xf4, 0xd6, 0xea, 0x53, 0x2e, 0xf7, 0x6d, 0x5c, 0xde, 0x04, 0x61, 0xfd, 0x86, 0xa4, 0xad, 0xe2, 0x30, 0xdb, 0xe7, 0xd1, 0x7a, 0x85, 0x4b, 0xac, 0x6d, 0x08, 0x0b, 0x2e, 0xb3, 0x24, 0x87, 0x65, 0x2c, 0x6b, 0xe6, 0x72, 0x09, 0xe6, 0xe2, 0xe6, 0x54, 0x99, 0xc6, 0x99, 0x81, 0x9a, 0x25, 0x8b, 0x09, 0x18, 0x95, + 0xdb, 0x4e, 0x66, 0x8c, 0x4b, 0x37, 0xe1, 0xe4, 0x62, 0xb1, 0x58, 0x1a, 0xde, 0x35, 0x01, 0xde, 0xb6, 0xad, 0x65, 0x9d, 0x04, 0xcf, 0x8a, 0x6c, 0x65, 0xe5, 0xf0, 0xbd, 0xb3, 0x0f, 0x27, 0x25, 0x32, 0x14, 0x5e, 0x54, 0x7b, 0x93, 0xb1, 0x25, 0xc5, 0x72, 0x21, 0x20, 0x4d, 0x64, 0xdf, 0x9d, 0x55, 0x33, 0xf9, 0x30, 0x99, 0xd3, 0x53, 0x3d, 0x9c, 0xd2, 0xf6, 0xbd, 0xf8, 0x49, 0x03, 0x65, 0x03, 0xf1, 0x19, 0xf2, 0xf3, 0xd4, 0x43, 0x3e, 0xd3, 0xe0, 0x93, 0x89, 0x61, 0x3b, 0x4e, 0xd9, 0x35, 0x70, 0xdb, 0xd6, 0x51, 0x1f, 0x3b, 0x3e, 0x3e, 0x18, 0x74, 0x87, 0xb8, 0x6f, 0x6b, 0x6a, 0x96, 0xf8, 0x8a, 0x38, 0x93, 0x54, 0x4c, 0x6c, 0x31, 0x9e, 0x5a, 0x72, 0x67, 0x3c, 0xc1, 0xa0, 0xa0, 0x11, 0x49, 0x51, 0x1c, 0xd6, 0x4b, 0x30, 0xee, 0x3c, 0x25, 0x2d, 0x7c, 0x64, 0x11, 0xf7, 0xd4, 0x1c, 0x74, 0xe7, 0x9e, 0x36, 0x6f, 0x68, 0xdc, 0x85, 0x32, 0xe3, 0xf7, 0x79, 0xf3, 0x1a, 0x55, 0xfb, 0x09, 0xf0, 0x95, 0xda, 0x99, 0xeb, 0x02, 0xbc, 0xb8, 0x14, 0x35, 0xe2, 0x45, 0x34, 0xf9, 0xf0, 0x8e, 0x44, 0x09, 0xd8, 0xe5, 0xf6, 0x2e, 0xd3, 0xc0, 0x18, 0x66, 0x60, 0x40, 0x26, 0x20, 0xff, 0xaf, 0x28, 0x96, 0x96, 0xf5, 0x02, 0x13, 0x88, 0xc9, 0xee, 0x36, 0x80, 0x63, 0x81, 0xbc, 0xdc, 0xf4, 0xa5, 0xac, 0x8b, 0xff, 0xfa, 0xa7, 0xd2, 0xee, 0xa7, 0x22, 0x42, 0x4b, 0x48, 0xa4, 0xc3, 0x28, 0xc5, 0x34, 0x83, 0x26, 0x1b, 0xeb, 0xce, 0xf2, 0xe5, 0xe5, 0x5a, 0x50, 0x41, 0xea, 0x95, 0x66, 0x12, 0x2d, 0xdd, 0xee, 0x49, 0xf7, 0xe8, 0x5f, 0x2b, 0xa1, 0x4e, 0xd9, 0xab, 0xbd, 0xe6, 0xbe, 0xa0, 0xd6, 0xfc, 0x11, 0xc1, 0xa1, 0x3a, 0x12, 0xdf, 0x77, 0xce, 0xbe, 0x91, + 0xde, 0x21, 0x7d, 0x7f, 0x12, 0xe5, 0x5c, 0xfe, 0x33, 0xd1, 0x05, 0xa6, 0x02, 0x76, 0x34, 0x08, 0xe1, 0x40, 0x8c, 0x31, 0x25, 0xf9, 0x31, 0x83, 0xc2, 0xa7, 0xc0, 0x78, 0xa6, 0xa5, 0xb8, 0x36, 0x6c, 0x5b, 0x34, 0xa7, 0x57, 0xec, 0xae, 0x05, 0x40, 0xb8, 0x64, 0x2c, 0xd3, 0x5d, 0x9f, 0x40, 0x3e, 0xb1, 0x63, 0xd2, 0xd1, 0x4e, 0x59, 0x56, 0x84, 0x62, 0xc8, 0x9d, 0xf1, 0xe8, 0xdc, 0x49, 0x17, 0xaf, 0xfb, 0xd4, 0x82, 0x63, 0x23, 0x3f, 0x37, 0x26, 0xe2, 0x0f, 0xf9, 0xe3, 0x7e, 0x29, 0xe0, 0x80, 0x71, 0x85, 0x89, 0x9e, 0xd4, 0x0b, 0x6a, 0x6f, 0xae, 0x2f, 0xb6, 0xbd, 0xb7, 0xeb, 0xe5, 0x60, 0x15, 0xd0, 0x37, 0xc2, 0xdd, 0x63, 0x2b, 0x04, 0xf6, 0xa6, 0xfa, 0xa9, 0x34, 0x66, 0x79, 0xdf, 0xb2, 0x7c, 0x22, 0xce, 0x39, 0x05, 0x87, 0x43, 0x9f, 0xc0, 0x99, 0xa8, 0x7b, 0xac, 0x6e, 0xb8, 0x94, 0x68, 0xa3, 0xe0, 0x87, 0x47, 0x16, 0x73, 0xc7, 0x14, 0xe5, 0x10, 0x17, 0x44, 0x87, 0x37, 0x0d, 0xea, 0x1b, 0xd7, 0x2c, 0xd1, 0x39, 0x41, 0x81, 0x1b, 0xae, 0xfa, 0x3c, 0x14, 0x4f, 0xfd, 0x03, 0xe9, 0x6b, 0x31, 0xce, 0x87, 0xc9, 0x45, 0xf3, 0x78, 0xe6, 0xfb, 0x0a, 0x5d, 0xe6, 0x4f, 0x0a, 0x5f, 0x6c, 0x60, 0x0c, 0x1f, 0x0e, 0x99, 0xe1, 0x5f, 0xbc, 0x30, 0x34, 0xce, 0x6e, 0xe6, 0xbb, 0x3a, 0xb0, 0x82, 0xb1, 0x27, 0x63, 0xaf, 0xd4, 0xff, 0x9b, 0x4d, 0x13, 0x1f, 0xaf, 0xaf, 0xbf, 0xdb, 0xfd, 0x35, 0x03, 0x73, 0x8b, 0x7a, 0x6e, 0x6d, 0xdb, 0x3b, 0x21, 0x7d, 0xbb, 0xc6, 0x48, 0x84, 0xdb, 0x29, 0xa4, 0x93, 0x17, 0xff, 0x1b, 0xc4, 0xec, 0xad, 0xf2, 0x88, 0xae, 0xf2, 0x9d, 0x41, 0x5b, 0x91, 0xef, 0x4c, 0xe9, 0xda, 0xd8, 0x63, 0x4a, 0xdb, 0x1b, 0xc9, + 0xd3, 0x75, 0x5f, 0xa5, 0x32, 0xd9, 0xb3, 0xac, 0x07, 0xe5, 0x3e, 0xe8, 0x0e, 0xf4, 0xa8, 0xd8, 0x6b, 0xb0, 0x2b, 0x44, 0xed, 0x04, 0xdc, 0xbb, 0x82, 0xff, 0xbb, 0x7d, 0x25, 0x74, 0x61, 0xc2, 0xca, 0xd0, 0x0c, 0xa1, 0xf7, 0x01, 0x27, 0x5d, 0x3a, 0x6c, 0x37, 0xd7, 0xf2, 0x1f, 0x83, 0x68, 0x34, 0x02, 0xaa, 0x32, 0xef, 0xdf, 0x7a, 0xa9, 0xab, 0x1d, 0xad, 0x6d, 0x66, 0xb5, 0xb3, 0xf4, 0x6e, 0xe7, 0x40, 0x82, 0x3b, 0x58, 0x95, 0x48, 0xd7, 0xd1, 0x3e, 0xb0, 0x20, 0xac, 0x72, 0xf1, 0x01, 0x96, 0xc4, 0x81, 0x86, 0x69, 0x0e, 0xfe, 0x27, 0x68, 0x5c, 0xa1, 0x2c, 0xb7, 0x46, 0x37, 0x3f, 0xfe, 0x6f, 0x72, 0x89, 0x6d, 0x64, 0xb7, 0x37, 0x15, 0x32, 0x59, 0x74, 0xbb, 0x7a, 0x5e, 0x95, 0x46, 0x45, 0xde, 0x01, 0x21, 0x71, 0x66, 0xc6, 0x83, 0x76, 0x7c, 0xc9, 0x3e, 0x0a, 0xb3, 0x68, 0x5d, 0xa5, 0xf5, 0xd2, 0x6b, 0xd0, 0xea, 0xeb, 0xeb, 0x93, 0x73, 0x9b, 0x0f, 0x4b, 0x62, 0xd3, 0x49, 0x44, 0x52, 0xa5, 0x9a, 0x96, 0x17, 0x46, 0x3e, 0x1d, 0xec, 0x8c, 0x25, 0x4b, 0x2b, 0x83, 0x5a, 0x39, 0xb1, 0x0c, 0x8f, 0xc7, 0x7f, 0xf7, 0xbe, 0x1e, 0x67, 0x0d, 0x21, 0xb1, 0x4a, 0x3b, 0x11, 0x12, 0x1e, 0x16, 0x2a, 0x20, 0xd8, 0xe7, 0xbc, 0xc5, 0xb5, 0x5b, 0x92, 0xd9, 0xe1, 0xf4, 0xed, 0x14, 0x7c, 0x58, 0xdf, 0xbc, 0x10, 0x18, 0x48, 0x74, 0xfa, 0x36, 0xe4, 0x50, 0xf4, 0x25, 0xe7, 0x0f, 0x4b, 0xb8, 0x81, 0xd1, 0x2d, 0x5a, 0xfb, 0xc1, 0xa4, 0x0a, 0xfe, 0x84, 0x04, 0xfd, 0x47, 0x87, 0xae, 0x2c, 0x1e, 0x8a, 0x22, 0x13, 0x8b, 0x7d, 0xcd, 0x9f, 0x8e, 0xa6, 0x3e, 0x14, 0x7e, 0xef, 0x58, 0x63, 0xf8, 0x9f, 0xab, 0x79, 0x53, 0x01, 0x0a, 0xd6, 0x49, 0x57, 0x1a, + 0x8d, 0x30, 0x7b, 0x8b, 0x92, 0xb5, 0x91, 0xff, 0x79, 0x51, 0x0e, 0xd0, 0x04, 0x5e, 0xff, 0x9a, 0xe7, 0x0e, 0xd1, 0xf6, 0xb4, 0x3d, 0xc2, 0x96, 0xc8, 0xb5, 0xf8, 0xdf, 0xf1, 0x13, 0xb7, 0x75, 0x86, 0x30, 0x4b, 0x33, 0x83, 0xa4, 0x21, 0x3c, 0xf2, 0xce, 0x0e, 0x72, 0x54, 0x90, 0xe7, 0xe3, 0x3b, 0x88, 0xe9, 0x89, 0x2d, 0x5d, 0x84, 0x41, 0xde, 0xdd, 0x4c, 0x6a, 0xa4, 0x28, 0x70, 0x74, 0x87, 0xe2, 0xf2, 0x76, 0x53, 0x74, 0xcc, 0x8f, 0x17, 0x2a, 0x63, 0x1b, 0x59, 0x1f, 0x4c, 0x2a, 0x62, 0x85, 0x5a, 0x21, 0xf5, 0x50, 0x40, 0xb1, 0x61, 0x07, 0x54, 0x0c, 0xa2, 0xef, 0x60, 0xc2, 0x86, 0x92, 0xc4, 0x99, 0x58, 0xbd, 0x96, 0xe5, 0x4e, 0x0d, 0x17, 0x93, 0x2a, 0x40, 0xbd, 0xd4, 0x4a, 0x5f, 0x38, 0x98, 0xff, 0x74, 0xfe, 0x1d, 0xa1, 0x44, 0x3d, 0xf8, 0x5f, 0xa9, 0x4b, 0xac, 0xb4, 0x57, 0x69, 0x6c, 0x2d, 0xe0, 0xc5, 0xcd, 0x87, 0xdb, 0x77, 0x2d, 0x87, 0x1b, 0x5a, 0x7d, 0x0f, 0x7d, 0xb8, 0xae, 0xad, 0x5a, 0x77, 0xfe, 0x6f, 0x75, 0x33, 0xf3, 0x52, 0xc6, 0xe0, 0xc6, 0x6b, 0xec, 0x18, 0x34, 0x6f, 0x76, 0x60, 0x31, 0x00, 0x1a, 0x8e, 0x54, 0xb6, 0xcd, 0xc9, 0x7e, 0xc1, 0xf7, 0xcc, 0xf0, 0x9c, 0xed, 0x85, 0xef, 0x9d, 0xb3, 0x52, 0x9a, 0x7b, 0xe9, 0x7c, 0xe9, 0x6f, 0x35, 0x40, 0xba, 0xd8, 0x98, 0xdc, 0xe9, 0x3e, 0x88, 0xa0, 0xd7, 0xb9, 0x36, 0x72, 0x7e, 0xa6, 0x00, 0xa9, 0x10, 0x62, 0x54, 0x82, 0xfa, 0x9e, 0xb6, 0x83, 0x41, 0xf0, 0x49, 0x12, 0xbb, 0xe9, 0x1a, 0x00, 0x03, 0x9f, 0x18, 0x1a, 0x1d, 0x42, 0x7f, 0x69, 0xcf, 0x2e, 0x47, 0xd5, 0x8c, 0xb6, 0xce, 0xb7, 0x6f, 0x2f, 0x99, 0x6b, 0x3f, 0x6a, 0x71, 0x08, 0x3c, 0x02, 0xa5, 0x6c, 0x7b, + 0x6e, 0xf9, 0x01, 0x44, 0x12, 0x06, 0x1a, 0x08, 0x82, 0x78, 0x61, 0xe8, 0x2a, 0x28, 0x39, 0xd3, 0x99, 0xc4, 0x4b, 0xe2, 0x2d, 0x5a, 0xc2, 0xbb, 0x88, 0xe4, 0xc4, 0x53, 0xc8, 0x4a, 0x3a, 0xab, 0xac, 0xf3, 0x46, 0x14, 0x28, 0xa3, 0xd8, 0x60, 0xa3, 0x82, 0x0a, 0x98, 0xe3, 0xf4, 0x42, 0x4a, 0xf0, 0x3f, 0xb3, 0x52, 0xd3, 0xa4, 0x87, 0x2f, 0x3d, 0xe1, 0x84, 0x1d, 0x0d, 0x04, 0xd1, 0x8d, 0xf9, 0x00, 0xf1, 0x26, 0x6e, 0xbc, 0xb8, 0x52, 0x06, 0xb6, 0xb3, 0xa2, 0xdf, 0x26, 0x6f, 0xbd, 0x65, 0x90, 0x62, 0xaa, 0x4b, 0x05, 0xac, 0x1a, 0x9b, 0x03, 0x40, 0x52, 0x44, 0xc6, 0xbb, 0x68, 0x2f, 0x77, 0xb2, 0x72, 0x68, 0x79, 0x41, 0x43, 0x5d, 0x6b, 0x7d, 0x9d, 0x20, 0x84, 0x52, 0xc4, 0xc1, 0xc0, 0xd4, 0x64, 0x7b, 0x04, 0xc5, 0x8a, 0xd6, 0x33, 0xf1, 0x5d, 0x0e, 0x74, 0xbf, 0x8a, 0xdc, 0xed, 0x26, 0x8b, 0xeb, 0xec, 0xda, 0xcf, 0x16, 0x5d, 0xd2, 0x0b, 0x55, 0x9c, 0xc4, 0xbc, 0x6e, 0x7c, 0xb9, 0xe8, 0x60, 0x8d, 0x5e, 0x6f, 0x28, 0x06, 0x8a, 0x47, 0xaf, 0x13, 0x4d, 0xe3, 0x59, 0x18, 0x22, 0xb5, 0x1a, 0x40, 0xc5, 0xc5, 0x07, 0xce, 0x9b, 0x00, 0xbc, 0xba, 0x45, 0x78, 0x99, 0x9b, 0x46, 0x96, 0x0a, 0x9a, 0x5f, 0x05, 0x0e, 0xe3, 0x21, 0x73, 0x49, 0xa3, 0x82, 0x72, 0x53, 0xbf, 0x6b, 0x1b, 0x70, 0x15, 0xde, 0xdb, 0x1b, 0xf8, 0xf1, 0x20, 0x22, 0xd4, 0x74, 0xfc, 0xc6, 0x92, 0x96, 0x0d, 0xfc, 0x82, 0xb7, 0xd6, 0x38, 0x73, 0x51, 0xf1, 0xd8, 0xb2, 0xfa, 0x6f, 0xed, 0xdc, 0xf8, 0xbb, 0x89, 0x16, 0x35, 0xab, 0x38, 0xe2, 0xb6, 0xd7, 0xe1, 0xf8, 0x9c, 0x03, 0x4a, 0xfc, 0x4d, 0x37, 0x82, 0x1d, 0x87, 0x20, 0x94, 0x8d, 0x18, 0x85, 0x45, 0x1d, 0x63, 0xed, + 0x68, 0x5c, 0x29, 0x90, 0x86, 0xba, 0x6c, 0xd8, 0xe9, 0x70, 0xef, 0x08, 0x26, 0x1d, 0x41, 0xb8, 0x2b, 0x60, 0x49, 0x69, 0x00, 0xf5, 0xc3, 0x31, 0xc5, 0x7a, 0x1b, 0x5c, 0xb5, 0xb1, 0x0a, 0xbb, 0x04, 0xf1, 0x82, 0xf0, 0xd8, 0xc6, 0x31, 0x99, 0x40, 0xfa, 0x71, 0x5b, 0xa0, 0xe2, 0xfa, 0x09, 0x90, 0xd0, 0x87, 0x5e, 0x27, 0x06, 0x08, 0x1d, 0xf8, 0x43, 0x57, 0x4a, 0xe9, 0xec, 0x53, 0x08, 0x4f, 0x3c, 0xbc, 0xf6, 0x98, 0x0e, 0x13, 0x6f, 0x93, 0xf5, 0x38, 0x51, 0xfe, 0xa8, 0xf8, 0xd1, 0xcd, 0x10, 0x31, 0x1b, 0x57, 0xbe, 0x1e, 0x38, 0xb8, 0x0a, 0x21, 0xdd, 0x11, 0x54, 0xe2, 0xad, 0xe9, 0x69, 0xbc, 0xd7, 0xff, 0x76, 0x32, 0x42, 0xb1, 0x38, 0xc9, 0xc2, 0xf3, 0xcb, 0xc8, 0x6c, 0xc0, 0xc8, 0x49, 0xd9, 0x94, 0xfe, 0xa3, 0xcc, 0xf1, 0xac, 0x3a, 0xa2, 0x49, 0x70, 0x2a, 0x6e, 0x19, 0x23, 0x22, 0xbe, 0x51, 0x87, 0xb8, 0x46, 0x83, 0xac, 0x30, 0x98, 0xa2, 0x0d, 0x8a, 0x9c, 0x69, 0x43, 0xd9, 0xb7, 0xe5, 0xdc, 0xfd, 0xd6, 0xeb, 0xd3, 0x2a, 0x44, 0xaa, 0xf8, 0xe1, 0x54, 0x53, 0x2d, 0x68, 0x07, 0x8d, 0x70, 0x26, 0x05, 0xd1, 0x90, 0x7c, 0xaf, 0xfd, 0xc5, 0x04, 0x2c, 0x32, 0x62, 0x1f, 0xec, 0x0d, 0x4b, 0x8b, 0x7f, 0x7c, 0x49, 0x1b, 0x85, 0x61, 0x8b, 0x4e, 0x2c, 0x90, 0xcf, 0x88, 0x26, 0xe5, 0x16, 0x97, 0x9f, 0x68, 0x4a, 0x92, 0xe3, 0x3f, 0x55, 0xb7, 0xd2, 0xb2, 0x5e, 0x3c, 0x83, 0xb8, 0x05, 0x78, 0x94, 0x4a, 0x8c, 0x6a, 0x3a, 0x3d, 0x20, 0xbb, 0xa4, 0xaa, 0xa7, 0xec, 0x81, 0xbf, 0x5e, 0x4e, 0xbf, 0x0e, 0x98, 0x7f, 0xdb, 0x51, 0xc7, 0xea, 0x12, 0x74, 0x30, 0x8c, 0xba, 0x0f, 0xaf, 0x0a, 0x8d, 0x70, 0xfe, 0xfc, 0x1d, 0x02, 0xe6, 0x0f, 0x0a, + 0x77, 0x2d, 0x5f, 0xc0, 0x85, 0x65, 0xb1, 0x0a, 0x5c, 0xa7, 0xfb, 0x8b, 0x6a, 0x8a, 0x46, 0xee, 0x69, 0xef, 0xf0, 0x8f, 0xf4, 0xf2, 0xa5, 0xdb, 0x4e, 0xb9, 0x5a, 0x4b, 0x64, 0x56, 0xbd, 0x4a, 0xea, 0x13, 0x8f, 0xa6, 0x58, 0xce, 0x3e, 0xc3, 0xdf, 0xae, 0xd4, 0x3a, 0x01, 0xed, 0xfc, 0x01, 0x67, 0x4f, 0x09, 0x41, 0x0a, 0xf2, 0x00, 0xa4, 0xdb, 0x78, 0xe6, 0x04, 0xff, 0xcf, 0xe8, 0x23, 0x6b, 0x58, 0xc9, 0x98, 0x4b, 0x64, 0x99, 0x38, 0x93, 0xcd, 0xd6, 0x81, 0xbc, 0x1a, 0x11, 0xff, 0x89, 0x6a, 0xe7, 0x8e, 0xae, 0x8a, 0x74, 0x2d, 0xd7, 0x42, 0xc4, 0xec, 0x50, 0x29, 0x04, 0x8f, 0x70, 0xe4, 0xe6, 0xe6, 0x00, 0xb4, 0x24, 0xfd, 0xea, 0x6b, 0xa0, 0xc2, 0x94, 0xaf, 0xcb, 0x7d, 0xe3, 0x71, 0x3a, 0xda, 0xdd, 0xf5, 0x61, 0xf8, 0x3b, 0x60, 0xdf, 0x88, 0x97, 0x9d, 0x89, 0xd5, 0x43, 0x9e, 0x79, 0x8b, 0xfc, 0x1d, 0x27, 0x5e, 0x30, 0x51, 0x1b, 0x35, 0x07, 0xcd, 0x38, 0x7e, 0x54, 0x3d, 0x2b, 0xa7, 0x73, 0x51, 0x72, 0x22, 0xde, 0xf9, 0x7a, 0x3d, 0x70, 0xb7, 0x1d, 0xf1, 0x3c, 0x0c, 0x5d, 0xdc, 0x09, 0x46, 0x76, 0x36, 0xfd, 0xe8, 0xd1, 0xf3, 0xc1, 0x94, 0x84, 0xf2, 0x23, 0x94, 0xf8, 0xf7, 0xcb, 0x26, 0x42, 0xff, 0x72, 0x49, 0xb2, 0x9d, 0xb2, 0x0b, 0x6b, 0xcf, 0x68, 0xbe, 0x0c, 0x12, 0x11, 0x58, 0x8a, 0xb0, 0xe0, 0x9b, 0xad, 0xdf, 0x10, 0xba, 0xb1, 0x5e, 0x7b, 0xa0, 0xcf, 0x0f, 0x30, 0xc5, 0x3a, 0xeb, 0xa3, 0xdb, 0x7f, 0x67, 0xbf, 0xa4, 0x8f, 0x65, 0x2e, 0xf5, 0x34, 0x1c, 0x2f, 0xb3, 0xa7, 0x27, 0xc7, 0xfa, 0x91, 0xc8, 0x23, 0x46, 0x0b, 0xe6, 0x05, 0x10, 0x83, 0x62, 0x4c, 0x22, 0xb2, 0x32, 0x70, 0x0f, 0xaa, 0xa6, 0x4f, 0xe0, 0x82, 0xf4, + 0xd4, 0x99, 0xe2, 0xa9, 0x4b, 0x7e, 0x5f, 0x9a, 0xa4, 0xdb, 0xac, 0x8c, 0xc7, 0x98, 0x52, 0x6e, 0x40, 0xe5, 0xeb, 0x42, 0x90, 0x64, 0x4e, 0xb6, 0xbd, 0x76, 0x28, 0xcf, 0x62, 0x90, 0x4e, 0x8c, 0x41, 0xd3, 0x1a, 0x43, 0x43, 0x70, 0x9a, 0xa8, 0x9b, 0x00, 0xd5, 0x0e, 0x8d, 0xbd, 0xb4, 0xed, 0xaa, 0x0a, 0xf5, 0x08, 0x85, 0x14, 0x1d, 0x0b, 0x78, 0x2b, 0x96, 0x54, 0x4e, 0x8b, 0x28, 0x21, 0xad, 0xee, 0x17, 0x7b, 0x15, 0xda, 0x12, 0x98, 0x11, 0xa0, 0xe4, 0xe7, 0x8f, 0x32, 0x07, 0x3a, 0xed, 0x99, 0x64, 0x0c, 0x7d, 0x17, 0x86, 0x27, 0xff, 0xfc, 0xa3, 0xb7, 0x77, 0xe7, 0xd9, 0xc8, 0x75, 0xc8, 0xa5, 0x80, 0xe9, 0x0e, 0x89, 0x72, 0x55, 0x5f, 0xc8, 0x0a, 0x39, 0xbe, 0x1b, 0xb0, 0x08, 0x70, 0x65, 0xa2, 0xa9, 0xd4, 0xaf, 0x8d, 0xcd, 0x81, 0xf4, 0x41, 0x7e, 0xc8, 0x6a, 0x6c, 0x40, 0x5a, 0x9d, 0xfe, 0x4a, 0xd0, 0x7e, 0x25, 0x93, 0x1e, 0x0a, 0xb0, 0x9e, 0x53, 0xb9, 0xf3, 0xcb, 0xa5, 0xf7, 0x41, 0xc4, 0x6a, 0x4b, 0x43, 0x72, 0x9d, 0x8d, 0x43, 0x2e, 0x54, 0x75, 0x8f, 0x8b, 0xbc, 0x41, 0xb9, 0xb1, 0xf9, 0x9b, 0x35, 0x6c, 0x86, 0xf8, 0xec, 0x7d, 0xb2, 0x33, 0x7a, 0x26, 0x5a, 0xf1, 0xa0, 0xe2, 0x78, 0xaa, 0x22, 0x90, 0x43, 0x92, 0xda, 0x6b, 0x49, 0x34, 0x41, 0xd7, 0x48, 0xf5, 0xbf, 0x10, 0x2d, 0xd2, 0xca, 0xd2, 0xf7, 0xdc, 0xb0, 0x39, 0x4f, 0x86, 0xe4, 0x47, 0xfe, 0x27, 0x28, 0xc8, 0xbd, 0x1f, 0xa2, 0xb7, 0x70, 0xa5, 0xc0, 0xb0, 0x16, 0x81, 0xbd, 0xea, 0x96, 0x23, 0x65, 0x6b, 0x3f, 0x53, 0x14, 0x89, 0x36, 0xd4, 0xf7, 0x6e, 0x82, 0x4f, 0x16, 0x7f, 0x3a, 0x60, 0x07, 0xa5, 0xd1, 0xad, 0x75, 0x8f, 0x51, 0xe9, 0xc4, 0xa9, 0x7c, 0xde, 0xa5, + 0xd9, 0x6a, 0x60, 0xae, 0x93, 0xe5, 0x06, 0xa0, 0xdb, 0x7b, 0x70, 0xa5, 0x49, 0xc6, 0x2c, 0x86, 0x69, 0xf8, 0x18, 0xcb, 0x4e, 0xe6, 0x68, 0x8b, 0x3d, 0xe6, 0x14, 0x80, 0x0c, 0x1a, 0x6c, 0x2c, 0x49, 0xe2, 0x86, 0x27, 0xda, 0x01, 0xa7, 0x7b, 0x6d, 0x91, 0xb4, 0x11, 0x2f, 0x1d, 0xd0, 0x0f, 0x69, 0xab, 0xb8, 0x91, 0xf9, 0xe9, 0x94, 0x5e, 0x6e, 0xda, 0xea, 0xec, 0xda, 0xd2, 0x83, 0x98, 0xec, 0xe9, 0xd9, 0xa1, 0xfd, 0x34, 0x6c, 0x94, 0x4d, 0x62, 0x81, 0x7a, 0x64, 0x00, 0x64, 0x06, 0xf3, 0x3a, 0x81, 0x08, 0xd2, 0x7f, 0xc1, 0x2a, 0xf4, 0xfd, 0x18, 0xa8, 0xd7, 0x21, 0x5b, 0x6b, 0xdf, 0xaf, 0xc6, 0x5e, 0x64, 0x93, 0x6a, 0xf4, 0xc9, 0x9f, 0xf0, 0x32, 0x20, 0xa0, 0x29, 0xfb, 0xf8, 0xac, 0xa8, 0x03, 0xfe, 0x5a, 0x1e, 0x46, 0xa3, 0xca, 0x49, 0x2c, 0x01, 0x25, 0x1a, 0x29, 0x06, 0x10, 0x84, 0x27, 0x37, 0xc2, 0x16, 0x9d, 0x20, 0x5d, 0x91, 0xc5, 0xc9, 0xcc, 0xf7, 0x33, 0x17, 0x33, 0xdb, 0xd8, 0x2d, 0x57, 0x13, 0x2d, 0xd7, 0x74, 0x1e, 0xc3, 0xb8, 0xe9, 0xfa, 0xca, 0x90, 0xff, 0x8f, 0xfc, 0xc6, 0xa0, 0xf4, 0x00, 0x2f, 0x5a, 0xad, 0x4d, 0x0b, 0x38, 0x1a, 0x58, 0xd2, 0x37, 0x65, 0x6b, 0x74, 0x21, 0x54, 0xd7, 0x9c, 0x69, 0x2b, 0x71, 0x8c, 0xc7, 0x61, 0x8e, 0xd2, 0xb9, 0x3b, 0x32, 0x7b, 0xb7, 0x47, 0x42, 0x60, 0xb6, 0x59, 0xc2, 0x76, 0xc7, 0xd6, 0xfc, 0x54, 0x73, 0x4e, 0xb3, 0xf6, 0x5e, 0x28, 0x4c, 0xe7, 0x15, 0x13, 0x08, 0xc0, 0xc5, 0xf8, 0xd6, 0x6f, 0x01, 0x5d, 0x19, 0x4d, 0xf6, 0xd6, 0x3e, 0x2e, 0xe9, 0x19, 0x2a, 0x07, 0x01, 0xb6, 0xc3, 0x19, 0xde, 0xe6, 0xba, 0xed, 0xdd, 0x7f, 0x92, 0xf8, 0xc0, 0x34, 0xe1, 0xff, 0x33, 0x33, 0xd9, + 0x2d, 0xa6, 0xf7, 0x56, 0x52, 0x18, 0x02, 0xae, 0x40, 0x7d, 0x27, 0x35, 0x9e, 0xb0, 0x13, 0x4d, 0x7e, 0x2b, 0x5a, 0xbe, 0xc1, 0x34, 0x33, 0x0c, 0xb8, 0x63, 0x20, 0x59, 0x9c, 0x41, 0x66, 0xe1, 0x91, 0xf6, 0xf7, 0x1c, 0xa6, 0xb3, 0xad, 0x8f, 0xe4, 0x11, 0x54, 0xe7, 0xac, 0x41, 0xde, 0x1d, 0x32, 0x14, 0xf4, 0x7b, 0x9b, 0x86, 0xdc, 0x98, 0x95, 0xea, 0xfd, 0x70, 0x11, 0x07, 0xa3, 0xde, 0xe2, 0xed, 0x10, 0x0b, 0xd2, 0xed, 0x74, 0xee, 0xc3, 0x3d, 0x1c, 0xd2, 0xc1, 0x43, 0x52, 0xeb, 0x7c, 0x95, 0x33, 0xa3, 0xb8, 0x0a, 0x63, 0xf3, 0xdb, 0x43, 0x92, 0xb1, 0xc7, 0xd3, 0x16, 0xed, 0x13, 0x9a, 0xcb, 0x9d, 0xf7, 0xf5, 0xcc, 0xc9, 0xd3, 0x2d, 0x27, 0x36, 0x08, 0x76, 0xc7, 0xb4, 0x87, 0xf6, 0xe5, 0xc6, 0x6f, 0x6a, 0x9d, 0xff, 0x6c, 0xc7, 0xe0, 0xc0, 0xdf, 0x13, 0x5c, 0x38, 0xed, 0xa8, 0xc3, 0x41, 0x23, 0x78, 0xbd, 0xea, 0xd3, 0x1a, 0xcc, 0x8c, 0x4b, 0x95, 0x9c, 0xf0, 0x74, 0x78, 0x79, 0x27, 0xb6, 0x8f, 0x48, 0xc6, 0x4a, 0x5d, 0x60, 0x18, 0xf3, 0x3f, 0x96, 0xa7, 0xa7, 0x6f, 0x71, 0x2c, 0x8a, 0xf0, 0x72, 0xb4, 0xe3, 0xd5, 0x5d, 0x69, 0xb6, 0x3e, 0x81, 0xf0, 0x1c, 0xdc, 0x67, 0x1d, 0xc6, 0x24, 0xd0, 0xc0, 0x1b, 0x69, 0xdb, 0xc4, 0xa0, 0x98, 0xf1, 0x3d, 0xb0, 0x42, 0x75, 0x79, 0xe8, 0x53, 0x32, 0xba, 0x51, 0x59, 0x0d, 0xde, 0x8e, 0xf3, 0x08, 0x80, 0x3d, 0xb3, 0x32, 0x7b, 0xea, 0xda, 0xa2, 0xee, 0x67, 0x11, 0x9e, 0x55, 0x7d, 0xec, 0x4e, 0xe9, 0xe0, 0x4c, 0x01, 0xdf, 0x51, 0xfb, 0x48, 0xdd, 0x79, 0x47, 0xf4, 0x33, 0x7a, 0xba, 0x5b, 0xd9, 0xe0, 0xd3, 0xc0, 0xee, 0x83, 0x6a, 0xe6, 0x24, 0xb1, 0xfc, 0xab, 0xfe, 0x91, 0x18, 0xe6, 0x6d, + 0x85, 0x02, 0x03, 0xa2, 0x09, 0xe9, 0x2d, 0x9d, 0x97, 0x75, 0xcf, 0x9f, 0xd0, 0xad, 0x98, 0xad, 0x35, 0x10, 0xa1, 0xd7, 0x52, 0xcf, 0xc8, 0xe8, 0x1f, 0x8a, 0x85, 0xe2, 0xf6, 0x8b, 0xdc, 0x7f, 0xcf, 0x92, 0x57, 0xc5, 0x76, 0xa1, 0x46, 0x86, 0x14, 0x67, 0x77, 0xd5, 0x13, 0xa9, 0x64, 0x0c, 0x2b, 0xb4, 0x99, 0x06, 0x39, 0x01, 0xeb, 0x92, 0xc9, 0x04, 0x49, 0x5b, 0x1c, 0xf7, 0x88, 0xe6, 0x81, 0x63, 0x21, 0x7f, 0x03, 0x67, 0xd8, 0x5f, 0x7d, 0x58, 0xce, 0x9c, 0xc5, 0xc8, 0x7a, 0x0b, 0xed, 0x59, 0x3c, 0xea, 0x11, 0x60, 0x76, 0x79, 0x9b, 0x96, 0x15, 0xce, 0x83, 0x86, 0x7f, 0xb5, 0x05, 0xea, 0x68, 0xb2, 0xe2, 0x27, 0x3e, 0x15, 0x2c, 0x92, 0xba, 0x4f, 0xda, 0x96, 0xd4, 0x91, 0xc2, 0xf1, 0xef, 0xe1, 0xc9, 0x8c, 0x34, 0xba, 0xf1, 0xa2, 0x90, 0x3b, 0x3f, 0x15, 0x1b, 0xe7, 0x3c, 0x1f, 0x43, 0xf2, 0xad, 0x43, 0xf1, 0xaf, 0xec, 0x5b, 0x8e, 0x69, 0xf7, 0xd6, 0xa7, 0x94, 0xa7, 0x65, 0x53, 0xbd, 0xdb, 0x4b, 0xa3, 0x70, 0xfc, 0xd3, 0xaf, 0x5e, 0xd8, 0xfa, 0xba, 0x60, 0x2a, 0x2d, 0xea, 0x24, 0xaf, 0x51, 0x03, 0xf1, 0xcd, 0x03, 0xee, 0x8d, 0x5d, 0xa3, 0xee, 0xec, 0xde, 0x9e, 0xfd, 0xff, 0xf1, 0xf5, 0xec, 0x19, 0x16, 0xc3, 0xb8, 0x78, 0xda, 0xc2, 0xa6, 0x4e, 0xb6, 0x23, 0x26, 0x75, 0x37, 0xe3, 0x15, 0x6d, 0x9a, 0x94, 0x27, 0x34, 0x15, 0xae, 0xb7, 0xd2, 0x87, 0x12, 0xe6, 0x4b, 0xd9, 0xe9, 0x17, 0x1f, 0xe3, 0xc8, 0x47, 0x56, 0x2e, 0x5d, 0x1a, 0xfc, 0x0f, 0x5f, 0x93, 0x5a, 0x90, 0xde, 0x04, 0x84, 0x4e, 0xf8, 0x59, 0x79, 0xee, 0x2e, 0x59, 0x3d, 0xca, 0x21, 0xd9, 0xf6, 0x70, 0x60, 0x48, 0x38, 0xde, 0x24, 0x28, 0x77, 0xbf, 0x8e, 0xb6, 0x1a, + 0x72, 0x7d, 0xa1, 0x10, 0xa1, 0x8a, 0x25, 0xf9, 0xac, 0xa6, 0x69, 0xf7, 0x1f, 0x90, 0xff, 0x79, 0x9e, 0x19, 0xef, 0x21, 0xb2, 0xed, 0x83, 0x66, 0x7e, 0x25, 0xa9, 0x6f, 0xb4, 0xde, 0xfd, 0x31, 0x7f, 0x6d, 0x10, 0x77, 0x60, 0x13, 0x19, 0xe3, 0x8f, 0x37, 0xd7, 0x93, 0x54, 0x27, 0x96, 0xc7, 0x5e, 0x8a, 0x15, 0xda, 0xde, 0x7f, 0x1c, 0x54, 0x9f, 0xab, 0x88, 0x03, 0x56, 0xdc, 0x49, 0x39, 0xf6, 0x00, 0xeb, 0xf0, 0x87, 0x69, 0x08, 0xc9, 0x70, 0x62, 0xa3, 0x14, 0xe3, 0xbe, 0x9e, 0xda, 0xb4, 0xd0, 0x3a, 0xb0, 0xe7, 0x86, 0xa3, 0xd2, 0x0d, 0xa7, 0x9c, 0xfc, 0x15, 0x4f, 0xe9, 0xdd, 0x44, 0x30, 0x42, 0x22, 0x5a, 0xeb, 0x5d, 0xc4, 0x33, 0x15, 0xcb, 0xfd, 0x59, 0xb4, 0x49, 0x52, 0xca, 0x7b, 0xf9, 0x38, 0x8e, 0x5d, 0xf9, 0x84, 0x7d, 0x75, 0x5a, 0xf8, 0x62, 0x01, 0x4a, 0x04, 0x13, 0x04, 0x01, 0xf7, 0x6c, 0x7c, 0x6a, 0xa5, 0xba, 0xfc, 0xb4, 0xae, 0xb5, 0xe0, 0x89, 0x8c, 0x2e, 0x6d, 0xaf, 0xbd, 0x24, 0x8c, 0xd8, 0x3e, 0xd8, 0x7d, 0x06, 0xcf, 0xd4, 0xb6, 0xf8, 0x25, 0xd7, 0x35, 0xd3, 0xe1, 0x66, 0x0e, 0xf2, 0x76, 0xdf, 0xaa, 0x34, 0x01, 0xbf, 0xce, 0xa7, 0x51, 0xd5, 0x02, 0xb2, 0xe3, 0xc0, 0x30, 0xf9, 0xe4, 0x36, 0x45, 0xf2, 0x1e, 0xd2, 0x4e, 0xea, 0xd4, 0xdd, 0xa7, 0x18, 0xe3, 0x6d, 0xf8, 0xd2, 0x4a, 0xa4, 0xc4, 0x25, 0x2d, 0x03, 0xbf, 0x30, 0x7e, 0x7c, 0x10, 0xfe, 0xec, 0xb7, 0x47, 0x16, 0x09, 0xf6, 0x39, 0x13, 0xc3, 0x11, 0x64, 0x3f, 0x02, 0xa6, 0x86, 0x2e, 0x43, 0x33, 0xcc, 0x1a, 0x77, 0xe4, 0xa5, 0xff, 0x43, 0x78, 0x7d, 0x7b, 0x8d, 0xae, 0xbe, 0x2f, 0xe4, 0xdb, 0xd7, 0xb0, 0x9d, 0xf9, 0x0d, 0xb6, 0x9d, 0x76, 0x6d, 0xfd, 0xcf, + 0xfb, 0x20, 0xf5, 0x72, 0x2c, 0x84, 0xc2, 0x70, 0xa3, 0x0e, 0x80, 0xe3, 0xfa, 0x05, 0x3e, 0xe7, 0x4d, 0x89, 0xa4, 0x47, 0x16, 0xb5, 0xd0, 0x37, 0xff, 0xb7, 0xda, 0x76, 0x28, 0xa6, 0xc9, 0xca, 0x46, 0x47, 0x36, 0xbf, 0x7d, 0x24, 0x85, 0x76, 0xd0, 0xe8, 0xea, 0xf3, 0x69, 0xbf, 0x37, 0x75, 0xb6, 0x63, 0xe4, 0x7b, 0x89, 0xfc, 0x97, 0x12, 0x7f, 0xd1, 0xff, 0xbb, 0x7c, 0x3c, 0xaf, 0x8a, 0xce, 0x3a, 0x76, 0xad, 0x6b, 0xf3, 0xa8, 0xd7, 0x44, 0x11, 0x14, 0x72, 0x34, 0xfc, 0xb7, 0x07, 0x2d, 0xbd, 0x41, 0x37, 0xed, 0x11, 0x0a, 0xf4, 0xb6, 0x69, 0xe9, 0x12, 0x37, 0xf8, 0xc5, 0x4b, 0x40, 0xa1, 0x9d, 0x01, 0xc8, 0x3a, 0xf3, 0xa9, 0xe4, 0x29, 0x2d, 0x56, 0xb7, 0x23, 0xe4, 0x84, 0xca, 0x87, 0x8b, 0xfc, 0x5b, 0xcc, 0xba, 0x15, 0xda, 0xe8, 0xe4, 0x62, 0x76, 0xd5, 0x9d, 0x4e, 0x9e, 0x65, 0x70, 0xda, 0x7f, 0x64, 0x28, 0x0c, 0x17, 0x45, 0x05, 0xf3, 0x25, 0x90, 0x24, 0xdb, 0xd6, 0x64, 0x41, 0xc7, 0xd7, 0x2d, 0x56, 0x8d, 0xb3, 0x52, 0xb1, 0x4b, 0xf5, 0xd4, 0x0c, 0xce, 0xf0, 0xda, 0x87, 0x9b, 0xef, 0x2c, 0x4f, 0xf6, 0xff, 0x13, 0xda, 0x29, 0x13, 0xa9, 0x15, 0x37, 0xac, 0x04, 0x92, 0x92, 0xc8, 0xa9, 0x28, 0x27, 0x4e, 0xab, 0x46, 0x39, 0xec, 0x37, 0x0c, 0x89, 0x41, 0xe6, 0xaf, 0xc4, 0xdc, 0xfe, 0x3e, 0x09, 0x1e, 0x29, 0xa2, 0x11, 0xe7, 0x93, 0x6b, 0x0f, 0x89, 0x3d, 0x47, 0x60, 0x42, 0x5f, 0x05, 0x21, 0xcd, 0xfe, 0x79, 0x44, 0x12, 0x05, 0x29, 0x68, 0x53, 0x19, 0xa8, 0xc9, 0x13, 0x0a, 0x4c, 0xfc, 0x79, 0x79, 0x74, 0x59, 0xac, 0xb2, 0x2f, 0x42, 0xf7, 0xf6, 0x30, 0x9d, 0xd2, 0x2b, 0xd0, 0x10, 0x6e, 0x38, 0x27, 0x50, 0x11, 0x6c, 0x6c, 0x31, + 0xe8, 0x8b, 0xf6, 0x7b, 0xe3, 0xd5, 0x00, 0xc8, 0x82, 0xda, 0x82, 0x3f, 0x41, 0x56, 0x18, 0x46, 0xbf, 0x76, 0x6e, 0xd1, 0xd0, 0xd5, 0xa8, 0x20, 0xe4, 0x51, 0x60, 0xa9, 0xfd, 0xd5, 0xa0, 0x37, 0x43, 0xef, 0x6b, 0x9d, 0x6d, 0x59, 0x0d, 0x4f, 0x56, 0xf5, 0x7f, 0xc1, 0x9f, 0xd8, 0xca, 0x65, 0x93, 0x9e, 0x80, 0xf9, 0x19, 0xfb, 0xfe, 0x0e, 0x68, 0x7c, 0x61, 0x18, 0x8a, 0x4b, 0xc4, 0xaa, 0x1a, 0x5d, 0x38, 0xe1, 0x55, 0x40, 0xfa, 0xb8, 0xb6, 0xce, 0x58, 0xca, 0xcd, 0x1e, 0xba, 0x68, 0x6f, 0xf6, 0x1f, 0xbd, 0x45, 0x49, 0xe9, 0xfc, 0xc5, 0xbf, 0xc3, 0x98, 0x00, 0xa0, 0x8a, 0xaa, 0x58, 0xb8, 0xc9, 0x69, 0xc8, 0xde, 0x24, 0x33, 0xdd, 0x35, 0xa8, 0xb2, 0xa8, 0x27, 0xec, 0x08, 0x99, 0x39, 0x26, 0xcb, 0xae, 0xe3, 0xcd, 0x0b, 0x09, 0x39, 0x9c, 0x11, 0x38, 0xf9, 0x9a, 0x0f, 0x55, 0x58, 0xbb, 0x7a, 0xb3, 0x0a, 0x4f, 0x94, 0x46, 0xb1, 0x54, 0x19, 0xb9, 0x45, 0xfb, 0x10, 0x8a, 0x14, 0x0b, 0xb8, 0xb1, 0x3f, 0xda, 0x4a, 0x3b, 0x42, 0x7e, 0xd0, 0xad, 0x78, 0x98, 0x96, 0x73, 0x5d, 0x02, 0x5a, 0xec, 0x62, 0x00, 0x85, 0x7e, 0x28, 0xd7, 0x4e, 0xdb, 0xda, 0x2d, 0xbb, 0xab, 0x53, 0xb8, 0xff, 0x7c, 0x33, 0xbc, 0xa2, 0xca, 0x95, 0xc7, 0xfe, 0x64, 0x07, 0xf1, 0xdc, 0x1d, 0xaf, 0x89, 0xfe, 0x4e, 0x82, 0x21, 0x2f, 0xbe, 0xd2, 0x88, 0x56, 0x39, 0xe6, 0xf8, 0x81, 0x0e, 0xcc, 0x62, 0xa0, 0x90, 0xf3, 0x52, 0xaf, 0xae, 0xee, 0x5d, 0x38, 0x66, 0x4f, 0x4c, 0xf0, 0x77, 0x3c, 0x5c, 0xf9, 0xec, 0xf2, 0x98, 0x9f, 0x22, 0xa0, 0xe6, 0x0b, 0x77, 0xf5, 0x04, 0x4f, 0x7c, 0x76, 0x27, 0x5f, 0x5b, 0x67, 0xfe, 0xa7, 0x89, 0x0e, 0xc3, 0xe2, 0x48, 0x1f, 0x64, 0xb7, + 0x4b, 0xda, 0x96, 0xa6, 0x65, 0x0b, 0x2f, 0x33, 0x85, 0x42, 0xf0, 0x3a, 0x45, 0x69, 0xef, 0x38, 0xc5, 0xf0, 0x68, 0x26, 0x74, 0xdf, 0xd5, 0x0e, 0x6f, 0x67, 0xf5, 0xbf, 0x17, 0x4d, 0x5c, 0x70, 0x53, 0x75, 0x69, 0x32, 0x77, 0x26, 0x6c, 0xe0, 0x7e, 0x21, 0x2b, 0x23, 0x33, 0x98, 0x23, 0x62, 0x55, 0x54, 0x43, 0x8b, 0x26, 0xf8, 0xb3, 0xf6, 0x13, 0x00, 0xde, 0xa7, 0x54, 0x16, 0x6e, 0xf2, 0x21, 0x8d, 0x06, 0x78, 0x9e, 0x49, 0x2c, 0x1e, 0xcf, 0x6d, 0x75, 0xce, 0xb9, 0x89, 0x71, 0xdb, 0xed, 0xf0, 0x1c, 0xaa, 0x68, 0x08, 0xb0, 0x7f, 0xbb, 0x2b, 0xf6, 0xb6, 0x4f, 0xcd, 0xdc, 0x83, 0x38, 0x24, 0xfd, 0x87, 0x5e, 0xb5, 0x6a, 0x70, 0x88, 0xd7, 0x70, 0x04, 0xe3, 0x55, 0xf6, 0xa5, 0x41, 0xac, 0xc5, 0x59, 0x90, 0x34, 0xb5, 0x16, 0x2b, 0x0c, 0xe1, 0x0b, 0x34, 0xac, 0x48, 0x31, 0x11, 0x02, 0x6c, 0xd1, 0xc7, 0x34, 0x91, 0x97, 0x01, 0x82, 0x85, 0x52, 0xdc, 0x14, 0x20, 0x5b, 0xbb, 0xfa, 0xa8, 0x19, 0xbb, 0x82, 0x43, 0xaa, 0x14, 0xaf, 0x77, 0x76, 0x21, 0xa9, 0xb4, 0xc8, 0xbc, 0xd6, 0xe5, 0xdc, 0x99, 0x6f, 0x5a, 0x6e, 0x14, 0x0f, 0xc1, 0x7c, 0x98, 0x7d, 0xee, 0x71, 0xa0, 0x8e, 0x34, 0x25, 0x05, 0xbe, 0x42, 0x16, 0x20, 0x57, 0x60, 0x7d, 0xfe, 0xa5, 0xc9, 0x1b, 0x5a, 0x7f, 0x77, 0x97, 0x19, 0x2d, 0x2d, 0x9e, 0x4e, 0x64, 0xb5, 0xb7, 0x36, 0x1b, 0x9f, 0x65, 0x05, 0x96, 0xb1, 0x97, 0xf3, 0x33, 0x41, 0x60, 0xd6, 0x8c, 0x32, 0xe4, 0x26, 0x9a, 0x1d, 0x2e, 0x00, 0x04, 0x16, 0x48, 0xce, 0xbe, 0xd7, 0xf4, 0xcc, 0x69, 0xf6, 0x65, 0xe0, 0x8e, 0xf9, 0x16, 0x40, 0x4d, 0xdf, 0x1e, 0xa0, 0xd7, 0x9a, 0xf3, 0x4b, 0x5a, 0x2f, 0xe2, 0x4c, 0x61, 0xf6, 0x03, + 0x63, 0x69, 0xd5, 0xe8, 0xf2, 0xc6, 0xde, 0x67, 0x44, 0x19, 0x52, 0xc7, 0xc5, 0x84, 0xac, 0x99, 0xd2, 0x22, 0xb0, 0x17, 0x7f, 0x16, 0x1e, 0xb8, 0x5c, 0x2e, 0xfb, 0x27, 0x79, 0xe2, 0x68, 0xbc, 0x70, 0x15, 0xcf, 0xc0, 0x7b, 0x65, 0x25, 0x78, 0xe2, 0x04, 0xb2, 0xe0, 0xde, 0xb0, 0xac, 0x5f, 0xa5, 0x24, 0x37, 0xed, 0x57, 0xc3, 0x19, 0x14, 0x40, 0xb2, 0xd8, 0x80, 0xe4, 0xd3, 0x65, 0x40, 0xd6, 0xb0, 0xd8, 0xe0, 0x1a, 0x89, 0x04, 0xe0, 0x5b, 0x86, 0xed, 0xf9, 0xd9, 0xab, 0x6b, 0x88, 0x34, 0xa7, 0x14, 0x5a, 0x25, 0xe9, 0x8a, 0x4c, 0x8d, 0xc0, 0x0d, 0xa6, 0x63, 0xea, 0x60, 0x8c, 0xb1, 0x65, 0x24, 0x28, 0xd0, 0xf3, 0x06, 0xa1, 0x6a, 0x16, 0x0f, 0xe0, 0x39, 0x6e, 0xed, 0x76, 0xba, 0xf9, 0xfe, 0x2e, 0x01, 0x49, 0x95, 0xd2, 0xf2, 0xb8, 0x73, 0xfa, 0xbb, 0x79, 0xc6, 0x97, 0xd2, 0x6e, 0xac, 0x12, 0xd8, 0xd2, 0x46, 0xd4, 0xe2, 0xa6, 0xc0, 0xbc, 0x94, 0xb7, 0x26, 0xc9, 0xcd, 0x55, 0xc0, 0x09, 0x2c, 0x83, 0x2e, 0x9f, 0xcb, 0x44, 0x57, 0x6b, 0x3f, 0xf7, 0x75, 0x15, 0xb6, 0xf3, 0x69, 0xb9, 0x8a, 0x35, 0x2c, 0x06, 0xd1, 0xd6, 0xa1, 0x8b, 0x0c, 0xfb, 0x65, 0x5f, 0x73, 0xd0, 0x7c, 0x0d, 0x3a, 0x5b, 0x48, 0xd2, 0xc9, 0xb6, 0x80, 0xc7, 0xae, 0x6a, 0x43, 0x7d, 0xa7, 0x12, 0x09, 0x49, 0x38, 0x06, 0xc0, 0xd8, 0x86, 0x8b, 0x7c, 0xe7, 0xbb, 0x98, 0xa0, 0xa7, 0xa5, 0xfd, 0x09, 0xa9, 0x72, 0x1b, 0x75, 0x46, 0xa6, 0xbf, 0x47, 0x1a, 0xcb, 0xb6, 0x2c, 0xd7, 0x89, 0xef, 0xa6, 0x3a, 0x49, 0x6c, 0x4d, 0x91, 0x0e, 0xc5, 0x23, 0x9a, 0x23, 0x4d, 0x99, 0x00, 0x8e, 0x7b, 0xd7, 0x78, 0xf3, 0x90, 0xf0, 0xd4, 0x8a, 0xd5, 0x3e, 0xa9, 0x2c, 0x3e, 0xff, 0x73, + 0x13, 0xde, 0x2b, 0x38, 0xc7, 0x6e, 0x7c, 0x7b, 0x0b, 0x3d, 0x70, 0x42, 0x4f, 0xe8, 0x9e, 0x57, 0x8a, 0xf6, 0x21, 0xa8, 0x96, 0x17, 0x87, 0xb3, 0x42, 0xba, 0xbf, 0x8b, 0x64, 0xed, 0x91, 0x9f, 0xbd, 0x56, 0x1b, 0x88, 0x9c, 0x07, 0xde, 0x06, 0x0f, 0x11, 0x0c, 0x21, 0xc1, 0xea, 0x2a, 0xb1, 0x18, 0x36, 0x5d, 0xa3, 0x1c, 0x3a, 0x5a, 0xf3, 0xf7, 0x41, 0xad, 0xed, 0xf8, 0x77, 0x18, 0xda, 0xa8, 0x8c, 0x84, 0x62, 0x4a, 0x9d, 0xc9, 0x02, 0x5b, 0x5d, 0xa7, 0x62, 0x2c, 0x29, 0x77, 0x26, 0xec, 0x0c, 0xd3, 0x01, 0x57, 0x53, 0xda, 0x84, 0x43, 0xa6, 0x51, 0xcb, 0x10, 0xdf, 0x1e, 0xa3, 0x76, 0x63, 0xd3, 0xc2, 0xb2, 0xb3, 0x44, 0xab, 0x50, 0x1c, 0x28, 0x18, 0xdb, 0x2b, 0x7e, 0x5e, 0xb8, 0xe7, 0x7d, 0xef, 0xbe, 0xf5, 0xaf, 0xc7, 0x0a, 0x9e, 0x0a, 0xe0, 0xf6, 0x70, 0xb4, 0xd0, 0x0b, 0x65, 0xbe, 0x52, 0x20, 0x52, 0xa6, 0x23, 0x10, 0x14, 0x84, 0x4b, 0x32, 0xb9, 0x22, 0x00, 0x61, 0xb3, 0xb1, 0x21, 0xa5, 0x7d, 0x44, 0x10, 0x08, 0x31, 0xa9, 0x7f, 0x52, 0x4d, 0x9c, 0x37, 0x51, 0xf2, 0xe0, 0x84, 0x77, 0xd4, 0x0d, 0x42, 0xe7, 0x19, 0x3e, 0x2c, 0x76, 0xd4, 0x0d, 0x34, 0x0b, 0x98, 0xae, 0xe2, 0x58, 0xbd, 0xc2, 0x51, 0x3e, 0xa6, 0x01, 0xa0, 0xb9, 0x24, 0x43, 0x59, 0xf8, 0xc8, 0xcd, 0x43, 0x7f, 0xfd, 0xa4, 0x80, 0x0c, 0xf2, 0xfd, 0x05, 0x9d, 0x57, 0x3b, 0x40, 0x24, 0xe1, 0xde, 0x32, 0xb5, 0x84, 0x62, 0x64, 0x36, 0x2b, 0x10, 0xab, 0x8f, 0x00, 0x4f, 0xa2, 0xb1, 0x02, 0x06, 0xa7, 0xd3, 0x23, 0x79, 0xe4, 0x71, 0xf2, 0x1c, 0xae, 0x7f, 0xa3, 0xf4, 0x2d, 0xe0, 0x18, 0xda, 0x18, 0x1c, 0xb7, 0xa6, 0x1e, 0xa8, 0x1f, 0x78, 0xfb, 0x92, 0xa8, 0x0e, 0x5c, + 0x11, 0xf2, 0x52, 0x14, 0x36, 0x8a, 0xc2, 0x89, 0xd2, 0x91, 0xb9, 0x6a, 0x14, 0x4e, 0x5f, 0x26, 0xf0, 0xf7, 0x97, 0x2c, 0x38, 0x88, 0x34, 0xf4, 0xef, 0xa7, 0x29, 0x61, 0x55, 0x83, 0xd6, 0xe3, 0xeb, 0x3d, 0x2a, 0xdb, 0xaa, 0x72, 0xd1, 0x2f, 0xeb, 0xce, 0x3d, 0x7c, 0xcd, 0x5e, 0x63, 0x6d, 0xff, 0x49, 0x01, 0x1e, 0xcf, 0x9b, 0x01, 0xd1, 0xfb, 0xa5, 0x8e, 0x0f, 0x7b, 0x51, 0xaa, 0x25, 0x1f, 0x00, 0x18, 0x51, 0xf5, 0xdb, 0x3b, 0xf9, 0x4d, 0x30, 0x1b, 0x98, 0x6e, 0x73, 0xbe, 0xf8, 0xd5, 0xea, 0x88, 0xce, 0xb5, 0x64, 0x2c, 0x2a, 0x64, 0x67, 0xb7, 0xe0, 0x3a, 0x83, 0xc2, 0x70, 0x23, 0x9a, 0x19, 0x7e, 0x36, 0x6d, 0x45, 0xa7, 0x64, 0x8c, 0xd5, 0xe4, 0x0c, 0x58, 0xea, 0x79, 0xb9, 0x03, 0xa4, 0xdd, 0x1f, 0xa4, 0xcc, 0xd7, 0xdb, 0xee, 0xd3, 0x0e, 0x8b, 0x19, 0x59, 0x41, 0x54, 0x7b, 0xfd, 0x19, 0x50, 0x01, 0x80, 0x47, 0x91, 0xfa, 0x0d, 0x6f, 0xe5, 0xde, 0xc0, 0x1f, 0x45, 0xed, 0x90, 0xbb, 0x30, 0x8a, 0xd4, 0xb6, 0xfc, 0x41, 0xa1, 0xd3, 0x08, 0xa6, 0x64, 0x05, 0xc4, 0x2d, 0x6b, 0xfd, 0x5c, 0xaa, 0xb5, 0xde, 0x79, 0x22, 0x9d, 0x6f, 0x60, 0xe2, 0x63, 0x0b, 0xbc, 0x97, 0x72, 0xca, 0xd4, 0xd8, 0x9a, 0x52, 0x18, 0xa6, 0xff, 0x7b, 0xc0, 0x4b, 0xd7, 0x8c, 0x3f, 0xf1, 0xa4, 0x33, 0xc1, 0x2c, 0x18, 0x04, 0xd7, 0x90, 0xef, 0x00, 0x9e, 0xbc, 0xc9, 0xc5, 0x52, 0xaa, 0x43, 0x65, 0x3f, 0xa3, 0xb7, 0x96, 0xbd, 0xc6, 0x84, 0xab, 0x45, 0xec, 0x66, 0x5b, 0x31, 0xd9, 0x3c, 0xff, 0x5c, 0x7a, 0xb0, 0x07, 0xdf, 0x36, 0x04, 0x8b, 0x83, 0xbb, 0x08, 0xf4, 0x8e, 0xc8, 0x52, 0xe3, 0x3c, 0x36, 0xe5, 0xca, 0x9a, 0x09, 0x6b, 0x79, 0x02, 0x81, 0xf3, 0xe9, + 0xed, 0xdd, 0x73, 0xa7, 0x10, 0xc1, 0x00, 0x23, 0xec, 0x16, 0x23, 0xcc, 0x75, 0xe1, 0x5d, 0x9e, 0x5d, 0x35, 0x6d, 0x93, 0xe2, 0x2a, 0xa7, 0xda, 0x60, 0x8e, 0x4b, 0x43, 0x41, 0xf9, 0x55, 0xf3, 0x39, 0x3e, 0x84, 0x85, 0x8b, 0x38, 0x02, 0x80, 0x5b, 0xc5, 0x0c, 0x55, 0x8c, 0x0f, 0x66, 0x64, 0x03, 0x6e, 0x5a, 0xb0, 0xee, 0xfc, 0x5f, 0x18, 0x7d, 0xa5, 0x0e, 0x48, 0xa7, 0x3b, 0xd6, 0x10, 0xf8, 0xf8, 0x48, 0x4b, 0xec, 0x81, 0x37, 0x94, 0x68, 0xdd, 0x52, 0x99, 0x12, 0xfa, 0x1e, 0x21, 0x0a, 0x23, 0xb3, 0x45, 0xbd, 0x4f, 0x5c, 0x21, 0x07, 0xb4, 0xf1, 0x17, 0xd8, 0x08, 0xc0, 0xb8, 0x77, 0x56, 0xe9, 0xdc, 0xe0, 0xd2, 0x4e, 0x88, 0x9e, 0x44, 0x72, 0x5e, 0x76, 0x77, 0x28, 0xa8, 0xfd, 0xb2, 0x71, 0xc0, 0x7c, 0x6d, 0xc1, 0x70, 0x78, 0xc3, 0x8c, 0x0b, 0x3f, 0x4a, 0x80, 0x36, 0x39, 0xc8, 0x07, 0xd7, 0x9c, 0x93, 0x63, 0x8e, 0xcb, 0x25, 0xcc, 0x0c, 0xb8, 0xcb, 0x8e, 0x2a, 0x49, 0x8c, 0xdb, 0x28, 0x3f, 0x30, 0x70, 0xe8, 0xd6, 0x37, 0x90, 0xe3, 0x2a, 0x70, 0xbc, 0x2e, 0x0a, 0xb8, 0x61, 0x35, 0x2d, 0x2b, 0xa5, 0xcb, 0xe3, 0xe8, 0xb7, 0xad, 0x7b, 0xef, 0x6b, 0xf6, 0x0a, 0x15, 0x24, 0xc3, 0xda, 0xc1, 0x40, 0x1d, 0x9c, 0x71, 0x82, 0xa1, 0x25, 0x98, 0x85, 0xa7, 0x36, 0x9b, 0xd4, 0x03, 0x41, 0x97, 0xf4, 0x37, 0x02, 0x79, 0xd5, 0x8d, 0xee, 0x5b, 0x9a, 0x7d, 0x7b, 0x74, 0x9d, 0x3f, 0x84, 0x87, 0x29, 0x38, 0x85, 0x56, 0xb2, 0xc1, 0xba, 0x75, 0xc9, 0xec, 0x58, 0xfb, 0x72, 0x31, 0x4f, 0x18, 0x4e, 0xfe, 0x5b, 0x37, 0x69, 0x54, 0x40, 0x21, 0x40, 0xd7, 0x78, 0x24, 0x94, 0x94, 0x75, 0x6b, 0x9b, 0xb0, 0x06, 0x69, 0x67, 0x77, 0x60, 0x92, 0xd6, 0x22, + 0x14, 0x4e, 0x72, 0xcc, 0x74, 0x0f, 0x79, 0x0a, 0x2d, 0x27, 0xc7, 0xcd, 0x83, 0x90, 0x7a, 0xc7, 0x36, 0xbd, 0xae, 0x8f, 0x4b, 0xe5, 0x5f, 0x6a, 0xfb, 0x40, 0x13, 0x39, 0x94, 0x0a, 0xf1, 0xb2, 0x13, 0xdd, 0x13, 0x34, 0xe2, 0x44, 0x67, 0xc0, 0x6a, 0x28, 0x57, 0x7b, 0xf6, 0xc1, 0x07, 0xa1, 0xb0, 0xff, 0x11, 0xb4, 0x27, 0xdf, 0x84, 0xbc, 0x87, 0x3d, 0x3e, 0xa9, 0xcf, 0x78, 0x66, 0x84, 0xdf, 0x9c, 0xc1, 0x0b, 0x5f, 0x7f, 0x1e, 0x76, 0xba, 0x09, 0x63, 0x88, 0xa4, 0x10, 0x6c, 0x37, 0xa5, 0x4e, 0x7e, 0xc5, 0x6c, 0x6e, 0xfd, 0x79, 0xb8, 0x66, 0x10, 0x19, 0xa0, 0xd1, 0x0e, 0x28, 0x08, 0xb5, 0x4e, 0xaf, 0xd9, 0x4e, 0x8f, 0x6a, 0x8a, 0x4c, 0x88, 0x38, 0x3a, 0x34, 0x92, 0xf9, 0x13, 0x65, 0x12, 0x1c, 0xbd, 0x7f, 0x1d, 0xac, 0x1a, 0x4f, 0x8b, 0xbb, 0x98, 0x02, 0xe1, 0xcb, 0xfd, 0xc9, 0x89, 0x92, 0x80, 0x7c, 0xaf, 0xba, 0x01, 0xcb, 0x9c, 0x6d, 0xba, 0x20, 0x26, 0x94, 0xfd, 0x11, 0x25, 0x7e, 0xa0, 0x60, 0x58, 0x78, 0xb1, 0x3c, 0xd1, 0x45, 0x39, 0xf7, 0x9b, 0x95, 0xa6, 0x1a, 0xf3, 0xc9, 0x16, 0xfa, 0x44, 0xe3, 0xb7, 0x05, 0x66, 0x61, 0xfd, 0x27, 0x79, 0x38, 0xeb, 0xfb, 0x46, 0xd0, 0x14, 0xd5, 0xd7, 0xba, 0x97, 0x2a, 0xf1, 0x99, 0xab, 0xae, 0x4c, 0xda, 0xc1, 0xb0, 0x03, 0x8a, 0x45, 0xae, 0x8f, 0x68, 0xa7, 0x08, 0xd4, 0x24, 0x9f, 0xb0, 0xa4, 0x1c, 0x1c, 0x11, 0x66, 0xf8, 0x2d, 0xe4, 0xe3, 0x83, 0x06, 0x50, 0x16, 0xf1, 0x22, 0x38, 0x68, 0xeb, 0x00, 0x3e, 0x0f, 0x67, 0xb9, 0xe6, 0xa9, 0x55, 0x97, 0x82, 0x8a, 0xac, 0x86, 0x59, 0x22, 0x86, 0xb6, 0xbe, 0xf5, 0xa7, 0xc7, 0x69, 0x38, 0xc0, 0xb7, 0x93, 0x59, 0xf9, 0x11, 0x66, 0xc6, 0xbd, + 0x07, 0xa5, 0x0c, 0xfb, 0x4f, 0x74, 0x21, 0xa9, 0xdb, 0x19, 0x98, 0x29, 0x74, 0xa8, 0xa8, 0xcb, 0x48, 0x4d, 0x79, 0xa8, 0xaa, 0x2d, 0x24, 0xab, 0x52, 0x6f, 0x30, 0x11, 0x2b, 0x0b, 0xd1, 0xb2, 0x34, 0xee, 0xd1, 0xd6, 0x6e, 0xcb, 0xfc, 0xbf, 0x57, 0x34, 0x0b, 0xf7, 0xdd, 0xd3, 0x4b, 0xa4, 0xb1, 0xc5, 0x10, 0x86, 0x46, 0x62, 0x01, 0xfc, 0x0b, 0xb3, 0x5c, 0x07, 0xd1, 0x86, 0x33, 0x07, 0x3d, 0x49, 0xba, 0xb2, 0xc2, 0x6d, 0x02, 0x70, 0xa3, 0xd4, 0xd0, 0x01, 0x1c, 0x85, 0x13, 0xe0, 0x32, 0xb2, 0x80, 0x4f, 0xd7, 0xfb, 0x7c, 0x1d, 0xfd, 0xa2, 0xf2, 0xfd, 0x56, 0x6e, 0xe8, 0x9c, 0x50, 0xe8, 0x51, 0x21, 0x6d, 0xe3, 0xad, 0xdc, 0xc2, 0x18, 0x47, 0x21, 0xf8, 0xc5, 0x3c, 0xd5, 0xc4, 0x67, 0x98, 0x99, 0x04, 0xd7, 0x93, 0x1f, 0x45, 0x57, 0xe4, 0xcb, 0x9f, 0xc4, 0x84, 0xe7, 0x61, 0xe6, 0x77, 0x6a, 0x0a, 0x29, 0x6d, 0x2c, 0x7a, 0xe4, 0xf6, 0x21, 0x93, 0x54, 0xc8, 0x15, 0x05, 0x0e, 0xa3, 0x31, 0xa7, 0x4c, 0x8f, 0xa3, 0xad, 0x7d, 0xe3, 0xe6, 0xe8, 0x68, 0xe1, 0xf6, 0x46, 0xaa, 0x67, 0x6c, 0x0e, 0xa7, 0x78, 0xd0, 0x11, 0x84, 0x3b, 0xfe, 0xd6, 0xa1, 0x36, 0x7e, 0x31, 0x2e, 0x38, 0x0e, 0x9a, 0xa8, 0x31, 0xae, 0x14, 0xb1, 0xdc, 0xb2, 0x96, 0x94, 0xec, 0x9b, 0xf6, 0x36, 0x4b, 0x02, 0x6a, 0x2c, 0x2b, 0x2b, 0x17, 0xdc, 0x67, 0x14, 0x49, 0x60, 0xa2, 0xd8, 0x31, 0xc4, 0x19, 0xa7, 0x06, 0x7f, 0xf2, 0xd1, 0x52, 0x28, 0x3c, 0x61, 0x98, 0x75, 0xfb, 0xfc, 0x8c, 0x6c, 0x4a, 0xb7, 0x8d, 0x3b, 0xa1, 0xd7, 0x58, 0xc3, 0x8d, 0x37, 0x7d, 0x9c, 0x63, 0xef, 0xeb, 0xda, 0xaa, 0xf2, 0x72, 0x00, 0x7f, 0xe3, 0xe0, 0xfd, 0xc9, 0xf7, 0x04, 0x03, 0x88, 0xba, + 0x28, 0x50, 0x75, 0x30, 0x39, 0xdb, 0x91, 0x07, 0x9b, 0x7b, 0x54, 0xf3, 0x7d, 0x91, 0x53, 0x0b, 0x0a, 0x8d, 0x57, 0x44, 0xe4, 0xd5, 0x4a, 0x94, 0xf7, 0x8a, 0xd4, 0x7e, 0x59, 0x45, 0x51, 0x09, 0x20, 0x58, 0xc8, 0xef, 0x91, 0x1c, 0xe7, 0x89, 0xaa, 0xd3, 0x22, 0xe3, 0xf1, 0xf1, 0xd0, 0x7c, 0x5c, 0x03, 0x79, 0x1a, 0xa8, 0xdd, 0xa8, 0x19, 0x51, 0x25, 0x23, 0x1b, 0x7f, 0x37, 0xaa, 0x8c, 0xf1, 0x18, 0x59, 0x45, 0x27, 0xbe, 0xf4, 0x0b, 0xa8, 0xb6, 0x2e, 0xcc, 0x13, 0xce, 0xaa, 0x84, 0xcb, 0xf3, 0x37, 0xd0, 0xb7, 0x07, 0x4e, 0x75, 0xbc, 0xcd, 0xe9, 0x9e, 0xac, 0xff, 0x37, 0x64, 0xe7, 0x5c, 0x25, 0xe3, 0xd5, 0x70, 0x05, 0x54, 0x3e, 0xe7, 0x30, 0x3c, 0x7c, 0xe9, 0x18, 0xc0, 0x2a, 0x52, 0xda, 0xf0, 0x6b, 0x6d, 0x8e, 0x17, 0x71, 0xdf, 0xc7, 0x14, 0x61, 0x53, 0xd1, 0xa1, 0xcc, 0x20, 0x06, 0xcc, 0x40, 0xcd, 0x20, 0x1d, 0x05, 0x4c, 0x26, 0xed, 0xe1, 0x46, 0xb5, 0x49, 0xc1, 0x12, 0x74, 0x5f, 0xeb, 0x52, 0x1a, 0x2f, 0x1f, 0x12, 0x0a, 0x45, 0x03, 0x3d, 0xa6, 0x97, 0x19, 0xe3, 0xcf, 0x3e, 0x61, 0x10, 0xd3, 0x74, 0x58, 0xea, 0xa3, 0xff, 0xe9, 0x24, 0xbb, 0x0b, 0x11, 0xe9, 0x5f, 0x9a, 0x7b, 0x09, 0xf6, 0xbb, 0x11, 0x78, 0x22, 0x39, 0xdf, 0xdb, 0x56, 0xa4, 0xa1, 0x2e, 0xf6, 0x7b, 0x94, 0x0c, 0x32, 0x8e, 0x77, 0xcb, 0x99, 0x9e, 0x09, 0xf7, 0x5d, 0x11, 0x0e, 0xcc, 0x73, 0x88, 0xed, 0x54, 0xa1, 0xae, 0xb6, 0x3d, 0x17, 0x0f, 0x49, 0x00, 0xee, 0xfb, 0x43, 0xa4, 0xaf, 0xc4, 0xb2, 0xf3, 0x34, 0x9e, 0xee, 0xcc, 0x5a, 0xbb, 0xa1, 0x17, 0xfe, 0xed, 0x76, 0x76, 0x17, 0x7b, 0x18, 0xb5, 0xb4, 0xe1, 0x07, 0xea, 0x0d, 0x4f, 0xf5, 0x4e, 0x27, 0x68, + 0x96, 0x7f, 0xd2, 0x45, 0xb3, 0x21, 0x6b, 0x55, 0xd8, 0xff, 0x06, 0x42, 0xaf, 0x7f, 0x6f, 0xa7, 0x30, 0xb2, 0xba, 0x44, 0xd1, 0x52, 0xf9, 0xb7, 0x20, 0x33, 0x3e, 0xb0, 0x05, 0x46, 0xbd, 0xff, 0x7e, 0xd1, 0xae, 0xd3, 0x58, 0x2e, 0x9d, 0x71, 0x96, 0xee, 0x55, 0x85, 0xd4, 0xe5, 0x2d, 0x52, 0x1c, 0xd2, 0x8b, 0x16, 0xdb, 0x33, 0x53, 0x09, 0x84, 0xd4, 0x18, 0x44, 0xaf, 0x90, 0x30, 0xf2, 0x9b, 0x2b, 0x9d, 0x7d, 0xa7, 0x47, 0x7f, 0x01, 0xf0, 0xb7, 0x0c, 0x13, 0x27, 0x05, 0x56, 0x2e, 0xc3, 0x52, 0xc5, 0x73, 0x78, 0x9f, 0x74, 0xbd, 0x4e, 0xbf, 0x03, 0xdd, 0x89, 0xa4, 0xdd, 0xbc, 0x27, 0xcb, 0xb7, 0x90, 0xaa, 0xc4, 0x81, 0xa4, 0x88, 0x12, 0xdb, 0x90, 0xf8, 0xcf, 0x83, 0x58, 0x1c, 0x8c, 0xee, 0xfb, 0xe0, 0xc1, 0xc4, 0xe7, 0x23, 0x8a, 0xb6, 0x9d, 0xf7, 0x41, 0xaf, 0xc0, 0x4f, 0x7a, 0x35, 0x8b, 0xc3, 0x8d, 0xd2, 0xbb, 0xa2, 0x9a, 0x88, 0xc3, 0x08, 0x9a, 0xbd, 0xb4, 0x08, 0x2e, 0x6a, 0xa2, 0x8d, 0x25, 0x99, 0x5b, 0x41, 0xf2, 0xbb, 0x8f, 0x26, 0x6f, 0x0c, 0x47, 0xf0, 0x70, 0xa3, 0xbf, 0x06, 0x05, 0x42, 0xb1, 0xa1, 0xb3, 0x03, 0x3c, 0xd4, 0x35, 0x55, 0xde, 0x3d, 0x2c, 0x38, 0x5b, 0x62, 0x1e, 0x9c, 0xe4, 0x7a, 0xfb, 0x0f, 0x13, 0xbf, 0xd6, 0xff, 0xd8, 0xbe, 0xee, 0xbf, 0xdc, 0xec, 0xcb, 0x63, 0xcf, 0xd0, 0x65, 0x17, 0x8c, 0x69, 0x03, 0x9b, 0x75, 0xc8, 0xc5, 0x6d, 0x52, 0xe1, 0xce, 0xfb, 0x06, 0x8e, 0x09, 0x7a, 0xc5, 0x4b, 0xdf, 0xe7, 0x92, 0xbe, 0xd4, 0xc3, 0x36, 0x93, 0x34, 0x93, 0x9f, 0x5d, 0x63, 0x01, 0x85, 0xc4, 0xf5, 0x06, 0xd9, 0xcd, 0x4d, 0x9f, 0xd9, 0x32, 0x6f, 0x03, 0xb3, 0xcb, 0xc5, 0x24, 0x64, 0x23, 0x29, 0xa2, 0x30, + 0xc4, 0xf6, 0x00, 0xbd, 0x64, 0x15, 0x55, 0x94, 0x48, 0x7e, 0xe5, 0x20, 0x45, 0x74, 0x42, 0x59, 0x59, 0xf7, 0x6a, 0xd7, 0x76, 0xb4, 0x74, 0xdb, 0x6f, 0x80, 0x8a, 0xfe, 0x38, 0xdc, 0x4c, 0x4d, 0xbe, 0x2f, 0xbd, 0xb3, 0x19, 0xe8, 0xd3, 0x1b, 0x7e, 0x0f, 0x08, 0xfe, 0x46, 0x81, 0x43, 0x55, 0xf3, 0xc9, 0x05, 0x6d, 0x72, 0xbc, 0x2f, 0x20, 0x7e, 0xec, 0xa3, 0x2a, 0x17, 0x3c, 0x6f, 0x73, 0x41, 0x02, 0xe6, 0xc7, 0x8c, 0xf5, 0xaa, 0x27, 0x50, 0xac, 0x49, 0x00, 0x5b, 0x49, 0xfb, 0xa3, 0xc9, 0x15, 0x4a, 0x3f, 0xde, 0x12, 0xf3, 0x95, 0xc2, 0x93, 0x5c, 0x69, 0x44, 0xf2, 0x98, 0x32, 0xb6, 0x92, 0x13, 0x23, 0xd1, 0x1e, 0x2f, 0x00, 0xc6, 0x22, 0x6b, 0xae, 0xea, 0x23, 0x0d, 0xb3, 0xb1, 0xd5, 0x6a, 0xc3, 0x01, 0x73, 0x61, 0xab, 0x3a, 0x63, 0x1b, 0x4c, 0xfa, 0x2b, 0xbd, 0x03, 0x54, 0x96, 0x00, 0xa2, 0x1c, 0xc3, 0xdb, 0xc3, 0xbb, 0xdd, 0xa4, 0xd9, 0xaa, 0x31, 0x8a, 0xdd, 0xb6, 0xdd, 0xf8, 0x6b, 0x59, 0x4c, 0xc4, 0xd0, 0x0c, 0xc0, 0xaf, 0x1a, 0xc5, 0x45, 0x02, 0xe9, 0x0d, 0xff, 0x82, 0xb0, 0x2d, 0x55, 0x62, 0x57, 0x28, 0xe0, 0x95, 0x9e, 0x5a, 0xd9, 0x74, 0xc5, 0xf5, 0xcb, 0x8f, 0xb1, 0x33, 0xd9, 0xb8, 0x6b, 0x41, 0x5e, 0x23, 0x8e, 0x53, 0x79, 0x53, 0x5d, 0x49, 0x3e, 0x1c, 0x32, 0xba, 0x43, 0xc2, 0x15, 0xa2, 0xef, 0x73, 0x53, 0x60, 0x9e, 0x04, 0xf3, 0xa7, 0x8d, 0xe5, 0xdf, 0x3b, 0x26, 0x6d, 0xa5, 0x4a, 0xc1, 0xf2, 0x6b, 0xae, 0xed, 0xbd, 0x58, 0x37, 0x29, 0xa4, 0xea, 0xd2, 0x32, 0x16, 0xd7, 0x7e, 0x7a, 0xde, 0x2c, 0x6b, 0xae, 0x4f, 0xa8, 0x18, 0x95, 0x95, 0xa3, 0x6f, 0xdf, 0x63, 0x58, 0xfe, 0xaf, 0x78, 0x61, 0x77, 0x91, 0x05, 0x46, + 0x85, 0xc1, 0x1b, 0x0e, 0xfa, 0x17, 0x55, 0x9f, 0x16, 0xfe, 0x16, 0x15, 0x6e, 0x9a, 0x49, 0xa3, 0xd5, 0xcb, 0x44, 0xbb, 0x30, 0x19, 0xda, 0x78, 0xb8, 0x07, 0xda, 0xb3, 0xfe, 0x99, 0xdf, 0x03, 0xcc, 0x90, 0x6f, 0xf9, 0x49, 0x76, 0xa4, 0x1d, 0x6f, 0x96, 0x9c, 0x86, 0x1e, 0xfa, 0x2d, 0x66, 0x2b, 0x3b, 0xe6, 0xc4, 0x62, 0x61, 0x90, 0xd6, 0xfa, 0x52, 0x30, 0xe2, 0xc4, 0xfd, 0x12, 0xfa, 0x43, 0xb8, 0x3f, 0x0b, 0x4d, 0x3c, 0x4f, 0xfe, 0x45, 0x24, 0x0e, 0x51, 0xe0, 0x26, 0x51, 0x29, 0x55, 0x29, 0x7f, 0xfd, 0x0b, 0x0c, 0x8a, 0x94, 0xa4, 0x46, 0x62, 0x02, 0xc0, 0xfd, 0x82, 0x71, 0xd3, 0xde, 0x19, 0xfb, 0x27, 0x65, 0xc8, 0xc6, 0x62, 0x20, 0xf0, 0xe8, 0x1c, 0x78, 0x56, 0x33, 0x91, 0x65, 0x46, 0xe0, 0xa8, 0x81, 0xd5, 0xc2, 0xd4, 0x93, 0xd1, 0x0d, 0xfc, 0xc6, 0xbf, 0x5d, 0x3b, 0x22, 0xca, 0xf5, 0x81, 0xeb, 0xde, 0xcb, 0x9c, 0x84, 0xbc, 0xe4, 0x27, 0x14, 0x14, 0xfb, 0x2c, 0x09, 0x60, 0xc3, 0x00, 0xd3, 0xcf, 0x3a, 0xb8, 0xae, 0x50, 0xd5, 0xce, 0x21, 0x33, 0x31, 0x8a, 0x6c, 0x09, 0xd8, 0xc5, 0xaa, 0x52, 0x9b, 0x11, 0xb9, 0xfe, 0x09, 0xb4, 0xef, 0x3f, 0xe2, 0xae, 0xb4, 0xf3, 0xe7, 0xdf, 0xeb, 0xc1, 0xc1, 0x1a, 0x6e, 0xee, 0x19, 0x50, 0x4d, 0x91, 0xad, 0x16, 0x2f, 0xd9, 0x81, 0xaa, 0xc7, 0x2d, 0x4e, 0xc4, 0x0e, 0xc0, 0x19, 0x26, 0x81, 0x61, 0xf8, 0x3f, 0x61, 0x39, 0xa2, 0xd9, 0x7d, 0x9e, 0x86, 0xd9, 0x7d, 0xa9, 0x00, 0x91, 0x5a, 0xf5, 0x4a, 0xf6, 0xae, 0x86, 0xfe, 0x20, 0xd0, 0xbb, 0xcb, 0x2a, 0x2d, 0xb0, 0x76, 0x4d, 0x2f, 0x8b, 0x95, 0xb1, 0xd4, 0xc3, 0x0d, 0xf0, 0x29, 0x0b, 0xc2, 0x16, 0xb8, 0x43, 0xa5, 0xfa, 0x26, 0x10, 0x20, + 0x1e, 0xa3, 0x8a, 0x90, 0x25, 0x1f, 0xa9, 0xca, 0xf0, 0xed, 0x28, 0x14, 0xe8, 0x8a, 0x81, 0x39, 0x5c, 0x29, 0x71, 0x21, 0xe9, 0x9a, 0x90, 0x91, 0x90, 0xf9, 0x1e, 0x4b, 0x69, 0x31, 0xa5, 0xa2, 0x9c, 0x55, 0x04, 0xb4, 0x87, 0xe4, 0xac, 0x9d, 0xed, 0xd2, 0x48, 0xec, 0xbb, 0xa7, 0x03, 0x88, 0x00, 0xa8, 0x29, 0x9a, 0x58, 0x6e, 0x7c, 0xa0, 0x20, 0x34, 0x34, 0x84, 0xd5, 0x67, 0x2e, 0xac, 0xb5, 0x07, 0x86, 0x3b, 0x99, 0x1d, 0x54, 0x7e, 0xc1, 0x79, 0x9a, 0x3e, 0x61, 0x41, 0xe0, 0xf5, 0x22, 0x2d, 0xbc, 0x4a, 0xb1, 0x0d, 0xbb, 0xb1, 0x8d, 0x7f, 0x8c, 0xdc, 0x9e, 0xd3, 0xb2, 0xfa, 0xa9, 0xa3, 0xd5, 0xf7, 0x1a, 0xbe, 0xd3, 0x79, 0xf7, 0xac, 0x8f, 0x90, 0x69, 0x97, 0xd1, 0x64, 0x21, 0xc3, 0x6a, 0x42, 0xc0, 0x2b, 0xa3, 0x50, 0xfe, 0x70, 0xa1, 0xae, 0x28, 0x09, 0xaa, 0x66, 0x4f, 0xb1, 0xe9, 0xef, 0x9e, 0x5c, 0xe4, 0xef, 0x37, 0x9f, 0xa2, 0x24, 0x44, 0x23, 0x76, 0x38, 0x46, 0x19, 0x7b, 0x77, 0xfb, 0x33, 0x1f, 0x1c, 0xe4, 0x3c, 0x14, 0x29, 0x9c, 0x8f, 0x3e, 0x3f, 0x03, 0x35, 0xdb, 0x33, 0x04, 0xc8, 0x66, 0x55, 0x6a, 0xbc, 0x8a, 0x17, 0xed, 0x53, 0x8a, 0x21, 0x8c, 0x95, 0x8f, 0xe0, 0xb5, 0x97, 0x65, 0x0b, 0x90, 0xed, 0xb1, 0xd0, 0x0c, 0x1b, 0x7e, 0xcf, 0xc0, 0xed, 0xda, 0x6b, 0x5a, 0x19, 0x4f, 0x17, 0xb7, 0x9d, 0x47, 0x7e, 0xbd, 0xee, 0xeb, 0x92, 0x0e, 0xc5, 0x3b, 0x74, 0xf1, 0x6c, 0xcc, 0x61, 0x1e, 0x72, 0x5c, 0xbc, 0xac, 0xe5, 0x24, 0xea, 0x9f, 0xc0, 0x6c, 0x87, 0xba, 0xd3, 0x3a, 0x02, 0xaa, 0x87, 0x34, 0x25, 0x20, 0x93, 0xd8, 0x9d, 0x7f, 0x79, 0xf2, 0x0b, 0x6e, 0x3f, 0x90, 0x45, 0x18, 0xa7, 0x1a, 0xa4, 0x8d, 0x0c, 0x00, 0xd1, + 0x23, 0x1a, 0xf5, 0x78, 0x96, 0x6d, 0x06, 0x7b, 0x96, 0xe3, 0x0f, 0x24, 0x77, 0x1f, 0x5e, 0x47, 0xdd, 0xa2, 0xf4, 0x0a, 0x67, 0x24, 0x21, 0x46, 0x75, 0x4e, 0x5f, 0x8d, 0x0a, 0xff, 0x63, 0xa6, 0x43, 0x43, 0x2d, 0xff, 0xbf, 0x54, 0xd4, 0xfc, 0xa3, 0x81, 0x87, 0x49, 0xb4, 0xe6, 0xfa, 0x65, 0x1e, 0xc9, 0x0f, 0x5f, 0x65, 0x40, 0x7a, 0x15, 0xa5, 0x85, 0x98, 0xd5, 0x82, 0xd5, 0xdf, 0xbd, 0xbe, 0x47, 0xee, 0x02, 0x3c, 0xf8, 0x61, 0x0a, 0xe1, 0xc0, 0xba, 0x42, 0x23, 0xdf, 0x0f, 0xed, 0xd9, 0x8e, 0xae, 0x49, 0x21, 0xdc, 0x27, 0xd9, 0x74, 0x6e, 0x69, 0xc0, 0xe1, 0x67, 0xe4, 0x96, 0xc9, 0x2d, 0xab, 0x69, 0xde, 0xc6, 0x01, 0xeb, 0x93, 0xd2, 0xcf, 0x63, 0xa7, 0x58, 0xa2, 0x5d, 0x4b, 0x70, 0x58, 0x79, 0x2c, 0x80, 0xf3, 0x98, 0x5d, 0x8e, 0x18, 0xe8, 0xf2, 0xe9, 0x18, 0x34, 0x67, 0x6a, 0x7c, 0x2f, 0x18, 0xc8, 0x30, 0x1f, 0xd0, 0x1f, 0x35, 0x6e, 0xed, 0x88, 0x10, 0xe6, 0x2f, 0x39, 0x77, 0x8f, 0x19, 0xa1, 0x15, 0xb3, 0x47, 0x9b, 0x25, 0xeb, 0x13, 0xe2, 0x9f, 0x97, 0xb2, 0x9f, 0xd7, 0xda, 0x35, 0x19, 0x6f, 0xd1, 0x00, 0xf4, 0x7c, 0xc9, 0x76, 0x87, 0x61, 0xbd, 0x3c, 0x3a, 0x12, 0x96, 0x00, 0x7e, 0x93, 0xcf, 0x59, 0xbc, 0x64, 0x30, 0xa2, 0xaf, 0x58, 0x0b, 0x70, 0x81, 0x87, 0x10, 0x58, 0xc4, 0x98, 0x7e, 0x3b, 0x47, 0x1c, 0x23, 0x74, 0x0b, 0x11, 0xba, 0x73, 0x53, 0x77, 0x9f, 0x83, 0x68, 0x75, 0x7c, 0x4b, 0xd5, 0x6a, 0x41, 0x99, 0xe0, 0x0d, 0xf3, 0x3b, 0xe3, 0x45, 0xb3, 0x72, 0xce, 0xa9, 0xf5, 0x18, 0x73, 0x64, 0xdc, 0x20, 0xac, 0xc0, 0x01, 0x4b, 0x19, 0xb9, 0x68, 0x8a, 0x44, 0x3a, 0x43, 0xdc, 0x72, 0xa0, 0x25, 0xa9, 0x5c, 0x5e, 0xcc, + 0x64, 0x10, 0x1b, 0x4b, 0x59, 0x4d, 0x86, 0xec, 0xf0, 0x82, 0xbf, 0xe6, 0x2e, 0xf4, 0x7d, 0x00, 0xfb, 0x4f, 0xa5, 0x2a, 0x2b, 0xfe, 0xcc, 0x85, 0x86, 0xdc, 0x5f, 0x20, 0xda, 0x87, 0x3a, 0x20, 0x5f, 0x76, 0x7f, 0x61, 0x5a, 0x9f, 0x14, 0x22, 0x71, 0xd8, 0xef, 0x08, 0x1f, 0x4a, 0x8b, 0x25, 0xd8, 0xcd, 0x0a, 0x29, 0x37, 0x24, 0x91, 0x56, 0xe0, 0x14, 0xd6, 0xfe, 0x72, 0x4f, 0x54, 0x53, 0xb9, 0x05, 0xab, 0x0a, 0xac, 0xc2, 0xed, 0x25, 0x8c, 0x56, 0xdd, 0x09, 0x48, 0x8d, 0x7e, 0x2e, 0xaf, 0x0e, 0x05, 0xd0, 0xf1, 0x9d, 0x66, 0x9e, 0xec, 0x28, 0x92, 0x3b, 0xf8, 0x76, 0xae, 0x04, 0x20, 0xb4, 0x0e, 0xc0, 0xb3, 0x1b, 0xa9, 0xc0, 0x06, 0x08, 0xad, 0x98, 0x08, 0x49, 0x1b, 0xfa, 0x1d, 0xfe, 0xa9, 0xb5, 0x86, 0x40, 0xa2, 0x05, 0x6a, 0xf3, 0xda, 0x05, 0x14, 0xd0, 0x92, 0x1f, 0x9a, 0xb4, 0x95, 0xec, 0x11, 0x5e, 0x74, 0x49, 0x6e, 0x73, 0x18, 0x43, 0x0b, 0x13, 0x51, 0x24, 0xbe, 0x3e, 0x0e, 0x0b, 0xe9, 0x85, 0x7a, 0xfd, 0xfa, 0xab, 0xde, 0xf1, 0xaf, 0x79, 0x0d, 0x2e, 0xe4, 0x59, 0xea, 0x04, 0xcd, 0x28, 0xb1, 0x50, 0x91, 0x02, 0xf6, 0x70, 0xb1, 0xfb, 0x13, 0xb8, 0x22, 0x3a, 0x67, 0xed, 0xb8, 0xd9, 0xd7, 0xd5, 0xfe, 0xa4, 0x46, 0x70, 0xd6, 0x9f, 0xd5, 0x2f, 0x34, 0x26, 0x3d, 0x75, 0xca, 0xb6, 0x89, 0xce, 0x8d, 0xc2, 0x89, 0xeb, 0x07, 0xbe, 0x45, 0x0c, 0x25, 0xfd, 0x56, 0x66, 0x0b, 0x5c, 0xe2, 0x84, 0xb0, 0xd3, 0x86, 0xf9, 0xf1, 0x3d, 0xbe, 0x4f, 0xb0, 0x79, 0xc0, 0x4d, 0x6a, 0x48, 0x24, 0x30, 0x7e, 0x3f, 0xf9, 0x5c, 0x03, 0xbd, 0x06, 0x82, 0x9c, 0x63, 0xd1, 0x27, 0x3a, 0x22, 0x1a, 0x36, 0x82, 0xbd, 0xde, 0xd9, 0xe6, 0x6c, 0xc7, 0xee, + 0xf5, 0xeb, 0x06, 0xbf, 0x17, 0x58, 0x5b, 0x1c, 0x5c, 0x17, 0x6f, 0x8b, 0x18, 0xbf, 0xc7, 0x44, 0xaf, 0xf1, 0x02, 0xc8, 0xb6, 0x7e, 0x48, 0x95, 0x0e, 0xc4, 0xc8, 0xef, 0x3e, 0x61, 0xe8, 0x48, 0x35, 0x82, 0x0f, 0xce, 0x58, 0xbd, 0x33, 0xda, 0xd1, 0x29, 0xa8, 0x17, 0x98, 0x97, 0x36, 0x04, 0x9f, 0x9e, 0x1d, 0x30, 0xf5, 0x17, 0x28, 0x00, 0x82, 0xfa, 0x04, 0x7d, 0x48, 0x01, 0x3f, 0x7e, 0xf8, 0x54, 0x93, 0xb4, 0xa9, 0x96, 0x10, 0xd0, 0x08, 0xb8, 0x89, 0x51, 0x52, 0x11, 0x12, 0x30, 0xd5, 0x76, 0xbb, 0xcd, 0x8e, 0x3f, 0x80, 0x45, 0x63, 0x14, 0xbc, 0x57, 0xa3, 0xf9, 0xa7, 0x54, 0x71, 0xbf, 0x08, 0xc0, 0xb3, 0xe7, 0xad, 0x7b, 0xe3, 0x31, 0x4c, 0xec, 0x21, 0x5f, 0x49, 0x89, 0x03, 0x5b, 0xdb, 0x8d, 0xbd, 0xa0, 0x04, 0xa6, 0xc9, 0x02, 0xa4, 0x8c, 0xcb, 0x86, 0x05, 0xaf, 0xc2, 0xea, 0x23, 0xff, 0x89, 0xd3, 0x47, 0x14, 0x7d, 0x07, 0x77, 0x98, 0xfa, 0x9f, 0x87, 0xc8, 0x03, 0x1d, 0xf4, 0x4d, 0xd2, 0x49, 0x52, 0x1e, 0x5b, 0x28, 0xe6, 0x15, 0x50, 0x5c, 0x80, 0xbd, 0xa6, 0x55, 0x03, 0xa9, 0xdc, 0x11, 0x4e, 0x0b, 0x43, 0xb7, 0x1c, 0x4c, 0xef, 0x41, 0x6f, 0x28, 0x91, 0xe3, 0xd5, 0x3a, 0xe3, 0xd0, 0x4f, 0x25, 0x40, 0x93, 0x87, 0x97, 0xc3, 0xb8, 0x7c, 0x2f, 0x9f, 0xc9, 0x25, 0x48, 0x9f, 0x7e, 0x51, 0xb1, 0x3e, 0xdb, 0x11, 0xde, 0xb2, 0x91, 0xa3, 0xbb, 0xf9, 0x59, 0x7e, 0x1d, 0x9e, 0xfe, 0x13, 0xc5, 0x50, 0xf7, 0x20, 0xdf, 0xc5, 0x86, 0xff, 0xe6, 0xb9, 0x7f, 0x85, 0xba, 0xc4, 0x66, 0xef, 0x9d, 0x02, 0xb2, 0x12, 0xdc, 0x89, 0x3d, 0x84, 0x4e, 0x94, 0xfe, 0x52, 0xd4, 0x32, 0xc6, 0x31, 0x6d, 0xc6, 0x14, 0x2c, 0x00, 0x5d, 0xce, 0x5c, 0x4d, + 0x4e, 0xf1, 0xbd, 0xed, 0xe6, 0x74, 0x1f, 0x4d, 0x69, 0x6f, 0x5b, 0x79, 0xb1, 0xa0, 0x33, 0x4d, 0xab, 0x30, 0x9d, 0x62, 0xb7, 0x12, 0x96, 0x60, 0x0d, 0x14, 0xae, 0xae, 0xe6, 0xda, 0xfe, 0x4e, 0x04, 0xb3, 0xff, 0x8e, 0x5c, 0xa9, 0x95, 0x57, 0x85, 0x47, 0xd8, 0x46, 0xa1, 0x13, 0xcf, 0xd0, 0xba, 0x7f, 0x13, 0x49, 0x65, 0xe3, 0xab, 0xdc, 0x0b, 0x71, 0x79, 0xed, 0x61, 0x0c, 0xe3, 0xb8, 0x5f, 0x02, 0xda, 0x14, 0xfd, 0xd9, 0x1a, 0xbe, 0x99, 0xe3, 0xd2, 0x65, 0xe5, 0x5b, 0x2a, 0xea, 0x82, 0x3d, 0x61, 0xb6, 0x08, 0xb4, 0xcc, 0x19, 0x86, 0xf3, 0x15, 0x97, 0xca, 0xc7, 0x30, 0xb4, 0xf7, 0x2a, 0x03, 0x32, 0xd4, 0x98, 0x43, 0x15, 0x9e, 0xe1, 0x4a, 0x29, 0x9e, 0xe5, 0xab, 0x33, 0x89, 0x63, 0xc7, 0x03, 0xc1, 0xd0, 0x15, 0x07, 0x28, 0x83, 0xa0, 0x65, 0xd0, 0x35, 0x95, 0x4f, 0x95, 0x29, 0x5a, 0xa6, 0xe0, 0x96, 0x96, 0x6f, 0x7c, 0xa2, 0x47, 0xd1, 0x17, 0x40, 0xe1, 0x18, 0x07, 0x5f, 0x28, 0x86, 0xaf, 0xf9, 0xe9, 0x1e, 0x7f, 0x55, 0x9f, 0xb7, 0xab, 0x55, 0xcc, 0x1f, 0xaa, 0x7b, 0x1e, 0xc8, 0x1d, 0x58, 0x8e, 0x9c, 0xe6, 0x7b, 0x44, 0x4b, 0xc8, 0x23, 0x25, 0x65, 0x20, 0x8e, 0x67, 0x96, 0x13, 0x80, 0x4d, 0x69, 0xea, 0x9a, 0x19, 0xe8, 0x44, 0x6e, 0x76, 0xea, 0x2f, 0x3b, 0xb1, 0x25, 0x6d, 0x61, 0xd3, 0x89, 0x52, 0xfd, 0xf4, 0xfb, 0x7e, 0x84, 0x0b, 0x88, 0x47, 0xb5, 0x8f, 0xc6, 0xed, 0x7c, 0x71, 0x21, 0x2d, 0x54, 0xbc, 0x9c, 0xef, 0x13, 0x0d, 0x10, 0x4d, 0x39, 0xc5, 0xc8, 0x3b, 0x62, 0x28, 0x86, 0x7c, 0xe1, 0x93, 0xa3, 0x2f, 0xc5, 0x61, 0x7b, 0x8d, 0x7f, 0xfd, 0x2f, 0x45, 0x75, 0x94, 0xd3, 0x89, 0x8d, 0x26, 0xae, 0xe5, 0x87, 0x80, 0xef, + 0x04, 0xe5, 0x9b, 0x3e, 0x8a, 0xe9, 0xcc, 0x7f, 0x2e, 0x5a, 0xff, 0xff, 0x50, 0xa5, 0xed, 0x7f, 0xa1, 0x04, 0x89, 0x29, 0x0b, 0xd8, 0x49, 0xc9, 0xa6, 0x44, 0xc5, 0x90, 0x73, 0x78, 0xe7, 0xf9, 0x43, 0xfe, 0xb6, 0x6a, 0x78, 0x9c, 0x06, 0x22, 0x4b, 0x9e, 0x74, 0x8a, 0x40, 0xf2, 0x6d, 0x99, 0x20, 0x5b, 0x82, 0xd7, 0x42, 0xeb, 0x8f, 0x71, 0xdd, 0xf4, 0x8e, 0x2e, 0x9f, 0xb0, 0xa6, 0x32, 0x14, 0xa6, 0xdb, 0x49, 0xdc, 0x60, 0xc1, 0x83, 0x36, 0xd3, 0xb0, 0x24, 0x8e, 0xe0, 0x06, 0xff, 0x95, 0x77, 0x69, 0x40, 0xf0, 0x54, 0x09, 0xf7, 0xda, 0x22, 0xdb, 0xa8, 0xfc, 0xd8, 0xe2, 0xc0, 0x8b, 0x76, 0x68, 0xb4, 0xe0, 0xa6, 0x73, 0xe7, 0x24, 0x2e, 0xa4, 0x6c, 0xe0, 0xc5, 0x2a, 0xb2, 0xfb, 0x7d, 0xb6, 0x84, 0x9e, 0x4a, 0x77, 0xbd, 0x89, 0xba, 0x67, 0x0b, 0xb3, 0x7d, 0x9d, 0x83, 0xee, 0x4f, 0x0f, 0x79, 0x84, 0xcc, 0x71, 0x2b, 0x5d, 0x78, 0xbf, 0x9e, 0x51, 0xda, 0x2d, 0x38, 0xf5, 0xdf, 0xa6, 0x90, 0x52, 0x14, 0x54, 0xae, 0xe5, 0x83, 0xf2, 0xa3, 0x4d, 0xc7, 0x02, 0x1f, 0x6a, 0x1a, 0xaa, 0x6e, 0x31, 0x65, 0xff, 0x58, 0xda, 0xf7, 0xaa, 0x14, 0x23, 0x8d, 0x41, 0xd4, 0x6a, 0xa4, 0x0f, 0x22, 0xb3, 0x20, 0x6c, 0x36, 0x3f, 0x63, 0x7f, 0xee, 0x65, 0x24, 0xe1, 0x0f, 0x80, 0x9c, 0x5f, 0x65, 0x8f, 0x1e, 0xfd, 0x5f, 0xea, 0x34, 0xc8, 0x1e, 0x3f, 0xc3, 0x76, 0x52, 0xc4, 0xdd, 0x9e, 0xde, 0xbb, 0xf5, 0x05, 0x87, 0x36, 0x0e, 0x59, 0xcc, 0xa0, 0xc2, 0x6a, 0x83, 0xce, 0xfc, 0xae, 0x45, 0x60, 0xfd, 0x25, 0x20, 0xec, 0xdb, 0x22, 0x0c, 0x95, 0x1f, 0xd8, 0xd3, 0x41, 0x21, 0x44, 0x8d, 0x6a, 0xc8, 0xa0, 0xac, 0x23, 0x34, 0x26, 0x7c, 0xdb, 0x6d, 0x03, 0xa1, + 0x1d, 0x01, 0x9e, 0x51, 0xc6, 0xb9, 0xca, 0x93, 0x63, 0x7a, 0xdd, 0x09, 0xec, 0x63, 0xab, 0x95, 0x51, 0x31, 0x03, 0xd5, 0x50, 0x61, 0x49, 0xa2, 0x80, 0xaa, 0x62, 0xae, 0x85, 0xdd, 0x2c, 0x17, 0xf0, 0x8f, 0x81, 0x85, 0x3b, 0x50, 0xec, 0x04, 0x58, 0xd5, 0x0f, 0x29, 0x63, 0xab, 0x69, 0xbc, 0x79, 0xa2, 0x12, 0xb9, 0x8e, 0xf8, 0xdb, 0x44, 0xc5, 0x4e, 0x40, 0x21, 0x6e, 0x4a, 0x60, 0x24, 0x27, 0x46, 0xad, 0xd8, 0x10, 0x98, 0xf8, 0xc2, 0x43, 0xb4, 0xcc, 0x6b, 0xfe, 0x6d, 0x8e, 0xc1, 0x7a, 0xc9, 0xbc, 0x3d, 0x6d, 0xf1, 0xaa, 0xd1, 0x23, 0x3a, 0xc8, 0x97, 0xbe, 0xe6, 0x74, 0x15, 0x94, 0xb7, 0xca, 0xbd, 0x99, 0x6a, 0x1d, 0x01, 0x12, 0x87, 0x97, 0x3b, 0x5e, 0x7f, 0x02, 0x45, 0x0a, 0xc8, 0xcf, 0x15, 0x28, 0x74, 0x98, 0x20, 0xac, 0x66, 0x17, 0x39, 0xa5, 0x93, 0x3a, 0xb0, 0x5a, 0x3c, 0x97, 0xcd, 0xea, 0x0d, 0xd6, 0xc1, 0x9f, 0x46, 0xb9, 0xec, 0xc7, 0xc4, 0xe1, 0x76, 0x62, 0x72, 0x00, 0x33, 0x40, 0x0a, 0x50, 0x21, 0x7b, 0xa2, 0xc7, 0x23, 0x72, 0x65, 0x79, 0x2b, 0x16, 0x72, 0xbc, 0x61, 0xf5, 0x0d, 0x72, 0x52, 0x7d, 0xbc, 0x93, 0x48, 0xe0, 0xa6, 0x38, 0xc3, 0x62, 0xf9, 0x49, 0xe8, 0x71, 0xbc, 0x85, 0xc6, 0x43, 0xd4, 0x45, 0x18, 0x96, 0x75, 0x97, 0x22, 0x67, 0x32, 0xfe, 0xd2, 0xc5, 0xed, 0x79, 0x36, 0x07, 0xe1, 0x0f, 0xc3, 0x0e, 0xd8, 0xe6, 0x22, 0x57, 0x25, 0x82, 0xac, 0x80, 0x22, 0xc3, 0x5f, 0x25, 0xa6, 0x83, 0x09, 0xc0, 0x84, 0x31, 0xb4, 0x8b, 0x2b, 0x08, 0xbe, 0xa2, 0x9d, 0x72, 0x51, 0xa4, 0x1c, 0xaa, 0xcf, 0x23, 0x27, 0xe8, 0x34, 0x5a, 0x95, 0x4b, 0x78, 0x55, 0x95, 0x0e, 0x3d, 0x81, 0xdd, 0xc0, 0x90, 0x5f, 0x83, 0xd2, 0x69, + 0xe5, 0x33, 0x78, 0x1d, 0x8f, 0x9c, 0x32, 0xbc, 0x57, 0x06, 0xa8, 0x85, 0xb6, 0x11, 0xca, 0x9a, 0x2d, 0x37, 0x8f, 0xcd, 0x97, 0x5e, 0x9d, 0x2f, 0xfc, 0x00, 0xf4, 0xbb, 0x43, 0xff, 0x74, 0xd1, 0x41, 0x68, 0x70, 0xc5, 0x25, 0xf3, 0xc3, 0x90, 0x15, 0x74, 0xcb, 0x7a, 0x4d, 0xc6, 0x4d, 0xc5, 0x0f, 0xce, 0x64, 0xa4, 0x08, 0xc6, 0xce, 0xa0, 0x1e, 0x3d, 0x96, 0xad, 0xb1, 0xbc, 0x45, 0xb1, 0xd2, 0x11, 0x29, 0xb7, 0xde, 0x53, 0xa9, 0xa8, 0xa0, 0xa4, 0x27, 0xfe, 0x22, 0xa9, 0xcb, 0xf7, 0x18, 0x0b, 0x99, 0x75, 0x43, 0x19, 0x94, 0x1e, 0x19, 0x9d, 0x24, 0x20, 0xba, 0xdb, 0xa8, 0x2c, 0xa2, 0xd6, 0xa0, 0xb1, 0x79, 0xd3, 0xc3, 0x76, 0xb4, 0x25, 0x31, 0x88, 0x2c, 0xfc, 0x48, 0xb5, 0xf3, 0x4d, 0x85, 0x59, 0x9b, 0x5d, 0x0e, 0xcb, 0x8c, 0x3e, 0x3a, 0x48, 0x54, 0x1b, 0xbc, 0x55, 0xd5, 0x50, 0xac, 0x60, 0x12, 0xcf, 0x18, 0xa9, 0xd9, 0x1e, 0x06, 0x98, 0x94, 0xf6, 0x77, 0x06, 0xd1, 0x26, 0xd8, 0x74, 0xd5, 0x92, 0xe0, 0x52, 0x8c, 0x79, 0x19, 0x44, 0x41, 0x26, 0x6f, 0x63, 0x48, 0x50, 0x51, 0x23, 0x4c, 0xf3, 0x69, 0x93, 0x0b, 0xdd, 0x27, 0xf7, 0x7a, 0xa6, 0x95, 0x6f, 0x98, 0x09, 0x68, 0x3c, 0x0d, 0x49, 0x82, 0x79, 0xdd, 0xc8, 0x2e, 0xb8, 0x54, 0x01, 0x79, 0x46, 0x53, 0x55, 0x6c, 0x8b, 0x8d, 0x43, 0x02, 0xdc, 0x59, 0x4d, 0x35, 0xad, 0x3a, 0x57, 0x43, 0x4d, 0xf2, 0xea, 0xa4, 0x7d, 0xdf, 0x76, 0x43, 0xc2, 0x04, 0xb1, 0x27, 0x48, 0x22, 0x8a, 0x0f, 0xef, 0x98, 0x25, 0xbe, 0x3f, 0xf5, 0xfd, 0x31, 0x06, 0xd5, 0x74, 0xeb, 0x8c, 0xef, 0x75, 0xba, 0x34, 0x95, 0x1d, 0x49, 0x4a, 0xdc, 0x04, 0x1a, 0xb8, 0x8c, 0xc9, 0x70, 0x63, 0xf8, 0x24, 0x80, 0xb4, + 0x9c, 0x11, 0xd7, 0x21, 0x91, 0xb7, 0x77, 0xb3, 0x97, 0x7f, 0xbd, 0x53, 0xc5, 0x5e, 0x55, 0x0c, 0x1c, 0xf1, 0xdc, 0x40, 0x87, 0xb5, 0x26, 0x52, 0x88, 0xaf, 0x54, 0x41, 0xd9, 0x44, 0x32, 0x76, 0xbe, 0x75, 0xfc, 0xd9, 0x85, 0x7d, 0x61, 0x80, 0x64, 0xc2, 0x15, 0x25, 0xca, 0x4d, 0x7c, 0x51, 0x14, 0x37, 0x40, 0xca, 0x7f, 0x23, 0x50, 0x2c, 0x31, 0x02, 0x49, 0xdc, 0x44, 0xa1, 0x6d, 0x70, 0x5e, 0x17, 0xe8, 0x1a, 0xf9, 0x59, 0xcd, 0x79, 0x8c, 0x0c, 0xce, 0x94, 0xf3, 0x26, 0x88, 0xe3, 0x0b, 0x3a, 0x4a, 0x74, 0x7e, 0x4b, 0xe0, 0x83, 0x87, 0x62, 0xff, 0x61, 0x1e, 0x88, 0x49, 0x91, 0xe5, 0x98, 0x87, 0xd5, 0x03, 0x43, 0x88, 0xc6, 0x31, 0x32, 0x0b, 0x1e, 0xae, 0xa1, 0x73, 0xa2, 0xa0, 0x6f, 0x23, 0x3f, 0x19, 0x37, 0x0e, 0x50, 0x9f, 0x25, 0x30, 0x56, 0xab, 0x63, 0x2a, 0x39, 0x01, 0x96, 0x22, 0x47, 0x15, 0x15, 0x6a, 0xb4, 0x10, 0xe7, 0xbe, 0xdb, 0x94, 0x95, 0x56, 0x64, 0xb9, 0x72, 0xa5, 0x3c, 0x27, 0x3f, 0x68, 0xce, 0x9e, 0xd7, 0x8c, 0xc0, 0x19, 0x5e, 0xdd, 0x58, 0x27, 0x0c, 0xd7, 0xeb, 0x55, 0x63, 0x42, 0xba, 0xc7, 0xbe, 0x06, 0x58, 0x6a, 0xd9, 0x94, 0xa2, 0x7a, 0xd3, 0x22, 0x9c, 0x2c, 0x96, 0x20, 0x40, 0x63, 0xd3, 0xc9, 0x0d, 0x53, 0x0d, 0x96, 0xa2, 0x6f, 0x97, 0x0d, 0x5e, 0xd8, 0x1c, 0xf8, 0xf2, 0xb9, 0x77, 0xfc, 0xb5, 0x72, 0xee, 0x6e, 0x56, 0x84, 0xed, 0x03, 0x15, 0x8d, 0x92, 0x91, 0x30, 0x28, 0xd1, 0x8e, 0xe0, 0xa5, 0xb0, 0x4f, 0xeb, 0xa7, 0xa2, 0x47, 0x1a, 0xca, 0x22, 0x15, 0x28, 0x4c, 0xef, 0xe8, 0xc1, 0x12, 0xf2, 0xd5, 0x38, 0xf6, 0xff, 0xf0, 0x50, 0x52, 0xca, 0xa1, 0xa3, 0xbe, 0xe1, 0x01, 0x28, 0xa2, 0x75, 0xdd, 0x0d, + 0xd2, 0xd2, 0x22, 0x72, 0x71, 0x05, 0x27, 0xd2, 0x5b, 0x87, 0xd3, 0x80, 0x39, 0x0f, 0xf6, 0xc9, 0x84, 0x60, 0x63, 0xa7, 0x50, 0x81, 0xdb, 0xb5, 0x9a, 0xcf, 0x35, 0x61, 0x80, 0x07, 0xed, 0x1e, 0x6e, 0x2e, 0x38, 0xdd, 0x9c, 0x96, 0xd9, 0xdb, 0x48, 0x29, 0xc8, 0x3d, 0x7f, 0xf7, 0xfe, 0xfd, 0xd0, 0xa2, 0xc2, 0x7c, 0x2f, 0xd7, 0x09, 0xcd, 0xc2, 0xaf, 0x8f, 0xaa, 0x0f, 0x19, 0xa6, 0xab, 0xa9, 0x10, 0x0f, 0xc3, 0xe0, 0xda, 0xad, 0x89, 0xcf, 0xf7, 0x4b, 0x87, 0xbd, 0xd9, 0x4f, 0x1d, 0xc9, 0x6f, 0xf4, 0xc9, 0xa0, 0x19, 0x4a, 0x39, 0x1d, 0x05, 0xc0, 0x32, 0x25, 0x10, 0x59, 0xda, 0xf6, 0x27, 0x27, 0x47, 0x23, 0x90, 0xb1, 0x78, 0xc7, 0x99, 0xd3, 0xa9, 0x3d, 0xf2, 0xd2, 0xe6, 0xfe, 0x4f, 0x78, 0x34, 0x94, 0x6b, 0x88, 0x1c, 0x96, 0x65, 0xfc, 0xd6, 0x2f, 0x08, 0x83, 0xdd, 0x91, 0xbf, 0x75, 0xb1, 0x46, 0x5e, 0x88, 0x95, 0x81, 0xc3, 0xbd, 0xb6, 0x6d, 0xa4, 0x4f, 0x6b, 0x62, 0xc1, 0x96, 0x43, 0x3e, 0xc9, 0xbf, 0xd8, 0x95, 0xf9, 0x0a, 0x40, 0x09, 0x6e, 0xe3, 0x77, 0x95, 0x13, 0xa4, 0x43, 0xec, 0xa0, 0xd6, 0x48, 0x36, 0xb8, 0x59, 0x7a, 0x6f, 0xe4, 0x5c, 0xe4, 0x79, 0xcd, 0xc9, 0xaa, 0x16, 0xcf, 0x02, 0x4a, 0x47, 0x26, 0xb7, 0xe5, 0xc8, 0x43, 0x25, 0xcb, 0x96, 0x82, 0x98, 0xa1, 0x38, 0x94, 0xb4, 0xaa, 0x69, 0xac, 0xb4, 0xaf, 0x69, 0x97, 0xfd, 0xb3, 0xa8, 0x9a, 0xe8, 0x0b, 0xc4, 0x24, 0xf8, 0xa8, 0x77, 0x01, 0x35, 0x5c, 0xd5, 0xeb, 0xbc, 0xd9, 0x16, 0x73, 0xc9, 0x73, 0x41, 0x39, 0xde, 0xe9, 0x2a, 0x24, 0xeb, 0x37, 0x28, 0x7c, 0x74, 0x11, 0x01, 0x71, 0x22, 0x01, 0xed, 0x4b, 0x01, 0x4b, 0x97, 0xd2, 0xf1, 0xf2, 0x33, 0xb7, 0x02, 0x9a, + 0x38, 0x0f, 0x98, 0x6d, 0x8a, 0x15, 0x0d, 0x76, 0x95, 0x8f, 0x2f, 0xd3, 0xf9, 0x1f, 0xce, 0xc9, 0xf3, 0x92, 0x6b, 0x26, 0xed, 0x63, 0x10, 0xa0, 0x4c, 0x0b, 0xd2, 0x17, 0x01, 0x3a, 0xf4, 0xf3, 0x42, 0x51, 0x90, 0xf9, 0xad, 0xdd, 0xf5, 0x0b, 0xad, 0x41, 0x3c, 0x11, 0x9a, 0x2d, 0x14, 0x18, 0x16, 0x8e, 0x7d, 0xad, 0x17, 0x79, 0x04, 0x10, 0xc1, 0x1f, 0x27, 0x6c, 0x67, 0xb4, 0x8c, 0x3d, 0x73, 0x41, 0x35, 0xb3, 0xb5, 0x98, 0xf4, 0x68, 0xcc, 0xce, 0x36, 0xb3, 0xa9, 0x89, 0x32, 0x0f, 0x0d, 0x44, 0xda, 0x51, 0xc0, 0x9c, 0x62, 0x0c, 0xb8, 0x44, 0xd2, 0xcb, 0x61, 0xc0, 0xee, 0x04, 0x4d, 0x12, 0x8c, 0x6c, 0x59, 0x5c, 0xdd, 0x84, 0xa9, 0xe0, 0x32, 0x14, 0xc2, 0x62, 0x5b, 0x1a, 0xb3, 0xa7, 0x32, 0x3f, 0x5c, 0x93, 0xdc, 0x41, 0x56, 0xfb, 0x70, 0x62, 0x30, 0xfa, 0x37, 0x3e, 0xbd, 0x80, 0x57, 0xb9, 0x76, 0x36, 0x20, 0xa0, 0x37, 0xcd, 0x24, 0xc9, 0x1b, 0x56, 0xe6, 0x98, 0xcf, 0x9c, 0xf5, 0x6d, 0x90, 0xd7, 0x09, 0xeb, 0xe4, 0x5e, 0xe4, 0xf2, 0x0a, 0xcb, 0x69, 0x7d, 0xd1, 0x44, 0x92, 0x6a, 0x5b, 0xf6, 0x60, 0x35, 0xb8, 0x36, 0x94, 0x87, 0x3c, 0x0b, 0xf6, 0x66, 0x0d, 0x2b, 0x6b, 0xdf, 0x0f, 0xf4, 0x2d, 0xcd, 0x3e, 0xa9, 0x1b, 0x86, 0x5e, 0x68, 0x2f, 0x57, 0x48, 0x38, 0x04, 0xa6, 0xea, 0x74, 0x61, 0xf2, 0xf0, 0xea, 0xd8, 0x22, 0xfa, 0xe4, 0xd9, 0x83, 0xcb, 0xf1, 0xf6, 0x87, 0x19, 0x64, 0x63, 0x09, 0x53, 0x35, 0x99, 0x7c, 0x0c, 0xcc, 0x65, 0xc1, 0x60, 0x3c, 0x4f, 0x23, 0x4b, 0xa5, 0x16, 0x77, 0x9f, 0x2b, 0xb6, 0x66, 0x70, 0xb0, 0xab, 0xff, 0xf0, 0x72, 0x99, 0x5e, 0x07, 0x7d, 0x3b, 0x50, 0x8f, 0xde, 0x9b, 0xd3, 0xb4, 0x06, 0x8e, 0x7c, + 0x52, 0x80, 0x6f, 0x0f, 0x3d, 0x2e, 0xab, 0x57, 0x99, 0xbc, 0x7b, 0x27, 0xd4, 0xc3, 0x0b, 0xfc, 0x9b, 0x76, 0x42, 0xa7, 0xcd, 0x88, 0x11, 0xf0, 0xbd, 0x96, 0xa1, 0x2a, 0xad, 0x5f, 0xf0, 0x39, 0x1f, 0x5d, 0x9a, 0xca, 0x90, 0xbd, 0x3d, 0x37, 0x64, 0x8a, 0xdc, 0xb6, 0xd4, 0xb6, 0x5e, 0x40, 0x6b, 0x2f, 0x47, 0xe2, 0x6c, 0x65, 0xf4, 0x08, 0x02, 0xe8, 0x38, 0x7b, 0xfa, 0x42, 0x0f, 0x4b, 0x7f, 0xda, 0xcc, 0x6f, 0xb0, 0xff, 0x4c, 0x26, 0x70, 0x3f, 0x87, 0x17, 0x0c, 0x60, 0x1c, 0x97, 0xe8, 0xa9, 0x61, 0x30, 0xc7, 0xbe, 0x6b, 0x11, 0x49, 0xa8, 0x66, 0x24, 0x3a, 0xd1, 0x50, 0x87, 0xcb, 0x9f, 0x27, 0x60, 0xa9, 0xd1, 0x2e, 0x23, 0x21, 0x04, 0x77, 0x85, 0xb3, 0xbc, 0x0c, 0x7c, 0x8b, 0xf0, 0xd9, 0x64, 0xee, 0x32, 0x76, 0x0d, 0xdb, 0xce, 0x4d, 0x09, 0xdd, 0x05, 0xae, 0xfc, 0x9b, 0x23, 0x86, 0x0c, 0x20, 0x22, 0x0f, 0xea, 0xc2, 0x10, 0xa0, 0xa2, 0xb7, 0x2c, 0x57, 0x94, 0xf1, 0x11, 0x4b, 0x7f, 0x44, 0x0c, 0x5b, 0x75, 0x31, 0xc9, 0x7f, 0xc9, 0xd7, 0x5c, 0xfe, 0xf4, 0x8a, 0xa2, 0xcf, 0xc3, 0x1d, 0xaa, 0xc5, 0x85, 0xbe, 0x28, 0x57, 0x23, 0xc8, 0xd1, 0xb4, 0x76, 0x5a, 0x4c, 0xd5, 0xc4, 0x9a, 0xe2, 0x3d, 0xda, 0xac, 0x1f, 0x28, 0x4e, 0x7e, 0x45, 0x6e, 0x79, 0x61, 0xae, 0xb8, 0x60, 0x7b, 0x63, 0xbf, 0x54, 0x9d, 0x24, 0x69, 0x9e, 0x7b, 0xb4, 0xfc, 0x69, 0x04, 0x24, 0xe2, 0x9b, 0xfb, 0x42, 0x2a, 0x81, 0x17, 0xfc, 0x0a, 0xbe, 0x5d, 0x4c, 0xbf, 0xce, 0x9d, 0xbc, 0xf4, 0xfd, 0xe9, 0xe4, 0x42, 0x79, 0xce, 0x5e, 0x95, 0x48, 0xff, 0xa3, 0x62, 0xd3, 0xc6, 0xcf, 0x45, 0x6d, 0xbb, 0x6c, 0xeb, 0xca, 0xc3, 0x7d, 0x26, 0x05, 0x23, 0x9f, 0x3f, 0x28, + 0x0d, 0xcc, 0x00, 0xae, 0xf2, 0xc1, 0x92, 0x1a, 0x30, 0xbc, 0x09, 0xd2, 0x12, 0xa3, 0xd0, 0x8c, 0x52, 0xff, 0xff, 0x33, 0x8f, 0xd0, 0xa1, 0x8a, 0x84, 0x2a, 0x30, 0xac, 0x62, 0xd5, 0xa6, 0x9b, 0x9d, 0xfd, 0xc7, 0x66, 0x94, 0x90, 0x72, 0x92, 0xeb, 0x27, 0x5d, 0x85, 0x91, 0x97, 0x51, 0xcc, 0x04, 0xcc, 0x7d, 0x5b, 0xa9, 0x3d, 0xca, 0xb4, 0xb3, 0xda, 0xdf, 0xb3, 0x1c, 0x30, 0x46, 0x85, 0x31, 0x5e, 0x59, 0xf6, 0x14, 0xd6, 0x5e, 0x83, 0xe5, 0x42, 0x23, 0xb5, 0xbc, 0x0d, 0x52, 0x15, 0x75, 0xef, 0x9c, 0x8d, 0xe2, 0xb5, 0x14, 0xc6, 0xe2, 0xe3, 0x0a, 0xe9, 0xbf, 0x11, 0xf1, 0x23, 0xb0, 0xfa, 0xa4, 0x9e, 0xbd, 0xfd, 0x19, 0x1a, 0x52, 0x08, 0xfc, 0x59, 0x7e, 0x72, 0xe7, 0x17, 0xed, 0xa4, 0xf4, 0x98, 0x9f, 0xd2, 0x52, 0x85, 0x18, 0x08, 0x8c, 0xd3, 0xa4, 0x72, 0x23, 0xec, 0x3e, 0x7c, 0xfa, 0xe7, 0x6e, 0x34, 0x60, 0x84, 0xef, 0x6d, 0x42, 0x0c, 0x17, 0x99, 0xb6, 0x2b, 0x99, 0xd3, 0x9c, 0x12, 0xc4, 0xac, 0x93, 0xd1, 0xfa, 0x8d, 0x85, 0x38, 0x44, 0x88, 0x71, 0xeb, 0xc9, 0x67, 0x42, 0x23, 0xaf, 0x1d, 0x73, 0xa8, 0xc7, 0x7d, 0xe0, 0x4f, 0xe1, 0x0e, 0xba, 0xd2, 0x30, 0x55, 0xcc, 0x6b, 0x9b, 0xd1, 0x55, 0x68, 0x19, 0x73, 0x37, 0x61, 0x38, 0xea, 0xd1, 0x10, 0xeb, 0xde, 0x50, 0xa4, 0x8a, 0x73, 0xa2, 0xdd, 0x16, 0xee, 0xcc, 0xbc, 0xfe, 0x78, 0x7a, 0x90, 0xd6, 0x91, 0x92, 0x44, 0x39, 0xfa, 0x16, 0x48, 0x39, 0x69, 0x86, 0x90, 0x20, 0x9e, 0xd8, 0xc8, 0x26, 0x71, 0xed, 0x36, 0x19, 0x21, 0x53, 0xfb, 0x0d, 0x46, 0xca, 0xf9, 0x96, 0x4b, 0x2b, 0xce, 0x6f, 0x47, 0x07, 0x31, 0x19, 0x9a, 0x3a, 0x1f, 0x66, 0xf5, 0xc5, 0xc7, 0x50, 0x01, 0xc9, 0x53, + 0xde, 0xfc, 0x56, 0x05, 0x03, 0x0b, 0x60, 0x8d, 0x7d, 0x3a, 0xaf, 0x4f, 0xfc, 0x4b, 0x5d, 0x20, 0x1b, 0xd7, 0x34, 0x1e, 0xdc, 0x34, 0x1b, 0x64, 0x03, 0x67, 0x71, 0x68, 0xc9, 0xa6, 0x54, 0x32, 0x83, 0xa4, 0x48, 0x2a, 0xff, 0x05, 0xce, 0xac, 0x8e, 0xaf, 0x43, 0xe2, 0xd6, 0xf8, 0x59, 0x7b, 0x82, 0x56, 0x49, 0xa4, 0x9e, 0x6d, 0x0b, 0x6d, 0xcc, 0x8f, 0x7e, 0xae, 0xfb, 0xa2, 0xc2, 0x4c, 0x52, 0x79, 0x28, 0x93, 0x0d, 0xbe, 0x42, 0xb5, 0xbc, 0x4f, 0x23, 0xfe, 0xf0, 0xc5, 0x33, 0xc3, 0xef, 0x91, 0xdb, 0x3d, 0x11, 0x9b, 0xd1, 0xa2, 0x32, 0x12, 0x19, 0xa9, 0x41, 0x8b, 0x23, 0x54, 0x1e, 0x07, 0xc3, 0x4a, 0xf6, 0x31, 0xf2, 0x9f, 0x9c, 0xb0, 0x42, 0x3d, 0x5b, 0x89, 0xdc, 0x70, 0xf8, 0x30, 0x98, 0x41, 0x66, 0x5e, 0xa5, 0xbc, 0x1c, 0xf9, 0xfb, 0x12, 0x01, 0x12, 0xa2, 0x96, 0x61, 0x02, 0x6b, 0x23, 0x60, 0x10, 0x9c, 0xf4, 0xb6, 0xe0, 0x5d, 0x98, 0xbc, 0xdd, 0x47, 0xb5, 0xaa, 0xa2, 0x02, 0xe6, 0xb3, 0x88, 0x29, 0x77, 0x77, 0x5a, 0x66, 0xcd, 0xdf, 0x8c, 0xd5, 0xa5, 0x84, 0xff, 0x98, 0x2f, 0xb4, 0x40, 0xdb, 0xac, 0xa2, 0xba, 0xf2, 0xc1, 0x35, 0x3b, 0xf8, 0x7e, 0x13, 0x2e, 0x0e, 0x1f, 0x4a, 0x43, 0xc7, 0x04, 0xf7, 0x0c, 0x57, 0xcb, 0xc9, 0xcf, 0x3d, 0xce, 0x1c, 0x02, 0xad, 0x7c, 0x46, 0x7e, 0x49, 0xcf, 0xd5, 0x34, 0xec, 0x34, 0xeb, 0xca, 0x14, 0xf8, 0xe5, 0xef, 0x5b, 0x4c, 0xec, 0xef, 0xbb, 0x22, 0x99, 0xaf, 0xfc, 0x13, 0x0b, 0x1d, 0x58, 0x07, 0x72, 0x16, 0x52, 0xba, 0x60, 0x26, 0xb9, 0x22, 0x6d, 0x43, 0x2f, 0xfd, 0x15, 0x4b, 0xd8, 0xe5, 0xf5, 0x59, 0x3e, 0x77, 0xf7, 0xf7, 0x32, 0x62, 0xcb, 0xed, 0x23, 0xaf, 0xa9, 0x6d, 0x8c, 0x78, + 0xc8, 0x74, 0x02, 0x24, 0x81, 0xc3, 0x79, 0x2d, 0x9a, 0xbf, 0xd9, 0xdf, 0x68, 0x11, 0xbf, 0x41, 0x8c, 0x4e, 0x49, 0x11, 0x25, 0x8f, 0x33, 0xb0, 0x26, 0x55, 0x4b, 0x5a, 0x72, 0x93, 0x3a, 0xb5, 0x73, 0x46, 0x12, 0x4e, 0x44, 0x31, 0x95, 0x47, 0x64, 0x69, 0xc4, 0xa5, 0x5a, 0x8d, 0x6d, 0x6e, 0xbe, 0xfe, 0x33, 0xaf, 0x81, 0xc7, 0xce, 0xf1, 0x41, 0x6a, 0x2e, 0xbc, 0xee, 0x98, 0x9b, 0xcc, 0x9c, 0xc0, 0x5e, 0x79, 0xb2, 0xc6, 0x22, 0x0c, 0xda, 0xf8, 0xce, 0xea, 0x02, 0xd2, 0x2a, 0xaf, 0xa8, 0x0b, 0xa6, 0x87, 0xb0, 0x82, 0xa8, 0x24, 0x86, 0x2c, 0x34, 0x56, 0x4f, 0xb2, 0xee, 0x56, 0x01, 0xc2, 0x32, 0x9d, 0x3f, 0xe1, 0x34, 0x7a, 0xe9, 0x42, 0xa4, 0x50, 0x6f, 0x69, 0x6c, 0x7d, 0x5f, 0x0b, 0xe9, 0xb6, 0xe0, 0x8d, 0xba, 0xe4, 0x8b, 0xb1, 0x70, 0x77, 0xd7, 0x35, 0x39, 0x6b, 0x4d, 0x90, 0xa8, 0x67, 0x00, 0xbb, 0x1c, 0xdc, 0x22, 0xfd, 0xc8, 0x55, 0xb1, 0xe6, 0x3d, 0x91, 0x13, 0x07, 0x9b, 0xbf, 0x80, 0x27, 0x5d, 0xf3, 0x76, 0x96, 0x26, 0x16, 0x5f, 0xb1, 0x5a, 0xc3, 0x07, 0x70, 0xb4, 0xcb, 0xdc, 0x36, 0xeb, 0xd7, 0x35, 0xc3, 0x49, 0x21, 0xb6, 0x33, 0x48, 0x85, 0x0b, 0xe1, 0x8c, 0xa7, 0x3d, 0xca, 0xf3, 0xe5, 0x1a, 0xf8, 0x51, 0x53, 0x6e, 0x40, 0x42, 0xdc, 0xff, 0xa4, 0xd7, 0xfa, 0xd2, 0x8a, 0xea, 0x8f, 0x3f, 0xb5, 0xb4, 0x79, 0x93, 0xd1, 0xa0, 0x59, 0x6c, 0x12, 0x64, 0xf5, 0x8a, 0x86, 0xb7, 0xbc, 0x1f, 0xd1, 0xb2, 0xda, 0xf0, 0x15, 0x57, 0xd7, 0x60, 0xc5, 0x53, 0xdf, 0x7f, 0x26, 0xfd, 0x15, 0x99, 0xe0, 0x54, 0x6c, 0xd8, 0x34, 0x85, 0xc2, 0x69, 0x02, 0x82, 0x6c, 0x68, 0x64, 0x62, 0x03, 0xe0, 0x4e, 0xf9, 0xc9, 0xc0, 0xe4, 0xe7, 0xe2, + 0x87, 0xf3, 0x36, 0xc3, 0x7a, 0xb9, 0x41, 0x37, 0xcb, 0xe2, 0xd3, 0x98, 0x1f, 0x8b, 0xcc, 0x28, 0xa1, 0x0c, 0x87, 0xaf, 0x51, 0x6e, 0xce, 0xfb, 0x0b, 0x59, 0x3c, 0xe9, 0x29, 0x4e, 0xf0, 0x89, 0x0e, 0x94, 0xea, 0x92, 0xe1, 0x9f, 0x66, 0xb4, 0x39, 0x3b, 0x71, 0x31, 0xa8, 0x0f, 0x8e, 0x4b, 0x59, 0xdc, 0xcc, 0x7e, 0x72, 0xcd, 0xa7, 0x11, 0x22, 0x75, 0x11, 0xb4, 0xd4, 0xbf, 0x9c, 0x57, 0x46, 0x2e, 0xf9, 0x71, 0x6a, 0x6f, 0x93, 0xbc, 0xd6, 0x89, 0x9e, 0x77, 0x2d, 0x18, 0xe0, 0x10, 0x7b, 0x03, 0x27, 0x59, 0xf8, 0xc7, 0x83, 0x83, 0xcc, 0xdb, 0x34, 0x7a, 0xab, 0x81, 0xc3, 0x2d, 0xb2, 0x59, 0xc2, 0x12, 0xe1, 0xb8, 0x30, 0xb4, 0xdc, 0xcd, 0xd2, 0x9e, 0x27, 0x68, 0x8b, 0xde, 0xe2, 0x84, 0x0c, 0xde, 0x50, 0xfe, 0xa7, 0x18, 0xcb, 0x28, 0xed, 0xd9, 0xca, 0xcb, 0x72, 0x07, 0x70, 0xda, 0xbe, 0x80, 0xed, 0x79, 0x81, 0xf7, 0x5b, 0xcb, 0x51, 0x89, 0x52, 0x45, 0xe4, 0x10, 0x7a, 0x61, 0xc8, 0xc6, 0x4d, 0x71, 0x01, 0x8b, 0xd9, 0xdf, 0x45, 0x05, 0x40, 0xf8, 0x2c, 0xd7, 0x77, 0x01, 0xed, 0x2e, 0x74, 0xf6, 0xad, 0x97, 0xb2, 0x1d, 0xa0, 0xa7, 0x14, 0xcf, 0x95, 0xec, 0x2d, 0x6f, 0x0a, 0xd7, 0x32, 0xcf, 0x69, 0x0a, 0xca, 0xc6, 0x89, 0xbf, 0xac, 0xf7, 0x38, 0x6d, 0x8c, 0xef, 0xf2, 0xa1, 0x90, 0x4b, 0x2d, 0x0f, 0xa7, 0x77, 0x28, 0xfe, 0xa9, 0xca, 0x18, 0xa6, 0xa0, 0xe2, 0x26, 0x57, 0x9a, 0x39, 0x76, 0xf8, 0x8d, 0xd8, 0x2e, 0x1b, 0xde, 0x73, 0x8b, 0x50, 0xab, 0xd6, 0x63, 0x08, 0x85, 0x68, 0xcf, 0x7d, 0x3d, 0x64, 0xbb, 0xcf, 0x08, 0xc0, 0x85, 0xad, 0x9d, 0x2e, 0x17, 0x84, 0x72, 0x6f, 0x9e, 0xca, 0x7a, 0x7e, 0x63, 0xbb, 0xe0, 0x3c, 0x63, 0x82, + 0x0c, 0xe5, 0x96, 0xfc, 0x06, 0xaf, 0x5a, 0x66, 0xe6, 0xdd, 0x70, 0xb7, 0xc3, 0x79, 0x19, 0x42, 0xa7, 0xfe, 0xf1, 0x95, 0xd9, 0xa1, 0x95, 0xc0, 0xe3, 0xc7, 0xf4, 0xef, 0x13, 0x48, 0x26, 0x38, 0x06, 0x9b, 0x1c, 0x3f, 0x97, 0xd4, 0x98, 0xe3, 0xec, 0x36, 0x70, 0x48, 0x29, 0xb8, 0xca, 0x59, 0xe2, 0x7c, 0xed, 0x22, 0xb2, 0x4d, 0xea, 0x2c, 0x48, 0x1f, 0x74, 0x91, 0x6c, 0x37, 0x34, 0x82, 0xd3, 0x35, 0x7a, 0x63, 0x9f, 0x7c, 0x4f, 0xdb, 0x45, 0xef, 0xe9, 0x6d, 0x65, 0xeb, 0x49, 0xb0, 0x03, 0xda, 0x6e, 0x2a, 0xc1, 0xbc, 0x9e, 0x92, 0x7f, 0xc5, 0x25, 0x26, 0x55, 0x03, 0x0a, 0x0a, 0x86, 0xdf, 0xbd, 0x24, 0xaf, 0xa5, 0xba, 0x3a, 0xbd, 0x58, 0xaa, 0x78, 0xd6, 0xb5, 0x1d, 0x1d, 0x02, 0x99, 0x1b, 0xf9, 0xe4, 0x11, 0x3c, 0x18, 0x0f, 0x4d, 0xad, 0x07, 0x48, 0xaf, 0x6c, 0x58, 0xf7, 0xf8, 0x0c, 0xc2, 0x9b, 0x5e, 0x67, 0xe7, 0x2c, 0x37, 0x04, 0x2e, 0x0a, 0x7a, 0x83, 0xbc, 0xb0, 0x7f, 0xc4, 0x8a, 0xa5, 0x44, 0x5b, 0x90, 0x6c, 0xea, 0xf8, 0x77, 0xe7, 0x2e, 0x61, 0x3e, 0x0f, 0x0d, 0x56, 0x4c, 0xa5, 0x47, 0xe8, 0xa7, 0x16, 0x2b, 0x97, 0x3d, 0x97, 0x03, 0xed, 0xcb, 0x24, 0x3d, 0xcd, 0xcf, 0xac, 0x08, 0x01, 0x28, 0xd5, 0x0f, 0x25, 0x16, 0x2e, 0x07, 0x22, 0x4d, 0xc1, 0x77, 0x3a, 0xad, 0x02, 0xa7, 0x85, 0x73, 0x30, 0x1a, 0x24, 0x05, 0x3e, 0x47, 0x50, 0xd8, 0x85, 0xab, 0x18, 0x09, 0x7b, 0x80, 0xe1, 0xde, 0x95, 0x25, 0x8e, 0xae, 0x73, 0xc1, 0x20, 0x2e, 0xd6, 0xb5, 0x31, 0xc0, 0x79, 0x3d, 0xdf, 0x5d, 0xeb, 0xec, 0xd3, 0xaf, 0x9a, 0x8c, 0xff, 0x1a, 0x0f, 0x26, 0x0b, 0x1c, 0x04, 0xcc, 0xf5, 0x7b, 0x5d, 0x4c, 0x83, 0xc9, 0xc7, 0xb2, 0x59, 0xa9, + 0x4b, 0xc3, 0x3b, 0xab, 0xe6, 0x51, 0x05, 0x6a, 0x98, 0x11, 0x27, 0x2d, 0xb2, 0xd6, 0xff, 0x33, 0x20, 0xd6, 0x4e, 0x76, 0x06, 0xf8, 0xe6, 0x69, 0xaa, 0x1b, 0xcb, 0x83, 0x21, 0x5d, 0x6a, 0xa3, 0x51, 0xcc, 0xb5, 0x27, 0xf5, 0x54, 0xaf, 0x07, 0x5d, 0xaf, 0x5b, 0x5e, 0x2b, 0xbc, 0x1c, 0xaf, 0xae, 0x17, 0x5a, 0x66, 0xb7, 0x8f, 0x6c, 0x92, 0xb7, 0x67, 0x7c, 0x40, 0xe4, 0xac, 0xfe, 0xa2, 0xfe, 0xbe, 0x77, 0x2a, 0x2a, 0x43, 0x5b, 0xdf, 0x61, 0xfc, 0xf1, 0x1c, 0x21, 0x38, 0x03, 0x5f, 0x66, 0x90, 0x05, 0x85, 0xa0, 0x4a, 0xd7, 0x4e, 0x5f, 0x53, 0xec, 0x82, 0xe0, 0xfa, 0xac, 0x71, 0x08, 0x94, 0x79, 0xe0, 0xa3, 0x7f, 0x46, 0x66, 0xc3, 0x27, 0xa3, 0x52, 0xa5, 0x58, 0xdd, 0xb6, 0x66, 0xfd, 0x7d, 0xbb, 0x6f, 0x4f, 0xed, 0x75, 0xb0, 0xd0, 0x7b, 0x42, 0x16, 0x24, 0xc9, 0x7b, 0x0d, 0x5c, 0xf1, 0xc7, 0x57, 0x97, 0xd7, 0x13, 0xec, 0x2c, 0xa8, 0x05, 0x89, 0x4f, 0x11, 0x97, 0x1d, 0xca, 0xb2, 0xbb, 0x17, 0xbd, 0xd5, 0x1f, 0xc8, 0xee, 0xc0, 0xd7, 0xe6, 0xb7, 0x07, 0x9f, 0x4b, 0x72, 0xe0, 0x22, 0x77, 0x7f, 0x97, 0x3c, 0xd9, 0x6b, 0x13, 0xa2, 0xb5, 0xd0, 0x3f, 0x79, 0x52, 0x12, 0xe5, 0x0b, 0x34, 0x0a, 0x1c, 0xc8, 0x91, 0xa4, 0x52, 0x87, 0x4a, 0x06, 0x1e, 0xd0, 0x0b, 0x78, 0x7d, 0x74, 0x81, 0xb6, 0x73, 0x8a, 0xb3, 0x76, 0x1a, 0x72, 0xbe, 0x20, 0xfd, 0x9e, 0xd9, 0xc8, 0xc0, 0x5a, 0x5d, 0xec, 0xcf, 0xc9, 0x1c, 0x4a, 0xb5, 0x3b, 0x3b, 0x47, 0x9a, 0xfa, 0x01, 0x03, 0x83, 0xfe, 0x9d, 0xac, 0x2a, 0x01, 0x7a, 0xd8, 0xe5, 0xb8, 0x22, 0xe9, 0xbf, 0xbe, 0x13, 0x53, 0x6f, 0xbf, 0xda, 0x1e, 0xc0, 0x51, 0xf1, 0x71, 0xf3, 0x7a, 0xaf, 0x42, 0x11, 0xe3, + 0x6a, 0x1e, 0x7c, 0xf3, 0x2a, 0xc2, 0x08, 0xbc, 0xe5, 0xd7, 0xa9, 0xa0, 0xda, 0x17, 0xe5, 0x3c, 0xdc, 0xd1, 0x3f, 0xda, 0xba, 0x32, 0xbb, 0x74, 0xb5, 0xf0, 0x58, 0x53, 0xe4, 0x0b, 0x4b, 0xe0, 0x95, 0xf5, 0x85, 0x5a, 0xfd, 0x83, 0x50, 0x4e, 0x66, 0xdc, 0x2d, 0xbf, 0xf3, 0xed, 0xbd, 0x12, 0xf3, 0xc6, 0xed, 0xf4, 0xde, 0x74, 0xc2, 0x50, 0x61, 0xe3, 0x6e, 0x6a, 0x6e, 0x59, 0xbc, 0x59, 0xff, 0x99, 0x76, 0x1d, 0x85, 0x8e, 0x16, 0x44, 0x6f, 0x1c, 0x6b, 0xc9, 0x4e, 0xb3, 0x0f, 0x2a, 0xa5, 0x1a, 0x73, 0xd5, 0x25, 0x27, 0xf6, 0x2c, 0x4a, 0x3d, 0x24, 0xa2, 0xe5, 0x45, 0x0c, 0x0b, 0x57, 0xef, 0xd8, 0x57, 0x37, 0xa5, 0xfb, 0x83, 0x9e, 0x15, 0x44, 0x40, 0x40, 0x0c, 0x1d, 0xf1, 0x95, 0xc3, 0x57, 0x9c, 0xa8, 0x48, 0x84, 0x36, 0x40, 0xde, 0xca, 0x11, 0xf9, 0x45, 0xb3, 0xfb, 0x2b, 0x8c, 0x34, 0xca, 0x68, 0xe5, 0x04, 0xd2, 0x41, 0xb7, 0x17, 0x57, 0x89, 0xc0, 0xb9, 0xd5, 0x23, 0x6f, 0xc7, 0xf6, 0x8a, 0x82, 0xf0, 0xdf, 0x6d, 0x10, 0x91, 0x70, 0x09, 0x56, 0x42, 0x54, 0x57, 0xda, 0x9a, 0xd0, 0xe4, 0x88, 0xe0, 0xfe, 0xa1, 0x08, 0xb5, 0x95, 0x5c, 0x83, 0xd8, 0x26, 0x52, 0x48, 0x44, 0xef, 0x6c, 0x41, 0x2d, 0x14, 0x5e, 0x9f, 0xb8, 0xf1, 0xfc, 0x6d, 0x05, 0x03, 0xc4, 0x47, 0x74, 0x2c, 0x74, 0xf9, 0x46, 0x37, 0x0f, 0x19, 0x59, 0xd6, 0x5b, 0x94, 0x80, 0x05, 0x9e, 0xc9, 0x18, 0xc0, 0xf7, 0x42, 0x75, 0xb4, 0x14, 0x7a, 0x1b, 0x55, 0xc3, 0xa3, 0xe3, 0x33, 0xb9, 0xc9, 0xe0, 0x21, 0x14, 0x10, 0x1f, 0x84, 0x37, 0x93, 0xfd, 0x30, 0x8b, 0x0d, 0x1e, 0xf9, 0xef, 0xdf, 0x00, 0x1f, 0xe8, 0xf6, 0xf8, 0xd3, 0x9d, 0x0f, 0xc3, 0x59, 0xed, 0x81, 0xd5, 0x4a, + 0xd6, 0xb9, 0x2f, 0xe2, 0x21, 0x9c, 0x51, 0x45, 0xbe, 0xef, 0x63, 0x5d, 0xb0, 0xd2, 0x06, 0xa9, 0xa7, 0x84, 0x34, 0x95, 0x6d, 0xa2, 0x48, 0x30, 0xc5, 0x1d, 0x26, 0xec, 0x72, 0xe0, 0xa3, 0x8d, 0x8c, 0xa9, 0x3b, 0x9e, 0x73, 0xaa, 0x56, 0xe2, 0x67, 0x5a, 0x47, 0x76, 0x0b, 0x72, 0x2b, 0xde, 0x51, 0x00, 0x6e, 0x38, 0x95, 0xc3, 0x83, 0x00, 0x52, 0x8e, 0x9c, 0x27, 0x2e, 0x4e, 0x27, 0x37, 0x13, 0x0c, 0x9c, 0x9e, 0x3a, 0x85, 0x2c, 0xaf, 0x84, 0x7d, 0x69, 0xfb, 0x1b, 0x83, 0x9e, 0x47, 0xe6, 0xe0, 0x05, 0x89, 0xd7, 0xd2, 0xeb, 0x3f, 0x7e, 0x9a, 0x77, 0x0b, 0x35, 0x0d, 0x35, 0x8e, 0xc5, 0x0c, 0xf8, 0xb0, 0x46, 0xbc, 0x0f, 0xd5, 0xe3, 0x98, 0x9f, 0x06, 0xf6, 0x67, 0xfd, 0xa5, 0xef, 0x24, 0xbc, 0x31, 0x98, 0x4f, 0x94, 0x07, 0xea, 0x92, 0xc4, 0x6a, 0x29, 0x74, 0xbb, 0x19, 0xce, 0xb9, 0x0d, 0xbf, 0xed, 0x8f, 0xe5, 0xb8, 0xef, 0x3d, 0x60, 0x7f, 0xe8, 0x29, 0x81, 0xdc, 0xbb, 0x13, 0x82, 0x9a, 0x64, 0x33, 0xdb, 0x5b, 0xf7, 0x0c, 0xd3, 0x08, 0x5d, 0x54, 0x0c, 0x39, 0xe2, 0x85, 0x67, 0xe9, 0x87, 0xb6, 0xd9, 0x88, 0x60, 0x01, 0x17, 0xdc, 0x68, 0x80, 0x4e, 0x29, 0x7b, 0x5f, 0x94, 0xe9, 0xbc, 0x8e, 0x47, 0x5c, 0x1f, 0xe9, 0x6b, 0xca, 0x91, 0x71, 0x2b, 0x05, 0xe3, 0xdf, 0x66, 0x2d, 0xa0, 0xfd, 0x66, 0x85, 0x97, 0xbd, 0xa1, 0x7d, 0xb1, 0x0e, 0xdb, 0x53, 0xd3, 0xe8, 0xde, 0xee, 0xa2, 0x3d, 0xb5, 0x91, 0xb1, 0x38, 0x0a, 0xad, 0xcb, 0x39, 0xb7, 0xc4, 0x97, 0x0d, 0x71, 0xbe, 0xf8, 0x6b, 0x98, 0x27, 0x7c, 0x7a, 0x1a, 0x76, 0x24, 0xb8, 0xc8, 0xb7, 0xf9, 0xbb, 0xb9, 0xc4, 0xbf, 0x4e, 0x08, 0x86, 0xc6, 0x65, 0x02, 0x9a, 0xc1, 0xa8, 0xf6, 0x81, + 0xda, 0x1b, 0xd3, 0xda, 0xa6, 0x41, 0xe9, 0x4e, 0x86, 0xac, 0xda, 0x3b, 0x2b, 0xf9, 0x57, 0x3e, 0x81, 0x98, 0x32, 0x4e, 0x2a, 0xcf, 0x3e, 0x35, 0x5f, 0xba, 0xa9, 0x43, 0xe7, 0x69, 0xaa, 0x8e, 0x8a, 0xe6, 0x4c, 0x50, 0xe3, 0x52, 0xf4, 0x5a, 0xd1, 0x97, 0x3c, 0x9a, 0x81, 0xae, 0x9a, 0xc4, 0x1c, 0xb6, 0xcd, 0x8a, 0xec, 0xb9, 0x2d, 0xd0, 0xfb, 0x5c, 0x51, 0x5a, 0x9c, 0xc6, 0xc3, 0x24, 0x63, 0x1e, 0xb7, 0x74, 0x4d, 0x57, 0x97, 0x6f, 0x77, 0x24, 0xa4, 0x55, 0xaa, 0x5e, 0x5b, 0x91, 0x44, 0x0a, 0x89, 0xff, 0x6a, 0xc0, 0xfe, 0x49, 0x09, 0x10, 0xa6, 0x03, 0x22, 0x20, 0x5b, 0xc5, 0x87, 0xb2, 0x09, 0x5b, 0x33, 0xab, 0x63, 0x8f, 0x62, 0x14, 0x50, 0xe4, 0x16, 0x85, 0x5a, 0xcd, 0x1e, 0x6c, 0x53, 0x88, 0x43, 0xc5, 0xd6, 0x37, 0x7a, 0xfa, 0x8c, 0x20, 0xf3, 0x76, 0x7c, 0x8d, 0xaa, 0x99, 0xbe, 0x18, 0xc6, 0x96, 0x59, 0xa3, 0x9c, 0x37, 0xb0, 0xf9, 0x63, 0xec, 0x32, 0xa8, 0xfa, 0x68, 0xf7, 0xdc, 0xb0, 0xf9, 0xfa, 0x5f, 0x63, 0x63, 0x7f, 0xf5, 0xbc, 0x4d, 0xf5, 0xcd, 0x5d, 0x21, 0xfa, 0x30, 0x21, 0x8c, 0x09, 0x71, 0x7d, 0x68, 0xe5, 0xfe, 0xb2, 0x37, 0x15, 0x75, 0xb9, 0x25, 0xcf, 0x66, 0x96, 0xd4, 0x3f, 0x35, 0x96, 0xc5, 0xe5, 0xed, 0x4b, 0x63, 0x2a, 0xa0, 0xd6, 0x25, 0xe5, 0x20, 0x86, 0x98, 0x0d, 0xec, 0x85, 0x8d, 0x01, 0x84, 0x9d, 0x67, 0x6a, 0xc4, 0x85, 0x67, 0x03, 0x03, 0xed, 0x91, 0x45, 0x53, 0x84, 0x58, 0x8b, 0x7a, 0xae, 0x63, 0xd4, 0x4a, 0xf7, 0x8d, 0x2c, 0x4d, 0x56, 0x63, 0x16, 0x49, 0x01, 0xeb, 0x1d, 0xd5, 0x92, 0xe6, 0x33, 0x83, 0x31, 0xcd, 0xb3, 0x41, 0x26, 0x95, 0xf9, 0x08, 0x39, 0x5d, 0x7a, 0x84, 0xeb, 0x45, 0x6c, 0xad, + 0x95, 0xb9, 0x5e, 0xb0, 0x52, 0xe9, 0x57, 0x22, 0x0f, 0x88, 0xfd, 0x74, 0x8b, 0x0a, 0x1c, 0x1a, 0x88, 0x7c, 0x7a, 0xd0, 0x3b, 0x23, 0xae, 0x4f, 0x19, 0x82, 0x25, 0x04, 0x75, 0x91, 0x46, 0x36, 0x45, 0x92, 0xaf, 0x6a, 0x55, 0xb9, 0xe5, 0x7d, 0xc6, 0x28, 0x6d, 0x7a, 0xe2, 0xf5, 0x32, 0x3d, 0x5c, 0x1e, 0x1a, 0x8d, 0xc9, 0x94, 0x9c, 0xb3, 0xa7, 0xfb, 0x8d, 0x20, 0x2e, 0x37, 0x14, 0xd7, 0x75, 0x06, 0x89, 0x58, 0xd3, 0x8d, 0xca, 0xf3, 0xd8, 0xaa, 0x1e, 0x92, 0x46, 0x83, 0xaa, 0x04, 0x10, 0x39, 0xfb, 0x58, 0x94, 0x80, 0xbc, 0x82, 0x61, 0x52, 0xd4, 0x84, 0x3d, 0x5c, 0x5e, 0xa1, 0xdc, 0xbe, 0xea, 0xa0, 0x23, 0x9b, 0xee, 0xc0, 0x1e, 0x48, 0xb3, 0x70, 0x43, 0xeb, 0x12, 0xc3, 0x88, 0x06, 0x29, 0xf8, 0x25, 0xa6, 0x33, 0x83, 0x68, 0xaf, 0x92, 0x2d, 0xf8, 0x9c, 0xac, 0x85, 0xcb, 0x21, 0xb8, 0x6f, 0x9b, 0x40, 0x62, 0xda, 0x9f, 0x54, 0xe4, 0x7f, 0x7c, 0x34, 0xff, 0x15, 0xff, 0x45, 0xa5, 0x04, 0xcd, 0xb4, 0x5c, 0xb2, 0xf7, 0x39, 0xb4, 0xc8, 0xb9, 0x9e, 0x42, 0x31, 0x20, 0x89, 0x91, 0x19, 0x07, 0x42, 0xe0, 0x1c, 0xdb, 0xf5, 0x18, 0xd2, 0x32, 0x47, 0x85, 0xaa, 0x36, 0x08, 0xf0, 0x74, 0x88, 0x7b, 0x97, 0xff, 0x45, 0x57, 0x2f, 0xa6, 0xbd, 0x9b, 0x0f, 0x45, 0x06, 0x8d, 0xe0, 0xde, 0x6f, 0x2a, 0x9e, 0xec, 0xc2, 0x1b, 0xd2, 0x40, 0xde, 0x84, 0xd5, 0x1d, 0xf4, 0x8f, 0x2d, 0x38, 0x70, 0xad, 0x60, 0x83, 0x32, 0xb8, 0x75, 0xd3, 0x3e, 0x48, 0xf1, 0x2e, 0xfb, 0xca, 0x8c, 0xf0, 0x2e, 0x1b, 0xd3, 0x18, 0xb7, 0x9d, 0x6e, 0x75, 0xa3, 0x53, 0x9b, 0x92, 0xed, 0x6a, 0x08, 0xb7, 0x49, 0xfb, 0xf5, 0xfa, 0xd1, 0x66, 0xcb, 0x6a, 0xd0, 0x42, 0x4d, 0x14, + 0x70, 0x28, 0x7c, 0x92, 0x9c, 0x9e, 0xcd, 0x97, 0xc6, 0xf4, 0x34, 0x77, 0x6d, 0xf6, 0x3e, 0x6f, 0xa7, 0x8a, 0x4c, 0x2f, 0xb3, 0x0e, 0x98, 0x9f, 0xfc, 0x04, 0x54, 0xbd, 0x98, 0x6e, 0xca, 0x5f, 0x54, 0x32, 0xcc, 0x7b, 0x48, 0x95, 0xe5, 0xaf, 0x93, 0x08, 0x75, 0x5f, 0x85, 0x0f, 0xfd, 0xa3, 0xd2, 0xb1, 0x40, 0xe4, 0xda, 0x5f, 0x65, 0x2a, 0x4d, 0x79, 0x80, 0x8e, 0xe2, 0x98, 0xf9, 0xa9, 0x4e, 0xb4, 0x0e, 0x5b, 0xf9, 0x3d, 0x56, 0x58, 0x92, 0xe4, 0xff, 0x1d, 0x0d, 0xc0, 0x96, 0x71, 0x11, 0x5d, 0x60, 0x78, 0x59, 0x62, 0x7e, 0x84, 0xbc, 0x2a, 0x43, 0xc0, 0x6a, 0x03, 0x44, 0x35, 0xf9, 0x46, 0x52, 0xd8, 0xaf, 0x27, 0xb7, 0x53, 0x78, 0x7e, 0xec, 0x00, 0xd5, 0x63, 0x85, 0x2d, 0x08, 0xf0, 0xe3, 0x88, 0x37, 0xde, 0x31, 0x03, 0xb9, 0xf7, 0xc9, 0xbd, 0xef, 0x8f, 0x57, 0xfd, 0x8c, 0x20, 0xe5, 0x2d, 0x98, 0xa7, 0x77, 0x1d, 0xfb, 0x72, 0x15, 0xdf, 0x91, 0xfd, 0x2e, 0x43, 0xdd, 0xbc, 0x27, 0xb3, 0x79, 0x8f, 0x3a, 0x00, 0x95, 0x93, 0xd6, 0x45, 0x72, 0xc1, 0x21, 0xbd, 0x7b, 0xc7, 0x98, 0xd0, 0x59, 0xd4, 0x8a, 0x68, 0x87, 0xce, 0x6f, 0xd1, 0x4a, 0xfa, 0x22, 0x8b, 0xb4, 0x03, 0xa6, 0xd9, 0x67, 0xd0, 0xed, 0xc0, 0x86, 0xba, 0x3d, 0x64, 0xfa, 0xc5, 0xf3, 0x99, 0xf0, 0xfb, 0x74, 0xda, 0xdb, 0x87, 0xef, 0xbe, 0x30, 0xda, 0xc1, 0x24, 0x7e, 0x8a, 0x2f, 0x3f, 0x11, 0x39, 0xec, 0xfb, 0xe5, 0xa2, 0x24, 0x5c, 0x88, 0xc3, 0xb1, 0x54, 0xa0, 0x13, 0xc4, 0x63, 0x35, 0xe5, 0x8d, 0xaa, 0x5b, 0xe2, 0x61, 0xf1, 0xd9, 0xe6, 0x68, 0x1d, 0x0e, 0xfa, 0x8f, 0xb2, 0x33, 0x30, 0xb0, 0xe5, 0x60, 0x5c, 0x47, 0x81, 0xed, 0x6d, 0x3e, 0xa1, 0xdd, 0x0f, 0x0a, 0x4f, + 0x96, 0x68, 0xb6, 0x79, 0x29, 0x7a, 0xb9, 0xf5, 0xba, 0xe1, 0xee, 0x57, 0xce, 0x18, 0x4b, 0xef, 0xc8, 0xbb, 0x1c, 0x25, 0xa9, 0x8e, 0x20, 0xac, 0x43, 0x14, 0x8e, 0xc3, 0x8b, 0x40, 0xf2, 0xbb, 0x0e, 0x54, 0xd4, 0x11, 0x70, 0x88, 0x6d, 0x71, 0x2e, 0x48, 0xe7, 0x88, 0x52, 0x6a, 0xde, 0xc2, 0xc3, 0xf0, 0x73, 0x52, 0x63, 0xaf, 0x20, 0x27, 0x73, 0x81, 0x0e, 0x2b, 0x36, 0x3e, 0x7d, 0xa0, 0xb7, 0xc4, 0x28, 0x78, 0xef, 0xf5, 0xb3, 0x4e, 0x65, 0x09, 0xe2, 0xf0, 0x44, 0x28, 0x43, 0xe0, 0x2f, 0xfd, 0xa3, 0x93, 0x41, 0xb7, 0x2f, 0xd7, 0xe5, 0x4f, 0x21, 0x18, 0x98, 0x01, 0x41, 0xfb, 0xd9, 0x50, 0xf9, 0x80, 0x6e, 0x12, 0x1f, 0x9e, 0xdd, 0x87, 0xfa, 0xba, 0xa6, 0x71, 0x16, 0xfa, 0x0d, 0xef, 0x6e, 0x84, 0xa5, 0x4d, 0x1d, 0xa3, 0xda, 0xc6, 0x51, 0x21, 0xa7, 0x68, 0x7a, 0xe3, 0x4c, 0x1c, 0x08, 0xdd, 0x85, 0xe0, 0x6f, 0x87, 0xcf, 0x0e, 0x27, 0xca, 0xf9, 0xb0, 0x42, 0xff, 0xb2, 0x2b, 0xb0, 0x16, 0x67, 0x84, 0x96, 0xfb, 0x90, 0x85, 0x34, 0xef, 0xbe, 0x40, 0xc6, 0x03, 0x90, 0xf7, 0xc8, 0x75, 0x40, 0xc3, 0xbd, 0x6d, 0x5d, 0x0f, 0x8f, 0x84, 0x44, 0x79, 0x9a, 0x38, 0x48, 0xcd, 0x64, 0xb7, 0x3d, 0x76, 0xbe, 0xce, 0xdc, 0xc8, 0x76, 0x9d, 0xa4, 0x34, 0x3f, 0x2e, 0x25, 0xf8, 0xa0, 0x44, 0x34, 0xce, 0x3c, 0xf0, 0xcb, 0xff, 0x92, 0x12, 0xe4, 0xd4, 0x5e, 0xab, 0x08, 0x70, 0x84, 0x4d, 0x55, 0x5e, 0xb9, 0x4c, 0xab, 0x27, 0x21, 0xe0, 0x1a, 0xd0, 0xea, 0x29, 0x93, 0x77, 0x4e, 0x87, 0xf5, 0x04, 0x0d, 0xc6, 0x99, 0x7f, 0x3c, 0x8c, 0xd9, 0x3c, 0xad, 0x29, 0x7e, 0x10, 0x9f, 0x22, 0xb6, 0xfb, 0x46, 0xb2, 0x01, 0x2f, 0x4f, 0x1c, 0x2b, 0x75, 0x37, 0x73, + 0x59, 0x79, 0x27, 0x96, 0xf7, 0xf7, 0x1d, 0x30, 0x07, 0xed, 0x16, 0x5d, 0x29, 0x23, 0xf6, 0xae, 0x19, 0xee, 0x16, 0x93, 0x49, 0xc9, 0xe6, 0x75, 0xdd, 0x52, 0x53, 0x41, 0x52, 0x61, 0x90, 0xa1, 0xa9, 0xce, 0x00, 0x40, 0xf7, 0x6a, 0x88, 0x44, 0xab, 0x91, 0x71, 0x37, 0xaa, 0x98, 0x03, 0x35, 0xcb, 0x05, 0x6e, 0x69, 0x03, 0x21, 0xc4, 0xd2, 0x96, 0xc0, 0xcf, 0x1f, 0xc5, 0xee, 0xca, 0xe7, 0x42, 0xa8, 0x5d, 0x19, 0xbd, 0x1f, 0xce, 0xc4, 0x9e, 0xba, 0x30, 0x35, 0x66, 0xd8, 0x52, 0x1d, 0x05, 0x7b, 0xda, 0xbb, 0xb7, 0x39, 0xf2, 0xd9, 0xf8, 0x71, 0xfe, 0x06, 0x25, 0x2d, 0xf2, 0x4c, 0x6d, 0x04, 0x8f, 0x0f, 0xcc, 0x40, 0xcb, 0x97, 0xf5, 0xb1, 0x98, 0x8a, 0x06, 0xe4, 0xdb, 0x6d, 0x5b, 0x65, 0xe6, 0x19, 0x43, 0xd8, 0xae, 0x64, 0x5e, 0x3b, 0xd9, 0x73, 0x5c, 0xaa, 0xc6, 0xd2, 0x2e, 0xd9, 0x58, 0x87, 0xa4, 0xc1, 0xa0, 0xa1, 0x49, 0x1f, 0xb8, 0x42, 0x54, 0x81, 0xf6, 0x3e, 0xde, 0x0a, 0x72, 0x83, 0x4d, 0xaa, 0x67, 0x51, 0x1e, 0x0f, 0x73, 0x97, 0x0c, 0x17, 0x2f, 0xa0, 0xf7, 0x3a, 0x23, 0x31, 0xec, 0xb1, 0x13, 0x5e, 0x8b, 0x83, 0xa7, 0xf2, 0x28, 0x83, 0xa8, 0xe8, 0xfb, 0x55, 0xe6, 0xcf, 0x8a, 0xaa, 0xd4, 0x27, 0x6a, 0x3c, 0xa0, 0x15, 0x45, 0xc6, 0xd4, 0x38, 0x4e, 0x6c, 0xa0, 0x7c, 0x04, 0xe7, 0x2c, 0xbd, 0x77, 0x2d, 0x25, 0x32, 0x83, 0xba, 0x0f, 0x0e, 0xa9, 0xdd, 0xc5, 0xbc, 0xa5, 0xb9, 0xa2, 0xf7, 0x7e, 0x11, 0x30, 0x76, 0x51, 0x89, 0xa8, 0x8a, 0x19, 0x3c, 0x4d, 0x89, 0xce, 0x9e, 0x9a, 0x09, 0x22, 0x95, 0x53, 0xa9, 0x0c, 0x28, 0xe4, 0x7b, 0xdc, 0xdb, 0x70, 0x42, 0x7e, 0x53, 0x97, 0x51, 0x07, 0x23, 0x0e, 0xeb, 0x1d, 0xfe, 0xe9, 0x0a, + 0x86, 0x17, 0x7b, 0xc2, 0x66, 0x92, 0x26, 0xbf, 0xfc, 0x9e, 0x05, 0xfb, 0xe9, 0x12, 0x86, 0x80, 0x0e, 0xbc, 0xdb, 0x73, 0xfc, 0xda, 0x17, 0x9d, 0x85, 0xec, 0xc8, 0x4c, 0xb9, 0x27, 0x96, 0x5b, 0x0b, 0xda, 0xff, 0xab, 0x1a, 0xe0, 0xeb, 0xec, 0x62, 0xe2, 0x9a, 0x5f, 0xc9, 0xf8, 0x8c, 0x8f, 0x7f, 0xc8, 0x11, 0xec, 0x38, 0x17, 0xb1, 0x69, 0x92, 0xec, 0xfb, 0xc4, 0x78, 0x77, 0x6d, 0x54, 0x48, 0x7b, 0xc5, 0x43, 0x2a, 0xec, 0x57, 0xc4, 0xfc, 0x13, 0x7e, 0xe3, 0x18, 0xae, 0x35, 0xbd, 0x5f, 0xcf, 0x35, 0x3f, 0x81, 0xae, 0xfb, 0xfc, 0xb2, 0xe4, 0x8e, 0x80, 0x05, 0xd9, 0x4b, 0x30, 0x65, 0x6b, 0x49, 0x3c, 0x81, 0x64, 0x8a, 0x03, 0x07, 0x1e, 0x7e, 0x29, 0xe8, 0x3b, 0xd4, 0x8d, 0xd3, 0xf9, 0x21, 0x19, 0x70, 0x0d, 0x0c, 0xc0, 0x6a, 0xd1, 0xfe, 0x31, 0x8e, 0xe6, 0x40, 0x51, 0x36, 0x2e, 0xba, 0xf1, 0xde, 0x9a, 0x56, 0xae, 0x27, 0x4e, 0x55, 0x0b, 0x09, 0xc2, 0xc5, 0x59, 0xa1, 0x7e, 0xb1, 0x8a, 0x9b, 0x8b, 0x80, 0x77, 0x63, 0x69, 0xc0, 0xd5, 0x93, 0xcb, 0x39, 0xe1, 0x6c, 0x2f, 0xad, 0x45, 0x16, 0xf6, 0xe8, 0x0b, 0xc2, 0xc2, 0xac, 0xf8, 0xf0, 0xb3, 0x44, 0xdd, 0x97, 0x42, 0x57, 0x7f, 0x30, 0xe6, 0xd9, 0xf0, 0x17, 0x22, 0x7e, 0x32, 0x75, 0x14, 0x44, 0x06, 0x15, 0x86, 0x1e, 0xf2, 0xd9, 0x4e, 0xc9, 0xd7, 0x36, 0xcd, 0x49, 0x22, 0xea, 0xe3, 0x81, 0xe6, 0x64, 0x5a, 0x82, 0x49, 0xcc, 0x71, 0x41, 0x84, 0x72, 0x22, 0xc6, 0xe8, 0x5b, 0xcb, 0xb3, 0x93, 0x96, 0x84, 0x69, 0xe1, 0x46, 0x64, 0x28, 0xc3, 0xb2, 0x15, 0x2a, 0xaa, 0x1a, 0x8c, 0x88, 0xbd, 0x1e, 0xb0, 0x2a, 0x8f, 0x38, 0x71, 0x6c, 0x37, 0xeb, 0x35, 0x30, 0x02, 0x90, 0x9d, 0x9d, 0x09, + 0x05, 0x82, 0x40, 0x87, 0x01, 0xc6, 0x14, 0xdc, 0x89, 0x15, 0x3c, 0xe9, 0xbc, 0x27, 0x96, 0xd6, 0x24, 0xcd, 0x7a, 0x9f, 0x9c, 0xba, 0x51, 0x07, 0xdf, 0xb6, 0x62, 0x68, 0xe6, 0xbe, 0x12, 0x83, 0xd2, 0x07, 0x17, 0xdf, 0x4a, 0x86, 0x1b, 0x8a, 0xb2, 0x28, 0xa0, 0x02, 0x0f, 0xaa, 0xa4, 0x86, 0xd6, 0x9e, 0x37, 0x78, 0xd3, 0xff, 0x6a, 0x6f, 0xd9, 0xf5, 0x7f, 0x34, 0x1d, 0x29, 0x91, 0x9e, 0xbf, 0xe6, 0xa5, 0xb4, 0x8f, 0x65, 0x12, 0x35, 0x34, 0xd0, 0x22, 0x9e, 0x1f, 0xb9, 0x0b, 0xe2, 0xa0, 0xd9, 0x75, 0x9a, 0x99, 0x4f, 0xa5, 0x59, 0x98, 0x07, 0x54, 0x83, 0x0a, 0x36, 0x80, 0xd2, 0xf6, 0x4a, 0x92, 0xf4, 0x38, 0xfe, 0xf8, 0x09, 0x1b, 0x12, 0x54, 0x18, 0x4b, 0xfb, 0x5d, 0xd7, 0x30, 0xe8, 0xca, 0x23, 0x41, 0x5f, 0x9a, 0xba, 0x74, 0x12, 0xa7, 0x68, 0x57, 0xd8, 0x47, 0xb5, 0xb7, 0x1e, 0x2e, 0x58, 0xf1, 0xf2, 0x09, 0x2b, 0xfd, 0x63, 0xf7, 0x7a, 0xf7, 0xf1, 0xdd, 0x51, 0x2c, 0x7e, 0x57, 0x47, 0x2c, 0x8f, 0x46, 0x4b, 0x39, 0xa6, 0x8d, 0x1e, 0x44, 0x2e, 0x02, 0x66, 0x18, 0xca, 0xce, 0xee, 0x32, 0x45, 0x50, 0x16, 0xb7, 0xb8, 0x9f, 0xb7, 0xb5, 0x6d, 0xc2, 0xaf, 0x37, 0xf7, 0xcb, 0x8c, 0x83, 0x20, 0xde, 0x1b, 0x40, 0xdb, 0x6f, 0x29, 0xec, 0xbf, 0x85, 0xa2, 0x32, 0x90, 0x4b, 0x23, 0x2d, 0x9f, 0xb7, 0x1a, 0x2c, 0x6a, 0xef, 0x6b, 0xfe, 0xf5, 0x52, 0xe7, 0xee, 0x9c, 0xb3, 0x70, 0xfb, 0xd8, 0xce, 0x54, 0x59, 0x50, 0x90, 0xa0, 0x40, 0x50, 0x46, 0x33, 0x3e, 0x93, 0xaf, 0xba, 0x18, 0x48, 0xa7, 0xbc, 0xc5, 0x96, 0x56, 0xa5, 0x66, 0xad, 0x7b, 0x70, 0x24, 0x0d, 0x14, 0x77, 0x50, 0xb4, 0x2c, 0x79, 0x71, 0x87, 0xb0, 0x24, 0x7f, 0x9c, 0x8c, 0x86, + 0x9a, 0x7c, 0xb2, 0x6f, 0x9a, 0x4c, 0xc8, 0xb4, 0x57, 0x33, 0x78, 0xd9, 0x11, 0xe9, 0x7e, 0x75, 0x9c, 0xb1, 0xa9, 0x38, 0x5b, 0x90, 0x20, 0x23, 0xef, 0x50, 0x21, 0xa1, 0x2f, 0x3b, 0xee, 0x7a, 0x14, 0x9a, 0x46, 0x9d, 0x94, 0x4d, 0xa6, 0x6a, 0xbf, 0x30, 0x50, 0x73, 0xbf, 0x22, 0x98, 0xaa, 0x98, 0x64, 0x7d, 0x41, 0x88, 0x1b, 0x30, 0x5b, 0x64, 0x30, 0xa6, 0xfe, 0xaf, 0xee, 0x70, 0x74, 0x67, 0x00, 0x37, 0x86, 0xe2, 0x4e, 0xcd, 0x44, 0xe9, 0xbd, 0xf7, 0x85, 0x8a, 0x66, 0x2f, 0x70, 0xe2, 0xf2, 0x25, 0x20, 0x6b, 0x72, 0x63, 0x62, 0xa2, 0x81, 0x09, 0x3e, 0xd6, 0x01, 0x9d, 0x83, 0x9e, 0xc6, 0x49, 0x3a, 0x7c, 0xd1, 0x72, 0x7a, 0xd5, 0x05, 0x3d, 0x37, 0x21, 0x16, 0x08, 0x0f, 0x67, 0xe1, 0x56, 0xf0, 0x0e, 0x0d, 0x53, 0xc5, 0xc6, 0x26, 0xca, 0x91, 0xb0, 0x15, 0xe2, 0x1a, 0x44, 0xaa, 0xd8, 0x5b, 0x0e, 0x5a, 0xfe, 0x77, 0x94, 0x07, 0x7e, 0xaf, 0x6d, 0x02, 0x81, 0x7e, 0xd5, 0x8d, 0x69, 0x8d, 0x65, 0xe5, 0xea, 0x18, 0x45, 0x19, 0xa8, 0xc7, 0x34, 0xdd, 0x3a, 0xae, 0xfa, 0x46, 0xc5, 0xbc, 0xda, 0x08, 0x8c, 0x09, 0x71, 0xa7, 0x3c, 0x6c, 0x43, 0x93, 0xfa, 0x89, 0xa4, 0xd9, 0xad, 0xce, 0xc9, 0x46, 0x62, 0x13, 0x01, 0x11, 0x3c, 0xa4, 0x61, 0x41, 0xc1, 0x40, 0x35, 0xd1, 0x2b, 0x17, 0x50, 0x27, 0x3e, 0x15, 0x4f, 0xf3, 0xf7, 0xd2, 0xc5, 0x9e, 0x3d, 0xa6, 0xc8, 0x02, 0xae, 0x2d, 0x3c, 0xf2, 0xa4, 0x6a, 0x54, 0x01, 0x39, 0x95, 0x6b, 0xd3, 0xb1, 0xa5, 0x8d, 0x03, 0x19, 0x16, 0xf4, 0xec, 0x0a, 0x78, 0x3d, 0xc6, 0xda, 0xfb, 0x44, 0x2d, 0x28, 0x26, 0x2c, 0xbc, 0x22, 0xd4, 0xdf, 0x9a, 0x3d, 0x21, 0xc7, 0xc2, 0xe1, 0x8b, 0xde, 0xb3, 0xd0, 0x68, + 0x5e, 0x71, 0x06, 0x21, 0x16, 0xbd, 0xea, 0xa9, 0x51, 0x2a, 0xf9, 0x45, 0xa9, 0xb6, 0xa9, 0x22, 0xf1, 0xf1, 0xd7, 0xd6, 0x3b, 0xba, 0x46, 0x13, 0x4e, 0x31, 0x32, 0xa2, 0x03, 0x46, 0x4d, 0x9b, 0xa2, 0xf9, 0xe7, 0xeb, 0x58, 0xd9, 0x1f, 0xfa, 0x15, 0x54, 0xb9, 0xbc, 0x70, 0x2b, 0xbb, 0x4d, 0xb2, 0xac, 0xe9, 0x2e, 0xf2, 0x9d, 0x29, 0x25, 0x1b, 0x4c, 0x47, 0xaa, 0x04, 0x5e, 0xa2, 0x9a, 0x0d, 0x24, 0x52, 0x78, 0xfa, 0x5a, 0x5f, 0x42, 0xce, 0x1f, 0xfe, 0xce, 0x1f, 0x1b, 0x06, 0xc6, 0x70, 0x1f, 0xf0, 0x7d, 0x81, 0x48, 0x67, 0x05, 0xa1, 0x6b, 0xd2, 0x0a, 0x93, 0xde, 0xdb, 0x35, 0x58, 0x68, 0xb5, 0x23, 0x99, 0x86, 0xf5, 0x03, 0x1c, 0xe1, 0x43, 0x52, 0x22, 0x11, 0xc0, 0x91, 0x33, 0xc7, 0x65, 0x86, 0xa8, 0x8f, 0xdc, 0xf5, 0x6b, 0x91, 0xe9, 0x46, 0x19, 0xce, 0x59, 0x29, 0xf9, 0xcc, 0x7e, 0x2d, 0x2e, 0x55, 0x07, 0xb0, 0x9a, 0xb5, 0xc6, 0x62, 0xdf, 0x9c, 0x95, 0x0d, 0x24, 0xdc, 0x5a, 0x12, 0xdc, 0x1f, 0x0c, 0xf3, 0x38, 0xec, 0x07, 0x87, 0x2b, 0x14, 0xc7, 0x4e, 0xb3, 0xaa, 0x2b, 0xe1, 0x34, 0xf3, 0x93, 0x13, 0xf9, 0x48, 0x19, 0x85, 0x9b, 0xa2, 0x16, 0x88, 0x24, 0x13, 0x65, 0xb3, 0x3b, 0xf5, 0x64, 0x50, 0x1e, 0x03, 0xd0, 0x44, 0xaa, 0x9d, 0x5e, 0x2c, 0x69, 0x6b, 0xeb, 0x2e, 0x96, 0xe7, 0x5a, 0x2f, 0x6f, 0x2e, 0x00, 0xd6, 0x11, 0x9f, 0xad, 0x76, 0x9d, 0x90, 0xae, 0xa3, 0x73, 0x04, 0xfe, 0xcd, 0x71, 0xee, 0x88, 0xc9, 0x3f, 0xa4, 0xee, 0x27, 0x79, 0x4b, 0x65, 0x0d, 0x22, 0xb1, 0x92, 0x36, 0x81, 0x03, 0xad, 0x9a, 0x3f, 0x20, 0xee, 0x91, 0x59, 0xbc, 0xea, 0x4f, 0x1f, 0xae, 0xff, 0xc9, 0x49, 0x5f, 0x07, 0x26, 0x4a, 0x77, 0x60, 0xfd, + 0x99, 0xe4, 0x53, 0x1c, 0x9d, 0x30, 0x39, 0x58, 0xfc, 0x16, 0x4a, 0x75, 0x21, 0xb7, 0x5c, 0xaa, 0x98, 0x16, 0x7a, 0x55, 0xa1, 0xb3, 0x02, 0x95, 0x9c, 0x3a, 0x95, 0xaa, 0xb6, 0x52, 0x24, 0xf7, 0xad, 0x9c, 0xa1, 0xf4, 0x4e, 0x63, 0xc0, 0x25, 0xa3, 0x26, 0xe9, 0x7d, 0x47, 0x3d, 0x0a, 0xe0, 0x89, 0x44, 0x4c, 0xca, 0x40, 0x96, 0x6b, 0xd2, 0x4d, 0x9c, 0xd3, 0x29, 0x4c, 0xe8, 0xc4, 0x53, 0xad, 0x2c, 0xdd, 0xd6, 0x48, 0xf5, 0x52, 0x13, 0x1c, 0xc8, 0x9d, 0x9f, 0x3b, 0x1b, 0x77, 0x13, 0xbf, 0x2f, 0xeb, 0x63, 0xe3, 0xd8, 0xfa, 0x7d, 0x54, 0xdc, 0x43, 0xe7, 0x0e, 0xea, 0x9f, 0x2c, 0x54, 0x77, 0x69, 0xfc, 0x0a, 0x62, 0xca, 0x65, 0x51, 0x87, 0x70, 0x5e, 0xf4, 0x81, 0x91, 0x7c, 0x3f, 0x79, 0x3b, 0xdb, 0xc5, 0x16, 0x35, 0xf1, 0xcc, 0x41, 0x00, 0xf9, 0x55, 0xc1, 0x48, 0x53, 0xbe, 0x74, 0xa0, 0x6c, 0xe9, 0x0d, 0xaf, 0x91, 0x93, 0xc3, 0x11, 0x1c, 0x25, 0x33, 0x63, 0x9d, 0x59, 0x79, 0xdb, 0x8f, 0x17, 0x5e, 0x4c, 0xee, 0x75, 0xb1, 0x4d, 0xed, 0xb5, 0xe7, 0x29, 0xf4, 0x99, 0x1f, 0x76, 0xb4, 0xe1, 0x47, 0x8f, 0x27, 0xab, 0x71, 0xa8, 0x3c, 0xb6, 0x53, 0xaa, 0x3b, 0xef, 0x90, 0x97, 0x9d, 0x3b, 0xd1, 0xeb, 0xb3, 0x3a, 0x12, 0x5b, 0x44, 0x8a, 0x73, 0xfd, 0xf0, 0x96, 0x65, 0x25, 0x96, 0x35, 0x94, 0x04, 0x07, 0xb1, 0x5c, 0xdd, 0x95, 0x36, 0xd0, 0x35, 0x08, 0xb3, 0x28, 0xa4, 0xe7, 0x1e, 0x53, 0x91, 0x8c, 0x7d, 0xea, 0x81, 0xb1, 0xac, 0xf9, 0x0d, 0x45, 0xe4, 0xa4, 0xf2, 0x1f, 0x73, 0x92, 0x2a, 0x75, 0x0d, 0x67, 0xe2, 0xa8, 0xf6, 0xd7, 0xa7, 0xab, 0xd1, 0x9f, 0xc1, 0xf8, 0x36, 0x68, 0x1e, 0x21, 0x98, 0xe1, 0x65, 0x57, 0x4c, 0x27, 0x82, 0xc9, + 0xcc, 0x85, 0x5b, 0x8e, 0xfe, 0xed, 0x23, 0x4d, 0xa8, 0xa5, 0xbb, 0xb1, 0xd9, 0x9c, 0xff, 0x96, 0x68, 0xb0, 0xf8, 0xad, 0x5a, 0xff, 0xba, 0xf9, 0xc9, 0x2a, 0xcc, 0x8d, 0xc2, 0x41, 0x89, 0x29, 0x83, 0xa2, 0xc3, 0xd0, 0xc5, 0xd2, 0x32, 0x26, 0x74, 0xe9, 0xad, 0xf0, 0x1b, 0xac, 0x29, 0x39, 0x0b, 0x6d, 0x25, 0xe4, 0x01, 0xcc, 0xeb, 0xd2, 0xf2, 0x2f, 0xaf, 0x42, 0xb4, 0x06, 0x64, 0x72, 0x26, 0x56, 0x36, 0xb3, 0x32, 0x31, 0x4a, 0xc2, 0x7c, 0xb8, 0x12, 0x2f, 0x3e, 0xe9, 0x38, 0xf0, 0x13, 0x93, 0x7a, 0xc3, 0x2e, 0xab, 0x9f, 0x90, 0xa5, 0xda, 0xa3, 0x71, 0xaf, 0x34, 0x0b, 0x1a, 0x75, 0x88, 0x16, 0xa3, 0xb3, 0x8f, 0x6e, 0xdb, 0x60, 0x08, 0x4f, 0x30, 0x33, 0xe5, 0x4c, 0xf2, 0x58, 0xcb, 0xef, 0xe6, 0xf7, 0xa8, 0xf2, 0x0c, 0xc1, 0x1a, 0xcb, 0xcd, 0x0f, 0x8f, 0xc0, 0x6a, 0x40, 0x95, 0x18, 0x80, 0x0f, 0x25, 0xe5, 0xb1, 0xf9, 0x91, 0x9c, 0x04, 0x56, 0x04, 0x99, 0x6b, 0xf2, 0x57, 0x03, 0x51, 0x61, 0x0a, 0xff, 0x78, 0xae, 0x23, 0xe3, 0x5a, 0xb5, 0x52, 0xd8, 0xd1, 0xf0, 0x14, 0x80, 0xa2, 0x6b, 0x3e, 0x60, 0x82, 0x70, 0x2d, 0xa6, 0x76, 0xc5, 0x05, 0x0f, 0x75, 0x7c, 0xec, 0xa8, 0x6f, 0x30, 0x24, 0x2f, 0xd2, 0x5b, 0x01, 0x76, 0xfc, 0x38, 0xa7, 0x80, 0xf5, 0x43, 0xfa, 0x1e, 0x3a, 0x16, 0x4e, 0x6f, 0x05, 0xf9, 0x59, 0x03, 0x1a, 0x2b, 0x5b, 0x05, 0x65, 0xa3, 0x48, 0x62, 0x60, 0x60, 0xf9, 0xb5, 0x4b, 0x72, 0x13, 0x69, 0x45, 0x2b, 0xc9, 0xbb, 0x19, 0xad, 0x47, 0xf9, 0x02, 0x9e, 0x54, 0xc5, 0x43, 0xb8, 0x12, 0xe7, 0x13, 0x0e, 0x0e, 0x8e, 0xe4, 0xba, 0xc8, 0xcd, 0x30, 0x0f, 0xfb, 0x76, 0xb1, 0xfa, 0x01, 0x71, 0x70, 0x48, 0x48, 0xd5, 0x94, + 0xdb, 0x37, 0xa9, 0xee, 0xed, 0x05, 0x22, 0xcb, 0x99, 0x05, 0x0a, 0x74, 0x7c, 0xf8, 0x22, 0x9a, 0x57, 0xcc, 0xbf, 0xa3, 0x0e, 0x33, 0x09, 0x57, 0x94, 0x60, 0xbe, 0x16, 0x01, 0x77, 0x40, 0x72, 0x40, 0xb2, 0x83, 0x0b, 0x34, 0xd2, 0x8d, 0x8a, 0x4f, 0x9d, 0xa4, 0x65, 0x85, 0x13, 0x9c, 0x9e, 0xd7, 0x19, 0x74, 0xe5, 0x34, 0xdc, 0xf9, 0xf5, 0xb0, 0xb3, 0xaf, 0x64, 0xad, 0x82, 0x9c, 0x3e, 0xd3, 0x0e, 0x23, 0x6a, 0xef, 0x6f, 0x1d, 0x01, 0xca, 0xa9, 0x3d, 0x8a, 0x8b, 0x8b, 0xa2, 0xf1, 0x6d, 0xed, 0x78, 0x57, 0xd3, 0xa0, 0x8a, 0xbb, 0x6a, 0x1d, 0xcb, 0xfa, 0x83, 0x51, 0x0b, 0xad, 0xc8, 0x70, 0xa5, 0x64, 0xb3, 0xa3, 0x09, 0xba, 0xfb, 0xbb, 0x6e, 0x72, 0x0c, 0xed, 0x32, 0x57, 0xab, 0xa6, 0x6c, 0x9c, 0x62, 0x22, 0xc7, 0xd1, 0x75, 0x93, 0xdd, 0x61, 0x1f, 0x3f, 0xed, 0x7f, 0xcb, 0x40, 0x9e, 0x92, 0x74, 0x67, 0x4d, 0x53, 0xbc, 0x9e, 0x13, 0x8a, 0xa1, 0xc8, 0xf6, 0x3b, 0x8b, 0x94, 0x44, 0x1b, 0xcd, 0x4b, 0x84, 0x74, 0xb1, 0x2a, 0xe8, 0x83, 0x4e, 0xfe, 0xb7, 0x95, 0xec, 0x80, 0xff, 0xef, 0x6a, 0xc8, 0xc6, 0x61, 0x5c, 0x36, 0xb0, 0xb3, 0xba, 0x9c, 0x3d, 0xe5, 0x5d, 0xf1, 0x87, 0x37, 0xa1, 0x5f, 0x5f, 0x8f, 0xc5, 0x16, 0xd1, 0xf7, 0x5d, 0xfe, 0xc0, 0xb8, 0xe5, 0x31, 0x0d, 0x71, 0x5d, 0xab, 0x10, 0x8b, 0xc3, 0x73, 0xb1, 0xf0, 0x76, 0x50, 0x5a, 0xf2, 0xfe, 0xf3, 0xa6, 0x4e, 0x8e, 0xe8, 0x6e, 0xeb, 0x87, 0x0b, 0x53, 0x2e, 0x4f, 0x9b, 0xa3, 0x26, 0x33, 0xe9, 0x2c, 0xb2, 0xb3, 0x32, 0xb6, 0x94, 0x72, 0x25, 0xfd, 0x15, 0xb6, 0x85, 0x7c, 0x80, 0xf1, 0xa6, 0xe3, 0x6f, 0xcb, 0x96, 0xf3, 0xb4, 0x0c, 0xdd, 0xc2, 0x23, 0xb5, 0x31, 0xa4, 0xcb, + 0x49, 0xf3, 0xb3, 0x0d, 0x0c, 0x71, 0x9f, 0x10, 0x28, 0x55, 0x0c, 0x27, 0x42, 0x7c, 0x0e, 0x92, 0xe9, 0x66, 0x34, 0x25, 0xc9, 0x2e, 0x30, 0x62, 0xf3, 0x47, 0x40, 0xf5, 0x24, 0xdd, 0xe8, 0x30, 0xc0, 0x37, 0x37, 0xdd, 0xe1, 0xd6, 0x00, 0x62, 0xa7, 0x53, 0xda, 0x49, 0xf9, 0x90, 0x2f, 0x20, 0xdc, 0x7e, 0x6d, 0xb3, 0xb0, 0x58, 0x3d, 0x65, 0xfe, 0x9f, 0xb0, 0x27, 0xad, 0x0e, 0x9e, 0x43, 0x0f, 0x9a, 0x37, 0x8b, 0x31, 0x05, 0x6a, 0xb1, 0xf8, 0x3f, 0xb0, 0xd3, 0x2a, 0xfc, 0xe5, 0xf4, 0x25, 0x96, 0x0b, 0xc3, 0x96, 0xf0, 0x02, 0x17, 0xcc, 0xdd, 0xe7, 0x17, 0xea, 0x76, 0xcb, 0x21, 0xe2, 0x34, 0x4e, 0xb7, 0xf4, 0x4e, 0x38, 0x3a, 0x69, 0x9a, 0x38, 0x22, 0x82, 0xff, 0x76, 0x25, 0x13, 0xa2, 0x96, 0xe9, 0x0e, 0xb6, 0x7c, 0xe3, 0x70, 0xce, 0x48, 0xf4, 0xd2, 0x06, 0x31, 0xc6, 0x00, 0xd7, 0xe1, 0x72, 0x15, 0xbd, 0xe5, 0xeb, 0x2f, 0xc2, 0x5e, 0xf1, 0x09, 0x3f, 0x1c, 0xb6, 0xcd, 0x81, 0xdb, 0xec, 0xc6, 0x44, 0xbb, 0xe5, 0x07, 0x78, 0x86, 0x9d, 0x0a, 0xb2, 0xc6, 0xdf, 0x1d, 0x57, 0x64, 0x92, 0x14, 0x58, 0xe5, 0x87, 0x34, 0xff, 0xd4, 0xb8, 0xd7, 0xd4, 0xb0, 0x1f, 0xfd, 0x4d, 0x8c, 0xa4, 0xe9, 0x66, 0x50, 0xb1, 0xf0, 0x95, 0xb8, 0x0f, 0x16, 0x2a, 0xec, 0x7f, 0x49, 0x0d, 0xf8, 0x98, 0x2c, 0xc8, 0xdd, 0x0c, 0xd2, 0xa1, 0x2a, 0x91, 0x6f, 0x31, 0x7c, 0x01, 0x48, 0xa6, 0x68, 0x5e, 0x12, 0x36, 0x51, 0xfa, 0x3d, 0xf9, 0x86, 0x9c, 0x2e, 0x3d, 0x90, 0x5d, 0xb5, 0x11, 0x71, 0x0b, 0x68, 0x68, 0x6e, 0xa5, 0xc2, 0x31, 0xe3, 0xf9, 0xc7, 0xa0, 0xb8, 0x92, 0xe1, 0x54, 0x9e, 0xa7, 0x05, 0xf3, 0x0c, 0x57, 0xa6, 0x10, 0xaf, 0x66, 0xff, 0x2f, 0x1d, 0xba, + 0x28, 0x09, 0xa0, 0x80, 0xea, 0x53, 0xbb, 0x9d, 0x2e, 0x73, 0xb6, 0x1b, 0x47, 0x11, 0x67, 0x32, 0xea, 0x83, 0xb3, 0xf1, 0x7b, 0x3b, 0xd3, 0xe1, 0x30, 0xe1, 0x65, 0x41, 0x06, 0x4f, 0x5e, 0xb8, 0xdc, 0xd4, 0x85, 0x48, 0x4d, 0xc8, 0x5a, 0xa6, 0x0f, 0x31, 0x1e, 0xab, 0xa7, 0xf7, 0x72, 0xb7, 0x7d, 0xe6, 0x20, 0xd7, 0x09, 0x84, 0x66, 0x58, 0x8d, 0xfb, 0xc2, 0x4b, 0xee, 0xdc, 0x65, 0x61, 0x47, 0x9f, 0x50, 0x23, 0x8b, 0x13, 0x6f, 0xf6, 0x7f, 0xb6, 0x24, 0x9e, 0xcd, 0xd7, 0xdb, 0xce, 0x28, 0x22, 0xc5, 0x3f, 0xa8, 0x1d, 0x73, 0x49, 0x58, 0x3d, 0xb0, 0x89, 0xae, 0x16, 0x8d, 0xea, 0xc8, 0x97, 0xb3, 0x55, 0x5a, 0x48, 0xda, 0x28, 0xe0, 0x2d, 0xa5, 0x27, 0x96, 0xab, 0xac, 0x3b, 0x0c, 0x97, 0x9e, 0x41, 0xe9, 0x1b, 0xf3, 0x05, 0xd4, 0x77, 0x43, 0xdc, 0x6d, 0x23, 0x11, 0x7b, 0xd0, 0x00, 0x81, 0x04, 0x24, 0xf8, 0xba, 0x0f, 0x34, 0x6f, 0xb1, 0x79, 0xa3, 0x2b, 0x3b, 0xef, 0x28, 0xce, 0x00, 0xe2, 0x4e, 0x2a, 0xb8, 0x07, 0xe3, 0x15, 0x4c, 0x72, 0xc5, 0x96, 0x43, 0x6a, 0xfc, 0xc3, 0xb3, 0x2c, 0x70, 0x6e, 0x87, 0x35, 0x50, 0x7c, 0x59, 0x81, 0x6d, 0x38, 0x3b, 0x83, 0x24, 0x9e, 0x04, 0x9c, 0x5f, 0x5b, 0x12, 0xfb, 0x9c, 0x73, 0x2e, 0x81, 0x3a, 0x38, 0xc1, 0xc3, 0xc4, 0x1d, 0xc6, 0x2e, 0x37, 0xe2, 0xa9, 0x59, 0xc0, 0x91, 0x42, 0x95, 0xad, 0x3e, 0x6b, 0x20, 0xf8, 0xc9, 0x1c, 0xcb, 0xcc, 0x68, 0xbb, 0xa1, 0x20, 0xac, 0x07, 0xf0, 0x40, 0x48, 0x05, 0x65, 0x71, 0x8d, 0x98, 0x6f, 0x11, 0xb5, 0xa7, 0xf3, 0xc2, 0x91, 0x61, 0xd5, 0x08, 0xa9, 0xfb, 0x9d, 0x59, 0x89, 0xb3, 0x0f, 0xc0, 0x40, 0x83, 0x0d, 0x4f, 0x2a, 0x10, 0xa7, 0x8d, 0x8a, 0xae, 0x70, + 0x16, 0xcc, 0x96, 0x5b, 0x51, 0x41, 0x4c, 0x5a, 0x97, 0x7d, 0xd8, 0x6d, 0x15, 0xf1, 0xec, 0x54, 0xd2, 0x19, 0x59, 0xa5, 0xcd, 0x6b, 0x4d, 0xd3, 0x7b, 0x29, 0x96, 0x0d, 0x9f, 0xf1, 0x89, 0x12, 0x5c, 0x90, 0x7e, 0x01, 0xb5, 0xc9, 0xb4, 0xb5, 0xeb, 0x03, 0x97, 0xff, 0x36, 0x14, 0x8f, 0x05, 0x72, 0x61, 0x3f, 0x67, 0x90, 0x30, 0x0a, 0xfb, 0xc7, 0x31, 0x04, 0x22, 0xc1, 0x51, 0x4a, 0xe8, 0xe9, 0xce, 0xec, 0xde, 0x18, 0x03, 0x56, 0x7d, 0xbd, 0x5b, 0x37, 0x8b, 0x6e, 0x7d, 0x4f, 0x10, 0x92, 0x22, 0xa2, 0x9a, 0x27, 0xe6, 0xcc, 0x99, 0x1e, 0x63, 0xbb, 0x42, 0x4f, 0x4f, 0x63, 0x44, 0x1a, 0x58, 0xce, 0x35, 0x27, 0xdb, 0x66, 0x8c, 0xce, 0xba, 0x09, 0xc9, 0x47, 0xa5, 0xde, 0x8b, 0x40, 0x88, 0xd1, 0xa4, 0x38, 0xa3, 0x27, 0xc0, 0x89, 0xfb, 0x3c, 0x1e, 0x9e, 0xbb, 0x38, 0x12, 0xbe, 0x2b, 0x16, 0x23, 0xc3, 0xf3, 0xc7, 0xb8, 0xf8, 0xb4, 0x12, 0xd0, 0x01, 0x72, 0x0c, 0xee, 0x9a, 0x1a, 0x84, 0xb8, 0x08, 0xde, 0xe3, 0xac, 0x4a, 0xf2, 0x16, 0x96, 0xbd, 0xa2, 0x34, 0x91, 0xcd, 0xa5, 0xa8, 0xd3, 0xf6, 0xf6, 0xde, 0xb1, 0xfc, 0xf2, 0x3d, 0x86, 0xfe, 0x00, 0x24, 0xd8, 0x27, 0x66, 0xbe, 0xfb, 0xfd, 0xbc, 0x70, 0xa4, 0x21, 0x1e, 0x7d, 0x5f, 0x38, 0xa6, 0x6c, 0xde, 0xd8, 0x65, 0x78, 0xa5, 0x31, 0xc4, 0x99, 0x15, 0x0e, 0x56, 0x59, 0x27, 0xe0, 0x41, 0xeb, 0x65, 0x76, 0x95, 0x2e, 0x4a, 0xf6, 0xdc, 0xfb, 0x3a, 0x44, 0x9b, 0x50, 0xde, 0x31, 0x3e, 0x64, 0x7c, 0x2c, 0xf4, 0x53, 0x8e, 0xfd, 0x86, 0xd2, 0xc8, 0xa9, 0x79, 0x3d, 0x4e, 0x6c, 0xbb, 0x65, 0xe4, 0xff, 0x62, 0xeb, 0xb9, 0x27, 0x8f, 0x1f, 0xf0, 0xec, 0x1c, 0x1d, 0x0e, 0x11, 0x06, 0xec, 0x21, + 0xc1, 0xae, 0xf5, 0x0d, 0xff, 0xfa, 0xb4, 0x3c, 0x00, 0xe0, 0xf0, 0x5e, 0x70, 0x1d, 0x02, 0x85, 0x80, 0x74, 0x9e, 0xf9, 0x3e, 0x37, 0x55, 0x1d, 0x03, 0x99, 0x18, 0x24, 0xe6, 0x66, 0x67, 0xb2, 0xe0, 0xf3, 0xf9, 0xbd, 0x3d, 0xe6, 0x4b, 0x13, 0xcf, 0xe5, 0x7f, 0x7c, 0xe1, 0x73, 0x07, 0x55, 0x66, 0x74, 0xd3, 0xef, 0x16, 0x21, 0x96, 0xf9, 0x78, 0x24, 0xa8, 0x50, 0xac, 0x05, 0x0e, 0xaf, 0x7a, 0x08, 0xae, 0xea, 0xe1, 0xe9, 0x1f, 0xb4, 0x39, 0x95, 0x31, 0x71, 0x45, 0x98, 0x83, 0xde, 0x38, 0xe6, 0x36, 0xda, 0x82, 0x3b, 0xf4, 0x7b, 0x0c, 0xa1, 0xb4, 0xf7, 0x8d, 0x08, 0x3c, 0x60, 0x5b, 0x48, 0xb0, 0x60, 0x6d, 0x42, 0x01, 0xc7, 0xeb, 0x33, 0x30, 0x1c, 0x96, 0xae, 0xc6, 0xf0, 0xe2, 0x92, 0x27, 0x3e, 0x5a, 0xd9, 0x25, 0x2e, 0x87, 0x49, 0x91, 0x9f, 0xf5, 0xda, 0x39, 0xc6, 0xfa, 0x21, 0x45, 0x7a, 0x5a, 0x61, 0xd7, 0x28, 0xb7, 0x3d, 0x54, 0x98, 0x5a, 0x79, 0xd8, 0x36, 0xda, 0xb9, 0x84, 0x8b, 0x32, 0x5b, 0x31, 0x0d, 0x77, 0x38, 0x1f, 0xc1, 0xd9, 0x20, 0x35, 0x34, 0xd4, 0xe0, 0xa3, 0xa9, 0x1e, 0xdf, 0x98, 0x40, 0xa2, 0x96, 0xf2, 0x40, 0x0f, 0x0c, 0xbd, 0x75, 0xc9, 0x2c, 0x33, 0x7a, 0x09, 0x08, 0x6d, 0x9e, 0x15, 0xb8, 0x93, 0xa7, 0xaf, 0x40, 0x1d, 0x85, 0x44, 0x74, 0x65, 0x7a, 0x78, 0xaf, 0x22, 0x4d, 0x44, 0x09, 0x58, 0x05, 0x39, 0x03, 0xe0, 0xc7, 0x0b, 0x10, 0x2c, 0x18, 0x5a, 0x86, 0xf1, 0xcb, 0x60, 0x60, 0xec, 0x32, 0x32, 0xe1, 0xbd, 0xec, 0x28, 0x31, 0x6b, 0x19, 0xfb, 0x10, 0x40, 0xc5, 0x1f, 0xc0, 0xd3, 0x1d, 0x30, 0x46, 0x07, 0x66, 0xa1, 0xfc, 0x13, 0xef, 0xcd, 0xb3, 0xcb, 0xc7, 0xa8, 0xa6, 0xcc, 0xe6, 0x9a, 0xb8, 0x56, 0x9b, + 0x2a, 0x79, 0x0a, 0x0a, 0x67, 0x00, 0x18, 0x7e, 0xd9, 0xb4, 0xa3, 0xa1, 0xc2, 0xd7, 0xf3, 0xaa, 0x61, 0x19, 0xa4, 0x91, 0xe5, 0xe1, 0x1b, 0x89, 0xb9, 0x87, 0x45, 0xc6, 0xdc, 0x1a, 0x65, 0x3f, 0x90, 0x4f, 0x98, 0x23, 0x00, 0x16, 0x49, 0x2d, 0x6a, 0xa4, 0xc1, 0x86, 0x36, 0x95, 0xe2, 0x2a, 0x55, 0xdc, 0x50, 0x97, 0xf5, 0xf6, 0x63, 0x6b, 0x70, 0x36, 0xe0, 0x52, 0x40, 0x04, 0x57, 0x31, 0x5e, 0x1a, 0xf6, 0xcf, 0xfb, 0xc1, 0xb6, 0x4b, 0x61, 0xdc, 0x11, 0xe5, 0x68, 0x41, 0x3c, 0x58, 0xb0, 0x58, 0x5a, 0xa8, 0xbf, 0x24, 0x3e, 0x54, 0x85, 0x80, 0x1d, 0x90, 0x0d, 0x65, 0xe0, 0x5d, 0xdd, 0x58, 0x0e, 0x35, 0xd1, 0xaf, 0x37, 0x13, 0x5d, 0x5a, 0xb3, 0xfc, 0x3b, 0x88, 0xe0, 0xb5, 0x90, 0x95, 0x46, 0x97, 0x85, 0xfa, 0x07, 0xcf, 0x1f, 0x63, 0x23, 0x2d, 0x59, 0xba, 0x4a, 0xef, 0xbe, 0x62, 0x9f, 0x74, 0x89, 0xa1, 0x77, 0x6a, 0x0c, 0x64, 0xfb, 0xce, 0x8c, 0x96, 0x70, 0x69, 0x54, 0x99, 0x7d, 0xd8, 0x68, 0xcb, 0x1f, 0x16, 0xb4, 0x68, 0xad, 0x3d, 0x94, 0x99, 0x16, 0xd9, 0x97, 0x9e, 0x42, 0xec, 0x39, 0xaf, 0x2d, 0xce, 0xe4, 0xc3, 0x5d, 0x22, 0x21, 0x10, 0xf5, 0xd5, 0x60, 0xfb, 0x7e, 0x25, 0x32, 0x5a, 0x70, 0xe9, 0x22, 0xd3, 0xf0, 0x0c, 0xa9, 0xd9, 0xd8, 0xe1, 0x1c, 0x9b, 0xf1, 0x5a, 0xaf, 0xc2, 0x3e, 0x92, 0x35, 0x5e, 0x2c, 0xbd, 0x77, 0x02, 0x7c, 0x41, 0x9e, 0xbb, 0x7e, 0xf7, 0x66, 0xef, 0xbc, 0x54, 0x91, 0x0d, 0x7c, 0xb7, 0xa0, 0x35, 0x73, 0xe1, 0x5c, 0x88, 0x60, 0xe3, 0x2d, 0x7d, 0xae, 0xa7, 0x6c, 0x95, 0x61, 0xea, 0x2d, 0x08, 0xcf, 0x11, 0xc7, 0xbf, 0xc3, 0x00, 0x2e, 0x5e, 0x86, 0xbf, 0x35, 0x8f, 0xa3, 0xa6, 0xbc, 0x9b, 0x5c, 0x16, + 0xcc, 0x5b, 0x04, 0xca, 0x6b, 0x8f, 0x50, 0xbb, 0x38, 0xef, 0x6a, 0xed, 0x60, 0xc8, 0xd8, 0xe1, 0x3d, 0xde, 0x91, 0x0a, 0xed, 0x9f, 0x53, 0xa7, 0xde, 0x07, 0x40, 0x60, 0xf6, 0xbe, 0xa4, 0x09, 0xa8, 0x71, 0xdb, 0xbe, 0x1f, 0x78, 0x43, 0x4a, 0x2d, 0x5f, 0x92, 0xfb, 0x4d, 0xb4, 0xbd, 0xe2, 0x4e, 0x2d, 0x0d, 0x35, 0x78, 0xd3, 0xc2, 0xaa, 0x73, 0x38, 0xac, 0x31, 0x03, 0x9c, 0x43, 0xb3, 0x61, 0xe5, 0x08, 0x8d, 0xbe, 0xfc, 0x8e, 0x67, 0xf4, 0xb4, 0x02, 0x0f, 0x3c, 0xcf, 0xed, 0x8c, 0x22, 0x47, 0xd7, 0xc4, 0x7e, 0xd8, 0xd7, 0xb1, 0x4e, 0x7d, 0xbd, 0xf3, 0x15, 0x38, 0xa6, 0x2b, 0x66, 0xb5, 0xbb, 0x3a, 0x5c, 0xd3, 0xde, 0x34, 0xe8, 0x5b, 0x6f, 0x2a, 0xec, 0xa0, 0xb6, 0x10, 0x41, 0x1c, 0xab, 0xd7, 0x37, 0x59, 0x62, 0x7d, 0x64, 0xad, 0x34, 0x86, 0x3d, 0x34, 0x40, 0x0d, 0x81, 0xd7, 0x6c, 0x5b, 0x0f, 0x6f, 0x13, 0x4f, 0xd3, 0x8f, 0xed, 0xa0, 0x09, 0xad, 0xea, 0x43, 0x4b, 0xdf, 0x0f, 0xde, 0xf5, 0xad, 0x0e, 0x1e, 0x43, 0xdd, 0x4d, 0x4a, 0x31, 0x1a, 0x31, 0x8f, 0x35, 0x74, 0x80, 0xe3, 0x37, 0x9a, 0x3b, 0x2d, 0xc0, 0x46, 0x4b, 0x51, 0x00, 0x9f, 0x47, 0x51, 0xc1, 0x2f, 0xb1, 0x2c, 0x90, 0x68, 0x22, 0xac, 0xef, 0x59, 0xe4, 0x9d, 0xf4, 0x50, 0xce, 0x06, 0xf9, 0xed, 0x42, 0x07, 0x20, 0x67, 0x3f, 0x5d, 0xb3, 0xc1, 0x0b, 0x68, 0x85, 0xf4, 0xe6, 0x72, 0xcf, 0xf3, 0xca, 0x58, 0x4f, 0x46, 0x15, 0x15, 0xf6, 0x31, 0xad, 0x46, 0xb2, 0x52, 0xbd, 0x76, 0x1c, 0x7f, 0x8c, 0x2a, 0x9c, 0xef, 0x77, 0xa5, 0x49, 0xbd, 0x2c, 0x42, 0x02, 0x24, 0x8f, 0xaf, 0x69, 0x4b, 0x0c, 0x57, 0xc2, 0x28, 0x77, 0xe4, 0x8f, 0x20, 0x96, 0xa4, 0xa3, 0x39, 0x3a, 0xac, + 0xf4, 0xfc, 0x95, 0x58, 0x41, 0x6f, 0x8c, 0x2d, 0xcb, 0x44, 0xb4, 0x1f, 0x01, 0x17, 0x86, 0x4b, 0x95, 0xa6, 0x82, 0xee, 0x0e, 0x50, 0x38, 0x43, 0x9f, 0xaa, 0x85, 0x61, 0x92, 0x11, 0x26, 0x65, 0xe2, 0x69, 0xe1, 0x9c, 0x91, 0xd1, 0x90, 0x16, 0xf1, 0x78, 0xbf, 0x02, 0xef, 0x06, 0x13, 0x35, 0x36, 0xe0, 0x63, 0x1b, 0xc1, 0xab, 0x6f, 0x14, 0xa9, 0xc7, 0x60, 0xf0, 0x56, 0xaf, 0x02, 0x20, 0xde, 0x35, 0x9c, 0x96, 0x81, 0x0d, 0x3a, 0x70, 0x35, 0x2b, 0xc9, 0xb3, 0xf5, 0x37, 0xec, 0xe2, 0x06, 0xcd, 0x1a, 0x52, 0xbf, 0x96, 0x8f, 0xb8, 0xe1, 0x20, 0xd4, 0x25, 0x26, 0x63, 0x43, 0x05, 0x5c, 0x1c, 0xdd, 0x58, 0x48, 0x70, 0xf4, 0x1b, 0x37, 0xd4, 0xd3, 0xe4, 0xff, 0x8a, 0x41, 0x71, 0xda, 0x56, 0x56, 0x59, 0xb5, 0xc6, 0x9c, 0x44, 0x7e, 0x5b, 0x74, 0x7c, 0x89, 0x75, 0xb0, 0xc5, 0x39, 0xfe, 0xa5, 0x51, 0x25, 0x2e, 0xd2, 0x36, 0x52, 0x46, 0x63, 0xcf, 0x74, 0x6c, 0xa9, 0x23, 0x54, 0x46, 0x4e, 0x5e, 0x01, 0x31, 0x8e, 0xa4, 0x95, 0xcb, 0x85, 0x03, 0x54, 0xa3, 0x62, 0xea, 0x44, 0x87, 0xde, 0xb8, 0x98, 0xcf, 0xf3, 0xec, 0x50, 0x92, 0xdc, 0x79, 0x17, 0x12, 0xbd, 0xc5, 0x91, 0xb1, 0x34, 0x82, 0xa7, 0xe6, 0x3f, 0x76, 0x27, 0xc5, 0xb5, 0xfd, 0x7d, 0x90, 0x13, 0x8e, 0x96, 0xef, 0x8e, 0xac, 0xf2, 0x23, 0xf0, 0x24, 0xc9, 0xd0, 0x58, 0xbf, 0xea, 0xb5, 0x98, 0x84, 0x90, 0x02, 0xcf, 0xa8, 0x9b, 0x0d, 0xf2, 0xac, 0x04, 0x25, 0x9b, 0xd3, 0xce, 0xb6, 0xd5, 0x12, 0xe6, 0x08, 0xbf, 0xef, 0x63, 0x2f, 0x66, 0xb1, 0x99, 0xad, 0x0f, 0x82, 0x7a, 0x1b, 0x4e, 0x9d, 0xc2, 0x6e, 0xc9, 0x9c, 0x75, 0xa5, 0xd7, 0xe9, 0x12, 0xde, 0x28, 0xf0, 0xb3, 0x0a, 0x29, 0xa0, + 0x38, 0xaf, 0xfe, 0x97, 0x22, 0x31, 0xec, 0xf3, 0x57, 0xb8, 0x0c, 0x3c, 0x54, 0x95, 0x5b, 0xda, 0x9e, 0x7f, 0xa8, 0xbf, 0x3c, 0xf6, 0x05, 0x4f, 0x03, 0x0b, 0x51, 0xdd, 0x08, 0x42, 0xbc, 0x3f, 0x04, 0x26, 0x07, 0x2e, 0x30, 0xe7, 0xaf, 0x28, 0xb4, 0xa8, 0x74, 0x4b, 0x75, 0xc2, 0x63, 0xf2, 0x2d, 0xba, 0x9d, 0x48, 0x2e, 0x35, 0x90, 0x8e, 0xa3, 0x94, 0x8a, 0x35, 0x1e, 0x7c, 0xcc, 0x9b, 0xfb, 0xc1, 0x1b, 0xaa, 0xb6, 0x47, 0xf1, 0x46, 0x1f, 0xf9, 0xe1, 0xde, 0xed, 0x1a, 0x29, 0xf6, 0xed, 0x79, 0x78, 0xce, 0x96, 0x7c, 0x0b, 0xe6, 0x00, 0x1a, 0x0f, 0xc1, 0xdd, 0x14, 0x68, 0x6a, 0x5a, 0x9e, 0x3b, 0xff, 0x21, 0x20, 0xe0, 0xb5, 0x9b, 0x8a, 0x7f, 0x07, 0x4a, 0xd3, 0x71, 0x4e, 0x89, 0x0e, 0xae, 0x2f, 0x97, 0x57, 0xde, 0xf9, 0x46, 0x6c, 0x6c, 0xd9, 0x7d, 0xfa, 0x0c, 0x3c, 0x1d, 0x46, 0x80, 0x48, 0x22, 0xeb, 0x04, 0x35, 0xdc, 0x16, 0xb9, 0x87, 0x19, 0x85, 0x79, 0xc3, 0x9a, 0x9f, 0x2f, 0x57, 0xb4, 0x1f, 0x5b, 0x01, 0x01, 0xc5, 0xd4, 0x25, 0x2b, 0x21, 0x4d, 0xe7, 0x83, 0x12, 0xa8, 0xbb, 0x28, 0xa1, 0x3b, 0xab, 0x56, 0x55, 0xd3, 0x9a, 0xed, 0x0a, 0x08, 0x18, 0xab, 0xa4, 0x5a, 0xfd, 0x09, 0x47, 0x93, 0x2a, 0x7d, 0xde, 0xe9, 0x4c, 0x52, 0x3c, 0xbb, 0xf7, 0x49, 0xb3, 0x45, 0x24, 0x8d, 0x8f, 0x20, 0x7d, 0x91, 0x35, 0x40, 0xcd, 0xb3, 0x1d, 0xd4, 0xa2, 0xde, 0x10, 0x95, 0xfb, 0x4f, 0x23, 0x6f, 0x93, 0x1d, 0x0c, 0x0d, 0x44, 0x22, 0x09, 0xfd, 0x82, 0xc0, 0x5b, 0xbe, 0xd6, 0xca, 0x3f, 0x05, 0x97, 0x95, 0x2a, 0x28, 0x57, 0xe2, 0xf5, 0x45, 0x74, 0x1c, 0x12, 0xad, 0x06, 0xd8, 0xd0, 0x1e, 0x5e, 0xd4, 0x49, 0x29, 0x27, 0xe5, 0xf7, 0x19, 0xab, + 0xa8, 0x05, 0x2f, 0x38, 0xd6, 0xfc, 0xc7, 0x9b, 0x06, 0x25, 0xe0, 0x44, 0x39, 0x7a, 0x4a, 0x3e, 0x11, 0x08, 0x93, 0x8a, 0x15, 0xa5, 0x8e, 0x48, 0x9e, 0x08, 0x2a, 0x74, 0x65, 0x44, 0x50, 0x94, 0xb1, 0xba, 0x96, 0x71, 0x65, 0x8f, 0xdb, 0x44, 0x9e, 0xf0, 0xe8, 0xbe, 0x76, 0xa2, 0xb1, 0xa5, 0x1f, 0xf6, 0xd4, 0x25, 0xe1, 0x85, 0x2d, 0xc5, 0xbd, 0x93, 0xe6, 0x0c, 0x1d, 0xfe, 0x1b, 0x20, 0x2b, 0xb5, 0x57, 0xe1, 0xb7, 0xbd, 0x2f, 0xd2, 0x74, 0x91, 0x35, 0x23, 0x3e, 0x63, 0x66, 0x85, 0xf7, 0xbd, 0x44, 0x2a, 0x37, 0xd1, 0x0c, 0x9a, 0xe3, 0x33, 0x0b, 0x38, 0x55, 0xca, 0xf2, 0xf4, 0x39, 0x63, 0x7d, 0x67, 0xbd, 0x3c, 0xe5, 0xe8, 0x2f, 0x7f, 0x5b, 0x2b, 0xd8, 0xcd, 0xca, 0x1b, 0x1a, 0x58, 0x29, 0x08, 0x60, 0x86, 0x1a, 0x95, 0x61, 0x91, 0x6f, 0x3a, 0x8c, 0x8e, 0x77, 0x76, 0x03, 0x8a, 0x29, 0x29, 0x70, 0x51, 0xf2, 0x84, 0x86, 0xe5, 0x4c, 0x16, 0x10, 0x93, 0x58, 0xc4, 0x32, 0xff, 0x1e, 0xd9, 0x0b, 0x8f, 0x65, 0x01, 0x52, 0x0e, 0x16, 0x19, 0x1e, 0xf5, 0x89, 0x62, 0x8e, 0x14, 0x3d, 0xbd, 0xcd, 0x06, 0x32, 0x42, 0x37, 0x6e, 0xc7, 0x9f, 0x42, 0xd9, 0xd3, 0x48, 0x08, 0x42, 0x4d, 0x2a, 0xed, 0x34, 0xf4, 0xbb, 0x49, 0x05, 0x0a, 0x68, 0x59, 0xdb, 0x80, 0xec, 0x23, 0x30, 0x24, 0xf9, 0x9b, 0xd7, 0xcb, 0x43, 0x36, 0x7f, 0x96, 0xc1, 0x73, 0x9b, 0x9d, 0xcf, 0x8e, 0xee, 0xb7, 0x61, 0x97, 0xc5, 0xba, 0x82, 0x8f, 0x86, 0x7b, 0xeb, 0xbb, 0xff, 0x9e, 0x28, 0x11, 0xff, 0x49, 0x18, 0x04, 0x96, 0x4b, 0x33, 0x94, 0x5b, 0x4f, 0xfd, 0x37, 0x15, 0x82, 0xdb, 0xd3, 0x6b, 0x61, 0xec, 0x78, 0x61, 0xdb, 0xd3, 0x1a, 0x6d, 0xac, 0x4a, 0x50, 0x69, 0x13, 0x33, + 0x7a, 0xb9, 0xcb, 0x87, 0x31, 0xf6, 0x59, 0x1d, 0x0f, 0xd7, 0x48, 0x8a, 0x4e, 0xe1, 0x82, 0xfb, 0xad, 0x15, 0x77, 0x90, 0x95, 0xc0, 0x4e, 0xa3, 0xf4, 0x24, 0x24, 0xb7, 0x4f, 0xc9, 0x01, 0x43, 0x43, 0xb6, 0x48, 0x94, 0xa1, 0x5d, 0x2c, 0x4f, 0xd4, 0x24, 0xd0, 0x9a, 0xea, 0xbd, 0x41, 0xae, 0x63, 0x75, 0x34, 0x5a, 0x59, 0xae, 0x13, 0x5f, 0x16, 0xad, 0x7a, 0x62, 0x01, 0x7c, 0xfe, 0x4c, 0x11, 0xbe, 0x9a, 0xd0, 0x05, 0xea, 0x63, 0xfe, 0x17, 0x02, 0x8b, 0xcd, 0x36, 0x5d, 0x58, 0xc2, 0x3d, 0xe1, 0x85, 0x18, 0x08, 0xa0, 0x9c, 0xfe, 0x2b, 0x63, 0xe2, 0xc3, 0xea, 0x1c, 0xe3, 0x04, 0x0e, 0x96, 0x2c, 0x6f, 0xc8, 0xd9, 0xd8, 0x95, 0xa2, 0x2b, 0xab, 0x7c, 0xe5, 0xe8, 0x62, 0xc1, 0x3b, 0x02, 0x35, 0xe5, 0x40, 0x5e, 0x7a, 0x14, 0x87, 0x34, 0x45, 0xaa, 0x97, 0xf7, 0xa7, 0xe9, 0xe3, 0x82, 0xc3, 0xc7, 0x1f, 0xa0, 0x2b, 0x78, 0x96, 0xa4, 0x2f, 0x1d, 0x8e, 0x89, 0x46, 0x1c, 0x8c, 0x48, 0x3f, 0x6d, 0x99, 0x1a, 0x34, 0x8d, 0x2e, 0x3e, 0xce, 0xcc, 0x43, 0x05, 0x66, 0x9d, 0x45, 0xde, 0x55, 0x5e, 0x4c, 0x06, 0x24, 0x32, 0xb4, 0x89, 0xd1, 0x99, 0xa4, 0x3f, 0xbb, 0xb1, 0x12, 0x1f, 0xd7, 0x45, 0x48, 0x52, 0xc1, 0x31, 0x24, 0xb2, 0x3d, 0x34, 0x7f, 0x78, 0x0b, 0xcb, 0xc9, 0xe4, 0x71, 0x42, 0xc6, 0xd6, 0xb3, 0x5d, 0x8b, 0xf2, 0x19, 0x4f, 0xca, 0xb2, 0x00, 0x18, 0xc1, 0x26, 0x7b, 0x16, 0xfa, 0xec, 0x57, 0xd4, 0xb8, 0x4d, 0xd9, 0x12, 0x19, 0x7a, 0xd2, 0x43, 0xea, 0x7a, 0xd1, 0x74, 0x88, 0x6c, 0x7c, 0xc8, 0x0c, 0x6f, 0xbe, 0x82, 0x4f, 0x02, 0x4d, 0x2a, 0x1f, 0xbe, 0x9c, 0x12, 0xc0, 0x6c, 0x37, 0xc9, 0xd6, 0x69, 0x95, 0xce, 0x03, 0xdd, 0xfa, 0x62, + 0x65, 0xb4, 0x06, 0xfc, 0x91, 0x11, 0x78, 0xc4, 0x17, 0xe5, 0x18, 0xd1, 0xf2, 0x45, 0xdb, 0x1b, 0xa1, 0xd3, 0x3c, 0xce, 0x10, 0x60, 0xaa, 0x2f, 0x2b, 0x05, 0x5e, 0xb6, 0xaa, 0x82, 0x31, 0x30, 0xa8, 0xe0, 0x25, 0xca, 0x12, 0xd8, 0xf6, 0xc7, 0x82, 0x35, 0xd0, 0x65, 0x10, 0xb8, 0xb2, 0x93, 0x99, 0xc4, 0x7b, 0xf6, 0x3f, 0xe1, 0x7d, 0x59, 0x51, 0xe7, 0xf1, 0x8b, 0x11, 0x18, 0x78, 0x8f, 0x94, 0xba, 0xb9, 0xe2, 0x03, 0xeb, 0x84, 0xf9, 0x62, 0x41, 0x0d, 0x5b, 0xc3, 0xb1, 0x81, 0xdd, 0x23, 0x3e, 0x52, 0xbc, 0x84, 0x8b, 0xa0, 0x4a, 0x2e, 0x11, 0x0e, 0x7a, 0x9d, 0xcb, 0x09, 0xe6, 0xf0, 0xdb, 0x6c, 0x35, 0x82, 0x26, 0xc6, 0xb3, 0x0a, 0xa3, 0x20, 0x91, 0x6b, 0xe4, 0x9e, 0x2a, 0xa0, 0xfd, 0xb6, 0x17, 0xf1, 0x58, 0xfd, 0xae, 0x69, 0xc0, 0x80, 0x30, 0x45, 0x82, 0x18, 0x91, 0x17, 0x9e, 0xbd, 0x1a, 0xf0, 0x05, 0x20, 0x5f, 0x40, 0x3b, 0xc8, 0x53, 0x00, 0x9f, 0x1f, 0x71, 0x20, 0x1f, 0x7c, 0xb5, 0xfd, 0xc1, 0x8d, 0x51, 0xc3, 0x4d, 0x97, 0xf4, 0x26, 0xbb, 0xed, 0x33, 0x5b, 0x09, 0x18, 0x7d, 0x00, 0x16, 0x13, 0x74, 0x53, 0x9a, 0x93, 0xf6, 0xb9, 0x7d, 0x44, 0x0c, 0xfa, 0xf8, 0xaa, 0xa7, 0xc0, 0x6a, 0xbc, 0x2a, 0x09, 0xa7, 0xfa, 0xb9, 0xec, 0x67, 0x0d, 0x22, 0xd5, 0x30, 0xe2, 0x1e, 0x49, 0x5b, 0x19, 0x71, 0x44, 0xc2, 0xca, 0xd6, 0x88, 0x8e, 0xac, 0x49, 0x18, 0x9e, 0x8b, 0x3f, 0x54, 0xa5, 0xee, 0x67, 0xaa, 0x05, 0x8d, 0xf1, 0xcc, 0x10, 0x8e, 0xfb, 0x5b, 0xa6, 0xe7, 0x64, 0x2a, 0xe0, 0xa1, 0x52, 0xcc, 0x99, 0xa2, 0x24, 0xf9, 0x8a, 0xe3, 0xc8, 0x58, 0x08, 0xc2, 0xd7, 0x04, 0x9a, 0xd0, 0x77, 0x68, 0x2b, 0xf4, 0x22, 0x67, 0xe2, 0xd7, 0x6e, + 0xfd, 0xbd, 0xe1, 0x94, 0x11, 0x63, 0x47, 0x74, 0x7f, 0xec, 0x44, 0xdd, 0xb0, 0xef, 0xcc, 0x85, 0xee, 0xb1, 0x1a, 0x05, 0x19, 0x09, 0x42, 0x0b, 0xba, 0x98, 0x9c, 0xf2, 0x4a, 0xad, 0x85, 0xa7, 0x0e, 0x29, 0xb1, 0xae, 0xa2, 0x48, 0x19, 0xfc, 0x30, 0x06, 0x73, 0x0d, 0x8b, 0xbb, 0x55, 0x64, 0xb7, 0x93, 0x56, 0x1d, 0xe4, 0x26, 0x87, 0xa8, 0x31, 0xef, 0xfa, 0x3e, 0x7b, 0xd2, 0x0e, 0x40, 0x3e, 0xfe, 0xcd, 0x67, 0x4b, 0x77, 0x40, 0x71, 0x74, 0xd6, 0x80, 0xba, 0xe8, 0x69, 0xae, 0x01, 0x5e, 0xe0, 0xce, 0x04, 0xc2, 0x22, 0x09, 0x9c, 0xba, 0x7a, 0x01, 0x06, 0x56, 0x45, 0x45, 0x3a, 0x40, 0x63, 0x2a, 0x26, 0x4b, 0x50, 0xdd, 0xc6, 0x53, 0x1c, 0x97, 0x97, 0xd1, 0x2b, 0x79, 0x05, 0x2a, 0xdb, 0x04, 0xb4, 0x31, 0x59, 0xf2, 0x92, 0xea, 0x7c, 0x44, 0x4a, 0x08, 0x67, 0x0a, 0x1e, 0xe1, 0xfa, 0x25, 0xa2, 0xb7, 0xee, 0x58, 0xf9, 0x83, 0xc1, 0xa5, 0xd2, 0x32, 0xfe, 0x59, 0x43, 0xf1, 0x16, 0xb0, 0xe2, 0x69, 0x29, 0xff, 0x6c, 0xd3, 0xb7, 0xc7, 0x26, 0x8a, 0x7d, 0x6c, 0xe6, 0x8c, 0x32, 0x34, 0xd8, 0xf5, 0x45, 0x5f, 0x6b, 0x20, 0xc5, 0x89, 0x8a, 0xe8, 0x4a, 0x7f, 0x4e, 0xb7, 0x48, 0xc5, 0x70, 0xa4, 0x0e, 0x34, 0x1c, 0x91, 0x97, 0x54, 0xd6, 0x00, 0xc8, 0xe6, 0xc6, 0xe6, 0x3c, 0x95, 0x77, 0xc3, 0x5a, 0x67, 0xb3, 0x89, 0x1c, 0x53, 0x45, 0xb3, 0x45, 0x6d, 0xe5, 0x2c, 0x8e, 0xc3, 0x19, 0x47, 0xce, 0x2b, 0xda, 0x23, 0x08, 0xe2, 0x4f, 0xc0, 0x7c, 0x4a, 0x19, 0xc5, 0x05, 0x09, 0xa3, 0x4e, 0x36, 0x06, 0x78, 0x52, 0xc0, 0x12, 0x0a, 0x8d, 0xd7, 0x05, 0x44, 0x98, 0x8a, 0x5e, 0xe2, 0xc9, 0xcf, 0xca, 0x31, 0xe0, 0x46, 0xac, 0x54, 0xa6, 0x0a, 0xd4, 0x46, + 0x4e, 0xfc, 0xc8, 0x0f, 0x48, 0xbe, 0x5d, 0xfe, 0xfa, 0x52, 0x5f, 0x95, 0x2a, 0x84, 0x3e, 0x26, 0x5d, 0xd7, 0xc3, 0x1a, 0xfd, 0xc7, 0x08, 0x0f, 0x4c, 0xa6, 0x25, 0xfc, 0x64, 0xaa, 0x4b, 0x96, 0xf3, 0x59, 0x40, 0xf1, 0x6f, 0xdd, 0x05, 0xb8, 0xdc, 0xcc, 0xf9, 0x88, 0x9c, 0x4d, 0xb8, 0x60, 0x39, 0xfd, 0xa0, 0xa8, 0x05, 0xcc, 0x06, 0xe6, 0xaa, 0x0a, 0x24, 0x7c, 0x9c, 0xc8, 0x86, 0xbd, 0x54, 0x3e, 0x4a, 0xc1, 0x3e, 0xe3, 0xa4, 0xaf, 0x7d, 0xe9, 0x0c, 0xf4, 0x10, 0xa5, 0xbb, 0x19, 0x66, 0xf7, 0xf4, 0xa3, 0x5a, 0xdf, 0x74, 0x75, 0x69, 0x63, 0x31, 0x07, 0xa7, 0x10, 0xac, 0x3b, 0x42, 0x43, 0x60, 0xcb, 0x22, 0x26, 0x02, 0xde, 0x19, 0xc5, 0x40, 0xaa, 0x84, 0x7a, 0xe8, 0xb9, 0x74, 0x6c, 0xf9, 0x00, 0x21, 0xbe, 0xa6, 0x62, 0x70, 0x72, 0x3f, 0x71, 0xe5, 0x6a, 0x39, 0xe0, 0x60, 0x68, 0x4d, 0x24, 0xb3, 0x66, 0x08, 0xa2, 0x4a, 0xf5, 0xf2, 0x05, 0xd7, 0xeb, 0x76, 0x54, 0x89, 0x1e, 0xbe, 0xe3, 0x95, 0xdc, 0x9c, 0x8c, 0xa5, 0x76, 0x94, 0x2b, 0x0c, 0x82, 0x84, 0x15, 0xb1, 0xfd, 0x57, 0x27, 0xa9, 0x89, 0xd2, 0x06, 0xa2, 0xf5, 0x7b, 0x8f, 0xed, 0xc9, 0x64, 0x72, 0x9a, 0x01, 0x6c, 0xc4, 0x8e, 0x51, 0x09, 0x3d, 0x74, 0x56, 0x74, 0x17, 0xf0, 0xdd, 0xc5, 0x11, 0x6d, 0x62, 0x03, 0x42, 0xa7, 0x34, 0xe0, 0x95, 0x67, 0xbb, 0xb7, 0x55, 0x75, 0x99, 0x1f, 0xc3, 0xe2, 0x27, 0xc3, 0xd5, 0x14, 0x49, 0xa0, 0xf6, 0x4f, 0x73, 0x51, 0x89, 0x7a, 0xcd, 0x85, 0x8f, 0x96, 0xfd, 0x69, 0xca, 0x0c, 0x03, 0x58, 0x33, 0x62, 0x44, 0xdb, 0xde, 0x88, 0x96, 0xfc, 0xdc, 0xd8, 0xf7, 0xd2, 0xc2, 0xb6, 0xa5, 0xbb, 0x4e, 0xca, 0x8f, 0x2b, 0xa9, 0xb7, 0xc7, 0x06, 0x7d, + 0xbd, 0x18, 0xb7, 0x69, 0xe6, 0xe2, 0x6a, 0x6c, 0x90, 0x96, 0x1b, 0x5d, 0xda, 0x21, 0x69, 0x0a, 0xfc, 0x3e, 0xc7, 0xcc, 0x71, 0x1d, 0xa0, 0xc6, 0x14, 0x3c, 0xfe, 0x0b, 0x21, 0x47, 0xb1, 0x82, 0x19, 0x59, 0xa0, 0x4e, 0x0a, 0x72, 0xf4, 0xf0, 0xa8, 0x8e, 0x19, 0x36, 0x5a, 0x25, 0xb8, 0xe9, 0xf0, 0xaf, 0xf1, 0xdf, 0x44, 0x4a, 0x8d, 0x87, 0xec, 0xb9, 0x4d, 0x8e, 0xa4, 0x8e, 0xc8, 0x08, 0x70, 0x0b, 0xfc, 0x8b, 0xec, 0x76, 0x86, 0x45, 0x7b, 0x05, 0x52, 0xa7, 0xbc, 0x5c, 0x45, 0x19, 0xcd, 0x4d, 0xd9, 0x1a, 0x6e, 0x00, 0x83, 0x57, 0x05, 0x6c, 0x3c, 0xce, 0xfb, 0x7b, 0xb3, 0xc8, 0x32, 0x24, 0xc4, 0x80, 0x60, 0x1c, 0x72, 0x27, 0xe0, 0xa7, 0xbb, 0x0a, 0xa6, 0xd1, 0x65, 0xab, 0x17, 0xfd, 0x94, 0x68, 0x21, 0xbb, 0x48, 0xe8, 0x64, 0x3c, 0xb7, 0x79, 0x85, 0xe0, 0x98, 0x30, 0xbd, 0x41, 0x9a, 0x58, 0xe4, 0xf4, 0x1b, 0x11, 0xb7, 0xce, 0x93, 0x85, 0x5e, 0x4b, 0x18, 0x3b, 0xa8, 0x26, 0x63, 0x0c, 0xd2, 0x70, 0x10, 0x05, 0x00, 0x31, 0xee, 0xce, 0xeb, 0x1e, 0x97, 0x51, 0x10, 0x64, 0x6b, 0xba, 0x77, 0xec, 0x78, 0x9b, 0x77, 0x77, 0x1d, 0xc3, 0x0c, 0xe4, 0x66, 0xac, 0x8c, 0x7b, 0xad, 0xce, 0xa5, 0xfa, 0x9f, 0x4f, 0x90, 0x41, 0x5e, 0x74, 0xf7, 0xe9, 0x93, 0xde, 0xa3, 0x8f, 0xb8, 0xd2, 0x64, 0x19, 0x20, 0x63, 0x4e, 0x4d, 0xe5, 0xac, 0x90, 0x3b, 0xd3, 0x59, 0xd5, 0x1c, 0x3b, 0xcf, 0xa1, 0x31, 0xec, 0xf0, 0xd3, 0x4a, 0xeb, 0xb2, 0xa7, 0x24, 0x13, 0xc6, 0x17, 0x2b, 0xa4, 0xd2, 0xe0, 0x4d, 0xdc, 0xf1, 0x9f, 0x65, 0x4e, 0x7c, 0xaa, 0x03, 0x9f, 0xc9, 0x61, 0x4d, 0xa1, 0x63, 0x2a, 0x9b, 0x60, 0xd2, 0x5f, 0x28, 0x97, 0xea, 0x24, 0x6d, 0x3d, 0x2b, + 0x71, 0x46, 0xb6, 0xbb, 0xaa, 0x4a, 0xba, 0xf9, 0xa7, 0xf1, 0x95, 0x02, 0xb5, 0x90, 0xf1, 0x60, 0xd5, 0x4f, 0x01, 0x4c, 0xcf, 0x97, 0xd1, 0x91, 0xa6, 0x84, 0x41, 0x6b, 0xad, 0x5d, 0x9b, 0x55, 0xf4, 0x0e, 0xc8, 0x7a, 0xd1, 0x84, 0x2b, 0x22, 0xd0, 0x14, 0x06, 0xa3, 0xc2, 0xe8, 0x9e, 0x58, 0x0c, 0x0c, 0x4f, 0x09, 0x12, 0xb6, 0xc2, 0xba, 0xf8, 0xd9, 0x45, 0x65, 0x67, 0x41, 0x80, 0xf5, 0xd6, 0x56, 0xf3, 0xde, 0xa3, 0xe6, 0x70, 0xb7, 0xe8, 0x09, 0x79, 0xb7, 0xf1, 0x89, 0x1a, 0xf0, 0xf3, 0x9f, 0x5e, 0x7b, 0x8d, 0x3b, 0xc2, 0xe1, 0x8a, 0x1e, 0x06, 0xb7, 0xc6, 0x10, 0x26, 0xc9, 0xf3, 0xaa, 0xbc, 0x0e, 0x47, 0x20, 0x79, 0x18, 0xf3, 0x2d, 0x1c, 0xf0, 0x23, 0xdd, 0xcd, 0x5a, 0xff, 0xb4, 0xc8, 0x4d, 0x7b, 0x3f, 0x9c, 0x37, 0x35, 0x60, 0x46, 0xc6, 0x92, 0xb7, 0xf7, 0xdb, 0x64, 0x65, 0x00, 0x6a, 0xc7, 0xbc, 0x7b, 0x27, 0x1f, 0x3e, 0x16, 0x56, 0x59, 0xb7, 0xb5, 0xbe, 0x11, 0xa7, 0x7d, 0xb6, 0x9c, 0x2f, 0x43, 0x5b, 0x73, 0x68, 0x44, 0xf9, 0x57, 0x98, 0x63, 0x60, 0x41, 0xb7, 0xab, 0x09, 0xe1, 0x3d, 0xae, 0x52, 0x42, 0x5a, 0xa0, 0xbb, 0x89, 0x15, 0x43, 0x94, 0x53, 0x2f, 0xbe, 0x6e, 0x10, 0x51, 0xc6, 0x30, 0xf5, 0xf4, 0x32, 0x5b, 0xe0, 0xe8, 0x26, 0xb7, 0x50, 0x0b, 0xab, 0x97, 0x1e, 0xd0, 0xc3, 0x71, 0x5e, 0x80, 0x02, 0x90, 0x0d, 0x3c, 0xda, 0x17, 0x01, 0x15, 0xc7, 0xc7, 0x0f, 0x35, 0x21, 0xd3, 0xa9, 0xa2, 0xeb, 0xd7, 0x18, 0x37, 0x68, 0xd1, 0xc6, 0x5e, 0x7d, 0xca, 0x39, 0x85, 0xcb, 0xfe, 0x0e, 0x17, 0x5b, 0x46, 0x18, 0xce, 0x80, 0xc0, 0x41, 0xd8, 0x61, 0x5a, 0x27, 0x6f, 0x9f, 0x3b, 0xc2, 0x2e, 0xb2, 0x20, 0x69, 0x55, 0xfc, 0x8c, + 0xbe, 0x25, 0x5b, 0x66, 0xe5, 0x74, 0x6f, 0x03, 0xc5, 0xa3, 0x4b, 0xb9, 0x45, 0xb0, 0xa2, 0x1c, 0x05, 0x92, 0xc9, 0xbc, 0x68, 0x32, 0xaf, 0x64, 0xff, 0x7c, 0xe1, 0xc7, 0xee, 0x1d, 0x43, 0xcb, 0xaf, 0x0b, 0x7a, 0x35, 0xe1, 0x2d, 0x4b, 0xfa, 0xbc, 0x2e, 0x26, 0xbf, 0x04, 0x07, 0x8c, 0xf8, 0x5a, 0x30, 0x95, 0x13, 0xd9, 0xb9, 0xea, 0x7d, 0x7e, 0x9b, 0x64, 0x09, 0xb0, 0x68, 0xc5, 0x62, 0x1d, 0xac, 0xc4, 0x57, 0xcb, 0x8b, 0x3d, 0xe3, 0xc4, 0x1c, 0xe9, 0x9b, 0x6c, 0x4d, 0xf7, 0xa8, 0x59, 0x58, 0xce, 0x93, 0xa5, 0x18, 0x6f, 0xb6, 0x00, 0xce, 0xe0, 0x40, 0xdd, 0x70, 0x8b, 0x07, 0xaa, 0xd0, 0x1a, 0x13, 0xfd, 0xb4, 0xda, 0xcb, 0x6d, 0xdc, 0x83, 0x46, 0x5d, 0x1f, 0x04, 0x4d, 0x59, 0xe9, 0x68, 0xd5, 0xe6, 0xd5, 0x5e, 0x8d, 0x1a, 0x08, 0xde, 0xc6, 0x89, 0x47, 0xfa, 0x24, 0x4b, 0x9e, 0x9e, 0x35, 0x42, 0x39, 0xff, 0x63, 0x95, 0xd0, 0xf2, 0x03, 0x03, 0x24, 0x3b, 0xf3, 0xe2, 0xd4, 0x26, 0x3f, 0xb5, 0xd8, 0xf7, 0x71, 0x07, 0x01, 0x0d, 0xfe, 0x04, 0xc9, 0x95, 0x11, 0x5c, 0x46, 0x4a, 0xc1, 0xa5, 0xcd, 0x92, 0xc3, 0x39, 0xea, 0x6d, 0x5f, 0x75, 0x09, 0x45, 0x77, 0x9e, 0x61, 0x30, 0xfe, 0xb0, 0x20, 0x8d, 0xa7, 0xc2, 0xda, 0x3e, 0xa1, 0xe2, 0xe0, 0x58, 0x82, 0xcb, 0x77, 0xe9, 0x66, 0x58, 0x6a, 0x06, 0x6d, 0xe8, 0x65, 0xff, 0x01, 0xb8, 0x8c, 0xd1, 0x11, 0x5d, 0xa9, 0xb3, 0x58, 0x62, 0x18, 0x74, 0x80, 0x92, 0xeb, 0xdd, 0xf9, 0x97, 0xa0, 0x2c, 0x8f, 0x6a, 0x0c, 0x1b, 0xa3, 0xd6, 0x20, 0x14, 0xab, 0x3e, 0x5a, 0x59, 0xe7, 0x19, 0xb5, 0xcd, 0x50, 0xbe, 0xaa, 0x3d, 0x3b, 0x2a, 0xf9, 0xa9, 0xf1, 0x1b, 0x3f, 0x10, 0xc3, 0x0c, 0xa4, 0x29, 0x29, + 0x4c, 0xc5, 0x21, 0x20, 0xaa, 0xc0, 0x3d, 0xb7, 0x39, 0x73, 0xc4, 0xf6, 0x1a, 0xc0, 0x67, 0x5d, 0xc0, 0x07, 0x5b, 0x0e, 0x53, 0xb7, 0x01, 0x46, 0x2e, 0x95, 0xf2, 0x42, 0xcf, 0x6a, 0x49, 0x2e, 0x82, 0xf8, 0xc8, 0x24, 0xf3, 0x76, 0xa4, 0x7f, 0xf0, 0xbf, 0xf0, 0xbd, 0x25, 0x08, 0x1e, 0xf4, 0x16, 0x39, 0x9d, 0xe6, 0x35, 0xf8, 0xfe, 0xbf, 0x3b, 0xe9, 0xe5, 0x35, 0x33, 0x75, 0xe0, 0x2d, 0x61, 0x2a, 0xb6, 0x01, 0xc6, 0x55, 0x68, 0x10, 0xb5, 0x8f, 0x7b, 0x21, 0x8c, 0x8b, 0x7a, 0x13, 0x8c, 0x82, 0x90, 0x0c, 0x0a, 0x08, 0x3b, 0x64, 0x2a, 0x6c, 0xf1, 0xfc, 0xdb, 0x0c, 0x96, 0xb0, 0xbd, 0x61, 0x01, 0xd2, 0xd9, 0xeb, 0x08, 0x9c, 0xec, 0x00, 0x7b, 0xa7, 0x26, 0x67, 0x45, 0xec, 0x12, 0xbe, 0xd7, 0xfb, 0x0b, 0x9d, 0xa0, 0x7f, 0x78, 0xfa, 0xf6, 0x67, 0xd9, 0x4c, 0x6f, 0xdf, 0xf3, 0xbe, 0x36, 0x2b, 0xa5, 0x3f, 0x90, 0x9c, 0x4e, 0xae, 0x35, 0x49, 0xc2, 0xfb, 0xd3, 0x9c, 0x88, 0xbf, 0xa3, 0x5e, 0x72, 0x4e, 0xff, 0xee, 0x53, 0xd9, 0xc8, 0xf2, 0x7b, 0x3b, 0xf0, 0xca, 0x5c, 0x71, 0xfd, 0x33, 0x40, 0xdb, 0x88, 0x85, 0xed, 0x97, 0x18, 0x4c, 0x58, 0x57, 0xa2, 0x90, 0x1a, 0x18, 0x6c, 0x6f, 0x4c, 0x52, 0x81, 0x9b, 0x14, 0xa8, 0x26, 0x9c, 0x0a, 0x6d, 0x24, 0x5c, 0x8c, 0xc2, 0x53, 0x31, 0x70, 0x5f, 0xa0, 0x00, 0x47, 0xcc, 0xda, 0x28, 0x10, 0xc0, 0xa9, 0x7d, 0x04, 0xef, 0xdd, 0x17, 0x47, 0x4f, 0x80, 0xc0, 0x88, 0xa3, 0xf5, 0xd4, 0x00, 0xde, 0x79, 0x2c, 0xa1, 0x0a, 0x46, 0xcf, 0x23, 0xad, 0x31, 0xaf, 0x65, 0x6f, 0xca, 0x98, 0x67, 0xeb, 0x57, 0x74, 0x24, 0xd1, 0xa9, 0xe7, 0x8d, 0x08, 0x5a, 0x38, 0x25, 0x70, 0x2a, 0xc5, 0x81, 0xa2, 0x56, 0x00, + 0x5c, 0x54, 0x68, 0x8e, 0x0d, 0xcb, 0x1a, 0x92, 0x75, 0x87, 0x56, 0x07, 0xbd, 0xa5, 0xbd, 0xe8, 0x80, 0x25, 0xfd, 0x23, 0xf0, 0x5e, 0x09, 0x88, 0x2a, 0x2f, 0xaf, 0x7d, 0x6a, 0x7c, 0x1f, 0x01, 0x75, 0xe0, 0x49, 0x67, 0x46, 0x5c, 0xe1, 0xa6, 0x47, 0xf2, 0x66, 0x46, 0x04, 0xdc, 0x4f, 0x76, 0xec, 0xe5, 0x4e, 0xa7, 0x33, 0xe8, 0x4e, 0xb6, 0x59, 0xf8, 0x09, 0x1f, 0x28, 0x7c, 0x08, 0x67, 0xc0, 0xb6, 0x10, 0xeb, 0x65, 0x4d, 0xed, 0xab, 0x53, 0xf7, 0x58, 0xb7, 0xbb, 0xc8, 0xc5, 0xa0, 0xd5, 0xae, 0xbc, 0x11, 0xf8, 0x26, 0x2d, 0x5c, 0x61, 0x7f, 0xe9, 0x70, 0x6a, 0x55, 0x3b, 0xb9, 0x7d, 0xde, 0xa0, 0xe9, 0xf3, 0x7b, 0x22, 0x5f, 0x6a, 0x55, 0xd0, 0x6f, 0x71, 0x46, 0x25, 0x2c, 0x8b, 0x3e, 0xa3, 0x9a, 0xd1, 0xdb, 0xde, 0x80, 0xd9, 0x93, 0xee, 0x19, 0x89, 0xcf, 0x90, 0xbb, 0xae, 0xb0, 0x2e, 0x0e, 0x7f, 0xd7, 0xdf, 0xa2, 0x91, 0x78, 0x98, 0xc4, 0x51, 0xdf, 0x81, 0x2d, 0x0d, 0x55, 0xed, 0xcb, 0x56, 0xe7, 0xa7, 0xb9, 0x2a, 0xd9, 0x71, 0x83, 0x61, 0x1e, 0x9f, 0xad, 0x23, 0x7b, 0x85, 0xc9, 0xc8, 0x1c, 0x8e, 0xf8, 0xb5, 0x32, 0xfb, 0x0a, 0xab, 0xc3, 0x5b, 0xa1, 0x52, 0x3a, 0x56, 0x27, 0x4c, 0xc4, 0xc4, 0xd7, 0x22, 0x24, 0x9a, 0x98, 0x76, 0x6b, 0x79, 0x73, 0x40, 0x2e, 0x51, 0x68, 0x3f, 0x7c, 0x8d, 0x73, 0xd7, 0x1d, 0xce, 0x57, 0x17, 0xc6, 0x4a, 0xf9, 0x31, 0xb5, 0x2a, 0x44, 0x38, 0x6f, 0xfc, 0x24, 0x2d, 0x65, 0x89, 0x0b, 0xd7, 0xe9, 0x6d, 0xc6, 0xe2, 0x3c, 0x69, 0xf5, 0x13, 0xcf, 0x46, 0x73, 0xd1, 0xb3, 0x85, 0xad, 0x4a, 0x82, 0x74, 0xa2, 0x1c, 0xdb, 0xa9, 0x6d, 0x6a, 0x8f, 0xc7, 0xa0, 0xcd, 0xe7, 0x0b, 0xec, 0xd9, 0xf2, 0x17, 0x13, + 0x8b, 0x4c, 0xe7, 0x7f, 0x7a, 0xaf, 0x8d, 0x94, 0x79, 0x66, 0x9f, 0x2d, 0x63, 0x29, 0xf0, 0xfe, 0xea, 0x01, 0x3e, 0xed, 0x26, 0x4b, 0x8b, 0x57, 0x8e, 0x50, 0x95, 0xec, 0x7c, 0x97, 0xf8, 0x74, 0xef, 0x6d, 0xe0, 0x43, 0x92, 0x8c, 0xd9, 0x6f, 0xac, 0x0c, 0x77, 0xec, 0xcd, 0x8a, 0x49, 0x93, 0x37, 0xa9, 0x0f, 0x49, 0x9f, 0xe7, 0x7b, 0x53, 0x40, 0x30, 0x21, 0x00, 0x2b, 0x89, 0xbf, 0x5e, 0x60, 0xa0, 0xbc, 0x03, 0xe2, 0x93, 0x6c, 0x78, 0xaa, 0xe9, 0x67, 0x62, 0x73, 0xf1, 0xbf, 0x99, 0x64, 0x9c, 0x3a, 0x4c, 0x27, 0x14, 0x60, 0xa6, 0xa4, 0x66, 0x88, 0x0a, 0x19, 0x07, 0xea, 0x31, 0x33, 0xb9, 0xf6, 0x6d, 0x85, 0x3d, 0x30, 0x31, 0xc6, 0x7f, 0xaa, 0x30, 0x5c, 0xe2, 0x5d, 0x9a, 0x6c, 0x13, 0xe3, 0x83, 0x41, 0xa3, 0xe6, 0xe8, 0x15, 0xf0, 0x82, 0x14, 0xbf, 0x2c, 0x1e, 0x3b, 0x25, 0xad, 0x11, 0x4a, 0xd3, 0x71, 0x5a, 0x6e, 0x2e, 0x43, 0x35, 0x7a, 0x78, 0x0f, 0x47, 0xba, 0x67, 0xe3, 0xd1, 0x56, 0x7a, 0x6c, 0x17, 0xe9, 0xde, 0xdb, 0x3b, 0xeb, 0x28, 0x6e, 0x1b, 0x37, 0xb1, 0x3c, 0xd6, 0x29, 0xaa, 0x06, 0x61, 0x25, 0x0e, 0x52, 0x38, 0x7c, 0x73, 0x57, 0x19, 0x2c, 0x38, 0xee, 0x18, 0x4f, 0x75, 0xda, 0xbf, 0x79, 0x80, 0x5b, 0x2d, 0xfa, 0x5d, 0x97, 0xb6, 0xe0, 0x83, 0x8a, 0x44, 0x47, 0x18, 0x80, 0xc9, 0x60, 0xee, 0x9d, 0x79, 0xd3, 0xd6, 0xfd, 0x9d, 0x27, 0xfb, 0xad, 0x35, 0x39, 0x90, 0x7e, 0x91, 0xd0, 0xe7, 0x67, 0x57, 0x81, 0xea, 0x6b, 0x8a, 0xe3, 0x1f, 0x8b, 0xfe, 0x3e, 0x8c, 0xb8, 0x19, 0x70, 0xdb, 0x3b, 0x29, 0x16, 0xbd, 0xbd, 0xe3, 0xa8, 0xcf, 0x72, 0x52, 0xa6, 0x22, 0xde, 0x68, 0x01, 0x6d, 0x09, 0xed, 0xc8, 0x4c, 0x24, 0x0f, 0xed, + 0x34, 0xac, 0xc9, 0xc7, 0xad, 0x2c, 0x4a, 0x67, 0xe5, 0x9b, 0x58, 0x26, 0x82, 0xe8, 0x5a, 0x7b, 0x3b, 0x8c, 0x20, 0xf3, 0x86, 0x37, 0x9a, 0xc6, 0x10, 0x37, 0x6f, 0x2d, 0xa0, 0x4f, 0x7d, 0xb4, 0x02, 0xf3, 0x49, 0xd0, 0x78, 0xb6, 0x61, 0xe9, 0x86, 0x79, 0xd2, 0x50, 0x06, 0xe5, 0xfa, 0x48, 0x5e, 0x93, 0x3d, 0xbb, 0xe9, 0x82, 0x03, 0xdc, 0xb4, 0xdb, 0x3a, 0x69, 0xe1, 0x49, 0x46, 0xba, 0x3d, 0xd6, 0xf6, 0xf8, 0xdc, 0x79, 0x48, 0xe7, 0x4f, 0x97, 0x66, 0xe9, 0x65, 0xc3, 0x90, 0x86, 0x1b, 0x5a, 0x87, 0x28, 0x81, 0x7c, 0x0b, 0x8f, 0xf4, 0x6a, 0x70, 0xf3, 0x76, 0x97, 0xa0, 0xa2, 0x65, 0xdc, 0x49, 0xbd, 0x64, 0x52, 0xd1, 0x09, 0x40, 0x7e, 0x4d, 0xbb, 0x19, 0xc4, 0x71, 0x9c, 0xa9, 0xb8, 0x95, 0xb0, 0x83, 0x82, 0x56, 0x8b, 0xf1, 0x4a, 0x02, 0x66, 0x72, 0x2f, 0x57, 0x80, 0x8c, 0x42, 0x38, 0xa2, 0xd3, 0x6d, 0x9a, 0x8b, 0x6e, 0xcc, 0xa1, 0x66, 0x5e, 0x10, 0x9a, 0xfa, 0xeb, 0x75, 0x72, 0x65, 0xa0, 0xa4, 0x3d, 0xb7, 0x24, 0x6a, 0xd0, 0x3a, 0x3d, 0x98, 0x47, 0x01, 0x7a, 0x64, 0x13, 0x76, 0xfc, 0x15, 0xd7, 0xa6, 0x70, 0xf1, 0xa1, 0xa2, 0x75, 0x78, 0x48, 0xd7, 0xef, 0xad, 0xfa, 0xa5, 0xff, 0x83, 0xc6, 0x99, 0x8b, 0x35, 0xf1, 0x24, 0xe0, 0x5f, 0x1f, 0x7e, 0xe1, 0xa5, 0xca, 0xc2, 0x70, 0x7a, 0x20, 0x5a, 0xd0, 0xc0, 0x80, 0x45, 0xcf, 0x09, 0xf6, 0x82, 0x59, 0x99, 0x0d, 0x5d, 0xe3, 0xeb, 0xb4, 0x58, 0x40, 0xa9, 0x84, 0xc4, 0x00, 0x67, 0x12, 0x90, 0xf2, 0xfe, 0x5b, 0x3c, 0x1e, 0xbb, 0xc7, 0xff, 0xb1, 0x87, 0x90, 0xdb, 0xff, 0xd3, 0x76, 0xea, 0xf4, 0xd4, 0x07, 0x99, 0xb7, 0x72, 0x5e, 0xd7, 0xba, 0xf4, 0xd3, 0xd7, 0xb7, 0x9b, 0xaa, 0x9d, + 0xb0, 0x94, 0x8d, 0x4b, 0xba, 0x7a, 0x79, 0xe2, 0xb6, 0x88, 0x1e, 0x40, 0x13, 0x87, 0x9d, 0xa4, 0x95, 0xe4, 0x47, 0x13, 0x8e, 0x78, 0x3e, 0x80, 0x3e, 0xca, 0xe4, 0x3b, 0x84, 0xd2, 0x89, 0x95, 0xfb, 0x3c, 0x9d, 0x08, 0xbf, 0x01, 0xe4, 0x39, 0x05, 0x62, 0xb1, 0xa7, 0x5e, 0xea, 0x59, 0x1a, 0x73, 0x12, 0x40, 0x9e, 0x3f, 0x6a, 0x4b, 0xa0, 0xf9, 0x74, 0x76, 0x22, 0x68, 0x12, 0xd5, 0x26, 0x72, 0xa5, 0x7d, 0xd1, 0x86, 0xfb, 0xf0, 0x27, 0x60, 0xbe, 0x7b, 0xfd, 0xf0, 0x94, 0x82, 0xf3, 0x91, 0xe3, 0x46, 0xe3, 0xdf, 0xad, 0xca, 0xcf, 0x56, 0x9f, 0x2b, 0xad, 0xcd, 0xca, 0xc7, 0x35, 0x73, 0xa7, 0xe9, 0xf0, 0x8a, 0x0b, 0x2f, 0x5b, 0xcf, 0x20, 0xef, 0x60, 0xd3, 0x18, 0x48, 0x84, 0xaf, 0xa7, 0xd9, 0x34, 0x17, 0x57, 0xc7, 0x1e, 0x15, 0x88, 0x8a, 0x24, 0x45, 0x19, 0xea, 0x33, 0xe1, 0x37, 0xbc, 0xce, 0xfe, 0x3f, 0x51, 0x36, 0x6c, 0xac, 0xce, 0xb8, 0x30, 0x17, 0x2e, 0xb8, 0x19, 0xa6, 0xec, 0xf9, 0xfc, 0x8f, 0x86, 0x76, 0xf5, 0x32, 0x42, 0xcd, 0x9d, 0x6c, 0x8c, 0x9c, 0x4d, 0x76, 0x91, 0xa6, 0x56, 0x23, 0x62, 0x28, 0x06, 0x0b, 0x71, 0x9d, 0xa1, 0x72, 0xa2, 0xb6, 0x7a, 0x5c, 0x2b, 0x5d, 0x7d, 0x18, 0x57, 0xb3, 0x2a, 0xc7, 0xd1, 0xfc, 0xee, 0x75, 0xce, 0xac, 0xae, 0x16, 0x1e, 0xeb, 0x37, 0x04, 0x3b, 0xb4, 0xf8, 0x32, 0x4e, 0x66, 0x7a, 0xd9, 0x53, 0x55, 0x10, 0x11, 0xaf, 0xf7, 0xba, 0x51, 0x4b, 0xd5, 0xb1, 0xe3, 0x3b, 0x99, 0x95, 0xf5, 0x86, 0x79, 0x94, 0xe0, 0xb4, 0xe0, 0xf0, 0x81, 0x71, 0x52, 0x6a, 0x05, 0x9e, 0x64, 0xbb, 0x09, 0x99, 0x1e, 0x20, 0x65, 0x4a, 0x41, 0x52, 0x95, 0xe8, 0x04, 0x42, 0xe2, 0x0b, 0xce, 0xa8, 0x7d, 0x8a, 0xff, + 0xd3, 0x45, 0x28, 0x7a, 0xd4, 0xc6, 0xdd, 0x36, 0xda, 0xde, 0x8d, 0x74, 0x4f, 0x29, 0x9d, 0xed, 0xf0, 0xe2, 0xb3, 0x19, 0xa0, 0x50, 0xd3, 0x54, 0x24, 0x4c, 0x69, 0x6f, 0xb0, 0x3c, 0xef, 0x39, 0x3e, 0x92, 0x10, 0x0e, 0x4c, 0x6e, 0xc9, 0xe2, 0x0b, 0x7f, 0x95, 0xc6, 0xe6, 0x52, 0xfc, 0x89, 0x56, 0xfe, 0x8e, 0x7b, 0x54, 0x66, 0xbb, 0xeb, 0x22, 0x12, 0x94, 0xd0, 0x10, 0x3b, 0x57, 0x6e, 0x62, 0x03, 0xa5, 0xac, 0x1a, 0xbf, 0xb6, 0x17, 0xba, 0xff, 0xc5, 0x6f, 0x67, 0x76, 0x69, 0x14, 0xd7, 0xe2, 0x8f, 0x9a, 0xa3, 0xb6, 0x49, 0x96, 0x58, 0x30, 0xa1, 0x6c, 0x80, 0xa1, 0xc4, 0xdd, 0x3f, 0x02, 0x0e, 0x7e, 0x46, 0x97, 0xf1, 0x17, 0x6a, 0xed, 0xde, 0x9b, 0x86, 0x11, 0x7d, 0xd2, 0x47, 0xb1, 0xc2, 0xf0, 0xcf, 0xb4, 0x9e, 0x1b, 0x77, 0x16, 0x3d, 0xcf, 0x01, 0x6b, 0x46, 0x3e, 0x08, 0x4a, 0xd5, 0x28, 0x31, 0x79, 0xc4, 0x3e, 0x4b, 0xb9, 0xd5, 0x57, 0x35, 0x69, 0xbe, 0x8c, 0x81, 0x36, 0x4c, 0x19, 0x30, 0x56, 0xb4, 0x5b, 0xfe, 0xe0, 0x93, 0x05, 0x5b, 0x2a, 0xf5, 0xed, 0x1e, 0xfe, 0x37, 0x44, 0x73, 0x05, 0xd9, 0x85, 0x0e, 0xd7, 0x48, 0x88, 0x40, 0xb4, 0xdd, 0xfb, 0x02, 0x19, 0x1b, 0x3b, 0x8f, 0xad, 0xfb, 0xf9, 0xec, 0x2a, 0x76, 0xb6, 0xb5, 0x49, 0xbc, 0x71, 0x24, 0x22, 0x4a, 0xf1, 0xee, 0x2b, 0x51, 0x55, 0x5c, 0x3a, 0x45, 0x66, 0x94, 0x41, 0xb0, 0x29, 0x98, 0x24, 0x06, 0x0c, 0x71, 0xde, 0xd0, 0xe9, 0xeb, 0x12, 0x9e, 0xc3, 0x94, 0x84, 0x6d, 0xc0, 0x47, 0x4c, 0xb1, 0x79, 0x82, 0xe5, 0x1b, 0xc5, 0xb3, 0x3b, 0xa8, 0xa2, 0x21, 0x93, 0xf3, 0x19, 0x99, 0x33, 0x7a, 0xad, 0x2d, 0xba, 0xc3, 0x01, 0x0b, 0xc0, 0x24, 0x25, 0xff, 0x84, 0x4e, 0xeb, + 0x2c, 0xae, 0xd9, 0x46, 0x45, 0x31, 0xaf, 0xab, 0x42, 0xd4, 0xf0, 0x88, 0xa1, 0x24, 0x23, 0x66, 0x1b, 0x2c, 0x49, 0x7c, 0x78, 0x6c, 0x9c, 0xba, 0xa1, 0x2b, 0x2f, 0x0d, 0xfb, 0x9f, 0x20, 0x9f, 0xe7, 0x7f, 0xdf, 0xf6, 0xf3, 0x7d, 0x81, 0xdc, 0x56, 0x43, 0xca, 0x70, 0x5f, 0xce, 0xd0, 0x7c, 0xf0, 0xa2, 0xbe, 0x3b, 0x72, 0xc9, 0x4c, 0xfc, 0xf3, 0xdc, 0x0d, 0x69, 0x04, 0x7d, 0x7d, 0xd2, 0x8b, 0x27, 0x96, 0xe3, 0x48, 0x7b, 0xb6, 0x4b, 0x03, 0xe5, 0xfd, 0xad, 0x4b, 0x8c, 0x88, 0x7b, 0x44, 0x8f, 0x1b, 0x05, 0xab, 0x1a, 0x56, 0xfc, 0xd2, 0xac, 0xba, 0x8f, 0x06, 0xdb, 0x99, 0xed, 0x7c, 0x61, 0x9d, 0xbb, 0x6e, 0xb2, 0x31, 0x29, 0xc4, 0xfb, 0xdc, 0x4b, 0xa2, 0xfc, 0x25, 0x7d, 0xe0, 0xd5, 0x4f, 0x14, 0xa0, 0xc3, 0x63, 0xa2, 0xa4, 0x3d, 0x46, 0xd0, 0x28, 0x36, 0x9e, 0x69, 0xc3, 0x57, 0xf1, 0x8f, 0xe2, 0x53, 0x0f, 0x65, 0x14, 0xe5, 0x5c, 0xcd, 0x41, 0xb5, 0x71, 0xfc, 0x12, 0xc1, 0x4a, 0x91, 0x57, 0x7a, 0x9d, 0x02, 0xd3, 0x70, 0x23, 0x5e, 0xab, 0x49, 0x1d, 0x26, 0xc8, 0x4a, 0x09, 0xb9, 0xf4, 0x6a, 0x1c, 0x6b, 0x6c, 0x5d, 0x43, 0x63, 0x74, 0x3f, 0x18, 0x69, 0x35, 0x02, 0xda, 0xb7, 0xe7, 0x73, 0xed, 0x1b, 0xfd, 0x85, 0xa0, 0x41, 0xce, 0x93, 0xe2, 0x9c, 0x81, 0x02, 0x17, 0xe0, 0xdd, 0x58, 0xa9, 0xb3, 0x36, 0x72, 0x05, 0x56, 0x6e, 0xf8, 0x99, 0x32, 0x19, 0x2f, 0xfa, 0xa6, 0x91, 0x96, 0xee, 0x19, 0x63, 0x90, 0x85, 0xc2, 0xd6, 0x87, 0x1b, 0x37, 0x25, 0xd2, 0x42, 0xd9, 0x38, 0x8e, 0xb5, 0x7d, 0x47, 0x44, 0xde, 0x25, 0x67, 0x71, 0x1b, 0x12, 0xb5, 0x80, 0x1c, 0x0e, 0x41, 0xa7, 0x6c, 0x2c, 0x7f, 0x23, 0x12, 0x19, 0x3c, 0x5d, 0xed, 0x9f, + 0x10, 0x1e, 0x81, 0xf9, 0x69, 0xf7, 0x20, 0x77, 0x4e, 0x2b, 0x17, 0xcc, 0xc5, 0x14, 0x17, 0x4d, 0x12, 0xdd, 0x6d, 0x94, 0xee, 0x55, 0x30, 0x26, 0xb6, 0xc3, 0x99, 0xb9, 0x4a, 0xd2, 0x6e, 0x7d, 0xef, 0x45, 0x68, 0x7a, 0xcd, 0x65, 0x86, 0xdb, 0x47, 0x2c, 0xd3, 0xef, 0x6e, 0x66, 0x5b, 0xde, 0xb9, 0xe8, 0x24, 0x1d, 0xf6, 0xc5, 0x90, 0x87, 0xaa, 0xc3, 0x99, 0x99, 0x67, 0xd2, 0xaf, 0xfa, 0x49, 0x63, 0x79, 0x6e, 0x50, 0xef, 0xaa, 0x04, 0xec, 0xe0, 0xf2, 0x11, 0x22, 0x08, 0xd2, 0x27, 0x83, 0x12, 0xee, 0x2e, 0x9d, 0x43, 0xee, 0xd4, 0x0d, 0x76, 0xb4, 0xf3, 0xc0, 0x64, 0x4b, 0x86, 0x9f, 0x12, 0xfd, 0xf7, 0xac, 0x52, 0x45, 0x77, 0x88, 0x8f, 0x12, 0x9e, 0x75, 0x8f, 0x62, 0xe8, 0x3d, 0xeb, 0x6c, 0x1a, 0x56, 0xa9, 0x6a, 0x2e, 0x7d, 0x71, 0x9a, 0xc2, 0x88, 0xa5, 0x1a, 0xca, 0x79, 0x1c, 0x10, 0x79, 0x26, 0xd1, 0x2b, 0xe7, 0xec, 0x85, 0xa2, 0x3b, 0x11, 0xb5, 0xf4, 0x3c, 0x52, 0xa2, 0x92, 0xf2, 0xf4, 0x22, 0x91, 0xe5, 0x32, 0x13, 0x9b, 0x69, 0x85, 0x4b, 0x5e, 0x70, 0xe8, 0x22, 0xa2, 0x06, 0x75, 0x5a, 0x01, 0x19, 0x83, 0xac, 0xe0, 0x30, 0x6e, 0x29, 0x94, 0x26, 0xdd, 0x4a, 0x83, 0x0a, 0x54, 0xc3, 0xa8, 0x9c, 0xd4, 0x78, 0x7a, 0x05, 0x67, 0x00, 0xdc, 0x4b, 0x37, 0x81, 0x7d, 0xe8, 0x11, 0xff, 0xba, 0xdb, 0xbc, 0x73, 0x8c, 0x0e, 0x3f, 0xd1, 0x4e, 0x04, 0xd9, 0x5e, 0x8a, 0x0f, 0x6e, 0xce, 0xb5, 0x7f, 0x8c, 0x52, 0x43, 0x85, 0xf1, 0xbf, 0xe9, 0x5b, 0xaa, 0x92, 0x69, 0xcc, 0x02, 0xae, 0xd9, 0x96, 0xe6, 0x5c, 0x80, 0x89, 0xe1, 0x0d, 0x4a, 0xe4, 0xa8, 0x94, 0x7d, 0x8e, 0x6e, 0x53, 0x68, 0x2c, 0xbd, 0x83, 0x1e, 0xbb, 0xaa, 0xc4, 0x42, 0xf4, + 0xc5, 0x2a, 0x49, 0x97, 0x0c, 0x96, 0xf0, 0xac, 0x0e, 0xd4, 0xcf, 0x74, 0x8f, 0xcf, 0xab, 0x5f, 0x48, 0xcb, 0x3a, 0x82, 0x1c, 0xec, 0x24, 0x5e, 0x75, 0xed, 0x58, 0xdd, 0xd6, 0x16, 0x45, 0x32, 0x43, 0xf1, 0x71, 0x87, 0xa1, 0xb8, 0x7f, 0x36, 0x36, 0x29, 0x52, 0x42, 0xd7, 0x22, 0xe6, 0xd9, 0xf3, 0xf0, 0xf0, 0x28, 0x3f, 0x76, 0xd7, 0xe9, 0xcb, 0xd3, 0x31, 0xf8, 0x3e, 0x9f, 0x40, 0x67, 0x5d, 0x61, 0x38, 0x74, 0x6f, 0x3e, 0x35, 0x7d, 0x66, 0xa7, 0xac, 0x5c, 0x03, 0x03, 0x53, 0xf8, 0xc3, 0x73, 0x15, 0xcd, 0x70, 0x4f, 0xbc, 0x3b, 0x98, 0xf3, 0x65, 0xd3, 0xe3, 0xde, 0x4c, 0x5f, 0x41, 0xe7, 0x9a, 0x47, 0x3e, 0x11, 0x16, 0x99, 0xc3, 0x8d, 0xc0, 0x63, 0x1e, 0x05, 0xb2, 0x38, 0xb5, 0xdb, 0x63, 0x40, 0x5f, 0xbe, 0xb8, 0xc8, 0xdb, 0x44, 0xb5, 0x1d, 0xb0, 0x71, 0x53, 0x3c, 0xd4, 0x74, 0x8d, 0xfa, 0x44, 0x64, 0x6d, 0xf5, 0xd4, 0x68, 0xa7, 0x2f, 0x64, 0xb2, 0x82, 0x91, 0xac, 0x2e, 0xea, 0x60, 0x9d, 0x4a, 0xac, 0x32, 0x7c, 0xab, 0xa1, 0xdd, 0x8b, 0x31, 0xaa, 0x3a, 0x47, 0xb2, 0x09, 0x19, 0xa1, 0x51, 0x2c, 0xbc, 0xe4, 0x80, 0x3b, 0xce, 0xf1, 0x47, 0xb1, 0x86, 0x5f, 0x45, 0xd2, 0x51, 0x4a, 0xe6, 0x1c, 0x67, 0x6c, 0x9e, 0x31, 0xe2, 0x14, 0xa8, 0xd1, 0x4d, 0xbd, 0x89, 0x6c, 0x4a, 0x27, 0x41, 0x74, 0xd3, 0x39, 0xef, 0xc6, 0xfe, 0xdf, 0xe7, 0x90, 0x5d, 0x5c, 0xf2, 0xbb, 0x29, 0x72, 0x15, 0x98, 0x19, 0xbd, 0x0d, 0x1a, 0x05, 0x22, 0xc3, 0xd1, 0x50, 0x35, 0x41, 0xf6, 0x7b, 0xc8, 0x38, 0x9b, 0x6a, 0x2b, 0x53, 0x3a, 0xd9, 0x4a, 0x6c, 0xdc, 0x12, 0xac, 0x72, 0x22, 0x44, 0x63, 0x72, 0xc2, 0x01, 0x1f, 0x69, 0xfb, 0xad, 0x63, 0x62, 0x9d, 0x8d, + 0x91, 0x1a, 0xf9, 0x31, 0xe9, 0x7e, 0x90, 0x6f, 0x66, 0xd3, 0x3e, 0xbc, 0xe7, 0x7d, 0xc2, 0x32, 0x98, 0x5c, 0x3a, 0xed, 0x70, 0x20, 0x34, 0xe7, 0x10, 0x12, 0x9d, 0x4b, 0xdb, 0xa4, 0x6d, 0xcf, 0x01, 0x3e, 0x3e, 0xdd, 0x01, 0xe8, 0x0e, 0x20, 0x1f, 0xa2, 0x90, 0xd7, 0xb1, 0x9b, 0xe6, 0xe9, 0x55, 0x62, 0x0e, 0x22, 0x4a, 0x3f, 0xd3, 0x57, 0x34, 0x03, 0x36, 0x8d, 0x72, 0xc9, 0x14, 0xdd, 0x9a, 0x93, 0xbb, 0x61, 0x93, 0xa2, 0xcf, 0x44, 0x2b, 0x30, 0xf5, 0xf8, 0x45, 0x5a, 0x50, 0xdb, 0xa3, 0x2a, 0x6e, 0x11, 0x05, 0xa8, 0x96, 0x8d, 0x2d, 0x12, 0xaf, 0x3c, 0x0c, 0x4b, 0xae, 0xca, 0xcc, 0x89, 0x27, 0x94, 0x28, 0xd8, 0x48, 0xac, 0x18, 0x15, 0x85, 0x7b, 0xb4, 0xb6, 0xa4, 0xce, 0x6e, 0x02, 0xb1, 0x76, 0xae, 0x34, 0x3d, 0x8d, 0x53, 0xc6, 0xa9, 0xd6, 0x04, 0xda, 0xcf, 0xfa, 0xbf, 0x90, 0x50, 0xa4, 0x9c, 0x49, 0xdb, 0x11, 0x30, 0xf4, 0x3a, 0x5b, 0x61, 0x4e, 0x8b, 0x19, 0xf9, 0xbf, 0xe2, 0x5f, 0xea, 0xd9, 0x0d, 0x11, 0x08, 0x54, 0x6a, 0x15, 0x19, 0xb5, 0x02, 0x3b, 0x1f, 0x6a, 0xd1, 0x98, 0xef, 0x4a, 0x7f, 0x25, 0x09, 0xb5, 0x9c, 0x63, 0x32, 0xa8, 0x5e, 0xd6, 0xc9, 0x75, 0x52, 0xb6, 0x24, 0x17, 0xe5, 0xa6, 0x29, 0x1c, 0x5a, 0x3f, 0xa1, 0xb7, 0x2e, 0x6c, 0x36, 0x3c, 0x9f, 0x25, 0xb6, 0xc6, 0x2a, 0xfb, 0xc2, 0x43, 0xda, 0xe6, 0xc8, 0x14, 0xa0, 0x60, 0xea, 0x08, 0xfd, 0xda, 0xe5, 0xd8, 0xeb, 0x00, 0xee, 0xd3, 0xbc, 0x32, 0x43, 0x5b, 0x1a, 0x62, 0x12, 0x18, 0xbd, 0x02, 0x51, 0xcc, 0xdb, 0xa8, 0xb0, 0x71, 0x47, 0x81, 0x80, 0x2c, 0x64, 0x61, 0x74, 0x9c, 0x17, 0x9d, 0x19, 0x01, 0x76, 0x84, 0x6d, 0x50, 0x4e, 0x59, 0x50, 0x9d, 0x22, 0x3d, + 0xaf, 0x83, 0x50, 0x7d, 0x55, 0x67, 0x7f, 0x06, 0x55, 0xd1, 0x39, 0x3c, 0x93, 0x5a, 0xbd, 0xbe, 0x39, 0xe9, 0x79, 0xf3, 0x8a, 0xc7, 0xfe, 0x5f, 0x3c, 0x92, 0x72, 0x69, 0x03, 0x4e, 0x02, 0x7a, 0xfc, 0x64, 0xa6, 0xbe, 0xa7, 0x36, 0x07, 0x84, 0x44, 0x1e, 0xcb, 0x10, 0xc4, 0x60, 0x7c, 0x50, 0x7a, 0xdd, 0x10, 0xa8, 0xd6, 0x0a, 0x34, 0xd2, 0x52, 0x40, 0x7b, 0x33, 0xc4, 0x00, 0x8e, 0x21, 0x4f, 0xeb, 0xae, 0xd5, 0xda, 0xeb, 0x76, 0x9a, 0x60, 0x63, 0x2b, 0xcb, 0x48, 0xff, 0x06, 0x00, 0x22, 0x60, 0x25, 0xa4, 0xd5, 0x0e, 0x56, 0x63, 0xa1, 0x0e, 0x85, 0x13, 0x3f, 0x9a, 0x95, 0x18, 0xc3, 0x96, 0xd2, 0xbb, 0xea, 0xb0, 0xac, 0x1c, 0x0f, 0x9a, 0x9f, 0xf1, 0xaf, 0x4f, 0x4b, 0xef, 0x9a, 0x20, 0x26, 0x33, 0x82, 0xdb, 0x20, 0xb6, 0x2c, 0x34, 0x3e, 0x42, 0x46, 0x2e, 0x0b, 0xd2, 0x89, 0x97, 0x3a, 0x4b, 0x82, 0x17, 0x97, 0x2c, 0x96, 0x1e, 0xb9, 0xc4, 0x79, 0x6d, 0x94, 0x76, 0x26, 0x6f, 0x4c, 0x73, 0x2d, 0x6f, 0x4a, 0x9d, 0xff, 0x9a, 0x70, 0xdc, 0x73, 0x3a, 0xf0, 0x9d, 0x62, 0x17, 0xf4, 0x37, 0xfb, 0xc8, 0xae, 0x43, 0xa7, 0x29, 0x01, 0xb2, 0x60, 0x32, 0x15, 0xbc, 0xb9, 0xef, 0x6e, 0x74, 0x58, 0x44, 0xb0, 0xfa, 0x28, 0x13, 0x73, 0x02, 0xeb, 0xa4, 0xdb, 0x57, 0xcf, 0x75, 0x5e, 0x82, 0x9e, 0x0e, 0x40, 0xe9, 0xf1, 0x2f, 0x88, 0x5e, 0x21, 0xda, 0xad, 0x35, 0xce, 0xfa, 0x39, 0x30, 0x69, 0x1d, 0x97, 0xaf, 0xa8, 0x16, 0x7d, 0x1f, 0xcf, 0xcf, 0xef, 0xe9, 0x60, 0x55, 0xc6, 0xfa, 0x76, 0xc3, 0x26, 0x07, 0x14, 0x29, 0x2f, 0x9a, 0x8e, 0xbb, 0xae, 0xee, 0x44, 0xf3, 0x56, 0x46, 0x1d, 0x4c, 0x13, 0x02, 0x4c, 0xef, 0xf1, 0x6f, 0x44, 0x08, 0xa6, 0x63, + 0x26, 0xef, 0xb6, 0x1c, 0xcb, 0x17, 0x13, 0x88, 0xdf, 0xf5, 0x14, 0x3f, 0xfd, 0x04, 0xa3, 0xf7, 0x93, 0x87, 0x57, 0x4e, 0x78, 0x81, 0xaf, 0xe3, 0x30, 0xb3, 0x91, 0x19, 0x87, 0x60, 0xbe, 0x75, 0x71, 0xe6, 0x40, 0xf8, 0x5a, 0xb0, 0x3e, 0xe1, 0x1a, 0x2c, 0xf0, 0xdf, 0xe9, 0xbb, 0xc6, 0xde, 0xd0, 0x5b, 0x8e, 0x77, 0x7c, 0xde, 0x6b, 0x30, 0x96, 0x23, 0xe4, 0xa6, 0x77, 0x6a, 0x71, 0x94, 0xeb, 0x86, 0x70, 0x6e, 0xfb, 0xc3, 0x5c, 0xff, 0x3e, 0x6c, 0x1b, 0x4c, 0x4b, 0xac, 0x9a, 0xcf, 0x84, 0xa4, 0x92, 0x12, 0xc4, 0x5f, 0xbb, 0x37, 0xe9, 0x36, 0xc3, 0x42, 0x25, 0x07, 0xd1, 0xce, 0x97, 0x56, 0x5c, 0xd5, 0x26, 0x6f, 0xa2, 0x18, 0x86, 0xf7, 0xfb, 0x24, 0x83, 0x64, 0xd1, 0xb1, 0x1f, 0x0d, 0x79, 0xc4, 0x4f, 0x1c, 0x38, 0x45, 0x6e, 0x05, 0xd1, 0x62, 0xd1, 0x95, 0x5d, 0x69, 0x87, 0xc6, 0xa7, 0x2c, 0xa9, 0xf1, 0xfb, 0xc1, 0xec, 0x36, 0x52, 0x4d, 0x00, 0x6a, 0xff, 0xfb, 0x28, 0x2a, 0xf7, 0x59, 0xe0, 0x80, 0xcc, 0xa7, 0xab, 0x9b, 0xd7, 0xeb, 0xa2, 0x72, 0x10, 0x38, 0x11, 0x08, 0x40, 0x48, 0xcb, 0xcf, 0xe4, 0x03, 0x16, 0xe3, 0x40, 0x1b, 0x71, 0x3a, 0x2d, 0xa9, 0x8d, 0xb6, 0x47, 0xc2, 0x20, 0x6b, 0x7f, 0xc8, 0x41, 0xb2, 0x3e, 0x51, 0xc9, 0x8b, 0x33, 0xe7, 0x0c, 0x4a, 0xcc, 0x4d, 0x8a, 0x36, 0xf4, 0x33, 0xb0, 0x4a, 0x3d, 0x80, 0x94, 0xeb, 0x38, 0xf9, 0x0a, 0xb6, 0x50, 0x58, 0x98, 0x1a, 0xc7, 0xbb, 0x15, 0xac, 0xde, 0xea, 0x5d, 0xa5, 0xed, 0xd4, 0x7c, 0xbd, 0xcb, 0x8c, 0x9b, 0xb3, 0xfc, 0xb8, 0xc5, 0xea, 0xcf, 0xfa, 0x50, 0x08, 0xe9, 0x14, 0x9d, 0x9b, 0x37, 0x22, 0x54, 0xde, 0xba, 0xa5, 0xff, 0xe4, 0x66, 0x15, 0x4e, 0xaa, 0x06, 0x62, + 0xdd, 0x02, 0x14, 0x49, 0x0f, 0x48, 0x43, 0x65, 0xea, 0x00, 0x6b, 0x1b, 0x9c, 0xfb, 0x57, 0xa4, 0xfd, 0xe4, 0x10, 0x29, 0x20, 0x2e, 0xc6, 0xcd, 0xce, 0x41, 0xc4, 0xd3, 0xfd, 0x10, 0x05, 0x59, 0xe3, 0x7c, 0xfb, 0x89, 0xde, 0x25, 0x25, 0x1d, 0xac, 0x8d, 0xc1, 0x83, 0x0b, 0x0b, 0x96, 0xe9, 0xab, 0x3c, 0x13, 0xcd, 0xd3, 0x09, 0x7e, 0x4f, 0x45, 0xf9, 0x35, 0xae, 0x77, 0x25, 0xbb, 0x66, 0xd3, 0x7e, 0xe1, 0x2b, 0x67, 0x43, 0x57, 0x98, 0x57, 0xc2, 0x11, 0x1a, 0x88, 0xc4, 0x8a, 0x80, 0x0d, 0x53, 0xb3, 0x1b, 0x10, 0xb5, 0x0d, 0xab, 0x05, 0x07, 0x86, 0x09, 0x27, 0xf2, 0x85, 0xce, 0x3b, 0x83, 0xd2, 0x32, 0x49, 0xc7, 0x3a, 0xe9, 0xe2, 0x70, 0x17, 0xb2, 0x16, 0xb9, 0xdc, 0xa9, 0xd4, 0xca, 0x6c, 0x13, 0x36, 0xf4, 0xd5, 0xce, 0xab, 0x83, 0x95, 0xa2, 0xeb, 0x7b, 0x39, 0xde, 0xf2, 0xff, 0xf5, 0xab, 0xda, 0x9b, 0x3b, 0xd9, 0x15, 0x6e, 0x32, 0xfe, 0x4b, 0xf3, 0x65, 0xf2, 0xe9, 0xc2, 0x7b, 0x68, 0x40, 0xa2, 0x24, 0x59, 0xa8, 0x9b, 0x43, 0x3f, 0xa6, 0x9f, 0xcd, 0x80, 0x08, 0xb9, 0x76, 0x3a, 0x40, 0xe9, 0xa7, 0xee, 0xc8, 0xfc, 0xf4, 0xa4, 0x84, 0x2f, 0x2b, 0x5c, 0x7e, 0x80, 0xc7, 0x9a, 0x2c, 0x64, 0x32, 0x8f, 0x03, 0x8c, 0x43, 0x5b, 0xaa, 0xd7, 0x3f, 0x7a, 0x18, 0xcd, 0x29, 0x7f, 0x2e, 0x55, 0xe0, 0x16, 0x5a, 0x04, 0xbd, 0x29, 0x98, 0x1d, 0xe5, 0x18, 0x20, 0x5c, 0x72, 0xfa, 0x46, 0xc9, 0xed, 0xee, 0xa1, 0x49, 0xa4, 0x7d, 0x66, 0x18, 0xfa, 0xba, 0xa5, 0x43, 0x48, 0x5d, 0x4e, 0xd4, 0xa4, 0x46, 0xa4, 0x51, 0x6f, 0x45, 0x55, 0x4b, 0x40, 0x49, 0x06, 0xb0, 0x0e, 0xb1, 0x70, 0x2a, 0xe0, 0xa5, 0xc0, 0x0c, 0x95, 0x38, 0xe3, 0x72, 0xb6, 0xe5, + 0x03, 0xe6, 0x54, 0x5b, 0x98, 0x3f, 0x8e, 0x72, 0xbe, 0x5e, 0x7a, 0x77, 0xa9, 0x88, 0x57, 0x7a, 0x61, 0xca, 0x67, 0x28, 0x79, 0x5b, 0x32, 0xda, 0xfc, 0xd7, 0x19, 0x80, 0xd7, 0xf0, 0xff, 0x41, 0x2c, 0xba, 0xcf, 0x96, 0x18, 0x96, 0x9b, 0x71, 0x1c, 0xd4, 0xc1, 0xd7, 0x38, 0x88, 0x67, 0xf4, 0xd5, 0x5c, 0xa1, 0x0f, 0xf1, 0xde, 0x76, 0xe8, 0x42, 0xbe, 0xa9, 0xad, 0xe2, 0x1e, 0x34, 0xe3, 0xa8, 0x39, 0x0e, 0xf1, 0xd1, 0x67, 0x45, 0x73, 0x97, 0xb1, 0xec, 0x25, 0x9e, 0xbb, 0x1e, 0xdf, 0xf0, 0x6f, 0x01, 0xa4, 0xbb, 0xed, 0xdd, 0xea, 0x8e, 0xaa, 0x80, 0xfc, 0x3e, 0x8c, 0xed, 0x50, 0x79, 0x7f, 0x8b, 0x68, 0x73, 0x31, 0x03, 0xf7, 0xa2, 0x51, 0x21, 0x7e, 0x93, 0xba, 0x01, 0x39, 0x3a, 0xa8, 0xda, 0x3d, 0x1a, 0x85, 0x6d, 0xf9, 0x23, 0x04, 0x84, 0xbc, 0x2f, 0xf8, 0x11, 0xc5, 0x0b, 0x65, 0x48, 0xdd, 0xbb, 0xdc, 0xe2, 0x5b, 0xba, 0x78, 0xbd, 0x46, 0x18, 0x39, 0xef, 0xc0, 0x58, 0x7b, 0x38, 0xc7, 0xa7, 0x9b, 0xd7, 0x9b, 0x45, 0x5a, 0x9d, 0x18, 0x3d, 0xd3, 0xfe, 0xc0, 0x63, 0x64, 0x47, 0x06, 0x82, 0x1b, 0x06, 0xaf, 0xbc, 0xe6, 0x1f, 0x3c, 0x2f, 0xb4, 0xe0, 0x4b, 0x2c, 0xc2, 0xb9, 0x43, 0xd0, 0x51, 0xed, 0xef, 0x74, 0xd1, 0x3a, 0x88, 0xc2, 0x74, 0x7d, 0x68, 0xef, 0x49, 0x69, 0x0f, 0x84, 0xf4, 0xc2, 0xb2, 0xcd, 0x23, 0x77, 0xaf, 0x4c, 0x26, 0x06, 0x4e, 0x44, 0xdd, 0x06, 0xbe, 0xeb, 0x4f, 0x66, 0x10, 0xa9, 0xab, 0x35, 0x2a, 0x01, 0x37, 0xa5, 0xf1, 0x5c, 0x16, 0x4c, 0xb6, 0x25, 0x5e, 0xb9, 0x61, 0xec, 0xc6, 0x14, 0xfb, 0xe1, 0x1b, 0x22, 0x00, 0x2a, 0x71, 0x30, 0x6a, 0xb8, 0x44, 0x15, 0x6a, 0x6c, 0x90, 0x44, 0x96, 0xc4, 0x75, 0x71, 0x4c, + 0x65, 0xd7, 0xfe, 0x53, 0xf7, 0x87, 0xc7, 0xd5, 0xfd, 0x4e, 0x21, 0x4c, 0x8f, 0x09, 0x54, 0xab, 0x0c, 0xf6, 0xae, 0xc5, 0xf3, 0x7f, 0x39, 0x1d, 0x9c, 0x23, 0x67, 0xe9, 0x96, 0x23, 0x6d, 0xe0, 0xeb, 0xaf, 0xf2, 0x90, 0x34, 0xd2, 0xa3, 0x6d, 0x3c, 0x0c, 0x2c, 0x61, 0xc1, 0x84, 0x12, 0xe8, 0x0b, 0x0d, 0xe1, 0xc7, 0xae, 0x88, 0x1e, 0x20, 0xbb, 0x9a, 0xab, 0xde, 0x20, 0x09, 0x40, 0x89, 0xa3, 0xcf, 0x9e, 0xca, 0x08, 0xe3, 0x7f, 0xc7, 0x05, 0x88, 0xe5, 0x63, 0x72, 0x15, 0xaf, 0xd1, 0x7f, 0x77, 0xf3, 0x7f, 0x85, 0x9a, 0xb5, 0x2f, 0xe5, 0x3a, 0xce, 0x42, 0x73, 0x4f, 0x68, 0x91, 0x24, 0xcf, 0xa5, 0x42, 0x85, 0x1b, 0x4a, 0x00, 0xa1, 0x5e, 0xb4, 0x03, 0xd7, 0xc0, 0xb1, 0x9b, 0x0b, 0x50, 0xa4, 0xe7, 0xb1, 0xf0, 0x05, 0xe5, 0xcd, 0xfe, 0x4c, 0x04, 0xc3, 0xe6, 0x5f, 0x25, 0xfe, 0x59, 0x44, 0x4f, 0xbb, 0xdd, 0x54, 0xb2, 0xcc, 0x34, 0x82, 0xc3, 0x83, 0x88, 0xa7, 0x2b, 0xd1, 0xa5, 0x8d, 0x0d, 0x2b, 0x04, 0xda, 0x81, 0x75, 0x94, 0x1e, 0x8d, 0xdf, 0x18, 0x5a, 0x39, 0xd2, 0x2e, 0x01, 0x82, 0xa1, 0x0f, 0xcb, 0x9a, 0x8d, 0xb6, 0x7f, 0xcf, 0xa1, 0xf4, 0x0d, 0x67, 0x1f, 0xf0, 0xa5, 0x22, 0x94, 0xc7, 0x01, 0x9d, 0x55, 0xe9, 0x05, 0x1d, 0x6a, 0xe7, 0x58, 0xbd, 0x7b, 0x26, 0xea, 0xab, 0x1a, 0x07, 0x25, 0xdf, 0x36, 0x8f, 0x3a, 0xe5, 0x4c, 0x90, 0x0f, 0x43, 0x57, 0x6f, 0x02, 0x9d, 0xed, 0xfa, 0x42, 0xf6, 0x99, 0xad, 0xa5, 0x8b, 0xc5, 0x69, 0xe7, 0x8a, 0x7e, 0x43, 0xdf, 0x04, 0x38, 0x0b, 0x58, 0xd6, 0x09, 0x67, 0x6a, 0x0c, 0x1a, 0xb9, 0x66, 0xea, 0xe3, 0xa8, 0xf9, 0x7e, 0x10, 0x2d, 0x67, 0x43, 0x17, 0x50, 0xa1, 0xb4, 0x87, 0x21, 0x05, 0xbc, + 0xf2, 0x79, 0x47, 0x2e, 0x2e, 0x2f, 0xe4, 0x68, 0x74, 0x35, 0xb9, 0x06, 0xe7, 0xa3, 0x84, 0xb6, 0x21, 0xc4, 0xe8, 0xae, 0xa8, 0x4c, 0x2c, 0x02, 0x49, 0xa8, 0xb5, 0x36, 0xae, 0x82, 0x1f, 0x68, 0x37, 0x6a, 0xfa, 0xd4, 0xb9, 0x0f, 0x2c, 0x72, 0x66, 0x22, 0x4c, 0xbe, 0xc9, 0x24, 0xa8, 0x6c, 0x4c, 0x28, 0xe9, 0x60, 0x6b, 0x4d, 0xf5, 0x48, 0xdd, 0xe9, 0xd2, 0xed, 0x2a, 0x81, 0xa1, 0x10, 0xf7, 0xa5, 0x97, 0xba, 0xce, 0xfb, 0xc2, 0x5e, 0xed, 0xf2, 0xe7, 0x34, 0xdb, 0x44, 0x6d, 0xbf, 0xe1, 0xe1, 0x8f, 0x52, 0xd5, 0x7c, 0xe5, 0x4e, 0x24, 0x47, 0x67, 0xc9, 0x5f, 0x1f, 0xa5, 0x0e, 0x10, 0x77, 0x82, 0xa6, 0x80, 0x1f, 0xa2, 0x42, 0xb7, 0x8d, 0x28, 0xc1, 0x7b, 0xc7, 0x41, 0x8a, 0x46, 0xe3, 0xa1, 0x30, 0xb3, 0xd8, 0xd0, 0x02, 0x75, 0x65, 0xc2, 0xef, 0xd8, 0x58, 0xb1, 0x1b, 0x5a, 0xa5, 0x64, 0xac, 0xea, 0x9c, 0xbe, 0x8c, 0xab, 0xae, 0xd6, 0xee, 0xc6, 0x4d, 0xba, 0xfc, 0x90, 0x5e, 0xaf, 0x20, 0x5b, 0x5c, 0xcf, 0xbb, 0xa9, 0x8b, 0xae, 0x4b, 0x70, 0x00, 0xc1, 0xef, 0xa4, 0xb0, 0x3e, 0x30, 0xc7, 0x21, 0x03, 0x42, 0x66, 0x28, 0xde, 0x30, 0x9b, 0xad, 0xb9, 0xbb, 0xba, 0x1f, 0x33, 0xbd, 0x16, 0xe4, 0xc7, 0x27, 0x79, 0x75, 0xaa, 0xc3, 0x85, 0xe3, 0xb9, 0x39, 0x33, 0xaf, 0x87, 0xe5, 0x4d, 0xec, 0x11, 0x54, 0xcc, 0x81, 0xf5, 0x43, 0xe5, 0x01, 0x6c, 0xb7, 0x97, 0x1c, 0xca, 0x1e, 0x1e, 0x66, 0x56, 0x65, 0x52, 0x42, 0x77, 0x2f, 0xb0, 0xf6, 0x43, 0xbc, 0x97, 0x7c, 0xbd, 0x00, 0xee, 0x4e, 0x63, 0xc4, 0x3b, 0xb9, 0x68, 0x30, 0xe7, 0x6b, 0xad, 0x3f, 0x9b, 0x62, 0x18, 0xee, 0x4e, 0xee, 0xa7, 0x61, 0xa5, 0xec, 0xb7, 0x62, 0x1e, 0x0c, 0x59, 0x18, + 0x99, 0xdc, 0x02, 0x7d, 0x6c, 0xfd, 0x8d, 0x28, 0x1d, 0x2c, 0xe1, 0x89, 0x6d, 0x1b, 0xa3, 0xd3, 0xb7, 0x99, 0x42, 0xa6, 0xef, 0x0a, 0x08, 0x95, 0x4e, 0xe5, 0x94, 0xe2, 0xa4, 0x4a, 0xef, 0x15, 0x83, 0x55, 0x95, 0xfd, 0x95, 0xb4, 0x38, 0xde, 0xd2, 0x25, 0xa0, 0x64, 0x94, 0x7e, 0x67, 0xb8, 0xb2, 0x76, 0x2c, 0xdb, 0xf3, 0x45, 0x61, 0x0d, 0x32, 0xed, 0x49, 0xaa, 0xcd, 0x40, 0x0f, 0x1f, 0xae, 0x9f, 0x0e, 0x42, 0x20, 0x6f, 0x16, 0xd3, 0x86, 0x16, 0x88, 0x21, 0x7c, 0xb3, 0xec, 0xc5, 0x2d, 0x84, 0x44, 0x86, 0xcf, 0x5b, 0x0b, 0x68, 0x0a, 0x9e, 0x9b, 0x71, 0x29, 0x1d, 0xdc, 0x1d, 0xf5, 0xed, 0xb6, 0x6a, 0x55, 0xc2, 0xe6, 0x9e, 0xee, 0x48, 0xe7, 0xf5, 0xb7, 0x64, 0xc2, 0x4d, 0x74, 0xc7, 0x92, 0xd0, 0x34, 0xf2, 0x5a, 0x1f, 0x81, 0xe2, 0x56, 0x91, 0x0f, 0x32, 0xd9, 0x1c, 0x94, 0x44, 0x48, 0x6c, 0xb9, 0x12, 0x48, 0x6f, 0xc4, 0x92, 0x9d, 0x79, 0x64, 0x5b, 0x77, 0x59, 0xf0, 0x5d, 0x10, 0x64, 0xa1, 0x9f, 0x36, 0x45, 0xe7, 0xd3, 0x94, 0x45, 0xc1, 0x82, 0x75, 0xdc, 0x4d, 0xb4, 0xbf, 0xba, 0x84, 0xa8, 0xc5, 0xcc, 0x7d, 0x3a, 0xe3, 0xcf, 0xf9, 0x18, 0x83, 0x0e, 0xcb, 0xfe, 0x69, 0xc3, 0xff, 0xa8, 0x8c, 0xdf, 0xfa, 0xad, 0x8d, 0x54, 0xef, 0xe5, 0x82, 0x40, 0xab, 0x52, 0xa8, 0x6f, 0x30, 0xa1, 0x05, 0xad, 0x49, 0x2c, 0x14, 0x55, 0x01, 0x12, 0xde, 0x3f, 0x03, 0x16, 0x47, 0xf8, 0x57, 0x9b, 0x3b, 0x75, 0x9a, 0xac, 0xac, 0x55, 0xe2, 0xa0, 0x94, 0xc1, 0xea, 0x8f, 0xfa, 0x69, 0x1d, 0x1d, 0x61, 0x75, 0xfb, 0x54, 0x89, 0x48, 0xbb, 0x34, 0x13, 0x73, 0x95, 0x1b, 0x61, 0xa4, 0xb7, 0xfd, 0xbe, 0xd7, 0x33, 0x9b, 0x50, 0xf0, 0x91, 0x7a, 0x67, 0x53, + 0xda, 0xc0, 0xbc, 0x24, 0x46, 0xff, 0x7a, 0xab, 0x57, 0x8c, 0xc6, 0x22, 0x67, 0x6d, 0xff, 0x06, 0xcf, 0xfe, 0x31, 0xa9, 0xcb, 0xda, 0x72, 0xfb, 0x63, 0xf7, 0xdd, 0xa6, 0x04, 0x0d, 0xa2, 0x7d, 0x4d, 0x2f, 0x1a, 0x50, 0x2e, 0x7f, 0x41, 0x27, 0x69, 0xaf, 0x09, 0x98, 0x86, 0x64, 0x89, 0xf2, 0xcc, 0xaa, 0xf1, 0x8d, 0x2e, 0x51, 0x2c, 0xe4, 0x63, 0x89, 0xe6, 0xaf, 0xf7, 0x90, 0xbe, 0x7e, 0x9d, 0x18, 0x5c, 0xfa, 0x8b, 0x4c, 0x9d, 0x43, 0x1c, 0xcc, 0xdc, 0xf9, 0x76, 0x23, 0xb9, 0xcb, 0x0e, 0x24, 0xb0, 0x71, 0x1c, 0x00, 0xfd, 0xaf, 0xf3, 0xaa, 0x0b, 0xa5, 0xcc, 0xb2, 0x2a, 0x80, 0xdd, 0x8e, 0xae, 0xbb, 0xb7, 0x35, 0x9d, 0xfc, 0x15, 0x50, 0x6c, 0x0d, 0x5d, 0xd3, 0xe5, 0xe1, 0x4e, 0x4d, 0x7d, 0x7e, 0x60, 0x9a, 0x4f, 0x64, 0x6f, 0xc0, 0x92, 0x84, 0x7f, 0xbb, 0x2b, 0x6f, 0x21, 0x87, 0x88, 0x6b, 0x95, 0x7c, 0xfc, 0xce, 0x1a, 0xbc, 0xe5, 0xdb, 0x5f, 0xed, 0xa3, 0x0f, 0x01, 0x6d, 0xea, 0x43, 0xbe, 0x52, 0x10, 0x1b, 0x10, 0x22, 0x20, 0xdd, 0xbe, 0x31, 0x7a, 0x4f, 0x3a, 0xbc, 0x22, 0xbc, 0xc7, 0xa0, 0x30, 0x99, 0x6f, 0x5e, 0xa8, 0xeb, 0xe8, 0x43, 0xf1, 0xd2, 0xad, 0xeb, 0xc4, 0x86, 0x21, 0x12, 0x16, 0xfa, 0x74, 0x3e, 0xb5, 0x4a, 0xc0, 0x6d, 0x56, 0x4d, 0x34, 0xd3, 0x11, 0x42, 0x20, 0x3b, 0x71, 0xde, 0x1f, 0x0a, 0xb5, 0xe4, 0x7b, 0xb6, 0x39, 0xdf, 0x22, 0xd0, 0x23, 0xe9, 0x39, 0x8d, 0x86, 0x82, 0xc3, 0x92, 0x0e, 0x61, 0x42, 0x04, 0x7f, 0x26, 0x90, 0x28, 0x8e, 0xeb, 0xec, 0x65, 0xb5, 0xbb, 0x09, 0x30, 0xc3, 0xd8, 0x9e, 0xa5, 0x98, 0x15, 0xae, 0xaa, 0x55, 0xc4, 0xa6, 0xdd, 0x2b, 0x60, 0x3d, 0x3f, 0x9d, 0xd6, 0x08, 0xb3, 0xde, 0x66, + 0x4b, 0x72, 0x81, 0xcb, 0xc7, 0xb7, 0x0c, 0x4e, 0x78, 0x36, 0x1a, 0x0b, 0x55, 0xda, 0x6c, 0x06, 0x41, 0x4e, 0xb8, 0x48, 0xd6, 0xd1, 0xe2, 0x17, 0x93, 0x78, 0xb6, 0xb7, 0x91, 0x65, 0x21, 0xb0, 0x93, 0xe0, 0xca, 0x52, 0xfd, 0x4c, 0x80, 0xae, 0xe1, 0xd7, 0x1f, 0x1b, 0x12, 0xb1, 0xac, 0xe5, 0x29, 0x0b, 0x55, 0xb0, 0xf2, 0xa2, 0xe9, 0xd4, 0xc8, 0x78, 0x91, 0xaf, 0x9d, 0x51, 0x72, 0x79, 0xd6, 0xfa, 0x66, 0xd4, 0x71, 0x70, 0xc1, 0x8a, 0xd6, 0xb4, 0xb1, 0xfa, 0x29, 0x80, 0xbd, 0x79, 0x3c, 0xe8, 0xef, 0x61, 0x9b, 0xdb, 0x7c, 0x8f, 0x31, 0xc2, 0x4b, 0x16, 0xff, 0xfb, 0x27, 0x2b, 0xcc, 0xa6, 0x4a, 0x31, 0x6f, 0x8c, 0x46, 0xac, 0x29, 0x48, 0xf0, 0x11, 0xaa, 0xac, 0xc5, 0xec, 0x01, 0x53, 0x0a, 0xb2, 0xb5, 0xc5, 0xc6, 0x5c, 0xca, 0x17, 0x39, 0xc7, 0x77, 0x0f, 0xb6, 0x10, 0x5a, 0x0a, 0x15, 0xd8, 0xbb, 0x73, 0x26, 0xd0, 0xfd, 0x94, 0xfa, 0x05, 0x6f, 0x05, 0xce, 0xb4, 0x53, 0x06, 0x17, 0x68, 0x31, 0x2b, 0x28, 0x0e, 0xb2, 0xa9, 0xc2, 0xba, 0x2b, 0x57, 0x43, 0xf3, 0x75, 0x5f, 0xf7, 0x9e, 0xae, 0x4e, 0x93, 0xa7, 0x8f, 0x46, 0xcd, 0x03, 0xf2, 0x73, 0x67, 0x29, 0xff, 0x66, 0x1c, 0x7a, 0x49, 0xa8, 0x5d, 0xd8, 0x12, 0x45, 0xbc, 0x65, 0xdc, 0x3c, 0xc1, 0x56, 0x42, 0xf6, 0x42, 0xdb, 0xa0, 0xd4, 0x96, 0x7c, 0xab, 0x0e, 0x1d, 0x31, 0x52, 0xd1, 0xa0, 0xaf, 0x35, 0xf8, 0x05, 0x63, 0x12, 0x75, 0xa8, 0x5e, 0xd3, 0x35, 0x51, 0x77, 0x30, 0x20, 0xb3, 0x6a, 0x2a, 0xb5, 0x57, 0x46, 0x42, 0xf8, 0x07, 0x37, 0xb4, 0xd8, 0x92, 0xf1, 0x97, 0x41, 0x54, 0x38, 0x00, 0x9f, 0x2f, 0x8d, 0xa9, 0x82, 0xb0, 0xdf, 0x7e, 0x46, 0x1a, 0xb7, 0x91, 0x8a, 0x03, 0x46, + 0x8c, 0x28, 0xd6, 0x17, 0x9d, 0xd1, 0xf8, 0x0c, 0xa0, 0xef, 0xce, 0xe0, 0x41, 0xe7, 0x13, 0x6f, 0x41, 0x32, 0x25, 0xab, 0x19, 0x2f, 0x58, 0x62, 0x39, 0x1b, 0xdb, 0xc2, 0xd8, 0xe8, 0xa7, 0xa3, 0xbe, 0xaf, 0xca, 0xa6, 0x8a, 0x29, 0x52, 0x75, 0xd9, 0xc4, 0x33, 0xe0, 0x97, 0xc2, 0x72, 0x97, 0xd7, 0xb3, 0xd7, 0xfd, 0xdd, 0x72, 0xde, 0xe6, 0xe8, 0x89, 0x02, 0x15, 0x6f, 0xf4, 0xd7, 0x67, 0x01, 0xba, 0x18, 0x12, 0x1b, 0x45, 0xce, 0xe0, 0x85, 0xc8, 0x92, 0xdd, 0xdc, 0x15, 0xa4, 0x8b, 0x33, 0x90, 0x4c, 0x4f, 0xcf, 0x0a, 0xb8, 0x2b, 0xe6, 0xb3, 0xc1, 0x51, 0x0c, 0xf7, 0xc5, 0x60, 0xad, 0x6d, 0xd3, 0x39, 0xa6, 0xac, 0x13, 0x78, 0x22, 0xe5, 0xe3, 0x42, 0xd2, 0x7d, 0xb7, 0xd7, 0x47, 0x0e, 0x5d, 0x69, 0xf4, 0xaa, 0xf6, 0x9e, 0xd9, 0x33, 0xd6, 0x12, 0xd8, 0xf8, 0xf6, 0xc0, 0x46, 0x3a, 0x5d, 0x09, 0x95, 0xe5, 0x5f, 0x40, 0x72, 0x72, 0x25, 0x80, 0x85, 0x94, 0xc1, 0xaa, 0x04, 0xe7, 0x70, 0x7b, 0xc3, 0x83, 0x0d, 0x90, 0x56, 0xbd, 0x55, 0x56, 0x12, 0xd9, 0x32, 0x20, 0x74, 0x34, 0x7a, 0x1c, 0x6b, 0x37, 0x5e, 0x47, 0xf6, 0x66, 0x7e, 0xa0, 0x38, 0x08, 0x0b, 0x30, 0x25, 0x42, 0x73, 0xeb, 0x39, 0xc5, 0x11, 0xed, 0x82, 0xb2, 0xc3, 0xde, 0x6e, 0xfe, 0x22, 0xb6, 0xe2, 0x1e, 0x4d, 0x08, 0x50, 0x8f, 0xfc, 0xc8, 0x89, 0x17, 0x7f, 0x5c, 0xb6, 0x12, 0x15, 0x4f, 0xc4, 0x1f, 0xca, 0xdc, 0x81, 0x88, 0x8b, 0x76, 0xfd, 0x63, 0x93, 0xee, 0x26, 0x88, 0x17, 0x6c, 0x19, 0x96, 0x5e, 0x1b, 0xb1, 0x67, 0xb8, 0x58, 0x8c, 0xfe, 0x6d, 0x4f, 0x59, 0xfc, 0x71, 0x2d, 0xdf, 0xb8, 0x41, 0x4b, 0xdd, 0x42, 0xda, 0xc0, 0x91, 0x55, 0x75, 0xfb, 0xa0, 0x39, 0xab, 0xe1, + 0x4f, 0x6a, 0x3a, 0x21, 0x9b, 0x97, 0x83, 0xb2, 0x84, 0x48, 0x67, 0xd4, 0xd1, 0x5d, 0x28, 0x78, 0x40, 0xa6, 0xc2, 0xeb, 0x39, 0xd3, 0xcd, 0xff, 0xc4, 0xfc, 0xe7, 0x6f, 0x50, 0x08, 0xc7, 0x0e, 0xdd, 0xf5, 0x90, 0x57, 0xa1, 0xe0, 0x22, 0x56, 0x2d, 0x00, 0x88, 0x03, 0x93, 0x31, 0x41, 0x41, 0x32, 0xd0, 0x95, 0x08, 0xec, 0xde, 0x46, 0x34, 0xcd, 0x99, 0x0a, 0xe4, 0xc5, 0x26, 0x2b, 0x8f, 0x19, 0x2a, 0x32, 0x20, 0x27, 0xb1, 0x82, 0x78, 0x57, 0xad, 0x3c, 0xcf, 0xe9, 0x7d, 0xad, 0x4f, 0xd1, 0x43, 0x4c, 0x35, 0x6e, 0xa7, 0xb9, 0x81, 0x05, 0x11, 0xcf, 0x74, 0x0f, 0x03, 0xdf, 0xf5, 0x9a, 0xa4, 0x32, 0x1d, 0x54, 0xd7, 0xf8, 0x13, 0x51, 0xcd, 0x79, 0xd0, 0x00, 0x9e, 0x4a, 0x40, 0x9e, 0xb7, 0xf3, 0x8b, 0xc7, 0x82, 0x98, 0x88, 0x70, 0x6e, 0x19, 0x99, 0xc6, 0x83, 0x91, 0xc8, 0x83, 0x34, 0x78, 0xc5, 0x20, 0x99, 0xa4, 0x69, 0x79, 0xef, 0xb6, 0x67, 0x81, 0x3c, 0x2c, 0x82, 0x28, 0x1a, 0x5c, 0x2c, 0xf1, 0x38, 0x32, 0xc3, 0x68, 0xbd, 0xd6, 0xdd, 0x75, 0xa8, 0x6d, 0xf6, 0xe7, 0xb1, 0x32, 0x1e, 0x0f, 0x0d, 0x9c, 0x4c, 0x9d, 0xd8, 0x80, 0x7b, 0x2e, 0xd1, 0xc8, 0x30, 0x54, 0xfb, 0x39, 0x96, 0x13, 0x76, 0x31, 0xff, 0x8c, 0x88, 0x7c, 0x8f, 0xd3, 0x35, 0x29, 0x3c, 0x9e, 0x62, 0xb3, 0xd3, 0xa5, 0x40, 0xf6, 0x73, 0x93, 0xf0, 0x42, 0x77, 0xa3, 0x9e, 0xfb, 0x29, 0x0e, 0x3f, 0x06, 0xe0, 0x6b, 0x73, 0x94, 0x43, 0x3e, 0x25, 0x03, 0x7f, 0xa5, 0x73, 0xe6, 0x52, 0x36, 0x83, 0xc2, 0xcf, 0x70, 0xa3, 0x1b, 0xcf, 0x1f, 0xd6, 0x95, 0xd1, 0xe7, 0xbb, 0x0c, 0x98, 0xed, 0x15, 0x71, 0xff, 0x5d, 0xdf, 0xde, 0xed, 0xe2, 0x3d, 0xad, 0x40, 0x5a, 0xe3, 0x53, 0xf8, + 0x66, 0x0c, 0x48, 0x16, 0xec, 0xb7, 0xee, 0x6f, 0x8f, 0xb2, 0x77, 0x5e, 0x8d, 0x61, 0x3f, 0xaa, 0x05, 0x60, 0x6a, 0x20, 0xf2, 0x53, 0xf9, 0xb6, 0xc1, 0x16, 0x75, 0x22, 0x21, 0x1d, 0x9d, 0x0b, 0x01, 0xde, 0x97, 0x3f, 0x57, 0xdf, 0x8d, 0x03, 0xe6, 0x68, 0x1d, 0x35, 0xa3, 0xcb, 0x00, 0x6a, 0xac, 0x21, 0x05, 0x28, 0x85, 0x61, 0xd4, 0xcb, 0x1c, 0x91, 0x1f, 0x73, 0x99, 0xa5, 0x0b, 0xa5, 0xf0, 0x56, 0x9f, 0x75, 0xe3, 0xd7, 0x26, 0x1b, 0x23, 0x1c, 0x54, 0xb2, 0xd5, 0x49, 0x85, 0x62, 0x3d, 0x42, 0xc9, 0x7d, 0xba, 0x30, 0x32, 0x9d, 0xbd, 0x7c, 0xdd, 0x26, 0x17, 0x5d, 0x28, 0xc7, 0xf3, 0xf0, 0x2e, 0x3b, 0x3a, 0xf6, 0x4b, 0x01, 0xc9, 0x6e, 0x6c, 0xd6, 0xc8, 0x5a, 0x45, 0x62, 0x55, 0xb8, 0x08, 0x70, 0x8f, 0x26, 0xd0, 0x91, 0x0c, 0x4d, 0x60, 0xaa, 0x49, 0x87, 0x26, 0x0a, 0x86, 0x11, 0x19, 0xc3, 0xc6, 0x6e, 0x78, 0x0f, 0xc8, 0x14, 0xc6, 0x4e, 0xb5, 0x4c, 0x9b, 0xfc, 0x8a, 0x0c, 0x03, 0x22, 0x8d, 0x3e, 0xf4, 0xf0, 0x49, 0xf5, 0x00, 0x35, 0x89, 0x01, 0x9b, 0x77, 0xb1, 0x98, 0x03, 0xb8, 0x0e, 0x59, 0x33, 0x8d, 0xf3, 0x8b, 0x1b, 0x63, 0x7b, 0x2c, 0xbb, 0xf2, 0xb6, 0xcd, 0x51, 0xdf, 0x20, 0xb9, 0xa0, 0x0a, 0xa0, 0x2c, 0xd1, 0x86, 0xc1, 0x68, 0xfe, 0x49, 0xa3, 0x73, 0x60, 0xf1, 0xa2, 0x3f, 0x1f, 0x90, 0x51, 0xa3, 0x11, 0xd8, 0x57, 0x49, 0x55, 0xb6, 0xfe, 0xa2, 0x2d, 0xa0, 0x38, 0x5e, 0x96, 0x54, 0xf9, 0x20, 0x8c, 0xdc, 0x8b, 0x18, 0x5b, 0x5c, 0xf3, 0x10, 0xb9, 0x6b, 0xd8, 0xef, 0x05, 0xe6, 0xe4, 0x27, 0xb0, 0x3f, 0x0f, 0x8d, 0x43, 0x18, 0xee, 0xe2, 0x73, 0x77, 0x33, 0x85, 0x1c, 0x5d, 0x2c, 0x91, 0x66, 0x30, 0xaf, 0xc2, 0x60, 0x36, + 0xdd, 0xb5, 0xcc, 0xc7, 0xb3, 0x30, 0x9b, 0x65, 0xf3, 0xaa, 0xf5, 0xc9, 0x29, 0x41, 0x25, 0x4d, 0xea, 0x23, 0x62, 0x6b, 0x00, 0x91, 0x1a, 0x4b, 0xc8, 0x5c, 0xa6, 0x11, 0xd4, 0xd8, 0xa6, 0x3e, 0x63, 0x90, 0x1a, 0x4c, 0xf0, 0xa4, 0x8f, 0xfa, 0x5e, 0x07, 0xa9, 0x5a, 0x3c, 0xdf, 0xf5, 0x7f, 0x58, 0x52, 0x97, 0xd7, 0xd9, 0xdd, 0xb6, 0x08, 0x6b, 0x38, 0x93, 0xbf, 0x1d, 0x6c, 0x8d, 0x7e, 0x14, 0x4c, 0x5d, 0x29, 0x76, 0x87, 0xbe, 0xd5, 0x0f, 0x0a, 0x05, 0x68, 0xac, 0x86, 0x25, 0x80, 0x20, 0x15, 0x04, 0xab, 0x46, 0xc4, 0x9d, 0xd0, 0x48, 0x32, 0x4f, 0x4c, 0x6f, 0xe6, 0xda, 0x95, 0xd9, 0x3e, 0xcf, 0x03, 0x84, 0x5f, 0xd4, 0x83, 0xde, 0xf6, 0x43, 0xf5, 0x0b, 0x5b, 0xef, 0x1f, 0xf1, 0x78, 0xf7, 0xfd, 0x63, 0xe9, 0xba, 0x1b, 0xf0, 0x56, 0xc6, 0x21, 0xf1, 0x73, 0xd7, 0x19, 0xf2, 0x9e, 0x14, 0x27, 0x4d, 0xac, 0xeb, 0x91, 0xd6, 0xf0, 0xb8, 0x88, 0xd8, 0x2f, 0x17, 0xeb, 0xb2, 0x2e, 0x2a, 0x69, 0xe6, 0xc3, 0x1d, 0xaa, 0x25, 0xb9, 0xaf, 0xeb, 0xc2, 0xc4, 0x54, 0x44, 0x4c, 0xd8, 0x58, 0x97, 0xa5, 0x05, 0x47, 0x47, 0x2a, 0xfb, 0x4b, 0xb5, 0x69, 0x46, 0xb9, 0x41, 0xea, 0x3c, 0x8e, 0x4d, 0xf5, 0xde, 0xba, 0x44, 0x3b, 0x6a, 0x1d, 0x86, 0x00, 0x03, 0x05, 0x44, 0x8e, 0x88, 0xf6, 0xc9, 0xb6, 0x10, 0x11, 0x34, 0x39, 0x0a, 0x56, 0xa5, 0x2c, 0x90, 0xce, 0x3e, 0x24, 0x47, 0xcc, 0x45, 0xe0, 0x67, 0x04, 0x07, 0xd2, 0xe0, 0x08, 0x28, 0x5d, 0xea, 0x36, 0xc7, 0x50, 0x35, 0xfe, 0x7a, 0x5a, 0xb5, 0xbb, 0xe4, 0x19, 0xcf, 0x0c, 0xcf, 0x4a, 0xd2, 0x3b, 0xe5, 0x45, 0xce, 0x59, 0x7b, 0xf3, 0x49, 0x7d, 0x7f, 0xa8, 0x73, 0xa3, 0x40, 0xb6, 0x69, 0x53, 0x63, + 0x72, 0xc5, 0xc3, 0x63, 0x51, 0xcf, 0x92, 0x20, 0xd4, 0x2f, 0xb4, 0x18, 0x57, 0x63, 0xc6, 0x40, 0x52, 0xdf, 0x7a, 0x56, 0xf4, 0xf0, 0x16, 0xb3, 0x06, 0xc4, 0xe8, 0x38, 0xeb, 0x34, 0xf4, 0xca, 0x5f, 0x53, 0x99, 0x86, 0x1b, 0xe5, 0x70, 0x77, 0x88, 0xa0, 0xa6, 0xd8, 0xe0, 0x12, 0x3e, 0xe5, 0x17, 0x18, 0xfd, 0x07, 0x71, 0x0b, 0x73, 0xfe, 0x2d, 0x0c, 0xd1, 0xf6, 0x62, 0xa5, 0x5e, 0x99, 0xda, 0xbd, 0x8d, 0xf6, 0x1b, 0x9d, 0x33, 0x57, 0x3b, 0x73, 0x6d, 0x92, 0xae, 0x62, 0x72, 0x66, 0x3f, 0x4b, 0x76, 0x90, 0x05, 0xf3, 0xb2, 0x0a, 0xda, 0xcf, 0xd7, 0xb1, 0x08, 0x6c, 0xc3, 0x9e, 0xf1, 0x41, 0x25, 0x3e, 0x98, 0x3a, 0xd9, 0x23, 0x50, 0x0b, 0x19, 0xdb, 0x03, 0x83, 0x8a, 0x24, 0x17, 0x84, 0x83, 0xbf, 0x52, 0xb1, 0x88, 0x6f, 0x09, 0x6a, 0x16, 0x75, 0x71, 0xae, 0xe7, 0x4d, 0x9f, 0x3d, 0xd3, 0xa9, 0x9f, 0xf4, 0x04, 0x57, 0xe7, 0xf8, 0xde, 0xf3, 0x27, 0xfb, 0x72, 0x1e, 0x6a, 0x5c, 0x33, 0x39, 0xc7, 0xc2, 0xf8, 0x7f, 0x45, 0x5d, 0x9c, 0xe3, 0xf3, 0xc7, 0xc3, 0xa2, 0x49, 0x91, 0xd4, 0x2e, 0x0f, 0x44, 0x65, 0x1b, 0xad, 0x5f, 0x5c, 0x1d, 0x04, 0x14, 0xb2, 0x37, 0x9c, 0x48, 0xb4, 0x95, 0x78, 0x03, 0x07, 0xe8, 0xfc, 0xdb, 0x5a, 0xda, 0xa2, 0x5d, 0xf3, 0xec, 0x86, 0x05, 0xbf, 0x4a, 0xe1, 0x6d, 0x47, 0x7d, 0x14, 0x8e, 0x36, 0xbe, 0xb6, 0x80, 0x91, 0xdb, 0x02, 0xce, 0x52, 0x71, 0xeb, 0x46, 0x61, 0xf9, 0x5a, 0x14, 0xc8, 0x0b, 0xd9, 0x42, 0x0e, 0x1d, 0x23, 0x8e, 0x93, 0x27, 0x03, 0xf9, 0x4a, 0x6e, 0x2a, 0xd2, 0x1f, 0xac, 0x84, 0x12, 0x46, 0xad, 0x02, 0xa5, 0x1f, 0x7e, 0x99, 0xd4, 0x87, 0x7d, 0x9e, 0x46, 0xe4, 0x06, 0xa4, 0x05, 0x62, 0xc1, + 0xf3, 0xb8, 0x0f, 0xe4, 0x08, 0x2c, 0x7b, 0xbd, 0x3c, 0xbd, 0xfc, 0x08, 0x8c, 0x69, 0xb9, 0x94, 0xa6, 0x2e, 0x60, 0x83, 0x32, 0x15, 0x71, 0x7b, 0x10, 0xe8, 0x23, 0x58, 0x86, 0xb6, 0x0b, 0x14, 0x91, 0x1e, 0x38, 0x68, 0xf6, 0x5d, 0xa9, 0x27, 0x7f, 0x1c, 0xf2, 0xd3, 0x7e, 0x24, 0xc1, 0xe1, 0x36, 0xbc, 0x80, 0x18, 0x2e, 0xb3, 0xff, 0xf1, 0x0a, 0x02, 0x22, 0xd6, 0x81, 0xf5, 0x43, 0x60, 0xd6, 0x7b, 0x79, 0x4a, 0x12, 0x0f, 0x10, 0x83, 0x7d, 0xf7, 0x32, 0x8f, 0x40, 0x8e, 0x06, 0xc1, 0x35, 0x23, 0x8f, 0x14, 0xa0, 0x89, 0xeb, 0x20, 0x1c, 0xc7, 0xc8, 0x24, 0x8a, 0xa4, 0xdb, 0xc4, 0x87, 0x44, 0xa1, 0x30, 0xee, 0x0b, 0x03, 0xe1, 0x88, 0x1b, 0x7f, 0x72, 0x00, 0x23, 0xd7, 0x58, 0x55, 0x39, 0x00, 0x71, 0x5a, 0xaa, 0xf2, 0x15, 0x6f, 0xe8, 0x1d, 0x9e, 0x56, 0x9b, 0x0a, 0x17, 0xe5, 0xca, 0x57, 0xa6, 0x51, 0x28, 0xf4, 0x68, 0xe7, 0xc0, 0x85, 0x05, 0xe0, 0xb0, 0x03, 0xcf, 0x0e, 0x6e, 0x29, 0xe9, 0x51, 0x61, 0x57, 0xb9, 0x72, 0x78, 0xae, 0x32, 0x73, 0x65, 0x2e, 0xc7, 0x3f, 0x4a, 0xc6, 0x29, 0x04, 0xe7, 0x65, 0x09, 0x64, 0xcf, 0x25, 0x25, 0xcc, 0x43, 0x3f, 0xfc, 0xfd, 0x0a, 0x41, 0x6f, 0xb9, 0x98, 0x21, 0x39, 0x3e, 0xe9, 0x2b, 0x22, 0x35, 0x42, 0x21, 0x61, 0x98, 0xcb, 0x5f, 0x94, 0x19, 0x7f, 0xd1, 0xdb, 0x48, 0xfd, 0xd8, 0x81, 0xb8, 0x65, 0x28, 0x30, 0x49, 0xf7, 0x06, 0x4c, 0x3b, 0x78, 0x05, 0x76, 0x06, 0x38, 0x31, 0xb1, 0x02, 0x8a, 0xe5, 0x7a, 0x3d, 0x2a, 0x72, 0xc8, 0xee, 0x84, 0xcd, 0xac, 0x58, 0x11, 0xee, 0x6a, 0xb0, 0x32, 0xda, 0x06, 0x09, 0x0b, 0x66, 0x80, 0x4b, 0xac, 0xea, 0x8f, 0x17, 0x3a, 0x29, 0xb3, 0x1b, 0x83, 0x9c, 0x25, + 0xfc, 0x48, 0xd3, 0x12, 0x57, 0x1e, 0x7f, 0xe2, 0x81, 0xfc, 0x83, 0x15, 0xc6, 0xa9, 0x70, 0x75, 0xa0, 0xe1, 0xa4, 0xf5, 0x4b, 0x98, 0x5e, 0x49, 0x38, 0x94, 0x3a, 0x17, 0x98, 0x60, 0x51, 0x7e, 0x3c, 0x88, 0x23, 0x31, 0xc5, 0x05, 0x25, 0x56, 0xd3, 0x23, 0xc3, 0x67, 0x82, 0x5e, 0x86, 0xc4, 0x34, 0x9c, 0xaf, 0xb0, 0x25, 0x53, 0x52, 0xe5, 0xda, 0x06, 0x34, 0xab, 0x1c, 0x51, 0xb1, 0xf8, 0x4b, 0x01, 0xce, 0xa1, 0x4e, 0x91, 0x7c, 0xff, 0x23, 0x28, 0xe6, 0x90, 0xc8, 0xcd, 0x00, 0xbf, 0xe3, 0x9b, 0x0b, 0x5a, 0x7e, 0xd8, 0x63, 0x78, 0xa3, 0xaa, 0x91, 0x31, 0x28, 0x23, 0xc7, 0xb1, 0x2a, 0x62, 0x48, 0x37, 0x90, 0x2c, 0xd1, 0x79, 0x63, 0x0a, 0xec, 0xf7, 0x6f, 0xb0, 0xc7, 0x74, 0x4f, 0xf2, 0xa6, 0x2a, 0x77, 0x6f, 0xb1, 0xe3, 0x1e, 0x47, 0x3f, 0x9d, 0x4b, 0xea, 0x22, 0x67, 0x63, 0xdf, 0x18, 0xbb, 0x28, 0x1b, 0x75, 0x69, 0xc1, 0x61, 0xc3, 0x39, 0xb7, 0xb2, 0x34, 0x01, 0x71, 0x09, 0x9c, 0x8f, 0xa9, 0xb5, 0x6b, 0xa6, 0x5d, 0xd6, 0x4f, 0x88, 0x97, 0x9e, 0xd5, 0xdc, 0x7c, 0x9a, 0x19, 0x84, 0x89, 0x54, 0x38, 0x6a, 0xf1, 0x4c, 0x8b, 0x74, 0x4b, 0x84, 0x4c, 0xee, 0x66, 0x6e, 0x18, 0x9c, 0x16, 0x12, 0xec, 0x09, 0xe8, 0xa0, 0x0d, 0xb9, 0x69, 0x28, 0xb9, 0xd7, 0x21, 0xb6, 0x85, 0x83, 0x55, 0xaf, 0x57, 0xee, 0x11, 0x01, 0x0e, 0x1a, 0x2b, 0x3d, 0x40, 0xf2, 0xa0, 0xb8, 0xf1, 0xc3, 0xcb, 0x4c, 0xb0, 0xff, 0xce, 0x87, 0xa8, 0xd3, 0x36, 0x57, 0x0c, 0xc5, 0x23, 0xd2, 0xa5, 0x4e, 0x13, 0x35, 0x17, 0xa1, 0x91, 0x4f, 0xc3, 0x95, 0xa7, 0x41, 0x3d, 0x73, 0xa3, 0xb7, 0x9b, 0xdf, 0x20, 0x98, 0x8f, 0x0f, 0x2f, 0xd8, 0xd7, 0x9e, 0x9b, 0xdd, 0x9b, 0x80, + 0xe0, 0x90, 0xa8, 0x70, 0x12, 0x57, 0xee, 0xbb, 0xf2, 0x48, 0x59, 0xf3, 0x73, 0x59, 0x13, 0x9a, 0x27, 0x3a, 0x00, 0xc8, 0x4c, 0xf3, 0x18, 0xe7, 0x6a, 0x18, 0xda, 0xde, 0xd5, 0xb1, 0xe5, 0x1f, 0x55, 0x11, 0xd6, 0x2a, 0x07, 0x6a, 0x00, 0x2f, 0xc0, 0x03, 0xd0, 0x89, 0x0f, 0x40, 0xfd, 0x67, 0xca, 0xf6, 0xd3, 0xda, 0x80, 0x5c, 0x40, 0xe2, 0x94, 0xf2, 0xc4, 0xe4, 0xde, 0xf5, 0xc2, 0x46, 0x9c, 0xca, 0xed, 0xbc, 0xe4, 0xf0, 0xea, 0x21, 0xba, 0xbb, 0xca, 0x30, 0x80, 0x0e, 0x38, 0x1e, 0xa6, 0xf5, 0x46, 0x24, 0x10, 0xd5, 0x60, 0x70, 0x10, 0x23, 0x30, 0x02, 0xd3, 0xc4, 0x0f, 0x63, 0x0b, 0xd6, 0x3a, 0xa8, 0x6c, 0xe2, 0x37, 0x32, 0x61, 0x9d, 0x07, 0xa7, 0xd6, 0x07, 0xbd, 0x3b, 0xdb, 0x60, 0x1f, 0x16, 0x53, 0xbb, 0x29, 0x37, 0x9a, 0x4e, 0xea, 0xcd, 0x1f, 0x54, 0x40, 0x6e, 0x41, 0xf1, 0x9f, 0x01, 0xf3, 0x00, 0xad, 0xb1, 0x23, 0x0a, 0xfa, 0x07, 0x04, 0xc1, 0xbf, 0xeb, 0x21, 0xfe, 0x71, 0xee, 0x72, 0xf1, 0x04, 0x05, 0x69, 0x8a, 0xc3, 0x25, 0x16, 0xc4, 0xd7, 0xc3, 0xbe, 0xa1, 0xe7, 0x0f, 0xf1, 0x7d, 0x95, 0x2e, 0x32, 0xbf, 0xb1, 0x28, 0xda, 0x1d, 0xc1, 0x02, 0xf9, 0x53, 0x86, 0x70, 0x46, 0xfb, 0x82, 0xa6, 0xd4, 0x9a, 0xe0, 0x14, 0xd3, 0x5a, 0xab, 0x6f, 0xa1, 0x08, 0xe2, 0x85, 0x45, 0xfc, 0xb9, 0xe1, 0xa9, 0x32, 0x80, 0xd2, 0x22, 0x3b, 0x64, 0xff, 0x5e, 0x5e, 0xe1, 0xa8, 0x55, 0x18, 0xc5, 0xf7, 0x2c, 0x0f, 0x44, 0x70, 0x41, 0x6e, 0x05, 0x2c, 0xa0, 0xd4, 0x52, 0x28, 0x18, 0xec, 0xf6, 0xa7, 0x38, 0x75, 0x49, 0x34, 0xdc, 0x0f, 0x96, 0x1d, 0xaf, 0x8f, 0xdf, 0xa0, 0x6a, 0x7e, 0x42, 0x83, 0xf4, 0xfc, 0xf2, 0xce, 0x71, 0xc7, 0xae, 0x15, + 0x53, 0x22, 0x7b, 0x07, 0xb3, 0x19, 0x60, 0x2c, 0x6c, 0x60, 0xf3, 0x93, 0x58, 0x81, 0xa4, 0x60, 0x45, 0x0a, 0xcb, 0x6b, 0x28, 0x68, 0xfc, 0x9f, 0x71, 0x24, 0x57, 0x30, 0x94, 0x46, 0xcb, 0x08, 0xfe, 0x66, 0x33, 0x8b, 0xca, 0x95, 0x02, 0xae, 0xff, 0x88, 0xd3, 0x4a, 0x55, 0x36, 0x9b, 0x4c, 0x55, 0x72, 0x3b, 0x3e, 0x47, 0xe6, 0xf3, 0x43, 0x80, 0x99, 0xba, 0x23, 0x56, 0xa8, 0xa7, 0x06, 0x99, 0x0e, 0xbc, 0x5c, 0xa5, 0x1f, 0xae, 0x91, 0x8b, 0x40, 0xfb, 0x0f, 0x66, 0xb6, 0xf9, 0x12, 0xaf, 0xf7, 0xde, 0x67, 0x84, 0x1e, 0x55, 0x93, 0x01, 0x42, 0x8a, 0x62, 0xc7, 0x17, 0x14, 0xf6, 0x99, 0x0d, 0x30, 0x93, 0xea, 0xa7, 0xef, 0x28, 0x3d, 0x18, 0x7a, 0xbf, 0xd7, 0x45, 0x94, 0xd3, 0x5b, 0x79, 0x84, 0xbe, 0x1d, 0xf3, 0xf1, 0x8b, 0xdf, 0xd6, 0xa0, 0x15, 0xeb, 0xa8, 0x6f, 0x5c, 0x7d, 0x05, 0xe7, 0x57, 0xb2, 0x3f, 0x07, 0xfe, 0x66, 0x58, 0xf8, 0xf0, 0x2c, 0xe2, 0xa7, 0x9a, 0x1d, 0x97, 0x81, 0xdb, 0x75, 0x36, 0x0d, 0x1b, 0x5b, 0x79, 0xce, 0x1c, 0xda, 0x1c, 0x83, 0xea, 0x56, 0x47, 0xd1, 0x7d, 0xe3, 0xd2, 0xc4, 0x49, 0xd3, 0x0d, 0x6a, 0x62, 0x69, 0xc5, 0x02, 0xba, 0x39, 0x4c, 0x60, 0x5f, 0x5a, 0x96, 0x43, 0x88, 0xba, 0x6d, 0xba, 0xb1, 0x76, 0xa9, 0xde, 0x72, 0xd0, 0xd8, 0x1c, 0xf2, 0x30, 0x0d, 0x53, 0x23, 0xa5, 0x75, 0xf9, 0x9e, 0x68, 0xe7, 0x64, 0x62, 0xa3, 0x71, 0x34, 0x90, 0xb0, 0xdc, 0x3b, 0x4c, 0xf7, 0x8a, 0xad, 0x06, 0xa1, 0xdc, 0x4f, 0x7a, 0x34, 0x3c, 0x4f, 0x8f, 0x67, 0xe8, 0x15, 0x02, 0xfb, 0x36, 0xdf, 0x12, 0xde, 0xac, 0x23, 0x07, 0x48, 0x16, 0x78, 0x86, 0x9b, 0xf3, 0x17, 0xf2, 0x34, 0xcf, 0x11, 0xe9, 0x94, 0x64, 0x68, 0x44, + 0x06, 0x64, 0xaa, 0x91, 0x28, 0x30, 0xff, 0xe8, 0xa9, 0xd4, 0xe6, 0x25, 0x7c, 0x68, 0xb2, 0x34, 0x6b, 0xf8, 0xa3, 0xe2, 0x72, 0x03, 0x14, 0x09, 0xc2, 0x21, 0xfa, 0xfa, 0x64, 0x15, 0xc4, 0x4f, 0x0b, 0xbb, 0x23, 0xe3, 0xad, 0xd1, 0x2f, 0xcc, 0x60, 0xad, 0xd3, 0x89, 0x20, 0x04, 0x99, 0xf2, 0xd2, 0xe7, 0x48, 0xc4, 0x8b, 0x34, 0xba, 0xcd, 0x5e, 0xad, 0x39, 0xab, 0x83, 0x32, 0xf2, 0x0d, 0x0d, 0xf8, 0x02, 0x83, 0x16, 0x08, 0xc4, 0x07, 0x48, 0x54, 0x95, 0x49, 0x4f, 0xaf, 0xc2, 0xcf, 0xc6, 0x11, 0xad, 0x72, 0xa0, 0xef, 0x27, 0x9b, 0xa2, 0xfa, 0x3d, 0x3c, 0x21, 0x5d, 0x23, 0xe6, 0x9c, 0x70, 0x78, 0x08, 0x88, 0x5b, 0x6a, 0xaa, 0xb3, 0xf6, 0x85, 0xe5, 0x18, 0xfc, 0x4d, 0xba, 0x6a, 0x86, 0xc6, 0x16, 0xd7, 0xc2, 0x87, 0xb6, 0x2b, 0xdb, 0x02, 0x16, 0xd7, 0xce, 0x3f, 0x54, 0x86, 0xb0, 0x22, 0x17, 0x1f, 0xdc, 0xd5, 0xec, 0x7f, 0xda, 0x75, 0x46, 0x60, 0x35, 0x89, 0x9a, 0xb1, 0xc9, 0xef, 0xd6, 0xdf, 0x21, 0x88, 0xb0, 0xd4, 0x00, 0xcd, 0x45, 0x84, 0xb6, 0xbc, 0xdd, 0x0f, 0x04, 0x60, 0xd5, 0x5e, 0xbe, 0x15, 0x89, 0xb9, 0x7b, 0x39, 0x0e, 0xe3, 0xb1, 0x06, 0x0e, 0xbd, 0xbe, 0x6c, 0xe6, 0x27, 0xca, 0xcd, 0x88, 0xe7, 0x89, 0x86, 0xc2, 0x23, 0xe8, 0xb8, 0x05, 0x42, 0x66, 0x4b, 0xd0, 0x29, 0x4c, 0x22, 0x5a, 0xce, 0xe7, 0x2b, 0x28, 0x79, 0xba, 0xdc, 0x0d, 0xf0, 0x9f, 0x83, 0xeb, 0xdf, 0xf8, 0xbc, 0xc1, 0xb5, 0x97, 0xf6, 0x1c, 0x5e, 0x5d, 0x3f, 0x93, 0x7d, 0x0a, 0x37, 0xaa, 0xf9, 0x92, 0xbf, 0x25, 0x6e, 0x01, 0xf0, 0xc6, 0x21, 0x36, 0x08, 0xd1, 0x1f, 0xe2, 0x72, 0xa3, 0x4b, 0x0c, 0x11, 0x46, 0x10, 0x3e, 0x80, 0x6d, 0xeb, 0x6f, 0xe1, 0x96, + 0x51, 0xc9, 0x39, 0xec, 0x2c, 0xe1, 0xa2, 0xe4, 0x83, 0xf7, 0x65, 0x01, 0xc2, 0x14, 0xbb, 0xa5, 0xe6, 0x08, 0xea, 0x6d, 0x15, 0xa9, 0x20, 0x08, 0xec, 0xe5, 0x78, 0x0c, 0xf0, 0xbf, 0xf1, 0x45, 0xd7, 0xa4, 0xf9, 0x82, 0x9a, 0x20, 0xbe, 0x59, 0xe0, 0xc3, 0x85, 0x25, 0xf6, 0xfb, 0x4d, 0xdf, 0xe2, 0x59, 0x5d, 0x35, 0xf0, 0x48, 0x6a, 0x6c, 0x39, 0x80, 0xb7, 0xaf, 0x23, 0x9b, 0x4e, 0x9c, 0x27, 0x22, 0x10, 0x22, 0xbc, 0x5a, 0xef, 0x09, 0xfc, 0xa6, 0xb6, 0xb8, 0xc3, 0x86, 0x5c, 0xdf, 0x79, 0x37, 0xde, 0xd3, 0xa0, 0x6a, 0xe0, 0x9b, 0x17, 0xb3, 0x39, 0xd0, 0x44, 0xa6, 0xba, 0x00, 0x4c, 0xa6, 0xc1, 0x0a, 0x85, 0x61, 0xab, 0xf9, 0xdf, 0xe1, 0xbc, 0x06, 0x0a, 0x7a, 0x0f, 0x90, 0x4e, 0x27, 0xd0, 0xb9, 0x41, 0xb5, 0x21, 0xa0, 0xce, 0x37, 0x25, 0x33, 0x25, 0x65, 0x19, 0xe9, 0x26, 0xa7, 0x3e, 0x3b, 0x6e, 0xf7, 0x37, 0x51, 0x17, 0x9f, 0x16, 0xc0, 0x14, 0x8e, 0x40, 0x6b, 0x27, 0x3b, 0xb0, 0xdb, 0x4f, 0xa7, 0x3f, 0xaa, 0xe6, 0x89, 0x64, 0xf5, 0x16, 0xd9, 0x1e, 0xbc, 0x8d, 0xc7, 0x24, 0x4d, 0xd4, 0x41, 0x38, 0x0f, 0x1d, 0xdd, 0x48, 0x76, 0xe3, 0xfe, 0xef, 0xb0, 0x8c, 0x4d, 0x12, 0x77, 0xb0, 0x49, 0x6b, 0x9d, 0x12, 0xeb, 0xc7, 0x15, 0xe8, 0x09, 0x0e, 0x0f, 0xe5, 0x47, 0xbc, 0x4f, 0x59, 0x52, 0x69, 0xe7, 0x17, 0xbc, 0x5b, 0x78, 0xfb, 0x1f, 0x51, 0xb7, 0xee, 0xd3, 0xce, 0x20, 0x21, 0x8f, 0x2e, 0xc2, 0x7e, 0xcc, 0x95, 0xb8, 0xbd, 0x45, 0x13, 0xaf, 0x8a, 0x06, 0xe2, 0xb4, 0x89, 0x1c, 0xe0, 0x37, 0xdd, 0x59, 0x84, 0x92, 0xfb, 0x6e, 0xe0, 0x0a, 0x83, 0x07, 0x69, 0x06, 0xa9, 0xd0, 0x14, 0x55, 0xe5, 0xda, 0xb2, 0x0e, 0xf5, 0x61, 0x6a, 0x97, + 0x6a, 0xc3, 0x6b, 0xe7, 0xd1, 0xe6, 0xcb, 0x4a, 0x35, 0xe3, 0x8c, 0x1f, 0x98, 0x9c, 0xd5, 0x9a, 0x22, 0xb2, 0xc0, 0x82, 0xd9, 0x52, 0x45, 0x1c, 0xe8, 0xb9, 0xff, 0x26, 0xb4, 0x59, 0xe1, 0x31, 0xdb, 0x1d, 0xca, 0x9e, 0x03, 0x88, 0xfc, 0x98, 0x2a, 0x79, 0xf7, 0xa1, 0x77, 0x89, 0x81, 0x32, 0x8b, 0x90, 0x9a, 0x2f, 0xaf, 0xe8, 0x34, 0x91, 0x23, 0xd0, 0x04, 0xd9, 0x49, 0xc1, 0x37, 0x1f, 0x4b, 0x3c, 0x7f, 0xf2, 0x4f, 0x85, 0x66, 0x37, 0xda, 0xd2, 0x6b, 0x1c, 0xa2, 0x60, 0xae, 0x4d, 0xb3, 0xa1, 0xc1, 0x66, 0x44, 0x94, 0x26, 0xe0, 0xa9, 0x8d, 0x0a, 0x26, 0x18, 0x6d, 0x7f, 0xc0, 0x29, 0x74, 0x77, 0xb5, 0x14, 0xc7, 0x7a, 0x8d, 0x9e, 0x14, 0x3c, 0x54, 0xbf, 0xb1, 0x6b, 0x5d, 0xae, 0xa7, 0x56, 0x1f, 0xc7, 0x3f, 0x80, 0x38, 0x8b, 0x6a, 0x40, 0x48, 0xbb, 0xb1, 0x23, 0x69, 0x52, 0xe3, 0xb9, 0x97, 0xd3, 0xcc, 0x72, 0x72, 0x10, 0x61, 0x54, 0x74, 0xdd, 0xf2, 0x8e, 0x58, 0xe3, 0x2f, 0x55, 0x48, 0x50, 0xbf, 0xfb, 0x2f, 0x05, 0xa8, 0x4a, 0x69, 0x43, 0x5e, 0x7b, 0x48, 0xef, 0x07, 0x41, 0x39, 0x38, 0x17, 0xb1, 0xaa, 0x86, 0xe2, 0xc5, 0xb5, 0xf7, 0xf4, 0x57, 0x31, 0x1d, 0xd7, 0xf3, 0x17, 0x33, 0x56, 0x86, 0x16, 0x64, 0xf3, 0x42, 0x04, 0x19, 0x22, 0x45, 0x2f, 0x18, 0xc2, 0xf3, 0x62, 0xa1, 0x75, 0x18, 0xdf, 0xae, 0x0d, 0x51, 0x1c, 0x6f, 0x05, 0xd3, 0x6d, 0x97, 0x2f, 0xff, 0x03, 0x25, 0xc8, 0xbd, 0x72, 0xfb, 0xfd, 0x50, 0x5c, 0x4a, 0x61, 0x00, 0x58, 0xde, 0xe9, 0x70, 0xc5, 0x16, 0xbb, 0xfa, 0xc8, 0x97, 0xf8, 0x5f, 0x3e, 0x47, 0xe6, 0x89, 0x66, 0x25, 0x26, 0x93, 0x50, 0xe5, 0x43, 0x94, 0xba, 0x3f, 0x37, 0xa4, 0x9e, 0x11, 0xdc, 0x7c, 0xcd, + 0x26, 0x62, 0xfc, 0x5e, 0x79, 0xd0, 0x89, 0x39, 0xe6, 0x5e, 0xf7, 0x87, 0x80, 0xeb, 0x99, 0x9f, 0x1e, 0x0b, 0x92, 0xd5, 0x00, 0x46, 0x45, 0xb5, 0xa7, 0x69, 0xbd, 0xd4, 0x1f, 0x60, 0x2e, 0x3d, 0x7e, 0xd9, 0xe6, 0x8f, 0xb4, 0x9e, 0x32, 0xeb, 0x8a, 0xa2, 0x7f, 0x31, 0x01, 0x59, 0xc7, 0x65, 0x0a, 0x10, 0x71, 0x9f, 0x03, 0x7c, 0x86, 0x29, 0x32, 0x02, 0xae, 0x48, 0xc7, 0xbd, 0xf0, 0xf6, 0xfb, 0x53, 0x66, 0x89, 0x2a, 0xc3, 0x34, 0xca, 0x9c, 0xa4, 0x0b, 0x3a, 0x14, 0xb6, 0x92, 0xd3, 0x11, 0xd7, 0xa6, 0xab, 0xb0, 0xb5, 0x20, 0x7a, 0xe9, 0x84, 0x9a, 0x4c, 0xfb, 0x80, 0x01, 0x20, 0x02, 0x00, 0x00, 0x0a, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x0a, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x0a, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x0a, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x0a, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x0a, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x0a, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x0a, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x0a, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x74, 0x6f, 0x6d, 0x61, 0x72, 0x6b, 0x0a, 0x7b, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x7d, 0x69, 0x66, 0x80, 0x03, +}; + +const int byte_size_HPGCalc_pfb = 63877; + +BINARYFILEDUMP const HPGCalc_pfb = +{ + byte_data_HPGCalc_pfb, + byte_size_HPGCalc_pfb +}; diff --git a/src/WinLibs/FTGL/test/README.txt b/src/WinLibs/FTGL/test/README.txt new file mode 100644 index 000000000..a5d60da17 --- /dev/null +++ b/src/WinLibs/FTGL/test/README.txt @@ -0,0 +1,22 @@ +FTGL Version 2.0 + +Unit Tests. + +The unit tests in this directory are built using the cppunit unit testing +framework. cppunit is available from... +cppunit.sf.net + +Refer to that website for build and usage instructions. + +Check the 'Fontdefs.h' file or the README.txt in the font_pack directory +for the list of fonts required for the tests and where to get them from. + +The file 'demo.cpp' is for visually checking the library. It displays a +test string of characters in each font 'type'. + +Please contact me if you have any suggestions, feature requests, or problems. + + +Henry Maddocks +henryj@paradise.net.nz +http://homepages.paradise.net.nz/henryj/ diff --git a/src/WinLibs/FTGL/test/TestMain.cpp b/src/WinLibs/FTGL/test/TestMain.cpp new file mode 100644 index 000000000..db4264a98 --- /dev/null +++ b/src/WinLibs/FTGL/test/TestMain.cpp @@ -0,0 +1,44 @@ +#include +#include + +#ifdef __APPLE_CC__ + #include +#else + #include +#endif + +int main(int argc, const char* argv[]) +{ + CppUnit::TextTestRunner runner; + runner.addTest(CppUnit::TestFactoryRegistry::getRegistry().makeTest()); + + runner.run(); + + return 0; +} + + +void buildGLContext() +{ + static bool glutInitialised = false; + char* pointer; + int number; + + if( !glutInitialised) + { + glutInit( &number, &pointer); + glutInitDisplayMode(GLUT_DEPTH | GLUT_RGB | GLUT_DOUBLE | GLUT_MULTISAMPLE); + glutInitWindowPosition(0, 0); + glutInitWindowSize( 150, 150); + glutCreateWindow("FTGL TEST"); + + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + gluOrtho2D( 0.0, 150, 0.0, 150); + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + + glutInitialised = true; + } +} + diff --git a/src/WinLibs/FTGL/test/demo.cpp b/src/WinLibs/FTGL/test/demo.cpp new file mode 100644 index 000000000..6e9239a78 --- /dev/null +++ b/src/WinLibs/FTGL/test/demo.cpp @@ -0,0 +1,324 @@ +// source changed by mrn@paus.ch/ max rheiner +// original source: henryj@paradise.net.nz + +#include +#include // exit() + +#ifdef __APPLE_CC__ + #include +#else + #include +#endif + +#include "FTGLOutlineFont.h" +#include "FTGLPolygonFont.h" +#include "FTGLBitmapFont.h" +#include "FTGLTextureFont.h" +#include "FTGLPixmapFont.h" + +//#include "mmgr.h" + +static FTFont* fonts[5]; +static int width; +static int height; + + +// YOU'LL PROBABLY WANT TO CHANGE THESE +#ifdef __linux__ + #define DEFAULT_FONT "/usr/share/fonts/truetype/arial.ttf" +#endif +#ifdef __APPLE_CC__ + #define DEFAULT_FONT "/Users/henry/Development/PROJECTS/FTGL/test/font_pack/arial.ttf" +#endif +#ifdef WIN32 + #define DEFAULT_FONT "C:\\WINNT\\Fonts\\arial.ttf" +#endif + + +void +my_init( const char* font_filename ) +{ + glClearColor(0.0, 0.0, 0.0, 0.0); + glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); + + fonts[0] = new FTGLOutlineFont( font_filename); + fonts[1] = new FTGLPolygonFont( font_filename); + fonts[2] = new FTGLTextureFont( font_filename); + fonts[3] = new FTGLBitmapFont( font_filename); + fonts[4] = new FTGLPixmapFont( font_filename); + for (int i=0; i< 5; i++) + { + if (fonts[i]->Error()) + { + std::cerr << "ERROR: Unable to open file " << font_filename << std::endl; + } + else + { + std::cout << "Reading font " << i << " from " << font_filename << std::endl; + + int point_size = 48; + if (!fonts[i]->FaceSize(point_size)) + { + std::cerr << "ERROR: Unable to set font face size " << point_size << std::endl; + } + } + } +} + +static void +do_ortho() +{ + int w; + int h; + GLdouble size; + GLdouble aspect; + + w = width; + h = height; + aspect = (GLdouble)w / (GLdouble)h; + + // Use the whole window. + glViewport(0, 0, w, h); + + // We are going to do some 2-D orthographic drawing. + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + size = (GLdouble)((w >= h) ? w : h) / 2.0; + if (w <= h) { + aspect = (GLdouble)h/(GLdouble)w; + glOrtho(-size, size, -size*aspect, size*aspect, + -100000.0, 100000.0); + } + else { + aspect = (GLdouble)w/(GLdouble)h; + glOrtho(-size*aspect, size*aspect, -size, size, + -100000.0, 100000.0); + } + + // Make the world and window coordinates coincide so that 1.0 in + // model space equals one pixel in window space. + glScaled(aspect, aspect, 1.0); + + // Now determine where to draw things. + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); +} + + +void +my_reshape(int w, int h) +{ + width = w; + height = h; + + do_ortho( ); +} + +void +my_handle_key(unsigned char key, int x, int y) +{ + switch (key) { + + //!!ELLERS + case 'q': // Esc or 'q' Quits the program. + case 27: + { + for (int i=0; i<5; i++) { + if (fonts[i]) { + delete fonts[i]; + fonts[i] = 0; + } + } + exit(1); + } + break; + + default: + break; + } +} + +void +draw_scene() +{ + /* Set up some strings with the characters to draw. */ + unsigned int count = 0; + char string[8][256]; + int i; + for (i=1; i < 32; i++) { /* Skip zero - it's the null terminator! */ + string[0][count] = i; + count++; + } + string[0][count] = '\0'; + + count = 0; + for (i=32; i < 64; i++) { + string[1][count] = i; + count++; + } + string[1][count] = '\0'; + + count = 0; + for (i=64; i < 96; i++) { + string[2][count] = i; + count++; + } + string[2][count] = '\0'; + + count = 0; + for (i=96; i < 128; i++) { + string[3][count] = i; + count++; + } + string[3][count] = '\0'; + + count = 0; + for (i=128; i < 160; i++) { + string[4][count] = i; + count++; + } + string[4][count] = '\0'; + + count = 0; + for (i=160; i < 192; i++) { + string[5][count] = i; + count++; + } + string[5][count] = '\0'; + + count = 0; + for (i=192; i < 224; i++) { + string[6][count] = i; + count++; + } + string[6][count] = '\0'; + + count = 0; + for (i=224; i < 256; i++) { + string[7][count] = i; + count++; + } + string[7][count] = '\0'; + + + glColor3f(1.0, 1.0, 1.0); + + for (int font = 0; font < 5; font++) { + GLfloat x = -250.0; + GLfloat y; + GLfloat yild = 20.0; + for (int j=0; j<4; j++) { + y = 275.0-font*120.0-j*yild; + if (font >= 3) { + glRasterPos2f(x, y); + fonts[font]->Render(string[j]); + } + else { + if (font == 2) { + glEnable(GL_TEXTURE_2D); + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + } + glPushMatrix(); { + glTranslatef(x, y, 0.0); + fonts[font]->Render(string[j]); + } glPopMatrix(); + if (font == 2) { + glDisable(GL_TEXTURE_2D); + glDisable(GL_BLEND); + } + } + } + } +} + + +void +my_display(void) +{ + glClear(GL_COLOR_BUFFER_BIT); + + draw_scene(); + + glutSwapBuffers(); +} + + +void +my_idle() +{ + glutPostRedisplay(); +} + +int +file_exists( const char * fontFilePath ) +{ + FILE * fp = fopen( fontFilePath, "r" ); + + if ( fp == NULL ) + { + // That fopen failed does _not_ definitely mean the file isn't there + // but for now this is ok + return 0; + } + fclose( fp ); + return 1; +} + +void +usage( const char * program ) +{ + std::cerr << "Usage: " << program << " \n" << std::endl; +} + +int +main(int argc, char **argv) +{ + char * fontFilePath; + + glutInitWindowSize(600, 600); + glutInit(&argc, argv); + glutInitDisplayMode(GLUT_RGB|GLUT_DOUBLE); + + glutCreateWindow("FTGL demo"); + + if ( argc >= 2 ) + { + if ( !file_exists( argv[ 1 ] )) + { + usage( argv[ 0 ]); + std::cerr << "Couldn't open file '" << argv[ 1 ] << "'" << std::endl; + exit( -1 ); + } + fontFilePath = argv[ 1 ]; + } + else + { + // try a default font + fontFilePath = DEFAULT_FONT; + + if ( !file_exists( fontFilePath )) + { + usage( argv[ 0 ]); + std::cerr << "Couldn't open default file '" << fontFilePath << "'" << std::endl; + exit( -1 ); + } + } + + my_init( fontFilePath ); + + glutDisplayFunc(my_display); + glutReshapeFunc(my_reshape); + glutIdleFunc(my_idle); + glutKeyboardFunc(my_handle_key); + + glutMainLoop(); + + for(int x = 0; x < 5; ++x) + { + delete fonts[x]; + } + + return 0; +} + diff --git a/src/WinLibs/FTGL/test/font_pack/README.txt b/src/WinLibs/FTGL/test/font_pack/README.txt new file mode 100644 index 000000000..ad8a8b3b5 --- /dev/null +++ b/src/WinLibs/FTGL/test/font_pack/README.txt @@ -0,0 +1,19 @@ +FTGL Version 2.02 + +Unit Tests + +To run the unit tests the following fonts should be sourced and placed in this +directory. + +raghu.ttf is available from http://rohini.ncst.ernet.in/indix/download/font/ +HPGCalc.pfb & HPGCalc.afm are available from +http://www.geocities.com/jking_ok/font.html +LucidaSansRegular.ttf and Thoburi.ttf are part of the Java 2 SDK from IBM +times.ttf and arial.ttf are windows system fonts. + +Please contact me if you have any suggestions, feature requests, or problems. + + +Henry Maddocks +henryj@paradise.net.nz +http://homepages.paradise.net.nz/henryj/ diff --git a/src/WinLibs/FTGL/test/mmgr.cpp b/src/WinLibs/FTGL/test/mmgr.cpp new file mode 100644 index 000000000..adea83465 --- /dev/null +++ b/src/WinLibs/FTGL/test/mmgr.cpp @@ -0,0 +1,1742 @@ +// --------------------------------------------------------------------------------------------------------------------------------- +// +// +// _ __ ___ _ __ ___ __ _ _ __ ___ _ __ _ __ +// | '_ ` _ \| '_ ` _ \ / _` | '__| / __| '_ \| '_ \ +// | | | | | | | | | | | (_| | | _ | (__| |_) | |_) | +// |_| |_| |_|_| |_| |_|\__, |_| (_) \___| .__/| .__/ +// __/ | | | | | +// |___/ |_| |_| +// +// Memory manager & tracking software +// +// Best viewed with 8-character tabs and (at least) 132 columns +// +// --------------------------------------------------------------------------------------------------------------------------------- +// +// Restrictions & freedoms pertaining to usage and redistribution of this software: +// +// * This software is 100% free +// * If you use this software (in part or in whole) you must credit the author. +// * This software may not be re-distributed (in part or in whole) in a modified +// form without clear documentation on how to obtain a copy of the original work. +// * You may not use this software to directly or indirectly cause harm to others. +// * This software is provided as-is and without warrantee. Use at your own risk. +// +// For more information, visit HTTP://www.FluidStudios.com +// +// --------------------------------------------------------------------------------------------------------------------------------- +// Originally created on 12/22/2000 by Paul Nettle +// +// Copyright 2000, Fluid Studios, Inc., all rights reserved. +// --------------------------------------------------------------------------------------------------------------------------------- +// +// !!IMPORTANT!! +// +// This software is self-documented with periodic comments. Before you start using this software, perform a search for the string +// "-DOC-" to locate pertinent information about how to use this software. +// +// You are also encouraged to read the comment blocks throughout this source file. They will help you understand how this memory +// tracking software works, so you can better utilize it within your applications. +// +// NOTES: +// +// 1. This code purposely uses no external routines that allocate RAM (other than the raw allocation routines, such as malloc). We +// do this because we want this to be as self-contained as possible. As an example, we don't use assert, because when running +// under WIN32, the assert brings up a dialog box, which allocates RAM. Doing this in the middle of an allocation would be bad. +// +// 2. When trying to override new/delete under MFC (which has its own version of global new/delete) the linker will complain. In +// order to fix this error, use the compiler option: /FORCE, which will force it to build an executable even with linker errors. +// Be sure to check those errors each time you compile, otherwise, you may miss a valid linker error. +// +// 3. If you see something that looks odd to you or seems like a strange way of going about doing something, then consider that this +// code was carefully thought out. If something looks odd, then just assume I've got a good reason for doing it that way (an +// example is the use of the class MemStaticTimeTracker.) +// +// 4. With MFC applications, you will need to comment out any occurance of "#define new DEBUG_NEW" from all source files. +// +// 5. Include file dependencies are _very_important_ for getting the MMGR to integrate nicely into your application. Be careful if +// you're including standard includes from within your own project inclues; that will break this very specific dependency order. +// It should look like this: +// +// #include // Standard includes MUST come first +// #include // +// #include // +// +// #include "mmgr.h" // mmgr.h MUST come next +// +// #include "myfile1.h" // Project includes MUST come last +// #include "myfile2.h" // +// #include "myfile3.h" // +// +// --------------------------------------------------------------------------------------------------------------------------------- + +//#include "stdafx.h" +#include +#include +#include +#include +#include +#include +#include +#include + +#ifndef WIN32 +#include +#endif + +#include "mmgr.h" + +// --------------------------------------------------------------------------------------------------------------------------------- +// -DOC- If you're like me, it's hard to gain trust in foreign code. This memory manager will try to INDUCE your code to crash (for +// very good reasons... like making bugs obvious as early as possible.) Some people may be inclined to remove this memory tracking +// software if it causes crashes that didn't exist previously. In reality, these new crashes are the BEST reason for using this +// software! +// +// Whether this software causes your application to crash, or if it reports errors, you need to be able to TRUST this software. To +// this end, you are given some very simple debugging tools. +// +// The quickest way to locate problems is to enable the STRESS_TEST macro (below.) This should catch 95% of the crashes before they +// occur by validating every allocation each time this memory manager performs an allocation function. If that doesn't work, keep +// reading... +// +// If you enable the TEST_MEMORY_MANAGER #define (below), this memory manager will log an entry in the memory.log file each time it +// enters and exits one of its primary allocation handling routines. Each call that succeeds should place an "ENTER" and an "EXIT" +// into the log. If the program crashes within the memory manager, it will log an "ENTER", but not an "EXIT". The log will also +// report the name of the routine. +// +// Just because this memory manager crashes does not mean that there is a bug here! First, an application could inadvertantly damage +// the heap, causing malloc(), realloc() or free() to crash. Also, an application could inadvertantly damage some of the memory used +// by this memory tracking software, causing it to crash in much the same way that a damaged heap would affect the standard +// allocation routines. +// +// In the event of a crash within this code, the first thing you'll want to do is to locate the actual line of code that is +// crashing. You can do this by adding log() entries throughout the routine that crashes, repeating this process until you narrow +// in on the offending line of code. If the crash happens in a standard C allocation routine (i.e. malloc, realloc or free) don't +// bother contacting me, your application has damaged the heap. You can help find the culprit in your code by enabling the +// STRESS_TEST macro (below.) +// +// If you truely suspect a bug in this memory manager (and you had better be sure about it! :) you can contact me at +// midnight@FluidStudios.com. Before you do, however, check for a newer version at: +// +// http://www.FluidStudios.com/publications.html +// +// When using this debugging aid, make sure that you are NOT setting the alwaysLogAll variable on, otherwise the log could be +// cluttered and hard to read. +// --------------------------------------------------------------------------------------------------------------------------------- + +//#define TEST_MEMORY_MANAGER + +// --------------------------------------------------------------------------------------------------------------------------------- +// -DOC- Enable this sucker if you really want to stress-test your app's memory usage, or to help find hard-to-find bugs +// --------------------------------------------------------------------------------------------------------------------------------- + +#define STRESS_TEST + +// --------------------------------------------------------------------------------------------------------------------------------- +// -DOC- Enable this sucker if you want to stress-test your app's error-handling. Set RANDOM_FAIL to the percentage of failures you +// want to test with (0 = none, >100 = all failures). +// --------------------------------------------------------------------------------------------------------------------------------- + +//#define RANDOM_FAILURE 10.0 + +// --------------------------------------------------------------------------------------------------------------------------------- +// -DOC- Locals -- modify these flags to suit your needs +// --------------------------------------------------------------------------------------------------------------------------------- + +#ifdef STRESS_TEST + static const unsigned int hashBits = 12; + static bool randomWipe = true; + static bool alwaysValidateAll = true; + static bool alwaysLogAll = true; + static bool alwaysWipeAll = true; + static bool cleanupLogOnFirstRun = true; + static const unsigned int paddingSize = 1024; // An extra 8K per allocation! +#else + static const unsigned int hashBits = 12; + static bool randomWipe = false; + static bool alwaysValidateAll = false; + static bool alwaysLogAll = false; + static bool alwaysWipeAll = true; + static bool cleanupLogOnFirstRun = true; + static const unsigned int paddingSize = 4; +#endif + +// --------------------------------------------------------------------------------------------------------------------------------- +// We define our own assert, because we don't want to bring up an assertion dialog, since that allocates RAM. Our new assert +// simply declares a forced breakpoint. +// +// The BEOS assert added by Arvid Norberg . +// --------------------------------------------------------------------------------------------------------------------------------- + +#ifdef WIN32 + #ifdef _DEBUG + #define m_assert(x) if ((x) == false) __asm { int 3 } + #else + #define m_assert(x) {} + #endif +#elif defined(__BEOS__) + #ifdef DEBUG + extern void debugger(const char *message); + #define m_assert(x) if ((x) == false) debugger("mmgr: assert failed") + #else + #define m_assert(x) {} + #endif +#else // Linux uses assert, which we can use safely, since it doesn't bring up a dialog within the program. + #define m_assert(cond) assert(cond) +#endif + +// --------------------------------------------------------------------------------------------------------------------------------- +// Here, we turn off our macros because any place in this source file where the word 'new' or the word 'delete' (etc.) +// appear will be expanded by the macro. So to avoid problems using them within this source file, we'll just #undef them. +// --------------------------------------------------------------------------------------------------------------------------------- + +#undef new +#undef delete +#undef malloc +#undef calloc +#undef realloc +#undef free + +// --------------------------------------------------------------------------------------------------------------------------------- +// Defaults for the constants & statics in the MemoryManager class +// --------------------------------------------------------------------------------------------------------------------------------- + +const unsigned int m_alloc_unknown = 0; +const unsigned int m_alloc_new = 1; +const unsigned int m_alloc_new_array = 2; +const unsigned int m_alloc_malloc = 3; +const unsigned int m_alloc_calloc = 4; +const unsigned int m_alloc_realloc = 5; +const unsigned int m_alloc_delete = 6; +const unsigned int m_alloc_delete_array = 7; +const unsigned int m_alloc_free = 8; + +// --------------------------------------------------------------------------------------------------------------------------------- +// -DOC- Get to know these values. They represent the values that will be used to fill unused and deallocated RAM. +// --------------------------------------------------------------------------------------------------------------------------------- + +static unsigned int prefixPattern = 0xbaadf00d; // Fill pattern for bytes preceeding allocated blocks +static unsigned int postfixPattern = 0xdeadc0de; // Fill pattern for bytes following allocated blocks +static unsigned int unusedPattern = 0xfeedface; // Fill pattern for freshly allocated blocks +static unsigned int releasedPattern = 0xdeadbeef; // Fill pattern for deallocated blocks + +// --------------------------------------------------------------------------------------------------------------------------------- +// Other locals +// --------------------------------------------------------------------------------------------------------------------------------- + +static const unsigned int hashSize = 1 << hashBits; +static const char *allocationTypes[] = {"Unknown", + "new", "new[]", "malloc", "calloc", + "realloc", "delete", "delete[]", "free"}; +static sAllocUnit *hashTable[hashSize]; +static sAllocUnit *reservoir; +static unsigned int currentAllocationCount = 0; +static unsigned int breakOnAllocationCount = 0; +static sMStats stats; +static const char *sourceFile = "??"; +static const char *sourceFunc = "??"; +static unsigned int sourceLine = 0; +static bool staticDeinitTime = false; +static sAllocUnit **reservoirBuffer = NULL; +static unsigned int reservoirBufferSize = 0; +static const char *memoryLogFile = "memory.log"; +static const char *memoryLeakLogFile = "memleaks.log"; +static void doCleanupLogOnFirstRun(); + +// --------------------------------------------------------------------------------------------------------------------------------- +// Local functions only +// --------------------------------------------------------------------------------------------------------------------------------- + +static void log(const char *format, ...) +{ + // Build the buffer + + static char buffer[2048]; + va_list ap; + va_start(ap, format); + vsprintf(buffer, format, ap); + va_end(ap); + + // Cleanup the log? + + if (cleanupLogOnFirstRun) doCleanupLogOnFirstRun(); + + // Open the log file + + FILE *fp = fopen(memoryLogFile, "ab"); + + // If you hit this assert, then the memory logger is unable to log information to a file (can't open the file for some + // reason.) You can interrogate the variable 'buffer' to see what was supposed to be logged (but won't be.) + m_assert(fp); + + if (!fp) return; + + // Spit out the data to the log + + fprintf(fp, "%s\r\n", buffer); + fclose(fp); +} + +// --------------------------------------------------------------------------------------------------------------------------------- + +static void doCleanupLogOnFirstRun() +{ + if (cleanupLogOnFirstRun) + { + unlink(memoryLogFile); + cleanupLogOnFirstRun = false; + + // Print a header for the log + + time_t t = time(NULL); + log("--------------------------------------------------------------------------------"); + log(""); + log(" %s - Memory logging file created on %s", memoryLogFile, asctime(localtime(&t))); + log("--------------------------------------------------------------------------------"); + log(""); + log("This file contains a log of all memory operations performed during the last run."); + log(""); + log("Interrogate this file to track errors or to help track down memory-related"); + log("issues. You can do this by tracing the allocations performed by a specific owner"); + log("or by tracking a specific address through a series of allocations and"); + log("reallocations."); + log(""); + log("There is a lot of useful information here which, when used creatively, can be"); + log("extremely helpful."); + log(""); + log("Note that the following guides are used throughout this file:"); + log(""); + log(" [!] - Error"); + log(" [+] - Allocation"); + log(" [~] - Reallocation"); + log(" [-] - Deallocation"); + log(" [I] - Generic information"); + log(" [F] - Failure induced for the purpose of stress-testing your application"); + log(" [D] - Information used for debugging this memory manager"); + log(""); + log("...so, to find all errors in the file, search for \"[!]\""); + log(""); + log("--------------------------------------------------------------------------------"); + } +} + +// --------------------------------------------------------------------------------------------------------------------------------- + +static const char *sourceFileStripper(const char *sourceFile) +{ + char *ptr = strrchr(sourceFile, '\\'); + if (ptr) return ptr + 1; + ptr = strrchr(sourceFile, '/'); + if (ptr) return ptr + 1; + return sourceFile; +} + +// --------------------------------------------------------------------------------------------------------------------------------- + +static const char *ownerString(const char *sourceFile, const unsigned int sourceLine, const char *sourceFunc) +{ + static char str[90]; + memset(str, 0, sizeof(str)); + sprintf(str, "%s(%05d)::%s", sourceFileStripper(sourceFile), sourceLine, sourceFunc); + return str; +} + +// --------------------------------------------------------------------------------------------------------------------------------- + +static const char *insertCommas(unsigned int value) +{ + static char str[30]; + memset(str, 0, sizeof(str)); + + sprintf(str, "%u", value); + if (strlen(str) > 3) + { + memmove(&str[strlen(str)-3], &str[strlen(str)-4], 4); + str[strlen(str) - 4] = ','; + } + if (strlen(str) > 7) + { + memmove(&str[strlen(str)-7], &str[strlen(str)-8], 8); + str[strlen(str) - 8] = ','; + } + if (strlen(str) > 11) + { + memmove(&str[strlen(str)-11], &str[strlen(str)-12], 12); + str[strlen(str) - 12] = ','; + } + + return str; +} + +// --------------------------------------------------------------------------------------------------------------------------------- + +static const char *memorySizeString(unsigned long size) +{ + static char str[90]; + if (size > (1024*1024)) sprintf(str, "%10s (%7.2fM)", insertCommas(size), (float) size / (1024.0f * 1024.0f)); + else if (size > 1024) sprintf(str, "%10s (%7.2fK)", insertCommas(size), (float) size / 1024.0f); + else sprintf(str, "%10s bytes ", insertCommas(size)); + return str; +} + +// --------------------------------------------------------------------------------------------------------------------------------- + +static sAllocUnit *findAllocUnit(const void *reportedAddress) +{ + // Just in case... + m_assert(reportedAddress != NULL); + + // Use the address to locate the hash index. Note that we shift off the lower four bits. This is because most allocated + // addresses will be on four-, eight- or even sixteen-byte boundaries. If we didn't do this, the hash index would not have + // very good coverage. + + unsigned int hashIndex = ((unsigned int) reportedAddress >> 4) & (hashSize - 1); + sAllocUnit *ptr = hashTable[hashIndex]; + while(ptr) + { + if (ptr->reportedAddress == reportedAddress) return ptr; + ptr = ptr->next; + } + + return NULL; +} + +// --------------------------------------------------------------------------------------------------------------------------------- + +static size_t calculateActualSize(const size_t reportedSize) +{ + // We use DWORDS as our padding, and a long is guaranteed to be 4 bytes, but an int is not (ANSI defines an int as + // being the standard word size for a processor; on a 32-bit machine, that's 4 bytes, but on a 64-bit machine, it's + // 8 bytes, which means an int can actually be larger than a long.) + + return reportedSize + paddingSize * sizeof(long) * 2; +} + +// --------------------------------------------------------------------------------------------------------------------------------- + +static size_t calculateReportedSize(const size_t actualSize) +{ + // We use DWORDS as our padding, and a long is guaranteed to be 4 bytes, but an int is not (ANSI defines an int as + // being the standard word size for a processor; on a 32-bit machine, that's 4 bytes, but on a 64-bit machine, it's + // 8 bytes, which means an int can actually be larger than a long.) + + return actualSize - paddingSize * sizeof(long) * 2; +} + +// --------------------------------------------------------------------------------------------------------------------------------- + +static void *calculateReportedAddress(const void *actualAddress) +{ + // We allow this... + + if (!actualAddress) return NULL; + + // JUst account for the padding + + return (void *) ((char *) actualAddress + sizeof(long) * paddingSize); +} + +// --------------------------------------------------------------------------------------------------------------------------------- + +static void wipeWithPattern(sAllocUnit *allocUnit, unsigned long pattern, const unsigned int originalReportedSize = 0) +{ + // For a serious test run, we use wipes of random a random value. However, if this causes a crash, we don't want it to + // crash in a differnt place each time, so we specifically DO NOT call srand. If, by chance your program calls srand(), + // you may wish to disable that when running with a random wipe test. This will make any crashes more consistent so they + // can be tracked down easier. + + if (randomWipe) + { + pattern = ((rand() & 0xff) << 24) | ((rand() & 0xff) << 16) | ((rand() & 0xff) << 8) | (rand() & 0xff); + } + + // -DOC- We should wipe with 0's if we're not in debug mode, so we can help hide bugs if possible when we release the + // product. So uncomment the following line for releases. + // + // Note that the "alwaysWipeAll" should be turned on for this to have effect, otherwise it won't do much good. But we'll + // leave it this way (as an option) because this does slow things down. +// pattern = 0; + + // This part of the operation is optional + + if (alwaysWipeAll && allocUnit->reportedSize > originalReportedSize) + { + // Fill the bulk + + long *lptr = (long *) ((char *)allocUnit->reportedAddress + originalReportedSize); + int length = allocUnit->reportedSize - originalReportedSize; + int i; + for (i = 0; i < (length >> 2); i++, lptr++) + { + *lptr = pattern; + } + + // Fill the remainder + + unsigned int shiftCount = 0; + char *cptr = (char *) lptr; + for (i = 0; i < (length & 0x3); i++, cptr++, shiftCount += 8) + { + *cptr = (pattern & (0xff << shiftCount)) >> shiftCount; + } + } + + // Write in the prefix/postfix bytes + + long *pre = (long *) allocUnit->actualAddress; + long *post = (long *) ((char *)allocUnit->actualAddress + allocUnit->actualSize - paddingSize * sizeof(long)); + for (unsigned int i = 0; i < paddingSize; i++, pre++, post++) + { + *pre = prefixPattern; + *post = postfixPattern; + } +} + +// --------------------------------------------------------------------------------------------------------------------------------- + +static void dumpAllocations(FILE *fp) +{ + fprintf(fp, "Alloc. Addr Size Addr Size BreakOn BreakOn \r\n"); + fprintf(fp, "Number Reported Reported Actual Actual Unused Method Dealloc Realloc Allocated by \r\n"); + fprintf(fp, "------ ---------- ---------- ---------- ---------- ---------- -------- ------- ------- --------------------------------------------------- \r\n"); + + + for (unsigned int i = 0; i < hashSize; i++) + { + sAllocUnit *ptr = hashTable[i]; + while(ptr) + { + fprintf(fp, "%06d 0x%08X 0x%08X 0x%08X 0x%08X 0x%08X %-8s %c %c %s\r\n", + ptr->allocationNumber, + (unsigned int) ptr->reportedAddress, ptr->reportedSize, + (unsigned int) ptr->actualAddress, ptr->actualSize, + m_calcUnused(ptr), + allocationTypes[ptr->allocationType], + ptr->breakOnDealloc ? 'Y':'N', + ptr->breakOnRealloc ? 'Y':'N', + ownerString(ptr->sourceFile, ptr->sourceLine, ptr->sourceFunc)); + ptr = ptr->next; + } + } +} + +// --------------------------------------------------------------------------------------------------------------------------------- + +static void dumpLeakReport() +{ + // Open the report file + + FILE *fp = fopen(memoryLeakLogFile, "w+b"); + + // If you hit this assert, then the memory report generator is unable to log information to a file (can't open the file for + // some reason.) + m_assert(fp); + if (!fp) return; + + // Any leaks? + + // Header + + static char timeString[25]; + memset(timeString, 0, sizeof(timeString)); + time_t t = time(NULL); + struct tm *tme = localtime(&t); + fprintf(fp, " ---------------------------------------------------------------------------------------------------------------------------------- \r\n"); + fprintf(fp, "| Memory leak report for: %02d/%02d/%04d %02d:%02d:%02d |\r\n", tme->tm_mon + 1, tme->tm_mday, tme->tm_year + 1900, tme->tm_hour, tme->tm_min, tme->tm_sec); + fprintf(fp, " ---------------------------------------------------------------------------------------------------------------------------------- \r\n"); + fprintf(fp, "\r\n"); + fprintf(fp, "\r\n"); + if (stats.totalAllocUnitCount) + { + fprintf(fp, "%d memory leak%s found:\r\n", stats.totalAllocUnitCount, stats.totalAllocUnitCount == 1 ? "":"s"); + } + else + { + fprintf(fp, "Congratulations! No memory leaks found!\r\n"); + + // We can finally free up our own memory allocations + + if (reservoirBuffer) + { + for (unsigned int i = 0; i < reservoirBufferSize; i++) + { + free(reservoirBuffer[i]); + } + free(reservoirBuffer); + reservoirBuffer = 0; + reservoirBufferSize = 0; + reservoir = NULL; + } + } + fprintf(fp, "\r\n"); + + if (stats.totalAllocUnitCount) + { + dumpAllocations(fp); + } + + fclose(fp); +} + +// --------------------------------------------------------------------------------------------------------------------------------- +// We use a static class to let us know when we're in the midst of static deinitialization +// --------------------------------------------------------------------------------------------------------------------------------- + +class MemStaticTimeTracker +{ +public: + MemStaticTimeTracker() {doCleanupLogOnFirstRun();} + ~MemStaticTimeTracker() {staticDeinitTime = true; dumpLeakReport();} +}; +static MemStaticTimeTracker mstt; + +// --------------------------------------------------------------------------------------------------------------------------------- +// -DOC- Flags & options -- Call these routines to enable/disable the following options +// --------------------------------------------------------------------------------------------------------------------------------- + +bool &m_alwaysValidateAll() +{ + // Force a validation of all allocation units each time we enter this software + return alwaysValidateAll; +} + +// --------------------------------------------------------------------------------------------------------------------------------- + +bool &m_alwaysLogAll() +{ + // Force a log of every allocation & deallocation into memory.log + return alwaysLogAll; +} + +// --------------------------------------------------------------------------------------------------------------------------------- + +bool &m_alwaysWipeAll() +{ + // Force this software to always wipe memory with a pattern when it is being allocated/dallocated + return alwaysWipeAll; +} + +// --------------------------------------------------------------------------------------------------------------------------------- + +bool &m_randomeWipe() +{ + // Force this software to use a random pattern when wiping memory -- good for stress testing + return randomWipe; +} + +// --------------------------------------------------------------------------------------------------------------------------------- +// -DOC- Simply call this routine with the address of an allocated block of RAM, to cause it to force a breakpoint when it is +// reallocated. +// --------------------------------------------------------------------------------------------------------------------------------- + +bool &m_breakOnRealloc(void *reportedAddress) +{ + // Locate the existing allocation unit + + sAllocUnit *au = findAllocUnit(reportedAddress); + + // If you hit this assert, you tried to set a breakpoint on reallocation for an address that doesn't exist. Interrogate the + // stack frame or the variable 'au' to see which allocation this is. + m_assert(au != NULL); + + // If you hit this assert, you tried to set a breakpoint on reallocation for an address that wasn't allocated in a way that + // is compatible with reallocation. + m_assert(au->allocationType == m_alloc_malloc || + au->allocationType == m_alloc_calloc || + au->allocationType == m_alloc_realloc); + + return au->breakOnRealloc; +} + +// --------------------------------------------------------------------------------------------------------------------------------- +// -DOC- Simply call this routine with the address of an allocated block of RAM, to cause it to force a breakpoint when it is +// deallocated. +// --------------------------------------------------------------------------------------------------------------------------------- + +bool &m_breakOnDealloc(void *reportedAddress) +{ + // Locate the existing allocation unit + + sAllocUnit *au = findAllocUnit(reportedAddress); + + // If you hit this assert, you tried to set a breakpoint on deallocation for an address that doesn't exist. Interrogate the + // stack frame or the variable 'au' to see which allocation this is. + m_assert(au != NULL); + + return au->breakOnDealloc; +} + +// --------------------------------------------------------------------------------------------------------------------------------- +// -DOC- When tracking down a difficult bug, use this routine to force a breakpoint on a specific allocation count +// --------------------------------------------------------------------------------------------------------------------------------- + +void m_breakOnAllocation(unsigned int count) +{ + breakOnAllocationCount = count; +} + +// --------------------------------------------------------------------------------------------------------------------------------- +// Used by the macros +// --------------------------------------------------------------------------------------------------------------------------------- + +void m_setOwner(const char *file, const unsigned int line, const char *func) +{ + // You're probably wondering about this... + // + // It's important for this memory manager to primarily work with global new/delete in their original forms (i.e. with + // no extra parameters.) In order to do this, we use macros that call this function prior to operators new & delete. This + // is fine... usually. Here's what actually happens when you use this macro to delete an object: + // + // m_setOwner(__FILE__, __LINE__, __FUNCTION__) --> object::~object() --> delete + // + // Note that the compiler inserts a call to the object's destructor just prior to calling our overridden operator delete. + // But what happens when we delete an object whose destructor deletes another object, whose desctuctor deletes another + // object? Here's a diagram (indentation follows stack depth): + // + // m_setOwner(...) -> ~obj1() // original call to delete obj1 + // m_setOwner(...) -> ~obj2() // obj1's destructor deletes obj2 + // m_setOwner(...) -> ~obj3() // obj2's destructor deletes obj3 + // ... // obj3's destructor just does some stuff + // delete // back in obj2's destructor, we call delete + // delete // back in obj1's destructor, we call delete + // delete // back to our original call, we call delete + // + // Because m_setOwner() just sets up some static variables (below) it's important that each call to m_setOwner() and + // successive calls to new/delete alternate. However, in this case, three calls to m_setOwner() happen in succession + // followed by three calls to delete in succession (with a few calls to destructors mixed in for fun.) This means that + // only the final call to delete (in this chain of events) will have the proper reporting, and the first two in the chain + // will not have ANY owner-reporting information. The deletes will still work fine, we just won't know who called us. + // + // "Then build a stack, my friend!" you might think... but it's a very common thing that people will be working with third- + // party libraries (including MFC under Windows) which is not compiled with this memory manager's macros. In those cases, + // m_setOwner() is never called, and rightfully should not have the proper trace-back information. So if one of the + // destructors in the chain ends up being a call to a delete from a non-mmgr-compiled library, the stack will get confused. + // + // I've been unable to find a solution to this problem, but at least we can detect it and report the data before we + // lose it. That's what this is all about. It makes it somewhat confusing to read in the logs, but at least ALL the + // information is present... + // + // There's a caveat here... The compiler is not required to call operator delete if the value being deleted is NULL. + // In this case, any call to delete with a NULL will sill call m_setOwner(), which will make m_setOwner() think that + // there is a destructor chain becuase we setup the variables, but nothing gets called to clear them. Because of this + // we report a "Possible destructor chain". + // + // Thanks to J. Woznack (from Kodiak Interactive Software Studios -- www.kodiakgames.com) for pointing this out. + + if (sourceLine && alwaysLogAll) + { + log("[I] NOTE! Possible destructor chain: previous owner is %s", ownerString(sourceFile, sourceLine, sourceFunc)); + } + + // Okay... save this stuff off so we can keep track of the caller + + sourceFile = file; + sourceLine = line; + sourceFunc = func; +} + +// --------------------------------------------------------------------------------------------------------------------------------- + +static void resetGlobals() +{ + sourceFile = "??"; + sourceLine = 0; + sourceFunc = "??"; +} + +// --------------------------------------------------------------------------------------------------------------------------------- +// Global new/new[] +// +// These are the standard new/new[] operators. They are merely interface functions that operate like normal new/new[], but use our +// memory tracking routines. +// --------------------------------------------------------------------------------------------------------------------------------- + +void *operator new(size_t reportedSize) +{ + #ifdef TEST_MEMORY_MANAGER + log("[D] ENTER: new"); + #endif + + // Save these off... + + const char *file = sourceFile; + const unsigned int line = sourceLine; + const char *func = sourceFunc; + + // ANSI says: allocation requests of 0 bytes will still return a valid value + + if (reportedSize == 0) reportedSize = 1; + + // ANSI says: loop continuously because the error handler could possibly free up some memory + + for(;;) + { + // Try the allocation + + void *ptr = m_allocator(file, line, func, m_alloc_new, reportedSize); + if (ptr) + { + #ifdef TEST_MEMORY_MANAGER + log("[D] EXIT : new"); + #endif + return ptr; + } + + // There isn't a way to determine the new handler, except through setting it. So we'll just set it to NULL, then + // set it back again. + + std::new_handler nh = std::set_new_handler(0); + std::set_new_handler(nh); + + // If there is an error handler, call it + + if (nh) + { + (*nh)(); + } + + // Otherwise, throw the exception + + else + { + #ifdef TEST_MEMORY_MANAGER + log("[D] EXIT : new"); + #endif + throw std::bad_alloc(); + } + } +} + +// --------------------------------------------------------------------------------------------------------------------------------- + +void *operator new[](size_t reportedSize) +{ + #ifdef TEST_MEMORY_MANAGER + log("[D] ENTER: new[]"); + #endif + + // Save these off... + + const char *file = sourceFile; + const unsigned int line = sourceLine; + const char *func = sourceFunc; + + // The ANSI standard says that allocation requests of 0 bytes will still return a valid value + + if (reportedSize == 0) reportedSize = 1; + + // ANSI says: loop continuously because the error handler could possibly free up some memory + + for(;;) + { + // Try the allocation + + void *ptr = m_allocator(file, line, func, m_alloc_new_array, reportedSize); + if (ptr) + { + #ifdef TEST_MEMORY_MANAGER + log("[D] EXIT : new[]"); + #endif + return ptr; + } + + // There isn't a way to determine the new handler, except through setting it. So we'll just set it to NULL, then + // set it back again. + + std::new_handler nh = std::set_new_handler(0); + std::set_new_handler(nh); + + // If there is an error handler, call it + + if (nh) + { + (*nh)(); + } + + // Otherwise, throw the exception + + else + { + #ifdef TEST_MEMORY_MANAGER + log("[D] EXIT : new[]"); + #endif + throw std::bad_alloc(); + } + } +} + +// --------------------------------------------------------------------------------------------------------------------------------- +// Other global new/new[] +// +// These are the standard new/new[] operators as used by Microsoft's memory tracker. We don't want them interfering with our memory +// tracking efforts. Like the previous versions, these are merely interface functions that operate like normal new/new[], but use +// our memory tracking routines. +// --------------------------------------------------------------------------------------------------------------------------------- + +void *operator new(size_t reportedSize, const char *sourceFile, int sourceLine) +{ + #ifdef TEST_MEMORY_MANAGER + log("[D] ENTER: new"); + #endif + + // The ANSI standard says that allocation requests of 0 bytes will still return a valid value + + if (reportedSize == 0) reportedSize = 1; + + // ANSI says: loop continuously because the error handler could possibly free up some memory + + for(;;) + { + // Try the allocation + + void *ptr = m_allocator(sourceFile, sourceLine, "??", m_alloc_new, reportedSize); + if (ptr) + { + #ifdef TEST_MEMORY_MANAGER + log("[D] EXIT : new"); + #endif + return ptr; + } + + // There isn't a way to determine the new handler, except through setting it. So we'll just set it to NULL, then + // set it back again. + + std::new_handler nh = std::set_new_handler(0); + std::set_new_handler(nh); + + // If there is an error handler, call it + + if (nh) + { + (*nh)(); + } + + // Otherwise, throw the exception + + else + { + #ifdef TEST_MEMORY_MANAGER + log("[D] EXIT : new"); + #endif + throw std::bad_alloc(); + } + } +} + +// --------------------------------------------------------------------------------------------------------------------------------- + +void *operator new[](size_t reportedSize, const char *sourceFile, int sourceLine) +{ + #ifdef TEST_MEMORY_MANAGER + log("[D] ENTER: new[]"); + #endif + + // The ANSI standard says that allocation requests of 0 bytes will still return a valid value + + if (reportedSize == 0) reportedSize = 1; + + // ANSI says: loop continuously because the error handler could possibly free up some memory + + for(;;) + { + // Try the allocation + + void *ptr = m_allocator(sourceFile, sourceLine, "??", m_alloc_new_array, reportedSize); + if (ptr) + { + #ifdef TEST_MEMORY_MANAGER + log("[D] EXIT : new[]"); + #endif + return ptr; + } + + // There isn't a way to determine the new handler, except through setting it. So we'll just set it to NULL, then + // set it back again. + + std::new_handler nh = std::set_new_handler(0); + std::set_new_handler(nh); + + // If there is an error handler, call it + + if (nh) + { + (*nh)(); + } + + // Otherwise, throw the exception + + else + { + #ifdef TEST_MEMORY_MANAGER + log("[D] EXIT : new[]"); + #endif + throw std::bad_alloc(); + } + } +} + +// --------------------------------------------------------------------------------------------------------------------------------- +// Global delete/delete[] +// +// These are the standard delete/delete[] operators. They are merely interface functions that operate like normal delete/delete[], +// but use our memory tracking routines. +// --------------------------------------------------------------------------------------------------------------------------------- + +void operator delete(void *reportedAddress) +{ + #ifdef TEST_MEMORY_MANAGER + log("[D] ENTER: delete"); + #endif + + // ANSI says: delete & delete[] allow NULL pointers (they do nothing) + + if (reportedAddress) m_deallocator(sourceFile, sourceLine, sourceFunc, m_alloc_delete, reportedAddress); + else if (alwaysLogAll) log("[-] ----- %8s of NULL by %s", allocationTypes[m_alloc_delete], ownerString(sourceFile, sourceLine, sourceFunc)); + + // Resetting the globals insures that if at some later time, somebody calls our memory manager from an unknown + // source (i.e. they didn't include our H file) then we won't think it was the last allocation. + + resetGlobals(); + + #ifdef TEST_MEMORY_MANAGER + log("[D] EXIT : delete"); + #endif +} + +// --------------------------------------------------------------------------------------------------------------------------------- + +void operator delete[](void *reportedAddress) +{ + #ifdef TEST_MEMORY_MANAGER + log("[D] ENTER: delete[]"); + #endif + + // ANSI says: delete & delete[] allow NULL pointers (they do nothing) + + if (reportedAddress) m_deallocator(sourceFile, sourceLine, sourceFunc, m_alloc_delete_array, reportedAddress); + else if (alwaysLogAll) + log("[-] ----- %8s of NULL by %s", allocationTypes[m_alloc_delete_array], ownerString(sourceFile, sourceLine, sourceFunc)); + + // Resetting the globals insures that if at some later time, somebody calls our memory manager from an unknown + // source (i.e. they didn't include our H file) then we won't think it was the last allocation. + + resetGlobals(); + + #ifdef TEST_MEMORY_MANAGER + log("[D] EXIT : delete[]"); + #endif +} + +// --------------------------------------------------------------------------------------------------------------------------------- +// Allocate memory and track it +// --------------------------------------------------------------------------------------------------------------------------------- + +void *m_allocator(const char *sourceFile, const unsigned int sourceLine, const char *sourceFunc, const unsigned int allocationType, const size_t reportedSize) +{ + try + { + #ifdef TEST_MEMORY_MANAGER + log("[D] ENTER: m_allocator()"); + #endif + + // Increase our allocation count + + currentAllocationCount++; + + // Log the request + + if (alwaysLogAll) log("[+] %05d %8s of size 0x%08X(%08d) by %s", currentAllocationCount, allocationTypes[allocationType], reportedSize, reportedSize, ownerString(sourceFile, sourceLine, sourceFunc)); + + // If you hit this assert, you requested a breakpoint on a specific allocation count + m_assert(currentAllocationCount != breakOnAllocationCount); + + // If necessary, grow the reservoir of unused allocation units + + if (!reservoir) + { + // Allocate 256 reservoir elements + + reservoir = (sAllocUnit *) malloc(sizeof(sAllocUnit) * 256); + + // If you hit this assert, then the memory manager failed to allocate internal memory for tracking the + // allocations + m_assert(reservoir != NULL); + + // Danger Will Robinson! + + if (reservoir == NULL) throw "Unable to allocate RAM for internal memory tracking data"; + + // Build a linked-list of the elements in our reservoir + + memset(reservoir, 0, sizeof(sAllocUnit) * 256); + for (unsigned int i = 0; i < 256 - 1; i++) + { + reservoir[i].next = &reservoir[i+1]; + } + + // Add this address to our reservoirBuffer so we can free it later + + sAllocUnit **temp = (sAllocUnit **) realloc(reservoirBuffer, (reservoirBufferSize + 1) * sizeof(sAllocUnit *)); + m_assert(temp); + if (temp) + { + reservoirBuffer = temp; + reservoirBuffer[reservoirBufferSize++] = reservoir; + } + } + + // Logical flow says this should never happen... + m_assert(reservoir != NULL); + + // Grab a new allocaton unit from the front of the reservoir + + sAllocUnit *au = reservoir; + reservoir = au->next; + + // Populate it with some real data + + memset(au, 0, sizeof(sAllocUnit)); + au->actualSize = calculateActualSize(reportedSize); + #ifdef RANDOM_FAILURE + double a = rand(); + double b = RAND_MAX / 100.0 * RANDOM_FAILURE; + if (a > b) + { + au->actualAddress = malloc(au->actualSize); + } + else + { + log("[F] Random faiure"); + au->actualAddress = NULL; + } + #else + au->actualAddress = malloc(au->actualSize); + #endif + au->reportedSize = reportedSize; + au->reportedAddress = calculateReportedAddress(au->actualAddress); + au->allocationType = allocationType; + au->sourceLine = sourceLine; + au->allocationNumber = currentAllocationCount; + if (sourceFile) strncpy(au->sourceFile, sourceFileStripper(sourceFile), sizeof(au->sourceFile) - 1); + else strcpy (au->sourceFile, "??"); + if (sourceFunc) strncpy(au->sourceFunc, sourceFunc, sizeof(au->sourceFunc) - 1); + else strcpy (au->sourceFunc, "??"); + + // We don't want to assert with random failures, because we want the application to deal with them. + + #ifndef RANDOM_FAILURE + // If you hit this assert, then the requested allocation simply failed (you're out of memory.) Interrogate the + // variable 'au' or the stack frame to see what you were trying to do. + m_assert(au->actualAddress != NULL); + #endif + + if (au->actualAddress == NULL) + { + throw "Request for allocation failed. Out of memory."; + } + + // If you hit this assert, then this allocation was made from a source that isn't setup to use this memory tracking + // software, use the stack frame to locate the source and include our H file. + m_assert(allocationType != m_alloc_unknown); + + // Insert the new allocation into the hash table + + unsigned int hashIndex = ((unsigned int) au->reportedAddress >> 4) & (hashSize - 1); + if (hashTable[hashIndex]) hashTable[hashIndex]->prev = au; + au->next = hashTable[hashIndex]; + au->prev = NULL; + hashTable[hashIndex] = au; + + // Account for the new allocatin unit in our stats + + stats.totalReportedMemory += au->reportedSize; + stats.totalActualMemory += au->actualSize; + stats.totalAllocUnitCount++; + if (stats.totalReportedMemory > stats.peakReportedMemory) stats.peakReportedMemory = stats.totalReportedMemory; + if (stats.totalActualMemory > stats.peakActualMemory) stats.peakActualMemory = stats.totalActualMemory; + if (stats.totalAllocUnitCount > stats.peakAllocUnitCount) stats.peakAllocUnitCount = stats.totalAllocUnitCount; + stats.accumulatedReportedMemory += au->reportedSize; + stats.accumulatedActualMemory += au->actualSize; + stats.accumulatedAllocUnitCount++; + + // Prepare the allocation unit for use (wipe it with recognizable garbage) + + wipeWithPattern(au, unusedPattern); + + // calloc() expects the reported memory address range to be filled with 0's + + if (allocationType == m_alloc_calloc) + { + memset(au->reportedAddress, 0, au->reportedSize); + } + + // Validate every single allocated unit in memory + + if (alwaysValidateAll) m_validateAllAllocUnits(); + + // Log the result + + if (alwaysLogAll) log("[+] ----> addr 0x%08X", (unsigned int) au->reportedAddress); + + // Resetting the globals insures that if at some later time, somebody calls our memory manager from an unknown + // source (i.e. they didn't include our H file) then we won't think it was the last allocation. + + resetGlobals(); + + // Return the (reported) address of the new allocation unit + + #ifdef TEST_MEMORY_MANAGER + log("[D] EXIT : m_allocator()"); + #endif + + return au->reportedAddress; + } + catch(const char *err) + { + // Deal with the errors + + log("[!] %s", err); + resetGlobals(); + + #ifdef TEST_MEMORY_MANAGER + log("[D] EXIT : m_allocator()"); + #endif + + return NULL; + } +} + +// --------------------------------------------------------------------------------------------------------------------------------- +// Reallocate memory and track it +// --------------------------------------------------------------------------------------------------------------------------------- + +void *m_reallocator(const char *sourceFile, const unsigned int sourceLine, const char *sourceFunc, const unsigned int reallocationType, const size_t reportedSize, void *reportedAddress) +{ + try + { + #ifdef TEST_MEMORY_MANAGER + log("[D] ENTER: m_reallocator()"); + #endif + + // Calling realloc with a NULL should force same operations as a malloc + + if (!reportedAddress) + { + return m_allocator(sourceFile, sourceLine, sourceFunc, reallocationType, reportedSize); + } + + // Increase our allocation count + + currentAllocationCount++; + + // If you hit this assert, you requested a breakpoint on a specific allocation count + m_assert(currentAllocationCount != breakOnAllocationCount); + + // Log the request + + if (alwaysLogAll) log("[~] %05d %8s of size 0x%08X(%08d) by %s", currentAllocationCount, allocationTypes[reallocationType], reportedSize, reportedSize, ownerString(sourceFile, sourceLine, sourceFunc)); + + // Locate the existing allocation unit + + sAllocUnit *au = findAllocUnit(reportedAddress); + + // If you hit this assert, you tried to reallocate RAM that wasn't allocated by this memory manager. + m_assert(au != NULL); + if (au == NULL) throw "Request to reallocate RAM that was never allocated"; + + // If you hit this assert, then the allocation unit that is about to be reallocated is damaged. But you probably + // already know that from a previous assert you should have seen in validateAllocUnit() :) + m_assert(m_validateAllocUnit(au)); + + // If you hit this assert, then this reallocation was made from a source that isn't setup to use this memory + // tracking software, use the stack frame to locate the source and include our H file. + m_assert(reallocationType != m_alloc_unknown); + + // If you hit this assert, you were trying to reallocate RAM that was not allocated in a way that is compatible with + // realloc. In other words, you have a allocation/reallocation mismatch. + m_assert(au->allocationType == m_alloc_malloc || + au->allocationType == m_alloc_calloc || + au->allocationType == m_alloc_realloc); + + // If you hit this assert, then the "break on realloc" flag for this allocation unit is set (and will continue to be + // set until you specifically shut it off. Interrogate the 'au' variable to determine information about this + // allocation unit. + m_assert(au->breakOnRealloc == false); + + // Keep track of the original size + + unsigned int originalReportedSize = au->reportedSize; + + if (alwaysLogAll) log("[~] ----> from 0x%08X(%08d)", originalReportedSize, originalReportedSize); + + // Do the reallocation + + void *oldReportedAddress = reportedAddress; + size_t newActualSize = calculateActualSize(reportedSize); + void *newActualAddress = NULL; + #ifdef RANDOM_FAILURE + double a = rand(); + double b = RAND_MAX / 100.0 * RANDOM_FAILURE; + if (a > b) + { + newActualAddress = realloc(au->actualAddress, newActualSize); + } + else + { + log("[F] Random faiure"); + } + #else + newActualAddress = realloc(au->actualAddress, newActualSize); + #endif + + // We don't want to assert with random failures, because we want the application to deal with them. + + #ifndef RANDOM_FAILURE + // If you hit this assert, then the requested allocation simply failed (you're out of memory) Interrogate the + // variable 'au' to see the original allocation. You can also query 'newActualSize' to see the amount of memory + // trying to be allocated. Finally, you can query 'reportedSize' to see how much memory was requested by the caller. + m_assert(newActualAddress); + #endif + + if (!newActualAddress) throw "Request for reallocation failed. Out of memory."; + + // Remove this allocation from our stats (we'll add the new reallocation again later) + + stats.totalReportedMemory -= au->reportedSize; + stats.totalActualMemory -= au->actualSize; + + // Update the allocation with the new information + + au->actualSize = newActualSize; + au->actualAddress = newActualAddress; + au->reportedSize = calculateReportedSize(newActualSize); + au->reportedAddress = calculateReportedAddress(newActualAddress); + au->allocationType = reallocationType; + au->sourceLine = sourceLine; + au->allocationNumber = currentAllocationCount; + if (sourceFile) strncpy(au->sourceFile, sourceFileStripper(sourceFile), sizeof(au->sourceFile) - 1); + else strcpy (au->sourceFile, "??"); + if (sourceFunc) strncpy(au->sourceFunc, sourceFunc, sizeof(au->sourceFunc) - 1); + else strcpy (au->sourceFunc, "??"); + + // The reallocation may cause the address to change, so we should relocate our allocation unit within the hash table + + unsigned int hashIndex = (unsigned int) -1; + if (oldReportedAddress != au->reportedAddress) + { + // Remove this allocation unit from the hash table + + { + unsigned int hashIndex = ((unsigned int) oldReportedAddress >> 4) & (hashSize - 1); + if (hashTable[hashIndex] == au) + { + hashTable[hashIndex] = hashTable[hashIndex]->next; + } + else + { + if (au->prev) au->prev->next = au->next; + if (au->next) au->next->prev = au->prev; + } + } + + // Re-insert it back into the hash table + + hashIndex = ((unsigned int) au->reportedAddress >> 4) & (hashSize - 1); + if (hashTable[hashIndex]) hashTable[hashIndex]->prev = au; + au->next = hashTable[hashIndex]; + au->prev = NULL; + hashTable[hashIndex] = au; + } + + // Account for the new allocatin unit in our stats + + stats.totalReportedMemory += au->reportedSize; + stats.totalActualMemory += au->actualSize; + if (stats.totalReportedMemory > stats.peakReportedMemory) stats.peakReportedMemory = stats.totalReportedMemory; + if (stats.totalActualMemory > stats.peakActualMemory) stats.peakActualMemory = stats.totalActualMemory; + int deltaReportedSize = reportedSize - originalReportedSize; + if (deltaReportedSize > 0) + { + stats.accumulatedReportedMemory += deltaReportedSize; + stats.accumulatedActualMemory += deltaReportedSize; + } + + // Prepare the allocation unit for use (wipe it with recognizable garbage) + + wipeWithPattern(au, unusedPattern, originalReportedSize); + + // If you hit this assert, then something went wrong, because the allocation unit was properly validated PRIOR to + // the reallocation. This should not happen. + m_assert(m_validateAllocUnit(au)); + + // Validate every single allocated unit in memory + + if (alwaysValidateAll) m_validateAllAllocUnits(); + + // Log the result + + if (alwaysLogAll) log("[~] ----> addr 0x%08X", (unsigned int) au->reportedAddress); + + // Resetting the globals insures that if at some later time, somebody calls our memory manager from an unknown + // source (i.e. they didn't include our H file) then we won't think it was the last allocation. + + resetGlobals(); + + // Return the (reported) address of the new allocation unit + + #ifdef TEST_MEMORY_MANAGER + log("[D] EXIT : m_reallocator()"); + #endif + + return au->reportedAddress; + } + catch(const char *err) + { + // Deal with the errors + + log("[!] %s", err); + resetGlobals(); + + #ifdef TEST_MEMORY_MANAGER + log("[D] EXIT : m_reallocator()"); + #endif + + return NULL; + } +} + +// --------------------------------------------------------------------------------------------------------------------------------- +// Deallocate memory and track it +// --------------------------------------------------------------------------------------------------------------------------------- + +void m_deallocator(const char *sourceFile, const unsigned int sourceLine, const char *sourceFunc, const unsigned int deallocationType, const void *reportedAddress) +{ + try + { + #ifdef TEST_MEMORY_MANAGER + log("[D] ENTER: m_deallocator()"); + #endif + + // Log the request + + if (alwaysLogAll) log("[-] ----- %8s of addr 0x%08X by %s", allocationTypes[deallocationType], (unsigned int) reportedAddress, ownerString(sourceFile, sourceLine, sourceFunc)); + + // Go get the allocation unit + + sAllocUnit *au = findAllocUnit(reportedAddress); + + // If you hit this assert, you tried to deallocate RAM that wasn't allocated by this memory manager. + m_assert(au != NULL); + if (au == NULL) throw "Request to deallocate RAM that was never allocated"; + + // If you hit this assert, then the allocation unit that is about to be deallocated is damaged. But you probably + // already know that from a previous assert you should have seen in validateAllocUnit() :) + m_assert(m_validateAllocUnit(au)); + + // If you hit this assert, then this deallocation was made from a source that isn't setup to use this memory + // tracking software, use the stack frame to locate the source and include our H file. + m_assert(deallocationType != m_alloc_unknown); + + // If you hit this assert, you were trying to deallocate RAM that was not allocated in a way that is compatible with + // the deallocation method requested. In other words, you have a allocation/deallocation mismatch. + m_assert((deallocationType == m_alloc_delete && au->allocationType == m_alloc_new ) || + (deallocationType == m_alloc_delete_array && au->allocationType == m_alloc_new_array) || + (deallocationType == m_alloc_free && au->allocationType == m_alloc_malloc ) || + (deallocationType == m_alloc_free && au->allocationType == m_alloc_calloc ) || + (deallocationType == m_alloc_free && au->allocationType == m_alloc_realloc ) || + (deallocationType == m_alloc_unknown ) ); + + // If you hit this assert, then the "break on dealloc" flag for this allocation unit is set. Interrogate the 'au' + // variable to determine information about this allocation unit. + m_assert(au->breakOnDealloc == false); + + // Wipe the deallocated RAM with a new pattern. This doen't actually do us much good in debug mode under WIN32, + // because Microsoft's memory debugging & tracking utilities will wipe it right after we do. Oh well. + + wipeWithPattern(au, releasedPattern); + + // Do the deallocation + + free(au->actualAddress); + + // Remove this allocation unit from the hash table + + unsigned int hashIndex = ((unsigned int) au->reportedAddress >> 4) & (hashSize - 1); + if (hashTable[hashIndex] == au) + { + hashTable[hashIndex] = au->next; + } + else + { + if (au->prev) au->prev->next = au->next; + if (au->next) au->next->prev = au->prev; + } + + // Remove this allocation from our stats + + stats.totalReportedMemory -= au->reportedSize; + stats.totalActualMemory -= au->actualSize; + stats.totalAllocUnitCount--; + + // Add this allocation unit to the front of our reservoir of unused allocation units + + memset(au, 0, sizeof(sAllocUnit)); + au->next = reservoir; + reservoir = au; + + // Resetting the globals insures that if at some later time, somebody calls our memory manager from an unknown + // source (i.e. they didn't include our H file) then we won't think it was the last allocation. + + resetGlobals(); + + // Validate every single allocated unit in memory + + if (alwaysValidateAll) m_validateAllAllocUnits(); + + // If we're in the midst of static deinitialization time, track any pending memory leaks + + if (staticDeinitTime) dumpLeakReport(); + } + catch(const char *err) + { + // Deal with errors + + log("[!] %s", err); + resetGlobals(); + } + + #ifdef TEST_MEMORY_MANAGER + log("[D] EXIT : m_deallocator()"); + #endif +} + +// --------------------------------------------------------------------------------------------------------------------------------- +// -DOC- The following utilitarian allow you to become proactive in tracking your own memory, or help you narrow in on those tough +// bugs. +// --------------------------------------------------------------------------------------------------------------------------------- + +bool m_validateAddress(const void *reportedAddress) +{ + // Just see if the address exists in our allocation routines + + return findAllocUnit(reportedAddress) != NULL; +} + +// --------------------------------------------------------------------------------------------------------------------------------- + +bool m_validateAllocUnit(const sAllocUnit *allocUnit) +{ + // Make sure the padding is untouched + + long *pre = (long *) allocUnit->actualAddress; + long *post = (long *) ((char *)allocUnit->actualAddress + allocUnit->actualSize - paddingSize * sizeof(long)); + bool errorFlag = false; + for (unsigned int i = 0; i < paddingSize; i++, pre++, post++) + { + if (*pre != (long) prefixPattern) + { + log("[!] A memory allocation unit was corrupt because of an underrun:"); + m_dumpAllocUnit(allocUnit, " "); + errorFlag = true; + } + + // If you hit this assert, then you should know that this allocation unit has been damaged. Something (possibly the + // owner?) has underrun the allocation unit (modified a few bytes prior to the start). You can interrogate the + // variable 'allocUnit' to see statistics and information about this damaged allocation unit. + m_assert(*pre == (long) prefixPattern); + + if (*post != (long) postfixPattern) + { + log("[!] A memory allocation unit was corrupt because of an overrun:"); + m_dumpAllocUnit(allocUnit, " "); + errorFlag = true; + } + + // If you hit this assert, then you should know that this allocation unit has been damaged. Something (possibly the + // owner?) has overrun the allocation unit (modified a few bytes after the end). You can interrogate the variable + // 'allocUnit' to see statistics and information about this damaged allocation unit. + m_assert(*post == (long) postfixPattern); + } + + // Return the error status (we invert it, because a return of 'false' means error) + + return !errorFlag; +} + +// --------------------------------------------------------------------------------------------------------------------------------- + +bool m_validateAllAllocUnits() +{ + // Just go through each allocation unit in the hash table and count the ones that have errors + + unsigned int errors = 0; + unsigned int allocCount = 0; + for (unsigned int i = 0; i < hashSize; i++) + { + sAllocUnit *ptr = hashTable[i]; + while(ptr) + { + allocCount++; + if (!m_validateAllocUnit(ptr)) errors++; + ptr = ptr->next; + } + } + + // Test for hash-table correctness + + if (allocCount != stats.totalAllocUnitCount) + { + log("[!] Memory tracking hash table corrupt!"); + errors++; + } + + // If you hit this assert, then the internal memory (hash table) used by this memory tracking software is damaged! The + // best way to track this down is to use the alwaysLogAll flag in conjunction with STRESS_TEST macro to narrow in on the + // offending code. After running the application with these settings (and hitting this assert again), interrogate the + // memory.log file to find the previous successful operation. The corruption will have occurred between that point and this + // assertion. + m_assert(allocCount == stats.totalAllocUnitCount); + + // If you hit this assert, then you've probably already been notified that there was a problem with a allocation unit in a + // prior call to validateAllocUnit(), but this assert is here just to make sure you know about it. :) + m_assert(errors == 0); + + // Log any errors + + if (errors) log("[!] While validting all allocation units, %d allocation unit(s) were found to have problems", errors); + + // Return the error status + + return errors != 0; +} + +// --------------------------------------------------------------------------------------------------------------------------------- +// -DOC- Unused RAM calculation routines. Use these to determine how much of your RAM is unused (in bytes) +// --------------------------------------------------------------------------------------------------------------------------------- + +unsigned int m_calcUnused(const sAllocUnit *allocUnit) +{ + const unsigned long *ptr = (const unsigned long *) allocUnit->reportedAddress; + unsigned int count = 0; + + for (unsigned int i = 0; i < allocUnit->reportedSize; i += sizeof(long), ptr++) + { + if (*ptr == unusedPattern) count += sizeof(long); + } + + return count; +} + +// --------------------------------------------------------------------------------------------------------------------------------- + +unsigned int m_calcAllUnused() +{ + // Just go through each allocation unit in the hash table and count the unused RAM + + unsigned int total = 0; + for (unsigned int i = 0; i < hashSize; i++) + { + sAllocUnit *ptr = hashTable[i]; + while(ptr) + { + total += m_calcUnused(ptr); + ptr = ptr->next; + } + } + + return total; +} + +// --------------------------------------------------------------------------------------------------------------------------------- +// -DOC- The following functions are for logging and statistics reporting. +// --------------------------------------------------------------------------------------------------------------------------------- + +void m_dumpAllocUnit(const sAllocUnit *allocUnit, const char *prefix) +{ + log("[I] %sAddress (reported): %010p", prefix, allocUnit->reportedAddress); + log("[I] %sAddress (actual) : %010p", prefix, allocUnit->actualAddress); + log("[I] %sSize (reported) : 0x%08X (%s)", prefix, allocUnit->reportedSize, memorySizeString(allocUnit->reportedSize)); + log("[I] %sSize (actual) : 0x%08X (%s)", prefix, allocUnit->actualSize, memorySizeString(allocUnit->actualSize)); + log("[I] %sOwner : %s(%d)::%s", prefix, allocUnit->sourceFile, allocUnit->sourceLine, allocUnit->sourceFunc); + log("[I] %sAllocation type : %s", prefix, allocationTypes[allocUnit->allocationType]); + log("[I] %sAllocation number : %d", prefix, allocUnit->allocationNumber); +} + +// --------------------------------------------------------------------------------------------------------------------------------- + +void m_dumpMemoryReport(const char *filename, const bool overwrite) +{ + // Open the report file + + FILE *fp = NULL; + + if (overwrite) fp = fopen(filename, "w+b"); + else fp = fopen(filename, "ab"); + + // If you hit this assert, then the memory report generator is unable to log information to a file (can't open the file for + // some reason.) + m_assert(fp); + if (!fp) return; + + // Header + + static char timeString[25]; + memset(timeString, 0, sizeof(timeString)); + time_t t = time(NULL); + struct tm *tme = localtime(&t); + fprintf(fp, " ---------------------------------------------------------------------------------------------------------------------------------- \r\n"); + fprintf(fp, "| Memory report for: %02d/%02d/%04d %02d:%02d:%02d |\r\n", tme->tm_mon + 1, tme->tm_mday, tme->tm_year + 1900, tme->tm_hour, tme->tm_min, tme->tm_sec); + fprintf(fp, " ---------------------------------------------------------------------------------------------------------------------------------- \r\n"); + fprintf(fp, "\r\n"); + fprintf(fp, "\r\n"); + + // Report summary + + fprintf(fp, " ---------------------------------------------------------------------------------------------------------------------------------- \r\n"); + fprintf(fp, "| T O T A L S |\r\n"); + fprintf(fp, " ---------------------------------------------------------------------------------------------------------------------------------- \r\n"); + fprintf(fp, " Allocation unit count: %10s\r\n", insertCommas(stats.totalAllocUnitCount)); + fprintf(fp, " Reported to application: %s\r\n", memorySizeString(stats.totalReportedMemory)); + fprintf(fp, " Actual total memory in use: %s\r\n", memorySizeString(stats.totalActualMemory)); + fprintf(fp, " Memory tracking overhead: %s\r\n", memorySizeString(stats.totalActualMemory - stats.totalReportedMemory)); + fprintf(fp, "\r\n"); + + fprintf(fp, " ---------------------------------------------------------------------------------------------------------------------------------- \r\n"); + fprintf(fp, "| P E A K S |\r\n"); + fprintf(fp, " ---------------------------------------------------------------------------------------------------------------------------------- \r\n"); + fprintf(fp, " Allocation unit count: %10s\r\n", insertCommas(stats.peakAllocUnitCount)); + fprintf(fp, " Reported to application: %s\r\n", memorySizeString(stats.peakReportedMemory)); + fprintf(fp, " Actual: %s\r\n", memorySizeString(stats.peakActualMemory)); + fprintf(fp, " Memory tracking overhead: %s\r\n", memorySizeString(stats.peakActualMemory - stats.peakReportedMemory)); + fprintf(fp, "\r\n"); + + fprintf(fp, " ---------------------------------------------------------------------------------------------------------------------------------- \r\n"); + fprintf(fp, "| A C C U M U L A T E D |\r\n"); + fprintf(fp, " ---------------------------------------------------------------------------------------------------------------------------------- \r\n"); + fprintf(fp, " Allocation unit count: %s\r\n", memorySizeString(stats.accumulatedAllocUnitCount)); + fprintf(fp, " Reported to application: %s\r\n", memorySizeString(stats.accumulatedReportedMemory)); + fprintf(fp, " Actual: %s\r\n", memorySizeString(stats.accumulatedActualMemory)); + fprintf(fp, "\r\n"); + + fprintf(fp, " ---------------------------------------------------------------------------------------------------------------------------------- \r\n"); + fprintf(fp, "| U N U S E D |\r\n"); + fprintf(fp, " ---------------------------------------------------------------------------------------------------------------------------------- \r\n"); + fprintf(fp, " Memory allocated but not in use: %s\r\n", memorySizeString(m_calcAllUnused())); + fprintf(fp, "\r\n"); + + dumpAllocations(fp); + + fclose(fp); +} + +// --------------------------------------------------------------------------------------------------------------------------------- + +sMStats m_getMemoryStatistics() +{ + return stats; +} + +// --------------------------------------------------------------------------------------------------------------------------------- +// mmgr.cpp - End of file +// --------------------------------------------------------------------------------------------------------------------------------- diff --git a/src/WinLibs/FTGL/test/mmgr.h b/src/WinLibs/FTGL/test/mmgr.h new file mode 100644 index 000000000..8053ae499 --- /dev/null +++ b/src/WinLibs/FTGL/test/mmgr.h @@ -0,0 +1,172 @@ +// --------------------------------------------------------------------------------------------------------------------------------- +// _ +// | | +// _ __ ___ _ __ ___ __ _ _ __ | |__ +// | '_ ` _ \| '_ ` _ \ / _` | '__| | '_ \ +// | | | | | | | | | | | (_| | | _ | | | | +// |_| |_| |_|_| |_| |_|\__, |_| (_)|_| |_| +// __/ | +// |___/ +// +// Memory manager & tracking software +// +// Best viewed with 8-character tabs and (at least) 132 columns +// +// --------------------------------------------------------------------------------------------------------------------------------- +// +// Restrictions & freedoms pertaining to usage and redistribution of this software: +// +// * This software is 100% free +// * If you use this software (in part or in whole) you must credit the author. +// * This software may not be re-distributed (in part or in whole) in a modified +// form without clear documentation on how to obtain a copy of the original work. +// * You may not use this software to directly or indirectly cause harm to others. +// * This software is provided as-is and without warrantee. Use at your own risk. +// +// For more information, visit HTTP://www.FluidStudios.com +// +// --------------------------------------------------------------------------------------------------------------------------------- +// Originally created on 12/22/2000 by Paul Nettle +// +// Copyright 2000, Fluid Studios, Inc., all rights reserved. +// --------------------------------------------------------------------------------------------------------------------------------- + +#ifndef _H_MMGR +#define _H_MMGR + + +#ifdef __APPLE_CC__ +//MAC hjm 7/11/2000 +typedef unsigned long size_t; +#endif + + +// --------------------------------------------------------------------------------------------------------------------------------- +// For systems that don't have the __FUNCTION__ variable, we can just define it here +// --------------------------------------------------------------------------------------------------------------------------------- + +#define __FUNCTION__ "??" + +// --------------------------------------------------------------------------------------------------------------------------------- +// Types +// --------------------------------------------------------------------------------------------------------------------------------- + +typedef struct tag_au +{ + size_t actualSize; + size_t reportedSize; + void *actualAddress; + void *reportedAddress; + char sourceFile[40]; + char sourceFunc[40]; + unsigned int sourceLine; + unsigned int allocationType; + bool breakOnDealloc; + bool breakOnRealloc; + unsigned int allocationNumber; + struct tag_au *next; + struct tag_au *prev; +} sAllocUnit; + +typedef struct +{ + unsigned int totalReportedMemory; + unsigned int totalActualMemory; + unsigned int peakReportedMemory; + unsigned int peakActualMemory; + unsigned int accumulatedReportedMemory; + unsigned int accumulatedActualMemory; + unsigned int accumulatedAllocUnitCount; + unsigned int totalAllocUnitCount; + unsigned int peakAllocUnitCount; +} sMStats; + +// --------------------------------------------------------------------------------------------------------------------------------- +// External constants +// --------------------------------------------------------------------------------------------------------------------------------- + +extern const unsigned int m_alloc_unknown; +extern const unsigned int m_alloc_new; +extern const unsigned int m_alloc_new_array; +extern const unsigned int m_alloc_malloc; +extern const unsigned int m_alloc_calloc; +extern const unsigned int m_alloc_realloc; +extern const unsigned int m_alloc_delete; +extern const unsigned int m_alloc_delete_array; +extern const unsigned int m_alloc_free; + +// --------------------------------------------------------------------------------------------------------------------------------- +// Used by the macros +// --------------------------------------------------------------------------------------------------------------------------------- + +void m_setOwner(const char *file, const unsigned int line, const char *func); + +// --------------------------------------------------------------------------------------------------------------------------------- +// Allocation breakpoints +// --------------------------------------------------------------------------------------------------------------------------------- + +bool &m_breakOnRealloc(void *reportedAddress); +bool &m_breakOnDealloc(void *reportedAddress); + +// --------------------------------------------------------------------------------------------------------------------------------- +// The meat of the memory tracking software +// --------------------------------------------------------------------------------------------------------------------------------- + +void *m_allocator(const char *sourceFile, const unsigned int sourceLine, const char *sourceFunc, + const unsigned int allocationType, const size_t reportedSize); +void *m_reallocator(const char *sourceFile, const unsigned int sourceLine, const char *sourceFunc, + const unsigned int reallocationType, const size_t reportedSize, void *reportedAddress); +void m_deallocator(const char *sourceFile, const unsigned int sourceLine, const char *sourceFunc, + const unsigned int deallocationType, const void *reportedAddress); + +// --------------------------------------------------------------------------------------------------------------------------------- +// Utilitarian functions +// --------------------------------------------------------------------------------------------------------------------------------- + +bool m_validateAddress(const void *reportedAddress); +bool m_validateAllocUnit(const sAllocUnit *allocUnit); +bool m_validateAllAllocUnits(); + +// --------------------------------------------------------------------------------------------------------------------------------- +// Unused RAM calculations +// --------------------------------------------------------------------------------------------------------------------------------- + +unsigned int m_calcUnused(const sAllocUnit *allocUnit); +unsigned int m_calcAllUnused(); + +// --------------------------------------------------------------------------------------------------------------------------------- +// Logging and reporting +// --------------------------------------------------------------------------------------------------------------------------------- + +void m_dumpAllocUnit(const sAllocUnit *allocUnit, const char *prefix = ""); +void m_dumpMemoryReport(const char *filename = "memreport.log", const bool overwrite = true); +sMStats m_getMemoryStatistics(); + +// --------------------------------------------------------------------------------------------------------------------------------- +// Variations of global operators new & delete +// --------------------------------------------------------------------------------------------------------------------------------- + +void *operator new(size_t reportedSize); +void *operator new[](size_t reportedSize); +void *operator new(size_t reportedSize, const char *sourceFile, int sourceLine); +void *operator new[](size_t reportedSize, const char *sourceFile, int sourceLine); +void operator delete(void *reportedAddress); +void operator delete[](void *reportedAddress); + +#endif // _H_MMGR + +// --------------------------------------------------------------------------------------------------------------------------------- +// Macros -- "Kids, please don't try this at home. We're trained professionals here." :) +// --------------------------------------------------------------------------------------------------------------------------------- + +#include "nommgr.h" +#define new (m_setOwner (__FILE__,__LINE__,__FUNCTION__),false) ? NULL : new +#define delete (m_setOwner (__FILE__,__LINE__,__FUNCTION__),false) ? m_setOwner("",0,"") : delete +#define malloc(sz) m_allocator (__FILE__,__LINE__,__FUNCTION__,m_alloc_malloc,sz) +#define calloc(sz) m_allocator (__FILE__,__LINE__,__FUNCTION__,m_alloc_calloc,sz) +#define realloc(ptr,sz) m_reallocator(__FILE__,__LINE__,__FUNCTION__,m_alloc_realloc,sz,ptr) +#define free(ptr) m_deallocator(__FILE__,__LINE__,__FUNCTION__,m_alloc_free,ptr) + +// --------------------------------------------------------------------------------------------------------------------------------- +// mmgr.h - End of file +// --------------------------------------------------------------------------------------------------------------------------------- diff --git a/src/WinLibs/FTGL/test/nommgr.h b/src/WinLibs/FTGL/test/nommgr.h new file mode 100644 index 000000000..569b88776 --- /dev/null +++ b/src/WinLibs/FTGL/test/nommgr.h @@ -0,0 +1,60 @@ +// --------------------------------------------------------------------------------------------------------------------------------- +// _ +// | | +// _ __ ___ _ __ ___ _ __ ___ __ _ _ __ | |__ +// | '_ \ / _ \| '_ ` _ \| '_ ` _ \ / _` | '__| | '_ \ +// | | | | (_) | | | | | | | | | | | (_| | | _ | | | | +// |_| |_|\___/|_| |_| |_|_| |_| |_|\__, |_| (_)|_| |_| +// __/ | +// |___/ +// +// Memory manager & tracking software +// +// Best viewed with 8-character tabs and (at least) 132 columns +// +// --------------------------------------------------------------------------------------------------------------------------------- +// +// Restrictions & freedoms pertaining to usage and redistribution of this software: +// +// * This software is 100% free +// * If you use this software (in part or in whole) you must credit the author. +// * This software may not be re-distributed (in part or in whole) in a modified +// form without clear documentation on how to obtain a copy of the original work. +// * You may not use this software to directly or indirectly cause harm to others. +// * This software is provided as-is and without warrantee. Use at your own risk. +// +// For more information, visit HTTP://www.FluidStudios.com +// +// --------------------------------------------------------------------------------------------------------------------------------- +// Originally created on 12/22/2000 by Paul Nettle +// +// Copyright 2000, Fluid Studios, Inc., all rights reserved. +// --------------------------------------------------------------------------------------------------------------------------------- + +#ifdef new +#undef new +#endif + +#ifdef delete +#undef delete +#endif + +#ifdef malloc +#undef malloc +#endif + +#ifdef calloc +#undef calloc +#endif + +#ifdef realloc +#undef realloc +#endif + +#ifdef free +#undef free +#endif + +// --------------------------------------------------------------------------------------------------------------------------------- +// nommgr.h - End of file +// --------------------------------------------------------------------------------------------------------------------------------- diff --git a/src/WinLibs/FTGL/unix/Make.conf.in b/src/WinLibs/FTGL/unix/Make.conf.in new file mode 100644 index 000000000..a3e3c4c43 --- /dev/null +++ b/src/WinLibs/FTGL/unix/Make.conf.in @@ -0,0 +1,66 @@ +CC=@CC@ +CFLAGS=@CFLAGS@ +CPP=@CPP@ +CPPFLAGS=-I$(top_srcdir)/include @CPPFLAGS@ +CXX=@CXX@ +CXXFLAGS=@CXXFLAGS@ +DEFS=@DEFS@ +DOXYGEN=@DOXYGEN@ +ECHO=@ECHO@ +ECHO_C=@ECHO_C@ +ECHO_N=@ECHO_N@ +ECHO_T=@ECHO_T@ +EXEEXT=@EXEEXT@ +FT2_CFLAGS=@FT2_CFLAGS@ +FT2_CONFIG=@FT2_CONFIG@ +FT2_LIBS=@FT2_LIBS@ +GLUT_CFLAGS=@GLUT_CFLAGS@ +GLUT_LIBS=@GLUT_LIBS@ +GL_CFLAGS=@GL_CFLAGS@ +GL_LIBS=@GL_LIBS@ +HAVE_GLUT=@HAVE_GLUT@ +INSTALL=@INSTALL@ +LDFLAGS=@LDFLAGS@ +LIBS=@LIBS@ +LIBTOOL=@LIBTOOL@ +LN_S=@LN_S@ +OBJEXT=@OBJEXT@ +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@ +SHELL=@SHELL@ +STRIP=@STRIP@ +ac_ct_CC=@ac_ct_CC@ +ac_ct_CXX=@ac_ct_CXX@ +ac_ct_RANLIB=@ac_ct_RANLIB@ +ac_ct_STRIP=@ac_ct_STRIP@ +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@ +libdir=@libdir@ +libexecdir=@libexecdir@ +localstatedir=@localstatedir@ +mandir=@mandir@ +oldincludedir=@oldincludedir@ +prefix=@prefix@ +program_transform_name=@program_transform_name@ +sbindir=@sbindir@ +sharedstatedir=@sharedstatedir@ +sysconfdir=@sysconfdir@ +target_alias=@target_alias@ diff --git a/src/WinLibs/FTGL/unix/Make.rules b/src/WinLibs/FTGL/unix/Make.rules new file mode 100644 index 000000000..a073f7a73 --- /dev/null +++ b/src/WinLibs/FTGL/unix/Make.rules @@ -0,0 +1,33 @@ +%-recursive: +ifneq ($(SUBDIRS),) + for d in $(SUBDIRS) ; do $(MAKE) -C $$d $* ; done +else + @: +endif + +GARBAGE = *~ \#*\# + +clean: clean-recursive +clean: clean-garbage +clean: clean-local +clean-garbage: + $(RM) $(GARBAGE) +clean-local: + +distclean: distclean-recursive +distclean: distclean-local +distclean-local: clean-garbage clean-local + +maint-clean: distclean +maint-clean: maint-clean-local +maint-clean-local: + +install: install-recursive +install: install-local +install-local: + +%.lo: %.cpp + $(LIBTOOL) --mode=compile $(CXX) -c $(CPPFLAGS) $(CXXFLAGS) $^ + +%.la: + $(LIBTOOL) --mode=link $(CXX) -o $@ -rpath $(libdir) $^ $(LDFLAGS) $(LIBS) diff --git a/src/WinLibs/FTGL/unix/Makefile b/src/WinLibs/FTGL/unix/Makefile new file mode 100644 index 000000000..0ff25a4fe --- /dev/null +++ b/src/WinLibs/FTGL/unix/Makefile @@ -0,0 +1,47 @@ +top_builddir=. +-include $(top_builddir)/Make.conf + +SUBDIRS = src demo docs + +AUTOGEN = Make.conf config.log config.status libtool autom4te.cache ftgl.pc +AUTOGEN_MAINT = aclocal.m4 acinclude.m4 config.guess config.sub configure ltmain.sh install-sh + +all: Make.conf +all: all-recursive + +Make.conf: + ./configure + +ftgl.pc: + ./configure + +install-local: ftgl.pc + $(INSTALL) -d -m 0755 $(libdir)/pkgconfig + $(INSTALL) -m 0644 ftgl.pc $(libdir)/pkgconfig/ + +maint-clean-local: + $(RM) $(AUTOGEN_MAINT) + +distclean-local: + $(RM) -r $(AUTOGEN) + +# Extremely non-GNU unfriendly dist rule. +dist: distclean + ( set -e ; \ + $(RM) -r ../ftgl-dist-tmp ; \ + mkdir ../ftgl-dist-tmp ; \ + version=`grep AC_INIT configure.ac | tr -d [:blank:] | cut -d , -f 2` ; \ + distdir=../ftgl-dist-tmp/ftgl-$$version ; \ + mkdir $$distdir ; \ + cp -a . $$distdir ; \ + cd $$distdir ; \ + ./bootstrap ; \ + find -type d -name CVS | xargs -r rm -rf ; \ + rm bootstrap ; \ + find -type f | xargs chmod a-x ; \ + chmod a+x config.guess config.sub configure install-sh ; \ + tar -C .. -cvzf ../../ftgl-$$version.tar.gz ftgl-$$version ) + +include Make.rules + +.PHONY: all clean clean-local maint-clean distclean distclean-local diff --git a/src/WinLibs/FTGL/unix/README.txt b/src/WinLibs/FTGL/unix/README.txt new file mode 100644 index 000000000..686b03dad --- /dev/null +++ b/src/WinLibs/FTGL/unix/README.txt @@ -0,0 +1,51 @@ +FTGL Version 2.0.5 + +This project will build a static library (archive) in the src directory. + +The Makefiles need GNU Make in order to work properly. + +FTGL requires the Freetype2 library (version 2.0.9 or later) and OpenGL +(glu version 1.2 or later). You can pass flags to the configure script +to point it to the place where these libraries are installed, like this: + + $ ./configure --with-gl-inc=/usr/local/include \ + --with-gl-lib=/usr/local/lib + +Should you need anything more complicated that that, try with: + + $ ./configure --with-gl-inc=/usr/local/include \ + --with-gl-lib="-L/weird/location -lGL -lX11 -lXi -lXm" + +The same thing goes for the GLUT library. This is optional and is only +needed to build the demo program. Should any of this fail, please send +an email to mmagallo@debian.org (please include FTGL somewhere in the +subject line) and include a copy of the config.log file that was left +behind. + +If doxygen is installed, documentation in HTML format will be generated +in the docs subdirectory. + +To use FTGL in your own projects you will need to link against this lib +and include the FTGL headers located in the src directory. Your project +will also need Freetype and OpenGL. For your convinience a pkg-config +metadata file has been included (ftgl.pc) and gets installed in +/pkgconfig, where pkg-config should be able to find it. In +order to take advantage of this, just include something like this in +your makefiles: + + FTGL_CPPFLAGS := $(shell pkg-config --cflags ftgl) + FTGL_LDFLAGS := $(shell pkg-config --libs-only-L ftgl) + FTGL_LIBS := $(shell pkg-config --libs-only-l ftgl) + +The names of these variables should be self-explanatory. Note that +FTGL_LIBS will include -lGL, you shouldn't specify that flag separately. + +For instructions on using Freetype go to http://www.freetype.org/ +For instructions on using OpenGL go to http://www.opengl.org/ + +Please contact me if you have any suggestions, feature requests, or +problems. + +Henry Maddocks +henryj@paradise.net.nz +http://homepages.paradise.net.nz/henryj/ diff --git a/src/WinLibs/FTGL/unix/acinclude.m4 b/src/WinLibs/FTGL/unix/acinclude.m4 new file mode 100644 index 000000000..fd6f2edf4 --- /dev/null +++ b/src/WinLibs/FTGL/unix/acinclude.m4 @@ -0,0 +1,341 @@ +dnl FTGL_PROG_CXX() +dnl Check the build plataform and try to use the native compiler +dnl +AC_DEFUN(FTGL_PROG_CXX, +[dnl +AC_CANONICAL_BUILD +AC_CANONICAL_HOST + +dnl I really don't know how to handle the cross-compiling case +if test "$build" = "$host" ; then + case "$build" in + *-*-irix*) + if test -z "$CXX" ; then + CXX=CC + fi + if test -z "$CC" ; then + CC=cc + fi + if test x$CXX = xCC -a -z "$CXXFLAGS" ; then + # It might be worthwhile to move this out of here, say + # EXTRA_CXXFLAGS. Forcing -n32 might cause trouble, too. + CXXFLAGS="-LANG:std -n32 -woff 1201 -O3" + fi + ;; + esac +fi + +AC_PROG_CXX +]) +# Configure paths for FreeType2 +# Marcelo Magallon 2001-10-26, based on gtk.m4 by Owen Taylor + +dnl AC_CHECK_FT2([MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]]) +dnl Test for FreeType2, and define FT2_CFLAGS and FT2_LIBS +dnl +AC_DEFUN(AC_CHECK_FT2, +[dnl +dnl Get the cflags and libraries from the freetype-config script +dnl +AC_ARG_WITH(freetype-prefix, +[ --with-ft-prefix=PFX Prefix where FreeType is installed (optional)], + ft_config_prefix="$withval", ft_config_prefix="") +AC_ARG_WITH(freetype-exec-prefix, +[ --with-ft-exec-prefix=PFX Exec prefix where FreeType is installed (optional)], + ft_config_exec_prefix="$withval", ft_config_exec_prefix="") +AC_ARG_ENABLE(freetypetest, [ --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 +AC_PATH_PROG(FT2_CONFIG, freetype-config, no) + +min_ft_version=ifelse([$1], ,6.1.0,$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_version=`$FT2_CONFIG $ft_config_args --version` + ft_config_major_version=`echo $ft_config_version | cut -d . -f 1` + ft_config_minor_version=`echo $ft_config_version | cut -d . -f 2` + ft_config_micro_version=`echo $ft_config_version | cut -d . -f 3` + ft_min_major_version=`echo $min_ft_version | cut -d . -f 1` + ft_min_minor_version=`echo $min_ft_version | cut -d . -f 2` + ft_min_micro_version=`echo $min_ft_version | cut -d . -f 3` + if test "x$enable_fttest" = "xyes" ; then + ft_config_version=`expr $ft_config_major_version \* 10000 + $ft_config_minor_version \* 100 + $ft_config_micro_version` + ft_min_version=`expr $ft_min_major_version \* 10000 + $ft_min_minor_version \* 100 + $ft_min_micro_version` + if test $ft_config_version -lt $ft_min_version ; then + ifelse([$3], , :, [$3]) + else + ac_save_CFLAGS="$CFLAGS" + ac_save_LIBS="$LIBS" + CFLAGS="$CFLAGS $FT2_CFLAGS" + LIBS="$FT2_LIBS $LIBS" +dnl +dnl Sanity checks the results of freetype-config to some extent +dnl + AC_TRY_RUN([ +#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 $ac_n "cross compiling; assumed OK... $ac_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) + ifelse([$2], , :, [$2]) +else + AC_MSG_RESULT(no) + if test "$FT2_CONFIG" = "no" ; then + echo "*** The freetype-config script installed by FT2 could not be found" + echo "*** If FT2 was installed in PREFIX, make sure PREFIX/bin is in" + echo "*** your path, or set the FT2_CONFIG environment variable to the" + echo "*** full path to freetype-config." + else + echo "*** The FreeType test program failed to run. If your system uses" + echo "*** shared libraries and they are installed outside the normal" + echo "*** system library path, make sure the variable LD_LIBRARY_PATH" + echo "*** (or whatever is appropiate for your system) is correctly set." + fi + FT2_CFLAGS="" + FT2_LIBS="" + ifelse([$3], , :, [$3]) +fi +AC_SUBST(FT2_CFLAGS) +AC_SUBST(FT2_LIBS) +]) +dnl FTGL_CHECK_GL() +dnl Check for OpenGL development environment and GLU >= 1.2 +dnl +AC_DEFUN([FTGL_CHECK_GL], +[dnl +AC_REQUIRE([AC_PROG_CC]) +AC_REQUIRE([AC_PATH_X]) +AC_REQUIRE([AC_PATH_XTRA]) + +AC_ARG_WITH([--with-gl-inc], + AC_HELP_STRING([--with-gl-inc=DIR],[Directory where GL/gl.h is installed])) +AC_ARG_WITH([--with-gl-lib], + AC_HELP_STRING([--with-gl-lib=DIR],[Directory where OpenGL libraries are installed])) + +AC_LANG_SAVE +AC_LANG_C + +GL_SAVE_CPPFLAGS="$CPPFLAGS" +GL_SAVE_LIBS="$LIBS" + +if test "x$no_x" != xyes ; then + GL_CFLAGS="$X_CFLAGS" + GL_X_LIBS="$X_PRE_LIBS $X_LIBS -lX11 -lXext -lXmu $X_EXTRA_LIBS" +fi + +if test "x$with_gl_inc" != "xnone" ; then + if test -d "$with_gl_inc" ; then + GL_CFLAGS="-I$with_gl_inc" + else + GL_CFLAGS="$with_gl_inc" + fi +else + GL_CFLAGS= +fi + +CPPFLAGS="$GL_CFLAGS" +AC_CHECK_HEADER([GL/gl.h], [], [AC_MSG_ERROR(GL/gl.h is needed, please specify its location with --with-gl-inc. If this still fails, please contact mmagallo@debian.org, include the string FTGL somewhere in the subject line and provide a copy of the config.log file that was left behind.)]) + +AC_MSG_CHECKING([for GL library]) +if test "x$with_gl_lib" != "x" ; then + if test -d "$with_gl_lib" ; then + LIBS="-L$with_gl_lib -lGL" + else + LIBS="$with_gl_lib" + fi +else + LIBS="-lGL" +fi +AC_LINK_IFELSE([AC_LANG_CALL([],[glBegin])],[HAVE_GL=yes], [HAVE_GL=no]) +if test "x$HAVE_GL" = xno ; then + if test "x$GL_X_LIBS" != x ; then + LIBS="-lGL $GL_X_LIBS" + AC_LINK_IFELSE([AC_LANG_CALL([],[glBegin])],[HAVE_GL=yes], [HAVE_GL=no]) + fi +fi +if test "x$HAVE_GL" = xyes ; then + AC_MSG_RESULT([yes]) + GL_LIBS=$LIBS +else + AC_MSG_RESULT([no]) + AC_MSG_ERROR([GL library could not be found, please specify its location with --with-gl-lib. If this still fails, please contact mmagallo@debian.org, include the string FTGL somewhere in the subject line and provide a copy of the config.log file that was left behind.]) +fi + +AC_CHECK_HEADER([GL/glu.h]) +AC_MSG_CHECKING([for GLU version >= 1.2]) +AC_TRY_COMPILE([#include ], [ +#if !defined(GLU_VERSION_1_2) +#error GLU too old +#endif + ], + [AC_MSG_RESULT([yes])], + [AC_MSG_RESULT([no]) + AC_MSG_ERROR([GLU >= 1.2 is needed to compile this library]) + ]) + +AC_MSG_CHECKING([for GLU library]) +LIBS="-lGLU $GL_LIBS" +AC_LINK_IFELSE([AC_LANG_CALL([],[gluNewTess])],[HAVE_GLU=yes], [HAVE_GLU=no]) +if test "x$HAVE_GLU" = xno ; then + if test "x$GL_X_LIBS" != x ; then + LIBS="-lGLU $GL_LIBS $GL_X_LIBS" + AC_LINK_IFELSE([AC_LANG_CALL([],[gluNewTess])],[HAVE_GLU=yes], [HAVE_GLU=no]) + fi +fi +if test "x$HAVE_GLU" = xyes ; then + AC_MSG_RESULT([yes]) + GL_LIBS="$LIBS" +else + AC_MSG_RESULT([no]) + AC_MSG_ERROR([GLU library could not be found, please specify its location with --with-gl-lib. If this still fails, please contact mmagallo@debian.org, include the string FTGL somewhere in the subject line and provide a copy of the config.log file that was left behind.]) +fi + +AC_SUBST(GL_CFLAGS) +AC_SUBST(GL_LIBS) + +CPPFLAGS="$GL_SAVE_CPPFLAGS" +LIBS="$GL_SAVE_LIBS" +AC_LANG_RESTORE +GL_X_LIBS="" +]) +dnl FTGL_CHECK_GLUT() +dnl Check for GLUT development environment +dnl +AC_DEFUN([FTGL_CHECK_GLUT], +[dnl +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_PATH_X])dnl +AC_REQUIRE([AC_PATH_XTRA])dnl +AC_REQUIRE([FTGL_CHECK_GL])dnl + +AC_ARG_WITH([--with-glut-inc], + AC_HELP_STRING([--with-glut-inc=DIR],[Directory where GL/glut.h is installed (optional)])) +AC_ARG_WITH([--with-glut-lib], + AC_HELP_STRING([--with-glut-lib=DIR],[Directory where GLUT libraries are installed (optional)])) + +AC_LANG_SAVE +AC_LANG_C + +GLUT_SAVE_CPPFLAGS="$CPPFLAGS" +GLUT_SAVE_LIBS="$LIBS" + +if test "x$no_x" != xyes ; then + GLUT_CFLAGS="$X_CFLAGS" + GLUT_X_LIBS="$X_PRE_LIBS $X_LIBS -lX11 -lXext -lXmu $X_EXTRA_LIBS" +fi + +if test "x$with_glut_inc" != "xnone" ; then + if test -d "$with_glut_inc" ; then + GLUT_CFLAGS="-I$with_glut_inc" + else + GLUT_CFLAGS="$with_glut_inc" + fi +else + GLUT_CFLAGS= +fi + +CPPFLAGS="$GLUT_CFLAGS" +AC_CHECK_HEADER([GL/glut.h], [HAVE_GLUT=yes], [HAVE_GLUT=no]) + +if test "x$HAVE_GLUT" = xno ; then + AC_MSG_WARN([GLUT headers not availabe, example program won't be compiled.]) +else + +# Check for GLUT libraries + + AC_MSG_CHECKING([for GLUT library]) + if test "x$with_glut_lib" != "x" ; then + if test -d "$with_glut_lib" ; then + LIBS="-L$with_glut_lib -lglut" + else + LIBS="$with_glut_lib" + fi + else + LIBS="-lglut" + fi + AC_LINK_IFELSE( + [AC_LANG_CALL([],[glutInit])], + [HAVE_GLUT=yes], + [HAVE_GLUT=no]) + + if test "x$HAVE_GLUT" = xno ; then + # Try again with the GL libs + LIBS="-lglut $GL_LIBS" + AC_LINK_IFELSE( + [AC_LANG_CALL([],[glutInit])], + [HAVE_GLUT=yes], + [HAVE_GLUT=no]) + fi + + if test "x$HAVE_GLUT" = xno && test "x$GLUT_X_LIBS" != x ; then + # Try again with the GL and X11 libs + LIBS="-lglut $GL_LIBS $GLUT_X_LIBS" + AC_LINK_IFELSE( + [AC_LANG_CALL([],[glutInit])], + [HAVE_GLUT=yes], + [HAVE_GLUT=no]) + fi + + if test "x$HAVE_GLUT" = xyes ; then + AC_MSG_RESULT([yes]) + GLUT_LIBS=$LIBS + else + AC_MSG_RESULT([no]) + AC_MSG_WARN([GLUT libraries not availabe, example program won't be compiled.]) + fi + +# End check for GLUT libraries + +fi + +AC_SUBST(HAVE_GLUT) +AC_SUBST(GLUT_CFLAGS) +AC_SUBST(GLUT_LIBS) +AC_LANG_RESTORE + +CPPFLAGS="$GLUT_SAVE_CPPFLAGS" +LIBS="$GLUT_SAVE_LIBS" +GLUT_X_CFLAGS= +GLUT_X_LIBS= +]) diff --git a/src/WinLibs/FTGL/unix/aclocal.m4 b/src/WinLibs/FTGL/unix/aclocal.m4 new file mode 100644 index 000000000..8a66b641a --- /dev/null +++ b/src/WinLibs/FTGL/unix/aclocal.m4 @@ -0,0 +1,3988 @@ +dnl aclocal.m4 generated automatically by aclocal 1.4-p6 + +dnl Copyright (C) 1994, 1995-8, 1999, 2001 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +dnl This program is distributed in the hope that it will be useful, +dnl but WITHOUT ANY WARRANTY, to the extent permitted by law; without +dnl even the implied warranty of MERCHANTABILITY or FITNESS FOR A +dnl PARTICULAR PURPOSE. + +dnl FTGL_PROG_CXX() +dnl Check the build plataform and try to use the native compiler +dnl +AC_DEFUN(FTGL_PROG_CXX, +[dnl +AC_CANONICAL_BUILD +AC_CANONICAL_HOST + +dnl I really don't know how to handle the cross-compiling case +if test "$build" = "$host" ; then + case "$build" in + *-*-irix*) + if test -z "$CXX" ; then + CXX=CC + fi + if test -z "$CC" ; then + CC=cc + fi + if test x$CXX = xCC -a -z "$CXXFLAGS" ; then + # It might be worthwhile to move this out of here, say + # EXTRA_CXXFLAGS. Forcing -n32 might cause trouble, too. + CXXFLAGS="-LANG:std -n32 -woff 1201 -O3" + fi + ;; + esac +fi + +AC_PROG_CXX +]) +# Configure paths for FreeType2 +# Marcelo Magallon 2001-10-26, based on gtk.m4 by Owen Taylor + +dnl AC_CHECK_FT2([MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]]) +dnl Test for FreeType2, and define FT2_CFLAGS and FT2_LIBS +dnl +AC_DEFUN(AC_CHECK_FT2, +[dnl +dnl Get the cflags and libraries from the freetype-config script +dnl +AC_ARG_WITH(freetype-prefix, +[ --with-ft-prefix=PFX Prefix where FreeType is installed (optional)], + ft_config_prefix="$withval", ft_config_prefix="") +AC_ARG_WITH(freetype-exec-prefix, +[ --with-ft-exec-prefix=PFX Exec prefix where FreeType is installed (optional)], + ft_config_exec_prefix="$withval", ft_config_exec_prefix="") +AC_ARG_ENABLE(freetypetest, [ --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 +AC_PATH_PROG(FT2_CONFIG, freetype-config, no) + +min_ft_version=ifelse([$1], ,6.1.0,$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_version=`$FT2_CONFIG $ft_config_args --version` + ft_config_major_version=`echo $ft_config_version | cut -d . -f 1` + ft_config_minor_version=`echo $ft_config_version | cut -d . -f 2` + ft_config_micro_version=`echo $ft_config_version | cut -d . -f 3` + ft_min_major_version=`echo $min_ft_version | cut -d . -f 1` + ft_min_minor_version=`echo $min_ft_version | cut -d . -f 2` + ft_min_micro_version=`echo $min_ft_version | cut -d . -f 3` + if test "x$enable_fttest" = "xyes" ; then + ft_config_version=`expr $ft_config_major_version \* 10000 + $ft_config_minor_version \* 100 + $ft_config_micro_version` + ft_min_version=`expr $ft_min_major_version \* 10000 + $ft_min_minor_version \* 100 + $ft_min_micro_version` + if test $ft_config_version -lt $ft_min_version ; then + ifelse([$3], , :, [$3]) + else + ac_save_CFLAGS="$CFLAGS" + ac_save_LIBS="$LIBS" + CFLAGS="$CFLAGS $FT2_CFLAGS" + LIBS="$FT2_LIBS $LIBS" +dnl +dnl Sanity checks the results of freetype-config to some extent +dnl + AC_TRY_RUN([ +#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 $ac_n "cross compiling; assumed OK... $ac_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) + ifelse([$2], , :, [$2]) +else + AC_MSG_RESULT(no) + if test "$FT2_CONFIG" = "no" ; then + echo "*** The freetype-config script installed by FT2 could not be found" + echo "*** If FT2 was installed in PREFIX, make sure PREFIX/bin is in" + echo "*** your path, or set the FT2_CONFIG environment variable to the" + echo "*** full path to freetype-config." + else + echo "*** The FreeType test program failed to run. If your system uses" + echo "*** shared libraries and they are installed outside the normal" + echo "*** system library path, make sure the variable LD_LIBRARY_PATH" + echo "*** (or whatever is appropiate for your system) is correctly set." + fi + FT2_CFLAGS="" + FT2_LIBS="" + ifelse([$3], , :, [$3]) +fi +AC_SUBST(FT2_CFLAGS) +AC_SUBST(FT2_LIBS) +]) +dnl FTGL_CHECK_GL() +dnl Check for OpenGL development environment and GLU >= 1.2 +dnl +AC_DEFUN([FTGL_CHECK_GL], +[dnl +AC_REQUIRE([AC_PROG_CC]) +AC_REQUIRE([AC_PATH_X]) +AC_REQUIRE([AC_PATH_XTRA]) + +AC_ARG_WITH([--with-gl-inc], + AC_HELP_STRING([--with-gl-inc=DIR],[Directory where GL/gl.h is installed])) +AC_ARG_WITH([--with-gl-lib], + AC_HELP_STRING([--with-gl-lib=DIR],[Directory where OpenGL libraries are installed])) + +AC_LANG_SAVE +AC_LANG_C + +GL_SAVE_CPPFLAGS="$CPPFLAGS" +GL_SAVE_LIBS="$LIBS" + +if test "x$no_x" != xyes ; then + GL_CFLAGS="$X_CFLAGS" + GL_X_LIBS="$X_PRE_LIBS $X_LIBS -lX11 -lXext -lXmu $X_EXTRA_LIBS" +fi + +if test "x$with_gl_inc" != "xnone" ; then + if test -d "$with_gl_inc" ; then + GL_CFLAGS="-I$with_gl_inc" + else + GL_CFLAGS="$with_gl_inc" + fi +else + GL_CFLAGS= +fi + +CPPFLAGS="$GL_CFLAGS" +AC_CHECK_HEADER([GL/gl.h], [], [AC_MSG_ERROR(GL/gl.h is needed, please specify its location with --with-gl-inc. If this still fails, please contact mmagallo@debian.org, include the string FTGL somewhere in the subject line and provide a copy of the config.log file that was left behind.)]) + +AC_MSG_CHECKING([for GL library]) +if test "x$with_gl_lib" != "x" ; then + if test -d "$with_gl_lib" ; then + LIBS="-L$with_gl_lib -lGL" + else + LIBS="$with_gl_lib" + fi +else + LIBS="-lGL" +fi +AC_LINK_IFELSE([AC_LANG_CALL([],[glBegin])],[HAVE_GL=yes], [HAVE_GL=no]) +if test "x$HAVE_GL" = xno ; then + if test "x$GL_X_LIBS" != x ; then + LIBS="-lGL $GL_X_LIBS" + AC_LINK_IFELSE([AC_LANG_CALL([],[glBegin])],[HAVE_GL=yes], [HAVE_GL=no]) + fi +fi +if test "x$HAVE_GL" = xyes ; then + AC_MSG_RESULT([yes]) + GL_LIBS=$LIBS +else + AC_MSG_RESULT([no]) + AC_MSG_ERROR([GL library could not be found, please specify its location with --with-gl-lib. If this still fails, please contact mmagallo@debian.org, include the string FTGL somewhere in the subject line and provide a copy of the config.log file that was left behind.]) +fi + +AC_CHECK_HEADER([GL/glu.h]) +AC_MSG_CHECKING([for GLU version >= 1.2]) +AC_TRY_COMPILE([#include ], [ +#if !defined(GLU_VERSION_1_2) +#error GLU too old +#endif + ], + [AC_MSG_RESULT([yes])], + [AC_MSG_RESULT([no]) + AC_MSG_ERROR([GLU >= 1.2 is needed to compile this library]) + ]) + +AC_MSG_CHECKING([for GLU library]) +LIBS="-lGLU $GL_LIBS" +AC_LINK_IFELSE([AC_LANG_CALL([],[gluNewTess])],[HAVE_GLU=yes], [HAVE_GLU=no]) +if test "x$HAVE_GLU" = xno ; then + if test "x$GL_X_LIBS" != x ; then + LIBS="-lGLU $GL_LIBS $GL_X_LIBS" + AC_LINK_IFELSE([AC_LANG_CALL([],[gluNewTess])],[HAVE_GLU=yes], [HAVE_GLU=no]) + fi +fi +if test "x$HAVE_GLU" = xyes ; then + AC_MSG_RESULT([yes]) + GL_LIBS="$LIBS" +else + AC_MSG_RESULT([no]) + AC_MSG_ERROR([GLU library could not be found, please specify its location with --with-gl-lib. If this still fails, please contact mmagallo@debian.org, include the string FTGL somewhere in the subject line and provide a copy of the config.log file that was left behind.]) +fi + +AC_SUBST(GL_CFLAGS) +AC_SUBST(GL_LIBS) + +CPPFLAGS="$GL_SAVE_CPPFLAGS" +LIBS="$GL_SAVE_LIBS" +AC_LANG_RESTORE +GL_X_LIBS="" +]) +dnl FTGL_CHECK_GLUT() +dnl Check for GLUT development environment +dnl +AC_DEFUN([FTGL_CHECK_GLUT], +[dnl +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_PATH_X])dnl +AC_REQUIRE([AC_PATH_XTRA])dnl +AC_REQUIRE([FTGL_CHECK_GL])dnl + +AC_ARG_WITH([--with-glut-inc], + AC_HELP_STRING([--with-glut-inc=DIR],[Directory where GL/glut.h is installed (optional)])) +AC_ARG_WITH([--with-glut-lib], + AC_HELP_STRING([--with-glut-lib=DIR],[Directory where GLUT libraries are installed (optional)])) + +AC_LANG_SAVE +AC_LANG_C + +GLUT_SAVE_CPPFLAGS="$CPPFLAGS" +GLUT_SAVE_LIBS="$LIBS" + +if test "x$no_x" != xyes ; then + GLUT_CFLAGS="$X_CFLAGS" + GLUT_X_LIBS="$X_PRE_LIBS $X_LIBS -lX11 -lXext -lXmu $X_EXTRA_LIBS" +fi + +if test "x$with_glut_inc" != "xnone" ; then + if test -d "$with_glut_inc" ; then + GLUT_CFLAGS="-I$with_glut_inc" + else + GLUT_CFLAGS="$with_glut_inc" + fi +else + GLUT_CFLAGS= +fi + +CPPFLAGS="$GLUT_CFLAGS" +AC_CHECK_HEADER([GL/glut.h], [HAVE_GLUT=yes], [HAVE_GLUT=no]) + +if test "x$HAVE_GLUT" = xno ; then + AC_MSG_WARN([GLUT headers not availabe, example program won't be compiled.]) +else + +# Check for GLUT libraries + + AC_MSG_CHECKING([for GLUT library]) + if test "x$with_glut_lib" != "x" ; then + if test -d "$with_glut_lib" ; then + LIBS="-L$with_glut_lib -lglut" + else + LIBS="$with_glut_lib" + fi + else + LIBS="-lglut" + fi + AC_LINK_IFELSE( + [AC_LANG_CALL([],[glutInit])], + [HAVE_GLUT=yes], + [HAVE_GLUT=no]) + + if test "x$HAVE_GLUT" = xno ; then + # Try again with the GL libs + LIBS="-lglut $GL_LIBS" + AC_LINK_IFELSE( + [AC_LANG_CALL([],[glutInit])], + [HAVE_GLUT=yes], + [HAVE_GLUT=no]) + fi + + if test "x$HAVE_GLUT" = xno && test "x$GLUT_X_LIBS" != x ; then + # Try again with the GL and X11 libs + LIBS="-lglut $GL_LIBS $GLUT_X_LIBS" + AC_LINK_IFELSE( + [AC_LANG_CALL([],[glutInit])], + [HAVE_GLUT=yes], + [HAVE_GLUT=no]) + fi + + if test "x$HAVE_GLUT" = xyes ; then + AC_MSG_RESULT([yes]) + GLUT_LIBS=$LIBS + else + AC_MSG_RESULT([no]) + AC_MSG_WARN([GLUT libraries not availabe, example program won't be compiled.]) + fi + +# End check for GLUT libraries + +fi + +AC_SUBST(HAVE_GLUT) +AC_SUBST(GLUT_CFLAGS) +AC_SUBST(GLUT_LIBS) +AC_LANG_RESTORE + +CPPFLAGS="$GLUT_SAVE_CPPFLAGS" +LIBS="$GLUT_SAVE_LIBS" +GLUT_X_CFLAGS= +GLUT_X_LIBS= +]) + +# libtool.m4 - Configure libtool for the host system. -*-Shell-script-*- + +# serial 46 AC_PROG_LIBTOOL + +AC_DEFUN([AC_PROG_LIBTOOL], +[AC_REQUIRE([AC_LIBTOOL_SETUP])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_DEFUN([AC_LIBTOOL_SETUP], +[AC_PREREQ(2.13)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([LT_AC_PROG_SED])dnl + +AC_REQUIRE([AC_PROG_LN_S])dnl +AC_REQUIRE([AC_DEPLIBS_CHECK_METHOD])dnl +AC_REQUIRE([AC_OBJEXT])dnl +AC_REQUIRE([AC_EXEEXT])dnl +dnl + +_LT_AC_PROG_ECHO_BACKSLASH +# 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_CHECK_TOOL(RANLIB, ranlib, :) +AC_CHECK_TOOL(STRIP, strip, :) + +ifdef([AC_PROVIDE_AC_LIBTOOL_DLOPEN], enable_dlopen=yes, enable_dlopen=no) +ifdef([AC_PROVIDE_AC_LIBTOOL_WIN32_DLL], +enable_win32_dll=yes, enable_win32_dll=no) + +AC_ARG_ENABLE(libtool-lock, + [ --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 +*-*-irix6*) + # Find out which ABI we are using. + echo '[#]line __oline__ "configure"' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -32" + ;; + *N32*) + LD="${LD-ld} -n32" + ;; + *64-bit*) + LD="${LD-ld} -64" + ;; + esac + fi + rm -rf conftest* + ;; + +*-*-sco3.2v5*) + # On SCO OpenServer 5, we need -belf to get full-featured binaries. + SAVE_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -belf" + AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, + [AC_LANG_SAVE + AC_LANG_C + AC_TRY_LINK([],[],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) + AC_LANG_RESTORE]) + 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 + ;; + +ifdef([AC_PROVIDE_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) + + # recent cygwin and mingw systems supply a stub DllMain which the user + # can override, but on older systems we have to supply one + AC_CACHE_CHECK([if libtool should supply DllMain function], lt_cv_need_dllmain, + [AC_TRY_LINK([], + [extern int __attribute__((__stdcall__)) DllMain(void*, int, void*); + DllMain (0, 0, 0);], + [lt_cv_need_dllmain=no],[lt_cv_need_dllmain=yes])]) + + case $host/$CC in + *-*-cygwin*/gcc*-mno-cygwin*|*-*-mingw*) + # old mingw systems require "-dll" to link a DLL, while more recent ones + # require "-mdll" + SAVE_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -mdll" + AC_CACHE_CHECK([how to link DLLs], lt_cv_cc_dll_switch, + [AC_TRY_LINK([], [], [lt_cv_cc_dll_switch=-mdll],[lt_cv_cc_dll_switch=-dll])]) + CFLAGS="$SAVE_CFLAGS" ;; + *-*-cygwin* | *-*-pw32*) + # cygwin systems need to pass --dll to the linker, and not link + # crt.o which will require a WinMain@16 definition. + lt_cv_cc_dll_switch="-Wl,--dll -nostartfiles" ;; + esac + ;; + ]) +esac + +_LT_AC_LTCONFIG_HACK + +]) + +# AC_LIBTOOL_HEADER_ASSERT +# ------------------------ +AC_DEFUN([AC_LIBTOOL_HEADER_ASSERT], +[AC_CACHE_CHECK([whether $CC supports assert without backlinking], + [lt_cv_func_assert_works], + [case $host in + *-*-solaris*) + if test "$GCC" = yes && test "$with_gnu_ld" != yes; then + case `$CC --version 2>/dev/null` in + [[12]].*) lt_cv_func_assert_works=no ;; + *) lt_cv_func_assert_works=yes ;; + esac + fi + ;; + esac]) + +if test "x$lt_cv_func_assert_works" = xyes; then + AC_CHECK_HEADERS(assert.h) +fi +])# AC_LIBTOOL_HEADER_ASSERT + +# _LT_AC_CHECK_DLFCN +# -------------------- +AC_DEFUN([_LT_AC_CHECK_DLFCN], +[AC_CHECK_HEADERS(dlfcn.h) +])# _LT_AC_CHECK_DLFCN + +# 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]) +AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe], [dnl + +# 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 the above into a raw symbol and a C symbol. +symxfrm='\1 \2\3 \3' + +# Transform an extracted symbol line into a proper C declaration +lt_cv_global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern char \1;/p'" + +# Transform an extracted symbol line into symbol name and symbol address +lt_cv_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 + lt_cv_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern char \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" + lt_cv_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" + ;; +irix* | nonstopux*) + symcode='[[BCDEGRST]]' + ;; +osf*) + symcode='[[BCDEGQRST]]' + ;; +solaris* | sysv5*) + symcode='[[BDT]]' + ;; +sysv4) + symcode='[[DFNSTU]]' + ;; +esac + +# Handle CRLF in mingw tool chain +opt_cr= +case $host_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. +if $NM -V 2>&1 | egrep '(GNU|with BFD)' > /dev/null; then + symcode='[[ABCDGISTW]]' +fi + +# Try without a prefix undercore, then with it. +for ac_symprfx in "" "_"; do + + # 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 < $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 egrep ' nm_test_var$' "$nlist" >/dev/null; then + if egrep ' nm_test_func$' "$nlist" >/dev/null; then + cat < conftest.$ac_ext +#ifdef __cplusplus +extern "C" { +#endif + +EOF + # Now generate the symbol file. + eval "$lt_cv_global_symbol_to_cdecl"' < "$nlist" >> conftest.$ac_ext' + + cat <> conftest.$ac_ext +#if defined (__STDC__) && __STDC__ +# define lt_ptr void * +#else +# define lt_ptr char * +# define const +#endif + +/* The mapping between symbol names and symbols. */ +const struct { + const char *name; + lt_ptr address; +} +lt_preloaded_symbols[[]] = +{ +EOF + sed "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (lt_ptr) \&\2},/" < "$nlist" >> conftest.$ac_ext + cat <<\EOF >> conftest.$ac_ext + {0, (lt_ptr) 0} +}; + +#ifdef __cplusplus +} +#endif +EOF + # Now try linking the two files. + mv conftest.$ac_objext conftstm.$ac_objext + save_LIBS="$LIBS" + save_CFLAGS="$CFLAGS" + LIBS="conftstm.$ac_objext" + CFLAGS="$CFLAGS$no_builtin_flag" + if AC_TRY_EVAL(ac_link) && test -s conftest$ac_exeext; then + pipe_works=yes + fi + LIBS="$save_LIBS" + CFLAGS="$save_CFLAGS" + else + echo "cannot find nm_test_func in $nlist" >&AC_FD_CC + fi + else + echo "cannot find nm_test_var in $nlist" >&AC_FD_CC + fi + else + echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AC_FD_CC + fi + else + echo "$progname: failed program was:" >&AC_FD_CC + 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 +]) +global_symbol_pipe="$lt_cv_sys_global_symbol_pipe" +if test -z "$lt_cv_sys_global_symbol_pipe"; then + global_symbol_to_cdecl= + global_symbol_to_c_name_address= +else + global_symbol_to_cdecl="$lt_cv_global_symbol_to_cdecl" + global_symbol_to_c_name_address="$lt_cv_global_symbol_to_c_name_address" +fi +if test -z "$global_symbol_pipe$global_symbol_to_cdec$global_symbol_to_c_name_address"; +then + AC_MSG_RESULT(failed) +else + AC_MSG_RESULT(ok) +fi +]) # AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE + +# _LT_AC_LIBTOOL_SYS_PATH_SEPARATOR +# --------------------------------- +AC_DEFUN([_LT_AC_LIBTOOL_SYS_PATH_SEPARATOR], +[# Find the correct PATH separator. Usually this is `:', but +# DJGPP uses `;' like DOS. +if test "X${PATH_SEPARATOR+set}" != Xset; then + UNAME=${UNAME-`uname 2>/dev/null`} + case X$UNAME in + *-DOS) lt_cv_sys_path_separator=';' ;; + *) lt_cv_sys_path_separator=':' ;; + esac + PATH_SEPARATOR=$lt_cv_sys_path_separator +fi +])# _LT_AC_LIBTOOL_SYS_PATH_SEPARATOR + +# _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], +[ifdef([AC_DIVERSION_NOTICE], [AC_DIVERT_PUSH(AC_DIVERSION_NOTICE)], + [AC_DIVERT_PUSH(NOTICE)]) +_LT_AC_LIBTOOL_SYS_PATH_SEPARATOR + +# 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 </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. + + IFS="${IFS= }"; save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for dir in $PATH /usr/ucb; do + 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="$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) +AC_DIVERT_POP +])# _LT_AC_PROG_ECHO_BACKSLASH + +# _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], +[if test "$cross_compiling" = yes; then : + [$4] +else + AC_REQUIRE([_LT_AC_CHECK_DLFCN])dnl + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext < +#endif + +#include + +#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); */ + } + + exit (status); +}] +EOF + if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then + (./conftest; exit; ) 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) $1 ;; + x$lt_dlneed_uscore) $2 ;; + x$lt_unknown|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], +[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 + ;; + + cygwin* | mingw* | pw32*) + lt_cv_dlopen="LoadLibrary" + lt_cv_dlopen_libs= + ;; + + *) + 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" + AC_REQUIRE([_LT_AC_CHECK_DLFCN])dnl + test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" + + save_LDFLAGS="$LDFLAGS" + 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 + LDFLAGS="$LDFLAGS $link_static_flag" + 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_DEFUN([_LT_AC_LTCONFIG_HACK], +[AC_REQUIRE([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])dnl +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +Xsed='sed -e s/^X//' +sed_quote_subst='s/\([[\\"\\`$\\\\]]\)/\\\1/g' + +# Same as above, but do not quote variable references. +double_quote_subst='s/\([[\\"\\`\\\\]]\)/\\\1/g' + +# Sed substitution to delay expansion of an escaped shell variable in a +# double_quote_subst'ed string. +delay_variable_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 M$VC, +# which needs '.lib'). +libext=a +ltmain="$ac_aux_dir/ltmain.sh" +ofile="$default_ofile" +with_gnu_ld="$lt_cv_prog_gnu_ld" +need_locks="$enable_libtool_lock" + +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 "$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 "$OBJDUMP" && OBJDUMP=objdump +test -z "$RANLIB" && RANLIB=: +test -z "$STRIP" && STRIP=: +test -z "$ac_objext" && ac_objext=o + +if test x"$host" != x"$build"; then + ac_tool_prefix=${host_alias}- +else + ac_tool_prefix= +fi + +# Transform linux* to *-*-linux-gnu*, to support old configure scripts. +case $host_os in +linux-gnu*) ;; +linux*) host=`echo $host | sed 's/^\(.*-.*-linux\)\(.*\)$/\1-gnu\2/'` +esac + +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 + +# 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="\$RANLIB -t \$oldlib~$old_postinstall_cmds" + ;; + *) + old_postinstall_cmds="\$RANLIB \$oldlib~$old_postinstall_cmds" + ;; + esac + old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" +fi + +# Allow CC to be a program name with arguments. +set dummy $CC +compiler="[$]2" + +AC_MSG_CHECKING([for objdir]) +rm -f .libs 2>/dev/null +mkdir .libs 2>/dev/null +if test -d .libs; then + objdir=.libs +else + # MS-DOS does not allow filenames that begin with a dot. + objdir=_libs +fi +rmdir .libs 2>/dev/null +AC_MSG_RESULT($objdir) + + +AC_ARG_WITH(pic, +[ --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 + +# We assume here that the value for lt_cv_prog_cc_pic will not be cached +# in isolation, and that seeing it set (from the cache) indicates that +# the associated values are set (in the cache) correctly too. +AC_MSG_CHECKING([for $compiler option to produce PIC]) +AC_CACHE_VAL(lt_cv_prog_cc_pic, +[ lt_cv_prog_cc_pic= + lt_cv_prog_cc_shlib= + lt_cv_prog_cc_wl= + lt_cv_prog_cc_static= + lt_cv_prog_cc_no_builtin= + lt_cv_prog_cc_can_build_shared=$can_build_shared + + if test "$GCC" = yes; then + lt_cv_prog_cc_wl='-Wl,' + lt_cv_prog_cc_static='-static' + + case $host_os in + aix*) + # Below there is a dirty hack to force normal static linking with -ldl + # The problem is because libdl dynamically linked with both libc and + # libC (AIX C++ library), which obviously doesn't included in libraries + # list by gcc. This cause undefined symbols with -static flags. + # This hack allows C programs to be linked with "-static -ldl", but + # not sure about C++ programs. + lt_cv_prog_cc_static="$lt_cv_prog_cc_static ${lt_cv_prog_cc_wl}-lC" + ;; + 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_cv_prog_cc_pic='-m68020 -resident32 -malways-restore-a4' + ;; + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_cv_prog_cc_pic='-fno-common' + ;; + cygwin* | 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_cv_prog_cc_pic='-DDLL_EXPORT' + ;; + sysv4*MP*) + if test -d /usr/nec; then + lt_cv_prog_cc_pic=-Kconform_pic + fi + ;; + *) + lt_cv_prog_cc_pic='-fPIC' + ;; + esac + else + # PORTME Check for PIC flags for the system compiler. + case $host_os in + aix3* | aix4* | aix5*) + lt_cv_prog_cc_wl='-Wl,' + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_cv_prog_cc_static='-Bstatic' + else + lt_cv_prog_cc_static='-bnso -bI:/lib/syscalls.exp' + fi + ;; + + hpux9* | hpux10* | hpux11*) + # Is there a better lt_cv_prog_cc_static that works with the bundled CC? + lt_cv_prog_cc_wl='-Wl,' + lt_cv_prog_cc_static="${lt_cv_prog_cc_wl}-a ${lt_cv_prog_cc_wl}archive" + lt_cv_prog_cc_pic='+Z' + ;; + + irix5* | irix6* | nonstopux*) + lt_cv_prog_cc_wl='-Wl,' + lt_cv_prog_cc_static='-non_shared' + # PIC (with -KPIC) is the default. + ;; + + cygwin* | 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_cv_prog_cc_pic='-DDLL_EXPORT' + ;; + + newsos6) + lt_cv_prog_cc_pic='-KPIC' + lt_cv_prog_cc_static='-Bstatic' + ;; + + osf3* | osf4* | osf5*) + # All OSF/1 code is PIC. + lt_cv_prog_cc_wl='-Wl,' + lt_cv_prog_cc_static='-non_shared' + ;; + + sco3.2v5*) + lt_cv_prog_cc_pic='-Kpic' + lt_cv_prog_cc_static='-dn' + lt_cv_prog_cc_shlib='-belf' + ;; + + solaris*) + lt_cv_prog_cc_pic='-KPIC' + lt_cv_prog_cc_static='-Bstatic' + lt_cv_prog_cc_wl='-Wl,' + ;; + + sunos4*) + lt_cv_prog_cc_pic='-PIC' + lt_cv_prog_cc_static='-Bstatic' + lt_cv_prog_cc_wl='-Qoption ld ' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + lt_cv_prog_cc_pic='-KPIC' + lt_cv_prog_cc_static='-Bstatic' + lt_cv_prog_cc_wl='-Wl,' + ;; + + uts4*) + lt_cv_prog_cc_pic='-pic' + lt_cv_prog_cc_static='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec ;then + lt_cv_prog_cc_pic='-Kconform_pic' + lt_cv_prog_cc_static='-Bstatic' + fi + ;; + + *) + lt_cv_prog_cc_can_build_shared=no + ;; + esac + fi +]) +if test -z "$lt_cv_prog_cc_pic"; then + AC_MSG_RESULT([none]) +else + AC_MSG_RESULT([$lt_cv_prog_cc_pic]) + + # Check to make sure the pic_flag actually works. + AC_MSG_CHECKING([if $compiler PIC flag $lt_cv_prog_cc_pic works]) + AC_CACHE_VAL(lt_cv_prog_cc_pic_works, [dnl + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $lt_cv_prog_cc_pic -DPIC" + AC_TRY_COMPILE([], [], [dnl + case $host_os in + hpux9* | hpux10* | hpux11*) + # On HP-UX, both CC and GCC only warn that PIC is supported... then + # they create non-PIC objects. So, if there were any warnings, we + # assume that PIC is not supported. + if test -s conftest.err; then + lt_cv_prog_cc_pic_works=no + else + lt_cv_prog_cc_pic_works=yes + fi + ;; + *) + lt_cv_prog_cc_pic_works=yes + ;; + esac + ], [dnl + lt_cv_prog_cc_pic_works=no + ]) + CFLAGS="$save_CFLAGS" + ]) + + if test "X$lt_cv_prog_cc_pic_works" = Xno; then + lt_cv_prog_cc_pic= + lt_cv_prog_cc_can_build_shared=no + else + lt_cv_prog_cc_pic=" $lt_cv_prog_cc_pic" + fi + + AC_MSG_RESULT([$lt_cv_prog_cc_pic_works]) +fi + +# Check for any special shared library compilation flags. +if test -n "$lt_cv_prog_cc_shlib"; then + AC_MSG_WARN([\`$CC' requires \`$lt_cv_prog_cc_shlib' to build shared libraries]) + if echo "$old_CC $old_CFLAGS " | egrep -e "[[ ]]$lt_cv_prog_cc_shlib[[ ]]" >/dev/null; then : + else + AC_MSG_WARN([add \`$lt_cv_prog_cc_shlib' to the CC or CFLAGS env variable and reconfigure]) + lt_cv_prog_cc_can_build_shared=no + fi +fi + +AC_MSG_CHECKING([if $compiler static flag $lt_cv_prog_cc_static works]) +AC_CACHE_VAL([lt_cv_prog_cc_static_works], [dnl + lt_cv_prog_cc_static_works=no + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS $lt_cv_prog_cc_static" + AC_TRY_LINK([], [], [lt_cv_prog_cc_static_works=yes]) + LDFLAGS="$save_LDFLAGS" +]) + +# Belt *and* braces to stop my trousers falling down: +test "X$lt_cv_prog_cc_static_works" = Xno && lt_cv_prog_cc_static= +AC_MSG_RESULT([$lt_cv_prog_cc_static_works]) + +pic_flag="$lt_cv_prog_cc_pic" +special_shlib_compile_flags="$lt_cv_prog_cc_shlib" +wl="$lt_cv_prog_cc_wl" +link_static_flag="$lt_cv_prog_cc_static" +no_builtin_flag="$lt_cv_prog_cc_no_builtin" +can_build_shared="$lt_cv_prog_cc_can_build_shared" + + +# Check to see if options -o and -c are simultaneously supported by compiler +AC_MSG_CHECKING([if $compiler supports -c -o file.$ac_objext]) +AC_CACHE_VAL([lt_cv_compiler_c_o], [ +$rm -r conftest 2>/dev/null +mkdir conftest +cd conftest +echo "int some_variable = 0;" > conftest.$ac_ext +mkdir out +# According to Tom Tromey, Ian Lance Taylor reported there are C compilers +# that will create temporary files in the current directory regardless of +# the output directory. Thus, making CWD read-only will cause this test +# to fail, enabling locking or at least warning the user not to do parallel +# builds. +chmod -w . +save_CFLAGS="$CFLAGS" +CFLAGS="$CFLAGS -o out/conftest2.$ac_objext" +compiler_c_o=no +if { (eval echo configure:__oline__: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>out/conftest.err; } && 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 + if test -s out/conftest.err; then + lt_cv_compiler_c_o=no + else + lt_cv_compiler_c_o=yes + fi +else + # Append any errors to the config.log. + cat out/conftest.err 1>&AC_FD_CC + lt_cv_compiler_c_o=no +fi +CFLAGS="$save_CFLAGS" +chmod u+w . +$rm conftest* out/* +rmdir out +cd .. +rmdir conftest +$rm -r conftest 2>/dev/null +]) +compiler_c_o=$lt_cv_compiler_c_o +AC_MSG_RESULT([$compiler_c_o]) + +if test x"$compiler_c_o" = x"yes"; then + # Check to see if we can write to a .lo + AC_MSG_CHECKING([if $compiler supports -c -o file.lo]) + AC_CACHE_VAL([lt_cv_compiler_o_lo], [ + lt_cv_compiler_o_lo=no + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -c -o conftest.lo" + save_objext="$ac_objext" + ac_objext=lo + AC_TRY_COMPILE([], [int some_variable = 0;], [dnl + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + lt_cv_compiler_o_lo=no + else + lt_cv_compiler_o_lo=yes + fi + ]) + ac_objext="$save_objext" + CFLAGS="$save_CFLAGS" + ]) + compiler_o_lo=$lt_cv_compiler_o_lo + AC_MSG_RESULT([$compiler_o_lo]) +else + compiler_o_lo=no +fi + +# Check to see if we can do hard links to lock some files if needed +hard_links="nottested" +if test "$compiler_c_o" = 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 + +if test "$GCC" = yes; then + # Check to see if options -fno-rtti -fno-exceptions are supported by compiler + AC_MSG_CHECKING([if $compiler supports -fno-rtti -fno-exceptions]) + echo "int some_variable = 0;" > conftest.$ac_ext + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -fno-rtti -fno-exceptions -c conftest.$ac_ext" + compiler_rtti_exceptions=no + AC_TRY_COMPILE([], [int some_variable = 0;], [dnl + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + compiler_rtti_exceptions=no + else + compiler_rtti_exceptions=yes + fi + ]) + CFLAGS="$save_CFLAGS" + AC_MSG_RESULT([$compiler_rtti_exceptions]) + + if test "$compiler_rtti_exceptions" = "yes"; then + no_builtin_flag=' -fno-builtin -fno-rtti -fno-exceptions' + else + no_builtin_flag=' -fno-builtin' + fi +fi + +# See if the linker supports building shared libraries. +AC_MSG_CHECKING([whether the linker ($LD) supports shared libraries]) + +allow_undefined_flag= +no_undefined_flag= +need_lib_prefix=unknown +need_version=unknown +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +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_into_libs=no +hardcode_libdir_flag_spec= +hardcode_libdir_separator= +hardcode_direct=no +hardcode_minus_L=no +hardcode_shlibpath_var=unsupported +runpath_var= +link_all_deplibs=unknown +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 egrep regular expression 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= + +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 + ;; +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}' + + # See if GNU ld supports shared libraries. + case $host_os in + aix3* | aix4* | aix5*) + # On AIX, the GNU linker is very broken + # Note:Check GNU linker on AIX 5-IA64 when/if it becomes available. + ld_shlibs=no + cat <&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 + ;; + + 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 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 use + # them. + ld_shlibs=no + ;; + + beos*) + if $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then + allow_undefined_flag=unsupported + # Joseph Beckenbach 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*) + # 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=yes + + extract_expsyms_cmds='test -f $output_objdir/impgen.c || \ + sed -e "/^# \/\* impgen\.c starts here \*\//,/^# \/\* impgen.c ends here \*\// { s/^# //;s/^# *$//; p; }" -e d < $''0 > $output_objdir/impgen.c~ + test -f $output_objdir/impgen.exe || (cd $output_objdir && \ + if test "x$HOST_CC" != "x" ; then $HOST_CC -o impgen impgen.c ; \ + else $CC -o impgen impgen.c ; fi)~ + $output_objdir/impgen $dir/$soroot > $output_objdir/$soname-def' + + old_archive_from_expsyms_cmds='$DLLTOOL --as=$AS --dllname $soname --def $output_objdir/$soname-def --output-lib $output_objdir/$newlib' + + # cygwin and mingw dlls have different entry points and sets of symbols + # to exclude. + # FIXME: what about values for MSVC? + dll_entry=__cygwin_dll_entry@12 + dll_exclude_symbols=DllMain@12,_cygwin_dll_entry@12,_cygwin_noncygwin_dll_entry@12~ + case $host_os in + mingw*) + # mingw values + dll_entry=_DllMainCRTStartup@12 + dll_exclude_symbols=DllMain@12,DllMainCRTStartup@12,DllEntryPoint@12~ + ;; + esac + + # mingw and cygwin differ, and it's simplest to just exclude the union + # of the two symbol sets. + dll_exclude_symbols=DllMain@12,_cygwin_dll_entry@12,_cygwin_noncygwin_dll_entry@12,DllMainCRTStartup@12,DllEntryPoint@12 + + # recent cygwin and mingw systems supply a stub DllMain which the user + # can override, but on older systems we have to supply one (in ltdll.c) + if test "x$lt_cv_need_dllmain" = "xyes"; then + ltdll_obj='$output_objdir/$soname-ltdll.'"$ac_objext " + ltdll_cmds='test -f $output_objdir/$soname-ltdll.c || sed -e "/^# \/\* ltdll\.c starts here \*\//,/^# \/\* ltdll.c ends here \*\// { s/^# //; p; }" -e d < $''0 > $output_objdir/$soname-ltdll.c~ + test -f $output_objdir/$soname-ltdll.$ac_objext || (cd $output_objdir && $CC -c $soname-ltdll.c)~' + else + ltdll_obj= + ltdll_cmds= + fi + + # Extract the symbol export list from an `--export-all' def file, + # then regenerate the def file from the symbol export list, so that + # the compiled dll only exports the symbol export list. + # Be careful not to strip the DATA tag left be newer dlltools. + export_symbols_cmds="$ltdll_cmds"' + $DLLTOOL --export-all --exclude-symbols '$dll_exclude_symbols' --output-def $output_objdir/$soname-def '$ltdll_obj'$libobjs $convenience~ + sed -e "1,/EXPORTS/d" -e "s/ @ [[0-9]]*//" -e "s/ *;.*$//" < $output_objdir/$soname-def > $export_symbols' + + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is. + # If DATA tags from a recent dlltool are present, honour them! + 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; + _lt_hint=1; + cat $export_symbols | while read symbol; do + set dummy \$symbol; + case \[$]# in + 2) echo " \[$]2 @ \$_lt_hint ; " >> $output_objdir/$soname-def;; + 4) echo " \[$]2 \[$]3 \[$]4 ; " >> $output_objdir/$soname-def; _lt_hint=`expr \$_lt_hint - 1`;; + *) echo " \[$]2 @ \$_lt_hint \[$]3 ; " >> $output_objdir/$soname-def;; + esac; + _lt_hint=`expr 1 + \$_lt_hint`; + done; + fi~ + '"$ltdll_cmds"' + $CC -Wl,--base-file,$output_objdir/$soname-base '$lt_cv_cc_dll_switch' -Wl,-e,'$dll_entry' -o $output_objdir/$soname '$ltdll_obj'$libobjs $deplibs $compiler_flags~ + $DLLTOOL --as=$AS --dllname $soname --exclude-symbols '$dll_exclude_symbols' --def $output_objdir/$soname-def --base-file $output_objdir/$soname-base --output-exp $output_objdir/$soname-exp~ + $CC -Wl,--base-file,$output_objdir/$soname-base $output_objdir/$soname-exp '$lt_cv_cc_dll_switch' -Wl,-e,'$dll_entry' -o $output_objdir/$soname '$ltdll_obj'$libobjs $deplibs $compiler_flags~ + $DLLTOOL --as=$AS --dllname $soname --exclude-symbols '$dll_exclude_symbols' --def $output_objdir/$soname-def --base-file $output_objdir/$soname-base --output-exp $output_objdir/$soname-exp --output-lib $output_objdir/$libname.dll.a~ + $CC $output_objdir/$soname-exp '$lt_cv_cc_dll_switch' -Wl,-e,'$dll_entry' -o $output_objdir/$soname '$ltdll_obj'$libobjs $deplibs $compiler_flags' + ;; + + 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 -nodefaultlibs $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared -nodefaultlibs $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris* | sysv5*) + if $LD -v 2>&1 | egrep 'BFD 2\.8' > /dev/null; then + ld_shlibs=no + cat <&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 | egrep ': 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 + ;; + + 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 | egrep ': 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" = yes; then + runpath_var=LD_RUN_PATH + hardcode_libdir_flag_spec='${wl}--rpath ${wl}$libdir' + export_dynamic_flag_spec='${wl}--export-dynamic' + case $host_os in + cygwin* | mingw* | pw32*) + # dlltool doesn't understand --whole-archive et. al. + whole_archive_flag_spec= + ;; + *) + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | egrep 'no-whole-archive' > /dev/null; then + whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + whole_archive_flag_spec= + fi + ;; + esac + 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 "$link_static_flag"; 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 + 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. + + hardcode_direct=yes + archive_cmds='' + hardcode_libdir_separator=':' + if test "$GCC" = yes; then + case $host_os in aix4.[[012]]|aix4.[[012]].*) + 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' + else + # not using gcc + if test "$host_cpu" = ia64; then + shared_flag='${wl}-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 can do strange things, 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' + hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:/usr/lib:/lib' + archive_expsym_cmds="\$CC"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$no_entry_flag \${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 ${wl}-h$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols" + else + hardcode_libdir_flag_spec='${wl}-bnolibpath ${wl}-blibpath:$libdir:/usr/lib:/lib' + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + allow_undefined_flag='${wl}-berok' + # This is a bit strange, but is similar to how AIX traditionally builds + # it's shared libraries. + archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols"' ~$AR -crlo $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 + ;; + + 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 + # 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"`' + ;; + + darwin* | rhapsody*) + case "$host_os" in + rhapsody* | darwin1.[[012]]) + allow_undefined_flag='-undefined suppress' + ;; + *) # Darwin 1.3 on + allow_undefined_flag='-flat_namespace -undefined suppress' + ;; + esac + # FIXME: Relying on posixy $() will cause problems for + # cross-compilation, but unfortunately the echo tests do not + # yet detect zsh echo's removal of \ escapes. Also zsh mangles + # `"' quotes if we put them in here... so don't! + archive_cmds='$CC -r -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs && $CC $(test .$module = .yes && echo -bundle || echo -dynamiclib) $allow_undefined_flag -o $lib ${lib}-master.o $deplibs$linker_flags $(test .$module != .yes && echo -install_name $rpath/$soname $verstring)' + # We need to add '_' to the symbols in $export_symbols first + #archive_expsym_cmds="$archive_cmds"' && strip -s $export_symbols' + hardcode_direct=yes + hardcode_shlibpath_var=no + whole_archive_flag_spec='-all_load $convenience' + ;; + + 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*) + archive_cmds='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + hpux9* | hpux10* | hpux11*) + case $host_os in + hpux9*) 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' ;; + *) archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' ;; + esac + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + hardcode_minus_L=yes # Not in the search PATH, but as the default + # location of the library. + export_dynamic_flag_spec='${wl}-E' + ;; + + 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' + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + 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='-rpath $libdir' + fi + 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' + 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 "-exported_symbol " >> $lib.exp; echo "\$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 ${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=: + ;; + + sco3.2v5*) + 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 + export_dynamic_flag_spec='${wl}-Bexport' + ;; + + solaris*) + # gcc --version < 3.0 without binutils cannot create self contained + # shared libraries reliably, requiring libgcc.a to resolve some of + # the object symbols generated in some cases. Libraries that use + # assert need libgcc.a to resolve __eprintf, for example. Linking + # a copy of libgcc.a into every shared library to guarantee resolving + # such symbols causes other problems: According to Tim Van Holder + # , C++ libraries end up with a separate + # (to the application) exception stack for one thing. + no_undefined_flag=' -z defs' + if test "$GCC" = yes; then + case `$CC --version 2>/dev/null` in + [[12]].*) + cat <&2 + +*** Warning: Releases of GCC earlier than version 3.0 cannot reliably +*** create self contained shared libraries on Solaris systems, without +*** introducing a dependency on libgcc.a. Therefore, libtool is disabling +*** -no-undefined support, which will at least allow you to build shared +*** libraries. However, you may find that when you link such libraries +*** into an application without using GCC, you have to manually add +*** \`gcc --print-libgcc-file-name\` to the link command. We urge you to +*** upgrade to a newer version of GCC. Another option is to rebuild your +*** current GCC to use the GNU linker from GNU binutils 2.9.1 or newer. + +EOF + no_undefined_flag= + ;; + esac + fi + # $CC -shared without GNU ld will not create a library from C++ + # object files and a static libstdc++, better avoid it by now + 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' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_shlibpath_var=no + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) # Supported since Solaris 2.6 (maybe 2.5.1?) + whole_archive_flag_spec='-z allextract$convenience -z defaultextract' ;; + 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' + ;; + + sysv5*) + no_undefined_flag=' -z text' + # $CC -shared without GNU ld will not create a library from C++ + # object files and a static libstdc++, better avoid it by now + 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' + hardcode_libdir_flag_spec= + hardcode_shlibpath_var=no + runpath_var='LD_RUN_PATH' + ;; + + uts4*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_shlibpath_var=no + ;; + + dgux*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_shlibpath_var=no + ;; + + 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.2uw2*) + archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes + hardcode_minus_L=no + hardcode_shlibpath_var=no + hardcode_runpath_var=yes + runpath_var=LD_RUN_PATH + ;; + + sysv5uw7* | unixware7*) + no_undefined_flag='${wl}-z ${wl}text' + if test "$GCC" = yes; then + archive_cmds='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$CC -G ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + runpath_var='LD_RUN_PATH' + hardcode_shlibpath_var=no + ;; + + *) + ld_shlibs=no + ;; + esac +fi +AC_MSG_RESULT([$ld_shlibs]) +test "$ld_shlibs" = no && can_build_shared=no + +# Check hardcoding attributes. +AC_MSG_CHECKING([how to hardcode library paths into programs]) +hardcode_action= +if test -n "$hardcode_libdir_flag_spec" || \ + test -n "$runpath_var"; then + + # We can hardcode non-existant directories. + if test "$hardcode_direct" != no && + # 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 "$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 +AC_MSG_RESULT([$hardcode_action]) + +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 + AC_MSG_RESULT([no]) +fi + +reload_cmds='$LD$reload_flag -o $output$reload_objs' +test -z "$deplibs_check_method" && deplibs_check_method=unknown + +# PORTME Fill in your ld.so characteristics +AC_MSG_CHECKING([dynamic linker characteristics]) +library_names_spec= +libname_spec='lib$name' +soname_spec= +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" +sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" + +case $host_os in +aix3*) + version_type=linux + library_names_spec='${libname}${release}.so$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX has no versioning support, so we append a major version to the name. + soname_spec='${libname}${release}.so$major' + ;; + +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}.so$major ${libname}${release}.so$versuffix $libname.so' + 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.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + 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}.so$major' + fi + shlibpath_var=LIBPATH + fi + hardcode_into_libs=yes + ;; + +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}.so' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi4*) + version_type=linux + need_version=no + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + soname_spec='${libname}${release}.so$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $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" + export_dynamic_flag_spec=-rdynamic + # 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 + need_version=no + need_lib_prefix=no + case $GCC,$host_os in + yes,cygwin*) + library_names_spec='$libname.dll.a' + soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | sed -e 's/[[.]]/-/g'`${versuffix}.dll' + postinstall_cmds='dlpath=`bash 2>&1 -c '\''. $dir/${file}i;echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog .libs/$dlname \$dldir/$dlname' + postuninstall_cmds='dldll=`bash 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $rm \$dlpath' + ;; + yes,mingw*) + library_names_spec='${libname}`echo ${release} | sed -e 's/[[.]]/-/g'`${versuffix}.dll' + sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | sed -e "s/^libraries://" -e "s/;/ /g" -e "s,=/,/,g"` + ;; + yes,pw32*) + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | sed -e 's/[.]/-/g'`${versuffix}.dll' + ;; + *) + library_names_spec='${libname}`echo ${release} | sed -e 's/[[.]]/-/g'`${versuffix}.dll $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 + # FIXME: Relying on posixy $() will cause problems for + # cross-compilation, but unfortunately the echo tests do not + # yet detect zsh echo's removal of \ escapes. + library_names_spec='${libname}${release}${versuffix}.$(test .$module = .yes && echo so || echo dylib) ${libname}${release}${major}.$(test .$module = .yes && echo so || echo dylib) ${libname}.$(test .$module = .yes && echo so || echo dylib)' + soname_spec='${libname}${release}${major}.$(test .$module = .yes && echo so || echo dylib)' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + ;; + +freebsd1*) + dynamic_linker=no + ;; + +freebsd*-gnu*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + soname_spec='${libname}${release}.so$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='GNU/FreeBSD ld.so' + ;; + +freebsd*) + objformat=`test -x /usr/bin/objformat && /usr/bin/objformat || echo aout` + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so $libname.so' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='${libname}${release}.so$versuffix $libname.so$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2*) + shlibpath_overrides_runpath=yes + ;; + *) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + esac + ;; + +gnu*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so${major} ${libname}.so' + soname_spec='${libname}${release}.so$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. + dynamic_linker="$host_os dld.sl" + version_type=sunos + need_lib_prefix=no + need_version=no + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}.sl$versuffix ${libname}${release}.sl$major $libname.sl' + soname_spec='${libname}${release}.sl$major' + # HP-UX runs *really* slowly unless shared libraries are mode 555. + postinstall_cmds='chmod 555 $lib' + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) version_type=irix ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}.so$major' + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major ${libname}${release}.so $libname.so' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 ") libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 ") 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}" + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux-gnuoldld* | linux-gnuaout* | linux-gnucoff*) + dynamic_linker=no + ;; + +# This must be Linux ELF. +linux-gnu*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + soname_spec='${libname}${release}.so$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + 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 + + # 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' + ;; + +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}.so$versuffix ${libname}.so$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major ${libname}${release}.so ${libname}.so' + soname_spec='${libname}${release}.so$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}.so$versuffix ${libname}${release}.so$major $libname.so' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +openbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + 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 + library_names_spec='${libname}${release}.so$versuffix ${libname}.so$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + ;; + +os2*) + libname_spec='$name' + need_lib_prefix=no + library_names_spec='$libname.dll $libname.a' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=LIBPATH + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_version=no + need_lib_prefix=no + soname_spec='${libname}${release}.so$major' + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + 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" + hardcode_into_libs=yes + ;; + +sco3.2v5*) + version_type=osf + soname_spec='${libname}${release}.so$major' + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + shlibpath_var=LD_LIBRARY_PATH + ;; + +solaris*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + soname_spec='${libname}${release}.so$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}.so$versuffix ${libname}.so$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.2uw2* | sysv4.3* | sysv5*) + version_type=linux + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + soname_spec='${libname}${release}.so$major' + shlibpath_var=LD_LIBRARY_PATH + 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 + ;; + +uts4*) + version_type=linux + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + soname_spec='${libname}${release}.so$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +dgux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + soname_spec='${libname}${release}.so$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +sysv4*MP*) + if test -d /usr/nec ;then + version_type=linux + library_names_spec='$libname.so.$versuffix $libname.so.$major $libname.so' + soname_spec='$libname.so.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +*) + dynamic_linker=no + ;; +esac +AC_MSG_RESULT([$dynamic_linker]) +test "$dynamic_linker" = no && can_build_shared=no + +# Report the final consequences. +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*) + 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]) + +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 + +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_DLOPEN_SELF + +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. + AC_MSG_CHECKING([whether -lc should be explicitly linked in]) + AC_CACHE_VAL([lt_cv_archive_cmds_need_lc], + [$rm conftest* + echo 'static int dummy;' > conftest.$ac_ext + + if AC_TRY_EVAL(ac_compile); then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$lt_cv_prog_cc_wl + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + save_allow_undefined_flag=$allow_undefined_flag + allow_undefined_flag= + if AC_TRY_EVAL(archive_cmds 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) + then + lt_cv_archive_cmds_need_lc=no + else + lt_cv_archive_cmds_need_lc=yes + fi + allow_undefined_flag=$save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi]) + AC_MSG_RESULT([$lt_cv_archive_cmds_need_lc]) + ;; + esac +fi +need_lc=${lt_cv_archive_cmds_need_lc-yes} + +# The second 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 + : +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. + test -f Makefile && make "$ltmain" +fi + +if test -f "$ltmain"; then + trap "$rm \"${ofile}T\"; exit 1" 1 2 15 + $rm -f "${ofile}T" + + echo creating $ofile + + # 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 SED \ + AR AR_FLAGS CC LD LN_S NM SHELL \ + reload_flag reload_cmds wl \ + pic_flag link_static_flag no_builtin_flag export_dynamic_flag_spec \ + thread_safe_flag_spec whole_archive_flag_spec libname_spec \ + library_names_spec soname_spec \ + RANLIB old_archive_cmds old_archive_from_new_cmds old_postinstall_cmds \ + old_postuninstall_cmds archive_cmds archive_expsym_cmds postinstall_cmds \ + postuninstall_cmds extract_expsyms_cmds old_archive_from_expsyms_cmds \ + old_striplib striplib file_magic_cmd export_symbols_cmds \ + deplibs_check_method allow_undefined_flag no_undefined_flag \ + finish_cmds finish_eval global_symbol_pipe global_symbol_to_cdecl \ + global_symbol_to_c_name_address \ + hardcode_libdir_flag_spec hardcode_libdir_separator \ + sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ + compiler_c_o compiler_o_lo need_locks exclude_expsyms include_expsyms; do + + case $var in + reload_cmds | old_archive_cmds | old_archive_from_new_cmds | \ + old_postinstall_cmds | old_postuninstall_cmds | \ + export_symbols_cmds | archive_cmds | archive_expsym_cmds | \ + extract_expsyms_cmds | old_archive_from_expsyms_cmds | \ + postinstall_cmds | postuninstall_cmds | \ + finish_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 + + cat <<__EOF__ > "${ofile}T" +#! $SHELL + +# `$echo "$ofile" | 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-2000 Free Software Foundation, Inc. +# Originally by Gordon Matzigkeit , 1996 +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# A sed that does not truncate output. +SED=$lt_SED + +# Sed that helps us avoid accidentally triggering echo(1) options like -n. +Xsed="${SED} -e s/^X//" + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +if test "X\${CDPATH+set}" = Xset; then CDPATH=:; export CDPATH; fi + +# ### 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=$need_lc + +# Whether or not to optimize for fast installation. +fast_install=$enable_fast_install + +# The host system. +host_alias=$host_alias +host=$host + +# An echo program that does not interpret backslashes. +echo=$lt_echo + +# The archiver. +AR=$lt_AR +AR_FLAGS=$lt_AR_FLAGS + +# The default C compiler. +CC=$lt_CC + +# Is the compiler the GNU C compiler? +with_gcc=$GCC + +# 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=$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_wl + +# Object file suffix (normally "o"). +objext="$ac_objext" + +# Old archive suffix (normally "a"). +libext="$libext" + +# Executable file suffix (normally ""). +exeext="$exeext" + +# Additional compiler flags for building library objects. +pic_flag=$lt_pic_flag +pic_mode=$pic_mode + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_compiler_c_o + +# Can we write directly to a .lo ? +compiler_o_lo=$lt_compiler_o_lo + +# 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_link_static_flag + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_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 to strip libraries. +old_striplib=$lt_old_striplib +striplib=$lt_striplib + +# 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_global_symbol_pipe + +# Transform the output of nm in a proper C declaration +global_symbol_to_cdecl=$lt_global_symbol_to_cdecl + +# Transform the output of nm in a C name address pair +global_symbol_to_c_name_address=$lt_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 + +# 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.so during linking hardcodes DIR into the +# resulting binary. +hardcode_direct=$hardcode_direct + +# Set to yes if using the -LDIR flag during linking hardcodes DIR into the +# resulting binary. +hardcode_minus_L=$hardcode_minus_L + +# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into +# the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var + +# 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 >> "${ofile}T" + +# 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 + + case $host_os in + cygwin* | mingw* | pw32* | os2*) + cat <<'EOF' >> "${ofile}T" + # This is a source program that is used to create dlls on Windows + # Don't remove nor modify the starting and closing comments +# /* ltdll.c starts here */ +# #define WIN32_LEAN_AND_MEAN +# #include +# #undef WIN32_LEAN_AND_MEAN +# #include +# +# #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 +# 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 */ + # This is a source program that is used to create import libraries + # on Windows for dlls which lack them. Don't remove nor modify the + # starting and closing comments +# /* impgen.c starts here */ +# /* Copyright (C) 1999-2000 Free Software Foundation, Inc. +# +# This file is part of GNU libtool. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# */ +# +# #include /* for printf() */ +# #include /* for open(), lseek(), read() */ +# #include /* for O_RDONLY, O_BINARY */ +# #include /* for strdup() */ +# +# /* O_BINARY isn't required (or even defined sometimes) under Unix */ +# #ifndef O_BINARY +# #define O_BINARY 0 +# #endif +# +# static unsigned int +# pe_get16 (fd, offset) +# int fd; +# int offset; +# { +# unsigned char b[2]; +# lseek (fd, offset, SEEK_SET); +# read (fd, b, 2); +# return b[0] + (b[1]<<8); +# } +# +# static unsigned int +# pe_get32 (fd, offset) +# int fd; +# int offset; +# { +# unsigned char b[4]; +# lseek (fd, offset, SEEK_SET); +# read (fd, b, 4); +# return b[0] + (b[1]<<8) + (b[2]<<16) + (b[3]<<24); +# } +# +# static unsigned int +# pe_as32 (ptr) +# void *ptr; +# { +# unsigned char *b = ptr; +# return b[0] + (b[1]<<8) + (b[2]<<16) + (b[3]<<24); +# } +# +# int +# main (argc, argv) +# int argc; +# char *argv[]; +# { +# int dll; +# unsigned long pe_header_offset, opthdr_ofs, num_entries, i; +# unsigned long export_rva, export_size, nsections, secptr, expptr; +# unsigned long name_rvas, nexp; +# unsigned char *expdata, *erva; +# char *filename, *dll_name; +# +# filename = argv[1]; +# +# dll = open(filename, O_RDONLY|O_BINARY); +# if (dll < 1) +# return 1; +# +# dll_name = filename; +# +# for (i=0; filename[i]; i++) +# if (filename[i] == '/' || filename[i] == '\\' || filename[i] == ':') +# dll_name = filename + i +1; +# +# pe_header_offset = pe_get32 (dll, 0x3c); +# opthdr_ofs = pe_header_offset + 4 + 20; +# num_entries = pe_get32 (dll, opthdr_ofs + 92); +# +# if (num_entries < 1) /* no exports */ +# return 1; +# +# export_rva = pe_get32 (dll, opthdr_ofs + 96); +# export_size = pe_get32 (dll, opthdr_ofs + 100); +# nsections = pe_get16 (dll, pe_header_offset + 4 +2); +# secptr = (pe_header_offset + 4 + 20 + +# pe_get16 (dll, pe_header_offset + 4 + 16)); +# +# expptr = 0; +# for (i = 0; i < nsections; i++) +# { +# char sname[8]; +# unsigned long secptr1 = secptr + 40 * i; +# unsigned long vaddr = pe_get32 (dll, secptr1 + 12); +# unsigned long vsize = pe_get32 (dll, secptr1 + 16); +# unsigned long fptr = pe_get32 (dll, secptr1 + 20); +# lseek(dll, secptr1, SEEK_SET); +# read(dll, sname, 8); +# if (vaddr <= export_rva && vaddr+vsize > export_rva) +# { +# expptr = fptr + (export_rva - vaddr); +# if (export_rva + export_size > vaddr + vsize) +# export_size = vsize - (export_rva - vaddr); +# break; +# } +# } +# +# expdata = (unsigned char*)malloc(export_size); +# lseek (dll, expptr, SEEK_SET); +# read (dll, expdata, export_size); +# erva = expdata - export_rva; +# +# nexp = pe_as32 (expdata+24); +# name_rvas = pe_as32 (expdata+32); +# +# printf ("EXPORTS\n"); +# for (i = 0; i> "${ofile}T" || (rm -f "${ofile}T"; exit 1) + + mv -f "${ofile}T" "$ofile" || \ + (rm -f "$ofile" && cp "${ofile}T" "$ofile" && rm -f "${ofile}T") + chmod +x "$ofile" +fi + +])# _LT_AC_LTCONFIG_HACK + +# AC_LIBTOOL_DLOPEN - enable checks for dlopen support +AC_DEFUN([AC_LIBTOOL_DLOPEN], [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])]) + +# AC_LIBTOOL_WIN32_DLL - declare package support for building win32 dll's +AC_DEFUN([AC_LIBTOOL_WIN32_DLL], [AC_BEFORE([$0], [AC_LIBTOOL_SETUP])]) + +# AC_ENABLE_SHARED - implement the --enable-shared flag +# Usage: AC_ENABLE_SHARED[(DEFAULT)] +# Where 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, +changequote(<<, >>)dnl +<< --enable-shared[=PKGS] build shared libraries [default=>>AC_ENABLE_SHARED_DEFAULT], +changequote([, ])dnl +[p=${PACKAGE-default} +case $enableval in +yes) enable_shared=yes ;; +no) enable_shared=no ;; +*) + enable_shared=no + # Look at the argument we got. We use all the common list separators. + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:," + for pkg in $enableval; do + if test "X$pkg" = "X$p"; then + enable_shared=yes + fi + done + IFS="$ac_save_ifs" + ;; +esac], +enable_shared=AC_ENABLE_SHARED_DEFAULT)dnl +]) + +# 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_ENABLE_STATIC - implement the --enable-static flag +# Usage: AC_ENABLE_STATIC[(DEFAULT)] +# Where 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, +changequote(<<, >>)dnl +<< --enable-static[=PKGS] build static libraries [default=>>AC_ENABLE_STATIC_DEFAULT], +changequote([, ])dnl +[p=${PACKAGE-default} +case $enableval in +yes) enable_static=yes ;; +no) enable_static=no ;; +*) + enable_static=no + # Look at the argument we got. We use all the common list separators. + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:," + for pkg in $enableval; do + if test "X$pkg" = "X$p"; then + enable_static=yes + fi + done + IFS="$ac_save_ifs" + ;; +esac], +enable_static=AC_ENABLE_STATIC_DEFAULT)dnl +]) + +# 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_ENABLE_FAST_INSTALL - implement the --enable-fast-install flag +# Usage: AC_ENABLE_FAST_INSTALL[(DEFAULT)] +# Where 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, +changequote(<<, >>)dnl +<< --enable-fast-install[=PKGS] optimize for fast installation [default=>>AC_ENABLE_FAST_INSTALL_DEFAULT], +changequote([, ])dnl +[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. + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:," + for pkg in $enableval; do + if test "X$pkg" = "X$p"; then + enable_fast_install=yes + fi + done + IFS="$ac_save_ifs" + ;; +esac], +enable_fast_install=AC_ENABLE_FAST_INSTALL_DEFAULT)dnl +]) + +# 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_LIBTOOL_PICMODE - implement the --with-pic flag +# Usage: AC_LIBTOOL_PICMODE[(MODE)] +# Where 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_PATH_TOOL_PREFIX - find a file program which can recognise shared library +AC_DEFUN([AC_PATH_TOOL_PREFIX], +[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_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a dos path. + ;; + *) + ac_save_MAGIC_CMD="$MAGIC_CMD" + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" +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 + 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 <&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="$ac_save_ifs" + MAGIC_CMD="$ac_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_MAGIC - find a file program which can recognise a shared library +AC_DEFUN([AC_PATH_MAGIC], +[AC_REQUIRE([AC_CHECK_TOOL_PREFIX])dnl +AC_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin:$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) + else + MAGIC_CMD=: + fi +fi +]) + + +# AC_PROG_LD - find the path to the GNU or non-GNU linker +AC_DEFUN([AC_PROG_LD], +[AC_ARG_WITH(gnu-ld, +[ --with-gnu-ld assume the C compiler uses GNU ld [default=no]], +test "$withval" = no || with_gnu_ld=yes, with_gnu_ld=no) +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +AC_REQUIRE([_LT_AC_LIBTOOL_SYS_PATH_SEPARATOR])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 GCC]) + 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. + [[\\/]]* | [[A-Za-z]]:[[\\/]]*) + re_direlt='/[[^/]][[^/]]*/\.\./' + # Canonicalize the path 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 + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + 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 GNU ld's only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + if "$lt_cv_path_LD" -v 2>&1 < /dev/null | egrep '(GNU|with BFD)' > /dev/null; then + test "$with_gnu_ld" != no && break + else + test "$with_gnu_ld" != yes && break + fi + fi + done + IFS="$ac_save_ifs" +else + 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_GNU - +AC_DEFUN([AC_PROG_LD_GNU], +[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 ld's only accept -v. +if $LD -v 2>&1 &5; then + lt_cv_prog_gnu_ld=yes +else + lt_cv_prog_gnu_ld=no +fi]) +with_gnu_ld=$lt_cv_prog_gnu_ld +]) + +# 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 +test -n "$reload_flag" && reload_flag=" $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 egrep 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 + ;; + +bsdi4*) + 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* | mingw* | pw32*) + lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?' + lt_cv_file_magic_cmd='$OBJDUMP -f' + ;; + +darwin* | rhapsody*) + lt_cv_deplibs_check_method='file_magic Mach-O dynamically linked shared library' + lt_cv_file_magic_cmd='/usr/bin/file -L' + case "$host_os" in + rhapsody* | darwin1.[[012]]) + lt_cv_file_magic_test_file=`echo /System/Library/Frameworks/System.framework/Versions/*/System | head -1` + ;; + *) # Darwin 1.3 on + lt_cv_file_magic_test_file='/usr/lib/libSystem.dylib' + ;; + esac + ;; + +freebsd*) + 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)/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_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]].[[0-9]]) shared library' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=/usr/lib/libc.sl + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + irix5* | nonstopux*) + # this will be overridden with pass_all, but let us keep it just in case + lt_cv_deplibs_check_method="file_magic ELF 32-bit MSB dynamic lib MIPS - version 1" + ;; + *) + case $LD in + *-32|*"-32 ") libmagic=32-bit;; + *-n32|*"-n32 ") libmagic=N32;; + *-64|*"-64 ") libmagic=64-bit;; + *) libmagic=never-match;; + esac + # this will be overridden with pass_all, but let us keep it just in case + lt_cv_deplibs_check_method="file_magic ELF ${libmagic} MSB mips-[[1234]] dynamic lib MIPS - version 1" + ;; + esac + lt_cv_file_magic_test_file=`echo /lib${libsuff}/libc.so*` + lt_cv_deplibs_check_method=pass_all + ;; + +# This must be Linux ELF. +linux-gnu*) + case $host_cpu in + alpha* | hppa* | i*86 | mips | mipsel | powerpc* | sparc* | ia64*) + lt_cv_deplibs_check_method=pass_all ;; + *) + # glibc up to 2.1.1 does not perform some relocations on ARM + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' ;; + esac + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + +netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[[^/\.]]+\.so\.[[0-9]]+\.[[0-9]]+$' + else + lt_cv_deplibs_check_method='match_pattern /lib[[^/\.]]+\.so$' + 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 + ;; + +openbsd*) + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB shared object' + else + lt_cv_deplibs_check_method='file_magic OpenBSD.* shared library' + fi + ;; + +osf3* | osf4* | osf5*) + # this will be overridden with pass_all, but let us keep it just in case + lt_cv_deplibs_check_method='file_magic COFF format alpha shared library' + lt_cv_file_magic_test_file=/shlib/libc.so + lt_cv_deplibs_check_method=pass_all + ;; + +sco3.2v5*) + lt_cv_deplibs_check_method=pass_all + ;; + +solaris*) + lt_cv_deplibs_check_method=pass_all + lt_cv_file_magic_test_file=/lib/libc.so + ;; + +sysv5uw[[78]]* | sysv4*uw2*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + 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 + ;; + esac + ;; +esac +]) +file_magic_cmd=$lt_cv_file_magic_cmd +deplibs_check_method=$lt_cv_deplibs_check_method +]) + + +# AC_PROG_NM - find the path to a BSD-compatible name lister +AC_DEFUN([AC_PROG_NM], +[AC_REQUIRE([_LT_AC_LIBTOOL_SYS_PATH_SEPARATOR])dnl +AC_MSG_CHECKING([for BSD-compatible nm]) +AC_CACHE_VAL(lt_cv_path_NM, +[if test -n "$NM"; then + # Let the user override the test. + lt_cv_path_NM="$NM" +else + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH /usr/ccs/bin /usr/ucb /bin; do + test -z "$ac_dir" && ac_dir=. + tmp_nm=$ac_dir/${ac_tool_prefix}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 + if ($tmp_nm -B /dev/null 2>&1 | sed '1q'; exit 0) | egrep '(/dev/null|Invalid file or object type)' >/dev/null; then + lt_cv_path_NM="$tmp_nm -B" + break + elif ($tmp_nm -p /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then + lt_cv_path_NM="$tmp_nm -p" + break + else + 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 + fi + fi + done + IFS="$ac_save_ifs" + test -z "$lt_cv_path_NM" && lt_cv_path_NM=nm +fi]) +NM="$lt_cv_path_NM" +AC_MSG_RESULT([$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*) + # These system don't have libm + ;; +*-ncr-sysv4.3*) + AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw") + AC_CHECK_LIB(m, main, LIBM="$LIBM -lm") + ;; +*) + AC_CHECK_LIB(m, main, LIBM="-lm") + ;; +esac +]) + +# AC_LIBLTDL_CONVENIENCE[(dir)] - 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 LIBLTDL and LTDLINCL are not +# AC_SUBSTed, nor is AC_CONFIG_SUBDIRS called. If DIR 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_INSTALLABLE[(dir)] - 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 LIBLTDL and LTDLINCL are not AC_SUBSTed, nor is +# AC_CONFIG_SUBDIRS called. If DIR 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 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. +# 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, main, + [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" +]) + +# 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]) + +# 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_executable_p="test -f" +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_prog in sed gsed; do + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then + _sed_list="$_sed_list $as_dir/$ac_prog$ac_exec_ext" + fi + done + done +done + + # 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. +: ${TMPDIR=/tmp} +{ + tmp=`(umask 077 && mktemp -d -q "$TMPDIR/sedXXXXXX") 2>/dev/null` && + test -n "$tmp" && test -d "$tmp" +} || +{ + tmp=$TMPDIR/sed$$-$RANDOM + (umask 077 && mkdir $tmp) +} || +{ + echo "$me: cannot create a temporary directory in $TMPDIR" >&2 + { (exit 1); exit 1; } +} + _max=0 + _count=0 + # Add /usr/xpg4/bin/sed as it is typically found on Solaris + # along with /bin/sed that truncates output. + for _sed in $_sed_list /usr/xpg4/bin/sed; do + test ! -f ${_sed} && break + cat /dev/null > "$tmp/sed.in" + _count=0 + echo ${ECHO_N-$ac_n} "0123456789${ECHO_C-$ac_c}" >"$tmp/sed.in" + # Check for GNU sed and select it if it is found. + if "${_sed}" --version 2>&1 < /dev/null | egrep '(GNU)' > /dev/null; then + lt_cv_path_SED=${_sed} + break + fi + while true; do + cat "$tmp/sed.in" "$tmp/sed.in" >"$tmp/sed.tmp" + mv "$tmp/sed.tmp" "$tmp/sed.in" + cp "$tmp/sed.in" "$tmp/sed.nl" + echo >>"$tmp/sed.nl" + ${_sed} -e 's/a$//' < "$tmp/sed.nl" >"$tmp/sed.out" || break + cmp -s "$tmp/sed.out" "$tmp/sed.nl" || break + # 40000 chars as input seems more than enough + test $_count -gt 10 && break + _count=`expr $_count + 1` + if test $_count -gt $_max; then + _max=$_count + lt_cv_path_SED=$_sed + fi + done + done + rm -rf "$tmp" +]) +if test "X$SED" != "X"; then + lt_cv_path_SED=$SED +else + SED=$lt_cv_path_SED +fi +AC_MSG_RESULT([$SED]) +]) + diff --git a/src/WinLibs/FTGL/unix/bootstrap b/src/WinLibs/FTGL/unix/bootstrap new file mode 100644 index 000000000..a059b4978 --- /dev/null +++ b/src/WinLibs/FTGL/unix/bootstrap @@ -0,0 +1,9 @@ +#!/bin/sh + +set -e + +cat m4/*.m4 > acinclude.m4 +aclocal +libtoolize --copy --force +cp /usr/share/automake/install-sh . +autoconf diff --git a/src/WinLibs/FTGL/unix/config.guess b/src/WinLibs/FTGL/unix/config.guess new file mode 100644 index 000000000..78f6b92cd --- /dev/null +++ b/src/WinLibs/FTGL/unix/config.guess @@ -0,0 +1,1409 @@ +#! /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-01-10' + +# 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 . +# Please send patches to . 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 ." + +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 ;; + *:MicroBSD:*:*) + echo ${UNAME_MACHINE}-unknown-microbsd${UNAME_RELEASE} + exit 0 ;; + alpha:OSF1:*:*) + if test $UNAME_RELEASE = "V4.0"; then + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` + fi + # A Vn.n version is a released version. + # A Tn.n version is a released field test version. + # A Xn.n version is an unreleased experimental baselevel. + # 1.2 uses "1.2" for uname -r. + eval $set_cc_for_build + cat <$dummy.s + .data +\$Lformat: + .byte 37,100,45,37,120,10,0 # "%d-%x\n" + + .text + .globl main + .align 4 + .ent main +main: + .frame \$30,16,\$26,0 + ldgp \$29,0(\$27) + .prologue 1 + .long 0x47e03d80 # implver \$0 + lda \$2,-1 + .long 0x47e20c21 # amask \$2,\$1 + lda \$16,\$Lformat + mov \$0,\$17 + not \$1,\$18 + jsr \$26,printf + ldgp \$29,0(\$26) + mov 0,\$16 + jsr \$26,exit + .end main +EOF + $CC_FOR_BUILD -o $dummy $dummy.s 2>/dev/null + if test "$?" = 0 ; then + case `$dummy` in + 0-0) + UNAME_MACHINE="alpha" + ;; + 1-0) + UNAME_MACHINE="alphaev5" + ;; + 1-1) + UNAME_MACHINE="alphaev56" + ;; + 1-101) + UNAME_MACHINE="alphapca56" + ;; + 2-303) + UNAME_MACHINE="alphaev6" + ;; + 2-307) + UNAME_MACHINE="alphaev67" + ;; + 2-1307) + UNAME_MACHINE="alphaev68" + ;; + 3-1307) + UNAME_MACHINE="alphaev7" + ;; + esac + fi + 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 /* 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 + + 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 + #include + + 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 + 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 + #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 + #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' /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 + echo i586-unisys-sysv4 + exit 0 ;; + *:UNIX_System_V:4*:FTX*) + # From Gerald Hewes . + # 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 < +# include +#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 + 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 +# 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 < 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/src/WinLibs/FTGL/unix/config.sub b/src/WinLibs/FTGL/unix/config.sub new file mode 100644 index 000000000..04baf3d80 --- /dev/null +++ b/src/WinLibs/FTGL/unix/config.sub @@ -0,0 +1,1473 @@ +#! /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-01-03' + +# 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 . 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 ." + +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] | sh3e | 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-* \ + | 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]-* | sh3e-* | 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-* | 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 + ;; + 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 | sh3eb | sh4eb | sh[1234]le | sh3ele) + 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* | -microbsd*) + # Remember, each alternative MUST END IN *, to match a version number. + ;; + -qnx*) + case $basic_machine in + x86-* | i*86-*) + ;; + *) + os=-nto$os + ;; + esac + ;; + -nto-qnx*) + ;; + -nto*) + os=`echo $os | sed -e 's|nto|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 + ;; + -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/src/WinLibs/FTGL/unix/configure b/src/WinLibs/FTGL/unix/configure new file mode 100644 index 000000000..680211263 --- /dev/null +++ b/src/WinLibs/FTGL/unix/configure @@ -0,0 +1,11386 @@ +#! /bin/sh +# Guess values for system-dependent variables and create Makefiles. +# Generated by GNU Autoconf 2.57 for ftgl 2.0.5. +# +# Report bugs to . +# +# Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002 +# 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 + +# Support unset when possible. +if (FOO=FOO; unset FOO) >/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 -n "`(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 + as_mkdir_p=false +fi + +as_executable_p="test -f" + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="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="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 + + +# Find the correct PATH separator. Usually this is `:', but +# DJGPP uses `;' like DOS. +if test "X${PATH_SEPARATOR+set}" != Xset; then + UNAME=${UNAME-`uname 2>/dev/null`} + case X$UNAME in + *-DOS) lt_cv_sys_path_separator=';' ;; + *) lt_cv_sys_path_separator=':' ;; + esac + PATH_SEPARATOR=$lt_cv_sys_path_separator +fi + + +# 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 </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. + + IFS="${IFS= }"; save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for dir in $PATH /usr/ucb; do + 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="$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 + + + +# 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='ftgl' +PACKAGE_TARNAME='ftgl' +PACKAGE_VERSION='2.0.5' +PACKAGE_STRING='ftgl 2.0.5' +PACKAGE_BUGREPORT='henryj@paradise.net.nz' + +ac_unique_file="Make.conf.in" +# Factoring default headers for most tests. +ac_includes_default="\ +#include +#if HAVE_SYS_TYPES_H +# include +#endif +#if HAVE_SYS_STAT_H +# include +#endif +#if STDC_HEADERS +# include +# include +#else +# if HAVE_STDLIB_H +# include +# endif +#endif +#if HAVE_STRING_H +# if !STDC_HEADERS && HAVE_MEMORY_H +# include +# endif +# include +#endif +#if HAVE_STRINGS_H +# include +#endif +#if HAVE_INTTYPES_H +# include +#else +# if HAVE_STDINT_H +# include +# endif +#endif +#if HAVE_UNISTD_H +# include +#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 build build_cpu build_vendor build_os host host_cpu host_vendor host_os CXX CXXFLAGS LDFLAGS CPPFLAGS ac_ct_CXX EXEEXT OBJEXT CC CFLAGS ac_ct_CC LN_S ECHO RANLIB ac_ct_RANLIB STRIP ac_ct_STRIP CPP EGREP LIBTOOL FT2_CONFIG FT2_CFLAGS FT2_LIBS X_CFLAGS X_PRE_LIBS X_LIBS X_EXTRA_LIBS GL_CFLAGS GL_LIBS HAVE_GLUT GLUT_CFLAGS GLUT_LIBS INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA DOXYGEN 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_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_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_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_CPP_set=${CPP+set} +ac_env_CPP_value=$CPP +ac_cv_env_CPP_set=${CPP+set} +ac_cv_env_CPP_value=$CPP + +# +# 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 ftgl 2.0.5 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 + +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 + case $ac_init_help in + short | recursive ) echo "Configuration of ftgl 2.0.5:";; + esac + 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=no + --enable-static=PKGS build static libraries default=yes + --enable-fast-install=PKGS optimize for fast installation default=yes + --disable-libtool-lock avoid locking (might break parallel builds) + --disable-freetypetest Do not try to compile and run a test FreeType 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-x use the X Window System + --with-ft-prefix=PFX Prefix where FreeType is installed (optional) + --with-ft-exec-prefix=PFX Exec prefix where FreeType is installed (optional) + --with-gl-inc=DIR Directory where GL/gl.h is installed + --with-gl-lib=DIR Directory where OpenGL libraries are installed + --with-glut-inc=DIR Directory where GL/glut.h is installed (optional) + --with-glut-lib=DIR Directory where GLUT libraries are installed + (optional) + +Some influential environment variables: + CXX C++ compiler command + CXXFLAGS C++ compiler flags + LDFLAGS linker flags, e.g. -L if you have libraries in a + nonstandard directory + CPPFLAGS C/C++ preprocessor flags, e.g. -I if you have + headers in a nonstandard directory + CC C compiler command + CFLAGS C compiler flags + CPP C preprocessor + +Use these variables to override the choices made by `configure' or to help +it to find libraries and programs with nonstandard names/locations. + +Report bugs to . +_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 +# Don't blindly perform a `cd "$ac_dir"/$ac_foo && pwd` since $ac_foo can be +# absolute. +ac_abs_builddir=`cd "$ac_dir" && cd $ac_builddir && pwd` +ac_abs_top_builddir=`cd "$ac_dir" && cd ${ac_top_builddir}. && pwd` +ac_abs_srcdir=`cd "$ac_dir" && cd $ac_srcdir && pwd` +ac_abs_top_srcdir=`cd "$ac_dir" && cd $ac_top_srcdir && pwd` + + 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 +ftgl configure 2.0.5 +generated by GNU Autoconf 2.57 + +Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002 +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 ftgl $as_me 2.0.5, which was +generated by GNU Autoconf 2.57. 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.* *.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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +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/'` + + + +if test "$build" = "$host" ; then + case "$build" in + *-*-irix*) + if test -z "$CXX" ; then + CXX=CC + fi + if test -z "$CC" ; then + CC=cc + fi + if test x$CXX = xCC -a -z "$CXXFLAGS" ; then + # It might be worthwhile to move this out of here, say + # EXTRA_CXXFLAGS. Forcing -n32 might cause trouble, too. + CXXFLAGS="-LANG:std -n32 -woff 1201 -O3" + fi + ;; + esac +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 +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 &5\"") >&5 + (eval $ac_compiler --version &5) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v &5\"") >&5 + (eval $ac_compiler -v &5) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V &5\"") >&5 + (eval $ac_compiler -V &5) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* 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" >&5 +echo $ECHO_N "checking for C++ compiler default output... $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 +#line $LINENO "configure" +/* 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_cxx_compiler_gnu+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* 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>&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.$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 +#line $LINENO "configure" +/* 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>&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.$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 \ + ''\ + '#include ' \ + '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 +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +$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>&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.$ac_objext conftest.$ac_ext + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* 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>&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.$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=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 + + + +# Check whether --enable-shared or --disable-shared was given. +if test "${enable_shared+set}" = set; then + enableval="$enable_shared" + p=${PACKAGE-default} +case $enableval in +yes) enable_shared=yes ;; +no) enable_shared=no ;; +*) + enable_shared=no + # Look at the argument we got. We use all the common list separators. + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:," + for pkg in $enableval; do + if test "X$pkg" = "X$p"; then + enable_shared=yes + fi + done + IFS="$ac_save_ifs" + ;; +esac +else + enable_shared=no +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. + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:," + for pkg in $enableval; do + if test "X$pkg" = "X$p"; then + enable_static=yes + fi + done + IFS="$ac_save_ifs" + ;; +esac +else + enable_static=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. + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:," + for pkg in $enableval; do + if test "X$pkg" = "X$p"; then + enable_fast_install=yes + fi + done + IFS="$ac_save_ifs" + ;; +esac +else + enable_fast_install=yes +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 &5\"") >&5 + (eval $ac_compiler --version &5) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v &5\"") >&5 + (eval $ac_compiler -v &5) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V &5\"") >&5 + (eval $ac_compiler -V &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 +#line $LINENO "configure" +/* 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>&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.$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 +#line $LINENO "configure" +/* 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>&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.$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 +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +#include +#include +/* 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; +} +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>&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.$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>&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 \ + ''\ + '#include ' \ + '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 +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +$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>&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.$ac_objext conftest.$ac_ext + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* 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>&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.$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.$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 + +# Find the correct PATH separator. Usually this is `:', but +# DJGPP uses `;' like DOS. +if test "X${PATH_SEPARATOR+set}" != Xset; then + UNAME=${UNAME-`uname 2>/dev/null`} + case X$UNAME in + *-DOS) lt_cv_sys_path_separator=';' ;; + *) lt_cv_sys_path_separator=':' ;; + esac + PATH_SEPARATOR=$lt_cv_sys_path_separator +fi + + +# Check whether --with-gnu-ld or --without-gnu-ld was given. +if test "${with_gnu_ld+set}" = set; then + withval="$with_gnu_ld" + test "$withval" = no || with_gnu_ld=yes +else + with_gnu_ld=no +fi; +ac_prog=ld +if test "$GCC" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + echo "$as_me:$LINENO: checking for ld used by GCC" >&5 +echo $ECHO_N "checking for ld used by GCC... $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. + [\\/]* | [A-Za-z]:[\\/]*) + re_direlt='/[^/][^/]*/\.\./' + # Canonicalize the path 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 + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + 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 GNU ld's only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + if "$lt_cv_path_LD" -v 2>&1 < /dev/null | egrep '(GNU|with BFD)' > /dev/null; then + test "$with_gnu_ld" != no && break + else + test "$with_gnu_ld" != yes && break + fi + fi + done + IFS="$ac_save_ifs" +else + 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 ld's only accept -v. +if $LD -v 2>&1 &5; then + lt_cv_prog_gnu_ld=yes +else + lt_cv_prog_gnu_ld=no +fi +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 +test -n "$reload_flag" && reload_flag=" $reload_flag" + +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 + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH /usr/ccs/bin /usr/ucb /bin; do + test -z "$ac_dir" && ac_dir=. + tmp_nm=$ac_dir/${ac_tool_prefix}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 + if ($tmp_nm -B /dev/null 2>&1 | sed '1q'; exit 0) | egrep '(/dev/null|Invalid file or object type)' >/dev/null; then + lt_cv_path_NM="$tmp_nm -B" + break + elif ($tmp_nm -p /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then + lt_cv_path_NM="$tmp_nm -p" + break + else + 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 + fi + fi + done + IFS="$ac_save_ifs" + test -z "$lt_cv_path_NM" && lt_cv_path_NM=nm +fi +fi + +NM="$lt_cv_path_NM" +echo "$as_me:$LINENO: result: $NM" >&5 +echo "${ECHO_T}$NM" >&6 + +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_executable_p="test -f" +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_prog in sed gsed; do + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then + _sed_list="$_sed_list $as_dir/$ac_prog$ac_exec_ext" + fi + done + done +done + + # 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. +: ${TMPDIR=/tmp} +{ + tmp=`(umask 077 && mktemp -d -q "$TMPDIR/sedXXXXXX") 2>/dev/null` && + test -n "$tmp" && test -d "$tmp" +} || +{ + tmp=$TMPDIR/sed$$-$RANDOM + (umask 077 && mkdir $tmp) +} || +{ + echo "$me: cannot create a temporary directory in $TMPDIR" >&2 + { (exit 1); exit 1; } +} + _max=0 + _count=0 + # Add /usr/xpg4/bin/sed as it is typically found on Solaris + # along with /bin/sed that truncates output. + for _sed in $_sed_list /usr/xpg4/bin/sed; do + test ! -f ${_sed} && break + cat /dev/null > "$tmp/sed.in" + _count=0 + echo ${ECHO_N-$ac_n} "0123456789${ECHO_C-$ac_c}" >"$tmp/sed.in" + # Check for GNU sed and select it if it is found. + if "${_sed}" --version 2>&1 < /dev/null | egrep '(GNU)' > /dev/null; then + lt_cv_path_SED=${_sed} + break + fi + while true; do + cat "$tmp/sed.in" "$tmp/sed.in" >"$tmp/sed.tmp" + mv "$tmp/sed.tmp" "$tmp/sed.in" + cp "$tmp/sed.in" "$tmp/sed.nl" + echo >>"$tmp/sed.nl" + ${_sed} -e 's/a$//' < "$tmp/sed.nl" >"$tmp/sed.out" || break + cmp -s "$tmp/sed.out" "$tmp/sed.nl" || break + # 40000 chars as input seems more than enough + test $_count -gt 10 && break + _count=`expr $_count + 1` + if test $_count -gt $_max; then + _max=$_count + lt_cv_path_SED=$_sed + fi + done + done + rm -rf "$tmp" + +fi + +if test "X$SED" != "X"; then + lt_cv_path_SED=$SED +else + SED=$lt_cv_path_SED +fi +echo "$as_me:$LINENO: result: $SED" >&5 +echo "${ECHO_T}$SED" >&6 + +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 egrep 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 + ;; + +bsdi4*) + 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* | mingw* | pw32*) + lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?' + lt_cv_file_magic_cmd='$OBJDUMP -f' + ;; + +darwin* | rhapsody*) + lt_cv_deplibs_check_method='file_magic Mach-O dynamically linked shared library' + lt_cv_file_magic_cmd='/usr/bin/file -L' + case "$host_os" in + rhapsody* | darwin1.[012]) + lt_cv_file_magic_test_file=`echo /System/Library/Frameworks/System.framework/Versions/*/System | head -1` + ;; + *) # Darwin 1.3 on + lt_cv_file_magic_test_file='/usr/lib/libSystem.dylib' + ;; + esac + ;; + +freebsd*) + 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)/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_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9].[0-9]) shared library' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=/usr/lib/libc.sl + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + irix5* | nonstopux*) + # this will be overridden with pass_all, but let us keep it just in case + lt_cv_deplibs_check_method="file_magic ELF 32-bit MSB dynamic lib MIPS - version 1" + ;; + *) + case $LD in + *-32|*"-32 ") libmagic=32-bit;; + *-n32|*"-n32 ") libmagic=N32;; + *-64|*"-64 ") libmagic=64-bit;; + *) libmagic=never-match;; + esac + # this will be overridden with pass_all, but let us keep it just in case + lt_cv_deplibs_check_method="file_magic ELF ${libmagic} MSB mips-[1234] dynamic lib MIPS - version 1" + ;; + esac + lt_cv_file_magic_test_file=`echo /lib${libsuff}/libc.so*` + lt_cv_deplibs_check_method=pass_all + ;; + +# This must be Linux ELF. +linux-gnu*) + case $host_cpu in + alpha* | hppa* | i*86 | mips | mipsel | powerpc* | sparc* | ia64*) + lt_cv_deplibs_check_method=pass_all ;; + *) + # glibc up to 2.1.1 does not perform some relocations on ARM + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' ;; + esac + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + +netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' + else + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so$' + 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 + ;; + +openbsd*) + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB shared object' + else + lt_cv_deplibs_check_method='file_magic OpenBSD.* shared library' + fi + ;; + +osf3* | osf4* | osf5*) + # this will be overridden with pass_all, but let us keep it just in case + lt_cv_deplibs_check_method='file_magic COFF format alpha shared library' + lt_cv_file_magic_test_file=/shlib/libc.so + lt_cv_deplibs_check_method=pass_all + ;; + +sco3.2v5*) + lt_cv_deplibs_check_method=pass_all + ;; + +solaris*) + lt_cv_deplibs_check_method=pass_all + lt_cv_file_magic_test_file=/lib/libc.so + ;; + +sysv5uw[78]* | sysv4*uw2*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + 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 + ;; + esac + ;; +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 + + + + + + + + +# 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" >&5 +echo $ECHO_N "checking command to parse $NM output... $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 the above into a raw symbol and a C symbol. +symxfrm='\1 \2\3 \3' + +# Transform an extracted symbol line into a proper C declaration +lt_cv_global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern char \1;/p'" + +# Transform an extracted symbol line into symbol name and symbol address +lt_cv_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 + lt_cv_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern char \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" + lt_cv_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" + ;; +irix* | nonstopux*) + symcode='[BCDEGRST]' + ;; +osf*) + symcode='[BCDEGQRST]' + ;; +solaris* | sysv5*) + symcode='[BDT]' + ;; +sysv4) + symcode='[DFNSTU]' + ;; +esac + +# Handle CRLF in mingw tool chain +opt_cr= +case $host_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. +if $NM -V 2>&1 | egrep '(GNU|with BFD)' > /dev/null; then + symcode='[ABCDGISTW]' +fi + +# Try without a prefix undercore, then with it. +for ac_symprfx in "" "_"; do + + # 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 <&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 egrep ' nm_test_var$' "$nlist" >/dev/null; then + if egrep ' nm_test_func$' "$nlist" >/dev/null; then + cat < conftest.$ac_ext +#ifdef __cplusplus +extern "C" { +#endif + +EOF + # Now generate the symbol file. + eval "$lt_cv_global_symbol_to_cdecl"' < "$nlist" >> conftest.$ac_ext' + + cat <> conftest.$ac_ext +#if defined (__STDC__) && __STDC__ +# define lt_ptr void * +#else +# define lt_ptr char * +# define const +#endif + +/* The mapping between symbol names and symbols. */ +const struct { + const char *name; + lt_ptr address; +} +lt_preloaded_symbols[] = +{ +EOF + sed "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (lt_ptr) \&\2},/" < "$nlist" >> conftest.$ac_ext + cat <<\EOF >> conftest.$ac_ext + {0, (lt_ptr) 0} +}; + +#ifdef __cplusplus +} +#endif +EOF + # Now try linking the two files. + mv conftest.$ac_objext conftstm.$ac_objext + save_LIBS="$LIBS" + save_CFLAGS="$CFLAGS" + LIBS="conftstm.$ac_objext" + CFLAGS="$CFLAGS$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="$save_LIBS" + CFLAGS="$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 + +global_symbol_pipe="$lt_cv_sys_global_symbol_pipe" +if test -z "$lt_cv_sys_global_symbol_pipe"; then + global_symbol_to_cdecl= + global_symbol_to_c_name_address= +else + global_symbol_to_cdecl="$lt_cv_global_symbol_to_cdecl" + global_symbol_to_c_name_address="$lt_cv_global_symbol_to_c_name_address" +fi +if test -z "$global_symbol_pipe$global_symbol_to_cdec$global_symbol_to_c_name_address"; +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 + +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 to if __STDC__ is defined, since + # 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 +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#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 + 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 +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_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 + 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 to if __STDC__ is defined, since + # 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 +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#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 + 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 +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_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 + 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 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 + + +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 +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +#include +#include + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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); } && + { 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.$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 +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + +_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 +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + +_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 +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#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.* *.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 +#line $LINENO "configure" +/* 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>&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.$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 +#line $LINENO "configure" +/* 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>&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.$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 +#line $LINENO "configure" +/* 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 + 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 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 preprocessor's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + ( + cat <<\_ASBOX +## ------------------------------------ ## +## Report this to bug-autoconf@gnu.org. ## +## ------------------------------------ ## +_ASBOX + ) | + sed "s/^/$as_me: WARNING: /" >&2 + ;; + 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: proceeding with the preprocessor's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + ( + cat <<\_ASBOX +## ------------------------------------ ## +## Report this to bug-autoconf@gnu.org. ## +## ------------------------------------ ## +_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 + + + + + + +# 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_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a dos path. + ;; + *) + ac_save_MAGIC_CMD="$MAGIC_CMD" + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" + ac_dummy="/usr/bin:$PATH" + for ac_dir in $ac_dummy; do + 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 <&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="$ac_save_ifs" + MAGIC_CMD="$ac_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_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a dos path. + ;; + *) + ac_save_MAGIC_CMD="$MAGIC_CMD" + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" + ac_dummy="/usr/bin:$PATH" + for ac_dir in $ac_dummy; do + 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 <&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="$ac_save_ifs" + MAGIC_CMD="$ac_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 + +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 + + +enable_dlopen=no +enable_win32_dll=no + +# 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 +*-*-irix6*) + # Find out which ABI we are using. + echo '#line 4409 "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 + 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 + 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 +#line $LINENO "configure" +/* 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>&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.$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 + ;; + + +esac + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +Xsed='sed -e s/^X//' +sed_quote_subst='s/\([\\"\\`$\\\\]\)/\\\1/g' + +# Same as above, but do not quote variable references. +double_quote_subst='s/\([\\"\\`\\\\]\)/\\\1/g' + +# Sed substitution to delay expansion of an escaped shell variable in a +# double_quote_subst'ed string. +delay_variable_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 M$VC, +# which needs '.lib'). +libext=a +ltmain="$ac_aux_dir/ltmain.sh" +ofile="$default_ofile" +with_gnu_ld="$lt_cv_prog_gnu_ld" +need_locks="$enable_libtool_lock" + +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 "$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 "$OBJDUMP" && OBJDUMP=objdump +test -z "$RANLIB" && RANLIB=: +test -z "$STRIP" && STRIP=: +test -z "$ac_objext" && ac_objext=o + +if test x"$host" != x"$build"; then + ac_tool_prefix=${host_alias}- +else + ac_tool_prefix= +fi + +# Transform linux* to *-*-linux-gnu*, to support old configure scripts. +case $host_os in +linux-gnu*) ;; +linux*) host=`echo $host | sed 's/^\(.*-.*-linux\)\(.*\)$/\1-gnu\2/'` +esac + +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 + +# 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="\$RANLIB -t \$oldlib~$old_postinstall_cmds" + ;; + *) + old_postinstall_cmds="\$RANLIB \$oldlib~$old_postinstall_cmds" + ;; + esac + old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" +fi + +# Allow CC to be a program name with arguments. +set dummy $CC +compiler="$2" + +echo "$as_me:$LINENO: checking for objdir" >&5 +echo $ECHO_N "checking for objdir... $ECHO_C" >&6 +rm -f .libs 2>/dev/null +mkdir .libs 2>/dev/null +if test -d .libs; then + objdir=.libs +else + # MS-DOS does not allow filenames that begin with a dot. + objdir=_libs +fi +rmdir .libs 2>/dev/null +echo "$as_me:$LINENO: result: $objdir" >&5 +echo "${ECHO_T}$objdir" >&6 + + + +# 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 + +# We assume here that the value for lt_cv_prog_cc_pic will not be cached +# in isolation, and that seeing it set (from the cache) indicates that +# the associated values are set (in the cache) correctly too. +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 "${lt_cv_prog_cc_pic+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + lt_cv_prog_cc_pic= + lt_cv_prog_cc_shlib= + lt_cv_prog_cc_wl= + lt_cv_prog_cc_static= + lt_cv_prog_cc_no_builtin= + lt_cv_prog_cc_can_build_shared=$can_build_shared + + if test "$GCC" = yes; then + lt_cv_prog_cc_wl='-Wl,' + lt_cv_prog_cc_static='-static' + + case $host_os in + aix*) + # Below there is a dirty hack to force normal static linking with -ldl + # The problem is because libdl dynamically linked with both libc and + # libC (AIX C++ library), which obviously doesn't included in libraries + # list by gcc. This cause undefined symbols with -static flags. + # This hack allows C programs to be linked with "-static -ldl", but + # not sure about C++ programs. + lt_cv_prog_cc_static="$lt_cv_prog_cc_static ${lt_cv_prog_cc_wl}-lC" + ;; + 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_cv_prog_cc_pic='-m68020 -resident32 -malways-restore-a4' + ;; + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_cv_prog_cc_pic='-fno-common' + ;; + cygwin* | 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_cv_prog_cc_pic='-DDLL_EXPORT' + ;; + sysv4*MP*) + if test -d /usr/nec; then + lt_cv_prog_cc_pic=-Kconform_pic + fi + ;; + *) + lt_cv_prog_cc_pic='-fPIC' + ;; + esac + else + # PORTME Check for PIC flags for the system compiler. + case $host_os in + aix3* | aix4* | aix5*) + lt_cv_prog_cc_wl='-Wl,' + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_cv_prog_cc_static='-Bstatic' + else + lt_cv_prog_cc_static='-bnso -bI:/lib/syscalls.exp' + fi + ;; + + hpux9* | hpux10* | hpux11*) + # Is there a better lt_cv_prog_cc_static that works with the bundled CC? + lt_cv_prog_cc_wl='-Wl,' + lt_cv_prog_cc_static="${lt_cv_prog_cc_wl}-a ${lt_cv_prog_cc_wl}archive" + lt_cv_prog_cc_pic='+Z' + ;; + + irix5* | irix6* | nonstopux*) + lt_cv_prog_cc_wl='-Wl,' + lt_cv_prog_cc_static='-non_shared' + # PIC (with -KPIC) is the default. + ;; + + cygwin* | 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_cv_prog_cc_pic='-DDLL_EXPORT' + ;; + + newsos6) + lt_cv_prog_cc_pic='-KPIC' + lt_cv_prog_cc_static='-Bstatic' + ;; + + osf3* | osf4* | osf5*) + # All OSF/1 code is PIC. + lt_cv_prog_cc_wl='-Wl,' + lt_cv_prog_cc_static='-non_shared' + ;; + + sco3.2v5*) + lt_cv_prog_cc_pic='-Kpic' + lt_cv_prog_cc_static='-dn' + lt_cv_prog_cc_shlib='-belf' + ;; + + solaris*) + lt_cv_prog_cc_pic='-KPIC' + lt_cv_prog_cc_static='-Bstatic' + lt_cv_prog_cc_wl='-Wl,' + ;; + + sunos4*) + lt_cv_prog_cc_pic='-PIC' + lt_cv_prog_cc_static='-Bstatic' + lt_cv_prog_cc_wl='-Qoption ld ' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + lt_cv_prog_cc_pic='-KPIC' + lt_cv_prog_cc_static='-Bstatic' + lt_cv_prog_cc_wl='-Wl,' + ;; + + uts4*) + lt_cv_prog_cc_pic='-pic' + lt_cv_prog_cc_static='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec ;then + lt_cv_prog_cc_pic='-Kconform_pic' + lt_cv_prog_cc_static='-Bstatic' + fi + ;; + + *) + lt_cv_prog_cc_can_build_shared=no + ;; + esac + fi + +fi + +if test -z "$lt_cv_prog_cc_pic"; then + echo "$as_me:$LINENO: result: none" >&5 +echo "${ECHO_T}none" >&6 +else + echo "$as_me:$LINENO: result: $lt_cv_prog_cc_pic" >&5 +echo "${ECHO_T}$lt_cv_prog_cc_pic" >&6 + + # Check to make sure the pic_flag actually works. + echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_cv_prog_cc_pic works" >&5 +echo $ECHO_N "checking if $compiler PIC flag $lt_cv_prog_cc_pic works... $ECHO_C" >&6 + if test "${lt_cv_prog_cc_pic_works+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $lt_cv_prog_cc_pic -DPIC" + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* 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>&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 + case $host_os in + hpux9* | hpux10* | hpux11*) + # On HP-UX, both CC and GCC only warn that PIC is supported... then + # they create non-PIC objects. So, if there were any warnings, we + # assume that PIC is not supported. + if test -s conftest.err; then + lt_cv_prog_cc_pic_works=no + else + lt_cv_prog_cc_pic_works=yes + fi + ;; + *) + lt_cv_prog_cc_pic_works=yes + ;; + esac + +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + lt_cv_prog_cc_pic_works=no + +fi +rm -f conftest.$ac_objext conftest.$ac_ext + CFLAGS="$save_CFLAGS" + +fi + + + if test "X$lt_cv_prog_cc_pic_works" = Xno; then + lt_cv_prog_cc_pic= + lt_cv_prog_cc_can_build_shared=no + else + lt_cv_prog_cc_pic=" $lt_cv_prog_cc_pic" + fi + + echo "$as_me:$LINENO: result: $lt_cv_prog_cc_pic_works" >&5 +echo "${ECHO_T}$lt_cv_prog_cc_pic_works" >&6 +fi + +# Check for any special shared library compilation flags. +if test -n "$lt_cv_prog_cc_shlib"; then + { echo "$as_me:$LINENO: WARNING: \`$CC' requires \`$lt_cv_prog_cc_shlib' to build shared libraries" >&5 +echo "$as_me: WARNING: \`$CC' requires \`$lt_cv_prog_cc_shlib' to build shared libraries" >&2;} + if echo "$old_CC $old_CFLAGS " | egrep -e "[ ]$lt_cv_prog_cc_shlib[ ]" >/dev/null; then : + else + { echo "$as_me:$LINENO: WARNING: add \`$lt_cv_prog_cc_shlib' to the CC or CFLAGS env variable and reconfigure" >&5 +echo "$as_me: WARNING: add \`$lt_cv_prog_cc_shlib' to the CC or CFLAGS env variable and reconfigure" >&2;} + lt_cv_prog_cc_can_build_shared=no + fi +fi + +echo "$as_me:$LINENO: checking if $compiler static flag $lt_cv_prog_cc_static works" >&5 +echo $ECHO_N "checking if $compiler static flag $lt_cv_prog_cc_static works... $ECHO_C" >&6 +if test "${lt_cv_prog_cc_static_works+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + lt_cv_prog_cc_static_works=no + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS $lt_cv_prog_cc_static" + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* 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>&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_prog_cc_static_works=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext + LDFLAGS="$save_LDFLAGS" + +fi + + +# Belt *and* braces to stop my trousers falling down: +test "X$lt_cv_prog_cc_static_works" = Xno && lt_cv_prog_cc_static= +echo "$as_me:$LINENO: result: $lt_cv_prog_cc_static_works" >&5 +echo "${ECHO_T}$lt_cv_prog_cc_static_works" >&6 + +pic_flag="$lt_cv_prog_cc_pic" +special_shlib_compile_flags="$lt_cv_prog_cc_shlib" +wl="$lt_cv_prog_cc_wl" +link_static_flag="$lt_cv_prog_cc_static" +no_builtin_flag="$lt_cv_prog_cc_no_builtin" +can_build_shared="$lt_cv_prog_cc_can_build_shared" + + +# Check to see if options -o and -c are simultaneously supported by compiler +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_compiler_c_o+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +$rm -r conftest 2>/dev/null +mkdir conftest +cd conftest +echo "int some_variable = 0;" > conftest.$ac_ext +mkdir out +# According to Tom Tromey, Ian Lance Taylor reported there are C compilers +# that will create temporary files in the current directory regardless of +# the output directory. Thus, making CWD read-only will cause this test +# to fail, enabling locking or at least warning the user not to do parallel +# builds. +chmod -w . +save_CFLAGS="$CFLAGS" +CFLAGS="$CFLAGS -o out/conftest2.$ac_objext" +compiler_c_o=no +if { (eval echo configure:4938: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>out/conftest.err; } && 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 + if test -s out/conftest.err; then + lt_cv_compiler_c_o=no + else + lt_cv_compiler_c_o=yes + fi +else + # Append any errors to the config.log. + cat out/conftest.err 1>&5 + lt_cv_compiler_c_o=no +fi +CFLAGS="$save_CFLAGS" +chmod u+w . +$rm conftest* out/* +rmdir out +cd .. +rmdir conftest +$rm -r conftest 2>/dev/null + +fi + +compiler_c_o=$lt_cv_compiler_c_o +echo "$as_me:$LINENO: result: $compiler_c_o" >&5 +echo "${ECHO_T}$compiler_c_o" >&6 + +if test x"$compiler_c_o" = x"yes"; then + # Check to see if we can write to a .lo + echo "$as_me:$LINENO: checking if $compiler supports -c -o file.lo" >&5 +echo $ECHO_N "checking if $compiler supports -c -o file.lo... $ECHO_C" >&6 + if test "${lt_cv_compiler_o_lo+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + lt_cv_compiler_o_lo=no + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -c -o conftest.lo" + save_objext="$ac_objext" + ac_objext=lo + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ +int some_variable = 0; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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); } && + { 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 + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + lt_cv_compiler_o_lo=no + else + lt_cv_compiler_o_lo=yes + fi + +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.$ac_objext conftest.$ac_ext + ac_objext="$save_objext" + CFLAGS="$save_CFLAGS" + +fi + + compiler_o_lo=$lt_cv_compiler_o_lo + echo "$as_me:$LINENO: result: $compiler_o_lo" >&5 +echo "${ECHO_T}$compiler_o_lo" >&6 +else + compiler_o_lo=no +fi + +# Check to see if we can do hard links to lock some files if needed +hard_links="nottested" +if test "$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 + +if test "$GCC" = yes; then + # Check to see if options -fno-rtti -fno-exceptions are supported by compiler + 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 + echo "int some_variable = 0;" > conftest.$ac_ext + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -fno-rtti -fno-exceptions -c conftest.$ac_ext" + compiler_rtti_exceptions=no + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ +int some_variable = 0; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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); } && + { 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 + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + compiler_rtti_exceptions=no + else + compiler_rtti_exceptions=yes + fi + +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.$ac_objext conftest.$ac_ext + CFLAGS="$save_CFLAGS" + echo "$as_me:$LINENO: result: $compiler_rtti_exceptions" >&5 +echo "${ECHO_T}$compiler_rtti_exceptions" >&6 + + if test "$compiler_rtti_exceptions" = "yes"; then + no_builtin_flag=' -fno-builtin -fno-rtti -fno-exceptions' + else + no_builtin_flag=' -fno-builtin' + fi +fi + +# See if the linker supports building shared libraries. +echo "$as_me:$LINENO: checking whether the linker ($LD) supports shared libraries" >&5 +echo $ECHO_N "checking whether the linker ($LD) supports shared libraries... $ECHO_C" >&6 + +allow_undefined_flag= +no_undefined_flag= +need_lib_prefix=unknown +need_version=unknown +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +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_into_libs=no +hardcode_libdir_flag_spec= +hardcode_libdir_separator= +hardcode_direct=no +hardcode_minus_L=no +hardcode_shlibpath_var=unsupported +runpath_var= +link_all_deplibs=unknown +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 egrep regular expression 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= + +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 + ;; +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}' + + # See if GNU ld supports shared libraries. + case $host_os in + aix3* | aix4* | aix5*) + # On AIX, the GNU linker is very broken + # Note:Check GNU linker on AIX 5-IA64 when/if it becomes available. + ld_shlibs=no + cat <&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 + ;; + + 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 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 use + # them. + ld_shlibs=no + ;; + + beos*) + if $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then + allow_undefined_flag=unsupported + # Joseph Beckenbach 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*) + # 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=yes + + extract_expsyms_cmds='test -f $output_objdir/impgen.c || \ + sed -e "/^# \/\* impgen\.c starts here \*\//,/^# \/\* impgen.c ends here \*\// { s/^# //;s/^# *$//; p; }" -e d < $''0 > $output_objdir/impgen.c~ + test -f $output_objdir/impgen.exe || (cd $output_objdir && \ + if test "x$HOST_CC" != "x" ; then $HOST_CC -o impgen impgen.c ; \ + else $CC -o impgen impgen.c ; fi)~ + $output_objdir/impgen $dir/$soroot > $output_objdir/$soname-def' + + old_archive_from_expsyms_cmds='$DLLTOOL --as=$AS --dllname $soname --def $output_objdir/$soname-def --output-lib $output_objdir/$newlib' + + # cygwin and mingw dlls have different entry points and sets of symbols + # to exclude. + # FIXME: what about values for MSVC? + dll_entry=__cygwin_dll_entry@12 + dll_exclude_symbols=DllMain@12,_cygwin_dll_entry@12,_cygwin_noncygwin_dll_entry@12~ + case $host_os in + mingw*) + # mingw values + dll_entry=_DllMainCRTStartup@12 + dll_exclude_symbols=DllMain@12,DllMainCRTStartup@12,DllEntryPoint@12~ + ;; + esac + + # mingw and cygwin differ, and it's simplest to just exclude the union + # of the two symbol sets. + dll_exclude_symbols=DllMain@12,_cygwin_dll_entry@12,_cygwin_noncygwin_dll_entry@12,DllMainCRTStartup@12,DllEntryPoint@12 + + # recent cygwin and mingw systems supply a stub DllMain which the user + # can override, but on older systems we have to supply one (in ltdll.c) + if test "x$lt_cv_need_dllmain" = "xyes"; then + ltdll_obj='$output_objdir/$soname-ltdll.'"$ac_objext " + ltdll_cmds='test -f $output_objdir/$soname-ltdll.c || sed -e "/^# \/\* ltdll\.c starts here \*\//,/^# \/\* ltdll.c ends here \*\// { s/^# //; p; }" -e d < $''0 > $output_objdir/$soname-ltdll.c~ + test -f $output_objdir/$soname-ltdll.$ac_objext || (cd $output_objdir && $CC -c $soname-ltdll.c)~' + else + ltdll_obj= + ltdll_cmds= + fi + + # Extract the symbol export list from an `--export-all' def file, + # then regenerate the def file from the symbol export list, so that + # the compiled dll only exports the symbol export list. + # Be careful not to strip the DATA tag left be newer dlltools. + export_symbols_cmds="$ltdll_cmds"' + $DLLTOOL --export-all --exclude-symbols '$dll_exclude_symbols' --output-def $output_objdir/$soname-def '$ltdll_obj'$libobjs $convenience~ + sed -e "1,/EXPORTS/d" -e "s/ @ [0-9]*//" -e "s/ *;.*$//" < $output_objdir/$soname-def > $export_symbols' + + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is. + # If DATA tags from a recent dlltool are present, honour them! + 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; + _lt_hint=1; + cat $export_symbols | while read symbol; do + set dummy \$symbol; + case \$# in + 2) echo " \$2 @ \$_lt_hint ; " >> $output_objdir/$soname-def;; + 4) echo " \$2 \$3 \$4 ; " >> $output_objdir/$soname-def; _lt_hint=`expr \$_lt_hint - 1`;; + *) echo " \$2 @ \$_lt_hint \$3 ; " >> $output_objdir/$soname-def;; + esac; + _lt_hint=`expr 1 + \$_lt_hint`; + done; + fi~ + '"$ltdll_cmds"' + $CC -Wl,--base-file,$output_objdir/$soname-base '$lt_cv_cc_dll_switch' -Wl,-e,'$dll_entry' -o $output_objdir/$soname '$ltdll_obj'$libobjs $deplibs $compiler_flags~ + $DLLTOOL --as=$AS --dllname $soname --exclude-symbols '$dll_exclude_symbols' --def $output_objdir/$soname-def --base-file $output_objdir/$soname-base --output-exp $output_objdir/$soname-exp~ + $CC -Wl,--base-file,$output_objdir/$soname-base $output_objdir/$soname-exp '$lt_cv_cc_dll_switch' -Wl,-e,'$dll_entry' -o $output_objdir/$soname '$ltdll_obj'$libobjs $deplibs $compiler_flags~ + $DLLTOOL --as=$AS --dllname $soname --exclude-symbols '$dll_exclude_symbols' --def $output_objdir/$soname-def --base-file $output_objdir/$soname-base --output-exp $output_objdir/$soname-exp --output-lib $output_objdir/$libname.dll.a~ + $CC $output_objdir/$soname-exp '$lt_cv_cc_dll_switch' -Wl,-e,'$dll_entry' -o $output_objdir/$soname '$ltdll_obj'$libobjs $deplibs $compiler_flags' + ;; + + 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 -nodefaultlibs $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared -nodefaultlibs $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris* | sysv5*) + if $LD -v 2>&1 | egrep 'BFD 2\.8' > /dev/null; then + ld_shlibs=no + cat <&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 | egrep ': 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 + ;; + + 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 | egrep ': 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" = yes; then + runpath_var=LD_RUN_PATH + hardcode_libdir_flag_spec='${wl}--rpath ${wl}$libdir' + export_dynamic_flag_spec='${wl}--export-dynamic' + case $host_os in + cygwin* | mingw* | pw32*) + # dlltool doesn't understand --whole-archive et. al. + whole_archive_flag_spec= + ;; + *) + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | egrep 'no-whole-archive' > /dev/null; then + whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + whole_archive_flag_spec= + fi + ;; + esac + 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 "$link_static_flag"; 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 + 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. + + hardcode_direct=yes + archive_cmds='' + hardcode_libdir_separator=':' + if test "$GCC" = yes; then + case $host_os in aix4.[012]|aix4.[012].*) + 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' + else + # not using gcc + if test "$host_cpu" = ia64; then + shared_flag='${wl}-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 can do strange things, 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' + hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:/usr/lib:/lib' + archive_expsym_cmds="\$CC"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$no_entry_flag \${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 ${wl}-h$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols" + else + hardcode_libdir_flag_spec='${wl}-bnolibpath ${wl}-blibpath:$libdir:/usr/lib:/lib' + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + allow_undefined_flag='${wl}-berok' + # This is a bit strange, but is similar to how AIX traditionally builds + # it's shared libraries. + archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols"' ~$AR -crlo $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 + ;; + + 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 + # 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"`' + ;; + + darwin* | rhapsody*) + case "$host_os" in + rhapsody* | darwin1.[012]) + allow_undefined_flag='-undefined suppress' + ;; + *) # Darwin 1.3 on + allow_undefined_flag='-flat_namespace -undefined suppress' + ;; + esac + # FIXME: Relying on posixy $() will cause problems for + # cross-compilation, but unfortunately the echo tests do not + # yet detect zsh echo's removal of \ escapes. Also zsh mangles + # `"' quotes if we put them in here... so don't! + archive_cmds='$CC -r -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs && $CC $(test .$module = .yes && echo -bundle || echo -dynamiclib) $allow_undefined_flag -o $lib ${lib}-master.o $deplibs$linker_flags $(test .$module != .yes && echo -install_name $rpath/$soname $verstring)' + # We need to add '_' to the symbols in $export_symbols first + #archive_expsym_cmds="$archive_cmds"' && strip -s $export_symbols' + hardcode_direct=yes + hardcode_shlibpath_var=no + whole_archive_flag_spec='-all_load $convenience' + ;; + + 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*) + archive_cmds='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + hpux9* | hpux10* | hpux11*) + case $host_os in + hpux9*) 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' ;; + *) archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' ;; + esac + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + hardcode_minus_L=yes # Not in the search PATH, but as the default + # location of the library. + export_dynamic_flag_spec='${wl}-E' + ;; + + 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' + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + 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='-rpath $libdir' + fi + 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' + 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 "-exported_symbol " >> $lib.exp; echo "\$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 ${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=: + ;; + + sco3.2v5*) + 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 + export_dynamic_flag_spec='${wl}-Bexport' + ;; + + solaris*) + # gcc --version < 3.0 without binutils cannot create self contained + # shared libraries reliably, requiring libgcc.a to resolve some of + # the object symbols generated in some cases. Libraries that use + # assert need libgcc.a to resolve __eprintf, for example. Linking + # a copy of libgcc.a into every shared library to guarantee resolving + # such symbols causes other problems: According to Tim Van Holder + # , C++ libraries end up with a separate + # (to the application) exception stack for one thing. + no_undefined_flag=' -z defs' + if test "$GCC" = yes; then + case `$CC --version 2>/dev/null` in + [12].*) + cat <&2 + +*** Warning: Releases of GCC earlier than version 3.0 cannot reliably +*** create self contained shared libraries on Solaris systems, without +*** introducing a dependency on libgcc.a. Therefore, libtool is disabling +*** -no-undefined support, which will at least allow you to build shared +*** libraries. However, you may find that when you link such libraries +*** into an application without using GCC, you have to manually add +*** \`gcc --print-libgcc-file-name\` to the link command. We urge you to +*** upgrade to a newer version of GCC. Another option is to rebuild your +*** current GCC to use the GNU linker from GNU binutils 2.9.1 or newer. + +EOF + no_undefined_flag= + ;; + esac + fi + # $CC -shared without GNU ld will not create a library from C++ + # object files and a static libstdc++, better avoid it by now + 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' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_shlibpath_var=no + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) # Supported since Solaris 2.6 (maybe 2.5.1?) + whole_archive_flag_spec='-z allextract$convenience -z defaultextract' ;; + 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' + ;; + + sysv5*) + no_undefined_flag=' -z text' + # $CC -shared without GNU ld will not create a library from C++ + # object files and a static libstdc++, better avoid it by now + 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' + hardcode_libdir_flag_spec= + hardcode_shlibpath_var=no + runpath_var='LD_RUN_PATH' + ;; + + uts4*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_shlibpath_var=no + ;; + + dgux*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_shlibpath_var=no + ;; + + 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.2uw2*) + archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes + hardcode_minus_L=no + hardcode_shlibpath_var=no + hardcode_runpath_var=yes + runpath_var=LD_RUN_PATH + ;; + + sysv5uw7* | unixware7*) + no_undefined_flag='${wl}-z ${wl}text' + if test "$GCC" = yes; then + archive_cmds='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$CC -G ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + runpath_var='LD_RUN_PATH' + 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 + +# Check hardcoding attributes. +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"; 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 "$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 + +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 + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +reload_cmds='$LD$reload_flag -o $output$reload_objs' +test -z "$deplibs_check_method" && deplibs_check_method=unknown + +# PORTME Fill in your ld.so characteristics +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= +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" +sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" + +case $host_os in +aix3*) + version_type=linux + library_names_spec='${libname}${release}.so$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX has no versioning support, so we append a major version to the name. + soname_spec='${libname}${release}.so$major' + ;; + +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}.so$major ${libname}${release}.so$versuffix $libname.so' + 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.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + 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}.so$major' + fi + shlibpath_var=LIBPATH + fi + hardcode_into_libs=yes + ;; + +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}.so' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi4*) + version_type=linux + need_version=no + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + soname_spec='${libname}${release}.so$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $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" + export_dynamic_flag_spec=-rdynamic + # 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 + need_version=no + need_lib_prefix=no + case $GCC,$host_os in + yes,cygwin*) + library_names_spec='$libname.dll.a' + soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | sed -e 's/[.]/-/g'`${versuffix}.dll' + postinstall_cmds='dlpath=`bash 2>&1 -c '\''. $dir/${file}i;echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog .libs/$dlname \$dldir/$dlname' + postuninstall_cmds='dldll=`bash 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $rm \$dlpath' + ;; + yes,mingw*) + library_names_spec='${libname}`echo ${release} | sed -e 's/[.]/-/g'`${versuffix}.dll' + sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | sed -e "s/^libraries://" -e "s/;/ /g" -e "s,=/,/,g"` + ;; + yes,pw32*) + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | sed -e 's/./-/g'`${versuffix}.dll' + ;; + *) + library_names_spec='${libname}`echo ${release} | sed -e 's/[.]/-/g'`${versuffix}.dll $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 + # FIXME: Relying on posixy $() will cause problems for + # cross-compilation, but unfortunately the echo tests do not + # yet detect zsh echo's removal of \ escapes. + library_names_spec='${libname}${release}${versuffix}.$(test .$module = .yes && echo so || echo dylib) ${libname}${release}${major}.$(test .$module = .yes && echo so || echo dylib) ${libname}.$(test .$module = .yes && echo so || echo dylib)' + soname_spec='${libname}${release}${major}.$(test .$module = .yes && echo so || echo dylib)' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + ;; + +freebsd1*) + dynamic_linker=no + ;; + +freebsd*-gnu*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + soname_spec='${libname}${release}.so$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='GNU/FreeBSD ld.so' + ;; + +freebsd*) + objformat=`test -x /usr/bin/objformat && /usr/bin/objformat || echo aout` + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so $libname.so' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='${libname}${release}.so$versuffix $libname.so$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2*) + shlibpath_overrides_runpath=yes + ;; + *) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + esac + ;; + +gnu*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so${major} ${libname}.so' + soname_spec='${libname}${release}.so$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. + dynamic_linker="$host_os dld.sl" + version_type=sunos + need_lib_prefix=no + need_version=no + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}.sl$versuffix ${libname}${release}.sl$major $libname.sl' + soname_spec='${libname}${release}.sl$major' + # HP-UX runs *really* slowly unless shared libraries are mode 555. + postinstall_cmds='chmod 555 $lib' + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) version_type=irix ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}.so$major' + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major ${libname}${release}.so $libname.so' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 ") libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 ") 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}" + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux-gnuoldld* | linux-gnuaout* | linux-gnucoff*) + dynamic_linker=no + ;; + +# This must be Linux ELF. +linux-gnu*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + soname_spec='${libname}${release}.so$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + 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 + + # 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' + ;; + +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}.so$versuffix ${libname}.so$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major ${libname}${release}.so ${libname}.so' + soname_spec='${libname}${release}.so$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}.so$versuffix ${libname}${release}.so$major $libname.so' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +openbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + 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 + library_names_spec='${libname}${release}.so$versuffix ${libname}.so$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + ;; + +os2*) + libname_spec='$name' + need_lib_prefix=no + library_names_spec='$libname.dll $libname.a' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=LIBPATH + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_version=no + need_lib_prefix=no + soname_spec='${libname}${release}.so$major' + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + 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" + hardcode_into_libs=yes + ;; + +sco3.2v5*) + version_type=osf + soname_spec='${libname}${release}.so$major' + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + shlibpath_var=LD_LIBRARY_PATH + ;; + +solaris*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + soname_spec='${libname}${release}.so$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}.so$versuffix ${libname}.so$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.2uw2* | sysv4.3* | sysv5*) + version_type=linux + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + soname_spec='${libname}${release}.so$major' + shlibpath_var=LD_LIBRARY_PATH + 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 + ;; + +uts4*) + version_type=linux + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + soname_spec='${libname}${release}.so$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +dgux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + soname_spec='${libname}${release}.so$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +sysv4*MP*) + if test -d /usr/nec ;then + version_type=linux + library_names_spec='$libname.so.$versuffix $libname.so.$major $libname.so' + soname_spec='$libname.so.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +*) + 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 + +# Report the final consequences. +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*) + 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 + +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 + +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 + +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 + ;; + + cygwin* | mingw* | pw32*) + lt_cv_dlopen="LoadLibrary" + lt_cv_dlopen_libs= + ;; + + *) + 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 +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char shl_load (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ +#ifdef __STDC__ +# include +#else +# include +#endif +/* 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>&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.$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 +#line $LINENO "configure" +/* 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>&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.$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 +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char dlopen (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ +#ifdef __STDC__ +# include +#else +# include +#endif +/* 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>&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.$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 +#line $LINENO "configure" +/* 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>&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.$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 +#line $LINENO "configure" +/* 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>&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.$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 +#line $LINENO "configure" +/* 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>&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.$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" + 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 < +#endif + +#include + +#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); */ + } + + 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; ) 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_unknown|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 + LDFLAGS="$LDFLAGS $link_static_flag" + 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 < +#endif + +#include + +#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); */ + } + + 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; ) 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_unknown|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 + + +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 + if test "${lt_cv_archive_cmds_need_lc+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + $rm conftest* + echo 'static int dummy;' > 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 + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$lt_cv_prog_cc_wl + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + 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 + lt_cv_archive_cmds_need_lc=no + else + lt_cv_archive_cmds_need_lc=yes + fi + allow_undefined_flag=$save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi +fi + + echo "$as_me:$LINENO: result: $lt_cv_archive_cmds_need_lc" >&5 +echo "${ECHO_T}$lt_cv_archive_cmds_need_lc" >&6 + ;; + esac +fi +need_lc=${lt_cv_archive_cmds_need_lc-yes} + +# The second 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 + : +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. + test -f Makefile && make "$ltmain" +fi + +if test -f "$ltmain"; then + trap "$rm \"${ofile}T\"; exit 1" 1 2 15 + $rm -f "${ofile}T" + + echo creating $ofile + + # 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 SED \ + AR AR_FLAGS CC LD LN_S NM SHELL \ + reload_flag reload_cmds wl \ + pic_flag link_static_flag no_builtin_flag export_dynamic_flag_spec \ + thread_safe_flag_spec whole_archive_flag_spec libname_spec \ + library_names_spec soname_spec \ + RANLIB old_archive_cmds old_archive_from_new_cmds old_postinstall_cmds \ + old_postuninstall_cmds archive_cmds archive_expsym_cmds postinstall_cmds \ + postuninstall_cmds extract_expsyms_cmds old_archive_from_expsyms_cmds \ + old_striplib striplib file_magic_cmd export_symbols_cmds \ + deplibs_check_method allow_undefined_flag no_undefined_flag \ + finish_cmds finish_eval global_symbol_pipe global_symbol_to_cdecl \ + global_symbol_to_c_name_address \ + hardcode_libdir_flag_spec hardcode_libdir_separator \ + sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ + compiler_c_o compiler_o_lo need_locks exclude_expsyms include_expsyms; do + + case $var in + reload_cmds | old_archive_cmds | old_archive_from_new_cmds | \ + old_postinstall_cmds | old_postuninstall_cmds | \ + export_symbols_cmds | archive_cmds | archive_expsym_cmds | \ + extract_expsyms_cmds | old_archive_from_expsyms_cmds | \ + postinstall_cmds | postuninstall_cmds | \ + finish_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 + + cat <<__EOF__ > "${ofile}T" +#! $SHELL + +# `$echo "$ofile" | 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-2000 Free Software Foundation, Inc. +# Originally by Gordon Matzigkeit , 1996 +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# A sed that does not truncate output. +SED=$lt_SED + +# Sed that helps us avoid accidentally triggering echo(1) options like -n. +Xsed="${SED} -e s/^X//" + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +if test "X\${CDPATH+set}" = Xset; then CDPATH=:; export CDPATH; fi + +# ### 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=$need_lc + +# Whether or not to optimize for fast installation. +fast_install=$enable_fast_install + +# The host system. +host_alias=$host_alias +host=$host + +# An echo program that does not interpret backslashes. +echo=$lt_echo + +# The archiver. +AR=$lt_AR +AR_FLAGS=$lt_AR_FLAGS + +# The default C compiler. +CC=$lt_CC + +# Is the compiler the GNU C compiler? +with_gcc=$GCC + +# 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=$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_wl + +# Object file suffix (normally "o"). +objext="$ac_objext" + +# Old archive suffix (normally "a"). +libext="$libext" + +# Executable file suffix (normally ""). +exeext="$exeext" + +# Additional compiler flags for building library objects. +pic_flag=$lt_pic_flag +pic_mode=$pic_mode + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_compiler_c_o + +# Can we write directly to a .lo ? +compiler_o_lo=$lt_compiler_o_lo + +# 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_link_static_flag + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_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 to strip libraries. +old_striplib=$lt_old_striplib +striplib=$lt_striplib + +# 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_global_symbol_pipe + +# Transform the output of nm in a proper C declaration +global_symbol_to_cdecl=$lt_global_symbol_to_cdecl + +# Transform the output of nm in a C name address pair +global_symbol_to_c_name_address=$lt_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 + +# 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.so during linking hardcodes DIR into the +# resulting binary. +hardcode_direct=$hardcode_direct + +# Set to yes if using the -LDIR flag during linking hardcodes DIR into the +# resulting binary. +hardcode_minus_L=$hardcode_minus_L + +# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into +# the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var + +# 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 >> "${ofile}T" + +# 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 + + case $host_os in + cygwin* | mingw* | pw32* | os2*) + cat <<'EOF' >> "${ofile}T" + # This is a source program that is used to create dlls on Windows + # Don't remove nor modify the starting and closing comments +# /* ltdll.c starts here */ +# #define WIN32_LEAN_AND_MEAN +# #include +# #undef WIN32_LEAN_AND_MEAN +# #include +# +# #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 +# 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 */ + # This is a source program that is used to create import libraries + # on Windows for dlls which lack them. Don't remove nor modify the + # starting and closing comments +# /* impgen.c starts here */ +# /* Copyright (C) 1999-2000 Free Software Foundation, Inc. +# +# This file is part of GNU libtool. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# */ +# +# #include /* for printf() */ +# #include /* for open(), lseek(), read() */ +# #include /* for O_RDONLY, O_BINARY */ +# #include /* for strdup() */ +# +# /* O_BINARY isn't required (or even defined sometimes) under Unix */ +# #ifndef O_BINARY +# #define O_BINARY 0 +# #endif +# +# static unsigned int +# pe_get16 (fd, offset) +# int fd; +# int offset; +# { +# unsigned char b[2]; +# lseek (fd, offset, SEEK_SET); +# read (fd, b, 2); +# return b[0] + (b[1]<<8); +# } +# +# static unsigned int +# pe_get32 (fd, offset) +# int fd; +# int offset; +# { +# unsigned char b[4]; +# lseek (fd, offset, SEEK_SET); +# read (fd, b, 4); +# return b[0] + (b[1]<<8) + (b[2]<<16) + (b[3]<<24); +# } +# +# static unsigned int +# pe_as32 (ptr) +# void *ptr; +# { +# unsigned char *b = ptr; +# return b[0] + (b[1]<<8) + (b[2]<<16) + (b[3]<<24); +# } +# +# int +# main (argc, argv) +# int argc; +# char *argv[]; +# { +# int dll; +# unsigned long pe_header_offset, opthdr_ofs, num_entries, i; +# unsigned long export_rva, export_size, nsections, secptr, expptr; +# unsigned long name_rvas, nexp; +# unsigned char *expdata, *erva; +# char *filename, *dll_name; +# +# filename = argv[1]; +# +# dll = open(filename, O_RDONLY|O_BINARY); +# if (dll < 1) +# return 1; +# +# dll_name = filename; +# +# for (i=0; filename[i]; i++) +# if (filename[i] == '/' || filename[i] == '\\' || filename[i] == ':') +# dll_name = filename + i +1; +# +# pe_header_offset = pe_get32 (dll, 0x3c); +# opthdr_ofs = pe_header_offset + 4 + 20; +# num_entries = pe_get32 (dll, opthdr_ofs + 92); +# +# if (num_entries < 1) /* no exports */ +# return 1; +# +# export_rva = pe_get32 (dll, opthdr_ofs + 96); +# export_size = pe_get32 (dll, opthdr_ofs + 100); +# nsections = pe_get16 (dll, pe_header_offset + 4 +2); +# secptr = (pe_header_offset + 4 + 20 + +# pe_get16 (dll, pe_header_offset + 4 + 16)); +# +# expptr = 0; +# for (i = 0; i < nsections; i++) +# { +# char sname[8]; +# unsigned long secptr1 = secptr + 40 * i; +# unsigned long vaddr = pe_get32 (dll, secptr1 + 12); +# unsigned long vsize = pe_get32 (dll, secptr1 + 16); +# unsigned long fptr = pe_get32 (dll, secptr1 + 20); +# lseek(dll, secptr1, SEEK_SET); +# read(dll, sname, 8); +# if (vaddr <= export_rva && vaddr+vsize > export_rva) +# { +# expptr = fptr + (export_rva - vaddr); +# if (export_rva + export_size > vaddr + vsize) +# export_size = vsize - (export_rva - vaddr); +# break; +# } +# } +# +# expdata = (unsigned char*)malloc(export_size); +# lseek (dll, expptr, SEEK_SET); +# read (dll, expdata, export_size); +# erva = expdata - export_rva; +# +# nexp = pe_as32 (expdata+24); +# name_rvas = pe_as32 (expdata+32); +# +# printf ("EXPORTS\n"); +# for (i = 0; i> "${ofile}T" || (rm -f "${ofile}T"; exit 1) + + mv -f "${ofile}T" "$ofile" || \ + (rm -f "$ofile" && cp "${ofile}T" "$ofile" && rm -f "${ofile}T") + chmod +x "$ofile" +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 + + + +# Checks for typedefs, structures, and compiler characteristics. + + +# Checks for header files. +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 +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +#include +#include + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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); } && + { 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.$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 +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + +_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 +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + +_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 +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#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.* *.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 + +if test "${ac_cv_header_stdlib_h+set}" = set; then + echo "$as_me:$LINENO: checking for stdlib.h" >&5 +echo $ECHO_N "checking for stdlib.h... $ECHO_C" >&6 +if test "${ac_cv_header_stdlib_h+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +fi +echo "$as_me:$LINENO: result: $ac_cv_header_stdlib_h" >&5 +echo "${ECHO_T}$ac_cv_header_stdlib_h" >&6 +else + # Is the header compilable? +echo "$as_me:$LINENO: checking stdlib.h usability" >&5 +echo $ECHO_N "checking stdlib.h usability... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include +_ACEOF +rm -f conftest.$ac_objext +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); } && + { 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.$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 stdlib.h presence" >&5 +echo $ECHO_N "checking stdlib.h presence... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_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 + 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 in + yes:no ) + { echo "$as_me:$LINENO: WARNING: stdlib.h: accepted by the compiler, rejected by the preprocessor!" >&5 +echo "$as_me: WARNING: stdlib.h: accepted by the compiler, rejected by the preprocessor!" >&2;} + { echo "$as_me:$LINENO: WARNING: stdlib.h: proceeding with the preprocessor's result" >&5 +echo "$as_me: WARNING: stdlib.h: proceeding with the preprocessor's result" >&2;} + ( + cat <<\_ASBOX +## ------------------------------------ ## +## Report this to bug-autoconf@gnu.org. ## +## ------------------------------------ ## +_ASBOX + ) | + sed "s/^/$as_me: WARNING: /" >&2 + ;; + no:yes ) + { echo "$as_me:$LINENO: WARNING: stdlib.h: present but cannot be compiled" >&5 +echo "$as_me: WARNING: stdlib.h: present but cannot be compiled" >&2;} + { echo "$as_me:$LINENO: WARNING: stdlib.h: check for missing prerequisite headers?" >&5 +echo "$as_me: WARNING: stdlib.h: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: stdlib.h: proceeding with the preprocessor's result" >&5 +echo "$as_me: WARNING: stdlib.h: proceeding with the preprocessor's result" >&2;} + ( + cat <<\_ASBOX +## ------------------------------------ ## +## Report this to bug-autoconf@gnu.org. ## +## ------------------------------------ ## +_ASBOX + ) | + sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac +echo "$as_me:$LINENO: checking for stdlib.h" >&5 +echo $ECHO_N "checking for stdlib.h... $ECHO_C" >&6 +if test "${ac_cv_header_stdlib_h+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_cv_header_stdlib_h=$ac_header_preproc +fi +echo "$as_me:$LINENO: result: $ac_cv_header_stdlib_h" >&5 +echo "${ECHO_T}$ac_cv_header_stdlib_h" >&6 + +fi + + + +# Checks for libraries. + +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 +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_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 + 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 +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +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>&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.$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 + + + +# Check whether --with-freetype-prefix or --without-freetype-prefix was given. +if test "${with_freetype_prefix+set}" = set; then + withval="$with_freetype_prefix" + ft_config_prefix="$withval" +else + ft_config_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" + ft_config_exec_prefix="$withval" +else + ft_config_exec_prefix="" +fi; +# Check whether --enable-freetypetest or --disable-freetypetest was given. +if test "${enable_freetypetest+set}" = set; then + enableval="$enable_freetypetest" + +else + enable_fttest=yes +fi; + +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 +# 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_FT2_CONFIG+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + case $FT2_CONFIG in + [\\/]* | ?:[\\/]*) + ac_cv_path_FT2_CONFIG="$FT2_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_FT2_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_FT2_CONFIG" && ac_cv_path_FT2_CONFIG="no" + ;; +esac +fi +FT2_CONFIG=$ac_cv_path_FT2_CONFIG + +if test -n "$FT2_CONFIG"; then + echo "$as_me:$LINENO: result: $FT2_CONFIG" >&5 +echo "${ECHO_T}$FT2_CONFIG" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + +min_ft_version=9.0.3 +echo "$as_me:$LINENO: checking for FreeType - version >= $min_ft_version" >&5 +echo $ECHO_N "checking for FreeType - version >= $min_ft_version... $ECHO_C" >&6 +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_version=`$FT2_CONFIG $ft_config_args --version` + ft_config_major_version=`echo $ft_config_version | cut -d . -f 1` + ft_config_minor_version=`echo $ft_config_version | cut -d . -f 2` + ft_config_micro_version=`echo $ft_config_version | cut -d . -f 3` + ft_min_major_version=`echo $min_ft_version | cut -d . -f 1` + ft_min_minor_version=`echo $min_ft_version | cut -d . -f 2` + ft_min_micro_version=`echo $min_ft_version | cut -d . -f 3` + if test "x$enable_fttest" = "xyes" ; then + ft_config_version=`expr $ft_config_major_version \* 10000 + $ft_config_minor_version \* 100 + $ft_config_micro_version` + ft_min_version=`expr $ft_min_major_version \* 10000 + $ft_min_minor_version \* 100 + $ft_min_micro_version` + if test $ft_config_version -lt $ft_min_version ; then + { { echo "$as_me:$LINENO: error: FreeType2 is required to compile this library" >&5 +echo "$as_me: error: FreeType2 is required to compile this library" >&2;} + { (exit 1); exit 1; }; } + else + ac_save_CFLAGS="$CFLAGS" + ac_save_LIBS="$LIBS" + CFLAGS="$CFLAGS $FT2_CFLAGS" + LIBS="$FT2_LIBS $LIBS" + if test "$cross_compiling" = yes; then + echo $ac_n "cross compiling; assumed OK... $ac_c" +else + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#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; + } +} + +_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_ft=yes +fi +rm -f core core.* *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi + 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 + 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 "$FT2_CONFIG" = "no" ; then + echo "*** The freetype-config script installed by FT2 could not be found" + echo "*** If FT2 was installed in PREFIX, make sure PREFIX/bin is in" + echo "*** your path, or set the FT2_CONFIG environment variable to the" + echo "*** full path to freetype-config." + else + echo "*** The FreeType test program failed to run. If your system uses" + echo "*** shared libraries and they are installed outside the normal" + echo "*** system library path, make sure the variable LD_LIBRARY_PATH" + echo "*** (or whatever is appropiate for your system) is correctly set." + fi + FT2_CFLAGS="" + FT2_LIBS="" + { { echo "$as_me:$LINENO: error: FreeType2 is required to compile this library" >&5 +echo "$as_me: error: FreeType2 is required to compile this library" >&2;} + { (exit 1); exit 1; }; } +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 +#line $LINENO "configure" +/* 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>&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.$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 +#line $LINENO "configure" +/* 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>&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.$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 +#line $LINENO "configure" +/* 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>&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 +#line $LINENO "configure" +/* 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>&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.$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 +#line $LINENO "configure" +/* 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>&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.$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.$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 +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char gethostbyname (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ +#ifdef __STDC__ +# include +#else +# include +#endif +/* 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>&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.$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 +#line $LINENO "configure" +/* 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>&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.$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 +#line $LINENO "configure" +/* 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>&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.$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 +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char connect (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ +#ifdef __STDC__ +# include +#else +# include +#endif +/* 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>&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.$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 +#line $LINENO "configure" +/* 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>&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.$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 +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char remove (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ +#ifdef __STDC__ +# include +#else +# include +#endif +/* 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>&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.$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 +#line $LINENO "configure" +/* 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>&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.$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 +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char shmat (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ +#ifdef __STDC__ +# include +#else +# include +#endif +/* 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>&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.$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 +#line $LINENO "configure" +/* 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>&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.$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 +#line $LINENO "configure" +/* 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>&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.$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 + + + + + + + +# Check whether --with---with-gl-inc or --without---with-gl-inc was given. +if test "${with___with_gl_inc+set}" = set; then + withval="$with___with_gl_inc" + +fi; + +# Check whether --with---with-gl-lib or --without---with-gl-lib was given. +if test "${with___with_gl_lib+set}" = set; then + withval="$with___with_gl_lib" + +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 + + +GL_SAVE_CPPFLAGS="$CPPFLAGS" +GL_SAVE_LIBS="$LIBS" + +if test "x$no_x" != xyes ; then + GL_CFLAGS="$X_CFLAGS" + GL_X_LIBS="$X_PRE_LIBS $X_LIBS -lX11 -lXext -lXmu $X_EXTRA_LIBS" +fi + +if test "x$with_gl_inc" != "xnone" ; then + if test -d "$with_gl_inc" ; then + GL_CFLAGS="-I$with_gl_inc" + else + GL_CFLAGS="$with_gl_inc" + fi +else + GL_CFLAGS= +fi + +CPPFLAGS="$GL_CFLAGS" +if test "${ac_cv_header_GL_gl_h+set}" = set; then + echo "$as_me:$LINENO: checking for GL/gl.h" >&5 +echo $ECHO_N "checking for GL/gl.h... $ECHO_C" >&6 +if test "${ac_cv_header_GL_gl_h+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +fi +echo "$as_me:$LINENO: result: $ac_cv_header_GL_gl_h" >&5 +echo "${ECHO_T}$ac_cv_header_GL_gl_h" >&6 +else + # Is the header compilable? +echo "$as_me:$LINENO: checking GL/gl.h usability" >&5 +echo $ECHO_N "checking GL/gl.h usability... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include +_ACEOF +rm -f conftest.$ac_objext +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); } && + { 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.$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 GL/gl.h presence" >&5 +echo $ECHO_N "checking GL/gl.h presence... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_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 + 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 in + yes:no ) + { echo "$as_me:$LINENO: WARNING: GL/gl.h: accepted by the compiler, rejected by the preprocessor!" >&5 +echo "$as_me: WARNING: GL/gl.h: accepted by the compiler, rejected by the preprocessor!" >&2;} + { echo "$as_me:$LINENO: WARNING: GL/gl.h: proceeding with the preprocessor's result" >&5 +echo "$as_me: WARNING: GL/gl.h: proceeding with the preprocessor's result" >&2;} + ( + cat <<\_ASBOX +## ------------------------------------ ## +## Report this to bug-autoconf@gnu.org. ## +## ------------------------------------ ## +_ASBOX + ) | + sed "s/^/$as_me: WARNING: /" >&2 + ;; + no:yes ) + { echo "$as_me:$LINENO: WARNING: GL/gl.h: present but cannot be compiled" >&5 +echo "$as_me: WARNING: GL/gl.h: present but cannot be compiled" >&2;} + { echo "$as_me:$LINENO: WARNING: GL/gl.h: check for missing prerequisite headers?" >&5 +echo "$as_me: WARNING: GL/gl.h: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: GL/gl.h: proceeding with the preprocessor's result" >&5 +echo "$as_me: WARNING: GL/gl.h: proceeding with the preprocessor's result" >&2;} + ( + cat <<\_ASBOX +## ------------------------------------ ## +## Report this to bug-autoconf@gnu.org. ## +## ------------------------------------ ## +_ASBOX + ) | + sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac +echo "$as_me:$LINENO: checking for GL/gl.h" >&5 +echo $ECHO_N "checking for GL/gl.h... $ECHO_C" >&6 +if test "${ac_cv_header_GL_gl_h+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_cv_header_GL_gl_h=$ac_header_preproc +fi +echo "$as_me:$LINENO: result: $ac_cv_header_GL_gl_h" >&5 +echo "${ECHO_T}$ac_cv_header_GL_gl_h" >&6 + +fi +if test $ac_cv_header_GL_gl_h = yes; then + : +else + { { echo "$as_me:$LINENO: error: GL/gl.h is needed" >&5 +echo "$as_me: error: GL/gl.h is needed" >&2;} + { (exit please specify its location with --with-gl-inc. If this still fails); exit please specify its location with --with-gl-inc. If this still fails; }; } +fi + + + +echo "$as_me:$LINENO: checking for GL library" >&5 +echo $ECHO_N "checking for GL library... $ECHO_C" >&6 +if test "x$with_gl_lib" != "x" ; then + if test -d "$with_gl_lib" ; then + LIBS="-L$with_gl_lib -lGL" + else + LIBS="$with_gl_lib" + fi +else + LIBS="-lGL" +fi +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* 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 glBegin (); +int +main () +{ +glBegin (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext 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='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 + HAVE_GL=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +HAVE_GL=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +if test "x$HAVE_GL" = xno ; then + if test "x$GL_X_LIBS" != x ; then + LIBS="-lGL $GL_X_LIBS" + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* 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 glBegin (); +int +main () +{ +glBegin (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext 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='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 + HAVE_GL=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +HAVE_GL=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext + fi +fi +if test "x$HAVE_GL" = xyes ; then + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + GL_LIBS=$LIBS +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 + { { echo "$as_me:$LINENO: error: GL library could not be found, please specify its location with --with-gl-lib. If this still fails, please contact mmagallo@debian.org, include the string FTGL somewhere in the subject line and provide a copy of the config.log file that was left behind." >&5 +echo "$as_me: error: GL library could not be found, please specify its location with --with-gl-lib. If this still fails, please contact mmagallo@debian.org, include the string FTGL somewhere in the subject line and provide a copy of the config.log file that was left behind." >&2;} + { (exit 1); exit 1; }; } +fi + +if test "${ac_cv_header_GL_glu_h+set}" = set; then + echo "$as_me:$LINENO: checking for GL/glu.h" >&5 +echo $ECHO_N "checking for GL/glu.h... $ECHO_C" >&6 +if test "${ac_cv_header_GL_glu_h+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +fi +echo "$as_me:$LINENO: result: $ac_cv_header_GL_glu_h" >&5 +echo "${ECHO_T}$ac_cv_header_GL_glu_h" >&6 +else + # Is the header compilable? +echo "$as_me:$LINENO: checking GL/glu.h usability" >&5 +echo $ECHO_N "checking GL/glu.h usability... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include +_ACEOF +rm -f conftest.$ac_objext +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); } && + { 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.$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 GL/glu.h presence" >&5 +echo $ECHO_N "checking GL/glu.h presence... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_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 + 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 in + yes:no ) + { echo "$as_me:$LINENO: WARNING: GL/glu.h: accepted by the compiler, rejected by the preprocessor!" >&5 +echo "$as_me: WARNING: GL/glu.h: accepted by the compiler, rejected by the preprocessor!" >&2;} + { echo "$as_me:$LINENO: WARNING: GL/glu.h: proceeding with the preprocessor's result" >&5 +echo "$as_me: WARNING: GL/glu.h: proceeding with the preprocessor's result" >&2;} + ( + cat <<\_ASBOX +## ------------------------------------ ## +## Report this to bug-autoconf@gnu.org. ## +## ------------------------------------ ## +_ASBOX + ) | + sed "s/^/$as_me: WARNING: /" >&2 + ;; + no:yes ) + { echo "$as_me:$LINENO: WARNING: GL/glu.h: present but cannot be compiled" >&5 +echo "$as_me: WARNING: GL/glu.h: present but cannot be compiled" >&2;} + { echo "$as_me:$LINENO: WARNING: GL/glu.h: check for missing prerequisite headers?" >&5 +echo "$as_me: WARNING: GL/glu.h: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: GL/glu.h: proceeding with the preprocessor's result" >&5 +echo "$as_me: WARNING: GL/glu.h: proceeding with the preprocessor's result" >&2;} + ( + cat <<\_ASBOX +## ------------------------------------ ## +## Report this to bug-autoconf@gnu.org. ## +## ------------------------------------ ## +_ASBOX + ) | + sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac +echo "$as_me:$LINENO: checking for GL/glu.h" >&5 +echo $ECHO_N "checking for GL/glu.h... $ECHO_C" >&6 +if test "${ac_cv_header_GL_glu_h+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_cv_header_GL_glu_h=$ac_header_preproc +fi +echo "$as_me:$LINENO: result: $ac_cv_header_GL_glu_h" >&5 +echo "${ECHO_T}$ac_cv_header_GL_glu_h" >&6 + +fi + + +echo "$as_me:$LINENO: checking for GLU version >= 1.2" >&5 +echo $ECHO_N "checking for GLU version >= 1.2... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +int +main () +{ + +#if !defined(GLU_VERSION_1_2) +#error GLU too old +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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); } && + { 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 + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 + { { echo "$as_me:$LINENO: error: GLU >= 1.2 is needed to compile this library" >&5 +echo "$as_me: error: GLU >= 1.2 is needed to compile this library" >&2;} + { (exit 1); exit 1; }; } + +fi +rm -f conftest.$ac_objext conftest.$ac_ext + +echo "$as_me:$LINENO: checking for GLU library" >&5 +echo $ECHO_N "checking for GLU library... $ECHO_C" >&6 +LIBS="-lGLU $GL_LIBS" +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* 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 gluNewTess (); +int +main () +{ +gluNewTess (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext 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='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 + HAVE_GLU=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +HAVE_GLU=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +if test "x$HAVE_GLU" = xno ; then + if test "x$GL_X_LIBS" != x ; then + LIBS="-lGLU $GL_LIBS $GL_X_LIBS" + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* 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 gluNewTess (); +int +main () +{ +gluNewTess (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext 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='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 + HAVE_GLU=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +HAVE_GLU=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext + fi +fi +if test "x$HAVE_GLU" = xyes ; then + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + GL_LIBS="$LIBS" +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 + { { echo "$as_me:$LINENO: error: GLU library could not be found, please specify its location with --with-gl-lib. If this still fails, please contact mmagallo@debian.org, include the string FTGL somewhere in the subject line and provide a copy of the config.log file that was left behind." >&5 +echo "$as_me: error: GLU library could not be found, please specify its location with --with-gl-lib. If this still fails, please contact mmagallo@debian.org, include the string FTGL somewhere in the subject line and provide a copy of the config.log file that was left behind." >&2;} + { (exit 1); exit 1; }; } +fi + + + + +CPPFLAGS="$GL_SAVE_CPPFLAGS" +LIBS="$GL_SAVE_LIBS" +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 + +GL_X_LIBS="" + + + +# Check whether --with---with-glut-inc or --without---with-glut-inc was given. +if test "${with___with_glut_inc+set}" = set; then + withval="$with___with_glut_inc" + +fi; + +# Check whether --with---with-glut-lib or --without---with-glut-lib was given. +if test "${with___with_glut_lib+set}" = set; then + withval="$with___with_glut_lib" + +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 + + +GLUT_SAVE_CPPFLAGS="$CPPFLAGS" +GLUT_SAVE_LIBS="$LIBS" + +if test "x$no_x" != xyes ; then + GLUT_CFLAGS="$X_CFLAGS" + GLUT_X_LIBS="$X_PRE_LIBS $X_LIBS -lX11 -lXext -lXmu $X_EXTRA_LIBS" +fi + +if test "x$with_glut_inc" != "xnone" ; then + if test -d "$with_glut_inc" ; then + GLUT_CFLAGS="-I$with_glut_inc" + else + GLUT_CFLAGS="$with_glut_inc" + fi +else + GLUT_CFLAGS= +fi + +CPPFLAGS="$GLUT_CFLAGS" +if test "${ac_cv_header_GL_glut_h+set}" = set; then + echo "$as_me:$LINENO: checking for GL/glut.h" >&5 +echo $ECHO_N "checking for GL/glut.h... $ECHO_C" >&6 +if test "${ac_cv_header_GL_glut_h+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +fi +echo "$as_me:$LINENO: result: $ac_cv_header_GL_glut_h" >&5 +echo "${ECHO_T}$ac_cv_header_GL_glut_h" >&6 +else + # Is the header compilable? +echo "$as_me:$LINENO: checking GL/glut.h usability" >&5 +echo $ECHO_N "checking GL/glut.h usability... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include +_ACEOF +rm -f conftest.$ac_objext +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); } && + { 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.$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 GL/glut.h presence" >&5 +echo $ECHO_N "checking GL/glut.h presence... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_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 + 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 in + yes:no ) + { echo "$as_me:$LINENO: WARNING: GL/glut.h: accepted by the compiler, rejected by the preprocessor!" >&5 +echo "$as_me: WARNING: GL/glut.h: accepted by the compiler, rejected by the preprocessor!" >&2;} + { echo "$as_me:$LINENO: WARNING: GL/glut.h: proceeding with the preprocessor's result" >&5 +echo "$as_me: WARNING: GL/glut.h: proceeding with the preprocessor's result" >&2;} + ( + cat <<\_ASBOX +## ------------------------------------ ## +## Report this to bug-autoconf@gnu.org. ## +## ------------------------------------ ## +_ASBOX + ) | + sed "s/^/$as_me: WARNING: /" >&2 + ;; + no:yes ) + { echo "$as_me:$LINENO: WARNING: GL/glut.h: present but cannot be compiled" >&5 +echo "$as_me: WARNING: GL/glut.h: present but cannot be compiled" >&2;} + { echo "$as_me:$LINENO: WARNING: GL/glut.h: check for missing prerequisite headers?" >&5 +echo "$as_me: WARNING: GL/glut.h: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: GL/glut.h: proceeding with the preprocessor's result" >&5 +echo "$as_me: WARNING: GL/glut.h: proceeding with the preprocessor's result" >&2;} + ( + cat <<\_ASBOX +## ------------------------------------ ## +## Report this to bug-autoconf@gnu.org. ## +## ------------------------------------ ## +_ASBOX + ) | + sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac +echo "$as_me:$LINENO: checking for GL/glut.h" >&5 +echo $ECHO_N "checking for GL/glut.h... $ECHO_C" >&6 +if test "${ac_cv_header_GL_glut_h+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_cv_header_GL_glut_h=$ac_header_preproc +fi +echo "$as_me:$LINENO: result: $ac_cv_header_GL_glut_h" >&5 +echo "${ECHO_T}$ac_cv_header_GL_glut_h" >&6 + +fi +if test $ac_cv_header_GL_glut_h = yes; then + HAVE_GLUT=yes +else + HAVE_GLUT=no +fi + + + +if test "x$HAVE_GLUT" = xno ; then + { echo "$as_me:$LINENO: WARNING: GLUT headers not availabe, example program won't be compiled." >&5 +echo "$as_me: WARNING: GLUT headers not availabe, example program won't be compiled." >&2;} +else + +# Check for GLUT libraries + + echo "$as_me:$LINENO: checking for GLUT library" >&5 +echo $ECHO_N "checking for GLUT library... $ECHO_C" >&6 + if test "x$with_glut_lib" != "x" ; then + if test -d "$with_glut_lib" ; then + LIBS="-L$with_glut_lib -lglut" + else + LIBS="$with_glut_lib" + fi + else + LIBS="-lglut" + fi + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* 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 glutInit (); +int +main () +{ +glutInit (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext 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='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 + HAVE_GLUT=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +HAVE_GLUT=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext + + if test "x$HAVE_GLUT" = xno ; then + # Try again with the GL libs + LIBS="-lglut $GL_LIBS" + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* 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 glutInit (); +int +main () +{ +glutInit (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext 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='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 + HAVE_GLUT=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +HAVE_GLUT=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext + fi + + if test "x$HAVE_GLUT" = xno && test "x$GLUT_X_LIBS" != x ; then + # Try again with the GL and X11 libs + LIBS="-lglut $GL_LIBS $GLUT_X_LIBS" + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* 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 glutInit (); +int +main () +{ +glutInit (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext 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='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 + HAVE_GLUT=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +HAVE_GLUT=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext + fi + + if test "x$HAVE_GLUT" = xyes ; then + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + GLUT_LIBS=$LIBS + else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 + { echo "$as_me:$LINENO: WARNING: GLUT libraries not availabe, example program won't be compiled." >&5 +echo "$as_me: WARNING: GLUT libraries not availabe, example program won't be compiled." >&2;} + fi + +# End check for GLUT libraries + +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 + + +CPPFLAGS="$GLUT_SAVE_CPPFLAGS" +LIBS="$GLUT_SAVE_LIBS" +GLUT_X_CFLAGS= +GLUT_X_LIBS= + + +# Checks for library functions + + +for ac_func in memset +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 +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ +#ifdef __STDC__ +# include +#else +# include +#endif +/* 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>&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.$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 `echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + + +# Utility programs + +# 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" +# ./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/* | \ + /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' + + +# Extract the first word of "doxygen", so it can be a program name with args. +set dummy doxygen; 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_DOXYGEN+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$DOXYGEN"; then + ac_cv_prog_DOXYGEN="$DOXYGEN" # 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_DOXYGEN="doxygen" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +DOXYGEN=$ac_cv_prog_DOXYGEN +if test -n "$DOXYGEN"; then + echo "$as_me:$LINENO: result: $DOXYGEN" >&5 +echo "${ECHO_T}$DOXYGEN" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +if test -z "$DOXYGEN" ; then + DOXYGEN=: +fi + + ac_config_files="$ac_config_files Make.conf ftgl.pc" + +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 + + + +: ${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 + +# Support unset when possible. +if (FOO=FOO; unset FOO) >/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 -n "`(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 + as_mkdir_p=false +fi + +as_executable_p="test -f" + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="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="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 ftgl $as_me 2.0.5, which was +generated by GNU Autoconf 2.57. 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 + +Report bugs to ." +_ACEOF + +cat >>$CONFIG_STATUS <<_ACEOF +ac_cs_version="\\ +ftgl config.status 2.0.5 +configured by $0, generated by GNU Autoconf 2.57, + with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\" + +Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001 +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 +for ac_config_target in $ac_config_targets +do + case "$ac_config_target" in + # Handling of arguments. + "Make.conf" ) CONFIG_FILES="$CONFIG_FILES Make.conf" ;; + "ftgl.pc" ) CONFIG_FILES="$CONFIG_FILES ftgl.pc" ;; + *) { { 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 +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,@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,@CXX@,$CXX,;t t +s,@CXXFLAGS@,$CXXFLAGS,;t t +s,@LDFLAGS@,$LDFLAGS,;t t +s,@CPPFLAGS@,$CPPFLAGS,;t t +s,@ac_ct_CXX@,$ac_ct_CXX,;t t +s,@EXEEXT@,$EXEEXT,;t t +s,@OBJEXT@,$OBJEXT,;t t +s,@CC@,$CC,;t t +s,@CFLAGS@,$CFLAGS,;t t +s,@ac_ct_CC@,$ac_ct_CC,;t t +s,@LN_S@,$LN_S,;t t +s,@ECHO@,$ECHO,;t t +s,@RANLIB@,$RANLIB,;t t +s,@ac_ct_RANLIB@,$ac_ct_RANLIB,;t t +s,@STRIP@,$STRIP,;t t +s,@ac_ct_STRIP@,$ac_ct_STRIP,;t t +s,@CPP@,$CPP,;t t +s,@EGREP@,$EGREP,;t t +s,@LIBTOOL@,$LIBTOOL,;t t +s,@FT2_CONFIG@,$FT2_CONFIG,;t t +s,@FT2_CFLAGS@,$FT2_CFLAGS,;t t +s,@FT2_LIBS@,$FT2_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_CFLAGS@,$GL_CFLAGS,;t t +s,@GL_LIBS@,$GL_LIBS,;t t +s,@HAVE_GLUT@,$HAVE_GLUT,;t t +s,@GLUT_CFLAGS@,$GLUT_CFLAGS,;t t +s,@GLUT_LIBS@,$GLUT_LIBS,;t t +s,@INSTALL_PROGRAM@,$INSTALL_PROGRAM,;t t +s,@INSTALL_SCRIPT@,$INSTALL_SCRIPT,;t t +s,@INSTALL_DATA@,$INSTALL_DATA,;t t +s,@DOXYGEN@,$DOXYGEN,;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 +# Don't blindly perform a `cd "$ac_dir"/$ac_foo && pwd` since $ac_foo can be +# absolute. +ac_abs_builddir=`cd "$ac_dir" && cd $ac_builddir && pwd` +ac_abs_top_builddir=`cd "$ac_dir" && cd ${ac_top_builddir}. && pwd` +ac_abs_srcdir=`cd "$ac_dir" && cd $ac_srcdir && pwd` +ac_abs_top_srcdir=`cd "$ac_dir" && cd $ac_top_srcdir && pwd` + + + 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 + +{ (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/src/WinLibs/FTGL/unix/configure.ac b/src/WinLibs/FTGL/unix/configure.ac new file mode 100644 index 000000000..9b0cd6c4a --- /dev/null +++ b/src/WinLibs/FTGL/unix/configure.ac @@ -0,0 +1,47 @@ +AC_INIT(ftgl, 2.0.5, henryj@paradise.net.nz) +AC_CONFIG_SRCDIR([Make.conf.in]) +dnl AC_CONFIG_HEADER([src/config.h]) + +FTGL_PROG_CXX + +AC_DISABLE_SHARED +AC_PROG_LIBTOOL + +# Checks for typedefs, structures, and compiler characteristics. + +dnl These don't mix with C++ +dnl AC_C_CONST +dnl AC_C_INLINE + +# Checks for header files. +AC_HEADER_STDC +AC_CHECK_HEADER([stdlib.h]) + +# Checks for libraries. + +AC_PATH_X + +AC_CHECK_FT2([9.0.3],[], + [AC_MSG_ERROR([FreeType2 is required to compile this library])]) + +AC_PATH_XTRA + +FTGL_CHECK_GL +FTGL_CHECK_GLUT + +# Checks for library functions +dnl This isn't really used at the moment + +AC_CHECK_FUNCS([memset]) + +# Utility programs + +AC_PROG_INSTALL + +AC_CHECK_PROG([DOXYGEN], [doxygen], [doxygen]) +if test -z "$DOXYGEN" ; then + DOXYGEN=: +fi + +AC_CONFIG_FILES([Make.conf ftgl.pc]) +AC_OUTPUT diff --git a/src/WinLibs/FTGL/unix/demo/Makefile b/src/WinLibs/FTGL/unix/demo/Makefile new file mode 100644 index 000000000..338a2db9e --- /dev/null +++ b/src/WinLibs/FTGL/unix/demo/Makefile @@ -0,0 +1,50 @@ +top_srcdir=../.. +VPATH=$(top_srcdir)/demo +top_builddir=.. +-include $(top_builddir)/Make.conf + +TARGET = FTGLDemo + +all: $(TARGET) + +SRCS = \ + FTGLDemo.cpp \ + tb.c \ + trackball.c \ + +HEADERS = \ + tb.h \ + trackball.h \ + +OBJS = $(patsubst %.cpp,%.$(OBJEXT),$(filter %.cpp,$(SRCS))) +OBJS += $(patsubst %.c,%.$(OBJEXT),$(filter %.c,$(SRCS))) + +ALL_OBJS = $(OBJS) + +CPPFLAGS += $(FT2_CFLAGS) +CPPFLAGS += -I$(top_srcdir)/src + +LIBS += $(FT2_LIBS) $(GLUT_LIBS) + +ifeq ($(HAVE_GLUT),yes) +FTGLDemo: $(OBJS) + $(LIBTOOL) --mode=link $(CXX) $^ -o $@ $(top_builddir)/src/libftgl.la $(LIBGLUT) $(LIBS) + +install-local: FTGLDemo + $(INSTALL) -d -m 0755 $(bindir) + $(LIBTOOL) --mode=install $(INSTALL) -m 0755 $(TARGET) $(bindir) +else +FTGLDemo: + @echo GLUT not available, demo won\'t be compiled + +install-local: +endif + +clean-local: + $(RM) $(ALL_OBJS) + +distclean-local: + $(RM) $(TARGET) + $(RM) -r .libs + +include $(top_builddir)/Make.rules diff --git a/src/WinLibs/FTGL/unix/docs/Makefile b/src/WinLibs/FTGL/unix/docs/Makefile new file mode 100644 index 000000000..b07ca519b --- /dev/null +++ b/src/WinLibs/FTGL/unix/docs/Makefile @@ -0,0 +1,25 @@ +VPATH=../../docs +top_builddir=.. +-include $(top_builddir)/Make.conf + +DOXYFILE = ftgl_dox +DOCDIRS = html + +all: doc + +doc: doc-stamp +doc-stamp: $(DOXYFILE) + sed 's,^INPUT[ ].*,INPUT=../../src,' $^ | $(DOXYGEN) - + touch $@ + +install-local: doc + $(INSTALL) -d -m 0755 $(datadir)/doc/$(PACKAGE_NAME)/html + $(INSTALL) -m 0644 html/* $(datadir)/doc/$(PACKAGE_NAME)/html/ + +distclean-local: + $(RM) -r $(DOCDIRS) + $(RM) doc-stamp + +include $(top_builddir)/Make.rules + +.PHONY: all doc diff --git a/src/WinLibs/FTGL/unix/ftgl.pc.in b/src/WinLibs/FTGL/unix/ftgl.pc.in new file mode 100644 index 000000000..09c331ddc --- /dev/null +++ b/src/WinLibs/FTGL/unix/ftgl.pc.in @@ -0,0 +1,11 @@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@ + +Name: @PACKAGE_NAME@ +Description: OpenGL frontend to Freetype 2 +Version: @PACKAGE_VERSION@ +Requires: +Libs: @GL_LIBS@ @FT2_LIBS@ -L${libdir} -lftgl +Cflags: -I${includedir} @GL_CFLAGS@ @FT2_CFLAGS@ diff --git a/src/WinLibs/FTGL/unix/install-sh b/src/WinLibs/FTGL/unix/install-sh new file mode 100644 index 000000000..c122ef95b --- /dev/null +++ b/src/WinLibs/FTGL/unix/install-sh @@ -0,0 +1,251 @@ +#!/bin/sh +# +# install - install a program, script, or datafile +# This comes from X11R5 (mit/util/scripts/install.sh). +# +# Copyright 1991 by the Massachusetts Institute of Technology +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of M.I.T. not be used in advertising or +# publicity pertaining to distribution of the software without specific, +# written prior permission. M.I.T. makes no representations about the +# suitability of this software for any purpose. It is provided "as is" +# without express or implied warranty. +# +# Calling this script install-sh is preferred over install.sh, to prevent +# `make' implicit rules from creating a file called install from it +# when there is no Makefile. +# +# This script is compatible with the BSD install script, but was written +# from scratch. It can only install one file at a time, a restriction +# shared with many OS's install programs. + + +# set DOITPROG to echo to test this script + +# Don't use :- since 4.3BSD and earlier shells don't like it. +doit="${DOITPROG-}" + + +# put in absolute paths if you don't have them in your path; or use env. vars. + +mvprog="${MVPROG-mv}" +cpprog="${CPPROG-cp}" +chmodprog="${CHMODPROG-chmod}" +chownprog="${CHOWNPROG-chown}" +chgrpprog="${CHGRPPROG-chgrp}" +stripprog="${STRIPPROG-strip}" +rmprog="${RMPROG-rm}" +mkdirprog="${MKDIRPROG-mkdir}" + +transformbasename="" +transform_arg="" +instcmd="$mvprog" +chmodcmd="$chmodprog 0755" +chowncmd="" +chgrpcmd="" +stripcmd="" +rmcmd="$rmprog -f" +mvcmd="$mvprog" +src="" +dst="" +dir_arg="" + +while [ x"$1" != x ]; do + case $1 in + -c) instcmd="$cpprog" + shift + continue;; + + -d) dir_arg=true + shift + continue;; + + -m) chmodcmd="$chmodprog $2" + shift + shift + continue;; + + -o) chowncmd="$chownprog $2" + shift + shift + continue;; + + -g) chgrpcmd="$chgrpprog $2" + shift + shift + continue;; + + -s) stripcmd="$stripprog" + shift + continue;; + + -t=*) transformarg=`echo $1 | sed 's/-t=//'` + shift + continue;; + + -b=*) transformbasename=`echo $1 | sed 's/-b=//'` + shift + continue;; + + *) if [ x"$src" = x ] + then + src=$1 + else + # this colon is to work around a 386BSD /bin/sh bug + : + dst=$1 + fi + shift + continue;; + esac +done + +if [ x"$src" = x ] +then + echo "install: no input file specified" + exit 1 +else + true +fi + +if [ x"$dir_arg" != x ]; then + dst=$src + src="" + + if [ -d $dst ]; then + instcmd=: + chmodcmd="" + else + instcmd=mkdir + fi +else + +# Waiting for this to be detected by the "$instcmd $src $dsttmp" command +# might cause directories to be created, which would be especially bad +# if $src (and thus $dsttmp) contains '*'. + + if [ -f $src -o -d $src ] + then + true + else + echo "install: $src does not exist" + exit 1 + fi + + if [ x"$dst" = x ] + then + echo "install: no destination specified" + exit 1 + else + true + fi + +# If destination is a directory, append the input filename; if your system +# does not like double slashes in filenames, you may need to add some logic + + if [ -d $dst ] + then + dst="$dst"/`basename $src` + else + true + fi +fi + +## this sed command emulates the dirname command +dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` + +# Make sure that the destination directory exists. +# this part is taken from Noah Friedman's mkinstalldirs script + +# Skip lots of stat calls in the usual case. +if [ ! -d "$dstdir" ]; then +defaultIFS=' +' +IFS="${IFS-${defaultIFS}}" + +oIFS="${IFS}" +# Some sh's can't handle IFS=/ for some reason. +IFS='%' +set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'` +IFS="${oIFS}" + +pathcomp='' + +while [ $# -ne 0 ] ; do + pathcomp="${pathcomp}${1}" + shift + + if [ ! -d "${pathcomp}" ] ; + then + $mkdirprog "${pathcomp}" + else + true + fi + + pathcomp="${pathcomp}/" +done +fi + +if [ x"$dir_arg" != x ] +then + $doit $instcmd $dst && + + if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi && + if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi && + if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi && + if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi +else + +# If we're going to rename the final executable, determine the name now. + + if [ x"$transformarg" = x ] + then + dstfile=`basename $dst` + else + dstfile=`basename $dst $transformbasename | + sed $transformarg`$transformbasename + fi + +# don't allow the sed command to completely eliminate the filename + + if [ x"$dstfile" = x ] + then + dstfile=`basename $dst` + else + true + fi + +# Make a temp file name in the proper directory. + + dsttmp=$dstdir/#inst.$$# + +# Move or copy the file name to the temp name + + $doit $instcmd $src $dsttmp && + + trap "rm -f ${dsttmp}" 0 && + +# and set any options; do chmod last to preserve setuid bits + +# If any of these fail, we abort the whole thing. If we want to +# ignore errors from any of these, just make sure not to ignore +# errors from the above "$doit $instcmd $src $dsttmp" command. + + if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi && + if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi && + if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi && + if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi && + +# Now rename the file to the real destination. + + $doit $rmcmd -f $dstdir/$dstfile && + $doit $mvcmd $dsttmp $dstdir/$dstfile + +fi && + + +exit 0 diff --git a/src/WinLibs/FTGL/unix/ltmain.sh b/src/WinLibs/FTGL/unix/ltmain.sh new file mode 100644 index 000000000..6fc690018 --- /dev/null +++ b/src/WinLibs/FTGL/unix/ltmain.sh @@ -0,0 +1,5107 @@ +# 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 +# Free Software Foundation, Inc. +# Originally by Gordon Matzigkeit , 1996 +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# 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 "$0" --no-reexec ${1+"$@"} +fi + +if test "X$1" = X--fallback-echo; then + # used as fallback echo + shift + cat <&2 + echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2 + exit 1 +fi + +# Global variables. +mode=$default_mode +nonopt= +prev= +prevopt= +run= +show="$echo" +show_help= +execute_dlfiles= +lo2o="s/\\.lo\$/.${objext}/" +o2lo="s/\\.${objext}\$/.lo/" + +# 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" + ;; + *) + 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" + exit 0 + ;; + + --config) + ${SED} -e '1,/^# ### BEGIN LIBTOOL CONFIG/d' -e '/^# ### END LIBTOOL CONFIG/,$d' $0 + exit 0 + ;; + + --debug) + echo "$progname: enabling shell trace mode" + set -x + ;; + + --dry-run | -n) + run=: + ;; + + --features) + echo "host: $host" + if test "$build_libtool_libs" = yes; then + echo "enable shared libraries" + else + echo "disable shared libraries" + fi + if test "$build_old_libs" = yes; then + echo "enable static libraries" + else + echo "disable static libraries" + fi + exit 0 + ;; + + --finish) mode="finish" ;; + + --mode) prevopt="--mode" prev=mode ;; + --mode=*) mode="$optarg" ;; + + --preserve-dup-deps) duplicate_deps="yes" ;; + + --quiet | --silent) + show=: + ;; + + -dlopen) + prevopt="-dlopen" + prev=execute_dlfiles + ;; + + -*) + $echo "$modename: unrecognized option \`$arg'" 1>&2 + $echo "$help" 1>&2 + exit 1 + ;; + + *) + nonopt="$arg" + break + ;; + esac +done + +if test -n "$prevopt"; then + $echo "$modename: option \`$prevopt' requires an argument" 1>&2 + $echo "$help" 1>&2 + exit 1 +fi + +# If 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 + case $nonopt in + *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 1 + fi + + # Change the help message to a mode-specific one. + generic_help="$help" + help="Try \`$modename --help --mode=$mode' for more information." + + # These modes are in order of execution frequency so that they run quickly. + case $mode in + # libtool compile mode + compile) + modename="$modename: compile" + # Get the compilation command and the source file. + base_compile= + prev= + lastarg= + srcfile="$nonopt" + suppress_output= + + user_target=no + for arg + do + case $prev in + "") ;; + xcompiler) + # Aesthetically quote the previous argument. + prev= + lastarg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` + + case $arg in + # Double-quote args containing other shell metacharacters. + # Many Bourne shells cannot handle close brackets correctly + # in scan sets, so we specify it separately. + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + + # Add the previous argument to base_compile. + if test -z "$base_compile"; then + base_compile="$lastarg" + else + base_compile="$base_compile $lastarg" + fi + continue + ;; + esac + + # Accept any command-line options. + case $arg in + -o) + if test "$user_target" != "no"; then + $echo "$modename: you cannot specify \`-o' more than once" 1>&2 + exit 1 + fi + user_target=next + ;; + + -static) + build_old_libs=yes + continue + ;; + + -prefer-pic) + pic_mode=yes + continue + ;; + + -prefer-non-pic) + pic_mode=no + continue + ;; + + -Xcompiler) + prev=xcompiler + continue + ;; + + -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. + if test -z "$base_compile"; then + base_compile="$lastarg" + else + base_compile="$base_compile $lastarg" + fi + continue + ;; + esac + + case $user_target in + next) + # The next one is the -o target name + user_target=yes + continue + ;; + yes) + # We got the output file + user_target=set + libobj="$arg" + continue + ;; + esac + + # Accept the current argument as the source file. + lastarg="$srcfile" + srcfile="$arg" + + # Aesthetically quote the previous argument. + + # Backslashify any backslashes, double quotes, and dollar signs. + # These are the only characters that are still specially + # interpreted inside of double-quoted scrings. + lastarg=`$echo "X$lastarg" | $Xsed -e "$sed_quote_subst"` + + # Double-quote args containing other shell metacharacters. + # Many Bourne shells cannot handle close brackets correctly + # in scan sets, so we specify it separately. + case $lastarg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + lastarg="\"$lastarg\"" + ;; + esac + + # Add the previous argument to base_compile. + if test -z "$base_compile"; then + base_compile="$lastarg" + else + base_compile="$base_compile $lastarg" + fi + done + + case $user_target in + set) + ;; + no) + # Get the name of the library object. + libobj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%'` + ;; + *) + $echo "$modename: you must specify a target with \`-o'" 1>&2 + exit 1 + ;; + esac + + # Recognize several different file suffixes. + # If the user specifies -o file.o, it is replaced with file.lo + xform='[cCFSfmso]' + case $libobj in + *.ada) xform=ada ;; + *.adb) xform=adb ;; + *.ads) xform=ads ;; + *.asm) xform=asm ;; + *.c++) xform=c++ ;; + *.cc) xform=cc ;; + *.cpp) xform=cpp ;; + *.cxx) xform=cxx ;; + *.f90) xform=f90 ;; + *.for) xform=for ;; + esac + + libobj=`$echo "X$libobj" | $Xsed -e "s/\.$xform$/.lo/"` + + case $libobj in + *.lo) obj=`$echo "X$libobj" | $Xsed -e "$lo2o"` ;; + *) + $echo "$modename: cannot determine name of library object from \`$libobj'" 1>&2 + exit 1 + ;; + esac + + if test -z "$base_compile"; then + $echo "$modename: you must specify a compilation command" 1>&2 + $echo "$help" 1>&2 + exit 1 + fi + + # Delete any leftover library objects. + if test "$build_old_libs" = yes; then + removelist="$obj $libobj" + else + removelist="$libobj" + fi + + $run $rm $removelist + trap "$run $rm $removelist; exit 1" 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 1" 1 2 15 + else + 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 "$0" "$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 1 + fi + echo $srcfile > "$lockfile" + fi + + if test -n "$fix_srcfile_path"; then + eval srcfile=\"$fix_srcfile_path\" + fi + + # Only build a PIC object if we are building libtool libraries. + if test "$build_libtool_libs" = yes; then + # Without this assignment, base_compile gets emptied. + fbsd_hideous_sh_bug=$base_compile + + if test "$pic_mode" != no; then + # All platforms use -DPIC, to notify preprocessed assembler code. + command="$base_compile $srcfile $pic_flag -DPIC" + else + # Don't build PIC code + command="$base_compile $srcfile" + fi + if test "$build_old_libs" = yes; then + lo_libobj="$libobj" + dir=`$echo "X$libobj" | $Xsed -e 's%/[^/]*$%%'` + if test "X$dir" = "X$libobj"; then + dir="$objdir" + else + dir="$dir/$objdir" + fi + libobj="$dir/"`$echo "X$libobj" | $Xsed -e 's%^.*/%%'` + + if test -d "$dir"; then + $show "$rm $libobj" + $run $rm $libobj + else + $show "$mkdir $dir" + $run $mkdir $dir + status=$? + if test $status -ne 0 && test ! -d $dir; then + exit $status + fi + fi + fi + if test "$compiler_o_lo" = yes; then + output_obj="$libobj" + command="$command -o $output_obj" + elif test "$compiler_c_o" = yes; then + output_obj="$obj" + command="$command -o $output_obj" + fi + + $run $rm "$output_obj" + $show "$command" + if $run eval "$command"; then : + else + test -n "$output_obj" && $run $rm $removelist + exit 1 + 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 1 + fi + + # Just move the object if needed, then go on to compile the next one + if test x"$output_obj" != x"$libobj"; then + $show "$mv $output_obj $libobj" + if $run $mv $output_obj $libobj; then : + else + error=$? + $run $rm $removelist + exit $error + fi + fi + + # If we have no pic_flag, then copy the object into place and finish. + if (test -z "$pic_flag" || test "$pic_mode" != default) && + test "$build_old_libs" = yes; then + # Rename the .lo from within objdir to obj + if test -f $obj; then + $show $rm $obj + $run $rm $obj + fi + + $show "$mv $libobj $obj" + if $run $mv $libobj $obj; then : + else + error=$? + $run $rm $removelist + exit $error + fi + + xdir=`$echo "X$obj" | $Xsed -e 's%/[^/]*$%%'` + if test "X$xdir" = "X$obj"; then + xdir="." + else + xdir="$xdir" + fi + baseobj=`$echo "X$obj" | $Xsed -e "s%.*/%%"` + libobj=`$echo "X$baseobj" | $Xsed -e "$o2lo"` + # Now arrange that obj and lo_libobj become the same file + $show "(cd $xdir && $LN_S $baseobj $libobj)" + if $run eval '(cd $xdir && $LN_S $baseobj $libobj)'; then + # Unlock the critical section if it was locked + if test "$need_locks" != no; then + $run $rm "$lockfile" + fi + exit 0 + else + error=$? + $run $rm $removelist + exit $error + fi + fi + + # Allow error messages only from the first compilation. + suppress_output=' >/dev/null 2>&1' + fi + + # Only build a position-dependent object if we build old libraries. + if test "$build_old_libs" = yes; then + if test "$pic_mode" != yes; then + # Don't build PIC code + command="$base_compile $srcfile" + else + # All platforms use -DPIC, to notify preprocessed assembler code. + command="$base_compile $srcfile $pic_flag -DPIC" + fi + if test "$compiler_c_o" = yes; then + command="$command -o $obj" + output_obj="$obj" + fi + + # Suppress compiler output if we already did a PIC compilation. + command="$command$suppress_output" + $run $rm "$output_obj" + $show "$command" + if $run eval "$command"; then : + else + $run $rm $removelist + exit 1 + 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 1 + fi + + # Just move the object if needed + if 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 + + # Create an invalid libtool object if no PIC, so that we do not + # accidentally link it into a program. + if test "$build_libtool_libs" != yes; then + $show "echo timestamp > $libobj" + $run eval "echo timestamp > \$libobj" || exit $? + else + # Move the .lo from within objdir + $show "$mv $libobj $lo_libobj" + if $run $mv $libobj $lo_libobj; then : + else + error=$? + $run $rm $removelist + exit $error + fi + fi + fi + + # Unlock the critical section if it was locked + if test "$need_locks" != no; then + $run $rm "$lockfile" + fi + + exit 0 + ;; + + # 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 invokation. + # 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" + 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= + prefer_static_libs=no + preload=no + prev= + prevarg= + release= + rpath= + xrpath= + perm_rpath= + temp_rpath= + thread_safe=no + vinfo= + + # We need to know -static, to get the right output filenames. + for arg + do + case $arg in + -all-static | -static) + if test "X$arg" = "X-all-static"; 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 + else + if test -z "$pic_flag" && test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + fi + build_libtool_libs=no + build_old_libs=yes + prefer_static_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 1 + fi + prev= + continue + ;; + expsyms_regex) + export_symbols_regex="$arg" + prev= + continue + ;; + inst_prefix) + inst_prefix_dir="$arg" + prev= + continue + ;; + release) + release="-$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 1 + ;; + 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 + ;; + *) + 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 1 + fi + if test "X$arg" = "X-export-symbols"; then + prev=expsyms + else + prev=expsyms_regex + fi + 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* | no/*-*-nonstopux*) + 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 + exit 1 + 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*) + case :$dllsearchpath: in + *":$dir:"*) ;; + *) dllsearchpath="$dllsearchpath:$dir";; + esac + ;; + esac + continue + ;; + + -l*) + if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then + case $host in + *-*-cygwin* | *-*-pw32* | *-*-beos*) + # These systems don't actually have a C or math library (as such) + continue + ;; + *-*-mingw* | *-*-os2*) + # These systems don't actually have a C library (as such) + test "X$arg" = "X-lc" && continue + ;; + *-*-openbsd* | *-*-freebsd*) + # Do not include libc due to us having libc/libc_r. + test "X$arg" = "X-lc" && continue + ;; + esac + elif test "X$arg" = "X-lc_r"; then + case $host in + *-*-openbsd* | *-*-freebsd*) + # Do not include libc_r directly, use -pthread flag. + continue + ;; + esac + fi + deplibs="$deplibs $arg" + continue + ;; + + -module) + module=yes + 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 + ;; + + -o) prev=output ;; + + -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 1 + ;; + 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 + ;; + + -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 + ;; + + # 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 + ;; + + *.lo | *.$objext) + # A library or standard object. + if test "$prev" = dlfiles; then + # This file was specified with -dlopen. + if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then + dlfiles="$dlfiles $arg" + prev= + continue + else + # If libtool objects are unsupported, then we need to preload. + prev=dlprefiles + fi + fi + + if test "$prev" = dlprefiles; then + # Preload the old-style object. + dlprefiles="$dlprefiles "`$echo "X$arg" | $Xsed -e "$lo2o"` + prev= + else + case $arg in + *.lo) libobjs="$libobjs $arg" ;; + *) objs="$objs $arg" ;; + esac + 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 1 + 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 + + # 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 + status=$? + if test $status -ne 0 && test ! -d $output_objdir; then + 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 1 + ;; + *.$libext) linkmode=oldlib ;; + *.lo | *.$objext) linkmode=obj ;; + *.la) linkmode=lib ;; + *) linkmode=prog ;; # Anything else should be a program. + 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 + deplibs= + newdependency_libs= + newlib_search_path= + need_relink=no # whether we're linking any uninstalled libtool libraries + notinst_deplibs= # not-installed libtool libraries + notinst_path= # paths that contain 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 1 + ;; + 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 = prog; then + # Determine which files to process + case $pass in + dlopen) + libs="$dlfiles" + save_deplibs="$deplibs" # Collect dlpreopened libraries + deplibs= + ;; + dlpreopen) libs="$dlprefiles" ;; + link) libs="$deplibs %DEPLIBS% $dependency_libs" ;; + esac + fi + for deplib in $libs; do + lib= + found=no + case $deplib in + -l*) + if test $linkmode = oldlib && test $linkmode = obj; then + $echo "$modename: warning: \`-l' is ignored for archives/objects: $deplib" 1>&2 + continue + fi + if test $pass = conv; then + deplibs="$deplib $deplibs" + 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 + # Search the libtool library + lib="$searchdir/lib${name}.la" + if test -f "$lib"; then + found=yes + break + fi + 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 + 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" + newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'` + else + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + fi + ;; + *) + $echo "$modename: warning: \`-L' is ignored for archives/objects: $deplib" 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) + if test "$deplibs_check_method" != pass_all; 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 = 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 + continue + ;; + %DEPLIBS%) + alldeplibs=yes + continue + ;; + esac # case $deplib + if test $found = yes || test -f "$lib"; then : + else + $echo "$modename: cannot find the library \`$lib'" 1>&2 + exit 1 + fi + + # Check to see that this really is a libtool archive. + if (${SED} -e '2q' $lib | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : + else + $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 + exit 1 + 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 variable installed. + installed=yes + + # Read the .la file + case $lib in + */* | *\\*) . $lib ;; + *) . ./$lib ;; + esac + + if test "$linkmode,$pass" = "lib,link" || + test "$linkmode,$pass" = "prog,scan" || + { test $linkmode = oldlib && test $linkmode = obj; }; then + # Add dl[pre]opened files of deplib + 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 1 + 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 1 + 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 1 + 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 1 + 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. + dlprefiles="$dlprefiles $lib" + 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 + else + dir="$ladir/$objdir" + absdir="$abs_ladir/$objdir" + # Remove this search path later + notinst_path="$notinst_path $abs_ladir" + 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 1 + 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" + 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... + + link_static=no # Whether the deplib will be linked statically + if test -n "$library_names" && + { test "$prefer_static_libs" = no || test -z "$old_library"; }; then + # Link against this shared library + + if test "$linkmode,$pass" = "prog,link" || + { 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 + if test $linkmode = prog; then + # We need to hardcode the library path + if test -n "$shlibpath_var"; then + # Make sure the rpath contains only unique directories. + case "$temp_rpath " in + *" $dir "*) ;; + *" $absdir "*) ;; + *) temp_rpath="$temp_rpath $dir" ;; + esac + fi + fi + 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 + + if test "$installed" = no; then + notinst_deplibs="$notinst_deplibs $lib" + need_relink=yes + 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*) + 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='~' + eval cmds=\"$extract_expsyms_cmds\" + for cmd in $cmds; do + IFS="$save_ifs" + $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='~' + eval cmds=\"$old_archive_from_expsyms_cmds\" + for cmd in $cmds; do + IFS="$save_ifs" + $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" + 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="-L$inst_prefix_dir$libdir $add_dir" + ;; + 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 1 + 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" + 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="-L$inst_prefix_dir$libdir $add_dir" + ;; + 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 + 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 + + # Try to link the static library + # 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 + convenience="$convenience $dir/$old_library" + old_convenience="$old_convenience $dir/$old_library" + 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="-L$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 1 + fi + if test "$absdir" != "$libdir"; then + $echo "$modename: warning: \`$deplib' seems to be moved" 1>&2 + fi + path="-L$absdir" + fi + ;; + *) continue ;; + esac + case " $deplibs " in + *" $path "*) ;; + *) deplibs="$deplibs $path" ;; + esac + done + fi # link_all_deplibs != no + fi # linkmode = lib + done # for deplib in $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 + test $pass != scan && dependency_libs="$newdependency_libs" + 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 + case $deplib in + -L*) new_libs="$deplib $new_libs" ;; + *) + 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 + if test "$pass" = "conv" && + { test "$linkmode" = "lib" || test "$linkmode" = "prog"; }; then + libs="$deplibs" # reset libs + deplibs= + fi + done # for pass + if test $linkmode = prog; then + dlfiles="$newdlfiles" + dlprefiles="$newdlprefiles" + fi + + case $linkmode in + oldlib) + 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' 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 libname=\"$libname_spec\" + ;; + *) + if test "$module" = no; then + $echo "$modename: libtool library \`$output' must begin with \`lib'" 1>&2 + $echo "$help" 1>&2 + exit 1 + 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 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 1 + 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. + libext=al + 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' 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 1 + fi + + current="$2" + revision="$3" + age="$4" + + # 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]) ;; + *) + $echo "$modename: CURRENT \`$current' is not a nonnegative integer" 1>&2 + $echo "$modename: \`$vinfo' is not valid version information" 1>&2 + exit 1 + ;; + esac + + case $revision in + 0 | [1-9] | [1-9][0-9] | [1-9][0-9][0-9]) ;; + *) + $echo "$modename: REVISION \`$revision' is not a nonnegative integer" 1>&2 + $echo "$modename: \`$vinfo' is not valid version information" 1>&2 + exit 1 + ;; + esac + + case $age in + 0 | [1-9] | [1-9][0-9] | [1-9][0-9][0-9]) ;; + *) + $echo "$modename: AGE \`$age' is not a nonnegative integer" 1>&2 + $echo "$modename: \`$vinfo' is not valid version information" 1>&2 + exit 1 + ;; + esac + + if test $age -gt $current; then + $echo "$modename: AGE \`$age' is greater than the current interface number \`$current'" 1>&2 + $echo "$modename: \`$vinfo' is not valid version information" 1>&2 + exit 1 + fi + + # Calculate the version variables. + 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="-compatibility_version $minor_current -current_version $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 != 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 != 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 1 + ;; + esac + + # Clear the version info if we defaulted, and they specified a release. + if test -z "$vinfo" && test -n "$release"; then + major= + verstring="0.0" + 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. + $show "${rm}r $output_objdir/$outputname $output_objdir/$libname.* $output_objdir/${libname}${release}.*" + $run ${rm}r $output_objdir/$outputname $output_objdir/$libname.* $output_objdir/${libname}${release}.* + 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*) + # Do not include libc due to us having libc/libc_r. + ;; + *) + # 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 behaviour. + 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 </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 + 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 + 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 below 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 + 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="" + if $echo "X $deplibs" | $Xsed -e 's/ -lc$//' \ + -e 's/ -[LR][^ ]*//g' -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 + + # 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" + eval dep_rpath=\"$hardcode_libdir_flag_spec\" + 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 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 + test -z "$dlname" && dlname=$soname + + lib="$output_objdir/$realname" + for link + do + linknames="$linknames $link" + done + + # Ensure that we have .o objects for linkers which dislike .lo + # (e.g. aix) in case we are running --disable-static + for obj in $libobjs; do + xdir=`$echo "X$obj" | $Xsed -e 's%/[^/]*$%%'` + if test "X$xdir" = "X$obj"; then + xdir="." + else + xdir="$xdir" + fi + baseobj=`$echo "X$obj" | $Xsed -e 's%^.*/%%'` + oldobj=`$echo "X$baseobj" | $Xsed -e "$lo2o"` + if test ! -f $xdir/$oldobj; then + $show "(cd $xdir && ${LN_S} $baseobj $oldobj)" + $run eval '(cd $xdir && ${LN_S} $baseobj $oldobj)' || exit $? + fi + 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 + eval cmds=\"$export_symbols_cmds\" + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" || exit $? + 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 + + if test -n "$convenience"; then + if test -n "$whole_archive_flag_spec"; then + eval libobjs=\"\$libobjs $whole_archive_flag_spec\" + else + gentop="$output_objdir/${outputname}x" + $show "${rm}r $gentop" + $run ${rm}r "$gentop" + $show "mkdir $gentop" + $run mkdir "$gentop" + status=$? + if test $status -ne 0 && test ! -d "$gentop"; then + exit $status + fi + generated="$generated $gentop" + + for xlib in $convenience; do + # Extract the objects. + case $xlib in + [\\/]* | [A-Za-z]:[\\/]*) xabs="$xlib" ;; + *) xabs=`pwd`"/$xlib" ;; + esac + xlib=`$echo "X$xlib" | $Xsed -e 's%^.*/%%'` + xdir="$gentop/$xlib" + + $show "${rm}r $xdir" + $run ${rm}r "$xdir" + $show "mkdir $xdir" + $run mkdir "$xdir" + status=$? + if test $status -ne 0 && test ! -d "$xdir"; then + exit $status + fi + $show "(cd $xdir && $AR x $xabs)" + $run eval "(cd \$xdir && $AR x \$xabs)" || exit $? + + libobjs="$libobjs "`find $xdir -name \*.o -print -o -name \*.lo -print | $NL2SP` + done + 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 -n "$export_symbols" && test -n "$archive_expsym_cmds"; then + eval cmds=\"$archive_expsym_cmds\" + else + save_deplibs="$deplibs" + for conv in $convenience; do + tmp_deplibs= + for test_deplib in $deplibs; do + if test "$test_deplib" != "$conv"; then + tmp_deplibs="$tmp_deplibs $test_deplib" + fi + done + deplibs="$tmp_deplibs" + done + eval cmds=\"$archive_cmds\" + deplibs="$save_deplibs" + fi + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" || 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 $? + exit 0 + 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 1 + 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" + $show "${rm}r $gentop" + $run ${rm}r "$gentop" + $show "mkdir $gentop" + $run mkdir "$gentop" + status=$? + if test $status -ne 0 && test ! -d "$gentop"; then + exit $status + fi + generated="$generated $gentop" + + for xlib in $convenience; do + # Extract the objects. + case $xlib in + [\\/]* | [A-Za-z]:[\\/]*) xabs="$xlib" ;; + *) xabs=`pwd`"/$xlib" ;; + esac + xlib=`$echo "X$xlib" | $Xsed -e 's%^.*/%%'` + xdir="$gentop/$xlib" + + $show "${rm}r $xdir" + $run ${rm}r "$xdir" + $show "mkdir $xdir" + $run mkdir "$xdir" + status=$? + if test $status -ne 0 && test ! -d "$xdir"; then + exit $status + fi + $show "(cd $xdir && $AR x $xabs)" + $run eval "(cd \$xdir && $AR x \$xabs)" || exit $? + + reload_conv_objs="$reload_objs "`find $xdir -name \*.o -print -o -name \*.lo -print | $NL2SP` + done + 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" + eval cmds=\"$reload_cmds\" + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + + # Exit if we aren't doing a library object file. + if test -z "$libobj"; then + if test -n "$gentop"; then + $show "${rm}r $gentop" + $run ${rm}r $gentop + fi + + exit 0 + 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 0 + 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" + eval cmds=\"$reload_cmds\" + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + else + # Just create a symlink. + $show $rm $libobj + $run $rm $libobj + xdir=`$echo "X$libobj" | $Xsed -e 's%/[^/]*$%%'` + if test "X$xdir" = "X$libobj"; then + xdir="." + else + xdir="$xdir" + fi + baseobj=`$echo "X$libobj" | $Xsed -e 's%^.*/%%'` + oldobj=`$echo "X$baseobj" | $Xsed -e "$lo2o"` + $show "(cd $xdir && $LN_S $oldobj $baseobj)" + $run eval '(cd $xdir && $LN_S $oldobj $baseobj)' || exit $? + fi + + if test -n "$gentop"; then + $show "${rm}r $gentop" + $run ${rm}r $gentop + fi + + exit 0 + ;; + + 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 /'` + case $host in + *darwin*) + # Don't allow lazy linking, it breaks C++ global constructors + compile_command="$compile_command ${wl}-bind_at_load" + finalize_command="$finalize_command ${wl}-bind_at_load" + ;; + esac + ;; + esac + + 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*) + case :$dllsearchpath: in + *":$libdir:"*) ;; + *) dllsearchpath="$dllsearchpath:$libdir";; + 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/$output.exp" + $run $rm $export_symbols + $run eval "${SED} -n -e '/^: @PROGRAM@$/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' + else + $run eval "${SED} -e 's/\([][.*^$]\)/\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$output.exp"' + $run eval 'grep -f "$output_objdir/$output.exp" < "$nlist" > "$nlist"T' + $run eval 'mv "$nlist"T "$nlist"' + 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 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. */ +const struct { + 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 -DPIC -DFREEBSD_WORKAROUND";; + esac;; + *-*-hpux*) + case "$compile_command " in + *" -static "*) ;; + *) pic_flag_for_symtable=" $pic_flag -DPIC";; + esac + esac + + # Now compile the dynamic symbol file. + $show "(cd $output_objdir && $CC -c$no_builtin_flag$pic_flag_for_symtable \"$dlsyms\")" + $run eval '(cd $output_objdir && $CC -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. + 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}%"` + ;; + *) + $echo "$modename: unknown suffix for \`$dlsyms'" 1>&2 + exit 1 + ;; + 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" + 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 $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 0 + 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 $0 --fallback-echo"; then + case $0 in + [\\/]* | [A-Za-z]:[\\/]*) qecho="$SHELL $0 --fallback-echo";; + *) qecho="$SHELL `pwd`/$0 --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 ;; + *) exeext= ;; + esac + $rm $output + trap "$rm $output; exit 1" 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. +if test \"\${CDPATH+set}\" = set; then CDPATH=:; export CDPATH; fi + +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 1 + 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 + # win32 systems need to use the prog path for dll + # lookup to work + *-*-cygwin* | *-*-pw32*) + $echo >> $output "\ + exec \$progdir/\$program \${1+\"\$@\"} +" + ;; + + # Backslashes separate directories on plain windows + *-*-mingw | *-*-os2*) + $echo >> $output "\ + exec \$progdir\\\\\$program \${1+\"\$@\"} +" + ;; + + *) + $echo >> $output "\ + # Export the path to the program. + PATH=\"\$progdir:\$PATH\" + export PATH + + exec \$program \${1+\"\$@\"} +" + ;; + esac + $echo >> $output "\ + \$echo \"\$0: cannot exec \$program \${1+\"\$@\"}\" + exit 1 + fi + else + # The program doesn't exist. + \$echo \"\$0: error: \$progdir/\$program does not exist\" 1>&2 + \$echo \"This script is just a wrapper for \$program.\" 1>&2 + echo \"See the $PACKAGE documentation for more information.\" 1>&2 + exit 1 + fi +fi\ +" + chmod +x $output + fi + exit 0 + ;; + esac + + # See if we need to build an old-fashioned archive. + 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="$objs$old_deplibs "`$echo "X$libobjs_save" | $SP2NL | $Xsed -e '/\.'${libext}'$/d' -e '/\.lib$/d' -e "$lo2o" | $NL2SP` + fi + addlibs="$old_convenience" + fi + + if test -n "$addlibs"; then + gentop="$output_objdir/${outputname}x" + $show "${rm}r $gentop" + $run ${rm}r "$gentop" + $show "mkdir $gentop" + $run mkdir "$gentop" + status=$? + if test $status -ne 0 && test ! -d "$gentop"; then + exit $status + fi + generated="$generated $gentop" + + # Add in members from convenience archives. + for xlib in $addlibs; do + # Extract the objects. + case $xlib in + [\\/]* | [A-Za-z]:[\\/]*) xabs="$xlib" ;; + *) xabs=`pwd`"/$xlib" ;; + esac + xlib=`$echo "X$xlib" | $Xsed -e 's%^.*/%%'` + xdir="$gentop/$xlib" + + $show "${rm}r $xdir" + $run ${rm}r "$xdir" + $show "mkdir $xdir" + $run mkdir "$xdir" + status=$? + if test $status -ne 0 && test ! -d "$xdir"; then + exit $status + fi + $show "(cd $xdir && $AR x $xabs)" + $run eval "(cd \$xdir && $AR x \$xabs)" || exit $? + + oldobjs="$oldobjs "`find $xdir -name \*.${objext} -print -o -name \*.lo -print | $NL2SP` + done + fi + + # Do each command in the archive commands. + if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then + eval cmds=\"$old_archive_from_new_cmds\" + else + # Ensure that we have .o objects in place in case we decided + # not to build a shared library, and have fallen back to building + # static libs even though --disable-static was passed! + for oldobj in $oldobjs; do + if test ! -f $oldobj; then + xdir=`$echo "X$oldobj" | $Xsed -e 's%/[^/]*$%%'` + if test "X$xdir" = "X$oldobj"; then + xdir="." + else + xdir="$xdir" + fi + baseobj=`$echo "X$oldobj" | $Xsed -e 's%^.*/%%'` + obj=`$echo "X$baseobj" | $Xsed -e "$o2lo"` + $show "(cd $xdir && ${LN_S} $obj $baseobj)" + $run eval '(cd $xdir && ${LN_S} $obj $baseobj)' || exit $? + fi + done + + eval cmds=\"$old_archive_cmds\" + fi + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + done + + if test -n "$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 $0 --mode=relink $libtool_args @inst_prefix_dir@)" + relink_command=`$echo "X$relink_command" | $Xsed -e "$sed_quote_subst"` + + # 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 1 + 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 1 + 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 1 + fi + newdlprefiles="$newdlprefiles $libdir/$name" + 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) 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 + +# 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 0 + ;; + + # 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" | $Xsed | 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) prev="-f" ;; + -g) prev="-g" ;; + -m) prev="-m" ;; + -o) prev="-o" ;; + -s) + stripme=" -s" + continue + ;; + -*) ;; + + *) + # If the previous option needed an argument, then skip it. + if test -n "$prev"; then + prev= + else + dest="$arg" + continue + fi + ;; + esac + + # Aesthetically quote the argument. + arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*) + arg="\"$arg\"" + ;; + esac + install_prog="$install_prog $arg" + done + + if test -z "$install_prog"; then + $echo "$modename: you must specify an install program" 1>&2 + $echo "$help" 1>&2 + exit 1 + fi + + if test -n "$prev"; then + $echo "$modename: the \`$prev' option requires an argument" 1>&2 + $echo "$help" 1>&2 + exit 1 + fi + + if test -z "$files"; then + if test -z "$dest"; then + $echo "$modename: no file or destination specified" 1>&2 + else + $echo "$modename: you must specify a destination" 1>&2 + fi + $echo "$help" 1>&2 + exit 1 + fi + + # Strip any trailing slash from the destination. + dest=`$echo "X$dest" | $Xsed -e 's%/$%%'` + + # Check to see that the destination is a directory. + test -d "$dest" && isdir=yes + if test "$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 1 + fi + fi + case $destdir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + for file in $files; do + case $file in + *.lo) ;; + *) + $echo "$modename: \`$destdir' must be an absolute directory name" 1>&2 + $echo "$help" 1>&2 + exit 1 + ;; + esac + done + ;; + esac + + # This variable tells wrapper scripts just to set variables rather + # than running their programs. + libtool_install_magic="$magic" + + staticlibs= + future_libdirs= + current_libdirs= + for file in $files; do + + # Do each installation. + case $file in + *.$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 | egrep "^# 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 1 + 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. + if test "$inst_prefix_dir" = "$destdir"; then + $echo "$modename: error: cannot install \`$file' to a directory not ending in $libdir" 1>&2 + exit 1 + 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 1 + 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. + for linkname + do + if test "$linkname" != "$realname"; then + $show "(cd $destdir && $rm $linkname && $LN_S $realname $linkname)" + $run eval "(cd $destdir && $rm $linkname && $LN_S $realname $linkname)" + fi + done + fi + + # Do each command in the postinstall commands. + lib="$destdir/$realname" + eval cmds=\"$postinstall_cmds\" + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + fi + + # Install the pseudo-library for information purposes. + name=`$echo "X$file" | $Xsed -e 's%^.*/%%'` + 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 1 + ;; + esac + + # Install the libtool object if requested. + if test -n "$destfile"; then + $show "$install_prog $file $destfile" + $run eval "$install_prog $file $destfile" || exit $? + fi + + # Install the old object if enabled. + if test "$build_old_libs" = yes; then + # Deduce the name of the old-style object file. + staticobj=`$echo "X$file" | $Xsed -e "$lo2o"` + + $show "$install_prog $staticobj $staticdest" + $run eval "$install_prog \$staticobj \$staticdest" || exit $? + fi + exit 0 + ;; + + *) + # 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 + + # 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 | egrep "^# Generated by .*$PACKAGE")>/dev/null 2>&1; then + notinst_deplibs= + relink_command= + + # If there is no directory component, then add one. + case $file 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 1 + 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= + # If there is no directory component, then add one. + case $file in + */* | *\\*) . $wrapper ;; + *) . ./$wrapper ;; + esac + + outputname= + if test "$fast_install" = no && test -n "$relink_command"; then + if test "$finalize" = yes && test -z "$run"; then + tmpdir="/tmp" + test -n "$TMPDIR" && tmpdir="$TMPDIR" + tmpdir="$tmpdir/libtool-$$" + if $mkdir -p "$tmpdir" && chmod 700 "$tmpdir"; then : + else + $echo "$modename: error: cannot create temporary directory \`$tmpdir'" 1>&2 + continue + fi + file=`$echo "X$file" | $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" | $Xsed -e "s%\([^/]*\)$%$objdir/\1%"` + fi + fi + + # remove .exe since cygwin /usr/bin/install will append another + # one anyways + 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 "$striplib"; then + $show "$old_striplib $oldlib" + $run eval "$old_striplib $oldlib" || exit $? + fi + + # Do each command in the postinstall commands. + eval cmds=\"$old_postinstall_cmds\" + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + done + + if test -n "$future_libdirs"; then + $echo "$modename: warning: remember to run \`$progname --finish$future_libdirs'" 1>&2 + fi + + if test -n "$current_libdirs"; then + # Maybe just do a dry run. + test -n "$run" && current_libdirs=" -n$current_libdirs" + exec_cmd='$SHELL $0 --finish$current_libdirs' + else + exit 0 + 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. + eval cmds=\"$finish_cmds\" + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + $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 0 + + echo "----------------------------------------------------------------------" + 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 "----------------------------------------------------------------------" + exit 0 + ;; + + # libtool execute mode + execute) + modename="$modename: execute" + + # The first argument is the command name. + cmd="$nonopt" + if test -z "$cmd"; then + $echo "$modename: you must specify a COMMAND" 1>&2 + $echo "$help" + exit 1 + fi + + # Handle -dlopen flags immediately. + for file in $execute_dlfiles; do + if test ! -f "$file"; then + $echo "$modename: \`$file' is not a file" 1>&2 + $echo "$help" 1>&2 + exit 1 + fi + + dir= + case $file in + *.la) + # Check to see that this really is a libtool archive. + if (${SED} -e '2q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : + else + $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 + $echo "$help" 1>&2 + exit 1 + fi + + # Read the libtool library. + dlname= + library_names= + + # If there is no directory component, then add one. + case $file in + */* | *\\*) . $file ;; + *) . ./$file ;; + esac + + # Skip this library if it cannot be dlopened. + if test -z "$dlname"; then + # Warn if it was a shared library. + test -n "$library_names" && $echo "$modename: warning: \`$file' was not linked with \`-export-dynamic'" + continue + fi + + dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` + test "X$dir" = "X$file" && dir=. + + if test -f "$dir/$objdir/$dlname"; then + dir="$dir/$objdir" + else + $echo "$modename: cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'" 1>&2 + exit 1 + fi + ;; + + *.lo) + # Just add the directory containing the .lo file. + dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` + test "X$dir" = "X$file" && dir=. + ;; + + *) + $echo "$modename: warning \`-dlopen' is ignored for non-libtool libraries and objects" 1>&2 + continue + ;; + esac + + # Get the absolute pathname. + absdir=`cd "$dir" && pwd` + test -n "$absdir" && dir="$absdir" + + # Now add the directory to shlibpath_var. + if eval "test -z \"\$$shlibpath_var\""; then + eval "$shlibpath_var=\"\$dir\"" + else + eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\"" + fi + done + + # This variable tells wrapper scripts just to set shlibpath_var + # rather than running their programs. + libtool_execute_magic="$magic" + + # Check if any of the arguments is a wrapper script. + args= + for file + do + case $file in + -*) ;; + *) + # Do a test to see if this is really a libtool program. + if (${SED} -e '4q' $file | egrep "^# Generated by .*$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 enviroment 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 0 + 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 1 + fi + + rmdirs= + + for file in $files; do + dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` + if test "X$dir" = "X$file"; then + dir=. + objdir="$objdir" + else + objdir="$dir/$objdir" + 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 | egrep "^# 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" + test $mode = clean && rmfiles="$rmfiles $objdir/$name $objdir/${name}i" + + if test $mode = uninstall; then + if test -n "$library_names"; then + # Do each command in the postuninstall commands. + eval cmds=\"$postuninstall_cmds\" + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" + if test $? != 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. + eval cmds=\"$old_postuninstall_cmds\" + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" + if test $? != 0 && test "$rmforce" != yes; then + exit_status=1 + fi + done + IFS="$save_ifs" + fi + # FIXME: should reinstall the best remaining shared library. + fi + fi + ;; + + *.lo) + if test "$build_old_libs" = yes; then + oldobj=`$echo "X$name" | $Xsed -e "$lo2o"` + rmfiles="$rmfiles $dir/$oldobj" + fi + ;; + + *) + # Do a test to see if this is a libtool program. + if test $mode = clean && + (${SED} -e '4q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + relink_command= + . $dir/$file + + rmfiles="$rmfiles $objdir/$name $objdir/${name}S.${objext}" + if test "$fast_install" = yes && test -n "$relink_command"; then + rmfiles="$rmfiles $objdir/lt-$name" + fi + fi + ;; + esac + $show "$rm $rmfiles" + $run $rm $rmfiles || exit_status=1 + done + + # 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 1 + ;; + esac + + if test -z "$exec_cmd"; then + $echo "$modename: invalid operation mode \`$mode'" 1>&2 + $echo "$generic_help" 1>&2 + exit 1 + fi +fi # test -z "$show_help" + +if test -n "$exec_cmd"; then + eval exec $exec_cmd + exit 1 +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 + --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." + exit 0 + ;; + +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 + -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 1 + ;; +esac + +echo +$echo "Try \`$modename --help' for more information about other modes." + +exit 0 + +# Local Variables: +# mode:shell-script +# sh-indentation:2 +# End: diff --git a/src/WinLibs/FTGL/unix/m4/cxx.m4 b/src/WinLibs/FTGL/unix/m4/cxx.m4 new file mode 100644 index 000000000..8222094ba --- /dev/null +++ b/src/WinLibs/FTGL/unix/m4/cxx.m4 @@ -0,0 +1,29 @@ +dnl FTGL_PROG_CXX() +dnl Check the build plataform and try to use the native compiler +dnl +AC_DEFUN(FTGL_PROG_CXX, +[dnl +AC_CANONICAL_BUILD +AC_CANONICAL_HOST + +dnl I really don't know how to handle the cross-compiling case +if test "$build" = "$host" ; then + case "$build" in + *-*-irix*) + if test -z "$CXX" ; then + CXX=CC + fi + if test -z "$CC" ; then + CC=cc + fi + if test x$CXX = xCC -a -z "$CXXFLAGS" ; then + # It might be worthwhile to move this out of here, say + # EXTRA_CXXFLAGS. Forcing -n32 might cause trouble, too. + CXXFLAGS="-LANG:std -n32 -woff 1201 -O3" + fi + ;; + esac +fi + +AC_PROG_CXX +]) diff --git a/src/WinLibs/FTGL/unix/m4/freetype2.m4 b/src/WinLibs/FTGL/unix/m4/freetype2.m4 new file mode 100644 index 000000000..e5713397d --- /dev/null +++ b/src/WinLibs/FTGL/unix/m4/freetype2.m4 @@ -0,0 +1,112 @@ +# Configure paths for FreeType2 +# Marcelo Magallon 2001-10-26, based on gtk.m4 by Owen Taylor + +dnl AC_CHECK_FT2([MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]]) +dnl Test for FreeType2, and define FT2_CFLAGS and FT2_LIBS +dnl +AC_DEFUN(AC_CHECK_FT2, +[dnl +dnl Get the cflags and libraries from the freetype-config script +dnl +AC_ARG_WITH(freetype-prefix, +[ --with-ft-prefix=PFX Prefix where FreeType is installed (optional)], + ft_config_prefix="$withval", ft_config_prefix="") +AC_ARG_WITH(freetype-exec-prefix, +[ --with-ft-exec-prefix=PFX Exec prefix where FreeType is installed (optional)], + ft_config_exec_prefix="$withval", ft_config_exec_prefix="") +AC_ARG_ENABLE(freetypetest, [ --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 +AC_PATH_PROG(FT2_CONFIG, freetype-config, no) + +min_ft_version=ifelse([$1], ,6.1.0,$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_version=`$FT2_CONFIG $ft_config_args --version` + ft_config_major_version=`echo $ft_config_version | cut -d . -f 1` + ft_config_minor_version=`echo $ft_config_version | cut -d . -f 2` + ft_config_micro_version=`echo $ft_config_version | cut -d . -f 3` + ft_min_major_version=`echo $min_ft_version | cut -d . -f 1` + ft_min_minor_version=`echo $min_ft_version | cut -d . -f 2` + ft_min_micro_version=`echo $min_ft_version | cut -d . -f 3` + if test "x$enable_fttest" = "xyes" ; then + ft_config_version=`expr $ft_config_major_version \* 10000 + $ft_config_minor_version \* 100 + $ft_config_micro_version` + ft_min_version=`expr $ft_min_major_version \* 10000 + $ft_min_minor_version \* 100 + $ft_min_micro_version` + if test $ft_config_version -lt $ft_min_version ; then + ifelse([$3], , :, [$3]) + else + ac_save_CFLAGS="$CFLAGS" + ac_save_LIBS="$LIBS" + CFLAGS="$CFLAGS $FT2_CFLAGS" + LIBS="$FT2_LIBS $LIBS" +dnl +dnl Sanity checks the results of freetype-config to some extent +dnl + AC_TRY_RUN([ +#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 $ac_n "cross compiling; assumed OK... $ac_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) + ifelse([$2], , :, [$2]) +else + AC_MSG_RESULT(no) + if test "$FT2_CONFIG" = "no" ; then + echo "*** The freetype-config script installed by FT2 could not be found" + echo "*** If FT2 was installed in PREFIX, make sure PREFIX/bin is in" + echo "*** your path, or set the FT2_CONFIG environment variable to the" + echo "*** full path to freetype-config." + else + echo "*** The FreeType test program failed to run. If your system uses" + echo "*** shared libraries and they are installed outside the normal" + echo "*** system library path, make sure the variable LD_LIBRARY_PATH" + echo "*** (or whatever is appropiate for your system) is correctly set." + fi + FT2_CFLAGS="" + FT2_LIBS="" + ifelse([$3], , :, [$3]) +fi +AC_SUBST(FT2_CFLAGS) +AC_SUBST(FT2_LIBS) +]) diff --git a/src/WinLibs/FTGL/unix/m4/gl.m4 b/src/WinLibs/FTGL/unix/m4/gl.m4 new file mode 100644 index 000000000..182544dff --- /dev/null +++ b/src/WinLibs/FTGL/unix/m4/gl.m4 @@ -0,0 +1,100 @@ +dnl FTGL_CHECK_GL() +dnl Check for OpenGL development environment and GLU >= 1.2 +dnl +AC_DEFUN([FTGL_CHECK_GL], +[dnl +AC_REQUIRE([AC_PROG_CC]) +AC_REQUIRE([AC_PATH_X]) +AC_REQUIRE([AC_PATH_XTRA]) + +AC_ARG_WITH([--with-gl-inc], + AC_HELP_STRING([--with-gl-inc=DIR],[Directory where GL/gl.h is installed])) +AC_ARG_WITH([--with-gl-lib], + AC_HELP_STRING([--with-gl-lib=DIR],[Directory where OpenGL libraries are installed])) + +AC_LANG_SAVE +AC_LANG_C + +GL_SAVE_CPPFLAGS="$CPPFLAGS" +GL_SAVE_LIBS="$LIBS" + +if test "x$no_x" != xyes ; then + GL_CFLAGS="$X_CFLAGS" + GL_X_LIBS="$X_PRE_LIBS $X_LIBS -lX11 -lXext -lXmu $X_EXTRA_LIBS" +fi + +if test "x$with_gl_inc" != "xnone" ; then + if test -d "$with_gl_inc" ; then + GL_CFLAGS="-I$with_gl_inc" + else + GL_CFLAGS="$with_gl_inc" + fi +else + GL_CFLAGS= +fi + +CPPFLAGS="$GL_CFLAGS" +AC_CHECK_HEADER([GL/gl.h], [], [AC_MSG_ERROR(GL/gl.h is needed, please specify its location with --with-gl-inc. If this still fails, please contact mmagallo@debian.org, include the string FTGL somewhere in the subject line and provide a copy of the config.log file that was left behind.)]) + +AC_MSG_CHECKING([for GL library]) +if test "x$with_gl_lib" != "x" ; then + if test -d "$with_gl_lib" ; then + LIBS="-L$with_gl_lib -lGL" + else + LIBS="$with_gl_lib" + fi +else + LIBS="-lGL" +fi +AC_LINK_IFELSE([AC_LANG_CALL([],[glBegin])],[HAVE_GL=yes], [HAVE_GL=no]) +if test "x$HAVE_GL" = xno ; then + if test "x$GL_X_LIBS" != x ; then + LIBS="-lGL $GL_X_LIBS" + AC_LINK_IFELSE([AC_LANG_CALL([],[glBegin])],[HAVE_GL=yes], [HAVE_GL=no]) + fi +fi +if test "x$HAVE_GL" = xyes ; then + AC_MSG_RESULT([yes]) + GL_LIBS=$LIBS +else + AC_MSG_RESULT([no]) + AC_MSG_ERROR([GL library could not be found, please specify its location with --with-gl-lib. If this still fails, please contact mmagallo@debian.org, include the string FTGL somewhere in the subject line and provide a copy of the config.log file that was left behind.]) +fi + +AC_CHECK_HEADER([GL/glu.h]) +AC_MSG_CHECKING([for GLU version >= 1.2]) +AC_TRY_COMPILE([#include ], [ +#if !defined(GLU_VERSION_1_2) +#error GLU too old +#endif + ], + [AC_MSG_RESULT([yes])], + [AC_MSG_RESULT([no]) + AC_MSG_ERROR([GLU >= 1.2 is needed to compile this library]) + ]) + +AC_MSG_CHECKING([for GLU library]) +LIBS="-lGLU $GL_LIBS" +AC_LINK_IFELSE([AC_LANG_CALL([],[gluNewTess])],[HAVE_GLU=yes], [HAVE_GLU=no]) +if test "x$HAVE_GLU" = xno ; then + if test "x$GL_X_LIBS" != x ; then + LIBS="-lGLU $GL_LIBS $GL_X_LIBS" + AC_LINK_IFELSE([AC_LANG_CALL([],[gluNewTess])],[HAVE_GLU=yes], [HAVE_GLU=no]) + fi +fi +if test "x$HAVE_GLU" = xyes ; then + AC_MSG_RESULT([yes]) + GL_LIBS="$LIBS" +else + AC_MSG_RESULT([no]) + AC_MSG_ERROR([GLU library could not be found, please specify its location with --with-gl-lib. If this still fails, please contact mmagallo@debian.org, include the string FTGL somewhere in the subject line and provide a copy of the config.log file that was left behind.]) +fi + +AC_SUBST(GL_CFLAGS) +AC_SUBST(GL_LIBS) + +CPPFLAGS="$GL_SAVE_CPPFLAGS" +LIBS="$GL_SAVE_LIBS" +AC_LANG_RESTORE +GL_X_LIBS="" +]) diff --git a/src/WinLibs/FTGL/unix/m4/glut.m4 b/src/WinLibs/FTGL/unix/m4/glut.m4 new file mode 100644 index 000000000..5a657766c --- /dev/null +++ b/src/WinLibs/FTGL/unix/m4/glut.m4 @@ -0,0 +1,100 @@ +dnl FTGL_CHECK_GLUT() +dnl Check for GLUT development environment +dnl +AC_DEFUN([FTGL_CHECK_GLUT], +[dnl +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_PATH_X])dnl +AC_REQUIRE([AC_PATH_XTRA])dnl +AC_REQUIRE([FTGL_CHECK_GL])dnl + +AC_ARG_WITH([--with-glut-inc], + AC_HELP_STRING([--with-glut-inc=DIR],[Directory where GL/glut.h is installed (optional)])) +AC_ARG_WITH([--with-glut-lib], + AC_HELP_STRING([--with-glut-lib=DIR],[Directory where GLUT libraries are installed (optional)])) + +AC_LANG_SAVE +AC_LANG_C + +GLUT_SAVE_CPPFLAGS="$CPPFLAGS" +GLUT_SAVE_LIBS="$LIBS" + +if test "x$no_x" != xyes ; then + GLUT_CFLAGS="$X_CFLAGS" + GLUT_X_LIBS="$X_PRE_LIBS $X_LIBS -lX11 -lXext -lXmu $X_EXTRA_LIBS" +fi + +if test "x$with_glut_inc" != "xnone" ; then + if test -d "$with_glut_inc" ; then + GLUT_CFLAGS="-I$with_glut_inc" + else + GLUT_CFLAGS="$with_glut_inc" + fi +else + GLUT_CFLAGS= +fi + +CPPFLAGS="$GLUT_CFLAGS" +AC_CHECK_HEADER([GL/glut.h], [HAVE_GLUT=yes], [HAVE_GLUT=no]) + +if test "x$HAVE_GLUT" = xno ; then + AC_MSG_WARN([GLUT headers not availabe, example program won't be compiled.]) +else + +# Check for GLUT libraries + + AC_MSG_CHECKING([for GLUT library]) + if test "x$with_glut_lib" != "x" ; then + if test -d "$with_glut_lib" ; then + LIBS="-L$with_glut_lib -lglut" + else + LIBS="$with_glut_lib" + fi + else + LIBS="-lglut" + fi + AC_LINK_IFELSE( + [AC_LANG_CALL([],[glutInit])], + [HAVE_GLUT=yes], + [HAVE_GLUT=no]) + + if test "x$HAVE_GLUT" = xno ; then + # Try again with the GL libs + LIBS="-lglut $GL_LIBS" + AC_LINK_IFELSE( + [AC_LANG_CALL([],[glutInit])], + [HAVE_GLUT=yes], + [HAVE_GLUT=no]) + fi + + if test "x$HAVE_GLUT" = xno && test "x$GLUT_X_LIBS" != x ; then + # Try again with the GL and X11 libs + LIBS="-lglut $GL_LIBS $GLUT_X_LIBS" + AC_LINK_IFELSE( + [AC_LANG_CALL([],[glutInit])], + [HAVE_GLUT=yes], + [HAVE_GLUT=no]) + fi + + if test "x$HAVE_GLUT" = xyes ; then + AC_MSG_RESULT([yes]) + GLUT_LIBS=$LIBS + else + AC_MSG_RESULT([no]) + AC_MSG_WARN([GLUT libraries not availabe, example program won't be compiled.]) + fi + +# End check for GLUT libraries + +fi + +AC_SUBST(HAVE_GLUT) +AC_SUBST(GLUT_CFLAGS) +AC_SUBST(GLUT_LIBS) +AC_LANG_RESTORE + +CPPFLAGS="$GLUT_SAVE_CPPFLAGS" +LIBS="$GLUT_SAVE_LIBS" +GLUT_X_CFLAGS= +GLUT_X_LIBS= +]) diff --git a/src/WinLibs/FTGL/unix/src/Makefile b/src/WinLibs/FTGL/unix/src/Makefile new file mode 100644 index 000000000..64b86122e --- /dev/null +++ b/src/WinLibs/FTGL/unix/src/Makefile @@ -0,0 +1,89 @@ +top_srcdir=../.. +VPATH=$(top_srcdir)/src +top_builddir=.. +-include $(top_builddir)/Make.conf + +TARGET = libftgl.la + +all: $(TARGET) + +SRCS = \ + FTBitmapGlyph.cpp \ + FTCharmap.cpp \ + FTContour.cpp \ + FTExtrdGlyph.cpp \ + FTFace.cpp \ + FTFont.cpp \ + FTGLBitmapFont.cpp \ + FTGLExtrdFont.cpp \ + FTGLOutlineFont.cpp \ + FTGLPixmapFont.cpp \ + FTGLPolygonFont.cpp \ + FTGLTextureFont.cpp \ + FTGlyph.cpp \ + FTGlyphContainer.cpp \ + FTLibrary.cpp \ + FTOutlineGlyph.cpp \ + FTPixmapGlyph.cpp \ + FTPoint.cpp \ + FTPolyGlyph.cpp \ + FTSize.cpp \ + FTTextureGlyph.cpp \ + FTVectoriser.cpp + +HEADERS = \ + FTBBox.h \ + FTBitmapGlyph.h \ + FTCharToGlyphIndexMap.h \ + FTCharmap.h \ + FTContour.h \ + FTExtrdGlyph.h \ + FTFace.h \ + FTFont.h \ + FTGL.h \ + FTGLBitmapFont.h \ + FTGLExtrdFont.h \ + FTGLOutlineFont.h \ + FTGLPixmapFont.h \ + FTGLPolygonFont.h \ + FTGLTextureFont.h \ + FTGlyph.h \ + FTGlyphContainer.h \ + FTLibrary.h \ + FTList.h \ + FTOutlineGlyph.h \ + FTPixmapGlyph.h \ + FTPoint.h \ + FTPolyGlyph.h \ + FTSize.h \ + FTTextureGlyph.h \ + FTVector.h \ + FTVectoriser.h + +HEADER_FILES = $(addprefix $(top_srcdir)/include/,$(HEADERS)) + +LOBJS = $(patsubst %.cpp,%.lo,$(SRCS)) +OBJS = $(patsubst %.cpp,%.$(OBJEXT),$(SRCS)) + +ALL_OBJS = $(LOBJS) $(OBJS) + +CXXFLAGS += $(FT2_CFLAGS) $(GL_CFLAGS) +LIBS += $(FT2_LIBS) $(GL_LIBS) + +libftgl.la: $(LOBJS) + +install-local: libftgl.la + $(INSTALL) -d -m 0755 $(libdir) + $(LIBTOOL) --mode=install $(INSTALL) -m 0644 $(TARGET) $(libdir) + $(INSTALL) -d -m 0755 $(includedir)/FTGL + $(INSTALL) -m 0644 $(HEADER_FILES) $(includedir)/FTGL + + +clean-local: + $(RM) $(ALL_OBJS) + +distclean-local: + $(RM) $(TARGET) + $(RM) -r .libs ii_files + +include $(top_builddir)/Make.rules diff --git a/src/WinLibs/FTGL/win32_vcpp/README_WIN32.txt b/src/WinLibs/FTGL/win32_vcpp/README_WIN32.txt new file mode 100644 index 000000000..1001e54af --- /dev/null +++ b/src/WinLibs/FTGL/win32_vcpp/README_WIN32.txt @@ -0,0 +1,206 @@ +FTGL 1.31 + +NOTES FOR COMPILING ON WINDOWS + +14 Feb 2002 + +Ellers, ellers@iinet.net.au + + + + + +SUPPORTED COMPILERS + + + +I have rebuilt the FTGL project files for Visual C++ (version 6). There are + +presently no other compilers or environments supported but feel free to + +contribute them. + + + + + +QUICK GUIDE: COMPILING FTGL + + + + - Start up MSVC++ with ftgl.dsw. + + - Tell MSVC++ where FreeType is. You'll need to do something like this: + + + + * select Project>Settings + + * select ftgl_static (for a start) + + * select "All Configurations" + + * go to the tab C++ > PreProcessor + + * Set additional include directories appropriately. For me it is: + + D:\cots\freetype-2.0.5\include + + * repeat for all configurations of ftgl_dll + + + + + +QUICK GUIDE: COMPILING/RUNNING SUPPLIED DEMO PROGRAM + + + + - The program expects the first argument to be the name of a truetype file. + + I copied timesbi.ttf from the windows directory to C:\TEMP and then edit + + the settings of the project: + + + + * select Project>Settings + + * select Demo project + + * select panel Debug>General + + * set Program Arguments to be "C:\TEMP\timesbi.ttf" + + + + + +QUICK GUIDE: COMPILING YOUR PROGRAM TO USE FTGL + + + + - Choose dynamic or static library linkage + + * if you want to link to a static FTGL library ensure that + + FTGL_LIBRARY_STATIC is defined in the preprocessor section + + + + + +CONFIGURATION / CODE GENERATION / C LIBRARIES + + + +FTGL can be built in various configurations (inspired by Freetype and libpng): + + + + - static library (.lib) + + - dynamic library (.dll) + + + +MSVC++ requires selection of "code generation" option, which seems to be + +mostly to do with which version of the Standard C library is linked with the + +library. + + + +The following modes are supported: + + + + - static/dynamic + + - single threaded (ST) or multithreaded (MT) + + NOTE: the multithreaded DLL (MD) mode was NOT included, as freetype itself + + doesn't support that mode so I figure there's no point yet. + + - debug/release (debug has _d suffix) + + + +So the static multithreaded release library is: + + + + ftgl_static_MT.lib + + + +The same library built in DEBUG mode: + + + + ftgl_static_MT_d.lib + + + +If you're not sure which one is appropriate (and if you're a novice don't + +been too put off...) start with making the decision about debug or release. + +This should be easy because if you're building the debug version of your + +app its probably a good idea to link with the debug version of FTGL (but + +not compulsory). Once thats done, you may get errors like: + + + + LIBCMTD.lib(crt0init.obj) : warning LNK4098: defaultlib "libcmt.lib" conflicts with use of other libs; use /NODEFAULTLIB:library + + + +This will happen, for example, when you link a glut app with an FTGL library + +compiled with different codegen options than the GLUT library. + + + +MSVC++ "sort of" + +requires that all libs be linked with the same codegen option. GLUT is built + +in XXX mode, so if you're linking with GLUT, you can get rid of the warning + +by linking with the XXX version of FTGL. The various versions are particularly + +useful if you're doing std C stuff, like printf etc. + + + + + + + +FAQ + + + +Q: "But... do I HAVE to use all these DIFFERENT build modes, like multi- + + threaded, debug single threaded, etc?" + + + +A: No. Sometimes library makers only generate one style anyway. It depends + + on your needs. Unless you're linking with standard C stuff (e.g. printf) + + then it probably won't make a great deal of difference. If you get + + warnings about "default lib libcmt.lib conflicts" etc, then you can make + + use of the different libraries. + + + diff --git a/src/WinLibs/FTGL/win32_vcpp/build/ftgl_static_MT_d.lib b/src/WinLibs/FTGL/win32_vcpp/build/ftgl_static_MT_d.lib new file mode 100644 index 0000000000000000000000000000000000000000..6931f8f71ce2149a8e5762c8f4c751e4d6107341 GIT binary patch literal 752982 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⪚lDcv*u$b6_fj&Qi{_@g!@WKJ@oN2UpY(h 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 fHTA!dJJxZp=ab8)5(>u=4|sT7MA315N$ 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 + 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/src/WinLibs/freetype-2.3.5/builds/mac/ftmac.c b/src/WinLibs/freetype-2.3.5/builds/mac/ftmac.c new file mode 100644 index 000000000..445ff9a4e --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/builds/mac/ftmac.c @@ -0,0 +1,1566 @@ +/***************************************************************************/ +/* */ +/* 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 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_INTERNAL_STREAM_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 +#else +#include +#include +#include +#include +#include +#include +#endif + +#if defined( __MWERKS__ ) && !TARGET_RT_MAC_MACHO +#include +#endif + +#define FT_DEPRECATED_ATTRIBUTE + +#include FT_MAC_H + +#undef FT_GetFile_From_Mac_Name +#undef FT_GetFile_From_Mac_ATS_Name +#undef FT_New_Face_From_FSSpec + + + /* 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 + +#ifndef HFS_MAXPATHLEN +#define HFS_MAXPATHLEN 1024 +#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 +#else +#define HAVE_ATS 0 +#endif +#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, */ + /* but for some reason, there is no FSRef version of */ + /* ATSFontGetFileSpecification(), so we made our own. */ + /* Apple will provide one eventually. */ + static OSStatus + FT_ATSFontGetFileReference( ATSFontRef ats_font_id, + FSRef* ats_font_ref ) + { + OSStatus err; + FSSpec spec; + + + err = ATSFontGetFileSpecification( ats_font_id, &spec ); + if ( noErr == err ) + err = FSpMakeFSRef( &spec, ats_font_ref ); + + 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 + + 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 + + static OSErr + FT_FSPathMakeSpec( const UInt8* pathname, + FSSpec* spec_p, + Boolean isDirectory ) + { + const char *p, *q; + short vRefNum; + long dirID; + Str255 nodeName; + OSErr err; + + + 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, + short* 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, + short* 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; + + /* 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[0] > 1 ) + { + unsigned char* suffixes = names[style->indexes[0] - 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 ) + { + short sfnt_id; + short have_sfnt, have_lwfn; + Str255 lwfn_file_name; + UInt8 buff[HFS_MAXPATHLEN]; + 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, + short res, + FT_Byte** pfb_data, + FT_ULong* size ) + { + FT_Error error = FT_Err_Ok; + short 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( '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( '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; + } + + + /* Finalizer for a memory stream; gets called by FT_Done_Face(). + It frees the memory it uses. */ + 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. */ + 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. */ + static FT_Error + open_face_from_buffer( FT_Library library, + FT_Byte* base, + FT_ULong size, + FT_Long face_index, + char* driver_name, + FT_Face* aface ) + { + FT_Open_Args args; + FT_Error error; + FT_Stream stream; + 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 ); + } + + /* 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; + + error = FT_Open_Face( library, &args, face_index, aface ); + if ( error == FT_Err_Ok ) + (*aface)->face_flags &= ~FT_FACE_FLAG_EXTERNAL_STREAM; + else + FT_Stream_Free( stream, 0 ); + + 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; + short 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, + short 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; + + + sfnt = GetResource( 'sfnt', sfnt_id ); + if ( ResError() ) + 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 && sfnt_data[0] == 'O' && + sfnt_data[1] == 'T' && + sfnt_data[2] == 'T' && + sfnt_data[3] == 'O'; + + return open_face_from_buffer( library, + sfnt_data, + sfnt_size, + face_index, + is_cff ? "cff" : "truetype", + aface ); + } + + + /* 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; + short res_ref, 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( '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 sfnt_id, have_sfnt, have_lwfn = 0; + short fond_id; + OSType fond_type; + Str255 fond_name; + Str255 lwfn_file_name; + UInt8 path_lwfn[HFS_MAXPATHLEN]; + OSErr err; + FT_Error error = FT_Err_Ok; + + + GetResInfo( fond, &fond_id, &fond_type, fond_name ); + if ( ResError() != noErr || fond_type != '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] ) + { + short res; + + + res = HomeResFile( fond ); + if ( noErr != ResError() ) + goto found_no_lwfn_file; + +#if HAVE_FSREF + + { + UInt8 path_fond[HFS_MAXPATHLEN]; + 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[HFS_MAXPATHLEN]; + 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 == '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. */ + /* */ + 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[HFS_MAXPATHLEN]; + + + 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. */ + /* */ + 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[HFS_MAXPATHLEN]; + + + 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/src/WinLibs/freetype-2.3.5/builds/modules.mk b/src/WinLibs/freetype-2.3.5/builds/modules.mk new file mode 100644 index 000000000..5f1f9ee94 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/builds/modules.mk @@ -0,0 +1,79 @@ +# +# FreeType 2 modules sub-Makefile +# + + +# 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. + + +# 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 /,\,$(FTMODULE_H)) + REMOVE_MODULE := @-$(DELETE) $(subst /,\,$(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/src/WinLibs/freetype-2.3.5/builds/newline b/src/WinLibs/freetype-2.3.5/builds/newline new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/builds/newline @@ -0,0 +1 @@ + diff --git a/src/WinLibs/freetype-2.3.5/builds/os2/detect.mk b/src/WinLibs/freetype-2.3.5/builds/os2/detect.mk new file mode 100644 index 000000000..47a40a2f8 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/builds/os2/os2-def.mk b/src/WinLibs/freetype-2.3.5/builds/os2/os2-def.mk new file mode 100644 index 000000000..01cda9285 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/builds/os2/os2-dev.mk b/src/WinLibs/freetype-2.3.5/builds/os2/os2-dev.mk new file mode 100644 index 000000000..83da8dea3 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/builds/os2/os2-gcc.mk b/src/WinLibs/freetype-2.3.5/builds/os2/os2-gcc.mk new file mode 100644 index 000000000..446073e4f --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/builds/toplevel.mk b/src/WinLibs/freetype-2.3.5/builds/toplevel.mk new file mode 100644 index 000000000..d5ca530a3 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/builds/toplevel.mk @@ -0,0 +1,245 @@ +# +# FreeType build system -- top-level sub-Makefile +# + + +# Copyright 1996-2000, 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 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. + + +.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]\+\)/\1/p' < $(FT_H)) + minor := $(shell sed -n 's/.*FREETYPE_MINOR.*\([0-9]\+\)/\1/p' < $(FT_H)) + patch := $(shell sed -n 's/.*FREETYPE_PATCH.*\([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 '*/CVS' -prune \ + -o -type f \ + -o -print` ; do \ + mkdir -p tmp/$$d ; \ + done ; + + currdir=`pwd` ; \ + for f in `find . -wholename '*/CVS' -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 -c > freetype-$(version).tar.gz + tar cfh - freetype-$(version) \ + | bzip2 -c > freetype-$(version).tar.bz2 + + @# Use CR/LF for zip files. + zip -lr 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 = ../../../config/config.guess +CONFIG_SUB = ../../../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/src/WinLibs/freetype-2.3.5/builds/unix/config.guess b/src/WinLibs/freetype-2.3.5/builds/unix/config.guess new file mode 100644 index 000000000..951383e35 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/builds/unix/config.guess @@ -0,0 +1,1516 @@ +#! /bin/sh +# Attempt to guess a canonical system name. +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, +# 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, +# Inc. + +timestamp='2007-05-17' + +# 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., 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. + + +# Originally written by Per Bothner . +# Please send patches to . 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 ." + +version="\ +GNU config.guess ($timestamp) + +Originally written by Per Bothner. +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 +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 ;; + --version | -v ) + echo "$version" ; exit ;; + --help | --h* | -h ) + echo "$usage"; exit ;; + -- ) # 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 "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || + { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || + { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || + { 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 ; set_cc_for_build= ;' + +# 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 ;; + sh5el) machine=sh5le-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 ;; + *:OpenBSD:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` + echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} + exit ;; + *:ekkoBSD:*:*) + echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} + exit ;; + *:SolidBSD:*:*) + echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} + exit ;; + macppc:MirBSD:*:*) + echo powerpc-unknown-mirbsd${UNAME_RELEASE} + exit ;; + *:MirBSD:*:*) + echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} + exit ;; + alpha:OSF1:*:*) + case $UNAME_RELEASE in + *4.0) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` + ;; + *5.*) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` + ;; + esac + # 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 Pn.n version is a patched version. + # 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/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + exit ;; + Alpha\ *:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # Should we change UNAME_MACHINE based on the output of uname instead + # of the specific Alpha model? + echo alpha-pc-interix + exit ;; + 21064:Windows_NT:50:3) + echo alpha-dec-winnt3.5 + exit ;; + Amiga*:UNIX_System_V:4.0:*) + echo m68k-unknown-sysv4 + exit ;; + *:[Aa]miga[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-amigaos + exit ;; + *:[Mm]orph[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-morphos + exit ;; + *:OS/390:*:*) + echo i370-ibm-openedition + exit ;; + *:z/VM:*:*) + echo s390-ibm-zvmoe + exit ;; + *:OS400:*:*) + echo powerpc-ibm-os400 + exit ;; + arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) + echo arm-acorn-riscix${UNAME_RELEASE} + exit ;; + arm:riscos:*:*|arm:RISCOS:*:*) + echo arm-unknown-riscos + exit ;; + SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) + echo hppa1.1-hitachi-hiuxmpp + exit ;; + 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 ;; + NILE*:*:*:dcosx) + echo pyramid-pyramid-svr4 + exit ;; + DRS?6000:unix:4.0:6*) + echo sparc-icl-nx6 + exit ;; + DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) + case `/usr/bin/uname -p` in + sparc) echo sparc-icl-nx7; exit ;; + esac ;; + sun4H:SunOS:5.*:*) + echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) + echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + i86pc:SunOS:5.*:* | ix86xen:SunOS:5.*:*) + echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + 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 ;; + 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 ;; + sun3*:SunOS:*:*) + echo m68k-sun-sunos${UNAME_RELEASE} + exit ;; + 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 ;; + aushp:SunOS:*:*) + echo sparc-auspex-sunos${UNAME_RELEASE} + exit ;; + # 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 ;; + atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) + echo m68k-milan-mint${UNAME_RELEASE} + exit ;; + hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) + echo m68k-hades-mint${UNAME_RELEASE} + exit ;; + *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) + echo m68k-unknown-mint${UNAME_RELEASE} + exit ;; + m68k:machten:*:*) + echo m68k-apple-machten${UNAME_RELEASE} + exit ;; + powerpc:machten:*:*) + echo powerpc-apple-machten${UNAME_RELEASE} + exit ;; + RISC*:Mach:*:*) + echo mips-dec-mach_bsd4.3 + exit ;; + RISC*:ULTRIX:*:*) + echo mips-dec-ultrix${UNAME_RELEASE} + exit ;; + VAX*:ULTRIX*:*:*) + echo vax-dec-ultrix${UNAME_RELEASE} + exit ;; + 2020:CLIX:*:* | 2430:CLIX:*:*) + echo clipper-intergraph-clix${UNAME_RELEASE} + exit ;; + mips:*:*:UMIPS | mips:*:*:RISCos) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c +#ifdef __cplusplus +#include /* 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 && + dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && + SYSTEM_NAME=`$dummy $dummyarg` && + { echo "$SYSTEM_NAME"; exit; } + echo mips-mips-riscos${UNAME_RELEASE} + exit ;; + Motorola:PowerMAX_OS:*:*) + echo powerpc-motorola-powermax + exit ;; + Motorola:*:4.3:PL8-*) + echo powerpc-harris-powermax + exit ;; + Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) + echo powerpc-harris-powermax + exit ;; + Night_Hawk:Power_UNIX:*:*) + echo powerpc-harris-powerunix + exit ;; + m88k:CX/UX:7*:*) + echo m88k-harris-cxux7 + exit ;; + m88k:*:4*:R4*) + echo m88k-motorola-sysv4 + exit ;; + m88k:*:3*:R3*) + echo m88k-motorola-sysv3 + exit ;; + 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 ;; + M88*:DolphinOS:*:*) # DolphinOS (SVR3) + echo m88k-dolphin-sysv3 + exit ;; + M88*:*:R3*:*) + # Delta 88k system running SVR3 + echo m88k-motorola-sysv3 + exit ;; + XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) + echo m88k-tektronix-sysv3 + exit ;; + Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) + echo m68k-tektronix-bsd + exit ;; + *:IRIX*:*:*) + echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` + exit ;; + ????????: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 ;; # Note that: echo "'`uname -s`'" gives 'AIX ' + i*86:AIX:*:*) + echo i386-ibm-aix + exit ;; + 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 ;; + *: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 + + main() + { + if (!__power_pc()) + exit(1); + puts("powerpc-ibm-aix3.2.5"); + exit(0); + } +EOF + if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` + then + echo "$SYSTEM_NAME" + else + echo rs6000-ibm-aix3.2.5 + fi + 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 ;; + *: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 ;; + *:AIX:*:*) + echo rs6000-ibm-aix + exit ;; + ibmrt:4.4BSD:*|romp-ibm:BSD:*) + echo romp-ibm-bsd4.4 + exit ;; + ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and + echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to + exit ;; # report: romp-ibm BSD 4.3 + *:BOSX:*:*) + echo rs6000-bull-bosx + exit ;; + DPX/2?00:B.O.S.:*:*) + echo m68k-bull-sysv3 + exit ;; + 9000/[34]??:4.3bsd:1.*:*) + echo m68k-hp-bsd + exit ;; + hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) + echo m68k-hp-bsd4.4 + exit ;; + 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 + #include + + 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 + eval $set_cc_for_build + + # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating + # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler + # generating 64-bit code. GNU and HP use different nomenclature: + # + # $ CC_FOR_BUILD=cc ./config.guess + # => hppa2.0w-hp-hpux11.23 + # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess + # => hppa64-hp-hpux11.23 + + if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | + grep __LP64__ >/dev/null + then + HP_ARCH="hppa2.0w" + else + HP_ARCH="hppa64" + fi + fi + echo ${HP_ARCH}-hp-hpux${HPUX_REV} + exit ;; + ia64:HP-UX:*:*) + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + echo ia64-hp-hpux${HPUX_REV} + exit ;; + 3050*:HI-UX:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include + 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 && SYSTEM_NAME=`$dummy` && + { echo "$SYSTEM_NAME"; exit; } + echo unknown-hitachi-hiuxwe2 + exit ;; + 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) + echo hppa1.1-hp-bsd + exit ;; + 9000/8??:4.3bsd:*:*) + echo hppa1.0-hp-bsd + exit ;; + *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) + echo hppa1.0-hp-mpeix + exit ;; + hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) + echo hppa1.1-hp-osf + exit ;; + hp8??:OSF1:*:*) + echo hppa1.0-hp-osf + exit ;; + i*86:OSF1:*:*) + if [ -x /usr/sbin/sysversion ] ; then + echo ${UNAME_MACHINE}-unknown-osf1mk + else + echo ${UNAME_MACHINE}-unknown-osf1 + fi + exit ;; + parisc*:Lites*:*:*) + echo hppa1.1-hp-lites + exit ;; + C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) + echo c1-convex-bsd + exit ;; + C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit ;; + C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) + echo c34-convex-bsd + exit ;; + C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) + echo c38-convex-bsd + exit ;; + C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) + echo c4-convex-bsd + exit ;; + CRAY*Y-MP:*:*:*) + echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + 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 ;; + CRAY*TS:*:*:*) + echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*T3E:*:*:*) + echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*SV1:*:*:*) + echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + *:UNICOS/mp:*:*) + echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + 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 ;; + 5000:UNIX_System_V:4.*:*) + FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` + echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit ;; + i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) + echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} + exit ;; + sparc*:BSD/OS:*:*) + echo sparc-unknown-bsdi${UNAME_RELEASE} + exit ;; + *:BSD/OS:*:*) + echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} + exit ;; + *:FreeBSD:*:*) + case ${UNAME_MACHINE} in + pc98) + echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + amd64) + echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + *) + echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + esac + exit ;; + i*:CYGWIN*:*) + echo ${UNAME_MACHINE}-pc-cygwin + exit ;; + *:MINGW*:*) + echo ${UNAME_MACHINE}-pc-mingw32 + exit ;; + i*:windows32*:*) + # uname -m includes "-pc" on this system. + echo ${UNAME_MACHINE}-mingw32 + exit ;; + i*:PW*:*) + echo ${UNAME_MACHINE}-pc-pw32 + exit ;; + *:Interix*:[3456]*) + case ${UNAME_MACHINE} in + x86) + echo i586-pc-interix${UNAME_RELEASE} + exit ;; + EM64T | authenticamd) + echo x86_64-unknown-interix${UNAME_RELEASE} + exit ;; + esac ;; + [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) + echo i${UNAME_MACHINE}-pc-mks + exit ;; + i*:Windows_NT*:* | Pentium*:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we + # UNAME_MACHINE based on the output of uname instead of i386? + echo i586-pc-interix + exit ;; + i*:UWIN*:*) + echo ${UNAME_MACHINE}-pc-uwin + exit ;; + amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) + echo x86_64-unknown-cygwin + exit ;; + p*:CYGWIN*:*) + echo powerpcle-unknown-cygwin + exit ;; + prep*:SunOS:5.*:*) + echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + *:GNU:*:*) + # the GNU system + echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` + exit ;; + *:GNU/*:*:*) + # other systems with GNU libc and userland + echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu + exit ;; + i*86:Minix:*:*) + echo ${UNAME_MACHINE}-pc-minix + exit ;; + arm*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + avr32*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + cris:Linux:*:*) + echo cris-axis-linux-gnu + exit ;; + crisv32:Linux:*:*) + echo crisv32-axis-linux-gnu + exit ;; + frv:Linux:*:*) + echo frv-unknown-linux-gnu + exit ;; + ia64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + m32r*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + m68*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + 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 | sed -n ' + /^CPU/{ + s: ::g + p + }'`" + test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } + ;; + 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 | sed -n ' + /^CPU/{ + s: ::g + p + }'`" + test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } + ;; + or32:Linux:*:*) + echo or32-unknown-linux-gnu + exit ;; + ppc:Linux:*:*) + echo powerpc-unknown-linux-gnu + exit ;; + ppc64:Linux:*:*) + echo powerpc64-unknown-linux-gnu + exit ;; + 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 ;; + 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 ;; + parisc64:Linux:*:* | hppa64:Linux:*:*) + echo hppa64-unknown-linux-gnu + exit ;; + s390:Linux:*:* | s390x:Linux:*:*) + echo ${UNAME_MACHINE}-ibm-linux + exit ;; + sh64*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + sh*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + sparc:Linux:*:* | sparc64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + vax:Linux:*:*) + echo ${UNAME_MACHINE}-dec-linux-gnu + exit ;; + x86_64:Linux:*:*) + echo x86_64-unknown-linux-gnu + exit ;; + xtensa:Linux:*:*) + echo xtensa-unknown-linux-gnu + exit ;; + 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 ;; + coff-i386) + echo "${UNAME_MACHINE}-pc-linux-gnucoff" + exit ;; + "") + # 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 ;; + esac + # Determine whether the default compiler is a.out or elf + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include + #ifdef __ELF__ + # ifdef __GLIBC__ + # if __GLIBC__ >= 2 + LIBC=gnu + # else + LIBC=gnulibc1 + # endif + # else + LIBC=gnulibc1 + # endif + #else + #if defined(__INTEL_COMPILER) || defined(__PGI) || defined(__SUNPRO_C) || defined(__SUNPRO_CC) + LIBC=gnu + #else + LIBC=gnuaout + #endif + #endif + #ifdef __dietlibc__ + LIBC=dietlibc + #endif +EOF + eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' + /^LIBC/{ + s: ::g + p + }'`" + test x"${LIBC}" != x && { + echo "${UNAME_MACHINE}-pc-linux-${LIBC}" + exit + } + test x"${TENTATIVE}" != x && { echo "${TENTATIVE}"; exit; } + ;; + 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 ;; + 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 ;; + 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 ;; + i*86:XTS-300:*:STOP) + echo ${UNAME_MACHINE}-unknown-stop + exit ;; + i*86:atheos:*:*) + echo ${UNAME_MACHINE}-unknown-atheos + exit ;; + i*86:syllable:*:*) + echo ${UNAME_MACHINE}-pc-syllable + exit ;; + i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*) + echo i386-unknown-lynxos${UNAME_RELEASE} + exit ;; + i*86:*DOS:*:*) + echo ${UNAME_MACHINE}-pc-msdosdjgpp + exit ;; + 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 ;; + i*86:*:5:[678]*) + # UnixWare 7.x, OpenUNIX and OpenServer 6. + 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 ;; + i*86:*:3.2:*) + if test -f /usr/options/cb.name; then + UNAME_REL=`sed -n 's/.*Version //p' /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 ;; + 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 ;; + Intel:Mach:3*:*) + echo i386-pc-mach3 + exit ;; + paragon:*:*:*) + echo i860-intel-osf1 + exit ;; + 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 ;; + mini*:CTIX:SYS*5:*) + # "miniframe" + echo m68010-convergent-sysv + exit ;; + mc68k:UNIX:SYSTEM5:3.51m) + echo m68k-convergent-sysv + exit ;; + M680?0:D-NIX:5.3:*) + echo m68k-diab-dnix + exit ;; + M68*:*:R3V[5678]*:*) + test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; + 3[345]??:*: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 | SHG2:*:4.0:3.0 | S7501*:*: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; } + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; + 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4; exit; } ;; + m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) + echo m68k-unknown-lynxos${UNAME_RELEASE} + exit ;; + mc68030:UNIX_System_V:4.*:*) + echo m68k-atari-sysv4 + exit ;; + TSUNAMI:LynxOS:2.*:*) + echo sparc-unknown-lynxos${UNAME_RELEASE} + exit ;; + rs6000:LynxOS:2.*:*) + echo rs6000-unknown-lynxos${UNAME_RELEASE} + exit ;; + PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*) + echo powerpc-unknown-lynxos${UNAME_RELEASE} + exit ;; + SM[BE]S:UNIX_SV:*:*) + echo mips-dde-sysv${UNAME_RELEASE} + exit ;; + RM*:ReliantUNIX-*:*:*) + echo mips-sni-sysv4 + exit ;; + RM*:SINIX-*:*:*) + echo mips-sni-sysv4 + exit ;; + *: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 ;; + PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort + # says + echo i586-unisys-sysv4 + exit ;; + *:UNIX_System_V:4*:FTX*) + # From Gerald Hewes . + # How about differentiating between stratus architectures? -djm + echo hppa1.1-stratus-sysv4 + exit ;; + *:*:*:FTX*) + # From seanf@swdc.stratus.com. + echo i860-stratus-sysv4 + exit ;; + i*86:VOS:*:*) + # From Paul.Green@stratus.com. + echo ${UNAME_MACHINE}-stratus-vos + exit ;; + *:VOS:*:*) + # From Paul.Green@stratus.com. + echo hppa1.1-stratus-vos + exit ;; + mc68*:A/UX:*:*) + echo m68k-apple-aux${UNAME_RELEASE} + exit ;; + news*:NEWS-OS:6*:*) + echo mips-sony-newsos6 + exit ;; + 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 ;; + BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. + echo powerpc-be-beos + exit ;; + BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. + echo powerpc-apple-beos + exit ;; + BePC:BeOS:*:*) # BeOS running on Intel PC compatible. + echo i586-pc-beos + exit ;; + SX-4:SUPER-UX:*:*) + echo sx4-nec-superux${UNAME_RELEASE} + exit ;; + SX-5:SUPER-UX:*:*) + echo sx5-nec-superux${UNAME_RELEASE} + exit ;; + SX-6:SUPER-UX:*:*) + echo sx6-nec-superux${UNAME_RELEASE} + exit ;; + SX-7:SUPER-UX:*:*) + echo sx7-nec-superux${UNAME_RELEASE} + exit ;; + SX-8:SUPER-UX:*:*) + echo sx8-nec-superux${UNAME_RELEASE} + exit ;; + SX-8R:SUPER-UX:*:*) + echo sx8r-nec-superux${UNAME_RELEASE} + exit ;; + Power*:Rhapsody:*:*) + echo powerpc-apple-rhapsody${UNAME_RELEASE} + exit ;; + *:Rhapsody:*:*) + echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} + exit ;; + *:Darwin:*:*) + UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown + case $UNAME_PROCESSOR in + unknown) UNAME_PROCESSOR=powerpc ;; + esac + echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} + exit ;; + *: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 ;; + *:QNX:*:4*) + echo i386-pc-qnx + exit ;; + NSE-?:NONSTOP_KERNEL:*:*) + echo nse-tandem-nsk${UNAME_RELEASE} + exit ;; + NSR-?:NONSTOP_KERNEL:*:*) + echo nsr-tandem-nsk${UNAME_RELEASE} + exit ;; + *:NonStop-UX:*:*) + echo mips-compaq-nonstopux + exit ;; + BS2000:POSIX*:*:*) + echo bs2000-siemens-sysv + exit ;; + DS/*:UNIX_System_V:*:*) + echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} + exit ;; + *: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 ;; + *:TOPS-10:*:*) + echo pdp10-unknown-tops10 + exit ;; + *:TENEX:*:*) + echo pdp10-unknown-tenex + exit ;; + KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) + echo pdp10-dec-tops20 + exit ;; + XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) + echo pdp10-xkl-tops20 + exit ;; + *:TOPS-20:*:*) + echo pdp10-unknown-tops20 + exit ;; + *:ITS:*:*) + echo pdp10-unknown-its + exit ;; + SEI:*:*:SEIUX) + echo mips-sei-seiux${UNAME_RELEASE} + exit ;; + *:DragonFly:*:*) + echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` + exit ;; + *:*VMS:*:*) + UNAME_MACHINE=`(uname -p) 2>/dev/null` + case "${UNAME_MACHINE}" in + A*) echo alpha-dec-vms ; exit ;; + I*) echo ia64-dec-vms ; exit ;; + V*) echo vax-dec-vms ; exit ;; + esac ;; + *:XENIX:*:SysV) + echo i386-pc-xenix + exit ;; + i*86:skyos:*:*) + echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' + exit ;; + i*86:rdos:*:*) + echo ${UNAME_MACHINE}-pc-rdos + exit ;; +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 < +# include +#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 + 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\n"); 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 +# 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 && SYSTEM_NAME=`$dummy` && + { echo "$SYSTEM_NAME"; exit; } + +# Apollos put the system type in the environment. + +test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } + +# 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 ;; + c2*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit ;; + c34*) + echo c34-convex-bsd + exit ;; + c38*) + echo c38-convex-bsd + exit ;; + c4*) + echo c4-convex-bsd + exit ;; + esac +fi + +cat >&2 < 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/src/WinLibs/freetype-2.3.5/builds/unix/config.sub b/src/WinLibs/freetype-2.3.5/builds/unix/config.sub new file mode 100644 index 000000000..1761d8bdf --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/builds/unix/config.sub @@ -0,0 +1,1626 @@ +#! /bin/sh +# Configuration validation subroutine script. +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, +# 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, +# Inc. + +timestamp='2007-06-28' + +# 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., 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. + + +# Please send patches to . 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 ." + +version="\ +GNU config.sub ($timestamp) + +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 +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 ;; + --version | -v ) + echo "$version" ; exit ;; + --help | --h* | -h ) + echo "$usage"; exit ;; + -- ) # 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 ;; + + * ) + 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* | linux-dietlibc | linux-newlib* | linux-uclibc* | \ + uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-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 | -knuth | -cray) + 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 + ;; + -sco6) + os=-sco5v6 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -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/'` + ;; + -sco5v6*) + # 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] \ + | am33_2.0 \ + | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \ + | bfin \ + | c4x | clipper \ + | d10v | d30v | dlx | dsp16xx \ + | fido | fr30 | frv \ + | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ + | i370 | i860 | i960 | ia64 \ + | ip2k | iq2000 \ + | m32c | m32r | m32rle | m68000 | m68k | m88k \ + | maxq | mb | microblaze | mcore | mep \ + | mips | mipsbe | mipseb | mipsel | mipsle \ + | mips16 \ + | mips64 | mips64el \ + | mips64vr | mips64vrel \ + | mips64orion | mips64orionel \ + | mips64vr4100 | mips64vr4100el \ + | mips64vr4300 | mips64vr4300el \ + | mips64vr5000 | mips64vr5000el \ + | mips64vr5900 | mips64vr5900el \ + | mipsisa32 | mipsisa32el \ + | mipsisa32r2 | mipsisa32r2el \ + | mipsisa64 | mipsisa64el \ + | mipsisa64r2 | mipsisa64r2el \ + | mipsisa64sb1 | mipsisa64sb1el \ + | mipsisa64sr71k | mipsisa64sr71kel \ + | mipstx39 | mipstx39el \ + | mn10200 | mn10300 \ + | mt \ + | msp430 \ + | nios | nios2 \ + | ns16k | ns32k \ + | or32 \ + | pdp10 | pdp11 | pj | pjl \ + | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ + | pyramid \ + | score \ + | sh | sh[1234] | sh[24]a | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ + | sh64 | sh64le \ + | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ + | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ + | spu | strongarm \ + | tahoe | thumb | tic4x | tic80 | tron \ + | v850 | v850e \ + | we32k \ + | x86 | xc16x | xscale | xscalee[bl] | 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) + ;; + ms1) + basic_machine=mt-unknown + ;; + + # We use `pc' rather than `unknown' + # because (1) that's what they normally are, and + # (2) the word "unknown" tends to confuse beginning users. + i*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-* | avr32-* \ + | bfin-* | bs2000-* \ + | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \ + | clipper-* | craynv-* | cydra-* \ + | d10v-* | d30v-* | dlx-* \ + | elxsi-* \ + | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ + | h8300-* | h8500-* \ + | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ + | i*86-* | i860-* | i960-* | ia64-* \ + | ip2k-* | iq2000-* \ + | m32c-* | m32r-* | m32rle-* \ + | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ + | m88110-* | m88k-* | maxq-* | mcore-* \ + | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ + | mips16-* \ + | mips64-* | mips64el-* \ + | mips64vr-* | mips64vrel-* \ + | mips64orion-* | mips64orionel-* \ + | mips64vr4100-* | mips64vr4100el-* \ + | mips64vr4300-* | mips64vr4300el-* \ + | mips64vr5000-* | mips64vr5000el-* \ + | mips64vr5900-* | mips64vr5900el-* \ + | mipsisa32-* | mipsisa32el-* \ + | mipsisa32r2-* | mipsisa32r2el-* \ + | mipsisa64-* | mipsisa64el-* \ + | mipsisa64r2-* | mipsisa64r2el-* \ + | mipsisa64sb1-* | mipsisa64sb1el-* \ + | mipsisa64sr71k-* | mipsisa64sr71kel-* \ + | mipstx39-* | mipstx39el-* \ + | mmix-* \ + | mt-* \ + | msp430-* \ + | nios-* | nios2-* \ + | none-* | np1-* | ns16k-* | ns32k-* \ + | orion-* \ + | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ + | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ + | pyramid-* \ + | romp-* | rs6000-* \ + | sh-* | sh[1234]-* | sh[24]a-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ + | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ + | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ + | sparclite-* \ + | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \ + | tahoe-* | thumb-* \ + | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ + | tron-* \ + | v850-* | v850e-* | vax-* \ + | we32k-* \ + | x86-* | x86_64-* | xc16x-* | xps100-* | xscale-* | xscalee[bl]-* \ + | 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 + ;; + abacus) + basic_machine=abacus-unknown + ;; + 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 + ;; + amd64) + basic_machine=x86_64-pc + ;; + amd64-*) + basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + 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 + ;; + craynv) + basic_machine=craynv-cray + os=-unicosmp + ;; + cr16) + basic_machine=cr16-unknown + os=-elf + ;; + crds | unos) + basic_machine=m68k-crds + ;; + crisv32 | crisv32-* | etraxfs*) + basic_machine=crisv32-axis + ;; + cris | cris-* | etrax*) + basic_machine=cris-axis + ;; + crx) + basic_machine=crx-unknown + os=-elf + ;; + 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 + ;; + djgpp) + basic_machine=i586-pc + os=-msdosdjgpp + ;; + 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 + ;; + mingw32ce) + basic_machine=arm-unknown + os=-mingw32ce + ;; + 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 + ;; + monitor) + basic_machine=m68k-rom68k + os=-coff + ;; + morphos) + basic_machine=powerpc-unknown + os=-morphos + ;; + msdos) + basic_machine=i386-pc + os=-msdos + ;; + ms1-*) + basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` + ;; + 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 + ;; + nsr-tandem) + basic_machine=nsr-tandem + ;; + op50n-* | op60c-*) + basic_machine=hppa1.1-oki + os=-proelf + ;; + openrisc | openrisc-*) + basic_machine=or32-unknown + ;; + os400) + basic_machine=powerpc-ibm + os=-os400 + ;; + 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 + ;; + pc98) + basic_machine=i386-pc + ;; + pc98-*) + basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentium | p5 | k5 | k6 | nexgen | viac3) + basic_machine=i586-pc + ;; + pentiumpro | p6 | 6x86 | athlon | athlon_*) + basic_machine=i686-pc + ;; + pentiumii | pentium2 | pentiumiii | pentium3) + basic_machine=i686-pc + ;; + pentium4) + basic_machine=i786-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-* | pentiumiii-* | pentium3-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentium4-*) + basic_machine=i786-`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 + ;; + rdos) + basic_machine=i386-pc + os=-rdos + ;; + 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 + ;; + sde) + basic_machine=mipsisa32-sde + os=-elf + ;; + sei) + basic_machine=mips-sei + os=-seiux + ;; + sequent) + basic_machine=i386-sequent + ;; + sh) + basic_machine=sh-hitachi + os=-hms + ;; + sh5el) + basic_machine=sh5le-unknown + ;; + sh64) + basic_machine=sh64-unknown + ;; + 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 + ;; + 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 + ;; + tpf) + basic_machine=s390x-ibm + os=-tpf + ;; + 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 + ;; + xbox) + basic_machine=i686-pc + os=-mingw32 + ;; + 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 + ;; + mmix) + basic_machine=mmix-knuth + ;; + 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 + ;; + sh[1234] | sh[24]a | sh[34]eb | sh[1234]le | sh[23]ele) + basic_machine=sh-unknown + ;; + sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) + 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* | -knetbsd* | -mirbsd* | -netbsd* \ + | -openbsd* | -solidbsd* \ + | -ekkobsd* | -kfreebsd* | -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* | -linux-newlib* | -linux-uclibc* \ + | -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* | -nx6 | -nx7 | -sei* | -dragonfly* \ + | -skyos* | -haiku* | -rdos* | -toppers* | -drops*) + # Remember, each alternative MUST END IN *, to match a version number. + ;; + -qnx*) + case $basic_machine in + x86-* | i*86-*) + ;; + *) + os=-nto$os + ;; + esac + ;; + -nto-qnx*) + ;; + -nto*) + os=`echo $os | sed -e 's|nto|nto-qnx|'` + ;; + -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ + | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ + | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) + ;; + -mac*) + os=`echo $os | sed -e 's|mac|macos|'` + ;; + -linux-dietlibc) + os=-linux-dietlibc + ;; + -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 + ;; + -os400*) + os=-os400 + ;; + -wince*) + os=-wince + ;; + -osfrose*) + os=-osfrose + ;; + -osf*) + os=-osf + ;; + -utek*) + os=-bsd + ;; + -dynix*) + os=-bsd + ;; + -acis*) + os=-aos + ;; + -atheos*) + os=-atheos + ;; + -syllable*) + os=-syllable + ;; + -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 + ;; + -tpf*) + os=-tpf + ;; + -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 + ;; + -zvmoe) + os=-zvmoe + ;; + -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 + score-*) + os=-elf + ;; + spu-*) + os=-elf + ;; + *-acorn) + os=-riscix1.2 + ;; + arm*-rebel) + os=-linux + ;; + arm*-semi) + os=-aout + ;; + c4x-* | tic4x-*) + os=-coff + ;; + # 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 + ;; + mep-*) + os=-elf + ;; + 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 + ;; + *-haiku) + os=-haiku + ;; + *-ibm) + os=-aix + ;; + *-knuth) + os=-mmixware + ;; + *-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 + ;; + -os400*) + vendor=ibm + ;; + -ptx*) + vendor=sequent + ;; + -tpf*) + vendor=ibm + ;; + -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 + +# 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/src/WinLibs/freetype-2.3.5/builds/unix/configure.ac b/src/WinLibs/freetype-2.3.5/builds/unix/configure.ac new file mode 100644 index 000000000..36dde7e43 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/builds/unix/configure.ac @@ -0,0 +1,529 @@ +# 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 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.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], [2.3.5], [freetype@nongnu.org], [freetype]) +AC_CONFIG_SRCDIR([ftconfig.in]) + + +# Don't forget to update docs/VERSION.DLL! + +version_info='9:16:3' +AC_SUBST([version_info]) +ft_version=`echo $version_info | tr : .` +AC_SUBST([ft_version]) + + +# checks for system type + +AC_CANONICAL_BUILD +AC_CANONICAL_HOST +AC_CANONICAL_TARGET + + +# 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/^.*\.//g'` + fi + AC_MSG_RESULT($EXEEXT_BUILD) +else + CC_BUILD=${CC} + EXEEXT_BUILD=${EXEEXT} +fi + + +if test ! -z ${EXEEXT_BUILD}; then + EXEEXT_BUILD=."${EXEEXT_BUILD}" +fi +AC_SUBST(CC_BUILD) +AC_SUBST(EXEEXT_BUILD) + + + +# get compiler flags right + +if test "x$CC" = xgcc; 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]) + + +# 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 + + +# Whether to use Mac OS resource-based fonts. + +# 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,-framework,ApplicationServices" + LDFLAGS="$LDFLAGS $FT2_EXTRA_LIBS" + AC_TRY_LINK([ + +#if defined(__GNUC__) && defined(__APPLE_CC__) +# include +# include +#else +# include +# include +#endif + + ], + [ + + short res = 0; + + + UseResFile( res ); + + ], + [AC_MSG_RESULT([ok]) + AC_MSG_CHECKING([OS_INLINE macro is ANSI compatible]) + orig_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $XX_CFLAGS $XX_ANSIFLAGS" + AC_TRY_COMPILE([ + +#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_RESULT([not found]) + LDFLAGS="${orig_LDFLAGS}" + CFLAGS="$CFLAGS -DDARWIN_NO_CARBON"]) +else + case x$target_os in + xdarwin*) + dnl AC_MSG_WARN([target 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_TRY_LINK([ + +#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_TRY_LINK([ + +#if defined(__GNUC__) && defined(__APPLE_CC__) +# include +# include +#else +# include +# include +#endif + + ], + [ + + FCBPBPtr paramBlock; + short vRefNum; + long dirID; + ConstStr255Param fileName; + FSSpec* spec; + + Boolean* isDirectory; + UInt8* path; + SInt16 desiredRefNum; + SInt16* iterator; + SInt16* actualRefNum; + HFSUniStr255* outForkName; + FSVolumeRefNum volume; + FSCatalogInfoBitmap whichInfo; + FSCatalogInfo* catalogInfo; + FSForkInfo* forkInfo; + FSRef* ref; + + + /* FSRef functions: no need to check? */ + FSGetForkCBInfo( desiredRefNum, volume, iterator, + actualRefNum, forkInfo, ref, + outForkName ); + FSpMakeFSRef ( spec, ref ); + FSGetCatalogInfo( ref, whichInfo, catalogInfo, + outForkName, spec, ref ); + FSPathMakeRef( path, ref, isDirectory ); + + ], + [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_TRY_LINK([ + +#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_TRY_LINK([ + +#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_TRY_LINK([ + +#include + + ], + [ + + FSSpec* pathSpec; + + + ATSFontFindFromName( NULL, kATSOptionFlagsUnRestrictedScope ); + ATSFontGetFileSpecification( 0, pathSpec ); + + ], + [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 using legacy builds/mac/ftmac.c instead of src/base/ftmac.c. + ]) + CFLAGS="$CFLAGS "'-I$(TOP_DIR)/builds/mac/' + ;; + *) + ;; +esac + + +AC_SUBST([LIBZ]) +AC_SUBST([CFLAGS]) +AC_SUBST([LDFLAGS]) +AC_SUBST([FT2_EXTRA_LIBS]) +AC_SUBST([SYSTEM_ZLIB]) + + +AC_PROG_LIBTOOL +# urgh -- these are internal libtool variables... +AC_SUBST([enable_shared]) +AC_SUBST([hardcode_libdir_flag_spec]) +AC_SUBST([wl]) + + +# 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/src/WinLibs/freetype-2.3.5/builds/unix/configure.raw b/src/WinLibs/freetype-2.3.5/builds/unix/configure.raw new file mode 100644 index 000000000..413d980c5 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/builds/unix/configure.raw @@ -0,0 +1,529 @@ +# 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 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.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='9:16:3' +AC_SUBST([version_info]) +ft_version=`echo $version_info | tr : .` +AC_SUBST([ft_version]) + + +# checks for system type + +AC_CANONICAL_BUILD +AC_CANONICAL_HOST +AC_CANONICAL_TARGET + + +# 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/^.*\.//g'` + fi + AC_MSG_RESULT($EXEEXT_BUILD) +else + CC_BUILD=${CC} + EXEEXT_BUILD=${EXEEXT} +fi + + +if test ! -z ${EXEEXT_BUILD}; then + EXEEXT_BUILD=."${EXEEXT_BUILD}" +fi +AC_SUBST(CC_BUILD) +AC_SUBST(EXEEXT_BUILD) + + + +# get compiler flags right + +if test "x$CC" = xgcc; 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]) + + +# 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 + + +# Whether to use Mac OS resource-based fonts. + +# 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,-framework,ApplicationServices" + LDFLAGS="$LDFLAGS $FT2_EXTRA_LIBS" + AC_TRY_LINK([ + +#if defined(__GNUC__) && defined(__APPLE_CC__) +# include +# include +#else +# include +# include +#endif + + ], + [ + + short res = 0; + + + UseResFile( res ); + + ], + [AC_MSG_RESULT([ok]) + AC_MSG_CHECKING([OS_INLINE macro is ANSI compatible]) + orig_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $XX_CFLAGS $XX_ANSIFLAGS" + AC_TRY_COMPILE([ + +#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_RESULT([not found]) + LDFLAGS="${orig_LDFLAGS}" + CFLAGS="$CFLAGS -DDARWIN_NO_CARBON"]) +else + case x$target_os in + xdarwin*) + dnl AC_MSG_WARN([target 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_TRY_LINK([ + +#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_TRY_LINK([ + +#if defined(__GNUC__) && defined(__APPLE_CC__) +# include +# include +#else +# include +# include +#endif + + ], + [ + + FCBPBPtr paramBlock; + short vRefNum; + long dirID; + ConstStr255Param fileName; + FSSpec* spec; + + Boolean* isDirectory; + UInt8* path; + SInt16 desiredRefNum; + SInt16* iterator; + SInt16* actualRefNum; + HFSUniStr255* outForkName; + FSVolumeRefNum volume; + FSCatalogInfoBitmap whichInfo; + FSCatalogInfo* catalogInfo; + FSForkInfo* forkInfo; + FSRef* ref; + + + /* FSRef functions: no need to check? */ + FSGetForkCBInfo( desiredRefNum, volume, iterator, + actualRefNum, forkInfo, ref, + outForkName ); + FSpMakeFSRef ( spec, ref ); + FSGetCatalogInfo( ref, whichInfo, catalogInfo, + outForkName, spec, ref ); + FSPathMakeRef( path, ref, isDirectory ); + + ], + [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_TRY_LINK([ + +#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_TRY_LINK([ + +#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_TRY_LINK([ + +#include + + ], + [ + + FSSpec* pathSpec; + + + ATSFontFindFromName( NULL, kATSOptionFlagsUnRestrictedScope ); + ATSFontGetFileSpecification( 0, pathSpec ); + + ], + [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 using legacy builds/mac/ftmac.c instead of src/base/ftmac.c. + ]) + CFLAGS="$CFLAGS "'-I$(TOP_DIR)/builds/mac/' + ;; + *) + ;; +esac + + +AC_SUBST([LIBZ]) +AC_SUBST([CFLAGS]) +AC_SUBST([LDFLAGS]) +AC_SUBST([FT2_EXTRA_LIBS]) +AC_SUBST([SYSTEM_ZLIB]) + + +AC_PROG_LIBTOOL +# urgh -- these are internal libtool variables... +AC_SUBST([enable_shared]) +AC_SUBST([hardcode_libdir_flag_spec]) +AC_SUBST([wl]) + + +# 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/src/WinLibs/freetype-2.3.5/builds/unix/detect.mk b/src/WinLibs/freetype-2.3.5/builds/unix/detect.mk new file mode 100644 index 000000000..c4130f9bc --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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 $(CFG) + else + cd builds/unix; ./configure $(CFG) + endif + endif + +endif # test PLATFORM unix + + +# EOF diff --git a/src/WinLibs/freetype-2.3.5/builds/unix/freetype-config.in b/src/WinLibs/freetype-2.3.5/builds/unix/freetype-config.in new file mode 100644 index 000000000..57f0f9563 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/builds/unix/freetype-config.in @@ -0,0 +1,157 @@ +#! /bin/sh +# +# Copyright 2000, 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. + +prefix=@prefix@ +exec_prefix=@exec_prefix@ +exec_prefix_set=no +includedir=@includedir@ +libdir=@libdir@ +enable_shared=@enable_shared@ +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) + major=`grep define @prefix@/include/freetype2/freetype/freetype.h \ + | grep FREETYPE_MAJOR \ + | sed 's/.*[ ]\([0-9][0-9]*\).*/\1/'` + minor=`grep define @prefix@/include/freetype2/freetype/freetype.h \ + | grep FREETYPE_MINOR \ + | sed 's/.*[ ]\([0-9][0-9]*\).*/\1/'` + patch=`grep define @prefix@/include/freetype2/freetype/freetype.h \ + | grep FREETYPE_PATCH \ + | sed 's/.*[ ]\([0-9][0-9]*\).*/\1/'` + echo $major.$minor.$patch + exit 0 + ;; + --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 $prefix +fi + +if test "$echo_exec_prefix" = "yes" ; then + echo $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_cflags" = "yes" ; then + cflags="-I$includedir/freetype2" + if test "$includedir" != "/usr/include" ; then + echo $cflags -I$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 "$libdir" != "/usr/lib" && test "$libdir" != "/usr/lib64"; then + echo -L$libdir $rpath $libs + else + echo $libs + fi +fi + +if test "$echo_libtool" = "yes" ; then + convlib="libfreetype.la" + echo $libdir/$convlib +fi + +# EOF diff --git a/src/WinLibs/freetype-2.3.5/builds/unix/freetype2.in b/src/WinLibs/freetype-2.3.5/builds/unix/freetype2.in new file mode 100644 index 000000000..0d7aefade --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/builds/unix/freetype2.in @@ -0,0 +1,11 @@ +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 @LIBZ@ @FT2_EXTRA_LIBS@ +Cflags: -I${includedir}/freetype2 -I${includedir} diff --git a/src/WinLibs/freetype-2.3.5/builds/unix/freetype2.m4 b/src/WinLibs/freetype-2.3.5/builds/unix/freetype2.m4 new file mode 100644 index 000000000..d1da07d9c --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/builds/unix/freetype2.m4 @@ -0,0 +1,192 @@ +# Configure paths for FreeType2 +# Marcelo Magallon 2001-10-26, based on gtk.m4 by Owen Taylor +# +# Copyright 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. +# +# 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 2 + +# 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 + + AC_PATH_PROG([FT2_CONFIG], [freetype-config], [no]) + + 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/src/WinLibs/freetype-2.3.5/builds/unix/ft-munmap.m4 b/src/WinLibs/freetype-2.3.5/builds/unix/ft-munmap.m4 new file mode 100644 index 000000000..68b3361e2 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/builds/unix/ft2unix.h b/src/WinLibs/freetype-2.3.5/builds/unix/ft2unix.h new file mode 100644 index 000000000..6a3b8d90e --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/builds/unix/ftconfig.in b/src/WinLibs/freetype-2.3.5/builds/unix/ftconfig.in new file mode 100644 index 000000000..1a9626465 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/builds/unix/ftconfig.in @@ -0,0 +1,349 @@ +/***************************************************************************/ +/* */ +/* ftconfig.in */ +/* */ +/* UNIX-specific configuration file (specification only). */ +/* */ +/* Copyright 1996-2001, 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. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* 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 SIZEOF_INT +#undef SIZEOF_LONG + + +#define FT_SIZEOF_INT SIZEOF_INT +#define FT_SIZEOF_LONG SIZEOF_LONG + +#define FT_CHAR_BIT CHAR_BIT + + /* 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 +#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 */ + + +#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. */ + /* 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 */ + + +#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/src/WinLibs/freetype-2.3.5/builds/unix/ftsystem.c b/src/WinLibs/freetype-2.3.5/builds/unix/ftsystem.c new file mode 100644 index 000000000..3a740fd02 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/builds/unix/ftsystem.c @@ -0,0 +1,414 @@ +/***************************************************************************/ +/* */ +/* ftsystem.c */ +/* */ +/* Unix-specific FreeType low-level system interface (body). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#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" )); + 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/src/WinLibs/freetype-2.3.5/builds/unix/install-sh b/src/WinLibs/freetype-2.3.5/builds/unix/install-sh new file mode 100644 index 000000000..a5897de6e --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/builds/unix/install-sh @@ -0,0 +1,519 @@ +#!/bin/sh +# install - install a program, script, or datafile + +scriptversion=2006-12-25.00 + +# 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-end: "$" +# End: diff --git a/src/WinLibs/freetype-2.3.5/builds/unix/install.mk b/src/WinLibs/freetype-2.3.5/builds/unix/install.mk new file mode 100644 index 000000000..2e5ef080e --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/builds/unix/mkinstalldirs b/src/WinLibs/freetype-2.3.5/builds/unix/mkinstalldirs new file mode 100644 index 000000000..ef7e16fda --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/builds/unix/unix-cc.in b/src/WinLibs/freetype-2.3.5/builds/unix/unix-cc.in new file mode 100644 index 000000000..9c6d5de6e --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/builds/unix/unix-def.in b/src/WinLibs/freetype-2.3.5/builds/unix/unix-def.in new file mode 100644 index 000000000..b90ed0c4c --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/builds/unix/unix-def.in @@ -0,0 +1,81 @@ +# +# FreeType 2 configuration rules templates for Unix + configure +# + + +# 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. + + +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 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/src/WinLibs/freetype-2.3.5/builds/unix/unix-dev.mk b/src/WinLibs/freetype-2.3.5/builds/unix/unix-dev.mk new file mode 100644 index 000000000..76bae3862 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/builds/unix/unix-lcc.mk b/src/WinLibs/freetype-2.3.5/builds/unix/unix-lcc.mk new file mode 100644 index 000000000..6038e5239 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/builds/unix/unix.mk b/src/WinLibs/freetype-2.3.5/builds/unix/unix.mk new file mode 100644 index 000000000..7f9d9a34f --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/builds/unix/unixddef.mk b/src/WinLibs/freetype-2.3.5/builds/unix/unixddef.mk new file mode 100644 index 000000000..130d6b0f6 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/builds/vms/ftconfig.h b/src/WinLibs/freetype-2.3.5/builds/vms/ftconfig.h new file mode 100644 index 000000000..185c3348e --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/builds/vms/ftconfig.h @@ -0,0 +1,338 @@ +/***************************************************************************/ +/* */ +/* ftconfig.h */ +/* */ +/* VMS-specific configuration file (specification only). */ +/* */ +/* Copyright 1996-2001, 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. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* 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 +#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/src/WinLibs/freetype-2.3.5/builds/vms/ftsystem.c b/src/WinLibs/freetype-2.3.5/builds/vms/ftsystem.c new file mode 100644 index 000000000..76bfae9f4 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/builds/win32/detect.mk b/src/WinLibs/freetype-2.3.5/builds/win32/detect.mk new file mode 100644 index 000000000..190653960 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/builds/win32/ftdebug.c b/src/WinLibs/freetype-2.3.5/builds/win32/ftdebug.c new file mode 100644 index 000000000..886144f59 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/builds/win32/ftdebug.c @@ -0,0 +1,213 @@ +/***************************************************************************/ +/* */ +/* ftdebug.c */ +/* */ +/* Debugging and logging component for Win32 (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. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* 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/src/WinLibs/freetype-2.3.5/builds/win32/visualc/freetype.dsp b/src/WinLibs/freetype-2.3.5/builds/win32/visualc/freetype.dsp new file mode 100644 index 000000000..4d83de346 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/builds/win32/visualc/freetype.dsp @@ -0,0 +1,396 @@ +# 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\freetype235.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\freetype235_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\freetype235_D.lib" +# ADD LIB32 /nologo /out:"..\..\..\objs\freetype235MT_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\freetype235.lib" +# ADD LIB32 /nologo /out:"..\..\..\objs\freetype235MT.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\freetype235.lib" +# ADD LIB32 /out:"..\..\..\objs\freetype235ST.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\freetype235_D.lib" +# ADD LIB32 /nologo /out:"..\..\..\objs\freetype235ST_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\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/src/WinLibs/freetype-2.3.5/builds/win32/visualc/freetype.dsw b/src/WinLibs/freetype-2.3.5/builds/win32/visualc/freetype.dsw new file mode 100644 index 000000000..b1b375dbb --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/builds/win32/visualc/freetype.sln b/src/WinLibs/freetype-2.3.5/builds/win32/visualc/freetype.sln new file mode 100644 index 000000000..470d4fa30 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/builds/win32/visualc/freetype.vcproj b/src/WinLibs/freetype-2.3.5/builds/win32/visualc/freetype.vcproj new file mode 100644 index 000000000..20455cebe --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/builds/win32/visualc/freetype.vcproj @@ -0,0 +1,2155 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/WinLibs/freetype-2.3.5/builds/win32/visualc/freetype.vcproj.CYBERDEV2.DEV2.user b/src/WinLibs/freetype-2.3.5/builds/win32/visualc/freetype.vcproj.CYBERDEV2.DEV2.user new file mode 100644 index 000000000..cf7eeff97 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/builds/win32/visualc/freetype.vcproj.CYBERDEV2.DEV2.user @@ -0,0 +1,177 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/WinLibs/freetype-2.3.5/builds/win32/visualc/index.html b/src/WinLibs/freetype-2.3.5/builds/win32/visualc/index.html new file mode 100644 index 000000000..d15f60fc2 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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.5 sources:

+ +
    +
    +    freetype235.lib     - release build; single threaded
    +    freetype235_D.lib   - debug build;   single threaded
    +    freetype235MT.lib   - release build; multi-threaded
    +    freetype235MT_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/src/WinLibs/freetype-2.3.5/builds/win32/visualce/freetype.dsp b/src/WinLibs/freetype-2.3.5/builds/win32/visualce/freetype.dsp new file mode 100644 index 000000000..4d83de346 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/builds/win32/visualce/freetype.dsp @@ -0,0 +1,396 @@ +# 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\freetype235.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\freetype235_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\freetype235_D.lib" +# ADD LIB32 /nologo /out:"..\..\..\objs\freetype235MT_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\freetype235.lib" +# ADD LIB32 /nologo /out:"..\..\..\objs\freetype235MT.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\freetype235.lib" +# ADD LIB32 /out:"..\..\..\objs\freetype235ST.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\freetype235_D.lib" +# ADD LIB32 /nologo /out:"..\..\..\objs\freetype235ST_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\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/src/WinLibs/freetype-2.3.5/builds/win32/visualce/freetype.dsw b/src/WinLibs/freetype-2.3.5/builds/win32/visualce/freetype.dsw new file mode 100644 index 000000000..b1b375dbb --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/builds/win32/visualce/freetype.vcproj b/src/WinLibs/freetype-2.3.5/builds/win32/visualce/freetype.vcproj new file mode 100644 index 000000000..c9c176750 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/builds/win32/visualce/freetype.vcproj @@ -0,0 +1,13861 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/WinLibs/freetype-2.3.5/builds/win32/visualce/index.html b/src/WinLibs/freetype-2.3.5/builds/win32/visualce/index.html new file mode 100644 index 000000000..e13330990 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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.5 sources:

+ +
    +
    +    freetype235.lib     - release build; single threaded
    +    freetype235_D.lib   - debug build;   single threaded
    +    freetype235MT.lib   - release build; multi-threaded
    +    freetype235MT_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/src/WinLibs/freetype-2.3.5/builds/win32/w32-bcc.mk b/src/WinLibs/freetype-2.3.5/builds/win32/w32-bcc.mk new file mode 100644 index 000000000..a9f48fc60 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/builds/win32/w32-bccd.mk b/src/WinLibs/freetype-2.3.5/builds/win32/w32-bccd.mk new file mode 100644 index 000000000..51b15d903 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/builds/win32/w32-dev.mk b/src/WinLibs/freetype-2.3.5/builds/win32/w32-dev.mk new file mode 100644 index 000000000..00cacb0f6 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/builds/win32/w32-gcc.mk b/src/WinLibs/freetype-2.3.5/builds/win32/w32-gcc.mk new file mode 100644 index 000000000..580afc5c9 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/builds/win32/w32-icc.mk b/src/WinLibs/freetype-2.3.5/builds/win32/w32-icc.mk new file mode 100644 index 000000000..8819a1f49 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/builds/win32/w32-intl.mk b/src/WinLibs/freetype-2.3.5/builds/win32/w32-intl.mk new file mode 100644 index 000000000..ae62e1bcd --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/builds/win32/w32-lcc.mk b/src/WinLibs/freetype-2.3.5/builds/win32/w32-lcc.mk new file mode 100644 index 000000000..a147c4cb6 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/builds/win32/w32-mingw32.mk b/src/WinLibs/freetype-2.3.5/builds/win32/w32-mingw32.mk new file mode 100644 index 000000000..04e9e211c --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/builds/win32/w32-vcc.mk b/src/WinLibs/freetype-2.3.5/builds/win32/w32-vcc.mk new file mode 100644 index 000000000..7fb879486 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/builds/win32/w32-wat.mk b/src/WinLibs/freetype-2.3.5/builds/win32/w32-wat.mk new file mode 100644 index 000000000..820b81735 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/builds/win32/win32-def.mk b/src/WinLibs/freetype-2.3.5/builds/win32/win32-def.mk new file mode 100644 index 000000000..a82b146bf --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/builds/win32/win32-def.mk @@ -0,0 +1,46 @@ +# +# 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 + + +# 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/src/WinLibs/freetype-2.3.5/configure b/src/WinLibs/freetype-2.3.5/configure new file mode 100644 index 000000000..f251ae417 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/configure @@ -0,0 +1,100 @@ +#!/bin/sh +# +# 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. +# +# +# 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.79.1) 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` + +# build a dummy Makefile if we are not building in the source tree + +if test "$abs_curr_dir" != "$abs_ft2_dir"; then + mkdir reference + echo "Copying \`modules.cfg'" + cp $abs_ft2_dir/modules.cfg $abs_curr_dir + 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= +for x in ${1+"$@"}; do + CFG="$CFG \"$x\"" +done +CFG=$CFG $GNUMAKE setup unix + +# eof diff --git a/src/WinLibs/freetype-2.3.5/devel/ft2build.h b/src/WinLibs/freetype-2.3.5/devel/ft2build.h new file mode 100644 index 000000000..c1d38c35a --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/devel/ftoption.h b/src/WinLibs/freetype-2.3.5/devel/ftoption.h new file mode 100644 index 000000000..6cf1af236 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/devel/ftoption.h @@ -0,0 +1,670 @@ +/***************************************************************************/ +/* */ +/* ftoption.h (for development) */ +/* */ +/* User-selectable configuration macros (specification only). */ +/* */ +/* 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 __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 larger than */ + /* the original size; the difference will be that 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 + + + /*************************************************************************/ + /* */ + /* 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 synthetize 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 */ + /* synthetize 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 synthetize 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 allows FreeType to be used with the PostScript language, using */ + /* the GhostScript interpreter. */ + /* */ +/* #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 + + + + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** 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/ftnames.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 + + + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** 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 */ + /* the TT_CONFIG_OPTION_UNPATENTED_HINTING macro is *ignored* if you */ + /* define TT_CONFIG_OPTION_BYTECODE_INTERPRETER; with 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 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. + */ +#undef FT_CONFIG_OPTION_OLD_INTERNALS + + + /* + * This variable 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 +#elif defined TT_CONFIG_OPTION_UNPATENTED_HINTING +#define TT_USE_BYTECODE_INTERPRETER +#endif + +FT_END_HEADER + + +#endif /* __FTOPTION_H__ */ + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/docs/CHANGES b/src/WinLibs/freetype-2.3.5/docs/CHANGES new file mode 100644 index 000000000..79fd77861 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/docs/CHANGES @@ -0,0 +1,3086 @@ + +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 by +David Turner, Robert Wilhelm, and Werner Lemberg. + +This file is part of the FreeType project, and may only be used, +modified, and distributed under the terms of the FreeType project +license, LICENSE.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/src/WinLibs/freetype-2.3.5/docs/CUSTOMIZE b/src/WinLibs/freetype-2.3.5/docs/CUSTOMIZE new file mode 100644 index 000000000..7d7d474ec --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/docs/DEBUG b/src/WinLibs/freetype-2.3.5/docs/DEBUG new file mode 100644 index 000000000..1fccc21c4 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/docs/DEBUG @@ -0,0 +1,199 @@ +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'. + + 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 by +David Turner, Robert Wilhelm, and Werner Lemberg. + +This file is part of the FreeType project, and may only be used, +modified, and distributed under the terms of the FreeType project +license, LICENSE.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/src/WinLibs/freetype-2.3.5/docs/FTL.TXT b/src/WinLibs/freetype-2.3.5/docs/FTL.TXT new file mode 100644 index 000000000..bbaba33f4 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/docs/GPL.TXT b/src/WinLibs/freetype-2.3.5/docs/GPL.TXT new file mode 100644 index 000000000..b2fe7b6af --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/docs/INSTALL b/src/WinLibs/freetype-2.3.5/docs/INSTALL new file mode 100644 index 000000000..585c4dbea --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/docs/INSTALL @@ -0,0 +1,89 @@ + +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). + + + 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 by +David Turner, Robert Wilhelm, and Werner Lemberg. + +This file is part of the FreeType project, and may only be used, +modified, and distributed under the terms of the FreeType project +license, LICENSE.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/src/WinLibs/freetype-2.3.5/docs/INSTALL.ANY b/src/WinLibs/freetype-2.3.5/docs/INSTALL.ANY new file mode 100644 index 000000000..06f65d7c7 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/docs/INSTALL.ANY @@ -0,0 +1,139 @@ +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/ftgxval.c -- optional, see + src/base/ftmm.c -- optional, see + src/base/ftotval.c -- optional, see + 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/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: + + `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 ftsystem.c + cc -c -Ifreetype2/include ftinit.c + cc -c -Ifreetype2/include ftdebug.c + cc -c -Ifreetype2/include 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 by +David Turner, Robert Wilhelm, and Werner Lemberg. + +This file is part of the FreeType project, and may only be used, +modified, and distributed under the terms of the FreeType project +license, LICENSE.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/src/WinLibs/freetype-2.3.5/docs/INSTALL.CROSS b/src/WinLibs/freetype-2.3.5/docs/INSTALL.CROSS new file mode 100644 index 000000000..1a0c00cdd --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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.78.1 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 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/src/WinLibs/freetype-2.3.5/docs/INSTALL.GNU b/src/WinLibs/freetype-2.3.5/docs/INSTALL.GNU new file mode 100644 index 000000000..7b588cb87 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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.78.1 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 by +David Turner, Robert Wilhelm, and Werner Lemberg. + +This file is part of the FreeType project, and may only be used, +modified, and distributed under the terms of the FreeType project +license, LICENSE.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/src/WinLibs/freetype-2.3.5/docs/INSTALL.MAC b/src/WinLibs/freetype-2.3.5/docs/INSTALL.MAC new file mode 100644 index 000000000..aa7539982 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/docs/INSTALL.MAC @@ -0,0 +1,4 @@ +Please follow the instructions in INSTALL.UNIX to install FreeType on +Mac OS X. + +For classic Mac OS (Mac OS 7, 8, 9) please refer to builds/mac/README. diff --git a/src/WinLibs/freetype-2.3.5/docs/INSTALL.UNIX b/src/WinLibs/freetype-2.3.5/docs/INSTALL.UNIX new file mode 100644 index 000000000..3ddfb8e4b --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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.78.1 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/src/WinLibs/freetype-2.3.5/docs/INSTALL.VMS b/src/WinLibs/freetype-2.3.5/docs/INSTALL.VMS new file mode 100644 index 000000000..994e56688 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/docs/LICENSE.TXT b/src/WinLibs/freetype-2.3.5/docs/LICENSE.TXT new file mode 100644 index 000000000..102a03d65 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/docs/LICENSE.TXT @@ -0,0 +1,28 @@ + +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 PCF driver comes with a license similar to that of the X +Window System. It is compatible to the above two licenses (see file +src/pcf/readme). + + +--- end of LICENSE.TXT --- diff --git a/src/WinLibs/freetype-2.3.5/docs/MAKEPP b/src/WinLibs/freetype-2.3.5/docs/MAKEPP new file mode 100644 index 000000000..58eaf551d --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/docs/PATENTS b/src/WinLibs/freetype-2.3.5/docs/PATENTS new file mode 100644 index 000000000..f36778b5e --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/docs/PROBLEMS b/src/WinLibs/freetype-2.3.5/docs/PROBLEMS new file mode 100644 index 000000000..fb0fee0b0 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/docs/PROBLEMS @@ -0,0 +1,52 @@ +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. + +---------------------------------------------------------------------- + + +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, + + +---------------------------------------------------------------------- diff --git a/src/WinLibs/freetype-2.3.5/docs/TODO b/src/WinLibs/freetype-2.3.5/docs/TODO new file mode 100644 index 000000000..be60d6f04 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/docs/TRUETYPE b/src/WinLibs/freetype-2.3.5/docs/TRUETYPE new file mode 100644 index 000000000..3e1614ad4 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/docs/UPGRADE.UNIX b/src/WinLibs/freetype-2.3.5/docs/UPGRADE.UNIX new file mode 100644 index 000000000..48c746d70 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/docs/VERSION.DLL b/src/WinLibs/freetype-2.3.5/docs/VERSION.DLL new file mode 100644 index 000000000..db8de0e89 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/docs/VERSION.DLL @@ -0,0 +1,131 @@ +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.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 by +David Turner, Robert Wilhelm, and Werner Lemberg. + +This file is part of the FreeType project, and may only be used, +modified, and distributed under the terms of the FreeType project +license, LICENSE.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/src/WinLibs/freetype-2.3.5/docs/formats.txt b/src/WinLibs/freetype-2.3.5/docs/formats.txt new file mode 100644 index 000000000..2f7c3d94e --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/docs/formats.txt @@ -0,0 +1,154 @@ +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 --- --- Type 1 GX Font Format + (for the Mac) +MAC SFNT PS TYPE_1 --- --- Type 1 GX Font Format + (for the Mac) +--- SFNT PS TYPE_1 CID --- 5180.sfnt.pdf (for the Mac) +MAC SFNT PS TYPE_1 CID --- 5180.sfnt.pdf (for the Mac) +--- 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 +--- LZW PCF --- --- pcf X11 + + +--- --- 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). + +------------------------------------------------------------------------ + +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. + + +--- end of formats.txt --- diff --git a/src/WinLibs/freetype-2.3.5/docs/raster.txt b/src/WinLibs/freetype-2.3.5/docs/raster.txt new file mode 100644 index 000000000..95d9e2401 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/docs/reference/README b/src/WinLibs/freetype-2.3.5/docs/reference/README new file mode 100644 index 000000000..51b04d6f1 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/docs/reference/ft2-base_interface.html b/src/WinLibs/freetype-2.3.5/docs/reference/ft2-base_interface.html new file mode 100644 index 000000000..51c84f6d2 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/docs/reference/ft2-base_interface.html @@ -0,0 +1,3219 @@ + + + + +FreeType-2.3.5 API Reference + + + +

FreeType-2.3.5 API Reference

+ +

+Base Interface +

+

Synopsis

+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
FT_LibraryFT_HAS_MULTIPLE_MASTERSFT_Load_Char
FT_FaceFT_STYLE_FLAG_XXXFT_LOAD_XXX
FT_SizeFT_Size_InternalFT_LOAD_TARGET_XXX
FT_GlyphSlotFT_Size_MetricsFT_Set_Transform
FT_CharMapFT_SizeRecFT_Render_Mode
FT_EncodingFT_SubGlyphft_render_mode_xxx
FT_Glyph_MetricsFT_Slot_InternalFT_Render_Glyph
FT_Bitmap_SizeFT_GlyphSlotRecFT_Kerning_Mode
FT_ModuleFT_Init_FreeTypeft_kerning_default
FT_DriverFT_Done_FreeTypeft_kerning_unfitted
FT_RendererFT_OPEN_XXXft_kerning_unscaled
FT_ENC_TAGFT_ParameterFT_Get_Kerning
ft_encoding_xxxFT_Open_ArgsFT_Get_Track_Kerning
FT_CharMapRecFT_New_FaceFT_Get_Glyph_Name
FT_Face_InternalFT_New_Memory_FaceFT_Get_Postscript_Name
FT_FaceRecFT_Open_FaceFT_Select_Charmap
FT_FACE_FLAG_XXXFT_Attach_FileFT_Set_Charmap
FT_HAS_HORIZONTALFT_Attach_StreamFT_Get_Charmap_Index
FT_HAS_VERTICALFT_Done_FaceFT_Get_Char_Index
FT_HAS_KERNINGFT_Select_SizeFT_Get_First_Char
FT_IS_SCALABLEFT_Size_Request_TypeFT_Get_Next_Char
FT_IS_SFNTFT_Size_RequestRecFT_Get_Name_Index
FT_IS_FIXED_WIDTHFT_Request_SizeFT_SUBGLYPH_FLAG_XXX
FT_HAS_FIXED_SIZESFT_Set_Char_SizeFT_Get_SubGlyph_Info
FT_HAS_FAST_GLYPHSFT_Set_Pixel_Sizes
FT_HAS_GLYPH_NAMESFT_Load_Glyph


+ +
+

This section describes the public high-level API of FreeType 2.

+

+
+

FT_Library

+
+
+  typedef struct FT_LibraryRec_  *FT_Library;
+
+

+
+

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.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Face

+
+
+  typedef struct FT_FaceRec_*  FT_Face;
+
+

+
+

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
+

The FT_FaceRec details the publicly accessible fields of a given face object.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Size

+
+
+  typedef struct FT_SizeRec_*  FT_Size;
+
+

+
+

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
+

The FT_SizeRec structure details the publicly accessible fields of a given size object.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_GlyphSlot

+
+
+  typedef struct FT_GlyphSlotRec_*  FT_GlyphSlot;
+
+

+
+

A handle to a given ‘glyph slot’. A slot is a container where it is possible to load any one 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
+

FT_GlyphSlotRec details the publicly accessible glyph fields.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_CharMap

+
+
+  typedef struct FT_CharMapRec_*  FT_CharMap;
+
+

+
+

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
+

The FT_CharMapRec details the publicly accessible fields of a given character map.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_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;
+
+

+
+

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, GB2312_EUC, etc.).

+

Because of 32-bit charcodes defined in Unicode (i.e., surrogates), all character codes must be expressed as FT_Longs.

+

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.

+
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 synthetizes 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 c 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.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Glyph_Metrics

+
+
+  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;
+
+

+
+

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.

+
+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Bitmap_Size

+
+
+  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;
+
+

+
+

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.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Module

+
+
+  typedef struct FT_ModuleRec_*  FT_Module;
+
+

+
+

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.

+

+
+
+ + +
[Index][TOC]
+ +
+

FT_Driver

+
+
+  typedef struct FT_DriverRec_*  FT_Driver;
+
+

+
+

A handle to a given FreeType font driver object. Each font driver is a special module capable of creating faces from font files.

+

+
+
+ + +
[Index][TOC]
+ +
+

FT_Renderer

+
+
+  typedef struct FT_RendererRec_*  FT_Renderer;
+
+

+
+

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.

+

+
+
+ + +
[Index][TOC]
+ +
+

FT_ENC_TAG

+
+
+#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 */
+
+

+
+

This macro converts four-letter tags into an unsigned long. It is used to define ‘encoding’ identifiers (see FT_Encoding).

+

+
note
+

Since many 16bit compilers don't like 32bit 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.

+
+
+
+ + +
[Index][TOC]
+ +
+

ft_encoding_xxx

+
+
+#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
+
+

+
+

These constants are deprecated; use the corresponding FT_Encoding values instead.

+

+
+
+ + +
[Index][TOC]
+ +
+

FT_CharMapRec

+
+
+  typedef struct  FT_CharMapRec_
+  {
+    FT_Face      face;
+    FT_Encoding  encoding;
+    FT_UShort    platform_id;
+    FT_UShort    encoding_id;
+
+  } FT_CharMapRec;
+
+

+
+

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.

+
+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Face_Internal

+
+
+  typedef struct FT_Face_InternalRec_*  FT_Face_Internal;
+
+

+
+

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.

+

+
+
+ + +
[Index][TOC]
+ +
+

FT_FaceRec

+
+
+  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;
+
+

+
+

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.

+
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.

+
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.

+
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's 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.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_FACE_FLAG_XXX

+
+
+#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 )
+
+

+
+

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.

+
+
+
+
+ + +
[Index][TOC]
+ +
+

FT_HAS_HORIZONTAL

+
+
+#define FT_HAS_HORIZONTAL( face ) \
+          ( face->face_flags & FT_FACE_FLAG_HORIZONTAL )
+
+

+
+

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.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_HAS_VERTICAL

+
+
+#define FT_HAS_VERTICAL( face ) \
+          ( face->face_flags & FT_FACE_FLAG_VERTICAL )
+
+

+
+

A macro that returns true whenever a face object contains vertical metrics.

+

+
+
+ + +
[Index][TOC]
+ +
+

FT_HAS_KERNING

+
+
+#define FT_HAS_KERNING( face ) \
+          ( face->face_flags & FT_FACE_FLAG_KERNING )
+
+

+
+

A macro that returns true whenever a face object contains kerning data that can be accessed with FT_Get_Kerning.

+

+
+
+ + +
[Index][TOC]
+ +
+

FT_IS_SCALABLE

+
+
+#define FT_IS_SCALABLE( face ) \
+          ( face->face_flags & FT_FACE_FLAG_SCALABLE )
+
+

+
+

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.

+

+
+
+ + +
[Index][TOC]
+ +
+

FT_IS_SFNT

+
+
+#define FT_IS_SFNT( face ) \
+          ( face->face_flags & FT_FACE_FLAG_SFNT )
+
+

+
+

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.

+

+
+
+ + +
[Index][TOC]
+ +
+

FT_IS_FIXED_WIDTH

+
+
+#define FT_IS_FIXED_WIDTH( face ) \
+          ( face->face_flags & FT_FACE_FLAG_FIXED_WIDTH )
+
+

+
+

A macro that returns true whenever a face object contains a font face that contains fixed-width (or ‘monospace’, ‘fixed-pitch’, etc.) glyphs.

+

+
+
+ + +
[Index][TOC]
+ +
+

FT_HAS_FIXED_SIZES

+
+
+#define FT_HAS_FIXED_SIZES( face ) \
+          ( face->face_flags & FT_FACE_FLAG_FIXED_SIZES )
+
+

+
+

A macro that returns true whenever a face object contains some embedded bitmaps. See the ‘available_sizes’ field of the FT_FaceRec structure.

+

+
+
+ + +
[Index][TOC]
+ +
+

FT_HAS_FAST_GLYPHS

+
+
+#define FT_HAS_FAST_GLYPHS( face )  0
+
+

+
+

Deprecated.

+

+
+
+ + +
[Index][TOC]
+ +
+

FT_HAS_GLYPH_NAMES

+
+
+#define FT_HAS_GLYPH_NAMES( face ) \
+          ( face->face_flags & FT_FACE_FLAG_GLYPH_NAMES )
+
+

+
+

A macro that returns true whenever a face object contains some glyph names that can be accessed through FT_Get_Glyph_Name.

+

+
+
+ + +
[Index][TOC]
+ +
+

FT_HAS_MULTIPLE_MASTERS

+
+
+#define FT_HAS_MULTIPLE_MASTERS( face ) \
+          ( face->face_flags & FT_FACE_FLAG_MULTIPLE_MASTERS )
+
+

+
+

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.

+

+
+
+ + +
[Index][TOC]
+ +
+

FT_STYLE_FLAG_XXX

+
+
+#define FT_STYLE_FLAG_ITALIC  ( 1 << 0 )
+#define FT_STYLE_FLAG_BOLD    ( 1 << 1 )
+
+

+
+

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 is italicized.

+
FT_STYLE_FLAG_BOLD +

Indicates that a given face is bold.

+
+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Size_Internal

+
+
+  typedef struct FT_Size_InternalRec_*  FT_Size_Internal;
+
+

+
+

An opaque handle to an ‘FT_Size_InternalRec’ structure, used to model private data of a given FT_Size object.

+

+
+
+ + +
[Index][TOC]
+ +
+

FT_Size_Metrics

+
+
+  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;
+
+

+
+

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.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_SizeRec

+
+
+  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;
+
+

+
+

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.

+
+
+
+
+ + +
[Index][TOC]
+ +
+

FT_SubGlyph

+
+
+  typedef struct FT_SubGlyphRec_*  FT_SubGlyph;
+
+

+
+

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.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Slot_Internal

+
+
+  typedef struct FT_Slot_InternalRec_*  FT_Slot_Internal;
+
+

+
+

An opaque handle to an ‘FT_Slot_InternalRec’ structure, used to model private data of a given FT_GlyphSlot object.

+

+
+
+ + +
[Index][TOC]
+ +
+

FT_GlyphSlotRec

+
+
+  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;
+
+

+
+

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 is the transformed advance width for the glyph.

+
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 convert 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                                                           
+
+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Init_FreeType

+
+
+  FT_EXPORT( FT_Error )
+  FT_Init_FreeType( FT_Library  *alibrary );
+
+

+
+

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.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Done_FreeType

+
+
+  FT_EXPORT( FT_Error )
+  FT_Done_FreeType( FT_Library  library );
+
+

+
+

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.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_OPEN_XXX

+
+
+#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 */
+
+

+
+

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.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Parameter

+
+
+  typedef struct  FT_Parameter_
+  {
+    FT_ULong    tag;
+    FT_Pointer  data;
+
+  } FT_Parameter;
+
+

+
+

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.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Open_Args

+
+
+  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;
+
+

+
+

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. With other words, applications should treat them as read-only.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_New_Face

+
+
+  FT_EXPORT( FT_Error )
+  FT_New_Face( FT_Library   library,
+               const char*  filepathname,
+               FT_Long      face_index,
+               FT_Face     *aface );
+
+

+
+

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.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_New_Memory_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 );
+
+

+
+

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.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Open_Face

+
+
+  FT_EXPORT( FT_Error )
+  FT_Open_Face( FT_Library           library,
+                const FT_Open_Args*  args,
+                FT_Long              face_index,
+                FT_Face             *aface );
+
+

+
+

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’.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Attach_File

+
+
+  FT_EXPORT( FT_Error )
+  FT_Attach_File( FT_Face      face,
+                  const char*  filepathname );
+
+

+
+

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.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Attach_Stream

+
+
+  FT_EXPORT( FT_Error )
+  FT_Attach_Stream( FT_Face        face,
+                    FT_Open_Args*  parameters );
+
+

+
+

‘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.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Done_Face

+
+
+  FT_EXPORT( FT_Error )
+  FT_Done_Face( FT_Face  face );
+
+

+
+

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.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Select_Size

+
+
+  FT_EXPORT( FT_Error )
+  FT_Select_Size( FT_Face  face,
+                  FT_Int   strike_index );
+
+

+
+

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.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Size_Request_Type

+
+
+  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;
+
+

+
+

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.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Size_RequestRec

+
+
+  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, *FT_Size_Request;
+
+

+
+

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.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Request_Size

+
+
+  FT_EXPORT( FT_Error )
+  FT_Request_Size( FT_Face          face,
+                   FT_Size_Request  req );
+
+

+
+

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.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Set_Char_Size

+
+
+  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 );
+
+

+
+

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.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Set_Pixel_Sizes

+
+
+  FT_EXPORT( FT_Error )
+  FT_Set_Pixel_Sizes( FT_Face  face,
+                      FT_UInt  pixel_width,
+                      FT_UInt  pixel_height );
+
+

+
+

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.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Load_Glyph

+
+
+  FT_EXPORT( FT_Error )
+  FT_Load_Glyph( FT_Face   face,
+                 FT_UInt   glyph_index,
+                 FT_Int32  load_flags );
+
+

+
+

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.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Load_Char

+
+
+  FT_EXPORT( FT_Error )
+  FT_Load_Char( FT_Face   face,
+                FT_ULong  char_code,
+                FT_Int32  load_flags );
+
+

+
+

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.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_LOAD_XXX

+
+
+#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
+
+  /* temporary hack! */
+#define FT_LOAD_SBITS_ONLY                   0x4000
+#define FT_LOAD_NO_AUTOHINT                  0x8000U
+
+

+
+

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 use FT_LOAD_TARGET_MONO instead 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.

+

Besides deciding which hinter to use, you can also decide which hinting algorithm to use. See FT_LOAD_TARGET_XXX for details.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_LOAD_TARGET_XXX

+
+
+#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 ) )
+
+

+
+

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 );
+
+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Set_Transform

+
+
+  FT_EXPORT( void )
+  FT_Set_Transform( FT_Face     face,
+                    FT_Matrix*  matrix,
+                    FT_Vector*  delta );
+
+

+
+

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’.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Render_Mode

+
+
+  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;
+
+

+
+

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 the ‘bitmap->pixel_mode’ field in the FT_GlyphSlotRec structure gives the format of the returned bitmap.

+

+
values
+ + + + + + +
FT_RENDER_MODE_NORMAL +

This is the default render mode; it corresponds to 8-bit anti-aliased bitmaps, using 256 levels of opacity.

+
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.

+
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 are not filtered to reduce color-fringes. It is up to the caller to perform this pass.

+
+
+
+ + +
[Index][TOC]
+ +
+

ft_render_mode_xxx

+
+
+#define ft_render_mode_normal  FT_RENDER_MODE_NORMAL
+#define ft_render_mode_mono    FT_RENDER_MODE_MONO
+
+

+
+

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

+
+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Render_Glyph

+
+
+  FT_EXPORT( FT_Error )
+  FT_Render_Glyph( FT_GlyphSlot    slot,
+                   FT_Render_Mode  render_mode );
+
+

+
+

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.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Kerning_Mode

+
+
+  typedef enum  FT_Kerning_Mode_
+  {
+    FT_KERNING_DEFAULT  = 0,
+    FT_KERNING_UNFITTED,
+    FT_KERNING_UNSCALED
+
+  } FT_Kerning_Mode;
+
+

+
+

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.

+
+
+
+
+ + +
[Index][TOC]
+ +
+

ft_kerning_default

+
+
+#define ft_kerning_default   FT_KERNING_DEFAULT
+
+

+
+

This constant is deprecated. Please use FT_KERNING_DEFAULT instead.

+

+
+
+ + +
[Index][TOC]
+ +
+

ft_kerning_unfitted

+
+
+#define ft_kerning_unfitted  FT_KERNING_UNFITTED
+
+

+
+

This constant is deprecated. Please use FT_KERNING_UNFITTED instead.

+

+
+
+ + +
[Index][TOC]
+ +
+

ft_kerning_unscaled

+
+
+#define ft_kerning_unscaled  FT_KERNING_UNSCALED
+
+

+
+

This constant is deprecated. Please use FT_KERNING_UNSCALED instead.

+

+
+
+ + +
[Index][TOC]
+ +
+

FT_Get_Kerning

+
+
+  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 );
+
+

+
+

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.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Get_Track_Kerning

+
+
+  FT_EXPORT( FT_Error )
+  FT_Get_Track_Kerning( FT_Face    face,
+                        FT_Fixed   point_size,
+                        FT_Int     degree,
+                        FT_Fixed*  akerning );
+
+

+
+

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.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Get_Glyph_Name

+
+
+  FT_EXPORT( FT_Error )
+  FT_Get_Glyph_Name( FT_Face     face,
+                     FT_UInt     glyph_index,
+                     FT_Pointer  buffer,
+                     FT_UInt     buffer_max );
+
+

+
+

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’.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Get_Postscript_Name

+
+
+  FT_EXPORT( const char* )
+  FT_Get_Postscript_Name( FT_Face  face );
+
+

+
+

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.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Select_Charmap

+
+
+  FT_EXPORT( FT_Error )
+  FT_Select_Charmap( FT_Face      face,
+                     FT_Encoding  encoding );
+
+

+
+

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. It is thus preferable to FT_Set_Charmap in this case.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Set_Charmap

+
+
+  FT_EXPORT( FT_Error )
+  FT_Set_Charmap( FT_Face     face,
+                  FT_CharMap  charmap );
+
+

+
+

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).

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Get_Charmap_Index

+
+
+  FT_EXPORT( FT_Int )
+  FT_Get_Charmap_Index( FT_CharMap  charmap );
+
+

+
+

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.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Get_Char_Index

+
+
+  FT_EXPORT( FT_UInt )
+  FT_Get_Char_Index( FT_Face   face,
+                     FT_ULong  charcode );
+
+

+
+

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’.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Get_First_Char

+
+
+  FT_EXPORT( FT_ULong )
+  FT_Get_First_Char( FT_Face   face,
+                     FT_UInt  *agindex );
+
+

+
+

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 when the value 0 is the first valid character code.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Get_Next_Char

+
+
+  FT_EXPORT( FT_ULong )
+  FT_Get_Next_Char( FT_Face    face,
+                    FT_ULong   char_code,
+                    FT_UInt   *agindex );
+
+

+
+

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 first 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.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Get_Name_Index

+
+
+  FT_EXPORT( FT_UInt )
+  FT_Get_Name_Index( FT_Face     face,
+                     FT_String*  glyph_name );
+
+

+
+

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’.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_SUBGLYPH_FLAG_XXX

+
+
+#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
+
+

+
+

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
+

+
+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Get_SubGlyph_Info

+
+
+  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 );
+
+

+
+

Retrieve a description of a given subglyph. Only use it if ‘glyph->format’ is FT_GLYPH_FORMAT_COMPOSITE, or an error is returned.

+

+
input
+ + + +
glyph +

The source glyph slot.

+
sub_index +

The index of 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.

+
+
+
+ + +
[Index][TOC]
+ + + diff --git a/src/WinLibs/freetype-2.3.5/docs/reference/ft2-basic_types.html b/src/WinLibs/freetype-2.3.5/docs/reference/ft2-basic_types.html new file mode 100644 index 000000000..4e25a9eda --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/docs/reference/ft2-basic_types.html @@ -0,0 +1,1035 @@ + + + + +FreeType-2.3.5 API Reference + + + +

FreeType-2.3.5 API Reference

+ +

+Basic Data Types +

+

Synopsis

+ + + + + + + + + + + + + + +
FT_ByteFT_TagFT_Pixel_Mode
FT_BytesFT_Errorft_pixel_mode_xxx
FT_CharFT_FixedFT_Palette_Mode
FT_IntFT_PointerFT_Bitmap
FT_UIntFT_PosFT_IMAGE_TAG
FT_ShortFT_VectorFT_Glyph_Format
FT_UShortFT_BBoxft_glyph_format_xxx
FT_LongFT_MatrixFT_Data
FT_ULongFT_FWordFT_Generic_Finalizer
FT_BoolFT_UFWordFT_Generic
FT_OffsetFT_F2Dot14FT_MAKE_TAG
FT_PtrDistFT_UnitVector
FT_StringFT_F26Dot6


+ +
+

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.

+

+
+

FT_Byte

+
+
+  typedef unsigned char  FT_Byte;
+
+

+
+

A simple typedef for the unsigned char type.

+

+
+
+ + +
[Index][TOC]
+ +
+

FT_Bytes

+
+
+  typedef const FT_Byte*  FT_Bytes;
+
+

+
+

A typedef for constant memory areas.

+

+
+
+ + +
[Index][TOC]
+ +
+

FT_Char

+
+
+  typedef signed char  FT_Char;
+
+

+
+

A simple typedef for the signed char type.

+

+
+
+ + +
[Index][TOC]
+ +
+

FT_Int

+
+
+  typedef signed int  FT_Int;
+
+

+
+

A typedef for the int type.

+

+
+
+ + +
[Index][TOC]
+ +
+

FT_UInt

+
+
+  typedef unsigned int  FT_UInt;
+
+

+
+

A typedef for the unsigned int type.

+

+
+
+ + +
[Index][TOC]
+ +
+

FT_Short

+
+
+  typedef signed short  FT_Short;
+
+

+
+

A typedef for signed short.

+

+
+
+ + +
[Index][TOC]
+ +
+

FT_UShort

+
+
+  typedef unsigned short  FT_UShort;
+
+

+
+

A typedef for unsigned short.

+

+
+
+ + +
[Index][TOC]
+ +
+

FT_Long

+
+
+  typedef signed long  FT_Long;
+
+

+
+

A typedef for signed long.

+

+
+
+ + +
[Index][TOC]
+ +
+

FT_ULong

+
+
+  typedef unsigned long  FT_ULong;
+
+

+
+

A typedef for unsigned long.

+

+
+
+ + +
[Index][TOC]
+ +
+

FT_Bool

+
+
+  typedef unsigned char  FT_Bool;
+
+

+
+

A typedef of unsigned char, used for simple booleans. As usual, values 1 and 0 represent true and false, respectively.

+

+
+
+ + +
[Index][TOC]
+ +
+

FT_Offset

+
+
+  typedef size_t  FT_Offset;
+
+

+
+

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.

+

+
+
+ + +
[Index][TOC]
+ +
+

FT_PtrDist

+
+
+  typedef ft_ptrdiff_t  FT_PtrDist;
+
+

+
+

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.

+

+
+
+ + +
[Index][TOC]
+ +
+

FT_String

+
+
+  typedef char  FT_String;
+
+

+
+

A simple typedef for the char type, usually used for strings.

+

+
+
+ + +
[Index][TOC]
+ +
+

FT_Tag

+
+
+  typedef FT_UInt32  FT_Tag;
+
+

+
+

A typedef for 32bit tags (as used in the SFNT format).

+

+
+
+ + +
[Index][TOC]
+ +
+

FT_Error

+
+
+  typedef int  FT_Error;
+
+

+
+

The FreeType error code type. A value of 0 is always interpreted as a successful operation.

+

+
+
+ + +
[Index][TOC]
+ +
+

FT_Fixed

+
+
+  typedef signed long  FT_Fixed;
+
+

+
+

This type is used to store 16.16 fixed float values, like scaling values or matrix coefficients.

+

+
+
+ + +
[Index][TOC]
+ +
+

FT_Pointer

+
+
+  typedef void*  FT_Pointer;
+
+

+
+

A simple typedef for a typeless pointer.

+

+
+
+ + +
[Index][TOC]
+ +
+

FT_Pos

+
+
+  typedef signed long  FT_Pos;
+
+

+
+

The type FT_Pos is a 32-bit integer 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.

+

+
+
+ + +
[Index][TOC]
+ +
+

FT_Vector

+
+
+  typedef struct  FT_Vector_
+  {
+    FT_Pos  x;
+    FT_Pos  y;
+
+  } FT_Vector;
+
+

+
+

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.

+
+
+
+
+ + +
[Index][TOC]
+ +
+

FT_BBox

+
+
+  typedef struct  FT_BBox_
+  {
+    FT_Pos  xMin, yMin;
+    FT_Pos  xMax, yMax;
+
+  } FT_BBox;
+
+

+
+

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).

+
+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Matrix

+
+
+  typedef struct  FT_Matrix_
+  {
+    FT_Fixed  xx, xy;
+    FT_Fixed  yx, yy;
+
+  } FT_Matrix;
+
+

+
+

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.

+
+
+
+
+ + +
[Index][TOC]
+ +
+

FT_FWord

+
+
+  typedef signed short  FT_FWord;   /* distance in FUnits */
+
+

+
+

A signed 16-bit integer used to store a distance in original font units.

+

+
+
+ + +
[Index][TOC]
+ +
+

FT_UFWord

+
+
+  typedef unsigned short  FT_UFWord;  /* unsigned distance */
+
+

+
+

An unsigned 16-bit integer used to store a distance in original font units.

+

+
+
+ + +
[Index][TOC]
+ +
+

FT_F2Dot14

+
+
+  typedef signed short  FT_F2Dot14;
+
+

+
+

A signed 2.14 fixed float type used for unit vectors.

+

+
+
+ + +
[Index][TOC]
+ +
+

FT_UnitVector

+
+
+  typedef struct  FT_UnitVector_
+  {
+    FT_F2Dot14  x;
+    FT_F2Dot14  y;
+
+  } FT_UnitVector;
+
+

+
+

A simple structure used to store a 2D vector unit vector. Uses FT_F2Dot14 types.

+

+
fields
+ + + +
x +

Horizontal coordinate.

+
y +

Vertical coordinate.

+
+
+
+
+ + +
[Index][TOC]
+ +
+

FT_F26Dot6

+
+
+  typedef signed long  FT_F26Dot6;
+
+

+
+

A signed 26.6 fixed float type used for vectorial pixel coordinates.

+

+
+
+ + +
[Index][TOC]
+ +
+

FT_Pixel_Mode

+
+
+  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;
+
+

+
+

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 value ‘gray’ levels is stored in the ‘num_bytes’ field of the FT_Bitmap structure (it generally is 256).

+
FT_PIXEL_MODE_GRAY2 +

A 2-bit/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/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_LCD +

An 8-bit bitmap, used to represent 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, used to represent 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.

+
+
+
+
+ + +
[Index][TOC]
+ +
+

ft_pixel_mode_xxx

+
+
+#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
+
+

+
+

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.

+
+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Palette_Mode

+
+
+  typedef enum  FT_Palette_Mode_
+  {
+    ft_palette_mode_rgb = 0,
+    ft_palette_mode_rgba,
+
+    ft_palettte_mode_max   /* do not remove */
+
+  } FT_Palette_Mode;
+
+

+
+

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.

+

+
fields
+ + + +
ft_palette_mode_rgb +

The palette is an array of 3-bytes RGB records.

+
ft_palette_mode_rgba +

The palette is an array of 4-bytes 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.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Bitmap

+
+
+  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;
+
+

+
+

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.

+
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.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_IMAGE_TAG

+
+
+#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 */
+
+

+
+

This macro converts four-letter tags to an unsigned long type.

+

+
note
+

Since many 16bit compilers don't like 32bit 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.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Glyph_Format

+
+
+  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;
+
+

+
+

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.

+
+
+
+
+ + +
[Index][TOC]
+ +
+

ft_glyph_format_xxx

+
+
+#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
+
+

+
+

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.

+
+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Data

+
+
+  typedef struct  FT_Data_
+  {
+    const FT_Byte*  pointer;
+    FT_Int          length;
+
+  } FT_Data;
+
+

+
+

Read-only binary data represented as a pointer and a length.

+

+
fields
+ + + +
pointer +

The data.

+
length +

The length of the data in bytes.

+
+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Generic_Finalizer

+
+
+  typedef void  (*FT_Generic_Finalizer)(void*  object);
+
+

+
+

Describes 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.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Generic

+
+
+  typedef struct  FT_Generic_
+  {
+    void*                 data;
+    FT_Generic_Finalizer  finalizer;
+
+  } FT_Generic;
+
+

+
+

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.

+
+
+
+
+ + +
[Index][TOC]
+ +
+

FT_MAKE_TAG

+
+
+#define FT_MAKE_TAG( _x1, _x2, _x3, _x4 ) \
+          ( ( (FT_ULong)_x1 << 24 ) |     \
+            ( (FT_ULong)_x2 << 16 ) |     \
+            ( (FT_ULong)_x3 <<  8 ) |     \
+              (FT_ULong)_x4         )
+
+

+
+

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 32bit integers. Don't redefine this macro.

+
+
+
+ + +
[Index][TOC]
+ + + diff --git a/src/WinLibs/freetype-2.3.5/docs/reference/ft2-bdf_fonts.html b/src/WinLibs/freetype-2.3.5/docs/reference/ft2-bdf_fonts.html new file mode 100644 index 000000000..87387ac11 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/docs/reference/ft2-bdf_fonts.html @@ -0,0 +1,241 @@ + + + + +FreeType-2.3.5 API Reference + + + +

FreeType-2.3.5 API Reference

+ +

+BDF Files +

+

Synopsis

+ + + +
FT_PropertyTypeBDF_PropertyRecFT_Get_BDF_Property
BDF_PropertyFT_Get_BDF_Charset_ID


+ +
+

This section contains the declaration of BDF specific functions.

+

+
+

FT_PropertyType

+
+
+  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;
+
+

+
+

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.

+
+
+
+
+ + +
[Index][TOC]
+ +
+

BDF_Property

+
+
+  typedef struct BDF_PropertyRec_*  BDF_Property;
+
+

+
+

A handle to a BDF_PropertyRec structure to model a given BDF/PCF property.

+

+
+
+ + +
[Index][TOC]
+ +
+

BDF_PropertyRec

+
+
+  typedef struct  BDF_PropertyRec_
+  {
+    BDF_PropertyType  type;
+    union {
+      const char*     atom;
+      FT_Int32        integer;
+      FT_UInt32       cardinal;
+
+    } u;
+
+  } BDF_PropertyRec;
+
+

+
+

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.

+
+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Get_BDF_Charset_ID

+
+
+  FT_EXPORT( FT_Error )
+  FT_Get_BDF_Charset_ID( FT_Face       face,
+                         const char*  *acharset_encoding,
+                         const char*  *acharset_registry );
+
+

+
+

Retrieves 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.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Get_BDF_Property

+
+
+  FT_EXPORT( FT_Error )
+  FT_Get_BDF_Property( FT_Face           face,
+                       const char*       prop_name,
+                       BDF_PropertyRec  *aproperty );
+
+

+
+

Retrieves 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.

+

In case of error, ‘aproperty->type’ is always set to BDF_PROPERTY_TYPE_NONE.

+
+
+
+ + +
[Index][TOC]
+ + + diff --git a/src/WinLibs/freetype-2.3.5/docs/reference/ft2-bitmap_handling.html b/src/WinLibs/freetype-2.3.5/docs/reference/ft2-bitmap_handling.html new file mode 100644 index 000000000..93f502a14 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/docs/reference/ft2-bitmap_handling.html @@ -0,0 +1,249 @@ + + + + +FreeType-2.3.5 API Reference + + + +

FreeType-2.3.5 API Reference

+ +

+Bitmap Handling +

+

Synopsis

+ + + +
FT_Bitmap_NewFT_Bitmap_EmboldenFT_Bitmap_Done
FT_Bitmap_CopyFT_Bitmap_Convert


+ +
+

This section contains functions for converting FT_Bitmap objects.

+

+
+

FT_Bitmap_New

+
+
+  FT_EXPORT( void )
+  FT_Bitmap_New( FT_Bitmap  *abitmap );
+
+

+
+

Initialize a pointer to an FT_Bitmap structure.

+

+
inout
+ + +
abitmap +

A pointer to the bitmap structure.

+
+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Bitmap_Copy

+
+
+  FT_EXPORT( FT_Error )
+  FT_Bitmap_Copy( FT_Library        library,
+                  const FT_Bitmap  *source,
+                  FT_Bitmap        *target);
+
+

+
+

Copies an 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.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Bitmap_Embolden

+
+
+  FT_EXPORT( FT_Error )
+  FT_Bitmap_Embolden( FT_Library  library,
+                      FT_Bitmap*  bitmap,
+                      FT_Pos      xStrength,
+                      FT_Pos      yStrength );
+
+

+
+

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.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Bitmap_Convert

+
+
+  FT_EXPORT( FT_Error )
+  FT_Bitmap_Convert( FT_Library        library,
+                     const FT_Bitmap  *source,
+                     FT_Bitmap        *target,
+                     FT_Int            alignment );
+
+

+
+

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.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Bitmap_Done

+
+
+  FT_EXPORT( FT_Error )
+  FT_Bitmap_Done( FT_Library  library,
+                  FT_Bitmap  *bitmap );
+
+

+
+

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.

+
+
+
+ + +
[Index][TOC]
+ + + diff --git a/src/WinLibs/freetype-2.3.5/docs/reference/ft2-cache_subsystem.html b/src/WinLibs/freetype-2.3.5/docs/reference/ft2-cache_subsystem.html new file mode 100644 index 000000000..5fa24c505 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/docs/reference/ft2-cache_subsystem.html @@ -0,0 +1,1087 @@ + + + + +FreeType-2.3.5 API Reference + + + +

FreeType-2.3.5 API Reference

+ +

+Cache Sub-System +

+

Synopsis

+ + + + + + + + + + + + + + + +
FTC_ManagerFTC_CMapCache_Lookup
FTC_FaceIDFTC_ImageTypeRec
FTC_Face_RequesterFTC_ImageType
FTC_NodeFTC_ImageCache
FTC_Manager_NewFTC_ImageCache_New
FTC_Manager_ResetFTC_ImageCache_Lookup
FTC_Manager_DoneFTC_ImageCache_LookupScaler
FTC_Manager_LookupFaceFTC_SBit
FTC_ScalerRecFTC_SBitRec
FTC_Manager_LookupSizeFTC_SBitCache
FTC_Node_UnrefFTC_SBitCache_New
FTC_Manager_RemoveFaceIDFTC_SBitCache_Lookup
FTC_CMapCacheFTC_SBitCache_LookupScaler
FTC_CMapCache_New


+ +
+

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.

+

+
+

FTC_Manager

+
+
+  typedef struct FTC_ManagerRec_*  FTC_Manager;
+
+

+
+

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.

+

+
+
+ + +
[Index][TOC]
+ +
+

FTC_FaceID

+
+
+  typedef struct FTC_FaceIDRec_*  FTC_FaceID;
+
+

+
+

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.

+
+
+
+ + +
[Index][TOC]
+ +
+

FTC_Face_Requester

+
+
+  typedef FT_Error
+  (*FTC_Face_Requester)( FTC_FaceID  face_id,
+                         FT_Library  library,
+                         FT_Pointer  request_data,
+                         FT_Face*    aface );
+
+

+
+

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!

+
+
+
+ + +
[Index][TOC]
+ +
+

FTC_Node

+
+
+  typedef struct FTC_NodeRec_*  FTC_Node;
+
+

+
+

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.

+

+
+
+ + +
[Index][TOC]
+ +
+

FTC_Manager_New

+
+
+  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 );
+
+

+
+

Creates 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.

+
+
+
+ + +
[Index][TOC]
+ +
+

FTC_Manager_Reset

+
+
+  FT_EXPORT( void )
+  FTC_Manager_Reset( FTC_Manager  manager );
+
+

+
+

Empties 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.

+
+
+
+
+ + +
[Index][TOC]
+ +
+

FTC_Manager_Done

+
+
+  FT_EXPORT( void )
+  FTC_Manager_Done( FTC_Manager  manager );
+
+

+
+

Destroys a given manager after emptying it.

+

+
input
+ + +
manager +

A handle to the target cache manager object.

+
+
+
+
+ + +
[Index][TOC]
+ +
+

FTC_Manager_LookupFace

+
+
+  FT_EXPORT( FT_Error )
+  FTC_Manager_LookupFace( FTC_Manager  manager,
+                          FTC_FaceID   face_id,
+                          FT_Face     *aface );
+
+

+
+

Retrieves 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.

+
+
+
+ + +
[Index][TOC]
+ +
+

FTC_ScalerRec

+
+
+  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, *FTC_Scaler;
+
+

+
+

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.

+
+
+
+ + +
[Index][TOC]
+ +
+

FTC_Manager_LookupSize

+
+
+  FT_EXPORT( FT_Error )
+  FTC_Manager_LookupSize( FTC_Manager  manager,
+                          FTC_Scaler   scaler,
+                          FT_Size     *asize );
+
+

+
+

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.

+
+
+
+ + +
[Index][TOC]
+ +
+

FTC_Node_Unref

+
+
+  FT_EXPORT( void )
+  FTC_Node_Unref( FTC_Node     node,
+                  FTC_Manager  manager );
+
+

+
+

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.

+
+
+
+
+ + +
[Index][TOC]
+ +
+

FTC_Manager_RemoveFaceID

+
+
+  FT_EXPORT( void )
+  FTC_Manager_RemoveFaceID( FTC_Manager  manager,
+                            FTC_FaceID   face_id );
+
+

+
+

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.

+
+
+
+ + +
[Index][TOC]
+ +
+

FTC_CMapCache

+
+
+  typedef struct FTC_CMapCacheRec_*  FTC_CMapCache;
+
+

+
+

An opaque handle used to model a charmap cache. This cache is to hold character codes -> glyph indices mappings.

+

+
+
+ + +
[Index][TOC]
+ +
+

FTC_CMapCache_New

+
+
+  FT_EXPORT( FT_Error )
+  FTC_CMapCache_New( FTC_Manager     manager,
+                     FTC_CMapCache  *acache );
+
+

+
+

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.

+
+
+
+ + +
[Index][TOC]
+ +
+

FTC_CMapCache_Lookup

+
+
+  FT_EXPORT( FT_UInt )
+  FTC_CMapCache_Lookup( FTC_CMapCache  cache,
+                        FTC_FaceID     face_id,
+                        FT_Int         cmap_index,
+                        FT_UInt32      char_code );
+
+

+
+

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.

+
char_code +

The character code (in the corresponding charmap).

+
+
+
return
+

Glyph index. 0 means ‘no glyph’.

+
+
+
+ + +
[Index][TOC]
+ +
+

FTC_ImageTypeRec

+
+
+  typedef struct  FTC_ImageTypeRec_
+  {
+    FTC_FaceID  face_id;
+    FT_Int      width;
+    FT_Int      height;
+    FT_Int32    flags;
+
+  } FTC_ImageTypeRec;
+
+

+
+

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.

+
+
+
+
+ + +
[Index][TOC]
+ +
+

FTC_ImageType

+
+
+  typedef struct FTC_ImageTypeRec_*  FTC_ImageType;
+
+

+
+

A handle to an FTC_ImageTypeRec structure.

+

+
+
+ + +
[Index][TOC]
+ +
+

FTC_ImageCache

+
+
+  typedef struct FTC_ImageCacheRec_*  FTC_ImageCache;
+
+

+
+

A handle to an glyph image cache object. They are designed to hold many distinct glyph images while not exceeding a certain memory threshold.

+

+
+
+ + +
[Index][TOC]
+ +
+

FTC_ImageCache_New

+
+
+  FT_EXPORT( FT_Error )
+  FTC_ImageCache_New( FTC_Manager      manager,
+                      FTC_ImageCache  *acache );
+
+

+
+

Creates 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.

+
+
+
+ + +
[Index][TOC]
+ +
+

FTC_ImageCache_Lookup

+
+
+  FT_EXPORT( FT_Error )
+  FTC_ImageCache_Lookup( FTC_ImageCache  cache,
+                         FTC_ImageType   type,
+                         FT_UInt         gindex,
+                         FT_Glyph       *aglyph,
+                         FTC_Node       *anode );
+
+

+
+

Retrieves 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!

+
+
+
+ + +
[Index][TOC]
+ +
+

FTC_ImageCache_LookupScaler

+
+
+  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 );
+
+

+
+

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!

+
+
+
+ + +
[Index][TOC]
+ +
+

FTC_SBit

+
+
+  typedef struct FTC_SBitRec_*  FTC_SBit;
+
+

+
+

A handle to a small bitmap descriptor. See the FTC_SBitRec structure for details.

+

+
+
+ + +
[Index][TOC]
+ +
+

FTC_SBitRec

+
+
+  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;
+
+

+
+

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.

+
+
+
+
+ + +
[Index][TOC]
+ +
+

FTC_SBitCache

+
+
+  typedef struct FTC_SBitCacheRec_*  FTC_SBitCache;
+
+

+
+

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.

+

+
+
+ + +
[Index][TOC]
+ +
+

FTC_SBitCache_New

+
+
+  FT_EXPORT( FT_Error )
+  FTC_SBitCache_New( FTC_Manager     manager,
+                     FTC_SBitCache  *acache );
+
+

+
+

Creates 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.

+
+
+
+ + +
[Index][TOC]
+ +
+

FTC_SBitCache_Lookup

+
+
+  FT_EXPORT( FT_Error )
+  FTC_SBitCache_Lookup( FTC_SBitCache    cache,
+                        FTC_ImageType    type,
+                        FT_UInt          gindex,
+                        FTC_SBit        *sbit,
+                        FTC_Node        *anode );
+
+

+
+

Looks 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!

+
+
+
+ + +
[Index][TOC]
+ +
+

FTC_SBitCache_LookupScaler

+
+
+  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 );
+
+

+
+

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!

+
+
+
+ + +
[Index][TOC]
+ + + diff --git a/src/WinLibs/freetype-2.3.5/docs/reference/ft2-computations.html b/src/WinLibs/freetype-2.3.5/docs/reference/ft2-computations.html new file mode 100644 index 000000000..9a03b7863 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/docs/reference/ft2-computations.html @@ -0,0 +1,777 @@ + + + + +FreeType-2.3.5 API Reference + + + +

FreeType-2.3.5 API Reference

+ +

+Computations +

+

Synopsis

+ + + + + + + + + +
FT_MulDivFT_Matrix_InvertFT_Tan
FT_MulFixFT_AngleFT_Atan2
FT_DivFixFT_ANGLE_PIFT_Angle_Diff
FT_RoundFixFT_ANGLE_2PIFT_Vector_Unit
FT_CeilFixFT_ANGLE_PI2FT_Vector_Rotate
FT_FloorFixFT_ANGLE_PI4FT_Vector_Length
FT_Vector_TransformFT_SinFT_Vector_Polarize
FT_Matrix_MultiplyFT_CosFT_Vector_From_Polar


+ +
+

This section contains various functions used to perform computations on 16.16 fixed-float numbers or 2d vectors.

+

+
+

FT_MulDiv

+
+
+  FT_EXPORT( FT_Long )
+  FT_MulDiv( FT_Long  a,
+             FT_Long  b,
+             FT_Long  c );
+
+

+
+

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’.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_MulFix

+
+
+  FT_EXPORT( FT_Long )
+  FT_MulFix( FT_Long  a,
+             FT_Long  b );
+
+

+
+

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.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_DivFix

+
+
+  FT_EXPORT( FT_Long )
+  FT_DivFix( FT_Long  a,
+             FT_Long  b );
+
+

+
+

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.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_RoundFix

+
+
+  FT_EXPORT( FT_Fixed )
+  FT_RoundFix( FT_Fixed  a );
+
+

+
+

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’.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_CeilFix

+
+
+  FT_EXPORT( FT_Fixed )
+  FT_CeilFix( FT_Fixed  a );
+
+

+
+

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’.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_FloorFix

+
+
+  FT_EXPORT( FT_Fixed )
+  FT_FloorFix( FT_Fixed  a );
+
+

+
+

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’.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Vector_Transform

+
+
+  FT_EXPORT( void )
+  FT_Vector_Transform( FT_Vector*        vec,
+                       const FT_Matrix*  matrix );
+
+

+
+

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.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Matrix_Multiply

+
+
+  FT_EXPORT( void )
+  FT_Matrix_Multiply( const FT_Matrix*  a,
+                      FT_Matrix*  b );
+
+

+
+

Performs 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.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Matrix_Invert

+
+
+  FT_EXPORT( FT_Error )
+  FT_Matrix_Invert( FT_Matrix*  matrix );
+
+

+
+

Inverts a 2x2 matrix. Returns 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.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Angle

+
+
+  typedef FT_Fixed  FT_Angle;
+
+

+
+

This type is used to model angle values in FreeType. Note that the angle is a 16.16 fixed float value expressed in degrees.

+

+
+
+ + +
[Index][TOC]
+ +
+

FT_ANGLE_PI

+
+
+#define FT_ANGLE_PI  ( 180L << 16 )
+
+

+
+

The angle pi expressed in FT_Angle units.

+

+
+
+ + +
[Index][TOC]
+ +
+

FT_ANGLE_2PI

+
+
+#define FT_ANGLE_2PI  ( FT_ANGLE_PI * 2 )
+
+

+
+

The angle 2*pi expressed in FT_Angle units.

+

+
+
+ + +
[Index][TOC]
+ +
+

FT_ANGLE_PI2

+
+
+#define FT_ANGLE_PI2  ( FT_ANGLE_PI / 2 )
+
+

+
+

The angle pi/2 expressed in FT_Angle units.

+

+
+
+ + +
[Index][TOC]
+ +
+

FT_ANGLE_PI4

+
+
+#define FT_ANGLE_PI4  ( FT_ANGLE_PI / 4 )
+
+

+
+

The angle pi/4 expressed in FT_Angle units.

+

+
+
+ + +
[Index][TOC]
+ +
+

FT_Sin

+
+
+  FT_EXPORT( FT_Fixed )
+  FT_Sin( FT_Angle  angle );
+
+

+
+

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.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Cos

+
+
+  FT_EXPORT( FT_Fixed )
+  FT_Cos( FT_Angle  angle );
+
+

+
+

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.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Tan

+
+
+  FT_EXPORT( FT_Fixed )
+  FT_Tan( FT_Angle  angle );
+
+

+
+

Return the tangent of a given angle in fixed point format.

+

+
input
+ + +
angle +

The input angle.

+
+
+
return
+

The tangent value.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Atan2

+
+
+  FT_EXPORT( FT_Angle )
+  FT_Atan2( FT_Fixed  x,
+            FT_Fixed  y );
+
+

+
+

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).

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Angle_Diff

+
+
+  FT_EXPORT( FT_Angle )
+  FT_Angle_Diff( FT_Angle  angle1,
+                 FT_Angle  angle2 );
+
+

+
+

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’.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Vector_Unit

+
+
+  FT_EXPORT( void )
+  FT_Vector_Unit( FT_Vector*  vec,
+                  FT_Angle    angle );
+
+

+
+

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.

+
+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Vector_Rotate

+
+
+  FT_EXPORT( void )
+  FT_Vector_Rotate( FT_Vector*  vec,
+                    FT_Angle    angle );
+
+

+
+

Rotate a vector by a given angle.

+

+
inout
+ + +
vec +

The address of target vector.

+
+
+
input
+ + +
angle +

The address of angle.

+
+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Vector_Length

+
+
+  FT_EXPORT( FT_Fixed )
+  FT_Vector_Length( FT_Vector*  vec );
+
+

+
+

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.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Vector_Polarize

+
+
+  FT_EXPORT( void )
+  FT_Vector_Polarize( FT_Vector*  vec,
+                      FT_Fixed   *length,
+                      FT_Angle   *angle );
+
+

+
+

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.

+
+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Vector_From_Polar

+
+
+  FT_EXPORT( void )
+  FT_Vector_From_Polar( FT_Vector*  vec,
+                        FT_Fixed    length,
+                        FT_Angle    angle );
+
+

+
+

Compute vector coordinates from a length and angle.

+

+
output
+ + +
vec +

The address of source vector.

+
+
+
input
+ + + +
length +

The vector length.

+
angle +

The vector angle.

+
+
+
+
+ + +
[Index][TOC]
+ + + diff --git a/src/WinLibs/freetype-2.3.5/docs/reference/ft2-font_formats.html b/src/WinLibs/freetype-2.3.5/docs/reference/ft2-font_formats.html new file mode 100644 index 000000000..c6f294c13 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/docs/reference/ft2-font_formats.html @@ -0,0 +1,75 @@ + + + + +FreeType-2.3.5 API Reference + + + +

FreeType-2.3.5 API Reference

+ +

+Font Formats +

+

Synopsis

+ + +
FT_Get_X11_Font_Format


+ +
+

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.

+

+
+

FT_Get_X11_Font_Format

+
+
+  FT_EXPORT( const char* )
+  FT_Get_X11_Font_Format( FT_Face  face );
+
+

+
+

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.

+
+
+
+ + +
[Index][TOC]
+ + + diff --git a/src/WinLibs/freetype-2.3.5/docs/reference/ft2-gasp_table.html b/src/WinLibs/freetype-2.3.5/docs/reference/ft2-gasp_table.html new file mode 100644 index 000000000..700108abc --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/docs/reference/ft2-gasp_table.html @@ -0,0 +1,131 @@ + + + + +FreeType-2.3.5 API Reference + + + +

FreeType-2.3.5 API Reference

+ +

+Gasp Table +

+

Synopsis

+ + +
FT_GASP_XXXFT_Get_Gasp


+ +
+

The function FT_Get_Gasp can be used to query a TrueType or OpenType font for specific entries in their ‘gasp’ table, if any. This is mainly useful when implementing native TrueType hinting with the bytecode interpreter to duplicate the Windows text rendering results.

+

+
+

FT_GASP_XXX

+
+
+#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
+
+

+
+

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

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Get_Gasp

+
+
+  FT_EXPORT( FT_Int )
+  FT_Get_Gasp( FT_Face  face,
+               FT_UInt  ppem );
+
+

+
+

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 is there is no ‘gasp’ table in the face.

+
+
since
+

2.3.0

+
+
+
+ + +
[Index][TOC]
+ + + diff --git a/src/WinLibs/freetype-2.3.5/docs/reference/ft2-glyph_management.html b/src/WinLibs/freetype-2.3.5/docs/reference/ft2-glyph_management.html new file mode 100644 index 000000000..033aa894b --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/docs/reference/ft2-glyph_management.html @@ -0,0 +1,601 @@ + + + + +FreeType-2.3.5 API Reference + + + +

FreeType-2.3.5 API Reference

+ +

+Glyph Management +

+

Synopsis

+ + + + + + +
FT_GlyphFT_OutlineGlyphRecft_glyph_bbox_xxx
FT_GlyphRecFT_Get_GlyphFT_Glyph_Get_CBox
FT_BitmapGlyphFT_Glyph_CopyFT_Glyph_To_Bitmap
FT_BitmapGlyphRecFT_Glyph_TransformFT_Done_Glyph
FT_OutlineGlyphFT_Glyph_BBox_Mode


+ +
+

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.

+

+
+

FT_Glyph

+
+
+  typedef struct FT_GlyphRec_*  FT_Glyph;
+
+

+
+

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.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_GlyphRec

+
+
+  typedef struct  FT_GlyphRec_
+  {
+    FT_Library             library;
+    const FT_Glyph_Class*  clazz;
+    FT_Glyph_Format        format;
+    FT_Vector              advance;
+
+  } FT_GlyphRec;
+
+

+
+

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.

+
+
+
+
+ + +
[Index][TOC]
+ +
+

FT_BitmapGlyph

+
+
+  typedef struct FT_BitmapGlyphRec_*  FT_BitmapGlyph;
+
+

+
+

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.

+

+
+
+ + +
[Index][TOC]
+ +
+

FT_BitmapGlyphRec

+
+
+  typedef struct  FT_BitmapGlyphRec_
+  {
+    FT_GlyphRec  root;
+    FT_Int       left;
+    FT_Int       top;
+    FT_Bitmap    bitmap;
+
+  } FT_BitmapGlyphRec;
+
+

+
+

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.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_OutlineGlyph

+
+
+  typedef struct FT_OutlineGlyphRec_*  FT_OutlineGlyph;
+
+

+
+

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.

+

+
+
+ + +
[Index][TOC]
+ +
+

FT_OutlineGlyphRec

+
+
+  typedef struct  FT_OutlineGlyphRec_
+  {
+    FT_GlyphRec  root;
+    FT_Outline   outline;
+
+  } FT_OutlineGlyphRec;
+
+

+
+

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 a 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.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Get_Glyph

+
+
+  FT_EXPORT( FT_Error )
+  FT_Get_Glyph( FT_GlyphSlot  slot,
+                FT_Glyph     *aglyph );
+
+

+
+

A function used to extract a glyph image from a slot.

+

+
input
+ + +
slot +

A handle to the source glyph slot.

+
+
+
output
+ + +
aglyph +

A handle to the glyph object.

+
+
+
return
+

FreeType error code. 0 means success.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Glyph_Copy

+
+
+  FT_EXPORT( FT_Error )
+  FT_Glyph_Copy( FT_Glyph   source,
+                 FT_Glyph  *target );
+
+

+
+

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.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Glyph_Transform

+
+
+  FT_EXPORT( FT_Error )
+  FT_Glyph_Transform( FT_Glyph    glyph,
+                      FT_Matrix*  matrix,
+                      FT_Vector*  delta );
+
+

+
+

Transforms 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.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Glyph_BBox_Mode

+
+
+  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;
+
+

+
+

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.

+
+
+
+
+ + +
[Index][TOC]
+ +
+

ft_glyph_bbox_xxx

+
+
+#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
+
+

+
+

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.

+
+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Glyph_Get_CBox

+
+
+  FT_EXPORT( void )
+  FT_Glyph_Get_CBox( FT_Glyph  glyph,
+                     FT_UInt   bbox_mode,
+                     FT_BBox  *acbox );
+
+

+
+

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.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Glyph_To_Bitmap

+
+
+  FT_EXPORT( FT_Error )
+  FT_Glyph_To_Bitmap( FT_Glyph*       the_glyph,
+                      FT_Render_Mode  render_mode,
+                      FT_Vector*      origin,
+                      FT_Bool         destroy );
+
+

+
+

Converts 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 describe 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
+

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. 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 + destroy old)     
+  if ( glyph->format != FT_GLYPH_FORMAT_BITMAP )                 
+  {                                                              
+    error = FT_Glyph_To_Bitmap( &glyph, FT_RENDER_MODE_DEFAULT,  
+                                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 );                                        
+
+

+

This function does nothing if the glyph format isn't scalable.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Done_Glyph

+
+
+  FT_EXPORT( void )
+  FT_Done_Glyph( FT_Glyph  glyph );
+
+

+
+

Destroys a given glyph.

+

+
input
+ + +
glyph +

A handle to the target glyph object.

+
+
+
+
+ + +
[Index][TOC]
+ + + diff --git a/src/WinLibs/freetype-2.3.5/docs/reference/ft2-glyph_stroker.html b/src/WinLibs/freetype-2.3.5/docs/reference/ft2-glyph_stroker.html new file mode 100644 index 000000000..3153ba8a2 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/docs/reference/ft2-glyph_stroker.html @@ -0,0 +1,874 @@ + + + + +FreeType-2.3.5 API Reference + + + +

FreeType-2.3.5 API Reference

+ +

+Glyph Stroker +

+

Synopsis

+ + + + + + + + + + + + +
FT_StrokerFT_Stroker_EndSubPath
FT_Stroker_LineJoinFT_Stroker_LineTo
FT_Stroker_LineCapFT_Stroker_ConicTo
FT_StrokerBorderFT_Stroker_CubicTo
FT_Outline_GetInsideBorderFT_Stroker_GetBorderCounts
FT_Outline_GetOutsideBorderFT_Stroker_ExportBorder
FT_Stroker_NewFT_Stroker_GetCounts
FT_Stroker_SetFT_Stroker_Export
FT_Stroker_RewindFT_Stroker_Done
FT_Stroker_ParseOutlineFT_Glyph_Stroke
FT_Stroker_BeginSubPathFT_Glyph_StrokeBorder


+ +
+

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.

+

+
+

FT_Stroker

+
+
+  typedef struct FT_StrokerRec_*  FT_Stroker;
+
+

+
+

Opaque handler to a path stroker object.

+

+
+
+ + +
[Index][TOC]
+ +
+

FT_Stroker_LineJoin

+
+
+  typedef enum
+  {
+    FT_STROKER_LINEJOIN_ROUND = 0,
+    FT_STROKER_LINEJOIN_BEVEL,
+    FT_STROKER_LINEJOIN_MITER
+
+  } FT_Stroker_LineJoin;
+
+

+
+

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).

+
+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Stroker_LineCap

+
+
+  typedef enum
+  {
+    FT_STROKER_LINECAP_BUTT = 0,
+    FT_STROKER_LINECAP_ROUND,
+    FT_STROKER_LINECAP_SQUARE
+
+  } FT_Stroker_LineCap;
+
+

+
+

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.

+
+
+
+
+ + +
[Index][TOC]
+ +
+

FT_StrokerBorder

+
+
+  typedef enum
+  {
+    FT_STROKER_BORDER_LEFT = 0,
+    FT_STROKER_BORDER_RIGHT
+
+  } FT_StrokerBorder;
+
+

+
+

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.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Outline_GetInsideBorder

+
+
+  FT_EXPORT( FT_StrokerBorder )
+  FT_Outline_GetInsideBorder( FT_Outline*  outline );
+
+

+
+

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_LEFT for empty or invalid outlines.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Outline_GetOutsideBorder

+
+
+  FT_EXPORT( FT_StrokerBorder )
+  FT_Outline_GetOutsideBorder( FT_Outline*  outline );
+
+

+
+

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.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Stroker_New

+
+
+  FT_EXPORT( FT_Error )
+  FT_Stroker_New( FT_Library   library,
+                  FT_Stroker  *astroker );
+
+

+
+

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.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Stroker_Set

+
+
+  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 );
+
+

+
+

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 that the outline coordinates.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Stroker_Rewind

+
+
+  FT_EXPORT( void )
+  FT_Stroker_Rewind( FT_Stroker  stroker );
+
+

+
+

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.

+
+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Stroker_ParseOutline

+
+
+  FT_EXPORT( FT_Error )
+  FT_Stroker_ParseOutline( FT_Stroker   stroker,
+                           FT_Outline*  outline,
+                           FT_Bool      opened );
+
+

+
+

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 will generate two distinct ‘border’ outlines.

+

If ‘opened’ is 1, the outline is processed as an open path, and the stroker will generate a single ‘stroke’ outline.

+

This function calls FT_Stroker_Rewind automatically.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Stroker_BeginSubPath

+
+
+  FT_EXPORT( FT_Error )
+  FT_Stroker_BeginSubPath( FT_Stroker  stroker,
+                           FT_Vector*  to,
+                           FT_Bool     open );
+
+

+
+

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.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Stroker_EndSubPath

+
+
+  FT_EXPORT( FT_Error )
+  FT_Stroker_EndSubPath( FT_Stroker  stroker );
+
+

+
+

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 will ‘draw’ a single line segment to the start position when needed.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Stroker_LineTo

+
+
+  FT_EXPORT( FT_Error )
+  FT_Stroker_LineTo( FT_Stroker  stroker,
+                     FT_Vector*  to );
+
+

+
+

‘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.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Stroker_ConicTo

+
+
+  FT_EXPORT( FT_Error )
+  FT_Stroker_ConicTo( FT_Stroker  stroker,
+                      FT_Vector*  control,
+                      FT_Vector*  to );
+
+

+
+

‘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.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Stroker_CubicTo

+
+
+  FT_EXPORT( FT_Error )
+  FT_Stroker_CubicTo( FT_Stroker  stroker,
+                      FT_Vector*  control1,
+                      FT_Vector*  control2,
+                      FT_Vector*  to );
+
+

+
+

‘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.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Stroker_GetBorderCounts

+
+
+  FT_EXPORT( FT_Error )
+  FT_Stroker_GetBorderCounts( FT_Stroker        stroker,
+                              FT_StrokerBorder  border,
+                              FT_UInt          *anum_points,
+                              FT_UInt          *anum_contours );
+
+

+
+

Call this function once you have finished parsing your paths with the stroker. It will return 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.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Stroker_ExportBorder

+
+
+  FT_EXPORT( void )
+  FT_Stroker_ExportBorder( FT_Stroker        stroker,
+                           FT_StrokerBorder  border,
+                           FT_Outline*       outline );
+
+

+
+

Call this function after FT_Stroker_GetBorderCounts to export the corresponding border to your own FT_Outline structure.

+

Note that this function will append the border points and contours to your outline, but will 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.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Stroker_GetCounts

+
+
+  FT_EXPORT( FT_Error )
+  FT_Stroker_GetCounts( FT_Stroker  stroker,
+                        FT_UInt    *anum_points,
+                        FT_UInt    *anum_contours );
+
+

+
+

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.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Stroker_Export

+
+
+  FT_EXPORT( void )
+  FT_Stroker_Export( FT_Stroker   stroker,
+                     FT_Outline*  outline );
+
+

+
+

Call this function after FT_Stroker_GetBorderCounts to export the all borders to your own FT_Outline structure.

+

Note that this function will append the border points and contours to your outline, but will not try to resize its arrays.

+

+
input
+ + + +
stroker +

The target stroker handle.

+
outline +

The target outline handle.

+
+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Stroker_Done

+
+
+  FT_EXPORT( void )
+  FT_Stroker_Done( FT_Stroker  stroker );
+
+

+
+

Destroy a stroker object.

+

+
input
+ + +
stroker +

A stroker handle. Can be NULL.

+
+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Glyph_Stroke

+
+
+  FT_EXPORT( FT_Error )
+  FT_Glyph_Stroke( FT_Glyph    *pglyph,
+                   FT_Stroker   stroker,
+                   FT_Bool      destroy );
+
+

+
+

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.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Glyph_StrokeBorder

+
+
+  FT_EXPORT( FT_Error )
+  FT_Glyph_StrokeBorder( FT_Glyph    *pglyph,
+                         FT_Stroker   stroker,
+                         FT_Bool      inside,
+                         FT_Bool      destroy );
+
+

+
+

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.

+
+
+
+ + +
[Index][TOC]
+ + + diff --git a/src/WinLibs/freetype-2.3.5/docs/reference/ft2-gx_validation.html b/src/WinLibs/freetype-2.3.5/docs/reference/ft2-gx_validation.html new file mode 100644 index 000000000..2bee1b095 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/docs/reference/ft2-gx_validation.html @@ -0,0 +1,335 @@ + + + + +FreeType-2.3.5 API Reference + + + +

FreeType-2.3.5 API Reference

+ +

+TrueTypeGX/AAT Validation +

+

Synopsis

+ + + + +
FT_VALIDATE_GX_LENGTHFT_TrueTypeGX_FreeFT_ClassicKern_Free
FT_VALIDATE_GXXXXFT_VALIDATE_CKERNXXX
FT_TrueTypeGX_ValidateFT_ClassicKern_Validate


+ +
+

This section contains the declaration of functions to validate some TrueTypeGX tables (feat, mort, morx, bsln, just, kern, opbd, trak, prop, lcar).

+

+
+

FT_VALIDATE_GX_LENGTH

+
+
+#define FT_VALIDATE_GX_LENGTH     (FT_VALIDATE_GX_LAST_INDEX + 1)
+
+

+
+

The number of tables checked in this module. Use it as a parameter for the ‘table-length’ argument of function FT_TrueTypeGX_Validate.

+

+
+
+ + +
[Index][TOC]
+ +
+

FT_VALIDATE_GXXXX

+
+
+#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 )
+
+

+
+

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).

+
+
+
+
+ + +
[Index][TOC]
+ +
+

FT_TrueTypeGX_Validate

+
+
+  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 );
+
+

+
+

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.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_TrueTypeGX_Free

+
+
+  FT_EXPORT( void )
+  FT_TrueTypeGX_Free( FT_Face   face,
+                      FT_Bytes  table );
+
+

+
+

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.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_VALIDATE_CKERNXXX

+
+
+#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 )
+
+

+
+

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.

+
+
+
+
+ + +
[Index][TOC]
+ +
+

FT_ClassicKern_Validate

+
+
+  FT_EXPORT( FT_Error )
+  FT_ClassicKern_Validate( FT_Face    face,
+                           FT_UInt    validation_flags,
+                           FT_Bytes  *ckern_table );
+
+

+
+

Validate classic (16bit 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 32bit format and the classic 16bit format, while FT_ClassicKern_Validate only supports the classic 16bit 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.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_ClassicKern_Free

+
+
+  FT_EXPORT( void )
+  FT_ClassicKern_Free( FT_Face   face,
+                       FT_Bytes  table );
+
+

+
+

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.

+
+
+
+ + +
[Index][TOC]
+ + + diff --git a/src/WinLibs/freetype-2.3.5/docs/reference/ft2-gzip.html b/src/WinLibs/freetype-2.3.5/docs/reference/ft2-gzip.html new file mode 100644 index 000000000..53e28a21f --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/docs/reference/ft2-gzip.html @@ -0,0 +1,86 @@ + + + + +FreeType-2.3.5 API Reference + + + +

FreeType-2.3.5 API Reference

+ +

+GZIP Streams +

+

Synopsis

+ + +
FT_Stream_OpenGzip


+ +
+

This section contains the declaration of Gzip-specific functions.

+

+
+

FT_Stream_OpenGzip

+
+
+  FT_EXPORT( FT_Error )
+  FT_Stream_OpenGzip( FT_Stream  stream,
+                      FT_Stream  source );
+
+

+
+

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.

+
+
+
+ + +
[Index][TOC]
+ + + diff --git a/src/WinLibs/freetype-2.3.5/docs/reference/ft2-header_file_macros.html b/src/WinLibs/freetype-2.3.5/docs/reference/ft2-header_file_macros.html new file mode 100644 index 000000000..9f9ac18d9 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/docs/reference/ft2-header_file_macros.html @@ -0,0 +1,851 @@ + + + + +FreeType-2.3.5 API Reference + + + +

FreeType-2.3.5 API Reference

+ +

+Header File Macros +

+

Synopsis

+ + + + + + + + + + + + + + + + + + + + + + +
FT_CONFIG_CONFIG_HFT_LZW_H
FT_CONFIG_STANDARD_LIBRARY_HFT_WINFONTS_H
FT_CONFIG_OPTIONS_HFT_GLYPH_H
FT_CONFIG_MODULES_HFT_BITMAP_H
FT_FREETYPE_HFT_BBOX_H
FT_ERRORS_HFT_CACHE_H
FT_MODULE_ERRORS_HFT_CACHE_IMAGE_H
FT_SYSTEM_HFT_CACHE_SMALL_BITMAPS_H
FT_IMAGE_HFT_CACHE_CHARMAP_H
FT_TYPES_HFT_MAC_H
FT_LIST_HFT_MULTIPLE_MASTERS_H
FT_OUTLINE_HFT_SFNT_NAMES_H
FT_SIZES_HFT_OPENTYPE_VALIDATE_H
FT_MODULE_HFT_GX_VALIDATE_H
FT_RENDER_HFT_PFR_H
FT_TYPE1_TABLES_HFT_STROKER_H
FT_TRUETYPE_IDS_HFT_SYNTHESIS_H
FT_TRUETYPE_TABLES_HFT_XFREE86_H
FT_TRUETYPE_TAGS_HFT_TRIGONOMETRY_H
FT_BDF_HFT_LCD_FILTER_H
FT_GZIP_HFT_GASP_H


+ +
+

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.

+

+
+

FT_CONFIG_CONFIG_H

+
+
+#ifndef FT_CONFIG_CONFIG_H
+#define FT_CONFIG_CONFIG_H  <freetype/config/ftconfig.h>
+#endif
+
+

+
+

A macro used in #include statements to name the file containing FreeType 2 configuration data.

+

+
+
+ + +
[Index][TOC]
+ +
+

FT_CONFIG_STANDARD_LIBRARY_H

+
+
+#ifndef FT_CONFIG_STANDARD_LIBRARY_H
+#define FT_CONFIG_STANDARD_LIBRARY_H  <freetype/config/ftstdlib.h>
+#endif
+
+

+
+

A macro used in #include statements to name the file containing FreeType 2 interface to the standard C library functions.

+

+
+
+ + +
[Index][TOC]
+ +
+

FT_CONFIG_OPTIONS_H

+
+
+#ifndef FT_CONFIG_OPTIONS_H
+#define FT_CONFIG_OPTIONS_H  <freetype/config/ftoption.h>
+#endif
+
+

+
+

A macro used in #include statements to name the file containing FreeType 2 project-specific configuration options.

+

+
+
+ + +
[Index][TOC]
+ +
+

FT_CONFIG_MODULES_H

+
+
+#ifndef FT_CONFIG_MODULES_H
+#define FT_CONFIG_MODULES_H  <freetype/config/ftmodule.h>
+#endif
+
+
+  /* public headers */
+
+

+
+

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.

+

+
+
+ + +
[Index][TOC]
+ +
+

FT_FREETYPE_H

+
+
+#define FT_FREETYPE_H  <freetype/freetype.h>
+
+

+
+

A macro used in #include statements to name the file containing the base FreeType 2 API.

+

+
+
+ + +
[Index][TOC]
+ +
+

FT_ERRORS_H

+
+
+#define FT_ERRORS_H  <freetype/fterrors.h>
+
+

+
+

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.

+

+
+
+ + +
[Index][TOC]
+ +
+

FT_MODULE_ERRORS_H

+
+
+#define FT_MODULE_ERRORS_H  <freetype/ftmoderr.h>
+
+

+
+

A macro used in #include statements to name the file containing the list of FreeType 2 module error offsets (and messages).

+

+
+
+ + +
[Index][TOC]
+ +
+

FT_SYSTEM_H

+
+
+#define FT_SYSTEM_H  <freetype/ftsystem.h>
+
+

+
+

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.

+

+
+
+ + +
[Index][TOC]
+ +
+

FT_IMAGE_H

+
+
+#define FT_IMAGE_H  <freetype/ftimage.h>
+
+

+
+

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.

+

+
+
+ + +
[Index][TOC]
+ +
+

FT_TYPES_H

+
+
+#define FT_TYPES_H  <freetype/fttypes.h>
+
+

+
+

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.

+

+
+
+ + +
[Index][TOC]
+ +
+

FT_LIST_H

+
+
+#define FT_LIST_H  <freetype/ftlist.h>
+
+

+
+

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.)

+

+
+
+ + +
[Index][TOC]
+ +
+

FT_OUTLINE_H

+
+
+#define FT_OUTLINE_H  <freetype/ftoutln.h>
+
+

+
+

A macro used in #include statements to name the file containing the scalable outline management API of FreeType 2.

+

+
+
+ + +
[Index][TOC]
+ +
+

FT_SIZES_H

+
+
+#define FT_SIZES_H  <freetype/ftsizes.h>
+
+

+
+

A macro used in #include statements to name the file containing the API which manages multiple FT_Size objects per face.

+

+
+
+ + +
[Index][TOC]
+ +
+

FT_MODULE_H

+
+
+#define FT_MODULE_H  <freetype/ftmodapi.h>
+
+

+
+

A macro used in #include statements to name the file containing the module management API of FreeType 2.

+

+
+
+ + +
[Index][TOC]
+ +
+

FT_RENDER_H

+
+
+#define FT_RENDER_H  <freetype/ftrender.h>
+
+

+
+

A macro used in #include statements to name the file containing the renderer module management API of FreeType 2.

+

+
+
+ + +
[Index][TOC]
+ +
+

FT_TYPE1_TABLES_H

+
+
+#define FT_TYPE1_TABLES_H  <freetype/t1tables.h>
+
+

+
+

A macro used in #include statements to name the file containing the types and API specific to the Type 1 format.

+

+
+
+ + +
[Index][TOC]
+ +
+

FT_TRUETYPE_IDS_H

+
+
+#define FT_TRUETYPE_IDS_H  <freetype/ttnameid.h>
+
+

+
+

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.

+

+
+
+ + +
[Index][TOC]
+ +
+

FT_TRUETYPE_TABLES_H

+
+
+#define FT_TRUETYPE_TABLES_H  <freetype/tttables.h>
+
+

+
+

A macro used in #include statements to name the file containing the types and API specific to the TrueType (as well as OpenType) format.

+

+
+
+ + +
[Index][TOC]
+ +
+

FT_TRUETYPE_TAGS_H

+
+
+#define FT_TRUETYPE_TAGS_H  <freetype/tttags.h>
+
+

+
+

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).

+

+
+
+ + +
[Index][TOC]
+ +
+

FT_BDF_H

+
+
+#define FT_BDF_H  <freetype/ftbdf.h>
+
+

+
+

A macro used in #include statements to name the file containing the definitions of an API which accesses BDF-specific strings from a face.

+

+
+
+ + +
[Index][TOC]
+ +
+

FT_GZIP_H

+
+
+#define FT_GZIP_H  <freetype/ftgzip.h>
+
+

+
+

A macro used in #include statements to name the file containing the definitions of an API which supports gzip-compressed files.

+

+
+
+ + +
[Index][TOC]
+ +
+

FT_LZW_H

+
+
+#define FT_LZW_H  <freetype/ftlzw.h>
+
+

+
+

A macro used in #include statements to name the file containing the definitions of an API which supports LZW-compressed files.

+

+
+
+ + +
[Index][TOC]
+ +
+

FT_WINFONTS_H

+
+
+#define FT_WINFONTS_H   <freetype/ftwinfnt.h>
+
+

+
+

A macro used in #include statements to name the file containing the definitions of an API which supports Windows FNT files.

+

+
+
+ + +
[Index][TOC]
+ +
+

FT_GLYPH_H

+
+
+#define FT_GLYPH_H  <freetype/ftglyph.h>
+
+

+
+

A macro used in #include statements to name the file containing the API of the optional glyph management component.

+

+
+
+ + +
[Index][TOC]
+ +
+

FT_BITMAP_H

+
+
+#define FT_BITMAP_H  <freetype/ftbitmap.h>
+
+

+
+

A macro used in #include statements to name the file containing the API of the optional bitmap conversion component.

+

+
+
+ + +
[Index][TOC]
+ +
+

FT_BBOX_H

+
+
+#define FT_BBOX_H  <freetype/ftbbox.h>
+
+

+
+

A macro used in #include statements to name the file containing the API of the optional exact bounding box computation routines.

+

+
+
+ + +
[Index][TOC]
+ +
+

FT_CACHE_H

+
+
+#define FT_CACHE_H  <freetype/ftcache.h>
+
+

+
+

A macro used in #include statements to name the file containing the API of the optional FreeType 2 cache sub-system.

+

+
+
+ + +
[Index][TOC]
+ +
+

FT_CACHE_IMAGE_H

+
+
+#define FT_CACHE_IMAGE_H  FT_CACHE_H
+
+

+
+

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.

+

+
+
+ + +
[Index][TOC]
+ +
+

FT_CACHE_SMALL_BITMAPS_H

+
+
+#define FT_CACHE_SMALL_BITMAPS_H  FT_CACHE_H
+
+

+
+

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.

+

+
+
+ + +
[Index][TOC]
+ +
+

FT_CACHE_CHARMAP_H

+
+
+#define FT_CACHE_CHARMAP_H  FT_CACHE_H
+
+

+
+

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.

+

+
+
+ + +
[Index][TOC]
+ +
+

FT_MAC_H

+
+
+#define FT_MAC_H  <freetype/ftmac.h>
+
+

+
+

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).

+

+
+
+ + +
[Index][TOC]
+ +
+

FT_MULTIPLE_MASTERS_H

+
+
+#define FT_MULTIPLE_MASTERS_H  <freetype/ftmm.h>
+
+

+
+

A macro used in #include statements to name the file containing the optional multiple-masters management API of FreeType 2.

+

+
+
+ + +
[Index][TOC]
+ +
+

FT_SFNT_NAMES_H

+
+
+#define FT_SFNT_NAMES_H  <freetype/ftsnames.h>
+
+

+
+

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).

+

+
+
+ + +
[Index][TOC]
+ +
+

FT_OPENTYPE_VALIDATE_H

+
+
+#define FT_OPENTYPE_VALIDATE_H  <freetype/ftotval.h>
+
+

+
+

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).

+

+
+
+ + +
[Index][TOC]
+ +
+

FT_GX_VALIDATE_H

+
+
+#define FT_GX_VALIDATE_H  <freetype/ftgxval.h>
+
+

+
+

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).

+

+
+
+ + +
[Index][TOC]
+ +
+

FT_PFR_H

+
+
+#define FT_PFR_H  <freetype/ftpfr.h>
+
+

+
+

A macro used in #include statements to name the file containing the FreeType 2 API which accesses PFR-specific data.

+

+
+
+ + +
[Index][TOC]
+ +
+

FT_STROKER_H

+
+
+#define FT_STROKER_H  <freetype/ftstroke.h>
+
+

+
+

A macro used in #include statements to name the file containing the FreeType 2 API which provides functions to stroke outline paths.

+

+
+
+ + +
[Index][TOC]
+ +
+

FT_SYNTHESIS_H

+
+
+#define FT_SYNTHESIS_H  <freetype/ftsynth.h>
+
+

+
+

A macro used in #include statements to name the file containing the FreeType 2 API which performs artificial obliquing and emboldening.

+

+
+
+ + +
[Index][TOC]
+ +
+

FT_XFREE86_H

+
+
+#define FT_XFREE86_H  <freetype/ftxf86.h>
+
+

+
+

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.

+

+
+
+ + +
[Index][TOC]
+ +
+

FT_TRIGONOMETRY_H

+
+
+#define FT_TRIGONOMETRY_H  <freetype/fttrigon.h>
+
+

+
+

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).

+

+
+
+ + +
[Index][TOC]
+ +
+

FT_LCD_FILTER_H

+
+
+#define FT_LCD_FILTER_H  <freetype/ftlcdfil.h>
+
+

+
+

A macro used in #include statements to name the file containing the FreeType 2 API which performs color filtering for subpixel rendering.

+

+
+
+ + +
[Index][TOC]
+ +
+

FT_GASP_H

+
+
+#define FT_GASP_H  <freetype/ftgasp.h>
+
+

+
+

A macro used in #include statements to name the file containing the FreeType 2 API which returns entries from the TrueType GASP table.

+

+
+
+ + +
[Index][TOC]
+ + + diff --git a/src/WinLibs/freetype-2.3.5/docs/reference/ft2-incremental.html b/src/WinLibs/freetype-2.3.5/docs/reference/ft2-incremental.html new file mode 100644 index 000000000..d0713a27d --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/docs/reference/ft2-incremental.html @@ -0,0 +1,356 @@ + + + + +FreeType-2.3.5 API Reference + + + +

FreeType-2.3.5 API Reference

+ +

+Incremental Loading +

+

Synopsis

+ + + + + + +
FT_IncrementalFT_Incremental_FuncsRec
FT_Incremental_MetricsFT_Incremental_InterfaceRec
FT_Incremental_GetGlyphDataFuncFT_Incremental_Interface
FT_Incremental_FreeGlyphDataFuncFT_PARAM_TAG_INCREMENTAL
FT_Incremental_GetGlyphMetricsFunc


+ +
+

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.

+

+
+

FT_Incremental

+
+
+  typedef struct FT_IncrementalRec_*  FT_Incremental;
+
+

+
+

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.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Incremental_Metrics

+
+
+  typedef struct  FT_Incremental_MetricsRec_
+  {
+    FT_Long  bearing_x;
+    FT_Long  bearing_y;
+    FT_Long  advance;
+
+  } FT_Incremental_MetricsRec, *FT_Incremental_Metrics;
+
+

+
+

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 +

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.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Incremental_GetGlyphDataFunc

+
+
+  typedef FT_Error
+  (*FT_Incremental_GetGlyphDataFunc)( FT_Incremental  incremental,
+                                      FT_UInt         glyph_index,
+                                      FT_Data*        adata );
+
+

+
+

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.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Incremental_FreeGlyphDataFunc

+
+
+  typedef void
+  (*FT_Incremental_FreeGlyphDataFunc)( FT_Incremental  incremental,
+                                       FT_Data*        data );
+
+

+
+

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).

+
+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Incremental_GetGlyphMetricsFunc

+
+
+  typedef FT_Error
+  (*FT_Incremental_GetGlyphMetricsFunc)
+                      ( FT_Incremental              incremental,
+                        FT_UInt                     glyph_index,
+                        FT_Bool                     vertical,
+                        FT_Incremental_MetricsRec  *ametrics );
+
+

+
+

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.

+
+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Incremental_FuncsRec

+
+
+  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;
+
+

+
+

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.

+
+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Incremental_InterfaceRec

+
+
+  typedef struct  FT_Incremental_InterfaceRec_
+  {
+    const FT_Incremental_FuncsRec*  funcs;
+    FT_Incremental                  object;
+
+  } FT_Incremental_InterfaceRec;
+
+

+
+

A structure to be used with FT_Open_Face to indicate that the user wants to support incremental glyph loading. You should use it with FT_PARAM_TAG_INCREMENTAL as in the following example:

+
+  FT_Incremental_InterfaceRec  inc_int;
+  FT_Parameter                 parameter;
+  FT_Open_Args                 open_args;
+
+
+  // set up incremental descriptor
+  inc_int.funcs  = my_funcs;
+  inc_int.object = my_object;
+
+  // set up optional parameter
+  parameter.tag  = FT_PARAM_TAG_INCREMENTAL;
+  parameter.data = &inc_int;
+
+  // set up FT_Open_Args structure
+  open_args.flags      = FT_OPEN_PATHNAME | FT_OPEN_PARAMS;
+  open_args.pathname   = my_font_pathname;
+  open_args.num_params = 1;
+  open_args.params     = &parameter; // we use one optional argument
+
+  // open the font
+  error = FT_Open_Face( library, &open_args, index, &face );
+  ...
+
+

+
+
+ + +
[Index][TOC]
+ +
+

FT_Incremental_Interface

+
+
+  typedef FT_Incremental_InterfaceRec*   FT_Incremental_Interface;
+
+

+
+

A pointer to an FT_Incremental_InterfaceRec structure.

+

+
+
+ + +
[Index][TOC]
+ +
+

FT_PARAM_TAG_INCREMENTAL

+
+
+#define FT_PARAM_TAG_INCREMENTAL  FT_MAKE_TAG( 'i', 'n', 'c', 'r' )
+
+

+
+

A constant used as the tag of FT_Parameter structures to indicate an incremental loading object to be used by FreeType.

+

+
+
+ + +
[Index][TOC]
+ + + diff --git a/src/WinLibs/freetype-2.3.5/docs/reference/ft2-index.html b/src/WinLibs/freetype-2.3.5/docs/reference/ft2-index.html new file mode 100644 index 000000000..809a9f688 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/docs/reference/ft2-index.html @@ -0,0 +1,266 @@ + + + + +FreeType-2.3.5 API Reference + + + +

FreeType-2.3.5 API Reference

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
BDF_PROPERTY_TYPE_ATOMFT_List_RemoveFT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES
BDF_PROPERTY_TYPE_CARDINALFT_List_UpFT_SUBGLYPH_FLAG_ROUND_XY_TO_GRID
BDF_PROPERTY_TYPE_INTEGERFT_ListNodeFT_SUBGLYPH_FLAG_SCALE
BDF_PROPERTY_TYPE_NONEFT_ListNodeRecFT_SUBGLYPH_FLAG_USE_MY_METRICS
BDF_PropertyFT_ListRecFT_SUBGLYPH_FLAG_XXX
BDF_PropertyRecFT_LOAD_CROP_BITMAPFT_SUBGLYPH_FLAG_XY_SCALE
CID_FaceInfoRecFT_LOAD_DEFAULTFT_SubGlyph
CID_InfoFT_LOAD_FORCE_AUTOHINTFT_SYNTHESIS_H
FREETYPE_MAJORFT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTHFT_SYSTEM_H
FREETYPE_MINORFT_LOAD_IGNORE_TRANSFORMFT_Tag
FREETYPE_PATCHFT_LOAD_LINEAR_DESIGNFT_Tan
FREETYPE_XXXFT_LOAD_MONOCHROMEFT_TRIGONOMETRY_H
FT_Activate_SizeFT_LOAD_NO_AUTOHINTFT_TRUETYPE_ENGINE_TYPE_NONE
FT_Add_Default_ModulesFT_LOAD_NO_BITMAPFT_TRUETYPE_ENGINE_TYPE_PATENTED
FT_Add_ModuleFT_LOAD_NO_HINTINGFT_TRUETYPE_ENGINE_TYPE_UNPATENTED
FT_Alloc_FuncFT_LOAD_NO_RECURSEFT_TRUETYPE_IDS_H
FT_ANGLE_2PIFT_LOAD_NO_SCALEFT_TRUETYPE_TABLES_H
FT_ANGLE_PIFT_LOAD_PEDANTICFT_TRUETYPE_TAGS_H
FT_ANGLE_PI2FT_LOAD_RENDERFT_TrueTypeEngineType
FT_ANGLE_PI4FT_LOAD_TARGET_LCDFT_TrueTypeGX_Free
FT_AngleFT_LOAD_TARGET_LCD_VFT_TrueTypeGX_Validate
FT_Angle_DiffFT_LOAD_TARGET_LIGHTFT_TYPE1_TABLES_H
FT_Atan2FT_LOAD_TARGET_MONOFT_TYPES_H
FT_Attach_FileFT_LOAD_TARGET_NORMALFT_UFWord
FT_Attach_StreamFT_LOAD_TARGET_XXXFT_UInt
FT_BBOX_HFT_LOAD_VERTICAL_LAYOUTFT_ULong
FT_BBoxFT_LOAD_XXXFT_UnitVector
FT_BDF_HFT_Load_CharFT_UShort
FT_BITMAP_HFT_Load_GlyphFT_VALIDATE_APPLE
FT_BitmapFT_Load_Sfnt_TableFT_VALIDATE_BASE
FT_Bitmap_ConvertFT_LongFT_VALIDATE_bsln
FT_Bitmap_CopyFT_LZW_HFT_VALIDATE_CKERN
FT_Bitmap_DoneFT_MAC_HFT_VALIDATE_CKERNXXX
FT_Bitmap_EmboldenFT_MAKE_TAGFT_VALIDATE_feat
FT_Bitmap_NewFT_MatrixFT_VALIDATE_GDEF
FT_Bitmap_SizeFT_Matrix_InvertFT_VALIDATE_GPOS
FT_BitmapGlyphFT_Matrix_MultiplyFT_VALIDATE_GSUB
FT_BitmapGlyphRecFT_MemoryFT_VALIDATE_GX
FT_BoolFT_MemoryRecFT_VALIDATE_GX_LENGTH
FT_ByteFT_MM_AxisFT_VALIDATE_GXXXX
FT_BytesFT_MM_VarFT_VALIDATE_JSTF
FT_CACHE_CHARMAP_HFT_MODULE_ERRORS_HFT_VALIDATE_just
FT_CACHE_HFT_MODULE_HFT_VALIDATE_kern
FT_CACHE_IMAGE_HFT_ModuleFT_VALIDATE_lcar
FT_CACHE_SMALL_BITMAPS_HFT_Module_ClassFT_VALIDATE_MS
FT_CeilFixFT_MULTIPLE_MASTERS_HFT_VALIDATE_mort
FT_CharFT_MulDivFT_VALIDATE_morx
FT_CharMapFT_MulFixFT_VALIDATE_OT
FT_CharMapRecFT_Multi_MasterFT_VALIDATE_OTXXX
FT_ClassicKern_FreeFT_New_FaceFT_VALIDATE_opbd
FT_ClassicKern_ValidateFT_New_Face_From_FONDFT_VALIDATE_prop
FT_CONFIG_CONFIG_HFT_New_Face_From_FSRefFT_VALIDATE_trak
FT_CONFIG_MODULES_HFT_New_Face_From_FSSpecFT_Var_Axis
FT_CONFIG_OPTIONS_HFT_New_LibraryFT_Var_Named_Style
FT_CONFIG_STANDARD_LIBRARY_HFT_New_Memory_FaceFT_Vector
FT_CosFT_New_SizeFT_Vector_From_Polar
FT_DataFT_OffsetFT_Vector_Length
FT_DivFixFT_OPEN_DRIVERFT_Vector_Polarize
FT_Done_FaceFT_OPEN_MEMORYFT_Vector_Rotate
FT_Done_FreeTypeFT_OPEN_PARAMSFT_Vector_Transform
FT_Done_GlyphFT_OPEN_PATHNAMEFT_Vector_Unit
FT_Done_LibraryFT_OPEN_STREAMFT_WINFONTS_H
FT_Done_SizeFT_OPEN_XXXFT_WinFNT_HeaderRec
FT_DriverFT_OPENTYPE_VALIDATE_HFT_WinFNT_ID_CP1250
FT_ENC_TAGFT_Open_ArgsFT_WinFNT_ID_CP1251
FT_ENCODING_ADOBE_CUSTOMFT_Open_FaceFT_WinFNT_ID_CP1252
FT_ENCODING_ADOBE_EXPERTFT_OpenType_FreeFT_WinFNT_ID_CP1253
FT_ENCODING_ADOBE_LATIN_1FT_OpenType_ValidateFT_WinFNT_ID_CP1254
FT_ENCODING_ADOBE_STANDARDFT_ORIENTATION_FILL_LEFTFT_WinFNT_ID_CP1255
FT_ENCODING_APPLE_ROMANFT_ORIENTATION_FILL_RIGHTFT_WinFNT_ID_CP1256
FT_ENCODING_BIG5FT_ORIENTATION_NONEFT_WinFNT_ID_CP1257
FT_ENCODING_GB2312FT_ORIENTATION_POSTSCRIPTFT_WinFNT_ID_CP1258
FT_ENCODING_JOHABFT_ORIENTATION_TRUETYPEFT_WinFNT_ID_CP1361
FT_ENCODING_MS_BIG5FT_OrientationFT_WinFNT_ID_CP874
FT_ENCODING_MS_GB2312FT_OUTLINE_EVEN_ODD_FILLFT_WinFNT_ID_CP932
FT_ENCODING_MS_JOHABFT_OUTLINE_FLAGSFT_WinFNT_ID_CP936
FT_ENCODING_MS_SJISFT_OUTLINE_HFT_WinFNT_ID_CP949
FT_ENCODING_MS_SYMBOLFT_OUTLINE_HIGH_PRECISIONFT_WinFNT_ID_CP950
FT_ENCODING_MS_WANSUNGFT_OUTLINE_IGNORE_DROPOUTSFT_WinFNT_ID_DEFAULT
FT_ENCODING_NONEFT_OUTLINE_NONEFT_WinFNT_ID_MAC
FT_ENCODING_OLD_LATIN_2FT_OUTLINE_OWNERFT_WinFNT_ID_OEM
FT_ENCODING_SJISFT_OUTLINE_REVERSE_FILLFT_WinFNT_ID_SYMBOL
FT_ENCODING_UNICODEFT_OUTLINE_SINGLE_PASSFT_WinFNT_ID_XXX
FT_ENCODING_WANSUNGFT_OutlineFT_XFREE86_H
FT_EncodingFT_Outline_CheckFTC_CMapCache
FT_ERRORS_HFT_Outline_ConicToFuncFTC_CMapCache_Lookup
FT_ErrorFT_Outline_CopyFTC_CMapCache_New
FT_F26Dot6FT_Outline_CubicToFuncFTC_Face_Requester
FT_F2Dot14FT_Outline_DecomposeFTC_FaceID
FT_FACE_FLAG_EXTERNAL_STREAMFT_Outline_DoneFTC_ImageCache
FT_FACE_FLAG_FAST_GLYPHSFT_Outline_EmboldenFTC_ImageCache_Lookup
FT_FACE_FLAG_FIXED_SIZESFT_Outline_FuncsFTC_ImageCache_LookupScaler
FT_FACE_FLAG_FIXED_WIDTHFT_Outline_Get_BBoxFTC_ImageCache_New
FT_FACE_FLAG_GLYPH_NAMESFT_Outline_Get_BitmapFTC_ImageType
FT_FACE_FLAG_HINTERFT_Outline_Get_CBoxFTC_ImageTypeRec
FT_FACE_FLAG_HORIZONTALFT_Outline_Get_OrientationFTC_Manager
FT_FACE_FLAG_KERNINGFT_Outline_GetInsideBorderFTC_Manager_Done
FT_FACE_FLAG_MULTIPLE_MASTERSFT_Outline_GetOutsideBorderFTC_Manager_LookupFace
FT_FACE_FLAG_SCALABLEFT_Outline_LineToFuncFTC_Manager_LookupSize
FT_FACE_FLAG_SFNTFT_Outline_MoveToFuncFTC_Manager_New
FT_FACE_FLAG_VERTICALFT_Outline_NewFTC_Manager_RemoveFaceID
FT_FACE_FLAG_XXXFT_Outline_RenderFTC_Manager_Reset
FT_FaceFT_Outline_ReverseFTC_Node
FT_Face_CheckTrueTypePatentsFT_Outline_TransformFTC_Node_Unref
FT_Face_InternalFT_Outline_TranslateFTC_SBit
FT_Face_SetUnpatentedHintingFT_OutlineGlyphFTC_SBitCache
FT_FaceRecFT_OutlineGlyphRecFTC_SBitCache_Lookup
FT_FixedFT_PARAM_TAG_INCREMENTALFTC_SBitCache_LookupScaler
FT_FloorFixFT_PARAM_TAG_UNPATENTED_HINTINGFTC_SBitCache_New
FT_FREETYPE_HFT_Palette_ModeFTC_SBitRec
FT_Free_FuncFT_ParameterFTC_ScalerRec
FT_FWordFT_PFR_Hft_encoding_xxx
FT_GASP_DO_GRAYFT_PIXEL_MODE_GRAYft_glyph_bbox_gridfit
FT_GASP_DO_GRIDFITFT_PIXEL_MODE_GRAY2ft_glyph_bbox_pixels
FT_GASP_HFT_PIXEL_MODE_GRAY4ft_glyph_bbox_subpixels
FT_GASP_NO_TABLEFT_PIXEL_MODE_LCDft_glyph_bbox_truncate
FT_GASP_SYMMETRIC_GRIDFITFT_PIXEL_MODE_LCD_Vft_glyph_bbox_unscaled
FT_GASP_SYMMETRIC_SMOOTHINGFT_PIXEL_MODE_MONOft_glyph_bbox_xxx
FT_GASP_XXXFT_PIXEL_MODE_NONEft_glyph_format_bitmap
FT_GenericFT_Pixel_Modeft_glyph_format_composite
FT_Generic_FinalizerFT_Pointerft_glyph_format_none
FT_Get_BDF_Charset_IDFT_Posft_glyph_format_outline
FT_Get_BDF_PropertyFT_PropertyTypeft_glyph_format_plotter
FT_Get_Char_IndexFT_PtrDistft_glyph_format_xxx
FT_Get_Charmap_IndexFT_RASTER_FLAG_AAft_kerning_default
FT_Get_CMap_FormatFT_RASTER_FLAG_CLIPft_kerning_unfitted
FT_Get_CMap_Language_IDFT_RASTER_FLAG_DEFAULTft_kerning_unscaled
FT_Get_First_CharFT_RASTER_FLAG_DIRECTft_open_driver
FT_Get_GaspFT_RASTER_FLAG_XXXft_open_memory
FT_Get_GlyphFT_Rasterft_open_params
FT_Get_Glyph_NameFT_Raster_BitSet_Funcft_open_pathname
FT_Get_KerningFT_Raster_BitTest_Funcft_open_stream
FT_Get_MM_VarFT_Raster_DoneFuncft_outline_even_odd_fill
FT_Get_ModuleFT_Raster_Funcsft_outline_flags
FT_Get_Multi_MasterFT_Raster_NewFuncft_outline_high_precision
FT_Get_Name_IndexFT_Raster_Paramsft_outline_ignore_dropouts
FT_Get_Next_CharFT_Raster_RenderFuncft_outline_none
FT_Get_PFR_AdvanceFT_Raster_ResetFuncft_outline_owner
FT_Get_PFR_KerningFT_Raster_SetModeFuncft_outline_reverse_fill
FT_Get_PFR_MetricsFT_RENDER_Hft_outline_single_pass
FT_Get_Postscript_NameFT_RENDER_MODE_LCDft_pixel_mode_grays
FT_Get_PS_Font_InfoFT_RENDER_MODE_LCD_Vft_pixel_mode_mono
FT_Get_PS_Font_PrivateFT_RENDER_MODE_LIGHTft_pixel_mode_none
FT_Get_RendererFT_RENDER_MODE_MONOft_pixel_mode_pal2
FT_Get_Sfnt_NameFT_RENDER_MODE_NORMALft_pixel_mode_pal4
FT_Get_Sfnt_Name_CountFT_Realloc_Funcft_pixel_mode_xxx
FT_Get_Sfnt_TableFT_Remove_Moduleft_render_mode_mono
FT_Get_SubGlyph_InfoFT_Render_Glyphft_render_mode_normal
FT_Get_Track_KerningFT_Render_Modeft_render_mode_xxx
FT_Get_TrueType_Engine_TypeFT_RendererPS_FontInfoRec
FT_Get_WinFNT_HeaderFT_Renderer_ClassPS_PrivateRec
FT_Get_X11_Font_FormatFT_Request_SizeT1_Blend_Flags
FT_GetFile_From_Mac_ATS_NameFT_RoundFixT1_FontInfo
FT_GetFile_From_Mac_NameFT_Select_CharmapT1_Private
FT_GetFilePath_From_Mac_ATS_NameFT_Select_SizeTT_ADOBE_ID_CUSTOM
FT_GLYPH_BBOX_GRIDFITFT_Set_Char_SizeTT_ADOBE_ID_EXPERT
FT_GLYPH_BBOX_PIXELSFT_Set_CharmapTT_ADOBE_ID_STANDARD
FT_GLYPH_BBOX_SUBPIXELSFT_Set_Debug_HookTT_ADOBE_ID_XXX
FT_GLYPH_BBOX_TRUNCATEFT_Set_MM_Blend_CoordinatesTT_APPLE_ID_DEFAULT
FT_GLYPH_BBOX_UNSCALEDFT_Set_MM_Design_CoordinatesTT_APPLE_ID_ISO_10646
FT_GLYPH_FORMAT_BITMAPFT_Set_Pixel_SizesTT_APPLE_ID_UNICODE_1_1
FT_GLYPH_FORMAT_COMPOSITEFT_Set_RendererTT_APPLE_ID_UNICODE_2_0
FT_GLYPH_FORMAT_NONEFT_Set_TransformTT_APPLE_ID_UNICODE_32
FT_GLYPH_FORMAT_OUTLINEFT_Set_Var_Blend_CoordinatesTT_APPLE_ID_XXX
FT_GLYPH_FORMAT_PLOTTERFT_Set_Var_Design_CoordinatesTT_Header
FT_GLYPH_HFT_SFNT_NAMES_HTT_HoriHeader
FT_GlyphFT_Sfnt_Table_InfoTT_ISO_ID_10646
FT_Glyph_BBox_ModeFT_Sfnt_TagTT_ISO_ID_7BIT_ASCII
FT_Glyph_CopyFT_SfntNameTT_ISO_ID_8859_1
FT_Glyph_FormatFT_ShortTT_ISO_ID_XXX
FT_Glyph_Get_CBoxFT_SIZE_REQUEST_TYPE_BBOXTT_MAC_ID_ARABIC
FT_Glyph_MetricsFT_SIZE_REQUEST_TYPE_CELLTT_MAC_ID_ARMENIAN
FT_Glyph_StrokeFT_SIZE_REQUEST_TYPE_NOMINALTT_MAC_ID_BENGALI
FT_Glyph_StrokeBorderFT_SIZE_REQUEST_TYPE_REAL_DIMTT_MAC_ID_BURMESE
FT_Glyph_To_BitmapFT_SIZE_REQUEST_TYPE_SCALESTT_MAC_ID_DEVANAGARI
FT_Glyph_TransformFT_SIZES_HTT_MAC_ID_GEEZ
FT_GlyphRecFT_SinTT_MAC_ID_GEORGIAN
FT_GlyphSlotFT_SizeTT_MAC_ID_GREEK
FT_GlyphSlotRecFT_Size_InternalTT_MAC_ID_GUJARATI
FT_GX_VALIDATE_HFT_Size_MetricsTT_MAC_ID_GURMUKHI
FT_GZIP_HFT_Size_Request_TypeTT_MAC_ID_HEBREW
FT_HAS_FAST_GLYPHSFT_Size_RequestRecTT_MAC_ID_JAPANESE
FT_HAS_FIXED_SIZESFT_SizeRecTT_MAC_ID_KANNADA
FT_HAS_GLYPH_NAMESFT_Slot_InternalTT_MAC_ID_KHMER
FT_HAS_HORIZONTALFT_SpanTT_MAC_ID_KOREAN
FT_HAS_KERNINGFT_SpanFuncTT_MAC_ID_LAOTIAN
FT_HAS_MULTIPLE_MASTERSFT_STROKER_BORDER_LEFTTT_MAC_ID_MALAYALAM
FT_HAS_VERTICALFT_STROKER_BORDER_RIGHTTT_MAC_ID_MALDIVIAN
FT_Has_PS_Glyph_NamesFT_STROKER_HTT_MAC_ID_MONGOLIAN
FT_IMAGE_HFT_STROKER_LINECAP_BUTTTT_MAC_ID_ORIYA
FT_IMAGE_TAGFT_STROKER_LINECAP_ROUNDTT_MAC_ID_ROMAN
FT_IncrementalFT_STROKER_LINECAP_SQUARETT_MAC_ID_RSYMBOL
FT_Incremental_FreeGlyphDataFuncFT_STROKER_LINEJOIN_BEVELTT_MAC_ID_RUSSIAN
FT_Incremental_FuncsRecFT_STROKER_LINEJOIN_MITERTT_MAC_ID_SIMPLIFIED_CHINESE
FT_Incremental_GetGlyphDataFuncFT_STROKER_LINEJOIN_ROUNDTT_MAC_ID_SINDHI
FT_Incremental_GetGlyphMetricsFuncFT_STYLE_FLAG_BOLDTT_MAC_ID_SINHALESE
FT_Incremental_InterfaceFT_STYLE_FLAG_ITALICTT_MAC_ID_SLAVIC
FT_Incremental_InterfaceRecFT_STYLE_FLAG_XXXTT_MAC_ID_TAMIL
FT_Incremental_MetricsFT_StreamTT_MAC_ID_TELUGU
FT_Init_FreeTypeFT_Stream_CloseFuncTT_MAC_ID_THAI
FT_IntFT_Stream_IoFuncTT_MAC_ID_TIBETAN
FT_IS_FIXED_WIDTHFT_Stream_OpenGzipTT_MAC_ID_TRADITIONAL_CHINESE
FT_IS_SCALABLEFT_Stream_OpenLZWTT_MAC_ID_UNINTERP
FT_IS_SFNTFT_StreamDescTT_MAC_ID_VIETNAMESE
FT_KERNING_DEFAULTFT_StreamRecTT_MAC_ID_XXX
FT_KERNING_UNFITTEDFT_StringTT_MaxProfile
FT_KERNING_UNSCALEDFT_StrokerTT_MS_ID_BIG_5
FT_Kerning_ModeFT_Stroker_BeginSubPathTT_MS_ID_GB2312
FT_LCD_FILTER_DEFAULTFT_Stroker_ConicToTT_MS_ID_JOHAB
FT_LCD_FILTER_HFT_Stroker_CubicToTT_MS_ID_SJIS
FT_LCD_FILTER_LEGACYFT_Stroker_DoneTT_MS_ID_SYMBOL_CS
FT_LCD_FILTER_LIGHTFT_Stroker_EndSubPathTT_MS_ID_UCS_4
FT_LCD_FILTER_NONEFT_Stroker_ExportTT_MS_ID_UNICODE_CS
FT_LcdFilterFT_Stroker_ExportBorderTT_MS_ID_WANSUNG
FT_LIST_HFT_Stroker_GetBorderCountsTT_MS_ID_XXX
FT_LibraryFT_Stroker_GetCountsTT_OS2
FT_Library_SetLcdFilterFT_Stroker_LineCapTT_PCLT
FT_Library_VersionFT_Stroker_LineJoinTT_PLATFORM_ADOBE
FT_ListFT_Stroker_LineToTT_PLATFORM_APPLE_UNICODE
FT_List_AddFT_Stroker_NewTT_PLATFORM_CUSTOM
FT_List_DestructorFT_Stroker_ParseOutlineTT_PLATFORM_ISO
FT_List_FinalizeFT_Stroker_RewindTT_PLATFORM_MACINTOSH
FT_List_FindFT_Stroker_SetTT_PLATFORM_MICROSOFT
FT_List_InsertFT_StrokerBorderTT_PLATFORM_XXX
FT_List_IterateFT_SUBGLYPH_FLAG_2X2TT_Postscript
FT_List_IteratorFT_SUBGLYPH_FLAG_ARGS_ARE_WORDSTT_VertHeader
+
+ +
[TOC]
+ diff --git a/src/WinLibs/freetype-2.3.5/docs/reference/ft2-lcd_filtering.html b/src/WinLibs/freetype-2.3.5/docs/reference/ft2-lcd_filtering.html new file mode 100644 index 000000000..0e17523c4 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/docs/reference/ft2-lcd_filtering.html @@ -0,0 +1,139 @@ + + + + +FreeType-2.3.5 API Reference + + + +

FreeType-2.3.5 API Reference

+ +

+LCD Filtering +

+

Synopsis

+ + +
FT_LcdFilterFT_Library_SetLcdFilter


+ +
+

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.

+

+
+

FT_LcdFilter

+
+
+  typedef enum
+  {
+    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;
+
+

+
+

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

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Library_SetLcdFilter

+
+
+  FT_EXPORT( FT_Error )
+  FT_Library_SetLcdFilter( FT_Library    library,
+                           FT_LcdFilter  filter );
+
+

+
+

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

+
+
+
+ + +
[Index][TOC]
+ + + diff --git a/src/WinLibs/freetype-2.3.5/docs/reference/ft2-list_processing.html b/src/WinLibs/freetype-2.3.5/docs/reference/ft2-list_processing.html new file mode 100644 index 000000000..cd28f703f --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/docs/reference/ft2-list_processing.html @@ -0,0 +1,452 @@ + + + + +FreeType-2.3.5 API Reference + + + +

FreeType-2.3.5 API Reference

+ +

+List Processing +

+

Synopsis

+ + + + + + +
FT_ListFT_List_AddFT_List_Iterate
FT_ListNodeFT_List_InsertFT_List_Destructor
FT_ListRecFT_List_RemoveFT_List_Finalize
FT_ListNodeRecFT_List_Up
FT_List_FindFT_List_Iterator


+ +
+

This section contains various definitions related to list processing using doubly-linked nodes.

+

+
+

FT_List

+
+
+  typedef struct FT_ListRec_*  FT_List;
+
+

+
+

A handle to a list record (see FT_ListRec).

+

+
+
+ + +
[Index][TOC]
+ +
+

FT_ListNode

+
+
+  typedef struct FT_ListNodeRec_*  FT_ListNode;
+
+

+
+

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.

+

+
+
+ + +
[Index][TOC]
+ +
+

FT_ListRec

+
+
+  typedef struct  FT_ListRec_
+  {
+    FT_ListNode  head;
+    FT_ListNode  tail;
+
+  } FT_ListRec;
+
+

+
+

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.

+
+
+
+
+ + +
[Index][TOC]
+ +
+

FT_ListNodeRec

+
+
+  typedef struct  FT_ListNodeRec_
+  {
+    FT_ListNode  prev;
+    FT_ListNode  next;
+    void*        data;
+
+  } FT_ListNodeRec;
+
+

+
+

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.

+
+
+
+
+ + +
[Index][TOC]
+ +
+

FT_List_Find

+
+
+  FT_EXPORT( FT_ListNode )
+  FT_List_Find( FT_List  list,
+                void*    data );
+
+

+
+

Finds 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.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_List_Add

+
+
+  FT_EXPORT( void )
+  FT_List_Add( FT_List      list,
+               FT_ListNode  node );
+
+

+
+

Appends an element to the end of a list.

+

+
inout
+ + + +
list +

A pointer to the parent list.

+
node +

The node to append.

+
+
+
+
+ + +
[Index][TOC]
+ +
+

FT_List_Insert

+
+
+  FT_EXPORT( void )
+  FT_List_Insert( FT_List      list,
+                  FT_ListNode  node );
+
+

+
+

Inserts an element at the head of a list.

+

+
inout
+ + + +
list +

A pointer to parent list.

+
node +

The node to insert.

+
+
+
+
+ + +
[Index][TOC]
+ +
+

FT_List_Remove

+
+
+  FT_EXPORT( void )
+  FT_List_Remove( FT_List      list,
+                  FT_ListNode  node );
+
+

+
+

Removes 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.

+
+
+
+
+ + +
[Index][TOC]
+ +
+

FT_List_Up

+
+
+  FT_EXPORT( void )
+  FT_List_Up( FT_List      list,
+              FT_ListNode  node );
+
+

+
+

Moves 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.

+
+
+
+
+ + +
[Index][TOC]
+ +
+

FT_List_Iterator

+
+
+  typedef FT_Error
+  (*FT_List_Iterator)( FT_ListNode  node,
+                       void*        user );
+
+

+
+

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.

+
+
+
+
+ + +
[Index][TOC]
+ +
+

FT_List_Iterate

+
+
+  FT_EXPORT( FT_Error )
+  FT_List_Iterate( FT_List           list,
+                   FT_List_Iterator  iterator,
+                   void*             user );
+
+

+
+

Parses 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.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_List_Destructor

+
+
+  typedef void
+  (*FT_List_Destructor)( FT_Memory  memory,
+                         void*      data,
+                         void*      user );
+
+

+
+

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.

+
+
+
+
+ + +
[Index][TOC]
+ +
+

FT_List_Finalize

+
+
+  FT_EXPORT( void )
+  FT_List_Finalize( FT_List             list,
+                    FT_List_Destructor  destroy,
+                    FT_Memory           memory,
+                    void*               user );
+
+

+
+

Destroys 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.

+
+
+
+
+ + +
[Index][TOC]
+ + + diff --git a/src/WinLibs/freetype-2.3.5/docs/reference/ft2-lzw.html b/src/WinLibs/freetype-2.3.5/docs/reference/ft2-lzw.html new file mode 100644 index 000000000..93d6943e4 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/docs/reference/ft2-lzw.html @@ -0,0 +1,86 @@ + + + + +FreeType-2.3.5 API Reference + + + +

FreeType-2.3.5 API Reference

+ +

+LZW Streams +

+

Synopsis

+ + +
FT_Stream_OpenLZW


+ +
+

This section contains the declaration of LZW-specific functions.

+

+
+

FT_Stream_OpenLZW

+
+
+  FT_EXPORT( FT_Error )
+  FT_Stream_OpenLZW( FT_Stream  stream,
+                     FT_Stream  source );
+
+

+
+

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.

+
+
+
+ + +
[Index][TOC]
+ + + diff --git a/src/WinLibs/freetype-2.3.5/docs/reference/ft2-mac_specific.html b/src/WinLibs/freetype-2.3.5/docs/reference/ft2-mac_specific.html new file mode 100644 index 000000000..122da2aef --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/docs/reference/ft2-mac_specific.html @@ -0,0 +1,339 @@ + + + + +FreeType-2.3.5 API Reference + + + +

FreeType-2.3.5 API Reference

+ +

+Mac Specific Interface +

+

Synopsis

+ + + + +
FT_New_Face_From_FONDFT_GetFilePath_From_Mac_ATS_Name
FT_GetFile_From_Mac_NameFT_New_Face_From_FSSpec
FT_GetFile_From_Mac_ATS_NameFT_New_Face_From_FSRef


+ +
+

The following definitions are only available if FreeType is compiled on a Macintosh.

+

+
+

FT_New_Face_From_FOND

+
+
+  FT_EXPORT( FT_Error )
+  FT_New_Face_From_FOND( FT_Library  library,
+                         Handle      fond,
+                         FT_Long     face_index,
+                         FT_Face    *aface );
+
+

+
+

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 );        
+
+
+
+
+ + +
[Index][TOC]
+ +
+

FT_GetFile_From_Mac_Name

+
+
+  FT_EXPORT( FT_Error )
+  FT_GetFile_From_Mac_Name( const char*  fontName,
+                            FSSpec*      pathSpec,
+                            FT_Long*     face_index )
+                          FT_DEPRECATED_ATTRIBUTE;
+
+

+
+

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.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_GetFile_From_Mac_ATS_Name

+
+
+  FT_EXPORT( FT_Error )
+  FT_GetFile_From_Mac_ATS_Name( const char*  fontName,
+                                FSSpec*      pathSpec,
+                                FT_Long*     face_index )
+                              FT_DEPRECATED_ATTRIBUTE;
+
+

+
+

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.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_GetFilePath_From_Mac_ATS_Name

+
+
+  FT_EXPORT( FT_Error )
+  FT_GetFilePath_From_Mac_ATS_Name( const char*  fontName,
+                                    UInt8*       path,
+                                    UInt32       maxPathSize,
+                                    FT_Long*     face_index );
+
+

+
+

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.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_New_Face_From_FSSpec

+
+
+  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;
+
+

+
+

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.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_New_Face_From_FSRef

+
+
+  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;
+
+

+
+

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.

+
+
+
+ + +
[Index][TOC]
+ + + diff --git a/src/WinLibs/freetype-2.3.5/docs/reference/ft2-module_management.html b/src/WinLibs/freetype-2.3.5/docs/reference/ft2-module_management.html new file mode 100644 index 000000000..e3f6e144f --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/docs/reference/ft2-module_management.html @@ -0,0 +1,498 @@ + + + + +FreeType-2.3.5 API Reference + + + +

FreeType-2.3.5 API Reference

+ +

+Module Management +

+

Synopsis

+ + + + + +
FT_Module_ClassFT_New_LibraryFT_Renderer_Class
FT_Add_ModuleFT_Done_LibraryFT_Get_Renderer
FT_Get_ModuleFT_Set_Debug_HookFT_Set_Renderer
FT_Remove_ModuleFT_Add_Default_Modules


+ +
+

The definitions below are used to manage modules within FreeType. Modules can be added, upgraded, and removed at runtime.

+

+
+

FT_Module_Class

+
+
+  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;
+
+

+
+

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 +

A function used to initialize (not create) a new module object.

+
module_done +

A function used to finalize (not destroy) a given module object

+
get_interface +

Queries a given module for a specific interface by name.

+
+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Add_Module

+
+
+  FT_EXPORT( FT_Error )
+  FT_Add_Module( FT_Library              library,
+                 const FT_Module_Class*  clazz );
+
+

+
+

Adds 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.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Get_Module

+
+
+  FT_EXPORT( FT_Module )
+  FT_Get_Module( FT_Library   library,
+                 const char*  module_name );
+
+

+
+

Finds 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.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Remove_Module

+
+
+  FT_EXPORT( FT_Error )
+  FT_Remove_Module( FT_Library  library,
+                    FT_Module   module );
+
+

+
+

Removes 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.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_New_Library

+
+
+  FT_EXPORT( FT_Error )
+  FT_New_Library( FT_Memory    memory,
+                  FT_Library  *alibrary );
+
+

+
+

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.

+

+
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.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Done_Library

+
+
+  FT_EXPORT( FT_Error )
+  FT_Done_Library( FT_Library  library );
+
+

+
+

Discards 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.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Set_Debug_Hook

+
+
+  FT_EXPORT( void )
+  FT_Set_Debug_Hook( FT_Library         library,
+                     FT_UInt            hook_index,
+                     FT_DebugHook_Func  debug_hook );
+
+

+
+

Sets 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.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Add_Default_Modules

+
+
+  FT_EXPORT( void )
+  FT_Add_Default_Modules( FT_Library  library );
+
+

+
+

Adds 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.

+
+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Renderer_Class

+
+
+  typedef struct  FT_Renderer_Class_
+  {
+    FT_Module_Class       root;
+
+    FT_Glyph_Format       glyph_format;
+
+    FT_Renderer_RenderFunc     render_glyph;
+    FT_Renderer_TransformFunc  transform_glyph;
+    FT_Renderer_GetCBoxFunc    get_glyph_cbox;
+    FT_Renderer_SetModeFunc    set_mode;
+
+    FT_Raster_Funcs*           raster_class;
+
+  } FT_Renderer_Class;
+
+

+
+

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.

+
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.

+
+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Get_Renderer

+
+
+  FT_EXPORT( FT_Renderer )
+  FT_Get_Renderer( FT_Library       library,
+                   FT_Glyph_Format  format );
+
+

+
+

Retrieves 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.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Set_Renderer

+
+
+  FT_EXPORT( FT_Error )
+  FT_Set_Renderer( FT_Library     library,
+                   FT_Renderer    renderer,
+                   FT_UInt        num_params,
+                   FT_Parameter*  parameters );
+
+

+
+

Sets 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.

+
+
+
+ + +
[Index][TOC]
+ + + diff --git a/src/WinLibs/freetype-2.3.5/docs/reference/ft2-multiple_masters.html b/src/WinLibs/freetype-2.3.5/docs/reference/ft2-multiple_masters.html new file mode 100644 index 000000000..53940809b --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/docs/reference/ft2-multiple_masters.html @@ -0,0 +1,479 @@ + + + + +FreeType-2.3.5 API Reference + + + +

FreeType-2.3.5 API Reference

+ +

+Multiple Masters +

+

Synopsis

+ + + + + + + +
FT_MM_AxisFT_Get_MM_Var
FT_Multi_MasterFT_Set_MM_Design_Coordinates
FT_Var_AxisFT_Set_Var_Design_Coordinates
FT_Var_Named_StyleFT_Set_MM_Blend_Coordinates
FT_MM_VarFT_Set_Var_Blend_Coordinates
FT_Get_Multi_Master


+ +
+

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.

+

+
+

FT_MM_Axis

+
+
+  typedef struct  FT_MM_Axis_
+  {
+    FT_String*  name;
+    FT_Long     minimum;
+    FT_Long     maximum;
+
+  } FT_MM_Axis;
+
+

+
+

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.

+
+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Multi_Master

+
+
+  typedef struct  FT_Multi_Master_
+  {
+    FT_UInt     num_axis;
+    FT_UInt     num_designs;
+    FT_MM_Axis  axis[T1_MAX_MM_AXIS];
+
+  } FT_Multi_Master;
+
+

+
+

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.

+
+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Var_Axis

+
+
+  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;
+
+

+
+

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.

+
+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Var_Named_Style

+
+
+  typedef struct  FT_Var_Named_Style_
+  {
+    FT_Fixed*  coords;
+    FT_UInt    strid;
+
+  } FT_Var_Named_Style;
+
+

+
+

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.

+
+
+
+
+ + +
[Index][TOC]
+ +
+

FT_MM_Var

+
+
+  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;
+
+

+
+

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.

+
+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Get_Multi_Master

+
+
+  FT_EXPORT( FT_Error )
+  FT_Get_Multi_Master( FT_Face           face,
+                       FT_Multi_Master  *amaster );
+
+

+
+

Retrieves 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.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Get_MM_Var

+
+
+  FT_EXPORT( FT_Error )
+  FT_Get_MM_Var( FT_Face      face,
+                 FT_MM_Var*  *amaster );
+
+

+
+

Retrieves the Multiple Master/GX var descriptor of a given font.

+

+
input
+ + +
face +

A handle to the source face.

+
+
+
output
+ + +
amaster +

The Multiple Masters 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.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Set_MM_Design_Coordinates

+
+
+  FT_EXPORT( FT_Error )
+  FT_Set_MM_Design_Coordinates( FT_Face   face,
+                                FT_UInt   num_coords,
+                                FT_Long*  coords );
+
+

+
+

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.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Set_Var_Design_Coordinates

+
+
+  FT_EXPORT( FT_Error )
+  FT_Set_Var_Design_Coordinates( FT_Face    face,
+                                 FT_UInt    num_coords,
+                                 FT_Fixed*  coords );
+
+

+
+

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.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Set_MM_Blend_Coordinates

+
+
+  FT_EXPORT( FT_Error )
+  FT_Set_MM_Blend_Coordinates( FT_Face    face,
+                               FT_UInt    num_coords,
+                               FT_Fixed*  coords );
+
+

+
+

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.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Set_Var_Blend_Coordinates

+
+
+  FT_EXPORT( FT_Error )
+  FT_Set_Var_Blend_Coordinates( FT_Face    face,
+                                FT_UInt    num_coords,
+                                FT_Fixed*  coords );
+
+

+
+

This is another name of FT_Set_MM_Blend_Coordinates.

+

+
+
+ + +
[Index][TOC]
+ + + diff --git a/src/WinLibs/freetype-2.3.5/docs/reference/ft2-ot_validation.html b/src/WinLibs/freetype-2.3.5/docs/reference/ft2-ot_validation.html new file mode 100644 index 000000000..b91de13b2 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/docs/reference/ft2-ot_validation.html @@ -0,0 +1,190 @@ + + + + +FreeType-2.3.5 API Reference + + + +

FreeType-2.3.5 API Reference

+ +

+OpenType Validation +

+

Synopsis

+ + +
FT_VALIDATE_OTXXXFT_OpenType_ValidateFT_OpenType_Free


+ +
+

This section contains the declaration of functions to validate some OpenType tables (BASE, GDEF, GPOS, GSUB, JSTF).

+

+
+

FT_VALIDATE_OTXXX

+
+
+#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_OT  FT_VALIDATE_BASE | \
+                        FT_VALIDATE_GDEF | \
+                        FT_VALIDATE_GPOS | \
+                        FT_VALIDATE_GSUB | \
+                        FT_VALIDATE_JSTF
+
+

+
+

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_OT +

Validate all OpenType tables (BASE, GDEF, GPOS, GSUB, JSTF).

+
+
+
+
+ + +
[Index][TOC]
+ +
+

FT_OpenType_Validate

+
+
+  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 );
+
+

+
+

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.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_OpenType_Free

+
+
+  FT_EXPORT( void )
+  FT_OpenType_Free( FT_Face   face,
+                    FT_Bytes  table );
+
+

+
+

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.

+
+
+
+ + +
[Index][TOC]
+ + + diff --git a/src/WinLibs/freetype-2.3.5/docs/reference/ft2-outline_processing.html b/src/WinLibs/freetype-2.3.5/docs/reference/ft2-outline_processing.html new file mode 100644 index 000000000..4dff7f3d7 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/docs/reference/ft2-outline_processing.html @@ -0,0 +1,1028 @@ + + + + +FreeType-2.3.5 API Reference + + + +

FreeType-2.3.5 API Reference

+ +

+Outline Processing +

+

Synopsis

+ + + + + + + + + + + + + +
FT_OutlineFT_Outline_MoveToFunc
FT_OUTLINE_FLAGSFT_Outline_LineToFunc
FT_Outline_NewFT_Outline_ConicToFunc
FT_Outline_DoneFT_Outline_CubicToFunc
FT_Outline_CopyFT_Outline_Funcs
FT_Outline_TranslateFT_Outline_Decompose
FT_Outline_TransformFT_Outline_Get_CBox
FT_Outline_EmboldenFT_Outline_Get_Bitmap
FT_Outline_ReverseFT_Outline_Render
FT_Outline_CheckFT_Orientation
FT_Outline_Get_BBoxFT_Outline_Get_Orientation
ft_outline_flags


+ +
+

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.

+

+
+

FT_Outline

+
+
+  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;
+
+

+
+

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’ when 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.

+
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.

+
+
+
+
+ + +
[Index][TOC]
+ +
+

FT_OUTLINE_FLAGS

+
+
+#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_HIGH_PRECISION   0x100
+#define FT_OUTLINE_SINGLE_PASS      0x200
+
+

+
+

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’ & ‘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 raster).

+
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.

+
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.

+
+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Outline_New

+
+
+  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 );
+
+

+
+

Creates 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. NULL in case of error.

+
+
+
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.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Outline_Done

+
+
+  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 );
+
+

+
+

Destroys 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().

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Outline_Copy

+
+
+  FT_EXPORT( FT_Error )
+  FT_Outline_Copy( const FT_Outline*  source,
+                   FT_Outline        *target );
+
+

+
+

Copies 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.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Outline_Translate

+
+
+  FT_EXPORT( void )
+  FT_Outline_Translate( const FT_Outline*  outline,
+                        FT_Pos             xOffset,
+                        FT_Pos             yOffset );
+
+

+
+

Applies 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.

+
+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Outline_Transform

+
+
+  FT_EXPORT( void )
+  FT_Outline_Transform( const FT_Outline*  outline,
+                        const FT_Matrix*   matrix );
+
+

+
+

Applies 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.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Outline_Embolden

+
+
+  FT_EXPORT( FT_Error )
+  FT_Outline_Embolden( FT_Outline*  outline,
+                       FT_Pos       strength );
+
+

+
+

Emboldens 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.

+

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 );         
+
+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Outline_Reverse

+
+
+  FT_EXPORT( void )
+  FT_Outline_Reverse( FT_Outline*  outline );
+
+

+
+

Reverses 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 functions 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.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Outline_Check

+
+
+  FT_EXPORT( FT_Error )
+  FT_Outline_Check( FT_Outline*  outline );
+
+

+
+

Check the contents of an outline descriptor.

+

+
input
+ + +
outline +

A handle to a source outline.

+
+
+
return
+

FreeType error code. 0 means success.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Outline_Get_BBox

+
+
+  FT_EXPORT( FT_Error )
+  FT_Outline_Get_BBox( FT_Outline*  outline,
+                       FT_BBox     *abbox );
+
+

+
+

Computes 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 walked over 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.

+
+
+
+ + +
[Index][TOC]
+ +
+

ft_outline_flags

+
+
+#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
+
+

+
+

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.

+
+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Outline_MoveToFunc

+
+
+  typedef int
+  (*FT_Outline_MoveToFunc)( const FT_Vector*  to,
+                            void*             user );
+
+#define FT_Outline_MoveTo_Func  FT_Outline_MoveToFunc
+
+

+
+

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.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Outline_LineToFunc

+
+
+  typedef int
+  (*FT_Outline_LineToFunc)( const FT_Vector*  to,
+                            void*             user );
+
+#define  FT_Outline_LineTo_Func  FT_Outline_LineToFunc
+
+

+
+

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.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Outline_ConicToFunc

+
+
+  typedef int
+  (*FT_Outline_ConicToFunc)( const FT_Vector*  control,
+                             const FT_Vector*  to,
+                             void*             user );
+
+#define  FT_Outline_ConicTo_Func  FT_Outline_ConicToFunc
+
+

+
+

A function pointer type use to describe the signature of a ‘conic to’ function during outline walking/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.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Outline_CubicToFunc

+
+
+  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
+
+

+
+

A function pointer type used to describe the signature of a ‘cubic to’ function during outline walking/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.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Outline_Funcs

+
+
+  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;
+
+

+
+

A structure to hold various function pointers used during outline decomposition in order to emit segments, conic, and cubic Béziers, as well as ‘move to’ and ‘close to’ operations.

+

+
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 value of ‘shift’ and ‘delta’ to 0 to get the original point coordinates.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Outline_Decompose

+
+
+  FT_EXPORT( FT_Error )
+  FT_Outline_Decompose( FT_Outline*              outline,
+                        const FT_Outline_Funcs*  func_interface,
+                        void*                    user );
+
+

+
+

Walks 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
+

FreeType error code. 0 means success.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Outline_Get_CBox

+
+
+  FT_EXPORT( void )
+  FT_Outline_Get_CBox( const FT_Outline*  outline,
+                       FT_BBox           *acbox );
+
+

+
+

Returns 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.

+
+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Outline_Get_Bitmap

+
+
+  FT_EXPORT( FT_Error )
+  FT_Outline_Get_Bitmap( FT_Library        library,
+                         FT_Outline*       outline,
+                         const FT_Bitmap  *abitmap );
+
+

+
+

Renders 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!

+

It will use the raster corresponding to the default glyph format.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Outline_Render

+
+
+  FT_EXPORT( FT_Error )
+  FT_Outline_Render( FT_Library         library,
+                     FT_Outline*        outline,
+                     FT_Raster_Params*  params );
+
+

+
+

Renders an outline within a bitmap using the current scan-convert. This functions 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.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Orientation

+
+
+  typedef enum
+  {
+    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;
+
+

+
+

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.

+
+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Outline_Get_Orientation

+
+
+  FT_EXPORT( FT_Orientation )
+  FT_Outline_Get_Orientation( FT_Outline*  outline );
+
+

+
+

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.

+
+
+
+ + +
[Index][TOC]
+ + + diff --git a/src/WinLibs/freetype-2.3.5/docs/reference/ft2-pfr_fonts.html b/src/WinLibs/freetype-2.3.5/docs/reference/ft2-pfr_fonts.html new file mode 100644 index 000000000..9e5284672 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/docs/reference/ft2-pfr_fonts.html @@ -0,0 +1,191 @@ + + + + +FreeType-2.3.5 API Reference + + + +

FreeType-2.3.5 API Reference

+ +

+PFR Fonts +

+

Synopsis

+ + +
FT_Get_PFR_MetricsFT_Get_PFR_KerningFT_Get_PFR_Advance


+ +
+

This section contains the declaration of PFR-specific functions.

+

+
+

FT_Get_PFR_Metrics

+
+
+  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 );
+
+

+
+

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’. 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.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Get_PFR_Kerning

+
+
+  FT_EXPORT( FT_Error )
+  FT_Get_PFR_Kerning( FT_Face     face,
+                      FT_UInt     left,
+                      FT_UInt     right,
+                      FT_Vector  *avector );
+
+

+
+

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.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Get_PFR_Advance

+
+
+  FT_EXPORT( FT_Error )
+  FT_Get_PFR_Advance( FT_Face   face,
+                      FT_UInt   gindex,
+                      FT_Pos   *aadvance );
+
+

+
+

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).

+
+
+
+ + +
[Index][TOC]
+ + + diff --git a/src/WinLibs/freetype-2.3.5/docs/reference/ft2-raster.html b/src/WinLibs/freetype-2.3.5/docs/reference/ft2-raster.html new file mode 100644 index 000000000..38beaa76d --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/docs/reference/ft2-raster.html @@ -0,0 +1,574 @@ + + + + +FreeType-2.3.5 API Reference + + + +

FreeType-2.3.5 API Reference

+ +

+Scanline Converter +

+

Synopsis

+ + + + + + +
FT_RasterFT_RASTER_FLAG_XXXFT_Raster_SetModeFunc
FT_SpanFT_Raster_ParamsFT_Raster_RenderFunc
FT_SpanFuncFT_Raster_NewFuncFT_Raster_Funcs
FT_Raster_BitTest_FuncFT_Raster_DoneFunc
FT_Raster_BitSet_FuncFT_Raster_ResetFunc


+ +
+

This section contains technical definitions.

+

+
+

FT_Raster

+
+
+  typedef struct FT_RasterRec_*  FT_Raster;
+
+

+
+

A handle (pointer) to a raster object. Each object can be used independently to convert an outline into a bitmap or pixmap.

+

+
+
+ + +
[Index][TOC]
+ +
+

FT_Span

+
+
+  typedef struct  FT_Span_
+  {
+    short           x;
+    unsigned short  len;
+    unsigned char   coverage;
+
+  } FT_Span;
+
+

+
+

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.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_SpanFunc

+
+
+  typedef void
+  (*FT_SpanFunc)( int             y,
+                  int             count,
+                  const FT_Span*  spans,
+                  void*           user );
+
+#define FT_Raster_Span_Func   FT_SpanFunc
+
+

+
+

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.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Raster_BitTest_Func

+
+
+  typedef int
+  (*FT_Raster_BitTest_Func)( int    y,
+                             int    x,
+                             void*  user );
+
+

+
+

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.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Raster_BitSet_Func

+
+
+  typedef void
+  (*FT_Raster_BitSet_Func)( int    y,
+                            int    x,
+                            void*  user );
+
+

+
+

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.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_RASTER_FLAG_XXX

+
+
+#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
+
+

+
+

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.

+
+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Raster_Params

+
+
+  typedef struct  FT_Raster_Params_
+  {
+    const FT_Bitmap*        target;
+    const void*             source;
+    int                     flags;
+    FT_SpanFunc             gray_spans;
+    FT_SpanFunc             black_spans;
+    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;
+
+

+
+

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.

+
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.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Raster_NewFunc

+
+
+  typedef int
+  (*FT_Raster_NewFunc)( void*       memory,
+                        FT_Raster*  raster );
+
+#define  FT_Raster_New_Func    FT_Raster_NewFunc
+
+

+
+

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.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Raster_DoneFunc

+
+
+  typedef void
+  (*FT_Raster_DoneFunc)( FT_Raster  raster );
+
+#define  FT_Raster_Done_Func   FT_Raster_DoneFunc
+
+

+
+

A function used to destroy a given raster object.

+

+
input
+ + +
raster +

A handle to the raster object.

+
+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Raster_ResetFunc

+
+
+  typedef void
+  (*FT_Raster_ResetFunc)( FT_Raster       raster,
+                          unsigned char*  pool_base,
+                          unsigned long   pool_size );
+
+#define  FT_Raster_Reset_Func   FT_Raster_ResetFunc
+
+

+
+

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.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Raster_SetModeFunc

+
+
+  typedef int
+  (*FT_Raster_SetModeFunc)( FT_Raster      raster,
+                            unsigned long  mode,
+                            void*          args );
+
+#define  FT_Raster_Set_Mode_Func  FT_Raster_SetModeFunc
+
+

+
+

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.

+
+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Raster_RenderFunc

+
+
+  typedef int
+  (*FT_Raster_RenderFunc)( FT_Raster                raster,
+                           const FT_Raster_Params*  params );
+
+#define  FT_Raster_Render_Func    FT_Raster_RenderFunc
+
+

+
+

Invokes 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).

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Raster_Funcs

+
+
+  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;
+
+

+
+

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.

+
+
+
+
+ + +
[Index][TOC]
+ + + diff --git a/src/WinLibs/freetype-2.3.5/docs/reference/ft2-sfnt_names.html b/src/WinLibs/freetype-2.3.5/docs/reference/ft2-sfnt_names.html new file mode 100644 index 000000000..33a954642 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/docs/reference/ft2-sfnt_names.html @@ -0,0 +1,177 @@ + + + + +FreeType-2.3.5 API Reference + + + +

FreeType-2.3.5 API Reference

+ +

+SFNT Names +

+

Synopsis

+ + +
FT_SfntNameFT_Get_Sfnt_Name_CountFT_Get_Sfnt_Name


+ +
+

The TrueType and OpenType specification 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!

+

+
+

FT_SfntName

+
+
+  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;
+
+

+
+

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.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Get_Sfnt_Name_Count

+
+
+  FT_EXPORT( FT_UInt )
+  FT_Get_Sfnt_Name_Count( FT_Face  face );
+
+

+
+

Retrieves 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.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Get_Sfnt_Name

+
+
+  FT_EXPORT( FT_Error )
+  FT_Get_Sfnt_Name( FT_Face       face,
+                    FT_UInt       idx,
+                    FT_SfntName  *aname );
+
+

+
+

Retrieves 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.

+

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.

+
+
+
+ + +
[Index][TOC]
+ + + diff --git a/src/WinLibs/freetype-2.3.5/docs/reference/ft2-sizes_management.html b/src/WinLibs/freetype-2.3.5/docs/reference/ft2-sizes_management.html new file mode 100644 index 000000000..017aaf3d2 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/docs/reference/ft2-sizes_management.html @@ -0,0 +1,151 @@ + + + + +FreeType-2.3.5 API Reference + + + +

FreeType-2.3.5 API Reference

+ +

+Size Management +

+

Synopsis

+ + +
FT_New_SizeFT_Done_SizeFT_Activate_Size


+ +
+

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.

+

+
+

FT_New_Size

+
+
+  FT_EXPORT( FT_Error )
+  FT_New_Size( FT_Face   face,
+               FT_Size*  size );
+
+

+
+

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.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Done_Size

+
+
+  FT_EXPORT( FT_Error )
+  FT_Done_Size( FT_Size  size );
+
+

+
+

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.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Activate_Size

+
+
+  FT_EXPORT( FT_Error )
+  FT_Activate_Size( FT_Size  size );
+
+

+
+

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 last-created one 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.

+
+
+
+ + +
[Index][TOC]
+ + + diff --git a/src/WinLibs/freetype-2.3.5/docs/reference/ft2-system_interface.html b/src/WinLibs/freetype-2.3.5/docs/reference/ft2-system_interface.html new file mode 100644 index 000000000..807afb201 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/docs/reference/ft2-system_interface.html @@ -0,0 +1,392 @@ + + + + +FreeType-2.3.5 API Reference + + + +

FreeType-2.3.5 API Reference

+ +

+System Interface +

+

Synopsis

+ + + + + +
FT_MemoryFT_MemoryRecFT_Stream_CloseFunc
FT_Alloc_FuncFT_StreamFT_StreamRec
FT_Free_FuncFT_StreamDesc
FT_Realloc_FuncFT_Stream_IoFunc


+ +
+

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.

+

+
+

FT_Memory

+
+
+  typedef struct FT_MemoryRec_*  FT_Memory;
+
+

+
+

A handle to a given memory manager object, defined with an FT_MemoryRec structure.

+

+
+
+ + +
[Index][TOC]
+ +
+

FT_Alloc_Func

+
+
+  typedef void*
+  (*FT_Alloc_Func)( FT_Memory  memory,
+                    long       size );
+
+

+
+

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.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Free_Func

+
+
+  typedef void
+  (*FT_Free_Func)( FT_Memory  memory,
+                   void*      block );
+
+

+
+

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.

+
+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Realloc_Func

+
+
+  typedef void*
+  (*FT_Realloc_Func)( FT_Memory  memory,
+                      long       cur_size,
+                      long       new_size,
+                      void*      block );
+
+

+
+

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.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_MemoryRec

+
+
+  struct  FT_MemoryRec_
+  {
+    void*            user;
+    FT_Alloc_Func    alloc;
+    FT_Free_Func     free;
+    FT_Realloc_Func  realloc;
+  };
+
+

+
+

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.

+
+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Stream

+
+
+  typedef struct FT_StreamRec_*  FT_Stream;
+
+

+
+

A handle to an input stream.

+

+
+
+ + +
[Index][TOC]
+ +
+

FT_StreamDesc

+
+
+  typedef union  FT_StreamDesc_
+  {
+    long   value;
+    void*  pointer;
+
+  } FT_StreamDesc;
+
+

+
+

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.

+

+
+
+ + +
[Index][TOC]
+ +
+

FT_Stream_IoFunc

+
+
+  typedef unsigned long
+  (*FT_Stream_IoFunc)( FT_Stream       stream,
+                       unsigned long   offset,
+                       unsigned char*  buffer,
+                       unsigned long   count );
+
+

+
+

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.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Stream_CloseFunc

+
+
+  typedef void
+  (*FT_Stream_CloseFunc)( FT_Stream  stream );
+
+

+
+

A function used to close a given input stream.

+

+
input
+ + +
stream +

A handle to the target stream.

+
+
+
+
+ + +
[Index][TOC]
+ +
+

FT_StreamRec

+
+
+  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;
+
+

+
+

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.

+
+
+
+
+ + +
[Index][TOC]
+ + + diff --git a/src/WinLibs/freetype-2.3.5/docs/reference/ft2-toc.html b/src/WinLibs/freetype-2.3.5/docs/reference/ft2-toc.html new file mode 100644 index 000000000..ea43bbe86 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/docs/reference/ft2-toc.html @@ -0,0 +1,193 @@ + + + + +FreeType-2.3.5 API Reference + + + +

FreeType-2.3.5 API Reference

+ +

Table of Contents

+

General Remarks

  • + + +
    +User allocation +

    How client applications should allocate FreeType data structures.

    +
    +
+

Core API

+

Format-Specific API

+

Cache Sub-System

  • + + +
    +Cache Sub-System +

    How to cache face, size, and glyph data with FreeType 2.

    +
    +
+

Support API

+

Miscellaneous

+

Global Index

+
generated on Mon Jul 2 23:41:39 2007
+ diff --git a/src/WinLibs/freetype-2.3.5/docs/reference/ft2-truetype_engine.html b/src/WinLibs/freetype-2.3.5/docs/reference/ft2-truetype_engine.html new file mode 100644 index 000000000..bac4d4208 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/docs/reference/ft2-truetype_engine.html @@ -0,0 +1,122 @@ + + + + +FreeType-2.3.5 API Reference + + + +

FreeType-2.3.5 API Reference

+ +

+The TrueType Engine +

+

Synopsis

+ + +
FT_TrueTypeEngineTypeFT_Get_TrueType_Engine_Type


+ +
+

This section contains a function used to query the level of TrueType bytecode support compiled in this version of the library.

+

+
+

FT_TrueTypeEngineType

+
+
+  typedef enum
+  {
+    FT_TRUETYPE_ENGINE_TYPE_NONE = 0,
+    FT_TRUETYPE_ENGINE_TYPE_UNPATENTED,
+    FT_TRUETYPE_ENGINE_TYPE_PATENTED
+
+  } FT_TrueTypeEngineType;
+
+

+
+

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

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Get_TrueType_Engine_Type

+
+
+  FT_EXPORT( FT_TrueTypeEngineType )
+  FT_Get_TrueType_Engine_Type( FT_Library  library );
+
+

+
+

Return a 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

+
+
+
+ + +
[Index][TOC]
+ + + diff --git a/src/WinLibs/freetype-2.3.5/docs/reference/ft2-truetype_tables.html b/src/WinLibs/freetype-2.3.5/docs/reference/ft2-truetype_tables.html new file mode 100644 index 000000000..6c71cde3a --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/docs/reference/ft2-truetype_tables.html @@ -0,0 +1,794 @@ + + + + +FreeType-2.3.5 API Reference + + + +

FreeType-2.3.5 API Reference

+ +

+TrueType Tables +

+

Synopsis

+ + + + + + + + +
TT_HeaderFT_Sfnt_Tag
TT_HoriHeaderFT_Get_Sfnt_Table
TT_VertHeaderFT_Load_Sfnt_Table
TT_OS2FT_Sfnt_Table_Info
TT_PostscriptFT_Get_CMap_Language_ID
TT_PCLTFT_Get_CMap_Format
TT_MaxProfileFT_PARAM_TAG_UNPATENTED_HINTING


+ +
+

This section contains the definition of TrueType-specific tables as well as some routines used to access and process them.

+

+
+

TT_Header

+
+
+  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;
+
+

+
+

A structure used to model a TrueType font header table. All fields follow the TrueType specification.

+

+
+
+ + +
[Index][TOC]
+ +
+

TT_HoriHeader

+
+
+  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;
+
+

+
+

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 +

10 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.

+
+
+
+ + +
[Index][TOC]
+ +
+

TT_VertHeader

+
+
+  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;
+
+

+
+

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.

+
+
+
+ + +
[Index][TOC]
+ +
+

TT_OS2

+
+
+  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;
+
+

+
+

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.

+

+
+
+ + +
[Index][TOC]
+ +
+

TT_Postscript

+
+
+  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;
+
+

+
+

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.

+

+
+
+ + +
[Index][TOC]
+ +
+

TT_PCLT

+
+
+  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;
+
+

+
+

A structure used to model a TrueType PCLT table. All fields comply to the TrueType specification.

+

+
+
+ + +
[Index][TOC]
+ +
+

TT_MaxProfile

+
+
+  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;
+
+

+
+

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.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Sfnt_Tag

+
+
+  typedef enum
+  {
+    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;
+
+

+
+

An enumeration used to specify the index of an SFNT table. Used in the FT_Get_Sfnt_Table API function.

+

+
+
+ + +
[Index][TOC]
+ +
+

FT_Get_Sfnt_Table

+
+
+  FT_EXPORT( void* )
+  FT_Get_Sfnt_Table( FT_Face      face,
+                     FT_Sfnt_Tag  tag );
+
+

+
+

Returns 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.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Load_Sfnt_Table

+
+
+  FT_EXPORT( FT_Error )
+  FT_Load_Sfnt_Table( FT_Face    face,
+                      FT_ULong   tag,
+                      FT_Long    offset,
+                      FT_Byte*   buffer,
+                      FT_ULong*  length );
+
+

+
+

Loads 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 ... }
+
+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Sfnt_Table_Info

+
+
+  FT_EXPORT( FT_Error )
+  FT_Sfnt_Table_Info( FT_Face    face,
+                      FT_UInt    table_index,
+                      FT_ULong  *tag,
+                      FT_ULong  *length );
+
+

+
+

Returns 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 by Windows.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Get_CMap_Language_ID

+
+
+  FT_EXPORT( FT_ULong )
+  FT_Get_CMap_Language_ID( FT_CharMap  charmap );
+
+

+
+

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.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Get_CMap_Format

+
+
+  FT_EXPORT( FT_Long )
+  FT_Get_CMap_Format( FT_CharMap  charmap );
+
+

+
+

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.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_PARAM_TAG_UNPATENTED_HINTING

+
+
+#define FT_PARAM_TAG_UNPATENTED_HINTING  FT_MAKE_TAG( 'u', 'n', 'p', 'a' )
+
+

+
+

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.

+

+
+
+ + +
[Index][TOC]
+ + + diff --git a/src/WinLibs/freetype-2.3.5/docs/reference/ft2-type1_tables.html b/src/WinLibs/freetype-2.3.5/docs/reference/ft2-type1_tables.html new file mode 100644 index 000000000..4d7844e36 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/docs/reference/ft2-type1_tables.html @@ -0,0 +1,758 @@ + + + + +FreeType-2.3.5 API Reference + + + +

FreeType-2.3.5 API Reference

+ +

+Type 1 Tables +

+

Synopsis

+ + + + + + + +
PS_FontInfoRecCID_InfoTT_MAC_ID_XXX
T1_FontInfoFT_Has_PS_Glyph_NamesTT_ISO_ID_XXX
PS_PrivateRecFT_Get_PS_Font_InfoTT_MS_ID_XXX
T1_PrivateFT_Get_PS_Font_PrivateTT_ADOBE_ID_XXX
T1_Blend_FlagsTT_PLATFORM_XXX
CID_FaceInfoRecTT_APPLE_ID_XXX


+ +
+

This section contains the definition of Type 1-specific tables, including structures related to other PostScript font formats.

+

+
+

PS_FontInfoRec

+
+
+  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, *PS_FontInfo;
+
+

+
+

A structure used to model a Type1/Type2 FontInfo dictionary. Note that for Multiple Master fonts, each instance has its own FontInfo dictionary.

+

+
+
+ + +
[Index][TOC]
+ +
+

T1_FontInfo

+
+
+  typedef PS_FontInfoRec  T1_FontInfo;
+
+

+
+

This type is equivalent to PS_FontInfoRec. It is deprecated but kept to maintain source compatibility between various versions of FreeType.

+

+
+
+ + +
[Index][TOC]
+ +
+

PS_PrivateRec

+
+
+  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, *PS_Private;
+
+

+
+

A structure used to model a Type1/Type2 private dictionary. Note that for Multiple Master fonts, each instance has its own Private dictionary.

+

+
+
+ + +
[Index][TOC]
+ +
+

T1_Private

+
+
+  typedef PS_PrivateRec  T1_Private;
+
+

+
+

This type is equivalent to PS_PrivateRec. It is deprecated but kept to maintain source compatibility between various versions of FreeType.

+

+
+
+ + +
[Index][TOC]
+ +
+

T1_Blend_Flags

+
+
+  typedef enum
+  {
+    /*# 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;
+
+

+
+

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.

+

+
+
+ + +
[Index][TOC]
+ +
+

CID_FaceInfoRec

+
+
+  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, *CID_FaceInfo;
+
+

+
+

A structure used to represent CID Face information.

+

+
+
+ + +
[Index][TOC]
+ +
+

CID_Info

+
+
+  typedef CID_FaceInfoRec  CID_Info;
+
+

+
+

This type is equivalent to CID_FaceInfoRec. It is deprecated but kept to maintain source compatibility between various versions of FreeType.

+

+
+
+ + +
[Index][TOC]
+ +
+

FT_Has_PS_Glyph_Names

+
+
+  FT_EXPORT( FT_Int )
+  FT_Has_PS_Glyph_Names( FT_Face  face );
+
+

+
+

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.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Get_PS_Font_Info

+
+
+  FT_EXPORT( FT_Error )
+  FT_Get_PS_Font_Info( FT_Face          face,
+                       PS_FontInfoRec  *afont_info );
+
+

+
+

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.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Get_PS_Font_Private

+
+
+  FT_EXPORT( FT_Error )
+  FT_Get_PS_Font_Private( FT_Face         face,
+                          PS_PrivateRec  *afont_private );
+
+

+
+

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 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.

+
+
+
+ + +
[Index][TOC]
+ +
+

TT_PLATFORM_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 */
+
+

+
+

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.

+
+
+
+
+ + +
[Index][TOC]
+ +
+

TT_APPLE_ID_XXX

+
+
+#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 */
+
+

+
+

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.

+
+
+
+
+ + +
[Index][TOC]
+ +
+

TT_MAC_ID_XXX

+
+
+#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
+
+

+
+

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 +

+
+
+
+
+ + +
[Index][TOC]
+ +
+

TT_ISO_ID_XXX

+
+
+#define TT_ISO_ID_7BIT_ASCII  0
+#define TT_ISO_ID_10646       1
+#define TT_ISO_ID_8859_1      2
+
+

+
+

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.

+
+
+
+
+ + +
[Index][TOC]
+ +
+

TT_MS_ID_XXX

+
+
+#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
+
+

+
+

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.)

+
+
+
+
+ + +
[Index][TOC]
+ +
+

TT_ADOBE_ID_XXX

+
+
+#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
+
+

+
+

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.

+
+
+
+
+ + +
[Index][TOC]
+ + + diff --git a/src/WinLibs/freetype-2.3.5/docs/reference/ft2-user_allocation.html b/src/WinLibs/freetype-2.3.5/docs/reference/ft2-user_allocation.html new file mode 100644 index 000000000..b213db3c6 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/docs/reference/ft2-user_allocation.html @@ -0,0 +1,41 @@ + + + + +FreeType-2.3.5 API Reference + + + +

FreeType-2.3.5 API Reference

+ +

+User allocation +

+
+

FreeType assumes that structures allocated by the user and passed as arguments are zeroed out except for the actual data. With other words, it is recommended to use ‘calloc’ (or variants of it) instead of ‘malloc’ for allocation.

+

+ + diff --git a/src/WinLibs/freetype-2.3.5/docs/reference/ft2-version.html b/src/WinLibs/freetype-2.3.5/docs/reference/ft2-version.html new file mode 100644 index 000000000..b52f9c1bd --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/docs/reference/ft2-version.html @@ -0,0 +1,198 @@ + + + + +FreeType-2.3.5 API Reference + + + +

FreeType-2.3.5 API Reference

+ +

+FreeType Version +

+

Synopsis

+ + + +
FREETYPE_XXXFT_Face_CheckTrueTypePatents
FT_Library_VersionFT_Face_SetUnpatentedHinting


+ +
+

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.

+

+
+

FREETYPE_XXX

+
+
+#define FREETYPE_MAJOR  2
+#define FREETYPE_MINOR  3
+#define FREETYPE_PATCH  5
+
+

+
+

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.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Library_Version

+
+
+  FT_EXPORT( void )
+  FT_Library_Version( FT_Library   library,
+                      FT_Int      *amajor,
+                      FT_Int      *aminor,
+                      FT_Int      *apatch );
+
+

+
+

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.

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Face_CheckTrueTypePatents

+
+
+  FT_EXPORT( FT_Bool )
+  FT_Face_CheckTrueTypePatents( FT_Face  face );
+
+

+
+

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

+
+
+
+ + +
[Index][TOC]
+ +
+

FT_Face_SetUnpatentedHinting

+
+
+  FT_EXPORT( FT_Bool )
+  FT_Face_SetUnpatentedHinting( FT_Face  face,
+                                FT_Bool  value );
+
+

+
+

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 a SFNT font, or if the unpatented hinter is not compiled in this instance of the library.

+
+
since
+

2.3.5

+
+
+
+ + +
[Index][TOC]
+ + + diff --git a/src/WinLibs/freetype-2.3.5/docs/reference/ft2-winfnt_fonts.html b/src/WinLibs/freetype-2.3.5/docs/reference/ft2-winfnt_fonts.html new file mode 100644 index 000000000..1ce92ce4c --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/docs/reference/ft2-winfnt_fonts.html @@ -0,0 +1,246 @@ + + + + +FreeType-2.3.5 API Reference + + + +

FreeType-2.3.5 API Reference

+ +

+Window FNT Files +

+

Synopsis

+ + +
FT_WinFNT_ID_XXXFT_WinFNT_HeaderRecFT_Get_WinFNT_Header


+ +
+

This section contains the declaration of Windows FNT specific functions.

+

+
+

FT_WinFNT_ID_XXX

+
+
+#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
+
+

+
+

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).

+
+
+
+
+ + +
[Index][TOC]
+ +
+

FT_WinFNT_HeaderRec

+
+
+  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, *FT_WinFNT_Header;
+
+

+
+

Windows FNT Header info.

+

+
+
+ + +
[Index][TOC]
+ +
+

FT_Get_WinFNT_Header

+
+
+  FT_EXPORT( FT_Error )
+  FT_Get_WinFNT_Header( FT_Face               face,
+                        FT_WinFNT_HeaderRec  *aheader );
+
+

+
+

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.

+
+
+
+ + +
[Index][TOC]
+ + + diff --git a/src/WinLibs/freetype-2.3.5/docs/release b/src/WinLibs/freetype-2.3.5/docs/release new file mode 100644 index 000000000..36bcb4768 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/docs/release @@ -0,0 +1,151 @@ +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 freetype2 and ft2demos + modules). + +. Tag the CVS (freetype2, ft2demos). + + TODO: Tag the home page CVS on savannah.nongnu.org. + +. Say `make dist' in both the freetype2 and ft2demos 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' and + `$SAVANNAH_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.1 + SAVANNAH_USER=wl + + ##################################################################### + + GPG='/usr/bin/gpg --batch --no-tty' + + version=`echo $VERSION | sed "s/\\.//g"` + + UNIX_PACKAGES="freetype ft2demos freetype-doc" + WINDOWS_PACKAGES="ft ftdmo ftdoc" + UNIX_ZIP="tar.gz tar.bz2" + WINDOWS_ZIP="zip" + + PACKAGE_LIST= + for i in $UNIX_PACKAGES; do + for j in $UNIX_ZIP; do + PACKAGE_LIST="$PACKAGE_LIST $i-$VERSION.$j" + done + done + for i in $WINDOWS_PACKAGES; do + for j in $WINDOWS_ZIP; do + PACKAGE_LIST="$PACKAGE_LIST $i$version.$j" + done + done + + 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 + + SIGNATURE_LIST= + for i in $PACKAGE_LIST; do + SIGNATURE_LIST="$SIGNATURE_LIST $i.sig" + done + + scp $PACKAGE_LIST $SIGNATURE_LIST \ + $SAVANNAH_USER@dl.sv.nongnu.org:/releases/freetype/ + + for f in $PACKAGE_LIST $SIGNATURE_LIST; do + ncftpput upload.sf.net /incoming $f + done + + # 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 by +David Turner, Robert Wilhelm, and Werner Lemberg. + +This file is part of the FreeType project, and may only be used, +modified, and distributed under the terms of the FreeType project +license, LICENSE.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/src/WinLibs/freetype-2.3.5/include/freetype/config/ftconfig.h b/src/WinLibs/freetype-2.3.5/include/freetype/config/ftconfig.h new file mode 100644 index 000000000..1547f5adb --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/include/freetype/config/ftconfig.h @@ -0,0 +1,363 @@ +/***************************************************************************/ +/* */ +/* ftconfig.h */ +/* */ +/* ANSI-specific configuration file (specification only). */ +/* */ +/* Copyright 1996-2001, 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. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* 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 +#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 == (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) */ + + +#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 ) 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/src/WinLibs/freetype-2.3.5/include/freetype/config/ftheader.h b/src/WinLibs/freetype-2.3.5/include/freetype/config/ftheader.h new file mode 100644 index 000000000..b957d05be --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/include/freetype/config/ftheader.h @@ -0,0 +1,729 @@ +/***************************************************************************/ +/* */ +/* ftheader.h */ +/* */ +/* Build macros of the FreeType 2 library. */ +/* */ +/* 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 __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_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_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> + + + /* */ + +#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/src/WinLibs/freetype-2.3.5/include/freetype/config/ftmodule.h b/src/WinLibs/freetype-2.3.5/include/freetype/config/ftmodule.h new file mode 100644 index 000000000..d92b0ee6a --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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(autofit_module_class) +FT_USE_MODULE(tt_driver_class) +FT_USE_MODULE(t1_driver_class) +FT_USE_MODULE(cff_driver_class) +FT_USE_MODULE(t1cid_driver_class) +FT_USE_MODULE(pfr_driver_class) +FT_USE_MODULE(t42_driver_class) +FT_USE_MODULE(winfnt_driver_class) +FT_USE_MODULE(pcf_driver_class) +FT_USE_MODULE(psaux_module_class) +FT_USE_MODULE(psnames_module_class) +FT_USE_MODULE(pshinter_module_class) +FT_USE_MODULE(ft_raster1_renderer_class) +FT_USE_MODULE(sfnt_module_class) +FT_USE_MODULE(ft_smooth_renderer_class) +FT_USE_MODULE(ft_smooth_lcd_renderer_class) +FT_USE_MODULE(ft_smooth_lcdv_renderer_class) +FT_USE_MODULE(bdf_driver_class) + +/* EOF */ diff --git a/src/WinLibs/freetype-2.3.5/include/freetype/config/ftoption.h b/src/WinLibs/freetype-2.3.5/include/freetype/config/ftoption.h new file mode 100644 index 000000000..532848da7 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/include/freetype/config/ftoption.h @@ -0,0 +1,669 @@ +/***************************************************************************/ +/* */ +/* ftoption.h */ +/* */ +/* User-selectable configuration macros (specification only). */ +/* */ +/* 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 __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 larger than */ + /* the original size; the difference will be that 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 + + + /*************************************************************************/ + /* */ + /* 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 synthetize 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 */ + /* synthetize 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 synthetize 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 allows FreeType to be used with the PostScript language, using */ + /* the GhostScript interpreter. */ + /* */ +/* #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 + + + + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** 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/ftnames.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 + + + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** 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 */ + /* the TT_CONFIG_OPTION_UNPATENTED_HINTING macro is *ignored* if you */ + /* define TT_CONFIG_OPTION_BYTECODE_INTERPRETER; with 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 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 variable 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 +#elif defined TT_CONFIG_OPTION_UNPATENTED_HINTING +#define TT_USE_BYTECODE_INTERPRETER +#endif + +FT_END_HEADER + + +#endif /* __FTOPTION_H__ */ + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/include/freetype/config/ftstdlib.h b/src/WinLibs/freetype-2.3.5/include/freetype/config/ftstdlib.h new file mode 100644 index 000000000..f923f3e4c --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/include/freetype/config/ftstdlib.h @@ -0,0 +1,180 @@ +/***************************************************************************/ +/* */ +/* ftstdlib.h */ +/* */ +/* ANSI-specific library and header configuration file (specification */ +/* only). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* 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. */ + /* */ + /* IMPORTANT NOTE: We do not define aliases for heap management and */ + /* i/o routines (i.e. malloc/free/fopen/fread/...) */ + /* since these functions should all be encapsulated */ + /* by platform-specific implementations of */ + /* `ftsystem.c'. */ + /* */ + /**********************************************************************/ + + +#include <limits.h> + +#define FT_CHAR_BIT CHAR_BIT +#define FT_INT_MAX INT_MAX +#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 + +#define ft_exit exit /* only used to exit from unhandled exceptions */ + + + /**********************************************************************/ + /* */ + /* 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/src/WinLibs/freetype-2.3.5/include/freetype/freetype.h b/src/WinLibs/freetype-2.3.5/include/freetype/freetype.h new file mode 100644 index 000000000..dbca087e5 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/include/freetype/freetype.h @@ -0,0 +1,3434 @@ +/***************************************************************************/ +/* */ +/* freetype.h */ +/* */ +/* FreeType high-level API and common types (specification only). */ +/* */ +/* 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 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 + + + /*************************************************************************/ + /* */ + /* The `raster' component duplicates some of the declarations in */ + /* freetype.h for stand-alone use if _FREETYPE_ isn't defined. */ + /* */ + /*************************************************************************/ + + +#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. With */ + /* 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 */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <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. */ + /* */ + 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> */ + /* The @FT_FaceRec details 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> */ + /* The @FT_SizeRec structure details 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 one 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> */ + /* @FT_GlyphSlotRec details 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> */ + /* The @FT_CharMapRec details 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 16bit compilers don't like 32bit 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, GB2312_EUC, etc.). */ + /* */ + /* Because of 32-bit charcodes defined in Unicode (i.e., surrogates), */ + /* all character codes must be expressed as FT_Longs. */ + /* */ + /* 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. */ + /* */ + /* 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 synthetizes 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 c */ + /* @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. */ + /* */ + /* 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. */ + /* */ + /* 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. */ + /* */ + /* 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's 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. */ + /* */ +#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 ) + + /* */ + + + /************************************************************************* + * + * @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 ) + + + /*************************************************************************/ + /* */ + /* <Constant> */ + /* 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 is italicized. */ + /* */ + /* FT_STYLE_FLAG_BOLD :: */ + /* Indicates that a given face is bold. */ + /* */ +#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 is the transformed advance width for the */ + /* glyph. */ + /* */ + /* 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 convert 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. */ + /* */ + 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. */ + /* */ + 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. With */ + /* 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, *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. */ + /* */ + + 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. */ + /* */ + 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 use @FT_LOAD_TARGET_MONO instead 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. + * + * 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 + + /* temporary hack! */ +#define FT_LOAD_SBITS_ONLY 0x4000 +#define FT_LOAD_NO_AUTOHINT 0x8000U + + /* */ + + + /************************************************************************** + * + * @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 the `bitmap->pixel_mode' field in the */ + /* @FT_GlyphSlotRec structure gives the format of the returned */ + /* bitmap. */ + /* */ + /* <Values> */ + /* FT_RENDER_MODE_NORMAL :: */ + /* This is the default render mode; it corresponds to 8-bit */ + /* anti-aliased bitmaps, using 256 levels of opacity. */ + /* */ + /* 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. */ + /* */ + /* 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 are */ + /* _not_ _filtered_ to reduce color-fringes. It is up to the caller */ + /* to perform this pass. */ + /* */ + 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. 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). */ + /* */ + 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 */ + /* when 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 first 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, or an error is + * returned. + * + * @input: + * glyph :: + * The source glyph slot. + * + * sub_index :: + * The index of 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 ); + + + /*************************************************************************/ + /* */ + /* <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 ); + + + /*************************************************************************/ + /* */ + /* <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 ); + + + /*************************************************************************/ + /* */ + /* <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 5 + + + /*************************************************************************/ + /* */ + /* <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 */ + /* a 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/src/WinLibs/freetype-2.3.5/include/freetype/ftbbox.h b/src/WinLibs/freetype-2.3.5/include/freetype/ftbbox.h new file mode 100644 index 000000000..5f79c3274 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/include/freetype/ftbbox.h @@ -0,0 +1,94 @@ +/***************************************************************************/ +/* */ +/* ftbbox.h */ +/* */ +/* FreeType exact bbox computation (specification). */ +/* */ +/* Copyright 1996-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. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* 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> */ + /* Computes 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 walked over 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/src/WinLibs/freetype-2.3.5/include/freetype/ftbdf.h b/src/WinLibs/freetype-2.3.5/include/freetype/ftbdf.h new file mode 100644 index 000000000..955569481 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/include/freetype/ftbdf.h @@ -0,0 +1,200 @@ +/***************************************************************************/ +/* */ +/* ftbdf.h */ +/* */ +/* FreeType API for accessing BDF-specific strings (specification). */ +/* */ +/* 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 __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 Files */ + /* */ + /* <Abstract> */ + /* BDF specific API. */ + /* */ + /* <Description> */ + /* This section contains the declaration of BDF specific functions. */ + /* */ + /*************************************************************************/ + + + /********************************************************************** + * + * @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: + * Retrieves 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: + * Retrieves 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. + * + * 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/src/WinLibs/freetype-2.3.5/include/freetype/ftbitmap.h b/src/WinLibs/freetype-2.3.5/include/freetype/ftbitmap.h new file mode 100644 index 000000000..337d888ea --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/include/freetype/ftbitmap.h @@ -0,0 +1,206 @@ +/***************************************************************************/ +/* */ +/* ftbitmap.h */ +/* */ +/* FreeType utility functions for converting 1bpp, 2bpp, 4bpp, and 8bpp */ +/* bitmaps into 8bpp format (specification). */ +/* */ +/* 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 __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> */ + /* Copies an 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_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/src/WinLibs/freetype-2.3.5/include/freetype/ftcache.h b/src/WinLibs/freetype-2.3.5/include/freetype/ftcache.h new file mode 100644 index 000000000..721aa16f3 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/include/freetype/ftcache.h @@ -0,0 +1,1110 @@ +/***************************************************************************/ +/* */ +/* ftcache.h */ +/* */ +/* FreeType Cache subsystem (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 __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 struct FTC_FaceIDRec_* 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> */ + /* Creates 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> */ + /* Empties 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> */ + /* Destroys 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> */ + /* Retrieves 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, *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. + * + * 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> */ + /* Creates 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> */ + /* Retrieves 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! */ + /* */ + 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> */ + /* Creates 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> */ + /* Looks 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/src/WinLibs/freetype-2.3.5/include/freetype/ftchapters.h b/src/WinLibs/freetype-2.3.5/include/freetype/ftchapters.h new file mode 100644 index 000000000..bd812c8e6 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/include/freetype/ftchapters.h @@ -0,0 +1,100 @@ +/***************************************************************************/ +/* */ +/* 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_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 */ +/* 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 */ +/* bitmap_handling */ +/* raster */ +/* glyph_stroker */ +/* system_interface */ +/* module_management */ +/* gzip */ +/* lzw */ +/* lcd_filtering */ +/* */ +/***************************************************************************/ diff --git a/src/WinLibs/freetype-2.3.5/include/freetype/fterrdef.h b/src/WinLibs/freetype-2.3.5/include/freetype/fterrdef.h new file mode 100644 index 000000000..d7ad256bd --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/include/freetype/fterrors.h b/src/WinLibs/freetype-2.3.5/include/freetype/fterrors.h new file mode 100644 index 000000000..6600dadd0 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/include/freetype/ftgasp.h b/src/WinLibs/freetype-2.3.5/include/freetype/ftgasp.h new file mode 100644 index 000000000..97cd33014 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/include/freetype/ftgasp.h @@ -0,0 +1,113 @@ +/***************************************************************************/ +/* */ +/* ftgasp.h */ +/* */ +/* Access of TrueType's `gasp' table (specification). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#ifndef _FT_GASP_H_ +#define _FT_GASP_H_ + +#include <ft2build.h> +#include FT_FREETYPE_H + + /*************************************************************************** + * + * @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 their `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 is 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/src/WinLibs/freetype-2.3.5/include/freetype/ftglyph.h b/src/WinLibs/freetype-2.3.5/include/freetype/ftglyph.h new file mode 100644 index 000000000..08058dadd --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/include/freetype/ftglyph.h @@ -0,0 +1,575 @@ +/***************************************************************************/ +/* */ +/* ftglyph.h */ +/* */ +/* FreeType convenience functions to handle glyphs (specification). */ +/* */ +/* Copyright 1996-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. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* 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 a @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. */ + /* */ + /* <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> */ + /* Transforms 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> */ + /* Converts 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 describe 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> */ + /* 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. 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 + destroy old) */ + /* if ( glyph->format != FT_GLYPH_FORMAT_BITMAP ) */ + /* { */ + /* error = FT_Glyph_To_Bitmap( &glyph, FT_RENDER_MODE_DEFAULT, */ + /* 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 ); */ + /* } */ + /* */ + /* */ + /* This function does nothing if the glyph format isn't scalable. */ + /* */ + 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> */ + /* Destroys 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> */ + /* Performs 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> */ + /* Inverts a 2x2 matrix. Returns 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/src/WinLibs/freetype-2.3.5/include/freetype/ftgxval.h b/src/WinLibs/freetype-2.3.5/include/freetype/ftgxval.h new file mode 100644 index 000000000..c7ea861a0 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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 (16bit 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 32bit format and the classic 16bit format, while + * FT_ClassicKern_Validate only supports the classic 16bit 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/src/WinLibs/freetype-2.3.5/include/freetype/ftgzip.h b/src/WinLibs/freetype-2.3.5/include/freetype/ftgzip.h new file mode 100644 index 000000000..9893437bf --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/include/freetype/ftimage.h b/src/WinLibs/freetype-2.3.5/include/freetype/ftimage.h new file mode 100644 index 000000000..1c428f117 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/include/freetype/ftimage.h @@ -0,0 +1,1237 @@ +/***************************************************************************/ +/* */ +/* ftimage.h */ +/* */ +/* FreeType glyph image formats and default raster interface */ +/* (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. */ +/* */ +/***************************************************************************/ + + /*************************************************************************/ + /* */ + /* 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 a 32-bit integer 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). */ + /* */ + 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 value `gray' levels is stored in the `num_bytes' field of */ + /* the @FT_Bitmap structure (it generally is 256). */ + /* */ + /* FT_PIXEL_MODE_GRAY2 :: */ + /* A 2-bit/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/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_LCD :: */ + /* An 8-bit bitmap, used to represent 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, used to represent 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. */ + /* */ + /* <Fields> */ + /* ft_palette_mode_rgb :: The palette is an array of 3-bytes RGB */ + /* records. */ + /* */ + /* ft_palette_mode_rgba :: The palette is an array of 4-bytes 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_palettte_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. */ + /* */ + /* 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' when 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. */ + /* */ + /* 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. */ + /* */ + 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; + + + /*************************************************************************/ + /* */ + /* <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' & `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 raster). */ + /* */ + /* 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. */ + /* */ + /* 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. */ + /* */ +#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_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_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 use to describe the signature of a `conic */ + /* to' function during outline walking/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/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, */ + /* as well as `move to' and `close to' operations. */ + /* */ + /* <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 value 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 16bit compilers don't like 32bit 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. */ + /* */ + 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. */ + /* */ + /* 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; + 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> */ + /* Invokes 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/src/WinLibs/freetype-2.3.5/include/freetype/ftincrem.h b/src/WinLibs/freetype-2.3.5/include/freetype/ftincrem.h new file mode 100644 index 000000000..46bc8bdd3 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/include/freetype/ftincrem.h @@ -0,0 +1,331 @@ +/***************************************************************************/ +/* */ +/* ftincrem.h */ +/* */ +/* FreeType incremental loading (specification). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#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_Metrics + * + * @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 :: + * 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_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/src/WinLibs/freetype-2.3.5/include/freetype/ftlcdfil.h b/src/WinLibs/freetype-2.3.5/include/freetype/ftlcdfil.h new file mode 100644 index 000000000..9a61377a3 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/include/freetype/ftlcdfil.h @@ -0,0 +1,166 @@ +/***************************************************************************/ +/* */ +/* ftlcdfil.h */ +/* */ +/* FreeType API for color filtering of subpixel bitmap glyphs */ +/* (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 __FT_LCD_FILTER_H__ +#define __FT_LCD_FILTER_H__ + +#include <ft2build.h> +#include FT_FREETYPE_H + + +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_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/src/WinLibs/freetype-2.3.5/include/freetype/ftlist.h b/src/WinLibs/freetype-2.3.5/include/freetype/ftlist.h new file mode 100644 index 000000000..f3223ee8f --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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> */ + /* Finds 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> */ + /* Appends 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> */ + /* Inserts 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> */ + /* Removes 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> */ + /* Moves 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> */ + /* Parses 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> */ + /* Destroys 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/src/WinLibs/freetype-2.3.5/include/freetype/ftlzw.h b/src/WinLibs/freetype-2.3.5/include/freetype/ftlzw.h new file mode 100644 index 000000000..d950653eb --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/include/freetype/ftmac.h b/src/WinLibs/freetype-2.3.5/include/freetype/ftmac.h new file mode 100644 index 000000000..3c6fafe55 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/include/freetype/ftmac.h @@ -0,0 +1,272 @@ +/***************************************************************************/ +/* */ +/* 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 the */ +/* Mac-specific <Types.h> header (or any other Mac header that */ +/* includes <Types.h>); we use Handle type. */ +/* */ +/***************************************************************************/ + + +#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 ); + + + /*************************************************************************/ + /* */ + /* <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 ); + + + /*************************************************************************/ + /* */ + /* <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/src/WinLibs/freetype-2.3.5/include/freetype/ftmm.h b/src/WinLibs/freetype-2.3.5/include/freetype/ftmm.h new file mode 100644 index 000000000..a9ccfe713 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/include/freetype/ftmm.h @@ -0,0 +1,378 @@ +/***************************************************************************/ +/* */ +/* ftmm.h */ +/* */ +/* FreeType Multiple Master font interface (specification). */ +/* */ +/* Copyright 1996-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. */ +/* */ +/***************************************************************************/ + + +#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> */ + /* Retrieves 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> */ + /* Retrieves the Multiple Master/GX var descriptor of a given font. */ + /* */ + /* <Input> */ + /* face :: A handle to the source face. */ + /* */ + /* <Output> */ + /* amaster :: The Multiple Masters 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/src/WinLibs/freetype-2.3.5/include/freetype/ftmodapi.h b/src/WinLibs/freetype-2.3.5/include/freetype/ftmodapi.h new file mode 100644 index 000000000..9cc32aff4 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/include/freetype/ftmodapi.h @@ -0,0 +1,406 @@ +/***************************************************************************/ +/* */ +/* ftmodapi.h */ +/* */ +/* FreeType modules public interface (specification). */ +/* */ +/* Copyright 1996-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 __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; + + typedef FT_Error + (*FT_Module_Constructor)( FT_Module module ); + + typedef void + (*FT_Module_Destructor)( FT_Module 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 :: A function used to initialize (not create) a */ + /* new module object. */ + /* */ + /* module_done :: A function used to finalize (not destroy) a */ + /* given module object */ + /* */ + /* get_interface :: Queries a given module for a specific */ + /* interface by name. */ + /* */ + 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> */ + /* Adds 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> */ + /* Finds 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> */ + /* Removes 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. */ + /* */ + /* <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> */ + /* Discards 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> */ + /* Sets 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> */ + /* Adds 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_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 a @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/src/WinLibs/freetype-2.3.5/include/freetype/ftmoderr.h b/src/WinLibs/freetype-2.3.5/include/freetype/ftmoderr.h new file mode 100644 index 000000000..b0115dd0d --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/include/freetype/ftotval.h b/src/WinLibs/freetype-2.3.5/include/freetype/ftotval.h new file mode 100644 index 000000000..7c488fdf4 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/include/freetype/ftotval.h @@ -0,0 +1,198 @@ +/***************************************************************************/ +/* */ +/* ftotval.h */ +/* */ +/* FreeType API for validating OpenType tables (specification). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +/***************************************************************************/ +/* */ +/* */ +/* 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). */ + /* */ + /*************************************************************************/ + + + /********************************************************************** + * + * @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_OT :: + * Validate all OpenType tables (BASE, GDEF, GPOS, GSUB, JSTF). + * + */ +#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_OT FT_VALIDATE_BASE | \ + FT_VALIDATE_GDEF | \ + FT_VALIDATE_GPOS | \ + FT_VALIDATE_GSUB | \ + FT_VALIDATE_JSTF + + /* */ + + /********************************************************************** + * + * @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/src/WinLibs/freetype-2.3.5/include/freetype/ftoutln.h b/src/WinLibs/freetype-2.3.5/include/freetype/ftoutln.h new file mode 100644 index 000000000..786ae13ed --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/include/freetype/ftoutln.h @@ -0,0 +1,526 @@ +/***************************************************************************/ +/* */ +/* 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 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. 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> */ + /* Walks 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> */ + /* 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> */ + /* Creates 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. NULL in case of */ + /* error. */ + /* */ + /* <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> */ + /* Destroys 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> */ + /* Returns 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> */ + /* Applies 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> */ + /* Copies 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> */ + /* Applies 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> */ + /* Emboldens 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. */ + /* */ + /* 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> */ + /* Reverses 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 functions 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> */ + /* Renders 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! */ + /* */ + /* It will use the raster corresponding to the default glyph format. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Outline_Get_Bitmap( FT_Library library, + FT_Outline* outline, + const FT_Bitmap *abitmap ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Outline_Render */ + /* */ + /* <Description> */ + /* Renders an outline within a bitmap using the current scan-convert. */ + /* This functions 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. */ + /* */ + 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_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/src/WinLibs/freetype-2.3.5/include/freetype/ftpfr.h b/src/WinLibs/freetype-2.3.5/include/freetype/ftpfr.h new file mode 100644 index 000000000..e2801fd0f --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/include/freetype/ftpfr.h @@ -0,0 +1,172 @@ +/***************************************************************************/ +/* */ +/* ftpfr.h */ +/* */ +/* FreeType API for accessing PFR-specific data (specification only). */ +/* */ +/* 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 __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'. + * 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/src/WinLibs/freetype-2.3.5/include/freetype/ftrender.h b/src/WinLibs/freetype-2.3.5/include/freetype/ftrender.h new file mode 100644 index 000000000..5b07f08c2 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/include/freetype/ftrender.h @@ -0,0 +1,229 @@ +/***************************************************************************/ +/* */ +/* 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. */ + /* */ + /* 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> */ + /* Retrieves 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> */ + /* Sets 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/src/WinLibs/freetype-2.3.5/include/freetype/ftsizes.h b/src/WinLibs/freetype-2.3.5/include/freetype/ftsizes.h new file mode 100644 index 000000000..622df162d --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/include/freetype/ftsizes.h @@ -0,0 +1,159 @@ +/***************************************************************************/ +/* */ +/* ftsizes.h */ +/* */ +/* FreeType size objects management (specification). */ +/* */ +/* Copyright 1996-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. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* 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 last-created one 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/src/WinLibs/freetype-2.3.5/include/freetype/ftsnames.h b/src/WinLibs/freetype-2.3.5/include/freetype/ftsnames.h new file mode 100644 index 000000000..003cbcd12 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/include/freetype/ftsnames.h @@ -0,0 +1,170 @@ +/***************************************************************************/ +/* */ +/* 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 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. 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 specification 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> */ + /* Retrieves 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> */ + /* Retrieves 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. */ + /* */ + /* 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 ); + + + /* */ + + +FT_END_HEADER + +#endif /* __FT_SFNT_NAMES_H__ */ + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/include/freetype/ftstroke.h b/src/WinLibs/freetype-2.3.5/include/freetype/ftstroke.h new file mode 100644 index 000000000..738b43c1a --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/include/freetype/ftstroke.h @@ -0,0 +1,716 @@ +/***************************************************************************/ +/* */ +/* ftstroke.h */ +/* */ +/* FreeType path stroker (specification). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#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_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_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_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_LEFT 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 that 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 will generate two distinct `border' outlines. + * + * If `opened' is 1, the outline is processed as an open path, and the + * stroker will generate 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 will `draw' 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 will return 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 will append the border points and + * contours to your outline, but will 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 the all borders to your own @FT_Outline structure. + * + * Note that this function will append the border points and + * contours to your outline, but will 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/src/WinLibs/freetype-2.3.5/include/freetype/ftsynth.h b/src/WinLibs/freetype-2.3.5/include/freetype/ftsynth.h new file mode 100644 index 000000000..36984bf1a --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/include/freetype/ftsynth.h @@ -0,0 +1,73 @@ +/***************************************************************************/ +/* */ +/* ftsynth.h */ +/* */ +/* FreeType synthesizing code for emboldening and slanting */ +/* (specification). */ +/* */ +/* Copyright 2000-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. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /********* *********/ + /********* WARNING, THIS IS ALPHA CODE, THIS API *********/ + /********* IS DUE TO CHANGE UNTIL STRICTLY NOTIFIED BY THE *********/ + /********* FREETYPE DEVELOPMENT TEAM *********/ + /********* *********/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + +#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 + + /* Make sure slot owns slot->bitmap. */ + FT_EXPORT( FT_Error ) + FT_GlyphSlot_Own_Bitmap( FT_GlyphSlot slot ); + + /* Do not use this function directly! Copy the code to */ + /* your application and modify it to suit your need. */ + FT_EXPORT( void ) + FT_GlyphSlot_Embolden( FT_GlyphSlot slot ); + + + FT_EXPORT( void ) + FT_GlyphSlot_Oblique( FT_GlyphSlot slot ); + + /* */ + +FT_END_HEADER + +#endif /* __FTSYNTH_H__ */ + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/include/freetype/ftsystem.h b/src/WinLibs/freetype-2.3.5/include/freetype/ftsystem.h new file mode 100644 index 000000000..59cd01982 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/include/freetype/fttrigon.h b/src/WinLibs/freetype-2.3.5/include/freetype/fttrigon.h new file mode 100644 index 000000000..6b77d2ee5 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/include/freetype/fttypes.h b/src/WinLibs/freetype-2.3.5/include/freetype/fttypes.h new file mode 100644 index 000000000..2340bacd3 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/include/freetype/fttypes.h @@ -0,0 +1,583 @@ +/***************************************************************************/ +/* */ +/* fttypes.h */ +/* */ +/* FreeType simple types definitions (specification only). */ +/* */ +/* 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 __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_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 32bit 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> */ + /* Describes 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 32bit integers. Don't redefine this */ + /* macro. */ + /* */ +#define FT_MAKE_TAG( _x1, _x2, _x3, _x4 ) \ + ( ( (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/src/WinLibs/freetype-2.3.5/include/freetype/ftwinfnt.h b/src/WinLibs/freetype-2.3.5/include/freetype/ftwinfnt.h new file mode 100644 index 000000000..a0063cc73 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/include/freetype/ftwinfnt.h @@ -0,0 +1,263 @@ +/***************************************************************************/ +/* */ +/* ftwinfnt.h */ +/* */ +/* FreeType API for accessing Windows fnt-specific data. */ +/* */ +/* 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 __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, *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/src/WinLibs/freetype-2.3.5/include/freetype/ftxf86.h b/src/WinLibs/freetype-2.3.5/include/freetype/ftxf86.h new file mode 100644 index 000000000..ea82abb08 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/include/freetype/ftxf86.h @@ -0,0 +1,80 @@ +/***************************************************************************/ +/* */ +/* 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. */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <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/src/WinLibs/freetype-2.3.5/include/freetype/internal/autohint.h b/src/WinLibs/freetype-2.3.5/include/freetype/internal/autohint.h new file mode 100644 index 000000000..ee004022f --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/include/freetype/internal/autohint.h @@ -0,0 +1,205 @@ +/***************************************************************************/ +/* */ +/* 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; + + +FT_END_HEADER + +#endif /* __AUTOHINT_H__ */ + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/include/freetype/internal/ftcalc.h b/src/WinLibs/freetype-2.3.5/include/freetype/internal/ftcalc.h new file mode 100644 index 000000000..c7e9901eb --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/include/freetype/internal/ftcalc.h @@ -0,0 +1,153 @@ +/***************************************************************************/ +/* */ +/* ftcalc.h */ +/* */ +/* Arithmetic computations (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 __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 */ + + + /* + * 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 ROUND_F26DOT6( x ) ( x >= 0 ? ( ( (x) + 32 ) & -64 ) \ + : ( -( ( 32 - (x) ) & -64 ) ) ) + + +FT_END_HEADER + +#endif /* __FTCALC_H__ */ + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/include/freetype/internal/ftdebug.h b/src/WinLibs/freetype-2.3.5/include/freetype/internal/ftdebug.h new file mode 100644 index 000000000..15627147b --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/include/freetype/internal/ftdebug.h @@ -0,0 +1,244 @@ +/***************************************************************************/ +/* */ +/* ftdebug.h */ +/* */ +/* Debugging and logging component (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. */ +/* */ +/* */ +/* 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 + { +#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 resp. closing parentheses! */ + /* */ + /* Example: FT_TRACE0(( "Value is %i", foo )) */ + /* */ + /*************************************************************************/ + +#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 */ + /* */ + /*************************************************************************/ + +#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 vprintf() */ + + /* 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/src/WinLibs/freetype-2.3.5/include/freetype/internal/ftdriver.h b/src/WinLibs/freetype-2.3.5/include/freetype/internal/ftdriver.h new file mode 100644 index 000000000..97f3fd04d --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/include/freetype/internal/ftdriver.h @@ -0,0 +1,252 @@ +/***************************************************************************/ +/* */ +/* ftdriver.h */ +/* */ +/* FreeType font driver interface (specification). */ +/* */ +/* Copyright 1996-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 __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_Bool vertical, + FT_UShort* 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_char_index :: A function handle to return the glyph index of */ + /* a given character for a given charmap. 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' and */ + /* `get_char_index' 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 */ + + +FT_END_HEADER + +#endif /* __FTDRIVER_H__ */ + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/include/freetype/internal/ftgloadr.h b/src/WinLibs/freetype-2.3.5/include/freetype/internal/ftgloadr.h new file mode 100644 index 000000000..9f47c0b8c --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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 || (int)((_loader)->base.outline.n_points + \ + (_loader)->current.outline.n_points + \ + (_count)) <= (int)(_loader)->max_points ) + +#define FT_GLYPHLOADER_CHECK_C( _loader, _count ) \ + ( (_count) == 0 || (int)((_loader)->base.outline.n_contours + \ + (_loader)->current.outline.n_contours + \ + (_count)) <= (int)(_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/src/WinLibs/freetype-2.3.5/include/freetype/internal/ftmemory.h b/src/WinLibs/freetype-2.3.5/include/freetype/internal/ftmemory.h new file mode 100644 index 000000000..c6ddc42ea --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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) = 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/src/WinLibs/freetype-2.3.5/include/freetype/internal/ftobjs.h b/src/WinLibs/freetype-2.3.5/include/freetype/internal/ftobjs.h new file mode 100644 index 000000000..15b68d63f --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/include/freetype/internal/ftobjs.h @@ -0,0 +1,820 @@ +/***************************************************************************/ +/* */ +/* ftobjs.h */ +/* */ +/* The FreeType private base classes (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. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* 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 + +#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 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; + + } FT_CMap_ClassRec; + + + /* 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; + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** 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 */ + /* */ + 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 + + } 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 + + +FT_END_HEADER + +#endif /* __FTOBJS_H__ */ + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/include/freetype/internal/ftrfork.h b/src/WinLibs/freetype-2.3.5/include/freetype/internal/ftrfork.h new file mode 100644 index 000000000..94402bcfa --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/include/freetype/internal/ftrfork.h @@ -0,0 +1,184 @@ +/***************************************************************************/ +/* */ +/* ftrfork.h */ +/* */ +/* Embedded resource forks accessor (specification). */ +/* */ +/* Copyright 2004, 2006 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 8 + + + /*************************************************************************/ + /* */ + /* <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/src/WinLibs/freetype-2.3.5/include/freetype/internal/ftserv.h b/src/WinLibs/freetype-2.3.5/include/freetype/internal/ftserv.h new file mode 100644 index 000000000..45d2fa918 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/include/freetype/internal/ftserv.h @@ -0,0 +1,327 @@ +/***************************************************************************/ +/* */ +/* 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; + + + /* + * 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_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/src/WinLibs/freetype-2.3.5/include/freetype/internal/ftstream.h b/src/WinLibs/freetype-2.3.5/include/freetype/internal/ftstream.h new file mode 100644 index 000000000..a91eb72d9 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/include/freetype/internal/fttrace.h b/src/WinLibs/freetype-2.3.5/include/freetype/internal/fttrace.h new file mode 100644 index 000000000..81916fc6a --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/include/freetype/internal/fttrace.h @@ -0,0 +1,133 @@ +/***************************************************************************/ +/* */ +/* fttrace.h */ +/* */ +/* Tracing handling (specification only). */ +/* */ +/* Copyright 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. */ +/* */ +/***************************************************************************/ + + + /* 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( 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) */ + + /* Cache sub-system */ +FT_TRACE_DEF( cache ) /* cache sub-system (ftcache.c, etc.) */ + + /* SFNT driver components */ +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) */ + + /* 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( 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 ) + + /* 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/src/WinLibs/freetype-2.3.5/include/freetype/internal/ftvalid.h b/src/WinLibs/freetype-2.3.5/include/freetype/internal/ftvalid.h new file mode 100644 index 000000000..00cd85e7b --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/include/freetype/internal/internal.h b/src/WinLibs/freetype-2.3.5/include/freetype/internal/internal.h new file mode 100644 index 000000000..27d5dc585 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/include/freetype/internal/internal.h @@ -0,0 +1,50 @@ +/***************************************************************************/ +/* */ +/* 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_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/src/WinLibs/freetype-2.3.5/include/freetype/internal/pcftypes.h b/src/WinLibs/freetype-2.3.5/include/freetype/internal/pcftypes.h new file mode 100644 index 000000000..382796ffb --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/include/freetype/internal/psaux.h b/src/WinLibs/freetype-2.3.5/include/freetype/internal/psaux.h new file mode 100644 index 000000000..4baf7a094 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/include/freetype/internal/psaux.h @@ -0,0 +1,879 @@ +/***************************************************************************/ +/* */ +/* psaux.h */ +/* */ +/* Auxiliary functions and data structures related to PostScript fonts */ +/* (specification). */ +/* */ +/* Copyright 1996-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. */ +/* */ +/***************************************************************************/ + + +#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_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 */ + 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_Long 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. */ + /* */ + /* last :: The last point position. */ + /* */ + /* scale_x :: The horizontal scaling value (FUnits to */ + /* sub-pixels). */ + /* */ + /* scale_y :: The vertical scaling value (FUnits to sub-pixels). */ + /* */ + /* 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_Vector last; + + FT_Fixed scale_x; + FT_Fixed scale_y; + + 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 shift; + + 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_Int* buildchar; + FT_UInt len_buildchar; + + } 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_UInt 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/src/WinLibs/freetype-2.3.5/include/freetype/internal/pshints.h b/src/WinLibs/freetype-2.3.5/include/freetype/internal/pshints.h new file mode 100644 index 000000000..48452c0cf --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/include/freetype/internal/pshints.h @@ -0,0 +1,687 @@ +/***************************************************************************/ +/* */ +/* 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 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. 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 integers, 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_Long* 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 integers, 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_Long* 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. + * + * @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; + + +FT_END_HEADER + +#endif /* __PSHINTS_H__ */ + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/include/freetype/internal/services/svbdf.h b/src/WinLibs/freetype-2.3.5/include/freetype/internal/services/svbdf.h new file mode 100644 index 000000000..0f7fc6115 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/include/freetype/internal/services/svbdf.h @@ -0,0 +1,57 @@ +/***************************************************************************/ +/* */ +/* 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; + }; + + /* */ + + +FT_END_HEADER + + +#endif /* __SVBDF_H__ */ + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/include/freetype/internal/services/svgldict.h b/src/WinLibs/freetype-2.3.5/include/freetype/internal/services/svgldict.h new file mode 100644 index 000000000..e5e56b253 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/include/freetype/internal/services/svgldict.h @@ -0,0 +1,60 @@ +/***************************************************************************/ +/* */ +/* 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 */ + }; + + /* */ + + +FT_END_HEADER + + +#endif /* __SVGLDICT_H__ */ diff --git a/src/WinLibs/freetype-2.3.5/include/freetype/internal/services/svgxval.h b/src/WinLibs/freetype-2.3.5/include/freetype/internal/services/svgxval.h new file mode 100644 index 000000000..2cdab5065 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/include/freetype/internal/services/svkern.h b/src/WinLibs/freetype-2.3.5/include/freetype/internal/services/svkern.h new file mode 100644 index 000000000..1488adf49 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/include/freetype/internal/services/svmm.h b/src/WinLibs/freetype-2.3.5/include/freetype/internal/services/svmm.h new file mode 100644 index 000000000..8a99ec4b1 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/include/freetype/internal/services/svmm.h @@ -0,0 +1,79 @@ +/***************************************************************************/ +/* */ +/* 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; + }; + + /* */ + + +FT_END_HEADER + +#endif /* __SVMM_H__ */ + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/include/freetype/internal/services/svotval.h b/src/WinLibs/freetype-2.3.5/include/freetype/internal/services/svotval.h new file mode 100644 index 000000000..970bbd575 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/include/freetype/internal/services/svpfr.h b/src/WinLibs/freetype-2.3.5/include/freetype/internal/services/svpfr.h new file mode 100644 index 000000000..462786f9c --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/include/freetype/internal/services/svpostnm.h b/src/WinLibs/freetype-2.3.5/include/freetype/internal/services/svpostnm.h new file mode 100644 index 000000000..282da68d1 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/include/freetype/internal/services/svpostnm.h @@ -0,0 +1,58 @@ +/***************************************************************************/ +/* */ +/* 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; + }; + + /* */ + + +FT_END_HEADER + + +#endif /* __SVPOSTNM_H__ */ + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/include/freetype/internal/services/svpscmap.h b/src/WinLibs/freetype-2.3.5/include/freetype/internal/services/svpscmap.h new file mode 100644 index 000000000..c4e25ed63 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/include/freetype/internal/services/svpscmap.h @@ -0,0 +1,129 @@ +/***************************************************************************/ +/* */ +/* 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_ULong + (*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; + }; + + /* */ + + +FT_END_HEADER + + +#endif /* __SVPSCMAP_H__ */ + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/include/freetype/internal/services/svpsinfo.h b/src/WinLibs/freetype-2.3.5/include/freetype/internal/services/svpsinfo.h new file mode 100644 index 000000000..63f5db9c1 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/include/freetype/internal/services/svpsinfo.h @@ -0,0 +1,60 @@ +/***************************************************************************/ +/* */ +/* svpsinfo.h */ +/* */ +/* The FreeType PostScript info 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 __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_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_HasGlyphNamesFunc ps_has_glyph_names; + PS_GetFontPrivateFunc ps_get_font_private; + }; + + /* */ + + +FT_END_HEADER + + +#endif /* __SVPSINFO_H__ */ + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/include/freetype/internal/services/svsfnt.h b/src/WinLibs/freetype-2.3.5/include/freetype/internal/services/svsfnt.h new file mode 100644 index 000000000..b4a85d97e --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/include/freetype/internal/services/svsfnt.h @@ -0,0 +1,80 @@ +/***************************************************************************/ +/* */ +/* 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 *length ); + + + FT_DEFINE_SERVICE( SFNT_Table ) + { + FT_SFNT_TableLoadFunc load_table; + FT_SFNT_TableGetFunc get_table; + FT_SFNT_TableInfoFunc table_info; + }; + + /* */ + + +FT_END_HEADER + + +#endif /* __SVSFNT_H__ */ + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/include/freetype/internal/services/svttcmap.h b/src/WinLibs/freetype-2.3.5/include/freetype/internal/services/svttcmap.h new file mode 100644 index 000000000..1e02d1550 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/include/freetype/internal/services/svttcmap.h @@ -0,0 +1,78 @@ +/***************************************************************************/ +/* */ +/* svsttcmap.h */ +/* */ +/* The FreeType TrueType/sfnt cmap extra information service. */ +/* */ +/* Copyright 2003 by */ +/* Masatake YAMATO, Redhat K.K. */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + +/* 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. */ + /* */ + 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; + }; + + /* */ + + +FT_END_HEADER + +#endif /* __SVTTCMAP_H__ */ + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/include/freetype/internal/services/svtteng.h b/src/WinLibs/freetype-2.3.5/include/freetype/internal/services/svtteng.h new file mode 100644 index 000000000..58e02a6f9 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/include/freetype/internal/services/svttglyf.h b/src/WinLibs/freetype-2.3.5/include/freetype/internal/services/svttglyf.h new file mode 100644 index 000000000..e57d484b7 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/include/freetype/internal/services/svttglyf.h @@ -0,0 +1,48 @@ +/***************************************************************************/ +/* */ +/* 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; + }; + + /* */ + + +FT_END_HEADER + +#endif /* __SVTTGLYF_H__ */ + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/include/freetype/internal/services/svwinfnt.h b/src/WinLibs/freetype-2.3.5/include/freetype/internal/services/svwinfnt.h new file mode 100644 index 000000000..57f7765d9 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/include/freetype/internal/services/svxf86nm.h b/src/WinLibs/freetype-2.3.5/include/freetype/internal/services/svxf86nm.h new file mode 100644 index 000000000..ca5d884a8 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/include/freetype/internal/sfnt.h b/src/WinLibs/freetype-2.3.5/include/freetype/internal/sfnt.h new file mode 100644 index 000000000..7e8f6847c --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/include/freetype/internal/sfnt.h @@ -0,0 +1,762 @@ +/***************************************************************************/ +/* */ +/* 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; + + +FT_END_HEADER + +#endif /* __SFNT_H__ */ + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/include/freetype/internal/t1types.h b/src/WinLibs/freetype-2.3.5/include/freetype/internal/t1types.h new file mode 100644 index 000000000..047c6d59d --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/include/freetype/internal/t1types.h @@ -0,0 +1,252 @@ +/***************************************************************************/ +/* */ +/* t1types.h */ +/* */ +/* Basic Type1/Type2 type definitions and interface (specification */ +/* only). */ +/* */ +/* Copyright 1996-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. */ +/* */ +/***************************************************************************/ + + +#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. */ + /* */ + /* 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; + + + typedef struct T1_FontRec_ + { + PS_FontInfoRec font_info; /* font info dictionary */ + 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_Int* 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; + void* afm_data; + 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/src/WinLibs/freetype-2.3.5/include/freetype/internal/tttypes.h b/src/WinLibs/freetype-2.3.5/include/freetype/internal/tttypes.h new file mode 100644 index 000000000..dfbb6a1ea --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. 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_UInt32 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_UInt num_locations; + 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/src/WinLibs/freetype-2.3.5/include/freetype/t1tables.h b/src/WinLibs/freetype-2.3.5/include/freetype/t1tables.h new file mode 100644 index 000000000..250629d25 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/include/freetype/t1tables.h @@ -0,0 +1,450 @@ +/***************************************************************************/ +/* */ +/* t1tables.h */ +/* */ +/* Basic Type 1/Type 2 tables definitions and interface (specification */ +/* only). */ +/* */ +/* Copyright 1996-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. */ +/* */ +/***************************************************************************/ + + +#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 Type1/Type2 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, *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 Type1/Type2 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, *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 + { + /*# 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; + + + 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, *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, *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_FontInfoRec *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 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_Private( FT_Face face, + PS_PrivateRec *afont_private ); + + /* */ + + + +FT_END_HEADER + +#endif /* __T1TABLES_H__ */ + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/include/freetype/ttnameid.h b/src/WinLibs/freetype-2.3.5/include/freetype/ttnameid.h new file mode 100644 index 000000000..b9acbdad1 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/include/freetype/ttnameid.h @@ -0,0 +1,1132 @@ +/***************************************************************************/ +/* */ +/* ttnameid.h */ +/* */ +/* TrueType name ID definitions (specification only). */ +/* */ +/* Copyright 1996-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 __TTNAMEID_H__ +#define __TTNAMEID_H__ + + +#include <ft2build.h> + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* 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. + */ + +#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 */ + + + /*********************************************************************** + * + * @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. + */ + +#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 + + + /*************************************************************************/ + /* */ + /* Bit mask values for the Unicode Ranges from the TTF `OS2 ' table. */ + /* */ + /* Updated 02-Jul-2000. */ + /* */ + + /* General Scripts Area */ + + /* 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 */ +#define TT_UCR_IPA_EXTENSIONS (1L << 4) /* U+0250-U+02AF */ + /* Bit 5 Spacing Modifier Letters */ +#define TT_UCR_SPACING_MODIFIER (1L << 5) /* U+02B0-U+02FF */ + /* Bit 6 Combining Diacritical Marks */ +#define TT_UCR_COMBINING_DIACRITICS (1L << 6) /* U+0300-U+036F */ + /* Bit 7 Greek and Coptic */ +#define TT_UCR_GREEK (1L << 7) /* U+0370-U+03FF */ + /* Bit 8 is reserved (was: Greek Symbols and Coptic) */ + /* Bit 9 Cyrillic + */ + /* Cyrillic Supplementary */ +#define TT_UCR_CYRILLIC (1L << 9) /* U+0400-U+04FF */ + /* U+0500-U+052F */ + /* 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 is reserved (was: Hebrew Extended) */ + /* Bit 13 Arabic */ +#define TT_UCR_ARABIC (1L << 13) /* U+0600-U+06FF */ + /* Bit 14 is reserved (was: Arabic Extended) */ + /* 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 */ +#define TT_UCR_GEORGIAN (1L << 26) /* U+10A0-U+10FF */ + /* Bit 27 is reserved (was Georgian Extended) */ + /* Bit 28 Hangul Jamo */ +#define TT_UCR_HANGUL_JAMO (1L << 28) /* U+1100-U+11FF */ + /* Bit 29 Latin Extended Additional */ +#define TT_UCR_LATIN_EXTENDED_ADDITIONAL (1L << 29) /* U+1E00-U+1EFF */ + /* Bit 30 Greek Extended */ +#define TT_UCR_GREEK_EXTENDED (1L << 30) /* U+1F00-U+1FFF */ + + /* Symbols Area */ + + /* Bit 31 General Punctuation */ +#define TT_UCR_GENERAL_PUNCTUATION (1L << 31) /* U+2000-U+206F */ + /* 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 */ +#define TT_UCR_ARROWS (1L << 5) /* U+2190-U+21FF */ + /* U+27F0-U+27FF */ + /* U+2900-U+297F */ + /* 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 */ + + /* CJK Phonetics and Symbols Area */ + + /* 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 Kanbun */ +#define TT_UCR_CJK_MISC (1L << 21) /* U+3190-U+319F */ +#define TT_UCR_KANBUN TT_UCR_CJK_MISC + /* 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 */ + + /* Hangul Syllables Area */ + + /* Bit 56 Hangul */ +#define TT_UCR_HANGUL (1L << 24) /* U+AC00-U+D7A3 */ + + /* Surrogates Area */ + + /* Bit 57 High Surrogates + */ + /* High Private Use Surrogates + */ + /* Low Surrogates */ +#define TT_UCR_SURROGATES (1L << 25) /* U+D800-U+DB7F */ + /* U+DB80-U+DBFF */ + /* U+DC00-U+DFFF */ + /* 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 */ + + /* Bit 58 is reserved for Unicode SubRanges */ + + /* CJK Ideographs Area */ + + /* Bit 59 CJK Unified Ideographs + */ + /* CJK Radicals Supplement + */ + /* Kangxi Radicals + */ + /* Ideographic Description Characters + */ + /* CJK Unified Ideographs Extension A */ + /* 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 */ + + /* Private Use Area */ + + /* Bit 60 Private Use */ +#define TT_UCR_PRIVATE_USE (1L << 28) /* U+E000-U+F8FF */ + + /* Compatibility Area and Specials */ + + /* Bit 61 CJK Compatibility Ideographs + */ + /* CJK Compatibility Ideographs Supplement */ +#define TT_UCR_CJK_COMPATIBILITY_IDEOGRAPHS (1L << 29) /* 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 CJK Compatibility Forms */ +#define TT_UCR_CJK_COMPATIBILITY_FORMS (1L << 1) /* 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 */ +#define TT_UCR_ETHIOPIC (1L << 11) /* U+1200-U+137F */ + /* 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 */ +#define TT_UCR_KHMER (1L << 16) /* U+1780-U+17FF */ + /* 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 */ +#define TT_UCR_MUSICAL_SYMBOLS (1L << 24) /*U+1D000-U+1D0FF*/ + /*U+1D100-U+1D1FF*/ + /* 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 */ +#define TT_UCR_VARIATION_SELECTORS (1L << 27) /* U+FE00-U+FE0F */ + /* Bit 92 Tags */ +#define TT_UCR_TAGS (1L << 28) /*U+E0000-U+E007F*/ + + + /*************************************************************************/ + /* */ + /* 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/src/WinLibs/freetype-2.3.5/include/freetype/tttables.h b/src/WinLibs/freetype-2.3.5/include/freetype/tttables.h new file mode 100644 index 000000000..43eca2e25 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. 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 :: 10 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_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> */ + /* Returns 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: + * Loads 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: + * Returns 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 by Windows. + * + */ + 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/src/WinLibs/freetype-2.3.5/include/freetype/tttags.h b/src/WinLibs/freetype-2.3.5/include/freetype/tttags.h new file mode 100644 index 000000000..e10244ca7 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/include/freetype/tttags.h @@ -0,0 +1,99 @@ +/***************************************************************************/ +/* */ +/* tttags.h */ +/* */ +/* Tags for TrueType and OpenType tables (specification only). */ +/* */ +/* Copyright 1996-2001, 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 __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_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_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_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_prep FT_MAKE_TAG( 'p', 'r', 'e', 'p' ) +#define TTAG_prop FT_MAKE_TAG( 'p', 'r', 'o', 'p' ) +#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_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/src/WinLibs/freetype-2.3.5/include/freetype/ttunpat.h b/src/WinLibs/freetype-2.3.5/include/freetype/ttunpat.h new file mode 100644 index 000000000..a0162759b --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/include/ft2build.h b/src/WinLibs/freetype-2.3.5/include/ft2build.h new file mode 100644 index 000000000..923d887df --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/modules.cfg b/src/WinLibs/freetype-2.3.5/modules.cfg new file mode 100644 index 000000000..6d8a95eac --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/modules.cfg @@ -0,0 +1,240 @@ +# modules.cfg +# +# Copyright 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. +# +# +# 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. +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 + +# Convenience functions to handle glyphs. +# +# See include/freetype/ftglyph.h for the API. +BASE_EXTENSIONS += ftglyph.c + +# Interface for gxvalid module (which is required). +# +# See include/freetype/ftgxval.h for the API. +BASE_EXTENSIONS += ftgxval.c + +# Multiple Master font interface. +# +# See include/freetype/ftmm.h for the API. +BASE_EXTENSIONS += ftmm.c + +# Interface for otvalid module (which is required). +# +# See include/freetype/ftotval.h for the API. +BASE_EXTENSIONS += ftotval.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. +# +# See include/freetype/ftstroke.h for the API. +BASE_EXTENSIONS += ftstroke.c + +# Support for synthetic embolding and slanting of fonts. +# +# 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 + +# Support for LCD color filtering of subpixel bitmaps. +# +# See include/freetype/ftlcdfil.h for the API. +BASE_EXTENSIONS += ftlcdfil.c + +# Support for GASP table queries. +# +# See include/freetype/ftgasp.h for the API. +BASE_EXTENSIONS += ftgasp.c + +# Support for FT_Face_CheckTrueTypePatents. +# +# See include/freetype.h for the API. +BASE_EXTENSIONS += ftpatent.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/src/WinLibs/freetype-2.3.5/objs/README b/src/WinLibs/freetype-2.3.5/objs/README new file mode 100644 index 000000000..befb63e04 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/objs/README @@ -0,0 +1,2 @@ +This directory contains all the object files created when building the +library. diff --git a/src/WinLibs/freetype-2.3.5/objs/debug/BuildLog.htm b/src/WinLibs/freetype-2.3.5/objs/debug/BuildLog.htm new file mode 100644 index 0000000000000000000000000000000000000000..d35b096b58a217aedeed404d33e71c29479ab500 GIT binary patch literal 20310 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 literal 0 HcmV?d00001 diff --git a/src/WinLibs/freetype-2.3.5/objs/debug/autofit.obj b/src/WinLibs/freetype-2.3.5/objs/debug/autofit.obj new file mode 100644 index 0000000000000000000000000000000000000000..92d62b3ed03e9bd246af14cff0ff1a34a7bdebb0 GIT binary patch literal 114358 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 DH-iT) literal 0 HcmV?d00001 diff --git a/src/WinLibs/freetype-2.3.5/objs/debug/bdf.obj b/src/WinLibs/freetype-2.3.5/objs/debug/bdf.obj new file mode 100644 index 0000000000000000000000000000000000000000..e426a1d0172e2849c4eee65af0dc5ea170c01470 GIT binary patch literal 85783 zcmeF433yc18L&?vLYzcM0Ko-yKoDF&Hd#f<GC(kakOfhrLzW3dl1$7@SXAslT!@j1 zTit3)U8!5Kb-@-(plIA$QK_O*MFmBn6%{SDsQ>$Y_uR>35^L-7{LlY9|9u$V?|%23 zbI<af@0@$?lAMGjGxG3+DQkx$m`f9kZbQrK0%hR^0cX#chY$+wF;{0isb*+-ptOGO zfC5*Sdc83Rbu#AApE;Us#F=DLGlrIzgiG8&FtNKa53G(+AWkxqnupf44Y;`r=YGtX zrGIq7Ryg4%4Gjktg=3;O6dAK*BZ|YEOdd@hye4nX(7JHhfWq9f-JppGCsEE}{A82= zC#4RXq~WsLh8s_q)8fN9<t^06{8!6wstx1nq`Y3Q_vGr5n#zhmC|n+>4b+qeYRVRm z?;l=V8<;p~VP(z85re!nCDrWYR+iNTL&1vh&{>&dhYih=3eC(f9OPXPs0&pFYbFjF zJ9OC4Q-+NhF=ptP(L}4Q3zh{!p<rElUD>?KFzr-dM>>nfj^<c>X;o#}8G*%x!TABA z4zDO1TRO6IT*>gj@UelBrGxr=PtNj9PA|$S%*oCe-#@ot7U#<9@0E)AnBSWSvrR&p z6sBx^aaORbzB*774tYyz%Dn}FaJaH&Zm2lRH)}+3?qYBBaB*lsO>sqCARq-CGGge+ zp{EoFOV1A#Ykd`$mRAgA*DOoyokqKuuBIF54|>Y^KUxFc!THB~XViu(t1B<$Jl@P; zb!}x;pw5&nEdRc_DXp)pDi0NF)fX?Q4AqxZm6@_ClR3UPuP!*ZuB6&KnRA7TTXQo@ zLwO6r_2rd8@7Us5nZ>1*HN|CBLj#KfrmVW$44F~x9g^Mudsb9sO<7fad7!^{NR~g# zmr*nY;mqvmBS(mWW&)E7og@An-z;B_-<O|1Bfq`6Fh4!hr|J>@jH2uujh&yKf0iU9 z*5xnCo06ZN<(oKc(XcVYhlx5jBeTFeWO9~wh;M30{wwni$uG<t?j4ewMd8ja;b86e zEn$o)xJELxwrn0Ho*euE(=L_-%YWbm&m83)LY<sl=^auNtP0KzdWQt+>VkE3f!bhQ zcs#wax;89U@E<IxAnS}!@tKu1<-vua;sv9J4lB-%w)uC9SUk6i!v4p&9hh&crTwol zOTtyv6=lWWF#*b7ykG>yZjE1<=^ZlLgzC!7(4oc7KX$}ZsJAFHwdJMXx6j9z-GVZF zt0c+x8NUG{*lh+(vOiIEPBo?%bbaC-$Rka6^@(y^Hi;u)&fwR(C;#b|K=%D*)g`t5 z%9_fs>1%qVO2Qp)Jxp?%9Npf-7~)AZl1xrZLD!jcOA>w^4!fh>|Mk~jkLhPjMM+t} zh~fZ>;V3j-C&NJb2@z+<oJ;bUM?!Lv9IH<^CL;OHfJeYg*dJ!W!Eg#352wOxI1Ne} z`9<RE?RfN3NAi<R>Ma?{zKkUo^NX)Hi6dbK@;khPdMgjs1hn4VL<twSbyRO1R*2Nc zq?pKZZmExh;3%ulqg;}onNS+I5FQDcPede-vtWF=Z%5ykpVX^tQf@DF%iTA@m~nCT zB5@?lFZlKCpxkBiO6oA0^1vc3y(Hi9)=}wuTC1riiX>DPEDtckCa3MiMnqX%vdE;d zzsv5|1w!>z;r3=EarU`!Dr?jn#qdV<GlmIFuv|ueO?gi=RJl3SbdL57?8HoWaxQJM z!v@nFiIK`r+GULsM*o+(k#>=4xzp;4sdq2(x$ro69y}S&fums=oCwR|WXQxYBIlhC z&w^D@X0J7{8rH!}U<gLw0=OJ5gg=Fg;7Yg{-V85<w?b?<B5k$=#@oUB=)L@6?ciAU zDT>;EdV(=y<Lp4<NSJr|9rI0gP$QFDaUNbmb-Z;m2f20bTZF6W$ShoEQcs3T{-a&E z&1CID?8!BiXuNh^?1wQH8d^3<eS1g7!ZERz?fl$L>QL<EaJa=P8)zS?*Gr-F^UL4} zcm)(Yp{*lXunCHdUIppvhPIDL7OsPH;q?$3F<ieyE`ql}!WwKr?F3thaLoJ?{v57? zVjsVP_dskp@@se}6dS(_{sD3<(gIh*t?+)h9X<fX79NE0_En7ih;30+-QvfktI@{$ zSBcXL{d8duCmxqM8CjG4lNmYuS+0L|jn)m)O4pQ*!mTkb>3}27LmWXmy6Ql6ux@eG zc|-@L=ol1fP0L7rq^%A?7q<Fg3C<Wa9Lg9p0!rJR0#AWsptQ+2NV}Tx@Lo6pJ_k>Q zd*EsC5YnFnN5Kpz<<5lhb-BK?G332XUG}m2A4A%qU0q5X3G)y<u^)nNI>yT^)?X2< zak{A_-0>!6Ej9hF7Z)YL-Cnd41yjdbb<5&%UqdmsYH{tnkgCLU$5eKTt^fX{RjE!C zLHY${k8YCR<(-_dRq8{w?1N22%8&<-f-|8cQUHg-BA5$jL-Ctu!yr5dik<u6W3Uu% zf#vXh7=V2_M+H0@&V#4JDp&(+;0hRo55iiw28Q5UupWK|7r<l4^Fr7UE`}NKLRbbb zf!D$ad<ZUuFTrJS3%nG52Csk~%HIS}hb!QD@TYJtyc#ZtE8&&!S}5&$1B|zoyD47^ zKevlWzdMqB>4#z~>-e1<=hr2Ugt>{|(0=@<Tf)4O&^*5wi@I}3wBzj%YbWcyRApE# zKmx~DK<ps9kVEzy5>Yy)^sUf^WZRh-%5Ei{&Kb@(dTGE~H5+&QolO9Dle~-FNO^Ot zGMPRk<w=2Zs&4QE*d309J>V?Z6H0atg;MrDFup!t?yCM*{SrZRzH}64bL-PjJH-1j zi6i!UCQR$Vk7c{_>*bQ7-P{Iqb`LQr?hq-8A8$8)ERNZqTvA!3ttnZ{#EwGYx<E;_ z4%gDau|D=tT1z~Mw4FFzI~^2tFRQMpulCoLuvXzXiNjELr*dLcGB1m<8gVx=xWDU- z@jv2QqFy_d5Uv5~b*<*@d4haFoFI!a!J1H;DPCTe=x{8_Zz5>ao5fn`!*uTpF)Ow{ zgj-8EX%FTY!K!*m*1uQ}tZRQ@5xzP(t(gO(sgcr9<%I#Y-q_@Klh#l%A&is24-@z` zFB8N1I_(8(*zeD=nsyQUkf*~Bl6dsk<h1(<DEXI(PACxe*9GQQ(n^cX5gfdSgB&yU zHI*`j^-CbRPLqhM<085f<TjNxg-W>9Ihpj$Rm4dUGiVb?I^FfuDw_<xD+x4;K<>%h zd2?*(rxW&_)+iT$LlifvjulVS&)iM=myF8`P^`219Qv;Gxm-8^GL~wep8=)M&xCSq z$U<;r5-fs~;VdXcI184+v*A3**so*Bxlqn?9$W(b@KRU;nMavYxEhwjjW7V8fpg&t za30(O=fmx=8om$fApXeIL*@)-A(ZiO5u64ug5=dKfuv!U!nJT2Y=Kw6H{f#kA-obE zf^js#9+2@X(hL3+%7XGrI1*k1$HE)n6nG<?32%b+@Mb86|8v*?Z-ZCERq&Vab|_=n zo$yI`7km!h4c~?Lz@2b4JOJ;7skG63us38pjf{oAf#V_LYGfMxEtE0ucd#7N0V84f zD3r19G5AwR9Yk)1zlRUNKfvF?b?}eykFW(c!<XR(_y*hv_rXmt5!-nZdf`*BKcr40 z(j%XTW8h|32495p;LA|1MYh17!B^mK;j2*AowveI;p;GoK116?dckc_I_%qU5PS!o z2;YOJ!(FfdegNmfe?aMTpTqazKj9wuZ@3>a?}%hb-|57)0PGA`!bB+DFd5zgQ{b;4 zHW9f8c7qSVRQL$QMk4EAPq-0cE0L!m4kof4dZF~u6X0%mBK!oN1oy)s@GE#SJe>YG z0``a4SY#L+2Ty^g!gM$hPKKw!_%U_`<r+YdWB`#(<}AlSs#E7IS=e{{7%OokOdg!r z4?#Db-&O@n%3J5Rl5oe{_Zd`UhDp7IjoJUEVbi^$l@X3><d`cFDffP_4p<?bWXq5_ zghJ`8TP|PXMn)N6WMq`l)*1KQYn=XQsw!&&H9;LnWVGx_LeBh2=G=4WlkO&UD08Q5 z6opp*K$5d&@gN+6{vjy-^S4m^=Oa+&Uys6b;aXS@ABW4}?;+Qz<`3{j_ym;elV&J> zaRU^;xDkq9+yvi-Ps6?NS$F_G2U8P_c>$gPUxN5x^D@MTn%5vc%e(>c5#~*}2fhWn zP?qiRQ1~vyhRu8MO!z*W2Y11Ra5uaP{sTS^KZ4J~z3?^oDf|cg93F}P_$NFG?uRm0 z{}-GN55Ow;HM|`f=H@asb%ru_CBk=L65In*;ODSA?24hM!fr4P_Jlp*p|CeR4)%dV z;9+nCJPJ;LUN{Z*hqK^7coRGh-U0{1HSl;S{^~@y7M=vx!=dn5I2>+<BjMZd6!<<I z13O_S<6&3nYp^#w9rlIka3aiv;?J^ReE%Lub;#yUaixD#^l1OS7<p9OHHpNLFn#%b z<mErz68y4AUBw)yb&=XV)}HPK>|eanDMB4ynz+{#V`HMrxusuFd~=f3%XljJk@2)A zyc$a0WL%9e@0sW&uKZ+^@+L#smus+&$}4dsjP%9Ny!@wIOnLu{#pMpmD@*M$lWMoT zQ{7WQIk%J-cWzF#dYK<cetrhU9m%{v);n&6<DkqBB(J}K@#P;#Mai5>{F-c1{ys6+ zOpF!gl=${0P9MVV=GfqV8jb&)@^jTuZm&ILVNsHHH`k<`{U6e!i$|5zGs(O?xw};T zs+aj~NmW&8N!fhUn{ZN4x$99@RmuHk=e~!`>!srQqp!jpyBE6}xm2$a<U%D(kdg)N zm6lwO#59&Ps4Of>pn1Wna*gFW{?f(aKuG7@+iZ|<&>xy#S*w>6Pot~l)TQ+m8f&W! z6AG8qg*C($tKt5>hLB4cIgvA<NLgjn>5qmq{CXK9b+Xw8<64E=_|f$q31<f$2_-AA zl2~1!qOz*0%>_dd>bZDoHaUr0`$*)Pz(VIFVxis4xU?cHK{lx{(b;=MRx3xu&ctrT zmUFDWg87Bm(R_F`tb&7JHIy}@S~v>U!3i(~Cqc%7$P~C3o)4J=>-_&>SkL|vDE;;l zxD5UTHo^#8375hf;W8*|s?41ucfm{H{qQpQJJ<*xhm1LqSKtcx7W^rE4>H$|{2g8k zKZQ5IgQ=|>A?p_ACU`i!86F95gR*w@3pfql4rjqTVKKZ5a;;+Sfl})a!dkcnE`-eG zBNxMm;id2q$Xwk#3fI83P{vor#>hJO2gn@TJOP<AoAvNbxB>2f8{yyKpWr^oH9~~B zt9c62jE1o_k^-NDGCuzWj)O140DKA3cIIVBo0(VO0{AMVj?GqhC43#Ogl|CV!fb<b zeeySWH+&PWhHt^&!0nJSns?wjxD%45c@L77c^}66vA3A7X3++{_{k=ItT$eqZl!+Q zL%h*(eoW%@=J;Lk6)%Erjvr&GBNXsEJy0B(r0s5!X6yDtIx=@u5N{woG`fD%pYw^L zDo~@{SiG34!(qvMRZ6ao4R7bTHF0;cbQACH<Sf$Z-}S~!Tg7+9xiguO9@|g4JGY5s z9_u<L$L+{EgE%<JtTPvu^&QDoNU|x1#Va{;+SoOP2tmTw8JlE9T<cCR-CdTcC6>4? zNyb@#j*Xc}tO{{2GGI9iH{{QR=2cdN)kBFZ6-{YnxGY%DI=G}Ko?4VndaeFxyG#=7 zCbl5{X)*g-tbT1*=1=Uehq7ML3<toCP}V4)gu~!da5Q`xo(`XZvTpKc7=SOp3*n2f z0kS5d_j<O#pRxZ6l=X>M;cECg+z8)*Ps45S&u}|@3BC)r!<}#sd>?kEW<G=-xEsoP z#XsO-@FRFU{1{GwpFq}N%%_mG74sPsfAcw%cKH%AhcaKm>)_W==I=be7vWmmB*ORM zK~Vfh7x)S63dN6j;9=BdGCT^VK=B)gz|&zjm<7ATS&(NJbPc`-oX37|h)*_$L42Y) z9Nq_yfcQdlBzzkl1rMREj)py;7ajxq!NKrYI0O!YQ{nM2AD#r~!67gRheBDu7!GfM zBjBxYBwPhgfq#Od;d^i_JQ$-N2Ty{h!W?)SEQOO`5N5zIoD8pqQ{ftz4IhQm;2+=_ z@CBF)KY%mfM{p+m9OlD+!y<UxL9By8S(i8yPJ!pZIj|U3z;oez=!c7730wjL@FqAH z-VV=)YvFvj9#+9kFbH?TTDTit0QbTW>_P7f!%?sv&Vq}e^vWghDj0#c!KLsHxD2j` zmqJ;$xD3hzmzTpg;1%$1un`_aKWu_0!=J(ocr`p9UJI+>b?_p116&Sogjd2_;5G0z zcs=|Dj2|cNroV{ul<A^u&V09ZzW*}1j_$e0JVoXd&w2SzH|L&9^!Xb}wBzl68X#g8 zCv>sm+i%!N2)S^ODI9lZ#4pNyKG}8rv^qRpPl(B%)PwlDgJGf7|C6SZa_)yRANv;^ z2oFG+k9`SGgI__J#~H3C<^jBNWIjBogX@dW(aXr>R*%%TT$^CdIxZ8(438U^C60vo z3%~7N{?pB^?@)kAu?)$QY{%R8s&Tm(5bKa(ZGOPH|D3|UjH3FKlvKDBXT3Li4^6TX zGkCg9vVjmaHQFRHmWB!CG>HU|!Ez%3N}UBCj!7G>;pc8r57I_*4ST0m9zz{V-FTs_ z`SgRM-~cGsg9Bj(90X;}XE5|b{J%bTa3YlZt|!4oa45VC4udyAxmW%RI0CMMqu_7g zX!sBu1Ah<YUilMn0*votub`I-`ldeiTaLxIxx^9Mds=>8{?pBA^V0gV`GIe{1MW6k z0%w+HlPZ>Gv#lhDr46LUYszcmZ&|u6rm>x?GIuh=eIzEsxF>C&RnXle&(c0}x9NJT zq)xOC{Sh98Zao|To1wJVCO8H@31`6;DAzEQJ5mRqh3aSED)yg;w?oGN$bFDLq1Ps? z%SHag{$@y8<|Qa~hyQBV9<-hDaxAtzj%6Q%);=iLD)H?haU@JKjQ4qU0lD3*eb7sg zj<@gC2c<bAw=rEz+A^+-$?Q`4l=XV<#kSMMq`}24N`nXKV{u(h4vU+V!!;b1d7|4# z-3K3}KT4l)H>ne8Z?WyGtnxMLTk7d`coKXAo&vW)>5p&0X>dD~{`d~O9KH*e!<|t2 z)%#GcH9vr~sre9+rr85Y%lsYUpUqzQ1!QfiT|3{3UTQ72oewpw*Fa*U@oPB}=TLq> z<Colz|8$F4%W~${;&0t#C4`tx>*ijzL>KR*Hl@M(^K-5Q+}>2LH7yMz$DEp$dY;G6 z-6T&^&mLH8m2&S#^7$-00X_$%zW)rRKfM6c;bxc#<sOjuxh?Pt_*W=pd<Dk)tF7pz zO(n;&#m@;gqKjYilsMwAw(#rLQN5iX<he$vHc7eT?Hj92jJiy(jU;k^D!atJqH^o; zd^KpXSQ)2c9GdJ_IQHDOmL2~UYtK@KczgaE^&{nydtY9-1D*_b!qJd<e`FGrdtqhp zLwEt)4KISM>+ADsa&PQj_CJF7LbDe(!;j%J@Kg9A<a$BxEqn&!+a;}Y`?X1Lj6GK- zw6|x8<0W0z63ize=oV|wwN>_s=^XbcjIrl~#PG(e@92%=|6YEqT?@-Y7Gh@7N}+%} zPZ18*ITz2;)S`}F_xD24pPzf(FNsO>i*;1HkJZYx?G~>l7E+TCrzpt;oKZ}!^L4kw zl|ylgt__81b$!&GJ62TIlvMcxymPSF4u3lS&7scSP3l_g=Xex_R^N%W887=?;2_Al zOJq1a1g67oa59v8nKJ&duB3jkH!NlU2q@#=G4K}H53Ygz;bZVvD1LGP#8;Yua5p?2 z9!nlhg0tZe$nyba7@P-L$Brz8a?kS$I0{|`$HG6s@$eZa_dvOiY$id<VA3IZHkpvT znaPlInW<3j#b?7a;WStbbD^w-&49A@l?P?*i?I598TalYH?dy?S*J6^)qC=1L)O>K zIWWE-h`;a4&vn4!pS<jg(J~ImT&&&Nmc;S$lRoy62)f1egFsD)*SXX~N!lH6KdkY) zcU8rJ<q0F+DdPbnxnOb4+8MfISA4{Gi{D|BwQ3pTV`c&J6pOojU0OL;7rsU3&J0+n zj_TaeowfPsb3Pr<>!j|)uG8T4a%Q$W@lRfO7Zkf*4JBXq!qee>P}Y3zhehxKcphY3 zHc|n93uQd|9lQWO0++%^p_Fkg{4IPOJ`Dc=Wq!RLHp6BZZx>x?cX1}M<JOVvyLNFq z^02sTD~TgvI>Ao;5Oj0w0$)^Lr553)=pJvSjO=2E>cI5ggoK^TC5qge5EmtWOj@|K zB;>q6B8_`Jby+SCG)a7STv}iqi;Vwk`MI0qQR=@Jiu<jyZ)fK@!G7>Wbp7E7$bAL% zC#?7A^QFhb8R$=h;$OJ`tM|Z%Lb(n)8A^Mc0vq8NxDxW5i{29$2UoFwDtrY_gdaoh zAM5;U68xI|3@CM&3FF%(1HI(kt;P6j-iJ6Azs4YOjzE7JOznrDTeMw5+ANZ2$J_td zEHe9*W}#JB-JPrLCXT;dGf4oqnbiNwoWb2B&(cnZp?KaZmr);5jw_(d)0RVNrzR+V zpXY+Kovwz`PS-$br)%MCcs-PMVjWJ~=@wYUKI?J%{O4^j!u~Jd<?s&pYj_uwapG<$ z<HS9%8Qu$}eeQ#Dox^iTx+eM{^s>JON}WFh<J<8);{B&~G{lR)ryy~p{OkB7_2WO? zY&({h`^$pW@}BFrH0KZEci;8e<$dvpVvEve-SdkDNKft0&%LQ277^oI#WA~1vvt`* zI<F?w`kYEFX}Ft|Uu+^7mRse_M8_ry;Bn{*p<D}}1?R%EVI?evi{N?iD(Htdz!JC` zmP5G)4#4=fV*Vg&6>Y}I<6`ED*Kq8#IA17nBtJYSU<Ssul{}$Y9;hf`p5+hKmXz^A zlD3(g!`;Ns+U@&H8oyU#$E+9X!%Q*z19GO1#6w5l-(i15+&)+RG_v^fcfHnFL?Onq z9|ce4Iu8JE`Kpa&xbCAr;ly|(&OU<tn>g~axhl4y*o;D-<`7%jj3P`7$CjL-SAEJZ zl<p>NBK9MFXq#15)85ifb#NHu**?9dUI+`>Uj)yB7r}XO3A_aU1YQZ3!e77!cn`b` ziVwaVJ_;M*3$O|9gIB>X;R-0ep0)c(677BsoD6S(d5~udBl+-VDEDu9hDV=!x(&*l z^A0HYZSRIW8*1)>@pk(*b7=7u;%8)&v0@NbEVlJAKbeb8h_hRXBXbbBXYq;`K{v<8 zIQK2(RvOEsl`LJ!C8(Uh-K4SY_J7T2U855}6206Jqf>+WA#ZcapeBhfaLrU^hR61k zQIC6?k`KA>Dfv*l6*J93(Q2j=Bu5gFIPL=)TWp*KB~|qSozlo8v?oF2qHA2*-L`^{ zL?iohQ(rdOkFonzRxO95O~vkqBVTXzGr8|3?K~Tb{%kk~o(m_!^I#?{fil;ugcrj3 za0TREiQ0EHe3ktgxE%)JPIv+IaIQKi&neWyQ{X~46)u7oz{T)dcp<zMa_=P~d0zsb zgqOfAa4CEnE`zKKm`fqo|Au=sdM(umlPTj0$n~7L8V-dk;TXuhn+Vri=32;glerGc zwG{Vq^tpl?;6?1;2=9P5!)AC3d<NbM<r?ZX$TJD%mvBE^1rw;>U%}4sb|}}bcS3nC z<u1s)&fEjfg%7|o_#lk$uZt;<jGM9jwGaDlf8B#TBCfwm90@ZYdix>h=JeOfke_LH zwRTfUx8v=<>M#;Wl90)G)S4xqqHs)Ag2-&`U9a`_vH&1`M0x-#269{mc(H$dh{;_w zmE$ZB$TU-?1Ure}I{xn^w7W@J#g63~V~17pETgU|@hqdx-G2|y;28Hlb?)~Bl(o@6 z!nv>+*1`>N0o(*-uHFK#hEKyA;d4;B+Vk)MxEcNqz6izTZGq3hSKw~=D*PP24im`d z8&K?j8<e@>b~pmQ4Kv{mcqZHlE8zQ3+He<)w+qRaxK`J_iXWG{r{2_$%lH#NSClvs zW+}ffz5J(}J{LWg>4$aVi`6#Vblp&`jJ1vE;499wO(RRIZt&8o&hsNO)$30fIY(uA z%yrm2l<p?^leYB0VyisBJX!LbKphN#o#0@Y2&ce<ptNmQSO}A#%;&jZu5FnNrMxLH zz7EC5NqxCxl{!qeIvEQa_{HC+kT??NSbl%=@}F+beWR*iaDIKQR-Yu>@g{Q_Ibi}P z>)^hTbO5Qljb1vHy;CRGt7BtQlRQX0$w^MK`t$_nnM|&c^j@kDN*<X%v@7?$M3g#| zMw3m-9sBIkNNjFQoKKNBy$O2>JgT2Y<G<GHj5fw2iMyL*vUU4jb5GauqJ}04DMXv` zl)|W@)dPvc+39tRPgiwhP>#9qaGlNu!dQEiCWx_D8K>Lc?vXgIXJYwVM_Fm7NwkZ* zNu5bM`B1R_ryI{%=rcaN4-%0R?1RU{{V)d}fHJmz1uua-U#-vTB*NdY-vzz^dEQ#r zu@8o?u%80=z(e3aU@A<c9s9t8A<tt+`op8(V0a9i2)$5zPd_MQaDO-l9tZ2-V0aNc z0sa#597yC&I0W7ehr?}f1eCG(6v$e;84WvA<}t7b91o9#6X0?1RCpTX`S6I;*=cY( zoCN2<40t}wgbQF6Tm~n@U&3toYd8(cx@Hc14d%i(;S9JP=EKh+@6qVkJPUT~jDLYL z7MH*?U@4pl%it_n0RylaUJPsC3K)cU!dmzUyZ}BA>)_vD2=0URFqQUS0Q<s)a4h8c zm`D~}4ClZL;rZ|q$aRPL35@qs(oW(7WBaRIuMk{){X;N*eMjO*m~qhb<ENYLui>Dx z>?VnJynV;@ogSq2AJ=yzz&Eb%NS>v?$c*86n=jf%*LU)utnbi9IyWtZ(yz{h(r;!% zSr0uM7Qu7inUMLF_9xyS(`VzDXX*M*Ib6u`3K)TN;T4egH1s}F4U~H2d9BD=SPM76 z5d0_PT1dz61yG)OTL`^yF_b#L5XQITgXpDfvF&&i`))g?ay<U~DiTM+Tm}#7hoGDD zJszHY4+q)~+md|8+YjP-qmEYA#-$ixeicDp9d#~l#P`1IwR1fQBd#~b(~2K;*UFvC z^4Rs+);qU5NuzbX_cW=xo79Kch>S%t=aTKu)V0*nW+=Y&MK}z;3a7!Xa0c84uYvSa zy*K+7e2{&f%hY>@@4(IM?|{;FJE64o`|uFX`vL3?KZMfOysM-0w|~Gw_CJDh4`?rx z>+?^bT+e(4!;p7++S$aIZq8iC?TRuM$G#8Yqpa~`vBc>^zW#N{H(ih04=%{HxI2*| zd~~8CGDF4pc#k}0nMWTRbBAUzkRR^~+cg%kx-z|yBUi?+dFj6Lg$cc!*o>x)2|nM} z1Z8n@8>;@KQBzr3%BS%(CAqOF>AJUsT5l3nmxSiqch)5X?&XVf`%~rsUJ706T&#$3 zOUjj+7nw51UiA6ottfi-6Wflx=kzu~K9xzOv`KQ>Isy^Kgccf^R>X#U9d#nD&L$6A zueIs(^s#)KD|(wr)&RC+aI(F5Xqz>Fd0iZ}{4aJSed$@`VynNJ@keay7I-xLIUE3Q zgW`WzLFrq!!*TEqD1P{ED5ka=2H?H02Hpo3!3W?{_#nIzu7P*Lhv2W_Bk(c!82k%- z9PWU>hr8h);9mGgm`2ffel*etHp9Mf1DpakL0Kz%5=viu2FkV6bFdmd4`p8S0+h9d z&2SZb333n3Y=OUpTcO;aeG~45+u@h+9mqXr^Bz1L?t<JSHXlIl^%|aE)pw{rfpVYr zQz-XoKZgt97f|lU9)Q1xU&3bi6?_uX;5v`#1oyF@2)}?`psXo$g<YTra&O5b!%^@M zI30F}jD02z&Vh%*i(nsk89V}VZ^Il3Z-;#$_b$va@EPcZFTj3q3p^Hn3J1Zj;qkBw z_I?87+R6-rhrtnWJRAc{;aFG&$H7H#0=y8O3T0k=I(!Uf!YAPrD9;>Eh2|jUb+9|k zg~Q-<$lTG)fbtA-KAZ^)A#*x28!~4z=fE)ZLu}B@fxm&J5Zf^UNSn)3{gF4|Tu9rP zO1K|Z!NchbHITBK5TtCT9;U;Ea5B6Ik{5F^EQd>=Jd=D0<d|6s<=N!R;H~fqcn@rZ z@=WrTa4T$rJK#^@2k<($4_*&FU0L&m1K>?i-krV~PJ_J19bsM0khVUf{By{9oB1Vd zf~(-q;IAO-OXe=fbNz-qM81TpA<xH~UqhaEH}}KAkoUkNJg06Rf;>NNeg_NTqmbvf z&13KaxE3yee}Ff^b&%(u%@gnrxE}rqHp7?UMz|F|1wVz<L8RBg^iOyMd=?%9pNG6Z zYW@PxfG@#H_$s^(z7FqzZ@|^?E%+z+HrxT<fgi$m;YV;M?Cznz!js|qa0c83gOK;v zBbUQH@Mmx@d<K3D55P}hPki%da5DTHE{6Yv_rrg|weU;$3go@_$PU=KE9Ha-!y}j} zrNAMu8ypK$VLI#qBd{l227AG^us3`f_JLdAk#Gm>3qOEfC?ml@m<k8O<KXdd2s{Cf zfJ0#s#C9STa5xOYkuU;B!7Cu|<3}3d7}x~I!k@wMuo+H(8{tIwJUk6<gOlK!Fca>C zyvHBe1*gFH`R{bx8%-abhR9q;<~?+Ky^fLfpZN6_i6ddA@q3-2%-Ir37yF~1C5eAl z&<*6!y^>kV$x4`dJM&iAE7j3fR;FYIQ8q$%<-%WghwI?$JcAUIqU1-$OiU~K9Q#`4 zb&|(*P_DV2fL^#B4u#EdB-{wo;h*4C_#~8aJq6?IY8m?fR97oG9)F)k;z&Ni{QC6c zKi#71d-BDAwpR;sf{r(LKKHKIPUhXEmINwJSN+_Dsttr-(L`n{vi>3EayQA3)D`Y5 z`tI<p2Rn83ODJ`+3XXxd!#sE=l>FZX<Ll%r#-DPIiM_}s_7l5q#WR=fuAd~1Tq|%N z-b`v+CzUnfKwWJeE1#k8;wtCSBuU=g+|xMw-)FWQ7uQ_^97BG1XFWPq-05Xz=zcpb zZjDOnUvBzD8${-@Poub;7Uvyg{eYzek_oANeMvuWCufq$uGFa9k&^2#F?iW;y~Xan zM$D@NlIj`)Jc=C?VQ!euw#80BKO~~OGRY=gX*EG*%HKB7wH!U*1d<Hg=?1DRYm=5V zzq}sBCdRbN=Bv6|jY$m3{SiWJtC{w7H)+>A&U^}rhpqmP#=buX<$ACg9t$_Xli)@; z7Cr?F;j>WI+Mb7Xa5F@w&$hn?|H^(cX>WzR2cgee7r?)<UkcxZmGEu21nz);ggapi zd>_66skBI6>SH(L`9XcQn&$@1N9>;gKZdg)Wz@B=eNg6#*ndR&&p)9&+xIUh&-VQr z-UtuCyWy8m8YPjn-WT9O@Kx9qZilS@>GyUhi_RUp!Bpyx^#=X!4)f{AVeI#U$HGJ5 z2*~_8G8rBTrJ=l#^$~psg!K)>dSavj9t&k|IS~F79tW?3gW%2Z1o(4!B8>0T^QmW= zvCWvku&Fxg#oWj*{uy$KBVo?vH?{}=>89U;EZ~b;{sLZGEpr}uk)%7`Tn{&qzM>aS z@+~h0R=p=I9csS&p)%<cGAz97)$XbvUJ=Vwo17h!y5vi2Qrv2e)o1a1rR0_C_{iaK zDm)R&^PA%#?XUMQa^N}avj(d7rsR3f__~s31N!oF-M08YFZ)tRsjFA{#ozOhI9`5o z{FDyrDnD>RJ>T-zn--FG$6LF~l720fHIgLj0vAMY<V8J?EdGcKlT*$MRL<q&f3EXs z{q&h=#9y_#BdKe-!0xcF*T!T{$|ZH(3*K+_@{Fq&nZBg=h|Yw=*`Ez3!n0r&JQps8 z=fTV19C#}%gOXM`l>2%C_z0|o_zc5(w7wTRAIchh4V1O_I=Bsn;M*_^--Y#1>YerL zc5R7oGm;mYP&aAI*ma-V5}2FC-Gh-heF!brr-RzI<rG=}@aOP#BW+1Z+1*@garWbe zqW@_(e$gjppJ#nW#Xalu-#-g9LAqd7&{;whtBUqX_X8UBD0PXagKq~qpLD7!;RDWM zPckNM^SUcSVyDt~V~1K90NdE9nBYICPiGlLQxO|%wMt2)*=kB_?cE-y|I1oKbfbO5 zCI_L&vihIU_R?k%cnn+$2SV;;=$O<1PhtNuD08PPpv*Dx_j(`mDp<k(3Ml^N8h8P` z7A}F;!JokE;d02h5V;%P41WV}fseym;YP^46Md)qS5R#8PPiZ51;2pzzy$KX8g_>F zLb+#sA54J{z@G3yDC;i2h4_2(J2(tJ49CMq;S~57l(o^dumnC1YaweNkxSqP_zSoR z{t7+`<Ne+n<V&nrOhdN#>xOmc#>e#)i6g$@&-}9b@t<zdxv+dHsLd_Qw!Op+FO0Er zed5jag<?`V$#Nevm#ML&>DT$OXr*&cK8)**=&2;K*yB#Go$9&s=GAg4yGh=~j--qK z-0EJUUZgy)z;w73o(*4vbKo0L?BPv#IeZIV3%A4T;k)oQxC8zg?u7TjUGQP}0c?gJ zLa~#-!%grb_%!?!N?o!h)vkSxMK4=y`!L)`$0a#m{P)5oj)ak>ncTj8<P(wdNMxns z&j|DlTf5fiOASj#rb)fK$;4bMI<3;?X!OgNI;uPUdQ!~!B(KsQEDzz6o$cS$gXEui zZX^wU38jC34YfEOT+>N9vbnY<b}VU-w2sfqV7whm90|jG+<01jzSwVhT_t}?hwpmo z2p*_Y&rh&#*knYOGv7;gtApkBT=7WdNnJ%R>YNJr1l8D>R3r~le#z%aR(~YrlYI4s zaxHu`lsp~-#jo6e)9Y!vrcKq#$lx>GzPdX9jQM7ORdzD2vZ!W$O>kk2U;a#uf3kBk z$qm&x8Y;Vn8~T;yZ9?_4X?1BAD!p#5{(T>FoDI@78l<SEvbwe^AWuaHNRE4G@?OfZ zHe8=*IQN8km5TyZewkRBqivu`(Lgim!~Pi+{#@tN;e+k*HPPd_m7x%qX8r>Cw31$c zPp%A9l}AtaP`i+m<tn{xpx?F&q|;m{kXuu~YZoX}`jAb^&Dq24LTS#VpV*LtY#APD z7t&|{P=XEE-v)fNUBHaeMK(-d8|JZS7&%rL4Ei%F=SJIRZS-g+e}1OER@+6YVJaW@ z!miymeEgfj>Fg)Ob$&|P7ha4{H~k!(K2h8k{miJ3QN4A@^1$km<ng$kbOOU4Bg)I3 z&7UF4oss3^zv(lKm#DAH`0XSqZxO`|9TNR;qL*vOB)V^U=8UZD=~MjEXH55T-}aES z3DG_q(`C!5N<tyhc48(*LNz4|V`HD0KE0r5`V_S{Njou8GB0?3Y=~(yrlw~w(Qs49 zn30tpdptdBMuyK{P?$bFD?LApkt8K8J6Z$IOLj++yZ)5h*(7)R2VR`Kr4k`O8lhxF zC4*^7+8I#|e=%cjB@b)2)s}atooBTJ$!&K%AvrC`KHKNd_suNw6%_gl&&u;rWx3hY z({r@7C78BH`(XLL^c;Uyb}rs7CGB>cd~5#sQp1AEvVgP@&61LKe4EnQqakj=r=(4b zmc+RS=$D&(9O;_&Chl>x3D?Pos!7OkvaDM;N5-@ssj4ic_>MZqs-15D^`&OJM9*Cj z_B*Ln1r`LV<n&2tm(r+If-`HEPkv9XuPMV{CZ+u>=16{^%#RTzrLBlj`U~qyYC>|) zUE>_d;gzw6rv$<o8No$*urCMeoP+r#Ay&J%G!EzTy=OftDX*de$%wdOBIY@daW9TW z?&3ry3d4mzlP_k6>*~vRg;cIp()v(FB4_4u?=e~kDc+T_8OjXSItfZv+Y~&HKQ&cS z*P5BL+hjGPGF-@&sXtoGq&At!;+V}#cM@J2b4sn^D`FJ-*CC>XDvm!5mExS`2of6Y z990i%FOD^)luOJ_Y}eWuwMG+ZRV-|irbGz&H5*lJ4onX$)Wi-avHCVg<nLGLp+h-z zt#imRk4$wIJy4(Ns0(UKYBZ>{!7*0H<x^`ZC9nIiWAd6Wf1<CBmUohoDAMWOW>c*c zLUJU&iUV2Bydru?YDM1MYAtyt6RUt)r&RqVt=aNxWmGr{C;Pbp)>6u3fiNj;jgv}F zWocbW-C|APXw<j0F+v@-0^#g(Eu)nCVdhDkoUv9OE$}lJN=gel=dfm-A7HYm;l;>) z<(y_ppeDen8H#wbnBlulBX(vMLt@sXvt<p~&f=5O-f|LEgLdjGjpRJ7^(8eWXYjVF z{F2}4Jl(ISm-^V?WyymNR@BH}E0U(@MgFUTWxP{gSyRDx7}aiZ?n!BXk833QV5Zx7 zdvkoTQ}X-(-&hM$67dq!gh#}jKWaG=p}pn!asEkZo5_=oT>5>~uqKj=4-~gQSJn<3 zy`PKUq_ih(uGD2PswSmvu{A0oWsyPZLG-0gh2`)8)#;R0TeKT`xn8G|i>O{b)p>1N zE6@4TzvQcJ-TJjs_Qq98tk076xWi_~X<jC=Noir{e4K9N2(`3<aT%uZy@dNPF6p+u zR5Emd6GFPbmPSrE)oF#v3<*+jDWI$$P(V@X`FgNl8=fa$Bdspw<*kaKs%2h5FlP!W zj@Qrgr%7p>tc8S2c>KiaGe<Zzq;4nLqLLw7G<Wi)$zJFL#zV?u9}-8ConafalsQ(| zY4?wud=}J~YH!rM$Mjbnat<Y$Gpo^W5QepzbnFY9;pjx?^ip^kHO>gs)iB468s~mn zh58pE{MkW0AY<D)=YZ4oq$Z_vbmWcvnlD)vqVhE31+qLOX^bPYGFsWja4PR&Cqs_I zajqbooNkV5Z^s)(duo4cra8fyxmtsyqs=;EbXG7tT21#TCvC|<>mVoI@(`zO?O?!g zRHg<anLNd2QXGjY#bnT#g*wp=tC{z=3DbIbY5Z3nU+@TrG;`9o+BdRaeb4(&nY8xR zec|2oBoe8EafnGuQd(zwGHnydE7K>eIL3{L8_Slz)20~^EByc~75|`@Elxi^#7V}T z56H;mWa>Fv(atO*rkcfD1)YOx+is3ESM!|Y)E@+7dZJAnuT`Ja#<n$>Eb>L&m)Ls> zr+SA|<z)J^v(&aa8i@RQX8AJ|*p?L9X(Mg^txiV8or!r$-Ur)?ljaxCr?n#ocEl9Q zj&Y9nJl#p!8AWwm?Qq)QSnjJ7!un-KwhH{aUzR~zyS@BHPE`z#u_<)|?TX;ko?I_b zGS^=?E_I+SMXRmJMXh6N;$&WFEx7n`_3g5>PeR&i?p*>Y_yn5~cTL65)v?xgM^4`9 zhBuMC;~ZOuK|2acPa5i+Ni8}(9A<K%wJZbV@R&omn)LDoB{gLMC*v|yWm^B{{Ph{J z^otygb49NGLZ%DJPCC|bZE+YBq(FzpoFnRbCGljE@;f=Uty1pPlT5Ik#+JntD#=M# z8+)9SnpT^0BT5S+9zd40ZH;P$-NU>`e3?7#F63_v`?c;n7@Af8sB^m58JhME@hzlW zR4|V}-Kzfk-%iK^#|dXv1w+pCQf4pb*kg`Mqu;q6L~3JtT&AL~rGvh&)%U4Ws;HaR z2vU9Nu`Qt{+s+I5)wE?L)%EEb?qger&OBS)mDFD?Q?~^r`iXa))WmrJ9o*<oQWF_L z9&r~ZW~Y1VTWN1Gw~pts+=EWiKgdMvyr5j!CZ&BDTZvjO=`3yiqSKELi)r=frI5H- zxstVQj+fV!I=|D-GWc~khG^N^&N-Zu^oTLk=t-oe+sr4_Ic{$CD_lb19HrnLUK04V z+O|7M%YdbWjGcAFc7Dyaw)kYHVcU#AYKC*1`pPX~%D+erwgWGzH5)(YaAqqHIPu+U z7B%EKF*R!|P+LL_f<scdI($p>$+R;hKF;x>G8lwQ<~rkn7(?3&3AK;GPFd_gpsF^d za5C0*U~pQagE_I|6K-)z;mppo7CLa5s(-0%d80k2)+raAS3UzE<9Y|ZQrmffZ3_9b zed=dq>>yROIdukNA2HK$=Eq`q_7X||DEm}iTXQ0d&BssDobht4lT*j>Xg+oN?`YlG zrRt@gpYq~3-Af>6%KNC3(OKM>4>Hb6Y-?k&vo^KG7$@7NOY=>8?WC=feKjRn@soLg z{gYm_y<BRx(>mn{IoU{Wy_}N#?sl~Hx>Wnhc}~$Zb29D+>a=v?A?5t>Zd?0o+Y1w? z+-;1(Dfi!PhTWS&(mf^1^5r&r4Z)zJ*AQ~LkDbif38>?()oohqpUhA$U+GUuYg5OX zWcyQ*ce9UQ1Yeo}QxmHCY+do2ocrs-T|Yap!rZr-ccoPSV!|u4w%@${@<sRV@Auk@ zkFVt3pXwLC+wYoNYM$x#o6cLS3(XNI_o)81lRB4w^~jC$&OPgQhgaV=@J{F5qtt}V zYXb%OjURs0?c8Jb_J5pbMda^9aNg=gJ#QK6e=Xt2?6HFrfBiRZVt%IjAq%#Z_r3Am z`*(hE@(G7deD4OmZ%_Db=l{OnzCkBnaPYI&{3CN~c&dI!9{pP{U(vL&?v{QZ&3WOk z{%JdU@whuTCQ=ig+WFPehO(N{8y>je%W);ekMeCT)n9bXn1jz)lz+kAo6nuQ_0ZR7 zXL&XyHR0f^YrZ`Ei)qJqd7<v7w^#gXFNLCxQWJ(AJz&q&y3G%?G`+EY<oUa=z}i%w z?_c%IL-)@-@BZ6I4u9f-w{v*zPxYHapO-(~yZf?#55MD_^oyoH!#h9RI7&?zH*oda zPu4zq_>p~&d9SMPY99W%SoPOFc-OU;XY}rKM#|D(X0_zMsLzrU{<F)kJNK&mw=zDy z`n|QKSKmjYOz0x%T=lnSUY=F4HT5rtp5OVbjN+Sl*GTmn-#_Z+KKGVY)bzV$(@~G# zU&V7us=qv`F>vJS3vRpWtDCR>>y3Y_(Pu+R=MUF*`OP1Gf8MCf4LA9^J$ue|`kp-c z{k#7(Zrm5OWz8q#Ha_&%8XlB*zpI>g!&6;~zN&k2b#D26J${>2FopI_68&9yL%h#D zIeAw>aO~O1S2nETUbO0~-dox7)R<BCoj-f@rW5;I#DkEZtKQ5Ta^IhlvJ0no^8fy? zS8l$Pcec2Jl$vn-ZC9;%>DPnLIqcvWbr*EKft#E6s(xI{@(un=x0KKLYVOoe26p3S z??E03|76-vZn@{Gq&M=XFRZ_*dHZ^9`K$hgFK-+E^HV-8nCHK!@w84qdy97yRR6WN z$BBpDk^kb2&+fnX<1Gh|<vtt_=A<SR9n$-+`MU}p>%8ikpLQ?Gd7bAxRDagLR}|#F zbad~;jkBjOZ1{)=J$|kF3yvu~scu(O-%Ce7@QX2ZUmQt$ss6OJmzVX~bmO+OURalX z@5pIGcpfT6(ocD4$&1@=IbrPa%|~6Fcyv#0##gBR&Iwgd=HC9*=TBcZeE8&xif5C) z>YMj{vL%?6y|DU_gq^4V^Pn>B(W?HgTkmgq<%w}0AF=r-)q&&3b5kPc5J~@t$2zTh z<%}C&eXwlJGedrH<3jG?tG?cQ@!wy3Vc58CUj`3a|F@jw^owp1{<XnBeemjCkGy&8 z=69ET{n44(<VW>0c6T{$&<)E%ONz5XzC}r;JU^%U&Fj7_E=gT?>)v}z!J2(bxyk&M z>d&4yc>X;v_CEHBkMG<xr9!UH&gw4dH{TZa4I94xPdzKnJ1L>(m_0l@p!$3Ld4D`A zc;5Q!&U@m@<KB9NzWym)tP1aD%ElL$2g~$^UC3KfQ|{$zI4n;z7MBMWj3};N?2R5S z4lSrDmOnfiX0kkF#L$sLPbm)7l@&7r$WI??96Im&rdU~1R#jgfh@PmpB3xNrGB@C) zjN_im->UTT=Su>i;_Aw>x?m_+5%w;q4AqxZc|+m)^2(rhZ1IA!VmF~sxSab1-#=q9 zMg9JXxtVjTliWJP3&oYYB|pL$NSOIq=toF7Chv3Qk)XOC^BnHIB&-pmbI$Y~tfH#2 znwx0fIXainbdn#ToE71!vU05ZM@TxRnaDnWGWN$kN3it#AH&!x$hzED`4KW-5v~rF zm(*7N2ua7(z4I3af6Q~lbdg0BV@KEg01X}E{K~mUWo!RC^gD)^^Q&ur%+gnc%LAqL zKS1A%Df7^>AADGgu?W3K{UcOKMOa4aAF>mMN0ioAR+axKc?~V*Hu(==s_ll>vS3X` z<y;2VdHPJtkC6FjTe`ycKSzx5$?WBaw?B90@%^*<%@yv{ymN-{;w!@CC3QbQNB-sv zItv#+W);NFKEGQP@M+5LT!UqGIKztXG0iEl6Or$bb<WK_Dz`^}hXg_kYnfz)D~49q zREhij4oNIv^~f!L^g8A{T;{a1Ah)CARb)K;k)|VhN%ceeZ+r1Zu9@kO`j24w(V8i# z4+rP5_amI6B0N_fhxpFjf=*c({892noksiX_c6E__wUTNeuM!a>|8$$C>-V;5Gbwn zP6U;;UfCbzJ<)rfD$t9<*$Fv2V>wFT96d6$thAtHL4fB{=7zjOM4zX63B)nyffI=! z-`kS+`b<|diPblelI7b{DtYAV5LPGO2#}*5a}uj)yy-`bMOI3dxBgY<G25cL?NOb) zug|g*F>0-pY{FLZm>gEY<Y=<Vvyw;t!kN|ax6M@IysUn0cg|}i&TA!)c^K(!O=Yc> zJZ3TLToNPMEU}Wu+!@uaj_R&rz3LrJd8?I@%{D7}OdhLEax~c#TFGO!BE7FM2C%jy zQnDFrC68Gb)ip<TiLCkT(inMGB0Vd4%tKM#BT?PHsBV8$SIFwn2b#(%D<zvdt>iIp zApJx0@|Kl6=0l{vtL`6G@|b@iu?$6?zqFEv)pC6w6J3gxJf;uQhZ^okD|yUuNFS;0 z1S@&WDM))&H_l2PGYRPv)n!?Unne0ob%j>)n3Gwxml7rGt8*fGj6B!p=+3c{$2=O< z{XVMuD60E3sw?j4#+_p&k69YkT^7|n9M!Fj>UKqSd!o9vtSf#&uDY5;ZUl>zY?7?x zF{dLPP+g{#JVtI!{abbUR`Qs0k-k)2iIqI23h67=)mq7879z=Qh-7n-l|1GOq^~tx zla)MX*x_zoMp?;YZer!N6LGtm9ac&<yR76fQ~NqclTD75JZ3qPywlXxY_U?Z*=i+^ z8GDp-G})YLC1N1)R;|Ra5;3ggF=<EhZoB6GP%C+i7m4?8DbWBc(dI~9RX5T~9&;K} zlIk+7<T2SuysJyxTq}9ZZ;x?ukZc~clE=If)x93o?Tza8MRj>R-z4vBbu~Y?QnFcP zC69R>i8p~c+nZMMm=BQTOIOL}?^g1d{Yc$acfd*>)Ad+c>6LKFR`Qr0Nb+T#WYgP9 z^s)g?4(Mf8@|cXMZgNz&GOD{is#`ReH%LgYtJ!3wWb?F@Jm%j>z4UBfTghWQ$LqVx z<e;0CJmzqu-Wu*GD|yTSB>8p_KFmrU{cxC^E!kX(P9%@ng(Tm0>uN@w;7G}4td%^b z8tHJ2ae<XQ=3=BHR2Q+5$21}F1~n;PZ6%NS8Irs`muzma61h6jJ;z`xF}fffMYyhJ z@JWu8Y)-P0$83t~o{s9OhVU+q##n2mWV6mn9`iAhyvd$yKC_aCPlOnGvm0Hal{}_9 zQa{!8w35dhfy5i%gge?wj6z6qwq&!`N*+^qvc3^co>y53pKT?N={w9hnrysQ@|dfT z29Qcuv(-wBM^^HfONTp0lg)A~QCB1MZF6GOT8R<XN*?n#lDw0cY@V=^$2^TRNOjL! z$zxtcl5b%qn>VcFG4CK9ue$fFL_Lpm&W8P2iP8BK-i0C@vjQtII$H_vjWk44`Ms4q z=1HWXs(Z#t9<v4MWYul8lE=J-G)#5xTFGNZjdsq4{aMLleje4Wit4h)@C6m(b~P)l zlx(iI5_Lb;IZEAI2@69Sp)m%Jb0jRxN|ZdRdpfGSb3CtoYmB{CN;dnf<S|1h@Q$43 zeuR}gW+Kuls!O*Lvmm6=s>`zy;~>%))tzG{W*$g#HY~zQjH{>eei}Obnw9WtR`QsC zAZ2QdPpsrIUm|6wE@7f0c}xnDys4UOQmy1MM<U7B8<Wj3R`Qq=kS3^ZsFgfs9MY+( zn`kAE$wHc_x~W#8FCd+!y4hCpm~y0a)y=aK^FO3Xs#|0w>>lZK)h)M@#~gN=Q}Sff z*Gl-<)A_mp;kueaD<zxRR`QrTkg_$Ed#uEmf+XL1WlXV>$812FqPi!o<T0C(CaZ3X zm9S2vX{vkIO4K;g8LIolO3b;Ca#Z)Fl{{wWBqyiI<^wBv%x6*EzoNR-bT?ctD|yV? z48Dy(ddy2Q9f^5~m9UbiZd+8hIg77_X^g%;N5bx{#Jo7FTOHN)n#_BS8e@)?l1;gl zxHgFDHb-?SQ}`mO#+YrTWK(P<kGT;kpQFj<Rx5eT-ADzhyVpt{^9WL*>K?a}$221q zscw^%u#&0H*^<p7D>3(;#`g{g*VQDQ;Yf_NR-%+q-Rh|B(j2~;sxdZODcNkX5_6hd zzL%iqJ=99fX^_rR-2f{wr$IVfbtA3BAF)F^M|G!J3BQXZXG=EETZx(5biOx;j+vX4 zn7LWWV~(A{ml-t1AS-#y2&8jWH`+=blaAz9ozF^m2BbNvE3}fwoP$)NI=_`XW_6yE zgJg5Rl|1I9sP2`h?q5;emr-4>nQq*}tVCZuldnc_j;?02m8erIF&CZf9Az$QC68Hy z6wnw4tdvY8J33n0O0;xTw+X32W2Bz#NXe#`l{{u9Ql*x%$VwhF2Wg(_%B|!vL8Q5= z3t7oyE<rk9b<3>eF)NVftL_>rc}&4M?s?C&lE*BH>MoAzei_x>5!G#u>b696H=WD< zf6jp&SP46@5`OYL=V-E-XC=lXq#BKp>USjSz)JY5sBTMCw{i~O@YNXGtdwlFTM2(! z!qYPx#h+TqV+J8zpt=*S<T0a>>Qp!0N*?1w3aKvJO4uJ#SapR~q7{%9tFGKi9#f07 zNOfT=F#|<fsJct7<S{Fe7O3ueD^V|{PKl@&E8zvoc$$cCc!6?9!V6f*V<sal(Nv~c z$z$%1hFcR2R~+E`)0)a^E73o!<T0mKI7gGsBr9R}ND+;(*-F^Gm54FdIZ6yGdCa~_ z`E;w)_<k!f5})sU*Nc(ZN**%>iBl8q3@dRqq?c5;+)5tPZ9X=sx*k^YnEpr)tL``} zapj6cCP**SO7t0|d8#Y2lE=(NB4dP`ZzYdeg2V~YEwvK!M5N8Cd(TQ9%+>k(hs>m{ z#Eb&z0u6VJmAFbk+Mzo66tzfrv#cy$*F7tT_h8d=easMM`SR1J`21&PXBFb?*`MOi zOwY?M<n7m3UCxX%efgQ`1#U>f_^0}^r%Wwm7Bn?Izre>^4l{Cce3^yWGo}|rbw2y1 zGD$~u`MxRH1%>(e8FVvpbA8hbVcuE!PI4y8H#xm1hxABS!esI8F0brL!pO6-GkyNa zGo}~X5-^5Or%ZY2nH0xN2JV5$>ABfCXE}S5v!@j0yP218Bp_)Er6zbsIGQO<JiQ=O z@})8v&>an5G(C%~PcF*IanB=_m7VENpFSl=vS4!4XGinHyT(y@`i%TscW3&HLdwBB zKwkux*N>5BWK$|fo>`Qh<u*Wm`k8*49iwtwn>o7n?dIy^+fMYc?I-(g5k-!zPuY*J zJJH3KQTJoYDf_WymHpUq>V8aFqsN`1YZ<jJV)o<fqaZh(29Q!Xfg}xVD*FuIjH1G5 zZ80xuqjyVb^+g#4nfcjyZk=n`sBX3sH@bh8-Ouyow~6JZ)v9NpZ5LLIUDC&TeEB)q z(|!KD83oyD(sBC2so9xlO!pNOsD5^|ml5BWLnoNU`}V#<w{J#uXF8oR-&Zgrr^u!o zmHm<>;=9NE+V|XKTstnvN!LyhU$@e?_}GBysD4{@t#w-vtuv=>TK8w0R{1RC);hCI z-9{&wjtwK3?x_A+b**)0tHU^SN*G(0{@fybU<M9N8)L@g$<zkvJNjs?;+|+H`sNUh zxxOmiKm8|v;ntlSSAC_VB|cNm$9)NZt-cVcw|PS2z30f=$KHWe<>z|sXFa_A2Zs84 zMLiVnZ@ed}&y&-N?^8F)Cm8Yzt;2MVJ70((IPKPY?7N<?gLql>{K@Gu{xpEseML($ z?HxQYbi9}M4{PQI%Dv&Bx4uRX2g)_?9i*erzH3z8Zmuiw)&&=aymfr(gc~jYZJe@T zReg0$+i0f1c9PgJsDtzWSM{A`(~`QCt%G!&)A6(>A71fRJ0E26mV~w4q<BNUUS2Ww z%B@2FjsZ1SRkc{lmyt1B+w>dKbx!@Q=~C5dLEeRx<>7gfa7K1vZaUW!l70vI{nm2- z=QyNF^9H^AePT|A9p>fFpg$L8`^2te`^3O`<?Z%k(&kpT{iA;4y)n_eR=?P-OX@GZ zyd0zI9~+9q`*VI(wYs2o`~T^DHrltH&<$qKhz-o1obU6E9qpfzb5`C|e?AicExX&- z#a3Kd`=Df!x=}f%wj`V!%9w#C!_j8Uz)$LoppBh{<l8>~g?mt2vZqqnP0Q8A)W!dl zX8U-OG6oP1d1*m!t-S1M?X;x){CXa7QV&3dshx{`i@TG@X7z2~@!o8{^;1{J%R1I} z^}{CP)frUQl&g0s_m<X&RZ|hHuaT5ueR^Da@>L_J19<yQ^p=!`<w0quLwLP2s>(@v zUb&agW2it{9mTH-@Q`(BphTW}jY%d}jV*SRTD$UTeo8`Rd;}^cB}eg%X>?Fenoc?I zQ@2gXYQ7;Q_gzQ*V8?i#ZD&}i;AMIlLpmzA^Zm@2d^(Du-%wP^W_&u1FAw3{<dXxo zB?dd5@p!Le6!Jx^khhwrRod5oj8D=cJ5RBB#YpsfP2OOg>kb@43y}t2ODe_uf)$Pt zF@z43VW|9g3L00=`1GAI_gm6;=S4G0t15Z3(qxDE&IcEl8T`q0se|}=RQxp-PYcvn zmDHJYYJ#|buYO<5OXE<2s=&Fi`Hzm39h8Lg*m+p&bxr*BTkJJNn>lyu+^@sAU}gCt zYV9P+oOjrwfmO4qJDsC&T^Dm{6xGF!sl$hjmKz6V?ATMrNqr3G_rtwv;XV?=>Kad2 z@yB0-HCQn<SMEh}=1PbaTASX1A??#fo&_G_JgqcDzmrIwsB*Cf!$N}oK=d1Vu{zOr z;wL(H`(O9t)BC>roykaSe&YAz(~r+@{PFnx?;HMyjvt?1{QkG)KR*2b-*0O_|F73a zy#2@T$Coeuc>I36J;m?Gr}u5g<HP^o-v74p{xA8H`Tcj=5;}EGJg7_8q=Rj2Pjbp3 z-MW8sQr~u5V}AY3@txyR^#8DZ-T4xZ$}fKVI?}v-@BRZ{9TtD!zuZrtQU^!Fip5AR zx7}8=dlJ7@ZPowNUMivI@atl{{Ld{3q+$HeO$?+-{Ljq}BrXN@@7;FM(A*wDSIht0 zctMKrzpSuyF)R6BCJ9|MSKMAgTEqXdRBGn`B9%7tzg*9BG28iHtfGrPuO^GOUDVxh z;|fWh;K@_Ti^R<_bn@f@x8jf{A#uwNN$!c}s5A%Z43%n;rl}M`%2sJ5lB`veKcp!t ztwEZsQZo_@HXPlIl%>*kq)e6eB4wx~jghWWD$*pCyhx|3Gz{r9l_nugR7w7JH#hi6 zc@EM9m1>d3s}w<!=@0dXG*+cmNMlr5gCujLE~XiY2QDOkNTXERjx<uGy+}L|!cqAg zugs*VKcrzQd67<5X&BN_l_nv{>J;^dB(_BUkYu5P_C-2Dr3ljTDy>8kyQKb*2C1|L z={S{|kp`-?8EJq@+mVh{X)jWLmE^7Uek!FRc~$Zv9i!4Pq@z`ugmjcjc}RU#nuBzt zO7g9hBUFkY9j?+!B<XYH52=qzYmj=Y)QohfN}G{-sk9xbr%HQ~dZ;9yQBG4S6)9CE zFOv8h><_7%N~5Uizp6AA=}nbRMS4r6Nl4pO%0iO6R$b(8hv{9gE+z-*5IvfQB>ka_ z{G~AcLUkAUTVdSG5nU}36KbU8ND)otCZrEk_j9CoR9b`7Ri%fK_{VQ82x<)emX+R> z>>_`?O7CcPF-1*#8ulc$`1U`~*5W%LX!0dB`VKVZ9%xEyEZX1XOKJ3_H0ADZy5=ep zY~skYQH@hmn~DxJ`Sv$0Ux~7DTCb7KO*_y1)AOV^Gd`J?bg5-Sgq94cN24L-OwUXB zhCO}PirDDe(dgUN=-boi+uP{d*XY|XxrpXvW-l_+;@c$&wD|UEIvk&x+L*hysc7GX zqP?NqCf~l!zP&F>B2Bq_n#g?Ovn1P;n=&DHM}5zxqCI4}`(rtq6B{-pH0JKwePmNn z%7mgFp`<1~?e2q#rib?JzOTu*D<-3oLpIH?*XDQof0JeEuPMnnU5jr=Z0@PRj8qES zl)G<2uH?RGU+1E|FMil4*`xsbn|f_%EZR;!Ciu3Kdo5A-$FiPHY-mp4)VrrO<?fo0 zyPez@?P)C9OYVJp^bonXH6^V`<;+YC9Yy81Y3_35?vE92NNm`c&{(uXa+$lUk$TwC zrqKV{K4zAyfgEUBE~YV4+ooYtqL{`qv5P!T=xWL2ffm(D9gJ+Qe@*gs&86(*(<*s3 zauV8>rJ|K><Vysjm6tDPXC@7r9}VU^(4v1yK!ZI)u%e`<j9zhPOlrwc+v9X^HRUEX z%{(mbTuCkIIy`ftx3IOQsouD=B(+TP+Ecux<&u)dorQ9VRyHYD!^Evfi5DL-Pc$~e zi6ft>f3IOv(u6&#a4T8sH`UrxtJya!N#aj4e{eP4QgXF?`6N1-*m+V@Cr-XMrc#qy zaQS-Tw<%%6;}O{lPi!jMOHqj``?0~BmWifaBC6$pZ5gVnkobFJnuV$=)Bsc!4nst- zxczEz`=xe^_D`5OH8c&~hV6-3-FXcccS=mCKP6Vxl+`IE?)3XNypyQ4pVyM5UwW5@ ze{T2fj*b@D8`JKzNS@~7nP@(=?Z@IYcK5*Iw6pEU>>D-?Xe`<%iRA8|Fm+TY16{lN z+ZS7Z`y302E%v?`3)%fETX4--R%5Q5uxP(_AspqthUNie!mWx)oRGbwxcu*Hk=z^X z;cdxJ#$j=lv9Be=F-dH8_ph`X$F^^Zv6_Z!wOMiJppLTaN!+&5I-2(_byWL9)R9)s zy!JWL?m)5WM{1h~T|Ws!wEcrNN@9dT(}<t2=G7y{ybd&Mz}4f;@KO6GEL%y)&>1>N z#Z}IM7DhYj_a*Arcc5Vr_Sa9s%}i+*Fg?YFd~5d&lI!Ji{&pFUh*mc8{#wJP)YvYp z{Wpd2NCpS8?Ldc7>BHfLS{aFrICJq&45j-R9wjj`Rm#LLBp$k9W1^bsfeF6-OUUlN zrZjS!5>q?-T8p*&Nli6{oTjwx7*2Vp;)YErvDuVt=|+B+?pe<1XPvp?iADT{kH=*; zrvB$s#tiM%I^yre%QT69-(yFuCSR{cU$3Uz!y0oBYbr`@EaD*;vJuT8<8{N5{U&_S z2QtrS@jWlC(BhLxG}yxbK>oC*S&_SA=8B@{Dc>GUKgo4Y42AobF4@0^5cT~WAKEG2 zhrU$*-Ul@#zdPBUtC$_!R8#JbMjeA%e4FG<t_x;--_evYiqq_9nmH_AEzlZV3a)x< zYd8roi7f4CntJNYw&7l?-%6FV7%2%;iI((4IR$m!l96;Rl7=Q`OjT@ZSh9(y<C=0e zH7v&d@|ub^HC&it!c&@jo0_JkbpK;o!xy>X6JqwN!+m4+GQ-_s_R8wJ%lJGsso@#M z)|AF+N#A(Nk$OtbbixV-OD7G?WRGhmjPfas>Ah_29nCCuw?|8&!(@!ZPi$?^{gl_K zKpdSIM_#H{gS;7F<TU5=SRTJrX;53chv|8|_B@YD3PmYR8Qw-;b48199S=jb_}22c zk{D5Lvugq=+FXM<S?BbVnu?k$8asVsNspkUP3b8O%?I85xXg|J`7e!-(P?*|CSP;+ z_2$LxH$Tq!*?Qm`lN#V8wPAag%4RQD7zYhn!CxkNd^)d4XsV4FiMuHriB9db;q5M* zr*T^1H>O7AZ0f##X3B<lx)7%^FU1Lo(eENRhB-i^&#{kW%%TFPP|@gH_um9sOI0;2 zPBHaE$O36MO-*c^mePHF(b~&i3LoBmy-xyk|4n+z&5uuY3*MMP0N=XHn#0F+U!S}7 zvS-3a6JediezyB>Fva!tYnwLQ{LinXR2fOTQ{+f)Gv2Z>PiKQu$2R6Z?6k7>j$t!t zYMF7mCPh>4ZConTJ-7ceA;HDBEW1<6%huwPPOY<rH9A{ZBj!}JX2Q&2-5VM>(&Sq+ zznNCp+jNbj)0DfWss7=ntS*U-iO;%S^cb}BpBd0p!~sttJ$g;MZn{N0fnJc1cm;`8 zG-kcXM8u6p=g#pYPMA8N9z)y9@kY(!2Lb$Gi|>BPV~cOK;3?ldwp+Jpw)>q{D%#<e zou*vfu;hNz{nE?m3=K<GBVB~l<hx%6p6-{)Q=m<`tHld+zf2zQZ7RB7JVEzM<w@!$ zVlR@NDeSCZuH00#8hfB{dt76YoHj1Ilsrl8)*rWmsd7{9{my6>?QV2y+F-d2g%8fs zQ|)b9Cb~x7s;1mk>U1i@xDv#qhJR&uzib%?n~K=YNNCs}3X=-*%!Gz73hK|-U{gCa z{40oF!*pucKchaMFbx|zH|DOgb+Ia17ueV^N9kMT`hld&n(L2ol+wCVj+pTEiBvQ$ zg^BOV7T@(86u)qj{(lRX+K=YmgTeOX5Z@WBmqVQ;z%2<p=eVM1C5}gv-X#$km~mOV zr%P&=U92q{kv}&=_)EJ=tjp!;$Q3K(5GEWS5%<(^;Q%9k7f(A_yj4PDMlo}Z-D&tT zw>c8|17UK(^5?u2vWVc!?q{FvKX2)#<?P0cxlLc=Ty>K_<c0&(ZAXm!JaVeluSC|t zn|;ZlEAt>s9Uo6OF74MNO$9fq?Vm<<hjw>-Z`d=yUQcXm^mTlR8avRt<GYN?^G@}O zK}5SY)0MpqOLoYhUQG#Fe0wCj4NFpa6S&DoeQ(>{wZ*qhl+t;Nwl&TiK>b&=OiKCs zC#p$lyk@MIqfBMkU%Fv1J8oSjIYZRmJZ+1%Gl3oUv?Dn!J)q%2FTEr|FNgMWk=AsL zUJ=QKvg|f2?wb_uC4D->E2o|5t!SE*SkdV2IiZ^JM|GY#33*&zVmPy5qU5{N#e<v( zu|XI&Nj0&Ze|g>sRKfM>Bw3%-6AozLZ-!l3AwEyf+;HJ2vyjok$=4*){qkv!KkU9f zBb6XBG@Q863ETa#X^9gyg#B(_jwi)7!SbARx<58EvEAh5Stl_$6$4Ysi7(pRHO^#` zAT?3Z60!NzjFB*tY(4*kjp1DPoL(DWroBWWsibxVf7wZz5YBLwE(u93w=A<~(Bewb zoYZ<ucro@2TB;sm0YoAnDNd8yew)I)`eo<rgs5nm*`tC{)0U=9T}$q|5t1Z&O?Wyy zr?m`Pu3k>V5o%_)cGdN=b9R!gXqwuqqH&s=&_B1@!Zc=h+MkqDF;SOV>(#ln)w<AX zdG6V5tF;DeZM81#vSC}Thf`0zI=8kO^NPJqod(KMWB3R+?e=R38meJ?LU^)dJFVdz zZ~ZZNsWvsrg5C~hSLTDq_;2@7vI-OH@8s~~au`qR_Aa?n>9A+bHVe*P!H8!MJIez9 zr?hi{ud2H8|IUMW#b|<!iY;o?XlX&cc@UBYYZ8c!lxTRw+SVF@1PStz+#on&!3&nl zHKVrL@vlyYc4$j2onlKBr)WV_Kug<bGt<;Ef1{;s;?3A}8f$dYGT*iKIp>~p0@nHe z@8<*g-QRw#z4mMEwf8w!hTz;AFb6&QhIz}F$h`$gi~`y^QM*6~a%O6UlirTeYZfFM zZ#bAe!K6-?@D65?V`8hZ$#4?p$2Sb|tR$(%$(-S?C#>eV32}tU4$>=)3JsB3HfX=a zNJ&+Ql4=XbCKA%OxMIc(9jYaJlFDv7Ic8#ycNGQZbea9-bFw*I-$G*KR>8_uh8dat zmfE=KjS`D2#pWjFx*IgSrs)syeg0Fn3TzMK8%9m+3fVu3?`PDTK4H?n3u{Sxo2gvf za6ZAk0(8GRht1!HJx`0r+uQjamRjkya#Et9OHFi{=`l9h-R{dFaNtfVFG~PZa%a;% z7GG%rvHdZ4U7;o>>JG;@?2{FvL8rZ3_1em@3DFN9lpK1cC~r%6#D43xfBGe&EGhhT zHlFbf{U%mMt4(R>W|BIb)znSfdmB&IsAI{7?kskI4eY?(d?dSMQ*WXPqp-KC?#Kof zhQnD6y;wn2O-DP<gjG|t*C{OZaI&GNs^Q3n4{H%UdCy|*jE|kGsrbf*?ey4b$+{j* z)suS3M$fzVaSGBtJZ@k<LdQ4snvPFx+Q3SgVb*xMt0str^`+MnO?x`)_R)@qsmmVi z#3xf=u1%9@>Q2_}!KIxlPc|Hx($Jd_<5>pe;jFq|&B>iep*8lADdI~<8;+_~s{`Nv z>+$1Wb=0v;20b*1r<wS>7sqhlNxo_#elRv8+0;|j)O%N15<gmgqqR|G?Db5sWuwx$ z$8mvm6;utY80=-V17xN?!RS)g*pOz~v#p_TD_y@wx!(AOzVRKWqJ234NuABt)Ag(D z<*Zdf^#_js1(|hHz&G7=n1Z|9QO%&&PHPAKzA;0$`KEZ+9N!p_V>SKw$L>C#J!Z%5 z;zcrU-H(o!SqztbPs?GDH(dH8Cr7_(3FRjn3e-b8(Yo*B>k19FHdEEyLagv=vBLY7 zow8KY`AnT$?Bf-5jAU(5oOi0kZX`u~JxS+_LHfoi3GC3iNPPb(+RKm8583LS$sDKM zkdB`lAHao#g)ZK$WAp|o&^56c8|b-LMq?L4c;H9;$Drjr;x)D-TW$YJ-YpiINO$T9 zq>Isodv_!Bz}=D<caXfyLUM5&<IX`tC;edQj%tb0=PSP7DZb7rnKK5Kj;4N*Vyl+B zO>`sqsu*NV-hI@gf71c+54sZzJ1w^=?_gMa16`*N@xpd%w_>OqiSNfUJ;Iz&C0)z3 zGj;Z%oPO(XglFU(VJ_9~s@n!P=YJA^$R4T6vV4C%tX30uZzMaXLNTIRL2V05kej1V z)&_|tZGv4qD68f?W_~<9f)CXc(ff`Me1tg5@~rNgBA)WL?9baGlZ&;T9it3IZF)`? zL^m2$b)|oeiFw(0otBeZB~B8n(WxY>j>ws)t#{<0%hlB5*wD&~{*$%YGMUql`&^yl z=NnAUE=<%kI+gysTH}Ms%=lsA4JI;V{nTMK&?1F9mGDi@Qi-Y3&nO;SCA;GyTTkW^ z1+I8>vhPvXf%BvUwp*-i)^tMLfC1pE?;o)kw7%s1fYz5PxEb2|vIWQvsU)pnFG@}* zisw{yv_>wGP?Y?TVu^zBD6NXEj^9Vok7~webxSEVg=*1i6JSt|7n4((gH-G{WjwyX z>^7JfKX9JZ$@MLz*Emt*o6;BFr)v25WnGsCPq5=!Rv6Z)ETOuD$ygUNY~ahJcYB5$ zZ>Wn;y1S!Z%scH)nNG*h?T;P>F>;U5dUU5kPCmTW5Tb}MN#&}}H%u<2JVz0kRuKhK zgA*&_zta6F^F8|06H<|%YTWnNpT0`mztNu(wfUir5bjQi+JaDwaBoV~PNb^wz0pEE zjd@#g#+I7zs@dy*ci&TO6;#j8_5t~_B!PQWS3v&nV%o~Z;nlTdTm~U^U3pJ6?BDXj zUFYXL)wDnUdPXdwf!JnC@a-*mX<$jBVSnmpgdUE+n{^kf@V*GzN}WNv!+R0P`~t_p zJ|gdvn6^3dp4ut}OO{nHe*P?JF6r$mP2N*=`>VQRRZ{Lt9BWDQFG*;8cPH~9+xU4; zX<Y)NKf)5;o62*N9oi_xu)C(SOo+e8!QfybUn~Ocn%He)SNeF@EZ;&;&(V*6o$np9 z&bKdbU1{uj{@C+Z&S?Hf9^O3z_Pe8rdPEsb`;;SzOqS+D)uK5D%P>wQ4v1x>5HHtl zLPkm?QNtoWJVxx`QBv}_=v_X;V`O!$5$FCvf#cs94BnK;XMA}>j={xk3EdTOLYd6u zE`{tPI#zXZdMy6i0(TfP`UzsQm6`f18%e1t!K2iT3d-RWD;71%Pd4Ny8zWT{?)(r2 z8Aav0qno1e5@`k><YXvWi@n00AU{zP;ec3j%4Hg6CwBr36!_ZBt^d&9s{h#b5@ERz z;GAD!4&lC*liyLySUiXqpn?OhkDDU5S%k`ZN$xE)jjG8on))TvDm5>C`R&^fbGS42 zezoL=;vW+`jBRm5Zo*IxNz2N_-k|Dm$JwH7X>n(g6IW+u>SE%@`?FCA8`-Lc;dTs( zT-H{O^g0)88kK7rUzaGsV??ik)!zJ@_e<=)P<Dj1lr-pUl#quN|E1SO8I2SeN!DZs zx@#u}qMWx#w3GBxXScq}>pDn0f_a6+a_59falCGiGl#001~*JWZ#ckW99fDo=xFI# zpC%cW6K?ucBr!hqL(!FQWMIFKN_TfQ?I-9Qg}%<wd5vrd_2c)UTASTdpB>MU>rZeJ zi{Cq<CU%bQYBN*IL=jy7nHyOnHnua6Q}gKz9M`5#Y29ujH5DB&LP*C|he$gUd4$d( zJ9Fvh9V5xyCla~$r+%VM6PY5HY8d^Io80RjC!22=UiMai9vX8CDH31L4Ukhx_YZu9 zI@=N=^h&pjH;vFC<@&{_%EWCg#26KsKIh0Zn#_Jc8lYj=ZW=D64YNe};cXMP=KCr$ z>|A*IH!@&Aki4of(k_0OtcH<oO}Seqc#%{0S@xj#J|z#C0*AcH(G1qV5OyzoRoboe z$2vs!2~O)fzM;Ux#xq-}l-zmQ!t^aI1X;&HDZ@AIfoKz>piq4OUGAvEWErtJGLOj> zsD>e}kDZY|i-F2$<z!+m0lJHy(oulSdC%5okTWaah;*w|R3bi^d0-?<<DD9R?Ua9& zfM2|x_vDLt&n_6(b((nU@}7(wcqeP?g44TFUv?J<ISU_@MM{T!mTUw2$*roXKQAt? zG}6+jM&4$5J(J9cgF5d>8aq94s5NK{*ODxc1kOr)aX0hI3);dA=}1*=c1MwXn;Q|! z3{|>o4Fk^Zy~hn)B?UJOa<6PH9b+ibv{zQpy;f6Pb8<WF-bBGx=`frvAHbTAaJFo# zqGx$EqECAv4woC!iY7k_mG|U?1Mg<#Jv-~HF8TJXPhS^5CuakL2dV1wDcmQ7%AS?s zC!9Y!uI#P-fUT@;ianxnk#mpA*|bOJa8c~Qx7Bwcb<UC*g)W-C<`Sy}nX%_&X6Tl| zor+yWWTq<P8-`_i(mLumI+VRtvv)N}kQ{aDSBVxml>LC!(+PYEEQqB)bxQF&7esRT zbg_07Dq`c=y1L!(OORPg$H#lzcl3HQ0_9fKXXpL>7sySg6K73%iF59uPL4oz;_s(C zPDW7-3*IrhT2)<t$7$qJO|sOrDHbW|1b5QjgY?L|*qZc{(E4$#Lvawz4b2my#k;|v zMoWfvflTSJ+9zZQ=So57<SX7a$u~>i@9M#Cd->;Rtv_S-WcOtl^enG3=w<E`XP(|Q z8KxB@u?YX?$4*O~>1Zi+jtkB>RF^M~qqO?SB>qmcL)@nJcypZ`Z-V7`^M(#m%I}!@ z62$joBe`pm^m}`0Qw9qCUMGf;yeA7}ew4g@qcetSJDT@h%p;AO_vHO#Y_eX&b(`9& zQyKcxm4Lsa{@L=q>^WTt(&~sTK_Av5$b2KSo9bi8(Z{e9Df+M=tq=Xq7J*69k^G&@ zxK7d}b4Q{nA|XuXwodO$Uz#BatiDLkB7S0Z4WC3^=W!9?MEYW@F`9ZZs4(s-jBI(i z<5cc2jEV~s&@lS;uQ&o=M>81Ir8mA#Vjp|=C|$$2)80c%)-RCBBUyU`%TVWnh|a0W z`Wxorm`&d})iF`SafTYYS80L;^pdQa8(7!qrE1&I6I`<xpWJ9xQ~tqBX+*Lk3d0t| z7>nQrM(PQMlHVFm?+5;dJ-lhKj8VsRt|QEmPdCsH953ZprBB#ZcS|>6@>P2k3t&Wy zHtCbe2|BBH<Q>vDxarJ*yed<I>>=wzJu>%hk^dVzJCE|mt)VU=a$L@pq)DO>&!=W@ zD9d#&vD()7Ge1BHav){ncXkf@GDKw~^E$T(WjBby^70cZWBeJd4f~b0_%p|do7Zu3 z@*xo{Sv!@nndlTvBp;Ih<8RDNSfJ{;?Dq2H7UA=r)J5QU5jTBgj^U#4q(TrArkH}0 zWNzSQR0Ee@Cq=-Wn!jswWG7XSF)i4fULH1eNvrs##^iB#Un<pejaiXe%94-#w!P7Z zO_SPImUaHmaz7baS(z?Q|1}<za2W~q!+g7GP)shl?>CFZ;%RyQ;{+W<!lWplGn*wJ zXLkQGdj^SKTss4&b>5Z-sNPadfw|*z>PXl>X-56{2gKD|%Yp1Qxe2*cVZYSpCWq~T zWamS3D0kj*y-Oi?7VQ~A=N6%D7r+zj%RV=;MI?=DUBs`wPRvE;C?9iN%9La1z`1LL z!@XbIe7qBDE4s$_y0a&`%4rki{iynkMD0}f3;w!cw`+=wbH|8oYjlF_$B6z68cd7s z>gJ5#Q7zY4e{HMfyLQlz2e$7I$Rr+EJo3^E19H`9*;!7({<gxXme)I;`0(K-`o12L z^>6~fnO6M3DT#(2PHC*M#|cJ{TKo3YriX(cw*GyLUTI3NLxfx9brI-4q!-xM>m*sH zCX-_dPq+fPGDHbvryhD5&uxq`+PY7&+$LG-QAfn<9YGf-bA-QxWTrkNqTa3UVKz{G zGN<<kUFea{y5UB=qH^RQ@zNsHi6RiVk2;^A7bdl+v9rKU{%Jr4pKlsqADay$AHScc zkG|ycJw7abY@^2J*_}llOAHU#^9li-CDy73%N^<7c#jXB#6Kc?LA{9V?A&}iL-vT6 zONFts*{{>^@sU$G>um6LhAi^Paoh&dX7mc#RjN;9SgrbrG-3MT3@mn>O~+*;Fubi{ zbSs7%t0wjl7kRQXVq)4oOQi_4+vzOXa^ou)IhYCQZL>%0)&b)kr1EiN5-9R@AfI#7 zKgG_~vKMt=w|V#fS>|MeDo@vptmTphBG(>|j}*$f2cCO8{_d$AY;K3+{cP(+JM{F_ z&xu&oG_n>i7m@0Z$KSa~?4{xO8`w*1J*2+6F*~6PN9|jz$PsA{)FyvImRxq}{?w=G z#G9Uz^DX~y5FeI0=_Cq=z1&&nRyaPZkt&XeSVy_pIx<C}K46iXwMnj~r#P0DCoVJ~ z^oR-ar0)~R9W1|t5UXXBndHPb1w?YkKAp^dzE>~VItvFw*nK9&b3U>B-@OqbDZ{%h zM}<aY7m>I58A50!{8jeRkgS?U*)PjA4K^}I;~S1<#3t~6W^6J4XT>@O?vWG?Tq2Pf zBYo2Y>QMUHzFtMUf;Ef&fuHXZdr?Ikp}`B3wYlop8aMD|jyF=5TMxb8%|3*WHg&f0 zSaSW8&4ohxiSPppNyIeiHJInzb?etrA&Ql$CGG5Y&Qw^UE|TPR5%>5ppdGP-Q0DA8 zRrU3GTeedyO#F^|(=o+*>ztd_>H2Ue7fIAMI`v_|m{gTS6@zVVqjaZaeLb6bHLz;y z8|6gLQ${dxg2Xodf!DY*7Rj33h>OYISMeT!Q6q6~z4Z(w8tWNg+AYN$>U2x4VvkPI zvsNdcZPG2}=@?G8M%|vNLkt<`*oS?x8XMWiNDDKnGFiwhqC3>!yHvJTd}j<xEl*B4 zGh%1(e`f3&{?CeiHnj>fn!AQ*4Z}8HF3C84Bzl6XBp)rLZ!_BFbToG_OQO>g#<cj! zdV;%z`kI;9uvq%1sQ-bD2x41c4h3_Y%UvKjwRCSZ7ErFX)f`u)bC$VR#J#Q|*8(PJ z-{4Lb)^(9Crpr#Vt9zh$nZZz!43tFU<bfX`f}3CZ6vF0*h%(@K0AT8X*u8Fb(gRlF zt+kPK#$C;QSWTke8s*-!SjrI+>rGpPV~&o$yF%{Gim3Xnfp}>v`cf;LPTPx#r=se& znH`RWT}XboAI7ev@vh0iwG-v(=a_Ge9OGX&;r=f)3(Fc5k){y$-T!hs9r7|<*1^i= z?5A}*t)ogc_I?}?!3{NQhE(u>x1)al4hX$OPB*}<KbR7C#M`}WtJ7O)UB4#kG=HLp zar512pQo6(;iT&GrbW-J<0M3;J+#}&)PshTcguvp7|G{?Kgjwm$xOcJU5jCN&SjgO zpU`D3&K)YU`L!*D2TF;ni$}g)_E=kVs!H1(((Bw2XLq2ZB7k=;hwo<C4X2!u1THSh z$V}aVLUbXP$!&rw3fYawVF2fTJb7Fzot|ErpVXNyOJ&Dn!SqGae0O#qrM{ekxWzE= z2c1IB@>gHBS@%ngQ2m&0AMcvz>-C;bZSVwrUfb(NxzD%bX?fD!S)iTApxkG+cyNv` z%4V*Y<5P_6L_;?hX54E@N4$B!GY(`P;CbZG4J0v<tVwpJSWR*m0u{J{G)yD+2KH-p zT>~@Fm=uiHtT1oOe<S9yan4MZK0c?<ob+x;*Y`;?@D>xj7#9pS_ijjU_-=@Oux8xA z3&hpc9BEE)H>5jJ6XkYbvaUN>ALU^lFqWxdKC0_JR2`*VD5-bTdQ9>OdW%o4Pnm&s za+R|Oxnm<K<xv=%_eb0wL#HC=3Vrx%+(4bkOCj8rDI~W<#z3h^<=g=a-1O<FOb)9? z$WC%Dqmtdp+KNVZdztU-j77WLqxmc9Oym#zhSvkQ`K2v8X*^Cmdzq*a+G>8&Ygge$ zg5-|LcSz+lM|F%7TdF?kxGW=djUt{@ktdH6lCyIkEFfv#mH{Wvda?Pvsxz1L9;%)w z1#+PGYG{+z8{AnjD%^%Dl!7pvddKX^II9%31ygd!Bfen0mD;6ORbIvK>$Zv9igRwH z9&vYZm^{6S+KEn^JV9($8i_||rUJc59>DDvvDMxa?Y>xTwY!D5%bZ8;0@}^n@)NO~ zv}yaQ-76>@h-(wNnK1_UknO<7rO4o(HB>2|IwnY&a)*n|?WUFI5ZoNKCX*0u(>hw# zUN5yuc;!^eXz1lR2$Og37b#UMHtE2~IO#CgOp3pDfpeV2_lp;7njEWkJr6u0sXCB| zb0-D-Ci;jZJU%eH{p<GJC#k4(m&Qp4-W?~PUP^F|t4MI#tOs!R^d@IdI`Gaok$Tp) z$wZ4IcHX_}9I_KoO<7fKv}1NB_lKSS&H&;;&G>WG%&B&SoqT-#HX`+8m_+0It99ft zrukZ?&ysa#)$l|(8+c)8Z;epKeqQCBnBcKT3n$s}f2dYF@4!z*d)`pU+ibPjE#l0s zuBxAbxXb`5oji3-?la>1<#{v&pD|Cy?-92@+38@G)Ah<-aV5S=GeeVCyW-ALaf9-q zgKCwJa;n{0RHrWV8qMqHEb5GSI{@`<2Q-_0lc<@O(12IbGU71e>**V%mO3Z>6E6&b z(>Z|sr4-1OQhm~{J8L%2xc8*E>mzfLkLH;`l{2#GHAA)XHp|^9aT+~^gRG&qvL>?T zT3asVZ0xww?Q8`&d*t%LQfT|^6#G@VdQYO{giS9>Y?PnKM?apwYhaYgS6Zuf(o0-R zIx2DbRujqlZtWy8%&OtmIVa<TlBpb5rO#KZ>W=b00-W@E45|JKJ;Rml&S>6~cT0+_ z!<e{Rnfc}28Is@}Ii!3o120GV{_@a4vi>@SalH?_Ko-%wr#9VFP2IoS9e<sBx|j+Y z$XTas(;WvhS#Yv@@d2#ft*D;U%cE-gMtNLG#NyioM-CQ1L=`o>j#SltrO}N;k0V9w z3oBStH@zUSQ8qog4yAd|{4kuwC>3=!Mh5oc9axs5dZ%D-N)eZ*99P-K+6a1&=}h(( z1FOjBeNSh#QtHX4vmUuwDcY1;Xb+P0>2#l{X@ibcEpLlR@P18zgDl?fVFFNg4Re5u z4Jo>#-tD72?iZZNMb})a>6Rhhn4kCExdro<R-Y@UW;A&Hcu$vfN`HOq5<z{g6hX4A z>O=LpR9pk^)1>(`asNhraznaKx3iV)3=K!$TPGJ%Fs_w;6lzyK(TBa<h)$fP$GhUi zzEA3g*(X(IPuL^RMajs4o?RgHkLu5So0qW2cg|4cdjZ;&XjO;r!ifMQukhK!sR~aQ z5Szz}iNG=59?e-JkW#`5s$L?A7IJo?Znqr7Kuhx7MBrK?Pxeao2vh51oi9&k^->31 zm{KYS-;yN1>N#@KOwUd<?2?DwC6pC+mqh1j+$D**_(MfrOk@emtvbBH%{0-p)0Gzw z<xVT_PULkX*sRY;%S+BXTzSt(H0`kR?m%9&rk#y`(J}RJb+#T9#*=V78r~@S62q*L zY4$bg|ExK(7||2!3+CFMsG1n>t~>fbIae|FSq(+14(DzDrlgcSo4C?BR|Xxc@$rrt zUAL-nZXS4pmE4*A{fl|`X`3I|Txg4(Elb0J0haXc#O7_n;-+MBYRpzUKxU~iNmb&W z<m_xU1vH&d&Y<V)3$=`$x@0Y2*bogfS9ZiFnY&)m>{YKse~-EANg@u&Hp1&QvQ5c* zYTG^4GKU}F5eqrvZ|X^~rlfoMcW3iB)ZR@S_R8tlT0(;N*75Xq=`(gW;)GT0?nS$W zojj!?7wu$0C}g*Qfg7+2dJ;9(AeH-qvTR2X%+m>9R3~y1M$J1e_Kw*j%F``3`gVz& zE6}m@<M)kpjoCBWd#~2J>-cv={%Us7a-yx*;KW1BE||wu>$5kEiyuDD+ZBA&UG|Pr zD${xWmvjFPFNhT2_kW*Du5o@3ESB$F?rIQU5l8#t>%Nje=S@Yjv^bNJ>kenBM4b9; zpObP#bTcBgMY@p7+pU`Z)%|e`+vCTcK9|_u_Si{F5ku;bk{6w*5cd*`3tY~#MZCsD z3h|yc>5*@&>4$3B$+_pBb^Y$ZBRh5T<!zSJDsIBt=l<{3M91X0|JZtVAFiM5I(Y+# z_idHD0mS=ujd;|&Z*2@z^{>TWz={~+tq;Dy>%`#jqOOW@sqHb5PIROoS@&3?u6wC) zoMXA`l`Cv)7LSdw`_1U6A{%)h0gqia@H!M4h?ACDaoKs_7Rj|&@ioR@l&gO{r|YQb z|0#D&9xictnO{pq(%)9bILwhSjwfyIV-=0;R>{aNl~CDTU0{h_;!}*|?gqu*mE84P zqT#Uf2)p;EPc$WlWFPhu56bauTK0ykI0ig4Ys+p4OE&by@9aEmVv~uJob}LQw*z3; z_a$a^?zZ&qWW&+U1sP;<H1$1>HB83^PQT)TI4=nc91EIWT0Cl>h(FrsbJ?>F4(a}N zL?5~z8ThdXAf16X@$5WQ*Czsngw5;x2aVL1oU`R{qG5+4jvln^Fx)2O>BS-5HBmKp zqFl_|dC(NfODg1LM67W~+1>0wgq?0r;qau-#JD%xm(@{vsBSxXYl+)cJ=>FY+cBFr zaMy2Vmh+m4LJs2Uc4pOWKWHvX{ksMnCGUajnT{ye9`lWz)8bt%z9~(%_ww=IB|A(8 z?tO{fKFm?*EwQETradNa-Ea3^jSx8hlDoS45<}ex=xJEm+sBf~Br{px@4_`m?h^2I z>f66^2?pmVwhyxq4{8&ksC54cPR?|`d5`;jGRJTXttW5tHXL>hyaZ1tohE#$L*m2Z zvRHf_rx`rAP2=a<jZQxA7IR<gf@fA5oNMKb;eLj+J`v5Xr|`hLIXaQ$N+CKG$)&kt z8L>$zw!R#{@xGkG10y+=b%XNE^^mBS&7>T$ut6WrYMffx<O`7~Y!5kH;rR9xI$bJ1 zb%rc#o?#gY-v6`n|19xG1|FD{`)^LQ*(td<XXO&v9G!t39XJn%@RA^XnzBG|Aj+99 z>uyzTzC2Dltd6)+EOt5Z>0oXm?G9w*g;Xe|E?*CG^F6h~$o_gwMb^;MrxLAm!{I-D z9oy*NWmt{pxfLue4*A#*4ly6dc0{i!cz#K`#eQy+@+6EtXesw=Pq}>>R@CvLhsaJw z;=$@OGg23k&B2;8v$*owG<2}`OnqaJ1aSb(3o&Z)jcor8)z-Ji+7@w}trsOGYFfD8 zc9cGmXk3a+FS~tfvP9r@L>h<tEKNuCWkN(Nl7Txn+x?1%fp-A7-`EU$imc5cJ%gBA zj1%2)OkKu4g(8N8|LK|Zy)zkWMN&sT`a=ii1ox6`u=l_A|ByYQCoe2mk@#Ne=%(Ww zoz9oaLu!ipg~k1b<B<12=nawJ8zt%HdN3YaD#nML7?033^fYiJGj;(uD;7=Fv2i<; zLC;`?#-wNXa&nfP!YP!0C{v6h`hsXk4$87=C%JPkbBy@qC0owLvQwEUF-XSATT>A! z{JKWz-}Wx2eU}Z63dvKh$`L=2U%Ef=G{4$c(!7j%c6t8Fx;cOD`D+pF_oOZ`Euh~j zN_yyf9ujrg(6>D_5&11Q!$a4Dj*&}_xd|i(?>S~M=r@{k4D>ri@^UPjwjU&IP+<P* zaTjH~p&LB(xQE{H(7EH>c*{Jr%|qYu(9b+{9;*GVmUg9wZuU?dWMz5L<NoBKbD527 z+UcO*X)a&&xaU3ef4$I|5f%`Qw*~aBqDMf-Ksn}XAi0T>W4;OcjfVcp3;hG=M;bcp zg=R2`*tF+>_G{=QkWE_$I-uOOpjP@~f!PasPPqdf_Xg-~xB~M59KK65-aOEsmD>t> zOVQUr&uiLmgKU2P3F=br&mLEW7yZY|%>vnYt)PR-t@OBUphL=i$>XlXl(psV0NJ`d z3p%Xvo(I{wP2v>i1?4UQ*)pP_7nQ5@xJN;@ZU;Ox;|ybdqVeiLa^hKF=7NqW_Zg2{ z0{W?P9UgZ8B#!hPa}e|=P5Z9L9rw78@@D4OHFO3@mbM&I1A0ffc_7<gZU+59Lzjcz zRJ0ECpNckv1{K{8N-25_^oF8|*d8*&6qq{DV&&F?<eB&aa}P+aXy=&wK-tQTf~-!@ zpJ2?lHO0jstJAF@8@da$OGBUVLPx#ObIvs8I~qC(WYgXRvT4_Y{zXIY@<R7}p}z)w zS3~=}(2w)(51V!oXt##m0<t+j;)Q+<^n`|f(+m9x=zGd_d)ynK?<@BQkDFKE_N&K1 zS*nfwAUl3v1^u2B1!lzK&N|DOziKWY1le}G6lB}24D=Tbtp<rtfEQ?k<UBFQEC;;> zDlnf1*%Utj+0tJ2LSOYlXP@oLw-0oh%9q6cvSZ;8XuNXQ;zf7z1KIq#L2`Q_$NU?} zO8Ofw-Vo>%4IKsLD2lNC9H;0ukZj9x%pIUJ;R;MINNkz{llMVm{!v3Gf^6ugK(^QY zGw1^v?>SJ5#(Ndis^~AEi5hyrhujp`fozH-=qnoUL6FUP7f8-ya?B4wmuTA8LB)#B zndE9?7N`!6m&Aj%Yl=^UY%cAfuPS#Z=xd5LfoyO3N6<ej_id0Z<7H5ZmhqN{CZ6YV zRUY~W&<;(z9b`+}3;Mcp2SGN!e$d65-*HfpqT=&i>2C(vwp<IU(9rFmZ)h&x0@<9O z2YpkyBcPp%UIN*A{3qyJ%KbOUmV40!uC8WzXo-g&2H9G+6uRT>4$$M8%jZEh=YIv| zBUO(15$GL43(OIa?RCANJPkbtIz!PA=yXM&z0j@YZJ@K2TMM$e+zqn1+z&cSLmval zC8Qkl3($F>0`nJ;?O`9kh!^iG*ADs+D95Y=+59$xocur^)X>L3c*BWTcd<LS-vzSq zvWi^!t_RuDIzYcQQtthr3pMRSAX~;)K{oAfP@#tI16`o#mP`3T0!2Rry`{Mv`Y=CS z09RoC09pdak0VTWxj%y}SM(8nxIoi>1Y}Dq2Tjqm)u7*Lese${)_6C7E>)EOQMVrD zpevNC0@++X0kUZqfG*e2n?aW;dK$D;rFssuOwr4rHbq%eT<&_%Ey}$BvMFBnLSF~j z6s1$$6!(B^ilWP0`I<nsw{HTKs|5FetfXHASxL8prfKLdkUXuBWBvnVwLATCcU7AU zlGjNVn5`h2^P`|!Rnl*Q>{$43&`ixG^9p_>Ls1lDXa1R>8OqgztSn6+tNTSDE7fX{ zJSUlB?gV{I(N<8UqK82>iXH=1E7}f{#~pLb4$#LH{S{>EacR`(50d1VD?oOfUj=$V zrT-+Tl@tZ$??7KvZY!ukbNM33O7#`cmo)To&|FP%2y{%jS3nOcdKF~H^t+&kl*=i0 z%P0qZS-F`YTSf!OmhoxOKWJzx$d++8$d>UC=wS_g1Z2xN2)a=veHrwBH1yXXTgx{= zk0|%H$5ofOIj;j<tM&Mj$L#|>swsW~vaR}8keyl2E_G+tD9Flp4d|09!L=aUsyBjc ztG0n`-PVC-YrM@Mc`BBlIRVuxdJH6QK+Q2bL02ofu8g000Tq~<X>KlG05vN2El{gU zy2nF51+^&mOOP#h7-Z+1Q_EfM29V9=agd#dj)JVsdK`4UmT}H>cW$o$*%b3ZpVH8^ z9=8khXUZ)w10I@G;m%FfAS>x7J#-7mO8Ps{+nV;&O1In#LB(1|F=)Bg=wl$;stZAO zjo%7dp`j0Wp}RpVm3!LbdO@p{d(GqIH)mEWcPhx{{3Xx=%FQtkgWe&uz<eEKHMs{g zUqknU<|&$3<<3$Ug6zCj46?J-W{>+N$j(yN&2TlD1X-;e0==cB{Q_iXnm>7=XJ6^g zInzK^lb-=u9c%-AMrFAVWMzI7WM$q7`m~1b0o|Y|@^S9bYt1KsY|TFdvewrfpmq(7 zd!hG%V#+-X>QMBLAUg)12CY@@5Xg?1H$k=q>#uTa*#Wv;<J|?a<=zWwQK`NLTC8Xn z$V&fX&^k@=GmuSjLA5dKm75H*+)R+|#S1}qXy|H?mF0^dJANMrS<C1s$m;%-8dtj) zgZ|D)>rVyQoUaDmsoZs-4T=_kY|U4L?o#gaAY0luKz8(ug6zz7W-UK_qw&rG*|a-B zR)SB>bWs<`)}w8fn|2*&qo&;evT2WlY;U@;&Y0UY^a~)%eFbz(x$l5BDf%ABrX2#^ zt=u~xTg$Vq#?zzR`Jl~;E(X~YSAn)DcP+@)vIAt>_fgP28oC2y^V<jdf^si{Y>GdE zY>LxA;mUU|XsgCMA7o3b11-vsk#{R7p`kI5&G}x?Hsu}x*_;o6N;Ji59?Gb9xeGmX z$2D%b_kfa`OA=(u{W-{%yKA;F_iE@5K(^eMK%L6H0{VMJuYzpavQHXwpK_HT%dG&} z_Wc*o&B&Kyz7Mh^^Z@90q$n`mpk@s{3c5*AKj?FczC6dBEnWoK6jwDE^8+od9@I)a zc2A(ElzR>Iq@qF4UPW(t@#?NM=4s_-gZ@>~e2~p$C+LUDJ>hZJT<6Y6?Vx=cdZ))d z2C`Q31&!`Fx*K$>O8*6rt?z>%EB$uRG7a4YYE!fqv{X?S=oUrUbD7&g1!gA5rv2DF z`=d<-<`W>xeP}+TR^wd>x<k|c9@L@S+n{#kMnP7V@eACv6G3Y<v<P&Yq9|y+qB77r zMHQgcie`XrS5)nBvpiJqp*f(n8t-<{&s1xhKtES>59lsJ3(R(q)&0dyu2d^QFKN7X z&?b$y!3!loKfmJt90wcoANnnu|CgDw&T7g?+;{bxduIOq(6&cjUmJZV6aN46=VVtc zTGoDJOY5SJTW(ytxFUM_>Xt?3kJXD;tyq0|Tg!(Jt}t>tAj?!QX<Zn*JQ_u4hq=5( zew=!3D})g?E8_`)fzRcdaS<(Kf8Z}GBmY5Tj!N{vN9t!kh0am`c`jjuxx8gzY@x$s z@i!|YJI{Xo>CDT%ZBfzuPgE2~qiiTeUil|Xv@&W&&j>ITm8L($RG4Faro5~oY6{2s zQk9oYuP~7iQ*K5P+$)PXWk!Bv&CisW{ty#2Jwc|t!t4(*<wkzg&6iJknf~CLpD8i- zhT=rc#vn6|2jN3ZxskUS`tq4pW*S3GiJ1{%qNXg!lvS9b5L0d@g_tsv8)8b#C`J29 zFN>PNAX8dl`a(>(k)PZ1r7A5m`$9~K*%e}<=D{FSQeo~4G391yh$%A*LJZmnF;O!$ z$P`zYNg<}(L_!RGgW(FvKYC_)S#gQ!4KY#E6=b3nW>1JIH#<U1nRzh8l$gySCd#uQ z{?bb;EA&hzEl+7>xmgg3Q)Xs`m=Y5WF^rTTQ&C|GLQJ{I4l!kBkXgW2dPRxp2{BQ# zKgci!_k@^ovopk$na4s*iMc<-M9tP9!x+3X#FXpG;FFLs*b<6UqPq%zoT%>md<<hy z_VRwFTz}%z&y=b4>Ss#SYvyO7>Xr2|jKLA@O>U1W<)_96Lrj_J3o+<9#GvOO!x-EX zV(4`trcC$jK6y&fb0|(!ZERm0#^BOmoDzCnh$%Cec7BbOl<1Fv`tzaJ1>-OV^FvHI z-`#vJUz1)!n3PySx>;nGfL4BPwyt3k*Z%yd{M9%DOf~-`=QM-aVyamSEYsY&Vs&gi zwp5x~SkgumQ=ev5wY1&R7HdD8W?C%MpJtX?CW2fxXPG4`>2(#v@#;Q3T0YIp2r|>7 zTDmXJ^is1R6sO$W9AYZXYL5|lMH`d-rB5#|o@Um0agb+vaS5wTh$%K(LkvA3#FUw? zAX8dwL>p<Di%X}O?hsR9dV@?^nK>3@rbUhD(3j7&5;GiPO4X$D$C+m2$4z|<TCE5& z*a;g0ObN~*`SH<os*>n5GZ<o~8@b2fkAoxRlmJuAdKzMA<q%VDs)I}k<08aVm<NMQ zY1BL%WXh(Q?LmeWe=x)#bBJMX2{PrZdXYdaa2?$cVk*tjAcOT43o#{zmx25BQ(0-Y z2AI-lvFQyltY{&o%=8Btv^o-EO3a*7{biLFGlvHm=9c9_ri^hBWTusybwOr2@`M;x z;Sf`49u6`U#b#%SDKWc43_U!=V6O(5%3?DVVk*pVfGNWg9t|<YCVRYJ8)fw8iXekF zW(1jO#b#rOsWja|ro7zbpBBg&{oEX4D$LFxQ!&j%as#O<OH5;knP%<}G1JYE$H=VJ z&c7%lPUg%^v8<*~#||$$-JkRH>6J#F)J%`c=~(!)LQIM23e;<QMY)+1ic?`01Q}#* z2{0A(-dK>q1{e&~y@H(Y493Cw>hbC&wWuVY2Lo{`qa|ivh?!=(f(+|mcaSM5HGLsw zx)}^I%o`&irqo3Id!p%;^n{5aX1bXgVz73C3_W2%h$%HUh8RYrpQ(tl>Mad1)671P zk#>*sZ<f>U(ysQLLVk8Sy;6S-cB$7lE|0aYi)l>GtNELi5oh;(K9=b-_m>`Y0{A1g zk9@{qV`Q1j*TfbVEok_RFk~frPyWZGb3P>3&-2b-jidM#hcV>C9#-<X#^%G+deVFb zoKzaeVy`fFcPwY7jf7bVCDQpY8v~4ZeWUzK$B}c02;xfJMM~@IE>uQpDxZbKu^+cA z@zuB=TUYUL*pC}0Ifi)zW+PdqOaB&(tY~RQY<anZX_=xq*Or%%?RNI>+B!y<Vwjx) zCJM9L&rGX?*&AS3am_P+rW^~vv;>$km>WHYFXnmVxx`_tetrg17+`({V?R>&X71!J zUa{KGtY}@)-s<);S3kcCq>|`=9>a`tJCbozoi&D;3e&CfNPD>&YdkBgvFihj)V(6W zNZq3zBl1*{^Dhf*KDO>x!#omT=8lo48Rllq$L&9>VD1kvpNARp7-TMy_R2liCo{VO z{IPz9`H1uOiM}}4i`-uF7`_<!)stNglVh6E{NmN?C4i5s!$*l@KQ8kxFojx{qr)<e zw#;y$uPpXa+@}jLBH_^hQwh`KF?=!m$@vL~apVc~4T&R9SDOo^EVp!Fw<}|8n@$tv zK|iA#nR`7(!u5iw!`SwEjhuHY<K!$No9!3*>LntZ2mK5-6FzZ|k?=RkXPLv;oW;$! zTN%k&J~{lk|6*S)ilue-7x~J<yTMEvV5A@J@)*9D50K9n9LAP)K1{bVZdq5rtiHr8 zOHy40(|D=N(4*LSGL}E$E4@_8Y78*a=j%O&FQ$=vKIAaA^v}Y$A1cjfrN_AaCjqls zQ#pE8t+ssBSGsETh5#e_Y4jM$`BCz@%wcTl-;kV@aqIp)n2l51no6o?V7jNe40V@k zncbK9O4t6g!_R2{dCX%Z#m~uSox|ADUxC@Lj8m^-$>`oId^ux1bGsnGNY=3cBco}# z$MD4rlk;?kv1J{Hnd~vtLeyi<_cPL@=1e~$O=@!d47Lt82OLJ{!(xfF(_>_QmN&`S zkK2OdvyJJ~I8IG<M%qPEZ{5)u>4^X%^?EA6NZt4O8J)H63@}o$n8%157gG9_4r8@3 z6~_J8URMRvt#RC*a1Bf&4U%3xKMT_rV3xuZB2;>A5&d+1%vUe=HmsF?hW#`B$74i} zzayV*4r3*}2c}yYSDpu8@;S-&$`bXMy;u6m()nkXpV5)B!($}HH^^s`!`QN(fZ4B% z+YiO5Kln*s&g>YC`7b|HjInHbf($+Ah{s4-UF7_Ahp}b-9L9d!zVV937}j_B{9c$j zZcT+5hG`5ir_pixJVs_D(dywwpUm3Fx&w?TsMpWv8n+|B$S`=!WB8)y5`D_JZBZ=U zRzGen#23{#*Dv$+!pw6SB-B}A`Fty3j@S}9b|x?I$*kjjQh<?U1s)@XE+OYPy?lhZ zEg+9Ox^ML2!070n?`KLS<!nDAlZ~nIGsQCE<Qz{5U<%>$K%gvP9*1evIIe#7!%S>) zYbtSmGA7l(!9+EVn`!{&<^bdU>a7tyJ7-&zgjLPItc=wH1D|u~X3a}tOhX-unlTHT zSGTQeUEbW@c1LS_FhG6;*X5fRwJd4o*KmoVaP^v1t6SH^+9XZ$%8nId$dzr27A<dW zUa_$KR-=K7`CZ-S#mg7AlR`3UZ(XytZE>sM0O16;tZ7@@y2hVCGiY1c7Nf*@3uZRY zU)m9CS#|qLZ!;96omkh9pmt$<tGCs$v0U0GTg$4It-h~X`?i%Wt?R<%O4+g%)varb z6|t?aG|jcMu5P}1A$6IhSzNuKxuLbaec>%+hoWO^Bxrf-+ScXN4FaREdC8hqLbV<< zm$ojxwXS`&Ek**G_2-70mo98y>O}NP5V=j!)eGB}7fr9g+vSK+f$N}|a%VQ6<ZD}R z_sUt*x^VgORg1mvEIutA6h++mF#=aK&u?wL)l{b?nIBuY_}1$eu4(5gl{VD!RSR3J zL{7P7Wu<PpWw_<tDmew&G`w56*=Z|jY<bsmvsJK$Q*sNUP`;B>`SkMXeyJ9$SwD|B zs7R8pMx0i9?7}sk;!CHM8ml2K#_FMbT4}k*(!t!=<<oFJ+t`ab7T?NV$bMPVDmr#W zm{yDkY4O{awk?sq=E=WoRohDc_x9Dxr7^T4l;f8sj9$ICV@+FZee>c~t8Q&;MX^3g z8rlh{F7xNqy0X1vO{<$#IqRP-c42H)$MQ6$`=~SvTUy9w#fnybl-eo2lKp`Vlp)>H zx@2L;a>n@Th5VBDEnXxXrnU|7;k)szZhhm~=~5+?B4XQ$)zn}$PkF`|rdoPidoyya zu$|);nLzAZu-;MXa%wJJ%oEiMcXE!Fx_TxbswWCwOkaq#rn7RZ#R6b6vSR9UaqUih zP`T|h4IRs8wXJofy{&x}4d1+IeRJ!|#T;@_e=R~pm4THm#8ziztaZ)mH3YWD)-PvJ z%2=DvY{<x1&TRtQD-|-VdERv~&EUnE*Lqt=EAJ6k<`c`;uU^_bhw<V_SP?B{dXUL> z{mR(VR+(d)nbl%#ix)0u8gMcr+}3OPDq<qYqPCd)2)QS<4gpumwgD@m)2FFqjSE+{ jF}x*;R8VFu$)b&+Bb+mhuCZdauCdZMQ?HInr@8(IB+=%^ literal 0 HcmV?d00001 diff --git a/src/WinLibs/freetype-2.3.5/objs/debug/cff.obj b/src/WinLibs/freetype-2.3.5/objs/debug/cff.obj new file mode 100644 index 0000000000000000000000000000000000000000..c605ca012ad57200345dee33067fd3a0c35cbb4c GIT binary patch literal 149592 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 literal 0 HcmV?d00001 diff --git a/src/WinLibs/freetype-2.3.5/objs/debug/ftbase.obj b/src/WinLibs/freetype-2.3.5/objs/debug/ftbase.obj new file mode 100644 index 0000000000000000000000000000000000000000..f194f7881d752fb39a8dae41d175f78bf79dfffd GIT binary patch literal 218151 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 X$;4vW_mk*;o1@I_N9^Z*tv3E2G?|PE literal 0 HcmV?d00001 diff --git a/src/WinLibs/freetype-2.3.5/objs/debug/ftbbox.obj b/src/WinLibs/freetype-2.3.5/objs/debug/ftbbox.obj new file mode 100644 index 0000000000000000000000000000000000000000..67f159c95565081989732fd1e761fe5b413cadd3 GIT binary patch literal 13643 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 M8=BnFSXn9iU(BKSH2?qr literal 0 HcmV?d00001 diff --git a/src/WinLibs/freetype-2.3.5/objs/debug/ftbitmap.obj b/src/WinLibs/freetype-2.3.5/objs/debug/ftbitmap.obj new file mode 100644 index 0000000000000000000000000000000000000000..986929017e81385d712c49fa539c5cd8a8aaebfd GIT binary patch literal 23161 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�^EaQ;b8t%g?864aiVZv<&yPEK3T___KHk3sa5tNkY)? zv9Bf}7Z)rkELyz4c0=Cca_iy+;t~{>IqbFG7122sEm@eCkNd~TskE6S4^M;JtzJiC zOIM#d7ImXcId+F_MIKjReuKxs38Q4fe7hqmVH`@(R30f&=Df85w|8w7xaBD>LgFn^ z)v1YPPKS-tW}KO(wKhRbb9)0eGB-}33Qt3FYR&0e<#IR+?2cL|SC}#&Ns%Xzlg%<; z6xD)O%cy~zW{<;LjT@?1p6OG6AT#I7`xB%9s7jx@QL^PoY8oL?a%D=P&xKXDtpFFb zeir3oq)nA+tgQvk!1Yd_2kmIx>sNb$9ZGwht;ov>=cC+Dqgvz2Qo#g|`aC~-Mxi$_ zgL`(d%vVnO(S*7Lc_*p~G=61HzcWzcb>Ut$H!ue2XZF$tgVU$}T}q@5ZvgVz-7G*F z664iMS=>UW-yx`v&5|oMQ{l6F{53Fit&d){kJ6H4jkxI7r`F1HC3f6fc7kuiy8BEn zOLc#A6VPLRzITn*z!X&~(m}D;Uaci`M73;j27E4u--atKed=|%+=3$Ii1DCLmz;uH zyU${;=MIw=C#h8rXp#3|G%e=Dq_fS73sEjp@>z>{fdH(Ni%^x*qLR>)yy{hU51v`z zbds$=N<!Py_BtNp(NQHd>!ns^N3~w=bmM6Uu4N>W=Bl-j^^V86Pi8H{h6@yphZQW| zYUxa53_GQwqAi&9bg48rYk4j1<g%~+M^&jb*aElLFKeMT5@j2xxxwwU;UW~f-3^X_ z*T)(@!**=!R(H!n(s<~m8Fzs!F~;Faa5vfRlWmdB-5Ap!_-X}(8?CH9Mif|TL=w`C zN%kt=>vi*B4IN6@L{CL`m#u>0%Z4bKxf6FqF$TgE1(=0$9LNy3IO(Z!u<RHPDLMt- z`2!{3(W<+UVca5RvDjhAYp@ZjPaVR(aT%;n-65-3(h%VNE@DlQEY-d_S4@32wzR{t z2_6jcBo>*3S{)-Ysaf@;dZ|lTD}_&rlkS+TxV_7RLgv~KlcHHNX%y{pG-o@b*sx1V zA}x}|pbl3_Zh1o$i^zNm**}&wt42ftn0vTWc6uos!;9!bHK>!6%&E@DG)_0j8p`YK z9+sEvq*}H{v4(rrC(q01i6vho(z6BKEK@YSIenVuK9Mr00a_hS>M|PSV2*%N&CV7h zEp{#Ssp|)XlH*eo-A^^5v2$&g0;mfJZk&1*YY1|-^~yTbNWfEr<~EP3{cw7m2$r__ zE(Cu>5FfjKJXU!KnyP!VY1Y83Sv6_srQ7SUyPYmijn^jK4J#0R>OTf44I!@}61-_Z z)=K@9Iqhy#Al-oYXAY?h-TTz~IFRv>4q>#+uaX@tcKHK~5$sqgG^`C$@mBPJjsE5s zh45_TXVH5Hi5?v_$)}!-(H4)xB$Y+WJ#rwZ&V-yF4XP=2lBAKkRpy}8h9>C6QZ*Di zxN>?(qCQZId7-+l%0Y@|HZ2h`E+sTG(damBSiR~~KbEB<zJl$G7=z-ucDHO*4k_AY zX09yA#!P0*b9~#N9!Mu(!y!wZsOq%Xizq-X(af>hf!Wj+;K3LofUxpMNaaW7402t$ z4*9*>pq#LxnoCCQCy-cNU@IzQ;~UB=Y#acN$V$irsCOi(8UV1Q$Gk-A4O${YeUT-g zRNlJ-1<7`}nW5~&#>&}*+;Ut7d_Z*pie<M+g<AO83m#osH73RMTwN2xUMSQjp@dD= z1^toOQL#w+!Lw3AsW@IEeP427A`Q1j?lgp+S^xhUG}v5#M4&4%@^<;a2n}gH{C}0* z=7us^xoSM%btU8;fh_0}o1)jxVR6WSDHZ&@6gCn|*=E$zY(rEVIV$bEsw$vC57?K> zaVHCp9bKswx}bsBa`DcV_ovvFxPvtAt7He~<8eC~b!hTZ10X+Wy3p%gDN|?=2fK=m zMK;L}=dZ=RAre`&E($GF$S>Q-8whO_H|P-_$fyQucGlQXB8@kuD>im@BTA|f0M@|~ z00Q*kcR%(!bU>r-knY{3?GLx#x#rpaOW$k$1UF;8&-}H2yYxqoc-|QKV*HW13ULu` ziqJhBqwW`vZrlIvtFu43sO|PT=M{4<z&;K0kG*}Dvd8zxr61q&);qRE9cj29iw2Ck z*FX4bL&)K&dhq#MPtCShV&jeOy%=@xO}Y1l`#OL9KbN)rt?~57Hxvm$dtpZ1lJ3OI zCqMW@e`95#-@Ha&#rq=Q-}C+(Z!fJmV*KOi74hH8uf)wCy4P*g{b}xJ&5!=|okhDV z))f5Lw4y&_AB_3^-LK7_{bjwQ<w{HVrFT5Id38DZY}B>Bo@o8bw{NSZ`ngfRDlA`s zy$$9U{McDu7XIktkvC1~o%k~C`~8LazbMHt{eIv4&T{Xp8<Xx1ZNc3*7`9R8{_y_& zug{$R+=^v0_D;RvwoL3RGGEkYJolQusA6%P?Z4l-yKN($KVW{z>fD-jId{AJKUuKg z;O4ZC@JtW(UW~fg`<q&A8xL16`D*#XPbZDUhU81k-<Nv(BTwI>|7+Re)eW0k+JA?A ztVGKH)~TOO+kDNx%4==6g|ChK=`q}wXZ~r^sHvl$EIahjoBhvza`?Pi*oS0(-J0_s z$+W$v8&@=IO2RYmW21EBaH_{TV$3^bo#nrY-}0k-Q>?{*fu%72d;e)JxBTgnF$sH? zEnXe^_+30=!u(q&R9xljRK{<d@%+zc`o0{8=PsCk?XEi=7wmoL==a{*UG!|uB5asU z#io%_m$B+-_4tSWw(Wy2ufB5h+z%fV;y&glztni>=p$Fox}xRcbqSZ8|1$O|ng3L- zd!OZruRc5QlWEiD-&VN{{XLKBY3cj)u(z;ib=?Tv2iJW*%z^$g|DxZ-?SA+AhyMJ6 zWBVH!KYs`t!Ot_l!L;rlhu+GXJ@S-y*zeviZo(cGHh+w|+a}CB@A@@mxAs1K)AA#u z--DMsn4ft`de1^%+w=RCzy2;~MfY9UcV&K=ZOa=kZ7aQb+Y>p{UVZ*}G4=tmX=K#3 z`9G^ZFec@P|C#pW_w#OB{Du&>F@N@?t;hG(@4Rr__z54n$8W_$DaT~~-KQ$;#@&zh zJ}t_(_ibpzz9RP0jJg}=PFeZ%p)r@e`pHv!7t}1dREU4UkB%dap3kg~c~~5m<MLtg zYUir#%DS~CEqSPi#nop*wP(oj_@}GRzTBBvOEu&9T7EdYh9AzZi##!Jl8<nk{E>&V zS7{HYR^qvPJVGdoYc2Cr?B7x_mwLSd39ETG<g7(>;}Q3O|E!B+_Qmzcx$L36A>ge= zf6qZ1HG$={emwimI|D1~>c72ULp^T%-J3GK6`>CFcVdfyY<`pB+jsvAw~MlFKeipu zK?^kjKOPZu)}4c@9bQk3YdIXV7MBlB-#KVOQ%{6A2W@CC%W&xXPV7Z}-9n45=Rj&r z_mYq;oL$_;Bi-jxKrh}c@_Noe3$Sdg<iATlkBpn9+~`^D?37#WtU2qkarp2uTg|ta zvFz@1p!SF>!ta;6u^*xO{aL67{lm3+Bs85x1^(6bn3DrFnJ$m}EY~fo5V;~M{%(CA z`*PS1I2Yzw6R5)mg6~`e+?s&fQH^EaxwRX5JLnv=P=h-Nw2yjDs)ow#^{#VJb(BBJ zS7~G$XX6e5yfb+YB&;D*mVqq2BFmKStg1K71-R->bUxiQ)pRp6z$b=0@ynB0NJZvi zPRVpsmD^W2aT8!U-g_i|3G*ov(&R=d6~GmapywFq9{g}otWrs$M5PR3i^h9O;~fEo zO$C%l$8{}HNn(mh8N@B1Ml-Kkr3}Igif+j#3BO7i#ClNJvH<UgDrFEC;5t^;H%_Gt z!lCh&YrH0nch3M1*RJ%a!*Fp}rIN%El`@DlT#;VRt&LSFgSZUT1m;avDTBxcWn$h8 zl`@DtP`D_Bq-K>eh+<Ham{+1w25}RpbmrMr${;+TE@Pfgr3~VBP_*ruBtj}>5OuiH zCFzsIttw>@&uY9EG~PQJ?>&uoQsbdG*8=%Q;3Z_#H(YE|sU)#kr3~VIP}8`z<0@qk zJ)ovAuUDlE;y<9SVBTq!G6(~nvAB|XBUQ>EMuW;?-i0b<5SN3xnt4~MltIh{mC3wZ zl`@EhpfZ?OtWpM1kRqi|5(`wyAnwq3VU72x#`{d;O~y_e^*l*TRVjlg(|AiY-a3sJ z)OZ!x$jnCB;bMzQC5fk0${>z`n!`2!O{EO{wq6eNJ_U~`gE$3hI`eec;3vu;l0jX= zJflj%+Cj}`-Z+&qh$*13VFc-~QYnL&4QeLy=BkuIECMxyd5cxbApQy}n|a4n${@zU zog{C9N*P3@#=Ax1J*M%V)Oc@dygzEZQyNbPC#RYXVx3AQiJ-=NRpYg4JPH9)mIReD zh^ZRyYK?cZ#;ekJk7>LoHQou0_o2p1Lr9Trj8!Rv*nN?Fi*>lrW3P;!UrZ9oDrFEG zHC~g(J2qZEZ<Qqerc!XRuQ{wrk7Cv<@DCxvdSx`W7)7`wK^cMABf<;8p^c<)NwP8m zb_R}784V?ZlXlZ<2M-=Z`A|>#E>H)<=A&VAd)V9&Hg|^2Jz;Zi*xVO3_lM0VsR@19 za&o`94`qd7O;+;t$fH=2b1lY(;W;f`mt&(8{Ll}QMZ?vKIa#q76=OJ6DM<*ICMYHP zaH(D?Ne-7LD<#HosZp7i7S2mUxqqU*P-Bm1)GL;r&)*AMdZ>1DPs)pNkOQ@Z)+UQU zg<>^wlO3VP4$j*_c{_-0?%=%bilsf*(ixcCZ0##k%tmEla;akN1leA)LZ?_xmUfct zp}k{KD4d_%eNnTyuSBtQBG<_>HI2j$=Ou?4`$U6mGZ|_@H>n|AI8Mn+2<Im#dHQg^ zUdc;FHA)^TGb%-C;YDdI%~4`<tx!@j8ZauQ$piJ9A>1EInqijwVjJGzyfL&lJ-3Gi zP(HZnHRUuk$wwa^Y@_j{gV&it9j}rbnj5#jOvA_n_pj$dje5~w*hSMs*JIeN4mCn& z=V25=cwP?)nBqj&ok$>kwwgl6TUx(JWc8(m_LxE^T3WwM3|retw+$(w#&*$g9)`w> z0^MVXxh|2IjcP@6sUmZ7%5N8r3R|`-*6pE>bYc8$+&(Pju6NOtV%~l_{SFXl57|mb zg}#h$7)M62FhQ|)G#94EKO8y{AHS!yAA`KRdvtV??%}C>4#DVlH=FmCsKb(=Saz2- zTlZoxNu&D6P#R&Ip~jOUpjXT%yMBTFei#oj=_3VUR2aIwutW2Ka2^^zNOov$!x$^p z!(@l%Be28n%g{^x`r-S{9ePOJou*hiR=yDr4RxQVSld_rDIVG(LjoV>!c8b&BgF(M z1zT%psIgP59|dzrdC}62g7J%z!<PQ;ixqR{=SSGSla*AcFXcsRC;Ao-53%;|H}{b4 z(6pr|)T+~5A~!Cj8P6a?shy!NuzN|kURHi@sIgb1+%u9=&HeG_-n;cpmRI1eWJ{E- zFSG|^)TfyHa^WxcwS%pVjjmyF%1-kuily)Ee#O!sZ|P0hnVQrlD{3-Q)$1om5=u|M zOe&g+%qL`yl%4vdHx+AtytTK<(6xbTHup|7_pMnSDFf{j1E(oF6Lj%y)bj80jG<0l zZrl1Xd{$~iKO!x57k1D7`m!WoQ>tt*WoO(#@!UNPaoy*2$8`_uN`mWj9sBC^>HTIr zb<8R-_l8<@2x^L@H`mgBdohKXe0|D`#Oa@UAZ*#8Mz_K0>TJA(h3SJ<6!VUFGYIbS zj(BTdlcD=i_mgD5P~1Yq$o{VRXqGEah&OjYI<~uHB`)6FPG`EDmNO!NEwr~JDg-na z@jW@nE$E#!dM1?)dL{Sk4hrCOa6GR-eAxCfg%~wHNdF462`X?oj%cO&FsuiIi_mNC zC3A!(*j>ZcZHjpth9``_joXH;u2C%8PNz3h<NM8c%o{^Yfw#T6*f_kk3x3kmZ9xJo ze;^^gwJVMirXzu(m{vk}sEhdH!6!?Cf5jspTYI_<yGG%>3y*UnfTf9)I}TB@xhL1$ zn{wYiqAk6x$I;qhS%#b@Y=xb+<(dztG;ih{ZLMF#M;z@S_d6N(61E&rtZkta!^76S zyXc)j#j^Kp%yKP?<!IQlyL+5s-OY})TQMJm`-II070UrxFx0qPtk0*=VcivK+$+{! zpqO{T1TM3*DArv~2Ar{F?NTheaxDk^qZR9csn%U(D<J!>NFYk?{uv@Fy*1Em=`Tf+ zwTCk#EBbg#8e)n*GDVCHn~#JV`#GldcYVn!KpfYL^~*5BA&zv0TBXuqupLNd|L$P_ z?qEag$kjJqsaSU)5ca~p$p+)|5I3!9@m9>0)}DClkw|OF-LG|*V<eHUGt@G?wKG0! z-ab&TrGo<y=2^_i9l3Fhhy&XpE$X#WV+dGfh*FTMBi?c(5|)#@UuOr1iPd_r_UF@T zMC7zI9D`7b^$4v8XqM8SG5=$N9okVUq8w#luIxW!u2e9}Lm$#p<X`y9hMotI?}p}A z-KgVbx~x*YX1}?gDu|w3bBB>d@?xkL{kc1TRMQ>xC>DH`{)&`)$z<h8!unxdui=aq z0JL~Wd6AY(JR{Irr<2w%ok)2-e^eYTSD=s7Fr131(gZBx)Omn>Vf}a-*?9>Mf8Lk| zSD^(H=66flR7;OKJ>(<W^ziBhisotzDK9S6V@0(7+GcA%Y(ZTS4WwZlJIk;%GWSNT zbSzhZ<xj-?u7~G#V_NK|6$Cn*^4t7T;X6oCN;CbXc}Nnhz4(;7#-N1qAf=s7e-MSB zE=>EF^?0q8kL6T58mZZzXN;o?IU3PSca*2JqoKy5(Bf412^I=r>k*h{*nF6jQ<~8F zC8psvWHz^PY-$TNwjndMqF9a~I)|<B_=A&zV6^rRS1gB{ba30yiFsJwDCWaWC0GU? z3>`PMelZNQf72r9{a~ow*xHZv#o?wr#0_NDqZ!T&CNd|qei6r+hjHe(Lzp6wH<9x~ zcc_(G3bi8kBQ70bKRnX4j8w!6p3w2(VN2WkYmtW8Dr`PLy=~*(atGF@BVKGc!9ssI zoGOF`95{5GL)Kxg?r`@Xs4n;z%`mJ;b9+3QQ+wAQ%r;$*)0%^Ig!mRwcnjG9DSS64 zA=>X^BR~~9kW{lj-zd-lL?Eo<Xwn;4$BFe*6s*1!OABmdw-zfDb4$E=7e~$A@s=GF zIN#{PTQ5A2)Y3LG_EM~2wxXq){qyjGhqP<!Q#5Q(@vuD=YJ3XA*3HAVEo|AMSht3) zo29m(?XYDNNwbOL@upDYCW?IKEr_^b%L9t_fej~GXn<)*H<PX&2p!LA{USlJZf;tH z{yY$BPsX}Zv21S2!^k~=g(hVziB~LJIGCZm&7nOBXtMiZ*=UF+l}+ofQ><tOLv%k4 z(Iy@u+5RNOdjH^N?{7U0QSax<u(aCT&9jYV8;{X8_Q9<@Mq9h$U<_TSxWBMtsOKK( zjbTfZIuJ&76LfGRb$uguePgI`BlN@*pZT7!IjC5g!p-zH9{Ejv0v5@4(2INBDM~XT z`yvys(qFNDiDC^>f9{}n^OR=#yWw~*=?>a@kSfCD#fhPI)WM8AcubIuE~wl=oKOoY zAOgx_3k#jl1uz4mX8oD9k(J)V8n}lw(8L;O>Y9QIu(~^Q;j>{c1>dNU9<}!AM<GNL zKIHY!nK2#lyL7+#Bn5Mh)5G~9sJo7?fEtGLg-`b_k;_-s8%;{uwcrqw5?`5xQy-_6 zY3Vka7Ad%Dc$_b!aosSQFQiM2kJAMhU&My?CPejs^3yL7kK{$D3pHw@MorbI=^B-R zz=!<;Y(o}-qEcz}njxMeB<f{Qv}u`0uMXnzeB$BdKRm@p6kg-wZO%l|0gAejC?17# z(#B(=Xa_|bt!bhk6m3$Z33?eXmnnLkj<&7R#4DKLE(MjyuV~6P{s5kA<0vQ-r*?v( z?aM^b3o4zdK2Y@HRHEnyHHoQ{8U;3QMka~`P^5=MQ3r~)0u#j(*h;+$RGK&lO6p(^ z)F^vSj|@rbDNv-jG(neYv=x{rx<E-uKLaHtO~B?RZ60D2Kuuw4Jg6+DOrU7nFHxj} zx|*pepfZ`dN=wbssD;>rky8B})Ev%N1Cx+a?ZD>YHOzY%l$7NSQ0mBlqA|wEfXZR2 z7Zh#3C5k>!vzY1!MO$r&;v}dUOwGpDqU>)uD0C00H)@naqgHBEK%>@almbf1f(rNm z12shs?AYOqOn!wJJ=&@Z-#7oCI|}aYz59_9tFq{uD&O{5q@lhQ_sKj5KJl07s-FCM zoj}0CJEHSyoc2IwRu&9c<wSoCmALV`m+&|Ci2f2P$r`VtZ=r6C$rSw+R2Vz*(8!&6 zkPhhJJR<s=sFV_~qpzYCfO_)!=boc{@<>%N0p1ZOqQ8&|^G7KvOVZ1OWTeByfB7B= zw<kwmGPQctFR0R3eO*2C)p|G&(>JLcYD2c>24^0AQbK%3Ya00-UCVL51aT-T9F5_S ztsd4mHr%^%;PZ6yh}67JJs)UGIfJwL49<Y^BK7P+9=cf9B+Ma?T8V)m3E`>5i>H%M z^gyMW%+twV+G9B6OLUV+%acucs-o+`7s9aOkLKi1Tv!;xA&-3w${T2%{FS1etQjYQ zcDsyFJINeR66TOr>2{CSdJbt-AHyN73XMZ2AJZQ`NE@VQJW&_LLCx7z&nw)PsttS| z2zD65A(`)v;gAk*jppP~9*Tqmy*LTZJmygAq-W}BCt{G+i)%<fM`JkD)5FmmDkNUO zRy393@ye!BcOps-aHw@dG>1p|3B*(_&o$IjijT5&oY1GW@P{}gq3Z7yl!D0ueo;?k z%rOBaY|$^L+O)^J`P-2;8$QNrE3a(`;M<`d&0}NPLY~qKlKJ?4ruIeSShk3&nm^xY z!>6S%gtlAx-4vmn;tdRXqFb%Cpw{VFY4+EPc`OQ_mgAMbl}qhD|GZhzwQ3*PqpI)$ dBz*RF&_}BxZP53Eqe~X3pLB^5kzSw@{|hQ5$HV{t literal 0 HcmV?d00001 diff --git a/src/WinLibs/freetype-2.3.5/objs/debug/ftcache.obj b/src/WinLibs/freetype-2.3.5/objs/debug/ftcache.obj new file mode 100644 index 0000000000000000000000000000000000000000..77cc59cd1014001d8e5168c292f24144613d8cec GIT binary patch literal 97130 zcmeFad3;sH{r^88O1u{}C@xjh3t~Y9WK&txvLpz~z9?!mge(vZNlb27RP-viU~u1X zX+?`IDps^=sYOM_wOX}qw54s@qSb0ETC~(^{XJhZbIv{YBv26iJidSY22Nh@^FA|k zX5RCj_q=D$oO4ID$}@ex)9Qp%i&~k3TNxXAmerM)re~GAGh-fvnB=boJd?;bJ<H0c zHB9d^G2m_bwJ|%lHs-509q0O;j2Ue5hxRNhNtXnXz>RH;`NgIP19Gq#yt-#yZp1b4 zANb0c`v1DPhuV0(2KP*t&q+I${rle&jd}NLWBziYE98Sf%8Z-Zvo2lQWzy)=f~efq zymERg^E!uu{tnJ3KgAoF8}E0-`C~kutM4S6m_M}~ANV){PxVcuQb*1#sjjRjuTPhi z*Oph8l~<R}9oRWNx3>JauCptv`}XOYsxFzy$>_?`x|;f$igeGDhxPB(vp@nJHepiN z)U5Kl`pTN><GS|m*{kPKy^iT~OwVJECRuG=O=)?3eNEkvy3!eyY1*lwj(q0yKbmU| z)2b><Pb!}~spjl*lJ>4B?LV#Wv;if(%X{}P?>nt)=hTq}g~NwT9yMvy$e{x}kDhok z_bTX|l3+gJcpsw3v}&))lnyK^s3~ojSzev4PnA@cr6!iA)0NfJ>x&8sPwrDRdTuJb zTvR`+x~QVAyj&IR(WhtMo<|kcOgpQ-$jYmzB3)WiI-|TNEOU9AecIDDrmfkXdvtxy z{SBp%>Ner9)Y#f|<;==+xmRjf&CJ@$s`5HhI=gIpOEj&avZ}1U$cn#cR%LxdNmZ#S ztun&~7LBW`nO;{iGc}xh)fZ(;bFz(<nwV}VtE@@&FFJWx(X`6yqSC6K<#WnS>C7_I zV{BQf$H>mxDXhxs(yE5C^3JIq1;qu0LnogAamvUsefx+(Qvt&#xhut^3QsN^Ra`h> z!q^GT*^?#=8CGc7eTs)p9y!XUo-ky>sme$iRy=v!2@{4C6du=WPOoEn_Y!;b&|wo( zJ%$&gdK8YR*Pqf<j|r28^-lE|T|nhdE8$}8_SP_}4qj1u)|Sqo#=~oNVBST_uxtls zcuK!i4`gy$WvWMYO;yeGnpBVSy1JUWy7JnZy7WML<jmT%v|tOGG_l~M`l3@RtIKL; z*B8w?x@WJVkzt#EvxG&{tElW2)3%_#Sxwv4lqKn^nH8l)-!KE}Uo@)^)y}4$G%VF) zim9(FH9dP4x&NFLSz8g>j8aouHf?)*enk0Zm11R;rTGl|(}g1lBO&tqA>JE%8q)y` zY~v51`<p$iZPaxIrBR$g96vjdKQ^?&;1$<bo?BjAT~k(GTvk(EZaSJh^ObwcVNa86 zudDZx2Z@!;>;bPGyqze39Tvs-^6Rg^UQeVj#wHlY<ugQbJJZ_iV$7$c85g;Y%Gg96 zZNUQ1pKMG<<vtnQA3Oy-1e^jM2A&Qc2^N8>+ZkY7UaR1%d_k=wuLC#_<n<KvpqRXr zMsa?^@zCbvRZ4d%sdFOJ4O$K@iL66JWQei8v_wNkGr6@Vn&kF2CGc^S+r}JLFDFeW z]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%0AWX=y#bau*oinRVZ7DSCw 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 D(kZDR literal 0 HcmV?d00001 diff --git a/src/WinLibs/freetype-2.3.5/objs/debug/ftdebug.obj b/src/WinLibs/freetype-2.3.5/objs/debug/ftdebug.obj new file mode 100644 index 0000000000000000000000000000000000000000..7f893512fa5e7c3e151b9f6293c3aba246b089c6 GIT binary patch literal 24656 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 literal 0 HcmV?d00001 diff --git a/src/WinLibs/freetype-2.3.5/objs/debug/ftgasp.obj b/src/WinLibs/freetype-2.3.5/objs/debug/ftgasp.obj new file mode 100644 index 0000000000000000000000000000000000000000..beb05780f373b27301fb708e6a1498174a433518 GIT binary patch literal 12817 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 literal 0 HcmV?d00001 diff --git a/src/WinLibs/freetype-2.3.5/objs/debug/ftglyph.obj b/src/WinLibs/freetype-2.3.5/objs/debug/ftglyph.obj new file mode 100644 index 0000000000000000000000000000000000000000..36d2b01c486b09c06e03f8bb9544801cdd24c4d4 GIT binary patch literal 26885 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 literal 0 HcmV?d00001 diff --git a/src/WinLibs/freetype-2.3.5/objs/debug/ftgzip.obj b/src/WinLibs/freetype-2.3.5/objs/debug/ftgzip.obj new file mode 100644 index 0000000000000000000000000000000000000000..229889ef2e22184351ea2d50dc70a1354345c78d GIT binary patch literal 64037 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 V)(&D*z_ZAw%gnfyw&${K>VH1Z@*w~K literal 0 HcmV?d00001 diff --git a/src/WinLibs/freetype-2.3.5/objs/debug/ftinit.obj b/src/WinLibs/freetype-2.3.5/objs/debug/ftinit.obj new file mode 100644 index 0000000000000000000000000000000000000000..39113d8bfccd4473786d51030294370926a9edc2 GIT binary patch literal 14661 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 literal 0 HcmV?d00001 diff --git a/src/WinLibs/freetype-2.3.5/objs/debug/ftlzw.obj b/src/WinLibs/freetype-2.3.5/objs/debug/ftlzw.obj new file mode 100644 index 0000000000000000000000000000000000000000..58cbcf55bb647f2c31037aa4ff3704aa75e236a1 GIT binary patch literal 24270 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 literal 0 HcmV?d00001 diff --git a/src/WinLibs/freetype-2.3.5/objs/debug/ftmm.obj b/src/WinLibs/freetype-2.3.5/objs/debug/ftmm.obj new file mode 100644 index 0000000000000000000000000000000000000000..31b4dfd73ea0527b411b94434a159ddb16d4073c GIT binary patch literal 17053 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 VSwA*QX7~76O)`_}p8ajd{{ZXPWDWoT literal 0 HcmV?d00001 diff --git a/src/WinLibs/freetype-2.3.5/objs/debug/ftpfr.obj b/src/WinLibs/freetype-2.3.5/objs/debug/ftpfr.obj new file mode 100644 index 0000000000000000000000000000000000000000..e7f148d31ffce045bc82534c06cf02da5af7665b GIT binary patch literal 13546 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 literal 0 HcmV?d00001 diff --git a/src/WinLibs/freetype-2.3.5/objs/debug/ftstroke.obj b/src/WinLibs/freetype-2.3.5/objs/debug/ftstroke.obj new file mode 100644 index 0000000000000000000000000000000000000000..f652ed5d23a4c798b63776ee69321b1481014f4e GIT binary patch literal 62193 zcmeF4dwf*Y)%SN2ggA*N*r=$eQBhGYa#K;fK*%5{fe;d}(HN2d!H~pc0(eOq3|Pi7 ziWVwfYO%#i6%{L5s8k~&pwbpCRcx_RMGFl+qSBhSsPA{Jz0aAGAyOZ$@8|vFJs-mF zH|y;CUVH7e_t`UNY*IHf_=uzn4*9b&uNr&xFR!a8i_EBSAI%exzDeFEhoMZ<zr12n z!<1eV{X5OZyhXUT=2*$U;KNO3PXF@KNU0ylnB~YHSQHRIhnoSd{Ua5#A^~y58OBVw z$C#%#S>b5nWt;q~``1OvdKKnf?gi}vx%n+)ZsAWZf|=o&1BPq3F&)D#Ak3n~aJC+W z8kzrU`TL0r<H@8R+1c5rO)sskoLo^KDX*xls4lOlF1zmR<0IGAR-AkC%*yJ)gHFz_ zE}hPYyvnk=n);f_k^UEt96F$Xt~Auhg2I!tXH?YHSJqUYd-Bl!1Nxsn;LJg1_CNCs zqSe;blvUK%*VK)uE1Oywq5T``NN3j2Gq~3<sj9N<qKfMZYp$sv>cGimLnjTMbXMuW zih)Bb22VQq`0Uei!=pwNjV&BICg<$q^Cn(QUb)9-OT&D`-%iMtCaJqrrtIwE+?uk6 z=@r$H`s~u`^6ZHfkw|6rl=|Y_@Wq3Q^RCPGZx`3ks4kvdS5YAq>^G?Y;Qpr<*G!sL zU##s_JULPysiQ>wk(qg24(m?mm~Q4^GC6sj{oikf?A`^ZWRI_nR8FtFp3JgG)=aOh ztg5IpWi!jaX^|#1R92PO7i;?$�_#D6J|pWmRV6*~R&FHB;(Jr)Q5MulnM6X)e}K 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 ZI~V4h71I@$F8jvyBJwUibhhFp`#-P~M}PnT literal 0 HcmV?d00001 diff --git a/src/WinLibs/freetype-2.3.5/objs/debug/ftsynth.obj b/src/WinLibs/freetype-2.3.5/objs/debug/ftsynth.obj new file mode 100644 index 0000000000000000000000000000000000000000..8fe89f5dd3a4b4fa2c87e0dd8aa79e01330d0b24 GIT binary patch literal 13645 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 literal 0 HcmV?d00001 diff --git a/src/WinLibs/freetype-2.3.5/objs/debug/ftsystem.obj b/src/WinLibs/freetype-2.3.5/objs/debug/ftsystem.obj new file mode 100644 index 0000000000000000000000000000000000000000..9ff96afa595ff6f79188d0677c96f32acaace16a GIT binary patch literal 12676 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 literal 0 HcmV?d00001 diff --git a/src/WinLibs/freetype-2.3.5/objs/debug/fttype1.obj b/src/WinLibs/freetype-2.3.5/objs/debug/fttype1.obj new file mode 100644 index 0000000000000000000000000000000000000000..3f451f711aa6f0bd895b88e75e080b0b0c8481be GIT binary patch literal 13487 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 S5@0@FKOf}wWy3xOWB&&__C@Rf literal 0 HcmV?d00001 diff --git a/src/WinLibs/freetype-2.3.5/objs/debug/ftwinfnt.obj b/src/WinLibs/freetype-2.3.5/objs/debug/ftwinfnt.obj new file mode 100644 index 0000000000000000000000000000000000000000..5558239d721280226c75aa3f712fa10efc2b4870 GIT binary patch literal 11405 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 Z7qdjo1)ErSq^1gvfmsK0IaV6X{tp<<Vy6HA literal 0 HcmV?d00001 diff --git a/src/WinLibs/freetype-2.3.5/objs/debug/pcf.obj b/src/WinLibs/freetype-2.3.5/objs/debug/pcf.obj new file mode 100644 index 0000000000000000000000000000000000000000..760bdca0b7285141db1284dac499ea20ad8a022b GIT binary patch literal 57216 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 literal 0 HcmV?d00001 diff --git a/src/WinLibs/freetype-2.3.5/objs/debug/pfr.obj b/src/WinLibs/freetype-2.3.5/objs/debug/pfr.obj new file mode 100644 index 0000000000000000000000000000000000000000..00ad8b325dc34db19a076df925aa3d710315da44 GIT binary patch literal 84656 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 Op~hYw<C;;FZ~Y$+p3&w2 literal 0 HcmV?d00001 diff --git a/src/WinLibs/freetype-2.3.5/objs/debug/psaux.obj b/src/WinLibs/freetype-2.3.5/objs/debug/psaux.obj new file mode 100644 index 0000000000000000000000000000000000000000..24ee5f6ee34b37aa32ceb446d10a4f259c7deb08 GIT binary patch literal 118363 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 LZLah|w^8^Xp)tF* literal 0 HcmV?d00001 diff --git a/src/WinLibs/freetype-2.3.5/objs/debug/pshinter.obj b/src/WinLibs/freetype-2.3.5/objs/debug/pshinter.obj new file mode 100644 index 0000000000000000000000000000000000000000..b965dbee911f5683ec5075e88c8456de9c36ba20 GIT binary patch literal 92481 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 Uebg$VW!gQaKuMgAUgV<xKT_J!1ONa4 literal 0 HcmV?d00001 diff --git a/src/WinLibs/freetype-2.3.5/objs/debug/psmodule.obj b/src/WinLibs/freetype-2.3.5/objs/debug/psmodule.obj new file mode 100644 index 0000000000000000000000000000000000000000..c7fdb77b20fdc435e64e45246b1b7c71e553e287 GIT binary patch literal 82244 zcmce;2Ygh;_6L6N-I8QeNJ2VE*o5>(dLuvzU787?U^HxYH_1wp4Z9nP^#&19QBkpB zuTK%5(iBvzpx8l>XF(+)fdoQ=X`opC-<i4h?gn|k|L3pI|9%K(?#!H-GiOela_>yu zoy!R2r)tOXTpq`MX(pT5=vZc!9=R<@%;V)J3F>^gG?Tfyxi+RkF8OsF$7uwP<0r5j z3qUdFTbgDvI1F+nz;OJHDs{;~vY1PMC(Smz;?dI_mxp@6>8x{aTCcb`&0${Qa6v!l z&T$W+PJIEZHwtBXZtmhVo5L70Z`LBYsv3!F3VH4Z{E;8|zt}gunAV#<yxv;WS$APQ zHr{y@8UHom?|!L{oJYp1*XzeN7#b}#X1l{=ZZbET%#FsCh0%_cP3H0O%PoyrneqBY zLjxXWS&TNT-CE;FTTqsto;Havw5)tyyndP4X17=y$H(WVrKjbj=Vj)l<>dmc$!0a0 z?RKlJ#Ad9sI51DmHng)MKNn@q)%6zRCFYg$tV_&5&8RWvS7%ih7&6Qm`R1(Z_-Osu zNt36P%%3@L=Je9S=vfsD(AT7BJz>mG`0GaEN{;s<gE1CXPO=)C8_bOkyWY@f(pQ)r z4ohRLy>imz1(}tzR_c}FO8c_L${L&5Oa_>mnU<B7Q)#Wf+FnWdRoP^3u$r3d&1uNv zZdV8SVRAS(&Ig^uf584%*q~1+Pt?z8a#$KH*Pt_fnYE$GQg60##^t8JOHy^SrQT$( zr2Ma3X0bOL>W!SSo+~S?oNKez+6)c)Dd@{y>7-@>t);JUG@C3|eSYPFvdU^pW2Lb^ z&Ah_Q85>Mo>Kv0kb$ayQ<d&t;Sl?_iN9$83RZW^)I)5q>mrb9Yl}R!%R{&Gyv68Bp zlNU^$Sv9%5d`|hFv*(qUluf4DnN_9pr_ZF=<t60{Nkc@$s^-s~T3#|~^7!->>3JFH zBzsnAS%p4z$|Qa2<Y{*DpHZJ$KCdi8pE_$22Diw7!lu7FLKk_EB_*xNScef$vHlO+ zt|Seb{>KeomaR_(PZnA9sg2fpYpqqEYPQ*|Hk-N0YI77qB^#O?L<;^7NvfE1iM{eN zOQXrU++MjXH!Zz#x-#c~4Y9Je9)tZqaW5jiPD%U!ifM4vH`Ev_|6&6ef90}F4BLr6 zuS}nMIcK*SxwN!O_74v*7sNE$oo2(xHJPgauJXIc-!daCEoqV)gb9klpZrS~I4&Iz z#2%90UGO+Tc#`eoR(OnDZUnWDtOn`>CkPKwfXDsiT)xR()!b+?T21DvWrq4@Gn}5k zFKJu;$$hZrK+e+-UX0^?Ij**TWm8=hVFDM(sg%yPpm;K??TgyK{_)2j#0eU$&5aI@ z<eWoJG;&yfUdS0h4r#GzSVOZ(9o7)3)Q?I{q#=$xb>pcSPbN;_wDixFhJT|(!<;AS zu@jYt)6kBb;WQjY&c$iSWet&De?%oG4PWEwzthkN8n!W1AE54++BaDpbO48>=O$$U z9M=bw{R{;uHfMA3Oah)gQhpl8iDVwL012Cm0A~V@2b>RB3`n?E3U~wH6u`BBQvvS; zoDTRP;0(aW051W277%TS{{ox^_zEDRCGk~2L=oanzy*MN051dl01(lN_$go|;9<Zk z0e=9z3a|^X3UCMz(V0l5q7Kjt5W$uh2v`qDI14t3698?1(*W&&vjM?a@p8arfL8%7 z2Q&k&0IUUE3D^X99pEy+>j75)-UzrFP{hAAfU5x40j>tTAMj?t#{ky=z5sX&Aekoc zM%)E>7vOt<_W*tcxB;*e@P5D^zy|=&06qlR2lxo!IlxB&bppqMr=l0&<A6lho&+2O zA7bz)|N2os0S`oz$nQe^U61k!7w9j+2|`^$gI_2`!+(5@qpH^Is4|$W)#fUukucuo z6;zK&AM#HvCn)siG_u0ZwmPOjH%;6KXCBLNt%OK+x&!ge2#7Kvo2Uv^eWG7pQbs+( zAqN5`ProyeZlZAwh80xW6)QkXiN4cPOQT{D$TPDMvU+a-g~KgEE$S@AAAY0~QDRbQ zDd&wRqQJC~OxlO6^9>eeB3#WwE*f|Ve8kTWm`5Z`YfX*a%(RoJHfvfoFGM$=XE+p* z%tt={GV%0?l>fvCrkhU!Mj-!bKr-*o0g`(E0wlWp0wDB|+XP5fB`*R(kGPirje!3K zgr0D(0Fv=;1%#Y)+W^-Bz6SU-;4Z+I0bd7v4e(9C-GI9R-v)de@I%0N0QUpF3-~4A zdw^d9z7O~<;2yvq0Y3pe0r)wf8e{qbFdXmzU=-j%z%0N+fF*#30cQaI2axFM*ML_7 zehXLy_&s19;17Tfz#joy0FMIR2G|C8A7DEmnUCXuME6breg@bD_#NOWz*fL+z+-?t zfE|FnfF}U^0lNW*0EvE_1-ww_en7q+V++9_`4OFq;haA6D9SJNnFNQ--wwc=M^ZHW z=i)Q%RhC9bJn@-&xfpP`u6c7_5K`s$e?Jm=B>GhX{c12bSZyn*h7b+A9uznX)%C>P zditT9*hsFixq<1uoeM>F0J20>Bu2r-L5HD;jQl1Pk+{~ijI<VxG8M>XD0F!%yK16S zG>jbPoF{@M)hNM_=sVH2RP^0oXrih~^q*44jYKI?RPuyKqsmxku+bsO9-Jw?t9lZV zhnXfnLWJy@YpK1F_0fkb@Pn<UKQdtQO#BY{kx`Q8wIGuGehB2KmnAw(SJMRIN9LFK zSE8!}GzU5Z{*gJ~0|;Ns?FGySgdT}xz+V6^0XzUmh&%`gThAQ^d=?OTC2j|VUQr!9 z0!Vc5dqARt@R8y-fUST;=h^^=0NVl21492q9caQ>sJ}b~n2P6aK%#r60m)jv7qAHM zC%`Fy{eTUC7zfq0UjQG(^KXDp0%F|aGk`qcARfsW<sW=DI6d4S1>;$bKeW%ihrbJT zgW!-lhy%E9!C&^{jaXwCY-SQvRzVo-R5wW57yl76PQ<+hRSZ;eh@_LJYU*l8tSHG< zCKV;(IwVmdL2CxBMZAktD}&aO#ZL-tGwJNJ_^Qr@5Hbcb|2jZof64E8@QaM=1wbMf zn*hfEz6h8OxEXK);46TLt;nX6SPr-qa30_`K*AHqz@PX`_!xjcGGg*0HYf~G<};c9 zq6_>!!69|t!rxlRHTw;-K}4lsh-9x%dbs$HXcOt%X-WK%LpbijQmW5RzOSGzk}#BT z*k-mj*E1KdFda^um;f>}bQ0ijUA37oyp+*HERC%8)dss{g`5E}(NE})@*`s>^Fu7x zr&6vP<d^Wn9WV;e8!!pb2e1&(7m##^7*kvT7!0@=Fch!`Fbt586alyla5UfzfO^2y zfYE^K0LK85csUmEe!w_DqUZ5|PXZ<YLN>TWK*$7_3<w$EQUG5EgwBd@0;U0yxf=_3 zq23W6ODwOeJm~Q(%R@TK$6X)~1c%gtK6AJKAM(&h_8y62A{|`(=i?0cCa-`S`#;13 z6iK>7#evK{5gADw0x+*cVn`MhMxvU-gy4OYWHKt`@Q_p{;o*huLzX344%s3?BRdcm zp&`{|S(0Ns;v0wz5#Go@!Y?92t~NdgbD>8CtUttfz&t=g9rl*R0zlYRDnq4!Gw?hK z@N&S(fVF^A0ha<!2fPLlF%XT<W&z%c=Q)6P1EODXBVak;Q-BqKup?xXT6_s`J|OG` zw*YVlAYv%-4Zwwfy8$Z!_W)i62*1NE2K)ig00=+9RRazJ)&j!LbBMJ>GIooUAA>yk z7b_(&lk`Vyj|wUBOl&;Sg$rek;E+0F@OS4hStH>^gTZKNbXe`u9srRw)cY?#GK)ma z$*dATF4-$GW6UlW1Ij<rFPSq9V78RG6k{T^*Z_&evI7#5ngI!YSOfk^zoL;(e*bOE zWDdt)pkD-s^rOe$pT}%>V2jycGga9gHnPb~H4HWX%Z~`DJZihN5J6QUqs1;Lq|Xb- zdo9L8=(rA$jQ4s#!rvPK^?)KEnS0kcCVU`2S9?O*kmvXoqzf(>FTo*o!tkf_$A9z( z|3YTTP8XMUvu&Bh$hL;$3V()j<hscZdQCUdsp=Bic@Qo&QYCYN@F3r%6+#E$0iiWT z%6}eXB(!0jE_wjI2uSGM3`k^F3wk3FUEi(9W|Q4Wq7FzG7OOP|5FLT?5M{kAmrK;x zG0kp%CN!fKG2rFcyq-L}Y|f<Vv!_;FRx-O{{_LsfK(1k^vtI35W5%3mC8b;x=k4dM zFiz$h<3N?M-e9+LF`!|TLIalUiWoUVbP~RM`31Pvf`ZZQHC7brS_EN|ilTrOs1!Le zoNePU$7+I*a-%P-VqVc?wmGVl3VKusQ`!K1uG<Oq7P|wHo||7VtueQP3C3ibt!mB^ zE><ega;^o_8?m_u5=(5g^kfG3?tUR)64+N^xyD>I9m}RE&5cG{;Li%CV7i<Iqk!SS z9LpHx=B3Rzr>dHVvl|GjyWe7$=A^=Mv$2Yn<^H)$>20)BR&RAwO|mwcX#r{Q4+t*l zjY)f%!B}Ue4H8Q9kT8^$%`!Aql_A`k4ezS780J!_v^c^^|MW&jRwf;3m<wG>O@C+2 z$?}v1BJUbjxzyr-NK>{U5OVih&9bM`-B*Q=WB}t>$t0Tvr*c(gMD*wYB2bph$|#Sg znjM#zZH*8OWeDe_u{&&LLqpYcD=i?sMZ1j6+2Tl)-0wmM?Zyw8$Rm83l9@Zn>d2*I zj$rjF2)`9_BT3Uz0g;DtGj?9)TA{Xf+I0}h|2+OGj?BdgMyn()(DOz^JtZIjg(|60 zI*>_byAcM!-R};T%Xl`=W@xn6SZxior*ITUxDFDtJDtSR3U90uZ<yS&{t(8y`_-{l z=NfP%XGVS%)*gS(rB$<G0g3#eaflG8r6XDIN)~3NwAAYCHbEK*;oD5B!KBdB?n2Kj zGyIUzUWM4r-ESi6gv~#Uue;x$x~+mabN7ptns##Dvcg>N<b2k!a;kT*PVRnbET3|| z#NmL3P@+ha87@T_Nr`Ehp%Dkbw4BgZ#%Qac^Frk!&;>)$1=34_OYartdK?|oR(w!2 zUTOt|!}GfP*;v(bgPpJ+C%>~0c+%QLfL>*ca@7aQrzj?*^DF9bEJp3cd5NV={LAXC zcGe0pTfr{Ep~x>`?w>@hit6WWj3y>)W!9#ZlpZ3u!!&m;PUWyrriDaA7Y!Q<lztwu zcFM^0jOJ3SwVqDJ#f=p<LKPjHYqe9+`^|N1R8NR$YH^{Gl6{LyhSM$*+cb?aoy<B# zClhg$)h70kPDJH})MG9f@q~p_oGrivNE$?>Vlks_mH|?{0^8f}eispLtT^2LwzDSY zG&|}ojb@saz_KKrqFKY*tD<6dh;>1ygQyW50_l4rD`4i8R$V@95QO!TVl^@5LwJch zC1$aHSk>9)<#eKm^fnJGQ3RXt934^zL&c65ke!SKCZLos!h&j+ThUxiiKh8P-tJ*7 zOM*oM3&NRK85<TrPpmLOqy@=uvYJz1=?o5z%;aUPg^DIaqas))i48D4bYuhUxt!bv zvB_?PiriJKMB${_MoA-jNCGgY>#Uk<CxSto51o}^oMyA~6C+x33X((+9)UvYKwywe zR9S}&54%0?em6Kr!5XV^WsGDIsrh?_Q9RR9Z8O+bQfdhshRaeF;v;vzbr`|iimLhS zEYwadwc_N7bG5QgBvV8E73CpO>?bA8m>bQo##K`+@JKLGHfmeQwkmi7%Y?fnO#Ev| zU`hnwN7g6{E0h`4IV}!hA?abw1>`A)hzMf<m|1T%8tToK#u_VGnlu|7%vGX&=cuX{ zkP}`?H8I(zFPLeV?K0T`5h+^9=BV6ks7LEen@Rqk<*<r6+5aj8%scIsx}&z5is?mE zljc`5uFOQ>IUDwz&Kog0WbFt}&W8!1`g+x{DWPuIPUU<!16kBS_JqNTDcJm`5<D9| zTVchS3s~XmNr;X;J#2!hY{g1hBn%^V1+%S3&65|jG(6ZK(zle=AYrgFvIxd%Vq$6I zWF_6?s6#MjYN*C4yT(e#)yt~MmH}HQ!?b~hA8)eenYa=0Au-7~hDZlabdJu~{tHND zDo=Sr)Ql`j3AbljVe^P(^JZcx#m6MJQs^fhbvfPnanKpOh$W>nM%GDAU7+zKo1IT2 zT9_kup~MRvx1n%mS=IDO)IeQK+pDOZ`I<FC<c18KXsyU*9ilya(#ZfND~W}S)ke8Q z)`6f-4#KM_&ks8rCBjHaxR~HE9e5D6*}ORwQqo7F@7J<<m_-kEDEA1Fp2N5ztz{rj z#7lVsql&dv<)G%z#b7hVA`5PXsZ<DWy}()!7wL>?i9NZ3;S96Clpdns7nvnGd;J$k z5k(;8Ups67W!6SEWU!SCp~Q92RJ?y;^<5;1+Tgnw*(LNWyTW0rVh)!Dkwn&;U`m%6 zs_2T8jKY0bzmQ03`Oq!VS;_9wMFp5i4CO^7n9BA=y&hw4R)B0nNw7mS_$9_X*+tR- zNTPj~vL~k47eYAbBvV9HiG*mxlG#c0&8CzHxWiD(WSsOcT#}hn|8jV*l=(!rmofGd z!^Uhh8T>G!**ILRCsw0`9g^FkmpP|dtxFg>k<$x}2vY@eY~b`Jc4~g~Y-FV?9cCJQ zN=ijcG!dn-3iHU8Fk6n24(yER5~pV&RG(tGlE0?B9&UN7sQCDznq(cJ8Pqzm^SiIH zS;T`NUw+?zejPgSz#C64+n!{NduP9e-ZMe|HwkzC`>xI%KaAOb?D{`?FPqMBU()&q z_`?g1K6G@=icRODzPaP4+vq+%>aRQ&b@#@`k9=NMecdpR3&W=E5_I6p&pD-yi@$G` z{rbvD_Q@;Ut8q?9^M5>e%kA&kHb(U>{^F~u8SNOoS|Ig5==i<mCSzmueJ?Hjt-w(E zD#w-4{IYw@73H^{?De^F^qJ^gICJ2hrTGmjMs7^2`i37hJwHMH!uL0F+#fVQb=eV9 z_yfl_cl<IoDRBJp`>@}RG5hk@j?VMAWJUSXGY?%^`*q+q5S6!R{<`l!I=G<bYv0cU zuU0KAt$YaQfi(ZbfM=HB@R$kjbks#(6?*g#_NJj*zWgtxnW^zv%PQmbYu;G5?;QB^ z0?q$o_C42bdhy$xmgg3J{Y2sVLC{0<3u2#d-P`nP=&10~$LqtN$DyPVo3_6EyB}!h z|8Cp+{4CRp{#z$iOvM>G&96Vc{=*OQvR}OV^4vYi!Pnw|H5ePfzWljU?-vyO(qw!m zY1XY<zG_^FOC2<yt4n?HefR0}W(!rXe|6jb)g1Q~%}<Mr>7HiW|I&xIfA@CQ)u*tr znde5@d3J89{*%2^IxDRCi#%_;=?UE9q50)iPkgjx^QBj9ekv<t_e-raagIv!_uGd| z`+`QSI-l|M6(!fs{)pqIVe{0NFZginyH%?XndbanJFPF)2M0M%)BL@DH*WmbI`{9& zXD@Gl@SUS?V~^T{)c@kQM>8JD>944(y7txy!u>edoka8h(EBF`K3#s`fsfB^`st7d zHawrB`SZPlzAEpmcun=h-FJ?dKl5Ac+3H9;3(wzCG3(37AoY8f&t860?_r!Z(EO#N z=cU*>Zx3Ic`_f~1wqI~_{1%!&VdolS@SX>bEd1il>6@}<q~cBo&G*`J{edGJlkyYa ziMUQ3IdT`|(37<P%((i!v!42WXy3gV8B?yU#G%Gin*Yu~-y!Ry>B}3u`HqQaHAdWz zqWNL332z?0<bnVE+xW^ysgFId9Ou?Fzgd6X=>uP+7x?^U)x7=v%(XZ(!A7qyzyHnO zDh<AGK78h1T*WH`E!X2BJI!DA?+<QC`^wPRc%1*94;xyDdu}v;(fEWV|2hyfX7^9e z?3r3KCkp3iIG4aYKD_zE!@CQ93fq5UgE_Gf2eSRp({m^z7c5P~E_`F>h+X(LnU`f& zHmuYu#TUEqE#2!>?t$Z?CtH40%6r1VV%x-Nb^lyvhGvJg4qg8PebnGqx}nz0TE?Yc zdSkqX-WYF?ukq{Iy>h)>zA?T`xiMRbmjUW6)&B@#wIo{p%Y@PEW%j>}j_3f(_kUnq ziUid-hz$J$J)mJk3)0XP@usgk{I8_H#!*|3WsL0~p}yW|f&l*YnKL`CZfN@ZlwI`N z_TN_W;jPjeTK|KY8r~{9PD;ajApey0t8uXFW`Cc{iiLG#(pOpjhb>C)?o=ABjWw3q z${I%<R><amMrO%NLjQw#RJbA2u2>5>@elAvZW<gSFBJR(J-{NZ#HM@0Khm^~Za)4a zO+%3kO_qP6X=#4{fu<E{X9?EBUvumR+dts|6#}hzBhK3RPqM%@IQeTVFqv!qG6#(| zyeL^C>C<27-tgC*Ao|9EuB>r?rSs)Y2!I?lX_m%%;z#~M6U$(2<>CKN!;l)p;Mj)y zXDk(T9<Bf7Nr%W;tbbpohdXp~i9)97f6qxp#{Z{HyLc57y<-5T#LP?A$C#^|^y2|6 zO?vX2txwipMKh33GT4KiJ>;Vlm1okDG-GvzVVN1Ha<zD+ljP5(`J@uc*q%N?pqIhO zy<9hLCUz1?%9EQbrF7g2O5RIKUZ0XTq~xVy_kiJMNGTn+Ov$@O$=jmj?NIVMmAq~x z?;Y$4V9^Syys)k(DNoK<O6j=SNJZ1Uaw(<bs*#GJc{Nf>$Jvn@L-UqPDIKTAI-a#h zb_PgF$IVpo<|=usmAth|UN+X&vA}SnSI0=olUpt2>A1I$ilce&Nhuxo8B*~y?|_uj zaYv9!pm|57l#bq5X6@aJwKz%XxKmQflj~LTe0^A{Cl?^4bevwvi&65@mAq^vZ<>-f zQ^}h<0yk>Wn;Z9tl=9@BkWxC1oKTZePj04^(s4VHN~0KR?1qt)Cw3TFO2_R|@^&kE zol0J}lD7{#w_|B50oeQ`DNim$O6j-?q|#~LWl{><RqDN`)JwrWAj3_UQaUa>kmE9F z%c7LR97!o1cT~x1SMm~q*d1Co&LO2dxfN1M$L&}04k>vd5cMqDhe=9#a&=Nl#~o7g zzE<+WLpW@^l2PiVl#VMx3PV9&v6Rwrk0OPkAn!>jrQ_Z~3W9>XJyJ@?9Y+d6fxMGa zO2_e`<n0WSr;$=RE*vRLC-U@CO2<t^3X_PuGAX6w79)kpL7quU>9{7V-C;M{EKQD7 zdif8<oOBJ3OKWVdujd-AjSU9d60H7hW_*XB5g86#Co|M@*gUr2D%wg8@6+2^7U~$_ zjo1UOXgDl}dXuH5hO;*};2<6G4F}I@B1f!E7Bt{6V}qrho6}&fHE=eA$%2De&d`K9 zD_9$o%=P%J1Zb#6%Y+Df6FKLrw_amztTmIWc%`QXmy(R!R8+zDENU5;j(0^3MkBs# zz*QK{CQE(2fwRjA+)r!9p1YBOGNZu;!i)@<@UaFQ`KMu+@B|#|&%DA|Z)o6_He>9j zYA~g_p_+WWp|+7TS<$qO!=*slnV|tGJ1)Ai$~H@F9ma~wDvkB#8Y#sx>2aOKzJzP4 zZ?@z0Jurx?!xoPjJi<}9)x_Cxs$Iw7EZoZBt{vxCZl&jA7_hb3#?|1a8V*8M;CART z;FxJoxR{1<;RW_aWMjvQrpWwo!zKvC;lPJX2ZmaLR}9LyNqF&i3f^>`hPPa2;LX;V zc$;-LH;0?cUCNc?jn;YGe7whc8Fx9i5bv$vQh;%Z*+IutjU*#g%9Y1wv{;N58@?}r z`|pS%>_)52%-BNl40un)h?kHt9<CPexLUZYxg~hFwE^$7TJiScQoPq{=N!29ybN!! zuE1NX*U)}(tqGj02GdD@U=?Ap!H(V>`1pgFW0QrK@G+-k{>l9&Tzsh|a$=-|UI~8H z)LRkJflDmQ*o;^G@dXb?pB>d9Sn_<+4r}pgiFzD9vO$w4T1zRTPmGuv3!3M!5F_(v zGSt@M42=OIJZyFeY0wlC5e@^ips9|lhQ8q)O4=)Jja=DRh#2<3`cX(?kLLP%OOxGV zCp|dotj&@bvYDp*KtB)~N&4y3)YO|-aEx!bGE4M;>5o%=OcszyTBR3wWEHAwZmc!f znj7k|8Oz~w3616@&?ka#ZlJ?1nao*jrWyz#mC2b*Lgq+-7B*ngn(37!gBf}R#@g)` zuAWt~N&p&d#wDCaaL!KDz}`&xXM+u>CFTNp$~81|4p<K}F;v`SM;)nGXQ;2Css#d| zU-NKr2x8Sp)W8PDb0*6&3xuWGM!us$gvkV3WQLZ}isT$xt_m4kZdJOqnQL)IPG^p_ zY({?#c(KRQRKJqxr&8C58*FT9N*K>em_AUZmne)aVbfAV8C=39qfBP>WQIA}1#_~3 zIhkQjXLY8#)S0f-na=9WX6?>lRp+==ougEp!>Z0<RV&zh&Sx0&T`=Y=81os%LRM#? zlD~-I8dyFKc8M9F!-kQU<cUZ<kw!XfI0vG;u-MF2n;E9r1rsF_Ch;1;w6Hpok)f?y zlsXnxr;)X5WmR$FsStwu-BNR8mmkepSyekDy_sP&yI|l0F%m{I!&u4ctW@%^kyL=X z3wr}D|8Ub>6out5k731kY8)$JWZ0u3Gl~OYl}m`HVoAk|D0OKL6)+_Wq6$qS-iBVQ zfxx>y5?`Wpj4~w+G-sN~zVbwTjq?FMM|ptnai)n6Ql6+UQl5zZD-YDqIjMD3Gs$o; z^QcsjJr(1DLCLRHQpA!f4<;q$v=sQjk8CrPRD+UgR8lTVuH@O3l(P@SGd0A-!^SIf zf?$X^Z3F_u*V8#svdR>pV}oE`UTJtLkv?g*87O6-jDblEOlDvT15+88#=vw2W-xFG z12Y+z#lUO^<}fgqflC=EXP|<Cc?`^FU;zV{F>pBp3mI6%0F5#lAWjb46eKpb#^OMn z#MzpgEQUI69?@)8)9IQeOiZ038q7to0%m(yn%NSTo+N1?dnzRnA4`@I-y_wLBR}?t zYb8n%HooyGE$W}xBq(z<hq^F^QBLAas=Q^)8nFji5{V~eIT$Jx^*UzvS=vq`GdWFz zGx>qAsLo<D5r;w(b{gF&l0bCL`2by09-wQ^G|@HXiMFjg5nWRrh_)*OMBhpp-8<7n z1(hd4f%5?rC=Z~(nI;q{Pm}`XiBO<C5Y<#3n4wc1nVu_;)G#Pd%q21|Gv6tto#t4| zphjCt%XV0LB#uQ&O3EX9RhG-Vr<A6qTuNWqiQ;fsIrFGe+6B+W|4N0!2|{GT@|iDY zY36gKv`b?y9$G4N8L8s3r6Or~EV^QO%ri@Amv&wJxKuctNao5}5e=GHQgQ9<F+Dva zEj>M*V=zO4nG($6O6##G;7Xy}_|Lk8n@NN8Sx_ge2C!k(Ox8^0R>XB&1wzDXQjxrc zsl}&<Jb8b96d%W@@;UsFFoU1RSMhax18?WA;am7y_;vhxegnUef1H1Yf1dw0zn$O3 zzs-Ndf6gD`kMJFQCx4Rf=6m=vd>=o+5Ao;tU-)17-+4|D1ht?Q+y$NBCHM%wg1-<T z1PLKRm=G=`2${k};S%AXYOzo)n1mXkPPkgA7aD~o!6rC_Wx@*K8sR$O20;{739E%Q z!dl@rVV!WNuwJ-F*dRP6JSDs&RB4(t*K5{jKG$?=!n9@D#o8I#1=<E}t=6HvUb|7d zTDxBRr1mZC^V;p&z1mN;UD|`%AGK$+ziUUiY25tWrmA|??+g2c4q>UPR<%|gq$$<B zr2a<brVi#NsOPEm-23W8>`QzrY*H6vjkW;a3^H&f>Z{aPJE?C_f1uhaJg#oyeh^mR zt34xBPpP)3ZsRPPWtyKgSEz4R7pwBrf@*_mfiRK(LH#h7=$5HHAe<H=RLQDB)p*rx z)#a)cs#{dAt12{iXl802(mbu%q}ig`t@%*%mF9@%X|7M>ruEUrXdBf(s!poTsLrZ> zQ~9a`)e-6>b%uJDdbyg@p4Ap<v)nq=uc_lT$=YbQ&(uTeC{42FUbRk>t$9OzQ2nd= z1@2|;Rc<%84_|}$mTToY@l}Q)vi(5!MreZGN5j>v3x2;{AR`m`|G#Bqf$(=^WT!x8 z_<-=O@B`-gv@j$Hsu3!A28vZv=`7T$meQHnK<Dsv)d#ABs&7<Ip1Y}?T+dTaP?v!B z^VC;B5|*eNF$*_fw%4lfRX?uYq<#rA@rL?+^=IJx59$teFXrP{%teqUN`o1~oRng& zD>PLa3*>hhmEb#u&Hd+e_B%CwkRwh@Bp?hjkgUzbOqWp^Ukn*<pi)j`d?Tcs$oN}S z%8873LCViU&WV(da*K9LbjxxpberOKxm&H<GPj%E*1J9Bw!>|Y+d;RZZryI@+_df^ z-SzG%?uG8t+~>O+-Iu$sao^znnEUhYJKW!P|H%EI`}giA+<$UE@2>F};SuT)?xFXH z@yPX<?y=CL&cp6;jYo^eT93Ot?)P}q;~9?^J+^x6@_5JNLyylrzVbNYam?eS$4?&T zJpS;|>b!LUx>34lU7{{eSE8GytI!#BO}guJYjqoRPw8IL?bLm!JE;3XcUt$ePUY$A z8SR<kS>QR@v)uCvPqU}Z^G45go)3CH=egbUUC+-wzx6!sIpE2A`FMqSC3xj}m3hte zs`6^|y3T8@*9Na=y|#G0<MoNxL9bS?(_TM&>AXX|W4$xHOT91kUgTZlZS%gt`!4T? zy*GJp^?u9yWADS>C%lKe1s`vpaGw~T6rXILBA-&9sXjA(%6%647<_8UX5ioa!7$=2 zW;KV2#U8Oc=Yf4`PwYl|W2bQhb`kxst2q){8Hih{!MOYyire9%aB(*R@57De^w?jI z#twW8cC_QL51zm!a!Fh=-a}5s&hc36@n+!b1zC6(JqO=G$-{fg1zaKCmM_BF;}f`v zT=8Gpf4TzS9Jvy<uj+4(ouMy=4gK$XQJk_Hg^R}*>_>6jwP@lxd_nC7d_7I%TJX)Z zn~<}beuQTYzL2(-yY>H-#@kTicBR%j?hbrW?Jnh+<JL>*yD7YfyBA+pyU(Tk?<IMz zgFB8UPQV6taVNP`_+HLwu1A`GBkb}SeC41Iw+IKgLD=ZC+&Mb`KXbou=eb{j`5X5; z_Xn;I^E{(OpisrDc@3|nX*b@T_drU=lifY22aj)$;JYIucwgQR{(dAMzz6a{d@vuv zhw@?Y|KWTDAIXpA^?Vc`&5z+@_*ldQ@q7ZG$S3j1d<x=&G#+0D`5*k!`3ydjwv@$Z zBkIWI@l^}@g)+SJPxA|TeBT1UB7QtSfu_jU>K^8v<|gvRd<kF5m+_N$eB%PYDg6E1 zGu#XK(#14>I(*Y5{7ilpKbxP!&*d-W%lQgKH1qid{AK**{6c;ae+6I3U&&vEC}%Nm z;H!BfZ{p2-4PT3>$HHIDFX8JE{WS7czKLJT+Ykpi_-1|?znoveuS84))w){vmujN= zi1vDqyL7>xw|af(Gc@8d-!8xJ{Od+u9@H4D51tw_Yt$nV(?_4xFVX)Hl^4Bn%(pr7 z#_gG;z2vout(V_&WuN)khF#XY=HIWKzN+W8&+i`n(5sK^e){LF-@og(*ZAR?Pe*<F z@Rz2NyP&M=;JDw##NEqx@#h6M1WpA)xo`!-qP4=t$v1Hy;B$YEasO&PHaK7w`Cm`B z9_#CE6#2IP)2-e0;@RW0poM#v+a=|+w)J%knb+_F_Z7bM)CoB|&$}`7$bTRExv#6c zyUQr5_qX>Bv~_g%E*B$TJ<-=XWELY|>Fn)2)!Noe(pv|*y4wM_8`Y2?Jveh~EA9BR zu0Epxu}SSVi!rYbo<82)v0@GP9;R#trr}Dkc&XIcGtM41OFca2(!=u-y=_uYn=rtZ zp^x|$DSx{{s;^1KKg>VNA86}l?Fd{~M_)&Om;EMui*g754*!vJTwlr@`ax=^z1Jb| zU-L($!9F3EAEj-zaPRQ_Qq7|-)IDVp1aBd<!`bkmo}rGufsS^{UQrOb&vY7ERCfy* z1HC=Hc2TvaK|sViRhl0Tnf+&4kD0|kqIysC_H--}d39e`Pwh?IUWCF;!U}0df05|o zBqBN_XrOFq;ocYSk#dgx+}7H6x}&G7wNcb$l-|mf3cH05gdbHZl};6;idLnma*uWO z9U~L-8X2|lx$vLXW5+sr9Acy(b)z<`gcCxa@Vj$hem%}+GY1T!>K^a`<hFEo^>j#R z+SAVQL_@wLDu)In+NuY7&$PALM1ED-tz4OEzUoHRyQ(i$N7XN?-&F5YA2O&^SE}k% zR%cHWm_TbGR4qdvtCq8dh6ar)#LIW8US!hd)zJ=lHLT)3R6VSES`sXGsnZig6jj?) zJIRQ5GEo$HcMQFS*Qq{|hR*9~8?6%3&N?*$?IHD(>StS>)J!*P)oOK!dW^bOZC9^t zZ9CQ3+TYdM<K)tt&SbnvP$#PAcl3j`?Hx8jovWU45sbH-7_TyU?RVx3bUHgPLuaR2 z`-k`U36Zw0W3Ao&1AV=xT;y=4MO6KZPS7owY&z<567z;!W@${Xvx7^eu^T7d$xTxK zs?lj;G>bJWHP2~Y(wxu?XgRHyHe8#oEm+jT|D+L)G2ZVn2pV6_C}%U-$NNAKjL)q` zwI)rIqnV&t$g29VX%ZuS$&_fOXf7dBvWpQXiI9I^Z>vM(eTigh>NKztOfq#+xtCd` zY0<3H-0x&kK-aO}GXt<zs-ErvLrb()^Vo^L4ycl90~68PEP`g6=3B`a41J<`PxG<n z%Xg`04So6{HETnkNuz)MMC<9(tx^L=PP(vEaFKK$7aqp+4p1s3DIYp(7qrpZ#O~Jq zIt+vvV3REQw_kG;--qb^5^a;jz`bTcd#ToZ5z#p69HXYwg^&@G@8KqEpVhvmecNrJ z+e2>8y1nLh(A~{F#{DYy7u<Kd?{`1vk>b(dVW*nV!hNKDSsGjyGfRAcQKS7t`=$1% zw%ctEo18Ev|Exk}xQpQBklE4>Xn!WN^*U3aTey$ieBDCa^lr&mQcQG%K_i|g@-1na zLY!9p1Ient<6<}8lju1qS@k`N6<3>7ZU(m{ZZ|4cTrFAg7VZ-_N&nBD>UFH*gWT4- z-7Twckks+c<4&f<NVa>Qn>_x`I>BwX+dikT<~e=Y>lT&UcW%es22XTCmrg^1qiTm6 zb8YWH*YU27c4rT!dcob>J;a$Y3P!I-!oIpeg{9Oq_X=w4SMmPt`R>IMpMoT&1UON{ zowhT!QSDymZg;=MeWSBHqFpj2ea^h6YFqdj?svEf$1{Y@&Ke(D1^1WTUz2=G$e9i( z=K3@JUEMIKs{7pcNp5MaO>jT#-s;5DV<3I~9i|rkPWRK!>{PqjL-6qSi1LVaW=36v zvQ3cv7ntmu9V(A(kJ%oThE=KuJc>M~DDEj=>iyQb7H+@CJV_|dkeH$+@=Xu3G^b&M zeO6Jw`Iov?{A(W9d90Qcr-yhLLZis<oU)di;_<Y{W{;g7hdjRXIHyzVM#x_74alNw zMk39E$6FpByGZu}#d@?eYjL+l@M!hu0g57&HuS?J!sMd&alM0mQnpbdy=Lk<y#JJ? z8?RfUv+G{by{r4oGu|`Xv&3_e=aTpOe;RD<GmBZb7*x8+x|zDGm~$IAeHtOcy}Eg= zvgO>+bE2zNHfkp&osBfAb=T`w>+aA!%{2D7WKQ{LqM*9_bQ_6+zA1aS@Lt$4Sv{hu zyVL7-${BhWdor?4rTa?P<{8!6?$nG@vr2bT_lKwN>8|$n?vCM7wc$c{bI;(Jfx$i( zN4TE)o_o7aJ6p_hHKwWt!E>tT92N&f>YcJ5Pt0-4(C3~qPZ!$-&!wI%M3!34)_Pt; zXGwUN_&bEU?bFtA(>$N`e9Q9#&;4G0SpCoPYW8aJdK9bv-CK6%s61cB9>K0{Sz_!L z+wtF~9T{Tmi(9w8@){nV+%HebCkB=0*Ph*8+(pdr^A{2Ct$pqNT_;?|n^Y}$1$%{) z;3kg9r6jsZM!_r1D^GTO31p_cCVEXGGqqcusTh;sRpE7|Waq@lIQTv<lUIW*w9!&y zF)qTFU=_S>@w&&!-C}rM$qjZ&(pWdxbE36x@N{?Uprd8z3$Gn4f9TvV^03!WzlWRd z)$4WM>kn^F?+EOQT;;t3`yWTW`@DbmN%vXcWAu5>=MA6F-gPR&*cl?9`IYlIP4Y6I zc?U}Uo|Ysw#i;U5_0IO5$K>@3GI;MI?-DZjx7grYxX-<3N@zWbzG+P=Y|AuxKdd+b zcO{hn!dvuS>wT|eN7I~iv`fwO65o*S{fzfZvaF{|{QKA}c)#KO38BtK`VTvs2t3}` zdTL<MCPw*5uH#ehlTx$YL<6K{&pwOFN9*I~qj#c)40jc}{?6XM0cUY&gW!|va|spq z7Cy<R*jd!(l>J0R?TT?6XI1$u@mc0`gR?3xnens%!%eD(d~Wr**XJ?CXx!f}3y^A) zWLIyq3qG5DwlOnoku>H3wq)QFeD+FwN%^I-YoOmC_<Zei%-NZvopIlVRm*0q;bx4` zj_@CmI3j06*@!tVv2h8^tx*^;YJ{Fl@7uC$XS<-gcXqfK-b-AhIZ0yj)t9W}E*W7T zas7x}eEoe(d}sPz?R%H+Bfii3Zui}<*w33kk>&R@gWHG)M!YcM?GXn@w2kN-fwfP6 z=P3ldiYPq+nqD5Ug9az*N^aOiRC?oZ6Zig^Gg#zoywK1+_TK{TM~rIUaNjY$DZbfE z+&g9SoGY!i-f=a^xy}G7(=7Ow`(EY3nt3j3t%-FiUz_g@zPGygqu35b*N;;>`=G07 z^>T?*vt5{++>0RzzPo+*IoTshf$k4>!S}FlTbHw>kx9*xnYVE>{dhl(pNC(BUzOj@ ze)sx4>$k;kH>|*iGsU5|4T9eYzaZwx3Qo7RgJ};N)qe4QX?}Tr<%|{MWmb$MGU7MU zkJ`U?sf?VHgs{k!JLBN4R`C=4EPggwi6_!}Es?o?*GX&h$o#IeE{rO=x`p58_mGRc zdAKm5(1j5xcERs`ze6NIZ{bV)K4ro;^fMcA{j6KLS$;qHo%av%kMb|{pXy)Xe}%tE zk-jypMx0^!W1)g2>3)BmB)TtC5t|?f9q*9^jDMnkrfkHErE!*axX?Vwg{oAkp$6he zNl^1hv#5Gx_8r`8|26)%`QPJz$p5texsj@ofg__vrj9HeSvqnaCgEdd3HdUk+W!&% zr~Nnkf5@0VRc88R!gT-b{=0}`zCVoVGhCTInUZ|Oze6T@l0@<pq8Z&C$FVMZ6pMW+ z=BWd}KN;!a!f%}mzo)s3EUovf)2vOAhS@0XTpSoF+y9?1-bd%$!Oa=DY~<>Z_mBJ} zV0OTR0dEAR2Tl(BD)7g^--B`{xA5g7uaoBM7s>G)9C@eIW`DIX@{y5yTKoDsOv1?L zMs9J6bEjk-T^83T;Rg^w%r>e=el_yQ$WsB67~>9f^bBCF*v{4_{NsduBl}05BkbG5 z?AjXcP=I$pV1Pa#As{=TNODFln`K{1@%@)BUgMBN<$$#4IjoqYNRujHK|n*moo)3( zz?A`JX-em^Mg%X(u&?3{2V5Jl#yP0tQj0^%Cf%pCLcn7Io3N8~O5)Oa8c%Uw25gfm z_tmKb_6F<^I20J|oR#?vVpN<}2>3RjUGZ|C_ch+kKM~L$a6V8Q=o1(wjq+Qk<!X~g zdBkOuKS-lH>Jog2{9H>5|5RY^a3|^0pbnf9xFm3AAcPp|w2Ge@ctxO5>Ze?4d~U}H z!|JHGz?Ffk1J?yU;vD^A$#%Wa*E`tbvM9U8Ap|}ZxTR~LyVqIyI(S)ZzunbEI%-ip z9{8T*BiA|I?^s2)7h8qEj=*!&-L~*20}=eQ4b^VCfLdc$1!;q#f)a=cS;c)F<QEhw z&Drk~m(MX{Vx`+Ma+yO28W%LhNz@HwrE?SaRZvCH6+t!9xMwPUJaV?w*x=l?+}xm5 zLAM3n8}xY4!JuP7L&1VneV%M__PQ){7MN8*{|ed~<g&Rm+Qq-jxL8d8T%8c~P0;t) zH+qixlxHk0swaZF&h|N_q{2n1)9pgAdvGW!Js<4j98wb-chjXeahC=s1!o0Ml<E7x z1vx_+*wXUbxbont;N`*31%DHKJorrTV93aj(ILqOA=n(;<m`DSb1?Ia>fn~(wZV4> zKg4wPa@oi&keuv?t`=>9NeJE?{HhW~`obm$?+*SzHgK0qK4nqxe%Yr~x`rrom3T0` z(<-W->}nK(e+|)`VAK!&N@4+JtJmMf`d#HR)=XNv<*Y3vr;EwIsYPfBDeWIT)6v(} zYZHZ6D{kj1LTbbO!t%mi4f{Uqmr?UZSw=OFx@FW|Q?wz?AqPT!3Y`_YJoNi?kC0nK z?hbh<<jIg1LbinL3VAo=qb;wz@=CfG>$R1^fNc!=Zf7uL2ZKegGMMrjgV{S74By3I zOol4tn~>I!E<BR<IH_GhDmP?$gla;)Ljyx2LSsWyLvupMhfbF2R!emkNHolsXfR4N zTq@CUnMA{t5)G9S4Oe8TLoW-h3at&bN;R&MYE(%z7D-gh%hrY75qe+fqoL1+z7)D6 zba&|9(9c4@lIXBVbks<6ESBh)E74Ie(NQb)QYZCdl6o;qy)4Ypgm#7g6#8=*ALb#o zeYw<jxzu)r)b<jo?W+w!Sa4Vh5z`iaQJCIE8BM3pbV;V_s8JJE7FHd$B<$X>7l;I} z;unX_4qN0>yG9bO-(<<Ys`IR26@OP)bC~E<v#<Z`&b}pnD(vB~Cy1ZgC&%BFF8Ux~ zSI!}Xy%qMMtN@E81*i@?;6g&3SqM88*6U(0W;u7YYU(tjw4<U&rH>jnYMMb9<uxkU zsisq%6eb+&bct9Koe^uBYyRulAdr`>-4<cgqEU-aoJI)w^f@WYFuQ0{R`2nF;j8Wx z$&T0ux=tvYw%^XXgPS+%^-*t++8gc`t`A=vesB1e@ZI4bg%3q&Bhp$CW;{brA!>~3 zQD2NYJnF|$zc6cJl6hWDcsc6CsBXf`kA{UzO)d=Os|iEHM}&vS482+knd;5z@TBmZ z@af^@PL@PpWYw`*-Yv8Y^t*&o+v`-}b>WTSYdgqM%Y#-S+!4N#9Jg%lYi!|u2p6S+ z|Bj7riBr`UA^f56XS&e|wZTKbyGF-zT&z>03s1Ar^cUgZI;XIp$E*rJ7Jf4P%<(P~ z9=+M$wL;`q51h4%{J;7-;LmWDcMc98#QfW?itvdDi->ojJkE79(vx`u$8sSeJEFLw zTiHij(koGIn13fXKf)4mZNyCxA4E=$ye#sA$itCsqXS1rj=ppBeWSmlZmxy<Ho`6q z`4?$-q28#9xIN;Yh&S2X9VAm0u`%LtGG!k#@n6M#7qK~FyEG@uqz29_an~4=D&q5q zj>vI{yCS}d_+IkUO;X$yAjMs4xFZqgBUO=}k<pP!ky%o$|47Z+j6$SeWC)|;8>Q_t ztP%b@Idu3+>i$<HSZk+MTDWf_=SXEg*9nnVM!skjB8`y^N+5Qe1Y$2oUKhDK@~+4S zBIN_FPN=LzgVb5%NtZyZTMEQ_TmrEczA5qzr$FMQahMAWa@jau(I7;2j@C(m+0~H) zk$*T5dz>-KHO}}cM?S)|u?^;%RnLyj7@aeE(dd<<*JOyQFAc)zaicGVjilR&{Xd^> z>&00uJ*qh<?|p8On{H9PIJ%aMXIQ;MN=`i*lw!C$$&snZH`-OBA054U^tR!9FFs5N zn+N(@yH0dEgwb!0{@6K`e_y!5e}(dG6<;^{#OPir$XX%s*|A_Pw?OZy573X+7wOCN zbM#l}jdFnViE}<~Fbn!veY&$3f0q@|Y^FS0U9>RQ<rr?7Bn!)=`Md72HQZ(TYxOtj zH|pQhf2=<&(X<Nv8U_72{oO?3Ka~x>!zAdR&~K9Wf+APLLg}~YUzaV^8fhqNrSMvG zAtO)fdimvRxXblD`m<5~QKO^AM2(e)_!%1iEy_)4e4TS={WjOYX*{CH$6OlDml|HN z@OExt)TL35sN17<N3}<FNBtI^5S<-e6g|lxL|qnDNBt-FebizJ;Ww8(v}!uwsOzIv zkpX`$4|thLh`KxKS&60=enr%y67nAyder8q9rDocl!iWl)7YpzQTttXJCX<g>`>21 z9O@(U)xvL!8kDyGhAgURO|);c%c19F=Ty77n%#02CKO0yt&}GA+@M{Ez9f2STUV_R zT@ihivx%#_{&dn*-`zDZ&}|l?uZzCLS+VBN73&tQ<rYQ%JNkp@{xLpdE*<mIm|bJ` z8ieTW(QiAAd@c*8R~m)rPouvlrmKa&K3cL+Lw^v#itdO$N%;JQ#OKKM@O7*BYomV~ zqm>xSUn?>69<ypp(3q$(Go6$Ln}jj(V+#L#Wc47MD3^8k55&dY-)UBlsT@-~X8D*^ zPC5%O*sFEfh7LjpYsWnN=ML`wQwK*}eBTC_2`RJ-V?G&!t03fx%r(;X=nlhuoFT?N zW_|3K*n@F-aaW}3QpcvwNJ~z;bnK?Fed&ACKhKzxby@bT?CWwy=0q9XVnSk~V-jQ1 zW2VO}j4`!!V9&kVB6_T$EaqC<JBAFRhxSCX5R(^Ee6qE#b-*I(*7ThoJk^PW_H--k z(uqO&c|zZyyt%0w>OI@hjew_772}AxA?9YK?YCH?6HW}u?Y&j4j@cOVe$1yahY8EN zS_is%8-<t`Vs_#H=9H76RV035*iAB}H}{_DJ>7fUDrSU{9g#J>DyA#ur<h-3-C{?? zj*_g+%g(7Kp`tYLuSqJhg;-@tJGM#Uy~C)EO^wZty(#u1<{LjJVij8yOZWfxGqJjv zYm1#1TNzs$YmL2D>gri%`!7lD|I4NQ7o_%IM5ui;w>|dW*vDdDj(s)uZ9>!8W2dV{ zRWSN_CiVrA<a_D=Y{>Ia;dHM_6uyAt=%7_g6o;K|(!~B4+ZB5@_P4mv%94?9Z$0Il zouza#HIl7a#kI$I#sxV!b5Qp6Kf?0F#l@vbY<g18Z^df=cw9-`^tf_1SpK(Dy?q@x zYtEP}*Ex2)%c6~25_e-_apIK3`6;{7g}9}0D_+_9O1`KM+_`IehNypLOS&p<ZNd|Y z@#!9MkHoza*At%-e|7xx@y8Ql5~?#)anHm(AGbMARQu+OYQF+e?VqWO`ylS)xX<Ih zj5{3nZQKuWZE?rrPNs|Mkr|>oAX8KaW{GM(TT}<-i0a^6Q5^#8P+*4vdsLP#ULEfq z?-lPG9}piBA0DrdkBLtJb~vyjfE@|!(ZJRNI||s*z#aqa7+}X{>*7n}r^L^QpB-Nw zzaV~5{8jPQ@ioAX19m*H6M&rv>?B|(13LxSslZMH_ShU<ycoYaer^1^`1SD{;vbBE zB>su`XMnvP*aEOsz*YlW18gm@-GJ>5Y!6`Ta&_@<#lIK-LHx(@pT~b0e>ncz_#fii zfb9uvFJSv*i9>s`#i6~xP6u`durq<31?=oRUHq>JT!K2mJ;5u%Hz6P)Bq2OO59}OZ zUkdD8^qq&k^MPFe>_T9V19lOx$LH%33KJ$IlqO6`n2|6$p*&$h!lHz$fIR`&6M<a} z>=Iy?0=o>@lYl)L*i(Q#wLq7!BH_9OF=2JW+Jtop>k~F4JecqZu%`igI<RK|`x0Q! z1okXo&j$7!VBZbw@(gvtri9Lf(}`~Bx`cNU_9W~}_%vaE!l8t(6OJStO=w3u6=-K3 z+L@1b7NDKW(9Y#(XCc~Igm$h#JC$2d@v3Zf!r6rL34bK2P-O(FRHKRwRU8GH#F2@? ziK7xnCyvP!hdw}4RcOkHdUn)n&KD9>6USu<iCKwx8RF1~sIzZ73clI8t3cHIY)cms zXC+>mF6u`>s=asQxh2*lZcaL#T$nN<r9NdF5bG1KK_j-rWf`LO>U>e_Rp6euE^&S0 zhQtRGA4z;7@tMTuGezy<EKzI77PZwmqSlxzYE5~f){NRU1){b#+b!|U#3M;zNtY+B zNO~oyGhLIoFY(jF{fUPXzfKpmb!gcF{87Lejrvg;y2QT3p~PPje@_yUv`M-opCtdJ zAk>UTO$<{TgW9p^Ee^fKqqhWLCZe|_U?*qllG2m1lk$^_l8TciB~443nKU<P9<Wn@ zoeJzUV2=fMI<PZ<oeAtLU}pn6CrguLN~%k$PijhX04EnXdBDjBP62QVvptg5C9O}| zkn~{EBS}vrJ(Ki&(q_~vM!gc$D@DCB)SHC1C!_5tXm=Xgou1>7v?pm_(x*xLlMW?) zopdDWXcA;VI|F!^0B<JnW&v+D@a6z-E@-+GxaF^*($pMP(qM96a!$G?nNQXvdn9`& z`=R19sCWY^u0h2I(aFmhn&hbD*yP0I)Z`2_yb=wsMZ<Ta;nz|A<u)X~%5_Vgkvu1P zUh=}^8<Te@pWl`%>NjoA5jAh^$QL#5=W3H{lb0l0lkLgNldsJdHTzL?AXn6UnI~!v zqQ;>DQS()vF8RLXhms#nelq#l<QI}(O5T#ZBY9W4s5zV=YW|ZcYQD}AHQxaHTVQ_& z>?6Sb9@sws`^S7;^1<Z)B!8FuWAd@&6UnENdz1T<&jR}>uv>xM2JB<NZU=S;u#W@# z1h6}S-BqAUQKh)0c%uHvZ1Fsd*7@W-bxLSTe9E|#;&dTpbjp}?@%$yoADy8}8Jm)o zl7}|VppBo<M&H&f@qA8!Tgu#&c`28tRHiIWF{RX@!|mvB2ReKemES<+ov8d8I(#Kx zmEuTwBIVh1x0KZ>Yg5*xtWVjH@?Z*Vfo3ZR-U5Pgzd`dJ@ZSaQF5teo4T!t5g_IXl zUPhI-QRSUoTMI<t&0JN=yD7h>sxs6mpQL=3(wZ`qDWn`oIlMhzjMD5Z5TizJ+mR_o z1?|XFrJPLZN$JZH^(on+J~c<wr@i_rQeNA(yoy<G*uHC9o+#|D6;gdugXtwY?r5`+ z8j%_&M<qAQQH`cfNX<!|*o8=^wZ|Z)mpa3Rr!8)&i&E{W*QBmVeLVH$)IX|))WxY5 zIXGFb1SgTqhx@whHGGArD)o-k`{n-D%l+Zj-LR-?TB9cQjnqA<U#7OD{)7;$4Yvig z1;@L3TDzsE-#_l^=^E&AK7Vo=n?cUUPlqj(T|%?85ow`mdL=a5$Ecj<49)f}5z;c! zrne5@_GXWvCH<+i@tv*R$Io`P57dc&ES22<oO)H-!m)Rc-Dnols>ZIXS*zKfW>32= z?e?^X()z}7W36Mam+6jgZ#~h`-`UxLNN>4#K7H6Q?yM8i9#1>jdiocGkoJ7qM>HrC z(zd3(A)}8OR(~}OQG~REX-DJ=vBN5?W!-4@cejEga;I}n8-%fLW0Tw4TUifd1I9+k z4MY!XVAZMq!9Ig}Y{A&lv2({RmMcvkR_V+I-0vUG{ed%JpEBaKpIR}${W2|M&(w)g zIo%z&T~#ke&!iWww~T#C+8fy1pdPz@?3-gh9E&SeSm=m6@7%E{!4`afYmaFa7dQ5+ zv8^s^1Ff`Ji<6`A_Zrn>e@%BwZ%MzsO_9myT6MZ#dU$$L`buYJ3@+;Soa!9J<z0*D zv#8sAQ?x!kC;jU5rEPt!$4+%Pg!Gd1`Q$vcCEY!J1`#Y=n5`FopV&wCCtA`y(yN@A z#q{8HOd>54$0U*M3LMrY_YQP)cXVOpbW5|4es}t#?X3d?(qf~$f2g(3ph|xseOvnL zie#>0k|{VPbCtYbqiIs5A5QPd@G=PLN76f62YTgEbA7ll81qOk>Ge#fSx7&hp>?h% z7SUk(%_bqkKO-26#dCl3S%r+qjJVcgogH>DdhQA#BPFAl&P+@6w2a)|KJ53NFpJUU zfEd8f(xgqcsWTR4I5JjbJlon~5HbuIOFHDh_)a--hfy5kZxJ$X$XJIfnnZ`_wol~7 zp4wGhN5*{_k4iE1c`5AX`+AqVXY9&&C$l8;rpz6g-C3%v*=@a0yQmE&RmQ%I-poiG z;HfhXWqg;>mT|JZ_be`b9-|D8I?5Ox)i&59MzyxpYchV#RAuTi{W3#Y6Ngy!gRJ^~ zsrr|s`T;a_Q`EhgNtqd$1+4rbsr<pSxNBn;qq^#Z%&D2zbhMh(nH8B=X4Yof&|VK^ z=w6@<(A0YbizVM5JVUegfQP?ytPszgAPwIXwLWuw=98H(wYSx`MD5RfknU!o{m*(K zLQ<a}NPU7|kgwHI_hjzPJdpWKW;<^9$o0SI>}VZYDaJoW@EFN^B(%<f)@mVhAoD!S zZkJl^7;IV{b$6C;R!Y`{tSKfTD<~_vu_fxhtnjve5b!)kgWEVHMetgp?$65UJ<fQx zS8Cz`sfQCp+{u`Z+cjCnte3NnWRJ}*FbY|gtVg>nLRM4OEo293u%U&!D(hMoEuBEu zf-T$)S$DhSUe(ui#?c~Nn)RG?l|m>dYkVPVXV&|jiVrF|rI_R=v-Z1~<XW8mciDxk z<JrkeZsL-%&SZOKk1+^YL)q$XvTl?uScBw88XAOb|Ll-f$W?T()3!(#Lw+|ji273b ztZ%66=hJ5fu)BjR`-=3JIaYJU*$cB5XV+&t=nFO6F_+=!nJM~x3A+~}%x%_Y-<JJ! z_NMIjv;UKQqFTsapZ$>RFE=Q*Nze2>06sE%OZMxskK7>p$bfF(40MwH0mVlA=K{Yu z)42taeKv>BaaU@7%37c4v?iYp;nsX>r(}c1uM~3PbFy6CMKN?WuF|yS6y;pfO4%rz zZ@rYzv{kR?s&iK4{E@569hsYwH$U&*ydwqo6g*b&QNe+N@5U`0w{+Y!2DhBGIrrpj z%Gr|haZX##X@#K8$4>Rr8$DcQj_cNA5hFAOY{=P}^RCQ>%`zKO>V%yAIXFC%LX)Ne zX16EG;vuH*x3zHB<@CEuNu|@;YvjFAY>POA+)=qP@^+(2GD8}(Hn%W$PHs)^K<*!T zp2UszcbyyPz%`T39++{v7*}r;a_8q(whlsHqH~ljiHtf;t}XZ4+*@=1l?zU?uq9!b z<6LhMa_`E0Y<TQ)w>+4Yr_Dm{zjNPkjb!fWI1QZlbH5yh^XudNz1=X$xB*PN`PIFr zx3|Z&t6v+O9QnrO4pX&bwdO!xa9(oW#Jp*^$h<W#V%U!Tej2XSwVcn$%a!LmL!R>k zeXYkk<lLEcLf#d5cNkQ8#=M3+hcdM<u_;W&6y{x<w_2XUm*go-C5KT$g+-J1c;2SG z9eMBP9dN3--AVPqZVaup`&f6^G1Pw$hZxSC9l^QpmQk<DYcFUiSZ5IOP8M8uY>77S z=X@bQKL5@9{(^XEx?{gE3Hk2%eqAJJFp04rz}%hb?dlomf>QP2ouCu&hp}(g3;C(} z8_Ys}R{mwj2c!zMLVjufO#0Aa6Jz%{>%Rm1V}poE<wzlaN&b!0e5U*6JDfqmIBGy! z(*5#pb!HY}yU-@&KbpT87z55mkCDnQ&uysmUjAnt#|9)SH<NNFZ9n99Dzv@sZ01$F zD*t>zXhBqiP{0>>!+uFYLhPn4Y_Og<PF`b+8^`Xr$38KDtI%<p!81)l!PtWNAgmy_ zVDfOns3&nDtb_5dRwytOEG0&-+u8eeXL4)L5;10s^Q|+tUQB1~S{L;!wW<o9E7(@> zR$D9Lj4r0oVNRL2&M6Z|&a~1H=h2_!kmr4yx}c-*$8ibc=HRAZL3iOQv#MaA;OD~e z#6t~`*|?dzwoq3%qA<2FwJ@{IA)f1R5DEhe!@5i&&aIVK`mT@+_Z0(8;<=xk6O~72 z?`H1$!a0TW3a>7-6)q=@{EkKz6;_c(eseZ*rPN3zX@uT5VZmblDFl**w-s(D1g++- zD14~!vBIYdUnVV`A(UcISD|DaLGGd5uI8>R+*9~b;pc_llB(xP)n8nyjwe-r#y;>( z!q<hT3Wo}RC1#B6tESN{Q>}cBMK#WIT+q01XZcuK?$_Qs*w)RqR}Ee5C(OdQjB!QI zT1m>Oqtb98-d#hqU=z9L?83OJakbKByr}rilky8xH#Muqtr~a7xCfonxy(78hvDYO zJw9%ChhvpKdffBlw$i>}Rb#*IMXZm=)+R=W_ILb@oX?GSamI1Si?$WLRrLG#i1F7< zj4JjkZZ3YV?6I=v%3djZv+R3=$GBgLG({tdf{G%Fa*K+K97R}$$!}LSDi&%ZJ5O<A zhAIq(swk!?RW?)`WkVGvt4!9~o_1nqd)k}TMdd}6Mb$+XrLh*uMPJqy?{u&&XZmrY zZHX9l(xxi9x#;$yXFGapuxQ6E65+$54MmSTS)4+f@PZvWft!qof)Lm4aQdteqq=Bc z(HBK+Md#Soyf?e}(88T4`c~S7_aM9VMJJ1T$sy2}@?o3DU|+o`%r^<+)#C%m8<d{o zJ>}CNPg#TTM%(x?<Fn{HnJwJT@u`%W_#TMqQ{#)rUq0S6-f9uXPZ>WO0Rvtij#Bj; zXIG(yesqz<qrKhj{R8B!v$Ibrm!*b|)@jDC8NYY@{t0U*v>Vjp*N=aA{IlaXJ7;C3 z!pMgi3rAr(#%~+{raT=F%hNH+$&moFcKi?H`zGin%$~4lg7qSAf$TO4<IhdtP9a`e zBF2wYeDqY4Fu`|1k#r7a6DCAV$hZjl+s;#h*Zy=sHRy8H#(uHaJn8NOi5Y3Q?y>{2 z3-|9noN#By;ITUOgoh`*HQ}=fhYiAnCnvl@{gk|j%3My&T#vMp$_yS}XpvV~Gltdj zunH4SP7FU*r<%||(PQGs)<$8%FB1jCjAUJ_W5AvGJDTCq+rbiE<Z8%Ti!d>M;vF4> zM$N>WiI-2To!B(-27@qh+{78fJ6|@e&!FLjbuwkshShQ(9QGIvNu9W1Vt==Jb?he- zpPaaP;+BaYogTymh%?<Q#pnlm9b)uDO~S<2ChqPY#Ip20EN5H0=|raIp6wc_6DEE+ z5f<w>=<hz>*4;|{30=^+W*lHTuuAx#m@D>l>Kc=7p<Y!ST0FXVeg~}Bn0Q1O>f+?$ z+~SGF(_3-v1+f+040^8}F&|d?{5vGn>LaOl<tsI~Wb^)DbxWMFxUzq+%OMn-iyIgz zaYnXGimPo<6<=R`d-46p2HOxrN^g@r<23VSG|yS|gw?%xXYu<bVI@aPe=7?wyQOTs zQ%_p(3gAs#VeuEmoyF%*<Fv5&KgB<G47B#G6!lNaZ>5LXh2oxK+^%XwCOs(qeLnNV zh*E4qiLNAo@QkiZ577VjHwY#Al5b8M)^I5$86`_gt}9tv@?6PogQ}#Uq@v^s^5FoX zq_kujH3}nXY(kTP>`mXH_tC7Oq>cr<Ub3ydvP-cMuG=(T<Xs-}4xmtSU&#|>D~kD@ z07}blyHK*ZWE-P<uHsAD*s@S4*;jJViQ-RD-Z<0RkAS?WQ7AcH(tDzBkh~WkJ=r0Y z43?_!!XF~M4p=R0G^O?R*55fsRT^8GTv}K<y|lUXsnS<Uca*+f`gZBw(vM5~OV7Rg z{v{%(Efq>LN^|$l6gjsFk#jE-N{dS;zdKvxLdr$Xdy=a3($XcRO=arRD@v<Mjit32 zBIlPWa{gH&H!@q~0tn`fpH3Dz-^rTNmeQL`Z!5j4bi*u>3;q03k<)xJPvq1G%S3L} zJfU=B>0_lL7ks(Msip{}&zEkVB642nHT*;T7qJgjJw8R2?(=s+S>Tt*jI7X<9xna1 zw7s;ev}d}=jhNHI`IH_-P2mul;lDzAVc&q-ps!GS^kEcuo`LlvJ5}5ZWgd2+Y(!aL zYmZ$#2fNl)BMyCI6aF8{zB?|8qka6C18j+!7&VEBBDN%^pvG=uLy8IrDuRk~z`-58 zN)_(ty^1KPh=2$vU5a$Xg4h+)j1l1k6agtV4Ea7=W_J(Y-ygsC^BVScXJ==gdFJWQ zGaFSm9)MtKEX8hIv~fEjrueIUv~kTwEsm~j#!5x&$v*wnKHj*0qYbBtIoo7IUoWum zuHGJu`+oT13N(7&fqz{l$OG7|PV^7GlXVfvqo;sy$_BwI1<v23AsFDrjV;}tXydhw zx54};QN2aT1vi02ws}f;8E>5xH+F99+xU9pe+^`kz^gl#p@4<t)m_55E|k2wPt>!J zylSzC=UJ%#xT##@w&q8gRa((n*R_MR<F!+?&uib*{%y;bTU59Fux0%g6Tt*^4Rw9> zJ?iP|Pt;$izuEN5ChtwsO{wf|WCI6ITPUepsXMA4P!Ci;gq6N!q~m!$S05Xx8D%rA zmA9GJS@G3#)vMI6$so-|sY<;V>s(bGGH0oZih3j1j3g?v-H`fi^*=CkJdK&-d{(|P zW#y|nTmB~Arg58o!UOvWBrT<Tn?Bt%AFFvwHhqm1x+VCN_v8ki0|~GEO`4mwZQ6^w z(E|~axdy#NfHny?xyYGYw$l3V)*i?)8fVep0d2xI#p6$8k@TB3R%bz#guWix5STM? z5NaDiWE6wU_?zl9sx_|Ij@xv9(?bm%jhz}o4Mz=sjaZG8D^w+bd(iO{jTxZ9L2s17 zc2mEGGJ(KSweg#VS$zD3+6HP9G$yk*e|1J0vo)5rb$%%3E(C)l()d+_(1Tnhv+t9y zOJ?6~Zzbm>1j0h(zCO^{Pg2B5EV20>-~&pQP^vOr!-sshgf!HF7DWD9+Xt3a8A-t| z;GrOmGa7k>P^~hJ2!LTJ-9*MlG!E~WtLBOte`>U9JkwO7B*ICQL@1g02_Xk+^lQ8( z<iL9*55y^3Q>a=EpI9hrPSdo~bkfWaC~B%`ey6!eb2B4^rBOoIY!JdUS7@%sc$S9o zY_=`Z+@=W?A}E3%%Egr7uy$-u+S@7MYkFx0YDO?UpQ3tJC3=q6Ou;>$!ab{kJw`KE zvjp2?NS+OaY(5r_)x4?2*BY-iN9zZz6<R{AFmt4NU-K>KiroV;pdEyofHa?KLR20# zDjUL2KvYywwqXRnpCNKlDB%@!ijmeQT3=#3Jcn&BR!oi_gvL<LABox(Tcq`?)=t@= z5NT;>>5zCZXCZ|LbLK<!3Vw;!UYr0H)zkX|TvUU-{qSdK08EcPLoY}rrk?@An|C4! z$`B!~Lt2*we63?zr?t*853?u;EdU5<m1tFC2xVaiEg%giyTr;`e`-(A*3>r8Hqo{c zAg#w*ue#q3cEPYgws4X1gS7fcEF;p@ETr=-wf+MUWssIi%s|6{B0E96Gukt?=W8$0 zUaq~C(ji`vA+nU}IG5~TEQ#TgSHIKFnIM+Pn6W@=7#xIz8xXVA_^-rB+g{rf>H+Xx zYrBE$HfMk!|Ae7WqB@nE^=R;X0B{A=x&&LKou+-3wGT|fNS<Vev@5kQ(r%znSh-2P z=LxA<%?orGul+*%?PmVwiJQOJEZA(h*=ck8<`D>G2lomo<xXsuJ*TcdW5+IL$KKQp za#0{}?&fbcFWJ0y^JZ3T;hJ<6S=DB)3);MG^Dat85i>GMI|Q_<<g!Mo`L4>F{WiyL zKE1hc^PSDVQ#dU}e{2pX0Xv42N6pdZl+7oJfTuZR*wY+#TwuH(fG=IxTqBk!EV7oq zs@dE~DHCKgDhdQr2_U@$7C=%22S8pYwD`BZ?S$_Q%y+Xk4`I4K>orjx!3J#^x8*Zd z5S~erpB9?;rm`yAb62!w$(EI^U7$J|(iMOr-Ov`zEe0$Mh3r@_c?BvAY!Pp9-V(GW zhcp%oB`Dn-ZSmORM^UHCq#BwjL|Y=Zr2Y?W3ln{)V6~GQkG@}+#1n4m+VXzuOdUm? z4LasJ4m!a)m3j;HgnG@})^5A3|B1euzP*0Bftf*v!SMD4+x-P-OYfFfR4`vxKfq}I zdNcl3#jPK2osMnpF$_KZiWCnNrkX2l{cfwvR_WHXt>A~<s<zb*^nC$;>*}o=w(3xu z@?%!9k7BIsXzQM>X4Lad?DI>c+j0g;k*T^}l9^wN(AJQxocw>`Te)mlsQP1$wq|e5 zBgpoBN_7e5J==P5YxCB7TOVzG3hb1e)J!sN4#?scY}nluYMaii=Y-u|q{HqmF$8dj zg`&<xozHb<>U_h5%PEm^$|O2KPQoJ#wM^Gpq_YZJ38oVW1D~r9A{{NA?W_fM(kS19 zCa02%x)suK)A6B#3_6*p#~6{KPOMIf&S{+jR+6$}wfe6atG*T+a8M~$)VZW{TW`D` zIP!4h<17$oqj@WI`gMkNm2~Imey6)lSFC$jw_LYT_m*y-?i)Qm<^>{#y!KE#MLO3? zcQR#Xl7TaMV1N{Z7sOHPXfKo5Bi+TitLbeu*U1s-uGiI~B-9|n?qMOBdlX2t?k-(Z zOrm=*iMAIZT?gGT0n&BTm9#-5C&iFNJss~ld)*{z-w+;zCo*s<SV-pEh>`9w-Mn@g zC@!sion39zUR=BY>rN_ME9vJf5n2IbYSD!V077c^24k&mn{F35uo#N%;dC5#W>>3t zP-M_ZK80Y+2a(G{8>F{LkBxsgqsNVZaCJa>dV2eMU}h{TxKbgJJ8b!Sc6uIq=ULmy zY9Z3|)e8cx5VW$fuVnUoy%@bCdgm~3tsRlx3B62eBEB?m<LO)zukJ2LOmLB^%-5^K zLXt$a$4*J_H@yM9k!_!D`<hO7n4;IF_nh7z)9KAHl^w;Jb|Q6L<+E*Lm~KWEvFv1% zBic4++j62d7#MH4;kSDR-ww!N<VyC++jO=WZ8P5%vn_vH4U30!*pK{Tfwqaa`H)|l zvdxM8(&7(ep3|-T6}D_k+IEWVX&#sEWfB{i?fNQJb4~?0@VDLE_F&sTbX|!ru(@SB zq`CT|J=?mrL7})_qQnkL#+tT2+N-aiKOW!T2VH|V#l#WmPuHJG0sbUiU+BF4H#DO^ z_tFjNFV{D3we{!yqQ6dmE62|FwF}ZW&^M+ype5#jDn4DWTERsLP6btgGhhFJzEnSw zo!)$QHtT2;fD{?&A7O9nxG3uv>R0LCHkfUoYhc7aSpPrLuyRF#C_w+AewzU@_@s^G zF2TM1u1Np6em}L3Ct@N^hfizJ@M!Pu?RAtW<Pbsz=$NofB)Ecz=^%se43@GiP7|{@ zsalr729AnrJxGQ_SV(67h^POm+f~WH-XPQ<(%`tkKTtWT%;125gfTsfXt?HyBs{ua zQnf)MO<HI4v~~^(_y*YqO$K+L_6|K4A%kLrDlDPKaW$p5|9zJ(LGZU5xXuk;VYCpC zb(k<9?D^X#Y@fOv?EiGg`xOdOnk?tK;(@mRu>C+=cdK0>Z}#>z+cmeFZMSD>^<E3K zU1z%ip@)L^3NqW$w(q9=9k0_k7@|Pmo82`q2o|(1!u-O2CkjCE+oQIh+@5QWwkK>) zrbGj<(SVqdz^sHq#ULSgC|t0N<XLXNxkF{g!W}>FShpi<N10)*;dR5OMm9z+0>$mW zZ~tfev+YCF6!x*SXkRB-1v+J2ps$S^1SMqqe>=wR_zcrwU5?(W3wkTQzlFurv6wcs z0E5N4$Sfg$ht`h6J5GuecNpvt?{MD{0_L<G#yd<Y`o139y@I*=(8%3UD*rusmH$4Y za>xMvz#F&D(tnt@BY#J+STfAFl?*G2Lx&Z1H18PLF|zZsozXi}cV_J@c?zy*d$glv z$0Iyadq=dReFu<af*ttNRP->w1l+?Qc&mKc-3=DEonv->{G``IGVf%+tj$$2?`%)2 zt<p}_o!UEh@3h(J{k+xEU+K@C-|t+9Ed#4|F2@q&DvWl2zL42TmHytTk8k|lGh{DS z`e&yZzVT0=P^#3n(;5G68yskD7fY37JA?2o*mIyVfGP|+w+x&;s0o6@2p3NiqyB>= z=<-S!&0D&&W#^-vorcPW9~(|LR5RRSXlLkY7-*Pjc+RjKubz-W>E{$kq;oBH4t&Vs zqbY2$kr58mP8Z2+6JX<pGYuDDHvSy5ahpy7GF)!Bf#u*r%)#f0k)gh!`3FpUF2l5g zI9p*V%e0p|BExXQIBJzVfN2{ZF+4#s?MRAg57B(jm1Wv)6w}^mD;-9Lmmrh~;^E@$ zkl|g!zghmJffc5s4vL0-yOei*y6cOlF#gwu|3SzCVf>#({rS2FvTo^Hdi_KijVf=* zIhyzLu2s7>?$X(1v&(r`#IDo3uI{?Ot7BKc(G;T@M)NU{S&P>*3}o|NMjrw>iUP7V zfOePXE`JQ#XBf2B0NP#gyN<J<wZNdAD@MD{?t*NYQS#6n2DE`3(0=xzcKw=#_Ro%J z*PC7cQP6e=Xd5XTeMCY#f`T@<EME{s16^2XySgHy?~M$I?Pc_{(Jy#=**PMkjYgZP zuB7z#N)#a@BO?<6x;x}>xtUg|()tC+$jivTjY#d0sHpdtOH|UWVtH0ZxyEkBk;YBN zf9{Uh6S(J(Jx})<?RDB4wKv_w*2LeWQ!vh`)~Lzow$X3K(~Z@PR~u^>vodTF<+-Hk z-gHYvqgJD5MsJMA;$_O`5}@G(c>*+iNR9vvC&D5b&opN6KM60=be0Ql#avLLb`}hQ z{`_L&ZN?_x5b5fn$UHJ<Ac!7wE8#siL&o05Y`W6NK;$7qd6v1N@nPfR#;1+xRNxNU zcBL?fP=bu}jEe~+=mGX&e$CC`o&!-kQia*Zcd&jkTc~W@X*^&&vU}X_uXg*hV#5-4 z3I^;Hih5r_PPAM&m%cN9_uSn(ckc(oD}VQoyMNiOL3Tcf$<;A@G4NvOWqa!j{PQ?$ zCJ4!Mk?{TjTgKZiJG9$+x2OEOCvank_M~hiQ$$L;llFYIXU`tjJzfIE-D$gXcQ@?* ziy>i0EYR-4-2fWQQk+R0?Q>YF-A%ji;{9|4FV*K=_KLfo?(W_F@1Bn_60G7P!N^T{ zBpA6RhXf<Hh5S8p_pIFWKdX!+j`m<CjIJCQ2m5)C*&Z>q?RT@BcsD6%nli=f62$yH zk$aN%oMIP7mtB}VJGAG_o?>>|<}zD<rMr8o_AmiSi}zfip*g%5gY_=grnJ4g7r<<b z_PpGSur-$)KVV(Wz+kUqAUd@7lf7T<Ro%OReh!lIVbTs#hb0hyl(=`%-sR-YdKR<6 zwM|qol%lk~I=HC>ow7rF_wBW$OjI*xvou-L0qu3)>(5RV*fTaNmOxpry@&RKgbwWb z6eiwhozdQGlkxB<e{UINw-OrD7)bBqneM&1_uk(2z0da!n($cj%`|hg_m91g2<s7# zv>x%O6#yVmNpm+jv~nFuqKLNZWZ=pKi`TCvUz+@2veLwYj`kIr%<Y9hQgEiJ{>6E5 zrUNorYhvt-Og5PqKvPP{hoQMpZQVhDrh|g5C~`0&bU`N0CSDN6)aNQe0y;EA=B8*8 zX_91e+vG16DBHShk;w^@vTiViyCRb_Ci$d=m6uCdSb3Ge#5<r#y~$Pbfyzqifyyct zng#u>FPI$6&);HjHi=?+qJ7g$Gfc0Tb_+f;%P=c9Pc%<6KWFjM;;m3o__5GLC=h(S zZ}C3kedhb5`;zx{?i<|y@&2#&uiUS(U$P%m_<bw(ZTYZdbhezAqn_Ef741T_&w8H^ zRX>_j(yo|DC|wELcVFnfIJ|u;@b+CPQrwrZ@7%u1eShHH`-9x>g_`C2>i6B2i~bu) z$5v|x`MsRcHORo?I}9VK+O7Qx9Q7r<8-xIMpXv~~2m9yl{{er0Hb+RF-P1AD{S>No zL*&~c3um-{>;Ao?N@;HH>jiK0e&K#+LQ#RZM=}JvidZS;R~=rKYlE$p{QU|0drcvD z0qm5)N=5s#_MhE<VgJSbclSRjgnXEy#b|%g{!+-0DYArrc&8VEu-@PMn)yk%)4?gv z{DuS#9GR$8L}nbggeVo8Dw|F)ooqVQbf)PKroR-LLF!Er<mnVcYLgP<VJnvJx_DIA z#oVro2V@<+wjoM|rlzJsQ)^QPQxDS+)1*R3;wdbGP78}6&8HBLs!+b?!cjdJa(gZ` z<C~r}Ei|npLJt-&rmjf@wV^e|h33fghUo+B>-m=8m!^+Q$>Q+8VSYK!0-5%kzQ;Db znG0ZR3HXAKur4!)?rfegRO!Cp8-cdK#B76^ftjCKs99obzpHe<P@qP}GzeA-*3&T! zLfU&Ez{<hTf*tfEhkq6+3v2`-f*3))pw~=AfCNqgKlxoko53_`f8Tu)!=YiaprRW_ zmnJyJ25Jvy4Zg;noRMeLn<LLUAw`DHT@l<CJmPMV;mj`iVA$adF%k@!O{eyZ0GTP6 zP2!Gc_zd0abG(f_sBHvIzc*VY*EE}M+TArE1CX|2ME15pW=3X?G*OqT{cdK#*<w*c zgHUUe*^0}0Iw-S?RsRsXL07s;m3}iz!MO4p(L{<Y&Cao0r%<eD)?hx}T-AKFY)GVN zcGK*oInR6?jPt%(8!4YMAw%AT+{uIt&5(a+hfM;ya;-jQNwG6aE$*8C#F<J&f0t9R zQi-{axq-Q<x!BypJhTw-yks#lH!|M~$!aAQ@DER-L>}QwMj?C&7vW0?Hz$pZz=WCT zM=ghO=Jn>+&D+iYwb*H4W>IeO*n*Q2?+6||^Lyrh^-)UALcE5c!Qz~)zsz59W)KbL zj1Z*?i%%@3S<J9dvG~?vg@sljB-~XL5$SiukZf0h$6p~o{)$oKui%cqqNf+qhG_TF zj}FK}WRYj1XyI((YY}LXO!;p~&ODCv`Hbs>^fU-$f^?8}mW|KG0Y#*jmU6zSG654C zoRLM1#UEm1(P(i47hdXm*9-ofZqijewTJ9`#^3;WlzTcL6h=e@rO!dM7Lv~5QUT7c z5V|P}rwdhuKMA$i^>^#)V$+D0u%K)auHk?(l2f4={Vm)@etg0Ki9+JrzD}8aAnymE zlh8*PDokY^X~5f=rTy3i38RIHl<m-*F`hjo$`z?h7ANw=!h6DJmLFNJ7GJXd#oEmJ zpv^3sIX2oh`)!JCjcn6xb8XA*CfRA(S=hxww6E|_;o~7l&*8mbyc~LFd||(E*is2w zxk4C9x&SCCNP<6@^DRHKoME|$GC<uXh^XZp%Wnv!<9C{f^4Q|Wh8BvJn=JLj$>K`J zZ8A=XEO&|%Ni|h8#?so-!!k(xtJp+rEj|GGCWD={>bN-OX%`q<s9JZ6Bf88dT4q?5 zSWUOmv5K)eYgJ`6B$_W;EYcChioX;uhX88ga0<es4U*yFwdRVJHI_}5zga$lC-lu# zU{7Ov%mibvP@<;nz_)yAIb=1Cs7$V=VA(?oOaFmh4X$wr{31ed==YaHt<APUJfd_V z-)ffCLaQ~znCTWj5!EySnMlt%F^*r}w8?<~_b_iAw?tOkt;}QtgM>6lzqU?{tVC8p zJum^V_aQ4+tAqF}hv_EE`tj5jijY;J)ydXZ_{L%o7I1TrVF;%=jG0oHlx+D{jaHAW zp23cCMpieh9^jTo=#E!_+=1_9LF_XP@6&e3YFIQwh(rpa$?aWjKyC1&Y}h~a%RfTi z1bz8k5BO#1Yp@@PR*2S7+P)eh0?F{pC!CRJyC^`&7wr*QirgT1j(%rjAGp>5Q1s80 z17O@_mh)Fa9>QImaZwT-6IF<=h#rgH!vIf-^4o}jCwk;ZyPwj1Z0K$4k`2D4e=UJQ z-4NX)BKOsJFd1eNOI?xZspw^I+jF|*qM>&D(rPy(M&b#0l4=ke@rqsDHSS2PBL1F; zZ=_%SzL)SJlPLJZI~kae)yCK%vAS3vf(^Uz2%`aN_&S^b8~$-<V2F7T3w`^D!-&4| z<4EWnUq=ywF)mKz&+8SR5f{)-oS#@dUdB`}X%_OuH^hI7JBg?+PEhS{Y~!UvJywe1 zLF?((^R0gpAn`lvapcz+F6l<hjNy_~<sVvME~zQkYK#@K-e|p<@@96sA?t0{##oLI z!E*c<I0;i^?aX*E)maZ_lX$FkjP+6L4C`F$M(g|5ZPo*f))2~$eFdezjRj4?y2!c` ze<2iqVeBY}>pFQ)-h@#l%vZ8@e;dBd$2Q>kr|tfA)Q8rwcK<qSiNX>aWb>`fdWMH) z*evA`erG!G+1wV{=-KRmzzy_p=q=`&XYG)U(B_PQZ)0a8wMiyxwkj;NIlxY?twRQ} zfPH=ay>H}GNw>=-ey?R&g|@wtO|4Cn&0U*Ewu@nNP(DOu5d69ZAxd~Ar}VmwE3#>~ z{YHpvp4om4G|x6bb)n5`+i|uN&5+H%wn|_XfE?U8vt8jIkv}oyifli#{Q~?zb5w|b z-~ytobgJKWVfjw!0N-|%?MB<JPlkZ_fw}y58g1wOG4P@b2rQL8<G{BywY9NzVP~pO zJLi5PioRFa`r0Pgrm!{AuGvP=uAo?gF563xnEstl?YX%bpg1w*g`8a!Z5wQRZU41X zA{|t=&9)C%p1qM})9JPl^ulDRi@+Ym#vHw)RB$9>`0Wc<WH;4rIYnmek=<;&@7Z3D z<6b3d|B^?0D12+Tjuz8?a6@*wcE+r?<Xd*)x-7!kx!U>K1u+O$OCj7^7U62?683f} zcBk1M+&(N}?`|E=v$nfqKiPhUy^g(!{Y{4{4xc;Bb@*POX!n=hQ@cJph(pAdGAHJX z$EYuU1$)VE#C{CkOULkD`ih;wWOKg#9Q*I=*HPj?A0ZCdFScJ!hy#CMooZ=+FT@G7 zlddUr92`Sn{TQH4OQ8Dl?S=M^_MGz7Mlw4^dvE(d`*{0PSgrn^tFw%p7-f`8l~?3X zijaMoeI0)H2>0FL2zYqkL0Q1Je`x>Ip3SK|PR;sjn6>?&{l9qD$MLMc=GJ`k?sAc+ zDRN{pGMfM_QkksCSY#8=vvJt(RPJ=qS;6@uXG>>Sm&dLdu7$46uJ7G~-Hy3syVbcp za~l+V<lyOW)FI#DhT~dCBgX@dF^+GY#yI&qrJ5lJKZn@SW&YDJElM;;4yg{Agb+7# z5hKK{0$Ykhsl(L|Y$+)O%b02zqV$);KMtJ^?;XcGPH~*$xERA}BUVpWJAg}xD!8zk z3%ij&G0pmG)B^k^zW@)pnT|RDQAZ6&Jq*!A4AH4@=-WO=5kvL2$ocIX@lKMe<vIp% z_U8dd<e2D~(+BZ`7aWhtrC;{FmGutU^Bqea8y%m%=z^G7%#<Jy#qpZsADwWouM^)4 zB!1x^9s>~1($UAg<=GETBZjDb?4sl}#c8dRu9KmYb7vP6gBTigKu#)7-(mo+15q6e zDG;GTs1wXxAU@rAG7_~RLMswVmIQ)}!^y<S5;xn%@u=z$M2EwqQ=uRPfC(5tcQ4_F z>W91;hF&?+(Gnlz%N%F-=|poyryEXfPTfv}@YQ=xe>2HhVPw1&9P~sSDko7`P6<(S z|K$1&mb1}PON5Hf)0`JMZ+12mA?L507qA2*kXcB5JX@(+q4Tetp?ZRXi0O?3Ve#a^ z<rPsJvj?ne?NF~oVTDN9+24ilGSOv$i?7QAfs%8y^AYEC=N#vY44vW}i?)f{ywd>H zoC}?q{O`jU)uxFQoo_flaBg>ooDa(D{G%LZpB{zKS@H;dhArva0VaEwsV-kpUo>Xf zjWM9kbCIIUQWql^D;Gy-wc2G={*Q;8X!N<f0A-Caaf@85@eYbEp)M6J7hSFry(hRF zbIEkc$BCW@v{}+isRR)j)D{0VeyI3jh`zUnNK-lr2fjeH4myQNnei>ei4|R*xeU2Z zbY06bG97je&$%Mb8oKv8@Li|7&Uak~Q|DNZr@oNMAbOWE+f2j4z-O>2ZIoPfU7cJd zu3@f80_3{Gl`164NS5|;Q=TXf7*h<GMRKip5FI;!AIY7!wAU87mbo^t29l+CEJy74 zuJ>G9UAyJ7icYhF(-yKNn^knmLCI~bo2r|Z+YUD~5ptX8_Bn&*+h5>r>z)gc+qZ6u z=<HhsY)UD1<LdujpiJX8X7<5Jm<-95IwLocn~w|v>VOJBT6#N4)@&t<{d#-421rA} zMsR$%MY%z+2e6sbxSyN>PGL_6SLBxOR*s+DqH8Fea6@jF-8gCD5blLXnD6$8v$h_u z@Vn)&@l}m&JkR#Pe2?`W`#es1T=v}OY31qe8RMDeHQj5S*A=f@UVUC~y%oII3dS5* zc3|BB%>%jztPZ$)EM@j-5#@GWMeUfyutyK<Jg^V5gCe{~7e6Pl^KEM{g~yxh#vh1s z-{vlG4{=X)KjU8Re%<}C`)dI@kl?P>EwfZSkb2;p`#AS6<u>wr!qy3G$__jxj7UOs zp#H!uxfX9m89YZ`lkyol@a(`FxrXmXH+(z##_)?)rYMm6x9-d3UI#r<uFAj&Y!|W? zlR6w6Bjs1R8)5faip;`a>7l!|yD#RzYuw#12VR4D?nAlWVc8%6gj>bw{phMr|2&h) zAedgRO%uR)^n1-v?FddQ8a3R1`=OqK`-sN`Zasy^GCSn)smHtzI{7zr)Q7J3cVM-4 zUauM7L)$~wV+UcJPnLCqXUmo`EPZ6I=ppiO@bK_RpoGX@F)vy}NRu8Ck03&t{EL(( zaW=*;T=ukvEY`ZtBgdl{JGLp2TRL;OM>Sn)a^^}Q-{Ypopr`RuSLD&+0ecN{Uf4X5 zFClscYJ-6HhTLtR54Z&K)_5v-PWPPSsZYE4EIcRl_5+(DoPZM5KRM#xR}RSYTTcyV z<oT258m_0$nQ4B2b@tI^??)_%d<J_+!X%UWBZ;_0Y|!+OAUiSgJm~4)FMtx5+%mhi za28FIXCg;DFt!bRRp)um^OEOn&p!mnv)J<jwbz!gN<%SA4Oe&5bxVGJ)eC91UFLkx z4$qgK09#ter5_6zodkI)drf8@w^5y&+wr|-d42D-oIEp+ikL<=EGgZJDadUHWiMT? z-CluSF<yyYwQZe*RgGj?-**uC{d_M=FIz7^GB<5O4}>W2&U!&qEFE1qXEKql_6?Z3 zX~s2=u+%E}ktssRE7hyi9C>AW6@uvqiupj=kYq%c@YODc@GT+*ZbauD%nRb9t`Xb= zXlIrS-|IK8M_y0K#0rHClsq<j3ZvllK)Ee4yCRM*Yc(Ik$$OIb7v3riAR;M1e8j@Z z`$z8;%;P82W3x9H5clk2d3N4*2md@c;5*TGf!|&~XGyl?isX&dT<R%}m!|la`rj3N z<Q?K2=Y7Zfckh=zvkx9Tc=%w-!R&+Q53<#*^30KUl6NymZh^df?@aFk?^170Mc73o z1}kD$_6-i6Qc>`0se%0nl-T<p?@mmK^Drg;QG~o-`%G``YlUb^9|fQBm;_}IPD<tn z!w7xFN<KgMIQta(+&bt4sx-tAycY0%*7)r4F@yMb<fHDRN4!Zc`kO@3xk+6gqVQnL zP#+l9*d_@w8@`XXPqI%M`Fem)H2W-)^LhmJy4I-I!$Hb{0(7p(r`m_`ebXNfq*^a> z<@@~RGjMQmYuEEmH{{dm12ziWCX8yM+3CRdd4F)mK~-V^2Ne%aVw=Qp1`tg(*B&*1 zsD3g3;Oc|B4+_ZFHy+ewUytX!9!I^tdDQE%Zz1iMc8zGTy!z2Wm>47W#{gBFzoBQ~ zEt?^#`LgvXUY(kLaA$0AK?my&-UZ_kB~jsr`LqraV1^DpKKP8G#bYq0-Zw`F-})-h z%D_Wz3N}<Mc16C^d}m>o=z7|`u~9h2ce!t=Z@uqr-!8w2eqRca?=QaDc8b25zT15F z`PyU2dy^a^gTfG84mHvSY{%El*PqLF+KDngzTv({<(j^~BhO&pYjNdI9aff=cD>_z zAAMPnw)+0f0cpIQztSV$mwrl^4gc!<o(9?QuNZcZI690gC}IM>-#ot`{q*qj%;&PF zL)`-8x6*F|zIU2f{{Q(SQ-u7?{6u85j}s%2$BUKyBz~EaA0;a#29k(&3*;B#cd}as zdKf)+s6EACf)H~4d1bO8J0-tjzXyIYzaGhK_<n`oRe3quSx$WZRQ{m_mZaA^BELb& zXVAer$=DvQjP1xV{wi|yWP5Ha2Nv#rETI39XmCax+vA2L#*$!{K-EtrLW!fqQ{u<+ zUKMg=LWwFBT=ZKXS;$}tSUFS{_luDvUUKpY*Fn4)W39F=lH^NjKt=ABbzp~`BYt|= zjxV_-`CHN{C;O+f3`>V>$;$qz4oXr*=}hTz>3ZpA5t5FVe#VeIe@6DNXD9hYx{x!; z1V+bx0LEvM-_0g?8Z{p2k}Rn)Q`g`O2=`KJDL@z))EPYDTo)wulZN7-#SDk)#glVz zi{hP^R!FO*SET<)yQKg5kN2PBzsg_T-^~A%|5?bcKhHSb{o7y;H>Ge|8!f=tP*F(M zPw@vLt&p@=`ieTFq6*)QVi#1x&h@eXbk1DkY?1%B{)_P|iBvTT-fs+)QhHiN$bYLp zWT=sbC8c!kmPmI&{v!XQAc^=p`TP4vwRS_Mk5D?_+TVxB+n#R&yqY)-$6hkuj<C)` zW(#rcfWKG7=q;s;-coe{`B(Wjy^wV<5U9ZI%iNLw@BUyFXP?#LXVvzHdG-M_12O`t z0!9L-2kHmz2|N+l6#P8+-;ik`OGETRV#9pHg2Ph7vcf~c<HAz}V*}Iz)C0Bz7zEe^ z90-UBNHIeJ%L3M7Y3dBvRaD1NI*>ZWdA|Y98(<t@hB@yU%z3|IVQtOA`dR?j{uKmT zB-n?bLZw7O8;@EF-^>XpVJP_oD(i)J(p)j%a=?v%2LVtDmM93Sg{5l^Lb?uk6hOwm z{4FP4Z{bSU8U(!$R1Tbk>HQ{}-fIf^fwKa?3*5+#nW>s4Rl5-gIYA7G3VjW-*h{Lw zKU6?wFfPIh1quQa1pGj8pi7_^BRU<W;PeH+DNq_1j^T6^!|4my<Fs%FzN5g5z&vJW zCIBr(fu(`ffMB3#ICCUw7qMdCy&#{Ukf3_mko}lIS<u*^Z-SNutqn2_vJ;@d=Yj9! ziK2rX#hlb8MnRK;W<UWNOe~i|$`E735D?Zy#<;i)xA__Nc92HU4mnyX;?PnBF8Q>A zRAkxEAb#1B1+I+^3W^HKWK{R&prafJ2NNopD+<aFy1>dBM=7$S(<6-Htqgh`)D<)k z{7LZV!Ha^o2HOXF1qTJ64$cd%z>JwK%LI;7n3+&IR}?hzVU&72wK@*4I>EDozrm{m zsoT^!4-Q}=3tkbtk&RLp<0$oS#VFVy*y4jI^>3Ic^)QaO`UM-3zS0o|M+8F-C_y28 zAS6BbXmBbSk{(Niq`##@(mfapyo#qQ3a$;75h3ZpSAuWTY-O%9boC$@P68pi3Z_HS zlSu+?47%0z;FlcTYB#$L2SUbk0DjySg?ttA9TZ3*eA8f;g+qD3FM(rnwCzyH>JSZ< zyXfMrnrx3kc80*Y=piN{Rv~O%t#k^ia{#I#ZXv!Hs_7W2b9!jK>{|!rkP{)<Aq^qV zLo36;6pe#;?Afv23@PP|HO!tLaxLV~kT#&bt<OP|!qfqjCUV|W=*{#+ul<;i_n}Im zQ$m-9ZVI&zg@fBDqlJc?(Dt;WbEpRjSA@<C1q(3M;sUqDFvPIPiFF->F+z+&^+NZ_ zJ$Qe2ln}QC<iAk2P&xUplYBKibd>zpGU`>`56U=3xsC~K4t)?h5H>ALHEdbfwl*UA zrwa<WsD1>Wc^C?!Kj9mds*VfofC6Kx<3KWo%nstXO+w3;syc-J*8`CgVPnE3(V@Cd z6x;L!OFvP;kZ5j3+>)x=hb`;@S1;9tqazAi6Q%*sfp0(?I4QkN)=pFkmJGP@!;HgB z!^BU>1j#@s1|(~T2U4Q)0+BKq#PQ3KHKPDgvt3YFWLP4`qCzYTsQ6K;H}9oeAip}S zIIJdoQn(q56t*@ftTF5%LpH95aqGW^K<-?aEUY)|6+?TgC_G#Pco_C?xH87WDvXC~ z>`?gB@a0cntiXl+d2_<&g#X0Zw0t_0c|UB@@L$9CL7fR`hr+eP^#Q6f8wuYPR8tvY zNFjc>IY0q+sFwOT+&Y}Gf2|8=>|g7!#PFD5^5+>QU-?$R56=kC3qQ{c{{%JsnK1nD zs_;vA_$To2XF4SC9Kzp3OpMqYsT`>rX%ZO}#fzF6wK_^8>P?J6OngjnOlz!JY+USd z0SX_9P$D@uZvdMgelSyv_&j1m#FmJi<k`Fa$Sq=S1SjUAi*{IZPW^#`f7C%a2@Hdt zLB&()ne!toBF;s;7oZ61h%7R5KEf@+CnAKJ#wV-=Cyq5UL?lMgPFijDc@xRs?-Fc1 z;(Wvf!f5u0a=`}i1|x1nv_w3P=!^g}7wIqL9BlIko%DN;FhG$;Q_0L0Is^VU#zy_C zg<|C7$OVx<M5@CHa*@*`K>;LsQh-%$h0rkcv5fF9PN73*rMy>>D_IM72NQ^LLnu|) z9=QWExZPI#NMWRFq&LK{LICGqk@lqZ;u|Vpq@PKDPY@|a#zZDZW<+w%XboaW-)09C znG;#UjQ<vKj9gme#mMH!2a%5=pV71ai}hr+(X;-WGwXloS+{bIk%I}sdA{jU%JLB- zlWb7bjHo5dw#tcGz#+J9bi~K5ZYHcc*G@TVN0eifd(`cyzoICsq`!hrlxdWR9^7_% zMEcay6K4Sj@tdMTq9URWM`c98SvdR$EJOuF2t*IgOm-i2F0i*Nin<WhB!4dOLEuJk zF7QnjXW&>cz#1vPHVS+<<iqPM$I|N&#_<+K&x-ygdU5o&XmPZ2w0HEO=+fxlquZlj z$Do)wF+apCjRD_3#Q+4%9_+y4gK6|HABqp*7AV><dM}ACR*=yT5qH4Zpmfh%GPe*a zmhX8A2Y`X??$txs#nJxJ5qKAO;9YD5dUy2k=rhshSRq5uZ7JbZV@YGS7)4h_-~2$* zP+=quDTio%@?k#QAS-+<azrs>V<u4&gDcRrm}xOzk-|qPC49Uj3@U_Gm{&!MA&!g~ z!mEIydoh|ZTZwcx{jPq<eBSQBkJ%mL69WoYjA@KBiTVo9W5oDaq!&yK%al=ZOIwID znb8hMeoS&qS`1WzBxINzs3%GX+B_u_=H|?UAy&jZus|`jG1s1wUH~wR@^W6Z4nWCW z!br-yFxW|y#3$I-EElDi7qK75&Wzm>YXs*Bx}um@G5=Cn_$j73bSn5}s_yig*lG0k z|BsBViCqx8nB_UztRRvdyOy&rY)Hp8eiO5>SADK1Rus#L1M(wcXZ(3XvA(gv^zP8X zaX^xpdPA&dd-eeon;r|GN3l7v5ChsH3{d$swk-B$tjrw6R>wAR?82J~yRec4ioGBE zkTwo$Kk0r=)Pf(`O8wa~(AEpyd0swq99bMc?&CN%{;Qb+%NBMIH9N-f9OE`6TuQi| z@JE6yF*z~g@Uf))Bjb+DIdb|)-qEc`gO8p%dR8zo&O9z4E-LO&TuNMX+=ICGxZe1g z@!uz`NZ6lHAwY5BIJXylv~@tTL_)+uGVa2K%+|`G$oEca7~ff;xU{%pA&Se2%cJVe z|3ehzf8>VZD&iXOw#mWU<~w$coVwn&_Vo19F3X?rib>S&*rK?h_=!N-AljM?C8dcD zRaGpox2+S(MKFA!PEN1!bLPkY9Iu`5g8;>^ir)Yf4Gyf}l~N+mJP^d=x5d{Gnpr6C zn|Q1E1M%MRlK6=Dr1-q}VyaX+O-=s&m8jVJf`~YSMWsuoszh<N>{u5Re>^^eKtIWd zF~%j8gG5c==X6X2JXuP}=kU32;~&J!;-AI$#=lEYPWU=ORsM5piO;<uKKGjaTr}r% zQ2a09qXgKG#OHQ1pYtU?_lo`8GU8m7_O7QOOClG3!n%Yl3A<!3u?$lO=L_KLqqGqg z!f7Fsr!2uK!7m{&Au8cm!r4VA!9Bqn(gVsMJ)o>e0RO>nmC480mr;a=$>b^H#@LrZ z1S)<njomWJSP}XMxFOc+cL~Fk+7pHkDIfas(ELNI4xK!dd#ElkfnDdd*eI%g=o7lr zVRae!Na<-%kwRo6=J1k@BBetbhfEF$54jwQgPi|EI)`>pyuufUfq2pOpmsU!VV4*k z@;nqOrzs2@VLiu7E;wV@n8n>c|JPyfS<Xs_t{?h65hZ#jhH^@<>$ZX9AHbV;NOq{_ z5S)rkjm(;}=1R0EYb{2JV-v-_7Qwt96Te8DoA^`W>O_r112&o^4Eh596Ywlv8He5p z7+iYQ!RdFR3raLf+)v?>0mh|QodZy!N7h3gp#7W_gEsWZARdOOk`6wwOrY39#0f4E z6}15w93-id#TZh;Mf}9GiH{Cj3HXU6i8YCr7=n>YQHq7YNfWOpwqTNwi%G&laS;D< zVs~QSVU5GOhmAqVXo09Gkz(S%hgA;$ba;gT9p)b%Wi0lRvx|I5;uB*AvBjdDj$Esc z2zdo~mj|evw6?iQE_kcOfq&THu<PMyB331{PlOJ89}dJB_cK8vqg2(e23lYAb>bia z6&QWp;hZGjq_CtzNvGhP4&}oa4*z}l-=r^+79{O~!PgzWB|knFxnWHKqt4;>!+jj1 z&H=7b2P*m`@smF3f*_XXcw#u7cY|C{N?^uuK}l*!Tj7;uN$PU1xY7cly1aSE%@rjH zk{k)c(I8_va+k9Jxv(VLl|}UXa-e(gnj;hkfVn)7w=k(X>1xuQB#30iKJ8ibzE@4O zLrK3SJ%T!WkbYh0fRfsiIw6<$0h4Jm0p{^0iRA2(5i^XRDqeQz$fP4*vJ&Dpy!n53 zP&)F{kyS?y9tk}X&kpz?1pb4y0ZM<%JQR=U9@%}w@`wv@^b4I3H;XV;(br#*b`<)@ z%%MK|>T7n+fA?X(@eEwkSgQ8vkyJ98SWSgk3=oELo%u&fkK8`eB}7N6jx^Fbx7PrX zQcDU)vuAdJiQ&laM;?)B$`y>KS!Jn%;*o(P?~W=S{iJ;es(h$Uf&^*E(}0v9B_i-n z)=r#iB~g3th>lJ_x<-hOetmRqcQ^Q_=X~Bj;D(NVe{>0@()(jgKA;y4JOT+@b@@?E zLezr#KSvFY9u)iYuO8ifRLGK7C#cu-zlwMUV-OcW|B*+NSm3&|kok>KjY}BS_<~a? z&*|v3<lz+Mlu0SmQdCp4Qnm>ckKRA}Jb7XAGYfR|&!dk?8Qkav!;{WfDjpp=I+FZR z@>iH1Zr~E;kq4v9I={)0;*sA$Ty+UmDo@^!Y?y43EKashc25pY{(BKWd2_OEvH_%b zmIF5{H-~?VQS#noQ{wD5$R;Z%4s|Ps$atl4%(2SlIbFFEN{&pv31W%8V)D`CQ^|$N z_5ZJ?qnKhjmnoK$k~+f|<)8KU$cW4j1|F#_*Zc%?&BvfHLJ_Ew9D1(b3*}!rQWmB# zOj0w2IsZcwkFtZt(6ereDZ5iFQ)-V*BeQS`Ux#GA_{q>9B;8h~c&A8Gf>Od$5>ig3 z6cs|gZDkQ0lvh~{;y@+ts!|>{m7^wH$(?W|k!#dzAH-XmayO+b<=ruKY$EXDls{4+ zLW(#WZWiXn`v?hA%BxN3r}*CMTG~eA%bDve`q^3-wc;_=W8z~6k0pbbCWxncZ1J&` z$JQO&dQ3nbhNLo+G{LKU#d#YMwOfT!wVB5ZnSH1BH7TM=RK6zKOI1EU21a{2`a@-g zGddP<EQ<Y2NOMw^FOD4sXNESF;(jdSST6O&FQInkf@6i84~}t;<2fH|JKk};|HSMQ zJ5q(I2U8!Wjhvcu>Zen}Q+DZ-(!WgqB|S|r;n?tT<>Ql&Pd{#STy$J|Jo0$v@v7tC zX2ihpVK{05W%t-=p?G}u@dd}19@itcks4tOl&XGtT#b+-WkktZ#@Cm3d=umA%f~zV z+*2s_Q+s?rUesD((Z?N*dteq_fLXK}yXnL5rkAR99p~ErlSrEyIL!&2uA3R_OFMMD z;rJh9h|UKO`-rR;V96GPT@Dh}Wh|~wGgmzR{sjNTM<+g`yhg^@YqX0F325cIh;~_^ z6AMl(Vlw<b0gus%6(`nX+0vNw7)fXDIk5#tW0?q*PneyEIZ<??D;1^Au|y|CC)_}O zf($+~aZP1)x9km&)DwOuf+><3j7e%p2T>Wz8J$QzkxIy0c`oQg=80UgDt9MX^PwvD zpCbN=3n%WJ_y_R(ME!}Y6rL}_ODT~fX{_rgk_B$}iB}vkE_p!Yuhf}3A@xgn`Bn=r zUFQLQ>cZ3&sYZkWx1F*gss7R>K&fj}nMO%3hCm-;4l`7OB_raWz}E@6HItuq!4se? zQskS;;y>~eq11rXWaud@HGx^yzbT>4#36uRpPG?cpL&aU@nC8$<rtPC@6=Mp0D;cS z2@5a5XieC>NbdJYtepBRZCaXonqHbH4WuC3aVL2v=bT)8a@|S$lRhW!p8O{b3D8O9 zlcUnToaAI5ia0VNpt+nUY@H1{sd3VhkcZ%E+eu?AN3G&IzQnYIv{Ei^f3+k3WZ=n+ zlf^KG@RLX6bWK~14~;J$*}oP9Do1p(>f|N-tu@?l*>HdS;)+hnP7cb;V86=AVAe2n z2<exbl^xI_lr}SMJ`qR=!3wkB*Y{~q`jZny_ys;3Nwt>U!r?5IJxklm!LlRvD9t|Y ziB$mlGtDC{AT5j)-R6<n0O5YJL}~G9bp)XdK(%S9X*p@<SsF!dG%A4cD@Gwf_ek>U zk80Acr*WzjuVh=?CG=NFtR`*JXbNO}v2on`w&;}NDJaj4JzM+9_zEj2@;UV-jzjR` zP+S8C{;B1sHk{hSPC1I5@{3b?oGGXDL)bd$fto`z$8*m7Q*Nh@o+=aYPaQlJaw?j^ z`G*wFFJdF^_sT@*)X7tfk1CG4uZN-1EE(OXc<RcjJEwj>)yDMnnCi)twc$L*RxW$~ zsex1frYkaS8>zPHY}-a=W4(Imiqcimp&~39z!^)%TT78=`eLRDDsfXx*GxA^w@FWC z;Ss^Y<9Ygi4m{xGj&!H=Loy*s_ec*W5<QrK5Z;y^<`<Y9MUq#4Q?Q$hXPRD^UYXvI zeuHTiL5+R_JNgKArs;pDccimjUZmP?WZPbJN#MC;%sH)edh+S$)916jvxCo0%}dR@ zk=L1@mH(`8LgCcHTScE2H56SJjLTS_u|C5v<3vVTMnlG58N-=#m{F7y3{$GGCu1|m z;2^Y6$}r2Y$#BZ>%ZS0k=2DWAuHdfY$c0fNXQjNzSp{4(BQqlpbIo$hHCM3k-pRuI ze8w#fyuG1<HT)m+YA7!N8JVwJ2Z-MQc#>uO`|gG8IgtL=Oyx|9^h0gv^_h(QV?Cz- za0IDRrdp;~rhjHhW))no$yCqWnrV~iLZkO$`n;I+kiZGGt}+cX1@J}M_@+LD)!dCQ zs1;p8{ZXUeS|{dbhG(A2JSRq(v6(4^)<iaV6HK*(17Y!<AnMM~bP)XpH-2Vg=Bvzq zh5XFxneCaqLX>$o^KZ6&DAj&BdnbgtvyA$)g4WenveLm9=1Ql(I=$%hs?#>7rG$JS zRS=w>$5~n{EG_Ksd@Tq-#-}w->z}q@b)7#x^pO2U3Dvs^@6~CS(;kHP>IqIDG~oyv z2ue4*qSJ>@r()>>+zt?BDV=G4I-4^Fv2fh!rqh3%exLPARz_BB*6(M&J)_<V^>{!w z!V2*k_|`wChlo1wDoajxkY%25RmE$huE@)h*(+v^$(o!sGwVl;q)X(`vuG507R#e& z30d%_G)q5gf0jj-U6xN)WLDB5l(j2s4`@84P^71{2(+P6j7g>Pl6~nY$-b1eAI5Wq z{8ACh%E{uef`g1}Y!8e4m08z0$nOjO_^f}<jBkUiGB_P)b=HflS7#8O<qQr<pF!Kf zcD(BC0)?8OOVs(!$Ig7s=`gj&6`fH#vx>0^sxk)bIZ(bhnz#In<r#-Fo@bKIoH%pl zO#PXMXGXHeXHU&umi=qCHvX^`LpNSfDwlMw<(a?_-AJ(%y|QBpQtksva3=puIi>_J zFeR{qc$70&&)j2OMON5Lv_Oo`JUKJ?ftP4LV{#7Rz+pP;5?bzvvS(zgQZ@%K5J$7W z&HjmW2}M&bq1Ut{=m5hDRNP%rwqCXy5s#9+E87$+ln^P9ZJBLHbrnd*qZ}c*BAlbx zNfrl@@Xm?GWFOA)$qC6x%-xr3b9RzIIXfdeKf5BkF=u;@Eh_}LGw>^Ax15#*%D$HK z9ULN--IDz%``?@i7~J|$ln)NL&hE^{hlRfvu&Ide_dO*j7~S|ioQ^U8d5bwybD;V$ zNh05yaT@Q3L#g6(mgW4CvnfXx(wN|Asf2DqVUx^@Beunmon&4-;U!)MOO>-b#~d$J zDPF2&-4H0&4P=it3n#E-XDURNvlG%5D(0l-JkEKRGYnfaCnu*kr#|Nnp488BTeNi4 z7A=$CqUB5_*|wK5Td7J;4z>=c<h&9DD;4B^lshB$+uX&u>vQ!Nq1;b%rx$`oUO@a? zjB;n^&VwR21z@@;z@sjZ-^2x@HgN%W=N52hRVhZfPPsmyCG~=_%3Q*KVIQE>l^dM< zNA42~lpC3Q6ArlpWn@@8_egFU{kdUn7nGZoTM48KXrpxa``jY@<a_$o54o4{tsj6h z(7<KvCtc7%XYPC4!FRb#{x6(gNcOq#tTOIkA!+{b7mq!=;OzFZ`_8(bO+0)2Y|goz z9WNkh|KiytXP2K{3ufd7VhwEJZ}$+K>mifVLHb$Vyo)7IWoK<T)WoNI$O)bGI~$6J zOGNZBW3Prf0)$a~4UCVu+0g5ve7553!?W+teSU8KISm0iTYL5<xz8Bg#8pml`3%gz zXWP#9a?HQJT=TD`4LXO;O_sCedeNH7rXJ8Ta5;=c-j3+p_vco^F2=VOE5mapzxbfM z<=4j}inr{X%Q>HO!RIp0<(_Li_fMWe-p6^L=dH|JpSKkwvL&;b>FOcUxx#aC9}>eD ziWu6$zB*TQj;VjqjrWx;kic`z=N_;m&=Qlt`C@cVcJB2DByb)>0)sgua2iVjmpP)m znR)Xly5$KZFz@@k#Uu%gqDbH?ngqJBB=CSM$}`A2N|3<3-FboLD9<!cMB5Y`hM>Mq zPup9FtHNi&FtdLP-wMx*qrMeD)5s)}MjG0pyv)1`qINv*r@V8Vu}*@ZJgI_TUOh)H zNU=kC_wxQ`icqX#t=Zchl=EKYf0Mr?e`~&HexN1Fd!IiZjz}9~+;<mUQU2uoFBp<c zh~z9u+R7re35(R#`Rh1H?bqGaKIDS(4fCxCi!ynxQR`b$yIVolAmQFw4q6y3B7W<_ z&yUPMoPPqOMoKXIhL-RqU=8ZKJ^??!Aipucy$!5jD*51tVpf}{0;kH%H_dM*OVj1w z&woglrZc6@>=vZ$JdYq$!U+Y+1)mhmDp*mVU0`0|T#!(ZSMam|azL=$wAvgMOfQ&W zE?LrOCs}eF+m#@cWB{VG;p8!>d1xz{mkrh>y4)6ZBf|z2=oM_Yk}Qd_lP)<?VBFT) z*F~HWxa6iSDi9ag*-Mt(>4nF4?Gy`q3M2(V1!3?j8cLckX@M^tBQ0lO^I4JxW_2oj zp?maKPZP;B&ZwZg;1(&<f^Y-DW~6h08bua)4bdIMeWD3<`wZ>FB?>me;4=xp$l$=l zPD1wSrVmO?@5jcwzg$q^jKWI-#lm@oKNT)3ge(|3#;c6lipyC&s;tLqY~hYVvqHy0 z-@>TEl)~)7Qm9PCh7oJaSr&o_veJPK7n0|4#AmS_(GkkkE7-_2YiP*Rn-$oL^9sT{ z3R?=h$z(YzDKEY7F=xwwIR9LT3Wti6N2BMm572X|+nAzninNOM6^V=Di;fkYBn)-_ zs{Tbwihd<d>HuT{k4HFAOX@1v92Myn8PdUy-cUun6?`lc*j;06gNhuALYSDUiXv~$ z);S1lg!a)IyZ}D~Q5jnG6G#JCLs<s>RRfC76_vAJj$pnV!uUrXzU>`)-6~^C5&F2s z@?47*O2(JWD#<H(P^Nq#w(_saj>>`R&#Hf@4yajP(_5=87+*ZScy{r!;$Mmli!+MP z7vC&?Sp1k-@eDW~sQ8=WpU40VRU%0a=0%6|&IO8GtX`~xC7ldRk>`pOi%pBg#qPz4 zcv|xL!wq6oe6ToD&Idkn5&OXR%gZp0U62Si#F^JYmIBolH*mlx8GJ31b>mO2bCd8J z5BMuREAA{&AdH(X(&5d;{h;P<E`EbK{$|X9pP8YO$t6>P?<!a^k&NTbl}mmo`MG3u ziF!$JNg8D^7E<R*oWYu)d8bUIShB6exWuZ&9e+HSE2Ry4%S&m)K5{c028G5Pl|+{$ z5UOFDT)u)6M?X|Bw?HK&B{fV1PdE`3m0T*hiPc3LQeBkHv=fdic~&xXeq8C4((g-c zOY=)hN;_F%zTtlyoB<;E`7h3^o>x0>bpF8k)KUdJk?*(@895B0_+oT^<#{c+wR?YR zRJig-&}iRzJGn+9NqB)RsetM8lJhZgE#9Y%>Slr+I-hy|3Q;<CP=L-CoM+<szm*#n zoXmdy#`!<Fd38sKxa#vy&cBrZLdK{sO#C3OnmK4*s&=_lg@auIwy1P*=_XlUXD=M! zH+y#JFEpc>2<B}8D%CAD0XHh-#bcB@`4TFl!5JR3NSbZ0SbCt;uQa|i3#&(B2(%tm z)BamWRC=ToPLw1Zz6WV(AdZ$cJmJ&^l;s+r^m}Pd>D|)5NRvGv^or6ZjL<9a=YEIc zRZJw)`Bz=esI;$?smw(hT5!`8k#gB*WoOIhm*-UITnH8@m8q0{SGK5Za~Z3!W>Tbo z9_;zD6=lr%f0=mC&$C5k+sceF+NjB`&sicC|2fb^e%XPt#Ij>V>S&p7Ss2O12ubJ7 z5sGt>*GZHVuys`G=wTthtfXwPe1b@^tfuTrSxXrdqoLd%3+29+EWg`EQsj2q$gzGQ zDjP0WltHzGK?qIfKPAHARDT|X8usPopOt?O0{$I2k^YVtm49FE4}lCK#qyQqd&_Og zT?MFoZMm+z{Ou_xe}5tW&<1n8t#Yj<fOQ%q#`4JWM2r=-j;K7P9O^?6C?KIx;E;oI zd3kwL`OWf&<*gOdpq?TTbpw(D1*}hq$dYq?WcUev>r?Q5@kRzk{PJfNsNy3Sa9{a5 zNFSzNm`?wl45Au!=W`|wWf~cZgDO-i7P2Vh4~4E^<m8!(6{{*XV%XafEQ&l+5u6sn zSl*HfmkOVX;EIfj+=}xRH!Hd>Ot>)p!gm*zUNF31d%^Vr9Q{TunmNN{padh8l4Dl! zKjeQp6<y32L-qm=R#a6m@$X$22gR@rD_SZZGqRzwIo1T`h*3rF1%(f`n<}FT1aL%! zDIbQ+zG9UFsJ3`v^@R=8`Wyg(?1J_MJyJOcrvO0;QV=rbBIVUwFqgd`Pg{BQh~C7` zjLN_(rXata$&NiF9&_R3h1|-Sm6FQH%IeCStOOyjK^F=yG%*rH{e@}{agxf0Too_0 zTzFGCrgE|XUHIz)bs7hw8#>Bi-DG*(G{d;LT&@*@NYx<pu=2;sm6e+-4J(~lIa$pd zRj#d6C!$XIWG!2MdoOX$ASv#fI-ttEm6m`Q1h#-83-Tw}pvh-HV_B5^_3H~b1dGy< zRFfQ0Wqf6U3>L96xiTFSr^5u1V1D#*ir_gyY7&i~RQzTDx0VE`BaC0ifwQ(d9L7}f zt0q=`QMI@#r>eAiJZoMOv(Of?GRD=a`5Zt8+ViVcRUNBJ6Dn4zSA|u@Rvm_dyNXrY zs_d%Vt0b~FgJ49e+FfPQ3C1DP4@u}2<V6>A>nXm~2|<12vyP`kERI6;Ko=Y!9z>MA zRX9Tgv<G6Ld;w7wolcye)IZn@l{yJ?Qa3)@w(3UJb3!`vSNp8$_o~OVRnvrqHpF$V zq+DfcQ>$KA{YO9E$39*)h~v(tLQ-G#jOqoTjkR`@wrho4k`(1T^Q)Iu@2ED1kan<> z+DK=sR<CzK)tc2hq=)($kSg#{{{;tW^gab2H)Zz@?P|4Btahk&t@f<;ZMT=qtAbee zd5!&GIJ*Gxyz`1&0@3N}nCj9Rm6{*mL?C~qr`1QR&tcZ4QJq0A{;&qdf~P`MT~&RB zrA-?B!eFKI)xTFit$toTSi`TGvItc_s(u2-tMg#II$vZ4|G{scm$zV@A7#Nh&$VE| zOYB$nFnY#-t76Ui8kd@qnhpWKM!RNv&2EO6rBaM?77(c#L5(#Qj#Dv_ng!Bgjc-jz zO=3+ZCWW3{{xxhR&%cI6a{Ox;s2snhy5>sFP3D^?sc)(f-)yOQgui(be^Z4nmlWd0 zuX$aIYG<&B4i&U<!KB98NgPD?CvgPT&a36bXqdCDFV=F;|8sChwR*MXLR7o6HmLiR zkYBsMR#b~i{m!*<M78#{ZWPJ%qgh%4O%T0%20i(;F||i((=iKlA&PmCCnIiGhgY*} z3#eB^=vPx5qIrvJf3Iz=eO@=N?w2~lI;XmXy41R&y6U<|bx-R?Fl5ab7}0fvrE>+f zuRb&~MOdJ^Np(|6ADsxq>bkG$7O>eH^Qbfqsmi>%#q5?*18~==*D?A}CkD3&NLZao zorvW_W|$ADicy_=UDyYFXg0%#{5iDh(+~O35X*-aJEFRab=N4!xB(xkyHocY$%n!y zJ_P3?ydaJ;a&kd+-F1URf&$Q(N{q(5BFNsTSE?URWN#RB^+TTC>>X}#Jh%Gg^=s=z z^=S<Y8@4qxH~e*R;>8^oGcV>f&TIUoF}v~7rR7xO0`HxfV!d{~ZvC!$0Vqx=4BH99 z7!B$h((kTdXU?y8taq<ZqEx8+gu+wrS06|yJnfV(Ov)RskD(P9cSdmCXrWYpuD-nf zR((suY@+%Kh3Wc`r&V8De}zuBaH7(S5Vd~eXay;V_rAWX{$>5!hRF?|(=C6ezu*Gj z|F1!r8qS~0=U!4BDLlmKDi4_CE}0c-Sk$nBO5S?wh8lit(8L=p46pn+5x>Ex!K|Tx zaZzbFpaxNcGn2j5L1b?gG)No58V)raYdAxvfOLT!j~*I5hMCWaNESM0?FF5^)yv7= zk}5bg)UnhF;>8HmWI`RL+wdFO8ip?_GyD5=Loa84b5c?~X{+yEJ9P20i`oKo@ym;= ziR>wV1)GcWE~>E~>18ujyyXh?u4iqHJMGcM-5255)P6GIB#^iNqTNN8i+&fw$%E>r zbMSjDyP1|yNh*3`bTR4TF~a`w9XuQ$%q%=2nFsPI6<i#ZE?&4;f3fM}?~UN(A;jYX zIzT}J!Uo4$-bkKY8Nk1E@#)3kMm`?3l;3<2&if&=!3yZ0?Qr_{4agU;L5-g^&SIsU zuSwo~-x)P7Y+Mc=R=mtET|`Q>gA2cLQ{#?CDHsC>Ss3jjV&74tNu!9RvYS}Cnc3*Z zSp_jbk?<m+#;8Wlp_ln&{WK2mDI^iVUqRe>zOkCd8BZEv+}xBJ?==3^_@r_8(gcRy zg;P6aJP@hIuEu_hs^NGJ<42`mZD6A(F3q?!@6z{7PYqO08(6Df1E;O#CH+fAOxt>@ z?RvIt{ecMHflCK3e{%WD%kwTjx-7e*d1d>RvMaS$?h6zzg<Oihly#|ydTS|+^-|)c z6L_rW@mQB)@JZBO9|%-xxm0uMk4tYa)5UE3hnHSzzI3~EsbqL5mKBzY(4~Jab<nDJ z3uxtb(%~(a;4lKJ`0JKet*@{^&<BTO<Lj500}%yjX!!aGl`k*3{Oe`k%VC#eF5hKW zda+3Hvesq&%lj`oV1AP!$H{F*adKOEPR`Vnkf^;S0@mlRgNSN~v_zMaFGC#|NV)SN zvc42ApSxUs`Qqj41Tml_?2lO-{T9oT*GXi(%E_<xr6jNjG5_+5%WtmCVxjm3%3BKf zSNK;xzQX2z-Jn)Mhh4iH18|%#v|D&(>6JCi8V6AA_-s3_?quk|zq03w<rPTa!$FB2 z;90joR~)V+;1d4!=*qz>q3r%R!47SNb-|}xImy{7oHp+WH3fEmp)0y_>B@B?qfRpO zAT8v;k>pqYyaGl4u(|0F+xeh-4A1@Qr&ouYl$yS3Qf~@rifMLkPHE0+?r(l~UE%si z*QW}`UY&b&;nk&A*Il)|8hkbWYAKbL7JyZ$MaFE`F*fL`#?^fciS4~=z!~u|nywmA zqSRH#tKRIZ(d?*tASw;Z`MVCFt4FS$q)zBm`|9lwBp8r{ln4{1a`H!hcIRKMxq9Vl z3&uJvF4m3oaL&ZJ+I|(_Nh#cO<yt}PDd`fCEcqL7-W)YeY??x_<EJ<@#mxdWsWyGj zSQ~>tENWWPv<6!nL+I@hCRA+FZ8B~WHXUSV7YDBa4QqvS!)AYOgPLrb+-M+4)LznH z+1HEJP7{jl&Xj^<LO8Z5qv_l=g=>4R<zIW)Jh@qmNdSdG7B^j?Yz6b0o2n@>4(i|i z(F@V-{a6)h`n`!Ld*&)to7e<LNnogLBo!d3+N35<PMf*~x;EyTS{GC$gHV}ySFU|Z zmr;P+4#K?moLD+YdLy4p=3RvZkG@_q^}`BXTX$_6`4|okq#`Bf)v}k>-9mKD>{{g0 zLG}fwYtm6KTx4IUCrU0rIutXHYbUQ|5%Z9!O(TacQJYR$$=LqtuiY8dUj^G=nG63~ zdoyYtZ-=fuy9Ot6;G#|Qa=U=6bWoM*S5ZhXFKrO$&3t87)I6<uHiRjVR!+(MNx<4Z z&^4P^Hm{=w_BlPUFThrZ!P2~|nLP5Xn;pt|_Oe)vnmw8WSWJnvLCs;!2@H1h(b%z{ zBPZ-~P;4%2u4-;+?qFYx#~Vnh*5BO3*>;xpQkCpx?rC*T!7oDFyFia7Nk<U`y;@0T z9$}0zs0>GZM!oHU0Q_2yFrLTtMc3C{*Sx;%y3KWu>ps^*ug9`9_!l;QgUTU;&C_9l zt{YxAW%f)In}ry`EwXMWmhfvh6EvbnRm={j%`=AQdA<6^p&Pk3?%gW9RdMUu?eVv# z-I;P{^&QPS26wFPZWT<p-g3S5`t$4k*WcdY-}vgrf*U$FcHanXZD+`dE<?5RNixQx zbDw`=sF?vU-5cX?Ou<YyA2Z#bSWpMrpc_Bj*u;>z_8TiX@IFMZnEs1aB6f<hY3UM( zX^U=H+~8DA3t*S5?S>Dh3tNu-MAT0<M>me&I7N`7PE3y6Ezpg^8<iNey#Ih4-DtSc zjL8w!9fpKsZnWKeesl1a@~!!|oNr}{#@-mZF>+Jo=8resZ-(4#xOpEF#LZ8LG8aO0 zbKK2O@x8lTA~`H~YU)ToOIQ_euD`kYrqN9ies4bay^(Nv#y=7v$M{DgM?D^ZtgV~T zH{m=8@PSj*dSsArVBAc<StRek_<NKC!{`GC1{9uz@*^O=z-b~N8{h%n!Nk@O@?bJ= zzT;q@%mLl{=+;!+VCU#~@L*^Dtsie0+}hXL3F!2;_XV_Hb88cpnR0*@Fc!KTPSNHq zLmx&%z8xT3z*hWQez!tz9l@WJ_CbAUPR;88?hk*+Q^Vg%ra1+8Y#}W`q2yKrts%V@ zE8Ti<tMyj*t)W~0vZ99@E3NIqA2aKL^l&T5{GYhyLay3v>@eo`{M)v--ET{8XWeeO z{m3Ff>5toLx7Ba!V6)W9+pFmz4X?yw`{Qk|1-iZS_C9<APR@atM%-=|yPrb4@L0lZ z(Cv`hsm#vmyq&<=7KiDbwTIeFw+nAqv7Lmlo2lbAm;Tug(z#6op6GV_opAzm``PV5 zX2XZVC*R#cbk}r9tST@BYU6(Fi0*uGM}?x2CA}R`1q!0*WIbXj-|LPV(KD65yUAIq zaQe=Al8PQ>$yT{5x?^-_KP8gArA4x6H>Eo+cYN=J-pRYmsihFifFaTb-HE<)ngPSp zJ5aQWDY2GFkJZ$Lf2Z`$!@EjPx~$NhnmbMG;@Wie4t70-TL0`VyKbno0ZjN##~se8 zn^qq-gxVB9sqRj^`vnW!AQrf?yIlLP-CH5LyYlV^ynqpm5EK4ZfbMR;Yr;_6e<(S5 zzgINR>u%t^$a_im8t(nw!fUZ@IoxupC9maL%iWeIEzbqx?<U{PynFU;@!gtxAKm-z z-qL%<_k=7CTT)3`UQ~B`ST%HyNb&B~yLayXa~Ck4lJVr@%P))3UD@41ISMjz1<S>T z@<i!smp!^S<sOqAxmb>(6<~l!)Jk8<EYZDR?rrG+M$?UvJ@F;1UJw3tsQ)G7_&oBq z3yL5;xaV*$0B@gV_q_17z{!M44_JOW-JE|f_1@`wRg`_kmtY9@^6nKA455o=2s7h` z`fVjB4r2KH6@2bpzt=)@0tHBC0|%pIW`a=p-t&8}?$5se{r%<lhgr;6Zh`K-zds3F z50HWmXHYTbpQ99a;gmP}hee6KECj0h9U^&Z_jlYkxo>sf{(i{)L-$kf=iV>9Uw6Ox z{$0ElrVJ)LrIyYTSnYkc`%L|_r<m1Ra^jhkO_{`c6$yt(Pi75F+8g|Cm<cq)$6 z_T2{NYw-Eqe{{d&{=hSk$)Iw}2-NxNp|4dwq6(y`On@wVKEzhHD7SpVLVk)+v1LZf z{FY@c>sbV}CbDNZ#)t+MV#_R0i)PF24?&sq0Vw|#^IKe7{93|UkQ%Wdh2Rz(nyQq? zaor?xK(N~ZwUo4Q@{RVf@7K^0)OlPKk#;}C;!5<TZm8vD3j~5<^k>T7Nz^Xz{(t}H zGnvO53oj}2LgDID^6C&=Eg`Q8UhsI+$*U5$nnzxh!_|-ERTW(QL|)aw)gtn$5v~@K zS6AU`5_xqUuAoc!#%;J7M_%2BE9z@IBf0~+)pkW4yj}4TJSx8q{~O4S*fe%h&Demq zZj*xUz}<+Q@N<Jgz#IEXLG{FM9r&$}0^W%y1r@^YE1TZHe|hj$Kpj79)Bp8ty|Hba zW&Hf7nb)RG0<Kz(ZVFSjmW5eqvyP_zK$dbNow$*ty=j^<4%fc6P7~YQowHWRYpc@) zw^wQRjR}FYZ|u`F#K;66AZZI>&`AyCLxd{Ttpc)p1{u{Lcd`h-=ee^z)4?nC{Jg(= z-sk<j&+mC3J0DtGksD#m-OmZ7VV47r(hzFRz7lZoEHtFoCxl#kGxB}qUeBU>&%Qh4 zs1>_V*=juAvnb!QOV2qn&AW_;SL6y&cOMo?#a`a(;902j8bNo5Q0vQg!XdTdsCD;k zikg24QNj9+kMa>A*ULu&L>x%auE+A*0c}U93*|w==>UE9Cph1G09WJ<JU#vaM=q|& zr7p~ge~I~*gj!_&MY~X9{zc+{3;b^}|8={t?(x6H{Ateo*PHy;nLpt^{|)B9?x-8Y zzZ5*bSIET{|BbRuj8q`Zf2)u;n7^9=c}H1Wk#7)Zq()t1YHLDX<K@<)fc#~>LRpI| zk@*N9N4?<&-5Yk{hLn%Oc>;kZOBBSu7IAmEJB4~<3K~u{G2TzJuMNd342i$IdX?*C zAL?cO7hAE?uNMeTaUd6c*oBB>L4!zK?l!iRf8I*Cqc*rkkmCpx?OB{eNz?_@UJ63< z6}d*sg;IBvDx{06)j}GghUDsM-H}UBL#UO7@C%N-A(V}t#lGb`*apUUVB6}&E3_Et z6e^IQT|5sZg;I<w4HSgBfg*GJk>a@AC~PBPmr<BCw@aucN3FV-%iD>kNBS_c>$`a8 z0z&2?47iR5F5af8wHqXQ7RQ3iMgI_?ZCA>F#GCRT@IVBpz$G7HUBD3T5r6SxSj=$6 zgYDbrN0f%OrF<D{-3t%Cb(A{q7kuIZJS^`f1aT8ut|(KvZkLeMI$sldX&36!>xaCB zEuMjGR~-4KkZ*25B*~H2g|dz$+IP;6sFWjl9U{14_kDLu`QE=bH;0!rlAKyXYq0+P zFR|{(FO+~VSmwx8TzpV)WN6&IGD>w1DZ5vmi;}gV)~9BWoZg8UX$E;~RUWe0?Tkf< zaL*fGWeK{)c+^o!D{_@qQiWGJWmO?p<8rS#FKR-mP6~C;)TSCm@y2UhpWtH`ijp-6 zm77Hz_G;zg?aj^2^VTB}8wKM8xs<BTWLU^0dntl5*oEDawTmJb{m8r9k;~_>9LK`4 z!SU$w{SZ=|9|ChR7VWr3fL6x%z{5-VTXd-WL+Fm&O{Rs?yILMmDrStbLE*-u*sB5) zY59z#H2Z4pG$jHaas|6}i^=HJ=1zj_YrX#2nOwyg??o+4iH|21_&ulP<yXFCU&DVF zZ{1-enMWOmqCQPSH;k+yUBAxy_WJUET2kbwfxWpL8zT4w<r9kIvI^W2o~aP17MH8} z9q9XL&>}DxbR)Q7a&1tqdZoniqkjC3s`2H<{bBhLAR@-lzZwh2m+Ran8gaS)+6;Ca zR2tA=^}bLW3*p~0i<;<*tKC$@D8j1yHK71$@}j$jUX<?w%B`glSL^wp`<REDXa_ZW znJz6ATg|>3p>LH-cA+X+XuMT18pgE<4lg}$9lU()@z3)acfs$BBu|7pPQBUX_;}!o zz2i#NJcBA9RBNkuLuw7J%1Z-^V<Eiiw>})Op5KOo72{!|dX9>@DFijdxKhu9e@Tp? z>LC^ZIGf*asMYa3br<OC(h9nVn)RiiKi1-tz2=k6ZENjqC&S#fO9Cy7Wu}JIjWWY6 z!Y=>SAfWHXLL`V1Gf?;uDlO`WzYfb}a^vafD4zfK$Ui*1<f454k2AUu{NcjiAKjCD zEx4@ds(J<f>eWC{lD>$|qSDTmwGY;A#wK9(!RnH(x2%7Kn%H-79|qa)cd)z_e}+Xr z!=lpT;O}AMu%2S<Em+=)pTK&WBmWZCm)N=n%Z~zUA7i&*eVNx*T5s#H_VU{>dc~7$ z%^-X972G9dVbQO%F6jrbcChuM7WOMxpJ(hUtY=_FrH^5G`(nyt51!P9ywQ)3E{QJx zjI?v78gMQ@|Mw4$T&lkL!#nds_o+c74^OAE$^4w2vCRHNCe?51mX*$&GN)7e{DJAY zbN#K?)8>3;`lO-j*14Si^nuuL?BI0v#0+_!$e)^?PaYbI<x(f4e~c!xbGcYLwfDDk z(&nZlg{0Awdcukg4bhGs5=$9+(wf%+NQ8z0^b50d#5nN4F+w3Cd>U~{N_RNLQVA>J zBajz9lmQwy7eDx?XAK<t`m+ZPJcE1@7y8G@e#&7Ji5cxcl&?^r_%~0N58wIgyX?ph zdPjqO*m@Mt9K>oPR3~rai?NN20C^YUwUKWUg67>ul7yfD+sIiU^v6LP5kTnYeH-~P z5X;{yD8(%OtObMyN)4y@6Ds5ju-u<snj+L2Kl4AgNd24<N%~Fm6%fQRtmMFP<rM;{ znnD5Ek#zC~sX=4S`|y0&c6~%@$2sc7c?fU*SDa7$RqVrdUu!esL!%$a5X?5`!$9_c z7@gFs`J+H~bs#ST>4E5NpA^MmA3FQMH(uQT6|9dS0B4MmLqHmswh>aW)<Q6m<`Jhk zJcf1)X>xw+0py(rkPm_M^6pJ7J_3^KKyCvWMRM9_uLC&<ZHb|G_7F%+Fw%_k2#^aM z$S{!iJCJdYI-;=d-i<p>=Ykvb%8}VIzKs>yNlP;=w2Oq1(oW5u%bnITi8<Zm7juc^ zr)Fk4)tp)T+l%x}GMhr5ku;$C*_>`zS{p<7L@Iki_hZkdO-s^pW^yi(GqrTa(v6de zq~3;1-Iz}&Y5$zbM6|hVDnF}h$=QU-sFu&9v7@fdCuZ|lsZAX}q8&M{C(p=c&YvDT zowrii*D|f@_q>|0?{zejw#E{s&R$g8o>vp*6r9pK50K8J^s~~yi&^XWY(A43I5;vq zgeflTQJe+SgCo*F>(vMyqe+;~o5tz2^juEUzGG$$Opu>BeNLlh+?p7AVs<v0lt$Y} zJ7y)4XI@Ge=I9|wqo$lNbc(A{9y>Qlo=zCpiD-6g&Ul8p%7A<}Z4ErTe`JU~=!j4n mVq{HE{TAG+4AU~`tAt*7s?Z`|E9ULn8VRh;X0vDVIq5%;`i40G literal 0 HcmV?d00001 diff --git a/src/WinLibs/freetype-2.3.5/objs/debug/raster.obj b/src/WinLibs/freetype-2.3.5/objs/debug/raster.obj new file mode 100644 index 0000000000000000000000000000000000000000..076a0b0fe702e3ba762e7b6daca6d06ca17ffe16 GIT binary patch literal 57681 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 I!f=}Z0AuG9Hvj+t literal 0 HcmV?d00001 diff --git a/src/WinLibs/freetype-2.3.5/objs/debug/sfnt.obj b/src/WinLibs/freetype-2.3.5/objs/debug/sfnt.obj new file mode 100644 index 0000000000000000000000000000000000000000..1660d709a86dac4f0c516a7ce77f0343d1ba0e8e GIT binary patch literal 170189 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�T#g!)I?^*JYhIz} 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 literal 0 HcmV?d00001 diff --git a/src/WinLibs/freetype-2.3.5/objs/debug/smooth.obj b/src/WinLibs/freetype-2.3.5/objs/debug/smooth.obj new file mode 100644 index 0000000000000000000000000000000000000000..b96165b21d4ae2145cad99973c18dbdab8ee9506 GIT binary patch literal 48006 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 a(>3V5N7!r2WYqkSMEWlMpj=*i`2PSKrRC`W literal 0 HcmV?d00001 diff --git a/src/WinLibs/freetype-2.3.5/objs/debug/truetype.obj b/src/WinLibs/freetype-2.3.5/objs/debug/truetype.obj new file mode 100644 index 0000000000000000000000000000000000000000..5a1fec7e3bc703794005c073cf2aa2a817d9befe GIT binary patch literal 212107 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 U)kCH=*>b>BPEsIy$=7Q9e>w4GHUIzs literal 0 HcmV?d00001 diff --git a/src/WinLibs/freetype-2.3.5/objs/debug/type1.obj b/src/WinLibs/freetype-2.3.5/objs/debug/type1.obj new file mode 100644 index 0000000000000000000000000000000000000000..10853bf42d2978d70c96e5ef9cca6d08b4209093 GIT binary patch literal 115616 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 bDjE$iHWqc%@W%vrb6Fk&j-fazWu*QCm)DS` literal 0 HcmV?d00001 diff --git a/src/WinLibs/freetype-2.3.5/objs/debug/type1cid.obj b/src/WinLibs/freetype-2.3.5/objs/debug/type1cid.obj new file mode 100644 index 0000000000000000000000000000000000000000..3556283398a54164b61af187eb022916914d6b9f GIT binary patch literal 58890 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⁣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 literal 0 HcmV?d00001 diff --git a/src/WinLibs/freetype-2.3.5/objs/debug/type42.obj b/src/WinLibs/freetype-2.3.5/objs/debug/type42.obj new file mode 100644 index 0000000000000000000000000000000000000000..6877435977f4533ab82f606a301f5bf74d4a42fa GIT binary patch literal 61121 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 literal 0 HcmV?d00001 diff --git a/src/WinLibs/freetype-2.3.5/objs/debug/vc80.idb b/src/WinLibs/freetype-2.3.5/objs/debug/vc80.idb new file mode 100644 index 0000000000000000000000000000000000000000..d0f84fd7e85246712c3471f8888e7597eedfe247 GIT binary patch literal 609280 zcmeEv2b@&Z_5T|zprY6ymZ%Ggpa{zrs*2c9ELafhs?6@pECbsz^L7Or8apZ`QLz_{ z9gMxit_W+?$WQ+oHKv#tTOhH=&i=pO``($k)0Uk#@2m>v1uiUxiyj#yb_nd>{ zb&2L=bIdN=yL|5<L&^@GJfUpVu;IfuTz{*5CR=c8TUHNvlkqcpBR;UKX(7iCegg^w z6j+@oaCVQ-8KIqfS!LFtJ$i?xt~GVzjrR(zYi-=yTKm~E*1oj;to_&f`8w8>m%ZMx zM|QE_=?Gjvfq(+57zMJMai{l7^0)sLt5}(X>;@DFDBw_FpTj4YjYgyA9ov3yAZj&P zww1&zAZ&4}&-uUjxK!8l0~b&rpunn4fuQ}b+TSn8eL#UyD8TmrI3g%C{`bebYJhWq z%1NJpxyR>g;mVl<e7(D6_1)I8{(6XIy>OIeEj`+@);$P(!k<~z7mb#6(czYL?=;K$ zc8q16cc^7;eynBPS8rJ_O|`67j<BrZU@-ptILkU>Ps^&9U|Fx?zWgxDIxdd?wpx}Q zwycS}S=NUGEbF?REbGV$%Q|3l%PK=!$0jYSuC+1RWG8EqZA~??L^Nv8YKac599A`K zL`^bLR}*fvn`3diCLD{jHa5;0R%ewrCd%VYZP7$B8i}?f%j?G0M4H`L%EC>NvSie@ z<4yI+nn<**vZirXS?cx56PXrAUh*f>l4!0^gd59Z@rG!!rZL5GZHp&c!wqFgyEPJT zE*o9bR#y{ms%vPCL~D}ahGEn4W!OtxC$%Jyx!ACHQ-e=YHpCm_D6MZfv?Jj}eg5cD zpP=L~6ip<W69qEuUn=pYNW9K;Q5u^gtqoBhQYmKq=Nf>HZL{bKU6-&U(O3cMd#KcH z;lk0C@-d|WN{50LX-5-H;f9)+-570bPRz<rbq_^I+GzIqWAn8HF}tBIg1*Q9q%yl% zrw8<{Pl(#n8(aL(b7vp8zM(lBNpwS+F*_MQIa;7Kl=AU2zlhsSbTaa-%HzL(BY9_a zB9e$>#?TFQLhERnYo{Bi8#$#!kJcOsx5WJ~TxK<F2xC^|e<FFx)7)w|bVo{c%}ud* zJ%$A5q8rMVsvVrxvZwVYO|RpBiBso1pDx}QuJ>a`BLjCQD}lU2R4Kh~PH|H8qq)V7 zH+M&k#E3F0X-6CVsTTTLDyML%s)#hBiMDP?F-1;HnHu7?-H@WxqV7n_=EAi=fA3*h ziJ5jdne1Xs@Y?=W1<~imk!WqJ@f95AXSIbE#=f@SR27$t{Pn=Y*Fg=&!X<xnz7|0Z z?pX46LsF^cIW3A+S%DP2(W;wTJC=Ce!5eVvZzuC{@Q_O8bA+4f!Dq_Pips8HtMdGx z%s&sr>TEo-6XCi7lMqk!7koDZonlT2VywSLx|Pg{eBJaJU8`2!*{BZt%y0{F79^$< z0WSfaq3@~We0>?CxEu*L2=7rbo6Cp8Ra94p^YMMz7p%(dzYfgwWZTTx=#fnZroF8B zC&im$&D>&$kqKymcbxMvV>T1@YkAkTc|2$Fafh1SpEwo~b|M;<FQ`@9QB|W0Ra>?3 z<Du{8N9An0y0XTuu2gIm-`i(q8lBATv&Z6MI?bGVlj;Ptk6GV<t%%MU1;xz&xd%um z`vA^e@EcGdpunn1fuQ}bs$VY1cR+#CDG;>((rFmP5Kv%Mr9jaBSJf{U<U621=@clY z{mZ(a@_!l^g#t1K_I!+UI9i&MwkhUcnos1E(04{rVIGcM(OqmKq!g~@ZjpJJh!lsa zCE1CjpqVPuk_@-b^uLUmtUk4e=zk)GtBJ<yYf08MhCN72dTsx{SC>punh}7@Ors@? za{%4BJ(KadxU=AYUCCEM=Tm8X^=QQi6MXf$c%%lP2(AAG%V`7<Z;&kmpO197<xsM~ z{#OrvAvXm>f~8st>RWU=Zh3A08Aa$c1ut9lS`o}_yJ-nH-GGt)%q5b!&dg1~P*0{2 z$=ptvTLh=InfwZN^NgqnVx~L8%F3v*O~#5EyTX+8IKK_&h)koDkK?8N^L$_60ty5a zSoJC3rTugL@7MWR>B9^TVUmQoVOUZyIAxS1)F@_PwXTmR?wDm{Rww09Yh}abFf^yg zS&G<p_w!J+wd4#OPxZXuDyIDh@;|G7e;<?}pny(+V%op(|AYCzPQl<hpunn20k;2D zRsWAK3VdWjYKCpCPpiW*Lkw#vf<aEEB*8K`>jI61HfBu3@BM_FId*FEP@DMLc74Mv z14k*<M@zIiM_ic*cQnkbhSI610=D>{%t|P^D!2c%sxLcD$NHIV;qH(|;G(bIzyh}L z_d<$=&x!lGZEoAGO)cTh4~}>`dYRp_)VDI-vbu{6knW<49N)^KU5h^hRx$JcVEw=9 z&hvtt2NcLhfuQ~8qe}2Bpun0zfnwUf@c+2~SGwk0ZO&eb07GFNz&SJNm~AKG^(M4& zWzEfu3Vo!PI!5>D(#g0hQzNoDS|!NX5lnLzswzf|{86|INn^8k#$03DjkY0)WH<iW zNNnZo1h4HM`S&Jp+!dwTZUOvR;bf}@&*>J@>$bES4ARa>g;zyO#!U7Q+UGY{1lulY z+qt0P_QGE$X19eK;s!*E*?GG(W0N$(j?ing$pm;Frl^YRwf+0uC2Jo+mBAd5k}-3F zK<;N&O~YIX+^*O61PZsk45qu`em@z@m<jkS-0yy&WNqB`zoq98FlL(_NNigbq=atX zYx|EC)F@VpYNkXODr^(bW0r_EMJoLNK<s6*(kOv;g-ws7(@+I6T@WV`lO=Hqlv04E zP0#D9$CwxkT9QrSM(B5INt%+aV_it6!qiOYO3h3q!)%8}#7NA@Aq3~3B^neikaWIk zSWNp5`2TALPbetmnnQtN+P}{KOYgnwolLl)zByknQ#!X$PX!ygwdPY%8b6C#OLf_3 zm|hq~G9yE`o{A!w@l+B~Q9kSQtX(e(6LFS4=>fF5Vnnr>SqRhyVD!W<$4^59%t*uc zRh=^fNu`lB%kkR&bIt83DuGr|2H$3?bvmU`DH!|~5OOnk97*V8jtk+WU{|Pxy3zV% zX5%JZW8E@z$G0|^22KG->zX45bWP}#a?^0ip>>TTt13F_8ojpvnwA)r6|saN;VM-y zJq0t>*h!(Am_hmW89+fpql!~B#Y!`p0(UaZmcdEE_X?1QS!eod7?R)A8cWd~GTZ;E zD*s=ksb06oGPA3weFJmi;%*5Hj_X>7m@|;n4flN`UQw+sR?|`kds`;d25AYH?5La~ z80u#=`uN`odL92gn99aS=7(;zO<1DM)0@|y9QU9Qtt;{gdP#i$Bso>qWD5HHK$|nh zBF>4P^rI2OM~_m|NbONYWvr8#rKbY|c|K!uR+Bx=|E85ECF}{Nb?9m3tQ_rp0_{;% z)$nX;R7EPgff}{7%_23VWv4pQ*&M&KFHubU5BUFU4qrGZ>6$@-V%opX|4&B!(g2if zY;LxvVb9;W@V}?$fSO9AJ`tYPMbn7Im}AP5h7pERsvJpfSIhB3Z6p{~nKLkrs`Fh| zBhTOoBVJIj=YBmcL!;|_pCpjj4JV(3DsyskOG>Ao&sz?90y)EfxWf1Ch8&WnjH(t8 z8W>Sq;ls>uRbKzo{wE9oHf2lrvVLA(#%YQqOQ<?eS#3bFXiXo0OE4<<v=s+$by z1(pm$xT>qxVT<hoRT3wgS>dI=>d9;wW`+qNk>L`cUUEM`x^JI*F6|?%yyANu|4{@O zQ8l!s;grCL>E~1}3P&2EiK<F7JC#z8Y8#sCW|*z2P7>K8)X3p=Igctv`95fonswp2 zX;GS<ZA`S9DQYSOb>aUP%NcrUM;C=MTpDgW8R`O36yrDPv=i{!{!=MH1xt$o_Dn|2 ziZ_PqO@EEL+OVmnnxa*0I2jk=6`wo(R2u5SaLsKDH-!zDHP86wP8yxoUC)~3rN?sW zuGuu4x@$HKrzi20hS&BVh3yQ#H~{IoOZKZ%jPwd}<fz*2V64`Mld@Z&r9HaVVXSJ8 z#*C=-o6pONkG_GUXr#8jF)BK?eC{LMB-}&Lo~jEh#uq%gr<J0))oy6&eBklgc-=y% z(*gdckTVrX32op^N~}3yXfo#(sxI7MXn1fFa4oHCpWaLRKVnbE2KbQ`meqG#%ldGD zWqmuwvL^0kS=0@B-A-!;?=&c7K!H`A0$$ob+dJF&0h_Ptr4RBSP+-lbK+yiz?C&3x ze$A#pG3`H)|5>x^N>KXMj{?QCf06$Q?0>9&^&lwGnn?jK?SI{a9KIiUeqZnI@B+va zBtMWmK=K9110<gyZ~+AZ3jA~_;HCWs{J)>>_Y86tP@otJcxnH^{$DW^4#EZ$_~}x> zOZ%t(|6F-^SHwUm1WEWWnW0OU)J`{agvTv|693kOB>WR~auaYwNqkQsM|uT^svJR? z?8E#cBQZ0=z_D0OT`cBkh4H<7N<h#_LD@k!B<AR(pq;PsSq=*XB9RPg194O6g31Fg z?LV0R|8)EFAZGyuilIO;?LXN6D~7T`*nk2*eF_Ba|EK?rf*b}EFhzl4+Q01o2lIbZ zUn7V&pg{LhpqTa_%>TRh+XSfv6fjMJV%ooq|K$I>9LA#c4R_f_hMRz+h~J1VEjI;o z=InGDnJj@J1=$+6-JHf@mqzAvCTG+mlRFaT^h&!$&{gfH&!dm38c~XRH!tl!nE#vZ zm4o;L3Um(zytIEg_b+FF*&hThpg=%@RgVJ2wEtlJzv_M8Ajbg(I-@|){yU>i@GhXh z>P>;5{jc8NHz-{|fzBupwExbi6TAy3uzFLVnD#IGe?0$3o*#982D(62@A?sxZuO=> zB#|t;M;bPY%F82xLvb+}{u%B&_7j6~-2sQkR&V}jZdY8N0IUVfuNrT?JNqewoV_-K z+_;HleYCM<HRJAsbu4QLaQnKJbt#^W1HRbIvX=F+ta7|x4xGP%W!-@=L*dWE^EkpT z$MyeP-?FYp*!_W7xIPq_2(M>Z+v0jpgzJgx7r>-^0M8fU`mSF1-$s_T3o>;$uD96G zvgYEt8DYNeX;}-9*2#D_4`HUFY@guWUU<F&dEOamegKTeyXWw3A)al8|NRx=rz3CI zA>09*!Uw)Y`96a`4nFBL9AOL539l55>C<%*9;rFb{RDCw_yGlcqkxz3KYRZ#I<#_F z)vysY6c`D&+Rd@JEk4cx*Nv@-h}!tFa8sm6%fXZ|s)<BvTkBJC;!&xwrcTP*m9?$$ z2HNi`F`uaz-ILKZDf?~HVA(pFFpxq@H@#exo<_zejD?%(8<eTA5^0ketDJi+G144@ z!-RO0ahFbooTyXZ(z!61LUW59Z*DS~Leh>nrnT?^JXom1-y>1lU-S0&x`d6t)9#VC z|0lx@p8t!q!^tGfYj{n(4K2BZyf?%f9g|NUiw?^jO|-k?_3x25O$&Pb_em{C-Hr{5 zH#K;TqQr_9wWl}IMvKP+*pYC;rCuomQcmX(vy~Nfw@UjQHH?2EcBjxjM~!$>4cX_Y zjdk&Ma#qro2JCaD#mX3}m(MXf=5SQS^)+T0_hC0k31a)70<7Ldo6O8!Vm9h_xFv3+ zZi`hq|G#B2ezG#$>3_@(brFd58X$*OO<-H9IWfy@8m<N)|0|<b4vM^+ol|omGYu)4 zrByPTXfvCFS~{6c!cK(ie3*4-t`bm-YBAL-dHt9-){^UHW~`Cc#zr3+Rc53xuN(Ja z9grC*YqSp&mCQ)%rqe81i5+5Ql<}qrEM@u}sbABy%&a;jExDfNOe?kCPT7U?nHWx; zEjinnv~cRI&yliv`5dKFy?l<82Y@gpnTgfsuaBu$YXhx!d*T0a&o3X#FXqNN&8h)^ zk{o?<+{ra3XPz8&a?Z&qrz2;d+;#2*kkd|1zHs%)@g}$bE^zJ1o#ze#cLd1IC&!(; z0OGitz#RiRa`y8%?lf>mfE<7BZg59Jcid^<?gV!SxKqF#0CN1fTfrR)a{ajrL5@Ei zcPVto9Rl5PcYr$<+)?0819v3oxI@6*3hpvwJMKhqr-C~X+{K{du8BDAGH{oJyB~Di zEzunmu?H@oK#>&i(*DW+m;L|WR>@vphpLZkSp*spnp@mnt88(oN!_F~CXIzYfl6;# zk8bwN9S^sM4nr#w$CfH#*%Am9)uL@X8Wy&PR?L!+jxS-^k_i>|*ahEx^VH%{_5Jz7 zvV{|R*iX^R=uYBgPebToC%8R=gqN`F)d)T8rCGg`gk|qUsIU*sFTb;VacF*44<TXM z8xbn(fsdZH05p3KdD5MPWv@x7uzjP$dgEKXSRgEWYeIz`zRekD4P6p?yFgg>JcJ5+ z{MkdF=-VC|)Fi1oIgvZ|l!OZFev7A(j_xEZdvQXA-MIXSWs}-NyTQhU?j$Tn144zJ z^WZS%;j0Jrkm<U^-knfk7oC6KE@Rq5f5I51JBgR05~0F=Hs`A43lMg&9x@#-M+8EJ zb;~w>i~M0Z8W1Y%z_-iZcxFjxz?S*La^xda*iGg|=C&>g9WyY0SdN5*3cKy(H_JMf zgdRpZx|6bT<RDbohx&ZD0qTR7_D}gAUG|6j@PvwY>ZRL{KV(Vh>LGd#(lp~JPpGg@ z)!*{Ly!OzGH{=h?k&;kh4?LoJ*eUIyv4`gm%aM^#VIO%sbZl#TXuqxVhvjU9P+`B_ zc<uvxqn@3TKP*RLLWQ09Y5T}uw1?(a=MT$Ko={<jJ{nW;qOa7Qd<)J-2o-kHw3n9P z8+YuihfLFqvmio+T`>RjQ|j777ne&+&VS^NGbBQVedx7I*#BOLI;uMf%h?8@!XEi` z{hjDbrr)fGOy_~KB0`02dSUQl<oDV^`NMM7N2stj)b)D@ZRn7Z`NML?MX0d<`J~tT zs1G%eE7P6im$N%Ug<UxJh2@X8hsws_&zh64oOKZ@>@nXS@lWJoxAU}sxRkJ*6%s0} z+n=3_baW?SIZGo{*p2RK;5Y7FpssV~N~o}p-u-R_W7ZVZXWdD>ob?eZ>~|mcd*{;U zLa!HS$DCCXDy-Y@>{s9$bEZkCu-DF+#j$1GZPGdL(*BkHkJ6arTsGE5VuV5M6>bV@ z-4A9$d1Ip7XI0K_3PvO6W^J9dKPtx#sFa*<{QU=r7xg)I%DWwtXaD=DPrn)a?7AC$ z-!c2=Uv_ki8uaC?8#W(#uJw=epW6SnJvP~R*%sTLJ@fcidiKFzwi|u!8JoV_@t<R! z{``FOmC8MV0Rc9ftOGH?#Njt3ENgG1wP+$bKHP7092yGlH=BV$AO5U<c#r2D`&-uY z@CP1XSuesre+SE|hyN9fKkWhkWJG!k{14H|;g$8P$(HpV{0#?N)-T|P5&s|HUxAw0 zAO5|4(SgIi4S&81{#Ip{g`}-Bwz8~A@O$iQSx>-Uio_p<|In_M^;`IZ5P1y#u%j&N zbNHKJP(_xkf8l?Jz&{)L83+F^M1DW~1Ul%Q;SU&XSy#h96MycHa=n4_RlvUq9RcSC zKReX2-iCi;lVy#;^Br3(Yj^ll`#XYeJuwJeg7@d+`8YgZT!%cv-v;rO!M_fT7e%#x z*vYcm;C~vyJ3MCxhWWAe`>17Yhx;)DKnvVo(_mRuxSzX=Wu1!q8>gd8xNkr@zry`? zC<m8#|3-PI!G8#a`!oD2HnuDTv9`zmPJzE*kYyoDDh#q<b=0CWMm&GSHHvO6Mdx}n z{692W*2qv%>wn~2IokL_jLO~@=K-P*gf_nd7f>Lez^X$5FXMl<{GV$7C^CA~6vpE^ z8+@-nlkoa8UU&99J8brSb{hJ7J>Kka@=o_{baK4s@TfoM{q62M{kfOxI}z790H<%5 zrm1<_dhpi=*nOjSSHlH|{doX~-hBX!hSmh&3gAlMDuBb;HNdsNb-?uimsWcMYXKP9 z)X=sC{H*~_134sMI%{E?YH><{?pzJW1K@8DV6?F?GFuo`)NsZwp37E@u4)(^0v{uf zH5AwmC<D0UsRV`t9GV6Kqkyr%uE1Wv7+`;3B5(jO4448O2w)^vT-syc9}A2CxO|uc zkj57S=K~i3{1zM*#{rynj0a8!YJr~vGk|8`Bmg6*bvb|;kA+!`wIfgtQ~~<|M+4^p z7XTLmbAd~MUje@cegj+zTm~pf!@Nvz*}5_?+e``9raA4UrsAdjbN+8dP-|HcKEY&! z2LsN-S9}Tgui%;$X&P$ilkl&>S8j(t5w(mJ<r>u9$Kgj%yCU%4Iuz`6_>K4zD^3+^ z_0#Y-#5{B_#8rtJ@B{7_BYYITjr4ZJ^B%ab!#zLbx<GqRrvg@^7P8{(giIcYaK{`0 z1|RP4sz+tU{on8hWWm}Rwd^zaGml53!}B*#Q~8l^T+68_y;0-%q5H*A(eZu+YQBy8 zwUAF%>|VW*2K<4j%@4xA<}l35;opgPzl49(-j?+U{6@5tgW(^B7Q%{o#x_nx|HIFm zN;eTL5hSpBjkm1d!G8nsvQa&NLVO4Rezb_C@PCg)&x5}aYAq}E5<LGu`129&TliNX z-7ny8j`FdAZHk`<;NLjFX$*r8!neWwxanxDD9?nxPGk8?BN`{}E0X9`;4kiPStlY~ z3({#|_$D+uJb!mQ=IFTpda`A`5C5X$@D1>M&XJb&G4A(4dGN`tv7p1>;QzPWvd)2j z1H!F^a0`EdjtKsxNM{24aU+}t6|F%Bi2Gj1|ECDQ*4j>oGi6uI#c}_57-hoy1?aUV z;=UZ|{|o+r3a1koi%eGH{WT|`!-PK=J;|APzX8%e3;w>SKP%uT_rpOB_*FnJU@d&t zoe=(9eCK(%e;Jv73jQ#pgDPu1J;v!kw;BgVBknJ+Mdyj|L(r=nj{9Aa-uk#NL;3%U z`#yO15BLwDp5s$nr*7$VX15~!4%~k+7T*ef50rOp{BJjWw{LJCJ=n5dgMZEx%<bV% zM<ttx_u-wLPU|xK??yb|5cTE=_@Plwr(c2m^g}osm0>u;<N1|%f8_+rdItW(>pLCX zlqfoNyq}8lT!-f;Z0mHe?MVN7=lsdzc&wjSiCRsl>Pf2%3zPnMR}J(4DkpvZ<sP4- zeZV0`W&4-&|GyrBr6NAx(xcH7QO&qN_ywxfMIgz&Xs)yqd>-of<{-s=XofFMMO8#u zhT~KI9MyyT#0q5lRos`O`W%N(!#>6igA}_t>kF<eIPais;WDIkY!Vr`75D&jTL%BS z-7zS`?+<$203VOlAo?vXmgBl7unw>r!rcb{t96|LaDz>p0p={+{~XVs0UfV`zdtf{ zAN(sfat4X_cEs8k_t8pcaJUK?LLRMKP~UzD|E_`fcJQZw7;nM<9`&*sR9f7OG~xF} zxHItl-7?EM9{vxgKfUpM;vi>$N}?WKj_3Do=L~u;BAttH|2inYDg0+aun*z448|H3 z{$k`CS+ypF@gDJ<HV%Cc?#Jwpz5)K}c!sQ7ZzHkwaD6T!!FRAGqkZ**KYP4o-2?xP z{SX)YsVAb2AsiioSf`g+Y8&_B2<U?6n@mGr2Y>7FmUTDYqqvHuC*VVm!1H$0<Ja-5 z<#5aTC;U2;dsjUFe3E6o$@@Bt7r0-tHTpu_KZp7~6MjE@lr7*d4TDB_|IL<`g*s$~ z@c*&6-wFT!6YjUicl-$c0lz@Mh3B`T0_+EWDgM6|p7*lx&2T>o<s6OsIf&#{_&aUj zOkPk-YdzpRlw%OW-4Vt_0RDifXuI$y?BQ(rzKi=!aNk~o$_)SV3THy_H0ZMt?teh! z*CL*tsJLte%MNhX)??8wHp8Pg`-7J7XQIOY1^yxEr(cHuD(VkNW$grdZjJx_UjmH} z{szd@06Y)(bS7WrL%?If{jzPGNzkjH=exLnFNSak{}Rf10Q_Yr-~Yq&FVX*e0{?pu z^&R*f$nPBZpX`D<0sk*?jJpWGA;SF!_kBQ!Mexf|uQqntKgm_7{o|ji?b9dd)cF5o zA7_&1JnD`wE?;_e|H3|fS!+i$|6%w%lZT`A!+!|f@&xz`@bfJEV>fZ8)u*8bZjbvj zr=mvS8)tl3b_H(&_u)kZm<II5{e}SIS5v(hp1pzVqu|#AzXkf@{yku4T)zV!ty(ox zb_ws}`rkk^uD64~2mFhGJAnnjg#f#ksqpUxT7Yuk9)K*gT7XS}g}V*@f8pN@|10?1 zhWsA>2w)_@DJ1JRn;e^S7}yQ>y94Mk)tZ5YJ{{M!z%jrKU^zgx8N2Swam}XP4~XNw z9R88;(UR1<Vj-^ohwI+(=fWo&@pj<Xxc&|BC2$#V4=@?{2&e&$2QUh#X)RhQMqG!5 z_e=P90Cxg+1J46!&1zbK)~&{4cKsOX)Rgc-_!k57fayqgKJWpq?}Gmfe12>;`NhEB z0gNPSsA6}-`9JeksQshPsC7~g_@8}vR2%Q<5Vab&ISzBoCl7$*zl_ry-#HK9yx?mP zn`1fW0h}*z4CnlS<2=WI&I>sHvtQxZ&hOO#JOVu6g4cXbU!Kdg_`k{uBhSSjt-a?p z!)L#fFh}E^tp9n<=d3pb^TzKhVKL&WYw<x2wX``D{yy$IkVE}9`#+Dn@$kL8>x%yu zE&Y{+XMULP@c^&0!@rgl7sE;z{zu9s&!kL+?)iK<;?(1ju#8Wx>E{chzvs37AN_h} zR=(wb?5E_KKKmB^KHs(eJ@dUU^ep>-+2zT;&lk^SdGaU!6JP#UgRs*8_Kkc-dhi+V zhr7?D-pYT(XBhsM_YJP^W&O|gjK62_|Jk<L-r4@^S{tJfGxl)UH&dEaP7#&L<B)@) zF1w~PNm~(R&y%F5qmu4{y*$zRdJsq*L30js`J7bd7jZ;!jV2+YxkeKaIc2knh&-^* zsdQF<T}ko1&^kGz;p}aruLkwLY5haLKG8b5qvOQZ_3$XQXnMVem-f%Gob8|Mey-iQ zMwdAN*ZleB0bJ{|-yk1=a{_%Xz;(Yq4<HYK^MGh1+LA2y^<06R)G+-?QU}IU$GJ_X z2vgs3G}3fZ+Q|g>{F3PuQ{+sYT{oSgj2Zq*cH}hQnBB=h=V8>*PPwm~O2xGQ9_%{c zWDYO$iq+L$7iHyq`CwoYfbLGQ>d`$Z7BG9+y#daL_XV(oQENiZmnQ<?45|GrbdlCt z0DI$J0K4GzfenD(z=ps^Kp$XZU=v_dU^4(qCAF63+7r_&#VV7vG&pIBWw{M}EUQxc zZ~bvS0N|p22Y_qo9f3i>U;tCJoV~kYcvcP!2e`(p1gd~)K-SWuaLsRxsa|R?kMmP> z>#4Q$cw7f=)uDiw_Rl#!`vA`Oxt0%HK!Jb)t0o1CY5$z_({awvYmoyY?~n6&t^<Sz zFsm%Jz^zHPHPy&`s?ZudW{dibmCsqCHcm#@Q!7|oWliHsQp#Mw2J`>oHL&GOScCb0 zs&0GWapjP6m6`ub`{!Dn*M6=4$@`Zze|ATa*?e845Wb7@=X{e?6_<<r>p%~yvy}QY zpZmF-A}IYjj_xSaNu`$ODOHDgQuIbEM^jy%=zMO1Dcul0CzZGU8Zkqf77k3QZR|o> zyo~=c?#uk2<A2fsv#t}ih_7E?+Bno`1^oZ4iCSj;4fy}5ikELzn@OycK9DXn!(wK% zIX%5rf4hbMpRfHplHDRYB0^U;g6%~H!5;x~x<vR4mx>!EhnGZXm=YD_j`alA0pzfh z2nUl3My}j6fZQ_?x~j%Qa>L|snh3jzP^t)JiZGuDBa6_L2%(YVMGl<^1&Xk*h|+ut zwj8A{MEH(^r{vy=NRkKz4@D$pcrHSi6=3TzZV@uP39LYJ^F#<&gkI$^oE)MPVPFx_ znS%e2b11@#BJ3-N=S1jF4vUFUv>ZkgVY9RGQN|%25r)QP;MPbAcp3jGr&EaMPgw-Y zVikH{%yW@dI2!T2=^@T{Jp4z`-x&q||1F+>2Ye5(mtv2^9*aGP&fC{{`RoOSf1k~_ zFT=b3fX=hu5%<~rdiEgXy>nkd-;-E~d}QxKT!AoG0`~zg051an0R9Pt5T2s@@8X&w zw}Sy5aizHJXkZ9%0zmniS->Sg6nGH09-v$q<?<+xN4dZUfQNvGfk%Mf1CIia0gnSu z08au>0Z#+Z0M7!8faie4z@Eqp1`9PRyb1q3;C<jDAbXGGOFW~z-B-Z(0Ok7n!lxV` z<@_ikD0?K78>BqmuE1^p<qbarC>J;ZpzPsPfO{mAUkn4a0A+|Mk4Sk&)<equagT)Z zg_N;t0h$5IDpI~^1m2AVD38cG^b7cugJfIC-Xpmc@3}i)3%mo&0G0z=AnZl(F9$XQ zINBYKXWW+&dBc-&e>w0Cp7n-57yiA#?YRCm{NDio2V4f+155@k1!{offfIlz5C@Wg zm-g@X`k(v%IuF3LAP@`Y|B#}}H_yzO0S59v#j$}`cljT#IG{^7nk*j<S5aLZE~NaT znD*ZT{RJJ{D);}$^QTM?`2buKkpIv9K<*EcClI)R0s#en+7$58{zd-hr(LojcL4<g z3apF*LHl1Bg@X411y)}Q1nqzI{kB2L0t&2*0$$ob&-ZYv^Q3rFteGq-UMNdB-L})o zb0_h-D7j-ZW1~kl(WIZxiD#4$#e;+hEvNXLN*-3;k4nw%PaFrAU}P*TUr=LPjj9^$ zH@W#y$yTnetg)*rmC-aK!Z_(Px}AxwHI4cPSka*ctHPDGnD&n?2IY9xFPr~Inc#p2 zxU$|hcpp&Ur$qrT?SEzG|9@H~4001tAfP}Y3V3P%!I{58)C`^n6j-$=;HCX{m;R5s zhSo?lbs(rFCFZQHa9Wy^wyDK`dJSjDL`lxtKUG4zqPv!jNGV(kL6J@uiJo*h6)s&% zQq0g6UYGiwWVm&v|7FZ%Cm6CbQ<#u?LrB&&hFgj+p_leAx_c<+qn`m<wR*lFw*dtL z3KY}+MgA|4{|V|%K!MeR0>!j{;s5(B|F6sb>pL@@?OS-7A7)P1TEdAWO`vz%Bs62X z#=X<xr)ymib5E~ZoDw=@)b`b)6(jsEG$~sbj}Sce>VLs<Cc#i|AX|n$+jMlx0bLU) zi0{=yqf{c^7ESn1DlLVT7r{&W5BUG9N8cZmBA`If{)0LYP+-laKr!t<SpToN^&}|y z>PZ1F?LW}}yL#4zpj2xf1&V3^!v728f7ZNu5|nuLq=1+9AISf&o^>H8)tX0vV%oo~ z|AYDenpaPP60e>VVEca@MJr_gw?E!h18n=1lRp1)kI$*4(b50UeL%_r(GCD@`te*a z=LVDsq<vr70=yThdMPhRyMMIvdtW_Fm`}AV+6SghK*|#E>>y<Ts0WaC0B9GOIz}mH zOr2uXCB{C7=L@;^plv|f9o`lB*bCSnK(dYvYWT>8bw02k7A!Zwe;RlRco|p<yaN0O z_!#&#!h8Y$Yk)STzlHw;@K+!L*uYu9ZNTpV3t<j~cLA^hpb2?o*$M+Fn$k?%0{=AN zX5cPhM}!#yzY-V^Oa!I?rvi@wr2lKc0EF8f*Z~*_i~>L&YbG!oI0*M=!aoN%7x)~w z1$YSfGw>;}3Br^C{eh9d2w*s#PX!u)Cx8v`>=XEp02|_ZC!iYG7B~?2Iq)aE+aLbH zz;?hO;5$4!2L7Y)d%_<F>;oJP3<YX{p8>Q(dm_TL0mtEbU!V;*68ESARt#tct_J1< zYvJ9Yz!AU<paEzE5<n85J=<2`c;I3H)yk>^<^b0M*8?{KHvvxp?ZEm7cNlOca1L-T za2{|zZ~;&U><Ro5xF1-C|7;3>b6|I1Jg_%#B5)&c6L1S~D{wDxEwB*(xgU5E_#^N- z&<D?l0aJief!V;>z+B)`;0oYsU;*%Ng#RzFGp=L69YA-xV#a^Tp5O96+4?_6)Mz3M zW{%x!3FtyHW+X|}F>@orOs=SkAxS2UNajw;XGq(aB$C}cBiiIj+oXk|Dl4PLlnhkV z*cCiFVoJz|f?iCcl#k=3{Ri?t-Q7zE=>-%pLjf=CpL2801x(KWJDd9l^XZ@Vd^%b{ zZ8_%?GG>{yw<T#f61=|8DRM-SZM*x=P-?Q|GolHZ*Azd0y=+)TXxNsa{kW=+UiRR_ z6XS>N^~eeDKe4RODHp7JG1lWv;l^lEiHkdvCd#d=+q#BuGFhH^+t?g&!nQWeXlg#G ziGN8wOW-uGibIQy>dE0MOvt0B4Wc<#KaGfTrxS6`wB}93i|M;?Lw?C{FL9mJlEBg8 z*syq0Lq0-#h_WHx7`F=?8ukz!j3R~;_4x~&vbg2J)+T$L^cOPO=cH4KH$mx^>7t-f zwKhb3NTrzZzlS>o3C{nSnTrLn1{COS3KY}+h5r|v|L^Xv6r>kWzzhY7Y5y|*2mAkK zzC{pgK!NV2fS2~qef~(at+J*|r_mFwQ8Hv|Y}?#En4M0fer8+Pz@h5AOrQD!E8tR= ztT_p#m4ex%V|OHJ+pSG4;m#FDdso1a{jKt{OiCf4;xlTgbdyGc)Q3tMQHGyYsuq7r zwNi8MdD*8PSUhzJ8|=RVwbw&@ZQ;Vvl~Q>Mw?Al{05dZ&D?iu8LlMCBiW|@Yl2d}1 z-B1?+=QV%EOCeS!f2|X(eqN{(wWl|F&}g@^K`DnksdgK))s8`Tj2<w05I@;OU!M6z zTsC1RJ*=1UKd}GV-LteHy?_E{D1fcnlJ`|O6EPv<l+#nQgPzqg&Hr&MCnar6FeSm& zS(;{6N;xTFM$;S#x5WJ?Xy!2FnA^@flPqQSk*7S(t#*U=&G5!Tk_$O0)iq;pyS^r7 zI~V>FFek-SjpR-vXIlQG>1F&6_<v^l;vm+50^LmkFYQ0r|L^Xv6r>kWzzhY7Y5%hS z&+~e`=6O8!1w5ZenE;;E<JmvX4+0lZAfUicp8{Ume{lZir~h4p90nBV3I!sGWEsy_ zi{ttF8vvez9*l=P-%ZDUVmW+WPk?&i{_FxDNBAwCBiQ4$&)!%xd)sBardz%?&OhU3 zD&pF9eVp~~jq}fV_H|F3$KC+C10Yz`jQbDPwXBmj#98|FENd3RmE+m%cy@nZ%X+aN z&a5Mj!+Tj)9M5?6`T@kVGp_eSJiYM#gLN$H|KWeTAlw%y1JCC#NBoNr-(L~$UHI=E z2s0fx0pYL1|AylI7I-%V&zg~sLy#8B$}{tY%8FNN{zIRxlkg%kl@Z?gSMVE9;K!#x zG2_2f=C1Dl#o{*XC)ACtDTT>PR(MS$TH9JLCpm`UQK_+}*sFGBZEL)N1}jR;XDY@- z)RA{ev52Qd-R%*-Q%JFd<)ZXbWb*C9P4zSlSn@Z_j8&wV{3eHpvXoAR!rwB*?)N+M zsoK)qV#k}gg<&iOh@CXVYn>EYR9zifIjm~f2pHJRvbY(u6Vayb+S-dZhU@(}(InNt zEmUURb4~)9--*iooTjY|L84?<(vBLiiIY<;q`SfP7muN$CYdf=ikzvsYdS@#Mcq)i zSZ8vb9t5W#X@`@!U91Tv$NzDgIP-nZ&$Aup`JAV7O~Cm--A5ZcK7YT&fA{PI9aNh+ zb8@Z)IA<5PuUrIvK!Jb)o+;p^{gdZ^I#NWFv^r+D{9@s(J(tbC{L{T&+3ei@%*Z&j zV*<-<D3p8jv;_~hhu*{bT6Zp6L9L5<jjjNS<u-ff4um}nYkF}<;zGibM?k1}k6rNH zH%~1NRZ{_*=46dRo&%wWeH#6V?j$Vv34|VY{1$phNB<$8kiS5vu$#<_%xzr~I%Z)0 zu;g<PD(uutw;zAVlF-#d@`okQgHU0gs=wufdF`PWsk~5gl3(_VgbMq}<Dp|)+e7<p ztp&uT(2P72LWOl{wx32{{!8K|zl2a>?StNWqpCeLh6)HZCt=B}AynADR~-Dvxc1N| zJ7@uMDPhTPAyn8o4-R{xZ+mELJbze@8H5Tu>V*1jI+lcXLw(bol#P5LLWOO#o?3Qy zduUpLZ+yU}(C-MSu%FGjYWafp&~CTtv8HK8UJ;?fo_X=}k5w!Qoq%yjcTzTvPlO8l zP@fMsC|ewg;5+J0@=Jafp~4>X?GgWE9?sK4rfEh#9HH99Zx%f|^uG4c4^#r_I`Zfw z59DzXD&B!_m%Z`KlF)!HC8Xm^Sn}Zr74|=$^eU$POF0Ui|0T~(#hXZ0yo`3S^y2(^ zAdihuVV}Lyp1yT^=twGt)STp(d_O{kU3C6^yNqcMb!5#aB<%8yKnFmDedx7I*21^A zFsrUh8J3}*5Gw5OZO%Ar=#tRe1^TF-_@0Cc`|ZYaAJ`k;?G!DuxRiJ~hasH&ZrjnY zusyV5R{pT$VG=6rDdmlOpnteP-K4`y**IS!)a#AzX<#0D7wAjKQzcZ`jmwW%HVOH~ z{;cjKUe3V?752!l>+eMWJN;%oWV)Vl{za&;UtiSt@fnLkw`S2-;w5jDP+^C>^2EHG z+e5n#%O5X!!GsEX{Mkd<Kb$KOxqp#c&I<_@cB{X)-t<^|=qf5E)tr0_@^lFm*6sTy zpbyZU#LM|5q32;xlf>lwL&B1WOsKGKfA-abdaP-hk$+9-dAL*}a{nT?<Yg0jyjwk% zKi)6U=MXAv-{`R3sOv8xPr8%be}*y>Dr~ReC$LT)v$qqnnD#IE6!|~$*a;P{+cv)# zsOKO}hv$$PLWO<#kQdmmTU%v@mHd()PpGgr)b)D@{p2AdGs8+=?m{3!g<UZJ^i%5E zLl>7zOwNBK>^$@hgbMrU-S0*~hbic@bSM9uhrWSOVcqfKPlNT4={A2U+B>1bJ~Y4l z&ho{f`B{CG#LKk~p~6o5w0-0++Cy`zGvk%~9*M^Us%74}5#yA2xsO4pc-?RDC&*&x zPU7WyOzoNQ<+XEWF~93>qlZj?H}0z_@b$3j%{Tw%>724jyi<`GLgnGRkNdrI>2smi zktf|r*c;J?2^Drh+-6_hq;ArorEJ{iA=K-kkH%F0TagaOD~b0y)N{g#_p+ln_uL=f zQFjtA_k{=*cG9$$mSD{4*jW#mj`w=BHA02mcJiBLsJ{<ql}+O1*i5MJmS^ndxGwqS zeiotPZF*twV&vi4LHYB*{V76)T{!oJ<&U?A%EqAc)||vU9`&41VPC%Q2F|M&<(Wr$ zY5!g2|7+O_E&~b#6!-~JAZY(T!H*JTDWE_%QJ|RiFY_D9`zFc*{hygzi-G>nXiKsj zyVf4ItOEU?UDBnKRx<jd=>L@VFLM8s_2*iK{XuiGIcAr&#gnb!hO(sH3e6T}qifpg zQbGlR{*N4z1o}TZt1!tx|3}Fu^Udi0;5i@m1=0_&{mZ!@C<KSSlVmjF4hE%&{^bas z1n2)t5~a*T&*1!jmlWCMP%b5q<Xm)vlu%0O>c>0(FXKOLbMTsW|9BRV{Q>R%u^*t# zKk5hM9s&CY+WBMOKwE!2H$*#tv=u0Oh@3yr{ugbE(LNw~i?jhq8-KoZBAJu)K>jb> z6e+{dYR8-EDOcSEEsi;rKUEb2`9BXMbPhRJ8TmhH|7_=ujJsA7l!(6n{a|MEg?_f$ zLWVJXooS>BCKvfj=5479#fAB!^R);{xerWUbVE|9(J*z?A&+>jH(EK8>UpB`nO5Cn z8^o=@o#^B9LmyY_*hUw~M*d#|#&Z3vThwZT-P@#9W`!+mAzD8N*!FLz8>qGuIaX5! zkYhf_c=iXh*~@XBc7Hkcb6giYy&TgyC+M2O;53s%4vKW47=Ddsb|PF?;1GhR`U|@| z2F%*z8A4EhjdUxS{cqj$88{8(^Y_S1!ZDv?I1xu7ndw9vwRpa#lJoUtjG{WSaD&($ za?Eup>sr;-;X)tHEB{}3f6cV@b`q?B`K6Go(*sGVl4|D9X2wR3Y%*}{h1HS;Qzb<4 z(83C6FZOvT`cbLb{fT1{fn#Q2e!+<tWKIVtIJ41LgMNO~`bT^{+xi+~Q|o$oWG#h& z8)e2`?*U`o@XO#s?#lWQZ+C!y>?SaJ4*y^Xbx{s20ihwv^E?5;9jsB+Gs<N}5D(>J zkHYg^;Xerhp-T8WL7<1SH#b722IH49>WwI@$;c4opsWQD3TGban8z!Scs2Z2FgjAk zXg`1%Wg1Ar`U3_;KBLeMvSu|R5XMUt7v%huv3SZ5jYWFMidBt=Tf?7)#3-M4E(%Gx z&3zEhzVIJ_P~1@XS7KByhd&YbyTE@4?=i+&VI)i$pMFT3^6OOqN9;{d*aP5ifJ}^l ze=6<|guhlFb#{F;E(?wS9QToXHU9IOj&0v610DvQcZ6R7IxwxXkbh1VZUS)_W&(tK z$HQL>_qepKKxX>G{|dz21O6Kz?hyE=foR*qp8_CC>np@Vd9=+zhrQqrLt*xZe=j20 z6aF{I|3UCiM~*l_*$(l6w_vrS{M*654n!Rce*?rj0RGu{KMwxi5Z^xV0~b&rpn#%) zZ=9fD{a@1<uS=|S9~7H@MkeYxv%+Bg-*t7qG0yIqP0a5y7dJn>^}nZub6RPJ(WPLp z{x4uiJ5O5=*8gRxWmrwJt*J&1@aI(n5v>0ys6~Q#S^ul~e=vUvC=gI!m8U?^{#W@= z7!)9&fM*J@{U3pU7vleseMlA?IBnLG<lVt>?~nU_l<DE#-+lGY{-5mqaehEKpnIn| zaz2##p==Msy)@O43F3dbk4X6;?hjH1h;l!aEuuUT;}sbq*-KQ32R{J?0t)y>fnfai zjg&z|0R>h$3Q+&|?Ht@)$FciDV1GR07TQer9s7wgT<h}$`44?=Q=R}|C)2tX|9@wX zCmEEt);qYTzMp>ByQTgv>glFl7V7n(ZWQWWp{_3Ktf5{N>alnk`-s%ZMZHGUw?*AT z)TKooS=1pu3-77Bfx0xP8)8@N7v6=*3U%3VyOlZ>s6&Lhj&?v;>RqCa8S2oXKCG!I z%L?R;dNAI__9FGJP@mQLxTdbE3D{y>i1$w;&(vc>eNg?eH+u)3x52MQxTWxKN4hf* zhV&VZ@P+7uS85JLpRSYe$i3rS(#vh&2Ndv~0$#>{&dpcKV}+H%K>xQg5t$N-^;@HJ zN*YQoAVO1O8kyTwDM3<SW0h^45+lvs1aUR5mrjM8s8a&YspCF=XFioeH|zf{u^gH8 zC3Py<hgeghcdkTQ$x7%oLjrD;e%cWbt^YAQB|%pr5ppV_v~sH57KynM)5wr<^ef{T zk){PFOU!Cva%i%keiflhiKPTjODq}b#XhmR()CI=xS-W_CuTovX6X5>u4EFWXEaZo zC68e_AJ49^!?iSI;eXVrHi<Ow35_Pvl5|vz7%YX>lv<K?jp3HkNtXGAeIin3q%C0_ zI4?b?IrS#>aa)q%)|sUzkeO>Gaa4MwIk}G64e=zcgLkQ0QZiB=PBF49>}>=2|I*AG z<@tQ6LCk02s+^=!^;>K9-JiHNn_+>qV=JSoMi)A^QcAUzu{Je^`Ap}`W-dLR&xv&D zW7aoB;&to_3McMm{m*?n@}~Se|F56>Z$|g!`>82@l_X}P_)$}r&WK_sJ@$wy0o$Gt zO*9!Sfo-dy*>@6ksZP0xn<HN`W>OZ{{X)rFWt*;WyYN&6atIi+Ya<5EdZ+5LZL5Nm z^f5eE^>i;9NyOW_<CJ;6;i?6Fg{i}T*(L18_Lg2vn69DP+Q@WLsqdFw$aG_p&J5n? z1T%+vnbG^4NKUVkBBVBNOD)%mOx(-(-(C8D%nYH4FwEp7z(k{M!-`HPN1g@&)`@f) zDlyXqaS|zM6ezTx<CetnQU_$xlk}>(>M@;6FFjMRCD{~ij3#SZk}2Lzku|$<*2+%= zq*GyPCUm8+Hl$NYG00gKjfjz$k(G|q(W0{B0!inqhAX2|PUn+iFBte7=@Hl56g{1W z!#3*1Q9Yx(Chx>d=aXGRr(a0dwu)%Q2op`VE*_}?8ld*V|AOVIhmD4mKDgz;Sv?fQ z_v*n8!A$}4=BR;*vzEfji||tz|MTkpV=dOsZs}baPf?orFnTIV<A?th*%=VX$#?qY za6`SJen2mbBAJm1f}TnuD#~Yk)B>ALFec)(%5;}jT`{8CM3<%*{}?^7c;NVHh=7Pa zoraMPM=M9xEXPax7rnof6%_s7z6&M=5e5_pC}5ldUfRFk>;HV?f4=kE(u+Y>%7D>% zXPjYQ9F8>_S{tO(Xi1t|;y84&E6nT?<dnhSh~<{S;JBOm)&|qCD<aXl=1A1koRxJp zm4;IeZE7^Ks-lyrk(c&wdjD_Oh#FPNVqjdv5(d{{h@B~P(`Ha!wr$MN0?;j*A(piE zc?|9T<fPzxFO!F(0HPV1<2x0NYgz+3BsE&OQh8nH&3S46-7)@Gp%cjSh3Xq-wM_H> z8|9>wYO67u72E`yrn5B7%nfo<R4T&4Eph(|$|{*w<m{;1@qL8NQ=aBlyP?Vd;^d^1 z64y^12<Uo~E79nJzxF@8O1fmQFn#ZvS$*6TFoGHCGTj73der9+s1?CXYt|AlxLR?E zRP?ygrAn?9!I|ax-bH9B*v&Jd(lw-~$CZ^)BU^7A>MJ-aH#B;%V3I~DAIHo1Pdh%8 z{}VnS&jZq)5BY)A+2N-RFqShtkdTcX*#Ai8+pNzSq5}P&f&NcO8LVU{rkM6G2h%C5 zOC3OL^Xv=Q?%5YmZx8na*axsrDBjdmW@|UJT*_%F+GIbl|Iw-5%)tIfF-k^P75g7Y zV=UM8R_OMBpkgDf|7)PL9l^0*Z~tuTwEsi>U)1Bp_HRP}7u1y&)1}v+9OwBp1M~Wp zx>ya+YR4N4@pPR89NwCd)s<TWoj;hK6j#S05k<H3qY=YLkIH^jQ5o}_x;cF_P6y3u zvb%%j16lpJ?HqYzmC=e`IokOI+M}wf;n~!vid1$3HEL^{c@i-zht-kJc>J9SVHPv~ zi#{5$-N|;Y%K)r=w&6+JxE!rd4b!?DT_FEongxeI{y#OMmwXUL?@U)R?e@PR$Z_o= zhr43hzs&#H?m7Oiba7EkDTSdyEeP((Oe14A7Zpw#hPY-qLs;H^E7_g$zc{aH-3dUy znKg68%rkm^|H09_hmM;+`@7?gyy}BzcIoSWS+NTxcCeP>BXe>n_OZlH(+PNf6rS$~ ztOuL{C1|wWBzCC8?vvPUS`52WqwxNZ0Ccsb>|Tw6eXG&97duv!7-67i&DyFA6H54E zFH7u6iCr$S|0VXP#O_lg6tNwQ|D6GU5`3{AC3c_04wcvm8ww?HNGfHwO6+ur-7v8e zCU(5U-k8`8+Yy>^hvENXU+i8OpE?%zVh>F0gNc1Iu~+pe$~_k0pjS@W2^0HSRk%l% zQg*t;Ue+?u_eeY!dtlI;r@rNecuwWL)kyak_+s}<?1%LNvC&pj_OZl%*zHh=hj}{f zaCvF}Z2QWdnAqzQyJ%vc?O&k(AqXS(%-$`ttmAQiI{X^=Q~Nv00>$o`*fSG5U1GOO z?3uw%nMLJ#Ly&Li6;9a=6FXpBmyniXr%mjoP23tv1Mxg?0R;jI<fVYu_CFr6>0mdm zLw_gNd@tAZCA|J@WzVz2X5VM0p}*JD%MK^+bl=8s#CxzcQ+btp>P*$cdcDTTXx#|R z2W|p>3)~Fc0^ADR2HXzZ0n7vT2KE8=1;B>2t^lqCt^%$Gt^uwEt^=+IZUFWKpz>6i ztOTo8nTABqs7x$!IOdQ`9q;I6mHEj2@CN|f13Lgv-KxxD4u;R+WJ>@&yfUph1pY3- zPynNlRR(|+tjuY$%dQ64J#+Zykhd$a7Xa3=GU+%G{s91oQ4S{u0!INH?l`0!3yc6p z0&@V;`C{OF;39zEW_Ms5um><6I31`3Fj`nMfM(z%0IX^2a$qxnL+Fk`Ily6;Q<<ZI z^MDJ03xT=7CBUzMUjx4ZE(I<FRu|``{mcA+b)i8}j(`GdDg}yZ{~?!1<n!~Idw*OD zP!G@x=(Lxj16}tZ^wB>v!~c)M9G*ueO|r4M*`9_&|MiLREb1*Rl1;L*W76baWTjz* zdyz^b$>ZuG7^N|$M^z5DzQVV;8Xt(``l<W9-*i)C<36LdtN7my9sgKf+0fE*+viVp z^civRgmb@}u(aok_22){(Xpa=+xPeFx9cYle|zGT9{kMT9|pbc{67YJj>)oQo`Zq; zW8D9Mftd4*BnD=VsS_~xE`<MLr86$e(pi?GS7NgA4BkJB_3DT4BbZ!7;J=0S*<ayb zgGtTf@DIa8g5$R=<z)#s5R-%#@myE{VN4wUfO}yrh{<nR0^fp31IOyw<1OnR__Fk# zgZlX@?)zfGaR&UY$6MCj@MXz)ASNqu+%N8LStr83a1xfA@P+j;W&rlJao-bI2N2f8 zIHbq<!TFdl)x+nUhhbzXT0Ysb{)PJs_X3*){>%GX)>H6>bs;Q-2T=amcrGTa=k9`U zfO}yfi~yY;!@aOHK1F;F<9-PybogY}ZfKLY!57xZyW?Sp2lopGSyl`DUbz1q{Ao!4 zN%&sc|H|Zl5N+TB3Ir5b1t?HV`&R=4%EbA9XcZ`1ki~!k0R=jzfS2~K`2U?p8@vrD z5Kv$hpaAWEJ+2MrY}@rf4W5zTdy)H&{X{jcbvZ%3c;j$$0zf|V`P=n=`kmR=GblI# zj_t2(yI;qZIkvynhCdH$s(pa_x65w}?6dxvw!mr;F54cMZVPN<yuYhgep_Jk5m!E2 zU{9jV*|xw|An&yM#dR(1fr)J}u?a?7U@MUSLl7tJkI@!b&-K8I-UR=_bJA=${#%G< zc$G1a>Lk2Oy)we{|A7lAPznWD=fIN5sH3|4FPc$G{`Vm=G~n1rP~M+%zm)l>eP8nY zXv>$pK`;EjmD&D{g0I9qnE~KCT@7DEBSaKML=VcqpZYJ}kJ%qQ5%{-&&+|+8y}_sA zzD)}@eH!4mA8c8#!(Rq|(Eo$~#(v=Wz!wn%5nb2>ZJhg4bZY}Ghg;S^;XgCV*>i&k zh1z%834EeI;rScA5eNM3r&!iU@I};NG5B3k+~3>R*^m1HYp6Edi)e$0s`Nm(Iz0aX z|6c}w>!U2|Gx&GH{}TQN<q%haFCr5nYO@TP{3D)khx~vAWF2xKcueqLMJJww{{=SR z=EFZ3-|H6mr<XaR7$T}6qCS1V!~GxLe~$9J3I9CA`x5+Xz+Cz}{Dx|0KWqc^aU*bl z8RESW{xL@&&+xAS-P_@dXh#Tix&rstAyc=*{}uRP@4?@-%Gt*g5f2fWnUCjl@&3yr zVW$zkh~9{(hlt*YXi#`(XK!zR)V=!<UPO^T*#$g1+>2;YKU}X1>~@T0eFOhZl=Ex& zA|fNAC-;MHOYvMppf&{ket~-tfwJ+xuW-NBIA>4xsJ$)g5!`PHy50=`G(5i({=au{ z#GG#117i{H%TXz2!GE{R5rsKxw6j<Hdkhfg;kk$wi6{@Mqa#|il_Sa|qAeoAB%)Ot zp+3(**d@sK|G^iLrme~x5vqp{v8+Gi`Fxc7TlhDk&DO$ydW^F_Tv(z$Qy@=-<+@~4 zq^psNe7k{2yJ-HTa8A1<#+Nd%P+|$XlvqmFdAB4c0*WOj##+QP#OkanF0l1dVvIcP zS`&%Zw$`U3#j{eQm5d^fKGt>j__Pya$#qi8qr3Z4A}x~%j{oS23XcCFyz2qbC+L2x z{l9aN_NIHm-Y@)bF+MJbUo`=J8GPJY>jT@P-#-QZT^JAUhyT#7j!cb+jJ}HT`&~T$ z8Rjf+!@m>#^2zY0qaXi0{I4-Sy$?T(aqCL>Ju%*00>1<EojLGDbn-p)yG^)XG!c8B z@F$}mKNtQ~^sCpw@4z_tJp2U4>$Blsh4H=>{+s;~27VOtkJsSOL_Yoke-Ort82ock zkblF!;waD={xJBT!xzy_5lwv+={MpzhD#+fIso}QAJ=r;C(U<6SgStj$he>N(K+T` za^u#rC<o_DuHq?G5~4}!LePk|r)hJVwxnrmdSRKfzT-NN>(OO>P=ET8nvNT{v0OPe zplKtU>ts5vH7PnwJJEDp{~fTYbFKff{m}L`?N5v2d0BC^b4^EE)LbvqhV=^E)21~Y z?NrmzKK1^aA-@|q>rUFgz5(&jHa6GAw5|Oa(*Fo~=DL>aVXmRqE_2q{w5h!n@;eV@ zET;YAFUpbsPuthDmrX~z-gLCdO?%$7$xWNzTn~TYmXGUVy73!X)^i}lm!J_H*X?w) z`7Lf9!hC`9iKBgO+TNzSUVH95aegmFS!wHgA#PWcInQV>oNE!T*U2-WJ#g9@KMwC{ z2b_*J#<|AFbW_>&ru}iQ=V>c^Ir2eXLA?qY`~(zO{U}g)0?e*hG>oiVkGNOC97#du zTn6NFBnfxSGnj%5Fb0!QT5Lq_$Hzlv`qy@K))*0zl8>Rz${8+)A)P`wi#6LeWuqh~ zseEV2l(jjp(q>-9|E}u)uqJ-mKJpjsp}EzW{U(N1<v8aeFwFs@=dIoT_{@^f@3ZDj z5|(opLWLa@ntVy?lF%bZ^N(pKVL7KGRM-QLs2+AoduS}?{koH|oEH!(Y-p{`Hvi`7 z&?I*rC*dV5=Q)H5`#`^*i~21I4a*8EQ#;N%2o-k1+~Zz<a!F|J#S)|AOT3(m5Gw3O z_cT1PcYCP!ko;jeM<i6(P3A@Bf)2+F%paC>9YTdY{_LSo^lc9fYT_(3?IaJJa}p}- zoCk+7>{gGZ!|_VOlK)Gnvi|wSE57Y`Iy4XSCUKk>OIXgc2^H_6^Y7bbOnay!i)Ip* zb5%lxty=!@b~m?&Zo(W=cM_I!Jwk>3&nLa!pVuC$!GCopVcRfwBvjbtADv73?lWEw z>6QhLIHx95*p17NST?CWv>VoRx|4W!z<ifbVfXph<o_b<G<<X2NqyiNgHT})cz>tC zr!ETZtZvewB`oLFgnHfgih~~+*B<(0hjchzNglX{Ayn977ku~4Q;S1SV_vU230sZz z1EIq9`QOdsM}rPUtpD}-Kj+nwU#^V^74LzMp0?oO_RxD;ePCXs)^SZjsIZH+?Pyro z9$GO=&uuy^=ih`1`_OBbtW~x+bRp=XJBgQTFG7VK^2!tQP<M78riV<^jO!@E$%9iT z&n(b}xJDvW*w5x%wR}N)=ud+)<CQ$Dz+*y%wGVphjjHz0nBy|T%D3P;h)`i)zVC)R zK(j?z^;hEM+JsR5eRQ*D81^uY4h$z@xqcy3yly-G>cRYZ;2M!oVS5cff#2eoy)(l~ zyj+VCDs0mWgBPRUxpq)ySScIVU4#ld_0sLfAF?ELb%Fkj>tsTOb?Lj?t(oyk9=KK} zRK5GnqDP0`*B<&|b~-HAz*0xK?j%&aZol(I);E^0H)1VHsIUv-HtSiFx=F_^dEok! zP_MV0{AO9llF-BGFLWnix#lHQ*l#zU%YJ9KQ}mGOI?4TSLWTWoUwgwhp9#Hz@2ESW zFZZ1Z6?Q;%zr8M466#-|&Cl---anwiKHmR_Nn0!l-Hy61j_rRp+~|AM`u-nj#B^CE z$qw~@Q_kNn`@ft|aR0CDD5QggdI0Yty}s}V17m=(z-V9yP!0?ScwBscU?Ok;FbOyW zI21SxI2@P^90AM#8h}P%PsGhS#B!nPsk3cc;W>vIRNIX6aOkpCxzS}=y%1(2fNY`u z0EdOa06vAqZXZL8+Or{fNpDOm)R{iAI<^NU0c+#`tcE)QWx$rWXH(u8KC2Oib_-pr zIuFNTl3l`%z|O!90IGEAJRGWvIuExN{<|Lk5Aa*=4vYi#0M@~?)8W?w#{e^c<-itr zz6)?UuE|ot5UutP%i&)G><63#^g)>a!S4-!F8m7kzk>g3;5WdRz-7Qaz+~VIpawV| zI01+PaUcn>>i-hB1Gp2o8+abr1sDoc0M)=KU@UMRa3R2H(>!1aa2@ag@D=b3@GP(h zSPc9fI0BdsGy+XPD{wM!5pXGRHgG$z0C*Mn9q<6~Ffa#r3wRs&3-C9f1E>Oa1@;2= z2Mz)b295%b2F?er0&W1F23`VQ29^S^0RI6#20jD60KNvQK*w+4{{Z|IhyXTl7H}Kz zdw`AZKzJ7bD}c>#e;E8QP!CK4T7c7ln}NH49T8>-{7PUvFcFvnoC-V!JPy1D3_!T; zfnvsg1Xr$*{vW<v+X<p%X(&(Ai}%;gnRRFR;?TO=xG!B#!cwk=P+{9Q`e^XT_Rxqu z^M@txl2Bm>zFqbP)(iu-%paCKNJ533J@?l8?rjfUO@e5S{Qw<#wuA~h>V*1j(68^d zt@BQPCBJ+2K_3FBu#Y?*I<~bvwBObe%JGF(oF}E`N`HUjh(|VhHWZhR6hX;HmOPN> zOsIH=Z*#_3Lzjf!*1|GoiI+T5LWO<w?sp>?yQi%0q%FS^mb_6yg?(s#Ilskxd>h?K zSp8XWz4}w2nD*bpCC4jAIO{+512PW~{hzGslmnt{5aoh6u5-VD^ERFv8jeANx&b-n z2QHvMK!G2Z0>!j{86()fd7Z8Qo3emx|7`C~Gn$%DYU06E7*0&8<F<*`NK~Cv&C*^t zeE4v$+6xP+10_2<tu{Q;+SoYD%%R_OA~fk);AC-2q8aCo8_QJbYZ~KqiRNT;%r0w- zCtJe}Wl6g=5^pXWUDH;VvU!p$q~_d9Tqm_8kh$2fcvC~ZgU=qKY=}3;QQEv*XAjXO z?MOILpFg@%_4B2_kjXuVbSm+tNZgPa)N~>lhQv$R1~S$Db1HOQ!bbD=ugbKA3rAN< zl_|XC0)_hM%o4NmS5t4bK5oGFZ%zqdvb`>Xz9)aiOCeTfH|z9(zV!)FdwQb*1<pC- zN$sgYI|Mhn4cGw7NfT;~<0qT41(wrIbh4A{rTufx&;1`=|3BvhvIgK>pK}1N0ZOS| zd8iiH{}LtW9u%SEp(n<X!2VZd&C1lf<WO$4vH#_z{r_0<zx!a(aWpU#@U99d5l-6C z1XKYfqD_$sGh<>p4V9RgrAKxmc?aH7`d^OjZX%ACN8wOaUG<oJYl>3SZAmtT8>7jZ zmZT}!8kR1d3R6oM82K|($(XjQ)nGYRzr(8{F(XFET9TZSp|axwN$0DEUfRFk_CIMe zB%clN=+Mexv;*qUFkKYP(rWXSWo%99wJx0s31_TAq>~9Z)Eig><RzJr4nnVEiKwB4 zZ+0Tt_Bg65MpT>Wg=kw_*;8lxF+{+OG&-59dmr;0i}30<t5SPu|D5Ny#v2ULBfWZ| ztY`s-K`9MAXELWP00aA9f&DMn%9Mu%7JJ=v^(8L>hNFFN(4E!ax^RPZ!RhHmMRj$! zQ19ra{c~N<qMk$>7CdXlizeIu?y+!5H4{KHW1~klHTs`;MhQ_obe!GM8O7`$m73k3 zI9Op=iiPD1YSngBm62I7hZW7rjPLD}6(^lWw+~`k(?}gpFMJ@yYx~zq=$zvBeQwmH z#-BP9U$}&xbq1%uq39{_Ig!F8gjKF?n)?Lyze<@(W;S(<5X}ZwjD@R-*3?_N!TuN6 zZpv}|_r1AilG5y1y*17L7yB)3T#Z(YC^Q{Z0u>%-zOJqdbyn2(>XFk3up28=hEn#w z^DKAVau__!>82nW4tyR~*pl>b(dh)Ipae}0!BeYbt=BQ}333v)Z8B$}I>z@(C4Ejs zja^};+UhBUV}>d$=L#%>XqhokpCk#E!KqK_{-kou7{^+$kL@t066C9WHumdh#SB%8 zL~E3Vu3;ir$os#HS5+gOiYj1>|H-U`l3wTk&}`G&Ih7(75yawyXlyI%0nH<rFNnrA zF_tKr@WkSQXuMkmjVG!THez{!QzM=b5X%js>F=v`os&gkp+YpniDp5uIKfjI6yU#W zpmTzykWodkoFSGbL{s6rW%-RPiX{ut6epVbM1!Dcz7q==q9IN+^NEH+(Tpe>4n-p$ zva2jzh=w|`cp;WM@H%imSqju)k2Tq5+tDUN;+J;1i!(T>PbX48vn|{mi!dsEsP7Jj zU~1$;irvK&uv?p2!Uh<+S!15_tva2bde$qW)d(|FyG{mHBh2tD+O_yoDlg+d_y0xy zk8*!J<HPejJQqZ{KiUE#kAVC7CD`n0i9v87mM}Q|a#Kjw#_evOcsU&}a$siu>K4rq zONw>TO~DZNHzx((dx@O(8?#M+4MY96Mk_VM7DX!P|No0H_ApCfyB)JV&I{w&VB9Zs z-?5+IIeJ}BfIg|&7dNK^oB?<A`R6waX6}7Q#|^{xI`s65%kW6)D4|Y6>aL;AJ?e*` z9>lfrmU;`R?}TTZsoRj}aH-#bdimN0!5$i>nAF2}-VV;$U+R6i7<rt%qoZT+8)TGv z4-e_<=$fI<1?q96{+)%0le%@NpPzbNs7sN0La5)5dJ?H0X9(h_-a_ilppKRSNR#@5 zs*oP_gitTeE=cQoq(dEoci|u{bsSdVo_Y&;&Uq?mLp_Yj4gvnp^USXx-nS6PEBNm_ z$S?J09EARnx+19uk~AHT{1u`pUZu|a^174oh|zKG=aSpN4=B(n1#0pzK(#5mGs`Hd zLy5MnT%I~>E>nE3)s;l@bntc}Uf<kgX2jK~<|@!L!>>$FY~5r`e;t=IWx6zKsv--j zG<UJ8V#G+lcPnygMrw_v@wSu3X7P*}e8on4rkR@P#$OwWt$bFSy;V@6w&fhky4y4* zM$7&}-_r0?bG6c_i4Wml7Txa5zX+WrkndUaGs0C#|F;hx#@!F$#tYh5i4n5C=oSrz z;X$c!su4D0U#R44=0@pD1#(GQk?Q|Tq^6!tcjw0M7=0~wN~5ojx%8(8%IVCtomd|; z>tpXGbxD=q*RSMk-uhVT)a1?oIEyJb*Oa5NLeSTsy8b_|C%L$!FKbK6|0mnj-hYXi zVgCStCBW51Kqv^JL*wcg_hx6;Qbojvzg@BzqZAQOa+j0!p`bfpr{Y)9h@RDMQd z3v^`I>W<72Ix<C$D^r)LA2L3&9T_(?`ap)s3t({2poH$oIHFQCGC|1TATxyr!Re^j zk_;Rgb)fQBrR)tF2dV6giZ{uOp+O2N)}*2`GFDcUslTRv$OIx&Mt5WYQ30<Qa3F() zj2t>LZD^1}9F?t-;Y3BiWWtD}@?3FLs77VQG&Vsdl<vgHg*+o;hz3H)SfWBY-I2jW zCCFrW>5hyhIx>>z$h4x8QZk~*5TY`;>+mhfz@j2#DxM|7DcjMY2N_T_RFTh-=|yFz zG-N_Yh83B5RJ2M)+kE$bV3>Jn|2+T8&rMxF%8&<{d30pjk%31h7>#yx<`$Nv-;#kh z74?*iK{3pce(NacCNqspKXEh`N=F798HZ%B(XCzPF#pJSqa*VTQ7eNfR8oA3dK&x$ z6bL8)3V3P%9RL4?|Dsp14q4}%?`K!MdDxWaSM0Ig$bC9)yX4Bt&g_`?_OJTCd^dVQ z<%-dD&8AAAr?#v-x~`9O-}5!Q4TAZwCZ7J_MeDbR)`N~g-Jv&9j>9IQ!v68BgGNDj z^s5^(rL>c<#prnEFiNO+3+VZmcsZmID(v2aItCoHB=nE*>GXNEwtLIIl~8n8iQZ6l zxrB<>)%iU(o*A#?fx{@F!oK>KvL9|~4=p$_e^?IjgbKU<`x{+cwIuXa*03n~Wfx4S zumyCVOCC<Z5KE}AUtiSt@fnLkx1#IU9Y#0hiqW;oA(2q=7O*`bdFYDG1qs^~J>C+Q z!#<(tlE*dzr(r@fPUlvpBUj?(a89WI=Fxr5sg}^JD>fn|Ua#%na&@Xxx=nWyZ$4WC zhq==P39srlZa9}9)P3I_ZlpblKT1S+ta*9BxZ|vGT7>}u#?j$UytAq;s!t?LF z0R6wC&eubxb?<U2NvN=H*>=IyPInS-F*ZXuwIx)%t__ZJ<wLoVOT5L{QQ$P2Q1K3Z zG^TXRqhHpY#9NG>e@>$a6>nnJOY<&T6uOP`Jk3eG#n?mPa)eOv?sfGw=RE&h=nWYl z+_)uP?)efb?4I-g@A<c$3B4jOv%+%eLa4A`Y}5Mhe=G_O&5BprTUTswNHSbX5GvjR z_6{U0mpX(BTfpXmgyk}aP+|L=HJi2^cIGCq=44driX9t?mrD^s#oK5-wd`)#BEj-O zcT(**H6|FA?SFsxh1UO!pQ|qBDdA>}eHh0k>i1>4<$8cJKTD5x^a1l7b^P8t&CwCY zaGM_s`^@#wjXu?p6QUkq>inSm5M_rbE3`5j;FZY3cwizh1vnLW40s%P4G^8?J0PC} zfl&aGux0|YfrD^=Cj4`NbAiu+TY!gvKLeivn;=XX&>t8Hi~#s~rUDJX69Dz>e**sz zfK!N_fNEe{;6UK#z@PALH~0qw+W~`s@9^vx_>aQx34a{04<I^?YH<BCfVK@zM3^?< zI9%@wv;jxr9%NK@LYv`V4a^6q|DQGwvh5u3dnExIXa$Z3E(Y*vl#TH@@UI1~2W|vz z0-gfef%OrNHWbbT&H>H^&I8T|E&!mlW<*70%=pe6P6y9wvZwjKQI^AcirEkYYYdCV z!SoK~h|1B<7OVECs%p3@y8b9q*$vdFt!<WFLoMy<h*u4|UdMm-3v`sHAymI}<k$6g zqCcB{v-3`VB`n!AgbI7+#m_%hu_SZ?SU$RwuwAhUAYr-0Cse$xZTsxA{gTk%v&H}k z+ZB6M61EuoPGm<ADi5QtYdm4mlF*#J^pd6LePsU-D(t{#{`}rm?V$tMm^CMPC`NZb zSxAJ6*PR=E3YM1cBwn)k2o-i%_2#sDc6b4r(bg=X!amgJ!wp~`Cju6a?$9MDN45{4 z!Y=*rf8SraD0E2{+YZ%5IkFK6Cl8@ek0H;6Hp>bt`6auEP+?bMD~>EmLWM10_e|m? zdyP<GZ>a0{4(vM}GSbPP{7P7|?+6w4rH|(<h3$z(jJdj#u)X>r9Kn|^eY0&Y^l<-3 z_8g(YE|`D%DRu3ki)rLWa}qCEtAq->aPAAsA8!wpjS-4Ee~_?Uu_G2KOGa%w-c-*W z$Sz9mxbg*c>CV!}lV4<}y9xLs;hZhul+*F&+jF4ogb{%kRkUQxq=b+r{$Z{Nwq26h zNe{<PV|H7(!PF^Gmu3{nF(OW-*JzUoP#;EjR9xd_Fqc3w=I#y~I40|UX4N#zmB6-D z*Xw%%UFsR##Le|A$yiDf#M~F^rXwF%Qy3jcY+Dtigpc86{?9c#XD8eTATNMC0O|tQ z?SE)fm*6s>KtO??C<VN<{~t^LcL`?+la0;I_B1H{h8><+1+4Uxst778jS@O#s8me0 zHDxbc)XGT8k)*n6O3VKb73*sB##qBzr|$QD(@l|$`;6MI;(s@E{9}1#LrcqTpFh>n zXT-r1&i!t}(w;BYfB!?r>=n)1zQ1q3T|asF+Y_g#HR$(;f$7ixLw<vMfyZtF<|q6) zM>>Wpe;DmB3X^zvIi640!#P;>A~>=a;a*ff%<5-Zd*l8}Fm#`R|LhSM9Qb~F$H3)V zU<Cga_t)&>Fl`ST>Kqzt1jFE9JQtM#0}p^44(@Nnx)%FdRu~-LKfqs%e2s!HsucQR zrMm_0ZyDhj_nbZ6F+_Sg=s~{6oP!)ApM8f}))~0p8t?ChFRBg>9OxJ)UEJScxL!EP zvfjY^)4<$7mMu|j(G%BPRNn-q0(jfjIHdO*_@aUV(O3*4st?L1I~(K|?&UC-U*6Yc ztRfJ2M3$(&cmU;}jeAiUF?Sb-sr@0+-vQ4@fKFs^{|$7-rS&P|dl<f`oY-x5$5`mY zV48scWxYEdOn3MT204a7d*S|fxSxjfpM-zzrYIA9QMIvbo1*srRb9c~$*1SIzcTxO zy4^qW_zN5C@nAeBu>ZsEFke5BGmQ`I|0q>Ht~U7`@}&4bYpVU9@o3Y9_W#fWEBn;w zQI&mWcxv8%Y|`25V?RJU;C}7@9T&%bRoGcea9zPZgzF5-H_$$K!>pF>*bLI@geg{C zXZ6qwhax9M9L@^t|8#}xokO|R#{N(KAtc3wcbR1lt0}$VST!bAP@{M$DkRe;ZIo>u z-#J_?S5_KErs?T40{cJVCNFzTY0Er;{U6U7taY;~KG^?}`9H^GM>(QCOh#*44XF@I zn^eH*n%Y8!aZ6dg=k)KXg2_exO%)I87MQxlIw*g1z7|0Z?qCvhLsF^Ha9UKEyvW<9 zdZSfCytW$(5TkX6W)t=uIO62gUnApMI+bu!eFF^VbSaf$_<z#=xt5pp|JPtaP~MMo zbn^do+n?Tg{&YDEsY@!{*kg8J|0j<=nDiH^n?9p!)v8#Ll5`S|`Rp#$UGIrBgdy@` zx+D}|S*`5<Nc-pb&weei|I?BzFY%ynPG=O@|H0U$tYTIK_J3ME$Vq7`jC{8LqqqOS z{*QsSFN+Q6^6##>PhkJ2ltmXuL4GO6pp05Wbi-;TRZX;}?$!QJ1o}T`lDY3X?&%#o z7Tc<LHW<(Lci(ZHz%wuUK7ss)K6WxKEDO{bzK++weWm^MZNHIdsbYaTJE!6S&ooiB z0?))zZNU6p9d!p(4?$HFJike`36x#_67P6UllnoaDuFWHRPR7F4mTl>JO{WCY4V&F z&%#mV1J6@Z2A*dic`jiE-hYL#RM9}S1U#p87sB%#!gO3yRl`9@hiU{U2ToNCl&@xa zdG4oBdGSigK+&h`B)oK+8R3((o#=mE$*hpNL69`_wj!|qQ*c-%{njY^KVH`Vod0K- zFfy`Qb5n4|TnvbUx(Vow#OHGiZVG00^R%k!6v5<IP(?7AfG7bo_nk%0BU4CshLx33 zV@5`4lgZTXv2^rIqm+-s@&7d$s4<SQZGQpq%qYkIo85QpCwP9g(0I5v!k!Lbh_*Ur zM=I|8!=gL>{_0`R9y;#5GCWdaGRJk!1zs8AjNKfg*T!4U131QWT<3Vrv7ck}#Byh@ zFbM;36#wCv&3OXHa?U4~?UJeY`#(dSxdi6~pFrfR2mZtP1LqZAATG`avUPuRKEOEz z&*O3apj1qOmw7qj=6v9$oh|DM#LGDY=O$MpUeWn|1LEYIhI5Z>z2CPW&*KmW=Ozat zj`4_t^NPLk|4!x#$hqTOva6d;!snk`cr@TA+VfJX=?pYRNy8++UD7brr{u6~G);0o zQ!FQ`d{h6D4q~xx9gSM1w`*PhADX2SrDT14czabH6_20%|8);?WdA7(#61D-15h@Y zeMqtA|0z?rGT9%ON$iJu)D&Uu%G%a=Lj*H%zZrSCn__;akg5!FQF<vjtfYDIsg0x( zbDkM1n<pigON=!22@_FgGg@{o3`Cv!md=IA6q;M?xKdH?H+fQJzz(#ttBMp_x+Xy? z6|6?%I0X7Xqpn1$J{L2l|FgvEpz@e99pGMI2du<sIrS9P)e<S5l^ShkZtc{Bq{Q6j zbQ$S-?I`;<7Ju4yo3SLcrYYw9x+g8y2y2On<^SX*j}lqY%9POG%&G;L-&s|4liFzf z&8ygr^EXzpy6A7LsYQan(TY)<5@XHjO}GwFCLv3VIB%UTxvS2K)nyuZRsP{B8Yr=( zIV4PX$k9Yw+_9189HH)xlz4pKp9beD0&tI+mzZ~cIX6N@c3-N38=+$)#)k~LBF~QJ z>%_v1(x+)fu4uM@g^xjeED2FUf9jB%Q^!-XiN5C4k+A3bA7Xn2*Z*WNk*CM?KiFK# zQPz)Zb;|yAcK(NZiCxkCw=%tdYLkzOXvsViz2amPQV}N^e7%qmb*Ilq7%HlwzIoko zQ&61f%BS9Wx`k!RQ$J)vl4(fgi1TsAlWro;xYCK<{S{^EHsgnznPgHf-w1+`8E>2$ zGDNP!8CvQ`r{Y^O46}8{bK|j)BSVz#YY<*{WKN1+dMda45AsSzBz4?V3GHvHE$dFu zh6-%SjHJGO8cE!}%K4yskJMvxuBoH{YPZZ}&gzbek*V)q9GS6nWX{r&(RoW&9-TLM z4*Kvw7af_g;>f7I3rtcngSnxb?Wl{NiY>|TE##;}KimCtlw<pV6_lIBx+4RZj*M<@ zc2n8h#h?ipwApURK*uHkpNmZZD)6MEQOJCb%xfB;q`v(sFqX++Ci9yOhc*eQ7>pa* zbf3BP%(-(I&}33mv9&m{7a;fal~GF2<YJd8r@zy$sThxpbt+oxKz%p{^+6n%@ndUB zm4DC=8H5|^o6U$->ZxE7Uu!;<Cd!1PC-<49%fVbPj3SxwR20dKr;>=)nI{+%adslp zyLi<VBdX1OsBr5{d@lU*{EQ(2W~5<clU0?#DTl#I?UVz2#x_%}Q%k|%w}8PNgFEW- zEnKF7k?w_bvMbDJ33ECy=S#SYNYiELj&E%+4M+h*>zX4`ldU3^hEoo$YaChCnQmat z|HorKP-y>;vo6lcIRD4YML9W_PaWRe1LXOCIsd~wK<Wo$7|#7Ux99Yi=YqIi;6CAl znC|J0@zZe%MyS`WUfjdCVajPIGx=h4(sEfqsCXam|HGs$mV|Dn-WbhsjYG%j7@@-c z<BvmoPI@-<xFqTXQL0{eNx1+*g>~(D9FD2B?xbv-4iYNtgvs|Gx=(v(=;3<Ew2cFr z$RbqOMcZ~XENl<0n3Wk;s4^87gbMrJ$Nk>9^tsUM?(|mvq2A$!(`Z87uS7>Yr<a5Z z>*}=M>M@DY@g-i$X%gzbdf3&p-!L+ZW)hauaf0>A%3~iRWjh0}xs)N)e<w|QX-Vsn zPzRP6x|4WW-v||N-_C7F6l3dwCcy}m&ZBp~8^O1j;!fQqAM!26VaY+Lur3|ivzB#2 z7B0&O752jqw;M8cNoY$fb#y0Ti?O9qjGYiJpS_<gjwNbZVhLfWn-~K06wFMEoD{lA z8Du`*CMalVR_PQ?anOyXz`Z%MWpGmPy#nO$o@2J@uOX5T<{FE^37J!&49;4e1k7m_ z$Jb?#Wk##GniXpa_+DML1PspWof2qDWwnW9-SCk{*4TBinwB~U?}SY)u$=@<c2rIZ zhWc5JKEBtgIOqT1Oc$L0b8gcEpfB?r%KPzpW&HnQ?EiE{{tro}oXm~LY9-V>s(|e~ z^$!0eo0w4du8prR2BxA^7c46s+1P|y7rgb}Zy$%Pk~*2p<2~0ql80jKgwXUXq4F^3 zy5GHjVteTDtU0Yr8M|V4PRdq{eM8Ds6Y9U)^?l~gkF|%Q->71zex#@i@q|!ePbqKQ z<B%nx3nWoDwA_--O{ja<{>Y_5(5$dDb4#eO3obiq0qn-?-^UH)dQ#sg=S`@v&ulkn z*X!Fu=VHyNJIQY`Hq^Rek4DPIZ68A2uf%pEw_yksw*C2!23-xCI9U7YPU_B~SZfk0 z?0YwEeB1E$&>VT`{y}bePK{7uLu+kDn=QA<OE;`~hih&z5$e8xeK@`=rv1yO<lbLb z+J9H~|GHxPYcvuZ0?-~7?PSrG)d|3fz*Ha%)B<%t1c(ALpdOe8#DVF+o+vZdh-}x7 z0Aw#53H%$^AeU03i{+lhs`wGWYIZBIC&KIpVEJrq3V(NCS71xrZv}h^Tmt+HNB~$` zDSKM?!|#W1<AJ>Zb~m&OwlOdTI1%?p!T&A%8-aHK?1(A*Tx^nC<J}$r?Sj35dsG#r zns;;Dv)|qu{=UEjfcv<tX5)Z8fOYWfbojNvF~AI9Il!}>2f)7^*bKmKl=VlT9JmJ9 z4>$?vgK+<Y-y8m1_!aPf1^?H;Z-6g>%Yb`;$-o&v4RAbg0uTjIRV)k_%Ixwl;okw= z3ET}l59|Vfg`#vzR>Q~g+2U^9dBBCh#lSpZ32+_o0q_;@4Dc+l2v`jK9XJA*4m1Ky zKr3)Ea1n4Ra5iu|umE@!_#N;7@Gvk3cnf$N_zUnipaZA^(B!PWfc=4kfP;affTMx) zfvbQUfTw|%fR}-#z$?IifRBOCfG>crfhy4PTlhZ!e+43d4V(qs2K*ji13M7j1;7em zGu$5rKMd3Z(|{J>G~j07E?`H583Ml&7!OPYrU0h`j{%PZuK~K9ykhqMrH>`QkNiBg zZ_)olo*#L8!Uxp#0PVLm64e~CsT{XJiC(-*Br9G9e`o2%&O7;4?{L!<TSgL=Te`&B zjKt-`Oj$=_bn-1>*DgaiK;4fCO}+$qc!VETb3NT_Zod;M>|MY7!xekBhxWNw3y4bz zTa3L+B_6Po%e(r;L&LXPx+HX&5F2rFn_6yZcAijqaOW^*4$RDh6tx)poVra&YsSzc zuSD6F_Rb$K>m#A^P{7u&dWSF+Hz3sgvsc>Fw{8y|d2D99LNjiStL<^Vc5NP?BZYDQ z!oHi1XRinq@6R@$H5PM%Th4Lb$*<6iVjYAE`&9icAIxhHy~qZuImvG^wo-Yfi%|c4 zGdc9rN$sIQBeY0yDS0@gKj;9cuze5hGqviu(8*G8_b;lx;+o<agbMrT5B@a@bI(6y zg_YZ4?88x{g;4RfPx=4sT?d>LMfUCnPe780fZ_oQNRpf+h`0z61VzN`iVT}r+2rml z$p9uK2%d+6qL}`I0Z>uYGm9%bf+FInU^sI^Fd?3L3jDwCb-kIM*_mZ$w+H2J>-YPn zrn_HPS65efRqxe%1FyUv^|u22Kihag*VJrZVPRKpW0zT>970H1C`U!PlXCN><Z|{H zJXcTz!*@90P=qFya3xumgrdSLl%ahrX+=3X(-I?n2|Z*Y*7sr<U8{)cyI5upE0Wff z`~qYyqf1t9cC;CM1(M9p%E`jpMirV>AUSMF@f9T8dSp<YI05T#p?csLFpF9;l~uI~ zJp_%aC_6oR`N#E?inRYk%>Q)`u&+IUDY|T1W&gj*{(psr2CYE4T@W=2nqIlSY<h>` z;&1|_8Ks^Hx5io1Wfx>Z`y$g#l(B4Bk@nB=-@Q%L7&`R4%ZpNK*lSc}|G%OZ)}xds zDu^#X%Y$)5Ta#-`WN5T<%x&(E`jJ=U&(8J!bxM_7a5HUiL$Jr~xYQGay%dX;yrwsA zS&{ZnogeCOM9%-C&Hc;oqb4iIm+1vZQ)W$cW&(+?iNX32+|Hfo`hgK;8up&#cvCIP z>oA9#PWQtTgT)!#yPojkG*$)n!^^?yw6TZ~<)tbxnMy72V`g5?nh;O>uV&UM)c&{n z`=s6#_5Qey6>WYQ*My|Z=1Vp9SQF#QJSBE-tKDw&dQgF{Q)U03OF$_(S*Znig?SnN zq{&%@MZWB$LVr<OR$fxyl*y^VIo|$j?f=vE|Fh9-W9k3a!!<0+ioEZRyrc0CGLG@i zvGM?H|CHZT20;5ioWpZIzxfQOPoQrw_8C1=a;7B(n`t!HbyRW*v5jSPi@{VXVCpJ% zW3RIRAJyq-=!;a@{|{EYeOKQD#{T~RwCPywpJP7d5|r7g?1i?y*q+J%?@RwbQujYD zdjqjss>|5P)QrBz<|cscWnUEZZ~(&qSUrxh;2o?JUUWuP_W!Hw|4-icNLj9?;j#UH z_5lo>=ex|FCrGifTyIEw7>R29WIr6k?)ysvT_+n=_W!YL<V9y1EKu2W8GQ~{nckaY zM5vl1XtPE68bV>k6z6kOvmurbx|)X!BzyXl#1s^iys7A2<j>0X{sE;53BsJ|Su~#& zWl^QFpWOW>Wyn@4R*6N?->tHq$S1g~Y)B)cS4LWzlw0Uj?{0njM4sy2Bg5;`jq(`_ zr{((hhs);-|AZ`mj!&zM>(zVobv}XXRL`E>B1@xZT95ru8WSeuO*NI;m7QK`3DKY_ z%*o61Peh;K{7H-kP2@uo(qe-T$t>_qi=m}c*<K;y8Hs(5!W`Fp#8nge^e9y^`=omA zt2tUT^%vw#Qu&Q5Lw!>{?<CkmVw6I?oSv7To&a%Q<O51Ie_wac&5e{Q(xA*EOxMR% zvJ<*{Ffwrce+_v0So8lDxYi5cIzW$8fBfmFADvYI&IQWa|HE~_MA!hQ?h$-9X42|x zIi^X<patC|B&1c61>_T)&Cniv6(f9d3Dflv;>98X>k#gO;&dkwjw{{I5XK|H?~$Or z>7`ogfo}i5FWPdf_Rn_Cw$Io-|94DtiVbj&8SE&<o9oL-&q~nlP;FR=+ZL=(fLWo$ zOh@zq3G`&7kKj8*j)pz@^>bzm9(qqIRSAMKdDqIXANqRJ65vW*`l+C;bVn&LF}$xo z^b~o)eD5E#kCNp0e_9#spZg3b17zD@WHud8?#Hp8azEPmQJX&;^C=JDF~@%Q{y)kL zDG#L0pue8)$O<V#P`zL35->f=3%I_>{X<ER8}550H1caro$T8m8k|96&x!8-f;B&6 zLq5@u^!tl)^L-v^n7LJnqJFEy@JpeVwZGVa;D<71q&@yh5oM=#+$;GMw*QKZ|CP5J z>gxLvW3{AI&qwioR;D;tsbr}I*Gt_TdZ@-320AfwjZ%+Ebo((QQ=;D{I3u_LL(OLZ zx2f&@G4rzzTAcFf-nuLQwRg|n1s%IRan$Y~n%i~1-`h`j2A<u}*`k})+Sy7Qz%a#W zYwZTkcIjR?I2Xs`TRPj4SG04s&Mxa>Sy$rxeb8^gsAPSBeb7S?55;!HWW;wv?v0Vm zs*P=iS0P^2#@SxH8tHKdW78z4x*&c6TUgs7extp!)fs<9WInSgtU}}eFaWy`t)DTZ zoq+i3qn+)$H88Kf9>>+|V^~Cd>5<Ns-!!}!{#vV%k3onxVYod9@iJ`PTZlLt_x%lV z0k&rzgZMez&n>^l^>nsN--UPqjyD1zvDV?eFGRc-!|Ghb<B%RkR_k+QI=3S2pJTS_ z{_IQsA8G$jbqDbL!%^NRA|8oyg~pKe0QN3VN4y&>z+}WTn>pK;e>lw95`G@O=dn0H z8|9aYxCeNWx`^wd+%HDl{ZMDS_FL7kMIXo0kp5uApC&n5(l1Axg5$-gSSS*!KUOjt zBHoIF@rZq>Hz*p}T3s7)2mGL_Sc{P^iro4P-*YtLb*-JP?X~eyTj6+3XUm#__-61) zT@m*>7~A#{R|8!t;wSNOuSL89+jd7Fu7j7j5%CCQz7ygt_(<Hgy%f*Gt61OTB)4_1 zN97yF>v;GLh#R9`APK8C%EyoR6@2vT5N}60orU=7!=0`FNqB!`+3JXTeLCU-Wa?_f zH{tuwL7ap4I0f-l$R|jw%_v7yA*(aWB?)mW(9K5tE$+JpaSNmiZqHhS{Nh!uMrb!P z5tra4#~>bpe4d0jAN464u@9AU3gR;XGz~E?fJa&F@ZB;Hx5oQjg7`9&ABxDTSqEi} z_*Yc=QHZ;uFs31<HSPw8pT$QSfEd+8wpaJT$K{aK4~6eTybeTt5Tn{lpYb^IGZg=4 zfvz9opYd=Mk(Gm&#H(5L+B&8XUP3;n;`mOaGXZg1d_TOJH4yFW?}!^9KPMxuevo7K z;S{_K^RNK<zZ7wL564777krfAI6fdl>6Ipm&7gq^Uk2%k+MuM5pi$HWEyn93MB12; z5mKL!ku^0v#@a*$)Ppe!<|fE5xMtY-u!$>^>4}l>lK+)gn9h~)#H^%f5heHy(7K$e zpAeqPDWq~%{ECeKoS)x--j1ClJJ=h6hXJq!)_5QVxBwUjqyt$%A;3=mO5lFr0pKCv zWdQwYxop5J1Km>KEno|<7I+aT2G#)|0%rgh0XaY}Py~>v-~c@nxEi<*SOKg89t73^ zPXJqicYybR_kj<9s!&w||IH;3Py4TC3W95O;2C9|j`M)9{XhTBg;n)#RVDCWRsv}S zg-JWum`&i=PP>=a;aq#1d&XR2KS8^CZaJae!*~R6Ie@v6wYTfeAKR}T{p8-CyG?j~ z)2voFWx>^uxIj`jPp4thN4G==B{{a4_JD>qzG%ynuCi$Vi0-mzBYjXW*h$0Wldibv za;hh;(|s0QLebtj-B{6%80}2amf}jJMYmFP<@Ev5p^GrOt(uK{I^iDLW~7THy6vLd zt*(ggM@-vZv|mYgOSFC89BI;x6kTg=$1~_U=?J7n{{VEowW=oEDxp)PTP3=bqVEE_ z8XJ#tqU$Z%U!*H7+OVgKsm*OLK}8x1k=6}J_jKIPNiJ<NeTnC@jImY_vy5>``d!8h zWzcI^9Y*imRrOm{0-+LM`)9k>z_I-f;2@l1`|oA0v97(3<5=yVv_k<jFYAO|pZrif zu->nz(h}JA*;d)+**4g&*!I|#*(OIF@3bSjNMj#BTWxI5Y?o}0>?iI94ciM{#Ib#| zZLy8Ay|L}EUt!y3zrenPZH{f4ZB+Uc(6K*ZJ7pVYyJy?`H{P|3cI3POeqBXW7Jbxq z2g}x8_=GGa&j<>f^baP*9=M1MZTIu#W@0lAWYV6dN?ihK{!}v2QpKS=#}klrP#4en zlgK9o4MuofJi&Je?yANU^1XgaNOWAulq1BQMhI2us#v<#goJ|L=GbwGUFi(79K=_z zNR=y{97U~Aot#jVDXDhBab+7~Fo%A>C{a~9kC6#hx~m8#SeOx%GJ5c_jSJ-*|5R_f zNLPB^y|UkL+(lIKg-bOY9dw|EJ=vEn>UouXMDR12JXg99V&^$bi_Gkt@-Fw2U{B7| zDj^A0x;TR6TbN-qF1&hWlc0Aw^!pRz^&Ojh(kMId?!|-3(w-;jT`v88<I$yb9?AP+ zIvvK>r(@;Zj}`kQh*!z?lBs2^JTUe5_@8#bY4d|~2I>KD9gy<<P3K^K-N9KOq|P7p z0jc*#ok8jg(jEwP1G#ocJwNIbP#2K80@V3ScdLxK1}wvvdNF1Ndj@}x2}N1il;4#u zo66ZL2=ZGKtN4HLFrisR760EmXyHibEGfa-vY+|?q{6srIfoDxlESKEf?S$963pzZ z322rH(A1OUeQDY01wDIsuW;=yq6yh~sgn};5)dRik8q^<q0M2(c1taFs(T;LH?8qq zQ+=ruv4I?HW<gP6UN!gx`Q!Z;3l0WG8HO*zmrC&4a7<3n4ya&>@tc&X>A~?o8DqJ7 zUC%xKb3G5sY%<<s*-Qdu1l0BC7_a*PIEM3B_X6nNfHL&|OlnTVb@rFQRFEgQyMNdv zS+nCA`oW-I53Z$it)1(4k)dN7D8@B*)(ZzVaIQ8rbe-BpQai_7AEa;IlMjPz0SlR2 zbL3hi-&6ciAU&=}GH~tR9k`ZBS;DVe05yT~gUG<OO0G}NZyk9h{CG3+$o0+*?eI+? zL!it-1J_X>ZQ=Nlpqzs~cb`LfF>tMvf&QT=XIKPY>`>6&g=6|6;W{hBWTdNszOv}Q zSOfivw8C}DR5VadF$jutTuWU-?KlMbm}TgPccCnU>#tm!)j(Md<u3GdMju~XZ>66M z`l=X@Z%kPVecJwn?{j{V<Lj8dJbE4tJq_gjqb7*?tx*0qb+Rn_SL50-1O1k<j!_20 z@D0-4+|l79dA#W;{)Pwo4qJqGV0glbf__>kQz9h${l0ndS@_y`$UMuC25DKZ2%$B; zSN7uDy8}M61lB`BXkYzq?xwXRc1|NVWys$%>op;tFpB>dwku7SvM55*J^70c?Jq61 zkCB5=+M1<FO`+%r$mLC6{rmTY#rE~49xFB5{~8>`YX7K0f4cp@%==jY=O7G}EfDga z-+W*53;1_QG3~;ka1^llpK>`uXpN8Y4`Y1qk5In}p)Hv9>Z0q4?R!!8+yPZz0^1cK zw1e(?{pEMo+MD&Fq0z&EsE>ru{@&oQIZ<f!d$WxYLfiDiqPyX%@0Q<8f+o^(V4EO> z_MyJdrr%y{uhGh2X!Vf&3L&&BclV~hpP87)xr5SDMnVW}jomlXzxM`x8FND|6SGey zoOBm#*zrujPU?q`;|fa4Hc1HW&bhbjSP`(_Zto(*Uwt=@353uZ-%B^&r&pbO<Qo1` z7DUK#gGFfz;M3{cHsR@N9?nm4`XHg*)vW02kBjZj`r_sm)3u7MiSj0)y>0Ha2fD7a z4@TeW4w~+P(yzob|2M;^?BlDb{y*0NTzded=(Nmsp>HRod>20Z#0~gvkI6x(gtc98 z{3qnHX~(D2nV&1@XB^%T3fh3sK3@N;+DYr|G<~R{*E{cOi7^up+GkqsKJ|za`#y|S z?x6L7yZ|AzA8+hj<J1@JXY`@w20i3BO9-v;A9;F29`xPFix5IPbnK(24GGwtPj}}a zG<Iymm`Vt3ar3>|@K3*IS~#t~+j#sTg!Z@Z8h^C#CHpPI7w8?DrAIMV5ki||J-_{- zfISgy)g81xkhdX(*7#s;`m~!e)c=xaA%xcWW;<33$=o8>@Sk;zkly3nR~ED1S>)<> zGI3461?9bj+<WT8S4&WL_8t>G59Cb=Nw?9_cQW0Lu5`)Q=pp$KLee#3ey4~wue6Km zp+5tJ_Nj+HO~bc1Gh)2eZ$Tc55L#0X0ZqtcTZ@G{Foe*4^;L_G{Y&g4j|zV`r6pfQ z2yOj;-;>-oV2_Cy-?TR-AIJ7T97)9*|CuGe0`oo6WS)F6ZTylic_h=B3vf-3>wfP2 zzpE#P?*S(5tK-41oe_H<u;1sbC-VC+eLhR~0#m1lkat_0pFP?xu|L7s=nh&A)cGNV zw%)_pYX%4GI^YxCL9XEhd3QpNM_m5cb%zA(T3D-e2mLhUI|!+FPc>Y7Km68?LEYED zA~MA!d1wBmyrcLKrk<7Nm%J|_dFayXaQb#VT`!u%H4mH{5Du+vSL^ta-7un_X_h#b zAcWTV<Q=9LO}c0{63A;4LffMHIQk)cA%a#9IaeZt){NZ)mYal3q~(x~awmlL>hF3y z)ThK=tO*%fJtUt`2<`ZVt&`zzcuB-})BI9zgb>>2k4SIVW}W?<tv!O1u+nZv-$e** zw`Mc1>Re*Krv)03U+RVsLTk!wDBjf_G~J)UlMq5{+VM3J-%YOJX6lL&ay;UPz_Awx z>;>RO-9gh`nFKu-Kxo&$Ghid;4^KwqLEn@*W`xkTZ+Qg!_1uU&=ppBngwSrhZ$L%N zEQYQ6B*-IA*fSF78YH+<k~+bcsHM8#GbZ>7vr@}mkE!(c*dHrbIlf$9g1q$w%gT91 znQK>-E-R<*CiWRl-A(K>oR!21JtH3eU;A^8(OmcAIt<5Y$^fm$-@Lv$`09Duk(*9U z@8LQUA^pyjJG#=(`R%n0k%_dA;#w9Vv=?06`PoMBtD37RImFseQjSQ-7#qdcFV_nt z9o)vXGeVC0F3lNNTw>2XF+302r*e&v5ZXY!ZS9W@*uD9luAuql`XM2-hX3uK<s!si z&F`+m!7l+qYxv1sZNh0WL`WciKuDgV@DJoIG!I-OBP87+pN;(%zGx>l4Nq6f2&cF% zM+j}Zr4N2_VZc5;f>*}tNT`8~6GHo+Ll=;b8gPlZXd=0W|JNSvK#n(FHLA}e0sD=* z;onWu<vJcAv@IH~eHZH*>A!}jt5s<wP7^|VN!Oecz!S{ThnicEMG0KHCFHUhyBBJK zM$mF?k`USzH=ex$yxef`2=1V{r~WA+w08A|<j?Na!jDLo>y3oau5HooIQS->HQJqO zXg!Z>u!PW#eCjgh;d3n{bBpGI>#Bs%UNQgWr?FN!4)a=fkZU-xC&_^voB8I)$!<!g zUa|dSX(uNC&!S`fV;<@N4CL|2>&KG+E8iYX_FtCVpE|vg-_B2ENIgUSb_e~&T%#w1 z*0dpR@^%L;Lav32-aRkQzU<tsCk5=OZ@Vc&ZHQ~+grs|D*E6=G4Glow;trYzuH_R# zd)6<R58%69bdQ@d)aJQ9O$cqj2I(JRooh-&e)W*+>4eZe{7Lpe)b(`qL++r}Zb&Q4 z-vFWAd6K{G*0uH)eQ|Sx^d0!m{R)K8nlfAQh&$C#IZ!W~5ZZJ9bH*pg?|^H=X|)`7 zq5cs<+bF$D9gG35MC3v1?>vkbgyhNi_s(+Bay-#KswL*Pgru8ME92RI#r7Hc;wCFf zyQ~}fNkC{<ByHw;$!|&F`PK3rjQJxWv}T@lcSO2Mn}>`NLTmbxUXO;StK~4RG4{Ix zLi@{gIp57JwwG%{<`(USxSxd(+Vx$QKJwE#`@D$xn`Vjf9YSb(?s%fbJpudfX5o3z zZ_K?V0$v{7zQ;Ehvwq$jPOIrs$Dd&P9|DqC^M9tz*Wfo~Kf%B;pX)Lz>*F~s2g;8K z$#0i>%{UHqX-kSw&`(ZT7$LN#P7X&O>kdkLX9E~&0EBi$mY=*vt{jA@wVqLyNXTWg zF85Z%x6pE+Y>*Jz`d7{1eEt~JC3nztDF-8j_8-sK=M@F)VG-*vN=tbmA+!aB-Cx6c z)Ta6FR6}LPJr9J?Hd=hjKL!Tu?~jg7OMZrsZytr;VgD-W;P!)(9LRA$d+hbd!#~h( zyMvYk_dXFqYu49?taej|`UlDr386i4$*tGC{F1#z6Ee5xcjH(<NL!5}+oIe{KMm!N zgrsZg!xe49^PuTA25&<M?V83liW`^MT_W<J{lhybOG0QTbv}!-j!in4MdWu6jtQal zk9ucI&w$<U{O~+zUFUu?LTF#S*?-Yd0sE};!f7>2lp~8QnU_u9ca6S`xkd9!Studt zHaUD+fA9~>t_e?9%Zz(v2%&vGbJ>@WeZ6u=IIZS)CwLt~Xlr&G$F<^$@c$hDb^TxG z0h|MnAEhoJ*X#Jr*-vPY`icYY>mwu&?|%7NAMh~iwU7+49#URR2<_u{b)~%JF1=`I zwY_l<9U-)VGY4LIf52{hoj%=(^;XKn385Xod3}%E68kjF3*14j;RN?75prziBD2t6 zxPz8&ay`ho0ik{EkvrIz6r-PX2hA_#^MueI-Mdcaa`4L9!I~Si%qU+cgw~8hKj1m; zpn0H<10l4#Mh-oyBV>SDS<DSu?I?#Qgm%@=@4rD`y}GYE)li$K44)9%J5n2yhZ&7~ z-9hs}T>wI8b2qeKhkoa_c5cd0-^cx0gwVEmFKG+bxmq0=otE{AkaqI-;-@-eezAK- zh?eWw`f0fLlaO?)kGh0BLDK13`p!LCAE>WEIC)t6?&r4z?30&-(&ay;r49rkw8zi; zx&-ss4nxCfwYaIrKnU%O1<M~<9k7>-2&dIHFP4e4|84c)Q1(%^-wUVJbSEDLSu-H% z?$|bqyz-FbaN1zH;ipR-<)s#hJLy>N%!2DNvT-888c}Aa0#*K8s%(8G><`BZnZCl( zt{;x=JHc_R;L1+F-V+j`l!&!KYSE=l$jpK3)(WlV?CV>aM;IfBiF}0PhC7i@ph@Ti zn2su?3h3J9Qjn2XkRWAF^JP+f*$G-6HV-I-?I&MY?W)N5Pu)NEq#XOn2XGx=f5`vB ze8W!0rrL}Is85zv1JE+_3Z_Nx1S??c3mY-B5@74A)EmI3Q)(J|u;>}DtlN{2Vn4mo z$M_-@DV=oxMLF6f?-$eJa2dr7jQhiSG+gRrO_yEJ3D9p3eG%h2q>PTZFg-0jzp!g1 zH@{F?XSx_ugk?Ok;%>3bBh2Qt1eBb4KsjxvRbcOgd4MyNcwR<PT7IE3P&)f4TwF|A zMq)MtWMrhIW@I=fw>^J95ehp`5I-o1>CljWz5^KE7@b*Vdrb2H-3OI`dTgHH_^m8+ z4^2Gdzs{|=S1)q@A8qbGC6^TreNdq=%mr{XC^b-yLUplQw{8jXUKZ*G(~5F(rX_}_ z4n4#f{i4?Sij01~7{hf%(wdTAfT1~~OIB`nw5dx4lFZJ^iMe^D0?C0B@)aaVqagH! zf_wiH(BeW*$;wTGl1G`1uA+(yp@)R|1gi{lRFU>i-M{ki|6Ggae&55fCR$nDKXA%P zRs4Use4a(&0;>3b*c>vx8cG$9Yl{EB$N$s*7j6A%;GBN+K&&C-Tzi~MG1u5n&?cB$ zPN?@V?g5MgxbApmlWO+IGoIVKd#|I6xi{I7qjC+KdX@L%m^vC`5&wRIWi1D&@5B9V zl)s;bW9~PjtuEU8;`%W6b5O=hnHu#&Df8goyWfyk>U~qMlKKP7al8r(qm<2a9}3r@ zxo*w<L6m88EuVV9)QKIB_t}H|a!&{KDyYLwIUMzVsL!(!*Qkfj{e9d^$TC0{VwM3e zNx#ULp$vLurNZcQ{jeM2%f>38%y2v(LQ2*A3_r#ZUw&4iM=R_U&q{!s&M5EWEIcN@ z<bvDvoj=|eV5xTt_EKa5$ZLA@%mZcor@<=2{#4oja15lth=l1d^be|p2MakNF0;!1 zpDF3m&ApQ4T&j5opRk|pe|S-03VemAh#0mC(sR?gds7MXorSBEe0bGPE6S#!kxCZ1 z%aBkoQJkx6vRsoYm03^PVJKC<ZvyRbdYmd(1`D{@UCDxVN`ONWDnWjs^T*@wWfJx5 zdxdgakWP`C$3?(IJug>GPG}Iv+pKc@r`m~|uXo%3Afrk>6ix%cZcCtU57z+pCI9ns z{_j*RDFV;GmM=Rq&-*%nehZ2AH}faz1#zDk1LrCX+`INdQ)mAI?F?}5D9h9xsH4e1 zeNhI^Np`k$bXaNIfq`?F2`$WiN36L}$M!DJaL+UKgWZ919Szh4W1wCo!^$Ly<cISs z>d#Pbj(SxL+|$lLJ%7&W_9XErJaB$>Dke!g@GfWJ66bdAAo_sNF`_MI>dSJ@#`)d- z$ssDv5n~0;&lsqy=nm9vramA8?PJi!JLiSelgVuE*nHp~TJB|_?FH@yr0yPd(fEmI zL!P>8v~!?=dd=Kd$8b=RM8Tiiag8?RHE?dpz<rJkBat8O-G~-Ak5%0`?swO~y{)S- zU*%kv^WMlneQ55<=3JKZ-e`e)OEhq9%}|zYop|_vQ<X*5&;MTP|1+Q5OYaU9v8}`T zf2>du+d5ne;o1a)SGIM=CQEX%AIfc8hwB~(vTdEUc&&6uccbZ&m11~x&H}d4Xr(x_ z_K;ktdmk7xNx)J)<!-%tr1*RFkY$#r5}V43_(IP}kd!ZWdAdy7W@bYaQT9SXJmbH1 zNo@Dj!{qqR@k;jrP%aov4mfr<IxGa*qax77Vbh3XYvpx}0q$U$n)J!+W8}^#`|LTk zXn#~5`#;LNRN4P=O8bwr|D)gHkF@`zc{o4GTl+tn?tx<er=p@rqhXM^9@IP_-&atW zC_{{no`<pioq&PHT}GZSNxO7m95s)GjAP~%T#DJ15jLx}TbI{#^8n*GAaNhTsYi({ zBYA~Her89hDw0d;)3diP5nK}Nq^AJoP$8;l7ZUb_gnSwEgamF~Fi*g;OaiK|Nt||& zo#F}c#(jGCjap){bZ-jNCKaYkfoe+Ll){wB$9Cx!v_PGfof$*TE&jCdfFiJ;(MzL3 z$uYlPC0CfAo{FhPR&HkDg^Xiy#udtFetJO+pTzMem!FrPAJZ63{K;XA&Pt1=O-BBI z4Oqfh>wjR^|8(|0-^TiuJ1Eb^H4{SS7iOPaGGzJgptSTcNC@qj^T*7BO{(cw8*&F- zDx*zWLTKN3KWX=}fW2a*n=)iCj=BPb(01JX>>}*fJ|62j?x1<#8X6(AuisGj^~JQ8 z;ie3&xpJM55Za*&&VTE<5_`e?a9Uk9<JuD;wBwp?_!N8fPKj6-(YYM$^b$hbVRF&N zFJSWv>rC#T<-j#ELTFQFXS6=P#Gb7QnH!XrYm|i09`Z%K`8`YQpUpa>rmb^5uB8z| z+kEWSq`f8f6Ic^;2c7G2ZIKXKV-K~#m(KiB=`~AS3nGMe&k<{D-5Rh1mnxML>$jjC zVM1ul-s3Bqhtq1hobLv06-2RP!1Y(n5%oq0Nw?3q%w~AE0TJnH9%^DPEZ}2}ZGy=C zuBte~HBCawFp6zN>gQ_ta$S><JdOGFg@YHu&I#U?f%-q=wQzAvd)-$6oLsj@)XiLD zKd}|Z?tTJ?!O#x>h5~%Xj5j~|XYu9rwrR4l{Qq$+mg}a}`Qe&4Z7pzpmut_|^WnN1 z^@O${Kh)QuE)Ux`*TA`MOnn`$XH&0;Yo^rs;ac(@T<?B*bRU3`{{Q%1s7^883zvfH z4E$dPy?&Z7dfvmJ?Sk(_NPUQ5+eqsJ*H;MnZc+C7C(^c&=Ak^cjg&S~wvD)sO-Pv; zTOem?fjY$-luiAw+d<NA!FEGPnZ>Y!MA`#!{P#c#99%xF^8XX&ZHcQ2Rr)`{+My0X zg4#Jjb-zkV;bT8xKkNT+{8t@ccBNd~?{*scTl{YiP!E`a{luGyV~zi9acwBTvFe03 zKiQ1&fBU}1|MHCe<sJ7q_UPD8xv$&zFXhbS$@llz&pb%~Yit7k{1^(y6|}FevYF%* zN_lK1X_=8vB&2*}*i2H||7M#>W0M^{dMSsLr$5<nT#0R;;i_c#tK|^QzEULrPy75c zfJ*ZJoBuhmc`5#XJURr*^r^p3J&}Ww%E$jl>jP;2x-9;meE{|NsZYUnNIv$D=mW~O zu41+W7f#FdPprHK5`{6ww=ab1lBSoek`9KNcBNI(N)3YW&Y9)U@p04tRx^0eHXH3@ zGJHP7@j2uig?{M=A~I|r96Cc^NemnZIG3zQsBPAJSfALA7^qJYEl{tBVc01cKQW#% zP>+f_Pbc6VSTDIQK|LxB?9135XoslZNsgU4y~epLePd}*{V_eJUfIofmImrAX;9rQ z)i>fgi#u>!?~4=eaow%|$H#JFt1<7ToS$PYA^lDayG`2fRM~A}sX4l6<+a;XI5{^Z zinz?Uh)#?=u2g#r>gc$1N`k(b6Cm)Aw{!XEPShieKisGil*(xSlqx`VH=N)Xsf6^Y zqU}E;AwtK9odlkLAWm;1o>7Uii>~Pw{tVd~VZ?VHi_SwY;yfggZ{j>FXb>YLi0ql# zt6w5ypHVhHB%l$6o)X*)k<h0Ex9wBp)&pZIhsYW8e&1Wa@QX`-xqfKcxv$q)d+Ya2 zs@q>I{(kQXm-YDPZR@98`(?(*-|dw}U~2?KGnk!Q-$RA@GQ{~{L9!9&)E94w*1Qv8 zi66()!0M0#YJq7nH1w<hroR;B&4dW)RK#67f(G#i@w9(sL1^o<plfQjuduKyJkaLJ z_m@MwpJVHzD0fnBUX}e1V_GSe%yx2CVUaI8snB0k%Dh2gmHiKo>{5l6Gpp=>q~uIX z3NkpNrd`qYpO;zS%Sn=PASEX&wIHuBFT<ZyMuko-@W(dTSAhmnW&f|-s`gd(|I(?2 zUuFMeaypc0!|nZ5wEerqMAUqYrS%o;ZIXPsX>l6Ni!z-`khif?PYTX_VUf2W3*{DF z3C+{Db3KzQdHdmsRrWu)UOKr)>0vQq>7`WtC@m25c-~OziNV@IeumqZy{R7+ZvXvL zJgxj0{scPt3$cKXB|y(-%B8+muzm!^xrweHT$P6zh8%CIMR^BIE)4F6CkBfXh61S$ zo%j!^9l-v0l)sEUf)(J5!D(Y=Ue208`Jda3I_LJwfZ>?zLlj|6Ma;l{A_@Q9asuay z^9wb#p#86zO{yL7(TqJHogv}@(d&c!jr+P6V^xBBNrMr8hsBByA?u(%oZ9|cigVFy zf6W73r0uVfprx$DZU2ipg{$yXxBahQ@jl!mNIPI<*#M(l$87_QHo;cny=ViB@<Zz1 zQiiB<oEsp^p-hUhCYDbk^$6o1qGWJ)416TI?+G@~iRrO9!3xym{ny%Ix}+d4xV-7{ zLTzaHq5TRh>?CAeJM@&G*`{)Qcea1k@nuVX1G4|t&>wgm|JnXU@P~-?`#!|6+W%j1 ztrt)YsNL<Rdq4jTLVg6w`9)U)?T2lg?T>AW?Tm7L_6cmWY*%cf)bC|~!1l{F$F@v) zC-r=(Kfu0&{mE41k^Ka9eW_nf-C)}LOLRMo=`1BS3lMA+Uh9knSwj7T!K#wasM7!I z*`;@IZ<I0tDZviT`BV9Fj$K=V3}Yp~Wb7vddsRFkf1((_@uc3U=_lHNqAjQdn3g*5 z?Eh5qE3!T27y62(I=`Ok2uZqL7*lj-QdTZJve4wbwpk1DuprThIcf1QMdZ}O`X2n; zjtMDm^T{+_@6PeEy!t<8Dj@!UwOabSr=_RnrE!bCXZiGZH+%9uOVO8+qlN@LOEdW9 z9@cjA<{qXPd~*-e%rBG{RNA;1mD^M~EtYXJPS`kcV%V2)Gfw)*;Qg76n{l$N;Q%yl zR+099UZFEB*q8mk)f1ilYvu6)z<r0bDd_h(dljj#$l|0uA?gn%osE5gSozGz@_R94 z1-YZD{XbRve@bau25X0^JpcFd|C!~KfRM*C+Ul_KkOA>Sr3Vx;c0qM@lPJ!4!AF>! za$U8%#~F3f^fsSW`u`$tfGNPB{=WxonyCc&83i6!0jB6}1<0XK&Pu*=SaU*x<;!6~ zbVZ)n_F~Xb3n$0$Zxm~ZH+E_T`KfVhy2VZnc|%W)sYsNC&-n9}JE3PcuhPoPPLFMa zr6S(|x>R1}jipvFEkA}pIsS5+<j<*qKr8lFMIA{?O^@LTH2&<t18$*rm4wY9KQAwq zd7ZdFZJy7=dg8Kp6sxjC?*Aj7T?la9zda(A4RD^Y700pG|J&i(PyoyJ*#En8b20Y+ z@jrvw|KR$)d;edw{lE0h6KVe=+Wx<2d;d69<entT11Y;(1(^V41hMx1ai3PA<pojz z{Got?#)S7I0V5n^!W4SY=rIk?Fx-ueT+A?q9~x*RQ$tNiSve^>`7k}>#5DA+VKLI; z3*Qa3Z=GNB8jXG5)JdtFco)*5Gy4%;A&6-cevL;Ix==Vnflvza%rF@A+`!4e537NK z+sHuUB^16=$jh(_X=FBcjFT4(v#g(vv#d=nV?z|^GK?Js8eC(b(Q6Gf`hq$n8_*60 z%}Tw1n3F_qu3~rv+V2`DEQ%IrAcw|aHPC2JWZ=eO4cr*(4riHzr6|{J*q}%w+nlWK zMVb_%v7%F892tIsuu20BFKK|S<FG&@;S4lnPNA5Fl}XOO$!u{ZP{>9DI5cL?$u>8X zzk^r<1!U2}!b7G0$GiTQ2>;)l|CcrQuk!y>S}LVtzn~)^bn=yCBCF(o|6}q$j(=;= zH@L@j_x@jQ8e%UA(Yn>+)E|F3>PKg6VmDmY`XBp<>rS^Uuh#&%_NZdnSPI>kMo!3^ z>P=&S`=LDl#1tp;bdqM0EZ;OOsB0O`wmuuJ$tPUc7x<<XRz9Oq()6Tr3Ffnq&WAkm zY2-?jU(4gSHy_HA*AE(e5LHcY=ln+hlNGA`))UD8XR|Szu<0DIF6UZS9h@WoKfqjL zKk*rk-Tj2#!}u5=$p63fAM*d(m5WvWpKPPf0m!lx;5pIe0L3_8nR!4oJ3yQdkS)Fj z_88oDK&UfB9i;s_7m$LZw+{-!=&gnpSGFH3r$xib`RDvn2*w#1--@}tuNg`Wj3xs$ z8lM9rOD{6CQ0n$xGo!8JZQ%wmrnCmy3C9$q(Gn!Nt@qJ8Q;SLiz0bG<z5loaXH~HR zwMI3ZpX7KkX$b~@vq_&`YpA`MIuaU_r{D{K<)p`+(I;EhyV#G)8Q<lsJ|=AM<ouyE z%+W3JeurDulfy0RG2GAK_Pn#G6($w9#u*_kgSrDX$~a2V+X1~CsYf35oaCmZ)|m!s zr$z>PGNP9zTK1>+AZms7LEfj~`_bzUEz(fCm9^>qWXJj`z4SbaGJhTKHmU=@4<;== zk9KMy)29_t26|~yPeaa`&~I%_ntC1KSU?<zZ@D)a<%{oKjPm^m_cy}3&qh9I`H)_h zH1uTiHGvkrqJ`vo2jci2k3Eri?7DI)PSj*keY~-AjZ<H=pQ#aEZhA<YqlC~J`-(rf zN}qStHn+0hBZPMR!q&;7OY9}6G47zWtgQqpE_Qb>zxbjy#rCCmjs`9vpdm?M%O)h< zDR*?ew_CuzT@x}inqN+D38~~!Y}N+t+2TG<TM0=whOJ?JOguh3SZfJMx5?qt`rjU~ zmtA8rY9cgZ32beI(3)~+kCx;PS`Jh>AcS_r4}oJZ4%iFGw7P=kmwi7Wv@z^6D{VaX zcsczhB;5v!(iRkz*ypx!WdMIQ-FR#QbNPahbWJ_$^=R~T*%J{$YrgR{uDZj!q+TIr z??qH#`9D1)#@@8}*J81Hnwb{E{dD}PWfo<ndAKf)b!Q(WbDqgMkhfT?u<?Ec@Ob1T zy-F@MFDD0n0K7^L1(%x^W5;CtUp0Gr`qX@E9`!1B{>g9>?p0z?b)~8P9$uvfDM(t{ zq?r3n<1anRC-PD!d6mCZwlS{~%Sq)V-4j_IUNb8%)$f@Y236Rrtht0R7Z&Au*gxT& zJ*+6)$%pC{V>e%gDqgHTs_`c_!BYVx3eL;kligjRXM-3rmz(aN;#rGDVds}2QY8N$ z@A^MQFE?QZItP5jx8Uc<!Y$}zS(hU2ekf)*h-)TW)`N&&JIS)1M|@*{%)k(Tnq*lQ zAYRc9>@DJYZ7pjO;&jZa<{`Gh&n`yX0n8Fetag|!Wgxy2Go%TKmvynMD-kcn_4bG# z2TzO1m9+)@bw|X#hgjCrh~GfESc0@xwZXg}aSiZ;*CXzSbbN>>B45uT{v33<h-V#! zYlzQoh}k9LTQFNILVO?iDNN3-JHa?%5^6QV^JgM{0=yn>wT1z;fFlQ3);)-KqcCqn zd==tb5ibQVe;?v4c>WEDTcO-$Bd*)bvd%!ft~K5racz|2RfyMg#!Mb@HJndH{3K?y z*CM|AAj`t5!tRn~U5)syYL<m8TdTnnpNIG>Wa4PV51<gHBd&(`dlvDT0J3Ur8f;ll zA-)LllZbmAY+00+t;6j4Lc~3Xg6BtkDR{z>h#UU}s|$#qtB-YG#Jy1-e#FnBeDJE) z3n;AH5zoYX@EMzJ%L1v@9_4cd;_Aq6Bg6xHL(GOa8}I)�`-C$%s!urrIDTY5<R; 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 literal 0 HcmV?d00001 diff --git a/src/WinLibs/freetype-2.3.5/objs/debug/vc80.pdb b/src/WinLibs/freetype-2.3.5/objs/debug/vc80.pdb new file mode 100644 index 0000000000000000000000000000000000000000..d7c3b38a6e75f0921d9b1aa81e91846d5f082502 GIT binary patch literal 290816 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 literal 0 HcmV?d00001 diff --git a/src/WinLibs/freetype-2.3.5/objs/debug/winfnt.obj b/src/WinLibs/freetype-2.3.5/objs/debug/winfnt.obj new file mode 100644 index 0000000000000000000000000000000000000000..f941e107133e26d64d666a7b7bd0e3ec06d67e5c GIT binary patch literal 36016 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 OI4K9mMwYg>ss9JScT0l+ literal 0 HcmV?d00001 diff --git a/src/WinLibs/freetype-2.3.5/objs/freetype235_D.lib b/src/WinLibs/freetype-2.3.5/objs/freetype235_D.lib new file mode 100644 index 0000000000000000000000000000000000000000..0ed871e0bddf8caee82fd48d5390b1167bcde0b6 GIT binary patch literal 2225658 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≀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�AiY$n;4*Yk>!D(V+sGx!@u zMS6;jNN&2GWTiCj=K3zgOKCV9(z2OvNhm!>vi}|I!Oz>S!?8I(PX(+EN$J;>91Ge^ zoue|inBR;{dGuvZacAC|sgh?sRNeS6tQHA1#!YiBwedISI#o@4?baxSz9noM63J$! z?_x@)WWyA<Q|kKn#7k-433i9Qp!8=KI1=s(smGF~`33~-w`rUEL*+LQ24(n1dV(%C zduQ|?=!wnz-_{a4w*4bLIgPwXPfmx@lQW?7<jf3tycvJ#h`%nVK5GAKerNFuz872P zD9kc`$2ZrL%BEO6T9?YBr-FnIY@VtdNF=6tZKePkUP(*dCjETjFIuI!1kbk2_C=>O zNhd<E%=KT6m(qDXRJqXSO7w;|!9kF7664@4a4NhFE`Zqb#AOg$o=_g|f<fJoj%oAD zO)~f7mPt2sj>2^1cfva5_9yyW&E%G<C!>hl+jKq2WD}_TYP%mVrQrdnHt<2He#t{n z>3SFj^GbW@C|_Pd%9doie$o-upS=R(Z=Its`TR~=XI=wc5>J?%6WE&N*fT0k1YB?P zWJP280b_lUDt(g8rf^T!e<fZ@Gkx(y2ly<+PMA3$*^pK2D?cy5pp2H_FZuXoB;E7$ z;St=yweLDdVUFi_^7>`80Zn?ca&3$z-N+I9lH8OB$*~<=?E1cnm-6)*ludpeN*CXP zyTNzh5cn<}1>b|Jvmd}(_#teBAHg{M7}B0QpF-L`^X-{q;Fs)6c3;6@d8i(5&d*aR z>8$@fnfGuk_$-*tk)5FL;hf&QJeulj)CWo#HpTC4-gWH0%$79aaIWf}W?z#aTbAFR z?u`9boCZ(9iK1pUP~F;t-0RFFSw^G3!DFoJDJbnheb(Ha@}s%C9<V*^12u;?3~H`U zdDUE9P<|>uZOVnVU>|8Ae!Mm_#~gJ3=p5M=)tyt*<TuNFe|JH{?6B#u|GEBAvKQb@ zb*rv>>)@3C{`|a6*H->@edSeKYx1Ri&1ou4n$ryCQ-W0<z4B8&6_@s9+s@?|)DxYf zFjM%Qk(N(0w)FHQX~;bp5<IZ|Sv~P|A~|W3Q3sT+pbjvPVd`QolrCugwI|fP>loM* zDjz$+plnL<SK7VwOEz008BaEka%@yU2XxNX{A6E`C%oM>cb6ucfZ_M9pwM1P*fTRq zD6{cbW%|P&r7DwjUt76bnWRgj<l%10gXFjg9OU}#hJ2K-KClby3wMTjP<b5y|Bn2E z?WSLTXRcefjQlb-3V%X;>u3o6vivIkg8YUeAIWbRl>CN6$!`Rd{J3|~On&#{kF7L6 zU~G{3DxUs*i#s@{rE?VKOn%|5_+z%L@@iJ=+K*f%M`(&V^Y)kS-Dw&``g<T(bH8Qf zJ+b7o^s2$SU@nO_pB>aBw9+RJyM$amY7FA|+STCR49j%{<e{NRd0n#aJD)(_raZ4C z8ns8Yu4ji9wqMr~4#1ChoSHV5dobp{*7k5;{C9u{z+6}fyF$g$4XVx6TDt`72^Ybg zU{KFT<Im;I514ZD_YWDLHY+EcqcDRMUUD#-znqfhQ&DH$)**TgA$_7x+DiYpN!ORm z6!~s$?7NaTrD-=P)71|uef=}!`3xGCnH=*HC)?N&OR0Ue8&g{}A7ASn>89TOTa_`- zMt|sobZ9@5aNg#(j+(jp3*WTeh=J3e!QinJ-yD*8v?mZC_$UYu<fMn-IhKG&@L`d> z;3Fw{{ry+v$&aCCu0KQd3+RBl5V|kjgiQ62NAtR-5Z*nuIgtevlzoS4oHOboJh4|9 z<F<c1hWu?ab3G+ko&FuA8)!6cvZbaQ<hOFch1kd#vtm3H#X|(?OX^1vv<14rrkT&H z-MVjIN-eEbW2NhB(}EYH$#xE)y*<wyl3q!d_hPS=>p!8Tt^ZonxFh~r)7TqMhME`A zn#RF!D%=z92h|_Ydt7A?wAS%>cmO;D9tf2+t!<>=Zr<1WUs%olk5FqHb-$YR&WUWu zdglcFO{X4ejrt+5Gi-zdA?u(Mv<c=tuA|^w_KV;GI00%+q}Hr!P2>#7I_X3?JRHu4 zS{uo_b#?F($HJrFsc;cI4;~FKg^S^pkoDAw>*4Y6QFsD;5}pKKgi9dnvdvn{cc9i< zeh0PIlJ(KfnGpFqXF-+Oc~JMawbqjL$<9S^N2s-ygWys)99{}X!^>eIyb_kctKk0d zYIp!#4p~p^+ytv2>$MZdz}q0}eVset3V0{H8{Q2cg!jTnpw?;z?J{=E*jKd++JZJp z`3m-Jb&hNlYt@}YQvDBK`$;q8>ay(AAQQ9w^N-mnpQSN%K7Bv<G}!I|8<A$II6w7j zeqWQV_E~b8L!M1VRgF}Gt@>9_jJ9po9e7$|V|8R=d@Zw1(0vJ=kZu+lk>z-N*%Xf+ z%5pDb_WgFre*<MQ;cqo(nak;MGGD7E3-+3Oxzt-IJgc!Em((V!AuIAPcYnoJzVTxx z*HZyi?y@1dxHotGWAw?S3vnp_1#l;LDAYKT^&{q8^hd&J>@R|0cr?`f*J9WJkAX+R z<KQvycz7Z_5uOK^KxOoFcrVoRB(gE*!tWvVInk0d={XX{a^_oNtRFGYkLX_5GW_%5 z6|exZZpGLJz8hoSw@STFa7_pEoVW?z2ycNa;C&Ex;$e6jd<@<WgLP>Q>5zUPBD1M3 zX>LRNYVS|w7n~>6ISTV0zuD<^$@b=Wc#pcIXAD)9ylP75z~=RHeA*^Ok^*`P>9tDI zzRKCQrO>$ML0?o#kIHy!=qi@x4a^+P5s*1^b1$JkOz?jQTm(nM#c(n_79I_cgUT~) zMB+?%0{j;|30?=6!0X{D@D_L)d;p#fAA+2dcov=wUxnwu*CF~~-urX`l-w?a!LoQ5 zf7u$zUYp7Sy*B$Q3)0-|{;1AT81<E_GnPg0Q={qDjMI`^hT@R;RUCfto4K;3$+OJd zs*!&VerLJ<2a-Rf>mVpyDTh5^1=QSQ6;wG?!#R+9TIL?)Y)IK*X?QjRa?HH{p%$t< z>frg1dYHHZM&V76`e?q3)(9nw7!1l+<+DCrSAQUQ|5@iK{kQO2kFMKSAN(`wZsaX{ z;%!Qk^u0YqAI)|t`Bgfvgwpq`p!EG}I0#+~_k!rI87JKcHP^KQ9uIGZDm(I-KxfT8 zgUjF@>@SCR!W-b-kaP4NUZel_!JwSGWLY^&*4lzL<yQQHHbv(s{aOz)FI|t_@vUYB z!s@~PIh&H94a_Be^Y$qj83|7}fz@l)zGhftbaaLFj8E5cnzt#<DhH+eL)R0#Ys%q% z*aN=@;I0rmY}TUDM>GA>C!ppBR>FPZQ}6)zG}PSXDyaJY0$dFL4Y5(?nLCx2p1D(7 z^BPpWcoSX(^{gFb?a<dVZO^;#5%xcXZ^Dn@+wc>pw&+v%9@H~+pTMu6+Q~IgWw90p z%U5-QY^TkiZH|xpWT&J@!Ef{G9O=U{ehbpe*L<9(=FsNfELVJ~O@-8k-7HE@g`|DO z*u+nTsD6rPs#K)Ia*lLQ_J$a0H|D#3g3_e&Q!KUeVEbPAhd;p{@E14&{st#NS|Br@ zkOfsvEurM!3aXB70xy8A;lCh#X>+eF1cP!+a9nDrTxqlY*p$7O9Shcz1b!X)?awcs zE=RYXn6}q@ExMx5y#1vSwAV6Zs8l?Z;*{%hDi2NbL`fArP1{r(+cn*nf&^~KTzNL~ zgoBZd^2E5pysJ^qHSW&-NGRElg87i~Mxp=~z_G9p24y-Fo$bUiE@3vww2Qkh-5kO3 zpiFg+!aU9|)BFWir?Ea<RUR)lwnx!t-u{wI*B>~2C=mQ0YH%pf{EMf)^UWkih7weP zX=cEyK<asW70C9y6~b>9edF|{J_$&ED$^YNRQI*DV%#Q~hTu@RIaE8}4ju~I!vxHM z>N|IU$H8r&+MkY4_N)`U6mAPIhg~3To0AK#f!*PCuqRvrd&Aq{&M>GO(_1v3+wwm% z@jCekjvIB(HpF)~$1>_hyiu=`k%k!Mm`PY~^K{VeufM!E;?ZEy`}P?n234uK>a0Um zGzRok#p{*dx)oMvPO|EI?Wat!MuTy3Zr?v4y~;4LG>ib_t$1|RKQ$Ee4<&!$TxkWH zCZ;sgbQtExKQSep_35qVWV}sfE4}TB#~{~#95zMey${?GPJ%l@o|!SWNY6-*X1^3F z<@>=BI0G((%z2ph`XH#3Rl+x5HT(e1hW~*z@V{^lY{9kbAouZ{dZ_uODC`Iu;12K* z*b_FwJz)%vgiUY^oC_yIJ(E2h&WD;;S^#;!g88oMVNlOzp8)l2ww{kT8ZsVr7DL9N z&T;T!cp}u`dI@A4YM#wz{Ar%e4%RE4({`%Ji>L3l9ZSs__uzQ2Ug;d!eA?U0^~%`X zhH~CLXX=&W_cpJ+wEG*e=Bz&|Up+D=)wiEv_U3QZE3XaxQx(apgn9&TP6MOg)S7YC zE4Ow1TlH!PrLxS5SFOS-w=UbyDEcpSAA#Pp0afYsc#|r9W3oC1=ZU@QsQ%d_Tt(YE zTieMS_0Occ-X<MU{p^j0=1#R;gFZ@cu7$Z!&+zwxH^GtcW>^4kg_3}t<u8TIEt)kJ z_dvBb_e16IL3jsz1ilCL?EdFa&+bdlSHYj)i%|9RC8+xOGF1J11*(3&3ROQ}gTvwL zP`2g`SOoQr)rs(JxF386mciAq8omdk@B?@V{0K51W!?#J3H+S>rEm>g4!?nn2^`+% zVdi(ghibq62N?@EKf~4VH~10!9R};I<~`Qe|9qI^!SS%pk^E)*-k{v<X6|oQM(gN; zMr>~>Rdd(f1(n9AE+0jZa?^j`+}*Q}{i)Hg%AIGL7<EPL{s1#XQ|F}{XP8I#td}~V zNv}ND@Jp|z@bfn1L3-617P_7nA|K`JBB*}L#jrd47aRnaLXFohhsygh7?kH~{M9*B zF0=*vo;@gs;Jc|;6HeE=liv|EU3T-|FSPSFynn7HYP%R4ssHISU+d~2s(_T4CVus% zN~<tc!FkOTca3bCJfo#h-e_7y=NU1-y--to7(X@{7H?iT{gcNkuY`iQ+iIxt+5+n0 z+WOPKliYTPs_#SKesCx(gTo+mPtI^S6YdFh;gRqZm=D#z91WMk0(co51J%FW8wSgF zKK{~Iul-T^ZpA)HGvnS1Ab0lE4Nh)4M`1Kp^nC|!N=djNT0b{j8Xd>bNi!N=q{%ar z4zE9^$CUU)lD;)9*{NW1xwO5>?se5AAKr6iYLf~<A>7A1%vfw@GFm$pUd{2%@GEuw z4|nXm-6FU%en-PRh|NqC!sDRo&j~OBPlB`H5~w_$41;o0|3s<PPn+bnJ>=3xZXd(o zcNuh!!i<LIMY6aV`+IULi8sdGj|h6PngD5k{*>Un1q>3LS->EVA0#<EVl}f;vqPCh z>(_3CWEPDARh{pNMHQyf*df~qm2R)*=WWX8Y6P(@9xu6`lgP62j+~7R!giVWZS4#D z;!jzbKIl|9j{Rvc44D%!_a_d3^Vp{znEMk4Ld_jfAIx0eOn5Q-lwaZtSPj2|v*GWM zax`t+9LV#qX3n)6tY^O$Y=HgXAy7Sq7~BhD01_&%xiF{$N3^hO5WUip4&-tzPX{E2 z;F=emqcHTXogpdP=;=Udbc{ZrYHCksf@R*;-=_;4{ZksFRa%}MOnnPRtBiEVi%RNL z)y%EYn;NA`pZHZtTA@}fmuxri%!M6*>l9{CBC{HqHc>n>izc2(WlbG^ejPiPz$!F0 z#r82lGwIlA$kW>-$JJc1A0CTc|FbBgT=vg~y&=(>`{w7t;p|@sM?-9+(XmUQbZjX^ z51h-ObnJ3?BwPliW7tmf-1yZHw{s2TXXc+*K+Qit4R3_6z?-15b30VO=?<vz&0TO3 zya$Hiy-?$s`=Q1&4?^zSIS;`_@DX?%d;(q#pM<(6_7r>qJ`10P&qL-;&6;QCM$MXM z=0MH!@1H~Jpn2Y#w3+WJzY3YlGi!deHsN*lJHR(#C-@fZ3*Ui*;k$4od=HL+A3(;G zX6<jVPN+Yy6?s?rX;Yn$ntOFZ{mo$iOXny|E*#msPUM#qj2kyLGQZHgE7VjCT_N-K zr?g#xl)zk4<-WLDdZ$>a@7M%Sr?qFl?dwe{HI!GGqp5aCVbw)b*m-GcE!|Q3!KOgo zWP{&yn)Yk04P*XF7OP3t_UwJ=`ZG>2%>}xX=!zd>Vx!+vp!B~44uR9)UXbyIdG2a| zSi(Mia?_3-1hHcdI%no{D<E~jse)I)2$X)$g6OPym*IV|hW!WN94I}ng)hT;_!*>+ zpHLp?;~N_pgFmycd(pDBbD{1l%!evt#^TLv>1~9U{JoM5>W#)F!8uNyBXyy^Ifc#j zrYJH$Qu+T-X=EAIkL^nFnHQa>Ymr}1VgViU8^e)AL93@t9UxEfH2v(?qKZ@ltoHXb zbAtUNxk!iF!NsosmB?HoV!p$)zq-G^EBiOX!EgnX?%WJ@^;;orskzTin`qv{xCGvX z|GAL4LvzpaUbu|?````mIjHh@9)1n4@2WD|Jm<n>`S79<vm!QL&YN91);i}B3O&my z%?p=K9$z#mT)O|1qHzAC{TV~pV=V&5N=l2zP1+knU=Ozp9L_H;&fh;7ajU@5@kRF7 zRa|sa9UC*QXhNaAsE&0c)}<z~9GjwLsNoWQCBj@z2TV%sfwARtBjIT^Rq@$QE~iz| zzO_p54vBeVO2b8y3MLnl%<#1QNhMQB?heTi<+Gy)`$OzAd2Ie@rz^+LGZ)SuGcima zi}Hp1(y1lkNt25w=1(wDC`gvmJV?>xg5>cQ8IPyVZ<+D<7zDmW&M{sMbXW)OzMeT; z-Be#0GopDXN8bz31aTxB&$GuddaZMGpu2mZAr`GTIED>topV7lN49V==0%eVi;8*Z zZ;PC6G!Ay-T4v2TALOvlW>(gg$6~CxsAMKHQ$Y9Oyi~BQ+%!yZ(_p_@)R~hvO<o1n zvnj8Q%#E<XFLTuHGjXY?cgmOo@6mx&IF+FCyOj~I%`cf9GkH?!#3FRIpv07rf^3~0 zWPDNaq{95te4}JKzJu@hINCoG2?E_BXL7Q9^xbjQA-8mt)dTzo-Fs)Y>{PU4lSdJ^ z_sKMSSS6_IcJp0#{1k@A*1JcV_jHquiwVw{6J6aef5OxvTZ7!H>7Caz?L1qfb)HpF z-+5!kO)n};N~gE)G*@yZMWrRqjwDB?TmAK&K5kNJ(cUPPOo9Tm3Z`rH<jE6^J<-uk zf=9=pk<-y$o7q0Tt5g4qOAE&47kdThmGOXJAQj=1{Bgx4$k4_!aGgQ=o60VE?;Z?O zTAW`nUU8Yqs5h9|&9|t}mY9nByrgD(^~We9Z?Nf%$yF0-w}x1G(|n$V;(NvBQQaLm zcMEmK&1R3<cW;DE1g1hOdHXn%!YW~-%O%F9%6q&o)l(;ppEP;eB#v#Kb2-QCrsQ%% z+x=X-jN@wT15**D;mO70iY8&!#!bf57f&scxi>OXh^%0UDU(Y|OA3m|O(~^I**fPk zbA@O_xLzx<wsd`3JNV45i_VS2qtredY#Vu2@}d&GsGK2)_3b3z#z?%0ds|BKCCMZs zLcK_vXXl%kzEFiY+Z>xxBH<M^Hijq9;gMzQ-NH$EPj%n(KBk7cI40UyR~}D>Yv~I& zuAVl$rYh_YC!Nz}Hq8(&zj0PmU4*psb_2Ec1)5r4Q`b-%(Q%e5kBO9%qll>>if*Yd zWZE|_q?-zGsXsvA!x7uMVJ`E988@pwO8nb8ZH&^D=7kF;@@kF(S?Nfu7&G08LyOTV zN_g*DJv}y#r|ZYiZcs{Xa?bG`A#@n+Zj*De&of-wSY98iMtbI)?K!O19VTPjI}#r~ zIy&DR?99PNd$71XhEj)1BJqhl?w35esXdBc6J^4z6l<B9DtQ~6N#=?Ehzp_(3zC;i z%fOVzh~|FHK_z!a+9gNV#7iTwcsO}(o3v{da?HJCJI+1IcS)0m<9r_BLX_FW!&3=4 zo$QekR*$4)r~@7BfiY@&lfspt;<jR$Gm0aJG$~o73mUZeq)m=qCW#bXL6K@?WfQ#} zM`!vj=ALSbN5=*?KV}lS702|dM&>N0G}g>5k4IGgO5wb;YbkInY;s$hc3@Iuo{31> z)RcB4DTu8(bcQ`-waI82W};0_A(uw~MmN>e>Qg<Ya~7Tw#k$#Sbs)?%dumBTd3{o@ zJGy?nB`GCvY3;Yz9Z87!-$)}d+Dj=v>Ys2VrRvJ4l6Dpc$o?3<J2kGpIx25T>~|Ye zNu+UZO=YBj7xhUrVLIY%a*jwPDa=fNo17ZrARmgulV7zz#}n;?4CZ<(Y{V04DjLfh z7nnGe&0877lD^6I1B79!f18{oHfh)gJpdaE7w|yCB$k;aCH|3n-I_>kmF?h~LrQ<t zUf<P~;t0=Bm}6}@#-)rbh>m_po19B+lJ<_&M|j=>qgIb`JCq3`Mbwhf2MKfQAJf5Z z!z0ys*IpzgR3nWLsd7avX-LTL+JqLluM&{AE_`etgUPBO<rtH$9Qt$%wLczhYP8Cs zlF%!#D7?|k>sQgJ*!p8yx#%3$T<IFQsnnzkPzBdAP4|s?`@tr)R1uick@nn4I7REz z5?dSee%#t9O;e-><>94vG8E>zpCB8O<`!Ofzw+89YZ$r{-^ld56`1dP8pV&<%xy!U zIK_lkc|tR0U<dra3Me`Dw7|2cI&XnhrQ!$;W|ZQT;Z`QL^GPCEJ0%6ZX31>^O5#=Y z6f;#=Yv)h5ak$kYJSC>GSECU&;(yFdnla@jqL*CVQadt%59X@qb%6@2IumMQ@kuDR zi9x#AWOZ{Yie@zDW>@lNl-6j1so;OJ0vwB}&|s!b&OvGVPU!MFjau56K@gd<lLuCH zY<gAe(p5D~hoeo-fhlPem{)3;Xw-d^2H12Mq1tG4jiZr@Y)E4yVocm5UNLCIu7j<& zHqtdoRqIv~kJyGWmxK8>AD#u2lKbqRtf~eH#9eBJ2a42QR*JATpa}k^Q{{TOD|=h7 zjp>S8@gm)U1B`ro2Fiz8uX^Mb!{q8}3<o3PHaVXME|%WNOPGh)5Nf+jIVlNatuCse zQ^~7@^)NN&L0%>W`s8;*e74pF)>Txh8krQ_X=Q5VZEB`EjFjYL?`^Pj1l#234JE!x zVin!$f@wsPimsy2sENRyv{TYlOs;6W>Soe*sEvuHR&Os;gyy1p`zcu{X{s>AZQ8{w ze=(Cr+geGXG(Evp$H+>n5{Hc#e2s|di#0cqMu;-Od)QPI(n5P}nmH!*&<l%++-g_K z%&U{Lt3AzhGO!WjSp&vvT$1MCN4L1l1Fqq5QFA~YynF2dYw=ZTDoB0diR-x4$mBRv zlNvT9rB@gtA0wO+y~<EEbfHa-?E~1pwY4d$0-9x8Z<8EV^=__3m=NV1G|F--f0hes zqcL08lu9mPbZfxi!f1T334MQB!oxG@pD9mDQ5Tycr7+bClZrCY<;=4)TMT4Lf*Vl% zI3r_gs!bAQ%$lo7*tP*SXKpu-mXn4xS*n>67B<!~L+{HdUN%{uQZg3FMl1AKqtvUV zn>bUB^i^$(tIu5}^+E}a8LiXH9i)q@eCkqmvG&}y;PeN^={3V9UlNc8mXxE{_crr5 z#*92?E2l9^CZ|ukWoY~Gz7kY4QG3wTN7I2o3?}KbZT!YsN7VT@+7t9O`ln}bWPiD{ zs^_uQ*$W2^wGpkl8%ymGV>{?n#;J0f<NZGAm{1TNS7<sm8gV0vROiJEer&UzsrP1E zhe1}g)fJ=V^J>RyHiv4><fUS{#1??*N7!1gl*O%rS^-J05u=H{-7=IWs+CNZz=uB3 zxxL7+u}sZ+?O~Itge@4VdwN48o4%J#x-}#I)_?&q!zm@NS?+9!Xf_l*@JwUaREnN% znp2g6+nu#BlXMl&-EN7|P*l#5@iE0COZ!SnT59`^xU?)=<!ky$CZyM$Ylt^i)l^r9 z^+MD(IePKFOs~DF86X*D$khH@^Ku?nv&~DYqvrP0q@0>snNpI^ynx%O@e1$^(oe%n zjp8o5M##pT^tIPFRXRV;aC^4Nu&hL$?+^u$Z(p}<1)|IpxUGiOU<o47*EE7S%!Zn1 z-c*wmne+x__1ZpD*4g%YZtZl3e6-)P;cob(_8BeP+Lyp&yQq|9b4^~*tZpn~meH-U zMWk`M?b+#_u1Qm1Br(j!W=f(YQp;+aq}JZ+7QIS+3Tq@yHe^^wxFS$Ps?t2Lc^x#J zjT5XIr;U74rb%bsZqws$6HT{4rkiw5Etwr<qF=4&&o-nr9E=FP_Cg(k1KeY_1@IYY zT_S_^Gh+O&%|x<wGr5y0btKhX+gOz3P)73A^P>`;efyBg=Txg)X5eDZ*99-blS1~o zs%olC4m6MN^Ou;_2{bjfne`8wh9Z4LYKN1jTA}7wMJse8q)N7w4uMrrCF(63z*zNU zk!hLK-12ZOrp;*9^={dELm_jy`c$)GPE=bQw<R$p-dLz}Rs6ZuYjl*gF$&_2Elq2R z;;Kq~MH<Mf=`1Oa5}%&hP1**ddznY)tiVck0j5M_Cb@z5>;Qg^y@;tDrqccD*AbHg zneZC2iUqJ;P~)p6GgE(lpizBUP)$lF(`xO$vX$NswvBws@|Z@kT5YoWHyI}}Y^QOx zt#i^a=AD~Opd^P62vDOwWnv$zJZ_&?B2_Z4u)eOUnY>BT18t6}ce;X#NOQ!>kCBya zV{~UCDHh*INL65r)%3I;kI7Vff2YmUU~5`tTH#MDM;-NvgEl!CT0K({)-eb(igUe< z#hdyuy&G5KCzdm;h(}|y!^we}Bojv)QMFVr!6Y<u?u;%4+bGlUWE`KF;93hR(Ro(T zQ~?T5roeP&B``M;M&Bo3fz2|?9vs+%vq_ydRxx%feF8+<-b8dUwS{q0T6zFVm$WKt zEV(*8@$y-=-=h-MH%?O#o0R$!VWt@rE`3JIMBm$%uG{%BUTKAAZBKe<C~RzIhG_s> z_!rn>vm-2{n#~l})|MC3%h#x^%=<dVbjENrSYcZ`XL35%)lWw1wu(sI&OjpmmR^-a z5=g5J)^d;t6`yTgRAW>Ccxb+Y5w#MeSF0mm&x#j#?^jo!$en2`j8rtu8p{U}Y#MYV zWeif?5ZmJn4#%wTomL#S{WHQ)PAaUgH!wB+GCz7D9y#>dQ<FP=5`>iRN5jphRZP8; z9^mC4q8X+2^#;=H_=32#SZ)24JHMf!)=tAqLER`3kGVoWD{3zxCV{GpF`JnD)Qpu1 z;0x>P&Xt<#d63PaNuqkn5!<<tP0KKoEAJ}Tg4qs0QY2?sktCZjr9#gO8Dr;lS&d~$ zpGL7WzG-S}d*oBO4&^S}Oyg><qszA^5AO5^JuEZ5p?d$d&6+#*v^@_~UtI%X*AA*V z(3^Uta&{)#n{qSyomPbA>@RG~X3PnN>3qwtVH4eqV;xu4J0HxbTvFHawo@Nma_6C& zKXC%@p)vmbue@@_ocfn`d@ld_i@I-jEsN2#Ca!(f9c_=e^|bkyU-O^O&blwZ$H}L$ z_=$+xXPy4hhg~PUaO;dG?<?(h=@p-xVb&Sp-|C}Fi#C~_e@>Sju068T760DCeCrec z*L$CG!>OO%_D=Uz9~}PsnrY)4NAGNDpY=l4EBmcJfAz8Rul=#>>nDGGqIn(&{{<g( zJ^h0EC)?iG^0m5BXFC?<-D$#Kecim3t&7?nKljqmOViGK_<hz^wNyNlzu0uAUS}_g z9bQ%#E1KV?g0)}9zjN)#*}b}6zuSZ{%dR}@-lK`*N#nor)nC4U;oN&JoqOvp(VZS# zRl_r$^m5u~z5DOuPI|cUg05?3KL2ufpAXRnJ%Zgn>+z3%JL>4l`iir!Kjhb8<z*}e z<QrZ1-?HrwpD$lNeg6BOE_&kqSGT>Bn}5i<eOAF4k&@yQK3~)Jz#Z3iyQ@1gn{E8x z-*V>E$&Wra&Dp)n9`{T-;c?d982`HYTVBvN{Cd{*<A(Nbb<NvHvhHA0#nWf*TUDLU z{b2b=KlR&X>k%KH&AKb&fBOgjd3xz7pWJct?FAkC%^xv?_p2NKcOSTS_DzNPkH3D> zM-!g9b@FR0K4`6Y4%>0aX5;4<AF}rR182Rq_3Koj1;&5L+fV*`zv|c8KezS4E%zT? zc0O`8{txtA{$!-~^R<hf4X<cAZ|@gagU$Ny_F2PvUj5!<4YzN*edirNuI+sF8rI$# z|A!vmbn0)7k6k^n>bed$7nbbJbLGar_T$r@cznp9>kghi_|aWE9@duyRhuauXLg_K z9%(bKbW)4(-7lZGYBB4#jsIDN9iJKZ)MhQ;t^W6j1$SJ_@~Kyi|I#Ii*(>iD`@)O6 zjX0$C*O_~=jy|M#e*EH*VZ(lEsC;mji6`9ja{U6{3u*lO?$G1Qv5l*)f8wM!9~gM> z7spW#jQ<r=`s6<S*qBdCqC;n7pLq0A*573-p5pM*CvRH5??KBi8<=<B_3uq!J*e?t z75lzw<u>gW{hW9C0r`hbdXn`9ED%NxPaOYHc=1bBlYg5v_M4t<S^PQE_&=6&<ONqP zY4c|Bq<Kx}J-C{Mb`Kl>=YPF8@1ouRTQWO**a;(BobxXAk-E`7>-XFayKa4X@eAiZ z_2ac)zqHv<)?yp~satIGa`C4nceGr3`YG+EPI!ZFKpOx3e?GZn;)^?M)9T^rlja@0 zhDD&Q+A5wyb}Zek@zaw!FCKjTB|{p2V!>gd@gI5Tv6USkJ@>8spTBq9wFCF*<M2@< zh2Q+9!(Vvof?bC0{9u=bt#;V*F4n0U|7CmBJ~r{P-@adYW?tTy!^)-;KMT*=XFd4s zH!npC$IYwTBI~2Qe%Pdv=Mjwmc6YS6_m%PIzIsFDiYNPAa_&67#bNv({-n$K9j~pd zuJ3xmqh0P=UQ2#4ckQ#9au<H}!t?!ywf!}^$pddsIG**4#{Zr(HoftlyAK*v@X&ch zZJ#>eO!UY2?|H>d_g(hfq=lQ*Zkrvx;6mchL3i6{z4g;()g>)|?6>U7^1aTRzZ+#0 zG5#HQeR=t=EpD0h)qmP9NvzzCg^za_|1Mu_a`wbGr)7OUqHxjERc)W+9e9}8_F1d$ z{k5#T{k<2iy~-(B@$FGOTrke~5B>U#@|#9|^4ZA78<v%J?ZIO7%Z>kx5xwVJ^};sY z@B4b$qkC6RW~}*}@xS82<xjkF->|Q@TXkezWar@>dF~1O`82lJsT^Kb6|FQk|6{o< zh{|O?J+4t#Syg22fU>#;xyi$2vAOkS)$~l_OcM7Q(05?p-OFN)m1Sm8hy7a@t?FC( z55zfpL*uNeudHpViX@X?Mu*!>cb3KTl$}`LjeiMZ)=iO(5Oqq*-a5E{Ah}72lsCnr z`by6~aE<CX3-V`0Y|IUfQI_o2<yNzpC015fQ`s1eMXTevb8BKv<+Zu7cvDqPG<Rs( z+)7Hz79Stws;#N`2NIUdd_zoG-w0*qCE2SmW!3Rny2-fViBD;Rsd<sc#to0NS!$C4 ziP?T#jN0E2)56KWU3lh6D_63AtL!x!wBcDzi7%d)%1_eD{S70yZsAqOCBA<k%^PfF zo28kgGEV;|6hEm-ssRj%HiEjQ%8=E64O%(9F=cGm6mNKp8Dv~rS%tZ?QU9Gf5Q!gL z=hnat(b$yyj0xHBHoI9?eT8mcYQGW186Qxg6<HfGMz>Q_RvE3Yu9=0Yp3U9<$VO1q zb<4#Q(1z#2Uzl19|4){tRhNz5SE`QxQ@t=x&J?N<&Oed%*aDV@)@^u6Hq(}B?!{@T z;6D;Io%QmDntvi{w>td;Q70>?b=WKX9YY%Dvs@dYGtsQXk_n79XsZ056oJ1p{P#pq z6{-H)60B^DbNU8!=gR+nGsv~I7~HLKe<$zr8t6>MtNYf}*J^0_H=>wJ1L0+VLz?1d z8dS}|l=Tk(a8ImCQ~dvcc2>tREC2A2gvLS-g>881{VgXIccXUHlO59y?y5IS<wlG# zIiFzS{2SE(BUBUJ@RG<-3!*GF|0nFHsb5LUw^6IEudh*M7DFPK9;N+rdqgT4az}ug zhFt9r%H1{hAmf3*JnT-)?hNH9fhU+FeJd+Uc=VI|HM3&5edIsI_$v^{xRJ_2Vx3^W zq5B|Hdaa#8X6@z5cE-A{kaGmChm7AM*A;S3#`UoAJKc4KoQrThV*Hl6u8?yTuE&hu zb*?Mqv|&d7LF2c%>k2tbaWNTB3chq*+0I(m6>{b>cdw(_&Y`X=<UEt~Tb1-%&fNS< zCYB#vSGMzu>k2u;m~nsE#4^Hlg`Batm~1BI39c*TOvCl6@jJkEaW!0uIony~x<XDV zGw-kC*V<X?y0V>Rt}En>V(wN)vz<cM6>_e|#gsQ^eCxWhogZCS$mz$7I&U}NjDfBz z<c!3{n-1_B?YctFL|kthzkOX-$XSj{F=sm~Tvx~$#LPNxN8oA+*Ol!oc3mOo)1=>* zNx!kol{1CU8E3h!Z09`J6>?t3wc1?cZP!ICxZX2<U%IZ4^8+q!V3C%eU029y!R+}5 z#&1*C6>_R@>1x@|Y}XZXK4f<ML;PAh{h8mEE87|5x<XD3u8)jgo$CrY^KpG_{1&>d zkaHZaPmJG5t}EndEv}7EckJZ~Ia8S9{uEbh=OWjY?JRX&A*VgF+&Y@=Y~{MR8m`aG z8IQWIY-gqG3OSo_U+pV%#%8W7<ZOlOOXJtcb%mTAaeZO@y1TBBb15#xob6}@i(DaR zWzz4Nq~9v;NdJeUt)0%>SXZ`_>$*bDR9tIJEc?4I<cw>r@tf_sLQV|V*T!$2>q5tI zDQ0xsb%mUT%=mwUUu$Qj>&kYXaa|#&RVVHfm^0eAu8^}Ou3wE`N7of{y5aiP`0eDn zLQWp8?~LE>u8TT@>wDu@=(<AAcwE02zsasE<Q#xY?{3I;!mcai%)#}8@r$~ykaH-m zpN!uTt}Eo6i0gmG?-bV+axTF2qw%}Mb%mVGx3xLXcG|nHkn<%j-EeO04BgJUvYkC$ zSI9Xl>1UphCmb@xFUy?KiF;RaWjmc+SIC);tA+6^b6p{47Os}YZ;tE2{^4q6{0?<p z)D&DczE52j7Pt%d@d(%2`P6k~J72o4kkfYuj+j^mxUP^h0@tR-FW+^AoC&zv7{4j5 z3yI^>TTzg>>k2t<;L_Eyop)RpCAg#KSLnJzPD9c!p7a})i*z`*wX?)^Wjm+2u8{K_ zF1?E*+j-G-g`Br>wKIP2xh~2BS6kz^)^&xPpK)zr{C;;`At%(;-rvu5+Pbcgvn{S{ z6RwNv3OT)TaSxa4?&i8e&JbKV#%~YT6>>)7(mO-4oiVN}<P_u5`v|k0{ajbbnT@Nn z@vC)RA!h-uPR8$W*A;Tkz_q>cJI8f}oXc@-XZ)^mT_NXIT-zGIJ6%`Ec?_4{JCf}@ z>AFJBE4a2aes8$0kn=IFt&QL3t_wMLv!#HXU02B2sk`U5i|YzG^+~_Rq~G$S--@K) zFG)YAhm8e2-HA03To;Sp%et`Wt}Eo!;p%Eqb%^W2=HSXTetN;ATp{NqT-}V{sjiD! zi%TmIvYks@SID^nR}bTNjq3_I)xEvz9_+e8&a$N6)k(j%b~axxB&EG~u`cw$b<x5m z{Z=IX2JLFTbI2KbP03E?x{F;G)*IK(#_t)|6>?t1)!X>J>AENxT)m9n=dLT{e1~fn z<M%(;g|*#{uTC4kHm)n=w8OQV@!QgMg`C_zURrv%F8unMFAb8?TGy5BG`Oyi^Jvm< zWzw%zKl4pO&Y0r5vYk@b6>?6))z4h_EY}rs{)MZ*@w?o0g`693<r%-5U02At3)cYS zcc1GDIc5Fr)v}$L|Ht0@z*kw<{r{i+VT`k*8#;3;>Qqb&q>b@sI8&G$oyKe^Lre^i z4FUPHo1GylQ}BT9cwAv>VbLv>byHc<9eHD+f{~-7M6<-ABEM8yXLqhzId#eJ`F?*s z*R|_946OTiKOW!5<M;TT$75&D^ZNY%|L6K#*X1Z;#+36^KkN-Ps~r`XHIA5h_*%EG zjT&d4Cp^@|9Tk|>jv}Vt*LYZ<K6f}`E`cU!7;TOU%ma>SThJtp=?@)6%q!4D)ebm{ znEwM+s`dv*5%U*lvTA>K6fysR<XKw<CTqMU=7f;Mpujxgh_v}yx385><Q?+ZqXZpM zf{qxiCRtNPD@XL>&?V|(lcNH&*-^xdthA;DW|X6dSr2_kUF>&MU|w;Ai^<j$7mg@5 z=u&mD)e-4%6fsv_Y)uPHt)qyE``T(>TUuqz6!m3?qXM(j5q0+xYg%ANI-+NVrmBnW zjta~UN5u3))|8k!BBs#gHl~h<siTOw@=|MBU_R`K-0-zFUn{<h6DaD-JVynl!4cz; zul4xaB~y5Jsk&%$L=AI9xlOgEl$)c7c>uaXT^w*!U=BKBHdk#;nKe6#n1j%j>SEO8 zmgu=0Ma;kZ+82DS-`C7E>w+E*s!?D19I<+G6fsL<)|6W3h+Y)BN?r6gDlol{BIe>N z^eJ4_>`NU{BcR)HL5*<4EC^by+8jsBf}jnm-Rg*05VT&kI~+yK2Ix`Ml8%^%L7P<D z<cPir`m}0abQCe)f<C3%cN|5`_n}8r>u?k?KZ71t?KMXc^9Sf5)zXe4<}K)xs{O-J z#1veqZ=oW+g^nWTOlYIpJI4`gKj;&xRXB>6snEw&i#duIIf2%$+VzeirV)BTwZ)Di z<~As$+MSLfCJEiITDzl&`7D%F?J-9Y^L40AwQo6!m}jB;RQtZ8h<ORRSGAuxq9=qt zqS_xEF(ZQ#svU6@F(=gM+r7w_;f`1pLF?4sd5%~mKx<W-;3#4)hwfJGN=K}Fpu1GN z!4Y)`YE|u4N6fyUHLA5bVr~K5soEzTMa<`*J5>9;qloz?bd74?b`&u`f^JjoCyr>1 z&@$ByIb!UA>QpmVS)%Pjt5hp;6ftK(EvlXCC}PSWo>E6%jd#Qh6lzxO3P<cmKr2<7 z?TEP#)TG)HN33C?6{@Xq#Ht8duG+^Pv6_HxRc(tS#&c+~YX9jdVs=4`RNLbyVqS)B zQSIlBm<d7)RqJ#VF@J{|ReReJ`$Jdj)Bi|s)KSEYfEv_ZsUy}i&;r%QIb!_*@x(yf zPIJV}9Ga)vEJyUBkUZUzUepo&3-mG7?r_9T0(6sVDMt~r37VtYW=9e873fCQzV0Yu zz6*U+wPzef%nQ&Bs=erl`U1^X?U190`ETfY)&A@#V%~*jsh0g=OU(bEdeu&L#CQqK zRBfaq+7Wb}Y7-n$hoEa!yTTFu3p7Ku>m5bRe@(Z&e1Z9%qlh`;YdN*nl)WlP>{a>N zVqaV4Yu&!q<7;PJ<ArgyBgO?^o8xPb`r7Aw?FYX0Ltp!oul>c>PWy-##+i;H<}zQq z+}A$hYuEYOTwhz@Yb$)M+1Kv&wS=#I!q*=1wa0wzi@x?vU;DPN?e(>NzSeY;zPXT@ z;7&&cW|t#IA?R~jg8y(ti~1PPlT|J1C}K{9{#~^*9I^I;9#icDj;J}%7S$#=VtzH( z#(?>iBj$C!#(kCYW<^$Q<L7g}6k>hkh#g2r5i{{-Yg%9~b`&wQeC?yY*5qq(U+aOs zq&{D=z*2#k;wWOi;A>y@wVl4U%h!6LFRL$88Z6OoIEt96Mo+uU5&fyJE%CLjzV?K# z&0feG;MC{G9Tk|Zju;JmO<unz_Q)&fE9ycX>n%iHIbzk}YX^L7<RVUUtBWQ_1>6p7 zHF{QGd)wD8Uu;ba%$1IqN&DJTUt8;I>wPVMi7{W(&}KR+FtZ&+%tO!<8s|?tB9*>9 zd6}TNWljx!U47Z_h!ut-_FtA-Q)aJ@h#&L~b+O$MGkr%9Gi{kQ<$8r9=CRN>)kU8p z=CO|0^IdLDS<O0PH4AN17Y7{`m_v@}hgMkA0yD=EYkTNh>Y}*GQh_OP#9Z0entW|L z^q=ZN9^WlgU~(NrOq;Jg;A;n<Z>x)uD=pF998nXY?dr=CN9=L?_FnPrEo#>1qtXVq zJ0kxa(f`G*X@R-i5$W}{Ili_PdQ#)k>xe5Cj&RXpP01lg<SF!D>f)dy^3)Nlu~pWT z^}Zv@4cehD`W#Vij#w4lW=+{Abj13@*S7jvH}sVHQn}g^d$f+&kM*_vzINExI(==- z?e@)6>^(SQ@4->Td<Xg-VHB9B9I=N2?Nn{Aqloz_^t5WPI%1Y~hxM7(<A~M`J)?0h zz0(qFT}RXnUwgpU_Cn99i{dqwsDF-_@jx$WxU(EZ%zS9SYK@NAnT7VK7IzdecSGM- zE#W9)J`O#n+9w?`Lxy&%_IXE?AoK&(wmFKJ??KP2_N=3bc^-OEwI4ZRXAJ64?U#;N zWkEktE$t{``k)`H*6%1{hP85^kZLD5ikQ=(7gRgTQN)afex%w59kBxh{ZO?jj<~`G z?Nx1tqloE(B*zQPe>;kplDj-@gd?sp`r3zlZKkiy_O+#J_1%)R%N>r`^KcX~Z$rP< z(B5@KD%WxSQneEt5d-KI)kZjqm<ynvt2WvZV=eTmY8N|VeF^<awV0!bnF0M$wR%U? z9OxISH9Crze}i6At;JEqtb-1yw!u+EU!D6?)pGB#>19XVQGu!QwH3bB>}z-XTEf>h z`Pyb*+mYZpB4G?Qx$7+zn0!a<Ci|Ma9!%^pYHTp(kh<9DsK7kzh;hr;<mJR-kDdnl zt-9!O#7>7J`uqE=DSIQ1SlzX86;xf!c0}*!C}Mhjt<TrGlUyTJ7nS#0qUUnNYRuQR z_}X?~+u>{DQ(WCtU)DNe9^oirc0<3zw7~qp5u*n5d(~cX6fwVn{-E0bam48Sfc2Tt z*%5sc)TyDp;;6tJa1=48v~$0Z`f{2h=8n)`R2$_eVk)3Nsy4|Hs}m@#+7*tdolv)G z^^O=xpg*fN&k^MT^{Ce5h<X6Mq1swUj49BcRNLr?e1`s8wJnaQ5s;*^Kwm#CM2+}3 z*EFG_rpFOA!coMG`-G7P2;*X+Bib8uM16@lVm1QxsW#J5#LR`>RBeGHuE0QlS8b)E zh-ro1Qf-|hQUtxN+D1na^J(ZE)jsQpa~aUPs(sB7>pbWms(sH<#B@OYs=eTdlG$ie z&ebnR5p$2P-Ro=HeQk%Y^*_i}OY&u?srjTOPF^@-7Xms_bM51fBIZ%(1l2z0h&^*? zh-yzbBKA<OYTt9jI0NOV_9I8^=0SO?z2=CW2}s^GQD8b9Ma&yezG{DU#HtsHs+RMR zC05{2fodl^VkZk4rrLRqxLO5C%DGzQh%2bR_G@3udDycz)DdHpuTAl_nZ7pL*S0^x zHB!PDs;@s6VvhMKt1&t|;*5x|<$jtgp6a5`5%Xe45%UN%Tzz@e5%nID_i(VDaTGD% zhE7)PzZ^x(Gf=T=&pD!<Z?d5km`RRkzrHrl*A7Fc;FfEKk6L2y%Mn*WeQk%Yjra^N zqEr`)92J<Qjv{9GXRT?0ImJ=LRQlQ_zE--KYpLqXQb+XYj@aXY<jo@m=If3kW(Rbd zYC9d#W}wqmd%;n}w0zF`Twrc@L{H;uTYPQ&V_Y%T7|2VEh3LH<aYbi~r`0)P-R*0u zeQoLIxqhy`>~O@~!Vzut3)Zy2-0O&R_}WfioBc&*uSQ}p$5F&&eM#RKk2b^+*KncP zYVY41Ma-w5>s9-VBWA<U`?N24)ltO!8JeZ`{^p1|&6n-n`<#?;#OWBQLG69X5j6~I zRP8xO?4>~qRXgN}+3Qw)!xC}+q$BpYA(pmi-*Uv>9JEBW7acL{gKkyrza4RA;w#MH zRh#N4VtSyZs`WZzcI`d-ettv4#ifhwgSGk3bLb*iHTL~-`lO<ZOP4KfZssPn(gi%l zN&Yu9>P>HrD@*5HdV%_-H!H22tFCzBMO+@^dU0tBZ)b1fK^Kh;$8!4r_6FGCAyRjf z2>Y`fqFyP-)Jqr6=O)aCQb^wLUV1*bP;bmEJ-;~^Z@GVK?!v`9De~e{o`Jsdwv~(J zZegq<W!TL~Bkx}0W`=mFCb@KRbLqVE7hEu=^tMHd7c7#W&5cVJUgR=Nyu7(3?q~OW zoGrpmlRSGl7@zoxxi|BakLHU@YhBj!S_hI8&ihM3c^^!JpY8KYm-A56(iJPY?^NzH z)ZiELeD($xVe&(6QIV`!%rm~ZKPVWFLH)$}N-Xncs>YSgK<UlmpL)JRD-U(c)rX_g zaf~WNedHPO)Vp~33hzOq&5iRHTr735RPQj=lr)#>&Bvw7SHw%_ucCD2R%D5T=Ho&h zRD2G-&R~9cRa|^6UBGh$=Tk3NmdYcZOSxyl-YOpX->Z*-Bgp@3eT?XnxHWRNv}lR{ zYd5n058_ig>imWawM_iim}t4qmF%-Iq=tGK%Of!7Q;|lMj~gBP$Q2h7_xQl;PyRV~ z1Sg%(@!bVF6~d9ScXd(wt>e4p`qe;}bd>AkyY<p34O4UGp9qguyWm#sQ5G&;aT`_B zl%Bs-h6+>4Q~!AU-6EQhyj<a*PxHd1jjKz!dkVjfAKy?~m$fX7FXn9rrOWhDq0OaU zE0Z|Amp`0hUqL6gAYRHlByXnC&}l4N7Hl=|<wuKs!9%H^;L;oEaL#YIiH>q{^P*C^ zsHH6nZq>H?&(yV}{E=kn=l^PZp;)A8NJNgGr|}glN|&`TKxi>6Z=gJ+3u~m8mI^b9 zmtQR>d&ZRd9l2{7tnGOFrQ9ZZIRQ;wxpMyP9G<_i)R3L#CJe>AbW!uox5<C|kGdvL zUu>E$`|qWTWF+JzA8OCN@I!eOBbmPb!<4QJ*jX8{v(mR>N>?rNf0V8Y*k2W}&l?XV zoa5((ycV%p2J4$|FD=tz)V5)p#e2B*+N4;Pp~%i&jvt=p{ru&(moDcm4~;w-MBHk) z$9G3qD{hrhu5npY{C4ZiRy)S;ruR<ga*CWcfD9Bluj&|R5aLs*d#lRv;}Ph=tbLnj z4J)`Q-@ba6^5?!ytq1(Cpsd_){m*Y6hT^6zI`eq%xQF_Zc^S@`g%H+?CK*cSmQQ%E z@@`qahzGLhv`n2)&+%aFSQ^jRu@UjBX+?9qdBMuXP4SE5Ne0as@mtJmQ7$e;lm;`e ziMNF<Yiz!N%#~M_$doHIIndnsUmZvF=?Yw&`={rbQ=1p)?XHrJ|Hc04UysM?#m&>_ z-`pr`f&bg_n8~D5@}pY*<UJBoiJXX(w*K}X037<w^F^7N^EMiBd%67aC1-9fpWjr| zxcHVuana}+?K|Zx>rC%D9;olk^fx}pQ@g!_@gA~#9d8_2M$BS1M)F_0^Ij#Qzj>p% zL_?w~zo#vhv5`oL|NNF`+Xd~*gD9uXkIxq~@1c|$e}4N<X;!z*3nVOa#r$Q9m)<T9 z&Ezy4p2_2Y#a!5`aLdxA9$(d5J)ftsW6BwVW_i__BCL<It6LmjK+i8``dgN?=BhX^ z8(A=Q`7OLbkk^#)SHs_I{%$bSG3Rl5O>}l%b{Ll+a<SQ5gZVWp;=G`R(?S%0PFtn? z(3L|u=4k`Drgj3kroSc5ey%w;e$EAc%Y%&xNZt6kS(fp;-2M*aF3$$6ku^X6XUYG7 zk*Sw^(PaqpY8U3dHj{<itqc`}Ig6Z|WgpyVW-)P-A{W1|FO$F7{M}%#FNe$Fa+r;W z>u=!CRZRQed4RjwuEz5A5^W2E<pb9K?|e!J33f1T#31%c2GRaisn~ar4awiJKVmwB zzg%a9eH<fy^4oKr=YD%;{8Tg1#g6x%_t45dxc~9o`@;VZ@0kOVhyTilz2}_VA$ddd zhdEb~g6Ih+78VUZ>Ez;5-gj!rX{Vnt;>@$oE<NYm^Q?vUFqa7K;xA8Yz%P{Y`F=?$ z%J;98iuk^S!p`H7&Gz_s9uF7hqngz0-|&}bO8LG>wUJPT(kN)G(imvG68(T4gU{o| z^?0IMB{W3o5-6fH1$w{IH0V+##xOl*o~PaKRMqI0^;kG>S%s#lMxUZbw)5mg?s^nE z&&-3aRMQ6N%SzJYZ&i}v{wk#==(|dB=ozKe(6dTwp|2~ghrXiJ2FWp=Jo5k~$7J%% z!;l<d$upaLdz*cGTOez1D<lV3^2`&^x0JR)a=awZY=^$Bv=jP{(k@7jW#pMXkQ}$j zGkYO9GLdKYL6Z7Bc}=%=ym@-ttBhxP@+xk9tZJU#k}CO-XAbc#J!_sh%=bd2PQGtZ z>gKyfeeQu4tJcf+A|<H<*D6J!B}yBi8A=aBbxNC{k0@=1WN6IOBWbltkE2ajlCt=) zk{m_4T1j%}Dy8jEjgqALN~N996-v9Hn35cbn5MKBk_iy`0#z&Rho&mM0!>jm09~eZ z5V}<95cDA>xfm<;GEXldRw>CvOxbtK)60~Tm3q-CmHMDbO8wA8CFww!_v1n?a*bD# z%TpCfa#3oWl3dJTe8iqyd?{0sixwYLk_!rBl}e$Dltw~hltw|LmBv6HP%49DgNpVB zjZ&(FE>OAzdcV>X=zOJV&`6~k=sczA(78%=&^byop;D#U(Ai3JptF?bL1!v8KqHhE zL1!o}g-%y$f=*M4LnTV9p;MLCK<`sp3!S309x7I9gHBd@06Ix&BQ#v;VW>!H6I7_Q z89GsE3v`0g<4{y-E5s#Y^6CjlRz-Pc8#GL5JCv_fpXyF@M>}G@`}lOk`s}}c`In02 zr)rCmHKpzKeb+8AsaUjbiCL11Hlq`_Cb6d^RiB@%E=jcZnU?pr$NDf&)kbHit@@&C zeOtBp$*Cj6Ry;es05^D*tS(B`=66huzVXc0e~r{pE%`to`5p2fe=w9N8a2#SisdJE zjZ8^WO)@`qiipX&+|&tTFIj^kX;0QgHK=nW{xu~tQUfs|;QS7`v6s5~!<OHqVtv=9 zeq7fsWubRho7o>t?1@%&Ys6E(yXpHWe{RsnNTiX#sy^AoNEYqecbxo7v_{RE0?ox} zRZY=dr!MltN$knpk;kvDH~5kasm{%b6_e(wsriNX-sg$=$ygsEDHuIGS>LN(^;Xs7 zuN+E&$<XLKogC|H9+|4`+ufC&s_$!`7Rgeled~4~$>C0h-<tj-N0POD>7QVFE&kML z5)*p}p+C{uZ{kBzvHo;JqP16|OpwEK>U)#*MG_?8=jU9VD_B<|MHjtCY|Iz|r)rDk zXMHiA7S*Xk?B&$udWDY-tmfv_7o$^H6}!SYtoc{GL$Wd%>rTdclCfT*PP8Pvn$l!# zza%mnt-ZE~!i*A9zZZS+J(-ng?J@Ba#2OB>Q?Z_Oz1Dzf8g@Po`fSt&B4rh?9+N`J z72n%@8iJG+mE?EoE!8!@V%H#*r8rPoWVq0eyn%kOy7C_NMG~Apx;E;PTwUTye+H${ z*B;%NtnEz?Bc_Sxa+CFaXjQS^=2I#3#AHo=Un)C?Y^&`{W~C2E?e)X^r}DQu(b{cV zveS38*Y=XnQYXo^elL%rNXcxeAT;7xS~$5_>n7ibcEFY@UIEdANcF+5<W#sD7yVu- zkjveYUlqH^<=S47_Z}JS<*!uz<K*v*j+oznc@=2g9oo^f+-hSRj0KAAawzTJYFtZ# z>6YksRNFpd7k!4-{7_{<>X<5{f~j~}Iu*JY>4)eaa|5+Q3WLw_>w7+JRHHz<>~YzX zqS{Lj?6p`e_@0$Ry8cFfP}+r04o|#&W1Nl#%ul>^Q_G23NwTOUT`!3pXK-f={dLc^ z(ocJS(d4@1K(pt~D6GVK>e_4jyaFX6-CZfMQjho9iM~r(E|)5|JFBX;r@2(s>MW7z zzC_j(P)8;B^vQ$y_Mw1pmwLWgXI1q*&3-~Ijh`0kG06}5GSl@Bz6MgLJ*Z3J2U~3W zkg#nw6((L3+b)+%3)gRxpU(OTh3h|W{nC_03fF%!V0l>K`b5BTG``wq!G>M&<(`Kh zj4$v!8x^1JWzmK4TF=5I@oLY)rSVCgg&X5zJPS9)8K-Q)-5GzMXQ7qiba6hPCV3)O z61${J?>b+4eQ8sDRl{4(uuf+Lvq@T&WRp}QI@D_Ifb08`!{4KEwO=JuVEqKgIyR2o zNEfKT$DS|P3fxy!A8n?o*>si0>%DZH5Wm_>S0sL!XJJ@;yk{XAztCFP@N)cY&;0zB zlce7dR@`)UT5`zNw{*KEmcD<GGzN$Be<F>v&tU&SdKiEDB|YacKxhLyfx@W=X$%nx zhj{dBJo?i=(|GhV2D#qXwf7P?zI6^V#7PKlxM5JYB`4t(CS)N?nD^(m)xJT1+N20J z_C}&_PT_`o#k97+sy5m(r0bjVL*tZ;b*5@N6J4W{e7AN^zimXSzO(Sjd!%5GjNBmq z2I6~pN32H_8CH7K{~pHDoaWI4TNRTe*AgJzOPS1LZ0aZ7B}w+8lYTy3Zlg4+B~Tz| z7Cu@3M&j)Y=@h8Bol<jKhLJoCY)IGXUM22N4o}5;CAY-HezN}M4@+-8@@>guskqwT z7P<TnPcEdcx(uND*&d7NO2X&KH1?=YH@Y%AeT7$lHA`#-pM2L?ul`Pz*%K;xcEw%v zrPjiHRM&kjB>S?{pTH6&*L;pAUmAa3uo34HFR2O?j91CMDo&3&NG&f4j5Pi{WUzLu z`EjiJ=yJmwcw}JLq}&;|bJs<3C_Wg^C}Z~l>5iD5_7PdHo3hC(OguswWLi<UAqCmQ zdNuTXTSI5xwtSEp+M_M1Cw;9{%s<kf_fWk&-_ujm7iSg_Eh~M#EKxGXu5?jm*U>eL z+NV=SX3@5*)c#beB6F9c)&nJhtQ~wkAbsR9KSPFO4LSOgeYEtiC^<uNZFem7Tc$KM z`7&km=Ljy!OaYHu-sD%ulzfRg*(qf!WfbkG*2xv#dh-O<e71;fP|4aJijuLKNr>$8 zP%zR-b*^pg92FnV_l@ypzVD1r?z%vX#mjtFoLFQu>SO7aF%8+Ui-EhA8D?K{MsC-| z>ZQa?dqb;JIN^DTx~Y#6cCtFRD^J{zhN<d?a^<%KEXLVKx1m~p!kR1XN>&$IWqX=$ z<9FhYC<jMys@?sK)V%s`?H;<*V?Fhzmh(iFs;Lv_yS1m&G1^Z_`U8?*Ho<<`$U5q% zd`+)QUpbIDgqxk{{NS4h&e)YW^pC_YvOg-*=Yay&#hCP8UTkT4nzc2gCz`k;*R(M8 zih4_F$roF=c8T;JwOsN}KF91oDz9&E-TRbmK4{1K*RQ2w#T|xbb;PdG{KV$74$CRr zU?*MlCNz1;?`me1hb2+9hgjR*`f@a<{!p_1AVth9hq{)`O4aw0w`5ha&RarcRaNIV z$J%T6g=%`D^%YsPTqKL_I4jaaRk4H3Ohxf{pS0-x$*E+?E6Ew8{7_<7G#NXT{suTY z7Jc+7nWn$_7OPk4h?G>PR81@%X1RA%9?ebcsSI=l%q65s%SYCGI^&1;1z67r8hZrC zn?%tb*L82i;`QxMH(~dwk+93fcB(k3_ov>nh-GlUpJvbzlZ`$8y}~yYyC+$Hn2|FX zJ4iMrZqFaua-GDSio8wQ>Wutk{S(K?&i2|Jp&ZndZ*wVsf|Ms(cjb_!`ROt#y_OFo zT8kwbIYdL2`?Uv%g>7DkwN((2gF40^OrMmhJ&@>P4RC-wSHo8ltp`luy|UqyioL?# zQL1<yH8ZEKC|SQXReO+8_ORb=NhPkyPqxR&nA9WkEe*`V)ABQ~@V*7&(+2tBPiMlO zBx8@Kr^<HKLB@i^US?A8kEcJdBqvpWkcs4BuLY`na%McROH}T!DQ;_*GFq!8l@%|x zkR3n8LT<byU7D)jdVlQkw(Rs-soJdzQ}vH8Ob#a>VkGYIWPX|owKWxcJel1k`@mW@ zq<k~68%;HfZA#T1uBtsqN7{}t`JKy@seY68E1Rf@I_p22o`gxZtgsI2xOiBtWGCx4 zrO%{8stXRu%>VaEzu9$-hPPEV2Wk=@dO+&Unv<nV%nsXU*-K;Dikzz5>}8ikyF=?Y zBm8eknH?S4>-Vwr-9)T{mdV5|iPn8=B6Yo{wR01e4r61B=N(=9mYn)c&u3FCWXzUi ze%I&J=GNpRYsldxraiX4PWBc<Wm%luuo~0E)ADUvGp9(J&h+9GPCF%eEVxtc;+^y# zZC<VNH0cK(I7%d;8;=sBOwms5D*K0Qu$3h1OUP33KNZ`TW)^FM{maoE#JWAwu)}@C z5OK&S*hd^Dir)T(^cNoQfW3ZXJzQj+8cy{z8SPBQxxGi3aoFC)SsC=7Oc8YaA4PwC z;3?Sz_WNt?j04kORvc79x0u!?$Mdm289R-?u_ccmH>FRoGyOYTa{1X>_+;&$HvBN2 zvEpXk@>Rm2R~l^oOf^?SnIYrZpQ`o;R}FEQ0Ms9p{w5xw_o|8&t;tS*On;xqHV7Sc zd+z<o*nxB&En7R85^7p#&PPo<Aiep)DwZ4tOlZl+Bk9v+BJJjsr0Gu^UZ#T^(seav z+WpC#WRQ6^UH+&*aeDoIa9j+QWkbudWw)E~idpkt_7kNr0vl5dh5gUR-k~dJVV5K8 z%S*i#R=lM`*K)G0va;m@U4zZYPQ2YB>wOksH93j58e0l+O*O~$kYs&-`Z|o5Dahib z##^;5Z26FNkd=6AeoMLalvV4}mh-KrIf=KMTTZifa>dgV{3zw&sb)=ok~Ki=9dAXe z<Ck1`n#BNC_AUche4tu&Y-m8?w@I}`pOQ-r?N5(K`RkWDHeAAg$w100u{wVk^~Mcc z5o;!WR{JAMv32c|()JB&0D2IAFf2+uEoP>*&<64atatrM{G&(PAVyWyC99YNMN>0M zlIo8{pTT4vW^U54VUDm3H%>oWlwxj(gAw<)iw|wlqV`85V1^vN>Cx3=8QT<6?II_3 zM;W06Y>e)@Mtt8O3c*DNe$?b9ujWYw-sX6F`*^Gbhu-4CCpXlf<!qS7cT&I8sZ?!A zvbIFMk*Le`H9z%;#9SsZn!`tTJs(@QM+zlSS(%?mmdZzxv=&qONIJd#M&cvW5Bcb= z4;*YVocW#0d&ZY>lS8xdL29plD1Y*Gpug40293~{@?9M4_VcmU-?Rh?HQ>%$V+5{p z4C(qbc4)69>;^HH?$!DDB}Xll`z4`imXW<W<-iBI6cLrIW~#|7pw}CRSPU}Pqdu3g zi#I_sw!XJ&Mn3Cs=lRj=aO?T-fam$LSxtY@e^fCf_6)iX@1>jZ@;ux-X#X6}1V7q= z%J1!A+4Wr5ei6xxN&#f70lk>GatM@PqWhm75B{uWq^r9({>S6N6XMCS#)D6&;o#%J zszJwtdExQk>cDs)jV-iK7~S1h#FTWQOb8BE)n|+dy4+x+-Hv2BBGkx;AWHyyA?c_R z&KMC=+NF_%&{|2x1aGX!921UeKgE<^k&a?g9cReZD!(mxSC;~1i2GUBW5r!#&?+2d z)hrc2F4j_`iG9@e8dP>J9<}BtI*Ol?tESILO#k|&xgQ(w(8ebj%XbpLXUw{OV4&)l zQYVfG=lQ8K$wl?NS{tkQ&QHRn3vEaiX}R3WQZUuFS)8yZ<P9M;49kpEtdUvJQ6g-Z zR^nIkY83yfoAtCPRXr*>bq)b`Or0%3yY_$5fX75)>d0jE>_lskiI->=;HoG&wbbL{ z<kXSs!zl5AkUFZzC`rbZDT)8%ebY+c^b#e>vw2U+qS?>0K`-Y>{}$XYX7xhi<bvub z$t$_YO<I?xidc)*<w`l#<x8&BQD)K96yjXujjVqE>iMTj+L4mMHPOOnXS~m&sTb$e zM{}N&w9bfDRp;J)k{lv2^k_^@wOdV>&=R~3FzR*IOw%ck{%|^o|M9N>*RbA`3$TSx zR?j4Wl`?O5b_VmS{!~qFd+|$pp#`ai%g+5dSCe|_znP=VVrnS6_PgI^xx+S05iKzp zBRkl#h|0p84Hv3wE~Q)i<}c28Iq@8x_O_{o;VI_o>;f>5Pi6bMe_^URdm)Fa2z+63 zYG8AnEDPlS64@{C63Y&QmP5<?kU6p7I!Vu%OR5<e;X25FDL-1c`bzAEFJ#=o!-dJB zid|g~Q5JH7$&dqOToL5Dfh$3&{#uq(E8C}MYh$YBWI+Di{?<5=m6DT!^%f<R8d)mW z#C1D>L5u7jzTxG&bTUZBv)-1O-Lp~xscWMPlhdo;mB^&>7qVEC>|;`b>(IdlZ#W3% zAC*T2QX-jHU6&*K^|mryMuZZ#*JZa%)P_{&EO}X(>*X|=aa2AJTIc-0ZTTg-k9~bw zs-H9`_8)#Jag&5rGlk76{P>so?Jk^<C!8@Lk?qmvqy}1BR&Ag59H$9-G}~Oo&2OJM z{0RGY<Wk|YTrthM>;3A4nHK)g)}~c6m$oM;GCZazdQy?9{Fc#72!yZBt*XgwIg`CW zy&#mur7EcsGqM-z{uP;DC*J-OMP@G<QUBTprY|xW<mdv&p9p7+3D{rPy^XAp`FI@z z&r{OT4J`B67iaGX$=^Gw&0n{BEx#$u<o#=zmk`E~_41!4x2}!_D<<on6GdBhw?71Q zr)JDf*6+uD#SarZ4$IQE@ZsIq=1|9X580o)s`h#p3*^~{!JUaHI}P8*cH+D0bQP1X z{8XFp?%!r}Xb7X!J>rd5v!aO)wGl?{niGQF<l@cmnHk6^Cj(J5hfO6Gj#ta5E!#)B zJFT26({YYP(1cuN<_JP+#;9cdA+`YZLIgj@=+@&wwj>j+`%V1xRBx(we~Rm+vHf&% zM_!T+v$vCo5W`+}y$ch!aAHU!FWHx@WnH&dj5}g`<e%(##m|(DNiQevIVvY!Zh6fn zZpa$x;fJinowWN0#mCY6cfXx|Z7|K`aLbEKJ6Sd-ACb)vdIYVZy{UHjIp~(zI^8mR z7oQ97lf6p2YgYJV8w%F~WhG9O_sT9q*VizI<=k1<W0qxmx9cIxvXtw(&$6Cdy3?{u zD!Nu!meXckvO9-AQWv_ew=8Ggx;|`Kj!|@7W|?o(Rbg4W%dQJ7%UQavGc3!NMVCA~ z0zZce%M&zU*(K?c=aRtr!t!($TRN*w3T9kx*Dp9#XJ_|G-OL-9$ZwFnJyv#nvy|ie zoZA{x?E-~QK8UB}kzBu$FbesXz8R1sdg&VgIhU8N19a_iB|yQM^rb+tzyv_fm8Hi3 zasV)W9w4U!)2C~6YL0|2+jo`Ych`9~9USqYqGcwf&`-+l-?BiYHdJTrK2%h&*K+pm zL-`)(6zomb?xDsccIVO~cD+Er*4B|kUuoe3pO@cKpJp6c_x79oXk~uI&zd9ax>Eea zar&--tcvwk#d=nq9m?6zkFI8_j`i@}b#K2T9+p}U-(A-w{_p;+thI>ok@o3XOU3)M z?eBLl65B-GMW=mQ(b6{$Bx8HXCmX?VOXwO#NYc3O`d})yH@RVv7N2~ZcyZ!sfm7}} z!9s~%Y~?ba?wTiB_ZkiW4fKEeM!!TuTlcmcd{~oFZN5kWd)*JSl|4u8nZC{i26UNd z@6$})C;eA!U-BMl!d;h%`_{du6mGbYpPo;Hb!7ClYsmqej(%=;A7fi~>yWO|I2Vt* z=+5wXUy1`%v0W%KtKK=#W9%EfclTS_lWTY0HKglJT5_s>=kC{;N#R#AM!yv9`FADT z8#KG*`;5Z-mQs0BkI0Yk34uiGPT9;|BF4;<*R|1}$s>Hv@3`jyY25Ndw|G05S#|q! z6)wu1v?Pz~s9qPI&!llk*9>CTH4)#O$HT41sRzZcWc?29ONDj9!my;=y2IS{p+xJB zp{;Cx@5qT4@|_nS_WXtgMA)Q<TFAOzf7h`$PE<PSwf(@0x}KxEAj}-%@HvpgB%YGQ zm^cd(1|kV(Xgs6nx6<0lIqaLRb=HF{JdpFi$dV5_PH?rkJ5^Jx(_v1oF<8ho*!`*M z;v@SxSm}lg?d|+JM`3o2m59htC%t4cwms3h-LxF9X_XKk2He(NC+TRri_@Kd)$2Ul zQ}x>lzd3wz{m%ID+#jGPPsw$meeK2TlJ$>EC5>(Ah{?KKPZ&I*7ZsjJ)jv^Hzpc3? z726_L>Na=8<Pf_a4%w<3D_c{s?OY0|%5SdXItRn*hB=f3*EzKQKc1@Jp1P+E7uZP^ zw_Tf3W4|Wk#5N~mo74Zv_J68=vn&C&uwh9|y6#Y4wy~kxHJlIwne#A(m)(+=Xnj~_ zfO;T?CNP8ZkDC&$o6H&xM$vC<s?u2m``0@pbZ;7gfwY{HlErOZPl<s{H#F00AHd%% z@%I7o_a1e%Pv!|56RjJ?TZZELja3iI<YZ-bx<Q@F)I=No##D4&GUDn&dOm*TawhUJ zHQSfEI=`wWdKcG>=^pkmff%sK`7h3p#&(AK61FUNCTm}zw;Rl`>kNiib};Zwx4!pj z%=RU9p3wCR#z8v4RCEI=pwDhgw6>X6cUI#IG_qhH9d)M@hpd(4*4mz<s<w^Z=4tV# zesA)T*_1@$Y56W*Lmw(&`_O6RK&Hd^2W_`z)|@MsTQY5ghBpcPrBtkK_aW&oM>9Cl zs}bN#Df$iat-GuWPs{gdh4=lcfLOK54>wskMlbp@)4_p8pR0{?o=)^=oYmQ>Uit=q zK9?`^Ij?bQ=k$~W!<vB>xsMXYGIPQ?(vQ%(wMEO7vHff-A9-0e_}o-bjHBMZV(#&x zmha7#@0FZChE3+Q9kKP8YkOO-?QOkOyV~`(b~lglT(a136J-pgp#@7>W{N*gKkeB) zdcZk`37N>+Rjv^o!@@3dxwgAwYMt~6^!cgkGD<Rs1!i{=Bs*-&tgD1Orr2#1oo&+$ za@Yjul#H$KWL2MvaS-m1<}-8e!|L{MvWBJpVQ(tVWo;HzGp=XjcPR0a+vU3sF$>iu zC96zE#3;o=XCOOf(#}+rqVktYC0$)OIYxSHtzm7W>5+(%2qH?rNl+3vUJ@vm4N2j6 zFNJJiNeVUSXtM4S;Tkr3_T@z6bc2|5CTp0U;lUW|fgE;_)h5RZMugLK74hrJKXxQ- zru(%FUlMoJ<;3asx>=)VGb+84Pp0_g(zTPH$4jtWmCYQo@nxI%LN3;J=FszZcHKy( z9M2oyCRH)<T^&*7<gi3aI@E=Jq!{a%*#8eA#XKSh5B<?Yo9Zz2m!6|DhiOnJOU9$; zAnfdD?C5yqunC>;;T%10A{#45PZ6XX>ksG5h*A+{1L>#?D(YIq%HtTBq2+Uwr%{dU z9Gt1|HnJM6!#NTyYQteFZ6{^X?Uk){GYU6deXOvK5uR4sK<3-jF^C?f+PkTZobr}x zA_eg)ydoE=<ysK`er%t0O+8qwv>*nicy>a!R{b3`BFD+*&Kx<HLL0#$Il=Lt!?Nl> zDpZ#9B&;)sEnPXyY740N*ag%<w|$HZJ7xiCvIer>ChIHS2!A+-xqw9OST%;EFbVOK zLZf+)q_7dzDLauzRhFWz{9{M|n59CS?Pp!#>bFF;>pwWIaEx3~Z?vw6&B3e6e~Nbl zRi*hoRxSJFkeM8~qAd5N%%gAKPCvO%uDtKlS>3*L#;p2UJnTC2y?m89*xE$vT5k@v zw(7wKvL|zOHbf)qZCmw?-kaL(o#smP6=m9fRhApFVbm+DH4cqa^ZIlUT_goAyf&4) zQBI0UD_V-k298<~77Oey)~?MdZev@C6KUy>sKt3=am{eGD4g6N8*phZXv=@hoYR~~ z<hMGN5K<3nu(AWbHZ}A9Ts)NBDh(w`_tlqJ&H25I>^s>lnb_!hQ1|F$uS=Hpk}&Dt zdb)Pe#*bYAWLN606FD8BXNwMWeNt@8;kk@}zKYICEj`fn3T128wz{!%49~SwvSq<- zXt!nf_fheWOz*OpZg=A}vGfH!I>YHpwn>t@<Yv2LhtYND*v2$-o%WT=-rc?#G&B}s zZrT==X<O7=j(zrj=1Eb=lUeWW$wksExQXr%4T3_o(V`X}BU-ud?c+@xYE0_!CTaEA zIUD4p6QRhpO=d&+1A-hCMJWm>5(Ca|(W4ElQ;TGs>SxS7RM%r<zIGpOoX?7%wMc4q zr+l$98v2oLN}oW9cC2lamcb|OmI#Aw;c|0O{oZSX?m2O&^<iJKP4`gR|9H$EP3v5L zI=W+vgfc`PEo$a+2tszk1BW0|+6vMB_dX~44=<3X5}Yib6ASg<$tM>Lckut!e<yAH zr!z7ud)TmHIk|id8^T}SP@%vl|6eE@vfOi-o2%#K^(TJj|I_jLe`(RXW~J8$2RZ-D zLaivLrYtGfB4{deqye;y4A$;&Q_+gsB@g^g#pHfNf6+o$&UiFJmec;^m+KdD@ox<q z7QLqRJ$>CIzSeRTc1Hb%mkZbbfT&2jl1n4|r3boavnc%9w}gv^`@G#d?~*BVi|aIA ztg2=wYxmMjW$a?;+`F)2YHl`e_Hv+KGL+2+{~*HN#BT1^wYGJjwYKT=ibl&7;Jq@= zi8;px__@Dh?OJ?bbRe!oiw<jia@~6Svtw#a)3O!ZD!#9ydZt+E+ARi>h=DaXBVR@? z*(>iux*k?vxQbeqnmV3o8W+K2+?`RGntDl+^MP_|n#=!XSR;BI4zLFSVnw6n6g@Yq zkCHJxR-CLJ!yYsX%Yg&!?qVnVJ>#^mVy#!kd^=gk0+Hk$NY+$x)I`^X95ooFAxKzb zlm<C7lyR(F5-XohI(M&f9|-XLhE?;IFK9GN8yCjs-rP7}p7QFQEtfi~^|NS}UI1iL z5W1VXZ6>vnDTCgaK5SiURC>p|@)LWH=$=3O@u_N#Q$!2@tGFg5TbjM>fCR69Q8m4b z!W{c_ccf{$`>Wb!<9YMtl5zJ)?U!q*#cd4ndaKQaTq`YnCZ8fJd?veUFNY4f#Z+zs z>6FB>Bg4+I-hw_P{bl0wvG7SMukqRR&0;L$nkWS&C6l^mKcNM;Tt5~(fu{Kp<<>Lt zBYX^VQ6~;%MD!aP_Vkjso@klJ)z3u|J1T#$B~l}}D9wJ>YkFb&c&$+{S*6qq>PCN3 z3*i3xQnI#~_#bt(yjW@}ZH0x;I>}D`S(1EE^HZwV$Yh)BQEBZQk<=YzwKFRDpyUEc z8S;w!m+NwaJ|ZFW_Is%>fei3&Sk62j<Q|$pSnf_|V$d=0#D*#C@AGatx#3*%yV$FL z-N7p8GM9QM7ZVB-UdGhWWm4yIXGqV-L`f<JM`v^!-MjLNKi=(w9317U7WWwFo*h@F zs!OPL(!5!X^roWsBy07KocI{pCAE!%zlF~XuX?TpW4XV=Uvf*GBfELbK|klczrtw% zs-1Uv-8+?|>B%_1>(vrEi+qhq-#U6{($vg3g2DTwY`HbUyIu7q@7RKLi+a$EvnbxV zNiSfjuY3qUR7Kg}3s!HN--Fk0X_$2K9N+2Zx;oL5{FMsEPkDGvaw?78{@kKJ*_`4h z%L$H873=9ExtWoC<=GQ@b03e>@UuNxU4-?-?M0@gSewa`GX3WowC*+!a^^(R6FR3e zSb8$@JCKld&oxO@Widx{kad}yC$s6Q%O5?XNKfLhM`xQ7Y2nT(NoL~q64T;##=k>l z&5Y|o^`wtOTAT-UkLp<T<WUxPwY(}#=op1%%ZsQ5+l#i1f%Y=cw7l~5&U^XQij>I% zLsp)n?Le|QXKL|ePIl8!Xc%4>t;g&7kFGC??u`8NJ*K|e`|Ndl+2tW2HPf5RVKpj< z9F+HO<F^OcZ0LQ>T%oX`_sIZ3=z7jAJ3TBd9jo*Jbj!Hbv$0;ZwEaY94cY+*$~9Hp zptZ9<^`O>Nh9WxoejX^J1to*YgHmU8z$Xm42nMTM>Gn(9(vHUKos;zf_sb*ICN*5T z*4zif1u$6q9wc7$F7k+zfq{TR>6j{4`Uf8Rpaq>-H?04pf3O<>LM@Y?PtX2JFwE70 z*C|Nav1;7^)c@$e;{Vb2Pq)W<>y}V6{n?lt^wNieFpBr4KP)MW6(!|-4*iduev~JZ z6zloa{*LOXPWz+@N2x7Tt60C<B~SCUBFXT=MJahW$Wdo-!*hecJ^j7Rlh_#2kN1oo z^2cjm1I0=;4n5mMqTud&<?_jI!Y3rPnfhOv-}5+Z)w<;=In6R~(#rL<_$^a-D*P6V zJ7NbVI(l?3Vjua_O4{4mgqKYUe_l!U*@@Bx+_YcRa!#suNs+Djj9EwIAPJKsZ>`Su za%6|jip!7ZSK)ej;2ImL40=7@J~MIKl4#vhUU=Vw+9I}uul%=j16Ckfc3X5QHWRG} zP5dOjv*R+_=*(s&de_x_b;PzyzAwpYk8LL~e=QT`pdPD<F&a|e{jnWw*<Ghw`x5<* z*iQRzkNvk#{w>LEuiYMu1D@pK$saJ&K6(eIMrD+W?c!cV83VYEC<_Y4w*ASPBE8g0 zgw(IB_WJGGWpv_Na?nQTv*MSy+>xA7+||af0SAMmAUnNG1Kg3UE=k|SWpVMWy>@Fb zmXcH1>DUq~`qoeu=-Q2k=1|9byVl__eMTUI*}7*suFupNR<SGH&^4BOGPDC2f$sy4 z%0cRwGD5=T^xJQUO-FU9{8FnUkG48e41KGkoYm*W0TcU-d)(*Jzsz&93h6q%HY95h zj}HcTJ6tMW^4S{Dmz!puXWQ5?ch&r*&1P96ub^1aJeS8uH?v$>ZZ=vM@9~`<{AB5m zZ2ivRJJ&ZHB9zD9P`_y^X!{&5?Q@?Vc@MNt*)FAzDjIT^TvC)pGWUr~Y#8&nVj@qh zVJ_UwU1x>uw@H<i>y^>=+#l(l`C)FPY#AOX6DhiMp$t;4a(QLRb(czY-k%yiTJK}l zD+Pz8gV@hD<&eVrP8Rd}{qBI7>zEF;*B_v=cG|lu4|y#%Dwjp8xvYJF4F%hpWl4Hi z`Y;zVqwZln0NeR|Zno)?`Hft==*^*<X|M0~7FlAAP42EoFlYSC;k1nO<IWS>l9;CN zpa;t3wzJ+PcE<vn*B;#i$t{5|W~I3k@I~s>;rnY}Y^%vlUrN=MyXWJhW%y>bE=!zF z5+&E*8AC&Ru`WE0XdZT*Z<pRgHONyKq=t?U)X;(ZE`oi&tdqU^YWsiQT49d8&m<K_ z>&r3c&tBf>g@N0nS!<-`=>3h1S=^(~8R33+*1K@M-pV3lSw1I(Yx3=UiJOfmc3rAu zQ?TShGAqrAG>JENny~ngbKRwJws!i4wdAI2(^o(z=<f(ma?(3Jq%TWXq{m=Vg(g#v zC^g8W&rX-19Z}n-w@_1L*yKt9TcTZZtc%*2F)Pya9&3Kc!Ee$S*-?cLUD8~=bL`Xb zd9ZZRg-SjI($#0v#eJMIJuHoLH+lasddBSZw;@eee}tG0q-zv<70N)W-iM-T>OZ|j z?x%BUk|~7$Tph2~|4ZeUy@uz{rSG<p4i;W~(J>PEUIjN;L5;{L6it{Giahw`s1or~ zV*ejMJ$lK<dt4B=PDD8$as3Xd3JgEfnQJ9(k7l=05B!lMmjL}OI{#sAbXE3tf?}-F zU~^jK`973>HaFaUlfwF1`g*VIxxG=WWVKQm2l~2n7okxN37WoSAh-dK)j#oAW0i%+ zUzcUJ-n4T*wbsO0&h)3UM-vq(i(YLO>Yr?)_UcU{8MRm2>kMYo`hYjLu92mwJ+CiS z?&{V%WzJcw$D4KepKq7{b2IH-GpN1z&>bHp5<Fohu*=k+%9T#j3^En7+g8!^7rRzb z_0=t%mA8>{RE5>@J$gP(hafdXW>DHy`kg-$7I~hV-6){)4&`FU7Hl3hh=*sz8>LRj zNBWt3i-uv@X!yr^{*OF>LM~DdOyFE`%CpaS>`-9+qgUp6&J;IjbTVK}y6q!$^x?T= zz#r<HlnsYUDXMf?dL+%w8<oOl#c6gp(kD_=hIB2H4BbNH2T5%3sXSg<d$8~I|1#ki z{F8f}PgYiL_MpZ&UMto7n>X0>UvK^Dh#e*pbnI-7mIh~@b|x*iL}+^`HSx*X4RH{v zz4n0K{m`GPE|n*&vUTAP{w4U7tRA7a6wm`7=sF)C+Bp}KSxh>MEL_i{uV{`u#wakZ zGvnvXr52S;{U;UPC&!_AB12|z`45+1?RL1Tx^xYX_Ys@5hj0C%bQC#PkI+YEZI!Cp z5tGNs@=sSH9WlB3%&)yV?;g^gF$+%g4Pg-A@fgh8pU|uDoEFvF7MZs1)MX(idy>_R z0}Lwr<i17vg-T8{BJh9{y>`uZPX3z*5O^9+ni$FRN2pNAx>CQ+9Af@Fc%5ORJvhk? z+#lT?s5ikmgv@P6kt+EFXSQ~3AvJ8UxkZl2d5=%l(dOBq`o%j7+FLh2C3g!1=dZGv z7p!2Tj;>&z^D5Y=!7JD(sbED%Rj`o*6>Q$|E7&E2R<QlD_L6hGTM~cdppL6%!^Cck zYStz>=niq(QqyC9><ApLsu@K!`#t6u?0#K_tDL%#%!*iMv6C&;%>LV9E8Q;bCRrnf zR$nZi_wfXh9L}=p+D;aOPsq*!m1?_Ap7)>Matam4-(SFBC$%ljb$aUCPVUKMW`1tV ziTIM+LQC5tXO)?!$)z${0CqOB%1l?$GIYArFBge=7l|qP$v9R$iYYF4i;eUr%id8@ zzixi%*maX3qaifEm1N52cy+T>ZTu^BGgvjVa<T@gh(}k=9KUW#9X-bQ#e9w~Ubb^2 zs~FX}FNN$Vm`d-?9EwvPD)gzqsgK^#+&d?ex#NyUx}O-;2MTdMZWVVVc2cD{`VUCj z8F)CTLygYZO3|@~`?;s3pVp14j3LbqMHk4zhU(_c@ku~8OTMbwBAHHi7q`e<acKIP z!Fv<gcO2|F(ZThI^bnf9jQREw?#Hy(uWTyzP<_cYX40C6@=V9(vE-uOQFtCVkTQdk zJ2~a)5)8rKKB4D0JtWOhNpA2QY>!aGKj!*I_pIFJ?enoWX@m0U$#|4WTDDwmE*hz8 z<+sRda*Cx);;oAYo_;ynJ)DGx9bQ!U@UFJln>MEQngbrS$Z~0?l-R%&4J)LtFmb>5 z>C#vl=K>Di<IxH6N-v~H{36f7u=u&2g=qX#Yk}KqdFHcZ(udaK7xPOV3aFmEe)s+N zpqRGU-wU6q{riR=t{GPNO#R=h>g91Vr;t^J-(-!CNzQIEzH2_+Jag$cnM>2~`{d>$ zx(_;!etVyCXw9MdIYN77wgs34QEP%1xnz|jo9u3D!PVI3V}BsA@>o>O61^MGJzh@p zQ=j<Or}-(5Lh$nQ4|F{C0#m^8_qA8W8ig^I+uy@aJjkb=5g%zHJ(36bpxOO`uzLpO z*uo7`D8A>i{}ForWnn_PJ<K&OrSWN!XA<5CGHU_l(WmjTo`qp??s2vjq7osoz<Pv* zDl~lE+iUTRod2-1^xM1de-OpA)&IWmnb_|)?2_WC{e9xC2$tTzuC;URr#6{Z{OP{+ z<%rnG*)KaYwVk*AP>xu4eMBc%5@GVQd4d;oqf|^Aw^+;Be&RCoCx>n6Sdpwk?mClw zQT4OOhNb&IMY<R%O8-i%w4Tc~!$<YWNpHSIwlc>hPP&~_#4vzI=>zl?h9~!ik5zNm zF4x|9vPA3;<OEwQJ#W6IH>OGrWBxP9!-f)jMg)2k>F4Al>uGOJ+r))_t$%~wFYTH! zD+zH&@rxH+Xnu(sUG-|1eI7$}bgX}Jtaz0?e`hq;q-%>ai@(@inyu~6(E=n}NMmXI zEWS^Ov*FMkk)7b~VbV`@N42+<XYf6>uC;qDVRFOFHSD7$4&7b&OdG#Bav&ZQp>qd$ z4}*LG2PWj~U(fl5NXE~Qvop25_t*Edv3=UB8Osg3nt-l(WB^A9vS{|TJ-dI))^8Dy zrf;JsbQWp!#MAYT`Yc&*F6EC`gXS0KZVLa)-<z?c7a20SR`RAkI-2HRU+gkf`ma8X z7d-<Fs<?Ry-9wI6H>no2y}P^eD{6a4DJdj=i(g*$6P~;O+_SU!eq9cO>ht@Ha(Gl` zZFgIK`kU&$SjJ5T$`WSAy*xOMP-Ik`M5eJ<%c~)7@@YHNz+aw`wrlAJJ`tGHWS@Kw zf5k>#L-TzoPhUf`S2cO(b%)YO=s7hlgLW$|gKkh-3H?;<y#>j7q1ebt&X<)|L)I6W z{2x&54c}Cree#-Wh0J1XT*g7KqUD)Mkd4dbko83#De!YOodf+$>AYOe=c^za?hTOj zxdqyzVLSx=N?mM%tj~`_*5_@|K{ee8{Zi>2Xpg!*gQ=yZOMIFSS+`$<4y(O4p}#1d z&cXLCrA5%6lpcemobt@$kj=H{hZ^%S)n0(C)&sq++TS1>)2w_iv?A!YYB~Zsq$Iax zbV9}E73dGDy$0=7?RQXzQZMv-HI?^!{7$J8`fsH-Alc{6Gi}^PlU8~F`lC{5ftSh@ z^ikC|LN?Cdh5oGCvyct<1;~bb0FqIL7w$lBC|$^w(2YtJ&>W>oNX{A+oBJWTBR$VN z2>nB8H)Qkl=a9|QG}NgsPT?%e-__pfkd49nAsd77(BIT_3M4&Wo~eQ4ax|}2g5FlD zgWgh_3H2+@hTc({1N~L$MaY)<Ymg1&>=QAf6%?}u^<w&;kgXAK`=+;YpXP6{T5N8E ztcz{F_6{Vce5oQuUOJ+X4Wk6gQPYu7w$f}!*7L>YDWA?B&MRE3J;>%pIb?mA0_Cge zbZDsc1(K)Z=9xzz>)$&*-FuRk-e;gQ)!qw`Y%>&_*P&Bs&Bf*|pH4iPm)EHFJTzBx z?FHzkn(|Ia`j|ZPcW9oPzT=w?FZSBorI776=0Pv3+fPGhYq;Nl=BwLpL)K@xt-e@I z5Bl_HpYl%eOs7C{7ipe}K{ki#A)7-DP?4H8L4`_dpc9qapc9lHhGdJKmpefPO1q#D zN_(Kwl;j@&GnDp0a&42>RY9jJz2egW=oHoF@jL`u!+r$W+&$@3UQVQ@r$RQ)BOx2- zGU!}2y#zW(sRk-l`a+3);aIU*b(($QSh4vYG+Iq}LDs*QAnV^D=mTon4PB_z2aQt7 z<@pQp)aE=>3E5iwVaS$wJ!E}J_@+-nH*0Bq53;4z360QNa`G9xeN;_LAZuC;m1`JR zLN<QaLDuJakc>%rW-0VRr8daM<uS<S+E*a!Vux?~Q)mJ%ip{Tl)20z#jvs)m+mUA) zGg*DU5VA3t2wDH8L2?N%&(uMal;%Jal~zMGE}w>Mjr}}i-Tnz`)bwsRi&t^sqS%~! zw)Z-+GRWHd9aOEReZKZ`DKGR=?a$EVN?GT4E<Ouc7jO95CFk1L!xftwplRx2DP+U= z+Ih5TErstuR+}}_n19pw&4X4dH9|+AV)H5JGwRD@kZsBT0X3_=Cm>sb7oP9=HxG)d z=@O_#X$55cTLW2NJ`1f<(=Cwor5AdX(DKYXkX(`F6>sl1<~FtW8f5L2T)+hmH9Z?z zuha^yR(tnA*4|^#?W#TQYhy<lbBAgbkhNC@-Km<K(6!o^pf##})z=Cx<T)0q6+zbC zS&&W92cWyu^n<?XBHy$Lx?4?KeACDWh@ZxOIJ8>nO6UrR5`=8&{~WTVpEuf=wdzX& zWMeP~>Od<tNobv#e%v?x6m*YjpY^pLLJ8G=;%h&L)~ohQUt2JSx}kAdbrCtPrguU% z+=rlhRomoi9nezMeg@sA^c$#6=`dvL!DVB;T$=+W)pR~&eclSmA(K4w4d33A(EV!f zd%nFFper?gZ$UN>#(&VGDbNx%y$Z5rGy_VhFS8&UTC;C@C-i`tuJuj7?wkGqYFE=A z`KGV=roV+guBN~DP5<hfz5{(iP366JHr!&!#%ct#QBBYBO@9u_%}K@PFl6m@Ll3IG zKl}EQ<(}z-&?nXOQ;-eg%aF~XpZWHF1wEwpUia<24cS^ZVw~sSNa$g;cOhi`TjHCp zgdS1T+kDecK-QPfL$>a|0NJ|xmQQC?c-n=KO<OtiDfMq6^i!zVTmxDE?tyG?_9$ds zd>;C=y7)5mQ+4rI-}D`5lbXsK39V@fWc~X9WaBpvvhn-4Pdk135oAMq8G2Oxdlj<& zy#ZPOvL<-`jfSj$H~4g?Pf5u7_aO8c_3u-V_3s;y^>4p#?*Q~!wf8IE-dPhpU)~RG zR@2dt^<@t9Io0O-S{$<Bu7UntP1pIRUx6M|?Hj)KDzrtlgTD6JNydC$wJneh?Ip<i z{2KHHHT|`3np<hi7gZYuSr=m=>tZ7GxSCe^rZb^0sdj^}eG;-RJ_CJOO&{}3zvY`g z1^tJbKI5CFA=@+j-M9BHv{mipO!i_`23dPmkPYo}=qqZk#<zEmZ?E0A_XzY=wf7m{ zUhc)7e}$0s?^Nh(YHtK&b7MU8gldz0Z7TG2)voZhn<4AV66hOhy23YI2YpkudwuN- zkah7@Xq%dT(>MJ&WYc>H`ZPTat2XFUN}bRnO5M=IN<Gj+O1;o0mHHq#IGAVpp^ZwW zioQ-M7y7tTK6I~A6q0A#=b0kt0i|LnrBnjluQUQmDwRTQN+Y5Bltw{!D2;(?mC7z* zR8txc-J?_qty8)LTB{__qPSaW8g!RZ4b-YM9a^JQ2i>VO6Pm8H25M1S3(2XlJhL8J zrPKz+l^%eal{P}Md%}xzp(dqG&<dr^&~l|M(1(?FLANUHffg(6g%&C8gKkmU4=q%B z1!`0}05vEbgcc|rf^Jqi49!#Ogyt%BLmyM>fo@Xjh2|*rLDwtwL$j3R-LdsbxsV+C z%rp7WbxKj_Mx`Q1PJ{BgSLmZkCD08@BcRzzrO>rXBcT~ebD?EgV;dmbQkFu?Rr@zz zOF>`6MX~vJpS}aFP<!9??L7xIsn+3ZLoTJiQn%Zo&nxYLzNB>FWge}99z)ABcS3vd zrP#DVw)H#={kxiOf#iBCuULgPD_uCnv$qa<9Ie=V&evY_=~bVGPW5KoXG7mI;@>Ff zKh*8z(0{5{1KE73gTAd=y|3K|U797Ky$ao;roZv2)2BBfn~wZyqc5N?HYY(=`=U>O zgKX@JFZWDmLto93Fxq|XtI#)8d(zjgm}c~K&v~X6`i{osTIdK=Y!*N^v^yZ{_Fi9m z1A0<jyaoN2(z}p#TN2}fxN7G@PbpmhS<{Ol>+=_`z!zebXP$?w_L5KKS9-e;vmk5w zd7qx}DXYdajrvp#9U$CdvlV(;!}vP1SGA`g>)&2zr<%S3eNX8Kv`6ioewAl$9rQY; z#bz_KQ&aS1=w)@W&A0bs-`*dg|D!H)ujUo!YOes=uT%mZR@3XDpDJzksne&^KJ1xR zL)OJdp`vVw%k5C7y4?cVIKSZ2ThQ|w+PlzRO;L2Zm!cBr2WmPJ+M`qkeP8Jk=sBet zXt&Z*XrEFO^ny|x+N-o0`mxd)=qE~Rp%<0bLqAe#gMO&=0JKYKd@XybP_c<YzfoEX z{aQ^oLkCrR7J6CJ@q5Vb5aeFt?RlI9eNRhf6l6<g9Ar!SHlIEVy{bNMfo#5f!#CXt z{aj7=LO)Y_1$ss4F!U>>PM^A=U#ivv{X(f1dQGVhI-peg5%!CrV)F;c#_CX=r`<lo z(|!Tj+~|R9Zj@i^(N#Wu39`QY0{X6|Jo`G2KHyV1WOJhmvMz4)=~2kmzh|I7XiUEk z*?f7?w|5Zwy_$AHzf&ri>9vY-$kz5c=&x#eJ@gl)c~CD@Y}P<oT6ez&b*t$%$cDBP zvhmvsrPcHm=#NSVp*NHcK|M-`p+75iLVr@~hPsq)uJ_u^qtNqObDo84OFjtMI3I!J zT5q1on?*0BZs$QZUw#9<t=eJ8#`MpSjj6ox{w+0)LVZdl(3?slp}#9lf&QU14SH9p z2I^Ou4*gB(`;cwtZ$mcDrL(;_e+aU1UI?A2ab5<UptK9JalY&Zc1=~QhayUIAsgpA zp`og+g=~sG?wf9g^3-%IG(>4T#F2G!Xcr_;cg-^gp#r5tklZT7OcffY)CpxP?fa+~ z`?OEFH+t!~2s&Bqje~4lE`@ANr$Z;H>1=4Y(%sPepklMrr~Qz1abOPpy|#rP-Q@KQ zw|&gh{s`F}(iwBv5msOBhE7+X*F!c28zJl8X6Q6E-3pZ`&70@>M?m`7$9JA%`gr}7 z%l8s<$|?0($xmGIr|p-2yyyPUyuPYTDvMcg@tlSg3tIH;9i{V^H<WVsMVwp2o98q% zt{OLI+3lsi@to#W%jYay+1MDry{Yk{abqjSPMEXe<|ShD=9XLLtXfc6HnyqZX7lGM z3sx*^8oRjRg6Eg<jyFolOj+1CKR&jsOhUBE*aqGm5?|GbU_{Nyl9^2SGgdtwNh`Ov z{pVy&|1~WyCunPI!~FPsCx}5#)|U$H&+!*O@MTLQue-8x^2G6GJtk_$Sf#?mGn8>= zX@*j67G)@9rXj3Mm~7@{D3xYThBC>_&QK<rnHkCiQ<tHPH`6ne3R9Dzj5AX*lyXy< zp_G~NVP*VeQ<|YvnrMbHiKZLMvGEg4--%&mg6YXn#+ySKN`={<p^P)TGL&+&Ekh|Y zTf$1kWb;6VQpsbVLh-4XWR_+q6V2=lWrCTWp^P^*8A^qjlA(+<mt-jArYu7#Go@i= z++;H%L#Z?+8OkJ6oS{rKMH$Kj6U|V@)9r@RKCZ&_o)A{XnZp@MxjB%bl$m{DrF^p4 zm7!Fc?HS4>vo%ARXf|gk6U@UI3T-e$p$%pz<IJKArQFDs*FeiHFVkzb0fo((%CMcX zN;4`$nPf^c6!JMknP74=l<}r78VbFv!gOXR<IKSfrQGb#P{`+yQaO3Dk>`>Rq@r?i zrP-6AOfpYoDCBd7GQm8Mp^P_e8A^p&lc9_=y#?XW%gxfDGO2RnIJ1#)#>Q~$%7Ly{ zMwFbaN(}CWHq5!~2ezk`Z!z29{^OX>+5A1upO{!>GPE(INGHF>SLmN7l}{+=w->r7 z<0jH;g_TNDnxRb4^BaDyPO6|jPY>Ct7+0y+3kU2>s3_OfLqHi{rdQts%7jUJg>pcd zSYEC>UqNNOk;gt;g+O(mLH-Y<{ce60g%rt&X(8nc{Avg(+xgWLQe;N9FQmN6uY*pJ z7}ygLeNM4C-_Ng723(0xj*f$6<i;jH&N4EV(Q7>sRw}6B8A^re2`iJzObNmIxlvg* zi5iumOfnCLmCDIRZVw2!np|e&y&^$nf*DDK2b6NkbWB*Om|z+*luENXtT5^w2rCoH zOkajF(G(8}g*9=asR=8jYjs$uEHi6E%DA!#W@A_>r*&s2lZ`wudLUin=)<E---60` zGbXG|7;ow_lnG{2SfS+}$WSWGn4uw`Crvc-!b&A`lCUy)yx9>_D$2^u&J1O;*&kNQ z$D3C&6mmYSjH8`~6-w}MSQ$UgbZ01&O<!1{Rp#ag(^WBXf|0XP19@06slvz^sen>h zZboG≶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%0A4xA5au3`cB7D$`5ar(7jZ}PVg>;v*1 zJTVwdfFr=Apq|C9164OIU}k+k1YcF6K1PS?JN^61hjD#C#yc#<IhwGV-{>X-W{2ND zHqEQ6n`8ZAdPN7?<cI8}qQ%nKsr|vr?5@T^ao7udyPICIFT<X~k3$`xbRw|v)?r9( z6xBvY;TTAq`5pR-1e}%pIFwE>g=i~m0+X%<p|??39hagozKQqWdHY=ZFS%suN?})j zynQHmJfRK;PX&(v&j61E&jF7Hr+~+Rjo`810`NHSI<PmWY@Q5CXHEg7BmKZ%f&Ia4 z;OXFBz%#%o`56eR4hMlpfkVJza44vE)n|cY!Qmi!?3IA3*K@#3UD*v^l@!!$=2+@g zu4U?q;z&ha26HoXWk$IALa7GFyXuPCu_E|&sWaNX8-uF~l|3qnSC)0vrbTMI3S8}v z%GG;!&<>5A6;axjLmutHL#9VcrHFn!X+Z<U&=G3E>ztH2rY@+w(gE3pA&&of#-%Fy zS3&Xb2KDT94=5e@f8e>`eW2_H&dP}i;5Wc3@Ii0}_)V|@d<c|1`3|UY!gs-?;P*h; zmG6Uhfb=zquYpg1_k-*SnfNZa2GlrWE%+SxBd{BJT@Pwq1ASAX7x+_9<A|SuvM0X) zu{qu!Ks_gH18)QW2<kci74Yle4p8eC{sevp{4=;3{0q1qd==aT(&r_l7r0+%=~@l> zk|qS&AYIdQt<GQLcMrewGVGG#D2!zGj^lPdl|7q>YjsCK`b0@P7=)PSWQ@E!esp^p zUmVW(=(aRS189GgDl;Mdn39&V@+kc{5S--rG5TTUdpvjuI1xMrtOPFvF99clmw}bw zC&9_!6`;y`C79V(Z-B36k#5&DPZ-Eg^`1Gep*RXNh2OCmZPlMMtD0Rm&%~yrJ3rp} zDJSD<&=ZuA-mJP=4UG$|Ls#prM-oiRX@<|LLQk-1lXvOOvt8Q$^K3<0&QvDJ`v7p1 z<Hry1=S&xX#qd52mVgUEg;@lS0~6rI;8HMCzG|<MrG7dx^)mr4bIwC?RL^SjaaFV( z9p*A?8{GQbAl)ETI|efQQI8HYnNqzpF$TIftUaQq`%4x|yT9XqhO#M7p9N(&Zvd6Q zR3~M=6~6RI)uTgYRve|LHu*fi%(0>3D9la#iaXb-#=54uxM@|Otc1-tIw`cC?39x^ z+<s0&!%Uu7d5N7qVP;&LFbk}Epg<i)0Hq|NB6H|AGWuyx+rb!stFQB0u3+v^*(6WI z;4O5#+ngL%f*KRw4i<x71a*@;!85_HfEp`)4V13k3r+#Q4mN=IgR=480A=GJ1g{6b z2}+g^gPA({Dfp@j{dA~)3OLib>gRL(GJS9qM^aQCa*yPn9XZqDRlZLe1`e;9OiLNu z!4Dl&&NrozJW11HgJJnj8urZksg2dNZ1tZivW|vB+$c&iEfvQd%Fh5~+7%q)c*l7> zZ$cM?hk^8=iLoGksL8G`m?;ZAN9#~L9g>A45y;|Rc$x1S6i3%j<M%3M@sBiFpr<&x z)%q*wgX_X~l}GT>yElQALRGwax{WzxNOOs9TX#xA$16RK#y~>8-VN}%_FwswjQI2V zI6l`C$^|mBy`|8xESWTOU14-j9g>OKzIf7)4g7{@^r?!YFw^<%=u9T@M&>oAH8jr3 zQW9dM9cgo?9UQgNlt!&o^;JR!n`Son&Roju+1z+mb-a<!3&`%vo@h;gzu;Az;5nha zCy-vv;TIe#hh(O*)H){i&}<({Y5i^)Sj@GNAiAag!usJ0LABk{;0O@iv$gS`0F~B7 zpyYEg_y*XAUvS9g>PXi^)mt7v$@~_6nR=)=3M2h*rJVkeriXej6+Tc0*R!#cc9|t& zF(hJ}Jk+)&Y0oyLX-O(ineFmY%By@{1|AB25|sMVh7-y=W0Wj;42G{m_tYUBOqa*k z;AQrkilZ>6^6T1}jY@k1NRYi8??)PO(y)fENP)UFG}cddUK@U!EKR$U@|Y<fy=zgv zF9tQ<s{l>bpvp1{%+!~cP>e^orkm=JeAv^%3-qO$1T)9IigOHMZw3!-?_=9-xO<^8 zy^c|@dxx!i1V<zw3^RskALjIfwD~|G<78%URnU`K2_EVi>#k|8Z>+2J4YTHOwKPV} zeMVjV^cnH0hQ{gEudnVnK+=6y!P0$Z%xa!#mSwYxI<LMqKEq;Z9Z!2=#?lHJy{ws9 zAJ_XDjX1PAN1-fUc*pzT63&}nHM0(nqwFE8ddUY}paoU_=4c9~#XL%GPJO&)hV`Wn zhe`RNq?dExT}k@x-L(qz2rLz7t_mc^3oybRiIns`E};diwVq>1YhXPEwd`#6>}RCK zs&E}z9aT$E6UGcnd<Lh*=$t*qr_arNhVb9=qv-|0WEW18>`G>eOJ;t@nV1R0+Umzr zPA_wz=J17?nP!%Pp;-E@wh(Eg8kzsvp~Bs2USqKP<2aYh3_s74Tma?<{3(0&xfA`n zdOyY3rrAHO@eB^NF}3fBFtlDq$29Dl+T9GW4>$`P0L})_0TGprQ|5u=IiC++0y0)K zpU6cZalIwrHQ;q1VZ9dcW)LwZ?gE#CdVWuW-vMs`e*mVypMX5`Cw>jy1il0^&P(hB zNyGdYZUx`s{69c1hxvO@?+b1R2Z78L*nV|i2DMK2KS8}GxC_*r&{sj`D)r2rh=Yus zY~AkHLFN>_`#`-vAdiV#!3RLi2mA>98u(-I8{m5I5pV;j`G9A@AAuXe-+?~|wQlzp zU^nnt@OW@Dh>wT&D-d4}kFqAt1#_{VQ$gk~64KHLI3MKQVM6NH9effz1e9VGfm)x- z97m!nb;%kBTeEZ|cmn6lkJ(zKqroAZGY66w4i<ybvEJb2;0a(Icrth+cnZim8QWv+ zQLsPfdcVMWu>|YGY_GL8khzq^0qD^{@Nf{>Cs_C7oduo&4hQ*Gfp<1|7I+R=2J#Lk zF%~=zoCubIRUmUR34P*j6v#VN+q3Nr>bVcU;J5&SOBf&j$Q<*nf}QC*r8pWV4deF? z{cY9En%Z|6^zExYSN5RuG2UqM7#zyC+GsaW?N7%Q$VO$U2K$2Ob2wLjCg*jWtDMY_ zXZ6MJCcDRpcTUE5`F+T)YVQB4^!zc*yUC9UPm^C0DEZO;O@4YeA^FV%B|p8Rcn!>@ zLn`)yt;jy;W@RUO2ld$9gXHYU9LTWdt7c|(Q<HbfUV@>RZdF(qv=4b&NZ#@iGvmz- ze1z=6ahF$&uDamj3FT#ck*spkxG@*SsE>ns%p;V4a9@4fq^ZhHLure(J1tklpAfrf zRBS?3`NgARRTn9hag4$I>$ZVf`t@;RE*w3HS0?`DT<v?+;qu5)Vcfh<E>>N_Ame}@ z|IMw(c|32`@H)-bmz=uy^3Tl_fGTBckool8-QL&!Z-<jgZyRDxw9i~s#n`Ow;;TK0 zSNv{X8h^~}xz#gq)G2G6-aM<0^)M&9P=}_68d*Jic0-)q;WTkjb>Ykfb7puaxPV3J z0fXe+m*TwRU7*tRKwPZ4cv@AtKbfdPD_hs62N_YFmL=^M*N+;fN-mIKFRY7yqONgv z{p{)5P>%6lxMA7_gNBZ3h!16kG}7Z3KgL8JQrW1kK5k);<w9?FfmK?Ri1~tw2KH=e zvg<`$pW$Dx&~n2%EnZ|TK{nU!(KqcL;~J`K!+V^Vbq|e@{CgZuYJ)pmzowaOQE|D8 z^f=w;TQSSx@#>lxVUh#WE+K)k+PT%UYwG+YRo=tWu8(4h(jqF&;c54pSU0n-#utUM z@ja9csg7!_XTeO>NNcd#Pp+FErM#iGd1hVJ$cEYeMtE$WcQjWc9j=Zd@7hU_i@Mv} zev%XG8t2y6)QzMBb=p)=IqaF1k+4Q|;Sm3Vl{&njJ87Iu{wDfWWn!wDv|vu1C3gY+ zWuOvcW>ZnKt7oz%D$-+{%YtH+*D)ng)5N>)NRKIL_n*Kc2^lAARd#J?_B9irl&i0Q zqmk?{SkA+Qc1)b(GDhOFr`zs|GyMc6`0HISs+$+ezq!Meuxhk3q1w92H>063j{S)A zSe0HOmO07iIF~u8au{DF>Ri}WjQk@#7Q0BSX{$1MP4gMndPBKrTfc|>n~wA60PU_y zV8_us{$6UIe5&FpBy%4@Uv8Qtqy(<m)|{;1s=crJ>0anR(pFtiPX$pYjV5qSs1ebr znAP7j?TfniohsFK|LiB}8zPyay7)-;t+ZRJ>KFJ`HKDG0CR<%rh5TF7%WisJW%Z~D z`Y`*ZJeysnW#iPOrMyacs-MER`lk3rOb(iqv{hrXUxk&FfDYmvcg|E*>R~XvVU^jK zCcaG^>9H%LWE1P+$i{EQQo_4kzTEsk+P;?D+3mu4Vn*H(bum%@l#%qLU^>vmqnf?O z521Dz7VMbz=EYQer(1lAebS*;pbFVH)n=WqY)AR!w3ZvHtZwC+bg=iP)puvxWWMV* zp}P5}{kx2?r+hOLrl_y_S)bTE)$gjLQ`h@JeeDm8jA}5gp_pct_#xAcq6wvwjW)-% z?@Ox6ZF6E|W9#Z!Rb%}9Qq_5^_AmI#E{ziN^JzJ<8;GfSRrJHMsjiDbzTdk|s%U7k zW~>oX5Tfb=CUvXhzN|K7RI}emtd6BEy`7?Vx@oF3JX@GmX6|3{({<L_x3iXCMbb#D zU7vL`EmMs2&=?c`L=y#FgukuqiuAm9R71({Apf$n39gySlIWqo{Vr(*Q>+I6qN!Tg z4`>(Id`1<Mv_zAc-Sj<Sr4F4LL%+B;r{@v-G9s`qYK2?;d&vr@8l{6yq21U>Ex@X& zlTOGtIp_N|?5meq>Yz#3{<KPRh#$mtIH7K2ZCk7M^y~H<$u3!Y>deTz>n697kyhta zjMN9g)X9x>&B*G|YV}&5<B!}dU+RVOJ5-zNS+PAz<2`Jf`+#2pzt(vJ73p!VyD{d7 z;eMot-m|n<f4XJVEsl4J?f0U}&_A3;`0a4yOukfX%|JWthDzbr_NQD>f0US}+|sPh z?2>f`ohYhR`d|HwhppE{q&(`aFC}n8Ue$3{1MxR$z9C)vMmEe@U>R2%=wQGq8ta%+ z^h>2)=aU^Iggu<Z;KuL%Bv8G7om<V9r5I-Fyx14n2wutB@Y!|7HV~%bGIk_Zd;Vv- zNUd11DNECGYnu1jG)DVSMS42gmw>E@Mb}tSkB_QXd#nfspjB4olQRoMt^4JXIH&j# z%l-FFN?xz1(vq?w{6zy8X|unZF)1p@{@YZ!L$3TGQ%8H@ca5ElFnr7KMZXMwZ)SS- zT*p$G;G~$HSY7`qWv-Jl`#Jj3lC5*&uu*kWo2QR%Xt>(HqFT-Dm#X}sj(^vn`?R}C zWwQrSraT!NN2^zG7R~Q${XWVpT@P7gH&!%7)XV+~pJ6?>)@)Hn6B)Fc;!9aIHx5sB zxP$WIYGddBI)Y`Jv*uLcj$_sCZmt2DO5drHnKf(jg;mx*RFsL=>u{+__(nX^LrV=R z{E@JACA!0;GA&(GOR=+&4SXup9)Pa&vukD70J5&p1Slo#IEM3ut;q^*m)3pw+i`bL zhAQi63dxz<WSzmS_9r)^^O~Pw_n_;ZgVZ{m!uy|pSF`C*Q>=rd7<^|{)6MLY{PZiw z+;PMMHPdDv|HXC3JoeyB{~c_n`(0c3(~s@bI=XSwH`k|r`_$m8c7E38U`Z!?ziX{W zE6jP~)@~0y@%WWPMy|a*cJNO=#YFdi8~^#fH+}1K+aLY!6E^)}(c7<HI>x@;L-+|* zcRlm%2ghIe;MWEZeDa$wj$_R_^TLHWo0|SsyW#Ne*ZpJQ-JdGE_97;z+l-&R5B5an z89UntTl2r2?SsAB_}TklUxJJZbF%lrUS<5t|FL3X`E$n}p7-=+7tL#Vm5J{+jeqgZ zZYQ0*^17x)lSehh=0~QocC4$?$=)CP7UO5{kNq>_XYY@FFq5Z+IobPTvo;NW_Wsz~ zrlBw=dw=Ym#?Rg#8=pPGXYY@Fz45d6$Ns(XN8VaDaYFJ>uO58Gal3jy#{9ci7EwC0 z<{$dS)2p7(IeN^nzIpfmju$CkGX80EU#RW%g+Dy_@>^$|df2&tT*)^LjGw&^{CNi| zookOf>%dRUpK#5tJFb|%<*?^zHg_2RjU|&Gd-C(GpPn-0+Tr&cR>jMozZk#t%#}YJ zIQED;emwcF_jg_1#v;73sM5*ar~N;SKm5e|Ui{IV?;Uw`ujBqWv)6sEQjf;Z-lzR? zCaVi`s@Fby&94qR!h8GX&o#ex(w5KgI?edm`?nv$!h*t_zhBp@&l@A>B)mZ*FKb@+ z#&21#Vf-7P`o`ym?!5LJPo*9>EA{ola@K+xzv-cCZn}2u-0vTG`eh@2y#8GDy!$~) z=h>WJU$XU%t)H3yK-=-puXybSmf;!y_rLsX>gmQW9{=i;U;L_S?6xA_`56DlFaK+4 zOU>-5E5CWoKZjRO{vK;Uji0^0eHrhu3v+J#-7~+uWZIU(pC5Kr?&TvU>&27t@BPw) z>wo>^@Yjyov}9J@DQ9DJ|B4+b@6Nw{y&ZPFo6TXrX4~IjKkUgnExxb!#dcdLPfp8x z!_=#q_DkOP+dkQ8nYT&o{gC_c7S+x1h8djghkHz8<gcmf{gU*ohT7^m_4^~~k9Xmo z#)^mkL%VR-Hq_W#lcr*38H#z85NA5LX>x7d+(DCPEhr8zPu}|$8<VF6hGSZMx+Wcc z#hTODz<aG(#nb9%)-_F@RbSKC(9|$3UOczHskwS)aZ|jxw!Wcw*yOo27@V4!&9!xt zYZ|eZ)11Ni0P&luXMUJ_^RlmQ)(1|Y>Er#q|6TX@-jBU|6K{$3hartOF?F;*y56w! zQe)-e&h;=Kq_xFsS#-T$3eT%`%*KaLx~Z|o?RvsMtZ5btclUuv(-IALRM}S=79TXV zxqfEthc9_xQbXIER`0$K%zn5B9|W9MKOIreVBOok7`vp2TJ>jJUe)Zs!FnL04=<X| zGCt$OX1qh9wr1q?4=s#N()`f*%+kGS@%mY~Kl)<*0G7s_vOmPIz}|6x_)6`hTw2aL z`vaGY;TF?=`ype2BJ1(fRz`4-K9dF%_o<sYr}$i;eonE@hZOfKzS0=*#qdv>{F7l^ zCGa@Aa(d0wiPdxKc$+-EsrWSUD~zu|T=U-pD*{i`-X7+UcznknZZtDMqVm0Qj*5Eg zLf(du*Pof3V=cyfN9F5F6UK{r&xX8Tg}gl>Pi}XL8`Za%Jp6cI;1Ok1zI>sKih7%% zin*HaZFW@D>%)wVV&r>$9ToM?33;U<uYegDy?;EwyUbDf-egBby^SGnQ^=dd+{+0T z<1R<#d-pgh>J>86qO18{k)xvC!%%%J#vVrj%%q4H^(H$i-<uNh?u0tgVr+L*zSrug zsMniWl9TKnCpjwWRWlQ!82MhEqoUrOA@8n`w>{*whP?Zju{zoArWt8b`JP@Fiz0u# zM)!GB9EBtg^Sr(mW4WX9y&D~cC=U0p=6iXLih89`r&x>|9hL9h?5L=>9_m!P?@t{S z^%gRZqZs+-ZYe72{VwFa=%}c75>w!QxKkY!^{x+j%iDQJ;qPua*yJem#ZlysH!`}K z?~QU))LR49-(u)nIHK~sLPtft+e6-+A#V%RX%?doOS?s(e~yZJRZyoJuf|bPZ!`+- zha2apsCR$J`)0^{J>>l@<W->He%wipih5g)XT`9e1Jqg+IdBx381fzod2>+L0TyGm zqw>8qj*5D<D5<XIdovsr_3}`@ffl2}QTg5^N6{KX-sX@u8U-3;F>Z5IzIVH$qTX{* zXWKn~?I>y*YPj)UbX3&)Gt@BSz2>N>_fM#^jF*E#ii&y%K@Bxt4@X74W1!A7-tmr# zdZ$4RG2TE&MZI&O1{<%;QBiL-lyZ+;92NDphrHI1SA-h+;d(kM>TQEMhqwoL15j{L z`Q8vmMZGyt=Nd2WsHnFD>OAAMI4bJh1a-dgZgo`Dy927!cwcr@)VmxN_V00pqoUqt zLf#D_@8yuUBjn9Q!Tq>%92ND7P@oaq;{b1pqw>94M@79|A#Zoc>w~f=23qGR^aW)Z zX{l5=3Vm@@)O#l6{Ve45K#Yo!?;Yl-sCQ<_8y@m1Lf)j1H-PFJWp`WXC@hGhqFxCV zuB-Xp`HqTulS1BQA@5F<C1$B?cN7-bQBki9^*YE>i8(6jvAEM><a_fS74=?#8f~fc zMKwj`d;J|1_3EI;7_Z(@qyjb8c=H_<^;)1lVZ6^e3cZ5z)7$PStTK(GoNxzt%N>PP zb`-T0@^**30W`6TEyhAeAuC5ky+dh~x|;7D;VA56$Qu>%HbGTbD!od4D&H%1RMfjR z<Shw#w}rghL*5He<1LlGsG%ri<*2Cl<&gK)khd!2tqys+pe9%<=g_c3<$I-$ih2v6 zCK_*%qoQ7G7;aY>u9gOPiKX(eqw>8+92NEY(-d_z-y7g4>J92Li?PO0`QAE5F@7oa zujYFdj*5D>L0xV!wmK@`+vX^GwKDU7<Q}IwiWUI%DPrV%!yOg%MnQejc%vN^^(I1H zVZ2Kn74@b<U1_{&j*5D-psI{_jiaL8=`=g#Dxa4@K82o!y!w#$rI7cPkhdx1Z4P-o zXl#CZhdB!Qg}ebFZ`%cUS#V$M<b^(kopcm^O32$B@`_RasTO0Vqw>8uj$#}}!_rm8 zVUCJ=4?uM{-nSgZ2o$Q&c)xNK<0~2<gCpXe<S4>H_3*<vD(d+Uu6P^U1MF#XXi1~z z61ww4J_Maz=>k)2+COptaXKFVZgG{nB7WV>PpFSk5&rizs(}9*H+5s>j9<2HUNMxc zN;eBbCjq4}vRvJ)e~%g^Nyw^nvv#Gn)lELZ)~368Q=rrayO}?>tVK6@(pkNAv+wmB zXuRwB@27Gblr*fH?OG_y(9OG(|9&cWLHViN1Et#U<~_`Rm8F}vhW~ylo1mmu-Q-v1 z^0EcWPvr$DKb5Ueekzrz)|S@D`dHgWj`guUf>f-aVml$cmUVfl@<^)3+LyW{EBB;g zk<{qCwJ&x_mbaxU+t$7nnUIR@S=$z=NR=0icM%Fwl?8B<BT8WsDmi}C;59AlA|<UB zAocPUKh!P4gZqyUZyRZu-`8s{(>*IAsj}ky5q;u=ISUfcOUCx3$jFEY%-phK=p;1E z(Rswk9ot8@9-T+N-{F2Otp%5?kL^|#GRqxFMUv&ab@SNnk`V=q4^&ph7bGip`-Rt) z>xS|8xT0WrvfT30B^hgLS=8pmqbbDFqoi{8;x0RnO2yhzk&^P=&0Tl2AV>t!@-)fp z*@<wK`BcS_lJNr;9+ldCRSul4yYi^Qw-1xhOLqH`(w&E_eJPL2xfT7Bm2H-nAuUfU zLb76rZdbWG*@IiHFO4WBob_cSWcQO)BFVAT0TtJl?83h*Th<k1$_4pbjtWXftGJYJ zL_soEpnFvol#GuoqBg1aNXw3#q$)JBenhd|Ar@I*+Q%ph+HX8EizEvzVqw4Wg_cRw zr*Q3ys?Frs(Qww6_VuF_jwgB4ClV-Hkg*K)*w|4&NUq=L!en`&G8!xBP(_x}@`8S& zsltK<2ds}3;12t?3)rPO-_Kde_`LWj+}AWs#SC?8?`4yWskA~g%aSWB8PTh$C=gN4 zMF*n5D%MVJx<`i5f}@CivlY?F+u9K_h@`r#-P)x?0~)->)scyU@GY$sm#$d!@MAJ$ ztE9Dm{f2HZdi2`AQ&g0&kftd8aGEu$-}up{v2AO&D%<@wB+GaCa_BdrG#P6R>S$E5 za=RK#Yz>-|EMJYPlvK7YMv!gB+haTgy{2SD(IQ`ft4qcgF6z1?nyXUoDT%c;_f3`W za<#def}pjfvI`;u+4kJ=U-T90W9uZGmPM^z_htB}(kjrlQVd8kwklP=%2yOP{nkFa zH5q$keQb-CShXzL?kzf4Cmf_<wOYQVU-|B2`Q}vRBi$dW+)UAPD~h>eay&+XRQu${ zHtV#k4~5FDTxaG>d0Hi*Pp}q7Ye>bmq{_FfxGl#c)uhrPx!C4p?BP`To|5vm__>x^ zajqDo_P!F|`Gh6ED=T@D%C)4DBZ{pi`{b%5w2?kLzD<c&so4EuyU9vxGWLR#LnuDP zK~cF{-kL18t7(F%-2Uc&S+%}!$D50`Cy_$Trz$tLEZXQTIwTd_+_F7K7s@y0mTym% zZ?qzoBCup^8`3~P+o-_3)@6o3x1og@GL>3%zy4`*l`3zgR>@_Mi`a&Ms@&AFXp{0& zxuNAxImt>cY|4$1<4t6&pUar^F}^Sr+Ysb;6ZxG_oQ?e|w<jw%sxWK(!fZo^$?~nK z$}MDmYsF(G!>}|R)iG7MHCee0CC!bkQ<qY{M}_t~w04WMW1;MaQ*Ku$TTr2G1m43< z!jL_wP|R6!e5o}-?8GSbk1x@3Fw~=~TGmx$nq4(xJFI;VpnY$8Ov90|efR7aD@?|= z%6__5-ZN<Bd)k{dU6p^Ip8cLq#&)I3i%QCSH6Q8Q);97QHo<}&Z=h6u3vV8riuLLj zD>75CJGXq7R0%D}9V>NAj#fiTjqj6N*=hyov*U51I)QS>Ui~VIx<B-jWcl{>v27Cb z`q&Hnr=f237M<WHjq2`B#w>s-r@qyIEVsV-yy_^n9p$8nlfF+?Zf;q$*_5Hxlz|JI zb7O=+OUdB2cgY|Xm|OmW*+O+H9V(kXtB8^$D~o)4)&2TarkK6@l^5kY_1qrh19K4M zC{)iamLo2pp5zGi+}y8xtJxk?&zZDxljP>ya@2FP)N^w`X&7y<)zlM<t9I}XBBtiZ zOtQSlTGtC^t_r9>DQ3I5+IeGI#qC<U*4OcOlMebf;GOhO!#!yV9Z6^yJ9a{WvVx|s zqb@;VS3jmFj!<FgkV@D7y$gxtMoBSM`0Pvl(2+e0Xa#%TL_#z(v})Aaw-|~P=2kE? zC`gs%J-fBvCi*TymA6Sb7}H3qi@I4Sv}b*6msCqpV|(s+^Rev=Z%C?T(H?KHWJPKw zt6e7NT|58SvS?RM_s=b}IE8NHN=q*cMy?nLbvn5+bp>{PMP9`nEidKfKE1Y$u^g6) zl8nlgB`HXa$fI{&kyn-$Kph66dLi8aFpk&?Pi8YT3I#i~OqYzetQ|*F;kHYko<y&i ztZZfQN&Y;v1M8AREedTEkizKY=)~@-vogjT1>v<a8JV<;Xf}!~xhKamAoA%^$+1N( zi*|e6Z>-YoHE?ZB72M1Sz$A0ile#fsM=+K~m8GzD%Aju}hPR}AGor8DXv({>B(`aB zH@M02O%@1?@h*WjW2DGaNk!43gGn9RMZrtP7B1?t^8%VyFxsQ?x3{b<G`Z|%L~Fy9 zUGz&d_Y{qF)C~+;chhQAfaccJq|fh37A@Uzf{aLPy9VhSf<mk_wJOb32eO@k>WaLv zX|=V+s(Tc6o;xy<?^xNZQ?b>k{+bSrEEQV^Z$k!ew{@CiX?x2K<$K2$_(pmaBkEBd zo0heYtmi4T8{IEVGDcB_k$?0YJuJ+PwcXM0>1W%xo-FHWyq>P9<b>B48R#h|h^TJM z#nKgxv@Q9fWChPZgenM<FA4)H`CgWMFPD5-UU*Td6tu_8NWZAVGaKcjH6fq^6HqEv z6x3;9r#8dnF;4d4k;e{2_p<Fp(R;8LMeo&KU@_eToCcO%WL9ZX1*xdnrK_LG?YEZl zcWRS@d!U1bxn+4*ugMK8Q)QdRRE)1Ru%UTqu&iglWaX~)vF)LK+Kqi`HT#5`P+z-3 zdqvyZ?Jem>3-lHrgG!s#qGj${+m>tHHjRPDtL-~~!(bQlrO5!gEo=EQNpuV2^Xws< zZYYu}#eBiUd?~AXI=}ik>=$Z(fUFov(x%Za)E;Y9KwO2h6fy(St~X(|HdCSPLj`{f z^+E^Uj#C)HlWNP;<C2y1;6<qjGXWY%VeN~2>#DP{Jg*jp*Ty0SXL{`-T2|105zQ?~ zi%AE~c!zdUnyly<(4&$Sy(n{6Go7(*>tn6R2D7@2_Mhxw&k{G@Bugh_x-C_-l)<kF z@g~i7D3#H9W-T_@aFJ75$GTMIx{}I`>SP%IVba!>lyAV&={W&2LZG7e5~$a^2HMEO z4Mi#`D_Vph+<<XhV1{sO&}gWctu1SN+Q7Bd3?a>HyBR`k-!|V6TFDrUHE#<HVV)Vn ztulmIxUFW*S4(zfsD^QneC5{Mv4yC7?%FiXSY--?W)OTU29f`{<BKxY;t`&!P>WR^ zR3KHk8s3@=UN~Ue+Oi$fwROh~XBfwIG>mQxVfLWVtN@yy)F`n{7RlMLp2>;<qGclK z31lLzfkaZ6!`)^o6`Bj0V=}u})-#u;CL>BxcBL&jqA%S?JDaA4&1{d3plH3CqiAbq z)4oZsO~c;|3y3oM7PgnBU6ea?$j==;;x3ar*0eo+mpz0_jr3~IN0`0-?<IS*ht9Hx zjqlh2^h!6-Cf|a+OmC^R`J?2NKW!E9;@FT#%WyBQxt|txuW631x}KJ^gN?LlK6|=9 zHM+~PXPDfogzU0x&5{EKui5blu4xDsKLmT*vY^0X?{Tp;P2pP$Keiu}|EUQD-JcpY z;$IBaN;br!t1O@<ktHTNM~zj;VWj27F3lyHQVX)8rwh%Xk-In*-_|nBYgRTioj{E# z13^$dKHDfM(y}!Nrn;ORcUm~?V5H@xF3rP{{rZGW2+Km0?_R$&538-ihD&V{(hU(< z?lh9Tp@6fU(}INa;wNKPTh<m6VCmCJDV4(nTUlOmL|&@QI_oh7Oug+KLV)$x*{u>9 zxo}^*l}>bD-Q?{hcBA#z=^l0>1<O<Kn$pD3?qCvy;hqLXT{mm$CCadIY@Q~h#`3@h zU634Ikea{<1Et=*zI2EchkKOurSN`9tX18xRoPXxHbLmH$;;CbEB9KuR{Id93Yqb$ z$V<|1R4}8$WF^nG1*wWcHJQ?)WLc5rezQx!#I!qk-4>;+?nYvcA4@*$tRQ)_LI$V3 zk~dpGCK%i-4AZs2>|eSj`v$|t8??TH<njT`yIT7$OkT&Q{!MLo>b^zuv9!wdrJAP~ zcYWCaqcmCR3qn_m!>fJ5t0tTdQ;ybtiky97_9fj!6?K(#WMypl*8L&Pd7>@__Ml@L z8u1n$CZ6U?VRV0JY$R7hl07>QLAh-ViB%|US=)_C%$7w3UiX_`AvcUpZWxibJoaYy z@0Gu~?3wP@|IBB0|Ne+BEp3s7eTdWj`{TPz=>EOfn<zzL_osT~G6@mPW9|5|!pC6y zw`01G@FQsC^c}4>ciT!|*=^o@M%QomS!n`@?Yg1-&E=TFUDomJVmz|{7(4z+x6rb# zD6LbtS-IHT5j=8IA4^-c4b`P9p47HPkJS*PeGnPy5Y^7}FnX3;q5YzyC(Dc&TTl{N zJUHz<QZhQSsCOEpsAP2B;vQ*?LgvC3%D}L3glU{hDN+*QsU}RB`8tFb-iKIui@LWn zup)Xa3$HW79$B1z-JhKguak{}4%aauMT(C-7^`V*=;YX-FRCaC=Gc2l<Cp5exERq8 zX#I5>g%)zMewntaf>8TtncuVL61~u9S<tH|H(IG{s(B;)0P}+Y^E(TWx><Kgtx&{Y zzC?_q&%k`&qFZ*jVhnY(bb&?vcuFacFdmlmNiNe~TrE%PKZbj~oyto2tdkcy*2&7Z zinEPKIwT2Z|5s?!E~Pu7D7j2qf307pZMzg==h3MZqBWd0BDGSxi6vKB6bn{jx9h&5 zzYHDuvrD<RSjH@H%Fo{RoZ%KeesF4q(kNM>TQNDlQkZl>m2PsGb{q3UC0DG0Ua?Y~ z<VtN+mRhF&D^`e8vbOtm5BcM0mBlPt@&>bCX<;$!{j9QYV51T%^l}k;@wQ^2rKtad zpL<MI{N`)Pm1-9));he!M?5ZWKjY=DRKTSDxBJOzCRb>4u+%dB57Y2ZnL{+T#Bz(Q zZSG2iO0Lu<V_}AK{Y*$18OBf}{YzFTKx5Y(2U3fwm}NTeH=_UAHpaI+c@BWt^63Fx zcyaJYa<_h2g6k08&h9CrHG5-()rhW^+@dlsGId|>OGxbXdAC@+4cs~G<uLfJm*dtZ zbModlJv&oNEJ}4I;jwzQ2yIAm*>Y~t@}&NI&Hc%X-yfz=1-Lu3Y>y=ERy%qTc;}&h zq*6vTQsf<)m`km&oA*eryp13(V`OE8wtq{l)c<~V>Djk(4U;RiS6phD{+BFMBnB{+ z+_y<HwL+YJer)DctRq)vgC41Ypz=sLd4p(oGmD|ofh)Qa)|0-UF}oWby)Q9KSK|o_ z+wye8*WMlH{`2j(cYK}iQ*xu0RZ2Xv_yi==VokYl@e!);>(qL}d5onx8@y&h>Sq-z z?2V@NQkQ+QYUw%|^0Xdc#TW_7j@9I?)SdX-^M(C?OY2_x<A{xgY(8TT54rv$x(2ND zyesm4!ovl_)9z1=@3QQ<C8wFfXo}q*Aw-PQ2tmV8wX*f4YB}DHT{@NFYGaUGW@C8S znt~+rZ$6v3GYx^vwqb+Hux)KEYc;8}lTkEpdi}R?Z6&eYO*I-T^kAmIMhgF*y*B~R zs=C_0PY6PMf)W%JtwU5$6hS5t!~p_fP{I%rM>K>C5DW=sU{KLu&>ABZTdhN_#TF}7 zY;B8*6*X8CZEcH|T5M6NqQydAQL$2s_50mx?{jkUBo0-1ulIj_Jy)LG>#VcKwbx#I zIQ#5P@0(#ACVj`yth5F8b~%5CdRUZV&W`96EWHkjNfB(<>$bh^@%Dx>rqkKmc^l{6 zOfyq9sjDW1)wNsmPX@3kz6Cah*9PvE{vc23t)3BbIvJ;Hj1!yUas8jO+wK7QH^cSw z2L`;@zJ%f;#^#=6_!^Y-?zZ{Z-Ij;lt}b_8{5L1)MpvKd&9=Xh&Xk`GWu{l+M}i1U zuiWjedgnz~n<siyLvwaqal9r{YPwt5^vd3$?(v$x>`ndD`xxCulNhv|4Cr>IYMv7{ zkTW>F=q=}LCjc8nTz)7o-*dKm??e%==o)>|jnll$j<>WMv_;)RrI*FanNN-Tt$(4- zxUBz$^^t4NMB??Utiyf9>5U`@`>IYbiB8)q141cpyipFsYP@z6loHc;l>+#9ef`=D zzbt?m$9Nyg&BuS@dWNoRcI{36HM_o3v+Fi!y=n_hU;XBGH3Q);{EJRK<jF!L3w6al zztE7Z7b^?$cW%q@+*;mj@07)kIG2YUrI*>I*jxG3EMDk#T1e-%PUp_(Mf{Z-W-uwe zh;4zba#>!j!tT1bi5aytUXmurDwFvdk6bY_62s7(jM_nd3`uRK6P)_w(CkjNM`>{S z(3tjGWO1OL)7?$Y?naF-Z5ZC}t!Je+5}-smG&`e~*|%Mpm(M4v`bS);oMAByp*-YH z<)LC&xJCtn@OOPyQQ&ypLMv1s7jNt=I#!jyQ9fN@>i(mByX&9q;NC-*GM*{b#Q*Nn z#_VpT4OvW7?!GR6=e3NuRQw7wwCAGRTDZ|XpAxR0@zswIY&pryAZ*yuu5Pl{Y|;!% zmfl2Y5E+dg-26-Ey1gx97^Vy`)6&Lzo%-!<&EIrdr@({7IlCs!RJS!2I@6yF=2=9s z1CeN)%7iQ?PD@f+H4@VF=A}Z7Qck;cat)HO%bkP~wGUzbB|6Q_XnKgU+Z|?z*?6<| z1D>sYqt${8vv;lM>k&!)0%k`lG)AjAYvF>7Vf&!WSsI9H@W)7;S*8qb7p@sbM+J^1 zLOZ20-I=qyS4#cn9bz#bfDBpe@m5FOo|(4oFc?l!xQkZn>|U2;jZZ6a+xiz)EBSR< zWY8vXP}$v$S3Q6<P}$v$H?Dv(bscl6nT;%FWCt@4|M&%st=)p60Zph;t94Q2|7>bN z^OSyL)~STagiP1Qtij0h<L8@$xX2exY{ZQJQ2vqrS<^Lf%+N{QYP2+_1Bu(lgic0K zv%in1eoc8et&vv0pleXWy9wfJPt08#yO5Jk^-bkr`JpVk+emp-{xdUXqN*9q&Y6Rt zMh_n|G^<<f{un1j(y9K*@=zngwP?}$ngtmtGH_M`3aTr~Xth8ow7RjpD+T0#;r5l} zkXIa!X+Qo)dUN9ksJ=~O0o;O&)Xq0GvCd_{v(W83-?XM7XQkBx26tnIj_FpzoE>MD z(*O8K1C#uWq50kDP1^j`K`6cx3G)#qu7lkx0R+W7JlWe3=B?A>Y|Y#6h@{J#%KF!u z8uB+WtzEyF6l`XioTk72FHH?LiC+KY8RlSXWA>I_*_+nv>R@l(xAw}}OozeV{2@Fh z{hO?Q(SEMx{kB`LVRPr58gJA>MM{q;x0+LVoksIb%2tO3Li^CPZn$;52E0)FDmiJq z)_hEAU;o;_qgzckDd4sB3swa+bZj^93dYj1p?*zj{a=_x;n7N)Yh2HSbwmDo){@v# z9p1*TAfszO#J(<P{@gOLjA)-8z8{^zrczZemd!Qs?%o!0k(c$@A5EUGweHu7545u5 zfe&6v5~kKrtY!7Vdibj&A>)yrp{!cXUT@{tfUZ;HRhB0fA3keuoa|PS;dZf(v!Ik1 zszI!~dLI8}*cx{(zFLongbH`6tHHxm<I;SkrGF%GgcCwd>W5yf-iY4HF4mb9+YWEM zS*TSCMl{-Ut!y!({xLlbI$zVM2p7w*R>~}%0>LYZhMRR_g~nk*O;9=FG2I4p^1P45 zy6ybXBnE>zyQ1-GdB1M4=xfJ()OfSqUTwEo|8BIvuQQj|PV$cHx286juWdKIbtc|a zl${r8Q5Wxtd*wWbka;cBl*&xzVjX0m(!!cA)~OeIA$_wdm(nS;bQ)oGj@;c~0j-_X zc(Xj`HeM}%p$0PK(QRtZ+AzGexRAq%?nzi(7~Pvgw898`7i`HPU_EJ80gJ$-EPkUo zvIrFHTlwPUub@O9h*w9aGwrrv?mDf@8dF_UHck4Uv%FzUu~~y<4Ouhvny}_*tLKNg zdj7$mTuo0>&$imnf{PZel{tzvqDwF+cI_fjVH>&$+6*2~W<&S&ZrB~Ma8`9tq~ns} z?X0u5X756KKQr}{Or^D+yP2e?eSCWOMSFdU0gtsGGifZ_HoZyV@!Bq_K{%MyAI`6< zeVuZYQ5W-H!_Th4J^Vkys6R(My)!(LyAHw4P|n?Z5p@-H`e^fUJ(PQziWprS#ZZpd z2-U;f-4gM1dWEL0y4rqbM;nz#7r{}zu<`EcSx}D0S=XM|wPVOT9m=_z3FTsYEqeNA zIyBDj5BCnKzd<>787xsh&f+~3%JI%f4^uihqGn^0dzrg*IyWvKM?_RMl=C~1rQ&MU zx&{-W9B&_#$N4xiqUN(8=tOhZeZTPO;E2-Zs?P5+pr5%r<3RUKT8Cf()Tze14$8TE z;vn?cc>jRnGagE-x?A}4a;O2utAo-!e+T=r@+715W#u5Fu7~0yB%UsT8f?@}P(zGb z1C<5UHQ4Jg_k~o~;CQGJ#+yokpJDDwpoSZ-7Rse>5!C7SbP3dHM!k^fzToN_?2mel zG#}$5Y6X<@`*1{^OhG!{iimmzYP9+NA1Dff)PDpu%6Of+hnjc+)Hvf^4Rw~eyAEo& z@xBe^LS6=SragTCYOGN&Lyb3g??>+5q)45Q_af@JV?tiPh`J0a-~4_TD$l6<qo>b7 zxpMnE)H(L_gXrnesI|Vi=^FHga<M%N<wAK0%K5mkXPCYNQD*nF50uOAcc7f#SC0>Z zsTN)u%Iv6q5j6wK`F${=o`SjvA02{UK{;9d8OnvX73xBJx)W-OQThZ#-!^p!Izj1+ zrVhb)D3^~4DChUii1&EJ!?9hmQ5`((&NOphrOXTtI3Pcz;f7KFvvR~Yc3gM+YjgVk zGX-~Fa&r&up~i+vY+cG;M}zzJnO!_BcxRZ7tnX7+eC*S+0?ojt2E$5A3TyiG<@g@v z8I04XxQe3==9DO@;-;o(`myEJ#{%v?SzHVxZgy92&bORLS06j}(cPv3sVSN6Cb;s> zlL{T#ee&o*Lk15-7nBzLjC1k;`?4j*8KjyXy6IEZ9CUkeQ?~G*N*fgRxI@+2UwWp? z+!!T`K!rDs((P)Q+CI5)93`#11?NicmPedEH6`<ExYM;4ztohcDeE~<Z#{Ol)ZSlr zdfY3>w7hZ7Y4`|EyP!{1O;Pu}94V9OMQV!DkP^9ZsbN<`&yns(B0=zi{nx)JoUtyP zj_^JyoWFQq=Emq<p5wyNO-G`y1Dn&#`BA}+793853f|(UygPj!$X$53RF4n`vN@bQ zI7?e_ir~y9L(Oh9p}4dKryfo=32u&SF`PQ%gi`$h96qa#h4V8weOqvzg7ec(@o?6| znTTO+j{P<HqJ3-TyaQ)y3r>4-@C#bG=Ja%iGn<yJ*_TfBTEBmsa}u1Tv}(<6M#0IT zO>>;?<Hq-w{HCIsE@U{S@Dt*kfpT+toO6;mz2h7ycyMT(qoyxNk8=i#^P$DA5>)J} z0cuYbdumX?Ry}MIB4=FEF<s{>7v@HiR|*yVO|*Q@mpF?4+7=u|Ul(z>u`~D1r?NK7 z@Cp|J&%(HFR$S&QEal~JGBV{W<gA3#bYz^<B+k)sjy^kaR~Yh+R-6yv^z9z{A{Qp- zmBx`Y;Fz43$2lhFr4dJQq`S%q6~=WioTeybx#`u)&0ukQgt5!bS#XxN;9MX#w4cp+ zuY@zK1!obQWyT3><qh&>SD2o=TX7zR)6^myo$c1rmu8FA6>X0FA8>|69OTnqDwTm1 zj5MLY%Ke}g9Et4E795%C?X<CxuL07-EfI&CK$EfG@|+H)nMJeb>j77oFP$^j*Fp|; zqaU2Qh~rzUJo(W~U~0;2ku9#V_&B4q#i{qh&ggf>8QSoO6R9dV=Z6!sw9g=?Msw8Y zuwg@n4G9X8kI@pteQ=w6Mpf)d8%KDxeA?=OD?6);Q$Xi%xN>DsP>`E9qF}^~lA?>V zt7rS$$unweiYw<<M9qqG6|%i69pI70S>onOjfQg-vI7?p9RPOaE-2E0298r&R^jiv z>xAR(gZlSB3BP4*A6`&iSuvdrg}lq^nnENM^NJ;j-|9e3%Y;eRZ8ypW`y375J-ec~ z`=9{>2S=%}Q?sgz3M=fnO9^FBR@5p0;|ASFRu#_eK4>6z$T_Z_U0z1)^5Qu~wbR=2 zE^g#~2nB1Y^WN>D<5an0id?e2t1@J2Ijr^!pQ&m#V-I7ED^Soqx1_kXs6;1hRCgbA za=!t=u;vn-%;8lRpIum0JuH-i`fRl|oQtM0xlh>Kl9Ev1Gg=BKSy6)mc1icgiWQ8c zU}w$dSO?0^Z38tROtZ^aMaf)KYFdB-I|``f<6_Roik@qex0a9HY4<T*mT1hquM^S* zwt;nFcpm%Z`a`z8Y7HLPzeS?$yp!@mcCC+RB{~Hq9{%+3@aVWp&LSz$VMlR?VF4yr z*MjgI;V><OQS(-g^eugxT#h|F@ub0nGh<i3ena~8KWX5A{sUr6$bNnM4jMEF>_6ya zfNN@ETuR4az`-e_4`Q^9^|CA89T!8LaSq{Zc_lJ}c$ZucR~;1uI(YQv?#^izFf7Q( zig(NPWE#KYFy`@VSkSjA-p$ps<1zY;xO<S{mM#tSGlPj!BYR_9*O6`{@i+JkD5=9T z`VNaMPR!kHxcP3fJ2$j2V=bpL)%SQe-mB#Uft@(3u%fJ#13QXKW^3ExilX_a9Hs54 zPdj#QS;c_<$7WV=65VOX=7hVz_Bne5BcYKR6phHuJ2sQLQe9SAaoVwi`}FN|Qs0yN zpWNr<L3m@cI8KPGuB;kfRWyUcc8h9is|aV_;6XgAomO5}bXLjyyvmD9@Y=7mXz;WF z(}ooGE9p15WWcmzkIFo8WcH}x`QtctG3%70aweZmTqBRlq=B(h(cgl&Fi4>nX=A*R zEw;j)9Bzd>GW+cQQ*!2KMvvRt3O6>!W23_P)irD+3op2~{efL59JZ^V_Zl4gwEG{4 zA+u-hahVg?FL+kjrR=+#IRcx&cDYqS(cEGUJEJ&lci#UjNw$$>^%Rr;6u0Rvy9Jg9 zBTktz(QnN=%C_chPR-eFYu?G>*1Ttrm@=)bVoFhYpOSecLD8(@p!bC0%-&;<`jScW z8|fXD*?VNc$n32A(Gcg19Y3JI7?c%&skA2r<Fe1r9#@c^n>!)5H9IeN_=s#{_b<rG zA3M%`=MK+3PXS5A3i2n8&K*87`?S9E`kvgcuh=<RBPM6|9yKzvclH=|vdbP*l-ZkB zykBPToRMVi{6Zei{<1lY>qEFF_Uxh=<aku&R~Ysb1z7wQ2YAlF%-+c4{Ibm66_w?c z(<?K3+x#;J_HfAGDOAZ>vumUUpQ1^VN1jzZ<s7;ym2<17%o)_D@077_k7pA6#XL@# zUjA8r+fd(TP5abX+wfUfQ$DLS+M4=5jhg&VnbV(aHzy!(L}u@E1NPet`t+IN{<Qh# zH2Q$roYvWlqCm4lU$T0|lrNfal8t+xpKpV78w{pJkS$bCT-Rtu;ho@w_VEw!1_l{s zAI$;(<fjv;xrZT#hTIgYt2-#IU;+&QySVJ9;X-u9Y3+}b-bHchbS_Tb<fJ)Hfl2S8 zU{hde!|>UKH8a#?un&(rles5x=>c|hNSCmYJPD@mt9(R#{Qb55{$zi@JoY?x^7<;z z7ARjc_;rO|;rV|Kf;uJYRgj5=U^7UF!E2!Az+VT4fp360;G5t@;8t)3xDC7t+z#Fe z{vA}DZ-Z;V9pJCPcfbwcd*CbJPLMEye}L^s(=L!xz=ID#$^Bnoa#@bVy{=HwDod55 z?g>9w$S?T>Zu!x3<>kYulvC(r(GM&ua7Du*$m*r4L~#~fVLXn}Mv1CiNP}IykXlUc zV?0}+G)V3pz*EKGS{?*-3jar-<`VA%RpgXQT|e-CP-*@#m@J2>@Z~p5Y_d-Ok!L3- zou(~6D(6Z3KKMjAlvV!cYAv}a<fHgimX^}#Hsx31GD#)pJ(b!ibLm~AcXH*9Ty9hA zkL0ngP|JtA+n`@4-FIOO^Gv~1ev++5^#l3oLf=fMe+wSK{d!O`eF0Sde-9?hbQ*lg zG`x~!dMOVEB-si1QO+mx8>&iUm+S-w%Z8`OeYTm{%?r`th|6tRZIwMN+3sPs1Lb?F zi@^RXZsmJ#FwgV%Npbn^0v-)-Kadv}L07OpcmOE<I}jWN9t2JV4+E8l!@*>^`2Keb z`x&ou*Wj;DlCH^*WSPmYD$Gh?bxwzPea?Co6Nywsg5Hmx_Kg1&8EI}Pyp#^fNNG92 zGe=YQx~G2DCBQSmOz<o)Iq#u9g;_|pH$TT;-=w_DkHS~n^Foi7ciMn2mizr<xi6}% zDliF%so*6NhS83h0kbO%9TYeXNndP&Is}fcV?t$;E)5gMUrKXw9h#0jl#dyp<WvSK zzKcQStsG32m-xEU99UbMtSh~f<Rw3fCzD@o3whaq|MQvTn5swwQk9k>2m`(g%jb-= zWbj$K!kd^nrLB%X$>1t56RZb6DerQxD_K`AgO}XTi0A#Z7WPAD@x~2^1?m5VF}T~X zRf>r~t&+4rmrfeA3@g8VjphC+Zk2f|*xmDcQ2!M=?XTtYc<>$Wx3-g>b?nmNKsm&` zWj7yHFJ4N>^9RtYd!#elD{HHYN|<hTK6{3)!qew{XKD-+Q}lT<ai*hF+t*cB6wXy7 z<3~&wId=T$f^&wCpPWB_G|M4E7lkt_XU1KeIbqE3ELxq8U0$Jp`EIjH2hh`)b@i-q zp5<DeLxX*~bl6{c(M4Clxi2r7!{P6|u}kaH6|qr&3d>7$exG^?9G%Wq&TSuEty34( zbMUAB&6?JH>R+2@4ePkXBZ+x#5oeVbxFf||9W+YI5<d+$c9JyG=M;AxLo9ho4i!a} z#SE=K^YB=mF8Fzli<P^UN5bj^#Q~@&Le&9|pLTq!JWCr%SWd~T%BuOit#0!m)#M{j z+djZlG1nq2Sv_PWIlM+8*Az}4H=<zdNRvaW^E7oFvywY%?6_={AgxR5LnM``HjZlC zNmNZ#3aSRDthGMnZkX{~pYC?M@mrs+x7+xwPuDw}2r^PypRT9Pk1|qPpAx5+^cg9w zPl+2$-E8aBy>A(R?;9#UI{3pgkL&Qes&9P1^sXKB{fyuGRLJwlb6cl5t~7q@(;Pcv zC^Ax7pT<{h{MM(_{ml5SPnSG^j$1~`gmVXFEWM}yxnmY>9eUK1GSqs8@po<e<&YsC z&Ms;?KBwWQf2iP9%#+4%eL7%QI@fKTYFTOg@;8^Pd-~*o_su+a(Ar)HUDhYC-S#t5 zTAu=VQb&dJRF^Anzvue2Kj)60TYGEM<|l&S7UTc!qwn^+<D~Z{&nUR8;q-RjX3+Ga z@mrrpIhaPUt<xxPH-78WC|@#u>r*EWrh}J}()!fNeB-x1b@JQBZ++_IOU7?~>SQ+> zwzf_cz0CNnPZNCA_^nUzJSAP>v_8G^X5+U$y>f@~Tc0YLN8^n?v^tgZ$Hs4c+NDkc z$Vh2@+U0xHy9YEjW1is)oW{W{@18pMCw5Foaf{hlMowSmV6xbG82>*$u<8HqF)Clx zc~5?}t@%W{c){CD)1EzSMKf=EAcp@p4}*-!-VNWKWWI>S`Cm9E$NITnzU<nX(#6bv zrPl1LKlydf9Xl4yY=8BqO0k&Wt37S(ldVUn%3oeTTE!9N!VzD*j?@$vR!!fN3H*QR zT+=ULW&V5mX!GH#U#YzcYmZJN(;NRiprr9A!UNB~a<d!0$o=X~S!s>EVcj!*2QBld z+7ky!M?&AD=U{)iBZV2PlvVBlg|iZ)z7X{P-obi|?>jSW>u6``iAoP9dR`(}<EixE zsfhP{#QQ_U`%A=oBjUXi@!pSkotPbPab$RkbMBy63``2TF}4?#9vteaL{Jv-W<|V3 z5%1cF7oNV?G00?OpJ}1!96nKr;Ngh(XvA9=@qQigHb=ZI5w9mB`J)J>Bj2Vvic^+6 zl?Wb>cuz*WjS+8C#2dyqzPp8Ty{9;X&QpotwTSm-#M>S55QzEZlqIMh7Rt4r;*=#% zC4zLu=6aeQboLZy5k|b85w9HTSPNy9r_zJfo=OD!GK$yJ^k6?vC4!z2?}Ugq1L`;n zWu>RmgH@hN1RqDdRMscST_Wh_DatqEbw?eTyd<`so=OB&(`+`=&sS@9`;;J)spRtF z%!<mI%t{!UQ+re&i-0ui+0vb!mK59b%$_}pGpEh3DXBg#v%0oOi@r*0%gg5{0)3Yl zes`~(0N9GBCxN}i8$CYTodKy&vi*@A@$YqQZ|d5f=3=Xy@##9BLAt#cJR{9*>$66I z?3~$-Z_e4k#GU@p{IR{h%HJJD(7yRt5N!*+b7t@fzO)?&M^D%%@Y$Vgj{^2bN>fVs zDn7p5O*irCPm^p@F5jm`g4rtJ&G1P#eN1nk=C{m5CqCx>bK9E=xbNa^Ujc2&Fe%Jh zlnEsSb&?F(cZZ2cD0b68wtSh@dXoVcUQ`~<8$BQfKAYv^*k(b6+Z|||744qhHCHFB zWJH3DZKM+43?W|LNH-%n$^H{mc7FVX{TqCCc86!NWbbZkyM^#GTJ0NfHu-3vxJYPg z5hY6@=3ZM+bix<gwd;e~Fs0!q<H<f<lrjIGKRz@tP2Z*?MpPh8`_QzG<p|15>ea!2 zb1G^8_XqInYG2o3;^2+qzh3clwR4G7GdtLqevVheJ(JAvuHe7(dmR)n7U10!@$Q9k z?p8*;KS5>k>kw?=zuJcm!Qc2V&F*0D=`ny%AMoGB)*elBPkG~RD+V|N3d%jz$8atM z6QGp84#9a5?}~`}Ih0GwV-fH7P)C{%ExvW3Y>lXP%=I5_Pdh=mr#+!$_d5jrp=6yq z1gApD!gdJGjNDa0Ilq@jyhRbU0_qs^@leEjJfdEM>S<56N4%X8btrEXTw1zE6prmW znEy1t{?fXbPyT9=0RJERYEg@%v%<_7#+OGU489ea=AUmb`k%izQr{@{JE@=Dm>c_Q zvENApc+u(J-}2Rvxk>)AvEQJ+w(cS3YtTuy0?BdWi>@uK6fL_xkx-}a_b(P;g_oY` zY9EB(z;tyC`>%3vnq&n39H)PH8*$EvIAJ(vMV!#rxe-Th;>*41w0+{&hSR+-b7QpX zwY#El{8x+8uhbOfiHhPcmtyu4^7rP(=w+dkDDOXqGYqeihU6Fo&)R?Y&xNEFSW8;C zk%b5^=SKEnhj-&R9k>fG$6@78Fcq>nF4pJ-OImPvOCMeB>_Y*qoLJw&&5#yu<UCs( zlJCki{>@THJ!s>brF?woLx))R#$s#n^4x!<!^lA&^SCc|SQ1upv3bp*$HN)v(F663 zxY={x7qz*}FHDwO^rtT?;!6QpH4r*r#SULykmcBNF8^$n|6E0$ZB>tg30L@dH%Yhd z0~SJyFYY*TQ2&1V8Y8?u>-!Cy4{@J%G=IOb-z&V%RGD&p(eF33rbSK2%Zpq%A3_gn z<NJ*V;NNwta})k=>-&uozQ3EqJMo9sJ6B`y_etMxT=Q}eT*prr&OY(`jhk?DYqGmG zzTf!1cVhu6Jo15j|NH$$^Edj;Sl3kXMah4^-<VZWQB&R4*DlSA+W-6g1}n5O|FaKs zV$1XY`~61slu!Nqs9DqguYbScY{viU_Z#Z>s;{P>uJ@S7(fCUD@9?{Z9|pb)5MA;k zH%IfkM*}arv@SdRGL?@s$FlstxFm}&k6E3byhuCr<8VLLlxoa5m9Q#nYwQcyPVlsF zTO-NJpzSrKN=Nwp$q6nf8o{7WX*&|s!dymRwpRNX@O|#P^9wKe|Fpb+o#(^9NZt{{ zSDpEHNlSb^ZCiQoO&*nZmS0)k86jBS2Y|_We;jujWk~M2RPK^jSnhv?PF_zdKXP+3 zzn`>NPfMSb)~-q&IV<b<_yxzYYoDM~m(P70D#kVxgXKb1g)DXqS8Jb50{F_=;<XPV zcC=jPFTdMi<>M}Nrp3$JHcd)pFH4+aNw%|NiBdkLSCVD1=Re=h$@Gt4CcKT{u^@X= z)M-Sw2|N>g1)L0S21~)efZE~Ub#NiL1zZHa0VbEpDEPYKWug&KSSD9P4^3L%EkANI zl3#9fnb2EynJ$=SHIQu%_;x#awKslZSGd&q41#gKOs<*=i>-c+eS<SK=2_{G%rrZc z=lO?|N2TouP@!akTH<^pm<b*YYNoh5h>iw5z|+8EK;`FHFj+>Y!q*jQnDjO-qbGTm zthe$bH;Ut@%`$RhEz?^X-_H<EsEToQ3ct+Rk8rCBi_2=OO*>@~rD3vT1x1CkNvr#8 zAY#s}EURF(b9xs|+RFDVK1;4*-vlsb>n8Ffyp#vYSEEPCMi;xEn0(&>CEs_!1Hkvd z!$IbROh^9#D(|dKZ6(jX@O4SYbS2BP65h#4Hc);fPwD>!ZOSvZginTxzko=iwe-UX zJG>O1@~+v3fu8wq@}e|+3`*xxQiD24vmK~(wFi@RM{|F=J}Ix&JUcb1e#wvGIgH;$ z&3SEAzuaaC|8WItGrx*6Ilm|P{PqS_)_p+Lr4vD=tuL6I-;3cZukrlKrs@72e&6AD zQc~H<kKA0yukEtc@Y+f?3>KG3S6h|kfFLz8{Nr%%Z&ZhpKG2d(BDtI!3tDNDTx1^= zgf8~!u{N(0s37+R)kbvzWn1<G)oykLv%mvD<?SFaSzgz||1^2EWq;*I^177Yr|F07 zwejiQpii*BZAgc>)MicP7hXz-WD~c)>{Mm483f8+4gpUBPXW&cnU}6B08azUz|%q1 zfipnmXBe0)Bh9+0KB^3K$zB|Y)Iyz_#Pei(AwSYp&2ZH<*P)pG9fzsRbKgdW21$Xp z)Uf}k>yYGl-(as$`?TW?M%Q&Y<K}!Hc&b`I%fNnD+E>GyeP=<vIbJci9>qgEFD@ys zDYWKM{fStMDMwpi$*LDtOy|QJal)Rg>vY7c!bse`#*a%5H{ey_&!&ZNO@Y+}SKhmv zJNqx0s=Ou6?Vf*rduJ0a0A&*j!Cv4r@D#8Z%mGWlncxht7Mul2e=5LlfR*64z)QfJ z!5Z*Ruok=@oCE$GoC~f3F9(%}h2Y=8tH6JPi@<$J<JF*MTCV~5Hj)i3XrI6a@EGtq zuqSvu*cV(34hNTjBf%TNWIcSH@Ksp)>5?8E8q>oq@J>sz<?<tWZQwVdSr1#;ay8s2 zfNE<PJU)`Nv5nfAq(IU!iZaOL$7WB3(>_xfWT39$$F(n>rCL(PIVDAQzmxk+>IC2B zn1PgP$PV0UKHNX$QF@_>ulM|t6j$v^!K2}ofuq5T!CbHcoCVGX)!tWwbzlvs<jetY z0q25ugO`F2f|r4hf(yWBz&h}Ga3LreUj-(Y8{f=Y8N}^JCT_`=wMkh#PwwN&kKAnK zH{w&uZF*Iu8-7G?@X+!~G7F!6n`|`NDDnd+Ch15mKYb=@^|soovc@Aduw9*(GN?R5 zhqDUjnGup@5U;YlxInzPZCDIn<;10^WmaMxafP_m`_^Zx@*OpurWdNy;UyVLFIb2X zT<)2BQ9hZ_yce;ylKmp<26CSU4h7Re#jo$4b3p2{wHx~W`6BKK)AU8(JwMC6zI*;P z*bP+qvx8`z-qi3ewv`^-4qt*(x$9E>{TdkR!IRKuB-LN}ksIlCc~r*w?%5CU3RtnJ zRUhmTR>iJvt!gm-VpnqUw$&!6ldfu~f-JKc4ZZ}XEzlR!Do&YswiBvo!^%6ut@;@+ z2jwBT9Qf9&PWfWHi@Kx013=m9Zs0KRU{I#vP;e}G1ULcA1l5io4XXX_4yyk4051W1 zf(>9VP%=9KOs<dA(NAs9C-OXbuLJo}d#<<W#ch^@6P3xoFAl>iENplG>6I_(X<LO8 zezvZ{u~G?*rb=b@j4~?}m7bN-j1pRGwXqxFv~0sw36t9J^{^DKtG)47y}E4rEZ6j_ zhAZf*${OuwraGz_2eHaaDyG-Wu;^4rT>^?KtF4B<i-XPl!b|d$PU!8t>W!|M^iL(@ zi@{?+_K2+O4OW4}z*_KJa1K}q&IPA~^FZmsd{F7X47?It0IF@j0$c_z1n&nIfxiN; z244iP0bc{Z4!#98fZM=EFoiTO2C3h{H^A;7`%+q){Y_BsJZ}Q^GU{e9S=Y`<bvrP} zZGXJ)$k>KCuFhdcjab<|8b6Xl2e55jW5&=5U(NLt^W*+~31v&ty`<aEV>eo<rj(-% zHIof#Rx>#Y_0=m?ygj%N`S|ug3fZh!(roE|*zuI^$F<Q<PRP@%M3{+yY{tR#Gt^?I z*K(s?Z?ne6Q!tK_^}SGquS%ktG^?ywpP0*UlV>$|kXQN8e3g({j0gE65;K;JamoMk zR{mGE_TSvhSv%K6s=`b9qPlbvjFp~$2f8R7`Yx!t^nLI|a2c2d{t%R0e*{hhe*zYP z4}i15pMkRBKL>9F9|YAOdI<a;xC*=r`~|oIWFOYLUx1H;&w@{YuYzm9t>Ba3c5p2y zY5oS(dZpij>IeT090+o(QyqP@;6+e2;*Ve>xDmVw{1f;i@Xz2+z)hg?{3`fsa5K08 z{0pd;&#!~;f?L2{;2YpaAm`xL9Yhhl1u`cW{0(GYA=nO%1m6Z#MDK$I;0ItexC^`z z{3qB5{tH|R?gq8PFO7NKQ(y|n{Ath*d>L#HGFKJs4ZaU@R9Gup(bK%Q>>p^H9rh2V zK_~AGB0qA|o!^ZI@Xs#w57;ELpm18XHApS(Lg-4UcMfTwbl>%*+_)>=geeZ`7iwnl z0IHKV&K?6Q?y+F9?Ryx0SAGg#m-;)0fMI?%K@Uo@eexqWsv>RMzQU>^KTuKFZC{_O z<y6&^d9rFxb5?HlBeF$qax*k3Nlm2;NJ|?Q_Kds@Q*~9FH!qez<xO(z1eSaL;pmO> zn+YBb9tj=~9tEBP_5gFhW5E)zCs+X<2P*6nLDk2;;19umpk&t{OfC=Rrh}<G3+0wP zkFlM!CC>%QkL<{EJS%LY-xJQYH<yZH2(OlUm(-?wg|{jtX<4k4#FC&jm@MLjJY8e4 zxHDb%&4c>75{GoarY`7Kv->aBx_P47@r%n!OOyIGYJxQWUG436VSjVbQm3S4p>DXz z5mmY8yq9U#s}6fm7220y9+tLHFEy;8TCzjtY>RY77(#!`SJ<L?^-~<1!ep6)W!x#3 zu_j6SseVg%sjQ`+YA;Upe9GP0k@cYFSFo+N@6{i`Q@MW;#0CT#!SUcrU>^7<a2B`; zoD04JE&yKzuK_oMH-N8!w}P*O(&IP4<=~s(kHNo!E5WVcYVdF1TJZ1SM(}^Y*TJ{J zw?R(8sXLmqzYm@Q{sSBVegLW^|0h@kvKXnZ9Q+qp3;r8i0&=QV-M2wHt#!A8so*lO zJ$OI37pPUU9l%v!8u%!<H<(=CHWQ3gP&%h8dA#>8c&8`Xzs>M8E_#9A*iWf%whMF{ z6E=8@U2W8h@Li(Si^>XKCYJY$Ug5-;{Y}eMH^d~S&|KEQYCWe{1@~+hb2uWAzfYUS zX*G|t8UNBh$?JL-R&WpHA$i;fo&iz@)?fKCsQ4ZLH3s-8SPRk@sMDPFgW$KphroM4 z%F6owkATvrUx1H-tHEc$$HCu$Pk@p={i{~x*`BoZ<XIX&UCH)SdY4?D@+15CG{2c` zlqXwn)lSo{jo$F6N3S@->#MV%pQj5ib1047kDuEHy?H)Y7O3SAawD9W#g&4{<}@pa zIO?CboZW3z?vhb*xeug&B)Odm_6JV~PY2Hc_0D-XI2p_WOTiIfIXDtj`#1``6dVo8 z-mp8q*_$)L?{l96-Up5ce+Eth9|Uv3<a(@rvaWc!t1lGxW9p%k=UwGTZj|QfZIpZ1 zZfZw-UyX7330E7{IBDM1CSKmf`@~ofN`vIu5gh6Hoc2+tbaer(q(SvRx`I8x1HcnN z`o<>jZeX%Ju*J3pJT8xekWMI%<vdUBN661XgiHMj#(j!Bns?1qD#9y_$=&})9fvk# zr{1CRp2@F@4Z5n>r!%x}vLUVuAdVVtaoiqX@gbbvCEUf2D{P*<z3XQTwa1>(zs1;3 z*?QUhMZ;HBj~b322#0v_c+SOXIx^!@JgQ%r$eHPI7mw<oXS9q*g*w`KltKQZ+`)>+ z6ZTO9=ZvS;&YI4st>0-J`l8rEl^yo2E)(ny%0?Xvjsvx)+c{t_umC&(EC&06l3qXX zW^e#_7kD!GQxM&(`z1IOlt_kwns?znNS)foEO2kqM*CeS8H@p$Uk%2By+PXZI%Sdf zZ*}_4B^T8E++?s2%mdZdp9@|I@~rN=;1rN{CAbiz9SJT1-zUEA{KAX5o?sr&q$j#$ z>*McQG$tIJ^d4D$q}mza4b3_pd*?So=Q!lK*DMM>yi{|Vum4EDzl`J0(<FqIMas-p z3+gXe&p?f|c)n+_iSxpB>(+B<^~WFKWa6l_tg4z7?d;zyJ>2Zw={~G;%?*b9ZN)_m z(wkOtsoKP%i)lZZz=WIJD#h!`Ih2R`lU(ZIJm;OezB?;V6mnAwCUa;lDkg7;q&d1& z)2>xAprhBIw|d_-HmRz-+~hf$deZ$;?p2rB$=`x_z~2|uRJpO`67L~4d3wEP#k%F8 z8F1srn3hPts554J)pyl(JMEQJ?K|Mn;GLjM%u;Xw_ybV=re$C*csHo_@`vDM;BruM zyC2kht_Q$Bg6yqU_a^vrP<3M^_yPDZ*p9d#0aZ621rGop2Q$GZz(HUWsI)!_js$-R zO1kU88t{4W8t?^>zFn{Z{5|+0xE*{6)X7wT0=t8M26>ksyaG-EUj=7_o58EW*TJ8F zTfhgwH^7I%H^J2)XBO1`8r%l{8Qc!O3H}}22EGmM2Hyog2HyjdZGz;YmME;PvI$-N z{X3xgodc8l^YSA%zvuT)b!6?*{0x<eb6o6z7Mr7K*~Wz~g;Ga7RsGVo=NP5tG37M7 z3&)&=)`;L%eF4o6gqPBx@{m0%_e{oXbxIq0QI`qQpR#vidEhAS^TBB#{cKw!L0e?= z>gR#i!apCB&RhUK2~Gi(&kMn1+5L>T2l6a#Pvi68v=y!T&hn!^;H6+?vptPuS60nQ zMSLn#P*PD@JAH;pQE`M<SWfQ#%NWX5B@m9H_9KoKHijY!nwhdO>ZwJ2=YD4N)QZcP zIa4ABVK2GZjpo&=*Wkc<L;Y<0z9G))Z^f)KUd1oGBrlb5R~RcivzW4w4C${}|L$T? zGC~Jz9+)w@?O$C9UI~9Tct2PL{v0F~b&r6x;IF|s;BUaW;C666xD&*d)a_5)3qaWe z!m86(WOe+V0oH>BAa$fpmX<zwD;;@;aHJpl=}I0izX30Kd?i1sR=?m^)j~&Ft_8K) z<~!P9_;^XWKBcqx8SS4cAhK#>WK1pjk4MI?{;H0Jm-4By-50#vGaKl)DDR6w+4vj4 zi6HYBHa7kyIGy`%fs~)l3AV8@^BXocz7@O!{%zn7!0&($fb@~-9tQ6OCD-qP$@Ter zDE=zaBYoGE+&}sN8=Bldk{=ZjbLYV~o69QRKhi-}zJH|9!wZkG>&w*Suh8%3={<#Z zBBni`f3{^UeS?;Lswd!NB8irLs%N~rPwrE#$HhD(-m*^>_J`sl{dk}11j<Qz!KHkx zBoJAx7WQs=3nnkcus-Qs?r6bH?r9x{Zd~h1SB7;Aj#YK6r==QL?0uVgbk=W5oYmi2 z#B)81-j|zqy&Q(RU+Ql4X9^>|%S7+Qb*}nZC#~GO3Oi|2n}g|Rp2oHC<m_>t=lPDC zI<D%tg|YREhHlX~yeX!=(tFk2lgK3VQ+9ns|3X#Z-{8?;%3iMDmI@Bwz5}Q_-4V<M z(?Ipx_69En6QKHSoj{e*e&AE!f#AQvZs0z|buf4+cnEkTco@j|EI0xj03HR(K6eMt z1bcu}!DGN_U{A0DJPup{_5$m{6F`;WU~oA&1bhZO1$-483jPB;75p0IeHu6nJOi8o z4hI*4Bf({0HuwlQ3j8fN24szQFc#E%@H4@$fjQvm;CL_>oB&P-bHQ7|$>5zJ=attj z1@pnX!E-_FJA59<JILUCkav#31t9MngA2hoz^Neb27^K{+2)-~eq`@LYb2X@kiS>| z?=F7H{XhAU8^)r^{XaX$uetvhT2dS*U9EZ_>i>l=1d3=b)4PPz|HXEvX$#fVPw5-R z`wdE?^s_5oR`|FZX`hvDbj<W~33vkcybHGVwBH2jKL+0dXMi_>^bPc#Ox<Ge+u$<r z7VtsvHgFAiJNPT`JD~cCcYuEfzYBIG4R?a-KYS0Ao-PF$|4X)YlHvEk<Z}59dXh&N zp#)Vf@xEmv{*wC*@}quH130I-EmGgo%B8KorQ!&$PzT)oSJ<kwD(tWcY3^0};jFUT z%nVJh3bC2nMh8?DR<EC=ATbO3Oq}H=|JCJ`i7Ospo!F#4>RO)G5Js$zx;oApVBJ=& zjfh;iZmW$=GANVqQdvm<j)2kL^Y5jcRXz`ZJwWD*tl#=Ga0K`CP0cQ@1gCP3j@de} zhe32n{bK8{(s#9WxsQSxuRaEL2Ae?X*OOp>a4pC@Qh*JuD+SkqGeFidnB7BX>+ay5 zK5!lVqTn~+GVpicFTwTTM(_pjPv8cScT&M0K;9h%FM<byFM%4z{s}w}d>Nbvz5*ue z^$_x*E9|dIuQ5%5bWir?W`3t7%|XeJ+?>qs`ewb3^|7)_rk7PruAMfKmku^$!sRDi zZM{ZMns}DFN)a>p+13lz0=oX|#8|LOm&!Ok7d;ajtF%^v32-*3{_G`Scd!OL39JQ` zpE+Q%jP4~&#UIwkWSiW9=R=cZBtHk?N97q?QyG&H=eWitqzKx+K2IO8^)y$!lch$y zw+lR+an?JPs<P=b++z5+<Bd36;~Z;JEL??<yh<}{8*G(kG@WGiPGt~Yl7sFgYt;o^ zk0E2p=5g?FunAQ1*dxDg5V#J^0iOXUgU^EJg3p0v;BUZ6@VB7qJv-^y`<LH?Kj3}? zsPzf#t7q?bUjkQi|7UOw_!>x^2)2Olfp38S1m6VJulXC8Ag$X$=B0zT!Jgo|;E5pn z@YS6J{sTM}+yzbm{|V-UAA;wAAAyzNzrkAYV{k5*+QIc}+JlUXf;3QivNxEldw0R_ zOPb>KGv4mVjwJU7<VSX`1iZAle$wuQ>v{F{oZbQ|<nRi$+ueVe*5>mntn#E5!oB|s zYq?4^nh^cuA@2@(<i{nQmYP~S5`93T)pilbb+OghC_=w5L#@<$Sh4quVrgQ;T)E|^ zEp=P9BfKPM>2^05&w1u4sjf{K3LXZJex$998xHp2J_|e*90BHm*`Ts97F5p91Q&p3 zfs4WM;4*LmxC)#E(ryIwOKn|g9=MJBd{FlKY*0FVE+`%5d<^?0<N{FdGp2yj*^5B6 zMbkj_d5XYf-P2r;>TMc7U9x+}fYKDjwUFn-ljb7jM{d+^Eof8s3X6-`amL<=6_l5h zx(`GZP21P!Q6{O5lqr*+H4vdWY_@V*Y$KB;8OJ^-kWckw<<Jrn>XO{GUV-o$+}rqZ zX$Yz{H5xn@^YX!cS)|rX>qj$@k+}M#L@w2@kxRB9kGYhJ%B8q+88^cx5XUhHkxPku zRZgL6;vcER+CkZ;@KPB_FOPz8sOMjf?NPZb08a$300)D0pvHjpU=esVcnNq7co}#t z_zkcDya~Jxlmr%o^q+!nfYQqwK>9Di5^xjvO>if86R7^y&EUS^E#QIRtzdWXHc;98 z4yZoTQg9@A7nlp)4PF5L5G)4o0cU~B!8zcMz{|iD;5Fd=AahZ{Pr%#32SC-+mEbb) zK`>d*m0qbT<ztuhJQFI^^Rw_bEUA5$AGwiCR>-qm{;W;=_IY$kjoYPRL}e{|wV1t) z9EKhu+|%|}hD}vOdhI_#SL?1U^Z6MjxOP_fkxe)FUE_SclH*LQYC1Gd=WBT?577hF z8mYKK4{J^Ho9$TGrm^qhY97Dvk}RdKN?*BW?oV5o3C;O9W;eTmr*MA=I2`;MI08HZ zEC!DRXM#t8RbY2ear6M|z+=IBuqT*Y{;9;Rl2QD+lFR>Go+sNm`N_oX$NcJ}Vr~9r zCR}?lU1zO-9tDWmxlx5><;)|s{IXI7C_@};tiqKvZ53dPf{n^a1t=@nssLpk!vZX; z2n*I))|O3hXde}VTd^SP6q-DYQ?;#YluZpIiG8~j8qDU;Fr^Feahl{RU5Jm<MzcO7 z6L(|4V?owTn@+InqxId#fv3UG0Y`!3!3p35@LVt#yb8<%)ux^eehcJ%uB{nhjAY+o zUH~qG&$~Zc=Xw$NQ|_mN4}*o^BVZBO1Qvsg-GWk3?=6^fvhVcDz~6I!F~}G!r~uV+ zRDyp4d8cUW2wCf0_YdxCz>mOMQ2I0nOxDr%$mCR>#dS2^4^;p0lq4G^Kk5hG$?uM4 z9gU4auu(DVr0~NFn-IIcjCJ~SzsYLe)^PBP>A5BwLKTcEfNIeu|G?DO%^-y8YApBu zES!39=1l(7RgBbrpv^o;pCgvm#<*G(M(Z_SMo)UaBqmXnjr6=TyhWbh58I^j>JO^# zH~{Pp4hByLhkzr&Q$XqYY2Z}wbg&dW1Jpd(a8PY{7I-O`4NCt<f!BefLDhpX;QOHB z2(O6{?fJ#^EZy_e=aZf%&j-kl++^`<Xj9L!=jnKI*Bn|ys3_XL+ERcv8ZSAMjho6p zCZKF@qj>kJ7tb`t<dRbvF<H)P-}XhFdX>u<bLRdjFDjP~U|1g}At&W;GN>@~LD`{m z!T#WRpz?kJm@H4t3rZyMK6EDc5`g5XxRTfP$&cJ<F8rEic}C;6ux%+ZseVSsqK$S# z0#W&XlI*H@HkKck%)J_nOwv2IirrMKGpgz$j%_q4ClYT|59~!nyet+G5OZU?<XDYG zmnb|fYEjG6g{Ni3^UQ??bIrl2fl)<MjMl(}g{QLH%rCqoH_7v07#lqEa%^cPbRDQX zEdnQjtmmjZAG`)E2brU_I>GlgwpRRla4G!7;C<jXz@LIQfIkP9fNBeF1eLdMgTDlC z0iOeJ1z!Pg1Gj;9fSpO(o!}whQc&ZuyTH@HAAovC@<UMl-sPam|3_f5PW2@`U2&aC z<sSK%PN|=hyjO($$c^;&?q;2ewFRz@nl|C)6Rx&uXIttN_45YD0#X`OK1$~ao?k?r zQM!u31HckcX)JA{F0p<mSjjW#t}gY{;_Kx`5>T>jk{@MvfAF?8^F6VUwV4yV3DKm8 zq6jY~wfXw=rtJU7(}SBkj^T;5VeVQtwoxB*WM#n!Ef%7FN4ybsy8P!Yav7QoWR=O! z9Uc&kd^HU-$2yf-*{1+C6XUqe3t`n@H@}KjaI!qkRXJOdnP~{;`dzcE*HWu-q;W@u znI<*cvne$*6tXQV{bP-rWqqFGUa`0?s5q<O$lBNo?-pb51{6vSE0>JW1Kyz}CT`&R z;Xo7eT#9lT?kw3QMXhY1Y)8*_=2S0T7KKg={I{O+e^bb8!~d`Gs&x-sN>WX;Q@2*P zxS7#%t!_3x&R0!yY0PVOXK4&=s!(=ymy5&Ps}8B&PT@{FqwA`seyTdvgFV4TpxVM~ zK=oCw1r_CWphS2BI0sw;UJZT=R3GGK@Y~?G!CS%Gz#oIRgKNP%!1dsr;H%*GK-tr! z;0NFjK=qxMf$d1+JzyGmFL)SuKX@GYV^H%84}b%~2f-}xA#ftN3Y-G|0@S?eqoCeN zKMr0EJ^`wIX#!dM5<Cg2&%GAB8+;1XI^T8RFTiI&sl@NV*TD7QHt+@T-{9}T_Q-Mr zxHtF*Fdcje+#mcCcqsTXD1CVy><4ZE*=Hzt0~`hZ6=Yl!yak>QZUZj?w}W%Rzk{@a z!T*4I7yb_Tb?{w~HZIr+-VVMG(&hvofKPzCz^A}}g1-X)1-=OG2DP^FV^H6k^0K8) z`j`fGLA~|{4+PV}Bfw4|-xCJ=f~SF<LA_J&0!keZ1S>$!tf~7Zcrd7U?1zB2gI@!` z2ObVKfk%K(f=7Ytz#bsq`3A>;de`0)d<8rX+yWjCz6qWHz76&UcY-H^d}kZ<2R{Ni zKew(OdOiqDZf_r>yatlhc)JrHd#&Ml@_t|PqrSX!>E|ulozdm<XV1`X<jfLTYpbBc zixkAJudqc)HvO@Cn{EiZi8qnf*><dx*=c1tzL%41cWC5`OY}NnzFAfE2p8_hXDG^? zanvQ0Sq`Uzns+Jd4p*=Bxn#oB*^}3z%GvW<nal6ssLGt$<Wo2VYcctxq^nQ4oTOJa zCw&X7sid`ebkIEXOPZ0g-imvl*q8DOFO{L}-qA3+dwv%Bp>iDoYK%4#RE9=_$Ae=) z&99ybo(!G^s^2*dRHk#mLU1xT9n1sE!LvbS^n6hBRu_N^!2(eBaVmHRSP0$)7J(0f zCEz-62Dk;}oF|)Om<ev@z8sW3bLx}X$x2XbcB(+Ffv5(L25Z4y;2co>()r*J@KSIX zcsV!*Tmb65K^>^~1`EOD`tm+}_4}kKy3|jL*O$NZJo$a8{7A01gAaaUeTj`A;~mTY z>$N7{HS$}ys3LVGznT30H!70a&{#!MFQ^t)tBRyrqiXBN$)8ZS^x`79Zf%SO8JqZs z)vc+NZFrfEaDN;O>5;BRbV)jJJ*c|17*yR_0;+D^2&!&<3sl{@2~^#>8C2c+4p<1@ z0jh3&7gXK)9;m$k094(&8(awf2wVc*3*HK@05w;3KX^CzWAGmEC!qQyKLdXW{v3Q3 zTnYXbd>DKad<5JDJ`SpGJpt-lq9#y%ktadD>-Z(u2Yd=tALJSEOz>IoT=3VRWc3_4 z4g4LbzQ}s87JLC*0RA4-JC7GZ*69X+1m7Y4gS+V6Psc8gSUu7ZFE4k(S=qS-<HnB9 zK6Ap@@dddP^2d*i+_baPzmnbLjLpl=4UQz7M+qk-+0BUI6Jx>1NvmMwWb&l^;knsN z=XUJ!SaNc*CghG(s<KDr1)1JKi+H?)+_9s_I2RpI56(!+E6A>@DhNk6!>gv(YCC+3 zL@v4}y9mcW2NTJ|Ei+S)H+*!#gz+@Q?olig_Gm<Y*4Poz)Ar3$u%}tsqsNYCFA3*2 zE$L}CGVaQ=S16Bhfje)+&6z8=#rrW5uB)ynoU8ndA2DI%*zuza&KW*_a{l<yoX-@x zD4bC_Gw$Nd31fz5(I)NF<(q`yE~bWjGgn{@U_lXMlxh>|W+J!a-6rIY%^sgOJa6oT z@dbIg`Pq5rP0ThGkP8!g+{MHRlk+Bz$Q?T|kA^p`OE;pDB9&cQg51k$M%7jn*@OMu zgHeS=u?Jtnhm1(*Be&#|S~?2_dGlwNAg#16Q)9vThq)z11@>%E>t|7HNBC#ul{I!8 zi9Jw&nm$r&B~^3Eib_Tl7R@NJ06RCQWNbyvfc}=|Lt-&#*HsH;zh;-&6-AZBWfgiK zo7Ux0=QyjZW>(>B6M&_1sAG?`15FD?NZc0TVR-4~o|#OTVLz*+s)Ep>OziS$wKLBP z##Y*cF8ITnGBK+Epplg|gDk0sxu7O1!;#z%$L&%6feIwIq`IVLqIR~dwy+LtGuZ`v z!;seHuP$<5UhG&=QCMyX@5;keAE>2lWJ$Fv;!2-hSN6^edY#r~hI7sYO5v;$ZM4i1 z?$%t(N6%P3##I&;N5a?=3p}T!rmC!{x`2*DT9-5EJs=DxU@M7%jx%CLVO37yY)iBx z(W8|l%I1}nH%nqbi|3|@%n+t^>Erk&iQ&9fFPdSAQjq;(k0`+5#d8WP*#FL+D{UiO zO6bFv6wb2z9T4*osgz<F5{rFuNqI?;t2+DgNM{QA8iIjI>r&;M<}%fREZI6chr?l` z0)5B{Dz0!Qrz4%x<WHW#47;i3zr0ADe%U0Bg`zk*xHt&8w!B0$K6K%0+3TjtB;2a} z3j*o$`7IJgO~_MawlJkqX)VG;ZNeax|F$cpsn198bXsw$4vukBQLz|Lsh*OY0EFY> zmu(u=?1MVu^;31A4c+3cO<I?p&VyGZE58jcEu%Gjk$zg#D(c(a16Tdc>D(5Hkrcef z&h{1$CB}Ai!*h8Hr)=VHGLu+pTRe$0Mzv~{i_sOdr9*j{=7m)|&C(c&>l_!*<k^K4 z7Pu6v*rz$Ga-Jn)r@PPPbA*yARLiWD)q#uLlPKFIRTi*>)FR^rmh*R<+`KXJf|iB7 zqB#-HWvOFWxCOpin}$8$A{^%q9f)$V(uM5XY1a-^wh)ooxJc#h^6BP?QY=Qns4}b= z=Bdi`Kb7GC^~&qGX+$a7WTNOwMCFx5h2<q>6{VG04~O>C*rs*)dy<g!Y7_xllq!Jv zE{VA%c5ar_KD9je(w`tUpY-O!ksmeCJab|&sXN>Dl#k15I>Vl{E^X+a@u#^E#+6mq zjK><7z*NNQyAyIgxwE3VsD-f1B3D}gdg+BjOcm1&e)y#9?nugR+}x=6f6zk0R(3r+ zE36}kI}?|GOA0Bkiet%2E30Oi=v1XIaW2$(h%#`P6Q`=V1->8mvukGPjnb@XMJgQT zAJV$K?VPbt)`VzfxF{~ws8N(uVtQyz(P|g5(*&Y6=C@<sEjenmhPrqx66v?uz4b{s za}~(4C9OZom%+G7s=K0>DV|$I^Hfk{vTwsuSh$O0DJW<uF4?nv+~d$jt83xf?qB=# zxCSDYnojt7jfdk#6pS5dQEM(FNh?iuZB<Mc_>y>{Q2wk?`K1jTUCdHLiBWnV_U}xw zstUBz_?bF>A=cxflTO1T@v5&&a>9;PftBrx&4Eg{Eq!h2v1^2G#kJFq=KAZaudL=} zt^jjNW>r?rw_;Ty(_4tr_cYO4S@v{%6u7V`FC{x>Hw#QD&x=<cXBy@6UYBrJK-R0e zz;RkwMoWb1b{pksb@sg^oih&#Uz-slEteM)%XRU>8NozZWC>eThKW@rvkR+SpF!Cl z9#6lk{1%CnRWC{A6mm8OFIJ>=Ez8qe3OUSlYMxces~hQpH?P*;M3no$B6UjeMD}5o z95tKAt*f!}q8UUO&Inamj=mmq)7+JpZy(rj+vHtsWt+{HGo({}NfgrNYTxIyF84c5 z*w$Gq*D`CSsv}qct<3qztO_e9va8kV=sJy1rQ*ert5*s>$#|GRS~gzBYLPCd?JcWN zfz{F%S|--YMq>`2;0aY_3~LK($|@_Y7R_;bF^Xd{UHc>Hv|Ywl4uo!Ex1OQ;Bfi-j zSu(A5`k2bfi(M$HKFOBS>3{3?%W|i8TNLNnbY?5*^h?Kmid{=L3gcf`WAe>(Nyy^x zaMKj;PR*90t#%;|*HM%%F;W*DOGNm-lVHW#vN>|8%fOj$GVpFqMofQ3F$yTQiryl* zq{sH0*}<HD3Uo%wlYc$zwuA01Dy=y3_O*vSvVsYtV&gxb^5WT>Z`*v$ynA;Y`O@Nd zSUB^z@#nvO<c+siJiG5tQa8@Z3l6!Tb^gYG^qU=i^5`!v8aQIjt=aqj>H-#+X$~hN zW!Aj?Z|_s^Qp(rH4({3hM=xJ#`+~v0?1+>1K5Jg?B|C1raQemrUZSwr7YY7|Z<b8X zZTQ>U`(Aj&j-wvY+^pW?WTXt~vHUMj&3@?MuN`{Co8^Ztf1B?ajQ{HIzux#{)$K>V zJ@t2gC^&OVSKghFw~Umh-}v{!`l5<yH{XBBM?(syJY;LZ;ZNAs;h1A@zN&h`l#$ih z^U|g<pJncQ&)HOb=q<0Wc;mwpk3ZnFH*aSB3??EY<@%SO{r%ac8#8`;z|7S1vZk>3 z_iW?ev-iE1yj9h>?Y$BAE`Gf1h_5rBX8bizcgX*D)l<uJitpR+XCo(%=G~F;cWwLS zkRcz=E^0bHr{Sl6sF-ixO%i_jn@iR`ee%HjW}Z7}ZLfna>%)B7UW)hbiM=y_{nV(f zlPd?GpMG8aQWo-b5I>mF`@UbMjm;b1uHYAcxNiL-%$V_~J+^4d&_~uDdi_6Md;Zq5 z$1y+ryzvLW^UcDa4*Tm{r&s-WS>BP|zsvWf9Tm=yb=R&bShS&d!oR1FdAG;Dt9f^6 z{HMBHdHX%rr~Ns1{M_1Gn>IheenrOr-ACW;cgIQZO`cJ3S;Oh=zRk<XV_ATak@9io ze!UL(LGJUn{A$;|?`+tccpHqLzt4ex$lW^m;nbx!exq~#I2HnKGyZx1T0A-Dg~JbQ z|Kz#j=hnadBJZg7Ryda&k#|DX*2Y5@4Z8o%ldC@b8v7|2|MXSY6dknomQCmVZuQuE z2b|fPH6q6E^wR~;Z@T^X!N)Znc6s~5_h&K6UyZ+PX!%n)-~abNp7~b4exoj%axUQ~ z6n@jrcQ;gy96NW`J}GaU@xfk2yelyNArH4({o+}-{PD*{4?NrZ&Rgd4PSg0cnV0|l z`QP;&vhPQgdp+^;xNCX$macI69NvBVn5y;nuWS7C69Z;$`#SFcjDPocR;+vRu_5mq zvi{0hCC8m|5br3BpIfl>*`KbMbkU0M59s&U{eKx31j9Nhob}cJD1PR^&R6}b-w!Sr ze%bhEnZGrD-rVPJJnipQ3yzz+&)y4i)A!{&8{@y!^BX_DVe5mh9KHVa1s}hC&RE`+ z@Lqv%R(~|5Fk|(1cH9$8eqiUq1+2X>{`sf%y!f8y4?Oy@cb2UkT{?lz*?ZK}DTMcB zkKgtOA5PK9xHU{^O)2xE&MBoecCKrm8DDu6r8Q-<ID*)P%y#_KnRCf3Eh{gno-(Vf zsH(EMva}|1PFZzrVR>eCO>J>mW#-^1bBah>QF(1~$&~7vVorM70||@e-DWuVKop$% zN|Ri@M?x+yDn^QXAn2G}s+pDCvoXxFZm)~u3n+(esO9DR1-#P@XU1a><gm16x(1tj zAmmu-OfP4?r|JvKj;Ys~vu1z!B=QZ=6m7hO4MCm^*83EFWk#f?|Fqh&^5QR_$k3WZ zmanu%25?VQO_pqzmQ6<*Gnf)6@#RxoS!Azzsxx)8FQTtO@v5g3m(1xuW!C)6=<%l< zjNELs5%hefT4(J6u|(<>5_=$yNKf`eW23i86?-DlzRBDJK}QPX2p7W_vS!7FReQpk zMG35&ts&i>6hXYT|6(F2E-C%O5-h5s8&vuw+LJ=xAb)|R6F2i^VWs{80aVYOO>0(D z+NZ3dTn6|H1ThDL6=pv&Nnee{vei_3!rYeD%wi6%YERhN&<0}5b-el>(EC^n#r8sW z55!T*>omPT*&{(C`@-2}dn9Q3X4ChGv5ACUSX)y$gFBb}FHm2wR%MlYB=ab=Gi2TK z`et@7nKnD~G@xvDrtSx3_R74-81Th#H`VTDFi&wj&Ytusnl`y`P6@9Cr&nk87Js7g z<%nnQeTzKUVY)0qVOi`rW-&yi2NOM&2v$eDriiy2ioq#9_#Vrs^kAH)5?Yt+d8;EH zYjat+As?(hG%8)|4vk7^WuC2AOb-@$DiPcO)!ov<+9{(F!JSY&jQ4#{C4#QZP$=Z| zpqr->!Szr*Ew+uGN)I-9DiMrf&OuK}v!@cl15n4AkKLYPB7ivs@e;vuPo)PdA|Bp@ z<ITr7Pa!o=C4yxUZ+XPq4%N$i3}$vfRC;i#rxL+U5%1QBw+ZS5^U;&}0a59}37$#> z3nSju5pPArdm!R<V*Y?BDrA4Ir_yasLA*rpOvHQ6Q;DE2pZICjTF2mWPo?uIkmDtS zN1^&zTAuJ!BKQ?lU*rAOQ;FausQ$)#*;9#NE7SnvZTD0ncn@lz@jmbrCCEhSiN;&v zDfBAht#0Nq2dQ;+9fS7Fi;GGR^m1QRBDgK$eK+E*k9Zp*-t7JPQqe+L?Wy#j$y15o zW2jRs<Wy!VMJ0lLp@tf7KTjos!=O$z-jSY41U;dsVJbIIp-oVV4Q=uia*24`Bi_6N z_&ySM9fP%=N)Mj#R3hj|MIC0Lq<bn6%!ZPW^q|I5s4KHtSr*DTPobxtN(7BiBh1GQ zo=OC_Lya`vot{brKZ43O-u<3R1dF=4kkf-}J(UQ`4|d<-bqrQ{Dm_^3sYI{~YMh0# z+f(G@5LO%;FWpm#;6SJ|jdzHr5<w5B9OE75sYEakYP|6Vdnyr}0X4yRBRqxXK#eut zYELDCQ<$xEywg3E2o^`Y8zbKOh_@l)-Fg_inh;*cV2h{HgRP#T_8jh>rUwH(l?Y}) z<(iL`o=Oi^c`6aiJHkCp4=(o<vVxjyK1OCb3XAEfL~t$CIXq1duJ=?TxCQEL<9)|d ziQtD&`Nq4~Q;Fa~s6696;;BTi7K&+C!h6P3iQxB8=Na#ho=ODWFttimdT^+x$lKAj z*D=yq=_&H&sYEapBYuJTDE3q$xHaP45%C6N*r(vGW3b3m=#{6iFHjd*D8Ka-_66!f z<Gt)D>Je0d@wR&^5qtnO)p-B%R3d11jN6JQJ?P-6M6d)(DM$})@)TuxthNhOsxJ2w zme5ng7V)-6ykRsgMdssrPo)P-Je3I6Lls*b8$6W=UWF<#-s_%91pfn7YP@$nl?Wyt z=R!^o@;sFY8Y14}h_@=@t&Vu_M7;MS-k~&KN@;qK>8V7}on~n|ypF+aPhm?uMJowa zZa!9eDiJ&Zb+Pe&>8V8UTd0}Fd%;tQ;AN;X<Nd``iC{a_4CC$aR3i8n)GXtD?5RYM zpy{hH-oBnn1P4G>8t-6FC4$XRN_~2;#Z!sksNNy(7*AmjBHrqVH<;#THh$4RPoaOF zN(4J2-mZvO)0aKj%tw=_(u1|0N(3EfBC9Pe2~Uw`s4C+f>?tG;Rb#xKo=OA*plXeG zvZoTkMyN}Sx5-n~qyD@}f`=XQ6n4l{iQv)!?rC~(g{Kn1%80ir;*A_=`&JXm5>HVB zJcY(WU19NV@Dv&gwZM3<dkT$(y4-m0dMXio1a+D5QciMIBIpElsqr#Al?c8DHQ#tg zcq$Pb4>iwteLR&2hCp3uywf~IZw{)?c;h^k2qr@<G~PL$qOBO@a+w|s_7uI0h_@u- z%|1DFSL3NfFn9<jSQ8$);VE>(Q;8ts6!$be=;|q?232o94jt+!YMG}J!8E9AEPbV( zN(7fcU2VKtPth-iT4cOMo}yn2^>yQY%Tx4=p{_OF_dSI*qbs5mP?nye=W!Zu`rvg8 zc6us3*yX82P;<I_njXyaR3dl|>N@k$?F>g@`8|~g&Vg#QI4<xMeXhvecO!RCN4#G} zytH9qc%3{&Sq|q*3XAO~Po)R9dJ36BeZykg;3+f_YO(QN_Y|54b%XKV^%R;2wZwQS zS&m8sX;3#Bual<|!7M1HAU(LmQ;A?p#M>J2){bDmDBN`nGDbRz()Uy%$cOrtg>s&! z62WVcyEh|uIoYA#NuEjsmq$E(jH);i!HQ9C*QSoaE>EQgyFHZ%hK;s;Wl8f$PbGp0 zP&Zo&^fp^mBDe_Z7UNCx6#0d^)p(b9irxs+ZN|IYQ;Fb&F)jt^L0?aiDyZ9WN2)wU zsyvklP8(~x*^;W^o=OBcP<L3!lRQP;I@5*1SjbbfbZ6Plw}gC$r_zI^o=OC-K;31b zyymGy@OP-C#(T$8iC{O>_l&1br>I1b4t1yTI(sS+90K)y;~nm)L~tC`4~*B_Q&<qF zWyTxqsYH;O<5HR)boUgk3)J1XV@yKlR1{+pPhoQ+-jay7D&nn<cxe-OYi^<Bc`7|P z*HetzBHnWmuiHfDgBt27>U6}L7xAV{V%>v<yxdcaL_EcKI@djAJngAOkOy_I`B>_y z^kA8%62Ti#Ket@I<tf@rsGk{cm!}dz>SWum7HM?!R3g|9>H%|ipr;bSkx)M|UJp;v z4}<!#@dkQ|o<7w5#v9?OL@*v|h4FGdl?X0`y3crpo?@H=wbFRAJ(UP9gL=?-S9&TD zTm$ux@vie!BDf3cVdLHHsYLKos7H+Vpr;bSQ&6jn_pGN9!Si`elIg)8Je3Ik8Sy@f zc-`|ucRf9o2#O=#jEMK$h<8`SdoJRwZ|2dt{{?C37<4<&QD}*$uvbuzSxV3I6tO|A zHr@<RC4y?GM~yevQ;FazsK<?Wji(a9jZjY*?`BUWf;*s^jJMQNSP-Z+#(Th1iQw4t z!}Rs?6zzG$J163;jd;&QyxkYr4#nhh%oIm4$Kxr+x=_Ee*lzF?V_m3cjd!P~80$hk zW4!x4MV*HFweePaDiN%Mdd_&i_EaKx0qQr#d(l%^eyHCX?@doJQok@vUyY}bP{dmr z@iH$8-F5dAehb~XiS*1pl?eLund1K1dM8WVdcjboS2&ra?9^6LoC&23h%$RXmfEU} z%pTSM4d;JLKKYH?C#}og{Tx?gcG|?P6j4yWwtYkP?g35p3w8&cZ))Op=yrS1_{N35 zl*`!lnf`D7O#k)UyRK4*4cXfpvUfCO?`+84Mf~*(()hAkbGX5_3rSmJT0_o`#reB( zXU=QP-Vvs>6Ta#f><Vg6Y|Po-n7^Z8QjMN+Q@>{5B%hr$9^^LSuqiL}m)4lmsWE?h zLzl+vUAc|FnYj1><=ot#dw%`euCW|1Nzo%NeW>5wk^a;C=bj_~N?T5+hB4h5^V8O4 zrO5%Tby}$fm6Nv4{M$qGZ4bK=*2g@2dibG1T&S_|PQXiJc1A;1Chi*ZyEaVfZc%k> z7}JwSxju7Y;kZ!nFTvFuj??<4fnj#r6GZ)*yig#`eq4O(lvGRWaF?+Bw5PKyVLT7@ z!@?b>B#fzP$k|O2>Yp4KrNZKi#H;w$4X?3KNor&E?l2{3>#|Km1D>sYqYcf9#b+^f zb1^k$rBSB4!}KGLP}BpOYG0LnCUt5Ni^XpxFyI9oP#(=$bfusWTxPS=o*s6nv_4ko zp^8hM+xwogc)|Kd6q+gOd-qXeENj`F6m>?gNofuF=z-l$Y~O2Ar-u9;UJaupH)L;V z%-^!`N!H#4Bo!&1FlllA_E3PGV0C_IOvcsE)@0&NE+UaxZP?9z>u;&+vF&I@n!lxC zQu~-ARasS795vtwCscrjoL%d(H%tGv?bn#Ux&Ch{4f&hV`1+<yDp~!4&B5iPR1vzQ zQWf$yC<kNOr{?Tv$k{kEWpVxnQn4#c1vSk@&~95Vs@DfEHCToF;7{ar+xL~BoGlHc zt5ajU#xvVfKn+=G4QG<A-L2|ZLH*jkF<G~hEV;B%ndt`fh8XR(8!EQlsjWOZoxLu5 zr%GsD_AUozz@kz~tDo03Sa8q`1v;aQ>>IUJxAki~p?RA~Ugw9hGOli_In46kI9wXr zxOZc1TH~CwhP>bIY8d(3-P_KanS#r(h|;_SYO|DE=^$#kxYIL8*=QAiY6=FdSqQrt z+BG1I?43^sDT<&={gWwpZph%~y8Mi5CuJa?i%3*V9HHtNT7D1p_Hj!?_SPgTsg#Uq z?<+~W)ND$LBHy8`Hs<UanzOs}HH$^(?{3K7YL2N<DB{+k`Matyep{d4+L*I-ab8LW z&$s<`vDr>)lj`hNt8z1?YoQ3bk?w}!Y4r<s1hu^vn^h(LPLl`_54$HKubeHR%F7@& zWOb6`ns(dvR_r-j8^$0GtZ^%oduU7qjUR_LS38^}+uXQ-oIZSpIv^oZnAX@X)MZK% z?Wfgfw{0|jB`w`9=*W#?Zp_&!4`Hsuf+rW<R_S@K?48IaEzGE%ll!)cv2FW7MO(9Z zFG4`@0~_*pughMqG{7!v(s<wz8Hrvf)(%sw_KK{rODs98)g{#{1Ju=;%x&rD*loR@ ze4dtbr#Vi|-`SAA3vQTa41|i>1d-J<<dXC)3m0tBg8l`k%j2Z>sbR6oK5Yymm3?Z= z*_b+pW_Y7gmAxr73vJtkS$>+YZnkAR9WcA*s~UmRChu|qZlAa~XJaTa+FnA~n2L$W z-l%BvH>JvIZkib^&faKx7gpDX?DdV=>su*Ik_`#<MLTJvNtRsBV#Kw@+Uxr5Q?TdD z9ytgn-kv9y2YIcZ*FC63-KE=cMcDP$eb_6jNhg>E>{RxGN`e6vMfRi<fBpRK?K<D| z<hA)~dD_yxtqT{BKguryRcpxEDsi-<D7GC;we#gjX;J8@`CF|hx2QgPnNXCQ8*?_d zF3KGXscRJF<?Wx&el_U)P|mAYKihec_MGueO5>QG_=*~xw26ze*N356>y^JgRgD=U zr?fYuj_K5pvq1$L#vD3sKamWlP!Xb@m>THqVfj+5tB8`6V-{9X@=f6rO1>#Ie|<xK zQ)Bkp)a(rn*=s3to@1iISY*UhA8E@@SK70;xC*xlg=~r(HD))ZX0LC^ZfeX~o0_ws zAx8o6Tz1GOHx|(Qly<1!N|e+wo+#9@$<&eHP{*~Vj%#TJvzwCCao1a#w4ga9lq79m z>BPK}u$RX&OxVjU?By2r3JZIMRDF4J*p}^f+s>3iWVKIqcBXOC3Au6`=E_1@ZUwd6 z3TlNF)C#rP%ailpRtJ~LGbLtj7mp26$&xPZ5|!r2K>G!T^zs<(>XrNNx892?8TKyT zU%Z^GqYJyYp-pM(GRRKGhY@BU+wA{4;Wp,bq3PHSG<3-01^8FXwgEXg%*m*g_3 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%0AQfx}sbC$X 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 bB6&Yrx3xW*PK=PXb)0$K#x#dwOM3qUj?R-7 literal 0 HcmV?d00001 diff --git a/src/WinLibs/freetype-2.3.5/objs/release/BuildLog.htm b/src/WinLibs/freetype-2.3.5/objs/release/BuildLog.htm new file mode 100644 index 0000000000000000000000000000000000000000..f0e008849c4cc9b469523da278c50af4415e0469 GIT binary patch literal 17924 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 bU(*=<g^_e$bQrh)SA-qWFQqWA`|8WTt_QV( literal 0 HcmV?d00001 diff --git a/src/WinLibs/freetype-2.3.5/src/Jamfile b/src/WinLibs/freetype-2.3.5/src/Jamfile new file mode 100644 index 000000000..76ee0f46e --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/src/autofit/Jamfile b/src/WinLibs/freetype-2.3.5/src/autofit/Jamfile new file mode 100644 index 000000000..acee8bf2c --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/autofit/Jamfile @@ -0,0 +1,39 @@ +# FreeType 2 src/autofit Jamfile +# +# 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. + +SubDir FT2_TOP src autofit ; + +{ + local _sources ; + + # define FT2_AUTOFIT2 do enable to 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 ; + + if $(FT2_AUTOFIT2) + { + _sources += aflatin2 ; + } + } + else + { + _sources = autofit ; + } + + Library $(FT2_LIB) : $(_sources).c ; +} + +# end of src/autofit Jamfile diff --git a/src/WinLibs/freetype-2.3.5/src/autofit/afangles.c b/src/WinLibs/freetype-2.3.5/src/autofit/afangles.c new file mode 100644 index 000000000..e2360d157 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/src/autofit/afangles.h b/src/WinLibs/freetype-2.3.5/src/autofit/afangles.h new file mode 100644 index 000000000..f33f9e108 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/src/autofit/afcjk.c b/src/WinLibs/freetype-2.3.5/src/autofit/afcjk.c new file mode 100644 index 000000000..c7ca266da --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/autofit/afcjk.c @@ -0,0 +1,1506 @@ +/***************************************************************************/ +/* */ +/* afcjk.c */ +/* */ +/* Auto-fitter hinting routines for CJK script (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. */ +/* */ +/***************************************************************************/ + + /* + * 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 *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + static 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; + + /* latin's version would suffice */ + af_latin_metrics_init_widths( metrics, face, 0x7530 ); + + 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; + } + } + + + static 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, 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; + } + + + static 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_Int 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 + 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 ); + } + } + } + + + static 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 + { 0x0100, 0xFFFF }, /* why this? */ +#endif + { 0x2E80, 0x2EFF }, /* CJK Radicals Supplement */ + { 0x2F00, 0x2FDF }, /* Kangxi Radicals */ + { 0x3000, 0x303F }, /* CJK Symbols and Punctuation */ + { 0x3040, 0x309F }, /* Hiragana */ + { 0x30A0, 0x30FF }, /* Katakana */ + { 0x3100, 0x312F }, /* Bopomofo */ + { 0x3130, 0x318F }, /* Hangul Compatibility Jamo */ + { 0x31A0, 0x31BF }, /* Bopomofo Extended */ + { 0x31C0, 0x31EF }, /* CJK Strokes */ + { 0x31F0, 0x31FF }, /* Katakana Phonetic Extensions */ + { 0x3200, 0x32FF }, /* Enclosed CJK Letters and Months */ + { 0x3300, 0x33FF }, /* CJK Compatibility */ + { 0x3400, 0x4DBF }, /* CJK Unified Ideographs Extension A */ + { 0x4DC0, 0x4DFF }, /* Yijing Hexagram Symbols */ + { 0x4E00, 0x9FFF }, /* CJK Unified Ideographs */ + { 0xF900, 0xFAFF }, /* CJK Compatibility Ideographs */ + { 0xFE30, 0xFE4F }, /* CJK Compatibility Forms */ + { 0xFF00, 0xFFEF }, /* Halfwidth and Fullwidth Forms */ + { 0x20000, 0x2A6DF }, /* CJK Unified Ideographs Extension B */ + { 0x2F800, 0x2FA1F }, /* CJK Compatibility Ideographs Supplement */ + { 0, 0 } + }; + + + FT_CALLBACK_TABLE_DEF const AF_ScriptClassRec + 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[] = + { + { 0, 0 } + }; + + + FT_CALLBACK_TABLE_DEF const AF_ScriptClassRec + 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/src/WinLibs/freetype-2.3.5/src/autofit/afcjk.h b/src/WinLibs/freetype-2.3.5/src/autofit/afcjk.h new file mode 100644 index 000000000..0de4a5ab7 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/autofit/afcjk.h @@ -0,0 +1,41 @@ +/***************************************************************************/ +/* */ +/* afcjk.h */ +/* */ +/* Auto-fitter hinting routines for CJK script (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 __AFCJK_H__ +#define __AFCJK_H__ + +#include "afhints.h" + + +FT_BEGIN_HEADER + + + /* the CJK-specific script class */ + + FT_CALLBACK_TABLE const AF_ScriptClassRec + af_cjk_script_class; + + +/* */ + +FT_END_HEADER + +#endif /* __AFCJK_H__ */ + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/autofit/afdummy.c b/src/WinLibs/freetype-2.3.5/src/autofit/afdummy.c new file mode 100644 index 000000000..ed96e9641 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/autofit/afdummy.c @@ -0,0 +1,62 @@ +/***************************************************************************/ +/* */ +/* 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; + } + + + FT_CALLBACK_TABLE_DEF const AF_ScriptClassRec + af_dummy_script_class = + { + AF_SCRIPT_NONE, + NULL, + + sizeof( AF_ScriptMetricsRec ), + + (AF_Script_InitMetricsFunc) NULL, + (AF_Script_ScaleMetricsFunc)NULL, + (AF_Script_DoneMetricsFunc) NULL, + + (AF_Script_InitHintsFunc) af_dummy_hints_init, + (AF_Script_ApplyHintsFunc) af_dummy_hints_apply + }; + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/autofit/afdummy.h b/src/WinLibs/freetype-2.3.5/src/autofit/afdummy.h new file mode 100644 index 000000000..2a5faf8f8 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/autofit/afdummy.h @@ -0,0 +1,43 @@ +/***************************************************************************/ +/* */ +/* 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! + */ + + FT_CALLBACK_TABLE const AF_ScriptClassRec + af_dummy_script_class; + +/* */ + +FT_END_HEADER + + +#endif /* __AFDUMMY_H__ */ + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/autofit/aferrors.h b/src/WinLibs/freetype-2.3.5/src/autofit/aferrors.h new file mode 100644 index 000000000..c2ed5fe2a --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/src/autofit/afglobal.c b/src/WinLibs/freetype-2.3.5/src/autofit/afglobal.c new file mode 100644 index 000000000..ad3baa163 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/autofit/afglobal.c @@ -0,0 +1,289 @@ +/***************************************************************************/ +/* */ +/* afglobal.c */ +/* */ +/* Auto-fitter routines to compute global hinting values (body). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#include "afglobal.h" +#include "afdummy.h" +#include "aflatin.h" +#include "afcjk.h" +#include "afindic.h" + +#include "aferrors.h" + +#ifdef FT_OPTION_AUTOFIT2 +#include "aflatin2.h" +#endif + + /* 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 */ + }; + + /* index of default script in `af_script_classes' */ +#define AF_SCRIPT_LIST_DEFAULT 2 + /* indicates an uncovered glyph */ +#define AF_SCRIPT_LIST_NONE 255 + + + /* + * 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_UInt 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; + + + /* 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 Latin as the standard + * 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[ss]; ss++ ) + { + AF_ScriptClass clazz = af_script_classes[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 < 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 < globals->glyph_count && + gscripts[gindex] == AF_SCRIPT_LIST_NONE ) + { + gscripts[gindex] = (FT_Byte)ss; + } + } + } + } + + Exit: + /* + * By default, all uncovered glyphs are set to the latin script. + * XXX: Shouldn't we disable hinting or do something similar? + */ + { + FT_UInt 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[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_UInt script_max = sizeof ( af_script_classes ) / + sizeof ( af_script_classes[0] ); + FT_Error error = AF_Err_Ok; + + + if ( gindex >= globals->glyph_count ) + { + error = AF_Err_Invalid_Argument; + goto Exit; + } + + gidx = script; + if ( gidx == 0 || gidx + 1 >= script_max ) + gidx = globals->glyph_scripts[gindex]; + + clazz = af_script_classes[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; + } + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/autofit/afglobal.h b/src/WinLibs/freetype-2.3.5/src/autofit/afglobal.h new file mode 100644 index 000000000..cf52c0875 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/autofit/afglobal.h @@ -0,0 +1,67 @@ +/***************************************************************************/ +/* */ +/* afglobal.h */ +/* */ +/* Auto-fitter routines to compute global hinting values */ +/* (specification). */ +/* */ +/* Copyright 2003, 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. */ +/* */ +/***************************************************************************/ + + +#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_END_HEADER + +#endif /* __AF_GLOBALS_H__ */ + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/autofit/afhints.c b/src/WinLibs/freetype-2.3.5/src/autofit/afhints.c new file mode 100644 index 000000000..482870686 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/autofit/afhints.c @@ -0,0 +1,1264 @@ +/***************************************************************************/ +/* */ +/* afhints.c */ +/* */ +/* Auto-fitter hinting routines (body). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#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_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_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 <stdio.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 ) + { + memcpy( temp + pos, "round", 5 ); + pos += 5; + } + if ( flags & AF_EDGE_SERIF ) + { + if ( pos > 0 ) + temp[pos++] = ' '; + 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; + + + 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_UInt 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_UInt 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/src/WinLibs/freetype-2.3.5/src/autofit/afhints.h b/src/WinLibs/freetype-2.3.5/src/autofit/afhints.h new file mode 100644 index 000000000..1308d5c4b --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/autofit/afhints.h @@ -0,0 +1,333 @@ +/***************************************************************************/ +/* */ +/* afhints.h */ +/* */ +/* Auto-fitter hinting routines (specification). */ +/* */ +/* Copyright 2003, 2004, 2005, 2006, 2007 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __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_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_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_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_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/src/WinLibs/freetype-2.3.5/src/autofit/afindic.c b/src/WinLibs/freetype-2.3.5/src/autofit/afindic.c new file mode 100644 index 000000000..c6e7522e1 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/autofit/afindic.c @@ -0,0 +1,134 @@ +/***************************************************************************/ +/* */ +/* 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 + { 0x0100, 0xFFFF }, /* why this? */ +#endif + { 0x0900, 0x0DFF}, /* Indic Range */ + { 0, 0 } + }; + + + FT_CALLBACK_TABLE_DEF const AF_ScriptClassRec + 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 } + }; + + + FT_CALLBACK_TABLE_DEF const AF_ScriptClassRec + 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/src/WinLibs/freetype-2.3.5/src/autofit/afindic.h b/src/WinLibs/freetype-2.3.5/src/autofit/afindic.h new file mode 100644 index 000000000..b242b2614 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/autofit/afindic.h @@ -0,0 +1,41 @@ +/***************************************************************************/ +/* */ +/* 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 */ + + FT_CALLBACK_TABLE const AF_ScriptClassRec + af_indic_script_class; + + +/* */ + +FT_END_HEADER + +#endif /* __AFINDIC_H__ */ + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/autofit/aflatin.c b/src/WinLibs/freetype-2.3.5/src/autofit/aflatin.c new file mode 100644 index 000000000..2ae9ec5a1 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/autofit/aflatin.c @@ -0,0 +1,2166 @@ +/***************************************************************************/ +/* */ +/* aflatin.c */ +/* */ +/* Auto-fitter hinting routines for latin script (body). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#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* const af_latin_blue_chars[AF_LATIN_MAX_BLUES] = + { + "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_Int best_point, best_y, best_first, best_last; + FT_Vector* points; + FT_Bool round; + + + 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 flags is used later to adjust the y and x scales + * in order to optimize the pixel grid alignment of the top of small + * letters. + */ + if ( bb == AF_LATIN_BLUE_SMALL_TOP ) + blue->flags |= AF_LATIN_BLUE_ADJUSTMENT; + + AF_LOG(( "-- ref = %ld, shoot = %ld\n", *blue_ref, *blue_shoot )); + } + + return; + } + + + 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 ); + } + + 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, 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_Int delta; + + + dist = ( dist + 22 ) & ~63; + delta = dist - org_dist; + if ( delta < 0 ) + delta = -delta; + + if (delta >= 16) + { + dist = org_dist; + if ( dist < 48 ) + dist = ( dist + 64 ) >> 1; + } + } + else + /* round otherwise to prevent color fringes in LCD mode */ + dist = ( dist + 32 ) & ~63; + } + } + } + + Done_Width: + if ( sign ) + dist = -dist; + + return dist; + } + + + /* align one stem edge relative to the previous stem edge */ + + static void + af_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_Int 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 ) + { + 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[] = + { + { 0x0020, 0x007F }, /* Basic Latin (no control characters) */ + { 0x00A0, 0x00FF }, /* Latin-1 Supplement (no control characters) */ + { 0x0100, 0x017F }, /* Latin Extended-A */ + { 0x0180, 0x024F }, /* Latin Extended-B */ + { 0x0250, 0x02AF }, /* IPA Extensions */ + { 0x02B0, 0x02FF }, /* Spacing Modifier Letters */ + { 0x0300, 0x036F }, /* Combining Diacritical Marks */ + { 0x0370, 0x03FF }, /* Greek and Coptic */ + { 0x0400, 0x04FF }, /* Cyrillic */ + { 0x0500, 0x052F }, /* Cyrillic Supplement */ + { 0x1D00, 0x1D7F }, /* Phonetic Extensions */ + { 0x1D80, 0x1DBF }, /* Phonetic Extensions Supplement */ + { 0x1DC0, 0x1DFF }, /* Combining Diacritical Marks Supplement */ + { 0x1E00, 0x1EFF }, /* Latin Extended Additional */ + { 0x1F00, 0x1FFF }, /* Greek Extended */ + { 0x2000, 0x206F }, /* General Punctuation */ + { 0x2070, 0x209F }, /* Superscripts and Subscripts */ + { 0x20A0, 0x20CF }, /* Currency Symbols */ + { 0x2150, 0x218F }, /* Number Forms */ + { 0x2460, 0x24FF }, /* Enclosed Alphanumerics */ + { 0 , 0 } + }; + + + FT_CALLBACK_TABLE_DEF const AF_ScriptClassRec + af_latin_script_class = + { + AF_SCRIPT_LATIN, + af_latin_uniranges, + + sizeof( AF_LatinMetricsRec ), + + (AF_Script_InitMetricsFunc) af_latin_metrics_init, + (AF_Script_ScaleMetricsFunc)af_latin_metrics_scale, + (AF_Script_DoneMetricsFunc) NULL, + + (AF_Script_InitHintsFunc) af_latin_hints_init, + (AF_Script_ApplyHintsFunc) af_latin_hints_apply + }; + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/autofit/aflatin.h b/src/WinLibs/freetype-2.3.5/src/autofit/aflatin.h new file mode 100644 index 000000000..3251d3783 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/autofit/aflatin.h @@ -0,0 +1,209 @@ +/***************************************************************************/ +/* */ +/* aflatin.h */ +/* */ +/* Auto-fitter hinting routines for latin script (specification). */ +/* */ +/* Copyright 2003, 2004, 2005, 2006, 2007 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __AFLATIN_H__ +#define __AFLATIN_H__ + +#include "afhints.h" + + +FT_BEGIN_HEADER + + + /* the latin-specific script class */ + + FT_CALLBACK_TABLE const AF_ScriptClassRec + 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 ); + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** L A T I N G L Y P H A N A L Y S I S *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + enum + { + AF_LATIN_HINTS_HORZ_SNAP = 1 << 0, /* enable stem width snapping */ + AF_LATIN_HINTS_VERT_SNAP = 1 << 1, /* enable stem height snapping */ + AF_LATIN_HINTS_STEM_ADJUST = 1 << 2, /* enable stem width/height */ + /* adjustment */ + AF_LATIN_HINTS_MONO = 1 << 3 /* indicate monochrome */ + /* rendering */ + }; + + +#define AF_LATIN_HINTS_DO_HORZ_SNAP( h ) \ + AF_HINTS_TEST_OTHER( h, AF_LATIN_HINTS_HORZ_SNAP ) + +#define AF_LATIN_HINTS_DO_VERT_SNAP( h ) \ + AF_HINTS_TEST_OTHER( h, AF_LATIN_HINTS_VERT_SNAP ) + +#define AF_LATIN_HINTS_DO_STEM_ADJUST( h ) \ + AF_HINTS_TEST_OTHER( h, AF_LATIN_HINTS_STEM_ADJUST ) + +#define AF_LATIN_HINTS_DO_MONO( h ) \ + AF_HINTS_TEST_OTHER( h, AF_LATIN_HINTS_MONO ) + + + /* + * This shouldn't normally be exported. However, other scripts might + * like to use this function as-is. + */ + FT_LOCAL( FT_Error ) + af_latin_hints_compute_segments( AF_GlyphHints hints, + AF_Dimension dim ); + + /* + * This shouldn't normally be exported. However, other scripts might + * want to use this function as-is. + */ + FT_LOCAL( void ) + af_latin_hints_link_segments( AF_GlyphHints hints, + AF_Dimension dim ); + + /* + * This shouldn't normally be exported. However, other scripts might + * want to use this function as-is. + */ + FT_LOCAL( FT_Error ) + af_latin_hints_compute_edges( AF_GlyphHints hints, + AF_Dimension dim ); + + FT_LOCAL( FT_Error ) + af_latin_hints_detect_features( AF_GlyphHints hints, + AF_Dimension dim ); + +/* */ + +FT_END_HEADER + +#endif /* __AFLATIN_H__ */ + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/autofit/aflatin2.c b/src/WinLibs/freetype-2.3.5/src/autofit/aflatin2.c new file mode 100644 index 000000000..0b4177414 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/autofit/aflatin2.c @@ -0,0 +1,2286 @@ +/***************************************************************************/ +/* */ +/* aflatin.c */ +/* */ +/* Auto-fitter hinting routines for latin script (body). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#include "aflatin.h" +#include "aflatin2.h" +#include "aferrors.h" + + +#ifdef AF_USE_WARPER +#include "afwarp.h" +#endif + + FT_LOCAL_DEF( FT_Error ) + af_latin2_hints_compute_segments( AF_GlyphHints hints, + AF_Dimension dim ); + + FT_LOCAL_DEF( void ) + af_latin2_hints_link_segments( AF_GlyphHints hints, + AF_Dimension dim ); + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** L A T I N G L O B A L M E T R I C S *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL_DEF( void ) + af_latin2_metrics_init_widths( AF_LatinMetrics metrics, + FT_Face face, + FT_ULong charcode ) + { + /* scan the array of segments in each direction */ + AF_GlyphHintsRec hints[1]; + + + af_glyph_hints_init( hints, face->memory ); + + metrics->axis[AF_DIMENSION_HORZ].width_count = 0; + metrics->axis[AF_DIMENSION_VERT].width_count = 0; + + { + FT_Error error; + FT_UInt glyph_index; + int dim; + AF_LatinMetricsRec dummy[1]; + AF_Scaler scaler = &dummy->root.scaler; + + + glyph_index = FT_Get_Char_Index( face, charcode ); + if ( glyph_index == 0 ) + goto Exit; + + error = FT_Load_Glyph( face, glyph_index, FT_LOAD_NO_SCALE ); + if ( error || face->glyph->outline.n_points <= 0 ) + goto Exit; + + FT_ZERO( dummy ); + + dummy->units_per_em = metrics->units_per_em; + scaler->x_scale = scaler->y_scale = 0x10000L; + scaler->x_delta = scaler->y_delta = 0; + scaler->face = face; + scaler->render_mode = FT_RENDER_MODE_NORMAL; + scaler->flags = 0; + + af_glyph_hints_rescale( hints, (AF_ScriptMetrics)dummy ); + + error = af_glyph_hints_reload( hints, &face->glyph->outline, 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_latin2_hints_compute_segments( hints, + (AF_Dimension)dim ); + if ( error ) + goto Exit; + + af_latin2_hints_link_segments( hints, + (AF_Dimension)dim ); + + seg = axhints->segments; + limit = seg + axhints->num_segments; + + for ( ; seg < limit; seg++ ) + { + link = seg->link; + + /* we only consider stem segments there! */ + if ( link && link->link == seg && link > seg ) + { + FT_Pos dist; + + + dist = seg->pos - link->pos; + if ( dist < 0 ) + dist = -dist; + + if ( num_widths < AF_LATIN_MAX_WIDTHS ) + axis->widths[ num_widths++ ].org = dist; + } + } + + af_sort_widths( num_widths, axis->widths ); + axis->width_count = num_widths; + } + + Exit: + for ( dim = 0; dim < AF_DIMENSION_MAX; dim++ ) + { + AF_LatinAxis axis = &metrics->axis[dim]; + FT_Pos stdw; + + + stdw = ( axis->width_count > 0 ) + ? axis->widths[0].org + : AF_LATIN_CONSTANT( metrics, 50 ); + + /* let's try 20% of the smallest width */ + axis->edge_distance_threshold = stdw / 5; + axis->standard_width = stdw; + axis->extra_light = 0; + } + } + + af_glyph_hints_done( hints ); + } + + + +#define AF_LATIN_MAX_TEST_CHARACTERS 12 + + + static const char* const af_latin2_blue_chars[AF_LATIN_MAX_BLUES] = + { + "THEZOCQS", + "HEZLOCUS", + "fijkdbh", + "xzroesc", + "xzroesc", + "pqgjy" + }; + + + static void + af_latin2_metrics_init_blues( AF_LatinMetrics metrics, + FT_Face face ) + { + FT_Pos flats [AF_LATIN_MAX_TEST_CHARACTERS]; + FT_Pos rounds[AF_LATIN_MAX_TEST_CHARACTERS]; + FT_Int num_flats; + FT_Int num_rounds; + FT_Int bb; + AF_LatinBlue blue; + FT_Error error; + AF_LatinAxis axis = &metrics->axis[AF_DIMENSION_VERT]; + FT_GlyphSlot glyph = face->glyph; + + + /* we compute the blues simply by loading each character from the */ + /* 'af_latin2_blue_chars[blues]' string, then compute its top-most or */ + /* bottom-most points (depending on `AF_IS_TOP_BLUE') */ + + AF_LOG(( "blue zones computation\n" )); + AF_LOG(( "------------------------------------------------\n" )); + + for ( bb = 0; bb < AF_LATIN_BLUE_MAX; bb++ ) + { + const char* p = af_latin2_blue_chars[bb]; + const char* limit = p + AF_LATIN_MAX_TEST_CHARACTERS; + FT_Pos* blue_ref; + FT_Pos* blue_shoot; + + + AF_LOG(( "blue %3d: ", bb )); + + num_flats = 0; + num_rounds = 0; + + for ( ; p < limit && *p; p++ ) + { + FT_UInt glyph_index; + FT_Int best_point, best_y, best_first, best_last; + FT_Vector* points; + FT_Bool round; + + + 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 */ + { + FT_Int start, end, prev, next; + FT_Pos dist; + + + /* now look for the previous and next points that are not on the */ + /* same Y coordinate. Threshold the `closeness'... */ + start = end = best_point; + + do + { + prev = start-1; + if ( prev < best_first ) + prev = best_last; + + dist = points[prev].y - best_y; + if ( dist < -5 || dist > 5 ) + break; + + start = prev; + + } while ( start != best_point ); + + do + { + next = end+1; + if ( next > best_last ) + next = best_first; + + dist = points[next].y - best_y; + if ( dist < -5 || dist > 5 ) + break; + + end = next; + + } while ( end != best_point ); + + /* now, set the `round' flag depending on the segment's kind */ + round = FT_BOOL( + FT_CURVE_TAG( glyph->outline.tags[start] ) != FT_CURVE_TAG_ON || + FT_CURVE_TAG( glyph->outline.tags[ end ] ) != FT_CURVE_TAG_ON ); + + 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 flags is used later to adjust the y and x scales + * in order to optimize the pixel grid alignment of the top of small + * letters. + */ + if ( bb == AF_LATIN_BLUE_SMALL_TOP ) + blue->flags |= AF_LATIN_BLUE_ADJUSTMENT; + + AF_LOG(( "-- ref = %ld, shoot = %ld\n", *blue_ref, *blue_shoot )); + } + + return; + } + + + FT_LOCAL_DEF( FT_Error ) + af_latin2_metrics_init( AF_LatinMetrics metrics, + FT_Face face ) + { + FT_Error error = AF_Err_Ok; + FT_CharMap oldmap = face->charmap; + FT_UInt ee; + + static const FT_Encoding latin_encodings[] = + { + FT_ENCODING_UNICODE, + FT_ENCODING_APPLE_ROMAN, + FT_ENCODING_ADOBE_STANDARD, + FT_ENCODING_ADOBE_LATIN_1, + FT_ENCODING_NONE /* end of list */ + }; + + + metrics->units_per_em = face->units_per_EM; + + /* do we have a latin charmap in there? */ + for ( ee = 0; latin_encodings[ee] != FT_ENCODING_NONE; ee++ ) + { + error = FT_Select_Charmap( face, latin_encodings[ee] ); + if ( !error ) + break; + } + + if ( !error ) + { + /* For now, compute the standard width and height from the `o'. */ + af_latin2_metrics_init_widths( metrics, face, 'o' ); + af_latin2_metrics_init_blues( metrics, face ); + } + + FT_Set_Charmap( face, oldmap ); + return AF_Err_Ok; + } + + + static void + af_latin2_metrics_scale_dim( AF_LatinMetrics metrics, + AF_Scaler scaler, + AF_Dimension dim ) + { + FT_Fixed scale; + FT_Pos delta; + AF_LatinAxis axis; + FT_UInt nn; + + + if ( dim == AF_DIMENSION_HORZ ) + { + scale = scaler->x_scale; + delta = scaler->x_delta; + } + else + { + scale = scaler->y_scale; + delta = scaler->y_delta; + } + + axis = &metrics->axis[dim]; + + if ( axis->org_scale == scale && axis->org_delta == delta ) + return; + + axis->org_scale = scale; + axis->org_delta = delta; + + /* + * correct Y scale to optimize the alignment of the top of small + * letters to the pixel grid + */ + if ( dim == AF_DIMENSION_VERT ) + { + AF_LatinAxis vaxis = &metrics->axis[AF_DIMENSION_VERT]; + AF_LatinBlue blue = NULL; + + + for ( nn = 0; nn < vaxis->blue_count; nn++ ) + { + if ( vaxis->blues[nn].flags & AF_LATIN_BLUE_ADJUSTMENT ) + { + blue = &vaxis->blues[nn]; + break; + } + } + + if ( blue ) + { + FT_Pos scaled = FT_MulFix( blue->shoot.org, scaler->y_scale ); + FT_Pos fitted = ( scaled + 40 ) & ~63; + +#if 1 + if ( scaled != fitted ) { + scale = FT_MulDiv( scale, fitted, scaled ); + AF_LOG(( "== scaled x-top = %.2g fitted = %.2g, scaling = %.4g\n", scaled/64.0, fitted/64.0, (fitted*1.0)/scaled )); + } +#endif + } + } + + axis->scale = scale; + axis->delta = delta; + + if ( dim == AF_DIMENSION_HORZ ) + { + metrics->root.scaler.x_scale = scale; + metrics->root.scaler.x_delta = delta; + } + else + { + metrics->root.scaler.y_scale = scale; + metrics->root.scaler.y_delta = delta; + } + + /* scale the standard widths */ + for ( nn = 0; nn < axis->width_count; nn++ ) + { + AF_Width width = axis->widths + nn; + + + width->cur = FT_MulFix( width->org, scale ); + width->fit = width->cur; + } + + /* an extra-light axis corresponds to a standard width that is */ + /* smaller than 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; + + AF_LOG(( ">> activating blue zone %d: ref.cur=%.2g ref.fit=%.2g shoot.cur=%.2g shoot.fit=%.2g\n", + nn, blue->ref.cur/64.0, blue->ref.fit/64.0, + blue->shoot.cur/64.0, blue->shoot.fit/64.0 )); + + blue->flags |= AF_LATIN_BLUE_ACTIVE; + } + } + } + } + + + FT_LOCAL_DEF( void ) + af_latin2_metrics_scale( AF_LatinMetrics metrics, + AF_Scaler scaler ) + { + metrics->root.scaler.render_mode = scaler->render_mode; + metrics->root.scaler.face = scaler->face; + + af_latin2_metrics_scale_dim( metrics, scaler, AF_DIMENSION_HORZ ); + af_latin2_metrics_scale_dim( metrics, scaler, AF_DIMENSION_VERT ); + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** L A T I N G L Y P H A N A L Y S I S *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + +#define SORT_SEGMENTS + + FT_LOCAL_DEF( FT_Error ) + af_latin2_hints_compute_segments( AF_GlyphHints hints, + AF_Dimension dim ) + { + AF_AxisHints axis = &hints->axis[dim]; + FT_Memory memory = hints->memory; + FT_Error error = AF_Err_Ok; + AF_Segment segment = NULL; + AF_SegmentRec seg0; + AF_Point* contour = hints->contours; + AF_Point* contour_limit = contour + hints->num_contours; + AF_Direction major_dir, segment_dir; + + + FT_ZERO( &seg0 ); + seg0.score = 32000; + seg0.flags = AF_EDGE_NORMAL; + + major_dir = (AF_Direction)FT_ABS( axis->major_dir ); + segment_dir = major_dir; + + axis->num_segments = 0; + + /* set up (u,v) in each point */ + if ( dim == AF_DIMENSION_HORZ ) + { + AF_Point point = hints->points; + AF_Point limit = point + hints->num_points; + + + for ( ; point < limit; point++ ) + { + point->u = point->fx; + point->v = point->fy; + } + } + else + { + AF_Point point = hints->points; + AF_Point limit = point + hints->num_points; + + + for ( ; point < limit; point++ ) + { + point->u = point->fy; + point->v = point->fx; + } + } + + /* do each contour separately */ + for ( ; contour < contour_limit; contour++ ) + { + AF_Point point = contour[0]; + AF_Point start = point; + AF_Point last = point->prev; + + + if ( point == last ) /* skip singletons -- just in case */ + continue; + + /* already on an edge ?, backtrack to find its start */ + if ( FT_ABS( point->in_dir ) == major_dir ) + { + point = point->prev; + + while ( point->in_dir == start->in_dir ) + point = point->prev; + } + else /* otherwise, find first segment start, if any */ + { + while ( FT_ABS( point->out_dir ) != major_dir ) + { + point = point->next; + + if ( point == start ) + goto NextContour; + } + } + + start = point; + + for (;;) + { + AF_Point first; + FT_Pos min_u, min_v, max_u, max_v; + + /* we're at the start of a new segment */ + FT_ASSERT( FT_ABS( point->out_dir ) == major_dir && + point->in_dir != point->out_dir ); + first = point; + + min_u = max_u = point->u; + min_v = max_v = point->v; + + point = point->next; + + while ( point->out_dir == first->out_dir ) + { + point = point->next; + + if ( point->u < min_u ) + min_u = point->u; + + if ( point->u > max_u ) + max_u = point->u; + } + + if ( point->v < min_v ) + min_v = point->v; + + if ( point->v > max_v ) + max_v = point->v; + + /* record new segment */ + error = af_axis_hints_new_segment( axis, memory, &segment ); + if ( error ) + goto Exit; + + segment[0] = seg0; + segment->dir = first->out_dir; + segment->first = first; + segment->last = point; + segment->contour = contour; + segment->pos = (FT_Short)(( min_u + max_u ) >> 1); + segment->min_coord = (FT_Short) min_v; + segment->max_coord = (FT_Short) max_v; + segment->height = (FT_Short)(max_v - min_v); + + /* a segment is round if it doesn't have successive */ + /* on-curve points. */ + { + AF_Point pt = first; + AF_Point last = point; + AF_Flags f0 = (AF_Flags)(pt->flags & AF_FLAG_CONTROL); + AF_Flags f1; + + + segment->flags &= ~AF_EDGE_ROUND; + + for ( ; pt != last; f0 = f1 ) + { + pt = pt->next; + f1 = (AF_Flags)(pt->flags & AF_FLAG_CONTROL); + + if ( !f0 && !f1 ) + break; + + if ( pt == last ) + segment->flags |= AF_EDGE_ROUND; + } + } + + /* this can happen in the case of a degenerate contour + * e.g. a 2-point vertical contour + */ + if ( point == start ) + break; + + /* jump to the start of the next segment, if any */ + while ( FT_ABS(point->out_dir) != major_dir ) + { + point = point->next; + + if ( point == start ) + goto NextContour; + } + } + + NextContour: + ; + } /* contours */ + + /* now slightly increase the height of segments when this makes */ + /* sense -- this is used to better detect and ignore serifs */ + { + AF_Segment segments = axis->segments; + AF_Segment segments_end = segments + axis->num_segments; + + + for ( segment = segments; segment < segments_end; segment++ ) + { + AF_Point first = segment->first; + AF_Point last = segment->last; + AF_Point p; + FT_Pos first_v = first->v; + FT_Pos last_v = last->v; + + + if ( first == last ) + continue; + + if ( first_v < last_v ) + { + p = first->prev; + if ( p->v < first_v ) + segment->height = (FT_Short)( segment->height + + ( ( first_v - p->v ) >> 1 ) ); + + p = last->next; + if ( p->v > last_v ) + segment->height = (FT_Short)( segment->height + + ( ( p->v - last_v ) >> 1 ) ); + } + else + { + p = first->prev; + if ( p->v > first_v ) + segment->height = (FT_Short)( segment->height + + ( ( p->v - first_v ) >> 1 ) ); + + p = last->next; + if ( p->v < last_v ) + segment->height = (FT_Short)( segment->height + + ( ( last_v - p->v ) >> 1 ) ); + } + } + } + +#ifdef AF_SORT_SEGMENTS + /* place all segments with a negative direction to the start + * of the array, used to speed up segment linking later... + */ + { + AF_Segment segments = axis->segments; + FT_UInt count = axis->num_segments; + FT_UInt ii, jj; + + for (ii = 0; ii < count; ii++) + { + if ( segments[ii].dir > 0 ) + { + for (jj = ii+1; jj < count; jj++) + { + if ( segments[jj].dir < 0 ) + { + AF_SegmentRec tmp; + + tmp = segments[ii]; + segments[ii] = segments[jj]; + segments[jj] = tmp; + + break; + } + } + + if ( jj == count ) + break; + } + } + axis->mid_segments = ii; + } +#endif + + Exit: + return error; + } + + + FT_LOCAL_DEF( void ) + af_latin2_hints_link_segments( AF_GlyphHints hints, + AF_Dimension dim ) + { + AF_AxisHints axis = &hints->axis[dim]; + AF_Segment segments = axis->segments; + AF_Segment segment_limit = segments + axis->num_segments; +#ifdef AF_SORT_SEGMENTS + AF_Segment segment_mid = segments + axis->mid_segments; +#endif + FT_Pos len_threshold, len_score; + AF_Segment seg1, seg2; + + + len_threshold = AF_LATIN_CONSTANT( hints->metrics, 8 ); + if ( len_threshold == 0 ) + len_threshold = 1; + + len_score = AF_LATIN_CONSTANT( hints->metrics, 6000 ); + +#ifdef AF_SORT_SEGMENTS + for ( seg1 = segments; seg1 < segment_mid; seg1++ ) + { + if ( seg1->dir != axis->major_dir || seg1->first == seg1->last ) + continue; + + for ( seg2 = segment_mid; seg2 < segment_limit; seg2++ ) +#else + /* now compare each segment to the others */ + for ( seg1 = segments; seg1 < segment_limit; seg1++ ) + { + /* the fake segments are introduced to hint the metrics -- */ + /* we must never link them to anything */ + if ( seg1->dir != axis->major_dir || seg1->first == seg1->last ) + continue; + + for ( seg2 = segments; seg2 < segment_limit; seg2++ ) + if ( seg1->dir + seg2->dir == 0 && seg2->pos > seg1->pos ) +#endif + { + FT_Pos pos1 = seg1->pos; + FT_Pos pos2 = seg2->pos; + FT_Pos dist = pos2 - pos1; + + + if ( dist < 0 ) + continue; + + { + FT_Pos min = seg1->min_coord; + FT_Pos max = seg1->max_coord; + FT_Pos len, score; + + + if ( min < seg2->min_coord ) + min = seg2->min_coord; + + if ( max > seg2->max_coord ) + max = seg2->max_coord; + + len = max - min; + if ( len >= len_threshold ) + { + score = dist + len_score / len; + if ( score < seg1->score ) + { + seg1->score = score; + seg1->link = seg2; + } + + if ( score < seg2->score ) + { + seg2->score = score; + seg2->link = seg1; + } + } + } + } + } + + /* now, compute the `serif' segments */ + for ( seg1 = segments; seg1 < segment_limit; seg1++ ) + { + seg2 = seg1->link; + + if ( seg2 ) + { + if ( seg2->link != seg1 ) + { + seg1->link = 0; + seg1->serif = seg2->link; + } + } + } + } + + + FT_LOCAL_DEF( FT_Error ) + af_latin2_hints_compute_edges( AF_GlyphHints hints, + AF_Dimension dim ) + { + AF_AxisHints axis = &hints->axis[dim]; + FT_Error error = AF_Err_Ok; + FT_Memory memory = hints->memory; + AF_LatinAxis laxis = &((AF_LatinMetrics)hints->metrics)->axis[dim]; + + AF_Segment segments = axis->segments; + AF_Segment segment_limit = segments + axis->num_segments; + AF_Segment seg; + + AF_Direction up_dir; + FT_Fixed scale; + FT_Pos edge_distance_threshold; + FT_Pos segment_length_threshold; + + + axis->num_edges = 0; + + scale = ( dim == AF_DIMENSION_HORZ ) ? hints->x_scale + : hints->y_scale; + + up_dir = ( dim == AF_DIMENSION_HORZ ) ? AF_DIR_UP + : AF_DIR_RIGHT; + + /* + * We want to ignore very small (mostly serif) segments, we do that + * by ignoring those that whose length is less than a given fraction + * of the standard width. If there is no standard width, we ignore + * those that are less than a given size in pixels + * + * also, unlink serif segments that are linked to segments farther + * than 50% of the standard width + */ + if ( dim == AF_DIMENSION_HORZ ) + { + if ( laxis->width_count > 0 ) + segment_length_threshold = (laxis->standard_width * 10 ) >> 4; + else + segment_length_threshold = FT_DivFix( 64, hints->y_scale ); + } + else + segment_length_threshold = 0; + + /*********************************************************************/ + /* */ + /* We will begin by generating a sorted table of edges for the */ + /* current direction. To do so, we simply scan each segment and try */ + /* to find an edge in our table that corresponds to its position. */ + /* */ + /* If no edge is found, we create and insert a new edge in the */ + /* sorted table. Otherwise, we simply add the segment to the edge's */ + /* list which will be processed in the second step to compute the */ + /* edge's properties. */ + /* */ + /* Note that the edges table is sorted along the segment/edge */ + /* position. */ + /* */ + /*********************************************************************/ + + edge_distance_threshold = FT_MulFix( laxis->edge_distance_threshold, + scale ); + if ( edge_distance_threshold > 64 / 4 ) + edge_distance_threshold = 64 / 4; + + edge_distance_threshold = FT_DivFix( edge_distance_threshold, + scale ); + + for ( seg = segments; seg < segment_limit; seg++ ) + { + AF_Edge found = 0; + FT_Int ee; + + + if ( seg->height < segment_length_threshold ) + continue; + + /* A special case for serif edges: If they are smaller than */ + /* 1.5 pixels we ignore them. */ + if ( seg->serif ) + { + FT_Pos dist = seg->serif->pos - seg->pos; + + if (dist < 0) + dist = -dist; + + if (dist >= laxis->standard_width >> 1) + { + /* unlink this serif, it is too distant from its reference stem */ + seg->serif = NULL; + } + else if ( 2*seg->height < 3 * segment_length_threshold ) + continue; + } + + /* look for an edge corresponding to the segment */ + for ( ee = 0; ee < axis->num_edges; ee++ ) + { + AF_Edge edge = axis->edges + ee; + FT_Pos dist; + + + dist = seg->pos - edge->fpos; + if ( dist < 0 ) + dist = -dist; + + if ( dist < edge_distance_threshold && edge->dir == seg->dir ) + { + found = edge; + break; + } + } + + if ( !found ) + { + AF_Edge edge; + + + /* insert a new edge in the list and */ + /* sort according to the position */ + error = af_axis_hints_new_edge( axis, seg->pos, seg->dir, memory, &edge ); + if ( error ) + goto Exit; + + /* add the segment to the new edge's list */ + FT_ZERO( edge ); + + edge->first = seg; + edge->last = seg; + edge->fpos = seg->pos; + edge->dir = seg->dir; + edge->opos = edge->pos = FT_MulFix( seg->pos, scale ); + seg->edge_next = seg; + } + else + { + /* if an edge was found, simply add the segment to the edge's */ + /* list */ + seg->edge_next = found->first; + found->last->edge_next = seg; + found->last = seg; + } + } + + + /*********************************************************************/ + /* */ + /* Good, we will now compute each edge's properties according to */ + /* segments found on its position. Basically, these are: */ + /* */ + /* - edge's main direction */ + /* - stem edge, serif edge or both (which defaults to stem then) */ + /* - rounded edge, straight or both (which defaults to straight) */ + /* - link for edge */ + /* */ + /*********************************************************************/ + + /* first of all, set the `edge' field in each segment -- this is */ + /* required in order to compute edge links */ + + /* + * Note that removing this loop and setting the `edge' field of each + * segment directly in the code above slows down execution speed for + * some reasons on platforms like the Sun. + */ + { + AF_Edge edges = axis->edges; + AF_Edge edge_limit = edges + axis->num_edges; + AF_Edge edge; + + + for ( edge = edges; edge < edge_limit; edge++ ) + { + seg = edge->first; + if ( seg ) + do + { + seg->edge = edge; + seg = seg->edge_next; + + } while ( seg != edge->first ); + } + + /* now, compute each edge properties */ + for ( edge = edges; edge < edge_limit; edge++ ) + { + FT_Int is_round = 0; /* does it contain round segments? */ + FT_Int is_straight = 0; /* does it contain straight segments? */ + 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_latin2_hints_detect_features( AF_GlyphHints hints, + AF_Dimension dim ) + { + FT_Error error; + + + error = af_latin2_hints_compute_segments( hints, dim ); + if ( !error ) + { + af_latin2_hints_link_segments( hints, dim ); + + error = af_latin2_hints_compute_edges( hints, dim ); + } + return error; + } + + + FT_LOCAL_DEF( void ) + af_latin2_hints_compute_blue_edges( AF_GlyphHints hints, + AF_LatinMetrics metrics ) + { + AF_AxisHints axis = &hints->axis[ AF_DIMENSION_VERT ]; + AF_Edge edge = axis->edges; + AF_Edge edge_limit = edge + axis->num_edges; + AF_LatinAxis latin = &metrics->axis[ AF_DIMENSION_VERT ]; + FT_Fixed scale = latin->scale; + FT_Pos best_dist0; /* initial threshold */ + + + /* compute the initial threshold as a fraction of the EM size */ + best_dist0 = FT_MulFix( metrics->units_per_em / 40, scale ); + + if ( best_dist0 > 64 / 2 ) + best_dist0 = 64 / 2; + + /* compute which blue zones are active, i.e. have their scaled */ + /* size < 3/4 pixels */ + + /* for each horizontal edge search the blue zone which is closest */ + for ( ; edge < edge_limit; edge++ ) + { + FT_Int bb; + AF_Width best_blue = NULL; + FT_Pos best_dist = best_dist0; + + for ( bb = 0; bb < AF_LATIN_BLUE_MAX; bb++ ) + { + AF_LatinBlue blue = latin->blues + bb; + FT_Bool is_top_blue, is_major_dir; + + + /* skip inactive blue zones (i.e., those that are too small) */ + if ( !( blue->flags & AF_LATIN_BLUE_ACTIVE ) ) + continue; + + /* if it is a top zone, check for right edges -- if it is a bottom */ + /* zone, check for left edges */ + /* */ + /* of course, that's for TrueType */ + is_top_blue = (FT_Byte)( ( blue->flags & AF_LATIN_BLUE_TOP ) != 0 ); + is_major_dir = FT_BOOL( edge->dir == axis->major_dir ); + + /* if it is a top zone, the edge must be against the major */ + /* direction; if it is a bottom zone, it must be in the major */ + /* direction */ + if ( is_top_blue ^ is_major_dir ) + { + FT_Pos dist; + AF_Width compare; + + + /* if it's a rounded edge, compare it to the overshoot position */ + /* if it's a flat edge, compare it to the reference position */ + if ( edge->flags & AF_EDGE_ROUND ) + compare = &blue->shoot; + else + compare = &blue->ref; + + dist = edge->fpos - compare->org; + if (dist < 0) + dist = -dist; + + dist = FT_MulFix( dist, scale ); + if ( dist < best_dist ) + { + best_dist = dist; + best_blue = compare; + } + +#if 0 + /* now, compare it to the overshoot position if the edge is */ + /* rounded, and if the edge is over the reference position of a */ + /* top zone, or under the reference position of a bottom zone */ + if ( edge->flags & AF_EDGE_ROUND && dist != 0 ) + { + FT_Bool is_under_ref = FT_BOOL( edge->fpos < blue->ref.org ); + + + if ( is_top_blue ^ is_under_ref ) + { + blue = latin->blues + bb; + dist = edge->fpos - blue->shoot.org; + if ( dist < 0 ) + dist = -dist; + + dist = FT_MulFix( dist, scale ); + if ( dist < best_dist ) + { + best_dist = dist; + best_blue = & blue->shoot; + } + } + } +#endif + } + } + + if ( best_blue ) + edge->blue_edge = best_blue; + } + } + + + static FT_Error + af_latin2_hints_init( AF_GlyphHints hints, + AF_LatinMetrics metrics ) + { + FT_Render_Mode mode; + FT_UInt32 scaler_flags, other_flags; + FT_Face face = metrics->root.scaler.face; + + + af_glyph_hints_rescale( hints, (AF_ScriptMetrics)metrics ); + + /* + * correct x_scale and y_scale if needed, since they may have + * been modified `af_latin2_metrics_scale_dim' above + */ + hints->x_scale = metrics->axis[AF_DIMENSION_HORZ].scale; + hints->x_delta = metrics->axis[AF_DIMENSION_HORZ].delta; + hints->y_scale = metrics->axis[AF_DIMENSION_VERT].scale; + hints->y_delta = metrics->axis[AF_DIMENSION_VERT].delta; + + /* compute flags depending on render mode, etc. */ + mode = metrics->root.scaler.render_mode; + +#if 0 /* #ifdef AF_USE_WARPER */ + if ( mode == FT_RENDER_MODE_LCD || mode == FT_RENDER_MODE_LCD_V ) + { + metrics->root.scaler.render_mode = mode = FT_RENDER_MODE_NORMAL; + } +#endif + + scaler_flags = hints->scaler_flags; + other_flags = 0; + + /* + * We snap the width of vertical stems for the monochrome and + * horizontal LCD rendering targets only. + */ + if ( mode == FT_RENDER_MODE_MONO || mode == FT_RENDER_MODE_LCD ) + other_flags |= AF_LATIN_HINTS_HORZ_SNAP; + + /* + * We snap the width of horizontal stems for the monochrome and + * vertical LCD rendering targets only. + */ + if ( mode == FT_RENDER_MODE_MONO || mode == FT_RENDER_MODE_LCD_V ) + other_flags |= AF_LATIN_HINTS_VERT_SNAP; + + /* + * We adjust stems to full pixels only if we don't use the `light' mode. + */ + if ( mode != FT_RENDER_MODE_LIGHT ) + other_flags |= AF_LATIN_HINTS_STEM_ADJUST; + + if ( mode == FT_RENDER_MODE_MONO ) + other_flags |= AF_LATIN_HINTS_MONO; + + /* + * In `light' hinting mode we disable horizontal hinting completely. + * We also do it if the face is italic. + */ + if ( mode == FT_RENDER_MODE_LIGHT || + (face->style_flags & FT_STYLE_FLAG_ITALIC) != 0 ) + scaler_flags |= AF_SCALER_FLAG_NO_HORIZONTAL; + + hints->scaler_flags = scaler_flags; + hints->other_flags = other_flags; + + return 0; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** L A T I N G L Y P H G R I D - F I T T I N G *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* snap a given width in scaled coordinates to one of the */ + /* current standard widths */ + + static FT_Pos + af_latin2_snap_width( AF_Width widths, + FT_Int count, + FT_Pos width ) + { + int n; + FT_Pos best = 64 + 32 + 2; + FT_Pos reference = width; + FT_Pos scaled; + + + for ( n = 0; n < count; n++ ) + { + FT_Pos w; + FT_Pos dist; + + + w = widths[n].cur; + dist = width - w; + if ( dist < 0 ) + dist = -dist; + if ( dist < best ) + { + best = dist; + reference = w; + } + } + + scaled = FT_PIX_ROUND( reference ); + + if ( width >= reference ) + { + if ( width < scaled + 48 ) + width = reference; + } + else + { + if ( width > scaled - 48 ) + width = reference; + } + + return width; + } + + + /* compute the snapped width of a given stem */ + + static FT_Pos + af_latin2_compute_stem_width( AF_GlyphHints hints, + AF_Dimension dim, + FT_Pos width, + AF_Edge_Flags base_flags, + AF_Edge_Flags stem_flags ) + { + AF_LatinMetrics metrics = (AF_LatinMetrics) hints->metrics; + AF_LatinAxis axis = & metrics->axis[dim]; + FT_Pos dist = width; + FT_Int sign = 0; + FT_Int vertical = ( dim == AF_DIMENSION_VERT ); + + + FT_UNUSED(base_flags); + + if ( !AF_LATIN_HINTS_DO_STEM_ADJUST( hints ) || + axis->extra_light ) + return width; + + if ( dist < 0 ) + { + dist = -width; + sign = 1; + } + + if ( ( vertical && !AF_LATIN_HINTS_DO_VERT_SNAP( hints ) ) || + ( !vertical && !AF_LATIN_HINTS_DO_HORZ_SNAP( hints ) ) ) + { + /* smooth hinting process: very lightly quantize the stem width */ + + /* leave the widths of serifs alone */ + + if ( ( stem_flags & AF_EDGE_SERIF ) && vertical && ( dist < 3 * 64 ) ) + goto Done_Width; + +#if 0 + else if ( ( base_flags & AF_EDGE_ROUND ) ) + { + if ( dist < 80 ) + dist = 64; + } + else if ( dist < 56 ) + dist = 56; +#endif + if ( axis->width_count > 0 ) + { + FT_Pos delta; + + + /* compare to standard width */ + if ( axis->width_count > 0 ) + { + delta = dist - axis->widths[0].cur; + + if ( delta < 0 ) + delta = -delta; + + if ( delta < 40 ) + { + dist = axis->widths[0].cur; + if ( dist < 48 ) + dist = 48; + + goto Done_Width; + } + } + + if ( dist < 3 * 64 ) + { + delta = dist & 63; + dist &= -64; + + if ( delta < 10 ) + dist += delta; + + else if ( delta < 32 ) + dist += 10; + + else if ( delta < 54 ) + dist += 54; + + else + dist += delta; + } + else + dist = ( dist + 32 ) & ~63; + } + } + else + { + /* strong hinting process: snap the stem width to integer pixels */ + FT_Pos org_dist = dist; + + + dist = af_latin2_snap_width( axis->widths, axis->width_count, dist ); + + if ( vertical ) + { + /* in the case of vertical hinting, always round */ + /* the stem heights to integer pixels */ + + if ( dist >= 64 ) + dist = ( dist + 16 ) & ~63; + else + dist = 64; + } + else + { + if ( AF_LATIN_HINTS_DO_MONO( hints ) ) + { + /* monochrome horizontal hinting: snap widths to integer pixels */ + /* with a different threshold */ + + if ( dist < 64 ) + dist = 64; + else + dist = ( dist + 32 ) & ~63; + } + else + { + /* for horizontal anti-aliased hinting, we adopt a more subtle */ + /* approach: we strengthen small stems, round stems whose size */ + /* is between 1 and 2 pixels to an integer, otherwise nothing */ + + if ( dist < 48 ) + dist = ( dist + 64 ) >> 1; + + else if ( dist < 128 ) + { + /* We only round to an integer width if the corresponding */ + /* distortion is less than 1/4 pixel. Otherwise this */ + /* makes everything worse since the diagonals, which are */ + /* not hinted, appear a lot bolder or thinner than the */ + /* vertical stems. */ + + FT_Int delta; + + + dist = ( dist + 22 ) & ~63; + delta = dist - org_dist; + if ( delta < 0 ) + delta = -delta; + + if (delta >= 16) + { + dist = org_dist; + if ( dist < 48 ) + dist = ( dist + 64 ) >> 1; + } + } + else + /* round otherwise to prevent color fringes in LCD mode */ + dist = ( dist + 32 ) & ~63; + } + } + } + + Done_Width: + if ( sign ) + dist = -dist; + + return dist; + } + + + /* align one stem edge relative to the previous stem edge */ + + static void + af_latin2_align_linked_edge( AF_GlyphHints hints, + AF_Dimension dim, + AF_Edge base_edge, + AF_Edge stem_edge ) + { + FT_Pos dist = stem_edge->opos - base_edge->opos; + + FT_Pos fitted_width = af_latin2_compute_stem_width( + hints, dim, dist, + (AF_Edge_Flags)base_edge->flags, + (AF_Edge_Flags)stem_edge->flags ); + + + stem_edge->pos = base_edge->pos + fitted_width; + + 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_latin2_align_serif_edge( AF_GlyphHints hints, + AF_Edge base, + AF_Edge serif ) + { + FT_UNUSED( hints ); + + serif->pos = base->pos + (serif->opos - base->opos); + } + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** E D G E H I N T I N G ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + FT_LOCAL_DEF( void ) + af_latin2_hint_edges( AF_GlyphHints hints, + AF_Dimension dim ) + { + AF_AxisHints axis = &hints->axis[dim]; + AF_Edge edges = axis->edges; + AF_Edge edge_limit = edges + axis->num_edges; + FT_Int n_edges; + AF_Edge edge; + AF_Edge anchor = 0; + FT_Int has_serifs = 0; + FT_Pos anchor_drift = 0; + + + + AF_LOG(( "==== hinting %s edges =====\n", dim == AF_DIMENSION_HORZ ? "vertical" : "horizontal" )); + + /* we begin by aligning all stems relative to the blue zone */ + /* if needed -- that's only for horizontal edges */ + + if ( dim == AF_DIMENSION_VERT && AF_HINTS_DO_BLUES( hints ) ) + { + for ( edge = edges; edge < edge_limit; edge++ ) + { + AF_Width blue; + AF_Edge edge1, edge2; + + + if ( edge->flags & AF_EDGE_DONE ) + continue; + + blue = edge->blue_edge; + edge1 = NULL; + edge2 = edge->link; + + if ( blue ) + { + edge1 = edge; + } + else if ( edge2 && edge2->blue_edge ) + { + blue = edge2->blue_edge; + edge1 = edge2; + edge2 = edge; + } + + if ( !edge1 ) + continue; + + 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_latin2_align_linked_edge( hints, dim, edge1, edge2 ); + edge2->flags |= AF_EDGE_DONE; + } + + if ( !anchor ) + { + anchor = edge; + + anchor_drift = (anchor->pos - anchor->opos); + if (edge2) + anchor_drift = (anchor_drift + (edge2->pos - edge2->opos)) >> 1; + } + } + } + + /* now we will align all stem edges, trying to maintain the */ + /* relative order of stems in the glyph */ + for ( edge = edges; edge < edge_limit; edge++ ) + { + AF_Edge edge2; + + + if ( edge->flags & AF_EDGE_DONE ) + continue; + + /* skip all non-stem edges */ + edge2 = edge->link; + if ( !edge2 ) + { + has_serifs++; + continue; + } + + /* now align the stem */ + + /* this should not happen, but it's better to be safe */ + if ( edge2->blue_edge ) + { + AF_LOG(( "ASSERTION FAILED for edge %d\n", edge2-edges )); + + af_latin2_align_linked_edge( hints, dim, edge2, edge ); + edge->flags |= AF_EDGE_DONE; + continue; + } + + if ( !anchor ) + { + FT_Pos org_len, org_center, cur_len; + FT_Pos cur_pos1, error1, error2, u_off, d_off; + + + org_len = edge2->opos - edge->opos; + cur_len = af_latin2_compute_stem_width( + hints, dim, org_len, + (AF_Edge_Flags)edge->flags, + (AF_Edge_Flags)edge2->flags ); + if ( cur_len <= 64 ) + u_off = d_off = 32; + else + { + u_off = 38; + d_off = 26; + } + + if ( cur_len < 96 ) + { + org_center = edge->opos + ( org_len >> 1 ); + + cur_pos1 = FT_PIX_ROUND( org_center ); + + error1 = org_center - ( cur_pos1 - u_off ); + if ( error1 < 0 ) + error1 = -error1; + + error2 = org_center - ( cur_pos1 + d_off ); + if ( error2 < 0 ) + error2 = -error2; + + if ( error1 < error2 ) + cur_pos1 -= u_off; + else + cur_pos1 += d_off; + + edge->pos = cur_pos1 - cur_len / 2; + edge2->pos = edge->pos + cur_len; + } + else + edge->pos = FT_PIX_ROUND( edge->opos ); + + 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_latin2_align_linked_edge( hints, dim, edge, edge2 ); + + edge2->flags |= AF_EDGE_DONE; + + anchor_drift = ( (anchor->pos - anchor->opos) + + (edge2->pos - edge2->opos)) >> 1; + + AF_LOG(( "DRIFT: %.2f\n", anchor_drift/64.0 )); + } + else + { + FT_Pos org_pos, org_len, org_center, cur_center, cur_len; + FT_Pos org_left, org_right; + + + org_pos = edge->opos + anchor_drift; + org_len = edge2->opos - edge->opos; + org_center = org_pos + ( org_len >> 1 ); + + cur_len = af_latin2_compute_stem_width( + hints, dim, org_len, + (AF_Edge_Flags)edge->flags, + (AF_Edge_Flags)edge2->flags ); + + org_left = org_pos + ((org_len - cur_len) >> 1); + org_right = org_pos + ((org_len + cur_len) >> 1); + + AF_LOG(( "ALIGN: left=%.2f right=%.2f ", org_left/64.0, org_right/64.0 )); + cur_center = org_center; + + if ( edge2->flags & AF_EDGE_DONE ) + { + AF_LOG(( "\n" )); + edge->pos = edge2->pos - cur_len; + } + else + { + /* we want to compare several displacement, and choose + * the one that increases fitness while minimizing + * distortion as well + */ + FT_Pos displacements[6], scores[6], org, fit, delta; + FT_UInt count = 0; + + /* note: don't even try to fit tiny stems */ + if ( cur_len < 32 ) + { + AF_LOG(( "tiny stem\n" )); + goto AlignStem; + } + + /* if the span is within a single pixel, don't touch it */ + if ( FT_PIX_FLOOR(org_left) == FT_PIX_CEIL(org_right) ) + { + AF_LOG(( "single pixel stem\n" )); + goto AlignStem; + } + + if (cur_len <= 96) + { + /* we want to avoid the absolute worst case which is + * when the left and right edges of the span each represent + * about 50% of the gray. we'd better want to change this + * to 25/75%, since this is much more pleasant to the eye with + * very acceptable distortion + */ + FT_Pos frac_left = (org_left) & 63; + FT_Pos frac_right = (org_right) & 63; + + if ( frac_left >= 22 && frac_left <= 42 && + frac_right >= 22 && frac_right <= 42 ) + { + org = frac_left; + fit = (org <= 32) ? 16 : 48; + delta = FT_ABS(fit - org); + displacements[count] = fit - org; + scores[count++] = delta; + AF_LOG(( "dispA=%.2f (%d) ", (fit - org)/64.0, delta )); + + org = frac_right; + fit = (org <= 32) ? 16 : 48; + delta = FT_ABS(fit - org); + displacements[count] = fit - org; + scores[count++] = delta; + AF_LOG(( "dispB=%.2f (%d) ", (fit - org)/64.0, delta )); + } + } + + /* snapping the left edge to the grid */ + org = org_left; + fit = FT_PIX_ROUND(org); + delta = FT_ABS(fit - org); + displacements[count] = fit - org; + scores[count++] = delta; + AF_LOG(( "dispC=%.2f (%d) ", (fit - org)/64.0, delta )); + + /* snapping the right edge to the grid */ + org = org_right; + fit = FT_PIX_ROUND(org); + delta = FT_ABS(fit - org); + displacements[count] = fit - org; + scores[count++] = delta; + AF_LOG(( "dispD=%.2f (%d) ", (fit - org)/64.0, delta )); + + /* now find the best displacement */ + { + FT_Pos best_score = scores[0]; + FT_Pos best_disp = displacements[0]; + FT_UInt nn; + + for (nn = 1; nn < count; nn++) + { + if (scores[nn] < best_score) + { + best_score = scores[nn]; + best_disp = displacements[nn]; + } + } + + cur_center = org_center + best_disp; + } + AF_LOG(( "\n" )); + } + + AlignStem: + edge->pos = cur_center - (cur_len >> 1); + edge2->pos = edge->pos + cur_len; + + AF_LOG(( "STEM1: %d (opos=%.2f) to %d (opos=%.2f) " + "snapped to (%.2f) and (%.2f), org_len = %.2f cur_len=%.2f\n", + edge-edges, edge->opos / 64.0, + edge2-edges, edge2->opos / 64.0, + edge->pos / 64.0, edge2->pos / 64.0, + org_len / 64.0, cur_len / 64.0 )); + + edge->flags |= AF_EDGE_DONE; + edge2->flags |= AF_EDGE_DONE; + + if ( edge > edges && edge->pos < edge[-1].pos ) + { + 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. */ +#if 0 + n_edges = edge_limit - edges; + if ( dim == AF_DIMENSION_HORZ && ( n_edges == 6 || n_edges == 12 ) ) + { + AF_Edge edge1, edge2, edge3; + FT_Pos dist1, dist2, span, delta; + + + if ( n_edges == 6 ) + { + edge1 = edges; + edge2 = edges + 2; + edge3 = edges + 4; + } + else + { + edge1 = edges + 1; + edge2 = edges + 5; + edge3 = edges + 9; + } + + dist1 = edge2->opos - edge1->opos; + dist2 = edge3->opos - edge2->opos; + + span = dist1 - dist2; + if ( span < 0 ) + span = -span; + + if ( span < 8 ) + { + delta = edge3->pos - ( 2 * edge2->pos - edge1->pos ); + edge3->pos -= delta; + if ( edge3->link ) + edge3->link->pos -= delta; + + /* move the serifs along with the stem */ + if ( n_edges == 12 ) + { + ( edges + 8 )->pos -= delta; + ( edges + 11 )->pos -= delta; + } + + edge3->flags |= AF_EDGE_DONE; + if ( edge3->link ) + edge3->link->flags |= AF_EDGE_DONE; + } + } +#endif + if ( has_serifs || !anchor ) + { + /* + * now hint the remaining edges (serifs and single) in order + * to complete our processing + */ + for ( edge = edges; edge < edge_limit; edge++ ) + { + FT_Pos delta; + + + if ( edge->flags & AF_EDGE_DONE ) + continue; + + delta = 1000; + + if ( edge->serif ) + { + delta = edge->serif->opos - edge->opos; + if ( delta < 0 ) + delta = -delta; + } + + if ( delta < 64 + 16 ) + { + af_latin2_align_serif_edge( hints, edge->serif, edge ); + 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 ) + { + 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_latin2_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_latin2_hints_detect_features( hints, AF_DIMENSION_HORZ ); + if ( error ) + goto Exit; + } + + if ( AF_HINTS_DO_VERTICAL( hints ) ) + { + error = af_latin2_hints_detect_features( hints, AF_DIMENSION_VERT ); + if ( error ) + goto Exit; + + af_latin2_hints_compute_blue_edges( hints, metrics ); + } + + /* grid-fit the outline */ + for ( dim = 0; dim < AF_DIMENSION_MAX; dim++ ) + { +#ifdef AF_USE_WARPER + if ( ( dim == AF_DIMENSION_HORZ && + metrics->root.scaler.render_mode == FT_RENDER_MODE_LIGHT ) ) + { + AF_WarperRec warper; + FT_Fixed scale; + FT_Pos delta; + + + af_warper_compute( &warper, hints, dim, &scale, &delta ); + af_glyph_hints_scale_dim( hints, dim, scale, delta ); + continue; + } +#endif + + if ( ( dim == AF_DIMENSION_HORZ && AF_HINTS_DO_HORIZONTAL( hints ) ) || + ( dim == AF_DIMENSION_VERT && AF_HINTS_DO_VERTICAL( hints ) ) ) + { + af_latin2_hint_edges( hints, (AF_Dimension)dim ); + af_glyph_hints_align_edge_points( hints, (AF_Dimension)dim ); + af_glyph_hints_align_strong_points( hints, (AF_Dimension)dim ); + af_glyph_hints_align_weak_points( hints, (AF_Dimension)dim ); + } + } + af_glyph_hints_save( hints, outline ); + + Exit: + return error; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** L A T I N S C R I P T C L A S S *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + static const AF_Script_UniRangeRec af_latin2_uniranges[] = + { + { 32, 127 }, /* XXX: TODO: Add new Unicode ranges here! */ + { 160, 255 }, + { 0, 0 } + }; + + + FT_CALLBACK_TABLE_DEF const AF_ScriptClassRec + af_latin2_script_class = + { + AF_SCRIPT_LATIN2, + af_latin2_uniranges, + + sizeof( AF_LatinMetricsRec ), + + (AF_Script_InitMetricsFunc) af_latin2_metrics_init, + (AF_Script_ScaleMetricsFunc)af_latin2_metrics_scale, + (AF_Script_DoneMetricsFunc) NULL, + + (AF_Script_InitHintsFunc) af_latin2_hints_init, + (AF_Script_ApplyHintsFunc) af_latin2_hints_apply + }; + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/autofit/aflatin2.h b/src/WinLibs/freetype-2.3.5/src/autofit/aflatin2.h new file mode 100644 index 000000000..34eda0582 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/autofit/aflatin2.h @@ -0,0 +1,40 @@ +/***************************************************************************/ +/* */ +/* aflatin2.h */ +/* */ +/* Auto-fitter hinting routines for latin script (specification). */ +/* */ +/* Copyright 2003, 2004, 2005, 2006, 2007 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __AFLATIN2_H__ +#define __AFLATIN2_H__ + +#include "afhints.h" + + +FT_BEGIN_HEADER + + + /* the latin-specific script class */ + + FT_CALLBACK_TABLE const AF_ScriptClassRec + af_latin2_script_class; + +/* */ + +FT_END_HEADER + +#endif /* __AFLATIN_H__ */ + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/autofit/afloader.c b/src/WinLibs/freetype-2.3.5/src/autofit/afloader.c new file mode 100644 index 000000000..4e4373a49 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/autofit/afloader.c @@ -0,0 +1,530 @@ +/***************************************************************************/ +/* */ +/* afloader.c */ +/* */ +/* Auto-fitter glyph loading routines (body). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#include "afloader.h" +#include "afhints.h" +#include "afglobal.h" +#include "aflatin.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 */ + 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 */ +#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 ) ) + { + /* non-spacing glyphs must stay as-is */ + if ( slot->metrics.horiAdvance ) + slot->metrics.horiAdvance = loader->pp2.x - loader->pp1.x; + } + else + { + 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; + } +#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; + + error = metrics->clazz->script_hints_init( &loader->hints, metrics ); + if ( error ) + goto Exit; + + error = af_loader_load_g( loader, &scaler, gindex, load_flags, 0 ); + } + } + Exit: + return error; + } + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/autofit/afloader.h b/src/WinLibs/freetype-2.3.5/src/autofit/afloader.h new file mode 100644 index 000000000..fa67c10ff --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/src/autofit/afmodule.c b/src/WinLibs/freetype-2.3.5/src/autofit/afmodule.c new file mode 100644 index 000000000..cd5e1cc21 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/autofit/afmodule.c @@ -0,0 +1,97 @@ +/***************************************************************************/ +/* */ +/* 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" + +#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_CALLBACK_TABLE_DEF + const FT_AutoHinter_ServiceRec af_autofitter_service = + { + NULL, + NULL, + NULL, + (FT_AutoHinter_GlyphLoadFunc)af_autofitter_load_glyph + }; + + + FT_CALLBACK_TABLE_DEF + const FT_Module_Class 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_autofitter_service, + + (FT_Module_Constructor)af_autofitter_init, + (FT_Module_Destructor) af_autofitter_done, + (FT_Module_Requester) NULL + }; + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/autofit/afmodule.h b/src/WinLibs/freetype-2.3.5/src/autofit/afmodule.h new file mode 100644 index 000000000..36268a089 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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_MODULE_H + + +FT_BEGIN_HEADER + + FT_CALLBACK_TABLE + const FT_Module_Class autofit_module_class; + + +FT_END_HEADER + +#endif /* __AFMODULE_H__ */ + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/autofit/aftypes.h b/src/WinLibs/freetype-2.3.5/src/autofit/aftypes.h new file mode 100644 index 000000000..bd3fa8823 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/autofit/aftypes.h @@ -0,0 +1,349 @@ +/***************************************************************************/ +/* */ +/* aftypes.h */ +/* */ +/* Auto-fitter types (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. */ +/* */ +/***************************************************************************/ + + + /************************************************************************* + * + * 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 <stdio.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_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_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; + + } 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; + + 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_UInt 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; + + +/* */ + +FT_END_HEADER + +#endif /* __AFTYPES_H__ */ + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/autofit/afwarp.c b/src/WinLibs/freetype-2.3.5/src/autofit/afwarp.c new file mode 100644 index 000000000..f5bb9b18a --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/src/autofit/afwarp.h b/src/WinLibs/freetype-2.3.5/src/autofit/afwarp.h new file mode 100644 index 000000000..7343fdd5e --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/src/autofit/autofit.c b/src/WinLibs/freetype-2.3.5/src/autofit/autofit.c new file mode 100644 index 000000000..2fe66a990 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/autofit/autofit.c @@ -0,0 +1,40 @@ +/***************************************************************************/ +/* */ +/* autofit.c */ +/* */ +/* Auto-fitter module (body). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#define FT_MAKE_OPTION_SINGLE_OBJECT +#include <ft2build.h> +#include "afangles.c" +#include "afglobal.c" +#include "afhints.c" + +#include "afdummy.c" +#include "aflatin.c" +#ifdef FT_OPTION_AUTOFIT2 +#include "aflatin2.c" +#endif +#include "afcjk.c" +#include "afindic.c" + +#include "afloader.c" +#include "afmodule.c" + +#ifdef AF_USE_WARPER +#include "afwarp.c" +#endif + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/autofit/module.mk b/src/WinLibs/freetype-2.3.5/src/autofit/module.mk new file mode 100644 index 000000000..4a386ce66 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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)autofit_module_class$(CLOSE_DRIVER) +$(ECHO_DRIVER)autofit $(ECHO_DRIVER_DESC)automatic hinting module$(ECHO_DRIVER_DONE) +endef + +# EOF diff --git a/src/WinLibs/freetype-2.3.5/src/autofit/rules.mk b/src/WinLibs/freetype-2.3.5/src/autofit/rules.mk new file mode 100644 index 000000000..017489d9e --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/src/base/Jamfile b/src/WinLibs/freetype-2.3.5/src/base/Jamfile new file mode 100644 index 000000000..aeffe388e --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/base/Jamfile @@ -0,0 +1,50 @@ +# FreeType 2 src/base Jamfile +# +# 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. + +SubDir FT2_TOP $(FT2_SRC_DIR) base ; + + +{ + local _sources ; + + if $(FT2_MULTI) + { + _sources = ftutil ftdbgmem ftstream ftcalc fttrigon ftgloadr ftoutln + ftobjs ftnames ftrfork ; + } + else + { + _sources = ftbase ; + } + + Library $(FT2_LIB) : $(_sources).c ; +} + +# Add the optional/replaceable files. +# +{ + local _sources = system init glyph mm bdf + bbox debug xf86 type1 pfr + stroke winfnt otval bitmap synth + gxval lcdfil gasp patent + ; + + Library $(FT2_LIB) : ft$(_sources).c ; +} + +# Add Macintosh-specific file to the library when necessary. +# +if $(MAC) +{ + Library $(FT2_LIB) : ftmac.c ; +} + +# end of src/base Jamfile diff --git a/src/WinLibs/freetype-2.3.5/src/base/ftapi.c b/src/WinLibs/freetype-2.3.5/src/base/ftapi.c new file mode 100644 index 000000000..8914d1f4e --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/src/base/ftbase.c b/src/WinLibs/freetype-2.3.5/src/base/ftbase.c new file mode 100644 index 000000000..d176b8150 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/base/ftbase.c @@ -0,0 +1,38 @@ +/***************************************************************************/ +/* */ +/* ftbase.c */ +/* */ +/* Single object library component (body only). */ +/* */ +/* Copyright 1996-2001, 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. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> + +#define FT_MAKE_OPTION_SINGLE_OBJECT + +#include "ftcalc.c" +#include "ftdbgmem.c" +#include "ftgloadr.c" +#include "ftnames.c" +#include "ftobjs.c" +#include "ftoutln.c" +#include "ftrfork.c" +#include "ftstream.c" +#include "fttrigon.c" +#include "ftutil.c" + +#if defined( __APPLE__ ) && !defined ( DARWIN_NO_CARBON ) +#include <ftmac.c> +#endif + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/base/ftbbox.c b/src/WinLibs/freetype-2.3.5/src/base/ftbbox.c new file mode 100644 index 000000000..532ab1357 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/base/ftbbox.c @@ -0,0 +1,659 @@ +/***************************************************************************/ +/* */ +/* ftbbox.c */ +/* */ +/* FreeType bbox computation (body). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* 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 + + + 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_Raster_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_Raster_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; + } + + + /* 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. */ + + static const FT_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 + }; + + FT_Error error; + TBBox_Rec user; + + + user.bbox = bbox; + + error = FT_Outline_Decompose( outline, &bbox_interface, &user ); + if ( error ) + return error; + + *abbox = user.bbox; + } + else + *abbox = bbox; + + return FT_Err_Ok; + } + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/base/ftbdf.c b/src/WinLibs/freetype-2.3.5/src/base/ftbdf.c new file mode 100644 index 000000000..d29adf09d --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/src/base/ftbitmap.c b/src/WinLibs/freetype-2.3.5/src/base/ftbitmap.c new file mode 100644 index 000000000..4c1cdf218 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/base/ftbitmap.c @@ -0,0 +1,630 @@ +/***************************************************************************/ +/* */ +/* ftbitmap.c */ +/* */ +/* FreeType utility functions for converting 1bpp, 2bpp, 4bpp, and 8bpp */ +/* bitmaps into 8bpp format (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 <ft2build.h> +#include FT_BITMAP_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; + + xstr = FT_PIX_ROUND( xStrength ) >> 6; + ystr = 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: + { + 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: + { + 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_Bitmap_Done( FT_Library library, + FT_Bitmap *bitmap ) + { + FT_Memory memory; + + + if ( !library ) + return FT_Err_Invalid_Library_Handle; + + if ( !bitmap ) + return FT_Err_Invalid_Argument; + + memory = library->memory; + + FT_FREE( bitmap->buffer ); + *bitmap = null_bitmap; + + return FT_Err_Ok; + } + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/base/ftcalc.c b/src/WinLibs/freetype-2.3.5/src/base/ftcalc.c new file mode 100644 index 000000000..63aed95b7 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/base/ftcalc.c @@ -0,0 +1,822 @@ +/***************************************************************************/ +/* */ +/* ftcalc.c */ +/* */ +/* Arithmetic computations (body). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + /*************************************************************************/ + /* */ + /* 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_INTERNAL_CALC_H +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_OBJECTS_H + + +/* 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_ULong val, root, newroot, mask; + + + root = 0; + mask = 0x40000000L; + val = (FT_ULong)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 ) + { + 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 ; + } + + + /* 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; + + + 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( a, b, &temp ); + + temp2.hi = 0; + temp2.lo = (FT_UInt32)(c >> 1); + FT_Add64( &temp, &temp2, &temp ); + a = ft_div64by32( temp.hi, temp.lo, 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( a, b, &temp ); + a = ft_div64by32( temp.hi, temp.lo, 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 ) + { + /* use inline assembly to speed up things a bit */ + +#if defined( __GNUC__ ) && defined( i386 ) + + FT_Long 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" + "mov %%eax, %0\n" + : "=r"(result) + : "a"(a), "d"(b) + : "%ecx" + ); + return result; + +#elif 1 + + FT_Long sa, sb; + FT_ULong ua, ub; + + + if ( a == 0 || b == 0x10000L ) + return a; + + 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; + + + s = a; a = FT_ABS(a); + s ^= b; b = FT_ABS(b); + + if ( b == 0 ) + { + /* check for division by 0 */ + q = 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, 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 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_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 */ + { +#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; + + + ft_multo64( in_x, out_y, &z1 ); + ft_multo64( in_y, 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 + } + + return result; + } + + + /* documentation is in ftcalc.h */ + + FT_BASE_DEF( FT_Int ) + ft_corner_is_flat( FT_Pos in_x, + FT_Pos in_y, + FT_Pos out_x, + FT_Pos out_y ) + { + FT_Pos ax = in_x; + FT_Pos ay = in_y; + + FT_Pos d_in, d_out, d_corner; + + + if ( ax < 0 ) + ax = -ax; + if ( ay < 0 ) + ay = -ay; + d_in = ax + ay; + + ax = out_x; + if ( ax < 0 ) + ax = -ax; + ay = out_y; + if ( ay < 0 ) + ay = -ay; + d_out = ax + ay; + + ax = out_x + in_x; + if ( ax < 0 ) + ax = -ax; + ay = out_y + in_y; + if ( ay < 0 ) + ay = -ay; + d_corner = ax + ay; + + return ( d_in + d_out - d_corner ) < ( d_corner >> 4 ); + } + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/base/ftdbgmem.c b/src/WinLibs/freetype-2.3.5/src/base/ftdbgmem.c new file mode 100644 index 000000000..52a5c2057 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/base/ftdbgmem.c @@ -0,0 +1,998 @@ +/***************************************************************************/ +/* */ +/* ftdbgmem.c */ +/* */ +/* Memory debugger (body). */ +/* */ +/* Copyright 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. */ +/* */ +/***************************************************************************/ + + +#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 <stdio.h> +#include <stdlib.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 */ + const FT_Byte _debug_mem_dummy = 0; + +#endif /* !FT_DEBUG_MEMORY */ + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/base/ftdebug.c b/src/WinLibs/freetype-2.3.5/src/base/ftdebug.c new file mode 100644 index 000000000..c55d3c811 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/base/ftdebug.c @@ -0,0 +1,246 @@ +/***************************************************************************/ +/* */ +/* ftdebug.c */ +/* */ +/* Debugging and logging component (body). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* 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 + + +#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 ); + 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 ); + va_end( ap ); + + exit( EXIT_FAILURE ); + } + +#endif /* FT_DEBUG_LEVEL_ERROR */ + + + +#ifdef FT_DEBUG_LEVEL_TRACE + + /* array of trace levels, initialized to 0 */ + int ft_trace_levels[trace_count]; + + + /* define array of trace toggle names */ +#define FT_TRACE_DEF( x ) #x , + + static const char* ft_trace_toggles[trace_count + 1] = + { +#include FT_INTERNAL_TRACE_H + NULL + }; + +#undef FT_TRACE_DEF + + + /* documentation is in ftdebug.h */ + + FT_BASE_DEF( FT_Int ) + FT_Trace_Get_Count( void ) + { + return trace_count; + } + + + /* documentation is in ftdebug.h */ + + FT_BASE_DEF( const char * ) + FT_Trace_Get_Name( FT_Int idx ) + { + int max = FT_Trace_Get_Count(); + + + if ( idx < max ) + return ft_trace_toggles[idx]; + else + return NULL; + } + + + /*************************************************************************/ + /* */ + /* Initialize the tracing sub-system. This is done by retrieving the */ + /* value of the `FT2_DEBUG' environment variable. It must be a list of */ + /* toggles, separated by spaces, `;', or `,'. Example: */ + /* */ + /* export FT2_DEBUG="any:3 memory:7 stream:5" */ + /* */ + /* This requests that all levels be set to 3, except the trace level for */ + /* the memory and stream components which are set to 7 and 5, */ + /* respectively. */ + /* */ + /* See the file <include/freetype/internal/fttrace.h> for details of the */ + /* available toggle names. */ + /* */ + /* The level must be between 0 and 7; 0 means quiet (except for serious */ + /* runtime errors), and 7 means _very_ verbose. */ + /* */ + FT_BASE_DEF( void ) + ft_debug_init( void ) + { + const char* ft2_debug = getenv( "FT2_DEBUG" ); + + + if ( ft2_debug ) + { + const char* p = ft2_debug; + const char* q; + + + for ( ; *p; p++ ) + { + /* skip leading whitespace and separators */ + if ( *p == ' ' || *p == '\t' || *p == ',' || *p == ';' || *p == '=' ) + continue; + + /* read toggle name, followed by ':' */ + q = p; + while ( *p && *p != ':' ) + p++; + + if ( *p == ':' && p > q ) + { + FT_Int n, i, len = (FT_Int)( p - q ); + FT_Int level = -1, found = -1; + + + for ( n = 0; n < trace_count; n++ ) + { + const char* toggle = ft_trace_toggles[n]; + + + for ( i = 0; i < len; i++ ) + { + if ( toggle[i] != q[i] ) + break; + } + + if ( i == len && toggle[i] == 0 ) + { + found = n; + break; + } + } + + /* read level */ + p++; + if ( *p ) + { + level = *p++ - '0'; + if ( level < 0 || level > 7 ) + level = -1; + } + + if ( found >= 0 && level >= 0 ) + { + if ( found == trace_any ) + { + /* special case for `any' */ + for ( n = 0; n < trace_count; n++ ) + ft_trace_levels[n] = level; + } + else + ft_trace_levels[found] = level; + } + } + } + } + } + + +#else /* !FT_DEBUG_LEVEL_TRACE */ + + + FT_BASE_DEF( void ) + ft_debug_init( void ) + { + /* nothing */ + } + + + FT_BASE_DEF( FT_Int ) + FT_Trace_Get_Count( void ) + { + return 0; + } + + + FT_BASE_DEF( const char * ) + FT_Trace_Get_Name( FT_Int idx ) + { + FT_UNUSED( idx ); + + return NULL; + } + + +#endif /* !FT_DEBUG_LEVEL_TRACE */ + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/base/ftgasp.c b/src/WinLibs/freetype-2.3.5/src/base/ftgasp.c new file mode 100644 index 000000000..8485d2925 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/src/base/ftgloadr.c b/src/WinLibs/freetype-2.3.5/src/base/ftgloadr.c new file mode 100644 index 000000000..ab52621ea --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/base/ftgloadr.c @@ -0,0 +1,394 @@ +/***************************************************************************/ +/* */ +/* 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 ( 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 ( FT_RENEW_ARRAY( base->contours, old_max, new_max ) ) + goto Exit; + + adjust = 1; + loader->max_contours = new_max; + } + + if ( adjust ) + FT_GlyphLoader_Adjust_Points( loader ); + + Exit: + return error; + } + + + /* Ensure that we can add `n_subglyphs' to our glyph. this function */ + /* reallocates its subglyphs table if necessary. Note that it DOES */ + /* NOT change the number of subglyphs within the loader! */ + /* */ + FT_BASE_DEF( FT_Error ) + FT_GlyphLoader_CheckSubGlyphs( FT_GlyphLoader loader, + FT_UInt n_subs ) + { + FT_Memory memory = loader->memory; + FT_Error error = FT_Err_Ok; + FT_UInt new_max, old_max; + + FT_GlyphLoad base = &loader->base; + FT_GlyphLoad current = &loader->current; + + + new_max = base->num_subglyphs + current->num_subglyphs + n_subs; + old_max = loader->max_subglyphs; + if ( new_max > old_max ) + { + new_max = FT_PAD_CEIL( new_max, 2 ); + if ( FT_RENEW_ARRAY( base->subglyphs, old_max, new_max ) ) + goto Exit; + + loader->max_subglyphs = new_max; + + FT_GlyphLoader_Adjust_Subglyphs( loader ); + } + + Exit: + return error; + } + + + /* prepare loader for the addition of a new glyph on top of the base one */ + FT_BASE_DEF( void ) + FT_GlyphLoader_Prepare( FT_GlyphLoader loader ) + { + FT_GlyphLoad current = &loader->current; + + + current->outline.n_points = 0; + current->outline.n_contours = 0; + current->num_subglyphs = 0; + + FT_GlyphLoader_Adjust_Points ( loader ); + FT_GlyphLoader_Adjust_Subglyphs( loader ); + } + + + /* add current glyph to the base image - and prepare for another */ + FT_BASE_DEF( void ) + FT_GlyphLoader_Add( FT_GlyphLoader loader ) + { + FT_GlyphLoad base; + FT_GlyphLoad current; + + FT_UInt n_curr_contours; + FT_UInt n_base_points; + FT_UInt n; + + + if ( !loader ) + return; + + base = &loader->base; + current = &loader->current; + + n_curr_contours = current->outline.n_contours; + n_base_points = base->outline.n_points; + + base->outline.n_points = + (short)( base->outline.n_points + current->outline.n_points ); + base->outline.n_contours = + (short)( base->outline.n_contours + current->outline.n_contours ); + + base->num_subglyphs += current->num_subglyphs; + + /* adjust contours count in newest outline */ + for ( n = 0; n < n_curr_contours; n++ ) + current->outline.contours[n] = + (short)( current->outline.contours[n] + n_base_points ); + + /* prepare for another new glyph image */ + FT_GlyphLoader_Prepare( loader ); + } + + + FT_BASE_DEF( FT_Error ) + FT_GlyphLoader_CopyPoints( FT_GlyphLoader target, + FT_GlyphLoader source ) + { + FT_Error error; + FT_UInt num_points = source->base.outline.n_points; + FT_UInt num_contours = source->base.outline.n_contours; + + + error = FT_GlyphLoader_CheckPoints( target, num_points, num_contours ); + if ( !error ) + { + FT_Outline* out = &target->base.outline; + FT_Outline* in = &source->base.outline; + + + FT_ARRAY_COPY( out->points, in->points, + num_points ); + FT_ARRAY_COPY( out->tags, in->tags, + num_points ); + FT_ARRAY_COPY( out->contours, in->contours, + num_contours ); + + /* do we need to copy the extra points? */ + if ( target->use_extra && source->use_extra ) + { + FT_ARRAY_COPY( target->base.extra_points, source->base.extra_points, + num_points ); + FT_ARRAY_COPY( target->base.extra_points2, source->base.extra_points2, + num_points ); + } + + out->n_points = (short)num_points; + out->n_contours = (short)num_contours; + + FT_GlyphLoader_Adjust_Points( target ); + } + + return error; + } + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/base/ftglyph.c b/src/WinLibs/freetype-2.3.5/src/base/ftglyph.c new file mode 100644 index 000000000..969c5dbb0 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/base/ftglyph.c @@ -0,0 +1,682 @@ +/***************************************************************************/ +/* */ +/* ftglyph.c */ +/* */ +/* FreeType convenience functions to handle glyphs (body). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 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. */ +/* */ +/***************************************************************************/ + + /*************************************************************************/ + /* */ + /* 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 + + + /*************************************************************************/ + /* */ + /* 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 + + + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** Convenience functions ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + + + /* 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; + } + + + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** 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_CALLBACK_TABLE_DEF + const FT_Glyph_Class 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_CALLBACK_TABLE_DEF + const FT_Glyph_Class 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; + + + *target = 0; + + /* check arguments */ + if ( !target || !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; + + /* it it is an outline too */ + else if ( slot->format == FT_GLYPH_FORMAT_OUTLINE ) + clazz = &ft_outline_glyph_class; + + 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; + + + /* 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 ) + 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, + (FT_Glyph*)(void*)&bitmap ); + if ( error ) + goto Exit; + +#if 1 + /* if `origin' is set, translate the glyph image */ + if ( origin ) + FT_Glyph_Transform( glyph, 0, origin ); +#else + FT_UNUSED( origin ); +#endif + + /* prepare dummy slot for rendering */ + error = clazz->glyph_prepare( glyph, &dummy ); + if ( !error ) + error = FT_Render_Glyph_Internal( glyph->library, &dummy, render_mode ); + +#if 1 + if ( !destroy && origin ) + { + FT_Vector v; + + + v.x = -origin->x; + v.y = -origin->y; + FT_Glyph_Transform( glyph, 0, &v ); + } +#endif + + if ( error ) + goto Exit; + + /* in case of success, copy the bitmap to the glyph bitmap */ + error = ft_bitmap_glyph_init( (FT_Glyph)bitmap, &dummy ); + if ( error ) + goto Exit; + + /* copy advance */ + bitmap->root.advance = glyph->advance; + + if ( destroy ) + FT_Done_Glyph( glyph ); + + *the_glyph = FT_GLYPH( bitmap ); + + Exit: + if ( error && bitmap ) + FT_Done_Glyph( FT_GLYPH( bitmap ) ); + + return error; + + Bad: + error = FT_Err_Invalid_Argument; + goto Exit; + } + + + /* documentation is in ftglyph.h */ + + FT_EXPORT_DEF( void ) + FT_Done_Glyph( FT_Glyph glyph ) + { + if ( glyph ) + { + FT_Memory memory = glyph->library->memory; + const FT_Glyph_Class* clazz = glyph->clazz; + + + if ( clazz->glyph_done ) + clazz->glyph_done( glyph ); + + FT_FREE( glyph ); + } + } + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/base/ftgxval.c b/src/WinLibs/freetype-2.3.5/src/base/ftgxval.c new file mode 100644 index 000000000..32662bed8 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/src/base/ftinit.c b/src/WinLibs/freetype-2.3.5/src/base/ftinit.c new file mode 100644 index 000000000..7af19c3d8 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/base/ftinit.c @@ -0,0 +1,163 @@ +/***************************************************************************/ +/* */ +/* ftinit.c */ +/* */ +/* FreeType initialization layer (body). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + /*************************************************************************/ + /* */ + /* 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 + + + /*************************************************************************/ + /* */ + /* 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 + +#undef FT_USE_MODULE +#ifdef __cplusplus +#define FT_USE_MODULE( x ) extern "C" const FT_Module_Class x; +#else +#define FT_USE_MODULE( x ) extern const FT_Module_Class x; +#endif + + +#include FT_CONFIG_MODULES_H + + +#undef FT_USE_MODULE +#define FT_USE_MODULE( x ) (const FT_Module_Class*)&(x), + + static + const FT_Module_Class* const ft_default_modules[] = + { +#include FT_CONFIG_MODULES_H + 0 + }; + + + /* 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; + while ( *cur ) + { + error = FT_Add_Module( library, *cur ); + /* notify errors, but don't stop */ + if ( error ) + { + FT_ERROR(( "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 + { + (*alibrary)->version_major = FREETYPE_MAJOR; + (*alibrary)->version_minor = FREETYPE_MINOR; + (*alibrary)->version_patch = FREETYPE_PATCH; + + FT_Add_Default_Modules( *alibrary ); + } + + return error; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Done_FreeType( FT_Library library ) + { + if ( library ) + { + FT_Memory memory = library->memory; + + + /* Discard the library object */ + FT_Done_Library( library ); + + /* discard memory manager */ + FT_Done_Memory( memory ); + } + + return FT_Err_Ok; + } + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/base/ftlcdfil.c b/src/WinLibs/freetype-2.3.5/src/base/ftlcdfil.c new file mode 100644 index 000000000..f40bbeae5 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/base/ftlcdfil.c @@ -0,0 +1,351 @@ +/***************************************************************************/ +/* */ +/* ftlcdfil.c */ +/* */ +/* FreeType API for color filtering of subpixel bitmap glyphs (body). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#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 + + /* FIR filter used by the default and light filters */ + 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 FIR 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( 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 ) + + memcpy( library->lcd_weights, light_filter, 5 ); + library->lcd_filter_func = _ft_lcd_filter_fir; + library->lcd_extra = 2; + +#else + + 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: + 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( FT_Error ) + FT_Library_SetLcdFilter( FT_Library library, + FT_LcdFilter filter ) + { + FT_UNUSED( library ); + FT_UNUSED( filter ); + + return FT_Err_Unimplemented_Feature; + } + +#endif /* !FT_CONFIG_OPTION_SUBPIXEL_RENDERING */ + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/base/ftmac.c b/src/WinLibs/freetype-2.3.5/src/base/ftmac.c new file mode 100644 index 000000000..fd6201adb --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/base/ftmac.c @@ -0,0 +1,1096 @@ +/***************************************************************************/ +/* */ +/* ftmac.c */ +/* */ +/* Mac FOND support. Written by just@letterror.com. */ +/* Heavily modified by mpsuzuki, George Williams, and Sean McBride. */ +/* */ +/* This file is for Mac OS X only; see builds/mac/ftoldmac.c for */ +/* classic platforms built by MPW. */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007 by */ +/* Just van Rossum, David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /* + Notes + + Mac suitcase files can (and often do!) contain multiple fonts. To + support this I use the face_index argument of FT_(Open|New)_Face() + functions, and pretend the suitcase file is a collection. + + Warning: fbit and NFNT bitmap resources are not supported yet. In old + sfnt fonts, bitmap glyph data for each size is stored in each `NFNT' + resources instead of the `bdat' table in the sfnt resource. Therefore, + face->num_fixed_sizes is set to 0, because bitmap data in `NFNT' + resource is unavailable at present. + + The Mac FOND support works roughly like this: + + - Check whether the offered stream points to a Mac suitcase file. This + is done by checking the file type: it has to be 'FFIL' or 'tfil'. The + stream that gets passed to our init_face() routine is a stdio stream, + which isn't usable for us, since the FOND resources live in the + resource fork. So we just grab the stream->pathname field. + + - Read the FOND resource into memory, then check whether there is a + TrueType font and/or(!) a Type 1 font available. + + - If there is a Type 1 font available (as a separate `LWFN' file), read + its data into memory, massage it slightly so it becomes PFB data, wrap + it into a memory stream, load the Type 1 driver and delegate the rest + of the work to it by calling FT_Open_Face(). (XXX TODO: after this + has been done, the kerning data from the FOND resource should be + appended to the face: On the Mac there are usually no AFM files + available. However, this is tricky since we need to map Mac char + codes to ps glyph names to glyph ID's...) + + - If there is a TrueType font (an `sfnt' resource), read it into memory, + wrap it into a memory stream, load the TrueType driver and delegate + the rest of the work to it, by calling FT_Open_Face(). + + - Some suitcase fonts (notably Onyx) might point the `LWFN' file to + itself, even though it doesn't contains `POST' resources. To handle + this special case without opening the file an extra time, we just + ignore errors from the `LWFN' and fallback to the `sfnt' if both are + available. + */ + + +#include <ft2build.h> +#include FT_FREETYPE_H +#include FT_INTERNAL_STREAM_H + + /* This is for Mac OS X. Without redefinition, OS_INLINE */ + /* expands to `static inline' which doesn't survive the */ + /* -ansi compilation flag of GCC. */ +#if !HAVE_ANSI_OS_INLINE +#undef OS_INLINE +#define OS_INLINE static __inline__ +#endif +#include <Carbon/Carbon.h> + +#ifndef HFS_MAXPATHLEN +#define HFS_MAXPATHLEN 1024 +#endif + +#define FT_DEPRECATED_ATTRIBUTE + +#include FT_MAC_H + + /* undefine blocking-macros in ftmac.h */ +#undef FT_GetFile_From_Mac_Name( a, b, c ) +#undef FT_GetFile_From_Mac_ATS_Name( a, b, c ) +#undef FT_New_Face_From_FSSpec( a, b, c, d ) + + + /* 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 + + + FT_EXPORT_DEF( FT_Error ) + FT_GetFile_From_Mac_Name( const char* fontName, + FSSpec* pathSpec, + FT_Long* face_index ) + { + FT_UNUSED( fontName ); + FT_UNUSED( pathSpec ); + FT_UNUSED( face_index ); + + return FT_Err_Unimplemented_Feature; + } + + + /* Private function. */ + /* The FSSpec type has been discouraged for a long time, */ + /* but for some reason, there is no FSRef version of */ + /* ATSFontGetFileSpecification(), so we made our own. */ + /* Apple will provide one eventually. */ + static OSStatus + FT_ATSFontGetFileReference( ATSFontRef ats_font_id, + FSRef* ats_font_ref ) + { +#if __LP64__ + FT_UNUSED( ats_font_id ); + FT_UNUSED( ats_font_ref ); + + return fnfErr; +#else + OSStatus err; + FSSpec spec; + + + err = ATSFontGetFileSpecification( ats_font_id, &spec ); + if ( noErr == err ) + err = FSpMakeFSRef( &spec, ats_font_ref ); + + return err; +#endif + } + + + static FT_Error + FT_GetFileRef_From_Mac_ATS_Name( const char* fontName, + FSRef* ats_font_ref, + FT_Long* face_index ) + { + CFStringRef cf_fontName; + ATSFontRef ats_font_id; + + + *face_index = 0; + + cf_fontName = CFStringCreateWithCString( NULL, fontName, + kCFStringEncodingMacRoman ); + ats_font_id = ATSFontFindFromName( cf_fontName, + kATSOptionFlagsUnRestrictedScope ); + CFRelease( cf_fontName ); + + if ( ats_font_id == 0 || ats_font_id == 0xFFFFFFFFUL ) + return FT_Err_Unknown_File_Format; + + if ( noErr != FT_ATSFontGetFileReference( ats_font_id, ats_font_ref ) ) + return FT_Err_Unknown_File_Format; + + /* face_index calculation by searching preceding fontIDs */ + /* with same FSRef */ + { + ATSFontRef id2 = ats_font_id - 1; + FSRef ref2; + + + while ( id2 > 0 ) + { + if ( noErr != FT_ATSFontGetFileReference( id2, &ref2 ) ) + break; + if ( noErr != FSCompareFSRefs( ats_font_ref, &ref2 ) ) + break; + + id2 --; + } + *face_index = ats_font_id - ( id2 + 1 ); + } + + return FT_Err_Ok; + } + + + FT_EXPORT_DEF( FT_Error ) + FT_GetFilePath_From_Mac_ATS_Name( const char* fontName, + UInt8* path, + UInt32 maxPathSize, + FT_Long* face_index ) + { + FSRef ref; + FT_Error err; + + + err = FT_GetFileRef_From_Mac_ATS_Name( fontName, &ref, face_index ); + if ( FT_Err_Ok != err ) + return err; + + if ( noErr != FSRefMakePath( &ref, path, maxPathSize ) ) + return FT_Err_Unknown_File_Format; + + return FT_Err_Ok; + } + + + /* This function is deprecated because FSSpec is deprecated in Mac OS X */ + FT_EXPORT_DEF( FT_Error ) + FT_GetFile_From_Mac_ATS_Name( const char* fontName, + FSSpec* pathSpec, + FT_Long* face_index ) + { +#if __LP64__ + FT_UNUSED( fontName ); + FT_UNUSED( pathSpec ); + FT_UNUSED( face_index ); + + return FT_Err_Unimplemented_Feature; +#else + FSRef ref; + FT_Error err; + + + err = FT_GetFileRef_From_Mac_ATS_Name( fontName, &ref, face_index ); + if ( FT_Err_Ok != err ) + return err; + + if ( noErr != FSGetCatalogInfo( &ref, kFSCatInfoNone, NULL, NULL, + pathSpec, NULL ) ) + return FT_Err_Unknown_File_Format; + + return FT_Err_Ok; +#endif + } + + + static OSErr + FT_FSPathMakeRes( const UInt8* pathname, + short* res ) + { + OSErr err; + FSRef ref; + + + if ( noErr != FSPathMakeRef( pathname, &ref, FALSE ) ) + return FT_Err_Cannot_Open_Resource; + + /* at present, no support for dfont format */ + err = FSOpenResourceFile( &ref, 0, NULL, fsRdPerm, res ); + if ( noErr == err ) + return err; + + /* fallback to original resource-fork font */ + *res = FSOpenResFile( &ref, fsRdPerm ); + err = ResError(); + + return err; + } + + + /* Return the file type for given pathname */ + static OSType + get_file_type_from_path( const UInt8* pathname ) + { + FSRef ref; + FSCatalogInfo info; + + + if ( noErr != FSPathMakeRef( pathname, &ref, FALSE ) ) + return ( OSType ) 0; + + if ( noErr != FSGetCatalogInfo( &ref, kFSCatInfoFinderInfo, &info, + NULL, NULL, NULL ) ) + return ( OSType ) 0; + + return ((FInfo *)(info.finderInfo))->fdType; + } + + + /* Given a PostScript font name, create the Macintosh LWFN file name. */ + static void + create_lwfn_name( char* ps_name, + Str255 lwfn_file_name ) + { + int max = 5, count = 0; + FT_Byte* p = lwfn_file_name; + FT_Byte* q = (FT_Byte*)ps_name; + + + lwfn_file_name[0] = 0; + + while ( *q ) + { + if ( ft_isupper( *q ) ) + { + if ( count ) + max = 3; + count = 0; + } + if ( count < max && ( ft_isalnum( *q ) || *q == '_' ) ) + { + *++p = *q; + lwfn_file_name[0]++; + count++; + } + q++; + } + } + + + static short + count_faces_sfnt( char* fond_data ) + { + /* The count is 1 greater than the value in the FOND. */ + /* Isn't that cute? :-) */ + + return EndianS16_BtoN( *( (short*)( fond_data + + sizeof ( FamRec ) ) ) ) + 1; + } + + + static short + count_faces_scalable( char* fond_data ) + { + AsscEntry* assoc; + FamRec* fond; + short i, face, face_all; + + + fond = (FamRec*)fond_data; + face_all = EndianS16_BtoN( *( (short *)( fond_data + + sizeof ( FamRec ) ) ) ) + 1; + assoc = (AsscEntry*)( fond_data + sizeof ( FamRec ) + 2 ); + face = 0; + + for ( i = 0; i < face_all; i++ ) + { + if ( 0 == EndianS16_BtoN( assoc[i].fontSize ) ) + face++; + } + return face; + } + + + /* Look inside the FOND data, answer whether there should be an SFNT + resource, and answer the name of a possible LWFN Type 1 file. + + Thanks to Paul Miller (paulm@profoundeffects.com) for the fix + to load a face OTHER than the first one in the FOND! + */ + + + static void + parse_fond( char* fond_data, + short* have_sfnt, + short* 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; + + /* 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[0] > 1 ) + { + unsigned char* suffixes = names[style->indexes[0] - 1]; + + + for ( i = 1; i <= suffixes[0]; i++ ) + { + unsigned char* s; + size_t j = suffixes[i] - 1; + + + if ( j < string_count && ( s = names[j] ) != NULL ) + { + size_t s_len = (size_t)s[0]; + + + if ( s_len != 0 && ps_name_len + s_len < sizeof ( ps_name ) ) + { + ft_memcpy( ps_name + ps_name_len, s + 1, s_len ); + ps_name_len += s_len; + ps_name[ps_name_len] = 0; + } + } + } + } + } + + create_lwfn_name( ps_name, lwfn_file_name ); + } + } + + + static FT_Error + lookup_lwfn_by_fond( const UInt8* path_fond, + ConstStr255Param base_lwfn, + UInt8* path_lwfn, + size_t path_size ) + { + FSRef ref, par_ref; + 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 */ + ft_strcat( (char *)path_lwfn, "/" ); + dirname_len = ft_strlen( (char *)path_lwfn ); + ft_strcat( (char *)path_lwfn, (char *)base_lwfn + 1 ); + path_lwfn[dirname_len + base_lwfn[0]] = '\0'; + + if ( noErr != FSPathMakeRef( path_lwfn, &ref, FALSE ) ) + return FT_Err_Cannot_Open_Resource; + + if ( noErr != FSGetCatalogInfo( &ref, kFSCatInfoNone, + NULL, NULL, NULL, NULL ) ) + return FT_Err_Cannot_Open_Resource; + + return FT_Err_Ok; + } + + + static short + count_faces( Handle fond, + const UInt8* pathname ) + { + short sfnt_id; + short have_sfnt, have_lwfn; + Str255 lwfn_file_name; + UInt8 buff[HFS_MAXPATHLEN]; + FT_Error err; + short num_faces; + + + have_sfnt = have_lwfn = 0; + + parse_fond( *fond, &have_sfnt, &sfnt_id, lwfn_file_name, 0 ); + + if ( lwfn_file_name[0] ) + { + err = lookup_lwfn_by_fond( pathname, lwfn_file_name, + buff, sizeof ( buff ) ); + if ( FT_Err_Ok == err ) + have_lwfn = 1; + } + + if ( have_lwfn && ( !have_sfnt || PREFER_LWFN ) ) + num_faces = 1; + else + num_faces = count_faces_scalable( *fond ); + + return num_faces; + } + + + /* Read Type 1 data from the POST resources inside the LWFN file, + return a PFB buffer. This is somewhat convoluted because the FT2 + PFB parser wants the ASCII header as one chunk, and the LWFN + chunks are often not organized that way, so we glue chunks + of the same type together. */ + static FT_Error + read_lwfn( FT_Memory memory, + short res, + FT_Byte** pfb_data, + FT_ULong* size ) + { + FT_Error error = FT_Err_Ok; + short 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( '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( '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; + } + + + /* Finalizer for a memory stream; gets called by FT_Done_Face(). + It frees the memory it uses. */ + 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. */ + 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. */ + static FT_Error + open_face_from_buffer( FT_Library library, + FT_Byte* base, + FT_ULong size, + FT_Long face_index, + char* driver_name, + FT_Face* aface ) + { + FT_Open_Args args; + FT_Error error; + FT_Stream stream; + 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 ); + } + + /* 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; + + error = FT_Open_Face( library, &args, face_index, aface ); + if ( error == FT_Err_Ok ) + (*aface)->face_flags &= ~FT_FACE_FLAG_EXTERNAL_STREAM; + else + FT_Stream_Free( stream, 0 ); + + 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; + short 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, + short 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; + + + sfnt = GetResource( 'sfnt', sfnt_id ); + if ( ResError() ) + return FT_Err_Invalid_Handle; + + sfnt_size = (FT_ULong)GetHandleSize( sfnt ); + if ( FT_ALLOC( sfnt_data, (FT_Long)sfnt_size ) ) + { + ReleaseResource( sfnt ); + return error; + } + + ft_memcpy( sfnt_data, *sfnt, sfnt_size ); + ReleaseResource( sfnt ); + + is_cff = sfnt_size > 4 && sfnt_data[0] == 'O' && + sfnt_data[1] == 'T' && + sfnt_data[2] == 'T' && + sfnt_data[3] == 'O'; + + return open_face_from_buffer( library, + sfnt_data, + sfnt_size, + face_index, + is_cff ? "cff" : "truetype", + aface ); + } + + + /* 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; + short res_ref, 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( '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 sfnt_id, have_sfnt, have_lwfn = 0; + short fond_id; + OSType fond_type; + Str255 fond_name; + Str255 lwfn_file_name; + UInt8 path_lwfn[HFS_MAXPATHLEN]; + OSErr err; + FT_Error error = FT_Err_Ok; + + + GetResInfo( fond, &fond_id, &fond_type, fond_name ); + if ( ResError() != noErr || fond_type != 'FOND' ) + return FT_Err_Invalid_File_Format; + + parse_fond( *fond, &have_sfnt, &sfnt_id, lwfn_file_name, face_index ); + + if ( lwfn_file_name[0] ) + { + short res; + + + res = HomeResFile( fond ); + if ( noErr != ResError() ) + goto found_no_lwfn_file; + + { + UInt8 path_fond[HFS_MAXPATHLEN]; + FSRef ref; + + + err = FSGetForkCBInfo( res, kFSInvalidVolumeRefNum, + NULL, NULL, NULL, &ref, NULL ); + if ( noErr != err ) + goto found_no_lwfn_file; + + err = FSRefMakePath( &ref, path_fond, sizeof ( path_fond ) ); + if ( noErr != err ) + goto found_no_lwfn_file; + + error = lookup_lwfn_by_fond( path_fond, lwfn_file_name, + path_lwfn, sizeof ( path_lwfn ) ); + if ( FT_Err_Ok == error ) + have_lwfn = 1; + } + } + + if ( have_lwfn && ( !have_sfnt || PREFER_LWFN ) ) + error = FT_New_Face_From_LWFN( library, + path_lwfn, + face_index, + aface ); + else + error = FT_Err_Unknown_File_Format; + + found_no_lwfn_file: + if ( have_sfnt && FT_Err_Ok != error ) + error = FT_New_Face_From_SFNT( library, + sfnt_id, + face_index, + aface ); + + return error; + } + + + /* Common function to load a new FT_Face from a resource file. */ + static FT_Error + FT_New_Face_From_Resource( FT_Library library, + const UInt8* pathname, + FT_Long face_index, + FT_Face* aface ) + { + OSType file_type; + FT_Error error; + + + /* LWFN is a (very) specific file format, check for it explicitly */ + file_type = get_file_type_from_path( pathname ); + if ( file_type == 'LWFN' ) + return FT_New_Face_From_LWFN( library, pathname, face_index, aface ); + + /* Otherwise the file type doesn't matter (there are more than */ + /* `FFIL' and `tfil'). Just try opening it as a font suitcase; */ + /* if it works, fine. */ + + error = FT_New_Face_From_Suitcase( library, pathname, face_index, aface ); + if ( error == 0 ) + return error; + + /* let it fall through to normal loader (.ttf, .otf, etc.); */ + /* we signal this by returning no error and no FT_Face */ + *aface = NULL; + return 0; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_New_Face */ + /* */ + /* <Description> */ + /* This is the Mac-specific implementation of FT_New_Face. In */ + /* addition to the standard FT_New_Face() functionality, it also */ + /* accepts pathnames to Mac suitcase files. For further */ + /* documentation see the original FT_New_Face() in freetype.h. */ + /* */ + FT_EXPORT_DEF( FT_Error ) + FT_New_Face( FT_Library library, + const char* pathname, + FT_Long face_index, + FT_Face* aface ) + { + FT_Open_Args args; + FT_Error error; + + + /* test for valid `library' and `aface' delayed to FT_Open_Face() */ + if ( !pathname ) + return FT_Err_Invalid_Argument; + + error = FT_Err_Ok; + *aface = NULL; + + /* try resourcefork based font: LWFN, FFIL */ + error = FT_New_Face_From_Resource( library, (UInt8 *)pathname, + face_index, aface ); + if ( error != 0 || *aface != NULL ) + return error; + + /* let it fall through to normal loader (.ttf, .otf, etc.) */ + args.flags = FT_OPEN_PATHNAME; + args.pathname = (char*)pathname; + return FT_Open_Face( library, &args, face_index, aface ); + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_New_Face_From_FSRef */ + /* */ + /* <Description> */ + /* FT_New_Face_From_FSRef is identical to FT_New_Face except it */ + /* accepts an FSRef instead of a path. */ + /* */ + FT_EXPORT_DEF( FT_Error ) + FT_New_Face_From_FSRef( FT_Library library, + const FSRef* ref, + FT_Long face_index, + FT_Face* aface ) + { + FT_Error error; + FT_Open_Args args; + OSErr err; + UInt8 pathname[HFS_MAXPATHLEN]; + + + if ( !ref ) + return FT_Err_Invalid_Argument; + + err = FSRefMakePath( ref, pathname, sizeof ( pathname ) ); + if ( err ) + error = FT_Err_Cannot_Open_Resource; + + error = FT_New_Face_From_Resource( library, pathname, face_index, aface ); + if ( error != 0 || *aface != NULL ) + return error; + + /* fallback to datafork font */ + args.flags = FT_OPEN_PATHNAME; + args.pathname = (char*)pathname; + return FT_Open_Face( library, &args, face_index, aface ); + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_New_Face_From_FSSpec */ + /* */ + /* <Description> */ + /* FT_New_Face_From_FSSpec is identical to FT_New_Face except it */ + /* accepts an FSSpec instead of a path. */ + /* */ + FT_EXPORT_DEF( FT_Error ) + FT_New_Face_From_FSSpec( FT_Library library, + const FSSpec* spec, + FT_Long face_index, + FT_Face* aface ) + { +#if __LP64__ + FT_UNUSED( library ); + FT_UNUSED( spec ); + FT_UNUSED( face_index ); + FT_UNUSED( aface ); + + return FT_Err_Unimplemented_Feature; +#else + FSRef ref; + + + if ( !spec || FSpMakeFSRef( spec, &ref ) != noErr ) + return FT_Err_Invalid_Argument; + else + return FT_New_Face_From_FSRef( library, &ref, face_index, aface ); +#endif + } + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/base/ftmm.c b/src/WinLibs/freetype-2.3.5/src/base/ftmm.c new file mode 100644 index 000000000..586d5e84d --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/base/ftmm.c @@ -0,0 +1,202 @@ +/***************************************************************************/ +/* */ +/* ftmm.c */ +/* */ +/* Multiple Master font support (body). */ +/* */ +/* Copyright 1996-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. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_MULTIPLE_MASTERS_H +#include FT_INTERNAL_OBJECTS_H +#include FT_SERVICE_MULTIPLE_MASTERS_H + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_mm + + + static FT_Error + ft_face_get_mm_service( FT_Face face, + FT_Service_MultiMasters *aservice ) + { + FT_Error error; + + + *aservice = NULL; + + if ( !face ) + return FT_Err_Invalid_Face_Handle; + + error = FT_Err_Invalid_Argument; + + if ( FT_HAS_MULTIPLE_MASTERS( face ) ) + { + FT_FACE_LOOKUP_SERVICE( face, + *aservice, + MULTI_MASTERS ); + + if ( aservice ) + error = FT_Err_Ok; + } + + return error; + } + + + /* documentation is in ftmm.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Get_Multi_Master( FT_Face face, + FT_Multi_Master *amaster ) + { + FT_Error error; + FT_Service_MultiMasters service; + + + error = ft_face_get_mm_service( face, &service ); + if ( !error ) + { + error = FT_Err_Invalid_Argument; + if ( service->get_mm ) + error = service->get_mm( face, amaster ); + } + + return error; + } + + + /* documentation is in ftmm.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Get_MM_Var( FT_Face face, + FT_MM_Var* *amaster ) + { + FT_Error error; + FT_Service_MultiMasters service; + + + error = ft_face_get_mm_service( face, &service ); + if ( !error ) + { + error = FT_Err_Invalid_Argument; + if ( service->get_mm_var ) + error = service->get_mm_var( face, amaster ); + } + + return error; + } + + + /* documentation is in ftmm.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Set_MM_Design_Coordinates( FT_Face face, + FT_UInt num_coords, + FT_Long* coords ) + { + FT_Error error; + FT_Service_MultiMasters service; + + + error = ft_face_get_mm_service( face, &service ); + if ( !error ) + { + error = FT_Err_Invalid_Argument; + if ( service->set_mm_design ) + error = service->set_mm_design( face, num_coords, coords ); + } + + return error; + } + + + /* documentation is in ftmm.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Set_Var_Design_Coordinates( FT_Face face, + FT_UInt num_coords, + FT_Fixed* coords ) + { + FT_Error error; + FT_Service_MultiMasters service; + + + error = ft_face_get_mm_service( face, &service ); + if ( !error ) + { + error = FT_Err_Invalid_Argument; + if ( service->set_var_design ) + error = service->set_var_design( face, num_coords, coords ); + } + + return error; + } + + + /* documentation is in ftmm.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Set_MM_Blend_Coordinates( FT_Face face, + FT_UInt num_coords, + FT_Fixed* coords ) + { + FT_Error error; + FT_Service_MultiMasters service; + + + error = ft_face_get_mm_service( face, &service ); + if ( !error ) + { + error = FT_Err_Invalid_Argument; + if ( service->set_mm_blend ) + error = service->set_mm_blend( face, num_coords, coords ); + } + + return error; + } + + + /* documentation is in ftmm.h */ + + /* This is exactly the same as the previous function. It exists for */ + /* orthogonality. */ + + FT_EXPORT_DEF( FT_Error ) + FT_Set_Var_Blend_Coordinates( FT_Face face, + FT_UInt num_coords, + FT_Fixed* coords ) + { + FT_Error error; + FT_Service_MultiMasters service; + + + error = ft_face_get_mm_service( face, &service ); + if ( !error ) + { + error = FT_Err_Invalid_Argument; + if ( service->set_mm_blend ) + error = service->set_mm_blend( face, num_coords, coords ); + } + + return error; + } + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/base/ftnames.c b/src/WinLibs/freetype-2.3.5/src/base/ftnames.c new file mode 100644 index 000000000..7fde5c40b --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/base/ftnames.c @@ -0,0 +1,94 @@ +/***************************************************************************/ +/* */ +/* ftnames.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 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. 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 ftnames.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 ftnames.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Get_Sfnt_Name( FT_Face face, + FT_UInt idx, + FT_SfntName *aname ) + { + FT_Error error = FT_Err_Invalid_Argument; + + + if ( aname && face && FT_IS_SFNT( face ) ) + { + TT_Face ttface = (TT_Face)face; + + + if ( idx < (FT_UInt)ttface->num_names ) + { + TT_NameEntryRec* entry = ttface->name_table.names + idx; + + + /* load name on demand */ + if ( entry->stringLength > 0 && entry->string == NULL ) + { + FT_Memory memory = face->memory; + FT_Stream stream = face->stream; + + + if ( FT_NEW_ARRAY ( entry->string, entry->stringLength ) || + FT_STREAM_SEEK( entry->stringOffset ) || + FT_STREAM_READ( entry->string, entry->stringLength ) ) + { + FT_FREE( entry->string ); + entry->stringLength = 0; + } + } + + aname->platform_id = entry->platformID; + aname->encoding_id = entry->encodingID; + aname->language_id = entry->languageID; + aname->name_id = entry->nameID; + aname->string = (FT_Byte*)entry->string; + aname->string_len = entry->stringLength; + + error = FT_Err_Ok; + } + } + + return error; + } + + +#endif /* TT_CONFIG_OPTION_SFNT_NAMES */ + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/base/ftobjs.c b/src/WinLibs/freetype-2.3.5/src/base/ftobjs.c new file mode 100644 index 000000000..fa0809400 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/base/ftobjs.c @@ -0,0 +1,3993 @@ +/***************************************************************************/ +/* */ +/* ftobjs.c */ +/* */ +/* The FreeType private base classes (body). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#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_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 + +#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; + + + if ( !library ) + return FT_Err_Invalid_Library_Handle; + + if ( !args ) + return FT_Err_Invalid_Argument; + + *astream = 0; + 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 ); + } + } + + +#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->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 ); + + /* 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 = 0; + 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. + * + * - Then, autohint 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 requires the unpatented + * bytecode interpreter to load properly. + */ + + autohint = 0; + if ( hinter && + ( load_flags & FT_LOAD_NO_HINTING ) == 0 && + ( load_flags & FT_LOAD_NO_AUTOHINT ) == 0 && + FT_DRIVER_IS_SCALABLE( driver ) && + FT_DRIVER_USES_OUTLINES( driver ) && + face->internal->transform_matrix.yy > 0 && + face->internal->transform_matrix.yx == 0 ) + { + if ( ( load_flags & FT_LOAD_FORCE_AUTOHINT ) != 0 || + !FT_DRIVER_HAS_HINTER( driver ) ) + autohint = 1; + else + { + FT_Render_Mode mode = FT_LOAD_TARGET_MODE( load_flags ); + + + if ( mode == FT_RENDER_MODE_LIGHT || + face->internal->ignore_unpatented_hinter ) + autohint = 1; + } + } + + 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; + } + + /* 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 ); + } + 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 && + ( face->face_flags & FT_FACE_FLAG_SCALABLE ) ) + { + 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 ); + /* transform advance */ + FT_Vector_Transform( &slot->advance, &internal->transform_matrix ); + } + } + + /* 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; + FT_CharMap* unicmap = NULL; /* some UCS-2 map, if we found it */ + + + /* 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 ) + { + unicmap = cur; /* record we found a Unicode charmap */ + + /* 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 ) ) + + /* Hurray! We found a UCS-4 charmap. We can stop the scan! */ + { + face->charmap = cur[0]; + return 0; + } + } + } + + /* We do not have any UCS-4 charmap. Sigh. */ + /* Let's see if we have some other kind of Unicode charmap, though. */ + if ( unicmap != NULL ) + { + face->charmap = unicmap[0]; + return 0; + } + + /* Chou blanc! */ + return FT_Err_Invalid_CharMap_Handle; + } + + + /*************************************************************************/ + /* */ + /* <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 = params[i].data; + } +#endif + + 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 ); + clazz->done_face( face ); + FT_FREE( internal ); + FT_FREE( face ); + *aface = 0; + } + + return error; + } + + + /* there's a Mac-specific extended implementation of FT_New_Face() */ + /* in src/base/ftmac.c */ + +#ifndef FT_MACINTOSH + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_New_Face( FT_Library library, + const char* pathname, + FT_Long face_index, + FT_Face *aface ) + { + FT_Open_Args args; + + + /* test for valid `library' and `aface' delayed to FT_Open_Face() */ + if ( !pathname ) + return FT_Err_Invalid_Argument; + + args.flags = FT_OPEN_PATHNAME; + args.pathname = (char*)pathname; + + return FT_Open_Face( library, &args, face_index, aface ); + } + +#endif /* !FT_MACINTOSH */ + + + /* 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; + + return FT_Open_Face( library, &args, face_index, aface ); + } + + +#if !defined( FT_MACINTOSH ) && defined( 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 */ + static 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 ); + } + + error = FT_Open_Face( library, &args, face_index, aface ); + + if ( error == FT_Err_Ok ) + (*aface)->face_flags &= ~FT_FACE_FLAG_EXTERNAL_STREAM; + else + { + FT_Stream_Close( stream ); + FT_FREE( stream ); + } + + return error; + } + + + /* 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; + + 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 && sfnt_data[0] == 'O' && + sfnt_data[1] == 'T' && + sfnt_data[2] == 'T' && + sfnt_data[3] == 'O'; + + 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, + FT_MAKE_TAG( 'P', 'O', 'S', 'T' ), + &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, + FT_MAKE_TAG( 's', 'f', 'n', 't' ), + &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; + + + 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; + + + 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. */ + /* 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 /* !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; + FT_Face face = 0; + FT_ListNode node = 0; + FT_Bool external_stream; + + + /* 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 Exit; + + 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 */ + FT_Module* cur = library->modules; + FT_Module* 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; + + 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_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 ) + { + /* the factor 1.2 is a heuristical value */ + if ( !advance ) + advance = metrics->height * 12 / 10; + + metrics->vertBearingX = -( metrics->width / 2 ); + metrics->vertBearingY = ( advance - metrics->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 << 22; + metrics->y_scale = 1L << 22; + 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 << 22; + metrics->y_scale = 1L << 22; + } + } + + + /* 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; + + 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 ); + + + result = cmap->clazz->char_index( cmap, 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_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 && + glyph_index <= (FT_UInt)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; + + + 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, 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_Bad_Argument; + + face = size->face; + if ( face == NULL || face->driver == NULL ) + return FT_Err_Bad_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; + + /* 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; + + /* That's ok now */ + *alibrary = library; + + return FT_Err_Ok; + + Fail: + 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 ) ); + } + } + + /* 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; + + 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/src/WinLibs/freetype-2.3.5/src/base/ftotval.c b/src/WinLibs/freetype-2.3.5/src/base/ftotval.c new file mode 100644 index 000000000..b6de6db85 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/base/ftotval.c @@ -0,0 +1,83 @@ +/***************************************************************************/ +/* */ +/* ftotval.c */ +/* */ +/* FreeType API for validating OpenType tables (body). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + +#include <ft2build.h> +#include FT_INTERNAL_OBJECTS_H +#include FT_SERVICE_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/src/WinLibs/freetype-2.3.5/src/base/ftoutln.c b/src/WinLibs/freetype-2.3.5/src/base/ftoutln.c new file mode 100644 index 000000000..6926f3a09 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/base/ftoutln.c @@ -0,0 +1,1088 @@ +/***************************************************************************/ +/* */ +/* ftoutln.c */ +/* */ +/* FreeType outline management (body). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* All functions are declared in freetype.h. */ + /* */ + /*************************************************************************/ + + +#include <ft2build.h> +#include FT_OUTLINE_H +#include FT_INTERNAL_OBJECTS_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 */ + + + last = outline->contours[n]; + if ( last < 0 ) + goto Invalid_Outline; + limit = outline->points + last; + + v_start = outline->points[first]; + v_last = outline->points[last]; + + v_start.x = SCALED( v_start.x ); v_start.y = SCALED( v_start.y ); + 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--; + } + + 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 ); + + 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 ) + { + 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; + + error = func_interface->conic_to( &v_control, &v_middle, user ); + if ( error ) + goto Exit; + + v_control = vec; + goto Do_Conic; + } + + 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 ); + + error = func_interface->cubic_to( &vec1, &vec2, &vec, user ); + if ( error ) + goto Exit; + continue; + } + + error = func_interface->cubic_to( &vec1, &vec2, &v_start, user ); + goto Close; + } + } + } + + /* close the contour with a line segment */ + error = func_interface->line_to( &v_start, user ); + + Close: + if ( error ) + goto Exit; + + first = last + 1; + } + + return 0; + + Exit: + 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 * 2L ) || + 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 = outline->points; + + + if ( !outline ) + return; + + 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 = 0; + 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 = 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 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 ftoutln.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 == 32768 ) + return FT_ORIENTATION_TRUETYPE; + + ray_y[0] = ( xmin_ymin * 3 + xmin_ymax ) >> 2; + ray_y[1] = ( xmin_ymin + xmin_ymax ) >> 1; + ray_y[2] = ( xmin_ymin + xmin_ymax * 3 ) >> 2; + + for ( i = 0; i < 3; i++ ) + { + FT_Pos left_x; + FT_Pos right_x; + FT_Vector* left1; + FT_Vector* left2; + FT_Vector* right1; + FT_Vector* right2; + + + RedoRay: + left_x = 32768L; + right_x = -32768L; + + left1 = left2 = right1 = right2 = NULL; + + prev = xmin_last; + for ( point = xmin_first; point <= xmin_last; prev = point, ++point ) + { + FT_Pos tmp_x; + + + if ( point->y == ray_y[i] || prev->y == ray_y[i] ) + { + ray_y[i]++; + goto RedoRay; + } + + if ( ( point->y < ray_y[i] && prev->y < ray_y[i] ) || + ( point->y > ray_y[i] && prev->y > ray_y[i] ) ) + continue; + + tmp_x = FT_MulDiv( point->x - prev->x, + ray_y[i] - prev->y, + point->y - prev->y ) + prev->x; + + if ( tmp_x < left_x ) + { + left_x = tmp_x; + left1 = prev; + left2 = point; + } + + if ( tmp_x > right_x ) + { + right_x = tmp_x; + right1 = prev; + right2 = point; + } + } + + if ( left1 && right1 ) + { + if ( left1->y < left2->y && right1->y > right2->y ) + result[i] = FT_ORIENTATION_TRUETYPE; + else if ( left1->y > left2->y && right1->y < right2->y ) + result[i] = FT_ORIENTATION_POSTSCRIPT; + else + result[i] = FT_ORIENTATION_NONE; + } + } + + if ( result[0] != FT_ORIENTATION_NONE && + ( result[0] == result[1] || result[0] == result[2] ) ) + return result[0]; + + if ( result[1] != FT_ORIENTATION_NONE && result[1] == result[2] ) + return result[1]; + + return FT_ORIENTATION_TRUETYPE; + } + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/base/ftpatent.c b/src/WinLibs/freetype-2.3.5/src/base/ftpatent.c new file mode 100644 index 000000000..d63f191c3 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/base/ftpatent.c @@ -0,0 +1,281 @@ +/***************************************************************************/ +/* */ +/* ftpatent.c */ +/* */ +/* FreeType API for checking patented TrueType bytecode instructions */ +/* (body). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + +#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_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_Service_SFNT_Table service; + FT_Bool result = FALSE; + + + FT_FACE_FIND_SERVICE( face, service, SFNT_TABLE ); + + if ( service ) + { + FT_ULong offset, size; + + + error = service->table_info( face, tag, &offset, &size ); + if ( error || + FT_STREAM_SEEK( offset ) ) + goto Exit; + + result = _tt_check_patents_in_range( stream, size ); + } + + 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 = 0; + + +#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/src/WinLibs/freetype-2.3.5/src/base/ftpfr.c b/src/WinLibs/freetype-2.3.5/src/base/ftpfr.c new file mode 100644 index 000000000..9e930ddf7 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/base/ftpfr.c @@ -0,0 +1,132 @@ +/***************************************************************************/ +/* */ +/* ftpfr.c */ +/* */ +/* FreeType API for accessing PFR-specific data (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_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; + + + service = ft_pfr_check( face ); + if ( service ) + { + error = service->get_metrics( face, + aoutline_resolution, + ametrics_resolution, + ametrics_x_scale, + ametrics_y_scale ); + } + else if ( face ) + { + FT_Fixed x_scale, y_scale; + + + /* this is not a PFR font */ + *aoutline_resolution = face->units_per_EM; + *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; + } + *ametrics_x_scale = x_scale; + *ametrics_y_scale = y_scale; + } + else + error = FT_Err_Invalid_Argument; + + 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; + + + service = ft_pfr_check( face ); + if ( service ) + error = service->get_kerning( face, left, right, avector ); + else if ( face ) + error = FT_Get_Kerning( face, left, right, + FT_KERNING_UNSCALED, avector ); + else + error = FT_Err_Invalid_Argument; + + return error; + } + + + /* documentation is in ftpfr.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Get_PFR_Advance( FT_Face face, + FT_UInt gindex, + FT_Pos *aadvance ) + { + FT_Error error; + FT_Service_PfrMetrics service; + + + service = ft_pfr_check( face ); + if ( service ) + { + error = service->get_advance( face, gindex, aadvance ); + } + else + /* XXX: TODO: PROVIDE ADVANCE-LOADING METHOD TO ALL FONT DRIVERS */ + error = FT_Err_Invalid_Argument; + + return error; + } + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/base/ftrfork.c b/src/WinLibs/freetype-2.3.5/src/base/ftrfork.c new file mode 100644 index 000000000..a4f726d93 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/base/ftrfork.c @@ -0,0 +1,728 @@ +/***************************************************************************/ +/* */ +/* ftrfork.c */ +/* */ +/* Embedded resource forks accessor (body). */ +/* */ +/* Copyright 2004, 2005, 2006 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; + } + + + 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; + + + 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( offsets_internal, *count ) ) + return error; + + for ( j = 0; j < *count; ++j ) + { + (void)FT_STREAM_SKIP( 2 ); /* resource id */ + (void)FT_STREAM_SKIP( 2 ); /* rsource name */ + + if ( FT_READ_LONG( temp ) ) + { + FT_FREE( offsets_internal ); + return error; + } + + offsets_internal[j] = rdata_pos + ( temp & 0xFFFFFFL ); + + (void)FT_STREAM_SKIP( 4 ); /* mbz */ + } + + *offsets = offsets_internal; + + return FT_Err_Ok; + } + } + + 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_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_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; + errors[i] = FT_Stream_Seek( stream, 0 ); + 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; + 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; + 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 > 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_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 + FT_Stream_Skip( stream, 4 + 4 ); /* offset + length */ + } + + 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; + char* tmp; + const char* slash; + unsigned new_length; + FT_Error error = FT_Err_Ok; + + FT_UNUSED( error ); + + + new_length = ft_strlen( original_name ) + ft_strlen( insertion ); + if ( FT_ALLOC( new_name, new_length + 1 ) ) + return NULL; + + tmp = ft_strrchr( original_name, '/' ); + if ( tmp ) + { + ft_strncpy( new_name, original_name, tmp - original_name + 1 ); + new_name[tmp - original_name + 1] = '\0'; + slash = tmp + 1; + } + else + { + slash = original_name; + new_name[0] = '\0'; + } + + ft_strcat( new_name, insertion ); + ft_strcat( new_name, slash ); + + return new_name; + } + + +#else /* !FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK */ + + + /*************************************************************************/ + /* Dummy function; just sets errors */ + /*************************************************************************/ + + FT_BASE_DEF( void ) + FT_Raccess_Guess( FT_Library library, + FT_Stream stream, + char* base_name, + char **new_names, + FT_Long *offsets, + FT_Error *errors ) + { + int i; + + FT_UNUSED( library ); + FT_UNUSED( stream ); + FT_UNUSED( base_name ); + + + for ( i = 0; i < FT_RACCESS_N_RULES; i++ ) + { + new_names[i] = NULL; + offsets[i] = 0; + errors[i] = FT_Err_Unimplemented_Feature; + } + } + + +#endif /* !FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK */ + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/base/ftstream.c b/src/WinLibs/freetype-2.3.5/src/base/ftstream.c new file mode 100644 index 000000000..a067a1fde --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/base/ftstream.c @@ -0,0 +1,842 @@ +/***************************************************************************/ +/* */ +/* ftstream.c */ +/* */ +/* I/O stream support (body). */ +/* */ +/* Copyright 2000-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. */ +/* */ +/***************************************************************************/ + + +#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; + + + stream->pos = pos; + + 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; + } + + return error; + } + + + FT_BASE_DEF( FT_Error ) + FT_Stream_Skip( FT_Stream stream, + FT_Long distance ) + { + 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:" )); + FT_ERROR(( " 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->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:" )); + FT_ERROR(( " 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:" )); + FT_ERROR(( " 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:" )); + FT_ERROR(( " 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:" )); + FT_ERROR(( " 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:" )); + FT_ERROR(( " 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: + FT_ERROR(( "FT_Stream_ReadLong: invalid i/o; pos = 0x%lx, size = 0x%lx\n", + stream->pos, stream->size )); + *error = FT_Err_Invalid_Stream_Operation; + + 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: + FT_ERROR(( "FT_Stream_ReadLongLE:" )); + FT_ERROR(( " invalid i/o; pos = 0x%lx, size = 0x%lx\n", + stream->pos, stream->size )); + *error = FT_Err_Invalid_Stream_Operation; + + 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 = stream->cursor; + + + if ( !fields || !stream ) + return FT_Err_Invalid_Argument; + + error = FT_Err_Ok; + do + { + FT_ULong value; + FT_Int sign_shift; + FT_Byte* p; + + + switch ( fields->value ) + { + case ft_frame_start: /* access a new frame */ + error = FT_Stream_EnterFrame( stream, fields->offset ); + if ( error ) + goto Exit; + + frame_accessed = 1; + cursor = stream->cursor; + fields++; + continue; /* loop! */ + + case ft_frame_bytes: /* read a byte sequence */ + case ft_frame_skip: /* skip some bytes */ + { + FT_UInt len = fields->size; + + + if ( cursor + len > stream->limit ) + { + error = FT_Err_Invalid_Stream_Operation; + goto Exit; + } + + if ( fields->value == ft_frame_bytes ) + { + p = (FT_Byte*)structure + fields->offset; + FT_MEM_COPY( p, cursor, len ); + } + cursor += len; + fields++; + continue; + } + + case ft_frame_byte: + case ft_frame_schar: /* read a single byte */ + value = FT_NEXT_BYTE(cursor); + sign_shift = 24; + break; + + case ft_frame_short_be: + case ft_frame_ushort_be: /* read a 2-byte big-endian short */ + value = FT_NEXT_USHORT(cursor); + sign_shift = 16; + break; + + case ft_frame_short_le: + case ft_frame_ushort_le: /* read a 2-byte little-endian short */ + value = FT_NEXT_USHORT_LE(cursor); + sign_shift = 16; + break; + + case ft_frame_long_be: + case ft_frame_ulong_be: /* read a 4-byte big-endian long */ + value = FT_NEXT_ULONG(cursor); + sign_shift = 0; + break; + + case ft_frame_long_le: + case ft_frame_ulong_le: /* read a 4-byte little-endian long */ + value = FT_NEXT_ULONG_LE(cursor); + sign_shift = 0; + break; + + case ft_frame_off3_be: + case ft_frame_uoff3_be: /* read a 3-byte big-endian long */ + value = FT_NEXT_UOFF3(cursor); + sign_shift = 8; + break; + + case ft_frame_off3_le: + case ft_frame_uoff3_le: /* read a 3-byte little-endian long */ + value = FT_NEXT_UOFF3_LE(cursor); + sign_shift = 8; + break; + + default: + /* otherwise, exit the loop */ + stream->cursor = cursor; + goto Exit; + } + + /* now, compute the signed value is necessary */ + if ( fields->value & FT_FRAME_OP_SIGNED ) + value = (FT_ULong)( (FT_Int32)( value << sign_shift ) >> sign_shift ); + + /* finally, store the value in the object */ + + p = (FT_Byte*)structure + fields->offset; + switch ( fields->size ) + { + case (8 / FT_CHAR_BIT): + *(FT_Byte*)p = (FT_Byte)value; + break; + + case (16 / FT_CHAR_BIT): + *(FT_UShort*)p = (FT_UShort)value; + break; + + case (32 / FT_CHAR_BIT): + *(FT_UInt32*)p = (FT_UInt32)value; + break; + + default: /* for 64-bit systems */ + *(FT_ULong*)p = (FT_ULong)value; + } + + /* go to next field */ + fields++; + } + while ( 1 ); + + Exit: + /* close the frame if it was opened by this read */ + if ( frame_accessed ) + FT_Stream_ExitFrame( stream ); + + return error; + } + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/base/ftstroke.c b/src/WinLibs/freetype-2.3.5/src/base/ftstroke.c new file mode 100644 index 000000000..8f7e0459d --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/base/ftstroke.c @@ -0,0 +1,2010 @@ +/***************************************************************************/ +/* */ +/* ftstroke.c */ +/* */ +/* FreeType path stroker (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_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_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 = 0; + + + 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 = 0; + } + + + static FT_Error + ft_stroke_border_lineto( FT_StrokeBorder border, + FT_Vector* to, + FT_Bool movable ) + { + FT_Error error = 0; + + + 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 = 0; + 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 = 0; + 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 = 0; + + + /* 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, 0 ); + + border->start = border->num_points; + border->movable = 0; + + return ft_stroke_border_lineto( border, to, 0 ); + } + + + 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 = 0; + } + + + static void + ft_stroke_border_reset( FT_StrokeBorder border ) + { + border->num_points = 0; + border->start = -1; + border->valid = 0; + } + + + 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 = 0; + } + + + static FT_Error + ft_stroke_border_get_counts( FT_StrokeBorder border, + FT_UInt *anum_points, + FT_UInt *anum_contours ) + { + FT_Error error = 0; + 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 ) + { + if ( in_contour == 0 ) + goto Fail; + + in_contour = 0; + num_contours++; + } + } + + if ( in_contour != 0 ) + goto Fail; + + border->valid = 1; + + 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_Memory memory; + + } 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->memory = memory; + + 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->memory; + + + ft_stroke_border_done( &stroker->borders[0] ); + ft_stroke_border_done( &stroker->borders[1] ); + + stroker->memory = 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 = 0; + 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 = 0; + 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 = 0; + + + 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, 0 ); + 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, 0 ); + } + + 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 = 0; + + + 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 = 0; + } + 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, 0 ); + + 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 ); + + if ( sigma >= 0x10000L ) + miter = 0; + + 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, 0 ); + 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, 0 ); + 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, 1 ); + } + + 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, 0 ); + 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, 1 ); + } + } + + Exit: + return error; + } + + + static FT_Error + ft_stroker_process_corner( FT_Stroker stroker ) + { + FT_Error error = 0; + 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 = 0; + + 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 = 0; + 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, 1 ); + 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 = 0; + FT_Vector bez_stack[34]; + FT_Vector* arc; + FT_Vector* limit = bez_stack + 30; + FT_Angle start_angle; + FT_Bool first_arc = 1; + + + 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 = 0; + + 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 = 0; + FT_Vector bez_stack[37]; + FT_Vector* arc; + FT_Vector* limit = bez_stack + 32; + FT_Angle start_angle; + FT_Bool first_arc = 1; + + + 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 = 0; + + /* 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 "end_subpath" routine. */ + /* */ + stroker->first_point = 1; + stroker->center = *to; + stroker->subpath_open = open; + + /* record the subpath start point index for each border */ + stroker->subpath_start = *to; + return 0; + } + + + 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 = 0; + + + 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 = 0; + left->movable = 0; + } + + 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 = 0; + + 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, 1 ); + 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, 0 ); + } + 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, 1 ); + ft_stroke_border_close( stroker->borders + 1, 0 ); + } + + 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 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--; + } + + 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 0; + + Exit: + return error; + + Invalid_Outline: + return FT_Err_Invalid_Outline; + } + + + extern const FT_Glyph_Class ft_outline_glyph_class; + + + /* 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; + + + if ( pglyph == NULL ) + goto Exit; + + glyph = *pglyph; + if ( glyph == NULL || glyph->clazz != &ft_outline_glyph_class ) + 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, 0 ); + 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; + + + if ( pglyph == NULL ) + goto Exit; + + glyph = *pglyph; + if ( glyph == NULL || glyph->clazz != &ft_outline_glyph_class ) + 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, 0 ); + if ( error ) + goto Fail; + + (void)FT_Stroker_GetBorderCounts( stroker, border, + &num_points, &num_contours ); + + FT_Outline_Done( glyph->library, outline ); + + error = FT_Outline_New( glyph->library, + num_points, + num_contours, + outline ); + if ( error ) + goto Fail; + + outline->n_points = 0; + outline->n_contours = 0; + + FT_Stroker_ExportBorder( stroker, border, outline ); + } + + if ( destroy ) + FT_Done_Glyph( *pglyph ); + + *pglyph = glyph; + goto Exit; + + Fail: + FT_Done_Glyph( glyph ); + glyph = NULL; + + if ( !destroy ) + *pglyph = NULL; + + Exit: + return error; + } + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/base/ftsynth.c b/src/WinLibs/freetype-2.3.5/src/base/ftsynth.c new file mode 100644 index 000000000..ff88ce96c --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/base/ftsynth.c @@ -0,0 +1,159 @@ +/***************************************************************************/ +/* */ +/* ftsynth.c */ +/* */ +/* FreeType synthesizing code for emboldening and slanting (body). */ +/* */ +/* Copyright 2000-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. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_SYNTHESIS_H +#include FT_INTERNAL_OBJECTS_H +#include FT_OUTLINE_H +#include FT_BITMAP_H + + + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** 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 ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + + + 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 ftsynth.h */ + + FT_EXPORT_DEF( void ) + FT_GlyphSlot_Embolden( FT_GlyphSlot slot ) + { + FT_Library library = slot->library; + FT_Face face = FT_SLOT_FACE( slot ); + 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 ) + { + error = FT_Outline_Embolden( &slot->outline, xstr ); + /* ignore error */ + + /* 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 ) + { + xstr = FT_PIX_FLOOR( xstr ); + if ( xstr == 0 ) + xstr = 1 << 6; + ystr = FT_PIX_FLOOR( ystr ); + + 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; + + if ( slot->format == FT_GLYPH_FORMAT_BITMAP ) + slot->bitmap_top += ystr >> 6; + } + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/base/ftsystem.c b/src/WinLibs/freetype-2.3.5/src/base/ftsystem.c new file mode 100644 index 000000000..f61a3edfb --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/base/ftsystem.c @@ -0,0 +1,301 @@ +/***************************************************************************/ +/* */ +/* ftsystem.c */ +/* */ +/* ANSI-specific FreeType low-level system interface (body). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + /*************************************************************************/ + /* */ + /* 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 ); + + 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:" )); + FT_ERROR(( " 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 + memory->free( memory, memory ); + } + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/base/fttrigon.c b/src/WinLibs/freetype-2.3.5/src/base/fttrigon.c new file mode 100644 index 000000000..9f513946b --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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_TRIG_SCALE >> 16; /* constant */ + k2 = 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 += 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 = 1L << ( shift - 1 ); + + + vec->x = ( v.x + half + FT_SIGN_LONG( v.x ) ) >> shift; + vec->y = ( v.y + half + FT_SIGN_LONG( v.y ) ) >> shift; + } + else + { + shift = -shift; + vec->x = v.x << shift; + vec->y = v.y << shift; + } + } + } + + + /* documentation is in fttrigon.h */ + + FT_EXPORT_DEF( FT_Fixed ) + FT_Vector_Length( FT_Vector* vec ) + { + FT_Int shift; + FT_Vector v; + + + v = *vec; + + /* handle trivial cases */ + if ( v.x == 0 ) + { + return ( v.y >= 0 ) ? v.y : -v.y; + } + else if ( v.y == 0 ) + { + return ( v.x >= 0 ) ? v.x : -v.x; + } + + /* general case */ + shift = ft_trig_prenorm( &v ); + ft_trig_pseudo_polarize( &v ); + + v.x = ft_trig_downscale( v.x ); + + if ( shift > 0 ) + return ( v.x + ( 1 << ( shift - 1 ) ) ) >> shift; + + return v.x << -shift; + } + + + /* documentation is in fttrigon.h */ + + FT_EXPORT_DEF( void ) + FT_Vector_Polarize( FT_Vector* vec, + FT_Fixed *length, + FT_Angle *angle ) + { + FT_Int shift; + FT_Vector v; + + + v = *vec; + + if ( v.x == 0 && v.y == 0 ) + return; + + shift = ft_trig_prenorm( &v ); + ft_trig_pseudo_polarize( &v ); + + v.x = ft_trig_downscale( v.x ); + + *length = ( shift >= 0 ) ? ( v.x >> shift ) : ( v.x << -shift ); + *angle = v.y; + } + + + /* documentation is in fttrigon.h */ + + FT_EXPORT_DEF( void ) + FT_Vector_From_Polar( FT_Vector* vec, + FT_Fixed length, + FT_Angle angle ) + { + vec->x = length; + vec->y = 0; + + FT_Vector_Rotate( vec, angle ); + } + + + /* documentation is in fttrigon.h */ + + FT_EXPORT_DEF( FT_Angle ) + FT_Angle_Diff( FT_Angle angle1, + FT_Angle angle2 ) + { + FT_Angle delta = angle2 - angle1; + + + delta %= FT_ANGLE_2PI; + if ( delta < 0 ) + delta += FT_ANGLE_2PI; + + if ( delta > FT_ANGLE_PI ) + delta -= FT_ANGLE_2PI; + + return delta; + } + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/base/fttype1.c b/src/WinLibs/freetype-2.3.5/src/base/fttype1.c new file mode 100644 index 000000000..3975584db --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/src/base/ftutil.c b/src/WinLibs/freetype-2.3.5/src/base/ftutil.c new file mode 100644 index 000000000..5f77be557 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/src/base/ftwinfnt.c b/src/WinLibs/freetype-2.3.5/src/base/ftwinfnt.c new file mode 100644 index 000000000..bc2e90e1f --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/src/base/ftxf86.c b/src/WinLibs/freetype-2.3.5/src/base/ftxf86.c new file mode 100644 index 000000000..a4bf767df --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/src/base/rules.mk b/src/WinLibs/freetype-2.3.5/src/base/rules.mk new file mode 100644 index 000000000..d6e441254 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/base/rules.mk @@ -0,0 +1,90 @@ +# +# FreeType 2 base layer configuration rules +# + + +# Copyright 1996-2000, 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. + + +# 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_H is defined in freetype.mk to simplify the dependency rules. + + +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)/ftcalc.c \ + $(BASE_DIR)/ftdbgmem.c \ + $(BASE_DIR)/ftgloadr.c \ + $(BASE_DIR)/ftnames.c \ + $(BASE_DIR)/ftobjs.c \ + $(BASE_DIR)/ftoutln.c \ + $(BASE_DIR)/ftrfork.c \ + $(BASE_DIR)/ftstream.c \ + $(BASE_DIR)/fttrigon.c \ + $(BASE_DIR)/ftutil.c + +# 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_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(BASE_SRC_S)) + + +# Multiple objects build + extensions +# +$(OBJ_DIR)/%.$O: $(BASE_DIR)/%.c $(FREETYPE_H) + $(BASE_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<) + + +# EOF diff --git a/src/WinLibs/freetype-2.3.5/src/bdf/Jamfile b/src/WinLibs/freetype-2.3.5/src/bdf/Jamfile new file mode 100644 index 000000000..da23ccd0a --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/src/bdf/README b/src/WinLibs/freetype-2.3.5/src/bdf/README new file mode 100644 index 000000000..e3f2ae386 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/src/bdf/bdf.c b/src/WinLibs/freetype-2.3.5/src/bdf/bdf.c new file mode 100644 index 000000000..f95fb7622 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/bdf/bdf.c @@ -0,0 +1,34 @@ +/* bdf.c + + FreeType font driver for bdf files + + Copyright (C) 2001, 2002 by + Francesco Zappa Nardelli + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +*/ + +#define FT_MAKE_OPTION_SINGLE_OBJECT + +#include <ft2build.h> +#include "bdflib.c" +#include "bdfdrivr.c" + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/bdf/bdf.h b/src/WinLibs/freetype-2.3.5/src/bdf/bdf.h new file mode 100644 index 000000000..1b64426aa --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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 int32; + unsigned long card32; + + } 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; + void* 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/src/WinLibs/freetype-2.3.5/src/bdf/bdfdrivr.c b/src/WinLibs/freetype-2.3.5/src/bdf/bdfdrivr.c new file mode 100644 index 000000000..74cc2f1b8 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/bdf/bdfdrivr.c @@ -0,0 +1,848 @@ +/* bdfdrivr.c + + FreeType font driver for bdf files + + Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007 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_UInt num_encodings; + 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_UInt min, max, mid; + FT_UInt result = 0; + + + min = 0; + max = cmap->num_encodings; + + while ( min < max ) + { + FT_UInt32 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_UInt min, max, mid; + FT_UInt32 charcode = *acharcode + 1; + FT_UInt result = 0; + + + min = 0; + max = cmap->num_encodings; + + while ( min < max ) + { + FT_UInt32 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; + 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: + *acharcode = 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 + }; + + + 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; + + int nn, len; + char* strings[4] = { NULL, NULL, NULL, NULL }; + int 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 ) + { + int 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 = 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.int32 + 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.int32 * 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.int32 << 6; + + prop = bdf_get_font_property( font, "RESOLUTION_X" ); + if ( prop ) + resolution_x = (FT_Short)prop->value.int32; + + prop = bdf_get_font_property( font, "RESOLUTION_Y" ); + if ( prop ) + resolution_y = (FT_Short)prop->value.int32; + + 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 ) + face->default_glyph = 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; + bitmap->pitch = glyph.bpr; + + /* 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: + aproperty->type = BDF_PROPERTY_TYPE_INTEGER; + aproperty->u.integer = prop->value.int32; + break; + + case BDF_CARDINAL: + aproperty->type = BDF_PROPERTY_TYPE_CARDINAL; + aproperty->u.cardinal = prop->value.card32; + 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/src/WinLibs/freetype-2.3.5/src/bdf/bdfdrivr.h b/src/WinLibs/freetype-2.3.5/src/bdf/bdfdrivr.h new file mode 100644 index 000000000..86f40ee4a --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/bdf/bdfdrivr.h @@ -0,0 +1,76 @@ +/* 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 + + + typedef struct BDF_encoding_el_ + { + FT_ULong enc; + FT_UShort glyph; + + } BDF_encoding_el; + + + typedef struct BDF_FaceRec_ + { + FT_FaceRec root; + + char* charset_encoding; + char* charset_registry; + + bdf_font_t* bdffont; + + BDF_encoding_el* en_table; + + FT_CharMap charmap_handle; + FT_CharMapRec charmap; /* a single charmap per face */ + + FT_UInt default_glyph; + + } BDF_FaceRec, *BDF_Face; + + + FT_EXPORT_VAR( const FT_Driver_ClassRec ) bdf_driver_class; + + +FT_END_HEADER + + +#endif /* __BDFDRIVR_H__ */ + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/bdf/bdferror.h b/src/WinLibs/freetype-2.3.5/src/bdf/bdferror.h new file mode 100644 index 000000000..b27fa333b --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/src/bdf/bdflib.c b/src/WinLibs/freetype-2.3.5/src/bdf/bdflib.c new file mode 100644 index 000000000..512cd62c3 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/bdf/bdflib.c @@ -0,0 +1,2472 @@ +/* + * Copyright 2000 Computing Research Labs, New Mexico State University + * Copyright 2001, 2002, 2003, 2004, 2005, 2006, 2007 + * 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, + void* 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, + int num_items ) + { + FT_Error error = BDF_Err_Ok; + + + if ( num_items > (int)list->size ) + { + int oldsize = list->size; + int newsize = oldsize + ( oldsize >> 1 ) + 4; + int bigsize = 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, bytes, hold, to_skip; + int 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 = (int)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 ) + { + unsigned long 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 = (unsigned long)( ft_strlen( name ) + 1 ); + + 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, (void *)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; + unsigned long propid; + + + if ( name == 0 || *name == 0 ) + return 0; + + if ( ( hn = hash_lookup( name, &(font->proptbl) ) ) == 0 ) + return 0; + + propid = (unsigned long)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 ) + { + unsigned long 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 = (unsigned long)( 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 ) + { + unsigned long 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 + (unsigned long)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.int32 = _bdf_atol( value, 0, 10 ); + break; + + case BDF_CARDINAL: + fp->value.card32 = _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 = (unsigned long)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.int32 = _bdf_atol( value, 0, 10 ); + break; + + case BDF_CARDINAL: + fp->value.card32 = _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, + (void *)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.int32; + else if ( ft_memcmp( name, "FONT_ASCENT", 11 ) == 0 ) + font->font_ascent = fp->value.int32; + else if ( ft_memcmp( name, "FONT_DESCENT", 12 ) == 0 ) + font->font_descent = fp->value.int32; + else if ( ft_memcmp( name, "SPACING", 7 ) == 0 ) + { + 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 */ + unsigned long 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, (void *)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; + 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 + (unsigned long)hn->data ) : 0; + } + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/bdf/module.mk b/src/WinLibs/freetype-2.3.5/src/bdf/module.mk new file mode 100644 index 000000000..dfaa2744e --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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)bdf_driver_class$(CLOSE_DRIVER) +$(ECHO_DRIVER)bdf $(ECHO_DRIVER_DESC)bdf bitmap fonts$(ECHO_DRIVER_DONE) +endef + +# EOF diff --git a/src/WinLibs/freetype-2.3.5/src/bdf/rules.mk b/src/WinLibs/freetype-2.3.5/src/bdf/rules.mk new file mode 100644 index 000000000..25d98e55b --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/bdf/rules.mk @@ -0,0 +1,80 @@ +# +# FreeType 2 bdf driver configuration rules +# + + +# Copyright (C) 2001, 2002, 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. + + + + +# 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 driver object(s) +# +# BDF_DRV_OBJ_M is used during `multi' builds +# BDF_DRV_OBJ_S is used during `single' builds +# +BDF_DRV_OBJ_M := $(BDF_DRV_SRC:$(BDF_DIR)/%.c=$(OBJ_DIR)/%.$O) +BDF_DRV_OBJ_S := $(OBJ_DIR)/bdf.$O + +# bdf driver source file for single build +# +BDF_DRV_SRC_S := $(BDF_DIR)/bdf.c + + +# bdf driver - single object +# +$(BDF_DRV_OBJ_S): $(BDF_DRV_SRC_S) $(BDF_DRV_SRC) $(FREETYPE_H) $(BDF_DRV_H) + $(BDF_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(BDF_DRV_SRC_S)) + + +# bdf driver - multiple objects +# +$(OBJ_DIR)/%.$O: $(BDF_DIR)/%.c $(FREETYPE_H) $(BDF_DRV_H) + $(BDF_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<) + + +# update main driver object lists +# +DRV_OBJS_S += $(BDF_DRV_OBJ_S) +DRV_OBJS_M += $(BDF_DRV_OBJ_M) + + +# EOF diff --git a/src/WinLibs/freetype-2.3.5/src/cache/Jamfile b/src/WinLibs/freetype-2.3.5/src/cache/Jamfile new file mode 100644 index 000000000..340cff774 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/src/cache/ftcache.c b/src/WinLibs/freetype-2.3.5/src/cache/ftcache.c new file mode 100644 index 000000000..d41e91e5e --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/cache/ftcache.c @@ -0,0 +1,31 @@ +/***************************************************************************/ +/* */ +/* ftcache.c */ +/* */ +/* The FreeType Caching sub-system (body only). */ +/* */ +/* Copyright 2000-2001, 2003 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#define FT_MAKE_OPTION_SINGLE_OBJECT + +#include <ft2build.h> +#include "ftcmru.c" +#include "ftcmanag.c" +#include "ftccache.c" +#include "ftccmap.c" +#include "ftcglyph.c" +#include "ftcimage.c" +#include "ftcsbits.c" +#include "ftcbasic.c" + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/cache/ftcbasic.c b/src/WinLibs/freetype-2.3.5/src/cache/ftcbasic.c new file mode 100644 index 000000000..a568b975b --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/cache/ftcbasic.c @@ -0,0 +1,811 @@ +/***************************************************************************/ +/* */ +/* ftcbasic.c */ +/* */ +/* The FreeType basic cache interface (body). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_CACHE_H +#include "ftcglyph.h" +#include "ftcimage.h" +#include "ftcsbits.h" +#include FT_INTERNAL_MEMORY_H + +#include "ftccback.h" +#include "ftcerror.h" + + +#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 ) + result = 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_INode 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; + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + + /* + * 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 ( type->width >= 0x10000 ) + { + 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 */ + + { + query.attrs.scaler.face_id = type->face_id; + query.attrs.scaler.width = type->width; + query.attrs.scaler.height = type->height; + query.attrs.load_flags = 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 ), + (FTC_Node*) &node ); +#endif + if ( !error ) + { + *aglyph = FTC_INODE( node )->glyph; + + if ( anode ) + { + *anode = FTC_NODE( node ); + FTC_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_INode 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; + + query.attrs.scaler = scaler[0]; + query.attrs.load_flags = 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 = FTC_NODE( node ); + FTC_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_SNode 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; + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + + /* 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 ( type->width >= 0x10000 ) + { + 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 */ + + { + query.attrs.scaler.face_id = type->face_id; + query.attrs.scaler.width = type->width; + query.attrs.scaler.height = type->height; + query.attrs.load_flags = 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 ), + (FTC_Node*)&node ); +#endif + if ( error ) + goto Exit; + + *ansbit = node->sbits + ( gindex - FTC_GNODE( node )->gindex ); + + if ( anode ) + { + *anode = FTC_NODE( node ); + FTC_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_SNode 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; + + query.attrs.scaler = scaler[0]; + query.attrs.load_flags = 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 = node->sbits + ( gindex - FTC_GNODE( node )->gindex ); + + if ( anode ) + { + *anode = FTC_NODE( node ); + FTC_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/src/WinLibs/freetype-2.3.5/src/cache/ftccache.c b/src/WinLibs/freetype-2.3.5/src/cache/ftccache.c new file mode 100644 index 000000000..f3e699c38 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/cache/ftccache.c @@ -0,0 +1,592 @@ +/***************************************************************************/ +/* */ +/* ftccache.c */ +/* */ +/* The FreeType internal cache interface (body). */ +/* */ +/* Copyright 2000-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. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include "ftcmanag.h" +#include FT_INTERNAL_OBJECTS_H +#include FT_INTERNAL_DEBUG_H + +#include "ftccback.h" +#include "ftcerror.h" + + +#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_UInt p = cache->p; + FT_UInt mask = cache->mask; + FT_UInt 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_UInt 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_ERROR(( "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_ERROR(( "ftc_node_destroy: invalid node handle\n" )); + return; + } +#endif + + cache = manager->caches[node->cache_index]; + +#ifdef FT_DEBUG_ERROR + if ( cache == NULL ) + { + FT_ERROR(( "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_ERROR(( "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_UInt 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/src/WinLibs/freetype-2.3.5/src/cache/ftccache.h b/src/WinLibs/freetype-2.3.5/src/cache/ftccache.h new file mode 100644 index 000000000..8c0a7c94f --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/cache/ftccache.h @@ -0,0 +1,317 @@ +/***************************************************************************/ +/* */ +/* ftccache.h */ +/* */ +/* FreeType internal cache interface (specification). */ +/* */ +/* Copyright 2000-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 __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_ULong + (*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_UInt 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_UInt _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: \ + _pnode = (FTC_Node*)(void*)&(node); \ + *_pnode = _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/src/WinLibs/freetype-2.3.5/src/cache/ftccback.h b/src/WinLibs/freetype-2.3.5/src/cache/ftccback.h new file mode 100644 index 000000000..86e72a751 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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_ULong ) + 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_ULong ) + 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/src/WinLibs/freetype-2.3.5/src/cache/ftccmap.c b/src/WinLibs/freetype-2.3.5/src/cache/ftccmap.c new file mode 100644 index 000000000..aa59307f4 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/cache/ftccmap.c @@ -0,0 +1,413 @@ +/***************************************************************************/ +/* */ +/* ftccmap.c */ +/* */ +/* FreeType CharMap cache (body) */ +/* */ +/* Copyright 2000-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. */ +/* */ +/***************************************************************************/ + + +#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 FT_TRUETYPE_IDS_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 ) + \ + ( (char_code) / 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_ULong ) + 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_CMapNode node; + FT_Error error; + FT_UInt gindex = 0; + FT_UInt32 hash; + + + if ( !cache ) + { + FT_ERROR(( "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 ) + { + 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, (FTC_Node*) &node ); +#endif + if ( error ) + goto Exit; + + FT_ASSERT( (FT_UInt)( char_code - node->first ) < FTC_CMAP_INDICES_MAX ); + + /* something rotten can happen with rogue clients */ + if ( (FT_UInt)( char_code - node->first >= FTC_CMAP_INDICES_MAX ) ) + return 0; + + gindex = node->indices[char_code - node->first]; + if ( gindex == FTC_CMAP_UNKNOWN ) + { + FT_Face face; + + + gindex = 0; + + error = FTC_Manager_LookupFace( cache->manager, 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 ) + FT_Set_Charmap( face, cmap ); + + gindex = FT_Get_Char_Index( face, char_code ); + + if ( old != cmap ) + FT_Set_Charmap( face, old ); + } + + node->indices[char_code - node->first] = (FT_UShort)gindex; + } + + Exit: + return gindex; + } + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/cache/ftcerror.h b/src/WinLibs/freetype-2.3.5/src/cache/ftcerror.h new file mode 100644 index 000000000..5998d42da --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/src/cache/ftcglyph.c b/src/WinLibs/freetype-2.3.5/src/cache/ftcglyph.c new file mode 100644 index 000000000..5c03abe05 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/cache/ftcglyph.c @@ -0,0 +1,211 @@ +/***************************************************************************/ +/* */ +/* ftcglyph.c */ +/* */ +/* FreeType Glyph Image (FT_Glyph) 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 "ftcglyph.h" +#include FT_ERRORS_H +#include FT_INTERNAL_OBJECTS_H +#include FT_INTERNAL_DEBUG_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/src/WinLibs/freetype-2.3.5/src/cache/ftcglyph.h b/src/WinLibs/freetype-2.3.5/src/cache/ftcglyph.h new file mode 100644 index 000000000..87a4199bf --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/cache/ftcglyph.h @@ -0,0 +1,322 @@ +/***************************************************************************/ +/* */ +/* 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); \ + \ + \ + _gquery->gindex = (gindex); \ + \ + FTC_MRULIST_LOOKUP_CMP( &_gcache->families, _gquery, _fcompare, \ + _gquery->family, error ); \ + 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 \ + void* _n = &(node); \ + \ + \ + error = FTC_GCache_Lookup( FTC_GCACHE( cache ), hash, gindex, \ + FTC_GQUERY( query ), (FTC_Node*)_n ); \ + FT_END_STMNT + +#endif /* !FTC_INLINE */ + + +FT_END_HEADER + + +#endif /* __FTCGLYPH_H__ */ + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/cache/ftcimage.c b/src/WinLibs/freetype-2.3.5/src/cache/ftcimage.c new file mode 100644 index 000000000..15d4e80c8 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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_ULong ) + ftc_inode_weight( FTC_Node ftcinode, + FTC_Cache ftccache ) + { + FTC_INode inode = (FTC_INode)ftcinode; + FT_ULong 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_ULong ) + FTC_INode_Weight( FTC_INode inode ) + { + return ftc_inode_weight( FTC_NODE( inode ), NULL ); + } + +#endif /* 0 */ + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/cache/ftcimage.h b/src/WinLibs/freetype-2.3.5/src/cache/ftcimage.h new file mode 100644 index 000000000..20d5d3e07 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/src/cache/ftcmanag.c b/src/WinLibs/freetype-2.3.5/src/cache/ftcmanag.c new file mode 100644 index 000000000..9d7347c3d --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/cache/ftcmanag.c @@ -0,0 +1,732 @@ +/***************************************************************************/ +/* */ +/* ftcmanag.c */ +/* */ +/* FreeType Cache Manager (body). */ +/* */ +/* Copyright 2000-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. */ +/* */ +/***************************************************************************/ + + +#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" + + +#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; + + + 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_SizeNode node; + + + if ( asize == NULL ) + return FTC_Err_Bad_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, + node, error ); + +#else + error = FTC_MruList_Lookup( &manager->sizes, scaler, (FTC_MruNode*)&node ); +#endif + + if ( !error ) + *asize = node->size; + + return error; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** FACE MRU IMPLEMENTATION *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + typedef struct FTC_FaceNodeRec_ + { + FTC_MruNodeRec node; + FTC_FaceID face_id; + FT_Face face; + + } FTC_FaceNodeRec, *FTC_FaceNode; + + + 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_FaceNode node; + + + if ( aface == NULL ) + return FTC_Err_Bad_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, + node, error ); + +#else + error = FTC_MruList_Lookup( &manager->faces, face_id, (FTC_MruNode*)&node ); +#endif + + if ( !error ) + *aface = node->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_ERROR(( "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_ERROR(( "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_ERROR(( + "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_ERROR(( "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(( "%s: too many registered caches\n", + "FTC_Manager_Register_Cache" )); + 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: + *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, 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/src/WinLibs/freetype-2.3.5/src/cache/ftcmanag.h b/src/WinLibs/freetype-2.3.5/src/cache/ftcmanag.h new file mode 100644 index 000000000..3fdc2c773 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/src/cache/ftcmru.c b/src/WinLibs/freetype-2.3.5/src/cache/ftcmru.c new file mode 100644 index 000000000..3a6c625af --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/cache/ftcmru.c @@ -0,0 +1,357 @@ +/***************************************************************************/ +/* */ +/* ftcmru.c */ +/* */ +/* FreeType MRU support (body). */ +/* */ +/* Copyright 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 "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/src/WinLibs/freetype-2.3.5/src/cache/ftcmru.h b/src/WinLibs/freetype-2.3.5/src/cache/ftcmru.h new file mode 100644 index 000000000..c8f0c6ef6 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/cache/ftcmru.h @@ -0,0 +1,247 @@ +/***************************************************************************/ +/* */ +/* 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_UInt 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, *_pnode; \ + \ + \ + error = 0; \ + _first = *(_pfirst); \ + _node = NULL; \ + \ + if ( _first ) \ + { \ + _node = _first; \ + do \ + { \ + if ( _compare( _node, (key) ) ) \ + { \ + if ( _node != _first ) \ + FTC_MruNode_Up( _pfirst, _node ); \ + \ + _pnode = (FTC_MruNode*)(void*)&(node); \ + *_pnode = _node; \ + goto _MruOk; \ + } \ + _node = _node->next; \ + \ + } while ( _node != _first) ; \ + } \ + \ + error = FTC_MruList_New( (list), (key), (FTC_MruNode*)(void*)&(node) ); \ + _MruOk: \ + ; \ + FT_END_STMNT + +#define FTC_MRULIST_LOOKUP( list, key, node, error ) \ + FTC_MRULIST_LOOKUP_CMP( list, key, (list)->clazz.node_compare, node, error ) + +#else /* !FTC_INLINE */ + + FT_LOCAL( FTC_MruNode ) + FTC_MruList_Find( FTC_MruList list, + FT_Pointer key ); + + FT_LOCAL( FT_Error ) + FTC_MruList_Lookup( FTC_MruList list, + FT_Pointer key, + FTC_MruNode *pnode ); + +#define FTC_MRULIST_LOOKUP( list, key, node, error ) \ + error = FTC_MruList_Lookup( (list), (key), (FTC_MruNode*)&(node) ) + +#endif /* !FTC_INLINE */ + + +#define FTC_MRULIST_LOOP( list, node ) \ + FT_BEGIN_STMNT \ + FTC_MruNode _first = (list)->nodes; \ + \ + \ + if ( _first ) \ + { \ + FTC_MruNode _node = _first; \ + \ + \ + do \ + { \ + *(FTC_MruNode*)&(node) = _node; + + +#define FTC_MRULIST_LOOP_END() \ + _node = _node->next; \ + \ + } while ( _node != _first ); \ + } \ + FT_END_STMNT + + /* */ + +FT_END_HEADER + + +#endif /* __FTCMRU_H__ */ + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/cache/ftcsbits.c b/src/WinLibs/freetype-2.3.5/src/cache/ftcsbits.c new file mode 100644 index 000000000..72f139d56 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/cache/ftcsbits.c @@ -0,0 +1,401 @@ +/***************************************************************************/ +/* */ +/* ftcsbits.c */ +/* */ +/* FreeType sbits manager (body). */ +/* */ +/* Copyright 2000-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. */ +/* */ +/***************************************************************************/ + + +#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" + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** 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_Int xadvance, yadvance; + + + if ( slot->format != FT_GLYPH_FORMAT_BITMAP ) + { + FT_ERROR(( "%s: glyph loaded didn't return a bitmap!\n", + "ftc_snode_load" )); + 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_ULong ) + 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_ULong 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_ULong ) + 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/src/WinLibs/freetype-2.3.5/src/cache/ftcsbits.h b/src/WinLibs/freetype-2.3.5/src/cache/ftcsbits.h new file mode 100644 index 000000000..6261745f1 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/src/cache/rules.mk b/src/WinLibs/freetype-2.3.5/src/cache/rules.mk new file mode 100644 index 000000000..457dec848 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/cache/rules.mk @@ -0,0 +1,78 @@ +# +# FreeType 2 Cache configuration rules +# + + +# 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. + + +# 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)/ftccback.h \ + $(CACHE_DIR)/ftcerror.h \ + $(CACHE_DIR)/ftcglyph.h \ + $(CACHE_DIR)/ftcimage.h \ + $(CACHE_DIR)/ftcmanag.h \ + $(CACHE_DIR)/ftcmru.h + + +# Cache driver object(s) +# +# CACHE_DRV_OBJ_M is used during `multi' builds. +# CACHE_DRV_OBJ_S is used during `single' builds. +# +CACHE_DRV_OBJ_M := $(CACHE_DRV_SRC:$(CACHE_DIR)/%.c=$(OBJ_DIR)/%.$O) +CACHE_DRV_OBJ_S := $(OBJ_DIR)/ftcache.$O + +# Cache driver source file for single build +# +CACHE_DRV_SRC_S := $(CACHE_DIR)/ftcache.c + + +# Cache driver - single object +# +$(CACHE_DRV_OBJ_S): $(CACHE_DRV_SRC_S) $(CACHE_DRV_SRC) \ + $(FREETYPE_H) $(CACHE_DRV_H) + $(CACHE_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(CACHE_DRV_SRC_S)) + + +# Cache driver - multiple objects +# +$(OBJ_DIR)/%.$O: $(CACHE_DIR)/%.c $(FREETYPE_H) $(CACHE_DRV_H) + $(CACHE_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<) + + +# update main driver object lists +# +DRV_OBJS_S += $(CACHE_DRV_OBJ_S) +DRV_OBJS_M += $(CACHE_DRV_OBJ_M) + + +# EOF diff --git a/src/WinLibs/freetype-2.3.5/src/cff/Jamfile b/src/WinLibs/freetype-2.3.5/src/cff/Jamfile new file mode 100644 index 000000000..6d0bb1b86 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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 ; + } + else + { + _sources = cff ; + } + + Library $(FT2_LIB) : $(_sources).c ; +} + +# end of src/cff Jamfile diff --git a/src/WinLibs/freetype-2.3.5/src/cff/cff.c b/src/WinLibs/freetype-2.3.5/src/cff/cff.c new file mode 100644 index 000000000..e6d8954c9 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/cff/cff.c @@ -0,0 +1,29 @@ +/***************************************************************************/ +/* */ +/* cff.c */ +/* */ +/* FreeType OpenType driver component (body only). */ +/* */ +/* Copyright 1996-2001, 2002 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#define FT_MAKE_OPTION_SINGLE_OBJECT + +#include <ft2build.h> +#include "cffdrivr.c" +#include "cffparse.c" +#include "cffload.c" +#include "cffobjs.c" +#include "cffgload.c" +#include "cffcmap.c" + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/cff/cffcmap.c b/src/WinLibs/freetype-2.3.5/src/cff/cffcmap.c new file mode 100644 index 000000000..fffc5fc55 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/cff/cffcmap.c @@ -0,0 +1,220 @@ +/***************************************************************************/ +/* */ +/* cffcmap.c */ +/* */ +/* CFF character mapping table (cmap) support (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 "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_UInt ) + 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_CALLBACK_TABLE_DEF const FT_CMap_ClassRec + 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 + }; + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** 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_UInt ) + 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_CALLBACK_TABLE_DEF const FT_CMap_ClassRec + 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 + }; + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/cff/cffcmap.h b/src/WinLibs/freetype-2.3.5/src/cff/cffcmap.h new file mode 100644 index 000000000..3809b8561 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/cff/cffcmap.h @@ -0,0 +1,69 @@ +/***************************************************************************/ +/* */ +/* 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_CALLBACK_TABLE const FT_CMap_ClassRec + cff_cmap_encoding_class_rec; + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** CFF SYNTHETIC UNICODE ENCODING CMAP *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* unicode (synthetic) cmaps */ + + FT_CALLBACK_TABLE const FT_CMap_ClassRec + cff_cmap_unicode_class_rec; + + +FT_END_HEADER + +#endif /* __CFFCMAP_H__ */ + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/cff/cffdrivr.c b/src/WinLibs/freetype-2.3.5/src/cff/cffdrivr.c new file mode 100644 index 000000000..952e88e39 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/cff/cffdrivr.c @@ -0,0 +1,499 @@ +/***************************************************************************/ +/* */ +/* cffdrivr.c */ +/* */ +/* OpenType font driver implementation (body). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_FREETYPE_H +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_STREAM_H +#include FT_INTERNAL_SFNT_H +#include FT_TRUETYPE_IDS_H +#include FT_SERVICE_POSTSCRIPT_CMAPS_H +#include FT_SERVICE_POSTSCRIPT_INFO_H +#include FT_SERVICE_TT_CMAP_H + +#include "cffdrivr.h" +#include "cffgload.h" +#include "cffload.h" +#include "cffcmap.h" + +#include "cfferrs.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; + + if ( load_flags & FT_LOAD_NO_SCALE ) + size = NULL; + + /* reset the size object if necessary */ + 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; + } + + + /* + * 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:" )); + FT_ERROR(( " cannot get glyph name from CFF & CEF fonts\n" )); + FT_ERROR(( " " )); + FT_ERROR(( " 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; + } + + + static const FT_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; + + + if ( FT_ALLOC( font_info, sizeof ( *font_info ) ) ) + goto Fail; + + font_info->version = cff_index_get_sid_string( &cff->string_index, + dict->version, + cff->psnames ); + font_info->notice = cff_index_get_sid_string( &cff->string_index, + dict->notice, + cff->psnames ); + font_info->full_name = cff_index_get_sid_string( &cff->string_index, + dict->full_name, + cff->psnames ); + font_info->family_name = cff_index_get_sid_string( &cff->string_index, + dict->family_name, + cff->psnames ); + font_info->weight = cff_index_get_sid_string( &cff->string_index, + dict->weight, + cff->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; + } + + *afont_info = *cff->font_info; + + Fail: + return error; + } + + + static const FT_Service_PsInfoRec cff_service_ps_info = + { + (PS_GetFontInfoFunc) cff_ps_get_font_info, + (PS_HasGlyphNamesFunc) cff_ps_has_glyph_names, + (PS_GetFontPrivateFunc)NULL /* unsupported with CFF fonts */ + }; + + + /* + * 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; + + + cmap_info->language = 0; + + if ( cmap->clazz != &cff_cmap_encoding_class_rec && + cmap->clazz != &cff_cmap_unicode_class_rec ) + { + FT_Face face = FT_CMAP_FACE( cmap ); + FT_Library library = FT_FACE_LIBRARY( face ); + 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; + } + + + static const FT_Service_TTCMapsRec cff_service_get_cmap_info = + { + (TT_CMap_Info_GetFunc)cff_get_cmap_info + }; + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** D R I V E R I N T E R F A C E ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + static const FT_ServiceDescRec cff_services[] = + { + { FT_SERVICE_ID_XF86_NAME, FT_XF86_FORMAT_CFF }, + { FT_SERVICE_ID_POSTSCRIPT_INFO, &cff_service_ps_info }, +#ifndef FT_CONFIG_OPTION_NO_GLYPH_NAMES + { FT_SERVICE_ID_GLYPH_DICT, &cff_service_glyph_dict }, +#endif + { FT_SERVICE_ID_TT_CMAP, &cff_service_get_cmap_info }, + { NULL, NULL } + }; + + + 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( cff_services, module_interface ); + if ( result != NULL ) + return result; + + /* 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. */ + + FT_CALLBACK_TABLE_DEF + const FT_Driver_ClassRec cff_driver_class = + { + /* begin with the FT_Module_Class fields */ + { + 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, + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + ft_stub_set_char_sizes, + ft_stub_set_pixel_sizes, +#endif + + Load_Glyph, + + cff_get_kerning, + 0, /* FT_Face_AttachFunc */ + 0, /* FT_Face_GetAdvancesFunc */ + + cff_size_request, + +#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS + cff_size_select +#else + 0 /* FT_Size_SelectFunc */ +#endif + }; + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/cff/cffdrivr.h b/src/WinLibs/freetype-2.3.5/src/cff/cffdrivr.h new file mode 100644 index 000000000..553848c0a --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/cff/cffdrivr.h @@ -0,0 +1,39 @@ +/***************************************************************************/ +/* */ +/* 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_CALLBACK_TABLE + const FT_Driver_ClassRec cff_driver_class; + + +FT_END_HEADER + +#endif /* __CFFDRIVER_H__ */ + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/cff/cfferrs.h b/src/WinLibs/freetype-2.3.5/src/cff/cfferrs.h new file mode 100644 index 000000000..1b2a5c95c --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/src/cff/cffgload.c b/src/WinLibs/freetype-2.3.5/src/cff/cffgload.c new file mode 100644 index 000000000..0e2a179c7 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/cff/cffgload.c @@ -0,0 +1,2634 @@ +/***************************************************************************/ +/* */ +/* cffgload.c */ +/* */ +/* OpenType Glyph Loader (body). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#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_OUTLINE_H +#include FT_TRUETYPE_TAGS_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, + + /* 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 + + + 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 + }; + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /********** *********/ + /********** *********/ + /********** 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. */ + /* */ + 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 ) + { + builder->hints_globals = size->root.internal; + builder->hints_funcs = glyph->root.internal->glyph_hints; + } + } + + if ( size ) + { + builder->scale_x = size->root.metrics.x_scale; + builder->scale_y = size->root.metrics.y_scale; + } + + 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> */ + /* num_subrs :: The number of glyph subroutines. */ + /* */ + /* <Return> */ + /* The bias value. */ + static FT_Int + cff_compute_bias( FT_UInt num_subrs ) + { + FT_Int result; + + + 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. */ + /* */ + 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->num_globals = cff->num_global_subrs; + decoder->globals = cff->global_subrs; + decoder->globals_bias = cff_compute_bias( decoder->num_globals ); + + decoder->hint_mode = hint_mode; + } + + + /* this function is used to select the locals subrs array */ + FT_LOCAL_DEF( FT_Error ) + cff_decoder_prepare( CFF_Decoder* decoder, + FT_UInt glyph_index ) + { + CFF_Font cff = (CFF_Font)decoder->builder.face->extra.data; + CFF_SubFont sub = &cff->top_font; + FT_Error error = CFF_Err_Ok; + + + /* manage CID fonts */ + if ( cff->num_subfonts >= 1 ) + { + 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; + } + + sub = cff->subfonts[fd_index]; + } + + decoder->num_locals = sub->num_local_subrs; + decoder->locals = sub->local_subrs; + decoder->locals_bias = cff_compute_bias( 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 ); + + builder->last = *point; + } + + 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; + + + if ( !outline ) + return; + + /* XXXX: We must not include the last point in the path if it */ + /* is located on the first point. */ + if ( outline->n_points > 1 ) + { + FT_Int first = 0; + 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; + + + if ( outline->n_contours > 1 ) + { + first = outline->contours[outline->n_contours - 2] + 1; + p1 = outline->points + first; + } + + /* `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 ) + 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 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; + + +#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:" )); + FT_ERROR(( " 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 ) + { + error = cff_decoder_parse_charstrings( decoder, charstring, + charstring_len ); + + if ( error ) + goto Exit; + + cff_free_glyph_data( face, &charstring, charstring_len ); + } + + /* Save the left bearing and width of the base character */ + /* as they will be erased by the next load. */ + + left_bearing = builder->left_bearing; + advance = builder->advance; + + builder->left_bearing.x = 0; + builder->left_bearing.y = 0; + + builder->pos_x = adx; + 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 ) + { + error = cff_decoder_parse_charstrings( decoder, charstring, + charstring_len ); + + if ( error ) + goto Exit; + + cff_free_glyph_data( face, &charstring, charstring_len ); + } + + /* Restore the left side bearing and advance width */ + /* of the base character. */ + builder->left_bearing = left_bearing; + builder->advance = advance; + + 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; + + 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)(char*)&seed ^ + (FT_Fixed)(char*)&decoder ^ + (FT_Fixed)(char*)&charstring_base; + 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_Long)v - 139; + else if ( v < 251 ) + { + if ( ip >= limit ) + goto Syntax_Error; + val = ( (FT_Long)v - 247 ) * 256 + *ip++ + 108; + } + else if ( v < 255 ) + { + if ( ip >= limit ) + goto Syntax_Error; + val = -( (FT_Long)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; + 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 + { + 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 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 3: + op = cff_op_and; + break; + case 4: + op = cff_op_or; + break; + case 5: + op = cff_op_not; + 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 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 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 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: + ; + } + if ( op == cff_op_unknown ) + goto Syntax_Error; + + /* check arguments */ + req_args = cff_argument_counts[op]; + if ( req_args & CFF_COUNT_CHECK_WIDTH ) + { + args = stack; + + 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 ); + + /* Consumed an argument. */ + num_args--; + args++; + } + } + + decoder->read_width = 0; + req_args = 0; + } + + req_args &= 15; + if ( num_args < req_args ) + goto Stack_Underflow; + args -= req_args; + num_args -= req_args; + + 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" : + ( op == cff_op_vstem ? " vstem" : + ( op == cff_op_hstemhm ? " hstemhm" : " vstemhm" ) ) )); + + if ( hinter ) + hinter->stems( hinter->hints, + ( op == cff_op_hstem || op == cff_op_hstemhm ), + num_args / 2, + args ); + + 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 ); + + 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(( " " )); + + for ( maskbyte = 0; + maskbyte < (FT_UInt)(( decoder->num_hints + 7 ) >> 3); + maskbyte++, ip++ ) + FT_TRACE4(( "0x%02X", *ip )); + } +#else + ip += ( decoder->num_hints + 7 ) >> 3; +#endif + if ( ip >= limit ) + goto Syntax_Error; + args = stack; + break; + + case cff_op_rmoveto: + FT_TRACE4(( " rmoveto" )); + + cff_builder_close_contour( builder ); + builder->path_begun = 0; + x += args[0]; + y += args[1]; + args = stack; + break; + + case cff_op_vmoveto: + FT_TRACE4(( " vmoveto" )); + + cff_builder_close_contour( builder ); + builder->path_begun = 0; + y += args[0]; + args = stack; + break; + + case cff_op_hmoveto: + FT_TRACE4(( " hmoveto" )); + + cff_builder_close_contour( builder ); + builder->path_begun = 0; + x += args[0]; + args = stack; + break; + + case cff_op_rlineto: + FT_TRACE4(( " rlineto" )); + + if ( cff_builder_start_point ( builder, x, y ) || + check_points( builder, num_args / 2 ) ) + goto Fail; + + if ( num_args < 2 || num_args & 1 ) + goto Stack_Underflow; + + args = stack; + 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" + : " vlineto" )); + + 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_TRACE4(( " rrcurveto" )); + + /* check number of arguments; must be a multiple of 6 */ + if ( num_args % 6 != 0 ) + goto Stack_Underflow; + + if ( cff_builder_start_point ( builder, x, y ) || + check_points( builder, num_args / 2 ) ) + goto Fail; + + args = stack; + 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_TRACE4(( " vvcurveto" )); + + if ( cff_builder_start_point( builder, x, y ) ) + goto Fail; + + args = stack; + if ( num_args & 1 ) + { + x += args[0]; + args++; + num_args--; + } + + if ( num_args % 4 != 0 ) + goto Stack_Underflow; + + if ( check_points( builder, 3 * ( num_args / 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_TRACE4(( " hhcurveto" )); + + if ( cff_builder_start_point( builder, x, y ) ) + goto Fail; + + args = stack; + if ( num_args & 1 ) + { + y += args[0]; + args++; + num_args--; + } + + if ( num_args % 4 != 0 ) + goto Stack_Underflow; + + if ( check_points( builder, 3 * ( num_args / 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_TRACE4(( op == cff_op_vhcurveto ? " vhcurveto" + : " hvcurveto" )); + + if ( cff_builder_start_point( builder, x, y ) ) + goto Fail; + + args = stack; + if ( num_args < 4 || ( num_args % 4 ) > 1 ) + goto Stack_Underflow; + + if ( check_points( builder, ( num_args / 4 ) * 3 ) ) + goto Stack_Underflow; + + phase = ( op == cff_op_hvcurveto ); + + while ( num_args >= 4 ) + { + num_args -= 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 ( num_args == 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 ( num_args == 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 = ( num_args - 6 ) / 2; + + + FT_TRACE4(( " rlinecurve" )); + + if ( num_args < 8 || ( num_args - 6 ) & 1 ) + goto Stack_Underflow; + + if ( cff_builder_start_point( builder, x, y ) || + check_points( builder, num_lines + 3 ) ) + goto Fail; + + args = stack; + + /* 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 = ( num_args - 2 ) / 6; + + + FT_TRACE4(( " rcurveline" )); + + if ( num_args < 8 || ( num_args - 2 ) % 6 ) + goto Stack_Underflow; + + if ( cff_builder_start_point ( builder, x, y ) || + check_points( builder, num_curves*3 + 2 ) ) + goto Fail; + + args = stack; + + /* 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" )); + + args = stack; + + /* 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" )); + + args = stack; + + /* 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_TRACE4(( " flex1" )); + + /* 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... */ + + args = stack; + + /* grab up to the last argument */ + for ( count = 5; count > 0; count-- ) + { + dx += args[0]; + dy += args[1]; + args += 2; + } + + /* rewind */ + args = stack; + + 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" )); + + if ( cff_builder_start_point( builder, x, y ) || + check_points( builder, 6 ) ) + goto Fail; + + args = stack; + 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_endchar: + FT_TRACE4(( " endchar" )); + + /* 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, + args[0], + args[1], + (FT_Int)( args[2] >> 16 ), + (FT_Int)( args[3] >> 16 ) ); + args += 4; + + 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\n" )); + return error; + + case cff_op_abs: + FT_TRACE4(( " abs" )); + + if ( args[0] < 0 ) + args[0] = -args[0]; + args++; + break; + + case cff_op_add: + FT_TRACE4(( " add" )); + + args[0] += args[1]; + args++; + break; + + case cff_op_sub: + FT_TRACE4(( " sub" )); + + args[0] -= args[1]; + args++; + break; + + case cff_op_div: + FT_TRACE4(( " div" )); + + args[0] = FT_DivFix( args[0], args[1] ); + args++; + break; + + case cff_op_neg: + FT_TRACE4(( " neg" )); + + args[0] = -args[0]; + args++; + break; + + case cff_op_random: + { + FT_Fixed Rand; + + + FT_TRACE4(( " rand" )); + + 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" )); + + args[0] = FT_MulFix( args[0], args[1] ); + args++; + break; + + case cff_op_sqrt: + FT_TRACE4(( " sqrt" )); + + 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" )); + + break; + + case cff_op_exch: + { + FT_Fixed tmp; + + + FT_TRACE4(( " exch" )); + + 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" )); + + 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" )); + + 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" )); + + args[1] = args[0]; + args++; + break; + + case cff_op_put: + { + FT_Fixed val = args[0]; + FT_Int idx = (FT_Int)( args[1] >> 16 ); + + + FT_TRACE4(( " put" )); + + if ( idx >= 0 && idx < decoder->len_buildchar ) + decoder->buildchar[idx] = val; + } + break; + + case cff_op_get: + { + FT_Int idx = (FT_Int)( args[0] >> 16 ); + FT_Fixed val = 0; + + + FT_TRACE4(( " get" )); + + if ( idx >= 0 && idx < decoder->len_buildchar ) + val = decoder->buildchar[idx]; + + args[0] = val; + args++; + } + break; + + case cff_op_store: + FT_TRACE4(( " store ")); + + goto Unimplemented; + + case cff_op_load: + FT_TRACE4(( " load" )); + + goto Unimplemented; + + case cff_op_dotsection: + /* this operator is deprecated and ignored by the parser */ + FT_TRACE4(( " dotsection" )); + break; + + case cff_op_and: + { + FT_Fixed cond = args[0] && args[1]; + + + FT_TRACE4(( " and" )); + + args[0] = cond ? 0x10000L : 0; + args++; + } + break; + + case cff_op_or: + { + FT_Fixed cond = args[0] || args[1]; + + + FT_TRACE4(( " or" )); + + args[0] = cond ? 0x10000L : 0; + args++; + } + break; + + case cff_op_eq: + { + FT_Fixed cond = !args[0]; + + + FT_TRACE4(( " eq" )); + + args[0] = cond ? 0x10000L : 0; + args++; + } + break; + + case cff_op_ifelse: + { + FT_Fixed cond = ( args[2] <= args[3] ); + + + FT_TRACE4(( " ifelse" )); + + 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)", idx )); + + if ( idx >= decoder->num_locals ) + { + FT_ERROR(( "cff_decoder_parse_charstrings:" )); + FT_ERROR(( " 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)", idx )); + + if ( idx >= decoder->num_globals ) + { + FT_ERROR(( "cff_decoder_parse_charstrings:" )); + FT_ERROR(( " 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" )); + + 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!" )); + return CFF_Err_Invalid_File_Format; + + Stack_Underflow: + FT_TRACE4(( "cff_decoder_parse_charstrings: stack underflow!" )); + return CFF_Err_Too_Few_Arguments; + + Stack_Overflow: + FT_TRACE4(( "cff_decoder_parse_charstrings: stack overflow!" )); + 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, 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; + CFF_Font cff = (CFF_Font)face->extra.data; + + FT_Matrix font_matrix; + FT_Vector font_offset; + + + /* 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 ) + { + 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; + + 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 ) ); + + decoder.builder.no_recurse = + (FT_Bool)( ( load_flags & FT_LOAD_NO_RECURSE ) != 0 ); + + /* now load the unscaled outline */ + error = cff_get_glyph_data( face, glyph_index, + &charstring, &charstring_len ); + if ( !error ) + { + error = cff_decoder_prepare( &decoder, 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 = decoder.builder.left_bearing.y; + metrics.advance = decoder.builder.advance.x; + 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.left_bearing.y = metrics.bearing_y; + decoder.builder.advance.x = metrics.advance; + decoder.builder.advance.y = 0; + } + +#endif /* FT_CONFIG_OPTION_INCREMENTAL */ + + if ( !error ) + { + if ( cff->num_subfonts >= 1 ) + { + FT_Byte fd_index = cff_fd_select_get( &cff->fd_select, + glyph_index ); + + + font_matrix = cff->subfonts[fd_index]->font_dict.font_matrix; + font_offset = cff->subfonts[fd_index]->font_dict.font_offset; + } + else + { + font_matrix = cff->top_font.font_dict.font_matrix; + font_offset = cff->top_font.font_dict.font_offset; + } + + /* 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; + + has_vertical_info = FT_BOOL( face->vertical_info && + face->vertical.number_Of_VMetrics > 0 && + face->vertical.long_metrics != 0 ); + + /* 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; + + /* apply the font matrix */ + 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 ) + { + /* 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->width / 2; + else + ft_synthesize_vertical_metrics( metrics, + metrics->vertAdvance ); + } + } + + return error; + } + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/cff/cffgload.h b/src/WinLibs/freetype-2.3.5/src/cff/cffgload.h new file mode 100644 index 000000000..f67864a69 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/cff/cffgload.h @@ -0,0 +1,208 @@ +/***************************************************************************/ +/* */ +/* cffgload.h */ +/* */ +/* OpenType Glyph Loader (specification). */ +/* */ +/* Copyright 1996-2001, 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 __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 + + + /*************************************************************************/ + /* */ + /* <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. */ + /* */ + /* last :: The last point position. */ + /* */ + /* scale_x :: The horizontal scale (FUnits to sub-pixels). */ + /* */ + /* scale_y :: The vertical scale (FUnits to sub-pixels). */ + /* */ + /* 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_Vector last; + + FT_Fixed scale_x; + FT_Fixed scale_y; + + 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_Int num_hints; + FT_Fixed* buildchar; + FT_Int len_buildchar; + + 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; + + } 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, + FT_UInt glyph_index ); + +#if 0 /* unused until we support pure CFF fonts */ + + /* Compute the maximum advance width of a font through quick parsing */ + FT_LOCAL( FT_Error ) + cff_compute_max_advance( TT_Face face, + FT_Int* max_advance ); + +#endif /* 0 */ + + FT_LOCAL( FT_Error ) + cff_decoder_parse_charstrings( CFF_Decoder* decoder, + FT_Byte* charstring_base, + FT_ULong charstring_len ); + + FT_LOCAL( FT_Error ) + cff_slot_load( CFF_GlyphSlot glyph, + CFF_Size size, + FT_UInt glyph_index, + FT_Int32 load_flags ); + + +FT_END_HEADER + +#endif /* __CFFGLOAD_H__ */ + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/cff/cffload.c b/src/WinLibs/freetype-2.3.5/src/cff/cffload.c new file mode 100644 index 000000000..dd2f1133d --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/cff/cffload.c @@ -0,0 +1,1598 @@ +/***************************************************************************/ +/* */ +/* cffload.c */ +/* */ +/* OpenType and CFF data/program tables loader (body). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#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 + + + 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 = 0; + 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++ ) + { + 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_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; + + for ( i = 0; i < num_glyphs; i++ ) + charset->cids[charset->sids[i]] = (FT_UShort)i; + + charset->max_cid = max_cid; + charset->num_glyphs = num_glyphs; + + Exit: + return error; + } + + + FT_LOCAL_DEF( FT_UInt ) + cff_charset_cid_to_gindex( CFF_Charset charset, + FT_UInt cid ) + { + FT_UInt result = 0; + + + if ( cid < charset->max_cid ) + result = charset->cids[cid]; + + return result; + } + + + static void + cff_charset_free_cids( CFF_Charset charset, + FT_Memory memory ) + { + FT_FREE( charset->cids ); + charset->max_cid = 0; + } + + + static void + cff_charset_done( CFF_Charset charset, + FT_Stream stream ) + { + FT_Memory memory = stream->memory; + + + cff_charset_free_cids( charset, memory ); + + FT_FREE( charset->sids ); + charset->format = 0; + charset->offset = 0; + } + + + static FT_Error + cff_charset_load( CFF_Charset charset, + FT_UInt num_glyphs, + FT_Stream stream, + FT_ULong base_offset, + FT_ULong offset, + FT_Bool invert ) + { + FT_Memory memory = stream->memory; + FT_Error error = CFF_Err_Ok; + FT_UShort glyph_sid; + + + /* If the the offset is greater than 2, we have to parse the */ + /* charset table. */ + if ( offset > 2 ) + { + FT_UInt j; + + + charset->offset = base_offset + offset; + + /* Get the format of the table. */ + if ( FT_STREAM_SEEK( charset->offset ) || + FT_READ_BYTE( charset->format ) ) + goto Exit; + + /* Allocate memory for sids. */ + if ( FT_NEW_ARRAY( charset->sids, num_glyphs ) ) + goto Exit; + + /* assign the .notdef glyph */ + charset->sids[0] = 0; + + switch ( charset->format ) + { + case 0: + if ( num_glyphs > 0 ) + { + if ( FT_FRAME_ENTER( ( num_glyphs - 1 ) * 2 ) ) + goto Exit; + + for ( j = 1; j < num_glyphs; j++ ) + charset->sids[j] = FT_GET_USHORT(); + + FT_FRAME_EXIT(); + } + break; + + case 1: + case 2: + { + FT_UInt nleft; + FT_UInt i; + + + j = 1; + + while ( j < num_glyphs ) + { + /* Read the first glyph sid of the range. */ + if ( FT_READ_USHORT( glyph_sid ) ) + goto Exit; + + /* Read the number of glyphs in the range. */ + if ( charset->format == 2 ) + { + if ( FT_READ_USHORT( nleft ) ) + goto Exit; + } + else + { + if ( FT_READ_BYTE( nleft ) ) + goto Exit; + } + + /* 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_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 ); + + /* 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 ) || + 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 ); + + 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_Stream stream, + FT_Int face_index, + CFF_Font font ) + { + 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 ); + 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_ERROR(( "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 ); + 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 ); + + + 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; + } + else + /* CID-keyed fonts only need CIDs */ + FT_FREE( font->charset.sids ); + } + + /* 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->global_subrs ); + FT_FREE( font->font_name ); + } + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/cff/cffload.h b/src/WinLibs/freetype-2.3.5/src/cff/cffload.h new file mode 100644 index 000000000..068cbb58c --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/cff/cffload.h @@ -0,0 +1,79 @@ +/***************************************************************************/ +/* */ +/* cffload.h */ +/* */ +/* OpenType & CFF data/program tables loader (specification). */ +/* */ +/* Copyright 1996-2001, 2002, 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 __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_Stream stream, + FT_Int face_index, + CFF_Font font ); + + FT_LOCAL( void ) + cff_font_done( CFF_Font font ); + + + FT_LOCAL( FT_Byte ) + cff_fd_select_get( CFF_FDSelect fdselect, + FT_UInt glyph_index ); + + +FT_END_HEADER + +#endif /* __CFFLOAD_H__ */ + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/cff/cffobjs.c b/src/WinLibs/freetype-2.3.5/src/cff/cffobjs.c new file mode 100644 index 000000000..c02cf33fc --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/cff/cffobjs.c @@ -0,0 +1,782 @@ +/***************************************************************************/ +/* */ +/* cffobjs.c */ +/* */ +/* OpenType objects manager (body). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#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" + + + /*************************************************************************/ + /* */ + /* 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_FontRec *)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; + + + if ( cffsize->internal ) + { + PSH_Globals_Funcs funcs; + + + funcs = cff_size_get_globals_funcs( size ); + if ( funcs ) + funcs->destroy( (PSH_Globals)cffsize->internal ); + + cffsize->internal = 0; + } + } + + + 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 ) + { + PSH_Globals globals; + CFF_Face face = (CFF_Face)cffsize->face; + CFF_Font font = (CFF_FontRec *)face->extra.data; + CFF_SubFont subfont = &font->top_font; + + CFF_Private cpriv = &subfont->private_dict; + PS_PrivateRec priv; + + + /* IMPORTANT: The CFF and Type1 private dictionaries have */ + /* slightly different structures; we need to */ + /* synthetize a type1 dictionary on the fly here. */ + + { + 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; + } + + error = funcs->create( cffsize->face->memory, &priv, &globals ); + if ( !error ) + cffsize->internal = (FT_Size_Internal)(void*)globals; + } + + size->strike_index = 0xFFFFFFFFUL; + + 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 ) + funcs->set_scale( (PSH_Globals)size->internal, + size->metrics.x_scale, + size->metrics.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 ) + funcs->set_scale( (PSH_Globals)size->internal, + size->metrics.x_scale, + size->metrics.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_FontRec *)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 0; + } + + + /*************************************************************************/ + /* */ + /* FACE FUNCTIONS */ + /* */ + /*************************************************************************/ + + static FT_String* + cff_strcpy( FT_Memory memory, + const FT_String* source ) + { + FT_Error error; + FT_String* result; + + + result = ft_mem_strdup( memory, source, &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; + + +#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( + cffface->driver->root.library, "sfnt" ); + if ( !sfnt ) + goto Bad_Format; + + FT_FACE_FIND_GLOBAL_SERVICE( face, psnames, POSTSCRIPT_CMAPS ); + + pshinter = (PSHinter_Service)FT_Get_Module_Interface( + cffface->driver->root.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 != 0x4F54544FL ) /* `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, + face_index, 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( stream, face_index, cff ); + if ( error ) + goto Exit; + + cff->pshinter = pshinter; + cff->psnames = (void*)psnames; + + /* 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:" )); + FT_ERROR(( " cannot open CFF & CEF fonts\n" )); + FT_ERROR(( " " )); + FT_ERROR(( " without the `PSNames' module\n" )); + goto Bad_Format; + } + + 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 = dict->cid_count; + 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; + cffface->bbox.xMax = ( dict->font_bbox.xMax + 0xFFFFU ) >> 16; + cffface->bbox.yMax = ( dict->font_bbox.yMax + 0xFFFFU ) >> 16; + + if ( !dict->units_per_em ) + dict->units_per_em = 1000; + + cffface->units_per_EM = 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_FACE_FLAG_SCALABLE | /* scalable outlines */ + FT_FACE_FLAG_HORIZONTAL | /* horizontal data */ + FT_FACE_FLAG_HINTER; /* has native hinter */ + + if ( sfnt_format ) + flags |= FT_FACE_FLAG_SFNT; + + /* fixed width font? */ + if ( dict->is_fixed_pitch ) + flags |= FT_FACE_FLAG_FIXED_WIDTH; + + /* XXX: WE DO NOT SUPPORT KERNING METRICS IN THE GPOS TABLE FOR NOW */ +#if 0 + /* kerning available? */ + if ( face->kern_pairs ) + flags |= FT_FACE_FLAG_KERNING; +#endif + + cffface->face_flags = flags; + + /*******************************************************************/ + /* */ + /* Compute style flags. */ + /* */ + flags = 0; + + if ( dict->italic_angle ) + flags |= FT_STYLE_FLAG_ITALIC; + + { + char *weight = cff_index_get_sid_string( &cff->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; + } + else + { + if ( !dict->units_per_em ) + dict->units_per_em = face->root.units_per_EM; + } + + /* handle font matrix settings in subfonts (if any) */ + 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; + + + if ( sub->units_per_em ) + { + FT_Matrix scale; + + + scale.xx = scale.yy = (FT_Fixed)FT_DivFix( top->units_per_em, + sub->units_per_em ); + scale.xy = scale.yx = 0; + + FT_Matrix_Multiply( &scale, &sub->font_matrix ); + FT_Vector_Transform( &sub->font_offset, &scale ); + } + else + { + sub->font_matrix = top->font_matrix; + sub->font_offset = top->font_offset; + } + } + +#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 + + /*******************************************************************/ + /* */ + /* Compute char maps. */ + /* */ + + /* Try to synthetize 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 -- synthetize 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( &cff_cmap_unicode_class_rec, 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 = &cff_cmap_encoding_class_rec; + } + else if ( encoding->offset == 1 ) + { + cmaprec.encoding_id = TT_ADOBE_ID_EXPERT; + cmaprec.encoding = FT_ENCODING_ADOBE_EXPERT; + clazz = &cff_cmap_encoding_class_rec; + } + else + { + cmaprec.encoding_id = TT_ADOBE_ID_CUSTOM; + cmaprec.encoding = FT_ENCODING_ADOBE_CUSTOM; + clazz = &cff_cmap_encoding_class_rec; + } + + 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 = cffface->memory; + SFNT_Service sfnt = (SFNT_Service)face->sfnt; + + + if ( sfnt ) + sfnt->done_face( face ); + + { + CFF_Font cff = (CFF_Font)face->extra.data; + + + if ( cff ) + { + cff_font_done( cff ); + FT_FREE( face->extra.data ); + } + } + } + + + FT_LOCAL_DEF( FT_Error ) + cff_driver_init( FT_Module module ) + { + FT_UNUSED( module ); + + return CFF_Err_Ok; + } + + + FT_LOCAL_DEF( void ) + cff_driver_done( FT_Module module ) + { + FT_UNUSED( module ); + } + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/cff/cffobjs.h b/src/WinLibs/freetype-2.3.5/src/cff/cffobjs.h new file mode 100644 index 000000000..f18b5d932 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/cff/cffobjs.h @@ -0,0 +1,165 @@ +/***************************************************************************/ +/* */ +/* cffobjs.h */ +/* */ +/* OpenType objects manager (specification). */ +/* */ +/* Copyright 1996-2001, 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 __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 + + +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; + + + + /*************************************************************************/ + /* */ + /* Subglyph transformation record. */ + /* */ + typedef struct CFF_Transform_ + { + FT_Fixed xx, xy; /* transformation matrix coefficients */ + FT_Fixed yx, yy; + FT_F26Dot6 ox, oy; /* offsets */ + + } CFF_Transform; + + + /***********************************************************************/ + /* */ + /* TrueType driver class. */ + /* */ + typedef struct CFF_DriverRec_ + { + FT_DriverRec root; + void* extension_component; + + } CFF_DriverRec; + + + FT_LOCAL( FT_Error ) + cff_size_init( FT_Size size ); /* CFF_Size */ + + FT_LOCAL( void ) + cff_size_done( FT_Size size ); /* CFF_Size */ + + FT_LOCAL( FT_Error ) + cff_size_request( FT_Size size, + FT_Size_Request req ); + +#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS + + FT_LOCAL( FT_Error ) + cff_size_select( FT_Size size, + FT_ULong strike_index ); + +#endif + + FT_LOCAL( void ) + cff_slot_done( FT_GlyphSlot slot ); + + FT_LOCAL( FT_Error ) + cff_slot_init( FT_GlyphSlot slot ); + + + /*************************************************************************/ + /* */ + /* Face functions */ + /* */ + FT_LOCAL( FT_Error ) + cff_face_init( FT_Stream stream, + FT_Face face, /* CFF_Face */ + FT_Int face_index, + FT_Int num_params, + FT_Parameter* params ); + + FT_LOCAL( void ) + cff_face_done( FT_Face face ); /* CFF_Face */ + + + /*************************************************************************/ + /* */ + /* Driver functions */ + /* */ + FT_LOCAL( FT_Error ) + cff_driver_init( FT_Module module ); + + FT_LOCAL( void ) + cff_driver_done( FT_Module module ); + + +FT_END_HEADER + +#endif /* __CFFOBJS_H__ */ + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/cff/cffparse.c b/src/WinLibs/freetype-2.3.5/src/cff/cffparse.c new file mode 100644 index 000000000..41af6a317 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/cff/cffparse.c @@ -0,0 +1,688 @@ +/***************************************************************************/ +/* */ +/* cffparse.c */ +/* */ +/* CFF token stream parser (body) */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 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 <ft2build.h> +#include "cffparse.h" +#include FT_INTERNAL_STREAM_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_cffparse + + + 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_LOCAL_DEF( void ) + cff_parser_init( CFF_Parser parser, + FT_UInt code, + void* object ) + { + FT_MEM_ZERO( parser, sizeof ( *parser ) ); + + parser->top = parser->stack; + parser->object_code = code; + parser->object = object; + } + + + /* 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; + } + + + /* read a real */ + static FT_Fixed + cff_parse_real( FT_Byte* start, + FT_Byte* limit, + FT_Int power_ten ) + { + FT_Byte* p = start; + FT_Long num, divider, result, exponent; + FT_Int sign = 0, exponent_sign = 0; + FT_UInt nib; + FT_UInt phase; + + + result = 0; + num = 0; + divider = 1; + + /* 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 Bad; + } + + /* Get the nibble. */ + nib = ( p[0] >> phase ) & 0xF; + phase = 4 - phase; + + if ( nib == 0xE ) + sign = 1; + else if ( nib > 9 ) + break; + else + result = result * 10 + nib; + } + + /* read decimal 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 Bad; + } + + /* Get the nibble. */ + nib = ( p[0] >> phase ) & 0xF; + phase = 4 - phase; + if ( nib >= 10 ) + break; + + if ( divider < 10000000L ) + { + num = num * 10 + nib; + divider *= 10; + } + } + + /* read exponent, if any */ + if ( nib == 12 ) + { + exponent_sign = 1; + nib = 11; + } + + if ( nib == 11 ) + { + exponent = 0; + + 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 Bad; + } + + /* Get the nibble. */ + nib = ( p[0] >> phase ) & 0xF; + phase = 4 - phase; + if ( nib >= 10 ) + break; + + exponent = exponent * 10 + nib; + } + + if ( exponent_sign ) + exponent = -exponent; + + power_ten += (FT_Int)exponent; + } + + /* raise to power of ten if needed */ + while ( power_ten > 0 ) + { + result = result * 10; + num = num * 10; + + power_ten--; + } + + while ( power_ten < 0 ) + { + result = result / 10; + divider = divider * 10; + + power_ten++; + } + + /* Move the integer part into the high 16 bits. */ + result <<= 16; + + /* Place the decimal part into the low 16 bits. */ + if ( num ) + result |= FT_DivFix( num, divider ); + + if ( sign ) + result = -result; + + Exit: + return result; + + Bad: + result = 0; + goto Exit; + } + + + /* 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 ) >> 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 ) + : cff_parse_integer( d[0], d[1] ) << 16 ); + } + + /* read a floating point number, either integer or real, */ + /* but return 1000 times the number read in. */ + static FT_Fixed + cff_parse_fixed_thousand( FT_Byte** d ) + { + return **d == + 30 ? cff_parse_real ( d[0], d[1], 3 ) + : (FT_Fixed)FT_MulFix( cff_parse_integer( d[0], d[1] ) << 16, 1000 ); + } + + 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_UShort* upm = &dict->units_per_em; + FT_Byte** data = parser->stack; + FT_Error error; + FT_Fixed temp; + + + error = CFF_Err_Stack_Underflow; + + if ( parser->top >= parser->stack + 6 ) + { + matrix->xx = cff_parse_fixed_thousand( data++ ); + matrix->yx = cff_parse_fixed_thousand( data++ ); + matrix->xy = cff_parse_fixed_thousand( data++ ); + matrix->yy = cff_parse_fixed_thousand( data++ ); + offset->x = cff_parse_fixed_thousand( data++ ); + offset->y = cff_parse_fixed_thousand( data ); + + temp = FT_ABS( matrix->yy ); + + *upm = (FT_UShort)FT_DivFix( 0x10000L, FT_DivFix( temp, 1000 ) ); + + if ( temp != 0x10000L ) + { + 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 ); + } + + /* note that the offsets must be expressed in integer font units */ + offset->x >>= 16; + offset->y >>= 16; + + error = CFF_Err_Ok; + } + + 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++ ); + dict->cid_supplement = (FT_ULong)cff_parse_num( data ); + 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 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 ) \ + }, + +#define CFFCODE_TOPDICT 0x1000 +#define CFFCODE_PRIVATE 0x2000 + + static const CFF_Field_Handler cff_field_handlers[] = + { + +#include "cfftoken.h" + + { 0, 0, 0, 0, 0, 0, 0 } + }; + + + 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; + + + 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 (;;) + { + if ( p >= limit ) + goto Syntax_Error; + 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 = cff_field_handlers; 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_thousand( parser->stack ); + + 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/src/WinLibs/freetype-2.3.5/src/cff/cffparse.h b/src/WinLibs/freetype-2.3.5/src/cff/cffparse.h new file mode 100644 index 000000000..8f3fa5885 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/cff/cffparse.h @@ -0,0 +1,69 @@ +/***************************************************************************/ +/* */ +/* 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_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_LOCAL( FT_Error ) + cff_parser_run( CFF_Parser parser, + FT_Byte* start, + FT_Byte* limit ); + + +FT_END_HEADER + + +#endif /* __CFF_PARSE_H__ */ + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/cff/cfftoken.h b/src/WinLibs/freetype-2.3.5/src/cff/cfftoken.h new file mode 100644 index 000000000..6bb27d5ca --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/src/cff/cfftypes.h b/src/WinLibs/freetype-2.3.5/src/cff/cfftypes.h new file mode 100644 index 000000000..306e5aab6 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/cff/cfftypes.h @@ -0,0 +1,270 @@ +/***************************************************************************/ +/* */ +/* cfftypes.h */ +/* */ +/* Basic OpenType/CFF type definitions and interface (specification */ +/* only). */ +/* */ +/* Copyright 1996-2001, 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. */ +/* */ +/***************************************************************************/ + + +#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_UShort units_per_em; + 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_ULong 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 */ + + } CFF_FontRec, *CFF_Font; + + +FT_END_HEADER + +#endif /* __CFFTYPES_H__ */ + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/cff/module.mk b/src/WinLibs/freetype-2.3.5/src/cff/module.mk new file mode 100644 index 000000000..0474e37b6 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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)cff_driver_class$(CLOSE_DRIVER) +$(ECHO_DRIVER)cff $(ECHO_DRIVER_DESC)OpenType fonts with extension *.otf$(ECHO_DRIVER_DONE) +endef + +# EOF diff --git a/src/WinLibs/freetype-2.3.5/src/cff/rules.mk b/src/WinLibs/freetype-2.3.5/src/cff/rules.mk new file mode 100644 index 000000000..4100c8068 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/src/cid/Jamfile b/src/WinLibs/freetype-2.3.5/src/cid/Jamfile new file mode 100644 index 000000000..ebeaed54e --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/src/cid/ciderrs.h b/src/WinLibs/freetype-2.3.5/src/cid/ciderrs.h new file mode 100644 index 000000000..01813e189 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/src/cid/cidgload.c b/src/WinLibs/freetype-2.3.5/src/cid/cidgload.c new file mode 100644 index 000000000..8bec6e187 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/cid/cidgload.c @@ -0,0 +1,433 @@ +/***************************************************************************/ +/* */ +/* cidgload.c */ +/* */ +/* CID-keyed Type1 Glyph Loader (body). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include "cidload.h" +#include "cidgload.h" +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_STREAM_H +#include FT_OUTLINE_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 + + /* For incremental fonts get the character data using */ + /* the callback function. */ + if ( face->root.internal->incremental_interface ) + { + FT_Data glyph_data; + + + error = face->root.internal->incremental_interface->funcs->get_glyph_data( + face->root.internal->incremental_interface->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; + FT_ALLOC( charstring, glyph_length ); + if ( !error ) + ft_memcpy( charstring, glyph_data.pointer + cid->fd_bytes, + glyph_length ); + } + + face->root.internal->incremental_interface->funcs->free_glyph_data( + face->root.internal->incremental_interface->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 && + 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 = decoder->builder.left_bearing.y; + metrics.advance = decoder->builder.advance.x; + 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.left_bearing.y = metrics.bearing_y; + decoder->builder.advance.x = metrics.advance; + decoder->builder.advance.y = 0; + } + +#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 = 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 = decoder.builder.left_bearing.x; + cidglyph->metrics.horiAdvance = 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 = decoder.builder.advance.x; + cidglyph->linearHoriAdvance = 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; + + /* make up vertical ones */ + ft_synthesize_vertical_metrics( metrics, + metrics->vertAdvance ); + } + + Exit: + return error; + } + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/cid/cidgload.h b/src/WinLibs/freetype-2.3.5/src/cid/cidgload.h new file mode 100644 index 000000000..a0a91bfea --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/src/cid/cidload.c b/src/WinLibs/freetype-2.3.5/src/cid/cidload.c new file mode 100644 index 000000000..9ed8cee46 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/cid/cidload.c @@ -0,0 +1,644 @@ +/***************************************************************************/ +/* */ +/* cidload.c */ +/* */ +/* CID-keyed Type1 font loader (body). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#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_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; + } + + + 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 ) + + { 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/src/WinLibs/freetype-2.3.5/src/cid/cidload.h b/src/WinLibs/freetype-2.3.5/src/cid/cidload.h new file mode 100644 index 000000000..8c172ffee --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/src/cid/cidobjs.c b/src/WinLibs/freetype-2.3.5/src/cid/cidobjs.c new file mode 100644 index 000000000..1b3bfbf74 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/cid/cidobjs.c @@ -0,0 +1,480 @@ +/***************************************************************************/ +/* */ +/* cidobjs.c */ +/* */ +/* CID objects manager (body). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#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; + + + if ( face ) + { + CID_FaceInfo cid = &face->cid; + PS_FontInfo 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 */ + 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; + cidface->bbox.xMax = ( cid->font_bbox.xMax + 0xFFFFU ) >> 16; + cidface->bbox.yMax = ( cid->font_bbox.yMax + 0xFFFFU ) >> 16; + + if ( !cidface->units_per_EM ) + cidface->units_per_EM = 1000; + + cidface->ascender = (FT_Short)( cidface->bbox.yMax ); + cidface->descender = (FT_Short)( cidface->bbox.yMin ); + + cidface->height = (FT_Short)( ( cidface->units_per_EM * 12 ) / 10 ); + if ( cidface->height < cidface->ascender - cidface->descender ) + cidface->height = (FT_Short)( cidface->ascender - cidface->descender ); + + cidface->underline_position = (FT_Short)info->underline_position; + cidface->underline_thickness = (FT_Short)info->underline_thickness; + } + + Exit: + return error; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* cid_driver_init */ + /* */ + /* <Description> */ + /* Initializes a given CID driver object. */ + /* */ + /* <Input> */ + /* driver :: A handle to the target driver object. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + cid_driver_init( FT_Module driver ) + { + FT_UNUSED( driver ); + + return CID_Err_Ok; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* cid_driver_done */ + /* */ + /* <Description> */ + /* Finalizes a given CID driver. */ + /* */ + /* <Input> */ + /* driver :: A handle to the target CID driver. */ + /* */ + FT_LOCAL_DEF( void ) + cid_driver_done( FT_Module driver ) + { + FT_UNUSED( driver ); + } + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/cid/cidobjs.h b/src/WinLibs/freetype-2.3.5/src/cid/cidobjs.h new file mode 100644 index 000000000..aee346d1c --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/src/cid/cidparse.c b/src/WinLibs/freetype-2.3.5/src/cid/cidparse.c new file mode 100644 index 000000000..bb87afc58 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/cid/cidparse.c @@ -0,0 +1,226 @@ +/***************************************************************************/ +/* */ +/* cidparse.c */ +/* */ +/* CID-keyed Type1 parser (body). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_CALC_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_Int read_len = 256 + 10; + FT_Byte* p = buffer; + + + for ( offset = (FT_ULong)FT_STREAM_POS(); ; offset += 256 ) + { + FT_Int stream_len; + + + 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/src/WinLibs/freetype-2.3.5/src/cid/cidparse.h b/src/WinLibs/freetype-2.3.5/src/cid/cidparse.h new file mode 100644 index 000000000..ca37deab9 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/src/cid/cidriver.c b/src/WinLibs/freetype-2.3.5/src/cid/cidriver.c new file mode 100644 index 000000000..5c5a72957 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/cid/cidriver.c @@ -0,0 +1,163 @@ +/***************************************************************************/ +/* */ +/* cidriver.c */ +/* */ +/* CID driver interface (body). */ +/* */ +/* Copyright 1996-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 "cidriver.h" +#include "cidgload.h" +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_STREAM_H + +#include "ciderrs.h" + +#include FT_SERVICE_POSTSCRIPT_NAME_H +#include FT_SERVICE_XFREE86_NAME_H +#include FT_SERVICE_POSTSCRIPT_INFO_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 0; + } + + + static const FT_Service_PsInfoRec cid_service_ps_info = + { + (PS_GetFontInfoFunc) cid_ps_get_font_info, + (PS_HasGlyphNamesFunc) NULL, /* unsupported with CID fonts */ + (PS_GetFontPrivateFunc)NULL /* unsupported */ + }; + + + /* + * SERVICE LIST + * + */ + + static const FT_ServiceDescRec cid_services[] = + { + { FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &cid_service_ps_name }, + { FT_SERVICE_ID_XF86_NAME, FT_XF86_FORMAT_CID }, + { FT_SERVICE_ID_POSTSCRIPT_INFO, &cid_service_ps_info }, + { NULL, NULL } + }; + + + FT_CALLBACK_DEF( FT_Module_Interface ) + cid_get_interface( FT_Module module, + const char* cid_interface ) + { + FT_UNUSED( module ); + + return ft_service_list_lookup( cid_services, cid_interface ); + } + + + + FT_CALLBACK_TABLE_DEF + const FT_Driver_ClassRec t1cid_driver_class = + { + /* first of all, the FT_Module_Class fields */ + { + FT_MODULE_FONT_DRIVER | + FT_MODULE_DRIVER_SCALABLE | + FT_MODULE_DRIVER_HAS_HINTER, + + sizeof( FT_DriverRec ), + "t1cid", /* module name */ + 0x10000L, /* version 1.0 of driver */ + 0x20000L, /* requires FreeType 2.0 */ + + 0, + + cid_driver_init, + cid_driver_done, + cid_get_interface + }, + + /* then the other font drivers fields */ + sizeof( CID_FaceRec ), + sizeof( CID_SizeRec ), + sizeof( CID_GlyphSlotRec ), + + cid_face_init, + cid_face_done, + + cid_size_init, + cid_size_done, + cid_slot_init, + cid_slot_done, + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + ft_stub_set_char_sizes, + ft_stub_set_pixel_sizes, +#endif + + cid_slot_load_glyph, + + 0, /* FT_Face_GetKerningFunc */ + 0, /* FT_Face_AttachFunc */ + + 0, /* FT_Face_GetAdvancesFunc */ + + cid_size_request, + 0 /* FT_Size_SelectFunc */ + }; + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/cid/cidriver.h b/src/WinLibs/freetype-2.3.5/src/cid/cidriver.h new file mode 100644 index 000000000..d5a80f6f9 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/cid/cidriver.h @@ -0,0 +1,39 @@ +/***************************************************************************/ +/* */ +/* 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 + + + FT_CALLBACK_TABLE + const FT_Driver_ClassRec t1cid_driver_class; + + +FT_END_HEADER + +#endif /* __CIDRIVER_H__ */ + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/cid/cidtoken.h b/src/WinLibs/freetype-2.3.5/src/cid/cidtoken.h new file mode 100644 index 000000000..ad5bbb2ee --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/cid/cidtoken.h @@ -0,0 +1,103 @@ +/***************************************************************************/ +/* */ +/* cidtoken.h */ +/* */ +/* CID token definitions (specification only). */ +/* */ +/* Copyright 1996-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. */ +/* */ +/***************************************************************************/ + + +#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_NUM ( "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 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( "ExpansionFactor", expansion_factor, 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 ) + +#undef FT_STRUCTURE +#define FT_STRUCTURE FT_BBox +#undef T1CODE +#define T1CODE T1_FIELD_LOCATION_BBOX + + T1_FIELD_BBOX( "FontBBox", xMin, 0 ) + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/cid/module.mk b/src/WinLibs/freetype-2.3.5/src/cid/module.mk new file mode 100644 index 000000000..41e5a68e5 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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)t1cid_driver_class$(CLOSE_DRIVER) +$(ECHO_DRIVER)cid $(ECHO_DRIVER_DESC)Postscript CID-keyed fonts, no known extension$(ECHO_DRIVER_DONE) +endef + +# EOF diff --git a/src/WinLibs/freetype-2.3.5/src/cid/rules.mk b/src/WinLibs/freetype-2.3.5/src/cid/rules.mk new file mode 100644 index 000000000..f36274461 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/src/cid/type1cid.c b/src/WinLibs/freetype-2.3.5/src/cid/type1cid.c new file mode 100644 index 000000000..0b866e97c --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/cid/type1cid.c @@ -0,0 +1,29 @@ +/***************************************************************************/ +/* */ +/* type1cid.c */ +/* */ +/* FreeType OpenType driver component (body only). */ +/* */ +/* Copyright 1996-2001 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#define FT_MAKE_OPTION_SINGLE_OBJECT + +#include <ft2build.h> +#include "cidparse.c" +#include "cidload.c" +#include "cidobjs.c" +#include "cidriver.c" +#include "cidgload.c" + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/gxvalid/Jamfile b/src/WinLibs/freetype-2.3.5/src/gxvalid/Jamfile new file mode 100644 index 000000000..88049a625 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/src/gxvalid/README b/src/WinLibs/freetype-2.3.5/src/gxvalid/README new file mode 100644 index 000000000..28e535b0b --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/src/gxvalid/gxvalid.c b/src/WinLibs/freetype-2.3.5/src/gxvalid/gxvalid.c new file mode 100644 index 000000000..bc36e675d --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/gxvalid/gxvalid.c @@ -0,0 +1,46 @@ +/***************************************************************************/ +/* */ +/* gxvalid.c */ +/* */ +/* FreeType validator for TrueTypeGX/AAT tables (body only). */ +/* */ +/* Copyright 2005 by suzuki toshiya, Masatake YAMATO, Red Hat K.K., */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + +#define FT_MAKE_OPTION_SINGLE_OBJECT + +#include <ft2build.h> + +#include "gxvfeat.c" +#include "gxvcommn.c" +#include "gxvbsln.c" +#include "gxvtrak.c" +#include "gxvjust.c" +#include "gxvmort.c" +#include "gxvmort0.c" +#include "gxvmort1.c" +#include "gxvmort2.c" +#include "gxvmort4.c" +#include "gxvmort5.c" +#include "gxvmorx.c" +#include "gxvmorx0.c" +#include "gxvmorx1.c" +#include "gxvmorx2.c" +#include "gxvmorx4.c" +#include "gxvmorx5.c" +#include "gxvkern.c" +#include "gxvopbd.c" +#include "gxvprop.c" +#include "gxvlcar.c" +#include "gxvmod.c" + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/gxvalid/gxvalid.h b/src/WinLibs/freetype-2.3.5/src/gxvalid/gxvalid.h new file mode 100644 index 000000000..27be9ecca --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/src/gxvalid/gxvbsln.c b/src/WinLibs/freetype-2.3.5/src/gxvalid/gxvbsln.c new file mode 100644 index 000000000..6cca65831 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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_LookupValueDesc value, + GXV_Validator valid ) + { + FT_UShort v = value.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_LookupValueDesc base_value, + 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.u + + ( relative_gindex * sizeof ( FT_UShort ) ) ); + + p = valid->lookuptbl_head + offset; + limit = lookuptbl_limit; + GXV_LIMIT_CHECK( 2 ); + + value.u = FT_NEXT_USHORT( p ); + + return value; + } + + + static void + gxv_bsln_parts_fmt0_validate( FT_Bytes tables, + FT_Bytes limit, + GXV_Validator valid ) + { + FT_Bytes p = tables; + + + GXV_NAME_ENTER( "parts format 0" ); + + /* deltas */ + GXV_LIMIT_CHECK( 2 * GXV_BSLN_VALUE_COUNT ); + + valid->table_data = NULL; /* No ctlPoints here. */ + + GXV_EXIT; + } + + + static void + gxv_bsln_parts_fmt1_validate( FT_Bytes tables, + FT_Bytes limit, + GXV_Validator valid ) + { + FT_Bytes p = tables; + + + GXV_NAME_ENTER( "parts format 1" ); + + /* deltas */ + gxv_bsln_parts_fmt0_validate( p, limit, valid ); + + /* mappingData */ + valid->lookupval_sign = GXV_LOOKUPVALUE_UNSIGNED; + valid->lookupval_func = gxv_bsln_LookupValue_validate; + valid->lookupfmt4_trans = gxv_bsln_LookupFmt4_transit; + gxv_LookupTable_validate( p + 2 * GXV_BSLN_VALUE_COUNT, + limit, + valid ); + + GXV_EXIT; + } + + + static void + gxv_bsln_parts_fmt2_validate( FT_Bytes tables, + FT_Bytes limit, + GXV_Validator valid ) + { + FT_Bytes p = tables; + + FT_UShort stdGlyph; + FT_UShort ctlPoint; + FT_Int i; + + FT_UShort defaultBaseline = GXV_BSLN_DATA( defaultBaseline ); + + + GXV_NAME_ENTER( "parts format 2" ); + + GXV_LIMIT_CHECK( 2 + ( 2 * GXV_BSLN_VALUE_COUNT ) ); + + /* stdGlyph */ + stdGlyph = FT_NEXT_USHORT( p ); + GXV_TRACE(( " (stdGlyph = %u)\n", stdGlyph )); + + gxv_glyphid_validate( stdGlyph, valid ); + + /* Record the position of ctlPoints */ + GXV_BSLN_DATA( ctlPoints_p ) = p; + + /* ctlPoints */ + for ( i = 0; i < GXV_BSLN_VALUE_COUNT; i++ ) + { + ctlPoint = FT_NEXT_USHORT( p ); + if ( ctlPoint == GXV_BSLN_VALUE_EMPTY ) + { + if ( i == defaultBaseline ) + FT_INVALID_DATA; + } + else + gxv_ctlPoint_validate( stdGlyph, (FT_Short)ctlPoint, valid ); + } + + GXV_EXIT; + } + + + static void + gxv_bsln_parts_fmt3_validate( FT_Bytes tables, + FT_Bytes limit, + GXV_Validator valid) + { + FT_Bytes p = tables; + + + GXV_NAME_ENTER( "parts format 3" ); + + /* stdGlyph + ctlPoints */ + gxv_bsln_parts_fmt2_validate( p, limit, valid ); + + /* mappingData */ + valid->lookupval_sign = GXV_LOOKUPVALUE_UNSIGNED; + valid->lookupval_func = gxv_bsln_LookupValue_validate; + valid->lookupfmt4_trans = gxv_bsln_LookupFmt4_transit; + gxv_LookupTable_validate( p + ( 2 + 2 * GXV_BSLN_VALUE_COUNT ), + limit, + valid ); + + GXV_EXIT; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** bsln TABLE *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL_DEF( void ) + gxv_bsln_validate( FT_Bytes table, + FT_Face face, + FT_Validator ftvalid ) + { + GXV_ValidatorRec validrec; + GXV_Validator valid = &validrec; + + GXV_bsln_DataRec bslnrec; + GXV_bsln_Data bsln = &bslnrec; + + FT_Bytes p = table; + FT_Bytes limit = 0; + + FT_ULong version; + FT_UShort format; + FT_UShort defaultBaseline; + + GXV_Validate_Func fmt_funcs_table [] = + { + gxv_bsln_parts_fmt0_validate, + gxv_bsln_parts_fmt1_validate, + gxv_bsln_parts_fmt2_validate, + gxv_bsln_parts_fmt3_validate, + }; + + + valid->root = ftvalid; + valid->table_data = bsln; + valid->face = face; + + FT_TRACE3(( "validating `bsln' table\n" )); + GXV_INIT; + + + GXV_LIMIT_CHECK( 4 + 2 + 2 ); + version = FT_NEXT_ULONG( p ); + format = FT_NEXT_USHORT( p ); + defaultBaseline = FT_NEXT_USHORT( p ); + + /* only version 1.0 is defined (1996) */ + if ( version != 0x00010000UL ) + FT_INVALID_FORMAT; + + /* only format 1, 2, 3 are defined (1996) */ + GXV_TRACE(( " (format = %d)\n", format )); + if ( format > 3 ) + FT_INVALID_FORMAT; + + if ( defaultBaseline > 31 ) + FT_INVALID_FORMAT; + + bsln->defaultBaseline = defaultBaseline; + + fmt_funcs_table[format]( p, limit, valid ); + + FT_TRACE4(( "\n" )); + } + + +/* arch-tag: ebe81143-fdaa-4c68-a4d1-b57227daa3bc + (do not change this comment) */ + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/gxvalid/gxvcommn.c b/src/WinLibs/freetype-2.3.5/src/gxvalid/gxvcommn.c new file mode 100644 index 000000000..82fd6b3a6 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/gxvalid/gxvcommn.c @@ -0,0 +1,1758 @@ +/***************************************************************************/ +/* */ +/* gxvcommn.c */ +/* */ +/* TrueTypeGX/AAT common tables 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 "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", \ + 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_LookupValueDesc value, + GXV_Validator valid ) + { + FT_UNUSED( glyph ); + + if ( value.u >= valid->xstatetable.nClasses ) + FT_INVALID_DATA; + if ( value.u > valid->xstatetable.maxClassID ) + valid->xstatetable.maxClassID = value.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_LookupValueDesc base_value, + 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.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/src/WinLibs/freetype-2.3.5/src/gxvalid/gxvcommn.h b/src/WinLibs/freetype-2.3.5/src/gxvalid/gxvcommn.h new file mode 100644 index 000000000..0128eca79 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/gxvalid/gxvcommn.h @@ -0,0 +1,560 @@ +/***************************************************************************/ +/* */ +/* 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 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_LookupValueDesc value, + GXV_Validator valid ); + + typedef GXV_LookupValueDesc + (*GXV_Lookup_Fmt4_Transit_Func)( FT_UShort relative_gindex, + GXV_LookupValueDesc base_value, + 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 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_GlyphOffsetDesc glyphOffset, + 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 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_GlyphOffsetDesc glyphOffset, + 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/src/WinLibs/freetype-2.3.5/src/gxvalid/gxverror.h b/src/WinLibs/freetype-2.3.5/src/gxvalid/gxverror.h new file mode 100644 index 000000000..019619922 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/src/gxvalid/gxvfeat.c b/src/WinLibs/freetype-2.3.5/src/gxvalid/gxvfeat.c new file mode 100644 index 000000000..d7c6ad166 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/gxvalid/gxvfeat.c @@ -0,0 +1,343 @@ +/***************************************************************************/ +/* */ +/* gxvfeat.c */ +/* */ +/* TrueTypeGX/AAT feat 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" +#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_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_UInt 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/src/WinLibs/freetype-2.3.5/src/gxvalid/gxvfeat.h b/src/WinLibs/freetype-2.3.5/src/gxvalid/gxvfeat.h new file mode 100644 index 000000000..049d23a0b --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/src/gxvalid/gxvfgen.c b/src/WinLibs/freetype-2.3.5/src/gxvalid/gxvfgen.c new file mode 100644 index 000000000..e48778a2a --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/gxvalid/gxvfgen.c @@ -0,0 +1,482 @@ +/***************************************************************************/ +/* */ +/* gxfgen.c */ +/* */ +/* Generate feature registry data for gxv `feat' validator. */ +/* This program is derived from gxfeatreg.c in gxlayout. */ +/* */ +/* Copyright 2004, 2005, 2006 by Masatake YAMATO and Redhat K.K. */ +/* */ +/* This file may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + +/***************************************************************************/ +/* */ +/* gxfeatreg.c */ +/* */ +/* Database of font features pre-defined by Apple Computer, Inc. */ +/* http://developer.apple.com/fonts/Registry/ */ +/* (body). */ +/* */ +/* Copyright 2003 by */ +/* Masatake YAMATO and Redhat K.K. */ +/* */ +/* This file may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + +/***************************************************************************/ +/* */ +/* Development of gxfeatreg.c is supported by */ +/* Information-technology Promotion Agency, Japan. */ +/* */ +/***************************************************************************/ + + +/***************************************************************************/ +/* */ +/* This file is compiled as a stand-alone executable. */ +/* This file is never compiled into `libfreetype2'. */ +/* The output of this file is used in `gxvfeat.c'. */ +/* ----------------------------------------------------------------------- */ +/* Compile: gcc `pkg-config --cflags freetype2` gxvfgen.c -o gxvfgen */ +/* Run: ./gxvfgen > tmp.c */ +/* */ +/***************************************************************************/ + + /*******************************************************************/ + /* WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING */ + /*******************************************************************/ + + /* + * If you add a new setting to a feature, check the number of settings + * in the feature. If the number is greater than the value defined as + * FEATREG_MAX_SETTING, update the value. + */ +#define FEATREG_MAX_SETTING 12 + + /*******************************************************************/ + /* WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING */ + /*******************************************************************/ + + +#include <stdio.h> +#include <string.h> + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** Data and Types *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + +#define APPLE_RESERVED "Apple Reserved" +#define APPLE_RESERVED_LENGTH 14 + + typedef struct GX_Feature_RegistryRec_ + { + const char* feat_name; + char exclusive; + char* setting_name[FEATREG_MAX_SETTING]; + + } GX_Feature_RegistryRec; + + +#define EMPTYFEAT {0, 0, {NULL}} + + + static GX_Feature_RegistryRec featreg_table[] = { + { /* 0 */ + "All Typographic Features", + 0, + { + "All Type Features", + NULL + } + }, { /* 1 */ + "Ligatures", + 0, + { + "Required Ligatures", + "Common Ligatures", + "Rare Ligatures", + "Logos", + "Rebus Pictures", + "Diphthong Ligatures", + "Squared Ligatures", + "Squared Ligatures, Abbreviated", + NULL + } + }, { /* 2 */ + "Cursive Connection", + 1, + { + "Unconnected", + "Partially Connected", + "Cursive", + NULL + } + }, { /* 3 */ + "Letter Case", + 1, + { + "Upper & Lower Case", + "All Caps", + "All Lower Case", + "Small Caps", + "Initial Caps", + "Initial Caps & Small Caps", + NULL + } + }, { /* 4 */ + "Vertical Substitution", + 0, + { + /* "Substitute Vertical Forms", */ + "Turns on the feature", + NULL + } + }, { /* 5 */ + "Linguistic Rearrangement", + 0, + { + /* "Linguistic Rearrangement", */ + "Turns on the feature", + NULL + } + }, { /* 6 */ + "Number Spacing", + 1, + { + "Monospaced Numbers", + "Proportional Numbers", + NULL + } + }, { /* 7 */ + APPLE_RESERVED " 1", + 0, + {NULL} + }, { /* 8 */ + "Smart Swashes", + 0, + { + "Word Initial Swashes", + "Word Final Swashes", + "Line Initial Swashes", + "Line Final Swashes", + "Non-Final Swashes", + NULL + } + }, { /* 9 */ + "Diacritics", + 1, + { + "Show Diacritics", + "Hide Diacritics", + "Decompose Diacritics", + NULL + } + }, { /* 10 */ + "Vertical Position", + 1, + { + /* "Normal Position", */ + "No Vertical Position", + "Superiors", + "Inferiors", + "Ordinals", + NULL + } + }, { /* 11 */ + "Fractions", + 1, + { + "No Fractions", + "Vertical Fractions", + "Diagonal Fractions", + NULL + } + }, { /* 12 */ + APPLE_RESERVED " 2", + 0, + {NULL} + }, { /* 13 */ + "Overlapping Characters", + 0, + { + /* "Prevent Overlap", */ + "Turns on the feature", + NULL + } + }, { /* 14 */ + "Typographic Extras", + 0, + { + "Hyphens to Em Dash", + "Hyphens to En Dash", + "Unslashed Zero", + "Form Interrobang", + "Smart Quotes", + "Periods to Ellipsis", + NULL + } + }, { /* 15 */ + "Mathematical Extras", + 0, + { + "Hyphens to Minus", + "Asterisk to Multiply", + "Slash to Divide", + "Inequality Ligatures", + "Exponents", + NULL + } + }, { /* 16 */ + "Ornament Sets", + 1, + { + "No Ornaments", + "Dingbats", + "Pi Characters", + "Fleurons", + "Decorative Borders", + "International Symbols", + "Math Symbols", + NULL + } + }, { /* 17 */ + "Character Alternatives", + 1, + { + "No Alternates", + /* TODO */ + NULL + } + }, { /* 18 */ + "Design Complexity", + 1, + { + "Design Level 1", + "Design Level 2", + "Design Level 3", + "Design Level 4", + "Design Level 5", + /* TODO */ + NULL + } + }, { /* 19 */ + "Style Options", + 1, + { + "No Style Options", + "Display Text", + "Engraved Text", + "Illuminated Caps", + "Tilling Caps", + "Tall Caps", + NULL + } + }, { /* 20 */ + "Character Shape", + 1, + { + "Traditional Characters", + "Simplified Characters", + "JIS 1978 Characters", + "JIS 1983 Characters", + "JIS 1990 Characters", + "Traditional Characters, Alternative Set 1", + "Traditional Characters, Alternative Set 2", + "Traditional Characters, Alternative Set 3", + "Traditional Characters, Alternative Set 4", + "Traditional Characters, Alternative Set 5", + "Expert Characters", + NULL /* count => 12 */ + } + }, { /* 21 */ + "Number Case", + 1, + { + "Lower Case Numbers", + "Upper Case Numbers", + NULL + } + }, { /* 22 */ + "Text Spacing", + 1, + { + "Proportional", + "Monospaced", + "Half-width", + "Normal", + NULL + } + }, /* Here after Newer */ { /* 23 */ + "Transliteration", + 1, + { + "No Transliteration", + "Hanja To Hangul", + "Hiragana to Katakana", + "Katakana to Hiragana", + "Kana to Romanization", + "Romanization to Hiragana", + "Romanization to Katakana", + "Hanja to Hangul, Alternative Set 1", + "Hanja to Hangul, Alternative Set 2", + "Hanja to Hangul, Alternative Set 3", + NULL + } + }, { /* 24 */ + "Annotation", + 1, + { + "No Annotation", + "Box Annotation", + "Rounded Box Annotation", + "Circle Annotation", + "Inverted Circle Annotation", + "Parenthesis Annotation", + "Period Annotation", + "Roman Numeral Annotation", + "Diamond Annotation", + NULL + } + }, { /* 25 */ + "Kana Spacing", + 1, + { + "Full Width", + "Proportional", + NULL + } + }, { /* 26 */ + "Ideographic Spacing", + 1, + { + "Full Width", + "Proportional", + NULL + } + }, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, /* 27-30 */ + EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, /* 31-35 */ + EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, /* 36-40 */ + EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, /* 40-45 */ + EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, /* 46-50 */ + EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, /* 51-55 */ + EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, /* 56-60 */ + EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, /* 61-65 */ + EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, /* 66-70 */ + EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, /* 71-75 */ + EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, /* 76-80 */ + EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, /* 81-85 */ + EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, /* 86-90 */ + EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, /* 91-95 */ + EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, /* 96-98 */ + EMPTYFEAT, /* 99 */ { /* 100 => 22 */ + "Text Spacing", + 1, + { + "Proportional", + "Monospaced", + "Half-width", + "Normal", + NULL + } + }, { /* 101 => 25 */ + "Kana Spacing", + 1, + { + "Full Width", + "Proportional", + NULL + } + }, { /* 102 => 26 */ + "Ideographic Spacing", + 1, + { + "Full Width", + "Proportional", + NULL + } + }, { /* 103 */ + "CJK Roman Spacing", + 1, + { + "Half-width", + "Proportional", + "Default Roman", + "Full-width Roman", + NULL + } + }, { /* 104 => 1 */ + "All Typographic Features", + 0, + { + "All Type Features", + NULL + } + } + }; + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** Generator *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + int + main( void ) + { + int i; + + + printf( " {\n" ); + printf( " /* Generated from %s */\n", __FILE__ ); + + for ( i = 0; + i < sizeof ( featreg_table ) / sizeof ( GX_Feature_RegistryRec ); + i++ ) + { + const char* feat_name; + int nSettings; + + + feat_name = featreg_table[i].feat_name; + for ( nSettings = 0; + featreg_table[i].setting_name[nSettings]; + nSettings++) + ; /* Do nothing */ + + printf( " {%1d, %1d, %1d, %2d}, /* %s */\n", + feat_name ? 1 : 0, + ( feat_name && + ( ft_strncmp( feat_name, + APPLE_RESERVED, APPLE_RESERVED_LENGTH ) == 0 ) + ) ? 1 : 0, + featreg_table[i].exclusive ? 1 : 0, + nSettings, + feat_name ? feat_name : "__EMPTY__" ); + } + + printf( " };\n" ); + + return 0; + } + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/gxvalid/gxvjust.c b/src/WinLibs/freetype-2.3.5/src/gxvalid/gxvjust.c new file mode 100644 index 000000000..29bf840b5 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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_LookupValueDesc value, + GXV_Validator valid ) + { + FT_UNUSED( glyph ); + + if ( value.u > GXV_JUST_DATA( pc_offset_max ) ) + GXV_JUST_DATA( pc_offset_max ) = value.u; + if ( value.u < GXV_JUST_DATA( pc_offset_max ) ) + GXV_JUST_DATA( pc_offset_min ) = value.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_GlyphOffsetDesc glyphOffset, + 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 ); + 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_LookupValueDesc value, + GXV_Validator valid ) + { + FT_UNUSED( glyph ); + + if ( value.u > GXV_JUST_DATA( wdc_offset_max ) ) + GXV_JUST_DATA( wdc_offset_max ) = value.u; + if ( value.u < GXV_JUST_DATA( wdc_offset_min ) ) + GXV_JUST_DATA( wdc_offset_min ) = value.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_UInt 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/src/WinLibs/freetype-2.3.5/src/gxvalid/gxvkern.c b/src/WinLibs/freetype-2.3.5/src/gxvalid/gxvkern.c new file mode 100644 index 000000000..bfb405f65 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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_GlyphOffsetDesc glyphOffset, + 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 ); + + + 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/src/WinLibs/freetype-2.3.5/src/gxvalid/gxvlcar.c b/src/WinLibs/freetype-2.3.5/src/gxvalid/gxvlcar.c new file mode 100644 index 000000000..48821ea87 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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_LookupValueDesc value, + GXV_Validator valid ) + { + FT_Bytes p = valid->root->base + value.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_LookupValueDesc base_value, + 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.u + + relative_gindex * sizeof ( FT_UShort ) ); + p = valid->root->base + offset; + limit = valid->root->limit; + + GXV_LIMIT_CHECK ( 2 ); + value.u = FT_NEXT_USHORT( p ); + + return value; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** lcar TABLE *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL_DEF( void ) + gxv_lcar_validate( FT_Bytes table, + FT_Face face, + FT_Validator ftvalid ) + { + FT_Bytes p = table; + FT_Bytes limit = 0; + GXV_ValidatorRec validrec; + GXV_Validator valid = &validrec; + + GXV_lcar_DataRec lcarrec; + GXV_lcar_Data lcar = &lcarrec; + + FT_Fixed version; + + + valid->root = ftvalid; + valid->table_data = lcar; + valid->face = face; + + FT_TRACE3(( "validating `lcar' table\n" )); + GXV_INIT; + + GXV_LIMIT_CHECK( 4 + 2 ); + version = FT_NEXT_ULONG( p ); + GXV_LCAR_DATA( format ) = FT_NEXT_USHORT( p ); + + if ( version != 0x00010000UL) + FT_INVALID_FORMAT; + + if ( GXV_LCAR_DATA( format ) > 1 ) + FT_INVALID_FORMAT; + + valid->lookupval_sign = GXV_LOOKUPVALUE_UNSIGNED; + valid->lookupval_func = gxv_lcar_LookupValue_validate; + valid->lookupfmt4_trans = gxv_lcar_LookupFmt4_transit; + gxv_LookupTable_validate( p, limit, valid ); + + FT_TRACE4(( "\n" )); + } + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/gxvalid/gxvmod.c b/src/WinLibs/freetype-2.3.5/src/gxvalid/gxvmod.c new file mode 100644 index 000000000..b2b16b1ff --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/src/gxvalid/gxvmod.h b/src/WinLibs/freetype-2.3.5/src/gxvalid/gxvmod.h new file mode 100644 index 000000000..466584ef4 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/gxvalid/gxvmod.h @@ -0,0 +1,46 @@ +/***************************************************************************/ +/* */ +/* 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 + + + FT_EXPORT_VAR( const FT_Module_Class ) gxv_module_class; + + +FT_END_HEADER + +#endif /* __GXVMOD_H__ */ + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/gxvalid/gxvmort.c b/src/WinLibs/freetype-2.3.5/src/gxvalid/gxvmort.c new file mode 100644 index 000000000..6fb71b92b --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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_UInt 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_UInt nFeatureFlags, + GXV_Validator valid ) + { + FT_Bytes p = table; + FT_UInt 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/src/WinLibs/freetype-2.3.5/src/gxvalid/gxvmort.h b/src/WinLibs/freetype-2.3.5/src/gxvalid/gxvmort.h new file mode 100644 index 000000000..1d64e69c4 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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_UInt nFeatureFlags, + GXV_Validator valid ); + + FT_LOCAL( void ) + gxv_mort_coverage_validate( FT_UShort coverage, + GXV_Validator valid ); + + FT_LOCAL( void ) + gxv_mort_subtable_type0_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ); + + FT_LOCAL( void ) + gxv_mort_subtable_type1_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ); + + FT_LOCAL( void ) + gxv_mort_subtable_type2_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ); + + FT_LOCAL( void ) + gxv_mort_subtable_type4_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ); + + FT_LOCAL( void ) + gxv_mort_subtable_type5_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ); + + +#endif /* __GXVMORT_H__ */ + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/gxvalid/gxvmort0.c b/src/WinLibs/freetype-2.3.5/src/gxvalid/gxvmort0.c new file mode 100644 index 000000000..0902056c6 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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_GlyphOffsetDesc glyphOffset, + 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 ); /* 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.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/src/WinLibs/freetype-2.3.5/src/gxvalid/gxvmort1.c b/src/WinLibs/freetype-2.3.5/src/gxvalid/gxvmort1.c new file mode 100644 index 000000000..0575b1260 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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_GlyphOffsetDesc glyphOffset, + 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.ul >> 16 ); + currentOffset = (FT_Short)( glyphOffset.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 toolarge 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/src/WinLibs/freetype-2.3.5/src/gxvalid/gxvmort2.c b/src/WinLibs/freetype-2.3.5/src/gxvalid/gxvmort2.c new file mode 100644 index 000000000..f19d15dab --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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_GlyphOffsetDesc glyphOffset, + FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ) + { + FT_UShort setComponent; + FT_UShort dontAdvance; + FT_UShort offset; + + FT_UNUSED( state ); + FT_UNUSED( glyphOffset ); + 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/src/WinLibs/freetype-2.3.5/src/gxvalid/gxvmort4.c b/src/WinLibs/freetype-2.3.5/src/gxvalid/gxvmort4.c new file mode 100644 index 000000000..a04bc1efa --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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_LookupValueDesc value, + GXV_Validator valid ) + { + FT_UNUSED( glyph ); + + gxv_glyphid_validate( value.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_LookupValueDesc base_value, + 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.u + + relative_gindex * sizeof ( FT_UShort ) ); + + p = valid->lookuptbl_head + offset; + limit = lookuptbl_limit; + + GXV_LIMIT_CHECK( 2 ); + value.u = FT_NEXT_USHORT( p ); + + return value; + } + + + FT_LOCAL_DEF( void ) + gxv_mort_subtable_type4_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ) + { + FT_Bytes p = table; + + + GXV_NAME_ENTER( "mort chain subtable type4 " + "(Non-Contextual Glyph Substitution)" ); + + valid->lookupval_sign = GXV_LOOKUPVALUE_UNSIGNED; + valid->lookupval_func = gxv_mort_subtable_type4_lookupval_validate; + valid->lookupfmt4_trans = gxv_mort_subtable_type4_lookupfmt4_transit; + + gxv_LookupTable_validate( p, limit, valid ); + + GXV_EXIT; + } + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/gxvalid/gxvmort5.c b/src/WinLibs/freetype-2.3.5/src/gxvalid/gxvmort5.c new file mode 100644 index 000000000..a7cabc359 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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_GlyphOffsetDesc 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/src/WinLibs/freetype-2.3.5/src/gxvalid/gxvmorx.c b/src/WinLibs/freetype-2.3.5/src/gxvalid/gxvmorx.c new file mode 100644 index 000000000..849d5e942 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/gxvalid/gxvmorx.c @@ -0,0 +1,183 @@ +/***************************************************************************/ +/* */ +/* gxvmorx.c */ +/* */ +/* TrueTypeGX/AAT morx 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 "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_UInt type; + FT_UInt 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 >= 0x10000 ) + 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/src/WinLibs/freetype-2.3.5/src/gxvalid/gxvmorx.h b/src/WinLibs/freetype-2.3.5/src/gxvalid/gxvmorx.h new file mode 100644 index 000000000..28c1a44f6 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/src/gxvalid/gxvmorx0.c b/src/WinLibs/freetype-2.3.5/src/gxvalid/gxvmorx0.c new file mode 100644 index 000000000..ca92b6c39 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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_GlyphOffsetDesc glyphOffset, + 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 ); + 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/src/WinLibs/freetype-2.3.5/src/gxvalid/gxvmorx1.c b/src/WinLibs/freetype-2.3.5/src/gxvalid/gxvmorx1.c new file mode 100644 index 000000000..331d4ccda --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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_GlyphOffsetDesc glyphOffset, + 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.ul >> 16 ); + currentIndex = (FT_Short)( glyphOffset.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_LookupValueDesc value, + GXV_Validator valid ) + { + FT_UNUSED( glyph ); /* for the non-debugging case */ + + GXV_TRACE(( "morx subtable type1 subst.: %d -> %d\n", glyph, value.u )); + + if ( value.u > valid->face->num_glyphs ) + FT_INVALID_GLYPH_ID; + } + + + static GXV_LookupValueDesc + gxv_morx_subtable_type1_LookupFmt4_transit( + FT_UShort relative_gindex, + GXV_LookupValueDesc base_value, + 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.u + + relative_gindex * sizeof ( FT_UShort ) ); + + p = valid->lookuptbl_head + offset; + limit = lookuptbl_limit; + + GXV_LIMIT_CHECK ( 2 ); + value.u = FT_NEXT_USHORT( p ); + + return value; + } + + + /* + * TODO: length should be limit? + **/ + static void + gxv_morx_subtable_type1_substitutionTable_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ) + { + FT_Bytes p = table; + FT_UShort i; + + GXV_morx_subtable_type1_StateOptRecData optdata = + (GXV_morx_subtable_type1_StateOptRecData)valid->xstatetable.optdata; + + + /* TODO: calculate offset/length for each lookupTables */ + valid->lookupval_sign = GXV_LOOKUPVALUE_UNSIGNED; + valid->lookupval_func = gxv_morx_subtable_type1_LookupValue_validate; + valid->lookupfmt4_trans = gxv_morx_subtable_type1_LookupFmt4_transit; + + for ( i = 0; i < optdata->substitutionTable_num_lookupTables; i++ ) + { + FT_ULong offset; + + + GXV_LIMIT_CHECK( 4 ); + offset = FT_NEXT_ULONG( p ); + + gxv_LookupTable_validate( table + offset, limit, valid ); + } + + /* TODO: overlapping of lookupTables in substitutionTable */ + } + + + /* + * subtable for Contextual glyph substitution is a modified StateTable. + * In addition to classTable, stateArray, entryTable, the field + * `substitutionTable' is added. + */ + FT_LOCAL_DEF( void ) + gxv_morx_subtable_type1_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ) + { + FT_Bytes p = table; + + GXV_morx_subtable_type1_StateOptRec st_rec; + + + GXV_NAME_ENTER( "morx chain subtable type1 (Contextual Glyph Subst)" ); + + GXV_LIMIT_CHECK( GXV_MORX_SUBTABLE_TYPE1_HEADER_SIZE ); + + st_rec.substitutionTable_num_lookupTables = 0; + + valid->xstatetable.optdata = + &st_rec; + valid->xstatetable.optdata_load_func = + gxv_morx_subtable_type1_substitutionTable_load; + valid->xstatetable.subtable_setup_func = + gxv_morx_subtable_type1_subtable_setup; + valid->xstatetable.entry_glyphoffset_fmt = + GXV_GLYPHOFFSET_ULONG; + valid->xstatetable.entry_validate_func = + gxv_morx_subtable_type1_entry_validate; + + gxv_XStateTable_validate( p, limit, valid ); + + gxv_morx_subtable_type1_substitutionTable_validate( + table + st_rec.substitutionTable, + table + st_rec.substitutionTable + st_rec.substitutionTable_length, + valid ); + + GXV_EXIT; + } + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/gxvalid/gxvmorx2.c b/src/WinLibs/freetype-2.3.5/src/gxvalid/gxvmorx2.c new file mode 100644 index 000000000..5cad5169c --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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_GlyphOffsetDesc glyphOffset, + 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.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/src/WinLibs/freetype-2.3.5/src/gxvalid/gxvmorx4.c b/src/WinLibs/freetype-2.3.5/src/gxvalid/gxvmorx4.c new file mode 100644 index 000000000..c0d2f78e3 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/src/gxvalid/gxvmorx5.c b/src/WinLibs/freetype-2.3.5/src/gxvalid/gxvmorx5.c new file mode 100644 index 000000000..d9115618c --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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_GlyphOffsetDesc 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_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.ul >> 16 ); + markedInsertList = (FT_UShort)( glyphOffset.ul ); + + if ( currentInsertList && 0 != currentInsertCount ) + gxv_morx_subtable_type5_InsertList_validate( currentInsertList, + currentInsertCount, + table, limit, + valid ); + + if ( markedInsertList && 0 != markedInsertCount ) + gxv_morx_subtable_type5_InsertList_validate( markedInsertList, + markedInsertCount, + table, limit, + valid ); + } + + + FT_LOCAL_DEF( void ) + gxv_morx_subtable_type5_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ) + { + FT_Bytes p = table; + + GXV_morx_subtable_type5_StateOptRec et_rec; + GXV_morx_subtable_type5_StateOptRecData et = &et_rec; + + + GXV_NAME_ENTER( "morx chain subtable type5 (Glyph Insertion)" ); + + GXV_LIMIT_CHECK( GXV_MORX_SUBTABLE_TYPE5_HEADER_SIZE ); + + valid->xstatetable.optdata = + et; + valid->xstatetable.optdata_load_func = + gxv_morx_subtable_type5_insertionGlyphList_load; + valid->xstatetable.subtable_setup_func = + gxv_morx_subtable_type5_subtable_setup; + valid->xstatetable.entry_glyphoffset_fmt = + GXV_GLYPHOFFSET_ULONG; + valid->xstatetable.entry_validate_func = + gxv_morx_subtable_type5_entry_validate; + + gxv_XStateTable_validate( p, limit, valid ); + + GXV_EXIT; + } + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/gxvalid/gxvopbd.c b/src/WinLibs/freetype-2.3.5/src/gxvalid/gxvopbd.c new file mode 100644 index 000000000..8d6fe669f --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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_LookupValueDesc value, + GXV_Validator valid ) + { + /* offset in LookupTable is measured from the head of opbd table */ + FT_Bytes p = valid->root->base + value.u; + FT_Bytes limit = valid->root->limit; + FT_Short delta_value; + int i; + + + if ( value.u < GXV_OPBD_DATA( valueOffset_min ) ) + GXV_OPBD_DATA( valueOffset_min ) = value.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_LookupValueDesc base_value, + 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.u + + relative_gindex * 4 * sizeof ( FT_Short ) ); + + return value; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** opbd TABLE *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL_DEF( void ) + gxv_opbd_validate( FT_Bytes table, + FT_Face face, + FT_Validator ftvalid ) + { + GXV_ValidatorRec validrec; + GXV_Validator valid = &validrec; + GXV_opbd_DataRec opbdrec; + GXV_opbd_Data opbd = &opbdrec; + FT_Bytes p = table; + FT_Bytes limit = 0; + + FT_ULong version; + + + valid->root = ftvalid; + valid->table_data = opbd; + valid->face = face; + + FT_TRACE3(( "validating `opbd' table\n" )); + GXV_INIT; + GXV_OPBD_DATA( valueOffset_min ) = 0xFFFFU; + + + GXV_LIMIT_CHECK( 4 + 2 ); + version = FT_NEXT_ULONG( p ); + GXV_OPBD_DATA( format ) = FT_NEXT_USHORT( p ); + + + /* only 0x00010000 is defined (1996) */ + GXV_TRACE(( "(version=0x%08x)\n", version )); + if ( 0x00010000UL != version ) + FT_INVALID_FORMAT; + + /* only values 0 and 1 are defined (1996) */ + GXV_TRACE(( "(format=0x%04x)\n", GXV_OPBD_DATA( format ) )); + if ( 0x0001 < GXV_OPBD_DATA( format ) ) + FT_INVALID_FORMAT; + + valid->lookupval_sign = GXV_LOOKUPVALUE_UNSIGNED; + valid->lookupval_func = gxv_opbd_LookupValue_validate; + valid->lookupfmt4_trans = gxv_opbd_LookupFmt4_transit; + + gxv_LookupTable_validate( p, limit, valid ); + p += valid->subtable_length; + + if ( p > table + GXV_OPBD_DATA( valueOffset_min ) ) + { + GXV_TRACE(( + "found overlap between LookupTable and opbd_value array\n" )); + FT_INVALID_OFFSET; + } + + FT_TRACE4(( "\n" )); + } + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/gxvalid/gxvprop.c b/src/WinLibs/freetype-2.3.5/src/gxvalid/gxvprop.c new file mode 100644 index 000000000..010eeda42 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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_LookupValueDesc value, + GXV_Validator valid ) + { + gxv_prop_property_validate( value.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_LookupValueDesc base_value, + 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.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/src/WinLibs/freetype-2.3.5/src/gxvalid/gxvtrak.c b/src/WinLibs/freetype-2.3.5/src/gxvalid/gxvtrak.c new file mode 100644 index 000000000..432ee4e27 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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_UInt 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/src/WinLibs/freetype-2.3.5/src/gxvalid/module.mk b/src/WinLibs/freetype-2.3.5/src/gxvalid/module.mk new file mode 100644 index 000000000..44ef94add --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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)gxv_module_class$(CLOSE_DRIVER) +$(ECHO_DRIVER)gxvalid $(ECHO_DRIVER_DESC)TrueTypeGX/AAT validation module$(ECHO_DRIVER_DONE) +endef + +# EOF diff --git a/src/WinLibs/freetype-2.3.5/src/gxvalid/rules.mk b/src/WinLibs/freetype-2.3.5/src/gxvalid/rules.mk new file mode 100644 index 000000000..57bc0823d --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/src/gzip/Jamfile b/src/WinLibs/freetype-2.3.5/src/gzip/Jamfile new file mode 100644 index 000000000..a7aafa051 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/src/gzip/adler32.c b/src/WinLibs/freetype-2.3.5/src/gzip/adler32.c new file mode 100644 index 000000000..36f6a432e --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/gzip/adler32.c @@ -0,0 +1,48 @@ +/* adler32.c -- compute the Adler-32 checksum of a data stream + * Copyright (C) 1995-2002 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* @(#) $Id: adler32.c,v 1.5 2007/06/01 06:56:17 wl Exp $ */ + +#include "zlib.h" + +#define BASE 65521L /* largest prime smaller than 65536 */ +#define NMAX 5552 +/* NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1 */ + +#define DO1(buf,i) {s1 += buf[i]; s2 += s1;} +#define DO2(buf,i) DO1(buf,i); DO1(buf,i+1); +#define DO4(buf,i) DO2(buf,i); DO2(buf,i+2); +#define DO8(buf,i) DO4(buf,i); DO4(buf,i+4); +#define DO16(buf) DO8(buf,0); DO8(buf,8); + +/* ========================================================================= */ +ZEXPORT(uLong) adler32( /* adler, buf, len) */ + uLong adler, + const Bytef *buf, + uInt len ) +{ + unsigned long s1 = adler & 0xffff; + unsigned long s2 = (adler >> 16) & 0xffff; + int k; + + if (buf == Z_NULL) return 1L; + + while (len > 0) { + k = len < NMAX ? len : NMAX; + len -= k; + while (k >= 16) { + DO16(buf); + buf += 16; + k -= 16; + } + if (k != 0) do { + s1 += *buf++; + s2 += s1; + } while (--k); + s1 %= BASE; + s2 %= BASE; + } + return (s2 << 16) | s1; +} diff --git a/src/WinLibs/freetype-2.3.5/src/gzip/ftgzip.c b/src/WinLibs/freetype-2.3.5/src/gzip/ftgzip.c new file mode 100644 index 000000000..af2022d7f --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/gzip/ftgzip.c @@ -0,0 +1,682 @@ +/***************************************************************************/ +/* */ +/* 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 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. 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 <string.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_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 +#define MY_ZCALLOC + +#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 ); + } + + +#ifndef FT_CONFIG_OPTION_SYSTEM_ZLIB + + 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 */ + + +/***************************************************************************/ +/***************************************************************************/ +/***** *****/ +/***** 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; + + 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/src/WinLibs/freetype-2.3.5/src/gzip/infblock.c b/src/WinLibs/freetype-2.3.5/src/gzip/infblock.c new file mode 100644 index 000000000..d6e2dc297 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/gzip/infblock.c @@ -0,0 +1,387 @@ +/* infblock.c -- interpret and process block types to last block + * Copyright (C) 1995-2002 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#include "zutil.h" +#include "infblock.h" +#include "inftrees.h" +#include "infcodes.h" +#include "infutil.h" + + +/* simplify the use of the inflate_huft type with some defines */ +#define exop word.what.Exop +#define bits word.what.Bits + +/* Table for deflate from PKZIP's appnote.txt. */ +local const uInt border[] = { /* Order of the bit length code lengths */ + 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; + +/* + Notes beyond the 1.93a appnote.txt: + + 1. Distance pointers never point before the beginning of the output + stream. + 2. Distance pointers can point back across blocks, up to 32k away. + 3. There is an implied maximum of 7 bits for the bit length table and + 15 bits for the actual data. + 4. If only one code exists, then it is encoded using one bit. (Zero + would be more efficient, but perhaps a little confusing.) If two + codes exist, they are coded using one bit each (0 and 1). + 5. There is no way of sending zero distance codes--a dummy must be + sent if there are none. (History: a pre 2.0 version of PKZIP would + store blocks with no distance codes, but this was discovered to be + too harsh a criterion.) Valid only for 1.93a. 2.04c does allow + zero distance codes, which is sent as one code of zero bits in + length. + 6. There are up to 286 literal/length codes. Code 256 represents the + end-of-block. Note however that the static length tree defines + 288 codes just to fill out the Huffman codes. Codes 286 and 287 + cannot be used though, since there is no length base or extra bits + defined for them. Similarily, there are up to 30 distance codes. + However, static trees define 32 codes (all 5 bits) to fill out the + Huffman codes, but the last two had better not show up in the data. + 7. Unzip can check dynamic Huffman blocks for complete code sets. + The exception is that a single code would not be complete (see #4). + 8. The five bits following the block type is really the number of + literal codes sent minus 257. + 9. Length codes 8,16,16 are interpreted as 13 length codes of 8 bits + (1+6+6). Therefore, to output three times the length, you output + three codes (1+1+1), whereas to output four times the same length, + you only need two codes (1+3). Hmm. + 10. In the tree reconstruction algorithm, Code = Code + Increment + only if BitLength(i) is not zero. (Pretty obvious.) + 11. Correction: 4 Bits: # of Bit Length codes - 4 (4 - 19) + 12. Note: length code 284 can represent 227-258, but length code 285 + really is 258. The last length deserves its own, short code + since it gets used a lot in very redundant files. The length + 258 is special since 258 - 3 (the min match length) is 255. + 13. The literal/length and distance code bit lengths are read as a + single stream of lengths. It is possible (and advantageous) for + a repeat code (16, 17, or 18) to go across the boundary between + the two sets of lengths. + */ + + +local void inflate_blocks_reset( /* s, z, c) */ +inflate_blocks_statef *s, +z_streamp z, +uLongf *c ) +{ + if (c != Z_NULL) + *c = s->check; + if (s->mode == BTREE || s->mode == DTREE) + ZFREE(z, s->sub.trees.blens); + if (s->mode == CODES) + inflate_codes_free(s->sub.decode.codes, z); + s->mode = TYPE; + s->bitk = 0; + s->bitb = 0; + s->read = s->write = s->window; + if (s->checkfn != Z_NULL) + z->adler = s->check = (*s->checkfn)(0L, (const Bytef *)Z_NULL, 0); + Tracev((stderr, "inflate: blocks reset\n")); +} + + +local inflate_blocks_statef *inflate_blocks_new( /* z, c, w) */ +z_streamp z, +check_func c, +uInt w ) +{ + inflate_blocks_statef *s; + + if ((s = (inflate_blocks_statef *)ZALLOC + (z,1,sizeof(struct inflate_blocks_state))) == Z_NULL) + return s; + if ((s->hufts = + (inflate_huft *)ZALLOC(z, sizeof(inflate_huft), MANY)) == Z_NULL) + { + ZFREE(z, s); + return Z_NULL; + } + if ((s->window = (Bytef *)ZALLOC(z, 1, w)) == Z_NULL) + { + ZFREE(z, s->hufts); + ZFREE(z, s); + return Z_NULL; + } + s->end = s->window + w; + s->checkfn = c; + s->mode = TYPE; + Tracev((stderr, "inflate: blocks allocated\n")); + inflate_blocks_reset(s, z, Z_NULL); + return s; +} + + +local int inflate_blocks( /* s, z, r) */ +inflate_blocks_statef *s, +z_streamp z, +int r ) +{ + uInt t; /* temporary storage */ + uLong b; /* bit buffer */ + uInt k; /* bits in bit buffer */ + Bytef *p; /* input data pointer */ + uInt n; /* bytes available there */ + Bytef *q; /* output window write pointer */ + uInt m; /* bytes to end of window or read pointer */ + + /* copy input/output information to locals (UPDATE macro restores) */ + LOAD + + /* process input based on current state */ + while (1) switch (s->mode) + { + case TYPE: + NEEDBITS(3) + t = (uInt)b & 7; + s->last = t & 1; + switch (t >> 1) + { + case 0: /* stored */ + Tracev((stderr, "inflate: stored block%s\n", + s->last ? " (last)" : "")); + DUMPBITS(3) + t = k & 7; /* go to byte boundary */ + DUMPBITS(t) + s->mode = LENS; /* get length of stored block */ + break; + case 1: /* fixed */ + Tracev((stderr, "inflate: fixed codes block%s\n", + s->last ? " (last)" : "")); + { + uInt bl, bd; + inflate_huft *tl, *td; + + inflate_trees_fixed(&bl, &bd, (const inflate_huft**)&tl, + (const inflate_huft**)&td, z); + s->sub.decode.codes = inflate_codes_new(bl, bd, tl, td, z); + if (s->sub.decode.codes == Z_NULL) + { + r = Z_MEM_ERROR; + LEAVE + } + } + DUMPBITS(3) + s->mode = CODES; + break; + case 2: /* dynamic */ + Tracev((stderr, "inflate: dynamic codes block%s\n", + s->last ? " (last)" : "")); + DUMPBITS(3) + s->mode = TABLE; + break; + case 3: /* illegal */ + DUMPBITS(3) + s->mode = BAD; + z->msg = (char*)"invalid block type"; + r = Z_DATA_ERROR; + LEAVE + } + break; + case LENS: + NEEDBITS(32) + if ((((~b) >> 16) & 0xffff) != (b & 0xffff)) + { + s->mode = BAD; + z->msg = (char*)"invalid stored block lengths"; + r = Z_DATA_ERROR; + LEAVE + } + s->sub.left = (uInt)b & 0xffff; + b = k = 0; /* dump bits */ + Tracev((stderr, "inflate: stored length %u\n", s->sub.left)); + s->mode = s->sub.left ? STORED : (s->last ? DRY : TYPE); + break; + case STORED: + if (n == 0) + LEAVE + NEEDOUT + t = s->sub.left; + if (t > n) t = n; + if (t > m) t = m; + zmemcpy(q, p, t); + p += t; n -= t; + q += t; m -= t; + if ((s->sub.left -= t) != 0) + break; + Tracev((stderr, "inflate: stored end, %lu total out\n", + z->total_out + (q >= s->read ? q - s->read : + (s->end - s->read) + (q - s->window)))); + s->mode = s->last ? DRY : TYPE; + break; + case TABLE: + NEEDBITS(14) + s->sub.trees.table = t = (uInt)b & 0x3fff; +#ifndef PKZIP_BUG_WORKAROUND + if ((t & 0x1f) > 29 || ((t >> 5) & 0x1f) > 29) + { + s->mode = BAD; + z->msg = (char*)"too many length or distance symbols"; + r = Z_DATA_ERROR; + LEAVE + } +#endif + t = 258 + (t & 0x1f) + ((t >> 5) & 0x1f); + if ((s->sub.trees.blens = (uIntf*)ZALLOC(z, t, sizeof(uInt))) == Z_NULL) + { + r = Z_MEM_ERROR; + LEAVE + } + DUMPBITS(14) + s->sub.trees.index = 0; + Tracev((stderr, "inflate: table sizes ok\n")); + s->mode = BTREE; + case BTREE: + while (s->sub.trees.index < 4 + (s->sub.trees.table >> 10)) + { + NEEDBITS(3) + s->sub.trees.blens[border[s->sub.trees.index++]] = (uInt)b & 7; + DUMPBITS(3) + } + while (s->sub.trees.index < 19) + s->sub.trees.blens[border[s->sub.trees.index++]] = 0; + s->sub.trees.bb = 7; + t = inflate_trees_bits(s->sub.trees.blens, &s->sub.trees.bb, + &s->sub.trees.tb, s->hufts, z); + if (t != Z_OK) + { + r = t; + if (r == Z_DATA_ERROR) + { + ZFREE(z, s->sub.trees.blens); + s->mode = BAD; + } + LEAVE + } + s->sub.trees.index = 0; + Tracev((stderr, "inflate: bits tree ok\n")); + s->mode = DTREE; + case DTREE: + while (t = s->sub.trees.table, + s->sub.trees.index < 258 + (t & 0x1f) + ((t >> 5) & 0x1f)) + { + inflate_huft *h; + uInt i, j, c; + + t = s->sub.trees.bb; + NEEDBITS(t) + h = s->sub.trees.tb + ((uInt)b & inflate_mask[t]); + t = h->bits; + c = h->base; + if (c < 16) + { + DUMPBITS(t) + s->sub.trees.blens[s->sub.trees.index++] = c; + } + else /* c == 16..18 */ + { + i = c == 18 ? 7 : c - 14; + j = c == 18 ? 11 : 3; + NEEDBITS(t + i) + DUMPBITS(t) + j += (uInt)b & inflate_mask[i]; + DUMPBITS(i) + i = s->sub.trees.index; + t = s->sub.trees.table; + if (i + j > 258 + (t & 0x1f) + ((t >> 5) & 0x1f) || + (c == 16 && i < 1)) + { + ZFREE(z, s->sub.trees.blens); + s->mode = BAD; + z->msg = (char*)"invalid bit length repeat"; + r = Z_DATA_ERROR; + LEAVE + } + c = c == 16 ? s->sub.trees.blens[i - 1] : 0; + do { + s->sub.trees.blens[i++] = c; + } while (--j); + s->sub.trees.index = i; + } + } + s->sub.trees.tb = Z_NULL; + { + uInt bl, bd; + inflate_huft *tl, *td; + inflate_codes_statef *c; + + bl = 9; /* must be <= 9 for lookahead assumptions */ + bd = 6; /* must be <= 9 for lookahead assumptions */ + t = s->sub.trees.table; + t = inflate_trees_dynamic(257 + (t & 0x1f), 1 + ((t >> 5) & 0x1f), + s->sub.trees.blens, &bl, &bd, &tl, &td, + s->hufts, z); + if (t != Z_OK) + { + if (t == (uInt)Z_DATA_ERROR) + { + ZFREE(z, s->sub.trees.blens); + s->mode = BAD; + } + r = t; + LEAVE + } + Tracev((stderr, "inflate: trees ok\n")); + if ((c = inflate_codes_new(bl, bd, tl, td, z)) == Z_NULL) + { + r = Z_MEM_ERROR; + LEAVE + } + s->sub.decode.codes = c; + } + ZFREE(z, s->sub.trees.blens); + s->mode = CODES; + case CODES: + UPDATE + if ((r = inflate_codes(s, z, r)) != Z_STREAM_END) + return inflate_flush(s, z, r); + r = Z_OK; + inflate_codes_free(s->sub.decode.codes, z); + LOAD + Tracev((stderr, "inflate: codes end, %lu total out\n", + z->total_out + (q >= s->read ? q - s->read : + (s->end - s->read) + (q - s->window)))); + if (!s->last) + { + s->mode = TYPE; + break; + } + s->mode = DRY; + case DRY: + FLUSH + if (s->read != s->write) + LEAVE + s->mode = DONE; + case DONE: + r = Z_STREAM_END; + LEAVE + case BAD: + r = Z_DATA_ERROR; + LEAVE + default: + r = Z_STREAM_ERROR; + LEAVE + } +#ifdef NEED_DUMMY_RETURN + return 0; +#endif +} + + +local int inflate_blocks_free( /* s, z) */ +inflate_blocks_statef *s, +z_streamp z ) +{ + inflate_blocks_reset(s, z, Z_NULL); + ZFREE(z, s->window); + ZFREE(z, s->hufts); + ZFREE(z, s); + Tracev((stderr, "inflate: blocks freed\n")); + return Z_OK; +} + + diff --git a/src/WinLibs/freetype-2.3.5/src/gzip/infblock.h b/src/WinLibs/freetype-2.3.5/src/gzip/infblock.h new file mode 100644 index 000000000..c2535a1e4 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/gzip/infblock.h @@ -0,0 +1,36 @@ +/* infblock.h -- header to use infblock.c + * Copyright (C) 1995-2002 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +#ifndef _INFBLOCK_H +#define _INFBLOCK_H + +struct inflate_blocks_state; +typedef struct inflate_blocks_state FAR inflate_blocks_statef; + +local inflate_blocks_statef * inflate_blocks_new OF(( + z_streamp z, + check_func c, /* check function */ + uInt w)); /* window size */ + +local int inflate_blocks OF(( + inflate_blocks_statef *, + z_streamp , + int)); /* initial return code */ + +local void inflate_blocks_reset OF(( + inflate_blocks_statef *, + z_streamp , + uLongf *)); /* check value on output */ + +local int inflate_blocks_free OF(( + inflate_blocks_statef *, + z_streamp)); + +#endif /* _INFBLOCK_H */ diff --git a/src/WinLibs/freetype-2.3.5/src/gzip/infcodes.c b/src/WinLibs/freetype-2.3.5/src/gzip/infcodes.c new file mode 100644 index 000000000..f7bfd58c4 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/gzip/infcodes.c @@ -0,0 +1,250 @@ +/* infcodes.c -- process literals and length/distance pairs + * Copyright (C) 1995-2002 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#include "zutil.h" +#include "inftrees.h" +#include "infblock.h" +#include "infcodes.h" +#include "infutil.h" + +/* simplify the use of the inflate_huft type with some defines */ +#define exop word.what.Exop +#define bits word.what.Bits + +typedef enum { /* waiting for "i:"=input, "o:"=output, "x:"=nothing */ + START, /* x: set up for LEN */ + LEN, /* i: get length/literal/eob next */ + LENEXT, /* i: getting length extra (have base) */ + DIST, /* i: get distance next */ + DISTEXT, /* i: getting distance extra */ + COPY, /* o: copying bytes in window, waiting for space */ + LIT, /* o: got literal, waiting for output space */ + WASH, /* o: got eob, possibly still output waiting */ + END, /* x: got eob and all data flushed */ + BADCODE} /* x: got error */ +inflate_codes_mode; + +/* inflate codes private state */ +struct inflate_codes_state { + + /* mode */ + inflate_codes_mode mode; /* current inflate_codes mode */ + + /* mode dependent information */ + uInt len; + union { + struct { + inflate_huft *tree; /* pointer into tree */ + uInt need; /* bits needed */ + } code; /* if LEN or DIST, where in tree */ + uInt lit; /* if LIT, literal */ + struct { + uInt get; /* bits to get for extra */ + uInt dist; /* distance back to copy from */ + } copy; /* if EXT or COPY, where and how much */ + } sub; /* submode */ + + /* mode independent information */ + Byte lbits; /* ltree bits decoded per branch */ + Byte dbits; /* dtree bits decoder per branch */ + inflate_huft *ltree; /* literal/length/eob tree */ + inflate_huft *dtree; /* distance tree */ + +}; + + +local inflate_codes_statef *inflate_codes_new( /* bl, bd, tl, td, z) */ +uInt bl, uInt bd, +inflate_huft *tl, +inflate_huft *td, /* need separate declaration for Borland C++ */ +z_streamp z ) +{ + inflate_codes_statef *c; + + if ((c = (inflate_codes_statef *) + ZALLOC(z,1,sizeof(struct inflate_codes_state))) != Z_NULL) + { + c->mode = START; + c->lbits = (Byte)bl; + c->dbits = (Byte)bd; + c->ltree = tl; + c->dtree = td; + Tracev((stderr, "inflate: codes new\n")); + } + return c; +} + + +local int inflate_codes( /* s, z, r) */ +inflate_blocks_statef *s, +z_streamp z, +int r ) +{ + uInt j; /* temporary storage */ + inflate_huft *t; /* temporary pointer */ + uInt e; /* extra bits or operation */ + uLong b; /* bit buffer */ + uInt k; /* bits in bit buffer */ + Bytef *p; /* input data pointer */ + uInt n; /* bytes available there */ + Bytef *q; /* output window write pointer */ + uInt m; /* bytes to end of window or read pointer */ + Bytef *f; /* pointer to copy strings from */ + inflate_codes_statef *c = s->sub.decode.codes; /* codes state */ + + /* copy input/output information to locals (UPDATE macro restores) */ + LOAD + + /* process input and output based on current state */ + while (1) switch (c->mode) + { /* waiting for "i:"=input, "o:"=output, "x:"=nothing */ + case START: /* x: set up for LEN */ +#ifndef SLOW + if (m >= 258 && n >= 10) + { + UPDATE + r = inflate_fast(c->lbits, c->dbits, c->ltree, c->dtree, s, z); + LOAD + if (r != Z_OK) + { + c->mode = r == Z_STREAM_END ? WASH : BADCODE; + break; + } + } +#endif /* !SLOW */ + c->sub.code.need = c->lbits; + c->sub.code.tree = c->ltree; + c->mode = LEN; + case LEN: /* i: get length/literal/eob next */ + j = c->sub.code.need; + NEEDBITS(j) + t = c->sub.code.tree + ((uInt)b & inflate_mask[j]); + DUMPBITS(t->bits) + e = (uInt)(t->exop); + if (e == 0) /* literal */ + { + c->sub.lit = t->base; + Tracevv((stderr, t->base >= 0x20 && t->base < 0x7f ? + "inflate: literal '%c'\n" : + "inflate: literal 0x%02x\n", t->base)); + c->mode = LIT; + break; + } + if (e & 16) /* length */ + { + c->sub.copy.get = e & 15; + c->len = t->base; + c->mode = LENEXT; + break; + } + if ((e & 64) == 0) /* next table */ + { + c->sub.code.need = e; + c->sub.code.tree = t + t->base; + break; + } + if (e & 32) /* end of block */ + { + Tracevv((stderr, "inflate: end of block\n")); + c->mode = WASH; + break; + } + c->mode = BADCODE; /* invalid code */ + z->msg = (char*)"invalid literal/length code"; + r = Z_DATA_ERROR; + LEAVE + case LENEXT: /* i: getting length extra (have base) */ + j = c->sub.copy.get; + NEEDBITS(j) + c->len += (uInt)b & inflate_mask[j]; + DUMPBITS(j) + c->sub.code.need = c->dbits; + c->sub.code.tree = c->dtree; + Tracevv((stderr, "inflate: length %u\n", c->len)); + c->mode = DIST; + case DIST: /* i: get distance next */ + j = c->sub.code.need; + NEEDBITS(j) + t = c->sub.code.tree + ((uInt)b & inflate_mask[j]); + DUMPBITS(t->bits) + e = (uInt)(t->exop); + if (e & 16) /* distance */ + { + c->sub.copy.get = e & 15; + c->sub.copy.dist = t->base; + c->mode = DISTEXT; + break; + } + if ((e & 64) == 0) /* next table */ + { + c->sub.code.need = e; + c->sub.code.tree = t + t->base; + break; + } + c->mode = BADCODE; /* invalid code */ + z->msg = (char*)"invalid distance code"; + r = Z_DATA_ERROR; + LEAVE + case DISTEXT: /* i: getting distance extra */ + j = c->sub.copy.get; + NEEDBITS(j) + c->sub.copy.dist += (uInt)b & inflate_mask[j]; + DUMPBITS(j) + Tracevv((stderr, "inflate: distance %u\n", c->sub.copy.dist)); + c->mode = COPY; + case COPY: /* o: copying bytes in window, waiting for space */ + f = q - c->sub.copy.dist; + while (f < s->window) /* modulo window size-"while" instead */ + f += s->end - s->window; /* of "if" handles invalid distances */ + while (c->len) + { + NEEDOUT + OUTBYTE(*f++) + if (f == s->end) + f = s->window; + c->len--; + } + c->mode = START; + break; + case LIT: /* o: got literal, waiting for output space */ + NEEDOUT + OUTBYTE(c->sub.lit) + c->mode = START; + break; + case WASH: /* o: got eob, possibly more output */ + if (k > 7) /* return unused byte, if any */ + { + Assert(k < 16, "inflate_codes grabbed too many bytes") + k -= 8; + n++; + p--; /* can always return one */ + } + FLUSH + if (s->read != s->write) + LEAVE + c->mode = END; + case END: + r = Z_STREAM_END; + LEAVE + case BADCODE: /* x: got error */ + r = Z_DATA_ERROR; + LEAVE + default: + r = Z_STREAM_ERROR; + LEAVE + } +#ifdef NEED_DUMMY_RETURN + return Z_STREAM_ERROR; /* Some dumb compilers complain without this */ +#endif +} + + +local void inflate_codes_free( /* c, z) */ +inflate_codes_statef *c, +z_streamp z ) +{ + ZFREE(z, c); + Tracev((stderr, "inflate: codes free\n")); +} diff --git a/src/WinLibs/freetype-2.3.5/src/gzip/infcodes.h b/src/WinLibs/freetype-2.3.5/src/gzip/infcodes.h new file mode 100644 index 000000000..154d7f896 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/gzip/infcodes.h @@ -0,0 +1,31 @@ +/* infcodes.h -- header to use infcodes.c + * Copyright (C) 1995-2002 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +#ifndef _INFCODES_H +#define _INFCODES_H + +struct inflate_codes_state; +typedef struct inflate_codes_state FAR inflate_codes_statef; + +local inflate_codes_statef *inflate_codes_new OF(( + uInt, uInt, + inflate_huft *, inflate_huft *, + z_streamp )); + +local int inflate_codes OF(( + inflate_blocks_statef *, + z_streamp , + int)); + +local void inflate_codes_free OF(( + inflate_codes_statef *, + z_streamp )); + +#endif /* _INFCODES_H */ diff --git a/src/WinLibs/freetype-2.3.5/src/gzip/inffixed.h b/src/WinLibs/freetype-2.3.5/src/gzip/inffixed.h new file mode 100644 index 000000000..4d4760ea0 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/gzip/inffixed.h @@ -0,0 +1,151 @@ +/* inffixed.h -- table for decoding fixed codes + * Generated automatically by the maketree.c program + */ + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +local const uInt fixed_bl = 9; +local const uInt fixed_bd = 5; +local const inflate_huft fixed_tl[] = { + {{{96,7}},256}, {{{0,8}},80}, {{{0,8}},16}, {{{84,8}},115}, + {{{82,7}},31}, {{{0,8}},112}, {{{0,8}},48}, {{{0,9}},192}, + {{{80,7}},10}, {{{0,8}},96}, {{{0,8}},32}, {{{0,9}},160}, + {{{0,8}},0}, {{{0,8}},128}, {{{0,8}},64}, {{{0,9}},224}, + {{{80,7}},6}, {{{0,8}},88}, {{{0,8}},24}, {{{0,9}},144}, + {{{83,7}},59}, {{{0,8}},120}, {{{0,8}},56}, {{{0,9}},208}, + {{{81,7}},17}, {{{0,8}},104}, {{{0,8}},40}, {{{0,9}},176}, + {{{0,8}},8}, {{{0,8}},136}, {{{0,8}},72}, {{{0,9}},240}, + {{{80,7}},4}, {{{0,8}},84}, {{{0,8}},20}, {{{85,8}},227}, + {{{83,7}},43}, {{{0,8}},116}, {{{0,8}},52}, {{{0,9}},200}, + {{{81,7}},13}, {{{0,8}},100}, {{{0,8}},36}, {{{0,9}},168}, + {{{0,8}},4}, {{{0,8}},132}, {{{0,8}},68}, {{{0,9}},232}, + {{{80,7}},8}, {{{0,8}},92}, {{{0,8}},28}, {{{0,9}},152}, + {{{84,7}},83}, {{{0,8}},124}, {{{0,8}},60}, {{{0,9}},216}, + {{{82,7}},23}, {{{0,8}},108}, {{{0,8}},44}, {{{0,9}},184}, + {{{0,8}},12}, {{{0,8}},140}, {{{0,8}},76}, {{{0,9}},248}, + {{{80,7}},3}, {{{0,8}},82}, {{{0,8}},18}, {{{85,8}},163}, + {{{83,7}},35}, {{{0,8}},114}, {{{0,8}},50}, {{{0,9}},196}, + {{{81,7}},11}, {{{0,8}},98}, {{{0,8}},34}, {{{0,9}},164}, + {{{0,8}},2}, {{{0,8}},130}, {{{0,8}},66}, {{{0,9}},228}, + {{{80,7}},7}, {{{0,8}},90}, {{{0,8}},26}, {{{0,9}},148}, + {{{84,7}},67}, {{{0,8}},122}, {{{0,8}},58}, {{{0,9}},212}, + {{{82,7}},19}, {{{0,8}},106}, {{{0,8}},42}, {{{0,9}},180}, + {{{0,8}},10}, {{{0,8}},138}, {{{0,8}},74}, {{{0,9}},244}, + {{{80,7}},5}, {{{0,8}},86}, {{{0,8}},22}, {{{192,8}},0}, + {{{83,7}},51}, {{{0,8}},118}, {{{0,8}},54}, {{{0,9}},204}, + {{{81,7}},15}, {{{0,8}},102}, {{{0,8}},38}, {{{0,9}},172}, + {{{0,8}},6}, {{{0,8}},134}, {{{0,8}},70}, {{{0,9}},236}, + {{{80,7}},9}, {{{0,8}},94}, {{{0,8}},30}, {{{0,9}},156}, + {{{84,7}},99}, {{{0,8}},126}, {{{0,8}},62}, {{{0,9}},220}, + {{{82,7}},27}, {{{0,8}},110}, {{{0,8}},46}, {{{0,9}},188}, + {{{0,8}},14}, {{{0,8}},142}, {{{0,8}},78}, {{{0,9}},252}, + {{{96,7}},256}, {{{0,8}},81}, {{{0,8}},17}, {{{85,8}},131}, + {{{82,7}},31}, {{{0,8}},113}, {{{0,8}},49}, {{{0,9}},194}, + {{{80,7}},10}, {{{0,8}},97}, {{{0,8}},33}, {{{0,9}},162}, + {{{0,8}},1}, {{{0,8}},129}, {{{0,8}},65}, {{{0,9}},226}, + {{{80,7}},6}, {{{0,8}},89}, {{{0,8}},25}, {{{0,9}},146}, + {{{83,7}},59}, {{{0,8}},121}, {{{0,8}},57}, {{{0,9}},210}, + {{{81,7}},17}, {{{0,8}},105}, {{{0,8}},41}, {{{0,9}},178}, + {{{0,8}},9}, {{{0,8}},137}, {{{0,8}},73}, {{{0,9}},242}, + {{{80,7}},4}, {{{0,8}},85}, {{{0,8}},21}, {{{80,8}},258}, + {{{83,7}},43}, {{{0,8}},117}, {{{0,8}},53}, {{{0,9}},202}, + {{{81,7}},13}, {{{0,8}},101}, {{{0,8}},37}, {{{0,9}},170}, + {{{0,8}},5}, {{{0,8}},133}, {{{0,8}},69}, {{{0,9}},234}, + {{{80,7}},8}, {{{0,8}},93}, {{{0,8}},29}, {{{0,9}},154}, + {{{84,7}},83}, {{{0,8}},125}, {{{0,8}},61}, {{{0,9}},218}, + {{{82,7}},23}, {{{0,8}},109}, {{{0,8}},45}, {{{0,9}},186}, + {{{0,8}},13}, {{{0,8}},141}, {{{0,8}},77}, {{{0,9}},250}, + {{{80,7}},3}, {{{0,8}},83}, {{{0,8}},19}, {{{85,8}},195}, + {{{83,7}},35}, {{{0,8}},115}, {{{0,8}},51}, {{{0,9}},198}, + {{{81,7}},11}, {{{0,8}},99}, {{{0,8}},35}, {{{0,9}},166}, + {{{0,8}},3}, {{{0,8}},131}, {{{0,8}},67}, {{{0,9}},230}, + {{{80,7}},7}, {{{0,8}},91}, {{{0,8}},27}, {{{0,9}},150}, + {{{84,7}},67}, {{{0,8}},123}, {{{0,8}},59}, {{{0,9}},214}, + {{{82,7}},19}, {{{0,8}},107}, {{{0,8}},43}, {{{0,9}},182}, + {{{0,8}},11}, {{{0,8}},139}, {{{0,8}},75}, {{{0,9}},246}, + {{{80,7}},5}, {{{0,8}},87}, {{{0,8}},23}, {{{192,8}},0}, + {{{83,7}},51}, {{{0,8}},119}, {{{0,8}},55}, {{{0,9}},206}, + {{{81,7}},15}, {{{0,8}},103}, {{{0,8}},39}, {{{0,9}},174}, + {{{0,8}},7}, {{{0,8}},135}, {{{0,8}},71}, {{{0,9}},238}, + {{{80,7}},9}, {{{0,8}},95}, {{{0,8}},31}, {{{0,9}},158}, + {{{84,7}},99}, {{{0,8}},127}, {{{0,8}},63}, {{{0,9}},222}, + {{{82,7}},27}, {{{0,8}},111}, {{{0,8}},47}, {{{0,9}},190}, + {{{0,8}},15}, {{{0,8}},143}, {{{0,8}},79}, {{{0,9}},254}, + {{{96,7}},256}, {{{0,8}},80}, {{{0,8}},16}, {{{84,8}},115}, + {{{82,7}},31}, {{{0,8}},112}, {{{0,8}},48}, {{{0,9}},193}, + {{{80,7}},10}, {{{0,8}},96}, {{{0,8}},32}, {{{0,9}},161}, + {{{0,8}},0}, {{{0,8}},128}, {{{0,8}},64}, {{{0,9}},225}, + {{{80,7}},6}, {{{0,8}},88}, {{{0,8}},24}, {{{0,9}},145}, + {{{83,7}},59}, {{{0,8}},120}, {{{0,8}},56}, {{{0,9}},209}, + {{{81,7}},17}, {{{0,8}},104}, {{{0,8}},40}, {{{0,9}},177}, + {{{0,8}},8}, {{{0,8}},136}, {{{0,8}},72}, {{{0,9}},241}, + {{{80,7}},4}, {{{0,8}},84}, {{{0,8}},20}, {{{85,8}},227}, + {{{83,7}},43}, {{{0,8}},116}, {{{0,8}},52}, {{{0,9}},201}, + {{{81,7}},13}, {{{0,8}},100}, {{{0,8}},36}, {{{0,9}},169}, + {{{0,8}},4}, {{{0,8}},132}, {{{0,8}},68}, {{{0,9}},233}, + {{{80,7}},8}, {{{0,8}},92}, {{{0,8}},28}, {{{0,9}},153}, + {{{84,7}},83}, {{{0,8}},124}, {{{0,8}},60}, {{{0,9}},217}, + {{{82,7}},23}, {{{0,8}},108}, {{{0,8}},44}, {{{0,9}},185}, + {{{0,8}},12}, {{{0,8}},140}, {{{0,8}},76}, {{{0,9}},249}, + {{{80,7}},3}, {{{0,8}},82}, {{{0,8}},18}, {{{85,8}},163}, + {{{83,7}},35}, {{{0,8}},114}, {{{0,8}},50}, {{{0,9}},197}, + {{{81,7}},11}, {{{0,8}},98}, {{{0,8}},34}, {{{0,9}},165}, + {{{0,8}},2}, {{{0,8}},130}, {{{0,8}},66}, {{{0,9}},229}, + {{{80,7}},7}, {{{0,8}},90}, {{{0,8}},26}, {{{0,9}},149}, + {{{84,7}},67}, {{{0,8}},122}, {{{0,8}},58}, {{{0,9}},213}, + {{{82,7}},19}, {{{0,8}},106}, {{{0,8}},42}, {{{0,9}},181}, + {{{0,8}},10}, {{{0,8}},138}, {{{0,8}},74}, {{{0,9}},245}, + {{{80,7}},5}, {{{0,8}},86}, {{{0,8}},22}, {{{192,8}},0}, + {{{83,7}},51}, {{{0,8}},118}, {{{0,8}},54}, {{{0,9}},205}, + {{{81,7}},15}, {{{0,8}},102}, {{{0,8}},38}, {{{0,9}},173}, + {{{0,8}},6}, {{{0,8}},134}, {{{0,8}},70}, {{{0,9}},237}, + {{{80,7}},9}, {{{0,8}},94}, {{{0,8}},30}, {{{0,9}},157}, + {{{84,7}},99}, {{{0,8}},126}, {{{0,8}},62}, {{{0,9}},221}, + {{{82,7}},27}, {{{0,8}},110}, {{{0,8}},46}, {{{0,9}},189}, + {{{0,8}},14}, {{{0,8}},142}, {{{0,8}},78}, {{{0,9}},253}, + {{{96,7}},256}, {{{0,8}},81}, {{{0,8}},17}, {{{85,8}},131}, + {{{82,7}},31}, {{{0,8}},113}, {{{0,8}},49}, {{{0,9}},195}, + {{{80,7}},10}, {{{0,8}},97}, {{{0,8}},33}, {{{0,9}},163}, + {{{0,8}},1}, {{{0,8}},129}, {{{0,8}},65}, {{{0,9}},227}, + {{{80,7}},6}, {{{0,8}},89}, {{{0,8}},25}, {{{0,9}},147}, + {{{83,7}},59}, {{{0,8}},121}, {{{0,8}},57}, {{{0,9}},211}, + {{{81,7}},17}, {{{0,8}},105}, {{{0,8}},41}, {{{0,9}},179}, + {{{0,8}},9}, {{{0,8}},137}, {{{0,8}},73}, {{{0,9}},243}, + {{{80,7}},4}, {{{0,8}},85}, {{{0,8}},21}, {{{80,8}},258}, + {{{83,7}},43}, {{{0,8}},117}, {{{0,8}},53}, {{{0,9}},203}, + {{{81,7}},13}, {{{0,8}},101}, {{{0,8}},37}, {{{0,9}},171}, + {{{0,8}},5}, {{{0,8}},133}, {{{0,8}},69}, {{{0,9}},235}, + {{{80,7}},8}, {{{0,8}},93}, {{{0,8}},29}, {{{0,9}},155}, + {{{84,7}},83}, {{{0,8}},125}, {{{0,8}},61}, {{{0,9}},219}, + {{{82,7}},23}, {{{0,8}},109}, {{{0,8}},45}, {{{0,9}},187}, + {{{0,8}},13}, {{{0,8}},141}, {{{0,8}},77}, {{{0,9}},251}, + {{{80,7}},3}, {{{0,8}},83}, {{{0,8}},19}, {{{85,8}},195}, + {{{83,7}},35}, {{{0,8}},115}, {{{0,8}},51}, {{{0,9}},199}, + {{{81,7}},11}, {{{0,8}},99}, {{{0,8}},35}, {{{0,9}},167}, + {{{0,8}},3}, {{{0,8}},131}, {{{0,8}},67}, {{{0,9}},231}, + {{{80,7}},7}, {{{0,8}},91}, {{{0,8}},27}, {{{0,9}},151}, + {{{84,7}},67}, {{{0,8}},123}, {{{0,8}},59}, {{{0,9}},215}, + {{{82,7}},19}, {{{0,8}},107}, {{{0,8}},43}, {{{0,9}},183}, + {{{0,8}},11}, {{{0,8}},139}, {{{0,8}},75}, {{{0,9}},247}, + {{{80,7}},5}, {{{0,8}},87}, {{{0,8}},23}, {{{192,8}},0}, + {{{83,7}},51}, {{{0,8}},119}, {{{0,8}},55}, {{{0,9}},207}, + {{{81,7}},15}, {{{0,8}},103}, {{{0,8}},39}, {{{0,9}},175}, + {{{0,8}},7}, {{{0,8}},135}, {{{0,8}},71}, {{{0,9}},239}, + {{{80,7}},9}, {{{0,8}},95}, {{{0,8}},31}, {{{0,9}},159}, + {{{84,7}},99}, {{{0,8}},127}, {{{0,8}},63}, {{{0,9}},223}, + {{{82,7}},27}, {{{0,8}},111}, {{{0,8}},47}, {{{0,9}},191}, + {{{0,8}},15}, {{{0,8}},143}, {{{0,8}},79}, {{{0,9}},255} + }; +local const inflate_huft fixed_td[] = { + {{{80,5}},1}, {{{87,5}},257}, {{{83,5}},17}, {{{91,5}},4097}, + {{{81,5}},5}, {{{89,5}},1025}, {{{85,5}},65}, {{{93,5}},16385}, + {{{80,5}},3}, {{{88,5}},513}, {{{84,5}},33}, {{{92,5}},8193}, + {{{82,5}},9}, {{{90,5}},2049}, {{{86,5}},129}, {{{192,5}},24577}, + {{{80,5}},2}, {{{87,5}},385}, {{{83,5}},25}, {{{91,5}},6145}, + {{{81,5}},7}, {{{89,5}},1537}, {{{85,5}},97}, {{{93,5}},24577}, + {{{80,5}},4}, {{{88,5}},769}, {{{84,5}},49}, {{{92,5}},12289}, + {{{82,5}},13}, {{{90,5}},3073}, {{{86,5}},193}, {{{192,5}},24577} + }; diff --git a/src/WinLibs/freetype-2.3.5/src/gzip/inflate.c b/src/WinLibs/freetype-2.3.5/src/gzip/inflate.c new file mode 100644 index 000000000..8877fa3eb --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/gzip/inflate.c @@ -0,0 +1,273 @@ +/* inflate.c -- zlib interface to inflate modules + * Copyright (C) 1995-2002 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#include "zutil.h" +#include "infblock.h" + +#define DONE INFLATE_DONE +#define BAD INFLATE_BAD + +typedef enum { + METHOD, /* waiting for method byte */ + FLAG, /* waiting for flag byte */ + DICT4, /* four dictionary check bytes to go */ + DICT3, /* three dictionary check bytes to go */ + DICT2, /* two dictionary check bytes to go */ + DICT1, /* one dictionary check byte to go */ + DICT0, /* waiting for inflateSetDictionary */ + BLOCKS, /* decompressing blocks */ + CHECK4, /* four check bytes to go */ + CHECK3, /* three check bytes to go */ + CHECK2, /* two check bytes to go */ + CHECK1, /* one check byte to go */ + DONE, /* finished check, done */ + BAD} /* got an error--stay here */ +inflate_mode; + +/* inflate private state */ +struct internal_state { + + /* mode */ + inflate_mode mode; /* current inflate mode */ + + /* mode dependent information */ + union { + uInt method; /* if FLAGS, method byte */ + struct { + uLong was; /* computed check value */ + uLong need; /* stream check value */ + } check; /* if CHECK, check values to compare */ + uInt marker; /* if BAD, inflateSync's marker bytes count */ + } sub; /* submode */ + + /* mode independent information */ + int nowrap; /* flag for no wrapper */ + uInt wbits; /* log2(window size) (8..15, defaults to 15) */ + inflate_blocks_statef + *blocks; /* current inflate_blocks state */ + +}; + + +ZEXPORT(int) inflateReset( /* z) */ +z_streamp z ) +{ + if (z == Z_NULL || z->state == Z_NULL) + return Z_STREAM_ERROR; + z->total_in = z->total_out = 0; + z->msg = Z_NULL; + z->state->mode = z->state->nowrap ? BLOCKS : METHOD; + inflate_blocks_reset(z->state->blocks, z, Z_NULL); + Tracev((stderr, "inflate: reset\n")); + return Z_OK; +} + + +ZEXPORT(int) inflateEnd( /* z) */ +z_streamp z ) +{ + if (z == Z_NULL || z->state == Z_NULL || z->zfree == Z_NULL) + return Z_STREAM_ERROR; + if (z->state->blocks != Z_NULL) + inflate_blocks_free(z->state->blocks, z); + ZFREE(z, z->state); + z->state = Z_NULL; + Tracev((stderr, "inflate: end\n")); + return Z_OK; +} + + +ZEXPORT(int) inflateInit2_( /* z, w, version, stream_size) */ +z_streamp z, +int w, +const char *version, +int stream_size ) +{ + if (version == Z_NULL || version[0] != ZLIB_VERSION[0] || + stream_size != sizeof(z_stream)) + return Z_VERSION_ERROR; + + /* initialize state */ + if (z == Z_NULL) + return Z_STREAM_ERROR; + z->msg = Z_NULL; + if (z->zalloc == Z_NULL) + { + z->zalloc = zcalloc; + z->opaque = (voidpf)0; + } + if (z->zfree == Z_NULL) z->zfree = zcfree; + if ((z->state = (struct internal_state FAR *) + ZALLOC(z,1,sizeof(struct internal_state))) == Z_NULL) + return Z_MEM_ERROR; + z->state->blocks = Z_NULL; + + /* handle undocumented nowrap option (no zlib header or check) */ + z->state->nowrap = 0; + if (w < 0) + { + w = - w; + z->state->nowrap = 1; + } + + /* set window size */ + if (w < 8 || w > 15) + { + inflateEnd(z); + return Z_STREAM_ERROR; + } + z->state->wbits = (uInt)w; + + /* create inflate_blocks state */ + if ((z->state->blocks = + inflate_blocks_new(z, z->state->nowrap ? Z_NULL : adler32, (uInt)1 << w)) + == Z_NULL) + { + inflateEnd(z); + return Z_MEM_ERROR; + } + Tracev((stderr, "inflate: allocated\n")); + + /* reset state */ + inflateReset(z); + return Z_OK; +} + + + +#undef NEEDBYTE +#define NEEDBYTE {if(z->avail_in==0)return r;r=f;} + +#undef NEXTBYTE +#define NEXTBYTE (z->avail_in--,z->total_in++,*z->next_in++) + + +ZEXPORT(int) inflate( /* z, f) */ +z_streamp z, +int f ) +{ + int r; + uInt b; + + if (z == Z_NULL || z->state == Z_NULL || z->next_in == Z_NULL) + return Z_STREAM_ERROR; + f = f == Z_FINISH ? Z_BUF_ERROR : Z_OK; + r = Z_BUF_ERROR; + while (1) switch (z->state->mode) + { + case METHOD: + NEEDBYTE + if (((z->state->sub.method = NEXTBYTE) & 0xf) != Z_DEFLATED) + { + z->state->mode = BAD; + z->msg = (char*)"unknown compression method"; + z->state->sub.marker = 5; /* can't try inflateSync */ + break; + } + if ((z->state->sub.method >> 4) + 8 > z->state->wbits) + { + z->state->mode = BAD; + z->msg = (char*)"invalid window size"; + z->state->sub.marker = 5; /* can't try inflateSync */ + break; + } + z->state->mode = FLAG; + case FLAG: + NEEDBYTE + b = NEXTBYTE; + if (((z->state->sub.method << 8) + b) % 31) + { + z->state->mode = BAD; + z->msg = (char*)"incorrect header check"; + z->state->sub.marker = 5; /* can't try inflateSync */ + break; + } + Tracev((stderr, "inflate: zlib header ok\n")); + if (!(b & PRESET_DICT)) + { + z->state->mode = BLOCKS; + break; + } + z->state->mode = DICT4; + case DICT4: + NEEDBYTE + z->state->sub.check.need = (uLong)NEXTBYTE << 24; + z->state->mode = DICT3; + case DICT3: + NEEDBYTE + z->state->sub.check.need += (uLong)NEXTBYTE << 16; + z->state->mode = DICT2; + case DICT2: + NEEDBYTE + z->state->sub.check.need += (uLong)NEXTBYTE << 8; + z->state->mode = DICT1; + case DICT1: + NEEDBYTE + z->state->sub.check.need += (uLong)NEXTBYTE; + z->adler = z->state->sub.check.need; + z->state->mode = DICT0; + return Z_NEED_DICT; + case DICT0: + z->state->mode = BAD; + z->msg = (char*)"need dictionary"; + z->state->sub.marker = 0; /* can try inflateSync */ + return Z_STREAM_ERROR; + case BLOCKS: + r = inflate_blocks(z->state->blocks, z, r); + if (r == Z_DATA_ERROR) + { + z->state->mode = BAD; + z->state->sub.marker = 0; /* can try inflateSync */ + break; + } + if (r == Z_OK) + r = f; + if (r != Z_STREAM_END) + return r; + r = f; + inflate_blocks_reset(z->state->blocks, z, &z->state->sub.check.was); + if (z->state->nowrap) + { + z->state->mode = DONE; + break; + } + z->state->mode = CHECK4; + case CHECK4: + NEEDBYTE + z->state->sub.check.need = (uLong)NEXTBYTE << 24; + z->state->mode = CHECK3; + case CHECK3: + NEEDBYTE + z->state->sub.check.need += (uLong)NEXTBYTE << 16; + z->state->mode = CHECK2; + case CHECK2: + NEEDBYTE + z->state->sub.check.need += (uLong)NEXTBYTE << 8; + z->state->mode = CHECK1; + case CHECK1: + NEEDBYTE + z->state->sub.check.need += (uLong)NEXTBYTE; + + if (z->state->sub.check.was != z->state->sub.check.need) + { + z->state->mode = BAD; + z->msg = (char*)"incorrect data check"; + z->state->sub.marker = 5; /* can't try inflateSync */ + break; + } + Tracev((stderr, "inflate: zlib check ok\n")); + z->state->mode = DONE; + case DONE: + return Z_STREAM_END; + case BAD: + return Z_DATA_ERROR; + default: + return Z_STREAM_ERROR; + } +#ifdef NEED_DUMMY_RETURN + return Z_STREAM_ERROR; /* Some dumb compilers complain without this */ +#endif +} + diff --git a/src/WinLibs/freetype-2.3.5/src/gzip/inftrees.c b/src/WinLibs/freetype-2.3.5/src/gzip/inftrees.c new file mode 100644 index 000000000..3c39aca6e --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/gzip/inftrees.c @@ -0,0 +1,465 @@ +/* inftrees.c -- generate Huffman trees for efficient decoding + * Copyright (C) 1995-2002 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#include "zutil.h" +#include "inftrees.h" + +#if !defined(BUILDFIXED) && !defined(STDC) +# define BUILDFIXED /* non ANSI compilers may not accept inffixed.h */ +#endif + + +#if 0 +local const char inflate_copyright[] = + " inflate 1.1.4 Copyright 1995-2002 Mark Adler "; +#endif +/* + If you use the zlib library in a product, an acknowledgment is welcome + in the documentation of your product. If for some reason you cannot + include such an acknowledgment, I would appreciate that you keep this + copyright string in the executable of your product. + */ + +/* simplify the use of the inflate_huft type with some defines */ +#define exop word.what.Exop +#define bits word.what.Bits + + +local int huft_build OF(( + uIntf *, /* code lengths in bits */ + uInt, /* number of codes */ + uInt, /* number of "simple" codes */ + const uIntf *, /* list of base values for non-simple codes */ + const uIntf *, /* list of extra bits for non-simple codes */ + inflate_huft * FAR*,/* result: starting table */ + uIntf *, /* maximum lookup bits (returns actual) */ + inflate_huft *, /* space for trees */ + uInt *, /* hufts used in space */ + uIntf * )); /* space for values */ + +/* Tables for deflate from PKZIP's appnote.txt. */ +local const uInt cplens[31] = { /* Copy lengths for literal codes 257..285 */ + 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, + 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0}; + /* see note #13 above about 258 */ +local const uInt cplext[31] = { /* Extra bits for literal codes 257..285 */ + 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, + 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, 112, 112}; /* 112==invalid */ +local const uInt cpdist[30] = { /* Copy offsets for distance codes 0..29 */ + 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, + 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, + 8193, 12289, 16385, 24577}; +local const uInt cpdext[30] = { /* Extra bits for distance codes */ + 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, + 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, + 12, 12, 13, 13}; + +/* + Huffman code decoding is performed using a multi-level table lookup. + The fastest way to decode is to simply build a lookup table whose + size is determined by the longest code. However, the time it takes + to build this table can also be a factor if the data being decoded + is not very long. The most common codes are necessarily the + shortest codes, so those codes dominate the decoding time, and hence + the speed. The idea is you can have a shorter table that decodes the + shorter, more probable codes, and then point to subsidiary tables for + the longer codes. The time it costs to decode the longer codes is + then traded against the time it takes to make longer tables. + + This results of this trade are in the variables lbits and dbits + below. lbits is the number of bits the first level table for literal/ + length codes can decode in one step, and dbits is the same thing for + the distance codes. Subsequent tables are also less than or equal to + those sizes. These values may be adjusted either when all of the + codes are shorter than that, in which case the longest code length in + bits is used, or when the shortest code is *longer* than the requested + table size, in which case the length of the shortest code in bits is + used. + + There are two different values for the two tables, since they code a + different number of possibilities each. The literal/length table + codes 286 possible values, or in a flat code, a little over eight + bits. The distance table codes 30 possible values, or a little less + than five bits, flat. The optimum values for speed end up being + about one bit more than those, so lbits is 8+1 and dbits is 5+1. + The optimum values may differ though from machine to machine, and + possibly even between compilers. Your mileage may vary. + */ + + +/* If BMAX needs to be larger than 16, then h and x[] should be uLong. */ +#define BMAX 15 /* maximum bit length of any code */ + +local int huft_build( /* b, n, s, d, e, t, m, hp, hn, v) */ +uIntf *b, /* code lengths in bits (all assumed <= BMAX) */ +uInt n, /* number of codes (assumed <= 288) */ +uInt s, /* number of simple-valued codes (0..s-1) */ +const uIntf *d, /* list of base values for non-simple codes */ +const uIntf *e, /* list of extra bits for non-simple codes */ +inflate_huft * FAR *t, /* result: starting table */ +uIntf *m, /* maximum lookup bits, returns actual */ +inflate_huft *hp, /* space for trees */ +uInt *hn, /* hufts used in space */ +uIntf *v /* working area: values in order of bit length */ +/* Given a list of code lengths and a maximum table size, make a set of + tables to decode that set of codes. Return Z_OK on success, Z_BUF_ERROR + if the given code set is incomplete (the tables are still built in this + case), or Z_DATA_ERROR if the input is invalid. */ +) +{ + + uInt a; /* counter for codes of length k */ + uInt c[BMAX+1]; /* bit length count table */ + uInt f; /* i repeats in table every f entries */ + int g; /* maximum code length */ + int h; /* table level */ + register uInt i; /* counter, current code */ + register uInt j; /* counter */ + register int k; /* number of bits in current code */ + int l; /* bits per table (returned in m) */ + uInt mask; /* (1 << w) - 1, to avoid cc -O bug on HP */ + register uIntf *p; /* pointer into c[], b[], or v[] */ + inflate_huft *q; /* points to current table */ + struct inflate_huft_s r; /* table entry for structure assignment */ + inflate_huft *u[BMAX]; /* table stack */ + register int w; /* bits before this table == (l * h) */ + uInt x[BMAX+1]; /* bit offsets, then code stack */ + uIntf *xp; /* pointer into x */ + int y; /* number of dummy codes added */ + uInt z; /* number of entries in current table */ + + + /* Make compiler happy */ + r.base = 0; + + /* Generate counts for each bit length */ + p = c; +#define C0 *p++ = 0; +#define C2 C0 C0 C0 C0 +#define C4 C2 C2 C2 C2 + C4 /* clear c[]--assume BMAX+1 is 16 */ + p = b; i = n; + do { + c[*p++]++; /* assume all entries <= BMAX */ + } while (--i); + if (c[0] == n) /* null input--all zero length codes */ + { + *t = (inflate_huft *)Z_NULL; + *m = 0; + return Z_OK; + } + + + /* Find minimum and maximum length, bound *m by those */ + l = *m; + for (j = 1; j <= BMAX; j++) + if (c[j]) + break; + k = j; /* minimum code length */ + if ((uInt)l < j) + l = j; + for (i = BMAX; i; i--) + if (c[i]) + break; + g = i; /* maximum code length */ + if ((uInt)l > i) + l = i; + *m = l; + + + /* Adjust last length count to fill out codes, if needed */ + for (y = 1 << j; j < i; j++, y <<= 1) + if ((y -= c[j]) < 0) + return Z_DATA_ERROR; + if ((y -= c[i]) < 0) + return Z_DATA_ERROR; + c[i] += y; + + + /* Generate starting offsets into the value table for each length */ + x[1] = j = 0; + p = c + 1; xp = x + 2; + while (--i) { /* note that i == g from above */ + *xp++ = (j += *p++); + } + + + /* Make a table of values in order of bit lengths */ + p = b; i = 0; + do { + if ((j = *p++) != 0) + v[x[j]++] = i; + } while (++i < n); + n = x[g]; /* set n to length of v */ + + + /* Generate the Huffman codes and for each, make the table entries */ + x[0] = i = 0; /* first Huffman code is zero */ + p = v; /* grab values in bit order */ + h = -1; /* no tables yet--level -1 */ + w = -l; /* bits decoded == (l * h) */ + u[0] = (inflate_huft *)Z_NULL; /* just to keep compilers happy */ + q = (inflate_huft *)Z_NULL; /* ditto */ + z = 0; /* ditto */ + + /* go through the bit lengths (k already is bits in shortest code) */ + for (; k <= g; k++) + { + a = c[k]; + while (a--) + { + /* here i is the Huffman code of length k bits for value *p */ + /* make tables up to required level */ + while (k > w + l) + { + h++; + w += l; /* previous table always l bits */ + + /* compute minimum size table less than or equal to l bits */ + z = g - w; + z = z > (uInt)l ? (uInt)l : z; /* table size upper limit */ + if ((f = 1 << (j = k - w)) > a + 1) /* try a k-w bit table */ + { /* too few codes for k-w bit table */ + f -= a + 1; /* deduct codes from patterns left */ + xp = c + k; + if (j < z) + while (++j < z) /* try smaller tables up to z bits */ + { + if ((f <<= 1) <= *++xp) + break; /* enough codes to use up j bits */ + f -= *xp; /* else deduct codes from patterns */ + } + } + z = 1 << j; /* table entries for j-bit table */ + + /* allocate new table */ + if (*hn + z > MANY) /* (note: doesn't matter for fixed) */ + return Z_DATA_ERROR; /* overflow of MANY */ + u[h] = q = hp + *hn; + *hn += z; + + /* connect to last table, if there is one */ + if (h) + { + x[h] = i; /* save pattern for backing up */ + r.bits = (Byte)l; /* bits to dump before this table */ + r.exop = (Byte)j; /* bits in this table */ + j = i >> (w - l); + r.base = (uInt)(q - u[h-1] - j); /* offset to this table */ + u[h-1][j] = r; /* connect to last table */ + } + else + *t = q; /* first table is returned result */ + } + + /* set up table entry in r */ + r.bits = (Byte)(k - w); + if (p >= v + n) + r.exop = 128 + 64; /* out of values--invalid code */ + else if (*p < s) + { + r.exop = (Byte)(*p < 256 ? 0 : 32 + 64); /* 256 is end-of-block */ + r.base = *p++; /* simple code is just the value */ + } + else + { + r.exop = (Byte)(e[*p - s] + 16 + 64);/* non-simple--look up in lists */ + r.base = d[*p++ - s]; + } + + /* fill code-like entries with r */ + f = 1 << (k - w); + for (j = i >> w; j < z; j += f) + q[j] = r; + + /* backwards increment the k-bit code i */ + for (j = 1 << (k - 1); i & j; j >>= 1) + i ^= j; + i ^= j; + + /* backup over finished tables */ + mask = (1 << w) - 1; /* needed on HP, cc -O bug */ + while ((i & mask) != x[h]) + { + h--; /* don't need to update q */ + w -= l; + mask = (1 << w) - 1; + } + } + } + + + /* Return Z_BUF_ERROR if we were given an incomplete table */ + return y != 0 && g != 1 ? Z_BUF_ERROR : Z_OK; +} + + +local int inflate_trees_bits( /* c, bb, tb, hp, z) */ +uIntf *c, /* 19 code lengths */ +uIntf *bb, /* bits tree desired/actual depth */ +inflate_huft * FAR *tb, /* bits tree result */ +inflate_huft *hp, /* space for trees */ +z_streamp z /* for messages */ +) +{ + int r; + uInt hn = 0; /* hufts used in space */ + uIntf *v; /* work area for huft_build */ + + if ((v = (uIntf*)ZALLOC(z, 19, sizeof(uInt))) == Z_NULL) + return Z_MEM_ERROR; + r = huft_build(c, 19, 19, (uIntf*)Z_NULL, (uIntf*)Z_NULL, + tb, bb, hp, &hn, v); + if (r == Z_DATA_ERROR) + z->msg = (char*)"oversubscribed dynamic bit lengths tree"; + else if (r == Z_BUF_ERROR || *bb == 0) + { + z->msg = (char*)"incomplete dynamic bit lengths tree"; + r = Z_DATA_ERROR; + } + ZFREE(z, v); + return r; +} + + +local int inflate_trees_dynamic( /* nl, nd, c, bl, bd, tl, td, hp, z) */ +uInt nl, /* number of literal/length codes */ +uInt nd, /* number of distance codes */ +uIntf *c, /* that many (total) code lengths */ +uIntf *bl, /* literal desired/actual bit depth */ +uIntf *bd, /* distance desired/actual bit depth */ +inflate_huft * FAR *tl, /* literal/length tree result */ +inflate_huft * FAR *td, /* distance tree result */ +inflate_huft *hp, /* space for trees */ +z_streamp z /* for messages */ +) +{ + int r; + uInt hn = 0; /* hufts used in space */ + uIntf *v; /* work area for huft_build */ + + /* allocate work area */ + if ((v = (uIntf*)ZALLOC(z, 288, sizeof(uInt))) == Z_NULL) + return Z_MEM_ERROR; + + /* build literal/length tree */ + r = huft_build(c, nl, 257, cplens, cplext, tl, bl, hp, &hn, v); + if (r != Z_OK || *bl == 0) + { + if (r == Z_DATA_ERROR) + z->msg = (char*)"oversubscribed literal/length tree"; + else if (r != Z_MEM_ERROR) + { + z->msg = (char*)"incomplete literal/length tree"; + r = Z_DATA_ERROR; + } + ZFREE(z, v); + return r; + } + + /* build distance tree */ + r = huft_build(c + nl, nd, 0, cpdist, cpdext, td, bd, hp, &hn, v); + if (r != Z_OK || (*bd == 0 && nl > 257)) + { + if (r == Z_DATA_ERROR) + z->msg = (char*)"oversubscribed distance tree"; + else if (r == Z_BUF_ERROR) { +#ifdef PKZIP_BUG_WORKAROUND + r = Z_OK; + } +#else + z->msg = (char*)"incomplete distance tree"; + r = Z_DATA_ERROR; + } + else if (r != Z_MEM_ERROR) + { + z->msg = (char*)"empty distance tree with lengths"; + r = Z_DATA_ERROR; + } + ZFREE(z, v); + return r; +#endif + } + + /* done */ + ZFREE(z, v); + return Z_OK; +} + + +/* build fixed tables only once--keep them here */ +#ifdef BUILDFIXED +local int fixed_built = 0; +#define FIXEDH 544 /* number of hufts used by fixed tables */ +local inflate_huft fixed_mem[FIXEDH]; +local uInt fixed_bl; +local uInt fixed_bd; +local inflate_huft *fixed_tl; +local inflate_huft *fixed_td; +#else +#include "inffixed.h" +#endif + + +local int inflate_trees_fixed( /* bl, bd, tl, td, z) */ +uIntf *bl, /* literal desired/actual bit depth */ +uIntf *bd, /* distance desired/actual bit depth */ +const inflate_huft * FAR *tl, /* literal/length tree result */ +const inflate_huft * FAR *td, /* distance tree result */ +z_streamp z /* for memory allocation */ +) +{ +#ifdef BUILDFIXED + /* build fixed tables if not already */ + if (!fixed_built) + { + int k; /* temporary variable */ + uInt f = 0; /* number of hufts used in fixed_mem */ + uIntf *c; /* length list for huft_build */ + uIntf *v; /* work area for huft_build */ + + /* allocate memory */ + if ((c = (uIntf*)ZALLOC(z, 288, sizeof(uInt))) == Z_NULL) + return Z_MEM_ERROR; + if ((v = (uIntf*)ZALLOC(z, 288, sizeof(uInt))) == Z_NULL) + { + ZFREE(z, c); + return Z_MEM_ERROR; + } + + /* literal table */ + for (k = 0; k < 144; k++) + c[k] = 8; + for (; k < 256; k++) + c[k] = 9; + for (; k < 280; k++) + c[k] = 7; + for (; k < 288; k++) + c[k] = 8; + fixed_bl = 9; + huft_build(c, 288, 257, cplens, cplext, &fixed_tl, &fixed_bl, + fixed_mem, &f, v); + + /* distance table */ + for (k = 0; k < 30; k++) + c[k] = 5; + fixed_bd = 5; + huft_build(c, 30, 0, cpdist, cpdext, &fixed_td, &fixed_bd, + fixed_mem, &f, v); + + /* done */ + ZFREE(z, v); + ZFREE(z, c); + fixed_built = 1; + } +#else + FT_UNUSED(z); +#endif + *bl = fixed_bl; + *bd = fixed_bd; + *tl = fixed_tl; + *td = fixed_td; + return Z_OK; +} diff --git a/src/WinLibs/freetype-2.3.5/src/gzip/inftrees.h b/src/WinLibs/freetype-2.3.5/src/gzip/inftrees.h new file mode 100644 index 000000000..07bf2aa0b --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/gzip/inftrees.h @@ -0,0 +1,63 @@ +/* inftrees.h -- header to use inftrees.c + * Copyright (C) 1995-2002 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +/* Huffman code lookup table entry--this entry is four bytes for machines + that have 16-bit pointers (e.g. PC's in the small or medium model). */ + +#ifndef _INFTREES_H +#define _INFTREES_H + +typedef struct inflate_huft_s FAR inflate_huft; + +struct inflate_huft_s { + union { + struct { + Byte Exop; /* number of extra bits or operation */ + Byte Bits; /* number of bits in this code or subcode */ + } what; + uInt pad; /* pad structure to a power of 2 (4 bytes for */ + } word; /* 16-bit, 8 bytes for 32-bit int's) */ + uInt base; /* literal, length base, distance base, + or table offset */ +}; + +/* Maximum size of dynamic tree. The maximum found in a long but non- + exhaustive search was 1004 huft structures (850 for length/literals + and 154 for distances, the latter actually the result of an + exhaustive search). The actual maximum is not known, but the + value below is more than safe. */ +#define MANY 1440 + +local int inflate_trees_bits OF(( + uIntf *, /* 19 code lengths */ + uIntf *, /* bits tree desired/actual depth */ + inflate_huft * FAR *, /* bits tree result */ + inflate_huft *, /* space for trees */ + z_streamp)); /* for messages */ + +local int inflate_trees_dynamic OF(( + uInt, /* number of literal/length codes */ + uInt, /* number of distance codes */ + uIntf *, /* that many (total) code lengths */ + uIntf *, /* literal desired/actual bit depth */ + uIntf *, /* distance desired/actual bit depth */ + inflate_huft * FAR *, /* literal/length tree result */ + inflate_huft * FAR *, /* distance tree result */ + inflate_huft *, /* space for trees */ + z_streamp)); /* for messages */ + +local int inflate_trees_fixed OF(( + uIntf *, /* literal desired/actual bit depth */ + uIntf *, /* distance desired/actual bit depth */ + const inflate_huft * FAR *, /* literal/length tree result */ + const inflate_huft * FAR *, /* distance tree result */ + z_streamp)); /* for memory allocation */ + +#endif /* _INFTREES_H */ diff --git a/src/WinLibs/freetype-2.3.5/src/gzip/infutil.c b/src/WinLibs/freetype-2.3.5/src/gzip/infutil.c new file mode 100644 index 000000000..6087b4064 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/gzip/infutil.c @@ -0,0 +1,86 @@ +/* inflate_util.c -- data and routines common to blocks and codes + * Copyright (C) 1995-2002 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#include "zutil.h" +#include "infblock.h" +#include "inftrees.h" +#include "infcodes.h" +#include "infutil.h" + + +/* And'ing with mask[n] masks the lower n bits */ +local const uInt inflate_mask[17] = { + 0x0000, + 0x0001, 0x0003, 0x0007, 0x000f, 0x001f, 0x003f, 0x007f, 0x00ff, + 0x01ff, 0x03ff, 0x07ff, 0x0fff, 0x1fff, 0x3fff, 0x7fff, 0xffff +}; + + +/* copy as much as possible from the sliding window to the output area */ +local int inflate_flush( /* s, z, r) */ +inflate_blocks_statef *s, +z_streamp z, +int r ) +{ + uInt n; + Bytef *p; + Bytef *q; + + /* local copies of source and destination pointers */ + p = z->next_out; + q = s->read; + + /* compute number of bytes to copy as far as end of window */ + n = (uInt)((q <= s->write ? s->write : s->end) - q); + if (n > z->avail_out) n = z->avail_out; + if (n && r == Z_BUF_ERROR) r = Z_OK; + + /* update counters */ + z->avail_out -= n; + z->total_out += n; + + /* update check information */ + if (s->checkfn != Z_NULL) + z->adler = s->check = (*s->checkfn)(s->check, q, n); + + /* copy as far as end of window */ + zmemcpy(p, q, n); + p += n; + q += n; + + /* see if more to copy at beginning of window */ + if (q == s->end) + { + /* wrap pointers */ + q = s->window; + if (s->write == s->end) + s->write = s->window; + + /* compute bytes to copy */ + n = (uInt)(s->write - q); + if (n > z->avail_out) n = z->avail_out; + if (n && r == Z_BUF_ERROR) r = Z_OK; + + /* update counters */ + z->avail_out -= n; + z->total_out += n; + + /* update check information */ + if (s->checkfn != Z_NULL) + z->adler = s->check = (*s->checkfn)(s->check, q, n); + + /* copy */ + zmemcpy(p, q, n); + p += n; + q += n; + } + + /* update pointers */ + z->next_out = p; + s->read = q; + + /* done */ + return r; +} diff --git a/src/WinLibs/freetype-2.3.5/src/gzip/infutil.h b/src/WinLibs/freetype-2.3.5/src/gzip/infutil.h new file mode 100644 index 000000000..7174b6dd0 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/gzip/infutil.h @@ -0,0 +1,98 @@ +/* infutil.h -- types and macros common to blocks and codes + * Copyright (C) 1995-2002 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +#ifndef _INFUTIL_H +#define _INFUTIL_H + +typedef enum { + TYPE, /* get type bits (3, including end bit) */ + LENS, /* get lengths for stored */ + STORED, /* processing stored block */ + TABLE, /* get table lengths */ + BTREE, /* get bit lengths tree for a dynamic block */ + DTREE, /* get length, distance trees for a dynamic block */ + CODES, /* processing fixed or dynamic block */ + DRY, /* output remaining window bytes */ + DONE, /* finished last block, done */ + BAD} /* got a data error--stuck here */ +inflate_block_mode; + +/* inflate blocks semi-private state */ +struct inflate_blocks_state { + + /* mode */ + inflate_block_mode mode; /* current inflate_block mode */ + + /* mode dependent information */ + union { + uInt left; /* if STORED, bytes left to copy */ + struct { + uInt table; /* table lengths (14 bits) */ + uInt index; /* index into blens (or border) */ + uIntf *blens; /* bit lengths of codes */ + uInt bb; /* bit length tree depth */ + inflate_huft *tb; /* bit length decoding tree */ + } trees; /* if DTREE, decoding info for trees */ + struct { + inflate_codes_statef + *codes; + } decode; /* if CODES, current state */ + } sub; /* submode */ + uInt last; /* true if this block is the last block */ + + /* mode independent information */ + uInt bitk; /* bits in bit buffer */ + uLong bitb; /* bit buffer */ + inflate_huft *hufts; /* single malloc for tree space */ + Bytef *window; /* sliding window */ + Bytef *end; /* one byte after sliding window */ + Bytef *read; /* window read pointer */ + Bytef *write; /* window write pointer */ + check_func checkfn; /* check function */ + uLong check; /* check on output */ + +}; + + +/* defines for inflate input/output */ +/* update pointers and return */ +#define UPDBITS {s->bitb=b;s->bitk=k;} +#define UPDIN {z->avail_in=n;z->total_in+=p-z->next_in;z->next_in=p;} +#define UPDOUT {s->write=q;} +#define UPDATE {UPDBITS UPDIN UPDOUT} +#define LEAVE {UPDATE return inflate_flush(s,z,r);} +/* get bytes and bits */ +#define LOADIN {p=z->next_in;n=z->avail_in;b=s->bitb;k=s->bitk;} +#define NEEDBYTE {if(n)r=Z_OK;else LEAVE} +#define NEXTBYTE (n--,*p++) +#define NEEDBITS(j) {while(k<(j)){NEEDBYTE;b|=((uLong)NEXTBYTE)<<k;k+=8;}} +#define DUMPBITS(j) {b>>=(j);k-=(j);} +/* output bytes */ +#define WAVAIL (uInt)(q<s->read?s->read-q-1:s->end-q) +#define LOADOUT {q=s->write;m=(uInt)WAVAIL;} +#define WRAP {if(q==s->end&&s->read!=s->window){q=s->window;m=(uInt)WAVAIL;}} +#define FLUSH {UPDOUT r=inflate_flush(s,z,r); LOADOUT} +#define NEEDOUT {if(m==0){WRAP if(m==0){FLUSH WRAP if(m==0) LEAVE}}r=Z_OK;} +#define OUTBYTE(a) {*q++=(Byte)(a);m--;} +/* load local pointers */ +#define LOAD {LOADIN LOADOUT} + +/* masks for lower bits (size given to avoid silly warnings with Visual C++) */ +#ifndef NO_INFLATE_MASK +local uInt inflate_mask[17]; +#endif + +/* copy as much as possible from the sliding window to the output area */ +local int inflate_flush OF(( + inflate_blocks_statef *, + z_streamp , + int)); + +#endif diff --git a/src/WinLibs/freetype-2.3.5/src/gzip/rules.mk b/src/WinLibs/freetype-2.3.5/src/gzip/rules.mk new file mode 100644 index 000000000..d2a43a6a8 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/src/gzip/zconf.h b/src/WinLibs/freetype-2.3.5/src/gzip/zconf.h new file mode 100644 index 000000000..3ccc3a66a --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/gzip/zconf.h @@ -0,0 +1,278 @@ +/* zconf.h -- configuration of the zlib compression library + * Copyright (C) 1995-2002 Jean-loup Gailly. + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* @(#) $Id: zconf.h,v 1.4 2007/06/01 06:56:17 wl Exp $ */ + +#ifndef _ZCONF_H +#define _ZCONF_H + +/* + * If you *really* need a unique prefix for all types and library functions, + * compile with -DZ_PREFIX. The "standard" zlib should be compiled without it. + */ +#ifdef Z_PREFIX +# define deflateInit_ z_deflateInit_ +# define deflate z_deflate +# define deflateEnd z_deflateEnd +# define inflateInit_ z_inflateInit_ +# define inflate z_inflate +# define inflateEnd z_inflateEnd +# define deflateInit2_ z_deflateInit2_ +# define deflateSetDictionary z_deflateSetDictionary +# define deflateCopy z_deflateCopy +# define deflateReset z_deflateReset +# define deflateParams z_deflateParams +# define inflateInit2_ z_inflateInit2_ +# define inflateSetDictionary z_inflateSetDictionary +# define inflateSync z_inflateSync +# define inflateSyncPoint z_inflateSyncPoint +# define inflateReset z_inflateReset +# define compress z_compress +# define compress2 z_compress2 +# define uncompress z_uncompress +# define adler32 z_adler32 +# define crc32 z_crc32 +# define get_crc_table z_get_crc_table + +# define Byte z_Byte +# define uInt z_uInt +# define uLong z_uLong +# define Bytef z_Bytef +# define charf z_charf +# define intf z_intf +# define uIntf z_uIntf +# define uLongf z_uLongf +# define voidpf z_voidpf +# define voidp z_voidp +#endif + +#if (defined(_WIN32) || defined(__WIN32__)) && !defined(WIN32) +# define WIN32 +#endif +#if defined(__GNUC__) || defined(WIN32) || defined(__386__) || defined(i386) +# ifndef __32BIT__ +# define __32BIT__ +# endif +#endif +#if defined(__MSDOS__) && !defined(MSDOS) +# define MSDOS +#endif + +/* + * Compile with -DMAXSEG_64K if the alloc function cannot allocate more + * than 64k bytes at a time (needed on systems with 16-bit int). + */ +#if defined(MSDOS) && !defined(__32BIT__) +# define MAXSEG_64K +#endif +#ifdef MSDOS +# define UNALIGNED_OK +#endif + +#if (defined(MSDOS) || defined(_WINDOWS) || defined(WIN32)) && !defined(STDC) +# define STDC +#endif +#if defined(__STDC__) || defined(__cplusplus) || defined(__OS2__) +# ifndef STDC +# define STDC +# endif +#endif + +#ifndef STDC +# ifndef const /* cannot use !defined(STDC) && !defined(const) on Mac */ +# define const +# endif +#endif + +/* Some Mac compilers merge all .h files incorrectly: */ +#if defined(__MWERKS__) || defined(applec) ||defined(THINK_C) ||defined(__SC__) +# define NO_DUMMY_DECL +#endif + +/* Old Borland C and LCC incorrectly complains about missing returns: */ +#if defined(__BORLANDC__) && (__BORLANDC__ < 0x500) +# define NEED_DUMMY_RETURN +#endif + +#if defined(__LCC__) +# define NEED_DUMMY_RETURN +#endif + +/* Maximum value for memLevel in deflateInit2 */ +#ifndef MAX_MEM_LEVEL +# ifdef MAXSEG_64K +# define MAX_MEM_LEVEL 8 +# else +# define MAX_MEM_LEVEL 9 +# endif +#endif + +/* Maximum value for windowBits in deflateInit2 and inflateInit2. + * WARNING: reducing MAX_WBITS makes minigzip unable to extract .gz files + * created by gzip. (Files created by minigzip can still be extracted by + * gzip.) + */ +#ifndef MAX_WBITS +# define MAX_WBITS 15 /* 32K LZ77 window */ +#endif + +/* The memory requirements for deflate are (in bytes): + (1 << (windowBits+2)) + (1 << (memLevel+9)) + that is: 128K for windowBits=15 + 128K for memLevel = 8 (default values) + plus a few kilobytes for small objects. For example, if you want to reduce + the default memory requirements from 256K to 128K, compile with + make CFLAGS="-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7" + Of course this will generally degrade compression (there's no free lunch). + + The memory requirements for inflate are (in bytes) 1 << windowBits + that is, 32K for windowBits=15 (default value) plus a few kilobytes + for small objects. +*/ + + /* Type declarations */ + +#ifndef OF /* function prototypes */ +# ifdef STDC +# define OF(args) args +# else +# define OF(args) () +# endif +#endif + +/* The following definitions for FAR are needed only for MSDOS mixed + * model programming (small or medium model with some far allocations). + * This was tested only with MSC; for other MSDOS compilers you may have + * to define NO_MEMCPY in zutil.h. If you don't need the mixed model, + * just define FAR to be empty. + */ +#if (defined(M_I86SM) || defined(M_I86MM)) && !defined(__32BIT__) + /* MSC small or medium model */ +# define SMALL_MEDIUM +# ifdef _MSC_VER +# define FAR _far +# else +# define FAR far +# endif +#endif +#if defined(__BORLANDC__) && (defined(__SMALL__) || defined(__MEDIUM__)) +# ifndef __32BIT__ +# define SMALL_MEDIUM +# define FAR _far +# endif +#endif + +/* Compile with -DZLIB_DLL for Windows DLL support */ +#if defined(ZLIB_DLL) +# if defined(_WINDOWS) || defined(WINDOWS) +# ifdef FAR +# undef FAR +# endif +# include <windows.h> +# define ZEXPORT(x) x WINAPI +# ifdef WIN32 +# define ZEXPORTVA(x) x WINAPIV +# else +# define ZEXPORTVA(x) x FAR _cdecl _export +# endif +# endif +# if defined (__BORLANDC__) +# if (__BORLANDC__ >= 0x0500) && defined (WIN32) +# include <windows.h> +# define ZEXPORT(x) x __declspec(dllexport) WINAPI +# define ZEXPORTRVA(x) x __declspec(dllexport) WINAPIV +# else +# if defined (_Windows) && defined (__DLL__) +# define ZEXPORT(x) x _export +# define ZEXPORTVA(x) x _export +# endif +# endif +# endif +#endif + + +#ifndef ZEXPORT +# define ZEXPORT(x) static x +#endif +#ifndef ZEXPORTVA +# define ZEXPORTVA(x) static x +#endif +#ifndef ZEXTERN +# define ZEXTERN(x) static x +#endif +#ifndef ZEXTERNDEF +# define ZEXTERNDEF(x) static x +#endif + +#ifndef FAR +# define FAR +#endif + +#if !defined(MACOS) && !defined(TARGET_OS_MAC) +typedef unsigned char Byte; /* 8 bits */ +#endif +typedef unsigned int uInt; /* 16 bits or more */ +typedef unsigned long uLong; /* 32 bits or more */ + +#ifdef SMALL_MEDIUM + /* Borland C/C++ and some old MSC versions ignore FAR inside typedef */ +# define Bytef Byte FAR +#else + typedef Byte FAR Bytef; +#endif +typedef char FAR charf; +typedef int FAR intf; +typedef uInt FAR uIntf; +typedef uLong FAR uLongf; + +#ifdef STDC + typedef void FAR *voidpf; + typedef void *voidp; +#else + typedef Byte FAR *voidpf; + typedef Byte *voidp; +#endif + +#ifdef HAVE_UNISTD_H +# include <sys/types.h> /* for off_t */ +# include <unistd.h> /* for SEEK_* and off_t */ +# define z_off_t off_t +#endif +#ifndef SEEK_SET +# define SEEK_SET 0 /* Seek from beginning of file. */ +# define SEEK_CUR 1 /* Seek from current position. */ +# define SEEK_END 2 /* Set file pointer to EOF plus "offset" */ +#endif +#ifndef z_off_t +# define z_off_t long +#endif + +/* MVS linker does not support external names larger than 8 bytes */ +#if defined(__MVS__) +# pragma map(deflateInit_,"DEIN") +# pragma map(deflateInit2_,"DEIN2") +# pragma map(deflateEnd,"DEEND") +# pragma map(inflateInit_,"ININ") +# pragma map(inflateInit2_,"ININ2") +# pragma map(inflateEnd,"INEND") +# pragma map(inflateSync,"INSY") +# pragma map(inflateSetDictionary,"INSEDI") +# pragma map(inflate_blocks,"INBL") +# pragma map(inflate_blocks_new,"INBLNE") +# pragma map(inflate_blocks_free,"INBLFR") +# pragma map(inflate_blocks_reset,"INBLRE") +# pragma map(inflate_codes_free,"INCOFR") +# pragma map(inflate_codes,"INCO") +# pragma map(inflate_fast,"INFA") +# pragma map(inflate_flush,"INFLU") +# pragma map(inflate_mask,"INMA") +# pragma map(inflate_set_dictionary,"INSEDI2") +# pragma map(inflate_copyright,"INCOPY") +# pragma map(inflate_trees_bits,"INTRBI") +# pragma map(inflate_trees_dynamic,"INTRDY") +# pragma map(inflate_trees_fixed,"INTRFI") +# pragma map(inflate_trees_free,"INTRFR") +#endif + +#endif /* _ZCONF_H */ diff --git a/src/WinLibs/freetype-2.3.5/src/gzip/zlib.h b/src/WinLibs/freetype-2.3.5/src/gzip/zlib.h new file mode 100644 index 000000000..50d0d3f14 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/gzip/zlib.h @@ -0,0 +1,830 @@ +/* zlib.h -- interface of the 'zlib' general purpose compression library + version 1.1.4, March 11th, 2002 + + Copyright (C) 1995-2002 Jean-loup Gailly and Mark Adler + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + + Jean-loup Gailly Mark Adler + jloup@gzip.org madler@alumni.caltech.edu + + + The data format used by the zlib library is described by RFCs (Request for + Comments) 1950 to 1952 in the files ftp://ds.internic.net/rfc/rfc1950.txt + (zlib format), rfc1951.txt (deflate format) and rfc1952.txt (gzip format). +*/ + +#ifndef _ZLIB_H +#define _ZLIB_H + +#include "zconf.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define ZLIB_VERSION "1.1.4" + +/* + The 'zlib' compression library provides in-memory compression and + decompression functions, including integrity checks of the uncompressed + data. This version of the library supports only one compression method + (deflation) but other algorithms will be added later and will have the same + stream interface. + + Compression can be done in a single step if the buffers are large + enough (for example if an input file is mmap'ed), or can be done by + repeated calls of the compression function. In the latter case, the + application must provide more input and/or consume the output + (providing more output space) before each call. + + The library also supports reading and writing files in gzip (.gz) format + with an interface similar to that of stdio. + + The library does not install any signal handler. The decoder checks + the consistency of the compressed data, so the library should never + crash even in case of corrupted input. +*/ + +typedef voidpf (*alloc_func) OF((voidpf opaque, uInt items, uInt size)); +typedef void (*free_func) OF((voidpf opaque, voidpf address)); + +struct internal_state; + +typedef struct z_stream_s { + Bytef *next_in; /* next input byte */ + uInt avail_in; /* number of bytes available at next_in */ + uLong total_in; /* total nb of input bytes read so far */ + + Bytef *next_out; /* next output byte should be put there */ + uInt avail_out; /* remaining free space at next_out */ + uLong total_out; /* total nb of bytes output so far */ + + char *msg; /* last error message, NULL if no error */ + struct internal_state FAR *state; /* not visible by applications */ + + alloc_func zalloc; /* used to allocate the internal state */ + free_func zfree; /* used to free the internal state */ + voidpf opaque; /* private data object passed to zalloc and zfree */ + + int data_type; /* best guess about the data type: ascii or binary */ + uLong adler; /* adler32 value of the uncompressed data */ + uLong reserved; /* reserved for future use */ +} z_stream; + +typedef z_stream FAR *z_streamp; + +/* + The application must update next_in and avail_in when avail_in has + dropped to zero. It must update next_out and avail_out when avail_out + has dropped to zero. The application must initialize zalloc, zfree and + opaque before calling the init function. All other fields are set by the + compression library and must not be updated by the application. + + The opaque value provided by the application will be passed as the first + parameter for calls of zalloc and zfree. This can be useful for custom + memory management. The compression library attaches no meaning to the + opaque value. + + zalloc must return Z_NULL if there is not enough memory for the object. + If zlib is used in a multi-threaded application, zalloc and zfree must be + thread safe. + + On 16-bit systems, the functions zalloc and zfree must be able to allocate + exactly 65536 bytes, but will not be required to allocate more than this + if the symbol MAXSEG_64K is defined (see zconf.h). WARNING: On MSDOS, + pointers returned by zalloc for objects of exactly 65536 bytes *must* + have their offset normalized to zero. The default allocation function + provided by this library ensures this (see zutil.c). To reduce memory + requirements and avoid any allocation of 64K objects, at the expense of + compression ratio, compile the library with -DMAX_WBITS=14 (see zconf.h). + + The fields total_in and total_out can be used for statistics or + progress reports. After compression, total_in holds the total size of + the uncompressed data and may be saved for use in the decompressor + (particularly if the decompressor wants to decompress everything in + a single step). +*/ + + /* constants */ + +#define Z_NO_FLUSH 0 +#define Z_PARTIAL_FLUSH 1 /* will be removed, use Z_SYNC_FLUSH instead */ +#define Z_SYNC_FLUSH 2 +#define Z_FULL_FLUSH 3 +#define Z_FINISH 4 +/* Allowed flush values; see deflate() below for details */ + +#define Z_OK 0 +#define Z_STREAM_END 1 +#define Z_NEED_DICT 2 +#define Z_ERRNO (-1) +#define Z_STREAM_ERROR (-2) +#define Z_DATA_ERROR (-3) +#define Z_MEM_ERROR (-4) +#define Z_BUF_ERROR (-5) +#define Z_VERSION_ERROR (-6) +/* Return codes for the compression/decompression functions. Negative + * values are errors, positive values are used for special but normal events. + */ + +#define Z_NO_COMPRESSION 0 +#define Z_BEST_SPEED 1 +#define Z_BEST_COMPRESSION 9 +#define Z_DEFAULT_COMPRESSION (-1) +/* compression levels */ + +#define Z_FILTERED 1 +#define Z_HUFFMAN_ONLY 2 +#define Z_DEFAULT_STRATEGY 0 +/* compression strategy; see deflateInit2() below for details */ + +#define Z_BINARY 0 +#define Z_ASCII 1 +#define Z_UNKNOWN 2 +/* Possible values of the data_type field */ + +#define Z_DEFLATED 8 +/* The deflate compression method (the only one supported in this version) */ + +#define Z_NULL 0 /* for initializing zalloc, zfree, opaque */ + + + /* basic functions */ + +/* The application can compare zlibVersion and ZLIB_VERSION for consistency. + If the first character differs, the library code actually used is + not compatible with the zlib.h header file used by the application. + This check is automatically made by deflateInit and inflateInit. + */ + +/* +ZEXTERN(int) deflateInit OF((z_streamp strm, int level)); + + Initializes the internal stream state for compression. The fields + zalloc, zfree and opaque must be initialized before by the caller. + If zalloc and zfree are set to Z_NULL, deflateInit updates them to + use default allocation functions. + + The compression level must be Z_DEFAULT_COMPRESSION, or between 0 and 9: + 1 gives best speed, 9 gives best compression, 0 gives no compression at + all (the input data is simply copied a block at a time). + Z_DEFAULT_COMPRESSION requests a default compromise between speed and + compression (currently equivalent to level 6). + + deflateInit returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_STREAM_ERROR if level is not a valid compression level, + Z_VERSION_ERROR if the zlib library version (zlib_version) is incompatible + with the version assumed by the caller (ZLIB_VERSION). + msg is set to null if there is no error message. deflateInit does not + perform any compression: this will be done by deflate(). +*/ + + +/* + deflate compresses as much data as possible, and stops when the input + buffer becomes empty or the output buffer becomes full. It may introduce some + output latency (reading input without producing any output) except when + forced to flush. + + The detailed semantics are as follows. deflate performs one or both of the + following actions: + + - Compress more input starting at next_in and update next_in and avail_in + accordingly. If not all input can be processed (because there is not + enough room in the output buffer), next_in and avail_in are updated and + processing will resume at this point for the next call of deflate(). + + - Provide more output starting at next_out and update next_out and avail_out + accordingly. This action is forced if the parameter flush is non zero. + Forcing flush frequently degrades the compression ratio, so this parameter + should be set only when necessary (in interactive applications). + Some output may be provided even if flush is not set. + + Before the call of deflate(), the application should ensure that at least + one of the actions is possible, by providing more input and/or consuming + more output, and updating avail_in or avail_out accordingly; avail_out + should never be zero before the call. The application can consume the + compressed output when it wants, for example when the output buffer is full + (avail_out == 0), or after each call of deflate(). If deflate returns Z_OK + and with zero avail_out, it must be called again after making room in the + output buffer because there might be more output pending. + + If the parameter flush is set to Z_SYNC_FLUSH, all pending output is + flushed to the output buffer and the output is aligned on a byte boundary, so + that the decompressor can get all input data available so far. (In particular + avail_in is zero after the call if enough output space has been provided + before the call.) Flushing may degrade compression for some compression + algorithms and so it should be used only when necessary. + + If flush is set to Z_FULL_FLUSH, all output is flushed as with + Z_SYNC_FLUSH, and the compression state is reset so that decompression can + restart from this point if previous compressed data has been damaged or if + random access is desired. Using Z_FULL_FLUSH too often can seriously degrade + the compression. + + If deflate returns with avail_out == 0, this function must be called again + with the same value of the flush parameter and more output space (updated + avail_out), until the flush is complete (deflate returns with non-zero + avail_out). + + If the parameter flush is set to Z_FINISH, pending input is processed, + pending output is flushed and deflate returns with Z_STREAM_END if there + was enough output space; if deflate returns with Z_OK, this function must be + called again with Z_FINISH and more output space (updated avail_out) but no + more input data, until it returns with Z_STREAM_END or an error. After + deflate has returned Z_STREAM_END, the only possible operations on the + stream are deflateReset or deflateEnd. + + Z_FINISH can be used immediately after deflateInit if all the compression + is to be done in a single step. In this case, avail_out must be at least + 0.1% larger than avail_in plus 12 bytes. If deflate does not return + Z_STREAM_END, then it must be called again as described above. + + deflate() sets strm->adler to the adler32 checksum of all input read + so far (that is, total_in bytes). + + deflate() may update data_type if it can make a good guess about + the input data type (Z_ASCII or Z_BINARY). In doubt, the data is considered + binary. This field is only for information purposes and does not affect + the compression algorithm in any manner. + + deflate() returns Z_OK if some progress has been made (more input + processed or more output produced), Z_STREAM_END if all input has been + consumed and all output has been produced (only when flush is set to + Z_FINISH), Z_STREAM_ERROR if the stream state was inconsistent (for example + if next_in or next_out was NULL), Z_BUF_ERROR if no progress is possible + (for example avail_in or avail_out was zero). +*/ + + +/* + All dynamically allocated data structures for this stream are freed. + This function discards any unprocessed input and does not flush any + pending output. + + deflateEnd returns Z_OK if success, Z_STREAM_ERROR if the + stream state was inconsistent, Z_DATA_ERROR if the stream was freed + prematurely (some input or output was discarded). In the error case, + msg may be set but then points to a static string (which must not be + deallocated). +*/ + + +/* +ZEXTERN(int) inflateInit OF((z_streamp strm)); + + Initializes the internal stream state for decompression. The fields + next_in, avail_in, zalloc, zfree and opaque must be initialized before by + the caller. If next_in is not Z_NULL and avail_in is large enough (the exact + value depends on the compression method), inflateInit determines the + compression method from the zlib header and allocates all data structures + accordingly; otherwise the allocation will be deferred to the first call of + inflate. If zalloc and zfree are set to Z_NULL, inflateInit updates them to + use default allocation functions. + + inflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_VERSION_ERROR if the zlib library version is incompatible with the + version assumed by the caller. msg is set to null if there is no error + message. inflateInit does not perform any decompression apart from reading + the zlib header if present: this will be done by inflate(). (So next_in and + avail_in may be modified, but next_out and avail_out are unchanged.) +*/ + + +ZEXTERN(int) inflate OF((z_streamp strm, int flush)); +/* + inflate decompresses as much data as possible, and stops when the input + buffer becomes empty or the output buffer becomes full. It may some + introduce some output latency (reading input without producing any output) + except when forced to flush. + + The detailed semantics are as follows. inflate performs one or both of the + following actions: + + - Decompress more input starting at next_in and update next_in and avail_in + accordingly. If not all input can be processed (because there is not + enough room in the output buffer), next_in is updated and processing + will resume at this point for the next call of inflate(). + + - Provide more output starting at next_out and update next_out and avail_out + accordingly. inflate() provides as much output as possible, until there + is no more input data or no more space in the output buffer (see below + about the flush parameter). + + Before the call of inflate(), the application should ensure that at least + one of the actions is possible, by providing more input and/or consuming + more output, and updating the next_* and avail_* values accordingly. + The application can consume the uncompressed output when it wants, for + example when the output buffer is full (avail_out == 0), or after each + call of inflate(). If inflate returns Z_OK and with zero avail_out, it + must be called again after making room in the output buffer because there + might be more output pending. + + If the parameter flush is set to Z_SYNC_FLUSH, inflate flushes as much + output as possible to the output buffer. The flushing behavior of inflate is + not specified for values of the flush parameter other than Z_SYNC_FLUSH + and Z_FINISH, but the current implementation actually flushes as much output + as possible anyway. + + inflate() should normally be called until it returns Z_STREAM_END or an + error. However if all decompression is to be performed in a single step + (a single call of inflate), the parameter flush should be set to + Z_FINISH. In this case all pending input is processed and all pending + output is flushed; avail_out must be large enough to hold all the + uncompressed data. (The size of the uncompressed data may have been saved + by the compressor for this purpose.) The next operation on this stream must + be inflateEnd to deallocate the decompression state. The use of Z_FINISH + is never required, but can be used to inform inflate that a faster routine + may be used for the single inflate() call. + + If a preset dictionary is needed at this point (see inflateSetDictionary + below), inflate sets strm-adler to the adler32 checksum of the + dictionary chosen by the compressor and returns Z_NEED_DICT; otherwise + it sets strm->adler to the adler32 checksum of all output produced + so far (that is, total_out bytes) and returns Z_OK, Z_STREAM_END or + an error code as described below. At the end of the stream, inflate() + checks that its computed adler32 checksum is equal to that saved by the + compressor and returns Z_STREAM_END only if the checksum is correct. + + inflate() returns Z_OK if some progress has been made (more input processed + or more output produced), Z_STREAM_END if the end of the compressed data has + been reached and all uncompressed output has been produced, Z_NEED_DICT if a + preset dictionary is needed at this point, Z_DATA_ERROR if the input data was + corrupted (input stream not conforming to the zlib format or incorrect + adler32 checksum), Z_STREAM_ERROR if the stream structure was inconsistent + (for example if next_in or next_out was NULL), Z_MEM_ERROR if there was not + enough memory, Z_BUF_ERROR if no progress is possible or if there was not + enough room in the output buffer when Z_FINISH is used. In the Z_DATA_ERROR + case, the application may then call inflateSync to look for a good + compression block. +*/ + + +ZEXTERN(int) inflateEnd OF((z_streamp strm)); +/* + All dynamically allocated data structures for this stream are freed. + This function discards any unprocessed input and does not flush any + pending output. + + inflateEnd returns Z_OK if success, Z_STREAM_ERROR if the stream state + was inconsistent. In the error case, msg may be set but then points to a + static string (which must not be deallocated). +*/ + + /* Advanced functions */ + +/* + The following functions are needed only in some special applications. +*/ + +/* +ZEXTERN(int) deflateInit2 OF((z_streamp strm, + int level, + int method, + int windowBits, + int memLevel, + int strategy)); + + This is another version of deflateInit with more compression options. The + fields next_in, zalloc, zfree and opaque must be initialized before by + the caller. + + The method parameter is the compression method. It must be Z_DEFLATED in + this version of the library. + + The windowBits parameter is the base two logarithm of the window size + (the size of the history buffer). It should be in the range 8..15 for this + version of the library. Larger values of this parameter result in better + compression at the expense of memory usage. The default value is 15 if + deflateInit is used instead. + + The memLevel parameter specifies how much memory should be allocated + for the internal compression state. memLevel=1 uses minimum memory but + is slow and reduces compression ratio; memLevel=9 uses maximum memory + for optimal speed. The default value is 8. See zconf.h for total memory + usage as a function of windowBits and memLevel. + + The strategy parameter is used to tune the compression algorithm. Use the + value Z_DEFAULT_STRATEGY for normal data, Z_FILTERED for data produced by a + filter (or predictor), or Z_HUFFMAN_ONLY to force Huffman encoding only (no + string match). Filtered data consists mostly of small values with a + somewhat random distribution. In this case, the compression algorithm is + tuned to compress them better. The effect of Z_FILTERED is to force more + Huffman coding and less string matching; it is somewhat intermediate + between Z_DEFAULT and Z_HUFFMAN_ONLY. The strategy parameter only affects + the compression ratio but not the correctness of the compressed output even + if it is not set appropriately. + + deflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_STREAM_ERROR if a parameter is invalid (such as an invalid + method). msg is set to null if there is no error message. deflateInit2 does + not perform any compression: this will be done by deflate(). +*/ + +/* + Initializes the compression dictionary from the given byte sequence + without producing any compressed output. This function must be called + immediately after deflateInit, deflateInit2 or deflateReset, before any + call of deflate. The compressor and decompressor must use exactly the same + dictionary (see inflateSetDictionary). + + The dictionary should consist of strings (byte sequences) that are likely + to be encountered later in the data to be compressed, with the most commonly + used strings preferably put towards the end of the dictionary. Using a + dictionary is most useful when the data to be compressed is short and can be + predicted with good accuracy; the data can then be compressed better than + with the default empty dictionary. + + Depending on the size of the compression data structures selected by + deflateInit or deflateInit2, a part of the dictionary may in effect be + discarded, for example if the dictionary is larger than the window size in + deflate or deflate2. Thus the strings most likely to be useful should be + put at the end of the dictionary, not at the front. + + Upon return of this function, strm->adler is set to the Adler32 value + of the dictionary; the decompressor may later use this value to determine + which dictionary has been used by the compressor. (The Adler32 value + applies to the whole dictionary even if only a subset of the dictionary is + actually used by the compressor.) + + deflateSetDictionary returns Z_OK if success, or Z_STREAM_ERROR if a + parameter is invalid (such as NULL dictionary) or the stream state is + inconsistent (for example if deflate has already been called for this stream + or if the compression method is bsort). deflateSetDictionary does not + perform any compression: this will be done by deflate(). +*/ + +/* + Sets the destination stream as a complete copy of the source stream. + + This function can be useful when several compression strategies will be + tried, for example when there are several ways of pre-processing the input + data with a filter. The streams that will be discarded should then be freed + by calling deflateEnd. Note that deflateCopy duplicates the internal + compression state which can be quite large, so this strategy is slow and + can consume lots of memory. + + deflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_STREAM_ERROR if the source stream state was inconsistent + (such as zalloc being NULL). msg is left unchanged in both source and + destination. +*/ + +/* + This function is equivalent to deflateEnd followed by deflateInit, + but does not free and reallocate all the internal compression state. + The stream will keep the same compression level and any other attributes + that may have been set by deflateInit2. + + deflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent (such as zalloc or state being NULL). +*/ + +/* + Dynamically update the compression level and compression strategy. The + interpretation of level and strategy is as in deflateInit2. This can be + used to switch between compression and straight copy of the input data, or + to switch to a different kind of input data requiring a different + strategy. If the compression level is changed, the input available so far + is compressed with the old level (and may be flushed); the new level will + take effect only at the next call of deflate(). + + Before the call of deflateParams, the stream state must be set as for + a call of deflate(), since the currently available input may have to + be compressed and flushed. In particular, strm->avail_out must be non-zero. + + deflateParams returns Z_OK if success, Z_STREAM_ERROR if the source + stream state was inconsistent or if a parameter was invalid, Z_BUF_ERROR + if strm->avail_out was zero. +*/ + +/* +ZEXTERN(int) inflateInit2 OF((z_streamp strm, + int windowBits)); + + This is another version of inflateInit with an extra parameter. The + fields next_in, avail_in, zalloc, zfree and opaque must be initialized + before by the caller. + + The windowBits parameter is the base two logarithm of the maximum window + size (the size of the history buffer). It should be in the range 8..15 for + this version of the library. The default value is 15 if inflateInit is used + instead. If a compressed stream with a larger window size is given as + input, inflate() will return with the error code Z_DATA_ERROR instead of + trying to allocate a larger window. + + inflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_STREAM_ERROR if a parameter is invalid (such as a negative + memLevel). msg is set to null if there is no error message. inflateInit2 + does not perform any decompression apart from reading the zlib header if + present: this will be done by inflate(). (So next_in and avail_in may be + modified, but next_out and avail_out are unchanged.) +*/ + +/* + Initializes the decompression dictionary from the given uncompressed byte + sequence. This function must be called immediately after a call of inflate + if this call returned Z_NEED_DICT. The dictionary chosen by the compressor + can be determined from the Adler32 value returned by this call of + inflate. The compressor and decompressor must use exactly the same + dictionary (see deflateSetDictionary). + + inflateSetDictionary returns Z_OK if success, Z_STREAM_ERROR if a + parameter is invalid (such as NULL dictionary) or the stream state is + inconsistent, Z_DATA_ERROR if the given dictionary doesn't match the + expected one (incorrect Adler32 value). inflateSetDictionary does not + perform any decompression: this will be done by subsequent calls of + inflate(). +*/ + +/* + Skips invalid compressed data until a full flush point (see above the + description of deflate with Z_FULL_FLUSH) can be found, or until all + available input is skipped. No output is provided. + + inflateSync returns Z_OK if a full flush point has been found, Z_BUF_ERROR + if no more input was provided, Z_DATA_ERROR if no flush point has been found, + or Z_STREAM_ERROR if the stream structure was inconsistent. In the success + case, the application may save the current current value of total_in which + indicates where valid compressed data was found. In the error case, the + application may repeatedly call inflateSync, providing more input each time, + until success or end of the input data. +*/ + +ZEXTERN(int) inflateReset OF((z_streamp strm)); +/* + This function is equivalent to inflateEnd followed by inflateInit, + but does not free and reallocate all the internal decompression state. + The stream will keep attributes that may have been set by inflateInit2. + + inflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent (such as zalloc or state being NULL). +*/ + + + /* utility functions */ + +/* + The following utility functions are implemented on top of the + basic stream-oriented functions. To simplify the interface, some + default options are assumed (compression level and memory usage, + standard memory allocation functions). The source code of these + utility functions can easily be modified if you need special options. +*/ + +/* + Compresses the source buffer into the destination buffer. sourceLen is + the byte length of the source buffer. Upon entry, destLen is the total + size of the destination buffer, which must be at least 0.1% larger than + sourceLen plus 12 bytes. Upon exit, destLen is the actual size of the + compressed buffer. + This function can be used to compress a whole file at once if the + input file is mmap'ed. + compress returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_BUF_ERROR if there was not enough room in the output + buffer. +*/ + +/* + Compresses the source buffer into the destination buffer. The level + parameter has the same meaning as in deflateInit. sourceLen is the byte + length of the source buffer. Upon entry, destLen is the total size of the + destination buffer, which must be at least 0.1% larger than sourceLen plus + 12 bytes. Upon exit, destLen is the actual size of the compressed buffer. + + compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_BUF_ERROR if there was not enough room in the output buffer, + Z_STREAM_ERROR if the level parameter is invalid. +*/ + +/* + Decompresses the source buffer into the destination buffer. sourceLen is + the byte length of the source buffer. Upon entry, destLen is the total + size of the destination buffer, which must be large enough to hold the + entire uncompressed data. (The size of the uncompressed data must have + been saved previously by the compressor and transmitted to the decompressor + by some mechanism outside the scope of this compression library.) + Upon exit, destLen is the actual size of the compressed buffer. + This function can be used to decompress a whole file at once if the + input file is mmap'ed. + + uncompress returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_BUF_ERROR if there was not enough room in the output + buffer, or Z_DATA_ERROR if the input data was corrupted. +*/ + + +/* + Opens a gzip (.gz) file for reading or writing. The mode parameter + is as in fopen ("rb" or "wb") but can also include a compression level + ("wb9") or a strategy: 'f' for filtered data as in "wb6f", 'h' for + Huffman only compression as in "wb1h". (See the description + of deflateInit2 for more information about the strategy parameter.) + + gzopen can be used to read a file which is not in gzip format; in this + case gzread will directly read from the file without decompression. + + gzopen returns NULL if the file could not be opened or if there was + insufficient memory to allocate the (de)compression state; errno + can be checked to distinguish the two cases (if errno is zero, the + zlib error is Z_MEM_ERROR). */ + +/* + gzdopen() associates a gzFile with the file descriptor fd. File + descriptors are obtained from calls like open, dup, creat, pipe or + fileno (in the file has been previously opened with fopen). + The mode parameter is as in gzopen. + The next call of gzclose on the returned gzFile will also close the + file descriptor fd, just like fclose(fdopen(fd), mode) closes the file + descriptor fd. If you want to keep fd open, use gzdopen(dup(fd), mode). + gzdopen returns NULL if there was insufficient memory to allocate + the (de)compression state. +*/ + +/* + Dynamically update the compression level or strategy. See the description + of deflateInit2 for the meaning of these parameters. + gzsetparams returns Z_OK if success, or Z_STREAM_ERROR if the file was not + opened for writing. +*/ + +/* + Reads the given number of uncompressed bytes from the compressed file. + If the input file was not in gzip format, gzread copies the given number + of bytes into the buffer. + gzread returns the number of uncompressed bytes actually read (0 for + end of file, -1 for error). */ + +/* + Writes the given number of uncompressed bytes into the compressed file. + gzwrite returns the number of uncompressed bytes actually written + (0 in case of error). +*/ + +/* + Converts, formats, and writes the args to the compressed file under + control of the format string, as in fprintf. gzprintf returns the number of + uncompressed bytes actually written (0 in case of error). +*/ + +/* + Writes the given null-terminated string to the compressed file, excluding + the terminating null character. + gzputs returns the number of characters written, or -1 in case of error. +*/ + +/* + Reads bytes from the compressed file until len-1 characters are read, or + a newline character is read and transferred to buf, or an end-of-file + condition is encountered. The string is then terminated with a null + character. + gzgets returns buf, or Z_NULL in case of error. +*/ + +/* + Writes c, converted to an unsigned char, into the compressed file. + gzputc returns the value that was written, or -1 in case of error. +*/ + +/* + Reads one byte from the compressed file. gzgetc returns this byte + or -1 in case of end of file or error. +*/ + +/* + Flushes all pending output into the compressed file. The parameter + flush is as in the deflate() function. The return value is the zlib + error number (see function gzerror below). gzflush returns Z_OK if + the flush parameter is Z_FINISH and all output could be flushed. + gzflush should be called only when strictly necessary because it can + degrade compression. +*/ + +/* + Sets the starting position for the next gzread or gzwrite on the + given compressed file. The offset represents a number of bytes in the + uncompressed data stream. The whence parameter is defined as in lseek(2); + the value SEEK_END is not supported. + If the file is opened for reading, this function is emulated but can be + extremely slow. If the file is opened for writing, only forward seeks are + supported; gzseek then compresses a sequence of zeroes up to the new + starting position. + + gzseek returns the resulting offset location as measured in bytes from + the beginning of the uncompressed stream, or -1 in case of error, in + particular if the file is opened for writing and the new starting position + would be before the current position. +*/ + +/* + Rewinds the given file. This function is supported only for reading. + + gzrewind(file) is equivalent to (int)gzseek(file, 0L, SEEK_SET) +*/ + +/* + Returns the starting position for the next gzread or gzwrite on the + given compressed file. This position represents a number of bytes in the + uncompressed data stream. + + gztell(file) is equivalent to gzseek(file, 0L, SEEK_CUR) +*/ + +/* + Returns 1 when EOF has previously been detected reading the given + input stream, otherwise zero. +*/ + +/* + Flushes all pending output if necessary, closes the compressed file + and deallocates all the (de)compression state. The return value is the zlib + error number (see function gzerror below). +*/ + +/* + Returns the error message for the last error which occurred on the + given compressed file. errnum is set to zlib error number. If an + error occurred in the file system and not in the compression library, + errnum is set to Z_ERRNO and the application may consult errno + to get the exact error code. +*/ + + /* checksum functions */ + +/* + These functions are not related to compression but are exported + anyway because they might be useful in applications using the + compression library. +*/ + +ZEXTERN(uLong) adler32 OF((uLong adler, const Bytef *buf, uInt len)); + +/* + Update a running Adler-32 checksum with the bytes buf[0..len-1] and + return the updated checksum. If buf is NULL, this function returns + the required initial value for the checksum. + An Adler-32 checksum is almost as reliable as a CRC32 but can be computed + much faster. Usage example: + + uLong adler = adler32(0L, Z_NULL, 0); + + while (read_buffer(buffer, length) != EOF) { + adler = adler32(adler, buffer, length); + } + if (adler != original_adler) error(); +*/ + +/* + Update a running crc with the bytes buf[0..len-1] and return the updated + crc. If buf is NULL, this function returns the required initial value + for the crc. Pre- and post-conditioning (one's complement) is performed + within this function so it shouldn't be done by the application. + Usage example: + + uLong crc = crc32(0L, Z_NULL, 0); + + while (read_buffer(buffer, length) != EOF) { + crc = crc32(crc, buffer, length); + } + if (crc != original_crc) error(); +*/ + + + /* various hacks, don't look :) */ + +/* deflateInit and inflateInit are macros to allow checking the zlib version + * and the compiler's view of z_stream: + */ +ZEXTERN(int) inflateInit2_ OF((z_streamp strm, int windowBits, + const char *version, int stream_size)); +#define deflateInit(strm, level) \ + deflateInit_((strm), (level), ZLIB_VERSION, sizeof(z_stream)) +#define inflateInit(strm) \ + inflateInit_((strm), ZLIB_VERSION, sizeof(z_stream)) +#define deflateInit2(strm, level, method, windowBits, memLevel, strategy) \ + deflateInit2_((strm),(level),(method),(windowBits),(memLevel),\ + (strategy), ZLIB_VERSION, sizeof(z_stream)) +#define inflateInit2(strm, windowBits) \ + inflateInit2_((strm), (windowBits), ZLIB_VERSION, sizeof(z_stream)) + + +#ifdef __cplusplus +} +#endif + +#endif /* _ZLIB_H */ diff --git a/src/WinLibs/freetype-2.3.5/src/gzip/zutil.c b/src/WinLibs/freetype-2.3.5/src/gzip/zutil.c new file mode 100644 index 000000000..5ed2da087 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/gzip/zutil.c @@ -0,0 +1,181 @@ +/* zutil.c -- target dependent utility functions for the compression library + * Copyright (C) 1995-2002 Jean-loup Gailly. + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* @(#) $Id: zutil.c,v 1.3 2006/04/29 07:31:16 wl Exp $ */ + +#include "zutil.h" + +#ifndef STDC +extern void exit OF((int)); +#endif + + +#ifndef HAVE_MEMCPY + +void zmemcpy(dest, source, len) + Bytef* dest; + const Bytef* source; + uInt len; +{ + if (len == 0) return; + do { + *dest++ = *source++; /* ??? to be unrolled */ + } while (--len != 0); +} + +int zmemcmp(s1, s2, len) + const Bytef* s1; + const Bytef* s2; + uInt len; +{ + uInt j; + + for (j = 0; j < len; j++) { + if (s1[j] != s2[j]) return 2*(s1[j] > s2[j])-1; + } + return 0; +} + +void zmemzero(dest, len) + Bytef* dest; + uInt len; +{ + if (len == 0) return; + do { + *dest++ = 0; /* ??? to be unrolled */ + } while (--len != 0); +} +#endif + +#ifdef __TURBOC__ +#if (defined( __BORLANDC__) || !defined(SMALL_MEDIUM)) && !defined(__32BIT__) +/* Small and medium model in Turbo C are for now limited to near allocation + * with reduced MAX_WBITS and MAX_MEM_LEVEL + */ +# define MY_ZCALLOC + +/* Turbo C malloc() does not allow dynamic allocation of 64K bytes + * and farmalloc(64K) returns a pointer with an offset of 8, so we + * must fix the pointer. Warning: the pointer must be put back to its + * original form in order to free it, use zcfree(). + */ + +#define MAX_PTR 10 +/* 10*64K = 640K */ + +local int next_ptr = 0; + +typedef struct ptr_table_s { + voidpf org_ptr; + voidpf new_ptr; +} ptr_table; + +local ptr_table table[MAX_PTR]; +/* This table is used to remember the original form of pointers + * to large buffers (64K). Such pointers are normalized with a zero offset. + * Since MSDOS is not a preemptive multitasking OS, this table is not + * protected from concurrent access. This hack doesn't work anyway on + * a protected system like OS/2. Use Microsoft C instead. + */ + +voidpf zcalloc (voidpf opaque, unsigned items, unsigned size) +{ + voidpf buf = opaque; /* just to make some compilers happy */ + ulg bsize = (ulg)items*size; + + /* If we allocate less than 65520 bytes, we assume that farmalloc + * will return a usable pointer which doesn't have to be normalized. + */ + if (bsize < 65520L) { + buf = farmalloc(bsize); + if (*(ush*)&buf != 0) return buf; + } else { + buf = farmalloc(bsize + 16L); + } + if (buf == NULL || next_ptr >= MAX_PTR) return NULL; + table[next_ptr].org_ptr = buf; + + /* Normalize the pointer to seg:0 */ + *((ush*)&buf+1) += ((ush)((uch*)buf-0) + 15) >> 4; + *(ush*)&buf = 0; + table[next_ptr++].new_ptr = buf; + return buf; +} + +void zcfree (voidpf opaque, voidpf ptr) +{ + int n; + if (*(ush*)&ptr != 0) { /* object < 64K */ + farfree(ptr); + return; + } + /* Find the original pointer */ + for (n = 0; n < next_ptr; n++) { + if (ptr != table[n].new_ptr) continue; + + farfree(table[n].org_ptr); + while (++n < next_ptr) { + table[n-1] = table[n]; + } + next_ptr--; + return; + } + ptr = opaque; /* just to make some compilers happy */ + Assert(0, "zcfree: ptr not found"); +} +#endif +#endif /* __TURBOC__ */ + + +#if defined(M_I86) && !defined(__32BIT__) +/* Microsoft C in 16-bit mode */ + +# define MY_ZCALLOC + +#if (!defined(_MSC_VER) || (_MSC_VER <= 600)) +# define _halloc halloc +# define _hfree hfree +#endif + +voidpf zcalloc (voidpf opaque, unsigned items, unsigned size) +{ + if (opaque) opaque = 0; /* to make compiler happy */ + return _halloc((long)items, size); +} + +void zcfree (voidpf opaque, voidpf ptr) +{ + if (opaque) opaque = 0; /* to make compiler happy */ + _hfree(ptr); +} + +#endif /* MSC */ + + +#ifndef MY_ZCALLOC /* Any system without a special alloc function */ + +#ifndef STDC +extern voidp ft_scalloc OF((uInt items, uInt size)); +extern void ft_sfree OF((voidpf ptr)); +#endif + +voidpf zcalloc (opaque, items, size) + voidpf opaque; + unsigned items; + unsigned size; +{ + if (opaque) items += size - size; /* make compiler happy */ + return (voidpf)ft_scalloc(items, size); +} + +void zcfree (opaque, ptr) + voidpf opaque; + voidpf ptr; +{ + ft_sfree(ptr); + if (opaque) return; /* make compiler happy */ +} + +#endif /* MY_ZCALLOC */ diff --git a/src/WinLibs/freetype-2.3.5/src/gzip/zutil.h b/src/WinLibs/freetype-2.3.5/src/gzip/zutil.h new file mode 100644 index 000000000..8e3c69a9f --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/gzip/zutil.h @@ -0,0 +1,215 @@ +/* zutil.h -- internal interface and configuration of the compression library + * Copyright (C) 1995-2002 Jean-loup Gailly. + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +/* @(#) $Id: zutil.h,v 1.6 2007/06/01 06:56:17 wl Exp $ */ + +#ifndef _Z_UTIL_H +#define _Z_UTIL_H + +#include "zlib.h" + +#ifdef STDC +# include <stddef.h> +# include <string.h> +# include <stdlib.h> +#endif +#ifdef NO_ERRNO_H + extern int errno; +#else +# include <errno.h> +#endif + +#ifndef local +# define local static +#endif +/* compile with -Dlocal if your debugger can't find static symbols */ + +typedef unsigned char uch; +typedef uch FAR uchf; +typedef unsigned short ush; +typedef ush FAR ushf; +typedef unsigned long ulg; + + +#define ERR_RETURN(strm,err) \ + return (strm->msg = (char*)ERR_MSG(err), (err)) +/* To be used only when the state is known to be valid */ + + /* common constants */ + +#ifndef DEF_WBITS +# define DEF_WBITS MAX_WBITS +#endif +/* default windowBits for decompression. MAX_WBITS is for compression only */ + +#if MAX_MEM_LEVEL >= 8 +# define DEF_MEM_LEVEL 8 +#else +# define DEF_MEM_LEVEL MAX_MEM_LEVEL +#endif +/* default memLevel */ + +#define STORED_BLOCK 0 +#define STATIC_TREES 1 +#define DYN_TREES 2 +/* The three kinds of block type */ + +#define MIN_MATCH 3 +#define MAX_MATCH 258 +/* The minimum and maximum match lengths */ + +#define PRESET_DICT 0x20 /* preset dictionary flag in zlib header */ + + /* target dependencies */ + +#ifdef MSDOS +# define OS_CODE 0x00 +# if defined(__TURBOC__) || defined(__BORLANDC__) +# if(__STDC__ == 1) && (defined(__LARGE__) || defined(__COMPACT__)) + /* Allow compilation with ANSI keywords only enabled */ + void _Cdecl farfree( void *block ); + void *_Cdecl farmalloc( unsigned long nbytes ); +# else +# include <alloc.h> +# endif +# else /* MSC or DJGPP */ +# endif +#endif + +#ifdef OS2 +# define OS_CODE 0x06 +#endif + +#ifdef WIN32 /* Window 95 & Windows NT */ +# define OS_CODE 0x0b +#endif + +#if defined(VAXC) || defined(VMS) +# define OS_CODE 0x02 +# define F_OPEN(name, mode) \ + ft_fopen((name), (mode), "mbc=60", "ctx=stm", "rfm=fix", "mrs=512") +#endif + +#ifdef AMIGA +# define OS_CODE 0x01 +#endif + +#if defined(ATARI) || defined(atarist) +# define OS_CODE 0x05 +#endif + +#if defined(MACOS) || defined(TARGET_OS_MAC) +# define OS_CODE 0x07 +# if defined(__MWERKS__) && __dest_os != __be_os && __dest_os != __win32_os +# include <unix.h> /* for fdopen */ +# else +# ifndef fdopen +# define fdopen(fd,mode) NULL /* No fdopen() */ +# endif +# endif +#endif + +#ifdef __50SERIES /* Prime/PRIMOS */ +# define OS_CODE 0x0F +#endif + +#ifdef TOPS20 +# define OS_CODE 0x0a +#endif + +#if defined(_BEOS_) || defined(RISCOS) +# define fdopen(fd,mode) NULL /* No fdopen() */ +#endif + +#if (defined(_MSC_VER) && (_MSC_VER > 600)) +# define fdopen(fd,type) _fdopen(fd,type) +#endif + + + /* Common defaults */ + +#ifndef OS_CODE +# define OS_CODE 0x03 /* assume Unix */ +#endif + +#ifndef F_OPEN +# define F_OPEN(name, mode) ft_fopen((name), (mode)) +#endif + + /* functions */ + +#ifdef HAVE_STRERROR + extern char *strerror OF((int)); +# define zstrerror(errnum) strerror(errnum) +#else +# define zstrerror(errnum) "" +#endif + +#if defined(pyr) +# define NO_MEMCPY +#endif +#if defined(SMALL_MEDIUM) && !defined(_MSC_VER) && !defined(__SC__) + /* Use our own functions for small and medium model with MSC <= 5.0. + * You may have to use the same strategy for Borland C (untested). + * The __SC__ check is for Symantec. + */ +# define NO_MEMCPY +#endif +#if defined(STDC) && !defined(HAVE_MEMCPY) && !defined(NO_MEMCPY) +# define HAVE_MEMCPY +#endif +#ifdef HAVE_MEMCPY +# ifdef SMALL_MEDIUM /* MSDOS small or medium model */ +# define zmemcpy _fmemcpy +# define zmemcmp _fmemcmp +# define zmemzero(dest, len) _fmemset(dest, 0, len) +# else +# define zmemcpy ft_memcpy +# define zmemcmp ft_memcmp +# define zmemzero(dest, len) ft_memset(dest, 0, len) +# endif +#else + extern void zmemcpy OF((Bytef* dest, const Bytef* source, uInt len)); + extern int zmemcmp OF((const Bytef* s1, const Bytef* s2, uInt len)); + extern void zmemzero OF((Bytef* dest, uInt len)); +#endif + +/* Diagnostic functions */ +#ifdef DEBUG +# include <stdio.h> + extern int z_verbose; + extern void z_error OF((char *m)); +# define Assert(cond,msg) {if(!(cond)) z_error(msg);} +# define Trace(x) {if (z_verbose>=0) fprintf x ;} +# define Tracev(x) {if (z_verbose>0) fprintf x ;} +# define Tracevv(x) {if (z_verbose>1) fprintf x ;} +# define Tracec(c,x) {if (z_verbose>0 && (c)) fprintf x ;} +# define Tracecv(c,x) {if (z_verbose>1 && (c)) fprintf x ;} +#else +# define Assert(cond,msg) +# define Trace(x) +# define Tracev(x) +# define Tracevv(x) +# define Tracec(c,x) +# define Tracecv(c,x) +#endif + + +typedef uLong (*check_func) OF((uLong check, const Bytef *buf, + uInt len)); +local voidpf zcalloc OF((voidpf opaque, unsigned items, unsigned size)); +local void zcfree OF((voidpf opaque, voidpf ptr)); + +#define ZALLOC(strm, items, size) \ + (*((strm)->zalloc))((strm)->opaque, (items), (size)) +#define ZFREE(strm, addr) (*((strm)->zfree))((strm)->opaque, (voidpf)(addr)) +#define TRY_FREE(s, p) {if (p) ZFREE(s, p);} + +#endif /* _Z_UTIL_H */ diff --git a/src/WinLibs/freetype-2.3.5/src/lzw/Jamfile b/src/WinLibs/freetype-2.3.5/src/lzw/Jamfile new file mode 100644 index 000000000..6f1f516e7 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/src/lzw/ftlzw.c b/src/WinLibs/freetype-2.3.5/src/lzw/ftlzw.c new file mode 100644 index 000000000..45fbf7b6e --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/lzw/ftlzw.c @@ -0,0 +1,413 @@ +/***************************************************************************/ +/* */ +/* ftlzw.c */ +/* */ +/* FreeType support for .Z compressed files. */ +/* */ +/* This optional component relies on NetBSD's zopen(). It should mainly */ +/* be used to parse compressed PCF fonts, as found with many X11 server */ +/* distributions. */ +/* */ +/* Copyright 2004, 2005, 2006 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 <string.h> +#include <stdio.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 + +#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 */ + { + stream = source; + + 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/src/WinLibs/freetype-2.3.5/src/lzw/ftzopen.c b/src/WinLibs/freetype-2.3.5/src/lzw/ftzopen.c new file mode 100644 index 000000000..fc7831510 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/lzw/ftzopen.c @@ -0,0 +1,398 @@ +/***************************************************************************/ +/* */ +/* 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 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_UInt old_size = state->stack_size; + FT_UInt 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 ) + { + FTLZW_STACK_PUSH( state->suffix[code - 256] ); + code = state->prefix[code - 256]; + } + } + + old_char = code; + FTLZW_STACK_PUSH( old_char ); + + state->phase = FT_LZW_PHASE_STACK; + } + /* fall-through */ + + case FT_LZW_PHASE_STACK: + { + while ( state->stack_top > 0 ) + { + --state->stack_top; + + if ( buffer ) + buffer[result] = state->stack[state->stack_top]; + + if ( ++result == out_size ) + goto Exit; + } + + /* now create new entry */ + if ( state->free_ent < state->max_free ) + { + if ( state->free_ent >= state->prefix_size && + ft_lzwstate_prefix_grow( state ) < 0 ) + goto Eof; + + FT_ASSERT( state->free_ent < state->prefix_size ); + + state->prefix[state->free_ent] = (FT_UShort)old_code; + state->suffix[state->free_ent] = (FT_Byte) old_char; + + state->free_ent += 1; + } + + old_code = in_code; + + state->phase = FT_LZW_PHASE_CODE; + goto NextCode; + } + + default: /* state == EOF */ + ; + } + + Exit: + state->old_code = old_code; + state->old_char = old_char; + state->in_code = in_code; + + return result; + + Eof: + state->phase = FT_LZW_PHASE_EOF; + goto Exit; + } + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/lzw/ftzopen.h b/src/WinLibs/freetype-2.3.5/src/lzw/ftzopen.h new file mode 100644 index 000000000..97881149c --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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 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_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_Int 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_UInt stack_size; + FT_Byte stack_0[FT_LZW_DEFAULT_STACK_SIZE]; /* minimize heap alloc */ + + FT_Stream source; /* source stream */ + FT_Memory memory; + + } FT_LzwStateRec, *FT_LzwState; + + + FT_LOCAL( void ) + ft_lzwstate_init( FT_LzwState state, + FT_Stream source ); + + FT_LOCAL( void ) + ft_lzwstate_done( FT_LzwState state ); + + + FT_LOCAL( void ) + ft_lzwstate_reset( FT_LzwState state ); + + + FT_LOCAL( FT_ULong ) + ft_lzwstate_io( FT_LzwState state, + FT_Byte* buffer, + FT_ULong out_size ); + +/* */ + +#endif /* __FT_ZOPEN_H__ */ + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/lzw/rules.mk b/src/WinLibs/freetype-2.3.5/src/lzw/rules.mk new file mode 100644 index 000000000..5550a48d6 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/src/otvalid/Jamfile b/src/WinLibs/freetype-2.3.5/src/otvalid/Jamfile new file mode 100644 index 000000000..35a14c6ab --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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 ; + } + else + { + _sources = otvalid ; + } + + Library $(FT2_LIB) : $(_sources).c ; +} + +# end of src/otvalid Jamfile diff --git a/src/WinLibs/freetype-2.3.5/src/otvalid/module.mk b/src/WinLibs/freetype-2.3.5/src/otvalid/module.mk new file mode 100644 index 000000000..aa4db047d --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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)otv_module_class$(CLOSE_DRIVER) +$(ECHO_DRIVER)otvalid $(ECHO_DRIVER_DESC)OpenType validation module$(ECHO_DRIVER_DONE) +endef + +# EOF diff --git a/src/WinLibs/freetype-2.3.5/src/otvalid/otvalid.c b/src/WinLibs/freetype-2.3.5/src/otvalid/otvalid.c new file mode 100644 index 000000000..2f85f601b --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/otvalid/otvalid.c @@ -0,0 +1,30 @@ +/***************************************************************************/ +/* */ +/* otvalid.c */ +/* */ +/* FreeType validator for OpenType tables (body only). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + +#define FT_MAKE_OPTION_SINGLE_OBJECT + +#include <ft2build.h> + +#include "otvbase.c" +#include "otvcommn.c" +#include "otvgdef.c" +#include "otvgpos.c" +#include "otvgsub.c" +#include "otvjstf.c" +#include "otvmod.c" + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/otvalid/otvalid.h b/src/WinLibs/freetype-2.3.5/src/otvalid/otvalid.h new file mode 100644 index 000000000..38f030f39 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/otvalid/otvalid.h @@ -0,0 +1,72 @@ +/***************************************************************************/ +/* */ +/* otvalid.h */ +/* */ +/* OpenType table validation (specification only). */ +/* */ +/* 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 __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_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_END_HEADER + +#endif /* __OTVALID_H__ */ + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/otvalid/otvbase.c b/src/WinLibs/freetype-2.3.5/src/otvalid/otvbase.c new file mode 100644 index 000000000..8ad2238d6 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/otvalid/otvbase.c @@ -0,0 +1,318 @@ +/***************************************************************************/ +/* */ +/* otvbase.c */ +/* */ +/* OpenType BASE table validation (body). */ +/* */ +/* 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 "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_DATA; + } + + 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_DATA; + + table_size = 6; + + OTV_OPTIONAL_OFFSET( HorizAxis ); + OTV_SIZE_CHECK( HorizAxis ); + if ( HorizAxis ) + otv_Axis_validate( table + HorizAxis, valid ); + + OTV_OPTIONAL_OFFSET( VertAxis ); + OTV_SIZE_CHECK( VertAxis ); + if ( VertAxis ) + otv_Axis_validate( table + VertAxis, valid ); + + FT_TRACE4(( "\n" )); + } + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/otvalid/otvcommn.c b/src/WinLibs/freetype-2.3.5/src/otvalid/otvcommn.c new file mode 100644 index 000000000..d94e4f3cb --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/otvalid/otvcommn.c @@ -0,0 +1,1055 @@ +/***************************************************************************/ +/* */ +/* otvcommn.c */ +/* */ +/* OpenType common tables validation (body). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#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_Bytes p = table; + FT_UInt CoverageFormat; + + + 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; + + + GlyphCount = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (GlyphCount = %d)\n", GlyphCount )); + + OTV_LIMIT_CHECK( GlyphCount * 2 ); /* GlyphArray */ + } + break; + + case 2: /* CoverageFormat2 */ + { + FT_UInt n, RangeCount; + FT_UInt Start, End, StartCoverageIndex, total = 0, 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 ( n > 0 && Start <= last ) + FT_INVALID_DATA; + + total += End - Start + 1; + last = End; + } + } + break; + + default: + FT_INVALID_FORMAT; + } + + /* no need to check glyph indices used as input to coverage tables */ + /* since even invalid glyph indices return a meaningful result */ + + 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 GlyphCount; + + + p += 2; /* skip StartGlyph */ + + OTV_LIMIT_CHECK( 2 ); + + GlyphCount = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (GlyphCount = %d)\n", GlyphCount )); + + OTV_LIMIT_CHECK( GlyphCount * 2 ); /* ClassValueArray */ + } + 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; + + 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 || 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 ); + + 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 ); + + 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 ); + 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 ); + + 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 ); + + 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 ); + + 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 ); + + 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 ); + + count2 = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (Count = %d)\n", count2 )); + + OTV_LIMIT_CHECK( count2 * 4 ); + + for ( ; count2 > 0; count2-- ) + { + if ( FT_NEXT_USHORT( p ) >= InputGlyphCount ) + FT_INVALID_DATA; + + if ( FT_NEXT_USHORT( p ) >= valid->lookup_count ) + FT_INVALID_DATA; + } + + OTV_EXIT; + } + + + FT_LOCAL_DEF( FT_UInt ) + otv_GSUBGPOS_get_Lookup_count( FT_Bytes table ) + { + FT_Bytes p = table + 8; + + + return otv_LookupList_get_count( table + FT_NEXT_USHORT( p ) ); + } + + + FT_LOCAL_DEF( FT_UInt ) + otv_GSUBGPOS_have_MarkAttachmentType_flag( FT_Bytes table ) + { + FT_Bytes p, lookup; + FT_UInt count; + + + if ( !table ) + return 0; + + /* LookupList */ + p = table + 8; + table += FT_NEXT_USHORT( p ); + + /* LookupCount */ + p = table; + count = FT_NEXT_USHORT( p ); + + for ( ; count > 0; count-- ) + { + FT_Bytes oldp; + + + /* Lookup */ + lookup = table + FT_NEXT_USHORT( p ); + + oldp = p; + + /* LookupFlag */ + p = lookup + 2; + if ( FT_NEXT_USHORT( p ) & 0xFF00U ) + return 1; + + p = oldp; + } + + return 0; + } + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/otvalid/otvcommn.h b/src/WinLibs/freetype-2.3.5/src/otvalid/otvcommn.h new file mode 100644 index 000000000..be6ac69c2 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/otvalid/otvcommn.h @@ -0,0 +1,436 @@ +/***************************************************************************/ +/* */ +/* otvcommn.h */ +/* */ +/* OpenType common tables validation (specification). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#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'!\n" \ + "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 ); + + /* return first covered glyph */ + FT_LOCAL( FT_UInt ) + otv_Coverage_get_first( FT_Bytes table ); + + /* return last covered glyph */ + FT_LOCAL( FT_UInt ) + otv_Coverage_get_last( FT_Bytes table ); + + /* return number of covered glyphs */ + FT_LOCAL( FT_UInt ) + otv_Coverage_get_count( FT_Bytes table ); + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** CLASS DEFINITION TABLE *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL( void ) + otv_ClassDef_validate( FT_Bytes table, + OTV_Validator valid ); + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** DEVICE TABLE *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL( void ) + otv_Device_validate( FT_Bytes table, + OTV_Validator valid ); + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** LOOKUPS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL( void ) + otv_Lookup_validate( FT_Bytes table, + OTV_Validator valid ); + + FT_LOCAL( void ) + otv_LookupList_validate( FT_Bytes table, + OTV_Validator valid ); + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** FEATURES *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL( void ) + otv_Feature_validate( FT_Bytes table, + OTV_Validator valid ); + + /* lookups must already be validated */ + FT_LOCAL( void ) + otv_FeatureList_validate( FT_Bytes table, + FT_Bytes lookups, + OTV_Validator valid ); + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** LANGUAGE SYSTEM *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL( void ) + otv_LangSys_validate( FT_Bytes table, + OTV_Validator valid ); + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** SCRIPTS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL( void ) + otv_Script_validate( FT_Bytes table, + OTV_Validator valid ); + + /* features must already be validated */ + FT_LOCAL( void ) + otv_ScriptList_validate( FT_Bytes table, + FT_Bytes features, + OTV_Validator valid ); + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** UTILITY FUNCTIONS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + +#define ChainPosClassSetFunc otv_x_Ox +#define ChainPosRuleSetFunc otv_x_Ox +#define ChainSubClassSetFunc otv_x_Ox +#define ChainSubRuleSetFunc otv_x_Ox +#define JstfLangSysFunc otv_x_Ox +#define JstfMaxFunc otv_x_Ox +#define LigGlyphFunc otv_x_Ox +#define LigatureArrayFunc otv_x_Ox +#define LigatureSetFunc otv_x_Ox +#define PosClassSetFunc otv_x_Ox +#define PosRuleSetFunc otv_x_Ox +#define SubClassSetFunc otv_x_Ox +#define SubRuleSetFunc otv_x_Ox + + FT_LOCAL( void ) + otv_x_Ox ( FT_Bytes table, + OTV_Validator valid ); + +#define AlternateSubstFormat1Func otv_u_C_x_Ox +#define ChainContextPosFormat1Func otv_u_C_x_Ox +#define ChainContextSubstFormat1Func otv_u_C_x_Ox +#define ContextPosFormat1Func otv_u_C_x_Ox +#define ContextSubstFormat1Func otv_u_C_x_Ox +#define LigatureSubstFormat1Func otv_u_C_x_Ox +#define MultipleSubstFormat1Func otv_u_C_x_Ox + + FT_LOCAL( void ) + otv_u_C_x_Ox( FT_Bytes table, + OTV_Validator valid ); + +#define AlternateSetFunc otv_x_ux +#define AttachPointFunc otv_x_ux +#define ExtenderGlyphFunc otv_x_ux +#define JstfGPOSModListFunc otv_x_ux +#define JstfGSUBModListFunc otv_x_ux +#define SequenceFunc otv_x_ux + + FT_LOCAL( void ) + otv_x_ux( FT_Bytes table, + OTV_Validator valid ); + +#define PosClassRuleFunc otv_x_y_ux_sy +#define PosRuleFunc otv_x_y_ux_sy +#define SubClassRuleFunc otv_x_y_ux_sy +#define SubRuleFunc otv_x_y_ux_sy + + FT_LOCAL( void ) + otv_x_y_ux_sy( FT_Bytes table, + OTV_Validator valid ); + +#define ChainPosClassRuleFunc otv_x_ux_y_uy_z_uz_p_sp +#define ChainPosRuleFunc otv_x_ux_y_uy_z_uz_p_sp +#define ChainSubClassRuleFunc otv_x_ux_y_uy_z_uz_p_sp +#define ChainSubRuleFunc otv_x_ux_y_uy_z_uz_p_sp + + FT_LOCAL( void ) + otv_x_ux_y_uy_z_uz_p_sp( FT_Bytes table, + OTV_Validator valid ); + +#define ContextPosFormat2Func otv_u_O_O_x_Onx +#define ContextSubstFormat2Func otv_u_O_O_x_Onx + + FT_LOCAL( void ) + otv_u_O_O_x_Onx( FT_Bytes table, + OTV_Validator valid ); + +#define ContextPosFormat3Func otv_u_x_y_Ox_sy +#define ContextSubstFormat3Func otv_u_x_y_Ox_sy + + FT_LOCAL( void ) + otv_u_x_y_Ox_sy( FT_Bytes table, + OTV_Validator valid ); + +#define ChainContextPosFormat2Func otv_u_O_O_O_O_x_Onx +#define ChainContextSubstFormat2Func otv_u_O_O_O_O_x_Onx + + FT_LOCAL( void ) + otv_u_O_O_O_O_x_Onx( FT_Bytes table, + OTV_Validator valid ); + +#define ChainContextPosFormat3Func otv_u_x_Ox_y_Oy_z_Oz_p_sp +#define ChainContextSubstFormat3Func otv_u_x_Ox_y_Oy_z_Oz_p_sp + + FT_LOCAL( void ) + otv_u_x_Ox_y_Oy_z_Oz_p_sp( FT_Bytes table, + OTV_Validator valid ); + + + FT_LOCAL( FT_UInt ) + otv_GSUBGPOS_get_Lookup_count( FT_Bytes table ); + + FT_LOCAL( FT_UInt ) + otv_GSUBGPOS_have_MarkAttachmentType_flag( FT_Bytes table ); + + /* */ + +FT_END_HEADER + +#endif /* __OTVCOMMN_H__ */ + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/otvalid/otverror.h b/src/WinLibs/freetype-2.3.5/src/otvalid/otverror.h new file mode 100644 index 000000000..041b53836 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/src/otvalid/otvgdef.c b/src/WinLibs/freetype-2.3.5/src/otvalid/otvgdef.c new file mode 100644 index 000000000..7d24902e8 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/otvalid/otvgdef.c @@ -0,0 +1,219 @@ +/***************************************************************************/ +/* */ +/* otvgdef.c */ +/* */ +/* OpenType GDEF table validation (body). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#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 ); + 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_DATA; + } + + OTV_EXIT; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** GDEF TABLE *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL_DEF( void ) + otv_GDEF_validate( FT_Bytes table, + FT_Bytes gsub, + FT_Bytes gpos, + 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 */ + + OTV_OPTIONAL_OFFSET( GlyphClassDef ); + OTV_SIZE_CHECK( GlyphClassDef ); + if ( GlyphClassDef ) + otv_ClassDef_validate( table + GlyphClassDef, valid ); + + OTV_OPTIONAL_OFFSET( AttachListOffset ); + OTV_SIZE_CHECK( AttachListOffset ); + if ( AttachListOffset ) + { + OTV_NEST2( AttachList, AttachPoint ); + OTV_RUN( table + AttachListOffset, valid ); + } + + OTV_OPTIONAL_OFFSET( LigCaretListOffset ); + OTV_SIZE_CHECK( LigCaretListOffset ); + if ( LigCaretListOffset ) + { + OTV_NEST3( LigCaretList, LigGlyph, CaretValue ); + OTV_RUN( table + LigCaretListOffset, valid ); + } + + if ( need_MarkAttachClassDef ) + { + OTV_OPTIONAL_OFFSET( MarkAttachClassDef ); + OTV_SIZE_CHECK( MarkAttachClassDef ); + if ( MarkAttachClassDef ) + otv_ClassDef_validate( table + MarkAttachClassDef, valid ); + } + + FT_TRACE4(( "\n" )); + } + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/otvalid/otvgpos.c b/src/WinLibs/freetype-2.3.5/src/otvalid/otvgpos.c new file mode 100644 index 000000000..ed347053d --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/otvalid/otvgpos.c @@ -0,0 +1,1013 @@ +/***************************************************************************/ +/* */ +/* otvgpos.c */ +/* */ +/* OpenType GPOS table validation (body). */ +/* */ +/* Copyright 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. */ +/* */ +/***************************************************************************/ + + +#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 ); + otv_Coverage_validate( table + Coverage2, valid ); + + 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_DATA; + + 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_UInt 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_DATA; + } + + 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 ); + 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 ); + + OTV_LIMIT_CHECK( ValueCount * len_value ); + + /* Value */ + for ( ; ValueCount > 0; ValueCount-- ) + { + otv_ValueRecord_validate( p, ValueFormat, valid ); + p += len_value; + } + } + break; + + default: + FT_INVALID_DATA; + } + + 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 ); + + 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 ); + 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_DATA; + } + + 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 ); + + 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_DATA; + } + + OTV_EXIT; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** GPOS LOOKUP TYPE 4 *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* sets valid->extra2 (0) */ + + 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 = 0; + OTV_NEST2( MarkBasePosFormat1, BaseArray ); + OTV_RUN( table, valid ); + break; + + default: + FT_INVALID_DATA; + } + + 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_DATA; + } + + 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_DATA; + } + + 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_DATA; + } + + 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_DATA; + } + + 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, 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_DATA; + } + + 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_DATA; + + ScriptList = FT_NEXT_USHORT( p ); + FeatureList = FT_NEXT_USHORT( p ); + LookupList = FT_NEXT_USHORT( p ); + + valid->type_count = 9; + valid->type_funcs = (OTV_Validate_Func*)otv_gpos_validate_funcs; + valid->glyph_count = glyph_count; + + otv_LookupList_validate( table + LookupList, + valid ); + otv_FeatureList_validate( table + FeatureList, table + LookupList, + valid ); + otv_ScriptList_validate( table + ScriptList, table + FeatureList, + valid ); + + FT_TRACE4(( "\n" )); + } + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/otvalid/otvgpos.h b/src/WinLibs/freetype-2.3.5/src/otvalid/otvgpos.h new file mode 100644 index 000000000..14ca40826 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/src/otvalid/otvgsub.c b/src/WinLibs/freetype-2.3.5/src/otvalid/otvgsub.c new file mode 100644 index 000000000..91dae0bb1 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/otvalid/otvgsub.c @@ -0,0 +1,584 @@ +/***************************************************************************/ +/* */ +/* otvgsub.c */ +/* */ +/* OpenType GSUB table validation (body). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#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 ); + + 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 ); + + 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_DATA; + } + + 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_DATA; + } + + 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_DATA; + } + + 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_DATA; + } + + 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_DATA; + } + + 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_DATA; + } + + 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, 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_DATA; + } + + 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 ); + + OTV_LIMIT_CHECK( BacktrackGlyphCount * 2 + 2 ); + + for ( ; BacktrackGlyphCount > 0; BacktrackGlyphCount-- ) + otv_Coverage_validate( table + FT_NEXT_USHORT( p ), valid ); + + 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 ); + + 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_DATA; + } + + 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_DATA; + + ScriptList = FT_NEXT_USHORT( p ); + FeatureList = FT_NEXT_USHORT( p ); + LookupList = FT_NEXT_USHORT( p ); + + valid->type_count = 8; + valid->type_funcs = (OTV_Validate_Func*)otv_gsub_validate_funcs; + valid->glyph_count = glyph_count; + + otv_LookupList_validate( table + LookupList, + valid ); + otv_FeatureList_validate( table + FeatureList, table + LookupList, + valid ); + otv_ScriptList_validate( table + ScriptList, table + FeatureList, + valid ); + + FT_TRACE4(( "\n" )); + } + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/otvalid/otvjstf.c b/src/WinLibs/freetype-2.3.5/src/otvalid/otvjstf.c new file mode 100644 index 000000000..80b8dd660 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/otvalid/otvjstf.c @@ -0,0 +1,258 @@ +/***************************************************************************/ +/* */ +/* otvjstf.c */ +/* */ +/* OpenType JSTF table validation (body). */ +/* */ +/* 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 "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_DATA; + + JstfScriptCount = FT_NEXT_USHORT( p ); + + FT_TRACE3(( " (JstfScriptCount = %d)\n", JstfScriptCount )); + + OTV_LIMIT_CHECK( JstfScriptCount * 6 ); + + if ( gsub ) + valid->extra1 = otv_GSUBGPOS_get_Lookup_count( gsub ); + else + valid->extra1 = 0; + + if ( gpos ) + valid->extra2 = otv_GSUBGPOS_get_Lookup_count( gpos ); + else + valid->extra2 = 0; + + valid->glyph_count = glyph_count; + + /* JstfScriptRecord */ + for ( ; JstfScriptCount > 0; JstfScriptCount-- ) + { + p += 4; /* skip JstfScriptTag */ + + /* JstfScript */ + otv_JstfScript_validate( table + FT_NEXT_USHORT( p ), valid ); + } + + FT_TRACE4(( "\n" )); + } + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/otvalid/otvmod.c b/src/WinLibs/freetype-2.3.5/src/otvalid/otvmod.c new file mode 100644 index 000000000..157272f1a --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/otvalid/otvmod.c @@ -0,0 +1,242 @@ +/***************************************************************************/ +/* */ +/* otvmod.c */ +/* */ +/* FreeType's OpenType validation module implementation (body). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#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_ULong len_base, len_gdef, len_gpos, len_gsub, len_jstf; + FT_ValidatorRec volatile valid; + + + base = gdef = gpos = gsub = jstf = NULL; + len_base = len_gdef = len_gpos = len_gsub = len_jstf = 0; + + /* 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; + } + + /* 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, face->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, face->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, &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, face->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 ); + } + + return error; + } + + + static + const FT_Service_OTvalidateRec otvalid_interface = + { + otv_validate + }; + + + static + const FT_ServiceDescRec otvalid_services[] = + { + { FT_SERVICE_ID_OPENTYPE_VALIDATE, &otvalid_interface }, + { NULL, NULL } + }; + + + static FT_Pointer + otvalid_get_service( FT_Module module, + const char* service_id ) + { + FT_UNUSED( module ); + + return ft_service_list_lookup( otvalid_services, service_id ); + } + + + FT_CALLBACK_TABLE_DEF + const FT_Module_Class otv_module_class = + { + 0, + sizeof( FT_ModuleRec ), + "otvalid", + 0x10000L, + 0x20000L, + + 0, /* module-specific interface */ + + (FT_Module_Constructor)0, + (FT_Module_Destructor) 0, + (FT_Module_Requester) otvalid_get_service + }; + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/otvalid/otvmod.h b/src/WinLibs/freetype-2.3.5/src/otvalid/otvmod.h new file mode 100644 index 000000000..1bfc1899f --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/otvalid/otvmod.h @@ -0,0 +1,39 @@ +/***************************************************************************/ +/* */ +/* 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 + + + FT_EXPORT_VAR( const FT_Module_Class ) otv_module_class; + + +FT_END_HEADER + +#endif /* __OTVMOD_H__ */ + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/otvalid/rules.mk b/src/WinLibs/freetype-2.3.5/src/otvalid/rules.mk new file mode 100644 index 000000000..48f12336f --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/otvalid/rules.mk @@ -0,0 +1,77 @@ +# +# FreeType 2 OpenType validation driver configuration rules +# + + +# 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. + + +# 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)/otvmod.c + +# OTV driver headers +# +OTV_DRV_H := $(OTV_DIR)/otvalid.h \ + $(OTV_DIR)/otverror.h \ + $(OTV_DIR)/otvcommn.h \ + $(OTV_DIR)/otvgpos.h \ + $(OTV_DIR)/otvmod.h + + +# OTV driver object(s) +# +# OTV_DRV_OBJ_M is used during `multi' builds. +# OTV_DRV_OBJ_S is used during `single' builds. +# +OTV_DRV_OBJ_M := $(OTV_DRV_SRC:$(OTV_DIR)/%.c=$(OBJ_DIR)/%.$O) +OTV_DRV_OBJ_S := $(OBJ_DIR)/otvalid.$O + +# OTV driver source file for single build +# +OTV_DRV_SRC_S := $(OTV_DIR)/otvalid.c + + +# OTV driver - single object +# +$(OTV_DRV_OBJ_S): $(OTV_DRV_SRC_S) $(OTV_DRV_SRC) \ + $(FREETYPE_H) $(OTV_DRV_H) + $(OTV_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(OTV_DRV_SRC_S)) + + +# OTV driver - multiple objects +# +$(OBJ_DIR)/%.$O: $(OTV_DIR)/%.c $(FREETYPE_H) $(OTV_DRV_H) + $(OTV_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<) + + +# update main driver object lists +# +DRV_OBJS_S += $(OTV_DRV_OBJ_S) +DRV_OBJS_M += $(OTV_DRV_OBJ_M) + + +# EOF diff --git a/src/WinLibs/freetype-2.3.5/src/pcf/Jamfile b/src/WinLibs/freetype-2.3.5/src/pcf/Jamfile new file mode 100644 index 000000000..752fcac2a --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/src/pcf/README b/src/WinLibs/freetype-2.3.5/src/pcf/README new file mode 100644 index 000000000..cc1480b2d --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/src/pcf/module.mk b/src/WinLibs/freetype-2.3.5/src/pcf/module.mk new file mode 100644 index 000000000..0c51cd6fc --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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)pcf_driver_class$(CLOSE_DRIVER) +$(ECHO_DRIVER)pcf $(ECHO_DRIVER_DESC)pcf bitmap fonts$(ECHO_DRIVER_DONE) +endef + +# EOF diff --git a/src/WinLibs/freetype-2.3.5/src/pcf/pcf.c b/src/WinLibs/freetype-2.3.5/src/pcf/pcf.c new file mode 100644 index 000000000..11d5b7b2a --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/pcf/pcf.c @@ -0,0 +1,36 @@ +/* pcf.c + + FreeType font driver for pcf fonts + + Copyright 2000-2001, 2003 by + Francesco Zappa Nardelli + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +*/ + + +#define FT_MAKE_OPTION_SINGLE_OBJECT + + +#include <ft2build.h> +#include "pcfutil.c" +#include "pcfread.c" +#include "pcfdrivr.c" + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/pcf/pcf.h b/src/WinLibs/freetype-2.3.5/src/pcf/pcf.h new file mode 100644 index 000000000..9d2d8e0e4 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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 integer; + FT_ULong cardinal; + + } 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/src/WinLibs/freetype-2.3.5/src/pcf/pcfdrivr.c b/src/WinLibs/freetype-2.3.5/src/pcf/pcfdrivr.c new file mode 100644 index 000000000..c0f0e49ca --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/pcf/pcfdrivr.c @@ -0,0 +1,668 @@ +/* pcfdrivr.c + + FreeType font driver for pcf files + + Copyright (C) 2000, 2001, 2002, 2003, 2004, 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. +*/ + + +#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_UInt32 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_UInt32 charcode = *acharcode + 1; + FT_UInt result = 0; + + + min = 0; + max = cmap->num_encodings; + + while ( min < max ) + { + FT_UInt32 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: + *acharcode = 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 + }; + + + FT_CALLBACK_DEF( void ) + PCF_Face_Done( FT_Face pcfface ) /* PCF_Face */ + { + PCF_Face face = (PCF_Face)pcfface; + FT_Memory 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 ) + { + FT_Error error2; + + + PCF_Face_Done( pcfface ); + + /* 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; + 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; + 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 + { + face->gzip_source = stream; + pcfface->stream = &face->gzip_stream; + + stream = pcfface->stream; + + error = pcf_load_font( stream, face ); + if ( error ) + goto Fail; + } + } + + /* 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 = face->root.stream; + FT_Error error = PCF_Err_Ok; + FT_Bitmap* bitmap = &slot->bitmap; + PCF_Metric metric; + int 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; + } + + 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 + { + /* 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 = prop->value.integer; + } + 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/src/WinLibs/freetype-2.3.5/src/pcf/pcfdrivr.h b/src/WinLibs/freetype-2.3.5/src/pcf/pcfdrivr.h new file mode 100644 index 000000000..7ddf697e1 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/pcf/pcfdrivr.h @@ -0,0 +1,44 @@ +/* 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 + + FT_EXPORT_VAR( const FT_Driver_ClassRec ) pcf_driver_class; + +FT_END_HEADER + + +#endif /* __PCFDRIVR_H__ */ + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/pcf/pcferror.h b/src/WinLibs/freetype-2.3.5/src/pcf/pcferror.h new file mode 100644 index 000000000..d75c067aa --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/src/pcf/pcfread.c b/src/WinLibs/freetype-2.3.5/src/pcf/pcfread.c new file mode 100644 index 000000000..b9123cf57 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/pcf/pcfread.c @@ -0,0 +1,1267 @@ +/* pcfread.c + + FreeType font driver for pcf fonts + + Copyright 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007 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 "pcfdrivr.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 + + +#if defined( 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; + } + +#if defined( 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_Int ntables, + FT_ULong type, + FT_ULong *aformat, + FT_ULong *asize ) + { + FT_Error error = PCF_Err_Invalid_File_Format; + FT_Int 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_Int ntables, + FT_ULong type ) + { + FT_Int 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_UInt 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\n", nprops )); + + /* rough estimate */ + if ( nprops > size / PCF_PROPERTY_SIZE ) + { + error = PCF_Err_Invalid_Table; + goto Bail; + } + + face->nprops = 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 ); + FT_Stream_Skip( stream, i ); + } + + 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.integer = props[i].value; + + FT_TRACE4(( " %d\n", properties[i].value.integer )); + } + } + + 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++ ) + { + 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; + int 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 )); + + if ( nbitmaps != 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_ERROR(( "pcf_get_bitmaps:")); + FT_ERROR(( " 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; + + int nn, len; + char* strings[4] = { NULL, NULL, NULL, NULL }; + int 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 ) + { + int 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.integer + 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.integer * 64 * 7200 + 36135L ) / 72270L ); + + prop = pcf_find_property( face, "PIXEL_SIZE" ); + if ( prop ) + bsize->y_ppem = (FT_Short)prop->value.integer << 6; + + prop = pcf_find_property( face, "RESOLUTION_X" ); + if ( prop ) + resolution_x = (FT_Short)prop->value.integer; + + prop = pcf_find_property( face, "RESOLUTION_Y" ); + if ( prop ) + resolution_y = (FT_Short)prop->value.integer; + + if ( bsize->y_ppem == 0 ) + { + bsize->y_ppem = bsize->size; + if ( resolution_y ) + bsize->y_ppem = bsize->y_ppem * resolution_y / 72; + } + if ( resolution_x && resolution_y ) + bsize->x_ppem = bsize->y_ppem * resolution_x / resolution_y; + else + bsize->x_ppem = bsize->y_ppem; + } + + /* set up charset */ + { + PCF_Property charset_registry = 0, charset_encoding = 0; + + + charset_registry = pcf_find_property( face, "CHARSET_REGISTRY" ); + charset_encoding = pcf_find_property( face, "CHARSET_ENCODING" ); + + if ( charset_registry && charset_registry->isString && + charset_encoding && charset_encoding->isString ) + { + if ( FT_STRDUP( face->charset_encoding, + charset_encoding->value.atom ) || + FT_STRDUP( face->charset_registry, + charset_registry->value.atom ) ) + goto Exit; + } + } + } + + Exit: + if ( error ) + { + /* This is done to respect the behaviour of the original */ + /* PCF font driver. */ + error = PCF_Err_Invalid_File_Format; + } + + return error; + } + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/pcf/pcfread.h b/src/WinLibs/freetype-2.3.5/src/pcf/pcfread.h new file mode 100644 index 000000000..c9524f134 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/src/pcf/pcfutil.c b/src/WinLibs/freetype-2.3.5/src/pcf/pcfutil.c new file mode 100644 index 000000000..67ddbe889 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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, + int nbytes ) + { + for ( ; --nbytes >= 0; 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, + int 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, + int nbytes ) + { + unsigned char c; + + + for ( ; nbytes >= 4; nbytes -= 4, buf += 4 ) + { + c = buf[0]; + buf[0] = buf[3]; + buf[3] = c; + + c = buf[1]; + buf[1] = buf[2]; + buf[2] = c; + } + } + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/pcf/pcfutil.h b/src/WinLibs/freetype-2.3.5/src/pcf/pcfutil.h new file mode 100644 index 000000000..1557be3e8 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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, + int nbytes ); + + FT_LOCAL( void ) + TwoByteSwap( unsigned char* buf, + int nbytes ); + + FT_LOCAL( void ) + FourByteSwap( unsigned char* buf, + int nbytes ); + +FT_END_HEADER + +#endif /* __PCFUTIL_H__ */ + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/pcf/rules.mk b/src/WinLibs/freetype-2.3.5/src/pcf/rules.mk new file mode 100644 index 000000000..1ad4ba897 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/pcf/rules.mk @@ -0,0 +1,80 @@ +# +# FreeType 2 pcf driver configuration rules +# + + +# Copyright (C) 2000, 2001, 2003 by +# Francesco Zappa Nardelli +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. + + +# 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)/pcfread.c \ + $(PCF_DIR)/pcfdrivr.c \ + $(PCF_DIR)/pcfutil.c + +# pcf driver headers +# +PCF_DRV_H := $(PCF_DIR)/pcf.h \ + $(PCF_DIR)/pcfdrivr.h \ + $(PCF_DIR)/pcfutil.h \ + $(PCF_DIR)/pcferror.h + +# pcf driver object(s) +# +# PCF_DRV_OBJ_M is used during `multi' builds +# PCF_DRV_OBJ_S is used during `single' builds +# +PCF_DRV_OBJ_M := $(PCF_DRV_SRC:$(PCF_DIR)/%.c=$(OBJ_DIR)/%.$O) +PCF_DRV_OBJ_S := $(OBJ_DIR)/pcf.$O + +# pcf driver source file for single build +# +PCF_DRV_SRC_S := $(PCF_DIR)/pcf.c + + +# pcf driver - single object +# +$(PCF_DRV_OBJ_S): $(PCF_DRV_SRC_S) $(PCF_DRV_SRC) $(FREETYPE_H) $(PCF_DRV_H) + $(PCF_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(PCF_DRV_SRC_S)) + + +# pcf driver - multiple objects +# +$(OBJ_DIR)/%.$O: $(PCF_DIR)/%.c $(FREETYPE_H) $(PCF_DRV_H) + $(PCF_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<) + + +# update main driver object lists +# +DRV_OBJS_S += $(PCF_DRV_OBJ_S) +DRV_OBJS_M += $(PCF_DRV_OBJ_M) + + +# EOF diff --git a/src/WinLibs/freetype-2.3.5/src/pfr/Jamfile b/src/WinLibs/freetype-2.3.5/src/pfr/Jamfile new file mode 100644 index 000000000..9e2f2b8d0 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/src/pfr/module.mk b/src/WinLibs/freetype-2.3.5/src/pfr/module.mk new file mode 100644 index 000000000..53ab34aa9 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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)pfr_driver_class$(CLOSE_DRIVER) +$(ECHO_DRIVER)pfr $(ECHO_DRIVER_DESC)PFR/TrueDoc font files with extension *.pfr$(ECHO_DRIVER_DONE) +endef + +# EOF diff --git a/src/WinLibs/freetype-2.3.5/src/pfr/pfr.c b/src/WinLibs/freetype-2.3.5/src/pfr/pfr.c new file mode 100644 index 000000000..eb2c4edb7 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/pfr/pfr.c @@ -0,0 +1,29 @@ +/***************************************************************************/ +/* */ +/* pfr.c */ +/* */ +/* FreeType PFR driver component. */ +/* */ +/* Copyright 2002 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + +#define FT_MAKE_OPTION_SINGLE_OBJECT + +#include <ft2build.h> + +#include "pfrload.c" +#include "pfrgload.c" +#include "pfrcmap.c" +#include "pfrobjs.c" +#include "pfrdrivr.c" +#include "pfrsbit.c" + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/pfr/pfrcmap.c b/src/WinLibs/freetype-2.3.5/src/pfr/pfrcmap.c new file mode 100644 index 000000000..c8faee043 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/pfr/pfrcmap.c @@ -0,0 +1,163 @@ +/***************************************************************************/ +/* */ +/* pfrcmap.c */ +/* */ +/* FreeType PFR cmap handling (body). */ +/* */ +/* Copyright 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 "pfrcmap.h" +#include "pfrobjs.h" +#include FT_INTERNAL_DEBUG_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_UInt ) + 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 + }; + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/pfr/pfrcmap.h b/src/WinLibs/freetype-2.3.5/src/pfr/pfrcmap.h new file mode 100644 index 000000000..a62695305 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/src/pfr/pfrdrivr.c b/src/WinLibs/freetype-2.3.5/src/pfr/pfrdrivr.c new file mode 100644 index 000000000..40206720e --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/pfr/pfrdrivr.c @@ -0,0 +1,207 @@ +/***************************************************************************/ +/* */ +/* pfrdrivr.c */ +/* */ +/* FreeType PFR driver interface (body). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#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_Bad_Argument; + + + *anadvance = 0; + if ( face ) + { + PFR_PhyFont phys = &face->phy_font; + + + if ( gindex < phys->num_chars ) + { + *anadvance = phys->chars[gindex].advance; + error = 0; + } + } + + 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/src/WinLibs/freetype-2.3.5/src/pfr/pfrdrivr.h b/src/WinLibs/freetype-2.3.5/src/pfr/pfrdrivr.h new file mode 100644 index 000000000..36f1205b7 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/pfr/pfrdrivr.h @@ -0,0 +1,39 @@ +/***************************************************************************/ +/* */ +/* 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 + + + FT_EXPORT_VAR( const FT_Driver_ClassRec ) pfr_driver_class; + + +FT_END_HEADER + + +#endif /* __PFRDRIVR_H__ */ + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/pfr/pfrerror.h b/src/WinLibs/freetype-2.3.5/src/pfr/pfrerror.h new file mode 100644 index 000000000..2e1c401dd --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/src/pfr/pfrgload.c b/src/WinLibs/freetype-2.3.5/src/pfr/pfrgload.c new file mode 100644 index 000000000..3bb173302 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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 ) & -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/src/WinLibs/freetype-2.3.5/src/pfr/pfrgload.h b/src/WinLibs/freetype-2.3.5/src/pfr/pfrgload.h new file mode 100644 index 000000000..7cc7a8702 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/src/pfr/pfrload.c b/src/WinLibs/freetype-2.3.5/src/pfr/pfrload.c new file mode 100644 index 000000000..1ee2c1f8c --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/pfr/pfrload.c @@ -0,0 +1,938 @@ +/***************************************************************************/ +/* */ +/* pfrload.c */ +/* */ +/* FreeType PFR loader (body). */ +/* */ +/* Copyright 2002, 2003, 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 "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, num_aux; + FT_Byte* p; + FT_Byte* limit; + + + phy_font->memory = memory; + phy_font->offset = offset; + + phy_font->kern_items = NULL; + phy_font->kern_items_tail = &phy_font->kern_items; + + if ( FT_STREAM_SEEK( offset ) || FT_FRAME_ENTER( size ) ) + goto Exit; + + phy_font->cursor = stream->cursor; + + p = stream->cursor; + limit = p + size; + + PFR_CHECK( 15 ); + phy_font->font_ref_number = PFR_NEXT_USHORT( p ); + phy_font->outline_resolution = PFR_NEXT_USHORT( p ); + phy_font->metrics_resolution = PFR_NEXT_USHORT( p ); + phy_font->bbox.xMin = PFR_NEXT_SHORT( p ); + phy_font->bbox.yMin = PFR_NEXT_SHORT( p ); + phy_font->bbox.xMax = PFR_NEXT_SHORT( p ); + phy_font->bbox.yMax = PFR_NEXT_SHORT( p ); + phy_font->flags = flags = PFR_NEXT_BYTE( p ); + + /* get the standard advance for non-proportional fonts */ + if ( !(flags & PFR_PHY_PROPORTIONAL) ) + { + PFR_CHECK( 2 ); + phy_font->standard_advance = PFR_NEXT_SHORT( p ); + } + + /* load the extra items when present */ + if ( flags & PFR_PHY_EXTRA_ITEMS ) + { + error = pfr_extra_items_parse( &p, limit, + pfr_phy_font_extra_items, phy_font ); + + if ( error ) + goto Fail; + } + + /* In certain fonts, the auxiliary bytes contain interesting */ + /* information. These are not in the specification but can be */ + /* guessed by looking at the content of a few PFR0 fonts. */ + PFR_CHECK( 3 ); + num_aux = PFR_NEXT_ULONG( p ); + + if ( num_aux > 0 ) + { + FT_Byte* q = p; + FT_Byte* q2; + + + PFR_CHECK( num_aux ); + p += num_aux; + + while ( num_aux > 0 ) + { + FT_UInt length, type; + + + if ( q + 4 > p ) + break; + + length = PFR_NEXT_USHORT( q ); + if ( length < 4 || length > num_aux ) + break; + + q2 = q + length - 2; + type = PFR_NEXT_USHORT( q ); + + switch ( type ) + { + case 1: + /* this seems to correspond to the font's family name, + * padded to 16-bits with one zero when necessary + */ + error = pfr_aux_name_load( q, length - 4U, memory, + &phy_font->family_name ); + if ( error ) + goto Exit; + break; + + case 2: + if ( q + 32 > q2 ) + break; + + q += 10; + phy_font->ascent = PFR_NEXT_SHORT( q ); + phy_font->descent = PFR_NEXT_SHORT( q ); + phy_font->leading = PFR_NEXT_SHORT( q ); + q += 16; + break; + + case 3: + /* this seems to correspond to the font's style name, + * padded to 16-bits with one zero when necessary + */ + error = pfr_aux_name_load( q, length - 4U, memory, + &phy_font->style_name ); + if ( error ) + goto Exit; + break; + + default: + ; + } + + q = q2; + num_aux -= length; + } + } + + /* read the blue values */ + { + FT_UInt n, count; + + + PFR_CHECK( 1 ); + phy_font->num_blue_values = count = PFR_NEXT_BYTE( p ); + + PFR_CHECK( count * 2 ); + + if ( FT_NEW_ARRAY( phy_font->blue_values, count ) ) + goto Fail; + + for ( n = 0; n < count; n++ ) + phy_font->blue_values[n] = PFR_NEXT_SHORT( p ); + } + + PFR_CHECK( 8 ); + phy_font->blue_fuzz = PFR_NEXT_BYTE( p ); + phy_font->blue_scale = PFR_NEXT_BYTE( p ); + + phy_font->vertical.standard = PFR_NEXT_USHORT( p ); + phy_font->horizontal.standard = PFR_NEXT_USHORT( p ); + + /* read the character descriptors */ + { + FT_UInt n, count, Size; + + + phy_font->num_chars = count = PFR_NEXT_USHORT( p ); + phy_font->chars_offset = offset + ( p - stream->cursor ); + + if ( FT_NEW_ARRAY( phy_font->chars, count ) ) + goto Fail; + + Size = 1 + 1 + 2; + if ( flags & PFR_PHY_2BYTE_CHARCODE ) + Size += 1; + + if ( flags & PFR_PHY_PROPORTIONAL ) + Size += 2; + + if ( flags & PFR_PHY_ASCII_CODE ) + Size += 1; + + if ( flags & PFR_PHY_2BYTE_GPS_SIZE ) + Size += 1; + + if ( flags & PFR_PHY_3BYTE_GPS_OFFSET ) + Size += 1; + + PFR_CHECK( count * Size ); + + for ( n = 0; n < count; n++ ) + { + PFR_Char cur = &phy_font->chars[n]; + + + cur->char_code = ( flags & PFR_PHY_2BYTE_CHARCODE ) + ? PFR_NEXT_USHORT( p ) + : PFR_NEXT_BYTE( p ); + + cur->advance = ( flags & PFR_PHY_PROPORTIONAL ) + ? PFR_NEXT_SHORT( p ) + : (FT_Int) phy_font->standard_advance; + +#if 0 + cur->ascii = ( flags & PFR_PHY_ASCII_CODE ) + ? PFR_NEXT_BYTE( p ) + : 0; +#else + if ( flags & PFR_PHY_ASCII_CODE ) + p += 1; +#endif + cur->gps_size = ( flags & PFR_PHY_2BYTE_GPS_SIZE ) + ? PFR_NEXT_USHORT( p ) + : PFR_NEXT_BYTE( p ); + + cur->gps_offset = ( flags & PFR_PHY_3BYTE_GPS_OFFSET ) + ? PFR_NEXT_ULONG( p ) + : PFR_NEXT_USHORT( p ); + } + } + + /* that's it! */ + + Fail: + FT_FRAME_EXIT(); + + /* save position of bitmap info */ + phy_font->bct_offset = FT_STREAM_POS(); + phy_font->cursor = NULL; + + Exit: + return error; + + Too_Short: + error = PFR_Err_Invalid_Table; + FT_ERROR(( "pfr_phy_font_load: invalid physical font table\n" )); + goto Fail; + } + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/pfr/pfrload.h b/src/WinLibs/freetype-2.3.5/src/pfr/pfrload.h new file mode 100644 index 000000000..ed010715d --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/src/pfr/pfrobjs.c b/src/WinLibs/freetype-2.3.5/src/pfr/pfrobjs.c new file mode 100644 index 000000000..180446d73 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/pfr/pfrobjs.c @@ -0,0 +1,576 @@ +/***************************************************************************/ +/* */ +/* pfrobjs.c */ +/* */ +/* FreeType PFR object methods (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 "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 = 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/src/WinLibs/freetype-2.3.5/src/pfr/pfrobjs.h b/src/WinLibs/freetype-2.3.5/src/pfr/pfrobjs.h new file mode 100644 index 000000000..f6aa8b44c --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/src/pfr/pfrsbit.c b/src/WinLibs/freetype-2.3.5/src/pfr/pfrsbit.c new file mode 100644 index 000000000..45ff6663b --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/pfr/pfrsbit.c @@ -0,0 +1,680 @@ +/***************************************************************************/ +/* */ +/* pfrsbit.c */ +/* */ +/* FreeType PFR bitmap loader (body). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#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, ypos, advance; + FT_UInt xsize, ysize, format; + 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 ); + if ( !error ) + { + glyph->root.format = FT_GLYPH_FORMAT_BITMAP; + + /* Set up glyph bitmap and metrics */ + glyph->root.bitmap.width = (FT_Int)xsize; + glyph->root.bitmap.rows = (FT_Int)ysize; + glyph->root.bitmap.pitch = (FT_Long)( xsize + 7 ) >> 3; + glyph->root.bitmap.pixel_mode = FT_PIXEL_MODE_MONO; + + glyph->root.metrics.width = (FT_Long)xsize << 6; + glyph->root.metrics.height = (FT_Long)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; + + glyph->root.bitmap_left = xpos; + glyph->root.bitmap_top = ypos + ysize; + + /* Allocate and read bitmap data */ + { + FT_ULong len = glyph->root.bitmap.pitch * ysize; + + + error = ft_glyphslot_alloc_bitmap( &glyph->root, len ); + if ( !error ) + { + error = pfr_load_bitmap_bits( + p, + stream->limit, + format, + FT_BOOL(face->header.color_flags & 2), + &glyph->root.bitmap ); + } + } + } + + FT_FRAME_EXIT(); + } + + Exit: + return error; + } + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/pfr/pfrsbit.h b/src/WinLibs/freetype-2.3.5/src/pfr/pfrsbit.h new file mode 100644 index 000000000..015e9e6da --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/src/pfr/pfrtypes.h b/src/WinLibs/freetype-2.3.5/src/pfr/pfrtypes.h new file mode 100644 index 000000000..c0ae04253 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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_UInt32 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_UInt32 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_UInt32 bct_offset; + FT_Byte* cursor; + + } PFR_PhyFontRec, *PFR_PhyFont; + + + typedef enum PFR_PhyFlags_ + { + PFR_PHY_EXTRA_ITEMS = 0x80, + PFR_PHY_3BYTE_GPS_OFFSET = 0x20, + PFR_PHY_2BYTE_GPS_SIZE = 0x10, + PFR_PHY_ASCII_CODE = 0x08, + PFR_PHY_PROPORTIONAL = 0x04, + PFR_PHY_2BYTE_CHARCODE = 0x02, + PFR_PHY_VERTICAL = 0x01 + + } PFR_PhyFlags; + + + typedef enum PFR_KernFlags_ + { + PFR_KERN_2BYTE_CHAR = 0x01, + PFR_KERN_2BYTE_ADJ = 0x02 + + } PFR_KernFlags; + + + /************************************************************************/ + + typedef enum PFR_GlyphFlags_ + { + PFR_GLYPH_IS_COMPOUND = 0x80, + PFR_GLYPH_EXTRA_ITEMS = 0x08, + PFR_GLYPH_1BYTE_XYCOUNT = 0x04, + PFR_GLYPH_XCOUNT = 0x02, + PFR_GLYPH_YCOUNT = 0x01 + + } PFR_GlyphFlags; + + + /* controlled coordinate */ + typedef struct PFR_CoordRec_ + { + FT_UInt org; + FT_UInt cur; + + } PFR_CoordRec, *PFR_Coord; + + + typedef struct PFR_SubGlyphRec_ + { + FT_Fixed x_scale; + FT_Fixed y_scale; + FT_Int x_delta; + FT_Int y_delta; + FT_UInt32 gps_offset; + FT_UInt gps_size; + + } PFR_SubGlyphRec, *PFR_SubGlyph; + + + typedef enum PFR_SubgGlyphFlags_ + { + PFR_SUBGLYPH_3BYTE_OFFSET = 0x80, + PFR_SUBGLYPH_2BYTE_SIZE = 0x40, + PFR_SUBGLYPH_YSCALE = 0x20, + PFR_SUBGLYPH_XSCALE = 0x10 + + } PFR_SubGlyphFlags; + + + typedef struct PFR_GlyphRec_ + { + FT_Byte format; + +#if 0 + FT_UInt num_x_control; + FT_UInt num_y_control; +#endif + FT_UInt max_xy_control; + FT_Pos* x_control; + FT_Pos* y_control; + + + FT_UInt num_subs; + FT_UInt max_subs; + PFR_SubGlyphRec* subs; + + FT_GlyphLoader loader; + FT_Bool path_begun; + + } PFR_GlyphRec, *PFR_Glyph; + + +FT_END_HEADER + +#endif /* __PFRTYPES_H__ */ + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/pfr/rules.mk b/src/WinLibs/freetype-2.3.5/src/pfr/rules.mk new file mode 100644 index 000000000..60b96c741 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/src/psaux/Jamfile b/src/WinLibs/freetype-2.3.5/src/psaux/Jamfile new file mode 100644 index 000000000..faeded904 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/src/psaux/afmparse.c b/src/WinLibs/freetype-2.3.5/src/psaux/afmparse.c new file mode 100644 index 000000000..0528fe6ff --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/psaux/afmparse.c @@ -0,0 +1,960 @@ +/***************************************************************************/ +/* */ +/* afmparse.c */ +/* */ +/* AFM parser (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 <ft2build.h> +#include FT_FREETYPE_H +#include FT_INTERNAL_POSTSCRIPT_AUX_H +#include FT_INTERNAL_DEBUG_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_Int n ) + { + AFM_Stream stream = parser->stream; + char* str; + FT_Int i; + + + if ( n > AFM_MAX_ARGUMENTS ) + return 0; + + for ( i = 0; i < n; i++ ) + { + FT_UInt 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_UInt* 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 ) ? AFM_STREAM_KEY_LEN( stream, key ) + : 0; + + return key; + } + + + static AFM_Token + afm_tokenize( const char* key, + FT_UInt 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_UInt 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 ); + + + return (int)( index1 - index2 ); + } + + + static FT_Error + afm_parse_kern_pairs( AFM_Parser parser ) + { + AFM_FontInfo fi = parser->FontInfo; + AFM_KernPair kp; + char* key; + FT_UInt 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_UInt 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_UInt 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_UInt len; + FT_Int metrics_sets = 0; + + + if ( !fi ) + return PSaux_Err_Invalid_Argument; + + key = afm_parser_next_key( parser, 1, &len ); + if ( !key || len != 16 || + ft_strncmp( key, "StartFontMetrics", 16 ) != 0 ) + return PSaux_Err_Unknown_File_Format; + + while ( ( key = afm_parser_next_key( parser, 1, &len ) ) != 0 ) + { + AFM_ValueRec shared_vals[4]; + + + switch ( afm_tokenize( key, len ) ) + { + case AFM_TOKEN_METRICSSETS: + if ( afm_parser_read_int( parser, &metrics_sets ) ) + goto Fail; + + if ( metrics_sets != 0 && metrics_sets != 2 ) + { + error = PSaux_Err_Unimplemented_Feature; + + goto Fail; + } + break; + + case AFM_TOKEN_ISCIDFONT: + shared_vals[0].type = AFM_VALUE_TYPE_BOOL; + if ( afm_parser_read_vals( parser, shared_vals, 1 ) != 1 ) + goto Fail; + + fi->IsCIDFont = shared_vals[0].u.b; + break; + + case AFM_TOKEN_FONTBBOX: + shared_vals[0].type = AFM_VALUE_TYPE_FIXED; + shared_vals[1].type = AFM_VALUE_TYPE_FIXED; + shared_vals[2].type = AFM_VALUE_TYPE_FIXED; + shared_vals[3].type = AFM_VALUE_TYPE_FIXED; + if ( afm_parser_read_vals( parser, shared_vals, 4 ) != 4 ) + goto Fail; + + fi->FontBBox.xMin = shared_vals[0].u.f; + fi->FontBBox.yMin = shared_vals[1].u.f; + fi->FontBBox.xMax = shared_vals[2].u.f; + fi->FontBBox.yMax = shared_vals[3].u.f; + break; + + case AFM_TOKEN_ASCENDER: + shared_vals[0].type = AFM_VALUE_TYPE_FIXED; + if ( afm_parser_read_vals( parser, shared_vals, 1 ) != 1 ) + goto Fail; + + fi->Ascender = shared_vals[0].u.f; + break; + + case AFM_TOKEN_DESCENDER: + shared_vals[0].type = AFM_VALUE_TYPE_FIXED; + if ( afm_parser_read_vals( parser, shared_vals, 1 ) != 1 ) + goto Fail; + + fi->Descender = shared_vals[0].u.f; + break; + + case AFM_TOKEN_STARTCHARMETRICS: + { + FT_Int n = 0; + + + if ( afm_parser_read_int( parser, &n ) ) + goto Fail; + + error = afm_parser_skip_section( parser, n, + AFM_TOKEN_ENDCHARMETRICS ); + if ( error ) + return error; + } + break; + + case AFM_TOKEN_STARTKERNDATA: + error = afm_parse_kern_data( parser ); + if ( error ) + goto Fail; + /* fall through since we only support kern data */ + + case AFM_TOKEN_ENDFONTMETRICS: + return PSaux_Err_Ok; + + default: + break; + } + } + + Fail: + FT_FREE( fi->TrackKerns ); + fi->NumTrackKern = 0; + + FT_FREE( fi->KernPairs ); + fi->NumKernPair = 0; + + fi->IsCIDFont = 0; + + return error; + } + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/psaux/afmparse.h b/src/WinLibs/freetype-2.3.5/src/psaux/afmparse.h new file mode 100644 index 000000000..c2fce75c8 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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_Int 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_UInt* len ); + +FT_END_HEADER + +#endif /* __AFMPARSE_H__ */ + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/psaux/module.mk b/src/WinLibs/freetype-2.3.5/src/psaux/module.mk new file mode 100644 index 000000000..543152208 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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)psaux_module_class$(CLOSE_DRIVER) +$(ECHO_DRIVER)psaux $(ECHO_DRIVER_DESC)Postscript Type 1 & Type 2 helper module$(ECHO_DRIVER_DONE) +endef + +# EOF diff --git a/src/WinLibs/freetype-2.3.5/src/psaux/psaux.c b/src/WinLibs/freetype-2.3.5/src/psaux/psaux.c new file mode 100644 index 000000000..a4b9c5c6e --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/psaux/psaux.c @@ -0,0 +1,34 @@ +/***************************************************************************/ +/* */ +/* psaux.c */ +/* */ +/* FreeType auxiliary PostScript driver component (body only). */ +/* */ +/* Copyright 1996-2001, 2002, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#define FT_MAKE_OPTION_SINGLE_OBJECT + +#include <ft2build.h> +#include "psobjs.c" +#include "psauxmod.c" +#include "t1decode.c" +#include "t1cmap.c" + +#ifndef T1_CONFIG_OPTION_NO_AFM +#include "afmparse.c" +#endif + +#include "psconv.c" + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/psaux/psauxerr.h b/src/WinLibs/freetype-2.3.5/src/psaux/psauxerr.h new file mode 100644 index 000000000..d0baa3cbb --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/src/psaux/psauxmod.c b/src/WinLibs/freetype-2.3.5/src/psaux/psauxmod.c new file mode 100644 index 000000000..4c3579f7b --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/src/psaux/psauxmod.h b/src/WinLibs/freetype-2.3.5/src/psaux/psauxmod.h new file mode 100644 index 000000000..92ac05604 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/psaux/psauxmod.h @@ -0,0 +1,38 @@ +/***************************************************************************/ +/* */ +/* 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 + + + FT_EXPORT_VAR( const FT_Module_Class ) psaux_driver_class; + + +FT_END_HEADER + +#endif /* __PSAUXMOD_H__ */ + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/psaux/psconv.c b/src/WinLibs/freetype-2.3.5/src/psaux/psconv.c new file mode 100644 index 000000000..3bbeab6d2 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/psaux/psconv.c @@ -0,0 +1,466 @@ +/***************************************************************************/ +/* */ +/* psconv.c */ +/* */ +/* Some convenience conversions (body). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_INTERNAL_POSTSCRIPT_AUX_H +#include FT_INTERNAL_DEBUG_H + +#include "psconv.h" +#include "psobjs.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 ( 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_UInt 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_UInt 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_UInt 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/src/WinLibs/freetype-2.3.5/src/psaux/psconv.h b/src/WinLibs/freetype-2.3.5/src/psaux/psconv.h new file mode 100644 index 000000000..e51124185 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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_UInt n ); +#endif + + FT_LOCAL( FT_UInt ) + PS_Conv_ASCIIHexDecode( FT_Byte** cursor, + FT_Byte* limit, + FT_Byte* buffer, + FT_UInt n ); + + FT_LOCAL( FT_UInt ) + PS_Conv_EexecDecode( FT_Byte** cursor, + FT_Byte* limit, + FT_Byte* buffer, + FT_UInt n, + FT_UShort* seed ); + + +FT_END_HEADER + +#endif /* __PSCONV_H__ */ + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/psaux/psobjs.c b/src/WinLibs/freetype-2.3.5/src/psaux/psobjs.c new file mode 100644 index 000000000..957085668 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/psaux/psobjs.c @@ -0,0 +1,1698 @@ +/***************************************************************************/ +/* */ +/* psobjs.c */ +/* */ +/* Auxiliary functions for PostScript fonts (body). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_INTERNAL_POSTSCRIPT_AUX_H +#include FT_INTERNAL_DEBUG_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; + } + + /* 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 " + "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 " + "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 */ + if ( field->type != T1_FIELD_TYPE_BBOX ) + *(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_Long 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; + } + + if ( size ) + { + builder->scale_x = size->metrics.x_scale; + builder->scale_y = size->metrics.y_scale; + } + + 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; + + + if ( builder->shift ) + { + x >>= 16; + y >>= 16; + } + point->x = x; + point->y = y; + *control = (FT_Byte)( flag ? FT_CURVE_TAG_ON : FT_CURVE_TAG_CUBIC ); + + builder->last = *point; + } + 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; + + + if ( !outline ) + return; + + /* XXXX: We must not include the last point in the path if it */ + /* is located on the first point. */ + if ( outline->n_points > 1 ) + { + FT_Int first = 0; + 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; + + + if ( outline->n_contours > 1 ) + { + first = outline->contours[outline->n_contours - 2] + 1; + p1 = outline->points + first; + } + + /* `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 ) + outline->contours[outline->n_contours - 1] = + (short)( outline->n_points - 1 ); + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** OTHER *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL_DEF( void ) + t1_decrypt( FT_Byte* buffer, + FT_Offset length, + FT_UShort seed ) + { + PS_Conv_EexecDecode( &buffer, + buffer + length, + buffer, + length, + &seed ); + } + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/psaux/psobjs.h b/src/WinLibs/freetype-2.3.5/src/psaux/psobjs.h new file mode 100644 index 000000000..c2cbf2c79 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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_Long max_bytes, + FT_Long* pnum_bytes, + FT_Bool delimiters ); + + + FT_LOCAL( FT_Fixed ) + ps_parser_to_fixed( PS_Parser parser, + FT_Int power_ten ); + + + FT_LOCAL( FT_Int ) + ps_parser_to_coord_array( PS_Parser parser, + FT_Int max_coords, + FT_Short* coords ); + + FT_LOCAL( FT_Int ) + ps_parser_to_fixed_array( PS_Parser parser, + FT_Int max_values, + FT_Fixed* values, + FT_Int power_ten ); + + + FT_LOCAL( void ) + ps_parser_init( PS_Parser parser, + FT_Byte* base, + FT_Byte* limit, + FT_Memory memory ); + + FT_LOCAL( void ) + ps_parser_done( PS_Parser parser ); + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** T1 BUILDER *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL( void ) + t1_builder_init( T1_Builder builder, + FT_Face face, + FT_Size size, + FT_GlyphSlot glyph, + FT_Bool hinting ); + + FT_LOCAL( void ) + t1_builder_done( T1_Builder builder ); + + FT_LOCAL( FT_Error ) + t1_builder_check_points( T1_Builder builder, + FT_Int count ); + + FT_LOCAL( void ) + t1_builder_add_point( T1_Builder builder, + FT_Pos x, + FT_Pos y, + FT_Byte flag ); + + FT_LOCAL( FT_Error ) + t1_builder_add_point1( T1_Builder builder, + FT_Pos x, + FT_Pos y ); + + FT_LOCAL( FT_Error ) + t1_builder_add_contour( T1_Builder builder ); + + + FT_LOCAL( FT_Error ) + t1_builder_start_point( T1_Builder builder, + FT_Pos x, + FT_Pos y ); + + + FT_LOCAL( void ) + t1_builder_close_contour( T1_Builder builder ); + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** OTHER *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL( void ) + t1_decrypt( FT_Byte* buffer, + FT_Offset length, + FT_UShort seed ); + + +FT_END_HEADER + +#endif /* __PSOBJS_H__ */ + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/psaux/rules.mk b/src/WinLibs/freetype-2.3.5/src/psaux/rules.mk new file mode 100644 index 000000000..7a1be37b6 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/src/psaux/t1cmap.c b/src/WinLibs/freetype-2.3.5/src/psaux/t1cmap.c new file mode 100644 index 000000000..293468696 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/psaux/t1cmap.c @@ -0,0 +1,333 @@ +/***************************************************************************/ +/* */ +/* t1cmap.c */ +/* */ +/* Type 1 character map support (body). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#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_UInt ) + 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 + }; + + + 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 + }; + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** 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 + 1 ); + 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_UInt ) + 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 + }; + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** 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_UInt ) + 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 + }; + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/psaux/t1cmap.h b/src/WinLibs/freetype-2.3.5/src/psaux/t1cmap.h new file mode 100644 index 000000000..7ae65d2fa --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/src/psaux/t1decode.c b/src/WinLibs/freetype-2.3.5/src/psaux/t1decode.c new file mode 100644 index 000000000..f790643f9 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/psaux/t1decode.c @@ -0,0 +1,1474 @@ +/***************************************************************************/ +/* */ +/* t1decode.c */ +/* */ +/* PostScript Type 1 decoding routines (body). */ +/* */ +/* Copyright 2000-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. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.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; + + + /* 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? */ + if ( decoder->glyph_names == 0 ) + { + FT_ERROR(( "t1operator_seac:" )); + FT_ERROR(( " glyph names table not available in this font!\n" )); + return PSaux_Err_Syntax_Error; + } + + 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:" )); + FT_ERROR(( " 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)( adx - asb ); + subg->arg2 = (FT_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 */ + + error = t1_decoder_parse_glyph( decoder, bchar_index ); + 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 */ + error = t1_decoder_parse_glyph( decoder, achar_index ); + 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; + + T1_Hints_Funcs hinter; + + + /* 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 + + /* 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 ) + memset( &decoder->buildchar[0], + 0, + sizeof( decoder->buildchar[0] ) * + decoder->len_buildchar ); + + FT_TRACE4(( "\nStart 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 ); + + /* now, execute loop */ + while ( ip < limit ) + { + FT_Long* top = decoder->top; + T1_Operator op = op_none; + FT_Long value = 0; + + + FT_ASSERT( known_othersubr_result_cnt == 0 || + unknown_othersubr_result_cnt == 0 ); + + FT_TRACE5(( " (%d)", decoder->top - decoder->stack )); + + /*********************************************************************/ + /* */ + /* 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; + break; + + default: + if ( ip[-1] >= 32 ) + { + if ( ip[-1] < 247 ) + value = (FT_Long)ip[-1] - 139; + else + { + if ( ++ip > limit ) + { + FT_ERROR(( "t1_decoder_parse_charstrings: " )); + FT_ERROR(( "unexpected EOF in integer\n" )); + goto Syntax_Error; + } + + if ( ip[-2] < 251 ) + value = ( ( (FT_Long)ip[-2] - 247 ) << 8 ) + ip[-1] + 108; + else + value = -( ( ( (FT_Long)ip[-2] - 251 ) << 8 ) + ip[-1] + 108 ); + } + } + 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; + } + } + + /*********************************************************************/ + /* */ + /* 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; + } + + FT_TRACE4(( " %ld", value )); + + *top++ = value; + decoder->top = top; + } + else if ( op == op_callothersubr ) /* callothersubr */ + { + FT_Int subr_no; + FT_Int arg_cnt; + + + FT_TRACE4(( " callothersubr" )); + + if ( top - decoder->stack < 2 ) + goto Stack_Underflow; + + top -= 2; + + subr_no = (FT_Int)top[1]; + arg_cnt = (FT_Int)top[0]; + + /***********************************************************/ + /* */ + /* remove all operands to callothersubr from the stack */ + /* */ + /* for handled othersubrs, where we know the number of */ + /* arguments, we increase the stack by the value of */ + /* known_othersubr_result_cnt */ + /* */ + /* for unhandled othersubrs the following pops adjust the */ + /* stack pointer as necessary */ + + if ( arg_cnt > top - decoder->stack ) + goto Stack_Underflow; + + top -= arg_cnt; + + known_othersubr_result_cnt = 0; + unknown_othersubr_result_cnt = 0; + + /* XXX TODO: The checks to `arg_count == <whatever>' */ + /* might not be correct; an othersubr expects a certain */ + /* number of operands on the PostScript stack (as opposed */ + /* to the T1 stack) but it doesn't have to put them there */ + /* by itself; previous othersubrs might have left the */ + /* operands there if they were not followed by an */ + /* appropriate number of pops */ + /* */ + /* On the other hand, Adobe Reader 7.0.8 for Linux doesn't */ + /* accept a font that contains charstrings like */ + /* */ + /* 100 200 2 20 callothersubr */ + /* 300 1 20 callothersubr pop */ + /* */ + /* Perhaps this is the reason why BuildCharArray exists. */ + + switch ( subr_no ) + { + case 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: " )); + FT_ERROR(( "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: " )); + FT_ERROR(( "incorrect number of mm 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; + } + +#ifdef CAN_HANDLE_NON_INTEGRAL_T1_OPERANDS + + /* We cannot yet enable these since currently */ + /* our T1 stack stores integers which lack the */ + /* precision to express the values */ + + 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 = top[0]; + + if ( idx < 0 || + idx + blend->num_designs > decoder->face->len_buildchar ) + goto Unexpected_OtherSubr; + + 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] *= top[1]; /* XXX (over|under)flow */ + + 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] /= top[1]; /* XXX (over|under)flow */ + + known_othersubr_result_cnt = 1; + break; + +#endif /* CAN_HANDLE_NON_INTEGRAL_T1_OPERANDS */ + + 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 = top[1]; + + if ( idx < 0 || (FT_UInt) idx >= decoder->len_buildchar ) + goto Unexpected_OtherSubr; + + decoder->buildchar[idx] = top[0]; + } + break; + + case 25: + /* <idx> 1 25 callothersubr pop */ + /* => push BuildCharArray[cvi( idx )] */ + /* onto T1 stack */ + { + FT_Int idx; + PS_Blend blend = decoder->blend; + + if ( arg_cnt != 1 || blend == NULL ) + goto Unexpected_OtherSubr; + + idx = top[0]; + + if ( idx < 0 || (FT_UInt) idx >= decoder->len_buildchar ) + goto Unexpected_OtherSubr; + + top[0] = decoder->buildchar[idx]; + } + + known_othersubr_result_cnt = 1; + break; + +#if 0 + case 26: + /* <val> mark <idx> ==> set BuildCharArray[cvi( <idx> )] = <val>, */ + /* leave mark on T1 stack */ + /* <val> <idx> ==> set BuildCharArray[cvi( <idx> )] = <val> */ + XXX who has left his 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; + +#ifdef CAN_HANDLE_NON_INTEGRAL_T1_OPERANDS + case 28: + /* 0 28 callothersubr pop */ + /* => push random value from interval [0, 1) onto stack */ + if ( arg_cnt != 0 ) + goto Unexpected_OtherSubr; + + top[0] = FT_rand(); + known_othersubr_result_cnt = 1; + break; +#endif + + 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" )); + + 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 ); + + FT_TRACE4(( "\n" )); + + /* 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 = builder->last.x = x = builder->pos_x + top[0]; + orig_y = builder->last.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 immediately after the processing */ + return t1operator_seac( decoder, top[0], top[1], top[2], + (FT_Int)top[3], (FT_Int)top[4] ); + + case op_sbw: + FT_TRACE4(( " sbw" )); + + builder->parse_state = T1_Parse_Have_Width; + + builder->left_bearing.x += top[0]; + builder->left_bearing.y += top[1]; + builder->advance.x = top[2]; + builder->advance.y = top[3]; + + builder->last.x = x = builder->pos_x + top[0]; + builder->last.y = 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" )); + + close_contour( builder ); + if ( !( builder->parse_state == T1_Parse_Have_Path || + builder->parse_state == T1_Parse_Have_Moveto ) ) + goto Syntax_Error; + 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(( " rcurveto" )); + + 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 ( top[1] ) + { + *top = top[0] / top[1]; + ++top; + } + else + { + FT_ERROR(( "t1_decoder_parse_charstrings: division by 0\n" )); + goto Syntax_Error; + } + break; + + case op_callsubr: + { + FT_Int idx; + + + FT_TRACE4(( " callsubr" )); + + idx = (FT_Int)top[0]; + if ( idx < 0 || idx >= (FT_Int)decoder->num_subrs ) + { + FT_ERROR(( "t1_decoder_parse_charstrings: " + "invalid subrs index\n" )); + goto Syntax_Error; + } + + if ( zone - decoder->zones >= T1_MAX_SUBRS_CALLS ) + { + FT_ERROR(( "t1_decoder_parse_charstrings: " + "too many nested subrs\n" )); + goto Syntax_Error; + } + + zone->cursor = ip; /* save current instruction pointer */ + + zone++; + + /* The Type 1 driver stores subroutines without the seed bytes. */ + /* The CID driver stores subroutines with seed bytes. This */ + /* case is taken care of when decoder->subrs_len == 0. */ + zone->base = decoder->subrs[idx]; + + if ( decoder->subrs_len ) + zone->limit = zone->base + decoder->subrs_len[idx]; + else + { + /* We are using subroutines from a CID font. We must adjust */ + /* for the seed bytes. */ + zone->base += ( decoder->lenIV >= 0 ? decoder->lenIV : 0 ); + zone->limit = decoder->subrs[idx + 1]; + } + + zone->cursor = zone->base; + + if ( !zone->base ) + { + FT_ERROR(( "t1_decoder_parse_charstrings: " + "invoking empty subrs!\n" )); + goto Syntax_Error; + } + + decoder->zone = zone; + ip = zone->base; + limit = zone->limit; + break; + } + + case op_pop: + FT_TRACE4(( " pop" )); + + if ( known_othersubr_result_cnt > 0 ) + { + known_othersubr_result_cnt--; + /* ignore, we pushed the operands ourselves */ + break; + } + + if ( unknown_othersubr_result_cnt == 0 ) + { + FT_ERROR(( "t1_decoder_parse_charstrings: " + "no more operands for othersubr!\n" )); + goto Syntax_Error; + } + + unknown_othersubr_result_cnt--; + top++; /* `push' the operand to callothersubr onto the stack */ + break; + + case op_return: + FT_TRACE4(( " return" )); + + if ( zone <= decoder->zones ) + { + FT_ERROR(( "t1_decoder_parse_charstrings: unexpected return\n" )); + goto Syntax_Error; + } + + zone--; + ip = zone->cursor; + limit = zone->limit; + decoder->zone = zone; + break; + + case op_dotsection: + FT_TRACE4(( " dotsection" )); + + break; + + case op_hstem: + FT_TRACE4(( " hstem" )); + + /* record horizontal hint */ + if ( hinter ) + { + /* top[0] += builder->left_bearing.y; */ + hinter->stem( hinter->hints, 1, top ); + } + + break; + + case op_hstem3: + FT_TRACE4(( " hstem3" )); + + /* record horizontal counter-controlled hints */ + if ( hinter ) + hinter->stem3( hinter->hints, 1, top ); + + break; + + case op_vstem: + FT_TRACE4(( " vstem" )); + + /* record vertical hint */ + if ( hinter ) + { + top[0] += orig_x; + hinter->stem( hinter->hints, 0, top ); + } + + break; + + case op_vstem3: + FT_TRACE4(( " vstem3" )); + + /* record vertical counter-controlled hints */ + if ( hinter ) + { + FT_Pos dx = orig_x; + + + top[0] += dx; + top[2] += dx; + top[4] += dx; + hinter->stem3( hinter->hints, 0, top ); + } + break; + + case op_setcurrentpoint: + FT_TRACE4(( " setcurrentpoint" )); + + /* From the T1 specs, 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 */ + if ( decoder->flex_state != 1 ) + { + FT_ERROR(( "t1_decoder_parse_charstrings: " )); + FT_ERROR(( "unexpected `setcurrentpoint'\n" )); + + goto Syntax_Error; + } + else + 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; + + } /* 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: " )); + FT_ERROR(( "the `psnames' module is not available\n" )); + return PSaux_Err_Unimplemented_Feature; + } + + decoder->psnames = psnames; + } + + t1_builder_init( &decoder->builder, face, size, slot, hinting ); + + /* decoder->buildchar and decoder->len_buildchar have to be */ + /* initialized by the caller since we cannot know the length */ + /* of the BuildCharArray */ + + decoder->num_glyphs = (FT_UInt)face->num_glyphs; + decoder->glyph_names = glyph_names; + decoder->hint_mode = hint_mode; + decoder->blend = blend; + decoder->parse_callback = parse_callback; + + decoder->funcs = t1_decoder_funcs; + + return PSaux_Err_Ok; + } + + + /* finalize T1 decoder */ + FT_LOCAL_DEF( void ) + t1_decoder_done( T1_Decoder decoder ) + { + t1_builder_done( &decoder->builder ); + } + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/psaux/t1decode.h b/src/WinLibs/freetype-2.3.5/src/psaux/t1decode.h new file mode 100644 index 000000000..00728db50 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/src/pshinter/Jamfile b/src/WinLibs/freetype-2.3.5/src/pshinter/Jamfile new file mode 100644 index 000000000..769dcc4b2 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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 ; + } + else + { + _sources = pshinter ; + } + + Library $(FT2_LIB) : $(_sources).c ; +} + +# end of src/pshinter Jamfile diff --git a/src/WinLibs/freetype-2.3.5/src/pshinter/module.mk b/src/WinLibs/freetype-2.3.5/src/pshinter/module.mk new file mode 100644 index 000000000..cd171d035 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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)pshinter_module_class$(CLOSE_DRIVER) +$(ECHO_DRIVER)pshinter $(ECHO_DRIVER_DESC)Postscript hinter module$(ECHO_DRIVER_DONE) +endef + +# EOF diff --git a/src/WinLibs/freetype-2.3.5/src/pshinter/pshalgo.c b/src/WinLibs/freetype-2.3.5/src/pshinter/pshalgo.c new file mode 100644 index 000000000..505d95c57 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/pshinter/pshalgo.c @@ -0,0 +1,2291 @@ +/***************************************************************************/ +/* */ +/* pshalgo.c */ +/* */ +/* PostScript hinting algorithm (body). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#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_ERROR(( "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_ERROR(( "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_ERROR(( "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_ERROR(( "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_ERROR(( "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 <stdio.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 scaled; + FT_Fixed fitted; + + + scaled = FT_MulFix( globals->blues.normal_top.zones->org_ref, y_scale ); + fitted = FT_PIX_ROUND( scaled ); + + if ( fitted != 0 && scaled != fitted ) + { + 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 ); + } + + Exit: + +#ifndef DEBUG_HINTER + psh_glyph_done( glyph ); +#endif + + return error; + } + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/pshinter/pshalgo.h b/src/WinLibs/freetype-2.3.5/src/pshinter/pshalgo.h new file mode 100644 index 000000000..f68de7120 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/pshinter/pshalgo.h @@ -0,0 +1,255 @@ +/***************************************************************************/ +/* */ +/* pshalgo.h */ +/* */ +/* PostScript hinting algorithm (specification). */ +/* */ +/* 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 __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_GHOST = PS_HINT_FLAG_GHOST, + PSH_HINT_BOTTOM = PS_HINT_FLAG_BOTTOM, + PSH_HINT_ACTIVE = 4, + PSH_HINT_FITTED = 8 + + } PSH_Hint_Flags; + + +#define psh_hint_is_active( x ) ( ( (x)->flags & PSH_HINT_ACTIVE ) != 0 ) +#define psh_hint_is_ghost( x ) ( ( (x)->flags & PSH_HINT_GHOST ) != 0 ) +#define psh_hint_is_fitted( x ) ( ( (x)->flags & PSH_HINT_FITTED ) != 0 ) + +#define psh_hint_activate( x ) (x)->flags |= PSH_HINT_ACTIVE +#define psh_hint_deactivate( x ) (x)->flags &= ~PSH_HINT_ACTIVE +#define psh_hint_set_fitted( x ) (x)->flags |= PSH_HINT_FITTED + + /* hint structure */ + typedef struct PSH_HintRec_ + { + FT_Int org_pos; + FT_Int org_len; + FT_Pos cur_pos; + FT_Pos cur_len; + FT_UInt flags; + PSH_Hint parent; + FT_Int order; + + } PSH_HintRec; + + + /* this is an interpolation zone used for strong points; */ + /* weak points are interpolated according to their strong */ + /* neighbours */ + typedef struct PSH_ZoneRec_ + { + FT_Fixed scale; + FT_Fixed delta; + FT_Pos min; + FT_Pos max; + + } PSH_ZoneRec, *PSH_Zone; + + + typedef struct PSH_Hint_TableRec_ + { + FT_UInt max_hints; + FT_UInt num_hints; + PSH_Hint hints; + PSH_Hint* sort; + PSH_Hint* sort_global; + FT_UInt num_zones; + PSH_ZoneRec* zones; + PSH_Zone zone; + PS_Mask_Table hint_masks; + PS_Mask_Table counter_masks; + + } PSH_Hint_TableRec, *PSH_Hint_Table; + + + typedef struct PSH_PointRec_* PSH_Point; + typedef struct PSH_ContourRec_* PSH_Contour; + + enum + { + PSH_DIR_NONE = 4, + PSH_DIR_UP = -1, + PSH_DIR_DOWN = 1, + PSH_DIR_LEFT = -2, + PSH_DIR_RIGHT = 2 + }; + +#define PSH_DIR_HORIZONTAL 2 +#define PSH_DIR_VERTICAL 1 + +#define PSH_DIR_COMPARE( d1, d2 ) ( (d1) == (d2) || (d1) == -(d2) ) +#define PSH_DIR_IS_HORIZONTAL( d ) PSH_DIR_COMPARE( d, PSH_DIR_HORIZONTAL ) +#define PSH_DIR_IS_VERTICAL( d ) PSH_DIR_COMPARE( d, PSH_DIR_VERTICAL ) + + + /* the following bit-flags are computed once by the glyph */ + /* analyzer, for both dimensions */ + enum + { + PSH_POINT_OFF = 1, /* point is off the curve */ + PSH_POINT_SMOOTH = 2, /* point is smooth */ + PSH_POINT_INFLEX = 4 /* point is inflection */ + }; + +#define psh_point_is_smooth( p ) ( (p)->flags & PSH_POINT_SMOOTH ) +#define psh_point_is_off( p ) ( (p)->flags & PSH_POINT_OFF ) +#define psh_point_is_inflex( p ) ( (p)->flags & PSH_POINT_INFLEX ) + +#define psh_point_set_smooth( p ) (p)->flags |= PSH_POINT_SMOOTH +#define psh_point_set_off( p ) (p)->flags |= PSH_POINT_OFF +#define psh_point_set_inflex( p ) (p)->flags |= PSH_POINT_INFLEX + + /* the following bit-flags are re-computed for each dimension */ + enum + { + PSH_POINT_STRONG = 16, /* point is strong */ + PSH_POINT_FITTED = 32, /* point is already fitted */ + PSH_POINT_EXTREMUM = 64, /* point is local extremum */ + PSH_POINT_POSITIVE = 128, /* extremum has positive contour flow */ + PSH_POINT_NEGATIVE = 256, /* extremum has negative contour flow */ + PSH_POINT_EDGE_MIN = 512, /* point is aligned to left/bottom stem edge */ + PSH_POINT_EDGE_MAX = 1024 /* point is aligned to top/right stem edge */ + }; + +#define psh_point_is_strong( p ) ( (p)->flags2 & PSH_POINT_STRONG ) +#define psh_point_is_fitted( p ) ( (p)->flags2 & PSH_POINT_FITTED ) +#define psh_point_is_extremum( p ) ( (p)->flags2 & PSH_POINT_EXTREMUM ) +#define psh_point_is_positive( p ) ( (p)->flags2 & PSH_POINT_POSITIVE ) +#define psh_point_is_negative( p ) ( (p)->flags2 & PSH_POINT_NEGATIVE ) +#define psh_point_is_edge_min( p ) ( (p)->flags2 & PSH_POINT_EDGE_MIN ) +#define psh_point_is_edge_max( p ) ( (p)->flags2 & PSH_POINT_EDGE_MAX ) + +#define psh_point_set_strong( p ) (p)->flags2 |= PSH_POINT_STRONG +#define psh_point_set_fitted( p ) (p)->flags2 |= PSH_POINT_FITTED +#define psh_point_set_extremum( p ) (p)->flags2 |= PSH_POINT_EXTREMUM +#define psh_point_set_positive( p ) (p)->flags2 |= PSH_POINT_POSITIVE +#define psh_point_set_negative( p ) (p)->flags2 |= PSH_POINT_NEGATIVE +#define psh_point_set_edge_min( p ) (p)->flags2 |= PSH_POINT_EDGE_MIN +#define psh_point_set_edge_max( p ) (p)->flags2 |= PSH_POINT_EDGE_MAX + + + typedef struct PSH_PointRec_ + { + PSH_Point prev; + PSH_Point next; + PSH_Contour contour; + FT_UInt flags; + FT_UInt flags2; + FT_Char dir_in; + FT_Char dir_out; + FT_Angle angle_in; + FT_Angle angle_out; + PSH_Hint hint; + FT_Pos org_u; + FT_Pos org_v; + FT_Pos cur_u; +#ifdef DEBUG_HINTER + FT_Pos org_x; + FT_Pos cur_x; + FT_Pos org_y; + FT_Pos cur_y; + FT_UInt flags_x; + FT_UInt flags_y; +#endif + + } PSH_PointRec; + + +#define PSH_POINT_EQUAL_ORG( a, b ) ( (a)->org_u == (b)->org_u && \ + (a)->org_v == (b)->org_v ) + +#define PSH_POINT_ANGLE( a, b ) FT_Atan2( (b)->org_u - (a)->org_u, \ + (b)->org_v - (a)->org_v ) + + typedef struct PSH_ContourRec_ + { + PSH_Point start; + FT_UInt count; + + } PSH_ContourRec; + + + typedef struct PSH_GlyphRec_ + { + FT_UInt num_points; + FT_UInt num_contours; + + PSH_Point points; + PSH_Contour contours; + + FT_Memory memory; + FT_Outline* outline; + PSH_Globals globals; + PSH_Hint_TableRec hint_tables[2]; + + FT_Bool vertical; + FT_Int major_dir; + FT_Int minor_dir; + + FT_Bool do_horz_hints; + FT_Bool do_vert_hints; + FT_Bool do_horz_snapping; + FT_Bool do_vert_snapping; + FT_Bool do_stem_adjust; + + } PSH_GlyphRec, *PSH_Glyph; + + +#ifdef DEBUG_HINTER + extern PSH_Hint_Table ps_debug_hint_table; + + typedef void + (*PSH_HintFunc)( PSH_Hint hint, + FT_Bool vertical ); + + extern PSH_HintFunc ps_debug_hint_func; + + extern PSH_Glyph ps_debug_glyph; +#endif + + + extern FT_Error + ps_hints_apply( PS_Hints ps_hints, + FT_Outline* outline, + PSH_Globals globals, + FT_Render_Mode hint_mode ); + + +FT_END_HEADER + + +#endif /* __PSHALGO_H__ */ + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/pshinter/pshglob.c b/src/WinLibs/freetype-2.3.5/src/pshinter/pshglob.c new file mode 100644 index 000000000..8a69aa1e8 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/src/pshinter/pshglob.h b/src/WinLibs/freetype-2.3.5/src/pshinter/pshglob.h new file mode 100644 index 000000000..c51162615 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/src/pshinter/pshinter.c b/src/WinLibs/freetype-2.3.5/src/pshinter/pshinter.c new file mode 100644 index 000000000..8e3f19309 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/pshinter/pshinter.c @@ -0,0 +1,28 @@ +/***************************************************************************/ +/* */ +/* pshinter.c */ +/* */ +/* FreeType PostScript Hinting module */ +/* */ +/* Copyright 2001, 2003 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#define FT_MAKE_OPTION_SINGLE_OBJECT + +#include <ft2build.h> +#include "pshrec.c" +#include "pshglob.c" +#include "pshalgo.c" +#include "pshmod.c" + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/pshinter/pshmod.c b/src/WinLibs/freetype-2.3.5/src/pshinter/pshmod.c new file mode 100644 index 000000000..4eb3d9127 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/pshinter/pshmod.c @@ -0,0 +1,121 @@ +/***************************************************************************/ +/* */ +/* 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" + + + /* 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; + } + + + static + const PSHinter_Interface pshinter_interface = + { + pshinter_get_globals_funcs, + pshinter_get_t1_funcs, + pshinter_get_t2_funcs + }; + + + FT_CALLBACK_TABLE_DEF + const FT_Module_Class pshinter_module_class = + { + 0, + sizeof ( PS_Hinter_ModuleRec ), + "pshinter", + 0x10000L, + 0x20000L, + + &pshinter_interface, /* module-specific interface */ + + (FT_Module_Constructor)ps_hinter_init, + (FT_Module_Destructor) ps_hinter_done, + (FT_Module_Requester) 0 /* no additional interface for now */ + }; + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/pshinter/pshmod.h b/src/WinLibs/freetype-2.3.5/src/pshinter/pshmod.h new file mode 100644 index 000000000..1a91025b2 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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_EXPORT_VAR( const FT_Module_Class ) pshinter_module_class; + + +FT_END_HEADER + + +#endif /* __PSHMOD_H__ */ + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/pshinter/pshnterr.h b/src/WinLibs/freetype-2.3.5/src/pshinter/pshnterr.h new file mode 100644 index 000000000..3c0029fbf --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/src/pshinter/pshrec.c b/src/WinLibs/freetype-2.3.5/src/pshinter/pshrec.c new file mode 100644 index 000000000..2a885ef27 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/pshinter/pshrec.c @@ -0,0 +1,1215 @@ +/***************************************************************************/ +/* */ +/* pshrec.c */ +/* */ +/* FreeType PostScript hints recorder (body). */ +/* */ +/* Copyright 2001, 2002, 2003, 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 <ft2build.h> +#include FT_FREETYPE_H +#include FT_INTERNAL_OBJECTS_H +#include FT_INTERNAL_DEBUG_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 = 0; + + + 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 = 0; + 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 = 0; + + + 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 = 0; + 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 = 0; + + + 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 = 0; + 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 = 0; + 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 = 0; + 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 = 0; + + + /* 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_ERROR(( "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 = 0; + + + 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 = 0; + + + /* 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 = 0; + + + /* 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 = 0; + 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 = 0; + 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 = 0; + 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 0; + } + + + /* 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 = 0; + 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_ERROR(( "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_ERROR(( "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_ERROR(( "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_Long* stems ) + { + FT_Error error = 0; + + + 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_ERROR(( "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)stems[0], (FT_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 = 0; + + + 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_ERROR(( "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_ERROR(( "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_Long* coords ) + { + ps_hints_stem( (PS_Hints)hints, dimension, 1, coords ); + } + + + 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] = ( y + 0x8000L ) >> 16; + } + + /* compute lengths */ + for ( n = 0; n < count * 2; n += 2 ) + stems[n + 1] = stems[n + 1] - stems[n]; + + /* add them to the current dimension */ + ps_hints_stem( (PS_Hints)hints, dimension, count, stems ); + + total -= count; + } + } + + + FT_LOCAL_DEF( void ) + t2_hints_funcs_init( T2_Hints_FuncsRec* funcs ) + { + FT_MEM_ZERO( funcs, sizeof ( *funcs ) ); + + funcs->open = (T2_Hints_OpenFunc) t2_hints_open; + funcs->close = (T2_Hints_CloseFunc) ps_hints_close; + funcs->stems = (T2_Hints_StemsFunc) t2_hints_stems; + funcs->hintmask= (T2_Hints_MaskFunc) ps_hints_t2mask; + funcs->counter = (T2_Hints_CounterFunc)ps_hints_t2counter; + funcs->apply = (T2_Hints_ApplyFunc) ps_hints_apply; + } + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/pshinter/pshrec.h b/src/WinLibs/freetype-2.3.5/src/pshinter/pshrec.h new file mode 100644 index 000000000..f7ef9004e --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/pshinter/pshrec.h @@ -0,0 +1,176 @@ +/***************************************************************************/ +/* */ +/* pshrec.h */ +/* */ +/* Postscript (Type1/Type2) hints recorder (specification). */ +/* */ +/* Copyright 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. */ +/* */ +/***************************************************************************/ + + + /**************************************************************************/ + /* */ + /* 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_1 = 1, + PS_HINT_TYPE_2 = 2 + + } PS_Hint_Type; + + + /* hint flags */ + typedef enum + { + PS_HINT_FLAG_GHOST = 1, + PS_HINT_FLAG_BOTTOM = 2 + + } PS_Hint_Flags; + + + /* hint descriptor */ + typedef struct PS_HintRec_ + { + FT_Int pos; + FT_Int len; + FT_UInt flags; + + } PS_HintRec; + + +#define ps_hint_is_active( x ) ( (x)->flags & PS_HINT_FLAG_ACTIVE ) +#define ps_hint_is_ghost( x ) ( (x)->flags & PS_HINT_FLAG_GHOST ) +#define ps_hint_is_bottom( x ) ( (x)->flags & PS_HINT_FLAG_BOTTOM ) + + + /* hints table descriptor */ + typedef struct PS_Hint_TableRec_ + { + FT_UInt num_hints; + FT_UInt max_hints; + PS_Hint hints; + + } PS_Hint_TableRec, *PS_Hint_Table; + + + /* hint and counter mask descriptor */ + typedef struct PS_MaskRec_ + { + FT_UInt num_bits; + FT_UInt max_bits; + FT_Byte* bytes; + FT_UInt end_point; + + } PS_MaskRec, *PS_Mask; + + + /* masks and counters table descriptor */ + typedef struct PS_Mask_TableRec_ + { + FT_UInt num_masks; + FT_UInt max_masks; + PS_Mask masks; + + } PS_Mask_TableRec, *PS_Mask_Table; + + + /* dimension-specific hints descriptor */ + typedef struct PS_DimensionRec_ + { + PS_Hint_TableRec hints; + PS_Mask_TableRec masks; + PS_Mask_TableRec counters; + + } PS_DimensionRec, *PS_Dimension; + + + /* glyph hints descriptor */ + /* dimension 0 => X coordinates + vertical hints/stems */ + /* dimension 1 => Y coordinates + horizontal hints/stems */ + typedef struct PS_HintsRec_ + { + FT_Memory memory; + FT_Error error; + FT_UInt32 magic; + PS_Hint_Type hint_type; + PS_DimensionRec dimension[2]; + + } PS_HintsRec, *PS_Hints; + + /* */ + + /* initialize hints recorder */ + FT_LOCAL( FT_Error ) + ps_hints_init( PS_Hints hints, + FT_Memory memory ); + + /* finalize hints recorder */ + FT_LOCAL( void ) + ps_hints_done( PS_Hints hints ); + + /* initialize Type1 hints recorder interface */ + FT_LOCAL( void ) + t1_hints_funcs_init( T1_Hints_FuncsRec* funcs ); + + /* initialize Type2 hints recorder interface */ + FT_LOCAL( void ) + t2_hints_funcs_init( T2_Hints_FuncsRec* funcs ); + + +#ifdef DEBUG_HINTER + extern PS_Hints ps_debug_hints; + extern int ps_debug_no_horz_hints; + extern int ps_debug_no_vert_hints; +#endif + + /* */ + + +FT_END_HEADER + + +#endif /* __PS_HINTER_RECORD_H__ */ + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/pshinter/rules.mk b/src/WinLibs/freetype-2.3.5/src/pshinter/rules.mk new file mode 100644 index 000000000..57773394a --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/src/psnames/Jamfile b/src/WinLibs/freetype-2.3.5/src/psnames/Jamfile new file mode 100644 index 000000000..d85c1e97d --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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 ; + } + else + { + _sources = psnames ; + } + + Library $(FT2_LIB) : $(_sources).c ; +} + +# end of src/psnames Jamfile diff --git a/src/WinLibs/freetype-2.3.5/src/psnames/module.mk b/src/WinLibs/freetype-2.3.5/src/psnames/module.mk new file mode 100644 index 000000000..a93063b92 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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)psnames_module_class$(CLOSE_DRIVER) +$(ECHO_DRIVER)psnames $(ECHO_DRIVER_DESC)Postscript & Unicode Glyph name handling$(ECHO_DRIVER_DONE) +endef + +# EOF diff --git a/src/WinLibs/freetype-2.3.5/src/psnames/psmodule.c b/src/WinLibs/freetype-2.3.5/src/psnames/psmodule.c new file mode 100644 index 000000000..8d8c476a1 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/psnames/psmodule.c @@ -0,0 +1,458 @@ +/***************************************************************************/ +/* */ +/* psmodule.c */ +/* */ +/* PSNames module implementation (body). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 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_OBJECTS_H +#include FT_SERVICE_POSTSCRIPT_CMAPS_H + +#include "psmodule.h" +#include "pstables.h" + +#include "psnamerr.h" + + +#ifndef FT_CONFIG_OPTION_NO_POSTSCRIPT_NAMES + + +#ifdef FT_CONFIG_OPTION_ADOBE_GLYPH_LIST + + +#define VARIANT_BIT 0x80000000UL +#define BASE_GLYPH( code ) ( (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_ULong 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 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_ULong 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 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_get_adobe_glyph_index( glyph_name, p ); + else + return 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 ) + return map1->unicode - map2->unicode; + else + return unicode1 - unicode2; + } + + + /* 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; + + + /* we first allocate the table */ + table->num_maps = 0; + table->maps = 0; + + if ( !FT_NEW_ARRAY( table->maps, num_glyphs ) ) + { + 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 ) + { + uni_char = ps_unicode_value( gname ); + + if ( BASE_GLYPH( uni_char ) != 0 ) + { + map->unicode = uni_char; + map->glyph_index = n; + map++; + } + + if ( free_glyph_name ) + free_glyph_name( glyph_data, gname ); + } + } + + /* 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_ULong + 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]; + } + + + static + const FT_Service_PsCMapsRec pscmaps_interface = + { +#ifdef FT_CONFIG_OPTION_ADOBE_GLYPH_LIST + + (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, + +#else + + 0, + 0, + 0, + 0, + +#endif /* FT_CONFIG_OPTION_ADOBE_GLYPH_LIST */ + + (PS_Macintosh_NameFunc) ps_get_macintosh_name, + (PS_Adobe_Std_StringsFunc) ps_get_standard_strings, + + t1_standard_encoding, + t1_expert_encoding + }; + + + static const FT_ServiceDescRec pscmaps_services[] = + { + { FT_SERVICE_ID_POSTSCRIPT_CMAPS, &pscmaps_interface }, + { NULL, NULL } + }; + + + static FT_Pointer + psnames_get_service( FT_Module module, + const char* service_id ) + { + FT_UNUSED( module ); + + return ft_service_list_lookup( pscmaps_services, service_id ); + } + +#endif /* !FT_CONFIG_OPTION_NO_POSTSCRIPT_NAMES */ + + + + FT_CALLBACK_TABLE_DEF + const FT_Module_Class 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 */ + +#ifdef FT_CONFIG_OPTION_NO_POSTSCRIPT_NAMES + 0, + (FT_Module_Constructor)0, + (FT_Module_Destructor) 0, + (FT_Module_Requester) 0 +#else + (void*)&pscmaps_interface, /* module specific interface */ + (FT_Module_Constructor)0, + (FT_Module_Destructor) 0, + (FT_Module_Requester) psnames_get_service +#endif + }; + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/psnames/psmodule.h b/src/WinLibs/freetype-2.3.5/src/psnames/psmodule.h new file mode 100644 index 000000000..232fdfb9a --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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_EXPORT_VAR( const FT_Module_Class ) psnames_module_class; + + +FT_END_HEADER + +#endif /* __PSMODULE_H__ */ + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/psnames/psnamerr.h b/src/WinLibs/freetype-2.3.5/src/psnames/psnamerr.h new file mode 100644 index 000000000..ae1541d96 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/src/psnames/psnames.c b/src/WinLibs/freetype-2.3.5/src/psnames/psnames.c new file mode 100644 index 000000000..d6ed998bf --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/psnames/psnames.c @@ -0,0 +1,25 @@ +/***************************************************************************/ +/* */ +/* psnames.c */ +/* */ +/* FreeType PSNames module component (body only). */ +/* */ +/* Copyright 1996-2001 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#define FT_MAKE_OPTION_SINGLE_OBJECT + +#include <ft2build.h> +#include "psmodule.c" + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/psnames/pstables.h b/src/WinLibs/freetype-2.3.5/src/psnames/pstables.h new file mode 100644 index 000000000..cc40ef735 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/psnames/pstables.h @@ -0,0 +1,4090 @@ +/***************************************************************************/ +/* */ +/* pstables.h */ +/* */ +/* PostScript glyph names. */ +/* */ +/* 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 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. + */ + static const unsigned char ft_adobe_glyph_list[54791] = + { + 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; + } + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/psnames/rules.mk b/src/WinLibs/freetype-2.3.5/src/psnames/rules.mk new file mode 100644 index 000000000..06bd161e3 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/src/raster/Jamfile b/src/WinLibs/freetype-2.3.5/src/raster/Jamfile new file mode 100644 index 000000000..f6e4251cb --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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 ; + } + else + { + _sources = raster ; + } + + Library $(FT2_LIB) : $(_sources).c ; +} + +# end of src/raster Jamfile diff --git a/src/WinLibs/freetype-2.3.5/src/raster/ftmisc.h b/src/WinLibs/freetype-2.3.5/src/raster/ftmisc.h new file mode 100644 index 000000000..c5dbd50d0 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/raster/ftmisc.h @@ -0,0 +1,83 @@ +/***************************************************************************/ +/* */ +/* ftmisc.h */ +/* */ +/* Miscellaneous macros for stand-alone rasterizer (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 *not* portable! You have to adapt */ + /* its definitions to your platform. */ + /* */ + /***************************************************/ + +#ifndef __FTMISC_H__ +#define __FTMISC_H__ + +#include <string.h> /* memset */ + +#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 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/src/WinLibs/freetype-2.3.5/src/raster/ftraster.c b/src/WinLibs/freetype-2.3.5/src/raster/ftraster.c new file mode 100644 index 000000000..4cfca4ed0 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/raster/ftraster.c @@ -0,0 +1,3369 @@ +/***************************************************************************/ +/* */ +/* ftraster.c */ +/* */ +/* The FreeType glyph rasterizer (body). */ +/* */ +/* Copyright 1996-2001, 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. */ +/* */ +/***************************************************************************/ + + /*************************************************************************/ + /* */ + /* 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_ + +#include "ftmisc.h" +#include "ftimage.h" + +#else /* !_STANDALONE_ */ + +#include <ft2build.h> +#include "ftraster.h" +#include FT_INTERNAL_CALC_H /* for FT_MulDiv only */ + +#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. */ + /* */ + /* 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 xxxDEBUG_RASTER + + /* undefine FT_RASTER_OPTION_ANTI_ALIASING if you do not want to support */ + /* 5-levels anti-aliasing */ +#ifdef FT_CONFIG_OPTION_5_GRAY_LEVELS +#define FT_RASTER_OPTION_ANTI_ALIASING +#endif + + /* 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 + +#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; + + + typedef enum TFlow_ + { + Flow_None = 0, + Flow_Up = 1, + Flow_Down = -1 + + } TFlow; + + + /* 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 purpose */ + PLong offset; /* start of profile's data in render pool */ + int flow; /* Profile orientation: Asc/Descending */ + 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 ) + + /* Note that I have moved the location of some fields in the */ + /* structure to ensure that the most used variables are used */ + /* at the top. Thus, their offset can be coded with less */ + /* opcodes, and it results in a smaller executable. */ + + struct 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, 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 + +#define ras (*worker) + +#endif /* FT_STATIC_RASTER */ + + +static const char count_table[256] = +{ + 0 , 1 , 1 , 2 , 1 , 2 , 2 , 3 , 1 , 2 , 2 , 3 , 2 , 3 , 3 , 4, + 1 , 2 , 2 , 3 , 2 , 3 , 3 , 4 , 2 , 3 , 3 , 4 , 3 , 4 , 4 , 5, + 1 , 2 , 2 , 3 , 2 , 3 , 3 , 4 , 2 , 3 , 3 , 4 , 3 , 4 , 4 , 5, + 2 , 3 , 3 , 4 , 3 , 4 , 4 , 5 , 3 , 4 , 4 , 5 , 4 , 5 , 5 , 6, + 1 , 2 , 2 , 3 , 2 , 3 , 3 , 4 , 2 , 3 , 3 , 4 , 3 , 4 , 4 , 5, + 2 , 3 , 3 , 4 , 3 , 4 , 4 , 5 , 3 , 4 , 4 , 5 , 4 , 5 , 5 , 6, + 2 , 3 , 3 , 4 , 3 , 4 , 4 , 5 , 3 , 4 , 4 , 5 , 4 , 5 , 5 , 6, + 3 , 4 , 4 , 5 , 4 , 5 , 5 , 6 , 4 , 5 , 5 , 6 , 5 , 6 , 6 , 7, + 1 , 2 , 2 , 3 , 2 , 3 , 3 , 4 , 2 , 3 , 3 , 4 , 3 , 4 , 4 , 5, + 2 , 3 , 3 , 4 , 3 , 4 , 4 , 5 , 3 , 4 , 4 , 5 , 4 , 5 , 5 , 6, + 2 , 3 , 3 , 4 , 3 , 4 , 4 , 5 , 3 , 4 , 4 , 5 , 4 , 5 , 5 , 6, + 3 , 4 , 4 , 5 , 4 , 5 , 5 , 6 , 4 , 5 , 5 , 6 , 5 , 6 , 6 , 7, + 2 , 3 , 3 , 4 , 3 , 4 , 4 , 5 , 3 , 4 , 4 , 5 , 4 , 5 , 5 , 6, + 3 , 4 , 4 , 5 , 4 , 5 , 5 , 6 , 4 , 5 , 5 , 6 , 5 , 6 , 6 , 7, + 3 , 4 , 4 , 5 , 4 , 5 , 5 , 6 , 4 , 5 , 5 , 6 , 5 , 6 , 6 , 7, + 4 , 5 , 5 , 6 , 5 , 6 , 6 , 7 , 5 , 6 , 6 , 7 , 6 , 7 , 7 , 8 }; + + + + /*************************************************************************/ + /*************************************************************************/ + /** **/ + /** PROFILES COMPUTATION **/ + /** **/ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* Set_High_Precision */ + /* */ + /* <Description> */ + /* Sets precision variables according to param flag. */ + /* */ + /* <Input> */ + /* High :: Set to True for high precision (typically for ppem < 18), */ + /* false otherwise. */ + /* */ + static void + Set_High_Precision( RAS_ARGS Int High ) + { + if ( High ) + { + ras.precision_bits = 10; + ras.precision_step = 128; + ras.precision_jitter = 24; + } + else + { + ras.precision_bits = 6; + ras.precision_step = 32; + ras.precision_jitter = 2; + } + + 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> */ + /* Creates a new profile in the render pool. */ + /* */ + /* <Input> */ + /* aState :: The state/orientation of the new profile. */ + /* */ + /* <Return> */ + /* SUCCESS on success. FAILURE in case of overflow or of incoherent */ + /* profile. */ + /* */ + static Bool + New_Profile( RAS_ARGS TStates aState ) + { + if ( !ras.fProfile ) + { + ras.cProfile = (PProfile)ras.top; + ras.fProfile = ras.cProfile; + ras.top += AlignProfileSize; + } + + if ( ras.top >= ras.maxBuff ) + { + ras.error = Raster_Err_Overflow; + return FAILURE; + } + + switch ( aState ) + { + case Ascending_State: + ras.cProfile->flow = Flow_Up; + FT_TRACE6(( "New ascending profile = %lx\n", (long)ras.cProfile )); + break; + + case Descending_State: + ras.cProfile->flow = Flow_Down; + 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; + } + + ras.cProfile->start = 0; + ras.cProfile->height = 0; + ras.cProfile->offset = ras.top; + ras.cProfile->link = (PProfile)0; + ras.cProfile->next = (PProfile)0; + + if ( !ras.gProfile ) + ras.gProfile = ras.cProfile; + + ras.state = aState; + ras.fresh = TRUE; + ras.joint = FALSE; + + return SUCCESS; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* End_Profile */ + /* */ + /* <Description> */ + /* Finalizes the current profile. */ + /* */ + /* <Return> */ + /* SUCCESS on success. FAILURE in case of overflow or incoherency. */ + /* */ + static Bool + End_Profile( RAS_ARG ) + { + 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 )); + + oldProfile = ras.cProfile; + ras.cProfile->height = h; + ras.cProfile = (PProfile)ras.top; + + ras.top += AlignProfileSize; + + ras.cProfile->height = 0; + ras.cProfile->offset = ras.top; + oldProfile->next = ras.cProfile; + ras.num_Profs++; + } + + if ( ras.top >= ras.maxBuff ) + { + FT_TRACE1(( "overflow in End_Profile\n" )); + ras.error = Raster_Err_Overflow; + return FAILURE; + } + + ras.joint = FALSE; + + return SUCCESS; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* Insert_Y_Turn */ + /* */ + /* <Description> */ + /* Inserts 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> */ + /* Adjusts 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; + + if ( n > 1 ) + { + p = ras.fProfile; + while ( n > 0 ) + { + if ( n > 1 ) + p->link = (PProfile)( p->offset + p->height ); + else + p->link = NULL; + + switch ( p->flow ) + { + case Flow_Down: + bottom = (Int)( p->start - p->height + 1 ); + top = (Int)p->start; + p->start = bottom; + p->offset += p->height - 1; + break; + + case Flow_Up: + default: + bottom = (Int)p->start; + top = (Int)( p->start + p->height - 1 ); + } + + if ( Insert_Y_Turn( RAS_VARS bottom ) || + Insert_Y_Turn( RAS_VARS top + 1 ) ) + return FAILURE; + + p = p->link; + n--; + } + } + else + ras.fProfile = NULL; + + return SUCCESS; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* Split_Conic */ + /* */ + /* <Description> */ + /* Subdivides 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> */ + /* Subdivides 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> */ + /* Computes the x-coordinates of an ascending line segment and stores */ + /* 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> */ + /* Computes the x-coordinates of an descending line segment and */ + /* stores 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> */ + /* Computes the x-coordinates of an ascending Bezier arc and stores */ + /* 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> */ + /* Computes the x-coordinates of an descending Bezier arc and stores */ + /* 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> */ + /* Injects a new line segment and adjusts 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 ) ) + return FAILURE; + } + else + { + if ( y < ras.lastY ) + if ( New_Profile( RAS_VARS Descending_State ) ) + return FAILURE; + } + break; + + case Ascending_State: + if ( y < ras.lastY ) + { + if ( End_Profile( RAS_VAR ) || + New_Profile( RAS_VARS Descending_State ) ) + return FAILURE; + } + break; + + case Descending_State: + if ( y > ras.lastY ) + { + if ( End_Profile( RAS_VAR ) || + New_Profile( RAS_VARS Ascending_State ) ) + 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> */ + /* Injects a new conic arc and adjusts 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 ) + { + /* finalize current profile if any */ + if ( ras.state != Unknown_State && + End_Profile( RAS_VAR ) ) + goto Fail; + + /* create a new profile */ + if ( New_Profile( RAS_VARS state_bez ) ) + 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> */ + /* Injects a new cubic arc and adjusts 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 ) + { + if ( ras.state != Unknown_State && + End_Profile( RAS_VAR ) ) + goto Fail; + + if ( New_Profile( RAS_VARS state_bez ) ) + 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> */ + /* Scans 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; + 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> */ + /* Converts a glyph into a series of segments and arcs and makes 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++ ) + { + 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 see 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->flow == ras.cProfile->flow ) + ras.top--; + /* Note that ras.gProfile can be nil if the contour was too small */ + /* to be drawn. */ + + lastProfile = ras.cProfile; + if ( End_Profile( RAS_VAR ) ) + return FAILURE; + + /* close the `next profile in contour' linked list */ + if ( ras.gProfile ) + lastProfile->next = ras.gProfile; + } + + if ( Finalize_Profile_Table( RAS_VAR ) ) + return FAILURE; + + return (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->flow; + 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; + Short c1, f1; + + + /* Drop-out control */ + + e1 = CEILING( x1 ); + e2 = FLOOR ( x2 ); + + if ( e1 > e2 ) + { + if ( e1 == e2 + ras.precision ) + { + switch ( ras.dropOutControl ) + { + case 1: + e1 = e2; + break; + + case 4: + e1 = CEILING( (x1 + x2 + 1) / 2 ); + break; + + case 2: + case 5: + /* Drop-out Control Rule #4 */ + + /* The spec is not very clear regarding rule #4. It */ + /* presents a method that is way too costly to implement */ + /* while the general idea seems to get rid of `stubs'. */ + /* */ + /* Here, we only get rid of stubs recognized if: */ + /* */ + /* upper stub: */ + /* */ + /* - P_Left and P_Right are in the same contour */ + /* - P_Right is the successor of P_Left in that contour */ + /* - y is the top of P_Left and P_Right */ + /* */ + /* lower stub: */ + /* */ + /* - P_Left and P_Right are in the same contour */ + /* - P_Left is the successor of P_Right in that contour */ + /* - y is the bottom of P_Left */ + /* */ + + /* FIXXXME: uncommenting this line solves the disappearing */ + /* bit problem in the `7' of verdana 10pts, but */ + /* makes a new one in the `C' of arial 14pts */ + +#if 0 + if ( x2 - x1 < ras.precision_half ) +#endif + { + /* upper stub test */ + if ( left->next == right && left->height <= 0 ) + return; + + /* lower stub test */ + if ( right->next == left && left->start == y ) + return; + } + + /* check that the rightmost pixel isn't set */ + + e1 = TRUNC( e1 ); + + c1 = (Short)( e1 >> 3 ); + f1 = (Short)( e1 & 7 ); + + if ( e1 >= 0 && e1 < ras.bWidth && + ras.bTarget[ras.traceOfs + c1] & ( 0x80 >> f1 ) ) + return; + + if ( ras.dropOutControl == 2 ) + e1 = e2; + else + e1 = CEILING( ( x1 + x2 + 1 ) / 2 ); + + break; + + default: + return; /* unsupported mode */ + } + } + else + return; + } + + e1 = TRUNC( e1 ); + + if ( e1 >= 0 && e1 < ras.bWidth ) + { + c1 = (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; + PByte bits; + Byte f1; + + + /* During the horizontal sweep, we only take care of drop-outs */ + + e1 = CEILING( x1 ); + e2 = FLOOR ( x2 ); + + if ( e1 > e2 ) + { + if ( e1 == e2 + ras.precision ) + { + switch ( ras.dropOutControl ) + { + case 1: + e1 = e2; + break; + + case 4: + e1 = CEILING( ( x1 + x2 + 1 ) / 2 ); + break; + + case 2: + case 5: + + /* Drop-out Control Rule #4 */ + + /* The spec is not very clear regarding rule #4. It */ + /* presents a method that is way too costly to implement */ + /* while the general idea seems to get rid of `stubs'. */ + /* */ + + /* rightmost stub test */ + if ( left->next == right && left->height <= 0 ) + return; + + /* leftmost stub test */ + if ( right->next == left && left->start == y ) + return; + + /* check that the rightmost pixel isn't set */ + + e1 = TRUNC( e1 ); + + bits = ras.bTarget + ( y >> 3 ); + f1 = (Byte)( 0x80 >> ( y & 7 ) ); + + 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; + + if ( ras.dropOutControl == 2 ) + e1 = e2; + else + e1 = CEILING( ( x1 + x2 + 1 ) / 2 ); + + break; + + default: + return; /* unsupported mode */ + } + } + else + return; + } + + bits = ras.bTarget + ( y >> 3 ); + f1 = (Byte)( 0x80 >> ( y & 7 ) ); + + e1 = TRUNC( e1 ); + + if ( e1 >= 0 && e1 < ras.target.rows ) + { + 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; + char* count = (char*)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 ) + { + if ( e1 == e2 + ras.precision ) + { + switch ( ras.dropOutControl ) + { + case 1: + e1 = e2; + break; + + case 4: + e1 = CEILING( ( x1 + x2 + 1 ) / 2 ); + break; + + case 2: + case 5: + + /* Drop-out Control Rule #4 */ + + /* The spec is not very clear regarding rule #4. It */ + /* presents a method that is way too costly to implement */ + /* while the general idea seems to get rid of `stubs'. */ + /* */ + + /* rightmost stub test */ + if ( left->next == right && left->height <= 0 ) + return; + + /* leftmost stub test */ + if ( right->next == left && left->start == y ) + return; + + if ( ras.dropOutControl == 2 ) + e1 = e2; + else + e1 = CEILING( ( x1 + x2 + 1 ) / 2 ); + + break; + + default: + return; /* unsupported mode */ + } + } + else + return; + } + + if ( e1 >= 0 ) + { + if ( x2 - x1 >= ras.precision_half ) + color = ras.grays[2]; + else + color = ras.grays[1]; + + e1 = TRUNC( e1 ) / 2; + if ( e1 < ras.target.rows ) + { + 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; + + + /* Init 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 inits 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 ) + { + /* look in the waiting list for new activations */ + + P = waiting; + + while ( P ) + { + Q = P->link; + P->countL -= y_height; + if ( P->countL == 0 ) + { + DelOld( &waiting, P ); + + switch ( P->flow ) + { + case Flow_Up: + InsNew( &draw_left, P ); + break; + + case Flow_Down: + InsNew( &draw_right, P ); + break; + } + } + + 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; + } + + if ( x2 - x1 <= ras.precision ) + { + e1 = FLOOR( x1 ); + e2 = CEILING( x2 ); + + if ( ras.dropOutControl != 0 && + ( e1 > e2 || e2 == e1 + ras.precision ) ) + { + /* a drop out was detected */ + + P_Left ->X = x1; + P_Right->X = x2; + + /* mark profile for drop-out processing */ + P_Left->countL = 1; + dropouts++; + + goto Skip_To_Next; + } + } + + ras.Proc_Sweep_Span( RAS_VARS y, x1, x2, P_Left, P_Right ); + + Skip_To_Next: + + P_Left = P_Left->link; + P_Right = P_Right->link; + } + + /* now perform the dropouts _after_ the span drawing -- */ + /* drop-outs processing has been moved out of the loop */ + /* for performance tuning */ + if ( dropouts > 0 ) + goto Scan_DropOuts; + + Next_Line: + + ras.Proc_Sweep_Step( RAS_VAR ); + + y++; + + if ( y < y_change ) + { + Sort( &draw_left ); + Sort( &draw_right ); + } + } + + /* Now finalize the profiles that needs it */ + + 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, flushes the bitmap scanline cache */ + while ( y <= max_Y ) + { + ras.Proc_Sweep_Step( RAS_VAR ); + y++; + } + + return SUCCESS; + + Scan_DropOuts: + + P_Left = draw_left; + P_Right = draw_right; + + while ( P_Left ) + { + if ( P_Left->countL ) + { + P_Left->countL = 0; +#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> */ + /* Performs 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> */ + /* Renders 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; + /* Drop-out mode 2 is hard-coded since this is the only mode used */ + /* on Windows platforms. Using other modes, as specified by the */ + /* font, results in misplaced pixels. */ + ras.dropOutControl = 2; + 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 != 0 ) + { + ras.Proc_Sweep_Init = Horizontal_Sweep_Init; + ras.Proc_Sweep_Span = Horizontal_Sweep_Span; + ras.Proc_Sweep_Drop = Horizontal_Sweep_Drop; + ras.Proc_Sweep_Step = Horizontal_Sweep_Step; + + ras.band_top = 0; + ras.band_stack[0].y_min = 0; + ras.band_stack[0].y_max = (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> */ + /* Renders 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; + /* Drop-out mode 2 is hard-coded since this is the only mode used */ + /* on Windows platforms. Using other modes, as specified by the */ + /* font, results in misplaced pixels. */ + ras.dropOutControl = 2; + 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 != 0 ) + { + ras.Proc_Sweep_Init = Horizontal_Sweep_Init; + ras.Proc_Sweep_Span = Horizontal_Gray_Sweep_Span; + ras.Proc_Sweep_Drop = Horizontal_Gray_Sweep_Drop; + ras.Proc_Sweep_Step = Horizontal_Sweep_Step; + + ras.band_top = 0; + ras.band_stack[0].y_min = 0; + ras.band_stack[0].y_max = ras.target.width * 2 - 1; + + error = Render_Single_Pass( RAS_VARS 1 ); + if ( error ) + return error; + } + + return 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 ) + { + FT_UNUSED( 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; + +#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; + + /* return immediately if the outline is empty */ + if ( outline->n_points == 0 || outline->n_contours <= 0 ) + return Raster_Err_None; + + if ( !outline || !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 || !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; +#endif + + return ( ( params->flags & FT_RASTER_FLAG_AA ) + ? Render_Gray_Glyph( RAS_VAR ) + : Render_Glyph( RAS_VAR ) ); + } + + + const FT_Raster_Funcs ft_standard_raster = + { + FT_GLYPH_FORMAT_OUTLINE, + (FT_Raster_New_Func) ft_black_new, + (FT_Raster_Reset_Func) ft_black_reset, + (FT_Raster_Set_Mode_Func)ft_black_set_mode, + (FT_Raster_Render_Func) ft_black_render, + (FT_Raster_Done_Func) ft_black_done + }; + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/raster/ftraster.h b/src/WinLibs/freetype-2.3.5/src/raster/ftraster.h new file mode 100644 index 000000000..80fe46deb --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/src/raster/ftrend1.c b/src/WinLibs/freetype-2.3.5/src/raster/ftrend1.c new file mode 100644 index 000000000..3cc8d0741 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/raster/ftrend1.c @@ -0,0 +1,273 @@ +/***************************************************************************/ +/* */ +/* 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 "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 */ + 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; + } + + 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_CALLBACK_TABLE_DEF + const FT_Renderer_Class 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 + }; + + + /* 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_CALLBACK_TABLE_DEF + const FT_Renderer_Class 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 + }; + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/raster/ftrend1.h b/src/WinLibs/freetype-2.3.5/src/raster/ftrend1.h new file mode 100644 index 000000000..76e9a5f58 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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_EXPORT_VAR( const FT_Renderer_Class ) 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_EXPORT_VAR( const FT_Renderer_Class ) ft_raster5_renderer_class; + + +FT_END_HEADER + +#endif /* __FTREND1_H__ */ + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/raster/module.mk b/src/WinLibs/freetype-2.3.5/src/raster/module.mk new file mode 100644 index 000000000..59c737b93 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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_raster1_renderer_class$(CLOSE_DRIVER) +$(ECHO_DRIVER)raster $(ECHO_DRIVER_DESC)monochrome bitmap renderer$(ECHO_DRIVER_DONE) +endef + +# EOF diff --git a/src/WinLibs/freetype-2.3.5/src/raster/raster.c b/src/WinLibs/freetype-2.3.5/src/raster/raster.c new file mode 100644 index 000000000..f13a67a20 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/raster/raster.c @@ -0,0 +1,26 @@ +/***************************************************************************/ +/* */ +/* raster.c */ +/* */ +/* FreeType monochrome rasterer module component (body only). */ +/* */ +/* Copyright 1996-2001 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#define FT_MAKE_OPTION_SINGLE_OBJECT + +#include <ft2build.h> +#include "ftraster.c" +#include "ftrend1.c" + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/raster/rasterrs.h b/src/WinLibs/freetype-2.3.5/src/raster/rasterrs.h new file mode 100644 index 000000000..5df9a7ab1 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/src/raster/rules.mk b/src/WinLibs/freetype-2.3.5/src/raster/rules.mk new file mode 100644 index 000000000..0dc8782ea --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/raster/rules.mk @@ -0,0 +1,69 @@ +# +# FreeType 2 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. + + +# 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/src/WinLibs/freetype-2.3.5/src/sfnt/Jamfile b/src/WinLibs/freetype-2.3.5/src/sfnt/Jamfile new file mode 100644 index 000000000..6b8a40182 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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 ttpost ttload ttsbit ttkern ttbdf ; + } + else + { + _sources = sfnt ; + } + + Library $(FT2_LIB) : $(_sources).c ; +} + +# end of src/sfnt Jamfile diff --git a/src/WinLibs/freetype-2.3.5/src/sfnt/module.mk b/src/WinLibs/freetype-2.3.5/src/sfnt/module.mk new file mode 100644 index 000000000..d33913809 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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)sfnt_module_class$(CLOSE_DRIVER) +$(ECHO_DRIVER)sfnt $(ECHO_DRIVER_DESC)helper module for TrueType & OpenType formats$(ECHO_DRIVER_DONE) +endef + +# EOF diff --git a/src/WinLibs/freetype-2.3.5/src/sfnt/rules.mk b/src/WinLibs/freetype-2.3.5/src/sfnt/rules.mk new file mode 100644 index 000000000..ff7840e7f --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/sfnt/rules.mk @@ -0,0 +1,76 @@ +# +# FreeType 2 SFNT driver configuration rules +# + + +# Copyright 1996-2000, 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. + + +# 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 +# +SFNT_DRV_H := $(SFNT_DRV_SRC:%c=%h) \ + $(SFNT_DIR)/sferrors.h + + +# SFNT driver object(s) +# +# SFNT_DRV_OBJ_M is used during `multi' builds. +# SFNT_DRV_OBJ_S is used during `single' builds. +# +SFNT_DRV_OBJ_M := $(SFNT_DRV_SRC:$(SFNT_DIR)/%.c=$(OBJ_DIR)/%.$O) +SFNT_DRV_OBJ_S := $(OBJ_DIR)/sfnt.$O + +# SFNT driver source file for single build +# +SFNT_DRV_SRC_S := $(SFNT_DIR)/sfnt.c + + +# SFNT driver - single object +# +$(SFNT_DRV_OBJ_S): $(SFNT_DRV_SRC_S) $(SFNT_DRV_SRC) \ + $(FREETYPE_H) $(SFNT_DRV_H) + $(SFNT_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(SFNT_DRV_SRC_S)) + + +# SFNT driver - multiple objects +# +$(OBJ_DIR)/%.$O: $(SFNT_DIR)/%.c $(FREETYPE_H) $(SFNT_DRV_H) + $(SFNT_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<) + + +# update main driver object lists +# +DRV_OBJS_S += $(SFNT_DRV_OBJ_S) +DRV_OBJS_M += $(SFNT_DRV_OBJ_M) + + +# EOF diff --git a/src/WinLibs/freetype-2.3.5/src/sfnt/sfdriver.c b/src/WinLibs/freetype-2.3.5/src/sfnt/sfdriver.c new file mode 100644 index 000000000..5ba22a6c5 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/sfnt/sfdriver.c @@ -0,0 +1,618 @@ +/***************************************************************************/ +/* */ +/* sfdriver.c */ +/* */ +/* High-level SFNT driver interface (body). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_INTERNAL_SFNT_H +#include FT_INTERNAL_OBJECTS_H + +#include "sfdriver.h" +#include "ttload.h" +#include "sfobjs.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 + + + /* + * 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 *length ) + { + if ( !tag || !length ) + return SFNT_Err_Invalid_Argument; + + if ( idx >= face->num_tables ) + return SFNT_Err_Table_Missing; + + *tag = face->dir_tables[idx].Tag; + *length = face->dir_tables[idx].Length; + + return SFNT_Err_Ok; + } + + + static const FT_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 const FT_Service_GlyphDictRec sfnt_service_glyph_dict = + { + (FT_GlyphDict_GetNameFunc) sfnt_get_glyph_name, + (FT_GlyphDict_NameIndexFunc)NULL + }; + +#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; + } + + static const FT_Service_PsFontNameRec sfnt_service_ps_name = + { + (FT_PsName_GetFunc)sfnt_get_ps_name + }; + + + /* + * TT CMAP INFO + */ + static const FT_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; + } + + + static const FT_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 + */ + + static const FT_ServiceDescRec sfnt_services[] = + { + { FT_SERVICE_ID_SFNT_TABLE, &sfnt_service_sfnt_table }, + { FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &sfnt_service_ps_name }, +#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES + { FT_SERVICE_ID_GLYPH_DICT, &sfnt_service_glyph_dict }, +#endif +#ifdef TT_CONFIG_OPTION_BDF + { FT_SERVICE_ID_BDF, &sfnt_service_bdf }, +#endif + { FT_SERVICE_ID_TT_CMAP, &tt_service_get_cmap_info }, + + { NULL, NULL } + }; + + + FT_CALLBACK_DEF( FT_Module_Interface ) + sfnt_get_interface( FT_Module module, + const char* module_interface ) + { + FT_UNUSED( module ); + + return ft_service_list_lookup( sfnt_services, 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 */ + + + static + const SFNT_Interface sfnt_interface = + { + tt_face_goto_table, + + sfnt_init_face, + sfnt_load_face, + sfnt_done_face, + sfnt_get_interface, + + tt_face_load_any, + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + tt_face_load_sfnt_header_stub, + tt_face_load_directory_stub, +#endif + + 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, + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + tt_face_load_hdmx_stub, + tt_face_free_hdmx_stub, +#endif + + tt_face_load_kern, + tt_face_load_gasp, + tt_face_load_pclt, + +#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS + /* see `ttload.h' */ + tt_face_load_bhed, +#else + 0, +#endif + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + tt_face_set_sbit_strike_stub, + tt_face_load_sbit_stub, + + tt_find_sbit_image, + tt_load_sbit_metrics, +#endif + +#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS + tt_face_load_sbit_image, +#else + 0, +#endif + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + tt_face_free_sbit_stub, +#endif + +#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES + /* see `ttpost.h' */ + tt_face_get_ps_name, + tt_face_free_ps_names, +#else + 0, + 0, +#endif + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + tt_face_load_charmap_stub, + tt_face_free_charmap_stub, +#endif + + /* since version 2.1.8 */ + + tt_face_get_kerning, + + /* since version 2.2 */ + + tt_face_load_font_dir, + tt_face_load_hmtx, + +#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS + /* see `ttsbit.h' and `sfnt.h' */ + tt_face_load_eblc, + tt_face_free_eblc, + + tt_face_set_sbit_strike, + tt_face_load_strike_metrics, +#else + 0, + 0, + 0, + 0, +#endif + + tt_face_get_metrics + }; + + + FT_CALLBACK_TABLE_DEF + const FT_Module_Class 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*)&sfnt_interface, /* module specific interface */ + + (FT_Module_Constructor)0, + (FT_Module_Destructor) 0, + (FT_Module_Requester) sfnt_get_interface + }; + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/sfnt/sfdriver.h b/src/WinLibs/freetype-2.3.5/src/sfnt/sfdriver.h new file mode 100644 index 000000000..92db79694 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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_EXPORT_VAR( const FT_Module_Class ) sfnt_module_class; + + +FT_END_HEADER + +#endif /* __SFDRIVER_H__ */ + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/sfnt/sferrors.h b/src/WinLibs/freetype-2.3.5/src/sfnt/sferrors.h new file mode 100644 index 000000000..27f90de28 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/src/sfnt/sfnt.c b/src/WinLibs/freetype-2.3.5/src/sfnt/sfnt.c new file mode 100644 index 000000000..45a820b71 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/sfnt/sfnt.c @@ -0,0 +1,41 @@ +/***************************************************************************/ +/* */ +/* sfnt.c */ +/* */ +/* Single object library component. */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#define FT_MAKE_OPTION_SINGLE_OBJECT + +#include <ft2build.h> +#include "ttload.c" +#include "ttmtx.c" +#include "ttcmap.c" +#include "ttkern.c" +#include "sfobjs.c" +#include "sfdriver.c" + +#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS +#include "ttsbit.c" +#endif + +#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES +#include "ttpost.c" +#endif + +#ifdef TT_CONFIG_OPTION_BDF +#include "ttbdf.c" +#endif + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/sfnt/sfobjs.c b/src/WinLibs/freetype-2.3.5/src/sfnt/sfobjs.c new file mode 100644 index 000000000..cc901100d --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/sfnt/sfobjs.c @@ -0,0 +1,1070 @@ +/***************************************************************************/ +/* */ +/* sfobjs.c */ +/* */ +/* SFNT object management (base). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#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 "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. */ + /* */ + /* <Return> */ + /* Character string. NULL if no name is present. */ + /* */ + static FT_String* + tt_face_get_name( TT_Face face, + FT_UShort nameid ) + { + FT_Memory memory = face->root.memory; + 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; + + + 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_Error error = SFNT_Err_Ok; + FT_Stream stream = face->name_table.stream; + + FT_UNUSED( error ); + + + 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: + return result; + } + + + 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 != FT_MAKE_TAG( 'O', 'T', 'T', 'O' ) && + tag != TTAG_true && + 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_Bad_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; + + 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 ) + + + 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, psnames_error; + FT_Bool has_outline; + FT_Bool is_apple_sbit; + + SFNT_Service sfnt = (SFNT_Service)face->sfnt; + + FT_UNUSED( face_index ); + FT_UNUSED( num_params ); + FT_UNUSED( params ); + + + /* 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 ); + psnames_error = error; + + /* 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 ) + { + /* return an error if this font file has no outlines */ + if ( error == SFNT_Err_Table_Missing && has_outline ) + 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 ); + + error = SFNT_Err_Ok; + + face->root.num_glyphs = face->max_profile.numGlyphs; + + face->root.family_name = tt_face_get_name( face, + TT_NAME_ID_PREFERRED_FAMILY ); + if ( !face->root.family_name ) + face->root.family_name = tt_face_get_name( face, + TT_NAME_ID_FONT_FAMILY ); + + face->root.style_name = tt_face_get_name( face, + TT_NAME_ID_PREFERRED_SUBFAMILY ); + if ( !face->root.style_name ) + face->root.style_name = tt_face_get_name( face, + TT_NAME_ID_FONT_SUBFAMILY ); + + /* now set up root fields */ + { + FT_Face root = &face->root; + FT_Int32 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 */ + if ( face->os2.fsSelection & 1 ) + flags |= FT_STYLE_FLAG_ITALIC; + + if ( face->os2.fsSelection & 32 ) + 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 + } + } + + + /*********************************************************************/ + /* */ + /* Set up metrics. */ + /* */ + if ( has_outline == TRUE ) + { + /* 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 + +#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 ); + + root->underline_position = face->postscript.underlinePosition; + root->underline_thickness = face->postscript.underlineThickness; + } + +#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; + + +#if !defined 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 */ + + } + + Exit: + FT_TRACE2(( "sfnt_load_face: done\n" )); + + return error; + } + + +#undef LOAD_ +#undef LOADM_ + + + FT_LOCAL_DEF( void ) + sfnt_done_face( TT_Face face ) + { + FT_Memory memory = face->root.memory; + SFNT_Service 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 */ +#if !defined 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 */ + sfnt->free_name( face ); + + /* freeing family and style name */ + FT_FREE( face->root.family_name ); + FT_FREE( face->root.style_name ); + + /* freeing sbit size table */ + FT_FREE( face->root.available_sizes ); + face->root.num_fixed_sizes = 0; + + FT_FREE( face->postscript_name ); + + face->sfnt = 0; + } + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/sfnt/sfobjs.h b/src/WinLibs/freetype-2.3.5/src/sfnt/sfobjs.h new file mode 100644 index 000000000..6241c93b3 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/src/sfnt/ttbdf.c b/src/WinLibs/freetype-2.3.5/src/sfnt/ttbdf.c new file mode 100644 index 000000000..6c95387ad --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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_UInt32 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_UInt 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/src/WinLibs/freetype-2.3.5/src/sfnt/ttbdf.h b/src/WinLibs/freetype-2.3.5/src/sfnt/ttbdf.h new file mode 100644 index 000000000..48a10d6e9 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/src/sfnt/ttcmap.c b/src/WinLibs/freetype-2.3.5/src/sfnt/ttcmap.c new file mode 100644 index 000000000..854d567d1 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/sfnt/ttcmap.c @@ -0,0 +1,2356 @@ +/***************************************************************************/ +/* */ +/* ttcmap.c */ +/* */ +/* TrueType 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 <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" + + + /*************************************************************************/ + /* */ + /* 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_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_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_UInt ) + 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_CALLBACK_TABLE_DEF + const TT_CMap_ClassRec 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 + }, + 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's 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 ); + + /* 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's 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_UInt ) + 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_CALLBACK_TABLE_DEF + const TT_CMap_ClassRec 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 + }, + 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 be overlapping and the last segment should always contain the */ + /* `0xFFFF' 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 certain fonts contain invalid charmaps that */ + /* contain end=0xFFFF, start=0xFFFF, delta=0x0001, offset=0xFFFF at the */ + /* of their charmaps (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 = 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 ); + + 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 = 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 = 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 must be FFFF */ + 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 present 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; + } + else + { + 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 && delta == 0x1U ) ) + FT_INVALID_DATA; + } + + last_start = start; + last_end = end; + } + } + + return error; + } + + + static FT_UInt + tt_cmap4_char_map_linear( TT_CMap cmap, + FT_UInt* 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 ); + + 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_UInt* pcharcode, + FT_Bool next ) + { + FT_UInt num_segs2, start, end, offset; + FT_Int delta; + FT_UInt max, min, mid, num_segs; + FT_UInt charcode = *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 ); + + /* 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_UInt ) + 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_CALLBACK_TABLE_DEF + const TT_CMap_ClassRec 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 + }, + 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_UInt ) + 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_CALLBACK_TABLE_DEF + const TT_CMap_ClassRec 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 + }, + 6, + (TT_CMap_ValidateFunc) tt_cmap6_validate, + (TT_CMap_Info_GetFunc) tt_cmap6_get_info + }; + +#endif /* TT_CONFIG_CMAP_FORMAT_6 */ + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** FORMAT 8 *****/ + /***** *****/ + /***** It's 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 ( table + length > valid->limit || length < 8208 ) + 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_UInt ) + 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_CALLBACK_TABLE_DEF + const TT_CMap_ClassRec 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 + }, + 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 ( table + length > valid->limit || 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_UInt ) + 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_CALLBACK_TABLE_DEF + const TT_CMap_ClassRec 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 + }, + 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 ( table + length > valid->limit || 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_UInt ) + 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; + if ( gindex ) + *pchar_code = cmap12->cur_charcode; + } + else + gindex = 0; + } + else + gindex = tt_cmap12_char_map_binary( cmap, pchar_code, 1 ); + + return 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_CALLBACK_TABLE_DEF + const TT_CMap_ClassRec 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 + }, + 12, + (TT_CMap_ValidateFunc) tt_cmap12_validate, + (TT_CMap_Info_GetFunc) tt_cmap12_get_info + }; + + +#endif /* TT_CONFIG_CMAP_FORMAT_12 */ + + + static const TT_CMap_Class tt_cmap_classes[] = + { +#ifdef TT_CONFIG_CMAP_FORMAT_0 + &tt_cmap0_class_rec, +#endif + +#ifdef TT_CONFIG_CMAP_FORMAT_2 + &tt_cmap2_class_rec, +#endif + +#ifdef TT_CONFIG_CMAP_FORMAT_4 + &tt_cmap4_class_rec, +#endif + +#ifdef TT_CONFIG_CMAP_FORMAT_6 + &tt_cmap6_class_rec, +#endif + +#ifdef TT_CONFIG_CMAP_FORMAT_8 + &tt_cmap8_class_rec, +#endif + +#ifdef TT_CONFIG_CMAP_FORMAT_10 + &tt_cmap10_class_rec, +#endif + +#ifdef TT_CONFIG_CMAP_FORMAT_12 + &tt_cmap12_class_rec, +#endif + + NULL, + }; + + + /* 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; + + + 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 = tt_cmap_classes; + 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; + + + 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_ERROR(( "tt_face_build_cmaps:" )); + FT_ERROR(( " broken cmap sub-table ignored!\n" )); + } + break; + } + } + } + } + + return SFNT_Err_Ok; + } + + + FT_LOCAL( FT_Error ) + tt_get_cmap_info( FT_CharMap charmap, + TT_CMapInfo *cmap_info ) + { + FT_CMap cmap = (FT_CMap)charmap; + TT_CMap_Class clazz = (TT_CMap_Class)cmap->clazz; + + + return clazz->get_cmap_info( charmap, cmap_info ); + } + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/sfnt/ttcmap.h b/src/WinLibs/freetype-2.3.5/src/sfnt/ttcmap.h new file mode 100644 index 000000000..a10a3e250 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/sfnt/ttcmap.h @@ -0,0 +1,85 @@ +/***************************************************************************/ +/* */ +/* 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; + + + typedef struct TT_ValidatorRec_ + { + FT_ValidatorRec validator; + FT_UInt num_glyphs; + + } TT_ValidatorRec, *TT_Validator; + + +#define TT_VALIDATOR( x ) ((TT_Validator)( x )) +#define TT_VALID_GLYPH_COUNT( x ) TT_VALIDATOR( x )->num_glyphs + + + FT_LOCAL( FT_Error ) + tt_face_build_cmaps( TT_Face face ); + + /* used in tt-cmaps service */ + FT_LOCAL( FT_Error ) + tt_get_cmap_info( FT_CharMap charmap, + TT_CMapInfo *cmap_info ); + + +FT_END_HEADER + +#endif /* __TTCMAP_H__ */ + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/sfnt/ttkern.c b/src/WinLibs/freetype-2.3.5/src/sfnt/ttkern.c new file mode 100644 index 000000000..28e52c333 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/sfnt/ttkern.c @@ -0,0 +1,292 @@ +/***************************************************************************/ +/* */ +/* 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 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. 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 "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_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(( "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(( "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 = 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; + + /* 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 + 6 * num_pairs > p_limit ) + goto NextTable; + + avail |= mask; + + /* + * Now check whether the pairs in this table are ordered. + * We then can use binary search. + */ + if ( num_pairs > 0 ) + { + FT_UInt count; + FT_UInt 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; + + + p += 4; + mask = 0x0001; + + for ( count = face->num_kern_tables; count > 0; 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_Int value = 0; + + FT_UNUSED( version ); + + + next = base + length; + + if ( ( face->kern_avail_bits & mask ) == 0 ) + goto NextTable; + + if ( p + 8 > next ) + goto NextTable; + + switch ( coverage >> 8 ) + { + case 0: + { + FT_UInt num_pairs = FT_NEXT_USHORT( p ); + FT_ULong key0 = TT_KERN_INDEX( left_glyph, right_glyph ); + + + p += 6; + + if ( face->kern_order_bits & mask ) /* binary search */ + { + FT_UInt min = 0; + FT_UInt max = num_pairs; + + + while ( min < max ) + { + FT_UInt mid = ( min + max ) >> 1; + FT_Byte* q = p + 6 * mid; + FT_ULong key; + + + key = FT_NEXT_ULONG( q ); + + if ( key == key0 ) + { + value = FT_PEEK_SHORT( q ); + goto Found; + } + if ( key < key0 ) + min = mid + 1; + else + max = mid; + } + } + else /* linear search */ + { + FT_UInt count2; + + + for ( count2 = num_pairs; count2 > 0; count2-- ) + { + FT_ULong key = FT_NEXT_ULONG( p ); + + + if ( key == key0 ) + { + value = FT_PEEK_SHORT( p ); + goto Found; + } + p += 2; + } + } + } + break; + + /* + * We don't support format 2 because we haven't seen a single font + * using it in real life... + */ + + default: + ; + } + + goto NextTable; + + Found: + if ( coverage & 8 ) /* override or add */ + result = value; + else + result += value; + + NextTable: + p = next; + } + + return result; + } + +#undef TT_KERN_INDEX + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/sfnt/ttkern.h b/src/WinLibs/freetype-2.3.5/src/sfnt/ttkern.h new file mode 100644 index 000000000..df1da9b27 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/src/sfnt/ttload.c b/src/WinLibs/freetype-2.3.5/src/sfnt/ttload.c new file mode 100644 index 000000000..abe0278a2 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/sfnt/ttload.c @@ -0,0 +1,1176 @@ +/***************************************************************************/ +/* */ +/* 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 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. 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; + + + 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 0-length */ + /* tables the same as missing tables. */ + if ( entry->Tag == tag && entry->Length != 0 ) + { + FT_TRACE4(( "found table.\n" )); + return entry; + } + } + + FT_TRACE4(( "could not find table!\n" )); + return 0; + } + + + /*************************************************************************/ + /* */ + /* <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 */ + /* - look for a `head' table, check its size, and parse it to check */ + /* whether its `magic' field is correctly set */ + /* */ + /* When checking directory entries, ignore the tables `glyx' and `locx' */ + /* which are hacked-out versions of `glyf' and `loca' in some PostScript */ + /* Type 42 fonts, and which are generally invalid. */ + /* */ + static FT_Error + check_table_dir( SFNT_Header sfnt, + FT_Stream stream ) + { + FT_Error error; + FT_UInt nn; + FT_UInt has_head = 0, has_sing = 0, has_meta = 0; + FT_ULong offset = sfnt->offset + 12; + + const FT_ULong glyx_tag = FT_MAKE_TAG( 'g', 'l', 'y', 'x' ); + const FT_ULong locx_tag = FT_MAKE_TAG( 'l', 'o', 'c', 'x' ); + + 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 ( sfnt->num_tables == 0 || + offset + sfnt->num_tables * 16 > stream->size ) + return SFNT_Err_Unknown_File_Format; + + if ( FT_STREAM_SEEK( offset ) ) + return error; + + for ( nn = 0; nn < sfnt->num_tables; nn++ ) + { + TT_TableRec table; + + + if ( FT_STREAM_READ_FIELDS( table_dir_entry_fields, &table ) ) + return error; + + if ( table.Offset + table.Length > stream->size && + table.Tag != glyx_tag && + table.Tag != locx_tag ) + return SFNT_Err_Unknown_File_Format; + + 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 ) + return SFNT_Err_Unknown_File_Format; + + if ( FT_STREAM_SEEK( table.Offset + 12 ) || + FT_READ_ULONG( magic ) ) + return error; + + if ( magic != 0x5F0F3CF5UL ) + return SFNT_Err_Unknown_File_Format; + + if ( FT_STREAM_SEEK( offset + ( nn + 1 ) * 16 ) ) + return error; + } + else if ( table.Tag == TTAG_SING ) + has_sing = 1; + else if ( table.Tag == TTAG_META ) + has_meta = 1; + } + + /* if `sing' and `meta' tables are present, there is no `head' table */ + if ( has_head || ( has_sing && has_meta ) ) + return SFNT_Err_Ok; + else + return SFNT_Err_Unknown_File_Format; + } + + + /*************************************************************************/ + /* */ + /* <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; + TT_TableRec* limit; + + 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 ) ) + return error; + + /* 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(( "-- Tables count: %12u\n", sfnt.num_tables )); + FT_TRACE2(( "-- Format version: %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!\n" )); + + return error; + } + + face->num_tables = sfnt.num_tables; + face->format_tag = sfnt.format_tag; + + if ( FT_QNEW_ARRAY( face->dir_tables, face->num_tables ) ) + return error; + + if ( FT_STREAM_SEEK( sfnt.offset + 12 ) || + FT_FRAME_ENTER( face->num_tables * 16L ) ) + return error; + + entry = face->dir_tables; + limit = entry + face->num_tables; + + for ( ; entry < limit; entry++ ) + { + entry->Tag = FT_GET_TAG4(); + entry->CheckSum = FT_GET_ULONG(); + entry->Offset = FT_GET_LONG(); + entry->Length = FT_GET_LONG(); + + 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 )); + } + + FT_FRAME_EXIT(); + + FT_TRACE2(( "table directory loaded\n\n" )); + + 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; + } + + 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(( "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/src/WinLibs/freetype-2.3.5/src/sfnt/ttload.h b/src/WinLibs/freetype-2.3.5/src/sfnt/ttload.h new file mode 100644 index 000000000..49a1aee16 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/src/sfnt/ttmtx.c b/src/WinLibs/freetype-2.3.5/src/sfnt/ttmtx.c new file mode 100644 index 000000000..286bd0c31 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/sfnt/ttmtx.c @@ -0,0 +1,465 @@ +/***************************************************************************/ +/* */ +/* ttmtx.c */ +/* */ +/* Load the metrics tables common to TTF and OTF fonts (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 <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. */ + /* */ +#if !defined 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 /* !OPTIMIZE_MEMORY || 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_ERROR(( "%cmtx has more metrics than glyphs.\n" )); + + /* 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 /* !OPTIMIZE_MEMORY || 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. */ + /* */ +#if !defined 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 /* 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 : 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 /* !OPTIMIZE_MEMORY || OLD_INTERNALS */ + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/sfnt/ttmtx.h b/src/WinLibs/freetype-2.3.5/src/sfnt/ttmtx.h new file mode 100644 index 000000000..8b91a113d --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/src/sfnt/ttpost.c b/src/WinLibs/freetype-2.3.5/src/sfnt/ttpost.c new file mode 100644 index 000000000..1e6163646 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.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 "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_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 ) tt_post_default_names[x] + + /* the 258 default Mac PS glyph names */ + + static const FT_String* tt_post_default_names[258] = + { + /* 0 */ + ".notdef", ".null", "CR", "space", "exclam", + "quotedbl", "numbersign", "dollar", "percent", "ampersand", + /* 10 */ + "quotesingle", "parenleft", "parenright", "asterisk", "plus", + "comma", "hyphen", "period", "slash", "zero", + /* 20 */ + "one", "two", "three", "four", "five", + "six", "seven", "eight", "nine", "colon", + /* 30 */ + "semicolon", "less", "equal", "greater", "question", + "at", "A", "B", "C", "D", + /* 40 */ + "E", "F", "G", "H", "I", + "J", "K", "L", "M", "N", + /* 50 */ + "O", "P", "Q", "R", "S", + "T", "U", "V", "W", "X", + /* 60 */ + "Y", "Z", "bracketleft", "backslash", "bracketright", + "asciicircum", "underscore", "grave", "a", "b", + /* 70 */ + "c", "d", "e", "f", "g", + "h", "i", "j", "k", "l", + /* 80 */ + "m", "n", "o", "p", "q", + "r", "s", "t", "u", "v", + /* 90 */ + "w", "x", "y", "z", "braceleft", + "bar", "braceright", "asciitilde", "Adieresis", "Aring", + /* 100 */ + "Ccedilla", "Eacute", "Ntilde", "Odieresis", "Udieresis", + "aacute", "agrave", "acircumflex", "adieresis", "atilde", + /* 110 */ + "aring", "ccedilla", "eacute", "egrave", "ecircumflex", + "edieresis", "iacute", "igrave", "icircumflex", "idieresis", + /* 120 */ + "ntilde", "oacute", "ograve", "ocircumflex", "odieresis", + "otilde", "uacute", "ugrave", "ucircumflex", "udieresis", + /* 130 */ + "dagger", "degree", "cent", "sterling", "section", + "bullet", "paragraph", "germandbls", "registered", "copyright", + /* 140 */ + "trademark", "acute", "dieresis", "notequal", "AE", + "Oslash", "infinity", "plusminus", "lessequal", "greaterequal", + /* 150 */ + "yen", "mu", "partialdiff", "summation", "product", + "pi", "integral", "ordfeminine", "ordmasculine", "Omega", + /* 160 */ + "ae", "oslash", "questiondown", "exclamdown", "logicalnot", + "radical", "florin", "approxequal", "Delta", "guillemotleft", + /* 170 */ + "guillemotright", "ellipsis", "nbspace", "Agrave", "Atilde", + "Otilde", "OE", "oe", "endash", "emdash", + /* 180 */ + "quotedblleft", "quotedblright", "quoteleft", "quoteright", "divide", + "lozenge", "ydieresis", "Ydieresis", "fraction", "currency", + /* 190 */ + "guilsinglleft", "guilsinglright", "fi", "fl", "daggerdbl", + "periodcentered", "quotesinglbase", "quotedblbase", "perthousand", "Acircumflex", + /* 200 */ + "Ecircumflex", "Aacute", "Edieresis", "Egrave", "Iacute", + "Icircumflex", "Idieresis", "Igrave", "Oacute", "Ocircumflex", + /* 210 */ + "apple", "Ograve", "Uacute", "Ucircumflex", "Ugrave", + "dotlessi", "circumflex", "tilde", "macron", "breve", + /* 220 */ + "dotaccent", "ring", "cedilla", "hungarumlaut", "ogonek", + "caron", "Lslash", "lslash", "Scaron", "scaron", + /* 230 */ + "Zcaron", "zcaron", "brokenbar", "Eth", "eth", + "Yacute", "yacute", "Thorn", "thorn", "minus", + /* 240 */ + "multiply", "onesuperior", "twosuperior", "threesuperior", "onehalf", + "onequarter", "threequarters", "franc", "Gbreve", "gbreve", + /* 250 */ + "Idot", "Scedilla", "scedilla", "Cacute", "cacute", + "Ccaron", "ccaron", "dmacron", + }; + + +#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> */ + /* Gets the PostScript glyph name of a glyph. */ + /* */ + /* <Input> */ + /* face :: A handle to the parent face. */ + /* */ + /* 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. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + tt_face_get_ps_name( TT_Face face, + FT_UInt idx, + FT_String** PSname ) + { + FT_Error error; + TT_Post_Names names; + FT_Fixed format; + +#ifdef FT_CONFIG_OPTION_POSTSCRIPT_NAMES + FT_Service_PsCMaps psnames; +#endif + + + if ( !face ) + return SFNT_Err_Invalid_Face_Handle; + + if ( idx >= (FT_UInt)face->max_profile.numGlyphs ) + return SFNT_Err_Invalid_Glyph_Index; + +#ifdef FT_CONFIG_OPTION_POSTSCRIPT_NAMES + psnames = (FT_Service_PsCMaps)face->psnames; + if ( !psnames ) + return SFNT_Err_Unimplemented_Feature; +#endif + + names = &face->postscript_names; + + /* `.notdef' by default */ + *PSname = MAC_NAME( 0 ); + + format = face->postscript.FormatType; + + if ( format == 0x00010000L ) + { + if ( idx < 258 ) /* paranoid checking */ + *PSname = MAC_NAME( idx ); + } + else if ( format == 0x00020000L ) + { + TT_Post_20 table = &names->names.format_20; + + + if ( !names->loaded ) + { + error = load_post_names( face ); + if ( error ) + goto End; + } + + if ( idx < (FT_UInt)table->num_glyphs ) + { + FT_UShort name_index = table->glyph_indices[idx]; + + + if ( name_index < 258 ) + *PSname = MAC_NAME( name_index ); + else + *PSname = (FT_String*)table->glyph_names[name_index - 258]; + } + } + else if ( format == 0x00028000L ) + { + TT_Post_25 table = &names->names.format_25; + + + if ( !names->loaded ) + { + error = load_post_names( face ); + if ( error ) + goto End; + } + + if ( idx < (FT_UInt)table->num_glyphs ) /* paranoid checking */ + { + idx += table->offsets[idx]; + *PSname = MAC_NAME( idx ); + } + } + + /* nothing to do for format == 0x00030000L */ + + End: + return SFNT_Err_Ok; + } + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/sfnt/ttpost.h b/src/WinLibs/freetype-2.3.5/src/sfnt/ttpost.h new file mode 100644 index 000000000..6f06d75a7 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/src/sfnt/ttsbit.c b/src/WinLibs/freetype-2.3.5/src/sfnt/ttsbit.c new file mode 100644 index 000000000..eff49dadd --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/sfnt/ttsbit.c @@ -0,0 +1,1501 @@ +/***************************************************************************/ +/* */ +/* ttsbit.c */ +/* */ +/* TrueType and OpenType embedded bitmap support (body). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + +#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 + */ +#if !defined 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_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 = target->rows; 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 ) || + 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 0; + } + } + + 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 ); + + 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 */ + FT_Stream_Skip( stream, 1L ); + /* 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/src/WinLibs/freetype-2.3.5/src/sfnt/ttsbit.h b/src/WinLibs/freetype-2.3.5/src/sfnt/ttsbit.h new file mode 100644 index 000000000..c6067c0e3 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. 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 ); + +#if defined FT_CONFIG_OPTION_OLD_INTERNALS + FT_LOCAL( FT_Error ) + tt_find_sbit_image( TT_Face face, + FT_UInt glyph_index, + FT_ULong strike_index, + TT_SBit_Range *arange, + TT_SBit_Strike *astrike, + FT_ULong *aglyph_offset ); + + FT_LOCAL( FT_Error ) + tt_load_sbit_metrics( FT_Stream stream, + TT_SBit_Range range, + TT_SBit_Metrics metrics ); + +#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */ + + FT_LOCAL( FT_Error ) + tt_face_load_sbit_image( TT_Face face, + FT_ULong strike_index, + FT_UInt glyph_index, + FT_UInt load_flags, + FT_Stream stream, + FT_Bitmap *map, + TT_SBit_MetricsRec *metrics ); + + +FT_END_HEADER + +#endif /* __TTSBIT_H__ */ + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/sfnt/ttsbit0.c b/src/WinLibs/freetype-2.3.5/src/sfnt/ttsbit0.c new file mode 100644 index 000000000..f8adc64a7 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/sfnt/ttsbit0.c @@ -0,0 +1,996 @@ +/***************************************************************************/ +/* */ +/* ttsbit0.c */ +/* */ +/* TrueType and OpenType embedded bitmap support (body). */ +/* This is a heap-optimized version. */ +/* */ +/* Copyright 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. */ +/* */ +/***************************************************************************/ + + +/* This file is included by ttsbit.c */ + + +#include <ft2build.h> +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_STREAM_H +#include FT_TRUETYPE_TAGS_H +#include "ttsbit.h" + +#include "sferrors.h" + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_ttsbit + + + static const FT_Frame_Field tt_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 tt_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 tt_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 + }; + + + FT_LOCAL_DEF( FT_Error ) + tt_face_load_eblc( TT_Face face, + FT_Stream stream ) + { + FT_Error error = SFNT_Err_Ok; + FT_Fixed version; + FT_ULong num_strikes, table_size; + FT_Byte* p; + FT_Byte* p_limit; + FT_UInt count; + + + face->sbit_num_strikes = 0; + + /* this table is optional */ + error = face->goto_table( face, TTAG_EBLC, stream, &table_size ); + if ( error ) + error = face->goto_table( face, TTAG_bloc, stream, &table_size ); + if ( error ) + goto Exit; + + if ( table_size < 8 ) + { + FT_ERROR(( "%s: table too short!\n", "tt_face_load_sbit_strikes" )); + error = SFNT_Err_Invalid_File_Format; + goto Exit; + } + + if ( FT_FRAME_EXTRACT( table_size, face->sbit_table ) ) + goto Exit; + + face->sbit_table_size = table_size; + + p = face->sbit_table; + p_limit = p + table_size; + + version = FT_NEXT_ULONG( p ); + num_strikes = FT_NEXT_ULONG( p ); + + if ( version != 0x00020000UL || num_strikes >= 0x10000UL ) + { + FT_ERROR(( "%s: invalid table version!\n", + "tt_face_load_sbit_strikes" )); + error = SFNT_Err_Invalid_File_Format; + goto Fail; + } + + /* + * Count the number of strikes available in the table. We are a bit + * paranoid there and don't trust the data. + */ + count = (FT_UInt)num_strikes; + if ( 8 + 48UL * count > table_size ) + count = (FT_UInt)( ( p_limit - p ) / 48 ); + + face->sbit_num_strikes = count; + + FT_TRACE3(( "sbit_num_strikes: %u\n", count )); + Exit: + return error; + + Fail: + FT_FRAME_RELEASE( face->sbit_table ); + face->sbit_table_size = 0; + goto Exit; + } + + + FT_LOCAL_DEF( void ) + tt_face_free_eblc( TT_Face face ) + { + FT_Stream stream = face->root.stream; + + + FT_FRAME_RELEASE( face->sbit_table ); + face->sbit_table_size = 0; + face->sbit_num_strikes = 0; + } + + + FT_LOCAL_DEF( FT_Error ) + tt_face_set_sbit_strike( TT_Face face, + FT_Size_Request req, + FT_ULong* astrike_index ) + { + return FT_Match_Size( (FT_Face)face, req, 0, astrike_index ); + } + + + FT_LOCAL_DEF( FT_Error ) + tt_face_load_strike_metrics( TT_Face face, + FT_ULong strike_index, + FT_Size_Metrics* metrics ) + { + FT_Byte* strike; + + + if ( strike_index >= (FT_ULong)face->sbit_num_strikes ) + return SFNT_Err_Invalid_Argument; + + strike = face->sbit_table + 8 + strike_index * 48; + + metrics->x_ppem = (FT_UShort)strike[44]; + metrics->y_ppem = (FT_UShort)strike[45]; + + metrics->ascender = (FT_Char)strike[16] << 6; /* hori.ascender */ + metrics->descender = (FT_Char)strike[17] << 6; /* hori.descender */ + metrics->height = metrics->ascender - metrics->descender; + + /* XXX: Is this correct? */ + metrics->max_advance = ( (FT_Char)strike[22] + /* min_origin_SB */ + strike[18] + /* max_width */ + (FT_Char)strike[23] /* min_advance_SB */ + ) << 6; + + return SFNT_Err_Ok; + } + + + typedef struct + { + TT_Face face; + FT_Stream stream; + FT_Bitmap* bitmap; + TT_SBit_Metrics metrics; + FT_Bool metrics_loaded; + FT_Bool bitmap_allocated; + FT_Byte bit_depth; + + FT_ULong ebdt_start; + FT_ULong ebdt_size; + + FT_ULong strike_index_array; + FT_ULong strike_index_count; + FT_Byte* eblc_base; + FT_Byte* eblc_limit; + + } TT_SBitDecoderRec, *TT_SBitDecoder; + + + static FT_Error + tt_sbit_decoder_init( TT_SBitDecoder decoder, + TT_Face face, + FT_ULong strike_index, + TT_SBit_MetricsRec* metrics ) + { + FT_Error error; + FT_Stream stream = face->root.stream; + FT_ULong ebdt_size; + + + error = face->goto_table( face, TTAG_EBDT, stream, &ebdt_size ); + if ( error ) + error = face->goto_table( face, TTAG_bdat, stream, &ebdt_size ); + if ( error ) + goto Exit; + + decoder->face = face; + decoder->stream = stream; + decoder->bitmap = &face->root.glyph->bitmap; + decoder->metrics = metrics; + + decoder->metrics_loaded = 0; + decoder->bitmap_allocated = 0; + + decoder->ebdt_start = FT_STREAM_POS(); + decoder->ebdt_size = ebdt_size; + + decoder->eblc_base = face->sbit_table; + decoder->eblc_limit = face->sbit_table + face->sbit_table_size; + + /* now find the strike corresponding to the index */ + { + FT_Byte* p; + + + if ( 8 + 48 * strike_index + 3 * 4 + 34 + 1 > face->sbit_table_size ) + { + error = SFNT_Err_Invalid_File_Format; + goto Exit; + } + + p = decoder->eblc_base + 8 + 48 * strike_index; + + decoder->strike_index_array = FT_NEXT_ULONG( p ); + p += 4; + decoder->strike_index_count = FT_NEXT_ULONG( p ); + p += 34; + decoder->bit_depth = *p; + + if ( decoder->strike_index_array > face->sbit_table_size || + decoder->strike_index_array + 8 * decoder->strike_index_count > + face->sbit_table_size ) + error = SFNT_Err_Invalid_File_Format; + } + + Exit: + return error; + } + + + static void + tt_sbit_decoder_done( TT_SBitDecoder decoder ) + { + FT_UNUSED( decoder ); + } + + + static FT_Error + tt_sbit_decoder_alloc_bitmap( TT_SBitDecoder decoder ) + { + FT_Error error = SFNT_Err_Ok; + FT_UInt width, height; + FT_Bitmap* map = decoder->bitmap; + FT_Long size; + + + if ( !decoder->metrics_loaded ) + { + error = SFNT_Err_Invalid_Argument; + goto Exit; + } + + width = decoder->metrics->width; + height = decoder->metrics->height; + + map->width = (int)width; + map->rows = (int)height; + + switch ( decoder->bit_depth ) + { + case 1: + map->pixel_mode = FT_PIXEL_MODE_MONO; + map->pitch = ( map->width + 7 ) >> 3; + break; + + case 2: + map->pixel_mode = FT_PIXEL_MODE_GRAY2; + map->pitch = ( map->width + 3 ) >> 2; + break; + + case 4: + map->pixel_mode = FT_PIXEL_MODE_GRAY4; + map->pitch = ( map->width + 1 ) >> 1; + break; + + case 8: + map->pixel_mode = FT_PIXEL_MODE_GRAY; + map->pitch = map->width; + break; + + default: + error = SFNT_Err_Invalid_File_Format; + goto Exit; + } + + size = map->rows * map->pitch; + + /* check that there is no empty image */ + if ( size == 0 ) + goto Exit; /* exit successfully! */ + + error = ft_glyphslot_alloc_bitmap( decoder->face->root.glyph, size ); + if ( error ) + goto Exit; + + decoder->bitmap_allocated = 1; + + Exit: + return error; + } + + + static FT_Error + tt_sbit_decoder_load_metrics( TT_SBitDecoder decoder, + FT_Byte* *pp, + FT_Byte* limit, + FT_Bool big ) + { + FT_Byte* p = *pp; + TT_SBit_Metrics metrics = decoder->metrics; + + + if ( p + 5 > limit ) + goto Fail; + + if ( !decoder->metrics_loaded ) + { + metrics->height = p[0]; + metrics->width = p[1]; + metrics->horiBearingX = (FT_Char)p[2]; + metrics->horiBearingY = (FT_Char)p[3]; + metrics->horiAdvance = p[4]; + } + + p += 5; + if ( big ) + { + if ( p + 3 > limit ) + goto Fail; + + if ( !decoder->metrics_loaded ) + { + metrics->vertBearingX = (FT_Char)p[0]; + metrics->vertBearingY = (FT_Char)p[1]; + metrics->vertAdvance = p[2]; + } + + p += 3; + } + + decoder->metrics_loaded = 1; + *pp = p; + return 0; + + Fail: + return SFNT_Err_Invalid_Argument; + } + + + /* forward declaration */ + static FT_Error + tt_sbit_decoder_load_image( TT_SBitDecoder decoder, + FT_UInt glyph_index, + FT_Int x_pos, + FT_Int y_pos ); + + typedef FT_Error (*TT_SBitDecoder_LoadFunc)( TT_SBitDecoder decoder, + FT_Byte* p, + FT_Byte* plimit, + FT_Int x_pos, + FT_Int y_pos ); + + + static FT_Error + tt_sbit_decoder_load_byte_aligned( TT_SBitDecoder decoder, + FT_Byte* p, + FT_Byte* limit, + FT_Int x_pos, + FT_Int y_pos ) + { + FT_Error error = SFNT_Err_Ok; + FT_Byte* line; + FT_Int bit_height, bit_width, pitch, width, height, h; + FT_Bitmap* bitmap; + + + if ( !decoder->bitmap_allocated ) + { + error = tt_sbit_decoder_alloc_bitmap( decoder ); + if ( error ) + goto Exit; + } + + /* check that we can write the glyph into the bitmap */ + bitmap = decoder->bitmap; + bit_width = bitmap->width; + bit_height = bitmap->rows; + pitch = bitmap->pitch; + line = bitmap->buffer; + + width = decoder->metrics->width; + height = decoder->metrics->height; + + if ( x_pos < 0 || x_pos + width > bit_width || + y_pos < 0 || y_pos + height > bit_height ) + { + error = SFNT_Err_Invalid_File_Format; + goto Exit; + } + + if ( p + ( ( width + 7 ) >> 3 ) * height > limit ) + { + error = SFNT_Err_Invalid_File_Format; + goto Exit; + } + + /* now do the blit */ + line += y_pos * pitch + ( x_pos >> 3 ); + x_pos &= 7; + + if ( x_pos == 0 ) /* the easy one */ + { + for ( h = height; h > 0; h--, line += pitch ) + { + FT_Byte* write = line; + FT_Int w; + + + for ( w = width; w >= 8; w -= 8 ) + { + write[0] = (FT_Byte)( write[0] | *p++ ); + write += 1; + } + + if ( w > 0 ) + write[0] = (FT_Byte)( write[0] | ( *p++ & ( 0xFF00U >> w ) ) ); + } + } + else /* x_pos > 0 */ + { + for ( h = height; h > 0; h--, line += pitch ) + { + FT_Byte* write = line; + FT_Int w; + FT_UInt wval = 0; + + + for ( w = width; w >= 8; w -= 8 ) + { + wval = (FT_UInt)( wval | *p++ ); + write[0] = (FT_Byte)( write[0] | ( wval >> x_pos ) ); + write += 1; + wval <<= 8; + } + + if ( w > 0 ) + wval = (FT_UInt)( wval | ( *p++ & ( 0xFF00U >> w ) ) ); + + /* all bits read and there are ( x_pos + w ) bits to be written */ + + write[0] = (FT_Byte)( write[0] | ( wval >> x_pos ) ); + + if ( x_pos + w > 8 ) + { + write++; + wval <<= 8; + write[0] = (FT_Byte)( write[0] | ( wval >> x_pos ) ); + } + } + } + + Exit: + return error; + } + + + static FT_Error + tt_sbit_decoder_load_bit_aligned( TT_SBitDecoder decoder, + FT_Byte* p, + FT_Byte* limit, + FT_Int x_pos, + FT_Int y_pos ) + { + FT_Error error = SFNT_Err_Ok; + FT_Byte* line; + FT_Int bit_height, bit_width, pitch, width, height, h, nbits; + FT_Bitmap* bitmap; + FT_UShort rval; + + + if ( !decoder->bitmap_allocated ) + { + error = tt_sbit_decoder_alloc_bitmap( decoder ); + if ( error ) + goto Exit; + } + + /* check that we can write the glyph into the bitmap */ + bitmap = decoder->bitmap; + bit_width = bitmap->width; + bit_height = bitmap->rows; + pitch = bitmap->pitch; + line = bitmap->buffer; + + width = decoder->metrics->width; + height = decoder->metrics->height; + + if ( x_pos < 0 || x_pos + width > bit_width || + y_pos < 0 || y_pos + height > bit_height ) + { + error = SFNT_Err_Invalid_File_Format; + goto Exit; + } + + if ( p + ( ( width * height + 7 ) >> 3 ) > limit ) + { + error = SFNT_Err_Invalid_File_Format; + goto Exit; + } + + /* now do the blit */ + line += y_pos * pitch + ( x_pos >> 3 ); + x_pos &= 7; + + /* the higher byte of `rval' is used as a buffer */ + rval = 0; + nbits = 0; + + for ( h = height; h > 0; h--, line += pitch ) + { + FT_Byte* write = line; + FT_Int w = width; + + + if ( x_pos ) + { + w = ( width < 8 - x_pos ) ? width : 8 - x_pos; + + if ( nbits < w ) + { + rval |= *p++; + nbits += 8 - w; + } + else + { + rval >>= 8; + nbits -= w; + } + + *write++ |= ( ( rval >> nbits ) & 0xFF ) & ~( 0xFF << w ); + rval <<= 8; + + w = width - w; + } + + for ( ; w >= 8; w -= 8 ) + { + rval |= *p++; + *write++ |= ( rval >> nbits ) & 0xFF; + + rval <<= 8; + } + + if ( w > 0 ) + { + if ( nbits < w ) + { + rval |= *p++; + *write |= ( ( rval >> nbits ) & 0xFF ) & ( 0xFF00U >> w ); + nbits += 8 - w; + + rval <<= 8; + } + else + { + *write |= ( ( rval >> nbits ) & 0xFF ) & ( 0xFF00U >> w ); + nbits -= w; + } + } + } + + Exit: + return error; + } + + + static FT_Error + tt_sbit_decoder_load_compound( TT_SBitDecoder decoder, + FT_Byte* p, + FT_Byte* limit, + FT_Int x_pos, + FT_Int y_pos ) + { + FT_Error error = SFNT_Err_Ok; + FT_UInt num_components, nn; + + + if ( p + 2 > limit ) + goto Fail; + + num_components = FT_NEXT_USHORT( p ); + if ( p + 4 * num_components > limit ) + goto Fail; + + for ( nn = 0; nn < num_components; nn++ ) + { + FT_UInt gindex = FT_NEXT_USHORT( p ); + FT_Byte dx = FT_NEXT_BYTE( p ); + FT_Byte dy = FT_NEXT_BYTE( p ); + + + /* NB: a recursive call */ + error = tt_sbit_decoder_load_image( decoder, gindex, + x_pos + dx, y_pos + dy ); + if ( error ) + break; + } + + Exit: + return error; + + Fail: + error = SFNT_Err_Invalid_File_Format; + goto Exit; + } + + + static FT_Error + tt_sbit_decoder_load_bitmap( TT_SBitDecoder decoder, + FT_UInt glyph_format, + FT_ULong glyph_start, + FT_ULong glyph_size, + FT_Int x_pos, + FT_Int y_pos ) + { + FT_Error error; + FT_Stream stream = decoder->stream; + FT_Byte* p; + FT_Byte* p_limit; + FT_Byte* data; + + + /* seek into the EBDT table now */ + if ( glyph_start + glyph_size > decoder->ebdt_size ) + { + error = SFNT_Err_Invalid_Argument; + goto Exit; + } + + if ( FT_STREAM_SEEK( decoder->ebdt_start + glyph_start ) || + FT_FRAME_EXTRACT( glyph_size, data ) ) + goto Exit; + + p = data; + p_limit = p + glyph_size; + + /* read the data, depending on the glyph format */ + switch ( glyph_format ) + { + case 1: + case 2: + case 8: + error = tt_sbit_decoder_load_metrics( decoder, &p, p_limit, 0 ); + break; + + case 6: + case 7: + case 9: + error = tt_sbit_decoder_load_metrics( decoder, &p, p_limit, 1 ); + break; + + default: + error = SFNT_Err_Ok; + } + + if ( error ) + goto Fail; + + { + TT_SBitDecoder_LoadFunc loader; + + + switch ( glyph_format ) + { + case 1: + case 6: + loader = tt_sbit_decoder_load_byte_aligned; + break; + + case 2: + case 5: + case 7: + loader = tt_sbit_decoder_load_bit_aligned; + break; + + case 8: + if ( p + 1 > p_limit ) + goto Fail; + + p += 1; /* skip padding */ + /* fall-through */ + + case 9: + loader = tt_sbit_decoder_load_compound; + break; + + default: + goto Fail; + } + + error = loader( decoder, p, p_limit, x_pos, y_pos ); + } + + Fail: + FT_FRAME_RELEASE( data ); + + Exit: + return error; + } + + + static FT_Error + tt_sbit_decoder_load_image( TT_SBitDecoder decoder, + FT_UInt glyph_index, + FT_Int x_pos, + FT_Int y_pos ) + { + /* + * First, we find the correct strike range that applies to this + * glyph index. + */ + + FT_Byte* p = decoder->eblc_base + decoder->strike_index_array; + FT_Byte* p_limit = decoder->eblc_limit; + FT_ULong num_ranges = decoder->strike_index_count; + FT_UInt start, end, index_format, image_format; + FT_ULong image_start = 0, image_end = 0, image_offset; + + + for ( ; num_ranges > 0; num_ranges-- ) + { + start = FT_NEXT_USHORT( p ); + end = FT_NEXT_USHORT( p ); + + if ( glyph_index >= start && glyph_index <= end ) + goto FoundRange; + + p += 4; /* ignore index offset */ + } + goto NoBitmap; + + FoundRange: + image_offset = FT_NEXT_ULONG( p ); + + /* overflow check */ + if ( decoder->eblc_base + decoder->strike_index_array + image_offset < + decoder->eblc_base ) + goto Failure; + + p = decoder->eblc_base + decoder->strike_index_array + image_offset; + if ( p + 8 > p_limit ) + goto NoBitmap; + + /* now find the glyph's location and extend within the ebdt table */ + index_format = FT_NEXT_USHORT( p ); + image_format = FT_NEXT_USHORT( p ); + image_offset = FT_NEXT_ULONG ( p ); + + switch ( index_format ) + { + case 1: /* 4-byte offsets relative to `image_offset' */ + { + p += 4 * ( glyph_index - start ); + if ( p + 8 > p_limit ) + goto NoBitmap; + + image_start = FT_NEXT_ULONG( p ); + image_end = FT_NEXT_ULONG( p ); + + if ( image_start == image_end ) /* missing glyph */ + goto NoBitmap; + } + break; + + case 2: /* big metrics, constant image size */ + { + FT_ULong image_size; + + + if ( p + 12 > p_limit ) + goto NoBitmap; + + image_size = FT_NEXT_ULONG( p ); + + if ( tt_sbit_decoder_load_metrics( decoder, &p, p_limit, 1 ) ) + goto NoBitmap; + + image_start = image_size * ( glyph_index - start ); + image_end = image_start + image_size; + } + break; + + case 3: /* 2-byte offsets relative to 'image_offset' */ + { + p += 2 * ( glyph_index - start ); + if ( p + 4 > p_limit ) + goto NoBitmap; + + image_start = FT_NEXT_USHORT( p ); + image_end = FT_NEXT_USHORT( p ); + + if ( image_start == image_end ) /* missing glyph */ + goto NoBitmap; + } + break; + + case 4: /* sparse glyph array with (glyph,offset) pairs */ + { + FT_ULong mm, num_glyphs; + + + if ( p + 4 > p_limit ) + goto NoBitmap; + + num_glyphs = FT_NEXT_ULONG( p ); + + /* overflow check */ + if ( p + ( num_glyphs + 1 ) * 4 < p ) + goto Failure; + + if ( p + ( num_glyphs + 1 ) * 4 > p_limit ) + goto NoBitmap; + + for ( mm = 0; mm < num_glyphs; mm++ ) + { + FT_UInt gindex = FT_NEXT_USHORT( p ); + + + if ( gindex == glyph_index ) + { + image_start = FT_NEXT_USHORT( p ); + p += 2; + image_end = FT_PEEK_USHORT( p ); + break; + } + p += 2; + } + + if ( mm >= num_glyphs ) + goto NoBitmap; + } + break; + + case 5: /* constant metrics with sparse glyph codes */ + { + FT_ULong image_size, mm, num_glyphs; + + + if ( p + 16 > p_limit ) + goto NoBitmap; + + image_size = FT_NEXT_ULONG( p ); + + if ( tt_sbit_decoder_load_metrics( decoder, &p, p_limit, 1 ) ) + goto NoBitmap; + + num_glyphs = FT_NEXT_ULONG( p ); + + /* overflow check */ + if ( p + 2 * num_glyphs < p ) + goto Failure; + + if ( p + 2 * num_glyphs > p_limit ) + goto NoBitmap; + + for ( mm = 0; mm < num_glyphs; mm++ ) + { + FT_UInt gindex = FT_NEXT_USHORT( p ); + + + if ( gindex == glyph_index ) + break; + } + + if ( mm >= num_glyphs ) + goto NoBitmap; + + image_start = image_size * mm; + image_end = image_start + image_size; + } + break; + + default: + goto NoBitmap; + } + + if ( image_start > image_end ) + goto NoBitmap; + + image_end -= image_start; + image_start = image_offset + image_start; + + return tt_sbit_decoder_load_bitmap( decoder, + image_format, + image_start, + image_end, + x_pos, + y_pos ); + + Failure: + return SFNT_Err_Invalid_Table; + + NoBitmap: + return SFNT_Err_Invalid_Argument; + } + + + FT_LOCAL( FT_Error ) + tt_face_load_sbit_image( TT_Face face, + FT_ULong strike_index, + FT_UInt glyph_index, + FT_UInt load_flags, + FT_Stream stream, + FT_Bitmap *map, + TT_SBit_MetricsRec *metrics ) + { + TT_SBitDecoderRec decoder[1]; + FT_Error error; + + FT_UNUSED( load_flags ); + FT_UNUSED( stream ); + FT_UNUSED( map ); + + + error = tt_sbit_decoder_init( decoder, face, strike_index, metrics ); + if ( !error ) + { + error = tt_sbit_decoder_load_image( decoder, glyph_index, 0, 0 ); + tt_sbit_decoder_done( decoder ); + } + + return error; + } + +/* EOF */ diff --git a/src/WinLibs/freetype-2.3.5/src/smooth/Jamfile b/src/WinLibs/freetype-2.3.5/src/smooth/Jamfile new file mode 100644 index 000000000..8a792df05 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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 ; + } + else + { + _sources = smooth ; + } + + Library $(FT2_LIB) : $(_sources).c ; +} + +# end of src/smooth Jamfile diff --git a/src/WinLibs/freetype-2.3.5/src/smooth/ftgrays.c b/src/WinLibs/freetype-2.3.5/src/smooth/ftgrays.c new file mode 100644 index 000000000..5a4a544e5 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/smooth/ftgrays.c @@ -0,0 +1,1983 @@ +/***************************************************************************/ +/* */ +/* ftgrays.c */ +/* */ +/* A new `perfect' anti-aliasing renderer (body). */ +/* */ +/* Copyright 2000-2001, 2002, 2003, 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. */ +/* */ +/***************************************************************************/ + + /*************************************************************************/ + /* */ + /* 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_ + +#include <string.h> /* for ft_memcpy() */ +#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) + + /* 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 */ +#endif + +#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" + +#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_Bad_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 + + /* define this to dump debugging information */ +#define xxxDEBUG_GRAYS + + + /* 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, + +#define ras (*worker) + + +#else /* FT_STATIC_RASTER */ + + +#define RAS_ARG /* empty */ +#define RAS_ARG_ /* empty */ +#define RAS_VAR /* empty */ +#define RAS_VAR_ /* empty */ + + static TWorker ras; + + +#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 int 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_ + { + int x; + int 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; + int cover; + int invalid; + + PCell cells; + int max_cells; + int 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; + int ycount; + + } TWorker, *PWorker; + + + 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; + int x = ras.ex; + + + if ( x > ras.max_ex ) + x = ras.max_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; + long p, first, dx; + int incr, lift, mod, rem; + + + 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; + TPos dx, dy, x, x2; + long p, first; + int delta, rem, mod, 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 ); + TPos 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, 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, 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( worker ); + + /* start to a new position */ + x = UPSCALE( to->x ); + y = UPSCALE( to->y ); + + gray_start_cell( worker, 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( worker, 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( worker, 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( worker, 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, + int 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 >= 32768 ) + x = 32767; + + 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 ); + /* ras.render_span( span->y, ras.gray_spans, count ); */ + +#ifdef DEBUG_GRAYS + + if ( ras.span_y >= 0 ) + { + int n; + + + fprintf( stderr, "y=%3d ", ras.span_y ); + span = ras.gray_spans; + for ( n = 0; n < count; n++, span++ ) + fprintf( stderr, "[%d..%d]:%02x ", + span->x, span->x + span->len - 1, span->coverage ); + fprintf( stderr, "\n" ); + } + +#endif /* DEBUG_GRAYS */ + + ras.num_gray_spans = 0; + ras.span_y = 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 DEBUG_GRAYS + + /* to be called while in the debugger */ + 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( " (%3d, c:%4d, a:%6d)", cell->x, cell->cover, cell->area ); + printf( "\n" ); + } + } + +#endif /* DEBUG_GRAYS */ + + + 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; + + for ( yindex = 0; yindex < ras.ycount; yindex++ ) + { + PCell cell = ras.ycells[yindex]; + TCoord cover = 0; + TCoord x = 0; + + + for ( ; cell != NULL; cell = cell->next ) + { + TArea 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 ); + } + + +#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> */ + /* Walks over an outline's structure to decompose it into individual */ + /* segments and Bezier 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. */ + /* */ + /* 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 +#if 0 +#define SCALED( x ) ( ( (x) << shift ) - delta ) +#else +#define SCALED( x ) (x) +#endif + + FT_Vector v_last; + FT_Vector v_control; + FT_Vector v_start; + + FT_Vector* point; + FT_Vector* limit; + char* tags; + + int n; /* index of contour in outline */ + int first; /* index of first point in contour */ + int error; + char tag; /* current point's state */ + +#if 0 + int shift = func_interface->shift; + TPos delta = func_interface->delta; +#endif + + + first = 0; + + for ( n = 0; n < outline->n_contours; n++ ) + { + int last; /* index of last point in contour */ + + + last = outline->contours[n]; + limit = outline->points + last; + + v_start = outline->points[first]; + v_last = outline->points[last]; + + v_start.x = SCALED( v_start.x ); + v_start.y = SCALED( v_start.y ); + + 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--; + } + + 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 ); + + 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 ) + { + 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; + + error = func_interface->conic_to( &v_control, &v_middle, + user ); + if ( error ) + goto Exit; + + v_control = vec; + goto Do_Conic; + } + + 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 ); + + error = func_interface->cubic_to( &vec1, &vec2, &vec, user ); + if ( error ) + goto Exit; + continue; + } + + error = func_interface->cubic_to( &vec1, &vec2, &v_start, user ); + goto Close; + } + } + } + + /* close the contour with a line segment */ + error = func_interface->line_to( &v_start, user ); + + Close: + if ( error ) + goto Exit; + + first = last + 1; + } + + return 0; + + Exit: + return error; + + Invalid_Outline: + return ErrRaster_Invalid_Outline; + } + +#endif /* _STANDALONE_ */ + + + typedef struct TBand_ + { + TPos min, max; + + } TBand; + + + static int + gray_convert_glyph_inner( RAS_ARG ) + { + static + const FT_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 + }; + + volatile int error = 0; + + 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; + } + + /* setup 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 DEBUG_GRAYS + fprintf( stderr, "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; + + /* return immediately if the outline is empty */ + if ( outline->n_points == 0 || outline->n_contours <= 0 ) + return 0; + + if ( !outline || !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 ) == 0 ) + { + 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 ) == 0 ) + { + /* 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( worker, 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 ( target_map ) + ras.target = *target_map; + + ras.render_span = (FT_Raster_Span_Func)gray_render_span; + ras.render_span_data = &ras; + + if ( params->flags & FT_RASTER_FLAG_DIRECT ) + { + ras.render_span = (FT_Raster_Span_Func)params->gray_spans; + ras.render_span_data = params->user; + } + + return gray_convert_glyph( worker ); + } + + + /**** RASTER OBJECT CREATION: In standalone 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; + } + } + } + + + const FT_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 */ diff --git a/src/WinLibs/freetype-2.3.5/src/smooth/ftgrays.h b/src/WinLibs/freetype-2.3.5/src/smooth/ftgrays.h new file mode 100644 index 000000000..2d409543d --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/smooth/ftgrays.h @@ -0,0 +1,57 @@ +/***************************************************************************/ +/* */ +/* 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_IMAGE_H +#endif + + + /*************************************************************************/ + /* */ + /* To make ftgrays.h independent from configuration files we check */ + /* whether FT_EXPORT_VAR has been defined already. */ + /* */ + /* On some systems and compilers (Win32 mostly), an extra keyword is */ + /* necessary to compile the library as a DLL. */ + /* */ +#ifndef FT_EXPORT_VAR +#define FT_EXPORT_VAR( x ) extern x +#endif + + FT_EXPORT_VAR( const FT_Raster_Funcs ) ft_grays_raster; + + +#ifdef __cplusplus + } +#endif + +#endif /* __FTGRAYS_H__ */ + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/smooth/ftsmerrs.h b/src/WinLibs/freetype-2.3.5/src/smooth/ftsmerrs.h new file mode 100644 index 000000000..0c2a2ecd9 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/src/smooth/ftsmooth.c b/src/WinLibs/freetype-2.3.5/src/smooth/ftsmooth.c new file mode 100644 index 000000000..85d04eb45 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/smooth/ftsmooth.c @@ -0,0 +1,467 @@ +/***************************************************************************/ +/* */ +/* ftsmooth.c */ +/* */ +/* Anti-aliasing renderer interface (body). */ +/* */ +/* Copyright 2000-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. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_INTERNAL_OBJECTS_H +#include FT_OUTLINE_H +#include "ftsmooth.h" +#include "ftgrays.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, depends on pixel format */ + 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 + + 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-- ) + { + memcpy( write, read, pitch ); + write += pitch; + + memcpy( write, read, pitch ); + write += pitch; + + memcpy( write, read, pitch ); + write += pitch; + read += pitch; + } + } + +#endif /* !FT_CONFIG_OPTION_SUBPIXEL_RENDERING */ + + FT_Outline_Translate( outline, x_shift, y_shift ); + + if ( error ) + goto Exit; + + slot->format = FT_GLYPH_FORMAT_BITMAP; + slot->bitmap_left = x_left; + slot->bitmap_top = 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_CALLBACK_TABLE_DEF + const FT_Renderer_Class 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 + }; + + + FT_CALLBACK_TABLE_DEF + const FT_Renderer_Class 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 + }; + + + + FT_CALLBACK_TABLE_DEF + const FT_Renderer_Class 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 + }; + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/smooth/ftsmooth.h b/src/WinLibs/freetype-2.3.5/src/smooth/ftsmooth.h new file mode 100644 index 000000000..62cced448 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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_EXPORT_VAR( const FT_Renderer_Class ) ft_std_renderer_class; +#endif + +#ifndef FT_CONFIG_OPTION_NO_SMOOTH_RASTER + FT_EXPORT_VAR( const FT_Renderer_Class ) ft_smooth_renderer_class; + + FT_EXPORT_VAR( const FT_Renderer_Class ) ft_smooth_lcd_renderer_class; + + FT_EXPORT_VAR( const FT_Renderer_Class ) ft_smooth_lcd_v_renderer_class; +#endif + + + +FT_END_HEADER + +#endif /* __FTSMOOTH_H__ */ + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/smooth/module.mk b/src/WinLibs/freetype-2.3.5/src/smooth/module.mk new file mode 100644 index 000000000..05ad4ba0a --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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_smooth_renderer_class$(CLOSE_DRIVER) +$(ECHO_DRIVER)smooth $(ECHO_DRIVER_DESC)anti-aliased bitmap renderer$(ECHO_DRIVER_DONE) +$(OPEN_DRIVER)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_smooth_lcdv_renderer_class$(CLOSE_DRIVER) +$(ECHO_DRIVER)smooth $(ECHO_DRIVER_DESC)anti-aliased bitmap renderer for vertical LCDs$(ECHO_DRIVER_DONE) +endef + +# EOF diff --git a/src/WinLibs/freetype-2.3.5/src/smooth/rules.mk b/src/WinLibs/freetype-2.3.5/src/smooth/rules.mk new file mode 100644 index 000000000..4f27f01db --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/src/smooth/smooth.c b/src/WinLibs/freetype-2.3.5/src/smooth/smooth.c new file mode 100644 index 000000000..ff6be3e40 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/smooth/smooth.c @@ -0,0 +1,26 @@ +/***************************************************************************/ +/* */ +/* smooth.c */ +/* */ +/* FreeType anti-aliasing rasterer module component (body only). */ +/* */ +/* Copyright 1996-2001 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#define FT_MAKE_OPTION_SINGLE_OBJECT + +#include <ft2build.h> +#include "ftgrays.c" +#include "ftsmooth.c" + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/tools/Jamfile b/src/WinLibs/freetype-2.3.5/src/tools/Jamfile new file mode 100644 index 000000000..475161e07 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/tools/Jamfile @@ -0,0 +1,5 @@ +# Jamfile for src/tools +# +SubDir FT2_TOP src tools ; + +Main apinames : apinames.c ; diff --git a/src/WinLibs/freetype-2.3.5/src/tools/apinames.c b/src/WinLibs/freetype-2.3.5/src/tools/apinames.c new file mode 100644 index 000000000..f08919bee --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/tools/apinames.c @@ -0,0 +1,443 @@ +/* + * This little program is used to parse the FreeType headers and + * find the declaration of all public APIs. This is easy, because + * they all look like the following: + * + * FT_EXPORT( return_type ) + * function_name( function arguments ); + * + * You must pass the list of header files as arguments. Wildcards are + * accepted if you are using GCC for compilation (and probably by + * other compilers too). + * + * Author: David Turner, 2005, 2006 + * + * This code is explicitly placed into the public domain. + * + */ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <ctype.h> + +#define PROGRAM_NAME "apinames" +#define PROGRAM_VERSION "0.1" + +#define LINEBUFF_SIZE 1024 + +typedef enum +{ + OUTPUT_LIST = 0, /* output the list of names, one per line */ + OUTPUT_WINDOWS_DEF, /* output a Windows .DEF file for Visual C++ or Mingw */ + OUTPUT_BORLAND_DEF, /* output a Windows .DEF file for Borland C++ */ + OUTPUT_WATCOM_LBC /* output a Watcom Linker Command File */ + +} OutputFormat; + + +static void +panic( const char* message ) +{ + fprintf( stderr, "PANIC: %s\n", message ); + exit(2); +} + + +typedef struct +{ + char* name; + unsigned int hash; + +} NameRec, *Name; + +static Name the_names; +static int num_names; +static int max_names; + +static void +names_add( const char* name, + const char* end ) +{ + int nn, len, h; + Name nm; + + if ( end <= name ) + return; + + /* compute hash value */ + len = (int)(end - name); + h = 0; + for ( nn = 0; nn < len; nn++ ) + h = h*33 + name[nn]; + + /* check for an pre-existing name */ + for ( nn = 0; nn < num_names; nn++ ) + { + nm = the_names + nn; + + if ( (int)nm->hash == h && + memcmp( name, nm->name, len ) == 0 && + nm->name[len] == 0 ) + return; + } + + /* add new name */ + if ( num_names >= max_names ) + { + max_names += (max_names >> 1) + 4; + the_names = (NameRec*)realloc( the_names, sizeof(the_names[0])*max_names ); + if ( the_names == NULL ) + panic( "not enough memory" ); + } + nm = &the_names[num_names++]; + + nm->hash = h; + nm->name = (char*)malloc( len+1 ); + if ( nm->name == NULL ) + panic( "not enough memory" ); + + memcpy( nm->name, name, len ); + nm->name[len] = 0; +} + + +static int +name_compare( const void* name1, + const void* name2 ) +{ + Name n1 = (Name)name1; + Name n2 = (Name)name2; + + return strcmp( n1->name, n2->name ); +} + +static void +names_sort( void ) +{ + qsort( the_names, (size_t)num_names, sizeof(the_names[0]), name_compare ); +} + + +static void +names_dump( FILE* out, + OutputFormat format, + const char* dll_name ) +{ + int nn; + + switch ( format ) + { + case OUTPUT_WINDOWS_DEF: + if ( dll_name ) + fprintf( out, "LIBRARY %s\n", dll_name ); + + fprintf( out, "DESCRIPTION FreeType 2 DLL\n" ); + fprintf( out, "EXPORTS\n" ); + for ( nn = 0; nn < num_names; nn++ ) + fprintf( out, " %s\n", the_names[nn].name ); + break; + + case OUTPUT_BORLAND_DEF: + if ( dll_name ) + fprintf( out, "LIBRARY %s\n", dll_name ); + + fprintf( out, "DESCRIPTION FreeType 2 DLL\n" ); + fprintf( out, "EXPORTS\n" ); + for ( nn = 0; nn < num_names; nn++ ) + fprintf( out, " _%s\n", the_names[nn].name ); + break; + + case OUTPUT_WATCOM_LBC: + { + /* we must omit the .dll suffix from the library name */ + char temp[512]; + char* dot; + + if ( dll_name == NULL ) + { + fprintf( stderr, + "you must provide a DLL name with the -d option !!\n" ); + exit(4); + } + + dot = strchr( dll_name, '.' ); + if ( dot != NULL ) + { + int len = (dot - dll_name); + if ( len > (int)(sizeof(temp)-1) ) + len = sizeof(temp)-1; + + memcpy( temp, dll_name, len ); + temp[len] = 0; + + dll_name = (const char*)temp; + } + + for ( nn = 0; nn < num_names; nn++ ) + fprintf( out, "++_%s.%s.%s\n", the_names[nn].name, dll_name, + the_names[nn].name ); + } + break; + + default: /* LIST */ + for ( nn = 0; nn < num_names; nn++ ) + fprintf( out, "%s\n", the_names[nn].name ); + } +} + + + + +/* states of the line parser */ + +typedef enum +{ + STATE_START = 0, /* waiting for FT_EXPORT keyword and return type */ + STATE_TYPE /* type was read, waiting for function name */ + +} State; + +static int +read_header_file( FILE* file, int verbose ) +{ + static char buff[ LINEBUFF_SIZE+1 ]; + State state = STATE_START; + + while ( !feof( file ) ) + { + char* p; + + if ( !fgets( buff, LINEBUFF_SIZE, file ) ) + break; + + p = buff; + + while ( *p && (*p == ' ' || *p == '\\') ) /* skip leading whitespace */ + p++; + + if ( *p == '\n' || *p == '\r' ) /* skip empty lines */ + continue; + + switch ( state ) + { + case STATE_START: + { + if ( memcmp( p, "FT_EXPORT(", 10 ) != 0 ) + break; + + p += 10; + for (;;) + { + if ( *p == 0 || *p == '\n' || *p == '\r' ) + goto NextLine; + + if ( *p == ')' ) + { + p++; + break; + } + + p++; + } + + state = STATE_TYPE; + + /* sometimes, the name is just after the FT_EXPORT(...), so + * skip whitespace, and fall-through if we find an alphanumeric + * character + */ + while ( *p == ' ' || *p == '\t' ) + p++; + + if ( !isalpha(*p) ) + break; + } + /* fall-through */ + + case STATE_TYPE: + { + char* name = p; + + while ( isalnum(*p) || *p == '_' ) + p++; + + if ( p > name ) + { + if ( verbose ) + fprintf( stderr, ">>> %.*s\n", p-name, name ); + + names_add( name, p ); + } + + state = STATE_START; + } + break; + + default: + ; + } + + NextLine: + ; + } + + return 0; +} + + +static void +usage( void ) +{ + static const char* const format = + "%s %s: extract FreeType API names from header files\n\n" + "this program is used to extract the list of public FreeType API\n" + "functions. It receives the list of header files as argument and\n" + "generates a sorted list of unique identifiers\n\n" + + "usage: %s header1 [options] [header2 ...]\n\n" + + "options: - : parse the content of stdin, ignore arguments\n" + " -v : verbose mode, output sent to standard error\n" + " -oFILE : write output to FILE instead of standard output\n" + " -dNAME : indicate DLL file name, 'freetype.dll' by default\n" + " -w : output .DEF file for Visual C++ and Mingw\n" + " -wB : output .DEF file for Borland C++\n" + " -wW : output Watcom Linker Response File\n" + "\n"; + + fprintf( stderr, + format, + PROGRAM_NAME, + PROGRAM_VERSION, + PROGRAM_NAME + ); + exit(1); +} + + +int main( int argc, const char* const* argv ) +{ + int from_stdin = 0; + int verbose = 0; + OutputFormat format = OUTPUT_LIST; /* the default */ + FILE* out = stdout; + const char* library_name = NULL; + + if ( argc < 2 ) + usage(); + + /* '-' used as a single argument means read source file from stdin */ + while ( argc > 1 && argv[1][0] == '-' ) + { + const char* arg = argv[1]; + + switch ( arg[1] ) + { + case 'v': + verbose = 1; + break; + + case 'o': + if ( arg[2] == 0 ) + { + if ( argc < 2 ) + usage(); + + arg = argv[2]; + argv++; + argc--; + } + else + arg += 2; + + out = fopen( arg, "wt" ); + if ( out == NULL ) + { + fprintf( stderr, "could not open '%s' for writing\n", argv[2] ); + exit(3); + } + break; + + case 'd': + if ( arg[2] == 0 ) + { + if ( argc < 2 ) + usage(); + + arg = argv[2]; + argv++; + argc--; + } + else + arg += 2; + + library_name = arg; + break; + + case 'w': + format = OUTPUT_WINDOWS_DEF; + switch ( arg[2] ) + { + case 'B': + format = OUTPUT_BORLAND_DEF; + break; + + case 'W': + format = OUTPUT_WATCOM_LBC; + break; + + case 0: + break; + + default: + usage(); + } + break; + + case 0: + from_stdin = 1; + break; + + default: + usage(); + } + + argc--; + argv++; + } + + if ( from_stdin ) + { + read_header_file( stdin, verbose ); + } + else + { + for ( --argc, argv++; argc > 0; argc--, argv++ ) + { + FILE* file = fopen( argv[0], "rb" ); + + if ( file == NULL ) + fprintf( stderr, "unable to open '%s'\n", argv[0] ); + else + { + if ( verbose ) + fprintf( stderr, "opening '%s'\n", argv[0] ); + + read_header_file( file, verbose ); + fclose( file ); + } + } + } + + if ( num_names == 0 ) + panic( "could not find exported functions !!\n" ); + + names_sort(); + names_dump( out, format, library_name ); + + if ( out != stdout ) + fclose( out ); + + return 0; +} diff --git a/src/WinLibs/freetype-2.3.5/src/tools/cordic.py b/src/WinLibs/freetype-2.3.5/src/tools/cordic.py new file mode 100644 index 000000000..3f80c5f09 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/tools/cordic.py @@ -0,0 +1,79 @@ +# compute arctangent table for CORDIC computations in fttrigon.c +import sys, math + +#units = 64*65536.0 # don't change !! +units = 256 +scale = units/math.pi +shrink = 1.0 +comma = "" + +def calc_val( x ): + global units, shrink + angle = math.atan(x) + shrink = shrink * math.cos(angle) + return angle/math.pi * units + +def print_val( n, x ): + global comma + + lo = int(x) + hi = lo + 1 + alo = math.atan(lo) + ahi = math.atan(hi) + ax = math.atan(2.0**n) + + errlo = abs( alo - ax ) + errhi = abs( ahi - ax ) + + if ( errlo < errhi ): + hi = lo + + sys.stdout.write( comma + repr( int(hi) ) ) + comma = ", " + + +print "" +print "table of arctan( 1/2^n ) for PI = " + repr(units/65536.0) + " units" + +# compute range of "i" +r = [-1] +r = r + range(32) + +for n in r: + + if n >= 0: + x = 1.0/(2.0**n) # tangent value + else: + x = 2.0**(-n) + + angle = math.atan(x) # arctangent + angle2 = angle*scale # arctangent in FT_Angle units + + # determine which integer value for angle gives the best tangent + lo = int(angle2) + hi = lo + 1 + tlo = math.tan(lo/scale) + thi = math.tan(hi/scale) + + errlo = abs( tlo - x ) + errhi = abs( thi - x ) + + angle2 = hi + if errlo < errhi: + angle2 = lo + + if angle2 <= 0: + break + + sys.stdout.write( comma + repr( int(angle2) ) ) + comma = ", " + + shrink = shrink * math.cos( angle2/scale) + + +print +print "shrink factor = " + repr( shrink ) +print "shrink factor 2 = " + repr( shrink * (2.0**32) ) +print "expansion factor = " + repr(1/shrink) +print "" + diff --git a/src/WinLibs/freetype-2.3.5/src/tools/docmaker/content.py b/src/WinLibs/freetype-2.3.5/src/tools/docmaker/content.py new file mode 100644 index 000000000..b14c52ede --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/tools/docmaker/content.py @@ -0,0 +1,588 @@ +# Content (c) 2002, 2004, 2006, 2007 David Turner <david@freetype.org> +# +# This file contains routines used to parse the content of documentation +# comment blocks and build more structured objects out of them. +# + +from sources import * +from utils import * +import string, re + + +# this regular expression is used to detect code sequences. these +# are simply code fragments embedded in '{' and '}' like in: +# +# { +# x = y + z; +# if ( zookoo == 2 ) +# { +# foobar(); +# } +# } +# +# note that indentation of the starting and ending accolades must be +# exactly the same. the code sequence can contain accolades at greater +# indentation +# +re_code_start = re.compile( r"(\s*){\s*$" ) +re_code_end = re.compile( r"(\s*)}\s*$" ) + + +# this regular expression is used to isolate identifiers from +# other text +# +re_identifier = re.compile( r'(\w*)' ) + + +############################################################################# +# +# The DocCode class is used to store source code lines. +# +# 'self.lines' contains a set of source code lines that will be dumped as +# HTML in a <PRE> tag. +# +# The object is filled line by line by the parser; it strips the leading +# "margin" space from each input line before storing it in 'self.lines'. +# +class DocCode: + + def __init__( self, margin, lines ): + self.lines = [] + self.words = None + + # remove margin spaces + for l in lines: + if string.strip( l[:margin] ) == "": + l = l[margin:] + self.lines.append( l ) + + def dump( self, prefix = "", width=60 ): + lines = self.dump_lines( 0, width ) + for l in lines: + print prefix + l + + def dump_lines( self, margin=0, width=60 ): + result = [] + for l in self.lines: + result.append( " "*margin + l ) + return result + + + +############################################################################# +# +# The DocPara class is used to store "normal" text paragraph. +# +# 'self.words' contains the list of words that make up the paragraph +# +class DocPara: + + def __init__( self, lines ): + self.lines = None + self.words = [] + for l in lines: + l = string.strip(l) + self.words.extend( string.split( l ) ) + + def dump( self, prefix = "", width = 60 ): + lines = self.dump_lines( 0, width ) + for l in lines: + print prefix + l + + def dump_lines( self, margin=0, width = 60 ): + cur = "" # current line + col = 0 # current width + result = [] + + for word in self.words: + ln = len(word) + if col > 0: + ln = ln+1 + + if col + ln > width: + result.append( " "*margin + cur ) + cur = word + col = len(word) + else: + if col > 0: + cur = cur + " " + cur = cur + word + col = col + ln + + if col > 0: + result.append( " "*margin + cur ) + + return result + + + + +############################################################################# +# +# The DocField class is used to store a list containing either DocPara or +# DocCode objects. Each DocField also has an optional "name" which is used +# when the object corresponds to a field or value definition +# +class DocField: + + def __init__( self, name, lines ): + + self.name = name # can be None for normal paragraphs/sources + self.items = [] # list of items + + mode_none = 0 # start parsing mode + mode_code = 1 # parsing code sequences + mode_para = 3 # parsing normal paragraph + + margin = -1 # current code sequence indentation + cur_lines = [] + + # now analyze the markup lines to see if they contain paragraphs, + # code sequences or fields definitions + # + start = 0 + mode = mode_none + for l in lines: + + # are we parsing a code sequence ? + if mode == mode_code: + + m = re_code_end.match( l ) + if m and len(m.group(1)) <= margin: + # that's it, we finised the code sequence + code = DocCode( 0, cur_lines ) + self.items.append( code ) + margin = -1 + cur_lines = [] + mode = mode_none + else: + # nope, continue the code sequence + cur_lines.append( l[margin:] ) + else: + # start of code sequence ? + m = re_code_start.match( l ) + if m: + # save current lines + if cur_lines: + para = DocPara( cur_lines ) + self.items.append( para ) + cur_lines = [] + + # switch to code extraction mode + margin = len(m.group(1)) + mode = mode_code + + else: + if not string.split( l ) and cur_lines: + # if the line is empty, we end the current paragraph, + # if any + para = DocPara( cur_lines ) + self.items.append( para ) + cur_lines = [] + else: + # otherwise, simply add the line to the current + # paragraph + cur_lines.append( l ) + + if mode == mode_code: + # unexpected end of code sequence + code = DocCode( margin, cur_lines ) + self.items.append( code ) + + elif cur_lines: + para = DocPara( cur_lines ) + self.items.append( para ) + + def dump( self, prefix = "" ): + if self.field: + print prefix + self.field + " ::" + prefix = prefix + "----" + + first = 1 + for p in self.items: + if not first: + print "" + p.dump( prefix ) + first = 0 + + def dump_lines( self, margin=0, width=60 ): + result = [] + nl = None + for p in self.items: + if nl: + result.append( "" ) + + result.extend( p.dump_lines( margin, width ) ) + nl = 1 + + return result + +# this regular expression is used to detect field definitions +# +re_field = re.compile( r"\s*(\w*|\w(\w|\.)*\w)\s*::" ) + + + +class DocMarkup: + + def __init__( self, tag, lines ): + self.tag = string.lower(tag) + self.fields = [] + + cur_lines = [] + field = None + mode = 0 + + for l in lines: + m = re_field.match( l ) + if m: + # we detected the start of a new field definition + + # first, save the current one + if cur_lines: + f = DocField( field, cur_lines ) + self.fields.append( f ) + cur_lines = [] + field = None + + field = m.group(1) # record field name + ln = len(m.group(0)) + l = " "*ln + l[ln:] + cur_lines = [ l ] + else: + cur_lines.append( l ) + + if field or cur_lines: + f = DocField( field, cur_lines ) + self.fields.append( f ) + + def get_name( self ): + try: + return self.fields[0].items[0].words[0] + + except: + return None + + def get_start( self ): + try: + result = "" + for word in self.fields[0].items[0].words: + result = result + " " + word + return result[1:] + + except: + return "ERROR" + + def dump( self, margin ): + print " "*margin + "<" + self.tag + ">" + for f in self.fields: + f.dump( " " ) + print " "*margin + "</" + self.tag + ">" + + + + +class DocChapter: + + def __init__( self, block ): + self.block = block + self.sections = [] + if block: + self.name = block.name + self.title = block.get_markup_words( "title" ) + self.order = block.get_markup_words( "sections" ) + else: + self.name = "Other" + self.title = string.split( "Miscellaneous" ) + self.order = [] + + + +class DocSection: + + def __init__( self, name = "Other" ): + self.name = name + self.blocks = {} + self.block_names = [] # ordered block names in section + self.defs = [] + self.abstract = "" + self.description = "" + self.order = [] + self.title = "ERROR" + self.chapter = None + + def add_def( self, block ): + self.defs.append( block ) + + def add_block( self, block ): + self.block_names.append( block.name ) + self.blocks[ block.name ] = block + + def process( self ): + # lookup one block that contains a valid section description + for block in self.defs: + title = block.get_markup_text( "title" ) + if title: + self.title = title + self.abstract = block.get_markup_words( "abstract" ) + self.description = block.get_markup_items( "description" ) + self.order = block.get_markup_words( "order" ) + return + + def reorder( self ): + + self.block_names = sort_order_list( self.block_names, self.order ) + + +class ContentProcessor: + + def __init__( self ): + """initialize a block content processor""" + self.reset() + + self.sections = {} # dictionary of documentation sections + self.section = None # current documentation section + + self.chapters = [] # list of chapters + + def set_section( self, section_name ): + """set current section during parsing""" + if not self.sections.has_key( section_name ): + section = DocSection( section_name ) + self.sections[ section_name ] = section + self.section = section + else: + self.section = self.sections[ section_name ] + + def add_chapter( self, block ): + chapter = DocChapter( block ) + self.chapters.append( chapter ) + + + def reset( self ): + """reset the content processor for a new block""" + self.markups = [] + self.markup = None + self.markup_lines = [] + + def add_markup( self ): + """add a new markup section""" + if self.markup and self.markup_lines: + + # get rid of last line of markup if it's empty + marks = self.markup_lines + if len(marks) > 0 and not string.strip(marks[-1]): + self.markup_lines = marks[:-1] + + m = DocMarkup( self.markup, self.markup_lines ) + + self.markups.append( m ) + + self.markup = None + self.markup_lines = [] + + + def process_content( self, content ): + """process a block content and return a list of DocMarkup objects + corresponding to it""" + markup = None + markup_lines = [] + first = 1 + + for line in content: + found = None + for t in re_markup_tags: + m = t.match( line ) + if m: + found = string.lower(m.group(1)) + prefix = len(m.group(0)) + line = " "*prefix + line[prefix:] # remove markup from line + break + + # is it the start of a new markup section ? + if found: + first = 0 + self.add_markup() # add current markup content + self.markup = found + if len(string.strip( line )) > 0: + self.markup_lines.append( line ) + elif first == 0: + self.markup_lines.append( line ) + + self.add_markup() + + return self.markups + + + def parse_sources( self, source_processor ): + blocks = source_processor.blocks + count = len(blocks) + for n in range(count): + + source = blocks[n] + if source.content: + # this is a documentation comment, we need to catch + # all following normal blocks in the "follow" list + # + follow = [] + m = n+1 + while m < count and not blocks[m].content: + follow.append( blocks[m] ) + m = m+1 + + doc_block = DocBlock( source, follow, self ) + + + def finish( self ): + + # process all sections to extract their abstract, description + # and ordered list of items + # + for sec in self.sections.values(): + sec.process() + + # process chapters to check that all sections are correctly + # listed there + for chap in self.chapters: + for sec in chap.order: + if self.sections.has_key(sec): + section = self.sections[ sec ] + section.chapter = chap + section.reorder() + chap.sections.append( section ) + else: + sys.stderr.write( "WARNING: chapter '" + + chap.name + "' in " + chap.block.location() + \ + " lists unknown section '" + sec + "'\n" ) + + # check that all sections are in a chapter + # + others = [] + for sec in self.sections.values(): + if not sec.chapter: + others.append(sec) + + # create a new special chapter for all remaining sections + # when necessary + # + if others: + chap = DocChapter( None ) + chap.sections = others + self.chapters.append( chap ) + + + +class DocBlock: + + def __init__( self, source, follow, processor ): + + processor.reset() + + self.source = source + self.code = [] + self.type = "ERRTYPE" + self.name = "ERRNAME" + self.section = processor.section + self.markups = processor.process_content( source.content ) + + # compute block type from first markup tag + try: + self.type = self.markups[0].tag + except: + pass + + + # compute block name from first markup paragraph + try: + markup = self.markups[0] + para = markup.fields[0].items[0] + name = para.words[0] + m = re_identifier.match( name ) + if m: + name = m.group(1) + self.name = name + except: + pass + + # detect new section starts + if self.type == "section": + processor.set_section( self.name ) + processor.section.add_def( self ) + + # detect new chapter + elif self.type == "chapter": + processor.add_chapter( self ) + + else: + processor.section.add_block( self ) + + # now, compute the source lines relevant to this documentation + # block. We keep normal comments in for obvious reasons (??) + source = [] + for b in follow: + if b.format: + break + for l in b.lines: + # we use "/* */" as a separator + if re_source_sep.match( l ): + break + source.append( l ) + + # now strip the leading and trailing empty lines from the sources + start = 0 + end = len( source )-1 + + while start < end and not string.strip( source[start] ): + start = start + 1 + + while start < end and not string.strip( source[end] ): + end = end - 1 + + source = source[start:end+1] + + self.code = source + + + def location( self ): + return self.source.location() + + + + def get_markup( self, tag_name ): + """return the DocMarkup corresponding to a given tag in a block""" + for m in self.markups: + if m.tag == string.lower(tag_name): + return m + return None + + + def get_markup_name( self, tag_name ): + """return the name of a given primary markup in a block""" + try: + m = self.get_markup( tag_name ) + return m.get_name() + except: + return None + + + def get_markup_words( self, tag_name ): + try: + m = self.get_markup( tag_name ) + return m.fields[0].items[0].words + except: + return [] + + + def get_markup_text( self, tag_name ): + result = self.get_markup_words( tag_name ) + return string.join( result ) + + + def get_markup_items( self, tag_name ): + try: + m = self.get_markup( tag_name ) + return m.fields[0].items + except: + return None + +# eof diff --git a/src/WinLibs/freetype-2.3.5/src/tools/docmaker/docbeauty.py b/src/WinLibs/freetype-2.3.5/src/tools/docmaker/docbeauty.py new file mode 100644 index 000000000..55c43297f --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/tools/docmaker/docbeauty.py @@ -0,0 +1,109 @@ +#!/usr/bin/env python +# +# DocBeauty (c) 2003, 2004 David Turner <david@freetype.org> +# +# This program is used to beautify the documentation comments used +# in the FreeType 2 public headers. +# + +from sources import * +from content import * +from utils import * + +import utils + +import sys, os, time, string, getopt + +content_processor = ContentProcessor() + + +def beautify_block( block ): + if block.content: + content_processor.reset() + + markups = content_processor.process_content( block.content ) + text = [] + first = 1 + + for markup in markups: + text.extend( markup.beautify( first ) ) + first = 0 + + # now beautify the documentation "borders" themselves + lines = [ " /*************************************************************************" ] + for l in text: + lines.append( " *" + l ) + lines.append( " */" ) + + block.lines = lines + + +def usage(): + print "\nDocBeauty 0.1 Usage information\n" + print " docbeauty [options] file1 [ file2 ... ]\n" + print "using the following options:\n" + print " -h : print this page" + print " -b : backup original files with the 'orig' extension" + print "" + print " --backup : same as -b" + + +def main( argv ): + """main program loop""" + + global output_dir + + try: + opts, args = getopt.getopt( sys.argv[1:], + "hb", + [ "help", "backup" ] ) + + except getopt.GetoptError: + usage() + sys.exit( 2 ) + + if args == []: + usage() + sys.exit( 1 ) + + # process options + # + output_dir = None + do_backup = None + + for opt in opts: + if opt[0] in ( "-h", "--help" ): + usage() + sys.exit( 0 ) + + if opt[0] in ( "-b", "--backup" ): + do_backup = 1 + + # create context and processor + source_processor = SourceProcessor() + + # retrieve the list of files to process + file_list = make_file_list( args ) + for filename in file_list: + source_processor.parse_file( filename ) + for block in source_processor.blocks: + beautify_block( block ) + new_name = filename + ".new" + ok = None + try: + file = open( new_name, "wt" ) + for block in source_processor.blocks: + for line in block.lines: + file.write( line ) + file.write( "\n" ) + file.close() + except: + ok = 0 + +# if called from the command line +# +if __name__ == '__main__': + main( sys.argv ) + + +# eof diff --git a/src/WinLibs/freetype-2.3.5/src/tools/docmaker/docmaker.py b/src/WinLibs/freetype-2.3.5/src/tools/docmaker/docmaker.py new file mode 100644 index 000000000..d34b6e8f9 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/tools/docmaker/docmaker.py @@ -0,0 +1,107 @@ +#!/usr/bin/env python +# +# DocMaker (c) 2002, 2004 David Turner <david@freetype.org> +# +# This program is a re-write of the original DocMaker took used +# to generate the API Reference of the FreeType font engine +# by converting in-source comments into structured HTML. +# +# This new version is capable of outputting XML data, as well +# as accepts more liberal formatting options. +# +# It also uses regular expression matching and substitution +# to speed things significantly. +# + +from sources import * +from content import * +from utils import * +from formatter import * +from tohtml import * + +import utils + +import sys, os, time, string, glob, getopt + + +def usage(): + print "\nDocMaker Usage information\n" + print " docmaker [options] file1 [ file2 ... ]\n" + print "using the following options:\n" + print " -h : print this page" + print " -t : set project title, as in '-t \"My Project\"'" + print " -o : set output directory, as in '-o mydir'" + print " -p : set documentation prefix, as in '-p ft2'" + print "" + print " --title : same as -t, as in '--title=\"My Project\"'" + print " --output : same as -o, as in '--output=mydir'" + print " --prefix : same as -p, as in '--prefix=ft2'" + + +def main( argv ): + """main program loop""" + + global output_dir + + try: + opts, args = getopt.getopt( sys.argv[1:], + "ht:o:p:", + [ "help", "title=", "output=", "prefix=" ] ) + + except getopt.GetoptError: + usage() + sys.exit( 2 ) + + if args == []: + usage() + sys.exit( 1 ) + + # process options + # + project_title = "Project" + project_prefix = None + output_dir = None + + for opt in opts: + if opt[0] in ( "-h", "--help" ): + usage() + sys.exit( 0 ) + + if opt[0] in ( "-t", "--title" ): + project_title = opt[1] + + if opt[0] in ( "-o", "--output" ): + utils.output_dir = opt[1] + + if opt[0] in ( "-p", "--prefix" ): + project_prefix = opt[1] + + check_output( ) + + # create context and processor + source_processor = SourceProcessor() + content_processor = ContentProcessor() + + # retrieve the list of files to process + file_list = make_file_list( args ) + for filename in file_list: + source_processor.parse_file( filename ) + content_processor.parse_sources( source_processor ) + + # process sections + content_processor.finish() + + formatter = HtmlFormatter( content_processor, project_title, project_prefix ) + + formatter.toc_dump() + formatter.index_dump() + formatter.section_dump_all() + + +# if called from the command line +# +if __name__ == '__main__': + main( sys.argv ) + + +# eof diff --git a/src/WinLibs/freetype-2.3.5/src/tools/docmaker/formatter.py b/src/WinLibs/freetype-2.3.5/src/tools/docmaker/formatter.py new file mode 100644 index 000000000..363410efc --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/tools/docmaker/formatter.py @@ -0,0 +1,204 @@ +# Formatter (c) 2002, 2004, 2007 David Turner <david@freetype.org> +# + +from sources import * +from content import * +from utils import * + +# This is the base Formatter class. Its purpose is to convert +# a content processor's data into specific documents (i.e., table of +# contents, global index, and individual API reference indices). +# +# You need to sub-class it to output anything sensible. For example, +# the file tohtml.py contains the definition of the HtmlFormatter sub-class +# used to output -- you guessed it -- HTML. +# + +class Formatter: + + def __init__( self, processor ): + + self.processor = processor + self.identifiers = {} + self.chapters = processor.chapters + self.sections = processor.sections.values() + self.block_index = [] + + # store all blocks in a dictionary + self.blocks = [] + for section in self.sections: + for block in section.blocks.values(): + self.add_identifier( block.name, block ) + + # add enumeration values to the index, since this is useful + for markup in block.markups: + if markup.tag == 'values': + for field in markup.fields: + self.add_identifier( field.name, block ) + + + self.block_index = self.identifiers.keys() + self.block_index.sort( index_sort ) + + + def add_identifier( self, name, block ): + if self.identifiers.has_key( name ): + # duplicate name !! + sys.stderr.write( \ + "WARNING: duplicate definition for '" + name + "' in " + \ + block.location() + ", previous definition in " + \ + self.identifiers[ name ].location() + "\n" ) + else: + self.identifiers[name] = block + + + # + # Formatting the table of contents + # + + def toc_enter( self ): + pass + + def toc_chapter_enter( self, chapter ): + pass + + def toc_section_enter( self, section ): + pass + + def toc_section_exit( self, section ): + pass + + def toc_chapter_exit( self, chapter ): + pass + + def toc_index( self, index_filename ): + pass + + def toc_exit( self ): + pass + + def toc_dump( self, toc_filename = None, index_filename = None ): + + output = None + if toc_filename: + output = open_output( toc_filename ) + + self.toc_enter() + + for chap in self.processor.chapters: + + self.toc_chapter_enter( chap ) + + for section in chap.sections: + self.toc_section_enter( section ) + self.toc_section_exit( section ) + + self.toc_chapter_exit ( chap ) + + self.toc_index( index_filename ) + + self.toc_exit() + + if output: + close_output( output ) + + # + # Formatting the index + # + + def index_enter( self ): + pass + + def index_name_enter( self, name ): + pass + + def index_name_exit( self, name ): + pass + + def index_exit( self ): + pass + + def index_dump( self, index_filename = None ): + + output = None + if index_filename: + output = open_output( index_filename ) + + self.index_enter() + + for name in self.block_index: + self.index_name_enter( name ) + self.index_name_exit ( name ) + + self.index_exit() + + if output: + close_output( output ) + + # + # Formatting a section + # + def section_enter( self, section ): + pass + + def block_enter( self, block ): + pass + + def markup_enter( self, markup, block = None ): + pass + + def field_enter( self, field, markup = None, block = None ): + pass + + def field_exit( self, field, markup = None, block = None ): + pass + + def markup_exit( self, markup, block = None ): + pass + + def block_exit( self, block ): + pass + + def section_exit( self, section ): + pass + + + def section_dump( self, section, section_filename = None ): + + output = None + if section_filename: + output = open_output( section_filename ) + + self.section_enter( section ) + + for name in section.block_names: + block = self.identifiers[ name ] + self.block_enter( block ) + + for markup in block.markups[1:]: # always ignore first markup !! + self.markup_enter( markup, block ) + + for field in markup.fields: + self.field_enter( field, markup, block ) + + self.field_exit ( field, markup, block ) + + self.markup_exit( markup, block ) + + self.block_exit( block ) + + self.section_exit ( section ) + + if output: + close_output( output ) + + + def section_dump_all( self ): + for section in self.sections: + self.section_dump( section ) + + # + # Formatting a block + # + +# eof diff --git a/src/WinLibs/freetype-2.3.5/src/tools/docmaker/sources.py b/src/WinLibs/freetype-2.3.5/src/tools/docmaker/sources.py new file mode 100644 index 000000000..09ff7f997 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/tools/docmaker/sources.py @@ -0,0 +1,358 @@ +# Sources (c) 2002, 2003, 2004, 2006, 2007 +# David Turner <david@freetype.org> +# +# +# this file contains definitions of classes needed to decompose +# C sources files into a series of multi-line "blocks". There are +# two kinds of blocks: +# +# - normal blocks, which contain source code or ordinary comments +# +# - documentation blocks, which have restricted formatting, and +# whose text always start with a documentation markup tag like +# "<Function>", "<Type>", etc.. +# +# the routines used to process the content of documentation blocks +# are not contained here, but in "content.py" +# +# the classes and methods found here only deal with text parsing +# and basic documentation block extraction +# +import fileinput, re, sys, os, string + + + + + + +################################################################ +## +## BLOCK FORMAT PATTERN +## +## A simple class containing compiled regular expressions used +## to detect potential documentation format block comments within +## C source code +## +## note that the 'column' pattern must contain a group that will +## be used to "unbox" the content of documentation comment blocks +## +class SourceBlockFormat: + + def __init__( self, id, start, column, end ): + """create a block pattern, used to recognize special documentation blocks""" + + self.id = id + self.start = re.compile( start, re.VERBOSE ) + self.column = re.compile( column, re.VERBOSE ) + self.end = re.compile( end, re.VERBOSE ) + + + +# +# format 1 documentation comment blocks look like the following: +# +# /************************************/ +# /* */ +# /* */ +# /* */ +# /************************************/ +# +# we define a few regular expressions here to detect them +# + +start = r''' + \s* # any number of whitespace + /\*{2,}/ # followed by '/' and at least two asterisks then '/' + \s*$ # eventually followed by whitespace +''' + +column = r''' + \s* # any number of whitespace + /\*{1} # followed by '/' and precisely one asterisk + ([^*].*) # followed by anything (group 1) + \*{1}/ # followed by one asterisk and a '/' + \s*$ # eventually followed by whitespace +''' + +re_source_block_format1 = SourceBlockFormat( 1, start, column, start ) + +# +# format 2 documentation comment blocks look like the following: +# +# /************************************ (at least 2 asterisks) +# * +# * +# * +# * +# **/ (1 or more asterisks at the end) +# +# we define a few regular expressions here to detect them +# +start = r''' + \s* # any number of whitespace + /\*{2,} # followed by '/' and at least two asterisks + \s*$ # eventually followed by whitespace +''' + +column = r''' + \s* # any number of whitespace + \*{1}(?!/) # followed by precisely one asterisk not followed by `/' + (.*) # then anything (group1) +''' + +end = r''' + \s* # any number of whitespace + \*+/ # followed by at least one asterisk, then '/' +''' + +re_source_block_format2 = SourceBlockFormat( 2, start, column, end ) + +# +# the list of supported documentation block formats, we could add new ones +# relatively easily +# +re_source_block_formats = [ re_source_block_format1, re_source_block_format2 ] + + +# +# the following regular expressions corresponds to markup tags +# within the documentation comment blocks. they're equivalent +# despite their different syntax +# +# notice how each markup tag _must_ begin a new line +# +re_markup_tag1 = re.compile( r'''\s*<(\w*)>''' ) # <xxxx> format +re_markup_tag2 = re.compile( r'''\s*@(\w*):''' ) # @xxxx: format + +# +# the list of supported markup tags, we could add new ones relatively +# easily +# +re_markup_tags = [ re_markup_tag1, re_markup_tag2 ] + +# +# used to detect a cross-reference, after markup tags have been stripped +# +re_crossref = re.compile( r'@(\w*)(.*)' ) + +# +# used to detect italic and bold styles in paragraph text +# +re_italic = re.compile( r"_(\w(\w|')*)_(.*)" ) # _italic_ +re_bold = re.compile( r"\*(\w(\w|')*)\*(.*)" ) # *bold* + +# +# used to detect the end of commented source lines +# +re_source_sep = re.compile( r'\s*/\*\s*\*/' ) + +# +# used to perform cross-reference within source output +# +re_source_crossref = re.compile( r'(\W*)(\w*)' ) + +# +# a list of reserved source keywords +# +re_source_keywords = re.compile( '''\\b ( typedef | + struct | + enum | + union | + const | + char | + int | + short | + long | + void | + signed | + unsigned | + \#include | + \#define | + \#undef | + \#if | + \#ifdef | + \#ifndef | + \#else | + \#endif ) \\b''', re.VERBOSE ) + +################################################################ +## +## SOURCE BLOCK CLASS +## +## A SourceProcessor is in charge or reading a C source file +## and decomposing it into a series of different "SourceBlocks". +## each one of these blocks can be made of the following data: +## +## - A documentation comment block that starts with "/**" and +## whose exact format will be discussed later +## +## - normal sources lines, include comments +## +## the important fields in a text block are the following ones: +## +## self.lines : a list of text lines for the corresponding block +## +## self.content : for documentation comment blocks only, this is the +## block content that has been "unboxed" from its +## decoration. This is None for all other blocks +## (i.e. sources or ordinary comments with no starting +## markup tag) +## +class SourceBlock: + def __init__( self, processor, filename, lineno, lines ): + self.processor = processor + self.filename = filename + self.lineno = lineno + self.lines = lines[:] + self.format = processor.format + self.content = [] + + if self.format == None: + return + + words = [] + + # extract comment lines + lines = [] + + for line0 in self.lines: + m = self.format.column.match( line0 ) + if m: + lines.append( m.group(1) ) + + # now, look for a markup tag + for l in lines: + l = string.strip(l) + if len(l) > 0: + for tag in re_markup_tags: + if tag.match( l ): + self.content = lines + return + + def location( self ): + return "(" + self.filename + ":" + repr(self.lineno) + ")" + + + # debugging only - not used in normal operations + def dump( self ): + + if self.content: + print "{{{content start---" + for l in self.content: + print l + print "---content end}}}" + return + + fmt = "" + if self.format: + fmt = repr(self.format.id) + " " + + for line in self.lines: + print line + + +################################################################ +## +## SOURCE PROCESSOR CLASS +## +## The SourceProcessor is in charge or reading a C source file +## and decomposing it into a series of different "SourceBlock" +## objects. +## +## each one of these blocks can be made of the following data: +## +## - A documentation comment block that starts with "/**" and +## whose exact format will be discussed later +## +## - normal sources lines, include comments +## +## +class SourceProcessor: + + def __init__( self ): + """initialize a source processor""" + self.blocks = [] + self.filename = None + self.format = None + self.lines = [] + + def reset( self ): + """reset a block processor, clean all its blocks""" + self.blocks = [] + self.format = None + + + def parse_file( self, filename ): + """parse a C source file, and adds its blocks to the processor's list""" + + self.reset() + + self.filename = filename + + fileinput.close() + self.format = None + self.lineno = 0 + self.lines = [] + + for line in fileinput.input( filename ): + + # strip trailing newlines, important on Windows machines !! + if line[-1] == '\012': + line = line[0:-1] + + if self.format == None: + self.process_normal_line( line ) + + else: + if self.format.end.match( line ): + # that's a normal block end, add it to lines and + # create a new block + self.lines.append( line ) + self.add_block_lines() + + elif self.format.column.match( line ): + # that's a normal column line, add it to 'lines' + self.lines.append( line ) + + else: + # humm.. this is an unexpected block end, + # create a new block, but don't process the line + self.add_block_lines() + + # we need to process the line again + self.process_normal_line( line ) + + # record the last lines + self.add_block_lines() + + + + def process_normal_line( self, line ): + """process a normal line and check if it's the start of a new block""" + for f in re_source_block_formats: + if f.start.match( line ): + self.add_block_lines() + self.format = f + self.lineno = fileinput.filelineno() + + self.lines.append( line ) + + + + def add_block_lines( self ): + """add the current accumulated lines, and create a new block""" + if self.lines != []: + block = SourceBlock( self, self.filename, self.lineno, self.lines ) + + self.blocks.append( block ) + self.format = None + self.lines = [] + + + # debugging only, not used in normal operations + def dump( self ): + """print all blocks in a processor""" + for b in self.blocks: + b.dump() + +# eof diff --git a/src/WinLibs/freetype-2.3.5/src/tools/docmaker/tohtml.py b/src/WinLibs/freetype-2.3.5/src/tools/docmaker/tohtml.py new file mode 100644 index 000000000..04dfba3f4 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/tools/docmaker/tohtml.py @@ -0,0 +1,538 @@ +# ToHTML (c) 2002, 2003, 2005, 2006, 2007 +# David Turner <david@freetype.org> + +from sources import * +from content import * +from formatter import * + +import time + +# The following defines the HTML header used by all generated pages. +# +html_header_1 = """\ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" +"http://www.w3.org/TR/html4/loose.dtd"> +<html> +<head> +<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> +<title>""" + +html_header_2= """ API Reference + + + +

""" + +html_header_3=""" API Reference

+""" + + + +# The HTML footer used by all generated pages. +# +html_footer = """\ + +""" + +# The header and footer used for each section. +# +section_title_header = "

" +section_title_footer = "

" + +# The header and footer used for code segments. +# +code_header = '
'
+code_footer = '
' + +# Paragraph header and footer. +# +para_header = "

" +para_footer = "

" + +# Block header and footer. +# +block_header = '
' +block_footer_start = """\ +
+
+ + +
[Index][TOC]
+""" + +# Description header/footer. +# +description_header = '
' +description_footer = "

" + +# Marker header/inter/footer combination. +# +marker_header = '
' +marker_inter = "
" +marker_footer = "
" + +# Source code extracts header/footer. +# +source_header = '
\n'
+source_footer = "\n

" + +# Chapter header/inter/footer. +# +chapter_header = '

' +chapter_inter = '

  • ' +chapter_footer = '
' + +# Index footer. +index_footer_start = """\ +
+ +
[TOC]
+""" + + +# source language keyword coloration/styling +# +keyword_prefix = '' +keyword_suffix = '' + +section_synopsis_header = '

Synopsis

' +section_synopsis_footer = '' + +# Translate a single line of source to HTML. This will convert +# a "<" into "<.", ">" into ">.", etc. +# +def html_quote( line ): + result = string.replace( line, "&", "&" ) + result = string.replace( result, "<", "<" ) + result = string.replace( result, ">", ">" ) + return result + + +# same as 'html_quote', but ignores left and right brackets +# +def html_quote0( line ): + return string.replace( line, "&", "&" ) + + +def dump_html_code( lines, prefix = "" ): + # clean the last empty lines + # + l = len( self.lines ) + while l > 0 and string.strip( self.lines[l - 1] ) == "": + l = l - 1 + + # The code footer should be directly appended to the last code + # line to avoid an additional blank line. + # + print prefix + code_header, + for line in self.lines[0 : l+1]: + print '\n' + prefix + html_quote(line), + print prefix + code_footer, + + + +class HtmlFormatter(Formatter): + + def __init__( self, processor, project_title, file_prefix ): + + Formatter.__init__( self, processor ) + + global html_header_1, html_header_2, html_header_3, html_footer + + if file_prefix: + file_prefix = file_prefix + "-" + else: + file_prefix = "" + + self.project_title = project_title + self.file_prefix = file_prefix + self.html_header = html_header_1 + project_title + html_header_2 + \ + project_title + html_header_3 + + self.html_footer = "
generated on " + \ + time.asctime( time.localtime( time.time() ) ) + \ + "
" + html_footer + + self.columns = 3 + + def make_section_url( self, section ): + return self.file_prefix + section.name + ".html" + + + def make_block_url( self, block ): + return self.make_section_url( block.section ) + "#" + block.name + + + def make_html_words( self, words ): + """ convert a series of simple words into some HTML text """ + line = "" + if words: + line = html_quote( words[0] ) + for w in words[1:]: + line = line + " " + html_quote( w ) + + return line + + + def make_html_word( self, word ): + """analyze a simple word to detect cross-references and styling""" + # look for cross-references + # + m = re_crossref.match( word ) + if m: + try: + name = m.group(1) + rest = m.group(2) + block = self.identifiers[name] + url = self.make_block_url( block ) + return '' + name + '' + rest + except: + # we detected a cross-reference to an unknown item + sys.stderr.write( \ + "WARNING: undefined cross reference '" + name + "'.\n" ) + return '?' + name + '?' + rest + + # look for italics and bolds + m = re_italic.match( word ) + if m: + name = m.group(1) + rest = m.group(3) + return '' + name + '' + rest + + m = re_bold.match( word ) + if m: + name = m.group(1) + rest = m.group(3) + return '' + name + '' + rest + + return html_quote(word) + + + def make_html_para( self, words ): + """ convert a paragraph's words into tagged HTML text, handle xrefs """ + line = "" + if words: + line = self.make_html_word( words[0] ) + for word in words[1:]: + line = line + " " + self.make_html_word( word ) + # convert `...' quotations into real left and right single quotes + line = re.sub( r"(^|\W)`(.*?)'(\W|$)", + r'\1‘\2’\3', + line ) + + return para_header + line + para_footer + + + def make_html_code( self, lines ): + """ convert a code sequence to HTML """ + line = code_header + '\n' + for l in lines: + line = line + html_quote( l ) + '\n' + + return line + code_footer + + + def make_html_items( self, items ): + """ convert a field's content into some valid HTML """ + lines = [] + for item in items: + if item.lines: + lines.append( self.make_html_code( item.lines ) ) + else: + lines.append( self.make_html_para( item.words ) ) + + return string.join( lines, '\n' ) + + + def print_html_items( self, items ): + print self.make_html_items( items ) + + + def print_html_field( self, field ): + if field.name: + print "

"+field.name+"

" + + print self.make_html_items( field.items ) + + if field.name: + print "
" + + + def html_source_quote( self, line, block_name = None ): + result = "" + while line: + m = re_source_crossref.match( line ) + if m: + name = m.group(2) + prefix = html_quote( m.group(1) ) + length = len( m.group(0) ) + + if name == block_name: + # this is the current block name, if any + result = result + prefix + '' + name + '' + + elif re_source_keywords.match(name): + # this is a C keyword + result = result + prefix + keyword_prefix + name + keyword_suffix + + elif self.identifiers.has_key(name): + # this is a known identifier + block = self.identifiers[name] + result = result + prefix + '' + name + '' + else: + result = result + html_quote(line[:length]) + + line = line[length:] + else: + result = result + html_quote(line) + line = [] + + return result + + + def print_html_field_list( self, fields ): + print "" + for field in fields: + if len(field.name) > 22: + print "" + print "" + print "
"+field.name+"
" + else: + print "
" + field.name + "" + + self.print_html_items( field.items ) + print "
" + + + def print_html_markup( self, markup ): + table_fields = [] + for field in markup.fields: + if field.name: + # we begin a new series of field or value definitions, we + # will record them in the 'table_fields' list before outputting + # all of them as a single table + # + table_fields.append( field ) + + else: + if table_fields: + self.print_html_field_list( table_fields ) + table_fields = [] + + self.print_html_items( field.items ) + + if table_fields: + self.print_html_field_list( table_fields ) + + # + # Formatting the index + # + + def index_enter( self ): + print self.html_header + self.index_items = {} + + def index_name_enter( self, name ): + block = self.identifiers[name] + url = self.make_block_url( block ) + self.index_items[name] = url + + def index_exit( self ): + + # block_index already contains the sorted list of index names + count = len( self.block_index ) + rows = (count + self.columns - 1) / self.columns + + print "" + for r in range(rows): + line = "" + for c in range(self.columns): + i = r + c*rows + if i < count: + bname = self.block_index[r + c * rows] + url = self.index_items[bname] + line = line + '' + else: + line = line + '' + line = line + "" + print line + + print "
' + bname + '
" + + print index_footer_start + \ + self.file_prefix + "toc.html" + \ + index_footer_end + + self.index_items = {} + + def index_dump( self, index_filename = None ): + + if index_filename == None: + index_filename = self.file_prefix + "index.html" + + Formatter.index_dump( self, index_filename ) + + # + # Formatting the table of content + # + def toc_enter( self ): + print self.html_header + print "

Table of Contents

" + + def toc_chapter_enter( self, chapter ): + print chapter_header + string.join(chapter.title) + chapter_inter + print "" + + def toc_section_enter( self, section ): + print "" + + def toc_chapter_exit( self, chapter ): + print "
" + print '' + \ + section.title + '' + + print self.make_html_para( section.abstract ) + + def toc_section_exit( self, section ): + print "
" + print chapter_footer + + def toc_index( self, index_filename ): + print chapter_header + 'Global Index' + chapter_inter + chapter_footer + + def toc_exit( self ): + print self.html_footer + + def toc_dump( self, toc_filename = None, index_filename = None ): + if toc_filename == None: + toc_filename = self.file_prefix + "toc.html" + + if index_filename == None: + index_filename = self.file_prefix + "index.html" + + Formatter.toc_dump( self, toc_filename, index_filename ) + + # + # Formatting sections + # + def section_enter( self, section ): + print self.html_header + + print section_title_header + print section.title + print section_title_footer + + maxwidth = 0 + for b in section.blocks.values(): + if len( b.name ) > maxwidth: + maxwidth = len( b.name ) + + width = 70 # XXX magic number + if maxwidth <> 0: + # print section synopsis + print section_synopsis_header + print "" + + columns = width / maxwidth + if columns < 1: + columns = 1 + + count = len( section.block_names ) + rows = ( count + columns - 1 ) / columns + + for r in range( rows ): + line = "" + for c in range( columns ): + i = r + c * rows + line = line + '' + line = line + "" + print line + + print "
' + if i < count: + name = section.block_names[i] + line = line + '' + name + '' + + line = line + '


" + print section_synopsis_footer + + print description_header + print self.make_html_items( section.description ) + print description_footer + + def block_enter( self, block ): + print block_header + + # place html anchor if needed + if block.name: + print '

' + block.name + '

' + + # dump the block C source lines now + if block.code: + print source_header + for l in block.code: + print self.html_source_quote( l, block.name ) + print source_footer + + + def markup_enter( self, markup, block ): + if markup.tag == "description": + print description_header + else: + print marker_header + markup.tag + marker_inter + + self.print_html_markup( markup ) + + def markup_exit( self, markup, block ): + if markup.tag == "description": + print description_footer + else: + print marker_footer + + def block_exit( self, block ): + print block_footer_start + self.file_prefix + "index.html" + \ + block_footer_middle + self.file_prefix + "toc.html" + \ + block_footer_end + + + def section_exit( self, section ): + print html_footer + + + def section_dump_all( self ): + for section in self.sections: + self.section_dump( section, self.file_prefix + section.name + '.html' ) + +# eof diff --git a/src/WinLibs/freetype-2.3.5/src/tools/docmaker/utils.py b/src/WinLibs/freetype-2.3.5/src/tools/docmaker/utils.py new file mode 100644 index 000000000..e751c5631 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/tools/docmaker/utils.py @@ -0,0 +1,132 @@ +# Utils (c) 2002, 2004, 2007 David Turner +# + +import string, sys, os, glob + +# current output directory +# +output_dir = None + + +# This function is used to sort the index. It is a simple lexicographical +# sort, except that it places capital letters before lowercase ones. +# +def index_sort( s1, s2 ): + if not s1: + return -1 + + if not s2: + return 1 + + l1 = len( s1 ) + l2 = len( s2 ) + m1 = string.lower( s1 ) + m2 = string.lower( s2 ) + + for i in range( l1 ): + if i >= l2 or m1[i] > m2[i]: + return 1 + + if m1[i] < m2[i]: + return -1 + + if s1[i] < s2[i]: + return -1 + + if s1[i] > s2[i]: + return 1 + + if l2 > l1: + return -1 + + return 0 + +# Sort input_list, placing the elements of order_list in front. +# +def sort_order_list( input_list, order_list ): + new_list = order_list[:] + for id in input_list: + if not id in order_list: + new_list.append( id ) + return new_list + + + +# Open the standard output to a given project documentation file. Use +# "output_dir" to determine the filename location if necessary and save the +# old stdout in a tuple that is returned by this function. +# +def open_output( filename ): + global output_dir + + if output_dir and output_dir != "": + filename = output_dir + os.sep + filename + + old_stdout = sys.stdout + new_file = open( filename, "w" ) + sys.stdout = new_file + + return ( new_file, old_stdout ) + + +# Close the output that was returned by "close_output". +# +def close_output( output ): + output[0].close() + sys.stdout = output[1] + + +# Check output directory. +# +def check_output( ): + global output_dir + if output_dir: + if output_dir != "": + if not os.path.isdir( output_dir ): + sys.stderr.write( "argument" + " '" + output_dir + "' " + + "is not a valid directory" ) + sys.exit( 2 ) + else: + output_dir = None + +def file_exists( pathname ): + """checks that a given file exists""" + result = 1 + try: + file = open( pathname, "r" ) + file.close() + except: + result = None + sys.stderr.write( pathname + " couldn't be accessed\n" ) + + return result + + +def make_file_list( args = None ): + """builds a list of input files from command-line arguments""" + + file_list = [] + # sys.stderr.write( repr( sys.argv[1 :] ) + '\n' ) + + if not args: + args = sys.argv[1 :] + + for pathname in args: + if string.find( pathname, '*' ) >= 0: + newpath = glob.glob( pathname ) + newpath.sort() # sort files -- this is important because + # of the order of files + else: + newpath = [pathname] + + file_list.extend( newpath ) + + if len( file_list ) == 0: + file_list = None + else: + # now filter the file list to remove non-existing ones + file_list = filter( file_exists, file_list ) + + return file_list + +# eof diff --git a/src/WinLibs/freetype-2.3.5/src/tools/ftrandom/Makefile b/src/WinLibs/freetype-2.3.5/src/tools/ftrandom/Makefile new file mode 100644 index 000000000..2e619299c --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/tools/ftrandom/Makefile @@ -0,0 +1,35 @@ +# TOP_DIR and OBJ_DIR should be set by the user to the right directories, +# if necessary. + +TOP_DIR ?= ../../.. +OBJ_DIR ?= $(TOP_DIR)/objs + + +# The setup below is for gcc on a Unix-like platform. + +SRC_DIR = $(TOP_DIR)/src/tools/ftrandom + +CC = gcc +WFLAGS = -Wmissing-prototypes \ + -Wunused \ + -Wimplicit \ + -Wreturn-type \ + -Wparentheses \ + -pedantic \ + -Wformat \ + -Wchar-subscripts \ + -Wsequence-point +CFLAGS = $(WFLAGS) \ + -g \ + -I $(TOP_DIR)/include +LIBS = -lm \ + -L $(OBJ_DIR) \ + -lfreetype \ + -lz + +all: $(OBJ_DIR)/ftrandom + +$(OBJ_DIR)/ftrandom: $(SRC_DIR)/ftrandom.c $(OBJ_DIR)/libfreetype.a + $(CC) -o $(OBJ_DIR)/ftrandom $(CFLAGS) $(SRC_DIR)/ftrandom.c $(LIBS) + +# EOF diff --git a/src/WinLibs/freetype-2.3.5/src/tools/ftrandom/README b/src/WinLibs/freetype-2.3.5/src/tools/ftrandom/README new file mode 100644 index 000000000..c093f15e8 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/tools/ftrandom/README @@ -0,0 +1,48 @@ +ftrandom +-------- + +This program expects a set of directories containing good fonts, and a set +of extensions of fonts to be tested. It will randomly pick a font, copy it, +introduce and error and then test it. + +The FreeType tests are quite basic: + + For each erroneous font it + forks off a new tester; + initializes the library; + opens each font in the file; + loads each glyph; + (optionally reviewing the contours of the glyph) + (optionally rasterizing) + closes the face. + +If the tester exits with a signal, or takes longer than 20 seconds then +ftrandom saves the erroneous font and continues. If the tester exits +normally or with an error, then the superstructure removes the test font and +continues. + +Arguments are: + + --all Test every font in the directory(ies) no matter + what its extension (some CID-keyed fonts have no + extension). + --check-outlines Call FT_Outline_Decompose on each glyph. + --dir Append to the list of directories to search + for good fonts. + --error-count Introduce single-byte errors into the + erroneous fonts. + --error-fraction Multiply the file size of the font by and + introduce that many errors into the erroneous + font file. + --ext Add to the set of font types tested. Known + extensions are `ttf', `otf', `ttc', `cid', `pfb', + `pfa', `bdf', `pcf', `pfr', `fon', `otb', and + `cff'. + --help Print out this list of options. + --nohints Specify FT_LOAD_NO_HINTING when loading glyphs. + --rasterize Call FT_Render_Glyph as well as loading it. + --result This is the directory in which test files are + placed. + --test Run a single test on a pre-generated testcase. + Done in the current process so it can be debugged + more easily. diff --git a/src/WinLibs/freetype-2.3.5/src/tools/ftrandom/ftrandom.c b/src/WinLibs/freetype-2.3.5/src/tools/ftrandom/ftrandom.c new file mode 100644 index 000000000..fcff27bc3 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/tools/ftrandom/ftrandom.c @@ -0,0 +1,659 @@ +/* Copyright (C) 2005 by George Williams */ +/* + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + + * The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* modified by Werner Lemberg */ +/* This file is now part of the FreeType library */ + + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include FT_FREETYPE_H +#include FT_OUTLINE_H + +#define true 1 +#define false 0 +#define forever for (;;) + + + static int check_outlines = false; + static int nohints = false; + static int rasterize = false; + static char* results_dir = "results"; + +#define GOOD_FONTS_DIR "/home/wl/freetype-testfonts" + + static char* default_dir_list[] = + { + GOOD_FONTS_DIR, + NULL + }; + + static char* default_ext_list[] = + { + "ttf", + "otf", + "ttc", + "cid", + "pfb", + "pfa", + "bdf", + "pcf", + "pfr", + "fon", + "otb", + "cff", + NULL + }; + + static int error_count = 1; + static int error_fraction = 0; + + static FT_F26Dot6 font_size = 12 * 64; + + static struct fontlist + { + char* name; + int len; + unsigned int isbinary: 1; + unsigned int isascii: 1; + unsigned int ishex: 1; + + } *fontlist; + + static int fcnt; + + + static int + FT_MoveTo( const FT_Vector *to, + void *user ) + { + return 0; + } + + + static int + FT_LineTo( const FT_Vector *to, + void *user ) + { + return 0; + } + + + static int + FT_ConicTo( const FT_Vector *_cp, + const FT_Vector *to, + void *user ) + { + return 0; + } + + + static int + FT_CubicTo( const FT_Vector *cp1, + const FT_Vector *cp2, + const FT_Vector *to, + void *user ) + { + return 0; + } + + + static FT_Outline_Funcs outlinefuncs = + { + FT_MoveTo, + FT_LineTo, + FT_ConicTo, + FT_CubicTo, + 0, 0 /* No shift, no delta */ + }; + + + static void + TestFace( FT_Face face ) + { + int gid; + int load_flags = FT_LOAD_DEFAULT; + + + if ( check_outlines && + ( face->face_flags & FT_FACE_FLAG_SCALABLE ) ) + load_flags = FT_LOAD_NO_BITMAP; + + if ( nohints ) + load_flags |= FT_LOAD_NO_HINTING; + + FT_Set_Char_Size( face, 0, font_size, 72, 72 ); + + for ( gid = 0; gid < face->num_glyphs; ++gid ) + { + if ( check_outlines && + ( face->face_flags & FT_FACE_FLAG_SCALABLE ) ) + { + if ( !FT_Load_Glyph( face, gid, load_flags ) ) + FT_Outline_Decompose( &face->glyph->outline, &outlinefuncs, NULL ); + } + else + FT_Load_Glyph( face, gid, load_flags ); + + if ( rasterize ) + FT_Render_Glyph( face->glyph, ft_render_mode_normal ); + } + + FT_Done_Face( face ); + } + + + static void + ExecuteTest( char* testfont ) + { + FT_Library context; + FT_Face face; + int i, num; + + + if ( FT_Init_FreeType( &context ) ) + { + fprintf( stderr, "Can't initialize FreeType.\n" ); + exit( 1 ); + } + + if ( FT_New_Face( context, testfont, 0, &face ) ) + { + /* The font is erroneous, so if this fails that's ok. */ + exit( 0 ); + } + + if ( face->num_faces == 1 ) + TestFace( face ); + else + { + num = face->num_faces; + FT_Done_Face( face ); + + for ( i = 0; i < num; ++i ) + { + if ( !FT_New_Face( context, testfont, i, &face ) ) + TestFace( face ); + } + } + + exit( 0 ); + } + + + static int + extmatch( char* filename, + char** extensions ) + { + int i; + char* pt; + + + if ( extensions == NULL ) + return true; + + pt = strrchr( filename, '.' ); + if ( pt == NULL ) + return false; + if ( pt < strrchr( filename, '/' ) ) + return false; + + for ( i = 0; extensions[i] != NULL; ++i ) + if ( strcasecmp( pt + 1, extensions[i] ) == 0 || + strcasecmp( pt, extensions[i] ) == 0 ) + return true; + + return false; + } + + + static void + figurefiletype( struct fontlist* item ) + { + FILE* foo; + + + item->isbinary = item->isascii = item->ishex = false; + + foo = fopen( item->name, "rb" ); + if ( foo != NULL ) + { + /* Try to guess the file type from the first few characters... */ + int ch1 = getc( foo ); + int ch2 = getc( foo ); + int ch3 = getc( foo ); + int ch4 = getc( foo ); + + + fclose( foo ); + + if ( ( ch1 == 0 && ch2 == 1 && ch3 == 0 && ch4 == 0 ) || + ( ch1 == 'O' && ch2 == 'T' && ch3 == 'T' && ch4 == 'O' ) || + ( ch1 == 't' && ch2 == 'r' && ch3 == 'u' && ch4 == 'e' ) || + ( ch1 == 't' && ch2 == 't' && ch3 == 'c' && ch4 == 'f' ) ) + { + /* ttf, otf, ttc files */ + item->isbinary = true; + } + else if ( ch1 == 0x80 && ch2 == '\01' ) + { + /* PFB header */ + item->isbinary = true; + } + else if ( ch1 == '%' && ch2 == '!' ) + { + /* Random PostScript */ + if ( strstr( item->name, ".pfa" ) != NULL || + strstr( item->name, ".PFA" ) != NULL ) + item->ishex = true; + else + item->isascii = true; + } + else if ( ch1 == 1 && ch2 == 0 && ch3 == 4 ) + { + /* Bare CFF */ + item->isbinary = true; + } + else if ( ch1 == 'S' && ch2 == 'T' && ch3 == 'A' && ch4 == 'R' ) + { + /* BDF */ + item->ishex = true; + } + else if ( ch1 == 'P' && ch2 == 'F' && ch3 == 'R' && ch4 == '0' ) + { + /* PFR */ + item->isbinary = true; + } + else if ( ( ch1 == '\1' && ch2 == 'f' && ch3 == 'c' && ch4 == 'p' ) || + ( ch1 == 'M' && ch2 == 'Z' ) ) + { + /* Windows FON */ + item->isbinary = true; + } + else + { + fprintf( stderr, + "Can't recognize file type of `%s', assuming binary\n", + item->name ); + item->isbinary = true; + } + } + else + { + fprintf( stderr, "Can't open `%s' for typing the file.\n", + item->name ); + item->isbinary = true; + } + } + + + static void + FindFonts( char** fontdirs, + char** extensions ) + { + DIR* examples; + struct dirent* ent; + + int i, max; + char buffer[1025]; + struct stat statb; + + + max = 0; + fcnt = 0; + + for ( i = 0; fontdirs[i] != NULL; ++i ) + { + examples = opendir( fontdirs[i] ); + if ( examples == NULL ) + { + fprintf( stderr, + "Can't open example font directory `%s'\n", + fontdirs[i] ); + exit( 1 ); + } + + while ( ( ent = readdir( examples ) ) != NULL ) + { + snprintf( buffer, sizeof ( buffer ), + "%s/%s", fontdirs[i], ent->d_name ); + if ( stat( buffer, &statb ) == -1 || S_ISDIR( statb.st_mode ) ) + continue; + if ( extensions == NULL || extmatch( buffer, extensions ) ) + { + if ( fcnt >= max ) + { + max += 100; + fontlist = realloc( fontlist, max * sizeof ( struct fontlist ) ); + if ( fontlist == NULL ) + { + fprintf( stderr, "Can't allocate memory\n" ); + exit( 1 ); + } + } + + fontlist[fcnt].name = strdup( buffer ); + fontlist[fcnt].len = statb.st_size; + + figurefiletype( &fontlist[fcnt] ); + ++fcnt; + } + } + + closedir( examples ); + } + + if ( fcnt == 0 ) + { + fprintf( stderr, "Can't find matching font files.\n" ); + exit( 1 ); + } + + fontlist[fcnt].name = NULL; + } + + + static int + getErrorCnt( struct fontlist* item ) + { + if ( error_count == 0 && error_fraction == 0 ) + return 0; + + return error_count + ceil( error_fraction * item->len ); + } + + + static int + getRandom( int low, + int high ) + { + if ( low - high < 0x10000L ) + return low + ( ( random() >> 8 ) % ( high + 1 - low ) ); + + return low + ( random() % ( high + 1 - low ) ); + } + + + static int + copyfont( struct fontlist* item, + char* newfont ) + { + static char buffer[8096]; + FILE *good, *new; + int len; + int i, err_cnt; + + + good = fopen( item->name, "r" ); + if ( good == NULL ) + { + fprintf( stderr, "Can't open `%s'\n", item->name ); + return false; + } + + new = fopen( newfont, "w+" ); + if ( new == NULL ) + { + fprintf( stderr, "Can't create temporary output file `%s'\n", + newfont ); + exit( 1 ); + } + + while ( ( len = fread( buffer, 1, sizeof ( buffer ), good ) ) > 0 ) + fwrite( buffer, 1, len, new ); + + fclose( good ); + + err_cnt = getErrorCnt( item ); + for ( i = 0; i < err_cnt; ++i ) + { + fseek( new, getRandom( 0, item->len - 1 ), SEEK_SET ); + + if ( item->isbinary ) + putc( getRandom( 0, 0xff ), new ); + else if ( item->isascii ) + putc( getRandom( 0x20, 0x7e ), new ); + else + { + int hex = getRandom( 0, 15 ); + + + if ( hex < 10 ) + hex += '0'; + else + hex += 'A' - 10; + + putc( hex, new ); + } + } + + if ( ferror( new ) ) + { + fclose( new ); + unlink( newfont ); + return false; + } + + fclose( new ); + + return true; + } + + + static int child_pid; + + static void + abort_test( int sig ) + { + /* If a time-out happens, then kill the child */ + kill( child_pid, SIGFPE ); + write( 2, "Timeout... ", 11 ); + } + + + static void + do_test( void ) + { + int i = getRandom( 0, fcnt - 1 ); + static int test_num = 0; + char buffer[1024]; + + + sprintf( buffer, "%s/test%d", results_dir, test_num++ ); + + if ( copyfont ( &fontlist[i], buffer ) ) + { + signal( SIGALRM, abort_test ); + /* Anything that takes more than 20 seconds */ + /* to parse and/or rasterize is an error. */ + alarm( 20 ); + if ( ( child_pid = fork() ) == 0 ) + ExecuteTest( buffer ); + else if ( child_pid != -1 ) + { + int status; + + + waitpid( child_pid, &status, 0 ); + alarm( 0 ); + if ( WIFSIGNALED ( status ) ) + printf( "Error found in file `%s'\n", buffer ); + else + unlink( buffer ); + } + else + { + fprintf( stderr, "Can't fork test case.\n" ); + exit( 1 ); + } + alarm( 0 ); + } + } + + + static void + usage( FILE* out, + char* name ) + { + fprintf( out, "%s [options] -- Generate random erroneous fonts\n" + " and attempt to parse them with FreeType.\n\n", name ); + + fprintf( out, " --all All non-directory files are assumed to be fonts.\n" ); + fprintf( out, " --check-outlines Make sure we can parse the outlines of each glyph.\n" ); + fprintf( out, " --dir Append to list of font search directories.\n" ); + fprintf( out, " --error-count Introduce single byte errors into each font.\n" ); + fprintf( out, " --error-fraction Introduce *filesize single byte errors\n" + " into each font.\n" ); + fprintf( out, " --ext Add to list of extensions indicating fonts.\n" ); + fprintf( out, " --help Print this.\n" ); + fprintf( out, " --nohints Turn off hinting.\n" ); + fprintf( out, " --rasterize Attempt to rasterize each glyph.\n" ); + fprintf( out, " --results Directory in which to place the test fonts.\n" ); + fprintf( out, " --size Use the given font size for the tests.\n" ); + fprintf( out, " --test Run a single test on an already existing file.\n" ); + } + + + int + main( int argc, + char** argv ) + { + char **dirs, **exts; + char *pt, *end; + int dcnt = 0, ecnt = 0, rset = false, allexts = false; + int i; + time_t now; + char* testfile = NULL; + + + dirs = calloc( argc + 1, sizeof ( char ** ) ); + exts = calloc( argc + 1, sizeof ( char ** ) ); + + for ( i = 1; i < argc; ++i ) + { + pt = argv[i]; + if ( pt[0] == '-' && pt[1] == '-' ) + ++pt; + + if ( strcmp( pt, "-all" ) == 0 ) + allexts = true; + else if ( strcmp( pt, "-check-outlines" ) == 0 ) + check_outlines = true; + else if ( strcmp( pt, "-dir" ) == 0 ) + dirs[dcnt++] = argv[++i]; + else if ( strcmp( pt, "-error-count" ) == 0 ) + { + if ( !rset ) + error_fraction = 0; + rset = true; + error_count = strtol( argv[++i], &end, 10 ); + if ( *end != '\0' ) + { + fprintf( stderr, "Bad value for error-count: %s\n", argv[i] ); + exit( 1 ); + } + } + else if ( strcmp( pt, "-error-fraction" ) == 0 ) + { + if ( !rset ) + error_count = 0; + rset = true; + error_fraction = strtod( argv[++i], &end ); + if ( *end != '\0' ) + { + fprintf( stderr, "Bad value for error-fraction: %s\n", argv[i] ); + exit( 1 ); + } + } + else if ( strcmp( pt, "-ext" ) == 0 ) + exts[ecnt++] = argv[++i]; + else if ( strcmp( pt, "-help" ) == 0 ) + { + usage( stdout, argv[0] ); + exit( 0 ); + } + else if ( strcmp( pt, "-nohints" ) == 0 ) + nohints = true; + else if ( strcmp( pt, "-rasterize" ) == 0 ) + rasterize = true; + else if ( strcmp( pt, "-results" ) == 0 ) + results_dir = argv[++i]; + else if ( strcmp( pt, "-size" ) == 0 ) + { + font_size = (FT_F26Dot6)( strtod( argv[++i], &end ) * 64 ); + if ( *end != '\0' || font_size < 64 ) + { + fprintf( stderr, "Bad value for size: %s\n", argv[i] ); + exit( 1 ); + } + } + else if ( strcmp( pt, "-test" ) == 0 ) + testfile = argv[++i]; + else + { + usage( stderr, argv[0] ); + exit( 1 ); + } + } + + if ( allexts ) + exts = NULL; + else if ( ecnt == 0 ) + exts = default_ext_list; + + if ( dcnt == 0 ) + dirs = default_dir_list; + + if ( testfile != NULL ) + ExecuteTest( testfile ); /* This should never return */ + + time( &now ); + srandom( now ); + + FindFonts( dirs, exts ); + mkdir( results_dir, 0755 ); + + forever + do_test(); + + return 0; + } + + +/* EOF */ diff --git a/src/WinLibs/freetype-2.3.5/src/tools/glnames.py b/src/WinLibs/freetype-2.3.5/src/tools/glnames.py new file mode 100644 index 000000000..9a6da3831 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/tools/glnames.py @@ -0,0 +1,5282 @@ +#!/usr/bin/env python +# + +# +# FreeType 2 glyph name builder +# + + +# Copyright 1996-2000, 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. + + +"""\ + +usage: %s + + This python script generates the glyph names tables defined in the + PSNames module. + + Its single argument is the name of the header file to be created. +""" + + +import sys, string, struct, re, os.path + + +# This table lists the glyphs according to the Macintosh specification. +# It is used by the TrueType Postscript names table. +# +# See +# +# http://fonts.apple.com/TTRefMan/RM06/Chap6post.html +# +# for the official list. +# +mac_standard_names = \ +[ + # 0 + ".notdef", ".null", "nonmarkingreturn", "space", "exclam", + "quotedbl", "numbersign", "dollar", "percent", "ampersand", + + # 10 + "quotesingle", "parenleft", "parenright", "asterisk", "plus", + "comma", "hyphen", "period", "slash", "zero", + + # 20 + "one", "two", "three", "four", "five", + "six", "seven", "eight", "nine", "colon", + + # 30 + "semicolon", "less", "equal", "greater", "question", + "at", "A", "B", "C", "D", + + # 40 + "E", "F", "G", "H", "I", + "J", "K", "L", "M", "N", + + # 50 + "O", "P", "Q", "R", "S", + "T", "U", "V", "W", "X", + + # 60 + "Y", "Z", "bracketleft", "backslash", "bracketright", + "asciicircum", "underscore", "grave", "a", "b", + + # 70 + "c", "d", "e", "f", "g", + "h", "i", "j", "k", "l", + + # 80 + "m", "n", "o", "p", "q", + "r", "s", "t", "u", "v", + + # 90 + "w", "x", "y", "z", "braceleft", + "bar", "braceright", "asciitilde", "Adieresis", "Aring", + + # 100 + "Ccedilla", "Eacute", "Ntilde", "Odieresis", "Udieresis", + "aacute", "agrave", "acircumflex", "adieresis", "atilde", + + # 110 + "aring", "ccedilla", "eacute", "egrave", "ecircumflex", + "edieresis", "iacute", "igrave", "icircumflex", "idieresis", + + # 120 + "ntilde", "oacute", "ograve", "ocircumflex", "odieresis", + "otilde", "uacute", "ugrave", "ucircumflex", "udieresis", + + # 130 + "dagger", "degree", "cent", "sterling", "section", + "bullet", "paragraph", "germandbls", "registered", "copyright", + + # 140 + "trademark", "acute", "dieresis", "notequal", "AE", + "Oslash", "infinity", "plusminus", "lessequal", "greaterequal", + + # 150 + "yen", "mu", "partialdiff", "summation", "product", + "pi", "integral", "ordfeminine", "ordmasculine", "Omega", + + # 160 + "ae", "oslash", "questiondown", "exclamdown", "logicalnot", + "radical", "florin", "approxequal", "Delta", "guillemotleft", + + # 170 + "guillemotright", "ellipsis", "nonbreakingspace", "Agrave", "Atilde", + "Otilde", "OE", "oe", "endash", "emdash", + + # 180 + "quotedblleft", "quotedblright", "quoteleft", "quoteright", "divide", + "lozenge", "ydieresis", "Ydieresis", "fraction", "currency", + + # 190 + "guilsinglleft", "guilsinglright", "fi", "fl", "daggerdbl", + "periodcentered", "quotesinglbase", "quotedblbase", "perthousand", + "Acircumflex", + + # 200 + "Ecircumflex", "Aacute", "Edieresis", "Egrave", "Iacute", + "Icircumflex", "Idieresis", "Igrave", "Oacute", "Ocircumflex", + + # 210 + "apple", "Ograve", "Uacute", "Ucircumflex", "Ugrave", + "dotlessi", "circumflex", "tilde", "macron", "breve", + + # 220 + "dotaccent", "ring", "cedilla", "hungarumlaut", "ogonek", + "caron", "Lslash", "lslash", "Scaron", "scaron", + + # 230 + "Zcaron", "zcaron", "brokenbar", "Eth", "eth", + "Yacute", "yacute", "Thorn", "thorn", "minus", + + # 240 + "multiply", "onesuperior", "twosuperior", "threesuperior", "onehalf", + "onequarter", "threequarters", "franc", "Gbreve", "gbreve", + + # 250 + "Idotaccent", "Scedilla", "scedilla", "Cacute", "cacute", + "Ccaron", "ccaron", "dcroat" +] + + +# The list of standard `SID' glyph names. For the official list, +# see Annex A of document at +# +# http://partners.adobe.com/asn/developer/pdfs/tn/5176.CFF.pdf. +# +sid_standard_names = \ +[ + # 0 + ".notdef", "space", "exclam", "quotedbl", "numbersign", + "dollar", "percent", "ampersand", "quoteright", "parenleft", + + # 10 + "parenright", "asterisk", "plus", "comma", "hyphen", + "period", "slash", "zero", "one", "two", + + # 20 + "three", "four", "five", "six", "seven", + "eight", "nine", "colon", "semicolon", "less", + + # 30 + "equal", "greater", "question", "at", "A", + "B", "C", "D", "E", "F", + + # 40 + "G", "H", "I", "J", "K", + "L", "M", "N", "O", "P", + + # 50 + "Q", "R", "S", "T", "U", + "V", "W", "X", "Y", "Z", + + # 60 + "bracketleft", "backslash", "bracketright", "asciicircum", "underscore", + "quoteleft", "a", "b", "c", "d", + + # 70 + "e", "f", "g", "h", "i", + "j", "k", "l", "m", "n", + + # 80 + "o", "p", "q", "r", "s", + "t", "u", "v", "w", "x", + + # 90 + "y", "z", "braceleft", "bar", "braceright", + "asciitilde", "exclamdown", "cent", "sterling", "fraction", + + # 100 + "yen", "florin", "section", "currency", "quotesingle", + "quotedblleft", "guillemotleft", "guilsinglleft", "guilsinglright", "fi", + + # 110 + "fl", "endash", "dagger", "daggerdbl", "periodcentered", + "paragraph", "bullet", "quotesinglbase", "quotedblbase", "quotedblright", + + # 120 + "guillemotright", "ellipsis", "perthousand", "questiondown", "grave", + "acute", "circumflex", "tilde", "macron", "breve", + + # 130 + "dotaccent", "dieresis", "ring", "cedilla", "hungarumlaut", + "ogonek", "caron", "emdash", "AE", "ordfeminine", + + # 140 + "Lslash", "Oslash", "OE", "ordmasculine", "ae", + "dotlessi", "lslash", "oslash", "oe", "germandbls", + + # 150 + "onesuperior", "logicalnot", "mu", "trademark", "Eth", + "onehalf", "plusminus", "Thorn", "onequarter", "divide", + + # 160 + "brokenbar", "degree", "thorn", "threequarters", "twosuperior", + "registered", "minus", "eth", "multiply", "threesuperior", + + # 170 + "copyright", "Aacute", "Acircumflex", "Adieresis", "Agrave", + "Aring", "Atilde", "Ccedilla", "Eacute", "Ecircumflex", + + # 180 + "Edieresis", "Egrave", "Iacute", "Icircumflex", "Idieresis", + "Igrave", "Ntilde", "Oacute", "Ocircumflex", "Odieresis", + + # 190 + "Ograve", "Otilde", "Scaron", "Uacute", "Ucircumflex", + "Udieresis", "Ugrave", "Yacute", "Ydieresis", "Zcaron", + + # 200 + "aacute", "acircumflex", "adieresis", "agrave", "aring", + "atilde", "ccedilla", "eacute", "ecircumflex", "edieresis", + + # 210 + "egrave", "iacute", "icircumflex", "idieresis", "igrave", + "ntilde", "oacute", "ocircumflex", "odieresis", "ograve", + + # 220 + "otilde", "scaron", "uacute", "ucircumflex", "udieresis", + "ugrave", "yacute", "ydieresis", "zcaron", "exclamsmall", + + # 230 + "Hungarumlautsmall", "dollaroldstyle", "dollarsuperior", "ampersandsmall", + "Acutesmall", + "parenleftsuperior", "parenrightsuperior", "twodotenleader", + "onedotenleader", "zerooldstyle", + + # 240 + "oneoldstyle", "twooldstyle", "threeoldstyle", "fouroldstyle", + "fiveoldstyle", + "sixoldstyle", "sevenoldstyle", "eightoldstyle", "nineoldstyle", + "commasuperior", + + # 250 + "threequartersemdash", "periodsuperior", "questionsmall", "asuperior", + "bsuperior", + "centsuperior", "dsuperior", "esuperior", "isuperior", "lsuperior", + + # 260 + "msuperior", "nsuperior", "osuperior", "rsuperior", "ssuperior", + "tsuperior", "ff", "ffi", "ffl", "parenleftinferior", + + # 270 + "parenrightinferior", "Circumflexsmall", "hyphensuperior", "Gravesmall", + "Asmall", + "Bsmall", "Csmall", "Dsmall", "Esmall", "Fsmall", + + # 280 + "Gsmall", "Hsmall", "Ismall", "Jsmall", "Ksmall", + "Lsmall", "Msmall", "Nsmall", "Osmall", "Psmall", + + # 290 + "Qsmall", "Rsmall", "Ssmall", "Tsmall", "Usmall", + "Vsmall", "Wsmall", "Xsmall", "Ysmall", "Zsmall", + + # 300 + "colonmonetary", "onefitted", "rupiah", "Tildesmall", "exclamdownsmall", + "centoldstyle", "Lslashsmall", "Scaronsmall", "Zcaronsmall", + "Dieresissmall", + + # 310 + "Brevesmall", "Caronsmall", "Dotaccentsmall", "Macronsmall", "figuredash", + "hypheninferior", "Ogoneksmall", "Ringsmall", "Cedillasmall", + "questiondownsmall", + + # 320 + "oneeighth", "threeeighths", "fiveeighths", "seveneighths", "onethird", + "twothirds", "zerosuperior", "foursuperior", "fivesuperior", + "sixsuperior", + + # 330 + "sevensuperior", "eightsuperior", "ninesuperior", "zeroinferior", + "oneinferior", + "twoinferior", "threeinferior", "fourinferior", "fiveinferior", + "sixinferior", + + # 340 + "seveninferior", "eightinferior", "nineinferior", "centinferior", + "dollarinferior", + "periodinferior", "commainferior", "Agravesmall", "Aacutesmall", + "Acircumflexsmall", + + # 350 + "Atildesmall", "Adieresissmall", "Aringsmall", "AEsmall", "Ccedillasmall", + "Egravesmall", "Eacutesmall", "Ecircumflexsmall", "Edieresissmall", + "Igravesmall", + + # 360 + "Iacutesmall", "Icircumflexsmall", "Idieresissmall", "Ethsmall", + "Ntildesmall", + "Ogravesmall", "Oacutesmall", "Ocircumflexsmall", "Otildesmall", + "Odieresissmall", + + # 370 + "OEsmall", "Oslashsmall", "Ugravesmall", "Uacutesmall", + "Ucircumflexsmall", + "Udieresissmall", "Yacutesmall", "Thornsmall", "Ydieresissmall", + "001.000", + + # 380 + "001.001", "001.002", "001.003", "Black", "Bold", + "Book", "Light", "Medium", "Regular", "Roman", + + # 390 + "Semibold" +] + + +# This table maps character codes of the Adobe Standard Type 1 +# encoding to glyph indices in the sid_standard_names table. +# +t1_standard_encoding = \ +[ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, + 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, + + 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, + 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, + 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, + 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, + + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, + 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 92, 93, 94, 95, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 96, 97, 98, 99, 100, 101, 102, 103, 104, + 105, 106, 107, 108, 109, 110, 0, 111, 112, 113, + 114, 0, 115, 116, 117, 118, 119, 120, 121, 122, + 0, 123, 0, 124, 125, 126, 127, 128, 129, 130, + + 131, 0, 132, 133, 0, 134, 135, 136, 137, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 138, 0, 139, 0, 0, + 0, 0, 140, 141, 142, 143, 0, 0, 0, 0, + 0, 144, 0, 0, 0, 145, 0, 0, 146, 147, + + 148, 149, 0, 0, 0, 0 +] + + +# This table maps character codes of the Adobe Expert Type 1 +# encoding to glyph indices in the sid_standard_names table. +# +t1_expert_encoding = \ +[ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 229, 230, 0, 231, 232, 233, 234, + 235, 236, 237, 238, 13, 14, 15, 99, 239, 240, + + 241, 242, 243, 244, 245, 246, 247, 248, 27, 28, + 249, 250, 251, 252, 0, 253, 254, 255, 256, 257, + 0, 0, 0, 258, 0, 0, 259, 260, 261, 262, + 0, 0, 263, 264, 265, 0, 266, 109, 110, 267, + 268, 269, 0, 270, 271, 272, 273, 274, 275, 276, + + 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, + 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, + 297, 298, 299, 300, 301, 302, 303, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 304, 305, 306, 0, 0, 307, 308, 309, 310, + 311, 0, 312, 0, 0, 313, 0, 0, 314, 315, + 0, 0, 316, 317, 318, 0, 0, 0, 158, 155, + 163, 319, 320, 321, 322, 323, 324, 325, 0, 0, + + 326, 150, 164, 169, 327, 328, 329, 330, 331, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, + 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, + 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + + 373, 374, 375, 376, 377, 378 +] + + +# This data has been taken literally from the file `glyphlist.txt', +# version 2.0, 22 Sept 2002. It is available from +# +# http://partners.adobe.com/asn/developer/typeforum/unicodegn.html +# http://partners.adobe.com/public/developer/en/opentype/glyphlist.txt +# +adobe_glyph_list = """\ +A;0041 +AE;00C6 +AEacute;01FC +AEmacron;01E2 +AEsmall;F7E6 +Aacute;00C1 +Aacutesmall;F7E1 +Abreve;0102 +Abreveacute;1EAE +Abrevecyrillic;04D0 +Abrevedotbelow;1EB6 +Abrevegrave;1EB0 +Abrevehookabove;1EB2 +Abrevetilde;1EB4 +Acaron;01CD +Acircle;24B6 +Acircumflex;00C2 +Acircumflexacute;1EA4 +Acircumflexdotbelow;1EAC +Acircumflexgrave;1EA6 +Acircumflexhookabove;1EA8 +Acircumflexsmall;F7E2 +Acircumflextilde;1EAA +Acute;F6C9 +Acutesmall;F7B4 +Acyrillic;0410 +Adblgrave;0200 +Adieresis;00C4 +Adieresiscyrillic;04D2 +Adieresismacron;01DE +Adieresissmall;F7E4 +Adotbelow;1EA0 +Adotmacron;01E0 +Agrave;00C0 +Agravesmall;F7E0 +Ahookabove;1EA2 +Aiecyrillic;04D4 +Ainvertedbreve;0202 +Alpha;0391 +Alphatonos;0386 +Amacron;0100 +Amonospace;FF21 +Aogonek;0104 +Aring;00C5 +Aringacute;01FA +Aringbelow;1E00 +Aringsmall;F7E5 +Asmall;F761 +Atilde;00C3 +Atildesmall;F7E3 +Aybarmenian;0531 +B;0042 +Bcircle;24B7 +Bdotaccent;1E02 +Bdotbelow;1E04 +Becyrillic;0411 +Benarmenian;0532 +Beta;0392 +Bhook;0181 +Blinebelow;1E06 +Bmonospace;FF22 +Brevesmall;F6F4 +Bsmall;F762 +Btopbar;0182 +C;0043 +Caarmenian;053E +Cacute;0106 +Caron;F6CA +Caronsmall;F6F5 +Ccaron;010C +Ccedilla;00C7 +Ccedillaacute;1E08 +Ccedillasmall;F7E7 +Ccircle;24B8 +Ccircumflex;0108 +Cdot;010A +Cdotaccent;010A +Cedillasmall;F7B8 +Chaarmenian;0549 +Cheabkhasiancyrillic;04BC +Checyrillic;0427 +Chedescenderabkhasiancyrillic;04BE +Chedescendercyrillic;04B6 +Chedieresiscyrillic;04F4 +Cheharmenian;0543 +Chekhakassiancyrillic;04CB +Cheverticalstrokecyrillic;04B8 +Chi;03A7 +Chook;0187 +Circumflexsmall;F6F6 +Cmonospace;FF23 +Coarmenian;0551 +Csmall;F763 +D;0044 +DZ;01F1 +DZcaron;01C4 +Daarmenian;0534 +Dafrican;0189 +Dcaron;010E +Dcedilla;1E10 +Dcircle;24B9 +Dcircumflexbelow;1E12 +Dcroat;0110 +Ddotaccent;1E0A +Ddotbelow;1E0C +Decyrillic;0414 +Deicoptic;03EE +Delta;2206 +Deltagreek;0394 +Dhook;018A +Dieresis;F6CB +DieresisAcute;F6CC +DieresisGrave;F6CD +Dieresissmall;F7A8 +Digammagreek;03DC +Djecyrillic;0402 +Dlinebelow;1E0E +Dmonospace;FF24 +Dotaccentsmall;F6F7 +Dslash;0110 +Dsmall;F764 +Dtopbar;018B +Dz;01F2 +Dzcaron;01C5 +Dzeabkhasiancyrillic;04E0 +Dzecyrillic;0405 +Dzhecyrillic;040F +E;0045 +Eacute;00C9 +Eacutesmall;F7E9 +Ebreve;0114 +Ecaron;011A +Ecedillabreve;1E1C +Echarmenian;0535 +Ecircle;24BA +Ecircumflex;00CA +Ecircumflexacute;1EBE +Ecircumflexbelow;1E18 +Ecircumflexdotbelow;1EC6 +Ecircumflexgrave;1EC0 +Ecircumflexhookabove;1EC2 +Ecircumflexsmall;F7EA +Ecircumflextilde;1EC4 +Ecyrillic;0404 +Edblgrave;0204 +Edieresis;00CB +Edieresissmall;F7EB +Edot;0116 +Edotaccent;0116 +Edotbelow;1EB8 +Efcyrillic;0424 +Egrave;00C8 +Egravesmall;F7E8 +Eharmenian;0537 +Ehookabove;1EBA +Eightroman;2167 +Einvertedbreve;0206 +Eiotifiedcyrillic;0464 +Elcyrillic;041B +Elevenroman;216A +Emacron;0112 +Emacronacute;1E16 +Emacrongrave;1E14 +Emcyrillic;041C +Emonospace;FF25 +Encyrillic;041D +Endescendercyrillic;04A2 +Eng;014A +Enghecyrillic;04A4 +Enhookcyrillic;04C7 +Eogonek;0118 +Eopen;0190 +Epsilon;0395 +Epsilontonos;0388 +Ercyrillic;0420 +Ereversed;018E +Ereversedcyrillic;042D +Escyrillic;0421 +Esdescendercyrillic;04AA +Esh;01A9 +Esmall;F765 +Eta;0397 +Etarmenian;0538 +Etatonos;0389 +Eth;00D0 +Ethsmall;F7F0 +Etilde;1EBC +Etildebelow;1E1A +Euro;20AC +Ezh;01B7 +Ezhcaron;01EE +Ezhreversed;01B8 +F;0046 +Fcircle;24BB +Fdotaccent;1E1E +Feharmenian;0556 +Feicoptic;03E4 +Fhook;0191 +Fitacyrillic;0472 +Fiveroman;2164 +Fmonospace;FF26 +Fourroman;2163 +Fsmall;F766 +G;0047 +GBsquare;3387 +Gacute;01F4 +Gamma;0393 +Gammaafrican;0194 +Gangiacoptic;03EA +Gbreve;011E +Gcaron;01E6 +Gcedilla;0122 +Gcircle;24BC +Gcircumflex;011C +Gcommaaccent;0122 +Gdot;0120 +Gdotaccent;0120 +Gecyrillic;0413 +Ghadarmenian;0542 +Ghemiddlehookcyrillic;0494 +Ghestrokecyrillic;0492 +Gheupturncyrillic;0490 +Ghook;0193 +Gimarmenian;0533 +Gjecyrillic;0403 +Gmacron;1E20 +Gmonospace;FF27 +Grave;F6CE +Gravesmall;F760 +Gsmall;F767 +Gsmallhook;029B +Gstroke;01E4 +H;0048 +H18533;25CF +H18543;25AA +H18551;25AB +H22073;25A1 +HPsquare;33CB +Haabkhasiancyrillic;04A8 +Hadescendercyrillic;04B2 +Hardsigncyrillic;042A +Hbar;0126 +Hbrevebelow;1E2A +Hcedilla;1E28 +Hcircle;24BD +Hcircumflex;0124 +Hdieresis;1E26 +Hdotaccent;1E22 +Hdotbelow;1E24 +Hmonospace;FF28 +Hoarmenian;0540 +Horicoptic;03E8 +Hsmall;F768 +Hungarumlaut;F6CF +Hungarumlautsmall;F6F8 +Hzsquare;3390 +I;0049 +IAcyrillic;042F +IJ;0132 +IUcyrillic;042E +Iacute;00CD +Iacutesmall;F7ED +Ibreve;012C +Icaron;01CF +Icircle;24BE +Icircumflex;00CE +Icircumflexsmall;F7EE +Icyrillic;0406 +Idblgrave;0208 +Idieresis;00CF +Idieresisacute;1E2E +Idieresiscyrillic;04E4 +Idieresissmall;F7EF +Idot;0130 +Idotaccent;0130 +Idotbelow;1ECA +Iebrevecyrillic;04D6 +Iecyrillic;0415 +Ifraktur;2111 +Igrave;00CC +Igravesmall;F7EC +Ihookabove;1EC8 +Iicyrillic;0418 +Iinvertedbreve;020A +Iishortcyrillic;0419 +Imacron;012A +Imacroncyrillic;04E2 +Imonospace;FF29 +Iniarmenian;053B +Iocyrillic;0401 +Iogonek;012E +Iota;0399 +Iotaafrican;0196 +Iotadieresis;03AA +Iotatonos;038A +Ismall;F769 +Istroke;0197 +Itilde;0128 +Itildebelow;1E2C +Izhitsacyrillic;0474 +Izhitsadblgravecyrillic;0476 +J;004A +Jaarmenian;0541 +Jcircle;24BF +Jcircumflex;0134 +Jecyrillic;0408 +Jheharmenian;054B +Jmonospace;FF2A +Jsmall;F76A +K;004B +KBsquare;3385 +KKsquare;33CD +Kabashkircyrillic;04A0 +Kacute;1E30 +Kacyrillic;041A +Kadescendercyrillic;049A +Kahookcyrillic;04C3 +Kappa;039A +Kastrokecyrillic;049E +Kaverticalstrokecyrillic;049C +Kcaron;01E8 +Kcedilla;0136 +Kcircle;24C0 +Kcommaaccent;0136 +Kdotbelow;1E32 +Keharmenian;0554 +Kenarmenian;053F +Khacyrillic;0425 +Kheicoptic;03E6 +Khook;0198 +Kjecyrillic;040C +Klinebelow;1E34 +Kmonospace;FF2B +Koppacyrillic;0480 +Koppagreek;03DE +Ksicyrillic;046E +Ksmall;F76B +L;004C +LJ;01C7 +LL;F6BF +Lacute;0139 +Lambda;039B +Lcaron;013D +Lcedilla;013B +Lcircle;24C1 +Lcircumflexbelow;1E3C +Lcommaaccent;013B +Ldot;013F +Ldotaccent;013F +Ldotbelow;1E36 +Ldotbelowmacron;1E38 +Liwnarmenian;053C +Lj;01C8 +Ljecyrillic;0409 +Llinebelow;1E3A +Lmonospace;FF2C +Lslash;0141 +Lslashsmall;F6F9 +Lsmall;F76C +M;004D +MBsquare;3386 +Macron;F6D0 +Macronsmall;F7AF +Macute;1E3E +Mcircle;24C2 +Mdotaccent;1E40 +Mdotbelow;1E42 +Menarmenian;0544 +Mmonospace;FF2D +Msmall;F76D +Mturned;019C +Mu;039C +N;004E +NJ;01CA +Nacute;0143 +Ncaron;0147 +Ncedilla;0145 +Ncircle;24C3 +Ncircumflexbelow;1E4A +Ncommaaccent;0145 +Ndotaccent;1E44 +Ndotbelow;1E46 +Nhookleft;019D +Nineroman;2168 +Nj;01CB +Njecyrillic;040A +Nlinebelow;1E48 +Nmonospace;FF2E +Nowarmenian;0546 +Nsmall;F76E +Ntilde;00D1 +Ntildesmall;F7F1 +Nu;039D +O;004F +OE;0152 +OEsmall;F6FA +Oacute;00D3 +Oacutesmall;F7F3 +Obarredcyrillic;04E8 +Obarreddieresiscyrillic;04EA +Obreve;014E +Ocaron;01D1 +Ocenteredtilde;019F +Ocircle;24C4 +Ocircumflex;00D4 +Ocircumflexacute;1ED0 +Ocircumflexdotbelow;1ED8 +Ocircumflexgrave;1ED2 +Ocircumflexhookabove;1ED4 +Ocircumflexsmall;F7F4 +Ocircumflextilde;1ED6 +Ocyrillic;041E +Odblacute;0150 +Odblgrave;020C +Odieresis;00D6 +Odieresiscyrillic;04E6 +Odieresissmall;F7F6 +Odotbelow;1ECC +Ogoneksmall;F6FB +Ograve;00D2 +Ogravesmall;F7F2 +Oharmenian;0555 +Ohm;2126 +Ohookabove;1ECE +Ohorn;01A0 +Ohornacute;1EDA +Ohorndotbelow;1EE2 +Ohorngrave;1EDC +Ohornhookabove;1EDE +Ohorntilde;1EE0 +Ohungarumlaut;0150 +Oi;01A2 +Oinvertedbreve;020E +Omacron;014C +Omacronacute;1E52 +Omacrongrave;1E50 +Omega;2126 +Omegacyrillic;0460 +Omegagreek;03A9 +Omegaroundcyrillic;047A +Omegatitlocyrillic;047C +Omegatonos;038F +Omicron;039F +Omicrontonos;038C +Omonospace;FF2F +Oneroman;2160 +Oogonek;01EA +Oogonekmacron;01EC +Oopen;0186 +Oslash;00D8 +Oslashacute;01FE +Oslashsmall;F7F8 +Osmall;F76F +Ostrokeacute;01FE +Otcyrillic;047E +Otilde;00D5 +Otildeacute;1E4C +Otildedieresis;1E4E +Otildesmall;F7F5 +P;0050 +Pacute;1E54 +Pcircle;24C5 +Pdotaccent;1E56 +Pecyrillic;041F +Peharmenian;054A +Pemiddlehookcyrillic;04A6 +Phi;03A6 +Phook;01A4 +Pi;03A0 +Piwrarmenian;0553 +Pmonospace;FF30 +Psi;03A8 +Psicyrillic;0470 +Psmall;F770 +Q;0051 +Qcircle;24C6 +Qmonospace;FF31 +Qsmall;F771 +R;0052 +Raarmenian;054C +Racute;0154 +Rcaron;0158 +Rcedilla;0156 +Rcircle;24C7 +Rcommaaccent;0156 +Rdblgrave;0210 +Rdotaccent;1E58 +Rdotbelow;1E5A +Rdotbelowmacron;1E5C +Reharmenian;0550 +Rfraktur;211C +Rho;03A1 +Ringsmall;F6FC +Rinvertedbreve;0212 +Rlinebelow;1E5E +Rmonospace;FF32 +Rsmall;F772 +Rsmallinverted;0281 +Rsmallinvertedsuperior;02B6 +S;0053 +SF010000;250C +SF020000;2514 +SF030000;2510 +SF040000;2518 +SF050000;253C +SF060000;252C +SF070000;2534 +SF080000;251C +SF090000;2524 +SF100000;2500 +SF110000;2502 +SF190000;2561 +SF200000;2562 +SF210000;2556 +SF220000;2555 +SF230000;2563 +SF240000;2551 +SF250000;2557 +SF260000;255D +SF270000;255C +SF280000;255B +SF360000;255E +SF370000;255F +SF380000;255A +SF390000;2554 +SF400000;2569 +SF410000;2566 +SF420000;2560 +SF430000;2550 +SF440000;256C +SF450000;2567 +SF460000;2568 +SF470000;2564 +SF480000;2565 +SF490000;2559 +SF500000;2558 +SF510000;2552 +SF520000;2553 +SF530000;256B +SF540000;256A +Sacute;015A +Sacutedotaccent;1E64 +Sampigreek;03E0 +Scaron;0160 +Scarondotaccent;1E66 +Scaronsmall;F6FD +Scedilla;015E +Schwa;018F +Schwacyrillic;04D8 +Schwadieresiscyrillic;04DA +Scircle;24C8 +Scircumflex;015C +Scommaaccent;0218 +Sdotaccent;1E60 +Sdotbelow;1E62 +Sdotbelowdotaccent;1E68 +Seharmenian;054D +Sevenroman;2166 +Shaarmenian;0547 +Shacyrillic;0428 +Shchacyrillic;0429 +Sheicoptic;03E2 +Shhacyrillic;04BA +Shimacoptic;03EC +Sigma;03A3 +Sixroman;2165 +Smonospace;FF33 +Softsigncyrillic;042C +Ssmall;F773 +Stigmagreek;03DA +T;0054 +Tau;03A4 +Tbar;0166 +Tcaron;0164 +Tcedilla;0162 +Tcircle;24C9 +Tcircumflexbelow;1E70 +Tcommaaccent;0162 +Tdotaccent;1E6A +Tdotbelow;1E6C +Tecyrillic;0422 +Tedescendercyrillic;04AC +Tenroman;2169 +Tetsecyrillic;04B4 +Theta;0398 +Thook;01AC +Thorn;00DE +Thornsmall;F7FE +Threeroman;2162 +Tildesmall;F6FE +Tiwnarmenian;054F +Tlinebelow;1E6E +Tmonospace;FF34 +Toarmenian;0539 +Tonefive;01BC +Tonesix;0184 +Tonetwo;01A7 +Tretroflexhook;01AE +Tsecyrillic;0426 +Tshecyrillic;040B +Tsmall;F774 +Twelveroman;216B +Tworoman;2161 +U;0055 +Uacute;00DA +Uacutesmall;F7FA +Ubreve;016C +Ucaron;01D3 +Ucircle;24CA +Ucircumflex;00DB +Ucircumflexbelow;1E76 +Ucircumflexsmall;F7FB +Ucyrillic;0423 +Udblacute;0170 +Udblgrave;0214 +Udieresis;00DC +Udieresisacute;01D7 +Udieresisbelow;1E72 +Udieresiscaron;01D9 +Udieresiscyrillic;04F0 +Udieresisgrave;01DB +Udieresismacron;01D5 +Udieresissmall;F7FC +Udotbelow;1EE4 +Ugrave;00D9 +Ugravesmall;F7F9 +Uhookabove;1EE6 +Uhorn;01AF +Uhornacute;1EE8 +Uhorndotbelow;1EF0 +Uhorngrave;1EEA +Uhornhookabove;1EEC +Uhorntilde;1EEE +Uhungarumlaut;0170 +Uhungarumlautcyrillic;04F2 +Uinvertedbreve;0216 +Ukcyrillic;0478 +Umacron;016A +Umacroncyrillic;04EE +Umacrondieresis;1E7A +Umonospace;FF35 +Uogonek;0172 +Upsilon;03A5 +Upsilon1;03D2 +Upsilonacutehooksymbolgreek;03D3 +Upsilonafrican;01B1 +Upsilondieresis;03AB +Upsilondieresishooksymbolgreek;03D4 +Upsilonhooksymbol;03D2 +Upsilontonos;038E +Uring;016E +Ushortcyrillic;040E +Usmall;F775 +Ustraightcyrillic;04AE +Ustraightstrokecyrillic;04B0 +Utilde;0168 +Utildeacute;1E78 +Utildebelow;1E74 +V;0056 +Vcircle;24CB +Vdotbelow;1E7E +Vecyrillic;0412 +Vewarmenian;054E +Vhook;01B2 +Vmonospace;FF36 +Voarmenian;0548 +Vsmall;F776 +Vtilde;1E7C +W;0057 +Wacute;1E82 +Wcircle;24CC +Wcircumflex;0174 +Wdieresis;1E84 +Wdotaccent;1E86 +Wdotbelow;1E88 +Wgrave;1E80 +Wmonospace;FF37 +Wsmall;F777 +X;0058 +Xcircle;24CD +Xdieresis;1E8C +Xdotaccent;1E8A +Xeharmenian;053D +Xi;039E +Xmonospace;FF38 +Xsmall;F778 +Y;0059 +Yacute;00DD +Yacutesmall;F7FD +Yatcyrillic;0462 +Ycircle;24CE +Ycircumflex;0176 +Ydieresis;0178 +Ydieresissmall;F7FF +Ydotaccent;1E8E +Ydotbelow;1EF4 +Yericyrillic;042B +Yerudieresiscyrillic;04F8 +Ygrave;1EF2 +Yhook;01B3 +Yhookabove;1EF6 +Yiarmenian;0545 +Yicyrillic;0407 +Yiwnarmenian;0552 +Ymonospace;FF39 +Ysmall;F779 +Ytilde;1EF8 +Yusbigcyrillic;046A +Yusbigiotifiedcyrillic;046C +Yuslittlecyrillic;0466 +Yuslittleiotifiedcyrillic;0468 +Z;005A +Zaarmenian;0536 +Zacute;0179 +Zcaron;017D +Zcaronsmall;F6FF +Zcircle;24CF +Zcircumflex;1E90 +Zdot;017B +Zdotaccent;017B +Zdotbelow;1E92 +Zecyrillic;0417 +Zedescendercyrillic;0498 +Zedieresiscyrillic;04DE +Zeta;0396 +Zhearmenian;053A +Zhebrevecyrillic;04C1 +Zhecyrillic;0416 +Zhedescendercyrillic;0496 +Zhedieresiscyrillic;04DC +Zlinebelow;1E94 +Zmonospace;FF3A +Zsmall;F77A +Zstroke;01B5 +a;0061 +aabengali;0986 +aacute;00E1 +aadeva;0906 +aagujarati;0A86 +aagurmukhi;0A06 +aamatragurmukhi;0A3E +aarusquare;3303 +aavowelsignbengali;09BE +aavowelsigndeva;093E +aavowelsigngujarati;0ABE +abbreviationmarkarmenian;055F +abbreviationsigndeva;0970 +abengali;0985 +abopomofo;311A +abreve;0103 +abreveacute;1EAF +abrevecyrillic;04D1 +abrevedotbelow;1EB7 +abrevegrave;1EB1 +abrevehookabove;1EB3 +abrevetilde;1EB5 +acaron;01CE +acircle;24D0 +acircumflex;00E2 +acircumflexacute;1EA5 +acircumflexdotbelow;1EAD +acircumflexgrave;1EA7 +acircumflexhookabove;1EA9 +acircumflextilde;1EAB +acute;00B4 +acutebelowcmb;0317 +acutecmb;0301 +acutecomb;0301 +acutedeva;0954 +acutelowmod;02CF +acutetonecmb;0341 +acyrillic;0430 +adblgrave;0201 +addakgurmukhi;0A71 +adeva;0905 +adieresis;00E4 +adieresiscyrillic;04D3 +adieresismacron;01DF +adotbelow;1EA1 +adotmacron;01E1 +ae;00E6 +aeacute;01FD +aekorean;3150 +aemacron;01E3 +afii00208;2015 +afii08941;20A4 +afii10017;0410 +afii10018;0411 +afii10019;0412 +afii10020;0413 +afii10021;0414 +afii10022;0415 +afii10023;0401 +afii10024;0416 +afii10025;0417 +afii10026;0418 +afii10027;0419 +afii10028;041A +afii10029;041B +afii10030;041C +afii10031;041D +afii10032;041E +afii10033;041F +afii10034;0420 +afii10035;0421 +afii10036;0422 +afii10037;0423 +afii10038;0424 +afii10039;0425 +afii10040;0426 +afii10041;0427 +afii10042;0428 +afii10043;0429 +afii10044;042A +afii10045;042B +afii10046;042C +afii10047;042D +afii10048;042E +afii10049;042F +afii10050;0490 +afii10051;0402 +afii10052;0403 +afii10053;0404 +afii10054;0405 +afii10055;0406 +afii10056;0407 +afii10057;0408 +afii10058;0409 +afii10059;040A +afii10060;040B +afii10061;040C +afii10062;040E +afii10063;F6C4 +afii10064;F6C5 +afii10065;0430 +afii10066;0431 +afii10067;0432 +afii10068;0433 +afii10069;0434 +afii10070;0435 +afii10071;0451 +afii10072;0436 +afii10073;0437 +afii10074;0438 +afii10075;0439 +afii10076;043A +afii10077;043B +afii10078;043C +afii10079;043D +afii10080;043E +afii10081;043F +afii10082;0440 +afii10083;0441 +afii10084;0442 +afii10085;0443 +afii10086;0444 +afii10087;0445 +afii10088;0446 +afii10089;0447 +afii10090;0448 +afii10091;0449 +afii10092;044A +afii10093;044B +afii10094;044C +afii10095;044D +afii10096;044E +afii10097;044F +afii10098;0491 +afii10099;0452 +afii10100;0453 +afii10101;0454 +afii10102;0455 +afii10103;0456 +afii10104;0457 +afii10105;0458 +afii10106;0459 +afii10107;045A +afii10108;045B +afii10109;045C +afii10110;045E +afii10145;040F +afii10146;0462 +afii10147;0472 +afii10148;0474 +afii10192;F6C6 +afii10193;045F +afii10194;0463 +afii10195;0473 +afii10196;0475 +afii10831;F6C7 +afii10832;F6C8 +afii10846;04D9 +afii299;200E +afii300;200F +afii301;200D +afii57381;066A +afii57388;060C +afii57392;0660 +afii57393;0661 +afii57394;0662 +afii57395;0663 +afii57396;0664 +afii57397;0665 +afii57398;0666 +afii57399;0667 +afii57400;0668 +afii57401;0669 +afii57403;061B +afii57407;061F +afii57409;0621 +afii57410;0622 +afii57411;0623 +afii57412;0624 +afii57413;0625 +afii57414;0626 +afii57415;0627 +afii57416;0628 +afii57417;0629 +afii57418;062A +afii57419;062B +afii57420;062C +afii57421;062D +afii57422;062E +afii57423;062F +afii57424;0630 +afii57425;0631 +afii57426;0632 +afii57427;0633 +afii57428;0634 +afii57429;0635 +afii57430;0636 +afii57431;0637 +afii57432;0638 +afii57433;0639 +afii57434;063A +afii57440;0640 +afii57441;0641 +afii57442;0642 +afii57443;0643 +afii57444;0644 +afii57445;0645 +afii57446;0646 +afii57448;0648 +afii57449;0649 +afii57450;064A +afii57451;064B +afii57452;064C +afii57453;064D +afii57454;064E +afii57455;064F +afii57456;0650 +afii57457;0651 +afii57458;0652 +afii57470;0647 +afii57505;06A4 +afii57506;067E +afii57507;0686 +afii57508;0698 +afii57509;06AF +afii57511;0679 +afii57512;0688 +afii57513;0691 +afii57514;06BA +afii57519;06D2 +afii57534;06D5 +afii57636;20AA +afii57645;05BE +afii57658;05C3 +afii57664;05D0 +afii57665;05D1 +afii57666;05D2 +afii57667;05D3 +afii57668;05D4 +afii57669;05D5 +afii57670;05D6 +afii57671;05D7 +afii57672;05D8 +afii57673;05D9 +afii57674;05DA +afii57675;05DB +afii57676;05DC +afii57677;05DD +afii57678;05DE +afii57679;05DF +afii57680;05E0 +afii57681;05E1 +afii57682;05E2 +afii57683;05E3 +afii57684;05E4 +afii57685;05E5 +afii57686;05E6 +afii57687;05E7 +afii57688;05E8 +afii57689;05E9 +afii57690;05EA +afii57694;FB2A +afii57695;FB2B +afii57700;FB4B +afii57705;FB1F +afii57716;05F0 +afii57717;05F1 +afii57718;05F2 +afii57723;FB35 +afii57793;05B4 +afii57794;05B5 +afii57795;05B6 +afii57796;05BB +afii57797;05B8 +afii57798;05B7 +afii57799;05B0 +afii57800;05B2 +afii57801;05B1 +afii57802;05B3 +afii57803;05C2 +afii57804;05C1 +afii57806;05B9 +afii57807;05BC +afii57839;05BD +afii57841;05BF +afii57842;05C0 +afii57929;02BC +afii61248;2105 +afii61289;2113 +afii61352;2116 +afii61573;202C +afii61574;202D +afii61575;202E +afii61664;200C +afii63167;066D +afii64937;02BD +agrave;00E0 +agujarati;0A85 +agurmukhi;0A05 +ahiragana;3042 +ahookabove;1EA3 +aibengali;0990 +aibopomofo;311E +aideva;0910 +aiecyrillic;04D5 +aigujarati;0A90 +aigurmukhi;0A10 +aimatragurmukhi;0A48 +ainarabic;0639 +ainfinalarabic;FECA +aininitialarabic;FECB +ainmedialarabic;FECC +ainvertedbreve;0203 +aivowelsignbengali;09C8 +aivowelsigndeva;0948 +aivowelsigngujarati;0AC8 +akatakana;30A2 +akatakanahalfwidth;FF71 +akorean;314F +alef;05D0 +alefarabic;0627 +alefdageshhebrew;FB30 +aleffinalarabic;FE8E +alefhamzaabovearabic;0623 +alefhamzaabovefinalarabic;FE84 +alefhamzabelowarabic;0625 +alefhamzabelowfinalarabic;FE88 +alefhebrew;05D0 +aleflamedhebrew;FB4F +alefmaddaabovearabic;0622 +alefmaddaabovefinalarabic;FE82 +alefmaksuraarabic;0649 +alefmaksurafinalarabic;FEF0 +alefmaksurainitialarabic;FEF3 +alefmaksuramedialarabic;FEF4 +alefpatahhebrew;FB2E +alefqamatshebrew;FB2F +aleph;2135 +allequal;224C +alpha;03B1 +alphatonos;03AC +amacron;0101 +amonospace;FF41 +ampersand;0026 +ampersandmonospace;FF06 +ampersandsmall;F726 +amsquare;33C2 +anbopomofo;3122 +angbopomofo;3124 +angkhankhuthai;0E5A +angle;2220 +anglebracketleft;3008 +anglebracketleftvertical;FE3F +anglebracketright;3009 +anglebracketrightvertical;FE40 +angleleft;2329 +angleright;232A +angstrom;212B +anoteleia;0387 +anudattadeva;0952 +anusvarabengali;0982 +anusvaradeva;0902 +anusvaragujarati;0A82 +aogonek;0105 +apaatosquare;3300 +aparen;249C +apostrophearmenian;055A +apostrophemod;02BC +apple;F8FF +approaches;2250 +approxequal;2248 +approxequalorimage;2252 +approximatelyequal;2245 +araeaekorean;318E +araeakorean;318D +arc;2312 +arighthalfring;1E9A +aring;00E5 +aringacute;01FB +aringbelow;1E01 +arrowboth;2194 +arrowdashdown;21E3 +arrowdashleft;21E0 +arrowdashright;21E2 +arrowdashup;21E1 +arrowdblboth;21D4 +arrowdbldown;21D3 +arrowdblleft;21D0 +arrowdblright;21D2 +arrowdblup;21D1 +arrowdown;2193 +arrowdownleft;2199 +arrowdownright;2198 +arrowdownwhite;21E9 +arrowheaddownmod;02C5 +arrowheadleftmod;02C2 +arrowheadrightmod;02C3 +arrowheadupmod;02C4 +arrowhorizex;F8E7 +arrowleft;2190 +arrowleftdbl;21D0 +arrowleftdblstroke;21CD +arrowleftoverright;21C6 +arrowleftwhite;21E6 +arrowright;2192 +arrowrightdblstroke;21CF +arrowrightheavy;279E +arrowrightoverleft;21C4 +arrowrightwhite;21E8 +arrowtableft;21E4 +arrowtabright;21E5 +arrowup;2191 +arrowupdn;2195 +arrowupdnbse;21A8 +arrowupdownbase;21A8 +arrowupleft;2196 +arrowupleftofdown;21C5 +arrowupright;2197 +arrowupwhite;21E7 +arrowvertex;F8E6 +asciicircum;005E +asciicircummonospace;FF3E +asciitilde;007E +asciitildemonospace;FF5E +ascript;0251 +ascriptturned;0252 +asmallhiragana;3041 +asmallkatakana;30A1 +asmallkatakanahalfwidth;FF67 +asterisk;002A +asteriskaltonearabic;066D +asteriskarabic;066D +asteriskmath;2217 +asteriskmonospace;FF0A +asterisksmall;FE61 +asterism;2042 +asuperior;F6E9 +asymptoticallyequal;2243 +at;0040 +atilde;00E3 +atmonospace;FF20 +atsmall;FE6B +aturned;0250 +aubengali;0994 +aubopomofo;3120 +audeva;0914 +augujarati;0A94 +augurmukhi;0A14 +aulengthmarkbengali;09D7 +aumatragurmukhi;0A4C +auvowelsignbengali;09CC +auvowelsigndeva;094C +auvowelsigngujarati;0ACC +avagrahadeva;093D +aybarmenian;0561 +ayin;05E2 +ayinaltonehebrew;FB20 +ayinhebrew;05E2 +b;0062 +babengali;09AC +backslash;005C +backslashmonospace;FF3C +badeva;092C +bagujarati;0AAC +bagurmukhi;0A2C +bahiragana;3070 +bahtthai;0E3F +bakatakana;30D0 +bar;007C +barmonospace;FF5C +bbopomofo;3105 +bcircle;24D1 +bdotaccent;1E03 +bdotbelow;1E05 +beamedsixteenthnotes;266C +because;2235 +becyrillic;0431 +beharabic;0628 +behfinalarabic;FE90 +behinitialarabic;FE91 +behiragana;3079 +behmedialarabic;FE92 +behmeeminitialarabic;FC9F +behmeemisolatedarabic;FC08 +behnoonfinalarabic;FC6D +bekatakana;30D9 +benarmenian;0562 +bet;05D1 +beta;03B2 +betasymbolgreek;03D0 +betdagesh;FB31 +betdageshhebrew;FB31 +bethebrew;05D1 +betrafehebrew;FB4C +bhabengali;09AD +bhadeva;092D +bhagujarati;0AAD +bhagurmukhi;0A2D +bhook;0253 +bihiragana;3073 +bikatakana;30D3 +bilabialclick;0298 +bindigurmukhi;0A02 +birusquare;3331 +blackcircle;25CF +blackdiamond;25C6 +blackdownpointingtriangle;25BC +blackleftpointingpointer;25C4 +blackleftpointingtriangle;25C0 +blacklenticularbracketleft;3010 +blacklenticularbracketleftvertical;FE3B +blacklenticularbracketright;3011 +blacklenticularbracketrightvertical;FE3C +blacklowerlefttriangle;25E3 +blacklowerrighttriangle;25E2 +blackrectangle;25AC +blackrightpointingpointer;25BA +blackrightpointingtriangle;25B6 +blacksmallsquare;25AA +blacksmilingface;263B +blacksquare;25A0 +blackstar;2605 +blackupperlefttriangle;25E4 +blackupperrighttriangle;25E5 +blackuppointingsmalltriangle;25B4 +blackuppointingtriangle;25B2 +blank;2423 +blinebelow;1E07 +block;2588 +bmonospace;FF42 +bobaimaithai;0E1A +bohiragana;307C +bokatakana;30DC +bparen;249D +bqsquare;33C3 +braceex;F8F4 +braceleft;007B +braceleftbt;F8F3 +braceleftmid;F8F2 +braceleftmonospace;FF5B +braceleftsmall;FE5B +bracelefttp;F8F1 +braceleftvertical;FE37 +braceright;007D +bracerightbt;F8FE +bracerightmid;F8FD +bracerightmonospace;FF5D +bracerightsmall;FE5C +bracerighttp;F8FC +bracerightvertical;FE38 +bracketleft;005B +bracketleftbt;F8F0 +bracketleftex;F8EF +bracketleftmonospace;FF3B +bracketlefttp;F8EE +bracketright;005D +bracketrightbt;F8FB +bracketrightex;F8FA +bracketrightmonospace;FF3D +bracketrighttp;F8F9 +breve;02D8 +brevebelowcmb;032E +brevecmb;0306 +breveinvertedbelowcmb;032F +breveinvertedcmb;0311 +breveinverteddoublecmb;0361 +bridgebelowcmb;032A +bridgeinvertedbelowcmb;033A +brokenbar;00A6 +bstroke;0180 +bsuperior;F6EA +btopbar;0183 +buhiragana;3076 +bukatakana;30D6 +bullet;2022 +bulletinverse;25D8 +bulletoperator;2219 +bullseye;25CE +c;0063 +caarmenian;056E +cabengali;099A +cacute;0107 +cadeva;091A +cagujarati;0A9A +cagurmukhi;0A1A +calsquare;3388 +candrabindubengali;0981 +candrabinducmb;0310 +candrabindudeva;0901 +candrabindugujarati;0A81 +capslock;21EA +careof;2105 +caron;02C7 +caronbelowcmb;032C +caroncmb;030C +carriagereturn;21B5 +cbopomofo;3118 +ccaron;010D +ccedilla;00E7 +ccedillaacute;1E09 +ccircle;24D2 +ccircumflex;0109 +ccurl;0255 +cdot;010B +cdotaccent;010B +cdsquare;33C5 +cedilla;00B8 +cedillacmb;0327 +cent;00A2 +centigrade;2103 +centinferior;F6DF +centmonospace;FFE0 +centoldstyle;F7A2 +centsuperior;F6E0 +chaarmenian;0579 +chabengali;099B +chadeva;091B +chagujarati;0A9B +chagurmukhi;0A1B +chbopomofo;3114 +cheabkhasiancyrillic;04BD +checkmark;2713 +checyrillic;0447 +chedescenderabkhasiancyrillic;04BF +chedescendercyrillic;04B7 +chedieresiscyrillic;04F5 +cheharmenian;0573 +chekhakassiancyrillic;04CC +cheverticalstrokecyrillic;04B9 +chi;03C7 +chieuchacirclekorean;3277 +chieuchaparenkorean;3217 +chieuchcirclekorean;3269 +chieuchkorean;314A +chieuchparenkorean;3209 +chochangthai;0E0A +chochanthai;0E08 +chochingthai;0E09 +chochoethai;0E0C +chook;0188 +cieucacirclekorean;3276 +cieucaparenkorean;3216 +cieuccirclekorean;3268 +cieuckorean;3148 +cieucparenkorean;3208 +cieucuparenkorean;321C +circle;25CB +circlemultiply;2297 +circleot;2299 +circleplus;2295 +circlepostalmark;3036 +circlewithlefthalfblack;25D0 +circlewithrighthalfblack;25D1 +circumflex;02C6 +circumflexbelowcmb;032D +circumflexcmb;0302 +clear;2327 +clickalveolar;01C2 +clickdental;01C0 +clicklateral;01C1 +clickretroflex;01C3 +club;2663 +clubsuitblack;2663 +clubsuitwhite;2667 +cmcubedsquare;33A4 +cmonospace;FF43 +cmsquaredsquare;33A0 +coarmenian;0581 +colon;003A +colonmonetary;20A1 +colonmonospace;FF1A +colonsign;20A1 +colonsmall;FE55 +colontriangularhalfmod;02D1 +colontriangularmod;02D0 +comma;002C +commaabovecmb;0313 +commaaboverightcmb;0315 +commaaccent;F6C3 +commaarabic;060C +commaarmenian;055D +commainferior;F6E1 +commamonospace;FF0C +commareversedabovecmb;0314 +commareversedmod;02BD +commasmall;FE50 +commasuperior;F6E2 +commaturnedabovecmb;0312 +commaturnedmod;02BB +compass;263C +congruent;2245 +contourintegral;222E +control;2303 +controlACK;0006 +controlBEL;0007 +controlBS;0008 +controlCAN;0018 +controlCR;000D +controlDC1;0011 +controlDC2;0012 +controlDC3;0013 +controlDC4;0014 +controlDEL;007F +controlDLE;0010 +controlEM;0019 +controlENQ;0005 +controlEOT;0004 +controlESC;001B +controlETB;0017 +controlETX;0003 +controlFF;000C +controlFS;001C +controlGS;001D +controlHT;0009 +controlLF;000A +controlNAK;0015 +controlRS;001E +controlSI;000F +controlSO;000E +controlSOT;0002 +controlSTX;0001 +controlSUB;001A +controlSYN;0016 +controlUS;001F +controlVT;000B +copyright;00A9 +copyrightsans;F8E9 +copyrightserif;F6D9 +cornerbracketleft;300C +cornerbracketlefthalfwidth;FF62 +cornerbracketleftvertical;FE41 +cornerbracketright;300D +cornerbracketrighthalfwidth;FF63 +cornerbracketrightvertical;FE42 +corporationsquare;337F +cosquare;33C7 +coverkgsquare;33C6 +cparen;249E +cruzeiro;20A2 +cstretched;0297 +curlyand;22CF +curlyor;22CE +currency;00A4 +cyrBreve;F6D1 +cyrFlex;F6D2 +cyrbreve;F6D4 +cyrflex;F6D5 +d;0064 +daarmenian;0564 +dabengali;09A6 +dadarabic;0636 +dadeva;0926 +dadfinalarabic;FEBE +dadinitialarabic;FEBF +dadmedialarabic;FEC0 +dagesh;05BC +dageshhebrew;05BC +dagger;2020 +daggerdbl;2021 +dagujarati;0AA6 +dagurmukhi;0A26 +dahiragana;3060 +dakatakana;30C0 +dalarabic;062F +dalet;05D3 +daletdagesh;FB33 +daletdageshhebrew;FB33 +dalethatafpatah;05D3 05B2 +dalethatafpatahhebrew;05D3 05B2 +dalethatafsegol;05D3 05B1 +dalethatafsegolhebrew;05D3 05B1 +dalethebrew;05D3 +dalethiriq;05D3 05B4 +dalethiriqhebrew;05D3 05B4 +daletholam;05D3 05B9 +daletholamhebrew;05D3 05B9 +daletpatah;05D3 05B7 +daletpatahhebrew;05D3 05B7 +daletqamats;05D3 05B8 +daletqamatshebrew;05D3 05B8 +daletqubuts;05D3 05BB +daletqubutshebrew;05D3 05BB +daletsegol;05D3 05B6 +daletsegolhebrew;05D3 05B6 +daletsheva;05D3 05B0 +daletshevahebrew;05D3 05B0 +dalettsere;05D3 05B5 +dalettserehebrew;05D3 05B5 +dalfinalarabic;FEAA +dammaarabic;064F +dammalowarabic;064F +dammatanaltonearabic;064C +dammatanarabic;064C +danda;0964 +dargahebrew;05A7 +dargalefthebrew;05A7 +dasiapneumatacyrilliccmb;0485 +dblGrave;F6D3 +dblanglebracketleft;300A +dblanglebracketleftvertical;FE3D +dblanglebracketright;300B +dblanglebracketrightvertical;FE3E +dblarchinvertedbelowcmb;032B +dblarrowleft;21D4 +dblarrowright;21D2 +dbldanda;0965 +dblgrave;F6D6 +dblgravecmb;030F +dblintegral;222C +dbllowline;2017 +dbllowlinecmb;0333 +dbloverlinecmb;033F +dblprimemod;02BA +dblverticalbar;2016 +dblverticallineabovecmb;030E +dbopomofo;3109 +dbsquare;33C8 +dcaron;010F +dcedilla;1E11 +dcircle;24D3 +dcircumflexbelow;1E13 +dcroat;0111 +ddabengali;09A1 +ddadeva;0921 +ddagujarati;0AA1 +ddagurmukhi;0A21 +ddalarabic;0688 +ddalfinalarabic;FB89 +dddhadeva;095C +ddhabengali;09A2 +ddhadeva;0922 +ddhagujarati;0AA2 +ddhagurmukhi;0A22 +ddotaccent;1E0B +ddotbelow;1E0D +decimalseparatorarabic;066B +decimalseparatorpersian;066B +decyrillic;0434 +degree;00B0 +dehihebrew;05AD +dehiragana;3067 +deicoptic;03EF +dekatakana;30C7 +deleteleft;232B +deleteright;2326 +delta;03B4 +deltaturned;018D +denominatorminusonenumeratorbengali;09F8 +dezh;02A4 +dhabengali;09A7 +dhadeva;0927 +dhagujarati;0AA7 +dhagurmukhi;0A27 +dhook;0257 +dialytikatonos;0385 +dialytikatonoscmb;0344 +diamond;2666 +diamondsuitwhite;2662 +dieresis;00A8 +dieresisacute;F6D7 +dieresisbelowcmb;0324 +dieresiscmb;0308 +dieresisgrave;F6D8 +dieresistonos;0385 +dihiragana;3062 +dikatakana;30C2 +dittomark;3003 +divide;00F7 +divides;2223 +divisionslash;2215 +djecyrillic;0452 +dkshade;2593 +dlinebelow;1E0F +dlsquare;3397 +dmacron;0111 +dmonospace;FF44 +dnblock;2584 +dochadathai;0E0E +dodekthai;0E14 +dohiragana;3069 +dokatakana;30C9 +dollar;0024 +dollarinferior;F6E3 +dollarmonospace;FF04 +dollaroldstyle;F724 +dollarsmall;FE69 +dollarsuperior;F6E4 +dong;20AB +dorusquare;3326 +dotaccent;02D9 +dotaccentcmb;0307 +dotbelowcmb;0323 +dotbelowcomb;0323 +dotkatakana;30FB +dotlessi;0131 +dotlessj;F6BE +dotlessjstrokehook;0284 +dotmath;22C5 +dottedcircle;25CC +doubleyodpatah;FB1F +doubleyodpatahhebrew;FB1F +downtackbelowcmb;031E +downtackmod;02D5 +dparen;249F +dsuperior;F6EB +dtail;0256 +dtopbar;018C +duhiragana;3065 +dukatakana;30C5 +dz;01F3 +dzaltone;02A3 +dzcaron;01C6 +dzcurl;02A5 +dzeabkhasiancyrillic;04E1 +dzecyrillic;0455 +dzhecyrillic;045F +e;0065 +eacute;00E9 +earth;2641 +ebengali;098F +ebopomofo;311C +ebreve;0115 +ecandradeva;090D +ecandragujarati;0A8D +ecandravowelsigndeva;0945 +ecandravowelsigngujarati;0AC5 +ecaron;011B +ecedillabreve;1E1D +echarmenian;0565 +echyiwnarmenian;0587 +ecircle;24D4 +ecircumflex;00EA +ecircumflexacute;1EBF +ecircumflexbelow;1E19 +ecircumflexdotbelow;1EC7 +ecircumflexgrave;1EC1 +ecircumflexhookabove;1EC3 +ecircumflextilde;1EC5 +ecyrillic;0454 +edblgrave;0205 +edeva;090F +edieresis;00EB +edot;0117 +edotaccent;0117 +edotbelow;1EB9 +eegurmukhi;0A0F +eematragurmukhi;0A47 +efcyrillic;0444 +egrave;00E8 +egujarati;0A8F +eharmenian;0567 +ehbopomofo;311D +ehiragana;3048 +ehookabove;1EBB +eibopomofo;311F +eight;0038 +eightarabic;0668 +eightbengali;09EE +eightcircle;2467 +eightcircleinversesansserif;2791 +eightdeva;096E +eighteencircle;2471 +eighteenparen;2485 +eighteenperiod;2499 +eightgujarati;0AEE +eightgurmukhi;0A6E +eighthackarabic;0668 +eighthangzhou;3028 +eighthnotebeamed;266B +eightideographicparen;3227 +eightinferior;2088 +eightmonospace;FF18 +eightoldstyle;F738 +eightparen;247B +eightperiod;248F +eightpersian;06F8 +eightroman;2177 +eightsuperior;2078 +eightthai;0E58 +einvertedbreve;0207 +eiotifiedcyrillic;0465 +ekatakana;30A8 +ekatakanahalfwidth;FF74 +ekonkargurmukhi;0A74 +ekorean;3154 +elcyrillic;043B +element;2208 +elevencircle;246A +elevenparen;247E +elevenperiod;2492 +elevenroman;217A +ellipsis;2026 +ellipsisvertical;22EE +emacron;0113 +emacronacute;1E17 +emacrongrave;1E15 +emcyrillic;043C +emdash;2014 +emdashvertical;FE31 +emonospace;FF45 +emphasismarkarmenian;055B +emptyset;2205 +enbopomofo;3123 +encyrillic;043D +endash;2013 +endashvertical;FE32 +endescendercyrillic;04A3 +eng;014B +engbopomofo;3125 +enghecyrillic;04A5 +enhookcyrillic;04C8 +enspace;2002 +eogonek;0119 +eokorean;3153 +eopen;025B +eopenclosed;029A +eopenreversed;025C +eopenreversedclosed;025E +eopenreversedhook;025D +eparen;24A0 +epsilon;03B5 +epsilontonos;03AD +equal;003D +equalmonospace;FF1D +equalsmall;FE66 +equalsuperior;207C +equivalence;2261 +erbopomofo;3126 +ercyrillic;0440 +ereversed;0258 +ereversedcyrillic;044D +escyrillic;0441 +esdescendercyrillic;04AB +esh;0283 +eshcurl;0286 +eshortdeva;090E +eshortvowelsigndeva;0946 +eshreversedloop;01AA +eshsquatreversed;0285 +esmallhiragana;3047 +esmallkatakana;30A7 +esmallkatakanahalfwidth;FF6A +estimated;212E +esuperior;F6EC +eta;03B7 +etarmenian;0568 +etatonos;03AE +eth;00F0 +etilde;1EBD +etildebelow;1E1B +etnahtafoukhhebrew;0591 +etnahtafoukhlefthebrew;0591 +etnahtahebrew;0591 +etnahtalefthebrew;0591 +eturned;01DD +eukorean;3161 +euro;20AC +evowelsignbengali;09C7 +evowelsigndeva;0947 +evowelsigngujarati;0AC7 +exclam;0021 +exclamarmenian;055C +exclamdbl;203C +exclamdown;00A1 +exclamdownsmall;F7A1 +exclammonospace;FF01 +exclamsmall;F721 +existential;2203 +ezh;0292 +ezhcaron;01EF +ezhcurl;0293 +ezhreversed;01B9 +ezhtail;01BA +f;0066 +fadeva;095E +fagurmukhi;0A5E +fahrenheit;2109 +fathaarabic;064E +fathalowarabic;064E +fathatanarabic;064B +fbopomofo;3108 +fcircle;24D5 +fdotaccent;1E1F +feharabic;0641 +feharmenian;0586 +fehfinalarabic;FED2 +fehinitialarabic;FED3 +fehmedialarabic;FED4 +feicoptic;03E5 +female;2640 +ff;FB00 +ffi;FB03 +ffl;FB04 +fi;FB01 +fifteencircle;246E +fifteenparen;2482 +fifteenperiod;2496 +figuredash;2012 +filledbox;25A0 +filledrect;25AC +finalkaf;05DA +finalkafdagesh;FB3A +finalkafdageshhebrew;FB3A +finalkafhebrew;05DA +finalkafqamats;05DA 05B8 +finalkafqamatshebrew;05DA 05B8 +finalkafsheva;05DA 05B0 +finalkafshevahebrew;05DA 05B0 +finalmem;05DD +finalmemhebrew;05DD +finalnun;05DF +finalnunhebrew;05DF +finalpe;05E3 +finalpehebrew;05E3 +finaltsadi;05E5 +finaltsadihebrew;05E5 +firsttonechinese;02C9 +fisheye;25C9 +fitacyrillic;0473 +five;0035 +fivearabic;0665 +fivebengali;09EB +fivecircle;2464 +fivecircleinversesansserif;278E +fivedeva;096B +fiveeighths;215D +fivegujarati;0AEB +fivegurmukhi;0A6B +fivehackarabic;0665 +fivehangzhou;3025 +fiveideographicparen;3224 +fiveinferior;2085 +fivemonospace;FF15 +fiveoldstyle;F735 +fiveparen;2478 +fiveperiod;248C +fivepersian;06F5 +fiveroman;2174 +fivesuperior;2075 +fivethai;0E55 +fl;FB02 +florin;0192 +fmonospace;FF46 +fmsquare;3399 +fofanthai;0E1F +fofathai;0E1D +fongmanthai;0E4F +forall;2200 +four;0034 +fourarabic;0664 +fourbengali;09EA +fourcircle;2463 +fourcircleinversesansserif;278D +fourdeva;096A +fourgujarati;0AEA +fourgurmukhi;0A6A +fourhackarabic;0664 +fourhangzhou;3024 +fourideographicparen;3223 +fourinferior;2084 +fourmonospace;FF14 +fournumeratorbengali;09F7 +fouroldstyle;F734 +fourparen;2477 +fourperiod;248B +fourpersian;06F4 +fourroman;2173 +foursuperior;2074 +fourteencircle;246D +fourteenparen;2481 +fourteenperiod;2495 +fourthai;0E54 +fourthtonechinese;02CB +fparen;24A1 +fraction;2044 +franc;20A3 +g;0067 +gabengali;0997 +gacute;01F5 +gadeva;0917 +gafarabic;06AF +gaffinalarabic;FB93 +gafinitialarabic;FB94 +gafmedialarabic;FB95 +gagujarati;0A97 +gagurmukhi;0A17 +gahiragana;304C +gakatakana;30AC +gamma;03B3 +gammalatinsmall;0263 +gammasuperior;02E0 +gangiacoptic;03EB +gbopomofo;310D +gbreve;011F +gcaron;01E7 +gcedilla;0123 +gcircle;24D6 +gcircumflex;011D +gcommaaccent;0123 +gdot;0121 +gdotaccent;0121 +gecyrillic;0433 +gehiragana;3052 +gekatakana;30B2 +geometricallyequal;2251 +gereshaccenthebrew;059C +gereshhebrew;05F3 +gereshmuqdamhebrew;059D +germandbls;00DF +gershayimaccenthebrew;059E +gershayimhebrew;05F4 +getamark;3013 +ghabengali;0998 +ghadarmenian;0572 +ghadeva;0918 +ghagujarati;0A98 +ghagurmukhi;0A18 +ghainarabic;063A +ghainfinalarabic;FECE +ghaininitialarabic;FECF +ghainmedialarabic;FED0 +ghemiddlehookcyrillic;0495 +ghestrokecyrillic;0493 +gheupturncyrillic;0491 +ghhadeva;095A +ghhagurmukhi;0A5A +ghook;0260 +ghzsquare;3393 +gihiragana;304E +gikatakana;30AE +gimarmenian;0563 +gimel;05D2 +gimeldagesh;FB32 +gimeldageshhebrew;FB32 +gimelhebrew;05D2 +gjecyrillic;0453 +glottalinvertedstroke;01BE +glottalstop;0294 +glottalstopinverted;0296 +glottalstopmod;02C0 +glottalstopreversed;0295 +glottalstopreversedmod;02C1 +glottalstopreversedsuperior;02E4 +glottalstopstroke;02A1 +glottalstopstrokereversed;02A2 +gmacron;1E21 +gmonospace;FF47 +gohiragana;3054 +gokatakana;30B4 +gparen;24A2 +gpasquare;33AC +gradient;2207 +grave;0060 +gravebelowcmb;0316 +gravecmb;0300 +gravecomb;0300 +gravedeva;0953 +gravelowmod;02CE +gravemonospace;FF40 +gravetonecmb;0340 +greater;003E +greaterequal;2265 +greaterequalorless;22DB +greatermonospace;FF1E +greaterorequivalent;2273 +greaterorless;2277 +greateroverequal;2267 +greatersmall;FE65 +gscript;0261 +gstroke;01E5 +guhiragana;3050 +guillemotleft;00AB +guillemotright;00BB +guilsinglleft;2039 +guilsinglright;203A +gukatakana;30B0 +guramusquare;3318 +gysquare;33C9 +h;0068 +haabkhasiancyrillic;04A9 +haaltonearabic;06C1 +habengali;09B9 +hadescendercyrillic;04B3 +hadeva;0939 +hagujarati;0AB9 +hagurmukhi;0A39 +haharabic;062D +hahfinalarabic;FEA2 +hahinitialarabic;FEA3 +hahiragana;306F +hahmedialarabic;FEA4 +haitusquare;332A +hakatakana;30CF +hakatakanahalfwidth;FF8A +halantgurmukhi;0A4D +hamzaarabic;0621 +hamzadammaarabic;0621 064F +hamzadammatanarabic;0621 064C +hamzafathaarabic;0621 064E +hamzafathatanarabic;0621 064B +hamzalowarabic;0621 +hamzalowkasraarabic;0621 0650 +hamzalowkasratanarabic;0621 064D +hamzasukunarabic;0621 0652 +hangulfiller;3164 +hardsigncyrillic;044A +harpoonleftbarbup;21BC +harpoonrightbarbup;21C0 +hasquare;33CA +hatafpatah;05B2 +hatafpatah16;05B2 +hatafpatah23;05B2 +hatafpatah2f;05B2 +hatafpatahhebrew;05B2 +hatafpatahnarrowhebrew;05B2 +hatafpatahquarterhebrew;05B2 +hatafpatahwidehebrew;05B2 +hatafqamats;05B3 +hatafqamats1b;05B3 +hatafqamats28;05B3 +hatafqamats34;05B3 +hatafqamatshebrew;05B3 +hatafqamatsnarrowhebrew;05B3 +hatafqamatsquarterhebrew;05B3 +hatafqamatswidehebrew;05B3 +hatafsegol;05B1 +hatafsegol17;05B1 +hatafsegol24;05B1 +hatafsegol30;05B1 +hatafsegolhebrew;05B1 +hatafsegolnarrowhebrew;05B1 +hatafsegolquarterhebrew;05B1 +hatafsegolwidehebrew;05B1 +hbar;0127 +hbopomofo;310F +hbrevebelow;1E2B +hcedilla;1E29 +hcircle;24D7 +hcircumflex;0125 +hdieresis;1E27 +hdotaccent;1E23 +hdotbelow;1E25 +he;05D4 +heart;2665 +heartsuitblack;2665 +heartsuitwhite;2661 +hedagesh;FB34 +hedageshhebrew;FB34 +hehaltonearabic;06C1 +heharabic;0647 +hehebrew;05D4 +hehfinalaltonearabic;FBA7 +hehfinalalttwoarabic;FEEA +hehfinalarabic;FEEA +hehhamzaabovefinalarabic;FBA5 +hehhamzaaboveisolatedarabic;FBA4 +hehinitialaltonearabic;FBA8 +hehinitialarabic;FEEB +hehiragana;3078 +hehmedialaltonearabic;FBA9 +hehmedialarabic;FEEC +heiseierasquare;337B +hekatakana;30D8 +hekatakanahalfwidth;FF8D +hekutaarusquare;3336 +henghook;0267 +herutusquare;3339 +het;05D7 +hethebrew;05D7 +hhook;0266 +hhooksuperior;02B1 +hieuhacirclekorean;327B +hieuhaparenkorean;321B +hieuhcirclekorean;326D +hieuhkorean;314E +hieuhparenkorean;320D +hihiragana;3072 +hikatakana;30D2 +hikatakanahalfwidth;FF8B +hiriq;05B4 +hiriq14;05B4 +hiriq21;05B4 +hiriq2d;05B4 +hiriqhebrew;05B4 +hiriqnarrowhebrew;05B4 +hiriqquarterhebrew;05B4 +hiriqwidehebrew;05B4 +hlinebelow;1E96 +hmonospace;FF48 +hoarmenian;0570 +hohipthai;0E2B +hohiragana;307B +hokatakana;30DB +hokatakanahalfwidth;FF8E +holam;05B9 +holam19;05B9 +holam26;05B9 +holam32;05B9 +holamhebrew;05B9 +holamnarrowhebrew;05B9 +holamquarterhebrew;05B9 +holamwidehebrew;05B9 +honokhukthai;0E2E +hookabovecomb;0309 +hookcmb;0309 +hookpalatalizedbelowcmb;0321 +hookretroflexbelowcmb;0322 +hoonsquare;3342 +horicoptic;03E9 +horizontalbar;2015 +horncmb;031B +hotsprings;2668 +house;2302 +hparen;24A3 +hsuperior;02B0 +hturned;0265 +huhiragana;3075 +huiitosquare;3333 +hukatakana;30D5 +hukatakanahalfwidth;FF8C +hungarumlaut;02DD +hungarumlautcmb;030B +hv;0195 +hyphen;002D +hypheninferior;F6E5 +hyphenmonospace;FF0D +hyphensmall;FE63 +hyphensuperior;F6E6 +hyphentwo;2010 +i;0069 +iacute;00ED +iacyrillic;044F +ibengali;0987 +ibopomofo;3127 +ibreve;012D +icaron;01D0 +icircle;24D8 +icircumflex;00EE +icyrillic;0456 +idblgrave;0209 +ideographearthcircle;328F +ideographfirecircle;328B +ideographicallianceparen;323F +ideographiccallparen;323A +ideographiccentrecircle;32A5 +ideographicclose;3006 +ideographiccomma;3001 +ideographiccommaleft;FF64 +ideographiccongratulationparen;3237 +ideographiccorrectcircle;32A3 +ideographicearthparen;322F +ideographicenterpriseparen;323D +ideographicexcellentcircle;329D +ideographicfestivalparen;3240 +ideographicfinancialcircle;3296 +ideographicfinancialparen;3236 +ideographicfireparen;322B +ideographichaveparen;3232 +ideographichighcircle;32A4 +ideographiciterationmark;3005 +ideographiclaborcircle;3298 +ideographiclaborparen;3238 +ideographicleftcircle;32A7 +ideographiclowcircle;32A6 +ideographicmedicinecircle;32A9 +ideographicmetalparen;322E +ideographicmoonparen;322A +ideographicnameparen;3234 +ideographicperiod;3002 +ideographicprintcircle;329E +ideographicreachparen;3243 +ideographicrepresentparen;3239 +ideographicresourceparen;323E +ideographicrightcircle;32A8 +ideographicsecretcircle;3299 +ideographicselfparen;3242 +ideographicsocietyparen;3233 +ideographicspace;3000 +ideographicspecialparen;3235 +ideographicstockparen;3231 +ideographicstudyparen;323B +ideographicsunparen;3230 +ideographicsuperviseparen;323C +ideographicwaterparen;322C +ideographicwoodparen;322D +ideographiczero;3007 +ideographmetalcircle;328E +ideographmooncircle;328A +ideographnamecircle;3294 +ideographsuncircle;3290 +ideographwatercircle;328C +ideographwoodcircle;328D +ideva;0907 +idieresis;00EF +idieresisacute;1E2F +idieresiscyrillic;04E5 +idotbelow;1ECB +iebrevecyrillic;04D7 +iecyrillic;0435 +ieungacirclekorean;3275 +ieungaparenkorean;3215 +ieungcirclekorean;3267 +ieungkorean;3147 +ieungparenkorean;3207 +igrave;00EC +igujarati;0A87 +igurmukhi;0A07 +ihiragana;3044 +ihookabove;1EC9 +iibengali;0988 +iicyrillic;0438 +iideva;0908 +iigujarati;0A88 +iigurmukhi;0A08 +iimatragurmukhi;0A40 +iinvertedbreve;020B +iishortcyrillic;0439 +iivowelsignbengali;09C0 +iivowelsigndeva;0940 +iivowelsigngujarati;0AC0 +ij;0133 +ikatakana;30A4 +ikatakanahalfwidth;FF72 +ikorean;3163 +ilde;02DC +iluyhebrew;05AC +imacron;012B +imacroncyrillic;04E3 +imageorapproximatelyequal;2253 +imatragurmukhi;0A3F +imonospace;FF49 +increment;2206 +infinity;221E +iniarmenian;056B +integral;222B +integralbottom;2321 +integralbt;2321 +integralex;F8F5 +integraltop;2320 +integraltp;2320 +intersection;2229 +intisquare;3305 +invbullet;25D8 +invcircle;25D9 +invsmileface;263B +iocyrillic;0451 +iogonek;012F +iota;03B9 +iotadieresis;03CA +iotadieresistonos;0390 +iotalatin;0269 +iotatonos;03AF +iparen;24A4 +irigurmukhi;0A72 +ismallhiragana;3043 +ismallkatakana;30A3 +ismallkatakanahalfwidth;FF68 +issharbengali;09FA +istroke;0268 +isuperior;F6ED +iterationhiragana;309D +iterationkatakana;30FD +itilde;0129 +itildebelow;1E2D +iubopomofo;3129 +iucyrillic;044E +ivowelsignbengali;09BF +ivowelsigndeva;093F +ivowelsigngujarati;0ABF +izhitsacyrillic;0475 +izhitsadblgravecyrillic;0477 +j;006A +jaarmenian;0571 +jabengali;099C +jadeva;091C +jagujarati;0A9C +jagurmukhi;0A1C +jbopomofo;3110 +jcaron;01F0 +jcircle;24D9 +jcircumflex;0135 +jcrossedtail;029D +jdotlessstroke;025F +jecyrillic;0458 +jeemarabic;062C +jeemfinalarabic;FE9E +jeeminitialarabic;FE9F +jeemmedialarabic;FEA0 +jeharabic;0698 +jehfinalarabic;FB8B +jhabengali;099D +jhadeva;091D +jhagujarati;0A9D +jhagurmukhi;0A1D +jheharmenian;057B +jis;3004 +jmonospace;FF4A +jparen;24A5 +jsuperior;02B2 +k;006B +kabashkircyrillic;04A1 +kabengali;0995 +kacute;1E31 +kacyrillic;043A +kadescendercyrillic;049B +kadeva;0915 +kaf;05DB +kafarabic;0643 +kafdagesh;FB3B +kafdageshhebrew;FB3B +kaffinalarabic;FEDA +kafhebrew;05DB +kafinitialarabic;FEDB +kafmedialarabic;FEDC +kafrafehebrew;FB4D +kagujarati;0A95 +kagurmukhi;0A15 +kahiragana;304B +kahookcyrillic;04C4 +kakatakana;30AB +kakatakanahalfwidth;FF76 +kappa;03BA +kappasymbolgreek;03F0 +kapyeounmieumkorean;3171 +kapyeounphieuphkorean;3184 +kapyeounpieupkorean;3178 +kapyeounssangpieupkorean;3179 +karoriisquare;330D +kashidaautoarabic;0640 +kashidaautonosidebearingarabic;0640 +kasmallkatakana;30F5 +kasquare;3384 +kasraarabic;0650 +kasratanarabic;064D +kastrokecyrillic;049F +katahiraprolongmarkhalfwidth;FF70 +kaverticalstrokecyrillic;049D +kbopomofo;310E +kcalsquare;3389 +kcaron;01E9 +kcedilla;0137 +kcircle;24DA +kcommaaccent;0137 +kdotbelow;1E33 +keharmenian;0584 +kehiragana;3051 +kekatakana;30B1 +kekatakanahalfwidth;FF79 +kenarmenian;056F +kesmallkatakana;30F6 +kgreenlandic;0138 +khabengali;0996 +khacyrillic;0445 +khadeva;0916 +khagujarati;0A96 +khagurmukhi;0A16 +khaharabic;062E +khahfinalarabic;FEA6 +khahinitialarabic;FEA7 +khahmedialarabic;FEA8 +kheicoptic;03E7 +khhadeva;0959 +khhagurmukhi;0A59 +khieukhacirclekorean;3278 +khieukhaparenkorean;3218 +khieukhcirclekorean;326A +khieukhkorean;314B +khieukhparenkorean;320A +khokhaithai;0E02 +khokhonthai;0E05 +khokhuatthai;0E03 +khokhwaithai;0E04 +khomutthai;0E5B +khook;0199 +khorakhangthai;0E06 +khzsquare;3391 +kihiragana;304D +kikatakana;30AD +kikatakanahalfwidth;FF77 +kiroguramusquare;3315 +kiromeetorusquare;3316 +kirosquare;3314 +kiyeokacirclekorean;326E +kiyeokaparenkorean;320E +kiyeokcirclekorean;3260 +kiyeokkorean;3131 +kiyeokparenkorean;3200 +kiyeoksioskorean;3133 +kjecyrillic;045C +klinebelow;1E35 +klsquare;3398 +kmcubedsquare;33A6 +kmonospace;FF4B +kmsquaredsquare;33A2 +kohiragana;3053 +kohmsquare;33C0 +kokaithai;0E01 +kokatakana;30B3 +kokatakanahalfwidth;FF7A +kooposquare;331E +koppacyrillic;0481 +koreanstandardsymbol;327F +koroniscmb;0343 +kparen;24A6 +kpasquare;33AA +ksicyrillic;046F +ktsquare;33CF +kturned;029E +kuhiragana;304F +kukatakana;30AF +kukatakanahalfwidth;FF78 +kvsquare;33B8 +kwsquare;33BE +l;006C +labengali;09B2 +lacute;013A +ladeva;0932 +lagujarati;0AB2 +lagurmukhi;0A32 +lakkhangyaothai;0E45 +lamaleffinalarabic;FEFC +lamalefhamzaabovefinalarabic;FEF8 +lamalefhamzaaboveisolatedarabic;FEF7 +lamalefhamzabelowfinalarabic;FEFA +lamalefhamzabelowisolatedarabic;FEF9 +lamalefisolatedarabic;FEFB +lamalefmaddaabovefinalarabic;FEF6 +lamalefmaddaaboveisolatedarabic;FEF5 +lamarabic;0644 +lambda;03BB +lambdastroke;019B +lamed;05DC +lameddagesh;FB3C +lameddageshhebrew;FB3C +lamedhebrew;05DC +lamedholam;05DC 05B9 +lamedholamdagesh;05DC 05B9 05BC +lamedholamdageshhebrew;05DC 05B9 05BC +lamedholamhebrew;05DC 05B9 +lamfinalarabic;FEDE +lamhahinitialarabic;FCCA +laminitialarabic;FEDF +lamjeeminitialarabic;FCC9 +lamkhahinitialarabic;FCCB +lamlamhehisolatedarabic;FDF2 +lammedialarabic;FEE0 +lammeemhahinitialarabic;FD88 +lammeeminitialarabic;FCCC +lammeemjeeminitialarabic;FEDF FEE4 FEA0 +lammeemkhahinitialarabic;FEDF FEE4 FEA8 +largecircle;25EF +lbar;019A +lbelt;026C +lbopomofo;310C +lcaron;013E +lcedilla;013C +lcircle;24DB +lcircumflexbelow;1E3D +lcommaaccent;013C +ldot;0140 +ldotaccent;0140 +ldotbelow;1E37 +ldotbelowmacron;1E39 +leftangleabovecmb;031A +lefttackbelowcmb;0318 +less;003C +lessequal;2264 +lessequalorgreater;22DA +lessmonospace;FF1C +lessorequivalent;2272 +lessorgreater;2276 +lessoverequal;2266 +lesssmall;FE64 +lezh;026E +lfblock;258C +lhookretroflex;026D +lira;20A4 +liwnarmenian;056C +lj;01C9 +ljecyrillic;0459 +ll;F6C0 +lladeva;0933 +llagujarati;0AB3 +llinebelow;1E3B +llladeva;0934 +llvocalicbengali;09E1 +llvocalicdeva;0961 +llvocalicvowelsignbengali;09E3 +llvocalicvowelsigndeva;0963 +lmiddletilde;026B +lmonospace;FF4C +lmsquare;33D0 +lochulathai;0E2C +logicaland;2227 +logicalnot;00AC +logicalnotreversed;2310 +logicalor;2228 +lolingthai;0E25 +longs;017F +lowlinecenterline;FE4E +lowlinecmb;0332 +lowlinedashed;FE4D +lozenge;25CA +lparen;24A7 +lslash;0142 +lsquare;2113 +lsuperior;F6EE +ltshade;2591 +luthai;0E26 +lvocalicbengali;098C +lvocalicdeva;090C +lvocalicvowelsignbengali;09E2 +lvocalicvowelsigndeva;0962 +lxsquare;33D3 +m;006D +mabengali;09AE +macron;00AF +macronbelowcmb;0331 +macroncmb;0304 +macronlowmod;02CD +macronmonospace;FFE3 +macute;1E3F +madeva;092E +magujarati;0AAE +magurmukhi;0A2E +mahapakhhebrew;05A4 +mahapakhlefthebrew;05A4 +mahiragana;307E +maichattawalowleftthai;F895 +maichattawalowrightthai;F894 +maichattawathai;0E4B +maichattawaupperleftthai;F893 +maieklowleftthai;F88C +maieklowrightthai;F88B +maiekthai;0E48 +maiekupperleftthai;F88A +maihanakatleftthai;F884 +maihanakatthai;0E31 +maitaikhuleftthai;F889 +maitaikhuthai;0E47 +maitholowleftthai;F88F +maitholowrightthai;F88E +maithothai;0E49 +maithoupperleftthai;F88D +maitrilowleftthai;F892 +maitrilowrightthai;F891 +maitrithai;0E4A +maitriupperleftthai;F890 +maiyamokthai;0E46 +makatakana;30DE +makatakanahalfwidth;FF8F +male;2642 +mansyonsquare;3347 +maqafhebrew;05BE +mars;2642 +masoracirclehebrew;05AF +masquare;3383 +mbopomofo;3107 +mbsquare;33D4 +mcircle;24DC +mcubedsquare;33A5 +mdotaccent;1E41 +mdotbelow;1E43 +meemarabic;0645 +meemfinalarabic;FEE2 +meeminitialarabic;FEE3 +meemmedialarabic;FEE4 +meemmeeminitialarabic;FCD1 +meemmeemisolatedarabic;FC48 +meetorusquare;334D +mehiragana;3081 +meizierasquare;337E +mekatakana;30E1 +mekatakanahalfwidth;FF92 +mem;05DE +memdagesh;FB3E +memdageshhebrew;FB3E +memhebrew;05DE +menarmenian;0574 +merkhahebrew;05A5 +merkhakefulahebrew;05A6 +merkhakefulalefthebrew;05A6 +merkhalefthebrew;05A5 +mhook;0271 +mhzsquare;3392 +middledotkatakanahalfwidth;FF65 +middot;00B7 +mieumacirclekorean;3272 +mieumaparenkorean;3212 +mieumcirclekorean;3264 +mieumkorean;3141 +mieumpansioskorean;3170 +mieumparenkorean;3204 +mieumpieupkorean;316E +mieumsioskorean;316F +mihiragana;307F +mikatakana;30DF +mikatakanahalfwidth;FF90 +minus;2212 +minusbelowcmb;0320 +minuscircle;2296 +minusmod;02D7 +minusplus;2213 +minute;2032 +miribaarusquare;334A +mirisquare;3349 +mlonglegturned;0270 +mlsquare;3396 +mmcubedsquare;33A3 +mmonospace;FF4D +mmsquaredsquare;339F +mohiragana;3082 +mohmsquare;33C1 +mokatakana;30E2 +mokatakanahalfwidth;FF93 +molsquare;33D6 +momathai;0E21 +moverssquare;33A7 +moverssquaredsquare;33A8 +mparen;24A8 +mpasquare;33AB +mssquare;33B3 +msuperior;F6EF +mturned;026F +mu;00B5 +mu1;00B5 +muasquare;3382 +muchgreater;226B +muchless;226A +mufsquare;338C +mugreek;03BC +mugsquare;338D +muhiragana;3080 +mukatakana;30E0 +mukatakanahalfwidth;FF91 +mulsquare;3395 +multiply;00D7 +mumsquare;339B +munahhebrew;05A3 +munahlefthebrew;05A3 +musicalnote;266A +musicalnotedbl;266B +musicflatsign;266D +musicsharpsign;266F +mussquare;33B2 +muvsquare;33B6 +muwsquare;33BC +mvmegasquare;33B9 +mvsquare;33B7 +mwmegasquare;33BF +mwsquare;33BD +n;006E +nabengali;09A8 +nabla;2207 +nacute;0144 +nadeva;0928 +nagujarati;0AA8 +nagurmukhi;0A28 +nahiragana;306A +nakatakana;30CA +nakatakanahalfwidth;FF85 +napostrophe;0149 +nasquare;3381 +nbopomofo;310B +nbspace;00A0 +ncaron;0148 +ncedilla;0146 +ncircle;24DD +ncircumflexbelow;1E4B +ncommaaccent;0146 +ndotaccent;1E45 +ndotbelow;1E47 +nehiragana;306D +nekatakana;30CD +nekatakanahalfwidth;FF88 +newsheqelsign;20AA +nfsquare;338B +ngabengali;0999 +ngadeva;0919 +ngagujarati;0A99 +ngagurmukhi;0A19 +ngonguthai;0E07 +nhiragana;3093 +nhookleft;0272 +nhookretroflex;0273 +nieunacirclekorean;326F +nieunaparenkorean;320F +nieuncieuckorean;3135 +nieuncirclekorean;3261 +nieunhieuhkorean;3136 +nieunkorean;3134 +nieunpansioskorean;3168 +nieunparenkorean;3201 +nieunsioskorean;3167 +nieuntikeutkorean;3166 +nihiragana;306B +nikatakana;30CB +nikatakanahalfwidth;FF86 +nikhahitleftthai;F899 +nikhahitthai;0E4D +nine;0039 +ninearabic;0669 +ninebengali;09EF +ninecircle;2468 +ninecircleinversesansserif;2792 +ninedeva;096F +ninegujarati;0AEF +ninegurmukhi;0A6F +ninehackarabic;0669 +ninehangzhou;3029 +nineideographicparen;3228 +nineinferior;2089 +ninemonospace;FF19 +nineoldstyle;F739 +nineparen;247C +nineperiod;2490 +ninepersian;06F9 +nineroman;2178 +ninesuperior;2079 +nineteencircle;2472 +nineteenparen;2486 +nineteenperiod;249A +ninethai;0E59 +nj;01CC +njecyrillic;045A +nkatakana;30F3 +nkatakanahalfwidth;FF9D +nlegrightlong;019E +nlinebelow;1E49 +nmonospace;FF4E +nmsquare;339A +nnabengali;09A3 +nnadeva;0923 +nnagujarati;0AA3 +nnagurmukhi;0A23 +nnnadeva;0929 +nohiragana;306E +nokatakana;30CE +nokatakanahalfwidth;FF89 +nonbreakingspace;00A0 +nonenthai;0E13 +nonuthai;0E19 +noonarabic;0646 +noonfinalarabic;FEE6 +noonghunnaarabic;06BA +noonghunnafinalarabic;FB9F +noonhehinitialarabic;FEE7 FEEC +nooninitialarabic;FEE7 +noonjeeminitialarabic;FCD2 +noonjeemisolatedarabic;FC4B +noonmedialarabic;FEE8 +noonmeeminitialarabic;FCD5 +noonmeemisolatedarabic;FC4E +noonnoonfinalarabic;FC8D +notcontains;220C +notelement;2209 +notelementof;2209 +notequal;2260 +notgreater;226F +notgreaternorequal;2271 +notgreaternorless;2279 +notidentical;2262 +notless;226E +notlessnorequal;2270 +notparallel;2226 +notprecedes;2280 +notsubset;2284 +notsucceeds;2281 +notsuperset;2285 +nowarmenian;0576 +nparen;24A9 +nssquare;33B1 +nsuperior;207F +ntilde;00F1 +nu;03BD +nuhiragana;306C +nukatakana;30CC +nukatakanahalfwidth;FF87 +nuktabengali;09BC +nuktadeva;093C +nuktagujarati;0ABC +nuktagurmukhi;0A3C +numbersign;0023 +numbersignmonospace;FF03 +numbersignsmall;FE5F +numeralsigngreek;0374 +numeralsignlowergreek;0375 +numero;2116 +nun;05E0 +nundagesh;FB40 +nundageshhebrew;FB40 +nunhebrew;05E0 +nvsquare;33B5 +nwsquare;33BB +nyabengali;099E +nyadeva;091E +nyagujarati;0A9E +nyagurmukhi;0A1E +o;006F +oacute;00F3 +oangthai;0E2D +obarred;0275 +obarredcyrillic;04E9 +obarreddieresiscyrillic;04EB +obengali;0993 +obopomofo;311B +obreve;014F +ocandradeva;0911 +ocandragujarati;0A91 +ocandravowelsigndeva;0949 +ocandravowelsigngujarati;0AC9 +ocaron;01D2 +ocircle;24DE +ocircumflex;00F4 +ocircumflexacute;1ED1 +ocircumflexdotbelow;1ED9 +ocircumflexgrave;1ED3 +ocircumflexhookabove;1ED5 +ocircumflextilde;1ED7 +ocyrillic;043E +odblacute;0151 +odblgrave;020D +odeva;0913 +odieresis;00F6 +odieresiscyrillic;04E7 +odotbelow;1ECD +oe;0153 +oekorean;315A +ogonek;02DB +ogonekcmb;0328 +ograve;00F2 +ogujarati;0A93 +oharmenian;0585 +ohiragana;304A +ohookabove;1ECF +ohorn;01A1 +ohornacute;1EDB +ohorndotbelow;1EE3 +ohorngrave;1EDD +ohornhookabove;1EDF +ohorntilde;1EE1 +ohungarumlaut;0151 +oi;01A3 +oinvertedbreve;020F +okatakana;30AA +okatakanahalfwidth;FF75 +okorean;3157 +olehebrew;05AB +omacron;014D +omacronacute;1E53 +omacrongrave;1E51 +omdeva;0950 +omega;03C9 +omega1;03D6 +omegacyrillic;0461 +omegalatinclosed;0277 +omegaroundcyrillic;047B +omegatitlocyrillic;047D +omegatonos;03CE +omgujarati;0AD0 +omicron;03BF +omicrontonos;03CC +omonospace;FF4F +one;0031 +onearabic;0661 +onebengali;09E7 +onecircle;2460 +onecircleinversesansserif;278A +onedeva;0967 +onedotenleader;2024 +oneeighth;215B +onefitted;F6DC +onegujarati;0AE7 +onegurmukhi;0A67 +onehackarabic;0661 +onehalf;00BD +onehangzhou;3021 +oneideographicparen;3220 +oneinferior;2081 +onemonospace;FF11 +onenumeratorbengali;09F4 +oneoldstyle;F731 +oneparen;2474 +oneperiod;2488 +onepersian;06F1 +onequarter;00BC +oneroman;2170 +onesuperior;00B9 +onethai;0E51 +onethird;2153 +oogonek;01EB +oogonekmacron;01ED +oogurmukhi;0A13 +oomatragurmukhi;0A4B +oopen;0254 +oparen;24AA +openbullet;25E6 +option;2325 +ordfeminine;00AA +ordmasculine;00BA +orthogonal;221F +oshortdeva;0912 +oshortvowelsigndeva;094A +oslash;00F8 +oslashacute;01FF +osmallhiragana;3049 +osmallkatakana;30A9 +osmallkatakanahalfwidth;FF6B +ostrokeacute;01FF +osuperior;F6F0 +otcyrillic;047F +otilde;00F5 +otildeacute;1E4D +otildedieresis;1E4F +oubopomofo;3121 +overline;203E +overlinecenterline;FE4A +overlinecmb;0305 +overlinedashed;FE49 +overlinedblwavy;FE4C +overlinewavy;FE4B +overscore;00AF +ovowelsignbengali;09CB +ovowelsigndeva;094B +ovowelsigngujarati;0ACB +p;0070 +paampssquare;3380 +paasentosquare;332B +pabengali;09AA +pacute;1E55 +padeva;092A +pagedown;21DF +pageup;21DE +pagujarati;0AAA +pagurmukhi;0A2A +pahiragana;3071 +paiyannoithai;0E2F +pakatakana;30D1 +palatalizationcyrilliccmb;0484 +palochkacyrillic;04C0 +pansioskorean;317F +paragraph;00B6 +parallel;2225 +parenleft;0028 +parenleftaltonearabic;FD3E +parenleftbt;F8ED +parenleftex;F8EC +parenleftinferior;208D +parenleftmonospace;FF08 +parenleftsmall;FE59 +parenleftsuperior;207D +parenlefttp;F8EB +parenleftvertical;FE35 +parenright;0029 +parenrightaltonearabic;FD3F +parenrightbt;F8F8 +parenrightex;F8F7 +parenrightinferior;208E +parenrightmonospace;FF09 +parenrightsmall;FE5A +parenrightsuperior;207E +parenrighttp;F8F6 +parenrightvertical;FE36 +partialdiff;2202 +paseqhebrew;05C0 +pashtahebrew;0599 +pasquare;33A9 +patah;05B7 +patah11;05B7 +patah1d;05B7 +patah2a;05B7 +patahhebrew;05B7 +patahnarrowhebrew;05B7 +patahquarterhebrew;05B7 +patahwidehebrew;05B7 +pazerhebrew;05A1 +pbopomofo;3106 +pcircle;24DF +pdotaccent;1E57 +pe;05E4 +pecyrillic;043F +pedagesh;FB44 +pedageshhebrew;FB44 +peezisquare;333B +pefinaldageshhebrew;FB43 +peharabic;067E +peharmenian;057A +pehebrew;05E4 +pehfinalarabic;FB57 +pehinitialarabic;FB58 +pehiragana;307A +pehmedialarabic;FB59 +pekatakana;30DA +pemiddlehookcyrillic;04A7 +perafehebrew;FB4E +percent;0025 +percentarabic;066A +percentmonospace;FF05 +percentsmall;FE6A +period;002E +periodarmenian;0589 +periodcentered;00B7 +periodhalfwidth;FF61 +periodinferior;F6E7 +periodmonospace;FF0E +periodsmall;FE52 +periodsuperior;F6E8 +perispomenigreekcmb;0342 +perpendicular;22A5 +perthousand;2030 +peseta;20A7 +pfsquare;338A +phabengali;09AB +phadeva;092B +phagujarati;0AAB +phagurmukhi;0A2B +phi;03C6 +phi1;03D5 +phieuphacirclekorean;327A +phieuphaparenkorean;321A +phieuphcirclekorean;326C +phieuphkorean;314D +phieuphparenkorean;320C +philatin;0278 +phinthuthai;0E3A +phisymbolgreek;03D5 +phook;01A5 +phophanthai;0E1E +phophungthai;0E1C +phosamphaothai;0E20 +pi;03C0 +pieupacirclekorean;3273 +pieupaparenkorean;3213 +pieupcieuckorean;3176 +pieupcirclekorean;3265 +pieupkiyeokkorean;3172 +pieupkorean;3142 +pieupparenkorean;3205 +pieupsioskiyeokkorean;3174 +pieupsioskorean;3144 +pieupsiostikeutkorean;3175 +pieupthieuthkorean;3177 +pieuptikeutkorean;3173 +pihiragana;3074 +pikatakana;30D4 +pisymbolgreek;03D6 +piwrarmenian;0583 +plus;002B +plusbelowcmb;031F +pluscircle;2295 +plusminus;00B1 +plusmod;02D6 +plusmonospace;FF0B +plussmall;FE62 +plussuperior;207A +pmonospace;FF50 +pmsquare;33D8 +pohiragana;307D +pointingindexdownwhite;261F +pointingindexleftwhite;261C +pointingindexrightwhite;261E +pointingindexupwhite;261D +pokatakana;30DD +poplathai;0E1B +postalmark;3012 +postalmarkface;3020 +pparen;24AB +precedes;227A +prescription;211E +primemod;02B9 +primereversed;2035 +product;220F +projective;2305 +prolongedkana;30FC +propellor;2318 +propersubset;2282 +propersuperset;2283 +proportion;2237 +proportional;221D +psi;03C8 +psicyrillic;0471 +psilipneumatacyrilliccmb;0486 +pssquare;33B0 +puhiragana;3077 +pukatakana;30D7 +pvsquare;33B4 +pwsquare;33BA +q;0071 +qadeva;0958 +qadmahebrew;05A8 +qafarabic;0642 +qaffinalarabic;FED6 +qafinitialarabic;FED7 +qafmedialarabic;FED8 +qamats;05B8 +qamats10;05B8 +qamats1a;05B8 +qamats1c;05B8 +qamats27;05B8 +qamats29;05B8 +qamats33;05B8 +qamatsde;05B8 +qamatshebrew;05B8 +qamatsnarrowhebrew;05B8 +qamatsqatanhebrew;05B8 +qamatsqatannarrowhebrew;05B8 +qamatsqatanquarterhebrew;05B8 +qamatsqatanwidehebrew;05B8 +qamatsquarterhebrew;05B8 +qamatswidehebrew;05B8 +qarneyparahebrew;059F +qbopomofo;3111 +qcircle;24E0 +qhook;02A0 +qmonospace;FF51 +qof;05E7 +qofdagesh;FB47 +qofdageshhebrew;FB47 +qofhatafpatah;05E7 05B2 +qofhatafpatahhebrew;05E7 05B2 +qofhatafsegol;05E7 05B1 +qofhatafsegolhebrew;05E7 05B1 +qofhebrew;05E7 +qofhiriq;05E7 05B4 +qofhiriqhebrew;05E7 05B4 +qofholam;05E7 05B9 +qofholamhebrew;05E7 05B9 +qofpatah;05E7 05B7 +qofpatahhebrew;05E7 05B7 +qofqamats;05E7 05B8 +qofqamatshebrew;05E7 05B8 +qofqubuts;05E7 05BB +qofqubutshebrew;05E7 05BB +qofsegol;05E7 05B6 +qofsegolhebrew;05E7 05B6 +qofsheva;05E7 05B0 +qofshevahebrew;05E7 05B0 +qoftsere;05E7 05B5 +qoftserehebrew;05E7 05B5 +qparen;24AC +quarternote;2669 +qubuts;05BB +qubuts18;05BB +qubuts25;05BB +qubuts31;05BB +qubutshebrew;05BB +qubutsnarrowhebrew;05BB +qubutsquarterhebrew;05BB +qubutswidehebrew;05BB +question;003F +questionarabic;061F +questionarmenian;055E +questiondown;00BF +questiondownsmall;F7BF +questiongreek;037E +questionmonospace;FF1F +questionsmall;F73F +quotedbl;0022 +quotedblbase;201E +quotedblleft;201C +quotedblmonospace;FF02 +quotedblprime;301E +quotedblprimereversed;301D +quotedblright;201D +quoteleft;2018 +quoteleftreversed;201B +quotereversed;201B +quoteright;2019 +quoterightn;0149 +quotesinglbase;201A +quotesingle;0027 +quotesinglemonospace;FF07 +r;0072 +raarmenian;057C +rabengali;09B0 +racute;0155 +radeva;0930 +radical;221A +radicalex;F8E5 +radoverssquare;33AE +radoverssquaredsquare;33AF +radsquare;33AD +rafe;05BF +rafehebrew;05BF +ragujarati;0AB0 +ragurmukhi;0A30 +rahiragana;3089 +rakatakana;30E9 +rakatakanahalfwidth;FF97 +ralowerdiagonalbengali;09F1 +ramiddlediagonalbengali;09F0 +ramshorn;0264 +ratio;2236 +rbopomofo;3116 +rcaron;0159 +rcedilla;0157 +rcircle;24E1 +rcommaaccent;0157 +rdblgrave;0211 +rdotaccent;1E59 +rdotbelow;1E5B +rdotbelowmacron;1E5D +referencemark;203B +reflexsubset;2286 +reflexsuperset;2287 +registered;00AE +registersans;F8E8 +registerserif;F6DA +reharabic;0631 +reharmenian;0580 +rehfinalarabic;FEAE +rehiragana;308C +rehyehaleflamarabic;0631 FEF3 FE8E 0644 +rekatakana;30EC +rekatakanahalfwidth;FF9A +resh;05E8 +reshdageshhebrew;FB48 +reshhatafpatah;05E8 05B2 +reshhatafpatahhebrew;05E8 05B2 +reshhatafsegol;05E8 05B1 +reshhatafsegolhebrew;05E8 05B1 +reshhebrew;05E8 +reshhiriq;05E8 05B4 +reshhiriqhebrew;05E8 05B4 +reshholam;05E8 05B9 +reshholamhebrew;05E8 05B9 +reshpatah;05E8 05B7 +reshpatahhebrew;05E8 05B7 +reshqamats;05E8 05B8 +reshqamatshebrew;05E8 05B8 +reshqubuts;05E8 05BB +reshqubutshebrew;05E8 05BB +reshsegol;05E8 05B6 +reshsegolhebrew;05E8 05B6 +reshsheva;05E8 05B0 +reshshevahebrew;05E8 05B0 +reshtsere;05E8 05B5 +reshtserehebrew;05E8 05B5 +reversedtilde;223D +reviahebrew;0597 +reviamugrashhebrew;0597 +revlogicalnot;2310 +rfishhook;027E +rfishhookreversed;027F +rhabengali;09DD +rhadeva;095D +rho;03C1 +rhook;027D +rhookturned;027B +rhookturnedsuperior;02B5 +rhosymbolgreek;03F1 +rhotichookmod;02DE +rieulacirclekorean;3271 +rieulaparenkorean;3211 +rieulcirclekorean;3263 +rieulhieuhkorean;3140 +rieulkiyeokkorean;313A +rieulkiyeoksioskorean;3169 +rieulkorean;3139 +rieulmieumkorean;313B +rieulpansioskorean;316C +rieulparenkorean;3203 +rieulphieuphkorean;313F +rieulpieupkorean;313C +rieulpieupsioskorean;316B +rieulsioskorean;313D +rieulthieuthkorean;313E +rieultikeutkorean;316A +rieulyeorinhieuhkorean;316D +rightangle;221F +righttackbelowcmb;0319 +righttriangle;22BF +rihiragana;308A +rikatakana;30EA +rikatakanahalfwidth;FF98 +ring;02DA +ringbelowcmb;0325 +ringcmb;030A +ringhalfleft;02BF +ringhalfleftarmenian;0559 +ringhalfleftbelowcmb;031C +ringhalfleftcentered;02D3 +ringhalfright;02BE +ringhalfrightbelowcmb;0339 +ringhalfrightcentered;02D2 +rinvertedbreve;0213 +rittorusquare;3351 +rlinebelow;1E5F +rlongleg;027C +rlonglegturned;027A +rmonospace;FF52 +rohiragana;308D +rokatakana;30ED +rokatakanahalfwidth;FF9B +roruathai;0E23 +rparen;24AD +rrabengali;09DC +rradeva;0931 +rragurmukhi;0A5C +rreharabic;0691 +rrehfinalarabic;FB8D +rrvocalicbengali;09E0 +rrvocalicdeva;0960 +rrvocalicgujarati;0AE0 +rrvocalicvowelsignbengali;09C4 +rrvocalicvowelsigndeva;0944 +rrvocalicvowelsigngujarati;0AC4 +rsuperior;F6F1 +rtblock;2590 +rturned;0279 +rturnedsuperior;02B4 +ruhiragana;308B +rukatakana;30EB +rukatakanahalfwidth;FF99 +rupeemarkbengali;09F2 +rupeesignbengali;09F3 +rupiah;F6DD +ruthai;0E24 +rvocalicbengali;098B +rvocalicdeva;090B +rvocalicgujarati;0A8B +rvocalicvowelsignbengali;09C3 +rvocalicvowelsigndeva;0943 +rvocalicvowelsigngujarati;0AC3 +s;0073 +sabengali;09B8 +sacute;015B +sacutedotaccent;1E65 +sadarabic;0635 +sadeva;0938 +sadfinalarabic;FEBA +sadinitialarabic;FEBB +sadmedialarabic;FEBC +sagujarati;0AB8 +sagurmukhi;0A38 +sahiragana;3055 +sakatakana;30B5 +sakatakanahalfwidth;FF7B +sallallahoualayhewasallamarabic;FDFA +samekh;05E1 +samekhdagesh;FB41 +samekhdageshhebrew;FB41 +samekhhebrew;05E1 +saraaathai;0E32 +saraaethai;0E41 +saraaimaimalaithai;0E44 +saraaimaimuanthai;0E43 +saraamthai;0E33 +saraathai;0E30 +saraethai;0E40 +saraiileftthai;F886 +saraiithai;0E35 +saraileftthai;F885 +saraithai;0E34 +saraothai;0E42 +saraueeleftthai;F888 +saraueethai;0E37 +saraueleftthai;F887 +sarauethai;0E36 +sarauthai;0E38 +sarauuthai;0E39 +sbopomofo;3119 +scaron;0161 +scarondotaccent;1E67 +scedilla;015F +schwa;0259 +schwacyrillic;04D9 +schwadieresiscyrillic;04DB +schwahook;025A +scircle;24E2 +scircumflex;015D +scommaaccent;0219 +sdotaccent;1E61 +sdotbelow;1E63 +sdotbelowdotaccent;1E69 +seagullbelowcmb;033C +second;2033 +secondtonechinese;02CA +section;00A7 +seenarabic;0633 +seenfinalarabic;FEB2 +seeninitialarabic;FEB3 +seenmedialarabic;FEB4 +segol;05B6 +segol13;05B6 +segol1f;05B6 +segol2c;05B6 +segolhebrew;05B6 +segolnarrowhebrew;05B6 +segolquarterhebrew;05B6 +segoltahebrew;0592 +segolwidehebrew;05B6 +seharmenian;057D +sehiragana;305B +sekatakana;30BB +sekatakanahalfwidth;FF7E +semicolon;003B +semicolonarabic;061B +semicolonmonospace;FF1B +semicolonsmall;FE54 +semivoicedmarkkana;309C +semivoicedmarkkanahalfwidth;FF9F +sentisquare;3322 +sentosquare;3323 +seven;0037 +sevenarabic;0667 +sevenbengali;09ED +sevencircle;2466 +sevencircleinversesansserif;2790 +sevendeva;096D +seveneighths;215E +sevengujarati;0AED +sevengurmukhi;0A6D +sevenhackarabic;0667 +sevenhangzhou;3027 +sevenideographicparen;3226 +seveninferior;2087 +sevenmonospace;FF17 +sevenoldstyle;F737 +sevenparen;247A +sevenperiod;248E +sevenpersian;06F7 +sevenroman;2176 +sevensuperior;2077 +seventeencircle;2470 +seventeenparen;2484 +seventeenperiod;2498 +seventhai;0E57 +sfthyphen;00AD +shaarmenian;0577 +shabengali;09B6 +shacyrillic;0448 +shaddaarabic;0651 +shaddadammaarabic;FC61 +shaddadammatanarabic;FC5E +shaddafathaarabic;FC60 +shaddafathatanarabic;0651 064B +shaddakasraarabic;FC62 +shaddakasratanarabic;FC5F +shade;2592 +shadedark;2593 +shadelight;2591 +shademedium;2592 +shadeva;0936 +shagujarati;0AB6 +shagurmukhi;0A36 +shalshelethebrew;0593 +shbopomofo;3115 +shchacyrillic;0449 +sheenarabic;0634 +sheenfinalarabic;FEB6 +sheeninitialarabic;FEB7 +sheenmedialarabic;FEB8 +sheicoptic;03E3 +sheqel;20AA +sheqelhebrew;20AA +sheva;05B0 +sheva115;05B0 +sheva15;05B0 +sheva22;05B0 +sheva2e;05B0 +shevahebrew;05B0 +shevanarrowhebrew;05B0 +shevaquarterhebrew;05B0 +shevawidehebrew;05B0 +shhacyrillic;04BB +shimacoptic;03ED +shin;05E9 +shindagesh;FB49 +shindageshhebrew;FB49 +shindageshshindot;FB2C +shindageshshindothebrew;FB2C +shindageshsindot;FB2D +shindageshsindothebrew;FB2D +shindothebrew;05C1 +shinhebrew;05E9 +shinshindot;FB2A +shinshindothebrew;FB2A +shinsindot;FB2B +shinsindothebrew;FB2B +shook;0282 +sigma;03C3 +sigma1;03C2 +sigmafinal;03C2 +sigmalunatesymbolgreek;03F2 +sihiragana;3057 +sikatakana;30B7 +sikatakanahalfwidth;FF7C +siluqhebrew;05BD +siluqlefthebrew;05BD +similar;223C +sindothebrew;05C2 +siosacirclekorean;3274 +siosaparenkorean;3214 +sioscieuckorean;317E +sioscirclekorean;3266 +sioskiyeokkorean;317A +sioskorean;3145 +siosnieunkorean;317B +siosparenkorean;3206 +siospieupkorean;317D +siostikeutkorean;317C +six;0036 +sixarabic;0666 +sixbengali;09EC +sixcircle;2465 +sixcircleinversesansserif;278F +sixdeva;096C +sixgujarati;0AEC +sixgurmukhi;0A6C +sixhackarabic;0666 +sixhangzhou;3026 +sixideographicparen;3225 +sixinferior;2086 +sixmonospace;FF16 +sixoldstyle;F736 +sixparen;2479 +sixperiod;248D +sixpersian;06F6 +sixroman;2175 +sixsuperior;2076 +sixteencircle;246F +sixteencurrencydenominatorbengali;09F9 +sixteenparen;2483 +sixteenperiod;2497 +sixthai;0E56 +slash;002F +slashmonospace;FF0F +slong;017F +slongdotaccent;1E9B +smileface;263A +smonospace;FF53 +sofpasuqhebrew;05C3 +softhyphen;00AD +softsigncyrillic;044C +sohiragana;305D +sokatakana;30BD +sokatakanahalfwidth;FF7F +soliduslongoverlaycmb;0338 +solidusshortoverlaycmb;0337 +sorusithai;0E29 +sosalathai;0E28 +sosothai;0E0B +sosuathai;0E2A +space;0020 +spacehackarabic;0020 +spade;2660 +spadesuitblack;2660 +spadesuitwhite;2664 +sparen;24AE +squarebelowcmb;033B +squarecc;33C4 +squarecm;339D +squarediagonalcrosshatchfill;25A9 +squarehorizontalfill;25A4 +squarekg;338F +squarekm;339E +squarekmcapital;33CE +squareln;33D1 +squarelog;33D2 +squaremg;338E +squaremil;33D5 +squaremm;339C +squaremsquared;33A1 +squareorthogonalcrosshatchfill;25A6 +squareupperlefttolowerrightfill;25A7 +squareupperrighttolowerleftfill;25A8 +squareverticalfill;25A5 +squarewhitewithsmallblack;25A3 +srsquare;33DB +ssabengali;09B7 +ssadeva;0937 +ssagujarati;0AB7 +ssangcieuckorean;3149 +ssanghieuhkorean;3185 +ssangieungkorean;3180 +ssangkiyeokkorean;3132 +ssangnieunkorean;3165 +ssangpieupkorean;3143 +ssangsioskorean;3146 +ssangtikeutkorean;3138 +ssuperior;F6F2 +sterling;00A3 +sterlingmonospace;FFE1 +strokelongoverlaycmb;0336 +strokeshortoverlaycmb;0335 +subset;2282 +subsetnotequal;228A +subsetorequal;2286 +succeeds;227B +suchthat;220B +suhiragana;3059 +sukatakana;30B9 +sukatakanahalfwidth;FF7D +sukunarabic;0652 +summation;2211 +sun;263C +superset;2283 +supersetnotequal;228B +supersetorequal;2287 +svsquare;33DC +syouwaerasquare;337C +t;0074 +tabengali;09A4 +tackdown;22A4 +tackleft;22A3 +tadeva;0924 +tagujarati;0AA4 +tagurmukhi;0A24 +taharabic;0637 +tahfinalarabic;FEC2 +tahinitialarabic;FEC3 +tahiragana;305F +tahmedialarabic;FEC4 +taisyouerasquare;337D +takatakana;30BF +takatakanahalfwidth;FF80 +tatweelarabic;0640 +tau;03C4 +tav;05EA +tavdages;FB4A +tavdagesh;FB4A +tavdageshhebrew;FB4A +tavhebrew;05EA +tbar;0167 +tbopomofo;310A +tcaron;0165 +tccurl;02A8 +tcedilla;0163 +tcheharabic;0686 +tchehfinalarabic;FB7B +tchehinitialarabic;FB7C +tchehmedialarabic;FB7D +tchehmeeminitialarabic;FB7C FEE4 +tcircle;24E3 +tcircumflexbelow;1E71 +tcommaaccent;0163 +tdieresis;1E97 +tdotaccent;1E6B +tdotbelow;1E6D +tecyrillic;0442 +tedescendercyrillic;04AD +teharabic;062A +tehfinalarabic;FE96 +tehhahinitialarabic;FCA2 +tehhahisolatedarabic;FC0C +tehinitialarabic;FE97 +tehiragana;3066 +tehjeeminitialarabic;FCA1 +tehjeemisolatedarabic;FC0B +tehmarbutaarabic;0629 +tehmarbutafinalarabic;FE94 +tehmedialarabic;FE98 +tehmeeminitialarabic;FCA4 +tehmeemisolatedarabic;FC0E +tehnoonfinalarabic;FC73 +tekatakana;30C6 +tekatakanahalfwidth;FF83 +telephone;2121 +telephoneblack;260E +telishagedolahebrew;05A0 +telishaqetanahebrew;05A9 +tencircle;2469 +tenideographicparen;3229 +tenparen;247D +tenperiod;2491 +tenroman;2179 +tesh;02A7 +tet;05D8 +tetdagesh;FB38 +tetdageshhebrew;FB38 +tethebrew;05D8 +tetsecyrillic;04B5 +tevirhebrew;059B +tevirlefthebrew;059B +thabengali;09A5 +thadeva;0925 +thagujarati;0AA5 +thagurmukhi;0A25 +thalarabic;0630 +thalfinalarabic;FEAC +thanthakhatlowleftthai;F898 +thanthakhatlowrightthai;F897 +thanthakhatthai;0E4C +thanthakhatupperleftthai;F896 +theharabic;062B +thehfinalarabic;FE9A +thehinitialarabic;FE9B +thehmedialarabic;FE9C +thereexists;2203 +therefore;2234 +theta;03B8 +theta1;03D1 +thetasymbolgreek;03D1 +thieuthacirclekorean;3279 +thieuthaparenkorean;3219 +thieuthcirclekorean;326B +thieuthkorean;314C +thieuthparenkorean;320B +thirteencircle;246C +thirteenparen;2480 +thirteenperiod;2494 +thonangmonthothai;0E11 +thook;01AD +thophuthaothai;0E12 +thorn;00FE +thothahanthai;0E17 +thothanthai;0E10 +thothongthai;0E18 +thothungthai;0E16 +thousandcyrillic;0482 +thousandsseparatorarabic;066C +thousandsseparatorpersian;066C +three;0033 +threearabic;0663 +threebengali;09E9 +threecircle;2462 +threecircleinversesansserif;278C +threedeva;0969 +threeeighths;215C +threegujarati;0AE9 +threegurmukhi;0A69 +threehackarabic;0663 +threehangzhou;3023 +threeideographicparen;3222 +threeinferior;2083 +threemonospace;FF13 +threenumeratorbengali;09F6 +threeoldstyle;F733 +threeparen;2476 +threeperiod;248A +threepersian;06F3 +threequarters;00BE +threequartersemdash;F6DE +threeroman;2172 +threesuperior;00B3 +threethai;0E53 +thzsquare;3394 +tihiragana;3061 +tikatakana;30C1 +tikatakanahalfwidth;FF81 +tikeutacirclekorean;3270 +tikeutaparenkorean;3210 +tikeutcirclekorean;3262 +tikeutkorean;3137 +tikeutparenkorean;3202 +tilde;02DC +tildebelowcmb;0330 +tildecmb;0303 +tildecomb;0303 +tildedoublecmb;0360 +tildeoperator;223C +tildeoverlaycmb;0334 +tildeverticalcmb;033E +timescircle;2297 +tipehahebrew;0596 +tipehalefthebrew;0596 +tippigurmukhi;0A70 +titlocyrilliccmb;0483 +tiwnarmenian;057F +tlinebelow;1E6F +tmonospace;FF54 +toarmenian;0569 +tohiragana;3068 +tokatakana;30C8 +tokatakanahalfwidth;FF84 +tonebarextrahighmod;02E5 +tonebarextralowmod;02E9 +tonebarhighmod;02E6 +tonebarlowmod;02E8 +tonebarmidmod;02E7 +tonefive;01BD +tonesix;0185 +tonetwo;01A8 +tonos;0384 +tonsquare;3327 +topatakthai;0E0F +tortoiseshellbracketleft;3014 +tortoiseshellbracketleftsmall;FE5D +tortoiseshellbracketleftvertical;FE39 +tortoiseshellbracketright;3015 +tortoiseshellbracketrightsmall;FE5E +tortoiseshellbracketrightvertical;FE3A +totaothai;0E15 +tpalatalhook;01AB +tparen;24AF +trademark;2122 +trademarksans;F8EA +trademarkserif;F6DB +tretroflexhook;0288 +triagdn;25BC +triaglf;25C4 +triagrt;25BA +triagup;25B2 +ts;02A6 +tsadi;05E6 +tsadidagesh;FB46 +tsadidageshhebrew;FB46 +tsadihebrew;05E6 +tsecyrillic;0446 +tsere;05B5 +tsere12;05B5 +tsere1e;05B5 +tsere2b;05B5 +tserehebrew;05B5 +tserenarrowhebrew;05B5 +tserequarterhebrew;05B5 +tserewidehebrew;05B5 +tshecyrillic;045B +tsuperior;F6F3 +ttabengali;099F +ttadeva;091F +ttagujarati;0A9F +ttagurmukhi;0A1F +tteharabic;0679 +ttehfinalarabic;FB67 +ttehinitialarabic;FB68 +ttehmedialarabic;FB69 +tthabengali;09A0 +tthadeva;0920 +tthagujarati;0AA0 +tthagurmukhi;0A20 +tturned;0287 +tuhiragana;3064 +tukatakana;30C4 +tukatakanahalfwidth;FF82 +tusmallhiragana;3063 +tusmallkatakana;30C3 +tusmallkatakanahalfwidth;FF6F +twelvecircle;246B +twelveparen;247F +twelveperiod;2493 +twelveroman;217B +twentycircle;2473 +twentyhangzhou;5344 +twentyparen;2487 +twentyperiod;249B +two;0032 +twoarabic;0662 +twobengali;09E8 +twocircle;2461 +twocircleinversesansserif;278B +twodeva;0968 +twodotenleader;2025 +twodotleader;2025 +twodotleadervertical;FE30 +twogujarati;0AE8 +twogurmukhi;0A68 +twohackarabic;0662 +twohangzhou;3022 +twoideographicparen;3221 +twoinferior;2082 +twomonospace;FF12 +twonumeratorbengali;09F5 +twooldstyle;F732 +twoparen;2475 +twoperiod;2489 +twopersian;06F2 +tworoman;2171 +twostroke;01BB +twosuperior;00B2 +twothai;0E52 +twothirds;2154 +u;0075 +uacute;00FA +ubar;0289 +ubengali;0989 +ubopomofo;3128 +ubreve;016D +ucaron;01D4 +ucircle;24E4 +ucircumflex;00FB +ucircumflexbelow;1E77 +ucyrillic;0443 +udattadeva;0951 +udblacute;0171 +udblgrave;0215 +udeva;0909 +udieresis;00FC +udieresisacute;01D8 +udieresisbelow;1E73 +udieresiscaron;01DA +udieresiscyrillic;04F1 +udieresisgrave;01DC +udieresismacron;01D6 +udotbelow;1EE5 +ugrave;00F9 +ugujarati;0A89 +ugurmukhi;0A09 +uhiragana;3046 +uhookabove;1EE7 +uhorn;01B0 +uhornacute;1EE9 +uhorndotbelow;1EF1 +uhorngrave;1EEB +uhornhookabove;1EED +uhorntilde;1EEF +uhungarumlaut;0171 +uhungarumlautcyrillic;04F3 +uinvertedbreve;0217 +ukatakana;30A6 +ukatakanahalfwidth;FF73 +ukcyrillic;0479 +ukorean;315C +umacron;016B +umacroncyrillic;04EF +umacrondieresis;1E7B +umatragurmukhi;0A41 +umonospace;FF55 +underscore;005F +underscoredbl;2017 +underscoremonospace;FF3F +underscorevertical;FE33 +underscorewavy;FE4F +union;222A +universal;2200 +uogonek;0173 +uparen;24B0 +upblock;2580 +upperdothebrew;05C4 +upsilon;03C5 +upsilondieresis;03CB +upsilondieresistonos;03B0 +upsilonlatin;028A +upsilontonos;03CD +uptackbelowcmb;031D +uptackmod;02D4 +uragurmukhi;0A73 +uring;016F +ushortcyrillic;045E +usmallhiragana;3045 +usmallkatakana;30A5 +usmallkatakanahalfwidth;FF69 +ustraightcyrillic;04AF +ustraightstrokecyrillic;04B1 +utilde;0169 +utildeacute;1E79 +utildebelow;1E75 +uubengali;098A +uudeva;090A +uugujarati;0A8A +uugurmukhi;0A0A +uumatragurmukhi;0A42 +uuvowelsignbengali;09C2 +uuvowelsigndeva;0942 +uuvowelsigngujarati;0AC2 +uvowelsignbengali;09C1 +uvowelsigndeva;0941 +uvowelsigngujarati;0AC1 +v;0076 +vadeva;0935 +vagujarati;0AB5 +vagurmukhi;0A35 +vakatakana;30F7 +vav;05D5 +vavdagesh;FB35 +vavdagesh65;FB35 +vavdageshhebrew;FB35 +vavhebrew;05D5 +vavholam;FB4B +vavholamhebrew;FB4B +vavvavhebrew;05F0 +vavyodhebrew;05F1 +vcircle;24E5 +vdotbelow;1E7F +vecyrillic;0432 +veharabic;06A4 +vehfinalarabic;FB6B +vehinitialarabic;FB6C +vehmedialarabic;FB6D +vekatakana;30F9 +venus;2640 +verticalbar;007C +verticallineabovecmb;030D +verticallinebelowcmb;0329 +verticallinelowmod;02CC +verticallinemod;02C8 +vewarmenian;057E +vhook;028B +vikatakana;30F8 +viramabengali;09CD +viramadeva;094D +viramagujarati;0ACD +visargabengali;0983 +visargadeva;0903 +visargagujarati;0A83 +vmonospace;FF56 +voarmenian;0578 +voicediterationhiragana;309E +voicediterationkatakana;30FE +voicedmarkkana;309B +voicedmarkkanahalfwidth;FF9E +vokatakana;30FA +vparen;24B1 +vtilde;1E7D +vturned;028C +vuhiragana;3094 +vukatakana;30F4 +w;0077 +wacute;1E83 +waekorean;3159 +wahiragana;308F +wakatakana;30EF +wakatakanahalfwidth;FF9C +wakorean;3158 +wasmallhiragana;308E +wasmallkatakana;30EE +wattosquare;3357 +wavedash;301C +wavyunderscorevertical;FE34 +wawarabic;0648 +wawfinalarabic;FEEE +wawhamzaabovearabic;0624 +wawhamzaabovefinalarabic;FE86 +wbsquare;33DD +wcircle;24E6 +wcircumflex;0175 +wdieresis;1E85 +wdotaccent;1E87 +wdotbelow;1E89 +wehiragana;3091 +weierstrass;2118 +wekatakana;30F1 +wekorean;315E +weokorean;315D +wgrave;1E81 +whitebullet;25E6 +whitecircle;25CB +whitecircleinverse;25D9 +whitecornerbracketleft;300E +whitecornerbracketleftvertical;FE43 +whitecornerbracketright;300F +whitecornerbracketrightvertical;FE44 +whitediamond;25C7 +whitediamondcontainingblacksmalldiamond;25C8 +whitedownpointingsmalltriangle;25BF +whitedownpointingtriangle;25BD +whiteleftpointingsmalltriangle;25C3 +whiteleftpointingtriangle;25C1 +whitelenticularbracketleft;3016 +whitelenticularbracketright;3017 +whiterightpointingsmalltriangle;25B9 +whiterightpointingtriangle;25B7 +whitesmallsquare;25AB +whitesmilingface;263A +whitesquare;25A1 +whitestar;2606 +whitetelephone;260F +whitetortoiseshellbracketleft;3018 +whitetortoiseshellbracketright;3019 +whiteuppointingsmalltriangle;25B5 +whiteuppointingtriangle;25B3 +wihiragana;3090 +wikatakana;30F0 +wikorean;315F +wmonospace;FF57 +wohiragana;3092 +wokatakana;30F2 +wokatakanahalfwidth;FF66 +won;20A9 +wonmonospace;FFE6 +wowaenthai;0E27 +wparen;24B2 +wring;1E98 +wsuperior;02B7 +wturned;028D +wynn;01BF +x;0078 +xabovecmb;033D +xbopomofo;3112 +xcircle;24E7 +xdieresis;1E8D +xdotaccent;1E8B +xeharmenian;056D +xi;03BE +xmonospace;FF58 +xparen;24B3 +xsuperior;02E3 +y;0079 +yaadosquare;334E +yabengali;09AF +yacute;00FD +yadeva;092F +yaekorean;3152 +yagujarati;0AAF +yagurmukhi;0A2F +yahiragana;3084 +yakatakana;30E4 +yakatakanahalfwidth;FF94 +yakorean;3151 +yamakkanthai;0E4E +yasmallhiragana;3083 +yasmallkatakana;30E3 +yasmallkatakanahalfwidth;FF6C +yatcyrillic;0463 +ycircle;24E8 +ycircumflex;0177 +ydieresis;00FF +ydotaccent;1E8F +ydotbelow;1EF5 +yeharabic;064A +yehbarreearabic;06D2 +yehbarreefinalarabic;FBAF +yehfinalarabic;FEF2 +yehhamzaabovearabic;0626 +yehhamzaabovefinalarabic;FE8A +yehhamzaaboveinitialarabic;FE8B +yehhamzaabovemedialarabic;FE8C +yehinitialarabic;FEF3 +yehmedialarabic;FEF4 +yehmeeminitialarabic;FCDD +yehmeemisolatedarabic;FC58 +yehnoonfinalarabic;FC94 +yehthreedotsbelowarabic;06D1 +yekorean;3156 +yen;00A5 +yenmonospace;FFE5 +yeokorean;3155 +yeorinhieuhkorean;3186 +yerahbenyomohebrew;05AA +yerahbenyomolefthebrew;05AA +yericyrillic;044B +yerudieresiscyrillic;04F9 +yesieungkorean;3181 +yesieungpansioskorean;3183 +yesieungsioskorean;3182 +yetivhebrew;059A +ygrave;1EF3 +yhook;01B4 +yhookabove;1EF7 +yiarmenian;0575 +yicyrillic;0457 +yikorean;3162 +yinyang;262F +yiwnarmenian;0582 +ymonospace;FF59 +yod;05D9 +yoddagesh;FB39 +yoddageshhebrew;FB39 +yodhebrew;05D9 +yodyodhebrew;05F2 +yodyodpatahhebrew;FB1F +yohiragana;3088 +yoikorean;3189 +yokatakana;30E8 +yokatakanahalfwidth;FF96 +yokorean;315B +yosmallhiragana;3087 +yosmallkatakana;30E7 +yosmallkatakanahalfwidth;FF6E +yotgreek;03F3 +yoyaekorean;3188 +yoyakorean;3187 +yoyakthai;0E22 +yoyingthai;0E0D +yparen;24B4 +ypogegrammeni;037A +ypogegrammenigreekcmb;0345 +yr;01A6 +yring;1E99 +ysuperior;02B8 +ytilde;1EF9 +yturned;028E +yuhiragana;3086 +yuikorean;318C +yukatakana;30E6 +yukatakanahalfwidth;FF95 +yukorean;3160 +yusbigcyrillic;046B +yusbigiotifiedcyrillic;046D +yuslittlecyrillic;0467 +yuslittleiotifiedcyrillic;0469 +yusmallhiragana;3085 +yusmallkatakana;30E5 +yusmallkatakanahalfwidth;FF6D +yuyekorean;318B +yuyeokorean;318A +yyabengali;09DF +yyadeva;095F +z;007A +zaarmenian;0566 +zacute;017A +zadeva;095B +zagurmukhi;0A5B +zaharabic;0638 +zahfinalarabic;FEC6 +zahinitialarabic;FEC7 +zahiragana;3056 +zahmedialarabic;FEC8 +zainarabic;0632 +zainfinalarabic;FEB0 +zakatakana;30B6 +zaqefgadolhebrew;0595 +zaqefqatanhebrew;0594 +zarqahebrew;0598 +zayin;05D6 +zayindagesh;FB36 +zayindageshhebrew;FB36 +zayinhebrew;05D6 +zbopomofo;3117 +zcaron;017E +zcircle;24E9 +zcircumflex;1E91 +zcurl;0291 +zdot;017C +zdotaccent;017C +zdotbelow;1E93 +zecyrillic;0437 +zedescendercyrillic;0499 +zedieresiscyrillic;04DF +zehiragana;305C +zekatakana;30BC +zero;0030 +zeroarabic;0660 +zerobengali;09E6 +zerodeva;0966 +zerogujarati;0AE6 +zerogurmukhi;0A66 +zerohackarabic;0660 +zeroinferior;2080 +zeromonospace;FF10 +zerooldstyle;F730 +zeropersian;06F0 +zerosuperior;2070 +zerothai;0E50 +zerowidthjoiner;FEFF +zerowidthnonjoiner;200C +zerowidthspace;200B +zeta;03B6 +zhbopomofo;3113 +zhearmenian;056A +zhebrevecyrillic;04C2 +zhecyrillic;0436 +zhedescendercyrillic;0497 +zhedieresiscyrillic;04DD +zihiragana;3058 +zikatakana;30B8 +zinorhebrew;05AE +zlinebelow;1E95 +zmonospace;FF5A +zohiragana;305E +zokatakana;30BE +zparen;24B5 +zretroflexhook;0290 +zstroke;01B6 +zuhiragana;305A +zukatakana;30BA +""" + + +# string table management +# +class StringTable: + def __init__( self, name_list, master_table_name ): + self.names = name_list + self.master_table = master_table_name + self.indices = {} + index = 0 + + for name in name_list: + self.indices[name] = index + index += len( name ) + 1 + + self.total = index + + def dump( self, file ): + write = file.write + write( " static const char " + self.master_table + + "[" + repr( self.total ) + "] =\n" ) + write( " {\n" ) + + line = "" + for name in self.names: + line += " '" + line += string.join( ( re.findall( ".", name ) ), "','" ) + line += "', 0,\n" + + write( line + " };\n\n\n" ) + + def dump_sublist( self, file, table_name, macro_name, sublist ): + write = file.write + write( "#define " + macro_name + " " + repr( len( sublist ) ) + "\n\n" ) + + write( " /* Values are offsets into the `" + + self.master_table + "' table */\n\n" ) + write( " static const short " + table_name + + "[" + macro_name + "] =\n" ) + write( " {\n" ) + + line = " " + comma = "" + col = 0 + + for name in sublist: + line += comma + line += "%4d" % self.indices[name] + col += 1 + comma = "," + if col == 14: + col = 0 + comma = ",\n " + + write( line + "\n };\n\n\n" ) + + +# We now store the Adobe Glyph List in compressed form. The list is put +# into a data structure called `trie' (because it has a tree-like +# appearance). Consider, for example, that you want to store the +# following name mapping: +# +# A => 1 +# Aacute => 6 +# Abalon => 2 +# Abstract => 4 +# +# It is possible to store the entries as follows. +# +# A => 1 +# | +# +-acute => 6 +# | +# +-b +# | +# +-alon => 2 +# | +# +-stract => 4 +# +# We see that each node in the trie has: +# +# - one or more `letters' +# - an optional value +# - zero or more child nodes +# +# The first step is to call +# +# root = StringNode( "", 0 ) +# for word in map.values(): +# root.add( word, map[word] ) +# +# which creates a large trie where each node has only one children. +# +# Executing +# +# root = root.optimize() +# +# optimizes the trie by merging the letters of successive nodes whenever +# possible. +# +# Each node of the trie is stored as follows. +# +# - First the node's letter, according to the following scheme. We +# use the fact that in the AGL no name contains character codes > 127. +# +# name bitsize description +# ---------------------------------------------------------------- +# notlast 1 Set to 1 if this is not the last letter +# in the word. +# ascii 7 The letter's ASCII value. +# +# - The letter is followed by a children count and the value of the +# current key (if any). Again we can do some optimization because all +# AGL entries are from the BMP; this means that 16 bits are sufficient +# to store its Unicode values. Additionally, no node has more than +# 127 children. +# +# name bitsize description +# ----------------------------------------- +# hasvalue 1 Set to 1 if a 16-bit Unicode value follows. +# num_children 7 Number of children. Can be 0 only if +# `hasvalue' is set to 1. +# value 16 Optional Unicode value. +# +# - A node is finished by a list of 16bit absolute offsets to the +# children, which must be sorted in increasing order of their first +# letter. +# +# For simplicity, all 16bit quantities are stored in big-endian order. +# +# The root node has first letter = 0, and no value. +# +class StringNode: + def __init__( self, letter, value ): + self.letter = letter + self.value = value + self.children = {} + + def __cmp__( self, other ): + return ord( self.letter[0] ) - ord( other.letter[0] ) + + def add( self, word, value ): + if len( word ) == 0: + self.value = value + return + + letter = word[0] + word = word[1:] + + if self.children.has_key( letter ): + child = self.children[letter] + else: + child = StringNode( letter, 0 ) + self.children[letter] = child + + child.add( word, value ) + + def optimize( self ): + # optimize all children first + children = self.children.values() + self.children = {} + + for child in children: + self.children[child.letter[0]] = child.optimize() + + # don't optimize if there's a value, + # if we don't have any child or if we + # have more than one child + if ( self.value != 0 ) or ( not children ) or len( children ) > 1: + return self + + child = children[0] + + self.letter += child.letter + self.value = child.value + self.children = child.children + + return self + + def dump_debug( self, write, margin ): + # this is used during debugging + line = margin + "+-" + if len( self.letter ) == 0: + line += "" + else: + line += self.letter + + if self.value: + line += " => " + repr( self.value ) + + write( line + "\n" ) + + if self.children: + margin += "| " + for child in self.children.values(): + child.dump_debug( write, margin ) + + def locate( self, index ): + self.index = index + if len( self.letter ) > 0: + index += len( self.letter ) + 1 + else: + index += 2 + + if self.value != 0: + index += 2 + + children = self.children.values() + children.sort() + + index += 2 * len( children ) + for child in children: + index = child.locate( index ) + + return index + + def store( self, storage ): + # write the letters + l = len( self.letter ) + if l == 0: + storage += struct.pack( "B", 0 ) + else: + for n in range( l ): + val = ord( self.letter[n] ) + if n < l - 1: + val += 128 + storage += struct.pack( "B", val ) + + # write the count + children = self.children.values() + children.sort() + + count = len( children ) + + if self.value != 0: + storage += struct.pack( "!BH", count + 128, self.value ) + else: + storage += struct.pack( "B", count ) + + for child in children: + storage += struct.pack( "!H", child.index ) + + for child in children: + storage = child.store( storage ) + + return storage + + +def adobe_glyph_values(): + """return the list of glyph names and their unicode values""" + + lines = string.split( adobe_glyph_list, '\n' ) + glyphs = [] + values = [] + + for line in lines: + if line: + fields = string.split( line, ';' ) +# print fields[1] + ' - ' + fields[0] + subfields = string.split( fields[1], ' ' ) + if len( subfields ) == 1: + glyphs.append( fields[0] ) + values.append( fields[1] ) + + return glyphs, values + + +def filter_glyph_names( alist, filter ): + """filter `alist' by taking _out_ all glyph names that are in `filter'""" + + count = 0 + extras = [] + + for name in alist: + try: + filtered_index = filter.index( name ) + except: + extras.append( name ) + + return extras + + +def dump_encoding( file, encoding_name, encoding_list ): + """dump a given encoding""" + + write = file.write + write( " /* the following are indices into the SID name table */\n" ) + write( " static const unsigned short " + encoding_name + + "[" + repr( len( encoding_list ) ) + "] =\n" ) + write( " {\n" ) + + line = " " + comma = "" + col = 0 + for value in encoding_list: + line += comma + line += "%3d" % value + comma = "," + col += 1 + if col == 16: + col = 0 + comma = ",\n " + + write( line + "\n };\n\n\n" ) + + +def dump_array( the_array, write, array_name ): + """dumps a given encoding""" + + write( " static const unsigned char " + array_name + + "[" + repr( len( the_array ) ) + "] =\n" ) + write( " {\n" ) + + line = "" + comma = " " + col = 0 + + for value in the_array: + line += comma + line += "%3d" % ord( value ) + comma = "," + col += 1 + + if col == 16: + col = 0 + comma = ",\n " + + if len( line ) > 1024: + write( line ) + line = "" + + write( line + "\n };\n\n\n" ) + + +def main(): + """main program body""" + + if len( sys.argv ) != 2: + print __doc__ % sys.argv[0] + sys.exit( 1 ) + + file = open( sys.argv[1], "w\n" ) + write = file.write + + count_sid = len( sid_standard_names ) + + # `mac_extras' contains the list of glyph names in the Macintosh standard + # encoding which are not in the SID Standard Names. + # + mac_extras = filter_glyph_names( mac_standard_names, sid_standard_names ) + + # `base_list' contains the names of our final glyph names table. + # It consists of the `mac_extras' glyph names, followed by the SID + # standard names. + # + mac_extras_count = len( mac_extras ) + base_list = mac_extras + sid_standard_names + + write( "/***************************************************************************/\n" ) + write( "/* */\n" ) + + write( "/* %-71s*/\n" % os.path.basename( sys.argv[1] ) ) + + write( "/* */\n" ) + write( "/* PostScript glyph names. */\n" ) + write( "/* */\n" ) + write( "/* Copyright 2005 by */\n" ) + write( "/* David Turner, Robert Wilhelm, and Werner Lemberg. */\n" ) + write( "/* */\n" ) + write( "/* This file is part of the FreeType project, and may only be used, */\n" ) + write( "/* modified, and distributed under the terms of the FreeType project */\n" ) + write( "/* license, LICENSE.TXT. By continuing to use, modify, or distribute */\n" ) + write( "/* this file you indicate that you have read the license and */\n" ) + write( "/* understand and accept it fully. */\n" ) + write( "/* */\n" ) + write( "/***************************************************************************/\n" ) + write( "\n" ) + write( "\n" ) + write( " /* This file has been generated automatically -- do not edit! */\n" ) + write( "\n" ) + write( "\n" ) + + # dump final glyph list (mac extras + sid standard names) + # + st = StringTable( base_list, "ft_standard_glyph_names" ) + + st.dump( file ) + st.dump_sublist( file, "ft_mac_names", + "FT_NUM_MAC_NAMES", mac_standard_names ) + st.dump_sublist( file, "ft_sid_names", + "FT_NUM_SID_NAMES", sid_standard_names ) + + dump_encoding( file, "t1_standard_encoding", t1_standard_encoding ) + dump_encoding( file, "t1_expert_encoding", t1_expert_encoding ) + + # dump the AGL in its compressed form + # + agl_glyphs, agl_values = adobe_glyph_values() + dict = StringNode( "", 0 ) + + for g in range( len( agl_glyphs ) ): + dict.add( agl_glyphs[g], eval( "0x" + agl_values[g] ) ) + + dict = dict.optimize() + dict_len = dict.locate( 0 ) + dict_array = dict.store( "" ) + + write( """\ + /* + * This table is a compressed version of the Adobe Glyph List (AGL), + * optimized for efficient searching. It has been generated by the + * `glnames.py' python script located in the `src/tools' directory. + * + * The lookup function to get the Unicode value for a given string + * is defined below the table. + */ +""" ) + + dump_array( dict_array, write, "ft_adobe_glyph_list" ) + + # write the lookup routine now + # + write( """\ + /* + * This function searches the compressed table efficiently. + */ + static unsigned long + ft_get_adobe_glyph_index( const char* name, + const char* limit ) + { + int c = 0; + int count, min, max; + const unsigned char* p = ft_adobe_glyph_list; + + + if ( name == 0 || name >= limit ) + goto NotFound; + + c = *name++; + count = p[1]; + p += 2; + + min = 0; + max = count; + + while ( min < max ) + { + int mid = ( min + max ) >> 1; + const unsigned char* q = p + mid * 2; + int c2; + + + q = ft_adobe_glyph_list + ( ( (int)q[0] << 8 ) | q[1] ); + + c2 = q[0] & 127; + if ( c2 == c ) + { + p = q; + goto Found; + } + if ( c2 < c ) + min = mid + 1; + else + max = mid; + } + goto NotFound; + + Found: + for (;;) + { + /* assert (*p & 127) == c */ + + if ( name >= limit ) + { + if ( (p[0] & 128) == 0 && + (p[1] & 128) != 0 ) + return (unsigned long)( ( (int)p[2] << 8 ) | p[3] ); + + goto NotFound; + } + c = *name++; + if ( p[0] & 128 ) + { + p++; + if ( c != (p[0] & 127) ) + goto NotFound; + + continue; + } + + p++; + count = p[0] & 127; + if ( p[0] & 128 ) + p += 2; + + p++; + + for ( ; count > 0; count--, p += 2 ) + { + int offset = ( (int)p[0] << 8 ) | p[1]; + const unsigned char* q = ft_adobe_glyph_list + offset; + + if ( c == ( q[0] & 127 ) ) + { + p = q; + goto NextIter; + } + } + goto NotFound; + + NextIter: + ; + } + + NotFound: + return 0; + } + +""" ) + + if 0: # generate unit test, or don't + # + # now write the unit test to check that everything works OK + # + write( "#ifdef TEST\n\n" ) + + write( "static const char* const the_names[] = {\n" ) + for name in agl_glyphs: + write( ' "' + name + '",\n' ) + write( " 0\n};\n" ) + + write( "static const unsigned long the_values[] = {\n" ) + for val in agl_values: + write( ' 0x' + val + ',\n' ) + write( " 0\n};\n" ) + + write( """ +#include +#include + + int + main( void ) + { + int result = 0; + const char* const* names = the_names; + const unsigned long* values = the_values; + + + for ( ; *names; names++, values++ ) + { + const char* name = *names; + unsigned long reference = *values; + unsigned long value; + + + value = ft_get_adobe_glyph_index( name, name + strlen( name ) ); + if ( value != reference ) + { + result = 1; + fprintf( stderr, "name '%s' => %04x instead of %04x\\n", + name, value, reference ); + } + } + + return result; + } +""" ) + + write( "#endif /* TEST */\n" ) + + write("\n/* END */\n") + + +# Now run the main routine +# +main() + + +# END diff --git a/src/WinLibs/freetype-2.3.5/src/tools/test_afm.c b/src/WinLibs/freetype-2.3.5/src/tools/test_afm.c new file mode 100644 index 000000000..d53cb3325 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/tools/test_afm.c @@ -0,0 +1,157 @@ +/* + * gcc -DFT2_BUILD_LIBRARY -I../../include -o test_afm test_afm.c \ + * -L../../objs/.libs -lfreetype -lz -static + */ +#include +#include FT_FREETYPE_H +#include FT_INTERNAL_STREAM_H +#include FT_INTERNAL_POSTSCRIPT_AUX_H + + void dump_fontinfo( AFM_FontInfo fi ) + { + FT_Int i; + + + printf( "This AFM is for %sCID font.\n\n", + ( fi->IsCIDFont ) ? "" : "non-" ); + + printf( "FontBBox: %.2f %.2f %.2f %.2f\n", fi->FontBBox.xMin / 65536., + fi->FontBBox.yMin / 65536., + fi->FontBBox.xMax / 65536., + fi->FontBBox.yMax / 65536. ); + printf( "Ascender: %.2f\n", fi->Ascender / 65536. ); + printf( "Descender: %.2f\n\n", fi->Descender / 65536. ); + + if ( fi->NumTrackKern ) + printf( "There are %d sets of track kernings:\n", + fi->NumTrackKern ); + else + printf( "There is no track kerning.\n" ); + + for ( i = 0; i < fi->NumTrackKern; i++ ) + { + AFM_TrackKern tk = fi->TrackKerns + i; + + + printf( "\t%2d: %5.2f %5.2f %5.2f %5.2f\n", tk->degree, + tk->min_ptsize / 65536., + tk->min_kern / 65536., + tk->max_ptsize / 65536., + tk->max_kern / 65536. ); + } + + printf( "\n" ); + + if ( fi->NumKernPair ) + printf( "There are %d kerning pairs:\n", + fi->NumKernPair ); + else + printf( "There is no kerning pair.\n" ); + + for ( i = 0; i < fi->NumKernPair; i++ ) + { + AFM_KernPair kp = fi->KernPairs + i; + + + printf( "\t%3d + %3d => (%4d, %4d)\n", kp->index1, + kp->index2, + kp->x, + kp->y ); + } + + } + + int + dummy_get_index( const char* name, + FT_UInt len, + void* user_data ) + { + if ( len ) + return name[0]; + else + return 0; + } + + FT_Error + parse_afm( FT_Library library, + FT_Stream stream, + AFM_FontInfo fi ) + { + PSAux_Service psaux; + AFM_ParserRec parser; + FT_Error error = FT_Err_Ok; + + + psaux = (PSAux_Service)FT_Get_Module_Interface( library, "psaux" ); + if ( !psaux || !psaux->afm_parser_funcs ) + return -1; + + error = FT_Stream_EnterFrame( stream, stream->size ); + if ( error ) + return error; + + error = psaux->afm_parser_funcs->init( &parser, + library->memory, + stream->cursor, + stream->limit ); + if ( error ) + return error; + + parser.FontInfo = fi; + parser.get_index = dummy_get_index; + + error = psaux->afm_parser_funcs->parse( &parser ); + + psaux->afm_parser_funcs->done( &parser ); + + return error; + } + + + int main( int argc, + char** argv ) + { + FT_Library library; + FT_StreamRec stream; + FT_Error error = FT_Err_Ok; + AFM_FontInfoRec fi; + + + if ( argc < 2 ) + return FT_Err_Invalid_Argument; + + error = FT_Init_FreeType( &library ); + if ( error ) + return error; + + FT_ZERO( &stream ); + error = FT_Stream_Open( &stream, argv[1] ); + if ( error ) + goto Exit; + stream.memory = library->memory; + + FT_ZERO( &fi ); + error = parse_afm( library, &stream, &fi ); + + if ( !error ) + { + FT_Memory memory = library->memory; + + + dump_fontinfo( &fi ); + + if ( fi.KernPairs ) + FT_FREE( fi.KernPairs ); + if ( fi.TrackKerns ) + FT_FREE( fi.TrackKerns ); + } + else + printf( "parse error\n" ); + + FT_Stream_Close( &stream ); + + Exit: + FT_Done_FreeType( library ); + + return error; + } diff --git a/src/WinLibs/freetype-2.3.5/src/tools/test_bbox.c b/src/WinLibs/freetype-2.3.5/src/tools/test_bbox.c new file mode 100644 index 000000000..e085c5b3d --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/tools/test_bbox.c @@ -0,0 +1,160 @@ +#include +#include FT_FREETYPE_H +#include FT_BBOX_H + + +#include /* for clock() */ + +/* SunOS 4.1.* does not define CLOCKS_PER_SEC, so include */ +/* to get the HZ macro which is the equivalent. */ +#if defined(__sun__) && !defined(SVR4) && !defined(__SVR4) +#include +#define CLOCKS_PER_SEC HZ +#endif + + static long + get_time( void ) + { + return clock() * 10000L / CLOCKS_PER_SEC; + } + + + + + /* test bbox computations */ + +#define XSCALE 65536 +#define XX(x) ((FT_Pos)(x*XSCALE)) +#define XVEC(x,y) { XX(x), XX(y) } +#define XVAL(x) ((x)/(1.0*XSCALE)) + + /* dummy outline #1 */ + static FT_Vector dummy_vec_1[4] = + { +#if 1 + XVEC( 408.9111, 535.3164 ), + XVEC( 455.8887, 634.396 ), + XVEC( -37.8765, 786.2207 ), + XVEC( 164.6074, 535.3164 ) +#else + { (FT_Int32)0x0198E93DL , (FT_Int32)0x021750FFL }, /* 408.9111, 535.3164 */ + { (FT_Int32)0x01C7E312L , (FT_Int32)0x027A6560L }, /* 455.8887, 634.3960 */ + { (FT_Int32)0xFFDA1F9EL , (FT_Int32)0x0312387FL }, /* -37.8765, 786.2207 */ + { (FT_Int32)0x00A49B7EL , (FT_Int32)0x021750FFL } /* 164.6074, 535.3164 */ +#endif + }; + + static char dummy_tag_1[4] = + { + FT_CURVE_TAG_ON, + FT_CURVE_TAG_CUBIC, + FT_CURVE_TAG_CUBIC, + FT_CURVE_TAG_ON + }; + + static short dummy_contour_1[1] = + { + 3 + }; + + static FT_Outline dummy_outline_1 = + { + 1, + 4, + dummy_vec_1, + dummy_tag_1, + dummy_contour_1, + 0 + }; + + + /* dummy outline #2 */ + static FT_Vector dummy_vec_2[4] = + { + XVEC( 100.0, 100.0 ), + XVEC( 100.0, 200.0 ), + XVEC( 200.0, 200.0 ), + XVEC( 200.0, 133.0 ) + }; + + static FT_Outline dummy_outline_2 = + { + 1, + 4, + dummy_vec_2, + dummy_tag_1, + dummy_contour_1, + 0 + }; + + + static void + dump_outline( FT_Outline* outline ) + { + FT_BBox bbox; + + /* compute and display cbox */ + FT_Outline_Get_CBox( outline, &bbox ); + printf( "cbox = [%.2f %.2f %.2f %.2f]\n", + XVAL( bbox.xMin ), + XVAL( bbox.yMin ), + XVAL( bbox.xMax ), + XVAL( bbox.yMax ) ); + + /* compute and display bbox */ + FT_Outline_Get_BBox( outline, &bbox ); + printf( "bbox = [%.2f %.2f %.2f %.2f]\n", + XVAL( bbox.xMin ), + XVAL( bbox.yMin ), + XVAL( bbox.xMax ), + XVAL( bbox.yMax ) ); + } + + + + static void + profile_outline( FT_Outline* outline, + long repeat ) + { + FT_BBox bbox; + long count; + long time0; + + time0 = get_time(); + for ( count = repeat; count > 0; count-- ) + FT_Outline_Get_CBox( outline, &bbox ); + + time0 = get_time() - time0; + printf( "time = %5.2f cbox = [%.2f %.2f %.2f %.2f]\n", + ((double)time0/10000.0), + XVAL( bbox.xMin ), + XVAL( bbox.yMin ), + XVAL( bbox.xMax ), + XVAL( bbox.yMax ) ); + + + time0 = get_time(); + for ( count = repeat; count > 0; count-- ) + FT_Outline_Get_BBox( outline, &bbox ); + + time0 = get_time() - time0; + printf( "time = %5.2f bbox = [%.2f %.2f %.2f %.2f]\n", + ((double)time0/10000.0), + XVAL( bbox.xMin ), + XVAL( bbox.yMin ), + XVAL( bbox.xMax ), + XVAL( bbox.yMax ) ); + } + +#define REPEAT 100000L + + int main( int argc, char** argv ) + { + printf( "outline #1\n" ); + profile_outline( &dummy_outline_1, REPEAT ); + + printf( "outline #2\n" ); + profile_outline( &dummy_outline_2, REPEAT ); + return 0; + } + diff --git a/src/WinLibs/freetype-2.3.5/src/tools/test_trig.c b/src/WinLibs/freetype-2.3.5/src/tools/test_trig.c new file mode 100644 index 000000000..8c8a544aa --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/tools/test_trig.c @@ -0,0 +1,236 @@ +#include +#include FT_FREETYPE_H +#include FT_TRIGONOMETRY_H + +#include +#include + +#define PI 3.14159265358979323846 +#define SPI (PI/FT_ANGLE_PI) + +/* the precision in 16.16 fixed float points of the checks. Expect */ +/* between 2 and 5 noise LSB bits during operations, due to */ +/* rounding errors.. */ +#define THRESHOLD 64 + + static error = 0; + + static void + test_cos( void ) + { + FT_Fixed f1, f2; + double d1, d2; + int i; + + for ( i = 0; i < FT_ANGLE_2PI; i += 0x10000 ) + { + f1 = FT_Cos(i); + d1 = f1/65536.0; + d2 = cos( i*SPI ); + f2 = (FT_Fixed)(d2*65536.0); + + if ( abs( f2-f1 ) > THRESHOLD ) + { + error = 1; + printf( "FT_Cos[%3d] = %.7f cos[%3d] = %.7f\n", + (i >> 16), f1/65536.0, (i >> 16), d2 ); + } + } + } + + + + static void + test_sin( void ) + { + FT_Fixed f1, f2; + double d1, d2; + int i; + + for ( i = 0; i < FT_ANGLE_2PI; i += 0x10000 ) + { + f1 = FT_Sin(i); + d1 = f1/65536.0; + d2 = sin( i*SPI ); + f2 = (FT_Fixed)(d2*65536.0); + + if ( abs( f2-f1 ) > THRESHOLD ) + { + error = 1; + printf( "FT_Sin[%3d] = %.7f sin[%3d] = %.7f\n", + (i >> 16), f1/65536.0, (i >> 16), d2 ); + } + } + } + + + static void + test_tan( void ) + { + FT_Fixed f1, f2; + double d1, d2; + int i; + + for ( i = 0; i < FT_ANGLE_PI2-0x2000000; i += 0x10000 ) + { + f1 = FT_Tan(i); + d1 = f1/65536.0; + d2 = tan( i*SPI ); + f2 = (FT_Fixed)(d2*65536.0); + + if ( abs( f2-f1 ) > THRESHOLD ) + { + error = 1; + printf( "FT_Tan[%3d] = %.7f tan[%3d] = %.7f\n", + (i >> 16), f1/65536.0, (i >> 16), d2 ); + } + } + } + + + static void + test_atan2( void ) + { + FT_Fixed c2, s2; + double l, a, c1, s1; + int i, j; + + for ( i = 0; i < FT_ANGLE_2PI; i += 0x10000 ) + { + l = 5.0; + a = i*SPI; + + c1 = l * cos(a); + s1 = l * sin(a); + + c2 = (FT_Fixed)(c1*65536.0); + s2 = (FT_Fixed)(s1*65536.0); + + j = FT_Atan2( c2, s2 ); + if ( j < 0 ) + j += FT_ANGLE_2PI; + + if ( abs( i - j ) > 1 ) + { + printf( "FT_Atan2( %.7f, %.7f ) = %.5f, atan = %.5f\n", + c2/65536.0, s2/65536.0, j/65536.0, i/65536.0 ); + } + } + } + + static void + test_unit( void ) + { + FT_Vector v; + double a, c1, s1; + FT_Fixed c2, s2; + int i; + + for ( i = 0; i < FT_ANGLE_2PI; i += 0x10000 ) + { + FT_Vector_Unit( &v, i ); + a = ( i*SPI ); + c1 = cos(a); + s1 = sin(a); + c2 = (FT_Fixed)(c1*65536.0); + s2 = (FT_Fixed)(s1*65536.0); + + if ( abs( v.x-c2 ) > THRESHOLD || + abs( v.y-s2 ) > THRESHOLD ) + { + error = 1; + printf( "FT_Vector_Unit[%3d] = ( %.7f, %.7f ) vec = ( %.7f, %.7f )\n", + (i >> 16), + v.x/65536.0, v.y/65536.0, + c1, s1 ); + } + } + } + + + static void + test_length( void ) + { + FT_Vector v; + FT_Fixed l, l2; + int i; + + for ( i = 0; i < FT_ANGLE_2PI; i += 0x10000 ) + { + l = (FT_Fixed)(500.0*65536.0); + v.x = (FT_Fixed)( l * cos( i*SPI ) ); + v.y = (FT_Fixed)( l * sin( i*SPI ) ); + l2 = FT_Vector_Length( &v ); + + if ( abs( l2-l ) > THRESHOLD ) + { + error = 1; + printf( "FT_Length( %.7f, %.7f ) = %.5f, length = %.5f\n", + v.x/65536.0, v.y/65536.0, l2/65536.0, l/65536.0 ); + } + } + } + + + static void + test_rotate( void ) + { + FT_Fixed c2, s2, c4, s4; + FT_Vector v; + double l, ra, a, c1, s1, cra, sra, c3, s3; + int i, j, rotate; + + for ( rotate = 0; rotate < FT_ANGLE_2PI; rotate += 0x10000 ) + { + ra = rotate*SPI; + cra = cos( ra ); + sra = sin( ra ); + + for ( i = 0; i < FT_ANGLE_2PI; i += 0x10000 ) + { + l = 500.0; + a = i*SPI; + + c1 = l * cos(a); + s1 = l * sin(a); + + v.x = c2 = (FT_Fixed)(c1*65536.0); + v.y = s2 = (FT_Fixed)(s1*65536.0); + + FT_Vector_Rotate( &v, rotate ); + + c3 = c1 * cra - s1 * sra; + s3 = c1 * sra + s1 * cra; + + c4 = (FT_Fixed)(c3*65536.0); + s4 = (FT_Fixed)(s3*65536.0); + + if ( abs( c4 - v.x ) > THRESHOLD || + abs( s4 - v.y ) > THRESHOLD ) + { + error = 1; + printf( "FT_Rotate( (%.7f,%.7f), %.5f ) = ( %.7f, %.7f ), rot = ( %.7f, %.7f )\n", + c1, s1, ra, + c2/65536.0, s2/65536.0, + c4/65536.0, s4/65536.0 ); + } + } + } + } + + + int main( void ) + { + test_cos(); + test_sin(); + test_tan(); + test_atan2(); + test_unit(); + test_length(); + test_rotate(); + + if (!error) + printf( "trigonometry test ok !\n" ); + + return !error; + } diff --git a/src/WinLibs/freetype-2.3.5/src/truetype/Jamfile b/src/WinLibs/freetype-2.3.5/src/truetype/Jamfile new file mode 100644 index 000000000..a166909f4 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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 ; + } + else + { + _sources = truetype ; + } + + Library $(FT2_LIB) : $(_sources).c ; +} + +# end of src/truetype Jamfile diff --git a/src/WinLibs/freetype-2.3.5/src/truetype/module.mk b/src/WinLibs/freetype-2.3.5/src/truetype/module.mk new file mode 100644 index 000000000..3b05afc7f --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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)tt_driver_class$(CLOSE_DRIVER) +$(ECHO_DRIVER)truetype $(ECHO_DRIVER_DESC)Windows/Mac font files with extension *.ttf or *.ttc$(ECHO_DRIVER_DONE) +endef + +# EOF diff --git a/src/WinLibs/freetype-2.3.5/src/truetype/rules.mk b/src/WinLibs/freetype-2.3.5/src/truetype/rules.mk new file mode 100644 index 000000000..74684260e --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/src/truetype/truetype.c b/src/WinLibs/freetype-2.3.5/src/truetype/truetype.c new file mode 100644 index 000000000..b36473a72 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/truetype/truetype.c @@ -0,0 +1,36 @@ +/***************************************************************************/ +/* */ +/* truetype.c */ +/* */ +/* FreeType TrueType driver component (body only). */ +/* */ +/* Copyright 1996-2001, 2004, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#define FT_MAKE_OPTION_SINGLE_OBJECT + +#include +#include "ttdriver.c" /* driver interface */ +#include "ttpload.c" /* tables loader */ +#include "ttgload.c" /* glyph loader */ +#include "ttobjs.c" /* object manager */ + +#ifdef TT_USE_BYTECODE_INTERPRETER +#include "ttinterp.c" +#endif + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT +#include "ttgxvar.c" /* gx distortable font */ +#endif + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/truetype/ttdriver.c b/src/WinLibs/freetype-2.3.5/src/truetype/ttdriver.c new file mode 100644 index 000000000..c2cf45298 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/truetype/ttdriver.c @@ -0,0 +1,418 @@ +/***************************************************************************/ +/* */ +/* ttdriver.c */ +/* */ +/* TrueType font driver implementation (body). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#include +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_STREAM_H +#include FT_INTERNAL_SFNT_H +#include FT_TRUETYPE_IDS_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" + + + /*************************************************************************/ + /* */ + /* 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 ) + + + /*************************************************************************/ + /* */ + /* */ + /* tt_get_kerning */ + /* */ + /* */ + /* A driver method used to return the kerning vector between two */ + /* glyphs of the same face. */ + /* */ + /* */ + /* 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. */ + /* */ + /* */ + /* kerning :: The kerning vector. This is in font units for */ + /* scalable formats, and in pixels for fixed-sizes */ + /* formats. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + /* */ + /* 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 + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** 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; + } + + + /*************************************************************************/ + /* */ + /* */ + /* Load_Glyph */ + /* */ + /* */ + /* A driver method used to load a glyph within a given glyph slot. */ + /* */ + /* */ + /* 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 */ + /* FTLOAD_??? 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). */ + /* */ + /* */ + /* 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 || glyph_index >= (FT_UInt)face->num_glyphs ) + return TT_Err_Invalid_Argument; + + if ( load_flags & ( FT_LOAD_NO_RECURSE | FT_LOAD_NO_SCALE ) ) + { + load_flags |= FT_LOAD_NO_HINTING | + FT_LOAD_NO_BITMAP | + FT_LOAD_NO_SCALE; + } + + /* 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 + static const FT_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 */ + }; + + static const FT_Service_TTGlyfRec tt_service_truetype_glyf = + { + (TT_Glyf_GetLocationFunc)tt_face_get_location + }; + + static const FT_ServiceDescRec tt_services[] = + { + { FT_SERVICE_ID_XF86_NAME, FT_XF86_FORMAT_TRUETYPE }, +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + { FT_SERVICE_ID_MULTI_MASTERS, &tt_service_gx_multi_masters }, +#endif + { FT_SERVICE_ID_TRUETYPE_ENGINE, &tt_service_truetype_engine }, + { FT_SERVICE_ID_TT_GLYF, &tt_service_truetype_glyf }, + { NULL, NULL } + }; + + + 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( tt_services, tt_interface ); + if ( result != NULL ) + return result; + + /* 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. */ + + FT_CALLBACK_TABLE_DEF + const FT_Driver_ClassRec tt_driver_class = + { + { + FT_MODULE_FONT_DRIVER | + FT_MODULE_DRIVER_SCALABLE | +#ifdef TT_USE_BYTECODE_INTERPRETER + FT_MODULE_DRIVER_HAS_HINTER, +#else + 0, +#endif + + 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 */ + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + ft_stub_set_char_sizes, + ft_stub_set_pixel_sizes, +#endif + Load_Glyph, + + tt_get_kerning, + 0, /* FT_Face_AttachFunc */ + 0, /* FT_Face_GetAdvancesFunc */ + + tt_size_request, +#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS + tt_size_select +#else + 0 /* FT_Size_SelectFunc */ +#endif + }; + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/truetype/ttdriver.h b/src/WinLibs/freetype-2.3.5/src/truetype/ttdriver.h new file mode 100644 index 000000000..f6f26e4b5 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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 +#include FT_INTERNAL_DRIVER_H + + +FT_BEGIN_HEADER + + + FT_EXPORT_VAR( const FT_Driver_ClassRec ) tt_driver_class; + + +FT_END_HEADER + +#endif /* __TTDRIVER_H__ */ + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/truetype/tterrors.h b/src/WinLibs/freetype-2.3.5/src/truetype/tterrors.h new file mode 100644 index 000000000..d317c70e0 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/src/truetype/ttgload.c b/src/WinLibs/freetype-2.3.5/src/truetype/ttgload.c new file mode 100644 index 000000000..ae476a417 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/truetype/ttgload.c @@ -0,0 +1,1957 @@ +/***************************************************************************/ +/* */ +/* ttgload.c */ +/* */ +/* TrueType Glyph Loader (body). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#include +#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. */ + /* */ + static void + 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; + } + + + /*************************************************************************/ + /* */ + /* 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. */ + /* */ + static void + 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 + + } + + + /*************************************************************************/ + /* */ + /* 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; + + cont[0] = prev_cont = FT_NEXT_USHORT( p ); + 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; + *flag = 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; + *flag = 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; + } + + + /*************************************************************************/ + /* */ + /* */ + /* TT_Hint_Glyph */ + /* */ + /* */ + /* 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 + n_ins = 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 ); +#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; + + + 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; + } + +#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; + } + + + /*************************************************************************/ + /* */ + /* */ + /* TT_Process_Simple_Glyph */ + /* */ + /* */ + /* 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_UInt 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_UInt 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; + } + + + /*************************************************************************/ + /* */ + /* */ + /* TT_Process_Composite_Component */ + /* */ + /* */ + /* 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_MulFix( subglyph->transform.xx, + subglyph->transform.xx ) + + FT_MulFix( subglyph->transform.xy, + subglyph->transform.xy ) ); + FT_Fixed mac_yscale = FT_SqrtFixed( + FT_MulFix( subglyph->transform.yy, + subglyph->transform.yy ) + + 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; + } + + + /*************************************************************************/ + /* */ + /* */ + /* TT_Process_Composite_Glyph */ + /* */ + /* */ + /* 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_X | + FT_CURVE_TAG_TOUCH_Y ); + + 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 ) + + + /*************************************************************************/ + /* */ + /* */ + /* load_truetype_glyph */ + /* */ + /* */ + /* 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_Error error; + 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 + + + if ( 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; + } + + /* get metrics, horizontal and vertical */ + { + FT_Short left_bearing = 0, top_bearing = 0; + FT_UShort advance_width = 0, advance_height = 0; + + + Get_HMetrics( face, glyph_index, + (FT_Bool)!( loader->load_flags & + FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH ), + &left_bearing, + &advance_width ); + 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 see if 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; + + + metrics.bearing_x = left_bearing; + metrics.bearing_y = 0; + metrics.advance = advance_width; + 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 */ + + } + +#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; + } + } + + /* 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 ) + { + /* as described by Frederic Loyer, these are spaces or */ + /* the unknown glyph. */ + loader->bbox.xMin = 0; + loader->bbox.xMax = 0; + loader->bbox.yMin = 0; + loader->bbox.yMax = 0; + + 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; + } + + error = face->access_glyph_frame( loader, glyph_index, + loader->glyf_offset + offset, + loader->byte_len ); + if ( error ) + goto Exit; + + opened_frame = 1; + + /* read first glyph header */ + error = face->read_glyph_header( loader ); + if ( error ) + 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 ) + { + subglyph->arg1 += deltas[i].x; + subglyph->arg2 += 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; + + TT_GraphicsState saved_GS; + + + if ( loader->exec ) + saved_GS = loader->exec->GS; + + FT_GlyphLoader_Add( gloader ); + + /* read each subglyph independently */ + for ( n = 0; n < num_subglyphs; n++ ) + { + FT_Vector pp[4]; + + + /* reinitialize graphics state */ + if ( loader->exec ) + loader->exec->GS = saved_GS; + + /* 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 ); + 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; + + /* Now take care of vertical metrics. In the case where there is */ + /* no vertical information within the font (relatively common), make */ + /* up some metrics by `hand'... */ + + { + 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 = ( bbox.xMin - bbox.xMax ) / 2; + glyph->metrics.vertBearingY = top; + glyph->metrics.vertAdvance = advance; + } + + /* 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; + + 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 ) + { + 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 ) ) + { + 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 ) + { + FT_ERROR(( "TT_Load_Glyph: could not access glyph table\n" )); + return error; + } + loader->glyf_offset = FT_STREAM_POS(); + } + + /* get face's glyph loader */ + { + 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; + } + + + /*************************************************************************/ + /* */ + /* */ + /* TT_Load_Glyph */ + /* */ + /* */ + /* A function used to load a single glyph within a given glyph slot, */ + /* for a given size. */ + /* */ + /* */ + /* 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). */ + /* */ + /* */ + /* 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 ) + 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 ); + 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 ); + 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 ); + } + + compute_glyph_metrics( &loader, glyph_index ); + } + + /* Set the `high precision' bit flag. */ + /* This is _critical_ to get correct output for monochrome */ + /* TrueType glyphs at all sizes using the bytecode interpreter. */ + /* */ + if ( !( load_flags & FT_LOAD_NO_SCALE ) && + size->root.metrics.y_ppem < 24 ) + glyph->outline.flags |= FT_OUTLINE_HIGH_PRECISION; + + return error; + } + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/truetype/ttgload.h b/src/WinLibs/freetype-2.3.5/src/truetype/ttgload.h new file mode 100644 index 000000000..b261e97de --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/truetype/ttgload.h @@ -0,0 +1,49 @@ +/***************************************************************************/ +/* */ +/* ttgload.h */ +/* */ +/* TrueType Glyph Loader (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 __TTGLOAD_H__ +#define __TTGLOAD_H__ + + +#include +#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( FT_Error ) + TT_Load_Glyph( TT_Size size, + TT_GlyphSlot glyph, + FT_UInt glyph_index, + FT_Int32 load_flags ); + + +FT_END_HEADER + +#endif /* __TTGLOAD_H__ */ + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/truetype/ttgxvar.c b/src/WinLibs/freetype-2.3.5/src/truetype/ttgxvar.c new file mode 100644 index 000000000..0dc2c4f3e --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/truetype/ttgxvar.c @@ -0,0 +1,1536 @@ +/***************************************************************************/ +/* */ +/* ttgxvar.c */ +/* */ +/* TrueType GX Font Variation loader */ +/* */ +/* Copyright 2004, 2005, 2006, 2007 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 +#include FT_INTERNAL_DEBUG_H +#include FT_CONFIG_CONFIG_H +#include FT_INTERNAL_STREAM_H +#include FT_INTERNAL_SFNT_H +#include FT_TRUETYPE_IDS_H +#include FT_TRUETYPE_TAGS_H +#include FT_MULTIPLE_MASTERS_H + +#include "ttdriver.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 ) + + + enum + { + GX_PT_POINTS_ARE_WORDS = 0x80, + GX_PT_POINT_RUN_COUNT_MASK = 0x7F + }; + + + /*************************************************************************/ + /* */ + /* */ + /* ft_var_readpackedpoints */ + /* */ + /* */ + /* Read a set of points to which the following deltas will apply. */ + /* Points are packed with a run length encoding. */ + /* */ + /* */ + /* stream :: The data stream. */ + /* */ + /* */ + /* point_cnt :: The number of points read. A zero value means that */ + /* all points in the glyph will be affected, without */ + /* enumerating them individually. */ + /* */ + /* */ + /* 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(); + + /* 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(); + + for ( j = 0; j < runcnt; ++j ) + points[i++] = (FT_UShort)( first += FT_GET_BYTE() ); + } + } + + return points; + } + + + enum + { + GX_DT_DELTAS_ARE_ZERO = 0x80, + GX_DT_DELTAS_ARE_WORDS = 0x40, + GX_DT_DELTA_RUN_COUNT_MASK = 0x3F + }; + + + /*************************************************************************/ + /* */ + /* */ + /* ft_var_readpackeddeltas */ + /* */ + /* */ + /* Read a set of deltas. These are packed slightly differently than */ + /* points. In particular there is no overall count. */ + /* */ + /* */ + /* stream :: The data stream. */ + /* */ + /* delta_cnt :: The number of to be read. */ + /* */ + /* */ + /* 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_Int delta_cnt ) + { + FT_Short *deltas; + FT_Int runcnt; + FT_Int i; + FT_Int 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; + } + + + /*************************************************************************/ + /* */ + /* */ + /* ft_var_load_avar */ + /* */ + /* */ + /* Parse the `avar' table if present. It need not be, so we return */ + /* nothing. */ + /* */ + /* */ + /* 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; + + + /*************************************************************************/ + /* */ + /* */ + /* ft_var_load_gvar */ + /* */ + /* */ + /* Parses the `gvar' table if present. If `fvar' is there, `gvar' */ + /* had better be there too. */ + /* */ + /* */ + /* face :: The font face. */ + /* */ + /* */ + /* 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; + } + + + /*************************************************************************/ + /* */ + /* */ + /* ft_var_apply_tuple */ + /* */ + /* */ + /* Figure out whether a given tuple (design) applies to the current */ + /* blend, and if so, what is the scaling factor. */ + /* */ + /* */ + /* 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). */ + /* */ + /* */ + /* 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; + + + /*************************************************************************/ + /* */ + /* */ + /* TT_Get_MM_Var */ + /* */ + /* */ + /* Check that the font's `fvar' table is valid, parse it, and return */ + /* those data. */ + /* */ + /* */ + /* face :: The font face. */ + /* TT_Get_MM_Var initializes the blend structure. */ + /* */ + /* */ + /* master :: The `fvar' data (must be freed by caller). */ + /* */ + /* */ + /* 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 ) + { + 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; + } + + + /*************************************************************************/ + /* */ + /* */ + /* TT_Set_MM_Blend */ + /* */ + /* */ + /* Set the blend (normalized) coordinates for this instance of the */ + /* font. Check that the `gvar' table is reasonable and does some */ + /* initial preparation. */ + /* */ + /* */ + /* face :: The font. */ + /* Initialize the blend structure with `gvar' data. */ + /* */ + /* */ + /* num_coords :: Must be the axis count of the font. */ + /* */ + /* coords :: An array of num_coords, each between [-1,1]. */ + /* */ + /* */ + /* 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 + { + for ( i = 0; + i < num_coords && blend->normalizedcoords[i] == coords[i]; + ++i ); + if ( i == num_coords ) + manageCvt = mcvt_retain; + else + manageCvt = mcvt_load; + + /* 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; + } + + + /*************************************************************************/ + /* */ + /* */ + /* TT_Set_Var_Design */ + /* */ + /* */ + /* 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. */ + /* */ + /* */ + /* face :: The font face. */ + /* Initialize the blend struct with `gvar' data. */ + /* */ + /* */ + /* num_coords :: This must be the axis count of the font. */ + /* */ + /* coords :: A coordinate array with `num_coords' elements. */ + /* */ + /* */ + /* 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 *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* */ + /* tt_face_vary_cvt */ + /* */ + /* */ + /* Modify the loaded cvt table according to the `cvar' table and the */ + /* font's blend. */ + /* */ + /* */ + /* face :: A handle to the target face object. */ + /* */ + /* */ + /* stream :: A handle to the input stream. */ + /* */ + /* */ + /* 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(( "no blend specified!\n" )); + + error = TT_Err_Ok; + goto Exit; + } + + if ( face->cvt == NULL ) + { + FT_TRACE2(( "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; + } + + + /*************************************************************************/ + /* */ + /* */ + /* TT_Vary_Get_Glyph_Deltas */ + /* */ + /* */ + /* Load the appropriate deltas for the current glyph. */ + /* */ + /* */ + /* 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. */ + /* */ + /* */ + /* deltas :: The array of points to change. */ + /* */ + /* */ + /* 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; + } + + + /*************************************************************************/ + /* */ + /* */ + /* tt_done_blend */ + /* */ + /* */ + /* Frees the blend internal data structure. */ + /* */ + FT_LOCAL_DEF( void ) + tt_done_blend( FT_Memory memory, + GX_Blend blend ) + { + if ( blend != NULL ) + { + FT_UInt i; + + + FT_FREE( blend->normalizedcoords ); + FT_FREE( blend->mmvar ); + + if ( blend->avar_segment != NULL ) + { + for ( i = 0; i < blend->num_axis; ++i ) + FT_FREE( blend->avar_segment[i].correspondence ); + FT_FREE( blend->avar_segment ); + } + + FT_FREE( blend->tuplecoords ); + FT_FREE( blend->glyphoffsets ); + FT_FREE( blend ); + } + } + +#endif /* TT_CONFIG_OPTION_GX_VAR_SUPPORT */ + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/truetype/ttgxvar.h b/src/WinLibs/freetype-2.3.5/src/truetype/ttgxvar.h new file mode 100644 index 000000000..706cb4d36 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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 +#include "ttobjs.h" + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* */ + /* GX_AVarCorrespondenceRec */ + /* */ + /* */ + /* 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; + + + /*************************************************************************/ + /* */ + /* */ + /* GX_AVarRec */ + /* */ + /* */ + /* 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; + + + /*************************************************************************/ + /* */ + /* */ + /* GX_BlendRec */ + /* */ + /* */ + /* Data for interpolating a font from a distortable font specified */ + /* by the GX *var tables ([fgca]var). */ + /* */ + /* */ + /* 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_Int 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; + + + /*************************************************************************/ + /* */ + /* */ + /* GX_TupleCountFlags */ + /* */ + /* */ + /* 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; + + + /*************************************************************************/ + /* */ + /* */ + /* GX_TupleIndexFlags */ + /* */ + /* */ + /* Flags used within the `TupleIndex' field of the `gvar' and `cvar' */ + /* tables. */ + /* */ + typedef enum GX_TupleIndexFlags_ + { + GX_TI_EMBEDDED_TUPLE_COORD = 0x8000, + GX_TI_INTERMEDIATE_TUPLE = 0x4000, + GX_TI_PRIVATE_POINT_NUMBERS = 0x2000, + GX_TI_RESERVED_TUPLE_FLAG = 0x1000, + GX_TI_TUPLE_INDEX_MASK = 0x0FFF + + } GX_TupleIndexFlags; + + +#define TTAG_wght FT_MAKE_TAG( 'w', 'g', 'h', 't' ) +#define TTAG_wdth FT_MAKE_TAG( 'w', 'd', 't', 'h' ) +#define TTAG_opsz FT_MAKE_TAG( 'o', 'p', 's', 'z' ) +#define TTAG_slnt FT_MAKE_TAG( 's', 'l', 'n', 't' ) + + + FT_LOCAL( FT_Error ) + TT_Set_MM_Blend( TT_Face face, + FT_UInt num_coords, + FT_Fixed* coords ); + + FT_LOCAL( FT_Error ) + TT_Set_Var_Design( TT_Face face, + FT_UInt num_coords, + FT_Fixed* coords ); + + FT_LOCAL( FT_Error ) + TT_Get_MM_Var( TT_Face face, + FT_MM_Var* *master ); + + + FT_LOCAL( FT_Error ) + tt_face_vary_cvt( TT_Face face, + FT_Stream stream ); + + + FT_LOCAL( FT_Error ) + TT_Vary_Get_Glyph_Deltas( TT_Face face, + FT_UInt glyph_index, + FT_Vector* *deltas, + FT_UInt n_points ); + + + FT_LOCAL( void ) + tt_done_blend( FT_Memory memory, + GX_Blend blend ); + + +FT_END_HEADER + + +#endif /* __TTGXVAR_H__ */ + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/truetype/ttinterp.c b/src/WinLibs/freetype-2.3.5/src/truetype/ttinterp.c new file mode 100644 index 000000000..85c8529ac --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/truetype/ttinterp.c @@ -0,0 +1,7809 @@ +/***************************************************************************/ +/* */ +/* ttinterp.c */ +/* */ +/* TrueType bytecode interpreter (body). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#include +#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 */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* */ + /* TT_Goto_CodeRange */ + /* */ + /* */ + /* Switches to a new code range (updates the code related elements in */ + /* `exec', and `IP'). */ + /* */ + /* */ + /* range :: The new execution code range. */ + /* */ + /* IP :: The new IP in the new code range. */ + /* */ + /* */ + /* exec :: The target execution context. */ + /* */ + /* */ + /* 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; + } + + + /*************************************************************************/ + /* */ + /* */ + /* TT_Set_CodeRange */ + /* */ + /* */ + /* Sets a code range. */ + /* */ + /* */ + /* range :: The code range index. */ + /* */ + /* base :: The new code base. */ + /* */ + /* length :: The range size in bytes. */ + /* */ + /* */ + /* exec :: The target execution context. */ + /* */ + /* */ + /* 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; + } + + + /*************************************************************************/ + /* */ + /* */ + /* TT_Clear_CodeRange */ + /* */ + /* */ + /* Clears a code range. */ + /* */ + /* */ + /* range :: The code range index. */ + /* */ + /* */ + /* exec :: The target execution context. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + /* */ + /* 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 */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* */ + /* TT_Done_Context */ + /* */ + /* */ + /* Destroys a given context. */ + /* */ + /* */ + /* exec :: A handle to the target execution context. */ + /* */ + /* memory :: A handle to the parent memory object. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + /* */ + /* 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; + } + + + /*************************************************************************/ + /* */ + /* */ + /* Init_Context */ + /* */ + /* */ + /* Initializes a context object. */ + /* */ + /* */ + /* memory :: A handle to the parent memory object. */ + /* */ + /* */ + /* exec :: A handle to the target execution context. */ + /* */ + /* */ + /* 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; + } + + + /*************************************************************************/ + /* */ + /* */ + /* Update_Max */ + /* */ + /* */ + /* Checks the size of a buffer and reallocates it if necessary. */ + /* */ + /* */ + /* 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. */ + /* */ + /* */ + /* size :: The address of the buffer's current size expressed */ + /* in elements. */ + /* */ + /* buff :: The address of the buffer base pointer. */ + /* */ + /* */ + /* 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; + } + + + /*************************************************************************/ + /* */ + /* */ + /* TT_Load_Context */ + /* */ + /* */ + /* Prepare an execution context for glyph hinting. */ + /* */ + /* */ + /* face :: A handle to the source face object. */ + /* */ + /* size :: A handle to the source size object. */ + /* */ + /* */ + /* exec :: A handle to the target execution context. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + /* */ + /* 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; + } + + + /*************************************************************************/ + /* */ + /* */ + /* TT_Save_Context */ + /* */ + /* */ + /* Saves the code ranges in a `size' object. */ + /* */ + /* */ + /* exec :: A handle to the source execution context. */ + /* */ + /* */ + /* size :: A handle to the target size object. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + /* */ + /* 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; + } + + + /*************************************************************************/ + /* */ + /* */ + /* TT_Run_Context */ + /* */ + /* */ + /* Executes one or more instructions in the execution context. */ + /* */ + /* */ + /* 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. */ + /* */ + /* */ + /* exec :: A handle to the target execution context. */ + /* */ + /* */ + /* TrueTyoe error code. 0 means success. */ + /* */ + /* */ + /* 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 + } + + + 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, 2, 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 Exit; + + /* initialize it */ + error = Init_Context( exec, memory ); + if ( error ) + goto Fail; + + /* store it into the driver */ + driver->context = exec; + } + + Exit: + return driver->context; + + Fail: + FT_FREE( exec ); + + return 0; + } + + + /*************************************************************************/ + /* */ + /* 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 + + + /*************************************************************************/ + /* */ + /* */ + /* Current_Ratio */ + /* */ + /* */ + /* Returns the current aspect ratio scaling factor depending on the */ + /* projection vector's state and device resolutions. */ + /* */ + /* */ + /* 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() ); + } + + + /*************************************************************************/ + /* */ + /* */ + /* GetShortIns */ + /* */ + /* */ + /* Returns a short integer taken from the instruction stream at */ + /* address IP. */ + /* */ + /* */ + /* Short read at code[IP]. */ + /* */ + /* */ + /* 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] ); + } + + + /*************************************************************************/ + /* */ + /* */ + /* Ins_Goto_CodeRange */ + /* */ + /* */ + /* Goes to a certain code range in the instruction stream. */ + /* */ + /* */ + /* aRange :: The index of the code range. */ + /* */ + /* aIP :: The new IP address in the code range. */ + /* */ + /* */ + /* 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; + } + + + /*************************************************************************/ + /* */ + /* */ + /* Direct_Move */ + /* */ + /* */ + /* Moves a point by a given distance along the freedom vector. The */ + /* point will be `touched'. */ + /* */ + /* */ + /* point :: The index of the point to move. */ + /* */ + /* distance :: The distance to apply. */ + /* */ + /* */ + /* 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; + } + } + + + /*************************************************************************/ + /* */ + /* */ + /* Direct_Move_Orig */ + /* */ + /* */ + /* Moves the *original* position of a point by a given distance along */ + /* the freedom vector. Obviously, the point will not be `touched'. */ + /* */ + /* */ + /* point :: The index of the point to move. */ + /* */ + /* distance :: The distance to apply. */ + /* */ + /* */ + /* 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; + } + + + /*************************************************************************/ + /* */ + /* */ + /* Round_None */ + /* */ + /* */ + /* Does not round, but adds engine compensation. */ + /* */ + /* */ + /* distance :: The distance (not) to round. */ + /* */ + /* compensation :: The engine compensation. */ + /* */ + /* */ + /* The compensated distance. */ + /* */ + /* */ + /* 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; + } + + + /*************************************************************************/ + /* */ + /* */ + /* Round_To_Grid */ + /* */ + /* */ + /* Rounds value to grid after adding engine compensation. */ + /* */ + /* */ + /* distance :: The distance to round. */ + /* */ + /* compensation :: The engine compensation. */ + /* */ + /* */ + /* 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; + } + + + /*************************************************************************/ + /* */ + /* */ + /* Round_To_Half_Grid */ + /* */ + /* */ + /* Rounds value to half grid after adding engine compensation. */ + /* */ + /* */ + /* distance :: The distance to round. */ + /* */ + /* compensation :: The engine compensation. */ + /* */ + /* */ + /* 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; + } + + + /*************************************************************************/ + /* */ + /* */ + /* Round_Down_To_Grid */ + /* */ + /* */ + /* Rounds value down to grid after adding engine compensation. */ + /* */ + /* */ + /* distance :: The distance to round. */ + /* */ + /* compensation :: The engine compensation. */ + /* */ + /* */ + /* 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; + } + + + /*************************************************************************/ + /* */ + /* */ + /* Round_Up_To_Grid */ + /* */ + /* */ + /* Rounds value up to grid after adding engine compensation. */ + /* */ + /* */ + /* distance :: The distance to round. */ + /* */ + /* compensation :: The engine compensation. */ + /* */ + /* */ + /* 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; + } + + + /*************************************************************************/ + /* */ + /* */ + /* Round_To_Double_Grid */ + /* */ + /* */ + /* Rounds value to double grid after adding engine compensation. */ + /* */ + /* */ + /* distance :: The distance to round. */ + /* */ + /* compensation :: The engine compensation. */ + /* */ + /* */ + /* 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; + } + + + /*************************************************************************/ + /* */ + /* */ + /* Round_Super */ + /* */ + /* */ + /* Super-rounds value to grid after adding engine compensation. */ + /* */ + /* */ + /* distance :: The distance to round. */ + /* */ + /* compensation :: The engine compensation. */ + /* */ + /* */ + /* Rounded distance. */ + /* */ + /* */ + /* 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; + } + + + /*************************************************************************/ + /* */ + /* */ + /* Round_Super_45 */ + /* */ + /* */ + /* Super-rounds value to grid after adding engine compensation. */ + /* */ + /* */ + /* distance :: The distance to round. */ + /* */ + /* compensation :: The engine compensation. */ + /* */ + /* */ + /* Rounded distance. */ + /* */ + /* */ + /* 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; + } + + + /*************************************************************************/ + /* */ + /* */ + /* Compute_Round */ + /* */ + /* */ + /* Sets the rounding mode. */ + /* */ + /* */ + /* 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; + } + } + + + /*************************************************************************/ + /* */ + /* */ + /* SetSuperRound */ + /* */ + /* */ + /* Sets Super Round parameters. */ + /* */ + /* */ + /* 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; + } + + + /*************************************************************************/ + /* */ + /* */ + /* Project */ + /* */ + /* */ + /* Computes the projection of vector given by (v2-v1) along the */ + /* current projection vector. */ + /* */ + /* */ + /* v1 :: First input vector. */ + /* v2 :: Second input vector. */ + /* */ + /* */ + /* 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( dx, dy, + CUR.GS.projVector.x, + CUR.GS.projVector.y ); + } + + + /*************************************************************************/ + /* */ + /* */ + /* Dual_Project */ + /* */ + /* */ + /* Computes the projection of the vector given by (v2-v1) along the */ + /* current dual vector. */ + /* */ + /* */ + /* v1 :: First input vector. */ + /* v2 :: Second input vector. */ + /* */ + /* */ + /* The distance in F26dot6 format. */ + /* */ + static FT_F26Dot6 + Dual_Project( EXEC_OP_ FT_Pos dx, + FT_Pos dy ) + { + return TT_DotFix14( dx, dy, + CUR.GS.dualVector.x, + CUR.GS.dualVector.y ); + } + + + /*************************************************************************/ + /* */ + /* */ + /* Project_x */ + /* */ + /* */ + /* Computes the projection of the vector given by (v2-v1) along the */ + /* horizontal axis. */ + /* */ + /* */ + /* v1 :: First input vector. */ + /* v2 :: Second input vector. */ + /* */ + /* */ + /* 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; + } + + + /*************************************************************************/ + /* */ + /* */ + /* Project_y */ + /* */ + /* */ + /* Computes the projection of the vector given by (v2-v1) along the */ + /* vertical axis. */ + /* */ + /* */ + /* v1 :: First input vector. */ + /* v2 :: Second input vector. */ + /* */ + /* */ + /* 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; + } + + + /*************************************************************************/ + /* */ + /* */ + /* Compute_Funcs */ + /* */ + /* */ + /* 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; + } + + + /*************************************************************************/ + /* */ + /* */ + /* Normalize */ + /* */ + /* */ + /* Norms a vector. */ + /* */ + /* */ + /* Vx :: The horizontal input vector coordinate. */ + /* Vy :: The vertical input vector coordinate. */ + /* */ + /* */ + /* R :: The normed unit vector. */ + /* */ + /* */ + /* Returns FAILURE if a vector parameter is zero. */ + /* */ + /* */ + /* 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++; + } + + rec->range = CUR.curRange; + rec->opc = n; + rec->start = CUR.IP + 1; + rec->active = TRUE; + + if ( n > CUR.maxFunc ) + CUR.maxFunc = 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++; + } + + def->opc = args[0]; + def->start = CUR.IP+1; + def->range = CUR.curRange; + def->active = TRUE; + + if ( (FT_ULong)args[0] > CUR.maxIns ) + CUR.maxIns = 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 + D = CUR_Func_dualproj( CUR.zp0.org + L, CUR.zp1.org + K ); + } + + 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; + } + + A *= 64; + +#if 0 + if ( ( args[0] & 0x100 ) != 0 && CUR.metrics.pointSize <= A ) + CUR.GS.scan_control = TRUE; +#endif + + 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 0 + if ( ( args[0] & 0x800 ) != 0 && CUR.metrics.pointSize > A ) + CUR.GS.scan_control = FALSE; +#endif + + 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 ) + { + /* for compatibility with future enhancements, */ + /* we must ignore new modes */ + + if ( args[0] >= 0 && args[0] <= 5 ) + { + if ( args[0] == 3 ) + args[0] = 2; + + CUR.GS.scan_type = (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 ( 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( args[0], 0x4000 ); + dy = 0; + } + else + { + dx = 0; + dy = TT_MulFix14( args[0], 0x4000 ); + } + } + else +#endif + { + dx = TT_MulFix14( args[0], CUR.GS.freeVector.x ); + dy = TT_MulFix14( 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( distance, CUR.GS.freeVector.x ); + CUR.zp0.org[point].y = TT_MulFix14( 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( cvt_dist, CUR.GS.freeVector.x ); + + CUR.zp1.org[point].y = CUR.zp0.org[CUR.GS.rp0].y + + TT_MulFix14( 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 ); + new_dist = ( old_range != 0 ) + ? TT_MULDIV( org_dist, cur_range, old_range ) + : cur_dist; + + 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 + { + 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 ), + 0x10000, 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; + + 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/src/WinLibs/freetype-2.3.5/src/truetype/ttinterp.h b/src/WinLibs/freetype-2.3.5/src/truetype/ttinterp.h new file mode 100644 index 000000000..07a8972cb --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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 +#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 ); + + + /*************************************************************************/ + /* */ + /* */ + /* TT_New_Context */ + /* */ + /* */ + /* 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. */ + /* */ + /* */ + /* face :: A handle to the source face object. */ + /* */ + /* */ + /* A handle to the execution context. Initialized for `face'. */ + /* */ + /* */ + /* 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 ); + + + /*************************************************************************/ + /* */ + /* */ + /* TT_RunIns */ + /* */ + /* */ + /* Executes one or more instruction in the execution context. This */ + /* is the main function of the TrueType opcode interpreter. */ + /* */ + /* */ + /* exec :: A handle to the target execution context. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + /* */ + /* Only the object manager and debugger should call this function. */ + /* */ + /* This function is publicly exported because it is directly */ + /* invoked by the TrueType debugger. */ + /* */ + FT_EXPORT( FT_Error ) + TT_RunIns( TT_ExecContext exec ); + + +FT_END_HEADER + +#endif /* __TTINTERP_H__ */ + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/truetype/ttobjs.c b/src/WinLibs/freetype-2.3.5/src/truetype/ttobjs.c new file mode 100644 index 000000000..0294a1b7e --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/truetype/ttobjs.c @@ -0,0 +1,937 @@ +/***************************************************************************/ +/* */ +/* ttobjs.c */ +/* */ +/* Objects manager (body). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#include +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_CALC_H +#include FT_INTERNAL_STREAM_H +#include FT_TRUETYPE_IDS_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 */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* */ + /* tt_glyphzone_done */ + /* */ + /* */ + /* Deallocate a glyph zone. */ + /* */ + /* */ + /* 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; + } + } + + + /*************************************************************************/ + /* */ + /* */ + /* tt_glyphzone_new */ + /* */ + /* */ + /* Allocate a new glyph zone. */ + /* */ + /* */ + /* memory :: A handle to the current memory object. */ + /* */ + /* maxPoints :: The capacity of glyph zone in points. */ + /* */ + /* maxContours :: The capacity of glyph zone in contours. */ + /* */ + /* */ + /* zone :: A pointer to the target glyph zone record. */ + /* */ + /* */ + /* 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 */ + + + /*************************************************************************/ + /* */ + /* */ + /* tt_face_init */ + /* */ + /* */ + /* Initialize a given TrueType face object. */ + /* */ + /* */ + /* 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. */ + /* */ + /* */ + /* face :: The newly built face object. */ + /* */ + /* */ + /* 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 = face->root.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 + face->root.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; + + error = tt_face_load_hdmx( face, stream ); + if ( error ) + goto Exit; + + if ( face->root.face_flags & FT_FACE_FLAG_SCALABLE ) + { + +#ifdef FT_CONFIG_OPTION_INCREMENTAL + + if ( !face->root.internal->incremental_interface ) + error = tt_face_load_loca( face, stream ); + if ( !error ) + error = tt_face_load_cvt( face, stream ) || + tt_face_load_fpgm( face, stream ) || + tt_face_load_prep( face, stream ); + +#else + + if ( !error ) + error = tt_face_load_loca( face, stream ) || + tt_face_load_cvt( face, stream ) || + tt_face_load_fpgm( face, stream ) || + 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; + + /* Compare the face with a list of well-known `tricky' fonts. */ + /* This list shall be expanded as we find more of them. */ + if ( !unpatented_hinting ) + { + static const char* const trick_names[] = + { + "DFKaiSho-SB", /* dfkaisb.ttf */ + "DFKai-SB", /* kaiu.ttf */ + "HuaTianSongTi?", /* htst3.ttf */ + "MingLiU", /* mingliu.ttf & mingliu.ttc */ + "PMingLiU", /* mingliu.ttc */ + "MingLi43", /* mingli.ttf */ + NULL + }; + int nn; + + + /* 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; trick_names[nn] != NULL; nn++ ) + { + if ( ttface->family_name && + ft_strstr( ttface->family_name, trick_names[nn] ) ) + { + unpatented_hinting = 1; + break; + } + } + } + + ttface->internal->ignore_unpatented_hinter = + FT_BOOL( !unpatented_hinting ); + } + +#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; + } + + + /*************************************************************************/ + /* */ + /* */ + /* tt_face_done */ + /* */ + /* */ + /* Finalize a given face object. */ + /* */ + /* */ + /* 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 = face->root.memory; + FT_Stream stream = face->root.stream; + + SFNT_Service 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 + + /*************************************************************************/ + /* */ + /* */ + /* tt_size_run_fpgm */ + /* */ + /* */ + /* Run the font program. */ + /* */ + /* */ + /* size :: A handle to the size object. */ + /* */ + /* */ + /* 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; + } + + + /*************************************************************************/ + /* */ + /* */ + /* tt_size_run_prep */ + /* */ + /* */ + /* Run the control value program. */ + /* */ + /* */ + /* size :: A handle to the size object. */ + /* */ + /* */ + /* 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 */ + { + FT_Size_Metrics* metrics = &size->metrics; + TT_Size_Metrics* metrics2 = &size->ttmetrics; + + metrics->x_ppem = 0; + metrics->y_ppem = 0; + + metrics2->rotated = FALSE; + metrics2->stretched = FALSE; + + /* set default compensation (all 0) */ + for ( i = 0; i < 4; i++ ) + metrics2->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 */ + + + /*************************************************************************/ + /* */ + /* */ + /* tt_size_init */ + /* */ + /* */ + /* Initialize a new TrueType size object. */ + /* */ + /* */ + /* size :: A handle to the size object. */ + /* */ + /* */ + /* 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; + } + + + /*************************************************************************/ + /* */ + /* */ + /* tt_size_done */ + /* */ + /* */ + /* The TrueType size object finalizer. */ + /* */ + /* */ + /* 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; + } + + + /*************************************************************************/ + /* */ + /* */ + /* tt_size_reset */ + /* */ + /* */ + /* Reset a TrueType size when resolutions and character dimensions */ + /* have been changed. */ + /* */ + /* */ + /* 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; + } + + + /*************************************************************************/ + /* */ + /* */ + /* tt_driver_init */ + /* */ + /* */ + /* Initialize a given TrueType driver object. */ + /* */ + /* */ + /* driver :: A handle to the target driver object. */ + /* */ + /* */ + /* 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; + } + + + /*************************************************************************/ + /* */ + /* */ + /* tt_driver_done */ + /* */ + /* */ + /* Finalize a given TrueType driver. */ + /* */ + /* */ + /* 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 + + } + + + /*************************************************************************/ + /* */ + /* */ + /* tt_slot_init */ + /* */ + /* */ + /* Initialize a new slot object. */ + /* */ + /* */ + /* slot :: A handle to the slot object. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + tt_slot_init( FT_GlyphSlot slot ) + { + return FT_GlyphLoader_CreateExtra( slot->internal->loader ); + } + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/truetype/ttobjs.h b/src/WinLibs/freetype-2.3.5/src/truetype/ttobjs.h new file mode 100644 index 000000000..6971013af --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/truetype/ttobjs.h @@ -0,0 +1,459 @@ +/***************************************************************************/ +/* */ +/* ttobjs.h */ +/* */ +/* Objects manager (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 __TTOBJS_H__ +#define __TTOBJS_H__ + + +#include +#include FT_INTERNAL_OBJECTS_H +#include FT_INTERNAL_TRUETYPE_TYPES_H + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* */ + /* TT_Driver */ + /* */ + /* */ + /* A handle to a TrueType driver object. */ + /* */ + typedef struct TT_DriverRec_* TT_Driver; + + + /*************************************************************************/ + /* */ + /* */ + /* TT_Instance */ + /* */ + /* */ + /* A handle to a TrueType size object. */ + /* */ + typedef struct TT_SizeRec_* TT_Size; + + + /*************************************************************************/ + /* */ + /* */ + /* TT_GlyphSlot */ + /* */ + /* */ + /* A handle to a TrueType glyph slot object. */ + /* */ + /* */ + /* This is a direct typedef of FT_GlyphSlot, as there is nothing */ + /* specific about the TrueType glyph slot. */ + /* */ + typedef FT_GlyphSlot TT_GlyphSlot; + + + /*************************************************************************/ + /* */ + /* */ + /* TT_GraphicsState */ + /* */ + /* */ + /* 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; + 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; + + + /*************************************************************************/ + /* */ + /* Subglyph loading record. Used to load composite components. */ + /* */ + typedef struct TT_SubglyphRec_ + { + FT_Long index; /* subglyph index; initialized with -1 */ + FT_Bool is_scaled; /* is the subglyph scaled? */ + FT_Bool is_hinted; /* should it be hinted? */ + FT_Bool preserve_pps; /* preserve phantom points? */ + + FT_Long file_offset; + + FT_BBox bbox; + FT_Pos left_bearing; + FT_Pos advance; + + TT_GlyphZoneRec zone; + + FT_Long arg1; /* first argument */ + FT_Long arg2; /* second argument */ + + FT_UShort element_flag; /* current load element flag */ + + TT_Transform transform; /* transformation matrix */ + + FT_Vector pp1, pp2; /* phantom points (horizontal) */ + FT_Vector pp3, pp4; /* phantom points (vertical) */ + + } TT_SubGlyphRec, *TT_SubGlyph_Stack; + + + /*************************************************************************/ + /* */ + /* 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 TIns_Metrics */ + /* record). */ + /* */ + /* The CVT is a one-dimensional array containing values that control */ + /* certain important characteristics in a font, like the height of all */ + /* capitals, all lowercase letter, default spacing or stem width/height. */ + /* */ + /* These values are found in FUnits in the font file, and must be scaled */ + /* to pixel coordinates before being used by the CVT and glyph programs. */ + /* Unfortunately, when using distinct x and y resolutions (or distinct x */ + /* and y pointsizes), there are two possible scalings. */ + /* */ + /* A first try was to implement a `lazy' scheme where all values were */ + /* scaled when first used. However, while some values are always used */ + /* in the same direction, 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/src/WinLibs/freetype-2.3.5/src/truetype/ttpload.c b/src/WinLibs/freetype-2.3.5/src/truetype/ttpload.c new file mode 100644 index 000000000..9d3381bf0 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/truetype/ttpload.c @@ -0,0 +1,523 @@ +/***************************************************************************/ +/* */ +/* ttpload.c */ +/* */ +/* TrueType-specific tables loader (body). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#include +#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 + + + /*************************************************************************/ + /* */ + /* */ + /* tt_face_load_loca */ + /* */ + /* */ + /* Load the locations table. */ + /* */ + /* */ + /* face :: A handle to the target face object. */ + /* */ + /* */ + /* stream :: The input stream. */ + /* */ + /* */ + /* 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; + + + /* we need the size of the `glyf' table for malformed `loca' tables */ + error = face->goto_table( face, TTAG_glyf, stream, &face->glyf_len ); + 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 ) + { + if ( table_len >= 0x40000L ) + { + FT_TRACE2(( "table too large!\n" )); + error = TT_Err_Invalid_Table; + goto Exit; + } + face->num_locations = (FT_UInt)( table_len >> 2 ); + } + else + { + if ( table_len >= 0x20000L ) + { + FT_TRACE2(( "table too large!\n" )); + error = TT_Err_Invalid_Table; + goto Exit; + } + face->num_locations = (FT_UInt)( table_len >> 1 ); + } + + /* + * 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; + } + } + + /* It isn't mentioned explicitly that the `loca' table must be */ + /* ordered, but implicitly it refers to the length of an entry */ + /* as the difference between the current and the next position. */ + /* Anyway, there do exist (malformed) fonts which don't obey */ + /* this rule, so we are only able to provide an upper bound for */ + /* the size. */ + 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; + } + + + + /*************************************************************************/ + /* */ + /* */ + /* tt_face_load_cvt */ + /* */ + /* */ + /* Load the control value table into a face object. */ + /* */ + /* */ + /* face :: A handle to the target face object. */ + /* */ + /* */ + /* stream :: A handle to the input stream. */ + /* */ + /* */ + /* 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 + } + + + /*************************************************************************/ + /* */ + /* */ + /* tt_face_load_fpgm */ + /* */ + /* */ + /* Load the font program. */ + /* */ + /* */ + /* face :: A handle to the target face object. */ + /* */ + /* */ + /* stream :: A handle to the input stream. */ + /* */ + /* */ + /* 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 + } + + + /*************************************************************************/ + /* */ + /* */ + /* tt_face_load_prep */ + /* */ + /* */ + /* Load the cvt program. */ + /* */ + /* */ + /* face :: A handle to the target face object. */ + /* */ + /* */ + /* stream :: A handle to the input stream. */ + /* */ + /* */ + /* 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 + } + + + /*************************************************************************/ + /* */ + /* */ + /* tt_face_load_hdmx */ + /* */ + /* */ + /* Load the `hdmx' table into the face object. */ + /* */ + /* */ + /* face :: A handle to the target face object. */ + /* */ + /* stream :: A handle to the input stream. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + + FT_LOCAL_DEF( FT_Error ) + tt_face_load_hdmx( TT_Face face, + FT_Stream stream ) + { + FT_Error error; + FT_Memory memory = stream->memory; + FT_UInt version, nn, num_records; + FT_ULong table_size, record_size; + FT_Byte* p; + FT_Byte* limit; + + + /* this table is optional */ + error = face->goto_table( face, TTAG_hdmx, stream, &table_size ); + if ( error || table_size < 8 ) + return TT_Err_Ok; + + if ( FT_FRAME_EXTRACT( table_size, face->hdmx_table ) ) + goto Exit; + + p = face->hdmx_table; + limit = p + table_size; + + version = FT_NEXT_USHORT( p ); + num_records = FT_NEXT_USHORT( p ); + record_size = FT_NEXT_ULONG( p ); + + /* The maximum number of bytes in an hdmx device record is the */ + /* maximum number of glyphs + 2; this is 0xFFFF + 2; this is */ + /* the reason why `record_size' is a long (which we read as */ + /* unsigned long for convenience). In practice, two bytes */ + /* sufficient to hold the size value. */ + /* */ + /* There are at least two fonts, HANNOM-A and HANNOM-B version */ + /* 2.0 (2005), which get this wrong: The upper two bytes of */ + /* the size value are set to 0xFF instead of 0x00. We catch */ + /* and fix this. */ + + if ( record_size >= 0xFFFF0000UL ) + record_size &= 0xFFFFU; + + /* The limit for `num_records' is a heuristic value. */ + + if ( version != 0 || num_records > 255 || record_size > 0x10001L ) + { + error = TT_Err_Invalid_File_Format; + goto Fail; + } + + if ( FT_NEW_ARRAY( face->hdmx_record_sizes, num_records ) ) + goto Fail; + + for ( nn = 0; nn < num_records; nn++ ) + { + if ( p + record_size > limit ) + break; + + face->hdmx_record_sizes[nn] = p[0]; + p += record_size; + } + + face->hdmx_record_count = nn; + face->hdmx_table_size = table_size; + face->hdmx_record_size = record_size; + + Exit: + return error; + + Fail: + FT_FRAME_RELEASE( face->hdmx_table ); + face->hdmx_table_size = 0; + goto Exit; + } + + + FT_LOCAL_DEF( void ) + tt_face_free_hdmx( TT_Face face ) + { + FT_Stream stream = face->root.stream; + FT_Memory memory = stream->memory; + + + FT_FREE( face->hdmx_record_sizes ); + FT_FRAME_RELEASE( face->hdmx_table ); + } + + + /*************************************************************************/ + /* */ + /* Return the advance width table for a given pixel size if it is found */ + /* in the font's `hdmx' table (if any). */ + /* */ + FT_LOCAL_DEF( FT_Byte* ) + tt_face_get_device_metrics( TT_Face face, + FT_UInt ppem, + FT_UInt gindex ) + { + FT_UInt nn; + FT_Byte* result = NULL; + FT_ULong record_size = face->hdmx_record_size; + FT_Byte* record = face->hdmx_table + 8; + + + for ( nn = 0; nn < face->hdmx_record_count; nn++ ) + if ( face->hdmx_record_sizes[nn] == ppem ) + { + gindex += 2; + if ( gindex < record_size ) + result = record + nn * record_size + gindex; + break; + } + + return result; + } + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/truetype/ttpload.h b/src/WinLibs/freetype-2.3.5/src/truetype/ttpload.h new file mode 100644 index 000000000..f61ac079c --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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 +#include FT_INTERNAL_TRUETYPE_TYPES_H + + +FT_BEGIN_HEADER + + + FT_LOCAL( FT_Error ) + tt_face_load_loca( TT_Face face, + FT_Stream stream ); + + FT_LOCAL( FT_ULong ) + tt_face_get_location( TT_Face face, + FT_UInt gindex, + FT_UInt *asize ); + + FT_LOCAL( void ) + tt_face_done_loca( TT_Face face ); + + FT_LOCAL( FT_Error ) + tt_face_load_cvt( TT_Face face, + FT_Stream stream ); + + FT_LOCAL( FT_Error ) + tt_face_load_fpgm( TT_Face face, + FT_Stream stream ); + + + FT_LOCAL( FT_Error ) + tt_face_load_prep( TT_Face face, + FT_Stream stream ); + + + FT_LOCAL( FT_Error ) + tt_face_load_hdmx( TT_Face face, + FT_Stream stream ); + + + FT_LOCAL( void ) + tt_face_free_hdmx( TT_Face face ); + + + FT_LOCAL( FT_Byte* ) + tt_face_get_device_metrics( TT_Face face, + FT_UInt ppem, + FT_UInt gindex ); + +FT_END_HEADER + +#endif /* __TTPLOAD_H__ */ + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/type1/Jamfile b/src/WinLibs/freetype-2.3.5/src/type1/Jamfile new file mode 100644 index 000000000..8e366baae --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/src/type1/module.mk b/src/WinLibs/freetype-2.3.5/src/type1/module.mk new file mode 100644 index 000000000..baf98c00e --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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)t1_driver_class$(CLOSE_DRIVER) +$(ECHO_DRIVER)type1 $(ECHO_DRIVER_DESC)Postscript font files with extension *.pfa or *.pfb$(ECHO_DRIVER_DONE) +endef + +# EOF diff --git a/src/WinLibs/freetype-2.3.5/src/type1/rules.mk b/src/WinLibs/freetype-2.3.5/src/type1/rules.mk new file mode 100644 index 000000000..15087b030 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/src/type1/t1afm.c b/src/WinLibs/freetype-2.3.5/src/type1/t1afm.c new file mode 100644 index 000000000..b81a8df83 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/type1/t1afm.c @@ -0,0 +1,385 @@ +/***************************************************************************/ +/* */ +/* t1afm.c */ +/* */ +/* AFM support for Type 1 fonts (body). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#include +#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_UInt len, + void* user_data ) + { + T1_Font type1 = (T1_Font)user_data; + FT_Int n; + + + 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 ); + + + return (int)( index1 - index2 ); + } + + + /* 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; + t1_face->bbox.xMax = ( fi->FontBBox.xMax + 0xFFFFU ) >> 16; + t1_face->bbox.yMax = ( fi->FontBBox.yMax + 0xFFFFU ) >> 16; + + t1_face->ascender = (FT_Short)( ( fi->Ascender + 0x8000U ) >> 16 ); + t1_face->descender = (FT_Short)( ( fi->Descender + 0x8000U ) >> 16 ); + + if ( fi->NumKernPair ) + { + t1_face->face_flags |= FT_FACE_FLAG_KERNING; + ( (T1_Face)t1_face )->afm_data = fi; + fi = NULL; + } + } + + FT_FRAME_EXIT(); + + Exit: + if ( fi != NULL ) + T1_Done_Metrics( memory, fi ); + + return error; + } + + + /* find the kerning for a given glyph pair */ + FT_LOCAL_DEF( void ) + T1_Get_Kerning( AFM_FontInfo fi, + FT_UInt glyph1, + FT_UInt glyph2, + FT_Vector* kerning ) + { + AFM_KernPair min, mid, max; + FT_ULong idx = KERN_INDEX( glyph1, glyph2 ); + + + /* simple binary search */ + min = fi->KernPairs; + max = min + fi->NumKernPair - 1; + + while ( min <= max ) + { + FT_ULong midi; + + + mid = min + ( max - min ) / 2; + midi = KERN_INDEX( mid->index1, mid->index2 ); + + if ( midi == idx ) + { + kerning->x = mid->x; + kerning->y = mid->y; + + return; + } + + if ( midi < idx ) + min = mid + 1; + else + max = mid - 1; + } + + kerning->x = 0; + kerning->y = 0; + } + + + FT_LOCAL_DEF( FT_Error ) + T1_Get_Track_Kerning( FT_Face face, + FT_Fixed ptsize, + FT_Int degree, + FT_Fixed* kerning ) + { + AFM_FontInfo fi = (AFM_FontInfo)( (T1_Face)face )->afm_data; + FT_Int i; + + + if ( !fi ) + return T1_Err_Invalid_Argument; + + for ( i = 0; i < fi->NumTrackKern; i++ ) + { + AFM_TrackKern tk = fi->TrackKerns + i; + + + if ( tk->degree != degree ) + continue; + + if ( ptsize < tk->min_ptsize ) + *kerning = tk->min_kern; + else if ( ptsize > tk->max_ptsize ) + *kerning = tk->max_kern; + else + { + *kerning = FT_MulDiv( ptsize - tk->min_ptsize, + tk->max_kern - tk->min_kern, + tk->max_ptsize - tk->min_ptsize ) + + tk->min_kern; + } + } + + return T1_Err_Ok; + } + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/type1/t1afm.h b/src/WinLibs/freetype-2.3.5/src/type1/t1afm.h new file mode 100644 index 000000000..8eb1764de --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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 +#include "t1objs.h" +#include FT_INTERNAL_TYPE1_TYPES_H + +FT_BEGIN_HEADER + + + FT_LOCAL( FT_Error ) + T1_Read_Metrics( FT_Face face, + FT_Stream stream ); + + FT_LOCAL( void ) + T1_Done_Metrics( FT_Memory memory, + AFM_FontInfo fi ); + + FT_LOCAL( void ) + T1_Get_Kerning( AFM_FontInfo fi, + FT_UInt glyph1, + FT_UInt glyph2, + FT_Vector* kerning ); + + FT_LOCAL( FT_Error ) + T1_Get_Track_Kerning( FT_Face face, + FT_Fixed ptsize, + FT_Int degree, + FT_Fixed* kerning ); + +FT_END_HEADER + +#endif /* __T1AFM_H__ */ + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/type1/t1driver.c b/src/WinLibs/freetype-2.3.5/src/type1/t1driver.c new file mode 100644 index 000000000..3ca21dc17 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/type1/t1driver.c @@ -0,0 +1,313 @@ +/***************************************************************************/ +/* */ +/* t1driver.c */ +/* */ +/* Type 1 driver interface (body). */ +/* */ +/* Copyright 1996-2001, 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. */ +/* */ +/***************************************************************************/ + + +#include +#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 0; + } + + + 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 0; + } + + + static const FT_Service_PsInfoRec t1_service_ps_info = + { + (PS_GetFontInfoFunc) t1_ps_get_font_info, + (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 + + /*************************************************************************/ + /* */ + /* */ + /* Get_Kerning */ + /* */ + /* */ + /* A driver method used to return the kerning vector between two */ + /* glyphs of the same face. */ + /* */ + /* */ + /* 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. */ + /* */ + /* */ + /* kerning :: The kerning vector. This is in font units for */ + /* scalable formats, and in pixels for fixed-sizes */ + /* formats. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + /* */ + /* 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) 0, + (FT_Size_RequestFunc) T1_Size_Request, + (FT_Size_SelectFunc) 0 + }; + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/type1/t1driver.h b/src/WinLibs/freetype-2.3.5/src/type1/t1driver.h new file mode 100644 index 000000000..ad429440d --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/type1/t1driver.h @@ -0,0 +1,38 @@ +/***************************************************************************/ +/* */ +/* 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 +#include FT_INTERNAL_DRIVER_H + + +FT_BEGIN_HEADER + + + FT_EXPORT_VAR( const FT_Driver_ClassRec ) t1_driver_class; + + +FT_END_HEADER + +#endif /* __T1DRIVER_H__ */ + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/type1/t1errors.h b/src/WinLibs/freetype-2.3.5/src/type1/t1errors.h new file mode 100644 index 000000000..81221c343 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/src/type1/t1gload.c b/src/WinLibs/freetype-2.3.5/src/type1/t1gload.c new file mode 100644 index 000000000..e08a42897 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/type1/t1gload.c @@ -0,0 +1,422 @@ +/***************************************************************************/ +/* */ +/* t1gload.c */ +/* */ +/* Type 1 Glyph Loader (body). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#include +#include "t1gload.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; + + + 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 ( face->root.internal->incremental_interface ) + error = face->root.internal->incremental_interface->funcs->get_glyph_data( + face->root.internal->incremental_interface->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 && 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 = decoder->builder.left_bearing.y; + metrics.advance = decoder->builder.advance.x; + 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.left_bearing.y = metrics.bearing_y; + decoder->builder.advance.x = metrics.advance; + decoder->builder.advance.y = 0; + } + +#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_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 + + + if ( glyph_index >= (FT_UInt)face->root.num_glyphs ) + { + 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; + + glyph->x_scale = size->root.metrics.x_scale; + glyph->y_scale = size->root.metrics.y_scale; + + 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 = decoder.builder.left_bearing.x; + glyph->root.metrics.horiAdvance = 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 = decoder.builder.advance.x; + glyph->root.linearHoriAdvance = decoder.builder.advance.x; + glyph->root.internal->glyph_transformed = 0; + + /* make up vertical ones */ + metrics->vertAdvance = ( face->type1.font_bbox.yMax - + face->type1.font_bbox.yMin ) >> 16; + glyph->root.linearVertAdvance = metrics->vertAdvance; + + 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; + + /* 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/src/WinLibs/freetype-2.3.5/src/type1/t1gload.h b/src/WinLibs/freetype-2.3.5/src/type1/t1gload.h new file mode 100644 index 000000000..de87896dc --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/type1/t1gload.h @@ -0,0 +1,46 @@ +/***************************************************************************/ +/* */ +/* t1gload.h */ +/* */ +/* Type 1 Glyph Loader (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 __T1GLOAD_H__ +#define __T1GLOAD_H__ + + +#include +#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_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/src/WinLibs/freetype-2.3.5/src/type1/t1load.c b/src/WinLibs/freetype-2.3.5/src/type1/t1load.c new file mode 100644 index 000000000..55177eed4 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/type1/t1load.c @@ -0,0 +1,2221 @@ +/***************************************************************************/ +/* */ +/* t1load.c */ +/* */ +/* Type 1 font loader (body). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* 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 ... */ + /* */ + /* where 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 +#include FT_INTERNAL_DEBUG_H +#include FT_CONFIG_CONFIG_H +#include FT_MULTIPLE_MASTERS_H +#include FT_INTERNAL_TYPE1_TYPES_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; + } + + +#define FT_INT_TO_FIXED( a ) ( (a) << 16 ) +#define FT_FIXED_TO_INT( a ) ( FT_RoundFix( a ) >> 16 ) + + + /*************************************************************************/ + /* */ + /* 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 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 axismap->design_points[j - 1] + + FT_MulDiv( t, + axismap->design_points[j] - + axismap->design_points[j - 1], + 1L ); + } + } + + return 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 = FT_INT_TO_FIXED( mmaster.axis[i].minimum); + mmvar->axis[i].maximum = FT_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 = 0xFFFFFFFFUL; /* Does not apply */ + mmvar->axis[i].tag = 0xFFFFFFFFUL; /* 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 = + FT_INT_TO_FIXED( 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] = FT_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:" )); + FT_ERROR(( " 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_DESIGNS]; + 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 ) + { + 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:" )); + FT_ERROR(( " 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" )); + FT_ERROR(( " " + " 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_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 + { + 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 n, 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 ( n = 0; n < num_subrs; n++ ) + { + FT_Long idx, size; + FT_Byte* base; + + + /* If the next token isn't `dup', we are also done. This */ + /* happens when there are `holes' in the Subrs array. */ + 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; + + + 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++; + } + } + + if ( loader->num_glyphs ) + return; + else + loader->num_glyphs = n; + + /* if /.notdef is found but does not occupy index 0, do our magic. */ + if ( ft_strcmp( (const char*)".notdef", + (const char*)name_table->elements[0] ) && + notdef_found ) + { + /* 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 = n + 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 = +32000; + max_char = -32000; + + 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; + } + break; + } + } + } + + /* + * Yes, this happens: Certain PDF-embedded fonts have only a + * `.notdef' glyph defined! + */ + + if ( min_char > max_char ) + { + min_char = 0; + max_char = loader.encoding_table.max_elems; + } + + type1->encoding.code_first = min_char; + type1->encoding.code_last = max_char; + type1->encoding.num_chars = loader.num_chars; + } + + Exit: + t1_done_loader( &loader ); + return error; + } + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/type1/t1load.h b/src/WinLibs/freetype-2.3.5/src/type1/t1load.h new file mode 100644 index 000000000..546fc3353 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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 +#include FT_INTERNAL_STREAM_H +#include FT_INTERNAL_POSTSCRIPT_AUX_H +#include FT_MULTIPLE_MASTERS_H + +#include "t1parse.h" + + +FT_BEGIN_HEADER + + + typedef struct T1_Loader_ + { + T1_ParserRec parser; /* parser used to read the stream */ + + FT_Int num_chars; /* number of characters in encoding */ + PS_TableRec encoding_table; /* PS_Table used to store the */ + /* encoding character names */ + + FT_Int num_glyphs; + PS_TableRec glyph_names; + PS_TableRec charstrings; + PS_TableRec swap_table; /* For moving .notdef glyph to index 0. */ + + FT_Int num_subrs; + PS_TableRec subrs; + FT_Bool fontdata; + + FT_UInt keywords_encountered; /* T1_LOADER_ENCOUNTERED_XXX */ + + } T1_LoaderRec, *T1_Loader; + + + /* treatment of some keywords differs depending on whether */ + /* they precede or follow certain other keywords */ + +#define T1_PRIVATE ( 1 << 0 ) +#define T1_FONTDIR_AFTER_PRIVATE ( 1 << 1 ) + + + FT_LOCAL( FT_Error ) + T1_Open_Face( T1_Face face ); + +#ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT + + FT_LOCAL( FT_Error ) + T1_Get_Multi_Master( T1_Face face, + FT_Multi_Master* master ); + + FT_LOCAL_DEF( FT_Error ) + T1_Get_MM_Var( T1_Face face, + FT_MM_Var* *master ); + + FT_LOCAL( FT_Error ) + T1_Set_MM_Blend( T1_Face face, + FT_UInt num_coords, + FT_Fixed* coords ); + + FT_LOCAL( FT_Error ) + T1_Set_MM_Design( T1_Face face, + FT_UInt num_coords, + FT_Long* coords ); + + FT_LOCAL_DEF( FT_Error ) + T1_Set_Var_Design( T1_Face face, + FT_UInt num_coords, + FT_Fixed* coords ); + + FT_LOCAL( void ) + T1_Done_Blend( T1_Face face ); + +#endif /* !T1_CONFIG_OPTION_NO_MM_SUPPORT */ + + +FT_END_HEADER + +#endif /* __T1LOAD_H__ */ + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/type1/t1objs.c b/src/WinLibs/freetype-2.3.5/src/type1/t1objs.c new file mode 100644 index 000000000..3d08336c6 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/type1/t1objs.c @@ -0,0 +1,566 @@ +/***************************************************************************/ +/* */ +/* t1objs.c */ +/* */ +/* Type 1 objects manager (body). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#include +#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 = 0; + 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 */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* */ + /* T1_Face_Done */ + /* */ + /* */ + /* The face object destructor. */ + /* */ + /* */ + /* face :: A typeless pointer to the face object to destroy. */ + /* */ + FT_LOCAL_DEF( void ) + T1_Face_Done( T1_Face face ) + { + if ( face ) + { + FT_Memory memory = face->root.memory; + T1_Font 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 = 0; + face->root.style_name = 0; + } + } + + + /*************************************************************************/ + /* */ + /* */ + /* T1_Face_Init */ + /* */ + /* */ + /* The face object constructor. */ + /* */ + /* */ + /* 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. */ + /* */ + /* */ + /* face :: The face record to build. */ + /* */ + /* */ + /* 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( face_index ); + 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 = face_index; + + 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 */ + + /* 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; + } + + /* 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; + root->bbox.xMax = ( type1->font_bbox.xMax + 0xFFFFU ) >> 16; + root->bbox.yMax = ( type1->font_bbox.yMax + 0xFFFFU ) >> 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)max_advance; + else + error = 0; /* 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 synthetize 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; + } + + + /*************************************************************************/ + /* */ + /* */ + /* T1_Driver_Init */ + /* */ + /* */ + /* Initializes a given Type 1 driver object. */ + /* */ + /* */ + /* driver :: A handle to the target driver object. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + T1_Driver_Init( T1_Driver driver ) + { + FT_UNUSED( driver ); + + return T1_Err_Ok; + } + + + /*************************************************************************/ + /* */ + /* */ + /* T1_Driver_Done */ + /* */ + /* */ + /* Finalizes a given Type 1 driver. */ + /* */ + /* */ + /* 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/src/WinLibs/freetype-2.3.5/src/type1/t1objs.h b/src/WinLibs/freetype-2.3.5/src/type1/t1objs.h new file mode 100644 index 000000000..e5e90293d --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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 +#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; + + + /*************************************************************************/ + /* */ + /* */ + /* T1_Driver */ + /* */ + /* */ + /* A handle to a Type 1 driver object. */ + /* */ + typedef struct T1_DriverRec_ *T1_Driver; + + + /*************************************************************************/ + /* */ + /* */ + /* T1_Size */ + /* */ + /* */ + /* A handle to a Type 1 size object. */ + /* */ + typedef struct T1_SizeRec_* T1_Size; + + + /*************************************************************************/ + /* */ + /* */ + /* T1_GlyphSlot */ + /* */ + /* */ + /* A handle to a Type 1 glyph slot object. */ + /* */ + typedef struct T1_GlyphSlotRec_* T1_GlyphSlot; + + + /*************************************************************************/ + /* */ + /* */ + /* T1_CharMap */ + /* */ + /* */ + /* A handle to a Type 1 character mapping object. */ + /* */ + /* */ + /* 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 */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* */ + /* T1_SizeRec */ + /* */ + /* */ + /* 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 ); + + + /*************************************************************************/ + /* */ + /* */ + /* T1_GlyphSlotRec */ + /* */ + /* */ + /* 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/src/WinLibs/freetype-2.3.5/src/type1/t1parse.c b/src/WinLibs/freetype-2.3.5/src/type1/t1parse.c new file mode 100644 index 000000000..1b252c748 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/type1/t1parse.c @@ -0,0 +1,479 @@ +/***************************************************************************/ +/* */ +/* t1parse.c */ +/* */ +/* Type 1 parser (body). */ +/* */ +/* Copyright 1996-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. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* 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 +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_CALC_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 *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + static FT_Error + read_pfb_tag( FT_Stream stream, + FT_UShort *atag, + FT_Long *asize ) + { + FT_Error error; + FT_UShort tag; + FT_Long size; + + + *atag = 0; + *asize = 0; + + if ( !FT_READ_USHORT( tag ) ) + { + if ( tag == 0x8001U || tag == 0x8002U ) + { + if ( !FT_READ_LONG_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_Long size; + + + if ( FT_STREAM_SEEK( 0 ) ) + goto Exit; + + error = read_pfb_tag( stream, &tag, &size ); + if ( error ) + goto Exit; + + if ( tag != 0x8001U && FT_STREAM_SEEK( 0 ) ) + goto Exit; + + if ( !FT_FRAME_ENTER( header_length ) ) + { + error = 0; + + 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_Long 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_Long 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:" )); + FT_ERROR(( " 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:" )); + FT_ERROR(( " 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; + if ( *cur == '\r' ) + { + cur++; + if ( *cur == '\n' ) + cur++; + } + else if ( *cur == '\n' ) + cur++; + else + { + FT_ERROR(( "T1_Get_Private_Dict:" )); + FT_ERROR(( " `eexec' not properly terminated\n" )); + error = T1_Err_Invalid_File_Format; + goto Exit; + } + + size = (FT_Long)( 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/src/WinLibs/freetype-2.3.5/src/type1/t1parse.h b/src/WinLibs/freetype-2.3.5/src/type1/t1parse.h new file mode 100644 index 000000000..6fa4ca624 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/type1/t1parse.h @@ -0,0 +1,135 @@ +/***************************************************************************/ +/* */ +/* t1parse.h */ +/* */ +/* Type 1 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 __T1PARSE_H__ +#define __T1PARSE_H__ + + +#include +#include FT_INTERNAL_TYPE1_TYPES_H +#include FT_INTERNAL_STREAM_H + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* */ + /* T1_ParserRec */ + /* */ + /* */ + /* A PS_ParserRec is an object used to parse a Type 1 fonts very */ + /* quickly. */ + /* */ + /* */ + /* 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_Long base_len; + + FT_Byte* private_dict; + FT_Long private_len; + + FT_Bool in_pfb; + FT_Bool in_memory; + FT_Bool single_block; + + } T1_ParserRec, *T1_Parser; + + +#define T1_Add_Table( p, i, o, l ) (p)->funcs.add( (p), i, o, l ) +#define T1_Done_Table( p ) \ + do \ + { \ + if ( (p)->funcs.done ) \ + (p)->funcs.done( p ); \ + } while ( 0 ) +#define T1_Release_Table( p ) \ + do \ + { \ + if ( (p)->funcs.release ) \ + (p)->funcs.release( p ); \ + } while ( 0 ) + + +#define T1_Skip_Spaces( p ) (p)->root.funcs.skip_spaces( &(p)->root ) +#define T1_Skip_PS_Token( p ) (p)->root.funcs.skip_PS_token( &(p)->root ) + +#define T1_ToInt( p ) (p)->root.funcs.to_int( &(p)->root ) +#define T1_ToFixed( p, t ) (p)->root.funcs.to_fixed( &(p)->root, t ) + +#define T1_ToCoordArray( p, m, c ) \ + (p)->root.funcs.to_coord_array( &(p)->root, m, c ) +#define T1_ToFixedArray( p, m, f, t ) \ + (p)->root.funcs.to_fixed_array( &(p)->root, m, f, t ) +#define T1_ToToken( p, t ) \ + (p)->root.funcs.to_token( &(p)->root, t ) +#define T1_ToTokenArray( p, t, m, c ) \ + (p)->root.funcs.to_token_array( &(p)->root, t, m, c ) + +#define T1_Load_Field( p, f, o, m, pf ) \ + (p)->root.funcs.load_field( &(p)->root, f, o, m, pf ) + +#define T1_Load_Field_Table( p, f, o, m, pf ) \ + (p)->root.funcs.load_field_table( &(p)->root, f, o, m, pf ) + + + FT_LOCAL( FT_Error ) + T1_New_Parser( T1_Parser parser, + FT_Stream stream, + FT_Memory memory, + PSAux_Service psaux ); + + FT_LOCAL( FT_Error ) + T1_Get_Private_Dict( T1_Parser parser, + PSAux_Service psaux ); + + FT_LOCAL( void ) + T1_Finalize_Parser( T1_Parser parser ); + + +FT_END_HEADER + +#endif /* __T1PARSE_H__ */ + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/type1/t1tokens.h b/src/WinLibs/freetype-2.3.5/src/type1/t1tokens.h new file mode 100644 index 000000000..788c811b0 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/type1/t1tokens.h @@ -0,0 +1,134 @@ +/***************************************************************************/ +/* */ +/* t1tokens.h */ +/* */ +/* Type 1 tokenizer (specification). */ +/* */ +/* Copyright 1996-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. */ +/* */ +/***************************************************************************/ + + +#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_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 ) + + +#undef FT_STRUCTURE +#define FT_STRUCTURE T1_FontRec +#undef T1CODE +#define T1CODE T1_FIELD_LOCATION_FONT_DICT + + T1_FIELD_KEY ( "FontName", font_name, T1_FIELD_DICT_FONTDICT ) + T1_FIELD_NUM ( "PaintType", paint_type, T1_FIELD_DICT_FONTDICT ) + T1_FIELD_NUM ( "FontType", font_type, T1_FIELD_DICT_FONTDICT ) + T1_FIELD_FIXED( "StrokeWidth", stroke_width, T1_FIELD_DICT_FONTDICT ) + + +#undef FT_STRUCTURE +#define FT_STRUCTURE FT_BBox +#undef T1CODE +#define T1CODE T1_FIELD_LOCATION_BBOX + + T1_FIELD_BBOX( "FontBBox", xMin, T1_FIELD_DICT_FONTDICT ) + + +#ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT + +#undef FT_STRUCTURE +#define FT_STRUCTURE T1_FaceRec +#undef T1CODE +#define T1CODE T1_FIELD_LOCATION_FACE + + T1_FIELD_NUM( "NDV", ndv_idx, T1_FIELD_DICT_PRIVATE ) + T1_FIELD_NUM( "CDV", cdv_idx, T1_FIELD_DICT_PRIVATE ) + + +#undef FT_STRUCTURE +#define FT_STRUCTURE PS_BlendRec +#undef T1CODE +#define T1CODE T1_FIELD_LOCATION_BLEND + + T1_FIELD_NUM_TABLE( "DesignVector", default_design_vector, + T1_MAX_MM_DESIGNS, T1_FIELD_DICT_FONTDICT ) + + +#endif /* T1_CONFIG_OPTION_NO_MM_SUPPORT */ + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/type1/type1.c b/src/WinLibs/freetype-2.3.5/src/type1/type1.c new file mode 100644 index 000000000..ccc12be10 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/type1/type1.c @@ -0,0 +1,33 @@ +/***************************************************************************/ +/* */ +/* type1.c */ +/* */ +/* FreeType Type 1 driver component (body only). */ +/* */ +/* Copyright 1996-2001 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#define FT_MAKE_OPTION_SINGLE_OBJECT + +#include +#include "t1parse.c" +#include "t1load.c" +#include "t1objs.c" +#include "t1driver.c" +#include "t1gload.c" + +#ifndef T1_CONFIG_OPTION_NO_AFM +#include "t1afm.c" +#endif + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/type42/Jamfile b/src/WinLibs/freetype-2.3.5/src/type42/Jamfile new file mode 100644 index 000000000..00371d54f --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/src/type42/module.mk b/src/WinLibs/freetype-2.3.5/src/type42/module.mk new file mode 100644 index 000000000..8bd40a5cc --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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)t42_driver_class$(CLOSE_DRIVER) +$(ECHO_DRIVER)type42 $(ECHO_DRIVER_DESC)Type 42 font files with no known extension$(ECHO_DRIVER_DONE) +endef + +# EOF diff --git a/src/WinLibs/freetype-2.3.5/src/type42/rules.mk b/src/WinLibs/freetype-2.3.5/src/type42/rules.mk new file mode 100644 index 000000000..556306195 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/type42/rules.mk @@ -0,0 +1,69 @@ +# +# FreeType 2 Type42 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. + + +# 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 + + +# Type42 driver object(s) +# +# T42_DRV_OBJ_M is used during `multi' builds +# T42_DRV_OBJ_S is used during `single' builds +# +T42_DRV_OBJ_M := $(T42_DRV_SRC:$(T42_DIR)/%.c=$(OBJ_DIR)/%.$O) +T42_DRV_OBJ_S := $(OBJ_DIR)/type42.$O + +# Type42 driver source file for single build +# +T42_DRV_SRC_S := $(T42_DIR)/type42.c + + +# Type42 driver - single object +# +$(T42_DRV_OBJ_S): $(T42_DRV_SRC_S) $(T42_DRV_SRC) $(FREETYPE_H) $(T42_DRV_H) + $(T42_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(T42_DRV_SRC_S)) + + +# Type42 driver - multiple objects +# +$(OBJ_DIR)/%.$O: $(T42_DIR)/%.c $(FREETYPE_H) $(T42_DRV_H) + $(T42_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<) + + +# update main driver object lists +# +DRV_OBJS_S += $(T42_DRV_OBJ_S) +DRV_OBJS_M += $(T42_DRV_OBJ_M) + + +# EOF diff --git a/src/WinLibs/freetype-2.3.5/src/type42/t42drivr.c b/src/WinLibs/freetype-2.3.5/src/type42/t42drivr.c new file mode 100644 index 000000000..a6e4cf4b6 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/type42/t42drivr.c @@ -0,0 +1,232 @@ +/***************************************************************************/ +/* */ +/* t42drivr.c */ +/* */ +/* High-level Type 42 driver interface (body). */ +/* */ +/* Copyright 2002, 2003, 2004, 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. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* 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_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_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/src/WinLibs/freetype-2.3.5/src/type42/t42drivr.h b/src/WinLibs/freetype-2.3.5/src/type42/t42drivr.h new file mode 100644 index 000000000..98b7410b6 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/type42/t42drivr.h @@ -0,0 +1,38 @@ +/***************************************************************************/ +/* */ +/* 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 +#include FT_INTERNAL_DRIVER_H + + +FT_BEGIN_HEADER + + + FT_EXPORT_VAR( const FT_Driver_ClassRec ) t42_driver_class; + + +FT_END_HEADER + + +#endif /* __T42DRIVR_H__ */ + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/type42/t42error.h b/src/WinLibs/freetype-2.3.5/src/type42/t42error.h new file mode 100644 index 000000000..b23091001 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/src/type42/t42objs.c b/src/WinLibs/freetype-2.3.5/src/type42/t42objs.c new file mode 100644 index 000000000..db04fde36 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/type42/t42objs.c @@ -0,0 +1,647 @@ +/***************************************************************************/ +/* */ +/* t42objs.c */ +/* */ +/* Type 42 objects manager (body). */ +/* */ +/* Copyright 2002, 2003, 2004, 2005, 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. */ +/* */ +/***************************************************************************/ + + +#include "t42objs.h" +#include "t42parse.h" +#include "t42error.h" +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_STREAM_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 = +32000; + max_char = -32000; + + 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; + } + 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 = face_index; + + 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 synthetize 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 ) + { + 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; + } + } + + + /*************************************************************************/ + /* */ + /* */ + /* T42_Driver_Init */ + /* */ + /* */ + /* Initializes a given Type 42 driver object. */ + /* */ + /* */ + /* driver :: A handle to the target driver object. */ + /* */ + /* */ + /* 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, 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/src/WinLibs/freetype-2.3.5/src/type42/t42objs.h b/src/WinLibs/freetype-2.3.5/src/type42/t42objs.h new file mode 100644 index 000000000..289dedcc6 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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 +#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/src/WinLibs/freetype-2.3.5/src/type42/t42parse.c b/src/WinLibs/freetype-2.3.5/src/type42/t42parse.c new file mode 100644 index 000000000..714837964 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/type42/t42parse.c @@ -0,0 +1,1167 @@ +/***************************************************************************/ +/* */ +/* t42parse.c */ +/* */ +/* Type 42 font parser (body). */ +/* */ +/* Copyright 2002, 2003, 2004, 2005, 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. */ +/* */ +/***************************************************************************/ + + +#include "t42parse.h" +#include "t42error.h" +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_STREAM_H +#include FT_LIST_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 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 + { + 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 [ ... ] def */ + /* */ + /* or */ + /* */ + /* /sfnts [ */ + /* RD */ + /* RD */ + /* ... */ + /* ] 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_BBOX: + dummy_object = &face->type1.font_bbox; + break; + + default: + dummy_object = &face->type1; + } + + objects = &dummy_object; + + if ( field->type == T1_FIELD_TYPE_INTEGER_ARRAY || + field->type == T1_FIELD_TYPE_FIXED_ARRAY ) + error = T1_Load_Field_Table( &loader->parser, field, + objects, max_objects, 0 ); + else + error = T1_Load_Field( &loader->parser, field, + objects, max_objects, 0 ); + + Exit: + return error; + } + + + FT_LOCAL_DEF( FT_Error ) + t42_parse_dict( T42_Face face, + T42_Loader loader, + FT_Byte* base, + FT_Long size ) + { + T42_Parser parser = &loader->parser; + FT_Byte* limit; + FT_Int n_keywords = (FT_Int)( sizeof ( t42_keywords ) / + sizeof ( t42_keywords[0] ) ); + + + parser->root.cursor = base; + parser->root.limit = base + size; + parser->root.error = T42_Err_Ok; + + limit = parser->root.limit; + + T1_Skip_Spaces( parser ); + + while ( parser->root.cursor < limit ) + { + FT_Byte* cur; + + + cur = parser->root.cursor; + + /* look for `FontDirectory' which causes problems for some fonts */ + if ( *cur == 'F' && cur + 25 < limit && + ft_strncmp( (char*)cur, "FontDirectory", 13 ) == 0 ) + { + FT_Byte* cur2; + + + /* skip the `FontDirectory' keyword */ + T1_Skip_PS_Token( parser ); + T1_Skip_Spaces ( parser ); + cur = cur2 = parser->root.cursor; + + /* look up the `known' keyword */ + while ( cur < limit ) + { + if ( *cur == 'k' && cur + 5 < limit && + ft_strncmp( (char*)cur, "known", 5 ) == 0 ) + break; + + T1_Skip_PS_Token( parser ); + if ( parser->root.error ) + goto Exit; + T1_Skip_Spaces ( parser ); + cur = parser->root.cursor; + } + + if ( cur < limit ) + { + T1_TokenRec token; + + + /* skip the `known' keyword and the token following it */ + T1_Skip_PS_Token( parser ); + T1_ToToken( parser, &token ); + + /* if the last token was an array, skip it! */ + if ( token.type == T1_TOKEN_TYPE_ARRAY ) + cur2 = parser->root.cursor; + } + parser->root.cursor = cur2; + } + + /* look for immediates */ + else if ( *cur == '/' && cur + 2 < limit ) + { + FT_PtrDist len; + + + cur++; + + parser->root.cursor = cur; + T1_Skip_PS_Token( parser ); + if ( parser->root.error ) + goto Exit; + + len = parser->root.cursor - cur; + + if ( len > 0 && len < 22 && parser->root.cursor < limit ) + { + int i; + + + /* now compare the immediate name to the keyword table */ + + /* loop through all known keywords */ + for ( i = 0; i < n_keywords; i++ ) + { + T1_Field keyword = (T1_Field)&t42_keywords[i]; + FT_Byte *name = (FT_Byte*)keyword->ident; + + + if ( !name ) + continue; + + if ( cur[0] == name[0] && + len == (FT_PtrDist)ft_strlen( (const char *)name ) && + ft_memcmp( cur, name, len ) == 0 ) + { + /* we found it -- run the parsing callback! */ + parser->root.error = t42_load_keyword( face, + loader, + keyword ); + if ( parser->root.error ) + return parser->root.error; + break; + } + } + } + } + else + { + T1_Skip_PS_Token( parser ); + if ( parser->root.error ) + goto Exit; + } + + T1_Skip_Spaces( parser ); + } + + Exit: + return parser->root.error; + } + + + FT_LOCAL_DEF( void ) + t42_loader_init( T42_Loader loader, + T42_Face face ) + { + FT_UNUSED( face ); + + FT_MEM_ZERO( loader, sizeof ( *loader ) ); + loader->num_glyphs = 0; + loader->num_chars = 0; + + /* initialize the tables -- simply set their `init' field to 0 */ + loader->encoding_table.init = 0; + loader->charstrings.init = 0; + loader->glyph_names.init = 0; + } + + + FT_LOCAL_DEF( void ) + t42_loader_done( T42_Loader loader ) + { + T42_Parser parser = &loader->parser; + + + /* finalize tables */ + T1_Release_Table( &loader->encoding_table ); + T1_Release_Table( &loader->charstrings ); + T1_Release_Table( &loader->glyph_names ); + T1_Release_Table( &loader->swap_table ); + + /* finalize parser */ + t42_parser_done( parser ); + } + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/type42/t42parse.h b/src/WinLibs/freetype-2.3.5/src/type42/t42parse.h new file mode 100644 index 000000000..f77ec4af4 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/src/type42/t42types.h b/src/WinLibs/freetype-2.3.5/src/type42/t42types.h new file mode 100644 index 000000000..6626b0445 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/type42/t42types.h @@ -0,0 +1,54 @@ +/***************************************************************************/ +/* */ +/* t42types.h */ +/* */ +/* Type 42 font data types (specification only). */ +/* */ +/* Copyright 2002, 2003, 2006 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 +#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; + const void* afm_data; + 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 /* __T1TYPES_H__ */ + + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/type42/type42.c b/src/WinLibs/freetype-2.3.5/src/type42/type42.c new file mode 100644 index 000000000..d13df56b1 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/type42/type42.c @@ -0,0 +1,25 @@ +/***************************************************************************/ +/* */ +/* type42.c */ +/* */ +/* FreeType Type 42 driver component. */ +/* */ +/* Copyright 2002 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + +#define FT_MAKE_OPTION_SINGLE_OBJECT + +#include +#include "t42objs.c" +#include "t42parse.c" +#include "t42drivr.c" + +/* END */ diff --git a/src/WinLibs/freetype-2.3.5/src/winfonts/Jamfile b/src/WinLibs/freetype-2.3.5/src/winfonts/Jamfile new file mode 100644 index 000000000..71cf5678e --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/src/winfonts/fnterrs.h b/src/WinLibs/freetype-2.3.5/src/winfonts/fnterrs.h new file mode 100644 index 000000000..ea8090971 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/src/winfonts/module.mk b/src/WinLibs/freetype-2.3.5/src/winfonts/module.mk new file mode 100644 index 000000000..0ace3ae6d --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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)winfnt_driver_class$(CLOSE_DRIVER) +$(ECHO_DRIVER)winfnt $(ECHO_DRIVER_DESC)Windows bitmap fonts with extension *.fnt or *.fon$(ECHO_DRIVER_DONE) +endef + +# EOF diff --git a/src/WinLibs/freetype-2.3.5/src/winfonts/rules.mk b/src/WinLibs/freetype-2.3.5/src/winfonts/rules.mk new file mode 100644 index 000000000..71a7df2d8 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/src/winfonts/winfnt.c b/src/WinLibs/freetype-2.3.5/src/winfonts/winfnt.c new file mode 100644 index 000000000..4aa974410 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/winfonts/winfnt.c @@ -0,0 +1,1122 @@ +/***************************************************************************/ +/* */ +/* winfnt.c */ +/* */ +/* FreeType font driver for Windows FNT/FON files */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2006, 2007 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 +#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_Bad_Argument; + 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_Bad_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 ) + gindex = char_code + 1; /* we artificially increase the glyph index; */ + /* FNT_Load_Glyph reverts to the right one */ + return gindex; + } + + + static FT_UInt + 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 = 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 + }; + + static FT_CMap_Class const fnt_cmap_class = &fnt_cmap_class_rec; + + + static void + FNT_Face_Done( FNT_Face face ) + { + if ( face ) + { + FT_Memory 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 == FNT_Err_Unknown_File_Format ) + { + /* this didn't work; try to load a single FNT font */ + FNT_Font font; + + + if ( face_index > 0 ) + { + error = FNT_Err_Bad_Argument; + goto Exit; + } + + 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 ) + 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_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/src/WinLibs/freetype-2.3.5/src/winfonts/winfnt.h b/src/WinLibs/freetype-2.3.5/src/winfonts/winfnt.h new file mode 100644 index 000000000..ca75c9501 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/src/winfonts/winfnt.h @@ -0,0 +1,167 @@ +/***************************************************************************/ +/* */ +/* 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 +#include FT_WINFONTS_H +#include FT_INTERNAL_DRIVER_H + + +FT_BEGIN_HEADER + + 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/src/WinLibs/freetype-2.3.5/version.sed b/src/WinLibs/freetype-2.3.5/version.sed new file mode 100644 index 000000000..c281ff506 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/WinLibs/freetype-2.3.5/vms_make.com b/src/WinLibs/freetype-2.3.5/vms_make.com new file mode 100644 index 000000000..1aa83e7e3 --- /dev/null +++ b/src/WinLibs/freetype-2.3.5/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/src/projectM-wmp/projectM-wmp.sln b/src/projectM-wmp/projectM-wmp.sln index 010129865..2011bf5dd 100644 --- a/src/projectM-wmp/projectM-wmp.sln +++ b/src/projectM-wmp/projectM-wmp.sln @@ -5,38 +5,124 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "projectM-wmp", "projectM-wm EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libprojectM", "..\projectM-engine\libprojectM.vcproj", "{31B91091-431A-4842-8682-2A04B51C980A}" EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "glew_static", "..\glew\build\vc6\glew_static.vcproj", "{94AC71AA-7528-4E56-A5A9-EDDFE6D20A39}" +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "freetype", "..\WinLibs\freetype-2.3.5\builds\win32\visualc\freetype.vcproj", "{78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ftgl_static_lib", "..\WinLibs\FTGL\win32_vcpp\ftgl_static_lib\ftgl_static_lib.vcproj", "{4A80DC08-8D4E-4136-B818-AF0024000A21}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "glew_static", "..\WinLibs\glew\build\vc6\glew_static.vcproj", "{94AC71AA-7528-4E56-A5A9-EDDFE6D20A39}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug MT|Win32 = Debug MT|Win32 + Debug Multithreaded|Win32 = Debug Multithreaded|Win32 Debug MX|Win32 = Debug MX|Win32 + Debug Singlethreaded|Win32 = Debug Singlethreaded|Win32 Debug|Win32 = Debug|Win32 + Release MT|Win32 = Release MT|Win32 + Release Multithreaded|Win32 = Release Multithreaded|Win32 Release MX|Win32 = Release MX|Win32 + Release Singlethreaded|Win32 = Release Singlethreaded|Win32 Release|Win32 = Release|Win32 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution + {E182C41E-2EF4-4BE6-8D85-F9A0982CD38C}.Debug MT|Win32.ActiveCfg = Debug|Win32 + {E182C41E-2EF4-4BE6-8D85-F9A0982CD38C}.Debug MT|Win32.Build.0 = Debug|Win32 + {E182C41E-2EF4-4BE6-8D85-F9A0982CD38C}.Debug Multithreaded|Win32.ActiveCfg = Debug|Win32 + {E182C41E-2EF4-4BE6-8D85-F9A0982CD38C}.Debug Multithreaded|Win32.Build.0 = Debug|Win32 {E182C41E-2EF4-4BE6-8D85-F9A0982CD38C}.Debug MX|Win32.ActiveCfg = Debug|Win32 {E182C41E-2EF4-4BE6-8D85-F9A0982CD38C}.Debug MX|Win32.Build.0 = Debug|Win32 + {E182C41E-2EF4-4BE6-8D85-F9A0982CD38C}.Debug Singlethreaded|Win32.ActiveCfg = Debug|Win32 + {E182C41E-2EF4-4BE6-8D85-F9A0982CD38C}.Debug Singlethreaded|Win32.Build.0 = Debug|Win32 {E182C41E-2EF4-4BE6-8D85-F9A0982CD38C}.Debug|Win32.ActiveCfg = Debug|Win32 {E182C41E-2EF4-4BE6-8D85-F9A0982CD38C}.Debug|Win32.Build.0 = Debug|Win32 + {E182C41E-2EF4-4BE6-8D85-F9A0982CD38C}.Release MT|Win32.ActiveCfg = Release|Win32 + {E182C41E-2EF4-4BE6-8D85-F9A0982CD38C}.Release MT|Win32.Build.0 = Release|Win32 + {E182C41E-2EF4-4BE6-8D85-F9A0982CD38C}.Release Multithreaded|Win32.ActiveCfg = Release|Win32 + {E182C41E-2EF4-4BE6-8D85-F9A0982CD38C}.Release Multithreaded|Win32.Build.0 = Release|Win32 {E182C41E-2EF4-4BE6-8D85-F9A0982CD38C}.Release MX|Win32.ActiveCfg = Release|Win32 {E182C41E-2EF4-4BE6-8D85-F9A0982CD38C}.Release MX|Win32.Build.0 = Release|Win32 + {E182C41E-2EF4-4BE6-8D85-F9A0982CD38C}.Release Singlethreaded|Win32.ActiveCfg = Release|Win32 + {E182C41E-2EF4-4BE6-8D85-F9A0982CD38C}.Release Singlethreaded|Win32.Build.0 = Release|Win32 {E182C41E-2EF4-4BE6-8D85-F9A0982CD38C}.Release|Win32.ActiveCfg = Release|Win32 {E182C41E-2EF4-4BE6-8D85-F9A0982CD38C}.Release|Win32.Build.0 = Release|Win32 + {31B91091-431A-4842-8682-2A04B51C980A}.Debug MT|Win32.ActiveCfg = Debug|Win32 + {31B91091-431A-4842-8682-2A04B51C980A}.Debug MT|Win32.Build.0 = Debug|Win32 + {31B91091-431A-4842-8682-2A04B51C980A}.Debug Multithreaded|Win32.ActiveCfg = Debug|Win32 + {31B91091-431A-4842-8682-2A04B51C980A}.Debug Multithreaded|Win32.Build.0 = Debug|Win32 {31B91091-431A-4842-8682-2A04B51C980A}.Debug MX|Win32.ActiveCfg = Debug|Win32 {31B91091-431A-4842-8682-2A04B51C980A}.Debug MX|Win32.Build.0 = Debug|Win32 + {31B91091-431A-4842-8682-2A04B51C980A}.Debug Singlethreaded|Win32.ActiveCfg = Debug|Win32 + {31B91091-431A-4842-8682-2A04B51C980A}.Debug Singlethreaded|Win32.Build.0 = Debug|Win32 {31B91091-431A-4842-8682-2A04B51C980A}.Debug|Win32.ActiveCfg = Debug|Win32 {31B91091-431A-4842-8682-2A04B51C980A}.Debug|Win32.Build.0 = Debug|Win32 + {31B91091-431A-4842-8682-2A04B51C980A}.Release MT|Win32.ActiveCfg = Release|Win32 + {31B91091-431A-4842-8682-2A04B51C980A}.Release MT|Win32.Build.0 = Release|Win32 + {31B91091-431A-4842-8682-2A04B51C980A}.Release Multithreaded|Win32.ActiveCfg = Release|Win32 + {31B91091-431A-4842-8682-2A04B51C980A}.Release Multithreaded|Win32.Build.0 = Release|Win32 {31B91091-431A-4842-8682-2A04B51C980A}.Release MX|Win32.ActiveCfg = Release|Win32 {31B91091-431A-4842-8682-2A04B51C980A}.Release MX|Win32.Build.0 = Release|Win32 + {31B91091-431A-4842-8682-2A04B51C980A}.Release Singlethreaded|Win32.ActiveCfg = Release|Win32 + {31B91091-431A-4842-8682-2A04B51C980A}.Release Singlethreaded|Win32.Build.0 = Release|Win32 {31B91091-431A-4842-8682-2A04B51C980A}.Release|Win32.ActiveCfg = Release|Win32 {31B91091-431A-4842-8682-2A04B51C980A}.Release|Win32.Build.0 = Release|Win32 + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Debug MT|Win32.ActiveCfg = Debug Multithreaded|Win32 + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Debug MT|Win32.Build.0 = Debug Multithreaded|Win32 + {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 MX|Win32.ActiveCfg = Debug Multithreaded|Win32 + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Debug MX|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 MT|Win32.ActiveCfg = Release Multithreaded|Win32 + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Release MT|Win32.Build.0 = Release Multithreaded|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 MX|Win32.ActiveCfg = Release Multithreaded|Win32 + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Release MX|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 + {4A80DC08-8D4E-4136-B818-AF0024000A21}.Debug MT|Win32.ActiveCfg = Debug MT|Win32 + {4A80DC08-8D4E-4136-B818-AF0024000A21}.Debug MT|Win32.Build.0 = Debug MT|Win32 + {4A80DC08-8D4E-4136-B818-AF0024000A21}.Debug Multithreaded|Win32.ActiveCfg = Debug MT|Win32 + {4A80DC08-8D4E-4136-B818-AF0024000A21}.Debug Multithreaded|Win32.Build.0 = Debug MT|Win32 + {4A80DC08-8D4E-4136-B818-AF0024000A21}.Debug MX|Win32.ActiveCfg = Debug MT|Win32 + {4A80DC08-8D4E-4136-B818-AF0024000A21}.Debug MX|Win32.Build.0 = Debug MT|Win32 + {4A80DC08-8D4E-4136-B818-AF0024000A21}.Debug Singlethreaded|Win32.ActiveCfg = Debug MT|Win32 + {4A80DC08-8D4E-4136-B818-AF0024000A21}.Debug Singlethreaded|Win32.Build.0 = Debug MT|Win32 + {4A80DC08-8D4E-4136-B818-AF0024000A21}.Debug|Win32.ActiveCfg = Debug|Win32 + {4A80DC08-8D4E-4136-B818-AF0024000A21}.Debug|Win32.Build.0 = Debug|Win32 + {4A80DC08-8D4E-4136-B818-AF0024000A21}.Release MT|Win32.ActiveCfg = Release MT|Win32 + {4A80DC08-8D4E-4136-B818-AF0024000A21}.Release MT|Win32.Build.0 = Release MT|Win32 + {4A80DC08-8D4E-4136-B818-AF0024000A21}.Release Multithreaded|Win32.ActiveCfg = Release MT|Win32 + {4A80DC08-8D4E-4136-B818-AF0024000A21}.Release Multithreaded|Win32.Build.0 = Release MT|Win32 + {4A80DC08-8D4E-4136-B818-AF0024000A21}.Release MX|Win32.ActiveCfg = Release MT|Win32 + {4A80DC08-8D4E-4136-B818-AF0024000A21}.Release MX|Win32.Build.0 = Release MT|Win32 + {4A80DC08-8D4E-4136-B818-AF0024000A21}.Release Singlethreaded|Win32.ActiveCfg = Release MT|Win32 + {4A80DC08-8D4E-4136-B818-AF0024000A21}.Release Singlethreaded|Win32.Build.0 = Release MT|Win32 + {4A80DC08-8D4E-4136-B818-AF0024000A21}.Release|Win32.ActiveCfg = Release|Win32 + {4A80DC08-8D4E-4136-B818-AF0024000A21}.Release|Win32.Build.0 = Release|Win32 + {94AC71AA-7528-4E56-A5A9-EDDFE6D20A39}.Debug MT|Win32.ActiveCfg = Debug MX|Win32 + {94AC71AA-7528-4E56-A5A9-EDDFE6D20A39}.Debug MT|Win32.Build.0 = Debug MX|Win32 + {94AC71AA-7528-4E56-A5A9-EDDFE6D20A39}.Debug Multithreaded|Win32.ActiveCfg = Debug MX|Win32 + {94AC71AA-7528-4E56-A5A9-EDDFE6D20A39}.Debug Multithreaded|Win32.Build.0 = Debug MX|Win32 {94AC71AA-7528-4E56-A5A9-EDDFE6D20A39}.Debug MX|Win32.ActiveCfg = Debug MX|Win32 {94AC71AA-7528-4E56-A5A9-EDDFE6D20A39}.Debug MX|Win32.Build.0 = Debug MX|Win32 + {94AC71AA-7528-4E56-A5A9-EDDFE6D20A39}.Debug Singlethreaded|Win32.ActiveCfg = Debug MX|Win32 + {94AC71AA-7528-4E56-A5A9-EDDFE6D20A39}.Debug Singlethreaded|Win32.Build.0 = Debug MX|Win32 {94AC71AA-7528-4E56-A5A9-EDDFE6D20A39}.Debug|Win32.ActiveCfg = Debug|Win32 {94AC71AA-7528-4E56-A5A9-EDDFE6D20A39}.Debug|Win32.Build.0 = Debug|Win32 + {94AC71AA-7528-4E56-A5A9-EDDFE6D20A39}.Release MT|Win32.ActiveCfg = Release MX|Win32 + {94AC71AA-7528-4E56-A5A9-EDDFE6D20A39}.Release MT|Win32.Build.0 = Release MX|Win32 + {94AC71AA-7528-4E56-A5A9-EDDFE6D20A39}.Release Multithreaded|Win32.ActiveCfg = Release MX|Win32 + {94AC71AA-7528-4E56-A5A9-EDDFE6D20A39}.Release Multithreaded|Win32.Build.0 = Release MX|Win32 {94AC71AA-7528-4E56-A5A9-EDDFE6D20A39}.Release MX|Win32.ActiveCfg = Release MX|Win32 {94AC71AA-7528-4E56-A5A9-EDDFE6D20A39}.Release MX|Win32.Build.0 = Release MX|Win32 + {94AC71AA-7528-4E56-A5A9-EDDFE6D20A39}.Release Singlethreaded|Win32.ActiveCfg = Release MX|Win32 + {94AC71AA-7528-4E56-A5A9-EDDFE6D20A39}.Release Singlethreaded|Win32.Build.0 = Release MX|Win32 {94AC71AA-7528-4E56-A5A9-EDDFE6D20A39}.Release|Win32.ActiveCfg = Release|Win32 {94AC71AA-7528-4E56-A5A9-EDDFE6D20A39}.Release|Win32.Build.0 = Release|Win32 EndGlobalSection diff --git a/src/projectM-wmp/projectM-wmp.suo b/src/projectM-wmp/projectM-wmp.suo index e3a47e53cd6a1d4cce1c0164cff6aab92688c479..a8f8085c0bc61c19d443f342dc678906c65d2ebe 100644 GIT binary patch delta 8040 zcmcIp33OD|8GdhOGT9*{gai^`f?>%@RziRz6A}`Z00F{|KnReqn8Y|}%i>HZ7F1N= zXD@1@6#-L(JneR>4QiF*20dtxbwk@)j#jNUb)g>9?|bhK42zy)OMlMC{qJ}Gch~>F z%fxry=4-PbJ7=3xqG{R)U<~keS65dN(rG|B;07vy(Lfn63aADq0<@)!gFYUZ08{~U zB-@@ayB6AXfL1e+&H`qu{9L5-fQ7((U;(fQ7zQi>>VTyHYv=d%&>MhdzznIi&)w!& z8R@Rxx3I=>Qn!QD>t)sB37Z_O+rUPurb1C~*aUgn zku9F^YNr!LA!d=$8UB*3shg(jnid8&5r_p|d?YXWY4^X2}ha5kl*ZHSXoK3$a2OYTZ7W*alv{h^ayh-PIml!q+Ey|XN@$b+Q|xI)JS8t*z|L9qHbCJ zOe|9)9AOzI@fIxeQmqAxxPJfRrrd-)#g;t|gq6hP|OZ6>4eRa|mH^y0tfy7#48UXd6LsrL+ z3)MNP{uz?ac&u@MFx^Z;@$~jh7>n#$E+M2D|2Q&_R*&8-KtDa`rw2W*LvAI~Mc-C# zl=Lap3*XMnS1| zL9%-Av!NB(4=UiAx$@hDl!S-s}MzO@R=!-eu-N1y4)4Fet9k3;8@Hqw;#q>4|r<3Rwy?OU`aZ8_@G#hx~B z!ZYxM5peZ#u#6`9ZC~I9fHDa1`}bgz(X@2Mv5easB^z6KX+i6@^eB0%F3Zc^kX7^q z0(Zp+kv|F~UBRzJehokgv}e-{A=?#vGV-|qCD5J+6b6@bvClcCiFGph$1zHAJSWMq zGX?Ty`orE|D8_;G1W*Y)r8qazUjme~0KY5*UQzmMDn+8b4sgxh0%%A5ZGiGGfE?vB zfMs6-;JjKflnVeQ2#nv*35ABCietlJsxV4%{HBMp>#4Yr;9`}XE5I&E*(EEE15Vd* za-=}XP$c(;fzq0p5IIXRoXy#CCNsgiQZZbJo1jxXile>?Iy<~Zah&tD%FY*H*Q)F` zD2^T32)z{PCdI9Qeg|~Q-4^FHGn|R%PZz+!Z<=e_G9)7M= ztv7UbFi~;k(ECEC;--V>;t4ZFS&{zJ&epD;4p9mAlHWUXTVY5QQ#Orz8$FnJf`wLN6P48 znVicTmHs?3zXwh!@&%+X0xtnC1E+yA0K-bg<|i(G6AI(%4S=;Uwir{?-$D8=(1v0E z1?gXb_kh0vEdLnk`@jc4B5XcH`Vr6v`ah6<0x$;UWPV~o1jv6Q^A*qqd=2yhhn11z z&2`dfgc!?*?bLgd!@j2#s#PgQipIJ$={3Zyx~p`VfyeIEBN!F_89jyVtRMw#Zp(G1Ilwj|EmRjq|7E*EJy4Im`| zTO;QND2o7c`9K{&SqhL#0_p+Eat0VlM$rm@(g=|22Q&ec7JwYjq+0;WtpGXhR<{9^ z)d0CZz#4$E6(CmyFd!%l26EmE{Ku%EFd|5f2N)TY`vG#9zyknfKR}KL%K?D$5I~Nb z=|Oi0K{lAld(3i<^bo5=yKLK*3Kqo-?93VFe_yVBN zt;wYVbZ-h>oE(?NRFK&9NtV7C83#)t!APmD1ws_ZeTFJ$i*ZBgt~kyX&nAkvi#oh9 zs(|y|Qx(K1?j~^Yic3%&N6l!Z^jF+)=q|5UCl|+Eg=$c|&e-;J@8cnsaABY-gI! z@~4KDaBnxe$J8&0P*`IG-~#Lb=gZFxQQTbt+-Ajz;(84F}@1;8~Fe_3qMqx1L>E53-E_d67<&q3U6v^Kiv^4uA2|dJUsH< zAF_ls28t6Ia`Y_j))aajxs^b^`hXs0EoMEoI9}DqXfw1N`J`^Tf8ykev_xqM?IqQ_ zT-jxK#(lSE8_uSLZ+TkrWSU4H{-%@ZziF{VJw5rP9FE8=$3r9wS_V*#-I5Q^JRGmN z=7V!I*le@3G~mg}r)L(v&(X5+^c-4wz3Q5hQX>6Qo!6~CJmDseHs|m9^)M!gD^|m` zku53Cx!0-YYdpBEHoodtyzS_*?kxeA0fe=bror<04af#xq>JV4T zFlkO5CW+&VBqubkebQLnmZpBJm^?Yu{B?wG&0n;nbMgz)E=Q!%6{YLq9at)^G^aSz zlBKPGAN?S1BqfG>s!x~p=G3^$ejPzTsGp0ZwJ~NH^=jM>c+K*luML>?H%>*jATa}r z*PiY`IKZ%Gj4_P{LILh4ozf_D7@a+3iUK)ZqR&aN_}qsFI~`ppM}rg<7bE?t4< z*@|PeybsZiM;YxlV|2B_0fQ)`UV$Gr>ab&5LpZl=1UFXGo^|vDSO;%%{`M0T=OQP^ zTV~6XO(F8*nJyeW{D$vwe#3tHzu^{2jwhp^^Y?GWMNUVN4X^{e4e(0MeU3K*-URq6 zLd&f2egdHk_Ar59VaHf?ef12`Ua zX6*o74o3FTq0UU3g{B}tI*I;p8>vs`kI7KS}3b$f^BfO>XG$_7dQQ?C5^)maC{qn|L&`?^&S30N z=xpS8k>@pmLI)!^1>m7Z@t@b^=xh|fvrUJdZ8G@%1u4I+01y~lP3s;_lIv4U0x}LD zcRMg1pm5Et8Q_?2#psw;fu#qy0RL}9a=JK4ZY&S?=7B5(D5U_aWRP&1=89ATL2548SIM%lqpxyESu94S!lAZvP?n7=}0N1LxA1E#j=>~v} zY*ZW@xeMU8+#=Y)e!zVIh2G)s^fu_U+sx_G;X;3witftwm2BOabdfs!*RUEt+%hnNfV|{nl)!_K}ubF);3D1 z>uPKzrfPJqi?GSNd*;ZNnNh~GP1Sat&+IYn8_IO+2lRBy&U43PTd>YkVvtow=f=tA zFZiBKn}hVl(xW+BJrZO7+1vMF&3(NS?YY`;IpatYcZ|cy za4#|^(n+Uv>c)k`PKRVUx*IRM_vwz!PO%$JqfcJcmg`d7?v#y{v&=Gixj4^=8@pSV zJ;mt=ff$Wnkk!}AY4-*>);vif8WN2scYI|3PE#)9_s$o0dOmiEXk$V}vMyl-@lxX6 z;?G1&YvoRTi*ee0gP!m$%P3K!XUgx2i}l^;P?h+aa%9rZFnM)qyz$j~hb|qyL*g6M zPtU$MDI+lxQP!j|YFqG!twG6pmcKlNTOcFP{2SmwWFqiazP`zNp=r?(pXYo8eapj&!dW xWi*xl)bbwFEB0b+mAYoeXM50vDBBBvpZxN6vM7*S0?@p@m5-H6z5W9<#cxf7g zuQrG#ZN^)wM1^Bb<0V-U4OP5Nwdur6$2gg`lT5Uop(bNm>GSNq+u0wTzQeQc^F8PN zzVDp(e7A$I#qRr??ZjPM<>Q{7o^gg@OasV^;b#L=0Tcr^8GH&b9;g7G2BrfgKq*iL z%mB)Pc{0+Tn#7jopfndCpATOMG*<50=~&ata4$K&(daboko@wJ<4R;a82b``ORo4M z9rDwN^2jmaqA$)N-$u+guS=!#f$fATlU+m8ZytLXHi})#YMxS8o-)?-qy(8ZqsGDz@xOm_*pJ90_9%8a(8@1WFm^8M|Cbj zVV5Db31#fqxfI3qvGORP%;^M;3Dk1-0c}B$yOekC?1y5KOCGsPUFHDrVcJ)p3MUiV zCs4Gy`@CT@TjacFmE0Q8B6m0B%DJ=I$%YYpmJYnpamGTt=k>;N<0r;i>FGbs*&Fry z1v?!Gy4o(aNu@F+zIbQy6gu%G*Tg)9D@pzFV;FKXWs>Dd@tBVB-;DXE_{a9m;@z=} zG=PsvO9z788b*foL29%u%1nV4N`uv%9%oAD^rDDq7$#FCA@w;~d@~k_WUUT7M4jYU zmYIg-%`_wA+LS+KWXp>3 zH2L%NfznypS1x7LiYGTw&Q=bcvmTFMjU=ozGL5H&o6RBbH$R{-rHfH-fU z@C|+$_$VkEPr`o((42@0HRu9iT(oKqa5wl9@O@M(0FMEujZ%&L`{1lQLA6of6HPfX zJZ1DVDrG~O4Nm)kYUB&RS#_yuT%nf9&Ecuu)vEAD)`CxhU#Hsh;Ln58HmF8k4bIkT zRb$=F;9Tn(RO6~v2TuE?YUFQ%vu<-x^BS2b>_vgr5)=dcJ#Yq|P;DG|tHzxQi+f+= zPOHYupV2sfSloGy>rib5;x3xOw`V*K3+&NAn=Sa-rXtV|PD@seJO!LLn4ua+=m3q& zhUcVZ-2biL_kT4Y=AJ2*KYxk6v8qB|D9A29gs8*7yTEUNBfwFh1$YlQ1{?=Y0Ifh9 zU;!tA-vXQ>oEpCaBrU&s1bNWS>L3 z2k`ARRwiY0vU~-kq5L)ceINxq6i+XmqthCz;$t7-r>XS>fAe@_JmM zZ3Pfu!~(AYF_K&~#LH!%8Q>M>{B58P*bh+SR=^DP1DGXhZh#r0wF9A6<3Kp)dc#vA zhT(^cLY`{9z(<0QfS+b!(ldxl**1WNMK_?4&jjaYHdi%nJ~LPW_L6FBa0@sm{#Mmk zXB#-Tgzc)q8Na{}mP+G||7sYv+-ox+a_-aYJQLon8uOS4&bp!D z{6la~X4;6by7}O=f-r3b_yA6um0{u4~P9C&zswIFIGyhB>ra~Z)(=4=Ahh_q^5gPTO9e`Q*73%Ow_G?{g?}BsS9u3pl z!52fj5T;!M$I;C2UQv;0z7CEfknyQ%%m}v`+UKfG0Kcc&K#UnurhO1N?T~7G)r0ZF z8yo`9IBKi#!||~`sFeo94JdH_RtLp^_Bwbbv>mE3t%tzrFRI2T{TO^Xyma02h^N>u zjlwA*qyGvE_$+_`X?_>K+ab4$?LQ|4k7s;J-IWqdJ+q!e( zfGPWL@X9U|YLQiEHJQ29IIgb7`E0pSgU^uf87pU?uVnx&?07C8EliYzlYOKsHBDNc zE|yWgY>jf$4(Sqx!>EVxBeWeAJ&{*QH?up7dY+TsxfaS-Yidr4tSP% z=yP;0g`&AYi3x^{VAS+oam7s`1p;HnYUE z#pxHoEPQQnk#*}~cvhEpi`F@ybvUpNgY&(8q#D~ksB!IKaThi2OVtJ=?t;dB9TxXM zN&w>}jx2wic(gnT*{+epj!1sdFCZQ6u zz`Dn5PQ#k`Ouadg8}UiK!mED(9|C_{wWZ*bSp^o2Ssz@G=i)1EAqIQ3oNpQ-$Hrtx z$JqF+D8#T0`auAVcSw!VfP+?*&txfZDbSoG>>eU(Z^z2Loj&Q<S@X_Yb%mE2pOO;LbyPU!WhrQ&WHSJ=W6s@0bznwn@yfb<%t#PNHYTTVL#c zXj+?^j+mBbk>3w@>4jnY)zAUiLt6VHY;_HQlo z&9|F|EZtEr`RzYytMNOccqDFPpRJW+%(hw#@>m_@b+>GVN?*Q(!))-Yeq)s_AwaF} zjj^`C(;OR6^Gq;F5i{*Jugbex@c>Bdz#tSFvaB8v{m!UEPU!SKY78Xy0^@V zGIQ{J)cF4ht7hwK5m8k5>g`f|$THKd^ShGmc;27cC4NJ>RembgA&xWulK9KxgYECb zb9c2AO1>jbI<6MWxk#54dE{IB&XN<7^4fffHkiTNK}TOpPNEb6Nys`QL?nSjDwU6( zF(+7nd$%i_gnYQ4P3{axIefr+&!oNO?T)TSO2$M z)$O~NE^y!Tz3+D114{nnUb`RM8~5BTxHZ>xr$A}?&j+-*bZ7iq;F)@&POa7MpL~|D zdVc2Hy`$Hj>r*=b>N%gs^z_Jm%`+ixdM1h85%3%I7q&P9M)T_50GLONtw|3bT$`2y zAUp@^Ltek8^vJb5jwitBQS&QCv*F)W_XIfK@{FfZTeW0k{6JC9&EiBs5 zzXc`_V|A)&@QUi9F==eVCQcbWJ4%zPTW8MKp^RwqCH)-vUY`vy7F}kCwgH^*l?B>; z-%E0a-+B7RY1{V{?D5%TbSsQ!hneZRpZQ;>R3(BDm2AOhACQ4F_dDv0n~$Mbiy7-d zzX89+;d*i%C`XjH+`rvVo~n=CvZsP!Vlq_rJ%|rypV4VNDaz}eyNLq=viDIRGuui+R%s98o)@Z}mjBON8Kkvs;T6UAN9Fwzp2l!?DgFD<~8E3U@; zcKLPAjF=wn(<+>sJ<0}G5c|G$745ssuPqO6^ywNic>xCc?g6@H^-q+F3KizsxIX^;GHdKt$kaom>i1YbPe-7OAJ(wO1Wz*amNs7lu?sfR9W8iI z5?SKA4R(PqIZu_nr)|$`{B-Mc=3RAZ7~+y-nPmLbOMI8!PhvgF?(29tXr-Q!J#qoJ zosB^2d+Sb;lk7#1n`6rk(F}uB%{gVV^rF$rLOenPrlDGC9ZZrn@!2Q=r^Z{KqH7bq zR^wZAjY{-oNUAIL6ufv%Zg^m_}0b8v4|a z{eT$}9nL5f&zqfELvpR{f!74Krq$g6GdtijqH(tVwLWS+GcVzR=hVkg_zAst>HlYX zQ{TyU%V7FsVy|EL^(2mmW^6W{Xnn??ogbQM{?c$9*8{W3?1VPKe318`b_1<(jOR5U zge2!h7PD4-trOQX(s1Q00kZ=q$buhTk;eCV&;4y^*QV_+(?yY`D_N4I8(^o{@Avc~ zuT*8Ll-~a8Gl||wp3Y{Gm02&gu^hHpcefd7nbl*L*S7zxV%zDLY_1(&y2bZC)G%)$ zO;uS7pQBZ~hMxIUtG4UcrKIgTyFLna$TS&<%bRBM6pbT~;~1@aK<~0k%%W4R@qT2} z&9C1g36%_Gw;;t!^T?@IoXr}LN1q@qzR-k-bd$pYTT(hWVz^)a${9B*=TwDxru|d|lCVlkAXi9f-F#$XaCrp!aww;w7I+_N(IJ zk9bS34ZM85@zD@TgxU>|vG5s#lx$f=_8P;Htq?a-BxUlmkrvqTc!bg40P7}>oub3L z?vGvrJ>gTe8_2#z=R`ll)#%msxj1rU z=xHIS+R2cXk=G?k=`)PNC_=4XI+XNzS^Qb^W7u?PFK=9{eFQ6xqoRzZ1hwMyn|Bqy z%UWleoP}CP(R$58z9aYBG0qEyyATaH;)9oZjiHF#&$d66+)>&@qE6j=|Jm|-QxbHK z7@gwzvKZbC>tr`50%Y<0HuV>0r(^^&4_Hl#f#w0XaZ%Vj;MMXg zPds9p2dpMVqVs^;q*!0OyT;52SuC{K8$ zccwm$TYPtE_T8#%aLro@{i#pcwaV7-&Fx;zhljj`>)6Hmc<=LBj&HCg<$>CXH0=PL z`;}Xfv8Py#@}O(f4zSERSerT_VpeTf8sE{pDJ-+tw^|QQ@N#VLINbZZDa>Z0Ur4bI zw6;A|MKYqD(R^UHg&$!NlYRV&d{It2QtRwYz4TGmy&K0a3&#~6RaPIg@Tju;?S)5` zmCFi`YQ6|j;ZbFcs3|sAcvQ1TAV*Ky-IN8CZ57ya&xLbqei ziqlYV@pYWkDo#UXwStS&P+7dJ;xyEJ)?9HKYQA%)ijwE;M4+9~Dq{CV>|Xa+iqlZD z-sLZ1_r+4u%|o#`FsiCDtd z)~z_5yHmaxdG^X`waJ;SAIVg+%&op}d<)%LuG2~xT;!n(mhxOF*Mh|WE;(tajD5Nb z_=49%?!WAljbM}8b1J>`w*yZp)lJ(0xfoW-H29L6fvdEra87L1{e@>2@kP&pq%qZf z-v``!*PS}W96}s)yJi~n6`q{lVi8!DmoUs?Wp{<|yCq%$y@eSNbQ4}<)M%C6>zr?8 zo3opH$~2M2_<}JiPfY;k<8a>vVthV?t!74%lmQe_PXjX6+4mAXh%PT;ZB|F-G@|EQ z@&|qIsk!96`n+>ToA`sW7@XYzZ;ZlDa>i(V!579ax1%*4#iVw0Zp7oShdSf!1Z{DF z)aaaUcshE#1V*}Hv=?#6f2QKG$a!Fs@axbONqj@dfm6Q4`LO@{m8O(lH*GCHF3MXd z{VjdhgHFtw8LDzCC7p^dwz9MoaZL3 zRM*XQ`DiiVG7{#O1Ctzp9SIbO{8%-7?yfqz=&<&R}(D0?5t LvYM-Hl%f6qUL^v@ delta 1122 zcma)5O-oxr6g@GRpsfZ?Y!X2zrFA3KG*+=yk(i_!&_tpVBY_~vYZ~w)jj;+{1Q(+F z*;QtHO76#WJMj?&_pmk;vdE6QW$-I;UGy=U&+Isaifjh#=}oPLa97;oX% zhg$hW%r@+fA&ci2LWFZaK4S-4C}CXe2fhwy*hCI_&RQe(AOCzghjn`HBBgUOTYa=t{$w#Wpg!J3P%$;4McPHyTBDb;N_bC8?QZa265pM-;=<9% zSM<*870F}USgVM7Z1VThe=TNS^49UjLLgvDU+L;qtb3q5aJDJdbTdnyxNb}Varo>H z3BhK9IB`wNYq!U02Fky^T`lfl^|X0bN4@zR>&8#4rTU%>@-A3ubf8^y^m(N#d1STt JX&Ufy)=R3DMV_z5EM;*R4w4w_g z=-j_|@g5T6jdTVBiKGVOnNg z*R`rKm`I`zGgy-pQ(~oph`u5s!ZPmpP(fGXBBD2puUcNDb6#MA)Fx)R+X>{pbf6sx ztY8|?IVR}XGO=mOC}0!FvTBmoJaGvuz!YzEpW?q|=U+mK!^ArIQfMZB3uU$-OvViP zpOQ^+AI7y46V9`G4zUWC-YFh?Z_1zgT$$Au+rDMSx8IlOQA^~f^WC{B+b6MCbx|1g z-y2oF`i~Y;@|4=NNH~J>LBl)k>aj5R;TOBUZ^0-Vc#ni?sEUE(i5r{Btv%Ub^0m=i zR(Bv06qM_d2X67!A66-L6=r@^)_bfR=W+70zqd@h)Gu!YaF?xEWK&a??MsB@S`lOb zdw8vKr%ObrgEPzb7;a+(A<7S-+d`ySF-;T?3R`PfTr(Cv#b<*}U1u<+h)VOVm!lO! zG-4RB4UAgT>!i+bfg$VHM1gE4~{g9#8C0eOZDW|J?<8c*(GQ - 0) + { + fX=2; + } } void CProjectMwmp::DoubleClick( short nButton, short nShiftState, long fX, long fY ) @@ -323,9 +327,10 @@ void CProjectMwmp::DoubleClick( short nButton, short nShiftState, long fX, long } void CProjectMwmp::KeyDown( short nKeyCode, short nShiftState ) -{ +{ + if(nKeyCode)nKeyCode = 4; + //globalPM->key_handler(PROJECTM_KEYDOWN,PROJECTM_K_n,PROJECTM_KMOD_LSHIFT); } - void CProjectMwmp::KeyPress( short nKeyAscii ) { }