This patch should be applied to an un-modified XFree86 version 4.0.1 source tree. It is the first of four patches that will convert the source tree to XFree86 version 4.0.2. To apply the patches, run the following from the directory containing your 'xc' directory: patch -p0 -E < 4.0.1-4.0.2.diff1 patch -p0 -E < 4.0.1-4.0.2.diff2 patch -p0 -E < 4.0.1-4.0.2.diff3 patch -p0 -E < 4.0.1-4.0.2.diff4 gzip -d < 4.0.2.tgz | tar vxf - ------------------------------------------------------------------------------- Prereq: 4.0.1 Index: xc/programs/Xserver/hw/xfree86/xf86Version.h diff -u xc/programs/Xserver/hw/xfree86/xf86Version.h:3.441 xc/programs/Xserver/hw/xfree86/xf86Version.h:3.460 --- xc/programs/Xserver/hw/xfree86/xf86Version.h:3.441 Sat Jul 1 22:35:26 2000 +++ xc/programs/Xserver/hw/xfree86/xf86Version.h Mon Dec 18 00:55:35 2000 @@ -1,11 +1,11 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/xf86Version.h,v 3.441 2000/07/02 02:35:26 dawes Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/xf86Version.h,v 3.460 2000/12/18 05:55:35 dawes Exp $ */ -#define XF86_VERSION " 4.0.1 " +#define XF86_VERSION " 4.0.2 " /* The finer points in versions... */ #define XF86_VERSION_MAJOR 4 #define XF86_VERSION_MINOR 0 -#define XF86_VERSION_SUBMINOR 1 +#define XF86_VERSION_SUBMINOR 2 #define XF86_VERSION_BETA 0 /* 0="", 1="A", 2="B", etc... */ #define XF86_VERSION_ALPHA 0 /* 0="", 1="a", 2="b", etc... */ @@ -18,6 +18,6 @@ XF86_VERSION_BETA, \ XF86_VERSION_ALPHA) -#define XF86_DATE "1 July 2000" +#define XF86_DATE "18 December 2000" /* $XConsortium: xf86Version.h /main/78 1996/10/28 05:42:10 kaleb $ */ Index: xc/INSTALL-X.org diff -u /dev/null xc/INSTALL-X.org:1.1 --- /dev/null Mon Dec 18 14:20:57 2000 +++ xc/INSTALL-X.org Sun Dec 17 21:45:44 2000 @@ -0,0 +1,801 @@ + + + + + + + + + + Building and Installing X11R6.4 + + + + + + + + Kaleb S. KEITHLEY + + The Open Group X Project Team + + + + + + + 30 January, 1998 + + + + + + + +Copyright (C) 1998 The Open Group + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the Software), +to use the Software without restriction, including, without limitation, +the rights to copy, modify, merge, publish, distribute and sublicense +the Software, to make, have made, license and distribute derivative +works thereof, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and the following permission notice shall be +included in all copies 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 MERCHANTABIL- +ITY, FITNESS FOR A PARTICULAR PURPOSE AND NON- INFRINGEMENT. IN NO EVENT +SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER USEABILI- +TIY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF, OR IN CONNNECTION WITH THE SOFTWARE OR THE USE OF 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 use or other dealings +in this Software without prior written authorization from The Open +Group. + +X Window System is a trademark of The Open Group. + + +1. Introduction + +This document is the installation notes that were provided with The Open +Group's X11R6.4 release. If you're building XFree86, it can be used as +a rough guide. Be aware that most of the details are not targetted +specifically at the current XFree86 source tree. XFree86-specific docu- +mentation can be found in the xc/programs/Xserver/hw/xfree86/doc direc- +tory and on-line at http://www.xfree86.org/current/. Some of the docu- +mentation there is out of date, so also be aware of that. There is cur- +rently no up to date document specifically targetted at building XFree86 +from source. + + +2. Easy Build Instructions + +This quick summary is no substitute for reading the full build instruc- +tions later in this document. + +Edit xc/config/cf/site.def for local preferences. If you want to +install somewhere other than /usr/X11R6.4, change ProjectRoot. (Do not +use DESTDIR.) If you want to build with gcc uncomment the HasGcc2 line. +If you have gcc, but not cc, please read the full build instructions. + +If some time has elapsed since the initial release of R6.4, check to see +if any public patches have been released. The source tar files may have +been updated -- check the patch-level line in the bug-report template. +If the source in the tar files has not been updated then get all the +patches and apply them, following the instructions at the top of each +patch. Ignore the rebuild steps in the patch application instructions. + +Check the appropriate vendor-specific .cf file in xc/config/cf/ to make +sure that OSMajorVersion, OSMinorVersion, and OSTeenyVersion are set +correctly for your system. On most systems imake will figure these out +automatically; but you may override them in your xc/config/cf/site.def +if you want. + +See if there is a BootstrapCFlags mentioned in the comments in the ven- +dor-specific .cf file. (Most systems don't have or need one. The Boot- +strapCFlags in sun.cf is for SunOS 4.0.x, so if you're building on SunOS +4.1.x or SunOS 5/Solaris 2 then BootstrapCFlags doesn't apply.) If there +isn't one, cd to the xc directory and type (in csh): + + % make World >& world.log + + +If there is an applicable BootstrapCFlags, take its value and type: + + % make World BOOTSTRAPCFLAGS="value" >& world.log + + +Do not call the output file "make.log" when doing "make World". After a +successful build, you can install with: + + % make install >& install.log + + +You can install manual pages with: + + % make install.man >& man.log + + +While the system is building (or if things fail), read the rest of these +installation instructions. + + + +3. Building and Installing R6.4 + + +Historically the MIT X Consortium and The X Consortium, Inc., sample +implementation releases have always been source-code-only releases, and +this release is no different. + + +3.1. Introduction + + +Every release of X has been progressively easier to configure, build, +and install than the preceding releases -- and we believe this release +is the easiest release to build yet. That not withstanding, if things do +go amiss during the build we assume that you have the basic skills nec- +essary, and the willingness, to debug any errors that may occur in the +build process. When you install, if you're going to use xdm or replace +your system's old X, we assume you have a basic understanding of your +system's initialization process. For Remote Execution (RX, embedding) we +assume you that you understand the fundamentals of HTTP, CGI, and HTML. +If these assumptions are not correct then you should consider finding +someone who has proficiency in these areas to do the build and install +for you. + +After the release has been out for a while more up to date information +about any newly-discovered problems may be found in the Frequently Asked +Questions posting appearing monthly on the Usenet newsgroup comp.win- +dows.x and xpert mailing list. The FAQ is also available via anonymous +FTP from ftp://ftp.x.org/ in the file ftp://ftp.x.org/con- +trib/faqs/FAQ.Z, or possibly on one of X mirror sites. + + +3.2. Preparing Your Build System + + +The source is distributed in four gzip compressed UNIX Tape ARchive +(tar) files. You will need about 200 Mb of disk space in order to unpack +and build the release. Installing requires an additional 30-50 Mb assum- +ing you have shared libraries (80-100 Mb without). + +On non-UNIX systems you'll need a utility that can extract gzip com- +pressed tar files to extract the sources. There are several to chose +from, we do not make recommendations about which one you should use. + +Release 6.4 sources are distributed among the tar files as follows: + + + tog-1.tar contains everything in xc/ that isn't in the other tar files + tog-2.tar contains xc/fonts + tog-3.tar contains xc/doc/specs, xc/util + tog-4.tar contains xc/doc/hardcopy + + +If you define BuildFonts to NO in your site.def file, then you only need +to unpack tog-1.tar to build. If you build fonts, then you will also +need tog-2.tar to build. If you already have the fonts from prior +releases you can use those instead of downloading them again. We presume +that you know how to copy or move them from your old source tree to the +R6.4 source tree. + + +3.3. Unpacking the Distribution + + +Create a directory to hold the sources and cd into it: + + % mkdir sourcedir + % cd sourcedir + +Then for each tar file tog-*.tar.gz, execute this: + + % gunzip -c ftp-dir/tog-N.tar.gz | tar xf - + + +or if you have GNU's tar (FreeBSD, NetBSD, OpenBSD, or Linux too) + + % tar xzf ftp-dir/tog-N.tar.gz + + + +3.4. Applying Patches + + +If some time has elapsed since the initial release of R6.4, check to see +if any public patches have been released. The source tar files may have +been updated -- check the patch-level line in the bug-report template. +If the source in the tar files has not been updated then get all the +patches and apply them, following the instructions at the top of each +patch. Ignore the rebuild steps in the patch application instructions. + +See the section "Public Patches" later in this document. + +Then continue here. + + +3.5. Configuration Parameters (Imake Variables) + + +This release, like all the releases before it, uses imake, a utility for +creating system-specific Makefiles from system-independent Imakefiles. +Almost every directory in the release contains an Imakefile. System-spe- +cific configuration information is located in xc/config/cf/, which is +used by the imake program every time a Makefile is generated in the +source tree. + +Most of the configuration work prior to building the release is to set +parameters (imake variables) so that imake will generate correct Make- +files. If you're building on one of the supported systems almost no con- +figuration work should be necessary. + +You should define your configuration parameters in xc/con- +fig/cf/site.def. We provide an empty site.def file and a site.sample +file. The site.sample file is a suggested site.def file -- use it at +your own risk. + +Any public patches we release will never patch site.def, so you can be +assured that applying a public-patch will not corrupt your site.def +file. On rare occasion you may need to make the change in your vendor- +specific .cf file; but you should avoid doing that if at all possible +because any patch we might release could conceivably patch your vendor- +specific .cf file and your change may be lost or garbled. You can over- +ride most of the things in your vendor-specific .cf file in your +site.def file. (If you can't, it's a bug -- please file a bug-report.) + +On the systems we use here, imake will automatically determine the OSMa- +jorVersion, OSMinorVersion, and OSTeenyVersion for your system. If your +system isn't one of the systems we build on here, or you want to build +for a different version of your operating system, then you can override +them in the appropriate entry in your site.def file. + +The site.def file has two parts, one protected with "#ifdef BeforeVen- +dorCF" and one with "#ifdef AfterVendorCF". The file is actually pro- +cessed twice, once before the .cf file and once after. About the only +thing you need to set in the "before" section is HasGcc2; just about +everything else can be set in the "after" section. + +The site.sample also has commented out support to include another file, +host.def. This scheme may be useful if you want to set most parameters +site-wide, but some parameters vary from machine to machine. If you use +a symbolic link tree, you can share site.def across all machines, and +give each machine its own copy of host.def. + +The config parameters are listed in xc/config/cf/README, but here are +some of the new or more common parameters that you may wish to set in +your xc/config/cf/site.def. + +ProjectRoot + The destination where X will be installed. This variable needs to + be set before you build, as some programs that read files at run- + time have the installation directory compiled in to them. + +HasVarDirectory + Set to NO if your system doesn't have /var or you don't want cer- + tain files to be installed in VarDirectory. + +VarDirectory + The location of site editable configuration and run-time files. + Many sites prefer to install their X binaries on read-only media -- + either a disk slice (partition) that's mounted read-only for added + security, an NFS volume mounted read-only for security and/or + improved VM paging characteristics, or from a live filesystem on a + CD-ROM. In order to simplify things like installing app-default + files for locally built software, and allowing editing of miscella- + neous configuration and policy files, and to allow xdm to create + its master Xauthority file, some directories under $Project- + Root/lib/X11 are actually installed in /var/X11, and $Project- + Root/lib/X11 contains symlinks to the directories in /var/X11. + +HasGcc2 + Set to YES to build with gcc version 2.x instead of your system's + default compiler. + +BuildXInputExt + Set to YES to build the X Input Extension. This extension requires + device-dependent support in the X server, which exists only in Xhp + and XF86_* in the sample implementation. + +DefaultUsrBin + This is a directory where programs will be found even if PATH is + not set in the environment. It is independent of ProjectRoot and + defaults to /usr/bin. It is used, for example, when connecting from + a remote system via rsh. The rstart program installs its server in + this directory. + +InstallServerSetUID + Some systems require the X server to run as root to access the + devices it needs. If you are on such a system and will not be using + xdm, you may set this variable to YES to install the X server + setuid to root; however the X Project Team strongly recommends that + you not install your server suid-root, but that you use xdm + instead. Talk to your system manager before setting this variable + to YES. + +InstallXdmConfig + By default set to NO, which suppresses installing xdm config files + over existing ones. Leave it set to NO if your site has customized + the files in $ProjectRoot/lib/X11/xdm, as many sites do. If you + don't install the new files, merge any changes present in the new + files. + +MotifBC + Causes Xlib and Xt to work around some bugs in older versions of + Motif. Set to YES only if you will be linking with Motif version + 1.1.1, 1.1.2, or 1.1.3. + +GetValuesBC + Setting this variable to YES allows illegal XtGetValues requests + with NULL ArgVal to usually succeed, as R5 did. Some applications + erroneously rely on this behavior. Support for this will be removed + in a future release. + +The following vendor-specific .cf files are in the release but have not +been tested recently and hence probably need changes to work: apollo.cf, +bsd.cf, convex.cf, DGUX.cf, luna.cf, macII.cf, Mips.cf, moto.cf, Oki.cf, +pegasus.cf, x386.cf. Amoeba.cf is known to require additional patches. + +The file xc/lib/Xdmcp/Wraphelp.c, for XDM-AUTHORIZATION-1, is not +included in this release. See ftp://ftp.x.org/pub/R6.4/xdm-auth/README. + + +3.6. System Build Notes + + +This section contains hints on building X with specific compilers and +operating systems. + +If the build isn't finding things right, make sure you are using a com- +piler for your operating system. For example, a pre-compiled gcc for a +different OS (e.g. as a cross-compiler) will not have right symbols +defined, so imake will not work correctly. + + +3.6.1. gcc + +X will not compile on some systems with gcc version 2.5, 2.5.1, or 2.5.2 +because of an incorrect declaration of memmove() in a gcc fixed include +file. + +If you are using a gcc version prior to 2.7 on Solaris x86, you need to +specify BOOTSTRAPCFLAGS="-Dsun" in the "make World" command. + +If you're building on a system that has an unbundled compiler, e.g. +Solaris 2.x, and you do not have the cc compiler, you need to contrive +to have cc in your path in order to bootstrap imake. One way to do this +is to create a symlink cc that points to gcc. + + % cd /usr/local/bin; ln -s path-to-gcc cc + +Once imake has been built all the Makefiles created with it will explic- +itly use gcc and you can remove the symlink. Another way around this is +to edit xc/config/imake/Makefile.ini to specify gcc instead of cc. + + +3.6.2. Other GNU tools + +Use of the GNU BinUtils assembler, as, and linker, ld, is not supported +-- period! If you have them installed on your system you must rename or +remove them for the duration of the R6.4 build. (You can restore them +afterwards.) + +The system-supplied make works just fine for building R6.4 and that's +what we suggest you use. If you've replaced your system's make with GNU +make then we recommend that you restore the system make for the duration +of your R6.4 build. After R6.4 is done building you can revert to GNU +make. GNU make on most systems (except Linux, where it is the default +make) is not a supported build configuration. GNU make may work for you, +and if it does, great; but if it doesn't we do not consider it a bug in +R6.4. If, after this admonition, you still use GNU make and your build +fails, reread the above, and retry the build with the system's make +before you file a bug-report. + + +3.6.3. IBM AIX 4.x + + +On AIX 4.x, the file lib/font/Type1/objects.c must be compiled without +optimization (-O) or the X server and fontserver will exit when Type 1 +fonts are used. + + +3.6.4. SunOS 4.0.x + + +SunOS 4.0 and earlier need BOOTSTRAPCFLAGS=-DNOSTDHDRS because it does +not have unistd.h and stdlib.h. Do not supply a BOOTSTRAPCFLAGS when +building any SunOS 4.1 or 5.x (Solaris 2) version. + + +3.6.5. Linux + + +On Linux systems imake has preliminary support to automatically deter- +mine which Linux distribution you're using. At this time it only auto- +matically detects S.u.S.E. Linux. On other Linux systems you should set +the LinuxDistribution parameter in your xc/config/cf/site.def -- see the +xc/config/cf/linux.cf file for the list of valid values. On Linux sys- +tems imake will also automatically determine which version of libc and +binutils your system has. You may override these in your xc/con- +fig/cf/site.def file. + +Many distributions of Linux have poor or no support for ANSI/POSIX/ISO C +locale support. If your Linux distribution is one of these you should +make certain that the imake variable LinuxLocaleDefines is set to +-DX_LOCALE so that compose processing and other internationalization +features will work correctly. To help decide if you should use +-DX_LOCALE, look in /usr/share/locale -- if it's empty, you should prob- +ably use the -DX_LOCALE define. + + +3.6.6. Microsoft Windows NT + + +All of the base libraries are supported, including multi-threading in +Xlib and Xt, but some of the more complicated applications, specifically +xterm and xdm, are not supported. + +There are also some other rough edges in the implementation, such as +lack of support for non-socket file descriptors as Xt alternate inputs +and not using the registry for configurable parameters like the system +filenames and search paths. + +The Xnest server has been made to run on NT; although it still requires +a real X server for output still. A real X server can not be built from +these sources -- in order to display X applications on a MS-Windows host +you will have to acquire a real X Server. + +You have several choices for imake's RmTreeCmd. Look at the possible +definitions in the xc/config/cf/Win32.cf file, choose one that's right +for you, and add it to your xc/config/cf/site.def file. + + +3.7. The Build + + +For all the supported UNIX and UNIX-like systems you can simply type (in +csh): + + % make World >& world.log + +You can call the output file something other than "world.log"; but don't +call it "make.log" because files with this name are automatically +deleted during the initial "cleaning" stage of the build. + +The build can take several hours on older systems, and may take as lit- +tle as an hour on the faster systems that are available today. On UNIX +and UNIX-like systems you may want to run it in the background and keep +a watch on the output. For example: + + % make World >& world.log & + % tail -f world.log + + +If something goes wrong, the easiest thing is to correct the problem and +start over again, i.e. typing "make World". + + +3.7.1. UNIX and UNIX-like systems + + +Check your vendor-specific .cf file; if it doesn't have BootstrapCFlags +that apply to your version of the operating system then type (in csh): + + % make World >& world.log + + +Otherwise type (in csh): + + % make World BOOTSTRAPCFLAGS="value" >& world.log + + +None of the supported operating systems need to use BOOTSTRAPCFLAGS. + + +3.7.2. Microsoft Windows NT + + +On NT, make certain your Path, Include, and Lib environment variables +are set accordingly. For example here we use the command line compiler +in VC++ 4.0 Standard Edition, which is installed in C:\MSDEVSTD. To +setup the environment type: + + > set Path=old-path;C:\MSDEVSTD\bin;C:\path-to-RmTreeCmd + > set Include=C:\MSDEVSTD\include + > set Lib=C:\MSDEVSTD\lib + +Then to build, at the prompt, type: + + C:\> nmake World.Win32 > world.log + + + +3.8. Installing X + + +After the build has successfully completed you can install the software +by typing the following as root: + + % make install >& install.log + +or on Microsoft Windows NT + + C:\> nmake install > install.log + + +Again, you might want to run this in the background and use tail to +watch the progress. + +You can install the manual pages by typing the following as root: + + % make install.man >& man.log + + + +3.9. Shared Libraries + + +The version number of some of the the shared libraries has been changed. +On SunOS 4, which supports minor version numbers for shared libraries, +programs linked with the R6.4 libraries will use the new libraries with +no special action required. + +On most other modern operating systems the version portion of the +library name, i.e. "6.1" portion of "libX11.so.6.1" is a string. Even if +it's only one character long, e.g. "1" (as in libX11.so.1) it's still a +string. This string uniquely identifies and distinguishes one version of +the library from another. Even though all the libraries in this release +are compatible with the libraries from previous releases, and there's +otherwise no reason to change the version string, we do it to identify +which source release the libraries were built from. + +An old program that was linked with libXext.so.6.3 won't run if you +delete libXext.so.6.3 and install libXext.so.6.4 in its place. In gen- +eral on these systems you have the following choices: + +1. Keep the old versions of the libraries around. + +2. Relink all applications with the new libraries. + +3. Create a symlink using the old name which points to the new name. + + For example, to have programs that were linked against libX- + ext.so.6.3 use libXext.so.6.4, make this symlink: + + % cd $ProjectRoot/lib + % ln -s libXext.so.6.4 libXext.so.6.3 + + +On some distributions of Linux the run-time loader is broken -- requir- +ing that the library's internal SONAME match the filename -- and the +symlink solution won't work. We recommend that you get a new run-time +loader which is not broken or recompile your run-time loader to not +require that the SONAME match. + + +3.10. Setting Up xterm + + +If your /etc/termcap and /usr/lib/terminfo databases do not have correct +entries for xterm, use the sample entries provided in the directory +xc/programs/xterm/. System V users may need to compile and install the +terminfo entry with the tic utility. + +Since each xterm will need a separate pseudoterminal, you need a reason- +able number of them for normal execution. You probably will want at +least 32 on a small, multiuser system. On most systems, each pty has two +devices, a master and a slave, which are usually named +/dev/tty[pqrstu][0-f] and /dev/pty[pqrstu][0-f]. If you don't have at +least the "p" and "q" sets configured (try typing "ls /dev/?ty??"), you +should have your system administrator add them. This is commonly done +by running the MAKEDEV script in the /dev directory with appropriate +arguments. + + +3.11. Starting Servers Automatically at System Boot + + +The xfs and xdm programs are designed to be run automatically at system +startup. Please read the manual pages for details on setting up configu- +ration files; reasonable sample files are in xc/programs/xdm/config/ and +xc/programs/xfs/. + +Since xfs can serve fonts over the network, you do not need to run a +font server on every machine with an X display. You should start xfs +before xdm, since xdm may start an X server which is a client of (depen- +dent on) the font server. + + +3.11.1. On BSD-based systems using /etc/rc or /etc/rc.local + + +If your system uses an /etc/rc or /etc/rc.local file at boot time, you +can usually enable these programs by placing the following at or near +the end of the file: + + if [ -f $ProjectRoot/bin/xfs ]; then + $ProjectRoot/bin/xfs & echo -n ' xfs' + fi + + if [ -f $ProjectRoot/bin/xdm ]; then + $ProjectRoot/bin/xdm; echo -n ' xdm' + fi + + +On later versions of FreeBSD the preferred way of doing this is to cre- +ate the directory $ProjectRoot/etc/rc.d. Add this directory to the +local_startup variable defined in /etc/rc.conf, and then create short +scripts in this directory to start xfs and xdm. + +If you are unsure about how system boot works, or if your system does +not use /etc/rc, consult your system administrator for help. + + +3.11.2. On Linux systems + + +Most Linux distributions have an /etc/inittab entry specifically for +xdm. Depending on your distribution this may be run-level three, four, +or five. To use xdm, edit /etc/inittab and find the line which contains +initdefault and change it from 2 to the appropriate run-level + +You Linux distribution may already have a script to start xdm at a par- +ticular run-level. For example on S.u.S.E. Linux 5.0 there is the file +/sbin/init.d/xdm, and the symlink /sbin/init.d/rc3.d/S30xdm which points +to /sbin/init.d/xdm. Change /sbin/init.d/xdm to use $Project- +Root/bin/xdm. You can use the xdm script as a model write an xfs script. +Depending on your Linux distribution you may find these files in +/etc/init.d instead of /sbin/init.d. + + +3.11.3. On Digital Unix, HPUX 10, and SVR4 systems + + +Most systems run xdm by default at some particular run-level of the sys- +tem. There is a master init.d file and a run-level symlink rc?.d that +points to the master init.d file: + + Operating System rc?.d symlink init.d file + + Digital Unix 4.0 /sbin/rc3.d/S95xlogin /sbin/init.d/xlogin + HPUX 10.20 /sbin/rc3.d/S800xdm /sbin/init.d/xdm + Solaris 2.[0-4] + Solaris 2.5 /etc/rc3.d/S99xdm /etc/init.d/xdm.rc + Solaris 2.6 /etc/rc2.d/S99dtlogin /etc/init.d/dtlogin + IRIX 6.2 /etc/rc2.d/S98xdm /etc/init.d/xdm + Unixware /etc/rc2.d/S69xdm /etc/init.d/xdm + +In general you can edit the init.d file to use $ProjectRoot/bin/xdm. You +can use the xdm file as a model to write an /etc/rc?.d/S??xfs file to +start xfs. Some systems may already have files to start xfs. Starting in +Solaris 2.5 Sun uses inetd to start xfs -- you should remove the xfs +entries from /etc/inetd.conf and /etc/services before adding xfs to the +run-level files. + + +3.11.4. On SystemV-based systems + + +On systems with a /etc/inittab file, you can edit this file to add the +lines + + xfs:3:once:$ProjectRoot/bin/xfs + xdm:3:once:$ProjectRoot/bin/xdm + + + + +3.12. Using OPEN LOOK applications + + +You can use the X11R6.x Xsun server with OPEN LOOK applications; but you +must pass the -swapLkeys flag to the server on startup, or the OPEN LOOK +Undo, Copy, Paste, Find, and Cut keys may not work correctly. For exam- +ple, to run Sun's OpenWindows 3.3 desktop environment with an X11R6 +server, use the command: + + % openwin -server $ProjectRoot/bin/Xsun -swapLkeys + + +The keysyms reported by keys on the numeric keypad have also changed +since X11R5; if you find that OpenWindows applications do not respond to +keypad keys and cursor control keys when using an R6 server, you can +remap the keypad to generate R5 style keysyms using the following +xmodmap commands: + + keysym Pause = F21 + keysym Print = F22 + keysym Break = F23 + keysym KP_Equal = F24 + keysym KP_Divide = F25 + keysym KP_Multiply = F26 + keysym KP_Home = F27 + keysym KP_Up = Up + keysym KP_Prior = F29 + keysym KP_Left = Left + keycode 100 = F31 + keysym KP_Right = Right + keysym KP_End = F33 + keysym KP_Down = Down + keysym KP_Next = F35 + keysym KP_Insert = Insert + keysym KP_Delete = Delete + + + +3.13. Rebuilding after Patches + + +Eventually you are going to make changes to the sources, for example by +applying any public patches that may be released or to fix any bugs you +may have found. + +If only source files are changed, rebuild by going to the base of your +source tree xc and typing: + + % make >& make.log + + +If there are imake configuration file changes, the best thing to do is +type: + + % make Everything >& every.log + + +"Everything" is similar to "World" in that it rebuilds every Makefile, +but unlike "World" it does not delete the existing objects, libraries, +and executables, and only rebuilds what is out of date. + + +3.14. Formatting the Documentation + + +The PostScript files in xc/doc/hardcopy can be generated from the +sources in xc/doc/specs. Most of the documentation is in troff using the +-ms macros. The easiest way to format it is to use the Imakefiles pro- +vided. + +Set the name of your local troff program by setting the variable Trof- +fCmd in xc/config/cf/site.def. Then build the Makefiles: + + cd xc/doc + make SUBDIRS=specs Makefiles + + +Finally, go to the directory you are interested in and type "make" +there. This command will generate .PS files. You can also generate text +files by specifying the document name with a .txt extension as a make +target, e.g., "make icccm.txt". + + +4. Public Patches + + +The Open Group X Project Team may from time to time issue public patches +for this release to fix any serious problems that are discovered. Such +fixes are a subset of fixes available to X Project Team members. Public +patches are available via anonymous FTP from +ftp://ftp.x.org/pub/R6.4/fixes, or from your local X mirror site. Check +the site closest to you first. + +You can determine which public patches have already been applied to your +source tree by examining the "VERSION" line of xc/bug-report. The source +in the tar files you have may already have some patches applied; you +only need to apply later patches. If you try to apply patches out of +order or apply patches that are already in your tree, patch will tell +you that you have the wrong version and not apply the patch. + +Source for the patch program is in xc/util/patch/. The patch program +included on some systems may not support all the options this version +has. If you have problems applying patches, or if you're otherwise in +doubt, use this version. + + Index: xc/INSTALL.PS diff -u xc/INSTALL.PS:1.1.1.5 xc/INSTALL.PS:removed --- xc/INSTALL.PS:1.1.1.5 Sun Sep 27 03:48:06 1998 +++ xc/INSTALL.PS Mon Dec 18 14:20:57 2000 @@ -1,1168 +0,0 @@ -%!PS-Adobe-3.0 -%%Creator: groff version 1.11 -%%CreationDate: Thu Feb 5 15:35:28 1998 -%%DocumentNeededResources: font Times-Roman -%%+ font Times-Bold -%%+ font Times-Italic -%%DocumentSuppliedResources: procset grops 1.11 0 -%%Pages: 15 -%%PageOrder: Ascend -%%Orientation: Portrait -%%EndComments -%%BeginProlog -%%BeginResource: procset grops 1.11 0 -/setpacking where{ -pop -currentpacking -true setpacking -}if -/grops 120 dict dup begin -/SC 32 def -/A/show load def -/B{0 SC 3 -1 roll widthshow}bind def -/C{0 exch ashow}bind def -/D{0 exch 0 SC 5 2 roll awidthshow}bind def -/E{0 rmoveto show}bind def -/F{0 rmoveto 0 SC 3 -1 roll widthshow}bind def -/G{0 rmoveto 0 exch ashow}bind def -/H{0 rmoveto 0 exch 0 SC 5 2 roll awidthshow}bind def -/I{0 exch rmoveto show}bind def -/J{0 exch rmoveto 0 SC 3 -1 roll widthshow}bind def -/K{0 exch rmoveto 0 exch ashow}bind def -/L{0 exch rmoveto 0 exch 0 SC 5 2 roll awidthshow}bind def -/M{rmoveto show}bind def -/N{rmoveto 0 SC 3 -1 roll widthshow}bind def -/O{rmoveto 0 exch ashow}bind def -/P{rmoveto 0 exch 0 SC 5 2 roll awidthshow}bind def -/Q{moveto show}bind def -/R{moveto 0 SC 3 -1 roll widthshow}bind def -/S{moveto 0 exch ashow}bind def -/T{moveto 0 exch 0 SC 5 2 roll awidthshow}bind def -/SF{ -findfont exch -[exch dup 0 exch 0 exch neg 0 0]makefont -dup setfont -[exch/setfont cvx]cvx bind def -}bind def -/MF{ -findfont -[5 2 roll -0 3 1 roll -neg 0 0]makefont -dup setfont -[exch/setfont cvx]cvx bind def -}bind def -/level0 0 def -/RES 0 def -/PL 0 def -/LS 0 def -/MANUAL{ -statusdict begin/manualfeed true store end -}bind def -/PLG{ -gsave newpath clippath pathbbox grestore -exch pop add exch pop -}bind def -/BP{ -/level0 save def -1 setlinecap -1 setlinejoin -72 RES div dup scale -LS{ -90 rotate -}{ -0 PL translate -}ifelse -1 -1 scale -}bind def -/EP{ -level0 restore -showpage -}bind def -/DA{ -newpath arcn stroke -}bind def -/SN{ -transform -.25 sub exch .25 sub exch -round .25 add exch round .25 add exch -itransform -}bind def -/DL{ -SN -moveto -SN -lineto stroke -}bind def -/DC{ -newpath 0 360 arc closepath -}bind def -/TM matrix def -/DE{ -TM currentmatrix pop -translate scale newpath 0 0 .5 0 360 arc closepath -TM setmatrix -}bind def -/RC/rcurveto load def -/RL/rlineto load def -/ST/stroke load def -/MT/moveto load def -/CL/closepath load def -/FL{ -currentgray exch setgray fill setgray -}bind def -/BL/fill load def -/LW/setlinewidth load def -/RE{ -findfont -dup maxlength 1 index/FontName known not{1 add}if dict begin -{ -1 index/FID ne{def}{pop pop}ifelse -}forall -/Encoding exch def -dup/FontName exch def -currentdict end definefont pop -}bind def -/DEFS 0 def -/EBEGIN{ -moveto -DEFS begin -}bind def -/EEND/end load def -/CNT 0 def -/level1 0 def -/PBEGIN{ -/level1 save def -translate -div 3 1 roll div exch scale -neg exch neg exch translate -0 setgray -0 setlinecap -1 setlinewidth -0 setlinejoin -10 setmiterlimit -[]0 setdash -/setstrokeadjust where{ -pop -false setstrokeadjust -}if -/setoverprint where{ -pop -false setoverprint -}if -newpath -/CNT countdictstack def -userdict begin -/showpage{}def -}bind def -/PEND{ -clear -countdictstack CNT sub{end}repeat -level1 restore -}bind def -end def -/setpacking where{ -pop -setpacking -}if -%%EndResource -%%IncludeResource: font Times-Roman -%%IncludeResource: font Times-Bold -%%IncludeResource: font Times-Italic -grops begin/DEFS 1 dict def DEFS begin/u{.001 mul}bind def end/RES 72 -def/PL 792 def/LS false def/ENC0[/asciicircum/asciitilde/Scaron/Zcaron -/scaron/zcaron/Ydieresis/trademark/quotesingle/.notdef/.notdef/.notdef -/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef -/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef -/.notdef/.notdef/space/exclam/quotedbl/numbersign/dollar/percent -/ampersand/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen -/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon -/semicolon/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O -/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright/circumflex -/underscore/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y -/z/braceleft/bar/braceright/tilde/.notdef/quotesinglbase/guillemotleft -/guillemotright/bullet/florin/fraction/perthousand/dagger/daggerdbl -/endash/emdash/ff/fi/fl/ffi/ffl/dotlessi/dotlessj/grave/hungarumlaut -/dotaccent/breve/caron/ring/ogonek/quotedblleft/quotedblright/oe/lslash -/quotedblbase/OE/Lslash/.notdef/exclamdown/cent/sterling/currency/yen -/brokenbar/section/dieresis/copyright/ordfeminine/guilsinglleft -/logicalnot/minus/registered/macron/degree/plusminus/twosuperior -/threesuperior/acute/mu/paragraph/periodcentered/cedilla/onesuperior -/ordmasculine/guilsinglright/onequarter/onehalf/threequarters -/questiondown/Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE -/Ccedilla/Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex -/Idieresis/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis -/multiply/Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn -/germandbls/agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla -/egrave/eacute/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis -/eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis/divide/oslash -/ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis]def -/Times-Italic@0 ENC0/Times-Italic RE/Times-Bold@0 ENC0/Times-Bold RE -/Times-Roman@0 ENC0/Times-Roman RE -%%EndProlog -%%Page: 1 1 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Roman@0 SF 531.38(-- --)0 4 R/F1 14/Times-Bold@0 SF -(Building and Installing X11R6.4)209.526 120 Q/F2 10/Times-Italic@0 SF -(Kaleb S. KEITHLEY)264.745 216 Q F0(The Open Group X Project T)239.56 -234 Q(eam)-.7 E(30 January)272.025 318 Q 2.5(,1)-.65 G(998)-2.5 E EP -%%Page: 2 2 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Roman@0 SF 531.38(-- --)0 4 R/F1 11/Times-Roman@0 SF(Cop)72 -192 Q(yright \251 1998 The Open Group)-.11 E/F2 9/Times-Roman@0 SF -(Permission is hereby granted, free of char)72 206.6 Q(ge, to an)-.162 E -2.25(yp)-.135 G(erson obtaining a cop)-2.25 E 2.25(yo)-.09 G 2.25(ft) --2.25 G(his softw)-2.25 E(are and associated documentation \214les)-.09 -E(\(the Softw)72 217.6 Q(are\), to use the Softw)-.09 E(are without res\ -triction, including, without limitation, the rights to cop)-.09 E 1.17 --.585(y, m)-.09 H(odify).585 E 2.25(,m)-.585 G(er)-2.25 E(ge, publish,) --.162 E(distrib)72 228.6 Q(ute and sublicense the Softw)-.18 E -(are, to mak)-.09 E(e, ha)-.09 E .27 -.135(ve m)-.18 H -(ade, license and distrib).135 E(ute deri)-.18 E -.225(va)-.225 G(ti) -.225 E .27 -.135(ve w)-.225 H(orks thereof, and to permit persons).045 E -(to whom the Softw)72 239.6 Q -(are is furnished to do so, subject to the follo)-.09 E -(wing conditions:)-.225 E(The abo)72 254.2 Q .27 -.135(ve c)-.135 H(op) -.135 E(yright notice and the follo)-.09 E -(wing permission notice shall be included in all copies of the Softw) --.225 E(are:)-.09 E(THE SOFTW)72 268.8 Q(ARE IS PR)-1.08 E -.45(OV)-.36 -G(IDED AS IS, WITHOUT W).45 E -(ARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING,)-1.08 E -.09(BU)72 -279.8 S 2.25(TN).09 G .72 -.36(OT L)-2.25 H(IMITED T).36 E(O, THE W) --.162 E(ARRANTIES OF MERCHANT)-1.08 E(ABILITY)-.837 E 2.25(,F)-1.161 G -(ITNESS FOR A P)-2.25 E(AR)-.828 E(TICULAR PURPOSE AND)-.54 E -(NON- INFRINGEMENT)72 290.8 Q 2.25(.I)-.666 G 2.25(NN)-2.25 G 2.25(OE) --2.25 G(VENT SHALL THE OPEN GR)-2.25 E(OUP BE LIABLE FOR ANY CLAIM, D) --.36 E(AMA)-.36 E(GES OR)-.36 E -.36(OT)72 301.8 S(HER USEABILITIY).36 E -2.25(,W)-1.161 G(HETHER IN AN A)-2.25 E(CTION OF CONTRA)-.36 E(CT)-.36 E -2.25(,T)-.666 G(OR)-2.412 E 2.25(TO)-.54 G 2.25(RO)-2.25 G(THER)-2.61 E -(WISE, ARISING FR)-.495 E(OM, OUT OF)-.36 E(,)-.72 E -(OR IN CONNNECTION WITH THE SOFTW)72 312.8 Q(ARE OR THE USE OF O)-1.08 E -(THER DEALINGS IN THE SOFTW)-.36 E(ARE.)-1.08 E(Except as contained in \ -this notice, the name of The Open Group shall not be used in adv)72 -327.4 Q(ertising or otherwise to promote the use)-.135 E -(or other dealings in this Softw)72 338.4 Q -(are without prior written authorization from The Open Group.)-.09 E -2.25(XW)72 353 S(indo)-2.61 E 2.25(wS)-.225 G -(ystem is a trademark of The Open Group.)-2.25 E EP -%%Page: 1 3 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Roman@0 SF 531.38(-- --)0 4 R/F1 11/Times-Bold@0 SF 2.75 -(1. Easy)72 85 R(Build Instructions)2.75 E/F2 11/Times-Roman@0 SF -(This quick summary is no substitute for reading the full b)72 101.6 Q -(uild instructions later in this document.)-.22 E(Edit)72 118.2 Q F1 -(xc/con\214g/cf/site.def)2.75 E F2(for local preferences.)2.75 E -(If you w)5.5 E(ant to install some)-.11 E(where other than)-.275 E F1 -(/usr/X11R6.4)72 131.2 Q F2 2.75(,c)C(hange)-2.75 E F1(Pr)2.75 E -(ojectRoot)-.198 E F2 2.75(.\()C(Do)-2.75 E/F3 11/Times-Italic@0 SF(not) -2.75 E F2(use)2.75 E F1(DESTDIR)2.75 E F2 2.75(.\) If)B(you w)2.75 E -(ant to b)-.11 E(uild with)-.22 E F3(gcc)2.75 E F2(uncomment)2.75 E(the) -72 144.2 Q F1(HasGcc2)2.75 E F2 2.75(line. If)2.75 F(you ha)2.75 E -.165 -(ve)-.22 G F3(gcc)2.915 E F2 2.75(,b)C(ut not)-2.97 E F3(cc)2.75 E F2 -2.75(,p)C(lease read the full b)-2.75 E(uild instructions.)-.22 E(If so\ -me time has elapsed since the initial release of R6.4, check to see if \ -an)72 160.8 Q 2.75(yp)-.165 G(ublic patches ha)-2.75 E .33 -.165(ve b) --.22 H(een).165 E(released. The source tar \214les may ha)72 173.8 Q .33 --.165(ve b)-.22 H(een updated \212 check the patch-le).165 E -.165(ve) --.275 G 2.75(ll).165 G(ine in the b)-2.75 E(ug-report tem-)-.22 E(plate\ -. If the source in the tar \214les has not been updated then get all th\ -e patches and apply them, follo)72 186.8 Q(wing)-.275 E -(the instructions at the top of each patch. Ignore the reb)72 199.8 Q -(uild steps in the patch application instructions.)-.22 E -(Check the appropriate v)72 216.4 Q(endor)-.165 E(-speci\214c)-.22 E F1 -(.cf)2.75 E F2(\214le in)2.75 E F1(xc/con\214g/cf/)2.75 E F2(to mak)2.75 -E 2.75(es)-.11 G(ure that)-2.75 E F3(OSMajorV)2.75 E(er)-1.221 E(sion) --.11 E F2(,)A F3(OSMi-)2.75 E(norV)72 229.4 Q(er)-1.221 E(sion)-.11 E F2 -2.75(,a)C(nd)-2.75 E F3(OST)2.75 E(eenyV)-1.012 E(er)-1.221 E(sion)-.11 -E F2(are set correctly for your system. On most systems imak)2.75 E 2.75 -(ew)-.11 G(ill \214gure)-2.75 E(these out automatically; b)72 242.4 Q -(ut you may o)-.22 E -.165(ve)-.165 G(rride them in your).165 E F1 -(xc/con\214g/cf/site.def)2.75 E F2(if you w)2.75 E(ant.)-.11 E -(See if there is a)72 259 Q F3(Bootstr)2.75 E(apCFla)-.165 E(gs)-.11 E -F2(mentioned in the comments in the v)2.75 E(endor)-.165 E(-speci\214c) --.22 E F1(.cf)2.75 E F2(\214le. \(Most sys-)2.75 E(tems don')72 272 Q -2.75(th)-.198 G -2.475 -.22(av e)-2.75 H -(or need one. The BootstrapCFlags in)2.97 E F3(sun.cf)2.75 E F2 -(is for SunOS 4.0.x, so if you')2.75 E(re b)-.55 E(uilding on)-.22 E -(SunOS 4.1.x or SunOS 5/Solaris 2 then BootstrapCFlags doesn')72 285 Q -2.75(ta)-.198 G(pply)-2.75 E(.\) If there isn')-.715 E 2.75(to)-.198 G -(ne,)-2.75 E F3(cd)2.75 E F2(to the)2.75 E F1(xc)2.75 E F2 -(directory and type \(in csh\):)72 298 Q 2.75(%m)108 317 S(ak)-2.75 E -2.75(eW)-.11 G(orld >& w)-3.63 E(orld.log)-.11 E -(If there is an applicable)72 339.6 Q F1(BootstrapCFlags)2.75 E F2 2.75 -(,t)C(ak)-2.75 E 2.75(ei)-.11 G(ts v)-2.75 E(alue and type:)-.275 E 2.75 -(%m)108 358.6 S(ak)-2.75 E 2.75(eW)-.11 G(orld BOO)-3.63 E(TSTRAPCFLA) --.44 E(GS=")-.44 E F3(value)A F2 2.75(">)C 2.75(&w)-2.75 G(orld.log) --2.86 E(Do not call the output \214le `)72 381.2 Q(`mak)-.916 E(e.log') --.11 E 2.75('w)-.916 G(hen doing `)-2.75 E(`mak)-.916 E 2.75(eW)-.11 G -(orld')-3.63 E 2.75('. After)-.916 F 2.75(as)2.75 G(uccessful b)-2.75 E -(uild, you can)-.22 E(install with:)72 394.2 Q 2.75(%m)108 413.2 S(ak) --2.75 E 2.75(ei)-.11 G(nstall >& install.log)-2.75 E -1.21(Yo)72 435.8 S -2.75(uc)1.21 G(an install manual pages with:)-2.75 E 2.75(%m)108 454.8 S -(ak)-2.75 E 2.75(ei)-.11 G(nstall.man >& man.log)-2.75 E F1 -(While the system is b)72 477.4 Q(uilding \(or if things fail\), r)-.22 -E(ead the r)-.198 E(est of these installation instructions.)-.198 E 2.75 -(2. Building)72 529.4 R(and Installing R6.4)2.75 E F2(Historically the \ -MIT X Consortium and The X Consortium, Inc., sample implementation rele\ -ases ha)72 559 Q -.165(ve)-.22 G(al)72 572 Q -.11(wa)-.11 G -(ys been source-code-only releases, and this release is no dif).11 E -(ferent.)-.275 E F1 2.75(2.1. Intr)72 611 R(oduction)-.198 E F2(Ev)72 -640.6 Q(ery release of X has been progressi)-.165 E -.165(ve)-.275 G -(ly easier to con\214gure, b).165 E -(uild, and install than the preceding)-.22 E(releases \212 and we belie) -72 653.6 Q .33 -.165(ve t)-.275 H -(his release is the easiest release to b).165 E -(uild yet. That not withstanding, if things)-.22 E -(do go amiss during the b)72 666.6 Q(uild we assume that you ha)-.22 E -.33 -.165(ve t)-.22 H(he basic skills necessary).165 E 2.75(,a)-.715 G -(nd the willingness, to)-2.75 E(deb)72 679.6 Q(ug an)-.22 E 2.75(ye) --.165 G(rrors that may occur in the b)-2.75 E -(uild process. When you install, if you')-.22 E(re going to use)-.55 E -F3(xdm)2.75 E F2(or)2.75 E(replace your system')72 692.6 Q 2.75(so)-.605 -G(ld X, we assume you ha)-2.75 E .33 -.165(ve a b)-.22 H -(asic understanding of your system').165 E 2.75(si)-.605 G -(nitialization)-2.75 E(process. F)72 705.6 Q(or Remote Ex)-.165 E(ecuti\ -on \(RX, embedding\) we assume you that you understand the fundamentals\ - of)-.165 E(HTTP)72 718.6 Q 2.75(,C)-1.221 G(GI, and HTML. If these ass\ -umptions are not correct then you should consider \214nding someone) --2.75 E(who has pro\214cienc)72 731.6 Q 2.75(yi)-.165 G 2.75(nt)-2.75 G -(hese areas to do the b)-2.75 E(uild and install for you.)-.22 E(1) -303.25 769 Q EP -%%Page: 2 4 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Roman@0 SF 531.38(-- --)0 4 R/F1 11/Times-Roman@0 SF 2.75 -(XW)72 53 S(indo)-3.19 E 2.75(wS)-.275 G(ystem Installation V)-2.75 E -(ersion 11, Release 6.4)-1.221 E(After the release has been out for a w\ -hile more up to date information about an)72 85 Q 2.75(yn)-.165 G -.275 -(ew)-2.75 G(ly-disco).275 E -.165(ve)-.165 G(red prob-).165 E -(lems may be found in the)72 98 Q/F2 11/Times-Italic@0 SF -1.947 -.605 -(Fr e)2.75 H(quently Ask).605 E(ed Questions)-.11 E F1 -(posting appearing monthly on the Usenet ne)2.75 E(ws-)-.275 E -(group comp.windo)72 111 Q(ws.x and xpert mailing list. The F)-.275 E -1.21 -.605(AQ i)-.814 H 2.75(sa).605 G(lso a)-2.75 E -.275(va)-.22 G -(ilable via anon).275 E(ymous FTP from)-.165 E(ftp://ftp.x.or)72 124 Q -(g/ in the \214le ftp://ftp.x.or)-.198 E(g/contrib/f)-.198 E(aqs/F)-.11 -E -.605(AQ)-.814 G(.Z, or possibly on one of X mirror sites.).605 E/F3 -11/Times-Bold@0 SF 2.75(2.2. Pr)72 163 R(eparing Y)-.198 E -(our Build System)-1.221 E F1(The source is distrib)72 192.6 Q -(uted in four gzip compressed UNIX)-.22 E F3(T)2.75 E F1(ape)A F3(AR) -2.75 E F1(chi)A .33 -.165(ve \()-.275 H(tar\) \214les. Y).165 E -(ou will need about)-1.21 E -(200 Mb of disk space in order to unpack and b)72 205.6 Q -(uild the release. Installing requires an additional 30-50 Mb)-.22 E -(assuming you ha)72 218.6 Q .33 -.165(ve s)-.22 H -(hared libraries \(80-100 Mb without\).).165 E(On non-UNIX systems you') -72 235.2 Q(ll need a utility that can e)-.11 E -(xtract gzip compressed tar \214les to e)-.165 E(xtract the)-.165 E -(sources. There are se)72 248.2 Q -.165(ve)-.275 G -(ral to chose from, we do not mak).165 E 2.75(er)-.11 G -(ecommendations about which one you should)-2.75 E(use.)72 261.2 Q -(Release 6.4 sources are distrib)72 277.8 Q -(uted among the tar \214les as follo)-.22 E(ws:)-.275 E 67.674 -(tog-1.tar contains)108 300.4 R -2.365 -.275(ev e)2.75 H -(rything in xc/ that isn').275 E 2.75(ti)-.198 G 2.75(nt)-2.75 G -(he other tar \214les)-2.75 E 67.674(tog-2.tar contains)108 313.4 R -(xc/fonts)2.75 E 67.674(tog-3.tar contains)108 326.4 R -(xc/doc/specs, xc/util)2.75 E 67.674(tog-4.tar contains)108 339.4 R -(xc/doc/hardcop)2.75 E(y)-.11 E(If you de\214ne)72 362 Q F2(BuildF)2.75 -E(onts)-1.155 E F1(to NO in your)2.75 E F3(site.def)2.75 E F1 -(\214le, then you only need to unpack tog-1.tar to b)2.75 E -(uild. If you)-.22 E -.22(bu)72 375 S -(ild fonts, then you will also need tog-2.tar to b).22 E -(uild. If you already ha)-.22 E .33 -.165(ve t)-.22 H -(he fonts from prior releases you).165 E(can use those instead of do)72 -388 Q(wnloading them ag)-.275 E(ain. W)-.055 E 2.75(ep)-.88 G -(resume that you kno)-2.75 E 2.75(wh)-.275 G .55 -.275(ow t)-2.75 H 2.75 -(oc).275 G(op)-2.75 E 2.75(yo)-.11 G 2.75(rm)-2.75 G .33 -.165(ove t) --2.75 H(hem).165 E(from your old source tree to the R6.4 source tree.)72 -401 Q F3 2.75(2.3. Unpacking)72 440 R(the Distrib)2.75 E(ution)-.22 E F1 -(Create a directory to hold the sources and)72 469.6 Q F2(cd)2.75 E F1 -(into it:)2.75 E 2.75(%m)108 488.6 S(kdir)-2.75 E F2(sour)2.75 E(cedir) --.407 E F1 2.75(%c)108 501.6 S(d)-2.75 E F2(sour)2.75 E(cedir)-.407 E F1 -(Then for each tar \214le)72 520.6 Q F3(tog\255*.tar)2.75 E(.gz)-1.1 E -F1 2.75(,e)C -.165(xe)-2.915 G(cute this:).165 E 2.75(%g)108 539.6 S -2.75(unzip \255c)-2.75 F F2(ftp-dir)5.5 E F1(/tog\255)A F2(N)A F1(.tar)A -(.gz | tar xf)-.605 E5.5 E(or if you ha)72 562.2 Q .33 -.165(ve G) --.22 H(NU').165 E 2.75(st)-.605 G -(ar \(FreeBSD, NetBSD, OpenBSD, or Linux too\))-2.75 E 2.75(%t)108 581.2 -S(ar xzf)-2.75 E F2(ftp-dir)5.5 E F1(/tog\255)A F2(N)A F1(.tar)A(.gz) --.605 E F3 2.75(2.4. A)72 626.2 R(pplying P)-.275 E(atches)-.11 E F1(If\ - some time has elapsed since the initial release of R6.4, check to see \ -if an)72 655.8 Q 2.75(yp)-.165 G(ublic patches ha)-2.75 E .33 -.165 -(ve b)-.22 H(een).165 E(released. The source tar \214les may ha)72 668.8 -Q .33 -.165(ve b)-.22 H(een updated \212 check the patch-le).165 E -.165 -(ve)-.275 G 2.75(ll).165 G(ine in the b)-2.75 E(ug-report tem-)-.22 E(p\ -late. If the source in the tar \214les has not been updated then get al\ -l the patches and apply them, follo)72 681.8 Q(wing)-.275 E -(the instructions at the top of each patch. Ignore the reb)72 694.8 Q -(uild steps in the patch application instructions.)-.22 E -(See the section `)72 711.4 Q(`Public P)-.916 E(atches')-.165 E 2.75('l) --.916 G(ater in this document.)-2.75 E(2)303.25 769 Q EP -%%Page: 3 5 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Roman@0 SF 531.38(-- --)0 4 R/F1 11/Times-Roman@0 SF 2.75 -(XV)72 53 S(ersion 11, Release 6.4)-3.971 E 2.75(XW)218.487 G(indo)-3.19 -E 2.75(wS)-.275 G(ystem Installation)-2.75 E(Then continue here.)72 85 Q -/F2 11/Times-Bold@0 SF 2.75(2.5. Con\214guration)72 124 R -.11(Pa)2.75 G -(rameters \(Imak).11 E 2.75(eV)-.11 G(ariables\))-3.762 E F1 -(This release, lik)72 153.6 Q 2.75(ea)-.11 G -(ll the releases before it, uses)-2.75 E/F3 11/Times-Italic@0 SF(imak) -2.75 E(e)-.11 E F1 2.75(,au)C(tility for creating system-speci\214c Mak) --2.75 E(e\214les)-.11 E(from system-independent Imak)72 166.6 Q -(e\214les. Almost e)-.11 E -.165(ve)-.275 G -(ry directory in the release contains an).165 E F2(Imak)2.75 E(e\214le) --.11 E F1 2.75(.S)C(ys-)-2.75 E -(tem-speci\214c con\214guration information is located in)72 179.6 Q F2 -(xc/con\214g/cf/)2.75 E F1 2.75(,w)C(hich is used by the)-2.75 E F3 -(imak)2.75 E(e)-.11 E F1(program)2.75 E -2.365 -.275(ev e)72 192.6 T -(ry time a).275 E F2(Mak)2.75 E(e\214le)-.11 E F1 -(is generated in the source tree.)2.75 E(Most of the con\214guration w) -72 209.2 Q(ork prior to b)-.11 E -(uilding the release is to set parameters \(imak)-.22 E 2.75(ev)-.11 G -(ariables\) so that)-3.025 E F3(imak)72 222.2 Q(e)-.11 E F1 -(will generate correct Mak)2.75 E(e\214les. If you')-.11 E(re b)-.55 E -(uilding on one of the supported systems almost no con-)-.22 E -(\214guration w)72 235.2 Q(ork should be necessary)-.11 E(.)-.715 E --1.21(Yo)72 251.8 S 2.75(us)1.21 G -(hould de\214ne your con\214guration parameters in)-2.75 E F2 -(xc/con\214g/cf/site.def)2.75 E F1 2.75(.W)C 2.75(ep)-3.63 G(ro)-2.75 E -(vide an empty)-.165 E F2(site.def)2.75 E F1(\214le and a)72 264.8 Q F2 -(site.sample)2.75 E F1(\214le. The)2.75 E F2(site.sample)2.75 E F1 -(\214le is a suggested)2.75 E F2(site.def)2.75 E F1 -(\214le \212 use it at your o)2.75 E(wn risk.)-.275 E(An)72 281.4 Q 2.75 -(yp)-.165 G(ublic patches we release will ne)-2.75 E -.165(ve)-.275 G -2.75(rp).165 G(atch)-2.75 E F2(site.def)2.75 E F1 2.75(,s)C 2.75(oy) --2.75 G(ou can be assured that applying a public-)-2.75 E(patch will no\ -t corrupt your site.def \214le. On rare occasion you may need to mak)72 -294.4 Q 2.75(et)-.11 G(he change in your)-2.75 E -.165(ve)72 307.4 S -(ndor).165 E(-speci\214c)-.22 E F2(.cf)2.75 E F1(\214le; b)2.75 E -(ut you should a)-.22 E -.22(vo)-.22 G -(id doing that if at all possible because an).22 E 2.75(yp)-.165 G -(atch we might)-2.75 E(release could concei)72 320.4 Q -.275(va)-.275 G -(bly patch your v).275 E(endor)-.165 E(-speci\214c)-.22 E F2(.cf)2.75 E -F1(\214le and your change may be lost or g)2.75 E(arbled. Y)-.055 E(ou) --1.21 E(can o)72 333.4 Q -.165(ve)-.165 G -(rride most of the things in your v).165 E(endor)-.165 E(-speci\214c) --.22 E F2(.cf)2.75 E F1(\214le in your)2.75 E F2(site.def)2.75 E F1 2.75 -(\214le. \(If)2.75 F(you can')2.75 E(t, it')-.198 E 2.75(sab)-.605 G(ug) --2.97 E 2.75<8a70>72 346.4 S(lease \214le a b)-2.75 E(ug-report.\))-.22 -E(On the systems we use here, imak)72 363 Q 2.75(ew)-.11 G -(ill automatically determine the)-2.75 E F3(OSMajorV)2.75 E(er)-1.221 E -(sion)-.11 E F1(,)A F3(OSMinorV)2.75 E(er)-1.221 E(sion)-.11 E F1(,)A -(and)72 376 Q F3(OST)2.75 E(eenyV)-1.012 E(er)-1.221 E(sion)-.11 E F1 -(for your system. If your system isn')2.75 E 2.75(to)-.198 G -(ne of the systems we b)-2.75 E(uild on here, or you)-.22 E -.11(wa)72 -389 S(nt to b).11 E(uild for a dif)-.22 E(ferent v)-.275 E -(ersion of your operating system, then you can o)-.165 E -.165(ve)-.165 -G(rride them in the appropri-).165 E(ate entry in your)72 402 Q F2 -(site.def)2.75 E F1(\214le.)2.75 E(The)72 418.6 Q F2(site.def)2.75 E F1 -(\214le has tw)2.75 E 2.75(op)-.11 G(arts, one protected with `)-2.75 E -(`#ifdef BeforeV)-.916 E(endorCF')-1.221 E 2.75('a)-.916 G -(nd one with `)-2.75 E(`#ifdef)-.916 E(AfterV)72 431.6 Q(endorCF')-1.221 -E 2.75('. The)-.916 F -(\214le is actually processed twice, once before the)2.75 E F2(.cf)2.75 -E F1(\214le and once after)2.75 E 2.75(.A)-.605 G(bout the)-2.75 E -(only thing you need to set in the `)72 444.6 Q(`before')-.916 E 2.75 -('s)-.916 G(ection is)-2.75 E F2(HasGcc2)2.75 E F1 2.75(;j)C -(ust about e)-2.75 E -.165(ve)-.275 G(rything else can be set in the) -.165 E -.916(``)72 457.6 S(after').916 E 2.75('s)-.916 G(ection.)-2.75 E -(The)72 474.2 Q F2(site.sample)2.75 E F1 -(also has commented out support to include another \214le,)2.75 E F2 -(host.def)2.75 E F1 2.75(.T)C(his scheme may be)-2.75 E(useful if you w) -72 487.2 Q(ant to set most parameters site-wide, b)-.11 E -(ut some parameters v)-.22 E(ary from machine to machine.)-.275 E -(If you use a symbolic link tree, you can share)72 500.2 Q F2(site.def) -2.75 E F1(across all machines, and gi)2.75 E .33 -.165(ve e)-.275 H -(ach machine its o).165 E(wn)-.275 E(cop)72 513.2 Q 2.75(yo)-.11 G(f) --2.75 E F2(host.def)2.75 E F1(.)A(The con\214g parameters are listed in) -72 529.8 Q F2(xc/con\214g/cf/README)2.75 E F1 2.75(,b)C -(ut here are some of the ne)-2.97 E 2.75(wo)-.275 G 2.75(rm)-2.75 G -(ore com-)-2.75 E(mon parameters that you may wish to set in your)72 -542.8 Q F2(xc/con\214g/cf/site.def)2.75 E F1(.)A F2(Pr)72 559.4 Q -(ojectRoot)-.198 E F1(The destination where X will be installed. This v) -97 572.4 Q(ariable needs to be set before you b)-.275 E(uild, as some) --.22 E(programs that read \214les at run-time ha)97 585.4 Q .33 -.165 -(ve t)-.22 H(he installation directory compiled in to them.).165 E F2 -(HasV)72 602 Q(arDir)-1.012 E(ectory)-.198 E F1(Set to)97 615 Q F2(NO) -2.75 E F1(if your system doesn')2.75 E 2.75(th)-.198 G -2.475 -.22(av e) --2.75 H(/v)2.97 E(ar or you don')-.275 E 2.75(tw)-.198 G -(ant certain \214les to be installed in)-2.86 E F3 -1.221(Va)2.75 G -(rDi-)1.221 E -.407(re)97 628 S(ctory).407 E F1(.)A F2 -1.012(Va)72 -644.6 S(rDir)1.012 E(ectory)-.198 E F1(The location of site editable co\ -n\214guration and run-time \214les. Man)97 657.6 Q 2.75(ys)-.165 G -(ites prefer to install their X)-2.75 E(binaries on)97 670.6 Q F3 -.407 -(re)2.75 G(ad-only).407 E F1 -(media \212 either a disk slice \(partition\) that')2.75 E 2.75(sm)-.605 -G(ounted)-2.75 E F3 -.407(re)2.75 G(ad-only).407 E F1(for added)2.75 E -(security)97 683.6 Q 2.75(,a)-.715 G 2.75(nN)-2.75 G(FS v)-2.75 E -(olume mounted)-.22 E F3 -.407(re)2.75 G(ad-only).407 E F1 -(for security and/or impro)2.75 E -.165(ve)-.165 G 2.75(dV).165 G 2.75 -(Mp)-2.75 G(aging characteris-)-2.75 E(tics, or from a)97 696.6 Q F3 -(live \214lesystem)2.75 E F1(on a CD-R)2.75 E -(OM. In order to simplify things lik)-.44 E 2.75(ei)-.11 G(nstalling) --2.75 E F3(app-default)2.75 E F1(\214les for locally b)97 709.6 Q -(uilt softw)-.22 E(are, and allo)-.11 E -(wing editing of miscellaneous con\214guration and polic)-.275 E 2.75 -<798c>-.165 G(les,)-2.75 E(and to allo)97 722.6 Q 2.75(wx)-.275 G -(dm to create its master Xauthority \214le, some directories under)-2.75 -E F3($Pr)2.75 E(ojectRoot)-.495 E F2(/lib/X11)A F1(3)303.25 769 Q EP -%%Page: 4 6 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Roman@0 SF 531.38(-- --)0 4 R/F1 11/Times-Roman@0 SF 2.75 -(XW)72 53 S(indo)-3.19 E 2.75(wS)-.275 G(ystem Installation V)-2.75 E -(ersion 11, Release 6.4)-1.221 E(are actually installed in)97 85 Q/F2 11 -/Times-Bold@0 SF(/v)2.75 E(ar/X11)-.11 E F1 2.75(,a)C(nd)-2.75 E/F3 11 -/Times-Italic@0 SF($Pr)2.75 E(ojectRoot)-.495 E F2(/lib/X11)A F1 -(contains symlinks to the directories in)2.75 E F2(/v)97 98 Q(ar/X11) --.11 E F1(.)A F2(HasGcc2)72 114.6 Q F1(Set to)97 127.6 Q F2(YES)2.75 E -F1(to b)2.75 E(uild with)-.22 E F3(gcc)2.75 E F1 -.165(ve)2.75 G -(rsion 2.x instead of your system').165 E 2.75(sd)-.605 G(ef)-2.75 E -(ault compiler)-.11 E(.)-.605 E F2(BuildXInputExt)72 144.2 Q F1(Set to) -97 157.2 Q F2(YES)2.75 E F1(to b)2.75 E -(uild the X Input Extension. This e)-.22 E(xtension requires de)-.165 E -(vice-dependent support in the)-.275 E 2.75(Xs)97 170.2 S(erv)-2.75 E -(er)-.165 E 2.75(,w)-.44 G(hich e)-2.75 E(xists only in)-.165 E F3(Xhp) -2.75 E F1(and)2.75 E F3(XF86_*)2.75 E F1(in the sample implementation.) -2.75 E F2(DefaultUsrBin)72 186.8 Q F1 -(This is a directory where programs will be found e)97 199.8 Q -.165(ve) --.275 G 2.75(ni).165 G 2.75(fP)-2.75 G -1.221(AT)-3.762 G 2.75(Hi)1.221 -G 2.75(sn)-2.75 G(ot set in the en)-2.75 E(vironment. It is)-.44 E -(independent of ProjectRoot and def)97 212.8 Q(aults to)-.11 E F2 -(/usr/bin)2.75 E F1 2.75(.I)C 2.75(ti)-2.75 G 2.75(su)-2.75 G -(sed, for e)-2.75 E(xample, when connecting from)-.165 E 2.75(ar)97 -225.8 S(emote system via)-2.75 E F3 -.11(rs)2.75 G(h).11 E F1 2.75(.T)C -(he)-2.75 E F3 -.11(rs)2.75 G(tart).11 E F1(program installs its serv) -2.75 E(er in this directory)-.165 E(.)-.715 E F2(InstallSer)72 242.4 Q --.11(ve)-.11 G(rSetUID).11 E F1(Some systems require the X serv)97 255.4 -Q(er to run as root to access the de)-.165 E -(vices it needs. If you are on such a)-.275 E -(system and will not be using)97 268.4 Q F3(xdm)2.75 E F1 2.75(,y)C -(ou may set this v)-2.75 E(ariable to)-.275 E F2(YES)2.75 E F1 -(to install the X serv)2.75 E(er setuid to)-.165 E(root; ho)97 281.4 Q -(we)-.275 E -.165(ve)-.275 G 2.75(rt).165 G(he X Project T)-2.75 E -(eam strongly recommends that you not install your serv)-.77 E -(er suid-root,)-.165 E -.22(bu)97 294.4 S 2.75(tt).22 G -(hat you use xdm instead. T)-2.75 E -(alk to your system manager before setting this v)-.88 E(ariable to) --.275 E F2(YES)2.75 E F1(.)A F2(InstallXdmCon\214g)72 311 Q F1(By def)97 -324 Q -(ault set to NO, which suppresses installing xdm con\214g \214les o)-.11 -E -.165(ve)-.165 G 2.75(re).165 G(xisting ones. Lea)-2.915 E .33 -.165 -(ve i)-.22 H 2.75(ts).165 G(et to)-2.75 E -(NO if your site has customized the \214les in)97 337 Q F3($Pr)2.75 E -(ojectRoot)-.495 E F2(/lib/X11/xdm)A F1 2.75(,a)C 2.75(sm)-2.75 G(an) --2.75 E 2.75(ys)-.165 G(ites do.)-2.75 E(If you)5.5 E(don')97 350 Q 2.75 -(ti)-.198 G(nstall the ne)-2.75 E 2.75<778c>-.275 G(les, mer)-2.75 E -(ge an)-.198 E 2.75(yc)-.165 G(hanges present in the ne)-2.75 E 2.75 -<778c>-.275 G(les.)-2.75 E F2(MotifBC)72 366.6 Q F1 -(Causes Xlib and Xt to w)97 379.6 Q(ork around some b)-.11 E -(ugs in older v)-.22 E(ersions of Motif.)-.165 E(Set to)5.5 E F2(YES) -2.75 E F1(only if you)2.75 E(will be linking with Motif v)97 392.6 Q -(ersion 1.1.1, 1.1.2, or 1.1.3.)-.165 E F2(GetV)72 409.2 Q(aluesBC) --1.012 E F1(Setting this v)97 422.2 Q(ariable to)-.275 E F2(YES)2.75 E -F1(allo)2.75 E(ws ille)-.275 E -.055(ga)-.165 G 2.75(lX).055 G(tGetV) --2.75 E(alues requests with NULL Ar)-1.221 E(gV)-.198 E -(al to usually suc-)-1.221 E -(ceed, as R5 did. Some applications erroneously rely on this beha)97 -435.2 Q(vior)-.22 E 2.75(.S)-.605 G(upport for this will be)-2.75 E -(remo)97 448.2 Q -.165(ve)-.165 G 2.75(di).165 G 2.75(naf)-2.75 G -(uture release.)-2.75 E(The follo)72 464.8 Q(wing v)-.275 E(endor)-.165 -E(-speci\214c)-.22 E F2(.cf)2.75 E F1(\214les are in the release b)2.75 -E(ut ha)-.22 E .33 -.165(ve n)-.22 H -(ot been tested recently and hence prob-).165 E(ably need changes to w) -72 477.8 Q(ork:)-.11 E F2(apollo.cf)2.75 E F1(,)A F2(bsd.cf)2.75 E F1(,) -A F2(con)2.75 E -.11(ve)-.44 G(x.cf).11 E F1(,)A F2(DGUX.cf)2.75 E F1(,) -A F2(luna.cf)2.75 E F1(,)A F2(macII.cf)2.75 E F1(,)A F2(Mips.cf)2.75 E -F1(,)A F2(moto.cf)2.75 E F1(,)A F2(Oki.cf)72 490.8 Q F1(,)A F2 -(pegasus.cf)2.75 E F1(,)A F2(x386.cf)2.75 E F1(.)A F2(Amoeba.cf)5.5 E F1 -(is kno)2.75 E(wn to require additional patches.)-.275 E(The \214le)72 -507.4 Q F2(xc/lib/Xdmcp/Wraphelp.c)2.75 E F1 2.75(,f)C(or XDM-A)-2.75 E -(UTHORIZA)-.605 E(TION-1, is not included in this release. See)-1.221 E -(ftp://ftp.x.or)72 520.4 Q(g/pub/R6.4/xdm-auth/README.)-.198 E F2 2.75 -(2.6. System)72 559.4 R(Build Notes)2.75 E F1 -(This section contains hints on b)72 589 Q -(uilding X with speci\214c compilers and operating systems.)-.22 E -(If the b)72 605.6 Q(uild isn')-.22 E 2.75<748c>-.198 G -(nding things right, mak)-2.75 E 2.75(es)-.11 G -(ure you are using a compiler for your operating system. F)-2.75 E(or) --.165 E -.165(ex)72 618.6 S(ample, a pre-compiled).165 E F3(gcc)2.75 E -F1(for a dif)2.75 E(ferent OS \(e.g. as a cross-compiler\) will not ha) --.275 E .33 -.165(ve r)-.22 H(ight symbols).165 E(de\214ned, so)72 631.6 -Q F3(imak)2.75 E(e)-.11 E F1(will not w)2.75 E(ork correctly)-.11 E(.) --.715 E F2 2.75(2.6.1. gcc)72 670.6 R F1 2.75(Xw)72 687.2 S -(ill not compile on some systems with)-2.75 E F3(gcc)2.75 E F1 -.165(ve) -2.75 G(rsion 2.5, 2.5.1, or 2.5.2 because of an incorrect declara-).165 -E(tion of memmo)72 700.2 Q -.165(ve)-.165 G(\(\) in a gcc \214x).165 E -(ed include \214le.)-.165 E(If you are using a)72 716.8 Q F3(gcc)2.75 E -F1 -.165(ve)2.75 G -(rsion prior to 2.7 on Solaris x86, you need to specify).165 E F2(BOO)72 -729.8 Q(TSTRAPCFLA)-.44 E(GS="\255Dsun")-.605 E F1(in the `)2.75 E(`mak) --.916 E 2.75(eW)-.11 G(orld')-3.63 E 2.75('c)-.916 G(ommand.)-2.75 E(4) -303.25 769 Q EP -%%Page: 5 7 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Roman@0 SF 531.38(-- --)0 4 R/F1 11/Times-Roman@0 SF 2.75 -(XV)72 53 S(ersion 11, Release 6.4)-3.971 E 2.75(XW)218.487 G(indo)-3.19 -E 2.75(wS)-.275 G(ystem Installation)-2.75 E(If you')72 85 Q(re b)-.55 E -(uilding on a system that has an unb)-.22 E(undled compiler)-.22 E 2.75 -(,e)-.44 G 2.75(.g. Solaris)-2.75 F(2.x, and you do not ha)2.75 E .33 --.165(ve t)-.22 H(he).165 E/F2 11/Times-Italic@0 SF(cc)72 98 Q F1 -(compiler)2.75 E 2.75(,y)-.44 G(ou need to contri)-2.75 E .33 -.165 -(ve t)-.275 H 2.75(oh).165 G -2.475 -.22(av e)-2.75 H F2(cc)2.97 E F1 -(in your path in order to bootstrap imak)2.75 E 2.75(e. One)-.11 F -.11 -(wa)2.75 G 2.75(yt).11 G 2.75(od)-2.75 G 2.75(ot)-2.75 G(his)-2.75 E -(is to create a symlink cc that points to)72 111 Q F2(gcc)2.75 E F1(.)A -2.75(%c)108 130 S 2.75(d/)-2.75 G(usr/local/bin; ln \255s)-2.75 E F2 -(path-to-gcc)2.75 E F1(cc)2.75 E(Once)72 149 Q F2(imak)2.75 E(e)-.11 E -F1(has been b)2.75 E(uilt all the Mak)-.22 E -(e\214les created with it will e)-.11 E(xplicitly use)-.165 E F2(gcc) -2.75 E F1(and you can remo)2.75 E .33 -.165(ve t)-.165 H(he).165 E -(symlink. Another w)72 162 Q(ay around this is to edit)-.11 E/F3 11 -/Times-Bold@0 SF(xc/con\214g/imak)2.75 E(e/Mak)-.11 E(e\214le.ini)-.11 E -F1(to specify)2.75 E F2(gcc)2.75 E F1(instead of)2.75 E F2(cc)2.75 E F1 -(.)A F3 2.75(2.6.2. Other)72 201 R(GNU tools)2.75 E F1 -(Use of the GNU BinUtils assembler)72 217.6 Q(,)-.44 E F2(as)2.75 E F1 -2.75(,a)C(nd link)-2.75 E(er)-.11 E(,)-.44 E F2(ld)2.75 E F1 2.75(,i)C -2.75(sn)-2.75 G(ot supported \212 period! If you ha)-2.75 E .33 -.165 -(ve t)-.22 H(hem in-).165 E -(stalled on your system you must rename or remo)72 230.6 Q .33 -.165 -(ve t)-.165 H(hem for the duration of the R6.4 b).165 E 2.75(uild. \(Y) --.22 F(ou can re-)-1.21 E(store them afterw)72 243.6 Q(ards.\))-.11 E -(The system-supplied)72 260.2 Q F2(mak)2.75 E(e)-.11 E F1 -.11(wo)2.75 G -(rks just \214ne for b).11 E(uilding R6.4 and that')-.22 E 2.75(sw)-.605 -G(hat we suggest you use. If you')-2.75 E -.165(ve)-.55 G -(replaced your system')72 273.2 Q(s)-.605 E F2(mak)2.75 E(e)-.11 E F1 -(with GNU)2.75 E F2(mak)2.75 E(e)-.11 E F1 -(then we recommend that you restore the system)2.75 E F2(mak)2.75 E(e) --.11 E F1(for)2.75 E(the duration of your R6.4 b)72 286.2 Q -(uild. After R6.4 is done b)-.22 E(uilding you can re)-.22 E -.165(ve) --.275 G(rt to GNU mak).165 E(e. GNU mak)-.11 E 2.75(eo)-.11 G(n)-2.75 E -(most systems \(e)72 299.2 Q(xcept Linux, where it is the def)-.165 E -(ault mak)-.11 E(e\) is not a supported b)-.11 E -(uild con\214guration. GNU)-.22 E(mak)72 312.2 Q 2.75(em)-.11 G(ay w) --2.75 E(ork for you, and if it does, great; b)-.11 E(ut if it doesn') --.22 E 2.75(tw)-.198 G 2.75(ed)-2.75 G 2.75(on)-2.75 G -(ot consider it a b)-2.75 E(ug in R6.4. If, after)-.22 E -(this admonition, you still use GNU mak)72 325.2 Q 2.75(ea)-.11 G -(nd your b)-2.75 E(uild f)-.22 E(ails, reread the abo)-.11 E -.165(ve) --.165 G 2.75(,a).165 G(nd retry the b)-2.75 E(uild with)-.22 E -(the system')72 338.2 Q(s)-.605 E F2(mak)2.75 E(e)-.11 E F1 -(before you \214le a b)2.75 E(ug-report.)-.22 E F3 2.75(2.6.3. IBM)72 -377.2 R(AIX 4.x)2.75 E F1(On AIX 4.x, the \214le)72 406.8 Q F3(lib/f) -2.75 E(ont/T)-.275 E(ype1/objects.c)-.814 E F1 -(must be compiled without optimization \()2.75 E F3A F1 2.75(\)o)C -2.75(rt)-2.75 G(he X serv-)-2.75 E(er and fontserv)72 419.8 Q(er will e) --.165 E(xit when T)-.165 E(ype 1 fonts are used.)-.88 E F3 2.75 -(2.6.4. SunOS)72 458.8 R(4.0.x)2.75 E F1(SunOS 4.0 and earlier need BOO) -72 488.4 Q(TSTRAPCFLA)-.44 E(GS=-DNOSTDHDRS because it does not ha)-.44 -E .33 -.165(ve u)-.22 H(nistd.h).165 E(and stdlib)72 501.4 Q(.h. Do)-.44 -E F2(not)2.75 E F1(supply a BOO)2.75 E(TSTRAPCFLA)-.44 E(GS when b)-.44 -E(uilding an)-.22 E 2.75(yS)-.165 G(unOS 4.1 or 5.x \(Solaris 2\) v) --2.75 E(er)-.165 E(-)-.22 E(sion.)72 514.4 Q F3 2.75(2.6.5. Linux)72 -553.4 R F1(On Linux systems imak)72 583 Q 2.75(eh)-.11 G -(as preliminary support to automatically determine which Linux distrib) --2.75 E(ution)-.22 E(you')72 596 Q(re using. At this time it only autom\ -atically detects S.u.S.E. Linux. On other Linux systems you)-.55 E -(should set the LinuxDistrib)72 609 Q(ution parameter in your)-.22 E F3 -(xc/con\214g/cf/site.def)2.75 E F1 2.75<8a73>2.75 G(ee the)-2.75 E F3 -(xc/con\214g/cf/linux.cf)2.75 E F1(\214le for the list of v)72 622 Q -(alid v)-.275 E(alues. On Linux systems imak)-.275 E 2.75(ew)-.11 G -(ill also automatically determine which v)-2.75 E(ersion)-.165 E -(of libc and binutils your system has. Y)72 635 Q(ou may o)-1.21 E -.165 -(ve)-.165 G(rride these in your).165 E F3(xc/con\214g/cf/site.def)2.75 E -F1(\214le.)2.75 E(Man)72 651.6 Q 2.75(yd)-.165 G(istrib)-2.75 E -(utions of Linux ha)-.22 E .33 -.165(ve p)-.22 H -(oor or no support for ANSI/POSIX/ISO C locale support. If your Lin-) -.165 E(ux distrib)72 664.6 Q(ution is one of these you should mak)-.22 E -2.75(ec)-.11 G(ertain that the imak)-2.75 E 2.75(ev)-.11 G(ariable) --3.025 E F2(LinuxLocaleDe\214nes)2.75 E F1(is set)2.75 E(to)72 677.6 Q -F3(-DX_LOCALE)2.75 E F1(so that compose processing and other internatio\ -nalization features will w)2.75 E(ork correctly)-.11 E(.)-.715 E 1.76 --.88(To h)72 690.6 T(elp decide if you should use -DX_LOCALE, look in /\ -usr/share/locale \212 if it').88 E 2.75(se)-.605 G(mpty)-2.75 E 2.75(,y) --.715 G(ou should)-2.75 E(probably use the -DX_LOCALE de\214ne.)72 703.6 -Q(5)303.25 769 Q EP -%%Page: 6 8 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Roman@0 SF 531.38(-- --)0 4 R/F1 11/Times-Roman@0 SF 2.75 -(XW)72 53 S(indo)-3.19 E 2.75(wS)-.275 G(ystem Installation V)-2.75 E -(ersion 11, Release 6.4)-1.221 E/F2 11/Times-Bold@0 SF 2.75(2.6.6. Micr) -72 85 R(osoft W)-.198 E(indo)-.198 E(ws NT)-.11 E F1(All of the base li\ -braries are supported, including multi-threading in Xlib and Xt, b)72 -114.6 Q(ut some of the more)-.22 E -(complicated applications, speci\214cally)72 127.6 Q/F3 11 -/Times-Italic@0 SF(xterm)2.75 E F1(and)2.75 E F3(xdm)2.75 E F1 2.75(,a)C -(re not supported.)-2.75 E(There are also some other rough edges in the\ - implementation, such as lack of support for non-sock)72 144.2 Q -(et \214le)-.11 E -(descriptors as Xt alternate inputs and not using the re)72 157.2 Q -(gistry for con\214gurable parameters lik)-.165 E 2.75(et)-.11 G -(he system)-2.75 E(\214lenames and search paths.)72 170.2 Q(The)72 186.8 -Q F3(Xnest)2.75 E F1(serv)2.75 E(er has been made to run on NT)-.165 E -2.75(;a)-.605 G(lthough it still requires a real X serv)-2.75 E -(er for output still. A)-.165 E(real X serv)72 199.8 Q(er can not be b) --.165 E(uilt from these sources \212 in order to display X applications\ - on a MS-W)-.22 E(indo)-.44 E(ws)-.275 E(host you will ha)72 212.8 Q .33 --.165(ve t)-.22 H 2.75(oa).165 G(cquire a real X Serv)-2.75 E(er)-.165 E -(.)-.605 E -1.21(Yo)72 229.4 S 2.75(uh)1.21 G -2.475 -.22(av e)-2.75 H -(se)2.97 E -.165(ve)-.275 G(ral choices for imak).165 E(e')-.11 E(s) --.605 E F3(RmT)2.75 E -.407(re)-.605 G(eCmd).407 E F1 2.75(.L)C -(ook at the possible de\214nitions in the)-2.75 E F2(xc/con-)2.75 E -(\214g/cf/W)72 242.4 Q(in32.cf)-.198 E F1(\214le, choose one that')2.75 -E 2.75(sr)-.605 G(ight for you, and add it to your)-2.75 E F2 -(xc/con\214g/cf/site.def)2.75 E F1(\214le.)2.75 E F2 2.75(2.7. The)72 -281.4 R(Build)2.75 E F1 -.165(Fo)72 311 S 2.75(ra).165 G -(ll the supported UNIX and UNIX-lik)-2.75 E 2.75(es)-.11 G -(ystems you can simply type \(in csh\):)-2.75 E 2.75(%m)108 330 S(ak) --2.75 E 2.75(eW)-.11 G(orld >& w)-3.63 E(orld.log)-.11 E -1.21(Yo)72 349 -S 2.75(uc)1.21 G(an call the output \214le something other than `)-2.75 -E(`w)-.916 E(orld.log')-.11 E('; b)-.916 E(ut don')-.22 E 2.75(tc)-.198 -G(all it `)-2.75 E(`mak)-.916 E(e.log')-.11 E 2.75('b)-.916 G -(ecause \214les)-2.75 E -(with this name are automatically deleted during the initial `)72 362 Q -(`cleaning')-.916 E 2.75('s)-.916 G(tage of the b)-2.75 E(uild.)-.22 E -(The b)72 378.6 Q(uild can tak)-.22 E 2.75(es)-.11 G -2.365 -.275(ev e) --2.75 H(ral hours on older systems, and may tak).275 E 2.75(ea)-.11 G -2.75(sl)-2.75 G(ittle as an hour on the f)-2.75 E(aster systems)-.11 E -(that are a)72 391.6 Q -.275(va)-.22 G(ilable today).275 E 2.75(.O)-.715 -G 2.75(nU)-2.75 G(NIX and UNIX-lik)-2.75 E 2.75(es)-.11 G -(ystems you may w)-2.75 E(ant to run it in the background and)-.11 E --.11(ke)72 404.6 S(ep a w).11 E(atch on the output. F)-.11 E(or e)-.165 -E(xample:)-.165 E 2.75(%m)108 423.6 S(ak)-2.75 E 2.75(eW)-.11 G -(orld >& w)-3.63 E(orld.log &)-.11 E 2.75(%t)108 436.6 S 2.75 -(ail \255f w)-2.75 F(orld.log)-.11 E(If something goes wrong, the easie\ -st thing is to correct the problem and start o)72 459.2 Q -.165(ve)-.165 -G 2.75(ra).165 G -.055(ga)-2.75 G(in, i.e. typing `).055 E(`mak)-.916 E -(e)-.11 E -.88(Wo)72 472.2 S(rld').88 E('.)-.916 E F2 2.75(2.7.1. UNIX) -72 511.2 R(and UNIX-lik)2.75 E 2.75(es)-.11 G(ystems)-2.75 E F1 -(Check your v)72 540.8 Q(endor)-.165 E(-speci\214c)-.22 E F2(.cf)2.75 E -F1(\214le; if it doesn')2.75 E 2.75(th)-.198 G -2.475 -.22(av e)-2.75 H -(BootstrapCFlags that apply to your v)2.97 E(ersion of the)-.165 E -(operating system then type \(in csh\):)72 553.8 Q 2.75(%m)108 572.8 S -(ak)-2.75 E 2.75(eW)-.11 G(orld >& w)-3.63 E(orld.log)-.11 E -(Otherwise type \(in csh\):)72 595.4 Q 2.75(%m)108 614.4 S(ak)-2.75 E -2.75(eW)-.11 G(orld BOO)-3.63 E(TSTRAPCFLA)-.44 E(GS="v)-.44 E -(alue" >& w)-.275 E(orld.log)-.11 E(None of the)72 637 Q F3(supported) -2.75 E F1(operating systems need to use BOO)2.75 E(TSTRAPCFLA)-.44 E -(GS.)-.44 E F2 2.75(2.7.2. Micr)72 676 R(osoft W)-.198 E(indo)-.198 E -(ws NT)-.11 E F1(On NT)72 705.6 Q 2.75(,m)-.814 G(ak)-2.75 E 2.75(ec) --.11 G(ertain your P)-2.75 E(ath, Include, and Lib en)-.165 E -(vironment v)-.44 E(ariables are set accordingly)-.275 E 2.75(.F)-.715 G -(or e)-2.915 E(xample)-.165 E(here we use the command line compiler in \ -VC++ 4.0 Standard Edition, which is installed in C:MSDE-)72 718.6 Q -(VSTD. T)72 731.6 Q 2.75(os)-.88 G(etup the en)-2.75 E(vironment type:) --.44 E(6)303.25 769 Q EP -%%Page: 7 9 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Roman@0 SF 531.38(-- --)0 4 R/F1 11/Times-Roman@0 SF 2.75 -(XV)72 53 S(ersion 11, Release 6.4)-3.971 E 2.75(XW)218.487 G(indo)-3.19 -E 2.75(wS)-.275 G(ystem Installation)-2.75 E 2.75(>s)108 85 S(et P)-2.75 -E(ath=)-.165 E/F2 11/Times-Italic@0 SF(old-path)A F1 -(;C:\\MSDEVSTD\\bin;C:\\)A F2(path-to-RmT)A -.407(re)-.605 G(eCmd).407 E -F1 2.75(>s)108 98 S(et Include=C:\\MSDEVSTD\\include)-2.75 E 2.75(>s)108 -111 S(et Lib=C:\\MSDEVSTD\\lib)-2.75 E(Then to b)72 130 Q -(uild, at the prompt, type:)-.22 E(C:\\> nmak)108 149 Q 2.75(eW)-.11 G -(orld.W)-3.63 E(in32 > w)-.44 E(orld.log)-.11 E/F3 11/Times-Bold@0 SF -2.75(2.8. Installing)72 194 R(X)2.75 E F1(After the b)72 223.6 Q -(uild has successfully completed you can install the softw)-.22 E -(are by typing the follo)-.11 E(wing as root:)-.275 E 2.75(%m)108 242.6 -S(ak)-2.75 E 2.75(ei)-.11 G(nstall >& install.log)-2.75 E -(or on Microsoft W)72 261.6 Q(indo)-.44 E(ws NT)-.275 E(C:\\> nmak)108 -280.6 Q 2.75(ei)-.11 G(nstall > install.log)-2.75 E(Ag)72 303.2 Q -(ain, you might w)-.055 E(ant to run this in the background and use)-.11 -E F2(tail)2.75 E F1(to w)2.75 E(atch the progress.)-.11 E -1.21(Yo)72 -319.8 S 2.75(uc)1.21 G(an install the manual pages by typing the follo) --2.75 E(wing as root:)-.275 E 2.75(%m)108 338.8 S(ak)-2.75 E 2.75(ei) --.11 G(nstall.man >& man.log)-2.75 E F3 2.75(2.9. Shar)72 383.8 R -(ed Libraries)-.198 E F1(The v)72 413.4 Q -(ersion number of some of the the shared libraries has been changed.) --.165 E(On SunOS 4, which supports)5.5 E(minor v)72 426.4 Q -(ersion numbers for shared libraries, programs link)-.165 E -(ed with the R6.4 libraries will use the ne)-.11 E 2.75(wl)-.275 G(i-) --2.75 E(braries with no special action required.)72 439.4 Q -(On most other modern operating systems the v)72 456 Q -(ersion portion of the library name, i.e. "6.1" portion of)-.165 E -("libX11.so.6.1" is a string. Ev)72 469 Q(en if it')-.165 E 2.75(so) --.605 G(nly one character long, e.g. "1" \(as in libX11.so.1\) it')-2.75 -E 2.75(ss)-.605 G(till a)-2.75 E -(string. This string uniquely identi\214es and distinguishes one v)72 -482 Q(ersion of the library from another)-.165 E 2.75(.E)-.605 G -.165 -(ve)-2.75 G(n).165 E(though all the libraries in this release are compa\ -tible with the libraries from pre)72 495 Q(vious releases, and there') --.275 E(s)-.605 E(otherwise no reason to change the v)72 508 Q -(ersion string, we do it to identify which source release the libraries) --.165 E(were b)72 521 Q(uilt from.)-.22 E(An old program that w)72 537.6 -Q(as link)-.11 E(ed with libXe)-.11 E(xt.so.6.3 w)-.165 E(on')-.11 E -2.75(tr)-.198 G(un if you delete libXe)-2.75 E(xt.so.6.3 and install) --.165 E(libXe)72 550.6 Q -(xt.so.6.4 in its place. In general on these systems you ha)-.165 E .33 --.165(ve t)-.22 H(he follo).165 E(wing choices:)-.275 E 14(1. K)72 567.2 -R(eep the old v)-.275 E(ersions of the libraries around.)-.165 E 14 -(2. Relink)72 583.8 R(all applications with the ne)2.75 E 2.75(wl)-.275 -G(ibraries.)-2.75 E 14(3. Create)72 600.4 R 2.75(as)2.75 G -(ymlink using the old name which points to the ne)-2.75 E 2.75(wn)-.275 -G(ame.)-2.75 E -.165(Fo)97 617 S 2.75(re).165 G(xample, to ha)-2.915 E -.33 -.165(ve p)-.22 H(rograms that were link).165 E(ed ag)-.11 E -(ainst libXe)-.055 E(xt.so.6.3 use libXe)-.165 E(xt.so.6.4, mak)-.165 E -2.75(et)-.11 G(his)-2.75 E(symlink:)97 630 Q 2.75(%c)133 649 S(d)-2.75 E -F2($Pr)2.75 E(ojectRoot)-.495 E F1(/lib)A 2.75(%l)133 662 S 5.5<6ead> --2.75 G 2.75(sl)-5.5 G(ibXe)-2.75 E(xt.so.6.4 libXe)-.165 E(xt.so.6.3) --.165 E(On some distrib)72 684.6 Q -(utions of Linux the run-time loader is brok)-.22 E -(en \212 requiring that the library')-.11 E 2.75(si)-.605 G -(nternal SON-)-2.75 E(AME match the)72 697.6 Q F2(\214lename)2.75 E F1 -2.75<8a61>2.75 G(nd the symlink solution w)-2.75 E(on')-.11 E 2.75(tw) --.198 G(ork. W)-2.86 E 2.75(er)-.88 G(ecommend that you get a ne)-2.75 E -2.75(wr)-.275 G(un-)-2.75 E(time loader which is not brok)72 710.6 Q -(en or recompile your run-time loader to not require that the SON)-.11 E -(AME)-.385 E(match.)72 723.6 Q(7)303.25 769 Q EP -%%Page: 8 10 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Roman@0 SF 531.38(-- --)0 4 R/F1 11/Times-Roman@0 SF 2.75 -(XW)72 53 S(indo)-3.19 E 2.75(wS)-.275 G(ystem Installation V)-2.75 E -(ersion 11, Release 6.4)-1.221 E/F2 11/Times-Bold@0 SF 2.75 -(2.10. Setting)72 85 R(Up xterm)2.75 E F1(If your)72 114.6 Q F2 -(/etc/termcap)2.75 E F1(and)2.75 E F2(/usr/lib/terminf)2.75 E(o)-.275 E -F1(databases do not ha)2.75 E .33 -.165(ve c)-.22 H(orrect entries for) -.165 E/F3 11/Times-Italic@0 SF(xterm)2.75 E F1 2.75(,u)C(se the sample) --2.75 E(entries pro)72 127.6 Q(vided in the directory)-.165 E F2(xc/pr) -2.75 E(ograms/xterm/)-.198 E F1 2.75(.S)C -(ystem V users may need to compile and install)-2.75 E(the)72 140.6 Q F2 -(terminf)2.75 E(o)-.275 E F1(entry with the)2.75 E F3(tic)2.75 E F1 -(utility)2.75 E(.)-.715 E(Since each)72 157.2 Q F3(xterm)2.75 E F1(will\ - need a separate pseudoterminal, you need a reasonable number of them f\ -or normal)2.75 E -.165(exe)72 170.2 S(cution. Y).165 E -(ou probably will w)-1.21 E(ant at least 32 on a small, multiuser syste\ -m. On most systems, each pty has)-.11 E(tw)72 183.2 Q 2.75(od)-.11 G --.275(ev)-2.75 G(ices, a master and a sla).275 E -.165(ve)-.22 G 2.75 -(,w).165 G(hich are usually named /de)-2.75 E -(v/tty[pqrstu][0-f] and /de)-.275 E(v/pty[pqrstu][0-f].)-.275 E -(If you don')72 196.2 Q 2.75(th)-.198 G -2.475 -.22(av e)-2.75 H -(at least the `)2.97 E(`p')-.916 E 2.75('a)-.916 G(nd `)-2.75 E(`q') --.916 E 2.75('s)-.916 G(ets con\214gured \(try typing `)-2.75 E(`ls /de) --.916 E(v/?ty??')-.275 E('\), you should ha)-.916 E -.165(ve)-.22 G -(your system administrator add them.)72 209.2 Q -(This is commonly done by running the)5.5 E F3(MAKEDEV)2.75 E F1 -(script in the)2.75 E F2(/de)2.75 E(v)-.165 E F1 -(directory with appropriate ar)72 222.2 Q(guments.)-.198 E F2 2.75 -(2.11. Starting)72 261.2 R(Ser)2.75 E -.11(ve)-.11 G(rs A).11 E -(utomatically at System Boot)-.55 E F1(The)72 290.8 Q F3(xfs)2.75 E F1 -(and)2.75 E F3(xdm)2.75 E F1(programs are designed to be run automatica\ -lly at system startup. Please read the manual)2.75 E(pages for details \ -on setting up con\214guration \214les; reasonable sample \214les are in) -72 303.8 Q F2(xc/pr)2.75 E(ograms/xdm/con-)-.198 E(\214g/)72 316.8 Q F1 -(and)2.75 E F2(xc/pr)2.75 E(ograms/xfs/)-.198 E F1(.)A(Since)72 333.4 Q -F3(xfs)2.75 E F1(can serv)2.75 E 2.75(ef)-.165 G(onts o)-2.75 E -.165 -(ve)-.165 G 2.75(rt).165 G(he netw)-2.75 E -(ork, you do not need to run a font serv)-.11 E(er on e)-.165 E -.165 -(ve)-.275 G(ry machine with an).165 E 2.75(Xd)72 346.4 S(isplay)-2.75 E -2.75(.Y)-.715 G(ou should start)-3.96 E F3(xfs)2.75 E F1(before)2.75 E -F3(xdm)2.75 E F1 2.75(,s)C(ince)-2.75 E F3(xdm)2.75 E F1 -(may start an X serv)2.75 E(er which is a client of \(depen-)-.165 E -(dent on\) the font serv)72 359.4 Q(er)-.165 E(.)-.605 E F2 2.75 -(2.11.1. On)72 398.4 R(BSD-based systems using /etc/r)2.75 E 2.75(co) --.198 G 2.75(r/)-2.75 G(etc/r)-2.75 E(c.local)-.198 E F1 -(If your system uses an)72 428 Q F2(/etc/r)2.75 E(c)-.198 E F1(or)2.75 E -F2(/etc/r)2.75 E(c.local)-.198 E F1 -(\214le at boot time, you can usually enable these programs by)2.75 E -(placing the follo)72 441 Q(wing at or near the end of the \214le:)-.275 -E(if [ \255f)108 460 Q F3($Pr)2.75 E(ojectRoot)-.495 E F1 -(/bin/xfs ]; then)A F3($Pr)130 473 Q(ojectRoot)-.495 E F1 -(/bin/xfs & echo \255n ' xfs')A<8c>108 486 Q(if [ \255f)108 512 Q F3 -($Pr)2.75 E(ojectRoot)-.495 E F1(/bin/xdm ]; then)A F3($Pr)130 525 Q -(ojectRoot)-.495 E F1(/bin/xdm; echo \255n ' xdm')A<8c>108 538 Q -(On later v)72 560.6 Q(ersions of FreeBSD the preferred w)-.165 E -(ay of doing this is to create the directory)-.11 E F3($Pr)2.75 E -(oject-)-.495 E(Root)72 573.6 Q F1(/etc/rc.d. Add this directory to the) -A F3(local_startup)2.75 E F1 -.275(va)2.75 G -(riable de\214ned in /etc/rc.conf, and then create short).275 E -(scripts in this directory to start xfs and xdm.)72 586.6 Q -(If you are unsure about ho)72 603.2 Q 2.75(ws)-.275 G(ystem boot w) --2.75 E(orks, or if your system does not use)-.11 E F2(/etc/r)2.75 E(c) --.198 E F1 2.75(,c)C(onsult your sys-)-2.75 E -(tem administrator for help.)72 616.2 Q F2 2.75(2.11.2. On)72 655.2 R -(Linux systems)2.75 E F1(Most Linux distrib)72 684.8 Q(utions ha)-.22 E -.33 -.165(ve a)-.22 H 2.75(n/).165 G -(etc/inittab entry speci\214cally for xdm. Depending on your distrib) --2.75 E(ution)-.22 E(this may be)72 697.8 Q F3(run-le)2.75 E(vel)-.165 E -F1(three, four)2.75 E 2.75(,o)-.44 G 2.75<728c>-2.75 G -.165(ve)-2.75 G -2.75(.T).165 G 2.75(ou)-3.63 G(se xdm, edit)-2.75 E F2(/etc/inittab)2.75 -E F1(and \214nd the line which contains)2.75 E F3(initdefault)72 710.8 Q -F1(and change it from 2 to the appropriate run-le)2.75 E -.165(ve)-.275 -G(l).165 E(8)303.25 769 Q EP -%%Page: 9 11 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Roman@0 SF 531.38(-- --)0 4 R/F1 11/Times-Roman@0 SF 2.75 -(XV)72 53 S(ersion 11, Release 6.4)-3.971 E 2.75(XW)218.487 G(indo)-3.19 -E 2.75(wS)-.275 G(ystem Installation)-2.75 E -1.21(Yo)72 85 S 2.75(uL) -1.21 G(inux distrib)-2.75 E(ution may already ha)-.22 E .33 -.165 -(ve a s)-.22 H(cript to start xdm at a particular run-le).165 E -.165 -(ve)-.275 G(l. F).165 E(or e)-.165 E(xample on)-.165 E(S.u.S.E. Linux 5\ -.0 there is the \214le /sbin/init.d/xdm, and the symlink /sbin/init.d/r\ -c3.d/S30xdm which)72 98 Q -(points to /sbin/init.d/xdm. Change /sbin/init.d/xdm to use)72 111 Q/F2 -11/Times-Italic@0 SF($Pr)2.75 E(ojectRoot/bin/xdm)-.495 E F1 2.75(.Y)C -(ou can use the xdm)-3.96 E -(script as a model write an xfs script. Depending on your Linux distrib) -72 124 Q(ution you may \214nd these \214les in)-.22 E -(/etc/init.d instead of /sbin/init.d.)72 137 Q/F3 11/Times-Bold@0 SF -2.75(2.11.3. On)72 176 R(Digital Unix, HPUX 10, and SVR4 systems)2.75 E -F1(Most systems run xdm by def)72 205.6 Q -(ault at some particular run-le)-.11 E -.165(ve)-.275 G 2.75(lo).165 G -2.75(ft)-2.75 G(he system. There is a master)-2.75 E F2(init.d)2.75 E F1 -(\214le)2.75 E(and a run-le)72 218.6 Q -.165(ve)-.275 G 2.75(ls).165 G -(ymlink)-2.75 E F2 -.407(rc)2.75 G(?.d).407 E F1 -(that points to the master)2.75 E F2(init.d)2.75 E F1(\214le:)2.75 E -(Operating System)72 231.6 Q(rc?.d symlink)64.866 E(init.d \214le) -120.116 E(Digital Unix 4.0)72 257.6 Q 82.21 -(/sbin/rc3.d/S95xlogin /sbin/init.d/xlogin)72.192 F(HPUX 10.20)72 270.6 -Q 85.268(/sbin/rc3.d/S800xdm /sbin/init.d/xdm)86.558 F(Solaris 2.[0-4]) -72 283.6 Q(Solaris 2.5)72 296.6 Q 96.279 -(/etc/rc3.d/S99xdm /etc/init.d/xdm.rc)96.942 F(Solaris 2.6)72 309.6 Q -84.663(/etc/rc2.d/S99dtlogin /etc/init.d/dtlogin)96.942 F(IRIX 6.2)72 -322.6 Q 96.279(/etc/rc2.d/S98xdm /etc/init.d/xdm)104.895 F(Unixw)72 -335.6 Q 97.987(are /etc/rc2.d/S69xdm)-.11 F(/etc/init.d/xdm)99.029 E -(In general you can edit the)72 354.6 Q F2(init.d)2.75 E F1 -(\214le to use)2.75 E F2($Pr)2.75 E(ojectRoot)-.495 E F3(/bin/xdm)A F1 -2.75(.Y)C(ou can use the xdm \214le as a model to)-3.96 E(write an /etc\ -/rc?.d/S??xfs \214le to start xfs. Some systems may already ha)72 367.6 -Q .33 -.165(ve \214)-.22 H(les to start xfs. Starting in So-).165 E -(laris 2.5 Sun uses inetd to start xfs \212 you should remo)72 380.6 Q -.33 -.165(ve t)-.165 H(he xfs entries from /etc/inetd.conf and /etc/ser) -.165 E(-)-.22 E(vices before adding xfs to the run-le)72 393.6 Q -.165 -(ve)-.275 G 2.75<6c8c>.165 G(les.)-2.75 E F3 2.75(2.11.4. On)72 432.6 R -(SystemV)2.75 E(-based systems)-.814 E F1(On systems with a)72 462.2 Q -F3(/etc/inittab)2.75 E F1 -(\214le, you can edit this \214le to add the lines)2.75 E(xfs:3:once:) -108 481.2 Q F2($Pr)A(ojectRoot)-.495 E F1(/bin/xfs)A(xdm:3:once:)108 -494.2 Q F2($Pr)A(ojectRoot)-.495 E F1(/bin/xdm)A F3 2.75(2.12. Using)72 -542.8 R(OPEN LOOK applications)2.75 E F1 -1.21(Yo)72 572.4 S 2.75(uc) -1.21 G(an use the X11R6.x Xsun serv)-2.75 E -(er with OPEN LOOK applications; b)-.165 E(ut you must pass the)-.22 E -F3(\255swapLk)72 585.4 Q(eys)-.11 E F1(\215ag to the serv)2.75 E -(er on startup, or the OPEN LOOK Undo, Cop)-.165 E 1.43 -.715(y, P)-.11 -H(aste, Find, and Cut k).55 E -.165(ey)-.11 G(s).165 E(may not w)72 -598.4 Q(ork correctly)-.11 E 2.75(.F)-.715 G(or e)-2.915 E -(xample, to run Sun')-.165 E 2.75(sO)-.605 G(penW)-2.75 E(indo)-.44 E -(ws 3.3 desktop en)-.275 E(vironment with an)-.44 E(X11R6 serv)72 611.4 -Q(er)-.165 E 2.75(,u)-.44 G(se the command:)-2.75 E 2.75(%o)108 630.4 S -2.75(penwin \255serv)-2.75 F(er)-.165 E F2($Pr)5.5 E 2.75 -(ojectRoot/bin/Xsun \255swapLk)-.495 F -.33(ey)-.11 G(s).33 E F1(The k) -72 653 Q -.165(ey)-.11 G(syms reported by k).165 E -.165(ey)-.11 G 2.75 -(so).165 G 2.75(nt)-2.75 G(he numeric k)-2.75 E -.165(ey)-.11 G(pad ha) -.165 E .33 -.165(ve a)-.22 H -(lso changed since X11R5; if you \214nd that).165 E(OpenW)72 666 Q(indo) --.44 E(ws applications do not respond to k)-.275 E -.165(ey)-.11 G -(pad k).165 E -.165(ey)-.11 G 2.75(sa).165 G(nd cursor control k)-2.75 E --.165(ey)-.11 G 2.75(sw).165 G(hen using an R6)-2.75 E(serv)72 679 Q(er) --.165 E 2.75(,y)-.44 G(ou can remap the k)-2.75 E -.165(ey)-.11 G -(pad to generate R5 style k).165 E -.165(ey)-.11 G(syms using the follo) -.165 E(wing)-.275 E F2(xmodmap)2.75 E F1(commands:)2.75 E -.11(ke)108 -698 S(ysym P)-.055 E(ause = F21)-.165 E -.11(ke)108 711 S -(ysym Print = F22)-.055 E -.11(ke)108 724 S(ysym Break = F23)-.055 E(9) -303.25 769 Q EP -%%Page: 10 12 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Roman@0 SF 531.38(-- --)0 4 R/F1 11/Times-Roman@0 SF 2.75 -(XW)72 53 S(indo)-3.19 E 2.75(wS)-.275 G(ystem Installation V)-2.75 E -(ersion 11, Release 6.4)-1.221 E -.11(ke)108 85 S(ysym KP_Equal = F24) --.055 E -.11(ke)108 98 S(ysym KP_Di)-.055 E(vide = F25)-.275 E -.11(ke) -108 111 S(ysym KP_Multiply = F26)-.055 E -.11(ke)108 124 S -(ysym KP_Home = F27)-.055 E -.11(ke)108 137 S(ysym KP_Up = Up)-.055 E --.11(ke)108 150 S(ysym KP_Prior = F29)-.055 E -.11(ke)108 163 S -(ysym KP_Left = Left)-.055 E -.11(ke)108 176 S(ycode 100 = F31)-.055 E --.11(ke)108 189 S(ysym KP_Right = Right)-.055 E -.11(ke)108 202 S -(ysym KP_End = F33)-.055 E -.11(ke)108 215 S(ysym KP_Do)-.055 E(wn = Do) --.275 E(wn)-.275 E -.11(ke)108 228 S(ysym KP_Ne)-.055 E(xt = F35)-.165 E --.11(ke)108 241 S(ysym KP_Insert = Insert)-.055 E -.11(ke)108 254 S -(ysym KP_Delete = Delete)-.055 E/F2 11/Times-Bold@0 SF 2.75(2.13. Reb)72 -299 R(uilding after P)-.22 E(atches)-.11 E F1(Ev)72 328.6 Q -(entually you are going to mak)-.165 E 2.75(ec)-.11 G -(hanges to the sources, for e)-2.75 E(xample by applying an)-.165 E 2.75 -(yp)-.165 G(ublic patches that)-2.75 E(may be released or to \214x an)72 -341.6 Q 2.75(yb)-.165 G(ugs you may ha)-2.97 E .33 -.165(ve f)-.22 H -(ound.).165 E(If only source \214les are changed, reb)72 358.2 Q -(uild by going to the base of your source tree)-.22 E F2(xc)2.75 E F1 -(and typing:)2.75 E 2.75(%m)108 377.2 S(ak)-2.75 E 2.75(e>)-.11 G 2.75 -(&m)-2.75 G(ak)-2.75 E(e.log)-.11 E(If there are imak)72 399.8 Q 2.75 -(ec)-.11 G(on\214guration \214le changes, the best thing to do is type:) --2.75 E 2.75(%m)108 418.8 S(ak)-2.75 E 2.75(eE)-.11 G -.165(ve)-2.75 G -(rything >& e).165 E -.165(ve)-.275 G(ry).165 E(.log)-.715 E -.916(``)72 -441.4 S(Ev).916 E(erything')-.165 E 2.75('i)-.916 G 2.75(ss)-2.75 G -(imilar to `)-2.75 E(`W)-.916 E(orld')-.88 E 2.75('i)-.916 G 2.75(nt) --2.75 G(hat it reb)-2.75 E(uilds e)-.22 E -.165(ve)-.275 G(ry).165 E F2 -(Mak)2.75 E(e\214le)-.11 E F1 2.75(,b)C(ut unlik)-2.97 E 2.75(e`)-.11 G -(`W)-3.666 E(orld')-.88 E 2.75('i)-.916 G 2.75(td)-2.75 G(oes not)-2.75 -E(delete the e)72 454.4 Q(xisting objects, libraries, and e)-.165 E --.165(xe)-.165 G(cutables, and only reb).165 E -(uilds what is out of date.)-.22 E F2 2.75(2.14. F)72 493.4 R -(ormatting the Documentation)-.275 E F1(The PostScript \214les in)72 523 -Q F2(xc/doc/hardcopy)2.75 E F1(can be generated from the sources in)2.75 -E F2(xc/doc/specs)2.75 E F1 2.75(.M)C(ost of the)-2.75 E -(documentation is in trof)72 536 Q 2.75(fu)-.275 G(sing the)-2.75 E -(\255ms macros. The easiest w)4.583 E -(ay to format it is to use the Imak)-.11 E(e\214les pro-)-.11 E(vided.) -72 549 Q(Set the name of your local trof)72 565.6 Q 2.75(fp)-.275 G -(rogram by setting the v)-2.75 E(ariable)-.275 E F2 -1.32 -.814(Tr o) -2.75 H(ffCmd).814 E F1(in)2.75 E F2(xc/con\214g/cf/site.def)2.75 E F1 -2.75(.T)C(hen)-2.75 E -.22(bu)72 578.6 S(ild the Mak).22 E(e\214les:) --.11 E(cd xc/doc)108 597.6 Q(mak)108 610.6 Q 2.75(eS)-.11 G -(UBDIRS=specs Mak)-2.75 E(e\214les)-.11 E(Finally)72 633.2 Q 2.75(,g) --.715 G 2.75(ot)-2.75 G 2.75(ot)-2.75 G -(he directory you are interested in and type `)-2.75 E(`mak)-.916 E(e') --.11 E 2.75('t)-.916 G(here. This command will generate)-2.75 E F2(.PS) -2.75 E F1(\214les. Y)72 646.2 Q(ou can also generate te)-1.21 E -(xt \214les by specifying the document name with a)-.165 E F2(.txt)2.75 -E F1 -.165(ex)2.75 G(tension as a).165 E/F3 11/Times-Italic@0 SF(mak) -2.75 E(e)-.11 E F1(tar)2.75 E(-)-.22 E(get, e.g., `)72 659.2 Q(`mak) --.916 E 2.75(ei)-.11 G(cccm.txt')-2.75 E('.)-.916 E(10)300.5 769 Q EP -%%Page: 11 13 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Roman@0 SF 531.38(-- --)0 4 R/F1 11/Times-Roman@0 SF 2.75 -(XV)72 53 S(ersion 11, Release 6.4)-3.971 E 2.75(XW)218.487 G(indo)-3.19 -E 2.75(wS)-.275 G(ystem Installation)-2.75 E/F2 11/Times-Bold@0 SF 2.75 -(3. Public)72 85 R -.11(Pa)2.75 G(tches).11 E F1 -(The Open Group X Project T)72 114.6 Q(eam may from time to time issue \ -public patches for this release to \214x an)-.77 E 2.75(ys)-.165 G(e-) --2.75 E(rious problems that are disco)72 127.6 Q -.165(ve)-.165 G -(red. Such \214x).165 E(es are a subset of \214x)-.165 E(es a)-.165 E --.275(va)-.22 G(ilable to X Project T).275 E(eam members.)-.77 E -(Public patches are a)72 140.6 Q -.275(va)-.22 G(ilable via anon).275 E -(ymous FTP from ftp://ftp.x.or)-.165 E(g/pub/R6.4/\214x)-.198 E -(es, or from your local X)-.165 E(mirror site.)72 153.6 Q -(Check the site closest to you \214rst.)5.5 E -1.21(Yo)72 170.2 S 2.75 -(uc)1.21 G(an determine which public patches ha)-2.75 E .33 -.165(ve a) --.22 H(lready been applied to your source tree by e).165 E(xamining the) --.165 E -.916(``)72 183.2 S(VERSION').916 E 2.75('l)-.916 G(ine of)-2.75 -E F2(xc/b)2.75 E(ug-r)-.22 E(eport)-.198 E F1 2.75(.T)C -(he source in the tar \214les you ha)-2.75 E .33 -.165(ve m)-.22 H -(ay already ha).165 E .33 -.165(ve s)-.22 H(ome patches).165 E(applied;\ - you only need to apply later patches. If you try to apply patches out \ -of order or apply patches that)72 196.2 Q(are already in your tree,)72 -209.2 Q/F3 11/Times-Italic@0 SF(patc)2.75 E(h)-.165 E F1 -(will tell you that you ha)2.75 E .33 -.165(ve t)-.22 H(he wrong v).165 -E(ersion and not apply the patch.)-.165 E(Source for the)72 225.8 Q F3 -(patc)2.75 E(h)-.165 E F1(program is in)2.75 E F2(xc/util/patch/)2.75 E -F1 2.75(.T)C(he)-2.75 E F3(patc)2.75 E(h)-.165 E F1 -(program included on some systems may not)2.75 E -(support all the options this v)72 238.8 Q(ersion has. If you ha)-.165 E -.33 -.165(ve p)-.22 H(roblems applying patches, or if you').165 E -(re otherwise in)-.55 E(doubt, use this v)72 251.8 Q(ersion.)-.165 E(11) -300.5 769 Q EP -%%Page: 12 14 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Roman@0 SF 531.38(-- --)0 4 R/F1 11/Times-Roman@0 SF 2.75 -(XW)72 53 S(indo)-3.19 E 2.75(wS)-.275 G(ystem Installation V)-2.75 E -(ersion 11, Release 6.4)-1.221 E(12)300.5 769 Q EP -%%Page: 1 15 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Roman@0 SF 531.38(-- --)0 4 R/F1 13/Times-Bold@0 SF -1.196 -(Ta)257.127 121 S(ble of Contents)1.196 E/F2 11/Times-Roman@0 SF -(1. Easy Build Instructions)72 173.6 Q 19.25(..........................\ -.......................................................................\ -.................... 1)4.471 F(2. Building and Installing R6.4)72 190.2 -Q 19.25(...............................................................\ -.............................................. 1)4.46 F -(2.1. Introduction)72 206.8 Q 19.25(...................................\ -.......................................................................\ -.......................... 1)3.866 F(2.2. Preparing Y)72 223.4 Q -(our Build System)-1.21 E 19.25(.......................................\ -.................................................................. 2) -3.239 F(2.3. Unpacking the Distrib)72 240 Q 1.336(ution ...............\ -.......................................................................\ -......................)-.22 F(2)22 E(2.4. Applying P)72 256.6 Q 2.502(a\ -tches .................................................................\ -..........................................................)-.165 F(2)22 -E(2.5. Con\214guration P)72 273.2 Q(arameters \(Imak)-.165 E 2.75(eV) --.11 G 2.04(ariables\) ................................................\ -.................................)-3.971 F(3)22 E -(2.6. System Build Notes)72 289.8 Q 19.25(.............................\ -.......................................................................\ -.................... 4)3.239 F(2.6.1. gcc)72 306.4 Q 19.25(............\ -.......................................................................\ -............................................................ 4)4.482 F -(2.6.2. Other GNU tools)72 323 Q 19.25(................................\ -.......................................................................\ -.................. 5)4.482 F(2.6.3. IBM AIX 4.x)72 339.6 Q 19.25(......\ -.......................................................................\ -.................................................. 5)4.174 F -(2.6.4. SunOS 4.0.x)72 356.2 Q 19.25(..................................\ -.......................................................................\ -....................... 5)5.076 F(2.6.5. Linux)72 372.8 Q 19.25(.......\ -.......................................................................\ -............................................................. 5)4.471 F -(2.6.6. Microsoft W)72 389.4 Q(indo)-.44 E(ws NT)-.275 E 19.25(........\ -.......................................................................\ -................................ 6)2.755 F(2.7. The Build)72 406 Q 19.25 -(......................................................................\ -.................................................................. 6) -2.942 F(2.7.1. UNIX and UNIX-lik)72 422.6 Q 2.75(es)-.11 G 1.248(ystems\ - ......................................................................\ -..............................)-2.75 F(6)22 E(2.7.2. Microsoft W)72 -439.2 Q(indo)-.44 E(ws NT)-.275 E 19.25(...............................\ -.......................................................................\ -......... 6)2.755 F(2.8. Installing X)72 455.8 Q 19.25(................\ -.......................................................................\ -.............................................. 7)3.25 F -(2.9. Shared Libraries)72 472.4 Q 19.25(...............................\ -.......................................................................\ -....................... 7)4.493 F(2.10. Setting Up xterm)72 489 Q 19.25 -(......................................................................\ -.................................................... 8)4.471 F -(2.11. Starting Serv)72 505.6 Q(ers Automatically at System Boot)-.165 E -19.25(.................................................................\ -.......... 8)3.415 F -(2.11.1. On BSD-based systems using /etc/rc or /etc/rc.local)72 522.2 Q -19.25 -(................................................................ 8) -4.504 F(2.11.2. On Linux systems)72 538.8 Q 19.25(.....................\ -.......................................................................\ -.......................... 8)2.942 F -(2.11.3. On Digital Unix, HPUX 10, and SVR4 systems)72 555.4 Q 19.25(..\ -..................................................................... 9) -2.942 F(2.11.4. On SystemV)72 572 Q(-based systems)-1.1 E 19.25(.......\ -.......................................................................\ -........................ 9)5.274 F(2.12. Using OPEN LOOK applications)72 -588.6 Q 19.25(.........................................................\ -....................................... 9)4.79 F(2.13. Reb)72 605.2 Q -(uilding after P)-.22 E 2.733(atches ..................................\ -.......................................................................\ -.....)-.165 F(10)16.5 E(2.14. F)72 621.8 Q(ormatting the Documentation) --.165 E 13.75(.........................................................\ -........................................... 10)5.252 F(3. Public P)72 -638.4 Q 2.194(atches ..................................................\ -.......................................................................\ -..........)-.165 F(11)16.5 E(i)304.471 769 Q F0 531.38(-- --)0 795 R EP -%%Trailer -end -%%EOF Index: xc/INSTALL.TXT diff -u xc/INSTALL.TXT:1.1.1.5 xc/INSTALL.TXT:removed --- xc/INSTALL.TXT:1.1.1.5 Sun Sep 27 03:48:12 1998 +++ xc/INSTALL.TXT Mon Dec 18 14:20:58 2000 @@ -1,791 +0,0 @@ - - - - - - - - - - BBuuiillddiinngg aanndd IInnssttaalllliinngg XX1111RR66..44 - - - - - - - - - _K_a_l_e_b _S_. _K_E_I_T_H_L_E_Y - - The Open Group X Project Team - - - - - - - 30 January, 1998 - - - - - - - - - - -Copyright (C) 1998 The Open Group - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the Software), -to use the Software without restriction, including, without limitation, -the rights to copy, modify, merge, publish, distribute and sublicense -the Software, to make, have made, license and distribute derivative -works thereof, and to permit persons to whom the Software is furnished -to do so, subject to the following conditions: - -The above copyright notice and the following permission notice shall be -included in all copies 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 MERCHANTABIL- -ITY, FITNESS FOR A PARTICULAR PURPOSE AND NON- INFRINGEMENT. IN NO EVENT -SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER USEABILI- -TIY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF, OR IN CONNNECTION WITH THE SOFTWARE OR THE USE OF 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 use or other dealings -in this Software without prior written authorization from The Open -Group. - -X Window System is a trademark of The Open Group. - - -_1_. _E_a_s_y _B_u_i_l_d _I_n_s_t_r_u_c_t_i_o_n_s - -This quick summary is no substitute for reading the full build instruc- -tions later in this document. - -Edit xxcc//ccoonnffiigg//ccff//ssiittee..ddeeff for local preferences. If you want to -install somewhere other than //uussrr//XX1111RR66..44, change PPrroojjeeccttRRoooott. (Do _n_o_t -use DDEESSTTDDIIRR.) If you want to build with _g_c_c uncomment the HHaassGGcccc22 line. -If you have _g_c_c, but not _c_c, please read the full build instructions. - -If some time has elapsed since the initial release of R6.4, check to see -if any public patches have been released. The source tar files may have -been updated -- check the patch-level line in the bug-report template. -If the source in the tar files has not been updated then get all the -patches and apply them, following the instructions at the top of each -patch. Ignore the rebuild steps in the patch application instructions. - -Check the appropriate vendor-specific ..ccff file in xxcc//ccoonnffiigg//ccff// to make -sure that _O_S_M_a_j_o_r_V_e_r_s_i_o_n, _O_S_M_i_n_o_r_V_e_r_s_i_o_n, and _O_S_T_e_e_n_y_V_e_r_s_i_o_n are set -correctly for your system. On most systems imake will figure these out -automatically; but you may override them in your xxcc//ccoonnffiigg//ccff//ssiittee..ddeeff -if you want. - -See if there is a _B_o_o_t_s_t_r_a_p_C_F_l_a_g_s mentioned in the comments in the ven- -dor-specific ..ccff file. (Most systems don't have or need one. The Boot- -strapCFlags in _s_u_n_._c_f is for SunOS 4.0.x, so if you're building on SunOS -4.1.x or SunOS 5/Solaris 2 then BootstrapCFlags doesn't apply.) If there -isn't one, _c_d to the xxcc directory and type (in csh): - - % make World >& world.log - - -If there is an applicable BBoooottssttrraappCCFFllaaggss, take its value and type: - - % make World BOOTSTRAPCFLAGS="_v_a_l_u_e" >& world.log - - -Do not call the output file "make.log" when doing "make World". After a -successful build, you can install with: - - % make install >& install.log - - -You can install manual pages with: - - % make install.man >& man.log - - -WWhhiillee tthhee ssyysstteemm iiss bbuuiillddiinngg ((oorr iiff tthhiinnggss ffaaiill)),, rreeaadd tthhee rreesstt ooff tthheessee -iinnssttaallllaattiioonn iinnssttrruuccttiioonnss.. - - - -_2_. _B_u_i_l_d_i_n_g _a_n_d _I_n_s_t_a_l_l_i_n_g _R_6_._4 - - -Historically the MIT X Consortium and The X Consortium, Inc., sample -implementation releases have always been source-code-only releases, and -this release is no different. - - -_2_._1_. _I_n_t_r_o_d_u_c_t_i_o_n - - -Every release of X has been progressively easier to configure, build, -and install than the preceding releases -- and we believe this release -is the easiest release to build yet. That not withstanding, if things do -go amiss during the build we assume that you have the basic skills nec- -essary, and the willingness, to debug any errors that may occur in the -build process. When you install, if you're going to use _x_d_m or replace -your system's old X, we assume you have a basic understanding of your -system's initialization process. For Remote Execution (RX, embedding) we -assume you that you understand the fundamentals of HTTP, CGI, and HTML. -If these assumptions are not correct then you should consider finding -someone who has proficiency in these areas to do the build and install -for you. - -After the release has been out for a while more up to date information -about any newly-discovered problems may be found in the _F_r_e_q_u_e_n_t_l_y _A_s_k_e_d -_Q_u_e_s_t_i_o_n_s posting appearing monthly on the Usenet newsgroup comp.win- -dows.x and xpert mailing list. The FAQ is also available via anonymous -FTP from ftp://ftp.x.org/ in the file ftp://ftp.x.org/con- -trib/faqs/FAQ.Z, or possibly on one of X mirror sites. - - -_2_._2_. _P_r_e_p_a_r_i_n_g _Y_o_u_r _B_u_i_l_d _S_y_s_t_e_m - - -The source is distributed in four gzip compressed UNIX TTape AARRchive -(tar) files. You will need about 200 Mb of disk space in order to unpack -and build the release. Installing requires an additional 30-50 Mb assum- -ing you have shared libraries (80-100 Mb without). - -On non-UNIX systems you'll need a utility that can extract gzip com- -pressed tar files to extract the sources. There are several to chose -from, we do not make recommendations about which one you should use. - -Release 6.4 sources are distributed among the tar files as follows: - - - tog-1.tar contains everything in xc/ that isn't in the other tar files - tog-2.tar contains xc/fonts - tog-3.tar contains xc/doc/specs, xc/util - tog-4.tar contains xc/doc/hardcopy - - -If you define _B_u_i_l_d_F_o_n_t_s to NO in your ssiittee..ddeeff file, then you only need -to unpack tog-1.tar to build. If you build fonts, then you will also -need tog-2.tar to build. If you already have the fonts from prior -releases you can use those instead of downloading them again. We presume -that you know how to copy or move them from your old source tree to the -R6.4 source tree. - - -_2_._3_. _U_n_p_a_c_k_i_n_g _t_h_e _D_i_s_t_r_i_b_u_t_i_o_n - - -Create a directory to hold the sources and _c_d into it: - - % mkdir _s_o_u_r_c_e_d_i_r - % cd _s_o_u_r_c_e_d_i_r - -Then for each tar file ttoogg--**..ttaarr..ggzz, execute this: - - % gunzip -c _f_t_p_-_d_i_r/tog-_N.tar.gz | tar xf - - - -or if you have GNU's tar (FreeBSD, NetBSD, OpenBSD, or Linux too) - - % tar xzf _f_t_p_-_d_i_r/tog-_N.tar.gz - - - -_2_._4_. _A_p_p_l_y_i_n_g _P_a_t_c_h_e_s - - -If some time has elapsed since the initial release of R6.4, check to see -if any public patches have been released. The source tar files may have -been updated -- check the patch-level line in the bug-report template. -If the source in the tar files has not been updated then get all the -patches and apply them, following the instructions at the top of each -patch. Ignore the rebuild steps in the patch application instructions. - -See the section "Public Patches" later in this document. - -Then continue here. - - -_2_._5_. _C_o_n_f_i_g_u_r_a_t_i_o_n _P_a_r_a_m_e_t_e_r_s _(_I_m_a_k_e _V_a_r_i_a_b_l_e_s_) - - -This release, like all the releases before it, uses _i_m_a_k_e, a utility for -creating system-specific Makefiles from system-independent Imakefiles. -Almost every directory in the release contains an IImmaakkeeffiillee. System-spe- -cific configuration information is located in xxcc//ccoonnffiigg//ccff//, which is -used by the _i_m_a_k_e program every time a MMaakkeeffiillee is generated in the -source tree. - -Most of the configuration work prior to building the release is to set -parameters (imake variables) so that _i_m_a_k_e will generate correct Make- -files. If you're building on one of the supported systems almost no con- -figuration work should be necessary. - -You should define your configuration parameters in xxcc//ccoonn-- -ffiigg//ccff//ssiittee..ddeeff. We provide an empty ssiittee..ddeeff file and a ssiittee..ssaammppllee -file. The ssiittee..ssaammppllee file is a suggested ssiittee..ddeeff file -- use it at -your own risk. - -Any public patches we release will never patch ssiittee..ddeeff, so you can be -assured that applying a public-patch will not corrupt your site.def -file. On rare occasion you may need to make the change in your vendor- -specific ..ccff file; but you should avoid doing that if at all possible -because any patch we might release could conceivably patch your vendor- -specific ..ccff file and your change may be lost or garbled. You can over- -ride most of the things in your vendor-specific ..ccff file in your -ssiittee..ddeeff file. (If you can't, it's a bug -- please file a bug-report.) - -On the systems we use here, imake will automatically determine the _O_S_M_a_- -_j_o_r_V_e_r_s_i_o_n, _O_S_M_i_n_o_r_V_e_r_s_i_o_n, and _O_S_T_e_e_n_y_V_e_r_s_i_o_n for your system. If your -system isn't one of the systems we build on here, or you want to build -for a different version of your operating system, then you can override -them in the appropriate entry in your ssiittee..ddeeff file. - -The ssiittee..ddeeff file has two parts, one protected with "#ifdef BeforeVen- -dorCF" and one with "#ifdef AfterVendorCF". The file is actually pro- -cessed twice, once before the ..ccff file and once after. About the only -thing you need to set in the "before" section is HHaassGGcccc22; just about -everything else can be set in the "after" section. - -The ssiittee..ssaammppllee also has commented out support to include another file, -hhoosstt..ddeeff. This scheme may be useful if you want to set most parameters -site-wide, but some parameters vary from machine to machine. If you use -a symbolic link tree, you can share ssiittee..ddeeff across all machines, and -give each machine its own copy of hhoosstt..ddeeff. - -The config parameters are listed in xxcc//ccoonnffiigg//ccff//RREEAADDMMEE, but here are -some of the new or more common parameters that you may wish to set in -your xxcc//ccoonnffiigg//ccff//ssiittee..ddeeff. - -PPrroojjeeccttRRoooott - The destination where X will be installed. This variable needs to - be set before you build, as some programs that read files at run- - time have the installation directory compiled in to them. - -HHaassVVaarrDDiirreeccttoorryy - Set to NNOO if your system doesn't have /var or you don't want cer- - tain files to be installed in _V_a_r_D_i_r_e_c_t_o_r_y. - -VVaarrDDiirreeccttoorryy - The location of site editable configuration and run-time files. - Many sites prefer to install their X binaries on _r_e_a_d_-_o_n_l_y media -- - either a disk slice (partition) that's mounted _r_e_a_d_-_o_n_l_y for added - security, an NFS volume mounted _r_e_a_d_-_o_n_l_y for security and/or - improved VM paging characteristics, or from a _l_i_v_e _f_i_l_e_s_y_s_t_e_m on a - CD-ROM. In order to simplify things like installing _a_p_p_-_d_e_f_a_u_l_t - files for locally built software, and allowing editing of miscella- - neous configuration and policy files, and to allow xdm to create - its master Xauthority file, some directories under _$_P_r_o_j_e_c_t_- - _R_o_o_t//lliibb//XX1111 are actually installed in //vvaarr//XX1111, and _$_P_r_o_j_e_c_t_- - _R_o_o_t//lliibb//XX1111 contains symlinks to the directories in //vvaarr//XX1111. - -HHaassGGcccc22 - Set to YYEESS to build with _g_c_c version 2.x instead of your system's - default compiler. - -BBuuiillddXXIInnppuuttEExxtt - Set to YYEESS to build the X Input Extension. This extension requires - device-dependent support in the X server, which exists only in _X_h_p - and _X_F_8_6___* in the sample implementation. - -DDeeffaauullttUUssrrBBiinn - This is a directory where programs will be found even if PATH is - not set in the environment. It is independent of ProjectRoot and - defaults to //uussrr//bbiinn. It is used, for example, when connecting from - a remote system via _r_s_h. The _r_s_t_a_r_t program installs its server in - this directory. - -IInnssttaallllSSeerrvveerrSSeettUUIIDD - Some systems require the X server to run as root to access the - devices it needs. If you are on such a system and will not be using - _x_d_m, you may set this variable to YYEESS to install the X server - setuid to root; however the X Project Team strongly recommends that - you not install your server suid-root, but that you use xdm - instead. Talk to your system manager before setting this variable - to YYEESS. - -IInnssttaallllXXddmmCCoonnffiigg - By default set to NO, which suppresses installing xdm config files - over existing ones. Leave it set to NO if your site has customized - the files in _$_P_r_o_j_e_c_t_R_o_o_t//lliibb//XX1111//xxddmm, as many sites do. If you - don't install the new files, merge any changes present in the new - files. - -MMoottiiffBBCC - Causes Xlib and Xt to work around some bugs in older versions of - Motif. Set to YYEESS only if you will be linking with Motif version - 1.1.1, 1.1.2, or 1.1.3. - -GGeettVVaalluueessBBCC - Setting this variable to YYEESS allows illegal XtGetValues requests - with NULL ArgVal to usually succeed, as R5 did. Some applications - erroneously rely on this behavior. Support for this will be removed - in a future release. - -The following vendor-specific ..ccff files are in the release but have not -been tested recently and hence probably need changes to work: aappoolllloo..ccff, -bbssdd..ccff, ccoonnvveexx..ccff, DDGGUUXX..ccff, lluunnaa..ccff, mmaaccIIII..ccff, MMiippss..ccff, mmoottoo..ccff, OOkkii..ccff, -ppeeggaassuuss..ccff, xx338866..ccff. AAmmooeebbaa..ccff is known to require additional patches. - -The file xxcc//lliibb//XXddmmccpp//WWrraapphheellpp..cc, for XDM-AUTHORIZATION-1, is not -included in this release. See ftp://ftp.x.org/pub/R6.4/xdm-auth/README. - - -_2_._6_. _S_y_s_t_e_m _B_u_i_l_d _N_o_t_e_s - - -This section contains hints on building X with specific compilers and -operating systems. - -If the build isn't finding things right, make sure you are using a com- -piler for your operating system. For example, a pre-compiled _g_c_c for a -different OS (e.g. as a cross-compiler) will not have right symbols -defined, so _i_m_a_k_e will not work correctly. - - -_2_._6_._1_. _g_c_c - -X will not compile on some systems with _g_c_c version 2.5, 2.5.1, or 2.5.2 -because of an incorrect declaration of memmove() in a gcc fixed include -file. - -If you are using a _g_c_c version prior to 2.7 on Solaris x86, you need to -specify BBOOOOTTSSTTRRAAPPCCFFLLAAGGSS==""--DDssuunn"" in the "make World" command. - -If you're building on a system that has an unbundled compiler, e.g. So- -laris 2.x, and you do not have the _c_c compiler, you need to contrive to -have _c_c in your path in order to bootstrap imake. One way to do this is -to create a symlink cc that points to _g_c_c. - - % cd /usr/local/bin; ln -s _p_a_t_h_-_t_o_-_g_c_c cc - -Once _i_m_a_k_e has been built all the Makefiles created with it will explic- -itly use _g_c_c and you can remove the symlink. Another way around this is -to edit xxcc//ccoonnffiigg//iimmaakkee//MMaakkeeffiillee..iinnii to specify _g_c_c instead of _c_c. - - -_2_._6_._2_. _O_t_h_e_r _G_N_U _t_o_o_l_s - -Use of the GNU BinUtils assembler, _a_s, and linker, _l_d, is not supported --- period! If you have them installed on your system you must rename or -remove them for the duration of the R6.4 build. (You can restore them -afterwards.) - -The system-supplied _m_a_k_e works just fine for building R6.4 and that's -what we suggest you use. If you've replaced your system's _m_a_k_e with GNU -_m_a_k_e then we recommend that you restore the system _m_a_k_e for the duration -of your R6.4 build. After R6.4 is done building you can revert to GNU -make. GNU make on most systems (except Linux, where it is the default -make) is not a supported build configuration. GNU make may work for you, -and if it does, great; but if it doesn't we do not consider it a bug in -R6.4. If, after this admonition, you still use GNU make and your build -fails, reread the above, and retry the build with the system's _m_a_k_e be- -fore you file a bug-report. - - -_2_._6_._3_. _I_B_M _A_I_X _4_._x - - -On AIX 4.x, the file lliibb//ffoonntt//TTyyppee11//oobbjjeeccttss..cc must be compiled without -optimization (--OO) or the X server and fontserver will exit when Type 1 -fonts are used. - - -_2_._6_._4_. _S_u_n_O_S _4_._0_._x - - -SunOS 4.0 and earlier need BOOTSTRAPCFLAGS=-DNOSTDHDRS because it does -not have unistd.h and stdlib.h. Do _n_o_t supply a BOOTSTRAPCFLAGS when -building any SunOS 4.1 or 5.x (Solaris 2) version. - - -_2_._6_._5_. _L_i_n_u_x - - -On Linux systems imake has preliminary support to automatically deter- -mine which Linux distribution you're using. At this time it only auto- -matically detects S.u.S.E. Linux. On other Linux systems you should set -the LinuxDistribution parameter in your xxcc//ccoonnffiigg//ccff//ssiittee..ddeeff -- see the -xxcc//ccoonnffiigg//ccff//lliinnuuxx..ccff file for the list of valid values. On Linux sys- -tems imake will also automatically determine which version of libc and -binutils your system has. You may override these in your xxcc//ccoonn-- -ffiigg//ccff//ssiittee..ddeeff file. - -Many distributions of Linux have poor or no support for ANSI/POSIX/ISO C -locale support. If your Linux distribution is one of these you should -make certain that the imake variable _L_i_n_u_x_L_o_c_a_l_e_D_e_f_i_n_e_s is set to ---DDXX__LLOOCCAALLEE so that compose processing and other internationalization -features will work correctly. To help decide if you should use -DX_LO- -CALE, look in /usr/share/locale -- if it's empty, you should probably -use the -DX_LOCALE define. - - -_2_._6_._6_. _M_i_c_r_o_s_o_f_t _W_i_n_d_o_w_s _N_T - - -All of the base libraries are supported, including multi-threading in -Xlib and Xt, but some of the more complicated applications, specifically -_x_t_e_r_m and _x_d_m, are not supported. - -There are also some other rough edges in the implementation, such as -lack of support for non-socket file descriptors as Xt alternate inputs -and not using the registry for configurable parameters like the system -filenames and search paths. - -The _X_n_e_s_t server has been made to run on NT; although it still requires -a real X server for output still. A real X server can not be built from -these sources -- in order to display X applications on a MS-Windows host -you will have to acquire a real X Server. - -You have several choices for imake's _R_m_T_r_e_e_C_m_d. Look at the possible -definitions in the xxcc//ccoonnffiigg//ccff//WWiinn3322..ccff file, choose one that's right -for you, and add it to your xxcc//ccoonnffiigg//ccff//ssiittee..ddeeff file. - - -_2_._7_. _T_h_e _B_u_i_l_d - - -For all the supported UNIX and UNIX-like systems you can simply type (in -csh): - - % make World >& world.log - -You can call the output file something other than "world.log"; but don't -call it "make.log" because files with this name are automatically delet- -ed during the initial "cleaning" stage of the build. - -The build can take several hours on older systems, and may take as lit- -tle as an hour on the faster systems that are available today. On UNIX -and UNIX-like systems you may want to run it in the background and keep -a watch on the output. For example: - - % make World >& world.log & - % tail -f world.log - - -If something goes wrong, the easiest thing is to correct the problem and -start over again, i.e. typing "make World". - - -_2_._7_._1_. _U_N_I_X _a_n_d _U_N_I_X_-_l_i_k_e _s_y_s_t_e_m_s - - -Check your vendor-specific ..ccff file; if it doesn't have BootstrapCFlags -that apply to your version of the operating system then type (in csh): - - % make World >& world.log - - -Otherwise type (in csh): - - % make World BOOTSTRAPCFLAGS="value" >& world.log - - -None of the _s_u_p_p_o_r_t_e_d operating systems need to use BOOTSTRAPCFLAGS. - - -_2_._7_._2_. _M_i_c_r_o_s_o_f_t _W_i_n_d_o_w_s _N_T - - -On NT, make certain your Path, Include, and Lib environment variables -are set accordingly. For example here we use the command line compiler -in VC++ 4.0 Standard Edition, which is installed in C:MSDEVSTD. To setup -the environment type: - - > set Path=_o_l_d_-_p_a_t_h;C:\MSDEVSTD\bin;C:\_p_a_t_h_-_t_o_-_R_m_T_r_e_e_C_m_d - > set Include=C:\MSDEVSTD\include - > set Lib=C:\MSDEVSTD\lib - -Then to build, at the prompt, type: - - C:\> nmake World.Win32 > world.log - - - -_2_._8_. _I_n_s_t_a_l_l_i_n_g _X - - -After the build has successfully completed you can install the software -by typing the following as root: - - % make install >& install.log - -or on Microsoft Windows NT - - C:\> nmake install > install.log - - -Again, you might want to run this in the background and use _t_a_i_l to -watch the progress. - -You can install the manual pages by typing the following as root: - - % make install.man >& man.log - - - -_2_._9_. _S_h_a_r_e_d _L_i_b_r_a_r_i_e_s - - -The version number of some of the the shared libraries has been changed. -On SunOS 4, which supports minor version numbers for shared libraries, -programs linked with the R6.4 libraries will use the new libraries with -no special action required. - -On most other modern operating systems the version portion of the li- -brary name, i.e. "6.1" portion of "libX11.so.6.1" is a string. Even if -it's only one character long, e.g. "1" (as in libX11.so.1) it's still a -string. This string uniquely identifies and distinguishes one version of -the library from another. Even though all the libraries in this release -are compatible with the libraries from previous releases, and there's -otherwise no reason to change the version string, we do it to identify -which source release the libraries were built from. - -An old program that was linked with libXext.so.6.3 won't run if you -delete libXext.so.6.3 and install libXext.so.6.4 in its place. In gener- -al on these systems you have the following choices: - -1. Keep the old versions of the libraries around. - -2. Relink all applications with the new libraries. - -3. Create a symlink using the old name which points to the new name. - - For example, to have programs that were linked against libX- - ext.so.6.3 use libXext.so.6.4, make this symlink: - - % cd _$_P_r_o_j_e_c_t_R_o_o_t/lib - % ln -s libXext.so.6.4 libXext.so.6.3 - - -On some distributions of Linux the run-time loader is broken -- requir- -ing that the library's internal SONAME match the _f_i_l_e_n_a_m_e -- and the -symlink solution won't work. We recommend that you get a new run-time -loader which is not broken or recompile your run-time loader to not re- -quire that the SONAME match. - - -_2_._1_0_. _S_e_t_t_i_n_g _U_p _x_t_e_r_m - - -If your //eettcc//tteerrmmccaapp and //uussrr//lliibb//tteerrmmiinnffoo databases do not have correct -entries for _x_t_e_r_m, use the sample entries provided in the directory -xxcc//pprrooggrraammss//xxtteerrmm//. System V users may need to compile and install the -tteerrmmiinnffoo entry with the _t_i_c utility. - -Since each _x_t_e_r_m will need a separate pseudoterminal, you need a reason- -able number of them for normal execution. You probably will want at -least 32 on a small, multiuser system. On most systems, each pty has two -devices, a master and a slave, which are usually named -/dev/tty[pqrstu][0-f] and /dev/pty[pqrstu][0-f]. If you don't have at -least the "p" and "q" sets configured (try typing "ls /dev/?ty??"), you -should have your system administrator add them. This is commonly done -by running the _M_A_K_E_D_E_V script in the //ddeevv directory with appropriate ar- -guments. - - -_2_._1_1_. _S_t_a_r_t_i_n_g _S_e_r_v_e_r_s _A_u_t_o_m_a_t_i_c_a_l_l_y _a_t _S_y_s_t_e_m _B_o_o_t - - -The _x_f_s and _x_d_m programs are designed to be run automatically at system -startup. Please read the manual pages for details on setting up configu- -ration files; reasonable sample files are in xxcc//pprrooggrraammss//xxddmm//ccoonnffiigg// and -xxcc//pprrooggrraammss//xxffss//. - -Since _x_f_s can serve fonts over the network, you do not need to run a -font server on every machine with an X display. You should start _x_f_s be- -fore _x_d_m, since _x_d_m may start an X server which is a client of (depen- -dent on) the font server. - - -_2_._1_1_._1_. _O_n _B_S_D_-_b_a_s_e_d _s_y_s_t_e_m_s _u_s_i_n_g _/_e_t_c_/_r_c _o_r _/_e_t_c_/_r_c_._l_o_c_a_l - - -If your system uses an //eettcc//rrcc or //eettcc//rrcc..llooccaall file at boot time, you -can usually enable these programs by placing the following at or near -the end of the file: - - if [ -f _$_P_r_o_j_e_c_t_R_o_o_t/bin/xfs ]; then - _$_P_r_o_j_e_c_t_R_o_o_t/bin/xfs & echo -n ' xfs' - fi - - if [ -f _$_P_r_o_j_e_c_t_R_o_o_t/bin/xdm ]; then - _$_P_r_o_j_e_c_t_R_o_o_t/bin/xdm; echo -n ' xdm' - fi - - -On later versions of FreeBSD the preferred way of doing this is to cre- -ate the directory _$_P_r_o_j_e_c_t_R_o_o_t/etc/rc.d. Add this directory to the _l_o_- -_c_a_l___s_t_a_r_t_u_p variable defined in /etc/rc.conf, and then create short -scripts in this directory to start xfs and xdm. - -If you are unsure about how system boot works, or if your system does -not use //eettcc//rrcc, consult your system administrator for help. - - -_2_._1_1_._2_. _O_n _L_i_n_u_x _s_y_s_t_e_m_s - - -Most Linux distributions have an /etc/inittab entry specifically for -xdm. Depending on your distribution this may be _r_u_n_-_l_e_v_e_l three, four, -or five. To use xdm, edit //eettcc//iinniittttaabb and find the line which contains -_i_n_i_t_d_e_f_a_u_l_t and change it from 2 to the appropriate run-level - -You Linux distribution may already have a script to start xdm at a par- -ticular run-level. For example on S.u.S.E. Linux 5.0 there is the file -/sbin/init.d/xdm, and the symlink /sbin/init.d/rc3.d/S30xdm which points -to /sbin/init.d/xdm. Change /sbin/init.d/xdm to use _$_P_r_o_j_e_c_t_- -_R_o_o_t_/_b_i_n_/_x_d_m. You can use the xdm script as a model write an xfs script. -Depending on your Linux distribution you may find these files in -/etc/init.d instead of /sbin/init.d. - - -_2_._1_1_._3_. _O_n _D_i_g_i_t_a_l _U_n_i_x_, _H_P_U_X _1_0_, _a_n_d _S_V_R_4 _s_y_s_t_e_m_s - - -Most systems run xdm by default at some particular run-level of the sys- -tem. There is a master _i_n_i_t_._d file and a run-level symlink _r_c_?_._d that -points to the master _i_n_i_t_._d file: -Operating System rc?.d symlink init.d file - -Digital Unix 4.0 /sbin/rc3.d/S95xlogin /sbin/init.d/xlogin -HPUX 10.20 /sbin/rc3.d/S800xdm /sbin/init.d/xdm -Solaris 2.[0-4] -Solaris 2.5 /etc/rc3.d/S99xdm /etc/init.d/xdm.rc -Solaris 2.6 /etc/rc2.d/S99dtlogin /etc/init.d/dtlogin -IRIX 6.2 /etc/rc2.d/S98xdm /etc/init.d/xdm -Unixware /etc/rc2.d/S69xdm /etc/init.d/xdm - -In general you can edit the _i_n_i_t_._d file to use _$_P_r_o_j_e_c_t_R_o_o_t//bbiinn//xxddmm. You -can use the xdm file as a model to write an /etc/rc?.d/S??xfs file to -start xfs. Some systems may already have files to start xfs. Starting in -Solaris 2.5 Sun uses inetd to start xfs -- you should remove the xfs en- -tries from /etc/inetd.conf and /etc/services before adding xfs to the -run-level files. - - -_2_._1_1_._4_. _O_n _S_y_s_t_e_m_V_-_b_a_s_e_d _s_y_s_t_e_m_s - - -On systems with a //eettcc//iinniittttaabb file, you can edit this file to add the -lines - - xfs:3:once:_$_P_r_o_j_e_c_t_R_o_o_t/bin/xfs - xdm:3:once:_$_P_r_o_j_e_c_t_R_o_o_t/bin/xdm - - - - -_2_._1_2_. _U_s_i_n_g _O_P_E_N _L_O_O_K _a_p_p_l_i_c_a_t_i_o_n_s - - -You can use the X11R6.x Xsun server with OPEN LOOK applications; but you -must pass the --sswwaappLLkkeeyyss flag to the server on startup, or the OPEN LOOK -Undo, Copy, Paste, Find, and Cut keys may not work correctly. For exam- -ple, to run Sun's OpenWindows 3.3 desktop environment with an X11R6 -server, use the command: - - % openwin -server _$_P_r_o_j_e_c_t_R_o_o_t_/_b_i_n_/_X_s_u_n _-_s_w_a_p_L_k_e_y_s - - -The keysyms reported by keys on the numeric keypad have also changed -since X11R5; if you find that OpenWindows applications do not respond to -keypad keys and cursor control keys when using an R6 server, you can -remap the keypad to generate R5 style keysyms using the following -_x_m_o_d_m_a_p commands: - - keysym Pause = F21 - keysym Print = F22 - keysym Break = F23 - keysym KP_Equal = F24 - keysym KP_Divide = F25 - keysym KP_Multiply = F26 - keysym KP_Home = F27 - keysym KP_Up = Up - keysym KP_Prior = F29 - keysym KP_Left = Left - keycode 100 = F31 - keysym KP_Right = Right - keysym KP_End = F33 - keysym KP_Down = Down - keysym KP_Next = F35 - keysym KP_Insert = Insert - keysym KP_Delete = Delete - - - -_2_._1_3_. _R_e_b_u_i_l_d_i_n_g _a_f_t_e_r _P_a_t_c_h_e_s - - -Eventually you are going to make changes to the sources, for example by -applying any public patches that may be released or to fix any bugs you -may have found. - -If only source files are changed, rebuild by going to the base of your -source tree xxcc and typing: - - % make >& make.log - - -If there are imake configuration file changes, the best thing to do is -type: - - % make Everything >& every.log - - -"Everything" is similar to "World" in that it rebuilds every MMaakkeeffiillee, -but unlike "World" it does not delete the existing objects, libraries, -and executables, and only rebuilds what is out of date. - - -_2_._1_4_. _F_o_r_m_a_t_t_i_n_g _t_h_e _D_o_c_u_m_e_n_t_a_t_i_o_n - - -The PostScript files in xxcc//ddoocc//hhaarrddccooppyy can be generated from the -sources in xxcc//ddoocc//ssppeeccss. Most of the documentation is in troff using the --ms macros. The easiest way to format it is to use the Imakefiles pro- -vided. - -Set the name of your local troff program by setting the variable TTrrooff-- -ffCCmmdd in xxcc//ccoonnffiigg//ccff//ssiittee..ddeeff. Then build the Makefiles: - - cd xc/doc - make SUBDIRS=specs Makefiles - - -Finally, go to the directory you are interested in and type "make" -there. This command will generate ..PPSS files. You can also generate text -files by specifying the document name with a ..ttxxtt extension as a _m_a_k_e -target, e.g., "make icccm.txt". - - -_3_. _P_u_b_l_i_c _P_a_t_c_h_e_s - - -The Open Group X Project Team may from time to time issue public patches -for this release to fix any serious problems that are discovered. Such -fixes are a subset of fixes available to X Project Team members. Public -patches are available via anonymous FTP from -ftp://ftp.x.org/pub/R6.4/fixes, or from your local X mirror site. Check -the site closest to you first. - -You can determine which public patches have already been applied to your -source tree by examining the "VERSION" line of xxcc//bbuugg--rreeppoorrtt. The source -in the tar files you have may already have some patches applied; you on- -ly need to apply later patches. If you try to apply patches out of order -or apply patches that are already in your tree, _p_a_t_c_h will tell you that -you have the wrong version and not apply the patch. - -Source for the _p_a_t_c_h program is in xxcc//uuttiill//ppaattcchh//. The _p_a_t_c_h program in- -cluded on some systems may not support all the options this version has. -If you have problems applying patches, or if you're otherwise in doubt, -use this version. - - Index: xc/Imakefile diff -u xc/Imakefile:3.19 xc/Imakefile:3.20 --- xc/Imakefile:3.19 Wed May 31 11:02:54 2000 +++ xc/Imakefile Fri Jul 7 16:06:55 2000 @@ -1,5 +1,5 @@ XCOMM $TOG: Imakefile /main/138 1997/12/29 16:37:30 kaleb $ -XCOMM $XFree86: xc/Imakefile,v 3.19 2000/05/31 15:02:54 eich Exp $ +XCOMM $XFree86: xc/Imakefile,v 3.20 2000/07/07 20:06:55 tsi Exp $ #define IHaveSubdirs #define PassCDebugFlags CDEBUGFLAGS="$(CDEBUGFLAGS)" @@ -48,6 +48,10 @@ @echo Linux Distribution: LinuxDistName @echo libc version: LinuxCLibMajorVersion"."LinuxCLibMinorVersion"."LinuxCLibTeenyVersion @echo binutils version: `expr LinuxBinUtilsMajorVersion / 10`.`expr LinuxBinUtilsMajorVersion % 10` + @echo "" +#endif +#if defined(GccMajorVersion) && defined(GccMinorVersion) + @echo GCC version: GccMajorVersion"."GccMinorVersion @echo "" #endif Index: xc/RELNOTES diff -u /dev/null xc/RELNOTES:1.1 --- /dev/null Mon Dec 18 14:20:58 2000 +++ xc/RELNOTES Sun Dec 17 21:45:46 2000 @@ -0,0 +1,1087 @@ + Release Notes for XFree86[tm] 4.0.2 + + The XFree86 Project, Inc + + 17 December 2000 + + Abstract + + This document contains some information about the features present + in XFree86 4.0.2 and their status. + +1. Introduction to the 4.x Release Series + +XFree86 4.0 was the first official release of the new XFree86 4 series. The +current release (4.0.2) is the latest in that series. XFree86 4 represents a +significant redesign of the XFree86 X server. Not all of the hardware +drivers from 3.3.x have been ported to 4.x yet, but conversely, 4.x has some +hardware support not present in 3.3.x. Our Driver Status document summarizes +how the hardware driver support compares between 3.3.6 and 4.0.2. Please +check there first before downloading 4.0.2. + +The 4.0.1 release introduced a new graphical configuration tool, "xf86cfg", +and a text mode interface was added to it for the 4.0.2 release. It is work +in progress, but definitely worth trying out. The trusty old text-based tool +"xf86config" can also be used for generating X server config files. In addi- +tion to these tools, we've been working on a configuration tool that is +built-in to the X server. It is included in the release, and it works well +for some hardware. To try it out, just run (as root) "XFree86 -configure". +Each of these configuration options will give you a reasonable starting point +for a suitable configuration file. We've put some effort into documenting +the 4.0.2 config file format, and you can find that information in the +XF86Config manual page. Check that, the driver manual pages and the related +documentation for further information. + +Before you go to download and install the binary distributions for this +release, please have a quick read through the Installation Document. It may +save you some time and help you figure out which of the binary releases you +need. + +The next section describes what is new in the latest version (4.0.2). The +other sections below describe some of the new features and changes between +3.3.x and 4.0. There are lot's of new features, and we definitely don't have +enough space to cover them all here. + +2. Summary of new features in 4.0.2. + +2.1 X server + + o Darwin/Mac OS X is now supported and the X server runs on PowerPC. The + X server for this platform is called "Xdarwin", and its installation and + configuration is different from the "XFree86" server used on other plat- + forms. Please read the XFree86 on Darwin and Mac OS X document for fur- + ther information. + + o Mesa has been updated to the 3.4 stable release. + + o A driver for ATI Radeon adapters has been added. + + o ATI driver support for multi-head configurations and non-Intel platforms + has been improved. + + o The ATI driver has been changed to invoke the appropriate driver for any + Rage 128 and Radeon adapters that it finds in the system. + + o A driver (i128) for Number Nine chipsets has been added. + + o A driver (savage) for S3 Savage chipsets has been added. + + o A driver (siliconmotion) for some Silicon Motion chipsets has been + added. + + o The driver (ark) for Ark Logic chips has been ported to 4.x. + + o A VESA driver has been added. + + o A driver for SGI newport cards has been added (Linux/mips). + + o The trident driver has lots of fixes to the CyberBlade/Blade support, + XVideo support for the Image/Blade series (although scaling doesn't work + yet on the Image series). + + o The s3virge driver has stabilized ViRGE GX2 support, includes ViRGE DX + and ViRGE support for XVideo YUV images, and various fixes. + + o The 3Dlabs (glint) driver now has Permedia3 support. + + o The SiS driver has had many updates, and XVideo support for the 630 is + included. + + o The NVIDIA (nv) driver has been updated to include support for the + GeForce2, and line acceleration has been added. Also, DDC support has + been improved, and support added for Alpha platforms (dense only). + + o The neomagic driver has had various bug fixes and extended acceleration + support. DGA support has also been added. + + o The Chips and Technologies driver (chips) has initial support for the + 69030. + + o The tseng driver has multi-head fixes and DGA support has been added. + + o Most video drivers have been converted to use the integrated "fb" frame- + buffer code instead of the old "cfb" code. + + o DRI support has been updated for the Rage 128, 3Dfx Voodoo3 and Voodoo5, + Intel i810/i815 and Matrox G400. DRI support for SiS and Sun Creator3D + is available. The DRI is now also available on Alpha platforms. + + o An input driver (citron) for Citron Infrared Touch devices has been + added. + + o An input driver (penmount) for PenMount devices has been added. + + o An input driver (digitaledge) for DigitalEdge devices has been added. + + o Big endian problems in Xinerama have been fixed. + + o The new "render" extension has been added (see below (section 4.11, page + 1)). The design has been extended in the following ways: + + o A new FillRectangles request was added. + + o The 'mask' operand was changed to allow per-channel alphas. + + Server implementation: + + o Implemented remaining code for client clip lists. + + o Fixed plenty of bugs related to text rendering. + + o Complete compositing code, except for separate alpha. + + Todo: + + o Polygons + + o Image scaling + + o Separate alpha channels + + o Support for visuals other than TrueColor. + + Drivers with render extension support include: i128, glint, ati (r128 + and radeon), chips, cirrus, mga, neomagic, nv, tdfx, trident, tseng, + vesa, s3virge. + + Acceleration for the render extension: + + o XAA infrastructure for acceleration. + + o Experimental MGA acceleration using XAA + + o kdrive (TinyX) infrastructure + + o Experimental TinyX Trident 9525DVD acceleration + + Xft library: + + o New font naming/access library. + + o Abstraction for core/Render text. + + o Uses FreeType2 rasterizer. + + o Allows anti-aliased/subpixel sampled text. + + o Gracefully falls back to core rendering. + + o Complicated font matching mechanism. + + o Uses server DPI to convert point sizes to pixel sizes, even for + core fonts. + + xterm: + + o Can use Xft, by default uses core fonts. + + o Uses new options '-fa' for family name and '-fs' for font size (in + points). + + x11perf: + + o Add tests for anti-aliased, subpixel sampled and aliased fonts + using the Xft library. + + xditview: + + o When the Xft library is build, uses Xft for all font access. + + Qt, Gtk, twm: + + o Qt changes available here . + + o Gtk changes in process. + + o twm hacks should never see the light of day. + + o xf86cfg, a new graphical configuration tool for XFree86 4.x, and can be + used to either write the initial configuration or make customisations to + the current configuration. xf86cfg is a work in progress, and allows + configuration of: + + o Specific setup of monitors, cards, keyboards and mice, as well as + adding or removing them. + + o Server layout setup, allowing complex configuration of physical + monitor positions, default color depth and/or rotated monitors. + + o Mode line editor that can be used to configure multiple monitors, + and allows adding a modeline specific to a monitor directly to the + configuration file. + + o AccessX configuration interface, that provides an interface to easy + setup of most AccessX options, including: + + o Timeout to reset controls. + + o StickyKeys, for people with disabilities that cannot press two + keys at the same time. + + o MouseKeys, mouse control only with the keyboard. + + o RepeatKeys, repeat rate and repeat delay. + + o SlowKeys, to avoid pressing keys accidentally, they're only + accepted if pressed for some specific amount of time. + + o BounceKeys, helps avoiding multiple key presses by only + accepting a key if it is pressed only once and not pressed + again in a specific amount of time. + + New configuration options are being worked on, as well as correcting + some of the bugs in the current options. A protocol for plugging in + external modules is also planned. + +2.2 X libraries and clients. + + o Significant updates to the internationalisation support in Xlib (see + below (section 2.3, page 1)). + + o Some xfs updates, including font path verification, and new options. + + o XTerm updates. + + o New "xvinfo" client for querying the XVideo extension. + +2.3 Fonts and Internationalisation + + o Many of the "misc" bdf fonts have been updated and extended, and a wider + range of ISO-8859 subsets have been added. These are now auto-generated + from ISO-10646 encoded master fonts. + + o The ClearlyU ISO-10646 encoded fonts have been updated. + + o Functions to read keyboard input in locale independent UTF-8 encoding + have been added to libX11: Xutf8LookupString, Xutf8ResetIC. + + o Functions to output strings in locale independent UTF-8 encoding have + been added to libX11: Xutf8DrawString, Xutf8DrawImageString, Xutf8Tex- + tEscapement, Xutf8TextExtents, Xutf8TextPerCharExtents, Xutf8DrawText. + + o Functions to convert between Compound Text or locale dependent encoding + and UTF-8 have been added to libX11: Xutf8TextListToTextProperty, + Xutf8TextPropertyToTextList. The converter between Compound Text and + UTF-8 in Xlib has been improved; a round-trip conversion now correctly + converts all graphic Unicode characters back and forth. + + o libXaw now offers selected text using both selection targets, + UTF8_STRING and COMPOUND_TEXT. + + o Locales with UTF-8 encodings are now supported; but the UTF-8 displaying + facilities are not adequate yet. + + o XKB keyboard definitions have been added and updated for some countries. + +2.4 Platforms + + o Darwin/Mac OS X. + + o Greatly improved IA-64 support. + + o Improved Linux/mips support. + + o Support has been added for more Alpha platforms under Linux. This now + includes all platforms that require sparse memory mapping. + +3. Drivers + +3.1 Video Drivers + +XFree86 4.0.2 includes the following video drivers: + ++--------------+--------------------------+----------------------------------+ +|Driver Name | Description | Further Information | ++--------------+--------------------------+----------------------------------+ +|apm | Alliance Pro Motion | README.apm | +|ark | Ark Logic | | +|ati | ATI | README.ati, README.r128, r128(4) | +|chips | Chips & Technologies | README.chips, chips(4) | +|cirrus | Cirrus Logic | | +|cyrix (*) | Cyrix MediaGX | README.cyrix | +|fbdev | Linux fbdev | fbdev(4) | +|glide | Glide2x (3Dfx) | glide(4) | +|glint | 3Dlabs, TI | glint(4) | +|i128 | Number Nine | README.I128, i128(4) | +|i740 | Intel i740 | README.i740 | +|i810 | Intel i810 | README.i810, i810(4) | +|imstt | Integrated Micro Solns | | +|mga | Matrox | mga(4) | +|neomagic | NeoMagic | neomagic(4) | +|newport (-) | SGI Newport | README.newport, newport(4) | +|nv | NVIDIA | nv(4) | +|rendition | Rendition | README.rendition, rendition(4) | +|s3virge | S3 ViRGE | README.s3virge, s3virge(4) | +|savage | S3 Savage | savage(4) | +|siliconmotion | Silicon Motion | siliconmotion(4) | +|sis | SiS | README.SiS | +|sunbw2 (+) | Sun bw2 | | +|suncg14 (+) | Sun cg14 | | +|suncg3 (+) | Sun cg3 | | +|suncg6 (+) | Sun GX and Turbo GX | | +|sunffb (+) | Sun Creator/3D, Elite 3D | | +|sunleo (+) | Sun Leo (ZX) | | +|suntcx (+) | Sun TCX | | +|tdfx | 3Dfx | | +|tga | DEC TGA | README.DECtga | +|trident | Trident | trident(4) | +|tseng | Tseng Labs | | +|vesa | VESA | vesa(4) | +|vga | Generic VGA | vga(4) | ++--------------+--------------------------+----------------------------------+ + +Drivers marked with (*) are present in a preliminary form in this release, +but are not complete and/or stable yet. + +Drivers marked with (+) are for Linux/Sparc only. + +Drivers marked with (-) are for Linux/mips only. + +Darwin/Mac OS X uses IOKit drivers and does not use the module loader drivers +listed above. Further information can be found in README.Darwin. + +XFree86 4.0.2 includes the following input drivers: + +3.2 Input Drivers + + +------------+--------------------+---------------------+ + |Driver Name | Description | Further Information | + +------------+--------------------+---------------------+ + |acecad | AceCad | | + |citron | Citron | citron(4) | + |digitaledge | DigitalEdge | | + |dynapro | Dynapro | | + |elographics | EloGraphics | | + |keyboard | generic keyboards | keyboard(4) | + |microtouch | MicroTouch | | + |mouse | most mouse devices | mouse(4) | + |mutouch | MicroTouch | | + |penmount | PenMount | | + |spaceorb | SpaceOrb | | + |summa | SummaGraphics | | + |void | dummy device | void(4) | + |wacom | Wacom tablets | wacom(4) | + +------------+--------------------+---------------------+ + +4. Summary of XFree86 4. + +Unlike XFree86 3.3.x where there are multiple X server binaries, each of +which drive different hardware, XFree86 4.0.2 has a single X server binary +called XFree86. This binary can either have one or more video drivers linked +in statically, or, more usually, dynamically load the video drivers and other +modules that are needed. + +XFree86 4.0.2 has X server support for most UNIX(R) and UNIX-like operating +systems on Intel/x86 platforms, plus support for Linux on Alpha, PowerPC, +IA-64, Sparc, and Mips platforms, and for Darwin on PowerPC. Work on support +for additional architectures and operating systems is in progress, and is +planned for future releases. + +4.1 Loader and Modules + +The XFree86 X server has a built-in run-time loader, donated by Metro Link +. This loader can load normal object files and +libraries in most of the commonly used formats. Since the loader doesn't +rely on an operating system's native dynamic loader support, it works on +platforms that don't provide this feature, and makes it possible for the mod- +ules to be operating system independent (although not, of course, independent +of CPU architecture). This means that a module compiled on Linux/x86 can be +loaded by an X server running on Solaris/x86, or FreeBSD, or even OS/2. + +One of the main benefits of this loader is that when modules are updated, +they do not need to be recompiled for every different operating system. In +the future we plan to take advantage of this to provide more frequent driver +module updates in between major releases. + +The loader in version 4.0.2 has support for Intel (x86), Alpha and PowerPC +platforms. It also has preliminary support for Sparc platforms. + +The X server makes use of modules for video drivers, X server extensions, +font rasterisers, input device drivers, framebuffer layers (like mfb, cfb, +etc), and internal components used by some drivers (like XAA), + +The module interfaces (API and ABI) used in this release is still subject to +change without notice. While we will attempt to provide backward compatibil- +ity for the module interfaces as of the 4.0 release (meaning that 4.0 modules +will work with future core X server binaries), we cannot guarantee this. + +Note about module security + + The XFree86 X server runs with root privileges, i.e. the X server + loadable modules also run with these privileges. For this reason + we recommend that all users be careful to only use loadable modules + from reliable sources, otherwise the introduction of viruses and + contaminated code can occur and wreak havoc on your system. We + hope to have a mechanism for signing/verifying the modules that we + provide available in a future release. + +4.2 Configuration File + +The X server configuration file format has been extended to handle some of +the new functionality. The xf86config utility can be used to generate a +basic config file, that may require some manual editing. The X server also +has preliminary support for generating a basic config file. This is done by +running (as root) "XFree86 -configure". Alternatively, the sample config +file XF86Config.eg that is installed in /usr/X11R6/lib/X11 may be used as a +starting point. The XF86Setup utility is currently not usable, but work is +continuing in this area. + +The main changes are covered here, but please refer to the XF86Config manual +page for more comprehensive information: + + o The Module section is used to load server extension modules and font + modules, but not XInput drivers. The .so suffix should no longer be + specified with module names. Options may be supplied for modules by + loading the module via a SubSection instead of the usual Load keyword. + The bitmap module is the only font module that is loaded by default. No + server extensions are loaded by default, but some are built-in to the + server. It is strongly recommended that the extension module containing + a range of small miscellaneous extensions (extmod) be loaded because + some commonly used things won't work correctly without it. The follow- + ing example shows how to load all the server extensions plus the Type1 + and TrueType fonts support, and a commented example that shows how to + pass options to an extension (this one is for loading the misc exten- + sions (extmod) with the XFree86-VidModeExtension disabled): + + Section "Module" + + Load "dbe" + Load "record" + Load "glx" + Load "pex5" + Load "xie" + Load "extmod" + + Load "type1" + Load "freetype" + + # SubSection "extmod" + # Option "Omit XFree86-VidModeExtension" + # EndSubSection + + EndSection + + o Option flags have been extended and are now used more widely in the con- + fig file. Options flags come in two main types. The first type is + exactly like the old form: + + Option "name" + + where the option just has a name specified. The name is case insensi- + tive, and white space and underscore characters are ignored. The second + type consists of a name and a value: + + Option "name" "value" + + The value is passed transparently as a string to the code that uses the + option. Common value formats are integer, boolean, real, string and + frequency. The following boolean option values are recognised as mean- + ing TRUE: "true", "yes", "on", "1", and no value. The values recognised + as FALSE are "false", "no", "off", "0". In addition to this, "no" may + be prepended to the name of a boolean option to indicate that it is + false. Frequency options can have the strings Hz, kHz, or MHz appended + to the numerical value specified. + + Note: the value must always be enclosed in double quotes ("), even when + it is numerical. + + o The ServerFlags section now accepts its parameters as Options instead of + as special keywords. The older keyword format is still recognised for + compatibility purposes, but is deprecated and support for it will likely + be dropped in a future release. The DPMS and screen save timeout values + are now specified in the ServerFlags section rather than elsewhere + (because they are global parameters, not screen-specific). This example + shows the defaults for these: + + Option "blank time" "10" + Option "standby time" "20" + Option "suspend time" "30" + Option "off time" "40" + + o The Keyboard, Pointer and XInput sections have been replaced by a more + general InputDevice section. The old Keyboard and Pointer sections are + still recognised for compatibility purposes, but they are discommended + and support for them may be dropped in future releases. The old XInput + sections are no longer recognised. The keywords from the old sections + are expressed as Options in the InputDevice sections. The following + example shows typical InputDevice sections for the core mouse and key- + board. + + Section "InputDevice" + Identifier "Keyboard 1" + Driver "keyboard" + Option "AutoRepeat" "500 5" + Option "XkbModel" "pc104" + Option "XkbLayout" "us" + EndSection + + Section "InputDevice" + Identifier "Mouse 1" + Driver "mouse" + Option "Protocol" "PS/2" + Option "Device" "/dev/mouse" + Option "SampleRate" "80" + EndSection + + o The Monitor section is mostly unchanged. The main difference is that a + set of VESA modes is defined internally in the server, and so for most + monitors, it isn't necessary to specify any modes explicitly in the Mon- + itor section. There is also a new Modes section that can be used to + define a set of modes separately from the Monitor section, and the Moni- + tor section may "include" them with the "UseModes" keyword. The Monitor + section may also include Options. Options that are monitor-specific, + like the "DPMS" and "Sync on Green" options are best specified in the + Monitor sections. + + o The Device sections are mostly unchanged. The main difference is the + new (and mandatory) Driver keyword that specifies which video driver + should be loaded to drive the video card. Another difference is the + BusID keyword that is used to specify which of possibly multiple video + cards the Device section is for. The following is an example for a + Matrox card: + + Section "Device" + Identifier "MGA 1" + Driver "mga" + BusID "PCI:1:0:0" + EndSection + + o The Screen sections are mostly unchanged. The old Driver keyword is no + longer used, and a mandatory Identifier keyword has been added. The + DefaultColorDepth keyword has been renamed to DefaultDepth. + + o A new section called ServerLayout has been added to allow the layout of + the screens and the selection of input devices to be specified. The + ServerLayout sections may also include options that are normally found + in the ServerFlags section. Multiple ServerLayout sections may be pre- + sent, and selected from the command line. The following example shows a + ServerLayout section for a dual-headed configuration with two Matrox + cards, and two mice: + + Section "ServerLayout" + Identifier "Layout 1" + Screen "MGA 1" + Screen "MGA 2" RightOf "MGA 1" + InputDevice "Keyboard 1" "CoreKeyboard" + InputDevice "Mouse 1" "CorePointer" + InputDevice "Mouse 2" "SendCoreEvents" + Option "BlankTime" "5" + EndSection + + See the XF86Config man page for a more detailed explanation of the for- + mat of the new ServerLayout section. + +The config file search patch has been extended, with the directories /etc/X11 +and /usr/X11R6/etc/X11 being added. The full search path details are docu- +mented in the XF86Config manual page. + +4.3 Command Line Options + +The following new X server command line options have been added: + + -depth n + + This specifies the colour depth that the server is run- + ning at. The default is 8 for most drivers. Most + drivers support the values 8, 15, 16 and 24. Some + drivers also support the values 1 and 4. Some drivers + may also support other depths. Note that the depth is + different from the ``bpp'' that was specified with previ- + ous versions. The depth is the number of bits in each + pixel that are significant in determining the pixel's + value. The bpp is the total size occupied by each pixel, + including bits that are not used. The old -bpp option is + no longer recognised because it isn't a good way of spec- + ifying the server behaviour. + + -fbbpp n + + This specifies the bpp format to use for the framebuffer. + This may be used in 24-bit mode to force a framebuffer + format that is different from what the driver chooses by + default. In most cases there should be no need to use + this option. + + -pixmap24 + + This specifies that the client-side pixmap format should + be the packed 24-bit format that was often used by the + 3.3.x servers. The default is the more common 32-bit + format. There should normally be no need to use this + option. + + -pixmap32 + + This specifies that the client-side pixmap format should + be the sparse 32-bit format. This is the default, so + there should normally be no need to use this option. + + -layout name + + This specifies which ServerLayout section in the config + file to use. When this option is not specified, the + first ServerLayout section is used. When there is no + ServerLayout section, the first Screen section is used. + + -screen name + + This specifies which Screen section in the config file to + use. When this option is not specified, the first + ServerLayout section is used. When there is no Server- + Layout section, the first Screen section is used. + + -keyboard name + + This specifies which InputDevice section in the config + file to use for the core keyboard. This option may be + used in conjunction with the -screen option. + + -pointer name + + This specifies which InputDevice section in the config + file to use for the core pointer. This option may be + used in conjunction with the -screen option. + + -modulepath path + + This specifies the module search path. The path should + be a comma-separated list of absolute directory paths to + search for server modules. When specified here, it over- + rides the value specified in the config file. This + option is only available when the server is started by + the root user. + + -logfile file + + This specifies the log file name. When specified here, + it overrides the default value. This option is only + available when the server is started by the root user. + + -scanpci + + This specifies that the scanpci module should be loaded + and executed. This does a scan of the PCI bus. + + -logverbose [n] + + This options specifies the verbosity level to use for the + log file. The default is 3. + +The following X server command line options have been changed since 3.3.x: + + -verbose [n] + + This option specifies the verbosity level to use for the + server messages that get written to stderr. It may be + specified multiple times to increase the verbosity level + (as with 3.3.x), or the verbosity level may be specified + explicitly as a number. The default verbosity level is + 1. + + -xf86config filename + + This option has been extended to allow non-root users to + specify a relative config file name. The config file + search path will be used to locate the file in this case. + This makes it possible for users to choose from multiple + config files that the the sysadmin has provided. + +4.4 XAA + +The XFree86 Acceleration Architecture (XAA) has been completely rewritten +from scratch for XFree86 4.x. Most drivers implement acceleration by making +use of the XAA module. + +4.5 Multi-head + +Some multi-head configurations are supported in XFree86 4.x, primarily with +multiple PCI/AGP cards. However, this is an area that is still being worked +on, and we expect that the range of configurations for which it works well +will increase in future releases. A configuration that is known to work well +in most cases is multiple (supported) Matrox cards. + +One of the main problems is with drivers not sufficiently initialising cards +that were not initialised at boot time. This has been improved somewhat with +the INT10 support that is used by most drivers (which allows secondary card +to be "soft-booted", but in some cases there are other issues that still need +to be resolved. Some combinations can be made to work better by changing +which card is the primary card (either by using a different PCI slot, or by +changing the system BIOS's preference for the primary card). + +4.6 Xinerama + +Xinerama is an X server extension that allows multiple physical screens to +behave as a single screen. With traditional multi-head in X11, windows can- +not span or cross physical screens. Xinerama removes this limitation. Xin- +erama does, however, require that the physical screens all have the same root +depth, so it isn't possible, for example, to use an 8-bit screen together +with a 16-bit screen in Xinerama mode. + +Xinerama is not enabled by default, and can be enabled with the +xinerama +command line option for the X server. + +Xinerama was included with X11R6.4. The version included in XFree86 4.x was +completely rewritten for improved performance and correctness. + +Known problems: + + o Most window managers are not Xinerama-aware, and so some operations like + window placement and resizing might not behave in an ideal way. This is + an issue that needs to be dealt with in the individual window managers, + and isn't specifically an XFree86 problem. + +4.7 DGA version 2 + +DGA 2.0 is included in 4.0.2, but is not implemented by all drivers. Prelim- +inary documentation for the client libraries can be found in the README.DGA +document. A good degree of backwards compatibility with version 1.0 is pro- +vided. + +4.8 DDC + +The VESA(R) Display Data Channel (DDC[tm]) standard allows the monitor to +tell the video card (or on some cases the computer directly) about itself; +particularly the supported screen resolutions and refresh rates. + +Partial or complete DDC support is available in most of the video drivers. +DDC is enabled by default, but can be disabled with a "Device" section entry: +Option "NoDDC". We have support for DDC versions 1 and 2; these can be dis- +abled independently with Option "NoDDC1" and Option "NoDDC2". + +At startup the server prints out DDC information from the display, but it +does not yet use it the determine modelines. For some drivers, the X +server's new -configure option uses the DDC information when generating the +config file. + +Changed behavior caused by DDC. Several drivers uses DDC information to set +the screen size and pitch. This can be overridden by explicitly resetting it +to the and non-DDC default value 75 with the -dpi 75 command line option for +the X server, or by specifying appropriate screen dimensions with the "Dis- +playSize" keyword in the "Monitor" section of the config file. + +4.9 GLX and the Direct Rendering Infrastructure (DRI) + +Precision Insight (now part of the Pro- +fessional Services group at VA Linux Systems ) +was provided with funding and support from Red Hat , SGI , 3Dfx , Intel +, ATI , and Matrox + to integrate the GLX extension for 3D rendering +in an X11 window. The 3D core rendering component is the Mesa + library. SGI has released the sources to the GLX +extension framework under an open license, which essentially provides the +glue between the 3D library and this windowing system. Precision Insight has +integrated these components into the XFree86 X Server and added a Direct Ren- +dering Infrastructure (DRI). Direct Rendering provides a highly optimized +path for sending 3D data directly to the graphics hardware. This release +provides a complete implementation of direct rendering support for the 3Dfx +Banshee, Voodoo3 and Voodoo5 graphics cards, as well as the Intel i810/i815 +cards, ATI Rage 128, and Matrox G400. Updated information on DRI compatible +drivers can be found at the DRI Project on +SourceForge . + +4.10 XVideo Extension (Xv) + +The XVideo extension is supported in XFree86 4.x. An XvQueryPortAttributes +function has been added as well as support for XvImages. XvImages are XIm- +ages in alternate color spaces such as YUV and can be passed to the server +through shared memory segments. This allows clients to display YUV data with +high quality hardware scaling and filtering. + +4.11 X Rendering Extension (Render) + +The X Rendering extension provides a 2D rendering model that more closely +matches application demands and hardware capabilities. It provides a render- +ing model derived from Plan 9 based on Porter/Duff image composition rather +than binary raster operations. + +Using simple compositing operators provided by most hardware, Render can draw +anti-aliased text and geometric objects as well as perform translucent image +overlays and other image operations not possible with the core X rendering +system. + +XFree86 4.0.2 provides a partial implementation of Render sufficient for +drawing anti-aliased text and image composition. Still to be implemented are +geometric primitives and affine transformation of images. + +Unlike the core protocol, Render provides no font support for applications, +rather it allows applications to upload glyphs for display on the screen. +This allows the client greater control over text rendering and complete +access to the available font information while still providing hardware +acceleration. The Xft library provides font access for Render applications. + +4.11.1 The Xft Library + +On the client side, the Xft library provides access to fonts for applications +using the FreeType library, version 2. FreeType currently supports Type1 and +TrueType font files, a future release is expected to support BDF and PCF +files as well, so Render applications will have access to the complete range +of fonts available to core applications. One important thing to note is that +Xft uses the vertical size of the monitor to compute accurate pixel sizes for +provided point sizes; if your monitor doesn't provide accurate information +via DDC, you may want to add that information to XF86Config. + +To allow a graceful transition for applications moving from core text render- +ing to the Render extension, Xft can use either core fonts or FreeType and +the Render extension for text. By default, Xft is configured to support only +core fonts, see the section on building FreeType support for the changes +needed to add FreeType/Render fonts. + +The Xft library uses a configuration file, XftConfig, which contains informa- +tion about which directories contain font files and also provides a sophisti- +cated font aliasing mechanism. Documentation for that file is included in +the Xft man page. + +4.11.2 Building FreeType support for Xft + +XFree86 4.0.2 includes sources for FreeType version 2.0.1, but they are not +built and installed automatically. As a result, Xft is configured to provide +only core fonts by default. + +To build FreeType support for Xft, first FreeType must be built and +installed, either from the sources included in XFree86 in extras/freetype2 or +from another FreeType (version 2.0.1 or later) release. Early FreeType ver- +sion 2 releases used a different header file installation and aren't compati- +ble with XFree86. Instructions for building and installing FreeType can be +found in the INSTALL file included with the FreeType release. + +Second, XFree86 needs to know the installed location for FreeType, usually +/usr/local. Edit (or create) config/cf/host.def to include: + + #define Freetype2Dir /usr/local + +Finally, build XFree86 with "make World" from the top. + +4.11.3 Application Support For Anti-Aliased Text + +Only three applications have been modified in XFree86 4.0.2 to work with the +Render extension and the Xft and FreeType libraries to provide anti-aliased +text. Xterm, xditview and x11perf. Migration of other applications may +occur in future releases. + +By default, xterm uses core fonts through the standard core API. It has two +command line options and associated resources to direct it to use Xft +instead: + + o -fa family / .VT100.faceName: family. Selects the font family to use. + + o -fs pointsize / .VT100.faceSize: pointsize. Selects the pointsize. + +Xditview will use Xft instead of the core API by default. X11perf includes +tests to measure the performance of text rendered in three ways, anti- +aliased, anti-aliased with sub-pixel sampling and regular chunky text, but +through the Render extension, a path which has not been optimized within the +X server yet. + +4.12 Other extensions + +The XFree86-Misc extension has not been fully ported to the new server archi- +tecture yet. This should be completed in a future release. + +The XFree86-VidModeExtension extension has been updated, and mostly ported to +the new server architecture. The area of mode validation needs further work, +and the extension should be used with care. This extension has support for +changing the gamma setting at run-time, for modes where this is possible. +The new xgamma utility makes use of this feature. Compatibility with the +3.3.x version of the extension is provided. The missing parts of this exten- +sion and some new features should be completed in a future release. + +4.13 Xaw + +Two versions of the Xaw library are provided with XFree86 4.x. A version with +bug fixes and a few binary compatible improvements and a new version with +several new features. + +New features: + + o A displayList resource is available to all Xaw widgets. It basically + consists of a list of drawing commands, fully described in the Xaw(3) + manual page, that enables a integration of Xaw programs with the new + window/desktop managers that allows for configurable themes. + + o Some new actions were added to all Xaw widgets, to allow more config- + urable control of the widgets, and to allow setting resources at run + time. + + o Since Xpm was integrated into XFree86, programs linked with the new Xaw + library will also link with Xpm. This allows for color background + pixmaps, and also for shaped widgets. + + o The text widget is the widget that will present more changes. These + include: + + o Block cursor. + + o Compile time limit of 16384 undo/redo levels (that will automati- + cally grow if the text is not saved when this mark is reached). + + o Overwrite mode. + + o Text killed is inserted in a kill ring list, this text is not for- + gotten, pressing M-y allows traversing the kill ring list. + + o International support for latin languages is available even if the + international resource is not set. Users will need to properly set + the locale environment to make complete use of this feature. + + o A better multiply interface is provided. Pressing C-u, + (where number can be negative) allows passing parameters for text + actions. + + o Text can be formatted to have left, right, center or full justifi- + cation. + + o Text indentation support is also available. + +Bug fixes: + + o The simple menu widget geometry management code was improved to solve + problems with menu entries not visible in the screen. + + o The form widget geometry code was changed to solve problems with integer + round problems in the child widgets geometry when resizing the parent + form widget. + + o Several bugs were fixed in the text code, while some code was rewritten + from scratch. + +4.14 Xpm + +Version 3.4k of the Xpm (X pixmap) library is now integrated into XFree86. + +4.15 xedit + +Xedit have been changed to use most of the new features added to the new ver- +sion of the Xaw library, and some xedit only features were added. Emacs users +will find that several of the emacs key bindings work with the new version of +xedit. These include: + + o File name tab completion. Including a Emacs dired like window, that will + be shown when there are more than one match, when C-x,d is pressed, or + when a directory name is specified. + + o An unlimited number of files can be edited at the same time. Including + multiple views of the same or different files. + + o The line number of the cursor position is always visible. It can also be + customized to show the column number, the position offset and the cur- + rent size of the file. + + o There is an autoReplace resource, that enables automatic text replace- + ment at the time text is typed. This feature is useful to create simple + macros, or to correct common spelling errors. + + o A fully featured ispell interface is also available. This interface is + expected to provide most of the features of the terminal interface of + the ispell program, with some extra features that include: + + o A compile time limit of 16 undo levels. + + o Terse mode switch. + + o Dictionary change. + + o The interface also checks for repeated words. + + o A first tentative to add programming modes was done. Currently, there is + one mode: + + o C-mode: this mode is expected to be stable, and fully usable. + +4.16 Font support + +Details about the font support in XFree86 4.x can be found in the +README.fonts document. + +4.17 TrueType support + +XFree86 4.x comes with two TrueType backends, known as `xfsft' (the +"freetype" module) and `X-TrueType' (the "xtt" module). Both of these back- +ends are based on the FreeType library. + +4.18 CID font support + +Support for CID-keyed fonts is included in XFree86 4.x. The CID-keyed font +format was designed by Adobe Systems for fonts +with large character sets. The CID-keyed font support in XFree86 was donated +by SGI . See the LICENSE document for a copy of the +CID Font Code Public License. + +4.19 Internationalisation of the scalable font backends + +XFree86 4.x has a ``fontenc'' layer to allow the scalable font backends to +use a common method of font re-encoding. This re-encoding makes it possible +to uses fonts in encodings other than their their native encoding. This +layer is used by the Type1 and Speedo backends and the `xfsft' version of the +TrueType backend. The `X-TrueType' version of the TrueType backend uses a +different re-encoding method based on loadable encoding modules. + +4.20 Large font optimisation + +The glyph metrics array, which all the X clients using a particular font have +access to, is now placed in shared memory, so as to reduce redundant memory +consumption. For non-local clients, the glyph metrics array is transmitted +in a compressed format. + +4.21 Unicode/ISO 10646 support + +What is included in 4.x: + + o All ``-misc-fixed-*'' BDF fonts are now available in the ISO10646-1 + encoding and cover at least the 614 characters found in ISO + 8859-{1-5,7-10,14,15}, CP1252, and MES-1. The non-bold fonts also cover + all Windows Glyph List 4 (WGL4) characters, including those found in all + 8-bit MS-DOS/Windows code pages. The 8-bit variants of the ``-misc- + fixed-*'' BDF fonts (ISO8859-1, ISO8859-2, KOI8-R, etc.) have all been + automatically generated from the new ISO10646-1 master fonts. + + o Some ``-misc-fixed-*'' BDF ISO10646-1 fonts now cover a comprehensive + Unicode repertoire of over 3000 characters including all Latin, Greek, + Cyrillic, Armenian, Gregorian, Hebrew, IPA, and APL characters, plus + numerous scientific, typographic, technical, and backwards-compatibility + symbols. Some of these fonts also cover Arabic, Ethiopian, Thai, + Han/Kanji, Hangul, full ISO 8859, and more. For the 6x13 font there is + now a 12x13ja Kanji extension and for the 9x18 font there is a 18x18ja + Kanji/Han/Hangul extension, which covers all ISO-2022-JP-2 (RFC 1554) + characters. The 9x18 font can also be used to implement simple combining + characters by accent overstriking. For more information, read Markus + Kuhn's UTF-8 and Unicode FAQ . + + o Mark Leisher's ClearlyU proportional font (similar to Computer Modern). + + o ISO 10646/Unicode UTF-8 Level 1 support added to xterm (enabled with the + -u8 option). + + o Both the xfsft (the "freetype" module) and the X-TrueType (the "xtt" + module) TrueType font backends support Unicode-encoded fonts. + +4.22 Lucidux fonts from Bigelow and Holmes + +XFree86 now includes the ``Lucidux'' family of professionally hinted Type 1 +fonts. This family consists of the fonts ``Lucidux Serif'', ``Lucidux Sans'' +and ``Lucidux Mono'' in Roman and oblique variants, and includes over 370 +glyphs in each font covering among others the glyphs needed for ISO 8859-1, +2, 3, 4, 9 and 15. Bold variants will be included in a future release. The +design and font outlines were donated by Charles Bigelow and Kris Holmes from +Bigelow and Holmes Inc., and the hinting was donated by Berthold Horn and +Blenda Horn from Y&Y, Inc. For more information, please contact + or , or consult Y&Y's web site +. + +4.23 Directory rearrangements + +Some changes to the installed XFree86 directory structure have been imple- +mented for 4.x. One important change is a modified search path for the X +server's XF86Config file. The details of this can be found in the XF86Config +manual page. The other main change is moving most of the run-time configura- +tion files to /etc/X11, with symbolic links in the old /usr/X11R6/lib/X11 +location pointing to the new location. Some run-time generated files are now +located under the appropriate subdirectories of /var, again with the relevant +symbolic links in the old location. + + Generated from XFree86: xc/programs/Xserver/hw/xfree86/doc/sgml/RELNOTES.sgml,v 1.58 2000/12/17 23:01:10 dawes Exp $ + + +$XFree86: xc/RELNOTES,v 1.1 2000/12/18 02:45:46 dawes Exp $ Index: xc/RELNOTES-X.org diff -u /dev/null xc/RELNOTES-X.org:1.1 --- /dev/null Mon Dec 18 14:20:58 2000 +++ xc/RELNOTES-X.org Sun Dec 17 21:45:47 2000 @@ -0,0 +1,687 @@ + + + + + + + + + + X Window System, Version 11 + + Release 6.4 + + Release Notes + + + + + + + + The Open Group X Project Team + + + + + + + 30 January, 1998 + + + + + + + +Copyright (C) 1998 The Open Group + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Soft- +ware"), 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 condi- +tions: + +The above copyright notice and the following permission notice shall be +included in all copies 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 MERCHANTABIL- +ITY, FITNESS FOR A PARTICULAR PURPOSE AND NON- INFRINGEMENT. IN NO EVENT +SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABIL- +ITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF, OR IN CONNECTION WITH THE SOFTWARE OR THE USE OF 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 use or other dealings +in this Software without prior written authorization from The Open +Group. + +X Window System is a trademark of The Open Group. + + + +1. Introductory Note + +This document is the release notes that were provided with The Open +Group's X11R6.4 release. The XFree86-specific information in this docu- +ment is out of date. The XFree86-specific documentation can be found in +the xc/programs/Xserver/hw/xfree86/doc directory, and on-line at +http://www.xfree86.org/current/. + + +2. What Is X11 + + +X11, or X, is a vendor-neutral, system-architecture neutral network- +transparent window system and user interface standard. In other words +it's windows for UNIX. But X is not just for UNIX -- X runs on a wide +range of computing and graphics machines including Macintosh, OS/2, +Microsoft's MS-Windows family of operating systems, and almost all of +the so-called Network Computers. X can use your network -- you may run +CPU-intensive programs on high powered workstations and display the user +interface (the windows) on inexpensive desktop machines. + + +3. What is Release 6.4 + + +Release 6.4 (R6.4) is The Open Group X Project Team's update to the X +Consortium's Release 6.3 (R6.3) of X11 and all prior releases. It is +compatible with with all releases going back to R1 at both the source +and protocol levels. + +The X Consortium was an independent, not-for-profit membership corpora- +tion formed in 1993 as the successor to the MIT X Consortium. It was +dissolved at the end of 1996 and all assets such as trademarks and copy- +rights were transferred to The Open Group. + +The Open Group's X Project Team was formed to continue maintenance and +development of X. Membership in The Open Group X Project Team does not +require membership in The Open Group. To join the X Project Team contact +the sales office near you -- you can find a list of sales offices at +http://www.opengroup.org/contacts/sales.htm, or download the membership +kit from http://www.opengroup.org/tech/desktop/x/projteam.htm. + +Instructions for building and installing R6.4 can be found in the file +INSTALL.PS (PostScript) or INSTALL.TXT (plain text), available sepa- +rately and also contained in the release. + + +4. Overview of the X Project Team Release + + +Like all the releases that preceded it, R6.4 is a source code release. +In order to use the release it is necessary to first unpack the distri- +bution, compile it, and then install it. The source contains the follow- +ing items: + +X Consortium Standards and X Project Team Specifications + The X Consortium produced standards -- documents which define net- + work protocols, programming interfaces, and other aspects of the X + environment. These standards continue to exists in the X Project + Team release. The X Project Team produces specifications. Like X + Consortium Standards, these are documents which define network pro- + tocols, programming interfaces, and other aspects of the X environ- + ment. Under the aegis of The Open Group, X Consortium standards, X + Project Team specifications, and other specifications are the basis + for portions of The Open Group's various CAE Specifications. Some + of the new features in this release are not standard, that is, + there is no accompanying specification. + +Implementations + For most of X Consortium standards and X Project Team specifica- + tions, a high-quality implementations is provided to demonstrate + proof of concept, to give vendors a base to use, and early adopters + a chance to begin developing using the new features. These are not + reference implementations -- the written specifications are the + authoritative definition. + +Fonts + A collection of bitmap and outline fonts are included in the dis- + tribution, contributed by various individuals and companies. + +Utility Libraries + A number of libraries, such as Xmu and the Athena Widget Set, are + included. These are not standards, but are used in building the + applications contained in the release and may be useful in building + other applications. + +Programs + We also provide a number of application programs. A few of these + programs, such as xdm (or its equivalent), should be considered + essential in almost all environments. The rest of the applications + carry no special status; they are simply programs that have been + developed and/or maintained by X Consortium and X Project Team + staff. In some cases, you will find better substitutes for these + programs contributed by others. + + +5. Supported Operating Systems + + +This release was built and tested on the following reference platforms: + + + Digital Unix 4.0A + Fujitsu UXP V20L10 + HPUX 10.20 + Solaris 2.5 + + +This release was also built on the following systems: + + + AIX 4.2 + IRIX 6.2 + FreeBSD 2.2.2 + S.u.S.E. Linux 5.0.0 (kernel 2.0.30, libc 5.4.33) + SunOS 4.1.4 + Windows NT 3.51 (NCD WinCenter) + + +In all cases except SunOS we have used the vendor's compiler. On SunOS +we build with the GNU C compiler (gcc). + + +6. Supported Graphics Devices + + +This release includes the necessary device-dependent support to build a +native X server for the following platforms: + + + HP-UX: Xhp + Digital Unix: Xdec on DECstation 3000/400 (Alpha) with PMAG-B + SunOS/Solaris: Xsun -- see the Xsun man page for supported cards + XFree86: See the XF_* man pages for supported cards + +In addition to the above, the Xvfb and Xnest servers can be built on all +platforms. + +Native X servers are not built on AIX, Fujitsu UXP, IRIX, or Microsoft +Windows NT. + + +7. The Source Tree + + +The source is distributed in UNIX tar files. The source unpacks from the +tar files into a source tree, and the name of the base directory of the +source tree is xc. The name xc as the base of the source tree has been +retained from the X Consortium releases. + +The general layout under xc/ is as follows: + + +config/ imake config files, imake, makedepend, etc. +doc/ all documentation other than per-program manual pages +fonts/ BDF, Speedo, Type1 fonts +include/ common include files +lib/ libraries +nls/ national language support files +programs/ all programs, including the X server and rgb, +util/ patch, compress, other utilities +bug-report bug reporting template +registry X Registry + + + +8. X Registry + + +The X Project Team maintains a registry of certain X-related items to +aid in avoiding conflicts and to aid in sharing of such items. The reg- +istry is in the file xc/registry. + + +9. Extensions Supported + + +Release 6.4 includes source for the following extensions: BIG-REQUESTS, +DOUBLE-BUFFER, DPMS, Extended-Visual-Information, LBX, MIT-SHM, MIT- +SUNDRY-NONSTANDARD, Multi-Buffering, RECORD, SECURITY, SHAPE, SYNC, TOG- +CUP, X3D-PEX, XC-APPGROUP, XC-MISC, XFree86-VidModeExtension, XIE (X +Image Extension), XINERAMA. XInputExtension, XKEYBOARD, XpExtension +(printing), XTEST, and XTestExtension1, + +Not all of these extensions are standard; see the Standards manual page. +Some of these extensions may not be supported on every platform. + + +10. Implementation Dependent Parameters + + +Some of the specifications define some behavior as implementation-depen- +dent. Implementations of the X Consortium standards and X Project Team +specifications must document how those parameters are implemented. + +The default values in this release of the implementation dependent +parameters are: + + +XFILESEARCHPATH default: + This default can be set at build time by setting the imake vari- + ables XFileSearchPathDefault, XAppLoadDir, XFileSearchPathBase, and + ProjectRoot in xc/config/cf/site.def. See xc/config/cf/README for + instructions and xc/config/cf/X11.tmpl for details of how these + configuration variables are used. + + By default the imake variable ProjectRoot is /usr/X11R6.4 and + XFILESEARCHPATH has these components: + + $ProjectRoot/lib/X11/%L/%T/%N%C%S + $ProjectRoot/lib/X11/%l/%T/%N%C%S + $ProjectRoot/lib/X11/%T/%N%C%S + $ProjectRoot/lib/X11/%L/%T/%N%S + $ProjectRoot/lib/X11/%l/%T/%N%S + $ProjectRoot/lib/X11/%T/%N%S + + + +XUSERFILESEARCHPATH default: + If the environment variable XAPPLRESDIR is defined, the default + value of XUSERFILESEARCHPATH has the following components: + + $XAPPLRESDIR/%L/%N%C + $XAPPLRESDIR/%l/%N%C + $XAPPLRESDIR/%N%C + $HOME/%N%C + $XAPPLRESDIR/%L/%N + $XAPPLRESDIR/%l/%N + $XAPPLRESDIR/%N + $HOME/%N + + Otherwise it has these components: + + $HOME/%L/%N%C + $HOME/%l/%N%C + $HOME/%N%C + $HOME/%L/%N + $HOME/%l/%N + $HOME/%N + + + +XKEYSYMDB default: + Defaults to $ProjectRoot/lib/X11/XKeysymDB. + + +XCMSDB default: + Defaults to $ProjectRoot/lib/X11/Xcms.txt. + + +XLOCALEDIR default: + Defaults to the directory $ProjectRoot/lib/X11/locale. The XLO- + CALEDIR variable can contain multiple colon-separated pathnames. + + +XErrorDB location + The Xlib error database file is $ProjectRoot/lib/X11/XErrorDB. + + +XtErrorDB location + The Xt error database file is $ProjectRoot/lib/X11/XtErrorDB. + + +Supported Locales + Locales supported by this implementation are in xc/nls/locale.dir. + The mapping between various system locale names and X locale names + is in xc/nls/locale.alias. Both files are installed in the default + XLOCALEDIR directory, i.e. $ProjectRoot/lib/X11/locale/). + + +Supported Input Methods + This distribution does not include source for any input method + servers; however Xlib supplies a default built-in input method that + supports compose processing in 8-bit locales. Compose files are + provided for Latin-1 and Latin-2. The built-in input method can + support other locales, given suitable compose files. See + xc/nls/Compose/iso8859-* for the supported compositions. + +The Input Method Server Development Kit (IMdkit) is at +ftp://ftp.x.org/pub/unsupported/lib/IMdkit/. + + +11. What Is New in Release 6.4 + + +This section describes changes in the X Project Team distribution since +Release 6.3. + +The major new functionality in R6.4 is: Display Power Management Signal- +ing (DPMS) to set "green" computer monitors into power saving mode; +Extended Visual Information to allow applications to discover more about +the graphics capabilities of the server than the core protocol allows; +Colormap Utilization Policy (TOG-CUP) allows applications to discover +desktop special colors, e.g. MS-Windows reserved (pre-allocated) colors +on PC-Xservers, and store read-only (sharable) colors in specific loca- +tions in a colormap; and Xinerama, a wide screen server that combines +two or more screens into a single virtual screen. + +The X Toolkit Intrinsics library (libXt) now has IBM's Easy Resource +Configuration support included. + +Xlib (libX11) has two new APIs: XkbSetPerClientControls and XkbGetPer- +ClientControls. These two functions were unintentionally omitted from +the library in previous releases. + +The XFree86 servers are now based on XFree86 3.3.1. + + +12. What is Unchanged in Release 6.4 + + +As this is an update release, there is a great deal of stability in the +standards, libraries, and clients. No existing standards have changed in +a material way; although some documents have been updated with minor +corrections. The extension library, libXext, is updated to include the +DPMS, Extended-Visual-Information, TOG-CUP, and XINERAMA extension +interfaces. All previous interfaces in these and all other libraries are +unchanged. + + +13. New OS Support + + +The following table shows the versions of the operating systems that +were used to develop this and prior releases: + + +System R6 R6.1 R6.[23] R6.4 + +AIX 3.2.5 4.1.4 4.2 4.2 +A/UX 3.0.1 - - - +BSD/386 1.0 - - - +Digital Unix (OSF/1) 1.0/1.3 3.2C 4.0A4.0A +FreeBSD - 2.1.0 2.1.6 2.2.2 +Fujitsu UXP - - - V20L10 +HP-UX 9.1 10.01 10.01 10.20 +IRIX 5.2 5.3 6.2 6.2 +Linux (kernel) + Slackware 2.3 - 1.2.11 -- + Slackware 3.1 - - 2.0- + S.u.S.E. 5.0 - - - 2.0.30 +Mach 2.5 - - - +NEWS-OS 6.0 - - - +Solaris 2.3 2.4 2.5 2.5 +SunOS 4.1.3 4.1.3 4.1.4 4.1.4 +Ultrix-32 4.3 4.4 - - +UNICOS 8.0 - - - +Unixware SVR4.2 1.0 2.02 2.02- +Windows NT 3.1 3.5 4.0 3.51 + + + +14. New Specifications + + +The following are the new X Project Team specifications in Release 6.4. +Each is described in its own section below. + + Display Power Management Signalling (DPMS) + Extended Visual Information (EVI) + Colormap Utilization Policy (TOG-CUP) + + + +14.1. Display Power Management Signaling + + +This extension provides X Protocol control over the VESA Display Power +Management Signaling (DPMS) characteristics of video boards under con- +trol of the X Window System. + +Traditionally, the X Window System has provided for both blanking and +non-blanking screen savers. Timeouts associated with these built-in +screen saver mechanisms are limited to idle (dwell) time, and a change +timeout that specifies the change interval for non-blanking screen +savers. + +The United States' Environmental Protection Agency (EPA) Energy Star +program requires that monitors power down after some idle time by +default. While it is possible to simply overload the existing screen +saver timeouts, this solution leaves the non-privileged user little to +no control over the DPMS characteristics of his or her system. For +example, disabling DPMS would require some unintended side effect in the +core screen saver, such as disabling the changing of a non-blanking +screen saver. + + +14.2. Extended Visual Information + + +The Extended Visual Information (EVI) extension allows a client to +determine information about core X visuals beyond what the core protocol +provides. + +As the X Window System has evolved, it has become clear that the infor- +mation returned by the core X protocol regarding Visuals is often insuf- +ficient for a client to determine which is the most appropriate visual +for its needs. This extension allows clients to query the X server for +additional visual information, specifically as regards colormaps and +framebuffer levels. + +This extension is meant to address the needs of pure X clients only. It +is specifically and purposefully not designed to address the needs of X +extensions. Extensions that have an impact on visual information should +provide their own mechanisms for delivering that information. For exam- +ple, the Double Buffering Extension (DBE) provides its own mechanism for +determining which visuals support double-buffering. + + +14.3. Colormap Utilization Policy + + +This extension has three purposes: a) to provide mechanism for a special +application (a colormap manager) to discover any special colormap +requirements, e.g. the colormap entries that are nominally reserved for +desktop colors in the MS-Windows environment and initialize the default +colormap so that it can be more easily shared; and b) to encourage col- +ormap sharing and reduce colormap flashing on low-end 8-bit frame +buffers by providing a policy for sharing; and c) when colormaps aren't +shared, define a behavior in the X server color allocation scheme to +reduce colormap flashing. + +To encourage colormap sharing and accommodate special colormap require- +ments two new protocols are defined: the first provides a way to query +the server for a list of reserved colormap entries, and the second is a +way to initialize read-only (sharable) colormap entries at specific +locations in a colormap. + +To minimize colormap flashing when the root window's default visual is +one of GrayScale, PseudoColor, or DirectColor, and a private colormap +for the default visual is being used, a minor (but compatible) change to +the server implementation of the AllocColor and AllocNamedColor requests +is required. Where the core protocol says nothing about the pixel values +returned, when this extension is in effect, the AllocColor and Alloc- +NamedColor requests will first look for a matching color in the default +colormap, and, if a match is found and the same cell in the private col- +ormap has not already been allocated, the color will be allocated in the +private colormap at the same location as in the default colormap +(instead of in the first available location.) + + +15. Easy Resource Configuration + + +Setting and changing resources in X applications can be difficult for +both the application programmer and the end user. Resource Configura- +tion Management (RCM) addresses this problem by changing the X Intrin- +sics to immediately modify a resource for a specified widget and each +child widget in the hierarchy. In this context, immediate means: no +sourcing of a resource file is required; the application does not need +to be restarted for the new resource values to take effect; and the +change occurs immediately. + +The main difference between RCM and the Editres protocol is that the RCM +customizing hooks reside in the Intrinsics and thus are linked with +other toolkits such as Motif and the Athena widgets. However, the +EditRes protocol requires the application to link with the EditRes rou- +tines in the Xmu library and Xmu is not used by all applications that +use Motif. + +Easy Resource Configuration is not a standard part of the X Toolkit +Intrinsics (libXt). It is neither an X Consortium standard nor an X Pro- +ject Team specification. + + +16. Xinerama + + +The Xinerama extension provides a way for a multi-headed system to func- +tion as one large screen. Windows can span multiple screens and can move +from one screen to another. + +Currently, the Xinerama Extension works in a homogeneous graphics envi- +ronment. A graphics environment is considered homogeneous if, for exam- +ple, all of the graphics cards have 8 planes with 6 visuals. Mixing a +24-plane graphics card with a 8-plane card creates a heterogeneous envi- +ronment. + +Unlike other multiple screen implementations, Xinerama provides a solu- +tion at the device-independent level. The advantage of this approach is +that it reduces the amount of work involved in supporting and maintain- +ing the extension. The number of graphics devices on the market contin- +ues to grow; embedding the extension functionality into the device +dependent code for each device would be a maintenance nightmare. Since +the Xinerama implementation does not require any low-level graphics mod- +ifications, existing device-dependent code does not have to be recom- +piled. In the loadable server world, the Xinerama Extension will work +with existing device-dependent shared libraries. + +The Xinerama extension is not a standard. It is neither an X Consortium +standard nor an X Project Team specification. + + +17. ANSIfication + + +R6.1 was officially the last release that supported traditional K&R C. +Like R6.3, R6.4 assumes a Standard C compiler and environment. We have +not intentionally removed any K&R C support from old code, and most of +the release will continue to build on platforms without an ANSI C com- +piler. + + +18. VSW5 + + +We have tested this release with VSW5 version 5.0.0. This release passes +all tests in VSW5 with the following exceptions: + +o tests for which a permanent waiver has been granted. + +o tests for which a temporary waiver have been granted. + +o tests where a defect in the test has been identified and reported. + +VSW licensees may obtain a list of waivers granted from +http://www.rdg.opengroup.org/interpretations/database/. + + +19. Year 2000 (Y2K) Compliance + + +For a statement of compliance see http://www.camb.open- +group.org/tech/desktop/faq/y2k.htm + + +20. Memory Testing + + +Beginning circa X11R5 the MIT X Consortium staff, and later the X Con- +sortium, Inc. staff, and now the X Project Team staff have routinely +tested this implementation for a variety of memory-type errors such as +leaks, array bounds writes, uninitialized memory reads, and a variety of +other errors; using a combination of commercial and "home grown" memory +testing tools. All the real problems were fixed long ago; however we +aren't so naive as to believe that there no remaining bugs. If you find +a memory problem in this implementation please file a bug-report. If you +find a memory problem in your vendor's implementation, tell your vendor. +The popular commercial memory checking tools emit lots of false or spu- +rious warnings, most of which can be safely ignored. + + +21. Security Considerations + + +On UNIX and UNIX-like operating systems there are serious security +implications associated with running suid-root programs. + +By default the xterm terminal emulation program is installed suid-root +in order to be able to update utmp or utmpx entries. All the known (as +of this writing) exploitable security holes in the X libraries have been +eliminated -- making it theoretically safe for xterm to be suid-root. +For additional security you may install xterm without suid-root; however +if you do, xterm will not be able to make utmp or utmpx entries. + +On many Intel-based machines the X server must have root privileges in +order to access the graphics card and open other devices. The easiest +way to grant the requisite privileges is to use xdm to run your X +server. Some people, who prefer not to use xdm, often work around the +need for the X server to run with root privileges by making their X +server a suid-root program. While all the known (as of this writing) +exploitable security holes in the server have been eliminated, the X +Project Team still recommends that you not make your X server suid-root. +There are safe suid-root wrapper programs available (but not in this +release) that you can use to start your server if you don't want to use +xdm. + + +22. Filing Bug Reports + + +If you find a reproducible bug in software built from the source in this +distribution or find bugs in its documentation, please complete a bug- +report using the form in the file xc/bug-report and send it to The Open +Group X Project Team at + + mailto:xbugs@opengroup.org + + +Please try to provide all of the information requested on the form if it +is applicable; the little extra time you spend on the report will make +it much easier for someone to reproduce, find, and fix the bug. + +Bugs in the contributed software that is available on the net are not +handled on any official basis. Consult the documentation for the indi- +vidual software to see where (if anywhere) to report the bug. + + +23. Acknowledgements + + +Release 6.4 of X11 was brought to you by the X Project Team staff at The +Open Group: Arthur Barstow, Kaleb Keithley, Sekhar Makkapati, M.S. +Ramesh, Jingping Ge, Ken Flowers, and Dave Knorr. + +Several companies and individuals have cooperated and worked hard to +make this release a reality, and our thanks go out to them: + +Madeline Asmus of Digital for Xinerama. + +Peter Daifuku of Silicon Graphics for Extended-Visual-Information. + +Scott Revelt of Sun Microsystems for preliminary work on TOG-CUP. + +Rob Lembree, formerly of Digital, for DPMS. + +Jeff Walls of Hewlett Packard. + +Wojtek Jarosz of Attachmate. + +Bob Schulman of Seaweed. + +Brian Bobryk of Digital. + +Tom Brown of NetManage. + +Garry Paxinos of Metro Link. + +Victor Gold of Peritek. + +Jackie Drane of IBM. Index: xc/RELNOTES.PS diff -u xc/RELNOTES.PS:1.2 xc/RELNOTES.PS:removed --- xc/RELNOTES.PS:1.2 Sun Oct 4 21:41:45 1998 +++ xc/RELNOTES.PS Mon Dec 18 14:20:58 2000 @@ -1,941 +0,0 @@ -%!PS-Adobe-3.0 -%%Creator: groff version 1.11 -%%CreationDate: Mon Oct 5 11:39:21 1998 -%%DocumentNeededResources: font Times-Bold -%%+ font Times-Italic -%%+ font Times-Roman -%%DocumentSuppliedResources: procset grops 1.11 0 -%%Pages: 13 -%%PageOrder: Ascend -%%Orientation: Portrait -%%EndComments -%%BeginProlog -%%BeginResource: procset grops 1.11 0 -/setpacking where{ -pop -currentpacking -true setpacking -}if -/grops 120 dict dup begin -/SC 32 def -/A/show load def -/B{0 SC 3 -1 roll widthshow}bind def -/C{0 exch ashow}bind def -/D{0 exch 0 SC 5 2 roll awidthshow}bind def -/E{0 rmoveto show}bind def -/F{0 rmoveto 0 SC 3 -1 roll widthshow}bind def -/G{0 rmoveto 0 exch ashow}bind def -/H{0 rmoveto 0 exch 0 SC 5 2 roll awidthshow}bind def -/I{0 exch rmoveto show}bind def -/J{0 exch rmoveto 0 SC 3 -1 roll widthshow}bind def -/K{0 exch rmoveto 0 exch ashow}bind def -/L{0 exch rmoveto 0 exch 0 SC 5 2 roll awidthshow}bind def -/M{rmoveto show}bind def -/N{rmoveto 0 SC 3 -1 roll widthshow}bind def -/O{rmoveto 0 exch ashow}bind def -/P{rmoveto 0 exch 0 SC 5 2 roll awidthshow}bind def -/Q{moveto show}bind def -/R{moveto 0 SC 3 -1 roll widthshow}bind def -/S{moveto 0 exch ashow}bind def -/T{moveto 0 exch 0 SC 5 2 roll awidthshow}bind def -/SF{ -findfont exch -[exch dup 0 exch 0 exch neg 0 0]makefont -dup setfont -[exch/setfont cvx]cvx bind def -}bind def -/MF{ -findfont -[5 2 roll -0 3 1 roll -neg 0 0]makefont -dup setfont -[exch/setfont cvx]cvx bind def -}bind def -/level0 0 def -/RES 0 def -/PL 0 def -/LS 0 def -/MANUAL{ -statusdict begin/manualfeed true store end -}bind def -/PLG{ -gsave newpath clippath pathbbox grestore -exch pop add exch pop -}bind def -/BP{ -/level0 save def -1 setlinecap -1 setlinejoin -72 RES div dup scale -LS{ -90 rotate -}{ -0 PL translate -}ifelse -1 -1 scale -}bind def -/EP{ -level0 restore -showpage -}bind def -/DA{ -newpath arcn stroke -}bind def -/SN{ -transform -.25 sub exch .25 sub exch -round .25 add exch round .25 add exch -itransform -}bind def -/DL{ -SN -moveto -SN -lineto stroke -}bind def -/DC{ -newpath 0 360 arc closepath -}bind def -/TM matrix def -/DE{ -TM currentmatrix pop -translate scale newpath 0 0 .5 0 360 arc closepath -TM setmatrix -}bind def -/RC/rcurveto load def -/RL/rlineto load def -/ST/stroke load def -/MT/moveto load def -/CL/closepath load def -/FL{ -currentgray exch setgray fill setgray -}bind def -/BL/fill load def -/LW/setlinewidth load def -/RE{ -findfont -dup maxlength 1 index/FontName known not{1 add}if dict begin -{ -1 index/FID ne{def}{pop pop}ifelse -}forall -/Encoding exch def -dup/FontName exch def -currentdict end definefont pop -}bind def -/DEFS 0 def -/EBEGIN{ -moveto -DEFS begin -}bind def -/EEND/end load def -/CNT 0 def -/level1 0 def -/PBEGIN{ -/level1 save def -translate -div 3 1 roll div exch scale -neg exch neg exch translate -0 setgray -0 setlinecap -1 setlinewidth -0 setlinejoin -10 setmiterlimit -[]0 setdash -/setstrokeadjust where{ -pop -false setstrokeadjust -}if -/setoverprint where{ -pop -false setoverprint -}if -newpath -/CNT countdictstack def -userdict begin -/showpage{}def -}bind def -/PEND{ -clear -countdictstack CNT sub{end}repeat -level1 restore -}bind def -end def -/setpacking where{ -pop -setpacking -}if -%%EndResource -%%IncludeResource: font Times-Bold -%%IncludeResource: font Times-Italic -%%IncludeResource: font Times-Roman -grops begin/DEFS 1 dict def DEFS begin/u{.001 mul}bind def end/RES 72 -def/PL 792 def/LS false def/ENC0[/asciicircum/asciitilde/Scaron/Zcaron -/scaron/zcaron/Ydieresis/trademark/quotesingle/.notdef/.notdef/.notdef -/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef -/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef -/.notdef/.notdef/space/exclam/quotedbl/numbersign/dollar/percent -/ampersand/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen -/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon -/semicolon/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O -/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright/circumflex -/underscore/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y -/z/braceleft/bar/braceright/tilde/.notdef/quotesinglbase/guillemotleft -/guillemotright/bullet/florin/fraction/perthousand/dagger/daggerdbl -/endash/emdash/ff/fi/fl/ffi/ffl/dotlessi/dotlessj/grave/hungarumlaut -/dotaccent/breve/caron/ring/ogonek/quotedblleft/quotedblright/oe/lslash -/quotedblbase/OE/Lslash/.notdef/exclamdown/cent/sterling/currency/yen -/brokenbar/section/dieresis/copyright/ordfeminine/guilsinglleft -/logicalnot/minus/registered/macron/degree/plusminus/twosuperior -/threesuperior/acute/mu/paragraph/periodcentered/cedilla/onesuperior -/ordmasculine/guilsinglright/onequarter/onehalf/threequarters -/questiondown/Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE -/Ccedilla/Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex -/Idieresis/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis -/multiply/Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn -/germandbls/agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla -/egrave/eacute/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis -/eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis/divide/oslash -/ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis]def -/Times-Roman@0 ENC0/Times-Roman RE/Times-Italic@0 ENC0/Times-Italic RE -/Times-Bold@0 ENC0/Times-Bold RE -%%EndProlog -%%Page: 1 1 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 15/Times-Bold@0 SF 3.75(XW)209.67 123 S(indo)-4.02 E 3.75(wS)-.15 G -(ystem, V)-3.75 E(ersion 11)-1.5 E(Release 6.4)270.592 153 Q/F1 14 -/Times-Bold@0 SF(Release Notes)264.987 183 Q/F2 11/Times-Italic@0 SF -(The Open Gr)233.829 279 Q(oup X Pr)-.495 E(oject T)-.495 E(eam)-1.012 E -/F3 11/Times-Roman@0 SF(30 January)268.627 369 Q 2.75(,1)-.715 G(998) --2.75 E EP -%%Page: 2 2 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 11/Times-Roman@0 SF(Cop)72 192 Q(yright \251 1998)-.11 E -(The Open Group)8.25 E/F1 9/Times-Roman@0 SF -(Permission is hereby granted, free of char)72 206.6 Q(ge, to an)-.162 E -2.25(yp)-.135 G(erson obtaining a cop)-2.25 E 2.25(yo)-.09 G 2.25(ft) --2.25 G(his softw)-2.25 E(are and associated documentation \214les)-.09 -E(\(the `)72 217.6 Q(`Softw)-.75 E(are')-.09 E -('\), to deal in the Softw)-.75 E(are without restriction, including wi\ -thout limitation the rights to use, cop)-.09 E 1.17 -.585(y, m)-.09 H -(odify).585 E 2.25(,m)-.585 G(er)-2.25 E(ge,)-.162 E(publish, distrib)72 -228.6 Q(ute, sublicense, and/or sell copies of the Softw)-.18 E -(are, and to permit persons to whom the Softw)-.09 E -(are is furnished to do)-.09 E(so, subject to the follo)72 239.6 Q -(wing conditions:)-.225 E(The abo)72 254.2 Q .27 -.135(ve c)-.135 H(op) -.135 E(yright notice and the follo)-.09 E -(wing permission notice shall be included in all copies of the Softw) --.225 E(are:)-.09 E(THE SOFTW)72 268.8 Q(ARE IS PR)-1.08 E -.45(OV)-.36 -G(IDED AS IS, WITHOUT W).45 E -(ARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING,)-1.08 E -.09(BU)72 -279.8 S 2.25(TN).09 G .72 -.36(OT L)-2.25 H(IMITED T).36 E(O, THE W) --.162 E(ARRANTIES OF MERCHANT)-1.08 E(ABILITY)-.837 E 2.25(,F)-1.161 G -(ITNESS FOR A P)-2.25 E(AR)-.828 E(TICULAR PURPOSE AND)-.54 E -(NON- INFRINGEMENT)72 290.8 Q 2.25(.I)-.666 G 2.25(NN)-2.25 G 2.25(OE) --2.25 G(VENT SHALL THE OPEN GR)-2.25 E(OUP BE LIABLE FOR ANY CLAIM, D) --.36 E(AMA)-.36 E(GES OR)-.36 E -.36(OT)72 301.8 S(HER LIABILITY).36 E -2.25(,W)-1.161 G(HETHER IN AN A)-2.25 E(CTION OF CONTRA)-.36 E(CT)-.36 E -2.25(,T)-.666 G(OR)-2.412 E 2.25(TO)-.54 G 2.25(RO)-2.25 G(THER)-2.61 E -(WISE, ARISING FR)-.495 E(OM, OUT OF)-.36 E 2.25(,O)-.72 G(R)-2.25 E -(IN CONNECTION WITH THE SOFTW)72 312.8 Q(ARE OR THE USE OF O)-1.08 E -(THER DEALINGS IN THE SOFTW)-.36 E(ARE.)-1.08 E(Except as contained in \ -this notice, the name of The Open Group shall not be used in adv)72 -327.4 Q(ertising or otherwise to promote the use)-.135 E -(or other dealings in this Softw)72 338.4 Q -(are without prior written authorization from The Open Group.)-.09 E/F2 -9/Times-Italic@0 SF 2.25(XW)72 353 S(indow System)-2.745 E F1 -(is a trademark of The Open Group.)2.25 E EP -%%Page: 1 3 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 11/Times-Bold@0 SF 2.75(1. What)72 85 R(Is X11)2.75 E/F1 11 -/Times-Roman@0 SF(X11, or X, is a v)72 114.6 Q(endor)-.165 E -(-neutral, system-architecture neutral netw)-.22 E -(ork-transparent windo)-.11 E 2.75(ws)-.275 G(ystem and user)-2.75 E -(interf)72 127.6 Q(ace standard.)-.11 E(In other w)5.5 E(ords it')-.11 E -2.75(sw)-.605 G(indo)-2.75 E -(ws for UNIX. But X is not just for UNIX \212 X runs on a)-.275 E(wide \ -range of computing and graphics machines including Macintosh, OS/2, Mic\ -rosoft')72 140.6 Q 2.75(sM)-.605 G(S-W)-2.75 E(indo)-.44 E(ws)-.275 E --.11(fa)72 153.6 S -(mily of operating systems, and almost all of the so-called Netw).11 E -(ork Computers. X can use your netw)-.11 E(ork)-.11 E 2.75<8a79>72 166.6 -S(ou may run CPU-intensi)-2.75 E .33 -.165(ve p)-.275 H -(rograms on high po).165 E(wered w)-.275 E -(orkstations and display the user interf)-.11 E(ace \(the)-.11 E(windo) -72 179.6 Q(ws\) on ine)-.275 E(xpensi)-.165 E .33 -.165(ve d)-.275 H -(esktop machines.).165 E F0 2.75(2. What)72 218.6 R(is Release 6.4)2.75 -E F1(Release 6.4 \(R6.4\) is The Open Group X Project T)72 248.2 Q(eam') --.77 E 2.75(su)-.605 G(pdate to the X Consortium')-2.75 E 2.75(sR)-.605 -G(elease 6.3 \(R6.3\))-2.75 E(of X11 and all prior releases.)72 261.2 Q -(It is compatible with with all releases going back to R1 at both the s\ -ource)5.5 E(and protocol le)72 274.2 Q -.165(ve)-.275 G(ls.).165 E -(The X Consortium w)72 290.8 Q(as an independent, not-for)-.11 E -(-pro\214t membership corporation formed in 1993 as the suc-)-.22 E -(cessor to the MIT X Consortium.)72 303.8 Q(It w)5.5 E(as dissolv)-.11 E -(ed at the end of 1996 and all assets such as trademarks)-.165 E -(and cop)72 316.8 Q(yrights were transferred to The Open Group.)-.11 E -(The Open Group')72 333.4 Q 2.75(sXP)-.605 G(roject T)-2.75 E(eam w)-.77 -E(as formed to continue maintenance and de)-.11 E -.165(ve)-.275 G -(lopment of X. Member).165 E(-)-.22 E -(ship in The Open Group X Project T)72 346.4 Q -(eam does not require membership in The Open Group. T)-.77 E 2.75(oj) --.88 G(oin the X)-2.75 E(Project T)72 359.4 Q(eam contact the sales of) --.77 E(\214ce near you \212 you can \214nd a list of sales of)-.275 E -(\214ces at http://www)-.275 E(.open-)-.715 E(group.or)72 372.4 Q -(g/contacts/sales.htm, or do)-.198 E -(wnload the membership kit from http://www)-.275 E(.opengroup.or)-.715 E -(g/tech/desk-)-.198 E(top/x/projteam.htm.)72 385.4 Q(Instructions for b) -72 402 Q(uilding and installing R6.4 can be found in the \214le INST) --.22 E(ALL.PS \(PostScript\) or)-1.023 E(INST)72 415 Q -(ALL.TXT \(plain te)-1.023 E(xt\), a)-.165 E -.275(va)-.22 G -(ilable separately and also contained in the release.).275 E F0 2.75 -(3. Ov)72 454 R(er)-.11 E(view of the X Pr)-.11 E(oject T)-.198 E -(eam Release)-1.012 E F1(Lik)72 483.6 Q 2.75(ea)-.11 G(ll the releases \ -that preceded it, R6.4 is a source code release. In order to use the re\ -lease it is neces-)-2.75 E(sary to \214rst unpack the distrib)72 496.6 Q -(ution, compile it, and then install it. The source contains the follo) --.22 E(wing)-.275 E(items:)72 509.6 Q F0 2.75(XC)72 526.2 S -(onsortium Standards and X Pr)-2.75 E(oject T)-.198 E -(eam Speci\214cations)-1.012 E F1 -(The X Consortium produced standards \212 documents which de\214ne netw) -97 539.2 Q(ork protocols, programming)-.11 E(interf)97 552.2 Q -(aces, and other aspects of the X en)-.11 E -(vironment. These standards continue to e)-.44 E(xists in the X Pro-) --.165 E(ject T)97 565.2 Q(eam release. The X Project T)-.77 E -(eam produces speci\214cations.)-.77 E(Lik)5.5 E 2.75(eXC)-.11 G -(onsortium Standards,)-2.75 E(these are documents which de\214ne netw)97 -578.2 Q(ork protocols, programming interf)-.11 E -(aces, and other aspects of)-.11 E(the X en)97 591.2 Q -(vironment. Under the ae)-.44 E -(gis of The Open Group, X Consortium standards, X Project T)-.165 E(eam) --.77 E(speci\214cations, and other speci\214cations are the basis for p\ -ortions of The Open Group')97 604.2 Q 2.75(sv)-.605 G(arious CAE)-3.025 -E(Speci\214cations. Some of the ne)97 617.2 Q 2.75(wf)-.275 G -(eatures in this release are not)-2.75 E/F2 11/Times-Italic@0 SF -(standar)2.75 E(d)-.407 E F1 2.75(,t)C(hat is, there is no accom-)-2.75 -E(pan)97 630.2 Q(ying speci\214cation.)-.165 E F0(Implementations)72 -646.8 Q F1 -.165(Fo)97 659.8 S 2.75(rm).165 G -(ost of X Consortium standards and X Project T)-2.75 E -(eam speci\214cations, a high-quality implementa-)-.77 E(tions is pro)97 -672.8 Q(vided to demonstrate proof of concept, to gi)-.165 E .33 -.165 -(ve ve)-.275 H(ndors a base to use, and early adopters a).165 E -(chance to be)97 685.8 Q(gin de)-.165 E -.165(ve)-.275 G -(loping using the ne).165 E 2.75(wf)-.275 G(eatures. These are not)-2.75 -E F2 -.407(re)2.75 G(fer).407 E(ence)-.407 E F1 -(implementations \212 the)2.75 E -(written speci\214cations are the authoritati)97 698.8 Q .33 -.165(ve d) --.275 H(e\214nition.).165 E F0 -.275(Fo)72 715.4 S(nts).275 E F1 2.75 -(Ac)97 728.4 S -(ollection of bitmap and outline fonts are included in the distrib)-2.75 -E(ution, contrib)-.22 E(uted by v)-.22 E(arious)-.275 E(1)303.25 769 Q -EP -%%Page: 2 4 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 11/Times-Roman@0 SF 2.75(XW)72 49 S(indo)-3.19 E 2.75(wS)-.275 G -(ystem Release Notes)-2.75 E 2.75(XV)205.364 G(ersion 11, Release 6.4) --3.971 E(indi)97 85 Q(viduals and companies.)-.275 E/F1 11/Times-Bold@0 -SF(Utility Libraries)72 101.6 Q F0 2.75(An)97 114.6 S -(umber of libraries, such as Xmu and the Athena W)-2.75 E -(idget Set, are included. These are not stan-)-.44 E(dards, b)97 127.6 Q -(ut are used in b)-.22 E(uilding the applications contained in the rele\ -ase and may be useful in b)-.22 E(uild-)-.22 E(ing other applications.) -97 140.6 Q F1(Pr)72 157.2 Q(ograms)-.198 E F0 1.76 -.88(We a)97 170.2 T -(lso pro).88 E(vide a number of application programs. A fe)-.165 E 2.75 -(wo)-.275 G 2.75(ft)-2.75 G(hese programs, such as)-2.75 E/F2 11 -/Times-Italic@0 SF(xdm)2.75 E F0(\(or its)2.75 E(equi)97 183.2 Q -.275 -(va)-.275 G(lent\), should be considered essential in almost all en).275 -E(vironments. The rest of the applications)-.44 E -(carry no special status; the)97 196.2 Q 2.75(ya)-.165 G -(re simply programs that ha)-2.75 E .33 -.165(ve b)-.22 H(een de).165 E --.165(ve)-.275 G(loped and/or maintained by X).165 E -(Consortium and X Project T)97 209.2 Q(eam staf)-.77 E 2.75(f. In)-.275 -F(some cases, you will \214nd better substitutes for these pro-)2.75 E -(grams contrib)97 222.2 Q(uted by others.)-.22 E F1 2.75(4. Supported)72 -261.2 R(Operating Systems)2.75 E F0(This release w)72 290.8 Q(as b)-.11 -E(uilt and tested on the follo)-.22 E(wing reference platforms:)-.275 E -(Digital Unix 4.0A)108 313.4 Q(Fujitsu UXP V20L10)108 326.4 Q -(HPUX 10.20)108 339.4 Q(Solaris 2.5)108 352.4 Q(This release w)72 375 Q -(as also b)-.11 E(uilt on the follo)-.22 E(wing systems:)-.275 E -(AIX 4.2)108 397.6 Q(IRIX 6.2)108 410.6 Q(FreeBSD 2.2.2)108 423.6 Q -(S.u.S.E. Linux 5.0.0 \(k)108 436.6 Q(ernel 2.0.30, libc 5.4.33\))-.11 E -(SunOS 4.1.4)108 449.6 Q -.44(Wi)108 462.6 S(ndo).44 E -(ws NT 3.51 \(NCD W)-.275 E(inCenter\))-.44 E(In all cases e)72 485.2 Q -(xcept SunOS we ha)-.165 E .33 -.165(ve u)-.22 H(sed the v).165 E -(endor')-.165 E 2.75(sc)-.605 G(ompiler)-2.75 E 2.75(.O)-.605 G 2.75(nS) --2.75 G(unOS we b)-2.75 E(uild with the GNU C com-)-.22 E(piler \()72 -498.2 Q F2(gcc)A F0(\).)A F1 2.75(5. Supported)72 537.2 R(Graphics De) -2.75 E(vices)-.165 E F0(This release includes the necessary de)72 566.8 -Q(vice-dependent support to b)-.275 E(uild a nati)-.22 E .33 -.165 -(ve X s)-.275 H(erv).165 E(er for the follo)-.165 E(wing)-.275 E -(platforms:)72 579.8 Q(HP-UX: Xhp)108 602.4 Q -(Digital Unix: Xdec on DECstation 3000/400 \(Alpha\) with PMA)108 615.4 -Q(G-B)-.44 E -(SunOS/Solaris: Xsun \212 see the Xsun man page for supported cards)108 -628.4 Q(XFree86: See the XF_* man pages for supported cards)108 641.4 Q -(In addition to the abo)72 660.4 Q -.165(ve)-.165 G 2.75(,t).165 G -(he Xvfb and Xnest serv)-2.75 E(ers can be b)-.165 E -(uilt on all platforms.)-.22 E(Nati)72 677 Q .33 -.165(ve X s)-.275 H -(erv).165 E(ers are not b)-.165 E(uilt on AIX, Fujitsu UXP)-.22 E 2.75 -(,I)-1.221 G(RIX, or Microsoft W)-2.75 E(indo)-.44 E(ws NT)-.275 E(.) --.814 E(2)303.25 769 Q EP -%%Page: 3 5 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 11/Times-Roman@0 SF 2.75(XV)72 49 S(ersion 11, Release 6.4)-3.971 E -2.75(XW)205.364 G(indo)-3.19 E 2.75(wS)-.275 G(ystem Release Notes)-2.75 -E/F1 11/Times-Bold@0 SF 2.75(6. The)72 85 R(Sour)2.75 E(ce T)-.198 E --.198(re)-.814 G(e).198 E F0(The source is distrib)72 114.6 Q(uted in U\ -NIX tar \214les. The source unpacks from the tar \214les into a source \ -tree, and)-.22 E(the name of the base directory of the source tree is)72 -127.6 Q F1(xc)2.75 E F0 2.75(.T)C(he name)-2.75 E F1(xc)2.75 E F0 -(as the base of the source tree has been)2.75 E -(retained from the X Consortium releases.)72 140.6 Q -(The general layout under)72 166.6 Q F1(xc/)2.75 E F0(is as follo)2.75 E -(ws:)-.275 E 110.692(con\214g/ imak)72 189.2 R 2.75(ec)-.11 G -(on\214g \214les,)-2.75 E/F2 11/Times-Italic@0 SF(imak)2.75 E(e)-.11 E -F0(,)A F2(mak)2.75 E(edepend)-.11 E F0 2.75(,e)C(tc.)-2.75 E 122.308 -(doc/ all)72 202.2 R(documentation other than per)2.75 E -(-program manual pages)-.22 E 116.192(fonts/ BDF)72 215.2 R 2.75(,S)-.88 -G(peedo, T)-2.75 E(ype1 fonts)-.88 E 105.808(include/ common)72 228.2 R -(include \214les)2.75 E 126.576(lib/ libraries)72 241.2 R 125.355 -(nls/ national)72 254.2 R(language support \214les)2.75 E 96.645 -(programs/ all)72 267.2 R(programs, including the X serv)2.75 E(er and) --.165 E F2 -.407(rg)2.75 G(b).407 E F0(,)A(util/)72 280.2 Q F2(patc) -126.268 E(h)-.165 E F0(,)A F2(compr)2.75 E(ess)-.407 E F0 2.75(,o)C -(ther utilities)-2.75 E -.22(bu)72 293.2 S 95.039(g-report b).22 F -(ug reporting template)-.22 E(re)72 306.2 Q 107.81(gistry X)-.165 F(Re) -2.75 E(gistry)-.165 E F1 2.75(7. X)72 351.2 R(Registry)2.75 E F0 -(The X Project T)72 380.8 Q(eam maintains a re)-.77 E -(gistry of certain X-related items to aid in a)-.165 E -.22(vo)-.22 G -(iding con\215icts and to aid).22 E(in sharing of such items. The re)72 -393.8 Q(gistry is in the \214le)-.165 E F1(xc/r)2.75 E(egistry)-.198 E -F0(.)A F1 2.75(8. Extensions)72 432.8 R(Supported)2.75 E F0(Release 6.4) -72 462.4 Q(includes source for the follo)5.5 E(wing e)-.275 E -(xtensions: BIG-REQ)-.165 E(UESTS, DOUBLE-B)-.11 E(UFFER, DPMS,)-.11 E -(Extended-V)72 475.4 Q(isual-Information, LBX, MIT)-.66 E(-SHM, MIT) --1.012 E(-SUNDR)-1.012 E -1.221(Y-)-.715 G(NONST)1.221 E(AND)-1.023 E -(ARD, Multi-Buf)-.44 E(fering,)-.275 E(RECORD, SECURITY)72 488.4 Q 2.75 -(,S)-1.419 G(HAPE, SYNC, T)-2.75 E(OG-CUP)-.198 E 2.75(,X)-1.221 G -(3D-PEX, XC-APPGR)-2.75 E(OUP)-.44 E 2.75(,X)-1.221 G(C-MISC,)-2.75 E -(XFree86-V)72 501.4 Q -(idModeExtension, XIE \(X Image Extension\), XINERAMA.)-.66 E -(XInputExtension, XKEY)5.5 E(-)-1.221 E(BO)72 514.4 Q -(ARD, XpExtension \(printing\), XTEST)-.385 E 2.75(,a)-.814 G(nd XT) --2.75 E(estExtension1,)-.77 E(Not all of these e)72 531 Q -(xtensions are standard; see the Standards manual page. Some of these e) --.165 E(xtensions may)-.165 E(not be supported on e)72 544 Q -.165(ve) --.275 G(ry platform.).165 E F1 2.75(9. Implementation)72 583 R -(Dependent P)2.75 E(arameters)-.11 E F0 -(Some of the speci\214cations de\214ne some beha)72 612.6 Q -(vior as implementation-dependent. Implementations of the X)-.22 E -(Consortium standards and X Project T)72 625.6 Q -(eam speci\214cations must document ho)-.77 E 2.75(wt)-.275 G -(hose parameters are imple-)-2.75 E(mented.)72 638.6 Q(The def)72 655.2 -Q(ault v)-.11 E -(alues in this release of the implementation dependent parameters are:) --.275 E(XFILESEARCHP)72 684.8 Q -1.221(AT)-1.012 G 2.75(Hd)1.221 G(ef) --2.75 E(ault:)-.11 E(This def)97 697.8 Q(ault can be set at b)-.11 E -(uild time by setting the)-.22 E F2(imak)2.75 E(e)-.11 E F0 -.275(va) -2.75 G(riables XFileSearchP).275 E(athDef)-.165 E(ault,)-.11 E -(XAppLoadDir)97 710.8 Q 2.75(,X)-.44 G(FileSearchP)-2.75 E -(athBase, and ProjectRoot in)-.165 E F1(xc/con\214g/cf/site.def)2.75 E -F0 2.75(.S)C(ee)-2.75 E F1(xc/con-)2.75 E(\214g/cf/README)97 723.8 Q F0 -(for instructions and)2.75 E F1(xc/con\214g/cf/X11.tmpl)2.75 E F0 -(for details of ho)2.75 E 2.75(wt)-.275 G(hese con\214guration)-2.75 E -(3)303.25 769 Q EP -%%Page: 4 6 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 11/Times-Roman@0 SF 2.75(XW)72 49 S(indo)-3.19 E 2.75(wS)-.275 G -(ystem Release Notes)-2.75 E 2.75(XV)205.364 G(ersion 11, Release 6.4) --3.971 E -.275(va)97 85 S(riables are used.).275 E(By def)97 101.6 Q -(ault the imak)-.11 E 2.75(ev)-.11 G(ariable ProjectRoot is)-3.025 E/F1 -11/Times-Bold@0 SF(/usr/X11R6.4)2.75 E F0(and XFILESEARCHP)2.75 E -1.221 -(AT)-1.012 G 2.75(Hh)1.221 G(as these)-2.75 E(components:)97 114.6 Q/F2 -11/Times-Italic@0 SF($Pr)133 133.6 Q(ojectRoot)-.495 E F0 -(/lib/X11/%L/%T/%N%C%S)A F2($Pr)133 146.6 Q(ojectRoot)-.495 E F0 -(/lib/X11/%l/%T/%N%C%S)A F2($Pr)133 159.6 Q(ojectRoot)-.495 E F0 -(/lib/X11/%T/%N%C%S)A F2($Pr)133 172.6 Q(ojectRoot)-.495 E F0 -(/lib/X11/%L/%T/%N%S)A F2($Pr)133 185.6 Q(ojectRoot)-.495 E F0 -(/lib/X11/%l/%T/%N%S)A F2($Pr)133 198.6 Q(ojectRoot)-.495 E F0 -(/lib/X11/%T/%N%S)A(XUSERFILESEARCHP)72 234.2 Q -1.221(AT)-1.012 G 2.75 -(Hd)1.221 G(ef)-2.75 E(ault:)-.11 E(If the en)97 247.2 Q(vironment v) --.44 E(ariable XAPPLRESDIR is de\214ned, the def)-.275 E(ault v)-.11 E -(alue of XUSERFILESEARCH-)-.275 E -1.012(PA)97 260.2 S(TH has the follo) --.209 E(wing components:)-.275 E($XAPPLRESDIR/%L/%N%C)133 279.2 Q -($XAPPLRESDIR/%l/%N%C)133 292.2 Q($XAPPLRESDIR/%N%C)133 305.2 Q -($HOME/%N%C)133 318.2 Q($XAPPLRESDIR/%L/%N)133 331.2 Q -($XAPPLRESDIR/%l/%N)133 344.2 Q($XAPPLRESDIR/%N)133 357.2 Q($HOME/%N)133 -370.2 Q(Otherwise it has these components:)97 389.2 Q($HOME/%L/%N%C)133 -408.2 Q($HOME/%l/%N%C)133 421.2 Q($HOME/%N%C)133 434.2 Q($HOME/%L/%N)133 -447.2 Q($HOME/%l/%N)133 460.2 Q($HOME/%N)133 473.2 Q(XKEYSYMDB def)72 -508.8 Q(ault:)-.11 E(Def)97 521.8 Q(aults to)-.11 E F2($Pr)2.75 E -(ojectRoot)-.495 E F1(/lib/X11/XK)A(eysymDB)-.275 E F0(.)A(XCMSDB def)72 -551.4 Q(ault:)-.11 E(Def)97 564.4 Q(aults to)-.11 E F2($Pr)2.75 E -(ojectRoot)-.495 E F1(/lib/X11/Xcms.txt)A F0(.)A(XLOCALEDIR def)72 594 Q -(ault:)-.11 E(Def)97 607 Q(aults to the directory)-.11 E F2($Pr)2.75 E -(ojectRoot)-.495 E F1(/lib/X11/locale)A F0 5.5(.T)C(he XLOCALEDIR v)-5.5 -E(ariable can contain)-.275 E(multiple colon-separated pathnames.)97 620 -Q(XErrorDB location)72 649.6 Q(The Xlib error database \214le is)97 -662.6 Q F2($Pr)2.75 E(ojectRoot)-.495 E F1(/lib/X11/XErr)A(orDB)-.198 E -F0(.)A(XtErrorDB location)72 692.2 Q(The Xt error database \214le is)97 -705.2 Q F2($Pr)2.75 E(ojectRoot)-.495 E F1(/lib/X11/XtErr)A(orDB)-.198 E -F0(.)A(4)303.25 769 Q EP -%%Page: 5 7 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 11/Times-Roman@0 SF 2.75(XV)72 49 S(ersion 11, Release 6.4)-3.971 E -2.75(XW)205.364 G(indo)-3.19 E 2.75(wS)-.275 G(ystem Release Notes)-2.75 -E(Supported Locales)72 85 Q -(Locales supported by this implementation are in)97 98 Q/F1 11 -/Times-Bold@0 SF(xc/nls/locale.dir)2.75 E F0 5.5(.T)C -(he mapping between v)-5.5 E(arious)-.275 E -(system locale names and X locale names is in)97 111 Q F1 -(xc/nls/locale.alias)2.75 E F0 2.75(.B)C -(oth \214les are installed in the)-2.75 E(def)97 124 Q -(ault XLOCALEDIR directory)-.11 E 2.75(,i)-.715 G(.e.)-2.75 E/F2 11 -/Times-Italic@0 SF($Pr)2.75 E(ojectRoot)-.495 E F1(/lib/X11/locale/)A F0 -(\).)A(Supported Input Methods)72 153.6 Q(This distrib)97 166.6 Q -(ution does not include source for an)-.22 E 2.75(yi)-.165 G -(nput method serv)-2.75 E(ers; ho)-.165 E(we)-.275 E -.165(ve)-.275 G -2.75(rX).165 G(lib supplies a)-2.75 E(def)97 179.6 Q(ault b)-.11 E(uilt\ --in input method that supports compose processing in 8-bit locales. Com\ -pose \214les are)-.22 E(pro)97 192.6 Q -(vided for Latin-1 and Latin-2. The b)-.165 E -(uilt-in input method can support other locales, gi)-.22 E -.165(ve) --.275 G 2.75(ns).165 G(uitable)-2.75 E(compose \214les. See)97 205.6 Q -F1(xc/nls/Compose/iso8859-*)2.75 E F0(for the supported compositions.) -2.75 E(The Input Method Serv)72 222.2 Q(er De)-.165 E -.165(ve)-.275 G -(lopment Kit \(IMdkit\) is at ftp://ftp.x.or).165 E -(g/pub/unsupported/lib/IMdkit/.)-.198 E F1 2.75(10. What)72 261.2 R -(Is New in Release 6.4)2.75 E F0 -(This section describes changes in the X Project T)72 290.8 Q -(eam distrib)-.77 E(ution since Release 6.3.)-.22 E(The major ne)72 -307.4 Q 2.75(wf)-.275 G(unctionality in R6.4 is: Display Po)-2.75 E -(wer Management Signaling \(DPMS\) to set "green")-.275 E -(computer monitors into po)72 320.4 Q(wer sa)-.275 E -(ving mode; Extended V)-.22 E(isual Information to allo)-.66 E 2.75(wa) --.275 G(pplications to dis-)-2.75 E(co)72 333.4 Q -.165(ve)-.165 G 2.75 -(rm).165 G(ore about the graphics capabilities of the serv)-2.75 E -(er than the core protocol allo)-.165 E(ws; Colormap Utiliza-)-.275 E -(tion Polic)72 346.4 Q 2.75(y\()-.165 G -.198(TO)-2.75 G(G-CUP\) allo) -.198 E(ws applications to disco)-.275 E -.165(ve)-.165 G 2.75(rd).165 G -(esktop special colors, e.g.)-2.75 E(MS-W)5.5 E(indo)-.44 E(ws)-.275 E -(reserv)72 359.4 Q(ed \(pre-allocated\) colors on PC-Xserv)-.165 E -(ers, and store read-only \(sharable\) colors in speci\214c locations) --.165 E(in a colormap; and Xinerama, a wide screen serv)72 372.4 Q -(er that combines tw)-.165 E 2.75(oo)-.11 G 2.75(rm)-2.75 G -(ore screens into a single virtual)-2.75 E(screen.)72 385.4 Q(The X T)72 -402 Q(oolkit Intrinsics library \(libXt\) no)-.88 E 2.75(wh)-.275 G -(as IBM')-2.75 E 2.75(sE)-.605 G -(asy Resource Con\214guration support included.)-2.75 E -(Xlib \(libX11\) has tw)72 418.6 Q 2.75(on)-.11 G .55 -.275(ew A)-2.75 H -(PIs: XkbSetPerClientControls and XkbGetPerClientControls. These tw).275 -E(o)-.11 E -(functions were unintentionally omitted from the library in pre)72 431.6 -Q(vious releases.)-.275 E(The XFree86 serv)72 448.2 Q(ers are no)-.165 E -2.75(wb)-.275 G(ased on XFree86 3.3.1.)-2.75 E F1 2.75(11. What)72 487.2 -R(is Unchanged in Release 6.4)2.75 E F0(As this is an update release, t\ -here is a great deal of stability in the standards, libraries, and clie\ -nts. No)72 516.8 Q -.165(ex)72 529.8 S(isting standards ha).165 E .33 --.165(ve c)-.22 H(hanged in a material w).165 E -(ay; although some documents ha)-.11 E .33 -.165(ve b)-.22 H -(een updated with).165 E(minor corrections. The e)72 542.8 Q -(xtension library)-.165 E(,)-.715 E F2(libXe)2.75 E(xt)-.22 E F0 2.75 -(,i)C 2.75(su)-2.75 G(pdated to include the DPMS, Extended-V)-2.75 E -(isual-Infor)-.66 E(-)-.22 E(mation, T)72 555.8 Q(OG-CUP)-.198 E 2.75 -(,a)-1.221 G(nd XINERAMA e)-2.75 E(xtension interf)-.165 E -(aces. All pre)-.11 E(vious interf)-.275 E(aces in these and all other) --.11 E(libraries are unchanged.)72 568.8 Q(5)303.25 769 Q EP -%%Page: 6 8 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 11/Times-Roman@0 SF 2.75(XW)72 49 S(indo)-3.19 E 2.75(wS)-.275 G -(ystem Release Notes)-2.75 E 2.75(XV)205.364 G(ersion 11, Release 6.4) --3.971 E/F1 11/Times-Bold@0 SF 2.75(12. New)72 85 R(OS Support)2.75 E F0 -(The follo)72 114.6 Q(wing table sho)-.275 E(ws the v)-.275 E -(ersions of the operating systems that were used to de)-.165 E -.165(ve) --.275 G(lop this and prior).165 E(releases:)72 127.6 Q 72.855(System R6) -72 150.2 R 48.163(R6.1 R6.[23])59.163 F(R6.4)38.087 E 85.703(AIX 3.2.5) -72 176.2 R 47.25(4.1.4 4.2)50 F(4.2)58.25 E 78.366(A/UX 3.0.1)72 189.2 R -66.5<898989>50 G 64.297(BSD/386 1.0)72 202.2 R 66.5<898989>58.25 G -(Digital Unix \(OSF/1\))72 215.2 Q 38.692(1.0/1.3 3.2C)13.884 F 47.558 -(4.0A 4.0A)50.913 F 64.308(FreeBSD \211)72 228.2 R 47.25 -(2.1.0 2.1.6 2.2.2)66.5 F(Fujitsu UXP)72 241.2 Q 66.5<89898956>52.681 G -(20L10)-66.5 E 71.645(HP-UX 9.1)72 254.2 R 44.5(10.01 10.01 10.20)58.25 -F 82.645(IRIX 5.2)72 267.2 R 55.5(5.3 6.2 6.2)58.25 F(Linux \(k)72 280.2 -Q(ernel\))-.11 E(Slackw)77.5 293.2 Q(are 2.3)-.11 E 66.5<8931>40.295 G -41.75(.2.11 \211)-66.5 F<89>66.5 E(Slackw)77.5 306.2 Q(are 3.1)-.11 E -66.5<898932>40.295 G 55.5(.0 \211)-66.5 F(S.u.S.E. 5.0)77.5 319.2 Q 66.5 -<89898932>50.547 G(.0.30)-66.5 E 80.203(Mach 2.5)72 332.2 R 66.5<898989> -58.25 G 56.366(NEWS-OS 6.0)72 345.2 R 66.5<898989>58.25 G 74.692 -(Solaris 2.3)72 358.2 R 55.5(2.4 2.5 2.5)58.25 F 74.076(SunOS 4.1.3)72 -371.2 R 47.25(4.1.3 4.1.4 4.1.4)50 F 64.308(Ultrix-32 4.3)72 384.2 R -55.5(4.4 \211)58.25 F<89>66.5 E 64.308(UNICOS 8.0)72 397.2 R 66.5 -<898989>58.25 G(Unixw)72 410.2 Q(are SVR4.2)-.11 E 55.5(1.0 2.02)26.842 -F 50(2.02 \211)52.75 F -.44(Wi)72 423.2 S(ndo).44 E(ws NT)-.275 E 55.5 -(3.1 3.5 4.0 3.51)49.139 F F1 2.75(13. New)72 468.2 R(Speci\214cations) -2.75 E F0(The follo)72 497.8 Q(wing are the ne)-.275 E 2.75(wXP)-.275 G -(roject T)-2.75 E -(eam speci\214cations in Release 6.4. Each is described in its o)-.77 E -(wn sec-)-.275 E(tion belo)72 510.8 Q -.715(w.)-.275 G(Display Po)108 -529.8 Q(wer Management Signalling \(DPMS\))-.275 E(Extended V)108 542.8 -Q(isual Information \(EVI\))-.66 E(Colormap Utilization Polic)108 555.8 -Q 2.75(y\()-.165 G -.198(TO)-2.75 G(G-CUP\)).198 E F1 2.75 -(13.1. Display)72 600.8 R -2.42 -.22(Po w)2.75 H -(er Management Signaling).22 E F0(This e)72 630.4 Q(xtension pro)-.165 E -(vides X Protocol control o)-.165 E -.165(ve)-.165 G 2.75(rt).165 G -(he VESA Display Po)-2.75 E(wer Management Signaling)-.275 E -(\(DPMS\) characteristics of video boards under control of the X W)72 -643.4 Q(indo)-.44 E 2.75(wS)-.275 G(ystem.)-2.75 E -.385(Tr)72 660 S -(aditionally).385 E 2.75(,t)-.715 G(he X W)-2.75 E(indo)-.44 E 2.75(wS) --.275 G(ystem has pro)-2.75 E -(vided for both blanking and non-blanking screen sa)-.165 E -.165(ve) --.22 G(rs.).165 E -.385(Ti)72 673 S(meouts associated with these b).385 -E(uilt-in screen sa)-.22 E -.165(ve)-.22 G 2.75(rm).165 G -(echanisms are limited to idle \(dwell\) time, and a)-2.75 E -(change timeout that speci\214es the change interv)72 686 Q -(al for non-blanking screen sa)-.275 E -.165(ve)-.22 G(rs.).165 E -(The United States' En)72 702.6 Q(vironmental Protection Agenc)-.44 E -2.75(y\()-.165 G(EP)-2.75 E(A\) Ener)-1.012 E -(gy Star program requires that monitors)-.198 E(po)72 715.6 Q(wer do) --.275 E(wn after some idle time by def)-.275 E -(ault. While it is possible to simply o)-.11 E -.165(ve)-.165 G -(rload the e).165 E(xisting screen)-.165 E(sa)72 728.6 Q -.165(ve)-.22 G -2.75(rt).165 G(imeouts, this solution lea)-2.75 E -.165(ve)-.22 G 2.75 -(st).165 G(he non-pri)-2.75 E(vile)-.275 E -(ged user little to no control o)-.165 E -.165(ve)-.165 G 2.75(rt).165 G -(he DPMS)-2.75 E(6)303.25 769 Q EP -%%Page: 7 9 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 11/Times-Roman@0 SF 2.75(XV)72 49 S(ersion 11, Release 6.4)-3.971 E -2.75(XW)205.364 G(indo)-3.19 E 2.75(wS)-.275 G(ystem Release Notes)-2.75 -E(characteristics of his or her system.)72 85 Q -.165(Fo)5.5 G 2.75(re) -.165 G(xample, disabling DPMS w)-2.915 E -(ould require some unintended side)-.11 E(ef)72 98 Q -(fect in the core screen sa)-.275 E -.165(ve)-.22 G .88 -.44(r, s).165 H -(uch as disabling the changing of a non-blanking screen sa).44 E -.165 -(ve)-.22 G -.605(r.).165 G/F1 11/Times-Bold@0 SF 2.75(13.2. Extended)72 -137 R -.407(Vi)2.75 G(sual Inf).407 E(ormation)-.275 E F0 -(The Extended V)72 166.6 Q(isual Information \(EVI\) e)-.66 E -(xtension allo)-.165 E -(ws a client to determine information about core X)-.275 E(visuals be)72 -179.6 Q(yond what the core protocol pro)-.165 E(vides.)-.165 E -(As the X W)72 196.2 Q(indo)-.44 E 2.75(wS)-.275 G(ystem has e)-2.75 E --.22(vo)-.275 G(lv).22 E -(ed, it has become clear that the information returned by the core X) --.165 E(protocol re)72 209.2 Q -.055(ga)-.165 G(rding V).055 E -(isuals is often insuf)-.66 E -(\214cient for a client to determine which is the most appropriate)-.275 -E(visual for its needs. This e)72 222.2 Q(xtension allo)-.165 E -(ws clients to query the X serv)-.275 E -(er for additional visual information,)-.165 E(speci\214cally as re)72 -235.2 Q -.055(ga)-.165 G(rds colormaps and frameb).055 E(uf)-.22 E -(fer le)-.275 E -.165(ve)-.275 G(ls.).165 E(This e)72 251.8 Q -(xtension is meant to address the needs of pure X clients only)-.165 E -5.5(.I)-.715 G 2.75(ti)-5.5 G 2.75(ss)-2.75 G -(peci\214cally and purposefully not)-2.75 E -(designed to address the needs of X e)72 264.8 Q -(xtensions. Extensions that ha)-.165 E .33 -.165(ve a)-.22 H 2.75(ni) -.165 G(mpact on visual information)-2.75 E(should pro)72 277.8 Q -(vide their o)-.165 E(wn mechanisms for deli)-.275 E -.165(ve)-.275 G -(ring that information. F).165 E(or e)-.165 E(xample, the Double Buf) --.165 E(fering)-.275 E(Extension \(DBE\) pro)72 290.8 Q(vides its o) --.165 E(wn mechanism for determining which visuals support double-b) --.275 E(uf)-.22 E(fering.)-.275 E F1 2.75(13.3. Colormap)72 329.8 R -(Utilization P)2.75 E(olicy)-.22 E F0(This e)72 359.4 Q -(xtension has three purposes: a\) to pro)-.165 E -(vide mechanism for a special application \(a colormap man-)-.165 E -(ager\) to disco)72 372.4 Q -.165(ve)-.165 G 2.75(ra).165 G .33 -.165 -(ny s)-2.75 H(pecial colormap requirements, e.g. the colormap entries t\ -hat are nominally reserv).165 E(ed)-.165 E -(for desktop colors in the MS-W)72 385.4 Q(indo)-.44 E(ws en)-.275 E -(vironment and initialize the def)-.44 E -(ault colormap so that it can be)-.11 E(more easily shared; and b\) to \ -encourage colormap sharing and reduce colormap \215ashing on lo)72 398.4 -Q(w-end 8-bit)-.275 E(frame b)72 411.4 Q(uf)-.22 E(fers by pro)-.275 E -(viding a polic)-.165 E 2.75(yf)-.165 G -(or sharing; and c\) when colormaps aren')-2.75 E 2.75(ts)-.198 G -(hared, de\214ne a beha)-2.75 E(vior in)-.22 E(the X serv)72 424.4 Q -(er color allocation scheme to reduce colormap \215ashing.)-.165 E 1.76 --.88(To e)72 441 T(ncourage colormap sharing and accommodate special co\ -lormap requirements tw).88 E 2.75(on)-.11 G .55 -.275(ew p)-2.75 H -(rotocols are).275 E(de\214ned: the \214rst pro)72 454 Q(vides a w)-.165 -E(ay to query the serv)-.11 E(er for a list of reserv)-.165 E -(ed colormap entries, and the second)-.165 E(is a w)72 467 Q(ay to init\ -ialize read-only \(sharable\) colormap entries at speci\214c locations \ -in a colormap.)-.11 E 1.76 -.88(To m)72 483.6 T -(inimize colormap \215ashing when the root windo).88 E(w')-.275 E 2.75 -(sd)-.605 G(ef)-2.75 E(ault visual is one of GrayScale, PseudoColor)-.11 -E(,)-.44 E(or DirectColor)72 496.6 Q 2.75(,a)-.44 G(nd a pri)-2.75 E --.275(va)-.275 G(te colormap for the def).275 E -(ault visual is being used, a minor \(b)-.11 E(ut compatible\))-.22 E -(change to the serv)72 509.6 Q(er implementation of the AllocColor and \ -AllocNamedColor requests is required. Where)-.165 E -(the core protocol says nothing about the pix)72 522.6 Q(el v)-.165 E -(alues returned, when this e)-.275 E(xtension is in ef)-.165 E -(fect, the Alloc-)-.275 E(Color and AllocNamedColor requests will \214r\ -st look for a matching color in the def)72 535.6 Q -(ault colormap, and, if a)-.11 E -(match is found and the same cell in the pri)72 548.6 Q -.275(va)-.275 G -(te colormap has not already been allocated, the color will be).275 E -(allocated in the pri)72 561.6 Q -.275(va)-.275 G -(te colormap at the same location as in the def).275 E -(ault colormap \(instead of in the \214rst)-.11 E -.22(av)72 574.6 S -(ailable location.\))-.055 E F1 2.75(14. Easy)72 613.6 R(Resour)2.75 E -(ce Con\214guration)-.198 E F0 -(Setting and changing resources in X applications can be dif)72 643.2 Q -(\214cult for both the application programmer and)-.275 E(the end user) -72 656.2 Q(.)-.605 E F1(Resour)5.5 E -(ce Con\214guration Management \(RCM\))-.198 E F0 -(addresses this problem by changing the)2.75 E F1(X)2.75 E(Intrinsics)72 -669.2 Q F0(to immediately modify a resource for a speci\214ed widget an\ -d each child widget in the hierarch)2.75 E -.715(y.)-.055 G -(In this conte)72 682.2 Q(xt, immediate means: no sourcing of a resourc\ -e \214le is required; the application does not need)-.165 E -(to be restarted for the ne)72 695.2 Q 2.75(wr)-.275 G(esource v)-2.75 E -(alues to tak)-.275 E 2.75(ee)-.11 G -.275(ff)-2.75 G -(ect; and the change occurs immediately).275 E(.)-.715 E(The main dif)72 -711.8 Q(ference between)-.275 E F1(RCM)2.75 E F0(and the)2.75 E F1 -(Editr)2.75 E(es)-.198 E F0(protocol is that the)2.75 E F1(RCM)2.75 E F0 -(customizing hooks reside)2.75 E(in the)72 724.8 Q F1(Intrinsics)2.75 E -F0(and thus are link)2.75 E -(ed with other toolkits such as Motif and the Athena widgets. Ho)-.11 E -(we)-.275 E -.165(ve)-.275 G -.44(r,).165 G(7)303.25 769 Q EP -%%Page: 8 10 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 11/Times-Roman@0 SF 2.75(XW)72 49 S(indo)-3.19 E 2.75(wS)-.275 G -(ystem Release Notes)-2.75 E 2.75(XV)205.364 G(ersion 11, Release 6.4) --3.971 E(the)72 85 Q/F1 11/Times-Bold@0 SF(EditRes)2.75 E F0 -(protocol requires the application to link with the)2.75 E F1(EditRes) -2.75 E F0(routines in the Xmu library and)2.75 E -(Xmu is not used by all applications that use Motif.)72 98 Q -(Easy Resource Con\214guration is not a standard part of the X T)72 -114.6 Q(oolkit Intrinsics \(libXt\). It is neither an X)-.88 E -(Consortium standard nor an X Project T)72 127.6 Q(eam speci\214cation.) --.77 E F1 2.75(15. Xinerama)72 166.6 R F0(The Xinerama e)72 196.2 Q -(xtension pro)-.165 E(vides a w)-.165 E -(ay for a multi-headed system to function as one lar)-.11 E -(ge screen. W)-.198 E(in-)-.44 E(do)72 209.2 Q -(ws can span multiple screens and can mo)-.275 E .33 -.165(ve f)-.165 H -(rom one screen to another).165 E(.)-.605 E(Currently)72 225.8 Q 2.75 -(,t)-.715 G(he Xinerama Extension w)-2.75 E -(orks in a homogeneous graphics en)-.11 E(vironment. A graphics en)-.44 -E(viron-)-.44 E(ment is considered homogeneous if, for e)72 238.8 Q -(xample, all of the graphics cards ha)-.165 E .33 -.165(ve 8 p)-.22 H -(lanes with 6 visuals.).165 E(Mixing a 24-plane graphics card with a 8-\ -plane card creates a heterogeneous en)72 251.8 Q(vironment.)-.44 E -(Unlik)72 268.4 Q 2.75(eo)-.11 G -(ther multiple screen implementations, Xinerama pro)-2.75 E -(vides a solution at the de)-.165 E(vice-independent)-.275 E(le)72 281.4 -Q -.165(ve)-.275 G(l. The adv).165 E -(antage of this approach is that it reduces the amount of w)-.275 E -(ork in)-.11 E -.22(vo)-.44 G(lv).22 E(ed in supporting and)-.165 E -(maintaining the e)72 294.4 Q(xtension. The number of graphics de)-.165 -E(vices on the mark)-.275 E(et continues to gro)-.11 E(w; embedding) --.275 E(the e)72 307.4 Q(xtension functionality into the de)-.165 E -(vice dependent code for each de)-.275 E(vice w)-.275 E -(ould be a maintenance night-)-.11 E -(mare. Since the Xinerama implementation does not require an)72 320.4 Q -2.75(yl)-.165 G -.275(ow)-2.75 G(-le).275 E -.165(ve)-.275 G 2.75(lg) -.165 G(raphics modi\214cations, e)-2.75 E(xisting)-.165 E(de)72 333.4 Q -(vice-dependent code does not ha)-.275 E .33 -.165(ve t)-.22 H 2.75(ob) -.165 G 2.75(er)-2.75 G(ecompiled. In the loadable serv)-2.75 E(er w) --.165 E(orld, the Xinerama Exten-)-.11 E(sion will w)72 346.4 Q -(ork with e)-.11 E(xisting de)-.165 E(vice-dependent shared libraries.) --.275 E(The Xinerama e)72 363 Q(xtension is not a standard. It is neith\ -er an X Consortium standard nor an X Project T)-.165 E(eam)-.77 E -(speci\214cation.)72 376 Q F1 2.75(16. ANSI\214cation)72 415 R F0 -(R6.1 w)72 444.6 Q(as of)-.11 E -(\214cially the last release that supported traditional K&R C.)-.275 E -(Lik)5.5 E 2.75(eR)-.11 G(6.3, R6.4 assumes a Stan-)-2.75 E -(dard C compiler and en)72 457.6 Q(vironment. W)-.44 E 2.75(eh)-.88 G --2.475 -.22(av e)-2.75 H(not intentionally remo)2.97 E -.165(ve)-.165 G -2.75(da).165 G .33 -.165(ny K)-2.75 H(&R C support from old code,).165 E -(and most of the release will continue to b)72 470.6 Q -(uild on platforms without an ANSI C compiler)-.22 E(.)-.605 E F1 2.75 -(17. VSW5)72 509.6 R F0 1.76 -.88(We h)72 539.2 T -2.475 -.22(av e).88 H -(tested this release with VSW5 v)2.97 E -(ersion 5.0.0. This release passes all tests in VSW5 with the fol-)-.165 -E(lo)72 552.2 Q(wing e)-.275 E(xceptions:)-.165 E 21.15<8374>72 568.8 S -(ests for which a permanent w)-21.15 E(ai)-.11 E -.165(ve)-.275 G 2.75 -(rh).165 G(as been granted.)-2.75 E 21.15<8374>72 585.4 S -(ests for which a temporary w)-21.15 E(ai)-.11 E -.165(ve)-.275 G 2.75 -(rh).165 G -2.475 -.22(av e)-2.75 H(been granted.)2.97 E 21.15<8374>72 -602 S -(ests where a defect in the test has been identi\214ed and reported.) --21.15 E(VSW licensees may obtain a list of w)72 618.6 Q(ai)-.11 E -.165 -(ve)-.275 G(rs granted from http://www).165 E(.rdg.opengroup.or)-.715 E -(g/interpreta-)-.198 E(tions/database/.)72 631.6 Q F1 2.75(18. Y)72 -670.6 R(ear 2000 \(Y2K\) Compliance)-1.221 E F0 -.165(Fo)72 700.2 S 2.75 -(ras).165 G(tatement of compliance see http://www)-2.75 E(.camb)-.715 E -(.opengroup.or)-.44 E(g/tech/desktop/f)-.198 E(aq/y2k.htm)-.11 E(8) -303.25 769 Q EP -%%Page: 9 11 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 11/Times-Roman@0 SF 2.75(XV)72 49 S(ersion 11, Release 6.4)-3.971 E -2.75(XW)205.364 G(indo)-3.19 E 2.75(wS)-.275 G(ystem Release Notes)-2.75 -E/F1 11/Times-Bold@0 SF 2.75(19. Memory)72 85 R -1.012(Te)2.75 G(sting) -1.012 E F0(Be)72 114.6 Q(ginning circa X11R5 the MIT X Consortium staf) --.165 E(f, and later the X Consortium, Inc. staf)-.275 E(f, and no)-.275 -E 2.75(wt)-.275 G(he)-2.75 E 2.75(XP)72 127.6 S(roject T)-2.75 E -(eam staf)-.77 E 2.75(fh)-.275 G -2.475 -.22(av e)-2.75 H -(routinely tested this implementation for a v)2.97 E -(ariety of memory-type errors such)-.275 E -(as leaks, array bounds writes, uninitialized memory reads, and a v)72 -140.6 Q(ariety of other errors; using a combina-)-.275 E -(tion of commercial and "home gro)72 153.6 Q -(wn" memory testing tools. All the real problems were \214x)-.275 E -(ed long ago;)-.165 E(ho)72 166.6 Q(we)-.275 E -.165(ve)-.275 G 2.75(rw) -.165 G 2.75(ea)-2.75 G(ren')-2.75 E 2.75(ts)-.198 G 2.75(on)-2.75 G(ai) --2.75 E .33 -.165(ve a)-.275 H 2.75(st).165 G 2.75(ob)-2.75 G(elie)-2.75 -E .33 -.165(ve t)-.275 H(hat there no remaining b).165 E -(ugs. If you \214nd a memory problem in)-.22 E -(this implementation please \214le a b)72 179.6 Q -(ug-report. If you \214nd a memory problem in your v)-.22 E(endor')-.165 -E 2.75(si)-.605 G(mplementa-)-2.75 E(tion, tell your v)72 192.6 Q(endor) --.165 E 5.5(.T)-.605 G -(he popular commercial memory checking tools emit lots of f)-5.5 E -(alse or spurious)-.11 E -.11(wa)72 205.6 S -(rnings, most of which can be safely ignored.).11 E F1 2.75 -(20. Security)72 244.6 R(Considerations)2.75 E F0(On UNIX and UNIX-lik) -72 274.2 Q 2.75(eo)-.11 G(perating systems there are serious security i\ -mplications associated with run-)-2.75 E(ning suid-root programs.)72 -287.2 Q(By def)72 303.8 Q(ault the xterm terminal emulation program is \ -installed suid-root in order to be able to update utmp)-.11 E -(or utmpx entries. All the kno)72 316.8 Q(wn \(as of this writing\) e) --.275 E(xploitable security holes in the X libraries ha)-.165 E .33 --.165(ve b)-.22 H(een).165 E(eliminated \212 making it theoretically sa\ -fe for xterm to be suid-root. F)72 329.8 Q -(or additional security you may)-.165 E -(install xterm without suid-root; ho)72 342.8 Q(we)-.275 E -.165(ve) --.275 G 2.75(ri).165 G 2.75(fy)-2.75 G -(ou do, xterm will not be able to mak)-2.75 E 2.75(eu)-.11 G -(tmp or utmpx entries.)-2.75 E(On man)72 359.4 Q 2.75(yI)-.165 G -(ntel-based machines the X serv)-2.75 E(er must ha)-.165 E .33 -.165 -(ve r)-.22 H(oot pri).165 E(vile)-.275 E -(ges in order to access the graphics card)-.165 E(and open other de)72 -372.4 Q(vices. The easiest w)-.275 E(ay to grant the requisite pri)-.11 -E(vile)-.275 E(ges is to use xdm to run your X)-.165 E(serv)72 385.4 Q -(er)-.165 E 2.75(.S)-.605 G -(ome people, who prefer not to use xdm, often w)-2.75 E -(ork around the need for the X serv)-.11 E(er to run with)-.165 E -(root pri)72 398.4 Q(vile)-.275 E(ges by making their X serv)-.165 E -(er a suid-root program. While all the kno)-.165 E -(wn \(as of this writing\))-.275 E -.165(ex)72 411.4 S -(ploitable security holes in the serv).165 E(er ha)-.165 E .33 -.165 -(ve b)-.22 H(een eliminated, the X Project T).165 E -(eam still recommends that)-.77 E(you)72 424.4 Q F1(not)2.75 E F0(mak) -2.75 E 2.75(ey)-.11 G(our X serv)-2.75 E(er suid-root. There are)-.165 E -/F2 11/Times-Italic@0 SF(safe)2.75 E F0(suid-root wrapper programs a) -2.75 E -.275(va)-.22 G(ilable \(b).275 E(ut not in)-.22 E -(this release\) that you can use to start your serv)72 437.4 Q -(er if you don')-.165 E 2.75(tw)-.198 G(ant to use xdm.)-2.86 E F1 2.75 -(21. Filing)72 476.4 R(Bug Reports)2.75 E F0 -(If you \214nd a reproducible b)72 506 Q(ug in softw)-.22 E(are b)-.11 E -(uilt from the source in this distrib)-.22 E(ution or \214nd b)-.22 E -(ugs in its doc-)-.22 E(umentation, please complete a b)72 519 Q -(ug-report using the form in the \214le)-.22 E F1(xc/b)2.75 E(ug-r)-.22 -E(eport)-.198 E F0(and send it to The)2.75 E(Open Group X Project T)72 -532 Q(eam at)-.77 E(mailto:xb)108 551 Q(ugs@opengroup.or)-.22 E(g)-.198 -E(Please try to pro)72 573.6 Q(vide all of the information requested on\ - the form if it is applicable; the little e)-.165 E(xtra time)-.165 E -(you spend on the report will mak)72 586.6 Q 2.75(ei)-.11 G 2.75(tm) --2.75 G(uch easier for someone to reproduce, \214nd, and \214x the b) --2.75 E(ug.)-.22 E(Bugs in the contrib)72 603.2 Q(uted softw)-.22 E -(are that is a)-.11 E -.275(va)-.22 G -(ilable on the net are not handled on an).275 E 2.75(yo)-.165 G -.275 -<668c>-2.75 G(cial basis. Consult).275 E(the documentation for the indi) -72 616.2 Q(vidual softw)-.275 E(are to see where \(if an)-.11 E -(ywhere\) to report the b)-.165 E(ug.)-.22 E F1 2.75(22. Ackno)72 655.2 -R(wledgements)-.11 E F0(Release 6.4 of X11 w)72 684.8 Q -(as brought to you by the X Project T)-.11 E(eam staf)-.77 E 2.75(fa) --.275 G 2.75(tT)-2.75 G(he Open Group: Arthur Barsto)-2.75 E -.715(w,) --.275 G(Kaleb K)72 697.8 Q(eithle)-.275 E 1.43 -.715(y, S)-.165 H -(ekhar Makkapati, M.S. Ramesh, Jingping Ge, K).715 E(en Flo)-.275 E -(wers, and Da)-.275 E .33 -.165(ve K)-.22 H(norr).165 E(.)-.605 E(Se)72 -714.4 Q -.165(ve)-.275 G(ral companies and indi).165 E(viduals ha)-.275 -E .33 -.165(ve c)-.22 H(ooperated and w).165 E(ork)-.11 E -(ed hard to mak)-.11 E 2.75(et)-.11 G(his release a reality)-2.75 E 2.75 -(,a)-.715 G(nd)-2.75 E(our thanks go out to them:)72 727.4 Q(9)303.25 -769 Q EP -%%Page: 10 12 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 11/Times-Roman@0 SF 2.75(XW)72 49 S(indo)-3.19 E 2.75(wS)-.275 G -(ystem Release Notes)-2.75 E 2.75(XV)205.364 G(ersion 11, Release 6.4) --3.971 E(Madeline Asmus of Digital for Xinerama.)72 85 Q -(Peter Daifuku of Silicon Graphics for Extended-V)72 101.6 Q -(isual-Information.)-.66 E(Scott Re)72 118.2 Q -.165(ve)-.275 G -(lt of Sun Microsystems for preliminary w).165 E(ork on T)-.11 E(OG-CUP) --.198 E(.)-1.221 E(Rob Lembree, formerly of Digital, for DPMS.)72 134.8 -Q(Jef)72 151.4 Q 2.75(fW)-.275 G(alls of He)-3.63 E(wlett P)-.275 E -(ackard.)-.165 E -.88(Wo)72 168 S(jtek Jarosz of Attachmate.).88 E -(Bob Schulman of Sea)72 184.6 Q(weed.)-.165 E(Brian Bobryk of Digital.) -72 201.2 Q -.88(To)72 217.8 S 2.75(mB).88 G(ro)-2.75 E(wn of NetManage.) --.275 E(Garry P)72 234.4 Q(axinos of Metro Link.)-.165 E -.66(Vi)72 251 -S(ctor Gold of Peritek.).66 E(Jackie Drane of IBM.)72 267.6 Q(10)300.5 -769 Q EP -%%Page: 1 13 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 13/Times-Bold@0 SF -1.196(Ta)257.126 85 S(ble of Contents)1.196 E/F1 -11/Times-Roman@0 SF(1. What Is X11)72 124 Q -2.75 11 -(........................... 1)13.04 H(2. What is Release 6.4)72 137 Q --2.75 11(......................... 1)9.377 H(3. Ov)72 150 Q(ervie)-.165 -E 2.75(wo)-.275 G 2.75(ft)-2.75 G(he X Project T)-2.75 E(eam Release) --.77 E -2.75 11(.................. 1)13.37 H -(4. Supported Operating Systems)72 163 Q -2.75 11 -(...................... 2)6.616 H(5. Supported Graphics De)72 176 Q -9.663(vices .)-.275 F -2.75 11(..................... 2)11 H -(6. The Source T)72 189 Q 7.331(ree .)-.385 F -2.75 11 -(......................... 2)11 H(7. X Re)72 202 Q 4.944(gistry .)-.165 -F -2.75 11(........................... 3)11 H(8. Extensions Supported)72 -215 Q -2.75 11(........................ 3)14.25 H -(9. Implementation Dependent P)72 228 Q 4.977(arameters .)-.165 F -2.75 -11(.................. 3)11 H(10. What Is Ne)72 241 Q 2.75(wi)-.275 G -2.75(nR)-2.75 G(elease 6.4)-2.75 E -2.75 11(...................... 5) -9.971 H(11. What is Unchanged in Release 6.4)72 254 Q -2.75 11 -(.................... 5)8.475 H(12. Ne)72 267 Q 2.75(wO)-.275 G 2.75(SS) --2.75 G 13.612(upport .)-2.75 F -2.75 11(........................ 5)11 H -(13. Ne)72 280 Q 2.75(wS)-.275 G 3.536(peci\214cations .)-2.75 F -2.75 -11(........................ 6)11 H(13.1. Display Po)72 293 Q -(wer Management Signaling)-.275 E -2.75 11(.................. 6)9.344 H -(13.2. Extended V)72 306 Q(isual Information)-.66 E -2.75 11 -(..................... 7)10.345 H(13.3. Colormap Utilization Polic)72 -319 Q 13.491(y.)-.165 G -2.75 11(.................... 7)-2.491 H -(14. Easy Resource Con\214guration)72 332 Q -2.75 11 -(...................... 7)3.569 H(15. Xinerama)72 345 Q -2.75 11 -(............................ 8)6.627 H(16. ANSI\214cation)72 358 Q --2.75 11(........................... 8)5.087 H(17. VSW5)72 371 Q -2.75 -11(............................. 8)6.308 H(18. Y)72 384 Q -(ear 2000 \(Y2K\) Compliance)-1.1 E -2.75 11(..................... 8) -13.854 H(19. Memory T)72 397 Q 1.886(esting .)-.77 F -2.75 11 -(......................... 9)11 H(20. Security Considerations)72 410 Q --2.75 11(....................... 9)13.337 H(21. Filing Bug Reports)72 -423 Q -2.75 11(......................... 9)6.902 H(22. Ackno)72 436 Q -1.402(wledgements .)-.275 F -2.75 11(........................ 9)11 H(i) -304.471 769 Q EP -%%Trailer -end -%%EOF Index: xc/RELNOTES.TXT diff -u xc/RELNOTES.TXT:1.2 xc/RELNOTES.TXT:removed --- xc/RELNOTES.TXT:1.2 Sun Oct 4 21:28:01 1998 +++ xc/RELNOTES.TXT Mon Dec 18 14:20:58 2000 @@ -1,677 +0,0 @@ - - - - - - - - - - XX WWiinnddooww SSyysstteemm,, VVeerrssiioonn 1111 - - RReelleeaassee 66..44 - - RReelleeaassee NNootteess - - - - - - - - - The Open Group X Project Team - - 30 January, 1998 - - - - - - - - - - -Copyright (C) 1998 The Open Group - -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, dis- -tribute, sublicense, and/or sell copies of the Software, and to permit -persons to whom the Software is furnished to do so, subject to the fol- -lowing conditions: - -The above copyright notice and the following permission notice shall be -included in all copies 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 MERCHANTABIL- -ITY, FITNESS FOR A PARTICULAR PURPOSE AND NON- INFRINGEMENT. IN NO EVENT -SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABIL- -ITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF, OR IN CONNECTION WITH THE SOFTWARE OR THE USE OF 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 use or other dealings -in this Software without prior written authorization from The Open -Group. - -_X _W_i_n_d_o_w _S_y_s_t_e_m is a trademark of The Open Group. - - - -_1_. _W_h_a_t _I_s _X_1_1 - - -X11, or X, is a vendor-neutral, system-architecture neutral network- -transparent window system and user interface standard. In other words -it's windows for UNIX. But X is not just for UNIX -- X runs on a wide -range of computing and graphics machines including Macintosh, OS/2, -Microsoft's MS-Windows family of operating systems, and almost all of -the so-called Network Computers. X can use your network -- you may run -CPU-intensive programs on high powered workstations and display the user -interface (the windows) on inexpensive desktop machines. - - -_2_. _W_h_a_t _i_s _R_e_l_e_a_s_e _6_._4 - - -Release 6.4 (R6.4) is The Open Group X Project Team's update to the X -Consortium's Release 6.3 (R6.3) of X11 and all prior releases. It is -compatible with with all releases going back to R1 at both the source -and protocol levels. - -The X Consortium was an independent, not-for-profit membership corpora- -tion formed in 1993 as the successor to the MIT X Consortium. It was -dissolved at the end of 1996 and all assets such as trademarks and copy- -rights were transferred to The Open Group. - -The Open Group's X Project Team was formed to continue maintenance and -development of X. Membership in The Open Group X Project Team does not -require membership in The Open Group. To join the X Project Team contact -the sales office near you -- you can find a list of sales offices at -http://www.opengroup.org/contacts/sales.htm, or download the membership -kit from http://www.opengroup.org/tech/desktop/x/projteam.htm. - -Instructions for building and installing R6.4 can be found in the file -INSTALL.PS (PostScript) or INSTALL.TXT (plain text), available sepa- -rately and also contained in the release. - - -_3_. _O_v_e_r_v_i_e_w _o_f _t_h_e _X _P_r_o_j_e_c_t _T_e_a_m _R_e_l_e_a_s_e - - -Like all the releases that preceded it, R6.4 is a source code release. -In order to use the release it is necessary to first unpack the distri- -bution, compile it, and then install it. The source contains the follow- -ing items: - -XX CCoonnssoorrttiiuumm SSttaannddaarrddss aanndd XX PPrroojjeecctt TTeeaamm SSppeecciiffiiccaattiioonnss - The X Consortium produced standards -- documents which define net- - work protocols, programming interfaces, and other aspects of the X - environment. These standards continue to exists in the X Project - Team release. The X Project Team produces specifications. Like X - Consortium Standards, these are documents which define network pro- - tocols, programming interfaces, and other aspects of the X environ- - ment. Under the aegis of The Open Group, X Consortium standards, X - Project Team specifications, and other specifications are the basis - for portions of The Open Group's various CAE Specifications. Some - of the new features in this release are not _s_t_a_n_d_a_r_d, that is, - there is no accompanying specification. - -IImmpplleemmeennttaattiioonnss - For most of X Consortium standards and X Project Team specifica- - tions, a high-quality implementations is provided to demonstrate - proof of concept, to give vendors a base to use, and early adopters - a chance to begin developing using the new features. These are not - _r_e_f_e_r_e_n_c_e implementations -- the written specifications are the - authoritative definition. - -FFoonnttss - A collection of bitmap and outline fonts are included in the dis- - tribution, contributed by various individuals and companies. - -UUttiilliittyy LLiibbrraarriieess - A number of libraries, such as Xmu and the Athena Widget Set, are - included. These are not standards, but are used in building the - applications contained in the release and may be useful in building - other applications. - -PPrrooggrraammss - We also provide a number of application programs. A few of these - programs, such as _x_d_m (or its equivalent), should be considered - essential in almost all environments. The rest of the applications - carry no special status; they are simply programs that have been - developed and/or maintained by X Consortium and X Project Team - staff. In some cases, you will find better substitutes for these - programs contributed by others. - - -_4_. _S_u_p_p_o_r_t_e_d _O_p_e_r_a_t_i_n_g _S_y_s_t_e_m_s - - -This release was built and tested on the following reference platforms: - - - Digital Unix 4.0A - Fujitsu UXP V20L10 - HPUX 10.20 - Solaris 2.5 - - -This release was also built on the following systems: - - - AIX 4.2 - IRIX 6.2 - FreeBSD 2.2.2 - S.u.S.E. Linux 5.0.0 (kernel 2.0.30, libc 5.4.33) - SunOS 4.1.4 - Windows NT 3.51 (NCD WinCenter) - - -In all cases except SunOS we have used the vendor's compiler. On SunOS -we build with the GNU C compiler (_g_c_c). - - -_5_. _S_u_p_p_o_r_t_e_d _G_r_a_p_h_i_c_s _D_e_v_i_c_e_s - - -This release includes the necessary device-dependent support to build a -native X server for the following platforms: - - - HP-UX: Xhp - Digital Unix: Xdec on DECstation 3000/400 (Alpha) with PMAG-B - SunOS/Solaris: Xsun -- see the Xsun man page for supported cards - XFree86: See the XF_* man pages for supported cards - -In addition to the above, the Xvfb and Xnest servers can be built on all -platforms. - -Native X servers are not built on AIX, Fujitsu UXP, IRIX, or Microsoft -Windows NT. - - -_6_. _T_h_e _S_o_u_r_c_e _T_r_e_e - - -The source is distributed in UNIX tar files. The source unpacks from the -tar files into a source tree, and the name of the base directory of the -source tree is xxcc. The name xxcc as the base of the source tree has been -retained from the X Consortium releases. - -The general layout under xxcc// is as follows: - - -config/ imake config files, _i_m_a_k_e, _m_a_k_e_d_e_p_e_n_d, etc. -doc/ all documentation other than per-program manual pages -fonts/ BDF, Speedo, Type1 fonts -include/ common include files -lib/ libraries -nls/ national language support files -programs/ all programs, including the X server and _r_g_b, -util/ _p_a_t_c_h, _c_o_m_p_r_e_s_s, other utilities -bug-report bug reporting template -registry X Registry - - - -_7_. _X _R_e_g_i_s_t_r_y - - -The X Project Team maintains a registry of certain X-related items to -aid in avoiding conflicts and to aid in sharing of such items. The reg- -istry is in the file xxcc//rreeggiissttrryy. - - -_8_. _E_x_t_e_n_s_i_o_n_s _S_u_p_p_o_r_t_e_d - - -Release 6.4 includes source for the following extensions: BIG-REQUESTS, -DOUBLE-BUFFER, DPMS, Extended-Visual-Information, LBX, MIT-SHM, MIT- -SUNDRY-NONSTANDARD, Multi-Buffering, RECORD, SECURITY, SHAPE, SYNC, TOG- -CUP, X3D-PEX, XC-APPGROUP, XC-MISC, XFree86-VidModeExtension, XIE (X -Image Extension), XINERAMA. XInputExtension, XKEYBOARD, XpExtension -(printing), XTEST, and XTestExtension1, - -Not all of these extensions are standard; see the Standards manual page. -Some of these extensions may not be supported on every platform. - - -_9_. _I_m_p_l_e_m_e_n_t_a_t_i_o_n _D_e_p_e_n_d_e_n_t _P_a_r_a_m_e_t_e_r_s - - -Some of the specifications define some behavior as implementation-depen- -dent. Implementations of the X Consortium standards and X Project Team -specifications must document how those parameters are implemented. - -The default values in this release of the implementation dependent -parameters are: - - -XFILESEARCHPATH default: - This default can be set at build time by setting the _i_m_a_k_e vari- - ables XFileSearchPathDefault, XAppLoadDir, XFileSearchPathBase, and - ProjectRoot in xxcc//ccoonnffiigg//ccff//ssiittee..ddeeff. See xxcc//ccoonnffiigg//ccff//RREEAADDMMEE for - instructions and xxcc//ccoonnffiigg//ccff//XX1111..ttmmppll for details of how these - configuration variables are used. - - By default the imake variable ProjectRoot is //uussrr//XX1111RR66..44 and - XFILESEARCHPATH has these components: - - _$_P_r_o_j_e_c_t_R_o_o_t/lib/X11/%L/%T/%N%C%S - _$_P_r_o_j_e_c_t_R_o_o_t/lib/X11/%l/%T/%N%C%S - _$_P_r_o_j_e_c_t_R_o_o_t/lib/X11/%T/%N%C%S - _$_P_r_o_j_e_c_t_R_o_o_t/lib/X11/%L/%T/%N%S - _$_P_r_o_j_e_c_t_R_o_o_t/lib/X11/%l/%T/%N%S - _$_P_r_o_j_e_c_t_R_o_o_t/lib/X11/%T/%N%S - - - -XUSERFILESEARCHPATH default: - If the environment variable XAPPLRESDIR is defined, the default - value of XUSERFILESEARCHPATH has the following components: - - $XAPPLRESDIR/%L/%N%C - $XAPPLRESDIR/%l/%N%C - $XAPPLRESDIR/%N%C - $HOME/%N%C - $XAPPLRESDIR/%L/%N - $XAPPLRESDIR/%l/%N - $XAPPLRESDIR/%N - $HOME/%N - - Otherwise it has these components: - - $HOME/%L/%N%C - $HOME/%l/%N%C - $HOME/%N%C - $HOME/%L/%N - $HOME/%l/%N - $HOME/%N - - - -XKEYSYMDB default: - Defaults to _$_P_r_o_j_e_c_t_R_o_o_t//lliibb//XX1111//XXKKeeyyssyymmDDBB. - - -XCMSDB default: - Defaults to _$_P_r_o_j_e_c_t_R_o_o_t//lliibb//XX1111//XXccmmss..ttxxtt. - - -XLOCALEDIR default: - Defaults to the directory _$_P_r_o_j_e_c_t_R_o_o_t//lliibb//XX1111//llooccaallee. The XLO- - CALEDIR variable can contain multiple colon-separated pathnames. - - -XErrorDB location - The Xlib error database file is _$_P_r_o_j_e_c_t_R_o_o_t//lliibb//XX1111//XXEErrrroorrDDBB. - - -XtErrorDB location - The Xt error database file is _$_P_r_o_j_e_c_t_R_o_o_t//lliibb//XX1111//XXttEErrrroorrDDBB. - - -Supported Locales - Locales supported by this implementation are in xxcc//nnllss//llooccaallee..ddiirr. - The mapping between various system locale names and X locale names - is in xxcc//nnllss//llooccaallee..aalliiaass. Both files are installed in the default - XLOCALEDIR directory, i.e. _$_P_r_o_j_e_c_t_R_o_o_t//lliibb//XX1111//llooccaallee//). - - -Supported Input Methods - This distribution does not include source for any input method - servers; however Xlib supplies a default built-in input method that - supports compose processing in 8-bit locales. Compose files are - provided for Latin-1 and Latin-2. The built-in input method can - support other locales, given suitable compose files. See - xxcc//nnllss//CCoommppoossee//iissoo88885599--** for the supported compositions. - -The Input Method Server Development Kit (IMdkit) is at -ftp://ftp.x.org/pub/unsupported/lib/IMdkit/. - - -_1_0_. _W_h_a_t _I_s _N_e_w _i_n _R_e_l_e_a_s_e _6_._4 - - -This section describes changes in the X Project Team distribution since -Release 6.3. - -The major new functionality in R6.4 is: Display Power Management Signal- -ing (DPMS) to set "green" computer monitors into power saving mode; -Extended Visual Information to allow applications to discover more about -the graphics capabilities of the server than the core protocol allows; -Colormap Utilization Policy (TOG-CUP) allows applications to discover -desktop special colors, e.g. MS-Windows reserved (pre-allocated) colors -on PC-Xservers, and store read-only (sharable) colors in specific loca- -tions in a colormap; and Xinerama, a wide screen server that combines -two or more screens into a single virtual screen. - -The X Toolkit Intrinsics library (libXt) now has IBM's Easy Resource -Configuration support included. - -Xlib (libX11) has two new APIs: XkbSetPerClientControls and XkbGetPer- -ClientControls. These two functions were unintentionally omitted from -the library in previous releases. - -The XFree86 servers are now based on XFree86 3.3.1. - - -_1_1_. _W_h_a_t _i_s _U_n_c_h_a_n_g_e_d _i_n _R_e_l_e_a_s_e _6_._4 - - -As this is an update release, there is a great deal of stability in the -standards, libraries, and clients. No existing standards have changed in -a material way; although some documents have been updated with minor -corrections. The extension library, _l_i_b_X_e_x_t, is updated to include the -DPMS, Extended-Visual-Information, TOG-CUP, and XINERAMA extension -interfaces. All previous interfaces in these and all other libraries are -unchanged. - - -_1_2_. _N_e_w _O_S _S_u_p_p_o_r_t - - -The following table shows the versions of the operating systems that -were used to develop this and prior releases: - - -System R6 R6.1 R6.[23] R6.4 - -AIX 3.2.5 4.1.4 4.2 4.2 -A/UX 3.0.1 - - - -BSD/386 1.0 - - - -Digital Unix (OSF/1) 1.0/1.3 3.2C 4.0A4.0A -FreeBSD - 2.1.0 2.1.6 2.2.2 -Fujitsu UXP - - - V20L10 -HP-UX 9.1 10.01 10.01 10.20 -IRIX 5.2 5.3 6.2 6.2 -Linux (kernel) - Slackware 2.3 - 1.2.11 -- - Slackware 3.1 - - 2.0- - S.u.S.E. 5.0 - - - 2.0.30 -Mach 2.5 - - - -NEWS-OS 6.0 - - - -Solaris 2.3 2.4 2.5 2.5 -SunOS 4.1.3 4.1.3 4.1.4 4.1.4 -Ultrix-32 4.3 4.4 - - -UNICOS 8.0 - - - -Unixware SVR4.2 1.0 2.02 2.02- -Windows NT 3.1 3.5 4.0 3.51 - - - -_1_3_. _N_e_w _S_p_e_c_i_f_i_c_a_t_i_o_n_s - - -The following are the new X Project Team specifications in Release 6.4. -Each is described in its own section below. - - Display Power Management Signalling (DPMS) - Extended Visual Information (EVI) - Colormap Utilization Policy (TOG-CUP) - - - -_1_3_._1_. _D_i_s_p_l_a_y _P_o_w_e_r _M_a_n_a_g_e_m_e_n_t _S_i_g_n_a_l_i_n_g - - -This extension provides X Protocol control over the VESA Display Power -Management Signaling (DPMS) characteristics of video boards under con- -trol of the X Window System. - -Traditionally, the X Window System has provided for both blanking and -non-blanking screen savers. Timeouts associated with these built-in -screen saver mechanisms are limited to idle (dwell) time, and a change -timeout that specifies the change interval for non-blanking screen -savers. - -The United States' Environmental Protection Agency (EPA) Energy Star -program requires that monitors power down after some idle time by -default. While it is possible to simply overload the existing screen -saver timeouts, this solution leaves the non-privileged user little to -no control over the DPMS characteristics of his or her system. For -example, disabling DPMS would require some unintended side effect in the -core screen saver, such as disabling the changing of a non-blanking -screen saver. - - -_1_3_._2_. _E_x_t_e_n_d_e_d _V_i_s_u_a_l _I_n_f_o_r_m_a_t_i_o_n - - -The Extended Visual Information (EVI) extension allows a client to -determine information about core X visuals beyond what the core protocol -provides. - -As the X Window System has evolved, it has become clear that the infor- -mation returned by the core X protocol regarding Visuals is often insuf- -ficient for a client to determine which is the most appropriate visual -for its needs. This extension allows clients to query the X server for -additional visual information, specifically as regards colormaps and -framebuffer levels. - -This extension is meant to address the needs of pure X clients only. It -is specifically and purposefully not designed to address the needs of X -extensions. Extensions that have an impact on visual information should -provide their own mechanisms for delivering that information. For exam- -ple, the Double Buffering Extension (DBE) provides its own mechanism for -determining which visuals support double-buffering. - - -_1_3_._3_. _C_o_l_o_r_m_a_p _U_t_i_l_i_z_a_t_i_o_n _P_o_l_i_c_y - - -This extension has three purposes: a) to provide mechanism for a special -application (a colormap manager) to discover any special colormap -requirements, e.g. the colormap entries that are nominally reserved for -desktop colors in the MS-Windows environment and initialize the default -colormap so that it can be more easily shared; and b) to encourage col- -ormap sharing and reduce colormap flashing on low-end 8-bit frame -buffers by providing a policy for sharing; and c) when colormaps aren't -shared, define a behavior in the X server color allocation scheme to -reduce colormap flashing. - -To encourage colormap sharing and accommodate special colormap require- -ments two new protocols are defined: the first provides a way to query -the server for a list of reserved colormap entries, and the second is a -way to initialize read-only (sharable) colormap entries at specific -locations in a colormap. - -To minimize colormap flashing when the root window's default visual is -one of GrayScale, PseudoColor, or DirectColor, and a private colormap -for the default visual is being used, a minor (but compatible) change to -the server implementation of the AllocColor and AllocNamedColor requests -is required. Where the core protocol says nothing about the pixel values -returned, when this extension is in effect, the AllocColor and Alloc- -NamedColor requests will first look for a matching color in the default -colormap, and, if a match is found and the same cell in the private col- -ormap has not already been allocated, the color will be allocated in the -private colormap at the same location as in the default colormap -(instead of in the first available location.) - - -_1_4_. _E_a_s_y _R_e_s_o_u_r_c_e _C_o_n_f_i_g_u_r_a_t_i_o_n - - -Setting and changing resources in X applications can be difficult for -both the application programmer and the end user. RReessoouurrccee CCoonnffiigguurraa-- -ttiioonn MMaannaaggeemmeenntt ((RRCCMM)) addresses this problem by changing the XX IInnttrriinn-- -ssiiccss to immediately modify a resource for a specified widget and each -child widget in the hierarchy. In this context, immediate means: no -sourcing of a resource file is required; the application does not need -to be restarted for the new resource values to take effect; and the -change occurs immediately. - -The main difference between RRCCMM and the EEddiittrreess protocol is that the RRCCMM -customizing hooks reside in the IInnttrriinnssiiccss and thus are linked with -other toolkits such as Motif and the Athena widgets. However, the -EEddiittRReess protocol requires the application to link with the EEddiittRReess rou- -tines in the Xmu library and Xmu is not used by all applications that -use Motif. - -Easy Resource Configuration is not a standard part of the X Toolkit -Intrinsics (libXt). It is neither an X Consortium standard nor an X Pro- -ject Team specification. - - -_1_5_. _X_i_n_e_r_a_m_a - - -The Xinerama extension provides a way for a multi-headed system to func- -tion as one large screen. Windows can span multiple screens and can move -from one screen to another. - -Currently, the Xinerama Extension works in a homogeneous graphics envi- -ronment. A graphics environment is considered homogeneous if, for exam- -ple, all of the graphics cards have 8 planes with 6 visuals. Mixing a -24-plane graphics card with a 8-plane card creates a heterogeneous envi- -ronment. - -Unlike other multiple screen implementations, Xinerama provides a solu- -tion at the device-independent level. The advantage of this approach is -that it reduces the amount of work involved in supporting and maintain- -ing the extension. The number of graphics devices on the market contin- -ues to grow; embedding the extension functionality into the device -dependent code for each device would be a maintenance nightmare. Since -the Xinerama implementation does not require any low-level graphics mod- -ifications, existing device-dependent code does not have to be recom- -piled. In the loadable server world, the Xinerama Extension will work -with existing device-dependent shared libraries. - -The Xinerama extension is not a standard. It is neither an X Consortium -standard nor an X Project Team specification. - - -_1_6_. _A_N_S_I_f_i_c_a_t_i_o_n - - -R6.1 was officially the last release that supported traditional K&R C. -Like R6.3, R6.4 assumes a Standard C compiler and environment. We have -not intentionally removed any K&R C support from old code, and most of -the release will continue to build on platforms without an ANSI C com- -piler. - - -_1_7_. _V_S_W_5 - - -We have tested this release with VSW5 version 5.0.0. This release passes -all tests in VSW5 with the following exceptions: - -+o tests for which a permanent waiver has been granted. - -+o tests for which a temporary waiver have been granted. - -+o tests where a defect in the test has been identified and reported. - -VSW licensees may obtain a list of waivers granted from -http://www.rdg.opengroup.org/interpretations/database/. - - -_1_8_. _Y_e_a_r _2_0_0_0 _(_Y_2_K_) _C_o_m_p_l_i_a_n_c_e - - -For a statement of compliance see http://www.camb.open- -group.org/tech/desktop/faq/y2k.htm - - -_1_9_. _M_e_m_o_r_y _T_e_s_t_i_n_g - - -Beginning circa X11R5 the MIT X Consortium staff, and later the X Con- -sortium, Inc. staff, and now the X Project Team staff have routinely -tested this implementation for a variety of memory-type errors such as -leaks, array bounds writes, uninitialized memory reads, and a variety of -other errors; using a combination of commercial and "home grown" memory -testing tools. All the real problems were fixed long ago; however we -aren't so naive as to believe that there no remaining bugs. If you find -a memory problem in this implementation please file a bug-report. If you -find a memory problem in your vendor's implementation, tell your vendor. -The popular commercial memory checking tools emit lots of false or spu- -rious warnings, most of which can be safely ignored. - - -_2_0_. _S_e_c_u_r_i_t_y _C_o_n_s_i_d_e_r_a_t_i_o_n_s - - -On UNIX and UNIX-like operating systems there are serious security -implications associated with running suid-root programs. - -By default the xterm terminal emulation program is installed suid-root -in order to be able to update utmp or utmpx entries. All the known (as -of this writing) exploitable security holes in the X libraries have been -eliminated -- making it theoretically safe for xterm to be suid-root. -For additional security you may install xterm without suid-root; however -if you do, xterm will not be able to make utmp or utmpx entries. - -On many Intel-based machines the X server must have root privileges in -order to access the graphics card and open other devices. The easiest -way to grant the requisite privileges is to use xdm to run your X -server. Some people, who prefer not to use xdm, often work around the -need for the X server to run with root privileges by making their X -server a suid-root program. While all the known (as of this writing) -exploitable security holes in the server have been eliminated, the X -Project Team still recommends that you nnoott make your X server suid-root. -There are _s_a_f_e suid-root wrapper programs available (but not in this -release) that you can use to start your server if you don't want to use -xdm. - - -_2_1_. _F_i_l_i_n_g _B_u_g _R_e_p_o_r_t_s - - -If you find a reproducible bug in software built from the source in this -distribution or find bugs in its documentation, please complete a bug- -report using the form in the file xxcc//bbuugg--rreeppoorrtt and send it to The Open -Group X Project Team at - - mailto:xbugs@opengroup.org - - -Please try to provide all of the information requested on the form if it -is applicable; the little extra time you spend on the report will make -it much easier for someone to reproduce, find, and fix the bug. - -Bugs in the contributed software that is available on the net are not -handled on any official basis. Consult the documentation for the indi- -vidual software to see where (if anywhere) to report the bug. - - -_2_2_. _A_c_k_n_o_w_l_e_d_g_e_m_e_n_t_s - - -Release 6.4 of X11 was brought to you by the X Project Team staff at The -Open Group: Arthur Barstow, Kaleb Keithley, Sekhar Makkapati, M.S. -Ramesh, Jingping Ge, Ken Flowers, and Dave Knorr. - -Several companies and individuals have cooperated and worked hard to -make this release a reality, and our thanks go out to them: - -Madeline Asmus of Digital for Xinerama. - -Peter Daifuku of Silicon Graphics for Extended-Visual-Information. - -Scott Revelt of Sun Microsystems for preliminary work on TOG-CUP. - -Rob Lembree, formerly of Digital, for DPMS. - -Jeff Walls of Hewlett Packard. - -Wojtek Jarosz of Attachmate. - -Bob Schulman of Seaweed. - -Brian Bobryk of Digital. - -Tom Brown of NetManage. - -Garry Paxinos of Metro Link. - -Victor Gold of Peritek. - -Jackie Drane of IBM. Index: xc/config/cf/DGUX.cf diff -u xc/config/cf/DGUX.cf:1.4 xc/config/cf/DGUX.cf:1.5 --- xc/config/cf/DGUX.cf:1.4 Tue Dec 29 08:00:46 1998 +++ xc/config/cf/DGUX.cf Fri Jul 7 16:06:56 2000 @@ -1,4 +1,4 @@ -XCOMM platform: $XFree86: xc/config/cf/DGUX.cf,v 1.4 1998/12/29 13:00:46 dawes Exp $ +XCOMM platform: $XFree86: xc/config/cf/DGUX.cf,v 1.5 2000/07/07 20:06:56 tsi Exp $ /* Copyright Takis Psarogiannakopoulos * This is the DG/ux configuration file of X11R6.3 */ @@ -66,9 +66,6 @@ #define HasSockets YES #define BuildServer YES #define HasSharedLibraries YES /* to build shared libs */ -#define HasGcc YES -#define HasGcc2 YES -#define HasGcc2ForCplusplus YES #define HasCplusplus YES #define HasGnuMake YES /* Added for 3.2Xc */ #define UseGnuMalloc YES @@ -91,13 +88,6 @@ #define StandardDefines -DDGUX -DSVR4 -Di386 -D__ix86 -D_DGUX_SOURCE -D_LITTLE_ENDIAN -D_PENTIUM_CHANGE -#ifndef HasGcc2 -#define HasGcc2 YES /* We suppose that your DG/ux has gcc-dg.2.7.2.88 */ -#endif /* Do NOT use native DG/ux gcc, it is faulty in general */ -#ifndef HasGcc -#define HasGcc HasGcc2 -#endif - #define PositionIndependentCFlags -fpic #define PositionIndependentCplusplusFlags -fpic @@ -182,7 +172,7 @@ #endif #ifndef StaticLibrary -#if !HasGcc +#ifndef HasGcc #define StaticLibrary(libpath,libname) -B static Concat(-L,libpath) Concat(-l,libname) -B dynamic #endif #endif Index: xc/config/cf/FreeBSD.cf diff -u xc/config/cf/FreeBSD.cf:3.95 xc/config/cf/FreeBSD.cf:3.101 --- xc/config/cf/FreeBSD.cf:3.95 Fri Jun 23 15:50:58 2000 +++ xc/config/cf/FreeBSD.cf Mon Dec 4 13:49:09 2000 @@ -2,7 +2,7 @@ XCOMM XCOMM XCOMM -XCOMM platform: $XFree86: xc/config/cf/FreeBSD.cf,v 3.95 2000/06/23 19:50:58 dawes Exp $ +XCOMM platform: $XFree86: xc/config/cf/FreeBSD.cf,v 3.101 2000/12/04 18:49:09 dawes Exp $ #ifndef UseElfFormat #define UseElfFormat DefaultToElfFormat @@ -39,10 +39,7 @@ XCOMM operating system: OSName (OSMajorVersion./**/OSMinorVersion./**/OSTeenyVersion) (OsRelVersion) -#define HasGcc YES -#define HasGcc2 YES #define HasCplusplus YES -#define HasGcc2ForCplusplus YES #define GccUsesGas YES #define UseGas YES #define GnuCpp YES @@ -81,6 +78,9 @@ #ifndef LexCmd #define LexCmd flex -l #endif +#ifndef HasFlex +#define HasFlex YES +#endif #define CcCmd cc #define CppCmd /usr/bin/cpp @@ -135,6 +135,16 @@ #endif #endif +/* + * 4.1/i386 and 5.0/i386 have the AGP driver. + */ +#ifndef HasAgpGart +#if defined(i386Architecture) && \ + (OSMajorVersion >= 5 || (OSMajorVersion == 4 && OSMinorVersion >= 1)) +#define HasAgpGart YES +#endif +#endif + /* * This doesn't work the way it does on every other system. On FreeBSD it's * only a "hint, not a demand", whatever that means. Note that this is not @@ -198,6 +208,11 @@ #endif #endif +/* PAM appeared in FreeBSD 3.1 */ +#if (OSMajorVersion > 3) || (OSMajorVersion == 3 && OSMinorVersion >=1 ) +#define HasPam YES +#endif + /* * For FreeBSD 2.2.5 and later don't make any assumptions about the version * of Tcl in the base OS. @@ -494,12 +509,26 @@ #define ServerExtraSysLibs IoLibrary +#ifndef PamLibraries +#define PamLibraries -lpam DlLibrary +#endif + +#ifndef HasCookieMaker +/* Which versions have /dev/urandom? */ +#if OSMajorVersion >= 4 +#define HasCookieMaker YES +#define MkCookieCmd \ + 'dd if=/dev/urandom bs=16 count=1 2>/dev/null | hexdump -e \\"%08x\\"' +#else +#define HasCookieMaker NO +#endif +#endif + /* - * A hack to work around an optimisation problem with the compiler on - * FreeBSD 4.0-current in late 1999/early 2000. + * A hack to work around an optimization problem with gcc 2.95.2 */ #if OSMajorVersion >= 4 -#define FreeBSDGccOptBug +#define GccOptBug295 #endif #include Index: xc/config/cf/Imake.cf diff -u xc/config/cf/Imake.cf:3.58 xc/config/cf/Imake.cf:3.63 --- xc/config/cf/Imake.cf:3.58 Fri Jun 30 13:15:05 2000 +++ xc/config/cf/Imake.cf Mon Nov 6 14:24:00 2000 @@ -17,8 +17,15 @@ * * 4. Create a .cf file with the name given by MacroFile. */ -XCOMM $XFree86: xc/config/cf/Imake.cf,v 3.58 2000/06/30 17:15:05 dawes Exp $ +XCOMM $XFree86: xc/config/cf/Imake.cf,v 3.63 2000/11/06 19:24:00 dawes Exp $ +#if defined(__APPLE__) +# undef __APPLE__ +# define MacroIncludeFile +# define MacroFile darwin.cf +# define DarwinArchitecture +#endif + #if defined(clipper) || defined(__clipper__) # undef clipper # define MacroIncludeFile @@ -26,6 +33,16 @@ # define IngrArchitecture #endif /* clipper */ +#ifdef __CYGWIN__ +#define MacroIncludeFile +#define MacroFile cygwin.cf +#define cygwinArchitecture +#define i386Architecture +#undef i386 +#undef __i386__ +#undef _X86_ +#endif /* CYGWIN */ + #ifdef ultrix # define MacroIncludeFile # define MacroFile ultrix.cf @@ -123,6 +140,10 @@ # endif # undef mc68000 # endif +# ifdef __powerpc__ +# define PpcArchitecture +# undef __powerpc__ +# endif #endif /* OpenBSD */ #ifdef __NetBSD__ @@ -159,6 +180,10 @@ # define VaxArchitecture # undef __vax__ # endif +# ifdef __powerpc__ +# define PpcArchitecture +# undef __powerpc__ +# endif #endif /* NetBSD */ #ifdef __FreeBSD__ @@ -570,19 +595,100 @@ # undef linux # define LinuxArchitecture # ifdef i386 -# define i386Architecture +# ifndef i386Architecture +# define i386Architecture +# endif # undef i386 XCOMM Keep cpp from replacing path elements containing i486/i586/i686 -# undef i486 -# undef i586 -# undef i686 -# endif /* i386 */ +# ifdef i486 +# ifndef i386Architecture +# define i386Architecture +# endif +# undef i486 +# endif +# ifdef i586 +# ifndef i386Architecture +# define i386Architecture +# endif +# undef i586 +# endif +# ifdef i686 +# ifndef i386Architecture +# define i386Architecture +# endif +# undef i686 +# endif +# ifdef k6 +# ifndef i386Architecture +# define i386Architecture +# endif +# undef k6 +# endif +# endif /* k6 */ # ifdef __i386__ # ifndef i386Architecture # define i386Architecture # endif # undef __i386__ # endif /* __i386__ */ +# ifdef __i486__ +# ifndef i386Architecture +# define i386Architecture +# endif +# undef __i486__ +# endif /* __i486__ */ +# ifdef __i586__ +# ifndef i386Architecture +# define i386Architecture +# endif +# undef __i586__ +# endif /* __i586__ */ +# ifdef __i686__ +# ifndef i386Architecture +# define i386Architecture +# endif +# undef __i686__ +# endif /* __i686__ */ +# ifdef __k6__ +# ifndef i386Architecture +# define i386Architecture +# endif +# undef __k6__ +# endif /* __k6__ */ +# ifdef __i386 +# ifndef i386Architecture +# define i386Architecture +# endif +# undef __i386 +# endif /* __i386 */ +# ifdef __i486 +# ifndef i386Architecture +# define i386Architecture +# endif +# undef __i486 +# endif /* __i486 */ +# ifdef __i586 +# ifndef i386Architecture +# define i386Architecture +# endif +# undef __i586 +# endif /* __i586 */ +# ifdef __i686 +# ifndef i386Architecture +# define i386Architecture +# endif +# undef __i686 +# endif /* __i686 */ +# ifdef __k6 +# ifndef i386Architecture +# define i386Architecture +# endif +# undef __k6 +# endif /* __k6 */ +# ifdef __s390__ +# define s390Architecture +# undef __s390__ +# endif /* s390 */ # ifdef __alpha # define AlphaArchitecture # undef __alpha @@ -593,6 +699,12 @@ # endif # undef __alpha__ # endif /* __alpha__ */ +# ifdef __arm__ +# define Arm32Architecture +# undef arm +# undef __arm +# undef __arm__ +# endif # ifdef mc68000 # define Mc68020Architecture # undef mc68000 @@ -632,7 +744,7 @@ # undef mips # undef __mips__ # endif -/* for compatibility with 3.3.x */ +XCOMM for compatibility with 3.3.x # ifdef PpcArchitecture # define PowerPCArchitecture # endif Index: xc/config/cf/Imake.rules diff -u xc/config/cf/Imake.rules:3.76 xc/config/cf/Imake.rules:3.86 --- xc/config/cf/Imake.rules:3.76 Thu Jun 15 16:49:55 2000 +++ xc/config/cf/Imake.rules Tue Dec 12 12:05:30 2000 @@ -5,7 +5,7 @@ XCOMM XCOMM XCOMM -XCOMM rules: $XFree86: xc/config/cf/Imake.rules,v 3.76 2000/06/15 20:49:55 dawes Exp $ +XCOMM rules: $XFree86: xc/config/cf/Imake.rules,v 3.86 2000/12/12 17:05:30 dawes Exp $ /* * MACHINE-INDEPENDENT RULES; DO NOT MODIFY @@ -319,6 +319,10 @@ #define RunProgramWithSetup(setup,progvar,options) setup $(progvar) options #endif +#ifndef RunPerlScript +#define RunPerlScript(script,options) $(PERL) $(PERLOPTS) script options +#endif + #ifndef RemoveFile #define RemoveFile(file) $(RM) file #endif /* RemoveFile */ @@ -538,6 +542,7 @@ all:: $(BUILDBINDIR)/binary binary @@\ @@\ $(BUILDBINDIR)/binary: binary @@\ + MakeDir($(BUILDBINDIR)) @@\ RemoveFile($@) @@\ cd $(BUILDBINDIR) && $(LN) $(BUILDBINTOP)/$(CURRENT_DIR)/binary . #endif /* LinkBuildBinary */ @@ -1297,12 +1302,12 @@ @@\ dest.suffix.html: file.man RmanCmdDependency @@\ RemoveFiles(dest.suffix.html dest.suffix-html) @@\ - RunProgram(RMAN,$(RMANOPTIONS) < file.man > dest.suffix-html) &&\ @@\ + RunProgram(RMAN,$(RMANOPTIONS) < file.man > dest.suffix-html) && \ @@\ $(MV) dest.suffix-html $@ @@\ @@\ install.man:: dest.suffix.html @@\ MakeDir($(DESTDIR)$(DOCHTMLDIR)) @@\ - @(SUF=`expr dest.suffix.html \: '.*\.\(.\).*\.'`; \ @@\ + @(SUF=`expr suffix \: '\(.\)'`; \ @@\ set -x; \ @@\ $(INSTALL) $(INSTALLFLAGS) $(INSTMANFLAGS) dest.suffix.html $(DESTDIR)$(DOCHTMLDIR)/dest.$$SUF.html) @@\ @@\ @@ -1317,10 +1322,11 @@ #if BuildHtmlManPages #define InstallHtmlManPageAliases(file,aliases,suffix) @@\ install.man:: file.suffix.html @@\ - @for i in aliases; do (set -x; \ @@\ - RemoveFile($(DESTDIR)$(DOCHTMLDIR)/$$i.suffix.html); \ @@\ + @SUF=`expr suffix \: '\(.\)'`; \ @@\ + for i in aliases; do (set -x; \ @@\ + RemoveFile($(DESTDIR)$(DOCHTMLDIR)/$$i.$$SUF.html); \ @@\ (cd $(DESTDIR)$(DOCHTMLDIR); \ @@\ - $(LN) file.suffix.html $$i.suffix.html)); \ @@\ + $(LN) file.$$SUF.html $$i.$$SUF.html)); \ @@\ done #else #define InstallHtmlManPageAliases(file,aliases,suffix) /**/ @@ -1584,7 +1590,7 @@ sed -e 's:^.::' -e 's:[^/.][^/]*:..:'g`; \ @@\ cd Concat($(DESTDIR),opath); \ @@\ if [ -f lfile -a ! -h lfile ]; then \ @@\ - cp -p lfile Concat($(DESTDIR),npath/cfile; \ @@\ + cp -p lfile Concat($(DESTDIR),npath/cfile); \ @@\ fi; \ @@\ $(RM) -r lfile; \ @@\ $(LN) Concat($${RELPATH},npath/cfile) lfile; \ @@\ @@ -2180,6 +2186,24 @@ RemoveFile(dst.c) #endif /* ObjectFromSpecialSource */ +#ifndef SwitchYYPrefix +#define SwitchYYPrefix(in,out,prefix) \ + sed 's/yy/prefix/g' in > out && RemoveFile(in) +#endif + +#ifndef LexFilePrefix +#define LexFilePrefix(file,prefix) @@\ +file.c: file.l @@\ + ClearmakeOSName \ + $(LEX) $(LFLAGS) file.l @@\ + SwitchYYPrefix(lex.yy.c,file.c,prefix) @@\ + @@\ +depend:: file.c @@\ + @@\ +clean:: @@\ + RemoveFiles(lex.yy.c file.c) +#endif + #ifndef LexFileExplicit #if HasClearmake /* provide a place to hang ClearmakeOSName */ #define LexFileExplicit(file) @@\ @@ -2215,6 +2239,38 @@ RemoveFile(file) #endif /* M4File */ +#ifndef YaccFilePrefix +#if HasGnuMake +#define YaccFilePrefix(file,flags,prefix) @@\ +depend:: file.c @@\ + @@\ +file.h: file.c @@\ + @@\ +file.c: file.y @@\ + ClearmakeOSName \ + $(YACC) flags file.y @@\ + SwitchYYPrefix(y.tab.c,file.c,prefix) @@\ + @if [ -f y.tab.h ]; then set -x; SwitchYYPrefix(y.tab.h,file.h,prefix); \@@\ + else exit 0; fi @@\ + @@\ +clean:: @@\ + RemoveFiles(y.tab.c y.tab.h file.h file.c) +#else +#define YaccFilePrefix(file,flags,prefix) @@\ +depend:: file.c @@\ + @@\ +file.h file.c: file.y @@\ + ClearmakeOSName \ + $(YACC) flags file.y @@\ + SwitchYYPrefix(y.tab.c,file.c,prefix) @@\ + @if [ -f y.tab.h ]; then set -x; SwitchYYPrefix(y.tab.h,file.h,prefix); \ @@\ + else exit 0; fi @@\ + @@\ +clean:: @@\ + RemoveFiles(y.tab.c y.tab.h file.h file.c) +#endif +#endif /* YaccFile */ + #ifndef YaccFile #if HasGnuMake #define YaccFile(file,flags) @@\ @@ -3117,6 +3173,7 @@ #ifndef LibraryModuleTarget #if MakeDllModules #define LibraryModuleTarget(module,objects) @@\ +NormalLibraryTarget(module, objects) @@\ DynamicModuleTarget(Concat3(lib,module,.so), objects) #else #define LibraryModuleTarget(module, objects) @@\ @@ -3130,6 +3187,7 @@ #ifndef DepLibraryModuleTarget #if MakeDllModules #define DepLibraryModuleTarget(module,deplist,objects) @@\ +NormalDepLibraryTarget(module, deplist, objects) @@\ DepDynamicModuleTarget(Concat3(lib,module,.so), deplist, objects) #else #define DepLibraryModuleTarget(module,deplist,objects) @@\ @@ -3146,7 +3204,7 @@ @@\ module: modlist @@\ RemoveFile($@) @@\ - $(LD) -o $@ $(SHLIBLDFLAGS) modlist @@\ + $(CC) -o $@ $(SHLIBLDFLAGS) modlist @@\ @@\ clean:: @@\ RemoveFile(module) @@ -3161,7 +3219,7 @@ @@\ module: deplist @@\ RemoveFile($@) @@\ - $(LD) -o $@ $(SHLIBLDFLAGS) modlist @@\ + $(CC) -o $@ $(SHLIBLDFLAGS) modlist @@\ @@\ clean:: @@\ RemoveFile(module) @@ -3242,3 +3300,4 @@ #ifndef BuildObjectFromLibrary #define BuildObjectFromLibrary(libname,objname) BuildObjectFromLibraryWithPath(.,libname,objname) #endif + Index: xc/config/cf/Imake.tmpl diff -u xc/config/cf/Imake.tmpl:3.81 xc/config/cf/Imake.tmpl:3.87 --- xc/config/cf/Imake.tmpl:3.81 Sun Jun 25 16:17:28 2000 +++ xc/config/cf/Imake.tmpl Sat Dec 2 14:06:57 2000 @@ -5,7 +5,7 @@ XCOMM XCOMM XCOMM -XCOMM $XFree86: xc/config/cf/Imake.tmpl,v 3.81 2000/06/25 20:17:28 dawes Exp $ +XCOMM $XFree86: xc/config/cf/Imake.tmpl,v 3.87 2000/12/02 19:06:57 herrb Exp $ XCOMM ---------------------------------------------------------------------- /* @@ -186,6 +186,18 @@ #define HasSymLinks YES #endif +#ifndef HasPerl +#define HasPerl YES +#endif + +#ifndef PerlCmd +#define PerlCmd perl +#endif + +#ifndef PerlOptions +#define PerlOptions /**/ +#endif + #ifndef BuildRman #define BuildRman YES #endif @@ -219,6 +231,10 @@ #define BuildHtmlManPages NO #endif +#ifndef HasCookieMaker +#define HasCookieMaker NO +#endif + #include #ifndef HasSharedLibraries @@ -336,6 +352,12 @@ #ifndef HasFchown #define HasFchown YES #endif +#ifndef HasPam +#define HasPam NO +#endif +#ifndef HasPamMisc +#define HasPamMisc NO +#endif /* byte-order defaults */ #ifndef ByteOrder #if defined(VaxArchitecture) @@ -493,6 +515,14 @@ #endif #endif GLIDE3INCDIR = Glide3IncDir +#ifndef Glide3LibName +#if HasGlide3 +#define Glide3LibName glide3 +#else +#define Glide3LibName +#endif +#endif +GLIDE3LIBNAME = Glide3LibName #ifndef HasTk #define HasTk NO #endif @@ -609,13 +639,16 @@ #define AlternateUsrLibDir YES #endif #endif -#ifndef VarLibDir +#ifndef VarDirectory #ifdef ProjectVar -#define VarLibDir Concat(ProjectVar,/lib) +#define VarDirectory ProjectVar #else -#define VarLibDir /var/lib +#define VarDirectory /var #endif #endif +#ifndef VarLibDir +#define VarLibDir $(VARDIR)/lib +#endif /* * SystemUsrLibDir is independent of ProjectRoot. It is used primarily @@ -708,7 +741,7 @@ #ifndef LogDirectory #if HasVarDirectory -#define LogDirectory /var/log +#define LogDirectory $(VARDIR)/log #else #define LogDirectory /usr/adm #endif @@ -720,7 +753,7 @@ #ifndef VarRunDirectory #if HasVarRun -#define VarRunDirectory /var/run +#define VarRunDirectory $(VARDIR)/run #endif #endif @@ -730,7 +763,7 @@ #ifndef VarDbDirectory #if HasVarDb -#define VarDbDirectory /var/db +#define VarDbDirectory $(VARDIR)/db #endif #endif @@ -912,6 +945,9 @@ #ifndef AsCmd #define AsCmd as #endif +#ifndef AsmDefines +#define AsmDefines /**/ +#endif #ifndef CompressCmd #define CompressCmd compress #endif @@ -959,6 +995,9 @@ #ifndef LexLib #define LexLib -ll #endif +#ifndef HasFlex +#define HasFlex NO +#endif #ifndef YaccCmd #define YaccCmd yacc #endif @@ -1341,6 +1380,7 @@ INCROOT = IncRoot /* base of where to put header files */ USRLIBDIR = UsrLibDir /* nonshared libraries */ + VARDIR = VarDirectory /* usually /var */ VARLIBDIR = VarLibDir /* xdm runtime files */ SYSTEMUSRLIBDIR = SystemUsrLibDir /* system's "/usr/lib" */ SYSTEMUSRINCDIR = SystemUsrIncDir /* system's "/usr/include" */ @@ -1413,6 +1453,8 @@ RANLIBINSTFLAGS = RanlibInstFlags #endif RM = RmCmd + PERL = PerlCmd + PERLOPTS = PerlOptions MANSUFFIX = ManSuffix /* suffix for command man pages */ LIBMANSUFFIX = LibManSuffix /* suffix for library man pages */ FILEMANSUFFIX = FileManSuffix /* suffix for file format man pages */ Index: xc/config/cf/Imakefile diff -u xc/config/cf/Imakefile:3.22 xc/config/cf/Imakefile:3.24 --- xc/config/cf/Imakefile:3.22 Thu Jan 20 21:29:34 2000 +++ xc/config/cf/Imakefile Wed Nov 1 21:51:06 2000 @@ -1,5 +1,5 @@ XCOMM $XConsortium: Imakefile /main/38 1996/11/07 14:43:46 kaleb $ -XCOMM $XFree86: xc/config/cf/Imakefile,v 3.22 2000/01/21 02:29:34 dawes Exp $ +XCOMM $XFree86: xc/config/cf/Imakefile,v 3.24 2000/11/02 02:51:06 dawes Exp $ XCOMM Some compilers generate fatal errors if an -L directory does XCOMM not exist. Since BUILDLIBDIR may not exist yet suppress its use. @@ -23,6 +23,7 @@ RULEFILES = \ Imake.rules \ Motif.rules \ +cygwin.rules \ Win32.rules \ X11.rules \ bsdLib.rules \ @@ -55,6 +56,7 @@ Server.tmpl \ ServerLib.tmpl \ Threads.tmpl \ +cygwin.tmpl \ WinLib.tmpl \ X11.tmpl \ bsdLib.tmpl \ @@ -82,6 +84,7 @@ NetBSD.cf \ OpenBSD.cf \ Oki.cf \ +cygwin.cf \ Win32.cf \ apollo.cf \ bsd.cf \ @@ -119,6 +122,7 @@ lynx.cf \ x386.cf \ QNX4.cf \ +darwin.cf \ xfree86.cf INSTFILES = $(RULEFILES) $(TMPLFILES) $(DEFFILES) $(CFFILES) $(LOCALFILES) Index: xc/config/cf/NetBSD.cf diff -u xc/config/cf/NetBSD.cf:3.83 xc/config/cf/NetBSD.cf:3.87 --- xc/config/cf/NetBSD.cf:3.83 Tue Jun 13 20:16:02 2000 +++ xc/config/cf/NetBSD.cf Sun Dec 3 11:14:08 2000 @@ -2,7 +2,7 @@ -XCOMM platform: $XFree86: xc/config/cf/NetBSD.cf,v 3.83 2000/06/14 00:16:02 dawes Exp $ +XCOMM platform: $XFree86: xc/config/cf/NetBSD.cf,v 3.87 2000/12/03 16:14:08 herrb Exp $ #ifndef OSName @@ -72,15 +72,21 @@ #define HasVarRun YES #define HasVarDb YES +/* Defines for using the GNU pth thread library -- experimental */ + +#ifdef NetBSDPth +#define PthreadHLocation -I/usr/local/include /* where is pthread.h? */ +#define LibPthreadLocation -L/usr/local/lib /* where is libpthread? */ +#define HasThreadSafeAPI NO +#define HasPosixThreads YES +#define SystemMTDefines -D_REENTRANT PthreadHLocation +#define ThreadsLibraries LibPthreadLocation -Wl,-rpath,/usr/local/lib -lpthread +#define SharedX11Reqs ThreadsLibraries +#endif + /* * Compiler Features */ -#undef HasGcc -#define HasGcc YES -#define HasGcc2 YES -#ifndef HasGcc2ForCplusplus -#define HasGcc2ForCplusplus YES -#endif #define GccUsesGas YES #define UseGas YES #define GnuCpp YES @@ -242,13 +248,23 @@ #define AdmDir /var/log +#define HasFlex YES + +/* + * NetBSD doesn't have perl in default system + * you may override this in host.def if you installed perl from the packages + */ +#ifndef HasPerl +#define HasPerl NO +#endif + /* * Make & install Features */ #define HasBsdMake YES #define CompressAllFonts YES #define GzipFontCompression YES -#define DefaultUserPath /bin:/usr/bin:/usr/local/bin:$(BINDIR) +#define DefaultUserPath /bin:/usr/bin:/usr/pkg/bin:/usr/local/bin:$(BINDIR) #define DefaultSystemPath /sbin:/usr/sbin:/bin:/usr/bin:$(BINDIR) #ifdef InstallCmd @@ -290,6 +306,16 @@ # endif #endif /* i386Architecture */ +#ifndef HasCookieMaker +# if OSMajorVersion == 1 && OSMinorVersion >= 5 || OSMajorVersion >= 2 + /* NetBSD 1.5 and later have /dev/urandom */ +# define HasCookieMaker YES +# define MkCookieCmd \ + 'dd if=/dev/urandom bs=16 count=1 2>/dev/null | hexdump -e \\"%08x\\"' +# else +# define HasCookieMaker NO +# endif +#endif /* * ForceSubdirs - force make to build subdirectories Index: xc/config/cf/OpenBSD.cf diff -u xc/config/cf/OpenBSD.cf:3.37 xc/config/cf/OpenBSD.cf:3.44 --- xc/config/cf/OpenBSD.cf:3.37 Sat Jun 24 13:43:44 2000 +++ xc/config/cf/OpenBSD.cf Sat Dec 2 15:15:03 2000 @@ -1,4 +1,4 @@ -XCOMM platform: $XFree86: xc/config/cf/OpenBSD.cf,v 3.37 2000/06/24 17:43:44 dawes Exp $ +XCOMM platform: $XFree86: xc/config/cf/OpenBSD.cf,v 3.44 2000/12/02 20:15:03 herrb Exp $ XCOMM #ifndef OSName @@ -19,6 +19,22 @@ #endif XCOMM operating system: OSName (OSMajorVersion./**/OSMinorVersion./**/OSTeenyVersion) +#ifdef Ports + +#define BinDir /usr/local/bin +#define UsrLibDir /usr/local/lib +#define ManDirectoryRoot /usr/local/man +#define LdPreLib -L/usr/X11R6/lib -L/usr/local/lib +#define XpmLibDir /usr/X11R6/lib +#define XpmIncDir /usr/X11R6/include +#define ConfigDir /usr/X11R6/lib/X11/config +#define IncRoot /usr/local/include +#define TopXInclude -I/usr/X11R6/include +#define ImakeCmd imake -DPorts +#define DocDir /usr/local/share/doc + +#endif + /* * C library features */ @@ -39,7 +55,11 @@ #define HasKrbIV YES #endif #define HasDlopen YES -#define DlLibrary /**/ +#ifndef PpcArchitecture +# define DlLibrary /**/ +#else +# define DlLibrary -ldl +#endif #define HasUsableFileMmap YES #define HasNCurses YES @@ -59,7 +79,7 @@ /* * Multi-thread safe libs */ -#if OSMajorVersion == 2 && OSMinorVersion >= 6 || OSMajorVersion >= 3 +#if !defined(PpcArchitecture) && (OSMajorVersion == 2 && OSMinorVersion >= 6 || OSMajorVersion >= 3) # define HasPosixThreads YES # define ThreadedX YES # define SystemMTDefines -D_REENTRANT @@ -69,23 +89,17 @@ # define BuildThreadStubLibrary YES # define NeedUIThrStubs YES # define ThreadsCompileFlags -pthread -# define ThreadsLibraries -lc_r +# define ThreadsLibraries -lc_r # endif #endif #if OSMajorVersion == 2 && OSMinorVersion > 6 || OSMajorVersion >= 3 -# define HasThreadSafeAPI YES +# define HasThreadSafeAPI YES #endif /* * Compiler Features */ -#undef HasGcc -#define HasGcc YES -#define HasGcc2 YES -#ifndef HasGcc2ForCplusplus -#define HasGcc2ForCplusplus YES -#endif #define GccUsesGas YES #define UseGas YES #define GnuCpp YES @@ -110,52 +124,70 @@ #if defined(UseInstalled) #define DefaultCCOptions /**/ #else -#define DefaultCCOptions -ansi -Dasm=__asm GccWarningOptions +# ifdef PpcArchitecture +# define DefaultCCOptions -ansi -fsigned-char -Dasm=__asm GccWarningOptions +# else +# define DefaultCCOptions -ansi -Dasm=__asm GccWarningOptions +# endif #endif #define GccGasOption -DGCCUSESGAS #define AsmDefines -DUSE_GAS #ifdef i386Architecture -# ifndef DefaultGcc2i386Opt -# if (OSMajorVersion == 2 && OSMinorVersion >= 3) || OSMajorVersion > 2 - /* The GCC strength-reduce bug is fixed for OpenBSD 2.3 and later */ -# define DefaultGcc2i386Opt -O2 +# ifndef DefaultGcc2i386Opt +# if (OSMajorVersion == 2 && OSMinorVersion >= 3) || OSMajorVersion > 2 + /* The GCC strength-reduce bug is fixed for OpenBSD 2.3 and later */ +# define DefaultGcc2i386Opt -O2 +# endif # endif -# endif -# define OptimizedCDebugFlags DefaultGcc2i386Opt -# define ServerOSDefines XFree86ServerOSDefines -DDDXTIME -# define ServerExtraSysLibs -li386 -# define LdPostLib /**/ -#else -# define OptimizedCDebugFlags -O2 -# if defined(SparcArchitecture) || defined(AlphaArchitecture) +# define OptimizedCDebugFlags DefaultGcc2i386Opt +# define ServerOSDefines XFree86ServerOSDefines -DDDXTIME +# define ServerExtraSysLibs -li386 +# define LdPostLib /**/ +# define ServerExtraDefines GccGasOption XFree86ServerDefines +# ifndef XFree86ConsoleDefines +# define XFree86ConsoleDefines -DPCCONS_SUPPORT -DPCVT_SUPPORT +# endif +#endif + +#ifdef SparcArchitecture +# define OptimizedCDebugFlags -O2 # define ServerOSDefines -DDDXOSINIT -# else -# define ServerOSDefines /**/ -# endif +# define ServerExtraDefines XFree86ServerDefines +#endif + +#ifdef AlphaArchitecture +# define OptimizedCDebugFlags -O2 +# define ServerOSDefines -DDDXOSINIT +# define ServerExtraDefines GccGasOption -D_XSERVER64 #endif -#if defined(i386Architecture) || defined(ArcArchitecture) -# define ServerExtraDefines GccGasOption XFree86ServerDefines -# ifndef XFree86ConsoleDefines -# if defined(ArcArchitecture) -# define XFree86ConsoleDefines -DPCCONS_SUPPORT -# else -# define XFree86ConsoleDefines -DPCCONS_SUPPORT -DPCVT_SUPPORT + +#ifdef ArcArchitecture +# define ServerExtraDefines GccGasOption XFree86ServerDefines +# ifndef XFree86ConsoleDefines +# define XFree86ConsoleDefines -DPCCONS_SUPPORT # endif -# endif -#else -# if defined(SparcArchitecture) -# define ServerExtraDefines XFree86ServerDefines -# else -# if defined(AlphaArchitecture) -# define ServerExtraDefines GccGasOption -D_XSERVER64 -# else -# define ServerExtraDefines GccGasOption +#endif + +#ifdef PpcArchitecture +# define OptimizedCDebugFlags -O2 +# define ServerOSDefines XFree86ServerOSDefines -DDDXTIME -DDDXOSINIT +# define ServerExtraDefines GccGasOption XFree86ServerDefines +# define XkbServerDefines -DXKB_ALWAYS_USES_SOFT_REPEAT +# ifndef XFree86ConsoleDefines +# define XFree86ConsoleDefines -DWSCONS_SUPPORT # endif -# endif +#endif /* Ppc */ + +#ifndef ServerOSDefines +# define ServerOSDefines /**/ #endif +#ifndef ServerExtraDefines +# define ServerExtraDefines GccGasOption +#endif + #define StandardDefines -DCSRG_BASED #define XawI18nDefines -DUSE_XWCHAR_STRING -DUSE_XMBTOWC @@ -166,6 +198,8 @@ #define AdmDir /var/log +#define HasFlex YES + /* * Make & install Features */ @@ -205,7 +239,13 @@ #endif #endif +#ifndef HasCookieMaker +# define HasCookieMaker YES +# define MkCookieCmd \ + 'dd if=/dev/urandom bs=16 count=1 2>/dev/null | hexdump -e \\"%08x\\"' +#endif + /* * Man pages need to be formatted when installed, so override the default * imake rules. @@ -308,6 +348,14 @@ #endif /* InstallFontAliasesNoComment */ /* + * OpenBSD specific Imake Config files + */ +#ifndef LocalConfigFiles +#define LocalConfigFiles \ + OpenBSDLib.rules +#endif + +/* * Architecture specific sections - put all architecture dependent * options and setting here into the correct section */ @@ -381,11 +429,10 @@ # endif /* - * A hack to work around an optimisation problem with the compiler on - * OpenBSD 2.6-current in late 1999/early 2000. + * A hack to work around an optimization problem with gcc 2.95.2 */ # if OSMajorVersion == 2 && OSMinorVersion >= 6 -# define FreeBSDGccOptBug +# define GccOptBug295 # endif # include @@ -482,13 +529,13 @@ # define ServerExtraDefines GccGasOption -Dmc68000 -Dmc68020 # ifndef Xsun24Server -# define Xsun24Server YES +# define Xsun24Server NO # endif # ifndef XsunServer # define XsunServer YES # endif # ifndef XsunMonoServer -# define XsunMonoServer YES +# define XsunMonoServer NO # endif #define XkbServerDefines -DXKB_ALWAYS_USES_SOFT_REPEAT @@ -557,17 +604,34 @@ */ #ifdef PpcArchitecture -/* #define GccWarningOptions -Wall -Wpointer-artith */ +# define UseElfFormat YES -# include -# ifndef BuildServer -# define BuildServer NO -# endif +# if XFree86Devel +# define GccWarningOptions -Wall -Wpointer-arith -Wstrict-prototypes \ + -Wmissing-prototypes -Wmissing-declarations \ + -Wnested-externs +# else +# define GccWarningOptions -Wall -Wpointer-arith +# endif -# define HasSharedLibraries NO -# define UseElfFormat YES -# define BuildDynamicLoading NO +# if OSMajorVersion > 2 || (OSMajorVersion == 2 && OSMinorVersion >= 8) +# ifndef DoLoadableServer +# define DoLoadableServer YES +# endif +# define DevelDrivers cirrus ati + /* Support for USB Mices */ +# define UsbMouseSupport YES +# include +# else /* 2.7 and earlier */ +# include +# ifndef BuildServer +# define BuildServer YES +# endif + +# define HasSharedLibraries NO +# define BuildDynamicLoading NO +# endif #endif /* PpcArchitecture */ /* @@ -576,13 +640,13 @@ #ifdef SparcArchitecture # ifndef Xsun24Server -# define Xsun24Server YES +# define Xsun24Server NO # endif # ifndef XsunServer # define XsunServer YES # endif # ifndef XsunMonoServer -# define XsunMonoServer YES +# define XsunMonoServer NO # endif #define XkbServerDefines -DXKB_ALWAYS_USES_SOFT_REPEAT @@ -657,5 +721,8 @@ #endif /* This must come last */ -#include - +#if OSMajorVersion == 2 && OSMinorVersion >= 8 || OSMajorVersion > 2 +# include +#else +# include +#endif Index: xc/config/cf/OpenBSDLib.rules diff -u /dev/null xc/config/cf/OpenBSDLib.rules:1.1 --- /dev/null Mon Dec 18 14:20:59 2000 +++ xc/config/cf/OpenBSDLib.rules Mon Nov 6 14:24:00 2000 @@ -0,0 +1,162 @@ +XCOMM $OpenBSD: OpenBSDLib.rules,v 1.1 2000/10/09 20:43:58 matthieu Exp $ + + + + +/* + * OpenBSD shared library rules + */ + +XCOMM $XFree86: xc/config/cf/OpenBSDLib.rules,v 1.1 2000/11/06 19:24:00 dawes Exp $ + +#ifndef UseElfFormat +#define UseElfFormat NO +#endif + +#ifndef HasSharedLibraries +#define HasSharedLibraries YES +#endif +#ifndef ForceNormalLib +#define ForceNormalLib YES +#endif + +#ifndef BaseShLibReqs +#define BaseShLibReqs /* -lc implied by $(CC) */ +#endif + +#ifndef SharedDataSeparation +#define SharedDataSeparation NO +#endif +#ifndef SharedCodeDef +#define SharedCodeDef /**/ +#endif +#ifndef SharedLibraryDef +#define SharedLibraryDef /**/ +#endif +#ifndef ShLibIncludeFile +#define ShLibIncludeFile +#endif +#ifndef SharedLibraryLoadFlags +#define SharedLibraryLoadFlags -shared PositionIndependentCFlags -Wl,-rpath,$(USRLIBDIR) +#endif +#ifndef PositionIndependentCFlags +#define PositionIndependentCFlags -fPIC +#endif +#ifndef PositionIndependentCplusplusFlags +#define PositionIndependentCplusplusFlags -fPIC +#endif +#if UseElfFormat +#ifndef ExtraLoadFlags +#ifdef UseInstalled +#define ExtraLoadFlags -Wl,-rpath,$(USRLIBDIRPATH) +#else +#define ExtraLoadFlags -Wl,-rpath,$(USRLIBDIRPATH) -Wl,-rpath-link,$(BUILDLIBDIR) +#endif +#endif +#endif +/* + * InstallSharedLibrary - generate rules to install the shared library. + * NOTE: file must be executable, hence "INSTBINFLAGS" + */ +#ifndef InstallSharedLibrary +#define InstallSharedLibrary(libname,rev,dest) @@\ +install:: Concat(lib,libname.so.rev) @@\ + MakeDir($(DESTDIR)dest) @@\ + $(INSTALL) $(INSTALLFLAGS) $(INSTBINFLAGS) Concat(lib,libname.so.rev) $(DESTDIR)dest +#endif /* InstallSharedLibrary */ + +/* + * InstallSharedLibraryData - generate rules to install the shared library data + */ +#ifndef InstallSharedLibraryData +#define InstallSharedLibraryData(libname,rev,dest) +#endif /* InstallSharedLibraryData */ + + +/* + * SharedLibraryTarget - generate rules to create a shared library; + * build it into a different name so that we do not hose people by having + * the library gone for long periods. + */ +#ifndef SharedLibraryTarget +#ifdef UseInstalled +#define LinkBuildSonameLibrary(lib) true +#else +#define LinkBuildSonameLibrary(lib) (RemoveFile($(BUILDLIBDIR)/lib); \ + cd $(BUILDLIBDIR); $(LN) $(BUILDINCTOP)/$(CURRENT_DIR)/lib .) +#endif + +#define SharedLibraryTarget(libname,rev,solist,down,up) @@\ +AllTarget(Concat(lib,libname.so.rev)) @@\ + @@\ +Concat(lib,libname.so.rev): solist @@\ + $(RM) $@~ @@\ + set -x; \ @@\ + (cd down; $(CC) -o up/$@~ $(SHLIBLDFLAGS) -Wl,-soname,$@\ @@\ + solist $(REQUIREDLIBS) BaseShLibReqs); @@\ + LinkBuildSonameLibrary($@) @@\ + $(RM) $@ @@\ + $(MV) $@~ $@ @@\ + @@\ +clean:: @@\ + $(RM) Concat(lib,libname.so.rev) + +#endif /* SharedLibraryTarget */ + + +/* + * SharedDepLibraryTarget - generate rules to create a shared library. + */ +#ifndef SharedDepLibraryTarget +#define SharedDepLibraryTarget(libname,rev,deplist,solist,down,up) @@\ +AllTarget(Concat(lib,libname.so.rev)) @@\ + @@\ +Concat(lib,libname.so.rev): deplist $(EXTRALIBRARYDEPS) @@\ + $(RM) $@~ @@\ + (cd down; $(CC) -o up/$@~ $(SHLIBLDFLAGS) solist $(REQUIREDLIBS)) @@\ + $(RM) $@ @@\ + $(MV) $@~ $@ @@\ + LinkBuildLibrary($@) @@\ + @@\ +clean:: @@\ + $(RM) Concat(lib,libname.so.rev) + +#endif /* SharedDepLibraryTarget */ + +#ifndef SharedDepModuleTarget +#define SharedDepModuleTarget(name,deps,solist) @@\ +AllTarget(name) @@\ + @@\ +name: deps @@\ + $(RM) $@~ @@\ + $(CC) -o $@~ $(SHLIBLDFLAGS) solist $(REQUIREDLIBS) @@\ + $(RM) $@ @@\ + $(MV) $@~ $@ @@\ + @@\ +clean:: @@\ + $(RM) name + +#endif /* SharedDepModuleTarget */ + +/* + * SharedLibraryDataTarget - generate rules to create shlib data file; + */ +#ifndef SharedLibraryDataTarget +#define SharedLibraryDataTarget(libname,rev,salist) +#endif /* SharedLibraryTarget */ + +/* + * DynamicModuleTarget - build a module to be dynamically loaded + */ +#ifdef DynamicModuleTarget +#undef DynamicModuleTarget +#define DynamicModuleTarget(module,modlist) @@\ +AllTarget(module) @@\ + @@\ +module: modlist @@\ + RemoveFile($@) @@\ + $(CC) -o $@ $(SHLIBLDFLAGS) modlist @@\ + @@\ +clean:: @@\ + RemoveFile(module) +#endif /* DynamicModuleTarget */ Index: xc/config/cf/QNX4.cf diff -u xc/config/cf/QNX4.cf:1.2 xc/config/cf/QNX4.cf:1.3 --- xc/config/cf/QNX4.cf:1.2 Thu Jan 20 21:29:34 2000 +++ xc/config/cf/QNX4.cf Fri Jul 7 16:06:56 2000 @@ -1,4 +1,4 @@ -XCOMM platform: $XFree86: xc/config/cf/QNX4.cf,v 1.2 2000/01/21 02:29:34 dawes Exp $ +XCOMM platform: $XFree86: xc/config/cf/QNX4.cf,v 1.3 2000/07/07 20:06:56 tsi Exp $ #define StripInstalledPrograms NO #define BuildServer YES @@ -30,8 +30,6 @@ #define OSDefines -DQNX4 -DQNX -D__QNX__ -DNO_REGEX -DSTRINGS_ALIGNED -D__i386__ #define SourceDefines -D_POSIX_SOURCE -#define HasGcc NO -#define HasGcc2 NO #define DoRanlibCmd NO #undef ArCmd #define ArCmd wlib -b -c -p=256 Index: xc/config/cf/README diff -u xc/config/cf/README:1.11 xc/config/cf/README:1.12 --- xc/config/cf/README:1.11 Tue Jun 13 20:16:02 2000 +++ xc/config/cf/README Sat Dec 2 14:06:57 2000 @@ -3,7 +3,7 @@ -$XFree86: xc/config/cf/README,v 1.11 2000/06/14 00:16:02 dawes Exp $ +$XFree86: xc/config/cf/README,v 1.12 2000/12/02 19:06:57 herrb Exp $ The easiest way to write an Imakefile is to find another one that does something similar and copy/modify it! @@ -58,6 +58,7 @@ HasCenterLineCplusplus boolean for system has CenterLine C++ compiler HasClearmake use Clearcase's clearmake make program? HasCodeCenter boolean for system has CodeCenter + HasCookieMaker boolean for system has xauth cookie generator HasCplusplus system has a C++ compiler? HasDECnet system has DECnet? HasFortran boolean for system has Fortran compiler @@ -119,6 +120,7 @@ Malloc0ReturnsNull boolean for malloc(0) == NULL Malloc0ReturnsNullDefines -D's to build libX11/libXt MathLibrary library for programs using C math functions + MkCookieCmd command to generate an xauth cookie MsMacros macro flag for TroffCmd, normally "-ms" MvCmd command to rename a file NdbmDefines -D's to turn on use of ndbm routines Index: xc/config/cf/TinyX.cf diff -u /dev/null xc/config/cf/TinyX.cf:1.1 --- /dev/null Mon Dec 18 14:20:59 2000 +++ xc/config/cf/TinyX.cf Fri Dec 8 17:09:32 2000 @@ -0,0 +1,22 @@ +/* $XFree86: xc/config/cf/TinyX.cf,v 1.1 2000/12/08 22:09:32 keithp Exp $ */ +/* + * This configuration file contains additional configuration needed + * to compile a (nearly) minimal X server using the kdrive infrastructure + * To use this, add the following to host.def: + #define KDriveXServer YES + #define TinyXServer YES + */ + + +#define BuildLBX NO +#define BuildFonts NO +#define BuildAppgroup NO +#define BuildDBE NO +#define BuildXCSecurity NO +#define FontServerAccess NO +#undef BuildXF86RushExt +#define BuildXF86RushExt NO +#undef BuildRender +#define BuildRender YES +#define UseRgbTxt YES +#define BuildFontServer NO Index: xc/config/cf/X11.rules diff -u xc/config/cf/X11.rules:1.4 xc/config/cf/X11.rules:1.5 --- xc/config/cf/X11.rules:1.4 Tue Sep 9 07:56:20 1997 +++ xc/config/cf/X11.rules Mon Nov 6 14:24:00 2000 @@ -1,7 +1,7 @@ XCOMM $TOG: X11.rules /main/4 1997/04/30 15:23:24 kaleb $ -XCOMM $XFree86: xc/config/cf/X11.rules,v 1.4 1997/09/09 11:56:20 hohndel Exp $ +XCOMM $XFree86: xc/config/cf/X11.rules,v 1.5 2000/11/06 19:24:00 dawes Exp $ /* Note whether we are the top level project. */ #ifndef SeenTopLevelProject @@ -67,14 +67,18 @@ #endif #define LdPostLibs LdPostLib XLdPostLibs -#if ImportX11 -# define TopXInclude -I$(TOP)/imports/x11/include -#elif !UseInstalledX11 -# define TopXInclude -I$(TOP)/exports/include -#elif defined(X11ProjectRoot) -# define TopXInclude -I$(XPROJECTROOT)/include +#ifndef TopXInclude +# if ImportX11 +# define TopXInclude -I$(TOP)/imports/x11/include +# elif !UseInstalledX11 +# define TopXInclude -I$(TOP)/exports/include #else -# define TopXInclude /**/ +# ifdef X11ProjectRoot +# define TopXInclude -I$(XPROJECTROOT)/include +# else +# define TopXInclude /**/ +# endif +# endif #endif #ifdef TopIncludes # undef TopIncludes Index: xc/config/cf/X11.tmpl diff -u xc/config/cf/X11.tmpl:1.71 xc/config/cf/X11.tmpl:1.93 --- xc/config/cf/X11.tmpl:1.71 Sun Jun 25 16:17:28 2000 +++ xc/config/cf/X11.tmpl Fri Dec 15 13:18:04 2000 @@ -5,7 +5,7 @@ XCOMM XCOMM XCOMM -XCOMM $XFree86: xc/config/cf/X11.tmpl,v 1.71 2000/06/25 20:17:28 dawes Exp $ +XCOMM $XFree86: xc/config/cf/X11.tmpl,v 1.93 2000/12/15 18:18:04 keithp Exp $ /*************************************************************************** * * @@ -52,6 +52,9 @@ #ifndef BuildFontServer #define BuildFontServer YES #endif +#ifndef XserverStaticFontLib +#define XserverStaticFontLib YES +#endif #ifndef BuildSpeedo #define BuildSpeedo YES #endif @@ -274,12 +277,6 @@ #ifndef BuildXvLibrary #define BuildXvLibrary BuildXvExt #endif -#ifndef BuildXantiExt -#define BuildXantiExt NO -#endif -#ifndef BuildXantiLibrary -#define BuildXantiLibrary BuildXantiExt -#endif #ifndef BuildGlxExt #define BuildGlxExt NO #endif @@ -304,6 +301,15 @@ #ifndef BuildPSResLibrary #define BuildPSResLibrary BuildDPSLibraries #endif +#ifndef BuildRender +#define BuildRender NO +#endif +#ifndef BuildRenderLibrary +#define BuildRenderLibrary YES +#endif +#ifndef BuildXftLibrary +#define BuildXftLibrary BuildRenderLibrary +#endif #ifndef BuildMiscDocs #define BuildMiscDocs NO @@ -315,6 +321,18 @@ #define BuildAllSpecsDocs NO #endif +#ifndef InstallHardcopyDocs +#define InstallHardcopyDocs NO +#endif + +#ifndef InstallMiscManPages +#define InstallMiscManPages NO +#endif + +#ifndef FSUseSyslog +#define FSUseSyslog NO +#endif + #ifndef InstallLibManPages #define InstallLibManPages YES #endif @@ -526,6 +544,12 @@ #define GlxDefines /**/ #endif #endif +#ifndef MesaSrcDir +#define MesaSrcDir $(TOP)/extras/Mesa +#endif +#ifndef OglSampleSrcDir +#define OglSampleSrcDir $(TOP)/extras/ogl-sample +#endif #ifndef ShmDefines #if HasShm #define ShmDefines -DMITSHM @@ -666,14 +690,6 @@ #endif #endif -#ifndef XantiExtensionDefines -#if BuildXantiExt -#define XantiExtensionDefines -DXANTI -#else -#define XantiExtensionDefines /**/ -#endif -#endif - #ifndef RECORDDefines #if BuildRECORD #define RECORDDefines -DXRECORD @@ -722,6 +738,14 @@ #endif #endif +#ifndef RenderDefines +#if BuildRender +#define RenderDefines -DRENDER +#else +#define RenderDefines /**/ +#endif +#endif + #ifndef FontCacheExtentionDefines #if BuildFontCache #define FontCacheExtensionDefines -DFONTCACHE @@ -739,7 +763,7 @@ XCSecurityDefines CupDefines PervasiveDBEDefines \ XF86BigfontExtensionDefines DPMSDefines \ LowMemDefines XprintDefines XineramaDefines \ - SitePervasiveExtensionDefines + SitePervasiveExtensionDefines RenderDefines #endif #ifndef SiteExtensionDefines #define SiteExtensionDefines /**/ @@ -750,7 +774,7 @@ XCMiscDefines RECORDDefines \ PexDefines ShmDefines XieDefines BigReqDefines VidModeExtensionDefines \ XF86MiscExtensionDefines DBEDefines DPMSDefines EVIDefines \ - ScreenSaverExtensionDefines XvExtensionDefines XantiExtensionDefines \ + ScreenSaverExtensionDefines XvExtensionDefines \ GlxDefines FontCacheExtensionDefines SiteExtensionDefines #endif #define ExtensionDefines BaseExtensionDefines ExtensionOSDefines @@ -833,6 +857,31 @@ #define PexCCOptions DefaultCCOptions #endif #endif + +#ifndef MesaUseMMX +#ifdef HasMMXSupport +#define MesaUseMMX HasMMXSupport +#else +#define MesaUseMMX NO +#endif +#endif + +#ifndef MesaUse3DNow +#ifdef Has3DNowSupport +#define MesaUse3DNow Has3DNowSupport +#else +#define MesaUse3DNow NO +#endif +#endif + +#ifndef MesaUseKatmai +#ifdef HasKatmaiSupport +#define MesaUseKatmai HasKatmaiSupport +#else +#define MesaUseKatmai NO +#endif +#endif + #ifndef DefaultFSConfigFile #define DefaultFSConfigFile $(LIBDIR)/fs/config #endif @@ -1012,9 +1061,6 @@ #ifndef XPrintDir #define XPrintDir ServerConfigDir #endif -#ifndef VarDirectory -#define VarDirectory /var/X11 -#endif #ifndef EtcX11Directory #define EtcX11Directory /etc/X11 #endif @@ -1116,9 +1162,6 @@ MODULEDIR = ModuleDir TOP_X_INCLUDES = TopXInclude -#ifdef VarDirectory - VARDIR = VarDirectory -#endif #ifdef EtcX11Directory ETCX11DIR = EtcX11Directory #endif @@ -1153,11 +1196,17 @@ FONTC = $(BINDIR)/bdftopcf MKFONTDIR = $(BINDIR)/mkfontdir MKHTMLINDEX = $(BINDIR)/mkhtmlindex + UCS2ANY = $(BINDIR)/ucs2any.pl + BDFTRUNCATE = $(BINDIR)/bdftruncate.pl + UCSMAPPREFIX = $(FONTDIR)/util/map- #else RGB = $(CLIENTENVSETUP) $(XBUILDBINDIR)/rgb FONTC = $(CLIENTENVSETUP) $(XBUILDBINDIR)/bdftopcf MKFONTDIR = $(CLIENTENVSETUP) $(XBUILDBINDIR)/mkfontdir MKHTMLINDEX = $(SHELL) $(CONFIGSRC)/util/mkhtmlindex.sh + UCS2ANY = $(FONTSRC)/util/ucs2any.pl + BDFTRUNCATE = $(FONTSRC)/util/bdftruncate.pl + UCSMAPPREFIX = $(FONTSRC)/util/map- #endif HTMLINDEXCMD = HtmlIndexCmd @@ -1185,6 +1234,8 @@ EXTINCSRC = $(XTOP)/include/extensions FTSOURCEDIR = FreeTypeSrcDir XTTSOURCEDIR = XTrueTypeSrcDir + MESASRCDIR = MesaSrcDir + OGLSAMPLESRCDIR = OglSampleSrcDir PSWRAPSRC = $(XTOP)/config/pswrap TRANSCOMMSRC = $(LIBSRC)/xtrans TRANS_INCLUDES = -I$(TRANSCOMMSRC) @@ -1235,7 +1286,7 @@ XLIBSRC = $(LIBSRC)/X11 #if SharedLibX11 #ifndef SharedX11Rev -#define SharedX11Rev 6.1 +#define SharedX11Rev 6.2 #endif SharedLibReferences(XONLY,X11,$(XLIBSRC),SOXLIBREV,SharedX11Rev) #else @@ -1418,18 +1469,18 @@ #endif #endif -#if BuildXantiLibrary -#ifndef SharedLibXanti -#define SharedLibXanti NO +#if BuildRenderLibrary +#ifndef SharedLibXrender +#define SharedLibXrender HasSharedLibraries #endif -#ifndef NormalLibXanti -#define NormalLibXanti YES +#ifndef NormalLibXrender +#define NormalLibXrender YES #endif -#ifndef DebugLibXanti -#define DebugLibXanti NO +#ifndef DebugLibXrender +#define DebugLibXrender NO #endif -#ifndef ProfileLibXanti -#define ProfileLibXanti NO +#ifndef ProfileLibXrender +#define ProfileLibXrender NO #endif #endif @@ -1460,7 +1511,25 @@ #undef LinkGLToUsrInclude #define LinkGLToUsrInclude NO #endif +/* + * Don't make a shared GLw library because is would depend on Motif. + */ +#ifndef SharedLibGLw +#define SharedLibGLw NO /* HasSharedLibraries */ +#endif +#ifndef NormalLibGLw +#define NormalLibGLw YES /* (!SharedLibGLw | ForceNormalLib) */ #endif +#ifndef DebugLibGLw +#define DebugLibGLw NO /* debugged widget library */ +#endif +#ifndef ProfileLibGLw +#define ProfileLibGLw NO /* profiled widget library */ +#endif +#ifndef GLwUseXmStubs +#define GLwUseXmStubs NO /* create stub (weak) Motif symbols */ +#endif +#endif /* BuildGLXLibrary */ #ifndef SharedLibXext #define SharedLibXext HasSharedLibraries @@ -1622,18 +1691,6 @@ #endif #endif -#if BuildXantiLibrary - XANTILIBSRC = $(LIBSRC)/Xanti -#if SharedLibXanti -#ifndef SharedXantiRev -#define SharedXantiRev 1.0 -#endif -SharedLibReferences(XANTI,Xanti,$(XANTILIBSRC),SOXANTIREV,SharedXantiRev) -#else -ProjectUnsharedLibReferences(XANTI,Xanti,$(XANTILIBSRC),XBuildLibDir) -#endif -#endif - #if BuildGLXLibrary GLXLIBSRC = $(LIBSRC)/GL #if SharedLibGlx @@ -1644,9 +1701,28 @@ #else ProjectUnsharedLibReferences(GLX,GL,$(GLXLIBSRC),XBuildLibDir) #endif + GLWIDGETSRC = $(LIBSRC)/GLw +#if SharedLibGLw +#ifndef SharedGLwRev +#define SharedGLwRev 1.0 /* used to name the shared library */ #endif - +SharedDSLibReferences(GLW,GLw,$(GLWIDGETSRC),SOGLWREV,SharedGLwRev) +#else +ProjectUnsharedLibReferences(GLW,GLw,$(GLWIDGETSRC),XBuildLibDir) +#endif +#endif /* BuildGLXLibrary */ +#if BuildRenderLibrary + XRENDERLIBSRC = $(LIBSRC)/Xrender +#if SharedLibXrender +#ifndef SharedXrenderRev +#define SharedXrenderRev 1.0 +#endif +SharedLibReferences(XRENDER,Xrender,$(XRENDERLIBSRC),SOXRENDERREV,SharedXrenderRev) +#else +ProjectUnsharedLibReferences(XRENDER,Xrender,$(XRENDERLIBSRC),XBuildLibDir) +#endif +#endif #if BuildFontCacheLib # ifndef SharedLibXfontcache @@ -1731,7 +1807,7 @@ XMUSRC = $(LIBSRC)/Xmu #if SharedLibXmu #ifndef SharedXmuRev -#define SharedXmuRev 6.1 +#define SharedXmuRev 6.2 #endif SharedDSLibReferences(XMU,Xmu,$(XMUSRC),SOXMUREV,SharedXmuRev) #else @@ -2078,7 +2154,7 @@ #define SharedLibFont HasSharedLibraries #endif #ifndef NormalLibFont -#define NormalLibFont (!SharedLibFont | ForceNormalLib) +#define NormalLibFont (!SharedLibFont | ForceNormalLib | XserverStaticFontLib) #endif #ifndef DebugLibFont #define DebugLibFont NO /* debugged Font library */ @@ -2125,6 +2201,53 @@ ProjectUnsharedLibReferences(XPM,Xpm,$(XPMLIBSRC),XBuildLibDir) #endif +#ifndef SharedLibXft +#define SharedLibXft HasSharedLibraries +#endif +#ifndef NormalLibXft +#define NormalLibXft (!SharedLibXft | ForceNormalLib) +#endif +#ifndef DebugLibXft +#define DebugLibXft NO +#endif +#ifndef ProfileLibXft +#define ProfileLibXft NO +#endif + XFTLIBSRC = $(LIBSRC)/Xft +#if SharedLibXft +#ifndef SharedXftRev +#define SharedXftRev 1.0 +#endif +SharedLibReferences(XFT,Xft,$(XFTLIBSRC),SOXFTREV,SharedXftRev) +#else +ProjectUnsharedLibReferences(XFT,Xft,$(XFTLIBSRC),XBuildLibDir) +#endif + +#ifdef Freetype2Dir +#ifndef Freetype2LibDir +#define Freetype2LibDir Freetype2Dir/lib +#endif + +#ifndef Freetype2IncDir +#define Freetype2IncDir Freetype2Dir/include/freetype2 +#endif + +FREETYPE2DIR = Freetype2Dir +FREETYPE2LIBDIR = Freetype2LibDir +FREETYPE2INCDIR = Freetype2IncDir +FREETYPE2INCLUDES = -I$(FREETYPE2INCDIR) +FREETYPE2LIB = -L$(FREETYPE2LIBDIR) -lfreetype +FREETYPE2DEFINES = -DFREETYPE2 + +#endif + +#ifndef XftClientDepLibs +#define XftClientDepLibs $(DEPXFTLIB) $(DEPXRENDERLIB) +#endif +#ifndef XftClientLibs +#define XftClientLibs $(XFTLIB) $(FREETYPE2LIB) $(XRENDERLIB) +#endif + #ifndef LdLibraryPath #define LdLibraryPath LD_LIBRARY_PATH #endif @@ -2243,7 +2366,7 @@ all:: fonts.dir @@\ @@\ fonts.dir: deplist @@\ - RunProgram(MKFONTDIR,.) @@\ + RunProgram(MKFONTDIR, $(MKFONTDIROPTS) .) @@\ @@\ clean:: @@\ RemoveFile(fonts.dir) @@ -2292,6 +2415,11 @@ InstallTarget(install,fonts.alias,$(INSTDATFLAGS),dest) #endif /* InstallFontAliases */ +#ifndef InstallNamedFontAliases +#define InstallNamedFontAliases(src,dest) @@\ +InstallNamedTarget(install,src,$(INSTDATFLAGS),dest,fonts.alias) +#endif /* InstallNamedFontAliases */ + #ifndef FontSrc #define FontSrc(basename) basename.bdf #endif @@ -2309,13 +2437,13 @@ #endif /* InstallFontScale */ /* - * UncompressedFontTarget + * UncompressedFontTargetLong */ -#ifndef UncompressedFontTarget -#define UncompressedFontTarget(basename) @@\ -FontBaseObj(basename): FontSrc(basename) @@\ +#ifndef UncompressedFontTargetLong +#define UncompressedFontTargetLong(sname,tname) @@\ +FontBaseObj(tname): FontSrc(sname) @@\ RunProgram(FONTC,$(FONTCFLAGS) $? -o $@) -#endif /* UncompressedFontTarget */ +#endif /* UncompressedFontTargetLong */ /* * CompressedFontTarget @@ -2324,20 +2452,32 @@ #define GzipFontCompression NO #endif -#ifndef CompressedFontTarget +#ifndef CompressedFontTargetLong #if GzipFontCompression -#define CompressedFontTarget(basename) @@\ -FontBaseObj(basename).gz: FontSrc(basename) @@\ +#define CompressedFontTargetLong(sname,tname) @@\ +FontBaseObj(tname).gz: FontSrc(sname) @@\ RunProgram(FONTC,$(FONTCFLAGS) $?) | $(GZIPCMD) > $@ #else -#define CompressedFontTarget(basename) @@\ -FontBaseObj(basename).Z: FontSrc(basename) @@\ +#define CompressedFontTargetLong(sname,tname) @@\ +FontBaseObj(tname).Z: FontSrc(sname) @@\ RunProgram(FONTC,$(FONTCFLAGS) $?) | $(COMPRESS) > $@ #endif +#endif /* CompressedFontTargetLong */ + +/* + * UncompressedFontTarget + */ +#ifndef UncompressedFontTarget +#define UncompressedFontTarget(basename) UncompressedFontTargetLong(basename,basename) +#endif /* UncompressedFontTarget */ + +#ifndef CompressedFontTarget +#define CompressedFontTarget(basename) CompressedFontTargetLong(basename,basename) #endif /* CompressedFontTarget */ #if !defined(FontTarget) && !defined(FontObj) #if CompressAllFonts +#define FontTargetLong(sname,tname) CompressedFontTargetLong(sname,tname) #define FontTarget(basename) CompressedFontTarget(basename) #if GzipFontCompression #define FontObj(basename) FontBaseObj(basename).gz @@ -2345,11 +2485,13 @@ #define FontObj(basename) FontBaseObj(basename).Z #endif #else +#define FontTargetLong(sname,tname) UncompressedFontTargetLong(sname,tname) #define FontTarget(basename) UncompressedFontTarget(basename) #define FontObj(basename) FontBaseObj(basename) #endif /* CompressAllFonts */ #endif + #ifndef EncObj #define EncObj(basename) basename.enc #endif @@ -2419,6 +2561,35 @@ #endif +#ifndef MakeBdfFontFromUCSMaster +#if HasPerl +#define MakeBdfFontFromUCSMaster(font,enc) @@\ +includes:: font-enc.bdf @@\ + @@\ +font-enc.bdf: font.bdf $(UCS2ANY) @@\ + RemoveFile($@) @@\ + RunPerlScript($(UCS2ANY),font.bdf $(UCSMAPPREFIX)enc enc) @@\ + @@\ +clean:: @@\ + RemoveFile(font-enc.bdf) +#endif +#endif + +#ifndef MakeTruncatedUCSBdfFont +#if HasPerl +#define MakeTruncatedUCSBdfFont(font,trunc,name) @@\ +includes:: name.bdf @@\ + @@\ +name.bdf: font.bdf $(BDFTRUNCATE) @@\ + RemoveFile($@) @@\ + RunPerlScript($(BDFTRUNCATE),trunc < font.bdf > name.bdf) @@\ + @@\ +clean:: @@\ + RemoveFile(name.bdf) +#endif +#endif + + /* * MakeXkbDir */ @@ -2547,5 +2718,21 @@ #ifndef InstallRoffDoc #define InstallRoffDoc(name) InstallDoc(name,name.PS name.txt) +#endif + +#ifndef InstallHardcopyDoc +#define InstallHardcopyDoc(name,deps) @@\ +all:: deps @@\ + @if [ -f name.PS.gz ]; then set -x; \ @@\ + RemoveFile(name.PS); \ @@\ + gzip -d < name.PS.gz > name.PS; \ @@\ + fi @@\ + @@\ +clean:: @@\ + @if [ -f name.PS.gz ]; then set -x; \ @@\ + RemoveFile(name.PS); \ @@\ + fi @@\ + @@\ +InstallDoc(name,deps) #endif Index: xc/config/cf/bsdLib.tmpl diff -u xc/config/cf/bsdLib.tmpl:3.5 xc/config/cf/bsdLib.tmpl:3.6 --- xc/config/cf/bsdLib.tmpl:3.5 Sun Jun 6 08:13:22 1999 +++ xc/config/cf/bsdLib.tmpl Mon Aug 28 11:29:08 2000 @@ -1,5 +1,5 @@ XCOMM $XConsortium: bsdLib.tmpl /main/3 1996/09/28 16:09:25 rws $ -XCOMM $XFree86: xc/config/cf/bsdLib.tmpl,v 3.5 1999/06/06 12:13:22 dawes Exp $ +XCOMM $XFree86: xc/config/cf/bsdLib.tmpl,v 3.6 2000/08/28 15:29:08 dawes Exp $ /* * NetBSD/FreeBSD/OpenBSD shared library template @@ -42,7 +42,10 @@ #define CplusplusLibC #define FrescoSysLibs CplusplusLibC MathLibrary +/* Allow for libpthread, as overridden by OS definitions */ +#if !defined(SharedX11Reqs) #define SharedX11Reqs +#endif #define SharedOldXReqs $(LDPRELIB) $(XLIBONLY) #define SharedXtReqs $(LDPRELIB) $(XLIBONLY) $(SMLIB) $(ICELIB) #define SharedXawReqs $(LDPRELIB) $(XMULIB) $(XTOOLLIB) $(XPMLIB) $(XLIB) Index: xc/config/cf/bsdi.cf diff -u xc/config/cf/bsdi.cf:3.30 xc/config/cf/bsdi.cf:3.32 --- xc/config/cf/bsdi.cf:3.30 Fri Jun 30 13:15:05 2000 +++ xc/config/cf/bsdi.cf Tue Oct 24 18:45:00 2000 @@ -1,5 +1,5 @@ XCOMM platform: $XConsortium: bsdi.cf /main/22 1996/09/28 16:09:30 rws $ -XCOMM platform: $XFree86: xc/config/cf/bsdi.cf,v 3.30 2000/06/30 17:15:05 dawes Exp $ +XCOMM platform: $XFree86: xc/config/cf/bsdi.cf,v 3.32 2000/10/24 22:45:00 dawes Exp $ #ifndef OSName #define OSName DefaultOSName @@ -87,6 +87,13 @@ # define OptimizedCDebugFlags -O #endif +/* + * A hack to work around an optimization problem with GCC 2.95.2 + */ +#if (OSMajorVersion == 4 && OSMinorVersion == 2) +#define GccOptBug295 +#endif + #define CppCmd /usr/bin/cpp #define TroffCmd groff -Tps #define MkdirHierCmd mkdir -p @@ -96,6 +103,8 @@ #define HasWChar32 YES #define DirFailPrefix - #define AvoidNullMakeCommand YES +#define HasVarRun YES +#define HasVarDb YES # ifndef GccUsesGas # define GccUsesGas YES @@ -114,6 +123,20 @@ # define GccGasOption /**/ #endif +/* + * Build a threaded X server on 4.1 and newer systems + */ +#if (OSMajorVersion == 4 && OSMinorVersion >= 1) || (OSMajorVersion > 4) +#define HasPosixThreads YES /* this will autodefine HasThreadedX */ +#define HasThreadSafeAPI YES +XCOMM math.h uses _REENTRANT in FreeBSD, so we define it here too +#define SystemMTDefines -D_REENTRANT -D_THREAD_SAFE +/* + * Heck, build a server that can load modules too... + */ +#define DoLoadableServer YES +#endif + #ifdef i386Architecture #ifndef BuildXF86DRI #define BuildXF86DRI NO @@ -160,7 +183,11 @@ #define LdPreLib -L$(BUILDLIBDIR) -L$(USRLIBDIR) #endif +#if OSMajorVersion >= 4 #define StandardDefines -D__ELF__ -DCSRG_BASED +#else +#define StandardDefines -DCSRG_BASED +#endif #define InstallCmd /usr/bin/install #define EqnCmd eqn -Tps Index: xc/config/cf/cross.def diff -u /dev/null xc/config/cf/cross.def:1.1 --- /dev/null Mon Dec 18 14:21:00 2000 +++ xc/config/cf/cross.def Fri Dec 8 17:09:34 2000 @@ -0,0 +1,39 @@ +/* $XFree86: xc/config/cf/cross.def,v 1.1 2000/12/08 22:09:34 keithp Exp $ */ +/* + * This file contains redefinitions of some symbols to enable + * cross compilation: e.g. paths for include files and paths to + * compiler images. It will have to be edited to reflect these + * given your local configuration. + */ +#undef i386Architecture +#define Arm32Architecture + +#undef OptimizedCDebugFlags +#define OptimizedCDebugFlags -O2 +#define ServerCDebugFlags -O2 +#undef StandardDefines +#define StandardDefines -Dlinux -D__arm__ -D_POSIX_SOURCE \ + -D_BSD_SOURCE -D_GNU_SOURCE -DX_LOCALE +#undef CcCmd +#define StdIncDir /skiff/local/arm-linux/include +#define PreIncDir +#undef PostIncDir +#define PostIncDir /skiff/local/lib/gcc-lib/arm-linux/2.95.2/include +#define CcCmd /skiff/local/bin/arm-linux-gcc +#define DoRanlibCmd YES +#define RanlibCmd /skiff/local/bin/arm-linux-ranlib +#undef ExtraLoadFlags +#define ExtraLoadFlags +#define FbNoPixelAddrCode +#undef TermcapLibrary +#define TermcapLibrary -ltermcap + +#undef LdPostLib +#define LdPostLib -L/skiff/local/arm-linux/lib + +#undef ExtensionOSDefines +#define ExtensionOSDefines + +#define ServerXdmcpDefines /**/ + +#include Index: xc/config/cf/cross.rules diff -u /dev/null xc/config/cf/cross.rules:1.2 --- /dev/null Mon Dec 18 14:21:00 2000 +++ xc/config/cf/cross.rules Fri Dec 8 22:33:18 2000 @@ -0,0 +1,52 @@ +XCOMM $XFree86: xc/config/cf/cross.rules,v 1.2 2000/12/09 03:33:18 dawes Exp $ + +#define HostLinkRule(target, flags, src, libs) cc -I$(BUILDINCDIR) -o target src + +/* ComplexHostProgramTarget - Compile a program such that we can run + * it on this host, i.e., don't use the default cross compiler. + */ +#ifndef ComplexHostProgramTarget +#define ComplexHostProgramTarget(program) @@\ + CC=cc @@\ + STD_INCLUDES= @@\ + CFLAGS=$(TOP_INCLUDES) $(INCLUDES) $(BOOTSTRAPCFLAGS) @@\ +EXTRA_LOAD_FLAGS= @@\ + PROGRAM = program @@\ + @@\ +AllTarget(program) @@\ + @@\ +program: $(OBJS) $(DEPLIBS) @@\ + RemoveTargetProgram($@) @@\ + HostLinkRule($@,$(_NOOP_),$(OBJS),$(DEPLIBS) $(LOCAL_LIBRARIES)) @@\ + @@\ +DependTarget() @@\ + @@\ +LintTarget() @@\ + @@\ +clean:: @@\ + RemoveFile(ProgramTargetName(program)) +#endif /* ComplexHostProgramTarget */ + +#ifndef SimpleHostProgramTarget +#define SimpleHostProgramTarget(program) @@\ + SRCS = program.c @@\ + @@\ + CC=cc @@\ + STD_INCLUDES= @@\ + CFLAGS=$(TOP_INCLUDES) $(INCLUDES) $(BOOTSTRAPCFLAGS) @@\ +EXTRA_LOAD_FLAGS= @@\ + PROGRAM = program @@\ + @@\ +AllTarget(program) @@\ + @@\ +program: program.o $(DEPLIBS) @@\ + RemoveTargetProgram($@) @@\ + HostLinkRule($@,$(_NOOP_),program.o,$(DEPLIBS) $(LOCAL_LIBRARIES)) @@\ + @@\ +DependTarget() @@\ + @@\ +LintTarget() @@\ + @@\ +clean:: @@\ + RemoveFile(ProgramTargetName(program)) +#endif /* SimpleHostProgramTarget */ Index: xc/config/cf/cygwin.cf diff -u /dev/null xc/config/cf/cygwin.cf:3.2 --- /dev/null Mon Dec 18 14:21:00 2000 +++ xc/config/cf/cygwin.cf Thu Nov 30 18:29:55 2000 @@ -0,0 +1,171 @@ +XCOMM platform: $XFree86: xc/config/cf/cygwin.cf,v 3.2 2000/11/30 23:29:55 dawes Exp $ +XCOMM +XCOMM - changes since B20 Cygwin32 release +XCOMM - avoided tons of "not in XXX directory" messages; +XCOMM - dlls are built stripped; +XCOMM - search for cpp in a default location; +XCOMM - fixed problem with missing netinet/tcp.h; +XCOMM - Added AF_UNIX socket support; +XCOMM - xterm compiles and works; +XCOMM - more libs are built as a DLLs; +XCOMM - all DLLs have different base addresses; +XCOMM - changes since B20 Cygwin32 release +XCOMM - dllwrap is used to build DLLs; +XCOMM - Plan to add WATCOM TCP headers support; +XCOMM - gcc -E is invoked instead of cpp; + +#ifndef OSName +#define OSName Cygwin +#endif +#ifndef OSVendor +#define OSVendor Red Hat Inc. +#endif +#ifndef OSMajorVersion +#define OSMajorVersion 1 +#endif +#ifndef OSMinorVersion +#define OSMinorVersion 1 +#endif +#ifndef OSTeenyVersion 2 +#define OSTeenyVersion +#endif + +XCOMM #define OSDefines -DSYSV -DSYSV386 + +#define ProjectRoot /usr/X11R6 + +#define BuildServer YES + +#ifndef UnixCpp +#define UnixCpp +#endif + +#define HasGcc YES +#define HasGcc2 YES +#define HasGcc2ForCplusplus YES +#define GccUsesGas YES +#define UseGas YES +#define GnuCpp YES +#define HasShadowPasswd NO +#define HasLibCrypt YES +#define HasPutenv YES +#define HasPoll NO +#define HasShm NO +#define Hastcl YES +#define Hastk YES +#define TclLibName tcl80 +#define TkLibName tk80 +#define HasSockets YES +#define GzipFontCompression YES +#define BuildXKB YES +#define BuildXF86MiscExt YES +#define BuildXF86VidModeExt YES /* need -fpcc-struct-return for gcc-2.95.2 or it will fail*/ +#define SharedLibFont NO +#define AvoidNullMakeCommand YES +#define StripInstalledPrograms NO +#define CompressAllFonts YES +#define Malloc0ReturnsNull NO +#define NeedConstPrototypes YES +#define NeedFunctionPrototypes YES +#define NeedNestedPrototypes YES +#define NeedVarargsPrototypes YES +#define NeedWidePrototypes NO +#define SetTtyGroup YES +#define ExpandManNames NO +#define HasDlopen NO +#define HasGnuMake YES +XCOMM #define ExtraLoaderDefines DlopenHack +#define DefaultCCOptions -Wall +#define DefaultGcc2i386Opt -O2 +#define LibraryCDebugFlags -O2 +#define UseGccMakeDepend YES + + + +#define ThreadedX NO +#define HasThreadSafeAPI NO +#define LnCmd ln -s +#define CcCmd gcc +#define CpluplusCmd c++ -fpermissive +#define AsCmd as +XCOMM #define AsCmd gcc -S +#define GccGasOption -DGCCUSESGAS +#define AsmDefines -DUSE_GAS -DGCCUSESGAS +#define LdCmd ld +#define MkdirHierCmd mkdir -p +#define CppCmd cpp +#define YaccCmd byacc +#define LexCmd flex -l +#define LexLib -lfl +#define HasFlex YES +#define PreProcessCmd CcCmd -E +XCOMM #define StdIncDir `CcCmd --print-libgcc-file-name | sed ':libgcc.a:../../../../i586-cygwin32/include:'|sed 's,\\\\,/,g'` +XCOMM #define PostIncDir `CcCmd --print-libgcc-file-name | sed ':libgcc.a:/include:'|sed 's,\\\\,/,g'` +#define StdIncDir `CcCmd --print-libgcc-file-name | sed 's,\\\\,/,g' | sed 's,libgcc.a,../../../../i686-pc-cygwin/include,'` +#define PostIncDir `CcCmd --print-libgcc-file-name | sed 's,\\\\,/,g' | sed 's,libgcc.a,include,'` +#define LdCombineFlags -r +#define OptimizedCDebugFlags -O2 -pedantic -fno-strength-reduce -fpcc-struct-return -fvtable-thunks -m486 +#define StandardDefines -D__i386__ -DWIN32_LEAN_AND_MEAN -DX_LOCALE -D_MT -D_X86_ -D__STDC__ -DNO_TCP_H -D__CYGWIN__ -D_XOPEN_SOURCE -D_REENTRANT -D_POSIX_C_SOURCE=199309L -D_BSD_SOURCE -D_SVID_SOURCE -D_GNU_SOURCE -DX_SOURCE +#define XawI18nDefines -DUSE_XWCHAR_STRING -DUSE_XMBTOWC +#define HasWChar32 YES +#define StandardCppDefines -traditional StandardDefines +#define ServerOSDefines XFree86ServerDefines -DDDXTIME -DFD_SETSIZE=256 -DDXOSINIT +#define XkbServerDefines -DXKB_ALWAYS_USES_SOFT_REPEAT +#define ServerExtraDefines -DGCCUSESGAS XFree86ServerDefines +#define ConnectionFlags -DTCPCONN -DUNIXCONN +#define ExtraLibraries +#define InstUidFlags -m 4711 +#define UseRgbTxt YES +#define ExtraFilesToClean *.obj *.orig *.rej junk.c *.exe *.dll *.lib *~ + +/* This a must to compile for xfddx display driver, or your server will NOT work on Win32. DO NOT change to NO */ + +#define BuildSurfLibrary YES + +/* The DRM module requires Linux kernel services, thus useless for CYGWIN compilers*/ + +#define BuildXF86DRI NO +#define BuildXF86DRM NO +#define BuildGlxExt YES +#define BuildXinrama YES +#define BuildPlugin NO +#define BuildDPSLibrary YES +XCOMM #define GlxStaticServerLib YES +#define DoLoadableServer NO + +/* Some of these man page defaults are overriden in the above OS sections */ +#ifndef ManSuffix +# define ManSuffix 1x +#endif +#ifndef ManDir +# define ManDir $(MANSOURCEPATH)1 +#endif +#ifndef LibManSuffix +# define LibManSuffix 3x +#endif +#ifndef LibmanDir +# define LibmanDir $(MANSOURCEPATH)3 +#endif +#ifndef FileManSuffix +# define FileManSuffix 5x +#endif +#ifndef FileManDir +# define FileManDir $(MANSOURCEPATH)5 +#endif + +#define TermcapLibrary -ltermcap +#define XnestServer YES +#define BuildXprint YES +#define XprtServer YES +#define XVirtualFramebufferServer YES +#define XWinServer YES +#define UseSmartScheduler NO + +/* --unix option of cygwin make fools the standard MakeFlagsToShellFlags macro */ +#define MakeFlagsToShellFlags(makeflags,shellcmd)\ + for flag in ${MAKEFLAGS} ''; do \ @@\ + case "$$flag" in *=*) ;;--*) ;; *[makeflags]*) shellcmd;; esac; done + +#include +#include +/*#include */ Index: xc/config/cf/cygwin.rules diff -u /dev/null xc/config/cf/cygwin.rules:3.2 --- /dev/null Mon Dec 18 14:21:00 2000 +++ xc/config/cf/cygwin.rules Wed Aug 23 17:06:18 2000 @@ -0,0 +1,312 @@ +XCOMM $XFree86: xc/config/cf/cygwin.rules,v 3.2 2000/08/23 21:06:18 dawes Exp $ + +#define CPPOnlyAsm(basename,options) RemoveFile(basename.i) @@\ + $(CPP) AsmDefines $(DEFINES) $(INCLUDES) options basename.S | grep -v '^\#' > basename.i + + + +/* + * Cygwin shared library rules (DLL versions) + */ +#define HasSharedLibraries YES +#define NeedLibInsideFlag YES +#define ForceNormalLib NO +#define SharedLibXaw NO +#define SharedLibXmu NO +#define SharedLibXt NO +#define SharedLibSM YES +#define SharedLibICE YES +#define SharedLibXext YES +#define SharedLibXie YES +#define SharedLibXi YES +#define SharedLibPex YES +#define SharedLibXtst YES +#define SharedOldX YES +#define SharedLibXp YES +#define SharedLibGL YES +#define SharedLibXpm YES +#define SharedLibFont NO +#define SharedLibXaw6 NO +#define SharedLibgetsurf NO +#define SharedLibDps YES +#define SharedLibDpsTk YES + + +#ifndef SharedDataSeparation +#define SharedDataSeparation NO +#endif +#ifndef SharedCodeDef +#define SharedCodeDef /**/ +#endif +#ifndef SharedLibraryDef +#define SharedLibraryDef /**/ +#endif +#ifndef ShLibIncludeFile +#define ShLibIncludeFile +#endif +#ifndef SharedLibraryLoadFlags +#define SharedLibraryLoadFlags -dll /**/ +#endif +#ifndef PositionIndependentCFlags +#define PositionIndependentCFlags -D_DLL +#endif +#ifndef PositionIndependentCplusplusFlags +#define PositionIndependentCplusplusFlags -D_DLL +#endif +#ifndef UseExportLists +#define UseExportLists YES +#endif + +/* + * SharedDepLibraryTarget - generate rules to create a shared library. + */ +#ifndef SharedDepLibraryTarget +#ifdef UseInstalled +#ifndef LinkBuildSonameLibrary +#define LinkBuildSonameLibrary(lib) +#endif +#else +#ifndef LinkBuildSonameLibrary +#define LinkBuildSonameLibrary(lib) (RemoveFile($(BUILDLIBDIR)/lib); \ + cd $(BUILDLIBDIR); $(LN) $(BUILDINCTOP)/$(CURRENT_DIR)/lib .) +#endif +#endif + +#define SharedDepLibraryTarget(libname,rev,deplist,solist,down,up) @@\ +SharedLibraryTarget(libname,rev,solist,down,up) +#endif /* SharedDepLibraryTarget */ + +#ifndef SharedDepModuleTarget +#define SharedDepModuleTarget(name,deps,solist) @@\ +AllTarget(name) @@\ + @@\ +name: deps @@\ + $(CC) -o $@ $(SHLIBLDFLAGS) solist $(REQUIREDLIBS) BaseShLibReqs @@\ + @@\ +clean:: @@\ + RemoveFile(name) +#endif /* SharedDepModuleTarget */ + +/* + * SharedLibraryDataTarget - generate rules to create shared data file + */ +#ifndef SharedLibraryDataTarget +#define SharedLibraryDataTarget(libname,rev,salist) +#endif +/* + * InstallSharedLibraryData - generate rules to install the shared library data + */ +#ifndef InstallSharedLibraryData +#define InstallSharedLibraryData(libname,rev,dest) +#endif /* InstallSharedLibraryData */ + +BASE_COUNTER=/tmp/DLL_BASE_COUNTER + +#define MakeDLL(libname,solist) @@\ + if [ -f $(BASE_COUNTER) ]; then true; \ @@\ + else echo 0x67000000 > $(BASE_COUNTER); fi @@\ + dllwrap -s --def libname.def --output-lib Concat3(lib,libname,.a) -o Concat3(lib,libname,.dll) solist junk.o $(REQUIREDLIBS) -image-base `cat $(BASE_COUNTER)` @@\ + IMAGE_LENGTH=`objdump -x Concat3(lib,libname,.dll) |awk '/SizeOfImage/ {print "0x"$$2}'`; \ @@\ + export IMAGE_LENGTH=`expr '(' \`printf %u $$IMAGE_LENGTH\` / 65536 + 1 ')' '*' 65536` ; \ @@\ + export IMAGE_BASE=`cat $(BASE_COUNTER)`; \ @@\ + printf 0x%x `expr \`printf %u $$IMAGE_BASE\` + $$IMAGE_LENGTH` > $(BASE_COUNTER) + + +#define SharedLibraryTarget(libname,rev,solist,down,up) @@\ +AllTarget(Concat3(lib,libname,.dll)) @@\ + @@\ +CppFileTarget(libname.def,libname-def.cpp,-DLIBRARY_VERSION=rev,$(ICONFIGFILES)) @@\ + @@\ + @@\ +junk.c: @@\ + echo "#include " >junk.c @@\ + echo "/*DECLARE_CYGWIN_DLL(dll_main);*/" >>junk.c @@\ + echo "int WINAPI dll_main(HANDLE a, DWORD reason, void *q)" >>junk.c @@\ + echo "{ return 1; }" >>junk.c @@\ +Concat3(lib,libname,.dll): solist junk.o libname.def @@\ + RemoveFile(LibraryTargetName(libname)) @@\ + RemoveFile(Concat3(lib,libname,.dll)) @@\ + MakeDLL(libname,solist) @@\ + LinkBuildLibrary(Concat3(lib,libname,.a)) @@\ + LinkBuildDLL(Concat3(lib,libname,.dll)) @@\ +clean:: @@\ + RemoveFile(LibraryTargetName(libname)) @@\ + RemoveFile(Concat3(lib,libname,.dll)) @@\ + RemoveFile(junk.o) @@\ + RemoveFile(junk.c) @@\ + RemoveFile($(BASE_COUNTER)) + +#define InstallSharedLibrary(libname,rev,dest) @@\ +InstallTarget(install,LibraryTargetName(libname),$(INSTLIBFLAGS),$(USRLIBDIR)) @@\ +InstallTarget(install,Concat3(lib,libname,.dll),$(INSTLIBFLAGS),$(BINDIR)) + +#define ProgramTargetName(target)target.exe + +/* + * LinkBuildBinary - export a *.exe to exports/bin. + */ +#define LinkBuildBinary(program) @@\ +all:: $(BUILDBINDIR)/program program @@\ + $(BUILDBINDIR)/program: program @@\ + RemoveFile$(@) @@\ + cd $(BUILDBINDIR) && $(CP) $(BUILDBINTOP)/$(CURRENT_DIR)/program . + +/* + * LinkBuildDLL - export a .dll to exports/bin. + */ +#ifdef UseInstalled +#define LinkBuildDLL(lib) $(_NULLCMD_) +#else +#define LinkBuildDLL(lib) MakeDir($(BUILDBINDIR)) @@\ + RemoveFile($(BUILDBINDIR)/lib) @@\ + cd $(BUILDBINDIR) && $(CP) $(BUILDBINTOP)/$(CURRENT_DIR)/lib . +#endif + +/* + * LinkBuildBinary - export an .exe to exports/bin. + */ + + +#ifndef LinkBuildBinary +#define LinkBuildBinary +all:: $(BUILDBINDIR)/ProgramTargetName(binary) ProgramTargetName(binary) @@\ + @@\ +$(BUILDBINDIR)/ProgramTargetName(binary): ProgramTargetName(binary) @@\ + MakeDir($(BUILDBINDIR)) @@\ + RemoveFile($(BUILDBINDIR)/ProgramTargetName(binary))) @@\ + cd $(BUILDBINDIR) && $(LN) $(BUILDBINTOP)/$(CURRENT_DIR)/ProgramTargetName(binary) . +#endif /* LinkBuildBinary */ + +/* This is to replace an ugly hack in /xc/nls/XLC_LOCALE */ +/* the corresponding Imake.rules rule would be: + define LinkFileSpecial(gotodir,tofile,fromfile) @@\ + @MakeFlagsToShellFlags(i,set +e); \ @@\ + cd dir && (set -x; RemoveFile(tofile); $(LN) fromfile tofile) + */ + +/* And this replaces a similarlry ugly hack in InstallDynamicModule */ + +#ifndef LinkBuildModule +#ifdef UseInstalled +#define LinkBuildModule(module,subdir) $(_NULLCMD_) +#else +#define LinkBuildModule(module,subdir) @@\ + MakeDir($(BUILDMODULEDIR)/subdir) @@\ + RemoveFile($(BUILDMODULEDIR)/subdir/module) @@\ + $(LN) $(BUILDMODULETOP)/$(CURRENT_DIR)/module $(BUILDMODULEDIR)/subdir/module +#endif +#endif /* LinkBuildModule */ + +#ifndef LinkBuildNamedModule +#define LinkBuildNamedModule(module,name) MakeDir($(BUILDMODULEDIR)) @@\ + RemoveFile($(BUILDMODULEDIR)/module) @@\ + $(BUILDMODULEDIR) $(BUILDMODULETOP)/$(CURRENT_DIR)/module name +#endif /* LinkBuildNamedModule */ + +#define NormalProgramTarget(program,objects,deplibs,locallibs,syslibs) @@\ +AllTarget(ProgramTargetName(program)) @@\ +ProgramTargetName(program): objects deplibs @@\ + RemoveTargetProgram($@) @@\ + LinkRule($@,$(LDOPTIONS),objects,locallibs $(LDLIBS) syslibs) @@\ + @@\ +clean:: @@\ + RemoveFile(ProgramTargetName(program)) + +#define ProgramTargetHelper(program,srcs,objs,deplib,locallib,syslib) @@\ +ProgramTargetName(program): $(objs) $(deplib) @@\ + RemoveTargetProgram($@) @@\ + LinkRule($@,$(LDOPTIONS),$(objs),locallib $(LDLIBS) syslib) @@\ + @@\ +InstallProgram(program,$(BINDIR)) @@\ +InstallManPage(program,$(MANDIR)) + +#define ComplexProgramTarget(program) @@\ +AllTarget(ProgramTargetName(program)) @@\ + @@\ +ProgramTargetHelper(program,SRCS,OBJS,DEPLIBS,$(LOCAL_LIBRARIES),NullParameter) @@\ + @@\ +DependTarget() @@\ +LintTarget() @@\ + @@\ +clean:: @@\ + RemoveFile(ProgramTargetName(program)) + +#define ComplexProgramTarget_1(program,locallib,syslib) @@\ + OBJS = $(OBJS1) $(OBJS2) $(OBJS3) @@\ + SRCS = $(SRCS1) $(SRCS2) $(SRCS3) @@\ + PROGRAM1 = ProgramTargetName(program) @@\ + @@\ +AllTarget($(PROGRAM1) $(PROGRAM2) $(PROGRAM3)) @@\ + @@\ +ProgramTargetHelper(program,SRCS1,OBJS1,DEPLIBS1,locallib,syslib) @@\ + @@\ +DependTarget() @@\ +LintTarget() @@\ + @@\ +clean:: @@\ + for i in $(PROGRAMS); do $(RM) ProgramTargetName($$i); done + +#define ComplexProgramTarget_2(program,locallib,syslib) @@\ + PROGRAM2 = ProgramTargetName(program) @@\ + @@\ +ProgramTargetHelper(program,SRCS2,OBJS2,DEPLIBS2,locallib,syslib) + +#define ComplexProgramTarget_3(program,locallib,syslib) @@\ + PROGRAM3 = ProgramTargetName(program) @@\ + @@\ +ProgramTargetHelper(program,SRCS3,OBJS3,DEPLIBS3,locallib,syslib) + +#define ServerTargetWithFlags(server,subdirs,objects,libs,syslibs,flags) @@\ +AllTarget(ProgramTargetName(server)) @@\ +ProgramTargetName(server): subdirs objects libs @@\ + MoveToBakFile($@) @@\ + LinkRule($@,$(LDOPTIONS),objects,libs $(LDLIBS) syslibs) @@\ + @@\ +Concat(load,server): @@\ + MoveToBakFile(ProgramTargetName(server)) @@\ + LinkRule(ProgramTargetName(server),$(LDOPTIONS),objects,libs $(LDLIBS) syslibs) @@\ + @@\ +loadX:: Concat(load,server) @@\ + @@\ +SentinelProgramTarget(server,subdirs objects libs,objects libs $(LDLIBS) syslibs) @@\ +SentinelLinkTarget(Concat(load,server),server,objects libs $(LDLIBS) syslibs) @@\ +PurifyProgramTarget(server,subdirs objects libs,objects libs $(LDLIBS) syslibs) @@\ +PurifyLinkTarget(Concat(load,server),server,objects libs $(LDLIBS) syslibs) @@\ +ProofProgramTarget(server,subdirs objects libs,objects libs $(LDLIBS) syslibs) @@\ +ProofLinkTarget(Concat(load,server),server,objects libs $(LDLIBS) syslibs) @@\ + @@\ +InstallProgramWithFlags(server,$(BINDIR),flags) @@\ + @@\ +clean:: @@\ + RemoveFile(ProgramTargetName(server)) + +/* + * ProfiledRelocatableTarget - generate rules to produce a profiled relocatable + * object file instead of a library. + */ +#ifndef ProfiledRelocatableTarget +#define ProfiledRelocatableTarget(objname,objlist) @@\ +AllTarget(Concat(objname,_p.Osuf)) @@\ + @@\ +Concat(objname,_p.Osuf): objlist $(EXTRALIBRARYDEPS) @@\ + RemoveFile($@) @@\ + $(LD) -X -r --oformat pe-i386 objlist -o $@ + +#endif /* ProfiledRelocatableTarget */ + + +/* + * DebuggedRelocatableTarget - generate rules to produce a debuggable + * relocatable object file instead of a library. + */ +#ifndef DebuggedRelocatableTarget +#define DebuggedRelocatableTarget(objname,objlist) @@\ +AllTarget(Concat(objname,_d.Osuf)) @@\ + @@\ +Concat(objname,_d.Osuf): objlist $(EXTRALIBRARYDEPS) @@\ + RemoveFile($@) @@\ + $(LD) -X -r --oformat pe-i386 objlist -o $@ + +#endif /* DebuggedRelocatableTarget */ + + Index: xc/config/cf/cygwin.tmpl diff -u /dev/null xc/config/cf/cygwin.tmpl:3.2 --- /dev/null Mon Dec 18 14:21:00 2000 +++ xc/config/cf/cygwin.tmpl Mon Dec 4 13:49:13 2000 @@ -0,0 +1,39 @@ +XCOMM $XConsortium: WinLib.tmpl,v 1.1 94/01/08 18:32:51 rws Exp $ +XCOMM $XFree86: xc/config/cf/cygwin.tmpl,v 3.2 2000/12/04 18:49:13 dawes Exp $ + +#define SharedOldXReqs $(LDPRELIB) $(XLIBONLY) +#define SharedXtReqs $(LDPRELIB) $(SMLIB) $(ICELIB) $(XLIBONLY) +#define SharedXawReqs $(LDPRELIB) $(XMULIB) $(XTOOLLIB) $(XPMLIB) $(XLIB) +#define SharedXaw6Reqs $(LDPRELIB) $(XMULIB) $(XTOOLLIB) $(XLIB) +#define SharedXmuReqs $(LDPRELIB) $(XTOOLLIB) $(XLIB) +#define SharedXextReqs $(LDPRELIB) $(XLIBONLY) +#define SharedXiReqs $(LDPRELIB) $(XLIB) +#define SharedPexReqs $(LDPRELIB) $(XLIBONLY) +#define SharedXtstReqs $(LDPRELIB) $(XLIB) +#define SharedXieReqs $(LDPRELIB) $(XLIBONLY) +#define SharedSMReqs $(LDPRELIB) $(ICELIB) +#define SharedXpReqs $(LDPRELIB) $(XAUTHLIB) $(EXTENSIONLIB) $(XLIBONLY) +#define SharedXvReqs $(LDPRELIB) $(XLIB) +#define SharedGLReqs $(LDPRELIB) $(XLIB) +XCOMM #define SharedXfontReqs $(LDPRELIB) $(XLIB) +#define SharedXxf86vmReqs $(LDPRELIB) $(XLIB) +#define SharedXxf86miscReqs $(LDPRELIB) $(XLIB) +#define SharedXpmReqs $(LDPRELIB) $(XLIB) +#define SharedXxf86dgaReqs $(LDPRELIB) $(XLIB) +#define SharedXssReqs $(LDPRELIB) $(XLIB) $(EXTENSIONLIB) $(XTOOLLIB) +#define SharedDPSReqs $(LDPRELIB) $(SMLIB) $(ICELIB) $(XTOOLLIB) $(XLIB) +#define SharedDPSTKReqs $(LDPRELIB) $(SMLIB) $(ICELIB) $(XTOOLLIB) $(DPSLIB) $(XLIB) +#define SharedXrenderReqs $(LDPRELIB) $(EXTENSIONLIB) $(XLIB) +#define SharedpsresReqs $(LDPRELIB) $(SMLIB) $(ICELIB) $(XTOOLLIB) $(XLIB) + + +#ifndef FixupLibReferences +#define FixupLibReferences() @@\ +XMULIBONLY = -lXmu @@\ +XMULIB = $(XMULIBONLY) $(XTOOLLIB) $(XLIB) +#endif + +#ifndef XawClientLibs +#define XawClientLibs $(XAWLIB) $(XMULIBONLY) $(XTOOLLIB) $(XLIB) $(XPMLIB) +#endif + Index: xc/config/cf/darwin.cf diff -u /dev/null xc/config/cf/darwin.cf:1.2 --- /dev/null Mon Dec 18 14:21:00 2000 +++ xc/config/cf/darwin.cf Tue Nov 28 12:25:07 2000 @@ -0,0 +1,105 @@ +XCOMM $XFree86: xc/config/cf/darwin.cf,v 1.2 2000/11/28 17:25:07 dawes Exp $ + +/* Darwin / MacOS-X configuration by John Carmack */ + +/* imake determines the default values by parsing uname */ +#define OSName DefaultOSName +#define OSMajorVersion DefaultOSMajorVersion +#define OSMinorVersion DefaultOSMinorVersion +#define OSTeenyVersion 0 + +#define HasSnprintf YES +#define HasPutenv YES +#define HasBSD44Sockets YES +#define BuildGlxExt NO +#ifndef HasShm +# define HasShm YES +#endif + +/* + * This enables some settings for developers. + */ +#define XFree86Devel NO + +/* we don't need -lm */ +#define MathLibrary /**/ + +/* we don't have a termcap library */ +#define TermcapLibrary /**/ + +/* we don't have a dbm library */ +#define DBMLibrary /**/ + +/* our cpp isn't in /lib/cpp */ +#define CppCmd /usr/bin/cpp + +/* we have a gcc compatible compiler, but its not called gcc */ +#define CcCmd /usr/bin/cc + +/* if -c isn't passed, there are problems with the cfb libs when + * they include an object file without any symbols + */ +#define RanlibCmd ranlib -c + +/* uncommenting this line will get -g instead of -O, which builds + * a lot faster and gets debug info + */ +#if 0 +#define DefaultCDebugFlags -g +#endif + +/* default flags to pass to cc */ +#if XFree86Devel +# define DefaultCCOptions -Wall -Wpointer-arith -Wstrict-prototypes \ + -Wmissing-prototypes -Wmissing-declarations \ + -Wredundant-decls -Wnested-externs \ + -traditional-cpp +#else +# define DefaultCCOptions -Wall -Wpointer-arith -traditional-cpp +#endif + +/* a lot of xfree86 code needs __powerpc__ to avoid doing outport asm + * + * __DARWIN__ will be used for platform specific #ifdefs that can't + * be handled by existing X defines + * + * there is an unfortunate symbol collision with the appkit for TIFFFaxBlackCodes + * + * We need to define BSD44SOCKETS to get unix domain socket namelen calculated right + */ +#define StandardDefines -D__powerpc__ -D__DARWIN__ + +/* programs/rgb/rgb.h and others needs this */ +#define HasNdbm YES + +/* set this to NO to just build the client libs, which should work without + * having to write any platform specific code. + */ +#define BuildServer YES + +/* our custom X server */ +#define XDarwinServer YES + +/* pex? bah. I'm not going to bother getting the device + * dependent part of this working. If I get the time, i'll + * get glx working instead. + */ +#define BuildPexExt NO + +/* no direct graphics extension */ +#define BuildXF86DGA NO + +/* no extra tablets and weird input devices */ +#define BuildXInputExt NO + +/* no Display Power Management extension */ +#define BuildDPMSExt NO + +/* no Render extension */ +#define BuildRender NO + +#define BuildXvExt NO + +/* include all the xfree rules */ +/* I haven't tracked down why this is needed, but it is... */ +#include Index: xc/config/cf/gnu.cf diff -u xc/config/cf/gnu.cf:1.6 xc/config/cf/gnu.cf:1.10 --- xc/config/cf/gnu.cf:1.6 Tue Feb 29 10:24:13 2000 +++ xc/config/cf/gnu.cf Thu Nov 30 18:29:55 2000 @@ -1,8 +1,9 @@ -XCOMM platform: $XFree86: xc/config/cf/gnu.cf,v 1.6 2000/02/29 15:24:13 tsi Exp $ +XCOMM platform: $XFree86: xc/config/cf/gnu.cf,v 1.10 2000/11/30 23:29:55 dawes Exp $ #ifndef OSName -#define OSName GNU +#define OSName DefaultOSName #endif + #ifndef OSVendor #define OSVendor /**/ #endif @@ -16,111 +17,170 @@ #define OSTeenyVersion DefaultOSTeenyVersion #endif XCOMM operating system: OSName (OSMajorVersion./**/OSMinorVersion./**/OSTeenyVersion) + +#define GNUSourceDefines -D_POSIX_C_SOURCE=199309L \ + -D_POSIX_SOURCE -D_XOPEN_SOURCE \ + -D_BSD_SOURCE -D_SVID_SOURCE + +XCOMM XXXMB: What about _GNU_SOURCE, see Linux/UseInstalled? + +#define XawI18nDefines -DHAS_WCHAR_H -DHAS_WCTYPE_H -DNO_WIDEC_H + +XCOMM Enable this when we have pthreads. +XCOMM #define HasPosixThreads YES +XCOMM #define ThreadedX YES +XCOMM #define HasThreadSafeAPI YES +XCOMM #define ThreadsLibraries -lpthread +XCOMM #define SystemMTDefines -D_REENTRANT + +#ifndef HasLibCrypt +#define HasLibCrypt YES +#endif -#define HasGcc YES +#define BuildLibPathVar LD_LIBRARY_PATH +#define HasGcc YES #define HasGcc2 YES +#ifndef HasGcc2ForCplusplus +# define HasGcc2ForCplusplus YES +#endif #define GccUsesGas YES #define UseGas YES #define GnuCpp YES -#define UseGccMakeDepend YES -#define HasGnuMake YES -#ifndef HasGcc2ForCplusplus -#define HasGcc2ForCplusplus YES +#define HasDlopen YES +#ifndef HasShadowPasswd +# define HasShadowPasswd YES #endif +#define HasPutenv YES -#define XserverNeedsSetUID YES +XCOMM Not implemented and will always fail. +#define HasShm YES -#define ProjectRoot /usr/X11R6 -#define YaccCmd bison -y -#define LexCmd flex -#ifndef LexLib -#define LexLib -lfl +#define HasBSD44Sockets YES +#define HasSockets YES +#define HasSnprintf YES +#define HasMkstemp YES +#define HasUsableFileMmap YES +#ifndef HasNCurses +#define HasNCurses YES #endif -#define ArCmd ar clq -#define AsCmd as -#define CcCmd gcc -#define CppCmd /lib/gcc-lib/i586--gnu/egcs-2.91.60/cpp -#define PreProcessCmd CcCmd -EP -x c -#define RanlibCmd ranlib -#define LdCmd ld -#if defined(UseInstalled) -#define DefaultCCOptions /**/ -#else -#define DefaultCCOptions -ansi -pedantic GccWarningOptions + +#define AvoidNullMakeCommand YES +#ifndef DebuggableLibraries +#define DebuggableLibraries NO #endif -#define GccGasOption -DGCCUSESGAS -#define DefaultGcc2i386Opt -O2 -#if HasGcc2 && defined(i386Architecture) -#define OptimizedCDebugFlags DefaultGcc2i386Opt -#else -#define OptimizedCDebugFlags +#define CompressAllFonts YES +#define Malloc0ReturnsNull YES +#define NeedConstPrototypes YES +#define NeedFunctionPrototypes YES +#define NeedNestedPrototypes YES +#define NeedVarargsPrototypes YES +#ifndef NeedWidePrototypes +#define NeedWidePrototypes NO #endif +#define SetTtyGroup YES +#ifndef UseStaticTermcapLib +#define UseStaticTermcapLib NO +#endif -#define AsmDefines -DUSE_GAS -#define BootstrapCFlags -#define ExtensionOSDefines +#define MkdirHierCmd mkdir -p +#ifndef CcCmd +#define CcCmd gcc +#endif +#ifndef AsCmd +#define AsCmd as +#endif +#ifndef LdCmd +#define LdCmd ld +#endif -#ifdef i386Architecture -#define ServerExtraDefines GccGasOption XFree86ServerDefines -DNO_ALLOCA +#define AsmDefines -D__ELF__ +#define CplusplusCmd c++ +#ifndef TermcapLibrary +#if UseStaticTermcapLib +#define TermcapLibrary StaticLibrary(/usr/lib,ncurses) #else -#define ServerExtraDefines GccGasOption +#define TermcapLibrary -lncurses +#endif #endif +#ifndef DoLoadableServer +#define DoLoadableServer YES +#endif +#ifndef +#define CppCmd /lib/cpp +#endif +#define YaccCmd bison -y +#define LexCmd flex -l +#define HasFlex YES +#define LexLib -lfl +#define PreProcessCmd CcCmd -E +#define PostIncDir DefaultGccIncludeDir +#define LdCombineFlags -r +#ifndef LdPostLib +#define LdPostLib /* Never needed */ +#endif +#define HasWChar32 YES #define StandardCppOptions -traditional -#define StandardCppDefines StandardDefines -#define StandardDefines -D_XOPEN_SOURCE -D_POSIX_SOURCE -D_BSD_SOURCE -D__ELF__ -#define ServerOSDefines XFree86ServerOSDefines -DDDXTIME -#define ConnectionFlags -DTCPCONN -#define HasBSD44Sockets YES -#define HasSockets YES +#define StandardCppDefines StandardDefines -#define UseElfFormat YES -#define HasSharedLibraries YES -#define HasDlopen YES -#define DlLibrary -ldl +#define HasVarRun YES +#define VarDbDirectory $(VARDIR)/state + +XCOMM i386Architecture +#define OptimizedCDebugFlags DefaultGcc2i386Opt +#define GNUMachineDefines -D__i386__ +#define ServerOSDefines XFree86ServerOSDefines -DDDXTIME -DPART_NET +#define ServerExtraDefines -DGCCUSESGAS XFree86ServerDefines #define HasPlugin YES -#define VendorHasX11R6_3libXext YES /* XC or XFree86 >= 3.3.1 */ -#define DoLoadableServer YES +#define VendorHasX11R6_3libXext YES +#ifndef StandardDefines +#define StandardDefines -D__GNU__ GNUMachineDefines GNUSourceDefines +#endif -#include +#define DlLibrary -rdynamic -ldl -#define BuildXCSecurity YES -#define AvoidNullMakeCommand YES -#define CompressAllFonts YES -#define DirFailPrefix - -#define HasNdbm YES -#define HasPutenv YES -#define Malloc0ReturnsNull NO -#define NeedConstPrototypes YES -#define NeedFunctionPrototypes YES -#define NeedNestedPrototypes YES -#define NeedVarargsPrototypes YES -#define NeedWidePrototypes NO -#ifndef HasLibCrypt -# define HasLibCrypt YES -#endif -#define HasPoll YES +#define ServerExtraSysLibs /**/ -#define TermcapLibrary -lncurses +#define ConnectionFlags -DUNIXCONN -DTCPCONN -#ifndef GnuMallocLibrary -#define GnuMallocLibrary /* -lgnumalloc */ +/* Some of these man page defaults are overriden in the above OS sections */ +#ifndef ManSuffix +# define ManSuffix 1x +#endif +#ifndef ManDir +# define ManDir $(MANSOURCEPATH)1 +#endif +#ifndef LibManSuffix +# define LibManSuffix 3x +#endif +#ifndef LibmanDir +# define LibmanDir $(MANSOURCEPATH)3 +#endif +#ifndef FileManSuffix +# define FileManSuffix 5x #endif +#ifndef FileManDir +# define FileManDir $(MANSOURCEPATH)5 +#endif -#ifdef InstallCmd -#undef InstallCmd +#ifndef StaticLibrary +#define StaticLibrary(libpath,libname) -Wl,-Bstatic Concat(-L,libpath) Concat(-l,libname) -Wl,-Bdynamic #endif -#define InstallCmd /bin/install -#define TroffCmd groff -Tps +#define HasGnuMake YES -#ifndef ExtraFilesToClean -# define ExtraFilesToClean *.core -#endif +#define MakeNamedTargetSubdir(dir,flags,subname)\ + $(MAKE) -C dir $(MFLAGS) $(PARALLELMFLAGS) flags subname -#define BuildXTrueType NO +#define ArchitectureDefines -DGNU_ARCHITECTURE -#ifdef i386Architecture -# include -#endif +#define XserverNeedsSetUID YES + +#include + +XCOMM XXX Might need this if they are not careful with slashes. +XCOMM #define DirFailPrefix - + +#include + Index: xc/config/cf/gnuLib.rules diff -u xc/config/cf/gnuLib.rules:1.3 xc/config/cf/gnuLib.rules:1.4 --- xc/config/cf/gnuLib.rules:1.3 Sun Jun 6 04:47:44 1999 +++ xc/config/cf/gnuLib.rules Tue Nov 14 13:20:31 2000 @@ -1,16 +1,12 @@ -XCOMM $XFree86: xc/config/cf/gnuLib.rules,v 1.3 1999/06/06 08:47:44 dawes Exp $ - /* * GNU/Hurd shared library rules + * + * $XFree86: xc/config/cf/gnuLib.rules,v 1.4 2000/11/14 18:20:31 dawes Exp $ */ -#ifndef UseElfFormat -#define UseElfFormat YES -#endif - /* * GNU/Hurd shared library rules - * Cloned from NetBSD/FreeBSD (ELF) shared library rules + * Cloned from Linux (ELF) shared library rules * */ @@ -18,13 +14,18 @@ #define HasSharedLibraries YES #endif #ifndef ForceNormalLib -#define ForceNormalLib YES +#define ForceNormalLib NO #endif -#ifndef BaseShLibReqs -#define BaseShLibReqs /* -lc implied by $(CC) */ +#ifndef SharedOldX +#define SharedOldX NO #endif +#undef SpecialMalloc +#define SpecialMalloc NO + +#define BaseShLibReqs -lc + #ifndef SharedDataSeparation #define SharedDataSeparation NO #endif @@ -38,7 +39,9 @@ #define ShLibIncludeFile #endif #ifndef SharedLibraryLoadFlags -#define SharedLibraryLoadFlags -shared -Wl,-rpath=$(USRLIBDIR) +XCOMM XXX To rpath or not to rpath... +XCOMM #define SharedLibraryLoadFlags -shared -Wl,-rpath=$(USRLIBDIR) +#define SharedLibraryLoadFlags -shared #endif #ifndef PositionIndependentCFlags #define PositionIndependentCFlags -fPIC @@ -48,9 +51,10 @@ #endif #ifndef ExtraLoadFlags #ifdef UseInstalled -#define ExtraLoadFlags -Wl,-rpath=$(USRLIBDIRPATH) +XCOMM XXX Maybe superfluous. +#define ExtraLoadFlags -Wl,-rpath-link=$(USRLIBDIRPATH) #else -#define ExtraLoadFlags -Wl,-dynamic-linker=/lib/ld.so.1 -Wl,-rpath=/lib:$(USRLIBDIRPATH) -Wl,-rpath-link=$(BUILDLIBDIR) +#define ExtraLoadFlags -Wl,-rpath-link=$(BUILDLIBDIR) #endif #endif @@ -63,11 +67,9 @@ install:: Concat(lib,libname.so.rev) @@\ MakeDir($(DESTDIR)dest) @@\ $(INSTALL) $(INSTALLFLAGS) $(INSTBINFLAGS) Concat(lib,libname.so.rev) $(DESTDIR)dest @@\ - (T=`echo Concat($(DESTDIR)dest/lib,libname.so.rev) | sed 's/\.[^\.]*$$//'`;\ - $(RM) $$T && $(LN) Concat(lib,libname.so.rev) $$T) @@\ - (T=`echo Concat($(DESTDIR)dest/lib,libname.so.rev) | sed 's/\.so.*$$/.so/'`;\ - $(RM) $$T && $(LN) Concat(lib,libname.so.rev) $$T) @@\ - @if $(SOSYMLINK); then (set -x; \ @@\ + @T=`echo Concat($(DESTDIR)dest/lib,libname.so.rev) | sed 's/\.[^\.]*$$//'`;\ + set -x; $(RM) $$T && $(LN) Concat(lib,libname.so.rev) $$T @@\ + @if $(SOSYMLINK); then (set -x; \ $(RM) Concat($(DESTDIR)dest/lib,libname.so); \ @@\ $(LN) Concat(lib,libname.so.rev) Concat($(DESTDIR)dest/lib,libname.so)); fi #endif /* InstallSharedLibrary */ @@ -96,9 +98,9 @@ #define SharedLibraryTarget(libname,rev,solist,down,up) @@\ AllTarget(Concat(lib,libname.so.rev)) @@\ @@\ -Concat(lib,libname.so.rev): solist @@\ +Concat(lib,libname.so.rev): solist $(EXTRALIBRARYDEPS) @@\ $(RM) $@~ @@\ - SONAME=`echo $@ | sed 's/\.[^\.]*$$//'`; \ @@\ + @SONAME=`echo $@ | sed 's/\.[^\.]*$$//'`; set -x; \ @@\ (cd down; $(CC) -o up/$@~ $(SHLIBLDFLAGS) -Wl,-soname,$$SONAME solist $(REQUIREDLIBS) BaseShLibReqs); \ @@\ $(RM) $$SONAME; $(LN) $@ $$SONAME; \ @@\ LinkBuildSonameLibrary($$SONAME) @@\ @@ -111,33 +113,48 @@ LinkBuildLibraryMaybe(Concat(lib,libname.so),$(SOSYMLINK)) @@\ @@\ clean:: @@\ - $(RM) Concat(lib,libname.so.rev) - -#endif /* SharedLibraryTarget */ + @MAJREV=`expr rev : '\(.*\)\.'`; \ @@\ + set -x; $(RM) Concat(lib,libname.so.$$MAJREV) @@\ + $(RM) Concat(lib,libname.so.rev) Concat(lib,libname.so) -/* - * SharedLibraryDataTarget - generate rules to create shlib data file; - */ -#ifndef SharedLibraryDataTarget -#define SharedLibraryDataTarget(libname,rev,salist) #endif /* SharedLibraryTarget */ /* * SharedDepLibraryTarget - generate rules to create a shared library. */ #ifndef SharedDepLibraryTarget +#ifdef UseInstalled +#ifndef LinkBuildSonameLibrary +#define LinkBuildSonameLibrary(lib) true +#endif +#else +#ifndef LinkBuildSonameLibrary +#define LinkBuildSonameLibrary(lib) (RemoveFile($(BUILDLIBDIR)/lib); \ + cd $(BUILDLIBDIR); $(LN) $(BUILDINCTOP)/$(CURRENT_DIR)/lib .) +#endif +#endif + #define SharedDepLibraryTarget(libname,rev,deplist,solist,down,up) @@\ AllTarget(Concat(lib,libname.so.rev)) @@\ @@\ Concat(lib,libname.so.rev): deplist $(EXTRALIBRARYDEPS) @@\ $(RM) $@~ @@\ - (cd down; $(CC) -o up/$@~ $(SHLIBLDFLAGS) solist $(REQUIREDLIBS)) @@\ - $(RM) $@ @@\ + @SONAME=`echo $@ | sed 's/\.[^\.]*$$//'`; set -x; \ @@\ + (cd down; $(CC) -o up/$@~ $(SHLIBLDFLAGS) -Wl,-soname,$$SONAME solist $(REQUIREDLIBS) BaseShLibReqs); \ @@\ + $(RM) $$SONAME; $(LN) $@ $$SONAME; \ @@\ + LinkBuildSonameLibrary($$SONAME) @@\ + $(RM) $@ @@\ $(MV) $@~ $@ @@\ + @if $(SOSYMLINK); then (set -x; \ @@\ + $(RM) Concat(lib,libname.so); \ @@\ + $(LN) $@ Concat(lib,libname.so)); fi @@\ LinkBuildLibrary($@) @@\ + LinkBuildLibraryMaybe(Concat(lib,libname.so),$(SOSYMLINK)) @@\ @@\ clean:: @@\ - $(RM) Concat(lib,libname.so.rev) + @MAJREV=`expr rev : '\(.*\)\.'`; \ @@\ + set -x; $(RM) Concat(lib,libname.so.$$MAJREV) @@\ + $(RM) Concat(lib,libname.so.rev) Concat(lib,libname.so) #endif /* SharedDepLibraryTarget */ @@ -147,7 +164,7 @@ @@\ name: deps @@\ $(RM) $@~ @@\ - $(LD) -o $@~ $(SHLIBLDFLAGS) solist $(REQUIREDLIBS) @@\ + $(CC) -o $@~ $(SHLIBLDFLAGS) solist $(REQUIREDLIBS) BaseShLibReqs @@\ $(RM) $@ @@\ $(MV) $@~ $@ @@\ @@\ @@ -161,30 +178,4 @@ */ #ifndef SharedLibraryDataTarget #define SharedLibraryDataTarget(libname,rev,salist) -#endif /* SharedLibraryDataTarget */ - -#ifndef InstallSharedLibraryData -#define InstallSharedLibraryData(libname,rev,dest) -#endif /* InstallSharedLibraryData */ - -/* - * SharedLibReferences - variables for shared libraries - */ -#ifndef SharedLibReferences -#define SharedLibReferences(varname,libname,libsource,revname,rev) @@\ -revname = rev @@\ -Concat3(DEP,varname,LIB) = SharedLibDependencies(libname,libsource,revname) @@\ -Concat(varname,LIB) = LoaderLibPrefix Concat(-l,libname) @@\ -LintLibReferences(varname,libname,libsource) -#endif - -/* - * SharedDSLibReferences - variables for shared libraries - */ -#ifndef SharedDSLibReferences -#define SharedDSLibReferences(varname,libname,libsource,revname,rev) @@\ -revname = rev @@\ -Concat3(DEP,varname,LIB) = SharedDSLibDependencies(libname,libsource,revname) @@\ -Concat(varname,LIB) = LoaderLibPrefix Concat(-l,libname) Concat3(Shared,libname,Reqs) @@\ -LintLibReferences(varname,libname,libsource) -#endif +#endif /* SharedLibraryTarget */ Index: xc/config/cf/gnuLib.tmpl diff -u xc/config/cf/gnuLib.tmpl:1.2 xc/config/cf/gnuLib.tmpl:1.3 --- xc/config/cf/gnuLib.tmpl:1.2 Sun Jun 6 08:13:22 1999 +++ xc/config/cf/gnuLib.tmpl Tue Nov 14 13:20:31 2000 @@ -1,7 +1,7 @@ -XCOMM $XFree86: xc/config/cf/gnuLib.tmpl,v 1.2 1999/06/06 12:13:22 dawes Exp $ - /* * GNU Hurd shared library template + * + * $XFree86: xc/config/cf/gnuLib.tmpl,v 1.3 2000/11/14 18:20:31 dawes Exp $ */ #ifndef FixupLibReferences @@ -15,7 +15,6 @@ #endif #define CplusplusLibC -#define FrescoSysLibs CplusplusLibC MathLibrary #define SharedX11Reqs #define SharedOldXReqs $(LDPRELIB) $(XLIBONLY) @@ -29,6 +28,3 @@ #define SharedXtstReqs $(LDPRELIB) $(XLIB) #define SharedXieReqs $(LDPRELIB) $(XLIBONLY) #define SharedSMReqs $(LDPRELIB) $(ICELIB) -#define SharedFrescoReqs $(LDPRELIB) $(XLIBONLY) FrescoSysLibs -#define SharedXtfReqs $(LDPRELIB) $(FRESCOLIB) $(XTOOLLIB) $(XLIB) FrescoSysLibs - Index: xc/config/cf/iPAQH3600.cf diff -u /dev/null xc/config/cf/iPAQH3600.cf:1.2 --- /dev/null Mon Dec 18 14:21:00 2000 +++ xc/config/cf/iPAQH3600.cf Tue Oct 10 10:05:48 2000 @@ -0,0 +1,109 @@ +/* $XFree86: xc/config/cf/iPAQH3600.cf,v 1.2 2000/10/10 14:05:48 tsi Exp $ */ +/* + * This configuration file contains additional configuration needed + * to cross compile X for the Compaq iPAQ H3600 PocketPC. + * To use this, add the following to host.def: + #define KDriveXServer YES + #define XiPAQH3500Server YES + */ + +#define CrossCompiling YES + +#undef i386Architecture +#define Arm32Architecture + +#undef OptimizedCDebugFlags +#define OptimizedCDebugFlags -O2 +#define ServerCDebugFlags -O2 +#undef StandardDefines +#define StandardDefines -Dlinux -D__arm__ -D_POSIX_SOURCE \ + -D_BSD_SOURCE -D_GNU_SOURCE -DX_LOCALE +#undef CcCmd +#define StdIncDir /skiff/local/arm-linux/include +#define PreIncDir +#undef PostIncDir +#define PostIncDir /skiff/local/lib/gcc-lib/arm-linux/2.95.2/include +#define CcCmd /skiff/local/bin/arm-linux-gcc +#define DoRanlibCmd YES +#define RanlibCmd /skiff/local/bin/arm-linux-ranlib +#undef ExtraLoadFlags +#define ExtraLoadFlags +#define FbNoPixelAddrCode +#undef TermcapLibrary +#define TermcapLibrary -ltermcap + +#undef LdPostLib +#define LdPostLib -L/skiff/local/arm-linux/lib + +#undef XfbdevServer +#define XfbdevServer YES +#undef BuildXprint +#define BuildLBX NO +#define BuildFonts NO +#define BuildAppgroup NO +#define BuildRECORD NO +#define BuildDBE NO +#define BuildXCSecurity NO +#define ItsyCompilerBug YES +#define FontServerAccess NO +#define ServerXdmcpDefines /**/ + +#undef ExtensionOSDefines +#define ExtensionOSDefines + +#define ProjectRoot /usr/X11R6 + +#define GzipFontCompression YES + +#define KdriveServerExtraDefines -DITSY -DMAXSCREENS=1 + +#define HostLinkRule(target, flags, src, libs) cc -I$(BUILDINCDIR) -o target src + +/* ComplexHostProgramTarget - Compile a program such that we can run + * it on this host, i.e., don't use the default cross compiler. + */ +#ifndef ComplexHostProgramTarget +#define ComplexHostProgramTarget(program) @@\ + CC=cc @@\ + STD_INCLUDES= @@\ + CFLAGS=$(TOP_INCLUDES) $(INCLUDES) $(BOOTSTRAPCFLAGS) @@\ +EXTRA_LOAD_FLAGS= @@\ + PROGRAM = program @@\ + @@\ +AllTarget(program) @@\ + @@\ +program: $(OBJS) $(DEPLIBS) @@\ + RemoveTargetProgram($@) @@\ + HostLinkRule($@,$(_NOOP_),$(OBJS),$(DEPLIBS) $(LOCAL_LIBRARIES)) @@\ + @@\ +DependTarget() @@\ + @@\ +LintTarget() @@\ + @@\ +clean:: @@\ + RemoveFile(ProgramTargetName(program)) +#endif /* ComplexHostProgramTarget */ + +#ifndef SimpleHostProgramTarget +#define SimpleHostProgramTarget(program) @@\ + SRCS = program.c @@\ + @@\ + CC=cc @@\ + STD_INCLUDES= @@\ + CFLAGS=$(TOP_INCLUDES) $(INCLUDES) $(BOOTSTRAPCFLAGS) @@\ +EXTRA_LOAD_FLAGS= @@\ + PROGRAM = program @@\ + @@\ +AllTarget(program) @@\ + @@\ +program: program.o $(DEPLIBS) @@\ + RemoveTargetProgram($@) @@\ + HostLinkRule($@,$(_NOOP_),program.o,$(DEPLIBS) $(LOCAL_LIBRARIES)) @@\ + @@\ +DependTarget() @@\ + @@\ +LintTarget() @@\ + @@\ +clean:: @@\ + RemoveFile(ProgramTargetName(program)) +#endif /* SimpleHostProgramTarget */ Index: xc/config/cf/kdrive.cf diff -u xc/config/cf/kdrive.cf:1.3 xc/config/cf/kdrive.cf:1.8 --- xc/config/cf/kdrive.cf:1.3 Fri Mar 31 17:55:14 2000 +++ xc/config/cf/kdrive.cf Fri Dec 8 17:09:39 2000 @@ -1,4 +1,4 @@ -XCOMM $XFree86: xc/config/cf/kdrive.cf,v 1.3 2000/03/31 22:55:14 dawes Exp $ +XCOMM $XFree86: xc/config/cf/kdrive.cf,v 1.8 2000/12/08 22:09:39 keithp Exp $ /* * This configuration file contains all of the configuration * information for the XFree86 based X Servers. @@ -28,11 +28,25 @@ #ifndef XItsyServer #define XItsyServer NO #endif +#ifndef TinyXServer +#define TinyXServer NO +#endif +#ifndef XvesaServer +#define XvesaServer NO +#endif #if XItsyServer #include #endif +#if TinyXServer +#include +#endif + +#if CrossCompiling +#include +#endif + #define XprtServer NO #define BuildXIE NO #define BuildXInputExt NO @@ -43,6 +57,12 @@ #ifndef BuildPseudo8 #define BuildPseudo8 NO #endif +#ifndef BuildRender +#define BuildRender YES +#endif +#ifndef TouchScreen +#define TouchScreen NO +#endif /* * By default, build all of the fonts. @@ -152,6 +172,12 @@ FONTSERVERACCESS=-DNOFONTSERVERACCESS #endif +#if TouchScreen +#define TouchScreenDefines -DTOUCHSCREEN +#else +#define TouchScreenDefines /**/ +#endif + #if BuildPseudo8 #define Pseudo8Defines -DPSEUDO8 #else @@ -165,7 +191,7 @@ XF86COMSRC=. #undef ServerExtraDefines -#define ServerExtraDefines -DKDRIVESERVER -DGCCUSESGAS -DDDXOSINIT -DSMART_SCHEDULE $(FONTSERVERACCESS) Pseudo8Defines KdriveServerExtraDefines +#define ServerExtraDefines -DKDRIVESERVER -DGCCUSESGAS -DDDXOSINIT -DSMART_SCHEDULE $(FONTSERVERACCESS) Pseudo8Defines TouchScreenDefines KdriveServerExtraDefines #undef ServerOSDefines #define ServerOSDefines -DDDXOSINIT @@ -173,13 +199,13 @@ #define OtherIConfigFile $(IRULESRC)/kdrive.cf #endif -#if HasGcc2 && defined(i386Architecture) +#if defined(HasGcc2) && defined(i386Architecture) #ifndef DefaultGcc2i386Opt #define DefaultGcc2i386Opt -O2 -fno-strength-reduce #endif #endif -#if HasGcc2 && defined(AlphaArchitecture) +#if defined(HasGcc2) && defined(AlphaArchitecture) #ifndef DefaultGcc2AxpOpt #define DefaultGcc2AxpOpt -O2 #endif Index: xc/config/cf/linux.cf diff -u xc/config/cf/linux.cf:3.129 xc/config/cf/linux.cf:3.157 --- xc/config/cf/linux.cf:3.129 Sat Jun 24 13:43:44 2000 +++ xc/config/cf/linux.cf Thu Dec 14 12:00:46 2000 @@ -1,45 +1,50 @@ XCOMM platform: $TOG: linux.cf /main/47 1998/04/17 11:32:51 mgreess -XCOMM platform: $XFree86: xc/config/cf/linux.cf,v 3.129 2000/06/24 17:43:44 dawes Exp $ + + + + +XCOMM platform: $XFree86: xc/config/cf/linux.cf,v 3.157 2000/12/14 17:00:46 dawes Exp $ + #ifndef LinuxElfDefault -#define LinuxElfDefault YES +# define LinuxElfDefault YES #endif #ifndef UseElfFormat -#define UseElfFormat LinuxElfDefault +# define UseElfFormat LinuxElfDefault #endif #ifndef OSBinaryType -#if UseElfFormat -#define OSBinaryType [ELF] -#else -#ifdef AlphaArchitecture -#define OSBinaryType [ECOFF] -#else -#define OSBinaryType [a.out] -#endif -#endif +# if UseElfFormat +# define OSBinaryType [ELF] +# else +# ifdef AlphaArchitecture +# define OSBinaryType [ECOFF] +# else +# define OSBinaryType [a.out] +# endif +# endif #endif #ifndef OSName -#define OSName DefaultOSName OSBinaryType +# define OSName DefaultOSName OSBinaryType #endif #ifndef OSVendor -#define OSVendor /**/ +# define OSVendor /**/ #endif #ifndef OSMajorVersion -#define OSMajorVersion DefaultOSMajorVersion +# define OSMajorVersion DefaultOSMajorVersion #endif #ifndef OSMinorVersion -#define OSMinorVersion DefaultOSMinorVersion +# define OSMinorVersion DefaultOSMinorVersion #endif #ifndef OSTeenyVersion -#define OSTeenyVersion DefaultOSTeenyVersion +# define OSTeenyVersion DefaultOSTeenyVersion #endif -#ifndef LinuxDistribution -#define LinuxDistribution DefaultLinuxDistribution +#ifndef LinuxDistribution +# define LinuxDistribution DefaultLinuxDistribution /* Add "#define LinuxDistribution Linux" to your site.def or host.def. Currently only LinuxSuSE, LinuxRedHat and LinuxDebian will be figured out @@ -61,26 +66,99 @@ */ #endif #ifndef LinuxDistName -#define LinuxDistName DefaultLinuxDistName +# define LinuxDistName DefaultLinuxDistName #endif #ifndef LinuxCLibMajorVersion -#define LinuxCLibMajorVersion DefaultLinuxCLibMajorVersion +# define LinuxCLibMajorVersion DefaultLinuxCLibMajorVersion #endif #ifndef LinuxCLibMinorVersion -#define LinuxCLibMinorVersion DefaultLinuxCLibMinorVersion +# define LinuxCLibMinorVersion DefaultLinuxCLibMinorVersion #endif #ifndef LinuxCLibTeenyVersion -#define LinuxCLibTeenyVersion DefaultLinuxCLibTeenyVersion +# define LinuxCLibTeenyVersion DefaultLinuxCLibTeenyVersion #endif #ifndef LinuxBinUtilsMajorVersion -#define LinuxBinUtilsMajorVersion DefaultLinuxBinUtilsMajorVersion +# define LinuxBinUtilsMajorVersion DefaultLinuxBinUtilsMajorVersion #endif XCOMM operating system: OSName (OSMajorVersion./**/OSMinorVersion./**/OSTeenyVersion) XCOMM libc: (LinuxCLibMajorVersion./**/LinuxCLibMinorVersion./**/LinuxCLibTeenyVersion) XCOMM binutils: (LinuxBinUtilsMajorVersion) +#if LinuxDistribution == LinuxDebian +#ifdef DebianMaintainer +#define XFree86Devel YES +#endif +#define HasTk YES +#define TkLibDir /usr/lib +#define TkIncDir /usr/include +#define TkLibName tk8.3 +#define XF86SetupUsesStaticTk NO +#define HasTcl YES +#define TclLibDir /usr/lib +#define TclIncDir /usr/include +#define TclLibName tcl8.3 +#define XF86SetupUsesStaticTcl NO +/* un-comment this when it is un-broken */ +/* #define JoystickSupport YES */ +#define InstallXinitConfig YES +#define InstallXdmConfig YES +#define InstallFSConfig YES +#ifdef DebianMaintainer +#define HasXdmAuth YES +#endif +#define DebuggableLibraries YES +#define ForceNormalLib YES +#define BuildSpecsDocs YES +#define SpecsDocDirs CTEXT GL ICCCM X11 Xext Xv i18n xterm +/* right now glide only works on i386 */ +#ifdef i386Architecture +#ifdef DebianMaintainer +#define HasGlide2 YES +#endif +#define Glide2IncDir /usr/include/glide +#ifdef DebianMaintainer +#define HasGlide3 YES +#endif +#define Glide3IncDir /usr/include/glide3 +#endif +#define XAppLoadDir EtcX11Directory/app-defaults +#define XFileSearchPathDefault Concat4(EtcX11Directory/%L/%T/%N%C,%S:EtcX11Directory/%l/%T/%N%C,%S:EtcX11Directory/%T/%N%C,%S:EtcX11Directory/%L/%T/%N%S:EtcX11Directory/%l/%T/%N%S:EtcX11Directory/%T/%N%S):Concat4($(LIBDIR)/%L/%T/%N%C,%S:$(LIBDIR)/%l/%T/%N%C,%S:$(LIBDIR)/%T/%N%C,%S:$(LIBDIR)/%L/%T/%N%S:$(LIBDIR)/%l/%T/%N%S:$(LIBDIR)/%T/%N%S) +#ifdef DebianMaintainer +/* the relative symlink created by this rule causes problems for us */ +#if InstallAppDefFiles +#define InstallAppDefaultsLong(file,class) @@\ +InstallNamedTarget(install,file.ad,$(INSTAPPFLAGS),$(XAPPLOADDIR),class) +#else +#define InstallAppDefaultsLong(file,class) @@\ +InstallNamedTargetNoClobber(install,file.ad,$(INSTAPPFLAGS),$(XAPPLOADDIR),class) +#endif /* InstallAppDefFiles */ +#endif +#ifdef DebianMaintainer +#define BuilderEMailAddr "submit@bugs.debian.org" +#endif +#define SharedLibXdmGreet YES +#define LinkGLToUsrInclude NO +#define LinkGLToUsrLib NO +#define SharedLibFont NO +#define SharedLibXft NO +#define SharedLibXrender NO +#define HasZlib YES +#define SharedLibGlu YES +#define NormalLibGlu YES +#define BuildRman NO +#define BuildHtmlManPages NO +#define FSUseSyslog YES +#ifndef HasKatmaiSupport +#define HasKatmaiSupport NO +#endif +#endif + +#if LinuxDistribution == LinuxRedHat +#define FSUseSyslog YES +#endif + /* * The Linux BinUtils major version. 25 => 2.5.x, which is what is included * with Slackware 3.0 @@ -89,99 +167,103 @@ * */ #ifndef BinUtilsMajorVersion -#define BinUtilsMajorVersion LinuxBinUtilsMajorVersion +# define BinUtilsMajorVersion LinuxBinUtilsMajorVersion #endif #if (LinuxCLibMajorVersion >= 6 || LinuxDistribution == LinuxSuSE) -#define LinuxLocaleDefines /**/ +# define LinuxLocaleDefines /**/ #else -#define LinuxLocaleDefines -DX_LOCALE +# define LinuxLocaleDefines -DX_LOCALE #endif -#if LinuxDistribution == LinuxDebian -#define LinuxAdditionalIncludes -I/usr/src/linux/include -#else -#define LinuxAdditionalIncludes /**/ +#ifndef LinuxAdditionalIncludes +# define LinuxAdditionalIncludes /**/ #endif #ifndef LinuxGnuSourceDefines -#ifdef UseInstalled -#define LinuxGnuSourceDefines /**/ -#else -#define LinuxGnuSourceDefines -D_GNU_SOURCE -#endif +# ifdef UseInstalled +# define LinuxGnuSourceDefines /**/ +# else +# define LinuxGnuSourceDefines -D_GNU_SOURCE +# endif #endif #if LinuxCLibMajorVersion >= 6 -#define LinuxSourceDefines -D_POSIX_C_SOURCE=199309L \ +# define LinuxSourceDefines -D_POSIX_C_SOURCE=199309L \ -D_POSIX_SOURCE -D_XOPEN_SOURCE \ -D_BSD_SOURCE -D_SVID_SOURCE \ LinuxAdditionalIncludes LinuxGnuSourceDefines \ LinuxLocaleDefines -#define XawI18nDefines -DHAS_WCHAR_H -DHAS_WCTYPE_H -DNO_WIDEC_H -#ifndef ia64Architecture -#define HasPosixThreads YES -#define ThreadedX YES -#define HasThreadSafeAPI YES -#define ThreadsLibraries -lpthread -#define SystemMTDefines -D_REENTRANT -#endif /* ia64Architecture */ -#ifndef HasLibCrypt -#define HasLibCrypt YES -#endif +# define XawI18nDefines -DHAS_WCHAR_H -DHAS_WCTYPE_H -DNO_WIDEC_H +# define HasPosixThreads YES +# define ThreadedX YES +# define HasThreadSafeAPI YES +# define ThreadsLibraries -lpthread +# define SystemMTDefines -D_REENTRANT +# ifndef HasLibCrypt +# define HasLibCrypt YES +# endif /* netscape wraps select but not poll as of communicator 4.72 */ -#ifndef HasPoll -#define HasPoll NO -#endif +# ifndef HasPoll +# define HasPoll NO +# endif #else -#define LinuxSourceDefines -D_POSIX_SOURCE -D_POSIX_C_SOURCE=2 \ +# define LinuxSourceDefines -D_POSIX_SOURCE -D_POSIX_C_SOURCE=2 \ -D_BSD_SOURCE -D_SVID_SOURCE \ LinuxGnuSourceDefines LinuxLocaleDefines -#define XawI18nDefines -DUSE_XWCHAR_STRING -DUSE_XMBTOWC -#ifndef HasLibCrypt -#define HasLibCrypt NO +# define XawI18nDefines -DUSE_XWCHAR_STRING -DUSE_XMBTOWC +# ifndef HasLibCrypt +# define HasLibCrypt NO +# endif #endif + +/* support mainly for USB support */ +#ifndef HasLinuxInput +# if OSMajorVersion > 2 || (OSMajorVersion == 2 && OSMinorVersion >= 4) +# define HasLinuxInput YES +# endif #endif /* On x86, determine whether to build with MTRR support */ #ifndef HasMTRRSupport -#ifdef i386Architecture +# ifdef i386Architecture /* There is no certain way to know if is available, - but it made it into kernel 2.2, so... */ -#if OSMajorVersion > 2 || (OSMajorVersion == 2 && OSMinorVersion >= 2) -#define HasMTRRSupport YES -#else -#define HasMTRRSupport NO -#endif -#else -#define HasMTRRSupport NO /* no for non-ix86 */ -#endif + but it made it into kernel 2.2, so... */ +# if OSMajorVersion > 2 || (OSMajorVersion == 2 && OSMinorVersion >= 2) +# define HasMTRRSupport YES +# else +# define HasMTRRSupport NO +# endif +# else +# define HasMTRRSupport NO /* no for non-ix86 */ +# endif #endif #ifndef XF86INT10_BUILD # ifdef i386Architecture -# define XF86INT10_BUILD X86VM -# elif defined(ia64Architecture) -# define UseX86Emu NO -# define XF86INT10_BUILD XF86INT10_STUB -# elif defined(X86EMU_LIBPATH) -# define XF86INT10_BUILD X86EMU_GENERIC +# define XF86INT10_BUILD X86VM +# else +# define XF86INT10_BUILD X86EMU_GENERIC # endif #endif /* The DRM module requires kernel services that appeared in late 2.1.x kernels and are known to be present in 2.2.x kernels. */ #ifndef BuildXF86DRI -# if defined(i386Architecture) +# if defined(i386Architecture) || defined(ia64Architecture) # if OSMajorVersion > 2 || (OSMajorVersion == 2 && OSMinorVersion >= 2) -# define BuildXF86DRI YES +# define BuildXF86DRI YES # else -# define BuildXF86DRI NO +# define BuildXF86DRI NO # endif # elif defined(SparcArchitecture) -# define BuildXF86DRI YES +# define BuildXF86DRI YES +# elif defined(AlphaArchitecture) +# define BuildXF86DRI YES +# elif defined(PpcArchitecture) +# define BuildXF86DRI NO # else -# define BuildXF86DRI NO +# define BuildXF86DRI NO # endif #endif @@ -191,59 +273,103 @@ kernel revisions. So, we'll only build the module for kernels that are known to be supported by the module. */ #ifndef BuildXF86DRM -# ifdef i386Architecture +# if defined(i386Architecture) || defined(ia64Architecture) # if OSMajorVersion == 2 /* Only tested for Linux 2.2.0 through 2.2.12 */ # if OSMinorVersion == 2 && OSTeenyVersion <= 12 -# define BuildXF86DRM YES +# define BuildXF86DRM YES # else /* Only tested for Linux 2.3.0 through 2.3.18 */ # if OSMinorVersion == 3 && OSTeenyVersion <= 18 -# define BuildXF86DRM YES +# define BuildXF86DRM YES # else /* Note: add more conditions when 2.4.x and 2.5.x are released */ -# define BuildXF86DRM NO +# define BuildXF86DRM NO # endif # endif # else /* Note: add more conditions when 3.0.x and 3.1.x are released */ -# define BuildXF86DRM NO +# define BuildXF86DRM NO # endif # else -# define BuildXF86DRM NO +# define BuildXF86DRM NO # endif #endif #ifndef HasAgpGart -# ifdef i386Architecture +# if defined(i386Architecture) || defined(ia64Architecture) /* The AGPGART header file is included in os-support/linux, which allows all drivers that depend on AGP to build properly. */ -# define HasAgpGart YES +# define HasAgpGart YES +# else +# define HasAgpGart NO +# endif +#endif + +/* Support for Intel's Katmai Native Instructions, also known as the + * Streaming SIMD Extensions, was introduced in the 2.4.x kernels. + */ +#ifndef HasKatmaiSupport +# ifdef i386Architecture +# if OSMajorVersion > 2 || (OSMajorVersion == 2 && OSMinorVersion >= 4) +# define HasKatmaiSupport YES +# else +# define HasKatmaiSupport NO +# endif # else -# define HasAgpGart NO +# define HasKatmaiSupport NO # endif #endif /* + * Support for MMX isn't present in the Assembler used in Red Hat 4.2, so + * don't enable it for libc5 as a reasonable default. + */ +#ifndef HasMMXSupport +# ifdef i386Architecture +# if (LinuxCLibMajorVersion > 5) +# define HasMMXSupport YES +# else +# define HasMMXSupport NO +# endif +# else +# define HasMMXSupport NO +# endif +#endif + +/* + * Support for 3DNow isn't present in the Assembler used in Red Hat 4.2, so + * don't enable it for libc5 as a reasonable default. + * + * XXX This is preliminary. + */ +#ifndef Has3DNowSupport +# ifdef i386Architecture +# if (LinuxCLibMajorVersion > 5) +# define Has3DNowSupport YES +# else +# define Has3DNowSupport NO +# endif +# else +# define Has3DNowSupport NO +# endif +#endif + +/* * The Rush extension support. */ #ifndef BuildXF86RushExt -#define BuildXF86RushExt YES +# define BuildXF86RushExt YES #endif #ifndef LinuxFBDevSupport -#define LinuxFBDevSupport YES +# define LinuxFBDevSupport YES #endif /* For compatibility */ #define SourceDefines LinuxSourceDefines #define BuildLibPathVar LD_LIBRARY_PATH -#define HasGcc YES -#define HasGcc2 YES -#ifndef HasGcc2ForCplusplus -# define HasGcc2ForCplusplus YES -#endif #define GccUsesGas YES #define UseGas YES #define GnuCpp YES @@ -290,226 +416,267 @@ #define UseStaticTermcapLib NO #endif +#ifndef HasCookieMaker +#define HasCookieMaker YES +#define MkCookieCmd mcookie +#endif + +#ifndef BourneShell +/* + * This will cause builds/installs to terminate on errors, as on other + * platforms. + */ +#define BourneShell /bin/sh -e +#endif + #define MkdirHierCmd mkdir -p + #if LinuxElfDefault -#if UseElfFormat -# ifdef MipsArchitecture +# if UseElfFormat +# ifdef MipsArchitecture +# ifndef AsCmd +# define AsCmd gcc -c -x assembler-with-cpp +# endif +# ifndef DoLoadableServer +# define DoLoadableServer NO +# endif +# endif /* MipsArchitecure */ +# ifndef CcCmd +# define CcCmd gcc +# endif # ifndef AsCmd -# define AsCmd gcc -c -x assembler-with-cpp +# define AsCmd as # endif -# ifndef DoLoadableServer -# define DoLoadableServer NO +# ifndef LdCmd +# define LdCmd ld # endif -# endif /* MipsArchitecure */ -#ifndef CcCmd -#define CcCmd gcc -#endif -#ifndef AsCmd -#define AsCmd as -#endif -#ifndef LdCmd -#define LdCmd ld -#endif -#define AsmDefines -D__ELF__ -#define CplusplusCmd c++ -#ifndef LinuxUsesNcurses -#if LinuxCLibMajorVersion >= 6 || (LinuxDistribution == LinuxSuSE) -#define LinuxUsesNcurses YES -#else -#define LinuxUsesNcurses NO -#endif -#endif -#ifndef TermcapLibrary -#if UseStaticTermcapLib -#if LinuxUsesNcurses -#define TermcapLibrary StaticLibrary(/usr/lib,ncurses) -#else -#define TermcapLibrary StaticLibrary(/usr/lib/termcap,termcap) -#endif -#else -#if LinuxUsesNcurses -#define TermcapLibrary -lncurses -#else -#define TermcapLibrary -ltermcap -#endif -#endif -#endif -#else -#ifdef AlphaArchitecture -#define CcCmd gcc -b alpha-linuxecoff -#define CplusplusCmd g++ -b alpha-linuxecoff -#define AsCmd /usr/alpha-linuxecoff/bin/as -#define LdCmd /usr/alpha-linuxecoff/bin/ld -m alpha -#define AsmDefines -DUSE_GAS -U__ELF__ -#endif /* AlphaArchitecture */ -#ifdef ia64Architecture -#define CcCmd gcc -#define CplusplusCmd g++ -#define AsCmd as -#define LdCmd ld -#define AsmDefines -DUSE_GAS -U__ELF__ -#endif /* ia64Architecture */ -#ifdef i386Architecture -#define CcCmd gcc -b i486-linuxaout -#define CplusplusCmd g++ -b i486-linuxaout -#define AsCmd /usr/i486-linuxaout/bin/as -#define LdCmd /usr/i486-linuxaout/bin/ld -m i386linux -#define AsmDefines -DUSE_GAS -U__ELF__ -#endif /* i386Architecture */ -#ifdef Mc68020Architecture -#define CcCmd gcc -b m68k-linuxaout -#define CplusplusCmd g++ -b m68k-linuxaout -#define AsCmd /usr/m68k-linuxaout/bin/as -#define LdCmd /usr/m68k-linuxaout/bin/ld -m m68klinux -#define AsmDefines -DUSE_GAS -U__ELF__ -#endif /* Mc68020Architecture */ -#endif -#else -#if UseElfFormat -#ifdef AlphaArchitecture -#define CcCmd gcc -b alpha-linux -#define AsCmd /usr/alpha-linux/bin/as -#define LdCmd ld -m elf64alpha -#define AsmDefines -D__ELF__ -#define CplusplusCmd c++ -b alpha-linux -#endif /* AlphaArchitecture */ -#ifdef ia64Architecture -#define CcCmd gcc -#define CplusplusCmd g++ -#define AsCmd as -#define LdCmd ld -#define AsmDefines -D__ELF__ -#endif /* ia64Architecture */ -#ifdef i386Architecture -#define CcCmd gcc -b i486-linux -#define AsCmd /usr/i486-linux/bin/as -#define LdCmd ld -m elf_i386 -#define AsmDefines -D__ELF__ -#define CplusplusCmd c++ -b i486-linux -#endif /* i386Architecture */ -#ifdef Mc68020Architecture -#define CcCmd gcc -b m68k-linux -#define AsCmd /usr/m68k-linux/bin/as -#define LdCmd ld -m m68kelf -#define AsmDefines -D__ELF__ -#define CplusplusCmd c++ -b m68k-linux -#endif /* Mc68020Architecture */ +# define AsmDefines -D__ELF__ +# define CplusplusCmd c++ +# ifndef LinuxUsesNcurses +# if LinuxCLibMajorVersion >= 6 || (LinuxDistribution == LinuxSuSE) +# define LinuxUsesNcurses YES +# else +# define LinuxUsesNcurses NO +# endif +# endif +# ifndef TermcapLibrary +# if UseStaticTermcapLib +# if LinuxUsesNcurses +# define TermcapLibrary StaticLibrary(/usr/lib,ncurses) +# else +# define TermcapLibrary StaticLibrary(/usr/lib/termcap,termcap) +# endif +# else +# if LinuxUsesNcurses +# define TermcapLibrary -lncurses +# else +# define TermcapLibrary -ltermcap +# endif +# endif +# endif +# else +# ifdef AlphaArchitecture +# define CcCmd gcc -b alpha-linuxecoff +# define CplusplusCmd g++ -b alpha-linuxecoff +# define AsCmd /usr/alpha-linuxecoff/bin/as +# define LdCmd /usr/alpha-linuxecoff/bin/ld -m alpha +# define AsmDefines -DUSE_GAS -U__ELF__ +# endif /* AlphaArchitecture */ +# ifdef ia64Architecture +# define CcCmd gcc +# define CplusplusCmd g++ +# define AsCmd as +# define LdCmd ld +# define AsmDefines -DUSE_GAS -U__ELF__ +# endif /* ia64Architecture */ +# ifdef i386Architecture +# define CcCmd gcc -b i486-linuxaout +# define CplusplusCmd g++ -b i486-linuxaout +# define AsCmd /usr/i486-linuxaout/bin/as +# define LdCmd /usr/i486-linuxaout/bin/ld -m i386linux +# define AsmDefines -DUSE_GAS -U__ELF__ +# endif /* i386Architecture */ +# ifdef Mc68020Architecture +# define CcCmd gcc -b m68k-linuxaout +# define CplusplusCmd g++ -b m68k-linuxaout +# define AsCmd /usr/m68k-linuxaout/bin/as +# define LdCmd /usr/m68k-linuxaout/bin/ld -m m68klinux +# define AsmDefines -DUSE_GAS -U__ELF__ +# endif /* Mc68020Architecture */ +# endif #else -#define CcCmd gcc -#define AsCmd as -#define LdCmd ld -#define AsmDefines -DUSE_GAS -#endif +# if UseElfFormat +# ifdef AlphaArchitecture +# define CcCmd gcc -b alpha-linux +# define AsCmd /usr/alpha-linux/bin/as +# define LdCmd ld -m elf64alpha +# define AsmDefines -D__ELF__ +# define CplusplusCmd c++ -b alpha-linux +# endif /* AlphaArchitecture */ +# ifdef ia64Architecture +# define CcCmd gcc +# define CplusplusCmd g++ +# define AsCmd as +# define LdCmd ld +# define AsmDefines -D__ELF__ +# endif /* ia64Architecture */ +# ifdef i386Architecture +# define CcCmd gcc -b i486-linux +# define AsCmd /usr/i486-linux/bin/as +# define LdCmd ld -m elf_i386 +# define AsmDefines -D__ELF__ +# define CplusplusCmd c++ -b i486-linux +# endif /* i386Architecture */ +# ifdef Mc68020Architecture +# define CcCmd gcc -b m68k-linux +# define AsCmd /usr/m68k-linux/bin/as +# define LdCmd ld -m m68kelf +# define AsmDefines -D__ELF__ +# define CplusplusCmd c++ -b m68k-linux +# endif /* Mc68020Architecture */ +# else +# define CcCmd gcc +# define AsCmd as +# define LdCmd ld +# define AsmDefines -DUSE_GAS +# endif #endif #if UseElfFormat -#ifndef DoLoadableServer -#define DoLoadableServer YES -#endif +# ifndef DoLoadableServer +# define DoLoadableServer YES +# endif #endif #ifndef CppCmd -#define CppCmd /lib/cpp +# define CppCmd /lib/cpp #endif /* Some Linux distributions have yacc, some don't. All have bison. */ #define YaccCmd bison -y #define LexCmd flex -l +#define HasFlex YES #define LexLib -lfl #define PreProcessCmd CcCmd -E #define PostIncDir DefaultGccIncludeDir #define LdCombineFlags -r #ifndef LdPostLib -#define LdPostLib /* Never needed */ +# define LdPostLib /* Never needed */ #endif #define HasWChar32 YES #define StandardCppOptions -traditional #define StandardCppDefines StandardDefines #define HasVarRun YES -#define VarDbDirectory /var/state +#define VarDbDirectory $(VARDIR)/lib #ifndef XF86OSCardDrivers -#define XF86OSCardDrivers v4l +# define XF86OSCardDrivers v4l #endif -#ifdef i386Architecture -#define OptimizedCDebugFlags DefaultGcc2i386Opt -#define LinuxMachineDefines -D__i386__ -#define ServerOSDefines XFree86ServerOSDefines -DDDXTIME -DPART_NET -#define ServerExtraDefines -DGCCUSESGAS XFree86ServerDefines #if UseElfFormat -#define HasPlugin YES -#define VendorHasX11R6_3libXext YES /* XC or XFree86 >= 3.3.1 */ +# define HasPlugin YES +# define VendorHasX11R6_3libXext YES /* XC or XFree86 >= 3.3.1 */ #endif + +#ifdef i386Architecture +# define OptimizedCDebugFlags DefaultGcc2i386Opt +# define LinuxMachineDefines -D__i386__ +# define ServerOSDefines XFree86ServerOSDefines -DDDXTIME -DPART_NET +# define ServerExtraDefines -DGCCUSESGAS XFree86ServerDefines #endif /* i386Architecture */ -#ifdef AlphaArchitecture -#define OptimizedCDebugFlags DefaultGcc2AxpOpt -#define LinuxMachineDefines -D__alpha__ +#ifdef s390Architecture +#define OptimizedCDebugFlags -O2 +#define LinuxMachineDefines -D__s390__ #define ServerOSDefines XFree86ServerOSDefines -DDDXTIME -DPART_NET -#define ServerExtraDefines -DGCCUSESGAS XFree86ServerDefines -D_XSERVER64 +#define ServerExtraDefines -DGCCUSESGAS XFree86ServerDefines +#endif /* s390Architecture */ + +#ifdef AlphaArchitecture +# define OptimizedCDebugFlags DefaultGcc2AxpOpt +# define LinuxMachineDefines -D__alpha__ +# define ServerOSDefines XFree86ServerOSDefines -DDDXTIME -DPART_NET +# define ServerExtraDefines -DGCCUSESGAS XFree86ServerDefines -D_XSERVER64 +# ifdef UseCompaqMathLibrary +# define MathLibrary -lcpml -lm +# endif #endif /* AlphaArchitecture */ +#ifdef Arm32Architecture +# define DefaultCCOptions -fsigned-char +# define OptimizedCDebugFlags -O3 +# define LinuxMachineDefines -D__arm__ -U__arm -Uarm +# define ServerOSDefines XFree86ServerOSDefines -DDDXTIME -DPART_NET +# define ServerExtraDefines -DGCCUSEGAS XFree86ServerDefines +#endif /* Arm32Achitecture */ + #ifdef ia64Architecture -#define OptimizedCDebugFlags -O2 -#define LinuxMachineDefines -D__ia64__ -#define ServerOSDefines XFree86ServerOSDefines -DDDXTIME -DPART_NET -#define ServerExtraDefines -DGCCUSESGAS XFree86ServerDefines -D_XSERVER64 -#define DoLoadableServer NO +# define OptimizedCDebugFlags -O2 +# define LinuxMachineDefines -D__ia64__ +# define ServerOSDefines XFree86ServerOSDefines -DDDXTIME -DPART_NET +# define ServerExtraDefines -DGCCUSESGAS XFree86ServerDefines -D_XSERVER64 #endif /* ia64Architecture */ #ifdef Mc68020Architecture -#define OptimizedCDebugFlags -O2 -#define LinuxMachineDefines -D__mc68000__ -#define ServerOSDefines XFree86ServerOSDefines -DDDXTIME -DPART_NET -#define ServerExtraDefines -DGCCUSESGAS XFree86ServerDefines -#define PositionIndependentCFlags -fpic -#define PositionIndependentCplusplusFlags -fpic +# define OptimizedCDebugFlags -O2 +# define LinuxMachineDefines -D__mc68000__ +# define ServerOSDefines XFree86ServerOSDefines -DDDXTIME -DPART_NET +# define ServerExtraDefines -DGCCUSESGAS XFree86ServerDefines +# define PositionIndependentCFlags -fpic +# define PositionIndependentCplusplusFlags -fpic #endif /* Mc68020Architecture */ #ifdef PpcArchitecture -#define DefaultCCOptions -fsigned-char -#define OptimizedCDebugFlags -O2 -#define LinuxMachineDefines -D__powerpc__ -#define ServerOSDefines XFree86ServerOSDefines -DDDXTIME -DPART_NET -#define ServerExtraDefines -DGCCUSESGAS XFree86ServerDefines +# define DefaultCCOptions -fsigned-char +# define OptimizedCDebugFlags -O2 +# define LinuxMachineDefines -D__powerpc__ +# define ServerOSDefines XFree86ServerOSDefines -DDDXTIME -DPART_NET +# define ServerExtraDefines -DGCCUSESGAS XFree86ServerDefines #endif /* PpcArchitecture */ #ifdef SparcArchitecture -#define OptimizedCDebugFlags -O2 -#define LinuxMachineDefines -D__sparc__ -#define ServerOSDefines XFree86ServerOSDefines -DDDXTIME -DPART_NET -#define ServerExtraDefines -DGCCUSESGAS XFree86ServerDefines -#define AsVISOption -Av9a -#ifdef Sparc64Architecture -#define AsOutputArchSize 64 -#else -#define AsOutputArchSize 32 -#endif +# define OptimizedCDebugFlags -O2 +# define LinuxMachineDefines -D__sparc__ +# define ServerOSDefines XFree86ServerOSDefines -DDDXTIME -DPART_NET +# define ServerExtraDefines -DGCCUSESGAS XFree86ServerDefines +# define AsVISOption -Av9a +# ifdef Sparc64Architecture +# define AsOutputArchSize 64 +# else +# define AsOutputArchSize 32 +# endif #endif #ifdef MipsArchitecture -#define OptimizedCDebugFlags -O2 -#define LinuxMachineDefines -D__mips__ -#define ServerOSDefines XFree86ServerOSDefines -DDDXTIME -DPART_NET -#define ServerExtraDefines -DGCCUSESGAS XFree86ServerDefines -#endif +# define OptimizedCDebugFlags -O2 +# define LinuxMachineDefines -D__mips__ +# define ServerOSDefines XFree86ServerOSDefines -DDDXTIME -DPART_NET +# define ServerExtraDefines -DGCCUSESGAS XFree86ServerDefines +#endif #ifndef StandardDefines -#define StandardDefines -Dlinux LinuxMachineDefines LinuxSourceDefines +# define StandardDefines -Dlinux LinuxMachineDefines LinuxSourceDefines #endif #if UseElfFormat -#define DlLibrary -rdynamic -ldl +# define DlLibrary -rdynamic -ldl #else -#define DlLibrary /**/ +# define DlLibrary /**/ #endif #define ServerExtraSysLibs /**/ +#ifndef PamLibraries +#define PamLibraries -lpam DlLibrary +#endif + +#ifndef PamMiscLibraries +#define PamMiscLibraries -lpam_misc +#endif + #if HasDECnet -#define ConnectionFlags -DUNIXCONN -DTCPCONN -DDNETCONN -#define ExtraLibraries -ldnet +# define ConnectionFlags -DUNIXCONN -DTCPCONN -DDNETCONN +# define ExtraLibraries -ldnet #else -#define ConnectionFlags -DUNIXCONN -DTCPCONN +# define ConnectionFlags -DUNIXCONN -DTCPCONN #endif /* Some of these man page defaults are overriden in the above OS sections */ @@ -533,18 +700,18 @@ #endif #ifndef StaticLibrary -#define StaticLibrary(libpath,libname) -Wl,-Bstatic Concat(-L,libpath) Concat(-l,libname) -Wl,-Bdynamic +# define StaticLibrary(libpath,libname) -Wl,-Bstatic Concat(-L,libpath) Concat(-l,libname) -Wl,-Bdynamic #endif #ifndef LinkGLToUsrLib -#define LinkGLToUsrLib YES +# define LinkGLToUsrLib YES #endif -#ifndef LinkGLToUsrInclude -#define LinkGLToUsrInclude YES +# ifndef LinkGLToUsrInclude +# define LinkGLToUsrInclude YES #endif -#define HasGnuMake YES +#define HasGnuMake YES #define MakeNamedTargetSubdir(dir,flags,subname)\ $(MAKE) -C dir $(MFLAGS) $(PARALLELMFLAGS) flags subname @@ -554,13 +721,17 @@ #define TtClientLibs $(TTLIB) $(XTOOLLIB) $(XLIB) #define TtClientDepLibs $(DEPTTLIB) $(DEPXTOOLLIB) $(DEPXLIB) +#ifdef S390Architecture +# define HasXServer NO +#endif + #include #ifdef KDriveXServer -#include +# include #else -#include +# include #endif #ifndef XFree86ServerOSDefines -#define XFree86ServerOSDefines +# define XFree86ServerOSDefines #endif Index: xc/config/cf/lnxdoc.rules diff -u xc/config/cf/lnxdoc.rules:3.19 xc/config/cf/lnxdoc.rules:3.22 --- xc/config/cf/lnxdoc.rules:3.19 Sat Feb 26 00:19:44 2000 +++ xc/config/cf/lnxdoc.rules Sun Dec 17 21:43:27 2000 @@ -1,4 +1,4 @@ -XCOMM $XFree86: xc/config/cf/lnxdoc.rules,v 3.19 2000/02/26 05:19:44 dawes Exp $ +XCOMM $XFree86: xc/config/cf/lnxdoc.rules,v 3.22 2000/12/18 02:43:27 dawes Exp $ XCOMM XCOMM Rules for formatting Linuxdoc-SGML documentation XCOMM @@ -81,22 +81,28 @@ */ #ifndef UpdateFormattedDoc -#define UpdateFormattedDoc(textfile) @@\ +#define UpdateFormattedDoc(textfile,dstdir) @@\ update.docs:: textfile @@\ - -@if [ -f $(FORMATTEDDIR)/textfile ]; then \ @@\ + -@if [ -f dstdir/textfile ]; then \ @@\ if [ "$(FORCEUPDATE)" = yes ]; then set -x; \ @@\ - cp textfile $(FORMATTEDDIR)/textfile; \ @@\ - echo "" >> $(FORMATTEDDIR)/textfile; \ @@\ - echo "\$$XFree86\$$" >> $(FORMATTEDDIR)/textfile; \ @@\ + if [ "$(FOLLOWLINK)" = no ]; then \ @@\ + $(RM) dstdir/textfile; \ @@\ + fi; \ @@\ + cp textfile dstdir/textfile; \ @@\ + echo "" >> dstdir/textfile; \ @@\ + echo "\$$XFree86\$$" >> dstdir/textfile; \ @@\ else \ @@\ $(RM) __tmp1__ __tmp2__; \ @@\ grep "Generated from XFree86:" textfile > __tmp1__; \ @@\ - grep "Generated from XFree86:" $(FORMATTEDDIR)/textfile > __tmp2__; \ @@\ - if diff __tmp1__ __tmp2__ > /dev/null 2>&1; then :; \ @@\ + grep "Generated from XFree86:" dstdir/textfile > __tmp2__; \ @@\ + if diff __tmp1__ __tmp2__ > /dev/null 2>&1; then :; \ @@\ else set -x; \ @@\ - cp textfile $(FORMATTEDDIR)/textfile ; \ @@\ - echo "" >> $(FORMATTEDDIR)/textfile; \ @@\ - echo "\$$XFree86\$$" >> $(FORMATTEDDIR)/textfile; \ @@\ + if [ "$(FOLLOWLINK)" = no ]; then \ @@\ + $(RM) dstdir/textfile; \ @@\ + fi; \ @@\ + cp textfile dstdir/textfile ; \ @@\ + echo "" >> dstdir/textfile; \ @@\ + echo "\$$XFree86\$$" >> dstdir/textfile; \ @@\ fi; \ @@\ fi; \ @@\ fi @@\ @@ -107,7 +113,7 @@ LinuxDocSgmlToText(sgmlfile,textfile) @@\ LinuxDocSgmlToHtml(sgmlfile,base) @@\ LinuxDocSgmlToPs(sgmlfile,base) @@\ -UpdateFormattedDoc(textfile) +UpdateFormattedDoc(textfile,$(FORMATTEDDIR)) #define LinuxDocReadmeTarget(base) @@\ LinuxDocTargetLong(base.sgml,ReadmeFile(base),base) Index: xc/config/cf/lnxdoc.tmpl diff -u xc/config/cf/lnxdoc.tmpl:3.10 xc/config/cf/lnxdoc.tmpl:3.11 --- xc/config/cf/lnxdoc.tmpl:3.10 Sun Jul 4 04:31:00 1999 +++ xc/config/cf/lnxdoc.tmpl Tue Sep 26 11:56:27 2000 @@ -1,8 +1,12 @@ -XCOMM $XFree86: xc/config/cf/lnxdoc.tmpl,v 3.10 1999/07/04 08:31:00 dawes Exp $ +XCOMM $XFree86: xc/config/cf/lnxdoc.tmpl,v 3.11 2000/09/26 15:56:27 tsi Exp $ XCOMM #ifndef HasSgmlFmt #define HasSgmlFmt NO +#endif + +#ifndef HasLinuxDoc +#define HasLinuxDoc NO #endif #ifndef DoSgmlDocs Index: xc/config/cf/lynx.cf diff -u xc/config/cf/lynx.cf:3.37 xc/config/cf/lynx.cf:3.40 --- xc/config/cf/lynx.cf:3.37 Tue Jun 20 16:07:56 2000 +++ xc/config/cf/lynx.cf Thu Dec 14 12:13:05 2000 @@ -1,4 +1,4 @@ -XCOMM platform: $XFree86: xc/config/cf/lynx.cf,v 3.37 2000/06/20 20:07:56 dawes Exp $ +XCOMM platform: $XFree86: xc/config/cf/lynx.cf,v 3.40 2000/12/14 17:13:05 dawes Exp $ #ifndef OSName @@ -18,15 +18,13 @@ #endif XCOMM operating system: OSName (OSMajorVersion./**/OSMinorVersion./**/OSTeenyVersion) - -#define HasGcc YES +#ifndef HasGcc2 +#define HasGcc2 NO +#endif #if OSMajorVersion > 2 || (OSMajorVersion == 2 && OSMinorVersion > 2) -# define HasGcc2 YES # ifndef HasGcc2ForCplusplus # define HasGcc2ForCplusplus YES # endif -#else -# define HasGcc2 NO #endif #ifndef HasGcc2ForCplusplus # define HasGcc2ForCplusplus YES @@ -50,6 +48,9 @@ #ifndef HasPosixRegex #define HasPosixRegex NO #endif +#ifndef HasPerl +#define HasPerl NO +#endif #if OSMajorVersion == 3 && OSMinorVersion == 1 # ifndef UseSmartScheduler # define UseSmartScheduler NO @@ -127,6 +128,7 @@ #else # define LexLib /**/ #endif +#define HasFlex YES /* On LynxOS AT 2.3.0 /lib/libm.a is a symbolic link to /lib/libc.a, so we * screw up some POSIX functionality when -lm comes before -lc_p in our * ld argument list. For LynxOS-AT we don't need -lm but for others we Index: xc/config/cf/mach.cf diff -u xc/config/cf/mach.cf:3.10 xc/config/cf/mach.cf:3.11 --- xc/config/cf/mach.cf:3.10 Sat Mar 20 20:44:59 1999 +++ xc/config/cf/mach.cf Fri Jul 7 16:06:56 2000 @@ -2,7 +2,7 @@ -XCOMM platform: $XFree86: xc/config/cf/mach.cf,v 3.10 1999/03/21 01:44:59 dawes Exp $ +XCOMM platform: $XFree86: xc/config/cf/mach.cf,v 3.11 2000/07/07 20:06:56 tsi Exp $ #define OSName Mach 2.5/3.0 #define OSVendor /**/ @@ -10,26 +10,16 @@ #define OSMajorVersion 1 #define OSMinorVersion 1 -#define HasGcc YES -#define HasGcc2 YES #define GccUsesGas YES #define UseGas YES #define GnuCpp YES #define UseGccMakeDepend YES -#ifndef HasGcc2ForCplusplus -#define HasGcc2ForCplusplus YES -#endif #define CcCmd gcc #define CppCmd /usr/mach3/lib/gcc-lib/i386-mach/2.3.3/cpp #define PreProcessCmd /usr/mach3/lib/gcc-lib/i386-mach/2.3.3/cpp #define DefaultCCOptions /**/ #define GccGasOption -DGCCUSESGAS -#if HasGcc2 && defined(i386Architecture) -#define OptimizedCDebugFlags DefaultGcc2i386Opt -#else -#define OptimizedCDebugFlags -O2 -#endif #define AsmDefines -DUSE_GAS #define BootstrapCFlags -DNOSTDHDRS Index: xc/config/cf/nto.cf diff -u xc/config/cf/nto.cf:1.2 xc/config/cf/nto.cf:1.3 --- xc/config/cf/nto.cf:1.2 Sun Dec 26 19:45:43 1999 +++ xc/config/cf/nto.cf Fri Jul 7 16:06:56 2000 @@ -1,4 +1,4 @@ -/* $XFree86: xc/config/cf/nto.cf,v 1.2 1999/12/27 00:45:43 robin Exp $ */ +/* $XFree86: xc/config/cf/nto.cf,v 1.3 2000/07/07 20:06:56 tsi Exp $ */ /* Get X to build using the gcc toolchain, from QNX4 */ /* Let us try to separate the x86 stuff out of here as well... */ @@ -32,8 +32,6 @@ #define SourceDefines -D_POSIX_SOURCE #define CrossCompiling YES -#define HasGcc YES -#define HasGcc2 YES #define DoRanlibCmd YES #define GccUsesGas YES #define MkdirHierCmd mkdir -p Index: xc/config/cf/os2.cf diff -u xc/config/cf/os2.cf:3.29 xc/config/cf/os2.cf:3.31 --- xc/config/cf/os2.cf:3.29 Wed Apr 5 14:13:08 2000 +++ xc/config/cf/os2.cf Thu Nov 30 18:29:57 2000 @@ -2,7 +2,7 @@ -XCOMM platform: $XFree86: xc/config/cf/os2.cf,v 3.29 2000/04/05 18:13:08 dawes Exp $ +XCOMM platform: $XFree86: xc/config/cf/os2.cf,v 3.31 2000/11/30 23:29:57 dawes Exp $ #define OSName OS/2 #define OSVendor IBM @@ -127,10 +127,7 @@ /* * Compiler Features */ -#define HasGcc YES -#define HasGcc2 YES #define HasCplusplus YES -#define HasGcc2ForCplusplus YES #define GccUsesGas YES #define UseGas YES #define GnuCpp YES @@ -185,6 +182,7 @@ #define RanlibCmd ar s #define BourneShell /**/ #define LexCmd flex -l +#define HasFlex YES #define LexLib -lfl #define YaccCmd yacc #define LintCmd /**/ Index: xc/config/cf/os2Lib.tmpl diff -u xc/config/cf/os2Lib.tmpl:3.9 xc/config/cf/os2Lib.tmpl:3.10 --- xc/config/cf/os2Lib.tmpl:3.9 Wed Apr 5 14:13:10 2000 +++ xc/config/cf/os2Lib.tmpl Tue Aug 8 22:57:20 2000 @@ -2,7 +2,7 @@ -XCOMM $XFree86: xc/config/cf/os2Lib.tmpl,v 3.9 2000/04/05 18:13:10 dawes Exp $ +XCOMM $XFree86: xc/config/cf/os2Lib.tmpl,v 3.10 2000/08/09 02:57:20 tsi Exp $ /* * OS2/EMX shared library template @@ -68,7 +68,6 @@ #define SharedDpsRev /**/ #define SharedDpsTkRev /**/ #define SharedPSResRev /**/ -#define SharedXantiRev /**/ #define SharedGlxRev /**/ #define SharedXfontcacheRev /**/ #define SharedXauRev /**/ Index: xc/config/cf/sun.cf diff -u xc/config/cf/sun.cf:3.52 xc/config/cf/sun.cf:3.54 --- xc/config/cf/sun.cf:3.52 Tue Jun 20 18:08:36 2000 +++ xc/config/cf/sun.cf Mon Dec 11 17:34:21 2000 @@ -3,7 +3,7 @@ -XCOMM platform: $XFree86: xc/config/cf/sun.cf,v 3.52 2000/06/20 22:08:36 dawes Exp $ +XCOMM platform: $XFree86: xc/config/cf/sun.cf,v 3.54 2000/12/11 22:34:21 dawes Exp $ #ifndef OSName # define OSName DefaultOSName @@ -157,8 +157,13 @@ #ifdef i386Architecture # if OSMajorVersion > 4 -# define ServerExtraDefines AllocateLocalDefines XFree86ServerDefines \ +# if OSMinorVersion >= 8 +# define ServerExtraDefines AllocateLocalDefines XFree86ServerDefines \ + -D__EXTENSIONS__ -D__SOL8__ +# else +# define ServerExtraDefines AllocateLocalDefines XFree86ServerDefines \ -D__EXTENSIONS__ +# endif # define ServerOSDefines XFree86ServerOSDefines # else # define ServerExtraDefines AllocateLocalDefines @@ -168,6 +173,15 @@ # define ServerExtraDefines AllocateLocalDefines # define ServerOSDefines -DDDXOSINIT # define HasPlugin YES +#endif + +#ifndef HasPerl +/* Solaris 8 comes with perl. Earlier versions don't. */ +# if (OSMajorVersion == 5) && (OSMinorVersion >= 8) +# define HasPerl YES +# else +# define HasPerl NO +# endif #endif #define XkbServerDefines -DXKB_ALWAYS_USES_SOFT_REPEAT Index: xc/config/cf/svr4.cf diff -u xc/config/cf/svr4.cf:3.40 xc/config/cf/svr4.cf:3.42 --- xc/config/cf/svr4.cf:3.40 Fri Jun 16 21:40:39 2000 +++ xc/config/cf/svr4.cf Mon Dec 11 17:34:22 2000 @@ -1,5 +1,5 @@ XCOMM $TOG: svr4.cf /main/17 1997/06/08 20:08:31 kaleb $ -XCOMM $XFree86: xc/config/cf/svr4.cf,v 3.40 2000/06/17 01:40:39 dawes Exp $ +XCOMM $XFree86: xc/config/cf/svr4.cf,v 3.42 2000/12/11 22:34:22 dawes Exp $ /* * A default OS name */ @@ -143,7 +143,7 @@ #endif #endif #ifndef LogDirectory -#define LogDirectory /var/adm +#define LogDirectory $(VARDIR)/adm #endif #endif @@ -152,6 +152,10 @@ #endif #ifndef HasGcc #define HasGcc HasGcc2 +#endif + +#ifndef HasPerl +#define HasPerl NO #endif #ifdef i386Architecture Index: xc/config/cf/usl.cf diff -u xc/config/cf/usl.cf:3.19 xc/config/cf/usl.cf:3.21 --- xc/config/cf/usl.cf:3.19 Tue Feb 15 11:55:09 2000 +++ xc/config/cf/usl.cf Mon Dec 11 17:34:24 2000 @@ -3,7 +3,7 @@ -XCOMM platform: $XFree86: xc/config/cf/usl.cf,v 3.19 2000/02/15 16:55:09 dawes Exp $ +XCOMM platform: $XFree86: xc/config/cf/usl.cf,v 3.21 2000/12/11 22:34:24 dawes Exp $ #ifndef OSName # define OSName DefaultOSName @@ -44,7 +44,11 @@ #define XawI18nDefines -DHAS_WCHAR_H -DHAS_ISW_FUNCS #endif #if OSMajorVersion > 1 || OSTeenyVersion > 1 -# define ExtraLibraries -lsocket -lnsl -lgen -lw +# if OSMajorVersion >= 7 +# define ExtraLibraries -lsocket -lnsl -lgen +# else +# define ExtraLibraries -lsocket -lnsl -lgen -lw +# endif # define ThreadedX YES # define HasThreadSafeAPI NO /* UnixWare does not have MT-safe pwd routines. */ @@ -56,6 +60,15 @@ # define DefaultCCOptions -W0,-2A -Xa -Dasm=__asm #endif #define BuildLibPathVar LD_LIBRARY_PATH + +/* UnixWare 7.x comes with perl. */ +#ifndef HasPerl +# if OSMajorVersion >= 7 +# define HasPerl YES +# else +# define HasPerl NO +# endif +#endif #ifndef UseExportLists # define UseExportLists YES Index: xc/config/cf/xf86.rules diff -u xc/config/cf/xf86.rules:3.31 xc/config/cf/xf86.rules:3.32 --- xc/config/cf/xf86.rules:3.31 Fri Mar 31 17:55:15 2000 +++ xc/config/cf/xf86.rules Mon Oct 30 18:02:06 2000 @@ -1,5 +1,5 @@ XCOMM $XConsortium: xf86.rules /main/9 1996/10/31 14:54:26 kaleb $ -XCOMM $XFree86: xc/config/cf/xf86.rules,v 3.31 2000/03/31 22:55:15 dawes Exp $ +XCOMM $XFree86: xc/config/cf/xf86.rules,v 3.32 2000/10/30 23:02:06 tsi Exp $ /* * These rules are needed to build the XFree86 X Servers @@ -111,7 +111,10 @@ DRIVERS="drivers"; \ @@\ if [ x"$$DRIVERS" != x ]; then \ @@\ for i in $$DRIVERS; do \ @@\ - echo $$i/$${i}_drv.o >> list; \ @@\ + DRIVER="$$i/*_drv.o"; \ @@\ + for j in $$DRIVER; do \ @@\ + echo $$j >> list; \ @@\ + done; \ @@\ done; \ @@\ else \ @@\ echo "" > list; \ @@\ Index: xc/config/cf/xf86.tmpl diff -u xc/config/cf/xf86.tmpl:3.25 xc/config/cf/xf86.tmpl:3.27 --- xc/config/cf/xf86.tmpl:3.25 Sat Aug 14 06:48:59 1999 +++ xc/config/cf/xf86.tmpl Fri Aug 4 12:13:15 2000 @@ -2,8 +2,15 @@ -XCOMM $XFree86: xc/config/cf/xf86.tmpl,v 3.25 1999/08/14 10:48:59 dawes Exp $ +XCOMM $XFree86: xc/config/cf/xf86.tmpl,v 3.27 2000/08/04 16:13:15 eich Exp $ +#ifdef BuilderEMailAddr +BUILDERADDR = BuilderEMailAddr +#else +BUILDERADDR = "xfree86@xfree86.org" +#endif +BUGMSG = -DBUILDERADDR='$(BUILDERADDR)' + #if XF86DriverSDK BUILDMODULEDIR = $(DRIVERSDKMODULEDIR) BUILDMODULETOP = .. @@ -38,8 +45,12 @@ #if defined(IHaveModules) && MakeDllModules MODULE_CFLAGS = $(PICFLAGS) #endif -#if defined(IHaveModules) && DoLoadableServer -MODULE_DEFINES = -DIN_MODULE +#if defined(IHaveModules) +# if DoLoadableServer +MODULE_DEFINES = -DIN_MODULE -DXFree86Module +# else +MODULE_DEFINES = -DXFree86Module +# endif #endif #if defined(IHaveModules) && DoLoadableServer && defined(OS2Architecture) Index: xc/config/cf/xf86site.def diff -u xc/config/cf/xf86site.def:3.162 xc/config/cf/xf86site.def:3.170 --- xc/config/cf/xf86site.def:3.162 Wed May 31 03:14:52 2000 +++ xc/config/cf/xf86site.def Thu Dec 14 11:38:45 2000 @@ -1,4 +1,4 @@ -XCOMM $XFree86: xc/config/cf/xf86site.def,v 3.162 2000/05/31 07:14:52 eich Exp $ +XCOMM $XFree86: xc/config/cf/xf86site.def,v 3.170 2000/12/14 16:38:45 dawes Exp $ /******************************************************************************/ /* * This file is to provide a quick method for most people to change the @@ -252,11 +252,12 @@ * modules will be built. * #define XF86CardDrivers mga glint nv tga s3virge sis rendition \ - neomagic i740 tdfx \ + neomagic i740 tdfx savage \ cirrus tseng trident chips apm \ - GlideDriver fbdev \ - ati r128 AgpGartDrivers cyrix \ - vga XF86OSCardDrivers XF86ExtraCardDrivers + GlideDriver fbdev i128 \ + ati AgpGartDrivers DevelDrivers ark cyrix \ + siliconmotion \ + vesa vga XF86OSCardDrivers XF86ExtraCardDrivers */ /* @@ -267,6 +268,48 @@ */ /* + * There are three parameters that determine where and how the Matrox HAL + * library is used: + * + * HaveMatroxHal -- You have the HALlib.a binary library installed + * in xfree86/drivers/mga/HALlib, and you want it to + * be used. + * Default: NO + * + * BuildMatroxHal -- You have the source for the HALlib library (installed + * in xfree86/drivers/mga/hallib), and want to build and + * use it. + * Default: NO + * + * UseMatroxHal -- You want to build support for loading/using the HAL + * library into the mga driver. For module server builds + * you don't need to have the HALlib library to do this. + * but you want to build support for loading it and using + * it into the mga driver module. + * Default: YES for loadable server build + * (HaveMatroxHal || BuildMatroxHal) for static + */ + +/* + * To disable use of the Matrox HAL library, uncomment this: + * +#define UseMatroxHal NO + */ + +/* + * If you have the HALlib.a binary installed in xfree86/drivers/mga/HALlib, + * uncomment this: + * +#define HaveMatroxHal YES + */ + +/* + * If you have the HALlib source code installed in xfree86/drivers/mga/hallib, + * uncomment this: +#define BuildMatroxHal YES + */ + +/* * Build XAA. This can be disabled with: * #define XF86XAA NO @@ -315,6 +358,13 @@ */ /* + * To link the X server with a dynamic version of the Xfont library, + * uncomment this. + * +#define XserverStaticFontLib NO + */ + +/* * To disable building the font server, uncomment this. * #define BuildFontServer NO @@ -648,7 +698,7 @@ * the docs that XFree86 has changed or added. * #define BuildSpecsDocs YES -#define SpecsDocDirs GL Xext Xv xterm +#define SpecsDocDirs CTEXT GL ICCCM X11 Xext Xmu Xv i18n xterm */ /* Index: xc/config/cf/xfree86.cf diff -u xc/config/cf/xfree86.cf:3.300 xc/config/cf/xfree86.cf:3.338 --- xc/config/cf/xfree86.cf:3.300 Fri Jun 30 15:30:15 2000 +++ xc/config/cf/xfree86.cf Thu Dec 14 11:59:06 2000 @@ -1,4 +1,4 @@ -XCOMM $XFree86: xc/config/cf/xfree86.cf,v 3.300 2000/06/30 19:30:15 dawes Exp $ +XCOMM $XFree86: xc/config/cf/xfree86.cf,v 3.338 2000/12/14 16:59:06 dawes Exp $ /* * This configuration file contains all of the configuration * information for the XFree86 based X Servers. @@ -16,6 +16,10 @@ # define XFree86Devel NO #endif +#ifndef BuildDebug +# define BuildDebug YES +#endif + /* * settings for the config file parser */ @@ -26,6 +30,9 @@ #ifndef XConfigDir #define XConfigDir $(LIBDIR) #endif +#ifndef XLogFile +#define XLogFile XFree86 +#endif /* * Default settings for which X Servers to build. @@ -34,14 +41,21 @@ /* XInput drivers */ #ifndef XInputDrivers #if 1 -#define XInputDrivers mouse dynapro elographics microtouch mutouch \ - wacom void +#define XInputDrivers mouse digitaledge dynapro elographics \ + microtouch mutouch spaceorb summa \ + wacom void citron #else -#define XInputDrivers mouse dynapro elo2300 elographics magellan \ - microtouch mutouch spaceorb wacom void +#define XInputDrivers mouse digitaledge dynapro elo2300 \ + elographics magellan citron \ + microtouch mutouch spaceorb summa wacom void #endif #endif +/* support mainly for USB support */ +#ifndef HasLinuxInput +# define HasLinuxInput NO +#endif + /* OS.cf files may set this for OS-specific drivers */ #ifndef XF86OSCardDrivers #define XF86OSCardDrivers /**/ @@ -64,11 +78,50 @@ #define GlideDriver /**/ #endif +/* + * There are three parameters that determine where and how the Matrox HAL + * library is used: + * + * HaveMatroxHal -- You have the HALlib.a binary library installed + * in xfree86/drivers/mga/HALlib, and you want it to + * be used. + * Default: NO + * + * BuildMatroxHal -- You have the source for the HALlib library (installed + * in xfree86/drivers/mga/hallib), and want to build and + * use it. + * Default: NO + * + * UseMatroxHal -- You want to build support for loading/using the HAL + * library into the mga driver. For module server builds + * you don't need to have the HALlib library to do this. + * but you want to build support for loading it and using + * it into the mga driver module. + * Default: YES for loadable server build + * (HaveMatroxHal || BuildMatroxHal) for static + */ + +#ifndef HaveMatroxHal +#define HaveMatroxHal NO +#endif + +#ifndef BuildMatroxHal +#define BuildMatroxHal NO +#endif + +#ifndef UseMatroxHal +#if DoLoadableServer +#define UseMatroxHal YES +#else +#define UseMatroxHal (HaveMatroxHal || BuildMatroxHal) +#endif +#endif + /* - * For Intel x86 platforms, the default is to build all modules which + * For Intel platforms, the default is to build all modules which * are supported on this platform. */ -#ifdef i386Architecture +#if defined(i386Architecture) || defined(ia64Architecture) # ifndef XF86Server # define XF86Server YES # endif @@ -138,11 +191,7 @@ # define XF86AFB YES # endif -/* - * XXX Should change this to allow such drivers to be built without agpgart - * support (when it is useful to do so). - */ -# if HasAgpGart +# if HasAgpGart || XFree86Devel # define AgpGartDrivers i810 # else # define AgpGartDrivers /**/ @@ -160,28 +209,33 @@ /* Pure PCI drivers should go first */ # ifndef XF86CardDrivers # define XF86CardDrivers mga glint nv tga s3virge sis rendition \ - neomagic i740 tdfx \ + neomagic i740 tdfx savage \ cirrus tseng trident chips apm \ - GlideDriver fbdev \ - ati r128 AgpGartDrivers DevelDrivers cyrix \ - vga XF86OSCardDrivers XF86ExtraCardDrivers + GlideDriver fbdev i128 \ + ati AgpGartDrivers DevelDrivers ark cyrix \ + siliconmotion \ + vesa vga XF86OSCardDrivers XF86ExtraCardDrivers # endif #endif -/* IA-64 */ +/* Sparc drivers */ -#ifdef ia64Architecture +#if defined(SparcArchitecture) && !defined(LynxOSArchitecture) && !defined(NetBSDArchitecture) && !defined(OpenBSDArchitecture) && !defined(SunArchitecture) # ifndef XF86Server -# define XF86Server YES +# define XF86Server YES # endif /* 1bpp module */ # ifndef XF1Bpp -# define XF1Bpp YES +# define XF1Bpp YES # endif /* 4bpp module */ # ifndef XF4Bpp # define XF4Bpp YES # endif +/* 8/32wid fb module */ +# ifndef XF8_32Wid +# define XF8_32Wid YES +# endif /* 8/32bpp overlay module */ # ifndef XF8_32Bpp # define XF8_32Bpp YES @@ -198,17 +252,13 @@ # ifndef XFShadowFB # define XFShadowFB YES # endif -/* vgahw module */ -# ifndef XF86VgaHw -# define XF86VgaHw YES -# endif /* fbdevhw module */ # ifndef XF86FBDevHw # define XF86FBDevHw YES # endif /* XAA module */ # ifndef XF86XAA -# define XF86XAA YES +# define XF86XAA YES # endif /* ramdac module */ # ifndef XF86Ramdac @@ -226,46 +276,34 @@ # ifndef XF86RAC # define XF86RAC YES # endif - /* int10 module */ # ifndef XF86Int10 # define XF86Int10 YES # endif - -/* - * XXX Should change this to allow such drivers to be built without agpgart - * support (when it is useful to do so). - */ -# if HasAgpGart -# define AgpGartDrivers i810 -# else -# define AgpGartDrivers /**/ -# endif -/* Pure PCI drivers should go first */ +/* Pure SBUS and PCI drivers should go first */ # ifndef XF86CardDrivers -# define XF86CardDrivers mga vga +# define XF86CardDrivers sunffb sunleo suncg6 suncg3 suncg14 suntcx \ + sunbw2 ati glint fbdev \ + XF86OSCardDrivers XF86ExtraCardDrivers # endif + #endif -/* Sparc drivers */ +/* Mips drivers */ -#if defined(SparcArchitecture) && !defined(LynxOSArchitecture) && !defined(NetBSDArchitecture) && !defined(OpenBSDArchitecture) && !defined(SunArchitecture) +#ifdef MipsArchitecture # ifndef XF86Server -# define XF86Server YES +# define XF86Server YES # endif /* 1bpp module */ # ifndef XF1Bpp -# define XF1Bpp YES +# define XF1Bpp YES # endif /* 4bpp module */ # ifndef XF4Bpp # define XF4Bpp YES # endif -/* 8/32wid fb module */ -# ifndef XF8_32Wid -# define XF8_32Wid YES -# endif /* 8/32bpp overlay module */ # ifndef XF8_32Bpp # define XF8_32Bpp YES @@ -282,13 +320,17 @@ # ifndef XFShadowFB # define XFShadowFB YES # endif +/* vgahw module */ +# ifndef XF86VgaHw +# define XF86VgaHw YES +# endif /* fbdevhw module */ # ifndef XF86FBDevHw # define XF86FBDevHw YES # endif /* XAA module */ # ifndef XF86XAA -# define XF86XAA YES +# define XF86XAA YES # endif /* ramdac module */ # ifndef XF86Ramdac @@ -307,44 +349,13 @@ # define XF86RAC YES # endif -/* Pure SBUS and PCI drivers should go first */ -# ifndef XF86CardDrivers -# define XF86CardDrivers sunffb sunleo suncg6 suncg3 suncg14 suntcx \ - sunbw2 ati glint fbdev \ - XF86OSCardDrivers XF86ExtraCardDrivers -# endif - -#endif - -/* Mips drivers */ - -#ifdef MipsArchitecture -# ifndef XF86Server -# define XF86Server YES -# endif -/* shadow fb module */ -# ifndef XFShadowFB -# define XFShadowFB YES -# endif -/* XAA module */ -# ifndef XF86XAA -# define XF86XAA YES -# endif -/* ramdac module */ -# ifndef XF86Ramdac -# define XF86Ramdac YES -# endif -/* RAC (Resource Access Control) module */ -# ifndef XF86RAC -# define XF86RAC YES -# endif /* int10 module */ # ifndef XF86Int10 # define XF86Int10 YES # endif # ifndef XF86CardDrivers -# define XF86CardDrivers XF86OSCardDrivers XF86ExtraCardDrivers +# define XF86CardDrivers newport XF86OSCardDrivers XF86ExtraCardDrivers # endif #endif @@ -358,7 +369,7 @@ # endif /* 1bpp module */ # ifndef XF1Bpp -# define XF1Bpp NO +# define XF1Bpp YES # endif /* 4bpp module */ # ifndef XF4Bpp @@ -414,15 +425,24 @@ # define XF86Int10 YES # endif +# ifndef DevelDrivers +# if XFree86Devel +# define DevelDrivers ati +# else +# define DevelDrivers /* */ +# endif +# endif + /* Pure PCI drivers should go first */ # ifndef XF86CardDrivers # define XF86CardDrivers mga tdfx glint s3virge rendition tga \ - r128 vga XF86OSCardDrivers XF86ExtraCardDrivers + savage nv DevelDrivers siliconmotion vga \ + XF86OSCardDrivers XF86ExtraCardDrivers # endif #endif /* - * For Motorola 68k and PPC (currently Linux & LynxOS) + * For Motorola 68k and PPC (currently Linux, LynxOS and Net/OpenBSD) */ #if defined(PpcArchitecture) || defined(Mc68020Architecture) # ifndef XF86Server @@ -490,11 +510,20 @@ # define XF86Int10 YES # endif +# ifndef DevelDrivers +# if XFree86Devel +# define DevelDrivers ati +# else +# define DevelDrivers /* */ +# endif +# endif + /* Pure PCI drivers should go first */ # ifndef XF86CardDrivers -# define XF86CardDrivers r128 mga glint s3virge sis cirrus tseng \ +# define XF86CardDrivers mga glint s3virge sis savage\ trident chips fbdev \ - vga XF86OSCardDrivers XF86ExtraCardDrivers + DevelDrivers vga \ + XF86OSCardDrivers XF86ExtraCardDrivers # endif #endif @@ -503,12 +532,17 @@ * For Mips/Arc platforms, the default is to build all modules which * are supported on this platform. */ -# ifdef ArcArchitecture -# ifndef XF86Server -# define XF86Server YES +#ifdef ArcArchitecture +# ifndef XF86Server +# define XF86Server YES # endif #endif +#if BuildDebug +# define DebugDefines -DBUILDDEBUG +#else +# define DebugDefines /**/ +#endif /* * Fbdev module defines. They are set to indicate the fb types supported @@ -563,7 +597,7 @@ * The server-side of PEX is not 64-bit clean. */ #if !defined(BuildPexExt) -# if XF86Server && !defined(AlphaArchitecture) +# if XF86Server && !defined(AlphaArchitecture) && !defined(ia64Architecture) # define BuildPexExt YES # else # define BuildPexExt NO @@ -579,7 +613,11 @@ # define BuildGlxExt YES #endif -#ifdef BuildXF86DRI +#ifndef BuildXF86DRI +#define BuildXF86DRI NO +#endif + +#if BuildXF86DRI /* * One and ONLY one of the GlxBuiltIn* drivers can be defined to be YES. @@ -615,7 +653,7 @@ # define GlxDriverUsesMesa YES # endif -# if GlxBuiltInGamma || GlxBuiltInTdfx || GlxBuiltInMga || GlxBuiltInI810 || GlxBuiltInR128 || GlxBuiltInFfb || GlxBuiltInMesa +# if GlxBuiltInGamma || GlxBuiltInTdfx || GlxBuiltInMga || GlxBuiltInI810 || GlxBuiltInR128 || GlxBuiltInFfb || GlxBuiltInSIS || GlxBuiltInMesa # define GlxUseBuiltInDRIDriver YES # define DRIDynLoadDefines /**/ # else @@ -623,9 +661,6 @@ # define DRIDynLoadDefines -DGLX_USE_DLOPEN # endif -#else -/* BuildXF86DRI can defined to be YES only in an OS specific .cf file */ -# define BuildXF86DRI NO #endif /* @@ -658,10 +693,15 @@ # define GlxCoreLibDefines /**/ # endif -# if defined(SparcArchitecture) || defined(AlphaArchitecture) +# if defined(SparcArchitecture) || defined(ia64Architecture) # define GlxArchDefines -D__GLX_ALIGN64 # else -# define GlxArchDefines /**/ +# if defined(AlphaArchitecture) +/* On the Alpha we need to ensure floating point accuracy for 3D */ +# define GlxArchDefines -mieee +# else +# define GlxArchDefines /**/ +# endif # endif # ifndef GlxExtraDefines @@ -745,6 +785,11 @@ # define BuildXinerama YES #endif +/* Build Render extension */ +#ifndef BuildRender +# define BuildRender YES +#endif + #if 0 #ifndef JoystickSupport # define JoystickSupport NO @@ -770,9 +815,6 @@ #ifndef BuildXvLibrary # define BuildXvLibrary YES #endif -#ifndef BuildXantiLibrary -# define BuildXantiLibrary NO /* See the note for BuildXantiExt */ -#endif #ifndef BuildGLXLibrary # define BuildGLXLibrary YES #endif @@ -843,15 +885,6 @@ # define BuildXvExt YES #endif -/* - * Build the Antialiased Font Extension (this has been abandoned, at least - * temporarily) - */ -#ifndef BuildXantiExt -# define BuildXantiExt NO -#endif - - #if Malloc0ReturnsNull # ifndef XtMalloc0ReturnsNullDefines @@ -1041,6 +1074,7 @@ VidModeExtensionDefines \ ServerSnprintfDefines \ SmartScheduleDefines \ + DebugDefines \ -DX_BYTE_ORDER=ByteOrder #endif @@ -1128,10 +1162,6 @@ * Other stuff used in the X Server source. */ -#ifndef AsmDefines -# define AsmDefines /**/ -#endif - #ifndef OtherIConfigFiles # define OtherIConfigFiles $(IRULESRC)/xfree86.cf $(IRULESRC)/xf86.rules #endif @@ -1148,7 +1178,7 @@ * */ #ifndef XFree86Version -# define XFree86Version 4001 +# define XFree86Version 4002 #endif #ifndef XVendorString @@ -1234,6 +1264,28 @@ # define Egcs112Bug YES # else # define Egcs112Bug NO +# endif +#endif + +#ifdef i386Architecture +# ifndef HasMMXSupport +# define HasMMXSupport YES +# endif +# ifndef HasKatmaiSupport +# define HasKatmaiSupport NO +# endif +# ifndef Has3DNowSupport +# define Has3DNowSupport NO +# endif +#else +# ifndef HasMMXSupport +# define HasMMXSupport NO +# endif +# ifndef HasKatmaiSupport +# define HasKatmaiSupport NO +# endif +# ifndef Has3DNowSupport +# define Has3DNowSupport NO # endif #endif Index: xc/config/cf/xttMod.tmpl diff -u xc/config/cf/xttMod.tmpl:1.4 xc/config/cf/xttMod.tmpl:1.5 --- xc/config/cf/xttMod.tmpl:1.4 Sat Aug 14 06:49:00 1999 +++ xc/config/cf/xttMod.tmpl Thu Aug 24 18:20:06 2000 @@ -1,6 +1,6 @@ /* -*- Makefile -*- */ XCOMM Code converter template of X-TT -XCOMM $XFree86: xc/config/cf/xttMod.tmpl,v 1.4 1999/08/14 10:49:00 dawes Exp $ */ +XCOMM $XFree86: xc/config/cf/xttMod.tmpl,v 1.5 2000/08/24 22:20:06 tsi Exp $ */ #ifdef IHaveModules /* New designed XFree86 module */ @@ -63,7 +63,7 @@ $(CCONV_MODULE_FILE): $(OBJS) $(RM) $@~ - $(LD) -o $@~ $(SHLIBLDFLAGS) $(OBJS) $(REQUIREDLIBS) + $(CC) -o $@~ $(SHLIBLDFLAGS) $(OBJS) $(REQUIREDLIBS) $(RM) $@ $(MV) $@~ $@ Index: xc/config/imake/Makefile.ini diff -u xc/config/imake/Makefile.ini:3.5 xc/config/imake/Makefile.ini:3.9 --- xc/config/imake/Makefile.ini:3.5 Wed Jun 11 08:24:21 1997 +++ xc/config/imake/Makefile.ini Thu Oct 26 13:57:45 2000 @@ -7,7 +7,7 @@ # may be given at the top of the build tree for systems that do not define # any machine-specific preprocessor symbols. # -# $XFree86: xc/config/imake/Makefile.ini,v 3.5 1997/06/11 12:24:21 dawes Exp $ +# $XFree86: xc/config/imake/Makefile.ini,v 3.9 2000/10/26 17:57:45 dawes Exp $ BOOTSTRAPCFLAGS = CC = cc @@ -39,7 +39,9 @@ bootstrap: -@if [ -d bootstrap ]; then exit 0; else set -x; mkdir bootstrap; fi - $(MV) *.o imake bootstrap + $(MV) *.o bootstrap + @if [ -f imake.exe ]; then set -x; $(MV) imake.exe bootstrap; \ + elif [ -f imake ]; then set -x; $(MV) imake bootstrap; else exit 0; fi relink: $(RM) imake Index: xc/config/imake/imake.c diff -u xc/config/imake/imake.c:3.35 xc/config/imake/imake.c:3.40 --- xc/config/imake/imake.c:3.35 Mon Jun 12 22:28:27 2000 +++ xc/config/imake/imake.c Mon Nov 27 00:06:43 2000 @@ -8,7 +8,7 @@ * be passed to the template file. * * * ***************************************************************************/ -/* $XFree86: xc/config/imake/imake.c,v 3.35 2000/06/13 02:28:27 dawes Exp $ */ +/* $XFree86: xc/config/imake/imake.c,v 3.40 2000/11/27 05:06:43 dawes Exp $ */ /* * @@ -146,6 +146,7 @@ # include # include #endif +#include #include #include "Xosdefs.h" #ifndef X_NOT_STDC_ENV @@ -261,7 +262,7 @@ # define SYS_NMLN 257 # endif #endif -#ifdef linux +#if defined(linux) || defined(__GNU__) #include #include #endif @@ -993,13 +994,23 @@ static void get_libc_version(FILE *inFile) { - char *aout = tmpnam (NULL); + char aout[] = "/tmp/imakeXXXXXX"; FILE *fp; const char *format = "%s -o %s -x c -"; char *cc; int len; char *command; + /* Pre-create temp file safely */ + { + /* Linux + ELF has mkstemp() */ + int tmpfd; + if ((tmpfd = mkstemp(aout)) == -1) { + perror("mkstemp"); + abort(); + } + close(tmpfd); + } cc = getenv ("CC"); if (cc == NULL) cc = "gcc"; @@ -1133,12 +1144,25 @@ } #endif +#ifdef __GNUC__ +static void +get_gcc_version(FILE *inFile) +{ + fprintf (inFile, "#define HasGcc 1\n"); +#if __GNUC__ > 1 + fprintf (inFile, "#define HasGcc2 1\n"); +#endif + fprintf (inFile, "#define GccMajorVersion %d\n", __GNUC__); + fprintf (inFile, "#define GccMinorVersion %d\n", __GNUC_MINOR__); +} +#endif + #ifndef __EMX__ static void get_gcc_incdir(FILE *inFile) { static char* gcc_path[] = { -#if defined(linux) || defined(__OpenBSD__) +#if defined(linux) || defined(__OpenBSD__) || defined (__GNU__) "/usr/bin/cc", /* for Linux PostIncDir */ #endif "/usr/local/bin/gcc", @@ -1176,7 +1200,7 @@ { #if !defined(WIN32) && !defined(__EMX__) #if (defined(DEFAULT_OS_NAME) || defined(DEFAULT_OS_MAJOR_REV) || \ - defined(DEFAULT_OS_MINOR_REV) || defined(DEFAUL_OS_TEENY_REV)) + defined(DEFAULT_OS_MINOR_REV) || defined(DEFAULT_OS_TEENY_REV)) struct utsname name; char buf[SYS_NMLN * 5 + 1]; @@ -1237,6 +1261,9 @@ get_gcc_incdir(inFile); #if defined (sun) && defined(SVR4) get_sun_compiler_versions (inFile); +#endif +#ifdef __GNUC__ + get_gcc_version (inFile); #endif #ifdef __FreeBSD__ get_binary_format(inFile); Index: xc/config/imake/imakemdep.h diff -u xc/config/imake/imakemdep.h:3.39 xc/config/imake/imakemdep.h:3.45 --- xc/config/imake/imakemdep.h:3.39 Thu Jun 15 16:49:57 2000 +++ xc/config/imake/imakemdep.h Tue Nov 14 13:20:32 2000 @@ -20,7 +20,7 @@ in this Software without prior written authorization from The Open Group. */ -/* $XFree86: xc/config/imake/imakemdep.h,v 3.39 2000/06/15 20:49:57 dawes Exp $ */ +/* $XFree86: xc/config/imake/imakemdep.h,v 3.45 2000/11/14 18:20:32 dawes Exp $ */ /* @@ -171,13 +171,9 @@ #define imake_ccflags "-DSVR4" #endif -#ifdef MACH -#ifdef __GNU__ -#define imake_ccflags "" -#else +#if defined(MACH) && !defined(__GNU__) #define imake_ccflags "-DNOSTDHDRS" #endif -#endif /* this is for OS/2 under EMX. This won't work with DOS */ #if defined(__EMX__) @@ -227,6 +223,11 @@ #define FIXUP_CPP_WHITESPACE #endif +#if defined(__APPLE__) +#define DEFAULT_CPP "/usr/bin/cpp" +#endif + + #if defined(Lynx) /* On LynxOS 2.4.0 imake gets built with the old "legacy" * /bin/cc which has a rather pedantic builtin preprocessor. @@ -286,7 +287,7 @@ #if defined(__sgi) && defined(__ANSI_CPP__) #define USE_CC_E #endif -#ifdef MACH +#if defined(MACH) && !defined(__GNU__) #define USE_CC_E #endif #ifdef __minix_vmd @@ -296,8 +297,9 @@ /* expects cpp in PATH */ #define DEFAULT_CPP "cpp" #endif -#if defined(__GNU__) +#ifdef __CYGWIN__ #define USE_CC_E +#define DEFAULT_CC "gcc" #endif #if defined (__QNX__) #define DEFAULT_CPP "/usr/X11R6/bin/cpp" @@ -332,9 +334,30 @@ # ifdef __i386__ "-D__i386__", # endif +# ifdef __i486__ + "-D__i486__", +# endif +# ifdef __i586__ + "-D__i586__", +# endif +# ifdef __i686__ + "-D__i686__", +# endif +# ifdef __k6__ + "-D__k6__", +# endif +# ifdef __ia64__ + "-D__ia64__", +# endif +# ifdef __s390__ + "-D__s390__", +# endif # ifdef __alpha__ "-D__alpha__", # endif +# ifdef __arm__ + "-D__arm__", +# endif # ifdef __sparc__ "-D__sparc__", # endif @@ -537,6 +560,9 @@ #ifdef linux "-Dlinux", #endif +#if defined(__CYGWIN__) + "-traditional", +#endif #if defined(Lynx) || defined(__Lynx__) "-traditional", #if 0 @@ -628,6 +654,11 @@ #if defined(MIPS) "-DMIPS", #endif + +#if defined(__APPLE__) + "-D__DARWIN__", +#endif + #endif }; @@ -672,6 +703,12 @@ # define DEFAULT_OS_MINOR_REV "v %*d.%1s" # define DEFAULT_OS_TEENY_REV "v %*d.%*c%[.0-9]" # define DEFAULT_OS_NAME "srvm %[^\n]" +#elif defined(__APPLE__) +/* uname -v returns "x.yz" or "x.y.z", e.g. "2.02" or "2.1.2". */ +# define DEFAULT_OS_MAJOR_REV "r %[0-9]" +# define DEFAULT_OS_MINOR_REV "r %*d.%[0-9]" +# define DEFAULT_OS_TEENY_REV "r %*d.%*d.%[0-9]" /* this will just get 0 */ +# define DEFAULT_OS_NAME "s %[^\n]" #elif defined(__osf__) /* uname -r returns "Wx.y", e.g. "V3.2" or "T4.0" */ # define DEFAULT_OS_MAJOR_REV "r %*[^0-9]%[0-9]" @@ -688,6 +725,10 @@ # define DEFAULT_OS_MINOR_REV "r %*d.%[0-9]" # define DEFAULT_OS_TEENY_REV "r %*d.%*d.%[0-9]" # define DEFAULT_OS_NAME "srm %[^\n]" +#elif defined(__GNU__) +# define DEFAULT_OS_MAJOR_REV "r %[0-9]" +# define DEFAULT_OS_MINOR_REV "r %*d.%[0-9]" +# define DEFAULT_OS_NAME "srm %[^\n]" #elif defined(ISC) /* ISC all Versions ? */ /* uname -r returns "x.y", e.g. "3.2" ,uname -v returns "x" e.g. "2" */ @@ -1008,6 +1049,9 @@ #ifdef __NetBSD__ {"__NetBSD__", "1"}, #endif +#ifdef __GNU__ + {"__GNU__", "1"}, +#endif #ifdef __ELF__ {"__ELF__", "1"}, #endif @@ -1026,6 +1070,56 @@ # ifdef PowerMAX_OS {"PowerMAX_OS", "1"}, # endif +# ifdef ia64 + {"ia64", "1"}, +# endif +# ifdef __ia64__ + {"__ia64__", "1"}, +# endif +# ifdef __i386__ + {"__i386__", "1"}, +# endif +# ifdef __i486__ + {"__i486__", "1"}, +# endif +# ifdef __i586__ + {"__i586__", "1"}, +# endif +# ifdef __i686__ + {"__i686__", "1"}, +# endif +# ifdef __k6__ + {"__k6__", "1"}, +# endif +# ifdef i386 + {"i386", "1"}, +# endif +# ifdef i486 + {"i486", "1"}, +# endif +# ifdef i586 + {"i586", "1"}, +# endif +# ifdef i686 + { "i686", "1"}, +# endif +# ifdef k6 + {"k6", "1"}, +# endif +# ifdef __s390__ + {"__s390__", "1"}, +# endif +#if defined(__ppc__) + {"__ppc__", "1"}, +#endif +#if defined(__BIG_ENDIAN__) + {"__BIG_ENDIAN__", "1"}, +#endif +#if defined(__LITTLE_ENDIAN__) + {"__LITTLE_ENDIAN__", "1"}, +#endif + + /* add any additional symbols before this line */ {NULL, NULL} }; Index: xc/config/makedepend/def.h diff -u xc/config/makedepend/def.h:3.6 xc/config/makedepend/def.h:3.7 --- xc/config/makedepend/def.h:3.6 Sun Mar 21 02:34:25 1999 +++ xc/config/makedepend/def.h Tue Oct 24 14:07:35 2000 @@ -20,10 +20,11 @@ in this Software without prior written authorization from The Open Group. */ -/* $XFree86: xc/config/makedepend/def.h,v 3.6 1999/03/21 07:34:25 dawes Exp $ */ +/* $XFree86: xc/config/makedepend/def.h,v 3.7 2000/10/24 18:07:35 dawes Exp $ */ #include "Xos.h" #include "Xfuncproto.h" +#include #include #ifndef X_NOT_STDC_ENV #include Index: xc/config/makedepend/main.c diff -u xc/config/makedepend/main.c:3.16 xc/config/makedepend/main.c:3.17 --- xc/config/makedepend/main.c:3.16 Sun Mar 21 02:34:26 1999 +++ xc/config/makedepend/main.c Tue Nov 14 16:59:20 2000 @@ -20,7 +20,7 @@ in this Software without prior written authorization from The Open Group. */ -/* $XFree86: xc/config/makedepend/main.c,v 3.16 1999/03/21 07:34:26 dawes Exp $ */ +/* $XFree86: xc/config/makedepend/main.c,v 3.17 2000/11/14 21:59:20 dawes Exp $ */ #include "def.h" #ifdef hpux @@ -566,15 +566,16 @@ } continue; } -#if defined(WIN32) || defined(__EMX__) else if (*p == '/' && *(p+1) == '/') { /* consume comments */ *p++ = ' ', *p++ = ' '; while (*p && *p != '\n') *p++ = ' '; - lineno++; + if (*p == '\n') { + lineno++; + *p++ = ' '; + } continue; } -#endif else if (*p == '\\') { if (*(p+1) == '\n') { *p = ' '; Index: xc/config/pswrap/psw.c diff -u xc/config/pswrap/psw.c:1.5 xc/config/pswrap/psw.c:1.6 --- xc/config/pswrap/psw.c:1.5 Wed Jun 7 17:36:56 2000 +++ xc/config/pswrap/psw.c Tue Sep 26 11:56:27 2000 @@ -35,7 +35,7 @@ * * Author: Adobe Systems Incorporated */ -/* $XFree86: xc/config/pswrap/psw.c,v 1.5 2000/06/07 21:36:56 tsi Exp $ */ +/* $XFree86: xc/config/pswrap/psw.c,v 1.6 2000/09/26 15:56:27 tsi Exp $ */ /***********/ /* Imports */ @@ -99,9 +99,9 @@ dst = psw_malloc(strlen(src)+1) , \ strcpy(dst, src) -static int NumArgs(Args args) +static long NumArgs(Args args) { - register int n = 0; + register long n = 0; register Arg arg; register Item item; for (arg = args; arg; arg = arg->next) @@ -308,7 +308,7 @@ 0 doneTag printobject flush where doneTag = (last result parameter tag + 1). */ -static Body AppendResultFlush(Body body, int n) +static Body AppendResultFlush(Body body, long n) { Token t, token; char *ss; @@ -317,7 +317,7 @@ for (t = body; t->next; t = t->next) ; token = PSWToken(T_INT, 0L); - token->next = PSWToken(T_INT, (char *) n); + token->next = PSWToken(T_INT, (char *)(long)n); SafeStrCpy(ss, "printobject"); token->next->next = PSWToken(T_NAME, ss); @@ -851,10 +851,10 @@ switch (t->type) { case T_BOOLEAN: - fprintf(datafil, "DPS_LITERAL%cDPS_BOOL, 0, 0, %d", ATT_SEP, (int) t->val); + fprintf(datafil, "DPS_LITERAL%cDPS_BOOL, 0, 0, %d", ATT_SEP, (int)(long)t->val); break; case T_INT: - fprintf(datafil, "DPS_LITERAL%cDPS_INT, 0, 0, %d", ATT_SEP, (int) t->val); + fprintf(datafil, "DPS_LITERAL%cDPS_INT, 0, 0, %d", ATT_SEP, (int)(long)t->val); break; case T_FLOAT: fprintf(datafil, "DPS_LITERAL%cDPS_REAL, 0, 0, %s", ATT_SEP, (char *)t->val); @@ -1167,7 +1167,7 @@ static void EmitResultTagTableAssignments(Args outArgs) { - printf(" DPSSetResultTable(%s, _dpsR, %d);\n",ctxName,NumArgs(outArgs)); + printf(" DPSSetResultTable(%s, _dpsR, %ld);\n", ctxName, NumArgs(outArgs)); outlineno++; } Index: xc/config/pswrap/pswparser.y diff -u xc/config/pswrap/pswparser.y:1.4 xc/config/pswrap/pswparser.y:1.5 --- xc/config/pswrap/pswparser.y:1.4 Thu May 18 19:46:08 2000 +++ xc/config/pswrap/pswparser.y Tue Sep 26 11:56:28 2000 @@ -35,7 +35,7 @@ * * Author: Adobe Systems Incorporated */ -/* $XFree86: xc/config/pswrap/pswparser.y,v 1.4 2000/05/18 23:46:08 dawes Exp $ */ +/* $XFree86: xc/config/pswrap/pswparser.y,v 1.5 2000/09/26 15:56:28 tsi Exp $ */ /* * Not all yaccs understand this. @@ -54,7 +54,7 @@ %union { char *object; - int intobj; + long intobj; Token token; Item item; Header header; Index: xc/config/pswrap/pswstring.c diff -u xc/config/pswrap/pswstring.c:1.2 xc/config/pswrap/pswstring.c:1.3 --- xc/config/pswrap/pswstring.c:1.2 Thu May 18 19:46:09 2000 +++ xc/config/pswrap/pswstring.c Tue Sep 26 11:56:28 2000 @@ -35,9 +35,11 @@ * * Author: Adobe Systems Incorporated */ +/* $XFree86: xc/config/pswrap/pswstring.c,v 1.3 2000/09/26 15:56:28 tsi Exp $ */ #include #include +#include #include "pswpriv.h" #include "psw.h" Index: xc/config/util/Imakefile diff -u xc/config/util/Imakefile:3.28 xc/config/util/Imakefile:3.29 --- xc/config/util/Imakefile:3.28 Fri Mar 31 15:13:12 2000 +++ xc/config/util/Imakefile Wed Dec 6 10:35:01 2000 @@ -1,5 +1,5 @@ XCOMM $XConsortium: Imakefile /main/16 1996/11/13 14:43:28 lehors $ -XCOMM $XFree86: xc/config/util/Imakefile,v 3.28 2000/03/31 20:13:12 dawes Exp $ +XCOMM $XFree86: xc/config/util/Imakefile,v 3.29 2000/12/06 15:35:01 eich Exp $ #if UseCCMakeDepend MDEP_PROG = makedepend @@ -33,6 +33,11 @@ #ifndef Win32Architecture EXTRA_LIBRARIES = #endif +#ifdef LinuxArchitecture + PREPROCESSCMD_MKDEPEND = PreProcessCmd StandardCppDefines $(PROJECT_DEFINES) +#else + PREPROCESSCMD_MKDEPEND = $(PREPROCESSCMD) +#endif XCOMM Some compilers generate fatal errors if an -L directory does XCOMM not exist. Since BUILDLIBDIR may not exist yet suppress its use. @@ -59,7 +64,7 @@ #endif CppScriptTarget(xmkmf,xmkmf.cpp,-DCONFIGDIRSPEC='"'"-I$(CONFIGDIR)"'"',$(ICONFIGFILES)) -CppScriptTarget(makedepend,mdepend.cpp,-DPREPROC='"'"$(PREPROCESSCMD)"'"',$(ICONFIGFILES)) +CppScriptTarget(makedepend,mdepend.cpp,-DPREPROC='"'"$(PREPROCESSCMD_MKDEPEND)"'"',$(ICONFIGFILES)) CppScriptTarget(mergelib,mergelib.cpp,"-DARCMD=$(AR)" "-DRANLIB=$(RANLIB)",$(ICONFIGFILES)) #ifndef OS2Architecture CppScriptTarget(gccmakedep,gccmdep.cpp,-DCCCMD='"'"$(GCCCMD)"'"' -DRMCMD='"'"$(RM)"'"' -DLNCMD='"'"$(LN)"'"' -DMVCMD='"'"$(MV)"'"',$(ICONFIGFILES)) Index: xc/config/util/gccmdep.cpp diff -u xc/config/util/gccmdep.cpp:3.3 xc/config/util/gccmdep.cpp:3.5 --- xc/config/util/gccmdep.cpp:3.3 Sat Feb 24 20:16:15 1996 +++ xc/config/util/gccmdep.cpp Tue Nov 14 16:59:21 2000 @@ -3,12 +3,12 @@ XCOMM XCOMM makedepend which uses 'gcc -M' XCOMM -XCOMM $XFree86: xc/config/util/gccmdep.cpp,v 3.3 1996/02/25 01:16:15 dawes Exp $ +XCOMM $XFree86: xc/config/util/gccmdep.cpp,v 3.5 2000/11/14 21:59:21 dawes Exp $ XCOMM XCOMM Based on mdepend.cpp and code supplied by Hongjiu Lu XCOMM -TMP=/tmp/mdep$$ +TMP=`pwd`/.mdep$$ CC=CCCMD RM=RMCMD LN=LNCMD @@ -33,7 +33,7 @@ -D*|-I*) args="$args '$1'" ;; - -g|-o) + -g|-O*) ;; *) if [ "$endmarker"x = x ]; then Index: xc/config/util/mdepend.cpp diff -u xc/config/util/mdepend.cpp:3.2 xc/config/util/mdepend.cpp:3.3 --- xc/config/util/mdepend.cpp:3.2 Sun Jun 29 03:54:20 1997 +++ xc/config/util/mdepend.cpp Mon Aug 7 23:16:26 2000 @@ -22,14 +22,14 @@ XCOMM USG users will probably have to change "silent" to "-s" instead of XCOMM "-" (at least, that is what the documentation implies). XCOMM -XCOMM $XFree86: xc/config/util/mdepend.cpp,v 3.2 1997/06/29 07:54:20 dawes Exp $ +XCOMM $XFree86: xc/config/util/mdepend.cpp,v 3.3 2000/08/08 03:16:26 dawes Exp $ XCOMM CC=PREPROC silent='-' -TMP=/tmp/mdep$$ +TMP=`pwd`/.mdep$$ CPPCMD=${TMP}a DEPENDLINES=${TMP}b TMPMAKEFILE=${TMP}c Index: xc/config/util/mkhtmlindex.sh diff -u xc/config/util/mkhtmlindex.sh:1.2 xc/config/util/mkhtmlindex.sh:1.3 --- xc/config/util/mkhtmlindex.sh:1.2 Wed Mar 22 16:23:34 2000 +++ xc/config/util/mkhtmlindex.sh Sat Aug 26 00:30:49 2000 @@ -1,6 +1,6 @@ #!/bin/sh # -# $XFree86: xc/config/util/mkhtmlindex.sh,v 1.2 2000/03/22 21:23:34 dawes Exp $ +# $XFree86: xc/config/util/mkhtmlindex.sh,v 1.3 2000/08/26 04:30:49 dawes Exp $ # # Copyright © 2000 by Precision Insight, Inc. # @@ -25,7 +25,7 @@ cd $1 for s in $VOLLIST; do - list="`ls *.$s.html 2> /dev/null`" + list="`ls *.$s.html 2> /dev/null`" || : # ignore failed glob expansion if [ X"$list" != X ]; then file=$INDEX$s.html rm -f $file Index: xc/config/util/xmkmf.cpp diff -u xc/config/util/xmkmf.cpp:1.1.1.3 xc/config/util/xmkmf.cpp:1.3 --- xc/config/util/xmkmf.cpp:1.1.1.3 Sat Dec 21 22:16:11 1996 +++ xc/config/util/xmkmf.cpp Mon Nov 6 16:57:10 2000 @@ -1,5 +1,6 @@ XCOMM!/bin/sh +XCOMM $XFree86: xc/config/util/xmkmf.cpp,v 1.3 2000/11/06 21:57:10 dawes Exp $ XCOMM XCOMM make a Makefile from an Imakefile from inside or outside the sources XCOMM @@ -11,13 +12,24 @@ topdir= curdir=. do_all= +imake_defines= -case "$1" in --a) - do_all="yes" - shift - ;; -esac +while [ $# -gt 0 ] +do + case "$1" in + -D*) + imake_defines="$imake_defines $1" + shift + ;; + -a) + do_all="yes" + shift + ;; + *) + break + ;; + esac +done case $# in 0) ;; @@ -41,10 +53,10 @@ args="-I$topdir/config/cf -DTOPDIR=$topdir -DCURDIR=$curdir" fi -echo imake $args +echo imake $imake_defines $args case "$do_all" in yes) - imake $args && + imake $imake_defines $args && echo "make Makefiles" && make Makefiles && echo "make includes" && @@ -53,6 +65,6 @@ make depend ;; *) - imake $args + imake $imake_defines $args ;; esac Index: xc/doc/Imakefile diff -u xc/doc/Imakefile:1.2 xc/doc/Imakefile:1.3 --- xc/doc/Imakefile:1.2 Sun Dec 20 06:56:36 1998 +++ xc/doc/Imakefile Thu Dec 14 13:23:09 2000 @@ -1,5 +1,5 @@ XCOMM $XConsortium: Imakefile,v 1.1 94/02/10 20:32:47 rws Exp $ -XCOMM $XFree86: xc/doc/Imakefile,v 1.2 1998/12/20 11:56:36 dawes Exp $ +XCOMM $XFree86: xc/doc/Imakefile,v 1.3 2000/12/14 18:23:09 dawes Exp $ #define IHaveSubdirs #define PassCDebugFlags @@ -12,7 +12,11 @@ SPECSDIR = specs #endif -SUBDIRS = man $(MISCDIR) $(SPECSDIR) +#if InstallHardcopyDocs +HARDCOPYDIR = hardcopy +#endif + +SUBDIRS = man $(MISCDIR) $(SPECSDIR) $(HARDCOPYDIR) all:: Index: xc/doc/hardcopy/Imakefile diff -u /dev/null xc/doc/hardcopy/Imakefile:1.1 --- /dev/null Mon Dec 18 14:21:04 2000 +++ xc/doc/hardcopy/Imakefile Thu Dec 14 13:23:09 2000 @@ -0,0 +1,15 @@ +XCOMM $XFree86: xc/doc/hardcopy/Imakefile,v 1.1 2000/12/14 18:23:09 dawes Exp $ + +#if defined(HardcopyDocDirs) + +#define IHaveSubdirs +#define PassCDebugFlags + +SUBDIRS = HardcopyDocDirs + +all:: + +MakeSubdirs($(SUBDIRS)) +DependSubdirs($(SUBDIRS)) + +#endif Index: xc/doc/hardcopy/RX/Imakefile diff -u /dev/null xc/doc/hardcopy/RX/Imakefile:1.1 --- /dev/null Mon Dec 18 14:21:05 2000 +++ xc/doc/hardcopy/RX/Imakefile Thu Dec 14 13:23:10 2000 @@ -0,0 +1,4 @@ +XCOMM $XFree86: xc/doc/hardcopy/RX/Imakefile,v 1.1 2000/12/14 18:23:10 dawes Exp $ + +InstallHardcopyDoc(RX,RX.PS.gz) + Index: xc/doc/hardcopy/XIE/Imakefile diff -u /dev/null xc/doc/hardcopy/XIE/Imakefile:1.1 --- /dev/null Mon Dec 18 14:21:06 2000 +++ xc/doc/hardcopy/XIE/Imakefile Thu Dec 14 13:23:10 2000 @@ -0,0 +1,11 @@ +XCOMM $XFree86: xc/doc/hardcopy/XIE/Imakefile,v 1.1 2000/12/14 18:23:10 dawes Exp $ + +#define IHaveSubdirs +#define PassCDebugFlags + +SUBDIRS = SI XIEProto XIElib + +all:: + +MakeSubdirs($(SUBDIRS)) +DependSubdirs($(SUBDIRS)) Index: xc/doc/hardcopy/XIE/SI/Imakefile diff -u /dev/null xc/doc/hardcopy/XIE/SI/Imakefile:1.1 --- /dev/null Mon Dec 18 14:21:06 2000 +++ xc/doc/hardcopy/XIE/SI/Imakefile Thu Dec 14 13:23:10 2000 @@ -0,0 +1,4 @@ +XCOMM $XFree86: xc/doc/hardcopy/XIE/SI/Imakefile,v 1.1 2000/12/14 18:23:10 dawes Exp $ + +InstallHardcopyDoc(xieSIarch,xieSIarch.PS.gz xieSIarch.txt) + Index: xc/doc/hardcopy/XIE/XIEProto/Imakefile diff -u /dev/null xc/doc/hardcopy/XIE/XIEProto/Imakefile:1.1 --- /dev/null Mon Dec 18 14:21:06 2000 +++ xc/doc/hardcopy/XIE/XIEProto/Imakefile Thu Dec 14 13:23:11 2000 @@ -0,0 +1,23 @@ +XCOMM $XFree86: xc/doc/hardcopy/XIE/XIEProto/Imakefile,v 1.1 2000/12/14 18:23:11 dawes Exp $ + +InstallHardcopyDoc(XIEProto,XIEProto.txt) +InstallHardcopyDoc(apa_xie,apa_xie.PS.gz) +InstallHardcopyDoc(apb_xie,apb_xie.PS.gz) +InstallHardcopyDoc(apc_xie,apc_xie.PS.gz) +InstallHardcopyDoc(ch1_xie,ch1_xie.PS.gz) +InstallHardcopyDoc(ch2_xie,ch2_xie.PS.gz) +InstallHardcopyDoc(ch3_xie,ch3_xie.PS.gz) +InstallHardcopyDoc(ch4_xie,ch4_xie.PS.gz) +InstallHardcopyDoc(ch5_xie,ch5_xie.PS.gz) +InstallHardcopyDoc(ch6_xie,ch6_xie.PS.gz) +InstallHardcopyDoc(ch7_xie,ch7_xie.PS.gz) +InstallHardcopyDoc(ch8_xie,ch8_xie.PS.gz) +InstallHardcopyDoc(ch9_xie,ch9_xie.PS.gz) +InstallHardcopyDoc(cmatch_xie,cmatch_xie.PS.gz cmatch_xie.txt) +InstallHardcopyDoc(frnt_xie,frnt_xie.PS.gz) +InstallHardcopyDoc(overview_xie,overview_xie.PS.gz overview_xie.txt) + +LinkFile(overview_xie.PS.gz,overview.PS.gz) +LinkFile(overview_xie.txt,overview.txt) +LinkFile(cmatch_xie.PS.gz,cmatch.PS.gz) +LinkFile(cmatch_xie.txt,cmatch.txt) Index: xc/doc/hardcopy/XIE/XIElib/Imakefile diff -u /dev/null xc/doc/hardcopy/XIE/XIElib/Imakefile:1.1 --- /dev/null Mon Dec 18 14:21:07 2000 +++ xc/doc/hardcopy/XIE/XIElib/Imakefile Thu Dec 14 13:23:11 2000 @@ -0,0 +1,4 @@ +XCOMM $XFree86: xc/doc/hardcopy/XIE/XIElib/Imakefile,v 1.1 2000/12/14 18:23:11 dawes Exp $ + +InstallHardcopyDoc(xielib,xielib.PS.gz xielib.txt) + Index: xc/doc/hardcopy/XKB/Imakefile diff -u /dev/null xc/doc/hardcopy/XKB/Imakefile:1.1 --- /dev/null Mon Dec 18 14:21:07 2000 +++ xc/doc/hardcopy/XKB/Imakefile Thu Dec 14 13:23:11 2000 @@ -0,0 +1,7 @@ +XCOMM $XFree86: xc/doc/hardcopy/XKB/Imakefile,v 1.1 2000/12/14 18:23:11 dawes Exp $ + +InstallHardcopyDoc(XKBlib,XKBlib.PS.gz) +InstallHardcopyDoc(XKBproto,XKBproto.PS.gz) + +LinkFile(XKBlib.PS.gz,XKBlib.ps.gz) +LinkFile(XKBproto.PS.gz,XKBproto.ps.gz) Index: xc/doc/hardcopy/XPRINT/Imakefile diff -u /dev/null xc/doc/hardcopy/XPRINT/Imakefile:1.1 --- /dev/null Mon Dec 18 14:21:07 2000 +++ xc/doc/hardcopy/XPRINT/Imakefile Thu Dec 14 13:23:11 2000 @@ -0,0 +1,5 @@ +XCOMM $XFree86: xc/doc/hardcopy/XPRINT/Imakefile,v 1.1 2000/12/14 18:23:11 dawes Exp $ + +InstallHardcopyDoc(xp_library,xp_library.PS.gz) +InstallHardcopyDoc(xp_proto,xp_proto.PS.gz) + Index: xc/doc/man/Imakefile diff -u xc/doc/man/Imakefile:1.3 xc/doc/man/Imakefile:1.5 --- xc/doc/man/Imakefile:1.3 Sun Feb 28 21:14:00 1999 +++ xc/doc/man/Imakefile Thu Dec 14 15:59:06 2000 @@ -2,7 +2,7 @@ -XCOMM $XFree86: xc/doc/man/Imakefile,v 1.3 1999/03/01 02:14:00 dawes Exp $ +XCOMM $XFree86: xc/doc/man/Imakefile,v 1.5 2000/12/14 20:59:06 dawes Exp $ #define IHaveSubdirs #define PassCDebugFlags @@ -11,14 +11,18 @@ XVDIR = Xv #endif #if BuildGLXLibrary -GLXDIR = GL +GLXDIRS = GL GLw #endif +#if InstallMiscManPages +MISCDIR = misc +#endif + #if InstallLibManPages -LIBMANDIRS = X11 Xt Xext Xi Xau $(XVDIR) $(GLXDIR) +LIBMANDIRS = X11 Xt Xext Xi Xau $(XVDIR) $(GLXDIRS) #endif -SUBDIRS = general $(LIBMANDIRS) +SUBDIRS = general $(LIBMANDIRS) $(MISCDIR) all:: Index: xc/doc/man/GLw/Imakefile diff -u /dev/null xc/doc/man/GLw/Imakefile:1.1 --- /dev/null Mon Dec 18 14:21:10 2000 +++ xc/doc/man/GLw/Imakefile Thu Nov 2 15:39:06 2000 @@ -0,0 +1,25 @@ +XCOMM $XFree86: xc/doc/man/GLw/Imakefile,v 1.1 2000/11/02 20:39:06 dawes Exp $ + +MANDIR = $(LIBMANDIR) +MANSUFFIX = $(LIBMANSUFFIX) + +#if ExpandManNames +InstallManPageLong(GLwCMDrA,$(MANDIR),GLwCreateMDrawingArea) +InstallManPageLong(GLwDrawA,$(MANDIR),GLwDrawingArea) +InstallManPageAliases(GLwDrawingArea,$(MANDIR),GLwMDrawingArea) +InstallManPageLong(GLwDrAMC,$(MANDIR),GLwDrawingAreaMakeCurrent) +InstallManPageLong(GLwDrASB,$(MANDIR),GLwDrawingAreaSwapBuffers) +#else +InstallManPage(GLwCMDrA,$(MANDIR)) +InstallManPage(GLwDrawA,$(MANDIR)) +InstallManPage(GLwDrAMC,$(MANDIR)) +InstallManPage(GLwDrASB,$(MANDIR)) +#endif + +GLWMANDIR = $(OGLSAMPLESRCDIR)/main/doc/man/manglw + +LinkFile(GLwCMDrA.man, $(GLWMANDIR)/glwcreatemdrawingarea.gl) +LinkFile(GLwDrawA.man, $(GLWMANDIR)/glwdrawingarea.gl) +LinkFile(GLwDrAMC.man, $(GLWMANDIR)/glwdrawingareamakecurrent.gl) +LinkFile(GLwDrASB.man, $(GLWMANDIR)/glwdrawingareaswapbuffers.gl) + Index: xc/doc/man/X11/Imakefile diff -u xc/doc/man/X11/Imakefile:1.1.1.2 xc/doc/man/X11/Imakefile:1.2 --- xc/doc/man/X11/Imakefile:1.1.1.2 Sat Feb 10 00:52:21 1996 +++ xc/doc/man/X11/Imakefile Tue Nov 28 13:49:09 2000 @@ -1,3 +1,5 @@ +XCOMM $XFree86: xc/doc/man/X11/Imakefile,v 1.2 2000/11/28 18:49:09 dawes Exp $ + MANDIR = $(LIBMANDIR) MANSUFFIX = $(LIBMANSUFFIX) @@ -255,7 +257,7 @@ InstallManPageLong(XSeWMName,$(MANDIR),XSetWMName) InstallManPageAliases(XSetWMName,$(MANDIR),XGetWMName XStoreName XFetchName) InstallManPageLong(XSeWMProp,$(MANDIR),XSetWMProperties) -InstallManPageAliases(XSetWMProperties,$(MANDIR),XmbSetWMProperties) +InstallManPageAliases(XSetWMProperties,$(MANDIR),XmbSetWMProperties Xutf8SetWMProperties) InstallManPageLong(XSeWMProt,$(MANDIR),XSetWMProtocols) InstallManPageAliases(XSetWMProtocols,$(MANDIR),XGetWMProtocols) InstallManPageLong(XStBytes,$(MANDIR),XStoreBytes) @@ -269,7 +271,7 @@ InstallManPageLong(XSync,$(MANDIR),XSynchronize) InstallManPageAliases(XSynchronize,$(MANDIR),XSetAfterFunction) InstallManPageLong(XTLTTProp,$(MANDIR),XmbTextListToTextProperty) -InstallManPageAliases(XmbTextListToTextProperty,$(MANDIR),XwcTextListToTextProperty XmbTextPropertyToTextList XwcTextPropertyToTextList XwcFreeStringList XDefaultString) +InstallManPageAliases(XmbTextListToTextProperty,$(MANDIR),XwcTextListToTextProperty Xutf8TextListToTextProperty XmbTextPropertyToTextList XwcTextPropertyToTextList Xutf8TextPropertyToTextList XwcFreeStringList XDefaultString) InstallManPageLong(XTextExt,$(MANDIR),XTextExtents) InstallManPageAliases(XTextExtents,$(MANDIR),XTextExtents16 XQueryTextExtents XQueryTextExtents16) InstallManPageLong(XTextWid,$(MANDIR),XTextWidth) @@ -310,21 +312,21 @@ InstallManPageLong(XcmsTQMC,$(MANDIR),XcmsTekHVCQueryMaxC) InstallManPageAliases(XcmsTekHVCQueryMaxC,$(MANDIR),XcmsTekHVCQueryMaxV XcmsTekHVCQueryMaxVC XcmsTekHVCQueryMaxVSamples XcmsTekHVCQueryMinV) InstallManPageLong(XmbDIStr,$(MANDIR),XmbDrawImageString) -InstallManPageAliases(XmbDrawImageString,$(MANDIR),XwcDrawImageString) +InstallManPageAliases(XmbDrawImageString,$(MANDIR),XwcDrawImageString Xutf8DrawImageString) InstallManPageLong(XmbDStr,$(MANDIR),XmbDrawString) -InstallManPageAliases(XmbDrawString,$(MANDIR),XwcDrawString) +InstallManPageAliases(XmbDrawString,$(MANDIR),XwcDrawString Xutf8DrawString) InstallManPageLong(XmbDTxt,$(MANDIR),XmbDrawText) -InstallManPageAliases(XmbDrawText,$(MANDIR),XwcDrawText) +InstallManPageAliases(XmbDrawText,$(MANDIR),XwcDrawText Xutf8DrawText) InstallManPageLong(XmbLStr,$(MANDIR),XmbLookupString) -InstallManPageAliases(XmbLookupString,$(MANDIR),XwcLookupString) +InstallManPageAliases(XmbLookupString,$(MANDIR),XwcLookupString Xutf8LookupString) InstallManPageLong(XmbRIC,$(MANDIR),XmbResetIC) -InstallManPageAliases(XmbResetIC,$(MANDIR),XwcResetIC) +InstallManPageAliases(XmbResetIC,$(MANDIR),XwcResetIC Xutf8ResetIC) InstallManPageLong(XmbTEsc,$(MANDIR),XmbTextEscapement) -InstallManPageAliases(XmbTextEscapement,$(MANDIR),XwcTextEscapement) +InstallManPageAliases(XmbTextEscapement,$(MANDIR),XwcTextEscapement Xutf8TextEscapement) InstallManPageLong(XmbTExt,$(MANDIR),XmbTextExtents) -InstallManPageAliases(XmbTextExtents,$(MANDIR),XwcTextExtents) +InstallManPageAliases(XmbTextExtents,$(MANDIR),XwcTextExtents Xutf8TextExtents) InstallManPageLong(XmbTPCEx,$(MANDIR),XmbTextPerCharExtents) -InstallManPageAliases(XmbTextPerCharExtents,$(MANDIR),XwcTextPerCharExtents) +InstallManPageAliases(XmbTextPerCharExtents,$(MANDIR),XwcTextPerCharExtents Xutf8TextPerCharExtents) #else InstallManPage(AllPlanes,$(MANDIR)) InstallManPage(BlkPScrn,$(MANDIR)) Index: xc/doc/man/X11/XOpenOM.man diff -u xc/doc/man/X11/XOpenOM.man:1.1.1.4 xc/doc/man/X11/XOpenOM.man:1.2 --- xc/doc/man/X11/XOpenOM.man:1.1.1.4 Sun Sep 27 05:03:16 1998 +++ xc/doc/man/X11/XOpenOM.man Mon Dec 4 13:49:17 2000 @@ -1,4 +1,5 @@ .\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium +.\" Copyright \(co 2000 The XFree86 Project, Inc. .\" .\" Permission is hereby granted, free of charge, to any person obtaining .\" a copy of this software and associated documentation files (the @@ -39,6 +40,8 @@ .\" Digital and Tektronix makes no representations about the suitability .\" of this documentation for any purpose. .\" It is provided ``as is'' without express or implied warranty. +.\" +.\" $XFree86: xc/doc/man/X11/XOpenOM.man,v 1.2 2000/12/04 18:49:17 dawes Exp $ .\" .ds xT X Toolkit Intrinsics \- C Language Interface .ds xW Athena X Widgets \- C Language X Toolkit Interface @@ -241,7 +244,11 @@ for setting properties or features of the specified output method. This function returns NULL if it succeeds; otherwise, -it returns the name of the first argument that could not be obtained. +it returns the name of the first argument that could not be set. +Xlib does not attempt to set arguments from the supplied list that +follow the failed argument; +all arguments in the list preceding the failed argument have been set +correctly. .LP No standard arguments are currently defined by Xlib. .LP Index: xc/doc/man/X11/XSLTTProp.man diff -u xc/doc/man/X11/XSLTTProp.man:1.1.1.4 xc/doc/man/X11/XSLTTProp.man:1.2 --- xc/doc/man/X11/XSLTTProp.man:1.1.1.4 Sun Sep 27 05:03:29 1998 +++ xc/doc/man/X11/XSLTTProp.man Tue Nov 28 13:49:10 2000 @@ -1,4 +1,5 @@ .\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium +.\" Copyright \(co 2000 The XFree86 Project, Inc. .\" .\" Permission is hereby granted, free of charge, to any person obtaining .\" a copy of this software and associated documentation files (the @@ -39,6 +40,8 @@ .\" Digital and Tektronix makes no representations about the suitability .\" of this documentation for any purpose. .\" It is provided ``as is'' without express or implied warranty. +.\" +.\" $XFree86: xc/doc/man/X11/XSLTTProp.man,v 1.2 2000/11/28 18:49:10 dawes Exp $ .\" .ds xT X Toolkit Intrinsics \- C Language Interface .ds xW Athena X Widgets \- C Language X Toolkit Interface @@ -224,7 +227,8 @@ The .ZN XFreeStringList function releases memory allocated by -.ZN XmbTextPropertyToTextList +.ZN XmbTextPropertyToTextList , +.ZN Xutf8TextPropertyToTextList and .ZN XTextPropertyToStringList and the missing charset list allocated by Index: xc/doc/man/X11/XSeWMProp.man diff -u xc/doc/man/X11/XSeWMProp.man:1.1.1.4 xc/doc/man/X11/XSeWMProp.man:1.2 --- xc/doc/man/X11/XSeWMProp.man:1.1.1.4 Sun Sep 27 05:03:40 1998 +++ xc/doc/man/X11/XSeWMProp.man Tue Nov 28 13:49:10 2000 @@ -1,4 +1,5 @@ .\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium +.\" Copyright \(co 2000 The XFree86 Project, Inc. .\" .\" Permission is hereby granted, free of charge, to any person obtaining .\" a copy of this software and associated documentation files (the @@ -39,6 +40,8 @@ .\" Digital and Tektronix makes no representations about the suitability .\" of this documentation for any purpose. .\" It is provided ``as is'' without express or implied warranty. +.\" +.\" $XFree86: xc/doc/man/X11/XSeWMProp.man,v 1.2 2000/11/28 18:49:10 dawes Exp $ .\" .ds xT X Toolkit Intrinsics \- C Language Interface .ds xW Athena X Widgets \- C Language X Toolkit Interface @@ -140,7 +143,7 @@ .ny0 .TH XSetWMProperties 3X11 "Release 6.4" "X Version 11" "XLIB FUNCTIONS" .SH NAME -XSetWMProperties, XmbSetWMProperties \- set standard window properties +XSetWMProperties, XmbSetWMProperties, Xutf8SetWMProperties \- set standard window properties .SH SYNTAX void XSetWMProperties\^(\^\fIdisplay\fP, \fIw\fP, \fIwindow_name\fP, \ \fIicon_name\fP, \fIargv\fP, \fIargc\fP, \fInormal_hints\fP, \fIwm_hints\fP, \ @@ -185,6 +188,28 @@ XWMHints *\fIwm_hints\fP\^; .br XClassHint *\fIclass_hints\fP\^; +.LP +void Xutf8SetWMProperties\^(\^\fIdisplay\fP\^, \fIw\fP\^, \fIwindow_name\fP\^, \fIicon_name\fP\^, \fIargv\fP\^, \fIargc\fP\^, +.br + \fInormal_hints\fP\^, \fIwm_hints\fP\^, \fIclass_hints\fP\^) +.br + Display *\fIdisplay\fP\^; +.br + Window \fIw\fP\^; +.br + char *\fIwindow_name\fP\^; +.br + char *\fIicon_name\fP\^; +.br + char *\fIargv\fP\^[]; +.br + int \fIargc\fP\^; +.br + XSizeHints *\fInormal_hints\fP\^; +.br + XWMHints *\fIwm_hints\fP\^; +.br + XClassHint *\fIclass_hints\fP\^; .SH ARGUMENTS .IP \fIargc\fP 1i Specifies the number of arguments. @@ -267,19 +292,22 @@ .LP The .ZN XmbSetWMProperties -convenience function provides a simple programming interface +and +.ZN Xutf8SetWMProperties +convenience functions provide a simple programming interface for setting those essential window properties that are used for communicating with other clients (particularly window and session managers). .LP If the window_name argument is non-NULL, -.ZN XmbSetWMProperties -sets the WM_NAME property. +they set the WM_NAME property. If the icon_name argument is non-NULL, +they set the WM_ICON_NAME property. +The window_name and icon_name arguments are null-terminated strings, for .ZN XmbSetWMProperties -sets the WM_ICON_NAME property. -The window_name and icon_name arguments are null-terminated strings -in the encoding of the current locale. +in the encoding of the current locale, for +.ZN Xutf8SetWMProperties +in UTF-8 encoding. If the arguments can be fully converted to the STRING encoding, the properties are created with type ``STRING''; otherwise, the arguments are converted to Compound Text, @@ -287,18 +315,24 @@ .LP If the normal_hints argument is non-NULL, .ZN XmbSetWMProperties -calls +and +.ZN Xutf8SetWMProperties +call .ZN XSetWMNormalHints , which sets the WM_NORMAL_HINTS property (see section 14.1.7). If the wm_hints argument is non-NULL, .ZN XmbSetWMProperties -calls +and +.ZN Xutf8SetWMProperties +call .ZN XSetWMHints , which sets the WM_HINTS property (see section 14.1.6). .LP If the argv argument is non-NULL, .ZN XmbSetWMProperties -sets the WM_COMMAND property from argv and argc. +and +.ZN Xutf8SetWMProperties +set the WM_COMMAND property from argv and argc. An argc of zero indicates a zero-length command. .LP The hostname of the machine is stored using @@ -307,7 +341,9 @@ .LP If the class_hints argument is non-NULL, .ZN XmbSetWMProperties -sets the WM_CLASS property. +and +.ZN Xutf8SetWMProperties +set the WM_CLASS property. If the res_name member in the .ZN XClassHint structure is set to the NULL pointer and the RESOURCE_NAME @@ -320,26 +356,35 @@ .LP It is assumed that the supplied class_hints.res_name and argv, the RESOURCE_NAME environment variable, and the hostname of the machine -are in the encoding of the locale announced for the LC_CTYPE category -(on POSIX-compliant systems, the LC_CTYPE, else LANG environment variable). +are in the encoding of the current locale. The corresponding WM_CLASS, WM_COMMAND, and WM_CLIENT_MACHINE properties are typed according to the local host locale announcer. -No encoding conversion is performed prior to storage in the properties. +No encoding conversion is performed for these strings prior to storage +in the properties. .LP For clients that need to process the property text in a locale, .ZN XmbSetWMProperties -sets the WM_LOCALE_NAME property to be the name of the current locale. +and +.ZN Xutf8SetWMProperties +set the WM_LOCALE_NAME property to be the name of the current locale. The name is assumed to be in the Host Portable Character Encoding and is converted to STRING for storage in the property. .LP -.ZN XSetWMProperties -and +.ZN XSetWMProperties , .ZN XmbSetWMProperties +and +.ZN Xutf8SetWMProperties can generate .ZN BadAlloc and .ZN BadWindow errors. +.LP +The function +.ZN Xutf8SetWMProperties +is an XFree86 extension introduced in XFree86 4.0.2. Its presence is +indicated by the macro +.ZN X_HAVE_UTF8_STRING . .SH PROPERTIES .TP 1i \s-1WM_CLASS\s+1 Index: xc/doc/man/X11/XTLTTProp.man diff -u xc/doc/man/X11/XTLTTProp.man:1.1.1.4 xc/doc/man/X11/XTLTTProp.man:1.2 --- xc/doc/man/X11/XTLTTProp.man:1.1.1.4 Sun Sep 27 05:03:43 1998 +++ xc/doc/man/X11/XTLTTProp.man Tue Nov 28 13:49:11 2000 @@ -1,5 +1,6 @@ '\" t .\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium +.\" Copyright \(co 2000 The XFree86 Project, Inc. .\" .\" Permission is hereby granted, free of charge, to any person obtaining .\" a copy of this software and associated documentation files (the @@ -40,6 +41,8 @@ .\" Digital and Tektronix makes no representations about the suitability .\" of this documentation for any purpose. .\" It is provided ``as is'' without express or implied warranty. +.\" +.\" $XFree86: xc/doc/man/X11/XTLTTProp.man,v 1.2 2000/11/28 18:49:11 dawes Exp $ .\" .ds xT X Toolkit Intrinsics \- C Language Interface .ds xW Athena X Widgets \- C Language X Toolkit Interface @@ -142,7 +145,7 @@ '\" t .TH XmbTextListToTextProperty 3X11 "Release 6.4" "X Version 11" "XLIB FUNCTIONS" .SH NAME -XmbTextListToTextProperty, XwcTextListToTextProperty, XmbTextPropertyToTextList, XwcTextPropertyToTextList, XwcFreeStringList, XDefaultString \- convert text lists and text property structures +XmbTextListToTextProperty, XwcTextListToTextProperty, Xutf8TextListToTextProperty, XmbTextPropertyToTextList, XwcTextPropertyToTextList, Xutf8TextPropertyToTextList, XwcFreeStringList, XDefaultString \- convert text lists and text property structures .SH SYNTAX int XmbTextListToTextProperty\^(\^\fIdisplay\fP\^, \fIlist\fP\^, \fIcount\fP\^, \fIstyle\fP\^, \fItext_prop_return\fP\^) .br @@ -168,6 +171,18 @@ .br XTextProperty *\fItext_prop_return\fP\^; .LP +int Xutf8TextListToTextProperty\^(\^\fIdisplay\fP\^, \fIlist\fP\^, \fIcount\fP\^, \fIstyle\fP\^, \fItext_prop_return\fP\^) +.br + Display *\fIdisplay\fP\^; +.br + char **\fIlist\fP\^; +.br + int \fIcount\fP\^; +.br + XICCEncodingStyle \fIstyle\fP\^; +.br + XTextProperty *\fItext_prop_return\fP\^; +.LP int XmbTextPropertyToTextList\^(\^\fIdisplay\fP\^, \fItext_prop\fP\^, \fIlist_return\fP\^, \fIcount_return\fP\^) .br Display *\fIdisplay\fP\^; @@ -188,6 +203,16 @@ .br int *\fIcount_return\fP\^; .LP +int Xutf8TextPropertyToTextList\^(\^\fIdisplay\fP\^, \fItext_prop\fP\^, \fIlist_return\fP\^, \fIcount_return\fP\^) +.br + Display *\fIdisplay\fP\^; +.br + XTextProperty *\fItext_prop\fP\^; +.br + char ***\fIlist_return\fP\^; +.br + int *\fIcount_return\fP\^; +.LP void XwcFreeStringList\^(\^\fIlist\fP\^) .br wchar_t **\fIlist\fP\^; @@ -219,15 +244,20 @@ Specifies the list of strings to be freed. .SH DESCRIPTION The -.ZN XmbTextListToTextProperty -and +.ZN XmbTextListToTextProperty , .ZN XwcTextListToTextProperty +and +.ZN Xutf8TextListToTextProperty functions set the specified .ZN XTextProperty value to a set of null-separated elements representing the concatenation -of the specified list of null-terminated text strings. -A final terminating null is stored at the end of the value field -of text_prop_return but is not included in the nitems member. +of the specified list of null-terminated text strings. The input text +strings must be given in the current locale encoding (for +.ZN XmbTextListToTextProperty +and +.ZN XwcTextListToTextProperty ), +or in UTF-8 encoding (for +.ZN Xutf8TextListToTextProperty ). .LP The functions set the encoding field of text_prop_return to an .ZN Atom @@ -241,6 +271,12 @@ .ZN XCompoundTextStyle is specified, this encoding is ``STRING'' or ``COMPOUND_TEXT'', respectively. +If the style +.ZN XUTF8StringStyle +is specified, +this encoding is ``UTF8_STRING''. (This is an XFree86 extension introduced in +XFree86 4.0.2. Its presence is indicated by the macro +.ZN X_HAVE_UTF8_STRING .) If the style .ZN XTextStyle is specified, @@ -250,6 +286,8 @@ is specified, this encoding is ``STRING'' if the text is fully convertible to STRING, else ``COMPOUND_TEXT''. +A final terminating null byte is stored at the end of the value field +of text_prop_return but is not included in the nitems member. .LP If insufficient memory is available for the new value string, the functions return @@ -279,13 +317,20 @@ .ZN XFree . .LP The -.ZN XmbTextPropertyToTextList -and +.ZN XmbTextPropertyToTextList , .ZN XwcTextPropertyToTextList -functions return a list of text strings in the current locale representing the +and +.ZN Xutf8TextPropertyToTextList +functions return a list of text strings representing the null-separated elements of the specified .ZN XTextProperty -structure. +structure. The returned strings are encoded using the current locale encoding +(for +.ZN XmbTextPropertyToTextList +and +.ZN XwcTextPropertyToTextList ) +or in UTF-8 (for +.ZN Xutf8TextPropertyToTextList ). The data in text_prop must be format 8. .LP Multiple elements of the property (for example, the strings in a disjoint @@ -294,9 +339,10 @@ any terminating null should not be included in text_prop.nitems. .LP If insufficient memory is available for the list and its elements, -.ZN XmbTextPropertyToTextList -and +.ZN XmbTextPropertyToTextList , .ZN XwcTextPropertyToTextList +and +.ZN Xutf8TextPropertyToTextList return .ZN XNoMemory . If the current locale is not supported, @@ -307,7 +353,7 @@ the functions return .ZN XConverterNotFound . For supported locales, -existence of a converter from COMPOUND_TEXT, STRING +existence of a converter from COMPOUND_TEXT, STRING, UTF8_STRING or the encoding of the current locale is guaranteed if .ZN XSupportsLocale returns @@ -319,14 +365,15 @@ the functions do not set any return values. .LP Otherwise, -.ZN XmbTextPropertyToTextList -and +.ZN XmbTextPropertyToTextList , .ZN XwcTextPropertyToTextList +and +.ZN Xutf8TextPropertyToTextList return the list of null-terminated text strings to list_return and the number of text strings to count_return. .LP -If the value field of text_prop is not fully convertible to the encoding of -the current locale, +If the value field of text_prop is not fully convertible to the +encoding of the current locale, the functions return the number of unconvertible characters. Each unconvertible character is converted to a string in the current locale that is specific to the current locale. @@ -334,14 +381,17 @@ use .ZN XDefaultString . Otherwise, -.ZN XmbTextPropertyToTextList -and +.ZN XmbTextPropertyToTextList , .ZN XwcTextPropertyToTextList +and +.ZN Xutf8TextPropertyToTextList return .ZN Success . .LP To free the storage for the list and its contents returned by -.ZN XmbTextPropertyToTextList , +.ZN XmbTextPropertyToTextList +or +.ZN Xutf8TextPropertyToTextList , use .ZN XFreeStringList . To free the storage for the list and its contents returned by @@ -383,6 +433,14 @@ It is owned by Xlib and should not be modified or freed by the client. It may be freed after the current locale is changed. Until freed, it will not be modified by Xlib. +.LP +The functions +.ZN Xutf8TextListToTextProperty +and +.ZN Xutf8TextPropertyToTextList +are an XFree86 extension introduced in XFree86 4.0.2. Their presence is +indicated by the macro +.ZN X_HAVE_UTF8_STRING . .SH STRUCTURES The .ZN XTextProperty @@ -434,7 +492,8 @@ XStringStyle, /* STRING */ XCompoundTextStyle, /* COMPOUND_TEXT */ XTextStyle, /* text in owner's encoding (current locale) */ - XStdICCTextStyle /* STRING, else COMPOUND_TEXT */ + XStdICCTextStyle, /* STRING, else COMPOUND_TEXT */ + XUTF8StringStyle /* UTF8_STRING */ } XICCEncodingStyle; .De .SH "SEE ALSO" Index: xc/doc/man/X11/XmbDIStr.man diff -u xc/doc/man/X11/XmbDIStr.man:1.1.1.4 xc/doc/man/X11/XmbDIStr.man:1.2 --- xc/doc/man/X11/XmbDIStr.man:1.1.1.4 Sun Sep 27 05:03:54 1998 +++ xc/doc/man/X11/XmbDIStr.man Tue Nov 28 13:49:11 2000 @@ -1,4 +1,5 @@ .\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium +.\" Copyright \(co 2000 The XFree86 Project, Inc. .\" .\" Permission is hereby granted, free of charge, to any person obtaining .\" a copy of this software and associated documentation files (the @@ -39,6 +40,8 @@ .\" Digital and Tektronix makes no representations about the suitability .\" of this documentation for any purpose. .\" It is provided ``as is'' without express or implied warranty. +.\" +.\" $XFree86: xc/doc/man/X11/XmbDIStr.man,v 1.2 2000/11/28 18:49:11 dawes Exp $ .\" .ds xT X Toolkit Intrinsics \- C Language Interface .ds xW Athena X Widgets \- C Language X Toolkit Interface @@ -140,7 +143,7 @@ .ny0 .TH XmbDrawImageString 3X11 "Release 6.4" "X Version 11" "XLIB FUNCTIONS" .SH NAME -XmbDrawImageString, XwcDrawImageString \- draw image text using a single font set +XmbDrawImageString, XwcDrawImageString, Xutf8DrawImageString \- draw image text using a single font set .SH SYNTAX void XmbDrawImageString\^(\^\fIdisplay\fP\^, \fId\fP\^, \fIfont_set\fP\^, \fIgc\fP\^, \fIx\fP\^, \fIy\fP\^, \fIstring\fP\^, \fInum_bytes\fP\^) .br @@ -173,6 +176,22 @@ wchar_t *\fIstring\fP\^; .br int \fInum_wchars\fP\^; +.LP +void Xutf8DrawImageString\^(\^\fIdisplay\fP\^, \fId\fP\^, \fIfont_set\fP\^, \fIgc\fP\^, \fIx\fP\^, \fIy\fP\^, \fIstring\fP\^, \fInum_bytes\fP\^) +.br + Display *\fIdisplay\fP\^; +.br + Drawable \fId\fP\^; +.br + XFontSet \fIfont_set\fP\^; +.br + GC \fIgc\fP\^; +.br + int \fIx\fP\^, \fIy\fP\^; +.br + char *\fIstring\fP\^; +.br + int \fInum_bytes\fP\^; .SH ARGUMENTS .IP \fId\fP 1i Specifies the drawable. @@ -196,15 +215,17 @@ Specify the x and y coordinates\*(Xy. .SH DESCRIPTION The -.ZN XmbDrawImageString -and +.ZN XmbDrawImageString , .ZN XwcDrawImageString +and +.ZN Xutf8DrawImageString functions fill a destination rectangle with the background pixel defined in the GC and then paint the text with the foreground pixel. The filled rectangle is the rectangle returned to overall_logical_return by -.ZN XmbTextExtents -or +.ZN XmbTextExtents , .ZN XwcTextExtents +or +.ZN Xutf8TextExtents for the same text and .ZN XFontSet . .LP @@ -214,6 +235,12 @@ with the default string returned by .ZN XCreateFontSet . The behavior for an invalid codepoint is undefined. +.LP +The function +.ZN Xutf8TextExtents +is an XFree86 extension introduced in XFree86 4.0.2. Its presence is +indicated by the macro +.ZN X_HAVE_UTF8_STRING . .SH "SEE ALSO" XDrawImageString(3X11), XDrawString(3X11), Index: xc/doc/man/X11/XmbDStr.man diff -u xc/doc/man/X11/XmbDStr.man:1.1.1.4 xc/doc/man/X11/XmbDStr.man:1.2 --- xc/doc/man/X11/XmbDStr.man:1.1.1.4 Sun Sep 27 05:03:54 1998 +++ xc/doc/man/X11/XmbDStr.man Tue Nov 28 13:49:12 2000 @@ -1,4 +1,5 @@ .\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium +.\" Copyright \(co 2000 The XFree86 Project, Inc. .\" .\" Permission is hereby granted, free of charge, to any person obtaining .\" a copy of this software and associated documentation files (the @@ -39,6 +40,8 @@ .\" Digital and Tektronix makes no representations about the suitability .\" of this documentation for any purpose. .\" It is provided ``as is'' without express or implied warranty. +.\" +.\" $XFree86: xc/doc/man/X11/XmbDStr.man,v 1.2 2000/11/28 18:49:12 dawes Exp $ .\" .ds xT X Toolkit Intrinsics \- C Language Interface .ds xW Athena X Widgets \- C Language X Toolkit Interface @@ -140,7 +143,7 @@ .ny0 .TH XmbDrawString 3X11 "Release 6.4" "X Version 11" "XLIB FUNCTIONS" .SH NAME -XmbDrawString, XwcDrawString \- draw text using a single font set +XmbDrawString, XwcDrawString, Xutf8DrawString \- draw text using a single font set .SH SYNTAX void XmbDrawString\^(\^\fIdisplay\fP\^, \fId\fP\^, \fIfont_set\fP\^, \fIgc\fP\^, \fIx\fP\^, \fIy\fP\^, \fIstring\fP\^, \fInum_bytes\fP\^) .br @@ -173,6 +176,22 @@ wchar_t *\fIstring\fP\^; .br int \fInum_wchars\fP\^; +.LP +void Xuf8DrawString\^(\^\fIdisplay\fP\^, \fId\fP\^, \fIfont_set\fP\^, \fIgc\fP\^, \fIx\fP\^, \fIy\fP\^, \fIstring\fP\^, \fInum_bytes\fP\^) +.br + Display *\fIdisplay\fP\^; +.br + Drawable \fId\fP\^; +.br + XFontSet \fIfont_set\fP\^; +.br + GC \fIgc\fP\^; +.br + int \fIx\fP\^, \fIy\fP\^; +.br + char *\fIstring\fP\^; +.br + int \fInum_bytes\fP\^; .SH ARGUMENTS .IP \fId\fP 1i Specifies the drawable. @@ -196,9 +215,10 @@ Specify the x and y coordinates\*(Xy. .SH DESCRIPTION The -.ZN XmbDrawString -and +.ZN XmbDrawString , .ZN XwcDrawString +and +.ZN Xutf8DrawString functions draw the specified text with the foreground pixel. When the .ZN XFontSet @@ -206,8 +226,14 @@ with the default string returned by .ZN XCreateFontSet . The behavior for an invalid codepoint is undefined. +.LP +The function +.ZN Xutf8DrawString +is an XFree86 extension introduced in XFree86 4.0.2. Its presence is +indicated by the macro +.ZN X_HAVE_UTF8_STRING . .SH "SEE ALSO" -XXDrawImageString(3X11), +XDrawImageString(3X11), XDrawString(3X11), XDrawText(3X11), XmbDrawImageString(3X11), Index: xc/doc/man/X11/XmbDTxt.man diff -u xc/doc/man/X11/XmbDTxt.man:1.1.1.4 xc/doc/man/X11/XmbDTxt.man:1.2 --- xc/doc/man/X11/XmbDTxt.man:1.1.1.4 Sun Sep 27 05:03:54 1998 +++ xc/doc/man/X11/XmbDTxt.man Tue Nov 28 13:49:12 2000 @@ -1,4 +1,5 @@ .\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium +.\" Copyright \(co 2000 The XFree86 Project, Inc. .\" .\" Permission is hereby granted, free of charge, to any person obtaining .\" a copy of this software and associated documentation files (the @@ -39,6 +40,8 @@ .\" Digital and Tektronix makes no representations about the suitability .\" of this documentation for any purpose. .\" It is provided ``as is'' without express or implied warranty. +.\" +.\" $XFree86: xc/doc/man/X11/XmbDTxt.man,v 1.2 2000/11/28 18:49:12 dawes Exp $ .\" .ds xT X Toolkit Intrinsics \- C Language Interface .ds xW Athena X Widgets \- C Language X Toolkit Interface @@ -140,7 +143,7 @@ .ny0 .TH XmbDrawText 3X11 "Release 6.4" "X Version 11" "XLIB FUNCTIONS" .SH NAME -XmbDrawText, XwcDrawText \- draw text using multiple font sets +XmbDrawText, XwcDrawText, Xutf8DrawText \- draw text using multiple font sets .SH SYNTAX void XmbDrawText\^(\^\fIdisplay\fP\^, \fId\fP\^, \fIgc\fP\^, \fIx\fP\^, \fIy\fP\^, \fIitems\fP\^, \fInitems\fP\^) .br @@ -169,6 +172,20 @@ XwcTextItem *\fIitems\fP\^; .br int \fInitems\fP\^; +.LP +void Xutf8DrawText\^(\^\fIdisplay\fP\^, \fId\fP\^, \fIgc\fP\^, \fIx\fP\^, \fIy\fP\^, \fIitems\fP\^, \fInitems\fP\^) +.br + Display *\fIdisplay\fP\^; +.br + Drawable \fId\fP\^; +.br + GC \fIgc\fP\^; +.br + int \fIx\fP\^, \fIy\fP\^; +.br + XmbTextItem *\fIitems\fP\^; +.br + int \fInitems\fP\^; .SH ARGUMENTS .IP \fId\fP 1i Specifies the drawable. @@ -188,9 +205,10 @@ Specify the x and y coordinates\*(Xy. .SH DESCRIPTION The -.ZN XmbDrawText -and +.ZN XmbDrawText , .ZN XwcDrawText +and +.ZN Xutf8DrawText functions allow complex spacing and font set shifts between text strings. Each text item is processed in turn, with the origin of a text element advanced in the primary draw direction by the escapement of the @@ -205,24 +223,31 @@ .ZN None will not be drawn. .LP -.ZN XmbDrawText -and +.ZN XmbDrawText , .ZN XwcDrawText +and +.ZN Xutf8DrawText do not perform any context-dependent rendering between text segments. Clients may compute the drawing metrics by passing each text segment to -.ZN XmbTextExtents -and -.ZN XwcTextExtents -or -.ZN XmbTextPerCharExtents -and +.ZN XmbTextExtents , +.ZN XwcTextExtents , +.ZN Xutf8TextExtents +or +.ZN XmbTextPerCharExtents , .ZN XwcTextPerCharExtents . +.ZN Xutf8TextPerCharExtents . When the .ZN XFontSet has missing charsets, each unavailable character is drawn with the default string returned by .ZN XCreateFontSet . The behavior for an invalid codepoint is undefined. +.LP +The function +.ZN Xutf8DrawText +is an XFree86 extension introduced in XFree86 4.0.2. Its presence is +indicated by the macro +.ZN X_HAVE_UTF8_STRING . .SH STRUCTURES The .ZN XmbTextItem Index: xc/doc/man/X11/XmbLStr.man diff -u xc/doc/man/X11/XmbLStr.man:1.1.1.4 xc/doc/man/X11/XmbLStr.man:1.2 --- xc/doc/man/X11/XmbLStr.man:1.1.1.4 Sun Sep 27 05:03:55 1998 +++ xc/doc/man/X11/XmbLStr.man Tue Nov 28 13:49:12 2000 @@ -1,5 +1,6 @@ '\" t .\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium +.\" Copyright \(co 2000 The XFree86 Project, Inc. .\" .\" Permission is hereby granted, free of charge, to any person obtaining .\" a copy of this software and associated documentation files (the @@ -40,6 +41,8 @@ .\" Digital and Tektronix makes no representations about the suitability .\" of this documentation for any purpose. .\" It is provided ``as is'' without express or implied warranty. +.\" +.\" $XFree86: xc/doc/man/X11/XmbLStr.man,v 1.2 2000/11/28 18:49:12 dawes Exp $ .\" .ds xT X Toolkit Intrinsics \- C Language Interface .ds xW Athena X Widgets \- C Language X Toolkit Interface @@ -142,7 +145,7 @@ '\" t .TH XmbLookupString 3X11 "Release 6.4" "X Version 11" "XLIB FUNCTIONS" .SH NAME -XmbLookupString, XwcLookupString \- obtain composed input from an input method +XmbLookupString, XwcLookupString, Xutf8LookupString \- obtain composed input from an input method .SH SYNTAX int XmbLookupString\^(\^\fIic\fP\^, \fIevent\fP\^, \fIbuffer_return\fP\^, \fIbytes_buffer\fP\^, \fIkeysym_return\fP\^, \fIstatus_return\fP\^) .br @@ -171,6 +174,20 @@ KeySym *\fIkeysym_return\fP\^; .br Status *\fIstatus_return\fP\^; +.LP +int Xutf8LookupString\^(\^\fIic\fP\^, \fIevent\fP\^, \fIbuffer_return\fP\^, \fIbytes_buffer\fP\^, \fIkeysym_return\fP\^, \fIstatus_return\fP\^) +.br + XIC \fIic\fP\^; +.br + XKeyPressedEvent *\fIevent\fP; +.br + char *\fIbuffer_return\fP\^; +.br + int \fIbytes_buffer\fP\^; +.br + KeySym *\fIkeysym_return\fP\^; +.br + Status *\fIstatus_return\fP\^; .SH ARGUMENTS .IP \fIbuffer_return\fP 1i Returns a multibyte string or wide character string (if any) @@ -191,9 +208,10 @@ Returns a value indicating what kind of data is returned. .SH DESCRIPTION The -.ZN XmbLookupString -and +.ZN XmbLookupString , .ZN XwcLookupString +and +.ZN Xutf8LookupString functions return the string from the input method specified in the buffer_return argument. If no string is returned, @@ -206,7 +224,9 @@ the KeySym value does not necessarily correspond to the string returned. .LP .ZN XmbLookupString -returns the length of the string in bytes, and +and +.ZN Xutf8LookupString +return the length of the string in bytes, and .ZN XwcLookupString returns the length of the string in characters. Both @@ -214,7 +234,9 @@ and .ZN XwcLookupString return text in the encoding of the locale bound to the input method -of the specified input context. +of the specified input context, and +.ZN Xutf8LookupString +returns text in UTF-8 encoding. .LP Each string returned by .ZN XmbLookupString @@ -223,13 +245,14 @@ begins in the initial state of the encoding of the locale (if the encoding of the locale is state-dependent). .NT -To insure proper input processing, +To ensure proper input processing, it is essential that the client pass only .ZN KeyPress events to -.ZN XmbLookupString +.ZN XmbLookupString , +.ZN XwcLookupString and -.ZN XwcLookupString . +.ZN Xutf8LookupString . Their behavior when a client passes a .ZN KeyRelease event is undefined. @@ -237,7 +260,7 @@ .LP Clients should check the status_return argument before using the other returned values. -These two functions both return a value to status_return +These three functions each return a value to status_return that indicates what has been returned in the other arguments. The possible values returned are: .TS @@ -246,9 +269,10 @@ .ZN XBufferOverflow T} T{ The input string to be returned is too large for the supplied buffer_return. -The required size -.Pn ( XmbLookupString -in bytes; +The required size (for +.ZN XmbLookupString , +.ZN Xutf8LookupString +in bytes; for .ZN XwcLookupString in characters) is returned as the value of the function, and the contents of buffer_return and keysym_return are not modified. @@ -266,9 +290,9 @@ .ZN XLookupChars T} T{ Some input characters have been composed. -They are placed in the buffer_return argument, +They are placed in the buffer_return argument, using the encoding +described above, and the string length is returned as the value of the function. -The string is encoded in the locale bound to the input context. The content of the keysym_return argument is not modified. T} T{ @@ -291,16 +315,24 @@ .TE .LP It does not make any difference if the input context passed as an argument to -.ZN XmbLookupString -and +.ZN XmbLookupString , .ZN XwcLookupString +and +.ZN Xutf8LookupString is the one currently in possession of the focus or not. Input may have been composed within an input context before it lost the focus, and that input may be returned on subsequent calls to -.ZN XmbLookupString -or +.ZN XmbLookupString , .ZN XwcLookupString +or +.ZN Xutf8LookupString even though it does not have any more keyboard focus. +.LP +The function +.ZN Xutf8LookupString +is an XFree86 extension introduced in XFree86 4.0.2. Its presence is +indicated by the macro +.ZN X_HAVE_UTF8_STRING . .SH "SEE ALSO" XLookupKeysym(3X11) .br Index: xc/doc/man/X11/XmbRIC.man diff -u xc/doc/man/X11/XmbRIC.man:1.1.1.4 xc/doc/man/X11/XmbRIC.man:1.2 --- xc/doc/man/X11/XmbRIC.man:1.1.1.4 Sun Sep 27 05:03:55 1998 +++ xc/doc/man/X11/XmbRIC.man Tue Nov 28 13:49:13 2000 @@ -1,4 +1,5 @@ .\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium +.\" Copyright \(co 2000 The XFree86 Project, Inc. .\" .\" Permission is hereby granted, free of charge, to any person obtaining .\" a copy of this software and associated documentation files (the @@ -39,6 +40,8 @@ .\" Digital and Tektronix makes no representations about the suitability .\" of this documentation for any purpose. .\" It is provided ``as is'' without express or implied warranty. +.\" +.\" $XFree86: xc/doc/man/X11/XmbRIC.man,v 1.2 2000/11/28 18:49:13 dawes Exp $ .\" .ds xT X Toolkit Intrinsics \- C Language Interface .ds xW Athena X Widgets \- C Language X Toolkit Interface @@ -140,7 +143,7 @@ .ny0 .TH XmbResetIC 3X11 "Release 6.4" "X Version 11" "XLIB FUNCTIONS" .SH NAME -XmbResetIC, XwcResetIC \- reset the state of an input context +XmbResetIC, XwcResetIC, Xutf8ResetIC \- reset the state of an input context .SH SYNTAX char * XmbResetIC\^(\^\fIic\fP\^) .br @@ -149,6 +152,10 @@ wchar_t * XwcResetIC\^(\^\fIic\fP\^) .br XIC \fIic\fP\^; +.LP +char * Xutf8ResetIC\^(\^\fIic\fP\^) +.br + XIC \fIic\fP\^; .SH ARGUMENTS .IP \fIic\fP 1i Specifies the input context. @@ -157,9 +164,10 @@ .ZN XNResetState is set to .ZN XIMInitialState , -.ZN XmbResetIC -and +.ZN XmbResetIC , .ZN XwcResetIC +and +.ZN Xutf8ResetIC reset an input context to its initial state; when .ZN XNResetState @@ -170,14 +178,21 @@ The input method is required to clear the preedit area, if any, and update the status accordingly. Calling -.ZN XmbResetIC -or +.ZN XmbResetIC , .ZN XwcResetIC +or +.ZN Xutf8ResetIC does not change the focus. .LP The return value of .ZN XmbResetIC is its current preedit string as a multibyte string. +The return value of +.ZN XwcResetIC +is its current preedit string as a wide character string. +The return value of +.ZN Xutf8ResetIC +is its current preedit string as an UTF-8 string. If there is any preedit text drawn or visible to the user, then these procedures must return a non-NULL string. If there is no visible preedit text, @@ -186,6 +201,12 @@ .LP The client should free the returned string by calling .ZN XFree . +.LP +The function +.ZN Xutf8ResetIC +is an XFree86 extension introduced in XFree86 4.0.2. Its presence is +indicated by the macro +.ZN X_HAVE_UTF8_STRING . .SH "SEE ALSO" XCreateIC(3X11), XOpenIM(3X11), Index: xc/doc/man/X11/XmbTEsc.man diff -u xc/doc/man/X11/XmbTEsc.man:1.1.1.4 xc/doc/man/X11/XmbTEsc.man:1.2 --- xc/doc/man/X11/XmbTEsc.man:1.1.1.4 Sun Sep 27 05:03:56 1998 +++ xc/doc/man/X11/XmbTEsc.man Tue Nov 28 13:49:13 2000 @@ -1,4 +1,5 @@ .\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium +.\" Copyright \(co 2000 The XFree86 Project, Inc. .\" .\" Permission is hereby granted, free of charge, to any person obtaining .\" a copy of this software and associated documentation files (the @@ -39,6 +40,8 @@ .\" Digital and Tektronix makes no representations about the suitability .\" of this documentation for any purpose. .\" It is provided ``as is'' without express or implied warranty. +.\" +.\" $XFree86: xc/doc/man/X11/XmbTEsc.man,v 1.2 2000/11/28 18:49:13 dawes Exp $ .\" .ds xT X Toolkit Intrinsics \- C Language Interface .ds xW Athena X Widgets \- C Language X Toolkit Interface @@ -140,7 +143,7 @@ .ny0 .TH XmbTextEscapement 3X11 "Release 6.4" "X Version 11" "XLIB FUNCTIONS" .SH NAME -XmbTextEscapement, XwcTextEscapement \- obtain the escapement of text +XmbTextEscapement, XwcTextEscapement, Xutf8TextEscapement \- obtain the escapement of text .SH SYNTAX int XmbTextEscapement\^(\^\fIfont_set\fP\^, \fIstring\fP\^, \fInum_bytes\fP\^) .br @@ -157,6 +160,14 @@ wchar_t *\fIstring\fP\^; .br int \fInum_wchars\fP\^; +.LP +int Xutf8TextEscapement\^(\^\fIfont_set\fP\^, \fIstring\fP\^, \fInum_bytes\fP\^) +.br + XFontSet \fIfont_set\fP\^; +.br + char *\fIstring\fP\^; +.br + int \fInum_bytes\fP\^; .SH ARGUMENTS .IP \fIfont_set\fP 1i Specifies the font set. @@ -168,9 +179,10 @@ Specifies the character string. .SH DESCRIPTION The -.ZN XmbTextEscapement -and +.ZN XmbTextEscapement , .ZN XwcTextEscapement +and +.ZN Xutf8TextEscapement functions return the escapement in pixels of the specified string as a value, using the fonts loaded for the specified font set. The escapement is the distance in pixels in the primary draw @@ -180,6 +192,12 @@ .LP Regardless of the character rendering order, the escapement is always positive. +.LP +The function +.ZN Xutf8TextEscapement +is an XFree86 extension introduced in XFree86 4.0.2. Its presence is +indicated by the macro +.ZN X_HAVE_UTF8_STRING . .SH "SEE ALSO" XmbTextExtents(3X11), XmbTextPerCharExtents(3X11) Index: xc/doc/man/X11/XmbTExt.man diff -u xc/doc/man/X11/XmbTExt.man:1.2 xc/doc/man/X11/XmbTExt.man:1.3 --- xc/doc/man/X11/XmbTExt.man:1.2 Sat Dec 13 21:55:26 1997 +++ xc/doc/man/X11/XmbTExt.man Tue Nov 28 13:49:14 2000 @@ -1,4 +1,5 @@ .\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium +.\" Copyright \(co 2000 The XFree86 Project, Inc. .\" .\" Permission is hereby granted, free of charge, to any person obtaining .\" a copy of this software and associated documentation files (the @@ -39,6 +40,8 @@ .\" Digital and Tektronix makes no representations about the suitability .\" of this documentation for any purpose. .\" It is provided ``as is'' without express or implied warranty. +.\" +.\" $XFree86: xc/doc/man/X11/XmbTExt.man,v 1.3 2000/11/28 18:49:14 dawes Exp $ .\" .ds xT X Toolkit Intrinsics \- C Language Interface .ds xW Athena X Widgets \- C Language X Toolkit Interface @@ -140,7 +143,7 @@ .ny0 .TH XmbTextExtents 3X11 "Release 6.4" "X Version 11" "XLIB FUNCTIONS" .SH NAME -XmbTextExtents, XwcTextExtents \- compute text extents +XmbTextExtents, XwcTextExtents, Xutf8TextExtents \- compute text extents .SH SYNTAX int XmbTextExtents\^(\^\fIfont_set\fP\^, \fIstring\fP\^, \fInum_bytes\fP\^, \fIoverall_ink_return\fP\^, \fIoverall_logical_return\fP\^) .br @@ -165,6 +168,18 @@ XRectangle *\fIoverall_ink_return\fP\^; .br XRectangle *\fIoverall_logical_return\fP\^; +.LP +int Xutf8TextExtents\^(\^\fIfont_set\fP\^, \fIstring\fP\^, \fInum_bytes\fP\^, \fIoverall_ink_return\fP\^, \fIoverall_logical_return\fP\^) +.br + XFontSet \fIfont_set\fP\^; +.br + char *\fIstring\fP\^; +.br + int \fInum_bytes\fP\^; +.br + XRectangle *\fIoverall_ink_return\fP\^; +.br + XRectangle *\fIoverall_logical_return\fP\^; .SH ARGUMENTS .IP \fIfont_set\fP 1i Specifies the font set. @@ -181,17 +196,19 @@ Specifies the character string. .SH DESCRIPTION The -.ZN XmbTextExtents -and +.ZN XmbTextExtents , .ZN XwcTextExtents +and +.ZN Xutf8TextExtents functions set the components of the specified overall_ink_return and overall_logical_return arguments to the overall bounding box of the string's image and a logical bounding box for spacing purposes, respectively. They return the value returned by -.ZN XmbTextEscapement +.ZN XmbTextEscapement , +.ZN XwcTextEscapement or -.ZN XwcTextEscapement . +.ZN Xutf8TextEscapement . These metrics are relative to the drawing origin of the string, using the fonts loaded for the specified font set. .LP @@ -220,6 +237,12 @@ .ZN XCreateFontSet so that the metrics represent the text as it will actually be drawn. The behavior for an invalid codepoint is undefined. +.LP +The function +.ZN Xutf8TextExtents +is an XFree86 extension introduced in XFree86 4.0.2. Its presence is +indicated by the macro +.ZN X_HAVE_UTF8_STRING . .SH "SEE ALSO" XmbTextEscapement(3X11), XmbTextPerCharExtents(3X11) Index: xc/doc/man/X11/XmbTPCEx.man diff -u xc/doc/man/X11/XmbTPCEx.man:1.2 xc/doc/man/X11/XmbTPCEx.man:1.3 --- xc/doc/man/X11/XmbTPCEx.man:1.2 Sat Dec 13 21:55:26 1997 +++ xc/doc/man/X11/XmbTPCEx.man Tue Nov 28 13:49:14 2000 @@ -1,4 +1,5 @@ .\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium +.\" Copyright \(co 2000 The XFree86 Project, Inc. .\" .\" Permission is hereby granted, free of charge, to any person obtaining .\" a copy of this software and associated documentation files (the @@ -39,6 +40,8 @@ .\" Digital and Tektronix makes no representations about the suitability .\" of this documentation for any purpose. .\" It is provided ``as is'' without express or implied warranty. +.\" +.\" $XFree86: xc/doc/man/X11/XmbTPCEx.man,v 1.3 2000/11/28 18:49:14 dawes Exp $ .\" .ds xT X Toolkit Intrinsics \- C Language Interface .ds xW Athena X Widgets \- C Language X Toolkit Interface @@ -140,7 +143,7 @@ .ny0 .TH XmbTextPerCharExtents 3X11 "Release 6.4" "X Version 11" "XLIB FUNCTIONS" .SH NAME -XmbTextPerCharExtents, XwcTextPerCharExtents \- obtain per-character information for a text string +XmbTextPerCharExtents, XwcTextPerCharExtents, Xutf8TextPerCharExtents \- obtain per-character information for a text string .SH SYNTAX Status XmbTextPerCharExtents\^(\^\fIfont_set\fP\^, \fIstring\fP\^, \fInum_bytes\fP\^, \fIink_array_return\fP\^, .br @@ -185,6 +188,28 @@ XRectangle *\fIoverall_ink_return\fP\^; .br XRectangle *\fIoverall_logical_return\fP\^; +.LP +Status Xutf8TextPerCharExtents\^(\^\fIfont_set\fP\^, \fIstring\fP\^, \fInum_bytes\fP\^, \fIink_array_return\fP\^, +.br + \fIlogical_array_return\fP\^, \fIarray_size\fP\^, \fInum_chars_return\fP\^, \fIoverall_ink_return\fP\^, \fIoverall_logical_return\fP\^) +.br + XFontSet \fIfont_set\fP\^; +.br + char *\fIstring\fP\^; +.br + int \fInum_bytes\fP\^; +.br + XRectangle *\fIink_array_return\fP\^; +.br + XRectangle *\fIlogical_array_return\fP\^; +.br + int \fIarray_size\fP\^; +.br + int *\fInum_chars_return\fP\^; +.br + XRectangle *\fIoverall_ink_return\fP\^; +.br + XRectangle *\fIoverall_logical_return\fP\^; .SH ARGUMENTS .IP \fIarray_size\fP 1i Specifies the size of ink_array_return and logical_array_return. @@ -210,9 +235,10 @@ Specifies the character string. .SH DESCRIPTION The -.ZN XmbTextPerCharExtents -and +.ZN XmbTextPerCharExtents , .ZN XwcTextPerCharExtents +and +.ZN Xutf8TextPerCharExtents functions return the text dimensions of each character of the specified text, using the fonts loaded for the specified font set. Each successive element of ink_array_return and logical_array_return @@ -255,14 +281,22 @@ Otherwise, the functions return a nonzero value. .LP If the overall_ink_return or overall_logical_return argument is non-NULL, -.ZN XmbTextPerCharExtents -and +.ZN XmbTextPerCharExtents , .ZN XwcTextPerCharExtents +and +.ZN Xutf8TextPerCharExtents return the maximum extent of the string's metrics to overall_ink_return or overall_logical_return, as returned by -.ZN XmbTextExtents +.ZN XmbTextExtents , +.ZN XwcTextExtents or -.ZN XwcTextExtents . +.ZN Xutf8TextExtents . +.LP +The function +.ZN Xutf8TextPerCharExtents +is an XFree86 extension introduced in XFree86 4.0.2. Its presence is +indicated by the macro +.ZN X_HAVE_UTF8_STRING . .SH "SEE ALSO" XmbTextEscapement(3X11), XmbTextExtents(3X11) Index: xc/doc/man/Xt/XtAppAI.man diff -u xc/doc/man/Xt/XtAppAI.man:1.1.1.4 xc/doc/man/Xt/XtAppAI.man:1.2 --- xc/doc/man/Xt/XtAppAI.man:1.1.1.4 Sun Sep 27 05:00:39 1998 +++ xc/doc/man/Xt/XtAppAI.man Tue Aug 1 16:28:37 2000 @@ -25,6 +25,7 @@ .\" not be used in advertising or otherwise to promote the sale, use or .\" other dealings in this Software without prior written authorization .\" from the X Consortium. +.\" $XFree86: xc/doc/man/Xt/XtAppAI.man,v 1.2 2000/08/01 20:28:37 dawes Exp $ .ds tk X Toolkit .ds xT X Toolkit Intrinsics \- C Language Interface .ds xI Intrinsics @@ -205,7 +206,7 @@ source, .br .B (XtPointer) -XtInputReadMask | XtInputWriteMask, +(XtInputReadMask | XtInputWriteMask), .br proc, .br Index: xc/doc/man/Xt/XtAppSetFR.man diff -u xc/doc/man/Xt/XtAppSetFR.man:1.1.1.4 xc/doc/man/Xt/XtAppSetFR.man:1.3 --- xc/doc/man/Xt/XtAppSetFR.man:1.1.1.4 Sun Sep 27 05:00:52 1998 +++ xc/doc/man/Xt/XtAppSetFR.man Tue Sep 26 11:56:28 2000 @@ -24,6 +24,8 @@ .\" be used in advertising or otherwise to promote the sale, use or other .\" dealing in this Software without prior written authorization from the .\" X Consortium. +.\" +.\" $XFree86: xc/doc/man/Xt/XtAppSetFR.man,v 1.3 2000/09/26 15:56:28 tsi Exp $ .ds tk X Toolkit .ds xT X Toolkit Intrinsics \- C Language Interface .ds xI Intrinsics @@ -152,12 +154,12 @@ .ZN XtAppSetFallbackResources is not required to copy \fIspecification_list\fP; the caller must ensure that the contents of the list and the strings addressed by the -list remain valid until all displys are initialized or until +list remain valid until all displays are initialized or until .ZN XtAppSetFallbackResources is called again. The value NULL for \fIspecification_list\fP removes any previous fallback resource specification for the application context. The intended use for fallback resources is to provide a minimal number -of resources that will amke the application usable (or at least terminate +of resources that will make the application usable (or at least terminate with helful diagnostic messages) when some problem exists in finding and loading the application defaults file. .SH "SEE ALSO" Index: xc/doc/man/general/X.cpp diff -u xc/doc/man/general/X.cpp:1.2 xc/doc/man/general/X.cpp:1.4 --- xc/doc/man/general/X.cpp:1.2 Wed Mar 22 16:23:34 2000 +++ xc/doc/man/general/X.cpp Tue Dec 12 13:06:51 2000 @@ -1,5 +1,6 @@ .\" $TOG: X.cpp /main/72 1997/10/13 14:20:40 kaleb $ .\" Copyright (c) 1994 X Consortium +.\" Copyright \(co 2000 The XFree86 Project, Inc. .\" .\" Permission is hereby granted, free of charge, to any person obtaining a .\" copy of this software and associated documentation files (the "Software"), @@ -23,7 +24,10 @@ .\" be used in advertising or otherwise to promote the sale, use or other .\" dealing in this Software without prior written authorization from the .\" X Consortium. -.TH X __miscmansuffix__ "Release 6.3" "X Version 11" +.\" +.\" $XFree86: xc/doc/man/general/X.cpp,v 1.4 2000/12/12 18:06:51 dawes Exp $ +.\" +.TH X __miscmansuffix__ "XFree86 4.0.2" "X Version 11" .SH NAME X \- a portable, network-transparent window system .SH SYNOPSIS @@ -972,6 +976,195 @@ into any site-wide defaults. All sites are encouraged to set up convenient ways of automatically loading resources. See the \fIXlib\fP manual section \fIResource Manager Functions\fP for more information. +.SH ENVIRONMENT +.TP +.SM +.B DISPLAY +This is the only mandatory environment variable. It must point to an +X server. See section "Display Names" above. +.TP +.SM +.B XAUTHORITY +This must point to a file that contains authorization data. The default +is \fI$HOME/.Xauthority\fP. See +.BR Xsecurity (__miscmansuffix__), +.BR xauth (1), +.BR xdm (1), +.BR Xau (3). +.TP +.SM +.B ICEAUTHORITY +This must point to a file that contains authorization data. The default +is \fI$HOME/.ICEauthority\fP. +.TP +.SM +.BR LC_ALL ", " LC_CTYPE ", " LANG +The first non-empty value among these three determines the current +locale's facet for character handling, and in particular the default +text encoding. See +.BR locale (__miscmansuffix__), +.BR setlocale (3), +.BR locale (1). +.TP +.SM +.B XMODIFIERS +This variable can be set to contain additional information important +for the current locale setting. Typically set to \fI@im=\fP +to enable a particular input method. See +.BR XSetLocaleModifiers (3). +.TP +.SM +.B XLOCALEDIR +This must point to a directory containing the locale.alias file and +Compose and XLC_LOCALE file hierarchies for all locales. The default value +is \fI/lib/X11/locale\fP, i.e. normally /usr/X11R6/lib/X11/locale. +.TP +.SM +.B XENVIRONMENT +This must point to a file containing X resources. The default is +\fI$HOME/.Xdefaults-\fP. Unlike \fI/lib/X11/Xresources\fP, +it is consulted each time an X application starts. +.TP +.SM +.B XFILESEARCHPATH +This must contain a colon separated list of path templates, where libXt +will search for resource files. The default value consists of +.sp +.nf + /lib/X11/%L/%T/%N%C%S:\\ + /lib/X11/%l/%T/%N%C%S:\\ + /lib/X11/%T/%N%C%S:\\ + /lib/X11/%L/%T/%N%S:\\ + /lib/X11/%l/%T/%N%S:\\ + /lib/X11/%T/%N%S +.fi +.sp +i.e. normally +.sp +.nf + /usr/X11R6/lib/X11/%L/%T/%N%C%S:\\ + /usr/X11R6/lib/X11/%l/%T/%N%C%S:\\ + /usr/X11R6/lib/X11/%T/%N%C%S:\\ + /usr/X11R6/lib/X11/%L/%T/%N%S:\\ + /usr/X11R6/lib/X11/%l/%T/%N%S:\\ + /usr/X11R6/lib/X11/%T/%N%S +.fi +.sp +A path template is transformed to a pathname by substituting: +.sp +.nf + %N => name (basename) being searched for + %T => type (dirname) being searched for + %S => suffix being searched for + %C => value of the resource "customization" + (class "Customization") + %L => the locale name + %l => the locale's language (part before '_') + %t => the locale's territory (part after '_` but before '.') + %c => the locale's encoding (part after '.') +.fi +.TP +.SM +.B XUSERFILESEARCHPATH +This must contain a colon separated list of path templates, +where libXt will search for user dependent resource files. The default +value is: +.sp +.nf + $XAPPLRESDIR/%L/%N%C:\\ + $XAPPLRESDIR/%l/%N%C:\\ + $XAPPLRESDIR/%N%C:\\ + $HOME/%N%C:\\ + $XAPPLRESDIR/%L/%N:\\ + $XAPPLRESDIR/%l/%N:\\ + $XAPPLRESDIR/%N:\\ + $HOME/%N +.fi +.sp +$XAPPLRESDIR defaults to \fI$HOME\fP, see below. +.sp +A path template is transformed to a pathname by substituting: +.sp +.nf + %N => name (basename) being searched for + %T => type (dirname) being searched for + %S => suffix being searched for + %C => value of the resource "customization" + (class "Customization") + %L => the locale name + %l => the locale's language (part before '_') + %t => the locale's territory (part after '_` but before '.') + %c => the locale's encoding (part after '.') +.fi +.TP +.SM +.B XAPPLRESDIR +This must point to a base directory where the user stores his application +dependent resource files. The default value is \fI$HOME\fP. Only used if +XUSERFILESEARCHPATH is not set. +.TP +.SM +.B XKEYSYMDB +This must point to a file containing nonstandard keysym definitions. +The default value is \fI/lib/X11/XKeysymDB\fP, i.e. normally +/usr/X11R6/lib/X11/XKeysymDB. +.TP +.SM +.B XCMSDB +This must point to a color name database file. The default value is +\fI/lib/X11/Xcms.txt\fP, i.e. normally /usr/X11R6/lib/X11/Xcms.txt. +.TP +.SM +.B XFT_CONFIG +This must point to a configuration file for the Xft library. The default +value is \fI/lib/X11/XftConfig\fP, i.e. normally +/usr/X11R6/lib/X11/XftConfig. +.TP +.SM +.B RESOURCE_NAME +This serves as main identifier for resources belonging to the program +being executed. It defaults to the basename of pathname of the program. +.TP +.SM +.B SESSION_MANAGER +Denotes the session manager the application should connect. See +.BR xsm (1), +.BR rstart (1). +.TP +.SM +.B XF86BIGFONT_DISABLE +Setting this variable to a non-empty value disables the XFree86-Bigfont +extension. This extension is a mechanism to reduce the memory consumption +of big fonts by use of shared memory. +.LP +.B XKB_FORCE +.br +.B XKB_DISABLE +.br +.B XKB_DEBUG +.br +.B _XKB_CHARSET +.br +.B _XKB_LOCALE_CHARSETS +.br +.B _XKB_OPTIONS_ENABLE +.br +.B _XKB_LATIN1_LOOKUP +.br +.B _XKB_CONSUME_LOOKUP_MODS +.br +.B _XKB_CONSUME_SHIFT_AND_LOCK +.br +.B _XKB_IGNORE_NEW_KEYBOARDS +.br +.B _XKB_CONTROL_FALLBACK +.br +.B _XKB_COMP_LED +.B _XKB_COMP_FAIL_BEEP +.TP +.SM +.I "" +These variables influence the X Keyboard Extension. .SH EXAMPLES The following is a collection of sample command lines for some of the more frequently used commands. For more information on a particular command, @@ -1038,26 +1231,82 @@ .SH "SEE ALSO" .PP .\" introductions -XProjectTeam(__miscmansuffix__), -XStandards(__miscmansuffix__), -Xsecurity(__miscmansuffix__), +.BR XProjectTeam (__miscmansuffix__), +.BR XStandards (__miscmansuffix__), +.BR Xsecurity (__miscmansuffix__), .\" clients, utilities, and demos - -appres(1), bdftopcf(1), bitmap(1), editres(1), fsinfo(1), -fslsfonts(1), fstobdf(1), iceauth(1), imake(1), lbxproxy(1), -makedepend(1), mkfontdir(1), oclock(1), proxymngr(1), rgb(1), -resize(1), rstart(1), smproxy(1), twm(1), x11perf(1), x11perfcomp(1), -xauth(1), xclipboard(1), xclock(1), xcmsdb(1), xconsole(1), xdm(1), -xdpyinfo(1), xfd(1), xfindproxy(1), xfs(1), xfwp(1), xhost(1), -xieperf(1), xinit(1), xkbbell(1), xkbcomp(1), xbkevd(1), xkbprint(1), -xkbvleds(1), xkbwatch(1), xkill(1), xlogo(1), xlsatoms(1), -xlsclients(1), xlsfonts(1), xmag(1), xmh(1), xmodmap(1), xon(1), -xprop(1), xrdb(1), xrefresh(1), xrx(1), xset(1), xsetroot(1), -xsm(1), xstdcmap(1), xterm(1), xwd(1), xwininfo(1), xwud(1). +.BR appres (1), +.BR bdftopcf (1), +.BR bitmap (1), +.BR editres (1), +.BR fsinfo (1), +.BR fslsfonts (1), +.BR fstobdf (1), +.BR iceauth (1), +.BR imake (1), +.BR lbxproxy (1), +.BR makedepend (1), +.BR mkfontdir (1), +.BR oclock (1), +.BR proxymngr (1), +.BR rgb (1), +.BR resize (1), +.BR rstart (1), +.BR smproxy (1), +.BR twm (1), +.BR x11perf (1), +.BR x11perfcomp (1), +.BR xauth (1), +.BR xclipboard (1), +.BR xclock (1), +.BR xcmsdb (1), +.BR xconsole (1), +.BR xdm (1), +.BR xdpyinfo (1), +.BR xfd (1), +.BR xfindproxy (1), +.BR xfs (1), +.BR xfwp (1), +.BR xhost (1), +.BR xieperf (1), +.BR xinit (1), +.BR xkbbell (1), +.BR xkbcomp (1), +.BR xbkevd (1), +.BR xkbprint (1), +.BR xkbvleds (1), +.BR xkbwatch (1), +.BR xkill (1), +.BR xlogo (1), +.BR xlsatoms (1), +.BR xlsclients (1), +.BR xlsfonts (1), +.BR xmag (1), +.BR xmh (1), +.BR xmodmap (1), +.BR xon (1), +.BR xprop (1), +.BR xrdb (1), +.BR xrefresh (1), +.BR xrx (1), +.BR xset (1), +.BR xsetroot (1), +.BR xsm (1), +.BR xstdcmap (1), +.BR xterm (1), +.BR xwd (1), +.BR xwininfo (1), +.BR xwud (1). .\" servers -Xserver(1), Xdec(1), XmacII(1), Xsun(1), Xnest(1), Xvfb(1), -XF86_Acc(1), XF86_Mono(1), XF86_SVGA(1), XF86_VGA16(1), XFree86(1), -kbd_mode(1), +.BR Xserver (1), +.BR Xdec (1), +.BR XmacII (1), +.BR Xsun (1), +.BR Xnest (1), +.BR Xvfb (1), +.BR XFree86 (1), +.BR Xdarwin (1), +.BR kbd_mode (1), .\" specifications .I "Xlib \- C Language X Interface\fR,\fP" and Index: xc/doc/man/misc/Imakefile diff -u /dev/null xc/doc/man/misc/Imakefile:1.1 --- /dev/null Mon Dec 18 14:21:14 2000 +++ xc/doc/man/misc/Imakefile Thu Dec 14 15:59:08 2000 @@ -0,0 +1,60 @@ +XCOMM $XFree86: xc/doc/man/misc/Imakefile,v 1.1 2000/12/14 20:59:08 dawes Exp $ + +/* + * This Imakefile is intended to make it possible to install man pages + * for architectures other than the one the build is done on. So far, + * it is only set up for builds on XFree86/ix86 platforms, which means that + * it only includes those man pages not normally installed there: + * + * XFree86 Linux/mips: newport + * XFree86 Linux/sparc: sunbw2, suncg14, suncg3, suncg6, sunffb, sunleo, + * suntcx + * XFree86 Linux/ix86: v4l, glide + * XFree86 Darwin: Xdarwin, dumpkeymap + * XFree86 Kdrive: Xkdrive, Xvesa, Xfbdev + */ + +CppManTarget(newport,) +CppManTarget(sunbw2,) +CppManTarget(suncg14,) +CppManTarget(suncg3,) +CppManTarget(suncg6,) +CppManTarget(sunffb,) +CppManTarget(sunleo,) +CppManTarget(suntcx,) +CppManTarget(v4l,) +CppManTarget(glide,) +CppManTarget(Xdarwin,) + +InstallGenManPage(newport,$(DRIVERMANDIR),$(DRIVERMANSUFFIX)) +InstallGenManPage(sunbw2,$(DRIVERMANDIR),$(DRIVERMANSUFFIX)) +InstallGenManPage(suncg14,$(DRIVERMANDIR),$(DRIVERMANSUFFIX)) +InstallGenManPage(suncg3,$(DRIVERMANDIR),$(DRIVERMANSUFFIX)) +InstallGenManPage(suncg6,$(DRIVERMANDIR),$(DRIVERMANSUFFIX)) +InstallGenManPage(sunffb,$(DRIVERMANDIR),$(DRIVERMANSUFFIX)) +InstallGenManPage(sunleo,$(DRIVERMANDIR),$(DRIVERMANSUFFIX)) +InstallGenManPage(suntcx,$(DRIVERMANDIR),$(DRIVERMANSUFFIX)) +InstallGenManPage(v4l,$(DRIVERMANDIR),$(DRIVERMANSUFFIX)) +InstallGenManPage(glide,$(DRIVERMANDIR),$(DRIVERMANSUFFIX)) +InstallGenManPage(Xdarwin,$(MANDIR),$(MANSUFFIX)) +InstallGenManPage(dumpkeymap,$(MANDIR),$(MANSUFFIX)) +InstallGenManPage(Xkdrive,$(MANDIR),$(MANSUFFIX)) +InstallGenManPage(Xvesa,$(MANDIR),$(MANSUFFIX)) +InstallGenManPage(Xfbdev,$(MANDIR),$(MANSUFFIX)) + +LinkSourceFile(newport.cpp,$(XF86DRIVERSRC)/newport) +LinkSourceFile(sunbw2.cpp,$(XF86DRIVERSRC)/sunbw2) +LinkSourceFile(suncg14.cpp,$(XF86DRIVERSRC)/suncg14) +LinkSourceFile(suncg3.cpp,$(XF86DRIVERSRC)/suncg3) +LinkSourceFile(suncg6.cpp,$(XF86DRIVERSRC)/suncg6) +LinkSourceFile(sunffb.cpp,$(XF86DRIVERSRC)/sunffb) +LinkSourceFile(sunleo.cpp,$(XF86DRIVERSRC)/sunleo) +LinkSourceFile(suntcx.cpp,$(XF86DRIVERSRC)/suntcx) +LinkSourceFile(v4l.cpp,$(XF86DRIVERSRC)/v4l) +LinkSourceFile(glide.cpp,$(XF86DRIVERSRC)/glide) +LinkSourceFile(Xdarwin.cpp,$(SERVERSRC)/hw/darwin) +LinkSourceFile(dumpkeymap.man,$(SERVERSRC)/hw/darwin/utils) +LinkSourceFile(Xkdrive.man,$(SERVERSRC)/hw/kdrive) +LinkSourceFile(Xvesa.man,$(SERVERSRC)/hw/kdrive/vesa) +LinkSourceFile(Xfbdev.man,$(SERVERSRC)/hw/kdrive/fbdev) + Index: xc/doc/misc/INSTALL.ms diff -u xc/doc/misc/INSTALL.ms:1.1.1.4 xc/doc/misc/INSTALL.ms:1.3 --- xc/doc/misc/INSTALL.ms:1.1.1.4 Sun Sep 27 05:04:20 1998 +++ xc/doc/misc/INSTALL.ms Thu Dec 14 16:14:07 2000 @@ -1,5 +1,6 @@ .\" $TOG: INSTALL.ms /main/10 1998/02/05 15:35:11 kaleb $ .\" X11R6.4 Installation instructions. Use troff -ms macros +.\" $XFree86: xc/doc/misc/INSTALL.ms,v 1.3 2000/12/14 21:14:07 dawes Exp $ .ds Ts 30 January, 1998\" .\" .ie t \{ @@ -83,6 +84,18 @@ .nr PS 11 .nr VS 13 +.nH 1 "Introduction" +.\" +This document is the installation notes that were provided with The Open +Group's X11R6.4 release. If you're building XFree86, it can be used as +a rough guide. Be aware that most of the details are not targetted +specifically at the current XFree86 source tree. XFree86-specific +documentation can be found in the \fBxc/programs/Xserver/hw/xfree86/doc\fP +directory and on-line at http://www.xfree86.org/current/. Some of the +documentation there is out of date, so also be aware of that. There is +currently no up to date document specifically targetted at building +XFree86 from source. + .nH 1 "Easy Build Instructions" .\" This quick summary is no substitute for reading the full build @@ -580,7 +593,7 @@ On NT, make certain your Path, Include, and Lib environment variables are set accordingly. For example here we use the command line compiler -in VC++ 4.0 Standard Edition, which is installed in C:\MSDEVSTD. To +in VC++ 4.0 Standard Edition, which is installed in C:\\MSDEVSTD. To setup the environment type: .ID > set Path=\fIold-path\fP;C:\\MSDEVSTD\\bin;C:\\\fIpath-to-RmTreeCmd\fP Index: xc/doc/misc/RELNOTES.ms diff -u xc/doc/misc/RELNOTES.ms:1.2 xc/doc/misc/RELNOTES.ms:1.4 --- xc/doc/misc/RELNOTES.ms:1.2 Sun Oct 4 21:27:31 1998 +++ xc/doc/misc/RELNOTES.ms Thu Dec 14 16:14:07 2000 @@ -1,5 +1,6 @@ .\" $TOG: RELNOTES.ms /main/20 1998/02/05 15:30:57 kaleb $ .\" X11R6.4 Release Notes. Use troff -ms macros +.\" $XFree86: xc/doc/misc/RELNOTES.ms,v 1.4 2000/12/14 21:14:07 dawes Exp $ .ds Ts 30 January, 1998\" .\" .ie t \{ @@ -86,6 +87,13 @@ .nr PS 11 .nr VS 13 + +.nH 1 "Introductory Note" +This document is the release notes that were provided with The Open Group's +X11R6.4 release. The XFree86-specific information in this document is +out of date. The XFree86-specific documentation can be found +in the \fBxc/programs/Xserver/hw/xfree86/doc\fP directory, and on-line +at http://www.xfree86.org/current/. .nH 1 "What Is X11" Index: xc/doc/specs/Imakefile diff -u xc/doc/specs/Imakefile:1.3 xc/doc/specs/Imakefile:1.5 --- xc/doc/specs/Imakefile:1.3 Thu Mar 2 12:52:57 2000 +++ xc/doc/specs/Imakefile Fri Dec 15 16:54:36 2000 @@ -1,5 +1,5 @@ XCOMM $XConsortium: Imakefile,v 1.10 94/07/25 12:21:20 gildea Exp $ -XCOMM $XFree86: xc/doc/specs/Imakefile,v 1.3 2000/03/02 17:52:57 dawes Exp $ +XCOMM $XFree86: xc/doc/specs/Imakefile,v 1.5 2000/12/15 21:54:36 dawes Exp $ #define IHaveSubdirs #define PassCDebugFlags @@ -7,9 +7,9 @@ #if defined(SpecsDocDirs) && !BuildAllSpecsDocs SUBDIRS = SpecsDocDirs #else -SUBDIRS = BDF CTEXT FSProtocol ICCCM XProtocol Xserver X11 XDMCP XLFD \ - Xaw Xmu Xt Xext Xi xfs PEX5 ICE SM xtrans XIM xterm rstart \ - GL Xv i18n programs +SUBDIRS = BDF CTEXT FSProtocol GL ICCCM ICE PEX5 PM Render SM X11 XDMCP \ + XIM XLFD XProtocol Xaw Xext Xi Xmu Xserver Xt Xv \ + i18n programs rstart xfs xterm xtrans #endif all:: Index: xc/doc/specs/CTEXT/ctext.tbl.ms diff -u xc/doc/specs/CTEXT/ctext.tbl.ms:1.1.1.4 xc/doc/specs/CTEXT/ctext.tbl.ms:1.2 --- xc/doc/specs/CTEXT/ctext.tbl.ms:1.1.1.4 Sun Sep 27 05:04:23 1998 +++ xc/doc/specs/CTEXT/ctext.tbl.ms Mon Dec 11 14:39:40 2000 @@ -1,8 +1,37 @@ .\" Use tbl and -ms +.\" +.\" $XFree86: xc/doc/specs/CTEXT/ctext.tbl.ms,v 1.2 2000/12/11 19:39:40 dawes Exp $ +.\" +.\" --- bP --- bulleted paragraph macro +.\" +.de bP +.IP \(bu 4 +.. +.\" +.\" --- cT --- centered title; centers $1, adds TOC entry unless $2 is "no" +.\" +.de cT +\\& \" filler so that the following .sp really leaves a space +.sp 1 +.ce 1 +\\s+1\\fB\\$1\\fP\\s-1 +.sp 1 +.if !'\\$2'no' \{\ +.XS \\n(PN +\\$1 +.XE +\} +.. .sp 8 -.ce 5 +.ce 9 \s+2\fBCompound Text Encoding\fP\s-2 .sp 6p +Version 1.1.xf86.1 +XFree86 4.0.2 +XFree86, Inc. +.sp 6p +.I "based on" +.sp 6p Version 1.1 X Consortium Standard X Version 11, Release 6.4 @@ -220,7 +249,7 @@ .sp 4p _ .sp 6p -4/02 94 7-bit ASCII graphics (ANSI X3.4-1968), +04/02 94 7-bit ASCII graphics (ANSI X3.4-1968), Left half of ISO 8859 sets 04/09 94 Right half of JIS X0201-1976 (reaffirmed 1984), 8-Bit Alphanumeric-Katakana Code @@ -236,10 +265,16 @@ 04/08 96 Right half of ISO 8859-8, Latin/Hebrew alphabet 04/12 96 Right half of ISO 8859-5, Latin/Cyrillic alphabet 04/13 96 Right half of ISO 8859-9, Latin alphabet No. 5 +05/06 96 Right half of ISO 8859-10, Latin alphabet No. 6 +05/09 96 Right half of ISO 8859-13, Latin alphabet No. 7 (Baltic Rim) +05/15 96 Right half of ISO 8859-14, Latin alphabet No. 8 (Celtic) +06/02 96 Right half of ISO 8859-15, Latin alphabet No. 9 +06/06 96 Right half of ISO 8859-16, Latin alphabet No. 10 .sp 6p 04/01 94\u\s-22\s+2\d GB2312-1980, China (PRC) Hanzi -04/02 94\u\s-22\s+2\d JIS X0208-1983, Japanese Graphic Character Set +04/02 94\u\s-22\s+2\d JIS X0208-1983/1990, Japanese Graphic Character Set 04/03 94\u\s-22\s+2\d KS C5601-1987, Korean Graphic Character Set +04/02 94\u\s-22\s+2\d JIS X0212-1990, Supplementary Japanese Graphic Character Set .sp 6p _ .TE @@ -300,9 +335,33 @@ they may contain octets in the C0 and C1 ranges, including 00/00, and octets comprising a given character may differ in their most significant bit. .LP -[ISO-registered ``other coding systems'' are not used in Compound Text; +[Except for UTF-8, +ISO-registered ``other coding systems'' are not used in Compound Text; extended segments are the only mechanism for non-2022 encodings.] .NH 1 +The UTF-8 encoding +.LP +Unicode characters that are not contained in one of the approved standard +encodings can be encoded using the UTF-8 encoding. The following escape +sequences are used: +.RS +.TS +l l. +01/11 02/05 04/07 switch into UTF-8 mode +01/11 02/05 04/00 return from UTF-8 mode +.TE +.RE +.LP +The first is the ISO registered sequence for UTF-8 (ISO-IR-196), the second +is the ISO-2022 ``standard return'' sequence. While in UTF-8 mode, the UTF-8 +encoding replaces the currently designated GL and GR encodings. After return +from UTF-8 mode, the previously designated GL and GR encodings are +reactivated. +.LP +[This is the only ``other coding system'' used in Compound Text.] +.LP +[This is an XFree86 extension introduced in XFree86 4.0.2.] +.NH 1 Directionality .LP If desired, horizontal text direction can be indicated using the following @@ -375,9 +434,16 @@ ISO8859-7 ISO 8859-7 Latin/Greek alphabet ISO8859-8 ISO 8859-8 Latin/Hebrew alphabet ISO8859-9 ISO 8859-9 Latin alphabet No. 5 +ISO8859-10 ISO 8859-10 Latin alphabet No. 6 +ISO8859-13 ISO 8859-13 Latin alphabet No. 7 (Baltic Rim) +ISO8859-14 ISO 8859-14 Latin alphabet No. 8 (Celtic) +ISO8859-15 ISO 8859-15 Latin alphabet No. 9 +ISO8859-16 ISO 8859-16 Latin alphabet No. 10 JISX0201.1976-0 JIS X0201-1976 (reaffirmed 1984) 8-bit Alphanumeric-Katakana Code GB2312.1980-0 GB2312-1980, GL encoding China (PRC) Hanzi JISX0208.1983-0 JIS X0208-1983, GL encoding Japanese Graphic Character Set +JISX0208.1990-0 JIS X0208-1990, GL encoding Japanese Graphic Character Set +JISX0212.1990-0 JIS X0212-1990, GL encoding Supplementary Japanese Graphic Character Set KSC5601.1987-0 KS C5601-1987, GL encoding Korean Graphic Character Set .sp 6p _ @@ -447,3 +513,28 @@ undefined control characters, or undefined control sequences, or incorrectly formatted extended segments), it is best to treat the entire string as invalid, except as indicated by a version control sequence. +.bp +.\" Set registers to number the appendixes A.1, B.1, C.1, ... +.nr H1 0 +.af H1 A +.cT "Appendix A" no +.nH 1 "Revision History" +.LP +This appendix describes the revision history of this document and +summarizes the incompatibilities between this and earlier versions. +.nH 2 "Version 1.1" +.LP +Version 1.1 is the original X11 specification. +.nH 2 "Version 1.1.xf86.1" +.LP +Version 1.1.xf86.1 was released with XFree86 4.0.2 in December 2000. +It adds the following changes: +.bP +Added ISO 8859-10,13,14,15,16 and JIS X0212 to the list of standard +encodings. Mention the 1990 revision of JIS X0208 as an alternative to +the 1983 edition. +.bP +Added ISO8859-10, ISO8859-13, ISO8859-14, ISO8859-15, ISO8859-16, +JISX0208.1990-0, JISX0212.1990-0 to the list of font charsets. +.bP +The section about UTF-8 encoding was added. Index: xc/doc/specs/ICCCM/icccm.ms diff -u xc/doc/specs/ICCCM/icccm.ms:1.1.1.4 xc/doc/specs/ICCCM/icccm.ms:1.2 --- xc/doc/specs/ICCCM/icccm.ms:1.1.1.4 Sun Sep 27 05:04:25 1998 +++ xc/doc/specs/ICCCM/icccm.ms Mon Dec 11 14:39:43 2000 @@ -1,4 +1,7 @@ .\" $TOG: icccm.ms /main/27 1997/11/04 18:06:31 kaleb $ +.\" +.\" $XFree86: xc/doc/specs/ICCCM/icccm.ms,v 1.2 2000/12/11 19:39:43 dawes Exp $ +.\" .\" Use tbl, eqn, -ms, and macros.t .\" @(#)icccm.ms 1.50 16 Apr 1994 14:13:55 .EH '''' @@ -39,6 +42,14 @@ .B \s+2Inter-Client Communication Conventions Manual\s0 +Version 2.0.xf86.1 + +XFree86 4.0.2 + +XFree86, Inc. + +.I "based on" + Version 2.0 X Consortium Standard @@ -1389,6 +1400,9 @@ USER TEXT T{ The name of the user running the owner T} +UTF8_STRING TEXT T{ +UTF-8 text +T} .sp 6p _ .TE @@ -1665,6 +1679,7 @@ PIXMAP 32 Fixed-size SPAN 32 Fixed-size STRING 8 Zero +UTF8_STRING 8 Zero WINDOW 32 Fixed-size .sp 6p _ @@ -1699,7 +1714,7 @@ it would be STRING or some other ATOM naming the encoding chosen by the owner. .LP STRING as a type or a target specifies the ISO Latin-1 character set plus the -control characters TAB (octal 11) and NEWLINE (octal 12). +control characters TAB (hex 09) and NEWLINE (hex 0A). The spacing interpretation of TAB is context dependent. Other ASCII control characters are explicitly not included in STRING at the present time. @@ -1707,6 +1722,9 @@ COMPOUND_TEXT as a type or a target specifies the Compound Text interchange format; see the \fICompound Text Encoding\fP. .LP +UTF8_STRING as a type or a target specifies an UTF-8 encoded string, with +NEWLINE (U+000A, hex 0A) as end-of-line marker. +.LP There are some text objects where the source or intended user, as the case may be, does not have a specific character set for the text, but instead merely requires a zero-terminated sequence of bytes with no @@ -1729,9 +1747,9 @@ property type is suitable. .NE .LP -Type STRING, COMPOUND_TEXT, and C_STRING properties will consist of a list -of elements separated by null characters; other encodings will need to -specify an appropriate list format. +Type STRING, COMPOUND_TEXT, UTF8_STRING, and C_STRING properties will +consist of a list of elements separated by null characters; other encodings +will need to specify an appropriate list format. .nH 3 "INCR Properties" .LP Requestors may receive a property of type INCR\** Index: xc/doc/specs/PM/Imakefile diff -u /dev/null xc/doc/specs/PM/Imakefile:1.1 --- /dev/null Mon Dec 18 14:21:19 2000 +++ xc/doc/specs/PM/Imakefile Thu Dec 14 12:41:04 2000 @@ -0,0 +1,7 @@ +XCOMM $XFree86: xc/doc/specs/PM/Imakefile,v 1.1 2000/12/14 17:41:04 dawes Exp $ + +all:: + +InstallDoc(PM_spec,PM_spec.txt) + +LinkFile(PM_spec.txt,PM_spec) Index: xc/doc/specs/Render/Imakefile diff -u /dev/null xc/doc/specs/Render/Imakefile:1.1 --- /dev/null Mon Dec 18 14:21:19 2000 +++ xc/doc/specs/Render/Imakefile Fri Dec 15 16:54:37 2000 @@ -0,0 +1,5 @@ +XCOMM $XFree86: xc/doc/specs/Render/Imakefile,v 1.1 2000/12/15 21:54:37 dawes Exp $ + +InstallDoc(render-protocol,render-protocol.txt) + +LinkFile(render-protocol.txt,protocol) Index: xc/doc/specs/Render/protocol diff -u /dev/null xc/doc/specs/Render/protocol:1.1 --- /dev/null Mon Dec 18 14:21:19 2000 +++ xc/doc/specs/Render/protocol Fri Dec 15 13:33:53 2000 @@ -0,0 +1,964 @@ + The X Rendering Extension + Version 0.0.15 + 2000-11-19 + Keith Packard + keithp@xfree86.org + +1. Introduction + +The X Rendering Extension (Render) introduces digital image composition as +the foundation of a new rendering model within the X Window System. +Rendering geometric figures is accomplished by client-side tesselation into +either triangles or trapezoids. Text is drawn by loading glyphs into the +server and rendering sets of them. + +2. Acknowledgments + +This extension was the work of many people, in particular: + + + Thomas Porter and Tom Duff for their formal description + of image compositing. + + + Rob Pike and Russ Cox who designed the Plan 9 window system from + which the compositing model was lifted. + + + Juliusz Chroboczek and Raph Levien whose proposal for client-side + glyph management eliminated font handling from the X server. + + + Jon Leech, Brad Grantham and Allen Akin for patiently explaining + how OpenGL works. + +3. Rendering Model + +Render provides a single rendering operation which can be used in a variety of +ways to generate images: + + dest = (source IN mask) OP dest + +Where 'IN' is the Porter/Duff operator of that name and 'OP' is any of the +list of compositing operators described below, among which can be found all +of the Porter/Duff binary operators. + +To use this operator several additional values are required: + + + The destination rectangle. This is a subset of the destination + within which the rendering is performed. + + + The source location. This identifies the coordinate in the + source aligned with the upper left corner of the + destination rectangle. + + + The mask location. This identifies the coordinate in the + mask aligned with the upper left corner of the + destination rectangle. + + + A clip list. This limits the rendering to the intersection of the + destination rectangle with this clip list. + + + The OP to use + + + Whether the source should be repeated to cover the destination + rectangle or whether rendering should be clipped by the source + + + Whether the mask should be repeated to cover the destination + rectangle or whether rendering should be clipped by the mask + + + Whether the mask has a single alpha value for all four channels or + whether each mask channel should affect the associated source/dest + channels. + +These parameters are variously attached to the operands or included in each +rendering request. + +4. Data types + +The core protocol rendering system uses a pixel model and applies color only +in the final generation of the video signal. A compositing model operates +on colors, not pixel values so a new datatype is needed to interpret data as +color instead of just bits. + +The "PictFormat" object holds information needed to translate pixel values +into red, green, blue and alpha channels. The server has a list of picture +formats corresponding to the various visuals on the screen. There are two +classes of formats, Indexed and Direct. Indexed PictFormats hold a list of +pixel values and RGBA values while Direct PictFormats hold bit masks for each +of R, G, B and A. + +The "Picture" object contains a Drawable, a PictFormat and some +rendering state. More than one Picture can refer to the same Drawable. + +5. Errors + +Errors are sent using core X error reports. + +PictFormat + A value for a PICTFORMAT argument does not name a defined PICTFORMAT. + +Picture + A value for a PICTURE argument does not name a defined PICTURE. + +PictOp + A value for a PICTOP argument does not name a defined PICTOP. + +GlyphSet + A value for a GLYPHSET argument does not name a defined GLYPHSET. + +Glyph + A value for a GLYPH argument does not name a defined GLYPH in the + glyphset. + +6. Protocol Types + +PICTURE 32-bit value (top three bits guaranteed to be zero) +PICTFORMAT 32-bit value (top three bits guaranteed to be zero) +PICTTYPE { Indexed, Direct } +PICTOP { Clear, Src, Dst, Over, OverReverse, In, InReverse, + Out, OutReverse, Atop, AtopReverse, Xor, Add, Saturate } +COLOR [ + red, green, blue, alpha: CARD16 + ] +CHANNELMASK [ + shift, mask: CARD16 + ] +DIRECTFORMAT [ + red, green, blue, alpha: CHANNELMASK + ] +INDEXVALUE [ + pixel: Pixel; + red, green, blue, alpha: CARD16 + ] +PICTFORMINFO [ + id: PICTFORMAT + type: PICTTYPE + depth: CARD8 + direct: DIRECTFORMAT + colormap: COLORMAP or None + ] + +PICTVISUAL [ + visual: VISUALID or None + format: PICTFORMAT + ] + +PICTDEPTH [ + depth: CARD8 + visuals: LISTofPICTVISUAL + ] + +PICTSCREEN LISTofPICTDEPTH + +DITHERINFO [ + name: ATOM + format: PICTFORMAT + width: CARD16 + height: CARD16 + ] + +FIXED 32-bit value (top 24 are integer portion, bottom 8 are fraction) +POINTFIX [ + x, y: FIXED + ] +POLYEDGE { Sharp, Smooth } +POLYMODE { Precise, Imprecise } +COLORPOINT [ + point: POINTFIX + color: COLOR + ] +SPANFIX [ + left, right, y: FIXED + ] +COLORSPANFIX [ + left, right, y: FIXED + left_color: COLOR + right_color: COLOR +QUAD [ + p1, p2, p3, p4: POINTFIX + ] +TRIANGLE [ + p1, p2, p3: POINTFIX + ] +TRAP [ + top, bottom: SPANFIX + ] +COLORTRIANGLE [ + p1, p2, p3: COLORPOINT + ] +COLORTRAP [ + top, bottom: COLORSPANFIX + ] +GLYPHSET 32-bit value (top three bits guaranteed to be zero) +GLYPH 32-bit value +GLYPHINFO [ + width, height: CARD16 + x, y: INT16 + off-x, off-y: INT16 + ] +PICTGLYPH [ + info: GLYPHINFO + x, y: INT16 + ] +GLYPHABLE GLYPHSET or FONTABLE +GLYPHELT8 [ + dx, dy: INT16 + glyphs: LISTofCARD8 + ] +GLYPHITEM8 GLYPHELT8 or GLYPHABLE +GLYPHELT16 [ + dx, dy: INT16 + glyphs: LISTofCARD16 + ] +GLYPHITEM16 GLYPHELT16 or GLYPHABLE +GLYPHELT32 [ + dx, dy: INT16 + glyphs: LISTofCARD32 + ] +GLYPHITEM32 GLYPHELT32 or GLYPHABLE + +7. Standard PictFormats + +The server must support a Direct PictFormat with 8 bits each of red, green, +blue and alpha as well as a Direct PictFormat with 8 bits of red, green and +blue and 0 bits of alpha. The server must also support Direct PictFormats +with 1, 4 and 8 bits of alpha and 0 bits of r, g and b. + +Pixel component values lie in the close range [0,1]. These values are +encoded in a varying number of bits. Values are encoded in a straight +forward manner. For a component encoded in m bits, a binary encoding b +is equal to a component value of b/(2^m-1). + +A Direct PictFormat with zero bits of alpha component is declared to have +alpha == 1 everywhere. A Direct PictFormat with zero bits of red, green and +blue is declared to have red, green, blue == 0 everywhere. If any of red, +green or blue components are of zero size, all are of zero size. Direct +PictFormats never have colormaps and are therefore screen independent. + +Indexed PictFormats never have alpha channels and the direct component is all +zeros. Indexed PictFormats always have a colormap in which the specified +colors are allocated read-only and are therefore screen dependent. + +8. Compositing Operators + +For each pixel, the four channels of the image are computed with: + + C = Ca * Fa + Cb * Fb + +where C, Ca, Cb are the values of the respective channels and Fa and Fb +come from the following table: + + PictOp Fa Fb + ------------------------------------------ + Clear 0 0 + Src 1 0 + Dst 0 1 + Over 1 1-Aa + OverReverse 1-Ab 1 + In Ab 0 + InReverse 0 Aa + Out 1-Ab 0 + OutReverse 0 1-Aa + Atop Ab 1-Aa + AtopReverse 1-Ab Aa + Xor 1-Ab 1-Aa + Add 1 1 + Saturate min(1,(1-Ab)/Aa) 1 + +--- + +Saturate matches GL with FUNC_ADD, SRC_ALPHA_SATURATE, ONE, except +that it uses premultiplied alphas while GL uses non-premultiplied alphas. + +Remember the idea is to apply (src In mask) Saturate Dst so that +computing (src In mask) effectively applies alpha values of 'mask' to +src; the server could 'short circuit' that computation by only multiplying +the alpha channel and then applying the regular GL SRC_ALPHA_SATURATE +operator. + +--- + +The result of any compositing operator is always limited to the range +[0,1] for each component. Components whose value would be greater than 1 +are set to 1. + +When the mask contains separate alpha values for each channel, the +alpha value resulting from the combination of that value with the source +alpha channel is used in the final image composition. + +9. Polygon Rasterization + +All polygons must be convex. Rendering of concave polygons is unspecified +except that the result must obey the clipping rules. + +Each polygon request fills the region closed by the specified path. The +path is automatically closed if the last point does not coincide with the +first point. + +A point is infinitely small and the path is an infinitely thin line. A +pixel is inside if the center point of the pixel is inside and the center +point is not on the boundary. If the center point is on the boundary, the +pixel is inside if and only if the polygon interior is immediately to its +right (x increasing direction). Pixels with centers along a horizontal edge +are a special case and are inside if and only if the polygon interior is +immediately below (y increasing direction). A polygon contains a pixel if +the pixel is inside the polygon. + +Polygons are rasterized by implicit generating an alpha mask and using that +in the general compositing operator along with a supplied source image: + + tmp = Rasterize (polygon) + Composite (op, dst, src, tmp) + +When rasterized with Sharp edges, the mask is generated by setting pixels +inside the polygon to 1 and pixels outside the mask to 0. + +When rasterized with Smooth edges, the mask is generated by creating a square +around each pixel coordinate and computing the amount of that square covered +by the polygon. Yes, this ignores sampling theory but it provides a precise +definition which is close to the right answer. This value is truncated to +the alpha width in the fallback format before application of the compositing +operator. + +When rasterized in Precise mode, the pixelization will match this +specification exactly. + +When rasterized in Imprecise mode, the pixelization may deviate from this +specification by up to 1/2 pixel along any edge subject to the following +constraints: + + + Abutting edges must match precisely. When specifying two polygons + abutting along a common edge, if that edge is specified with the + same coordinates in each polygon then the sum of alpha values for + pixels inside the union of the two polygons must be precisely one. + + + Translationally invarient. The pixelization of the polygon must + be the same when either the polygon or the target drawable + are translated by any whole number of pixels in any direction. + + + Sharp edges are honored. When the polygon is rasterized with Sharp + edges, the implicit alpha mask will contain only 1 or 0 for + each pixel. + + + Order independent. Two identical polygons specified with vertices + in different orders must generate identical results. + +Polygons can also be specified with colors for each vertex. These color +values are interpolated along the edges and across each scanline. + +When rasterized in Precise mode, the interpolated colors are exact. + +When rasterized in Imprecise mode, the color of each pixel may optionally be +interpolated from a triangle containing the pixel which is formed from any +three polygon vertices. Any interpolated color value can err up to 1 lsb in +each channel. + +10. Glyph Rendering + +Glyphs are small alpha masks which can be stored in the X server and +rendered by referring to them by name. A set of glyphs can be rendered in a +single request. Glyphs are positioned by subtracting the x, y elements of +the GLYPHINFO from the requested rendering position. The next glyph +rendering position is set to the current rendering position plus the off-x +and off-y elements. + +Glyphs are stored in GlyphSets and are named within the GlyphSet with +client-specified 32-bit numbers. + +Glyphs can be stored in any PictFormat supported by the server. All glyphs +in a GlyphSet are stored in the same format. + +11. Dithering + +Each screen supports a list of dithers. There are several standard dithers +with defined pixelization, the server is free to offer others as well. The +width and height of the dither are a hint about the size of the matrix used +if the dither is ordered. An unordered dither will have zero in these +fields. + +The standard dithers are: + + "Standard2x2" + "Standard4x4" + "Standard128x128" + +--- + +Need a notation for specifying pixelization of dithers. + +--- + +12. Extension Initialization + +The client must negotiate the version of the extension before executing +extension requests. Behavior of the server is undefined otherwise. + +QueryVersion + + client-major-version: CARD32 + client-minor-version: CARD32 + + -> + + major-version: CARD32 + minor-version: CARD32 + + The client sends the highest supported version to the server and + the server sends the highest version it supports, but no higher than + the requested version. Major versions changes can introduce + incompatibilities in existing functionality, minor version + changes introduce only backward compatible changes. It is + the clients responsibility to ensure that the server supports + a version which is compatible with its expectations. + +QueryPictFormats + + -> + + fallback: PICTFORMAT + formats: LISTofPICTFORMINFO + screens: LISTofPICTSCREEN + + The server responds with a list of supported PictFormats and + a list of which PictFormat goes with each visual on each screen. + Every PictFormat must match a supported depth, but not every + PictFormat need have a matching visual. + + The fallback format is used as an intermediate representation + in cases where there is no ideal choice. + +QueryPictIndexValues + + format: PICTFORMAT + + -> + + values: LISTofINDEXVALUE + + Errors: + PictFormat, Match + + Returns the mapping from pixel values to RGBA values for the + specified Indexed PictFormat. If 'format' does not refer to + an Indexed PictFormat a Match error is generated. + +QueryDithers + + drawable: DRAWABLE + + -> + + dithers: LISTofDITHERINFO + + Returns all of the supported dithers on the screen specified by + drawable. + +13. Extension Requests + +CreatePicture + + pid: PICTURE + drawable: DRAWABLE + format: PICTFORMAT + value-mask: BITMASK + value-list: LISTofVALUE + + Errors: + Alloc, Drawable, IDChoice, Match, Pixmap, Picture, + PictFormat, Value + + This request creates a Picture object associated with the specified + drawable and assigns the identifier pid to it. Pixel data in the + image are interpreted according to 'format'. It is a Match error + to specify a format with a different depth than the drawable. If + the drawable is a Window then the Red, Green and Blue masks must + match those in the visual for the window else a Match error is + generated. + + The value-mask and value-list specify attributes of the picture that + are to be explicitly initialized. The possible values are: + + repeat: BOOL + alpha-map: PICTURE or None + alpha-x-origin: INT16 + alpha-y-origin: INT16 + clip-x-origin: INT16 + clip-y-origin: INT16 + clip-mask: PIXMAP or None + graphics-exposures: BOOL + subwindow-mode: { ClipByChildren, IncludeInferiors } + poly-edge: POLYEDGE + poly-mode: POLYMODE + dither: ATOM or None + component-alpha: BOOL + + The repeat value controls whether the image is replicated + when used as the source or mask in a rendering operation. When + True, the contents are tiled over the destination instead of clipping + to the geometry of the drawable. + + The alpha channel of alpha-map is used in place of any alpha channel + contained within the drawable for all rendering operations. The + alpha-mask origin is interpreted relative to the origin of drawable. + Rendering is additionally clipped by the geometry of alpha-map. + Exposures to the window do not affect the contents of alpha-map. + Alpha-map must refer to a picture containing a Pixmap, not a Window + (or a Match error results). + + The clip-mask restricts reads and writes to drawable. Only pixels + where the clip-mask has bits set to 1 are read or written. Pixels + are not accessed outside the area covered by the clip-mask or where + the clip-mask has bits set to 0. The clip-mask affects all graphics + requests, including sources. The clip-mask origin is interpreted + relative to the origin of drawable. If a pixmap is specified as the + clip-mask, it must have depth 1 and have the same root as the + drawable (or a Match error results). If clip-mask is None, then + pixels are always drawn, regardless of the clip origin. The + clip-mask can also be set with the SetPictureClipRectangles request. + + For ClipByChildren, both source and destination windows are + additionally clipped by all viewable InputOutput children. For + IncludeInferiors , neither source nor destination window is clipped + by inferiors. This will result in including subwindow contents in + the source and drawing through subwindow boundaries of the + destination. The use of IncludeInferiors with a source or + destination window of one depth with mapped inferiors of differing + depth is not illegal, but the semantics are undefined by this + extension. + + The graphics-exposures flag controls GraphicsExposure event + generation for Composite and Transform requests (and any similar + requests defined by additional extensions). + + Poly-edge and poly-mode control the rasterization of polygons + as described above. + + Dither selects which of the available dither patterns should + be used. If dither is None, no dithering will be done. + + Component-alpha indicates whether each image component is + intended as a separate alpha value when the picture is used + as a mask operand. + + The default component values are + + Component Default + ------------------------------- + op Over + repeat False + clip-x-origin 0 + clip-y-origin 0 + clip-mask None + graphics-exposures True + subwindow-mode ClipByChildren + poly-edge Smooth + poly-mode Precise + dither None + component-alpha False + +ChangePicture + + pid: PICTURE + value-mask: BITMASK + value-list: LISTofVALUE + + Errors: + Picture, Alloc, Pixmap, PictOp, Value + + The value-mask and value-list specify which attributes are to be + changed. The values and restrictions are the same as for + CreatePicture. + +SetPictureClipRectangles + + picture: PICTURE + clip-x-origin: INT16 + clip-y-origin: INT16 + rectangles: LISTofRECTANGLE + + Errors: + Alloc, Picture + + This request changes clip-mask in picture to the specified list of + rectangles and sets the clip origin. Input and output will be + clipped to remain contained within the rectangles. The clip origin + is interpreted relative to the origin of the drawable associated + with picture. The rectangle coordinates are interpreted relative to + the clip origin. Note that the list of rectangles can be empty, + which effectively disables output. This is the opposite of passing + None as the clip-mask in CreatePicture and ChangePicture. + + Note that output is clipped to the union of all of the rectangles + and that no particular ordering among the rectangles is required. + +FreePicture + + pid: PICTURE + + Errors: + Picture + + This request deletes the association between the resource ID and the + picture and destroys the picture. + +Composite + + op: PICTOP + src: PICTURE + mask: PICTURE or None + dst: PICTURE + src-x, src-y: INT16 + mask-x, mask-y: INT16 + dst-x, dst-y: INT16 + width, height: CARD16 + + This request combines the specified rectangle of src and mask with + the specified rectangle of dst using op as the compositing + operator. The coordinates are relative their respective drawable's + origin. Rendering is clipped to the geometry of the dst drawable + and then to the dst clip-list, the src clip-list and the mask + clip-list. + + If the specified rectangle extends beyond src, then if src has + the repeat attribute set, the src picture will be tiled to + fill the specified rectangle, otherwise rendering is clipped to + the src geometry. + + If the specified rectangle extends beyond mask, then if mask has + the repeat attribute set, the mask picture will be tiled to + fill the specified rectangle, otherwise rendering is clipped to + the mask geometry. + + If src, mask and dst are not in the same format, and one of their + formats can hold all without loss of precision, they are converted + to that format. Alternatively, the server will convert each + operand to the fallback format. + + If mask is None, it is replaced by a constant alpha value of 1. + + When dst has clip-notify set, a NoExpose event is sent if the + rendering operation was not clipped by either src or mask, otherwise + a sequence of GraphicsExpose events are sent covering areas in dst + where rendering was clipped by src or mask. + +Scale + + color-scale: CARD32 + alpha-scale: CARD32 + src: PICTURE + dst: PICTURE + src-x, src-y: INT16 + dst-x, dst-y: INT16 + width, height: CARD16 + + This request replaces the specified rectangle in dst with + the specified rectangle of src with the components multiplied + in the following fashion: + + dst-red = src-red * color-scale / 65536 + dst-green = src-green * color-scale / 65536 + dst-blue = src-blue * color-scale / 65536 + dst-alpha = src-alpha * alpha-scale / 65536 + + The coordinates are relative their respective drawable's + origin. Rendering is clipped to the geometry of the dst drawable + and then to the dst clip-list, the src clip-list and the mask + clip-list. + + If the specified rectangle extends beyond src, then if src has + the repeat attribute set, the src picture will be tiled to + fill the specified rectangle, otherwise rendering is clipped to + the src geometry. + +FillRectangles + + op: PICTOP + dst: PICTURE + color: COLOR + rects: LISTofRECTANGLE + + This request combines color with the destination drawable in the + area specified by rects. Each rectangle is combined separately; + overlapping areas will be rendered multiple times. The effect is + equivalent to compositing with a repeating source picture filled with + the specified color. + +Trapezoids + + op: PICTOP + src: PICTURE + src-x, src-y: INT16 + dst: PICTURE + traps: LISTofTRAP + + This request rasterizes the list of trapezoids. For each span, the + left coordinate must be less than or equal to the right coordinate. + The y coordinate of the top span must be less than or equal to the + y coordinate of the bottom span. Results are undefined otherwise. + +Triangles + + op: PICTOP + src: PICTURE + src-x, src-y: INT16 + dst: PICTURE + traps: LISTofTRIANGLE + + This request rasterizes the list of triangles in the order they + occur in the list. + +TriStrip + + op: PICTOP + src: PICTURE + src-x, src-y: INT16 + dst: PICTURE + points: LISTofPOINTFIX + + Triangles are formed by initially using the first three points and + then by eliminating the first point and appending the next point in + the list. If fewer than three points are provided, this request does + nothing. + +TriFan + op: PICTOP + src: PICTURE + src-x, src-y: INT16 + dst: PICTURE + points: LISTofPOINTFIX + + Triangles are formed by initially using the first three points and + then by eliminating the second point and appending the next point + int the list. If fewer than three points are provided, this request + does nothing. + +??? + +Should I bother with these two compressed triangle representations? + +??? + +ColorTrapezoids + + op: PICTOP + dst: PICTURE + triangles: LISTofCOLORTRAP + + The geometry of the trapezoids must meet the same requirements as + for the Trapezoids request. The trapezoids are filled in the order + they occur in the list. + +ColorTriangles + + op: PICTOP + dst: PICTURE + triangles: LISTofCOLORTRIANGLE + + The colored triangles are rasterized in the order they occur in the + list. + +??? + +Should I included compressed triangle representations here? + +??? + +Transform + + op: PICTOP + src: PICTURE + dst: PICTURE + src-quad: QUAD + dst-quad: QUAD + filter: { Nearest, ... } + + Errors: + Picture, Value + + This request combines the specified quadrilateral of src with the + specified quadrilateral of dst using op as the compositing operator. + The coordinates are relative their respective drawable's origin. + Rendering is clipped to the geometry of the dst drawable and then to + the dst clip-list and the src clip-list. + + If the specified rectangle extends beyond src, then if src has + the repeat attribute set, the src picture will be tiled to + fill the specified rectangle, otherwise rendering is clipped to + the src geometry. + + If the specified rectangle extends beyond mask, then if mask has + the repeat attribute set, the mask picture will be tiled to + fill the specified rectangle, otherwise rendering is clipped to + the mask geometry. + + The effect of this request is: + + tmp_image = affine-transform (src, src-quad * dst-quad) + tmp_mask = render (dst-quad) + Composite (op, dst, tmp_image, tmp_mask) + + That is, the entire transformed source image is masked by an + image of the destination quadrilateral and rendered using the Composite + operator. + + If the specified quadrilateral extends beyond src, then if src has + the repeat attribute set, the src picture will be tiled to + fill the specified rectangle, otherwise rendering is clipped to + the src geometry. + + It is a Value error to specify a self intersecting quadrilateral for + either src-quad or dst-quad. + + If src and dst are not in the same format, and one of their formats + can hold both without loss of precision, they are converted to that + format. Alternatively, the server will convert each operand to the + fallback format. + + The compositing operator from the src picture is used to merge the + images together. + + If filter is Nearest, then the nearest (converted) pixel values to + each destination pixel is used without averaging. + + When dst has clip-notify set, a NoExpose event is sent if the + rendering operation was not clipped by src, otherwise a sequence of + GraphicsExpose events are sent covering areas in dst where rendering + was clipped by src. + +??? + + What (small) set of filters should be included + +??? + +--- + + Need to describe in more detail the semantics here + + Looks like the geometric extension needs to be tied to the + compositing extension (sigh). + +--- + + +CreateGlyphSet + + gsid: GLYPHSET + format: PICTFORMAT + + Errors: + Alloc, IDChoice, PictFormat, Match + + This request creates a container for glyphs. The glyphset and + all contained glyphs are destroyed when gsid and any other names + for the glyphset are freed. Format must be a Direct format, when + it contains RGB values, the glyphs are composited using + component-alpha True, otherwise they are composited using + component-alpha False. + +ReferenceGlyphSet + + gsid: GLYPHSET + existing: GLYPHSET + + Errors: + Alloc, IDChoice, GlyphSet + + This request creates an additional name for the existing glyphset. + The glyphset will not be freed until all references to it are + destroyed. + +FreeGlyphSet + + glyphset: GLYPHSET + + Errors: + GlyphSet + + This request frees the name for the glyphset. When all names have + been freed, the glyphset and all contained glyphs are freed. + +AddGlyphs + glyphset: GLYPHSET + glyphids: LISTofCARD32 + glyphs: LISTofGLYPHINFO + data: LISTofBYTE + + Errors: + GlyphSet, Alloc + + This request adds glyphs to glyphset. The image for the glyphs + are stored with each glyph in a separate Z-format image padded to a + 32-bit boundary. Existing glyphs with the same names are replaced. + +AddGlyphsFromPicture + + glyphset: GLYPHSET + src: PICTURE + glyphs: LISTofPICTGLYPH + + Errors: + GlyphSet, Alloc + + This request adds glyphs to glyphset by copying them from src from + the locations included in glyphs. Existing glyphs with the same + names are replaced. Src may be in a different PictFormat than + glyphset, in which case the images are converted to the glyphset + format. + +FreeGlyphs + + glyphset: GLYPHSET + glyphs: LISTofGLYPH + + Errors: + GlyphSet, Match + + This request removes glyphs from glyphset. Each glyph must exist + in glyphset (else a Match error results). + +CompositeGlyphs8 +CompositeGlyphs16 +CompositeGlyphs32 + + op: PICTOP + src: PICTURE + dst: PICTURE + mask-format: PICTFORMAT or None + glyphset: GLYPHABLE + src-x, src-y: INT16 + dst-x, dst-y: INT16 + glyphcmds: LISTofGLYPHITEM8 CompositeGlyphs8 + glyphcmds: LISTofGLYPHITEM16 CompositeGlyphs16 + glyphcmds: LISTofGLYPHITEM32 CompositeGlyphs32 + + Errors: + Picture, PictOp, PictFormat, GlyphSet, Glyph + + The dst-x and dst-y coordinates are relative to the drawable's + origin and specify the baseline starting position (the initial glyph + origin). Each glyph item is processed in turn. A glyphset item + causes the glyhpset to be used for subsequent glyphs. Switching + among glyphsets does not affect the next glyph origin. A glyph + element delta-x and delta-y specify additional changes in the + position along the x and y axes before the string is drawn; the + deltas are always added to the glyph origin. + + All contained GLYPHSETs are always transmitted most significant byte + first. + + If a GlyphSet error is generated for an item, the previous items may + have been drawn. + + When mask-format is not None, glyphs are rendered in the following + way with the effective mask computed in mask-format: + + tmp = temporary alpha picture + Combine (Zero, tmp, tmp, None) + for each glyph + Combine (Add, tmp, glyph, None) + Combine (op, dst, source, tmp) + + When mask-format is None, glyphs are rendered in the order specified + directly to the destination: + + for each glyph + Combine (op, dst, source, glyph) + Index: xc/doc/specs/X11/CH01 diff -u xc/doc/specs/X11/CH01:1.1.1.4 xc/doc/specs/X11/CH01:1.2 --- xc/doc/specs/X11/CH01:1.1.1.4 Sun Sep 27 05:05:28 1998 +++ xc/doc/specs/X11/CH01 Tue Nov 28 13:49:17 2000 @@ -1,4 +1,5 @@ .\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium +.\" Copyright \(co 2000 The XFree86 Project, Inc. .\" .\" Permission is hereby granted, free of charge, to any person obtaining .\" a copy of this software and associated documentation files (the @@ -39,6 +40,8 @@ .\" Digital and Tektronix makes no representations about the suitability .\" of this documentation for any purpose. .\" It is provided ``as is'' without express or implied warranty. +.\" +.\" $XFree86: xc/doc/specs/X11/CH01,v 1.2 2000/11/28 18:49:17 dawes Exp $ .\" .EH '\fBXlib \- C Library\fP''\fBX11, Release 6.4\fP' .OH '\fBXlib \- C Library\fP''\fBX11, Release 6.4\fP' @@ -587,7 +590,7 @@ .IP \(bu 5 Latin-1 .IP -The coded character set defined by the ISO8859-1 standard. +The coded character set defined by the ISO 8859-1 standard. .IP \(bu 5 Latin Portable Character Encoding .IP @@ -600,6 +603,11 @@ STRING Encoding .IP Latin-1, plus tab and newline. +.IP \(bu 5 +UTF-8 Encoding +.IP +The ASCII compatible character encoding scheme defined by the ISO 10646-1 +standard. .IP \(bu 5 POSIX Portable Filename Character Set .IP Index: xc/doc/specs/X11/CH13 diff -u xc/doc/specs/X11/CH13:1.3 xc/doc/specs/X11/CH13:1.5 --- xc/doc/specs/X11/CH13:1.3 Sat Jan 10 22:48:10 1998 +++ xc/doc/specs/X11/CH13 Mon Dec 4 13:49:17 2000 @@ -1,4 +1,5 @@ .\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium +.\" Copyright \(co 2000 The XFree86 Project, Inc. .\" .\" Permission is hereby granted, free of charge, to any person obtaining .\" a copy of this software and associated documentation files (the @@ -39,6 +40,8 @@ .\" Digital and Tektronix makes no representations about the suitability .\" of this documentation for any purpose. .\" It is provided ``as is'' without express or implied warranty. +.\" +.\" $XFree86: xc/doc/specs/X11/CH13,v 1.5 2000/12/04 18:49:17 dawes Exp $ .\" \& .sp 1 @@ -345,6 +348,9 @@ T} text (some WM_ property text in environment locale) + T{ +.PN Xutf8SetWMProperties +T} .sp 6p T{ .PN setlocale @@ -357,11 +363,17 @@ .PN XwcTextPropertyToTextList T} T{ +.PN Xutf8TextPropertyToTextList +T} + T{ .PN XmbTextListToTextProperty T} T{ .PN XwcTextListToTextProperty T} + T{ +.PN Xutf8TextListToTextProperty +T} .sp Text Input: .sp 6p @@ -407,6 +419,9 @@ T} T{ Encoding of returned text T} + T{ +.PN Xutf8LookupString +T} .sp Text Drawing: .sp 6p @@ -450,6 +465,12 @@ Locale of supplied text T} T{ +.PN Xutf8DrawText , +and so on +T} T{ +Locale-dependent metrics +T} + T{ .PN XExtentsOfFontSet , and so on T} T{ @@ -458,8 +479,11 @@ T{ .PN XmbTextExtents , T} + T{ +.PN XwcTextExtents , +T} T{ -.PN XwcTextExtents , +.PN Xutf8TextExtents , and so on T} .sp @@ -747,7 +771,11 @@ for setting properties or features of the specified output method. This function returns NULL if it succeeds; otherwise, -it returns the name of the first argument that could not be obtained. +it returns the name of the first argument that could not be set. +Xlib does not attempt to set arguments from the supplied list that +follow the failed argument; +all arguments in the list preceding the failed argument have been set +correctly. .LP No standard arguments are currently defined by Xlib. .LP @@ -1828,7 +1856,7 @@ .PN XFontSet to font_set. .LP -When an Xmb/wc drawing or measuring function is called with an +When an Xmb/wc/utf8 drawing or measuring function is called with an .PN XFontSet that has missing charsets, some characters in the locale will not be drawable. @@ -1901,7 +1929,7 @@ .PN XFontsOfFontSet function returns a list of one or more .PN XFontStructs -and font names for the fonts used by the Xmb and Xwc layers +and font names for the fonts used by the Xmb/wc/utf8 layer for the given font set. A list of pointers to the .PN XFontStruct @@ -2080,9 +2108,10 @@ the origins of all characters are on the primary draw direction side of the drawing origin. The screen location of a particular character image may be determined with -.PN XmbTextPerCharExtents +.PN XmbTextPerCharExtents , +.PN XwcTextPerCharExtents or -.PN XwcTextPerCharExtents . +.PN Xutf8TextPerCharExtents . .LP The drawing functions are allowed to implement context-dependent rendering, where the glyphs drawn for a string are not simply a @@ -2196,9 +2225,10 @@ the rectangles that bound the character glyph image drawn in the foreground color, relative to a constant origin. See -.PN XmbTextExtents -and +.PN XmbTextExtents , .PN XwcTextExtents +and +.PN Xutf8TextExtents for detailed semantics. .LP The max_logical_extent member gives the maximum extent, @@ -2217,9 +2247,10 @@ individual extent. .LP The rectangles for a given character in a string can be obtained from -.PN XmbPerCharExtents +.PN XmbPerCharExtents , +.PN XwcPerCharExtents or -.PN XwcPerCharExtents . +.PN Xutf8PerCharExtents . .LP .sp To obtain the maximum extents structure given an @@ -2241,7 +2272,7 @@ .PN XExtentsOfFontSet function returns an .PN XFontSetExtents -structure for the fonts used by the Xmb and Xwc layers +structure for the fonts used by the Xmb/wc/utf8 layer for the given font set. .LP The @@ -2257,11 +2288,13 @@ .sp To obtain the escapement in pixels of the specified text as a value, use -.PN XmbTextEscapement +.PN XmbTextEscapement , +.PN XwcTextEscapement or -.PN XwcTextEscapement . +.PN Xutf8TextEscapement . .IN "XmbTextEscapement" "" "@DEF@" .IN "XwcTextEscapement" "" "@DEF@" +.IN "Xutf8TextEscapement" "" "@DEF@" .sM .FD 0 int XmbTextEscapement\^(\^\fIfont_set\fP\^, \fIstring\fP\^, \fInum_bytes\fP\^) @@ -2281,6 +2314,15 @@ .br int \fInum_wchars\fP\^; .FN +.FD 0 +int Xutf8TextEscapement\^(\^\fIfont_set\fP\^, \fIstring\fP\^, \fInum_bytes\fP\^) +.br + XFontSet \fIfont_set\fP\^; +.br + char *\fIstring\fP\^; +.br + int \fInum_bytes\fP\^; +.FN .IP \fIfont_set\fP 1i Specifies the font set. .IP \fIstring\fP 1i @@ -2292,9 +2334,10 @@ .LP .eM The -.PN XmbTextEscapement -and +.PN XmbTextEscapement , .PN XwcTextEscapement +and +.PN Xutf8TextEscapement functions return the escapement in pixels of the specified string as a value, using the fonts loaded for the specified font set. The escapement is the distance in pixels in the primary draw @@ -2305,15 +2348,23 @@ Regardless of the character rendering order, the escapement is always positive. .LP +The function +.PN Xutf8TextEscapement +is an XFree86 extension introduced in XFree86 4.0.2. Its presence is +indicated by the macro +.PN X_HAVE_UTF8_STRING . +.LP .sp To obtain the overall_ink_return and overall_logical_return arguments, the overall bounding box of the string's image, and a logical bounding box, use -.PN XmbTextExtents - or -.PN XwcTextExtents . +.PN XmbTextExtents , +.PN XwcTextExtents +or +.PN Xutf8TextExtents . .IN "XmbTextExtents" "" "@DEF@" .IN "XwcTextExtents" "" "@DEF@" +.IN "Xutf8TextExtents" "" "@DEF@" .sM .FD 0 int XmbTextExtents\^(\^\fIfont_set\fP\^, \fIstring\fP\^, \fInum_bytes\fP\^, \fIoverall_ink_return\fP\^, \fIoverall_logical_return\fP\^) @@ -2342,6 +2393,19 @@ .br XRectangle *\fIoverall_logical_return\fP\^; .FN +.FD 0 +int Xutf8TextExtents\^(\^\fIfont_set\fP\^, \fIstring\fP\^, \fInum_bytes\fP\^, \fIoverall_ink_return\fP\^, \fIoverall_logical_return\fP\^) +.br + XFontSet \fIfont_set\fP\^; +.br + char *\fIstring\fP\^; +.br + int \fInum_bytes\fP\^; +.br + XRectangle *\fIoverall_ink_return\fP\^; +.br + XRectangle *\fIoverall_logical_return\fP\^; +.FN .IP \fIfont_set\fP 1i Specifies the font set. .IP \fIstring\fP 1i @@ -2358,17 +2422,19 @@ .LP .eM The -.PN XmbTextExtents -and +.PN XmbTextExtents , .PN XwcTextExtents +and +.PN Xutf8TextExtents functions set the components of the specified overall_ink_return and overall_logical_return arguments to the overall bounding box of the string's image and a logical bounding box for spacing purposes, respectively. They return the value returned by -.PN XmbTextEscapement +.PN XmbTextEscapement , +.PN XwcTextEscapement or -.PN XwcTextEscapement . +.PN Xutf8TextEscapement . These metrics are relative to the drawing origin of the string, using the fonts loaded for the specified font set. .LP @@ -2409,14 +2475,22 @@ the client should not assume that it can redraw the character by itself and get the same rendering. .LP +The function +.PN Xutf8TextExtents +is an XFree86 extension introduced in XFree86 4.0.2. Its presence is +indicated by the macro +.PN X_HAVE_UTF8_STRING . +.LP .sp To obtain per-character information for a text string, use -.PN XmbTextPerCharExtents +.PN XmbTextPerCharExtents , +.PN XwcTextPerCharExtents or -.PN XwcTextPerCharExtents . +.PN Xutf8TextPerCharExtents . .IN "XmbTextPerCharExtents" "" "@DEF@" .IN "XwcTextPerCharExtents" "" "@DEF@" +.IN "Xutf8TextPerCharExtents" "" "@DEF@" .sM .FD 0 Status XmbTextPerCharExtents\^(\^\fIfont_set\fP\^, \fIstring\fP\^, \fInum_bytes\fP\^, \fIink_array_return\fP\^, @@ -2464,6 +2538,29 @@ .br XRectangle *\fIoverall_logical_return\fP\^; .FN +.FD 0 +Status Xutf8TextPerCharExtents\^(\^\fIfont_set\fP\^, \fIstring\fP\^, \fInum_bytes\fP\^, \fIink_array_return\fP\^, +.br + \fIlogical_array_return\fP\^, \fIarray_size\fP\^, \fInum_chars_return\fP\^, \fIoverall_ink_return\fP\^, \fIoverall_logical_return\fP\^) +.br + XFontSet \fIfont_set\fP\^; +.br + char *\fIstring\fP\^; +.br + int \fInum_bytes\fP\^; +.br + XRectangle *\fIink_array_return\fP\^; +.br + XRectangle *\fIlogical_array_return\fP\^; +.br + int \fIarray_size\fP\^; +.br + int *\fInum_chars_return\fP\^; +.br + XRectangle *\fIoverall_ink_return\fP\^; +.br + XRectangle *\fIoverall_logical_return\fP\^; +.FN .IP \fIfont_set\fP 1i Specifies the font set. .IP \fIstring\fP 1i @@ -2489,9 +2586,10 @@ .LP .eM The -.PN XmbTextPerCharExtents -and +.PN XmbTextPerCharExtents , .PN XwcTextPerCharExtents +and +.PN Xutf8TextPerCharExtents functions return the text dimensions of each character of the specified text, using the fonts loaded for the specified font set. Each successive element of ink_array_return and logical_array_return @@ -2534,14 +2632,22 @@ Otherwise, the functions return a nonzero value. .LP If the overall_ink_return or overall_logical_return argument is non-NULL, -.PN XmbTextPerCharExtents -and +.PN XmbTextPerCharExtents , .PN XwcTextPerCharExtents +and +.PN Xutf8TextPerCharExtents return the maximum extent of the string's metrics to overall_ink_return or overall_logical_return, as returned by -.PN XmbTextExtents +.PN XmbTextExtents , +.PN XwcTextExtents or -.PN XwcTextExtents . +.PN Xutf8TextExtents . +.LP +The function +.PN Xutf8TextPerCharExtents +is an XFree86 extension introduced in XFree86 4.0.2. Its presence is +indicated by the macro +.PN X_HAVE_UTF8_STRING . .NH 3 Drawing Text Using Font Sets .XS @@ -2557,6 +2663,8 @@ .PN XDrawImageString except that they work with font sets instead of single fonts and interpret the text based on the locale of the font set +(for functions whose name starts with Xmb or Xwc) or as UTF-8 encoded +text (for functions whose name starts with Xutf8), instead of treating the bytes of the string as direct font indexes. See section 8.6 for details of the use of Graphics Contexts (GCs) and possible protocol errors. @@ -2570,9 +2678,10 @@ No validation that all fonts conform to some width rule is performed. .LP The text functions -.PN XmbDrawText -and +.PN XmbDrawText , .PN XwcDrawText +and +.PN Xutf8DrawText use the following structures: .LP .IN "XmbTextItem" "" "@DEF@" @@ -2603,11 +2712,13 @@ .eM .sp To draw text using multiple font sets in a given drawable, use -.PN XmbDrawText +.PN XmbDrawText , +.PN XwcDrawText or -.PN XwcDrawText . +.PN Xutf8DrawText . .IN "XmbDrawText" "" "@DEF@" .IN "XwcDrawText" "" "@DEF@" +.IN "Xutf8DrawText" "" "@DEF@" .sM .FD 0 void XmbDrawText\^(\^\fIdisplay\fP\^, \fId\fP\^, \fIgc\fP\^, \fIx\fP\^, \fIy\fP\^, \fIitems\fP\^, \fInitems\fP\^) @@ -2639,6 +2750,21 @@ .br int \fInitems\fP\^; .FN +.FD 0 +void Xutf8DrawText\^(\^\fIdisplay\fP\^, \fId\fP\^, \fIgc\fP\^, \fIx\fP\^, \fIy\fP\^, \fIitems\fP\^, \fInitems\fP\^) +.br + Display *\fIdisplay\fP\^; +.br + Drawable \fId\fP\^; +.br + GC \fIgc\fP\^; +.br + int \fIx\fP\^, \fIy\fP\^; +.br + XmbTextItem *\fIitems\fP\^; +.br + int \fInitems\fP\^; +.FN .IP \fIdisplay\fP 1i Specifies the connection to the X server. .IP \fId\fP 1i @@ -2658,9 +2784,10 @@ .LP .eM The -.PN XmbDrawText -and +.PN XmbDrawText , .PN XwcDrawText +and +.PN Xutf8DrawText functions allow complex spacing and font set shifts between text strings. Each text item is processed in turn, with the origin of a text element advanced in the primary draw direction by the escapement of the @@ -2675,18 +2802,19 @@ .PN None will not be drawn. .LP -.PN XmbDrawText -and +.PN XmbDrawText , .PN XwcDrawText +and +.PN Xutf8DrawText do not perform any context-dependent rendering between text segments. Clients may compute the drawing metrics by passing each text segment to -.PN XmbTextExtents -and -.PN XwcTextExtents -or -.PN XmbTextPerCharExtents -and +.PN XmbTextExtents , +.PN XwcTextExtents , +.PN Xutf8TextExtents +or +.PN XmbTextPerCharExtents , .PN XwcTextPerCharExtents . +.PN Xutf8TextPerCharExtents . When the .PN XFontSet has missing charsets, each unavailable character is drawn @@ -2694,13 +2822,21 @@ .PN XCreateFontSet . The behavior for an invalid codepoint is undefined. .LP +The function +.PN Xutf8DrawText +is an XFree86 extension introduced in XFree86 4.0.2. Its presence is +indicated by the macro +.PN X_HAVE_UTF8_STRING . +.LP .sp To draw text using a single font set in a given drawable, use -.PN XmbDrawString +.PN XmbDrawString , +.PN XwcDrawString or -.PN XwcDrawString . +.PN Xutf8DrawString . .IN "XmbDrawString" "" "@DEF@" .IN "XwcDrawString" "" "@DEF@" +.IN "Xutf8DrawString" "" "@DEF@" .sM .FD 0 void XmbDrawString\^(\^\fIdisplay\fP\^, \fId\fP\^, \fIfont_set\fP\^, \fIgc\fP\^, \fIx\fP\^, \fIy\fP\^, \fIstring\fP\^, \fInum_bytes\fP\^) @@ -2736,6 +2872,23 @@ .br int \fInum_wchars\fP\^; .FN +.FD 0 +void Xutf8DrawString\^(\^\fIdisplay\fP\^, \fId\fP\^, \fIfont_set\fP\^, \fIgc\fP\^, \fIx\fP\^, \fIy\fP\^, \fIstring\fP\^, \fInum_bytes\fP\^) +.br + Display *\fIdisplay\fP\^; +.br + Drawable \fId\fP\^; +.br + XFontSet \fIfont_set\fP\^; +.br + GC \fIgc\fP\^; +.br + int \fIx\fP\^, \fIy\fP\^; +.br + char *\fIstring\fP\^; +.br + int \fInum_bytes\fP\^; +.FN .IP \fIdisplay\fP 1i Specifies the connection to the X server. .IP \fId\fP 1i @@ -2759,9 +2912,10 @@ .LP .eM The -.PN XmbDrawString -and +.PN XmbDrawString , .PN XwcDrawString +and +.PN Xutf8DrawString functions draw the specified text with the foreground pixel. When the .PN XFontSet @@ -2770,13 +2924,21 @@ .PN XCreateFontSet . The behavior for an invalid codepoint is undefined. .LP +The function +.PN Xutf8DrawString +is an XFree86 extension introduced in XFree86 4.0.2. Its presence is +indicated by the macro +.PN X_HAVE_UTF8_STRING . +.LP .sp To draw image text using a single font set in a given drawable, use -.PN XmbDrawImageString +.PN XmbDrawImageString , +.PN XwcDrawImageString or -.PN XwcDrawImageString . +.PN Xutf8DrawImageString . .IN "XmbDrawImageString" "" "@DEF@" .IN "XwcDrawImageString" "" "@DEF@" +.IN "Xutf8DrawImageString" "" "@DEF@" .sM .FD 0 void XmbDrawImageString\^(\^\fIdisplay\fP\^, \fId\fP\^, \fIfont_set\fP\^, \fIgc\fP\^, \fIx\fP\^, \fIy\fP\^, \fIstring\fP\^, \fInum_bytes\fP\^) @@ -2812,6 +2974,23 @@ .br int \fInum_wchars\fP\^; .FN +.FD 0 +void Xutf8DrawImageString\^(\^\fIdisplay\fP\^, \fId\fP\^, \fIfont_set\fP\^, \fIgc\fP\^, \fIx\fP\^, \fIy\fP\^, \fIstring\fP\^, \fInum_bytes\fP\^) +.br + Display *\fIdisplay\fP\^; +.br + Drawable \fId\fP\^; +.br + XFontSet \fIfont_set\fP\^; +.br + GC \fIgc\fP\^; +.br + int \fIx\fP\^, \fIy\fP\^; +.br + char *\fIstring\fP\^; +.br + int \fInum_bytes\fP\^; +.FN .IP \fIdisplay\fP 1i Specifies the connection to the X server. .IP \fId\fP 1i @@ -2835,15 +3014,17 @@ .LP .eM The -.PN XmbDrawImageString -and +.PN XmbDrawImageString , .PN XwcDrawImageString +and +.PN Xutf8DrawImageString functions fill a destination rectangle with the background pixel defined in the GC and then paint the text with the foreground pixel. The filled rectangle is the rectangle returned to overall_logical_return by -.PN XmbTextExtents -or +.PN XmbTextExtents , .PN XwcTextExtents +or +.PN Xutf8TextExtents for the same text and .PN XFontSet . .LP @@ -2853,6 +3034,12 @@ with the default string returned by .PN XCreateFontSet . The behavior for an invalid codepoint is undefined. +.LP +The function +.PN Xutf8TextExtents +is an XFree86 extension introduced in XFree86 4.0.2. Its presence is +indicated by the macro +.PN X_HAVE_UTF8_STRING . .NH 2 Input Methods .XS @@ -3195,9 +3382,10 @@ .LP To obtain characters from an input method, a client must call the function -.PN XmbLookupString -or +.PN XmbLookupString , .PN XwcLookupString +or +.PN Xutf8LookupString with an input context created from that input method. Both a locale and display are bound to an input method when it is opened, and an input context inherits this locale and display. @@ -3205,7 +3393,9 @@ .PN XmbLookupString or .PN XwcLookupString -will be encoded in that locale. +will be encoded in that locale. Strings returned by +.PN Xutf8LookupString +are encoded in UTF-8. .NH 4 Focus Management .XS @@ -3213,9 +3403,10 @@ .XE .LP For each text entry area in which the -.PN XmbLookupString -or +.PN XmbLookupString , .PN XwcLookupString +or +.PN Xutf8LookupString functions are used, there will be an associated input context. .LP @@ -3347,9 +3538,10 @@ A filtering mechanism is provided to allow input methods to capture X events transparently to clients. It is expected that toolkits (or clients) using -.PN XmbLookupString -or +.PN XmbLookupString , .PN XwcLookupString +or +.PN Xutf8LookupString will call this filter at some point in the event processing mechanism to make sure that events needed by an input method can be filtered by that input method. @@ -3386,9 +3578,10 @@ .LP When the user enters a keystroke, the client calls -.PN XmbLookupString +.PN XmbLookupString , +.PN XwcLookupString or -.PN XwcLookupString . +.PN Xutf8LookupString . At this point, in the on-the-spot case, the echo of the keystroke in the preedit has not yet been done. Before returning to the client logic that handles the input characters, @@ -3436,9 +3629,10 @@ preediting, which supports a type of preprocessor input composition. In this case, composition consists of interpreting a sequence of key events and returning a committed string via -.PN XmbLookupString +.PN XmbLookupString , +.PN XwcLookupString or -.PN XwcLookupString . +.PN Xutf8LookupString . This provides the basics for input methods. .LP In addition to preediting based on key events, a general framework @@ -3509,9 +3703,10 @@ .sp For this reason, an input method supporting this type of conversion should take notice of when the client calls -.PN XmbResetIC +.PN XmbResetIC , +.PN XwcResetIC or -.PN XwcResetIC , +.PN Xutf8ResetIC , which is usually an indication of a context change. .LP Context-sensitive conversions just need a copy of the client's text, @@ -3519,9 +3714,10 @@ to achieve the reconversion or transliteration. Yet in all cases the result of a conversion, either immediately or via preediting, is returned by the -.PN XmbLookupString -and +.PN XmbLookupString , .PN XwcLookupString +and +.PN Xutf8LookupString functions. .LP String conversion support is dependent on the availability of the @@ -4688,11 +4884,13 @@ .LP .sp To reset the state of an input context to its initial state, use -.PN XmbResetIC +.PN XmbResetIC , +.PN XwcResetIC or -.PN XwcResetIC . +.PN Xutf8ResetIC . .IN "XmbResetIC" "" "@DEF@" .IN "XwcResetIC" "" "@DE@" +.IN "Xutf8ResetIC" "" "@DE@" .sM .FD 0 char * XmbResetIC\^(\^\fIic\fP\^) @@ -4704,6 +4902,11 @@ .br XIC \fIic\fP\^; .FN +.FD 0 +char * Xutf8ResetIC\^(\^\fIic\fP\^) +.br + XIC \fIic\fP\^; +.FN .IP \fIic\fP 1i Specifies the input context. .LP @@ -4712,9 +4915,10 @@ .PN XNResetState is set to .PN XIMInitialState , -.PN XmbResetIC -and +.PN XmbResetIC , .PN XwcResetIC +and +.PN Xutf8ResetIC reset an input context to its initial state; when .PN XNResetState @@ -4725,14 +4929,21 @@ The input method is required to clear the preedit area, if any, and update the status accordingly. Calling -.PN XmbResetIC -or +.PN XmbResetIC , .PN XwcResetIC +or +.PN Xutf8ResetIC does not change the focus. .LP The return value of .PN XmbResetIC is its current preedit string as a multibyte string. +The return value of +.PN XwcResetIC +is its current preedit string as a wide character string. +The return value of +.PN Xutf8ResetIC +is its current preedit string as an UTF-8 string. If there is any preedit text drawn or visible to the user, then these procedures must return a non-NULL string. If there is no visible preedit text, @@ -4742,6 +4953,12 @@ The client should free the returned string by calling .PN XFree . .LP +The function +.PN Xutf8ResetIC +is an XFree86 extension introduced in XFree86 4.0.2. Its presence is +indicated by the macro +.PN X_HAVE_UTF8_STRING . +.LP .sp To get the input method associated with an input context, use .PN XIMOfIC . @@ -5276,9 +5493,10 @@ The .PN XNResetState argument specifies the state the input context will return to after calling -.PN XmbResetIC +.PN XmbResetIC , +.PN XwcResetIC or -.PN XwcResetIC . +.PN Xutf8ResetIC . .LP The XIC state may be set to its initial state, as specified by the .PN XNPreeditState @@ -5319,9 +5537,10 @@ If .PN XIMInitialState is set, then -.PN XmbResetIC -and +.PN XmbResetIC , .PN XwcResetIC +and +.PN Xutf8ResetIC will return to the initial .PN XNPreeditState state of the XIC. @@ -5329,9 +5548,10 @@ If .PN XIMPreserveState is set, then -.PN XmbResetIC -and +.PN XmbResetIC , .PN XwcResetIC +and +.PN Xutf8ResetIC will preserve the current state of the XIC. .LP If @@ -5805,9 +6025,10 @@ the .PN XNPreeditState value specified at the creation time will be reflected as the initial state for -.PN XmbResetIC +.PN XmbResetIC , +.PN XwcResetIC and -.PN XwcResetIC . +.PN Xutf8ResetIC . .LP Because this XIC value is optional, a client should call .PN XGetIMValues @@ -7004,11 +7225,13 @@ .LP To get composed input from an input method, use -.PN XmbLookupString +.PN XmbLookupString , +.PN XwcLookupString or -.PN XwcLookupString . +.PN Xutf8LookupString . .IN "XmbLookupString" "" "@DEF@" .IN "XwcLookupString" "" "@DEF@" +.IN "Xutf8LookupString" "" "@DEF@" .sM .FD 0 int XmbLookupString\^(\^\fIic\fP\^, \fIevent\fP\^, \fIbuffer_return\fP\^, \fIbytes_buffer\fP\^, \fIkeysym_return\fP\^, \fIstatus_return\fP\^) @@ -7040,6 +7263,21 @@ .br Status *\fIstatus_return\fP\^; .FN +.FD 0 +int Xutf8LookupString\^(\^\fIic\fP\^, \fIevent\fP\^, \fIbuffer_return\fP\^, \fIbytes_buffer\fP\^, \fIkeysym_return\fP\^, \fIstatus_return\fP\^) +.br + XIC \fIic\fP\^; +.br + XKeyPressedEvent *\fIevent\fP; +.br + char *\fIbuffer_return\fP\^; +.br + int \fIbytes_buffer\fP\^; +.br + KeySym *\fIkeysym_return\fP\^; +.br + Status *\fIstatus_return\fP\^; +.FN .IP \fIic\fP 1i Specifies the input context. .ds Ev key event to be used @@ -7060,9 +7298,10 @@ .LP .eM The -.PN XmbLookupString -and +.PN XmbLookupString , .PN XwcLookupString +and +.PN Xutf8LookupString functions return the string from the input method specified in the buffer_return argument. If no string is returned, @@ -7075,7 +7314,9 @@ the KeySym value does not necessarily correspond to the string returned. .LP .PN XmbLookupString -returns the length of the string in bytes, and +and +.PN Xutf8LookupString +return the length of the string in bytes, and .PN XwcLookupString returns the length of the string in characters. Both @@ -7083,7 +7324,9 @@ and .PN XwcLookupString return text in the encoding of the locale bound to the input method -of the specified input context. +of the specified input context, and +.PN Xutf8LookupString +returns text in UTF-8 encoding. .LP Each string returned by .PN XmbLookupString @@ -7092,13 +7335,14 @@ begins in the initial state of the encoding of the locale (if the encoding of the locale is state-dependent). .NT -To insure proper input processing, +To ensure proper input processing, it is essential that the client pass only .PN KeyPress events to -.PN XmbLookupString +.PN XmbLookupString , +.PN XwcLookupString and -.PN XwcLookupString . +.PN Xutf8LookupString . Their behavior when a client passes a .PN KeyRelease event is undefined. @@ -7106,7 +7350,7 @@ .LP Clients should check the status_return argument before using the other returned values. -These two functions both return a value to status_return +These three functions each return a value to status_return that indicates what has been returned in the other arguments. The possible values returned are: .TS @@ -7115,9 +7359,10 @@ .PN XBufferOverflow T} T{ The input string to be returned is too large for the supplied buffer_return. -The required size -.Pn ( XmbLookupString -in bytes; +The required size (for +.PN XmbLookupString , +.PN Xutf8LookupString +in bytes; for .PN XwcLookupString in characters) is returned as the value of the function, and the contents of buffer_return and keysym_return are not modified. @@ -7135,9 +7380,9 @@ .PN XLookupChars T} T{ Some input characters have been composed. -They are placed in the buffer_return argument, +They are placed in the buffer_return argument, using the encoding +described above, and the string length is returned as the value of the function. -The string is encoded in the locale bound to the input context. The content of the keysym_return argument is not modified. T} T{ @@ -7160,16 +7405,24 @@ .TE .LP It does not make any difference if the input context passed as an argument to -.PN XmbLookupString -and +.PN XmbLookupString , .PN XwcLookupString +and +.PN Xutf8LookupString is the one currently in possession of the focus or not. Input may have been composed within an input context before it lost the focus, and that input may be returned on subsequent calls to -.PN XmbLookupString -or +.PN XmbLookupString , .PN XwcLookupString +or +.PN Xutf8LookupString even though it does not have any more keyboard focus. +.LP +The function +.PN Xutf8LookupString +is an XFree86 extension introduced in XFree86 4.0.2. Its presence is +indicated by the macro +.PN X_HAVE_UTF8_STRING . .NH 3 Input Method Conventions .XS @@ -7202,9 +7455,10 @@ .PN KeyPress event with a KeyCode of zero is used exclusively as a signal that an input method has composed input that can be returned by -.PN XmbLookupString +.PN XmbLookupString , +.PN XwcLookupString or -.PN XwcLookupString . +.PN Xutf8LookupString . No other use is made of a .PN KeyPress event with KeyCode of zero. Index: xc/doc/specs/X11/CH14 diff -u xc/doc/specs/X11/CH14:1.1.1.3 xc/doc/specs/X11/CH14:1.2 --- xc/doc/specs/X11/CH14:1.1.1.3 Tue Dec 24 05:13:56 1996 +++ xc/doc/specs/X11/CH14 Tue Nov 28 13:49:19 2000 @@ -1,4 +1,5 @@ .\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium +.\" Copyright \(co 2000 The XFree86 Project, Inc. .\" .\" Permission is hereby granted, free of charge, to any person obtaining .\" a copy of this software and associated documentation files (the @@ -39,6 +40,8 @@ .\" Digital and Tektronix makes no representations about the suitability .\" of this documentation for any purpose. .\" It is provided ``as is'' without express or implied warranty. +.\" +.\" $XFree86: xc/doc/specs/X11/CH14,v 1.2 2000/11/28 18:49:19 dawes Exp $ .\" \& .sp 1 @@ -499,21 +502,29 @@ XStringStyle, /* STRING */ XCompoundTextStyle, /* COMPOUND_TEXT */ XTextStyle, /* text in owner's encoding (current locale) */ - XStdICCTextStyle /* STRING, else COMPOUND_TEXT */ + XStdICCTextStyle, /* STRING, else COMPOUND_TEXT */ + XUTF8StringStyle /* UTF8_STRING */ } XICCEncodingStyle; .De .LP .eM -.sp +The value +.PN XUTF8StringStyle +is an XFree86 extension introduced in XFree86 4.0.2. Its presence is +indicated by the macro +.PN X_HAVE_UTF8_STRING . .LP +.sp To convert a list of text strings to an .PN XTextProperty structure, use -.PN XmbTextListToTextProperty +.PN XmbTextListToTextProperty , +.PN XwcTextListToTextProperty or -.PN XwcTextListToTextProperty . +.PN Xutf8TextListToTextProperty . .IN "XmbTextListToTextProperty" "" "@DEF@" .IN "XwcTextListToTextProperty" "" "@DEF@" +.IN "Xutf8TextListToTextProperty" "" "@DEF@" .sM .FD 0 int XmbTextListToTextProperty\^(\^\fIdisplay\fP\^, \fIlist\fP\^, \fIcount\fP\^, \fIstyle\fP\^, \fItext_prop_return\fP\^) @@ -541,6 +552,19 @@ .br XTextProperty *\fItext_prop_return\fP\^; .FN +.FD 0 +int Xutf8TextListToTextProperty\^(\^\fIdisplay\fP\^, \fIlist\fP\^, \fIcount\fP\^, \fIstyle\fP\^, \fItext_prop_return\fP\^) +.br + Display *\fIdisplay\fP\^; +.br + char **\fIlist\fP\^; +.br + int \fIcount\fP\^; +.br + XICCEncodingStyle \fIstyle\fP\^; +.br + XTextProperty *\fItext_prop_return\fP\^; +.FN .IP \fIdisplay\fP 1i Specifies the connection to the X server. .IP \fIlist\fP 1i @@ -556,15 +580,20 @@ .LP .eM The -.PN XmbTextListToTextProperty -and +.PN XmbTextListToTextProperty , .PN XwcTextListToTextProperty +and +.PN Xutf8TextListToTextProperty functions set the specified .PN XTextProperty value to a set of null-separated elements representing the concatenation -of the specified list of null-terminated text strings. -A final terminating null is stored at the end of the value field -of text_prop_return but is not included in the nitems member. +of the specified list of null-terminated text strings. The input text +strings must be given in the current locale encoding (for +.PN XmbTextListToTextProperty +and +.PN XwcTextListToTextProperty ), +or in UTF-8 encoding (for +.PN Xutf8TextListToTextProperty ). .LP The functions set the encoding field of text_prop_return to an .PN Atom @@ -578,6 +607,12 @@ .PN XCompoundTextStyle is specified, this encoding is ``STRING'' or ``COMPOUND_TEXT'', respectively. +If the style +.PN XUTF8StringStyle +is specified, +this encoding is ``UTF8_STRING''. (This is an XFree86 extension introduced in +XFree86 4.0.2. Its presence is indicated by the macro +.PN X_HAVE_UTF8_STRING .) If the style .PN XTextStyle is specified, @@ -587,6 +622,8 @@ is specified, this encoding is ``STRING'' if the text is fully convertible to STRING, else ``COMPOUND_TEXT''. +A final terminating null byte is stored at the end of the value field +of text_prop_return but is not included in the nitems member. .LP If insufficient memory is available for the new value string, the functions return @@ -614,16 +651,24 @@ .LP To free the storage for the value field, use .PN XFree . +.LP +The function +.PN Xutf8TextListToTextProperty +is an XFree86 extension introduced in XFree86 4.0.2. Its presence is +indicated by the macro +.PN X_HAVE_UTF8_STRING . .sp .LP To obtain a list of text strings from an .PN XTextProperty structure, use -.PN XmbTextPropertyToTextList +.PN XmbTextPropertyToTextList , +.PN XwcTextPropertyToTextList or -.PN XwcTextPropertyToTextList . +.PN Xutf8TextPropertyToTextList . .IN "XmbTextPropertyToTextList" "" "@DEF@" .IN "XwcTextPropertyToTextList" "" "@DEF@" +.IN "Xutf8TextPropertyToTextList" "" "@DEF@" .sM .FD 0 int XmbTextPropertyToTextList\^(\^\fIdisplay\fP\^, \fItext_prop\fP\^, \fIlist_return\fP\^, \fIcount_return\fP\^) @@ -647,6 +692,17 @@ .br int *\fIcount_return\fP\^; .FN +.FD 0 +int Xutf8TextPropertyToTextList\^(\^\fIdisplay\fP\^, \fItext_prop\fP\^, \fIlist_return\fP\^, \fIcount_return\fP\^) +.br + Display *\fIdisplay\fP\^; +.br + XTextProperty *\fItext_prop\fP\^; +.br + char ***\fIlist_return\fP\^; +.br + int *\fIcount_return\fP\^; +.FN .IP \fIdisplay\fP 1i Specifies the connection to the X server. .IP \fItext_prop\fP 1i @@ -661,13 +717,20 @@ .LP .eM The -.PN XmbTextPropertyToTextList -and +.PN XmbTextPropertyToTextList , .PN XwcTextPropertyToTextList -functions return a list of text strings in the current locale representing the +and +.PN Xutf8TextPropertyToTextList +functions return a list of text strings representing the null-separated elements of the specified .PN XTextProperty -structure. +structure. The returned strings are encoded using the current locale encoding +(for +.PN XmbTextPropertyToTextList +and +.PN XwcTextPropertyToTextList ) +or in UTF-8 (for +.PN Xutf8TextPropertyToTextList ). The data in text_prop must be format 8. .LP Multiple elements of the property (for example, the strings in a disjoint @@ -676,9 +739,10 @@ any terminating null should not be included in text_prop.nitems. .LP If insufficient memory is available for the list and its elements, -.PN XmbTextPropertyToTextList -and +.PN XmbTextPropertyToTextList , .PN XwcTextPropertyToTextList +and +.PN Xutf8TextPropertyToTextList return .PN XNoMemory . If the current locale is not supported, @@ -689,7 +753,7 @@ the functions return .PN XConverterNotFound . For supported locales, -existence of a converter from COMPOUND_TEXT, STRING +existence of a converter from COMPOUND_TEXT, STRING, UTF8_STRING or the encoding of the current locale is guaranteed if .PN XSupportsLocale returns @@ -701,14 +765,15 @@ the functions do not set any return values. .LP Otherwise, -.PN XmbTextPropertyToTextList -and +.PN XmbTextPropertyToTextList , .PN XwcTextPropertyToTextList +and +.PN Xutf8TextPropertyToTextList return the list of null-terminated text strings to list_return and the number of text strings to count_return. .LP -If the value field of text_prop is not fully convertible to the encoding of -the current locale, +If the value field of text_prop is not fully convertible to the +encoding of the current locale, the functions return the number of unconvertible characters. Each unconvertible character is converted to a string in the current locale that is specific to the current locale. @@ -716,20 +781,29 @@ use .PN XDefaultString . Otherwise, -.PN XmbTextPropertyToTextList -and +.PN XmbTextPropertyToTextList , .PN XwcTextPropertyToTextList +and +.PN Xutf8TextPropertyToTextList return .PN Success . .LP To free the storage for the list and its contents returned by -.PN XmbTextPropertyToTextList , +.PN XmbTextPropertyToTextList +or +.PN Xutf8TextPropertyToTextList , use .PN XFreeStringList . To free the storage for the list and its contents returned by .PN XwcTextPropertyToTextList , use .PN XwcFreeStringList . +.LP +The function +.PN Xutf8TextPropertyToTextList +is an XFree86 extension introduced in XFree86 4.0.2. Its presence is +indicated by the macro +.PN X_HAVE_UTF8_STRING . .sp .LP To free the in-memory data associated with the specified @@ -901,7 +975,8 @@ The .PN XFreeStringList function releases memory allocated by -.PN XmbTextPropertyToTextList +.PN XmbTextPropertyToTextList , +.PN Xutf8TextPropertyToTextList and .PN XTextPropertyToStringList and the missing charset list allocated by @@ -2680,13 +2755,16 @@ .LP The .PN XmbSetWMProperties -function stores the standard set of window manager properties, +and +.PN Xutf8SetWMProperties +functions store the standard set of window manager properties, with text properties in standard encodings for internationalized text communication. The standard window manager properties for a given window are WM_NAME, WM_ICON_NAME, WM_HINTS, WM_NORMAL_HINTS, WM_CLASS, WM_COMMAND, WM_CLIENT_MACHINE, and WM_LOCALE_NAME. .IN "XmbSetWMProperties" "" "@DEF@" +.IN "Xutf8SetWMProperties" "" "@DEF@" .sM .FD 0 void XmbSetWMProperties\^(\^\fIdisplay\fP\^, \fIw\fP\^, \fIwindow_name\fP\^, \fIicon_name\fP\^, \fIargv\fP\^, \fIargc\fP\^, @@ -2711,6 +2789,29 @@ .br XClassHint *\fIclass_hints\fP\^; .FN +.FD 0 +void Xutf8SetWMProperties\^(\^\fIdisplay\fP\^, \fIw\fP\^, \fIwindow_name\fP\^, \fIicon_name\fP\^, \fIargv\fP\^, \fIargc\fP\^, +.br + \fInormal_hints\fP\^, \fIwm_hints\fP\^, \fIclass_hints\fP\^) +.br + Display *\fIdisplay\fP\^; +.br + Window \fIw\fP\^; +.br + char *\fIwindow_name\fP\^; +.br + char *\fIicon_name\fP\^; +.br + char *\fIargv\fP\^[]; +.br + int \fIargc\fP\^; +.br + XSizeHints *\fInormal_hints\fP\^; +.br + XWMHints *\fIwm_hints\fP\^; +.br + XClassHint *\fIclass_hints\fP\^; +.FN .IP \fIdisplay\fP 1i Specifies the connection to the X server. .IP \fIw\fP 1i @@ -2739,19 +2840,22 @@ .eM The .PN XmbSetWMProperties -convenience function provides a simple programming interface +and +.PN Xutf8SetWMProperties +convenience functions provide a simple programming interface for setting those essential window properties that are used for communicating with other clients (particularly window and session managers). .LP If the window_name argument is non-NULL, -.PN XmbSetWMProperties -sets the WM_NAME property. +they set the WM_NAME property. If the icon_name argument is non-NULL, +they set the WM_ICON_NAME property. +The window_name and icon_name arguments are null-terminated strings, for .PN XmbSetWMProperties -sets the WM_ICON_NAME property. -The window_name and icon_name arguments are null-terminated strings -in the encoding of the current locale. +in the encoding of the current locale, for +.PN Xutf8SetWMProperties +in UTF-8 encoding. If the arguments can be fully converted to the STRING encoding, the properties are created with type ``STRING''; otherwise, the arguments are converted to Compound Text, @@ -2759,18 +2863,24 @@ .LP If the normal_hints argument is non-NULL, .PN XmbSetWMProperties -calls +and +.PN Xutf8SetWMProperties +call .PN XSetWMNormalHints , which sets the WM_NORMAL_HINTS property (see section 14.1.7). If the wm_hints argument is non-NULL, .PN XmbSetWMProperties -calls +and +.PN Xutf8SetWMProperties +call .PN XSetWMHints , which sets the WM_HINTS property (see section 14.1.6). .LP If the argv argument is non-NULL, .PN XmbSetWMProperties -sets the WM_COMMAND property from argv and argc. +and +.PN Xutf8SetWMProperties +set the WM_COMMAND property from argv and argc. An argc of zero indicates a zero-length command. .LP The hostname of the machine is stored using @@ -2779,7 +2889,9 @@ .LP If the class_hints argument is non-NULL, .PN XmbSetWMProperties -sets the WM_CLASS property. +and +.PN Xutf8SetWMProperties +set the WM_CLASS property. If the res_name member in the .PN XClassHint structure is set to the NULL pointer and the RESOURCE_NAME @@ -2792,24 +2904,34 @@ .LP It is assumed that the supplied class_hints.res_name and argv, the RESOURCE_NAME environment variable, and the hostname of the machine -are in the encoding of the locale announced for the LC_CTYPE category -(on POSIX-compliant systems, the LC_CTYPE, else LANG environment variable). +are in the encoding of the current locale. The corresponding WM_CLASS, WM_COMMAND, and WM_CLIENT_MACHINE properties are typed according to the local host locale announcer. -No encoding conversion is performed prior to storage in the properties. +No encoding conversion is performed for these strings prior to storage +in the properties. .LP For clients that need to process the property text in a locale, .PN XmbSetWMProperties -sets the WM_LOCALE_NAME property to be the name of the current locale. +and +.PN Xutf8SetWMProperties +set the WM_LOCALE_NAME property to be the name of the current locale. The name is assumed to be in the Host Portable Character Encoding and is converted to STRING for storage in the property. .LP .PN XmbSetWMProperties +and +.PN Xutf8SetWMProperties can generate .PN BadAlloc and .PN BadWindow errors. +.LP +The function +.PN Xutf8SetWMProperties +is an XFree86 extension introduced in XFree86 4.0.2. Its presence is +indicated by the macro +.PN X_HAVE_UTF8_STRING . .sp .LP To set a window's standard window manager properties Index: xc/doc/specs/X11/glossary diff -u xc/doc/specs/X11/glossary:1.1.1.2 xc/doc/specs/X11/glossary:1.2 --- xc/doc/specs/X11/glossary:1.1.1.2 Sat Feb 10 00:56:55 1996 +++ xc/doc/specs/X11/glossary Tue Nov 28 13:49:19 2000 @@ -1,3 +1,6 @@ +.\" +.\" $XFree86: xc/doc/specs/X11/glossary,v 1.2 2000/11/28 18:49:19 dawes Exp $ +.\" \& .sp 1 .ce 1 @@ -402,7 +405,7 @@ The representations do not have to be of uniform length. Examples are an ISO2022 graphic set, a state-independent or state-dependent combination of graphic sets, possibly including control -sets, and the X Compound Text encoding. +sets, the X Compound Text encoding, and the UTF-8 ISO10646/Unicode encoding. .IP In X, encodings are identified by a string which appears as: the Index: xc/doc/specs/XIM/xim.ms diff -u xc/doc/specs/XIM/xim.ms:1.1.1.4 xc/doc/specs/XIM/xim.ms:1.2 --- xc/doc/specs/XIM/xim.ms:1.1.1.4 Sun Sep 27 05:05:52 1998 +++ xc/doc/specs/XIM/xim.ms Thu Dec 14 12:48:58 2000 @@ -1,5 +1,6 @@ .\" $TOG: xim.ms /main/10 1997/11/04 18:24:16 kaleb $ .\" To print this out, type tbl macros.t ThisFile | troff -ms +.\" $XFree86: xc/doc/specs/XIM/xim.ms,v 1.2 2000/12/14 17:48:58 dawes Exp $ .EH '''' .OH '''' .EF '''' @@ -331,8 +332,8 @@ .LP .LP .bp -... 0.05 6.513 4.737 10.45 -... 0.000i 3.937i 4.687i 0.000i +\^... 0.05 6.513 4.737 10.45 +\^... 0.000i 3.937i 4.687i 0.000i .nr 00 \n(.u .nf .PS 3.937i 4.687i @@ -1962,8 +1963,8 @@ deals with keyevents for preediting operation. .LP .\"====================== event flow figure start ===================== -... 0.425 6.888 6.3 10.296 -... 0.000i 3.408i 5.875i 0.000i +\^... 0.425 6.888 6.3 10.296 +\^... 0.000i 3.408i 5.875i 0.000i .nr 00 \n(.u .nf .PS 3.408i 5.875i @@ -2162,8 +2163,8 @@ .LP .bp .\"====================== event2 flow figure start ===================== -... 0.425 5.575 6.3 10.296 -... 0.000i 4.721i 5.875i 0.000i +\^... 0.425 5.575 6.3 10.296 +\^... 0.000i 4.721i 5.875i 0.000i .nr 00 \n(.u .nf .PS 4.721i 5.875i @@ -2713,7 +2714,7 @@ :2:CARD16:input-context-ID :4:CARD32:XIMStringConversionFeedback ::XIMSTRCONVTEXT:XIMStringConversionText -.SP +.sp .TE .RE .LP @@ -2883,7 +2884,7 @@ ::#x0000001:XIMPreeditEnable ::#x0000002:XIMPreeditDisable .TE -.SP +.sp .TE .RE .LP @@ -3319,8 +3320,8 @@ .LP .\"=================================================================== .sp -... 1.675 6.888 6.237 10.296 -... 0.000i 3.408i 4.562i 0.000i +\^... 1.675 6.888 6.237 10.296 +\^... 0.000i 3.408i 4.562i 0.000i .nr 00 \n(.u .nf .PS 3.408i 4.562i @@ -3410,8 +3411,8 @@ .bp .LP .\"=================================================================== -... 1.675 6.888 6.237 10.296 -... 0.000i 3.408i 4.562i 0.000i +\^... 1.675 6.888 6.237 10.296 +\^... 0.000i 3.408i 4.562i 0.000i .nr 00 \n(.u .nf .PS 3.408i 4.562i @@ -3534,8 +3535,8 @@ .LP .\"==================================================================== .sp -... 1.488 7.325 6.487 10.358 -... 0.000i 3.033i 4.999i 0.000i +\^... 1.488 7.325 6.487 10.358 +\^... 0.000i 3.033i 4.999i 0.000i .nr 00 \n(.u .nf .PS 3.033i 4.999i @@ -3633,8 +3634,8 @@ <> .LP .\"==================================================================== -... 1.488 7.325 6.487 10.358 -... 0.000i 3.033i 4.999i 0.000i +\^... 1.488 7.325 6.487 10.358 +\^... 0.000i 3.033i 4.999i 0.000i .nr 00 \n(.u .nf .PS 3.033i 4.999i Index: xc/doc/specs/XProtocol/X11.protocol diff -u xc/doc/specs/XProtocol/X11.protocol:1.1.1.5 xc/doc/specs/XProtocol/X11.protocol:1.2 --- xc/doc/specs/XProtocol/X11.protocol:1.1.1.5 Sun Sep 27 05:05:55 1998 +++ xc/doc/specs/XProtocol/X11.protocol Mon Dec 4 18:25:58 2000 @@ -1,4 +1,5 @@ .\" $TOG: X11.protocol /main/49 1997/11/04 18:34:11 kaleb $ +.\" $XFree86: xc/doc/specs/XProtocol/X11.protocol,v 1.2 2000/12/04 23:25:58 dawes Exp $ .EH '''' .OH '''' .EF '''' @@ -1440,8 +1441,8 @@ .sM .IN "CreateWindow" "" "@DEF@" .PN CreateWindow -.in +.2i .LP +.in +.2i \fIwid\fP, \fIparent\fP\^: WINDOW .br \fIclass\fP\^: @@ -1461,7 +1462,9 @@ \fIvalue-mask\fP\^: BITMASK .br \fIvalue-list\fP\^: LISTofVALUE +.in -.2i .LP +.in +.2i Errors: .PN Alloc , .PN Colormap , @@ -1945,14 +1948,16 @@ .sM .IN "ChangeWindowAttributes" "" "@DEF@" .PN ChangeWindowAttributes -.in +.2i .LP +.in +.2i \fIwindow\fP\^: WINDOW .br \fIvalue-mask\fP\^: BITMASK .br \fIvalue-list\fP\^: LISTofVALUE +.in -.2i .LP +.in +.2i Errors: .PN Access , .PN Colormap , @@ -2033,14 +2038,14 @@ .sM .IN "GetWindowAttributes" "" "@DEF@" .PN GetWindowAttributes -.in +.2i .LP +.in +.2i \fIwindow\fP\^: WINDOW .in -.2i .LP \(-> -.in +.2i .LP +.in +.2i visual: VISUALID .br class: @@ -2077,7 +2082,9 @@ do-not-propagate-mask: SETofDEVICEEVENT .br override-redirect: BOOL +.in -.2i .LP +.in +.2i Errors: .PN Window .in -.2i @@ -2095,10 +2102,12 @@ .sM .IN "DestroyWindow" "" "@DEF@" .PN DestroyWindow -.in +.2i .LP +.in +.2i \fIwindow\fP\^: WINDOW +.in -.2i .LP +.in +.2i Errors: .PN Window .in -.2i @@ -2129,10 +2138,12 @@ .sM .IN "DestroySubwindows" "" "@DEF@" .PN DestroySubwindows -.in +.2i .LP +.in +.2i \fIwindow\fP\^: WINDOW +.in -.2i .LP +.in +.2i Errors: .PN Window .in -.2i @@ -2146,15 +2157,17 @@ .sM .IN "ChangeSaveSet" "" "@DEF@" .PN ChangeSaveSet -.in +.2i .LP +.in +.2i \fIwindow\fP\^: WINDOW .br \fImode\fP\^: .Pn { Insert , .PN Delete } +.in -.2i .LP Errors: +.in +.2i .PN Match , .PN Value , .PN Window @@ -2176,12 +2189,14 @@ .sM .IN "ReparentWindow" "" "@DEF@" .PN ReparentWindow -.in +.2i .LP +.in +.2i \fIwindow\fP\^, \fIparent\fP\^: WINDOW .br \fIx\fP\^, \fIy\fP\^: INT16 +.in -.2i .LP +.in +.2i Errors: .PN Match , .PN Window @@ -2234,10 +2249,12 @@ .sM .IN "MapWindow" "" "@DEF@" .PN MapWindow -.in +.2i .LP +.in +.2i \fIwindow\fP\^: WINDOW +.in -.2i .LP +.in +.2i Errors: .PN Window .in -.2i @@ -2272,10 +2289,12 @@ .sM .IN "MapSubwindows" "" "@DEF@" .PN MapSubwindows -.in +.2i .LP +.in +.2i \fIwindow\fP\^: WINDOW +.in -.2i .LP +.in +.2i Errors: .PN Window .in -.2i @@ -2290,10 +2309,12 @@ .sM .IN "UnmapWindow" "" "@DEF@" .PN UnmapWindow -.in +.2i .LP +.in +.2i \fIwindow\fP\^: WINDOW +.in -.2i .LP +.in +.2i Errors: .PN Window .in -.2i @@ -2309,10 +2330,12 @@ .sM .IN "UnmapSubwindows" "" "@DEF@" .PN UnmapSubwindows -.in +.2i .LP +.in +.2i \fIwindow\fP\^: WINDOW +.in -.2i .LP +.in +.2i Errors: .PN Window .in -.2i @@ -2327,14 +2350,16 @@ .sM .IN "ConfigureWindow" "" "@DEF@" .PN ConfigureWindow -.in +.2i .LP +.in +.2i \fIwindow\fP\^: WINDOW .br \fIvalue-mask\fP\^: BITMASK .br \fIvalue-list\fP\^: LISTofVALUE +.in -.2i .LP +.in +.2i Errors: .PN Match , .PN Value , @@ -2675,14 +2700,16 @@ .sM .IN "CirculateWindow" "" "@DEF@" .PN CirculateWindow -.in +.2i .LP +.in +.2i \fIwindow\fP\^: WINDOW .br \fIdirection\fP\^: .Pn { RaiseLowest , .PN LowerHighest } +.in -.2i .LP +.in +.2i Errors: .PN Value , .PN Window @@ -2714,14 +2741,14 @@ .sM .IN "GetGeometry" "" "@DEF@" .PN GetGeometry -.in +.2i .LP +.in +.2i \fIdrawable\fP\^: DRAWABLE .in -.2i .LP \(-> -.in +.2i .LP +.in +.2i root: WINDOW .br depth: CARD8 @@ -2729,7 +2756,9 @@ x, y: INT16 .br width, height, border-width: CARD16 +.in -.2i .LP +.in +.2i Errors: .PN Drawable .in -.2i @@ -2751,21 +2780,23 @@ .sM .IN "QueryTree" "" "@DEF@" .PN QueryTree -.in +.2i .LP +.in +.2i \fIwindow\fP\^: WINDOW -.LP .in -.2i +.LP \(-> -.in +.2i .LP +.in +.2i root: WINDOW .br parent: WINDOW or .PN None .br children: LISTofWINDOW +.in -.2i .LP +.in +.2i Errors: .PN Window .in -.2i @@ -2778,19 +2809,21 @@ .sM .IN "InternAtom" "" "@DEF@" .PN InternAtom -.in +.2i .LP +.in +.2i \fIname\fP\^: STRING8 .br \fIonly-if-exists\fP\^: BOOL .in -.2i .LP \(-> -.in +.2i .LP +.in +.2i atom: ATOM or .PN None +.in -.2i .LP +.in +.2i Errors: .PN Alloc , .PN Value @@ -2811,16 +2844,18 @@ .sM .IN "GetAtomName" "" "@DEF@" .PN GetAtomName -.in +.2i .LP +.in +.2i \fIatom\fP\^: ATOM .in -.2i .LP \(-> -.in +.2i .LP +.in +.2i name: STRING8 +.in -.2i .LP +.in +.2i Errors: .PN Atom .in -.2i @@ -2832,8 +2867,8 @@ .sM .IN "ChangeProperty" "" "@DEF@" .PN ChangeProperty -.in +.2i .LP +.in +.2i \fIwindow\fP\^: WINDOW .br \fIproperty\fP, \fItype\fP\^: ATOM @@ -2846,7 +2881,9 @@ .PN Append } .br \fIdata\fP\^: LISTofINT8 or LISTofINT16 or LISTofINT32 +.in -.2i .LP +.in +.2i Errors: .PN Alloc , .PN Atom , @@ -2895,12 +2932,14 @@ .sM .IN "DeleteProperty" "" "@DEF@" .PN DeleteProperty -.in +.2i .LP +.in +.2i \fIwindow\fP\^: WINDOW .br \fIproperty\fP\^: ATOM +.in -.2i .LP +.in +.2i Errors: .PN Atom , .PN Window @@ -2916,8 +2955,8 @@ .sM .IN "GetProperty" "" "@DEF@" .PN GetProperty -.in +.2i .LP +.in +.2i \fIwindow\fP\^: WINDOW .br \fIproperty\fP\^: ATOM @@ -2931,8 +2970,8 @@ .in -.2i .LP \(-> -.in +.2i .LP +.in +.2i type: ATOM or .PN None .br @@ -2941,7 +2980,9 @@ bytes-after: CARD32 .br value: LISTofINT8 or LISTofINT16 or LISTofINT32 +.in -.2i .LP +.in +.2i Errors: .PN Atom , .PN Value , @@ -2997,14 +3038,16 @@ .sM .IN "RotateProperties" "" "@DEF@" .PN RotateProperties -.in +.2i .LP +.in +.2i \fIwindow\fP\^: WINDOW .br \fIdelta\fP\^: INT16 .br \fIproperties\fP\^: LISTofATOM +.in -.2i .LP +.in +.2i Errors: .PN Atom , .PN Match , @@ -3039,16 +3082,18 @@ .sM .IN "ListProperties" "" "@DEF@" .PN ListProperties -.in +.2i .LP +.in +.2i \fIwindow\fP\^: WINDOW .in -.2i .LP \(-> -.in +.2i .LP +.in +.2i atoms: LISTofATOM +.in -.2i .LP +.in +.2i Errors: .PN Window .in -.2i @@ -3060,8 +3105,8 @@ .sM .IN "SetSelectionOwner" "" "@DEF@" .PN SetSelectionOwner -.in +.2i .LP +.in +.2i \fIselection\fP\^: ATOM .br \fIowner\fP\^: WINDOW or @@ -3069,7 +3114,9 @@ .br \fItime\fP\^: TIMESTAMP or .PN CurrentTime +.in -.2i .LP +.in +.2i Errors: .PN Atom , .PN Window @@ -3122,17 +3169,19 @@ .sM .IN "GetSelectionOwner" "" "@DEF@" .PN GetSelectionOwner -.in +.2i .LP +.in +.2i \fIselection\fP\^: ATOM .in -.2i .LP \(-> -.in +.2i .LP +.in +.2i owner: WINDOW or .PN None +.in -.2i .LP +.in +.2i Errors: .PN Atom .in -.2i @@ -3148,8 +3197,8 @@ .sM .IN "ConvertSelection" "" "@DEF@" .PN ConvertSelection -.in +.2i .LP +.in +.2i \fIselection\fP, \fItarget\fP\^: ATOM .br \fIproperty\fP\^: ATOM or @@ -3159,7 +3208,9 @@ .br \fItime\fP\^: TIMESTAMP or .PN CurrentTime +.in -.2i .LP +.in +.2i Errors: .PN Atom , .PN Window @@ -3181,8 +3232,8 @@ .sM .IN "SendEvent" "" "@DEF@" .PN SendEvent -.in +.2i .LP +.in +.2i \fIdestination\fP\^: WINDOW or .PN PointerWindow or @@ -3193,7 +3244,9 @@ \fIevent-mask\fP\^: SETofEVENT .br \fIevent\fP\^: +.in -.2i .LP +.in +.2i Errors: .PN Value , .PN Window @@ -3250,8 +3303,8 @@ .sM .IN "GrabPointer" "" "@DEF@" .PN GrabPointer -.in +.2i .LP +.in +.2i \fIgrab-window\fP\^: WINDOW .br \fIowner-events\fP\^: BOOL @@ -3273,15 +3326,17 @@ .in -.2i .LP \(-> -.in +.2i .LP +.in +.2i status: .Pn { Success , .PN AlreadyGrabbed , .PN Frozen , .PN InvalidTime , .PN NotViewable } +.in -.2i .LP +.in +.2i Errors: .PN Cursor , .PN Value , @@ -3380,8 +3435,8 @@ .sM .IN "UngrabPointer" "" "@DEF@" .PN UngrabPointer -.in +.2i .LP +.in +.2i \fItime\fP\^: TIMESTAMP or .PN CurrentTime .in -.2i @@ -3413,8 +3468,8 @@ .sM .IN "GrabButton" "" "@DEF@" .PN GrabButton -.in +.2i .LP +.in +.2i \fImodifiers\fP\^: SETofKEYMASK or .PN AnyModifier .br @@ -3436,7 +3491,9 @@ .br \fIcursor\fP\^: CURSOR or .PN None +.in -.2i .LP +.in +.2i Errors: .PN Access , .PN Cursor , @@ -3507,8 +3564,8 @@ .sM .IN "UngrabButton" "" "@DEF@" .PN UngrabButton -.in +.2i .LP +.in +.2i \fImodifiers\fP\^: SETofKEYMASK or .PN AnyModifier .br @@ -3516,7 +3573,9 @@ .PN AnyButton .br \fIgrab-window\fP\^: WINDOW +.in -.2i .LP +.in +.2i Errors: .PN Value , .PN Window @@ -3538,8 +3597,8 @@ .sM .IN "ChangeActivePointerGrab" "" "@DEF@" .PN ChangeActivePointerGrab -.in +.2i .LP +.in +.2i \fIevent-mask\fP\^: SETofPOINTEREVENT .br \fIcursor\fP\^: CURSOR or @@ -3547,7 +3606,9 @@ .br \fItime\fP\^: TIMESTAMP or .PN CurrentTime +.in -.2i .LP +.in +.2i Errors: .PN Cursor , .PN Value @@ -3567,8 +3628,8 @@ .sM .IN "GrabKeyboard" "" "@DEF@" .PN GrabKeyboard -.in +.2i .LP +.in +.2i \fIgrab-window\fP\^: WINDOW .br \fIowner-events\fP\^: BOOL @@ -3582,15 +3643,17 @@ .in -.2i .LP \(-> -.in +.2i .LP +.in +.2i status: .Pn { Success , .PN AlreadyGrabbed , .PN Frozen , .PN InvalidTime , .PN NotViewable } +.in -.2i .LP +.in +.2i Errors: .PN Value , .PN Window @@ -3671,8 +3734,8 @@ .sM .IN "UngrabKeyboard" "" "@DEF@" .PN UngrabKeyboard -.in +.2i .LP +.in +.2i \fItime\fP\^: TIMESTAMP or .PN CurrentTime .in -.2i @@ -3702,8 +3765,8 @@ .sM .IN "GrabKey" "" "@DEF@" .PN GrabKey -.in +.2i .LP +.in +.2i \fIkey\fP\^: KEYCODE or .PN AnyKey .br @@ -3717,7 +3780,9 @@ \fIpointer-mode\fP, \fIkeyboard-mode\fP\^: .Pn { Synchronous , .PN Asynchronous } +.in -.2i .LP +.in +.2i Errors: .PN Access , .PN Value , @@ -3789,8 +3854,8 @@ .sM .IN "UngrabKey" "" "@DEF@" .PN UngrabKey -.in +.2i .LP +.in +.2i \fIkey\fP\^: KEYCODE or .PN AnyKey .br @@ -3798,7 +3863,9 @@ .PN AnyModifier .br \fIgrab-window\fP\^: WINDOW +.in -.2i .LP +.in +.2i Errors: .PN Value , .PN Window @@ -3820,8 +3887,8 @@ .sM .IN "AllowEvents" "" "@DEF@" .PN AllowEvents -.in +.2i .LP +.in +.2i \fImode\fP: .Pn { AsyncPointer , .PN SyncPointer , @@ -3836,7 +3903,9 @@ .br \fItime\fP\^: TIMESTAMP or .PN CurrentTime +.in -.2i .LP +.in +.2i Errors: .PN Value .in -.2i @@ -4015,14 +4084,14 @@ .sM .IN "QueryPointer" "" "@DEF@" .PN QueryPointer -.in +.2i .LP +.in +.2i \fIwindow\fP\^: WINDOW .in -.2i .LP \(-> -.in +.2i .LP +.in +.2i root: WINDOW .br child: WINDOW or @@ -4033,7 +4102,9 @@ root-x, root-y, win-x, win-y: INT16 .br mask: SETofKEYBUTMASK +.in -.2i .LP +.in +.2i Errors: .PN Window .in -.2i @@ -4061,8 +4132,8 @@ .sM .IN "GetMotionEvents" "" "@DEF@" .PN GetMotionEvents -.in +.2i .LP +.in +.2i \fIstart\fP, \fIstop\fP\^: TIMESTAMP or .PN CurrentTime .br @@ -4070,10 +4141,12 @@ .in -.2i .LP \(-> -.in +.2i .LP +.in +.2i events: LISTofTIMECOORD +.in -.2i .LP +.in +.2i where: .TS l l. @@ -4081,7 +4154,9 @@ .br \ time: TIMESTAMP] .TE +.in -.2i .LP +.in +.2i Errors: .PN Window .in -.2i @@ -4102,23 +4177,25 @@ .sM .IN "TranslateCoordinates" "" "@DEF@" .PN TranslateCoordinates -.in +.2i .LP +.in +.2i \fIsrc-window\fP, \fIdst-window\fP: WINDOW .br \fIsrc-x\fP, \fIsrc-y\fP\^: INT16 .in -.2i .LP \(-> -.in +.2i .LP +.in +.2i same-screen: BOOL .br child: WINDOW or .PN None .br dst-x, dst-y: INT16 +.in -.2i .LP +.in +.2i Errors: .PN Window .in -.2i @@ -4138,8 +4215,8 @@ .sM .IN "WarpPointer" "" "@DEF@" .PN WarpPointer -.in +.2i .LP +.in +.2i \fIsrc-window\fP\^: WINDOW or .PN None .br @@ -4151,7 +4228,9 @@ \fIsrc-width\fP, \fIsrc-height\fP\^: CARD16 .br \fIdst-x\fP, \fIdst-y\fP\^: INT16 +.in -.2i .LP +.in +.2i Errors: .PN Window .in -.2i @@ -4187,8 +4266,8 @@ .sM .IN "SetInputFocus" "" "@DEF@" .PN SetInputFocus -.in +.2i .LP +.in +.2i \fIfocus\fP\^: WINDOW or .PN PointerRoot or @@ -4201,7 +4280,9 @@ .br \fItime\fP\^: TIMESTAMP or .PN CurrentTime +.in -.2i .LP +.in +.2i Errors: .PN Match , .PN Value , @@ -4271,8 +4352,8 @@ .PN GetInputFocus .LP \(-> -.in +.2i .LP +.in +.2i focus: WINDOW or .PN PointerRoot or @@ -4293,8 +4374,8 @@ .PN QueryKeymap .LP \(-> -.in +.2i .LP +.in +.2i keys: LISTofCARD8 .in -.2i .eM @@ -4311,12 +4392,14 @@ .sM .IN "OpenFont" "" "@DEF@" .PN OpenFont -.in +.2i .LP +.in +.2i \fIfid\fP\^: FONT .br \fIname\fP\^: STRING8 +.in -.2i .LP +.in +.2i Errors: .PN Alloc , .PN IDChoice , @@ -4344,10 +4427,12 @@ .sM .IN "CloseFont" "" "@DEF@" .PN CloseFont -.in +.2i .LP +.in +.2i \fIfont\fP\^: FONT +.in -.2i .LP +.in +.2i Errors: .PN Font .in -.2i @@ -4360,18 +4445,20 @@ .sM .IN "QueryFont" "" "@DEF@" .PN QueryFont -.in +.2i .LP +.in +.2i \fIfont\fP\^: FONTABLE .in -.2i .LP \(-> -.in +.2i .LP +.in +.2i font-info: FONTINFO .br char-infos: LISTofCHARINFO +.in -.2i .LP +.in +.2i where: .IP .TS @@ -4401,7 +4488,9 @@ \ descent: INT16 \ attributes: CARD16] .TE +.in -.2i .LP +.in +.2i Errors: .PN Font .in -.2i @@ -4539,16 +4628,16 @@ .sM .IN "QueryTextExtents" "" "@DEF@" .PN QueryTextExtents -.in +.2i .LP +.in +.2i \fIfont\fP\^: FONTABLE .br \fIstring\fP\^: STRING16 .in -.2i .LP \(-> -.in +.2i .LP +.in +.2i draw-direction: .Pn { LeftToRight , .PN RightToLeft } @@ -4566,7 +4655,9 @@ overall-left: INT32 .br overall-right: INT32 +.in -.2i .LP +.in +.2i Errors: .PN Font .in -.2i @@ -4604,16 +4695,16 @@ .sM .IN "ListFonts" "" "@DEF@" .PN ListFonts -.in +.2i .LP +.in +.2i \fIpattern\fP\^: STRING8 .br \fImax-names\fP\^: CARD16 .in -.2i .LP \(-> -.in +.2i .LP +.in +.2i names: LISTofSTRING8 .in -.2i .eM @@ -4636,27 +4727,30 @@ .sM .IN "ListFontsWithInfo" "" "@DEF@" .PN ListFontsWithInfo -.in +.2i .LP +.in +.2i \fIpattern\fP\^: STRING8 .br \fImax-names\fP\^: CARD16 .in -.2i .LP - \(->+ -.in +.2i + \(-> .LP +.in +.2i name: STRING8 .br -info: FONTINFO +info FONTINFO .br replies-hint: CARD32 +.in -.2i .LP +.in +.2i where: +.in -.2i .LP -FONTINFO: -.in -.2i .eM .LP This request is similar to @@ -4679,10 +4773,12 @@ .sM .IN "SetFontPath" "" "@DEF@" .PN SetFontPath -.in +.2i .LP +.in +.2i \fIpath\fP\^: LISTofSTRING8 +.in -.2i .LP +.in +.2i Errors: .PN Value .in -.2i @@ -4709,8 +4805,8 @@ .PN GetFontPath .LP \(-> -.in +.2i .LP +.in +.2i path: LISTofSTRING8 .in -.2i .eM @@ -4721,8 +4817,8 @@ .sM .IN "CreatePixmap" "" "@DEF@" .PN CreatePixmap -.in +.2i .LP +.in +.2i \fIpid\fP\^: PIXMAP .br \fIdrawable\fP\^: DRAWABLE @@ -4730,7 +4826,9 @@ \fIdepth\fP\^: CARD8 .br \fIwidth\fP, \fIheight\fP\^: CARD16 +.in -.2i .LP +.in +.2i Errors: .PN Alloc , .PN Drawable , @@ -4757,10 +4855,12 @@ .sM .IN "FreePixmap" "" "@DEF@" .PN FreePixmap -.in +.2i .LP +.in +.2i \fIpixmap\fP\^: PIXMAP +.in -.2i .LP +.in +.2i Errors: .PN Pixmap .in -.2i @@ -4773,8 +4873,8 @@ .sM .IN "CreateGC" "" "@DEF@" .PN CreateGC -.in +.2i .LP +.in +.2i \fIcid\fP\^: GCONTEXT .br \fIdrawable\fP\^: DRAWABLE @@ -4782,7 +4882,9 @@ \fIvalue-mask\fP\^: BITMASK .br \fIvalue-list\fP\^: LISTofVALUE +.in -.2i .LP +.in +.2i Errors: .PN Alloc , .PN Drawable , @@ -5655,14 +5757,16 @@ .sM .IN "ChangeGC" "" "@DEF@" .PN ChangeGC -.in +.2i .LP +.in +.2i \fIgc\fP\^: GCONTEXT .br \fIvalue-mask\fP\^: BITMASK .br \fIvalue-list\fP\^: LISTofVALUE +.in -.2i .LP +.in +.2i Errors: .PN Alloc , .PN Font , @@ -5694,12 +5798,14 @@ .sM .IN "CopyGC" "" "@DEF@" .PN CopyGC -.in +.2i .LP +.in +.2i \fIsrc-gc\fP, \fIdst-gc\fP\^: GCONTEXT .br \fIvalue-mask\fP\^: BITMASK +.in -.2i .LP +.in +.2i Errors: .PN Alloc , .PN GContext , @@ -5719,14 +5825,16 @@ .sM .IN "SetDashes" "" "@DEF@" .PN SetDashes -.in +.2i .LP +.in +.2i \fIgc\fP\^: GCONTEXT .br \fIdash-offset\fP\^: CARD16 .br \fIdashes\fP\^: LISTofCARD8 +.in -.2i .LP +.in +.2i Errors: .PN Alloc , .PN GContext , @@ -5791,8 +5899,8 @@ .sM .IN "SetClipRectangles" "" "@DEF@" .PN SetClipRectangles -.in +.2i .LP +.in +.2i \fIgc\fP\^: GCONTEXT .br \fIclip-x-origin\fP, \fIclip-y-origin\fP\^: INT16 @@ -5804,7 +5912,9 @@ .PN YSorted , .PN YXSorted , .PN YXBanded } +.in -.2i .LP +.in +.2i Errors: .PN Alloc , .PN GContext , @@ -5860,10 +5970,12 @@ .sM .IN "FreeGC" "" "@DEF@" .PN FreeGC -.in +.2i .LP +.in +.2i \fIgc\fP\^: GCONTEXT +.in -.2i .LP +.in +.2i Errors: .PN GContext .in -.2i @@ -5876,8 +5988,8 @@ .sM .IN "ClearArea" "" "@DEF@" .PN ClearArea -.in +.2i .LP +.in +.2i \fIwindow\fP\^: WINDOW .br \fIx\fP, \fIy\fP\^: INT16 @@ -5885,7 +5997,9 @@ \fIwidth\fP, \fIheight\fP: CARD16 .br \fIexposures\fP\^: BOOL +.in -.2i .LP +.in +.2i Errors: .PN Match , .PN Value , @@ -5923,8 +6037,8 @@ .sM .IN "CopyArea" "" "@DEF@" .PN CopyArea -.in +.2i .LP +.in +.2i \fIsrc-drawable\fP, \fIdst-drawable\fP\^: DRAWABLE .br \fIgc\fP\^: GCONTEXT @@ -5934,7 +6048,9 @@ \fIwidth\fP, \fIheight\fP\^: CARD16 .br \fIdst-x\fP, \fIdst-y\fP\^: INT16 +.in -.2i .LP +.in +.2i Errors: .PN Drawable , .PN GContext , @@ -5987,8 +6103,8 @@ .sM .IN "CopyPlane" "" "@DEF@" .PN CopyPlane -.in +.2i .LP +.in +.2i \fIsrc-drawable\fP, \fIdst-drawable\fP\^: DRAWABLE .br \fIgc\fP\^: GCONTEXT @@ -6000,7 +6116,9 @@ \fIdst-x\fP, \fIdst-y\fP\^: INT16 .br \fIbit-plane\fP\^: CARD32 +.in -.2i .LP +.in +.2i Errors: .PN Drawable , .PN GContext , @@ -6036,8 +6154,8 @@ .sM .IN "PolyPoint" "" "@DEF@" .PN PolyPoint -.in +.2i .LP +.in +.2i \fIdrawable\fP\^: DRAWABLE .br \fIgc\fP\^: GCONTEXT @@ -6047,7 +6165,9 @@ .PN Previous } .br \fIpoints\fP\^: LISTofPOINT +.in -.2i .LP +.in +.2i Errors: .PN Drawable , .PN GContext , @@ -6071,8 +6191,8 @@ .sM .IN "PolyLine" "" "@DEF@" .PN PolyLine -.in +.2i .LP +.in +.2i \fIdrawable\fP\^: DRAWABLE .br \fIgc\fP\^: GCONTEXT @@ -6082,7 +6202,9 @@ .PN Previous } .br \fIpoints\fP\^: LISTofPOINT +.in -.2i .LP +.in +.2i Errors: .PN Drawable , .PN GContext , @@ -6129,18 +6251,24 @@ .sM .IN "PolySegment" "" "@DEF@" .PN PolySegment -.in +.2i .LP +.in +.2i \fIdrawable\fP\^: DRAWABLE .br \fIgc\fP\^: GCONTEXT .br \fIsegments\fP\^: LISTofSEGMENT +.in -.2i .LP +.in +.2i where: +.in -.2i .LP +.in +.2i SEGMENT: [x1, y1, x2, y2: INT16] +.in -.2i .LP +.in +.2i Errors: .PN Drawable , .PN GContext , @@ -6168,14 +6296,16 @@ .sM .IN "PolyRectangle" "" "@DEF@" .PN PolyRectangle -.in +.2i .LP +.in +.2i \fIdrawable\fP\^: DRAWABLE .br \fIgc\fP\^: GCONTEXT .br \fIrectangles\fP\^: LISTofRECTANGLE +.in -.2i .LP +.in +.2i Errors: .PN Drawable , .PN GContext , @@ -6211,14 +6341,16 @@ .sM .IN "PolyArc" "" "@DEF@" .PN PolyArc -.in +.2i .LP +.in +.2i \fIdrawable\fP\^: DRAWABLE .br \fIgc\fP\^: GCONTEXT .br \fIarcs\fP\^: LISTofARC +.in -.2i .LP +.in +.2i Errors: .PN Drawable , .PN GContext , @@ -6340,8 +6472,8 @@ .sM .IN "FillPoly" "" "@DEF@" .PN FillPoly -.in +.2i .LP +.in +.2in \fIdrawable\fP\^: DRAWABLE .br \fIgc\fP\^: GCONTEXT @@ -6356,7 +6488,9 @@ .PN Previous } .br \fIpoints\fP\^: LISTofPOINT +.in -.2i .LP +.in +.2i Errors: .PN Drawable , .PN GContext , @@ -6416,14 +6550,16 @@ .sM .IN "PolyFillRectangle" "" "@DEF@" .PN PolyFillRectangle -.in +.2i .LP +.in +.2i \fIdrawable\fP\^: DRAWABLE .br \fIgc\fP\^: GCONTEXT .br \fIrectangles\fP\^: LISTofRECTANGLE +.in -.2i .LP +.in +.2i Errors: .PN Drawable , .PN GContext , @@ -6457,14 +6593,16 @@ .sM .IN "PolyFillArc" "" "@DEF@" .PN PolyFillArc -.in +.2i .LP +.in +.2i \fIdrawable\fP\^: DRAWABLE .br \fIgc\fP\^: GCONTEXT .br \fIarcs\fP\^: LISTofARC +.in -.2i .LP +.in +.2i Errors: .PN Drawable , .PN GContext , @@ -6521,8 +6659,8 @@ .sM .IN "PutImage" "" "@DEF@" .PN PutImage -.in +.2i .LP +.in +.2i \fIdrawable\fP\^: DRAWABLE .br \fIgc\fP\^: GCONTEXT @@ -6541,7 +6679,9 @@ .PN ZPixmap } .br \fIdata\fP\^: LISTofBYTE +.in -.2i .LP +.in +.2i Errors: .PN Drawable , .PN GContext , @@ -6604,8 +6744,8 @@ .sM .IN "GetImage" "" "@DEF@" .PN GetImage -.in +.2i .LP +.in +.2i \fIdrawable\fP\^: DRAWABLE .br \fIx\fP, \fIy\fP\^: INT16 @@ -6620,15 +6760,17 @@ .in -.2i .LP \(-> -.in +.2i .LP +.in +.2i depth: CARD8 .br visual: VISUALID or .PN None .br data: LISTofBYTE +.in -.2i .LP +.in +.2i Errors: .PN Drawable , .PN Match , @@ -6690,8 +6832,8 @@ .sM .IN "PolyText8" "" "@DEF@" .PN PolyText8 -.in +.2i .LP +.in +.2i \fIdrawable\fP\^: DRAWABLE .br \fIgc\fP\^: GCONTEXT @@ -6699,7 +6841,9 @@ \fIx\fP, \fIy\fP\^: INT16 .br \fIitems\fP\^: LISTofTEXTITEM8 +.in -.2i .LP +.in +.2i where: .TS r l. @@ -6709,7 +6853,9 @@ .br \ string: STRING8] .TE +.in -.2i .LP +.in +.2i Errors: .PN Drawable , .PN Font , @@ -6751,8 +6897,8 @@ .sM .IN "PolyText16" "" "@DEF@" .PN PolyText16 -.in +.2i .LP +.in +.2i \fIdrawable\fP\^: DRAWABLE .br \fIgc\fP\^: GCONTEXT @@ -6760,7 +6906,9 @@ \fIx\fP, \fIy\fP\^: INT16 .br \fIitems\fP\^: LISTofTEXTITEM16 +.in -.2i .LP +.in +.2i where: .TS r l. @@ -6770,7 +6918,9 @@ .br \ string: STRING16] .TE +.in -.2i .LP +.in +.2i Errors: .PN Drawable , .PN Font , @@ -6791,8 +6941,8 @@ .sM .IN "ImageText8" "" "@DEF@" .PN ImageText8 -.in +.2i .LP +.in +.2i \fIdrawable\fP\^: DRAWABLE .br \fIgc\fP\^: GCONTEXT @@ -6800,7 +6950,9 @@ \fIx\fP, \fIy\fP\^: INT16 .br \fIstring\fP\^: STRING8 +.in -.2i .LP +.in +.2i Errors: .PN Drawable , .PN GContext , @@ -6849,8 +7001,8 @@ .sM .IN "ImageText16" "" "@DEF@" .PN ImageText16 -.in +.2i .LP +.in +.2i \fIdrawable\fP\^: DRAWABLE .br \fIgc\fP\^: GCONTEXT @@ -6858,7 +7010,9 @@ \fIx\fP, \fIy\fP\^: INT16 .br \fIstring\fP\^: STRING16 +.in -.2i .LP +.in +.2i Errors: .PN Drawable , .PN GContext , @@ -6878,8 +7032,8 @@ .sM .IN "CreateColormap" "" "@DEF@" .PN CreateColormap -.in +.2i .LP +.in +.2i \fImid\fP\^: COLORMAP .br \fIvisual\fP\^: VISUALID @@ -6889,7 +7043,9 @@ \fIalloc\fP\^: .Pn { None , .PN All } +.in -.2i .LP +.in +.2i Errors: .PN Alloc , .PN IDChoice , @@ -6959,10 +7115,12 @@ .sM .IN "FreeColormap" "" "@DEF@" .PN FreeColormap -.in +.2i .LP +.in +.2i \fIcmap\fP\^: COLORMAP +.in -.2i .LP +.in +.2i Errors: .PN Colormap .in -.2i @@ -6992,10 +7150,12 @@ .sM .IN "CopyColormapAndFree" "" "@DEF@" .PN CopyColormapAndFree -.in +.2i .LP +.in +.2i \fImid\fP, \fIsrc-cmap\fP\^: COLORMAP +.in -.2i .LP +.in +.2i Errors: .PN Alloc , .PN Colormap , @@ -7035,10 +7195,12 @@ .sM .IN "InstallColormap" "" "@DEF@" .PN InstallColormap -.in +.2i .LP +.in +.2i \fIcmap\fP\^: COLORMAP +.in -.2i .LP +.in +.2i Errors: .PN Colormap .in -.2i @@ -7085,10 +7247,12 @@ .sM .IN "UninstallColormap" "" "@DEF@" .PN UninstallColormap -.in +.2i .LP +.in +.2i \fIcmap\fP\^: COLORMAP +.in -.2i .LP +.in +.2i Errors: .PN Colormap .in -.2i @@ -7117,16 +7281,18 @@ .sM .IN "ListInstalledColormaps" "" "@DEF@" .PN ListInstalledColormaps -.in +.2i .LP +.in +.2i \fIwindow\fP\^: WINDOW .in -.2i .LP \(-> -.in +.2i .LP +.in +.2i cmaps: LISTofCOLORMAP +.in -.2i .LP +.in +.2i Errors: .PN Window .in -.2i @@ -7143,20 +7309,22 @@ .sM .IN "AllocColor" "" "@DEF@" .PN AllocColor -.in +.2i .LP +.in +.2i \fIcmap\fP\^: COLORMAP .br \fIred\fP, \fIgreen\fP, \fIblue\fP\^: CARD16 .in -.2i .LP \(-> -.in +.2i .LP +.in +.2i pixel: CARD32 .br red, green, blue: CARD16 +.in -.2i .LP +.in +.2i Errors: .PN Alloc , .PN Colormap @@ -7173,22 +7341,24 @@ .sM .IN "AllocNamedColor" "" "@DEF@" .PN AllocNamedColor -.in +.2i .LP +.in +.2i \fIcmap\fP\^: COLORMAP .br \fIname\fP\^: STRING8 .in -.2i .LP \(-> -.in +.2i .LP +.in +.2i pixel: CARD32 .br exact-red, exact-green, exact-blue: CARD16 .br visual-red, visual-green, visual-blue: CARD16 +.in -.2i .LP +.in +.2i Errors: .PN Alloc , .PN Colormap , @@ -7210,8 +7380,8 @@ .sM .IN "AllocColorCells" "" "@DEF@" .PN AllocColorCells -.in +.2i .LP +.in +.2i \fIcmap\fP\^: COLORMAP .br \fIcolors\fP, \fIplanes\fP\^: CARD16 @@ -7220,10 +7390,12 @@ .in -.2i .LP \(-> -.in +.2i .LP +.in +.2i pixels, masks: LISTofCARD32 +.in -.2i .LP +.in +.2i Errors: .PN Alloc , .PN Colormap , @@ -7264,8 +7436,8 @@ .sM .IN "AllocColorPlanes" "" "@DEF@" .PN AllocColorPlanes -.in +.2i .LP +.in +.2i \fIcmap\fP\^: COLORMAP .br \fIcolors\fP, \fIreds\fP, \fIgreens\fP, \fIblues\fP\^: CARD16 @@ -7274,12 +7446,14 @@ .in -.2i .LP \(-> -.in +.2i .LP +.in +.2i pixels: LISTofCARD32 .br red-mask, green-mask, blue-mask: CARD32 +.in -.2i .LP +.in +.2i Errors: .PN Alloc , .PN Colormap , @@ -7323,14 +7497,16 @@ .sM .IN "FreeColors" "" "@DEF@" .PN FreeColors -.in +.2i .LP +.in +.2i \fIcmap\fP\^: COLORMAP .br \fIpixels\fP\^: LISTofCARD32 .br \fIplane-mask\fP\^: CARD32 +.in -.2i .LP +.in +.2i Errors: .PN Access , .PN Colormap , @@ -7380,12 +7556,14 @@ .sM .IN "StoreColors" "" "@DEF@" .PN StoreColors -.in +.2i .LP +.in +.2i \fIcmap\fP\^: COLORMAP .br \fIitems\fP\^: LISTofCOLORITEM +.in -.2i .LP +.in +.2i where: .TS l l. @@ -7395,7 +7573,9 @@ .br \ red, green, blue: CARD16] .TE +.in -.2i .LP +.in +.2i Errors: .PN Access , .PN Colormap , @@ -7424,8 +7604,8 @@ .sM .IN "StoreNamedColor" "" "@DEF@" .PN StoreNamedColor -.in +.2i .LP +.in +.2i \fIcmap\fP\^: COLORMAP .br \fIpixel\fP\^: CARD32 @@ -7433,7 +7613,9 @@ \fIname\fP\^: STRING8 .br \fIdo-red\fP, \fIdo-green\fP\^, \fIdo-blue\fP\^: BOOL +.in -.2i .LP +.in +.2i Errors: .PN Access , .PN Colormap , @@ -7459,23 +7641,28 @@ .sM .IN "QueryColors" "" "@DEF@" .PN QueryColors -.in +.2i .LP +.in +.2i \fIcmap\fP\^: COLORMAP .br \fIpixels\fP\^: LISTofCARD32 .in -.2i .LP \(-> -.in +.2i .LP +.in +.2i colors: LISTofRGB +.in -.2i .LP +.in +.2i where: +.in -.2i .LP -.DS 0 +.in +.2i RGB: [red, green, blue: CARD16] -.DE +.in -.2i +.LP +.in +.2i Errors: .PN Colormap , .PN Value @@ -7495,20 +7682,22 @@ .sM .IN "LookupColor" "" "@DEF@" .PN LookupColor -.in +.2i .LP +.in +.2i \fIcmap\fP\^: COLORMAP .br \fIname\fP\^: STRING8 .in -.2i .LP \(-> -.in +.2i .LP +.in +.2i exact-red, exact-green, exact-blue: CARD16 .br visual-red, visual-green, visual-blue: CARD16 +.in -.2i .LP +.in +.2i Errors: .PN Colormap , .PN Name @@ -7526,8 +7715,8 @@ .sM .IN "CreateCursor" "" "@DEF@" .PN CreateCursor -.in +.2i .LP +.in +.2i \fIcid\fP\^: CURSOR .br \fIsource\fP\^: PIXMAP @@ -7540,7 +7729,9 @@ \fIback-red\fP, \fIback-green\fP, \fIback-blue\fP\^: CARD16 .br \fIx\fP, \fIy\fP\^: CARD16 +.in -.2i .LP +.in +.2i Errors: .PN Alloc , .PN IDChoice , @@ -7590,8 +7781,8 @@ .sM .IN "CreateGlyphCursor" "" "@DEF@" .PN CreateGlyphCursor -.in +.2i .LP +.in +.2i \fIcid\fP\^: CURSOR .br \fIsource-font\fP\^: FONT @@ -7604,7 +7795,9 @@ \fIfore-red\fP, \fIfore-green\fP, \fIfore-blue\fP\^: CARD16 .br \fIback-red\fP, \fIback-green\fP, \fIback-blue\fP\^: CARD16 +.in -.2i .LP +.in +.2i Errors: .PN Alloc , .PN Font , @@ -7644,10 +7837,12 @@ .sM .IN "FreeCursor" "" "@DEF@" .PN FreeCursor -.in +.2i .LP +.in +.2i \fIcursor\fP\^: CURSOR +.in -.2i .LP +.in +.2i Errors: .PN Cursor .in -.2i @@ -7660,14 +7855,16 @@ .sM .IN "RecolorCursor" "" "@DEF@" .PN RecolorCursor -.in +.2i .LP +.in +.2i \fIcursor\fP\^: CURSOR .br \fIfore-red\fP, \fIfore-green\fP, \fIfore-blue\fP\^: CARD16 .br \fIback-red\fP, \fIback-green\fP, \fIback-blue\fP\^: CARD16 +.in -.2i .LP +.in +.2i Errors: .PN Cursor .in -.2i @@ -7681,8 +7878,8 @@ .sM .IN "QueryBestSize" "" "@DEF@" .PN QueryBestSize -.in +.2i .LP +.in +.2i \fIclass\fP: .Pn { Cursor , .PN Tile , @@ -7694,10 +7891,12 @@ .in -.2i .LP \(-> -.in +.2i .LP +.in +.2i width, height: CARD16 +.in -.2i .LP +.in +.2i Errors: .PN Drawable , .PN Match , @@ -7738,14 +7937,14 @@ .sM .IN "QueryExtension" "" "@DEF@" .PN QueryExtension -.in +.2i .LP +.in +.2i \fIname\fP\^: STRING8 .in -.2i .LP \(-> -.in +.2i .LP +.in +.2i present: BOOL .br major-opcode: CARD8 @@ -7779,8 +7978,8 @@ .PN ListExtensions .LP \(-> -.in +.2i .LP +.in +.2i names: LISTofSTRING8 .in -.2i .eM @@ -7790,21 +7989,23 @@ .sM .IN "SetModifierMapping" "" "@DEF@" .PN SetModifierMapping -.in +.2i .LP +.in +.2i \fIkeycodes-per-modifier\fP\^: CARD8 .br \fIkeycodes\fP\^: LISTofKEYCODE .in -.2i .LP \(-> -.in +.2i .LP +.in +.2i status: .Pn { Success , .PN Busy , .PN Failed } +.in -.2i .LP +.in +.2i Errors: .PN Alloc , .PN Value @@ -7870,8 +8071,8 @@ .PN GetModifierMapping .LP \(-> -.in +.2i .LP +.in +.2i keycodes-per-modifier: CARD8 .br keycodes: LISTofKEYCODE @@ -7903,14 +8104,16 @@ .sM .IN "ChangeKeyboardMapping" "" "@DEF@" .PN ChangeKeyboardMapping -.in +.2i .LP +.in +.2i \fIfirst-keycode\fP\^: KEYCODE .br \fIkeysyms-per-keycode\fP\^: CARD8 .br \fIkeysyms\fP\^: LISTofKEYSYM +.in -.2i .LP +.in +.2i Errors: .PN Alloc , .PN Value @@ -7963,20 +8166,22 @@ .sM .IN "GetKeyboardMapping" "" "@DEF@" .PN GetKeyboardMapping -.in +.2i .LP +.in +.2i \fIfirst-keycode\fP\^: KEYCODE .br \fIcount\fP\^: CARD8 .in -.2i .LP \(-> -.in +.2i .LP +.in +.2i keysyms-per-keycode: CARD8 .br keysyms: LISTofKEYSYM +.in -.2i .LP +.in +.2i Errors: .PN Value .in -.2i @@ -8018,12 +8223,14 @@ .sM .IN "ChangeKeyboardControl" "" "@DEF@" .PN ChangeKeyboardControl -.in +.2i .LP +.in +.2i \fIvalue-mask\fP\^: BITMASK .br \fIvalue-list\fP\^: LISTofVALUE +.in -.2i .LP +.in +.2i Errors: .PN Match , .PN Value @@ -8168,8 +8375,8 @@ .PN GetKeyboardControl .LP \(-> -.in +.2i .LP +.in +.2i key-click-percent: CARD8 .br bell-percent: CARD8 @@ -8202,10 +8409,12 @@ .sM .IN "Bell" "" "@DEF@" .PN Bell -.in +.2i .LP +.in +.2i \fIpercent\fP\^: INT8 +.in -.2i .LP +.in +.2i Errors: .PN Value .in -.2i @@ -8230,18 +8439,20 @@ .sM .IN "SetPointerMapping" "" "@DEF@" .PN SetPointerMapping -.in +.2i .LP +.in +.2i \fImap\fP\^: LISTofCARD8 .in -.2i .LP \(-> -.in +.2i .LP +.in +.2i status: .Pn { Success , .PN Busy } +.in -.2i .LP +.in +.2i Errors: .PN Value .in -.2i @@ -8280,8 +8491,8 @@ .PN GetPointerMapping .LP \(-> -.in +.2i .LP +.in +.2i map: LISTofCARD8 .in -.2i .eM @@ -8296,14 +8507,16 @@ .sM .IN "ChangePointerControl" "" "@DEF@" .PN ChangePointerControl -.in +.2i .LP +.in +.2i \fIdo-acceleration\fP, \fIdo-threshold\fP\^: BOOL .br \fIacceleration-numerator\fP, \fIacceleration-denominator\fP\^: INT16 .br \fIthreshold\fP\^: INT16 +.in -.2i .LP +.in +.2i Errors: .PN Value .in -.2i @@ -8327,8 +8540,8 @@ .PN GetPointerControl .LP \(-> -.in +.2i .LP +.in +.2i acceleration-numerator, acceleration-denominator: CARD16 .br threshold: CARD16 @@ -8341,8 +8554,8 @@ .sM .IN "SetScreenSaver" "" "@DEF@" .PN SetScreenSaver -.in +.2i .LP +.in +.2i \fItimeout\fP, \fIinterval\fP\^: INT16 .br \fIprefer-blanking\fP\^: @@ -8354,7 +8567,9 @@ .Pn { Yes , .PN No , .PN Default } +.in -.2i .LP +.in +.2i Errors: .PN Value .in -.2i @@ -8401,8 +8616,8 @@ .PN GetScreenSaver .LP \(-> -.in +.2i .LP +.in +.2i timeout, interval: CARD16 .br prefer-blanking: @@ -8421,12 +8636,14 @@ .sM .IN "ForceScreenSaver" "" "@DEF@" .PN ForceScreenSaver -.in +.2i .LP +.in +.2i \fImode\fP\^: .Pn { Activate , .PN Reset } +.in -.2i .LP +.in +.2i Errors: .PN Value .in -.2i @@ -8448,14 +8665,16 @@ .sM .IN "ChangeHosts" "" "@DEF@" .PN ChangeHosts -.in +.2i .LP +.in +.2i \fImode\fP\^: .Pn { Insert , .PN Delete } .br \fIhost\fP: HOST +.in -.2i .LP +.in +.2i Errors: .PN Access , .PN Value @@ -8519,8 +8738,8 @@ .PN ListHosts .LP \(-> -.in +.2i .LP +.in +.2i mode: .Pn { Enabled , .PN Disabled } @@ -8539,12 +8758,14 @@ .sM .IN "SetAccessControl" "" "@DEF@" .PN SetAccessControl -.in +.2i .LP +.in +.2i \fImode\fP\^: .Pn { Enable , .PN Disable } +.in -.2i .LP +.in +.2i Errors: .PN Access , .PN Value @@ -8564,13 +8785,15 @@ .sM .IN "SetCloseDownMode" "" "@DEF@" .PN SetCloseDownMode -.in +.2i .LP +.in +.2i \fImode\fP: .Pn { Destroy , .PN RetainPermanent , .PN RetainTemporary } +.in -.2i .LP +.in +.2i Errors: .PN Value .in -.2i @@ -8587,11 +8810,13 @@ .sM .IN "KillClient" "" "@DEF@" .PN KillClient -.in +.2i .LP +.in +.2i \fIresource\fP\^: CARD32 or .PN AllTemporary +.in -.2i .LP +.in +.2i Errors: .PN Value .in -.2i @@ -8795,8 +9020,8 @@ .br .IN "MotionNotify" "" "@DEF@" .PN MotionNotify -.in +.2i .LP +.in +.2i \fIroot\fP, \fIevent\fP\^: WINDOW .br \fIchild\fP\^: WINDOW or @@ -8925,8 +9150,8 @@ .br .IN "LeaveNotify" "" "@DEF@" .PN LeaveNotify -.in +.2i .LP +.in +.2i \fIroot\fP, \fIevent\fP\^: WINDOW .br \fIchild\fP\^: WINDOW or @@ -9160,8 +9385,8 @@ .br .IN "FocusOut" "" "@DEF@" .PN FocusOut -.in +.2i .LP +.in +.2i \fIevent\fP\^: WINDOW .br \fImode\fP\^: @@ -9484,8 +9709,8 @@ .sM .IN "KeymapNotify" "" "@DEF@" .PN KeymapNotify -.in +.2i .LP +.in +.2i \fIkeys\fP\^: LISTofCARD8 .in -.2i .eM @@ -9503,8 +9728,8 @@ .sM .IN "Expose" "" "@DEF@" .PN Expose -.in +.2i .LP +.in +.2i \fIwindow\fP\^: WINDOW .br \fIx\fP, \fIy\fP, \fIwidth\fP, \fIheight\fP\^: CARD16 @@ -9581,8 +9806,8 @@ .sM .IN "GraphicsExposure" "" "@DEF@" .PN GraphicsExposure -.in +.2i .LP +.in +.2i \fIdrawable\fP\^: DRAWABLE .br \fIx\fP, \fIy\fP, \fIwidth\fP, \fIheight\fP\^: CARD16 @@ -9625,8 +9850,8 @@ .sM .IN "NoExposure" "" "@DEF@" .PN NoExposure -.in +.2i .LP +.in +.2i \fIdrawable\fP\^: DRAWABLE .br \fImajor-opcode\fP\^: CARD8 @@ -9655,8 +9880,8 @@ .sM .IN "VisibilityNotify" "" "@DEF@" .PN VisibilityNotify -.in +.2i .LP +.in +.2i \fIwindow\fP\^: WINDOW .br \fIstate\fP\^: @@ -9726,8 +9951,8 @@ .sM .IN "CreateNotify" "" "@DEF@" .PN CreateNotify -.in +.2i .LP +.in +.2i \fIparent\fP, \fIwindow\fP\^: WINDOW .br \fIx\fP, \fIy\fP\^: INT16 @@ -9750,8 +9975,8 @@ .sM .IN "DestroyNotify" "" "@DEF@" .PN DestroyNotify -.in +.2i .LP +.in +.2i \fIevent\fP, \fIwindow\fP\^: WINDOW .in -.2i .eM @@ -9778,8 +10003,8 @@ .sM .IN "UnmapNotify" "" "@DEF@" .PN UnmapNotify -.in +.2i .LP +.in +.2i \fIevent\fP, \fIwindow\fP\^: WINDOW .br \fIfrom-configure\fP\^: BOOL @@ -9804,8 +10029,8 @@ .sM .IN "MapNotify" "" "@DEF@" .PN MapNotify -.in +.2i .LP +.in +.2i \fIevent\fP, \fIwindow\fP\^: WINDOW .br \fIoverride-redirect\fP\^: BOOL @@ -9826,8 +10051,8 @@ .sM .IN "MapRequest" "" "@DEF@" .PN MapRequest -.in +.2i .LP +.in +.2i \fIparent\fP, \fIwindow\fP\^: WINDOW .in -.2i .eM @@ -9843,8 +10068,8 @@ .sM .IN "ReparentNotify" "" "@DEF@" .PN ReparentNotify -.in +.2i .LP +.in +.2i \fIevent\fP, \fIwindow\fP, \fIparent\fP\^: WINDOW .br \fIx\fP, \fIy\fP\^: INT16 @@ -9870,8 +10095,8 @@ .sM .IN "ConfigureNotify" "" "@DEF@" .PN ConfigureNotify -.in +.2i .LP +.in +.2i \fIevent\fP, \fIwindow\fP\^: WINDOW .br \fIx\fP, \fIy\fP\^: INT16 @@ -9908,8 +10133,8 @@ .sM .IN "GravityNotify" "" "@DEF@" .PN GravityNotify -.in +.2i .LP +.in +.2i \fIevent\fP, \fIwindow\fP\^: WINDOW .br \fIx\fP, \fIy\fP\^: INT16 @@ -9932,8 +10157,8 @@ .sM .IN "ResizeRequest" "" "@DEF@" .PN ResizeRequest -.in +.2i .LP +.in +.2i \fIwindow\fP\^: WINDOW .br \fIwidth\fP, \fIheight\fP\^: CARD16 @@ -9952,8 +10177,8 @@ .sM .IN "ConfigureRequest" "" "@DEF@" .PN ConfigureRequest -.in +.2i .LP +.in +.2i \fIparent\fP, \fIwindow\fP\^: WINDOW .br \fIx\fP, \fIy\fP\^: INT16 @@ -9994,8 +10219,8 @@ .sM .IN "CirculateNotify" "" "@DEF@" .PN CirculateNotify -.in +.2i .LP +.in +.2i \fIevent\fP, \fIwindow\fP\^: WINDOW .br \fIplace\fP\^: @@ -10023,8 +10248,8 @@ .sM .IN "CirculateRequest" "" "@DEF@" .PN CirculateRequest -.in +.2i .LP +.in +.2i \fIparent\fP, \fIwindow\fP\^: WINDOW .br \fIplace\fP: @@ -10045,8 +10270,8 @@ .sM .IN "PropertyNotify" "" "@DEF@" .PN PropertyNotify -.in +.2i .LP +.in +.2i \fIwindow\fP\^: WINDOW .br \fIatom\fP\^: ATOM @@ -10086,8 +10311,8 @@ .sM .IN "SelectionClear" "" "@DEF@" .PN SelectionClear -.in +.2i .LP +.in +.2i \fIowner\fP\^: WINDOW .br \fIselection\fP\^: ATOM @@ -10108,8 +10333,8 @@ .sM .IN "SelectionRequest" "" "@DEF@" .PN SelectionRequest -.in +.2i .LP +.in +.2i \fIowner\fP\^: WINDOW .br \fIselection\fP\^: ATOM @@ -10148,8 +10373,8 @@ .sM .IN "SelectionNotify" "" "@DEF@" .PN SelectionNotify -.in +.2i .LP +.in +.2i \fIrequestor\fP\^: WINDOW .br \fIselection\fP, \fItarget\fP\^: ATOM @@ -10177,8 +10402,8 @@ .sM .IN "ColormapNotify" "" "@DEF@" .PN ColormapNotify -.in +.2i .LP +.in +.2i \fIwindow\fP\^: WINDOW .br \fIcolormap\fP\^: COLORMAP or @@ -10208,8 +10433,8 @@ .sM .IN "MappingNotify" "" "@DEF@" .PN MappingNotify -.in +.2i .LP +.in +.2i \fIrequest\fP: .Pn { Modifier , .PN Keyboard , @@ -10240,8 +10465,8 @@ .sM .IN "ClientMessage" "" "@DEF@" .PN ClientMessage -.in +.2i .LP +.in +.2i \fIwindow\fP\^: WINDOW .br \fItype\fP\^: ATOM Index: xc/doc/specs/Xi/porting.ms diff -u xc/doc/specs/Xi/porting.ms:1.1.1.4 xc/doc/specs/Xi/porting.ms:1.2 --- xc/doc/specs/Xi/porting.ms:1.1.1.4 Sun Sep 27 05:06:28 1998 +++ xc/doc/specs/Xi/porting.ms Mon Dec 4 18:25:59 2000 @@ -1,3 +1,4 @@ +.\" $XFree86: xc/doc/specs/Xi/porting.ms,v 1.2 2000/12/04 23:25:59 dawes Exp $ .\" Input Extension Porting Document .EH '''' .OH '''' @@ -987,4 +988,4 @@ The event type is \fBProximityIn\fP or \fBProximityOut\fP, and there is no detail information. .bp -.TC +.\" .TC Index: xc/doc/specs/Xmu/Xmu.ms diff -u xc/doc/specs/Xmu/Xmu.ms:1.1.1.4 xc/doc/specs/Xmu/Xmu.ms:1.2 --- xc/doc/specs/Xmu/Xmu.ms:1.1.1.4 Sun Sep 27 05:06:33 1998 +++ xc/doc/specs/Xmu/Xmu.ms Tue Nov 28 13:49:20 2000 @@ -1,3 +1,6 @@ +.\" +.\" $XFree86: xc/doc/specs/Xmu/Xmu.ms,v 1.2 2000/11/28 18:49:20 dawes Exp $ +.\" .sp 8 .ce 2 \s+2\fBXmu Library\fP\s-2 @@ -70,6 +73,7 @@ XA_TEXT(\fId\fP) XA_TIMESTAMP(\fId\fP) XA_USER(\fId\fP) +XA_UTF8_STRING(\fId\fP) .FN .LP These macros take a display as argument and return an @@ -1198,6 +1202,11 @@ To use the functions defined in this section, you should include the header file .Pn < X11/Xmu/CharSet.h >. +.LP +The functions in this section are \fBdeprecated\fP because they don't work +in most locales now supported by X11; the function +.PN XmbLookupString +provides a better alternative. .sp .FD 0 void XmuCopyISOLatin1Lowered(\fIdst\fP, \fIsrc\fP) @@ -1567,9 +1576,16 @@ Compound Text Functions .LP The functions defined in this section are for parsing Compound Text strings, -decomposing them into individual segments. Definitions needed to use these +decomposing them into individual segments. Definitions needed to use these routines are in the include file .Pn < X11/Xmu/Xct.h >. +.LP +The functions in this section are \fBdeprecated\fP because they shift the +burden for recently introduced locale encodings to the application. The +use of the +.PN UTF8_STRING +text encoding provides a better alternative. +.LP A Compound Text string is represented as the following type: .LP typedef unsigned char *XctString; Index: xc/doc/specs/i18n/Framework.ms diff -u xc/doc/specs/i18n/Framework.ms:1.1.1.4 xc/doc/specs/i18n/Framework.ms:1.3 --- xc/doc/specs/i18n/Framework.ms:1.1.1.4 Sun Sep 27 05:06:55 1998 +++ xc/doc/specs/i18n/Framework.ms Mon Dec 4 18:26:00 2000 @@ -1,5 +1,6 @@ .\" $TOG: Framework.ms /main/6 1997/11/04 18:03:10 kaleb $ .\" To print this out, type tbl macros.t ThisFile | troff -ms +.\" $XFree86: xc/doc/specs/i18n/Framework.ms,v 1.3 2000/12/04 23:26:00 dawes Exp $ .EH '''' .OH '''' .EF '''' @@ -296,9 +297,9 @@ \h'3.063i'\v'0.782i'\h'-0.0m'\v'0.2m'\s12\fR>>\fP .sp -1 .sp 1+4.344i +.in -1c .PE .if \n(00 .fi -.in -1c .\" figure end .LP .ce @@ -1000,7 +1001,7 @@ .LP The .PN _XlcCompareIsoLatin1 -function to compares two ISO-8859-1 strings. Bytes representing lower +function to compares two ISO-8859-1 strings. Bytes representing ASCII lower case letters are converted to upper case before making the comparison. The value returned is an integer less than, equal to, or greater than zero, depending on whether ``\fIstr1\fP'' is lexicographicly less than, Index: xc/doc/specs/programs/Imakefile diff -u xc/doc/specs/programs/Imakefile:1.2 xc/doc/specs/programs/Imakefile:1.4 --- xc/doc/specs/programs/Imakefile:1.2 Thu Jun 15 16:49:57 2000 +++ xc/doc/specs/programs/Imakefile Tue Dec 12 11:16:42 2000 @@ -1,16 +1,16 @@ XCOMM $XConsortium: Imakefile /main/10 1996/02/08 01:54:18 gildea $ -XCOMM $XFree86: xc/doc/specs/programs/Imakefile,v 1.2 2000/06/15 20:49:57 dawes Exp $ +XCOMM $XFree86: xc/doc/specs/programs/Imakefile,v 1.4 2000/12/12 16:16:42 dawes Exp $ /* does not include manual pages under util (not X programs) or any of the library function manual pages under doc/man */ #ifdef XFree86Version XFREE86_MANUALS = \ - $(TOP)/programs/Xserver/hw/XFree86/XFree86.man \ - $(TOP)/programs/Xserver/hw/XFree86/XF86Config.man \ - $(TOP)/programs/Xserver/hw/XFree86/xf86config/xf86conf.man \ - $(TOP)/programs/Xserver/hw/XFree86/xf86cfg/xf86cfg.man \ - $(TOP)/programs/Xserver/hw/XFree86/SuperProbe/SuperProbe.man + $(TOP)/programs/Xserver/hw/xfree86/XFree86.man \ + $(TOP)/programs/Xserver/hw/xfree86/XF86Config.man \ + $(TOP)/programs/Xserver/hw/xfree86/xf86config/xf86config.man \ + $(TOP)/programs/Xserver/hw/xfree86/xf86cfg/xf86cfg.man \ + $(TOP)/programs/Xserver/hw/xfree86/SuperProbe/SuperProbe.man #endif MANUALS = \ Index: xc/doc/specs/xterm/ctlseqs.ms diff -u xc/doc/specs/xterm/ctlseqs.ms:3.38 xc/doc/specs/xterm/ctlseqs.ms:3.40 --- xc/doc/specs/xterm/ctlseqs.ms:3.38 Tue Jun 13 20:16:05 2000 +++ xc/doc/specs/xterm/ctlseqs.ms Wed Dec 6 21:40:46 2000 @@ -1,7 +1,7 @@ .\"#! troff -ms $1 -*- Nroff -*- .\" "Xterm Control Sequences" document .\" $XConsortium: ctlseqs.ms,v 1.16 94/12/28 20:45:48 gildea Exp $ -.\" $XFree86: xc/doc/specs/xterm/ctlseqs.ms,v 3.38 2000/06/14 00:16:05 dawes Exp $ +.\" $XFree86: xc/doc/specs/xterm/ctlseqs.ms,v 3.40 2000/12/07 02:40:46 dickey Exp $ .\" .\" .\" Copyright 1996,1997,1998,1999,2000 by Thomas E. Dickey @@ -556,6 +556,22 @@ or \*(Dc\*0\*$\*r\*(Pt\*s\*(ST for invalid requests. +. +.IP \\*(Dc\\*+\\*q\\*(Pt\\*s\\*(ST +Request Termcap/Terminfo String (xterm, experimental). +The string following the "q" is a list of names +encoded in hexadecimal (2 digits per character) +separated by \*; +which correspond to termcap or terminfo key names. +.br +\fIxterm\fP responds with +\*(Dc\*1\*+\*r\*(Pt\*s\*(ST +for valid requests, adding to \*(Pt an \*=, +and the value of the corresponding string that xterm would send, +or +\*(Dc\*0\*+\*r\*(Pt\*s\*(ST +for invalid requests. +The strings are encoded in hexadecimal (2 digits per character). .Ed .\" .St Index: xc/extras/Mesa/README.XF86 diff -u /dev/null xc/extras/Mesa/README.XF86:1.1 --- /dev/null Mon Dec 18 14:21:34 2000 +++ xc/extras/Mesa/README.XF86 Thu Nov 30 10:46:25 2000 @@ -0,0 +1,47 @@ +Importing Mesa. + +Mesa should be imported from a tree checked out from the Mesa CVS +repository (:pserver:anonymous@cvs.mesa3d.sourceforge.net:/cvsroot/mesa3d). + +Instructions for importing a tagged Mesa release X.Y. + +1. Check out the release version from the Mesa CVS repository: + + % cvs -d :pserver:anonymous@cvs.mesa3d.sourceforge.net:/cvsroot/mesa3d \ + -r mesa_X_Y Mesa + +2. Remove the CVSROOT directory: + + % cd Mesa + % rm -fr CVSROOT + +3. Remove the CVS admin directories: + + % find . -name CVS -print | xargs rm -fr + +4. Import: + + % cvs import -m "Mesa version X.Y" xc/extras/Mesa MESA MESA-X_Y + +5. Merge: + + % cvs co -j MESA_PREV -j MESA-X_Y xc/extras/Mesa + + resolve conflicts, and commit. + +6. Check for new files that are GPL'd or which were in directories + previously removed. Remove them from the main branch. + + + + +When importing a snapshot of a Mesa (stable) branch, do everything as above, +except check out the branch with: + + % cvs -d :pserver:anonymous@cvs.mesa3d.sourceforge.net:/cvsroot/mesa3d \ + -r mesa_X_Y_branch Mesa + +and import with the tag MESA-X_Y-yyyymmdd indicating the date of the snapshot. + + +$XFree86: xc/extras/Mesa/README.XF86,v 1.1 2000/11/30 15:46:25 dawes Exp $ Index: xc/extras/Mesa/include/GL/gl.h diff -u xc/extras/Mesa/include/GL/gl.h:1.4 xc/extras/Mesa/include/GL/gl.h:1.7 --- xc/extras/Mesa/include/GL/gl.h:1.4 Fri Jun 16 20:02:04 2000 +++ xc/extras/Mesa/include/GL/gl.h Sun Sep 24 09:50:05 2000 @@ -1,7 +1,7 @@ /* * Mesa 3-D graphics library - * Version: 3.3 + * Version: 3.4 * * Copyright (C) 1999-2000 Brian Paul All Rights Reserved. * @@ -22,6 +22,7 @@ * 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. */ +/* $XFree86: xc/extras/Mesa/include/GL/gl.h,v 1.7 2000/09/24 13:50:05 alanh Exp $ */ #ifndef __gl_h_ @@ -43,11 +44,11 @@ #define OPENSTEP #endif -#if defined(_WIN32) && !defined(__WIN32__) +#if defined(_WIN32) && !defined(__WIN32__) && !defined(__CYGWIN__) #define __WIN32__ #endif -#if !defined(OPENSTEP) && (defined(__WIN32__) || defined(__CYGWIN__)) +#if !defined(OPENSTEP) && (defined(__WIN32__) && !defined(__CYGWIN__)) # if defined(_MSC_VER) && defined(BUILD_GL32) /* tag specify we're building mesa as a DLL */ # define GLAPI __declspec(dllexport) # elif defined(_MSC_VER) && defined(_DLL) /* tag specifying we're building for DLL runtime support */ @@ -62,7 +63,7 @@ # define GLAPIENTRY #endif /* WIN32 / CYGWIN bracket */ -#if defined(_WIN32) && !defined(_WINGDI_) && !defined(_GNU_H_WINDOWS32_DEFINES) && !defined(OPENSTEP) +#if defined(_WIN32) && !defined(_WINGDI_) && !defined(__CYGWIN__) && !defined(_GNU_H_WINDOWS32_DEFINES) && !defined(OPENSTEP) #include #endif @@ -850,7 +851,7 @@ #define GL_CLIENT_PIXEL_STORE_BIT 0x00000001 #define GL_CLIENT_VERTEX_ARRAY_BIT 0x00000002 -#define GL_CLIENT_ALL_ATTRIB_BITS 0xFFFFFFFF +#define GL_ALL_CLIENT_ATTRIB_BITS 0xFFFFFFFF Index: xc/extras/Mesa/include/GL/glext.h diff -u xc/extras/Mesa/include/GL/glext.h:1.2 xc/extras/Mesa/include/GL/glext.h:1.5 --- xc/extras/Mesa/include/GL/glext.h:1.2 Fri Jun 16 20:02:05 2000 +++ xc/extras/Mesa/include/GL/glext.h Mon Nov 13 18:30:39 2000 @@ -2712,6 +2712,12 @@ extern void APIENTRY glFinalCombinerInputNV (GLenum, GLenum, GLenum, GLenum); extern void APIENTRY glGetCombinerInputParameterfvNV (GLenum, GLenum, GLenum, GLenum, GLfloat *); extern void APIENTRY glGetCombinerInputParameterivNV (GLenum, GLenum, GLenum, GLenum, GLint *); +#ifdef VMS + #define glGetCombinerOutputParameterfvNV glGetCombinerOutputParameterfvN + #define glGetCombinerOutputParameterivNV glGetCombinerOutputParameterivN + #define glGetFinalCombinerInputParameterfvNV glGetFinalCombinerInputParafvNV + #define glGetFinalCombinerInputParameterivNV glGetFinalCombinerInputParaivNV +#endif extern void APIENTRY glGetCombinerOutputParameterfvNV (GLenum, GLenum, GLenum, GLfloat *); extern void APIENTRY glGetCombinerOutputParameterivNV (GLenum, GLenum, GLenum, GLint *); extern void APIENTRY glGetFinalCombinerInputParameterfvNV (GLenum, GLenum, GLfloat *); Index: xc/extras/Mesa/include/GL/xmesa.h diff -u xc/extras/Mesa/include/GL/xmesa.h:1.3 xc/extras/Mesa/include/GL/xmesa.h:1.4 --- xc/extras/Mesa/include/GL/xmesa.h:1.3 Fri Jun 16 20:02:05 2000 +++ xc/extras/Mesa/include/GL/xmesa.h Mon Nov 13 16:55:31 2000 @@ -1,4 +1,3 @@ - /* * Mesa 3-D graphics library * Version: 3.3 @@ -88,7 +87,7 @@ #define XMESA_MAJOR_VERSION 3 -#define XMESA_MINOR_VERSION 3 +#define XMESA_MINOR_VERSION 4 Index: xc/extras/Mesa/include/GL/xmesa_xf86.h diff -u xc/extras/Mesa/include/GL/xmesa_xf86.h:1.4 xc/extras/Mesa/include/GL/xmesa_xf86.h:1.5 --- xc/extras/Mesa/include/GL/xmesa_xf86.h:1.4 Fri Mar 3 11:02:10 2000 +++ xc/extras/Mesa/include/GL/xmesa_xf86.h Mon Nov 13 18:30:39 2000 @@ -25,7 +25,6 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. **************************************************************************/ -/* $XFree86: xc/extras/Mesa/include/GL/xmesa_xf86.h,v 1.4 2000/03/03 16:02:10 tsi Exp $ */ /* * Authors: Index: xc/extras/Mesa/src/aatritemp.h diff -u xc/extras/Mesa/src/aatritemp.h:1.1 xc/extras/Mesa/src/aatritemp.h:1.2 --- xc/extras/Mesa/src/aatritemp.h:1.1 Fri Jun 16 20:02:06 2000 +++ xc/extras/Mesa/src/aatritemp.h Mon Nov 13 18:30:40 2000 @@ -303,24 +303,24 @@ #ifdef DO_STUV1 # ifdef DO_SPEC gl_write_multitexture_span(ctx, 2, n, startX, iy, z, - (const GLfloat (*)[MAX_WIDTH]) s, - (const GLfloat (*)[MAX_WIDTH]) t, - (const GLfloat (*)[MAX_WIDTH]) u, + (CONST GLfloat (*)[MAX_WIDTH]) s, + (CONST GLfloat (*)[MAX_WIDTH]) t, + (CONST GLfloat (*)[MAX_WIDTH]) u, (GLfloat (*)[MAX_WIDTH]) lambda, - rgba, (const GLubyte (*)[4]) spec, + rgba, (CONST GLubyte (*)[4]) spec, GL_POLYGON); # else gl_write_multitexture_span(ctx, 2, n, startX, iy, z, - (const GLfloat (*)[MAX_WIDTH]) s, - (const GLfloat (*)[MAX_WIDTH]) t, - (const GLfloat (*)[MAX_WIDTH]) u, + (CONST GLfloat (*)[MAX_WIDTH]) s, + (CONST GLfloat (*)[MAX_WIDTH]) t, + (CONST GLfloat (*)[MAX_WIDTH]) u, lambda, rgba, NULL, GL_POLYGON); # endif #elif defined(DO_STUV0) # ifdef DO_SPEC gl_write_texture_span(ctx, n, startX, iy, z, s[0], t[0], u[0], lambda[0], rgba, - (const GLubyte (*)[4]) spec, GL_POLYGON); + (CONST GLubyte (*)[4]) spec, GL_POLYGON); # else gl_write_texture_span(ctx, n, startX, iy, z, s[0], t[0], u[0], lambda[0], @@ -408,7 +408,7 @@ left = ix + 1; #ifdef DO_STUV1 { - int j; + GLuint j; for (j = 0; j < n; j++) { s[0][j] = s[0][j + left]; t[0][j] = t[0][j + left]; @@ -422,17 +422,17 @@ } # ifdef DO_SPEC gl_write_multitexture_span(ctx, 2, n, left, iy, z + left, - (const GLfloat (*)[MAX_WIDTH]) s, - (const GLfloat (*)[MAX_WIDTH]) t, - (const GLfloat (*)[MAX_WIDTH]) u, + (CONST GLfloat (*)[MAX_WIDTH]) s, + (CONST GLfloat (*)[MAX_WIDTH]) t, + (CONST GLfloat (*)[MAX_WIDTH]) u, lambda, rgba + left, - (const GLubyte (*)[4]) (spec + left), + (CONST GLubyte (*)[4]) (spec + left), GL_POLYGON); # else gl_write_multitexture_span(ctx, 2, n, left, iy, z + left, - (const GLfloat (*)[MAX_WIDTH]) s, - (const GLfloat (*)[MAX_WIDTH]) t, - (const GLfloat (*)[MAX_WIDTH]) u, + (CONST GLfloat (*)[MAX_WIDTH]) s, + (CONST GLfloat (*)[MAX_WIDTH]) t, + (CONST GLfloat (*)[MAX_WIDTH]) u, lambda, rgba + left, NULL, GL_POLYGON); # endif @@ -441,7 +441,7 @@ gl_write_texture_span(ctx, n, left, iy, z + left, s[0] + left, t[0] + left, u[0] + left, lambda[0] + left, rgba + left, - (const GLubyte (*)[4]) (spec + left), + (CONST GLubyte (*)[4]) (spec + left), GL_POLYGON); # else gl_write_texture_span(ctx, n, left, iy, z + left, Index: xc/extras/Mesa/src/accum.c diff -u xc/extras/Mesa/src/accum.c:1.5 xc/extras/Mesa/src/accum.c:1.9 --- xc/extras/Mesa/src/accum.c:1.5 Tue Jun 20 01:08:17 2000 +++ xc/extras/Mesa/src/accum.c Mon Nov 13 18:30:40 2000 @@ -1,7 +1,7 @@ /* * Mesa 3-D graphics library - * Version: 3.3 + * Version: 3.4 * * Copyright (C) 1999-2000 Brian Paul All Rights Reserved. * @@ -234,6 +234,8 @@ if (ctx->IntegerAccumMode && value != ctx->IntegerAccumScaler) rescale_accum(ctx); + RENDER_START(ctx); + if (ctx->IntegerAccumMode) { /* simply add integer color values into accum buffer */ GLuint j; @@ -277,6 +279,7 @@ /* restore read buffer = draw buffer (the default) */ (*ctx->Driver.SetReadBuffer)( ctx, ctx->DrawBuffer, ctx->Color.DriverDrawBuffer ); + RENDER_FINISH(ctx); break; case GL_LOAD: @@ -297,6 +300,7 @@ ctx->IntegerAccumScaler = 0.0; } + RENDER_START(ctx); if (ctx->IntegerAccumMode) { /* just copy values into accum buffer */ GLuint j; @@ -340,6 +344,7 @@ /* restore read buffer = draw buffer (the default) */ (*ctx->Driver.SetReadBuffer)( ctx, ctx->DrawBuffer, ctx->Color.DriverDrawBuffer ); + RENDER_FINISH(ctx); break; case GL_RETURN: @@ -347,17 +352,18 @@ if (ctx->IntegerAccumMode && value != 1.0) rescale_accum(ctx); + RENDER_START(ctx); if (ctx->IntegerAccumMode && ctx->IntegerAccumScaler > 0) { /* build lookup table to avoid many floating point multiplies */ const GLfloat mult = ctx->IntegerAccumScaler; static GLchan multTable[32768]; static GLfloat prevMult = 0.0; GLuint j; - const GLint max = (GLint) (256 / mult); + GLint k; + const GLint max = MIN2((GLuint) (256 / mult), 32767); if (mult != prevMult) { - assert(max <= 32768); - for (j = 0; j < max; j++) - multTable[j] = (GLint) ((GLfloat) j * mult + 0.5F); + for (k = 0; k < max; k++) + multTable[k] = (GLint) ((GLfloat) k * mult + 0.5F); prevMult = mult; } @@ -380,7 +386,7 @@ _mesa_mask_rgba_span( ctx, width, xpos, ypos, rgba ); } (*ctx->Driver.WriteRGBASpan)( ctx, width, xpos, ypos, - (const GLubyte (*)[4])rgba, NULL ); + (CONST GLubyte (*)[4]) rgba, NULL ); ypos++; } } @@ -407,10 +413,11 @@ _mesa_mask_rgba_span( ctx, width, xpos, ypos, rgba ); } (*ctx->Driver.WriteRGBASpan)( ctx, width, xpos, ypos, - (const GLubyte (*)[4])rgba, NULL ); + (CONST GLubyte (*)[4]) rgba, NULL ); ypos++; } } + RENDER_FINISH(ctx); break; default: Index: xc/extras/Mesa/src/attrib.c diff -u xc/extras/Mesa/src/attrib.c:1.4 xc/extras/Mesa/src/attrib.c:1.8 --- xc/extras/Mesa/src/attrib.c:1.4 Fri Jun 16 20:02:07 2000 +++ xc/extras/Mesa/src/attrib.c Mon Nov 13 18:30:40 2000 @@ -1,7 +1,7 @@ /* * Mesa 3-D graphics library - * Version: 3.1 + * Version: 3.4 * * Copyright (C) 1999-2000 Brian Paul All Rights Reserved. * @@ -212,8 +212,8 @@ attr->RescaleNormals = ctx->Transform.RescaleNormals; attr->Scissor = ctx->Scissor.Enabled; attr->Stencil = ctx->Stencil.Enabled; - attr->Texture = ctx->Texture.Enabled; for (i=0; iTexture[i] = ctx->Texture.Unit[i].Enabled; attr->TexGen[i] = ctx->Texture.Unit[i].TexGenEnabled; } newnode = new_attrib_node( GL_ENABLE_BIT ); @@ -358,6 +358,7 @@ copy_texobj_state(&attr->Unit[u].Saved1D, attr->Unit[u].CurrentD[1]); copy_texobj_state(&attr->Unit[u].Saved2D, attr->Unit[u].CurrentD[2]); copy_texobj_state(&attr->Unit[u].Saved3D, attr->Unit[u].CurrentD[3]); + copy_texobj_state(&attr->Unit[u].SavedCubeMap, attr->Unit[u].CurrentCubeMap); } newnode = new_attrib_node( GL_TEXTURE_BIT ); newnode->data = attr; @@ -391,6 +392,148 @@ +static void +pop_enable_group(GLcontext *ctx, const struct gl_enable_attrib *enable) +{ + GLuint i; + +#define TEST_AND_UPDATE(VALUE, NEWVALUE, ENUM) \ + if ((VALUE) != (NEWVALUE)) { \ + _mesa_set_enable( ctx, ENUM, (NEWVALUE) ); \ + } + + TEST_AND_UPDATE(ctx->Color.AlphaEnabled, enable->AlphaTest, GL_ALPHA_TEST); + TEST_AND_UPDATE(ctx->Transform.Normalize, enable->AutoNormal, GL_NORMALIZE); + TEST_AND_UPDATE(ctx->Color.BlendEnabled, enable->Blend, GL_BLEND); + + for (i=0;iTransform.ClipEnabled[i] != enable->ClipPlane[i]) + _mesa_set_enable(ctx, (GLenum) (GL_CLIP_PLANE0 + i), + enable->ClipPlane[i]); + } + + TEST_AND_UPDATE(ctx->Light.ColorMaterialEnabled, enable->ColorMaterial, + GL_COLOR_MATERIAL); + TEST_AND_UPDATE(ctx->Polygon.CullFlag, enable->CullFace, GL_CULL_FACE); + TEST_AND_UPDATE(ctx->Depth.Test, enable->DepthTest, GL_DEPTH_TEST); + TEST_AND_UPDATE(ctx->Color.DitherFlag, enable->Dither, GL_DITHER); + TEST_AND_UPDATE(ctx->Pixel.Convolution1DEnabled, enable->Convolution1D, + GL_CONVOLUTION_1D); + TEST_AND_UPDATE(ctx->Pixel.Convolution2DEnabled, enable->Convolution2D, + GL_CONVOLUTION_2D); + TEST_AND_UPDATE(ctx->Pixel.Separable2DEnabled, enable->Separable2D, + GL_SEPARABLE_2D); + TEST_AND_UPDATE(ctx->Fog.Enabled, enable->Fog, GL_FOG); + TEST_AND_UPDATE(ctx->Light.Enabled, enable->Lighting, GL_LIGHTING); + TEST_AND_UPDATE(ctx->Line.SmoothFlag, enable->LineSmooth, GL_LINE_SMOOTH); + TEST_AND_UPDATE(ctx->Line.StippleFlag, enable->LineStipple, + GL_LINE_STIPPLE); + TEST_AND_UPDATE(ctx->Color.IndexLogicOpEnabled, enable->IndexLogicOp, + GL_INDEX_LOGIC_OP); + TEST_AND_UPDATE(ctx->Color.ColorLogicOpEnabled, enable->ColorLogicOp, + GL_COLOR_LOGIC_OP); + TEST_AND_UPDATE(ctx->Eval.Map1Color4, enable->Map1Color4, GL_MAP1_COLOR_4); + TEST_AND_UPDATE(ctx->Eval.Map1Index, enable->Map1Index, GL_MAP1_INDEX); + TEST_AND_UPDATE(ctx->Eval.Map1Normal, enable->Map1Normal, GL_MAP1_NORMAL); + TEST_AND_UPDATE(ctx->Eval.Map1TextureCoord1, enable->Map1TextureCoord1, + GL_MAP1_TEXTURE_COORD_1); + TEST_AND_UPDATE(ctx->Eval.Map1TextureCoord2, enable->Map1TextureCoord2, + GL_MAP1_TEXTURE_COORD_2); + TEST_AND_UPDATE(ctx->Eval.Map1TextureCoord3, enable->Map1TextureCoord3, + GL_MAP1_TEXTURE_COORD_3); + TEST_AND_UPDATE(ctx->Eval.Map1TextureCoord4, enable->Map1TextureCoord4, + GL_MAP1_TEXTURE_COORD_4); + TEST_AND_UPDATE(ctx->Eval.Map1Vertex3, enable->Map1Vertex3, + GL_MAP1_VERTEX_3); + TEST_AND_UPDATE(ctx->Eval.Map1Vertex4, enable->Map1Vertex4, + GL_MAP1_VERTEX_4); + TEST_AND_UPDATE(ctx->Eval.Map2Color4, enable->Map2Color4, GL_MAP2_COLOR_4); + TEST_AND_UPDATE(ctx->Eval.Map2Index, enable->Map2Index, GL_MAP2_INDEX); + TEST_AND_UPDATE(ctx->Eval.Map2Normal, enable->Map2Normal, GL_MAP2_NORMAL); + TEST_AND_UPDATE(ctx->Eval.Map2TextureCoord1, enable->Map2TextureCoord1, + GL_MAP2_TEXTURE_COORD_1); + TEST_AND_UPDATE(ctx->Eval.Map2TextureCoord2, enable->Map2TextureCoord2, + GL_MAP2_TEXTURE_COORD_2); + TEST_AND_UPDATE(ctx->Eval.Map2TextureCoord3, enable->Map2TextureCoord3, + GL_MAP2_TEXTURE_COORD_3); + TEST_AND_UPDATE(ctx->Eval.Map2TextureCoord4, enable->Map2TextureCoord4, + GL_MAP2_TEXTURE_COORD_4); + TEST_AND_UPDATE(ctx->Eval.Map2Vertex3, enable->Map2Vertex3, + GL_MAP2_VERTEX_3); + TEST_AND_UPDATE(ctx->Eval.Map2Vertex4, enable->Map2Vertex4, + GL_MAP2_VERTEX_4); + TEST_AND_UPDATE(ctx->Transform.Normalize, enable->Normalize, GL_NORMALIZE); + TEST_AND_UPDATE(ctx->Transform.RescaleNormals, enable->RescaleNormals, + GL_RESCALE_NORMAL_EXT); + TEST_AND_UPDATE(ctx->Pixel.PixelTextureEnabled, enable->PixelTexture, + GL_POINT_SMOOTH); + TEST_AND_UPDATE(ctx->Point.SmoothFlag, enable->PointSmooth, + GL_POINT_SMOOTH); + TEST_AND_UPDATE(ctx->Polygon.OffsetPoint, enable->PolygonOffsetPoint, + GL_POLYGON_OFFSET_POINT); + TEST_AND_UPDATE(ctx->Polygon.OffsetLine, enable->PolygonOffsetLine, + GL_POLYGON_OFFSET_LINE); + TEST_AND_UPDATE(ctx->Polygon.OffsetFill, enable->PolygonOffsetFill, + GL_POLYGON_OFFSET_FILL); + TEST_AND_UPDATE(ctx->Polygon.SmoothFlag, enable->PolygonSmooth, + GL_POLYGON_SMOOTH); + TEST_AND_UPDATE(ctx->Polygon.StippleFlag, enable->PolygonStipple, + GL_POLYGON_STIPPLE); + TEST_AND_UPDATE(ctx->Scissor.Enabled, enable->Scissor, GL_SCISSOR_TEST); + TEST_AND_UPDATE(ctx->Stencil.Enabled, enable->Stencil, GL_STENCIL_TEST); +#undef TEST_AND_UPDATE + + /* texture unit enables */ + for (i = 0; i < ctx->Const.MaxTextureUnits; i++) { + if (ctx->Texture.Unit[i].Enabled != enable->Texture[i]) { + ctx->Texture.Unit[i].Enabled = enable->Texture[i]; + if (ctx->Driver.Enable) { + if (ctx->Driver.ActiveTexture) { + (*ctx->Driver.ActiveTexture)(ctx, i); + } + (*ctx->Driver.Enable)( ctx, GL_TEXTURE_1D, + (GLboolean) (enable->Texture[i] & TEXTURE0_1D) ); + (*ctx->Driver.Enable)( ctx, GL_TEXTURE_2D, + (GLboolean) (enable->Texture[i] & TEXTURE0_2D) ); + (*ctx->Driver.Enable)( ctx, GL_TEXTURE_3D, + (GLboolean) (enable->Texture[i] & TEXTURE0_3D) ); + } + } + + if (ctx->Texture.Unit[i].TexGenEnabled != enable->TexGen[i]) { + ctx->Texture.Unit[i].TexGenEnabled = enable->TexGen[i]; + if (ctx->Driver.Enable) { + if (ctx->Driver.ActiveTexture) { + (*ctx->Driver.ActiveTexture)(ctx, i); + } + if (enable->TexGen[i] & S_BIT) + (*ctx->Driver.Enable)( ctx, GL_TEXTURE_GEN_S, GL_TRUE); + else + (*ctx->Driver.Enable)( ctx, GL_TEXTURE_GEN_S, GL_FALSE); + if (enable->TexGen[i] & T_BIT) + (*ctx->Driver.Enable)( ctx, GL_TEXTURE_GEN_T, GL_TRUE); + else + (*ctx->Driver.Enable)( ctx, GL_TEXTURE_GEN_T, GL_FALSE); + if (enable->TexGen[i] & R_BIT) + (*ctx->Driver.Enable)( ctx, GL_TEXTURE_GEN_R, GL_TRUE); + else + (*ctx->Driver.Enable)( ctx, GL_TEXTURE_GEN_R, GL_FALSE); + if (enable->TexGen[i] & Q_BIT) + (*ctx->Driver.Enable)( ctx, GL_TEXTURE_GEN_Q, GL_TRUE); + else + (*ctx->Driver.Enable)( ctx, GL_TEXTURE_GEN_Q, GL_FALSE); + } + } + } + + if (ctx->Driver.ActiveTexture) { + (*ctx->Driver.ActiveTexture)(ctx, ctx->Texture.CurrentUnit); + } +} + + + + /* * This function is kind of long just because we have to call a lot * of device driver functions to update device driver state. @@ -473,11 +616,14 @@ break; case GL_DEPTH_BUFFER_BIT: { + GLboolean oldDepthTest = ctx->Depth.Test; GLenum oldDepthFunc = ctx->Depth.Func; GLboolean oldDepthMask = ctx->Depth.Mask; GLfloat oldDepthClear = ctx->Depth.Clear; MEMCPY( &ctx->Depth, attr->data, sizeof(struct gl_depthbuffer_attrib) ); + if (ctx->Depth.Test != oldDepthTest && ctx->Driver.Enable) + (*ctx->Driver.Enable)( ctx, GL_DEPTH_TEST, ctx->Depth.Test); if (ctx->Depth.Func != oldDepthFunc && ctx->Driver.DepthFunc) (*ctx->Driver.DepthFunc)( ctx, ctx->Depth.Func ); if (ctx->Depth.Mask != oldDepthMask && ctx->Driver.DepthMask) @@ -490,116 +636,7 @@ { const struct gl_enable_attrib *enable; enable = (const struct gl_enable_attrib *) attr->data; - -#define TEST_AND_UPDATE(VALUE, NEWVALUE, ENUM) \ - if ((VALUE) != (NEWVALUE)) { \ - _mesa_set_enable( ctx, ENUM, (NEWVALUE) ); \ - } - - TEST_AND_UPDATE(ctx->Color.AlphaEnabled, enable->AlphaTest, GL_ALPHA_TEST); - TEST_AND_UPDATE(ctx->Transform.Normalize, enable->AutoNormal, GL_NORMALIZE); - TEST_AND_UPDATE(ctx->Color.BlendEnabled, enable->Blend, GL_BLEND); - { - GLuint i; - for (i=0;iTransform.ClipEnabled[i] != enable->ClipPlane[i]) - _mesa_set_enable( ctx, (GLenum) (GL_CLIP_PLANE0 + i), enable->ClipPlane[i] ); - } - } - TEST_AND_UPDATE(ctx->Light.ColorMaterialEnabled, enable->ColorMaterial, GL_COLOR_MATERIAL); - TEST_AND_UPDATE(ctx->Polygon.CullFlag, enable->CullFace, GL_CULL_FACE); - TEST_AND_UPDATE(ctx->Depth.Test, enable->DepthTest, GL_DEPTH_TEST); - TEST_AND_UPDATE(ctx->Color.DitherFlag, enable->Dither, GL_DITHER); - TEST_AND_UPDATE(ctx->Pixel.Convolution1DEnabled, enable->Convolution1D, GL_CONVOLUTION_1D); - TEST_AND_UPDATE(ctx->Pixel.Convolution2DEnabled, enable->Convolution2D, GL_CONVOLUTION_2D); - TEST_AND_UPDATE(ctx->Pixel.Separable2DEnabled, enable->Separable2D, GL_SEPARABLE_2D); - TEST_AND_UPDATE(ctx->Fog.Enabled, enable->Fog, GL_FOG); - TEST_AND_UPDATE(ctx->Light.Enabled, enable->Lighting, GL_LIGHTING); - TEST_AND_UPDATE(ctx->Line.SmoothFlag, enable->LineSmooth, GL_LINE_SMOOTH); - TEST_AND_UPDATE(ctx->Line.StippleFlag, enable->LineStipple, GL_LINE_STIPPLE); - TEST_AND_UPDATE(ctx->Color.IndexLogicOpEnabled, enable->IndexLogicOp, GL_INDEX_LOGIC_OP); - TEST_AND_UPDATE(ctx->Color.ColorLogicOpEnabled, enable->ColorLogicOp, GL_COLOR_LOGIC_OP); - TEST_AND_UPDATE(ctx->Eval.Map1Color4, enable->Map1Color4, GL_MAP1_COLOR_4); - TEST_AND_UPDATE(ctx->Eval.Map1Index, enable->Map1Index, GL_MAP1_INDEX); - TEST_AND_UPDATE(ctx->Eval.Map1Normal, enable->Map1Normal, GL_MAP1_NORMAL); - TEST_AND_UPDATE(ctx->Eval.Map1TextureCoord1, enable->Map1TextureCoord1, GL_MAP1_TEXTURE_COORD_1); - TEST_AND_UPDATE(ctx->Eval.Map1TextureCoord2, enable->Map1TextureCoord2, GL_MAP1_TEXTURE_COORD_2); - TEST_AND_UPDATE(ctx->Eval.Map1TextureCoord3, enable->Map1TextureCoord3, GL_MAP1_TEXTURE_COORD_3); - TEST_AND_UPDATE(ctx->Eval.Map1TextureCoord4, enable->Map1TextureCoord4, GL_MAP1_TEXTURE_COORD_4); - TEST_AND_UPDATE(ctx->Eval.Map1Vertex3, enable->Map1Vertex3, GL_MAP1_VERTEX_3); - TEST_AND_UPDATE(ctx->Eval.Map1Vertex4, enable->Map1Vertex4, GL_MAP1_VERTEX_4); - TEST_AND_UPDATE(ctx->Eval.Map2Color4, enable->Map2Color4, GL_MAP2_COLOR_4); - TEST_AND_UPDATE(ctx->Eval.Map2Index, enable->Map2Index, GL_MAP2_INDEX); - TEST_AND_UPDATE(ctx->Eval.Map2Normal, enable->Map2Normal, GL_MAP2_NORMAL); - TEST_AND_UPDATE(ctx->Eval.Map2TextureCoord1, enable->Map2TextureCoord1, GL_MAP2_TEXTURE_COORD_1); - TEST_AND_UPDATE(ctx->Eval.Map2TextureCoord2, enable->Map2TextureCoord2, GL_MAP2_TEXTURE_COORD_2); - TEST_AND_UPDATE(ctx->Eval.Map2TextureCoord3, enable->Map2TextureCoord3, GL_MAP2_TEXTURE_COORD_3); - TEST_AND_UPDATE(ctx->Eval.Map2TextureCoord4, enable->Map2TextureCoord4, GL_MAP2_TEXTURE_COORD_4); - TEST_AND_UPDATE(ctx->Eval.Map2Vertex3, enable->Map2Vertex3, GL_MAP2_VERTEX_3); - TEST_AND_UPDATE(ctx->Eval.Map2Vertex4, enable->Map2Vertex4, GL_MAP2_VERTEX_4); - TEST_AND_UPDATE(ctx->Transform.Normalize, enable->Normalize, GL_NORMALIZE); - TEST_AND_UPDATE(ctx->Transform.RescaleNormals, enable->RescaleNormals, GL_RESCALE_NORMAL_EXT); - TEST_AND_UPDATE(ctx->Pixel.PixelTextureEnabled, enable->PixelTexture, GL_POINT_SMOOTH); - TEST_AND_UPDATE(ctx->Point.SmoothFlag, enable->PointSmooth, GL_POINT_SMOOTH); - TEST_AND_UPDATE(ctx->Polygon.OffsetPoint, enable->PolygonOffsetPoint, GL_POLYGON_OFFSET_POINT); - TEST_AND_UPDATE(ctx->Polygon.OffsetLine, enable->PolygonOffsetLine, GL_POLYGON_OFFSET_LINE); - TEST_AND_UPDATE(ctx->Polygon.OffsetFill, enable->PolygonOffsetFill, GL_POLYGON_OFFSET_FILL); - TEST_AND_UPDATE(ctx->Polygon.SmoothFlag, enable->PolygonSmooth, GL_POLYGON_SMOOTH); - TEST_AND_UPDATE(ctx->Polygon.StippleFlag, enable->PolygonStipple, GL_POLYGON_STIPPLE); - TEST_AND_UPDATE(ctx->Scissor.Enabled, enable->Scissor, GL_SCISSOR_TEST); - TEST_AND_UPDATE(ctx->Stencil.Enabled, enable->Stencil, GL_STENCIL_TEST); - if (ctx->Texture.Enabled != enable->Texture) { - ctx->Texture.Enabled = enable->Texture; - if (ctx->Driver.Enable) { - if (ctx->Driver.ActiveTexture) - (*ctx->Driver.ActiveTexture)( ctx, 0 ); - (*ctx->Driver.Enable)( ctx, GL_TEXTURE_1D, (GLboolean) (enable->Texture & TEXTURE0_1D) ); - (*ctx->Driver.Enable)( ctx, GL_TEXTURE_2D, (GLboolean) (enable->Texture & TEXTURE0_2D) ); - (*ctx->Driver.Enable)( ctx, GL_TEXTURE_3D, (GLboolean) (enable->Texture & TEXTURE0_3D) ); - if (ctx->Driver.ActiveTexture) - (*ctx->Driver.ActiveTexture)( ctx, 1 ); - (*ctx->Driver.Enable)( ctx, GL_TEXTURE_1D, (GLboolean) (enable->Texture & TEXTURE1_1D) ); - (*ctx->Driver.Enable)( ctx, GL_TEXTURE_2D, (GLboolean) (enable->Texture & TEXTURE1_2D) ); - (*ctx->Driver.Enable)( ctx, GL_TEXTURE_3D, (GLboolean) (enable->Texture & TEXTURE1_3D) ); - if (ctx->Driver.ActiveTexture) - (*ctx->Driver.ActiveTexture)( ctx, ctx->Texture.CurrentUnit ); - } - } -#undef TEST_AND_UPDATE - { - GLuint i; - for (i=0; iTexture.Unit[i].TexGenEnabled != enable->TexGen[i]) { - ctx->Texture.Unit[i].TexGenEnabled = enable->TexGen[i]; - - /* ctx->Enabled recalculated in state change - processing */ - - if (ctx->Driver.Enable) { - if (ctx->Driver.ActiveTexture) - (*ctx->Driver.ActiveTexture)( ctx, i ); - if (enable->TexGen[i] & S_BIT) - (*ctx->Driver.Enable)( ctx, GL_TEXTURE_GEN_S, GL_TRUE); - else - (*ctx->Driver.Enable)( ctx, GL_TEXTURE_GEN_S, GL_FALSE); - if (enable->TexGen[i] & T_BIT) - (*ctx->Driver.Enable)( ctx, GL_TEXTURE_GEN_T, GL_TRUE); - else - (*ctx->Driver.Enable)( ctx, GL_TEXTURE_GEN_T, GL_FALSE); - if (enable->TexGen[i] & R_BIT) - (*ctx->Driver.Enable)( ctx, GL_TEXTURE_GEN_R, GL_TRUE); - else - (*ctx->Driver.Enable)( ctx, GL_TEXTURE_GEN_R, GL_FALSE); - if (enable->TexGen[i] & Q_BIT) - (*ctx->Driver.Enable)( ctx, GL_TEXTURE_GEN_Q, GL_TRUE); - else - (*ctx->Driver.Enable)( ctx, GL_TEXTURE_GEN_Q, GL_FALSE); - } - } - } - if (ctx->Driver.ActiveTexture) - (*ctx->Driver.ActiveTexture)( ctx, ctx->Texture.CurrentUnit ); - } + pop_enable_group(ctx, enable); } break; case GL_EVAL_BIT: @@ -769,9 +806,13 @@ &(ctx->Texture.Unit[u].Saved2D) ); copy_texobj_state( ctx->Texture.Unit[u].CurrentD[3], &(ctx->Texture.Unit[u].Saved3D) ); + copy_texobj_state( ctx->Texture.Unit[u].CurrentCubeMap, + &(ctx->Texture.Unit[u].SavedCubeMap) ); + gl_put_texobj_on_dirty_list( ctx, ctx->Texture.Unit[u].CurrentD[1] ); gl_put_texobj_on_dirty_list( ctx, ctx->Texture.Unit[u].CurrentD[2] ); gl_put_texobj_on_dirty_list( ctx, ctx->Texture.Unit[u].CurrentD[3] ); + gl_put_texobj_on_dirty_list( ctx, ctx->Texture.Unit[u].CurrentCubeMap ); } } Index: xc/extras/Mesa/src/bbox.c diff -u xc/extras/Mesa/src/bbox.c:1.3 xc/extras/Mesa/src/bbox.c:1.4 --- xc/extras/Mesa/src/bbox.c:1.3 Tue Feb 15 02:12:02 2000 +++ xc/extras/Mesa/src/bbox.c Mon Nov 13 18:30:40 2000 @@ -113,7 +113,7 @@ ACC_4V( data[i], dz ); - cliptest_bounds( orMask, andMask, (const GLfloat (*)[4])data, 8 ); + cliptest_bounds( orMask, andMask, (CONST GLfloat (*)[4])data, 8 ); } static void transform_bounds2( GLubyte *orMask, GLubyte *andMask, @@ -147,7 +147,7 @@ ACC_4V( data[2], dy ); ACC_4V( data[3], dy ); - cliptest_bounds( orMask, andMask, (const GLfloat (*)[4])data, 4 ); + cliptest_bounds( orMask, andMask, (CONST GLfloat (*)[4])data, 4 ); } /* Dummy Index: xc/extras/Mesa/src/bitmap.c diff -u xc/extras/Mesa/src/bitmap.c:1.5 xc/extras/Mesa/src/bitmap.c:1.6 --- xc/extras/Mesa/src/bitmap.c:1.5 Fri Jun 16 20:02:07 2000 +++ xc/extras/Mesa/src/bitmap.c Mon Nov 13 16:55:32 2000 @@ -1,9 +1,9 @@ /* * Mesa 3-D graphics library - * Version: 3.3 + * Version: 3.4 * - * Copyright (C) 1999 Brian Paul All Rights Reserved. + * Copyright (C) 1999-2000 Brian Paul All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), @@ -61,6 +61,8 @@ return; /* NULL bitmap is legal, a no-op */ } + RENDER_START(ctx); + /* Set bitmap drawing color */ if (ctx->Visual->RGBAflag) { GLint r, g, b, a; @@ -127,6 +129,8 @@ } gl_flush_pb(ctx); + + RENDER_FINISH(ctx); } Index: xc/extras/Mesa/src/blend.c diff -u xc/extras/Mesa/src/blend.c:1.5 xc/extras/Mesa/src/blend.c:1.9 --- xc/extras/Mesa/src/blend.c:1.5 Fri Jun 16 20:02:07 2000 +++ xc/extras/Mesa/src/blend.c Mon Nov 13 18:30:40 2000 @@ -1,20 +1,20 @@ /* * Mesa 3-D graphics library - * Version: 3.3 - * - * Copyright (C) 1999 Brian Paul All Rights Reserved. - * + * Version: 3.4 + * + * Copyright (C) 1999-2000 Brian Paul All Rights Reserved. + * * 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 @@ -288,7 +288,7 @@ ctx->Color.BlendFunc = NULL; ctx->NewState |= NEW_RASTER_OPS; - + if (ctx->Driver.BlendEquation) ctx->Driver.BlendEquation( ctx, mode ); } @@ -338,11 +338,31 @@ /* 100% alpha, no-op */ } else { +#if 0 + /* This is pretty close, but Glean complains */ + const GLint s = CHAN_MAX - t; + const GLint r = (rgba[i][RCOMP] * t + dest[i][RCOMP] * s + 1) >> 8; + const GLint g = (rgba[i][GCOMP] * t + dest[i][GCOMP] * s + 1) >> 8; + const GLint b = (rgba[i][BCOMP] * t + dest[i][BCOMP] * s + 1) >> 8; + const GLint a = (rgba[i][ACOMP] * t + dest[i][ACOMP] * s + 1) >> 8; +#elif 0 + /* This is slower but satisfies Glean */ + const GLint s = CHAN_MAX - t; + const GLint r = (rgba[i][RCOMP] * t + dest[i][RCOMP] * s) / 255; + const GLint g = (rgba[i][GCOMP] * t + dest[i][GCOMP] * s) / 255; + const GLint b = (rgba[i][BCOMP] * t + dest[i][BCOMP] * s) / 255; + const GLint a = (rgba[i][ACOMP] * t + dest[i][ACOMP] * s) / 255; +#else + /* This satisfies Glean and should be reasonably fast */ + /* Contributed by Nathan Hand */ +#define DIV255(X) (((X) << 8) + (X) + 256) >> 16 const GLint s = CHAN_MAX - t; - const GLint r = (rgba[i][RCOMP] * t + dest[i][RCOMP] * s) >> 8; - const GLint g = (rgba[i][GCOMP] * t + dest[i][GCOMP] * s) >> 8; - const GLint b = (rgba[i][BCOMP] * t + dest[i][BCOMP] * s) >> 8; - const GLint a = (rgba[i][ACOMP] * t + dest[i][ACOMP] * s) >> 8; + const GLint r = DIV255(rgba[i][RCOMP] * t + dest[i][RCOMP] * s); + const GLint g = DIV255(rgba[i][GCOMP] * t + dest[i][GCOMP] * s); + const GLint b = DIV255(rgba[i][BCOMP] * t + dest[i][BCOMP] * s); + const GLint a = DIV255(rgba[i][ACOMP] * t + dest[i][ACOMP] * s); +#undef DIV255 +#endif ASSERT(r <= CHAN_MAX); ASSERT(g <= CHAN_MAX); ASSERT(b <= CHAN_MAX); @@ -663,7 +683,7 @@ dR = dG = dB = ctx->Color.BlendColor[3]; break; case GL_ONE_MINUS_CONSTANT_ALPHA: - dR = dG = dB = 1.0F - ctx->Color.BlendColor[3] * ascale; + dR = dG = dB = 1.0F - ctx->Color.BlendColor[3]; break; case GL_DST_COLOR: /* GL_NV_blend_square */ dR = (GLfloat) Rd * rscale; @@ -717,7 +737,7 @@ dA = ctx->Color.BlendColor[3]; break; case GL_ONE_MINUS_CONSTANT_ALPHA: - dA = 1.0F - ctx->Color.BlendColor[3] * ascale; + dA = 1.0F - ctx->Color.BlendColor[3]; break; case GL_DST_COLOR: /* GL_NV_blend_square */ dA = (GLfloat) Ad * ascale; @@ -754,22 +774,22 @@ /* compute blended color */ if (ctx->Color.BlendEquation==GL_FUNC_ADD_EXT) { - r = Rs * sR + Rd * dR; - g = Gs * sG + Gd * dG; - b = Bs * sB + Bd * dB; - a = As * sA + Ad * dA; + r = Rs * sR + Rd * dR + 0.5F; + g = Gs * sG + Gd * dG + 0.5F; + b = Bs * sB + Bd * dB + 0.5F; + a = As * sA + Ad * dA + 0.5F; } else if (ctx->Color.BlendEquation==GL_FUNC_SUBTRACT_EXT) { - r = Rs * sR - Rd * dR; - g = Gs * sG - Gd * dG; - b = Bs * sB - Bd * dB; - a = As * sA - Ad * dA; + r = Rs * sR - Rd * dR + 0.5F; + g = Gs * sG - Gd * dG + 0.5F; + b = Bs * sB - Bd * dB + 0.5F; + a = As * sA - Ad * dA + 0.5F; } else if (ctx->Color.BlendEquation==GL_FUNC_REVERSE_SUBTRACT_EXT) { - r = Rd * dR - Rs * sR; - g = Gd * dG - Gs * sG; - b = Bd * dB - Bs * sB; - a = Ad * dA - As * sA; + r = Rd * dR - Rs * sR + 0.5F; + g = Gd * dG - Gs * sG + 0.5F; + b = Bd * dB - Bs * sB + 0.5F; + a = Ad * dA - As * sA + 0.5F; } else { /* should never get here */ @@ -790,7 +810,7 @@ #if defined(USE_MMX_ASM) #include "X86/mmx.h" -#include "X86/common_x86asm.h" +#include "X86/common_x86_asm.h" #endif @@ -810,8 +830,8 @@ /* Hmm. A table here would have 12^4 == way too many entries. * Provide a hook for MMX instead. */ - if (gl_x86_cpu_features & GL_CPU_MMX) { - gl_mmx_set_blend_function (ctx); + if ( cpu_has_mmx ) { + gl_mmx_set_blend_function( ctx ); } else #endif @@ -869,7 +889,7 @@ if (!ctx->Color.BlendFunc) set_blend_function(ctx); - (*ctx->Color.BlendFunc)( ctx, n, mask, rgba, (const GLubyte (*)[4])dest ); + (*ctx->Color.BlendFunc)( ctx, n, mask, rgba, (CONST GLubyte (*)[4])dest ); } @@ -904,5 +924,5 @@ if (!ctx->Color.BlendFunc) set_blend_function(ctx); - (*ctx->Color.BlendFunc)( ctx, n, mask, rgba, (const GLubyte (*)[4])dest ); + (*ctx->Color.BlendFunc)( ctx, n, mask, rgba, (CONST GLubyte (*)[4])dest ); } Index: xc/extras/Mesa/src/buffers.c diff -u xc/extras/Mesa/src/buffers.c:1.2 xc/extras/Mesa/src/buffers.c:1.6 --- xc/extras/Mesa/src/buffers.c:1.2 Fri Jun 16 20:02:07 2000 +++ xc/extras/Mesa/src/buffers.c Mon Nov 13 18:30:40 2000 @@ -1,7 +1,7 @@ /* * Mesa 3-D graphics library - * Version: 3.3 + * Version: 3.4 * * Copyright (C) 1999-2000 Brian Paul All Rights Reserved. * @@ -151,10 +151,9 @@ const GLubyte a = (GLint) (ctx->Color.ClearColor[3] * 255.0F); GLubyte span[MAX_WIDTH][4]; GLint i; - ASSERT(ctx->Color.ColorMask[0] && - ctx->Color.ColorMask[1] && - ctx->Color.ColorMask[2] && - ctx->Color.ColorMask[3]); + + ASSERT(!ctx->Color.SWmasking); + for (i = 0; i < width; i++) { span[i][RCOMP] = r; span[i][GCOMP] = g; @@ -168,7 +167,7 @@ } else { /* Color index mode */ - ASSERT(ctx->Color.IndexMask == ~0); + ASSERT(ctx->Color.IndexMask == (GLuint) ~0); if (ctx->Visual->IndexBits == 8) { /* 8-bit clear */ GLubyte span[MAX_WIDTH]; @@ -209,15 +208,19 @@ if (bufferBit & ctx->Color.DrawDestMask) { if (bufferBit == FRONT_LEFT_BIT) { (void) (*ctx->Driver.SetDrawBuffer)( ctx, GL_FRONT_LEFT); + (void) (*ctx->Driver.SetReadBuffer)( ctx, ctx->DrawBuffer, GL_FRONT_LEFT); } else if (bufferBit == FRONT_RIGHT_BIT) { (void) (*ctx->Driver.SetDrawBuffer)( ctx, GL_FRONT_RIGHT); + (void) (*ctx->Driver.SetReadBuffer)( ctx, ctx->DrawBuffer, GL_FRONT_RIGHT); } else if (bufferBit == BACK_LEFT_BIT) { (void) (*ctx->Driver.SetDrawBuffer)( ctx, GL_BACK_LEFT); + (void) (*ctx->Driver.SetReadBuffer)( ctx, ctx->DrawBuffer, GL_BACK_LEFT); } else { (void) (*ctx->Driver.SetDrawBuffer)( ctx, GL_BACK_RIGHT); + (void) (*ctx->Driver.SetReadBuffer)( ctx, ctx->DrawBuffer, GL_BACK_RIGHT); } if (ctx->Color.SWmasking) { @@ -229,8 +232,9 @@ } } - /* restore default dest buffer */ + /* restore default read/draw buffers */ (void) (*ctx->Driver.SetDrawBuffer)( ctx, ctx->Color.DriverDrawBuffer ); + (void) (*ctx->Driver.SetReadBuffer)( ctx, ctx->ReadBuffer, ctx->Pixel.DriverReadBuffer ); } @@ -288,6 +292,8 @@ } #endif + RENDER_START(ctx); + /* do software clearing here */ if (newMask) { if (newMask & ctx->Color.DrawDestMask) clear_color_buffers(ctx); @@ -299,9 +305,11 @@ /* clear software-based alpha buffer(s) */ if ( (mask & GL_COLOR_BUFFER_BIT) && ctx->DrawBuffer->UseSoftwareAlphaBuffers - && ctx->Color.ColorMask[RCOMP]) { + && ctx->Color.ColorMask[ACOMP]) { _mesa_clear_alpha_buffers( ctx ); } + + RENDER_FINISH(ctx); #ifdef PROFILE ctx->ClearTime += gl_time() - t0; Index: xc/extras/Mesa/src/clip_funcs.h diff -u xc/extras/Mesa/src/clip_funcs.h:1.4 xc/extras/Mesa/src/clip_funcs.h:1.7 --- xc/extras/Mesa/src/clip_funcs.h:1.4 Fri Jun 16 20:02:07 2000 +++ xc/extras/Mesa/src/clip_funcs.h Mon Nov 13 18:30:41 2000 @@ -162,14 +162,18 @@ clipmask[idxPrev] |= (PLANE&CLIP_ALL_BITS); \ \ if (!NEGATIVE(dpPrev)) { \ + if (IND&CLIP_TAB_EDGEFLAG) { \ + if (outcount) \ + VB->EdgeFlagPtr->data[outlist[outcount-1]] &= ~2; \ + } \ outlist[outcount++] = idxPrev; \ clipmask[idxPrev] &= ~(PLANE&CLIP_ALL_BITS); \ } \ \ if (DIFFERENT_SIGNS(dp, dpPrev)) { \ - if (NEGATIVE(dp)) { \ - /* Coming back in. Avoid division by zero as we know \ - * dp != dpPrev from DIFFERENT_SIGNS, above. \ + if (NEGATIVE(dp)) { \ + /* Going out of bounds. Avoid division by zero as we \ + * know dp != dpPrev from DIFFERENT_SIGNS, above. \ */ \ GLfloat t = dp / (dp - dpPrev); \ INTERP_SZ( t, VB->ClipPtr->data, vb_free, \ @@ -177,26 +181,26 @@ interp( VB, vb_free, t, idx, idxPrev ); \ \ if (IND&CLIP_TAB_EDGEFLAG) \ - VB->EdgeFlagPtr->data[vb_free] = \ - VB->EdgeFlagPtr->data[idxPrev]; \ + VB->EdgeFlagPtr->data[vb_free] = 3; \ } else { \ - /* Going out of bounds \ + /* Coming back in. \ */ \ GLfloat t = dpPrev / (dpPrev - dp); \ - INTERP_SZ( t, VB->ClipPtr->data, vb_free, \ + INTERP_SZ( t, VB->ClipPtr->data, vb_free, \ idxPrev, idx, SIZE ); \ interp( VB, vb_free, t, idxPrev, idx ); \ \ - if (IND&CLIP_TAB_EDGEFLAG) \ - VB->EdgeFlagPtr->data[vb_free] = 3; \ + if (IND&CLIP_TAB_EDGEFLAG) { \ + VB->EdgeFlagPtr->data[vb_free] = \ + VB->EdgeFlagPtr->data[idxPrev]; \ + } \ } \ \ - if (IND&CLIP_TAB_EDGEFLAG) { \ /* Demote trailing edge to internal edge. \ */ \ - if (outcount && \ - (VB->EdgeFlagPtr->data[outlist[outcount-1]] & 0x2)) \ - VB->EdgeFlagPtr->data[outlist[outcount-1]] = 1; \ + if (IND&CLIP_TAB_EDGEFLAG) { \ + if (outcount) \ + VB->EdgeFlagPtr->data[outlist[outcount-1]] &= ~2; \ } \ \ outlist[outcount++] = vb_free; \ @@ -210,6 +214,7 @@ if (outcount < 3) \ return 0; \ \ + \ { \ GLuint *tmp = inlist; \ inlist = outlist; \ @@ -218,7 +223,6 @@ } \ } - #include "general_clip.h" if (inlist != vlist) @@ -365,6 +369,8 @@ GLuint flagI = INSIDE(dpI); if (flagJ) { + if ((IND&CLIP_TAB_EDGEFLAG) && outcount) + VB->EdgeFlagPtr->data[outlist[outcount-1]] &= ~2; outlist[outcount++] = prevj; } else { VB->ClipMask[prevj] |= CLIP_USER_BIT; @@ -392,12 +398,11 @@ VB->EdgeFlagPtr->data[vb_free] = 3; } - if (IND&CLIP_TAB_EDGEFLAG) { /* Demote trailing edge to internal edge. */ - if (outcount && - (VB->EdgeFlagPtr->data[outlist[outcount-1]] & 0x2)) - VB->EdgeFlagPtr->data[outlist[outcount-1]] = 1; + if (IND&CLIP_TAB_EDGEFLAG) { + if (outcount) + VB->EdgeFlagPtr->data[outlist[outcount-1]] &= ~2; } INTERP_SZ( t, coord, vb_free, in, out, SIZE ); Index: xc/extras/Mesa/src/colortab.c diff -u xc/extras/Mesa/src/colortab.c:1.5 xc/extras/Mesa/src/colortab.c:1.9 --- xc/extras/Mesa/src/colortab.c:1.5 Fri Jun 16 20:02:07 2000 +++ xc/extras/Mesa/src/colortab.c Thu Nov 30 10:39:02 2000 @@ -300,7 +300,8 @@ assert(table); - if (!_mesa_is_legal_format_and_type(format, type)) { + if (!_mesa_is_legal_format_and_type(format, type) || + format == GL_INTENSITY) { gl_error(ctx, GL_INVALID_ENUM, "glColorTable(format or type)"); return; } @@ -311,17 +312,27 @@ return; } - if (width < 1 || width > ctx->Const.MaxColorTableSize - || _mesa_bitcount(width) != 1) { - if (width > ctx->Const.MaxColorTableSize) - gl_error(ctx, GL_TABLE_TOO_LARGE, "glColorTable(width)"); - else + if (width < 0 || _mesa_bitcount(width) != 1) { + if (proxy) { + table->Size = 0; + table->IntFormat = (GLenum) 0; + table->Format = (GLenum) 0; + } + else { gl_error(ctx, GL_INVALID_VALUE, "glColorTable(width)"); + } + return; + } + + if (width > (GLsizei) ctx->Const.MaxColorTableSize) { if (proxy) { table->Size = 0; table->IntFormat = (GLenum) 0; table->Format = (GLenum) 0; } + else { + gl_error(ctx, GL_TABLE_TOO_LARGE, "glColorTable(width)"); + } return; } @@ -339,14 +350,14 @@ FREE(table->Table); } if (floatTable) { - GLubyte tableUB[MAX_COLOR_TABLE_SIZE * 4]; + GLfloat tempTab[MAX_COLOR_TABLE_SIZE * 4]; GLfloat *tableF; - GLuint i; + GLint i; - _mesa_unpack_ubyte_color_span(ctx, width, table->Format, - tableUB, /* dest */ + _mesa_unpack_float_color_span(ctx, width, table->Format, + tempTab, /* dest */ format, type, data, - &ctx->Unpack, GL_TRUE); + &ctx->Unpack, GL_FALSE, GL_FALSE); table->TableType = GL_FLOAT; table->Table = MALLOC(comps * width * sizeof(GLfloat)); @@ -355,50 +366,43 @@ return; } - /* Apply scale and bias and convert GLubyte values to GLfloats - * in [0, 1]. Store results in the tableF[]. - */ - rScale /= 255.0; - gScale /= 255.0; - bScale /= 255.0; - aScale /= 255.0; tableF = (GLfloat *) table->Table; switch (table->Format) { case GL_INTENSITY: for (i = 0; i < width; i++) { - tableF[i] = tableUB[i] * rScale + rBias; + tableF[i] = CLAMP(tempTab[i] * rScale + rBias, 0.0F, 1.0F); } break; case GL_LUMINANCE: for (i = 0; i < width; i++) { - tableF[i] = tableUB[i] * rScale + rBias; + tableF[i] = CLAMP(tempTab[i] * rScale + rBias, 0.0F, 1.0F); } break; case GL_ALPHA: for (i = 0; i < width; i++) { - tableF[i] = tableUB[i] * aScale + aBias; + tableF[i] = CLAMP(tempTab[i] * aScale + aBias, 0.0F, 1.0F); } break; case GL_LUMINANCE_ALPHA: for (i = 0; i < width; i++) { - tableF[i*2+0] = tableUB[i*2+0] * rScale + rBias; - tableF[i*2+1] = tableUB[i*2+1] * aScale + aBias; + tableF[i*2+0] = CLAMP(tempTab[i*2+0] * rScale + rBias, 0.0F, 1.0F); + tableF[i*2+1] = CLAMP(tempTab[i*2+1] * aScale + aBias, 0.0F, 1.0F); } break; case GL_RGB: for (i = 0; i < width; i++) { - tableF[i*3+0] = tableUB[i*3+0] * rScale + rBias; - tableF[i*3+1] = tableUB[i*3+1] * gScale + gBias; - tableF[i*3+2] = tableUB[i*3+2] * bScale + bBias; + tableF[i*3+0] = CLAMP(tempTab[i*3+0] * rScale + rBias, 0.0F, 1.0F); + tableF[i*3+1] = CLAMP(tempTab[i*3+1] * gScale + gBias, 0.0F, 1.0F); + tableF[i*3+2] = CLAMP(tempTab[i*3+2] * bScale + bBias, 0.0F, 1.0F); } break; case GL_RGBA: for (i = 0; i < width; i++) { - tableF[i*4+0] = tableUB[i*4+0] * rScale + rBias; - tableF[i*4+1] = tableUB[i*4+1] * gScale + gBias; - tableF[i*4+2] = tableUB[i*4+2] * bScale + bBias; - tableF[i*4+3] = tableUB[i*4+3] * aScale + aBias; + tableF[i*4+0] = CLAMP(tempTab[i*4+0] * rScale + rBias, 0.0F, 1.0F); + tableF[i*4+1] = CLAMP(tempTab[i*4+1] * gScale + gBias, 0.0F, 1.0F); + tableF[i*4+2] = CLAMP(tempTab[i*4+2] * bScale + bBias, 0.0F, 1.0F); + tableF[i*4+3] = CLAMP(tempTab[i*4+3] * aScale + aBias, 0.0F, 1.0F); } break; default: @@ -415,9 +419,9 @@ return; } _mesa_unpack_ubyte_color_span(ctx, width, table->Format, - table->Table, /* dest */ + (GLubyte *) table->Table, /* dest */ format, type, data, - &ctx->Unpack, GL_TRUE); + &ctx->Unpack, GL_FALSE); } /* floatTable */ } /* proxy */ @@ -440,6 +444,8 @@ struct gl_texture_unit *texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit]; struct gl_texture_object *texObj = NULL; struct gl_color_table *table = NULL; + GLfloat rScale = 1.0, gScale = 1.0, bScale = 1.0, aScale = 1.0; + GLfloat rBias = 0.0, gBias = 0.0, bBias = 0.0, aBias = 0.0; GLint comps; ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx, "glColorSubTable"); @@ -462,12 +468,36 @@ break; case GL_COLOR_TABLE: table = &ctx->ColorTable; + rScale = ctx->Pixel.ColorTableScale[0]; + gScale = ctx->Pixel.ColorTableScale[1]; + bScale = ctx->Pixel.ColorTableScale[2]; + aScale = ctx->Pixel.ColorTableScale[3]; + rBias = ctx->Pixel.ColorTableBias[0]; + gBias = ctx->Pixel.ColorTableBias[1]; + bBias = ctx->Pixel.ColorTableBias[2]; + aBias = ctx->Pixel.ColorTableBias[3]; break; case GL_POST_CONVOLUTION_COLOR_TABLE: table = &ctx->PostConvolutionColorTable; + rScale = ctx->Pixel.PCCTscale[0]; + gScale = ctx->Pixel.PCCTscale[1]; + bScale = ctx->Pixel.PCCTscale[2]; + aScale = ctx->Pixel.PCCTscale[3]; + rBias = ctx->Pixel.PCCTbias[0]; + gBias = ctx->Pixel.PCCTbias[1]; + bBias = ctx->Pixel.PCCTbias[2]; + aBias = ctx->Pixel.PCCTbias[3]; break; case GL_POST_COLOR_MATRIX_COLOR_TABLE: table = &ctx->PostColorMatrixColorTable; + rScale = ctx->Pixel.PCMCTscale[0]; + gScale = ctx->Pixel.PCMCTscale[1]; + bScale = ctx->Pixel.PCMCTscale[2]; + aScale = ctx->Pixel.PCMCTscale[3]; + rBias = ctx->Pixel.PCMCTbias[0]; + gBias = ctx->Pixel.PCMCTbias[1]; + bBias = ctx->Pixel.PCMCTbias[2]; + aBias = ctx->Pixel.PCMCTbias[3]; break; default: gl_error(ctx, GL_INVALID_ENUM, "glColorSubTable(target)"); @@ -476,7 +506,8 @@ assert(table); - if (!_mesa_is_legal_format_and_type(format, type)) { + if (!_mesa_is_legal_format_and_type(format, type) || + format == GL_INTENSITY) { gl_error(ctx, GL_INVALID_ENUM, "glColorSubTable(format or type)"); return; } @@ -489,7 +520,7 @@ comps = _mesa_components_in_format(table->Format); assert(comps > 0); /* error should have been caught sooner */ - if (start + count > table->Size) { + if (start + count > (GLint) table->Size) { gl_error(ctx, GL_INVALID_VALUE, "glColorSubTable(count)"); return; } @@ -502,14 +533,69 @@ if (table->TableType == GL_UNSIGNED_BYTE) { GLubyte *dest = (GLubyte *) table->Table + start * comps * sizeof(GLubyte); _mesa_unpack_ubyte_color_span(ctx, count, table->Format, dest, - format, type, data, &ctx->Unpack, GL_TRUE); + format, type, data, &ctx->Unpack, GL_FALSE); } else { - GLfloat *dest = (GLfloat *) table->Table + start * comps * sizeof(GLfloat); + GLfloat tempTab[MAX_COLOR_TABLE_SIZE * 4]; + GLfloat *tableF; + GLint i; + ASSERT(table->TableType == GL_FLOAT); - _mesa_unpack_float_color_span(ctx, count, table->Format, dest, - format, type, data, &ctx->Unpack, - GL_FALSE, GL_TRUE); + + _mesa_unpack_float_color_span(ctx, count, table->Format, + tempTab, /* dest */ + format, type, data, + &ctx->Unpack, GL_FALSE, GL_FALSE); + + tableF = (GLfloat *) table->Table; + + switch (table->Format) { + case GL_INTENSITY: + for (i = 0; i < count; i++) { + GLuint j = start + i; + tableF[j] = CLAMP(tempTab[i] * rScale + rBias, 0.0F, 1.0F); + } + break; + case GL_LUMINANCE: + for (i = 0; i < count; i++) { + GLuint j = start + i; + tableF[j] = CLAMP(tempTab[i] * rScale + rBias, 0.0F, 1.0F); + } + break; + case GL_ALPHA: + for (i = 0; i < count; i++) { + GLuint j = start + i; + tableF[j] = CLAMP(tempTab[i] * aScale + aBias, 0.0F, 1.0F); + } + break; + case GL_LUMINANCE_ALPHA: + for (i = 0; i < count; i++) { + GLuint j = start + i; + tableF[j*2+0] = CLAMP(tempTab[i*2+0] * rScale + rBias, 0.0F, 1.0F); + tableF[j*2+1] = CLAMP(tempTab[i*2+1] * aScale + aBias, 0.0F, 1.0F); + } + break; + case GL_RGB: + for (i = 0; i < count; i++) { + GLuint j = start + i; + tableF[j*3+0] = CLAMP(tempTab[i*3+0] * rScale + rBias, 0.0F, 1.0F); + tableF[j*3+1] = CLAMP(tempTab[i*3+1] * gScale + gBias, 0.0F, 1.0F); + tableF[j*3+2] = CLAMP(tempTab[i*3+2] * bScale + bBias, 0.0F, 1.0F); + } + break; + case GL_RGBA: + for (i = 0; i < count; i++) { + GLuint j = start + i; + tableF[j*4+0] = CLAMP(tempTab[i*4+0] * rScale + rBias, 0.0F, 1.0F); + tableF[j*4+1] = CLAMP(tempTab[i*4+1] * gScale + gBias, 0.0F, 1.0F); + tableF[j*4+2] = CLAMP(tempTab[i*4+2] * bScale + bBias, 0.0F, 1.0F); + tableF[j*4+3] = CLAMP(tempTab[i*4+3] * aScale + aBias, 0.0F, 1.0F); + } + break; + default: + gl_problem(ctx, "Bad format in _mesa_ColorSubTable"); + return; + } } if (texObj || target == GL_SHARED_TEXTURE_PALETTE_EXT) { @@ -539,7 +625,9 @@ width = MAX_WIDTH; /* read the data from framebuffer */ + RENDER_START(ctx); gl_read_rgba_span( ctx, ctx->ReadBuffer, width, x, y, data ); + RENDER_FINISH(ctx); /* Restore reading from draw buffer (the default) */ (*ctx->Driver.SetReadBuffer)( ctx, ctx->DrawBuffer, @@ -568,7 +656,9 @@ width = MAX_WIDTH; /* read the data from framebuffer */ + RENDER_START(ctx); gl_read_rgba_span( ctx, ctx->ReadBuffer, width, x, y, data ); + RENDER_FINISH(ctx); /* Restore reading from draw buffer (the default) */ (*ctx->Driver.SetReadBuffer)( ctx, ctx->DrawBuffer, @@ -587,7 +677,7 @@ struct gl_texture_unit *texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit]; struct gl_color_table *table = NULL; GLubyte rgba[MAX_COLOR_TABLE_SIZE][4]; - GLint i; + GLuint i; ASSERT_OUTSIDE_BEGIN_END(ctx, "glGetColorTable"); @@ -725,10 +815,10 @@ if (table->TableType == GL_FLOAT) { const GLfloat *tableF = (const GLfloat *) table->Table; for (i = 0; i < table->Size; i++) { - rgba[i][RCOMP] = (GLint) (tableF[i*4+0] * 255.0F); - rgba[i][GCOMP] = (GLint) (tableF[i*4+1] * 255.0F); - rgba[i][BCOMP] = (GLint) (tableF[i*4+2] * 255.0F); - rgba[i][ACOMP] = (GLint) (tableF[i*4+3] * 255.0F); + rgba[i][RCOMP] = (GLint) (tableF[i*4+0] * 255.0F + 0.5F); + rgba[i][GCOMP] = (GLint) (tableF[i*4+1] * 255.0F + 0.5F); + rgba[i][BCOMP] = (GLint) (tableF[i*4+2] * 255.0F + 0.5F); + rgba[i][ACOMP] = (GLint) (tableF[i*4+3] * 255.0F + 0.5F); } } else { @@ -746,7 +836,7 @@ return; } - _mesa_pack_rgba_span(ctx, table->Size, (const GLubyte (*)[]) rgba, + _mesa_pack_rgba_span(ctx, table->Size, (CONST GLubyte (*)[4]) rgba, format, type, data, &ctx->Pack, GL_FALSE); } Index: xc/extras/Mesa/src/config.c diff -u xc/extras/Mesa/src/config.c:1.4 xc/extras/Mesa/src/config.c:1.8 --- xc/extras/Mesa/src/config.c:1.4 Thu Mar 2 11:07:02 2000 +++ xc/extras/Mesa/src/config.c Mon Nov 13 18:30:41 2000 @@ -1,7 +1,7 @@ /* * Mesa 3-D graphics library - * Version: 3.3 + * Version: 3.4 * * Copyright (C) 1999-2000 Brian Paul All Rights Reserved. * @@ -403,7 +403,7 @@ { const char *default_config = "mesa3.1beta1"; -#if defined(__WIN32__) || defined(__MSDOS__) +#if (defined(__WIN32__) && !defined(__CYGWIN__)) || defined(__MSDOS__) const char *filename = "mesa.cnf"; #else const char *filename = "/etc/mesa.conf"; @@ -446,8 +446,10 @@ if (!run_init( ctx, default_config, list )) { - fprintf(stderr, "No default configuration '%s' in init file\n", - default_config); + if (getenv("MESA_DEBUG")) { + fprintf(stderr, "No default configuration '%s' in init file\n", + default_config); + } } free_list( list ); Index: xc/extras/Mesa/src/config.h diff -u xc/extras/Mesa/src/config.h:1.5 xc/extras/Mesa/src/config.h:1.8 --- xc/extras/Mesa/src/config.h:1.5 Fri Jun 16 20:02:07 2000 +++ xc/extras/Mesa/src/config.h Mon Nov 13 18:30:41 2000 @@ -104,8 +104,8 @@ /* Number of texture units - GL_ARB_multitexture */ #define MAX_TEXTURE_UNITS 2 -/* Maximum viewport size: */ -#define MAX_WIDTH 1600 +/* Maximum viewport/image size: */ +#define MAX_WIDTH 2048 #define MAX_HEIGHT 1200 /* Maxmimum size for CVA. May be overridden by the drivers. */ Index: xc/extras/Mesa/src/context.c diff -u xc/extras/Mesa/src/context.c:1.4 xc/extras/Mesa/src/context.c:1.9 --- xc/extras/Mesa/src/context.c:1.4 Fri Jun 16 20:02:08 2000 +++ xc/extras/Mesa/src/context.c Thu Nov 30 10:39:02 2000 @@ -1,7 +1,7 @@ /* * Mesa 3-D graphics library - * Version: 3.3 + * Version: 3.4 * * Copyright (C) 1999-2000 Brian Paul All Rights Reserved. * @@ -210,10 +210,11 @@ if (depthBits == 0) { /* Special case. Even if we don't have a depth buffer we need - * good values for DepthMax for Z vertex transformation purposes. + * good values for DepthMax for Z vertex transformation purposes + * and for per-fragment fog computation. */ - vis->DepthMax = 1; - vis->DepthMaxF = 1.0F; + vis->DepthMax = 1 << 16; + vis->DepthMaxF = (GLfloat) vis->DepthMax; } else if (depthBits < 32) { vis->DepthMax = (1 << depthBits) - 1; @@ -411,10 +412,10 @@ _mesa_init_fog(); _mesa_init_math(); gl_init_lists(); - gl_init_shade(); gl_init_texture(); gl_init_transformation(); gl_init_translate(); + gl_init_shade(); gl_init_vbrender(); gl_init_vbxform(); gl_init_vertices(); @@ -451,9 +452,13 @@ if (!ss) return NULL; - ss->DisplayList = _mesa_NewHashTable(); + _glthread_INIT_MUTEX(ss->Mutex); + ss->DisplayList = _mesa_NewHashTable(); ss->TexObjects = _mesa_NewHashTable(); +#ifdef VAO + ss->ArrayObjects = _mesa_NewHashTable(); +#endif /* Default Texture objects */ outOfMemory = GL_FALSE; @@ -592,13 +597,37 @@ { struct gl_texture_unit *texUnit = &ctx->Texture.Unit[unit]; + texUnit->Enabled = 0; + texUnit->ReallyEnabled = 0; texUnit->EnvMode = GL_MODULATE; + texUnit->CombineModeRGB = GL_MODULATE; + texUnit->CombineModeA = GL_MODULATE; + texUnit->CombineSourceRGB[0] = GL_TEXTURE; + texUnit->CombineSourceRGB[1] = GL_PREVIOUS_EXT; + texUnit->CombineSourceRGB[2] = GL_CONSTANT_EXT; + texUnit->CombineSourceA[0] = GL_TEXTURE; + texUnit->CombineSourceA[1] = GL_PREVIOUS_EXT; + texUnit->CombineSourceA[2] = GL_CONSTANT_EXT; + texUnit->CombineOperandRGB[0] = GL_SRC_COLOR; + texUnit->CombineOperandRGB[1] = GL_SRC_COLOR; + texUnit->CombineOperandRGB[2] = GL_SRC_ALPHA; + texUnit->CombineOperandA[0] = GL_SRC_ALPHA; + texUnit->CombineOperandA[1] = GL_SRC_ALPHA; + texUnit->CombineOperandA[2] = GL_SRC_ALPHA; + texUnit->CombineScaleShiftRGB = 0; + texUnit->CombineScaleShiftA = 0; + ASSIGN_4V( texUnit->EnvColor, 0.0, 0.0, 0.0, 0.0 ); texUnit->TexGenEnabled = 0; texUnit->GenModeS = GL_EYE_LINEAR; texUnit->GenModeT = GL_EYE_LINEAR; texUnit->GenModeR = GL_EYE_LINEAR; texUnit->GenModeQ = GL_EYE_LINEAR; + texUnit->GenBitS = TEXGEN_EYE_LINEAR; + texUnit->GenBitT = TEXGEN_EYE_LINEAR; + texUnit->GenBitR = TEXGEN_EYE_LINEAR; + texUnit->GenBitQ = TEXGEN_EYE_LINEAR; + /* Yes, these plane coefficients are correct! */ ASSIGN_4V( texUnit->ObjectPlaneS, 1.0, 0.0, 0.0, 0.0 ); ASSIGN_4V( texUnit->ObjectPlaneT, 0.0, 1.0, 0.0, 0.0 ); @@ -762,10 +791,11 @@ } /* Texture matrix */ - for (i=0; iTextureMatrix[i] ); ctx->TextureStackDepth[i] = 0; for (j = 0; j < MAX_TEXTURE_STACK_DEPTH - 1; j++) { + gl_matrix_ctr( &ctx->TextureStack[i][j] ); ctx->TextureStack[i][j].inv = 0; } } @@ -987,6 +1017,11 @@ ctx->ShineTable[i]->refcount++; } + gl_compute_shine_table( ctx, 0, ctx->Light.Material[0].Shininess ); + gl_compute_shine_table( ctx, 2, ctx->Light.Material[0].Shininess * .5 ); + gl_compute_shine_table( ctx, 1, ctx->Light.Material[1].Shininess ); + gl_compute_shine_table( ctx, 3, ctx->Light.Material[1].Shininess * .5 ); + /* Line group */ ctx->Line.SmoothFlag = GL_FALSE; @@ -1049,6 +1084,10 @@ ASSIGN_4V(ctx->Pixel.PostColorMatrixBias, 0.0, 0.0, 0.0, 0.0); ASSIGN_4V(ctx->Pixel.ColorTableScale, 1.0, 1.0, 1.0, 1.0); ASSIGN_4V(ctx->Pixel.ColorTableBias, 0.0, 0.0, 0.0, 0.0); + ASSIGN_4V(ctx->Pixel.PCCTscale, 1.0, 1.0, 1.0, 1.0); + ASSIGN_4V(ctx->Pixel.PCCTbias, 0.0, 0.0, 0.0, 0.0); + ASSIGN_4V(ctx->Pixel.PCMCTscale, 1.0, 1.0, 1.0, 1.0); + ASSIGN_4V(ctx->Pixel.PCMCTbias, 0.0, 0.0, 0.0, 0.0); ctx->Pixel.ColorTableEnabled = GL_FALSE; ctx->Pixel.PostConvolutionColorTableEnabled = GL_FALSE; ctx->Pixel.PostColorMatrixColorTableEnabled = GL_FALSE; @@ -1066,6 +1105,7 @@ /* Point group */ ctx->Point.SmoothFlag = GL_FALSE; + ctx->Point.UserSize = 1.0; ctx->Point.Size = 1.0; ctx->Point.Params[0] = 1.0; ctx->Point.Params[1] = 0.0; @@ -1115,9 +1155,10 @@ /* Texture group */ ctx->Texture.CurrentUnit = 0; /* multitexture */ ctx->Texture.CurrentTransformUnit = 0; /* multitexture */ - ctx->Texture.Enabled = 0; + ctx->Texture.ReallyEnabled = 0; for (i=0; iTexture.SharedPalette = GL_FALSE; _mesa_init_colortable(&ctx->Texture.Palette); /* Transformation group */ @@ -1150,6 +1191,13 @@ ctx->Viewport.WindowMap.type = MATRIX_3D_NO_ROT; /* Vertex arrays */ +#ifdef VAO + { + struct gl_array_object *arrayObj; + arrayObj = _mesa_alloc_vertex_array_object(ctx, 0); + ctx->Array.Current = arrayObj; + } +#else ctx->Array.Vertex.Size = 4; ctx->Array.Vertex.Type = GL_FLOAT; ctx->Array.Vertex.Stride = 0; @@ -1185,6 +1233,7 @@ ctx->Array.EdgeFlag.StrideB = 0; ctx->Array.EdgeFlag.Ptr = NULL; ctx->Array.EdgeFlag.Enabled = GL_FALSE; +#endif ctx->Array.ActiveTexture = 0; /* GL_ARB_multitexture */ /* Pixel transfer */ @@ -1342,7 +1391,8 @@ /* - * Initialize a GLcontext struct. + * Initialize a GLcontext struct. This includes allocating all the + * other structs and arrays which hang off of the context by pointers. */ GLboolean _mesa_initialize_context( GLcontext *ctx, @@ -1365,15 +1415,13 @@ ctx->VB = gl_vb_create_for_immediate( ctx ); if (!ctx->VB) { - FREE( ctx ); return GL_FALSE; } ctx->input = ctx->VB->IM; ctx->PB = gl_alloc_pb(); if (!ctx->PB) { - FREE( ctx->VB ); - FREE( ctx ); + ALIGN_FREE( ctx->VB ); return GL_FALSE; } @@ -1385,9 +1433,8 @@ /* allocate new group of display lists */ ctx->Shared = alloc_shared_state(); if (!ctx->Shared) { - FREE(ctx->VB); - FREE(ctx->PB); - FREE(ctx); + ALIGN_FREE( ctx->VB ); + FREE( ctx->PB ); return GL_FALSE; } } @@ -1417,9 +1464,8 @@ if (!alloc_proxy_textures(ctx)) { free_shared_state(ctx, ctx->Shared); - FREE(ctx->VB); - FREE(ctx->PB); - FREE(ctx); + ALIGN_FREE( ctx->VB ); + FREE( ctx->PB ); return GL_FALSE; } @@ -1446,11 +1492,10 @@ ctx->Save = (struct _glapi_table *) CALLOC(dispatchSize * sizeof(void*)); if (!ctx->Exec || !ctx->Save) { free_shared_state(ctx, ctx->Shared); - FREE(ctx->VB); - FREE(ctx->PB); + ALIGN_FREE( ctx->VB ); + FREE( ctx->PB ); if (ctx->Exec) - FREE(ctx->Exec); - FREE(ctx); + FREE( ctx->Exec ); } _mesa_init_exec_table(ctx->Exec, dispatchSize); _mesa_init_dlist_table(ctx->Save, dispatchSize); @@ -1593,7 +1638,7 @@ /* Free cache of immediate buffers. */ while (ctx->nr_im_queued-- > 0) { struct immediate * next = ctx->freed_im_queue->next; - FREE( ctx->freed_im_queue ); + ALIGN_FREE( ctx->freed_im_queue ); ctx->freed_im_queue = next; } gl_extensions_dtr(ctx); @@ -1896,57 +1941,63 @@ * of the current error value. If Mesa is compiled with -DDEBUG or if the * environment variable "MESA_DEBUG" is defined then a real error message * is printed to stderr. - * Input: error - the error value - * s - a diagnostic string + * Input: ctx - the GL context + * error - the error value + * where - usually the name of function where error was detected */ -void gl_error( GLcontext *ctx, GLenum error, const char *s ) +void +gl_error( GLcontext *ctx, GLenum error, const char *where ) { + const char *debugEnv = getenv("MESA_DEBUG"); GLboolean debug; #ifdef DEBUG - debug = GL_TRUE; + if (debugEnv && strstr(debugEnv, "silent")) + debug = GL_FALSE; + else + debug = GL_TRUE; #else - if (getenv("MESA_DEBUG")) { + if (debugEnv) debug = GL_TRUE; - } - else { + else debug = GL_FALSE; - } #endif if (debug) { - char errstr[1000]; - + const char *errstr; switch (error) { case GL_NO_ERROR: - strcpy( errstr, "GL_NO_ERROR" ); + errstr = "GL_NO_ERROR"; break; case GL_INVALID_VALUE: - strcpy( errstr, "GL_INVALID_VALUE" ); + errstr = "GL_INVALID_VALUE"; break; case GL_INVALID_ENUM: - strcpy( errstr, "GL_INVALID_ENUM" ); + errstr = "GL_INVALID_ENUM"; break; case GL_INVALID_OPERATION: - strcpy( errstr, "GL_INVALID_OPERATION" ); + errstr = "GL_INVALID_OPERATION"; break; case GL_STACK_OVERFLOW: - strcpy( errstr, "GL_STACK_OVERFLOW" ); + errstr = "GL_STACK_OVERFLOW"; break; case GL_STACK_UNDERFLOW: - strcpy( errstr, "GL_STACK_UNDERFLOW" ); + errstr = "GL_STACK_UNDERFLOW"; break; case GL_OUT_OF_MEMORY: - strcpy( errstr, "GL_OUT_OF_MEMORY" ); + errstr = "GL_OUT_OF_MEMORY"; break; + case GL_TABLE_TOO_LARGE: + errstr = "GL_TABLE_TOO_LARGE"; + break; default: - strcpy( errstr, "unknown" ); + errstr = "unknown"; break; } - fprintf( stderr, "Mesa user error: %s in %s\n", errstr, s ); + fprintf(stderr, "Mesa user error: %s in %s\n", errstr, where); } - if (ctx->ErrorValue==GL_NO_ERROR) { + if (ctx->ErrorValue == GL_NO_ERROR) { ctx->ErrorValue = error; } Index: xc/extras/Mesa/src/convolve.c diff -u /dev/null xc/extras/Mesa/src/convolve.c:1.2 --- /dev/null Mon Dec 18 14:21:43 2000 +++ xc/extras/Mesa/src/convolve.c Mon Nov 13 18:30:42 2000 @@ -0,0 +1,415 @@ + +/* + * Mesa 3-D graphics library + * Version: 3.3 + * + * Copyright (C) 1999-2000 Brian Paul All Rights Reserved. + * + * 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 + * BRIAN PAUL 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. + */ + + +/* + * Image convolution functions. + * + * Notes: filter kernel elements are indexed by and as in + * the GL spec. + */ + + +#ifdef PC_HEADER +#include "all.h" +#else +#include "glheader.h" +#include "types.h" +#endif + + +void +_mesa_convolve_1d_reduce(GLint srcWidth, const GLfloat src[][4], + GLint filterWidth, const GLfloat filter[][4], + GLfloat dest[][4]) +{ + const GLint dstWidth = srcWidth - (filterWidth - 1); + GLint i, n; + + if (dstWidth <= 0) + return; /* null result */ + + for (i = 0; i < dstWidth; i++) { + GLfloat sumR = 0.0; + GLfloat sumG = 0.0; + GLfloat sumB = 0.0; + GLfloat sumA = 0.0; + for (n = 0; n < filterWidth; n++) { + sumR += src[i + n][RCOMP] * filter[n][RCOMP]; + sumG += src[i + n][GCOMP] * filter[n][GCOMP]; + sumB += src[i + n][BCOMP] * filter[n][BCOMP]; + sumA += src[i + n][ACOMP] * filter[n][ACOMP]; + } + dest[i][RCOMP] = sumR; + dest[i][GCOMP] = sumG; + dest[i][BCOMP] = sumB; + dest[i][ACOMP] = sumA; + } +} + + +void +_mesa_convolve_1d_constant(GLint srcWidth, const GLfloat src[][4], + GLint filterWidth, const GLfloat filter[][4], + const GLfloat borderColor[4], GLfloat dest[][4]) +{ + const GLint halfFilterWidth = filterWidth / 2; + GLint i, n; + + for (i = 0; i < srcWidth; i++) { + GLfloat sumR = 0.0; + GLfloat sumG = 0.0; + GLfloat sumB = 0.0; + GLfloat sumA = 0.0; + for (n = 0; n < filterWidth; n++) { + if (i + n < halfFilterWidth || i + n - halfFilterWidth >= srcWidth) { + sumR += borderColor[RCOMP] * filter[n][RCOMP]; + sumG += borderColor[GCOMP] * filter[n][GCOMP]; + sumB += borderColor[BCOMP] * filter[n][BCOMP]; + sumA += borderColor[ACOMP] * filter[n][ACOMP]; + } + else { + sumR += src[i + n - halfFilterWidth][RCOMP] * filter[n][RCOMP]; + sumG += src[i + n - halfFilterWidth][GCOMP] * filter[n][GCOMP]; + sumB += src[i + n - halfFilterWidth][BCOMP] * filter[n][BCOMP]; + sumA += src[i + n - halfFilterWidth][ACOMP] * filter[n][ACOMP]; + } + } + dest[i][RCOMP] = sumR; + dest[i][GCOMP] = sumG; + dest[i][BCOMP] = sumB; + dest[i][ACOMP] = sumA; + } +} + + +void +_mesa_convolve_1d_replicate(GLint srcWidth, const GLfloat src[][4], + GLint filterWidth, const GLfloat filter[][4], + GLfloat dest[][4]) +{ + const GLint halfFilterWidth = filterWidth / 2; + GLint i, n; + + for (i = 0; i < srcWidth; i++) { + GLfloat sumR = 0.0; + GLfloat sumG = 0.0; + GLfloat sumB = 0.0; + GLfloat sumA = 0.0; + for (n = 0; n < filterWidth; n++) { + if (i + n < halfFilterWidth) { + sumR += src[0][RCOMP] * filter[n][RCOMP]; + sumG += src[0][GCOMP] * filter[n][GCOMP]; + sumB += src[0][BCOMP] * filter[n][BCOMP]; + sumA += src[0][ACOMP] * filter[n][ACOMP]; + } + else if (i + n - halfFilterWidth >= srcWidth) { + sumR += src[srcWidth - 1][RCOMP] * filter[n][RCOMP]; + sumG += src[srcWidth - 1][GCOMP] * filter[n][GCOMP]; + sumB += src[srcWidth - 1][BCOMP] * filter[n][BCOMP]; + sumA += src[srcWidth - 1][ACOMP] * filter[n][ACOMP]; + } + else { + sumR += src[i + n - halfFilterWidth][RCOMP] * filter[n][RCOMP]; + sumG += src[i + n - halfFilterWidth][GCOMP] * filter[n][GCOMP]; + sumB += src[i + n - halfFilterWidth][BCOMP] * filter[n][BCOMP]; + sumA += src[i + n - halfFilterWidth][ACOMP] * filter[n][ACOMP]; + } + } + dest[i][RCOMP] = sumR; + dest[i][GCOMP] = sumG; + dest[i][BCOMP] = sumB; + dest[i][ACOMP] = sumA; + } +} + + +/* + * is the source image width width = srcWidth, height = filterHeight. + * has width and height . + * is a 1-D image span of width - ( - 1). + */ +void +_mesa_convolve_2d_reduce(GLint srcWidth, GLint srcHeight, + const GLfloat src[][4], + GLint filterWidth, GLint filterHeight, + const GLfloat filter[][4], + GLfloat dest[][4]) +{ + const GLint dstWidth = srcWidth - (filterWidth - 1); + GLint i, n, m; + + if (dstWidth <= 0) + return; /* null result */ + + /* XXX todo */ + for (i = 0; i < dstWidth; i++) { + GLfloat sumR = 0.0; + GLfloat sumG = 0.0; + GLfloat sumB = 0.0; + GLfloat sumA = 0.0; + for (n = 0; n < filterHeight; n++) { + for (m = 0; m < filterWidth; m++) { + const GLint k = n * srcWidth + i + m; + sumR += src[k][RCOMP] * filter[n][RCOMP]; + sumG += src[k][GCOMP] * filter[n][GCOMP]; + sumB += src[k][BCOMP] * filter[n][BCOMP]; + sumA += src[k][ACOMP] * filter[n][ACOMP]; + } + } + dest[i][RCOMP] = sumR; + dest[i][GCOMP] = sumG; + dest[i][BCOMP] = sumB; + dest[i][ACOMP] = sumA; + } +} + + +void +_mesa_convolve_2d_constant(GLint srcWidth, GLint srcHeight, + const GLfloat src[][4], + GLint filterWidth, GLint filterHeight, + const GLfloat filter[][4], + GLfloat dest[][4], + const GLfloat borderColor[4]) +{ + const GLint halfFilterWidth = filterWidth / 2; + GLint i, n, m; + + for (i = 0; i < srcWidth; i++) { + GLfloat sumR = 0.0; + GLfloat sumG = 0.0; + GLfloat sumB = 0.0; + GLfloat sumA = 0.0; + for (m = 0; m < filterHeight; m++) { + const GLfloat (*filterRow)[4] = filter + m * filterWidth; + for (n = 0; n < filterWidth; n++) { + if (i + n < halfFilterWidth || + i + n - halfFilterWidth >= srcWidth) { + sumR += borderColor[RCOMP] * filterRow[n][RCOMP]; + sumG += borderColor[GCOMP] * filterRow[n][GCOMP]; + sumB += borderColor[BCOMP] * filterRow[n][BCOMP]; + sumA += borderColor[ACOMP] * filterRow[n][ACOMP]; + } + else { + const GLint k = m * srcWidth + i + n - halfFilterWidth; + sumR += src[k][RCOMP] * filterRow[n][RCOMP]; + sumG += src[k][GCOMP] * filterRow[n][GCOMP]; + sumB += src[k][BCOMP] * filterRow[n][BCOMP]; + sumA += src[k][ACOMP] * filterRow[n][ACOMP]; + } + } + } + dest[i][RCOMP] = sumR; + dest[i][GCOMP] = sumG; + dest[i][BCOMP] = sumB; + dest[i][ACOMP] = sumA; + } +} + + +void +_mesa_convolve_2d_replicate(GLint srcWidth, GLint srcHeight, + const GLfloat src[][4], + GLint filterWidth, GLint filterHeight, + const GLfloat filter[][4], + GLfloat dest[][4]) +{ + const GLint halfFilterWidth = filterWidth / 2; + GLint i, n, m; + + for (i = 0; i < srcWidth; i++) { + GLfloat sumR = 0.0; + GLfloat sumG = 0.0; + GLfloat sumB = 0.0; + GLfloat sumA = 0.0; + for (m = 0; m < filterHeight; m++) { + const GLfloat (*filterRow)[4] = filter + m * filterWidth; + for (n = 0; n < filterWidth; n++) { + if (i + n < halfFilterWidth) { + const GLint k = m * srcWidth + 0; + sumR += src[k][RCOMP] * filterRow[n][RCOMP]; + sumG += src[k][GCOMP] * filterRow[n][GCOMP]; + sumB += src[k][BCOMP] * filterRow[n][BCOMP]; + sumA += src[k][ACOMP] * filterRow[n][ACOMP]; + } + else if (i + n - halfFilterWidth >= srcWidth) { + const GLint k = m * srcWidth + srcWidth - 1; + sumR += src[k][RCOMP] * filterRow[n][RCOMP]; + sumG += src[k][GCOMP] * filterRow[n][GCOMP]; + sumB += src[k][BCOMP] * filterRow[n][BCOMP]; + sumA += src[k][ACOMP] * filterRow[n][ACOMP]; + } + else { + const GLint k = m * srcWidth + i + n - halfFilterWidth; + sumR += src[k][RCOMP] * filterRow[n][RCOMP]; + sumG += src[k][GCOMP] * filterRow[n][GCOMP]; + sumB += src[k][BCOMP] * filterRow[n][BCOMP]; + sumA += src[k][ACOMP] * filterRow[n][ACOMP]; + } + } + } + dest[i][RCOMP] = sumR; + dest[i][GCOMP] = sumG; + dest[i][BCOMP] = sumB; + dest[i][ACOMP] = sumA; + } +} + + +void +_mesa_convolve_sep_constant(GLint srcWidth, GLint srcHeight, + const GLfloat src[][4], + GLint filterWidth, GLint filterHeight, + const GLfloat rowFilt[][4], + const GLfloat colFilt[][4], + GLfloat dest[][4], + const GLfloat borderColor[4]) +{ + const GLint halfFilterWidth = filterWidth / 2; + GLint i, n, m; + + for (i = 0; i < srcWidth; i++) { + GLfloat sumR = 0.0; + GLfloat sumG = 0.0; + GLfloat sumB = 0.0; + GLfloat sumA = 0.0; + for (m = 0; m < filterHeight; m++) { + for (n = 0; n < filterWidth; n++) { + if (i + n < halfFilterWidth || + i + n - halfFilterWidth >= srcWidth) { + sumR += borderColor[RCOMP] * rowFilt[n][RCOMP] * colFilt[m][RCOMP]; + sumG += borderColor[GCOMP] * rowFilt[n][GCOMP] * colFilt[m][GCOMP]; + sumB += borderColor[BCOMP] * rowFilt[n][BCOMP] * colFilt[m][BCOMP]; + sumA += borderColor[ACOMP] * rowFilt[n][ACOMP] * colFilt[m][ACOMP]; + } + else { + const GLint k = m * srcWidth + i + n - halfFilterWidth; + sumR += src[k][RCOMP] * rowFilt[n][RCOMP] * colFilt[m][RCOMP]; + sumG += src[k][GCOMP] * rowFilt[n][GCOMP] * colFilt[m][GCOMP]; + sumB += src[k][BCOMP] * rowFilt[n][BCOMP] * colFilt[m][BCOMP]; + sumA += src[k][ACOMP] * rowFilt[n][ACOMP] * colFilt[m][ACOMP]; + } + } + } + dest[i][RCOMP] = sumR; + dest[i][GCOMP] = sumG; + dest[i][BCOMP] = sumB; + dest[i][ACOMP] = sumA; + } +} + + +void +_mesa_convolve_sep_reduce(GLint srcWidth, GLint srcHeight, + const GLfloat src[][4], + GLint filterWidth, GLint filterHeight, + const GLfloat rowFilt[][4], + const GLfloat colFilt[][4], + GLfloat dest[][4]) +{ +#if 00 + const GLint halfFilterWidth = filterWidth / 2; + GLint i, n, m; + + for (i = 0; i < srcWidth; i++) { + GLfloat sumR = 0.0; + GLfloat sumG = 0.0; + GLfloat sumB = 0.0; + GLfloat sumA = 0.0; + for (m = 0; m < filterHeight; m++) { + for (n = 0; n < filterWidth; n++) { + if (i + n < halfFilterWidth || + i + n - halfFilterWidth >= srcWidth) { + sumR += borderColor[RCOMP] * rowFilt[n][RCOMP] * colFilt[m][RCOMP]; + sumG += borderColor[GCOMP] * rowFilt[n][GCOMP] * colFilt[m][GCOMP]; + sumB += borderColor[BCOMP] * rowFilt[n][BCOMP] * colFilt[m][BCOMP]; + sumA += borderColor[ACOMP] * rowFilt[n][ACOMP] * colFilt[m][ACOMP]; + } + else { + const GLint k = m * srcWidth + i + n - halfFilterWidth; + sumR += src[k][RCOMP] * rowFilt[n][RCOMP] * colFilt[m][RCOMP]; + sumG += src[k][GCOMP] * rowFilt[n][GCOMP] * colFilt[m][GCOMP]; + sumB += src[k][BCOMP] * rowFilt[n][BCOMP] * colFilt[m][BCOMP]; + sumA += src[k][ACOMP] * rowFilt[n][ACOMP] * colFilt[m][ACOMP]; + } + } + } + dest[i][RCOMP] = sumR; + dest[i][GCOMP] = sumG; + dest[i][BCOMP] = sumB; + dest[i][ACOMP] = sumA; + } +#endif +} + + +void +_mesa_convolve_sep_replicate(GLint srcWidth, GLint srcHeight, + const GLfloat src[][4], + GLint filterWidth, GLint filterHeight, + const GLfloat rowFilt[][4], + const GLfloat colFilt[][4], + GLfloat dest[][4]) +{ + const GLint halfFilterWidth = filterWidth / 2; + GLint i, n, m; + + for (i = 0; i < srcWidth; i++) { + GLfloat sumR = 0.0; + GLfloat sumG = 0.0; + GLfloat sumB = 0.0; + GLfloat sumA = 0.0; + for (m = 0; m < filterHeight; m++) { + for (n = 0; n < filterWidth; n++) { + if (i + n < halfFilterWidth) { + const GLint k = m * srcWidth + 0; + sumR += src[k][RCOMP] * rowFilt[n][RCOMP] * colFilt[m][RCOMP]; + sumG += src[k][GCOMP] * rowFilt[n][GCOMP] * colFilt[m][GCOMP]; + sumB += src[k][BCOMP] * rowFilt[n][BCOMP] * colFilt[m][BCOMP]; + sumA += src[k][ACOMP] * rowFilt[n][ACOMP] * colFilt[m][ACOMP]; + } + else if (i + n - halfFilterWidth >= srcWidth) { + const GLint k = m * srcWidth + srcWidth - 1; + sumR += src[k][RCOMP] * rowFilt[n][RCOMP] * colFilt[m][RCOMP]; + sumG += src[k][GCOMP] * rowFilt[n][GCOMP] * colFilt[m][GCOMP]; + sumB += src[k][BCOMP] * rowFilt[n][BCOMP] * colFilt[m][BCOMP]; + sumA += src[k][ACOMP] * rowFilt[n][ACOMP] * colFilt[m][ACOMP]; + } + else { + const GLint k = m * srcWidth + i + n - halfFilterWidth; + sumR += src[k][RCOMP] * rowFilt[n][RCOMP] * colFilt[m][RCOMP]; + sumG += src[k][GCOMP] * rowFilt[n][GCOMP] * colFilt[m][GCOMP]; + sumB += src[k][BCOMP] * rowFilt[n][BCOMP] * colFilt[m][BCOMP]; + sumA += src[k][ACOMP] * rowFilt[n][ACOMP] * colFilt[m][ACOMP]; + } + } + } + dest[i][RCOMP] = sumR; + dest[i][GCOMP] = sumG; + dest[i][BCOMP] = sumB; + dest[i][ACOMP] = sumA; + } +} Index: xc/extras/Mesa/src/copypix.c diff -u xc/extras/Mesa/src/copypix.c:1.4 xc/extras/Mesa/src/copypix.c:1.9 --- xc/extras/Mesa/src/copypix.c:1.4 Fri Jun 16 20:02:08 2000 +++ xc/extras/Mesa/src/copypix.c Thu Nov 30 10:39:03 2000 @@ -1,7 +1,7 @@ /* * Mesa 3-D graphics library - * Version: 3.3 + * Version: 3.4 * * Copyright (C) 1999-2000 Brian Paul All Rights Reserved. * @@ -126,7 +126,10 @@ /* If read and draw buffer are different we must do buffer switching */ saveReadAlpha = ctx->ReadBuffer->Alpha; changeBuffer = ctx->Pixel.ReadBuffer != ctx->Color.DrawBuffer - || ctx->DrawBuffer != ctx->ReadBuffer; + || ctx->DrawBuffer != ctx->ReadBuffer; + + (*ctx->Driver.SetReadBuffer)( ctx, ctx->ReadBuffer, + ctx->Pixel.DriverReadBuffer ); if (overlapping) { GLint ssy = sy; @@ -166,6 +169,7 @@ ctx->Pixel.ScaleOrBiasRGBApcm || ctx->Pixel.ColorTableEnabled || ctx->Pixel.PostColorMatrixColorTableEnabled || + ctx->Pixel.PostConvolutionColorTableEnabled || ctx->Pixel.MinMaxEnabled || ctx->Pixel.HistogramEnabled; @@ -204,7 +208,7 @@ if (applyTransferOps) { const GLfloat scale = (1.0F / 255.0F); GLfloat rgbaFloat[MAX_WIDTH][4]; - GLuint k; + GLint k; /* convert ubyte to float */ for (k = 0; k < width; k++) { rgbaFloat[k][RCOMP] = (GLfloat) rgba[k][RCOMP] * scale; @@ -224,6 +228,11 @@ if (ctx->Pixel.ColorTableEnabled) { _mesa_lookup_rgba(&ctx->ColorTable, width, rgbaFloat); } + /* XXX convolution here */ + /* GL_POST_CONVOLUTION_COLOR_TABLE lookup */ + if (ctx->Pixel.PostConvolutionColorTableEnabled) { + _mesa_lookup_rgba(&ctx->PostConvolutionColorTable, width, rgbaFloat); + } /* color matrix */ if (ctx->ColorMatrix.type != MATRIX_IDENTITY || ctx->Pixel.ScaleOrBiasRGBApcm) { @@ -256,28 +265,37 @@ if (ctx->Texture.ReallyEnabled && ctx->Pixel.PixelTextureEnabled) { GLfloat s[MAX_WIDTH], t[MAX_WIDTH], r[MAX_WIDTH], q[MAX_WIDTH]; + GLubyte primary_rgba[MAX_WIDTH][4]; GLuint unit; /* XXX not sure how multitexture is supposed to work here */ + + MEMCPY(primary_rgba, rgba, 4 * width * sizeof(GLubyte)); + for (unit = 0; unit < MAX_TEXTURE_UNITS; unit++) { - _mesa_pixeltexgen(ctx, width, (const GLubyte (*)[4]) rgba, + _mesa_pixeltexgen(ctx, width, (CONST GLubyte (*)[4]) rgba, s, t, r, q); - gl_texture_pixels(ctx, unit, width, s, t, r, NULL, rgba); + gl_texture_pixels(ctx, unit, width, s, t, r, NULL, + primary_rgba, rgba); } } if (quick_draw && dy >= 0 && dy < ctx->DrawBuffer->Height) { (*ctx->Driver.WriteRGBASpan)( ctx, width, destx, dy, - (const GLubyte (*)[4])rgba, NULL ); + (CONST GLubyte (*)[4])rgba, NULL ); } else if (zoom) { gl_write_zoomed_rgba_span( ctx, width, destx, dy, zspan, - (const GLubyte (*)[4])rgba, desty); + (CONST GLubyte (*)[4])rgba, desty); } else { gl_write_rgba_span( ctx, width, destx, dy, zspan, rgba, GL_BITMAP ); } } + /* Restore pixel source to be the draw buffer (for blending, etc) */ + (*ctx->Driver.SetReadBuffer)( ctx, ctx->DrawBuffer, + ctx->Color.DriverDrawBuffer ); + if (overlapping) FREE(prgba); } @@ -325,6 +343,9 @@ changeBuffer = ctx->Pixel.ReadBuffer != ctx->Color.DrawBuffer || ctx->DrawBuffer != ctx->ReadBuffer; + (*ctx->Driver.SetReadBuffer)( ctx, ctx->ReadBuffer, + ctx->Pixel.DriverReadBuffer ); + if (overlapping) { GLint ssy = sy; pci = (GLuint *) MALLOC(width * height * sizeof(GLuint)); @@ -383,6 +404,10 @@ } } + /* Restore pixel source to be the draw buffer (for blending, etc) */ + (*ctx->Driver.SetReadBuffer)( ctx, ctx->DrawBuffer, + ctx->Color.DriverDrawBuffer ); + if (overlapping) FREE(pci); } @@ -406,7 +431,7 @@ const GLboolean zoom = ctx->Pixel.ZoomX != 1.0F || ctx->Pixel.ZoomY != 1.0F; GLint overlapping; - if (!ctx->ReadBuffer->DepthBuffer || !ctx->DrawBuffer->DepthBuffer) { + if (!ctx->Visual->DepthBits) { gl_error( ctx, GL_INVALID_OPERATION, "glCopyPixels" ); return; } @@ -478,7 +503,7 @@ if (ctx->Visual->RGBAflag) { if (zoom) { gl_write_zoomed_rgba_span( ctx, width, destx, dy, zspan, - (const GLubyte (*)[4])rgba, desty ); + (CONST GLubyte (*)[4])rgba, desty ); } else { gl_write_rgba_span( ctx, width, destx, dy, zspan, rgba, GL_BITMAP); @@ -513,7 +538,7 @@ const GLboolean shift_or_offset = ctx->Pixel.IndexShift || ctx->Pixel.IndexOffset; GLint overlapping; - if (!ctx->DrawBuffer->Stencil || !ctx->ReadBuffer->Stencil) { + if (!ctx->Visual->StencilBits) { gl_error( ctx, GL_INVALID_OPERATION, "glCopyPixels" ); return; } @@ -615,9 +640,12 @@ ctx->OcclusionResult = GL_TRUE; + RENDER_START(ctx); + if (ctx->Driver.CopyPixels && (*ctx->Driver.CopyPixels)( ctx, srcx, srcy, width, height, destx, desty, type )) { + RENDER_FINISH(ctx); return; } @@ -636,6 +664,8 @@ else { gl_error( ctx, GL_INVALID_ENUM, "glCopyPixels" ); } + + RENDER_FINISH(ctx); } else if (ctx->RenderMode == GL_FEEDBACK) { GLfloat color[4]; Index: xc/extras/Mesa/src/cull_tmp.h diff -u xc/extras/Mesa/src/cull_tmp.h:1.3 xc/extras/Mesa/src/cull_tmp.h:1.4 --- xc/extras/Mesa/src/cull_tmp.h:1.3 Tue Feb 15 02:12:07 2000 +++ xc/extras/Mesa/src/cull_tmp.h Mon Nov 13 18:30:42 2000 @@ -38,7 +38,7 @@ const GLubyte face_bit = ctx->Polygon.FrontBit; const GLubyte cull_faces = ctx->Polygon.CullBits; GLubyte *cullmask = VB->CullMask; - GLint i,cullcount = 0; + GLint i, cullcount = 0; GLint last = count - 3; (void) parity; @@ -46,7 +46,7 @@ CULL_TRI(DO_CLIP, DO_AREA, i, i+1, i+2, face_bit, 3); } - if (i != count) + if (i != (GLint) count) cullcount += count - i; return cullcount; @@ -77,7 +77,7 @@ CULL_TRI(DO_CLIP, DO_AREA, start, i+1, i+2, face_bit, nr); } - if (i != last + 1) + if (i != (GLint) (last + 1)) cullcount += count - i; return cullcount; @@ -135,7 +135,7 @@ CULL_QUAD(DO_CLIP, DO_AREA, i, i+1, i+2, i+3, 4); } - if (i != count) + if (i != (GLint) count) cullcount += count - i; return cullcount; @@ -162,7 +162,7 @@ CULL_QUAD(DO_CLIP, DO_AREA, i, i+1, i+3, i+2, nr); } - if (i != last + 2) + if (i != ((GLint) last + 2)) cullcount += count - i; return cullcount; Index: xc/extras/Mesa/src/cva.c diff -u xc/extras/Mesa/src/cva.c:1.3 xc/extras/Mesa/src/cva.c:1.6 --- xc/extras/Mesa/src/cva.c:1.3 Tue Feb 15 02:12:07 2000 +++ xc/extras/Mesa/src/cva.c Thu Nov 30 10:39:03 2000 @@ -1,9 +1,9 @@ /* * Mesa 3-D graphics library - * Version: 3.3 + * Version: 3.4 * - * Copyright (C) 1999 Brian Paul All Rights Reserved. + * Copyright (C) 1999-2000 Brian Paul All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), @@ -201,7 +201,11 @@ GLcontext *ctx = VB->ctx; GLuint *elt = VB->EltPtr->start; GLuint count = VB->Count - VB->Start; +#ifdef VAO + GLuint available = ctx->CVA.pre.outputs | ctx->Array.Current->Summary; +#else GLuint available = ctx->CVA.pre.outputs | ctx->Array.Summary; +#endif GLuint required = ctx->CVA.elt.inputs; GLuint flags; @@ -244,15 +248,16 @@ translate_4f( VB->ClipPtr, cvaVB->ClipPtr, elt, count); if (VB->ClipOrMask & CLIP_USER_BIT) { - GLubyte or = 0, and = ~0; + GLubyte orMask = 0, andMask = ~0; copy_clipmask( VB->UserClipMask + VB->Start, - &or, &and, + &orMask, &andMask, cvaVB->UserClipMask, elt, VB->Count - VB->Start); - if (and) VB->ClipAndMask |= CLIP_USER_BIT; + if (andMask) + VB->ClipAndMask |= CLIP_USER_BIT; } if (VB->ClipOrMask) @@ -386,10 +391,21 @@ */ if (first == 0 && count > 0 && - count <= ctx->Const.MaxArrayLockSize) + count <= (GLint) ctx->Const.MaxArrayLockSize) { struct gl_cva *cva = &ctx->CVA; +#ifdef VAO + if (!ctx->Array.Current->LockCount) { + ctx->Array.NewArrayState = ~0; + ctx->CVA.lock_changed ^= 1; + ctx->NewState |= NEW_CLIENT_STATE; + } + + ctx->Array.Current->LockFirst = first; + ctx->Array.Current->LockCount = count; + ctx->CompileCVAFlag = !ctx->CompileFlag; +#else if (!ctx->Array.LockCount) { ctx->Array.NewArrayState = ~0; ctx->CVA.lock_changed ^= 1; @@ -399,6 +415,7 @@ ctx->Array.LockFirst = first; ctx->Array.LockCount = count; ctx->CompileCVAFlag = !ctx->CompileFlag; +#endif if (!cva->VB) { cva->VB = gl_vb_create_for_cva( ctx, ctx->Const.MaxArrayLockSize ); @@ -408,14 +425,23 @@ } else { +#ifdef VAO + if (ctx->Array.Current->LockCount) { +#else if (ctx->Array.LockCount) { +#endif ctx->CVA.lock_changed ^= 1; ctx->NewState |= NEW_CLIENT_STATE; } +#ifdef VAO + ctx->Array.Current->LockFirst = 0; + ctx->Array.Current->LockCount = 0; +#else ctx->Array.LockFirst = 0; ctx->Array.LockCount = 0; +#endif ctx->CompileCVAFlag = 0; } } @@ -432,13 +458,22 @@ if (MESA_VERBOSE & VERBOSE_API) fprintf(stderr, "glUnlockArrays\n"); +#ifdef VAO + if (ctx->Array.Current->LockCount) { +#else if (ctx->Array.LockCount) { +#endif ctx->CVA.lock_changed ^= 1; ctx->NewState |= NEW_CLIENT_STATE; } +#ifdef VAO + ctx->Array.Current->LockFirst = 0; + ctx->Array.Current->LockCount = 0; +#else ctx->Array.LockFirst = 0; ctx->Array.LockCount = 0; +#endif ctx->CompileCVAFlag = 0; } @@ -476,11 +511,19 @@ { GLcontext *ctx = VB->ctx; struct gl_cva *cva = &ctx->CVA; +#ifdef VAO + GLuint start = ctx->Array.Current->LockFirst; + GLuint n = ctx->Array.Current->LockCount; + GLuint enable = ((ctx->Array.NewArrayState & ctx->Array.Current->Summary) | + VB->pipeline->fallback); + GLuint disable = ctx->Array.NewArrayState & ~enable; +#else GLuint start = ctx->Array.LockFirst; GLuint n = ctx->Array.LockCount; GLuint enable = ((ctx->Array.NewArrayState & ctx->Array.Summary) | VB->pipeline->fallback); GLuint disable = ctx->Array.NewArrayState & ~enable; +#endif GLuint i; if (MESA_VERBOSE&VERBOSE_PIPELINE) { @@ -518,7 +561,11 @@ elt->start = VEC_ELT(elt, GLuint, 0); elt->count = cva->elt_count; +#ifdef VAO + fallback |= (cva->pre.new_inputs & ~ctx->Array.Current->Summary); +#else fallback |= (cva->pre.new_inputs & ~ctx->Array.Summary); +#endif enable |= fallback; disable &= ~fallback; if (MESA_VERBOSE&VERBOSE_PIPELINE) { @@ -531,7 +578,11 @@ { GLvector4ub *col = &cva->v.Color; +#ifdef VAO + client_data = &ctx->Array.Current->Color; +#else client_data = &ctx->Array.Color; +#endif if (fallback & VERT_RGBA) client_data = &ctx->Fallback.Color; VB->Color[0] = VB->Color[1] = VB->ColorPtr = &cva->v.Color; @@ -541,7 +592,11 @@ { col->data = cva->store.Color; col->stride = 4 * sizeof(GLubyte); +#ifdef VAO + ctx->Array.Current->ColorFunc( col->data, client_data, start, n ); +#else ctx->Array.ColorFunc( col->data, client_data, start, n ); +#endif col->flags = VEC_WRITABLE|VEC_GOOD_STRIDE; } else { col->data = (GLubyte (*)[4]) client_data->Ptr; @@ -559,14 +614,22 @@ GLvector1ui *index = VB->IndexPtr = &cva->v.Index; VB->Index[0] = VB->Index[1] = VB->IndexPtr; +#ifdef VAO + client_data = &ctx->Array.Current->Index; +#else client_data = &ctx->Array.Index; +#endif if (fallback & VERT_INDEX) client_data = &ctx->Fallback.Index; if (client_data->Type != GL_UNSIGNED_INT) { index->data = cva->store.Index; index->stride = sizeof(GLuint); +#ifdef VAO + ctx->Array.Current->IndexFunc( index->data, client_data, start, n ); +#else ctx->Array.IndexFunc( index->data, client_data, start, n ); +#endif index->flags = VEC_WRITABLE|VEC_GOOD_STRIDE; } else { index->data = (GLuint *) client_data->Ptr; @@ -583,7 +646,11 @@ if (enable & PIPE_TEX(i)) { GLvector4f *tc = VB->TexCoordPtr[i] = &cva->v.TexCoord[i]; +#ifdef VAO + client_data = &ctx->Array.Current->TexCoord[i]; +#else client_data = &ctx->Array.TexCoord[i]; +#endif if (fallback & PIPE_TEX(i)) { client_data = &ctx->Fallback.TexCoord[i]; @@ -603,7 +670,11 @@ } else { tc->data = cva->store.TexCoord[i]; tc->stride = 4 * sizeof(GLfloat); +#ifdef VAO + ctx->Array.Current->TexCoordFunc[i]( tc->data, client_data, start, n ); +#else ctx->Array.TexCoordFunc[i]( tc->data, client_data, start, n ); +#endif tc->flags = VEC_WRITABLE|VEC_GOOD_STRIDE; } tc->count = n; @@ -615,6 +686,24 @@ { GLvector4f *obj = VB->ObjPtr = &cva->v.Obj; +#ifdef VAO + if (ctx->Array.Current->Vertex.Type == GL_FLOAT) + { + obj->data = (GLfloat (*)[4]) ctx->Array.Current->Vertex.Ptr; + obj->stride = ctx->Array.Current->Vertex.StrideB; + obj->flags = VEC_NOT_WRITABLE|VEC_GOOD_STRIDE; + if (obj->stride != 4 * sizeof(GLfloat)) + obj->flags ^= VEC_STRIDE_FLAGS; + } else { + obj->data = cva->store.Obj; + obj->stride = 4 * sizeof(GLfloat); + ctx->Array.Current->VertexFunc( obj->data, &ctx->Array.Current->Vertex, start, n ); + obj->flags = VEC_WRITABLE|VEC_GOOD_STRIDE; + } + obj->count = n; + obj->start = VEC_ELT(obj, GLfloat, start); + obj->size = ctx->Array.Current->Vertex.Size; +#else if (ctx->Array.Vertex.Type == GL_FLOAT) { obj->data = (GLfloat (*)[4]) ctx->Array.Vertex.Ptr; @@ -631,13 +720,18 @@ obj->count = n; obj->start = VEC_ELT(obj, GLfloat, start); obj->size = ctx->Array.Vertex.Size; +#endif } if (enable & VERT_NORM) { GLvector3f *norm = VB->NormalPtr = &cva->v.Normal; +#ifdef VAO + client_data = &ctx->Array.Current->Normal; +#else client_data = &ctx->Array.Normal; +#endif if (fallback & VERT_NORM) client_data = &ctx->Fallback.Normal; @@ -650,7 +744,11 @@ } else { norm->data = cva->store.Normal; norm->stride = 3 * sizeof(GLfloat); +#ifdef VAO + ctx->Array.Current->NormalFunc( norm->data, client_data, start, n ); +#else ctx->Array.NormalFunc( norm->data, client_data, start, n ); +#endif } norm->flags = 0; norm->count = n; @@ -661,7 +759,11 @@ { GLvector1ub *edge = VB->EdgeFlagPtr = &cva->v.EdgeFlag; +#ifdef VAO + client_data = &ctx->Array.Current->EdgeFlag; +#else client_data = &ctx->Array.EdgeFlag; +#endif if (fallback & VERT_EDGE) client_data = &ctx->Fallback.EdgeFlag; @@ -683,7 +785,7 @@ if (disable & VERT_NORM) cva->v.Normal = *VB->store.Normal; if (disable & VERT_OBJ_ANY) cva->v.Obj = *VB->store.Obj; if (disable & VERT_TEX0_ANY) cva->v.TexCoord[0]= *(VB->store.TexCoord[0]); - if (disable & VERT_TEX0_ANY) cva->v.TexCoord[1]= *(VB->store.TexCoord[1]); + if (disable & VERT_TEX1_ANY) cva->v.TexCoord[1]= *(VB->store.TexCoord[1]); if (disable & VERT_EDGE) cva->v.EdgeFlag = *VB->store.EdgeFlag; } @@ -692,12 +794,20 @@ if (ctx->Enabled & ENABLE_LIGHT) { +#ifdef VAO + if (ctx->Array.Current->Flags != VB->Flag[0]) +#else if (ctx->Array.Flags != VB->Flag[0]) +#endif VB->FlagMax = 0; if (VB->FlagMax < n) { for (i = VB->FlagMax ; i < n ; i++) +#ifdef VAO + VB->Flag[i] = ctx->Array.Current->Flags; +#else VB->Flag[i] = ctx->Array.Flags; +#endif VB->Flag[i] = 0; VB->FlagMax = n; } Index: xc/extras/Mesa/src/dd.h diff -u xc/extras/Mesa/src/dd.h:1.5 xc/extras/Mesa/src/dd.h:1.9 --- xc/extras/Mesa/src/dd.h:1.5 Fri Jun 16 20:02:08 2000 +++ xc/extras/Mesa/src/dd.h Mon Nov 13 18:30:43 2000 @@ -1,7 +1,7 @@ /* * Mesa 3-D graphics library - * Version: 3.3 + * Version: 3.4 * * Copyright (C) 1999-2000 Brian Paul All Rights Reserved. * @@ -640,18 +640,31 @@ * Core Mesa will perform any image format/type conversions that are needed. */ + GLboolean (*TestProxyTexImage)(GLcontext *ctx, GLenum target, + GLint level, GLint internalFormat, + GLenum format, GLenum type, + GLint width, GLint height, + GLint depth, GLint border); + /* Called by glTexImage[123]D when user specifies a proxy texture + * target. Return GL_TRUE if the proxy test passes, return GL_FALSE + * if the test fails. + */ + GLboolean (*CompressedTexImage1D)( GLcontext *ctx, GLenum target, - GLint level, const GLvoid *data, + GLint level, GLsizei imageSize, + const GLvoid *data, struct gl_texture_object *texObj, struct gl_texture_image *texImage, GLboolean *retainInternalCopy); GLboolean (*CompressedTexImage2D)( GLcontext *ctx, GLenum target, - GLint level, const GLvoid *data, + GLint level, GLsizei imageSize, + const GLvoid *data, struct gl_texture_object *texObj, struct gl_texture_image *texImage, GLboolean *retainInternalCopy); GLboolean (*CompressedTexImage3D)( GLcontext *ctx, GLenum target, - GLint level, const GLvoid *data, + GLint level, GLsizei imageSize, + const GLvoid *data, struct gl_texture_object *texObj, struct gl_texture_image *texImage, GLboolean *retainInternalCopy); @@ -699,6 +712,49 @@ * should do the job. */ + GLint (*BaseCompressedTexFormat)(GLcontext *ctx, + GLint internalFormat); + /* Called to compute the base format for a specific compressed + * format. Return -1 if the internalFormat is not a specific + * compressed format that the driver recognizes. Note the + * return value differences between this function and + * SpecificCompressedTexFormat below. + */ + + GLint (*SpecificCompressedTexFormat)(GLcontext *ctx, + GLint internalFormat, + GLint numDimensions, + GLint *levelp, + GLsizei *widthp, + GLsizei *heightp, + GLsizei *depthp, + GLint *borderp, + GLenum *formatp, + GLenum *typep); + /* Called to turn a generic texture format into a specific + * texture format. For example, if a driver implements + * GL_3DFX_texture_compression_FXT1, this would map + * GL_COMPRESSED_RGBA_ARB to GL_COMPRESSED_RGBA_FXT1_3DFX. + * + * If the driver does not know how to handle the compressed + * format, then just return the generic format, and Mesa will + * do the right thing with it. + */ + + GLboolean (*IsCompressedFormat)(GLcontext *ctx, GLint internalFormat); + /* Called to tell if a format is a compressed format. + */ + + GLsizei (*CompressedImageSize)(GLcontext *ctx, + GLenum internalFormat, + GLuint numDimensions, + GLuint width, + GLuint height, + GLuint depth); + /* Calculate the size of a compressed image, given the image's + * format and dimensions. + */ + void (*GetCompressedTexImage)( GLcontext *ctx, GLenum target, GLint lod, void *image, const struct gl_texture_object *texObj, @@ -759,7 +815,7 @@ /*** - *** Accelerated point, line, polygon, glDrawPixels and glBitmap functions: + *** Accelerated point, line, polygon, quad and rect functions: ***/ points_func PointsFunc; @@ -906,6 +962,16 @@ void (*StencilMask)(GLcontext *ctx, GLuint mask); void (*StencilOp)(GLcontext *ctx, GLenum fail, GLenum zfail, GLenum zpass); void (*Viewport)(GLcontext *ctx, GLint x, GLint y, GLsizei w, GLsizei h); + + /* State-query functions + * + * Return GL_TRUE if query was completed, GL_FALSE otherwise. + */ + GLboolean (*GetBooleanv)(GLcontext *ctx, GLenum pname, GLboolean *result); + GLboolean (*GetDoublev)(GLcontext *ctx, GLenum pname, GLdouble *result); + GLboolean (*GetFloatv)(GLcontext *ctx, GLenum pname, GLfloat *result); + GLboolean (*GetIntegerv)(GLcontext *ctx, GLenum pname, GLint *result); + GLboolean (*GetPointerv)(GLcontext *ctx, GLenum pname, GLvoid **result); }; Index: xc/extras/Mesa/src/debug_xform.c diff -u xc/extras/Mesa/src/debug_xform.c:1.3 xc/extras/Mesa/src/debug_xform.c:1.7 --- xc/extras/Mesa/src/debug_xform.c:1.3 Tue Feb 15 02:12:08 2000 +++ xc/extras/Mesa/src/debug_xform.c Mon Nov 13 18:30:43 2000 @@ -2,19 +2,19 @@ /* * Mesa 3-D graphics library * Version: 3.3 - * + * * Copyright (C) 1999-2000 Brian Paul All Rights Reserved. - * + * * 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 @@ -23,6 +23,9 @@ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/* + * Updated for P6 architecture by Gareth Hughes. + */ #ifdef PC_HEADER #include "all.h" @@ -30,6 +33,7 @@ #include "glheader.h" #include "context.h" #include "types.h" +#include "mem.h" #include "xform.h" #include "debug_xform.h" #endif @@ -38,121 +42,160 @@ #ifdef DEBUG /* This code only used for debugging */ -/* comment this out to deactivate the cycle counter. - * NOTE: it works only on CPUs which know the 'rdtsc' command (586 or higher) - * (hope, you don't try to debug Mesa on a 386 ;) +/* Comment this out to deactivate the cycle counter. + * NOTE: it works only on CPUs which know the 'rdtsc' command (586 or higher) + * (hope, you don't try to debug Mesa on a 386 ;) */ #if defined(__GNUC__) && defined(__i386__) && defined(USE_X86_ASM) #define RUN_XFORM_BENCHMARK #endif -#define TEST_COUNT 100 /* size of the tested vector array */ +#define TEST_COUNT 128 /* size of the tested vector array */ -#define REQUIRED_PRECISION 10 /* allow 4 bits to miss */ -#define MAX_PRECISION 24 /* max. precision possible */ +#define REQUIRED_PRECISION 10 /* allow 4 bits to miss */ +#define MAX_PRECISION 24 /* max. precision possible */ #ifdef RUN_XFORM_BENCHMARK -/* Modify the the number of tests if you like. - * We take the minimum of all results, because every error should be - * positive (time used by other processes, task switches etc). - * It is assumed that all calculations are done in the cache. - */ -#define BEGIN_RACE(x) \ -x = 16000000; /* hope it's enough-*/ \ -for (cycle_i = 0; cycle_i <10; cycle_i++) { \ - long cycle_tmp1, cycle_tmp2, dummy; \ - __asm__ ("mov %%eax, %0":"=a" (cycle_tmp1)); /* cache cycle_tmp1 */ \ - __asm__ ("mov %%eax, %0":"=a" (cycle_tmp2)); /* cache cycle_tmp2 */ \ - __asm__ ("cdq"); /* stall pipeline */ \ - __asm__ ("cdq"); /* to avoid pairing */ \ - __asm__ ("rdtsc":"=a" (cycle_tmp1), "=d" (dummy)); /* save timestamp */ - - -#define END_RACE(x) \ - __asm__ ("cdq"); \ - __asm__ ("cdq"); \ - __asm__ ("rdtsc":"=a" (cycle_tmp2), "=d" (dummy)); \ - if (x > (cycle_tmp2-cycle_tmp1)) x = cycle_tmp2 - cycle_tmp1; \ -} \ -x -= 13; /* sub the overhead of the counter procedure */ - -#else -#define BEGIN_RACE(x) -#define END_RACE(x) -#endif - - -static char *mesa_profile = NULL; - - -static GLfloat rnd(void) -{ - GLfloat f = (GLfloat)rand() / (GLfloat)RAND_MAX; - GLfloat gran = (GLfloat)(1 << 13); - - f = (GLfloat)(GLint)(f * gran) / gran; - - return f * 2.0 - 1.0; -} - - - -static int significand_match( GLfloat a, GLfloat b ) -{ - GLfloat d = a - b; - int a_ex, b_ex, d_ex; - - if (d == 0.0F) { - return MAX_PRECISION; /* Exact match */ - } - - if (a == 0.0F || b == 0.0F) { - /* - * It would probably be better to check if the - * non-zero number is denormalized and return - * the index of the highest set bit here. - */ - return 0; - } +/* Overhead of profiling counter in cycles. Automatically adjusted to + * your machine at run time - counter initialization should give very + * consistent results. + */ +static int need_counter = 1; +static long counter_overhead = 0; - frexp(a, &a_ex); - frexp(b, &b_ex); - frexp(d, &d_ex); +/* Modify the the number of tests if you like. + * We take the minimum of all results, because every error should be + * positive (time used by other processes, task switches etc). + * It is assumed that all calculations are done in the cache. + */ - if (a_ex < b_ex) - return a_ex - d_ex; - else - return b_ex - d_ex; -} +#if 1 /* PPro, PII, PIII version */ +/* Profiling on the P6 architecture requires a little more work, due to + * the internal out-of-order execution. We must perform a serializing + * 'cpuid' instruction before and after the 'rdtsc' instructions to make + * sure no other uops are executed when we sample the timestamp counter. + */ +#define INIT_COUNTER() \ + do { \ + int cycle_i; \ + counter_overhead = LONG_MAX; \ + for ( cycle_i = 0 ; cycle_i < 4 ; cycle_i++ ) { \ + long cycle_tmp1 = 0, cycle_tmp2 = 0; \ + __asm__ ( "push %%ebx \n" \ + "xor %%eax, %%eax \n" \ + "cpuid \n" \ + "rdtsc \n" \ + "mov %%eax, %0 \n" \ + "xor %%eax, %%eax \n" \ + "cpuid \n" \ + "pop %%ebx \n" \ + "push %%ebx \n" \ + "xor %%eax, %%eax \n" \ + "cpuid \n" \ + "rdtsc \n" \ + "mov %%eax, %1 \n" \ + "xor %%eax, %%eax \n" \ + "cpuid \n" \ + "pop %%ebx \n" \ + : "=m" (cycle_tmp1), "=m" (cycle_tmp2) \ + : : "eax", "ecx", "edx" ); \ + if ( counter_overhead > (cycle_tmp2 - cycle_tmp1) ) { \ + counter_overhead = cycle_tmp2 - cycle_tmp1; \ + } \ + } \ + } while (0) + +#define BEGIN_RACE(x) \ + x = LONG_MAX; \ + for ( cycle_i = 0 ; cycle_i < 10 ; cycle_i++ ) { \ + long cycle_tmp1 = 0, cycle_tmp2 = 0; \ + __asm__ ( "push %%ebx \n" \ + "xor %%eax, %%eax \n" \ + "cpuid \n" \ + "rdtsc \n" \ + "mov %%eax, %0 \n" \ + "xor %%eax, %%eax \n" \ + "cpuid \n" \ + "pop %%ebx \n" \ + : "=m" (cycle_tmp1) \ + : : "eax", "ecx", "edx" ); + +#define END_RACE(x) \ + __asm__ ( "push %%ebx \n" \ + "xor %%eax, %%eax \n" \ + "cpuid \n" \ + "rdtsc \n" \ + "mov %%eax, %0 \n" \ + "xor %%eax, %%eax \n" \ + "cpuid \n" \ + "pop %%ebx \n" \ + : "=m" (cycle_tmp2) \ + : : "eax", "ecx", "edx" ); \ + if ( x > (cycle_tmp2 - cycle_tmp1) ) { \ + x = cycle_tmp2 - cycle_tmp1; \ + } \ + } \ + x -= counter_overhead; + +#else /* PPlain, PMMX version */ + +/* To ensure accurate results, we stall the pipelines with the + * non-pairable 'cdq' instruction. This ensures all the code being + * profiled is complete when the 'rdtsc' instruction executes. + */ +#define INIT_COUNTER(x) \ + do { \ + int cycle_i; \ + x = LONG_MAX; \ + for ( cycle_i = 0 ; cycle_i < 32 ; cycle_i++ ) { \ + long cycle_tmp1, cycle_tmp2, dummy; \ + __asm__ ( "mov %%eax, %0" : "=a" (cycle_tmp1) ); \ + __asm__ ( "mov %%eax, %0" : "=a" (cycle_tmp2) ); \ + __asm__ ( "cdq" ); \ + __asm__ ( "cdq" ); \ + __asm__ ( "rdtsc" : "=a" (cycle_tmp1), "=d" (dummy) ); \ + __asm__ ( "cdq" ); \ + __asm__ ( "cdq" ); \ + __asm__ ( "rdtsc" : "=a" (cycle_tmp2), "=d" (dummy) ); \ + if ( x > (cycle_tmp2 - cycle_tmp1) ) \ + x = cycle_tmp2 - cycle_tmp1; \ + } \ + } while (0) + +#define BEGIN_RACE(x) \ + x = LONG_MAX; \ + for ( cycle_i = 0 ; cycle_i < 16 ; cycle_i++ ) { \ + long cycle_tmp1, cycle_tmp2, dummy; \ + __asm__ ( "mov %%eax, %0" : "=a" (cycle_tmp1) ); \ + __asm__ ( "mov %%eax, %0" : "=a" (cycle_tmp2) ); \ + __asm__ ( "cdq" ); \ + __asm__ ( "cdq" ); \ + __asm__ ( "rdtsc" : "=a" (cycle_tmp1), "=d" (dummy) ); + + +#define END_RACE(x) \ + __asm__ ( "cdq" ); \ + __asm__ ( "cdq" ); \ + __asm__ ( "rdtsc" : "=a" (cycle_tmp2), "=d" (dummy) ); \ + if ( x > (cycle_tmp2 - cycle_tmp1) ) \ + x = cycle_tmp2 - cycle_tmp1; \ + } \ + x -= counter_overhead; +#endif +#else +#define INIT_COUNTER(x) +#define BEGIN_RACE(x) +#define END_RACE(x) -static void ref_transform( GLvector4f *dst, - const GLmatrix *mat, - const GLvector4f *src, - const GLubyte *clipmask, - const GLubyte flag ) -{ - int i; - GLfloat *s = (GLfloat *)src->start; - GLfloat (*d)[4] = (GLfloat (*)[4])dst->start; - const GLfloat *m = mat->m; +#endif - (void) clipmask; - (void) flag; - for (i = 0; i < src->count; ++i) { - GLfloat x = s[0], y = s[1], z = s[2], w = s[3]; - d[i][0] = m[0]*x + m[4]*y + m[ 8]*z + m[12]*w; - d[i][1] = m[1]*x + m[5]*y + m[ 9]*z + m[13]*w; - d[i][2] = m[2]*x + m[6]*y + m[10]*z + m[14]*w; - d[i][3] = m[3]*x + m[7]*y + m[11]*z + m[15]*w; - s = (GLfloat *)((char *)s + src->stride); - } -} +static char *mesa_profile = NULL; enum { NIL=0, ONE=1, NEG=-1, VAR=2 }; @@ -169,7 +212,7 @@ NIL, NIL, ONE, NIL, NIL, NIL, NIL, ONE }; -static int m_2d[16] = { +static int m_2d[16] = { VAR, VAR, NIL, VAR, VAR, VAR, NIL, VAR, NIL, NIL, ONE, NIL, @@ -227,37 +270,272 @@ "MATRIX_3D" }; + + +static int m_norm_identity[16] = { + ONE, NIL, NIL, NIL, + NIL, ONE, NIL, NIL, + NIL, NIL, ONE, NIL, + NIL, NIL, NIL, NIL +}; +static int m_norm_general[16] = { + VAR, VAR, VAR, NIL, + VAR, VAR, VAR, NIL, + VAR, VAR, VAR, NIL, + NIL, NIL, NIL, NIL +}; +static int m_norm_no_rot[16] = { + VAR, NIL, NIL, NIL, + NIL, VAR, NIL, NIL, + NIL, NIL, VAR, NIL, + NIL, NIL, NIL, NIL +}; +static int *norm_templates[8] = { + m_norm_no_rot, + m_norm_no_rot, + m_norm_no_rot, + m_norm_general, + m_norm_general, + m_norm_general, + m_norm_identity, + m_norm_identity +}; +static int norm_types[8] = { + NORM_TRANSFORM_NO_ROT, + NORM_TRANSFORM_NO_ROT | NORM_RESCALE, + NORM_TRANSFORM_NO_ROT | NORM_NORMALIZE, + NORM_TRANSFORM, + NORM_TRANSFORM | NORM_RESCALE, + NORM_TRANSFORM | NORM_NORMALIZE, + NORM_RESCALE, + NORM_NORMALIZE +}; +static int norm_scale_types[8] = { /* rescale factor */ + NIL, /* NIL disables rescaling */ + VAR, + NIL, + NIL, + VAR, + NIL, + VAR, + NIL +}; +static int norm_normalize_types[8] = { /* normalizing ?? (no = 0) */ + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1 +}; +static char *norm_strings[8] = { + "NORM_TRANSFORM_NO_ROT", + "NORM_TRANSFORM_NO_ROT | NORM_RESCALE", + "NORM_TRANSFORM_NO_ROT | NORM_NORMALIZE", + "NORM_TRANSFORM", + "NORM_TRANSFORM | NORM_RESCALE", + "NORM_TRANSFORM | NORM_NORMALIZE", + "NORM_RESCALE", + "NORM_NORMALIZE" +}; + + + +/* ================================================================ + * Helper functions + */ + +static GLfloat rnd( void ) +{ + GLfloat f = (GLfloat)rand() / (GLfloat)RAND_MAX; + GLfloat gran = (GLfloat)(1 << 13); + + f = (GLfloat)(GLint)(f * gran) / gran; + + return f * 2.0 - 1.0; +} + +static int significand_match( GLfloat a, GLfloat b ) +{ + GLfloat d = a - b; + int a_ex, b_ex, d_ex; + + if ( d == 0.0F ) { + return MAX_PRECISION; /* Exact match */ + } -static int test_transform_function( transform_func fn, int psize, int mtype, - int masked, long* cycles ) + if ( a == 0.0F || b == 0.0F ) { + /* It would probably be better to check if the + * non-zero number is denormalized and return + * the index of the highest set bit here. + */ + return 0; + } + + frexp( a, &a_ex ); + frexp( b, &b_ex ); + frexp( d, &d_ex ); + + if ( a_ex < b_ex ) + return a_ex - d_ex; + else + return b_ex - d_ex; +} + + + +/* ================================================================ + * Reference transformations + */ + +static void ref_transform( GLvector4f *dst, + const GLmatrix *mat, + const GLvector4f *src, + const GLubyte *clipmask, + const GLubyte flag ) { + GLuint i; + GLfloat *s = (GLfloat *)src->start; + GLfloat (*d)[4] = (GLfloat (*)[4])dst->start; + const GLfloat *m = mat->m; + + (void) clipmask; + (void) flag; + + for ( i = 0 ; i < src->count ; i++ ) { + GLfloat x = s[0], y = s[1], z = s[2], w = s[3]; + d[i][0] = m[0]*x + m[4]*y + m[ 8]*z + m[12]*w; + d[i][1] = m[1]*x + m[5]*y + m[ 9]*z + m[13]*w; + d[i][2] = m[2]*x + m[6]*y + m[10]*z + m[14]*w; + d[i][3] = m[3]*x + m[7]*y + m[11]*z + m[15]*w; + s = (GLfloat *)((char *)s + src->stride); + } +} + +static void ref_norm_transform_rescale( const GLmatrix *mat, + GLfloat scale, + const GLvector3f *in, + const GLfloat *lengths, + const GLubyte mask[], + GLvector3f *dest ) +{ + GLuint i; + const GLfloat *s = in->start; + const GLfloat *m = mat->inv; + GLfloat (*out)[3] = (GLfloat (*)[3])dest->start; + + (void) mask; + (void) lengths; + + for ( i = 0 ; i < in->count ; i++ ) { + GLfloat x = s[0], y = s[1], z = s[2] ; + GLfloat tx = m[0]*x + m[1]*y + m[ 2]*z ; + GLfloat ty = m[4]*x + m[5]*y + m[ 6]*z ; + GLfloat tz = m[8]*x + m[9]*y + m[10]*z ; + + out[i][0] = tx * scale; + out[i][1] = ty * scale; + out[i][2] = tz * scale; + + s = (GLfloat *)((char *)s + in->stride); + } +} + +static void ref_norm_transform_normalize( const GLmatrix *mat, + GLfloat scale, + const GLvector3f *in, + const GLfloat *lengths, + const GLubyte mask[], + GLvector3f *dest ) +{ + GLuint i; + const GLfloat *s = in->start; + const GLfloat *m = mat->inv; + GLfloat (*out)[3] = (GLfloat (*)[3])dest->start; + + (void) mask; + + for ( i = 0 ; i < in->count ; i++ ) { + GLfloat x = s[0], y = s[1], z = s[2] ; + GLfloat tx = m[0]*x + m[1]*y + m[ 2]*z ; + GLfloat ty = m[4]*x + m[5]*y + m[ 6]*z ; + GLfloat tz = m[8]*x + m[9]*y + m[10]*z ; + + if ( !lengths ) { + GLfloat len = tx*tx + ty*ty + tz*tz; + if ( len > 1e-20 ) { + /* Hmmm, don't know how we could test the precalculated + * length case... + */ + scale = 1.0 / sqrt( len ); + out[i][0] = tx * scale; + out[i][1] = ty * scale; + out[i][2] = tz * scale; + } else { + out[i][0] = out[i][1] = out[i][2] = 0; + } + } else { + scale = lengths[i];; + out[i][0] = tx * scale; + out[i][1] = ty * scale; + out[i][2] = tz * scale; + } + + s = (GLfloat *)((char *)s + in->stride); + } +} + + + +/* ================================================================ + * Vertex transformation tests + */ + +/* Ensure our arrays are correctly aligned. + */ +#if defined(__GNUC__) +#define ALIGN16(x) x __attribute__ ((aligned (16))) +#else +#define ALIGN16(x) x +#endif +static GLfloat ALIGN16(s[TEST_COUNT][5]); +static GLfloat ALIGN16(d[TEST_COUNT][4]); +static GLfloat ALIGN16(r[TEST_COUNT][4]); + +static int test_transform_function( transform_func func, int psize, int mtype, + int masked, long *cycles ) +{ GLvector4f source[1], dest[1], ref[1]; GLmatrix mat[1]; - GLfloat s[TEST_COUNT][5], d[TEST_COUNT][4], r[TEST_COUNT][4]; - GLfloat *m = mat->m; + GLfloat *m; GLubyte mask[TEST_COUNT]; int i, j; #ifdef RUN_XFORM_BENCHMARK - int cycle_i; /* the counter for the benchmarks we run */ + int cycle_i; /* the counter for the benchmarks we run */ #endif (void) cycles; - if (psize > 4) { - gl_problem( NULL, "test_transform_function called with psize > 4\n"); + if ( psize > 4 ) { + gl_problem( NULL, "test_transform_function called with psize > 4\n" ); return 0; } + mat->m = (GLfloat *) ALIGN_MALLOC( 16 * sizeof(GLfloat), 16 ); mat->type = mtypes[mtype]; + m = mat->m; + m[0] = 63.0; m[4] = 43.0; m[ 8] = 29.0; m[12] = 43.0; m[1] = 55.0; m[5] = 17.0; m[ 9] = 31.0; m[13] = 7.0; m[2] = 44.0; m[6] = 9.0; m[10] = 7.0; m[14] = 3.0; m[3] = 11.0; m[7] = 23.0; m[11] = 91.0; m[15] = 9.0; - for (i = 0; i < 4; i++) { - for (j = 0; j < 4; j++) { - switch (templates[mtype][i * 4 + j]) { + for ( i = 0 ; i < 4 ; i++ ) { + for ( j = 0 ; j < 4 ; j++ ) { + switch ( templates[mtype][i * 4 + j] ) { case NIL: m[j * 4 + i] = 0.0; break; @@ -275,13 +553,13 @@ } } - for (i = 0; i < TEST_COUNT; ++i) { - mask[i] = i % 2; /* mask every 2nd element */ + for ( i = 0 ; i < TEST_COUNT ; i++) { + mask[i] = i % 2; /* mask every 2nd element */ d[i][0] = s[i][0] = 0.0; d[i][1] = s[i][1] = 0.0; d[i][2] = s[i][2] = 0.0; d[i][3] = s[i][3] = 1.0; - for (j = 0; j < psize; j++) + for ( j = 0 ; j < psize ; j++ ) s[i][j] = rnd(); } @@ -306,293 +584,146 @@ ref->size = 0; ref->flags = 0; - ref_transform(ref, mat, source, NULL, 0); + ref_transform( ref, mat, source, NULL, 0 ); - if (mesa_profile) { - if (masked) { - BEGIN_RACE (*cycles); - fn(dest, mat, source, mask, 1); - END_RACE (*cycles); + if ( mesa_profile ) { + if ( masked ) { + BEGIN_RACE( *cycles ); + func( dest, mat->m, source, mask, 1 ); + END_RACE( *cycles ); } else { - BEGIN_RACE (*cycles); - fn(dest, mat, source, NULL, 0); - END_RACE (*cycles); - } + BEGIN_RACE( *cycles ); + func( dest, mat->m, source, NULL, 0 ); + END_RACE( *cycles ); + } } else { - if (masked) { - fn(dest, mat, source, mask, 1); + if ( masked ) { + func( dest, mat->m, source, mask, 1 ); } else { - fn(dest, mat, source, NULL, 0); + func( dest, mat->m, source, NULL, 0 ); } } - for (i = 0; i < TEST_COUNT; ++i) { - if (masked && mask[i] & 1) + for ( i = 0 ; i < TEST_COUNT ; i++ ) { + if ( masked && (mask[i] & 1) ) continue; - for (j = 0; j < 4; j++) { - if (significand_match (d[i][j], r[i][j]) < REQUIRED_PRECISION) { - printf("-----------------------------\n"); - printf ("(i = %i, j = %i)\n", i, j); - printf ("%f \t %f \t [diff = %e - %i bit missed]\n", - d[i][0], r[i][0], r[i][0]-d[i][0], - MAX_PRECISION - significand_match (d[i][0], r[i][0])); - printf ("%f \t %f \t [diff = %e - %i bit missed]\n", - d[i][1], r[i][1], r[i][1]-d[i][1], - MAX_PRECISION - significand_match (d[i][1], r[i][1])); - printf ("%f \t %f \t [diff = %e - %i bit missed]\n", - d[i][2], r[i][2], r[i][2]-d[i][2], - MAX_PRECISION - significand_match (d[i][2], r[i][2])); - printf ("%f \t %f \t [diff = %e - %i bit missed]\n", - d[i][3], r[i][3], r[i][3]-d[i][3], - MAX_PRECISION - significand_match (d[i][3], r[i][3])); + for ( j = 0 ; j < 4 ; j++ ) { + if ( significand_match( d[i][j], r[i][j] ) < REQUIRED_PRECISION ) { + printf( "-----------------------------\n" ); + printf( "(i = %i, j = %i)\n", i, j ); + printf( "%f \t %f \t [diff = %e - %i bit missed]\n", + d[i][0], r[i][0], r[i][0]-d[i][0], + MAX_PRECISION - significand_match( d[i][0], r[i][0] ) ); + printf( "%f \t %f \t [diff = %e - %i bit missed]\n", + d[i][1], r[i][1], r[i][1]-d[i][1], + MAX_PRECISION - significand_match( d[i][1], r[i][1] ) ); + printf( "%f \t %f \t [diff = %e - %i bit missed]\n", + d[i][2], r[i][2], r[i][2]-d[i][2], + MAX_PRECISION - significand_match( d[i][2], r[i][2] ) ); + printf( "%f \t %f \t [diff = %e - %i bit missed]\n", + d[i][3], r[i][3], r[i][3]-d[i][3], + MAX_PRECISION - significand_match( d[i][3], r[i][3] ) ); return 0; } } } + + ALIGN_FREE( mat->m ); return 1; } - - - void gl_test_all_transform_functions( char *description ) { int masked, psize, mtype; - long benchmark_tab [2][4][7]; + long benchmark_tab[2][4][7]; static int first_time = 1; - if (first_time) { + if ( first_time ) { first_time = 0; - mesa_profile = getenv("MESA_PROFILE"); + mesa_profile = getenv( "MESA_PROFILE" ); } #ifdef RUN_XFORM_BENCHMARK - if (mesa_profile) { - printf("transform results after hooking in %s functions:\n", description); + if ( mesa_profile ) { + if ( need_counter ) { + need_counter = 0; + INIT_COUNTER(); + printf( "counter overhead: %ld cycles\n\n", counter_overhead ); + } + printf( "transform results after hooking in %s functions:\n", description ); } #endif - for (masked = 0; masked <= 1; masked++) { + for ( masked = 0 ; masked <= 1 ; masked++ ) { int cma = masked ? CULL_MASK_ACTIVE : 0; char *cmastring = masked ? "CULL_MASK_ACTIVE" : "0"; #ifdef RUN_XFORM_BENCHMARK - if (mesa_profile) { - printf ("\n culling: %s \n", masked ? "CULL_MASK_ACTIVE" : "0"); - for (psize = 1; psize <= 4; psize++) { - printf(" p%d\t", psize ); + if ( mesa_profile ) { + printf( "\n culling: %s \n", masked ? "CULL_MASK_ACTIVE" : "0" ); + for ( psize = 1 ; psize <= 4 ; psize++ ) { + printf( " p%d\t", psize ); } - printf("\n--------------------------------------------------------\n"); + printf( "\n--------------------------------------------------------\n" ); } #endif - for (mtype = 0; mtype < 7; mtype++) { - for (psize = 1; psize <= 4; psize++) { - transform_func fn = gl_transform_tab[cma][psize][mtypes[mtype]]; - long* cycles = &(benchmark_tab [cma][psize-1][mtype]); + for ( mtype = 0 ; mtype < 7 ; mtype++ ) { + for ( psize = 1 ; psize <= 4 ; psize++ ) { + transform_func func = gl_transform_tab[cma][psize][mtypes[mtype]]; + long *cycles = &(benchmark_tab[cma][psize-1][mtype]); - if (test_transform_function (fn,psize,mtype,masked,cycles) == 0 ) { + if ( test_transform_function( func, psize, mtype, + masked, cycles ) == 0 ) { char buf[100]; sprintf( buf, "gl_transform_tab[%s][%d][%s] failed test (%s)", cmastring, psize, mstrings[mtype], description ); gl_problem( NULL, buf ); - } else { -/* printf("gl_transform_tab[%s][%d][%s] passed test in %i cycles\n", - cmastring, psize, mstrings[mtype], - benchmark_tab [cma][psize-1][mtype]); -*/ } + } #ifdef RUN_XFORM_BENCHMARK - if (mesa_profile) - printf(" %li\t", benchmark_tab [cma][psize-1][mtype] ); + if ( mesa_profile ) + printf( " %li\t", benchmark_tab[cma][psize-1][mtype] ); #endif } #ifdef RUN_XFORM_BENCHMARK - if (mesa_profile) - printf (" | [%s]\n", mstrings[mtype] ); + if ( mesa_profile ) + printf( " | [%s]\n", mstrings[mtype] ); #endif } #ifdef RUN_XFORM_BENCHMARK - if (mesa_profile) - printf ("\n"); + if ( mesa_profile ) + printf( "\n" ); #endif } } - - - - - - -static void ref_norm_transform_rescale ( const GLmatrix *mat, - GLfloat scale, - const GLvector3f *in, - const GLfloat *lengths, - const GLubyte mask[], - GLvector3f *dest ) -{ - int i; - const GLfloat *s = in->start; - const GLfloat *m = mat->inv; - GLfloat (*out)[3] = (GLfloat (*)[3])dest->start; - - (void) mask; - (void) lengths; - - for (i = 0; i < in->count; ++i) { - GLfloat x = s[0], y = s[1], z = s[2] ; - GLfloat tx = m[0]*x + m[1]*y + m[ 2]*z ; - GLfloat ty = m[4]*x + m[5]*y + m[ 6]*z ; - GLfloat tz = m[8]*x + m[9]*y + m[10]*z ; - out[i][0] = tx * scale; - out[i][1] = ty * scale; - out[i][2] = tz * scale; - - s = (GLfloat *)((char *)s + in->stride); - } -} - - -static void ref_norm_transform_normalize ( const GLmatrix *mat, - GLfloat scale, - const GLvector3f *in, - const GLfloat *lengths, - const GLubyte mask[], - GLvector3f *dest ) -{ - int i; - const GLfloat *s = in->start; - const GLfloat *m = mat->inv; - GLfloat (*out)[3] = (GLfloat (*)[3])dest->start; - - (void) mask; - - for (i = 0; i < in->count; ++i) { - GLfloat x = s[0], y = s[1], z = s[2] ; - GLfloat tx = m[0]*x + m[1]*y + m[ 2]*z ; - GLfloat ty = m[4]*x + m[5]*y + m[ 6]*z ; - GLfloat tz = m[8]*x + m[9]*y + m[10]*z ; - - if (!lengths) { - GLfloat len = tx*tx + ty*ty + tz*tz; - if (len > 1e-20) { - scale = 1.0 / sqrt (len); /* hmmm, don't know how we */ - /* could test the precalcu- */ - /* lated length case ... */ - out[i][0] = tx * scale; - out[i][1] = ty * scale; - out[i][2] = tz * scale; - } else { - out[i][0] = out[i][1] = out[i][2] = 0; - } - } else { - scale = lengths [i];; - out[i][0] = tx * scale; - out[i][1] = ty * scale; - out[i][2] = tz * scale; - } - - s = (GLfloat *)((char *)s + in->stride); - } -} - - - -static int m_norm_identity[16] = { - ONE, NIL, NIL, NIL, - NIL, ONE, NIL, NIL, - NIL, NIL, ONE, NIL, - NIL, NIL, NIL, NIL -}; -static int m_norm_general[16] = { - VAR, VAR, VAR, NIL, - VAR, VAR, VAR, NIL, - VAR, VAR, VAR, NIL, - NIL, NIL, NIL, NIL -}; -static int m_norm_no_rot[16] = { - VAR, NIL, NIL, NIL, - NIL, VAR, NIL, NIL, - NIL, NIL, VAR, NIL, - NIL, NIL, NIL, NIL -}; -static int *norm_templates[8] = { - m_norm_no_rot, - m_norm_no_rot, - m_norm_no_rot, - m_norm_general, - m_norm_general, - m_norm_general, - m_norm_identity, - m_norm_identity -}; -static int norm_types[8] = { - NORM_TRANSFORM_NO_ROT, - NORM_TRANSFORM_NO_ROT | NORM_RESCALE, - NORM_TRANSFORM_NO_ROT | NORM_NORMALIZE, - NORM_TRANSFORM, - NORM_TRANSFORM | NORM_RESCALE, - NORM_TRANSFORM | NORM_NORMALIZE, - NORM_RESCALE, - NORM_NORMALIZE -}; -static int norm_scale_types[8] = { /* rescale factor */ - NIL, /* NIL disables rescaling */ - VAR, - NIL, - NIL, - VAR, - NIL, - VAR, - NIL -}; -static int norm_normalize_types[8] = { /* normalizing ?? (no = 0) */ - 0, - 0, - 1, - 0, - 0, - 1, - 0, - 1 -}; -static char *norm_strings[8] = { - "NORM_TRANSFORM_NO_ROT", - "NORM_TRANSFORM_NO_ROT | NORM_RESCALE", - "NORM_TRANSFORM_NO_ROT | NORM_NORMALIZE", - "NORM_TRANSFORM", - "NORM_TRANSFORM | NORM_RESCALE", - "NORM_TRANSFORM | NORM_NORMALIZE", - "NORM_RESCALE", - "NORM_NORMALIZE" -}; - - - - +/* ================================================================ + * Normal transformation tests + */ -static int test_norm_function( normal_func fn, int mtype, - int masked, long* cycles ) +static int test_norm_function( normal_func func, int mtype, + int masked, long *cycles ) { GLvector3f source[1], dest[1], dest2[1], ref[1], ref2[1]; GLmatrix mat[1]; - GLfloat s [TEST_COUNT][5], d [TEST_COUNT][3], r [TEST_COUNT][3]; - GLfloat d2 [TEST_COUNT][3], r2 [TEST_COUNT][3], length [TEST_COUNT]; + GLfloat s[TEST_COUNT][5], d[TEST_COUNT][3], r[TEST_COUNT][3]; + GLfloat d2[TEST_COUNT][3], r2[TEST_COUNT][3], length[TEST_COUNT]; GLfloat scale; - GLfloat *m = mat->m; + GLfloat *m; GLubyte mask[TEST_COUNT]; int i, j; #ifdef RUN_XFORM_BENCHMARK - int cycle_i; /* the counter for the benchmarks we run */ + int cycle_i; /* the counter for the benchmarks we run */ #endif (void) cycles; - mat->inv = mat->m; + mat->m = (GLfloat *) ALIGN_MALLOC( 16 * sizeof(GLfloat), 16 ); + mat->inv = m = mat->m; m[0] = 63.0; m[4] = 43.0; m[ 8] = 29.0; m[12] = 43.0; m[1] = 55.0; m[5] = 17.0; m[ 9] = 31.0; m[13] = 7.0; @@ -601,9 +732,9 @@ scale = 1.0F + rnd () * norm_scale_types[mtype]; - for (i = 0; i < 4; i++) { - for (j = 0; j < 4; j++) { - switch (norm_templates[mtype][i * 4 + j]) { + for ( i = 0 ; i < 4 ; i++ ) { + for ( j = 0 ; j < 4 ; j++ ) { + switch ( norm_templates[mtype][i * 4 + j] ) { case NIL: m[j * 4 + i] = 0.0; break; @@ -621,14 +752,16 @@ } } - for (i = 0; i < TEST_COUNT; ++i) { - mask[i] = i % 2; /* mask every 2nd element */ + for ( i = 0 ; i < TEST_COUNT ; i++ ) { + mask[i] = i % 2; /* mask every 2nd element */ d[i][0] = s[i][0] = d2[i][0] = 0.0; d[i][1] = s[i][1] = d2[i][1] = 0.0; d[i][2] = s[i][2] = d2[i][2] = 0.0; - for (j = 0; j < 3; j++) + for ( j = 0 ; j < 3 ; j++ ) s[i][j] = rnd(); - length[i] = 1 / sqrt(s[i][0]*s[i][0] + s[i][1]*s[i][1] + s[i][2]*s[i][2]); + length[i] = 1 / sqrt( s[i][0]*s[i][0] + + s[i][1]*s[i][1] + + s[i][2]*s[i][2] ); } source->data = (GLfloat(*)[3])s; @@ -661,138 +794,140 @@ ref2->stride = sizeof(float[3]); ref2->flags = 0; - if (norm_normalize_types [mtype] == 0) { - ref_norm_transform_rescale (mat, scale, source, NULL, NULL, ref); + if ( norm_normalize_types[mtype] == 0 ) { + ref_norm_transform_rescale( mat, scale, source, NULL, NULL, ref ); } else { - ref_norm_transform_normalize (mat, scale, source, NULL, NULL, ref); - ref_norm_transform_normalize (mat, scale, source, length, NULL, ref2); + ref_norm_transform_normalize( mat, scale, source, NULL, NULL, ref ); + ref_norm_transform_normalize( mat, scale, source, length, NULL, ref2 ); } - if (mesa_profile) { - if (masked) { - BEGIN_RACE (*cycles); - fn (mat, scale, source, NULL, mask, dest); - END_RACE (*cycles); - fn (mat, scale, source, length, mask, dest2); + if ( mesa_profile ) { + if ( masked ) { + BEGIN_RACE( *cycles ); + func( mat, scale, source, NULL, mask, dest ); + END_RACE( *cycles ); + func( mat, scale, source, length, mask, dest2 ); } else { - BEGIN_RACE (*cycles); - fn (mat, scale, source, NULL, NULL, dest); - END_RACE (*cycles); - fn (mat, scale, source, length, NULL, dest2); + BEGIN_RACE( *cycles ); + func( mat, scale, source, NULL, NULL, dest ); + END_RACE( *cycles ); + func( mat, scale, source, length, NULL, dest2 ); } } else { - if (masked) { - fn (mat, scale, source, NULL, mask, dest); - fn (mat, scale, source, length, mask, dest2); + if ( masked ) { + func( mat, scale, source, NULL, mask, dest ); + func( mat, scale, source, length, mask, dest2 ); } else { - fn (mat, scale, source, NULL, NULL, dest); - fn (mat, scale, source, length, NULL, dest2); + func( mat, scale, source, NULL, NULL, dest ); + func( mat, scale, source, length, NULL, dest2 ); } } - for (i = 0; i < TEST_COUNT; ++i) { - if (masked && !(mask[i] & 1)) + for ( i = 0 ; i < TEST_COUNT ; i++ ) { + if ( masked && !(mask[i] & 1) ) continue; - for (j = 0; j < 3; j++) { - if (significand_match (d[i][j], r[i][j]) < REQUIRED_PRECISION) { - printf("-----------------------------\n"); - printf ("(i = %i, j = %i)\n", i, j); - printf ("%f \t %f \t [ratio = %e - %i bit missed]\n", - d[i][0], r[i][0], r[i][0]/d[i][0], - MAX_PRECISION - significand_match (d[i][0], r[i][0])); - printf ("%f \t %f \t [ratio = %e - %i bit missed]\n", - d[i][1], r[i][1], r[i][1]/d[i][1], - MAX_PRECISION - significand_match (d[i][1], r[i][1])); - printf ("%f \t %f \t [ratio = %e - %i bit missed]\n", - d[i][2], r[i][2], r[i][2]/d[i][2], - MAX_PRECISION - significand_match (d[i][2], r[i][2])); + for ( j = 0 ; j < 3 ; j++ ) { + if ( significand_match( d[i][j], r[i][j] ) < REQUIRED_PRECISION ) { + printf( "-----------------------------\n" ); + printf( "(i = %i, j = %i)\n", i, j ); + printf( "%f \t %f \t [ratio = %e - %i bit missed]\n", + d[i][0], r[i][0], r[i][0]/d[i][0], + MAX_PRECISION - significand_match( d[i][0], r[i][0] ) ); + printf( "%f \t %f \t [ratio = %e - %i bit missed]\n", + d[i][1], r[i][1], r[i][1]/d[i][1], + MAX_PRECISION - significand_match( d[i][1], r[i][1] ) ); + printf( "%f \t %f \t [ratio = %e - %i bit missed]\n", + d[i][2], r[i][2], r[i][2]/d[i][2], + MAX_PRECISION - significand_match( d[i][2], r[i][2] ) ); return 0; } - if (norm_normalize_types [mtype] != 0) { - if (significand_match (d2[i][j], r2[i][j]) < REQUIRED_PRECISION) { - printf("------------------- precalculated length case ------\n"); - printf ("(i = %i, j = %i)\n", i, j); - printf ("%f \t %f \t [ratio = %e - %i bit missed]\n", - d2[i][0], r2[i][0], r2[i][0]/d2[i][0], - MAX_PRECISION - significand_match (d2[i][0],r2[i][0])); - printf ("%f \t %f \t [ratio = %e - %i bit missed]\n", - d2[i][1], r2[i][1], r2[i][1]/d2[i][1], - MAX_PRECISION - significand_match (d2[i][1],r2[i][1])); - printf ("%f \t %f \t [ratio = %e - %i bit missed]\n", - d2[i][2], r2[i][2], r2[i][2]/d2[i][2], - MAX_PRECISION - significand_match (d2[i][2],r2[i][2])); + if ( norm_normalize_types[mtype] != 0 ) { + if ( significand_match( d2[i][j], r2[i][j] ) < REQUIRED_PRECISION ) { + printf( "------------------- precalculated length case ------\n" ); + printf( "(i = %i, j = %i)\n", i, j ); + printf( "%f \t %f \t [ratio = %e - %i bit missed]\n", + d2[i][0], r2[i][0], r2[i][0]/d2[i][0], + MAX_PRECISION - significand_match( d2[i][0], r2[i][0] ) ); + printf( "%f \t %f \t [ratio = %e - %i bit missed]\n", + d2[i][1], r2[i][1], r2[i][1]/d2[i][1], + MAX_PRECISION - significand_match( d2[i][1], r2[i][1] ) ); + printf( "%f \t %f \t [ratio = %e - %i bit missed]\n", + d2[i][2], r2[i][2], r2[i][2]/d2[i][2], + MAX_PRECISION - significand_match( d2[i][2], r2[i][2] ) ); return 0; } } } } + + ALIGN_FREE( mat->m ); return 1; } - - void gl_test_all_normal_transform_functions( char *description ) { int masked; int mtype; - long benchmark_tab [0xf][0x4]; + long benchmark_tab[0xf][0x4]; static int first_time = 1; - - if (first_time) { + if ( first_time ) { first_time = 0; - mesa_profile = getenv("MESA_PROFILE"); + mesa_profile = getenv( "MESA_PROFILE" ); } #ifdef RUN_XFORM_BENCHMARK - if (mesa_profile) { - printf ("normal transform results after hooking in %s functions:\n", - description); + if ( mesa_profile ) { + if ( need_counter ) { + need_counter = 0; + INIT_COUNTER(); + printf( "counter overhead: %ld cycles\n\n", counter_overhead ); + } + printf( "normal transform results after hooking in %s functions:\n", + description ); } #endif - - for (masked = 0; masked <= 1; masked++) { + for ( masked = 0 ; masked <= 1 ; masked++ ) { int cma = masked ? CULL_MASK_ACTIVE : 0; char *cmastring = masked ? "CULL_MASK_ACTIVE" : "0"; #ifdef RUN_XFORM_BENCHMARK - if (mesa_profile) { - printf ("\n culling: %s \n", masked ? "CULL_MASK_ACTIVE" : "0"); - printf ("\n-------------------------------------------------------\n"); + if ( mesa_profile ) { + printf( "\n culling: %s \n", masked ? "CULL_MASK_ACTIVE" : "0" ); + printf( "\n-------------------------------------------------------\n" ); } #endif - for (mtype = 0; mtype < 8; mtype++) { - normal_func fn = gl_normal_tab [norm_types[mtype]][cma]; - long* cycles = &(benchmark_tab [mtype][cma]); + for ( mtype = 0 ; mtype < 8 ; mtype++ ) { + normal_func func = gl_normal_tab[norm_types[mtype]][cma]; + long *cycles = &(benchmark_tab[mtype][cma]); - if (test_norm_function (fn, mtype, masked, cycles) == 0 ) { + if ( test_norm_function( func, mtype, masked, cycles ) == 0 ) { char buf[100]; sprintf( buf, "gl_normal_tab[%s][%s] failed test (%s)", cmastring, norm_strings[mtype], description ); gl_problem( NULL, buf ); - } else { -/* printf("gl_normal_tab[%s][%s] passed test in %li cycles (%s)\n", - cmastring, norm_strings[mtype], - benchmark_tab [mtype][cma], description); -*/ } + } #ifdef RUN_XFORM_BENCHMARK - if (mesa_profile) { - printf (" %li\t", benchmark_tab [mtype][cma] ); - printf (" | [%s]\n", norm_strings[mtype] ); + if ( mesa_profile ) { + printf( " %li\t", benchmark_tab[mtype][cma] ); + printf( " | [%s]\n", norm_strings[mtype] ); } } - if (mesa_profile) { printf ("\n"); } + if ( mesa_profile ) + printf( "\n" ); #else } #endif } +#ifdef RUN_XFORM_BENCHMARK + if ( mesa_profile ) + fflush( stdout ); +#endif } - - -#endif /*DEBUG*/ +#endif /* DEBUG */ Index: xc/extras/Mesa/src/depth.c diff -u xc/extras/Mesa/src/depth.c:1.4 xc/extras/Mesa/src/depth.c:1.5 --- xc/extras/Mesa/src/depth.c:1.4 Fri Jun 16 20:02:08 2000 +++ xc/extras/Mesa/src/depth.c Mon Nov 13 18:30:43 2000 @@ -1457,14 +1457,14 @@ /* read from software depth buffer */ if (ctx->Visual->DepthBits <= 16) { const GLushort *zptr = Z_ADDRESS16( ctx, x, y ); - GLuint i; + GLint i; for (i = 0; i < n; i++) { depth[i] = zptr[i]; } } else { const GLuint *zptr = Z_ADDRESS32( ctx, x, y ); - GLuint i; + GLint i; for (i = 0; i < n; i++) { depth[i] = zptr[i]; } @@ -1529,14 +1529,14 @@ /* read from software depth buffer */ if (ctx->Visual->DepthBits <= 16) { const GLushort *zptr = Z_ADDRESS16( ctx, x, y ); - GLuint i; + GLint i; for (i = 0; i < n; i++) { depth[i] = (GLfloat) zptr[i] * scale; } } else { const GLuint *zptr = Z_ADDRESS32( ctx, x, y ); - GLuint i; + GLint i; for (i = 0; i < n; i++) { depth[i] = (GLfloat) zptr[i] * scale; } @@ -1545,7 +1545,7 @@ else if (ctx->Driver.ReadDepthSpan) { /* read from hardware depth buffer */ GLdepth d[MAX_WIDTH]; - GLuint i; + GLint i; assert(n <= MAX_WIDTH); (*ctx->Driver.ReadDepthSpan)( ctx, n, x, y, d ); for (i = 0; i < n; i++) { Index: xc/extras/Mesa/src/dlist.c diff -u xc/extras/Mesa/src/dlist.c:1.5 xc/extras/Mesa/src/dlist.c:1.8 --- xc/extras/Mesa/src/dlist.c:1.5 Fri Jun 16 20:02:08 2000 +++ xc/extras/Mesa/src/dlist.c Mon Nov 13 18:30:43 2000 @@ -4055,7 +4055,7 @@ break; case OPCODE_VERTEX_CASSETTE: { struct immediate *IM; - + if (ctx->NewState) gl_update_state(ctx); if (ctx->CompileCVAFlag) { @@ -4515,6 +4515,7 @@ break; case OPCODE_RECTF: (*ctx->Exec->Rectf)( n[1].f, n[2].f, n[3].f, n[4].f ); + FLUSH_VB( ctx, "dlist rectf" ); break; case OPCODE_RESET_HISTOGRAM: (*ctx->Exec->ResetHistogram)( n[1].e ); @@ -4968,8 +4969,6 @@ ctx->CurrentDispatch = ctx->Save; _glapi_set_dispatch( ctx->CurrentDispatch ); } - -/* RESET_IMMEDIATE( ctx ); */ } Index: xc/extras/Mesa/src/drawpix.c diff -u xc/extras/Mesa/src/drawpix.c:1.4 xc/extras/Mesa/src/drawpix.c:1.8 --- xc/extras/Mesa/src/drawpix.c:1.4 Fri Jun 16 20:02:09 2000 +++ xc/extras/Mesa/src/drawpix.c Mon Nov 13 18:30:44 2000 @@ -1,7 +1,7 @@ /* * Mesa 3-D graphics library - * Version: 3.3 + * Version: 3.4 * * Copyright (C) 1999-2000 Brian Paul All Rights Reserved. * @@ -121,10 +121,10 @@ && ctx->ColorMatrix.type == MATRIX_IDENTITY && !ctx->Pixel.ColorTableEnabled && !ctx->Pixel.PostColorMatrixColorTableEnabled + && !ctx->Pixel.PostConvolutionColorTableEnabled && !ctx->Pixel.MinMaxEnabled && !ctx->Pixel.HistogramEnabled && ctx->Pixel.IndexShift==0 && ctx->Pixel.IndexOffset==0 - && ctx->Pixel.MapColorFlag==0 && ctx->Texture.ReallyEnabled == 0 && unpack->Alignment==1 && !unpack->SwapBytes @@ -138,7 +138,7 @@ GLint skipRows = unpack->SkipRows; GLint rowLength; GLdepth zSpan[MAX_WIDTH]; /* only used when zooming */ - GLint zoomY0; + GLint zoomY0 = 0; if (unpack->RowLength > 0) rowLength = unpack->RowLength; @@ -171,14 +171,36 @@ drawHeight -= (destY + drawHeight - ctx->DrawBuffer->Ymax - 1); if (drawHeight <= 0) return GL_TRUE; + } + else if (ctx->Pixel.ZoomX==1.0F && ctx->Pixel.ZoomY==-1.0F) { + /* upside-down image */ + /* horizontal clipping */ + if (destX < ctx->DrawBuffer->Xmin) { + skipPixels += (ctx->DrawBuffer->Xmin - destX); + drawWidth -= (ctx->DrawBuffer->Xmin - destX); + destX = ctx->DrawBuffer->Xmin; + } + if (destX + drawWidth > ctx->DrawBuffer->Xmax) + drawWidth -= (destX + drawWidth - ctx->DrawBuffer->Xmax - 1); + if (drawWidth <= 0) + return GL_TRUE; - zoomY0 = 0; /* not used - silence compiler warning */ + /* vertical clipping */ + if (destY > ctx->DrawBuffer->Ymax) { + skipRows += (destY - ctx->DrawBuffer->Ymax - 1); + drawHeight -= (destY - ctx->DrawBuffer->Ymax - 1); + destY = ctx->DrawBuffer->Ymax + 1; + } + if (destY - drawHeight < ctx->DrawBuffer->Ymin) + drawHeight -= (ctx->DrawBuffer->Ymin - (destY - drawHeight)); + if (drawHeight <= 0) + return GL_TRUE; } else { /* setup array of fragment Z value to pass to zoom function */ GLdepth z = (GLdepth) (ctx->Current.RasterPos[2] * ctx->Visual->DepthMaxF); GLint i; - assert(drawWidth < MAX_WIDTH); + ASSERT(drawWidth < MAX_WIDTH); for (i=0; iPixel.MapColorFlag==0) { if (ctx->Visual->RGBAflag) { GLubyte *src = (GLubyte *) pixels + (skipRows * rowLength + skipPixels) * 4; @@ -204,17 +227,27 @@ GLint row; for (row=0; rowDriver.WriteRGBASpan)(ctx, drawWidth, destX, destY, - (void *) src, NULL); + (CONST GLubyte (*)[4]) src, NULL); src += rowLength * 4; destY++; } } + else if (ctx->Pixel.ZoomX==1.0F && ctx->Pixel.ZoomY==-1.0F) { + /* upside-down */ + GLint row; + for (row=0; rowDriver.WriteRGBASpan)(ctx, drawWidth, destX, destY, + (CONST GLubyte (*)[4]) src, NULL); + src += rowLength * 4; + } + } else { /* with zooming */ GLint row; for (row=0; rowPixel.MapColorFlag==0) { if (ctx->Visual->RGBAflag) { GLubyte *src = (GLubyte *) pixels + (skipRows * rowLength + skipPixels) * 3; @@ -230,17 +264,27 @@ GLint row; for (row=0; rowDriver.WriteRGBSpan)(ctx, drawWidth, destX, destY, - (void *) src, NULL); + (CONST GLubyte (*)[3]) src, NULL); src += rowLength * 3; destY++; } } + else if (ctx->Pixel.ZoomX==1.0F && ctx->Pixel.ZoomY==-1.0F) { + /* upside-down */ + GLint row; + for (row=0; rowDriver.WriteRGBSpan)(ctx, drawWidth, destX, destY, + (CONST GLubyte (*)[3]) src, NULL); + src += rowLength * 3; + } + } else { /* with zooming */ GLint row; for (row=0; rowPixel.MapColorFlag==0) { if (ctx->Visual->RGBAflag) { GLubyte *src = (GLubyte *) pixels + (skipRows * rowLength + skipPixels); if (ctx->Pixel.ZoomX==1.0F && ctx->Pixel.ZoomY==1.0F) { /* no zooming */ GLint row; - assert(drawWidth < MAX_WIDTH); + ASSERT(drawWidth < MAX_WIDTH); for (row=0; rowDriver.WriteRGBSpan)(ctx, drawWidth, destX, destY, - (void *) rgb, NULL); + (CONST GLubyte (*)[3]) rgb, NULL); src += rowLength; destY++; } } + else if (ctx->Pixel.ZoomX==1.0F && ctx->Pixel.ZoomY==-1.0F) { + /* upside-down */ + GLint row; + ASSERT(drawWidth < MAX_WIDTH); + for (row=0; rowDriver.WriteRGBSpan)(ctx, drawWidth, destX, destY, + (CONST GLubyte (*)[3]) rgb, NULL); + src += rowLength; + } + } else { /* with zooming */ GLint row; - assert(drawWidth < MAX_WIDTH); + ASSERT(drawWidth < MAX_WIDTH); for (row=0; rowPixel.MapColorFlag==0) { if (ctx->Visual->RGBAflag) { GLubyte *src = (GLubyte *) pixels + (skipRows * rowLength + skipPixels)*2; if (ctx->Pixel.ZoomX==1.0F && ctx->Pixel.ZoomY==1.0F) { /* no zooming */ GLint row; - assert(drawWidth < MAX_WIDTH); + ASSERT(drawWidth < MAX_WIDTH); for (row=0; rowDriver.WriteRGBASpan)(ctx, drawWidth, destX, destY, - (void *) rgba, NULL); + (CONST GLubyte (*)[4]) rgba, NULL); src += rowLength*2; destY++; } } + else if (ctx->Pixel.ZoomX==1.0F && ctx->Pixel.ZoomY==-1.0F) { + /* upside-down */ + GLint row; + ASSERT(drawWidth < MAX_WIDTH); + for (row=0; rowDriver.WriteRGBASpan)(ctx, drawWidth, destX, destY, + (CONST GLubyte (*)[4]) rgba, NULL); + src += rowLength*2; + } + } else { /* with zooming */ GLint row; - assert(drawWidth < MAX_WIDTH); + ASSERT(drawWidth < MAX_WIDTH); for (row=0; rowDriver.WriteRGBASpan)(ctx, drawWidth, destX, destY, - (const GLubyte (*)[4])rgba, + (CONST GLubyte (*)[4])rgba, NULL); src += rowLength; destY++; } return GL_TRUE; } + else if (ctx->Pixel.ZoomX==1.0F && ctx->Pixel.ZoomY==-1.0F) { + /* upside-down */ + GLint row; + for (row=0; rowDriver.WriteRGBASpan)(ctx, drawWidth, destX, destY, + (CONST GLubyte (*)[4])rgba, + NULL); + src += rowLength; + } + return GL_TRUE; + } else { /* with zooming */ GLint row; for (row=0; row MAX_WIDTH) ? MAX_WIDTH : width; - if (type != GL_UNSIGNED_BYTE + if (type != GL_BYTE && type != GL_UNSIGNED_BYTE - && type != GL_UNSIGNED_SHORT + && type != GL_SHORT && type != GL_UNSIGNED_SHORT + && type != GL_INT && type != GL_UNSIGNED_INT - && type != GL_UNSIGNED_INT && type != GL_FLOAT) { gl_error(ctx, GL_INVALID_ENUM, "glDrawPixels(type)"); return; @@ -549,8 +645,9 @@ GLint row; for (row = 0; row < height; row++, y++) { GLdepth zspan[MAX_WIDTH]; - const GLushort *zptr = _mesa_image_address(&ctx->Unpack, - pixels, width, height, GL_DEPTH_COMPONENT, type, 0, row, 0); + const GLushort *zptr = (const GLushort *) + _mesa_image_address(&ctx->Unpack, pixels, width, height, + GL_DEPTH_COMPONENT, type, 0, row, 0); GLint i; for (i = 0; i < width; i++) zspan[i] = zptr[i]; @@ -562,8 +659,9 @@ /* Special case: directly write 32-bit depth values */ GLint row; for (row = 0; row < height; row++, y++) { - const GLuint *zptr = _mesa_image_address(&ctx->Unpack, - pixels, width, height, GL_DEPTH_COMPONENT, type, 0, row, 0); + const GLuint *zptr = (const GLuint *) + _mesa_image_address(&ctx->Unpack, pixels, width, height, + GL_DEPTH_COMPONENT, type, 0, row, 0); gl_write_rgba_span( ctx, width, x, y, zptr, rgba, GL_BITMAP ); } } @@ -579,7 +677,7 @@ if (ctx->Visual->RGBAflag) { if (zoom) { gl_write_zoomed_rgba_span(ctx, width, x, y, zspan, - (const GLubyte (*)[4])rgba, desty); + (CONST GLubyte (*)[4])rgba, desty); } else { gl_write_rgba_span(ctx, width, x, y, zspan, rgba, GL_BITMAP); @@ -614,6 +712,11 @@ GLdepth zspan[MAX_WIDTH]; GLboolean quickDraw; + if (!_mesa_is_legal_format_and_type(format, type)) { + gl_error(ctx, GL_INVALID_ENUM, "glDrawPixels(format or type)"); + return; + } + /* Try an optimized glDrawPixels first */ if (simple_DrawPixels(ctx, x, y, width, height, format, type, pixels)) return; @@ -650,29 +753,35 @@ for (row = 0; row < height; row++, y++) { const GLvoid *source = _mesa_image_address(unpack, pixels, width, height, format, type, 0, row, 0); - _mesa_unpack_ubyte_color_span(ctx, width, GL_RGBA, (void*) rgba, - format, type, source, unpack, GL_TRUE); - if (ctx->Pixel.MinMaxEnabled && ctx->MinMax.Sink) + _mesa_unpack_ubyte_color_span(ctx, width, GL_RGBA, + (GLubyte *) rgba, format, type, source, unpack, GL_TRUE); + if ((ctx->Pixel.MinMaxEnabled && ctx->MinMax.Sink) || + (ctx->Pixel.HistogramEnabled && ctx->Histogram.Sink)) continue; if (ctx->Texture.ReallyEnabled && ctx->Pixel.PixelTextureEnabled) { GLfloat s[MAX_WIDTH], t[MAX_WIDTH], r[MAX_WIDTH], q[MAX_WIDTH]; + GLubyte primary_rgba[MAX_WIDTH][4]; GLuint unit; /* XXX not sure how multitexture is supposed to work here */ + + MEMCPY(primary_rgba, rgba, 4 * width * sizeof(GLubyte)); + for (unit = 0; unit < MAX_TEXTURE_UNITS; unit++) { - _mesa_pixeltexgen(ctx, width, (const GLubyte (*)[4]) rgba, + _mesa_pixeltexgen(ctx, width, (CONST GLubyte (*)[4]) rgba, s, t, r, q); - gl_texture_pixels(ctx, unit, width, s, t, r, NULL, rgba); + gl_texture_pixels(ctx, unit, width, s, t, r, NULL, + primary_rgba, rgba); } } if (quickDraw) { (*ctx->Driver.WriteRGBASpan)( ctx, width, x, y, - (CONST GLubyte (*)[]) rgba, NULL); + (CONST GLubyte (*)[4]) rgba, NULL); } else if (zoom) { gl_write_zoomed_rgba_span( ctx, width, x, y, zspan, - (CONST GLubyte (*)[]) rgba, desty ); + (CONST GLubyte (*)[4]) rgba, desty ); } else { gl_write_rgba_span( ctx, (GLuint) width, x, y, zspan, rgba, GL_BITMAP); @@ -715,6 +824,7 @@ return; } + RENDER_START(ctx); switch (format) { case GL_STENCIL_INDEX: draw_stencil_pixels( ctx, x, y, width, height, type, pixels ); @@ -743,8 +853,8 @@ break; default: gl_error( ctx, GL_INVALID_ENUM, "glDrawPixels(format)" ); - return; } + RENDER_FINISH(ctx); } else if (ctx->RenderMode==GL_FEEDBACK) { if (ctx->Current.RasterPosValid) { Index: xc/extras/Mesa/src/enable.c diff -u xc/extras/Mesa/src/enable.c:1.4 xc/extras/Mesa/src/enable.c:1.6 --- xc/extras/Mesa/src/enable.c:1.4 Fri Jun 16 20:02:09 2000 +++ xc/extras/Mesa/src/enable.c Thu Nov 30 10:39:03 2000 @@ -1,9 +1,9 @@ /* * Mesa 3-D graphics library - * Version: 3.3 + * Version: 3.4 * - * Copyright (C) 1999 Brian Paul All Rights Reserved. + * Copyright (C) 1999-2000 Brian Paul All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), @@ -284,12 +284,14 @@ case GL_POINT_SMOOTH: if (ctx->Point.SmoothFlag!=state) { ctx->Point.SmoothFlag = state; + ctx->TriangleCaps ^= DD_POINT_SMOOTH; ctx->NewState |= NEW_RASTER_OPS; } break; case GL_POLYGON_SMOOTH: if (ctx->Polygon.SmoothFlag!=state) { ctx->Polygon.SmoothFlag = state; + ctx->TriangleCaps ^= DD_TRI_SMOOTH; ctx->NewState |= NEW_RASTER_OPS; } break; @@ -349,48 +351,39 @@ case GL_TEXTURE_1D: if (ctx->Visual->RGBAflag) { const GLuint curr = ctx->Texture.CurrentUnit; - const GLuint flag = TEXTURE0_1D << (curr * 4); struct gl_texture_unit *texUnit = &ctx->Texture.Unit[curr]; ctx->NewState |= NEW_TEXTURE_ENABLE; if (state) { texUnit->Enabled |= TEXTURE0_1D; - ctx->Enabled |= flag; } else { texUnit->Enabled &= ~TEXTURE0_1D; - ctx->Enabled &= ~flag; } } break; case GL_TEXTURE_2D: if (ctx->Visual->RGBAflag) { const GLuint curr = ctx->Texture.CurrentUnit; - const GLuint flag = TEXTURE0_2D << (curr * 4); struct gl_texture_unit *texUnit = &ctx->Texture.Unit[curr]; ctx->NewState |= NEW_TEXTURE_ENABLE; if (state) { texUnit->Enabled |= TEXTURE0_2D; - ctx->Enabled |= flag; } else { texUnit->Enabled &= ~TEXTURE0_2D; - ctx->Enabled &= ~flag; } } break; case GL_TEXTURE_3D: if (ctx->Visual->RGBAflag) { const GLuint curr = ctx->Texture.CurrentUnit; - const GLuint flag = TEXTURE0_3D << (curr * 4); struct gl_texture_unit *texUnit = &ctx->Texture.Unit[curr]; ctx->NewState |= NEW_TEXTURE_ENABLE; if (state) { texUnit->Enabled |= TEXTURE0_3D; - ctx->Enabled |= flag; } else { texUnit->Enabled &= ~TEXTURE0_3D; - ctx->Enabled &= ~flag; } } break; @@ -439,22 +432,46 @@ * CLIENT STATE!!! */ case GL_VERTEX_ARRAY: +#ifdef VAO + ctx->Array.Current->Vertex.Enabled = state; +#else ctx->Array.Vertex.Enabled = state; +#endif break; case GL_NORMAL_ARRAY: +#ifdef VAO + ctx->Array.Current->Normal.Enabled = state; +#else ctx->Array.Normal.Enabled = state; +#endif break; case GL_COLOR_ARRAY: +#ifdef VAO + ctx->Array.Current->Color.Enabled = state; +#else ctx->Array.Color.Enabled = state; +#endif break; case GL_INDEX_ARRAY: +#ifdef VAO + ctx->Array.Current->Index.Enabled = state; +#else ctx->Array.Index.Enabled = state; +#endif break; case GL_TEXTURE_COORD_ARRAY: +#ifdef VAO + ctx->Array.Current->TexCoord[ctx->Array.ActiveTexture].Enabled = state; +#else ctx->Array.TexCoord[ctx->Array.ActiveTexture].Enabled = state; +#endif break; case GL_EDGE_FLAG_ARRAY: +#ifdef VAO + ctx->Array.Current->EdgeFlag.Enabled = state; +#else ctx->Array.EdgeFlag.Enabled = state; +#endif break; /* GL_HP_occlusion_test */ @@ -510,35 +527,24 @@ if (ctx->Extensions.HaveTextureCubeMap) { if (ctx->Visual->RGBAflag) { const GLuint curr = ctx->Texture.CurrentUnit; - const GLuint flag = TEXTURE0_CUBE << (curr * 4); struct gl_texture_unit *texUnit = &ctx->Texture.Unit[curr]; ctx->NewState |= NEW_TEXTURE_ENABLE; if (state) { texUnit->Enabled |= TEXTURE0_CUBE; - ctx->Enabled |= flag; } else { texUnit->Enabled &= ~TEXTURE0_CUBE; - ctx->Enabled &= ~flag; } } } else { - if (state) - gl_error(ctx, GL_INVALID_ENUM, "glEnable"); - else - gl_error(ctx, GL_INVALID_ENUM, "glDisable"); + gl_error(ctx, GL_INVALID_ENUM, state ? "glEnable" : "glDisable"); return; } break; default: - if (state) { - gl_error( ctx, GL_INVALID_ENUM, "glEnable" ); - } - else { - gl_error( ctx, GL_INVALID_ENUM, "glDisable" ); - } + gl_error(ctx, GL_INVALID_ENUM, state ? "glEnable" : "glDisable"); return; } @@ -718,17 +724,41 @@ * CLIENT STATE!!! */ case GL_VERTEX_ARRAY: +#ifdef VAO + return ctx->Array.Current->Vertex.Enabled; +#else return ctx->Array.Vertex.Enabled; +#endif case GL_NORMAL_ARRAY: +#ifdef VAO + return ctx->Array.Current->Normal.Enabled; +#else return ctx->Array.Normal.Enabled; +#endif case GL_COLOR_ARRAY: +#ifdef VAO + return ctx->Array.Current->Color.Enabled; +#else return ctx->Array.Color.Enabled; +#endif case GL_INDEX_ARRAY: +#ifdef VAO + return ctx->Array.Current->Index.Enabled; +#else return ctx->Array.Index.Enabled; +#endif case GL_TEXTURE_COORD_ARRAY: +#ifdef VAO + return ctx->Array.Current->TexCoord[ctx->Array.ActiveTexture].Enabled; +#else return ctx->Array.TexCoord[ctx->Array.ActiveTexture].Enabled; +#endif case GL_EDGE_FLAG_ARRAY: +#ifdef VAO + return ctx->Array.Current->EdgeFlag.Enabled; +#else return ctx->Array.EdgeFlag.Enabled; +#endif /* GL_HP_occlusion_test */ case GL_OCCLUSION_TEST_HP: @@ -794,22 +824,46 @@ switch (cap) { case GL_VERTEX_ARRAY: +#ifdef VAO + ctx->Array.Current->Vertex.Enabled = state; +#else ctx->Array.Vertex.Enabled = state; +#endif break; case GL_NORMAL_ARRAY: +#ifdef VAO + ctx->Array.Current->Normal.Enabled = state; +#else ctx->Array.Normal.Enabled = state; +#endif break; case GL_COLOR_ARRAY: +#ifdef VAO + ctx->Array.Current->Color.Enabled = state; +#else ctx->Array.Color.Enabled = state; +#endif break; case GL_INDEX_ARRAY: +#ifdef VAO + ctx->Array.Current->Index.Enabled = state; +#else ctx->Array.Index.Enabled = state; +#endif break; case GL_TEXTURE_COORD_ARRAY: +#ifdef VAO + ctx->Array.Current->TexCoord[ctx->Array.ActiveTexture].Enabled = state; +#else ctx->Array.TexCoord[ctx->Array.ActiveTexture].Enabled = state; +#endif break; case GL_EDGE_FLAG_ARRAY: +#ifdef VAO + ctx->Array.Current->EdgeFlag.Enabled = state; +#else ctx->Array.EdgeFlag.Enabled = state; +#endif break; default: gl_error( ctx, GL_INVALID_ENUM, "glEnable/DisableClientState" ); Index: xc/extras/Mesa/src/enums.c diff -u xc/extras/Mesa/src/enums.c:1.4 xc/extras/Mesa/src/enums.c:1.7 --- xc/extras/Mesa/src/enums.c:1.4 Fri Jun 16 20:02:09 2000 +++ xc/extras/Mesa/src/enums.c Mon Nov 13 18:30:44 2000 @@ -804,8 +804,31 @@ { "GL_ARRAY_ELEMENT_LOCK_COUNT_EXT", 0x81A9}, /* GL_EXT_clip_volume_hint */ - { "GL_CLIP_VOLUME_CLIPPING_HINT_EXT", 0x80F0} + { "GL_CLIP_VOLUME_CLIPPING_HINT_EXT", 0x80F0}, + /* GL_EXT_texture_env_combine */ + { "GL_COMBINE_EXT", 0x8570 }, + { "GL_COMBINE_RGB_EXT", 0x8571 }, + { "GL_COMBINE_ALPHA_EXT", 0x8572 }, + { "GL_SOURCE0_RGB_EXT", 0x8580 }, + { "GL_SOURCE1_RGB_EXT", 0x8581 }, + { "GL_SOURCE2_RGB_EXT", 0x8582 }, + { "GL_SOURCE0_ALPHA_EXT", 0x8588 }, + { "GL_SOURCE1_ALPHA_EXT", 0x8589 }, + { "GL_SOURCE2_ALPHA_EXT", 0x858A }, + { "GL_OPERAND0_RGB_EXT", 0x8590 }, + { "GL_OPERAND1_RGB_EXT", 0x8591 }, + { "GL_OPERAND2_RGB_EXT", 0x8592 }, + { "GL_OPERAND0_ALPHA_EXT", 0x8598 }, + { "GL_OPERAND1_ALPHA_EXT", 0x8599 }, + { "GL_OPERAND2_ALPHA_EXT", 0x859A }, + { "GL_RGB_SCALE_EXT", 0x8573 }, + { "GL_ADD_SIGNED_EXT", 0x8574 }, + { "GL_INTERPOLATE_EXT", 0x8575 }, + { "GL_CONSTANT_EXT", 0x8576 }, + { "GL_PRIMARY_COLOR_EXT", 0x8577 }, + { "GL_PREVIOUS_EXT", 0x8578 } + }; #define Elements(x) sizeof(x)/sizeof(*x) @@ -831,7 +854,7 @@ static void sort_enums( void ) { - int i; + GLuint i; index1 = (enum_elt **)MALLOC( Elements(all_enums) * sizeof(enum_elt *) ); sorted = 1; Index: xc/extras/Mesa/src/eval.c diff -u xc/extras/Mesa/src/eval.c:1.3 xc/extras/Mesa/src/eval.c:1.6 --- xc/extras/Mesa/src/eval.c:1.3 Tue Feb 15 02:12:12 2000 +++ xc/extras/Mesa/src/eval.c Mon Nov 13 18:30:44 2000 @@ -109,8 +109,8 @@ horner_bezier_curve(const GLfloat *cp, GLfloat *out, GLfloat t, GLuint dim, GLuint order) { - GLfloat s, powert; - GLuint i, k, bincoeff; + GLfloat s, powert, bincoeff; + GLuint i, k; if(order >= 2) { @@ -161,8 +161,8 @@ { if(uorder >= 2) { - GLfloat s, poweru; - GLuint j, k, bincoeff; + GLfloat s, poweru, bincoeff; + GLuint j, k; /* Compute the control polygon for the surface-curve in u-direction */ for(j=0; jEval.Map1Color4 && any_eval1) VB->ColorPtr = eval1_color( out_color, coord, flags, IM->Start, - &ctx->EvalMap.Map1Color4 ); + &ctx->EvalMap.Map1Color4 ); if (ctx->Eval.Map2Color4 && any_eval2) VB->ColorPtr = eval2_color( out_color, coord, flags, IM->Start, @@ -2481,8 +2481,9 @@ VB->NormalPtr = eval2_norm( out_normal, coord, flags, IM->Start, &ctx->EvalMap.Map2Normal ); + new_flags |= VERT_NORM; + if (VB->NormalPtr != in_normal) { - new_flags |= VERT_NORM; if (!all_eval) VB->NormalPtr = copy_3f( out_normal, in_normal, flags, IM->Start ); } @@ -2550,26 +2551,42 @@ } if (any_eval2) { + GLvector3f *in_normal = VB->NormalPtr; + GLvector3f *out_normal = &IM->v.Normal; + if (ctx->Eval.Map2Vertex4) { - if (ctx->Eval.AutoNormal && (req & VERT_NORM)) - obj = eval2_obj_norm( out, VB->NormalPtr, coord, flags, IM->Start, - 4, &ctx->EvalMap.Map2Vertex4 ); + if (ctx->Eval.AutoNormal && (req & VERT_NORM)) { + obj = eval2_obj_norm( out, out_normal, coord, flags, + IM->Start, 4, &ctx->EvalMap.Map2Vertex4 ); + VB->NormalPtr = out_normal; + new_flags |= VERT_NORM; + } else obj = eval2_4f( out, coord, flags, IM->Start, - 4, &ctx->EvalMap.Map2Vertex4); + 4, &ctx->EvalMap.Map2Vertex4 ); } else if (ctx->Eval.Map2Vertex3) { - if (ctx->Eval.AutoNormal && (req & VERT_NORM)) - obj = eval2_obj_norm( out, VB->NormalPtr, coord, flags, IM->Start, - 3, &ctx->EvalMap.Map2Vertex3 ); + if (ctx->Eval.AutoNormal && (req & VERT_NORM)) { + obj = eval2_obj_norm( out, out_normal, coord, flags, + IM->Start, 3, &ctx->EvalMap.Map2Vertex3 ); + VB->NormalPtr = out_normal; + new_flags |= VERT_NORM; + } else obj = eval2_4f( out, coord, flags, IM->Start, 3, &ctx->EvalMap.Map2Vertex3 ); } - } + + if (VB->NormalPtr != in_normal) { + if (!all_eval) + VB->NormalPtr = copy_3f( out_normal, in_normal, flags, + IM->Start ); + } + } + if (obj != in && !all_eval) obj = copy_4f( out, in, flags, IM->Start ); @@ -2581,6 +2598,7 @@ GLuint *flags = VB->Flag = VB->EvaluatedFlags; GLuint i; GLuint count = VB->Count; + GLuint andflag = VB->IM->AndFlag; if (!flags) { VB->EvaluatedFlags = (GLuint *) MALLOC(VB->Size * sizeof(GLuint)); @@ -2588,16 +2606,21 @@ } if (all_eval) { - for (i = 0 ; i < count ; i++) + for (i = 0 ; i <= count ; i++) flags[i] = oldflags[i] | new_flags; + andflag |= new_flags; } else { - GLuint andflag = ~0; - for (i = 0 ; i < count ; i++) { - if (oldflags[i] & VERT_EVAL_ANY) - flags[i] = oldflags[i] | new_flags; + andflag = ~0; + for (i = 0 ; i <= count ; i++) { + flags[i] = oldflags[i]; + if (flags[i] & VERT_EVAL_ANY) + flags[i] |= new_flags; andflag &= flags[i]; } } + + VB->OrFlag |= new_flags; + VB->CullMode = (GLubyte) ((andflag & VERT_NORM) ? 0 : COMPACTED_NORMALS); } } Index: xc/extras/Mesa/src/extensions.c diff -u xc/extras/Mesa/src/extensions.c:1.5 xc/extras/Mesa/src/extensions.c:1.8 --- xc/extras/Mesa/src/extensions.c:1.5 Fri Jun 16 20:02:09 2000 +++ xc/extras/Mesa/src/extensions.c Mon Nov 13 18:30:45 2000 @@ -1,7 +1,7 @@ /* * Mesa 3-D graphics library - * Version: 3.3 + * Version: 3.4 * * Copyright (C) 1999-2000 Brian Paul All Rights Reserved. * @@ -50,7 +50,7 @@ static struct { int enabled; const char *name; } default_extensions[] = { { DEFAULT_OFF, "GL_ARB_imaging" }, /* in progress */ { DEFAULT_ON, "GL_ARB_multitexture" }, - { DEFAULT_OFF, "GL_ARB_texture_compression" }, /* in progress */ + { DEFAULT_OFF, "GL_ARB_texture_compression" }, { DEFAULT_OFF, "GL_ARB_texture_cube_map" }, /* in progress */ { ALWAYS_ENABLED, "GL_ARB_tranpose_matrix" }, { ALWAYS_ENABLED, "GL_EXT_abgr" }, @@ -74,6 +74,7 @@ { DEFAULT_OFF, "GL_EXT_texture_compression_s3tc" }, { DEFAULT_OFF, "GL_EXT_texture_env" }, { DEFAULT_ON, "GL_EXT_texture_env_add" }, + { DEFAULT_OFF, "GL_EXT_texture_env_combine" }, { ALWAYS_ENABLED, "GL_EXT_texture_object" }, { DEFAULT_ON, "GL_EXT_texture_lod_bias" }, { ALWAYS_ENABLED, "GL_EXT_vertex_array" }, @@ -102,6 +103,7 @@ { /* Update flags */ ctx->Extensions.HaveTextureEnvAdd = gl_extension_is_enabled(ctx, "GL_EXT_texture_env_add"); + ctx->Extensions.HaveTextureEnvCombine = gl_extension_is_enabled(ctx, "GL_EXT_texture_env_combine"); ctx->Extensions.HaveTextureLodBias = gl_extension_is_enabled(ctx, "GL_EXT_texture_lod_bias"); ctx->Extensions.HaveHpOcclusionTest = gl_extension_is_enabled(ctx, "GL_HP_occlusion_test"); ctx->Extensions.HaveTextureCubeMap = gl_extension_is_enabled(ctx, "GL_ARB_texture_cube_map"); Index: xc/extras/Mesa/src/feedback.c diff -u xc/extras/Mesa/src/feedback.c:1.4 xc/extras/Mesa/src/feedback.c:1.5 --- xc/extras/Mesa/src/feedback.c:1.4 Fri Jun 16 20:02:09 2000 +++ xc/extras/Mesa/src/feedback.c Mon Nov 13 18:30:45 2000 @@ -238,7 +238,7 @@ const struct vertex_buffer *VB = ctx->VB; GLuint i; - for (i=first;i<=last;i++) { + for (i=first;iClipMask[i]==0) { FEEDBACK_TOKEN( ctx, (GLfloat) (GLint) GL_POINT_TOKEN ); feedback_vertex( ctx, i, i ); Index: xc/extras/Mesa/src/fog.c diff -u xc/extras/Mesa/src/fog.c:1.6 xc/extras/Mesa/src/fog.c:1.10 --- xc/extras/Mesa/src/fog.c:1.6 Fri Jun 16 20:02:09 2000 +++ xc/extras/Mesa/src/fog.c Mon Nov 13 18:30:46 2000 @@ -1,7 +1,7 @@ /* * Mesa 3-D graphics library - * Version: 3.3 + * Version: 3.4 * * Copyright (C) 1999-2000 Brian Paul All Rights Reserved. * @@ -330,7 +330,7 @@ GLfloat eyez = d / (c+ndcz); GLfloat f, g; GLfloat tmp = negDensitySquared * eyez * eyez; -#ifdef __alpha__ +#if defined(__alpha__) || defined(__alpha) /* XXX this underflow check may be needed for other systems */ if (tmp < FLT_MIN_10_EXP) f = exp( FLT_MIN_10_EXP ); @@ -409,7 +409,7 @@ if (eyez < 0.0) eyez = -eyez; tmp = negDensitySquared * eyez * eyez; -#ifdef __alpha__ +#if defined(__alpha__) || defined(__alpha) /* XXX this underflow check may be needed for other systems */ if (tmp < FLT_MIN_10_EXP) f = exp( FLT_MIN_10_EXP ); @@ -426,4 +426,3 @@ return; } } - Index: xc/extras/Mesa/src/fog_tmp.h diff -u xc/extras/Mesa/src/fog_tmp.h:1.4 xc/extras/Mesa/src/fog_tmp.h:1.5 --- xc/extras/Mesa/src/fog_tmp.h:1.4 Fri Jun 16 20:02:10 2000 +++ xc/extras/Mesa/src/fog_tmp.h Mon Nov 13 16:55:33 2000 @@ -1,9 +1,9 @@ /* * Mesa 3-D graphics library - * Version: 3.1 + * Version: 3.4 * - * Copyright (C) 1999 Brian Paul All Rights Reserved. + * Copyright (C) 1999-2000 Brian Paul All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), @@ -193,9 +193,6 @@ - - - static void TAG(fog_rgba_vertices)( struct vertex_buffer *VB, GLuint side, GLubyte flag) @@ -226,7 +223,6 @@ VB->ColorPtr = VB->Color[0]; out = (GLubyte (*)[4])VB->Color[side]->start; - if (VB->EyePtr->size > 2) { switch (ctx->Fog.Mode) { case GL_LINEAR: @@ -234,12 +230,17 @@ for ( i = 0 ; i < n ; i++, STRIDE_F(v, stride), in += in_stride) { CULLCHECK { GLfloat f = (end - ABSF(v[2])) * d; - if (f >= 1.0) continue; - if (f < 0) { + if (f >= 1.0) { + out[i][0] = in[0]; + out[i][1] = in[1]; + out[i][2] = in[2]; + } + else if (f <= 0.0) { CLAMPED_FLOAT_COLOR_TO_UBYTE_COLOR(out[i][0], rFog); CLAMPED_FLOAT_COLOR_TO_UBYTE_COLOR(out[i][1], gFog); CLAMPED_FLOAT_COLOR_TO_UBYTE_COLOR(out[i][2], bFog); - } else { + } + else { t = f * UBYTE_COLOR_TO_FLOAT_COLOR(in[0]) + (1.0F-f)*rFog; CLAMPED_FLOAT_COLOR_TO_UBYTE_COLOR(out[i][0], t); @@ -293,27 +294,40 @@ return; } } - else if (ctx->Fog.Mode == GL_LINEAR) - { - /* 2-vector vertices */ - GLubyte r,g,b; - GLfloat f = ctx->Fog.End * (ctx->Fog.End - ctx->Fog.Start); - CLAMP_FLOAT_COLOR( f ); - f = 1.0 - f; - rFog *= f; - bFog *= f; - gFog *= f; - - CLAMPED_FLOAT_COLOR_TO_UBYTE_COLOR(r, rFog); - CLAMPED_FLOAT_COLOR_TO_UBYTE_COLOR(g, gFog); - CLAMPED_FLOAT_COLOR_TO_UBYTE_COLOR(b, bFog); - - for (i = 0 ; i < n ; i++) { - /* CULLCHECK */ { - out[i][0] = r; - out[i][1] = g; - out[i][2] = b; - } + else { + /* All vertex Z coordinates are zero */ + if (ctx->Fog.Mode == GL_LINEAR) { + /* 2-vector vertices */ + GLubyte r,g,b; + GLfloat f = ctx->Fog.End * (ctx->Fog.End - ctx->Fog.Start); + CLAMP_FLOAT_COLOR( f ); + f = 1.0 - f; + rFog *= f; + bFog *= f; + gFog *= f; + + CLAMPED_FLOAT_COLOR_TO_UBYTE_COLOR(r, rFog); + CLAMPED_FLOAT_COLOR_TO_UBYTE_COLOR(g, gFog); + CLAMPED_FLOAT_COLOR_TO_UBYTE_COLOR(b, bFog); + + for (i = 0 ; i < n ; i++) { + /* CULLCHECK */ { + out[i][0] = r; + out[i][1] = g; + out[i][2] = b; + } + } + } + else { + /* EXP or EXP2 mode */ + /* f = exp(d*z*z) or f = exp(d*|z|) is one. Copy in color to out */ + for ( i = 0 ; i < n ; i++, STRIDE_F(v,stride), in += in_stride) { + /* CULLCHECK */ { + out[i][0] = in[0]; + out[i][1] = in[1]; + out[i][2] = in[2]; + } + } } } } Index: xc/extras/Mesa/src/get.c diff -u xc/extras/Mesa/src/get.c:1.5 xc/extras/Mesa/src/get.c:1.9 --- xc/extras/Mesa/src/get.c:1.5 Fri Jun 16 20:02:10 2000 +++ xc/extras/Mesa/src/get.c Thu Nov 30 10:39:04 2000 @@ -1,7 +1,7 @@ /* * Mesa 3-D graphics library - * Version: 3.3 + * Version: 3.4 * * Copyright (C) 1999-2000 Brian Paul All Rights Reserved. * @@ -91,9 +91,16 @@ ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx, "glGetBooleanv"); + if (!params) + return; + if (MESA_VERBOSE & VERBOSE_API) fprintf(stderr, "glGetBooleanv %s\n", gl_lookup_enum_by_nr(pname)); + if (ctx->Driver.GetBooleanv + && (*ctx->Driver.GetBooleanv)(ctx, pname, params)) + return; + switch (pname) { case GL_ACCUM_RED_BITS: *params = INT_TO_BOOL(ctx->Visual->AccumRedBits); @@ -867,79 +874,159 @@ *params = FLOAT_TO_BOOL(ctx->Pixel.ZoomY); break; case GL_VERTEX_ARRAY: +#ifdef VAO + *params = ctx->Array.Current->Vertex.Enabled; +#else *params = ctx->Array.Vertex.Enabled; +#endif break; case GL_VERTEX_ARRAY_SIZE: +#ifdef VAO + *params = INT_TO_BOOL(ctx->Array.Current->Vertex.Size); +#else *params = INT_TO_BOOL(ctx->Array.Vertex.Size); +#endif break; case GL_VERTEX_ARRAY_TYPE: +#ifdef VAO + *params = ENUM_TO_BOOL(ctx->Array.Current->Vertex.Type); +#else *params = ENUM_TO_BOOL(ctx->Array.Vertex.Type); +#endif break; case GL_VERTEX_ARRAY_STRIDE: +#ifdef VAO + *params = INT_TO_BOOL(ctx->Array.Current->Vertex.Stride); +#else *params = INT_TO_BOOL(ctx->Array.Vertex.Stride); +#endif break; case GL_VERTEX_ARRAY_COUNT_EXT: *params = INT_TO_BOOL(0); break; case GL_NORMAL_ARRAY: +#ifdef VAO + *params = ctx->Array.Current->Normal.Enabled; +#else *params = ctx->Array.Normal.Enabled; +#endif break; case GL_NORMAL_ARRAY_TYPE: +#ifdef VAO + *params = ENUM_TO_BOOL(ctx->Array.Current->Normal.Type); +#else *params = ENUM_TO_BOOL(ctx->Array.Normal.Type); +#endif break; case GL_NORMAL_ARRAY_STRIDE: +#ifdef VAO + *params = INT_TO_BOOL(ctx->Array.Current->Normal.Stride); +#else *params = INT_TO_BOOL(ctx->Array.Normal.Stride); +#endif break; case GL_NORMAL_ARRAY_COUNT_EXT: *params = INT_TO_BOOL(0); break; case GL_COLOR_ARRAY: +#ifdef VAO + *params = ctx->Array.Current->Color.Enabled; +#else *params = ctx->Array.Color.Enabled; +#endif break; case GL_COLOR_ARRAY_SIZE: +#ifdef VAO + *params = INT_TO_BOOL(ctx->Array.Current->Color.Size); +#else *params = INT_TO_BOOL(ctx->Array.Color.Size); +#endif break; case GL_COLOR_ARRAY_TYPE: +#ifdef VAO + *params = ENUM_TO_BOOL(ctx->Array.Current->Color.Type); +#else *params = ENUM_TO_BOOL(ctx->Array.Color.Type); +#endif break; case GL_COLOR_ARRAY_STRIDE: +#ifdef VAO + *params = INT_TO_BOOL(ctx->Array.Current->Color.Stride); +#else *params = INT_TO_BOOL(ctx->Array.Color.Stride); +#endif break; case GL_COLOR_ARRAY_COUNT_EXT: *params = INT_TO_BOOL(0); break; case GL_INDEX_ARRAY: +#ifdef VAO + *params = ctx->Array.Current->Index.Enabled; +#else *params = ctx->Array.Index.Enabled; +#endif break; case GL_INDEX_ARRAY_TYPE: +#ifdef VAO + *params = ENUM_TO_BOOL(ctx->Array.Current->Index.Type); +#else *params = ENUM_TO_BOOL(ctx->Array.Index.Type); +#endif break; case GL_INDEX_ARRAY_STRIDE: +#ifdef VAO + *params = INT_TO_BOOL(ctx->Array.Current->Index.Stride); +#else *params = INT_TO_BOOL(ctx->Array.Index.Stride); +#endif break; case GL_INDEX_ARRAY_COUNT_EXT: *params = INT_TO_BOOL(0); break; case GL_TEXTURE_COORD_ARRAY: +#ifdef VAO + *params = ctx->Array.Current->TexCoord[texUnit].Enabled; +#else *params = ctx->Array.TexCoord[texUnit].Enabled; +#endif break; case GL_TEXTURE_COORD_ARRAY_SIZE: +#ifdef VAO + *params = INT_TO_BOOL(ctx->Array.Current->TexCoord[texUnit].Size); +#else *params = INT_TO_BOOL(ctx->Array.TexCoord[texUnit].Size); +#endif break; case GL_TEXTURE_COORD_ARRAY_TYPE: +#ifdef VAO + *params = ENUM_TO_BOOL(ctx->Array.Current->TexCoord[texUnit].Type); +#else *params = ENUM_TO_BOOL(ctx->Array.TexCoord[texUnit].Type); +#endif break; case GL_TEXTURE_COORD_ARRAY_STRIDE: +#ifdef VAO + *params = INT_TO_BOOL(ctx->Array.Current->TexCoord[texUnit].Stride); +#else *params = INT_TO_BOOL(ctx->Array.TexCoord[texUnit].Stride); +#endif break; case GL_TEXTURE_COORD_ARRAY_COUNT_EXT: *params = INT_TO_BOOL(0); break; case GL_EDGE_FLAG_ARRAY: +#ifdef VAO + *params = ctx->Array.Current->EdgeFlag.Enabled; +#else *params = ctx->Array.EdgeFlag.Enabled; +#endif break; case GL_EDGE_FLAG_ARRAY_STRIDE: +#ifdef VAO + *params = INT_TO_BOOL(ctx->Array.Current->EdgeFlag.Stride); +#else *params = INT_TO_BOOL(ctx->Array.EdgeFlag.Stride); +#endif break; /* GL_ARB_multitexture */ @@ -1050,10 +1137,18 @@ /* GL_EXT_compiled_vertex_array */ case GL_ARRAY_ELEMENT_LOCK_FIRST_EXT: +#ifdef VAO + *params = ctx->Array.Current->LockFirst ? GL_TRUE : GL_FALSE; +#else *params = ctx->Array.LockFirst ? GL_TRUE : GL_FALSE; +#endif break; case GL_ARRAY_ELEMENT_LOCK_COUNT_EXT: +#ifdef VAO + *params = ctx->Array.Current->LockCount ? GL_TRUE : GL_FALSE; +#else *params = ctx->Array.LockCount ? GL_TRUE : GL_FALSE; +#endif break; /* GL_ARB_transpose_matrix */ @@ -1234,9 +1329,15 @@ ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx, "glGetDoublev"); + if (!params) + return; + if (MESA_VERBOSE & VERBOSE_API) fprintf(stderr, "glGetDoublev %s\n", gl_lookup_enum_by_nr(pname)); + if (ctx->Driver.GetDoublev && (*ctx->Driver.GetDoublev)(ctx, pname, params)) + return; + switch (pname) { case GL_ACCUM_RED_BITS: *params = (GLdouble) ctx->Visual->AccumRedBits; @@ -2007,79 +2108,159 @@ *params = (GLdouble) ctx->Pixel.ZoomY; break; case GL_VERTEX_ARRAY: +#ifdef VAO + *params = (GLdouble) ctx->Array.Current->Vertex.Enabled; +#else *params = (GLdouble) ctx->Array.Vertex.Enabled; +#endif break; case GL_VERTEX_ARRAY_SIZE: +#ifdef VAO + *params = (GLdouble) ctx->Array.Current->Vertex.Size; +#else *params = (GLdouble) ctx->Array.Vertex.Size; +#endif break; case GL_VERTEX_ARRAY_TYPE: +#ifdef VAO + *params = ENUM_TO_DOUBLE(ctx->Array.Current->Vertex.Type); +#else *params = ENUM_TO_DOUBLE(ctx->Array.Vertex.Type); +#endif break; case GL_VERTEX_ARRAY_STRIDE: +#ifdef VAO + *params = (GLdouble) ctx->Array.Current->Vertex.Stride; +#else *params = (GLdouble) ctx->Array.Vertex.Stride; +#endif break; case GL_VERTEX_ARRAY_COUNT_EXT: *params = 0.0; break; case GL_NORMAL_ARRAY: +#ifdef VAO + *params = (GLdouble) ctx->Array.Current->Normal.Enabled; +#else *params = (GLdouble) ctx->Array.Normal.Enabled; +#endif break; case GL_NORMAL_ARRAY_TYPE: +#ifdef VAO + *params = ENUM_TO_DOUBLE(ctx->Array.Current->Normal.Type); +#else *params = ENUM_TO_DOUBLE(ctx->Array.Normal.Type); +#endif break; case GL_NORMAL_ARRAY_STRIDE: +#ifdef VAO + *params = (GLdouble) ctx->Array.Current->Normal.Stride; +#else *params = (GLdouble) ctx->Array.Normal.Stride; +#endif break; case GL_NORMAL_ARRAY_COUNT_EXT: *params = 0.0; break; case GL_COLOR_ARRAY: +#ifdef VAO + *params = (GLdouble) ctx->Array.Current->Color.Enabled; +#else *params = (GLdouble) ctx->Array.Color.Enabled; +#endif break; case GL_COLOR_ARRAY_SIZE: +#ifdef VAO + *params = (GLdouble) ctx->Array.Current->Color.Size; +#else *params = (GLdouble) ctx->Array.Color.Size; +#endif break; case GL_COLOR_ARRAY_TYPE: +#ifdef VAO + *params = ENUM_TO_DOUBLE(ctx->Array.Current->Color.Type); +#else *params = ENUM_TO_DOUBLE(ctx->Array.Color.Type); +#endif break; case GL_COLOR_ARRAY_STRIDE: +#ifdef VAO + *params = (GLdouble) ctx->Array.Current->Color.Stride; +#else *params = (GLdouble) ctx->Array.Color.Stride; +#endif break; case GL_COLOR_ARRAY_COUNT_EXT: *params = 0.0; break; case GL_INDEX_ARRAY: +#ifdef VAO + *params = (GLdouble) ctx->Array.Current->Index.Enabled; +#else *params = (GLdouble) ctx->Array.Index.Enabled; +#endif break; case GL_INDEX_ARRAY_TYPE: +#ifdef VAO + *params = ENUM_TO_DOUBLE(ctx->Array.Current->Index.Type); +#else *params = ENUM_TO_DOUBLE(ctx->Array.Index.Type); +#endif break; case GL_INDEX_ARRAY_STRIDE: +#ifdef VAO + *params = (GLdouble) ctx->Array.Current->Index.Stride; +#else *params = (GLdouble) ctx->Array.Index.Stride; +#endif break; case GL_INDEX_ARRAY_COUNT_EXT: *params = 0.0; break; case GL_TEXTURE_COORD_ARRAY: +#ifdef VAO + *params = (GLdouble) ctx->Array.Current->TexCoord[texUnit].Enabled; +#else *params = (GLdouble) ctx->Array.TexCoord[texUnit].Enabled; +#endif break; case GL_TEXTURE_COORD_ARRAY_SIZE: +#ifdef VAO + *params = (GLdouble) ctx->Array.Current->TexCoord[texUnit].Size; +#else *params = (GLdouble) ctx->Array.TexCoord[texUnit].Size; +#endif break; case GL_TEXTURE_COORD_ARRAY_TYPE: +#ifdef VAO + *params = ENUM_TO_DOUBLE(ctx->Array.Current->TexCoord[texUnit].Type); +#else *params = ENUM_TO_DOUBLE(ctx->Array.TexCoord[texUnit].Type); +#endif break; case GL_TEXTURE_COORD_ARRAY_STRIDE: +#ifdef VAO + *params = (GLdouble) ctx->Array.Current->TexCoord[texUnit].Stride; +#else *params = (GLdouble) ctx->Array.TexCoord[texUnit].Stride; +#endif break; case GL_TEXTURE_COORD_ARRAY_COUNT_EXT: *params = 0.0; break; case GL_EDGE_FLAG_ARRAY: +#ifdef VAO + *params = (GLdouble) ctx->Array.Current->EdgeFlag.Enabled; +#else *params = (GLdouble) ctx->Array.EdgeFlag.Enabled; +#endif break; case GL_EDGE_FLAG_ARRAY_STRIDE: +#ifdef VAO + *params = (GLdouble) ctx->Array.Current->EdgeFlag.Stride; +#else *params = (GLdouble) ctx->Array.EdgeFlag.Stride; +#endif break; case GL_EDGE_FLAG_ARRAY_COUNT_EXT: *params = 0.0; @@ -2193,10 +2374,18 @@ /* GL_EXT_compiled_vertex_array */ case GL_ARRAY_ELEMENT_LOCK_FIRST_EXT: +#ifdef VAO + *params = (GLdouble) ctx->Array.Current->LockFirst; +#else *params = (GLdouble) ctx->Array.LockFirst; +#endif break; case GL_ARRAY_ELEMENT_LOCK_COUNT_EXT: +#ifdef VAO + *params = (GLdouble) ctx->Array.Current->LockCount; +#else *params = (GLdouble) ctx->Array.LockCount; +#endif break; /* GL_ARB_transpose_matrix */ @@ -2377,9 +2566,15 @@ ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx, "glGetFloatv"); + if (!params) + return; + if (MESA_VERBOSE & VERBOSE_API) fprintf(stderr, "glGetFloatv %s\n", gl_lookup_enum_by_nr(pname)); + if (ctx->Driver.GetFloatv && (*ctx->Driver.GetFloatv)(ctx, pname, params)) + return; + switch (pname) { case GL_ACCUM_RED_BITS: *params = (GLfloat) ctx->Visual->AccumRedBits; @@ -3149,79 +3344,159 @@ *params = (GLfloat) ctx->Pixel.ZoomY; break; case GL_VERTEX_ARRAY: +#ifdef VAO + *params = (GLfloat) ctx->Array.Current->Vertex.Enabled; +#else *params = (GLfloat) ctx->Array.Vertex.Enabled; +#endif break; case GL_VERTEX_ARRAY_SIZE: +#ifdef VAO + *params = (GLfloat) ctx->Array.Current->Vertex.Size; +#else *params = (GLfloat) ctx->Array.Vertex.Size; +#endif break; case GL_VERTEX_ARRAY_TYPE: +#ifdef VAO + *params = ENUM_TO_FLOAT(ctx->Array.Current->Vertex.Type); +#else *params = ENUM_TO_FLOAT(ctx->Array.Vertex.Type); +#endif break; case GL_VERTEX_ARRAY_STRIDE: +#ifdef VAO + *params = (GLfloat) ctx->Array.Current->Vertex.Stride; +#else *params = (GLfloat) ctx->Array.Vertex.Stride; +#endif break; case GL_VERTEX_ARRAY_COUNT_EXT: *params = 0.0; break; case GL_NORMAL_ARRAY: +#ifdef VAO + *params = (GLfloat) ctx->Array.Current->Normal.Enabled; +#else *params = (GLfloat) ctx->Array.Normal.Enabled; +#endif break; case GL_NORMAL_ARRAY_TYPE: +#ifdef VAO + *params = ENUM_TO_FLOAT(ctx->Array.Current->Normal.Type); +#else *params = ENUM_TO_FLOAT(ctx->Array.Normal.Type); +#endif break; case GL_NORMAL_ARRAY_STRIDE: +#ifdef VAO + *params = (GLfloat) ctx->Array.Current->Normal.Stride; +#else *params = (GLfloat) ctx->Array.Normal.Stride; +#endif break; case GL_NORMAL_ARRAY_COUNT_EXT: *params = 0.0; break; case GL_COLOR_ARRAY: +#ifdef VAO + *params = (GLfloat) ctx->Array.Current->Color.Enabled; +#else *params = (GLfloat) ctx->Array.Color.Enabled; +#endif break; case GL_COLOR_ARRAY_SIZE: +#ifdef VAO + *params = (GLfloat) ctx->Array.Current->Color.Size; +#else *params = (GLfloat) ctx->Array.Color.Size; +#endif break; case GL_COLOR_ARRAY_TYPE: +#ifdef VAO + *params = ENUM_TO_FLOAT(ctx->Array.Current->Color.Type); +#else *params = ENUM_TO_FLOAT(ctx->Array.Color.Type); +#endif break; case GL_COLOR_ARRAY_STRIDE: +#ifdef VAO + *params = (GLfloat) ctx->Array.Current->Color.Stride; +#else *params = (GLfloat) ctx->Array.Color.Stride; +#endif break; case GL_COLOR_ARRAY_COUNT_EXT: *params = 0.0; break; case GL_INDEX_ARRAY: +#ifdef VAO + *params = (GLfloat) ctx->Array.Current->Index.Enabled; +#else *params = (GLfloat) ctx->Array.Index.Enabled; +#endif break; case GL_INDEX_ARRAY_TYPE: +#ifdef VAO + *params = ENUM_TO_FLOAT(ctx->Array.Current->Index.Type); +#else *params = ENUM_TO_FLOAT(ctx->Array.Index.Type); +#endif break; case GL_INDEX_ARRAY_STRIDE: +#ifdef VAO + *params = (GLfloat) ctx->Array.Current->Index.Stride; +#else *params = (GLfloat) ctx->Array.Index.Stride; +#endif break; case GL_INDEX_ARRAY_COUNT_EXT: *params = 0.0; break; case GL_TEXTURE_COORD_ARRAY: +#ifdef VAO + *params = (GLfloat) ctx->Array.Current->TexCoord[texUnit].Enabled; +#else *params = (GLfloat) ctx->Array.TexCoord[texUnit].Enabled; +#endif break; case GL_TEXTURE_COORD_ARRAY_SIZE: +#ifdef VAO + *params = (GLfloat) ctx->Array.Current->TexCoord[texUnit].Size; +#else *params = (GLfloat) ctx->Array.TexCoord[texUnit].Size; +#endif break; case GL_TEXTURE_COORD_ARRAY_TYPE: +#ifdef VAO + *params = ENUM_TO_FLOAT(ctx->Array.Current->TexCoord[texUnit].Type); +#else *params = ENUM_TO_FLOAT(ctx->Array.TexCoord[texUnit].Type); +#endif break; case GL_TEXTURE_COORD_ARRAY_STRIDE: +#ifdef VAO + *params = (GLfloat) ctx->Array.Current->TexCoord[texUnit].Stride; +#else *params = (GLfloat) ctx->Array.TexCoord[texUnit].Stride; +#endif break; case GL_TEXTURE_COORD_ARRAY_COUNT_EXT: *params = 0.0; break; case GL_EDGE_FLAG_ARRAY: +#ifdef VAO + *params = (GLfloat) ctx->Array.Current->EdgeFlag.Enabled; +#else *params = (GLfloat) ctx->Array.EdgeFlag.Enabled; +#endif break; case GL_EDGE_FLAG_ARRAY_STRIDE: +#ifdef VAO + *params = (GLfloat) ctx->Array.Current->EdgeFlag.Stride; +#else *params = (GLfloat) ctx->Array.EdgeFlag.Stride; +#endif break; case GL_EDGE_FLAG_ARRAY_COUNT_EXT: *params = 0.0; @@ -3335,10 +3610,18 @@ /* GL_EXT_compiled_vertex_array */ case GL_ARRAY_ELEMENT_LOCK_FIRST_EXT: +#ifdef VAO + *params = (GLfloat) ctx->Array.Current->LockFirst; +#else *params = (GLfloat) ctx->Array.LockFirst; +#endif break; case GL_ARRAY_ELEMENT_LOCK_COUNT_EXT: +#ifdef VAO + *params = (GLfloat) ctx->Array.Current->LockCount; +#else *params = (GLfloat) ctx->Array.LockCount; +#endif break; /* GL_ARB_transpose_matrix */ @@ -3491,9 +3774,16 @@ ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx, "glGetIntegerv"); + if (!params) + return; + if (MESA_VERBOSE & VERBOSE_API) fprintf(stderr, "glGetIntegerv %s\n", gl_lookup_enum_by_nr(pname)); + if (ctx->Driver.GetIntegerv + && (*ctx->Driver.GetIntegerv)(ctx, pname, params)) + return; + switch (pname) { case GL_ACCUM_RED_BITS: *params = (GLint) ctx->Visual->AccumRedBits; @@ -4265,79 +4555,159 @@ *params = (GLint) ctx->Pixel.ZoomY; break; case GL_VERTEX_ARRAY: +#ifdef VAO + *params = (GLint) ctx->Array.Current->Vertex.Enabled; +#else *params = (GLint) ctx->Array.Vertex.Enabled; +#endif break; case GL_VERTEX_ARRAY_SIZE: +#ifdef VAO + *params = ctx->Array.Current->Vertex.Size; +#else *params = ctx->Array.Vertex.Size; +#endif break; case GL_VERTEX_ARRAY_TYPE: +#ifdef VAO + *params = ctx->Array.Current->Vertex.Type; +#else *params = ctx->Array.Vertex.Type; +#endif break; case GL_VERTEX_ARRAY_STRIDE: +#ifdef VAO + *params = ctx->Array.Current->Vertex.Stride; +#else *params = ctx->Array.Vertex.Stride; +#endif break; case GL_VERTEX_ARRAY_COUNT_EXT: *params = 0; break; case GL_NORMAL_ARRAY: +#ifdef VAO + *params = (GLint) ctx->Array.Current->Normal.Enabled; +#else *params = (GLint) ctx->Array.Normal.Enabled; +#endif break; case GL_NORMAL_ARRAY_TYPE: +#ifdef VAO + *params = ctx->Array.Current->Normal.Type; +#else *params = ctx->Array.Normal.Type; +#endif break; case GL_NORMAL_ARRAY_STRIDE: +#ifdef VAO + *params = ctx->Array.Current->Normal.Stride; +#else *params = ctx->Array.Normal.Stride; +#endif break; case GL_NORMAL_ARRAY_COUNT_EXT: *params = 0; break; case GL_COLOR_ARRAY: +#ifdef VAO + *params = (GLint) ctx->Array.Current->Color.Enabled; +#else *params = (GLint) ctx->Array.Color.Enabled; +#endif break; case GL_COLOR_ARRAY_SIZE: +#ifdef VAO + *params = ctx->Array.Current->Color.Size; +#else *params = ctx->Array.Color.Size; +#endif break; case GL_COLOR_ARRAY_TYPE: +#ifdef VAO + *params = ctx->Array.Current->Color.Type; +#else *params = ctx->Array.Color.Type; +#endif break; case GL_COLOR_ARRAY_STRIDE: +#ifdef VAO + *params = ctx->Array.Current->Color.Stride; +#else *params = ctx->Array.Color.Stride; +#endif break; case GL_COLOR_ARRAY_COUNT_EXT: *params = 0; break; case GL_INDEX_ARRAY: +#ifdef VAO + *params = (GLint) ctx->Array.Current->Index.Enabled; +#else *params = (GLint) ctx->Array.Index.Enabled; +#endif break; case GL_INDEX_ARRAY_TYPE: +#ifdef VAO + *params = ctx->Array.Current->Index.Type; +#else *params = ctx->Array.Index.Type; +#endif break; case GL_INDEX_ARRAY_STRIDE: +#ifdef VAO + *params = ctx->Array.Current->Index.Stride; +#else *params = ctx->Array.Index.Stride; +#endif break; case GL_INDEX_ARRAY_COUNT_EXT: *params = 0; break; case GL_TEXTURE_COORD_ARRAY: +#ifdef VAO + *params = (GLint) ctx->Array.Current->TexCoord[texUnit].Enabled; +#else *params = (GLint) ctx->Array.TexCoord[texUnit].Enabled; +#endif break; case GL_TEXTURE_COORD_ARRAY_SIZE: +#ifdef VAO + *params = ctx->Array.Current->TexCoord[texUnit].Size; +#else *params = ctx->Array.TexCoord[texUnit].Size; +#endif break; case GL_TEXTURE_COORD_ARRAY_TYPE: +#ifdef VAO + *params = ctx->Array.Current->TexCoord[texUnit].Type; +#else *params = ctx->Array.TexCoord[texUnit].Type; +#endif break; case GL_TEXTURE_COORD_ARRAY_STRIDE: +#ifdef VAO + *params = ctx->Array.Current->TexCoord[texUnit].Stride; +#else *params = ctx->Array.TexCoord[texUnit].Stride; +#endif break; case GL_TEXTURE_COORD_ARRAY_COUNT_EXT: *params = 0; break; case GL_EDGE_FLAG_ARRAY: +#ifdef VAO + *params = (GLint) ctx->Array.Current->EdgeFlag.Enabled; +#else *params = (GLint) ctx->Array.EdgeFlag.Enabled; +#endif break; case GL_EDGE_FLAG_ARRAY_STRIDE: +#ifdef VAO + *params = ctx->Array.Current->EdgeFlag.Stride; +#else *params = ctx->Array.EdgeFlag.Stride; +#endif break; case GL_EDGE_FLAG_ARRAY_COUNT_EXT: *params = 0; @@ -4451,10 +4821,18 @@ /* GL_EXT_compiled_vertex_array */ case GL_ARRAY_ELEMENT_LOCK_FIRST_EXT: +#ifdef VAO + *params = ctx->Array.Current->LockFirst; +#else *params = ctx->Array.LockFirst; +#endif break; case GL_ARRAY_ELEMENT_LOCK_COUNT_EXT: +#ifdef VAO + *params = ctx->Array.Current->LockCount; +#else *params = ctx->Array.LockCount; +#endif break; /* GL_ARB_transpose_matrix */ @@ -4628,29 +5006,61 @@ { GET_CURRENT_CONTEXT(ctx); GLuint texUnit = ctx->Texture.CurrentUnit; - /*GLuint texTransformUnit = ctx->Texture.CurrentTransformUnit;*/ + ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx, "glGetPointerv"); + + if (!params) + return; + if (MESA_VERBOSE & VERBOSE_API) fprintf(stderr, "glGetPointerv %s\n", gl_lookup_enum_by_nr(pname)); + if (ctx->Driver.GetPointerv + && (*ctx->Driver.GetPointerv)(ctx, pname, params)) + return; + switch (pname) { case GL_VERTEX_ARRAY_POINTER: +#ifdef VAO + *params = ctx->Array.Current->Vertex.Ptr; +#else *params = ctx->Array.Vertex.Ptr; +#endif break; case GL_NORMAL_ARRAY_POINTER: +#ifdef VAO + *params = ctx->Array.Current->Normal.Ptr; +#else *params = ctx->Array.Normal.Ptr; +#endif break; case GL_COLOR_ARRAY_POINTER: +#ifdef VAO + *params = ctx->Array.Current->Color.Ptr; +#else *params = ctx->Array.Color.Ptr; +#endif break; case GL_INDEX_ARRAY_POINTER: +#ifdef VAO + *params = ctx->Array.Current->Index.Ptr; +#else *params = ctx->Array.Index.Ptr; +#endif break; case GL_TEXTURE_COORD_ARRAY_POINTER: +#ifdef VAO + *params = ctx->Array.Current->TexCoord[texUnit].Ptr; +#else *params = ctx->Array.TexCoord[texUnit].Ptr; +#endif break; case GL_EDGE_FLAG_ARRAY_POINTER: +#ifdef VAO + *params = ctx->Array.Current->EdgeFlag.Ptr; +#else *params = ctx->Array.EdgeFlag.Ptr; +#endif break; case GL_FEEDBACK_BUFFER_POINTER: *params = ctx->Feedback.Buffer; @@ -4670,9 +5080,9 @@ _mesa_GetString( GLenum name ) { GET_CURRENT_CONTEXT(ctx); - static char *vendor = "Brian Paul"; - static char *renderer = "Mesa"; - static char *version = "1.2 Mesa 3.3 beta"; + static const char *vendor = "Brian Paul"; + static const char *renderer = "Mesa"; + static const char *version = "1.2 Mesa 3.4"; ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH_WITH_RETVAL(ctx, "glGetString", 0); Index: xc/extras/Mesa/src/glapi.c diff -u xc/extras/Mesa/src/glapi.c:1.7 xc/extras/Mesa/src/glapi.c:1.9 --- xc/extras/Mesa/src/glapi.c:1.7 Fri Jun 16 20:02:10 2000 +++ xc/extras/Mesa/src/glapi.c Mon Nov 13 18:30:46 2000 @@ -1,7 +1,7 @@ /* * Mesa 3-D graphics library - * Version: 3.3 + * Version: 3.4 * * Copyright (C) 1999-2000 Brian Paul All Rights Reserved. * @@ -1478,11 +1478,13 @@ static GLvoid * get_static_proc_address(const char *funcName) { - GLint i = get_static_proc_offset(funcName); - if (i >= 0) - return static_functions[i].Address; - else - return NULL; + GLint i; + for (i = 0; static_functions[i].Name; i++) { + if (strcmp(static_functions[i].Name, funcName) == 0) { + return static_functions[i].Address; + } + } + return NULL; } @@ -1562,7 +1564,7 @@ { GLint index = get_static_proc_offset(funcName); if (index >= 0) { - return (GLboolean) (index == offset); /* bad offset! */ + return (GLboolean) (index == (GLint) offset); /* bad offset! */ } } @@ -1670,7 +1672,7 @@ _glapi_get_proc_offset(const char *funcName) { /* search extension functions first */ - GLint i; + GLuint i; for (i = 0; i < NumExtEntryPoints; i++) { if (strcmp(ExtEntryTable[i].Name, funcName) == 0) { return ExtEntryTable[i].Offset; @@ -1690,7 +1692,7 @@ _glapi_get_proc_address(const char *funcName) { /* search extension functions first */ - GLint i; + GLuint i; for (i = 0; i < NumExtEntryPoints; i++) { if (strcmp(ExtEntryTable[i].Name, funcName) == 0) { return ExtEntryTable[i].Address; Index: xc/extras/Mesa/src/glapinoop.c diff -u xc/extras/Mesa/src/glapinoop.c:1.7 xc/extras/Mesa/src/glapinoop.c:1.10 --- xc/extras/Mesa/src/glapinoop.c:1.7 Fri Jun 16 20:02:11 2000 +++ xc/extras/Mesa/src/glapinoop.c Mon Nov 13 18:30:47 2000 @@ -1,7 +1,7 @@ /* * Mesa 3-D graphics library - * Version: 3.3 + * Version: 3.4 * * Copyright (C) 1999-2000 Brian Paul All Rights Reserved. * @@ -690,7 +690,16 @@ (void *) NoOpGetColorTableEXT, (void *) NoOpGetColorTableParameterivEXT, (void *) NoOpGetColorTableParameterfvEXT, - + /* GL_3DFX_tbuffer */ + (void *) NoOpTbufferMask3DFX, + /* GL_ARB_texture_compression */ + (void *) NoOpCompressedTexImage3DARB, + (void *) NoOpCompressedTexImage2DARB, + (void *) NoOpCompressedTexImage1DARB, + (void *) NoOpCompressedTexSubImage3DARB, + (void *) NoOpCompressedTexSubImage2DARB, + (void *) NoOpCompressedTexSubImage1DARB, + (void *) NoOpGetCompressedTexImageARB, /* A whole bunch of no-op functions. These might be called * when someone tries to call a dynamically-registered extension * function without a current rendering context. Index: xc/extras/Mesa/src/glext_proto.h diff -u xc/extras/Mesa/src/glext_proto.h:1.1 xc/extras/Mesa/src/glext_proto.h:removed --- xc/extras/Mesa/src/glext_proto.h:1.1 Fri Jun 16 20:02:11 2000 +++ xc/extras/Mesa/src/glext_proto.h Mon Dec 18 14:21:45 2000 @@ -1,1757 +0,0 @@ -#ifndef __glext_proto_h_ -#define __glext_proto_h_ - -#ifdef __cplusplus -extern "C" { -#endif - -/* -** License Applicability. Except to the extent portions of this file are -** made subject to an alternative license as permitted in the SGI Free -** Software License B, Version 1.1 (the "License"), the contents of this -** file are subject only to the provisions of the License. You may not use -** this file except in compliance with the License. You may obtain a copy -** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600 -** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at: -** -** http://oss.sgi.com/projects/FreeB -** -** Note that, as provided in the License, the Software is distributed on an -** "AS IS" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS -** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND -** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A -** PARTICULAR PURPOSE, AND NON-INFRINGEMENT. -** -** Original Code. The Original Code is: OpenGL Sample Implementation, -** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics, -** Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc. -** Copyright in any portions created by third parties is as indicated -** elsewhere herein. All Rights Reserved. -** -** Additional Notice Provisions: This software was created using the -** OpenGL(R) version 1.2.1 Sample Implementation published by SGI, but has -** not been independently verified as being compliant with the OpenGL(R) -** version 1.2.1 Specification. -*/ - -#if defined(_WIN32) && !defined(APIENTRY) && !defined(__CYGWIN32) -#define WIN32_LEAN_AND_MEAN 1 -#include -#endif - -#ifndef APIENTRY -#define APIENTRY -#endif - -/*************************************************************/ - -/* OpenGL ABI for Linux version number */ -#define GLEXT_VERSION_EXT 5 -#define GL_CONSTANT_COLOR 0x8001 -#define GL_ONE_MINUS_CONSTANT_COLOR 0x8002 -#define GL_CONSTANT_ALPHA 0x8003 -#define GL_ONE_MINUS_CONSTANT_ALPHA 0x8004 -#define GL_BLEND_COLOR 0x8005 -#define GL_FUNC_ADD 0x8006 -#define GL_MIN 0x8007 -#define GL_MAX 0x8008 -#define GL_BLEND_EQUATION 0x8009 -#define GL_FUNC_SUBTRACT 0x800A -#define GL_FUNC_REVERSE_SUBTRACT 0x800B -#define GL_CONVOLUTION_1D 0x8010 -#define GL_CONVOLUTION_2D 0x8011 -#define GL_SEPARABLE_2D 0x8012 -#define GL_CONVOLUTION_BORDER_MODE 0x8013 -#define GL_CONVOLUTION_FILTER_SCALE 0x8014 -#define GL_CONVOLUTION_FILTER_BIAS 0x8015 -#define GL_REDUCE 0x8016 -#define GL_CONVOLUTION_FORMAT 0x8017 -#define GL_CONVOLUTION_WIDTH 0x8018 -#define GL_CONVOLUTION_HEIGHT 0x8019 -#define GL_MAX_CONVOLUTION_WIDTH 0x801A -#define GL_MAX_CONVOLUTION_HEIGHT 0x801B -#define GL_POST_CONVOLUTION_RED_SCALE 0x801C -#define GL_POST_CONVOLUTION_GREEN_SCALE 0x801D -#define GL_POST_CONVOLUTION_BLUE_SCALE 0x801E -#define GL_POST_CONVOLUTION_ALPHA_SCALE 0x801F -#define GL_POST_CONVOLUTION_RED_BIAS 0x8020 -#define GL_POST_CONVOLUTION_GREEN_BIAS 0x8021 -#define GL_POST_CONVOLUTION_BLUE_BIAS 0x8022 -#define GL_POST_CONVOLUTION_ALPHA_BIAS 0x8023 -#define GL_HISTOGRAM 0x8024 -#define GL_PROXY_HISTOGRAM 0x8025 -#define GL_HISTOGRAM_WIDTH 0x8026 -#define GL_HISTOGRAM_FORMAT 0x8027 -#define GL_HISTOGRAM_RED_SIZE 0x8028 -#define GL_HISTOGRAM_GREEN_SIZE 0x8029 -#define GL_HISTOGRAM_BLUE_SIZE 0x802A -#define GL_HISTOGRAM_ALPHA_SIZE 0x802B -#define GL_HISTOGRAM_LUMINANCE_SIZE 0x802C -#define GL_HISTOGRAM_SINK 0x802D -#define GL_MINMAX 0x802E -#define GL_MINMAX_FORMAT 0x802F -#define GL_MINMAX_SINK 0x8030 -#define GL_TABLE_TOO_LARGE 0x8031 -#define GL_UNSIGNED_BYTE_3_3_2 0x8032 -#define GL_UNSIGNED_SHORT_4_4_4_4 0x8033 -#define GL_UNSIGNED_SHORT_5_5_5_1 0x8034 -#define GL_UNSIGNED_INT_8_8_8_8 0x8035 -#define GL_UNSIGNED_INT_10_10_10_2 0x8036 -#define GL_RESCALE_NORMAL 0x803A -#define GL_UNSIGNED_BYTE_2_3_3_REV 0x8362 -#define GL_UNSIGNED_SHORT_5_6_5 0x8363 -#define GL_UNSIGNED_SHORT_5_6_5_REV 0x8364 -#define GL_UNSIGNED_SHORT_4_4_4_4_REV 0x8365 -#define GL_UNSIGNED_SHORT_1_5_5_5_REV 0x8366 -#define GL_UNSIGNED_INT_8_8_8_8_REV 0x8367 -#define GL_UNSIGNED_INT_2_10_10_10_REV 0x8368 -#define GL_COLOR_MATRIX 0x80B1 -#define GL_COLOR_MATRIX_STACK_DEPTH 0x80B2 -#define GL_MAX_COLOR_MATRIX_STACK_DEPTH 0x80B3 -#define GL_POST_COLOR_MATRIX_RED_SCALE 0x80B4 -#define GL_POST_COLOR_MATRIX_GREEN_SCALE 0x80B5 -#define GL_POST_COLOR_MATRIX_BLUE_SCALE 0x80B6 -#define GL_POST_COLOR_MATRIX_ALPHA_SCALE 0x80B7 -#define GL_POST_COLOR_MATRIX_RED_BIAS 0x80B8 -#define GL_POST_COLOR_MATRIX_GREEN_BIAS 0x80B9 -#define GL_POST_COLOR_MATRIX_BLUE_BIAS 0x80BA -#define GL_COLOR_TABLE 0x80D0 -#define GL_POST_CONVOLUTION_COLOR_TABLE 0x80D1 -#define GL_POST_COLOR_MATRIX_COLOR_TABLE 0x80D2 -#define GL_PROXY_COLOR_TABLE 0x80D3 -#define GL_PROXY_POST_CONVOLUTION_COLOR_TABLE 0x80D4 -#define GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE 0x80D5 -#define GL_COLOR_TABLE_SCALE 0x80D6 -#define GL_COLOR_TABLE_BIAS 0x80D7 -#define GL_COLOR_TABLE_FORMAT 0x80D8 -#define GL_COLOR_TABLE_WIDTH 0x80D9 -#define GL_COLOR_TABLE_RED_SIZE 0x80DA -#define GL_COLOR_TABLE_GREEN_SIZE 0x80DB -#define GL_COLOR_TABLE_BLUE_SIZE 0x80DC -#define GL_COLOR_TABLE_ALPHA_SIZE 0x80DD -#define GL_COLOR_TABLE_LUMINANCE_SIZE 0x80DE -#define GL_COLOR_TABLE_INTENSITY_SIZE 0x80DF -#define GL_CLAMP_TO_EDGE 0x812F -#define GL_TEXTURE_MIN_LOD 0x813A -#define GL_TEXTURE_MAX_LOD 0x813B -#define GL_TEXTURE_BASE_LEVEL 0x813C -#define GL_TEXTURE_MAX_LEVEL 0x813D -#define GL_TEXTURE0_ARB 0x84C0 -#define GL_TEXTURE1_ARB 0x84C1 -#define GL_TEXTURE2_ARB 0x84C2 -#define GL_TEXTURE3_ARB 0x84C3 -#define GL_ACTIVE_TEXTURE_ARB 0x84E0 -#define GL_CLIENT_ACTIVE_TEXTURE_ARB 0x84E1 -#define GL_MAX_ACTIVE_TEXTURES_ARB 0x84E2 -#define GL_TRANSPOSE_MODELVIEW_MATRIX_ARB 0x84E3 -#define GL_TRANSPOSE_PROJECTION_MATRIX_ARB 0x84E4 -#define GL_TRANSPOSE_TEXTURE_MATRIX_ARB 0x84E5 -#define GL_TRANSPOSE_COLOR_MATRIX_ARB 0x84E6 -#define GL_MULTISAMPLE_ARB 0x809D -#define GL_SAMPLE_ALPHA_TO_COVERAGE_ARB 0x809E -#define GL_SAMPLE_ALPHA_TO_ONE_ARB 0x809F -#define GL_SAMPLE_COVERAGE_ARB 0x80A0 -#define GL_SAMPLE_BUFFERS_ARB 0x80A8 -#define GL_SAMPLES_ARB 0x80A9 -#define GL_SAMPLE_COVERAGE_VALUE_ARB 0x80AA -#define GL_SAMPLE_COVERAGE_INVERT_ARB 0x80AB -#define GL_MULTISAMPLE_BIT_ARB 0x20000000 -#define GL_NORMAL_MAP_ARB 0x8511 -#define GL_REFLECTION_MAP_ARB 0x8512 -#define GL_TEXTURE_CUBE_MAP_ARB 0x8513 -#define GL_TEXTURE_BINDING_CUBE_MAP_ARB 0x8514 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB 0x8515 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB 0x8516 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB 0x8517 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB 0x8518 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB 0x8519 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB 0x851A -#define GL_PROXY_TEXTURE_CUBE_MAP_ARB 0x851B -#define GL_MAX_CUBE_MAP_TEXTURE_SIZE_ARB 0x851C -#define GL_COMPRESSED_ALPHA_ARB 0x84E9 -#define GL_COMPRESSED_LUMINANCE_ARB 0x84EA -#define GL_COMPRESSED_LUMINANCE_ALPHA_ARB 0x84EB -#define GL_COMPRESSED_INTENSITY_ARB 0x84EC -#define GL_COMPRESSED_RGB_ARB 0x84ED -#define GL_COMPRESSED_RGBA_ARB 0x84EE -#define GL_TEXTURE_COMPRESSION_HINT_ARB 0x84EF -#define GL_TEXTURE_IMAGE_SIZE_ARB 0x86A0 -#define GL_TEXTURE_COMPRESSED_ARB 0x86A1 -#define GL_NUM_COMPRESSED_TEXTURE_FORMATS_ARB 0x86A2 -#define GL_COMPRESSED_TEXTURE_FORMATS_ARB 0x86A3 -#define GL_ABGR_EXT 0x8000 -#define GL_CONSTANT_COLOR_EXT 0x8001 -#define GL_ONE_MINUS_CONSTANT_COLOR_EXT 0x8002 -#define GL_CONSTANT_ALPHA_EXT 0x8003 -#define GL_ONE_MINUS_CONSTANT_ALPHA_EXT 0x8004 -#define GL_BLEND_COLOR_EXT 0x8005 -#define GL_POLYGON_OFFSET_EXT 0x8037 -#define GL_POLYGON_OFFSET_FACTOR_EXT 0x8038 -#define GL_POLYGON_OFFSET_BIAS_EXT 0x8039 -#define GL_ALPHA4_EXT 0x803B -#define GL_ALPHA8_EXT 0x803C -#define GL_ALPHA12_EXT 0x803D -#define GL_ALPHA16_EXT 0x803E -#define GL_LUMINANCE4_EXT 0x803F -#define GL_LUMINANCE8_EXT 0x8040 -#define GL_LUMINANCE12_EXT 0x8041 -#define GL_LUMINANCE16_EXT 0x8042 -#define GL_LUMINANCE4_ALPHA4_EXT 0x8043 -#define GL_LUMINANCE6_ALPHA2_EXT 0x8044 -#define GL_LUMINANCE8_ALPHA8_EXT 0x8045 -#define GL_LUMINANCE12_ALPHA4_EXT 0x8046 -#define GL_LUMINANCE12_ALPHA12_EXT 0x8047 -#define GL_LUMINANCE16_ALPHA16_EXT 0x8048 -#define GL_INTENSITY_EXT 0x8049 -#define GL_INTENSITY4_EXT 0x804A -#define GL_INTENSITY8_EXT 0x804B -#define GL_INTENSITY12_EXT 0x804C -#define GL_INTENSITY16_EXT 0x804D -#define GL_RGB2_EXT 0x804E -#define GL_RGB4_EXT 0x804F -#define GL_RGB5_EXT 0x8050 -#define GL_RGB8_EXT 0x8051 -#define GL_RGB10_EXT 0x8052 -#define GL_RGB12_EXT 0x8053 -#define GL_RGB16_EXT 0x8054 -#define GL_RGBA2_EXT 0x8055 -#define GL_RGBA4_EXT 0x8056 -#define GL_RGB5_A1_EXT 0x8057 -#define GL_RGBA8_EXT 0x8058 -#define GL_RGB10_A2_EXT 0x8059 -#define GL_RGBA12_EXT 0x805A -#define GL_RGBA16_EXT 0x805B -#define GL_TEXTURE_RED_SIZE_EXT 0x805C -#define GL_TEXTURE_GREEN_SIZE_EXT 0x805D -#define GL_TEXTURE_BLUE_SIZE_EXT 0x805E -#define GL_TEXTURE_ALPHA_SIZE_EXT 0x805F -#define GL_TEXTURE_LUMINANCE_SIZE_EXT 0x8060 -#define GL_TEXTURE_INTENSITY_SIZE_EXT 0x8061 -#define GL_REPLACE_EXT 0x8062 -#define GL_PROXY_TEXTURE_1D_EXT 0x8063 -#define GL_PROXY_TEXTURE_2D_EXT 0x8064 -#define GL_TEXTURE_TOO_LARGE_EXT 0x8065 -#define GL_PACK_SKIP_IMAGES 0x806B -#define GL_PACK_SKIP_IMAGES_EXT 0x806B -#define GL_PACK_IMAGE_HEIGHT 0x806C -#define GL_PACK_IMAGE_HEIGHT_EXT 0x806C -#define GL_UNPACK_SKIP_IMAGES 0x806D -#define GL_UNPACK_SKIP_IMAGES_EXT 0x806D -#define GL_UNPACK_IMAGE_HEIGHT 0x806E -#define GL_UNPACK_IMAGE_HEIGHT_EXT 0x806E -#define GL_TEXTURE_3D 0x806F -#define GL_TEXTURE_3D_EXT 0x806F -#define GL_PROXY_TEXTURE_3D 0x8070 -#define GL_PROXY_TEXTURE_3D_EXT 0x8070 -#define GL_TEXTURE_DEPTH 0x8071 -#define GL_TEXTURE_DEPTH_EXT 0x8071 -#define GL_TEXTURE_WRAP_R 0x8072 -#define GL_TEXTURE_WRAP_R_EXT 0x8072 -#define GL_MAX_3D_TEXTURE_SIZE 0x8073 -#define GL_MAX_3D_TEXTURE_SIZE_EXT 0x8073 -#define GL_FILTER4_SGIS 0x8146 -#define GL_TEXTURE_FILTER4_SIZE_SGIS 0x8147 -#define GL_HISTOGRAM_EXT 0x8024 -#define GL_PROXY_HISTOGRAM_EXT 0x8025 -#define GL_HISTOGRAM_WIDTH_EXT 0x8026 -#define GL_HISTOGRAM_FORMAT_EXT 0x8027 -#define GL_HISTOGRAM_RED_SIZE_EXT 0x8028 -#define GL_HISTOGRAM_GREEN_SIZE_EXT 0x8029 -#define GL_HISTOGRAM_BLUE_SIZE_EXT 0x802A -#define GL_HISTOGRAM_ALPHA_SIZE_EXT 0x802B -#define GL_HISTOGRAM_LUMINANCE_SIZE_EXT 0x802C -#define GL_HISTOGRAM_SINK_EXT 0x802D -#define GL_MINMAX_EXT 0x802E -#define GL_MINMAX_FORMAT_EXT 0x802F -#define GL_MINMAX_SINK_EXT 0x8030 -#define GL_TABLE_TOO_LARGE_EXT 0x8031 -#define GL_CONVOLUTION_1D_EXT 0x8010 -#define GL_CONVOLUTION_2D_EXT 0x8011 -#define GL_SEPARABLE_2D_EXT 0x8012 -#define GL_CONVOLUTION_BORDER_MODE_EXT 0x8013 -#define GL_CONVOLUTION_FILTER_SCALE_EXT 0x8014 -#define GL_CONVOLUTION_FILTER_BIAS_EXT 0x8015 -#define GL_REDUCE_EXT 0x8016 -#define GL_CONVOLUTION_FORMAT_EXT 0x8017 -#define GL_CONVOLUTION_WIDTH_EXT 0x8018 -#define GL_CONVOLUTION_HEIGHT_EXT 0x8019 -#define GL_MAX_CONVOLUTION_WIDTH_EXT 0x801A -#define GL_MAX_CONVOLUTION_HEIGHT_EXT 0x801B -#define GL_POST_CONVOLUTION_RED_SCALE_EXT 0x801C -#define GL_POST_CONVOLUTION_GREEN_SCALE_EXT 0x801D -#define GL_POST_CONVOLUTION_BLUE_SCALE_EXT 0x801E -#define GL_POST_CONVOLUTION_ALPHA_SCALE_EXT 0x801F -#define GL_POST_CONVOLUTION_RED_BIAS_EXT 0x8020 -#define GL_POST_CONVOLUTION_GREEN_BIAS_EXT 0x8021 -#define GL_POST_CONVOLUTION_BLUE_BIAS_EXT 0x8022 -#define GL_POST_CONVOLUTION_ALPHA_BIAS_EXT 0x8023 -#define GL_COLOR_MATRIX_SGI 0x80B1 -#define GL_COLOR_MATRIX_STACK_DEPTH_SGI 0x80B2 -#define GL_MAX_COLOR_MATRIX_STACK_DEPTH_SGI 0x80B3 -#define GL_POST_COLOR_MATRIX_RED_SCALE_SGI 0x80B4 -#define GL_POST_COLOR_MATRIX_GREEN_SCALE_SGI 0x80B5 -#define GL_POST_COLOR_MATRIX_BLUE_SCALE_SGI 0x80B6 -#define GL_POST_COLOR_MATRIX_ALPHA_SCALE_SGI 0x80B7 -#define GL_POST_COLOR_MATRIX_RED_BIAS_SGI 0x80B8 -#define GL_POST_COLOR_MATRIX_GREEN_BIAS_SGI 0x80B9 -#define GL_POST_COLOR_MATRIX_BLUE_BIAS_SGI 0x80BA -#define GL_POST_COLOR_MATRIX_ALPHA_BIAS_SGI 0x80BB -#define GL_COLOR_TABLE_SGI 0x80D0 -#define GL_POST_CONVOLUTION_COLOR_TABLE_SGI 0x80D1 -#define GL_POST_COLOR_MATRIX_COLOR_TABLE_SGI 0x80D2 -#define GL_PROXY_COLOR_TABLE_SGI 0x80D3 -#define GL_PROXY_POST_CONVOLUTION_COLOR_TABLE_SGI 0x80D4 -#define GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE_SGI 0x80D5 -#define GL_COLOR_TABLE_SCALE_SGI 0x80D6 -#define GL_COLOR_TABLE_BIAS_SGI 0x80D7 -#define GL_COLOR_TABLE_FORMAT_SGI 0x80D8 -#define GL_COLOR_TABLE_WIDTH_SGI 0x80D9 -#define GL_COLOR_TABLE_RED_SIZE_SGI 0x80DA -#define GL_COLOR_TABLE_GREEN_SIZE_SGI 0x80DB -#define GL_COLOR_TABLE_BLUE_SIZE_SGI 0x80DC -#define GL_COLOR_TABLE_ALPHA_SIZE_SGI 0x80DD -#define GL_COLOR_TABLE_LUMINANCE_SIZE_SGI 0x80DE -#define GL_COLOR_TABLE_INTENSITY_SIZE_SGI 0x80DF -#define GL_PIXEL_TEXTURE_SGIS 0x8353 -#define GL_PIXEL_FRAGMENT_RGB_SOURCE_SGIS 0x8354 -#define GL_PIXEL_FRAGMENT_ALPHA_SOURCE_SGIS 0x8355 -#define GL_PIXEL_GROUP_COLOR_SGIS 0x8356 -#define GL_PIXEL_TEX_GEN_SGIX 0x8139 -#define GL_PIXEL_TEX_GEN_MODE_SGIX 0x832B -#define GL_PACK_SKIP_VOLUMES_SGIS 0x8130 -#define GL_PACK_IMAGE_DEPTH_SGIS 0x8131 -#define GL_UNPACK_SKIP_VOLUMES_SGIS 0x8132 -#define GL_UNPACK_IMAGE_DEPTH_SGIS 0x8133 -#define GL_TEXTURE_4D_SGIS 0x8134 -#define GL_PROXY_TEXTURE_4D_SGIS 0x8135 -#define GL_TEXTURE_4DSIZE_SGIS 0x8136 -#define GL_TEXTURE_WRAP_Q_SGIS 0x8137 -#define GL_MAX_4D_TEXTURE_SIZE_SGIS 0x8138 -#define GL_TEXTURE_4D_BINDING_SGIS 0x814F -#define GL_TEXTURE_COLOR_TABLE_SGI 0x80BC -#define GL_PROXY_TEXTURE_COLOR_TABLE_SGI 0x80BD -#define GL_CMYK_EXT 0x800C -#define GL_CMYKA_EXT 0x800D -#define GL_PACK_CMYK_HINT_EXT 0x800E -#define GL_UNPACK_CMYK_HINT_EXT 0x800F -#define GL_TEXTURE_PRIORITY_EXT 0x8066 -#define GL_TEXTURE_RESIDENT_EXT 0x8067 -#define GL_TEXTURE_1D_BINDING_EXT 0x8068 -#define GL_TEXTURE_2D_BINDING_EXT 0x8069 -#define GL_TEXTURE_3D_BINDING_EXT 0x806A -#define GL_DETAIL_TEXTURE_2D_SGIS 0x8095 -#define GL_DETAIL_TEXTURE_2D_BINDING_SGIS 0x8096 -#define GL_LINEAR_DETAIL_SGIS 0x8097 -#define GL_LINEAR_DETAIL_ALPHA_SGIS 0x8098 -#define GL_LINEAR_DETAIL_COLOR_SGIS 0x8099 -#define GL_DETAIL_TEXTURE_LEVEL_SGIS 0x809A -#define GL_DETAIL_TEXTURE_MODE_SGIS 0x809B -#define GL_DETAIL_TEXTURE_FUNC_POINTS_SGIS 0x809C -#define GL_LINEAR_SHARPEN_SGIS 0x80AD -#define GL_LINEAR_SHARPEN_ALPHA_SGIS 0x80AE -#define GL_LINEAR_SHARPEN_COLOR_SGIS 0x80AF -#define GL_SHARPEN_TEXTURE_FUNC_POINTS_SGIS 0x80B0 -#define GL_UNSIGNED_BYTE_3_3_2_EXT 0x8032 -#define GL_UNSIGNED_SHORT_4_4_4_4_EXT 0x8033 -#define GL_UNSIGNED_SHORT_5_5_5_1_EXT 0x8034 -#define GL_UNSIGNED_INT_8_8_8_8_EXT 0x8035 -#define GL_UNSIGNED_INT_10_10_10_2_EXT 0x8036 -#define GL_TEXTURE_MIN_LOD_SGIS 0x813A -#define GL_TEXTURE_MAX_LOD_SGIS 0x813B -#define GL_TEXTURE_BASE_LEVEL_SGIS 0x813C -#define GL_TEXTURE_MAX_LEVEL_SGIS 0x813D -#define GL_MULTISAMPLE_SGIS 0x809D -#define GL_SAMPLE_ALPHA_TO_MASK_SGIS 0x809E -#define GL_SAMPLE_ALPHA_TO_ONE_SGIS 0x809F -#define GL_SAMPLE_MASK_SGIS 0x80A0 -#define GL_1PASS_SGIS 0x80A1 -#define GL_2PASS_0_SGIS 0x80A2 -#define GL_2PASS_1_SGIS 0x80A3 -#define GL_4PASS_0_SGIS 0x80A4 -#define GL_4PASS_1_SGIS 0x80A5 -#define GL_4PASS_2_SGIS 0x80A6 -#define GL_4PASS_3_SGIS 0x80A7 -#define GL_SAMPLE_BUFFERS_SGIS 0x80A8 -#define GL_SAMPLES_SGIS 0x80A9 -#define GL_SAMPLE_MASK_VALUE_SGIS 0x80AA -#define GL_SAMPLE_MASK_INVERT_SGIS 0x80AB -#define GL_SAMPLE_PATTERN_SGIS 0x80AC -#define GL_RESCALE_NORMAL_EXT 0x803A -#define GL_VERTEX_ARRAY_EXT 0x8074 -#define GL_NORMAL_ARRAY_EXT 0x8075 -#define GL_COLOR_ARRAY_EXT 0x8076 -#define GL_INDEX_ARRAY_EXT 0x8077 -#define GL_TEXTURE_COORD_ARRAY_EXT 0x8078 -#define GL_EDGE_FLAG_ARRAY_EXT 0x8079 -#define GL_VERTEX_ARRAY_SIZE_EXT 0x807A -#define GL_VERTEX_ARRAY_TYPE_EXT 0x807B -#define GL_VERTEX_ARRAY_STRIDE_EXT 0x807C -#define GL_VERTEX_ARRAY_COUNT_EXT 0x807D -#define GL_NORMAL_ARRAY_TYPE_EXT 0x807E -#define GL_NORMAL_ARRAY_STRIDE_EXT 0x807F -#define GL_NORMAL_ARRAY_COUNT_EXT 0x8080 -#define GL_COLOR_ARRAY_SIZE_EXT 0x8081 -#define GL_COLOR_ARRAY_TYPE_EXT 0x8082 -#define GL_COLOR_ARRAY_STRIDE_EXT 0x8083 -#define GL_COLOR_ARRAY_COUNT_EXT 0x8084 -#define GL_INDEX_ARRAY_TYPE_EXT 0x8085 -#define GL_INDEX_ARRAY_STRIDE_EXT 0x8086 -#define GL_INDEX_ARRAY_COUNT_EXT 0x8087 -#define GL_TEXTURE_COORD_ARRAY_SIZE_EXT 0x8088 -#define GL_TEXTURE_COORD_ARRAY_TYPE_EXT 0x8089 -#define GL_TEXTURE_COORD_ARRAY_STRIDE_EXT 0x808A -#define GL_TEXTURE_COORD_ARRAY_COUNT_EXT 0x808B -#define GL_EDGE_FLAG_ARRAY_STRIDE_EXT 0x808C -#define GL_EDGE_FLAG_ARRAY_COUNT_EXT 0x808D -#define GL_VERTEX_ARRAY_POINTER_EXT 0x808E -#define GL_NORMAL_ARRAY_POINTER_EXT 0x808F -#define GL_COLOR_ARRAY_POINTER_EXT 0x8090 -#define GL_INDEX_ARRAY_POINTER_EXT 0x8091 -#define GL_TEXTURE_COORD_ARRAY_POINTER_EXT 0x8092 -#define GL_EDGE_FLAG_ARRAY_POINTER_EXT 0x8093 -#define GL_GENERATE_MIPMAP_SGIS 0x8191 -#define GL_GENERATE_MIPMAP_HINT_SGIS 0x8192 -#define GL_LINEAR_CLIPMAP_LINEAR_SGIX 0x8170 -#define GL_TEXTURE_CLIPMAP_CENTER_SGIX 0x8171 -#define GL_TEXTURE_CLIPMAP_FRAME_SGIX 0x8172 -#define GL_TEXTURE_CLIPMAP_OFFSET_SGIX 0x8173 -#define GL_TEXTURE_CLIPMAP_VIRTUAL_DEPTH_SGIX 0x8174 -#define GL_TEXTURE_CLIPMAP_LOD_OFFSET_SGIX 0x8175 -#define GL_TEXTURE_CLIPMAP_DEPTH_SGIX 0x8176 -#define GL_MAX_CLIPMAP_DEPTH_SGIX 0x8177 -#define GL_MAX_CLIPMAP_VIRTUAL_DEPTH_SGIX 0x8178 -#define GL_NEAREST_CLIPMAP_NEAREST_SGIX 0x844D -#define GL_NEAREST_CLIPMAP_LINEAR_SGIX 0x844E -#define GL_LINEAR_CLIPMAP_NEAREST_SGIX 0x844F -#define GL_TEXTURE_COMPARE_SGIX 0x819A -#define GL_TEXTURE_COMPARE_OPERATOR_SGIX 0x819B -#define GL_TEXTURE_LEQUAL_R_SGIX 0x819C -#define GL_TEXTURE_GEQUAL_R_SGIX 0x819D -#define GL_CLAMP_TO_EDGE_SGIS 0x812F -#define GL_CLAMP_TO_BORDER_SGIS 0x812D -#define GL_FUNC_ADD_EXT 0x8006 -#define GL_MIN_EXT 0x8007 -#define GL_MAX_EXT 0x8008 -#define GL_BLEND_EQUATION_EXT 0x8009 -#define GL_FUNC_SUBTRACT_EXT 0x800A -#define GL_FUNC_REVERSE_SUBTRACT_EXT 0x800B -#define GL_INTERLACE_SGIX 0x8094 -#define GL_PIXEL_TILE_BEST_ALIGNMENT_SGIX 0x813E -#define GL_PIXEL_TILE_CACHE_INCREMENT_SGIX 0x813F -#define GL_PIXEL_TILE_WIDTH_SGIX 0x8140 -#define GL_PIXEL_TILE_HEIGHT_SGIX 0x8141 -#define GL_PIXEL_TILE_GRID_WIDTH_SGIX 0x8142 -#define GL_PIXEL_TILE_GRID_HEIGHT_SGIX 0x8143 -#define GL_PIXEL_TILE_GRID_DEPTH_SGIX 0x8144 -#define GL_PIXEL_TILE_CACHE_SIZE_SGIX 0x8145 -#define GL_DUAL_ALPHA4_SGIS 0x8110 -#define GL_DUAL_ALPHA8_SGIS 0x8111 -#define GL_DUAL_ALPHA12_SGIS 0x8112 -#define GL_DUAL_ALPHA16_SGIS 0x8113 -#define GL_DUAL_LUMINANCE4_SGIS 0x8114 -#define GL_DUAL_LUMINANCE8_SGIS 0x8115 -#define GL_DUAL_LUMINANCE12_SGIS 0x8116 -#define GL_DUAL_LUMINANCE16_SGIS 0x8117 -#define GL_DUAL_INTENSITY4_SGIS 0x8118 -#define GL_DUAL_INTENSITY8_SGIS 0x8119 -#define GL_DUAL_INTENSITY12_SGIS 0x811A -#define GL_DUAL_INTENSITY16_SGIS 0x811B -#define GL_DUAL_LUMINANCE_ALPHA4_SGIS 0x811C -#define GL_DUAL_LUMINANCE_ALPHA8_SGIS 0x811D -#define GL_QUAD_ALPHA4_SGIS 0x811E -#define GL_QUAD_ALPHA8_SGIS 0x811F -#define GL_QUAD_LUMINANCE4_SGIS 0x8120 -#define GL_QUAD_LUMINANCE8_SGIS 0x8121 -#define GL_QUAD_INTENSITY4_SGIS 0x8122 -#define GL_QUAD_INTENSITY8_SGIS 0x8123 -#define GL_DUAL_TEXTURE_SELECT_SGIS 0x8124 -#define GL_QUAD_TEXTURE_SELECT_SGIS 0x8125 -#define GL_SPRITE_SGIX 0x8148 -#define GL_SPRITE_MODE_SGIX 0x8149 -#define GL_SPRITE_AXIS_SGIX 0x814A -#define GL_SPRITE_TRANSLATION_SGIX 0x814B -#define GL_SPRITE_AXIAL_SGIX 0x814C -#define GL_SPRITE_OBJECT_ALIGNED_SGIX 0x814D -#define GL_SPRITE_EYE_ALIGNED_SGIX 0x814E -#define GL_TEXTURE_MULTI_BUFFER_HINT_SGIX 0x812E -#define GL_POINT_SIZE_MIN_EXT 0x8126 -#define GL_POINT_SIZE_MIN_SGIS 0x8126 -#define GL_POINT_SIZE_MAX_EXT 0x8127 -#define GL_POINT_SIZE_MAX_SGIS 0x8127 -#define GL_POINT_FADE_THRESHOLD_SIZE_EXT 0x8128 -#define GL_POINT_FADE_THRESHOLD_SIZE_SGIS 0x8128 -#define GL_DISTANCE_ATTENUATION_EXT 0x8129 -#define GL_DISTANCE_ATTENUATION_SGIS 0x8129 -#define GL_INSTRUMENT_BUFFER_POINTER_SGIX 0x8180 -#define GL_INSTRUMENT_MEASUREMENTS_SGIX 0x8181 -#define GL_POST_TEXTURE_FILTER_BIAS_SGIX 0x8179 -#define GL_POST_TEXTURE_FILTER_SCALE_SGIX 0x817A -#define GL_POST_TEXTURE_FILTER_BIAS_RANGE_SGIX 0x817B -#define GL_POST_TEXTURE_FILTER_SCALE_RANGE_SGIX 0x817C -#define GL_FRAMEZOOM_SGIX 0x818B -#define GL_FRAMEZOOM_FACTOR_SGIX 0x818C -#define GL_MAX_FRAMEZOOM_FACTOR_SGIX 0x818D -#define GL_REFERENCE_PLANE_SGIX 0x817D -#define GL_REFERENCE_PLANE_EQUATION_SGIX 0x817E -#define GL_DEPTH_COMPONENT16_SGIX 0x81A5 -#define GL_DEPTH_COMPONENT24_SGIX 0x81A6 -#define GL_DEPTH_COMPONENT32_SGIX 0x81A7 -#define GL_FOG_FUNC_SGIS 0x812A -#define GL_FOG_FUNC_POINTS_SGIS 0x812B -#define GL_MAX_FOG_FUNC_POINTS_SGIS 0x812C -#define GL_FOG_OFFSET_SGIX 0x8198 -#define GL_FOG_OFFSET_VALUE_SGIX 0x8199 -#define GL_IMAGE_SCALE_X_HP 0x8155 -#define GL_IMAGE_SCALE_Y_HP 0x8156 -#define GL_IMAGE_TRANSLATE_X_HP 0x8157 -#define GL_IMAGE_TRANSLATE_Y_HP 0x8158 -#define GL_IMAGE_ROTATE_ANGLE_HP 0x8159 -#define GL_IMAGE_ROTATE_ORIGIN_X_HP 0x815A -#define GL_IMAGE_ROTATE_ORIGIN_Y_HP 0x815B -#define GL_IMAGE_MAG_FILTER_HP 0x815C -#define GL_IMAGE_MIN_FILTER_HP 0x815D -#define GL_IMAGE_CUBIC_WEIGHT_HP 0x815E -#define GL_CUBIC_HP 0x815F -#define GL_AVERAGE_HP 0x8160 -#define GL_IMAGE_TRANSFORM_2D_HP 0x8161 -#define GL_POST_IMAGE_TRANSFORM_COLOR_TABLE_HP 0x8162 -#define GL_PROXY_POST_IMAGE_TRANSFORM_COLOR_TABLE_HP 0x8163 -#define GL_IGNORE_BORDER_HP 0x8150 -#define GL_CONSTANT_BORDER_HP 0x8151 -#define GL_REPLICATE_BORDER_HP 0x8153 -#define GL_CONVOLUTION_BORDER_COLOR_HP 0x8154 -#define GL_TEXTURE_ENV_BIAS_SGIX 0x80BE -#define GL_VERTEX_DATA_HINT_PGI 0x1A22A -#define GL_VERTEX_CONSISTENT_HINT_PGI 0x1A22B -#define GL_MATERIAL_SIDE_HINT_PGI 0x1A22C -#define GL_MAX_VERTEX_HINT_PGI 0x1A22D -#define GL_COLOR3_BIT_PGI 0x00010000 -#define GL_COLOR4_BIT_PGI 0x00020000 -#define GL_EDGEFLAG_BIT_PGI 0x00040000 -#define GL_INDEX_BIT_PGI 0x00080000 -#define GL_MAT_AMBIENT_BIT_PGI 0x00100000 -#define GL_MAT_AMBIENT_AND_DIFFUSE_BIT_PGI 0x00200000 -#define GL_MAT_DIFFUSE_BIT_PGI 0x00400000 -#define GL_MAT_EMISSION_BIT_PGI 0x00800000 -#define GL_MAT_COLOR_INDEXES_BIT_PGI 0x01000000 -#define GL_MAT_SHININESS_BIT_PGI 0x02000000 -#define GL_MAT_SPECULAR_BIT_PGI 0x04000000 -#define GL_NORMAL_BIT_PGI 0x08000000 -#define GL_TEXCOORD1_BIT_PGI 0x10000000 -#define GL_TEXCOORD2_BIT_PGI 0x20000000 -#define GL_TEXCOORD3_BIT_PGI 0x40000000 -#define GL_TEXCOORD4_BIT_PGI 0x80000000 -#define GL_VERTEX23_BIT_PGI 0x00000004 -#define GL_VERTEX4_BIT_PGI 0x00000008 -#define GL_PREFER_DOUBLEBUFFER_HINT_PGI 0x1A1F8 -#define GL_CONSERVE_MEMORY_HINT_PGI 0x1A1FD -#define GL_RECLAIM_MEMORY_HINT_PGI 0x1A1FE -#define GL_NATIVE_GRAPHICS_HANDLE_PGI 0x1A202 -#define GL_NATIVE_GRAPHICS_BEGIN_HINT_PGI 0x1A203 -#define GL_NATIVE_GRAPHICS_END_HINT_PGI 0x1A204 -#define GL_ALWAYS_FAST_HINT_PGI 0x1A20C -#define GL_ALWAYS_SOFT_HINT_PGI 0x1A20D -#define GL_ALLOW_DRAW_OBJ_HINT_PGI 0x1A20E -#define GL_ALLOW_DRAW_WIN_HINT_PGI 0x1A20F -#define GL_ALLOW_DRAW_FRG_HINT_PGI 0x1A210 -#define GL_ALLOW_DRAW_MEM_HINT_PGI 0x1A211 -#define GL_STRICT_DEPTHFUNC_HINT_PGI 0x1A216 -#define GL_STRICT_LIGHTING_HINT_PGI 0x1A217 -#define GL_STRICT_SCISSOR_HINT_PGI 0x1A218 -#define GL_FULL_STIPPLE_HINT_PGI 0x1A219 -#define GL_CLIP_NEAR_HINT_PGI 0x1A220 -#define GL_CLIP_FAR_HINT_PGI 0x1A221 -#define GL_WIDE_LINE_HINT_PGI 0x1A222 -#define GL_BACK_NORMALS_HINT_PGI 0x1A223 -#define GL_COLOR_INDEX1_EXT 0x80E2 -#define GL_COLOR_INDEX2_EXT 0x80E3 -#define GL_COLOR_INDEX4_EXT 0x80E4 -#define GL_COLOR_INDEX8_EXT 0x80E5 -#define GL_COLOR_INDEX12_EXT 0x80E6 -#define GL_COLOR_INDEX16_EXT 0x80E7 -#define GL_TEXTURE_INDEX_SIZE_EXT 0x80ED -#define GL_CLIP_VOLUME_CLIPPING_HINT_EXT 0x80F0 -#define GL_LIST_PRIORITY_SGIX 0x8182 -#define GL_IR_INSTRUMENT1_SGIX 0x817F -#define GL_CALLIGRAPHIC_FRAGMENT_SGIX 0x8183 -#define GL_TEXTURE_LOD_BIAS_S_SGIX 0x818E -#define GL_TEXTURE_LOD_BIAS_T_SGIX 0x818F -#define GL_TEXTURE_LOD_BIAS_R_SGIX 0x8190 -#define GL_SHADOW_AMBIENT_SGIX 0x80BF -#define GL_INDEX_MATERIAL_EXT 0x81B8 -#define GL_INDEX_MATERIAL_PARAMETER_EXT 0x81B9 -#define GL_INDEX_MATERIAL_FACE_EXT 0x81BA -#define GL_INDEX_TEST_EXT 0x81B5 -#define GL_INDEX_TEST_FUNC_EXT 0x81B6 -#define GL_INDEX_TEST_REF_EXT 0x81B7 -#define GL_IUI_V2F_EXT 0x81AD -#define GL_IUI_V3F_EXT 0x81AE -#define GL_IUI_N3F_V2F_EXT 0x81AF -#define GL_IUI_N3F_V3F_EXT 0x81B0 -#define GL_T2F_IUI_V2F_EXT 0x81B1 -#define GL_T2F_IUI_V3F_EXT 0x81B2 -#define GL_T2F_IUI_N3F_V2F_EXT 0x81B3 -#define GL_T2F_IUI_N3F_V3F_EXT 0x81B4 -#define GL_ARRAY_ELEMENT_LOCK_FIRST_EXT 0x81A8 -#define GL_ARRAY_ELEMENT_LOCK_COUNT_EXT 0x81A9 -#define GL_CULL_VERTEX_EXT 0x81AA -#define GL_CULL_VERTEX_EYE_POSITION_EXT 0x81AB -#define GL_CULL_VERTEX_OBJECT_POSITION_EXT 0x81AC -#define GL_YCRCB_422_SGIX 0x81BB -#define GL_YCRCB_444_SGIX 0x81BC -#define GL_FRAGMENT_LIGHTING_SGIX 0x8400 -#define GL_FRAGMENT_COLOR_MATERIAL_SGIX 0x8401 -#define GL_FRAGMENT_COLOR_MATERIAL_FACE_SGIX 0x8402 -#define GL_FRAGMENT_COLOR_MATERIAL_PARAMETER_SGIX 0x8403 -#define GL_MAX_FRAGMENT_LIGHTS_SGIX 0x8404 -#define GL_MAX_ACTIVE_LIGHTS_SGIX 0x8405 -#define GL_CURRENT_RASTER_NORMAL_SGIX 0x8406 -#define GL_LIGHT_ENV_MODE_SGIX 0x8407 -#define GL_FRAGMENT_LIGHT_MODEL_LOCAL_VIEWER_SGIX 0x8408 -#define GL_FRAGMENT_LIGHT_MODEL_TWO_SIDE_SGIX 0x8409 -#define GL_FRAGMENT_LIGHT_MODEL_AMBIENT_SGIX 0x840A -#define GL_FRAGMENT_LIGHT_MODEL_NORMAL_INTERPOLATION_SGIX 0x840B -#define GL_FRAGMENT_LIGHT0_SGIX 0x840C -#define GL_FRAGMENT_LIGHT1_SGIX 0x840D -#define GL_FRAGMENT_LIGHT2_SGIX 0x840E -#define GL_FRAGMENT_LIGHT3_SGIX 0x840F -#define GL_FRAGMENT_LIGHT4_SGIX 0x8410 -#define GL_FRAGMENT_LIGHT5_SGIX 0x8411 -#define GL_FRAGMENT_LIGHT6_SGIX 0x8412 -#define GL_FRAGMENT_LIGHT7_SGIX 0x8413 -#define GL_RASTER_POSITION_UNCLIPPED_IBM 0x19262 -#define GL_TEXTURE_LIGHTING_MODE_HP 0x8167 -#define GL_TEXTURE_POST_SPECULAR_HP 0x8168 -#define GL_TEXTURE_PRE_SPECULAR_HP 0x8169 -#define GL_MAX_ELEMENTS_VERTICES_EXT 0x80E8 -#define GL_MAX_ELEMENTS_INDICES_EXT 0x80E9 -#define GL_PHONG_WIN 0x80EA -#define GL_PHONG_HINT_WIN 0x80EB -#define GL_FOG_SPECULAR_TEXTURE_WIN 0x80EC -#define GL_FRAGMENT_MATERIAL_EXT 0x8349 -#define GL_FRAGMENT_NORMAL_EXT 0x834A -#define GL_FRAGMENT_COLOR_EXT 0x834C -#define GL_ATTENUATION_EXT 0x834D -#define GL_SHADOW_ATTENUATION_EXT 0x834E -#define GL_TEXTURE_APPLICATION_MODE_EXT 0x834F -#define GL_TEXTURE_LIGHT_EXT 0x8350 -#define GL_TEXTURE_MATERIAL_FACE_EXT 0x8351 -#define GL_TEXTURE_MATERIAL_PARAMETER_EXT 0x8352 -/* reuse GL_FRAGMENT_DEPTH_EXT */ -#define GL_ALPHA_MIN_SGIX 0x8320 -#define GL_ALPHA_MAX_SGIX 0x8321 -#define GL_BGR_EXT 0x80E0 -#define GL_BGRA_EXT 0x80E1 -#define GL_PARALLEL_ARRAYS_INTEL 0x83F4 -#define GL_VERTEX_ARRAY_PARALLEL_POINTERS_INTEL 0x83F5 -#define GL_NORMAL_ARRAY_PARALLEL_POINTERS_INTEL 0x83F6 -#define GL_COLOR_ARRAY_PARALLEL_POINTERS_INTEL 0x83F7 -#define GL_TEXTURE_COORD_ARRAY_PARALLEL_POINTERS_INTEL 0x83F8 -#define GL_OCCLUSION_TEST_HP 0x8165 -#define GL_OCCLUSION_TEST_RESULT_HP 0x8166 -#define GL_PIXEL_TRANSFORM_2D_EXT 0x8330 -#define GL_PIXEL_MAG_FILTER_EXT 0x8331 -#define GL_PIXEL_MIN_FILTER_EXT 0x8332 -#define GL_PIXEL_CUBIC_WEIGHT_EXT 0x8333 -#define GL_CUBIC_EXT 0x8334 -#define GL_AVERAGE_EXT 0x8335 -#define GL_PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT 0x8336 -#define GL_MAX_PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT 0x8337 -#define GL_PIXEL_TRANSFORM_2D_MATRIX_EXT 0x8338 -#define GL_SHARED_TEXTURE_PALETTE_EXT 0x81FB -#define GL_LIGHT_MODEL_COLOR_CONTROL_EXT 0x81F8 -#define GL_SINGLE_COLOR_EXT 0x81F9 -#define GL_SEPARATE_SPECULAR_COLOR_EXT 0x81FA -#define GL_COLOR_SUM_EXT 0x8458 -#define GL_CURRENT_SECONDARY_COLOR_EXT 0x8459 -#define GL_SECONDARY_COLOR_ARRAY_SIZE_EXT 0x845A -#define GL_SECONDARY_COLOR_ARRAY_TYPE_EXT 0x845B -#define GL_SECONDARY_COLOR_ARRAY_STRIDE_EXT 0x845C -#define GL_SECONDARY_COLOR_ARRAY_POINTER_EXT 0x845D -#define GL_SECONDARY_COLOR_ARRAY_EXT 0x845E -#define GL_PERTURB_EXT 0x85AE -#define GL_TEXTURE_NORMAL_EXT 0x85AF -#define GL_FOG_COORDINATE_SOURCE_EXT 0x8450 -#define GL_FOG_COORDINATE_EXT 0x8451 -#define GL_FRAGMENT_DEPTH_EXT 0x8452 -#define GL_CURRENT_FOG_COORDINATE_EXT 0x8453 -#define GL_FOG_COORDINATE_ARRAY_TYPE_EXT 0x8454 -#define GL_FOG_COORDINATE_ARRAY_STRIDE_EXT 0x8455 -#define GL_FOG_COORDINATE_ARRAY_POINTER_EXT 0x8456 -#define GL_FOG_COORDINATE_ARRAY_EXT 0x8457 -#define GL_SCREEN_COORDINATES_REND 0x8490 -#define GL_INVERTED_SCREEN_W_REND 0x8491 -#define GL_TANGENT_ARRAY_EXT 0x8439 -#define GL_BINORMAL_ARRAY_EXT 0x843A -#define GL_CURRENT_TANGENT_EXT 0x843B -#define GL_CURRENT_BINORMAL_EXT 0x843C -#define GL_TANGENT_ARRAY_TYPE_EXT 0x843E -#define GL_TANGENT_ARRAY_STRIDE_EXT 0x843F -#define GL_BINORMAL_ARRAY_TYPE_EXT 0x8440 -#define GL_BINORMAL_ARRAY_STRIDE_EXT 0x8441 -#define GL_TANGENT_ARRAY_POINTER_EXT 0x8442 -#define GL_BINORMAL_ARRAY_POINTER_EXT 0x8443 -#define GL_MAP1_TANGENT_EXT 0x8444 -#define GL_MAP2_TANGENT_EXT 0x8445 -#define GL_MAP1_BINORMAL_EXT 0x8446 -#define GL_MAP2_BINORMAL_EXT 0x8447 -#define GL_COMBINE_EXT 0x8570 -#define GL_COMBINE_RGB_EXT 0x8571 -#define GL_COMBINE_ALPHA_EXT 0x8572 -#define GL_RGB_SCALE_EXT 0x8573 -#define GL_ADD_SIGNED_EXT 0x8574 -#define GL_INTERPOLATE_EXT 0x8575 -#define GL_CONSTANT_EXT 0x8576 -#define GL_PRIMARY_COLOR_EXT 0x8577 -#define GL_PREVIOUS_EXT 0x8578 -#define GL_SOURCE0_RGB_EXT 0x8580 -#define GL_SOURCE1_RGB_EXT 0x8581 -#define GL_SOURCE2_RGB_EXT 0x8582 -#define GL_SOURCE3_RGB_EXT 0x8583 -#define GL_SOURCE4_RGB_EXT 0x8584 -#define GL_SOURCE5_RGB_EXT 0x8585 -#define GL_SOURCE6_RGB_EXT 0x8586 -#define GL_SOURCE7_RGB_EXT 0x8587 -#define GL_SOURCE0_ALPHA_EXT 0x8588 -#define GL_SOURCE1_ALPHA_EXT 0x8589 -#define GL_SOURCE2_ALPHA_EXT 0x858A -#define GL_SOURCE3_ALPHA_EXT 0x858B -#define GL_SOURCE4_ALPHA_EXT 0x858C -#define GL_SOURCE5_ALPHA_EXT 0x858D -#define GL_SOURCE6_ALPHA_EXT 0x858E -#define GL_SOURCE7_ALPHA_EXT 0x858F -#define GL_OPERAND0_RGB_EXT 0x8590 -#define GL_OPERAND1_RGB_EXT 0x8591 -#define GL_OPERAND2_RGB_EXT 0x8592 -#define GL_OPERAND3_RGB_EXT 0x8593 -#define GL_OPERAND4_RGB_EXT 0x8594 -#define GL_OPERAND5_RGB_EXT 0x8595 -#define GL_OPERAND6_RGB_EXT 0x8596 -#define GL_OPERAND7_RGB_EXT 0x8597 -#define GL_OPERAND0_ALPHA_EXT 0x8598 -#define GL_OPERAND1_ALPHA_EXT 0x8599 -#define GL_OPERAND2_ALPHA_EXT 0x859A -#define GL_OPERAND3_ALPHA_EXT 0x859B -#define GL_OPERAND4_ALPHA_EXT 0x859C -#define GL_OPERAND5_ALPHA_EXT 0x859D -#define GL_OPERAND6_ALPHA_EXT 0x859E -#define GL_OPERAND7_ALPHA_EXT 0x859F -#define GL_LIGHT_MODEL_SPECULAR_VECTOR_APPLE 0x85B0 -#define GL_TRANSFORM_HINT_APPLE 0x85B1 -#define GL_FOG_SCALE_SGIX 0x81FC -#define GL_FOG_SCALE_VALUE_SGIX 0x81FD -#define GL_UNPACK_CONSTANT_DATA_SUNX 0x81D5 -#define GL_TEXTURE_CONSTANT_DATA_SUNX 0x81D6 -#define GL_GLOBAL_ALPHA_SUN 0x81D9 -#define GL_GLOBAL_ALPHA_FACTOR_SUN 0x81DA -#define GL_RESTART_SUN 0x01 -#define GL_REPLACE_MIDDLE_SUN 0x02 -#define GL_REPLACE_OLDEST_SUN 0x03 -#define GL_TRIANGLE_LIST_SUN 0x81D7 -#define GL_REPLACEMENT_CODE_SUN 0x81D8 -#define GL_REPLACEMENT_CODE_ARRAY_SUN 0x85C0 -#define GL_REPLACEMENT_CODE_ARRAY_TYPE_SUN 0x85C1 -#define GL_REPLACEMENT_CODE_ARRAY_STRIDE_SUN 0x85C2 -#define GL_REPLACEMENT_CODE_ARRAY_POINTER_SUN 0x85C3 -#define GL_R1UI_V3F_SUN 0x85C4 -#define GL_R1UI_C4UB_V3F_SUN 0x85C5 -#define GL_R1UI_C3F_V3F_SUN 0x85C6 -#define GL_R1UI_N3F_V3F_SUN 0x85C7 -#define GL_R1UI_C4F_N3F_V3F_SUN 0x85C8 -#define GL_R1UI_T2F_V3F_SUN 0x85C9 -#define GL_R1UI_T2F_N3F_V3F_SUN 0x85CA -#define GL_R1UI_T2F_C4F_N3F_V3F_SUN 0x85CB -#define GL_BLEND_DST_RGB_EXT 0x80C8 -#define GL_BLEND_SRC_RGB_EXT 0x80C9 -#define GL_BLEND_DST_ALPHA_EXT 0x80CA -#define GL_BLEND_SRC_ALPHA_EXT 0x80CB -#define GL_RED_MIN_CLAMP_INGR 0x8560 -#define GL_GREEN_MIN_CLAMP_INGR 0x8561 -#define GL_BLUE_MIN_CLAMP_INGR 0x8562 -#define GL_ALPHA_MIN_CLAMP_INGR 0x8563 -#define GL_RED_MAX_CLAMP_INGR 0x8564 -#define GL_GREEN_MAX_CLAMP_INGR 0x8565 -#define GL_BLUE_MAX_CLAMP_INGR 0x8566 -#define GL_ALPHA_MAX_CLAMP_INGR 0x8567 -#define GL_INTERLACE_READ_INGR 0x8568 -#define GL_INCR_WRAP_EXT 0x8507 -#define GL_DECR_WRAP_EXT 0x8508 -#define GL_422_EXT 0x80CC -#define GL_422_REV_EXT 0x80CD -#define GL_422_AVERAGE_EXT 0x80CE -#define GL_422_REV_AVERAGE_EXT 0x80CF -#define GL_NORMAL_MAP_NV 0x8511 -#define GL_REFLECTION_MAP_NV 0x8512 -#define GL_NORMAL_MAP_EXT 0x8511 -#define GL_REFLECTION_MAP_EXT 0x8512 -#define GL_TEXTURE_CUBE_MAP_EXT 0x8513 -#define GL_TEXTURE_BINDING_CUBE_MAP_EXT 0x8514 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_X_EXT 0x8515 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X_EXT 0x8516 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y_EXT 0x8517 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_EXT 0x8518 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z_EXT 0x8519 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_EXT 0x851A -#define GL_PROXY_TEXTURE_CUBE_MAP_EXT 0x851B -#define GL_MAX_CUBE_MAP_TEXTURE_SIZE_EXT 0x851C -#define GL_WRAP_BORDER_SUN 0x81D4 -#define GL_MAX_TEXTURE_LOD_BIAS_EXT 0x84FD -#define GL_TEXTURE_FILTER_CONTROL_EXT 0x8500 -#define GL_TEXTURE_LOD_BIAS_EXT 0x8501 -#define GL_TEXTURE_MAX_ANISOTROPY_EXT 0x84FE -#define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT 0x84FF -#define GL_MODELVIEW0_STACK_DEPTH_EXT GL_MODELVIEW_STACK_DEPTH -#define GL_MODELVIEW1_STACK_DEPTH_EXT 0x8502 -#define GL_MODELVIEW0_MATRIX_EXT GL_MODELVIEW_MATRIX -#define GL_MODELVIEW_MATRIX1_EXT 0x8506 -#define GL_VERTEX_WEIGHTING_EXT 0x8509 -#define GL_MODELVIEW0_EXT GL_MODELVIEW -#define GL_MODELVIEW1_EXT 0x850A -#define GL_CURRENT_VERTEX_WEIGHT_EXT 0x850B -#define GL_VERTEX_WEIGHT_ARRAY_EXT 0x850C -#define GL_VERTEX_WEIGHT_ARRAY_SIZE_EXT 0x850D -#define GL_VERTEX_WEIGHT_ARRAY_TYPE_EXT 0x850E -#define GL_VERTEX_WEIGHT_ARRAY_STRIDE_EXT 0x850F -#define GL_VERTEX_WEIGHT_ARRAY_POINTER_EXT 0x8510 -#define GL_MAX_SHININESS_NV 0x8504 -#define GL_MAX_SPOT_EXPONENT_NV 0x8505 -#define GL_VERTEX_ARRAY_RANGE_NV 0x851D -#define GL_VERTEX_ARRAY_RANGE_LENGTH_NV 0x851E -#define GL_VERTEX_ARRAY_RANGE_VALID_NV 0x851F -#define GL_MAX_VERTEX_ARRAY_RANGE_ELEMENT_NV 0x8520 -#define GL_VERTEX_ARRAY_RANGE_POINTER_NV 0x8521 -#define GL_REGISTER_COMBINERS_NV 0x8522 -#define GL_VARIABLE_A_NV 0x8523 -#define GL_VARIABLE_B_NV 0x8524 -#define GL_VARIABLE_C_NV 0x8525 -#define GL_VARIABLE_D_NV 0x8526 -#define GL_VARIABLE_E_NV 0x8527 -#define GL_VARIABLE_F_NV 0x8528 -#define GL_VARIABLE_G_NV 0x8529 -#define GL_CONSTANT_COLOR0_NV 0x852A -#define GL_CONSTANT_COLOR1_NV 0x852B -#define GL_PRIMARY_COLOR_NV 0x852C -#define GL_SECONDARY_COLOR_NV 0x852D -#define GL_SPARE0_NV 0x852E -#define GL_SPARE1_NV 0x852F -#define GL_DISCARD_NV 0x8530 -#define GL_E_TIMES_F_NV 0x8531 -#define GL_SPARE0_PLUS_SECONDARY_COLOR_NV 0x8532 -#define GL_UNSIGNED_IDENTITY_NV 0x8536 -#define GL_UNSIGNED_INVERT_NV 0x8537 -#define GL_EXPAND_NORMAL_NV 0x8538 -#define GL_EXPAND_NEGATE_NV 0x8539 -#define GL_HALF_BIAS_NORMAL_NV 0x853A -#define GL_HALF_BIAS_NEGATE_NV 0x853B -#define GL_SIGNED_IDENTITY_NV 0x853C -#define GL_SIGNED_NEGATE_NV 0x853D -#define GL_SCALE_BY_TWO_NV 0x853E -#define GL_SCALE_BY_FOUR_NV 0x853F -#define GL_SCALE_BY_ONE_HALF_NV 0x8540 -#define GL_BIAS_BY_NEGATIVE_ONE_HALF_NV 0x8541 -#define GL_COMBINER_INPUT_NV 0x8542 -#define GL_COMBINER_MAPPING_NV 0x8543 -#define GL_COMBINER_COMPONENT_USAGE_NV 0x8544 -#define GL_COMBINER_AB_DOT_PRODUCT_NV 0x8545 -#define GL_COMBINER_CD_DOT_PRODUCT_NV 0x8546 -#define GL_COMBINER_MUX_SUM_NV 0x8547 -#define GL_COMBINER_SCALE_NV 0x8548 -#define GL_COMBINER_BIAS_NV 0x8549 -#define GL_COMBINER_AB_OUTPUT_NV 0x854A -#define GL_COMBINER_CD_OUTPUT_NV 0x854B -#define GL_COMBINER_SUM_OUTPUT_NV 0x854C -#define GL_MAX_GENERAL_COMBINERS_NV 0x854D -#define GL_NUM_GENERAL_COMBINERS_NV 0x854E -#define GL_COLOR_SUM_CLAMP_NV 0x854F -#define GL_COMBINER0_NV 0x8550 -#define GL_COMBINER1_NV 0x8551 -#define GL_COMBINER2_NV 0x8552 -#define GL_COMBINER3_NV 0x8553 -#define GL_COMBINER4_NV 0x8554 -#define GL_COMBINER5_NV 0x8555 -#define GL_COMBINER6_NV 0x8556 -#define GL_COMBINER7_NV 0x8557 -/* reuse GL_TEXTURE0_ARB */ -/* reuse GL_TEXTURE1_ARB */ -/* reuse GL_ZERO */ -/* reuse GL_NONE */ -/* reuse GL_FOG */ -#define GL_FOG_DISTANCE_MODE_NV 0x855A -#define GL_EYE_RADIAL_NV 0x855B -#define GL_EYE_PLANE_ABSOLUTE_NV 0x855C -/* reuse GL_EYE_PLANE */ -#define GL_EMBOSS_LIGHT_NV 0x855D -#define GL_EMBOSS_CONSTANT_NV 0x855E -#define GL_EMBOSS_MAP_NV 0x855F -#define GL_COMBINE4_NV 0x8503 -#define GL_SOURCE3_RGB_NV 0x8583 -#define GL_SOURCE3_ALPHA_NV 0x858B -#define GL_OPERAND3_RGB_NV 0x8593 -#define GL_OPERAND3_ALPHA_NV 0x859B -#define GL_COMPRESSED_RGB_S3TC_DXT1_EXT 0x83F0 -#define GL_COMPRESSED_RGBA_S3TC_DXT1_EXT 0x83F1 -#define GL_COMPRESSED_RGBA_S3TC_DXT3_EXT 0x83F2 -#define GL_COMPRESSED_RGBA_S3TC_DXT5_EXT 0x83F3 -#define GL_CULL_VERTEX_IBM 103050 -#define GL_VERTEX_ARRAY_LIST_IBM 103070 -#define GL_NORMAL_ARRAY_LIST_IBM 103071 -#define GL_COLOR_ARRAY_LIST_IBM 103072 -#define GL_INDEX_ARRAY_LIST_IBM 103073 -#define GL_TEXTURE_COORD_ARRAY_LIST_IBM 103074 -#define GL_EDGE_FLAG_ARRAY_LIST_IBM 103075 -#define GL_FOG_COORDINATE_ARRAY_LIST_IBM 103076 -#define GL_SECONDARY_COLOR_ARRAY_LIST_IBM 103077 -#define GL_VERTEX_ARRAY_LIST_STRIDE_IBM 103080 -#define GL_NORMAL_ARRAY_LIST_STRIDE_IBM 103081 -#define GL_COLOR_ARRAY_LIST_STRIDE_IBM 103082 -#define GL_INDEX_ARRAY_LIST_STRIDE_IBM 103083 -#define GL_TEXTURE_COORD_ARRAY_LIST_STRIDE_IBM 103084 -#define GL_EDGE_FLAG_ARRAY_LIST_STRIDE_IBM 103085 -#define GL_FOG_COORDINATE_ARRAY_LIST_STRIDE_IBM 103086 -#define GL_SECONDARY_COLOR_ARRAY_LIST_STRIDE_IBM 103087 -#define GL_PACK_SUBSAMPLE_RATE_SGIX 0x85A0 -#define GL_UNPACK_SUBSAMPLE_RATE_SGIX 0x85A1 -#define GL_PIXEL_SUBSAMPLE_4444_SGIX 0x85A2 -#define GL_PIXEL_SUBSAMPLE_2424_SGIX 0x85A3 -#define GL_PIXEL_SUBSAMPLE_4242_SGIX 0x85A4 -#define GL_YCRCB_SGIX 0x8318 -#define GL_YCRCBA_SGIX 0x8319 -#define GL_DEPTH_PASS_INSTRUMENT_SGIX 0x8310 -#define GL_DEPTH_PASS_INSTRUMENT_COUNTERS_SGIX 0x8311 -#define GL_DEPTH_PASS_INSTRUMENT_MAX_SGIX 0x8312 -#define GL_COMPRESSED_RGB_FXT1_3DFX 0x86B0 -#define GL_COMPRESSED_RGBA_FXT1_3DFX 0x86B1 -#define GL_MULTISAMPLE_3DFX 0x86B2 -#define GL_SAMPLE_BUFFERS_3DFX 0x86B3 -#define GL_SAMPLES_3DFX 0x86B4 -#define GL_MULTISAMPLE_BIT_3DFX 0x20000000 -#define GL_MULTISAMPLE_EXT 0x809D -#define GL_SAMPLE_ALPHA_TO_MASK_EXT 0x809E -#define GL_SAMPLE_ALPHA_TO_ONE_EXT 0x809F -#define GL_SAMPLE_MASK_EXT 0x80A0 -#define GL_1PASS_EXT 0x80A1 -#define GL_2PASS_0_EXT 0x80A2 -#define GL_2PASS_1_EXT 0x80A3 -#define GL_4PASS_0_EXT 0x80A4 -#define GL_4PASS_1_EXT 0x80A5 -#define GL_4PASS_2_EXT 0x80A6 -#define GL_4PASS_3_EXT 0x80A7 -#define GL_SAMPLE_BUFFERS_EXT 0x80A8 -#define GL_SAMPLES_EXT 0x80A9 -#define GL_SAMPLE_MASK_VALUE_EXT 0x80AA -#define GL_SAMPLE_MASK_INVERT_EXT 0x80AB -#define GL_SAMPLE_PATTERN_EXT 0x80AC -#define GL_VERTEX_PRECLIP_SGIX 0x83EE -#define GL_VERTEX_PRECLIP_HINT_SGIX 0x83EF -#define GL_CONVOLUTION_HINT_SGIX 0x8316 -#define GL_PACK_RESAMPLE_SGIX 0x842C -#define GL_UNPACK_RESAMPLE_SGIX 0x842D -#define GL_RESAMPLE_REPLICATE_SGIX 0x842E -#define GL_RESAMPLE_ZERO_FILL_SGIX 0x842F -#define GL_RESAMPLE_DECIMATE_SGIX 0x8430 -#define GL_EYE_DISTANCE_TO_POINT_SGIS 0x81F0 -#define GL_OBJECT_DISTANCE_TO_POINT_SGIS 0x81F1 -#define GL_EYE_DISTANCE_TO_LINE_SGIS 0x81F2 -#define GL_OBJECT_DISTANCE_TO_LINE_SGIS 0x81F3 -#define GL_EYE_POINT_SGIS 0x81F4 -#define GL_OBJECT_POINT_SGIS 0x81F5 -#define GL_EYE_LINE_SGIS 0x81F6 -#define GL_OBJECT_LINE_SGIS 0x81F7 - - -/*************************************************************/ - -extern void APIENTRY glBlendColor (GLclampf, GLclampf, GLclampf, GLclampf); -typedef void (APIENTRY * PFNGLBLENDCOLORPROC) (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); -extern void APIENTRY glBlendEquation (GLenum); -typedef void (APIENTRY * PFNGLBLENDEQUATIONPROC) (GLenum mode); -extern void APIENTRY glDrawRangeElements (GLenum, GLuint, GLuint, GLsizei, GLenum, const GLvoid *); -typedef void (APIENTRY * PFNGLDRAWRANGEELEMENTSPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices); -extern void APIENTRY glColorTable (GLenum, GLenum, GLsizei, GLenum, GLenum, const GLvoid *); -typedef void (APIENTRY * PFNGLCOLORTABLEPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table); -extern void APIENTRY glColorTableParameterfv (GLenum, GLenum, const GLfloat *); -typedef void (APIENTRY * PFNGLCOLORTABLEPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat *params); -extern void APIENTRY glColorTableParameteriv (GLenum, GLenum, const GLint *); -typedef void (APIENTRY * PFNGLCOLORTABLEPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint *params); -extern void APIENTRY glCopyColorTable (GLenum, GLenum, GLint, GLint, GLsizei); -typedef void (APIENTRY * PFNGLCOPYCOLORTABLEPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); -extern void APIENTRY glGetColorTable (GLenum, GLenum, GLenum, GLvoid *); -typedef void (APIENTRY * PFNGLGETCOLORTABLEPROC) (GLenum target, GLenum format, GLenum type, GLvoid *table); -extern void APIENTRY glGetColorTableParameterfv (GLenum, GLenum, GLfloat *); -typedef void (APIENTRY * PFNGLGETCOLORTABLEPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); -extern void APIENTRY glGetColorTableParameteriv (GLenum, GLenum, GLint *); -typedef void (APIENTRY * PFNGLGETCOLORTABLEPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); -extern void APIENTRY glColorSubTable (GLenum, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); -typedef void (APIENTRY * PFNGLCOLORSUBTABLEPROC) (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data); -extern void APIENTRY glCopyColorSubTable (GLenum, GLsizei, GLint, GLint, GLsizei); -typedef void (APIENTRY * PFNGLCOPYCOLORSUBTABLEPROC) (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); -extern void APIENTRY glConvolutionFilter1D (GLenum, GLenum, GLsizei, GLenum, GLenum, const GLvoid *); -typedef void (APIENTRY * PFNGLCONVOLUTIONFILTER1DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image); -extern void APIENTRY glConvolutionFilter2D (GLenum, GLenum, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); -typedef void (APIENTRY * PFNGLCONVOLUTIONFILTER2DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image); -extern void APIENTRY glConvolutionParameterf (GLenum, GLenum, GLfloat); -typedef void (APIENTRY * PFNGLCONVOLUTIONPARAMETERFPROC) (GLenum target, GLenum pname, GLfloat params); -extern void APIENTRY glConvolutionParameterfv (GLenum, GLenum, const GLfloat *); -typedef void (APIENTRY * PFNGLCONVOLUTIONPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat *params); -extern void APIENTRY glConvolutionParameteri (GLenum, GLenum, GLint); -typedef void (APIENTRY * PFNGLCONVOLUTIONPARAMETERIPROC) (GLenum target, GLenum pname, GLint params); -extern void APIENTRY glConvolutionParameteriv (GLenum, GLenum, const GLint *); -typedef void (APIENTRY * PFNGLCONVOLUTIONPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint *params); -extern void APIENTRY glCopyConvolutionFilter1D (GLenum, GLenum, GLint, GLint, GLsizei); -typedef void (APIENTRY * PFNGLCOPYCONVOLUTIONFILTER1DPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); -extern void APIENTRY glCopyConvolutionFilter2D (GLenum, GLenum, GLint, GLint, GLsizei, GLsizei); -typedef void (APIENTRY * PFNGLCOPYCONVOLUTIONFILTER2DPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); -extern void APIENTRY glGetConvolutionFilter (GLenum, GLenum, GLenum, GLvoid *); -typedef void (APIENTRY * PFNGLGETCONVOLUTIONFILTERPROC) (GLenum target, GLenum format, GLenum type, GLvoid *image); -extern void APIENTRY glGetConvolutionParameterfv (GLenum, GLenum, GLfloat *); -typedef void (APIENTRY * PFNGLGETCONVOLUTIONPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); -extern void APIENTRY glGetConvolutionParameteriv (GLenum, GLenum, GLint *); -typedef void (APIENTRY * PFNGLGETCONVOLUTIONPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); -extern void APIENTRY glGetSeparableFilter (GLenum, GLenum, GLenum, GLvoid *, GLvoid *, GLvoid *); -typedef void (APIENTRY * PFNGLGETSEPARABLEFILTERPROC) (GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span); -extern void APIENTRY glSeparableFilter2D (GLenum, GLenum, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *, const GLvoid *); -typedef void (APIENTRY * PFNGLSEPARABLEFILTER2DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column); -extern void APIENTRY glGetHistogram (GLenum, GLboolean, GLenum, GLenum, GLvoid *); -typedef void (APIENTRY * PFNGLGETHISTOGRAMPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values); -extern void APIENTRY glGetHistogramParameterfv (GLenum, GLenum, GLfloat *); -typedef void (APIENTRY * PFNGLGETHISTOGRAMPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); -extern void APIENTRY glGetHistogramParameteriv (GLenum, GLenum, GLint *); -typedef void (APIENTRY * PFNGLGETHISTOGRAMPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); -extern void APIENTRY glGetMinmax (GLenum, GLboolean, GLenum, GLenum, GLvoid *); -typedef void (APIENTRY * PFNGLGETMINMAXPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values); -extern void APIENTRY glGetMinmaxParameterfv (GLenum, GLenum, GLfloat *); -typedef void (APIENTRY * PFNGLGETMINMAXPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); -extern void APIENTRY glGetMinmaxParameteriv (GLenum, GLenum, GLint *); -typedef void (APIENTRY * PFNGLGETMINMAXPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); -extern void APIENTRY glHistogram (GLenum, GLsizei, GLenum, GLboolean); -typedef void (APIENTRY * PFNGLHISTOGRAMPROC) (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); -extern void APIENTRY glMinmax (GLenum, GLenum, GLboolean); -typedef void (APIENTRY * PFNGLMINMAXPROC) (GLenum target, GLenum internalformat, GLboolean sink); -extern void APIENTRY glResetHistogram (GLenum); -typedef void (APIENTRY * PFNGLRESETHISTOGRAMPROC) (GLenum target); -extern void APIENTRY glResetMinmax (GLenum); -typedef void (APIENTRY * PFNGLRESETMINMAXPROC) (GLenum target); -extern void APIENTRY glTexImage3D (GLenum, GLint, GLint, GLsizei, GLsizei, GLsizei, GLint, GLenum, GLenum, const GLvoid *); -typedef void (APIENTRY * PFNGLTEXIMAGE3DPROC) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels); -extern void APIENTRY glTexSubImage3D (GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); -typedef void (APIENTRY * PFNGLTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels); -extern void APIENTRY glCopyTexSubImage3D (GLenum, GLint, GLint, GLint, GLint, GLint, GLint, GLsizei, GLsizei); -typedef void (APIENTRY * PFNGLCOPYTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); -extern void APIENTRY glActiveTextureARB (GLenum); -typedef void (APIENTRY * PFNGLACTIVETEXTUREARBPROC) (GLenum texture); -extern void APIENTRY glClientActiveTextureARB (GLenum); -typedef void (APIENTRY * PFNGLCLIENTACTIVETEXTUREARBPROC) (GLenum texture); -extern void APIENTRY glMultiTexCoord1dARB (GLenum, GLdouble); -typedef void (APIENTRY * PFNGLMULTITEXCOORD1DARBPROC) (GLenum target, GLdouble s); -extern void APIENTRY glMultiTexCoord1dvARB (GLenum, const GLdouble *); -typedef void (APIENTRY * PFNGLMULTITEXCOORD1DVARBPROC) (GLenum target, const GLdouble *v); -extern void APIENTRY glMultiTexCoord1fARB (GLenum, GLfloat); -typedef void (APIENTRY * PFNGLMULTITEXCOORD1FARBPROC) (GLenum target, GLfloat s); -extern void APIENTRY glMultiTexCoord1fvARB (GLenum, const GLfloat *); -typedef void (APIENTRY * PFNGLMULTITEXCOORD1FVARBPROC) (GLenum target, const GLfloat *v); -extern void APIENTRY glMultiTexCoord1iARB (GLenum, GLint); -typedef void (APIENTRY * PFNGLMULTITEXCOORD1IARBPROC) (GLenum target, GLint s); -extern void APIENTRY glMultiTexCoord1ivARB (GLenum, const GLint *); -typedef void (APIENTRY * PFNGLMULTITEXCOORD1IVARBPROC) (GLenum target, const GLint *v); -extern void APIENTRY glMultiTexCoord1sARB (GLenum, GLshort); -typedef void (APIENTRY * PFNGLMULTITEXCOORD1SARBPROC) (GLenum target, GLshort s); -extern void APIENTRY glMultiTexCoord1svARB (GLenum, const GLshort *); -typedef void (APIENTRY * PFNGLMULTITEXCOORD1SVARBPROC) (GLenum target, const GLshort *v); -extern void APIENTRY glMultiTexCoord2dARB (GLenum, GLdouble, GLdouble); -typedef void (APIENTRY * PFNGLMULTITEXCOORD2DARBPROC) (GLenum target, GLdouble s, GLdouble t); -extern void APIENTRY glMultiTexCoord2dvARB (GLenum, const GLdouble *); -typedef void (APIENTRY * PFNGLMULTITEXCOORD2DVARBPROC) (GLenum target, const GLdouble *v); -extern void APIENTRY glMultiTexCoord2fARB (GLenum, GLfloat, GLfloat); -typedef void (APIENTRY * PFNGLMULTITEXCOORD2FARBPROC) (GLenum target, GLfloat s, GLfloat t); -extern void APIENTRY glMultiTexCoord2fvARB (GLenum, const GLfloat *); -typedef void (APIENTRY * PFNGLMULTITEXCOORD2FVARBPROC) (GLenum target, const GLfloat *v); -extern void APIENTRY glMultiTexCoord2iARB (GLenum, GLint, GLint); -typedef void (APIENTRY * PFNGLMULTITEXCOORD2IARBPROC) (GLenum target, GLint s, GLint t); -extern void APIENTRY glMultiTexCoord2ivARB (GLenum, const GLint *); -typedef void (APIENTRY * PFNGLMULTITEXCOORD2IVARBPROC) (GLenum target, const GLint *v); -extern void APIENTRY glMultiTexCoord2sARB (GLenum, GLshort, GLshort); -typedef void (APIENTRY * PFNGLMULTITEXCOORD2SARBPROC) (GLenum target, GLshort s, GLshort t); -extern void APIENTRY glMultiTexCoord2svARB (GLenum, const GLshort *); -typedef void (APIENTRY * PFNGLMULTITEXCOORD2SVARBPROC) (GLenum target, const GLshort *v); -extern void APIENTRY glMultiTexCoord3dARB (GLenum, GLdouble, GLdouble, GLdouble); -typedef void (APIENTRY * PFNGLMULTITEXCOORD3DARBPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r); -extern void APIENTRY glMultiTexCoord3dvARB (GLenum, const GLdouble *); -typedef void (APIENTRY * PFNGLMULTITEXCOORD3DVARBPROC) (GLenum target, const GLdouble *v); -extern void APIENTRY glMultiTexCoord3fARB (GLenum, GLfloat, GLfloat, GLfloat); -typedef void (APIENTRY * PFNGLMULTITEXCOORD3FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r); -extern void APIENTRY glMultiTexCoord3fvARB (GLenum, const GLfloat *); -typedef void (APIENTRY * PFNGLMULTITEXCOORD3FVARBPROC) (GLenum target, const GLfloat *v); -extern void APIENTRY glMultiTexCoord3iARB (GLenum, GLint, GLint, GLint); -typedef void (APIENTRY * PFNGLMULTITEXCOORD3IARBPROC) (GLenum target, GLint s, GLint t, GLint r); -extern void APIENTRY glMultiTexCoord3ivARB (GLenum, const GLint *); -typedef void (APIENTRY * PFNGLMULTITEXCOORD3IVARBPROC) (GLenum target, const GLint *v); -extern void APIENTRY glMultiTexCoord3sARB (GLenum, GLshort, GLshort, GLshort); -typedef void (APIENTRY * PFNGLMULTITEXCOORD3SARBPROC) (GLenum target, GLshort s, GLshort t, GLshort r); -extern void APIENTRY glMultiTexCoord3svARB (GLenum, const GLshort *); -typedef void (APIENTRY * PFNGLMULTITEXCOORD3SVARBPROC) (GLenum target, const GLshort *v); -extern void APIENTRY glMultiTexCoord4dARB (GLenum, GLdouble, GLdouble, GLdouble, GLdouble); -typedef void (APIENTRY * PFNGLMULTITEXCOORD4DARBPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); -extern void APIENTRY glMultiTexCoord4dvARB (GLenum, const GLdouble *); -typedef void (APIENTRY * PFNGLMULTITEXCOORD4DVARBPROC) (GLenum target, const GLdouble *v); -extern void APIENTRY glMultiTexCoord4fARB (GLenum, GLfloat, GLfloat, GLfloat, GLfloat); -typedef void (APIENTRY * PFNGLMULTITEXCOORD4FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); -extern void APIENTRY glMultiTexCoord4fvARB (GLenum, const GLfloat *); -typedef void (APIENTRY * PFNGLMULTITEXCOORD4FVARBPROC) (GLenum target, const GLfloat *v); -extern void APIENTRY glMultiTexCoord4iARB (GLenum, GLint, GLint, GLint, GLint); -typedef void (APIENTRY * PFNGLMULTITEXCOORD4IARBPROC) (GLenum target, GLint s, GLint t, GLint r, GLint q); -extern void APIENTRY glMultiTexCoord4ivARB (GLenum, const GLint *); -typedef void (APIENTRY * PFNGLMULTITEXCOORD4IVARBPROC) (GLenum target, const GLint *v); -extern void APIENTRY glMultiTexCoord4sARB (GLenum, GLshort, GLshort, GLshort, GLshort); -typedef void (APIENTRY * PFNGLMULTITEXCOORD4SARBPROC) (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); -extern void APIENTRY glMultiTexCoord4svARB (GLenum, const GLshort *); -typedef void (APIENTRY * PFNGLMULTITEXCOORD4SVARBPROC) (GLenum target, const GLshort *v); -extern void APIENTRY glLoadTransposeMatrixfARB (const GLfloat *); -typedef void (APIENTRY * PFNGLLOADTRANSPOSEMATRIXFARBPROC) (const GLfloat *m); -extern void APIENTRY glLoadTransposeMatrixdARB (const GLdouble *); -typedef void (APIENTRY * PFNGLLOADTRANSPOSEMATRIXDARBPROC) (const GLdouble *m); -extern void APIENTRY glMultTransposeMatrixfARB (const GLfloat *); -typedef void (APIENTRY * PFNGLMULTTRANSPOSEMATRIXFARBPROC) (const GLfloat *m); -extern void APIENTRY glMultTransposeMatrixdARB (const GLdouble *); -typedef void (APIENTRY * PFNGLMULTTRANSPOSEMATRIXDARBPROC) (const GLdouble *m); -extern void APIENTRY glSampleCoverageARB (GLclampf, GLboolean); -typedef void (APIENTRY * PFNGLSAMPLECOVERAGEARBPROC) (GLclampf value, GLboolean invert); -extern void APIENTRY glSamplePassARB (GLenum); -typedef void (APIENTRY * PFNGLSAMPLEPASSARBPROC) (GLenum pass); -extern void APIENTRY glCompressedTexImage3DARB (GLenum, GLint, GLenum, GLsizei, GLsizei, GLsizei, GLint, GLsizei, const GLvoid *); -typedef void (APIENTRY * PFNGLCOMPRESSEDTEXIMAGE3DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data); -extern void APIENTRY glCompressedTexImage2DARB (GLenum, GLint, GLenum, GLsizei, GLsizei, GLint, GLsizei, const GLvoid *); -typedef void (APIENTRY * PFNGLCOMPRESSEDTEXIMAGE2DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data); -extern void APIENTRY glCompressedTexImage1DARB (GLenum, GLint, GLenum, GLsizei, GLint, GLsizei, const GLvoid *); -typedef void (APIENTRY * PFNGLCOMPRESSEDTEXIMAGE1DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data); -extern void APIENTRY glCompressedTexSubImage3DARB (GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLsizei, const GLvoid *); -typedef void (APIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE3DARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data); -extern void APIENTRY glCompressedTexSubImage2DARB (GLenum, GLint, GLint, GLint, GLsizei, GLsizei, GLenum, GLsizei, const GLvoid *); -typedef void (APIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE2DARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data); -extern void APIENTRY glCompressedTexSubImage1DARB (GLenum, GLint, GLint, GLsizei, GLenum, GLsizei, const GLvoid *); -typedef void (APIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE1DARBPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data); -extern void APIENTRY glGetCompressedTexImageARB (GLenum, GLint, void *); -typedef void (APIENTRY * PFNGLGETCOMPRESSEDTEXIMAGEARBPROC) (GLenum target, GLint level, void *img); -extern void APIENTRY glBlendColorEXT (GLclampf, GLclampf, GLclampf, GLclampf); -typedef void (APIENTRY * PFNGLBLENDCOLOREXTPROC) (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); -extern void APIENTRY glPolygonOffsetEXT (GLfloat, GLfloat); -typedef void (APIENTRY * PFNGLPOLYGONOFFSETEXTPROC) (GLfloat factor, GLfloat bias); -extern void APIENTRY glTexImage3DEXT (GLenum, GLint, GLenum, GLsizei, GLsizei, GLsizei, GLint, GLenum, GLenum, const GLvoid *); -typedef void (APIENTRY * PFNGLTEXIMAGE3DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels); -extern void APIENTRY glTexSubImage3DEXT (GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); -typedef void (APIENTRY * PFNGLTEXSUBIMAGE3DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels); -extern void APIENTRY glGetTexFilterFuncSGIS (GLenum, GLenum, GLfloat *); -typedef void (APIENTRY * PFNGLGETTEXFILTERFUNCSGISPROC) (GLenum target, GLenum filter, GLfloat *weights); -extern void APIENTRY glTexFilterFuncSGIS (GLenum, GLenum, GLsizei, const GLfloat *); -typedef void (APIENTRY * PFNGLTEXFILTERFUNCSGISPROC) (GLenum target, GLenum filter, GLsizei n, const GLfloat *weights); -extern void APIENTRY glTexSubImage1DEXT (GLenum, GLint, GLint, GLsizei, GLenum, GLenum, const GLvoid *); -typedef void (APIENTRY * PFNGLTEXSUBIMAGE1DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels); -extern void APIENTRY glTexSubImage2DEXT (GLenum, GLint, GLint, GLint, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); -typedef void (APIENTRY * PFNGLTEXSUBIMAGE2DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels); -extern void APIENTRY glCopyTexImage1DEXT (GLenum, GLint, GLenum, GLint, GLint, GLsizei, GLint); -typedef void (APIENTRY * PFNGLCOPYTEXIMAGE1DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); -extern void APIENTRY glCopyTexImage2DEXT (GLenum, GLint, GLenum, GLint, GLint, GLsizei, GLsizei, GLint); -typedef void (APIENTRY * PFNGLCOPYTEXIMAGE2DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); -extern void APIENTRY glCopyTexSubImage1DEXT (GLenum, GLint, GLint, GLint, GLint, GLsizei); -typedef void (APIENTRY * PFNGLCOPYTEXSUBIMAGE1DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); -extern void APIENTRY glCopyTexSubImage2DEXT (GLenum, GLint, GLint, GLint, GLint, GLint, GLsizei, GLsizei); -typedef void (APIENTRY * PFNGLCOPYTEXSUBIMAGE2DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); -extern void APIENTRY glCopyTexSubImage3DEXT (GLenum, GLint, GLint, GLint, GLint, GLint, GLint, GLsizei, GLsizei); -typedef void (APIENTRY * PFNGLCOPYTEXSUBIMAGE3DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); -extern void APIENTRY glGetHistogramEXT (GLenum, GLboolean, GLenum, GLenum, GLvoid *); -typedef void (APIENTRY * PFNGLGETHISTOGRAMEXTPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values); -extern void APIENTRY glGetHistogramParameterfvEXT (GLenum, GLenum, GLfloat *); -typedef void (APIENTRY * PFNGLGETHISTOGRAMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params); -extern void APIENTRY glGetHistogramParameterivEXT (GLenum, GLenum, GLint *); -typedef void (APIENTRY * PFNGLGETHISTOGRAMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); -extern void APIENTRY glGetMinmaxEXT (GLenum, GLboolean, GLenum, GLenum, GLvoid *); -typedef void (APIENTRY * PFNGLGETMINMAXEXTPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values); -extern void APIENTRY glGetMinmaxParameterfvEXT (GLenum, GLenum, GLfloat *); -typedef void (APIENTRY * PFNGLGETMINMAXPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params); -extern void APIENTRY glGetMinmaxParameterivEXT (GLenum, GLenum, GLint *); -typedef void (APIENTRY * PFNGLGETMINMAXPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); -extern void APIENTRY glHistogramEXT (GLenum, GLsizei, GLenum, GLboolean); -typedef void (APIENTRY * PFNGLHISTOGRAMEXTPROC) (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); -extern void APIENTRY glMinmaxEXT (GLenum, GLenum, GLboolean); -typedef void (APIENTRY * PFNGLMINMAXEXTPROC) (GLenum target, GLenum internalformat, GLboolean sink); -extern void APIENTRY glResetHistogramEXT (GLenum); -typedef void (APIENTRY * PFNGLRESETHISTOGRAMEXTPROC) (GLenum target); -extern void APIENTRY glResetMinmaxEXT (GLenum); -typedef void (APIENTRY * PFNGLRESETMINMAXEXTPROC) (GLenum target); -extern void APIENTRY glConvolutionFilter1DEXT (GLenum, GLenum, GLsizei, GLenum, GLenum, const GLvoid *); -typedef void (APIENTRY * PFNGLCONVOLUTIONFILTER1DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image); -extern void APIENTRY glConvolutionFilter2DEXT (GLenum, GLenum, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); -typedef void (APIENTRY * PFNGLCONVOLUTIONFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image); -extern void APIENTRY glConvolutionParameterfEXT (GLenum, GLenum, GLfloat); -typedef void (APIENTRY * PFNGLCONVOLUTIONPARAMETERFEXTPROC) (GLenum target, GLenum pname, GLfloat params); -extern void APIENTRY glConvolutionParameterfvEXT (GLenum, GLenum, const GLfloat *); -typedef void (APIENTRY * PFNGLCONVOLUTIONPARAMETERFVEXTPROC) (GLenum target, GLenum pname, const GLfloat *params); -extern void APIENTRY glConvolutionParameteriEXT (GLenum, GLenum, GLint); -typedef void (APIENTRY * PFNGLCONVOLUTIONPARAMETERIEXTPROC) (GLenum target, GLenum pname, GLint params); -extern void APIENTRY glConvolutionParameterivEXT (GLenum, GLenum, const GLint *); -typedef void (APIENTRY * PFNGLCONVOLUTIONPARAMETERIVEXTPROC) (GLenum target, GLenum pname, const GLint *params); -extern void APIENTRY glCopyConvolutionFilter1DEXT (GLenum, GLenum, GLint, GLint, GLsizei); -typedef void (APIENTRY * PFNGLCOPYCONVOLUTIONFILTER1DEXTPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); -extern void APIENTRY glCopyConvolutionFilter2DEXT (GLenum, GLenum, GLint, GLint, GLsizei, GLsizei); -typedef void (APIENTRY * PFNGLCOPYCONVOLUTIONFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); -extern void APIENTRY glGetConvolutionFilterEXT (GLenum, GLenum, GLenum, GLvoid *); -typedef void (APIENTRY * PFNGLGETCONVOLUTIONFILTEREXTPROC) (GLenum target, GLenum format, GLenum type, GLvoid *image); -extern void APIENTRY glGetConvolutionParameterfvEXT (GLenum, GLenum, GLfloat *); -typedef void (APIENTRY * PFNGLGETCONVOLUTIONPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params); -extern void APIENTRY glGetConvolutionParameterivEXT (GLenum, GLenum, GLint *); -typedef void (APIENTRY * PFNGLGETCONVOLUTIONPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); -extern void APIENTRY glGetSeparableFilterEXT (GLenum, GLenum, GLenum, GLvoid *, GLvoid *, GLvoid *); -typedef void (APIENTRY * PFNGLGETSEPARABLEFILTEREXTPROC) (GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span); -extern void APIENTRY glSeparableFilter2DEXT (GLenum, GLenum, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *, const GLvoid *); -typedef void (APIENTRY * PFNGLSEPARABLEFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column); -extern void APIENTRY glColorTableSGI (GLenum, GLenum, GLsizei, GLenum, GLenum, const GLvoid *); -typedef void (APIENTRY * PFNGLCOLORTABLESGIPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table); -extern void APIENTRY glColorTableParameterfvSGI (GLenum, GLenum, const GLfloat *); -typedef void (APIENTRY * PFNGLCOLORTABLEPARAMETERFVSGIPROC) (GLenum target, GLenum pname, const GLfloat *params); -extern void APIENTRY glColorTableParameterivSGI (GLenum, GLenum, const GLint *); -typedef void (APIENTRY * PFNGLCOLORTABLEPARAMETERIVSGIPROC) (GLenum target, GLenum pname, const GLint *params); -extern void APIENTRY glCopyColorTableSGI (GLenum, GLenum, GLint, GLint, GLsizei); -typedef void (APIENTRY * PFNGLCOPYCOLORTABLESGIPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); -extern void APIENTRY glGetColorTableSGI (GLenum, GLenum, GLenum, GLvoid *); -typedef void (APIENTRY * PFNGLGETCOLORTABLESGIPROC) (GLenum target, GLenum format, GLenum type, GLvoid *table); -extern void APIENTRY glGetColorTableParameterfvSGI (GLenum, GLenum, GLfloat *); -typedef void (APIENTRY * PFNGLGETCOLORTABLEPARAMETERFVSGIPROC) (GLenum target, GLenum pname, GLfloat *params); -extern void APIENTRY glGetColorTableParameterivSGI (GLenum, GLenum, GLint *); -typedef void (APIENTRY * PFNGLGETCOLORTABLEPARAMETERIVSGIPROC) (GLenum target, GLenum pname, GLint *params); -extern void APIENTRY glPixelTexGenSGIX (GLenum); -typedef void (APIENTRY * PFNGLPIXELTEXGENSGIXPROC) (GLenum mode); -extern void APIENTRY glPixelTexGenParameteriSGIS (GLenum, GLint); -typedef void (APIENTRY * PFNGLPIXELTEXGENPARAMETERISGISPROC) (GLenum pname, GLint param); -extern void APIENTRY glPixelTexGenParameterivSGIS (GLenum, const GLint *); -typedef void (APIENTRY * PFNGLPIXELTEXGENPARAMETERIVSGISPROC) (GLenum pname, const GLint *params); -extern void APIENTRY glPixelTexGenParameterfSGIS (GLenum, GLfloat); -typedef void (APIENTRY * PFNGLPIXELTEXGENPARAMETERFSGISPROC) (GLenum pname, GLfloat param); -extern void APIENTRY glPixelTexGenParameterfvSGIS (GLenum, const GLfloat *); -typedef void (APIENTRY * PFNGLPIXELTEXGENPARAMETERFVSGISPROC) (GLenum pname, const GLfloat *params); -extern void APIENTRY glGetPixelTexGenParameterivSGIS (GLenum, GLint *); -typedef void (APIENTRY * PFNGLGETPIXELTEXGENPARAMETERIVSGISPROC) (GLenum pname, GLint *params); -extern void APIENTRY glGetPixelTexGenParameterfvSGIS (GLenum, GLfloat *); -typedef void (APIENTRY * PFNGLGETPIXELTEXGENPARAMETERFVSGISPROC) (GLenum pname, GLfloat *params); -extern void APIENTRY glTexImage4DSGIS (GLenum, GLint, GLenum, GLsizei, GLsizei, GLsizei, GLsizei, GLint, GLenum, GLenum, const GLvoid *); -typedef void (APIENTRY * PFNGLTEXIMAGE4DSGISPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLsizei size4d, GLint border, GLenum format, GLenum type, const GLvoid *pixels); -extern void APIENTRY glTexSubImage4DSGIS (GLenum, GLint, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); -typedef void (APIENTRY * PFNGLTEXSUBIMAGE4DSGISPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint woffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei size4d, GLenum format, GLenum type, const GLvoid *pixels); -extern GLboolean APIENTRY glAreTexturesResidentEXT (GLsizei, const GLuint *, GLboolean *); -typedef GLboolean (APIENTRY * PFNGLARETEXTURESRESIDENTEXTPROC) (GLsizei n, const GLuint *textures, GLboolean *residences); -extern void APIENTRY glBindTextureEXT (GLenum, GLuint); -typedef void (APIENTRY * PFNGLBINDTEXTUREEXTPROC) (GLenum target, GLuint texture); -extern void APIENTRY glDeleteTexturesEXT (GLsizei, const GLuint *); -typedef void (APIENTRY * PFNGLDELETETEXTURESEXTPROC) (GLsizei n, const GLuint *textures); -extern void APIENTRY glGenTexturesEXT (GLsizei, GLuint *); -typedef void (APIENTRY * PFNGLGENTEXTURESEXTPROC) (GLsizei n, GLuint *textures); -extern GLboolean APIENTRY glIsTextureEXT (GLuint); -typedef GLboolean (APIENTRY * PFNGLISTEXTUREEXTPROC) (GLuint texture); -extern void APIENTRY glPrioritizeTexturesEXT (GLsizei, const GLuint *, const GLclampf *); -typedef void (APIENTRY * PFNGLPRIORITIZETEXTURESEXTPROC) (GLsizei n, const GLuint *textures, const GLclampf *priorities); -extern void APIENTRY glDetailTexFuncSGIS (GLenum, GLsizei, const GLfloat *); -typedef void (APIENTRY * PFNGLDETAILTEXFUNCSGISPROC) (GLenum target, GLsizei n, const GLfloat *points); -extern void APIENTRY glGetDetailTexFuncSGIS (GLenum, GLfloat *); -typedef void (APIENTRY * PFNGLGETDETAILTEXFUNCSGISPROC) (GLenum target, GLfloat *points); -extern void APIENTRY glSharpenTexFuncSGIS (GLenum, GLsizei, const GLfloat *); -typedef void (APIENTRY * PFNGLSHARPENTEXFUNCSGISPROC) (GLenum target, GLsizei n, const GLfloat *points); -extern void APIENTRY glGetSharpenTexFuncSGIS (GLenum, GLfloat *); -typedef void (APIENTRY * PFNGLGETSHARPENTEXFUNCSGISPROC) (GLenum target, GLfloat *points); -extern void APIENTRY glSampleMaskSGIS (GLclampf, GLboolean); -typedef void (APIENTRY * PFNGLSAMPLEMASKSGISPROC) (GLclampf value, GLboolean invert); -extern void APIENTRY glSamplePatternSGIS (GLenum); -typedef void (APIENTRY * PFNGLSAMPLEPATTERNSGISPROC) (GLenum pattern); -extern void APIENTRY glArrayElementEXT (GLint); -typedef void (APIENTRY * PFNGLARRAYELEMENTEXTPROC) (GLint i); -extern void APIENTRY glColorPointerEXT (GLint, GLenum, GLsizei, GLsizei, const GLvoid *); -typedef void (APIENTRY * PFNGLCOLORPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); -extern void APIENTRY glDrawArraysEXT (GLenum, GLint, GLsizei); -typedef void (APIENTRY * PFNGLDRAWARRAYSEXTPROC) (GLenum mode, GLint first, GLsizei count); -extern void APIENTRY glEdgeFlagPointerEXT (GLsizei, GLsizei, const GLboolean *); -typedef void (APIENTRY * PFNGLEDGEFLAGPOINTEREXTPROC) (GLsizei stride, GLsizei count, const GLboolean *pointer); -extern void APIENTRY glGetPointervEXT (GLenum, GLvoid* *); -typedef void (APIENTRY * PFNGLGETPOINTERVEXTPROC) (GLenum pname, GLvoid* *params); -extern void APIENTRY glIndexPointerEXT (GLenum, GLsizei, GLsizei, const GLvoid *); -typedef void (APIENTRY * PFNGLINDEXPOINTEREXTPROC) (GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); -extern void APIENTRY glNormalPointerEXT (GLenum, GLsizei, GLsizei, const GLvoid *); -typedef void (APIENTRY * PFNGLNORMALPOINTEREXTPROC) (GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); -extern void APIENTRY glTexCoordPointerEXT (GLint, GLenum, GLsizei, GLsizei, const GLvoid *); -typedef void (APIENTRY * PFNGLTEXCOORDPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); -extern void APIENTRY glVertexPointerEXT (GLint, GLenum, GLsizei, GLsizei, const GLvoid *); -typedef void (APIENTRY * PFNGLVERTEXPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); -extern void APIENTRY glBlendEquationEXT (GLenum); -typedef void (APIENTRY * PFNGLBLENDEQUATIONEXTPROC) (GLenum mode); -extern void APIENTRY glSpriteParameterfSGIX (GLenum, GLfloat); -typedef void (APIENTRY * PFNGLSPRITEPARAMETERFSGIXPROC) (GLenum pname, GLfloat param); -extern void APIENTRY glSpriteParameterfvSGIX (GLenum, const GLfloat *); -typedef void (APIENTRY * PFNGLSPRITEPARAMETERFVSGIXPROC) (GLenum pname, const GLfloat *params); -extern void APIENTRY glSpriteParameteriSGIX (GLenum, GLint); -typedef void (APIENTRY * PFNGLSPRITEPARAMETERISGIXPROC) (GLenum pname, GLint param); -extern void APIENTRY glSpriteParameterivSGIX (GLenum, const GLint *); -typedef void (APIENTRY * PFNGLSPRITEPARAMETERIVSGIXPROC) (GLenum pname, const GLint *params); -extern void APIENTRY glPointParameterfEXT (GLenum, GLfloat); -typedef void (APIENTRY * PFNGLPOINTPARAMETERFEXTPROC) (GLenum pname, GLfloat param); -extern void APIENTRY glPointParameterfvEXT (GLenum, const GLfloat *); -typedef void (APIENTRY * PFNGLPOINTPARAMETERFVEXTPROC) (GLenum pname, const GLfloat *params); -extern void APIENTRY glPointParameterfSGIS (GLenum, GLfloat); -typedef void (APIENTRY * PFNGLPOINTPARAMETERFSGISPROC) (GLenum pname, GLfloat param); -extern void APIENTRY glPointParameterfvSGIS (GLenum, const GLfloat *); -typedef void (APIENTRY * PFNGLPOINTPARAMETERFVSGISPROC) (GLenum pname, const GLfloat *params); -extern GLint APIENTRY glGetInstrumentsSGIX (void); -typedef GLint (APIENTRY * PFNGLGETINSTRUMENTSSGIXPROC) (void); -extern void APIENTRY glInstrumentsBufferSGIX (GLsizei, GLint *); -typedef void (APIENTRY * PFNGLINSTRUMENTSBUFFERSGIXPROC) (GLsizei size, GLint *buffer); -extern GLint APIENTRY glPollInstrumentsSGIX (GLint *); -typedef GLint (APIENTRY * PFNGLPOLLINSTRUMENTSSGIXPROC) (GLint *marker_p); -extern void APIENTRY glReadInstrumentsSGIX (GLint); -typedef void (APIENTRY * PFNGLREADINSTRUMENTSSGIXPROC) (GLint marker); -extern void APIENTRY glStartInstrumentsSGIX (void); -typedef void (APIENTRY * PFNGLSTARTINSTRUMENTSSGIXPROC) (void); -extern void APIENTRY glStopInstrumentsSGIX (GLint); -typedef void (APIENTRY * PFNGLSTOPINSTRUMENTSSGIXPROC) (GLint marker); -extern void APIENTRY glFrameZoomSGIX (GLint); -typedef void (APIENTRY * PFNGLFRAMEZOOMSGIXPROC) (GLint factor); -extern void APIENTRY glTagSampleBufferSGIX (void); -typedef void (APIENTRY * PFNGLTAGSAMPLEBUFFERSGIXPROC) (void); -extern void APIENTRY glReferencePlaneSGIX (const GLdouble *); -typedef void (APIENTRY * PFNGLREFERENCEPLANESGIXPROC) (const GLdouble *equation); -extern void APIENTRY glFlushRasterSGIX (void); -typedef void (APIENTRY * PFNGLFLUSHRASTERSGIXPROC) (void); -extern void APIENTRY glFogFuncSGIS (GLsizei, const GLfloat *); -typedef void (APIENTRY * PFNGLFOGFUNCSGISPROC) (GLsizei n, const GLfloat *points); -extern void APIENTRY glGetFogFuncSGIS (const GLfloat *); -typedef void (APIENTRY * PFNGLGETFOGFUNCSGISPROC) (const GLfloat *points); -extern void APIENTRY glImageTransformParameteriHP (GLenum, GLenum, GLint); -typedef void (APIENTRY * PFNGLIMAGETRANSFORMPARAMETERIHPPROC) (GLenum target, GLenum pname, GLint param); -extern void APIENTRY glImageTransformParameterfHP (GLenum, GLenum, GLfloat); -typedef void (APIENTRY * PFNGLIMAGETRANSFORMPARAMETERFHPPROC) (GLenum target, GLenum pname, GLfloat param); -extern void APIENTRY glImageTransformParameterivHP (GLenum, GLenum, const GLint *); -typedef void (APIENTRY * PFNGLIMAGETRANSFORMPARAMETERIVHPPROC) (GLenum target, GLenum pname, const GLint *params); -extern void APIENTRY glImageTransformParameterfvHP (GLenum, GLenum, const GLfloat *); -typedef void (APIENTRY * PFNGLIMAGETRANSFORMPARAMETERFVHPPROC) (GLenum target, GLenum pname, const GLfloat *params); -extern void APIENTRY glGetImageTransformParameterivHP (GLenum, GLenum, GLint *); -typedef void (APIENTRY * PFNGLGETIMAGETRANSFORMPARAMETERIVHPPROC) (GLenum target, GLenum pname, GLint *params); -extern void APIENTRY glGetImageTransformParameterfvHP (GLenum, GLenum, GLfloat *); -typedef void (APIENTRY * PFNGLGETIMAGETRANSFORMPARAMETERFVHPPROC) (GLenum target, GLenum pname, GLfloat *params); -extern void APIENTRY glColorSubTableEXT (GLenum, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); -typedef void (APIENTRY * PFNGLCOLORSUBTABLEEXTPROC) (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data); -extern void APIENTRY glCopyColorSubTableEXT (GLenum, GLsizei, GLint, GLint, GLsizei); -typedef void (APIENTRY * PFNGLCOPYCOLORSUBTABLEEXTPROC) (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); -extern void APIENTRY glHintPGI (GLenum, GLint); -typedef void (APIENTRY * PFNGLHINTPGIPROC) (GLenum target, GLint mode); -extern void APIENTRY glColorTableEXT (GLenum, GLenum, GLsizei, GLenum, GLenum, const GLvoid *); -typedef void (APIENTRY * PFNGLCOLORTABLEEXTPROC) (GLenum target, GLenum internalFormat, GLsizei width, GLenum format, GLenum type, const GLvoid *table); -extern void APIENTRY glGetColorTableEXT (GLenum, GLenum, GLenum, GLvoid *); -typedef void (APIENTRY * PFNGLGETCOLORTABLEEXTPROC) (GLenum target, GLenum format, GLenum type, GLvoid *data); -extern void APIENTRY glGetColorTableParameterivEXT (GLenum, GLenum, GLint *); -typedef void (APIENTRY * PFNGLGETCOLORTABLEPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); -extern void APIENTRY glGetColorTableParameterfvEXT (GLenum, GLenum, GLfloat *); -typedef void (APIENTRY * PFNGLGETCOLORTABLEPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params); -extern void APIENTRY glGetListParameterfvSGIX (GLuint, GLenum, GLfloat *); -typedef void (APIENTRY * PFNGLGETLISTPARAMETERFVSGIXPROC) (GLuint list, GLenum pname, GLfloat *params); -extern void APIENTRY glGetListParameterivSGIX (GLuint, GLenum, GLint *); -typedef void (APIENTRY * PFNGLGETLISTPARAMETERIVSGIXPROC) (GLuint list, GLenum pname, GLint *params); -extern void APIENTRY glListParameterfSGIX (GLuint, GLenum, GLfloat); -typedef void (APIENTRY * PFNGLLISTPARAMETERFSGIXPROC) (GLuint list, GLenum pname, GLfloat param); -extern void APIENTRY glListParameterfvSGIX (GLuint, GLenum, const GLfloat *); -typedef void (APIENTRY * PFNGLLISTPARAMETERFVSGIXPROC) (GLuint list, GLenum pname, const GLfloat *params); -extern void APIENTRY glListParameteriSGIX (GLuint, GLenum, GLint); -typedef void (APIENTRY * PFNGLLISTPARAMETERISGIXPROC) (GLuint list, GLenum pname, GLint param); -extern void APIENTRY glListParameterivSGIX (GLuint, GLenum, const GLint *); -typedef void (APIENTRY * PFNGLLISTPARAMETERIVSGIXPROC) (GLuint list, GLenum pname, const GLint *params); -extern void APIENTRY glIndexMaterialEXT (GLenum, GLenum); -typedef void (APIENTRY * PFNGLINDEXMATERIALEXTPROC) (GLenum face, GLenum mode); -extern void APIENTRY glIndexFuncEXT (GLenum, GLclampf); -typedef void (APIENTRY * PFNGLINDEXFUNCEXTPROC) (GLenum func, GLclampf ref); -extern void APIENTRY glLockArraysEXT (GLint, GLsizei); -typedef void (APIENTRY * PFNGLLOCKARRAYSEXTPROC) (GLint first, GLsizei count); -extern void APIENTRY glUnlockArraysEXT (void); -typedef void (APIENTRY * PFNGLUNLOCKARRAYSEXTPROC) (void); -extern void APIENTRY glCullParameterdvEXT (GLenum, const GLdouble *); -typedef void (APIENTRY * PFNGLCULLPARAMETERDVEXTPROC) (GLenum pname, const GLdouble *params); -extern void APIENTRY glCullParameterfvEXT (GLenum, const GLfloat *); -typedef void (APIENTRY * PFNGLCULLPARAMETERFVEXTPROC) (GLenum pname, const GLfloat *params); -extern void APIENTRY glFragmentColorMaterialSGIX (GLenum, GLenum); -typedef void (APIENTRY * PFNGLFRAGMENTCOLORMATERIALSGIXPROC) (GLenum face, GLenum mode); -extern void APIENTRY glFragmentLightfSGIX (GLenum, GLenum, GLfloat); -typedef void (APIENTRY * PFNGLFRAGMENTLIGHTFSGIXPROC) (GLenum light, GLenum pname, GLfloat param); -extern void APIENTRY glFragmentLightfvSGIX (GLenum, GLenum, const GLfloat *); -typedef void (APIENTRY * PFNGLFRAGMENTLIGHTFVSGIXPROC) (GLenum light, GLenum pname, const GLfloat *params); -extern void APIENTRY glFragmentLightiSGIX (GLenum, GLenum, GLint); -typedef void (APIENTRY * PFNGLFRAGMENTLIGHTISGIXPROC) (GLenum light, GLenum pname, GLint param); -extern void APIENTRY glFragmentLightivSGIX (GLenum, GLenum, const GLint *); -typedef void (APIENTRY * PFNGLFRAGMENTLIGHTIVSGIXPROC) (GLenum light, GLenum pname, const GLint *params); -extern void APIENTRY glFragmentLightModelfSGIX (GLenum, GLfloat); -typedef void (APIENTRY * PFNGLFRAGMENTLIGHTMODELFSGIXPROC) (GLenum pname, GLfloat param); -extern void APIENTRY glFragmentLightModelfvSGIX (GLenum, const GLfloat *); -typedef void (APIENTRY * PFNGLFRAGMENTLIGHTMODELFVSGIXPROC) (GLenum pname, const GLfloat *params); -extern void APIENTRY glFragmentLightModeliSGIX (GLenum, GLint); -typedef void (APIENTRY * PFNGLFRAGMENTLIGHTMODELISGIXPROC) (GLenum pname, GLint param); -extern void APIENTRY glFragmentLightModelivSGIX (GLenum, const GLint *); -typedef void (APIENTRY * PFNGLFRAGMENTLIGHTMODELIVSGIXPROC) (GLenum pname, const GLint *params); -extern void APIENTRY glFragmentMaterialfSGIX (GLenum, GLenum, GLfloat); -typedef void (APIENTRY * PFNGLFRAGMENTMATERIALFSGIXPROC) (GLenum face, GLenum pname, GLfloat param); -extern void APIENTRY glFragmentMaterialfvSGIX (GLenum, GLenum, const GLfloat *); -typedef void (APIENTRY * PFNGLFRAGMENTMATERIALFVSGIXPROC) (GLenum face, GLenum pname, const GLfloat *params); -extern void APIENTRY glFragmentMaterialiSGIX (GLenum, GLenum, GLint); -typedef void (APIENTRY * PFNGLFRAGMENTMATERIALISGIXPROC) (GLenum face, GLenum pname, GLint param); -extern void APIENTRY glFragmentMaterialivSGIX (GLenum, GLenum, const GLint *); -typedef void (APIENTRY * PFNGLFRAGMENTMATERIALIVSGIXPROC) (GLenum face, GLenum pname, const GLint *params); -extern void APIENTRY glGetFragmentLightfvSGIX (GLenum, GLenum, GLfloat *); -typedef void (APIENTRY * PFNGLGETFRAGMENTLIGHTFVSGIXPROC) (GLenum light, GLenum pname, GLfloat *params); -extern void APIENTRY glGetFragmentLightivSGIX (GLenum, GLenum, GLint *); -typedef void (APIENTRY * PFNGLGETFRAGMENTLIGHTIVSGIXPROC) (GLenum light, GLenum pname, GLint *params); -extern void APIENTRY glGetFragmentMaterialfvSGIX (GLenum, GLenum, GLfloat *); -typedef void (APIENTRY * PFNGLGETFRAGMENTMATERIALFVSGIXPROC) (GLenum face, GLenum pname, GLfloat *params); -extern void APIENTRY glGetFragmentMaterialivSGIX (GLenum, GLenum, GLint *); -typedef void (APIENTRY * PFNGLGETFRAGMENTMATERIALIVSGIXPROC) (GLenum face, GLenum pname, GLint *params); -extern void APIENTRY glLightEnviSGIX (GLenum, GLint); -typedef void (APIENTRY * PFNGLLIGHTENVISGIXPROC) (GLenum pname, GLint param); -extern void APIENTRY glDrawRangeElementsEXT (GLenum, GLuint, GLuint, GLsizei, GLenum, const GLvoid *); -typedef void (APIENTRY * PFNGLDRAWRANGEELEMENTSEXTPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices); -extern void APIENTRY glApplyTextureEXT (GLenum); -typedef void (APIENTRY * PFNGLAPPLYTEXTUREEXTPROC) (GLenum mode); -extern void APIENTRY glTextureLightEXT (GLenum); -typedef void (APIENTRY * PFNGLTEXTURELIGHTEXTPROC) (GLenum pname); -extern void APIENTRY glTextureMaterialEXT (GLenum, GLenum); -typedef void (APIENTRY * PFNGLTEXTUREMATERIALEXTPROC) (GLenum face, GLenum mode); -extern void APIENTRY glVertexPointervINTEL (GLint, GLenum, const GLvoid* *); -typedef void (APIENTRY * PFNGLVERTEXPOINTERVINTELPROC) (GLint size, GLenum type, const GLvoid* *pointer); -extern void APIENTRY glNormalPointervINTEL (GLenum, const GLvoid* *); -typedef void (APIENTRY * PFNGLNORMALPOINTERVINTELPROC) (GLenum type, const GLvoid* *pointer); -extern void APIENTRY glColorPointervINTEL (GLint, GLenum, const GLvoid* *); -typedef void (APIENTRY * PFNGLCOLORPOINTERVINTELPROC) (GLint size, GLenum type, const GLvoid* *pointer); -extern void APIENTRY glTexCoordPointervINTEL (GLint, GLenum, const GLvoid* *); -typedef void (APIENTRY * PFNGLTEXCOORDPOINTERVINTELPROC) (GLint size, GLenum type, const GLvoid* *pointer); -extern void APIENTRY glPixelTransformParameteriEXT (GLenum, GLenum, GLint); -typedef void (APIENTRY * PFNGLPIXELTRANSFORMPARAMETERIEXTPROC) (GLenum target, GLenum pname, GLint param); -extern void APIENTRY glPixelTransformParameterfEXT (GLenum, GLenum, GLfloat); -typedef void (APIENTRY * PFNGLPIXELTRANSFORMPARAMETERFEXTPROC) (GLenum target, GLenum pname, GLfloat param); -extern void APIENTRY glPixelTransformParameterivEXT (GLenum, GLenum, const GLint *); -typedef void (APIENTRY * PFNGLPIXELTRANSFORMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, const GLint *params); -extern void APIENTRY glPixelTransformParameterfvEXT (GLenum, GLenum, const GLfloat *); -typedef void (APIENTRY * PFNGLPIXELTRANSFORMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, const GLfloat *params); -extern void APIENTRY glSecondaryColor3bEXT (GLbyte, GLbyte, GLbyte); -typedef void (APIENTRY * PFNGLSECONDARYCOLOR3BEXTPROC) (GLbyte red, GLbyte green, GLbyte blue); -extern void APIENTRY glSecondaryColor3bvEXT (const GLbyte *); -typedef void (APIENTRY * PFNGLSECONDARYCOLOR3BVEXTPROC) (const GLbyte *v); -extern void APIENTRY glSecondaryColor3dEXT (GLdouble, GLdouble, GLdouble); -typedef void (APIENTRY * PFNGLSECONDARYCOLOR3DEXTPROC) (GLdouble red, GLdouble green, GLdouble blue); -extern void APIENTRY glSecondaryColor3dvEXT (const GLdouble *); -typedef void (APIENTRY * PFNGLSECONDARYCOLOR3DVEXTPROC) (const GLdouble *v); -extern void APIENTRY glSecondaryColor3fEXT (GLfloat, GLfloat, GLfloat); -typedef void (APIENTRY * PFNGLSECONDARYCOLOR3FEXTPROC) (GLfloat red, GLfloat green, GLfloat blue); -extern void APIENTRY glSecondaryColor3fvEXT (const GLfloat *); -typedef void (APIENTRY * PFNGLSECONDARYCOLOR3FVEXTPROC) (const GLfloat *v); -extern void APIENTRY glSecondaryColor3iEXT (GLint, GLint, GLint); -typedef void (APIENTRY * PFNGLSECONDARYCOLOR3IEXTPROC) (GLint red, GLint green, GLint blue); -extern void APIENTRY glSecondaryColor3ivEXT (const GLint *); -typedef void (APIENTRY * PFNGLSECONDARYCOLOR3IVEXTPROC) (const GLint *v); -extern void APIENTRY glSecondaryColor3sEXT (GLshort, GLshort, GLshort); -typedef void (APIENTRY * PFNGLSECONDARYCOLOR3SEXTPROC) (GLshort red, GLshort green, GLshort blue); -extern void APIENTRY glSecondaryColor3svEXT (const GLshort *); -typedef void (APIENTRY * PFNGLSECONDARYCOLOR3SVEXTPROC) (const GLshort *v); -extern void APIENTRY glSecondaryColor3ubEXT (GLubyte, GLubyte, GLubyte); -typedef void (APIENTRY * PFNGLSECONDARYCOLOR3UBEXTPROC) (GLubyte red, GLubyte green, GLubyte blue); -extern void APIENTRY glSecondaryColor3ubvEXT (const GLubyte *); -typedef void (APIENTRY * PFNGLSECONDARYCOLOR3UBVEXTPROC) (const GLubyte *v); -extern void APIENTRY glSecondaryColor3uiEXT (GLuint, GLuint, GLuint); -typedef void (APIENTRY * PFNGLSECONDARYCOLOR3UIEXTPROC) (GLuint red, GLuint green, GLuint blue); -extern void APIENTRY glSecondaryColor3uivEXT (const GLuint *); -typedef void (APIENTRY * PFNGLSECONDARYCOLOR3UIVEXTPROC) (const GLuint *v); -extern void APIENTRY glSecondaryColor3usEXT (GLushort, GLushort, GLushort); -typedef void (APIENTRY * PFNGLSECONDARYCOLOR3USEXTPROC) (GLushort red, GLushort green, GLushort blue); -extern void APIENTRY glSecondaryColor3usvEXT (const GLushort *); -typedef void (APIENTRY * PFNGLSECONDARYCOLOR3USVEXTPROC) (const GLushort *v); -extern void APIENTRY glSecondaryColorPointerEXT (GLint, GLenum, GLsizei, GLvoid *); -typedef void (APIENTRY * PFNGLSECONDARYCOLORPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLvoid *pointer); -extern void APIENTRY glTextureNormalEXT (GLenum); -typedef void (APIENTRY * PFNGLTEXTURENORMALEXTPROC) (GLenum mode); -extern void APIENTRY glMultiDrawArraysEXT (GLenum, GLint *, GLsizei *, GLsizei); -typedef void (APIENTRY * PFNGLMULTIDRAWARRAYSEXTPROC) (GLenum mode, GLint *first, GLsizei *count, GLsizei primcount); -extern void APIENTRY glMultiDrawElementsEXT (GLenum, const GLsizei *, GLenum, const GLvoid* *, GLsizei); -typedef void (APIENTRY * PFNGLMULTIDRAWELEMENTSEXTPROC) (GLenum mode, const GLsizei *count, GLenum type, const GLvoid* *indices, GLsizei primcount); -extern void APIENTRY glFogCoordfEXT (GLfloat); -typedef void (APIENTRY * PFNGLFOGCOORDFEXTPROC) (GLfloat coord); -extern void APIENTRY glFogCoordfvEXT (const GLfloat *); -typedef void (APIENTRY * PFNGLFOGCOORDFVEXTPROC) (const GLfloat *coord); -extern void APIENTRY glFogCoorddEXT (GLdouble); -typedef void (APIENTRY * PFNGLFOGCOORDDEXTPROC) (GLdouble coord); -extern void APIENTRY glFogCoorddvEXT (const GLdouble *); -typedef void (APIENTRY * PFNGLFOGCOORDDVEXTPROC) (const GLdouble *coord); -extern void APIENTRY glFogCoordPointerEXT (GLenum, GLsizei, const GLvoid *); -typedef void (APIENTRY * PFNGLFOGCOORDPOINTEREXTPROC) (GLenum type, GLsizei stride, const GLvoid *pointer); -extern void APIENTRY glTangent3b (GLbyte, GLbyte, GLbyte); -typedef void (APIENTRY * PFNGLTANGENT3BPROC) (GLbyte tx, GLbyte ty, GLbyte tz); -extern void APIENTRY glTangent3bv (const GLbyte *); -typedef void (APIENTRY * PFNGLTANGENT3BVPROC) (const GLbyte *v); -extern void APIENTRY glTangent3d (GLdouble, GLdouble, GLdouble); -typedef void (APIENTRY * PFNGLTANGENT3DPROC) (GLdouble tx, GLdouble ty, GLdouble tz); -extern void APIENTRY glTangent3dv (const GLdouble *); -typedef void (APIENTRY * PFNGLTANGENT3DVPROC) (const GLdouble *v); -extern void APIENTRY glTangent3f (GLfloat, GLfloat, GLfloat); -typedef void (APIENTRY * PFNGLTANGENT3FPROC) (GLfloat tx, GLfloat ty, GLfloat tz); -extern void APIENTRY glTangent3fv (const GLfloat *); -typedef void (APIENTRY * PFNGLTANGENT3FVPROC) (const GLfloat *v); -extern void APIENTRY glTangent3i (GLint, GLint, GLint); -typedef void (APIENTRY * PFNGLTANGENT3IPROC) (GLint tx, GLint ty, GLint tz); -extern void APIENTRY glTangent3iv (const GLint *); -typedef void (APIENTRY * PFNGLTANGENT3IVPROC) (const GLint *v); -extern void APIENTRY glTangent3s (GLshort, GLshort, GLshort); -typedef void (APIENTRY * PFNGLTANGENT3SPROC) (GLshort tx, GLshort ty, GLshort tz); -extern void APIENTRY glTangent3sv (const GLshort *); -typedef void (APIENTRY * PFNGLTANGENT3SVPROC) (const GLshort *v); -extern void APIENTRY glBinormal3b (GLbyte, GLbyte, GLbyte); -typedef void (APIENTRY * PFNGLBINORMAL3BPROC) (GLbyte bx, GLbyte by, GLbyte bz); -extern void APIENTRY glBinormal3bv (const GLbyte *); -typedef void (APIENTRY * PFNGLBINORMAL3BVPROC) (const GLbyte *v); -extern void APIENTRY glBinormal3d (GLdouble, GLdouble, GLdouble); -typedef void (APIENTRY * PFNGLBINORMAL3DPROC) (GLdouble bx, GLdouble by, GLdouble bz); -extern void APIENTRY glBinormal3dv (const GLdouble *); -typedef void (APIENTRY * PFNGLBINORMAL3DVPROC) (const GLdouble *v); -extern void APIENTRY glBinormal3f (GLfloat, GLfloat, GLfloat); -typedef void (APIENTRY * PFNGLBINORMAL3FPROC) (GLfloat bx, GLfloat by, GLfloat bz); -extern void APIENTRY glBinormal3fv (const GLfloat *); -typedef void (APIENTRY * PFNGLBINORMAL3FVPROC) (const GLfloat *v); -extern void APIENTRY glBinormal3i (GLint, GLint, GLint); -typedef void (APIENTRY * PFNGLBINORMAL3IPROC) (GLint bx, GLint by, GLint bz); -extern void APIENTRY glBinormal3iv (const GLint *); -typedef void (APIENTRY * PFNGLBINORMAL3IVPROC) (const GLint *v); -extern void APIENTRY glBinormal3s (GLshort, GLshort, GLshort); -typedef void (APIENTRY * PFNGLBINORMAL3SPROC) (GLshort bx, GLshort by, GLshort bz); -extern void APIENTRY glBinormal3sv (const GLshort *); -typedef void (APIENTRY * PFNGLBINORMAL3SVPROC) (const GLshort *v); -extern void APIENTRY glTangentPointerEXT (GLenum, GLsizei, const GLvoid *); -typedef void (APIENTRY * PFNGLTANGENTPOINTEREXTPROC) (GLenum type, GLsizei stride, const GLvoid *pointer); -extern void APIENTRY glBinormalPointerEXT (GLenum, GLsizei, const GLvoid *); -typedef void (APIENTRY * PFNGLBINORMALPOINTEREXTPROC) (GLenum type, GLsizei stride, const GLvoid *pointer); -extern void APIENTRY glFinishTextureSUNX (void); -typedef void (APIENTRY * PFNGLFINISHTEXTURESUNXPROC) (void); -extern void APIENTRY glGlobalAlphaFactorbSUN (GLbyte); -typedef void (APIENTRY * PFNGLGLOBALALPHAFACTORBSUNPROC) (GLbyte factor); -extern void APIENTRY glGlobalAlphaFactorsSUN (GLshort); -typedef void (APIENTRY * PFNGLGLOBALALPHAFACTORSSUNPROC) (GLshort factor); -extern void APIENTRY glGlobalAlphaFactoriSUN (GLint); -typedef void (APIENTRY * PFNGLGLOBALALPHAFACTORISUNPROC) (GLint factor); -extern void APIENTRY glGlobalAlphaFactorfSUN (GLfloat); -typedef void (APIENTRY * PFNGLGLOBALALPHAFACTORFSUNPROC) (GLfloat factor); -extern void APIENTRY glGlobalAlphaFactordSUN (GLdouble); -typedef void (APIENTRY * PFNGLGLOBALALPHAFACTORDSUNPROC) (GLdouble factor); -extern void APIENTRY glGlobalAlphaFactorubSUN (GLubyte); -typedef void (APIENTRY * PFNGLGLOBALALPHAFACTORUBSUNPROC) (GLubyte factor); -extern void APIENTRY glGlobalAlphaFactorusSUN (GLushort); -typedef void (APIENTRY * PFNGLGLOBALALPHAFACTORUSSUNPROC) (GLushort factor); -extern void APIENTRY glGlobalAlphaFactoruiSUN (GLuint); -typedef void (APIENTRY * PFNGLGLOBALALPHAFACTORUISUNPROC) (GLuint factor); -extern void APIENTRY glReplacementCodeuiSUN (GLuint); -typedef void (APIENTRY * PFNGLREPLACEMENTCODEUISUNPROC) (GLuint code); -extern void APIENTRY glReplacementCodeusSUN (GLushort); -typedef void (APIENTRY * PFNGLREPLACEMENTCODEUSSUNPROC) (GLushort code); -extern void APIENTRY glReplacementCodeubSUN (GLubyte); -typedef void (APIENTRY * PFNGLREPLACEMENTCODEUBSUNPROC) (GLubyte code); -extern void APIENTRY glReplacementCodeuivSUN (const GLuint *); -typedef void (APIENTRY * PFNGLREPLACEMENTCODEUIVSUNPROC) (const GLuint *code); -extern void APIENTRY glReplacementCodeusvSUN (const GLushort *); -typedef void (APIENTRY * PFNGLREPLACEMENTCODEUSVSUNPROC) (const GLushort *code); -extern void APIENTRY glReplacementCodeubvSUN (const GLubyte *); -typedef void (APIENTRY * PFNGLREPLACEMENTCODEUBVSUNPROC) (const GLubyte *code); -extern void APIENTRY glReplacementCodePointer (GLenum, GLsizei, const GLvoid* *); -typedef void (APIENTRY * PFNGLREPLACEMENTCODEPOINTERPROC) (GLenum type, GLsizei stride, const GLvoid* *pointer); -extern void APIENTRY glColor4ubVertex2fSUN (GLubyte, GLubyte, GLubyte, GLubyte, GLfloat, GLfloat); -typedef void (APIENTRY * PFNGLCOLOR4UBVERTEX2FSUNPROC) (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y); -extern void APIENTRY glColor4ubVertex2fvSUN (const GLubyte *, const GLfloat *); -typedef void (APIENTRY * PFNGLCOLOR4UBVERTEX2FVSUNPROC) (const GLubyte *c, const GLfloat *v); -extern void APIENTRY glColor4ubVertex3fSUN (GLubyte, GLubyte, GLubyte, GLubyte, GLfloat, GLfloat, GLfloat); -typedef void (APIENTRY * PFNGLCOLOR4UBVERTEX3FSUNPROC) (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); -extern void APIENTRY glColor4ubVertex3fvSUN (const GLubyte *, const GLfloat *); -typedef void (APIENTRY * PFNGLCOLOR4UBVERTEX3FVSUNPROC) (const GLubyte *c, const GLfloat *v); -extern void APIENTRY glColor3fVertex3fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); -typedef void (APIENTRY * PFNGLCOLOR3FVERTEX3FSUNPROC) (GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); -extern void APIENTRY glColor3fVertex3fvSUN (const GLfloat *, const GLfloat *); -typedef void (APIENTRY * PFNGLCOLOR3FVERTEX3FVSUNPROC) (const GLfloat *c, const GLfloat *v); -extern void APIENTRY glNormal3fVertex3fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); -typedef void (APIENTRY * PFNGLNORMAL3FVERTEX3FSUNPROC) (GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -extern void APIENTRY glNormal3fVertex3fvSUN (const GLfloat *, const GLfloat *); -typedef void (APIENTRY * PFNGLNORMAL3FVERTEX3FVSUNPROC) (const GLfloat *n, const GLfloat *v); -extern void APIENTRY glColor4fNormal3fVertex3fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); -typedef void (APIENTRY * PFNGLCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -extern void APIENTRY glColor4fNormal3fVertex3fvSUN (const GLfloat *, const GLfloat *, const GLfloat *); -typedef void (APIENTRY * PFNGLCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat *c, const GLfloat *n, const GLfloat *v); -extern void APIENTRY glTexCoord2fVertex3fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); -typedef void (APIENTRY * PFNGLTEXCOORD2FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z); -extern void APIENTRY glTexCoord2fVertex3fvSUN (const GLfloat *, const GLfloat *); -typedef void (APIENTRY * PFNGLTEXCOORD2FVERTEX3FVSUNPROC) (const GLfloat *tc, const GLfloat *v); -extern void APIENTRY glTexCoord4fVertex4fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); -typedef void (APIENTRY * PFNGLTEXCOORD4FVERTEX4FSUNPROC) (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -extern void APIENTRY glTexCoord4fVertex4fvSUN (const GLfloat *, const GLfloat *); -typedef void (APIENTRY * PFNGLTEXCOORD4FVERTEX4FVSUNPROC) (const GLfloat *tc, const GLfloat *v); -extern void APIENTRY glTexCoord2fColor4ubVertex3fSUN (GLfloat, GLfloat, GLubyte, GLubyte, GLubyte, GLubyte, GLfloat, GLfloat, GLfloat); -typedef void (APIENTRY * PFNGLTEXCOORD2FCOLOR4UBVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); -extern void APIENTRY glTexCoord2fColor4ubVertex3fvSUN (const GLfloat *, const GLubyte *, const GLfloat *); -typedef void (APIENTRY * PFNGLTEXCOORD2FCOLOR4UBVERTEX3FVSUNPROC) (const GLfloat *tc, const GLubyte *c, const GLfloat *v); -extern void APIENTRY glTexCoord2fColor3fVertex3fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); -typedef void (APIENTRY * PFNGLTEXCOORD2FCOLOR3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); -extern void APIENTRY glTexCoord2fColor3fVertex3fvSUN (const GLfloat *, const GLfloat *, const GLfloat *); -typedef void (APIENTRY * PFNGLTEXCOORD2FCOLOR3FVERTEX3FVSUNPROC) (const GLfloat *tc, const GLfloat *c, const GLfloat *v); -extern void APIENTRY glTexCoord2fNormal3fVertex3fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); -typedef void (APIENTRY * PFNGLTEXCOORD2FNORMAL3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -extern void APIENTRY glTexCoord2fNormal3fVertex3fvSUN (const GLfloat *, const GLfloat *, const GLfloat *); -typedef void (APIENTRY * PFNGLTEXCOORD2FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat *tc, const GLfloat *n, const GLfloat *v); -extern void APIENTRY glTexCoord2fColor4fNormal3fVertex3fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); -typedef void (APIENTRY * PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -extern void APIENTRY glTexCoord2fColor4fNormal3fVertex3fvSUN (const GLfloat *, const GLfloat *, const GLfloat *, const GLfloat *); -typedef void (APIENTRY * PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); -extern void APIENTRY glTexCoord4fColor4fNormal3fVertex4fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); -typedef void (APIENTRY * PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FSUNPROC) (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -extern void APIENTRY glTexCoord4fColor4fNormal3fVertex4fvSUN (const GLfloat *, const GLfloat *, const GLfloat *, const GLfloat *); -typedef void (APIENTRY * PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FVSUNPROC) (const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); -extern void APIENTRY glReplacementCodeuiVertex3fSUN (GLenum, GLfloat, GLfloat, GLfloat); -typedef void (APIENTRY * PFNGLREPLACEMENTCODEUIVERTEX3FSUNPROC) (GLenum rc, GLfloat x, GLfloat y, GLfloat z); -extern void APIENTRY glReplacementCodeuiVertex3fvSUN (const GLenum *, const GLfloat *); -typedef void (APIENTRY * PFNGLREPLACEMENTCODEUIVERTEX3FVSUNPROC) (const GLenum *rc, const GLfloat *v); -extern void APIENTRY glReplacementCodeuiColor4ubVertex3fSUN (GLenum, GLubyte, GLubyte, GLubyte, GLubyte, GLfloat, GLfloat, GLfloat); -typedef void (APIENTRY * PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FSUNPROC) (GLenum rc, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); -extern void APIENTRY glReplacementCodeuiColor4ubVertex3fvSUN (const GLenum *, const GLubyte *, const GLfloat *); -typedef void (APIENTRY * PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FVSUNPROC) (const GLenum *rc, const GLubyte *c, const GLfloat *v); -extern void APIENTRY glReplacementCodeuiColor3fVertex3fSUN (GLenum, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); -typedef void (APIENTRY * PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FSUNPROC) (GLenum rc, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); -extern void APIENTRY glReplacementCodeuiColor3fVertex3fvSUN (const GLenum *, const GLfloat *, const GLfloat *); -typedef void (APIENTRY * PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FVSUNPROC) (const GLenum *rc, const GLfloat *c, const GLfloat *v); -extern void APIENTRY glReplacementCodeuiNormal3fVertex3fSUN (GLenum, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); -typedef void (APIENTRY * PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FSUNPROC) (GLenum rc, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -extern void APIENTRY glReplacementCodeuiNormal3fVertex3fvSUN (const GLenum *, const GLfloat *, const GLfloat *); -typedef void (APIENTRY * PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FVSUNPROC) (const GLenum *rc, const GLfloat *n, const GLfloat *v); -extern void APIENTRY glReplacementCodeuiColor4fNormal3fVertex3fSUN (GLenum, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); -typedef void (APIENTRY * PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLenum rc, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -extern void APIENTRY glReplacementCodeuiColor4fNormal3fVertex3fvSUN (const GLenum *, const GLfloat *, const GLfloat *, const GLfloat *); -typedef void (APIENTRY * PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLenum *rc, const GLfloat *c, const GLfloat *n, const GLfloat *v); -extern void APIENTRY glReplacementCodeuiTexCoord2fVertex3fSUN (GLenum, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); -typedef void (APIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FSUNPROC) (GLenum rc, GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z); -extern void APIENTRY glReplacementCodeuiTexCoord2fVertex3fvSUN (const GLenum *, const GLfloat *, const GLfloat *); -typedef void (APIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FVSUNPROC) (const GLenum *rc, const GLfloat *tc, const GLfloat *v); -extern void APIENTRY glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN (GLenum, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); -typedef void (APIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FSUNPROC) (GLenum rc, GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -extern void APIENTRY glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN (const GLenum *, const GLfloat *, const GLfloat *, const GLfloat *); -typedef void (APIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FVSUNPROC) (const GLenum *rc, const GLfloat *tc, const GLfloat *n, const GLfloat *v); -extern void APIENTRY glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN (GLenum, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); -typedef void (APIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLenum rc, GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -extern void APIENTRY glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN (const GLenum *, const GLfloat *, const GLfloat *, const GLfloat *, const GLfloat *); -typedef void (APIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLenum *rc, const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); -extern void APIENTRY glBlendFuncSeparateEXT (GLenum, GLenum, GLenum, GLenum); -typedef void (APIENTRY * PFNGLBLENDFUNCSEPARATEEXTPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); -extern void APIENTRY glVertexWeightfEXT (GLfloat); -typedef void (APIENTRY * PFNGLVERTEXWEIGHTFEXTPROC) (GLfloat weight); -extern void APIENTRY glVertexWeightfvEXT (const GLfloat *); -typedef void (APIENTRY * PFNGLVERTEXWEIGHTFVEXTPROC) (const GLfloat *weight); -extern void APIENTRY glVertexWeightPointerEXT (GLsizei, GLenum, GLsizei, const GLvoid *); -typedef void (APIENTRY * PFNGLVERTEXWEIGHTPOINTEREXTPROC) (GLsizei size, GLenum type, GLsizei stride, const GLvoid *pointer); -extern void APIENTRY glFlushVertexArrayRangeNV (void); -typedef void (APIENTRY * PFNGLFLUSHVERTEXARRAYRANGENVPROC) (void); -extern void APIENTRY glVertexArrayRangeNV (GLsizei, const GLvoid *); -typedef void (APIENTRY * PFNGLVERTEXARRAYRANGENVPROC) (GLsizei size, const GLvoid *pointer); -extern void APIENTRY glCombinerParameterfvNV (GLenum, const GLfloat *); -typedef void (APIENTRY * PFNGLCOMBINERPARAMETERFVNVPROC) (GLenum pname, const GLfloat *params); -extern void APIENTRY glCombinerParameterfNV (GLenum, GLfloat); -typedef void (APIENTRY * PFNGLCOMBINERPARAMETERFNVPROC) (GLenum pname, GLfloat param); -extern void APIENTRY glCombinerParameterivNV (GLenum, const GLint *); -typedef void (APIENTRY * PFNGLCOMBINERPARAMETERIVNVPROC) (GLenum pname, const GLint *params); -extern void APIENTRY glCombinerParameteriNV (GLenum, GLint); -typedef void (APIENTRY * PFNGLCOMBINERPARAMETERINVPROC) (GLenum pname, GLint param); -extern void APIENTRY glCombinerInputNV (GLenum, GLenum, GLenum, GLenum, GLenum, GLenum); -typedef void (APIENTRY * PFNGLCOMBINERINPUTNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); -extern void APIENTRY glCombinerOutputNV (GLenum, GLenum, GLenum, GLenum, GLenum, GLenum, GLenum, GLboolean, GLboolean, GLboolean); -typedef void (APIENTRY * PFNGLCOMBINEROUTPUTNVPROC) (GLenum stage, GLenum portion, GLenum abOutput, GLenum cdOutput, GLenum sumOutput, GLenum scale, GLenum bias, GLboolean abDotProduct, GLboolean cdDotProduct, GLboolean muxSum); -extern void APIENTRY glFinalCombinerInputNV (GLenum, GLenum, GLenum, GLenum); -typedef void (APIENTRY * PFNGLFINALCOMBINERINPUTNVPROC) (GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); -extern void APIENTRY glGetCombinerInputParameterfvNV (GLenum, GLenum, GLenum, GLenum, GLfloat *); -typedef void (APIENTRY * PFNGLGETCOMBINERINPUTPARAMETERFVNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLfloat *params); -extern void APIENTRY glGetCombinerInputParameterivNV (GLenum, GLenum, GLenum, GLenum, GLint *); -typedef void (APIENTRY * PFNGLGETCOMBINERINPUTPARAMETERIVNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLint *params); -extern void APIENTRY glGetCombinerOutputParameterfvNV (GLenum, GLenum, GLenum, GLfloat *); -typedef void (APIENTRY * PFNGLGETCOMBINEROUTPUTPARAMETERFVNVPROC) (GLenum stage, GLenum portion, GLenum pname, GLfloat *params); -extern void APIENTRY glGetCombinerOutputParameterivNV (GLenum, GLenum, GLenum, GLint *); -typedef void (APIENTRY * PFNGLGETCOMBINEROUTPUTPARAMETERIVNVPROC) (GLenum stage, GLenum portion, GLenum pname, GLint *params); -extern void APIENTRY glGetFinalCombinerInputParameterfvNV (GLenum, GLenum, GLfloat *); -typedef void (APIENTRY * PFNGLGETFINALCOMBINERINPUTPARAMETERFVNVPROC) (GLenum variable, GLenum pname, GLfloat *params); -extern void APIENTRY glGetFinalCombinerInputParameterivNV (GLenum, GLenum, GLint *); -typedef void (APIENTRY * PFNGLGETFINALCOMBINERINPUTPARAMETERIVNVPROC) (GLenum variable, GLenum pname, GLint *params); -extern void APIENTRY glResizeBuffersMESA (void); -typedef void (APIENTRY * PFNGLRESIZEBUFFERSMESAPROC) (void); -extern void APIENTRY glWindowPos2dMESA (GLdouble, GLdouble); -typedef void (APIENTRY * PFNGLWINDOWPOS2DMESAPROC) (GLdouble x, GLdouble y); -extern void APIENTRY glWindowPos2dvMESA (const GLdouble *); -typedef void (APIENTRY * PFNGLWINDOWPOS2DVMESAPROC) (const GLdouble *v); -extern void APIENTRY glWindowPos2fMESA (GLfloat, GLfloat); -typedef void (APIENTRY * PFNGLWINDOWPOS2FMESAPROC) (GLfloat x, GLfloat y); -extern void APIENTRY glWindowPos2fvMESA (const GLfloat *); -typedef void (APIENTRY * PFNGLWINDOWPOS2FVMESAPROC) (const GLfloat *v); -extern void APIENTRY glWindowPos2iMESA (GLint, GLint); -typedef void (APIENTRY * PFNGLWINDOWPOS2IMESAPROC) (GLint x, GLint y); -extern void APIENTRY glWindowPos2ivMESA (const GLint *); -typedef void (APIENTRY * PFNGLWINDOWPOS2IVMESAPROC) (const GLint *v); -extern void APIENTRY glWindowPos2sMESA (GLshort, GLshort); -typedef void (APIENTRY * PFNGLWINDOWPOS2SMESAPROC) (GLshort x, GLshort y); -extern void APIENTRY glWindowPos2svMESA (const GLshort *); -typedef void (APIENTRY * PFNGLWINDOWPOS2SVMESAPROC) (const GLshort *v); -extern void APIENTRY glWindowPos3dMESA (GLdouble, GLdouble, GLdouble); -typedef void (APIENTRY * PFNGLWINDOWPOS3DMESAPROC) (GLdouble x, GLdouble y, GLdouble z); -extern void APIENTRY glWindowPos3dvMESA (const GLdouble *); -typedef void (APIENTRY * PFNGLWINDOWPOS3DVMESAPROC) (const GLdouble *v); -extern void APIENTRY glWindowPos3fMESA (GLfloat, GLfloat, GLfloat); -typedef void (APIENTRY * PFNGLWINDOWPOS3FMESAPROC) (GLfloat x, GLfloat y, GLfloat z); -extern void APIENTRY glWindowPos3fvMESA (const GLfloat *); -typedef void (APIENTRY * PFNGLWINDOWPOS3FVMESAPROC) (const GLfloat *v); -extern void APIENTRY glWindowPos3iMESA (GLint, GLint, GLint); -typedef void (APIENTRY * PFNGLWINDOWPOS3IMESAPROC) (GLint x, GLint y, GLint z); -extern void APIENTRY glWindowPos3ivMESA (const GLint *); -typedef void (APIENTRY * PFNGLWINDOWPOS3IVMESAPROC) (const GLint *v); -extern void APIENTRY glWindowPos3sMESA (GLshort, GLshort, GLshort); -typedef void (APIENTRY * PFNGLWINDOWPOS3SMESAPROC) (GLshort x, GLshort y, GLshort z); -extern void APIENTRY glWindowPos3svMESA (const GLshort *); -typedef void (APIENTRY * PFNGLWINDOWPOS3SVMESAPROC) (const GLshort *v); -extern void APIENTRY glWindowPos4dMESA (GLdouble, GLdouble, GLdouble, GLdouble); -typedef void (APIENTRY * PFNGLWINDOWPOS4DMESAPROC) (GLdouble x, GLdouble y, GLdouble z, GLdouble w); -extern void APIENTRY glWindowPos4dvMESA (const GLdouble *); -typedef void (APIENTRY * PFNGLWINDOWPOS4DVMESAPROC) (const GLdouble *v); -extern void APIENTRY glWindowPos4fMESA (GLfloat, GLfloat, GLfloat, GLfloat); -typedef void (APIENTRY * PFNGLWINDOWPOS4FMESAPROC) (GLfloat x, GLfloat y, GLfloat z, GLfloat w); -extern void APIENTRY glWindowPos4fvMESA (const GLfloat *); -typedef void (APIENTRY * PFNGLWINDOWPOS4FVMESAPROC) (const GLfloat *v); -extern void APIENTRY glWindowPos4iMESA (GLint, GLint, GLint, GLint); -typedef void (APIENTRY * PFNGLWINDOWPOS4IMESAPROC) (GLint x, GLint y, GLint z, GLint w); -extern void APIENTRY glWindowPos4ivMESA (const GLint *); -typedef void (APIENTRY * PFNGLWINDOWPOS4IVMESAPROC) (const GLint *v); -extern void APIENTRY glWindowPos4sMESA (GLshort, GLshort, GLshort, GLshort); -typedef void (APIENTRY * PFNGLWINDOWPOS4SMESAPROC) (GLshort x, GLshort y, GLshort z, GLshort w); -extern void APIENTRY glWindowPos4svMESA (const GLshort *); -typedef void (APIENTRY * PFNGLWINDOWPOS4SVMESAPROC) (const GLshort *v); -extern void APIENTRY glMultiModeDrawArraysIBM (GLenum, const GLint *, const GLsizei *, GLsizei, GLint); -typedef void (APIENTRY * PFNGLMULTIMODEDRAWARRAYSIBMPROC) (GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount, GLint modestride); -extern void APIENTRY glMultiModeDrawElementsIBM (const GLenum *, const GLsizei *, GLenum, const GLvoid* *, GLsizei, GLint); -typedef void (APIENTRY * PFNGLMULTIMODEDRAWELEMENTSIBMPROC) (const GLenum *mode, const GLsizei *count, GLenum type, const GLvoid* *indices, GLsizei primcount, GLint modestride); -extern void APIENTRY glColorPointerListIBM (GLint, GLenum, GLint, const GLvoid* *, GLint); -typedef void (APIENTRY * PFNGLCOLORPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); -extern void APIENTRY glSecondaryColorPointerListIBM (GLint, GLenum, GLint, const GLvoid* *, GLint); -typedef void (APIENTRY * PFNGLSECONDARYCOLORPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); -extern void APIENTRY glEdgeFlagPointerListIBM (GLint, const GLboolean* *, GLint); -typedef void (APIENTRY * PFNGLEDGEFLAGPOINTERLISTIBMPROC) (GLint stride, const GLboolean* *pointer, GLint ptrstride); -extern void APIENTRY glFogCoordPointerListIBM (GLenum, GLint, const GLvoid* *, GLint); -typedef void (APIENTRY * PFNGLFOGCOORDPOINTERLISTIBMPROC) (GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); -extern void APIENTRY glIndexPointerListIBM (GLenum, GLint, const GLvoid* *, GLint); -typedef void (APIENTRY * PFNGLINDEXPOINTERLISTIBMPROC) (GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); -extern void APIENTRY glNormalPointerListIBM (GLenum, GLint, const GLvoid* *, GLint); -typedef void (APIENTRY * PFNGLNORMALPOINTERLISTIBMPROC) (GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); -extern void APIENTRY glTexCoordPointerListIBM (GLint, GLenum, GLint, const GLvoid* *, GLint); -typedef void (APIENTRY * PFNGLTEXCOORDPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); -extern void APIENTRY glVertexPointerListIBM (GLint, GLenum, GLint, const GLvoid* *, GLint); -typedef void (APIENTRY * PFNGLVERTEXPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); -extern void APIENTRY glTbufferMask3DFX (GLuint); -typedef void (APIENTRY * PFNGLTBUFFERMASK3DFXPROC) (GLuint mask); -extern void APIENTRY glSampleMaskEXT (GLclampf, GLboolean); -typedef void (APIENTRY * PFNGLSAMPLEMASKEXTPROC) (GLclampf value, GLboolean invert); -extern void APIENTRY glSamplePatternEXT (GLenum); -typedef void (APIENTRY * PFNGLSAMPLEPATTERNEXTPROC) (GLenum pattern); - -#ifdef __cplusplus -} -#endif - -#endif Index: xc/extras/Mesa/src/glheader.h diff -u xc/extras/Mesa/src/glheader.h:1.6 xc/extras/Mesa/src/glheader.h:1.12 --- xc/extras/Mesa/src/glheader.h:1.6 Fri Jun 16 20:02:12 2000 +++ xc/extras/Mesa/src/glheader.h Mon Nov 13 16:55:33 2000 @@ -1,7 +1,7 @@ /* * Mesa 3-D graphics library - * Version: 3.3 + * Version: 3.4 * * Copyright (C) 1999-2000 Brian Paul All Rights Reserved. * @@ -22,6 +22,7 @@ * 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. */ +/* $XFree86: xc/extras/Mesa/src/glheader.h,v 1.12 2000/11/13 21:55:33 dawes Exp $ */ #ifndef GLHEADER_H @@ -46,7 +47,12 @@ #else #include #include +/* If we can use Compaq's Fast Math Library on Alpha */ +#if defined(__alpha__) && defined(CCPML) +#include +#else #include +#endif #include #include #include @@ -77,11 +83,11 @@ * the new src/glheader.h file. */ -#if defined(_WIN32) && !defined(__WIN32__) +#if defined(_WIN32) && !defined(__WIN32__) && !defined(__CYGWIN__) # define __WIN32__ #endif -#if !defined(OPENSTEP) && (defined(__WIN32__) || defined(__CYGWIN__)) +#if !defined(OPENSTEP) && (defined(__WIN32__) && !defined(__CYGWIN__)) # pragma warning( disable : 4068 ) /* unknown pragma */ # pragma warning( disable : 4710 ) /* function 'foo' not inlined */ # pragma warning( disable : 4711 ) /* function 'foo' selected for automatic inline expansion */ @@ -128,16 +134,21 @@ /* compatability guard so we don't need to change client code */ -#if defined(_WIN32) && !defined(_WINDEF_) && !defined(_GNU_H_WINDOWS32_BASE) && !defined(OPENSTEP) +#if defined(_WIN32) && !defined(_WINDEF_) && !defined(_GNU_H_WINDOWS32_BASE) && !defined(OPENSTEP) && !defined(__CYGWIN__) #if 0 # define CALLBACK GLCALLBACK -#endif -typedef int (GLAPIENTRY *PROC)(); typedef void *HGLRC; typedef void *HDC; +#endif +typedef int (GLAPIENTRY *PROC)(); typedef unsigned long COLORREF; #endif + +/* Make sure we include glext.h from gl.h */ +#define GL_GLEXT_PROTOTYPES + + #if defined(_WIN32) && !defined(_WINGDI_) && !defined(_GNU_H_WINDOWS32_DEFINES) && !defined(OPENSTEP) # define WGL_FONT_LINES 0 # define WGL_FONT_POLYGONS 1 @@ -153,14 +164,14 @@ typedef struct tagLAYERPLANEDESCRIPTOR LAYERPLANEDESCRIPTOR, *PLAYERPLANEDESCRIPTOR, *LPLAYERPLANEDESCRIPTOR; typedef struct _GLYPHMETRICSFLOAT GLYPHMETRICSFLOAT, *PGLYPHMETRICSFLOAT, *LPGLYPHMETRICSFLOAT; typedef struct tagPIXELFORMATDESCRIPTOR PIXELFORMATDESCRIPTOR, *PPIXELFORMATDESCRIPTOR, *LPPIXELFORMATDESCRIPTOR; +#if 0 #include #endif +#endif -/* Make sure we include glext.h */ -#define GL_GLEXT_PROTOTYPES #include "GL/gl.h" #include "GL/glext.h" Index: xc/extras/Mesa/src/hash.c diff -u xc/extras/Mesa/src/hash.c:1.4 xc/extras/Mesa/src/hash.c:1.5 --- xc/extras/Mesa/src/hash.c:1.4 Fri Jun 16 20:02:12 2000 +++ xc/extras/Mesa/src/hash.c Thu Nov 30 10:39:04 2000 @@ -100,7 +100,6 @@ const struct HashEntry *entry; assert(table); - assert(key); pos = key & (TABLE_SIZE-1); entry = table->Table[pos]; @@ -129,7 +128,6 @@ struct HashEntry *entry; assert(table); - assert(key); _glthread_LOCK_MUTEX(table->Mutex); @@ -171,7 +169,6 @@ struct HashEntry *entry, *prev; assert(table); - assert(key); _glthread_LOCK_MUTEX(table->Mutex); Index: xc/extras/Mesa/src/image.c diff -u xc/extras/Mesa/src/image.c:1.5 xc/extras/Mesa/src/image.c:1.9 --- xc/extras/Mesa/src/image.c:1.5 Fri Jun 16 20:02:12 2000 +++ xc/extras/Mesa/src/image.c Mon Nov 13 18:30:48 2000 @@ -1,7 +1,7 @@ /* * Mesa 3-D graphics library - * Version: 3.3 + * Version: 3.4 * * Copyright (C) 1999-2000 Brian Paul All Rights Reserved. * @@ -329,10 +329,10 @@ case GL_GREEN: case GL_BLUE: case GL_ALPHA: + case GL_INTENSITY: case GL_LUMINANCE: case GL_LUMINANCE_ALPHA: case GL_DEPTH_COMPONENT: - case GL_BGR: switch (type) { case GL_BYTE: case GL_UNSIGNED_BYTE: @@ -346,6 +346,7 @@ return GL_FALSE; } case GL_RGB: + case GL_BGR: switch (type) { case GL_BYTE: case GL_UNSIGNED_BYTE: @@ -617,6 +618,7 @@ ctx->Pixel.ScaleOrBiasRGBApcm || ctx->Pixel.ColorTableEnabled || ctx->Pixel.PostColorMatrixColorTableEnabled || + ctx->Pixel.PostConvolutionColorTableEnabled || ctx->Pixel.MinMaxEnabled || ctx->Pixel.HistogramEnabled); @@ -627,7 +629,7 @@ } else if (!applyTransferOps && format == GL_RGB && type == GL_UNSIGNED_BYTE) { /* common simple case */ - GLint i; + GLuint i; GLubyte *dest = (GLubyte *) destination; for (i = 0; i < n; i++) { dest[0] = srcRgba[i][RCOMP]; @@ -673,8 +675,11 @@ _mesa_lookup_rgba(&ctx->ColorTable, n, rgba); } /* XXX convolution here */ - /* XXX post-convolution color table look-up here */ - /* color matrix */ + /* GL_POST_CONVOLUTION_COLOR_TABLE lookup */ + if (ctx->Pixel.PostConvolutionColorTableEnabled) { + _mesa_lookup_rgba(&ctx->PostConvolutionColorTable, n, rgba); + } + /* color matrix transform */ if (ctx->ColorMatrix.type != MATRIX_IDENTITY || ctx->Pixel.ScaleOrBiasRGBApcm) { _mesa_transform_rgba(ctx, n, rgba); @@ -1271,7 +1276,7 @@ } break; case GL_UNSIGNED_SHORT_4_4_4_4: - if (format == GL_RGB) { + if (format == GL_RGBA) { GLushort *dst = (GLushort *) destination; for (i=0;iPixel.ScaleOrBiasRGBApcm || ctx->Pixel.ColorTableEnabled || ctx->Pixel.PostColorMatrixColorTableEnabled || + ctx->Pixel.PostConvolutionColorTableEnabled || ctx->Pixel.MinMaxEnabled || ctx->Pixel.HistogramEnabled); @@ -2274,7 +2352,7 @@ unpacking); if (applyTransferOps) { - if (ctx->Pixel.MapColorFlag) { + if (dstFormat == GL_COLOR_INDEX && ctx->Pixel.MapColorFlag) { _mesa_map_ci(ctx, n, indexes); } if (ctx->Pixel.IndexShift || ctx->Pixel.IndexOffset) { @@ -2317,7 +2395,10 @@ _mesa_lookup_rgba(&ctx->ColorTable, n, rgba); } /* XXX convolution here */ - /* XXX post-convolution color table look-up here */ + /* GL_POST_CONVOLUTION_COLOR_TABLE lookup */ + if (ctx->Pixel.PostConvolutionColorTableEnabled) { + _mesa_lookup_rgba(&ctx->PostConvolutionColorTable, n, rgba); + } /* color matrix transform */ if (ctx->ColorMatrix.type != MATRIX_IDENTITY || ctx->Pixel.ScaleOrBiasRGBApcm) { @@ -2515,6 +2596,7 @@ ctx->Pixel.ScaleOrBiasRGBApcm || ctx->Pixel.ColorTableEnabled || ctx->Pixel.PostColorMatrixColorTableEnabled || + ctx->Pixel.PostConvolutionColorTableEnabled || ctx->Pixel.MinMaxEnabled || ctx->Pixel.HistogramEnabled); @@ -2539,7 +2621,7 @@ unpacking); if (applyTransferOps) { - if (ctx->Pixel.MapColorFlag) { + if (dstFormat == GL_COLOR_INDEX && ctx->Pixel.MapColorFlag) { _mesa_map_ci(ctx, n, indexes); } if (ctx->Pixel.IndexShift || ctx->Pixel.IndexOffset) { @@ -2582,7 +2664,10 @@ _mesa_lookup_rgba(&ctx->ColorTable, n, rgba); } /* XXX convolution here */ - /* XXX post-convolution color table look-up here */ + /* GL_POST_CONVOLUTION_COLOR_TABLE lookup */ + if (ctx->Pixel.PostConvolutionColorTableEnabled) { + _mesa_lookup_rgba(&ctx->PostConvolutionColorTable, n, rgba); + } /* color matrix transform */ if (ctx->ColorMatrix.type != MATRIX_IDENTITY || ctx->Pixel.ScaleOrBiasRGBApcm) { @@ -2930,7 +3015,7 @@ const struct gl_pixelstore_attrib *unpacking, GLboolean applyTransferOps ) { - GLfloat *depth = MALLOC(n * sizeof(GLfloat)); + GLfloat *depth = (GLfloat *) MALLOC(n * sizeof(GLfloat)); if (!depth) return; @@ -2994,6 +3079,7 @@ break; default: gl_problem(NULL, "bad type in _mesa_unpack_depth_span()"); + FREE(depth); return; } @@ -3060,7 +3146,7 @@ } { - GLubyte *destBuffer = MALLOC(bytesPerRow * height * depth); + GLubyte *destBuffer = (GLubyte *) MALLOC(bytesPerRow * height * depth); GLubyte *dst; GLint img, row; if (!destBuffer) @@ -3114,9 +3200,8 @@ width_in_bytes = CEILING( width, 8 ); dst = buffer; for (row = 0; row < height; row++) { - GLubyte *src = _mesa_image_address( packing, pixels, width, height, - GL_COLOR_INDEX, GL_BITMAP, - 0, row, 0 ); + GLubyte *src = (GLubyte *) _mesa_image_address(packing, pixels, width, + height, GL_COLOR_INDEX, GL_BITMAP, 0, row, 0); if (!src) { FREE(buffer); return NULL; @@ -3209,7 +3294,7 @@ width_in_bytes = CEILING( width, 8 ); src = source; for (row = 0; row < height; row++) { - GLubyte *dst = _mesa_image_address( packing, dest, width, height, + GLubyte *dst = (GLubyte *) _mesa_image_address( packing, dest, width, height, GL_COLOR_INDEX, GL_BITMAP, 0, row, 0 ); if (!dst) Index: xc/extras/Mesa/src/imaging.c diff -u xc/extras/Mesa/src/imaging.c:1.4 xc/extras/Mesa/src/imaging.c:1.8 --- xc/extras/Mesa/src/imaging.c:1.4 Fri Jun 16 20:02:13 2000 +++ xc/extras/Mesa/src/imaging.c Thu Nov 30 10:39:04 2000 @@ -1,7 +1,7 @@ /* * Mesa 3-D graphics library - * Version: 3.3 + * Version: 3.4 * * Copyright (C) 1999-2000 Brian Paul All Rights Reserved. * @@ -210,7 +210,7 @@ const struct gl_pixelstore_attrib *packing ) { const GLint comps = _mesa_components_in_format(format); - GLuint luminance[2]; + GLfloat luminance[2]; if (format == GL_LUMINANCE || format == GL_LUMINANCE_ALPHA) { luminance[0] = minmax[0][RCOMP] + minmax[0][GCOMP] + minmax[0][BCOMP]; @@ -938,6 +938,7 @@ format == GL_COLOR_INDEX || format == GL_STENCIL_INDEX || format == GL_DEPTH_COMPONENT || + format == GL_INTENSITY || type == GL_BITMAP) { gl_error(ctx, GL_INVALID_ENUM, "glConvolutionFilter1D(format or type)"); return; @@ -1007,6 +1008,7 @@ format == GL_COLOR_INDEX || format == GL_STENCIL_INDEX || format == GL_DEPTH_COMPONENT || + format == GL_INTENSITY || type == GL_BITMAP) { gl_error(ctx, GL_INVALID_ENUM, "glConvolutionFilter2D(format or type)"); return; @@ -1252,7 +1254,7 @@ _mesa_CopyConvolutionFilter1D(GLenum target, GLenum internalFormat, GLint x, GLint y, GLsizei width) { GLenum baseFormat; - GLfloat rgba[MAX_CONVOLUTION_WIDTH][4]; + GLubyte rgba[MAX_CONVOLUTION_WIDTH][4]; GET_CURRENT_CONTEXT(ctx); ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx, "glCopyConvolutionFilter1D"); @@ -1273,7 +1275,9 @@ } /* read pixels from framebuffer */ + RENDER_START(ctx); gl_read_rgba_span(ctx, ctx->ReadBuffer, width, x, y, (GLubyte (*)[4]) rgba); + RENDER_FINISH(ctx); /* store as convolution filter */ _mesa_ConvolutionFilter1D(target, internalFormat, width, @@ -1287,7 +1291,7 @@ GLenum baseFormat; GLint i; struct gl_pixelstore_attrib packSave; - GLfloat rgba[MAX_CONVOLUTION_HEIGHT][MAX_CONVOLUTION_WIDTH][4]; + GLubyte rgba[MAX_CONVOLUTION_HEIGHT][MAX_CONVOLUTION_WIDTH][4]; GET_CURRENT_CONTEXT(ctx); ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx, "glCopyConvolutionFilter2D"); @@ -1312,10 +1316,12 @@ } /* read pixels from framebuffer */ + RENDER_START(ctx); for (i = 0; i < height; i++) { gl_read_rgba_span(ctx, ctx->ReadBuffer, width, x, y + i, (GLubyte (*)[4]) rgba[i]); } + RENDER_FINISH(ctx); /* * store as convolution filter @@ -1341,6 +1347,8 @@ void _mesa_GetConvolutionFilter(GLenum target, GLenum format, GLenum type, GLvoid *image) { + const struct gl_convolution_attrib *filter; + GLint row; GET_CURRENT_CONTEXT(ctx); ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx, "glGetConvolutionFilter"); @@ -1353,13 +1361,37 @@ format == GL_COLOR_INDEX || format == GL_STENCIL_INDEX || format == GL_DEPTH_COMPONENT || + format == GL_INTENSITY || type == GL_BITMAP) { gl_error(ctx, GL_INVALID_ENUM, "glGetConvolutionFilter(format or type)"); return; } - (void) image; - /* XXX store image */ + switch (target) { + case GL_CONVOLUTION_1D: + filter = &(ctx->Convolution1D); + break; + case GL_CONVOLUTION_2D: + filter = &(ctx->Convolution2D); + break; + default: + gl_error(ctx, GL_INVALID_ENUM, "glGetConvolutionFilter(target)"); + return; + } + + for (row = 0; row < filter->Height; row++) { + GLvoid *dst = _mesa_image_address( &ctx->Pack, image, filter->Width, + filter->Height, format, type, + 0, row, 0); + const GLfloat *src = filter->Filter + row * filter->Width * 4; + GLubyte img[MAX_WIDTH * 4]; + GLint i; + for (i = 0; i < filter->Width * 4; i++) { + img[i] = (GLint) (CLAMP(src[i], 0.0, 1.0) * 255.0); + } + _mesa_pack_rgba_span(ctx, filter->Width, (const GLubyte (*)[4]) img, + format, type, dst, &ctx->Pack, 0); + } } @@ -1460,7 +1492,7 @@ params[3] = FLOAT_TO_INT(ctx->Pixel.ConvolutionBorderColor[c][3]); break; case GL_CONVOLUTION_BORDER_MODE: - *params = (GLint) ctx->Pixel.ConvolutionBorderMode; + *params = (GLint) ctx->Pixel.ConvolutionBorderMode[c]; break; case GL_CONVOLUTION_FILTER_SCALE: params[0] = (GLint) ctx->Pixel.ConvolutionFilterScale[c][0]; @@ -1511,6 +1543,7 @@ format == GL_COLOR_INDEX || format == GL_STENCIL_INDEX || format == GL_DEPTH_COMPONENT || + format == GL_INTENSITY || type == GL_BITMAP) { gl_error(ctx, GL_INVALID_ENUM, "glGetConvolutionFilter(format or type)"); return; @@ -1554,6 +1587,7 @@ format == GL_COLOR_INDEX || format == GL_STENCIL_INDEX || format == GL_DEPTH_COMPONENT || + format == GL_INTENSITY || type == GL_BITMAP) { gl_error(ctx, GL_INVALID_ENUM, "glSeparableFilter2D(format or type)"); return; Index: xc/extras/Mesa/src/light.c diff -u xc/extras/Mesa/src/light.c:1.3 xc/extras/Mesa/src/light.c:1.6 --- xc/extras/Mesa/src/light.c:1.3 Tue Feb 15 02:12:21 2000 +++ xc/extras/Mesa/src/light.c Mon Nov 13 18:30:49 2000 @@ -512,9 +512,6 @@ - - - /* * Check if the global material has to be updated with info that was * associated with a vertex via glMaterial. @@ -522,6 +519,8 @@ * glBegin/glEnd either by calling glMaterial() or by calling glColor() * when GL_COLOR_MATERIAL is enabled. * + * src[0] is front material, src[1] is back material + * * KW: Added code here to keep the precomputed variables uptodate. * This means we can use the faster shade functions when using * GL_COLOR_MATERIAL, and we can also now use the precomputed @@ -529,41 +528,62 @@ * the cost of doing this here. */ void gl_update_material( GLcontext *ctx, - struct gl_material *src, + const struct gl_material src[2], GLuint bitmask ) { struct gl_light *light, *list = &ctx->Light.EnabledList; - GLfloat tmp[4]; if (ctx->Light.ColorMaterialEnabled) bitmask &= ~ctx->Light.ColorMaterialBitmask; if (MESA_VERBOSE&VERBOSE_IMMEDIATE) - fprintf(stderr, "gl_update_material, mask %x\n", bitmask); + fprintf(stderr, "gl_update_material, mask 0x%x\n", bitmask); if (!bitmask) return; + /* update material emission */ + if (bitmask & FRONT_EMISSION_BIT) { + struct gl_material *mat = &ctx->Light.Material[0]; + COPY_4FV( mat->Emission, src[0].Emission ); + } + if (bitmask & BACK_EMISSION_BIT) { + struct gl_material *mat = &ctx->Light.Material[1]; + COPY_4FV( mat->Emission, src[1].Emission ); + } + + /* update material ambience */ if (bitmask & FRONT_AMBIENT_BIT) { struct gl_material *mat = &ctx->Light.Material[0]; - SUB_3V( tmp, src[0].Ambient, mat->Ambient ); - ACC_SCALE_3V( ctx->Light.BaseColor[0], ctx->Light.Model.Ambient, tmp); + COPY_4FV( mat->Ambient, src[0].Ambient ); foreach (light, list) { - ACC_SCALE_3V( ctx->Light.BaseColor[0], light->Ambient, tmp ); + SCALE_3V( light->MatAmbient[0], light->Ambient, src[0].Ambient); } - COPY_4FV( mat->Ambient, src[0].Ambient ); } if (bitmask & BACK_AMBIENT_BIT) { struct gl_material *mat = &ctx->Light.Material[1]; - SUB_3V( tmp, src[1].Ambient, mat->Ambient ); - ACC_SCALE_3V( ctx->Light.BaseColor[1], ctx->Light.Model.Ambient, tmp); + COPY_4FV( mat->Ambient, src[1].Ambient ); foreach (light, list) { - ACC_SCALE_3V( ctx->Light.BaseColor[0], light->Ambient, tmp ); + SCALE_3V( light->MatAmbient[1], light->Ambient, src[1].Ambient); } - COPY_4FV( mat->Ambient, src[1].Ambient ); } + + /* update BaseColor = emission + scene's ambience * material's ambience */ + if (bitmask & (FRONT_EMISSION_BIT | FRONT_AMBIENT_BIT)) { + struct gl_material *mat = &ctx->Light.Material[0]; + COPY_3V( ctx->Light.BaseColor[0], mat->Emission ); + ACC_SCALE_3V( ctx->Light.BaseColor[0], mat->Ambient, ctx->Light.Model.Ambient ); + } + if (bitmask & (BACK_EMISSION_BIT | BACK_AMBIENT_BIT)) { + struct gl_material *mat = &ctx->Light.Material[1]; + COPY_3V( ctx->Light.BaseColor[1], mat->Emission ); + ACC_SCALE_3V( ctx->Light.BaseColor[1], mat->Ambient, ctx->Light.Model.Ambient ); + } + + /* update material diffuse values */ if (bitmask & FRONT_DIFFUSE_BIT) { struct gl_material *mat = &ctx->Light.Material[0]; + GLfloat tmp[4]; SUB_3V( tmp, src[0].Diffuse, mat->Diffuse ); foreach (light, list) { ACC_SCALE_3V( light->MatDiffuse[0], light->Diffuse, tmp ); @@ -573,6 +593,7 @@ } if (bitmask & BACK_DIFFUSE_BIT) { struct gl_material *mat = &ctx->Light.Material[1]; + GLfloat tmp[4]; SUB_3V( tmp, src[1].Diffuse, mat->Diffuse ); foreach (light, list) { ACC_SCALE_3V( light->MatDiffuse[1], light->Diffuse, tmp ); @@ -580,8 +601,11 @@ COPY_4FV( mat->Diffuse, src[1].Diffuse ); FLOAT_COLOR_TO_UBYTE_COLOR(ctx->Light.BaseAlpha[1], mat->Diffuse[3]); } + + /* update material specular values */ if (bitmask & FRONT_SPECULAR_BIT) { struct gl_material *mat = &ctx->Light.Material[0]; + GLfloat tmp[4]; SUB_3V( tmp, src[0].Specular, mat->Specular ); foreach (light, list) { if (light->Flags & LIGHT_SPECULAR) { @@ -594,6 +618,7 @@ } if (bitmask & BACK_SPECULAR_BIT) { struct gl_material *mat = &ctx->Light.Material[1]; + GLfloat tmp[4]; SUB_3V( tmp, src[1].Specular, mat->Specular ); foreach (light, list) { if (light->Flags & LIGHT_SPECULAR) { @@ -604,18 +629,7 @@ } COPY_4FV( mat->Specular, src[1].Specular ); } - if (bitmask & FRONT_EMISSION_BIT) { - struct gl_material *mat = &ctx->Light.Material[0]; - SUB_3V( tmp, src[0].Emission, mat->Emission ); - ACC_3V( ctx->Light.BaseColor[0], tmp ); - COPY_4FV( mat->Emission, src[0].Emission ); - } - if (bitmask & BACK_EMISSION_BIT) { - struct gl_material *mat = &ctx->Light.Material[1]; - SUB_3V( tmp, src[1].Emission, mat->Emission ); - ACC_3V( ctx->Light.BaseColor[1], tmp ); - COPY_4FV( mat->Emission, src[1].Emission ); - } + if (bitmask & FRONT_SHININESS_BIT) { GLfloat shininess = ctx->Light.Material[0].Shininess = src[0].Shininess; gl_compute_shine_table( ctx, 0, shininess ); @@ -626,6 +640,7 @@ gl_compute_shine_table( ctx, 1, shininess ); gl_compute_shine_table( ctx, 3, shininess * .5 ); } + if (bitmask & FRONT_INDEXES_BIT) { ctx->Light.Material[0].AmbientIndex = src[0].AmbientIndex; ctx->Light.Material[0].DiffuseIndex = src[0].DiffuseIndex; @@ -661,44 +676,69 @@ - - +/* + * Update the current materials from the given rgba color + * according to the bitmask in ColorMaterialBitmask, which is + * set by glColorMaterial(). + */ void gl_update_color_material( GLcontext *ctx, const GLubyte rgba[4] ) { struct gl_light *light, *list = &ctx->Light.EnabledList; GLuint bitmask = ctx->Light.ColorMaterialBitmask; - GLfloat tmp[4], color[4]; + GLfloat color[4]; UBYTE_RGBA_TO_FLOAT_RGBA( color, rgba ); if (MESA_VERBOSE&VERBOSE_IMMEDIATE) - fprintf(stderr, "gl_update_color_material, mask %x\n", bitmask); + fprintf(stderr, "gl_update_color_material, mask 0x%x\n", bitmask); + /* update emissive colors */ + if (bitmask & FRONT_EMISSION_BIT) { + struct gl_material *mat = &ctx->Light.Material[0]; + COPY_4FV( mat->Emission, color ); + } + + if (bitmask & BACK_EMISSION_BIT) { + struct gl_material *mat = &ctx->Light.Material[1]; + COPY_4FV( mat->Emission, color ); + } + /* update light->MatAmbient = light's ambient * material's ambient */ if (bitmask & FRONT_AMBIENT_BIT) { struct gl_material *mat = &ctx->Light.Material[0]; - SUB_3V( tmp, color, mat->Ambient ); - ACC_SCALE_3V( ctx->Light.BaseColor[0], ctx->Light.Model.Ambient, tmp); foreach (light, list) { - ACC_SCALE_3V( ctx->Light.BaseColor[0], light->Ambient, tmp ); + SCALE_3V( light->MatAmbient[0], light->Ambient, color); } COPY_4FV( mat->Ambient, color ); } if (bitmask & BACK_AMBIENT_BIT) { struct gl_material *mat = &ctx->Light.Material[1]; - SUB_3V( tmp, color, mat->Ambient ); - ACC_SCALE_3V( ctx->Light.BaseColor[1], ctx->Light.Model.Ambient, tmp); foreach (light, list) { - ACC_SCALE_3V( ctx->Light.BaseColor[0], light->Ambient, tmp ); + SCALE_3V( light->MatAmbient[1], light->Ambient, color); } COPY_4FV( mat->Ambient, color ); } + /* update BaseColor = emission + scene's ambience * material's ambience */ + if (bitmask & (FRONT_EMISSION_BIT | FRONT_AMBIENT_BIT)) { + struct gl_material *mat = &ctx->Light.Material[0]; + COPY_3V( ctx->Light.BaseColor[0], mat->Emission ); + ACC_SCALE_3V( ctx->Light.BaseColor[0], mat->Ambient, ctx->Light.Model.Ambient ); + } + + if (bitmask & (BACK_EMISSION_BIT | BACK_AMBIENT_BIT)) { + struct gl_material *mat = &ctx->Light.Material[1]; + COPY_3V( ctx->Light.BaseColor[1], mat->Emission ); + ACC_SCALE_3V( ctx->Light.BaseColor[1], mat->Ambient, ctx->Light.Model.Ambient ); + } + + /* update light->MatDiffuse = light's diffuse * material's diffuse */ if (bitmask & FRONT_DIFFUSE_BIT) { struct gl_material *mat = &ctx->Light.Material[0]; + GLfloat tmp[4]; SUB_3V( tmp, color, mat->Diffuse ); foreach (light, list) { ACC_SCALE_3V( light->MatDiffuse[0], light->Diffuse, tmp ); @@ -709,6 +749,7 @@ if (bitmask & BACK_DIFFUSE_BIT) { struct gl_material *mat = &ctx->Light.Material[1]; + GLfloat tmp[4]; SUB_3V( tmp, color, mat->Diffuse ); foreach (light, list) { ACC_SCALE_3V( light->MatDiffuse[1], light->Diffuse, tmp ); @@ -717,8 +758,10 @@ FLOAT_COLOR_TO_UBYTE_COLOR(ctx->Light.BaseAlpha[1], mat->Diffuse[3]); } + /* update light->MatSpecular = light's specular * material's specular */ if (bitmask & FRONT_SPECULAR_BIT) { struct gl_material *mat = &ctx->Light.Material[0]; + GLfloat tmp[4]; SUB_3V( tmp, color, mat->Specular ); foreach (light, list) { if (light->Flags & LIGHT_SPECULAR) { @@ -729,8 +772,10 @@ } COPY_4FV( mat->Specular, color ); } + if (bitmask & BACK_SPECULAR_BIT) { struct gl_material *mat = &ctx->Light.Material[1]; + GLfloat tmp[4]; SUB_3V( tmp, color, mat->Specular ); foreach (light, list) { if (light->Flags & LIGHT_SPECULAR) { @@ -741,18 +786,6 @@ } COPY_4FV( mat->Specular, color ); } - if (bitmask & FRONT_EMISSION_BIT) { - struct gl_material *mat = &ctx->Light.Material[0]; - SUB_3V( tmp, color, mat->Emission ); - ACC_3V( ctx->Light.BaseColor[0], tmp ); - COPY_4FV( mat->Emission, color ); - } - if (bitmask & BACK_EMISSION_BIT) { - struct gl_material *mat = &ctx->Light.Material[1]; - SUB_3V( tmp, color, mat->Emission ); - ACC_3V( ctx->Light.BaseColor[1], tmp ); - COPY_4FV( mat->Emission, color ); - } if (0) { @@ -1085,26 +1118,27 @@ * Whenever the spotlight exponent for a light changes we must call * this function to recompute the exponent lookup table. */ -void gl_compute_spot_exp_table( struct gl_light *l ) +void +gl_compute_spot_exp_table( struct gl_light *l ) { - int i; - double exponent = l->SpotExponent; - double tmp = 0; - int clamp = 0; + GLint i; + GLdouble exponent = l->SpotExponent; + GLdouble tmp = 0; + GLint clamp = 0; l->SpotExpTable[0][0] = 0.0; - for (i=EXP_TABLE_SIZE-1;i>0;i--) { + for (i = EXP_TABLE_SIZE - 1; i > 0 ;i--) { if (clamp == 0) { - tmp = pow(i/(double)(EXP_TABLE_SIZE-1), exponent); - if (tmp < FLT_MIN*100.0) { + tmp = pow(i / (GLdouble) (EXP_TABLE_SIZE - 1), exponent); + if (tmp < FLT_MIN * 100.0) { tmp = 0.0; clamp = 1; } } l->SpotExpTable[i][0] = tmp; } - for (i=0;iSpotExpTable[i][1] = l->SpotExpTable[i+1][0] - l->SpotExpTable[i][0]; } l->SpotExpTable[EXP_TABLE_SIZE-1][1] = 0.0; @@ -1117,30 +1151,36 @@ * lighting, and the cost of doing it early may be partially offset * by keeping a MRU cache of shine tables for various shine values. */ -static void compute_shine_table( struct gl_shine_tab *tab, GLfloat shininess ) +static void +compute_shine_table( struct gl_shine_tab *tab, GLfloat shininess ) { - int i; + GLint i; GLfloat *m = tab->tab; - m[0] = 0; - if (shininess == 0) { + m[0] = 0.0; + if (shininess == 0.0) { for (i = 1 ; i <= SHINE_TABLE_SIZE ; i++) - m[i] = 1; - } else { - for (i = 1 ; i <= SHINE_TABLE_SIZE ; i++) { - double t = pow( i/(GLfloat)SHINE_TABLE_SIZE, shininess ); - m[i] = 0; - if (t > 1e-20) m[i] = t; + m[i] = 1.0; + } + else { + for (i = 1 ; i < SHINE_TABLE_SIZE ; i++) { + GLdouble t = pow(i / (GLfloat) (SHINE_TABLE_SIZE - 1), shininess); + if (t > 1e-20) + m[i] = t; + else + m[i] = 0.0; } + m[SHINE_TABLE_SIZE] = 1.0; } tab->shininess = shininess; } -#define DISTSQR(a,b) ((a-b)*(a-b)) -void gl_compute_shine_table( GLcontext *ctx, GLuint i, GLfloat shininess ) +void +gl_compute_shine_table( GLcontext *ctx, GLuint i, GLfloat shininess ) { +#define DISTSQR(a,b) ((a-b)*(a-b)) struct gl_shine_tab *list = ctx->ShineTabList; struct gl_shine_tab *s; @@ -1148,10 +1188,10 @@ if ( DISTSQR(s->shininess, shininess) < 1e-4 ) break; - if (s == list) - { + if (s == list) { foreach(s, list) - if (s->refcount == 0) break; + if (s->refcount == 0) + break; compute_shine_table( s, shininess ); } @@ -1160,12 +1200,14 @@ ctx->ShineTable[i] = s; move_to_tail( list, s ); s->refcount++; +#undef DISTSQR } #if 0 -static void gl_reinit_light_attrib( GLcontext *ctx, struct gl_light_attrib *l ) +static void +gl_reinit_light_attrib( GLcontext *ctx, struct gl_light_attrib *l ) { GLuint i; @@ -1194,7 +1236,8 @@ * Also, precompute some lighting values such as the products of light * source and material ambient, diffuse and specular coefficients. */ -void gl_update_lighting( GLcontext *ctx ) +void +gl_update_lighting( GLcontext *ctx ) { struct gl_light *light; @@ -1224,13 +1267,12 @@ /* Precompute some shading values. */ - if (ctx->Visual->RGBAflag) - { + if (ctx->Visual->RGBAflag) { GLuint sides = ((ctx->TriangleCaps & DD_TRI_LIGHT_TWOSIDE) ? 2 : 1); GLuint side; for (side=0; side < sides; side++) { struct gl_material *mat = &ctx->Light.Material[side]; - + COPY_3V(ctx->Light.BaseColor[side], mat->Emission); ACC_SCALE_3V(ctx->Light.BaseColor[side], ctx->Light.Model.Ambient, @@ -1242,12 +1284,10 @@ foreach (light, &ctx->Light.EnabledList) { for (side=0; side< sides; side++) { - struct gl_material *mat = &ctx->Light.Material[side]; - SCALE_3V( light->MatDiffuse[side], light->Diffuse, mat->Diffuse ); - SCALE_3V( light->MatAmbient[side], light->Ambient, mat->Ambient ); - ACC_3V( ctx->Light.BaseColor[side], light->MatAmbient[side] ); - if (light->Flags & LIGHT_SPECULAR) - { + const struct gl_material *mat = &ctx->Light.Material[side]; + SCALE_3V( light->MatDiffuse[side], light->Diffuse, mat->Diffuse ); + SCALE_3V( light->MatAmbient[side], light->Ambient, mat->Ambient ); + if (light->Flags & LIGHT_SPECULAR) { SCALE_3V( light->MatSpecular[side], light->Specular, mat->Specular); light->IsMatSpecular[side] = @@ -1258,10 +1298,8 @@ } } } - else - { - static GLfloat ci[3] = { .30, .59, .11 }; - + else { + static const GLfloat ci[3] = { .30, .59, .11 }; foreach(light, &ctx->Light.EnabledList) { light->dli = DOT3(ci, light->Diffuse); light->sli = DOT3(ci, light->Specular); @@ -1269,52 +1307,54 @@ } } + + /* Need to seriously restrict the circumstances under which these * calc's are performed. */ -void gl_compute_light_positions( GLcontext *ctx ) +void +gl_compute_light_positions( GLcontext *ctx ) { struct gl_light *light; - if (ctx->Light.NeedVertices && !ctx->Light.Model.LocalViewer) { - GLfloat eye_z[3] = { 0, 0, 1 }; - if (!ctx->NeedEyeCoords) { - TRANSFORM_NORMAL( ctx->EyeZDir, eye_z, ctx->ModelView.m ); - } else { + if (1 /*ctx->Light.NeedVertices && !ctx->Light.Model.LocalViewer*/) { + static const GLfloat eye_z[3] = { 0, 0, 1 }; + if (ctx->NeedEyeCoords) { COPY_3V( ctx->EyeZDir, eye_z ); } + else { + TRANSFORM_NORMAL( ctx->EyeZDir, eye_z, ctx->ModelView.m ); + } } foreach (light, &ctx->Light.EnabledList) { - if (!ctx->NeedEyeCoords) { + if (ctx->NeedEyeCoords) { + COPY_4FV( light->Position, light->EyePosition ); + } + else { TRANSFORM_POINT( light->Position, ctx->ModelView.inv, light->EyePosition ); - } else { - COPY_4FV( light->Position, light->EyePosition ); } - if (!(light->Flags & LIGHT_POSITIONAL)) - { + if (!(light->Flags & LIGHT_POSITIONAL)) { /* VP (VP) = Normalize( Position ) */ COPY_3V( light->VP_inf_norm, light->Position ); NORMALIZE_3FV( light->VP_inf_norm ); - if (!ctx->Light.Model.LocalViewer) - { + if (!ctx->Light.Model.LocalViewer) { /* h_inf_norm = Normalize( V_to_P + <0,0,1> ) */ ADD_3V( light->h_inf_norm, light->VP_inf_norm, ctx->EyeZDir); NORMALIZE_3FV( light->h_inf_norm ); } - light->VP_inf_spot_attenuation = 1.0; } - if (light->Flags & LIGHT_SPOT) - { + if (light->Flags & LIGHT_SPOT) { if (ctx->NeedEyeNormals) { COPY_3V( light->NormDirection, light->EyeDirection ); - } else { + } + else { TRANSFORM_NORMAL( light->NormDirection, light->EyeDirection, ctx->ModelView.m); @@ -1336,18 +1376,17 @@ (light->SpotExpTable[k][0] + (x-k)*light->SpotExpTable[k][1]); } - else + else { light->VP_inf_spot_attenuation = 0; + } } } } } - - - -void gl_update_normal_transform( GLcontext *ctx ) +void +gl_update_normal_transform( GLcontext *ctx ) { GLuint new_flag = 0; normal_func *last = ctx->NormalTransform; @@ -1368,20 +1407,18 @@ new_flag = ctx->NewState & NEW_MODELVIEW; ctx->vb_rescale_factor = ctx->rescale_factor; - if (ctx->Transform.Normalize) - { + if (ctx->Transform.Normalize) { ctx->NormalTransform = gl_normal_tab[transform | NORM_NORMALIZE]; } else if (ctx->Transform.RescaleNormals && - ctx->rescale_factor != 1.0) - { + ctx->rescale_factor != 1.0) { ctx->NormalTransform = gl_normal_tab[transform | NORM_RESCALE]; } - else - { + else { ctx->NormalTransform = gl_normal_tab[transform]; } - } else { + } + else { ctx->NormalTransform = 0; } } @@ -1389,20 +1426,18 @@ if (ctx->NeedNormals) { ctx->vb_rescale_factor = 1.0/ctx->rescale_factor; - if (ctx->Transform.Normalize) - { + if (ctx->Transform.Normalize) { ctx->NormalTransform = gl_normal_tab[NORM_NORMALIZE]; } else if (!ctx->Transform.RescaleNormals && - ctx->rescale_factor != 1.0) - { + ctx->rescale_factor != 1.0) { ctx->NormalTransform = gl_normal_tab[NORM_RESCALE]; } - else - { + else { ctx->NormalTransform = 0; } - } else { + } + else { ctx->NormalTransform = 0; } } @@ -1410,4 +1445,3 @@ if (last != ctx->NormalTransform || new_flag) ctx->NewState |= NEW_NORMAL_TRANSFORM; } - Index: xc/extras/Mesa/src/light.h diff -u xc/extras/Mesa/src/light.h:1.3 xc/extras/Mesa/src/light.h:1.6 --- xc/extras/Mesa/src/light.h:1.3 Tue Feb 15 02:12:21 2000 +++ xc/extras/Mesa/src/light.h Mon Nov 13 18:30:49 2000 @@ -3,7 +3,7 @@ * Mesa 3-D graphics library * Version: 3.3 * - * Copyright (C) 1999 Brian Paul All Rights Reserved. + * Copyright (C) 1999-2000 Brian Paul All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), @@ -114,7 +114,7 @@ extern void gl_update_normal_transform( GLcontext *ctx ); extern void gl_update_material( GLcontext *ctx, - struct gl_material *m, + const struct gl_material src[2], GLuint bitmask ); extern void gl_update_color_material( GLcontext *ctx, const GLubyte rgba[4] ); Index: xc/extras/Mesa/src/lines.c diff -u xc/extras/Mesa/src/lines.c:1.4 xc/extras/Mesa/src/lines.c:1.7 --- xc/extras/Mesa/src/lines.c:1.4 Fri Jun 16 20:02:13 2000 +++ xc/extras/Mesa/src/lines.c Mon Nov 13 18:30:49 2000 @@ -556,13 +556,8 @@ static void general_flat_rgba_line( GLcontext *ctx, GLuint vert0, GLuint vert1, GLuint pvert ) { - GLint count; - GLint *pbx = ctx->PB->x; - GLint *pby = ctx->PB->y; - GLdepth *pbz = ctx->PB->z; - GLubyte *color = ctx->VB->ColorPtr->data[pvert]; + const GLubyte *color = ctx->VB->ColorPtr->data[pvert]; PB_SET_COLOR( ctx->PB, color[0], color[1], color[2], color[3] ); - count = ctx->PB->count; if (ctx->Line.StippleFlag) { /* stippled */ @@ -570,12 +565,7 @@ #define INTERP_Z 1 #define WIDE 1 #define STIPPLE 1 -#define PLOT(X,Y) \ - pbx[count] = X; \ - pby[count] = Y; \ - pbz[count] = Z; \ - count++; \ - CHECK_FULL(count); +#define PLOT(X,Y) PB_WRITE_PIXEL(ctx->PB, X, Y, Z); #include "linetemp.h" } else { @@ -584,18 +574,10 @@ /* special case: unstippled and width=2 */ #define INTERP_XY 1 #define INTERP_Z 1 -#define XMAJOR_PLOT(X,Y) \ - pbx[count] = X; pbx[count+1] = X; \ - pby[count] = Y; pby[count+1] = Y+1; \ - pbz[count] = Z; pbz[count+1] = Z; \ - count += 2; \ - CHECK_FULL(count); -#define YMAJOR_PLOT(X,Y) \ - pbx[count] = X; pbx[count+1] = X+1; \ - pby[count] = Y; pby[count+1] = Y; \ - pbz[count] = Z; pbz[count+1] = Z; \ - count += 2; \ - CHECK_FULL(count); +#define XMAJOR_PLOT(X,Y) PB_WRITE_PIXEL(ctx->PB, X, Y, Z); \ + PB_WRITE_PIXEL(ctx->PB, X, Y+1, Z); +#define YMAJOR_PLOT(X,Y) PB_WRITE_PIXEL(ctx->PB, X, Y, Z); \ + PB_WRITE_PIXEL(ctx->PB, X+1, Y, Z); #include "linetemp.h" } else { @@ -603,17 +585,11 @@ #define INTERP_XY 1 #define INTERP_Z 1 #define WIDE 1 -#define PLOT(X,Y) \ - pbx[count] = X; \ - pby[count] = Y; \ - pbz[count] = Z; \ - count++; \ - CHECK_FULL(count); +#define PLOT(X,Y) PB_WRITE_PIXEL(ctx->PB, X, Y, Z); #include "linetemp.h" } } - ctx->PB->count = count; gl_flush_pb(ctx); } @@ -847,6 +823,104 @@ } +/* Flat-shaded, multitextured, any width, maybe stippled, separate specular + * color interpolation. + */ +static void flat_multitextured_line( GLcontext *ctx, + GLuint vert0, GLuint vert1, GLuint pvert ) +{ + GLint count = ctx->PB->count; + GLint *pbx = ctx->PB->x; + GLint *pby = ctx->PB->y; + GLdepth *pbz = ctx->PB->z; + GLfloat *pbs = ctx->PB->s[0]; + GLfloat *pbt = ctx->PB->t[0]; + GLfloat *pbu = ctx->PB->u[0]; + GLfloat *pbs1 = ctx->PB->s[1]; + GLfloat *pbt1 = ctx->PB->t[1]; + GLfloat *pbu1 = ctx->PB->u[1]; + GLubyte (*pbrgba)[4] = ctx->PB->rgba; + GLubyte (*pbspec)[3] = ctx->PB->spec; + GLubyte *color = ctx->VB->ColorPtr->data[pvert]; + GLubyte sRed = ctx->VB->Specular ? ctx->VB->Specular[pvert][0] : 0; + GLubyte sGreen = ctx->VB->Specular ? ctx->VB->Specular[pvert][1] : 0; + GLubyte sBlue = ctx->VB->Specular ? ctx->VB->Specular[pvert][2] : 0; + + (void) pvert; + + ctx->PB->mono = GL_FALSE; + + if (ctx->Line.StippleFlag) { + /* stippled */ +#define INTERP_XY 1 +#define INTERP_Z 1 +#define INTERP_ALPHA 1 +#define INTERP_STUV0 1 +#define INTERP_STUV1 1 +#define WIDE 1 +#define STIPPLE 1 +#define PLOT(X,Y) \ + { \ + pbx[count] = X; \ + pby[count] = Y; \ + pbz[count] = Z; \ + pbs[count] = s; \ + pbt[count] = t; \ + pbu[count] = u; \ + pbs1[count] = s1; \ + pbt1[count] = t1; \ + pbu1[count] = u1; \ + pbrgba[count][RCOMP] = color[0]; \ + pbrgba[count][GCOMP] = color[1]; \ + pbrgba[count][BCOMP] = color[2]; \ + pbrgba[count][ACOMP] = color[3]; \ + pbspec[count][RCOMP] = sRed; \ + pbspec[count][GCOMP] = sGreen; \ + pbspec[count][BCOMP] = sBlue; \ + count++; \ + CHECK_FULL(count); \ + } +#include "linetemp.h" + } + else { + /* unstippled */ +#define INTERP_XY 1 +#define INTERP_Z 1 +#define INTERP_ALPHA 1 +#define INTERP_STUV0 1 +#define INTERP_STUV1 1 +#define WIDE 1 +#define PLOT(X,Y) \ + { \ + pbx[count] = X; \ + pby[count] = Y; \ + pbz[count] = Z; \ + pbs[count] = s; \ + pbt[count] = t; \ + pbu[count] = u; \ + pbs1[count] = s1; \ + pbt1[count] = t1; \ + pbu1[count] = u1; \ + pbrgba[count][RCOMP] = color[0]; \ + pbrgba[count][GCOMP] = color[1]; \ + pbrgba[count][BCOMP] = color[2]; \ + pbrgba[count][ACOMP] = color[3]; \ + pbspec[count][RCOMP] = sRed; \ + pbspec[count][GCOMP] = sGreen; \ + pbspec[count][BCOMP] = sBlue; \ + count++; \ + CHECK_FULL(count); \ + } +#include "linetemp.h" + } + + ctx->PB->count = count; + gl_flush_pb(ctx); +} + + + + /* * Antialiased RGBA line * @@ -934,6 +1008,61 @@ } + +#ifdef DEBUG +void +_mesa_print_line_function(GLcontext *ctx) +{ + printf("Line Func == "); + if (ctx->Driver.LineFunc == flat_ci_line) + printf("flat_ci_line\n"); + else if (ctx->Driver.LineFunc == flat_ci_z_line) + printf("flat_ci_z_line\n"); + else if (ctx->Driver.LineFunc == flat_rgba_line) + printf("flat_rgba_line\n"); + else if (ctx->Driver.LineFunc == flat_rgba_z_line) + printf("flat_rgba_z_line\n"); + else if (ctx->Driver.LineFunc == smooth_ci_line) + printf("smooth_ci_line\n"); + else if (ctx->Driver.LineFunc == smooth_ci_z_line) + printf("smooth_ci_z_line\n"); + else if (ctx->Driver.LineFunc == smooth_rgba_line) + printf("smooth_rgba_line\n"); + else if (ctx->Driver.LineFunc == smooth_rgba_z_line) + printf("smooth_rgba_z_line\n"); + else if (ctx->Driver.LineFunc == general_smooth_ci_line) + printf("general_smooth_ci_line\n"); + else if (ctx->Driver.LineFunc == general_flat_ci_line) + printf("general_flat_ci_line\n"); + else if (ctx->Driver.LineFunc == general_smooth_rgba_line) + printf("general_smooth_rgba_line\n"); + else if (ctx->Driver.LineFunc == general_flat_rgba_line) + printf("general_flat_rgba_line\n"); + else if (ctx->Driver.LineFunc == flat_textured_line) + printf("flat_textured_line\n"); + else if (ctx->Driver.LineFunc == smooth_textured_line) + printf("smooth_textured_line\n"); + else if (ctx->Driver.LineFunc == smooth_multitextured_line) + printf("smooth_multitextured_line\n"); + else if (ctx->Driver.LineFunc == flat_multitextured_line) + printf("flat_multitextured_line\n"); + else if (ctx->Driver.LineFunc == aa_rgba_line) + printf("aa_rgba_line\n"); + else if (ctx->Driver.LineFunc == aa_tex_rgba_line) + printf("aa_tex_rgba_line\n"); + else if (ctx->Driver.LineFunc == aa_multitex_rgba_line) + printf("aa_multitex_rgba_line\n"); + else if (ctx->Driver.LineFunc == aa_ci_line) + printf("aa_ci_line\n"); + else if (ctx->Driver.LineFunc == null_line) + printf("null_line\n"); + else + printf("Driver func %p\n", ctx->Driver.LineFunc); +} +#endif + + + /* * Determine which line drawing function to use given the current * rendering context. @@ -975,7 +1104,10 @@ if (ctx->Texture.ReallyEnabled >= TEXTURE1_1D || ctx->Light.Model.ColorControl==GL_SEPARATE_SPECULAR_COLOR) { /* multi-texture and/or separate specular color */ - ctx->Driver.LineFunc = smooth_multitextured_line; + if (ctx->Light.ShadeModel==GL_SMOOTH) + ctx->Driver.LineFunc = smooth_multitextured_line; + else + ctx->Driver.LineFunc = flat_multitextured_line; } else { if (ctx->Light.ShadeModel==GL_SMOOTH) { @@ -1041,5 +1173,6 @@ /* GL_SELECT mode */ ctx->Driver.LineFunc = gl_select_line; } -} + /*_mesa_print_line_function(ctx);*/ +} Index: xc/extras/Mesa/src/linetemp.h diff -u xc/extras/Mesa/src/linetemp.h:1.8 xc/extras/Mesa/src/linetemp.h:1.10 --- xc/extras/Mesa/src/linetemp.h:1.8 Fri Jun 16 20:02:13 2000 +++ xc/extras/Mesa/src/linetemp.h Mon Nov 13 18:30:49 2000 @@ -22,8 +22,8 @@ * 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. */ -/* $XFree86: xc/extras/Mesa/src/linetemp.h,v 1.8 2000/06/17 00:02:13 martin Exp $ */ + /* * Line Rasterizer Template * @@ -223,12 +223,12 @@ zPtr = (DEPTH_TYPE *) _mesa_zbuffer_address(ctx, x0, y0); # endif if (depthBits <= 16) { - z0 = FloatToFixed(VB->Win.data[vert0][2]); - z1 = FloatToFixed(VB->Win.data[vert1][2]); + z0 = FloatToFixed(VB->Win.data[vert0][2] + ctx->LineZoffset); + z1 = FloatToFixed(VB->Win.data[vert1][2] + ctx->LineZoffset); } else { - z0 = (int) VB->Win.data[vert0][2]; - z1 = (int) VB->Win.data[vert1][2]; + z0 = (GLint) (VB->Win.data[vert0][2] + ctx->LineZoffset); + z1 = (GLint) (VB->Win.data[vert1][2] + ctx->LineZoffset); } #endif #ifdef PIXEL_ADDRESS Index: xc/extras/Mesa/src/lnaatemp.h diff -u xc/extras/Mesa/src/lnaatemp.h:1.10 xc/extras/Mesa/src/lnaatemp.h:1.12 --- xc/extras/Mesa/src/lnaatemp.h:1.10 Wed Jun 21 16:18:13 2000 +++ xc/extras/Mesa/src/lnaatemp.h Mon Nov 13 18:30:49 2000 @@ -1,9 +1,9 @@ /* * Mesa 3-D graphics library - * Version: 3.1 + * Version: 3.3 * - * Copyright (C) 1999 Brian Paul All Rights Reserved. + * Copyright (C) 1999-2000 Brian Paul All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), @@ -22,7 +22,6 @@ * 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. */ -/* $XFree86: xc/extras/Mesa/src/lnaatemp.h,v 1.10 2000/06/21 20:18:13 tsi Exp $ */ /* * Antialiased Line Rasterizer Template @@ -103,12 +102,12 @@ ctx->PB->mono = GL_FALSE; if (depthBits <= 16) { - z0 = FloatToFixed(VB->Win.data[vert0][2]); - z1 = FloatToFixed(VB->Win.data[vert1][2]); + z0 = FloatToFixed(VB->Win.data[vert0][2] + ctx->LineZoffset); + z1 = FloatToFixed(VB->Win.data[vert1][2] + ctx->LineZoffset); } else { - z0 = (int) VB->Win.data[vert0][2]; - z1 = (int) VB->Win.data[vert1][2]; + z0 = (GLint) (VB->Win.data[vert0][2] + ctx->LineZoffset); + z1 = (GLint) (VB->Win.data[vert1][2] + ctx->LineZoffset); } #ifdef INTERP_STUV0 Index: xc/extras/Mesa/src/logic.c diff -u xc/extras/Mesa/src/logic.c:1.4 xc/extras/Mesa/src/logic.c:1.7 --- xc/extras/Mesa/src/logic.c:1.4 Fri Jun 16 20:02:13 2000 +++ xc/extras/Mesa/src/logic.c Mon Nov 13 18:30:50 2000 @@ -63,7 +63,7 @@ case GL_OR_INVERTED: ctx->Color.LogicOp = opcode; ctx->NewState |= NEW_RASTER_OPS; - return; + break; default: gl_error( ctx, GL_INVALID_ENUM, "glLogicOp" ); return; Index: xc/extras/Mesa/src/matrix.c diff -u xc/extras/Mesa/src/matrix.c:1.5 xc/extras/Mesa/src/matrix.c:1.8 --- xc/extras/Mesa/src/matrix.c:1.5 Fri Jun 16 20:02:13 2000 +++ xc/extras/Mesa/src/matrix.c Mon Nov 13 18:30:50 2000 @@ -1,7 +1,7 @@ /* * Mesa 3-D graphics library - * Version: 3.3 + * Version: 3.4 * * Copyright (C) 1999-2000 Brian Paul All Rights Reserved. * @@ -596,7 +596,7 @@ mag = GL_SQRT( x*x + y*y + z*z ); - if (mag == 0.0) { + if (mag <= 1.0e-4) { /* generate an identity matrix and return */ MEMCPY(m, Identity, sizeof(GLfloat)*16); return; @@ -763,18 +763,16 @@ /* Do the real work */ - if (mask == MASK_IDENTITY) { + if (mask == (GLuint) MASK_IDENTITY) { mat->type = MATRIX_IDENTITY; } - else if ((mask & MASK_2D_NO_ROT) == MASK_2D_NO_ROT) - { + else if ((mask & MASK_2D_NO_ROT) == (GLuint) MASK_2D_NO_ROT) { mat->type = MATRIX_2D_NO_ROT; if ((mask & MASK_NO_2D_SCALE) != MASK_NO_2D_SCALE) mat->flags = MAT_FLAG_GENERAL_SCALE; } - else if ((mask & MASK_2D) == MASK_2D) - { + else if ((mask & MASK_2D) == (GLuint) MASK_2D) { GLfloat mm = DOT2(m, m); GLfloat m4m4 = DOT2(m+4,m+4); GLfloat mm4 = DOT2(m,m+4); @@ -793,8 +791,7 @@ mat->flags |= MAT_FLAG_ROTATION; } - else if ((mask & MASK_3D_NO_ROT) == MASK_3D_NO_ROT) - { + else if ((mask & MASK_3D_NO_ROT) == (GLuint) MASK_3D_NO_ROT) { mat->type = MATRIX_3D_NO_ROT; /* Check for scale */ @@ -805,8 +802,7 @@ } else mat->flags |= MAT_FLAG_GENERAL_SCALE; } - else if ((mask & MASK_3D) == MASK_3D) - { + else if ((mask & MASK_3D) == (GLuint) MASK_3D) { GLfloat c1 = DOT3(m,m); GLfloat c2 = DOT3(m+4,m+4); GLfloat c3 = DOT3(m+8,m+8); @@ -1561,16 +1557,23 @@ void gl_matrix_ctr( GLmatrix *m ) { + if ( m->m == 0 ) { + m->m = (GLfloat *) ALIGN_MALLOC( 16 * sizeof(GLfloat), 16 ); + } + MEMCPY( m->m, Identity, sizeof(Identity) ); m->inv = 0; - MEMCPY( m->m, Identity, sizeof(Identity)); m->type = MATRIX_IDENTITY; m->flags = MAT_DIRTY_DEPENDENTS; } void gl_matrix_dtr( GLmatrix *m ) { - if (m->inv != 0) { - FREE(m->inv); + if ( m->m != 0 ) { + ALIGN_FREE( m->m ); + m->m = 0; + } + if ( m->inv != 0 ) { + ALIGN_FREE( m->inv ); m->inv = 0; } } @@ -1578,7 +1581,7 @@ #if 0 void gl_matrix_set_identity( GLmatrix *m ) { - MEMCPY( m->m, Identity, sizeof(Identity)); + MEMCPY( m->m, Identity, sizeof(Identity) ); m->type = MATRIX_IDENTITY; m->flags = MAT_DIRTY_DEPENDENTS; } @@ -1586,15 +1589,15 @@ void gl_matrix_alloc_inv( GLmatrix *m ) { - if (m->inv == 0) { - m->inv = (GLfloat *)MALLOC(16*sizeof(GLfloat)); + if ( m->inv == 0 ) { + m->inv = (GLfloat *) ALIGN_MALLOC( 16 * sizeof(GLfloat), 16 ); MEMCPY( m->inv, Identity, 16 * sizeof(GLfloat) ); } } void gl_matrix_copy( GLmatrix *to, const GLmatrix *from ) { - MEMCPY( to->m, from->m, sizeof(Identity)); + MEMCPY( to->m, from->m, sizeof(Identity) ); to->flags = from->flags | MAT_DIRTY_DEPENDENTS; to->type = from->type; Index: xc/extras/Mesa/src/matrix.h diff -u xc/extras/Mesa/src/matrix.h:1.3 xc/extras/Mesa/src/matrix.h:1.6 --- xc/extras/Mesa/src/matrix.h:1.3 Tue Feb 15 02:12:27 2000 +++ xc/extras/Mesa/src/matrix.h Mon Nov 13 18:30:50 2000 @@ -33,8 +33,8 @@ typedef struct { - GLfloat m[16]; - GLfloat *inv; /* optional */ + GLfloat *m; /* 16-byte aligned */ + GLfloat *inv; /* optional, 16-byte aligned */ GLuint flags; GLuint type; } GLmatrix; Index: xc/extras/Mesa/src/mem.c diff -u xc/extras/Mesa/src/mem.c:1.2 xc/extras/Mesa/src/mem.c:1.5 --- xc/extras/Mesa/src/mem.c:1.2 Tue Feb 15 02:12:27 2000 +++ xc/extras/Mesa/src/mem.c Mon Nov 13 18:30:50 2000 @@ -36,6 +36,7 @@ #include "all.h" #else #include "glheader.h" +#include "macros.h" #include "mem.h" #endif @@ -71,3 +72,84 @@ } + +/* + * N-byte aligned memory allocation functions. Called via the ALIGN_MALLOC, + * ALIGN_CALLOC and ALIGN_FREE macros. Debug versions? + * These functions allow dynamically allocated memory to be correctly + * aligned for improved cache utilization and specialized assembly + * support. + */ + + +/* + * Allocate N-byte aligned memory (uninitialized) + */ +void * +_mesa_align_malloc(size_t bytes, unsigned long alignment) +{ + unsigned long ptr, buf; + + ASSERT( alignment > 0 ); + + ptr = (unsigned long) MALLOC( bytes + alignment ); + + buf = (ptr + alignment) & ~(unsigned long)(alignment - 1); + *(unsigned long *)(buf - sizeof(void *)) = ptr; + +#ifdef DEBUG + /* mark the non-aligned area */ + while ( ptr < buf - sizeof(void *) ) { + *(unsigned long *)ptr = 0xcdcdcdcd; + ptr += sizeof(unsigned long); + } +#endif + + return (void *)buf; +} + + +/* + * Allocate N-byte aligned memory and initialize to zero + */ +void * +_mesa_align_calloc(size_t bytes, unsigned long alignment) +{ + unsigned long ptr, buf; + + ASSERT( alignment > 0 ); + + ptr = (unsigned long) CALLOC( bytes + alignment ); + + buf = (ptr + alignment) & ~(unsigned long)(alignment - 1); + *(unsigned long *)(buf - sizeof(void *)) = ptr; + +#ifdef DEBUG + /* mark the non-aligned area */ + while ( ptr < buf - sizeof(void *) ) { + *(unsigned long *)ptr = 0xcdcdcdcd; + ptr += sizeof(unsigned long); + } +#endif + + return (void *)buf; +} + + +/* + * Free N-byte aligned memory + */ +void +_mesa_align_free(void *ptr) +{ +#if 0 + FREE( (void *)(*(unsigned long *)((unsigned long)ptr - sizeof(void *))) ); +#else + /* The actuall address to free is stuffed in the word immediately + * before the address the client sees. + */ + void **cubbyHole = (void **) ((char *) ptr - sizeof(void *)); + void *realAddr = *cubbyHole; + FREE(realAddr); +#endif +} Index: xc/extras/Mesa/src/mem.h diff -u xc/extras/Mesa/src/mem.h:1.3 xc/extras/Mesa/src/mem.h:1.6 --- xc/extras/Mesa/src/mem.h:1.3 Fri Jun 16 20:02:14 2000 +++ xc/extras/Mesa/src/mem.h Mon Nov 13 18:30:50 2000 @@ -38,7 +38,11 @@ extern void *_mesa_calloc(size_t bytes); extern void _mesa_free(void *ptr); +extern void *_mesa_align_malloc(size_t bytes, unsigned long alignment); +extern void *_mesa_align_calloc(size_t bytes, unsigned long alignment); +extern void _mesa_align_free(void *ptr); + #ifdef DEBUG /* call Mesa memory functions */ @@ -58,6 +62,13 @@ #define FREE(PTR) free(PTR) #endif + +/* call Mesa N-byte aligned memory functions */ +#define ALIGN_MALLOC(BYTES, N) (void *) _mesa_align_malloc(BYTES, N) +#define ALIGN_CALLOC(BYTES, N) (void *) _mesa_align_calloc(BYTES, N) +#define ALIGN_MALLOC_STRUCT(T, N) (struct T *) _mesa_align_malloc(sizeof(struct T), N) +#define ALIGN_CALLOC_STRUCT(T, N) (struct T *) _mesa_align_calloc(sizeof(struct T), N) +#define ALIGN_FREE(PTR) _mesa_align_free(PTR) /* Memory copy: */ Index: xc/extras/Mesa/src/mmath.h diff -u xc/extras/Mesa/src/mmath.h:1.5 xc/extras/Mesa/src/mmath.h:1.7 --- xc/extras/Mesa/src/mmath.h:1.5 Fri Jun 16 20:02:14 2000 +++ xc/extras/Mesa/src/mmath.h Sun Sep 24 09:50:14 2000 @@ -1,7 +1,7 @@ /* * Mesa 3-D graphics library - * Version: 3.3 + * Version: 3.4 * * Copyright (C) 1999-2000 Brian Paul All Rights Reserved. * @@ -22,7 +22,7 @@ * 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. */ -/* $XFree86: xc/extras/Mesa/src/mmath.h,v 1.5 2000/06/17 00:02:14 martin Exp $ */ +/* $XFree86: xc/extras/Mesa/src/mmath.h,v 1.7 2000/09/24 13:50:14 alanh Exp $ */ /* * Faster arithmetic functions. If the FAST_MATH preprocessor symbol is @@ -47,7 +47,7 @@ * In the worst case, we force the compiler to use a memory access to * truncate the float, by specifying the 'volatile' keyword. */ -#if defined(__linux__) && defined(__i386__) +#if defined(__linux__) && defined(__i386__) #include #if !defined(_FPU_SETCW) @@ -158,7 +158,7 @@ __asm__ ("fistpl %0" : "=m" (r) : "t" (f) : "st"); return r; } -#elif defined(__MSC__) && defined(__WIN32__) +#elif defined(__MSC__) && defined(__WIN32__) && !defined(__CYGWIN__) static __inline int FloatToInt(float f) { int r; @@ -232,13 +232,13 @@ * GLubyte b = FloatToInt(CLAMP(f, 0, 1) * 255) */ -#if defined(__i386__) || defined(__sparc__) +#if defined(__i386__) || defined(__sparc__) || ( defined(__alpha__) && \ + ( defined( __IEEE_FLOAT ) || !defined( VMS ) ) ) #define USE_IEEE +#define IEEE_ONE 0x3f7f0000 #endif #if defined(USE_IEEE) && !defined(DEBUG) - -#define IEEE_ONE 0x3f7f0000 #define CLAMP_FLOAT_COLOR(f) \ do { \ Index: xc/extras/Mesa/src/pb.c diff -u xc/extras/Mesa/src/pb.c:1.4 xc/extras/Mesa/src/pb.c:1.7 --- xc/extras/Mesa/src/pb.c:1.4 Fri Jun 16 20:02:14 2000 +++ xc/extras/Mesa/src/pb.c Mon Nov 13 18:30:50 2000 @@ -181,10 +181,10 @@ } (*ctx->Driver.WriteRGBAPixels)( ctx, n, x, y, - (const GLubyte (*)[4])rgbaTmp, mask ); + (CONST GLubyte (*)[4])rgbaTmp, mask ); if (ctx->RasterMask & ALPHABUF_BIT) { _mesa_write_alpha_pixels( ctx, n, x, y, - (const GLubyte (*)[4])rgbaTmp, mask ); + (CONST GLubyte (*)[4])rgbaTmp, mask ); } } } @@ -254,19 +254,24 @@ if ((ctx->RasterMask & modBits) || !PB->mono) { if (ctx->Texture.ReallyEnabled) { - int texUnit; + GLubyte primary_rgba[PB_SIZE][4]; + GLint texUnit; + + /* must make a copy of primary colors since they may be modified */ + MEMCPY(primary_rgba, PB->rgba, 4 * PB->count * sizeof(GLubyte)); + for (texUnit=0;texUnitcount, PB->s[texUnit], PB->t[texUnit], - PB->u[texUnit], PB->lambda[texUnit], - PB->rgba); + gl_texture_pixels( ctx, texUnit, + PB->count, PB->s[texUnit], PB->t[texUnit], + PB->u[texUnit], PB->lambda[texUnit], + primary_rgba, PB->rgba ); } } if (ctx->Light.Model.ColorControl == GL_SEPARATE_SPECULAR_COLOR - && ctx->Light.Enabled) { + && ctx->Light.Enabled && ctx->Texture.ReallyEnabled) { /* add specular color to primary color */ - add_colors( PB->count, PB->rgba, (const GLubyte (*)[3]) PB->spec ); + add_colors( PB->count, PB->rgba, (CONST GLubyte (*)[3]) PB->spec ); } if (ctx->Fog.Enabled @@ -279,7 +284,7 @@ if (ctx->Color.AlphaEnabled) { if (_mesa_alpha_test( ctx, PB->count, - (const GLubyte (*)[4]) PB->rgba, mask )==0) { + (CONST GLubyte (*)[4]) PB->rgba, mask )==0) { goto CleanUp; } } @@ -299,7 +304,7 @@ if (ctx->RasterMask & MULTI_DRAW_BIT) { multi_write_rgba_pixels( ctx, PB->count, PB->x, PB->y, - (const GLubyte (*)[4])PB->rgba, mask ); + (CONST GLubyte (*)[4])PB->rgba, mask ); } else { /* normal case: write to exactly one buffer */ @@ -316,11 +321,11 @@ } (*ctx->Driver.WriteRGBAPixels)( ctx, PB->count, PB->x, PB->y, - (const GLubyte (*)[4]) PB->rgba, + (CONST GLubyte (*)[4]) PB->rgba, mask ); if (ctx->RasterMask & ALPHABUF_BIT) { _mesa_write_alpha_pixels( ctx, PB->count, PB->x, PB->y, - (const GLubyte (*)[4]) PB->rgba, mask ); + (CONST GLubyte (*)[4]) PB->rgba, mask ); } } } @@ -331,7 +336,7 @@ if (ctx->Color.AlphaEnabled) { if (_mesa_alpha_test( ctx, PB->count, - (const GLubyte (*)[4]) PB->rgba, mask )==0) { + (CONST GLubyte (*)[4]) PB->rgba, mask )==0) { goto CleanUp; } } @@ -355,7 +360,7 @@ if (ctx->RasterMask & MULTI_DRAW_BIT) { /* Copy mono color to all pixels */ multi_write_rgba_pixels( ctx, PB->count, PB->x, PB->y, - (const GLubyte (*)[4]) PB->rgba, mask ); + (CONST GLubyte (*)[4]) PB->rgba, mask ); } else { /* normal case: write to exactly one buffer */ Index: xc/extras/Mesa/src/pipeline.c diff -u xc/extras/Mesa/src/pipeline.c:1.4 xc/extras/Mesa/src/pipeline.c:1.6 --- xc/extras/Mesa/src/pipeline.c:1.4 Tue Jun 20 01:08:17 2000 +++ xc/extras/Mesa/src/pipeline.c Thu Nov 30 10:39:04 2000 @@ -1,7 +1,8 @@ +/* $Id: pipeline.c,v 1.17.4.5 2000/11/26 21:10:26 brianp Exp $*/ /* * Mesa 3-D graphics library - * Version: 3.3 + * Version: 3.4 * * Copyright (C) 1999-2000 Brian Paul All Rights Reserved. * @@ -219,11 +220,19 @@ GLuint changed_ops = 0; GLuint oldoutputs = pre->outputs; GLuint oldinputs = pre->inputs; +#ifdef VAO GLuint fallback = (VERT_CURRENT_DATA & ctx->Current.Flag & + ~ctx->Array.Current->Summary); + GLuint changed_outputs = (ctx->Array.NewArrayState | + (fallback & cva->orflag)); + GLuint available = fallback | ctx->Array.Current->Flags; +#else + GLuint fallback = (VERT_CURRENT_DATA & ctx->Current.Flag & ~ctx->Array.Summary); GLuint changed_outputs = (ctx->Array.NewArrayState | (fallback & cva->orflag)); GLuint available = fallback | ctx->Array.Flags; +#endif pre->cva_state_change = 0; pre->ops = 0; @@ -232,10 +241,18 @@ pre->forbidden_inputs = 0; pre->fallback = 0; +#ifdef VAO + if (ctx->Array.Current->Summary & VERT_ELT) +#else if (ctx->Array.Summary & VERT_ELT) +#endif cva->orflag &= VERT_MATERIAL; +#ifdef VAO + cva->orflag &= ~(ctx->Array.Current->Summary & ~VERT_OBJ_ANY); +#else cva->orflag &= ~(ctx->Array.Summary & ~VERT_OBJ_ANY); +#endif available &= ~cva->orflag; pre->outputs = available; @@ -414,7 +431,7 @@ gl_print_pipeline( ctx, elt ); } -#define INTERESTED ~(NEW_DRIVER_STATE|NEW_CLIENT_STATE|NEW_TEXTURE_ENABLE) +#define INTERESTED ~(NEW_DRIVER_STATE|NEW_CLIENT_STATE) void gl_update_pipelines( GLcontext *ctx ) { @@ -429,7 +446,11 @@ if (newstate || cva->lock_changed || cva->orflag != cva->last_orflag || +#ifdef VAO + ctx->Array.Current->Flags != cva->last_array_flags) +#else ctx->Array.Flags != cva->last_array_flags) +#endif { GLuint flags = VERT_WIN; @@ -438,7 +459,7 @@ else flags |= VERT_INDEX; - if (ctx->Texture.Enabled & 0xf) { + if (ctx->Texture.ReallyEnabled & 0xf) { /* XXX this should also check that the texture is RGBA. What about Unit[1]? if (ctx->Texture.Unit[0].EnvMode == GL_REPLACE) flags &= ~VERT_RGBA; @@ -446,7 +467,7 @@ flags |= VERT_TEX0_ANY; } - if (ctx->Texture.Enabled & 0xf0) + if (ctx->Texture.ReallyEnabled & 0xf0) flags |= VERT_TEX1_ANY; if (ctx->Polygon.Unfilled) @@ -470,13 +491,25 @@ cva->lock_changed = 0; } +#ifdef VAO + if (ctx->Array.NewArrayState != cva->last_array_new_state) +#else if (ctx->Array.NewArrayState != cva->last_array_new_state) +#endif cva->pre.pipeline_valid = 0; cva->pre.data_valid = 0; +#ifdef VAO cva->last_array_new_state = ctx->Array.NewArrayState; +#else + cva->last_array_new_state = ctx->Array.NewArrayState; +#endif cva->last_orflag = cva->orflag; +#ifdef VAO + cva->last_array_flags = ctx->Array.Current->Flags; +#else cva->last_array_flags = ctx->Array.Flags; +#endif } void gl_run_pipeline( struct vertex_buffer *VB ) @@ -489,7 +522,7 @@ START_FAST_MATH(x); - for ( VB->Culled = 0; *stages && !VB->Culled ; stages++ ) + for ( VB->Culled = 0; *stages && !VB->Culled ; stages++ ) (*stages)->run( VB ); END_FAST_MATH(x); @@ -524,7 +557,7 @@ void gl_print_tri_caps( const char *name, GLuint flags ) { fprintf(stderr, - "%s: (0x%x) %s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s\n", + "%s: (0x%x) %s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s\n", name, flags, (flags & DD_FEEDBACK) ? "feedback, " : "", @@ -548,7 +581,9 @@ (flags & DD_LINE_SW_RASTERIZE) ? "sw-lines, " : "", (flags & DD_TRI_SW_RASTERIZE) ? "sw-tris, " : "", (flags & DD_QUAD_SW_RASTERIZE) ? "sw-quads, " : "", - (flags & DD_TRI_CULL_FRONT_BACK) ? "cull-all, " : "" + (flags & DD_TRI_CULL_FRONT_BACK) ? "cull-all, " : "", + (flags & DD_STENCIL) ? "stencil, " : "", + (flags & DD_CLIP_FOG_COORD) ? "clip-fog-coord, " : "" ); } Index: xc/extras/Mesa/src/pixel.c diff -u xc/extras/Mesa/src/pixel.c:1.4 xc/extras/Mesa/src/pixel.c:1.5 --- xc/extras/Mesa/src/pixel.c:1.4 Fri Jun 16 20:02:14 2000 +++ xc/extras/Mesa/src/pixel.c Mon Nov 13 16:55:34 2000 @@ -104,6 +104,14 @@ ctx->Pack.SkipRows = param; } break; + case GL_PACK_SKIP_IMAGES: + if (param<0) { + gl_error( ctx, GL_INVALID_VALUE, "glPixelStore(param)" ); + } + else { + ctx->Pack.SkipImages = param; + } + break; case GL_PACK_ALIGNMENT: if (param==1 || param==2 || param==4 || param==8) { ctx->Pack.Alignment = param; @@ -146,6 +154,14 @@ } else { ctx->Unpack.SkipRows = param; + } + break; + case GL_UNPACK_SKIP_IMAGES: + if (param < 0) { + gl_error( ctx, GL_INVALID_VALUE, "glPixelStore(param)" ); + } + else { + ctx->Unpack.SkipImages = param; } break; case GL_UNPACK_ALIGNMENT: Index: xc/extras/Mesa/src/points.c diff -u xc/extras/Mesa/src/points.c:1.4 xc/extras/Mesa/src/points.c:1.7 --- xc/extras/Mesa/src/points.c:1.4 Fri Jun 16 20:02:15 2000 +++ xc/extras/Mesa/src/points.c Mon Nov 13 18:30:50 2000 @@ -1,7 +1,7 @@ /* * Mesa 3-D graphics library - * Version: 3.3 + * Version: 3.4 * * Copyright (C) 1999-2000 Brian Paul All Rights Reserved. * @@ -160,7 +160,7 @@ GLuint i; win = &VB->Win.data[first][0]; - for (i = first; i <= last; i++) { + for (i = first; i < last; i++) { if (VB->ClipMask[i] == 0) { pbx[pbcount] = (GLint) win[0]; pby[pbcount] = (GLint) win[1]; @@ -186,7 +186,7 @@ struct pixel_buffer *PB = ctx->PB; GLuint i; - for (i = first; i <= last; i++) { + for (i = first; i < last; i++) { if (VB->ClipMask[i] == 0) { GLint x, y, z; GLint red, green, blue, alpha; @@ -220,7 +220,7 @@ GLint radius = isize >> 1; GLuint i; - for (i = first; i <= last; i++) { + for (i = first; i < last; i++) { if (VB->ClipMask[i] == 0) { GLint x0, x1, y0, y1; GLint ix, iy; @@ -269,7 +269,7 @@ GLint radius = isize >> 1; GLuint i; - for (i = first; i <= last; i++) { + for (i = first; i < last; i++) { if (VB->ClipMask[i] == 0) { GLint x0, x1, y0, y1; GLint ix, iy; @@ -322,7 +322,7 @@ struct pixel_buffer *PB = ctx->PB; GLuint i; - for (i = first; i <= last; i++) { + for (i = first; i < last; i++) { if (VB->ClipMask[i] == 0) { GLint x0, x1, y0, y1; GLint ix, iy, radius; @@ -358,7 +358,7 @@ green = VB->ColorPtr->data[i][1]; blue = VB->ColorPtr->data[i][2]; alpha = VB->ColorPtr->data[i][3]; - + switch (VB->TexCoordPtr[0]->size) { case 4: s = VB->TexCoordPtr[0]->data[i][0]/VB->TexCoordPtr[0]->data[i][3]; @@ -386,15 +386,13 @@ gl_problem(ctx, "unexpected texcoord size in textured_rgba_points()"); } -/* don't think this is needed - PB_SET_COLOR( red, green, blue, alpha ); -*/ - for (iy = y0; iy <= y1; iy++) { for (ix = x0; ix <= x1; ix++) { - PB_WRITE_TEX_PIXEL( PB, ix, iy, z, red, green, blue, alpha, s, t, u ); + PB_WRITE_TEX_PIXEL( PB, ix, iy, z, red, green, blue, alpha, + s, t, u ); } } + PB_CHECK_FLUSH(ctx, PB); } } @@ -411,12 +409,13 @@ struct pixel_buffer *PB = ctx->PB; GLuint i; - for (i = first; i <= last; i++) { + for (i = first; i < last; i++) { if (VB->ClipMask[i] == 0) { GLint x0, x1, y0, y1; GLint ix, iy; GLint radius; GLint red, green, blue, alpha; + GLint sRed, sGreen, sBlue; GLfloat s, t, u; GLfloat s1, t1, u1; @@ -449,6 +448,9 @@ green = VB->ColorPtr->data[i][1]; blue = VB->ColorPtr->data[i][2]; alpha = VB->ColorPtr->data[i][3]; + sRed = VB->Specular ? VB->Specular[i][0] : 0; + sGreen = VB->Specular ? VB->Specular[i][1] : 0; + sBlue = VB->Specular ? VB->Specular[i][2] : 0; switch (VB->TexCoordPtr[0]->size) { case 4: @@ -506,8 +508,10 @@ for (iy=y0;iy<=y1;iy++) { for (ix=x0;ix<=x1;ix++) { - PB_WRITE_MULTITEX_PIXEL( PB, ix, iy, z, red, green, blue, alpha, - s, t, u, s1, t1, u1 ); + PB_WRITE_MULTITEX_SPEC_PIXEL( PB, ix, iy, z, + red, green, blue, alpha, + sRed, sGreen, sBlue, + s, t, u, s1, t1, u1 ); } } PB_CHECK_FLUSH(ctx, PB); @@ -516,6 +520,17 @@ } +/* + * NOTES on aa point rasterization: + * + * Let d = distance of fragment center from vertex. + * if d < rmin2 then + * fragment has 100% coverage + * else if d > rmax2 then + * fragment has 0% coverage + * else + * fragement has % coverage = (d - rmin2) / (rmax2 - rmin2) + */ /* @@ -529,23 +544,25 @@ const GLfloat radius = ctx->Point.Size * 0.5F; const GLfloat rmin = radius - 0.7071F; /* 0.7071 = sqrt(2)/2 */ const GLfloat rmax = radius + 0.7071F; - const GLfloat rmin2 = rmin * rmin; + const GLfloat rmin2 = MAX2(0.0, rmin * rmin); const GLfloat rmax2 = rmax * rmax; const GLfloat cscale = 256.0F / (rmax2 - rmin2); GLuint i; if (ctx->Texture.ReallyEnabled) { - for (i = first; i <= last; i++) { + for (i = first; i < last; i++) { if (VB->ClipMask[i] == 0) { GLint x, y; GLint red, green, blue, alpha; - GLfloat s, t, u; - GLfloat s1, t1, u1; - - GLint xmin = (GLint) (VB->Win.data[i][0] - radius); - GLint xmax = (GLint) (VB->Win.data[i][0] + radius); - GLint ymin = (GLint) (VB->Win.data[i][1] - radius); - GLint ymax = (GLint) (VB->Win.data[i][1] + radius); + GLfloat s = 0.0F, t = 0.0F, u = 0.0F; + GLfloat s1 = 0.0F, t1 = 0.0F, u1 = 0.0F; + GLfloat vx = VB->Win.data[i][0]; + GLfloat vy = VB->Win.data[i][1]; + + GLint xmin = (GLint) (vx - radius); + GLint xmax = (GLint) (vx + radius); + GLint ymin = (GLint) (vy - radius); + GLint ymax = (GLint) (vy + radius); GLint z = (GLint) (VB->Win.data[i][2] + ctx->PointZoffset); red = VB->ColorPtr->data[i][0]; @@ -616,15 +633,19 @@ } } - for (y=ymin;y<=ymax;y++) { - for (x=xmin;x<=xmax;x++) { - GLfloat dx = x/*+0.5F*/ - VB->Win.data[i][0]; - GLfloat dy = y/*+0.5F*/ - VB->Win.data[i][1]; - GLfloat dist2 = dx*dx + dy*dy; - if (dist2ColorPtr->data[i][3]; - if (dist2>=rmin2) { - GLint coverage = (GLint) (256.0F-(dist2-rmin2)*cscale); + if (dist2 >= rmin2) { + GLint coverage = (GLint) (256.0F - (dist2 - rmin2) * cscale); /* coverage is in [0,256] */ alpha = (alpha * coverage) >> 8; } @@ -645,31 +666,35 @@ } else { /* Not texture mapped */ - for (i=first;i<=last;i++) { + for (i=first;iClipMask[i]==0) { GLint xmin, ymin, xmax, ymax; GLint x, y, z; GLint red, green, blue, alpha; - xmin = (GLint) (VB->Win.data[i][0] - radius); - xmax = (GLint) (VB->Win.data[i][0] + radius); - ymin = (GLint) (VB->Win.data[i][1] - radius); - ymax = (GLint) (VB->Win.data[i][1] + radius); + xmin = (GLint) (VB->Win.data[i][0] - 0.0 - radius); + xmax = (GLint) (VB->Win.data[i][0] - 0.0 + radius); + ymin = (GLint) (VB->Win.data[i][1] - 0.0 - radius); + ymax = (GLint) (VB->Win.data[i][1] - 0.0 + radius); z = (GLint) (VB->Win.data[i][2] + ctx->PointZoffset); red = VB->ColorPtr->data[i][0]; green = VB->ColorPtr->data[i][1]; blue = VB->ColorPtr->data[i][2]; - for (y=ymin;y<=ymax;y++) { - for (x=xmin;x<=xmax;x++) { - GLfloat dx = x/*+0.5F*/ - VB->Win.data[i][0]; - GLfloat dy = y/*+0.5F*/ - VB->Win.data[i][1]; - GLfloat dist2 = dx*dx + dy*dy; - if (dist2Win.data[i][0], VB->Win.data[i][1]); + printf("%d..%d X %d..%d\n", xmin, xmax, ymin, ymax); + */ + for (y = ymin; y <= ymax; y++) { + for (x = xmin; x <= xmax; x++) { + const GLfloat dx = x + 0.5F - VB->Win.data[i][0]; + const GLfloat dy = y + 0.5F - VB->Win.data[i][1]; + const GLfloat dist2 = dx*dx + dy*dy; + if (dist2 < rmax2) { alpha = VB->ColorPtr->data[i][3]; - if (dist2>=rmin2) { - GLint coverage = (GLint) (256.0F-(dist2-rmin2)*cscale); + if (dist2 >= rmin2) { + GLint coverage = (GLint) (256.0F - (dist2 - rmin2) * cscale); /* coverage is in [0,256] */ alpha = (alpha * coverage) >> 8; } @@ -712,7 +737,7 @@ const GLfloat *p = VEC_ELT(v, GLfloat, first); GLuint i; - for (i = first ; i <= last ; i++, STRIDE_F(p, stride) ) { + for (i = first ; i < last ; i++, STRIDE_F(p, stride) ) { GLfloat dist = GL_SQRT(p[0]*p[0]+p[1]*p[1]+p[2]*p[2]); out[i] = 1.0F / (ctx->Point.Params[0] + dist * (ctx->Point.Params[1] + @@ -729,7 +754,7 @@ const GLfloat *p = VEC_ELT(v, GLfloat, first); GLuint i; - for (i = first ; i <= last ; i++, STRIDE_F(p, stride) ) { + for (i = first ; i < last ; i++, STRIDE_F(p, stride) ) { GLfloat dist = GL_SQRT(p[0]*p[0]+p[1]*p[1]); out[i] = 1.0F / (ctx->Point.Params[0] + dist * (ctx->Point.Params[1] + @@ -769,7 +794,7 @@ const GLfloat *from = (GLfloat *)clip_vec->start; const GLuint stride = clip_vec->stride; - for (i = first ; i <= last ; i++ ) + for (i = first ; i < last ; i++ ) { GLfloat dist = win[i][2]; out[i] = 1/(ctx->Point.Params[0]+ @@ -798,7 +823,7 @@ else clip_dist( dist, first, last, ctx, VB->ClipPtr ); - for (i=first;i<=last;i++) { + for (i=first;iClipMask[i]==0) { GLint x0, x1, y0, y1; GLint ix, iy; @@ -860,7 +885,7 @@ else clip_dist( dist, first, last, ctx, VB->ClipPtr ); - for (i=first;i<=last;i++) { + for (i=first;iClipMask[i]==0) { GLint x0, x1, y0, y1; GLint ix, iy; @@ -930,14 +955,14 @@ else clip_dist( dist, first, last, ctx, VB->ClipPtr ); - for (i=first;i<=last;i++) { + for (i=first;iClipMask[i]==0) { GLint x0, x1, y0, y1; GLint ix, iy; GLint isize, radius; GLint red, green, blue, alpha; - GLfloat s, t, u; - GLfloat s1, t1, u1; + GLfloat s = 0.0F, t = 0.0F, u = 0.0F; + GLfloat s1 = 0.0F, t1 = 0.0F, u1 = 0.0F; GLint x = (GLint) VB->Win.data[i][0]; GLint y = (GLint) VB->Win.data[i][1]; @@ -1078,14 +1103,14 @@ clip_dist( dist, first, last, ctx, VB->ClipPtr ); if (ctx->Texture.ReallyEnabled) { - for (i=first;i<=last;i++) { + for (i=first;iClipMask[i]==0) { GLfloat radius, rmin, rmax, rmin2, rmax2, cscale, alphaf; GLint xmin, ymin, xmax, ymax; GLint x, y, z; GLint red, green, blue, alpha; - GLfloat s, t, u; - GLfloat s1, t1, u1; + GLfloat s = 0.0F, t = 0.0F, u = 0.0F; + GLfloat s1 = 0.0F, t1 = 0.0F, u1 = 0.0F; GLfloat dsize = psize * dist[i]; if (dsize >= ctx->Point.Threshold) { @@ -1099,9 +1124,9 @@ } rmin = radius - 0.7071F; /* 0.7071 = sqrt(2)/2 */ rmax = radius + 0.7071F; - rmin2 = rmin*rmin; - rmax2 = rmax*rmax; - cscale = 256.0F / (rmax2-rmin2); + rmin2 = MAX2(0.0, rmin * rmin); + rmax2 = rmax * rmax; + cscale = 256.0F / (rmax2 - rmin2); xmin = (GLint) (VB->Win.data[i][0] - radius); xmax = (GLint) (VB->Win.data[i][0] + radius); @@ -1179,9 +1204,9 @@ for (y = ymin; y <= ymax; y++) { for (x = xmin; x <= xmax; x++) { - GLfloat dx = x/*+0.5F*/ - VB->Win.data[i][0]; - GLfloat dy = y/*+0.5F*/ - VB->Win.data[i][1]; - GLfloat dist2 = dx*dx + dy*dy; + const GLfloat dx = x + 0.5F - VB->Win.data[i][0]; + const GLfloat dy = y + 0.5F - VB->Win.data[i][1]; + const GLfloat dist2 = dx*dx + dy*dy; if (dist2 < rmax2) { alpha = VB->ColorPtr->data[i][3]; if (dist2 >= rmin2) { @@ -1206,7 +1231,7 @@ } else { /* Not texture mapped */ - for (i = first; i <= last; i++) { + for (i = first; i < last; i++) { if (VB->ClipMask[i] == 0) { GLfloat radius, rmin, rmax, rmin2, rmax2, cscale, alphaf; GLint xmin, ymin, xmax, ymax; @@ -1225,7 +1250,7 @@ } rmin = radius - 0.7071F; /* 0.7071 = sqrt(2)/2 */ rmax = radius + 0.7071F; - rmin2 = rmin * rmin; + rmin2 = MAX2(0.0, rmin * rmin); rmax2 = rmax * rmax; cscale = 256.0F / (rmax2 - rmin2); @@ -1241,9 +1266,9 @@ for (y = ymin; y <= ymax; y++) { for (x = xmin; x <= xmax; x++) { - GLfloat dx = x/*+0.5F*/ - VB->Win.data[i][0]; - GLfloat dy = y/*+0.5F*/ - VB->Win.data[i][1]; - GLfloat dist2 = dx * dx + dy * dy; + const GLfloat dx = x + 0.5F - VB->Win.data[i][0]; + const GLfloat dy = y + 0.5F - VB->Win.data[i][1]; + const GLfloat dist2 = dx * dx + dy * dy; if (dist2 < rmax2) { alpha = VB->ColorPtr->data[i][3]; if (dist2 >= rmin2) { @@ -1324,7 +1349,8 @@ ctx->Driver.PointsFunc = antialiased_rgba_points; } else if (ctx->Texture.ReallyEnabled) { - if (ctx->Texture.ReallyEnabled >= TEXTURE1_1D) { + if (ctx->Texture.ReallyEnabled >= TEXTURE1_1D || + ctx->Light.Model.ColorControl==GL_SEPARATE_SPECULAR_COLOR) { ctx->Driver.PointsFunc = multitextured_rgba_points; } else { Index: xc/extras/Mesa/src/readpix.c diff -u xc/extras/Mesa/src/readpix.c:1.4 xc/extras/Mesa/src/readpix.c:1.9 --- xc/extras/Mesa/src/readpix.c:1.4 Fri Jun 16 20:02:15 2000 +++ xc/extras/Mesa/src/readpix.c Thu Nov 30 10:39:04 2000 @@ -1,7 +1,7 @@ /* * Mesa 3-D graphics library - * Version: 3.3 + * Version: 3.4 * * Copyright (C) 1999-2000 Brian Paul All Rights Reserved. * @@ -38,6 +38,7 @@ #include "pixel.h" #include "readpix.h" #include "span.h" +#include "state.h" #include "stencil.h" #include "types.h" #endif @@ -638,7 +639,8 @@ return; } - if (!_mesa_is_legal_format_and_type(format, type)) { + if (!_mesa_is_legal_format_and_type(format, type) || + format == GL_INTENSITY) { gl_error(ctx, GL_INVALID_OPERATION, "glReadPixels(format or type)"); return; } @@ -654,7 +656,7 @@ dest = _mesa_image_address( packing, pixels, width, height, format, type, 0, j, 0); - _mesa_pack_rgba_span( ctx, readWidth, (const GLubyte (*)[4]) rgba, + _mesa_pack_rgba_span( ctx, readWidth, (CONST GLubyte (*)[4]) rgba, format, type, dest, packing, GL_TRUE ); } } @@ -677,7 +679,7 @@ dest = _mesa_image_address( packing, pixels, width, height, format, type, 0, j, 0); - _mesa_pack_rgba_span( ctx, readWidth, (const GLubyte (*)[4]) rgba, + _mesa_pack_rgba_span( ctx, readWidth, (CONST GLubyte (*)[4]) rgba, format, type, dest, packing, GL_TRUE ); } } @@ -699,11 +701,17 @@ return; } + if (ctx->NewState) { + gl_update_state(ctx); + } + if (ctx->Driver.ReadPixels && (*ctx->Driver.ReadPixels)(ctx, x, y, width, height, format, type, &ctx->Pack, pixels)) return; + RENDER_START(ctx); + switch (format) { case GL_COLOR_INDEX: read_index_pixels(ctx, x, y, width, height, type, pixels, &ctx->Pack); @@ -731,4 +739,6 @@ default: gl_error( ctx, GL_INVALID_ENUM, "glReadPixels(format)" ); } + + RENDER_FINISH(ctx); } Index: xc/extras/Mesa/src/rect.c diff -u xc/extras/Mesa/src/rect.c:1.3 xc/extras/Mesa/src/rect.c:1.6 --- xc/extras/Mesa/src/rect.c:1.3 Tue Feb 15 02:12:32 2000 +++ xc/extras/Mesa/src/rect.c Mon Nov 13 18:30:51 2000 @@ -43,13 +43,6 @@ void _mesa_Rectf( GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2 ) { - /* - * TODO: we could examine a bunch of state variables and ultimately - * call the Driver->RectFunc() function to draw a screen-aligned - * filled rectangle. Someday... - * - * KW: What happens to cull mode here? - */ GET_CURRENT_CONTEXT(ctx); ASSERT_OUTSIDE_BEGIN_END(ctx, "glRect"); RESET_IMMEDIATE(ctx); @@ -59,6 +52,16 @@ gl_Vertex2f( ctx, x2, y2 ); gl_Vertex2f( ctx, x1, y2 ); gl_End( ctx ); + + /* If compiling, flush these vertices so that they aren't saved + * by the normal vertex compilation methods. + */ + if (ctx->CompileFlag) + { + ctx->CompileFlag = 0; + ctx->input->maybe_transform_vb( ctx->input ); + ctx->CompileFlag = GL_TRUE; + } } Index: xc/extras/Mesa/src/render_tmp.h diff -u xc/extras/Mesa/src/render_tmp.h:1.4 xc/extras/Mesa/src/render_tmp.h:1.7 --- xc/extras/Mesa/src/render_tmp.h:1.4 Fri Jun 16 20:02:15 2000 +++ xc/extras/Mesa/src/render_tmp.h Mon Nov 13 18:30:51 2000 @@ -210,13 +210,15 @@ RENDER_TRI( start, j-1, j, start, 0 ); EDGEFLAG_POLY_TRI_POST( start, j-1, j, start ); } + if (VB->Flag[count] & VERT_END) { + RESET_STIPPLE; + } } else { for (j=start+2;j1.0) \ + result = pow( dp, _tab->shininess ); \ + else { \ + float f = (dp * (SHINE_TABLE_SIZE-1)); \ + int k = (int) f; \ + result = _tab->tab[k] + (f-k)*(_tab->tab[k+1]-_tab->tab[k]); \ + } \ +} while (0) -#define GET_SHINE_TAB_ENTRY( tab, dp, result ) \ -do { \ - int k = (int) (dp * SHINE_TABLE_SIZE); \ - result = tab->tab[k]; \ -} while(0) - /* Combinatorics: - * rgba_spec/rgba/rgba_fast/ci + * rgba_spec/rgba/rgba_fast/rgba_fast_single/ci * one_side/two_side * compacted_normals/ordinary_normals * cull_mask/no_cull_mask - * - * We end up with an award-winning 32 seperate lighting functions. */ /* Table of all the shading functions. */ -gl_shade_func gl_shade_func_tab[0x20]; +gl_shade_func gl_shade_tab[0x10]; +gl_shade_func gl_shade_fast_tab[0x10]; +gl_shade_func gl_shade_fast_single_tab[0x10]; +gl_shade_func gl_shade_spec_tab[0x10]; +gl_shade_func gl_shade_ci_tab[0x10]; /* The original case where the normal for vertex[j] is normal[j], @@ -186,32 +200,40 @@ init_shade_tab_two_sided_masked(); init_shade_tab_two_sided_compacted(); init_shade_tab_two_sided_masked_compacted(); + +#ifdef USE_X86_ASM + gl_init_all_x86_shade_asm(); +#endif } void gl_update_lighting_function( GLcontext *ctx ) { - GLuint idx; + gl_shade_func *tab; if (ctx->Visual->RGBAflag) { if (ctx->Light.NeedVertices) { - if (ctx->Texture.Enabled && + if (ctx->Texture.ReallyEnabled && ctx->Light.Model.ColorControl==GL_SEPARATE_SPECULAR_COLOR) - idx = SHADE_RGBA_SPEC; + tab = gl_shade_spec_tab; else - idx = SHADE_RGBA_VERTICES; + tab = gl_shade_tab; } - else - idx = SHADE_RGBA_NORMALS; + else { + if (ctx->Light.EnabledList.next == ctx->Light.EnabledList.prev && + !ctx->Light.ColorMaterialEnabled) + tab = gl_shade_fast_single_tab; + else + tab = gl_shade_fast_tab; + } } else - idx = 0; + tab = gl_shade_ci_tab; if (ctx->TriangleCaps & DD_TRI_LIGHT_TWOSIDE) { - idx |= SHADE_TWOSIDE; + tab += SHADE_TWOSIDE; } - - ctx->shade_func_flags = idx; + ctx->shade_func_tab = tab; } @@ -326,13 +348,7 @@ shininess *= .5; } - if (n_dot_h>1.0) { - spec_coef = (GLfloat) pow( n_dot_h, shininess ); - } - else { - struct gl_shine_tab *tab = ctx->ShineTable[0]; - GET_SHINE_TAB_ENTRY( tab, n_dot_h, spec_coef ); - } + GET_SHINE_TAB_ENTRY( ctx->ShineTable[0], n_dot_h, spec_coef ); if (spec_coef > 1.0e-10) { ACC_SCALE_SCALAR_3V( contrib, spec_coef, Index: xc/extras/Mesa/src/shade.h diff -u xc/extras/Mesa/src/shade.h:1.3 xc/extras/Mesa/src/shade.h:1.4 --- xc/extras/Mesa/src/shade.h:1.3 Tue Feb 15 02:12:33 2000 +++ xc/extras/Mesa/src/shade.h Thu Nov 30 10:39:04 2000 @@ -2,19 +2,19 @@ /* * Mesa 3-D graphics library * Version: 3.1 - * + * * Copyright (C) 1999 Brian Paul All Rights Reserved. - * + * * 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 @@ -39,7 +39,11 @@ extern void gl_init_shade( void ); -extern gl_shade_func gl_shade_func_tab[]; +extern gl_shade_func gl_shade_tab[0x10]; +extern gl_shade_func gl_shade_fast_tab[0x10]; +extern gl_shade_func gl_shade_fast_single_tab[0x10]; +extern gl_shade_func gl_shade_spec_tab[0x10]; +extern gl_shade_func gl_shade_ci_tab[0x10]; void gl_shade_rastpos( GLcontext *ctx, @@ -49,4 +53,3 @@ GLuint *index ); #endif - Index: xc/extras/Mesa/src/shade_tmp.h diff -u xc/extras/Mesa/src/shade_tmp.h:1.4 xc/extras/Mesa/src/shade_tmp.h:1.8 --- xc/extras/Mesa/src/shade_tmp.h:1.4 Fri Jun 16 20:02:15 2000 +++ xc/extras/Mesa/src/shade_tmp.h Tue Nov 28 13:49:21 2000 @@ -1,9 +1,9 @@ /* * Mesa 3-D graphics library - * Version: 3.1 + * Version: 3.4 * - * Copyright (C) 1999 Brian Paul All Rights Reserved. + * Copyright (C) 1999-2000 Brian Paul All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), @@ -38,8 +38,6 @@ GLuint vstride = VB->Unprojected->stride; const GLfloat *vertex = VB->Unprojected->start; - GLuint vertex_size = VB->Unprojected->size; - GLuint nstride = VB->NormalPtr->stride; const GLfloat *normal = VB->NormalPtr->start; CONST GLfloat (*first_normal)[3] = (CONST GLfloat (*)[3]) VB->NormalPtr->start; @@ -82,8 +80,7 @@ VB->Specular = VB->Spec[0]; - for ( j=0 ; jPosition, vertex); - VP[2] = light->Position[2]; - } else { - SUB_3V(VP, light->Position, vertex); - } + SUB_3V(VP, light->Position, vertex); d = (GLfloat) LEN_3FV( VP ); @@ -146,8 +138,7 @@ light->QuadraticAttenuation)); /* spotlight attenuation */ - if (light->Flags & LIGHT_SPOT) - { + if (light->Flags & LIGHT_SPOT) { GLfloat PV_dot_dir = - DOT3(VP, light->NormDirection); if (PV_dot_dirCosCutoff) { @@ -181,7 +172,8 @@ side = 1; correction = -1; n_dot_VP = -n_dot_VP; - } else { + } + else { if (LIGHT_REAR(*mask)) { ACC_SCALE_SCALAR_3V( sum[1], attenuation, light->MatAmbient[1]); } @@ -204,7 +196,6 @@ if (ctx->Light.Model.LocalViewer) { GLfloat v[3]; COPY_3V(v, vertex); - if (vertex_size == 2) v[2] = 0; NORMALIZE_3FV(v); SUB_3V(VP, VP, v); /* h = VP + VPe */ h = VP; @@ -214,15 +205,15 @@ h = VP; ACC_3V(h, ctx->EyeZDir); normalized = 0; - } else { + } + else { h = light->h_inf_norm; normalized = 1; } n_dot_h = correction * DOT3(normal, h); - if (n_dot_h > 0.0F) - { + if (n_dot_h > 0.0F) { GLfloat spec_coef; struct gl_shine_tab *tab = ctx->ShineTable[side]; @@ -231,12 +222,9 @@ n_dot_h /= LEN_SQUARED_3FV( h ); tab = ctx->ShineTable[side+2]; } - - if (n_dot_h>1.0) { - spec_coef = (GLfloat) pow( n_dot_h, tab->shininess ); - } else - GET_SHINE_TAB_ENTRY( tab, n_dot_h, spec_coef ); + GET_SHINE_TAB_ENTRY( tab, n_dot_h, spec_coef ); + if (spec_coef > 1.0e-10) { spec_coef *= attenuation; ACC_SCALE_SCALAR_3V( spec[side], spec_coef, @@ -276,8 +264,6 @@ GLuint vstride = VB->Unprojected->stride; const GLfloat *vertex = (GLfloat *)VB->Unprojected->start; - GLuint vertex_size = VB->Unprojected->size; - GLuint nstride = VB->NormalPtr->stride; const GLfloat *normal = VB->NormalPtr->start; CONST GLfloat (*first_normal)[3] = (CONST GLfloat (*)[3])VB->NormalPtr->start; @@ -312,8 +298,7 @@ VB->Color[0] = VB->LitColor[0]; VB->Color[1] = VB->LitColor[1]; - for ( j=0 ; jPosition, vertex); - VP[2] = light->Position[2]; - } else { - SUB_3V(VP, light->Position, vertex); - } + SUB_3V(VP, light->Position, vertex); d = LEN_3FV( VP ); @@ -368,14 +347,13 @@ GLfloat invd = 1.0F / d; SELF_SCALE_SCALAR_3V(VP, invd); } -/* if (light->Flags & LIGHT_ATTENUATED) */ - attenuation = 1.0F / (light->ConstantAttenuation + d * - (light->LinearAttenuation + d * - light->QuadraticAttenuation)); + attenuation = 1.0F / (light->ConstantAttenuation + d * + (light->LinearAttenuation + d * + light->QuadraticAttenuation)); + /* spotlight attenuation */ - if (light->Flags & LIGHT_SPOT) - { + if (light->Flags & LIGHT_SPOT) { GLfloat PV_dot_dir = - DOT3(VP, light->NormDirection); if (PV_dot_dirCosCutoff) { @@ -410,7 +388,8 @@ side = 1; correction = -1; n_dot_VP = -n_dot_VP; - } else { + } + else { if (LIGHT_REAR(*mask)) { ACC_SCALE_SCALAR_3V( sum[1], attenuation, light->MatAmbient[1]); } @@ -426,12 +405,10 @@ ACC_SCALE_SCALAR_3V(contrib, n_dot_VP, light->MatDiffuse[side]); /* specular term - cannibalize VP... */ - if (light->IsMatSpecular[side]) - { + if (light->IsMatSpecular[side]) { if (ctx->Light.Model.LocalViewer) { GLfloat v[3]; COPY_3V(v, vertex); - if (vertex_size == 2) v[2] = 0; NORMALIZE_3FV(v); SUB_3V(VP, VP, v); /* h = VP + VPe */ h = VP; @@ -441,7 +418,8 @@ h = VP; ACC_3V(h, ctx->EyeZDir); normalized = 0; - } else { + } + else { h = light->h_inf_norm; normalized = 1; } @@ -459,11 +437,7 @@ tab = ctx->ShineTable[side+2]; } - if (n_dot_h>1.0) { - spec_coef = pow( n_dot_h, tab->shininess ); - } else { - GET_SHINE_TAB_ENTRY( tab, n_dot_h, spec_coef ); - } + GET_SHINE_TAB_ENTRY( tab, n_dot_h, spec_coef ); ACC_SCALE_SCALAR_3V( contrib, spec_coef, light->MatSpecular[side]); @@ -494,6 +468,123 @@ +/* As below, but with just a single light and no colormaterial. + */ +static void TAG(shade_fast_rgba_single)( struct vertex_buffer *VB ) +{ + GLcontext *ctx = VB->ctx; + GLuint nstride = VB->NormalPtr->stride; + const GLfloat *normal = VB->NormalPtr->start; + CONST GLfloat (*first_normal)[3] = + (CONST GLfloat (*)[3])VB->NormalPtr->start; + GLubyte (*Fcolor)[4] = (GLubyte (*)[4])VB->LitColor[0]->start; + GLubyte (*Bcolor)[4] = (GLubyte (*)[4])VB->LitColor[1]->start; + GLubyte *mask = VB->NormCullStart; + struct gl_light *light = ctx->Light.EnabledList.next; + GLubyte *cullmask = mask; + GLuint *flags = VB->Flag + VB->Start; + GLubyte baseubyte[2][4]; + GLuint j = 0; + struct gl_material (*new_material)[2] = VB->Material + VB->Start; + GLuint *new_material_mask = VB->MaterialMask + VB->Start; + GLfloat base[2][3]; + + (void) cullmask; + (void) first_normal; + (void) nstride; + + if ( flags[j] & VERT_MATERIAL ) + gl_update_material( ctx, new_material[j], new_material_mask[j] ); + + /* No attenuation, so incoporate MatAmbient into base color. + */ + { + COPY_3V(base[0], light->MatAmbient[0]); + ACC_3V(base[0], ctx->Light.BaseColor[0] ); + FLOAT_RGB_TO_UBYTE_RGB( baseubyte[0], base[0] ); + baseubyte[0][3] = ctx->Light.BaseAlpha[0]; + + if (NR_SIDES == 2) { + COPY_3V(base[1], light->MatAmbient[1]); + ACC_3V(base[1], ctx->Light.BaseColor[1]); + FLOAT_RGB_TO_UBYTE_RGB( baseubyte[1], base[1]); + baseubyte[1][3] = ctx->Light.BaseAlpha[1]; + } + } + + VB->ColorPtr = VB->LitColor[0]; + VB->Color[0] = VB->LitColor[0]; + VB->Color[1] = VB->LitColor[1]; + + do { + do { + if ( !CULL(*mask) ) { + GLfloat n_dot_VP = DOT3(normal, light->VP_inf_norm); + + COPY_4UBV(Fcolor[j], baseubyte[0]); + if (NR_SIDES == 2) COPY_4UBV(Bcolor[j], baseubyte[1]); + + if (n_dot_VP < 0.0F) { + if (LIGHT_REAR(*mask)) { + GLfloat n_dot_h = -DOT3(normal, light->h_inf_norm); + if (n_dot_h > 0.0F) { + GLfloat spec, sum[3]; + GET_SHINE_TAB_ENTRY( ctx->ShineTable[1], n_dot_h, spec ); + COPY_3V(sum, base[1]); + ACC_SCALE_SCALAR_3V(sum, -n_dot_VP, light->MatDiffuse[1]); + ACC_SCALE_SCALAR_3V(sum, spec, light->MatSpecular[1]); + FLOAT_RGB_TO_UBYTE_RGB(Bcolor[j], sum ); + } + } + } else { + if (LIGHT_FRONT(*mask)) { + GLfloat n_dot_h = DOT3(normal, light->h_inf_norm); + if (n_dot_h > 0.0F) { + GLfloat spec, sum[3]; + GET_SHINE_TAB_ENTRY( ctx->ShineTable[0], n_dot_h, spec ); + COPY_3V(sum, base[0]); + ACC_SCALE_SCALAR_3V(sum, n_dot_VP, light->MatDiffuse[0]); + ACC_SCALE_SCALAR_3V(sum, spec, light->MatSpecular[0]); + FLOAT_RGB_TO_UBYTE_RGB(Fcolor[j], sum ); + } + } + } + } + j++; + NEXT_NORMAL; + } while ((flags[j] & (VERT_MATERIAL|VERT_END_VB|VERT_NORM)) == VERT_NORM); + + + if (COMPACTED) { + GLuint last = j-1; + for ( ; !(flags[j] & (VERT_MATERIAL|VERT_END_VB|VERT_NORM)) ; j++ ) { + COPY_4UBV(Fcolor[j], Fcolor[last]); + if (NR_SIDES==2) + COPY_4UBV(Bcolor[j], Bcolor[last]); + } + NEXT_NORMAL; + } + + /* Have to recompute our base colors on material change. + */ + if ( flags[j] & VERT_MATERIAL ) { + gl_update_material( ctx, new_material[j], new_material_mask[j] ); + + COPY_3V(base[0], light->MatAmbient[0]); + ACC_3V(base[0], ctx->Light.BaseColor[0] ); + FLOAT_RGB_TO_UBYTE_RGB( baseubyte[0], base[0] ); + + if (NR_SIDES == 2) { + COPY_3V(base[1], light->MatAmbient[1]); + ACC_3V(base[1], ctx->Light.BaseColor[1]); + FLOAT_RGB_TO_UBYTE_RGB( baseubyte[1], base[1]); + } + } + + } while (!(flags[j] & VERT_END_VB)); +} + + /* Vertex size doesn't matter - yay! */ static void TAG(shade_fast_rgba)( struct vertex_buffer *VB ) @@ -515,6 +606,7 @@ GLuint j = 0; struct gl_material (*new_material)[2] = VB->Material + VB->Start; GLuint *new_material_mask = VB->MaterialMask + VB->Start; + struct gl_light *light; (void) cullmask; (void) first_normal; @@ -534,19 +626,20 @@ } + if ( flags[j] & VERT_MATERIAL ) + gl_update_material( ctx, new_material[j], new_material_mask[j] ); + + COPY_3V(base[0], ctx->Light.BaseColor[0]); + if (NR_SIDES == 2) COPY_3V(base[1], ctx->Light.BaseColor[1]); + interesting = cm_flags | VERT_MATERIAL | VERT_END_VB | VERT_NORM; VB->ColorPtr = VB->LitColor[0]; VB->Color[0] = VB->LitColor[0]; VB->Color[1] = VB->LitColor[1]; - if ( flags[j] & VERT_MATERIAL ) - gl_update_material( ctx, new_material[j], new_material_mask[j] ); - do { do { - if ( !CULL(*mask) ) - { - struct gl_light *light; + if ( !CULL(*mask) ) { GLfloat sum[2][3]; GLfloat spec; @@ -563,14 +656,18 @@ GLfloat n_dot_h; GLint side = 0; GLfloat n_dot_VP = DOT3(normal, light->VP_inf_norm); - + + ACC_3V(sum[0], light->MatAmbient[0]); + if (NR_SIDES == 2) ACC_3V(sum[1], light->MatAmbient[1]); + if (n_dot_VP < 0.0F) { if ( !LIGHT_REAR(*mask) ) continue; ACC_SCALE_SCALAR_3V(sum[1], -n_dot_VP, light->MatDiffuse[1]); if (!light->IsMatSpecular[1]) continue; n_dot_h = -DOT3(normal, light->h_inf_norm); side = 1; - } else { + } + else { if ( !LIGHT_FRONT(*mask) ) continue; ACC_SCALE_SCALAR_3V(sum[0], n_dot_VP, light->MatDiffuse[0]); if (!light->IsMatSpecular[0]) continue; @@ -579,16 +676,11 @@ if (n_dot_h > 0.0F) { struct gl_shine_tab *tab = ctx->ShineTable[side]; - if (n_dot_h > 1.0) - spec = pow( n_dot_h, tab->shininess ); - else - GET_SHINE_TAB_ENTRY( tab, n_dot_h, spec ); - + GET_SHINE_TAB_ENTRY( tab, n_dot_h, spec ); ACC_SCALE_SCALAR_3V( sum[side], spec, light->MatSpecular[side]); } } - if (LIGHT_FRONT(*mask)) { FLOAT_RGB_TO_UBYTE_RGB( Fcolor[j], sum[0] ); Fcolor[j][3] = sumA[0]; @@ -617,10 +709,10 @@ NEXT_NORMAL; } - if ( flags[j] & cm_flags ) + if ( flags[j] & cm_flags ) gl_update_color_material( ctx, CMcolor[j] ); - - if ( flags[j] & VERT_MATERIAL ) + + if ( flags[j] & VERT_MATERIAL ) gl_update_material( ctx, new_material[j], new_material_mask[j] ); } while (!(flags[j] & VERT_END_VB)); @@ -646,8 +738,6 @@ GLcontext *ctx = VB->ctx; GLuint vstride = VB->Unprojected->stride; const GLfloat *vertex = (GLfloat *)VB->Unprojected->start; - GLuint vertex_size = VB->Unprojected->size; - GLuint nstride = VB->NormalPtr->stride; const GLfloat *normal = VB->NormalPtr->start; CONST GLfloat (*first_normal)[3] = (CONST GLfloat (*)[3])VB->NormalPtr->start; @@ -686,8 +776,7 @@ CMcolor = (GLubyte (*)[4])VB->ColorPtr->start; } - for ( j=0 ; jPosition, vertex); - VP[2] = light->Position[2]; - } else { - SUB_3V(VP, light->Position, vertex); - } + SUB_3V(VP, light->Position, vertex); d = LEN_3FV( VP ); if ( d > 1e-6) { @@ -742,8 +826,7 @@ light->QuadraticAttenuation)); /* spotlight attenuation */ - if (light->Flags & LIGHT_SPOT) - { + if (light->Flags & LIGHT_SPOT) { GLfloat PV_dot_dir = - DOT3(VP, light->NormDirection); if (PV_dot_dirCosCutoff) { continue; /* this light makes no contribution */ @@ -770,7 +853,8 @@ side = 1; correction = -1; n_dot_VP = -n_dot_VP; - } else { + } + else { if (!LIGHT_FRONT(*mask)) continue; } @@ -785,7 +869,6 @@ if (ctx->Light.Model.LocalViewer) { GLfloat v[3]; COPY_3V(v, vertex); - if (vertex_size == 2) v[2] = 0; NORMALIZE_3FV(v); SUB_3V(VP, VP, v); /* h = VP + VPe */ h = VP; @@ -795,7 +878,8 @@ h = VP; ACC_3V(h, ctx->EyeZDir); normalized = 0; - } else { + } + else { h = light->h_inf_norm; normalized = 1; } @@ -813,18 +897,14 @@ tab = ctx->ShineTable[side+2]; } - if (n_dot_h>1.0) { - spec_coef = pow( n_dot_h, tab->shininess ); - } else { - GET_SHINE_TAB_ENTRY( tab, n_dot_h, spec_coef); - } + GET_SHINE_TAB_ENTRY( tab, n_dot_h, spec_coef); + specular[side] += spec_coef * light->sli * attenuation; } } /*loop over lights*/ /* Now compute final color index */ - for (side = 0 ; side < NR_SIDES ; side++) - { + for (side = 0 ; side < NR_SIDES ; side++) { GLfloat index; struct gl_material *mat; @@ -850,22 +930,22 @@ } } /*for vertex*/ - if ( flags[j] & cm_flags ) - gl_update_color_material( ctx, CMcolor[j] ); + if ( flags[j] & cm_flags ) + gl_update_color_material( ctx, CMcolor[j] ); - if ( flags[j] & VERT_MATERIAL ) - gl_update_material( ctx, new_material[j], new_material_mask[j] ); - + if ( flags[j] & VERT_MATERIAL ) + gl_update_material( ctx, new_material[j], new_material_mask[j] ); } static void TAG(init_shade_tab)( void ) { - gl_shade_func_tab[IDX|SHADE_RGBA_VERTICES] = TAG(shade_rgba); - gl_shade_func_tab[IDX|SHADE_RGBA_NORMALS] = TAG(shade_fast_rgba); - gl_shade_func_tab[IDX|SHADE_RGBA_SPEC] = TAG(shade_rgba_spec); - gl_shade_func_tab[IDX] = TAG(shade_ci); + gl_shade_tab[IDX] = TAG(shade_rgba); + gl_shade_fast_tab[IDX] = TAG(shade_fast_rgba); + gl_shade_fast_single_tab[IDX] = TAG(shade_fast_rgba_single); + gl_shade_spec_tab[IDX] = TAG(shade_rgba_spec); + gl_shade_ci_tab[IDX] = TAG(shade_ci); } Index: xc/extras/Mesa/src/span.c diff -u xc/extras/Mesa/src/span.c:1.5 xc/extras/Mesa/src/span.c:1.8 --- xc/extras/Mesa/src/span.c:1.5 Fri Jun 16 20:02:15 2000 +++ xc/extras/Mesa/src/span.c Mon Nov 13 18:30:51 2000 @@ -151,6 +151,8 @@ _mesa_logicop_ci_span( ctx, n, x, y, indexTmp, mask ); } if (ctx->Color.SWmasking) { + if (ctx->Color.IndexMask == 0) + break; _mesa_mask_index_span( ctx, n, x, y, indexTmp ); } (*ctx->Driver.WriteCI32Span)( ctx, n, x, y, indexTmp, mask ); @@ -241,6 +243,8 @@ _mesa_logicop_ci_span( ctx, n, x, y, index, mask ); } if (ctx->Color.SWmasking) { + if (ctx->Color.IndexMask == 0) + return; _mesa_mask_index_span( ctx, n, x, y, index ); } @@ -315,10 +319,6 @@ _mesa_logicop_ci_span( ctx, n, x, y, indexes, mask ); } - if (ctx->Color.SWmasking) { - _mesa_mask_index_span( ctx, n, x, y, indexes ); - } - if (ctx->RasterMask & MULTI_DRAW_BIT) { /* draw to zero or two or more buffers */ multi_write_index_span( ctx, n, x, y, indexes, mask ); @@ -329,6 +329,8 @@ _mesa_logicop_ci_span( ctx, n, x, y, indexes, mask ); } if (ctx->Color.SWmasking) { + if (ctx->Color.IndexMask == 0) + return; _mesa_mask_index_span( ctx, n, x, y, indexes ); } (*ctx->Driver.WriteCI32Span)( ctx, n, x, y, indexes, mask ); @@ -399,14 +401,16 @@ _mesa_blend_span( ctx, n, x, y, rgbaTmp, mask ); } if (ctx->Color.SWmasking) { + if (*((GLuint *) ctx->Color.ColorMask) == 0) + break; _mesa_mask_rgba_span( ctx, n, x, y, rgbaTmp ); } (*ctx->Driver.WriteRGBASpan)( ctx, n, x, y, - (const GLubyte (*)[4]) rgbaTmp, mask ); + (CONST GLubyte (*)[4]) rgbaTmp, mask ); if (ctx->RasterMask & ALPHABUF_BIT) { _mesa_write_alpha_span( ctx, n, x, y, - (const GLubyte (*)[4])rgbaTmp, mask ); + (CONST GLubyte (*)[4])rgbaTmp, mask ); } } } @@ -471,7 +475,7 @@ /* Do the alpha test */ if (ctx->Color.AlphaEnabled) { - if (_mesa_alpha_test( ctx, n, (const GLubyte (*)[4]) rgba, mask )==0) { + if (_mesa_alpha_test( ctx, n, (CONST GLubyte (*)[4]) rgba, mask )==0) { return; } write_all = GL_FALSE; @@ -499,9 +503,7 @@ ctx->OcclusionResult = GL_TRUE; if (ctx->RasterMask & MULTI_DRAW_BIT) { - multi_write_rgba_span( ctx, n, x, y, - (const GLubyte (*)[4]) rgba, - write_all ? Null : mask ); + multi_write_rgba_span( ctx, n, x, y, (CONST GLubyte (*)[4]) rgba, mask ); } else { /* normal: write to exactly one buffer */ @@ -515,17 +517,19 @@ /* Color component masking */ if (ctx->Color.SWmasking) { + if (*((GLuint *) ctx->Color.ColorMask) == 0) + return; _mesa_mask_rgba_span( ctx, n, x, y, rgba ); } /* write pixels */ (*ctx->Driver.WriteRGBASpan)( ctx, n, x, y, - (const GLubyte (*)[4]) rgba, + (CONST GLubyte (*)[4]) rgba, write_all ? Null : mask ); if (ctx->RasterMask & ALPHABUF_BIT) { _mesa_write_alpha_span( ctx, n, x, y, - (const GLubyte (*)[4]) rgba, + (CONST GLubyte (*)[4]) rgba, write_all ? Null : mask ); } @@ -584,7 +588,7 @@ for (i=0;iColor.BlendEnabled || ctx->Color.SWLogicOpEnabled - || ctx->Color.SWmasking) { + if (ctx->Color.SWLogicOpEnabled || ctx->Color.SWmasking || + (ctx->RasterMask & (BLEND_BIT | FOG_BIT))) { /* assign same color to each pixel */ for (i=0;iFog.Enabled && + (primitive==GL_BITMAP || ctx->FogMode==FOG_FRAGMENT)) { + _mesa_fog_rgba_pixels( ctx, n, z, rgba ); + } + if (ctx->RasterMask & MULTI_DRAW_BIT) { - multi_write_rgba_span( ctx, n, x, y, (const GLubyte (*)[4]) rgba, - mask ); + multi_write_rgba_span( ctx, n, x, y, + (CONST GLubyte (*)[4]) rgba, mask ); } else { /* normal: write to exactly one buffer */ @@ -640,16 +650,18 @@ /* Color component masking */ if (ctx->Color.SWmasking) { + if (*((GLuint *) ctx->Color.ColorMask) == 0) + return; _mesa_mask_rgba_span( ctx, n, x, y, rgba ); } /* write pixels */ (*ctx->Driver.WriteRGBASpan)( ctx, n, x, y, - (const GLubyte (*)[4]) rgba, + (CONST GLubyte (*)[4]) rgba, write_all ? Null : mask ); if (ctx->RasterMask & ALPHABUF_BIT) { _mesa_write_alpha_span( ctx, n, x, y, - (const GLubyte (*)[4]) rgba, + (CONST GLubyte (*)[4]) rgba, write_all ? Null : mask ); } } @@ -667,8 +679,7 @@ } } multi_write_rgba_span( ctx, n, x, y, - (const GLubyte (*)[4]) rgba, - mask ); + (CONST GLubyte (*)[4]) rgba, mask ); } else { (*ctx->Driver.WriteMonoRGBASpan)( ctx, n, x, y, mask ); @@ -748,7 +759,7 @@ /* Texture */ ASSERT(ctx->Texture.ReallyEnabled); - gl_texture_pixels( ctx, 0, n, s, t, u, lambda, rgba ); + gl_texture_pixels( ctx, 0, n, s, t, u, lambda, rgba, rgba ); /* Add base and specular colors */ if (spec && ctx->Light.Enabled @@ -776,7 +787,7 @@ /* Do the alpha test */ if (ctx->Color.AlphaEnabled) { - if (_mesa_alpha_test( ctx, n, (const GLubyte (*)[4]) rgba, mask )==0) { + if (_mesa_alpha_test( ctx, n, (CONST GLubyte (*)[4]) rgba, mask )==0) { return; } write_all = GL_FALSE; @@ -804,8 +815,7 @@ ctx->OcclusionResult = GL_TRUE; if (ctx->RasterMask & MULTI_DRAW_BIT) { - multi_write_rgba_span( ctx, n, x, y, (const GLubyte (*)[4])rgba, - write_all ? Null : mask ); + multi_write_rgba_span( ctx, n, x, y, (CONST GLubyte (*)[4]) rgba, mask ); } else { /* normal: write to exactly one buffer */ @@ -816,13 +826,15 @@ _mesa_blend_span( ctx, n, x, y, rgba, mask ); } if (ctx->Color.SWmasking) { + if (*((GLuint *) ctx->Color.ColorMask) == 0) + return; _mesa_mask_rgba_span( ctx, n, x, y, rgba ); } - (*ctx->Driver.WriteRGBASpan)( ctx, n, x, y, (const GLubyte (*)[4])rgba, + (*ctx->Driver.WriteRGBASpan)( ctx, n, x, y, (CONST GLubyte (*)[4])rgba, write_all ? Null : mask ); if (ctx->RasterMask & ALPHABUF_BIT) { - _mesa_write_alpha_span( ctx, n, x, y, (const GLubyte (*)[4]) rgba, + _mesa_write_alpha_span( ctx, n, x, y, (CONST GLubyte (*)[4]) rgba, write_all ? Null : mask ); } } @@ -864,7 +876,8 @@ } - if (primitive==GL_BITMAP || (ctx->RasterMask & MULTI_DRAW_BIT)) { + if (primitive==GL_BITMAP || (ctx->RasterMask & MULTI_DRAW_BIT) + || texUnits > 1) { /* must make a copy of the colors since they may be modified */ MEMCPY(rgbaBackup, rgbaIn, 4 * n * sizeof(GLubyte)); rgba = rgbaBackup; @@ -876,9 +889,8 @@ /* Texture */ ASSERT(ctx->Texture.ReallyEnabled); ASSERT(texUnits <= MAX_TEXTURE_UNITS); - for (i=0;iLight.Enabled @@ -906,7 +918,7 @@ /* Do the alpha test */ if (ctx->Color.AlphaEnabled) { - if (_mesa_alpha_test( ctx, n, (const GLubyte (*)[4])rgba, mask )==0) { + if (_mesa_alpha_test( ctx, n, (CONST GLubyte (*)[4])rgba, mask )==0) { return; } write_all = GL_FALSE; @@ -934,8 +946,7 @@ ctx->OcclusionResult = GL_TRUE; if (ctx->RasterMask & MULTI_DRAW_BIT) { - multi_write_rgba_span( ctx, n, x, y, (const GLubyte (*)[4]) rgba, - write_all ? Null : mask ); + multi_write_rgba_span( ctx, n, x, y, (CONST GLubyte (*)[4]) rgba, mask ); } else { /* normal: write to exactly one buffer */ @@ -947,12 +958,14 @@ _mesa_blend_span( ctx, n, x, y, rgba, mask ); } if (ctx->Color.SWmasking) { + if (*((GLuint *) ctx->Color.ColorMask) == 0) + return; _mesa_mask_rgba_span( ctx, n, x, y, rgba ); } - (*ctx->Driver.WriteRGBASpan)( ctx, n, x, y, (const GLubyte (*)[4])rgba, write_all ? Null : mask ); + (*ctx->Driver.WriteRGBASpan)( ctx, n, x, y, (CONST GLubyte (*)[4])rgba, write_all ? Null : mask ); if (ctx->RasterMask & ALPHABUF_BIT) { - _mesa_write_alpha_span( ctx, n, x, y, (const GLubyte (*)[4])rgba, + _mesa_write_alpha_span( ctx, n, x, y, (CONST GLubyte (*)[4])rgba, write_all ? Null : mask ); } } Index: xc/extras/Mesa/src/stages.c diff -u xc/extras/Mesa/src/stages.c:1.4 xc/extras/Mesa/src/stages.c:1.9 --- xc/extras/Mesa/src/stages.c:1.4 Fri Jun 16 20:02:15 2000 +++ xc/extras/Mesa/src/stages.c Thu Nov 30 10:39:04 2000 @@ -1,9 +1,9 @@ /* * Mesa 3-D graphics library - * Version: 3.3 + * Version: 3.4 * - * Copyright (C) 1999 Brian Paul All Rights Reserved. + * Copyright (C) 1999-2000 Brian Paul All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), @@ -93,10 +93,18 @@ void gl_clean_color( struct vertex_buffer *VB ) { GLcontext *ctx = VB->ctx; +#ifdef VAO + struct gl_client_array *client_data = &ctx->Array.Current->Color; +#else struct gl_client_array *client_data = &ctx->Array.Color; +#endif GLvector4ub *col; +#ifdef VAO + if (!(ctx->Array.Current->Summary & VERT_RGBA)) +#else if (!(ctx->Array.Summary & VERT_RGBA)) +#endif client_data = &ctx->Fallback.Color; if (VB->Type == VB_CVA_PRECALC) { @@ -116,10 +124,18 @@ static void clean_index( struct vertex_buffer *VB ) { GLcontext *ctx = VB->ctx; +#ifdef VAO + struct gl_client_array *client_data = &ctx->Array.Current->Index; +#else struct gl_client_array *client_data = &ctx->Array.Index; +#endif GLvector1ui *index; +#ifdef VAO + if (!(ctx->Array.Current->Summary & VERT_INDEX)) +#else if (!(ctx->Array.Summary & VERT_INDEX)) +#endif client_data = &ctx->Fallback.Color; if (VB->Type == VB_CVA_PRECALC) { @@ -140,10 +156,18 @@ static void clean_edgeflag( struct vertex_buffer *VB ) { GLcontext *ctx = VB->ctx; +#ifdef VAO + struct gl_client_array *client_data = &ctx->Array.Current->EdgeFlag; +#else struct gl_client_array *client_data = &ctx->Array.EdgeFlag; +#endif GLvector1ub *edge; +#ifdef VAO + if (!(ctx->Array.Current->Summary & VERT_EDGE)) +#else if (!(ctx->Array.Summary & VERT_EDGE)) +#endif client_data = &ctx->Fallback.EdgeFlag; if (VB->Type == VB_CVA_PRECALC) { @@ -164,11 +188,19 @@ static void clean_texcoord( struct vertex_buffer *VB, GLuint i ) { GLcontext *ctx = VB->ctx; +#ifdef VAO + struct gl_client_array *client_data = &ctx->Array.Current->TexCoord[i]; +#else struct gl_client_array *client_data = &ctx->Array.TexCoord[i]; +#endif GLvector4f *tc; GLuint flag = PIPE_TEX(i); +#ifdef VAO + if (!(ctx->Array.Current->Summary & flag)) +#else if (!(ctx->Array.Summary & flag)) +#endif client_data = &ctx->Fallback.TexCoord[i]; if (VB->Type == VB_CVA_PRECALC) { @@ -185,11 +217,18 @@ tc->stride = 4 * sizeof(GLfloat); } +static void clean_unprojected( struct vertex_buffer *VB ) +{ + (void) Transform( &VB->Eye, + &gl_identity_mat, + VB->Unprojected, + 0, + 0); + VB->Unprojected = &VB->Eye; +} static void clean_clip( struct vertex_buffer *VB ) { -/* printf("clean clip, stride %d, not writable\n", VB->ClipPtr->stride); */ - (void) Transform( &VB->Clip, &gl_identity_mat, VB->ClipPtr, @@ -329,7 +368,11 @@ } if (VB->ClipAndMask) { + if (MESA_VERBOSE&VERBOSE_CULL) + fprintf(stderr, "Culled in clip\n"); + VB->Culled = 1; + gl_dont_cull_vb( VB ); gl_update_materials(VB); return; } @@ -344,6 +387,7 @@ if (MESA_VERBOSE&VERBOSE_CULL) fprintf(stderr, "Culled in userclip\n"); + gl_dont_cull_vb( VB ); gl_update_materials(VB); return; } @@ -436,12 +480,23 @@ static void do_lighting( struct vertex_buffer *VB ) { - GLubyte flags = (GLubyte) (VB->CullMode & (CULL_MASK_ACTIVE|COMPACTED_NORMALS)); + GLubyte flags = (GLubyte) (VB->CullMode & + (CULL_MASK_ACTIVE|COMPACTED_NORMALS)); if ((flags&CULL_MASK_ACTIVE) && !VB->NormCullStart) gl_make_normal_cullmask( VB ); + + /* Make sure we can talk about elements 0..2 in the vector we are + * lighting. + */ + if (VB->Unprojected && VB->Unprojected->size == 2) { + if (VB->Unprojected->flags & VEC_WRITABLE) + gl_vector4f_clean_elem(VB->Unprojected, VB->Count, 2); + else + clean_unprojected( VB ); + } - gl_shade_func_tab[VB->ctx->shade_func_flags | flags]( VB ); + VB->ctx->shade_func_tab[flags]( VB ); } @@ -751,8 +806,8 @@ PIPE_OP_TEX0, PIPE_PRECALC|PIPE_IMMEDIATE, 0, - NEW_TEXTURING|NEW_TEXTURE_MATRIX, - NEW_TEXTURING|NEW_TEXTURE_MATRIX, + NEW_TEXTURING|NEW_TEXTURE_MATRIX|NEW_TEXTURE_ENABLE, + NEW_TEXTURING|NEW_TEXTURE_MATRIX|NEW_TEXTURE_ENABLE, 0, 0, DYN_STATE, check_texture_0, @@ -762,8 +817,8 @@ PIPE_OP_TEX1, PIPE_PRECALC|PIPE_IMMEDIATE, 0, - NEW_TEXTURING|NEW_TEXTURE_MATRIX, - NEW_TEXTURING|NEW_TEXTURE_MATRIX, + NEW_TEXTURING|NEW_TEXTURE_MATRIX|NEW_TEXTURE_ENABLE, + NEW_TEXTURING|NEW_TEXTURE_MATRIX|NEW_TEXTURE_ENABLE, 0, 0, DYN_STATE, check_texture_1, Index: xc/extras/Mesa/src/state.c diff -u xc/extras/Mesa/src/state.c:1.3 xc/extras/Mesa/src/state.c:1.7 --- xc/extras/Mesa/src/state.c:1.3 Fri Jun 16 20:02:15 2000 +++ xc/extras/Mesa/src/state.c Mon Nov 13 18:30:51 2000 @@ -1,7 +1,7 @@ /* * Mesa 3-D graphics library - * Version: 3.3 + * Version: 3.4 * * Copyright (C) 1999-2000 Brian Paul All Rights Reserved. * @@ -774,10 +774,10 @@ static void update_fog_mode( GLcontext *ctx ) { - int old_mode = ctx->FogMode; + const GLuint old_mode = ctx->FogMode; if (ctx->Fog.Enabled) { - if (ctx->Texture.Enabled) + if (ctx->Texture.ReallyEnabled) ctx->FogMode = FOG_FRAGMENT; else if (ctx->Hint.Fog == GL_NICEST) ctx->FogMode = FOG_FRAGMENT; @@ -845,17 +845,15 @@ ctx->RasterMask |= MULTI_DRAW_BIT; ctx->TriangleCaps |= DD_MULTIDRAW; } - else if (ctx->Visual->RGBAflag && ctx->Color.ColorMask==0) { + else if (ctx->Visual->RGBAflag && *((GLuint *) ctx->Color.ColorMask) == 0) { /* all RGBA channels disabled */ ctx->RasterMask |= MULTI_DRAW_BIT; ctx->TriangleCaps |= DD_MULTIDRAW; - ctx->Color.DrawDestMask = 0; } else if (!ctx->Visual->RGBAflag && ctx->Color.IndexMask==0) { /* all color index bits disabled */ ctx->RasterMask |= MULTI_DRAW_BIT; ctx->TriangleCaps |= DD_MULTIDRAW; - ctx->Color.DrawDestMask = 0; } } @@ -923,8 +921,9 @@ gl_update_client_state( ctx ); if ((ctx->NewState & NEW_TEXTURE_ENABLE) && - (ctx->Enabled & ENABLE_TEX_ANY) != ctx->Texture.Enabled) + (ctx->Enabled & ENABLE_TEX_ANY) != ctx->Texture.ReallyEnabled) { ctx->NewState |= NEW_TEXTURING | NEW_RASTER_OPS; + } if (ctx->NewState & NEW_TEXTURE_ENV) { if (ctx->Texture.Unit[0].EnvMode == ctx->Texture.Unit[0].LastEnvMode && @@ -934,21 +933,23 @@ ctx->Texture.Unit[1].LastEnvMode = ctx->Texture.Unit[1].EnvMode; } - if (ctx->NewState & NEW_TEXTURE_MATRIX) { - ctx->Enabled &= ~(ENABLE_TEXMAT0|ENABLE_TEXMAT1); + /* Update ctx->Enabled's ENABLE_TEXMATn flags */ + if (ctx->NewState & (NEW_TEXTURE_MATRIX | NEW_TEXTURE_ENABLE)) { + ctx->Enabled &= ~(ENABLE_TEXMAT0 | ENABLE_TEXMAT1); for (i=0; i < MAX_TEXTURE_UNITS; i++) { if (ctx->TextureMatrix[i].flags & MAT_DIRTY_ALL_OVER) { gl_matrix_analyze( &ctx->TextureMatrix[i] ); ctx->TextureMatrix[i].flags &= ~MAT_DIRTY_DEPENDENTS; - - if (ctx->Texture.Unit[i].Enabled && - ctx->TextureMatrix[i].type != MATRIX_IDENTITY) - ctx->Enabled |= ENABLE_TEXMAT0 << i; } + if (ctx->Texture.Unit[i].Enabled && + ctx->TextureMatrix[i].type != MATRIX_IDENTITY) { + ctx->Enabled |= ENABLE_TEXMAT0 << i; + } } } + /* Update ctx->Enabled's ENABLE_TEXGENn and ENABLE_TEXn flags */ if (ctx->NewState & (NEW_TEXTURING | NEW_TEXTURE_ENABLE)) { ctx->Texture.NeedNormals = GL_FALSE; gl_update_dirty_texobjs(ctx); @@ -975,9 +976,11 @@ } } } + else { + ctx->Texture.Unit[i].ReallyEnabled = 0; + } } - - ctx->Texture.Enabled = ctx->Enabled & ENABLE_TEX_ANY; + ctx->Enabled = (ctx->Enabled & ~ENABLE_TEX_ANY) | ctx->Texture.ReallyEnabled; ctx->NeedNormals = (ctx->Light.Enabled || ctx->Texture.NeedNormals); } @@ -1062,11 +1065,6 @@ ctx->Polygon.OffsetLine || ctx->Polygon.OffsetFill) ctx->TriangleCaps |= DD_TRI_OFFSET; - - /* reset Z offsets now */ - ctx->PointZoffset = 0.0; - ctx->LineZoffset = 0.0; - ctx->PolygonZoffset = 0.0; } } @@ -1183,19 +1181,19 @@ ctx->NeedEyeNormals = GL_FALSE; if (ctx->Light.Enabled) { - if (ctx->Light.Flags & LIGHT_POSITIONAL) { - /* Need length for attenuation */ - if (!TEST_MAT_FLAGS( &ctx->ModelView, MAT_FLAGS_LENGTH_PRESERVING)) - ctx->NeedEyeCoords = GL_TRUE; - } else if (ctx->Light.NeedVertices) { - /* Need angle for spot calculations */ - if (!TEST_MAT_FLAGS( &ctx->ModelView, MAT_FLAGS_ANGLE_PRESERVING)) - ctx->NeedEyeCoords = GL_TRUE; + if ((ctx->Light.Flags & LIGHT_POSITIONAL) || + ctx->Light.NeedVertices || + !TEST_MAT_FLAGS( &ctx->ModelView, MAT_FLAGS_LENGTH_PRESERVING)) { + /* Need length for attenuation or need angle for spotlights + * or non-uniform scale matrix + */ + ctx->NeedEyeCoords = GL_TRUE; } ctx->NeedEyeNormals = ctx->NeedEyeCoords; } - if (ctx->Texture.Enabled || ctx->RenderMode==GL_FEEDBACK) { - if (ctx->Texture.NeedEyeCoords) ctx->NeedEyeCoords = GL_TRUE; + if (ctx->Texture.ReallyEnabled || ctx->RenderMode==GL_FEEDBACK) { + if (ctx->Texture.NeedEyeCoords) + ctx->NeedEyeCoords = GL_TRUE; if (ctx->Texture.NeedNormals) ctx->NeedNormals = ctx->NeedEyeNormals = GL_TRUE; } Index: xc/extras/Mesa/src/stencil.c diff -u xc/extras/Mesa/src/stencil.c:1.4 xc/extras/Mesa/src/stencil.c:1.5 --- xc/extras/Mesa/src/stencil.c:1.4 Fri Jun 16 20:02:16 2000 +++ xc/extras/Mesa/src/stencil.c Thu Nov 30 10:39:04 2000 @@ -1,7 +1,7 @@ /* * Mesa 3-D graphics library - * Version: 3.3 + * Version: 3.4 * * Copyright (C) 1999-2000 Brian Paul All Rights Reserved. * @@ -1350,11 +1350,11 @@ const GLstencil clearVal = (ctx->Stencil.Clear & mask); GLstencil stencil[MAX_WIDTH]; GLint i; - (*ctx->Driver.ReadStencilSpan)(ctx, x, y, width, stencil); + (*ctx->Driver.ReadStencilSpan)(ctx, width, x, y, stencil); for (i = 0; i < width; i++) { stencil[i] = (stencil[i] & invMask) | clearVal; } - (*ctx->Driver.WriteStencilSpan)(ctx, x, y, width, stencil, NULL); + (*ctx->Driver.WriteStencilSpan)(ctx, width, x, y, stencil, NULL); } } else { @@ -1365,7 +1365,7 @@ stencil[i] = ctx->Stencil.Clear; } for (y = ctx->DrawBuffer->Ymin; y <= ctx->DrawBuffer->Ymax; y++) { - (*ctx->Driver.WriteStencilSpan)(ctx, x, y, width, stencil, NULL); + (*ctx->Driver.WriteStencilSpan)(ctx, width, x, y, stencil, NULL); } } } @@ -1383,11 +1383,11 @@ for (y = 0; y < height; y++) { GLstencil stencil[MAX_WIDTH]; GLuint i; - (*ctx->Driver.ReadStencilSpan)(ctx, x, y, width, stencil); + (*ctx->Driver.ReadStencilSpan)(ctx, width, x, y, stencil); for (i = 0; i < width; i++) { stencil[i] = (stencil[i] & invMask) | clearVal; } - (*ctx->Driver.WriteStencilSpan)(ctx, x, y, width, stencil, NULL); + (*ctx->Driver.WriteStencilSpan)(ctx, width, x, y, stencil, NULL); } } else { @@ -1401,7 +1401,7 @@ stencil[i] = ctx->Stencil.Clear; } for (y = 0; y < height; y++) { - (*ctx->Driver.WriteStencilSpan)(ctx, x, y, width, stencil, NULL); + (*ctx->Driver.WriteStencilSpan)(ctx, width, x, y, stencil, NULL); } } } Index: xc/extras/Mesa/src/texgen_tmp.h diff -u xc/extras/Mesa/src/texgen_tmp.h:1.3 xc/extras/Mesa/src/texgen_tmp.h:1.6 --- xc/extras/Mesa/src/texgen_tmp.h:1.3 Tue Feb 15 02:12:36 2000 +++ xc/extras/Mesa/src/texgen_tmp.h Mon Nov 13 18:30:51 2000 @@ -290,10 +290,10 @@ GLfloat (*f)[3], *m; if (!VB->tmp_f) - VB->tmp_f = (GLfloat (*)[3])malloc(VB->Size * sizeof(GLfloat) * 3); + VB->tmp_f = (GLfloat (*)[3]) MALLOC(VB->Size * sizeof(GLfloat) * 3); if (!VB->tmp_m) - VB->tmp_m = (GLfloat *)malloc(VB->Size * sizeof(GLfloat)); + VB->tmp_m = (GLfloat *) MALLOC(VB->Size * sizeof(GLfloat)); f = VB->tmp_f; m = VB->tmp_m; @@ -349,10 +349,10 @@ LOCAL_VARS; if (!VB->tmp_f) - VB->tmp_f = (GLfloat (*)[3])malloc(VB->Size * sizeof(GLfloat) * 3); + VB->tmp_f = (GLfloat (*)[3]) MALLOC(VB->Size * sizeof(GLfloat) * 3); if (!VB->tmp_m) - VB->tmp_m = (GLfloat *)malloc(VB->Size * sizeof(GLfloat)); + VB->tmp_m = (GLfloat *) MALLOC(VB->Size * sizeof(GLfloat)); f = VB->tmp_f; m = VB->tmp_m; Index: xc/extras/Mesa/src/teximage.c diff -u xc/extras/Mesa/src/teximage.c:1.7 xc/extras/Mesa/src/teximage.c:1.13 --- xc/extras/Mesa/src/teximage.c:1.7 Tue Jun 20 01:08:17 2000 +++ xc/extras/Mesa/src/teximage.c Thu Nov 30 10:39:04 2000 @@ -1,7 +1,7 @@ /* * Mesa 3-D graphics library - * Version: 3.3 + * Version: 3.4 * * Copyright (C) 1999-2000 Brian Paul All Rights Reserved. * @@ -52,50 +52,50 @@ #ifdef DEBUG static void PrintTexture(const struct gl_texture_image *img) { - int i, j, c; - GLubyte *data = img->Data; + GLuint i, j, c; + GLubyte *data = img->Data; - if (!data) { - printf("No texture data\n"); - return; - } - - switch (img->Format) { - case GL_ALPHA: - case GL_LUMINANCE: - case GL_INTENSITY: - case GL_COLOR_INDEX: - c = 1; - break; - case GL_LUMINANCE_ALPHA: - c = 2; - break; - case GL_RGB: - c = 3; - break; - case GL_RGBA: - c = 4; - break; - default: - gl_problem(NULL, "error in PrintTexture\n"); - return; - } - - - for (i = 0; i < img->Height; i++) { - for (j = 0; j < img->Width; j++) { - if (c==1) - printf("%02x ", data[0]); - else if (c==2) - printf("%02x%02x ", data[0], data[1]); - else if (c==3) - printf("%02x%02x%02x ", data[0], data[1], data[2]); - else if (c==4) - printf("%02x%02x%02x%02x ", data[0], data[1], data[2], data[3]); - data += c; - } - printf("\n"); - } + if (!data) { + printf("No texture data\n"); + return; + } + + switch (img->Format) { + case GL_ALPHA: + case GL_LUMINANCE: + case GL_INTENSITY: + case GL_COLOR_INDEX: + c = 1; + break; + case GL_LUMINANCE_ALPHA: + c = 2; + break; + case GL_RGB: + c = 3; + break; + case GL_RGBA: + c = 4; + break; + default: + gl_problem(NULL, "error in PrintTexture\n"); + return; + } + + + for (i = 0; i < img->Height; i++) { + for (j = 0; j < img->Width; j++) { + if (c==1) + printf("%02x ", data[0]); + else if (c==2) + printf("%02x%02x ", data[0], data[1]); + else if (c==3) + printf("%02x%02x%02x ", data[0], data[1], data[2]); + else if (c==4) + printf("%02x%02x%02x%02x ", data[0], data[1], data[2], data[3]); + data += c; + } + printf("\n"); + } } #endif @@ -139,21 +139,23 @@ GLint _mesa_base_tex_format( GLcontext *ctx, GLint format ) { + /* + * Ask the driver for the base format, if it doesn't + * know, it will return -1; + */ + if (ctx->Driver.BaseCompressedTexFormat) { + GLint ifmt = (*ctx->Driver.BaseCompressedTexFormat)(ctx, format); + if (ifmt >= 0) { + return ifmt; + } + } switch (format) { - case GL_COMPRESSED_ALPHA_ARB: - if (ctx && !ctx->Extensions.HaveTextureCompression) - return -1; - /* fall-through */ case GL_ALPHA: case GL_ALPHA4: case GL_ALPHA8: case GL_ALPHA12: case GL_ALPHA16: return GL_ALPHA; - case GL_COMPRESSED_LUMINANCE_ARB: - if (ctx && !ctx->Extensions.HaveTextureCompression) - return -1; - /* fall-through */ case 1: case GL_LUMINANCE: case GL_LUMINANCE4: @@ -161,10 +163,6 @@ case GL_LUMINANCE12: case GL_LUMINANCE16: return GL_LUMINANCE; - case GL_COMPRESSED_LUMINANCE_ALPHA_ARB: - if (ctx && !ctx->Extensions.HaveTextureCompression) - return -1; - /* fall-through */ case 2: case GL_LUMINANCE_ALPHA: case GL_LUMINANCE4_ALPHA4: @@ -174,31 +172,12 @@ case GL_LUMINANCE12_ALPHA12: case GL_LUMINANCE16_ALPHA16: return GL_LUMINANCE_ALPHA; - case GL_COMPRESSED_INTENSITY_ARB: - if (ctx && !ctx->Extensions.HaveTextureCompression) - return -1; - /* fall-through */ case GL_INTENSITY: case GL_INTENSITY4: case GL_INTENSITY8: case GL_INTENSITY12: case GL_INTENSITY16: return GL_INTENSITY; - case GL_COMPRESSED_RGB_ARB: - if (ctx && ctx->Extensions.HaveTextureCompression) - return GL_RGB; - else - return -1; - case GL_COMPRESSED_RGB_FXT1_3DFX: - if (ctx && ctx->Extensions.HaveTextureCompressionFXT1) - return GL_RGB; - else - return -1; - case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: - if (ctx && ctx->Extensions.HaveTextureCompressionS3TC) - return GL_RGB; - else - return -1; case 3: case GL_RGB: case GL_R3_G3_B2: @@ -209,23 +188,6 @@ case GL_RGB12: case GL_RGB16: return GL_RGB; - case GL_COMPRESSED_RGBA_ARB: - if (ctx && ctx->Extensions.HaveTextureCompression) - return GL_RGBA; - else - return -1; - case GL_COMPRESSED_RGBA_FXT1_3DFX: - if (ctx && ctx->Extensions.HaveTextureCompressionFXT1) - return GL_RGBA; - else - return -1; - case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: - case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT: - case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT: - if (ctx && ctx->Extensions.HaveTextureCompressionS3TC) - return GL_RGBA; - else - return -1; case 4: case GL_RGBA: case GL_RGBA2: @@ -328,25 +290,12 @@ * otherwise. */ static GLboolean -is_compressed_format(GLenum internalFormat) +is_compressed_format(GLcontext *ctx, GLenum internalFormat) { - switch (internalFormat) { - case GL_COMPRESSED_ALPHA_ARB: - case GL_COMPRESSED_LUMINANCE_ARB: - case GL_COMPRESSED_LUMINANCE_ALPHA_ARB: - case GL_COMPRESSED_INTENSITY_ARB: - case GL_COMPRESSED_RGB_ARB: - case GL_COMPRESSED_RGBA_ARB: - case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: - case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: - case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT: - case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT: - case GL_COMPRESSED_RGB_FXT1_3DFX: - case GL_COMPRESSED_RGBA_FXT1_3DFX: - return GL_TRUE; - default: - return GL_FALSE; - } + if (ctx->Driver.IsCompressedFormat) { + return (*ctx->Driver.IsCompressedFormat)(ctx, internalFormat); + } + return GL_FALSE; } @@ -511,13 +460,14 @@ * Initialize most fields of a gl_texture_image struct. */ static void -init_texture_image( struct gl_texture_image *img, +init_texture_image( GLcontext *ctx, + struct gl_texture_image *img, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum internalFormat ) { ASSERT(img); ASSERT(!img->Data); - img->Format = (GLenum) _mesa_base_tex_format(NULL, internalFormat); + img->Format = (GLenum) _mesa_base_tex_format(ctx, internalFormat); set_teximage_component_sizes( img ); img->IntFormat = (GLenum) internalFormat; img->Border = border; @@ -537,7 +487,7 @@ img->Height2 = 1 << img->HeightLog2; img->Depth2 = 1 << img->DepthLog2; img->MaxLog2 = MAX2(img->WidthLog2, img->HeightLog2); - img->IsCompressed = is_compressed_format(internalFormat); + img->IsCompressed = is_compressed_format(ctx, internalFormat); } @@ -556,13 +506,26 @@ /* * Return number of bytes of storage needed to store a compressed texture - * image. + * image. Only the driver knows for sure. If the driver can't help us, + * we must return 0. */ GLuint -_mesa_compressed_image_size(GLenum internalFormat, - GLint width, GLint height, GLint depth) -{ - return 0; +_mesa_compressed_image_size(GLcontext *ctx, + GLenum internalFormat, + GLint numDimensions, + GLint width, + GLint height, + GLint depth) +{ + if (ctx->Driver.CompressedImageSize) { + return (*ctx->Driver.CompressedImageSize)(ctx, internalFormat, + numDimensions, + width, height, depth); + } + else { + /* Shouldn't this be an internal error of some sort? */ + return 0; + } } @@ -735,7 +698,7 @@ && !ctx->Pixel.IndexOffset && !ctx->Pixel.IndexShift && srcType == GL_UNSIGNED_BYTE && depth == 1) { - if (srcFormat == internalFormat || + if ((GLint) srcFormat == internalFormat || (srcFormat == GL_LUMINANCE && internalFormat == 1) || (srcFormat == GL_LUMINANCE_ALPHA && internalFormat == 2) || (srcFormat == GL_RGB && internalFormat == 3) || @@ -861,13 +824,14 @@ }; GLubyte *imgPtr = texImage->Data; - GLint i, j, k; + GLuint i, j; + GLint k; for (i = 0; i < texImage->Height; i++) { GLint srcRow = 7 - i % 8; for (j = 0; j < texImage->Width; j++) { GLint srcCol = j % 32; GLint texel = (message[srcRow][srcCol]=='X') ? 255 : 70; - for (k=0;kFormat = 0; + img->IntFormat = 0; + img->RedBits = 0; + img->GreenBits = 0; + img->BlueBits = 0; + img->AlphaBits = 0; + img->IntensityBits = 0; + img->LuminanceBits = 0; + img->IndexBits = 0; + img->Border = 0; + img->Width = 0; + img->Height = 0; + img->Depth = 0; + img->Width2 = 0; + img->Height2 = 0; + img->Depth2 = 0; + img->WidthLog2 = 0; + img->HeightLog2 = 0; + img->DepthLog2 = 0; + img->Data = NULL; + img->IsCompressed = 0; + img->CompressedSize = 0; +} + + + +/* * Test glTexImage[123]D() parameters for errors. * Input: * dimensions - must be 1 or 2 or 3 @@ -999,7 +997,7 @@ return GL_TRUE; } - if (!is_compressed_format(internalFormat)) { + if (!is_compressed_format(ctx, internalFormat)) { if (!_mesa_is_legal_format_and_type( format, type )) { /* Yes, generate GL_INVALID_OPERATION, not GL_INVALID_ENUM, if there * is a type/format mismatch. See 1.2 spec page 94, sec 3.6.4. @@ -1125,7 +1123,7 @@ } } - if (!is_compressed_format(destTex->IntFormat)) { + if (!is_compressed_format(ctx, destTex->IntFormat)) { if (!_mesa_is_legal_format_and_type(format, type)) { char message[100]; sprintf(message, "glTexSubImage%dD(format or type)", dimensions); @@ -1344,6 +1342,103 @@ /* + * Turn generic compressed formats into specific compressed format. + * Some of the compressed formats we don't support, so we + * fall back to the uncompressed format. (See issue 15 of + * the GL_ARB_texture_compression specification.) + */ +static GLint +get_specific_compressed_tex_format(GLcontext *ctx, + GLint ifmt, GLint numDimensions, + GLint *levelp, + GLsizei *widthp, + GLsizei *heightp, + GLsizei *depthp, + GLint *borderp, + GLenum *formatp, + GLenum *typep) +{ + char message[100]; + GLint internalFormat = ifmt; + + if (ctx->Extensions.HaveTextureCompression + && ctx->Driver.SpecificCompressedTexFormat) { + /* + * First, ask the driver for the specific format. + * We do this for all formats, since we may want to + * fake one compressed format for another. + */ + internalFormat = (*ctx->Driver.SpecificCompressedTexFormat) + (ctx, internalFormat, numDimensions, + levelp, + widthp, heightp, depthp, + borderp, formatp, typep); + } + + /* + * Now, convert any generic format left to an uncompressed + * specific format. If the driver does not support compression + * of the format, we must drop back to the uncompressed format. + * See issue 15 of the GL_ARB_texture_compression specification. + */ + switch (internalFormat) { + case GL_COMPRESSED_ALPHA_ARB: + if (ctx && !ctx->Extensions.HaveTextureCompression) { + sprintf(message, "glTexImage%dD(internalFormat)", numDimensions); + gl_error(ctx, GL_INVALID_VALUE, message); + return -1; + } + internalFormat = GL_ALPHA; + break; + case GL_COMPRESSED_LUMINANCE_ARB: + if (ctx && !ctx->Extensions.HaveTextureCompression) { + sprintf(message, "glTexImage%dD(internalFormat)", numDimensions); + gl_error(ctx, GL_INVALID_VALUE, message); + return -1; + } + internalFormat = GL_LUMINANCE; + break; + case GL_COMPRESSED_LUMINANCE_ALPHA_ARB: + if (ctx && !ctx->Extensions.HaveTextureCompression) { + sprintf(message, "glTexImage%dD(internalFormat)", numDimensions); + gl_error(ctx, GL_INVALID_VALUE, message); + return -1; + } + internalFormat = GL_LUMINANCE_ALPHA; + break; + case GL_COMPRESSED_INTENSITY_ARB: + if (ctx && !ctx->Extensions.HaveTextureCompression) { + sprintf(message, "glTexImage%dD(internalFormat)", numDimensions); + gl_error(ctx, GL_INVALID_VALUE, message); + return -1; + } + internalFormat = GL_INTENSITY; + break; + case GL_COMPRESSED_RGB_ARB: + if (ctx && !ctx->Extensions.HaveTextureCompression) { + sprintf(message, "glTexImage%dD(internalFormat)", numDimensions); + gl_error(ctx, GL_INVALID_VALUE, message); + return -1; + } + internalFormat = GL_RGB; + break; + case GL_COMPRESSED_RGBA_ARB: + if (ctx && !ctx->Extensions.HaveTextureCompression) { + sprintf(message, "glTexImage%dD(internalFormat)", numDimensions); + gl_error(ctx, GL_INVALID_VALUE, message); + return -1; + } + internalFormat = GL_RGBA; + break; + default: + /* silence compiler warning */ + ; + } + return internalFormat; +} + + +/* * Called from the API. Note that width includes the border. */ void @@ -1358,7 +1453,23 @@ struct gl_texture_unit *texUnit; struct gl_texture_object *texObj; struct gl_texture_image *texImage; + GLint ifmt; + ifmt = get_specific_compressed_tex_format(ctx, internalFormat, 1, + &level, + &width, 0, 0, + &border, &format, &type); + if (ifmt < 0) { + /* + * The error here is that we were sent a generic compressed + * format, but the extension is not supported. + */ + return; + } + else { + internalFormat = ifmt; + } + if (texture_error_check(ctx, target, level, internalFormat, format, type, 1, width, 1, 1, border)) { return; /* error in texture image was detected */ @@ -1382,7 +1493,7 @@ } /* setup the teximage struct's fields */ - init_texture_image(texImage, width, 1, 1, border, internalFormat); + init_texture_image(ctx, texImage, width, 1, 1, border, internalFormat); /* process the texture image */ if (pixels) { @@ -1427,19 +1538,24 @@ gl_put_texobj_on_dirty_list( ctx, texObj ); ctx->NewState |= NEW_TEXTURING; } - else if (target==GL_PROXY_TEXTURE_1D) { + else if (target == GL_PROXY_TEXTURE_1D) { /* Proxy texture: check for errors and update proxy state */ - if (texture_error_check(ctx, target, level, internalFormat, - format, type, 1, width, 1, 1, border)) { + GLenum error = texture_error_check(ctx, target, level, internalFormat, + format, type, 1, width, 1, 1, border); + if (!error && ctx->Driver.TestProxyTexImage) { + error = !(*ctx->Driver.TestProxyTexImage)(ctx, target, level, + internalFormat, format, type, + width, 1, 1, border); + } + if (error) { /* if error, clear all proxy texture image parameters */ if (level>=0 && levelConst.MaxTextureLevels) { - MEMSET( ctx->Texture.Proxy1D->Image[level], 0, - sizeof(struct gl_texture_image) ); + clear_proxy_teximage(ctx->Texture.Proxy1D->Image[level]); } } else { /* if no error, update proxy texture image parameters */ - init_texture_image(ctx->Texture.Proxy1D->Image[level], + init_texture_image(ctx, ctx->Texture.Proxy1D->Image[level], width, 1, 1, border, internalFormat); } } @@ -1466,7 +1582,23 @@ struct gl_texture_unit *texUnit; struct gl_texture_object *texObj; struct gl_texture_image *texImage; + GLint ifmt; + ifmt = get_specific_compressed_tex_format(ctx, internalFormat, 2, + &level, + &width, &height, 0, + &border, &format, &type); + if (ifmt < 0) { + /* + * The error here is that we were sent a generic compressed + * format, but the extension is not supported. + */ + return; + } + else { + internalFormat = ifmt; + } + if (texture_error_check(ctx, target, level, internalFormat, format, type, 2, width, height, 1, border)) { return; /* error in texture image was detected */ @@ -1491,7 +1623,8 @@ } /* setup the teximage struct's fields */ - init_texture_image(texImage, width, height, 1, border, internalFormat); + init_texture_image(ctx, texImage, width, height, + 1, border, internalFormat); /* process the texture image */ if (pixels) { @@ -1545,19 +1678,25 @@ gl_put_texobj_on_dirty_list( ctx, texObj ); ctx->NewState |= NEW_TEXTURING; } - else if (target==GL_PROXY_TEXTURE_2D) { + else if (target == GL_PROXY_TEXTURE_2D) { /* Proxy texture: check for errors and update proxy state */ - if (texture_error_check(ctx, target, level, internalFormat, - format, type, 2, width, height, 1, border)) { + GLenum error = texture_error_check(ctx, target, level, internalFormat, + format, type, 2, width, height, 1, border); + if (!error && ctx->Driver.TestProxyTexImage) { + error = !(*ctx->Driver.TestProxyTexImage)(ctx, target, level, + internalFormat, format, type, + width, height, 1, border); + } + if (error) { /* if error, clear all proxy texture image parameters */ if (level>=0 && levelConst.MaxTextureLevels) { - MEMSET( ctx->Texture.Proxy2D->Image[level], 0, - sizeof(struct gl_texture_image) ); + clear_proxy_teximage(ctx->Texture.Proxy2D->Image[level]); } } else { /* if no error, update proxy texture image parameters */ - init_texture_image(ctx->Texture.Proxy1D->Image[level], + init_texture_image(ctx, + ctx->Texture.Proxy2D->Image[level], width, height, 1, border, internalFormat); } } @@ -1568,7 +1707,6 @@ } - /* * Called by the API or display list executor. * Note that width and height include the border. @@ -1586,6 +1724,23 @@ struct gl_texture_unit *texUnit; struct gl_texture_object *texObj; struct gl_texture_image *texImage; + GLint ifmt; + + ifmt = get_specific_compressed_tex_format(ctx, internalFormat, 3, + &level, + &width, &height, &depth, + &border, &format, &type); + if (ifmt < 0) { + /* + * The error here is that we were sent a generic compressed + * format, but the extension is not supported. + */ + return; + } + else { + internalFormat = ifmt; + } + if (texture_error_check(ctx, target, level, internalFormat, format, type, 3, width, height, depth, border)) { return; /* error in texture image was detected */ @@ -1609,7 +1764,7 @@ } /* setup the teximage struct's fields */ - init_texture_image(texImage, width, height, depth, + init_texture_image(ctx, texImage, width, height, depth, border, internalFormat); /* process the texture image */ @@ -1655,19 +1810,24 @@ gl_put_texobj_on_dirty_list( ctx, texObj ); ctx->NewState |= NEW_TEXTURING; } - else if (target==GL_PROXY_TEXTURE_3D) { + else if (target == GL_PROXY_TEXTURE_3D) { /* Proxy texture: check for errors and update proxy state */ - if (texture_error_check(ctx, target, level, internalFormat, - format, type, 3, width, height, depth, border)) { + GLenum error = texture_error_check(ctx, target, level, internalFormat, + format, type, 3, width, height, depth, border); + if (!error && ctx->Driver.TestProxyTexImage) { + error = !(*ctx->Driver.TestProxyTexImage)(ctx, target, level, + internalFormat, format, type, + width, height, depth, border); + } + if (error) { /* if error, clear all proxy texture image parameters */ if (level>=0 && levelConst.MaxTextureLevels) { - MEMSET( ctx->Texture.Proxy3D->Image[level], 0, - sizeof(struct gl_texture_image) ); + clear_proxy_teximage(ctx->Texture.Proxy3D->Image[level]); } } else { /* if no error, update proxy texture image parameters */ - init_texture_image(ctx->Texture.Proxy1D->Image[level], + init_texture_image(ctx, ctx->Texture.Proxy3D->Image[level], width, height, depth, border, internalFormat); } } @@ -1780,6 +1940,56 @@ } +/* + * Get all the mipmap images for a texture object from the device driver. + * Actually, only get mipmap images if we're using a mipmap filter. + */ +GLboolean +_mesa_get_teximages_from_driver(GLcontext *ctx, + struct gl_texture_object *texObj) +{ + if (ctx->Driver.GetTexImage) { + static const GLenum targets[] = { + GL_TEXTURE_1D, + GL_TEXTURE_2D, + GL_TEXTURE_3D, + GL_TEXTURE_CUBE_MAP_ARB, + GL_TEXTURE_CUBE_MAP_ARB, + GL_TEXTURE_CUBE_MAP_ARB + }; + GLboolean needLambda = (texObj->MinFilter != texObj->MagFilter); + GLenum target = targets[texObj->Dimensions - 1]; + if (needLambda) { + GLint level; + /* Get images for all mipmap levels. We might not need them + * all but this is easier. We're on a (slow) software path + * anyway. + */ + for (level = 0; level <= texObj->P; level++) { + struct gl_texture_image *texImg = texObj->Image[level]; + if (texImg && !texImg->Data) { + _mesa_get_teximage_from_driver(ctx, target, level, texObj); + if (!texImg->Data) + return GL_FALSE; /* out of memory */ + } + } + } + else { + GLint level = texObj->BaseLevel; + struct gl_texture_image *texImg = texObj->Image[level]; + if (texImg && !texImg->Data) { + _mesa_get_teximage_from_driver(ctx, target, level, texObj); + if (!texImg->Data) + return GL_FALSE; /* out of memory */ + } + } + return GL_TRUE; + } + return GL_FALSE; +} + + + void _mesa_GetTexImage( GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels ) @@ -1943,7 +2153,7 @@ default: gl_problem( ctx, "bad format in gl_GetTexImage" ); } - _mesa_pack_rgba_span( ctx, width, (const GLubyte (*)[4])rgba, + _mesa_pack_rgba_span( ctx, width, (CONST GLubyte (*)[4])rgba, format, type, dest, &ctx->Pack, GL_TRUE ); } } @@ -2097,8 +2307,9 @@ /* color index texture */ GLubyte *dst = texImage->Data + (yoffsetb * texImage->Width + xoffsetb) * texComponents; - const GLubyte *src = _mesa_image_address(&ctx->Unpack, pixels, - width, height, format, type, 0, 0, 0); + const GLubyte *src = (const GLubyte *) + _mesa_image_address(&ctx->Unpack, pixels, width, height, format, + type, 0, 0, 0); GLint row; for (row = 0; row < height; row++) { _mesa_unpack_index_span(ctx, width, GL_UNSIGNED_BYTE, dst, type, @@ -2111,8 +2322,9 @@ /* color texture */ GLubyte *dst = texImage->Data + (yoffsetb * texImage->Width + xoffsetb) * texComponents; - const GLubyte *src = _mesa_image_address(&ctx->Unpack, pixels, - width, height, format, type, 0, 0, 0); + const GLubyte *src = (const GLubyte *) + _mesa_image_address(&ctx->Unpack, pixels, width, height, format, + type, 0, 0, 0); GLint row; for (row = 0; row < height; row++) { _mesa_unpack_ubyte_color_span(ctx, width, texFormat, dst, format, @@ -2202,8 +2414,9 @@ /* color index texture */ GLint img, row; for (img = 0; img < depth; img++) { - const GLubyte *src = _mesa_image_address(&ctx->Unpack, pixels, - width, height, format, type, img, 0, 0); + const GLubyte *src = (const GLubyte *) + _mesa_image_address(&ctx->Unpack, pixels, width, height, + format, type, img, 0, 0); GLubyte *dst = texImage->Data + ((zoffsetb + img) * dstRectArea + yoffsetb * texWidth + xoffsetb) * texComponents; for (row = 0; row < height; row++) { @@ -2218,8 +2431,9 @@ /* color texture */ GLint img, row; for (img = 0; img < depth; img++) { - const GLubyte *src = _mesa_image_address(&ctx->Unpack, pixels, - width, height, format, type, img, 0, 0); + const GLubyte *src = (const GLubyte *) + _mesa_image_address(&ctx->Unpack, pixels, width, height, + format, type, img, 0, 0); GLubyte *dst = texImage->Data + ((zoffsetb + img) * dstRectArea + yoffsetb * texWidth + xoffsetb) * texComponents; for (row = 0; row < height; row++) { @@ -2272,6 +2486,8 @@ /* XXX TODO we have to apply pixel transfer ops here! */ + RENDER_START(ctx); + dst = image; stride = width * 4 * sizeof(GLubyte); for (i = 0; i < height; i++) { @@ -2280,6 +2496,8 @@ dst += stride; } + RENDER_FINISH(ctx); + /* Read from draw buffer (the default) */ (*ctx->Driver.SetReadBuffer)( ctx, ctx->DrawBuffer, ctx->Color.DriverDrawBuffer ); @@ -2511,10 +2729,25 @@ GET_CURRENT_CONTEXT(ctx); ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx, "glCompressedTexImage1DARB"); + switch (internalFormat) { + case GL_COMPRESSED_ALPHA_ARB: + case GL_COMPRESSED_LUMINANCE_ARB: + case GL_COMPRESSED_LUMINANCE_ALPHA_ARB: + case GL_COMPRESSED_INTENSITY_ARB: + case GL_COMPRESSED_RGB_ARB: + case GL_COMPRESSED_RGBA_ARB: + gl_error(ctx, GL_INVALID_ENUM, "glCompressedTexImage1DARB"); + return; + default: + /* silence compiler warning */ + ; + } + if (target == GL_TEXTURE_1D) { struct gl_texture_unit *texUnit; struct gl_texture_object *texObj; struct gl_texture_image *texImage; + GLsizei computedImageSize; if (texture_error_check(ctx, target, level, internalFormat, GL_NONE, GL_NONE, 1, width, 1, 1, border)) { @@ -2539,23 +2772,32 @@ } /* setup the teximage struct's fields */ - init_texture_image(texImage, width, 1, 1, border, internalFormat); + init_texture_image(ctx, texImage, width, 1, 1, + border, internalFormat); /* process the texture image */ if (data) { GLboolean retain = GL_TRUE; GLboolean success = GL_FALSE; if (ctx->Driver.CompressedTexImage1D) { - success = (*ctx->Driver.CompressedTexImage1D)( ctx, target, level, - data, texObj, texImage, &retain); + success = (*ctx->Driver.CompressedTexImage1D)(ctx, target, level, + imageSize, data, texObj, texImage, &retain); } if (retain || !success) { /* make internal copy of the texture image */ - GLuint imageSize = _mesa_compressed_image_size(internalFormat, - width, 1, 1); - texImage->Data = MALLOC(imageSize); + computedImageSize = _mesa_compressed_image_size(ctx, + internalFormat, + 1, /* num dims */ + width, + 1, /* height */ + 1); /* depth */ + if (computedImageSize != imageSize) { + gl_error(ctx, GL_INVALID_VALUE, "glCompressedTexImage1DARB(imageSize)"); + return; + } + texImage->Data = (GLubyte *) MALLOC(computedImageSize); if (texImage->Data) { - MEMCPY(texImage->Data, data, imageSize); + MEMCPY(texImage->Data, data, computedImageSize); } } if (!retain && texImage->Data) { @@ -2567,8 +2809,9 @@ make_null_texture(texImage); if (ctx->Driver.CompressedTexImage1D) { GLboolean retain; - (*ctx->Driver.CompressedTexImage1D)( ctx, target, level, - texImage->Data, texObj, texImage, &retain); + (*ctx->Driver.CompressedTexImage1D)(ctx, target, level, 0, + texImage->Data, texObj, + texImage, &retain); } } @@ -2578,17 +2821,22 @@ } else if (target == GL_PROXY_TEXTURE_1D) { /* Proxy texture: check for errors and update proxy state */ - if (texture_error_check(ctx, target, level, internalFormat, - GL_NONE, GL_NONE, 1, width, 1, 1, border)) { + GLenum error = texture_error_check(ctx, target, level, internalFormat, + GL_NONE, GL_NONE, 1, width, 1, 1, border); + if (!error && ctx->Driver.TestProxyTexImage) { + error = !(*ctx->Driver.TestProxyTexImage)(ctx, target, level, + internalFormat, GL_NONE, GL_NONE, + width, 1, 1, border); + } + if (error) { /* if error, clear all proxy texture image parameters */ if (level>=0 && levelConst.MaxTextureLevels) { - MEMSET( ctx->Texture.Proxy1D->Image[level], 0, - sizeof(struct gl_texture_image) ); + clear_proxy_teximage(ctx->Texture.Proxy1D->Image[level]); } } else { /* if no error, update proxy texture image parameters */ - init_texture_image(ctx->Texture.Proxy1D->Image[level], + init_texture_image(ctx, ctx->Texture.Proxy1D->Image[level], width, 1, 1, border, internalFormat); } } @@ -2608,6 +2856,20 @@ GET_CURRENT_CONTEXT(ctx); ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx, "glCompressedTexImage2DARB"); + switch (internalFormat) { + case GL_COMPRESSED_ALPHA_ARB: + case GL_COMPRESSED_LUMINANCE_ARB: + case GL_COMPRESSED_LUMINANCE_ALPHA_ARB: + case GL_COMPRESSED_INTENSITY_ARB: + case GL_COMPRESSED_RGB_ARB: + case GL_COMPRESSED_RGBA_ARB: + gl_error(ctx, GL_INVALID_ENUM, "glCompressedTexImage2DARB"); + return; + default: + /* silence compiler warning */ + ; + } + if (target==GL_TEXTURE_2D || (ctx->Extensions.HaveTextureCubeMap && target >= GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB && @@ -2615,6 +2877,7 @@ struct gl_texture_unit *texUnit; struct gl_texture_object *texObj; struct gl_texture_image *texImage; + GLsizei computedImageSize; if (texture_error_check(ctx, target, level, internalFormat, GL_NONE, GL_NONE, 1, width, height, 1, border)) { @@ -2639,23 +2902,37 @@ } /* setup the teximage struct's fields */ - init_texture_image(texImage, width, height, 1, border, internalFormat); + init_texture_image(ctx, texImage, width, height, 1, border, internalFormat); /* process the texture image */ if (data) { GLboolean retain = GL_TRUE; GLboolean success = GL_FALSE; if (ctx->Driver.CompressedTexImage2D) { - success = (*ctx->Driver.CompressedTexImage2D)( ctx, target, level, - data, texObj, texImage, &retain); + success = (*ctx->Driver.CompressedTexImage2D)( ctx, + target, + level, + imageSize, + data, + texObj, + texImage, + &retain); } if (retain || !success) { /* make internal copy of the texture image */ - GLuint imageSize = _mesa_compressed_image_size(internalFormat, - width, height, 1); - texImage->Data = MALLOC(imageSize); + computedImageSize = _mesa_compressed_image_size(ctx, + internalFormat, + 2, /* num dims */ + width, + height, + 1); /* depth */ + if (computedImageSize != imageSize) { + gl_error(ctx, GL_INVALID_VALUE, "glCompressedTexImage2DARB(imageSize)"); + return; + } + texImage->Data = (GLubyte *) MALLOC(computedImageSize); if (texImage->Data) { - MEMCPY(texImage->Data, data, imageSize); + MEMCPY(texImage->Data, data, computedImageSize); } } if (!retain && texImage->Data) { @@ -2667,8 +2944,9 @@ make_null_texture(texImage); if (ctx->Driver.CompressedTexImage2D) { GLboolean retain; - (*ctx->Driver.CompressedTexImage2D)( ctx, target, level, - texImage->Data, texObj, texImage, &retain); + (*ctx->Driver.CompressedTexImage2D)( ctx, target, level, 0, + texImage->Data, texObj, + texImage, &retain); } } @@ -2678,17 +2956,22 @@ } else if (target == GL_PROXY_TEXTURE_2D) { /* Proxy texture: check for errors and update proxy state */ - if (texture_error_check(ctx, target, level, internalFormat, - GL_NONE, GL_NONE, 1, width, 1, 1, border)) { + GLenum error = texture_error_check(ctx, target, level, internalFormat, + GL_NONE, GL_NONE, 2, width, height, 1, border); + if (!error && ctx->Driver.TestProxyTexImage) { + error = !(*ctx->Driver.TestProxyTexImage)(ctx, target, level, + internalFormat, GL_NONE, GL_NONE, + width, height, 1, border); + } + if (error) { /* if error, clear all proxy texture image parameters */ if (level>=0 && levelConst.MaxTextureLevels) { - MEMSET( ctx->Texture.Proxy2D->Image[level], 0, - sizeof(struct gl_texture_image) ); + clear_proxy_teximage(ctx->Texture.Proxy2D->Image[level]); } } else { /* if no error, update proxy texture image parameters */ - init_texture_image(ctx->Texture.Proxy2D->Image[level], + init_texture_image(ctx, ctx->Texture.Proxy2D->Image[level], width, 1, 1, border, internalFormat); } } @@ -2708,10 +2991,25 @@ GET_CURRENT_CONTEXT(ctx); ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx, "glCompressedTexImage3DARB"); + switch (internalFormat) { + case GL_COMPRESSED_ALPHA_ARB: + case GL_COMPRESSED_LUMINANCE_ARB: + case GL_COMPRESSED_LUMINANCE_ALPHA_ARB: + case GL_COMPRESSED_INTENSITY_ARB: + case GL_COMPRESSED_RGB_ARB: + case GL_COMPRESSED_RGBA_ARB: + gl_error(ctx, GL_INVALID_ENUM, "glCompressedTexImage3DARB"); + return; + default: + /* silence compiler warning */ + ; + } + if (target == GL_TEXTURE_3D) { struct gl_texture_unit *texUnit; struct gl_texture_object *texObj; struct gl_texture_image *texImage; + GLsizei computedImageSize; if (texture_error_check(ctx, target, level, internalFormat, GL_NONE, GL_NONE, 1, width, height, depth, border)) { @@ -2736,23 +3034,34 @@ } /* setup the teximage struct's fields */ - init_texture_image(texImage, width, height, depth, border, internalFormat); + init_texture_image(ctx, texImage, width, height, depth, + border, internalFormat); /* process the texture image */ if (data) { GLboolean retain = GL_TRUE; GLboolean success = GL_FALSE; if (ctx->Driver.CompressedTexImage3D) { - success = (*ctx->Driver.CompressedTexImage3D)( ctx, target, level, - data, texObj, texImage, &retain); + success = (*ctx->Driver.CompressedTexImage3D)(ctx, target, level, + imageSize, data, + texObj, texImage, + &retain); } if (retain || !success) { /* make internal copy of the texture image */ - GLuint imageSize = _mesa_compressed_image_size(internalFormat, - width, height, depth); - texImage->Data = MALLOC(imageSize); + computedImageSize = _mesa_compressed_image_size(ctx, + internalFormat, + 3, /* num dims */ + width, + height, + depth); + if (computedImageSize != imageSize) { + gl_error(ctx, GL_INVALID_VALUE, "glCompressedTexImage3DARB(imageSize)"); + return; + } + texImage->Data = (GLubyte *) MALLOC(computedImageSize); if (texImage->Data) { - MEMCPY(texImage->Data, data, imageSize); + MEMCPY(texImage->Data, data, computedImageSize); } } if (!retain && texImage->Data) { @@ -2764,8 +3073,9 @@ make_null_texture(texImage); if (ctx->Driver.CompressedTexImage3D) { GLboolean retain; - (*ctx->Driver.CompressedTexImage3D)( ctx, target, level, - texImage->Data, texObj, texImage, &retain); + (*ctx->Driver.CompressedTexImage3D)( ctx, target, level, 0, + texImage->Data, texObj, + texImage, &retain); } } @@ -2775,17 +3085,22 @@ } else if (target == GL_PROXY_TEXTURE_3D) { /* Proxy texture: check for errors and update proxy state */ - if (texture_error_check(ctx, target, level, internalFormat, - GL_NONE, GL_NONE, 1, width, height, depth, border)) { + GLenum error = texture_error_check(ctx, target, level, internalFormat, + GL_NONE, GL_NONE, 1, width, height, depth, border); + if (!error && ctx->Driver.TestProxyTexImage) { + error = !(*ctx->Driver.TestProxyTexImage)(ctx, target, level, + internalFormat, GL_NONE, GL_NONE, + width, height, depth, border); + } + if (error) { /* if error, clear all proxy texture image parameters */ if (level>=0 && levelConst.MaxTextureLevels) { - MEMSET( ctx->Texture.Proxy3D->Image[level], 0, - sizeof(struct gl_texture_image) ); + clear_proxy_teximage(ctx->Texture.Proxy3D->Image[level]); } } else { /* if no error, update proxy texture image parameters */ - init_texture_image(ctx->Texture.Proxy3D->Image[level], + init_texture_image(ctx, ctx->Texture.Proxy3D->Image[level], width, 1, 1, border, internalFormat); } } @@ -2829,7 +3144,6 @@ gl_problem(ctx, "glCompressedTexSubImage1DARB failed!"); return; } - } Index: xc/extras/Mesa/src/teximage.h diff -u xc/extras/Mesa/src/teximage.h:1.4 xc/extras/Mesa/src/teximage.h:1.8 --- xc/extras/Mesa/src/teximage.h:1.4 Fri Jun 16 20:02:17 2000 +++ xc/extras/Mesa/src/teximage.h Mon Nov 13 18:30:52 2000 @@ -1,7 +1,7 @@ /* * Mesa 3-D graphics library - * Version: 3.3 + * Version: 3.4 * * Copyright (C) 1999-2000 Brian Paul All Rights Reserved. * @@ -47,7 +47,9 @@ extern GLuint -_mesa_compressed_image_size(GLenum internalFormat, +_mesa_compressed_image_size(GLcontext *ctx, + GLenum internalFormat, + GLint numDimensions, GLint width, GLint height, GLint depth); @@ -62,8 +64,14 @@ extern void -_mesa_get_teximage_from_driver( GLcontext *ctx, GLenum target, GLint level, - const struct gl_texture_object *texObj ); +_mesa_get_teximage_from_driver(GLcontext *ctx, GLenum target, GLint level, + const struct gl_texture_object *texObj); + + +extern GLboolean +_mesa_get_teximages_from_driver(GLcontext *ctx, + struct gl_texture_object *texObj); + /*** API entry point functions ***/ Index: xc/extras/Mesa/src/texobj.c diff -u xc/extras/Mesa/src/texobj.c:1.4 xc/extras/Mesa/src/texobj.c:1.9 --- xc/extras/Mesa/src/texobj.c:1.4 Fri Jun 16 20:02:17 2000 +++ xc/extras/Mesa/src/texobj.c Thu Nov 30 10:39:05 2000 @@ -1,7 +1,7 @@ /* * Mesa 3-D graphics library - * Version: 3.3 + * Version: 3.4 * * Copyright (C) 1999-2000 Brian Paul All Rights Reserved. * @@ -62,11 +62,14 @@ if (obj) { /* init the non-zero fields */ + _glthread_INIT_MUTEX(obj->Mutex); obj->RefCount = 1; obj->Name = name; obj->Dimensions = dimensions; + obj->Priority = 1.0F; obj->WrapS = GL_REPEAT; obj->WrapT = GL_REPEAT; + obj->WrapR = GL_REPEAT; obj->MinFilter = GL_NEAREST_MIPMAP_LINEAR; obj->MagFilter = GL_LINEAR; obj->MinLod = -1000.0; @@ -156,6 +159,20 @@ /* + * This is helpful to diagnose incomplete texture problems. + */ +#if 0 +static void +incomplete(const struct gl_texture_object *t, const char *why) +{ + printf("Texture Obj %d incomplete because: %s\n", t->Name, why); +} +#else +#define incomplete(a, b) +#endif + + +/* * Examine a texture object to determine if it is complete or not. * The t->Complete flag will be set to GL_TRUE or GL_FALSE accordingly. */ @@ -169,6 +186,7 @@ /* Always need level zero image */ if (!t->Image[baseLevel]) { + incomplete(t, "Image[baseLevel] == NULL"); t->Complete = GL_FALSE; return; } @@ -212,6 +230,7 @@ t->NegZ[baseLevel]->Width2 != w || t->NegZ[baseLevel]->Height2 != h) { t->Complete = GL_FALSE; + incomplete(t, "Non-quare cubemap image"); return; } } @@ -227,6 +246,7 @@ if (minLevel > maxLevel) { t->Complete = GL_FALSE; + incomplete(t, "minLevel > maxLevel"); return; } @@ -235,10 +255,12 @@ if (t->Image[i]) { if (t->Image[i]->Format != t->Image[baseLevel]->Format) { t->Complete = GL_FALSE; + incomplete(t, "Format[i] != Format[baseLevel]"); return; } if (t->Image[i]->Border != t->Image[baseLevel]->Border) { t->Complete = GL_FALSE; + incomplete(t, "Border[i] != Border[baseLevel]"); return; } } @@ -255,10 +277,12 @@ if (i >= minLevel && i <= maxLevel) { if (!t->Image[i]) { t->Complete = GL_FALSE; + incomplete(t, "1D Image[i] == NULL"); return; } if (t->Image[i]->Width2 != width ) { t->Complete = GL_FALSE; + incomplete(t, "1D Image[i] bad width"); return; } } @@ -281,14 +305,17 @@ if (i >= minLevel && i <= maxLevel) { if (!t->Image[i]) { t->Complete = GL_FALSE; + incomplete(t, "2D Image[i] == NULL"); return; } if (t->Image[i]->Width2 != width) { t->Complete = GL_FALSE; + incomplete(t, "2D Image[i] bad width"); return; } if (t->Image[i]->Height2 != height) { t->Complete = GL_FALSE; + incomplete(t, "2D Image[i] bad height"); return; } if (width==1 && height==1) { @@ -314,19 +341,23 @@ } if (i >= minLevel && i <= maxLevel) { if (!t->Image[i]) { + incomplete(t, "3D Image[i] == NULL"); t->Complete = GL_FALSE; return; } if (t->Image[i]->Width2 != width) { t->Complete = GL_FALSE; + incomplete(t, "3D Image[i] bad width"); return; } if (t->Image[i]->Height2 != height) { t->Complete = GL_FALSE; + incomplete(t, "3D Image[i] bad height"); return; } if (t->Image[i]->Depth2 != depth) { t->Complete = GL_FALSE; + incomplete(t, "3D Image[i] bad depth"); return; } } @@ -352,6 +383,7 @@ !t->PosY[i] || !t->NegY[i] || !t->PosZ[i] || !t->NegZ[i]) { t->Complete = GL_FALSE; + incomplete(t, "CubeMap Image[i] == NULL"); return; } /* check that all six images have same size */ @@ -361,6 +393,7 @@ t->PosZ[i]->Width2!=width || t->PosZ[i]->Height2!=height || t->NegZ[i]->Width2!=width || t->NegZ[i]->Height2!=height) { t->Complete = GL_FALSE; + incomplete(t, "CubeMap Image[i] bad size"); return; } } @@ -391,11 +424,13 @@ GLint i; ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx, "glGenTextures"); - if (n<0) { + if (n < 0) { gl_error( ctx, GL_INVALID_VALUE, "glGenTextures" ); return; } + if (!texName) + return; /* * This must be atomic (generation and allocation of texture IDs) @@ -432,6 +467,9 @@ ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx, "glDeleteTextures"); + if (!texName) + return; + for (i=0;i0) { @@ -514,6 +552,8 @@ return; } + ctx->NewState |= NEW_TEXTURING; + if (oldTexObj->Name == texName) return; @@ -574,12 +614,9 @@ || (oldTexObj->Image[0] && newTexObj->Image[0] && (oldTexObj->Image[0]->Format!=newTexObj->Image[0]->Format)))) { - ctx->NewState |= (NEW_RASTER_OPS | NEW_TEXTURING); + ctx->NewState |= NEW_RASTER_OPS; } - if (oldTexObj->Complete != newTexObj->Complete) - ctx->NewState |= NEW_TEXTURING; - /* Pass BindTexture call to device driver */ if (ctx->Driver.BindTexture) { (*ctx->Driver.BindTexture)( ctx, target, newTexObj ); @@ -610,19 +647,20 @@ GLint i; ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx, "glPrioritizeTextures"); - if (n<0) { + if (n < 0) { gl_error( ctx, GL_INVALID_VALUE, "glPrioritizeTextures" ); return; } - for (i=0;i0) { - t = (struct gl_texture_object *) + if (!priorities) + return; + + for (i = 0; i < n; i++) { + if (texName[i] > 0) { + struct gl_texture_object *t = (struct gl_texture_object *) _mesa_HashLookup(ctx->Shared->TexObjects, texName[i]); if (t) { t->Priority = CLAMP( priorities[i], 0.0F, 1.0F ); - if (ctx->Driver.PrioritizeTexture) ctx->Driver.PrioritizeTexture( ctx, t, t->Priority ); } @@ -636,41 +674,47 @@ * Execute glAreTexturesResident */ GLboolean -_mesa_AreTexturesResident( GLsizei n, const GLuint *texName, - GLboolean *residences ) +_mesa_AreTexturesResident(GLsizei n, const GLuint *texName, + GLboolean *residences) { GET_CURRENT_CONTEXT(ctx); - GLboolean resident = GL_TRUE; + GLboolean allResident = GL_TRUE; GLint i; ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH_WITH_RETVAL(ctx, - "glAreTexturesResident", - GL_FALSE); - if (n<0) { - gl_error( ctx, GL_INVALID_VALUE, "glAreTexturesResident(n)" ); + "glAreTexturesResident", GL_FALSE); + if (n < 0) { + gl_error(ctx, GL_INVALID_VALUE, "glAreTexturesResident(n)"); return GL_FALSE; } - for (i=0;iShared->TexObjects, texName[i]); if (t) { - if (ctx->Driver.IsTextureResident) - residences[i] = ctx->Driver.IsTextureResident( ctx, t ); - else + if (ctx->Driver.IsTextureResident) { + residences[i] = ctx->Driver.IsTextureResident(ctx, t); + if (!residences[i]) + allResident = GL_FALSE; + } + else { residences[i] = GL_TRUE; + } } else { - gl_error( ctx, GL_INVALID_VALUE, "glAreTexturesResident(textures)" ); + gl_error(ctx, GL_INVALID_VALUE, "glAreTexturesResident(textures)"); return GL_FALSE; } } - return resident; + return allResident; } @@ -684,7 +728,7 @@ GET_CURRENT_CONTEXT(ctx); ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH_WITH_RETVAL(ctx, "glIsTextures", GL_FALSE); - if (texture>0 && _mesa_HashLookup(ctx->Shared->TexObjects, texture)) { + if (texture > 0 && _mesa_HashLookup(ctx->Shared->TexObjects, texture)) { return GL_TRUE; } else { Index: xc/extras/Mesa/src/texstate.c diff -u xc/extras/Mesa/src/texstate.c:1.4 xc/extras/Mesa/src/texstate.c:1.7 --- xc/extras/Mesa/src/texstate.c:1.4 Fri Jun 16 20:02:17 2000 +++ xc/extras/Mesa/src/texstate.c Mon Nov 13 18:30:52 2000 @@ -1,7 +1,7 @@ /* * Mesa 3-D graphics library - * Version: 3.3 + * Version: 3.4 * * Copyright (C) 1999-2000 Brian Paul All Rights Reserved. * @@ -70,64 +70,284 @@ ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx, "glTexEnv"); if (target==GL_TEXTURE_ENV) { - - if (pname==GL_TEXTURE_ENV_MODE) { - GLenum mode = (GLenum) (GLint) *param; - switch (mode) { - case GL_ADD: - if (!ctx->Extensions.HaveTextureEnvAdd) { - gl_error(ctx, GL_INVALID_ENUM, "glTexEnv(param)"); - return; - } - /* FALL-THROUGH */ - case GL_MODULATE: - case GL_BLEND: - case GL_DECAL: - case GL_REPLACE: - /* A small optimization for drivers */ - if (texUnit->EnvMode == mode) - return; - - if (MESA_VERBOSE & (VERBOSE_STATE|VERBOSE_TEXTURE)) - fprintf(stderr, "glTexEnv: old mode %s, new mode %s\n", - gl_lookup_enum_by_nr(texUnit->EnvMode), - gl_lookup_enum_by_nr(mode)); - - texUnit->EnvMode = mode; - ctx->NewState |= NEW_TEXTURE_ENV; - break; - default: - gl_error( ctx, GL_INVALID_VALUE, "glTexEnv(param)" ); - return; - } - } - else if (pname==GL_TEXTURE_ENV_COLOR) { - texUnit->EnvColor[0] = CLAMP( param[0], 0.0F, 1.0F ); - texUnit->EnvColor[1] = CLAMP( param[1], 0.0F, 1.0F ); - texUnit->EnvColor[2] = CLAMP( param[2], 0.0F, 1.0F ); - texUnit->EnvColor[3] = CLAMP( param[3], 0.0F, 1.0F ); - } - else { - gl_error( ctx, GL_INVALID_ENUM, "glTexEnv(pname)" ); - return; + switch (pname) { + case GL_TEXTURE_ENV_MODE: + { + GLenum mode = (GLenum) (GLint) *param; + switch (mode) { + case GL_MODULATE: + case GL_BLEND: + case GL_DECAL: + case GL_REPLACE: + case GL_ADD: + case GL_COMBINE_EXT: + if (mode == GL_ADD && + !ctx->Extensions.HaveTextureEnvAdd) { + gl_error(ctx, GL_INVALID_ENUM, "glTexEnv(param)"); + return; + } + if (mode == GL_COMBINE_EXT && + !ctx->Extensions.HaveTextureEnvCombine) { + gl_error(ctx, GL_INVALID_ENUM, "glTexEnv(param)"); + return; + } + if (texUnit->EnvMode == mode) + return; /* no change */ + texUnit->EnvMode = mode; + ctx->NewState |= NEW_TEXTURE_ENV; + break; + default: + gl_error( ctx, GL_INVALID_VALUE, "glTexEnv(param)" ); + return; + } + } + break; + case GL_TEXTURE_ENV_COLOR: + texUnit->EnvColor[0] = CLAMP( param[0], 0.0F, 1.0F ); + texUnit->EnvColor[1] = CLAMP( param[1], 0.0F, 1.0F ); + texUnit->EnvColor[2] = CLAMP( param[2], 0.0F, 1.0F ); + texUnit->EnvColor[3] = CLAMP( param[3], 0.0F, 1.0F ); + break; + case GL_COMBINE_RGB_EXT: + if (ctx->Extensions.HaveTextureEnvCombine) { + GLenum mode = (GLenum) (GLint) *param; + switch (mode) { + case GL_REPLACE: + case GL_MODULATE: + case GL_ADD: + case GL_ADD_SIGNED_EXT: + case GL_INTERPOLATE_EXT: + if (texUnit->CombineModeRGB == mode) + return; /* no change */ + texUnit->CombineModeRGB = mode; + ctx->NewState |= NEW_TEXTURE_ENV; + break; + default: + gl_error( ctx, GL_INVALID_ENUM, "glTexEnv(param)" ); + return; + } + } + else { + gl_error(ctx, GL_INVALID_ENUM, "glTexEnv(pname)"); + return; + } + break; + case GL_COMBINE_ALPHA_EXT: + if (ctx->Extensions.HaveTextureEnvCombine) { + GLenum mode = (GLenum) (GLint) *param; + switch (mode) { + case GL_REPLACE: + case GL_MODULATE: + case GL_ADD: + case GL_ADD_SIGNED_EXT: + case GL_INTERPOLATE_EXT: + if (texUnit->CombineModeA == mode) + return; /* no change */ + texUnit->CombineModeA = mode; + ctx->NewState |= NEW_TEXTURE_ENV; + break; + default: + gl_error( ctx, GL_INVALID_ENUM, "glTexEnv(param)" ); + return; + } + } + else { + gl_error(ctx, GL_INVALID_ENUM, "glTexEnv(pname)"); + return; + } + break; + case GL_SOURCE0_RGB_EXT: + case GL_SOURCE1_RGB_EXT: + case GL_SOURCE2_RGB_EXT: + if (ctx->Extensions.HaveTextureEnvCombine) { + GLenum source = (GLenum) (GLint) *param; + GLuint s = pname - GL_SOURCE0_RGB_EXT; + switch (source) { + case GL_TEXTURE: + case GL_CONSTANT_EXT: + case GL_PRIMARY_COLOR_EXT: + case GL_PREVIOUS_EXT: + if (texUnit->CombineSourceRGB[s] == source) + return; /* no change */ + texUnit->CombineSourceRGB[s] = source; + ctx->NewState |= NEW_TEXTURE_ENV; + break; + default: + gl_error( ctx, GL_INVALID_ENUM, "glTexEnv(param)" ); + return; + } + } + else { + gl_error(ctx, GL_INVALID_ENUM, "glTexEnv(pname)"); + return; + } + break; + case GL_SOURCE0_ALPHA_EXT: + case GL_SOURCE1_ALPHA_EXT: + case GL_SOURCE2_ALPHA_EXT: + if (ctx->Extensions.HaveTextureEnvCombine) { + GLenum source = (GLenum) (GLint) *param; + GLuint s = pname - GL_SOURCE0_ALPHA_EXT; + switch (source) { + case GL_TEXTURE: + case GL_CONSTANT_EXT: + case GL_PRIMARY_COLOR_EXT: + case GL_PREVIOUS_EXT: + if (texUnit->CombineSourceA[s] == source) return; + texUnit->CombineSourceA[s] = source; + ctx->NewState |= NEW_TEXTURE_ENV; + break; + default: + gl_error( ctx, GL_INVALID_ENUM, "glTexEnv(param)" ); + return; + } + } + else { + gl_error(ctx, GL_INVALID_ENUM, "glTexEnv(pname)"); + return; + } + break; + case GL_OPERAND0_RGB_EXT: + case GL_OPERAND1_RGB_EXT: + if (ctx->Extensions.HaveTextureEnvCombine) { + GLenum operand = (GLenum) (GLint) *param; + GLuint s = pname - GL_OPERAND0_RGB_EXT; + switch (operand) { + case GL_SRC_COLOR: + case GL_ONE_MINUS_SRC_COLOR: + case GL_SRC_ALPHA: + case GL_ONE_MINUS_SRC_ALPHA: + texUnit->CombineOperandRGB[s] = operand; + ctx->NewState |= NEW_TEXTURE_ENV; + break; + default: + gl_error( ctx, GL_INVALID_ENUM, "glTexEnv(param)" ); + return; + } + } + else { + gl_error(ctx, GL_INVALID_ENUM, "glTexEnv(pname)"); + return; + } + break; + case GL_OPERAND0_ALPHA_EXT: + case GL_OPERAND1_ALPHA_EXT: + if (ctx->Extensions.HaveTextureEnvCombine) { + GLenum operand = (GLenum) (GLint) *param; + switch (operand) { + case GL_SRC_ALPHA: + case GL_ONE_MINUS_SRC_ALPHA: + texUnit->CombineOperandA[pname-GL_OPERAND0_ALPHA_EXT] + = operand; + ctx->NewState |= NEW_TEXTURE_ENV; + break; + default: + gl_error( ctx, GL_INVALID_ENUM, "glTexEnv(param)" ); + return; + } + } + else { + gl_error(ctx, GL_INVALID_ENUM, "glTexEnv(pname)"); + return; + } + break; + case GL_OPERAND2_RGB_EXT: + if (ctx->Extensions.HaveTextureEnvCombine) { + if ((GLenum) (GLint) *param == GL_SRC_ALPHA) { + texUnit->CombineOperandRGB[2] = (GLenum) (GLint) *param; + ctx->NewState |= NEW_TEXTURE_ENV; + } + else { + gl_error( ctx, GL_INVALID_ENUM, "glTexEnv(param)" ); + return; + } + } + else { + gl_error(ctx, GL_INVALID_ENUM, "glTexEnv(pname)"); + return; + } + break; + case GL_OPERAND2_ALPHA_EXT: + if (ctx->Extensions.HaveTextureEnvCombine) { + if ((GLenum) (GLint) *param == GL_SRC_ALPHA) { + texUnit->CombineOperandA[2] = (GLenum) (GLint) *param; + ctx->NewState |= NEW_TEXTURE_ENV; + } + else { + gl_error( ctx, GL_INVALID_ENUM, "glTexEnv(param)" ); + return; + } + } + else { + gl_error(ctx, GL_INVALID_ENUM, "glTexEnv(pname)"); + return; + } + break; + case GL_RGB_SCALE_EXT: + if (ctx->Extensions.HaveTextureEnvCombine) { + if (*param == 1.0) { + texUnit->CombineScaleShiftRGB = 0; + ctx->NewState |= NEW_TEXTURE_ENV; + } + else if (*param == 2.0) { + texUnit->CombineScaleShiftRGB = 1; + ctx->NewState |= NEW_TEXTURE_ENV; + } + else if (*param == 4.0) { + texUnit->CombineScaleShiftRGB = 2; + ctx->NewState |= NEW_TEXTURE_ENV; + } + else { + gl_error( ctx, GL_INVALID_VALUE, "glTexEnv(param)" ); + return; + } + } + else { + gl_error(ctx, GL_INVALID_ENUM, "glTexEnv(pname)"); + return; + } + break; + case GL_ALPHA_SCALE: + if (ctx->Extensions.HaveTextureEnvCombine) { + if (*param == 1.0) { + texUnit->CombineScaleShiftA = 0; + ctx->NewState |= NEW_TEXTURE_ENV; + } + else if (*param == 2.0) { + texUnit->CombineScaleShiftA = 1; + ctx->NewState |= NEW_TEXTURE_ENV; + } + else if (*param == 4.0) { + texUnit->CombineScaleShiftA = 2; + ctx->NewState |= NEW_TEXTURE_ENV; + } + else { + gl_error( ctx, GL_INVALID_VALUE, "glTexEnv(param)" ); + return; + } + } + else { + gl_error(ctx, GL_INVALID_ENUM, "glTexEnv(pname)"); + return; + } + break; + default: + gl_error( ctx, GL_INVALID_ENUM, "glTexEnv(pname)" ); + return; } - } else if (target==GL_TEXTURE_FILTER_CONTROL_EXT) { - if (!ctx->Extensions.HaveTextureLodBias) { gl_error( ctx, GL_INVALID_ENUM, "glTexEnv(param)" ); return; } - - if (pname==GL_TEXTURE_LOD_BIAS_EXT) { + if (pname == GL_TEXTURE_LOD_BIAS_EXT) { texUnit->LodBias = param[0]; } else { gl_error( ctx, GL_INVALID_ENUM, "glTexEnv(pname)" ); return; } - } else { gl_error( ctx, GL_INVALID_ENUM, "glTexEnv(target)" ); @@ -183,7 +403,7 @@ _mesa_GetTexEnvfv( GLenum target, GLenum pname, GLfloat *params ) { GET_CURRENT_CONTEXT(ctx); - struct gl_texture_unit *texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit]; + const struct gl_texture_unit *texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit]; ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx, "glGetTexEnvfv"); @@ -191,6 +411,7 @@ gl_error( ctx, GL_INVALID_ENUM, "glGetTexEnvfv(target)" ); return; } + switch (pname) { case GL_TEXTURE_ENV_MODE: *params = ENUM_TO_FLOAT(texUnit->EnvMode); @@ -198,6 +419,34 @@ case GL_TEXTURE_ENV_COLOR: COPY_4FV( params, texUnit->EnvColor ); break; + case GL_RGB_SCALE_EXT: + if (ctx->Extensions.HaveTextureEnvCombine) { + if (texUnit->CombineScaleShiftRGB == 0) + *params = 1.0; + else if (texUnit->CombineScaleShiftRGB == 1) + *params = 2.0; + else + *params = 4.0; + } + else { + gl_error(ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)"); + return; + } + break; + case GL_ALPHA_SCALE: + if (ctx->Extensions.HaveTextureEnvCombine) { + if (texUnit->CombineScaleShiftA == 0) + *params = 1.0; + else if (texUnit->CombineScaleShiftA == 1) + *params = 2.0; + else + *params = 4.0; + } + else { + gl_error(ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)"); + return; + } + break; default: gl_error( ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)" ); } @@ -208,14 +457,15 @@ _mesa_GetTexEnviv( GLenum target, GLenum pname, GLint *params ) { GET_CURRENT_CONTEXT(ctx); - struct gl_texture_unit *texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit]; + const struct gl_texture_unit *texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit]; ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx, "glGetTexEnviv"); - if (target!=GL_TEXTURE_ENV) { + if (target != GL_TEXTURE_ENV) { gl_error( ctx, GL_INVALID_ENUM, "glGetTexEnviv(target)" ); return; } + switch (pname) { case GL_TEXTURE_ENV_MODE: *params = (GLint) texUnit->EnvMode; @@ -225,6 +475,118 @@ params[1] = FLOAT_TO_INT( texUnit->EnvColor[1] ); params[2] = FLOAT_TO_INT( texUnit->EnvColor[2] ); params[3] = FLOAT_TO_INT( texUnit->EnvColor[3] ); + break; + case GL_COMBINE_RGB_EXT: + if (ctx->Extensions.HaveTextureEnvCombine) { + *params = (GLint) texUnit->CombineModeRGB; + } + else { + gl_error(ctx, GL_INVALID_ENUM, "glGetTexEnviv(pname)"); + } + break; + case GL_COMBINE_ALPHA_EXT: + if (ctx->Extensions.HaveTextureEnvCombine) { + *params = (GLint) texUnit->CombineModeA; + } + else { + gl_error(ctx, GL_INVALID_ENUM, "glGetTexEnviv(pname)"); + } + break; + case GL_SOURCE0_RGB_EXT: + if (ctx->Extensions.HaveTextureEnvCombine) { + *params = (GLint) texUnit->CombineSourceRGB[0]; + } + else { + gl_error(ctx, GL_INVALID_ENUM, "glGetTexEnviv(pname)"); + } + break; + case GL_SOURCE1_RGB_EXT: + if (ctx->Extensions.HaveTextureEnvCombine) { + *params = (GLint) texUnit->CombineSourceRGB[1]; + } + else { + gl_error(ctx, GL_INVALID_ENUM, "glGetTexEnviv(pname)"); + } + break; + case GL_SOURCE2_RGB_EXT: + if (ctx->Extensions.HaveTextureEnvCombine) { + *params = (GLint) texUnit->CombineSourceRGB[2]; + } + else { + gl_error(ctx, GL_INVALID_ENUM, "glGetTexEnviv(pname)"); + } + break; + case GL_SOURCE0_ALPHA_EXT: + if (ctx->Extensions.HaveTextureEnvCombine) { + *params = (GLint) texUnit->CombineSourceA[0]; + } + else { + gl_error(ctx, GL_INVALID_ENUM, "glGetTexEnviv(pname)"); + } + break; + case GL_SOURCE1_ALPHA_EXT: + if (ctx->Extensions.HaveTextureEnvCombine) { + *params = (GLint) texUnit->CombineSourceA[1]; + } + else { + gl_error(ctx, GL_INVALID_ENUM, "glGetTexEnviv(pname)"); + } + break; + case GL_SOURCE2_ALPHA_EXT: + if (ctx->Extensions.HaveTextureEnvCombine) { + *params = (GLint) texUnit->CombineSourceA[2]; + } + else { + gl_error(ctx, GL_INVALID_ENUM, "glGetTexEnviv(pname)"); + } + break; + case GL_OPERAND0_RGB_EXT: + if (ctx->Extensions.HaveTextureEnvCombine) { + *params = (GLint) texUnit->CombineOperandRGB[0]; + } + else { + gl_error(ctx, GL_INVALID_ENUM, "glGetTexEnviv(pname)"); + } + break; + case GL_OPERAND1_RGB_EXT: + if (ctx->Extensions.HaveTextureEnvCombine) { + *params = (GLint) texUnit->CombineOperandRGB[1]; + } + else { + gl_error(ctx, GL_INVALID_ENUM, "glGetTexEnviv(pname)"); + } + break; + case GL_OPERAND2_RGB_EXT: + if (ctx->Extensions.HaveTextureEnvCombine) { + *params = (GLint) texUnit->CombineOperandRGB[2]; + } + else { + gl_error(ctx, GL_INVALID_ENUM, "glGetTexEnviv(pname)"); + } + break; + case GL_OPERAND0_ALPHA_EXT: + if (ctx->Extensions.HaveTextureEnvCombine) { + *params = (GLint) texUnit->CombineOperandA[0]; + } + else { + gl_error(ctx, GL_INVALID_ENUM, "glGetTexEnviv(pname)"); + } + break; + case GL_OPERAND1_ALPHA_EXT: + if (ctx->Extensions.HaveTextureEnvCombine) { + *params = (GLint) texUnit->CombineOperandA[1]; + } + else { + gl_error(ctx, GL_INVALID_ENUM, "glGetTexEnviv(pname)"); + } + break; + case GL_OPERAND2_ALPHA_EXT: + if (ctx->Extensions.HaveTextureEnvCombine) { + *params = (GLint) texUnit->CombineOperandA[2]; + } + else { + gl_error(ctx, GL_INVALID_ENUM, "glGetTexEnviv(pname)"); + } break; default: gl_error( ctx, GL_INVALID_ENUM, "glGetTexEnviv(pname)" ); @@ -608,7 +970,14 @@ params[3] = obj->BorderColor[3] / 255.0F; break; case GL_TEXTURE_RESIDENT: - *params = ENUM_TO_FLOAT(GL_TRUE); + { + GLboolean resident; + if (ctx->Driver.IsTextureResident) + resident = ctx->Driver.IsTextureResident(ctx, obj); + else + resident = GL_TRUE; + *params = ENUM_TO_FLOAT(resident); + } break; case GL_TEXTURE_PRIORITY: *params = obj->Priority; @@ -676,7 +1045,14 @@ } break; case GL_TEXTURE_RESIDENT: - *params = (GLint) GL_TRUE; + { + GLboolean resident; + if (ctx->Driver.IsTextureResident) + resident = ctx->Driver.IsTextureResident(ctx, obj); + else + resident = GL_TRUE; + *params = (GLint) resident; + } break; case GL_TEXTURE_PRIORITY: *params = (GLint) obj->Priority; @@ -1215,7 +1591,7 @@ _mesa_ActiveTextureARB( GLenum target ) { GET_CURRENT_CONTEXT(ctx); - GLint maxUnits = ctx->Const.MaxTextureUnits; + const GLuint maxUnits = ctx->Const.MaxTextureUnits; ASSERT_OUTSIDE_BEGIN_END( ctx, "glActiveTextureARB" ); @@ -1242,7 +1618,7 @@ _mesa_ClientActiveTextureARB( GLenum target ) { GET_CURRENT_CONTEXT(ctx); - GLint maxUnits = ctx->Const.MaxTextureUnits; + const GLuint maxUnits = ctx->Const.MaxTextureUnits; ASSERT_OUTSIDE_BEGIN_END( ctx, "glClientActiveTextureARB" ); Index: xc/extras/Mesa/src/texture.c diff -u xc/extras/Mesa/src/texture.c:1.5 xc/extras/Mesa/src/texture.c:1.9 --- xc/extras/Mesa/src/texture.c:1.5 Fri Jun 16 20:02:17 2000 +++ xc/extras/Mesa/src/texture.c Mon Nov 13 18:30:52 2000 @@ -1,9 +1,9 @@ /* * Mesa 3-D graphics library - * Version: 3.3 + * Version: 3.4 * - * Copyright (C) 1999 Brian Paul All Rights Reserved. + * Copyright (C) 1999-2000 Brian Paul All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), @@ -31,6 +31,7 @@ #include "context.h" #include "macros.h" #include "mmath.h" +#include "mem.h" #include "pb.h" #include "teximage.h" #include "texture.h" @@ -370,6 +371,36 @@ /* + * Compute linear mipmap levels for given lambda. + */ +#define COMPUTE_LINEAR_MIPMAP_LEVEL(tObj, lambda, level) \ +{ \ + if (lambda < 0.0F) \ + lambda = 0.0F; \ + else if (lambda > tObj->M) \ + lambda = tObj->M; \ + level = (GLint) (tObj->BaseLevel + lambda); \ +} + + +/* + * Compute nearest mipmap level for given lambda. + */ +#define COMPUTE_NEAREST_MIPMAP_LEVEL(tObj, lambda, level) \ +{ \ + if (lambda <= 0.5F) \ + lambda = 0.0F; \ + else if (lambda > tObj->M + 0.4999F) \ + lambda = tObj->M + 0.4999F; \ + level = (GLint) (tObj->BaseLevel + lambda + 0.5F); \ + if (level > tObj->P) \ + level = tObj->P; \ +} + + + + +/* * Bitflags for texture border color sampling. */ #define I0BIT 1 @@ -578,14 +609,7 @@ GLubyte rgba[4] ) { GLint level; - if (lambda <= 0.5F) - lambda = 0.0F; - else if (lambda > tObj->M + 0.4999F) - lambda = tObj->M + 0.4999F; - level = (GLint) (tObj->BaseLevel + lambda + 0.5F); - if (level > tObj->P) - level = tObj->P; - + COMPUTE_NEAREST_MIPMAP_LEVEL(tObj, lambda, level); sample_1d_nearest( tObj, tObj->Image[level], s, rgba ); } @@ -596,14 +620,7 @@ GLubyte rgba[4] ) { GLint level; - if (lambda <= 0.5F) - lambda = 0.0F; - else if (lambda > tObj->M + 0.4999F) - lambda = tObj->M + 0.4999F; - level = (GLint) (tObj->BaseLevel + lambda + 0.5F); - if (level > tObj->P) - level = tObj->P; - + COMPUTE_NEAREST_MIPMAP_LEVEL(tObj, lambda, level); sample_1d_linear( tObj, tObj->Image[level], s, rgba ); } @@ -615,11 +632,8 @@ GLubyte rgba[4] ) { GLint level; - if (lambda < 0.0F) - lambda = 0.0F; - else if (lambda > tObj->M) - lambda = tObj->M; - level = (GLint) (tObj->BaseLevel + lambda); + + COMPUTE_LINEAR_MIPMAP_LEVEL(tObj, lambda, level); if (level >= tObj->P) { sample_1d_nearest( tObj, tObj->Image[tObj->P], s, rgba ); @@ -644,12 +658,9 @@ GLubyte rgba[4] ) { GLint level; - if (lambda < 0.0F) - lambda = 0.0F; - else if (lambda > tObj->M) - lambda = tObj->M; - level = (GLint) (tObj->BaseLevel + lambda); + COMPUTE_LINEAR_MIPMAP_LEVEL(tObj, lambda, level); + if (level >= tObj->P) { sample_1d_linear( tObj, tObj->Image[tObj->P], s, rgba ); } @@ -971,14 +982,7 @@ GLubyte rgba[4] ) { GLint level; - if (lambda <= 0.5F) - lambda = 0.0F; - else if (lambda > tObj->M + 0.4999F) - lambda = tObj->M + 0.4999F; - level = (GLint) (tObj->BaseLevel + lambda + 0.5F); - if (level > tObj->P) - level = tObj->P; - + COMPUTE_NEAREST_MIPMAP_LEVEL(tObj, lambda, level); sample_2d_nearest( tObj, tObj->Image[level], s, t, rgba ); } @@ -990,14 +994,7 @@ GLubyte rgba[4] ) { GLint level; - if (lambda <= 0.5F) - lambda = 0.0F; - else if (lambda > tObj->M + 0.4999F) - lambda = tObj->M + 0.4999F; - level = (GLint) (tObj->BaseLevel + lambda + 0.5F); - if (level > tObj->P) - level = tObj->P; - + COMPUTE_NEAREST_MIPMAP_LEVEL(tObj, lambda, level); sample_2d_linear( tObj, tObj->Image[level], s, t, rgba ); } @@ -1009,11 +1006,8 @@ GLubyte rgba[4] ) { GLint level; - if (lambda < 0.0F) - lambda = 0.0F; - else if (lambda > tObj->M) - lambda = tObj->M; - level = (GLint) (tObj->BaseLevel + lambda); + + COMPUTE_LINEAR_MIPMAP_LEVEL(tObj, lambda, level); if (level >= tObj->P) { sample_2d_nearest( tObj, tObj->Image[tObj->P], s, t, rgba ); @@ -1038,12 +1032,9 @@ GLubyte rgba[4] ) { GLint level; - if (lambda < 0.0F) - lambda = 0.0F; - else if (lambda > tObj->M) - lambda = tObj->M; - level = (GLint) (tObj->BaseLevel + lambda); + COMPUTE_LINEAR_MIPMAP_LEVEL(tObj, lambda, level); + if (level >= tObj->P) { sample_2d_linear( tObj, tObj->Image[tObj->P], s, t, rgba ); } @@ -1490,14 +1481,7 @@ GLfloat lambda, GLubyte rgba[4] ) { GLint level; - if (lambda <= 0.5F) - lambda = 0.0F; - else if (lambda > tObj->M + 0.4999F) - lambda = tObj->M + 0.4999F; - level = (GLint) (tObj->BaseLevel + lambda + 0.5F); - if (level > tObj->P) - level = tObj->P; - + COMPUTE_NEAREST_MIPMAP_LEVEL(tObj, lambda, level); sample_3d_nearest( tObj, tObj->Image[level], s, t, r, rgba ); } @@ -1508,14 +1492,7 @@ GLfloat lambda, GLubyte rgba[4] ) { GLint level; - if (lambda <= 0.5F) - lambda = 0.0F; - else if (lambda > tObj->M + 0.4999F) - lambda = tObj->M + 0.4999F; - level = (GLint) (tObj->BaseLevel + lambda + 0.5F); - if (level > tObj->P) - level = tObj->P; - + COMPUTE_NEAREST_MIPMAP_LEVEL(tObj, lambda, level); sample_3d_linear( tObj, tObj->Image[level], s, t, r, rgba ); } @@ -1526,12 +1503,9 @@ GLfloat lambda, GLubyte rgba[4] ) { GLint level; - if (lambda < 0.0F) - lambda = 0.0F; - else if (lambda > tObj->M) - lambda = tObj->M; - level = (GLint) (tObj->BaseLevel + lambda); + COMPUTE_LINEAR_MIPMAP_LEVEL(tObj, lambda, level); + if (level >= tObj->P) { sample_3d_nearest( tObj, tObj->Image[tObj->P], s, t, r, rgba ); } @@ -1554,11 +1528,8 @@ GLfloat lambda, GLubyte rgba[4] ) { GLint level; - if (lambda < 0.0F) - lambda = 0.0F; - else if (lambda > tObj->M) - lambda = tObj->M; - level = (GLint) (tObj->BaseLevel + lambda); + + COMPUTE_LINEAR_MIPMAP_LEVEL(tObj, lambda, level); if (level >= tObj->P) { sample_3d_linear( tObj, tObj->Image[tObj->P], s, t, r, rgba ); @@ -1664,10 +1635,14 @@ /* Texture Cube Map Sampling Functions */ /**********************************************************************/ -static struct gl_texture_image * +/* + * Choose one of six sides of a texture cube map given the texture + * coord (rx,ry,rz). Return pointer to corresponding array of texture + * images. + */ +static const struct gl_texture_image ** choose_cube_face(const struct gl_texture_object *texObj, - const GLfloat texcoord[4], - GLint level, + GLfloat rx, GLfloat ry, GLfloat rz, GLfloat *newS, GLfloat *newT) { /* @@ -1681,20 +1656,19 @@ +rz TEXTURE_CUBE_MAP_POSITIVE_Z_EXT +rx -ry rz -rz TEXTURE_CUBE_MAP_NEGATIVE_Z_EXT -rx -ry rz */ - struct gl_texture_image *texImg; - const GLfloat rx = texcoord[0], ry = texcoord[1], rz = texcoord[2]; + const struct gl_texture_image **imgArray; const GLfloat arx = ABSF(rx), ary = ABSF(ry), arz = ABSF(rz); GLfloat sc, tc, ma; if (arx > ary && arx > arz) { if (rx >= 0.0F) { - texImg = texObj->Image[level]; + imgArray = (const struct gl_texture_image **) texObj->Image; sc = -rz; tc = -ry; ma = arx; } else { - texImg = texObj->NegX[level]; + imgArray = (const struct gl_texture_image **) texObj->NegX; sc = rz; tc = -ry; ma = arx; @@ -1702,13 +1676,13 @@ } else if (ary > arx && ary > arz) { if (ry >= 0.0F) { - texImg = texObj->PosY[level]; + imgArray = (const struct gl_texture_image **) texObj->PosY; sc = rx; tc = rz; ma = ary; } else { - texImg = texObj->NegY[level]; + imgArray = (const struct gl_texture_image **) texObj->NegY; sc = rx; tc = -rz; ma = ary; @@ -1716,13 +1690,13 @@ } else { if (rz > 0.0F) { - texImg = texObj->PosZ[level]; + imgArray = (const struct gl_texture_image **) texObj->PosZ; sc = rx; tc = -ry; ma = arz; } else { - texImg = texObj->NegZ[level]; + imgArray = (const struct gl_texture_image **) texObj->NegZ; sc = -rx; tc = -ry; ma = arz; @@ -1731,7 +1705,7 @@ *newS = ( sc / ma + 1.0F ) * 0.5F; *newT = ( tc / ma + 1.0F ) * 0.5F; - return texImg; + return imgArray; } @@ -1744,17 +1718,14 @@ GLuint i; (void) lambda; for (i = 0; i < n; i++) { - struct gl_texture_image *image; + const struct gl_texture_image **images; GLfloat newS, newT; - GLfloat coord[4]; - coord[0] = s[i]; - coord[1] = t[i]; - coord[2] = u[i]; - image = choose_cube_face(tObj, coord, 0, &newS, &newT); - sample_2d_nearest( tObj, image, newS, newT, rgba[i] ); + images = choose_cube_face(tObj, s[i], t[i], u[i], &newS, &newT); + sample_2d_nearest( tObj, images[tObj->BaseLevel], newS, newT, rgba[i] ); } } + static void sample_linear_cube(const struct gl_texture_object *tObj, GLuint n, const GLfloat s[], const GLfloat t[], @@ -1764,18 +1735,105 @@ GLuint i; (void) lambda; for (i = 0; i < n; i++) { - struct gl_texture_image *image; + const struct gl_texture_image **images; GLfloat newS, newT; - GLfloat coord[4]; - coord[0] = s[i]; - coord[1] = t[i]; - coord[2] = u[i]; - image = choose_cube_face(tObj, coord, 0, &newS, &newT); - sample_2d_linear( tObj, image, newS, newT, rgba[i] ); + images = choose_cube_face(tObj, s[i], t[i], u[i], &newS, &newT); + sample_2d_linear( tObj, images[tObj->BaseLevel], newS, newT, rgba[i] ); + } +} + + +static void +sample_cube_nearest_mipmap_nearest( const struct gl_texture_object *tObj, + GLfloat s, GLfloat t, GLfloat u, + GLfloat lambda, GLubyte rgba[4] ) +{ + const struct gl_texture_image **images; + GLfloat newS, newT; + GLint level; + + COMPUTE_NEAREST_MIPMAP_LEVEL(tObj, lambda, level); + + images = choose_cube_face(tObj, s, t, u, &newS, &newT); + sample_2d_nearest( tObj, images[level], newS, newT, rgba ); +} + + +static void +sample_cube_linear_mipmap_nearest( const struct gl_texture_object *tObj, + GLfloat s, GLfloat t, GLfloat u, + GLfloat lambda, GLubyte rgba[4] ) +{ + const struct gl_texture_image **images; + GLfloat newS, newT; + GLint level; + + COMPUTE_NEAREST_MIPMAP_LEVEL(tObj, lambda, level); + + images = choose_cube_face(tObj, s, t, u, &newS, &newT); + sample_2d_linear( tObj, images[level], newS, newT, rgba ); +} + + +static void +sample_cube_nearest_mipmap_linear( const struct gl_texture_object *tObj, + GLfloat s, GLfloat t, GLfloat u, + GLfloat lambda, GLubyte rgba[4] ) +{ + const struct gl_texture_image **images; + GLfloat newS, newT; + GLint level; + + COMPUTE_LINEAR_MIPMAP_LEVEL(tObj, lambda, level); + + images = choose_cube_face(tObj, s, t, u, &newS, &newT); + + if (level >= tObj->P) { + sample_2d_nearest( tObj, images[tObj->P], newS, newT, rgba ); } + else { + GLubyte t0[4], t1[4]; /* texels */ + const GLfloat f = myFrac(lambda); + sample_2d_nearest( tObj, images[level ], newS, newT, t0 ); + sample_2d_nearest( tObj, images[level+1], newS, newT, t1 ); + rgba[RCOMP] = (GLubyte) (GLint) ((1.0F-f) * t0[RCOMP] + f * t1[RCOMP]); + rgba[GCOMP] = (GLubyte) (GLint) ((1.0F-f) * t0[GCOMP] + f * t1[GCOMP]); + rgba[BCOMP] = (GLubyte) (GLint) ((1.0F-f) * t0[BCOMP] + f * t1[BCOMP]); + rgba[ACOMP] = (GLubyte) (GLint) ((1.0F-f) * t0[ACOMP] + f * t1[ACOMP]); + } } + static void +sample_cube_linear_mipmap_linear( const struct gl_texture_object *tObj, + GLfloat s, GLfloat t, GLfloat u, + GLfloat lambda, GLubyte rgba[4] ) +{ + const struct gl_texture_image **images; + GLfloat newS, newT; + GLint level; + + COMPUTE_LINEAR_MIPMAP_LEVEL(tObj, lambda, level); + + images = choose_cube_face(tObj, s, t, u, &newS, &newT); + + if (level >= tObj->P) { + sample_2d_linear( tObj, images[tObj->P], newS, newT, rgba ); + } + else { + GLubyte t0[4], t1[4]; + const GLfloat f = myFrac(lambda); + sample_2d_linear( tObj, images[level ], newS, newT, t0 ); + sample_2d_linear( tObj, images[level+1], newS, newT, t1 ); + rgba[RCOMP] = (GLubyte) (GLint) ((1.0F-f) * t0[RCOMP] + f * t1[RCOMP]); + rgba[GCOMP] = (GLubyte) (GLint) ((1.0F-f) * t0[GCOMP] + f * t1[GCOMP]); + rgba[BCOMP] = (GLubyte) (GLint) ((1.0F-f) * t0[BCOMP] + f * t1[BCOMP]); + rgba[ACOMP] = (GLubyte) (GLint) ((1.0F-f) * t0[ACOMP] + f * t1[ACOMP]); + } +} + + +static void sample_lambda_cube(const struct gl_texture_object *tObj, GLuint n, const GLfloat s[], const GLfloat t[], const GLfloat u[], const GLfloat lambda[], @@ -1784,42 +1842,44 @@ GLuint i; for (i = 0; i < n; i++) { - struct gl_texture_image *image; - GLfloat newS, newT; - GLfloat coord[4]; - coord[0] = s[i]; - coord[1] = t[i]; - coord[2] = u[i]; - image = choose_cube_face(tObj, coord, 0, &newS, &newT); - if (lambda[i] > tObj->MinMagThresh) { /* minification */ switch (tObj->MinFilter) { case GL_NEAREST: - sample_2d_nearest( tObj, image, newS, newT, rgba[i] ); + { + const struct gl_texture_image **images; + GLfloat newS, newT; + images = choose_cube_face(tObj, s[i], t[i], u[i], + &newS, &newT); + sample_2d_nearest( tObj, images[tObj->BaseLevel], + newS, newT, rgba[i] ); + } break; case GL_LINEAR: - sample_2d_linear( tObj, image, newS, newT, rgba[i] ); + { + const struct gl_texture_image **images; + GLfloat newS, newT; + images = choose_cube_face(tObj, s[i], t[i], u[i], + &newS, &newT); + sample_2d_linear( tObj, images[tObj->BaseLevel], + newS, newT, rgba[i] ); + } break; case GL_NEAREST_MIPMAP_NEAREST: - /* - sample_3d_nearest_mipmap_nearest( tObj, s[i], t[i], u[i], lambda[i], rgba[i] ); - */ + sample_cube_nearest_mipmap_nearest( tObj, s[i], t[i], u[i], + lambda[i], rgba[i] ); break; case GL_LINEAR_MIPMAP_NEAREST: - /* - sample_3d_linear_mipmap_nearest( tObj, s[i], t[i], u[i], lambda[i], rgba[i] ); - */ + sample_cube_linear_mipmap_nearest( tObj, s[i], t[i], u[i], + lambda[i], rgba[i] ); break; case GL_NEAREST_MIPMAP_LINEAR: - /* - sample_3d_nearest_mipmap_linear( tObj, s[i], t[i], u[i], lambda[i], rgba[i] ); - */ + sample_cube_nearest_mipmap_linear( tObj, s[i], t[i], u[i], + lambda[i], rgba[i] ); break; case GL_LINEAR_MIPMAP_LINEAR: - /* - sample_3d_linear_mipmap_linear( tObj, s[i], t[i], u[i], lambda[i], rgba[i] ); - */ + sample_cube_linear_mipmap_linear( tObj, s[i], t[i], u[i], + lambda[i], rgba[i] ); break; default: gl_problem(NULL, "Bad min filter in sample_lambda_cube"); @@ -1827,12 +1887,18 @@ } else { /* magnification */ + const struct gl_texture_image **images; + GLfloat newS, newT; + images = choose_cube_face(tObj, s[i], t[i], u[i], + &newS, &newT); switch (tObj->MagFilter) { case GL_NEAREST: - sample_2d_nearest( tObj, image, newS, newT, rgba[i] ); + sample_2d_nearest( tObj, images[tObj->BaseLevel], + newS, newT, rgba[i] ); break; case GL_LINEAR: - sample_2d_linear( tObj, image, newS, newT, rgba[i] ); + sample_2d_linear( tObj, images[tObj->BaseLevel], + newS, newT, rgba[i] ); break; default: gl_problem(NULL, "Bad mag filter in sample_lambda_cube"); @@ -1936,7 +2002,295 @@ } +#define PROD(A,B) ( (GLuint)(A) * ((GLuint)(B)+1) ) + +static INLINE void +_mesa_texture_combine(const GLcontext *ctx, + const struct gl_texture_unit *textureUnit, + GLuint n, + GLubyte (*primary_rgba)[4], + GLubyte (*texel)[4], + GLubyte (*rgba)[4]) +{ + GLubyte ccolor [3][3*MAX_WIDTH][4]; + GLubyte (*argRGB [3])[4]; + GLubyte (*argA [3])[4]; + GLuint i, j; + GLuint RGBshift = textureUnit->CombineScaleShiftRGB; + GLuint Ashift = textureUnit->CombineScaleShiftA; + + ASSERT(ctx->Extensions.HaveTextureEnvCombine); + + for (j = 0; j < 3; j++) { + switch (textureUnit->CombineSourceA[j]) { + case GL_TEXTURE: + argA[j] = texel; + break; + case GL_PRIMARY_COLOR_EXT: + argA[j] = primary_rgba; + break; + case GL_PREVIOUS_EXT: + argA[j] = rgba; + break; + case GL_CONSTANT_EXT: + { + GLubyte (*c)[4] = ccolor[j]; + GLubyte alpha = FLOAT_TO_UBYTE(textureUnit->EnvColor[3]); + for (i = 0; i < n; i++) + c[i][ACOMP] = alpha; + argA[j] = ccolor[j]; + } + break; + default: + gl_problem(NULL, "invalid combine source"); + } + switch (textureUnit->CombineSourceRGB[j]) { + case GL_TEXTURE: + argRGB[j] = texel; + break; + case GL_PRIMARY_COLOR_EXT: + argRGB[j] = primary_rgba; + break; + case GL_PREVIOUS_EXT: + argRGB[j] = rgba; + break; + case GL_CONSTANT_EXT: + { + GLubyte (*c)[4] = ccolor[j]; + const GLubyte red = FLOAT_TO_UBYTE(textureUnit->EnvColor[0]); + const GLubyte green = FLOAT_TO_UBYTE(textureUnit->EnvColor[1]); + const GLubyte blue = FLOAT_TO_UBYTE(textureUnit->EnvColor[2]); + for (i = 0; i < n; i++) { + c[i][RCOMP] = red; + c[i][GCOMP] = green; + c[i][BCOMP] = blue; + } + argRGB[j] = ccolor[j]; + } + break; + default: + gl_problem(NULL, "invalid combine source"); + } + + if (textureUnit->CombineOperandRGB[j] != GL_SRC_COLOR) { + GLubyte (*src)[4] = argRGB[j]; + GLubyte (*dst)[4] = ccolor[j]; + + argRGB[j] = ccolor[j]; + + if (textureUnit->CombineOperandRGB[j] == GL_ONE_MINUS_SRC_COLOR) { + for (i = 0; i < n; i++) { + dst[i][RCOMP] = 255 - src[i][RCOMP]; + dst[i][GCOMP] = 255 - src[i][GCOMP]; + dst[i][BCOMP] = 255 - src[i][BCOMP]; + } + } + else if (textureUnit->CombineOperandRGB[j] == GL_SRC_ALPHA) { + src = argA[j]; + for (i = 0; i < n; i++) { + dst[i][RCOMP] = src[i][ACOMP]; + dst[i][GCOMP] = src[i][ACOMP]; + dst[i][BCOMP] = src[i][ACOMP]; + } + } + else { /* GL_ONE_MINUS_SRC_ALPHA */ + src = argA[j]; + for (i = 0; i < n; i++) { + dst[i][RCOMP] = 255 - src[i][ACOMP]; + dst[i][GCOMP] = 255 - src[i][ACOMP]; + dst[i][BCOMP] = 255 - src[i][ACOMP]; + } + } + } + + if (textureUnit->CombineOperandA[j] == GL_ONE_MINUS_SRC_ALPHA) { + GLubyte (*src)[4] = argA[j]; + GLubyte (*dst)[4] = ccolor[j]; + argA[j] = ccolor[j]; + for (i = 0; i < n; i++) { + dst[i][ACOMP] = 255 - src[i][ACOMP]; + } + } + + if (textureUnit->CombineModeRGB == GL_REPLACE && + textureUnit->CombineModeA == GL_REPLACE) { + break; /* done, we need only arg0 */ + } + + if (j == 1 && + textureUnit->CombineModeRGB != GL_INTERPOLATE_EXT && + textureUnit->CombineModeA != GL_INTERPOLATE_EXT) { + break; /* arg0 and arg1 are done. we don't need arg2. */ + } + } + + switch (textureUnit->CombineModeRGB) { + case GL_REPLACE: + { + const GLubyte (*arg0)[4] = (const GLubyte (*)[4]) argRGB[0]; + if (RGBshift) { + for (i = 0; i < n; i++) { + GLuint r = (GLuint) arg0[i][RCOMP] << RGBshift; + GLuint g = (GLuint) arg0[i][GCOMP] << RGBshift; + GLuint b = (GLuint) arg0[i][BCOMP] << RGBshift; + rgba[i][RCOMP] = MIN2(r, 255); + rgba[i][GCOMP] = MIN2(g, 255); + rgba[i][BCOMP] = MIN2(b, 255); + } + } + else { + for (i = 0; i < n; i++) { + rgba[i][RCOMP] = arg0[i][RCOMP]; + rgba[i][GCOMP] = arg0[i][GCOMP]; + rgba[i][BCOMP] = arg0[i][BCOMP]; + } + } + } + break; + case GL_MODULATE: + { + const GLubyte (*arg0)[4] = (const GLubyte (*)[4]) argRGB[0]; + const GLubyte (*arg1)[4] = (const GLubyte (*)[4]) argRGB[1]; + RGBshift = 8 - RGBshift; + for (i = 0; i < n; i++) { + GLuint r = PROD(arg0[i][0], arg1[i][RCOMP]) >> RGBshift; + GLuint g = PROD(arg0[i][1], arg1[i][GCOMP]) >> RGBshift; + GLuint b = PROD(arg0[i][2], arg1[i][BCOMP]) >> RGBshift; + rgba[i][RCOMP] = (GLubyte) MIN2(r, 255); + rgba[i][GCOMP] = (GLubyte) MIN2(g, 255); + rgba[i][BCOMP] = (GLubyte) MIN2(b, 255); + } + } + break; + case GL_ADD: + { + const GLubyte (*arg0)[4] = (const GLubyte (*)[4]) argRGB[0]; + const GLubyte (*arg1)[4] = (const GLubyte (*)[4]) argRGB[1]; + for (i = 0; i < n; i++) { + GLint r = ((GLuint) arg0[i][RCOMP] + arg1[i][RCOMP]) << RGBshift; + GLint g = ((GLuint) arg0[i][GCOMP] + arg1[i][GCOMP]) << RGBshift; + GLint b = ((GLuint) arg0[i][BCOMP] + arg1[i][BCOMP]) << RGBshift; + rgba[i][RCOMP] = (GLubyte) MIN2(r, 255); + rgba[i][GCOMP] = (GLubyte) MIN2(g, 255); + rgba[i][BCOMP] = (GLubyte) MIN2(b, 255); + } + } + break; + case GL_ADD_SIGNED_EXT: + { + const GLubyte (*arg0)[4] = (const GLubyte (*)[4]) argRGB[0]; + const GLubyte (*arg1)[4] = (const GLubyte (*)[4]) argRGB[1]; + for (i = 0; i < n; i++) { + GLint r = (GLint) arg0[i][RCOMP] + (GLint) arg1[i][RCOMP] - 128; + GLint g = (GLint) arg0[i][GCOMP] + (GLint) arg1[i][GCOMP] - 128; + GLint b = (GLint) arg0[i][BCOMP] + (GLint) arg1[i][BCOMP] - 128; + r = (r < 0) ? 0 : r << RGBshift; + b = (b < 0) ? 0 : b << RGBshift; + g = (g < 0) ? 0 : g << RGBshift; + rgba[i][RCOMP] = (GLubyte) MIN2(r, 255); + rgba[i][GCOMP] = (GLubyte) MIN2(g, 255); + rgba[i][BCOMP] = (GLubyte) MIN2(b, 255); + } + } + break; + case GL_INTERPOLATE_EXT: + { + const GLubyte (*arg0)[4] = (const GLubyte (*)[4]) argRGB[0]; + const GLubyte (*arg1)[4] = (const GLubyte (*)[4]) argRGB[1]; + const GLubyte (*arg2)[4] = (const GLubyte (*)[4]) argRGB[2]; + RGBshift = 8 - RGBshift; + for (i = 0; i < n; i++) { + GLuint r = (PROD(arg0[i][RCOMP], arg2[i][RCOMP]) + + PROD(arg1[i][RCOMP], 255 - arg2[i][RCOMP])) + >> RGBshift; + GLuint g = (PROD(arg0[i][GCOMP], arg2[i][GCOMP]) + + PROD(arg1[i][GCOMP], 255 - arg2[i][GCOMP])) + >> RGBshift; + GLuint b = (PROD(arg0[i][BCOMP], arg2[i][BCOMP]) + + PROD(arg1[i][BCOMP], 255 - arg2[i][BCOMP])) + >> RGBshift; + rgba[i][RCOMP] = (GLubyte) MIN2(r, 255); + rgba[i][GCOMP] = (GLubyte) MIN2(g, 255); + rgba[i][BCOMP] = (GLubyte) MIN2(b, 255); + } + } + break; + default: + gl_problem(NULL, "invalid combine mode"); + } + + switch (textureUnit->CombineModeA) { + case GL_REPLACE: + { + const GLubyte (*arg0)[4] = (const GLubyte (*)[4]) argA[0]; + if (Ashift) { + for (i = 0; i < n; i++) { + GLuint a = (GLuint) arg0[i][ACOMP] << Ashift; + rgba[i][ACOMP] = (GLubyte) MIN2(a, 255); + } + } + else { + for (i = 0; i < n; i++) { + rgba[i][ACOMP] = arg0[i][ACOMP]; + } + } + } + break; + case GL_MODULATE: + { + const GLubyte (*arg0)[4] = (const GLubyte (*)[4]) argA[0]; + const GLubyte (*arg1)[4] = (const GLubyte (*)[4]) argA[1]; + Ashift = 8 - Ashift; + for (i = 0; i < n; i++) { + GLuint a = (PROD(arg0[i][ACOMP], arg1[i][ACOMP]) >> Ashift); + rgba[i][ACOMP] = (GLubyte) MIN2(a, 255); + } + } + break; + case GL_ADD: + { + const GLubyte (*arg0)[4] = (const GLubyte (*)[4]) argA[0]; + const GLubyte (*arg1)[4] = (const GLubyte (*)[4]) argA[1]; + for (i = 0; i < n; i++) { + GLint a = ((GLint) arg0[i][ACOMP] + arg1[i][ACOMP]) << Ashift; + rgba[i][ACOMP] = (GLubyte) MIN2(a, 255); + } + } + break; + case GL_ADD_SIGNED_EXT: + { + const GLubyte (*arg0)[4] = (const GLubyte (*)[4]) argA[0]; + const GLubyte (*arg1)[4] = (const GLubyte (*)[4]) argA[1]; + for (i = 0; i < n; i++) { + GLint a = (GLint) arg0[i][ACOMP] + (GLint) arg1[i][ACOMP] - 128; + a = (a < 0) ? 0 : a << Ashift; + rgba[i][ACOMP] = (GLubyte) MIN2(a, 255); + } + } + break; + case GL_INTERPOLATE_EXT: + { + const GLubyte (*arg0)[4] = (const GLubyte (*)[4]) argA[0]; + const GLubyte (*arg1)[4] = (const GLubyte (*)[4]) argA[1]; + const GLubyte (*arg2)[4] = (const GLubyte (*)[4]) argA[2]; + Ashift = 8 - Ashift; + for (i=0; i> Ashift; + rgba[i][ACOMP] = (GLubyte) MIN2(a, 255); + } + } + break; + default: + gl_problem(NULL, "invalid combine mode"); + } +} +#undef PROD + + + /**********************************************************************/ /* Texture Application */ /**********************************************************************/ @@ -1947,14 +2301,16 @@ * Input: textureUnit - pointer to texture unit to apply * format - base internal texture format * n - number of fragments + * primary_rgba - primary colors (may be rgba for single texture) * texels - array of texel colors * InOut: rgba - incoming fragment colors modified by texel colors * according to the texture environment mode. */ -static void apply_texture( const GLcontext *ctx, +static void apply_texture( CONST GLcontext *ctx, const struct gl_texture_unit *texUnit, GLuint n, - GLubyte rgba[][4], CONST GLubyte texel[][4] ) + GLubyte primary_rgba[][4], GLubyte texel[][4], + GLubyte rgba[][4] ) { GLint baseLevel; GLuint i; @@ -2284,6 +2640,52 @@ } break; + case GL_COMBINE_EXT: /* GL_EXT_combine_ext; we modify texel array */ + switch (format) { + case GL_ALPHA: + for (i=0;iTexture.Enabled & mask) { + if (ctx->Texture.ReallyEnabled & mask) { const struct gl_texture_unit *textureUnit = &ctx->Texture.Unit[texUnit]; if (textureUnit->Current && textureUnit->Current->SampleFunc) { GLubyte texel[PB_SIZE][4]; @@ -2327,41 +2729,9 @@ } /* fetch texture images from device driver, if needed */ - { - static const GLenum targets[] = { - GL_TEXTURE_1D, - GL_TEXTURE_2D, - GL_TEXTURE_3D, - GL_TEXTURE_CUBE_MAP_ARB, - GL_TEXTURE_CUBE_MAP_ARB, - GL_TEXTURE_CUBE_MAP_ARB - }; - struct gl_texture_object *texObj = textureUnit->Current; - GLboolean needLambda = (texObj->MinFilter != texObj->MagFilter); - GLenum target = targets[texObj->Dimensions - 1]; - if (needLambda) { - GLint level; - /* Get images for all mipmap levels. We might not need them - * all but this is easier. We're on a (slow) software path - * anyway. - */ - for (level = 0; level <= texObj->P; level++) { - struct gl_texture_image *texImg = texObj->Image[level]; - if (texImg && !texImg->Data) { - _mesa_get_teximage_from_driver(ctx, target, level, texObj); - if (!texImg->Data) - return; /* out of memory */ - } - } - } - else { - GLint level = texObj->BaseLevel; - struct gl_texture_image *texImg = texObj->Image[level]; - if (texImg && !texImg->Data) { - _mesa_get_teximage_from_driver(ctx, target, level, texObj); - if (!texImg->Data) - return; /* out of memory */ - } + if (ctx->Driver.GetTexImage) { + if (!_mesa_get_teximages_from_driver(ctx, textureUnit->Current)) { + return; } } @@ -2369,8 +2739,7 @@ (*textureUnit->Current->SampleFunc)( textureUnit->Current, n, s, t, r, lambda, texel ); - apply_texture( ctx, textureUnit, n, - rgba, (const GLubyte (*)[4])texel ); + apply_texture( ctx, textureUnit, n, primary_rgba, texel, rgba ); } } } Index: xc/extras/Mesa/src/texture.h diff -u xc/extras/Mesa/src/texture.h:1.4 xc/extras/Mesa/src/texture.h:1.7 --- xc/extras/Mesa/src/texture.h:1.4 Fri Jun 16 20:02:17 2000 +++ xc/extras/Mesa/src/texture.h Mon Nov 13 18:30:53 2000 @@ -46,7 +46,7 @@ extern void gl_texture_pixels( GLcontext *ctx, GLuint texSet, GLuint n, const GLfloat s[], const GLfloat t[], const GLfloat r[], GLfloat lambda[], - GLubyte rgba[][4] ); + GLubyte primary_rgba[][4], GLubyte rgba[][4] ); #endif Index: xc/extras/Mesa/src/texutil.c diff -u xc/extras/Mesa/src/texutil.c:1.1 xc/extras/Mesa/src/texutil.c:1.6 --- xc/extras/Mesa/src/texutil.c:1.1 Fri Jun 16 20:02:17 2000 +++ xc/extras/Mesa/src/texutil.c Thu Nov 30 10:39:05 2000 @@ -1,7 +1,7 @@ /* * Mesa 3-D graphics library - * Version: 3.3 + * Version: 3.4 * * Copyright (C) 1999-2000 Brian Paul All Rights Reserved. * @@ -80,7 +80,10 @@ * GL_RGBA GL_UNSIGNED_BYTE MESA_A4_R4_G4_B4 * GL_BGRA GL_UNSIGNED_SHORT_4_4_4_4_REV MESA_A4_R4_G4_B4 * GL_BGRA GL_UNSIGHED_SHORT_1_5_5_5_REV MESA_A1_R5_G5_B5 + * GL_RGBA GL_UNSIGNED_BYTE MESA_A1_R5_G5_B5 * GL_BGRA GL_UNSIGNED_INT_8_8_8_8_REV MESA_A8_R8_G8_B8 + * GL_RGBA GL_UNSIGNED_BYTE MESA_A8_R8_G8_B8 + * GL_RGB GL_UNSIGNED_BYTE MESA_A8_R8_G8_B8 * more to be added for new drivers... * * Notes: @@ -123,8 +126,9 @@ /* store as 8-bit texels */ if (wScale == 1 && hScale == 1) { /* no scaling needed - fast case */ - const GLubyte *src = _mesa_image_address(packing, srcImage, - srcWidth, srcHeight, srcFormat, srcType, 0, 0, 0); + const GLubyte *src = (const GLubyte *) + _mesa_image_address(packing, srcImage, srcWidth, srcHeight, + srcFormat, srcType, 0, 0, 0); const GLint srcStride = _mesa_image_row_stride(packing, srcWidth, srcFormat, srcType); GLubyte *dst = (GLubyte *) dstImage; @@ -141,8 +145,9 @@ GLint row; for (row = 0; row < dstHeight; row++) { GLint srcRow = row / hScale; - const GLubyte *src = _mesa_image_address(packing, srcImage, - srcWidth, srcHeight, srcFormat, srcType, 0, srcRow, 0); + const GLubyte *src = (const GLubyte *) + _mesa_image_address(packing, srcImage, srcWidth, + srcHeight, srcFormat, srcType, 0, srcRow, 0); GLint col; for (col = 0; col < dstWidth; col++) { dst[col] = src[col / wScale]; @@ -160,8 +165,9 @@ else { /* store as 16-bit texels */ if (wScale == 1 && hScale == 1) { - const GLubyte *src = _mesa_image_address(packing, srcImage, - srcWidth, srcHeight, srcFormat, srcType, 0, 0, 0); + const GLubyte *src = (const GLubyte *) + _mesa_image_address(packing, srcImage, srcWidth, srcHeight, + srcFormat, srcType, 0, 0, 0); const GLint srcStride = _mesa_image_row_stride(packing, srcWidth, srcFormat, srcType); GLushort *dst = (GLushort *) dstImage; @@ -182,8 +188,9 @@ GLint row, col; for (row = 0; row < dstHeight; row++) { GLint srcRow = row / hScale; - const GLubyte *src = _mesa_image_address(packing, srcImage, - srcWidth, srcHeight, srcFormat, srcType, 0, srcRow, 0); + const GLubyte *src = (const GLubyte *) + _mesa_image_address(packing, srcImage, srcWidth, + srcHeight, srcFormat, srcType, 0, srcRow, 0); const GLint srcStride = _mesa_image_row_stride(packing, srcWidth, srcFormat, srcType); for (col = 0; col < dstWidth; col++) { @@ -203,8 +210,9 @@ if (srcFormat == GL_RGB && srcType == GL_UNSIGNED_SHORT_5_6_5) { /* special, optimized case */ if (wScale == 1 && hScale == 1) { - const GLubyte *src = _mesa_image_address(packing, srcImage, - srcWidth, srcHeight, srcFormat, srcType, 0, 0, 0); + const GLubyte *src = (const GLubyte *) + _mesa_image_address(packing, srcImage, srcWidth, srcHeight, + srcFormat, srcType, 0, 0, 0); const GLint srcStride = _mesa_image_row_stride(packing, srcWidth, srcFormat, srcType); GLushort *dst = (GLushort *) dstImage; @@ -221,8 +229,9 @@ GLint row; for (row = 0; row < dstHeight; row++) { GLint srcRow = row / hScale; - const GLushort *src = _mesa_image_address(packing, srcImage, - srcWidth, srcHeight, srcFormat, srcType, 0, srcRow, 0); + const GLushort *src = (const GLushort *) + _mesa_image_address(packing, srcImage, srcWidth, + srcHeight, srcFormat, srcType, 0, srcRow, 0); GLint col; for (col = 0; col < dstWidth; col++) { dst[col] = src[col / wScale]; @@ -234,8 +243,9 @@ else if (srcFormat == GL_RGB && srcType == GL_UNSIGNED_BYTE) { /* general case */ if (wScale == 1 && hScale == 1) { - const GLubyte *src = _mesa_image_address(packing, srcImage, - srcWidth, srcHeight, srcFormat, srcType, 0, 0, 0); + const GLubyte *src = (const GLubyte *) + _mesa_image_address(packing, srcImage, srcWidth, srcHeight, + srcFormat, srcType, 0, 0, 0); const GLint srcStride = _mesa_image_row_stride(packing, srcWidth, srcFormat, srcType); #ifdef DO_32BIT_STORES @@ -286,8 +296,9 @@ GLint row; for (row = 0; row < dstHeight; row++) { GLint srcRow = row / hScale; - const GLubyte *src = _mesa_image_address(packing, srcImage, - srcWidth, srcHeight, srcFormat, srcType, 0, srcRow, 0); + const GLubyte *src = (const GLubyte *) + _mesa_image_address(packing, srcImage, srcWidth, + srcHeight, srcFormat, srcType, 0, srcRow, 0); GLint col; for (col = 0; col < dstWidth; col++) { GLint col3 = (col / wScale) * 3; @@ -305,8 +316,9 @@ else if (srcFormat == GL_RGBA && srcType == GL_UNSIGNED_BYTE) { /* general case (used by Quake3) */ if (wScale == 1 && hScale == 1) { - const GLubyte *src = _mesa_image_address(packing, srcImage, - srcWidth, srcHeight, srcFormat, srcType, 0, 0, 0); + const GLubyte *src = (const GLubyte *) + _mesa_image_address(packing, srcImage, srcWidth, srcHeight, + srcFormat, srcType, 0, 0, 0); const GLint srcStride = _mesa_image_row_stride(packing, srcWidth, srcFormat, srcType); #ifdef DO_32BIT_STORES @@ -357,8 +369,9 @@ GLint row; for (row = 0; row < dstHeight; row++) { GLint srcRow = row / hScale; - const GLubyte *src = _mesa_image_address(packing, srcImage, - srcWidth, srcHeight, srcFormat, srcType, 0, srcRow, 0); + const GLubyte *src = (const GLubyte *) + _mesa_image_address(packing, srcImage, srcWidth, + srcHeight, srcFormat, srcType, 0, srcRow, 0); GLint col; for (col = 0; col < dstWidth; col++) { GLint col4 = (col / wScale) * 4; @@ -384,8 +397,9 @@ if (srcFormat == GL_BGRA && srcType == GL_UNSIGNED_SHORT_4_4_4_4_REV){ /* special, optimized case */ if (wScale == 1 && hScale == 1) { - const GLubyte *src = _mesa_image_address(packing, srcImage, - srcWidth, srcHeight, srcFormat, srcType, 0, 0, 0); + const GLubyte *src = (const GLubyte *) + _mesa_image_address(packing, srcImage, srcWidth, srcHeight, + srcFormat, srcType, 0, 0, 0); const GLint srcStride = _mesa_image_row_stride(packing, srcWidth, srcFormat, srcType); GLushort *dst = (GLushort *) dstImage; @@ -402,8 +416,9 @@ GLint row; for (row = 0; row < dstHeight; row++) { GLint srcRow = row / hScale; - const GLushort *src = _mesa_image_address(packing, srcImage, - srcWidth, srcHeight, srcFormat, srcType, 0, srcRow, 0); + const GLushort *src = (const GLushort *) + _mesa_image_address(packing, srcImage, srcWidth, + srcHeight, srcFormat, srcType, 0, srcRow, 0); GLint col; for (col = 0; col < dstWidth; col++) { dst[col] = src[col / wScale]; @@ -415,8 +430,9 @@ else if (srcFormat == GL_RGBA && srcType == GL_UNSIGNED_BYTE) { /* general case */ if (wScale == 1 && hScale == 1) { - const GLubyte *src = _mesa_image_address(packing, srcImage, - srcWidth, srcHeight, srcFormat, srcType, 0, 0, 0); + const GLubyte *src = (const GLubyte *) + _mesa_image_address(packing, srcImage, srcWidth, srcHeight, + srcFormat, srcType, 0, 0, 0); const GLint srcStride = _mesa_image_row_stride(packing, srcWidth, srcFormat, srcType); #ifdef DO_32BIT_STORES @@ -473,8 +489,9 @@ GLint row; for (row = 0; row < dstHeight; row++) { GLint srcRow = row / hScale; - const GLubyte *src = _mesa_image_address(packing, srcImage, - srcWidth, srcHeight, srcFormat, srcType, 0, srcRow, 0); + const GLubyte *src = (const GLubyte *) + _mesa_image_address(packing, srcImage, srcWidth, + srcHeight, srcFormat, srcType, 0, srcRow, 0); GLint col; for (col = 0; col < dstWidth; col++) { GLint col4 = (col / wScale) * 4; @@ -499,11 +516,12 @@ case MESA_A1_R5_G5_B5: /* store as 16-bit texels (GR_TEXFMT_ARGB_1555) */ - if (srcFormat == GL_RGBA && srcType == GL_UNSIGNED_SHORT_1_5_5_5_REV){ + if (srcFormat == GL_BGRA && srcType == GL_UNSIGNED_SHORT_1_5_5_5_REV){ /* special, optimized case */ if (wScale == 1 && hScale == 1) { - const GLubyte *src = _mesa_image_address(packing, srcImage, - srcWidth, srcHeight, srcFormat, srcType, 0, 0, 0); + const GLubyte *src = (const GLubyte *) + _mesa_image_address(packing, srcImage, srcWidth, srcHeight, + srcFormat, srcType, 0, 0, 0); const GLint srcStride = _mesa_image_row_stride(packing, srcWidth, srcFormat, srcType); GLushort *dst = (GLushort *) dstImage; @@ -520,8 +538,9 @@ GLint row; for (row = 0; row < dstHeight; row++) { GLint srcRow = row / hScale; - const GLushort *src = _mesa_image_address(packing, srcImage, - srcWidth, srcHeight, srcFormat, srcType, 0, srcRow, 0); + const GLushort *src = (const GLushort *) + _mesa_image_address(packing, srcImage, srcWidth, + srcHeight, srcFormat, srcType, 0, srcRow, 0); GLint col; for (col = 0; col < dstWidth; col++) { dst[col] = src[col / wScale]; @@ -533,8 +552,9 @@ else if (srcFormat == GL_RGBA && srcType == GL_UNSIGNED_BYTE) { /* general case */ if (wScale == 1 && hScale == 1) { - const GLubyte *src = _mesa_image_address(packing, srcImage, - srcWidth, srcHeight, srcFormat, srcType, 0, 0, 0); + const GLubyte *src = (const GLubyte *) + _mesa_image_address(packing, srcImage, srcWidth, srcHeight, + srcFormat, srcType, 0, 0, 0); const GLint srcStride = _mesa_image_row_stride(packing, srcWidth, srcFormat, srcType); GLushort *dst = (GLushort *) dstImage; @@ -561,8 +581,9 @@ GLint row; for (row = 0; row < dstHeight; row++) { GLint srcRow = row / hScale; - const GLubyte *src = _mesa_image_address(packing, srcImage, - srcWidth, srcHeight, srcFormat, srcType, 0, srcRow, 0); + const GLubyte *src = (const GLubyte *) + _mesa_image_address(packing, srcImage, srcWidth, + srcHeight, srcFormat, srcType, 0, srcRow, 0); GLint col; for (col = 0; col < dstWidth; col++) { GLint col4 = (col / wScale) * 4; @@ -586,15 +607,17 @@ break; case MESA_A8_R8_G8_B8: + case MESA_FF_R8_G8_B8: /* 32-bit texels */ if (srcFormat == GL_BGRA && srcType == GL_UNSIGNED_INT_8_8_8_8_REV){ /* special, optimized case */ if (wScale == 1 && hScale == 1) { - const GLubyte *src = _mesa_image_address(packing, srcImage, - srcWidth, srcHeight, srcFormat, srcType, 0, 0, 0); + const GLubyte *src = (const GLubyte *) + _mesa_image_address(packing, srcImage, srcWidth, srcHeight, + srcFormat, srcType, 0, 0, 0); const GLint srcStride = _mesa_image_row_stride(packing, srcWidth, srcFormat, srcType); - GLuint *dst = dstImage; + GLuint *dst = (GLuint *) dstImage; GLint row; for (row = 0; row < dstHeight; row++) { MEMCPY(dst, src, dstWidth * sizeof(GLuint)); @@ -604,12 +627,13 @@ } else { /* must rescale image */ - GLuint *dst = dstImage; + GLuint *dst = (GLuint *) dstImage; GLint row; for (row = 0; row < dstHeight; row++) { GLint srcRow = row / hScale; - const GLuint *src = _mesa_image_address(packing, srcImage, - srcWidth, srcHeight, srcFormat, srcType, 0, srcRow, 0); + const GLuint *src = (const GLuint *) + _mesa_image_address(packing, srcImage, srcWidth, + srcHeight, srcFormat, srcType, 0, srcRow, 0); GLint col; for (col = 0; col < dstWidth; col++) { dst[col] = src[col / wScale]; @@ -621,11 +645,12 @@ else if (srcFormat == GL_RGBA && srcType == GL_UNSIGNED_BYTE) { /* general case */ if (wScale == 1 && hScale == 1) { - const GLubyte *src = _mesa_image_address(packing, srcImage, - srcWidth, srcHeight, srcFormat, srcType, 0, 0, 0); + const GLubyte *src = (const GLubyte *) + _mesa_image_address(packing, srcImage, srcWidth, srcHeight, + srcFormat, srcType, 0, 0, 0); const GLint srcStride = _mesa_image_row_stride(packing, srcWidth, srcFormat, srcType); - GLuint *dst = dstImage; + GLuint *dst = (GLuint *) dstImage; GLint row; for (row = 0; row < dstHeight; row++) { GLint col, col4; @@ -642,12 +667,13 @@ } else { /* must rescale image */ - GLuint *dst = dstImage; + GLuint *dst = (GLuint *) dstImage; GLint row; for (row = 0; row < dstHeight; row++) { GLint srcRow = row / hScale; - const GLubyte *src = _mesa_image_address(packing, srcImage, - srcWidth, srcHeight, srcFormat, srcType, 0, srcRow, 0); + const GLubyte *src = (const GLubyte *) + _mesa_image_address(packing, srcImage, srcWidth, + srcHeight, srcFormat, srcType, 0, srcRow, 0); GLint col; for (col = 0; col < dstWidth; col++) { GLint col4 = (col / wScale) * 4; @@ -661,13 +687,65 @@ } } } + else if (srcFormat == GL_RGB && srcType == GL_UNSIGNED_BYTE) { + /* general case */ + if (wScale == 1 && hScale == 1) { + const GLubyte *src = (const GLubyte *) + _mesa_image_address(packing, srcImage, srcWidth, srcHeight, + srcFormat, srcType, 0, 0, 0); + const GLint srcStride = _mesa_image_row_stride(packing, + srcWidth, srcFormat, srcType); + GLuint *dst = (GLuint *) dstImage; + GLint row; + for (row = 0; row < dstHeight; row++) { + GLint col, col3; + for (col = col3 = 0; col < dstWidth; col++, col3 += 3) { + GLubyte r = src[col3 + 0]; + GLubyte g = src[col3 + 1]; + GLubyte b = src[col3 + 2]; + GLubyte a = 255; + dst[col] = (a << 24) | (r << 16) | (g << 8) | b; + } + src += srcStride; + dst = (GLuint *) ((GLubyte *) dst + dstRowStride); + } + } + else { + /* must rescale image */ + GLuint *dst = (GLuint *) dstImage; + GLint row; + for (row = 0; row < dstHeight; row++) { + GLint srcRow = row / hScale; + const GLubyte *src = (const GLubyte *) + _mesa_image_address(packing, srcImage, srcWidth, + srcHeight, srcFormat, srcType, 0, srcRow, 0); + GLint col; + for (col = 0; col < dstWidth; col++) { + GLint col3 = (col / wScale) * 3; + GLubyte r = src[col3 + 0]; + GLubyte g = src[col3 + 1]; + GLubyte b = src[col3 + 2]; + GLubyte a = 255; + dst[col] = (a << 24) | (r << 16) | (g << 8) | b; + } + dst = (GLuint *) ((GLubyte *) dst + dstRowStride); + } + } + } else { /* can't handle this source format/type combination */ return GL_FALSE; } + if (dstFormat == MESA_FF_R8_G8_B8) { + /* set alpha bytes to 0xff */ + GLint i; + GLubyte *dst = (GLubyte *) dstImage; + for (i = 0; i < dstWidth * dstHeight; i++) { + dst[i * 4 + 3] = 0xff; + } + } break; - default: /* unexpected internal format! */ return GL_FALSE; @@ -681,11 +759,11 @@ * Replace a subregion of a texture image with new data. * Input: * dstFormat - destination image format - * dstXoffset, dstYoffset - destination for new subregion - * dstWidth, dstHeight - total size of dest image + * dstXoffset, dstYoffset - destination for new subregion (in texels) + * dstWidth, dstHeight - total size of dest image (in texels) * dstImage - pointer to dest image - * dstRowStride - bytes to jump between image rows - * width, height - size of region to copy/replace + * dstRowStride - bytes to jump between image rows (in bytes) + * width, height - size of region to copy/replace (in texels) * srcWidth, srcHeight - size of the corresponding gl_texture_image * srcFormat, srcType - source image format and datatype * srcImage - source image @@ -741,18 +819,25 @@ /* store as 8-bit texels */ if (wScale == 1 && hScale == 1) { /* no scaling needed - fast case */ - const GLubyte *src = _mesa_image_address(packing, srcImage, - srcWidth, srcHeight, srcFormat, srcType, 0, 0, 0); - const GLint srcStride = _mesa_image_row_stride(packing, + const GLubyte *src = (const GLubyte *) + _mesa_image_address(packing, srcImage, srcWidth, srcHeight, + srcFormat, srcType, 0, 0, 0); + const GLint srcRowStride = _mesa_image_row_stride(packing, width, srcFormat, srcType); GLubyte *dst = (GLubyte *) dstImage + dstYoffset * dstRowStride + dstXoffset; + const GLint rowSize = width * sizeof(GLubyte); GLint row; - for (row = 0; row < height; row++) { - MEMCPY(dst, src, width * sizeof(GLubyte)); - dst += dstRowStride; - src += srcStride; + if (dstRowStride == srcRowStride && dstRowStride == rowSize) { + MEMCPY(dst, src, rowSize * height); } + else { + for (row = 0; row < height; row++) { + MEMCPY(dst, src, rowSize); + dst += dstRowStride; + src += srcRowStride; + } + } } else { /* must rescale image */ @@ -761,8 +846,9 @@ GLint row; for (row = 0; row < height; row++) { GLint srcRow = row / hScale; - const GLubyte *src = _mesa_image_address(packing, srcImage, - srcWidth, srcHeight, srcFormat, srcType, 0, srcRow, 0); + const GLubyte *src = (const GLubyte *) + _mesa_image_address(packing, srcImage, srcWidth, + srcHeight, srcFormat, srcType, 0, srcRow, 0); GLint col; for (col = 0; col < width; col++) { dst[col] = src[col / wScale]; @@ -780,8 +866,9 @@ else { /* store as 16-bit texels */ if (wScale == 1 && hScale == 1) { - const GLubyte *src = _mesa_image_address(packing, srcImage, - srcWidth, srcHeight, srcFormat, srcType, 0, 0, 0); + const GLubyte *src = (const GLubyte *) + _mesa_image_address(packing, srcImage, srcWidth, srcHeight, + srcFormat, srcType, 0, 0, 0); const GLint srcStride = _mesa_image_row_stride(packing, width, srcFormat, srcType); GLushort *dst = (GLushort *) ((GLubyte *) dstImage @@ -804,8 +891,9 @@ GLint row, col; for (row = 0; row < height; row++) { GLint srcRow = row / hScale; - const GLubyte *src = _mesa_image_address(packing, srcImage, - srcWidth, srcHeight, srcFormat, srcType, 0, srcRow, 0); + const GLubyte *src = (const GLubyte *) + _mesa_image_address(packing, srcImage, srcWidth, + srcHeight, srcFormat, srcType, 0, srcRow, 0); const GLint srcStride = _mesa_image_row_stride(packing, width, srcFormat, srcType); for (col = 0; col < width; col++) { @@ -825,8 +913,9 @@ if (srcFormat == GL_RGB && srcType == GL_UNSIGNED_SHORT_5_6_5) { /* special, optimized case */ if (wScale == 1 && hScale == 1) { - const GLubyte *src = _mesa_image_address(packing, srcImage, - srcWidth, srcHeight, srcFormat, srcType, 0, 0, 0); + const GLubyte *src = (const GLubyte *) + _mesa_image_address(packing, srcImage, srcWidth, srcHeight, + srcFormat, srcType, 0, 0, 0); const GLint srcStride = _mesa_image_row_stride(packing, width, srcFormat, srcType); GLushort *dst = (GLushort *) ((GLubyte *) dstImage @@ -845,8 +934,9 @@ GLint row; for (row = 0; row < height; row++) { GLint srcRow = row / hScale; - const GLushort *src = _mesa_image_address(packing, srcImage, - srcWidth, srcHeight, srcFormat, srcType, 0, srcRow, 0); + const GLushort *src = (const GLushort *) + _mesa_image_address(packing, srcImage, srcWidth, + srcHeight, srcFormat, srcType, 0, srcRow, 0); GLint col; for (col = 0; col < width; col++) { dst[col] = src[col / wScale]; @@ -858,8 +948,9 @@ else if (srcFormat == GL_RGB && srcType == GL_UNSIGNED_BYTE) { /* general case */ if (wScale == 1 && hScale == 1) { - const GLubyte *src = _mesa_image_address(packing, srcImage, - srcWidth, srcHeight, srcFormat, srcType, 0, 0, 0); + const GLubyte *src = (const GLubyte *) + _mesa_image_address(packing, srcImage, srcWidth, srcHeight, + srcFormat, srcType, 0, 0, 0); const GLint srcStride = _mesa_image_row_stride(packing, width, srcFormat, srcType); GLushort *dst = (GLushort *) ((GLubyte *) dstImage @@ -886,8 +977,9 @@ GLint row; for (row = 0; row < height; row++) { GLint srcRow = row / hScale; - const GLubyte *src = _mesa_image_address(packing, srcImage, - srcWidth, srcHeight, srcFormat, srcType, 0, srcRow, 0); + const GLubyte *src = (const GLubyte *) + _mesa_image_address(packing, srcImage, srcWidth, + srcHeight, srcFormat, srcType, 0, srcRow, 0); GLint col; for (col = 0; col < width; col++) { GLint col3 = (col / wScale) * 3; @@ -905,8 +997,9 @@ else if (srcFormat == GL_RGBA && srcType == GL_UNSIGNED_BYTE) { /* general case (used by Quake3) */ if (wScale == 1 && hScale == 1) { - const GLubyte *src = _mesa_image_address(packing, srcImage, - srcWidth, srcHeight, srcFormat, srcType, 0, 0, 0); + const GLubyte *src = (const GLubyte *) + _mesa_image_address(packing, srcImage, srcWidth, srcHeight, + srcFormat, srcType, 0, 0, 0); const GLint srcStride = _mesa_image_row_stride(packing, width, srcFormat, srcType); GLushort *dst = (GLushort *) ((GLubyte *) dstImage @@ -933,8 +1026,9 @@ GLint row; for (row = 0; row < height; row++) { GLint srcRow = row / hScale; - const GLubyte *src = _mesa_image_address(packing, srcImage, - srcWidth, srcHeight, srcFormat, srcType, 0, srcRow, 0); + const GLubyte *src = (const GLubyte *) + _mesa_image_address(packing, srcImage, srcWidth, + srcHeight, srcFormat, srcType, 0, srcRow, 0); GLint col; for (col = 0; col < width; col++) { GLint col4 = (col / wScale) * 4; @@ -960,8 +1054,9 @@ if (srcFormat == GL_BGRA && srcType == GL_UNSIGNED_SHORT_4_4_4_4_REV){ /* special, optimized case */ if (wScale == 1 && hScale == 1) { - const GLubyte *src = _mesa_image_address(packing, srcImage, - srcWidth, srcHeight, srcFormat, srcType, 0, 0, 0); + const GLubyte *src = (const GLubyte *) + _mesa_image_address(packing, srcImage, srcWidth, srcHeight, + srcFormat, srcType, 0, 0, 0); const GLint srcStride = _mesa_image_row_stride(packing, width, srcFormat, srcType); GLushort *dst = (GLushort *) ((GLubyte *) dstImage @@ -980,8 +1075,9 @@ GLint row; for (row = 0; row < height; row++) { GLint srcRow = row / hScale; - const GLushort *src = _mesa_image_address(packing, srcImage, - srcWidth, srcHeight, srcFormat, srcType, 0, srcRow, 0); + const GLushort *src = (const GLushort *) + _mesa_image_address(packing, srcImage, srcWidth, + srcHeight, srcFormat, srcType, 0, srcRow, 0); GLint col; for (col = 0; col < width; col++) { dst[col] = src[col / wScale]; @@ -993,8 +1089,9 @@ else if (srcFormat == GL_RGBA && srcType == GL_UNSIGNED_BYTE) { /* general case */ if (wScale == 1 && hScale == 1) { - const GLubyte *src = _mesa_image_address(packing, srcImage, - srcWidth, srcHeight, srcFormat, srcType, 0, 0, 0); + const GLubyte *src = (const GLubyte *) + _mesa_image_address(packing, srcImage, srcWidth, srcHeight, + srcFormat, srcType, 0, 0, 0); const GLint srcStride = _mesa_image_row_stride(packing, width, srcFormat, srcType); GLushort *dst = (GLushort *) ((GLubyte *) dstImage @@ -1023,8 +1120,9 @@ GLint row; for (row = 0; row < height; row++) { GLint srcRow = row / hScale; - const GLubyte *src = _mesa_image_address(packing, srcImage, - srcWidth, srcHeight, srcFormat, srcType, 0, srcRow, 0); + const GLubyte *src = (const GLubyte *) + _mesa_image_address(packing, srcImage, srcWidth, + srcHeight, srcFormat, srcType, 0, srcRow, 0); GLint col; for (col = 0; col < width; col++) { GLint col4 = (col / wScale) * 4; @@ -1049,11 +1147,12 @@ case MESA_A1_R5_G5_B5: /* store as 16-bit texels (GR_TEXFMT_ARGB_1555) */ - if (srcFormat == GL_RGBA && srcType == GL_UNSIGNED_SHORT_1_5_5_5_REV){ + if (srcFormat == GL_BGRA && srcType == GL_UNSIGNED_SHORT_1_5_5_5_REV){ /* special, optimized case */ if (wScale == 1 && hScale == 1) { - const GLubyte *src = _mesa_image_address(packing, srcImage, - srcWidth, srcHeight, srcFormat, srcType, 0, 0, 0); + const GLubyte *src = (const GLubyte *) + _mesa_image_address(packing, srcImage, srcWidth, srcHeight, + srcFormat, srcType, 0, 0, 0); const GLint srcStride = _mesa_image_row_stride(packing, width, srcFormat, srcType); GLushort *dst = (GLushort *) ((GLubyte *) dstImage @@ -1072,8 +1171,9 @@ GLint row; for (row = 0; row < height; row++) { GLint srcRow = row / hScale; - const GLushort *src = _mesa_image_address(packing, srcImage, - srcWidth, srcHeight, srcFormat, srcType, 0, srcRow, 0); + const GLushort *src = (const GLushort *) + _mesa_image_address(packing, srcImage, srcWidth, + srcHeight, srcFormat, srcType, 0, srcRow, 0); GLint col; for (col = 0; col < width; col++) { dst[col] = src[col / wScale]; @@ -1085,8 +1185,9 @@ else if (srcFormat == GL_RGBA && srcType == GL_UNSIGNED_BYTE) { /* general case */ if (wScale == 1 && hScale == 1) { - const GLubyte *src = _mesa_image_address(packing, srcImage, - srcWidth, srcHeight, srcFormat, srcType, 0, 0, 0); + const GLubyte *src = (const GLubyte *) + _mesa_image_address(packing, srcImage, srcWidth, srcHeight, + srcFormat, srcType, 0, 0, 0); const GLint srcStride = _mesa_image_row_stride(packing, width, srcFormat, srcType); GLushort *dst = (GLushort *) ((GLubyte *) dstImage @@ -1115,8 +1216,9 @@ GLint row; for (row = 0; row < height; row++) { GLint srcRow = row / hScale; - const GLubyte *src = _mesa_image_address(packing, srcImage, - srcWidth, srcHeight, srcFormat, srcType, 0, srcRow, 0); + const GLubyte *src = (const GLubyte *) + _mesa_image_address(packing, srcImage, srcWidth, + srcHeight, srcFormat, srcType, 0, srcRow, 0); GLint col; for (col = 0; col < width; col++) { GLint col4 = (col / wScale) * 4; @@ -1140,12 +1242,14 @@ break; case MESA_A8_R8_G8_B8: + case MESA_FF_R8_G8_B8: /* 32-bit texels */ - if (srcFormat == GL_BGRA && srcType == GL_UNSIGNED_INT_8_8_8_8_REV){ + if (srcFormat == GL_BGRA && srcType == GL_UNSIGNED_INT_8_8_8_8_REV) { /* special, optimized case */ if (wScale == 1 && hScale == 1) { - const GLubyte *src = _mesa_image_address(packing, srcImage, - srcWidth, srcHeight, srcFormat, srcType, 0, 0, 0); + const GLubyte *src = (const GLubyte *) + _mesa_image_address(packing, srcImage, srcWidth, srcHeight, + srcFormat, srcType, 0, 0, 0); const GLint srcStride = _mesa_image_row_stride(packing, width, srcFormat, srcType); GLuint *dst = (GLuint *) ((GLubyte *) dstImage @@ -1164,8 +1268,9 @@ GLint row; for (row = 0; row < height; row++) { GLint srcRow = row / hScale; - const GLuint *src = _mesa_image_address(packing, srcImage, - srcWidth, srcHeight, srcFormat, srcType, 0, srcRow, 0); + const GLuint *src = (const GLuint *) + _mesa_image_address(packing, srcImage, srcWidth, + srcHeight, srcFormat, srcType, 0, srcRow, 0); GLint col; for (col = 0; col < width; col++) { dst[col] = src[col / wScale]; @@ -1173,12 +1278,27 @@ dst = (GLuint *) ((GLubyte *) dst + dstRowStride); } } + if (dstFormat == MESA_FF_R8_G8_B8) { + /* set alpha bytes to 0xff */ + GLint row, col; + GLubyte *dst = (GLubyte *) dstImage + + dstYoffset * dstRowStride + dstXoffset * 4; + assert(wScale == 1 && hScale == 1); /* XXX not done */ + for (row = 0; row < height; row++) { + for (col = 0; col < width; col++) { + dst[col * 4 + 3] = 0xff; + } + dst = dst + dstRowStride; + } + } } else if (srcFormat == GL_RGBA && srcType == GL_UNSIGNED_BYTE) { /* general case */ + const GLubyte aMask = (dstFormat==MESA_FF_R8_G8_B8) ? 0xff : 0x00; if (wScale == 1 && hScale == 1) { - const GLubyte *src = _mesa_image_address(packing, srcImage, - srcWidth, srcHeight, srcFormat, srcType, 0, 0, 0); + const GLubyte *src = (const GLubyte *) + _mesa_image_address(packing, srcImage, srcWidth, srcHeight, + srcFormat, srcType, 0, 0, 0); const GLint srcStride = _mesa_image_row_stride(packing, width, srcFormat, srcType); GLuint *dst = (GLuint *) ((GLubyte *) dstImage @@ -1190,7 +1310,7 @@ GLubyte r = src[col4 + 0]; GLubyte g = src[col4 + 1]; GLubyte b = src[col4 + 2]; - GLubyte a = src[col4 + 3]; + GLubyte a = src[col4 + 3] | aMask; dst[col] = (a << 24) | (r << 16) | (g << 8) | b; } src += srcStride; @@ -1204,15 +1324,16 @@ GLint row; for (row = 0; row < height; row++) { GLint srcRow = row / hScale; - const GLubyte *src = _mesa_image_address(packing, srcImage, - srcWidth, srcHeight, srcFormat, srcType, 0, srcRow, 0); + const GLubyte *src = (const GLubyte *) + _mesa_image_address(packing, srcImage, srcWidth, + srcHeight, srcFormat, srcType, 0, srcRow, 0); GLint col; for (col = 0; col < width; col++) { GLint col4 = (col / wScale) * 4; GLubyte r = src[col4 + 0]; GLubyte g = src[col4 + 1]; GLubyte b = src[col4 + 2]; - GLubyte a = src[col4 + 3]; + GLubyte a = src[col4 + 3] | aMask; dst[col] = (a << 24) | (r << 16) | (g << 8) | b; } dst = (GLuint *) ((GLubyte *) dst + dstRowStride); @@ -1491,6 +1612,7 @@ } break; case MESA_A8_R8_G8_B8: + case MESA_FF_R8_G8_B8: ASSERT(dstFormat == GL_RGBA); if (wScale == 1 && hScale == 1) { GLint i, n = dstWidth * dstHeight; @@ -1546,6 +1668,7 @@ { MESA_A4_R4_G4_B4, 4, 4, 4, 4, 0, 0, 0 }, { MESA_A1_R5_G5_B5, 5, 5, 5, 1, 0, 0, 0 }, { MESA_A8_R8_G8_B8, 8, 8, 8, 8, 0, 0, 0 }, + { MESA_FF_R8_G8_B8, 8, 8, 8, 8, 0, 0, 0 }, { -1, 0, 0, 0, 0, 0, 0, 0 } }; GLint i; Index: xc/extras/Mesa/src/texutil.h diff -u xc/extras/Mesa/src/texutil.h:1.1 xc/extras/Mesa/src/texutil.h:1.5 --- xc/extras/Mesa/src/texutil.h:1.1 Fri Jun 16 20:02:18 2000 +++ xc/extras/Mesa/src/texutil.h Mon Nov 13 18:30:53 2000 @@ -1,7 +1,7 @@ /* * Mesa 3-D graphics library - * Version: 3.3 + * Version: 3.4 * * Copyright (C) 1999-2000 Brian Paul All Rights Reserved. * @@ -32,6 +32,9 @@ +/* + * NOTE: "FF" means fill with byte value 0xff + */ /* msb <------ TEXEL BITS -----------> lsb */ typedef enum { /* ---- ---- ---- ---- ---- ---- ---- ---- */ MESA_I8, /* IIII IIII */ @@ -42,7 +45,8 @@ MESA_R5_G6_B5, /* RRRR RGGG GGGB BBBB */ MESA_A4_R4_G4_B4, /* AAAA RRRR GGGG BBBB */ MESA_A1_R5_G5_B5, /* ARRR RRGG GGGB BBBB */ - MESA_A8_R8_G8_B8 /* AAAA AAAA RRRR RRRR GGGG GGGG BBBB BBBB */ + MESA_A8_R8_G8_B8, /* AAAA AAAA RRRR RRRR GGGG GGGG BBBB BBBB */ + MESA_FF_R8_G8_B8 /* FFFF FFFF RRRR RRRR GGGG GGGG BBBB BBBB */ } MesaIntTexFormat; Index: xc/extras/Mesa/src/triangle.c diff -u xc/extras/Mesa/src/triangle.c:1.5 xc/extras/Mesa/src/triangle.c:1.9 --- xc/extras/Mesa/src/triangle.c:1.5 Fri Jun 16 20:02:18 2000 +++ xc/extras/Mesa/src/triangle.c Mon Nov 13 18:30:53 2000 @@ -1,7 +1,7 @@ /* * Mesa 3-D graphics library - * Version: 3.3 + * Version: 3.4 * * Copyright (C) 1999-2000 Brian Paul All Rights Reserved. * @@ -42,6 +42,7 @@ #include "mem.h" #include "mmath.h" #include "span.h" +#include "teximage.h" #include "texstate.h" #include "triangle.h" #include "types.h" @@ -221,6 +222,7 @@ } + /* * Render an RGB, GL_DECAL, textured triangle. * Interpolate S,T only w/out mipmapping or perspective correction. @@ -239,8 +241,14 @@ GLint twidth_log2 = obj->Image[b]->WidthLog2; \ GLubyte *texture = obj->Image[b]->Data; \ GLint smask = obj->Image[b]->Width - 1; \ - GLint tmask = obj->Image[b]->Height - 1; - (void) pv; + GLint tmask = obj->Image[b]->Height - 1; \ + (void) pv; \ + if (!texture) { \ + if (!_mesa_get_teximages_from_driver(ctx, obj)) \ + return; \ + texture = obj->Image[b]->Data; \ + ASSERT(texture); \ + } #define INNER_LOOP( LEFT, RIGHT, Y ) \ { \ @@ -261,7 +269,7 @@ fft += fdtdx; \ } \ (*ctx->Driver.WriteRGBSpan)( ctx, n, LEFT, Y, \ - (const GLubyte (*)[3]) rgb, NULL ); \ + (CONST GLubyte (*)[3]) rgb, NULL ); \ } \ } @@ -290,8 +298,14 @@ GLint twidth_log2 = obj->Image[b]->WidthLog2; \ GLubyte *texture = obj->Image[b]->Data; \ GLint smask = obj->Image[b]->Width - 1; \ - GLint tmask = obj->Image[b]->Height - 1; - (void) pv; + GLint tmask = obj->Image[b]->Height - 1; \ + (void) pv; \ + if (!texture) { \ + if (!_mesa_get_teximages_from_driver(ctx, obj)) \ + return; \ + texture = obj->Image[b]->Data; \ + ASSERT(texture); \ + } #define INNER_LOOP( LEFT, RIGHT, Y ) \ { \ @@ -322,7 +336,7 @@ fft += fdtdx; \ } \ (*ctx->Driver.WriteRGBSpan)( ctx, n, LEFT, Y, \ - (const GLubyte (*)[3]) rgb, mask ); \ + (CONST GLubyte (*)[3]) rgb, mask ); \ } \ } @@ -360,6 +374,12 @@ GLint comp, tbytesline, tsize; \ GLfixed er, eg, eb, ea; \ GLint tr, tg, tb, ta; \ + if (!texture) { \ + if (!_mesa_get_teximages_from_driver(ctx, obj)) \ + return; \ + texture = obj->Image[b]->Data; \ + ASSERT(texture); \ + } \ if (envmode == GL_BLEND) { \ /* potential off-by-one error here? (1.0f -> 2048 -> 0) */ \ er = FloatToFixed(unit->EnvColor[0]); \ @@ -648,6 +668,12 @@ GLint comp, tbytesline, tsize; \ GLfixed er, eg, eb, ea; \ GLint tr, tg, tb, ta; \ + if (!texture) { \ + if (!_mesa_get_teximages_from_driver(ctx, obj)) \ + return; \ + texture = obj->Image[b]->Data; \ + ASSERT(texture); \ + } \ if (envmode == GL_BLEND) { \ er = FloatToFixed(unit->EnvColor[0]); \ eg = FloatToFixed(unit->EnvColor[1]); \ @@ -1017,7 +1043,7 @@ } \ gl_write_texture_span( ctx, n, LEFT, Y, zspan, \ s, t, u, NULL, rgba, \ - (const GLubyte (*)[4]) spec, \ + (CONST GLubyte (*)[4]) spec, \ GL_POLYGON ); \ } \ } @@ -1243,7 +1269,7 @@ } \ gl_write_texture_span( ctx, n, LEFT, Y, zspan, \ s, t, u, lambda, \ - rgba, (const GLubyte (*)[4]) spec, \ + rgba, (CONST GLubyte (*)[4]) spec, \ GL_POLYGON ); \ } \ } @@ -1371,9 +1397,9 @@ } \ } \ gl_write_multitexture_span( ctx, 2, n, LEFT, Y, zspan, \ - (const GLfloat (*)[MAX_WIDTH]) s, \ - (const GLfloat (*)[MAX_WIDTH]) t, \ - (const GLfloat (*)[MAX_WIDTH]) u, \ + (CONST GLfloat (*)[MAX_WIDTH]) s, \ + (CONST GLfloat (*)[MAX_WIDTH]) t, \ + (CONST GLfloat (*)[MAX_WIDTH]) u, \ (GLfloat (*)[MAX_WIDTH]) lambda, \ rgba, NULL, GL_POLYGON ); \ } \ @@ -1505,6 +1531,8 @@ } if (ctx->Depth.OcclusionTest && + ctx->DrawBuffer->DepthBuffer && + ctx->Depth.Test && ctx->Depth.Mask == GL_FALSE && ctx->Depth.Func == GL_LESS && !ctx->Stencil.Enabled) { @@ -1534,7 +1562,8 @@ && image->Border==0 && ((format = image->Format)==GL_RGB || format==GL_RGBA) && (filter = current2Dtex->MinFilter)==current2Dtex->MagFilter - && ctx->Light.Model.ColorControl==GL_SINGLE_COLOR) { + && ctx->Light.Model.ColorControl==GL_SINGLE_COLOR + && ctx->Texture.Unit[0].EnvMode!=GL_COMBINE_EXT) { if (ctx->Hint.PerspectiveCorrection==GL_FASTEST) { Index: xc/extras/Mesa/src/tritemp.h diff -u xc/extras/Mesa/src/tritemp.h:1.8 xc/extras/Mesa/src/tritemp.h:1.10 --- xc/extras/Mesa/src/tritemp.h:1.8 Fri Jun 16 20:02:18 2000 +++ xc/extras/Mesa/src/tritemp.h Mon Nov 13 18:30:53 2000 @@ -22,8 +22,8 @@ * 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. */ -/* $XFree86: xc/extras/Mesa/src/tritemp.h,v 1.8 2000/06/17 00:02:18 martin Exp $ */ + /* * Triangle Rasterizer Template * @@ -146,10 +146,17 @@ const GLfloat area = eMaj.dx * eBot.dy - eBot.dx * eMaj.dy; /* Do backface culling */ - if (area * bf < 0 || area * area < .0025) + if (area * bf < 0.0) return; + + if (area == 0.0F) + return; - oneOverArea = 1.0F / area; + /* check for very tiny triangle */ + if (area * area < 0.0025F) /* square it to ensure positive value */ + oneOverArea = 1.0F / 0.0025F; /* a close-enough value */ + else + oneOverArea = 1.0F / area; } #ifndef DO_OCCLUSION_TEST Index: xc/extras/Mesa/src/types.h diff -u xc/extras/Mesa/src/types.h:1.5 xc/extras/Mesa/src/types.h:1.10 --- xc/extras/Mesa/src/types.h:1.5 Fri Jun 16 20:02:18 2000 +++ xc/extras/Mesa/src/types.h Thu Nov 30 10:39:05 2000 @@ -2,7 +2,7 @@ /* * Mesa 3-D graphics library - * Version: 3.3 + * Version: 3.4 * * Copyright (C) 1999-2000 Brian Paul All Rights Reserved. * @@ -449,7 +449,7 @@ GLboolean RescaleNormals; GLboolean Scissor; GLboolean Stencil; - GLuint Texture; + GLuint Texture[MAX_TEXTURE_UNITS]; GLuint TexGen[MAX_TEXTURE_UNITS]; }; @@ -828,12 +828,21 @@ * Texture units are new with the multitexture extension. */ struct gl_texture_unit { - GLuint Enabled; - GLuint ReallyEnabled; + GLuint Enabled; /* bitmask of TEXTURE0_1D, _2D, _3D, _CUBE */ + GLuint ReallyEnabled; /* 0 or one of TEXTURE0_1D, _2D, _3D, _CUBE */ - GLenum EnvMode; /* GL_MODULATE, GL_DECAL, GL_BLEND */ + GLenum EnvMode; /* GL_MODULATE, GL_DECAL, GL_BLEND, GL_COMBINE_EXT */ GLenum LastEnvMode; + GLenum CombineSourceRGB[3]; /* arg[i] for rgb EXT_texture_combine */ + GLenum CombineSourceA[3]; /* dito for alpha combiner */ + GLenum CombineModeRGB; /* GL_REPLACE, GL_DECAL, GL_ADD ... */ + GLenum CombineModeA; + GLenum CombineOperandRGB[3]; /* SRC_COLOR or ONE_MINUS_SRC_COLOR */ + GLenum CombineOperandA[3]; /* SRC_ALPHA or ONE_MINUS_SRC_ALPHA */ + GLuint CombineScaleShiftRGB; /* 0, 1 or 2 */ + GLuint CombineScaleShiftA; + GLfloat EnvColor[4]; GLuint TexGenEnabled; /* Bitwise-OR of [STRQ]_BIT values */ GLenum GenModeS; /* Tex coord generation mode, either */ @@ -868,6 +877,7 @@ struct gl_texture_object Saved1D; /* only used by glPush/PopAttrib */ struct gl_texture_object Saved2D; struct gl_texture_object Saved3D; + struct gl_texture_object SavedCubeMap; }; @@ -876,9 +886,7 @@ GLuint CurrentUnit; /* Current texture unit */ GLuint CurrentTransformUnit; /* Current texture xform unit */ - /* Bitwise-OR of TEXTURE_XD values */ - GLuint Enabled; /* Enabled by the user */ - GLuint ReallyEnabled; /* Really enabled (w.r.t. completeness, etc) */ + GLuint ReallyEnabled; /* Really enabled (w.r.t. completeness, etc) */ GLuint LastEnabled; /* Decide whether enabled has really changed */ @@ -1029,8 +1037,51 @@ GLuint n ); +/*#define VAO*/ +#ifdef VAO +struct gl_array_object { + GLuint Name; + GLuint RefCount; + struct gl_client_array Vertex; /* client data descriptors */ + struct gl_client_array Normal; + struct gl_client_array Color; + struct gl_client_array Index; + struct gl_client_array TexCoord[MAX_TEXTURE_UNITS]; + struct gl_client_array EdgeFlag; + + trans_4f_func VertexFunc; /* conversion functions */ + trans_3f_func NormalFunc; + trans_4ub_func ColorFunc; + trans_1ui_func IndexFunc; + trans_4f_func TexCoordFunc[MAX_TEXTURE_UNITS]; + trans_1ub_func EdgeFlagFunc; + + trans_elt_4f_func VertexEltFunc; /* array elt conversion functions */ + trans_elt_3f_func NormalEltFunc; + trans_elt_4ub_func ColorEltFunc; + trans_elt_1ui_func IndexEltFunc; + trans_elt_4f_func TexCoordEltFunc[MAX_TEXTURE_UNITS]; + trans_elt_1ub_func EdgeFlagEltFunc; + + GLint TexCoordInterleaveFactor; + + GLuint LockFirst; + GLuint LockCount; + + GLuint Flag[VB_SIZE]; /* crock */ + GLuint Flags; + GLuint Summary; /* Like flags, but no size information */ +}; +#endif + + struct gl_array_attrib { +#ifdef VAO + struct gl_array_object *Current; + GLint ActiveTexture; /* Client Active Texture */ + GLuint NewArrayState; /* Tracks which arrays have been changed. */ +#else struct gl_client_array Vertex; /* client data descriptors */ struct gl_client_array Normal; struct gl_client_array Color; @@ -1062,6 +1113,7 @@ GLuint Flags; GLuint Summary; /* Like flags, but no size information */ GLuint NewArrayState; /* Tracks which arrays have been changed. */ +#endif }; @@ -1253,12 +1305,17 @@ GLint RefCount; /* Reference count */ struct _mesa_HashTable *DisplayList; /* Display lists hash table */ struct _mesa_HashTable *TexObjects; /* Texture objects hash table */ +#ifdef VAO + struct _mesa_HashTable *ArrayObjects; /* GL_EXT_vertex_array_set */ +#endif struct gl_texture_object *TexObjectList;/* Linked list of texture objects */ struct gl_texture_object *DirtyTexObjList; /* List of dirty tex objects */ /* Default texture objects (shared by all multi-texture units) */ struct gl_texture_object *DefaultD[4]; struct gl_texture_object *DefaultCubeMap; + + void *DriverData; /* Device driver shared state */ }; @@ -1365,6 +1422,7 @@ struct extension *ext_list; /* flags to quickly test if certain extensions are available */ GLboolean HaveTextureEnvAdd; + GLboolean HaveTextureEnvCombine; GLboolean HaveTextureLodBias; GLboolean HaveHpOcclusionTest; GLboolean HaveTextureCubeMap; @@ -1520,10 +1578,7 @@ * shared with the cull mode (ie. cull_mask_active and * compacted_normals.) */ -#define SHADE_RGBA_VERTICES 0x4 -#define SHADE_RGBA_NORMALS 0x8 -#define SHADE_RGBA_SPEC 0xc /* note - not a seperate bit */ -#define SHADE_TWOSIDE 0x10 +#define SHADE_TWOSIDE 0x4 /* Flags for selecting a normal transformation function. */ @@ -1778,7 +1833,7 @@ GLmatrix ProjectionMatrix; /* current matrix, not stored on stack */ GLuint ProjectionStackDepth; GLmatrix ProjectionStack[MAX_PROJECTION_STACK_DEPTH - 1]; - GLfloat NearFarStack[MAX_PROJECTION_STACK_DEPTH - 1][2]; + GLfloat NearFarStack[MAX_PROJECTION_STACK_DEPTH][2]; /* Combined modelview and projection matrix */ GLmatrix ModelProjectMatrix; @@ -1825,18 +1880,18 @@ struct gl_attrib_node *AttribStack[MAX_ATTRIB_STACK_DEPTH]; /* Renderer attribute groups */ - struct gl_accum_attrib Accum; + struct gl_accum_attrib Accum; struct gl_colorbuffer_attrib Color; struct gl_current_attrib Current; struct gl_depthbuffer_attrib Depth; - struct gl_eval_attrib Eval; + struct gl_eval_attrib Eval; struct gl_fog_attrib Fog; - struct gl_hint_attrib Hint; - struct gl_light_attrib Light; - struct gl_line_attrib Line; - struct gl_list_attrib List; - struct gl_pixel_attrib Pixel; - struct gl_point_attrib Point; + struct gl_hint_attrib Hint; + struct gl_light_attrib Light; + struct gl_line_attrib Line; + struct gl_list_attrib List; + struct gl_pixel_attrib Pixel; + struct gl_point_attrib Point; struct gl_polygon_attrib Polygon; GLuint PolygonStipple[32]; struct gl_scissor_attrib Scissor; @@ -1847,23 +1902,23 @@ /* Other attribute groups */ struct gl_histogram_attrib Histogram; - struct gl_minmax_attrib MinMax; - struct gl_convolution_attrib Convolution1D; - struct gl_convolution_attrib Convolution2D; - struct gl_convolution_attrib Separable2D; + struct gl_minmax_attrib MinMax; + struct gl_convolution_attrib Convolution1D; + struct gl_convolution_attrib Convolution2D; + struct gl_convolution_attrib Separable2D; /* Client attribute stack */ GLuint ClientAttribStackDepth; struct gl_attrib_node *ClientAttribStack[MAX_CLIENT_ATTRIB_STACK_DEPTH]; /* Client attribute groups */ - struct gl_array_attrib Array; /* Vertex arrays */ + struct gl_array_attrib Array; /* Vertex arrays */ struct gl_pixelstore_attrib Pack; /* Pixel packing */ struct gl_pixelstore_attrib Unpack; /* Pixel unpacking */ - struct gl_evaluators EvalMap; /* All evaluators */ - struct gl_feedback Feedback; /* Feedback */ - struct gl_selection Select; /* Selection */ + struct gl_evaluators EvalMap; /* All evaluators */ + struct gl_feedback Feedback; /* Feedback */ + struct gl_selection Select; /* Selection */ struct gl_color_table ColorTable; /* Pre-convolution */ struct gl_color_table ProxyColorTable; /* Pre-convolution */ @@ -1878,21 +1933,21 @@ struct gl_fallback_arrays Fallback; - GLenum ErrorValue; /* Last error code */ + GLenum ErrorValue; /* Last error code */ /* Miscellaneous */ - GLuint NewState; /* bitwise OR of NEW_* flags */ - GLuint Enabled; /* bitwise or of ENABLE_* flags */ - GLenum RenderMode; /* either GL_RENDER, GL_SELECT, GL_FEEDBACK */ - GLuint StippleCounter; /* Line stipple counter */ - GLuint RasterMask; /* OR of rasterization flags */ + GLuint NewState; /* bitwise OR of NEW_* flags */ + GLuint Enabled; /* bitwise or of ENABLE_* flags */ + GLenum RenderMode; /* either GL_RENDER, GL_SELECT, GL_FEEDBACK */ + GLuint StippleCounter; /* Line stipple counter */ + GLuint RasterMask; /* OR of rasterization flags */ GLuint TriangleCaps; /* OR of DD_* flags */ GLuint IndirectTriangles; /* TriangleCaps not handled by the driver */ - GLfloat PolygonZoffset; /* Z offset for GL_FILL polygons */ - GLfloat LineZoffset; /* Z offset for GL_LINE polygons */ - GLfloat PointZoffset; /* Z offset for GL_POINT polygons */ - GLboolean NeedNormals; /* Are vertex normal vectors needed? */ - GLuint FogMode; /* FOG_OFF, FOG_VERTEX or FOG_FRAGMENT */ + GLfloat PolygonZoffset; /* Z offset for GL_FILL polygons */ + GLfloat LineZoffset; /* Z offset for GL_LINE polygons */ + GLfloat PointZoffset; /* Z offset for GL_POINT polygons */ + GLboolean NeedNormals; /* Are vertex normal vectors needed? */ + GLuint FogMode; /* FOG_OFF, FOG_VERTEX or FOG_FRAGMENT */ GLboolean DoViewportMapping; @@ -1906,8 +1961,8 @@ normal_func *NormalTransform; - /* Current shading function */ - GLuint shade_func_flags; + /* Current shading function table */ + gl_shade_func *shade_func_tab; GLfloat EyeZDir[3]; GLfloat rescale_factor; @@ -1953,6 +2008,10 @@ /* Dither disable via MESA_NO_DITHER env var */ GLboolean NoDither; + +#ifdef DEBUG + GLboolean Rendering; +#endif }; @@ -2061,7 +2120,44 @@ #define Elements(x) sizeof(x)/sizeof(*(x)) -#endif +#ifdef DEBUG + +#define RENDER_START(CTX) \ + do { \ + assert(!(CTX)->Rendering); \ + (CTX)->Rendering = GL_TRUE; \ + if ((CTX)->Driver.RenderStart) { \ + (*(CTX)->Driver.RenderStart)(CTX); \ + } \ + } while (0) + +#define RENDER_FINISH(CTX) \ + do { \ + assert((CTX)->Rendering); \ + (CTX)->Rendering = GL_FALSE; \ + if ((CTX)->Driver.RenderFinish) { \ + (*(CTX)->Driver.RenderFinish)(CTX); \ + } \ + } while (0) + +#else + +#define RENDER_START(CTX) \ + do { \ + if ((CTX)->Driver.RenderStart) { \ + (*(CTX)->Driver.RenderStart)(CTX); \ + } \ + } while (0) + +#define RENDER_FINISH(CTX) \ + do { \ + if ((CTX)->Driver.RenderFinish) { \ + (*(CTX)->Driver.RenderFinish)(CTX); \ + } \ + } while (0) + +#endif +#endif /* TYPES_H */ Index: xc/extras/Mesa/src/varray.c diff -u xc/extras/Mesa/src/varray.c:1.4 xc/extras/Mesa/src/varray.c:1.9 --- xc/extras/Mesa/src/varray.c:1.4 Fri Jun 16 20:02:18 2000 +++ xc/extras/Mesa/src/varray.c Tue Dec 5 16:18:33 2000 @@ -29,11 +29,13 @@ #include "glheader.h" #include "context.h" #include "cva.h" +#include "dlist.h" #include "enable.h" #include "enums.h" -#include "dlist.h" +#include "hash.h" #include "light.h" #include "macros.h" +#include "mem.h" #include "mmath.h" #include "pipeline.h" #include "state.h" @@ -70,26 +72,55 @@ gl_lookup_enum_by_nr( type ), stride); +#ifdef VAO + ctx->Array.Current->Vertex.StrideB = stride; +#else ctx->Array.Vertex.StrideB = stride; +#endif if (!stride) { switch (type) { case GL_SHORT: +#ifdef VAO + ctx->Array.Current->Vertex.StrideB = size*sizeof(GLshort); +#else ctx->Array.Vertex.StrideB = size*sizeof(GLshort); +#endif break; case GL_INT: +#ifdef VAO + ctx->Array.Current->Vertex.StrideB = size*sizeof(GLint); +#else ctx->Array.Vertex.StrideB = size*sizeof(GLint); +#endif break; case GL_FLOAT: +#ifdef VAO + ctx->Array.Current->Vertex.StrideB = size*sizeof(GLfloat); +#else ctx->Array.Vertex.StrideB = size*sizeof(GLfloat); +#endif break; case GL_DOUBLE: +#ifdef VAO + ctx->Array.Current->Vertex.StrideB = size*sizeof(GLdouble); +#else ctx->Array.Vertex.StrideB = size*sizeof(GLdouble); +#endif break; default: gl_error( ctx, GL_INVALID_ENUM, "glVertexPointer(type)" ); return; } } +#ifdef VAO + ctx->Array.Current->Vertex.Size = size; + ctx->Array.Current->Vertex.Type = type; + ctx->Array.Current->Vertex.Stride = stride; + ctx->Array.Current->Vertex.Ptr = (void *) ptr; + ctx->Array.Current->VertexFunc = gl_trans_4f_tab[size][TYPE_IDX(type)]; + ctx->Array.Current->VertexEltFunc = gl_trans_elt_4f_tab[size][TYPE_IDX(type)]; + ctx->Array.NewArrayState |= VERT_OBJ_ANY; +#else ctx->Array.Vertex.Size = size; ctx->Array.Vertex.Type = type; ctx->Array.Vertex.Stride = stride; @@ -97,6 +128,7 @@ ctx->Array.VertexFunc = gl_trans_4f_tab[size][TYPE_IDX(type)]; ctx->Array.VertexEltFunc = gl_trans_elt_4f_tab[size][TYPE_IDX(type)]; ctx->Array.NewArrayState |= VERT_OBJ_ANY; +#endif ctx->NewState |= NEW_CLIENT_STATE; } @@ -118,34 +150,66 @@ gl_lookup_enum_by_nr( type ), stride); +#ifdef VAO + ctx->Array.Current->Normal.StrideB = stride; +#else ctx->Array.Normal.StrideB = stride; +#endif if (!stride) { switch (type) { case GL_BYTE: +#ifdef VAO + ctx->Array.Current->Normal.StrideB = 3*sizeof(GLbyte); +#else ctx->Array.Normal.StrideB = 3*sizeof(GLbyte); +#endif break; case GL_SHORT: +#ifdef VAO + ctx->Array.Current->Normal.StrideB = 3*sizeof(GLshort); +#else ctx->Array.Normal.StrideB = 3*sizeof(GLshort); +#endif break; case GL_INT: +#ifdef VAO + ctx->Array.Current->Normal.StrideB = 3*sizeof(GLint); +#else ctx->Array.Normal.StrideB = 3*sizeof(GLint); +#endif break; case GL_FLOAT: +#ifdef VAO + ctx->Array.Current->Normal.StrideB = 3*sizeof(GLfloat); +#else ctx->Array.Normal.StrideB = 3*sizeof(GLfloat); +#endif break; case GL_DOUBLE: +#ifdef VAO + ctx->Array.Current->Normal.StrideB = 3*sizeof(GLdouble); +#else ctx->Array.Normal.StrideB = 3*sizeof(GLdouble); +#endif break; default: gl_error( ctx, GL_INVALID_ENUM, "glNormalPointer(type)" ); return; } } +#ifdef VAO + ctx->Array.Current->Normal.Type = type; + ctx->Array.Current->Normal.Stride = stride; + ctx->Array.Current->Normal.Ptr = (void *) ptr; + ctx->Array.Current->NormalFunc = gl_trans_3f_tab[TYPE_IDX(type)]; + ctx->Array.Current->NormalEltFunc = gl_trans_elt_3f_tab[TYPE_IDX(type)]; +#else ctx->Array.Normal.Type = type; ctx->Array.Normal.Stride = stride; ctx->Array.Normal.Ptr = (void *) ptr; ctx->Array.NormalFunc = gl_trans_3f_tab[TYPE_IDX(type)]; ctx->Array.NormalEltFunc = gl_trans_elt_3f_tab[TYPE_IDX(type)]; +#endif ctx->Array.NewArrayState |= VERT_NORM; ctx->NewState |= NEW_CLIENT_STATE; } @@ -171,44 +235,89 @@ gl_lookup_enum_by_nr( type ), stride); +#ifdef VAO + ctx->Array.Current->Color.StrideB = stride; +#else ctx->Array.Color.StrideB = stride; +#endif if (!stride) { switch (type) { case GL_BYTE: +#ifdef VAO + ctx->Array.Current->Color.StrideB = size*sizeof(GLbyte); +#else ctx->Array.Color.StrideB = size*sizeof(GLbyte); +#endif break; case GL_UNSIGNED_BYTE: +#ifdef VAO + ctx->Array.Current->Color.StrideB = size*sizeof(GLubyte); +#else ctx->Array.Color.StrideB = size*sizeof(GLubyte); +#endif break; case GL_SHORT: +#ifdef VAO + ctx->Array.Current->Color.StrideB = size*sizeof(GLshort); +#else ctx->Array.Color.StrideB = size*sizeof(GLshort); +#endif break; case GL_UNSIGNED_SHORT: +#ifdef VAO + ctx->Array.Current->Color.StrideB = size*sizeof(GLushort); +#else ctx->Array.Color.StrideB = size*sizeof(GLushort); +#endif break; case GL_INT: +#ifdef VAO + ctx->Array.Current->Color.StrideB = size*sizeof(GLint); +#else ctx->Array.Color.StrideB = size*sizeof(GLint); +#endif break; case GL_UNSIGNED_INT: +#ifdef VAO + ctx->Array.Current->Color.StrideB = size*sizeof(GLuint); +#else ctx->Array.Color.StrideB = size*sizeof(GLuint); +#endif break; case GL_FLOAT: +#ifdef VAO + ctx->Array.Current->Color.StrideB = size*sizeof(GLfloat); +#else ctx->Array.Color.StrideB = size*sizeof(GLfloat); +#endif break; case GL_DOUBLE: +#ifdef VAO + ctx->Array.Current->Color.StrideB = size*sizeof(GLdouble); +#else ctx->Array.Color.StrideB = size*sizeof(GLdouble); +#endif break; default: gl_error( ctx, GL_INVALID_ENUM, "glColorPointer(type)" ); return; } } +#ifdef VAO + ctx->Array.Current->Color.Size = size; + ctx->Array.Current->Color.Type = type; + ctx->Array.Current->Color.Stride = stride; + ctx->Array.Current->Color.Ptr = (void *) ptr; + ctx->Array.Current->ColorFunc = gl_trans_4ub_tab[size][TYPE_IDX(type)]; + ctx->Array.Current->ColorEltFunc = gl_trans_elt_4ub_tab[size][TYPE_IDX(type)]; +#else ctx->Array.Color.Size = size; ctx->Array.Color.Type = type; ctx->Array.Color.Stride = stride; ctx->Array.Color.Ptr = (void *) ptr; ctx->Array.ColorFunc = gl_trans_4ub_tab[size][TYPE_IDX(type)]; ctx->Array.ColorEltFunc = gl_trans_elt_4ub_tab[size][TYPE_IDX(type)]; +#endif ctx->Array.NewArrayState |= VERT_RGBA; ctx->NewState |= NEW_CLIENT_STATE; } @@ -225,34 +334,66 @@ return; } +#ifdef VAO + ctx->Array.Current->Index.StrideB = stride; +#else ctx->Array.Index.StrideB = stride; +#endif if (!stride) { switch (type) { case GL_UNSIGNED_BYTE: +#ifdef VAO + ctx->Array.Current->Index.StrideB = sizeof(GLubyte); +#else ctx->Array.Index.StrideB = sizeof(GLubyte); +#endif break; case GL_SHORT: +#ifdef VAO + ctx->Array.Current->Index.StrideB = sizeof(GLshort); +#else ctx->Array.Index.StrideB = sizeof(GLshort); +#endif break; case GL_INT: +#ifdef VAO + ctx->Array.Current->Index.StrideB = sizeof(GLint); +#else ctx->Array.Index.StrideB = sizeof(GLint); +#endif break; case GL_FLOAT: +#ifdef VAO + ctx->Array.Current->Index.StrideB = sizeof(GLfloat); +#else ctx->Array.Index.StrideB = sizeof(GLfloat); +#endif break; case GL_DOUBLE: +#ifdef VAO + ctx->Array.Current->Index.StrideB = sizeof(GLdouble); +#else ctx->Array.Index.StrideB = sizeof(GLdouble); +#endif break; default: gl_error( ctx, GL_INVALID_ENUM, "glIndexPointer(type)" ); return; } } +#ifdef VAO + ctx->Array.Current->Index.Type = type; + ctx->Array.Current->Index.Stride = stride; + ctx->Array.Current->Index.Ptr = (void *) ptr; + ctx->Array.Current->IndexFunc = gl_trans_1ui_tab[TYPE_IDX(type)]; + ctx->Array.Current->IndexEltFunc = gl_trans_elt_1ui_tab[TYPE_IDX(type)]; +#else ctx->Array.Index.Type = type; ctx->Array.Index.Stride = stride; ctx->Array.Index.Ptr = (void *) ptr; ctx->Array.IndexFunc = gl_trans_1ui_tab[TYPE_IDX(type)]; ctx->Array.IndexEltFunc = gl_trans_elt_1ui_tab[TYPE_IDX(type)]; +#endif ctx->Array.NewArrayState |= VERT_INDEX; ctx->NewState |= NEW_CLIENT_STATE; } @@ -283,26 +424,55 @@ gl_lookup_enum_by_nr( type ), stride); +#ifdef VAO + ctx->Array.Current->TexCoord[texUnit].StrideB = stride; +#else ctx->Array.TexCoord[texUnit].StrideB = stride; +#endif if (!stride) { switch (type) { case GL_SHORT: +#ifdef VAO + ctx->Array.Current->TexCoord[texUnit].StrideB = size*sizeof(GLshort); +#else ctx->Array.TexCoord[texUnit].StrideB = size*sizeof(GLshort); +#endif break; case GL_INT: +#ifdef VAO + ctx->Array.Current->TexCoord[texUnit].StrideB = size*sizeof(GLint); +#else ctx->Array.TexCoord[texUnit].StrideB = size*sizeof(GLint); +#endif break; case GL_FLOAT: +#ifdef VAO + ctx->Array.Current->TexCoord[texUnit].StrideB = size*sizeof(GLfloat); +#else ctx->Array.TexCoord[texUnit].StrideB = size*sizeof(GLfloat); +#endif break; case GL_DOUBLE: +#ifdef VAO + ctx->Array.Current->TexCoord[texUnit].StrideB = size*sizeof(GLdouble); +#else ctx->Array.TexCoord[texUnit].StrideB = size*sizeof(GLdouble); +#endif break; default: gl_error( ctx, GL_INVALID_ENUM, "glTexCoordPointer(type)" ); return; } } +#ifdef VAO + ctx->Array.Current->TexCoord[texUnit].Size = size; + ctx->Array.Current->TexCoord[texUnit].Type = type; + ctx->Array.Current->TexCoord[texUnit].Stride = stride; + ctx->Array.Current->TexCoord[texUnit].Ptr = (void *) ptr; + + ctx->Array.Current->TexCoordFunc[texUnit] = gl_trans_4f_tab[size][TYPE_IDX(type)]; + ctx->Array.Current->TexCoordEltFunc[texUnit] = gl_trans_elt_4f_tab[size][TYPE_IDX(type)]; +#else ctx->Array.TexCoord[texUnit].Size = size; ctx->Array.TexCoord[texUnit].Type = type; ctx->Array.TexCoord[texUnit].Stride = stride; @@ -310,6 +480,7 @@ ctx->Array.TexCoordFunc[texUnit] = gl_trans_4f_tab[size][TYPE_IDX(type)]; ctx->Array.TexCoordEltFunc[texUnit] = gl_trans_elt_4f_tab[size][TYPE_IDX(type)]; +#endif ctx->Array.NewArrayState |= PIPE_TEX(texUnit); ctx->NewState |= NEW_CLIENT_STATE; } @@ -327,6 +498,17 @@ gl_error( ctx, GL_INVALID_VALUE, "glEdgeFlagPointer(stride)" ); return; } +#ifdef VAO + ctx->Array.Current->EdgeFlag.Stride = stride; + ctx->Array.Current->EdgeFlag.StrideB = stride ? stride : sizeof(GLboolean); + ctx->Array.Current->EdgeFlag.Ptr = (GLboolean *) ptr; + if (stride != sizeof(GLboolean)) { + ctx->Array.Current->EdgeFlagFunc = gl_trans_1ub_tab[TYPE_IDX(GL_UNSIGNED_BYTE)]; + } else { + ctx->Array.Current->EdgeFlagFunc = 0; + } + ctx->Array.Current->EdgeFlagEltFunc = gl_trans_elt_1ub_tab[TYPE_IDX(GL_UNSIGNED_BYTE)]; +#else ctx->Array.EdgeFlag.Stride = stride; ctx->Array.EdgeFlag.StrideB = stride ? stride : sizeof(GLboolean); ctx->Array.EdgeFlag.Ptr = (GLboolean *) ptr; @@ -336,6 +518,7 @@ ctx->Array.EdgeFlagFunc = 0; } ctx->Array.EdgeFlagEltFunc = gl_trans_elt_1ub_tab[TYPE_IDX(GL_UNSIGNED_BYTE)]; +#endif ctx->Array.NewArrayState |= VERT_EDGE; ctx->NewState |= NEW_CLIENT_STATE; } @@ -375,7 +558,6 @@ GLsizei count, const GLvoid *ptr) { (void) count; - printf("glVertexPointerEXT %p\n", ptr); _mesa_VertexPointer(size, type, stride, ptr); } @@ -440,13 +622,60 @@ { GLuint *flags = IM->Flag; GLuint *elts = IM->Elt; +#ifdef VAO + GLuint translate = ctx->Array.Current->Flags; +#else GLuint translate = ctx->Array.Flags; +#endif GLuint i; if (MESA_VERBOSE&VERBOSE_IMMEDIATE) fprintf(stderr, "exec_array_elements %d .. %d\n", start, count); +#ifdef VAO if (translate & VERT_OBJ_ANY) + (ctx->Array.Current->VertexEltFunc)( IM->Obj, + &ctx->Array.Current->Vertex, + flags, elts, (VERT_ELT|VERT_OBJ_ANY), + start, count); + + if (translate & VERT_NORM) + (ctx->Array.Current->NormalEltFunc)( IM->Normal, + &ctx->Array.Current->Normal, + flags, elts, (VERT_ELT|VERT_NORM), + start, count); + + if (translate & VERT_EDGE) + (ctx->Array.Current->EdgeFlagEltFunc)( IM->EdgeFlag, + &ctx->Array.Current->EdgeFlag, + flags, elts, (VERT_ELT|VERT_EDGE), + start, count); + + if (translate & VERT_RGBA) + (ctx->Array.Current->ColorEltFunc)( IM->Color, + &ctx->Array.Current->Color, + flags, elts, (VERT_ELT|VERT_RGBA), + start, count); + + if (translate & VERT_INDEX) + (ctx->Array.Current->IndexEltFunc)( IM->Index, + &ctx->Array.Current->Index, + flags, elts, (VERT_ELT|VERT_INDEX), + start, count); + + if (translate & VERT_TEX0_ANY) + (ctx->Array.Current->TexCoordEltFunc[0])( IM->TexCoord[0], + &ctx->Array.Current->TexCoord[0], + flags, elts, (VERT_ELT|VERT_TEX0_ANY), + start, count); + + if (translate & VERT_TEX1_ANY) + (ctx->Array.Current->TexCoordEltFunc[1])( IM->TexCoord[1], + &ctx->Array.Current->TexCoord[1], + flags, elts, (VERT_ELT|VERT_TEX1_ANY), + start, count); +#else + if (translate & VERT_OBJ_ANY) (ctx->Array.VertexEltFunc)( IM->Obj, &ctx->Array.Vertex, flags, elts, (VERT_ELT|VERT_OBJ_ANY), @@ -487,7 +716,7 @@ &ctx->Array.TexCoord[1], flags, elts, (VERT_ELT|VERT_TEX1_ANY), start, count); - +#endif for (i = start ; i < count ; i++) if (flags[i] & VERT_ELT) @@ -544,15 +773,18 @@ return; } - if (!ctx->CompileFlag && ctx->Array.Vertex.Enabled) - { +#ifdef VAO + if (!ctx->CompileFlag && ctx->Array.Current->Vertex.Enabled) { +#else + if (!ctx->CompileFlag && ctx->Array.Vertex.Enabled) { +#endif GLint remaining = count; GLint i; - struct gl_client_array *Normal; - struct gl_client_array *Color; - struct gl_client_array *Index; + struct gl_client_array *Normal = 0; + struct gl_client_array *Color = 0; + struct gl_client_array *Index = 0; struct gl_client_array *TexCoord[MAX_TEXTURE_UNITS]; - struct gl_client_array *EdgeFlag; + struct gl_client_array *EdgeFlag = 0; struct immediate *IM = VB->IM; struct gl_pipeline *elt = &ctx->CVA.elt; GLboolean relock; @@ -575,11 +807,86 @@ gl_build_immediate_pipeline( ctx ); required = elt->inputs; +#ifdef VAO + fallback = (elt->inputs & ~ctx->Array.Current->Summary); +#else fallback = (elt->inputs & ~ctx->Array.Summary); +#endif /* The translate function doesn't do anything about size. It * just ensures that type and stride come out right. */ +#ifdef VAO + IM->v.Obj.size = ctx->Array.Current->Vertex.Size; + + if (required & VERT_RGBA) + { + Color = &ctx->Array.Current->Color; + if (fallback & VERT_RGBA) { + Color = &ctx->Fallback.Color; + ctx->Array.Current->ColorFunc = + gl_trans_4ub_tab[4][TYPE_IDX(GL_UNSIGNED_BYTE)]; + } + } + + if (required & VERT_INDEX) + { + Index = &ctx->Array.Current->Index; + if (fallback & VERT_INDEX) { + Index = &ctx->Fallback.Index; + ctx->Array.Current->IndexFunc = gl_trans_1ui_tab[TYPE_IDX(GL_UNSIGNED_INT)]; + } + } + + for (i = 0 ; i < MAX_TEXTURE_UNITS ; i++) + { + GLuint flag = VERT_TEX_ANY(i); + + if (required & flag) { + TexCoord[i] = &ctx->Array.Current->TexCoord[i]; + + if (fallback & flag) + { + TexCoord[i] = &ctx->Fallback.TexCoord[i]; + TexCoord[i]->Size = gl_texcoord_size( ctx->Current.Flag, i ); + + ctx->Array.Current->TexCoordFunc[i] = + gl_trans_4f_tab[TexCoord[i]->Size][TYPE_IDX(GL_FLOAT)]; + } + } + } + + if (ctx->Array.Current->Flags != ctx->Array.Current->Flag[0]) + for (i = 0 ; i < VB_MAX ; i++) + ctx->Array.Current->Flag[i] = ctx->Array.Current->Flags; + + + if (required & VERT_NORM) + { + Normal = &ctx->Array.Current->Normal; + if (fallback & VERT_NORM) { + Normal = &ctx->Fallback.Normal; + ctx->Array.Current->NormalFunc = gl_trans_3f_tab[TYPE_IDX(GL_FLOAT)]; + } + } + + if ( required & VERT_EDGE ) + { + if (mode == GL_TRIANGLES || + mode == GL_QUADS || + mode == GL_POLYGON) + { + EdgeFlag = &ctx->Array.Current->EdgeFlag; + if (fallback & VERT_EDGE) { + EdgeFlag = &ctx->Fallback.EdgeFlag; + ctx->Array.Current->EdgeFlagFunc = + gl_trans_1ub_tab[TYPE_IDX(GL_UNSIGNED_BYTE)]; + } + } + else + required &= ~VERT_EDGE; + } +#else IM->v.Obj.size = ctx->Array.Vertex.Size; if (required & VERT_RGBA) @@ -649,6 +956,7 @@ else required &= ~VERT_EDGE; } +#endif VB->Primitive = IM->Primitive; VB->NextPrimitive = IM->NextPrimitive; @@ -670,6 +978,42 @@ VB->CullMode = 0; +#ifdef VAO + ctx->Array.Current->VertexFunc( IM->Obj + VB_START, + &ctx->Array.Current->Vertex, start, n ); + + if (required & VERT_NORM) { + ctx->Array.Current->NormalFunc( IM->Normal + VB_START, + Normal, start, n ); + } + + if (required & VERT_EDGE) { + ctx->Array.Current->EdgeFlagFunc( IM->EdgeFlag + VB_START, + EdgeFlag, start, n ); + } + + if (required & VERT_RGBA) { + ctx->Array.Current->ColorFunc( IM->Color + VB_START, + Color, start, n ); + } + + if (required & VERT_INDEX) { + ctx->Array.Current->IndexFunc( IM->Index + VB_START, + Index, start, n ); + } + + if (required & VERT_TEX0_ANY) { + IM->v.TexCoord[0].size = TexCoord[0]->Size; + ctx->Array.Current->TexCoordFunc[0]( IM->TexCoord[0] + VB_START, + TexCoord[0], start, n ); + } + + if (required & VERT_TEX1_ANY) { + IM->v.TexCoord[1].size = TexCoord[1]->Size; + ctx->Array.Current->TexCoordFunc[1]( IM->TexCoord[1] + VB_START, + TexCoord[1], start, n ); + } +#else ctx->Array.VertexFunc( IM->Obj + VB_START, &ctx->Array.Vertex, start, n ); @@ -704,7 +1048,7 @@ ctx->Array.TexCoordFunc[1]( IM->TexCoord[1] + VB_START, TexCoord[1], start, n ); } - +#endif VB->ObjPtr = &IM->v.Obj; VB->NormalPtr = &IM->v.Normal; VB->ColorPtr = &IM->v.Color; @@ -714,8 +1058,13 @@ VB->TexCoordPtr[0] = &IM->v.TexCoord[0]; VB->TexCoordPtr[1] = &IM->v.TexCoord[1]; +#ifdef VAO + VB->Flag = ctx->Array.Current->Flag; + VB->OrFlag = ctx->Array.Current->Flags; +#else VB->Flag = ctx->Array.Flag; VB->OrFlag = ctx->Array.Flags; +#endif VB->Start = IM->Start = VB_START; count = VB->Count = IM->Count = VB_START + n; @@ -738,15 +1087,24 @@ VB->NextPrimitive[VB->CopyStart] = VB->Count; VB->Primitive[VB->CopyStart] = mode; +#ifdef VAO + ctx->Array.Current->Flag[count] |= VERT_END_VB; +#else ctx->Array.Flag[count] |= VERT_END_VB; +#endif /* Transform and render. */ gl_run_pipeline( VB ); gl_reset_vb( VB ); +#ifdef VAO + ctx->Array.Current->Flag[count] = ctx->Array.Current->Flags; + ctx->Array.Current->Flag[VB_START] = ctx->Array.Current->Flags; +#else ctx->Array.Flag[count] = ctx->Array.Flags; ctx->Array.Flag[VB_START] = ctx->Array.Flags; +#endif start += n; remaining -= n; @@ -759,7 +1117,11 @@ elt->pipeline_valid = 0; } } - else if (ctx->Array.Vertex.Enabled) +#ifdef VAO + else if (ctx->Array.Current->Vertex.Enabled) +#else + else if (ctx->Array.Vertex.Enabled) +#endif { /* The GL_COMPILE and GL_COMPILE_AND_EXECUTE cases. These * could be handled by the above code, but it gets a little @@ -897,8 +1259,13 @@ /* Treat VERT_ELT like a special client array. */ ctx->Array.NewArrayState |= VERT_ELT; +#ifdef VAO + ctx->Array.Current->Summary |= VERT_ELT; + ctx->Array.Current->Flags |= VERT_ELT; +#else ctx->Array.Summary |= VERT_ELT; ctx->Array.Flags |= VERT_ELT; +#endif cva->elt_mode = mode; cva->elt_count = count; @@ -918,8 +1285,13 @@ */ if (ctx->CVA.pre.ops & PIPE_OP_RENDER) { ctx->Array.NewArrayState |= VERT_ELT; +#ifdef VAO + ctx->Array.Current->Summary &= ~VERT_ELT; + ctx->Array.Current->Flags &= ~VERT_ELT; +#else ctx->Array.Summary &= ~VERT_ELT; ctx->Array.Flags &= ~VERT_ELT; +#endif return; } @@ -934,7 +1306,11 @@ case GL_UNSIGNED_BYTE: { GLubyte *ub_indices = (GLubyte *) indices; +#ifdef VAO + if (ctx->Array.Current->Summary & VERT_OBJ_ANY) { +#else if (ctx->Array.Summary & VERT_OBJ_ANY) { +#endif draw_elt_ubyte( ctx, mode, ub_indices, count ); } else { gl_ArrayElement( ctx, (GLuint) ub_indices[count-1] ); @@ -944,7 +1320,11 @@ case GL_UNSIGNED_SHORT: { GLushort *us_indices = (GLushort *) indices; +#ifdef VAO + if (ctx->Array.Current->Summary & VERT_OBJ_ANY) { +#else if (ctx->Array.Summary & VERT_OBJ_ANY) { +#endif draw_elt_ushort( ctx, mode, us_indices, count ); } else { gl_ArrayElement( ctx, (GLuint) us_indices[count-1] ); @@ -954,7 +1334,11 @@ case GL_UNSIGNED_INT: { GLuint *ui_indices = (GLuint *) indices; +#ifdef VAO + if (ctx->Array.Current->Summary & VERT_OBJ_ANY) { +#else if (ctx->Array.Summary & VERT_OBJ_ANY) { +#endif draw_elt_uint( ctx, mode, ui_indices, count ); } else { gl_ArrayElement( ctx, ui_indices[count-1] ); @@ -968,7 +1352,11 @@ if (ctx->CompileCVAFlag) { ctx->Array.NewArrayState |= VERT_ELT; +#ifdef VAO + ctx->Array.Current->Summary &= ~VERT_ELT; +#else ctx->Array.Summary &= ~VERT_ELT; +#endif } } @@ -978,12 +1366,12 @@ _mesa_InterleavedArrays(GLenum format, GLsizei stride, const GLvoid *pointer) { GET_CURRENT_CONTEXT(ctx); - GLboolean tflag, cflag, nflag; /* enable/disable flags */ - GLint tcomps, ccomps, vcomps; /* components per texcoord, color, vertex */ + GLboolean tflag, cflag, nflag; /* enable/disable flags */ + GLint tcomps, ccomps, vcomps; /* components per texcoord, color, vertex */ - GLenum ctype; /* color type */ - GLint coffset, noffset, voffset;/* color, normal, vertex offsets */ - GLint defstride; /* default stride */ + GLenum ctype = 0; /* color type */ + GLint coffset = 0, noffset = 0, voffset = 0;/* color, normal, vertex offsets */ + GLint defstride; /* default stride */ GLint c, f; GLint coordUnitSave; @@ -1117,21 +1505,25 @@ coordUnitSave = ctx->Array.ActiveTexture; if (tflag) { GLint i; +#ifdef VAO + GLint factor = ctx->Array.Current->TexCoordInterleaveFactor; +#else GLint factor = ctx->Array.TexCoordInterleaveFactor; +#endif for (i = 0; i < factor; i++) { _mesa_ClientActiveTextureARB( (GLenum) (GL_TEXTURE0_ARB + i) ); _mesa_EnableClientState( GL_TEXTURE_COORD_ARRAY ); glTexCoordPointer( tcomps, GL_FLOAT, stride, (GLubyte *) pointer + i * coffset ); } - for (i = factor; i < ctx->Const.MaxTextureUnits; i++) { + for (i = factor; i < (GLint) ctx->Const.MaxTextureUnits; i++) { _mesa_ClientActiveTextureARB( (GLenum) (GL_TEXTURE0_ARB + i) ); _mesa_DisableClientState( GL_TEXTURE_COORD_ARRAY ); } } else { GLint i; - for (i = 0; i < ctx->Const.MaxTextureUnits; i++) { + for (i = 0; i < (GLint) ctx->Const.MaxTextureUnits; i++) { _mesa_ClientActiveTextureARB( (GLenum) (GL_TEXTURE0_ARB + i) ); _mesa_DisableClientState( GL_TEXTURE_COORD_ARRAY ); } @@ -1215,10 +1607,31 @@ VERT_TEX0_123, VERT_TEX0_1234 }; +#ifdef VAO + ctx->Array.Current->Flags = 0; + ctx->Array.Current->Summary = 0; +#else ctx->Array.Flags = 0; ctx->Array.Summary = 0; +#endif ctx->input->ArrayIncr = 0; +#ifdef VAO + if (ctx->Array.Current->Normal.Enabled) ctx->Array.Current->Flags |= VERT_NORM; + if (ctx->Array.Current->Color.Enabled) ctx->Array.Current->Flags |= VERT_RGBA; + if (ctx->Array.Current->Index.Enabled) ctx->Array.Current->Flags |= VERT_INDEX; + if (ctx->Array.Current->EdgeFlag.Enabled) ctx->Array.Current->Flags |= VERT_EDGE; + if (ctx->Array.Current->Vertex.Enabled) { + ctx->Array.Current->Flags |= sz_flags[ctx->Array.Current->Vertex.Size]; + ctx->input->ArrayIncr = 1; + } + if (ctx->Array.Current->TexCoord[0].Enabled) { + ctx->Array.Current->Flags |= tc_flags[ctx->Array.Current->TexCoord[0].Size]; + } + if (ctx->Array.Current->TexCoord[1].Enabled) { + ctx->Array.Current->Flags |= (tc_flags[ctx->Array.Current->TexCoord[1].Size] << NR_TEXSIZE_BITS); + } +#else if (ctx->Array.Normal.Enabled) ctx->Array.Flags |= VERT_NORM; if (ctx->Array.Color.Enabled) ctx->Array.Flags |= VERT_RGBA; if (ctx->Array.Index.Enabled) ctx->Array.Flags |= VERT_INDEX; @@ -1233,11 +1646,219 @@ if (ctx->Array.TexCoord[1].Enabled) { ctx->Array.Flags |= (tc_flags[ctx->Array.TexCoord[1].Size] << NR_TEXSIZE_BITS); } +#endif /* Not really important any more: */ +#ifdef VAO + ctx->Array.Current->Summary = ctx->Array.Current->Flags & VERT_DATA; + ctx->input->ArrayAndFlags = ~ctx->Array.Current->Flags; +#else ctx->Array.Summary = ctx->Array.Flags & VERT_DATA; ctx->input->ArrayAndFlags = ~ctx->Array.Flags; +#endif ctx->input->ArrayEltFlush = !(ctx->CompileCVAFlag); } + + +/**********************************************************************/ +/* Vertex Array Objects extension */ +/**********************************************************************/ + +#ifdef VAO + +struct gl_array_object * +_mesa_alloc_vertex_array_object(GLcontext *ctx, GLuint name) +{ + struct gl_array_object *arrayObj; + + arrayObj = MALLOC_STRUCT(gl_array_object); + if (arrayObj) { + GLuint i; + arrayObj->Name = name; + arrayObj->RefCount = 1; + arrayObj->Vertex.Size = 4; + arrayObj->Vertex.Type = GL_FLOAT; + arrayObj->Vertex.Stride = 0; + arrayObj->Vertex.StrideB = 0; + arrayObj->Vertex.Ptr = NULL; + arrayObj->Vertex.Enabled = GL_FALSE; + arrayObj->Normal.Type = GL_FLOAT; + arrayObj->Normal.Stride = 0; + arrayObj->Normal.StrideB = 0; + arrayObj->Normal.Ptr = NULL; + arrayObj->Normal.Enabled = GL_FALSE; + arrayObj->Color.Size = 4; + arrayObj->Color.Type = GL_FLOAT; + arrayObj->Color.Stride = 0; + arrayObj->Color.StrideB = 0; + arrayObj->Color.Ptr = NULL; + arrayObj->Color.Enabled = GL_FALSE; + arrayObj->Index.Type = GL_FLOAT; + arrayObj->Index.Stride = 0; + arrayObj->Index.StrideB = 0; + arrayObj->Index.Ptr = NULL; + arrayObj->Index.Enabled = GL_FALSE; + for (i = 0; i < MAX_TEXTURE_UNITS; i++) { + arrayObj->TexCoord[i].Size = 4; + arrayObj->TexCoord[i].Type = GL_FLOAT; + arrayObj->TexCoord[i].Stride = 0; + arrayObj->TexCoord[i].StrideB = 0; + arrayObj->TexCoord[i].Ptr = NULL; + arrayObj->TexCoord[i].Enabled = GL_FALSE; + } + arrayObj->TexCoordInterleaveFactor = 1; + arrayObj->EdgeFlag.Stride = 0; + arrayObj->EdgeFlag.StrideB = 0; + arrayObj->EdgeFlag.Ptr = NULL; + arrayObj->EdgeFlag.Enabled = GL_FALSE; + + /* Put into hash table */ + _mesa_HashInsert(ctx->Shared->ArrayObjects, name, arrayObj); + } + return arrayObj; +} + + +void +glGenArraySetsEXT(GLsizei n, GLuint *arrayset) +{ + GET_CURRENT_CONTEXT(ctx); + GLuint first; + GLint i; + + ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx, "glGenArraySetsEXT"); + + if (n < 0) { + gl_error(ctx, GL_INVALID_VALUE, "glGenArraySetsEXT"); + return; + } + + if (!arrayset) + return; + + /* + * This must be atomic (generation and allocation of texture IDs) + */ + /*XXX _glthread_LOCK_MUTEX(GenTexturesLock);*/ + + first = _mesa_HashFindFreeKeyBlock(ctx->Shared->ArrayObjects, n); + + /* Return the object names */ + for (i = 0; i < n; i++) { + arrayset[i] = first + i; + } + + /* Allocate new array objects */ + for (i = 0; i < n; i++) { + struct gl_array_object *arrayObj; + GLuint name = first + i; + arrayObj = _mesa_alloc_vertex_array_object(ctx, name); + if (!arrayObj) { + gl_error(ctx, GL_OUT_OF_MEMORY, "glGenArraySetsEXT"); + break; + } + } + + /*XXX _glthread_UNLOCK_MUTEX(GenTexturesLock);*/ +} + + +void +glBindArraySetEXT(GLuint arraySet) +{ + struct gl_array_object *arrayObj; + GET_CURRENT_CONTEXT(ctx); + + ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx, "glBindArraySetEXT"); + + if (arraySet < 0) { + gl_error(ctx, GL_INVALID_OPERATION, "glBindArraySetEXT"); + return; + } + + ctx->Array.Current->RefCount--; + if (ctx->Array.Current->RefCount == 0) { + _mesa_HashRemove(ctx->Shared->ArrayObjects, arraySet); + FREE(ctx->Array.Current); + } + + arrayObj = (struct gl_array_object *) _mesa_HashLookup(ctx->Shared->ArrayObjects, arraySet); + if (arrayObj) { + ctx->Array.Current = arrayObj; + } + else { + /* create the array object and insert into hash table */ + arrayObj = _mesa_alloc_vertex_array_object(ctx, arraySet); + if (!arrayObj) { + gl_error(ctx, GL_OUT_OF_MEMORY, "glBindArraySetEXT"); + return; + } + ctx->Array.Current = (struct gl_array_object *) _mesa_HashLookup(ctx->Shared->ArrayObjects, 0); + } + + ctx->Array.Current->RefCount++; + + /* Signal new state */ + /* ctx->Array.NewArrayState = ~0;*/ + ctx->NewState |= NEW_CLIENT_STATE; + +#if 0 + printf("Bind %d\n", ctx->Array.Current->Name); + printf("Vertex array size: %d\n", ctx->Array.Current->Vertex.Size); + printf("Vertex array enable: %d\n", ctx->Array.Current->Vertex.Enabled); + + printf("Normal array size: %d\n", ctx->Array.Current->Normal.Size); + printf("Normal array enable: %d\n", ctx->Array.Current->Normal.Enabled); + printf("Lock first %d count %d\n", ctx->Array.Current->LockFirst, + ctx->Array.Current->LockCount); +#endif +} + + +void +glDeleteArraySetsEXT(GLsizei n, const GLuint *arraySet) +{ + GLint i; + GET_CURRENT_CONTEXT(ctx); + + ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx, "glDeleteArraySetsEXT"); + + if (n < 0) { + gl_error(ctx, GL_INVALID_OPERATION, "glDeleteArraySetEXT"); + return; + } + + for (i = 0; i < n; i++) { + if (arraySet[i] > 0) { + struct gl_array_object *arrayObj; + arrayObj = (struct gl_array_object *) _mesa_HashLookup(ctx->Shared->ArrayObjects, arraySet[i]); + if (arrayObj) { + arrayObj->RefCount--; + if (arrayObj->RefCount == 0) { + _mesa_HashRemove(ctx->Shared->ArrayObjects, arraySet[i]); + FREE(arrayObj); + } + } + } + } +} + + +GLboolean +glIsArraySetEXT(GLuint arraySet) +{ + GET_CURRENT_CONTEXT(ctx); + ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH_WITH_RETVAL(ctx, "glIsArraySetEXT", + GL_FALSE); + + if (arraySet > 0 && _mesa_HashLookup(ctx->Shared->ArrayObjects, arraySet)) { + return GL_TRUE; + } + else { + return GL_FALSE; + } +} + +#endif Index: xc/extras/Mesa/src/vb.c diff -u xc/extras/Mesa/src/vb.c:1.4 xc/extras/Mesa/src/vb.c:1.8 --- xc/extras/Mesa/src/vb.c:1.4 Fri Jun 16 20:02:18 2000 +++ xc/extras/Mesa/src/vb.c Mon Nov 13 18:30:53 2000 @@ -1,9 +1,9 @@ /* * Mesa 3-D graphics library - * Version: 3.3 + * Version: 3.4 * - * Copyright (C) 1999 Brian Paul All Rights Reserved. + * Copyright (C) 1999-2000 Brian Paul All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), @@ -43,9 +43,9 @@ { struct vertex_buffer *VB; struct immediate *IM; - GLuint alignment = 32; + const GLuint alignment = 32; - VB = CALLOC_STRUCT(vertex_buffer); + VB = ALIGN_CALLOC_STRUCT( vertex_buffer, alignment ); if (!VB) return 0; @@ -63,14 +63,14 @@ gl_vector4ub_alloc( &VB->BColor, VEC_WRITABLE, VB_SIZE, alignment ); gl_vector1ui_alloc( &VB->BIndex, VEC_WRITABLE, VB_SIZE, alignment ); - VB->ClipMask = (GLubyte *)MALLOC(sizeof(GLubyte) * VB_SIZE); - VB->UserClipMask = (GLubyte *)CALLOC(sizeof(GLubyte) * VB_SIZE); - VB->CullMask = (GLubyte *)MALLOC(sizeof(GLubyte) * VB_SIZE); - VB->NormCullMask = (GLubyte *)MALLOC(sizeof(GLubyte) * VB_SIZE); - VB->Spec[0] = (GLubyte (*)[4])MALLOC(sizeof(GLubyte) * 4 * VB_SIZE); - VB->Spec[1] = (GLubyte (*)[4])MALLOC(sizeof(GLubyte) * 4 * VB_SIZE); + VB->ClipMask = (GLubyte *) ALIGN_MALLOC(sizeof(GLubyte) * VB_SIZE, alignment); + VB->UserClipMask = (GLubyte *) ALIGN_CALLOC(sizeof(GLubyte) * VB_SIZE, alignment); + VB->CullMask = (GLubyte *) ALIGN_MALLOC(sizeof(GLubyte) * VB_SIZE, alignment); + VB->NormCullMask = (GLubyte *) ALIGN_MALLOC(sizeof(GLubyte) * VB_SIZE, alignment); + VB->Spec[0] = (GLubyte (*)[4]) ALIGN_MALLOC(sizeof(GLubyte) * 4 * VB_SIZE, alignment); + VB->Spec[1] = (GLubyte (*)[4]) ALIGN_MALLOC(sizeof(GLubyte) * 4 * VB_SIZE, alignment); - IM = VB->IM = gl_immediate_alloc( ctx ); + IM = VB->IM = gl_immediate_alloc(ctx); VB->store.Obj = &IM->v.Obj; VB->store.Normal = &IM->v.Normal; @@ -105,7 +105,7 @@ struct vertex_buffer *VB; GLuint alignment = 32; - VB = CALLOC_STRUCT(vertex_buffer); + VB = ALIGN_CALLOC_STRUCT( vertex_buffer, alignment ); if (!VB) return 0; @@ -121,11 +121,14 @@ VB->ClipAndMask = CLIP_ALL_BITS; VB->pipeline = &ctx->CVA.pre; - VB->ClipMask = (GLubyte *)MALLOC(sizeof(GLubyte) * size); - VB->UserClipMask = (GLubyte *)CALLOC(sizeof(GLubyte) * size); - VB->Spec[0] = (GLubyte (*)[4])MALLOC(sizeof(GLubyte) * 4 * size); - VB->Spec[1] = (GLubyte (*)[4])MALLOC(sizeof(GLubyte) * 4 * size); - VB->Flag = (GLuint *)MALLOC(sizeof(GLuint) * size); + VB->ClipMask = (GLubyte *)ALIGN_MALLOC( sizeof(GLubyte) * size, alignment ); + VB->UserClipMask = (GLubyte *)ALIGN_CALLOC( sizeof(GLubyte) * size, + alignment ); + VB->Spec[0] = (GLubyte (*)[4])ALIGN_MALLOC( sizeof(GLubyte) * 4 * size, + alignment ); + VB->Spec[1] = (GLubyte (*)[4])ALIGN_MALLOC( sizeof(GLubyte) * 4 * size, + alignment ); + VB->Flag = (GLuint *)ALIGN_MALLOC( sizeof(GLuint) * size, alignment ); gl_vector4f_alloc( &VB->Eye, 2, VEC_WRITABLE, size, alignment ); gl_vector4f_alloc( &VB->Clip, 2, VEC_WRITABLE, size, alignment ); @@ -201,10 +204,9 @@ if ( ! --VB->IM->ref_count ) gl_immediate_free( VB->IM ); - FREE( VB->CullMask ); - FREE( VB->NormCullMask ); + ALIGN_FREE( VB->CullMask ); + ALIGN_FREE( VB->NormCullMask ); } else { - if (VB->store.Elt) gl_vector4f_free( VB->store.Obj ); FREE( VB->store.Obj ); gl_vector3f_free( VB->store.Normal ); FREE( VB->store.Normal ); gl_vector1ub_free( VB->store.EdgeFlag ); FREE( VB->store.EdgeFlag ); @@ -221,22 +223,22 @@ gl_vector1ui_free( VB->FoggedIndex[0] ); FREE( VB->FoggedIndex[0] ); gl_vector1ui_free( VB->FoggedIndex[1] ); FREE( VB->FoggedIndex[1] ); - FREE( VB->Flag ); + ALIGN_FREE( VB->Flag ); } - if (VB->tmp_f) FREE(VB->tmp_f); - if (VB->tmp_m) FREE(VB->tmp_m); - if (VB->EvaluatedFlags) FREE(VB->EvaluatedFlags); - - FREE( VB->Spec[0] ); - FREE( VB->Spec[1] ); - FREE( VB->ClipMask ); - FREE( VB->UserClipMask ); + if (VB->tmp_f) FREE( VB->tmp_f ); + if (VB->tmp_m) FREE( VB->tmp_m ); + if (VB->EvaluatedFlags) FREE( VB->EvaluatedFlags ); + + ALIGN_FREE( VB->Spec[0] ); + ALIGN_FREE( VB->Spec[1] ); + ALIGN_FREE( VB->ClipMask ); + ALIGN_FREE( VB->UserClipMask ); if (VB->ctx->Driver.UnregisterVB) VB->ctx->Driver.UnregisterVB( VB ); - FREE( VB ); + ALIGN_FREE( VB ); } @@ -254,7 +256,7 @@ return IM; } - IM = MALLOC_STRUCT(immediate); + IM = ALIGN_MALLOC_STRUCT( immediate, 32 ); if (!IM) return 0; @@ -272,7 +274,7 @@ IM->Material = 0; IM->MaterialMask = 0; #ifdef VMS - for (j=0; jNormal[j][0] = IM->Normal[j][1] = IM->Normal[j][2] = 0.0; #endif @@ -323,7 +325,7 @@ if (MESA_VERBOSE&VERBOSE_IMMEDIATE) fprintf(stderr, "really free immediate %d\n", IM->id); - FREE( IM ); + ALIGN_FREE( IM ); } else { if (MESA_VERBOSE&VERBOSE_IMMEDIATE) Index: xc/extras/Mesa/src/vb.h diff -u xc/extras/Mesa/src/vb.h:1.3 xc/extras/Mesa/src/vb.h:1.4 --- xc/extras/Mesa/src/vb.h:1.3 Tue Feb 15 02:12:41 2000 +++ xc/extras/Mesa/src/vb.h Mon Nov 13 16:55:35 2000 @@ -1,9 +1,9 @@ /* * Mesa 3-D graphics library - * Version: 3.3 + * Version: 3.4 * - * Copyright (C) 1999 Brian Paul All Rights Reserved. + * Copyright (C) 1999-2000 Brian Paul All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), @@ -139,10 +139,10 @@ GLuint ArrayEltFlush; GLuint FlushElt; - GLuint TF1[2]; /* precalc'ed for glTexCoord */ - GLuint TF2[2]; - GLuint TF3[2]; - GLuint TF4[2]; + GLuint TF1[MAX_TEXTURE_UNITS]; /* precalc'ed for glTexCoord */ + GLuint TF2[MAX_TEXTURE_UNITS]; + GLuint TF3[MAX_TEXTURE_UNITS]; + GLuint TF4[MAX_TEXTURE_UNITS]; GLuint Primitive[VB_SIZE]; /* GLubyte would do... */ GLuint NextPrimitive[VB_SIZE]; Index: xc/extras/Mesa/src/vbcull.c diff -u xc/extras/Mesa/src/vbcull.c:1.4 xc/extras/Mesa/src/vbcull.c:1.7 --- xc/extras/Mesa/src/vbcull.c:1.4 Fri Jun 16 20:02:18 2000 +++ xc/extras/Mesa/src/vbcull.c Mon Nov 13 18:30:53 2000 @@ -92,7 +92,7 @@ /* This is pretty pointless. (arf arf) */ - for (i=start+1;iNextPrimitive[i]; prim = in_prim[i]; - n = cull_funcs[prim]( VB, i, next, parity, (const GLfloat (*)[4])proj ); + n = cull_funcs[prim]( VB, i, next, parity, (CONST GLfloat (*)[4])proj ); if (n == next - i) out_prim[i] = GL_POLYGON+1; @@ -842,14 +843,13 @@ cullcount += n; } - if (VB->LastPrimitive < VB->Count) { if (copy_tab_cull[lastprim]) cullcount -= copy_tab_cull[prim]( VB, first, VB->Count, VB->Ovf, - (const GLfloat (*)[4])proj ); + (CONST GLfloat (*)[4])proj ); } VB->Primitive = out_prim; @@ -862,8 +862,8 @@ if (cullcount < VB->Count) build_clip_vert_bits( VB->ClipMask, VB->CullMask, VB->Count ); - } + if (VB->ClipOrMask) { VB->CullMode |= CLIP_MASK_ACTIVE; VB->CullFlag[1] |= (CLIP_ALL_BITS|CLIP_USER_BIT) & ctx->AllowVertexCull; @@ -903,7 +903,7 @@ first, VB->Count, VB->Ovf, - (const GLfloat (*)[4])proj ); + (CONST GLfloat (*)[4])proj ); } VB->CullDone = 1; Index: xc/extras/Mesa/src/vbfill.c diff -u xc/extras/Mesa/src/vbfill.c:1.4 xc/extras/Mesa/src/vbfill.c:1.7 --- xc/extras/Mesa/src/vbfill.c:1.4 Fri Jun 16 20:02:18 2000 +++ xc/extras/Mesa/src/vbfill.c Mon Nov 13 18:30:54 2000 @@ -693,6 +693,20 @@ ASSIGN_3V(normal, x,y,z); \ } +#if defined(USE_IEEE) +#define NORMALF( x, y, z ) \ +{ \ + GLuint count; \ + GLint *normal; \ + GET_IMMEDIATE; \ + count = IM->Count; \ + IM->Flag[count] |= VERT_NORM; \ + normal = (GLint *)IM->Normal[count]; \ + ASSIGN_3V(normal, *(int*)&(x), *(int*)&(y), *(int*)&(z)); \ +} +#else +#define NORMALF NORMAL +#endif void _mesa_Normal3b( GLbyte nx, GLbyte ny, GLbyte nz ) @@ -711,7 +725,7 @@ void _mesa_Normal3f( GLfloat nx, GLfloat ny, GLfloat nz ) { - NORMAL(nx, ny, nz); + NORMALF(nx, ny, nz); } @@ -746,7 +760,7 @@ void _mesa_Normal3fv( const GLfloat *v ) { - NORMAL( v[0], v[1], v[2] ); + NORMALF( v[0], v[1], v[2] ); } @@ -811,6 +825,23 @@ ASSIGN_4V(tc, s,t,u,v); \ } +#if defined(USE_IEEE) +#define TEXCOORD2F(s,t) \ +{ \ + GLuint count; \ + GLint *tc; \ + GET_IMMEDIATE; \ + count = IM->Count; \ + IM->Flag[count] |= VERT_TEX0_12; \ + tc = (GLint *)IM->TexCoord[0][count]; \ + *tc = *(int *)&(s); \ + *(tc+1) = *(int *)&(t); \ + *(tc+2) = 0; \ + *(tc+3) = IEEE_ONE; \ +} +#else +#define TEXCOORD2F TEXCOORD2 +#endif void _mesa_TexCoord1d( GLdouble s ) @@ -850,7 +881,7 @@ void _mesa_TexCoord2f( GLfloat s, GLfloat t ) { - TEXCOORD2(*(&s),*&t); + TEXCOORD2F(s,t); } @@ -962,7 +993,7 @@ void _mesa_TexCoord2fv( const GLfloat *v ) { - TEXCOORD2(v[0],v[1]); + TEXCOORD2F(v[0],v[1]); } @@ -1072,6 +1103,22 @@ IM->maybe_transform_vb( IM ); \ } +#if defined(USE_IEEE) +#define VERTEX3F(IM,x,y,z) \ +{ \ + GLuint count = IM->Count++; \ + GLint *dest = (GLint *)IM->Obj[count]; \ + IM->Flag[count] |= VERT_OBJ_23; \ + dest[0] = *(int *)&(x); \ + dest[1] = *(int *)&(y); \ + dest[2] = *(int *)&(z); \ + dest[3] = IEEE_ONE; \ + if (dest == (GLint *)IM->Obj[VB_MAX-1]) \ + IM->maybe_transform_vb( IM ); \ +} +#else +#define VERTEX3F VERTEX3 +#endif void _mesa_Vertex2d( GLdouble x, GLdouble y ) @@ -1127,7 +1174,7 @@ _mesa_Vertex3f( GLfloat x, GLfloat y, GLfloat z ) { GET_IMMEDIATE; - VERTEX3( IM, *(&x), *(&y), *(&z) ); + VERTEX3F( IM, x, y, z ); } @@ -1159,7 +1206,7 @@ _mesa_Vertex4f( GLfloat x, GLfloat y, GLfloat z, GLfloat w ) { GET_IMMEDIATE; - VERTEX4( IM, *(&x), *(&y), *(&z), *(&w) ); + VERTEX4( IM, x, y, z, w ); } @@ -1223,7 +1270,7 @@ _mesa_Vertex3fv( const GLfloat *v ) { GET_IMMEDIATE; - VERTEX3( IM, v[0], v[1], v[2] ); + VERTEX3F( IM, v[0], v[1], v[2] ); } @@ -1347,6 +1394,22 @@ ASSIGN_4V(tc, s,t,u,v); \ } +#if defined(USE_IEEE) +#define MULTI_TEXCOORD2F(s,t) \ +{ \ + GLuint count; \ + GLint *tc; \ + count = IM->Count; \ + IM->Flag[count] |= IM->TF2[texSet]; \ + tc = (GLint *)IM->TexCoord[texSet][count]; \ + tc[0] = *(int *)&(s); \ + tc[1] = *(int *)&(t); \ + tc[2] = 0; \ + tc[3] = IEEE_ONE; \ +} +#else +#define MULTI_TEXCOORD2F MULTI_TEXCOORD2 +#endif void _mesa_MultiTexCoord1dARB(GLenum target, GLdouble s) @@ -1444,7 +1507,7 @@ GLint texSet; GET_IMMEDIATE; CHECK_ARB - MULTI_TEXCOORD2( s, t ); + MULTI_TEXCOORD2F( s, t ); } void @@ -1453,7 +1516,7 @@ GLint texSet; GET_IMMEDIATE; CHECK_ARB - MULTI_TEXCOORD2( v[0], v[1] ); + MULTI_TEXCOORD2F( v[0], v[1] ); } void Index: xc/extras/Mesa/src/vbindirect.c diff -u xc/extras/Mesa/src/vbindirect.c:1.3 xc/extras/Mesa/src/vbindirect.c:1.4 --- xc/extras/Mesa/src/vbindirect.c:1.3 Tue Feb 15 02:12:42 2000 +++ xc/extras/Mesa/src/vbindirect.c Mon Nov 13 18:30:54 2000 @@ -133,10 +133,10 @@ const GLubyte *clip = VB->ClipMask; for (i = start ; i < count ; i++) if (!clip[elt[i]]) - ctx->Driver.PointsFunc( ctx, elt[i], elt[i] ); + ctx->Driver.PointsFunc( ctx, elt[i], elt[i]+1 ); } else { for (i = start ; i < count ; i++) - ctx->Driver.PointsFunc( ctx, elt[i], elt[i] ); + ctx->Driver.PointsFunc( ctx, elt[i], elt[i]+1 ); } } Index: xc/extras/Mesa/src/vbrender.c diff -u xc/extras/Mesa/src/vbrender.c:1.4 xc/extras/Mesa/src/vbrender.c:1.8 --- xc/extras/Mesa/src/vbrender.c:1.4 Fri Jun 16 20:02:19 2000 +++ xc/extras/Mesa/src/vbrender.c Mon Nov 13 18:30:54 2000 @@ -100,20 +100,14 @@ static void offset_polygon( GLcontext *ctx, GLfloat a, GLfloat b, GLfloat c ) { GLfloat ac, bc, m; - GLfloat offset; + GLfloat offset = 0.0F; - if (c<0.001F && c>-0.001F) { - /* to prevent underflow problems */ - offset = 0.0F; - } - else { + if (c*c > 1e-16) { ac = a / c; bc = b / c; if (ac<0.0F) ac = -ac; if (bc<0.0F) bc = -bc; m = MAX2( ac, bc ); - /* m = sqrt( ac*ac + bc*bc ); */ - offset = m * ctx->Polygon.OffsetFactor + ctx->Polygon.OffsetUnits; } @@ -125,10 +119,17 @@ #define FLUSH_PRIM(prim) \ do { \ if (ctx->PB->primitive != prim) { \ - gl_reduced_prim_change( ctx, prim ); \ + gl_reduced_prim_change( ctx, prim ); \ } \ } while(0) +#define FLUSH_POLY(prim) \ +do { \ + if ((ctx->IndirectTriangles & DD_TRI_UNFILLED) == 0) { \ + FLUSH_PRIM(prim); \ + } \ +} while(0) + /* * When glPolygonMode() is used to specify that the front/back rendering @@ -150,13 +151,12 @@ j = vlist[i]; if (edge_ptr[j] & 0x3) { edge_ptr[j] &= ~0x3; - (*ctx->Driver.PointsFunc)( ctx, j, j ); + (*ctx->Driver.PointsFunc)( ctx, j, j+1 ); } } } else if (mode==GL_LINE) { GLuint i, j0, j1; - ctx->StippleCounter = 0; /* draw the edges */ for (i=0;iPolygon.FrontFace==GL_CW); - tricaps = ctx->IndirectTriangles; + tricaps = ctx->TriangleCaps; if (tricaps & DD_TRI_OFFSET) { /* finish computing plane equation of polygon, compute offset */ @@ -319,6 +319,13 @@ else { (*ctx->Driver.TriangleFunc)( ctx, v0, v1, v2, pv ); } + + if (tricaps & DD_TRI_OFFSET) { + /* reset Z offsets now */ + ctx->PointZoffset = 0.0; + ctx->LineZoffset = 0.0; + ctx->PolygonZoffset = 0.0; + } } @@ -342,7 +349,7 @@ GLfloat fy = win[v3][1] - win[v1][1]; GLfloat c = ex*fy-ey*fx; GLuint facing; - GLuint tricaps = ctx->IndirectTriangles; + GLuint tricaps = ctx->TriangleCaps; if (c * ctx->backface_sign > 0) return; @@ -377,6 +384,13 @@ else { (*ctx->Driver.QuadFunc)( ctx, v0, v1, v2, v3, pv ); } + + if (tricaps & DD_TRI_OFFSET) { + /* reset Z offsets now */ + ctx->PointZoffset = 0.0; + ctx->LineZoffset = 0.0; + ctx->PolygonZoffset = 0.0; + } } @@ -415,15 +429,16 @@ #define EDGEFLAG_POLY_TRI_PRE( i2, i1, i, pv) \ do { \ + eflag[i2] |= (eflag[i2] >> 2) & 1; \ eflag[i1] |= (eflag[i1] >> 2) & 1; \ eflag[i] |= (eflag[i] >> 2) & 2; \ } while (0) #define EDGEFLAG_POLY_TRI_POST( i2, i1, i, pv) \ do { \ - eflag[i2] = 0; \ + eflag[i2] &= ~(4|1); \ eflag[i1] &= ~(4|1); \ - eflag[i] &= ~(8|2); \ + eflag[i] &= ~(8|2); \ } while (0) @@ -432,7 +447,7 @@ */ #define RENDER_POINTS( start, count ) \ (void) cullmask; \ - (*ctx->Driver.PointsFunc)( ctx, start, count-1 ); + (*ctx->Driver.PointsFunc)( ctx, start, count ); #define RENDER_LINE( i1, i ) \ @@ -503,7 +518,7 @@ (void) vlist; (void) eflag; (void) stipplecounter; #define TAG(x) x##_cull -#define INIT(x) FLUSH_PRIM(x) +#define INIT(x) if (x == GL_POLYGON) FLUSH_POLY(x); else FLUSH_PRIM(x) #define RESET_STIPPLE *stipplecounter = 0 #include "render_tmp.h" @@ -516,7 +531,7 @@ /* Direct, no clipping or culling. */ #define RENDER_POINTS( start, count ) \ - (*ctx->Driver.PointsFunc)( ctx, start, count-1 ) + (*ctx->Driver.PointsFunc)( ctx, start, count ) #define RENDER_LINE( i1, i ) \ (*ctx->Driver.LineFunc)( ctx, i1, i, i ) @@ -541,7 +556,7 @@ GLuint *stipplecounter = &VB->ctx->StippleCounter; \ (void) eflag; (void) stipplecounter; -#define INIT(x) FLUSH_PRIM(x); +#define INIT(x) if (x == GL_POLYGON) FLUSH_POLY(x); else FLUSH_PRIM(x) #define RESET_STIPPLE *stipplecounter = 0 #include "render_tmp.h" @@ -551,7 +566,7 @@ /* Direct, with the possibility of clipping. */ #define RENDER_POINTS( start, count ) \ - (*ctx->Driver.PointsFunc)( ctx, start, count-1 ) + (*ctx->Driver.PointsFunc)( ctx, start, count ) #define RENDER_LINE( i1, i ) \ gl_render_clipped_line2( ctx, i1, i ) @@ -575,7 +590,7 @@ GLuint *stipplecounter = &VB->ctx->StippleCounter; \ (void) eflag; (void) stipplecounter; -#define INIT(x) FLUSH_PRIM(x); +#define INIT(x) if (x == GL_POLYGON) FLUSH_POLY(x); else FLUSH_PRIM(x) #define TAG(x) x##_clipped #define RESET_STIPPLE *stipplecounter = 0 @@ -633,9 +648,9 @@ case GL_POLYGON: if (flag[0]) flag[0] = 0x1; for (i = 1 ; i < n-1 ; i++) { - if (flag[i]) flag[i] = 0x1<<2; + if (flag[i]) flag[i] = 0x4; } - if (flag[i]) flag[i] = 0x3<<2; + if (flag[i]) flag[i] = 0x8; break; default: break; Index: xc/extras/Mesa/src/vbxform.c diff -u xc/extras/Mesa/src/vbxform.c:1.4 xc/extras/Mesa/src/vbxform.c:1.6 --- xc/extras/Mesa/src/vbxform.c:1.4 Fri Jun 16 20:02:19 2000 +++ xc/extras/Mesa/src/vbxform.c Thu Nov 30 10:39:05 2000 @@ -269,8 +269,13 @@ VERT_BEGIN_0, IM->Start, gl_lookup_enum_by_nr(ctx->Current.Primitive)); +#ifdef VAO + IM->ArrayAndFlags = ~ctx->Array.Current->Flags; + IM->ArrayIncr = ctx->Array.Current->Vertex.Enabled; +#else IM->ArrayAndFlags = ~ctx->Array.Flags; IM->ArrayIncr = ctx->Array.Vertex.Enabled; +#endif IM->ArrayEltFlush = !(ctx->CompileCVAFlag); } @@ -680,7 +685,7 @@ IM->NormalLengths = (GLfloat *)MALLOC(sizeof(GLfloat) * VB_SIZE); calc_normal_lengths( IM->NormalLengths + start, - (const GLfloat (*)[3])(IM->Normal + start), + (CONST GLfloat (*)[3])(IM->Normal + start), IM->Flag + start, IM->Count - start); Index: xc/extras/Mesa/src/vector.c diff -u xc/extras/Mesa/src/vector.c:1.3 xc/extras/Mesa/src/vector.c:1.6 --- xc/extras/Mesa/src/vector.c:1.3 Tue Feb 15 02:12:43 2000 +++ xc/extras/Mesa/src/vector.c Mon Nov 13 18:30:54 2000 @@ -68,6 +68,8 @@ VEC_SIZE_4, }; + + void gl_vector4f_init( GLvector4f *v, GLuint flags, GLfloat (*storage)[4] ) { v->stride = 4*sizeof(GLfloat); @@ -78,7 +80,6 @@ v->flags = size_bits[4] | flags | VEC_GOOD_STRIDE; } - void gl_vector3f_init( GLvector3f *v, GLuint flags, GLfloat (*storage)[3] ) { v->stride = 3*sizeof(GLfloat); @@ -116,13 +117,6 @@ } -#define ALIGN_MALLOC(vec, type, bytes, alignment) \ -do { \ - vec->storage = MALLOC( bytes + alignment - 1 ); \ - vec->start = type (((unsigned long)vec->storage + alignment - 1) \ - & ~(unsigned long)(alignment - 1)); \ -} while (0) - void gl_vector4f_alloc( GLvector4f *v, GLuint sz, GLuint flags, GLuint count, GLuint alignment ) @@ -130,18 +124,19 @@ (void) sz; v->stride = 4*sizeof(GLfloat); v->size = 2; - ALIGN_MALLOC(v, (GLfloat *), count * 4 * sizeof(GLfloat), alignment); + v->storage = v->start = (GLfloat *) + ALIGN_MALLOC( count * 4 * sizeof(GLfloat), alignment ); v->data = (GLfloat (*)[4])v->start; v->count = 0; v->flags = size_bits[4] | flags | VEC_MALLOC | VEC_GOOD_STRIDE; } - void gl_vector3f_alloc( GLvector3f *v, GLuint flags, GLuint count, GLuint alignment ) { v->stride = 3*sizeof(GLfloat); - ALIGN_MALLOC(v, (GLfloat *), count * 3 * sizeof(GLfloat), alignment); + v->storage = v->start = (GLfloat *) + ALIGN_MALLOC( count * 3 * sizeof(GLfloat), alignment ); v->data = (GLfloat (*)[3])v->start; v->count = 0; v->flags = flags | VEC_MALLOC | VEC_GOOD_STRIDE; @@ -151,7 +146,8 @@ GLuint alignment ) { v->stride = 4*sizeof(GLubyte); - ALIGN_MALLOC(v, (GLubyte *), count * 4 * sizeof(GLubyte), alignment); + v->storage = v->start = (GLubyte *) + ALIGN_MALLOC( count * 4 * sizeof(GLubyte), alignment ); v->data = (GLubyte (*)[4])v->start; v->count = 0; v->flags = flags | VEC_MALLOC | VEC_GOOD_STRIDE; @@ -161,7 +157,8 @@ GLuint alignment ) { v->stride = 1*sizeof(GLubyte); - ALIGN_MALLOC(v, (GLubyte *), count * sizeof(GLubyte), alignment); + v->storage = v->start = (GLubyte *) + ALIGN_MALLOC( count * sizeof(GLubyte), alignment ); v->data = v->start; v->count = 0; v->flags = flags | VEC_MALLOC | VEC_GOOD_STRIDE; @@ -171,7 +168,8 @@ GLuint alignment ) { v->stride = 1*sizeof(GLuint); - ALIGN_MALLOC(v, (GLuint *), count * sizeof(GLuint), alignment); + v->storage = v->start = (GLuint *) + ALIGN_MALLOC( count * sizeof(GLuint), alignment ); v->data = v->start; v->count = 0; v->flags = flags | VEC_MALLOC | VEC_GOOD_STRIDE; @@ -182,7 +180,7 @@ void gl_vector4f_free( GLvector4f *v ) { if (v->flags & VEC_MALLOC) { - FREE( v->storage ); + ALIGN_FREE( v->storage ); v->data = 0; v->start = 0; v->storage = 0; @@ -193,7 +191,7 @@ void gl_vector3f_free( GLvector3f *v ) { if (v->flags & VEC_MALLOC) { - FREE( v->storage ); + ALIGN_FREE( v->storage ); v->data = 0; v->start = 0; v->storage = 0; @@ -204,7 +202,7 @@ void gl_vector4ub_free( GLvector4ub *v ) { if (v->flags & VEC_MALLOC) { - FREE( v->storage ); + ALIGN_FREE( v->storage ); v->data = 0; v->start = 0; v->storage = 0; @@ -215,7 +213,7 @@ void gl_vector1ub_free( GLvector1ub *v ) { if (v->flags & VEC_MALLOC) { - FREE( v->storage ); + ALIGN_FREE( v->storage ); v->data = 0; v->start = 0; v->storage = 0; @@ -226,7 +224,7 @@ void gl_vector1ui_free( GLvector1ui *v ) { if (v->flags & VEC_MALLOC) { - FREE( v->storage ); + ALIGN_FREE( v->storage ); v->data = 0; v->start = 0; v->storage = 0; @@ -234,6 +232,8 @@ } } + + void gl_vector4f_print( GLvector4f *v, GLubyte *cullmask, GLboolean culling ) { GLfloat c[4] = { 0, 0, 0, 1 }; @@ -281,7 +281,6 @@ } } } - void gl_vector3f_print( GLvector3f *v, GLubyte *cullmask, GLboolean culling ) { Index: xc/extras/Mesa/src/vertices.c diff -u xc/extras/Mesa/src/vertices.c:1.3 xc/extras/Mesa/src/vertices.c:1.4 --- xc/extras/Mesa/src/vertices.c:1.3 Tue Feb 15 02:12:43 2000 +++ xc/extras/Mesa/src/vertices.c Mon Nov 13 16:55:35 2000 @@ -2,19 +2,19 @@ /* * Mesa 3-D graphics library * Version: 3.3 - * + * * Copyright (C) 1999 Brian Paul All Rights Reserved. - * + * * 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 @@ -34,7 +34,7 @@ #if defined(USE_X86_ASM) -#include "X86/common_x86asm.h" +#include "X86/common_x86_asm.h" #endif @@ -58,7 +58,7 @@ */ /* The inline 3dnow code seems to give problems with some peoples - * compiler/binutils. + * compiler/binutils. */ /* #undef USE_3DNOW_ASM */ @@ -69,15 +69,15 @@ #endif -static void _PROJAPI transform_v16(GLfloat *f, - const GLfloat *m, - const GLfloat *obj, - GLuint obj_stride, - GLuint count ) +static void _PROJAPI transform_v16( GLfloat *f, + const GLfloat *m, + const GLfloat *obj, + GLuint obj_stride, + GLuint count ) { GLuint i; - for (i = 0 ; i < count ; i++, STRIDE_F(obj, obj_stride), f+=16) + for (i = 0 ; i < count ; i++, STRIDE_F(obj, obj_stride), f+=16) { const GLfloat ox = obj[0], oy = obj[1], oz = obj[2]; f[0] = m[0] * ox + m[4] * oy + m[8] * oz + m[12]; @@ -87,71 +87,27 @@ } } -/* Project all vertices upto but not including last. Guarenteed to be - * at least one such vertex. - */ -static void _PROJAPI project_verts(GLfloat *first, - GLfloat *last, - const GLfloat *m, - GLuint stride ) -{ - const GLfloat sx = m[0], sy = m[5], sz = m[10]; - const GLfloat tx = m[12], ty = m[13], tz = m[14]; - GLfloat *f; - - for ( f = first ; f != last ; STRIDE_F(f,stride)) - { - const GLfloat oow = 1.0F / f[3]; - f[0] = sx * f[0] * oow + tx; - f[1] = sy * f[1] * oow + ty; - f[2] = sz * f[2] * oow + tz; - f[3] = oow; - } -} -static void _PROJAPI project_clipped_verts(GLfloat *first, - GLfloat *last, - const GLfloat *m, - GLuint stride, - const GLubyte *clipmask ) -{ - const GLfloat sx = m[0], sy = m[5], sz = m[10]; - const GLfloat tx = m[12], ty = m[13], tz = m[14]; - GLfloat *f; - - for ( f = first ; f != last ; STRIDE_F(f,stride), clipmask++) - { - if (!*clipmask) { - const GLfloat oow = 1.0F / f[3]; - f[0] = sx * f[0] * oow + tx; - f[1] = sy * f[1] * oow + ty; - f[2] = sz * f[2] * oow + tz; - f[3] = oow; - } - } -} - - static void _PROJAPI cliptest_v16( GLfloat *first, - GLfloat *last, - GLubyte *p_clipOr, - GLubyte *p_clipAnd, - GLubyte *clipmask ) -{ + GLfloat *last, + GLubyte *p_clipOr, + GLubyte *p_clipAnd, + GLubyte *clipmask ) +{ GLubyte clipAnd = (GLubyte) ~0; GLubyte clipOr = 0; GLfloat *f = first; static int i; i = 0; - for ( ; f != last ; f+=16, clipmask++, i++) + for ( ; f != last ; f+=16, clipmask++, i++) { const GLfloat cx = f[0]; const GLfloat cy = f[1]; const GLfloat cz = f[2]; - const GLfloat cw = f[3]; + const GLfloat cw = f[3]; GLubyte mask = 0; if (cx > cw) mask |= CLIP_RIGHT_BIT; @@ -172,6 +128,51 @@ +/* Project all vertices upto but not including last. Guarenteed to be + * at least one such vertex. + */ +static void _PROJAPI project_verts( GLfloat *first, + GLfloat *last, + const GLfloat *m, + GLuint stride ) +{ + const GLfloat sx = m[0], sy = m[5], sz = m[10]; + const GLfloat tx = m[12], ty = m[13], tz = m[14]; + GLfloat *f; + + for ( f = first ; f != last ; STRIDE_F(f,stride)) + { + const GLfloat oow = 1.0F / f[3]; + f[0] = sx * f[0] * oow + tx; + f[1] = sy * f[1] * oow + ty; + f[2] = sz * f[2] * oow + tz; + f[3] = oow; + } +} + +static void _PROJAPI project_clipped_verts( GLfloat *first, + GLfloat *last, + const GLfloat *m, + GLuint stride, + const GLubyte *clipmask ) +{ + const GLfloat sx = m[0], sy = m[5], sz = m[10]; + const GLfloat tx = m[12], ty = m[13], tz = m[14]; + GLfloat *f; + + for ( f = first ; f != last ; STRIDE_F(f,stride), clipmask++) + { + if (!*clipmask) { + const GLfloat oow = 1.0F / f[3]; + f[0] = sx * f[0] * oow + tx; + f[1] = sy * f[1] * oow + ty; + f[2] = sz * f[2] * oow + tz; + f[3] = oow; + } + } +} + + GLenum gl_reduce_prim[GL_POLYGON+1] = { GL_POINTS, GL_LINES, @@ -183,13 +184,28 @@ GL_TRIANGLES, GL_TRIANGLES, GL_TRIANGLES, -}; +}; + -gl_transform_func gl_xform_points3_v16_general = transform_v16; -gl_cliptest_func gl_cliptest_points4_v16 = cliptest_v16; -gl_project_clipped_func gl_project_clipped_v16 = project_clipped_verts; -gl_project_func gl_project_v16 = project_verts; +gl_transform_func gl_xform_points3_v16_general; +gl_cliptest_func gl_cliptest_points4_v16; +gl_project_func gl_project_v16; +gl_project_clipped_func gl_project_clipped_v16; -void gl_init_vertices() + +void gl_init_vertices( void ) { + gl_xform_points3_v16_general = transform_v16; + gl_cliptest_points4_v16 = cliptest_v16; + gl_project_v16 = project_verts; + gl_project_clipped_v16 = project_clipped_verts; + +#if 0 + /* GH: Add tests/benchmarks for the vertex asm */ + gl_test_all_vertex_functions( "default" ); +#endif + +#ifdef USE_X86_ASM + gl_init_all_x86_vertex_asm(); +#endif } Index: xc/extras/Mesa/src/vertices.h diff -u xc/extras/Mesa/src/vertices.h:1.3 xc/extras/Mesa/src/vertices.h:1.4 --- xc/extras/Mesa/src/vertices.h:1.3 Tue Feb 15 02:12:44 2000 +++ xc/extras/Mesa/src/vertices.h Mon Nov 13 16:55:35 2000 @@ -2,19 +2,19 @@ /* * Mesa 3-D graphics library * Version: 3.3 - * + * * Copyright (C) 1999 Brian Paul All Rights Reserved. - * + * * 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 @@ -24,8 +24,8 @@ */ -#ifndef VERTICES_H_ -#define VERTICES_H_ +#ifndef __VERTICES_H__ +#define __VERTICES_H__ #ifdef USE_X86_ASM #define _PROJAPI _ASMAPI @@ -36,45 +36,44 @@ #endif typedef void (_PROJAPIP gl_transform_func)( GLfloat *first_vert, - const GLfloat *m, - const GLfloat *src, - GLuint src_stride, - GLuint count ); + const GLfloat *m, + const GLfloat *src, + GLuint src_stride, + GLuint count ); typedef void (_PROJAPIP gl_cliptest_func)( GLfloat *first_vert, - GLfloat *last_vert, /* use count instead? */ - GLubyte *or_mask, - GLubyte *and_mask, - GLubyte *clip_mask ); + GLfloat *last_vert, /* use count instead? */ + GLubyte *or_mask, + GLubyte *and_mask, + GLubyte *clip_mask ); -typedef void (_PROJAPIP gl_project_clipped_func)( GLfloat *first, - GLfloat *last, - const GLfloat *m, - GLuint stride, - const GLubyte *clipmask ); - typedef void (_PROJAPIP gl_project_func)( GLfloat *first, - GLfloat *last, - const GLfloat *m, - GLuint stride ); + GLfloat *last, + const GLfloat *m, + GLuint stride ); +typedef void (_PROJAPIP gl_project_clipped_func)( GLfloat *first, + GLfloat *last, + const GLfloat *m, + GLuint stride, + const GLubyte *clipmask ); + +typedef void (_PROJAPIP gl_vertex_interp_func)( GLfloat t, + GLfloat *result, + const GLfloat *in, + const GLfloat *out ); + /* At the moment these are used by fastpaths in the FX and MGA drivers. */ extern gl_transform_func gl_xform_points3_v16_general; -extern gl_cliptest_func gl_cliptest_points4_v16; -extern gl_project_clipped_func gl_project_clipped_v16; -extern gl_project_func gl_project_v16; - +extern gl_cliptest_func gl_cliptest_points4_v16; +extern gl_project_func gl_project_v16; +extern gl_project_clipped_func gl_project_clipped_v16; extern GLenum gl_reduce_prim[]; -extern void gl_init_vertices(void); -typedef void (*gl_vertex_interp_func)( GLfloat t, - GLfloat *result, - const GLfloat *in, - const GLfloat *out ); - +extern void gl_init_vertices( void ); #endif Index: xc/extras/Mesa/src/xform.c diff -u xc/extras/Mesa/src/xform.c:1.3 xc/extras/Mesa/src/xform.c:1.4 --- xc/extras/Mesa/src/xform.c:1.3 Tue Feb 15 02:12:44 2000 +++ xc/extras/Mesa/src/xform.c Mon Nov 13 16:55:35 2000 @@ -52,7 +52,7 @@ #endif #ifdef USE_X86_ASM -#include "X86/common_x86asm.h" +#include "X86/common_x86_asm.h" #endif clip_func gl_clip_tab[5]; @@ -201,12 +201,12 @@ init_dotprod_masked(); #ifdef DEBUG - gl_test_all_transform_functions ("default"); - gl_test_all_normal_transform_functions ("default"); + gl_test_all_transform_functions( "default" ); + gl_test_all_normal_transform_functions( "default" ); #endif #ifdef USE_X86_ASM - gl_init_all_x86_asm (); + gl_init_all_x86_transform_asm(); #endif } Index: xc/extras/Mesa/src/xform.h diff -u xc/extras/Mesa/src/xform.h:1.3 xc/extras/Mesa/src/xform.h:1.6 --- xc/extras/Mesa/src/xform.h:1.3 Tue Feb 15 02:12:44 2000 +++ xc/extras/Mesa/src/xform.h Mon Nov 13 18:30:54 2000 @@ -134,7 +134,7 @@ * parameter, to allow a unified interface. */ typedef void (_XFORMAPIP transform_func)( GLvector4f *to_vec, - const GLmatrix *mat, + const GLfloat m[16], const GLvector4f *from_vec, const GLubyte *clipmask, const GLubyte flag ); @@ -144,11 +144,11 @@ const GLvector4f *from ); extern void gl_transform_bounds3( GLubyte *orMask, GLubyte *andMask, - const GLmatrix *mat, + const GLfloat m[16], CONST GLfloat src[][3] ); extern void gl_transform_bounds2( GLubyte *orMask, GLubyte *andMask, - const GLmatrix *mat, + const GLfloat m[16], CONST GLfloat src[][3] ); @@ -168,11 +168,11 @@ #define TransformRaw( to, mat, from ) \ - ( (*gl_transform_tab[0][(from)->size][(mat)->type])( to, mat, from, 0, 0 ), \ + ( (*gl_transform_tab[0][(from)->size][(mat)->type])( to, (mat)->m, from, 0, 0 ), \ (to) ) #define Transform( to, mat, from, mask, cull ) \ - ( (*gl_transform_tab[cull!=0][(from)->size][(mat)->type])( to, mat, from, mask, cull ), \ + ( (*gl_transform_tab[cull!=0][(from)->size][(mat)->type])( to, (mat)->m, from, mask, cull ), \ (to) ) Index: xc/extras/Mesa/src/xform_tmp.h diff -u xc/extras/Mesa/src/xform_tmp.h:1.3 xc/extras/Mesa/src/xform_tmp.h:1.6 --- xc/extras/Mesa/src/xform_tmp.h:1.3 Tue Feb 15 02:12:45 2000 +++ xc/extras/Mesa/src/xform_tmp.h Mon Nov 13 18:30:54 2000 @@ -64,8 +64,9 @@ * cliped and/or culled vertices. */ -static void _XFORMAPI TAG(transform_points1_general)( GLvector4f *to_vec, - const GLmatrix *mat, +static void _XFORMAPI +TAG(transform_points1_general)( GLvector4f *to_vec, + const GLfloat m[16], const GLvector4f *from_vec, const GLubyte *mask, const GLubyte flag ) @@ -74,7 +75,6 @@ GLfloat *from = from_vec->start; GLfloat (*to)[4] = (GLfloat (*)[4])to_vec->start; GLuint count = from_vec->count; - const GLfloat *m = mat->m; const GLfloat m0 = m[0], m12 = m[12]; const GLfloat m1 = m[1], m13 = m[13]; const GLfloat m2 = m[2], m14 = m[14]; @@ -97,8 +97,9 @@ to_vec->count = from_vec->count; } -static void _XFORMAPI TAG(transform_points1_identity)( GLvector4f *to_vec, - const GLmatrix *mat, +static void _XFORMAPI +TAG(transform_points1_identity)( GLvector4f *to_vec, + const GLfloat m[16], const GLvector4f *from_vec, const GLubyte *mask, const GLubyte flag ) @@ -108,10 +109,8 @@ GLuint count = from_vec->count; GLfloat (*to)[4] = (GLfloat (*)[4])to_vec->start; GLuint i; - (void) mat; (void) mask; (void) flag; - ASSERT(mat->type == MATRIX_IDENTITY); if (to_vec == from_vec) return; STRIDE_LOOP { CLIP_CHECK { @@ -124,8 +123,9 @@ to_vec->count = from_vec->count; } -static void _XFORMAPI TAG(transform_points1_2d)( GLvector4f *to_vec, - const GLmatrix *mat, +static void _XFORMAPI +TAG(transform_points1_2d)( GLvector4f *to_vec, + const GLfloat m[16], const GLvector4f *from_vec, const GLubyte *mask, const GLubyte flag ) @@ -134,13 +134,11 @@ GLfloat *from = from_vec->start; GLfloat (*to)[4] = (GLfloat (*)[4])to_vec->start; GLuint count = from_vec->count; - const GLfloat *m = mat->m; const GLfloat m0 = m[0], m1 = m[1]; const GLfloat m12 = m[12], m13 = m[13]; GLuint i; (void) mask; (void) flag; - ASSERT(mat->type == MATRIX_2D); STRIDE_LOOP { CLIP_CHECK { const GLfloat ox = from[0]; @@ -153,8 +151,9 @@ to_vec->count = from_vec->count; } -static void _XFORMAPI TAG(transform_points1_2d_no_rot)( GLvector4f *to_vec, - const GLmatrix *mat, +static void _XFORMAPI +TAG(transform_points1_2d_no_rot)( GLvector4f *to_vec, + const GLfloat m[16], const GLvector4f *from_vec, const GLubyte *mask, const GLubyte flag ) @@ -163,12 +162,10 @@ GLfloat *from = from_vec->start; GLfloat (*to)[4] = (GLfloat (*)[4])to_vec->start; GLuint count = from_vec->count; - const GLfloat *m = mat->m; const GLfloat m0 = m[0], m12 = m[12], m13 = m[13]; GLuint i; (void) mask; (void) flag; - ASSERT(mat->type == MATRIX_2D_NO_ROT); STRIDE_LOOP { CLIP_CHECK { const GLfloat ox = from[0]; @@ -182,8 +179,9 @@ to_vec->count = from_vec->count; } -static void _XFORMAPI TAG(transform_points1_3d)( GLvector4f *to_vec, - const GLmatrix *mat, +static void _XFORMAPI +TAG(transform_points1_3d)( GLvector4f *to_vec, + const GLfloat m[16], const GLvector4f *from_vec, const GLubyte *mask, const GLubyte flag ) @@ -192,13 +190,11 @@ GLfloat *from = from_vec->start; GLfloat (*to)[4] = (GLfloat (*)[4])to_vec->start; GLuint count = from_vec->count; - const GLfloat *m = mat->m; const GLfloat m0 = m[0], m1 = m[1], m2 = m[2]; const GLfloat m12 = m[12], m13 = m[13], m14 = m[14]; GLuint i; (void) mask; (void) flag; - ASSERT(mat->type == MATRIX_3D); STRIDE_LOOP { CLIP_CHECK { const GLfloat ox = from[0]; @@ -213,8 +209,9 @@ } -static void _XFORMAPI TAG(transform_points1_3d_no_rot)( GLvector4f *to_vec, - const GLmatrix *mat, +static void _XFORMAPI +TAG(transform_points1_3d_no_rot)( GLvector4f *to_vec, + const GLfloat m[16], const GLvector4f *from_vec, const GLubyte *mask, const GLubyte flag ) @@ -223,13 +220,11 @@ GLfloat *from = from_vec->start; GLfloat (*to)[4] = (GLfloat (*)[4])to_vec->start; GLuint count = from_vec->count; - const GLfloat *m = mat->m; const GLfloat m0 = m[0]; const GLfloat m12 = m[12], m13 = m[13], m14 = m[14]; GLuint i; (void) mask; (void) flag; - ASSERT(mat->type == MATRIX_3D_NO_ROT); STRIDE_LOOP { CLIP_CHECK { const GLfloat ox = from[0]; @@ -243,8 +238,9 @@ to_vec->count = from_vec->count; } -static void _XFORMAPI TAG(transform_points1_perspective)( GLvector4f *to_vec, - const GLmatrix *mat, +static void _XFORMAPI +TAG(transform_points1_perspective)( GLvector4f *to_vec, + const GLfloat m[16], const GLvector4f *from_vec, const GLubyte *mask, const GLubyte flag ) @@ -253,12 +249,10 @@ GLfloat *from = from_vec->start; GLfloat (*to)[4] = (GLfloat (*)[4])to_vec->start; GLuint count = from_vec->count; - const GLfloat *m = mat->m; const GLfloat m0 = m[0], m14 = m[14]; GLuint i; (void) mask; (void) flag; - ASSERT(mat->type == MATRIX_PERSPECTIVE); STRIDE_LOOP { CLIP_CHECK { const GLfloat ox = from[0]; @@ -280,8 +274,9 @@ * present early in the geometry pipeline and throughout the * texture pipeline. */ -static void _XFORMAPI TAG(transform_points2_general)( GLvector4f *to_vec, - const GLmatrix *mat, +static void _XFORMAPI +TAG(transform_points2_general)( GLvector4f *to_vec, + const GLfloat m[16], const GLvector4f *from_vec, const GLubyte *mask, const GLubyte flag ) @@ -290,7 +285,6 @@ GLfloat *from = from_vec->start; GLfloat (*to)[4] = (GLfloat (*)[4])to_vec->start; GLuint count = from_vec->count; - const GLfloat *m = mat->m; const GLfloat m0 = m[0], m4 = m[4], m12 = m[12]; const GLfloat m1 = m[1], m5 = m[5], m13 = m[13]; const GLfloat m2 = m[2], m6 = m[6], m14 = m[14]; @@ -312,8 +306,9 @@ to_vec->count = from_vec->count; } -static void _XFORMAPI TAG(transform_points2_identity)( GLvector4f *to_vec, - const GLmatrix *mat, +static void _XFORMAPI +TAG(transform_points2_identity)( GLvector4f *to_vec, + const GLfloat m[16], const GLvector4f *from_vec, const GLubyte *mask, const GLubyte flag ) @@ -323,10 +318,8 @@ GLfloat (*to)[4] = (GLfloat (*)[4])to_vec->start; GLuint count = from_vec->count; GLuint i; - (void) mat; (void) mask; (void) flag; - ASSERT(mat->type == MATRIX_IDENTITY); if (to_vec == from_vec) return; STRIDE_LOOP { CLIP_CHECK { @@ -339,8 +332,9 @@ to_vec->count = from_vec->count; } -static void _XFORMAPI TAG(transform_points2_2d)( GLvector4f *to_vec, - const GLmatrix *mat, +static void _XFORMAPI +TAG(transform_points2_2d)( GLvector4f *to_vec, + const GLfloat m[16], const GLvector4f *from_vec, const GLubyte *mask, const GLubyte flag ) @@ -349,13 +343,11 @@ GLfloat *from = from_vec->start; GLfloat (*to)[4] = (GLfloat (*)[4])to_vec->start; GLuint count = from_vec->count; - const GLfloat *m = mat->m; const GLfloat m0 = m[0], m1 = m[1], m4 = m[4], m5 = m[5]; const GLfloat m12 = m[12], m13 = m[13]; GLuint i; (void) mask; (void) flag; - ASSERT(mat->type == MATRIX_2D); STRIDE_LOOP { CLIP_CHECK { const GLfloat ox = from[0], oy = from[1]; @@ -369,8 +361,9 @@ to_vec->count = from_vec->count; } -static void _XFORMAPI TAG(transform_points2_2d_no_rot)( GLvector4f *to_vec, - const GLmatrix *mat, +static void _XFORMAPI +TAG(transform_points2_2d_no_rot)( GLvector4f *to_vec, + const GLfloat m[16], const GLvector4f *from_vec, const GLubyte *mask, const GLubyte flag ) @@ -379,12 +372,10 @@ GLfloat *from = from_vec->start; GLfloat (*to)[4] = (GLfloat (*)[4])to_vec->start; GLuint count = from_vec->count; - const GLfloat *m = mat->m; const GLfloat m0 = m[0], m5 = m[5], m12 = m[12], m13 = m[13]; GLuint i; (void) mask; (void) flag; - ASSERT(mat->type == MATRIX_2D_NO_ROT); STRIDE_LOOP { CLIP_CHECK { const GLfloat ox = from[0], oy = from[1]; @@ -398,8 +389,9 @@ to_vec->count = from_vec->count; } -static void _XFORMAPI TAG(transform_points2_3d)( GLvector4f *to_vec, - const GLmatrix *mat, +static void _XFORMAPI +TAG(transform_points2_3d)( GLvector4f *to_vec, + const GLfloat m[16], const GLvector4f *from_vec, const GLubyte *mask, const GLubyte flag ) @@ -408,13 +400,11 @@ GLfloat *from = from_vec->start; GLfloat (*to)[4] = (GLfloat (*)[4])to_vec->start; GLuint count = from_vec->count; - const GLfloat *m = mat->m; const GLfloat m0 = m[0], m1 = m[1], m2 = m[2], m4 = m[4], m5 = m[5]; const GLfloat m6 = m[6], m12 = m[12], m13 = m[13], m14 = m[14]; GLuint i; (void) mask; (void) flag; - ASSERT(mat->type == MATRIX_3D); STRIDE_LOOP { CLIP_CHECK { const GLfloat ox = from[0], oy = from[1]; @@ -432,8 +422,9 @@ /* I would actually say this was a fairly important function, from * a texture transformation point of view. */ -static void _XFORMAPI TAG(transform_points2_3d_no_rot)( GLvector4f *to_vec, - const GLmatrix *mat, +static void _XFORMAPI +TAG(transform_points2_3d_no_rot)( GLvector4f *to_vec, + const GLfloat m[16], const GLvector4f *from_vec, const GLubyte *mask, const GLubyte flag ) @@ -442,13 +433,11 @@ GLfloat *from = from_vec->start; GLfloat (*to)[4] = (GLfloat (*)[4])to_vec->start; GLuint count = from_vec->count; - const GLfloat *m = mat->m; const GLfloat m0 = m[0], m5 = m[5]; const GLfloat m12 = m[12], m13 = m[13], m14 = m[14]; GLuint i; (void) mask; (void) flag; - ASSERT(mat->type == MATRIX_3D_NO_ROT); STRIDE_LOOP { CLIP_CHECK { const GLfloat ox = from[0], oy = from[1]; @@ -471,8 +460,9 @@ * code. It's also hard to remove any of these functions if you are * attached to the assertions that have appeared in them. */ -static void _XFORMAPI TAG(transform_points2_perspective)( GLvector4f *to_vec, - const GLmatrix *mat, +static void _XFORMAPI +TAG(transform_points2_perspective)( GLvector4f *to_vec, + const GLfloat m[16], const GLvector4f *from_vec, const GLubyte *mask, const GLubyte flag ) @@ -481,12 +471,10 @@ GLfloat *from = from_vec->start; GLfloat (*to)[4] = (GLfloat (*)[4])to_vec->start; GLuint count = from_vec->count; - const GLfloat *m = mat->m; const GLfloat m0 = m[0], m5 = m[5], m14 = m[14]; GLuint i; (void) mask; (void) flag; - ASSERT(mat->type == MATRIX_PERSPECTIVE); STRIDE_LOOP { CLIP_CHECK { const GLfloat ox = from[0], oy = from[1]; @@ -503,8 +491,9 @@ -static void _XFORMAPI TAG(transform_points3_general)( GLvector4f *to_vec, - const GLmatrix *mat, +static void _XFORMAPI +TAG(transform_points3_general)( GLvector4f *to_vec, + const GLfloat m[16], const GLvector4f *from_vec, const GLubyte *mask, const GLubyte flag ) @@ -513,7 +502,6 @@ GLfloat *from = from_vec->start; GLfloat (*to)[4] = (GLfloat (*)[4])to_vec->start; GLuint count = from_vec->count; - const GLfloat *m = mat->m; const GLfloat m0 = m[0], m4 = m[4], m8 = m[8], m12 = m[12]; const GLfloat m1 = m[1], m5 = m[5], m9 = m[9], m13 = m[13]; const GLfloat m2 = m[2], m6 = m[6], m10 = m[10], m14 = m[14]; @@ -521,7 +509,6 @@ GLuint i; (void) mask; (void) flag; - ASSERT(mat->type == MATRIX_GENERAL); STRIDE_LOOP { CLIP_CHECK { const GLfloat ox = from[0], oy = from[1], oz = from[2]; @@ -536,8 +523,9 @@ to_vec->count = from_vec->count; } -static void _XFORMAPI TAG(transform_points3_identity)( GLvector4f *to_vec, - const GLmatrix *mat, +static void _XFORMAPI +TAG(transform_points3_identity)( GLvector4f *to_vec, + const GLfloat m[16], const GLvector4f *from_vec, const GLubyte *mask, const GLubyte flag ) @@ -547,10 +535,8 @@ GLfloat (*to)[4] = (GLfloat (*)[4])to_vec->start; GLuint count = from_vec->count; GLuint i; - (void) mat; (void) mask; (void) flag; - ASSERT(mat->type == MATRIX_IDENTITY); if (to_vec == from_vec) return; STRIDE_LOOP { CLIP_CHECK { @@ -564,8 +550,9 @@ to_vec->count = from_vec->count; } -static void _XFORMAPI TAG(transform_points3_2d)( GLvector4f *to_vec, - const GLmatrix *mat, +static void _XFORMAPI +TAG(transform_points3_2d)( GLvector4f *to_vec, + const GLfloat m[16], const GLvector4f *from_vec, const GLubyte *mask, const GLubyte flag ) @@ -574,13 +561,11 @@ GLfloat *from = from_vec->start; GLfloat (*to)[4] = (GLfloat (*)[4])to_vec->start; GLuint count = from_vec->count; - const GLfloat *m = mat->m; const GLfloat m0 = m[0], m1 = m[1], m4 = m[4], m5 = m[5]; const GLfloat m12 = m[12], m13 = m[13]; GLuint i; (void) mask; (void) flag; - ASSERT(mat->type == MATRIX_2D); STRIDE_LOOP { CLIP_CHECK { const GLfloat ox = from[0], oy = from[1], oz = from[2]; @@ -594,8 +579,9 @@ to_vec->count = from_vec->count; } -static void _XFORMAPI TAG(transform_points3_2d_no_rot)( GLvector4f *to_vec, - const GLmatrix *mat, +static void _XFORMAPI +TAG(transform_points3_2d_no_rot)( GLvector4f *to_vec, + const GLfloat m[16], const GLvector4f *from_vec, const GLubyte *mask, const GLubyte flag ) @@ -604,12 +590,10 @@ GLfloat *from = from_vec->start; GLfloat (*to)[4] = (GLfloat (*)[4])to_vec->start; GLuint count = from_vec->count; - const GLfloat *m = mat->m; const GLfloat m0 = m[0], m5 = m[5], m12 = m[12], m13 = m[13]; GLuint i; (void) mask; (void) flag; - ASSERT(mat->type == MATRIX_2D_NO_ROT); STRIDE_LOOP { CLIP_CHECK { const GLfloat ox = from[0], oy = from[1], oz = from[2]; @@ -623,8 +607,9 @@ to_vec->count = from_vec->count; } -static void _XFORMAPI TAG(transform_points3_3d)( GLvector4f *to_vec, - const GLmatrix *mat, +static void _XFORMAPI +TAG(transform_points3_3d)( GLvector4f *to_vec, + const GLfloat m[16], const GLvector4f *from_vec, const GLubyte *mask, const GLubyte flag ) @@ -633,14 +618,12 @@ GLfloat *from = from_vec->start; GLfloat (*to)[4] = (GLfloat (*)[4])to_vec->start; GLuint count = from_vec->count; - const GLfloat *m = mat->m; const GLfloat m0 = m[0], m1 = m[1], m2 = m[2], m4 = m[4], m5 = m[5]; const GLfloat m6 = m[6], m8 = m[8], m9 = m[9], m10 = m[10]; const GLfloat m12 = m[12], m13 = m[13], m14 = m[14]; GLuint i; (void) mask; (void) flag; - ASSERT(mat->type == MATRIX_3D); STRIDE_LOOP { CLIP_CHECK { const GLfloat ox = from[0], oy = from[1], oz = from[2]; @@ -656,8 +639,9 @@ /* previously known as ortho... */ -static void _XFORMAPI TAG(transform_points3_3d_no_rot)( GLvector4f *to_vec, - const GLmatrix *mat, +static void _XFORMAPI +TAG(transform_points3_3d_no_rot)( GLvector4f *to_vec, + const GLfloat m[16], const GLvector4f *from_vec, const GLubyte *mask, const GLubyte flag ) @@ -666,13 +650,11 @@ GLfloat *from = from_vec->start; GLfloat (*to)[4] = (GLfloat (*)[4])to_vec->start; GLuint count = from_vec->count; - const GLfloat *m = mat->m; const GLfloat m0 = m[0], m5 = m[5]; const GLfloat m10 = m[10], m12 = m[12], m13 = m[13], m14 = m[14]; GLuint i; (void) mask; (void) flag; - ASSERT(mat->type == MATRIX_3D_NO_ROT); STRIDE_LOOP { CLIP_CHECK { const GLfloat ox = from[0], oy = from[1], oz = from[2]; @@ -686,8 +668,9 @@ to_vec->count = from_vec->count; } -static void _XFORMAPI TAG(transform_points3_perspective)( GLvector4f *to_vec, - const GLmatrix *mat, +static void _XFORMAPI +TAG(transform_points3_perspective)( GLvector4f *to_vec, + const GLfloat m[16], const GLvector4f *from_vec, const GLubyte *mask, const GLubyte flag ) @@ -696,13 +679,11 @@ GLfloat *from = from_vec->start; GLfloat (*to)[4] = (GLfloat (*)[4])to_vec->start; GLuint count = from_vec->count; - const GLfloat *m = mat->m; const GLfloat m0 = m[0], m5 = m[5], m8 = m[8], m9 = m[9]; const GLfloat m10 = m[10], m14 = m[14]; GLuint i; (void) mask; (void) flag; - ASSERT(mat->type == MATRIX_PERSPECTIVE); STRIDE_LOOP { CLIP_CHECK { const GLfloat ox = from[0], oy = from[1], oz = from[2]; @@ -719,8 +700,9 @@ -static void _XFORMAPI TAG(transform_points4_general)( GLvector4f *to_vec, - const GLmatrix *mat, +static void _XFORMAPI +TAG(transform_points4_general)( GLvector4f *to_vec, + const GLfloat m[16], const GLvector4f *from_vec, const GLubyte *mask, const GLubyte flag ) @@ -729,7 +711,6 @@ GLfloat *from = from_vec->start; GLfloat (*to)[4] = (GLfloat (*)[4])to_vec->start; GLuint count = from_vec->count; - const GLfloat *m = mat->m; const GLfloat m0 = m[0], m4 = m[4], m8 = m[8], m12 = m[12]; const GLfloat m1 = m[1], m5 = m[5], m9 = m[9], m13 = m[13]; const GLfloat m2 = m[2], m6 = m[6], m10 = m[10], m14 = m[14]; @@ -737,7 +718,6 @@ GLuint i; (void) mask; (void) flag; - ASSERT(mat->type == MATRIX_GENERAL); STRIDE_LOOP { CLIP_CHECK { const GLfloat ox = from[0], oy = from[1], oz = from[2], ow = from[3]; @@ -752,8 +732,9 @@ to_vec->count = from_vec->count; } -static void _XFORMAPI TAG(transform_points4_identity)( GLvector4f *to_vec, - const GLmatrix *mat, +static void _XFORMAPI +TAG(transform_points4_identity)( GLvector4f *to_vec, + const GLfloat m[16], const GLvector4f *from_vec, const GLubyte *mask, const GLubyte flag ) @@ -763,10 +744,8 @@ GLfloat (*to)[4] = (GLfloat (*)[4])to_vec->start; GLuint count = from_vec->count; GLuint i; - (void) mat; (void) mask; (void) flag; - ASSERT(mat->type == MATRIX_IDENTITY); if (to_vec == from_vec) return; STRIDE_LOOP { CLIP_CHECK { @@ -781,8 +760,9 @@ to_vec->count = from_vec->count; } -static void _XFORMAPI TAG(transform_points4_2d)( GLvector4f *to_vec, - const GLmatrix *mat, +static void _XFORMAPI +TAG(transform_points4_2d)( GLvector4f *to_vec, + const GLfloat m[16], const GLvector4f *from_vec, const GLubyte *mask, const GLubyte flag ) @@ -791,13 +771,11 @@ GLfloat *from = from_vec->start; GLfloat (*to)[4] = (GLfloat (*)[4])to_vec->start; GLuint count = from_vec->count; - const GLfloat *m = mat->m; const GLfloat m0 = m[0], m1 = m[1], m4 = m[4], m5 = m[5]; const GLfloat m12 = m[12], m13 = m[13]; GLuint i; (void) mask; (void) flag; - ASSERT(mat->type == MATRIX_2D); STRIDE_LOOP { CLIP_CHECK { const GLfloat ox = from[0], oy = from[1], oz = from[2], ow = from[3]; @@ -812,8 +790,9 @@ to_vec->count = from_vec->count; } -static void _XFORMAPI TAG(transform_points4_2d_no_rot)( GLvector4f *to_vec, - const GLmatrix *mat, +static void _XFORMAPI +TAG(transform_points4_2d_no_rot)( GLvector4f *to_vec, + const GLfloat m[16], const GLvector4f *from_vec, const GLubyte *mask, const GLubyte flag ) @@ -822,12 +801,10 @@ GLfloat *from = from_vec->start; GLfloat (*to)[4] = (GLfloat (*)[4])to_vec->start; GLuint count = from_vec->count; - const GLfloat *m = mat->m; const GLfloat m0 = m[0], m5 = m[5], m12 = m[12], m13 = m[13]; GLuint i; (void) mask; (void) flag; - ASSERT(mat->type == MATRIX_2D_NO_ROT); STRIDE_LOOP { CLIP_CHECK { const GLfloat ox = from[0], oy = from[1], oz = from[2], ow = from[3]; @@ -842,8 +819,9 @@ to_vec->count = from_vec->count; } -static void _XFORMAPI TAG(transform_points4_3d)( GLvector4f *to_vec, - const GLmatrix *mat, +static void _XFORMAPI +TAG(transform_points4_3d)( GLvector4f *to_vec, + const GLfloat m[16], const GLvector4f *from_vec, const GLubyte *mask, const GLubyte flag ) @@ -852,14 +830,12 @@ GLfloat *from = from_vec->start; GLfloat (*to)[4] = (GLfloat (*)[4])to_vec->start; GLuint count = from_vec->count; - const GLfloat *m = mat->m; const GLfloat m0 = m[0], m1 = m[1], m2 = m[2], m4 = m[4], m5 = m[5]; const GLfloat m6 = m[6], m8 = m[8], m9 = m[9], m10 = m[10]; const GLfloat m12 = m[12], m13 = m[13], m14 = m[14]; GLuint i; (void) mask; (void) flag; - ASSERT(mat->type == MATRIX_3D); STRIDE_LOOP { CLIP_CHECK { const GLfloat ox = from[0], oy = from[1], oz = from[2], ow = from[3]; @@ -874,8 +850,9 @@ to_vec->count = from_vec->count; } -static void _XFORMAPI TAG(transform_points4_3d_no_rot)( GLvector4f *to_vec, - const GLmatrix *mat, +static void _XFORMAPI +TAG(transform_points4_3d_no_rot)( GLvector4f *to_vec, + const GLfloat m[16], const GLvector4f *from_vec, const GLubyte *mask, const GLubyte flag ) @@ -884,13 +861,11 @@ GLfloat *from = from_vec->start; GLfloat (*to)[4] = (GLfloat (*)[4])to_vec->start; GLuint count = from_vec->count; - const GLfloat *m = mat->m; const GLfloat m0 = m[0], m5 = m[5]; const GLfloat m10 = m[10], m12 = m[12], m13 = m[13], m14 = m[14]; GLuint i; (void) mask; (void) flag; - ASSERT(mat->type == MATRIX_3D_NO_ROT); STRIDE_LOOP { CLIP_CHECK { const GLfloat ox = from[0], oy = from[1], oz = from[2], ow = from[3]; @@ -905,8 +880,9 @@ to_vec->count = from_vec->count; } -static void _XFORMAPI TAG(transform_points4_perspective)( GLvector4f *to_vec, - const GLmatrix *mat, +static void _XFORMAPI +TAG(transform_points4_perspective)( GLvector4f *to_vec, + const GLfloat m[16], const GLvector4f *from_vec, const GLubyte *mask, const GLubyte flag ) @@ -915,13 +891,11 @@ GLfloat *from = from_vec->start; GLfloat (*to)[4] = (GLfloat (*)[4])to_vec->start; GLuint count = from_vec->count; - const GLfloat *m = mat->m; const GLfloat m0 = m[0], m5 = m[5], m8 = m[8], m9 = m[9]; const GLfloat m10 = m[10], m14 = m[14]; GLuint i; (void) mask; (void) flag; - ASSERT(mat->type == MATRIX_PERSPECTIVE); STRIDE_LOOP { CLIP_CHECK { const GLfloat ox = from[0], oy = from[1], oz = from[2], ow = from[3]; Index: xc/extras/Mesa/src/FX/fxapi.c diff -u xc/extras/Mesa/src/FX/fxapi.c:1.4 xc/extras/Mesa/src/FX/fxapi.c:removed --- xc/extras/Mesa/src/FX/fxapi.c:1.4 Fri Jun 16 20:02:33 2000 +++ xc/extras/Mesa/src/FX/fxapi.c Mon Dec 18 14:21:51 2000 @@ -1,1424 +0,0 @@ -/* -*- mode: C; tab-width:8; -*- */ - -/* - * Mesa 3-D graphics library - * Version: 3.3 - * - * Copyright (C) 1999-2000 Brian Paul All Rights Reserved. - * - * 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 - * BRIAN PAUL 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. - * - * - * Original Mesa / 3Dfx device driver (C) 1999 David Bucciarelli, by the - * terms stated above. - * - * Thank you for your contribution, David! - * - * Please make note of the above copyright/license statement. If you - * contributed code or bug fixes to this code under the previous (GNU - * Library) license and object to the new license, your code will be - * removed at your request. Please see the Mesa docs/COPYRIGHT file - * for more information. - * - * Additional Mesa/3Dfx driver developers: - * Daryll Strauss - * Keith Whitwell - * - * See fxapi.h for more revision/author details. - */ - - -/* fxapi.c - 3Dfx VooDoo/Mesa interface */ - - -/******************************************************************** - * - * Function names: - * fxMesa.... (The driver API) - * fxDD.... (Mesa device driver functions) - * fxTM.... (Texture manager functions) - * fxSetup.... (Voodoo units setup functions) - * fx.... (Internal driver functions) - * - * Data type names: - * fxMesa.... (Public driver data types) - * tfx.... (Private driver data types) - * - ******************************************************************** - * - * V0.30 - David Bucciarelli (davibu@tin.it) Humanware s.r.l. - * - introduced a new MESA_GLX_FX related behavior - * - the Glide fog table was built in a wrong way (using - * gu* Glide function). Added the code for building the - * table following the OpenGL specs. Thanks to Steve Baker - * for highlighting the problem. - * - fixed few problems in my and Keith's fxDDClear code - * - merged my code with the Keith's one - * - used the new BlendFunc Mesa device driver function - * - used the new AlphaFunc Mesa device driver function - * - used the new Enable Mesa device driver function - * - fixed a bug related to fog in the Mesa core. Fog - * were applied two times: at vertex level and at fragment - * level (thanks to Steve Baker for reporting the problem) - * - glColorMask(GL_FALSE,GL_FALSE,GL_FALSE,GL_FALSE) now works - * (thanks to Jiri Pop for reporting the problem) - * - the driver works fine with OpenGL Unreal - * - fixed a bug in the Mesa core clipping code (related - * to the q texture coordinate) - * - introduced the support for the q texture coordinate - * - * Keith Whitwell (keithw@cableinet.co.uk) - * - optimized the driver and written all the new code - * required by the new Mesa-3.1 device driver API - * and by the new Mesa-3.1 core changes - * - written the cva support and many other stuff - * - * Brian Paul (brian_paul@avid.com) Avid Technology - * - fixed display list share bug for MESA_GLX_FX = window/fullscreen - * - fixed glClear/gl...Mask related problem - * - * Bert Schoenwaelder (bert@prinz-atm.CS.Uni-Magdeburg.De) - * - the driver is now able to sleep when waiting for the completation - * of multiple swapbuffer operations instead of wasting - * CPU time (NOTE: you must uncomment the lines in the - * fxMesaSwapBuffers function in order to enable this option) - * - * Eero Pajarre (epajarre@koti.tpo.fi) - * - enabled the macro FLOAT_COLOR_TO_UBYTE_COLOR under - * windows - * - written an asm x86 optimized float->integer conversions - * for windows - * - * Theodore Jump (tjump@cais.com) - * - fixed a small problem in the __wglMonitor function of the - * wgl emulator - * - written the in-window-rendering hack support for windows - * and Vooodoo1/2 cards - * - * V0.29 - David Bucciarelli (tech.hmw@plus.it) Humanware s.r.l. - * - included in Mesa-3.0 - * - now glGetString(GL_RENDERER) returns more information - * about the hardware configuration: "Mesa Glide - * CARD/ FB/ - * TM/ TMU/" - * where: CARD is the card used for the current context, - * FB is the number of MB for the framebuffer, - * TM is the number of MB for the texture memory, - * TMU is the number of TMU. You can try to run - * Mesa/demos/glinfo in order to have an example of the - * output - * - fixed a problem of the WGL emulator with the - * OpenGL Optimizer 1.1 (thanks to Erwin Coumans for - * the bug report) - * - fixed some bug in the fxwgl.c code (thanks to - * Peter Pettersson for a patch and a bug report) - * - * Theodore Jump (tjump@cais.com) - * - written the SST_DUALHEAD support in the WGL emulator - * - * Daryll Strauss (daryll@harlot.rb.ca.us) - * - fixed the Voodoo Rush support for the in window rendering - * - * V0.28 - David Bucciarelli (tech.hmw@plus.it) Humanware s.r.l. - * - the only supported multitexture functions are GL_MODULATE - * for texture set 0 and GL_MODULATE for texture set 1. In - * all other cases, the driver falls back to pure software - * rendering - * - written the support for the new GL_EXT_multitexture - * - written the DD_MAX_TEXTURE_COORD_SETS support in the - * fxDDGetParameteri() function - * - the driver falls back to pure software rendering when - * texture mapping function is GL_BLEND - * - * V0.27 - David Bucciarelli (tech.hmw@plus.it) Humanware s.r.l. - * - inluded in the Mesa-3.0beta5 - * - written a smal extension (GL_FXMESA_global_texture_lod_bias) in - * order to expose the LOD bias related Glide function - * - fixed a bug fxDDWriteMonoRGBAPixels() - * - the driver is now able to fallback to software rendering in - * any case not directly supported by the hardware - * - written the support for enabling/disabling dithering - * - the in-window-rendering hack now works with any X11 screen - * depth - * - fixed a problem related to color/depth/alpha buffer clears - * - fixed a problem when clearing buffer for a context with the - * alpha buffer - * - fixed a problem in the fxTMReloadSubMipMapLevel() function, - * I have forget a "break;" (thanks to Joe Waters for the bug report) - * - fixed a problem in the color format for the in window - * rendering hack - * - written the fxDDReadRGBAPixels function - * - written the fxDDDepthTestPixelsGeneric function - * - written the fxDDDepthTestSpanGeneric function - * - written the fxDDWriteMonoRGBAPixels function - * - written the fxDDWriteRGBAPixels function - * - removed the multitexture emulation code for Voodoo board - * with only one TMU - * - * Chris Prince - * - fixed a new bug in the wglUseFontBitmaps code - * - * Ralf Knoesel (rknoesel@Stormfront.com) - * - fixed a bug in the wglUseFontBitmaps code - * - * Rune Hasvold (runeh@ifi.uio.no) - * - fixed a problem related to the aux usage in the fxBestResolution - * function - * - fixed the order of pixel formats in the WGL emulator - * - * Fredrik Hubinette (hubbe@hubbe.net) - * - the driver shutdown the Glide for most common signals - * - * V0.26 - David Bucciarelli (tech.hmw@plus.it) Humanware s.r.l. - * - included in the Mesa-3.0beta4 - * - fixed a problem related to a my optimization for the Rune's - * pixel-span optimization - * - fixed a problem related to fxDDSetNearFar() and ctx->ProjectionMatrixType - * (thanks to Ben "Ctrl-Alt-Delete" and the Raul Alonso's ssystem) - * - fixed a small bug in the Rune's pixel-span optimization - * - fixed a problem with GL_CCW (thanks to Curt Olson for and example - * of the problem) - * - grVertex setup code is now ready for the internal thread support - * - fixed a no used optimization with clipped vertices in - * grVertex setup code - * - fixed a problem in the GL_LIGHT_MODEL_TWO_SIDE support (thanks - * to Patrick H. Madden for a complete example of the bug) - * - * Rune Hasvold (runeh@ifi.uio.no) - * - highly optimized the driver functions for writing pixel - * span (2-3 times faster !) - * - * Axel W. Volley (volley@acm.org) Krauss-Maffei Wehrtechnik - * - written the fxDDReadDepthSpanFloat() and fxDDReadDepthSpanInt() - * functions - * - * V0.25 - David Bucciarelli (tech.hmw@plus.it) Humanware s.r.l. - * - fixed a problem with Voodoo boards with only one TMU - * - fixed a bug in the fxMesaCreateContext() - * - now the GL_FRONT_AND_BACK works fine also with - * the alpha buffer and/or antialiasing - * - written the support for GL_FRONT_AND_BACK drawing but - * it doesn't works with the alpha buffer and/or antialiasing - * - fixed some bug in the Mesa core for glCopyTexSubImage - * and glCopyTexImage functions (thanks to Mike Connell - * for an example of the problem) - * - make some small optimizations in the Mesa core in order - * to save same driver call and state change for not very - * well written applications - * - introduced the NEW_DRVSTATE and make other optimizations - * for minimizing state changes - * - made a lot of optimizations in order to minimize state - * changes - * - it isn't more possible to create a context with the - * depth buffer and the stancil buffer (it isn't yet supported) - * - now the partial support for the Multitexture extension - * works with Quake2 for windows - * - vertex snap is not longer used for the Voodoo2 (FX_V2 - * must be defined) - * - done a lot of cleanup in the fxsetup.c file - * - now the partial support for the Multitexture extension - * works with GLQuake for windows - * - * Dieter Nuetzel (nuetzel@kogs.informatik.uni-hamburg.de) University of Hamburg - * - fixed a problem in the asm code for Linux of the fxvsetup.c file - * highlighted by the binutils-2.8.1.0.29. 'fildw' asm instruction - * changed in 'fild' - * - * Kevin Hester (kevinh@glassworks.net) - * - written the wglUseFontBitmaps() function in the WGL emulator - * - * V0.24 - David Bucciarelli (tech.hmw@plus.it) Humanware s.r.l. - * - now the drive always uses per fragment fog - * - written a small optimization in the points drawing function - * - written the support for trilinear filtering with 2 TMUs - * - written the first partial support for the Multitexture extension. - * This task is quite hard because the color combine units work after - * the two texture combine units and not before as required by the - * Multitexture extension - * - written a workaround in fxBestResolution() in order to solve a - * problem with bzflag (it asks for 1x1 window !) - * - changed the fxBestResolution() behavior. It now returns the larger - * screen resolution supported by the hardware (instead of 640x480) - * when it is unable to find an appropriate resolution that is large - * enough for the requested size - * - the driver is now able to use also the texture memory attached to - * second TMU - * - the texture memory manager is now able to work with two TMUs and - * store texture maps in the memory attached to TMU0, TMU1 or to split - * the mimpmap levels across TMUs in order to support trilinear filtering - * - I have bought a Voodoo2 board ! - * - the amount of frambuffer ram is now doubled when an SLI configuration - * is detected - * - solved a problem related to the fxDDTexParam() and fxTexInvalidate() - * functions (thanks to Rune Hasvold for highlighting the problem) - * - done some cleanup in the fxvsetup.c file, written - * the FXVSETUP_FUNC macro - * - done a lot of cleanup in data types and field names - * - * Rune Hasvold (runeh@ifi.uio.no) - * - written the support for a right management of the auxiliary buffer. - * You can now use an 800x600 screen without the depth and alpha - * buffer - * - written the support for a new pixel format (without the depth - * and alpha buffer) in the WGL emulator - * - fixed a bug in the window version of the GLUT (it was ever asking - * for depth buffer) - * - * V0.23 - David Bucciarelli (tech.hmw@plus.it) Humanware s.r.l. - * - included in the Mesa-3.0beta2 release - * - written the support for the OpenGL 1.2 GL_TEXTURE_BASE_LEVEL - * and GL_TEXTURE_MAX_LEVEL - * - rewritten several functions for a more clean support of texture - * mapping and in order to solve some bug - * - the accumulation buffer works (it is bit slow beacuase it requires - * to read/write from/to the Voodoo frame buffer but it works) - * - fixed a bug in the fxDDReadRGBASpan driver function (the R and - * B channels were read in the wrong order). Thanks to Jason Heym - * for highlighting the problem - * - written the support for multiple contexts on multiple boards. - * you can now use the Mesa/Voodoo with multiple Voodoo Graphics - * boards (for example with multiple screens or an HMD) - * - the fxBestResolution() now check all available resolutions - * and it is able to check the amount of framebuffer memory - * before return a resolution - * - modified the GLX/X11 driver in order to support all the - * resolution available - * - changed all function names. They should be now a bit more - * readable - * - written the Glide grVertex setup code for two TMU or - * for Multitexture support with emulationa dn one TMU - * - written the support for the new Mesa driver - * function GetParametri - * - small optimization/clean up in the texbind() function - * - fixed a FPU precision problem for glOrtho and texture - * mapping (thanks to Antti Juhani Huovilainen for an example - * of the problem) - * - written some small SGI OpenGL emulation code for the wgl, - * the OpenGL Optimizer and Cosmo3D work fine under windows ! - * - moved the point/line/triangle/quad support in the fxmesa7.c - * - fixed a bug in the clear_color_depth() (thanks to Henk Kok - * for an example of the problem) - * - written a small workaround for Linux GLQuake, it asks - * for the alpha buffer and the depth buffer at the some time - * (but it never uses the alpha buffer) - * - checked the antialiasing points, lines and polygons support. - * It works fine - * - written the support for standard OpenGL antialiasing using - * blending. Lines support works fine (tested with BZflag) - * while I have still to check the polygons and points support - * - written the support for the alpha buffer. The driver is now - * able to use the Voodoo auxiliary buffer as an alpha buffer - * instead of a depth buffer. Also all the OpenGL blending - * modes are now supported. But you can't request a context - * with an alpha buffer AND a depth buffer at the some time - * (this is an hardware limitation) - * - written the support for switching between the fullscreen - * rendering and the in-window-rendering hack on the fly - * - * Rune Hasvold (runeh@ifi.uio.no) - * - fixed a bug in the texparam() function - * - * Brian Paul (brianp@elastic.avid.com) Avid Technology - * - sources accomodated for the new Mesa 3.0beta1 - * - * V0.22 - David Bucciarelli (tech.hmw@plus.it) Humanware s.r.l. - * - included with some v0.23 bug fix in the final release - * of the Mesa-2.6 - * - written the support for the MESA_WGL_FX env. var. but - * not tested because I have only Voodoo Graphics boards - * - fixed a bug in the backface culling code - * (thanks to David Farrell for an example of the problem) - * - fixed the "Quake2 elevator" bug - * - GL_POLYGONS with 3/4 vertices are now drawn as - * GL_TRIANLGES/GL_QUADS (a small optimization for GLQuake) - * - fixed a bug in fxmesa6.h for GL_LINE_LOOP - * - fixed a NearFarStack bug in the Mesa when applications - * directly call glLoadMatrix to load a projection matrix - * - done some cleanup in the fxmesa2.c file - * - the driver no longer translates the texture maps - * when the Mesa internal format and the Voodoo - * format are the some (usefull for 1 byte texture maps - * where the driver can directly use the Mesa texture - * map). Also the amount of used memory is halfed - * - fixed a bug for GL_DECAL and GL_RGBA - * - fixed a bug in the clear_color_depth() - * - tested the v0.22 with the Mesa-2.6beta2. Impressive - * performances improvement thanks to the new Josh's - * asm code (+10fps in the isosurf demo, +5fps in GLQuake - * TIMEREFRESH) - * - written a optimized version of the RenderVB Mesa driver - * function. The Voodoo driver is now able to upload polygons - * in the most common cases at a very good speed. Good - * performance improvement for large set of small polygons - * - optimized the asm code for setting up the color information - * in the Glide grVertex structure - * - fixed a bug in the fxmesa2.c asm code (the ClipMask[] - * wasn't working) - * - * Josh Vanderhoof (joshv@planet.net) - * - removed the flush() function because it isn't required - * - limited the maximum number of swapbuffers in the Voodoo - * commands FIFO (controlled by the env. var. MESA_FX_SWAP_PENDING) - * - * Holger Kleemiss (holger.kleemiss@metronet.de) STN Atlas Elektronik GmbH - * - applied some patch for the Voodoo Rush - * - * V0.21 - David Bucciarelli (tech.hmw@plus.it) Humanware s.r.l. - * - the driver is now able to take advantage of the ClipMask[], - * ClipOrMask and ClipAndMask information also under Windows - * - introduced a new function in the Mesa driver interface - * ClearColorAndDepth(). Now the glClear() function is - * 2 times faster (!) when you have to clear the color buffer - * and the depth buffer at some time - * - written the first version of the fxRenderVB() driver - * function - * - optimized the glTexImage() path - * - removed the fxMesaTextureUsePalette() support - * - fixed a bug in the points support (thanks to David Farrell - * for an example of the problem) - * - written the optimized path for glSubTexImage(), - * introduced a new function in the Mesa driver interface - * TexSubImage(...) - * - fixed a bug for glColorMask and glDepthMask - * - the wbuffer is not more used. The Voodoo driver uses - * a standard 16bit zbuffer in all cases. It is more consistent - * and now GLQuake and GLQuake2test work also with a GL_ZTRICK 0 - * - the driver is now able to take advantage of the ClipMask[], - * ClipOrMask and ClipAndMask information (under Linux); - * - rewritten the setup_fx_units() function, now the texture - * mapping support is compliant to the OpenGL specs (GL_BLEND - * support is still missing). The LinuxGLQuake console correctly - * fade in/out and transparent water of GLQuake2test works fine - * - written the support for the env. var. FX_GLIDE_SWAPINTERVAL - * - found a bug in the Mesa core. There is a roundup problem for - * color values out of the [0.0,1.0] range - * - * Wonko - * - fixed a Voodoo Rush related problem in the fxwgl.c - * - * Daryll Strauss - * - written the scissor test support - * - * V0.20 - David Bucciarelli (tech.hmw@plus.it) Humanware s.r.l. - * - written the closetmmanger() function in order to free all the memory - * allocated by the Texture Memory Manager (it will be useful - * when the support for multiple contexts/boards will be ready) - * - now the Voodoo driver runs without printing any information, - * define the env. var. MESA_FX_INFO if you want to read some - * information about the hardware and some statistic - * - written a small workaround for the "GLQuake multiplayer white box bug" - * in the setup_fx_units() funxtions. I'm already rewriting - * this function because it is the source of nearly all the current - * Voodoo driver problems - * - fixed the GLQuake texture misalignment problem (the texture - * coordinates must be scaled between 0.0 and 256.0 and not - * between 0.0 and 255.0) - * - written the support for the GL_EXT_shared_texture_palette - * - some small change for supporting the automatic building of the - * OpenGL32.dll under the Windows platform - * - the redefinition of a mipmap level is now a LOT faster. This path - * is used by GLQuake for dynamic lighting with some call to glTexSubImage2D() - * - the texture memory is now managed a set of 2MB blocks so - * texture maps can't be allocated on a 2MB boundary. The new Pure3D - * needs this kind of support (and probably any other Voodoo Graphics - * board with more than 2MB of texture memory) - * - * Brian Paul (brianp@elastic.avid.com) Avid Technology - * - added write_monocolor_span(), fixed bug in write_color_span() - * - added test for stenciling in choosepoint/line/triangle functions - * - * Joe Waters (falc@attila.aegistech.com) Aegis - * - written the support for the env. var. SST_SCREENREFRESH - * - * V0.19 - David Bucciarelli (tech.hmw@plus.it) Humanware s.r.l. - * - written the 3Dfx Global Palette extension for GLQuake - * - written the support for the GL_EXT_paletted_texture (it works only with GL_RGBA - * palettes and the alpha value is ignored ... this is a limitation of the - * the current Glide version and Voodoo hardware) - * - fixed the amount of memory allocated for 8bit textures - * - merged the under construction v0.19 driver with the Mesa 2.5 - * - finally written the support for deleting textures - * - introduced a new powerful texture memory manager: the texture memory - * is used as a cache of the set of all defined texture maps. You can - * now define several MB of texture maps also with a 2MB of texture memory - * (the texture memory manager will do automatically all the swap out/swap in - * work). The new texture memory manager has also - * solved a lot of other bugs/no specs compliance/problems - * related to the texture memory usage. The texture - * manager code is inside the new fxmesa3.c file - * - broken the fxmesa.c file in two files (fxmesa1.c and fxmesa2.c) - * and done some code cleanup - * - now is possible to redefine texture mipmap levels already defined - * - fixed a problem with the amount of texture memory allocated for textures - * with not all mipmap levels defined - * - fixed a small problem with single buffer rendering - * - * Brian Paul (brianp@elastic.avid.com) Avid Technology - * - read/write_color_span() now use front/back buffer correctly - * - create GLvisual with 5,6,5 bits per pixel, not 8,8,8 - * - removed a few ^M characters from fxmesa2.c file - * - * V0.18 - David Bucciarelli (tech.hmw@plus.it) Humanware s.r.l. - * - the Mesa-2.4beta3 is finally using the driver quads support (the - * previous Mesa versions have never taken any advantage from the quads support !) - * - tested with the Glide 2.4 for Win - * - ported all asm code to Linux - * - ported the v0.18 to Linux (without asm code) - * - back to Linux !!! - * - optimized the SETUP macro (no more vertex snap for points and lines) - * - optimized the SETUP macro (added one argument) - * - the Mesa/Voodoo is now 20/30% for points, lines and small triangles ! - * - performance improvement setting VBSIZE to 72 - * - the GrVertex texture code is now written in asm - * - the GrVertex zbuffer code is now written in asm - * - the GrVertex wbuffer code is now written in asm - * - the GrVertex gouraud code is now written in asm - * - the GrVertex snap code is now written in asm - * - changed the 8bit compressed texture maps in 8bit palette texture maps - * support (it has the some advantage of compressed texture maps without the - * problem of a fixed NCC table for all mipmap levels) - * - written the support for 8bit compressed texture maps (but texture maps with - * more than one mipmap level aren't working fine) - * - finnaly everthing is working fine in MesaQuake ! - * - fixed a bug in the computation of texture mapping coordinates (I have found - * the bug thanks to MesaQuake !) - * - written the GL_REPLACE support (mainly for MesaQuake) - * - written the support for textures with not all mipmap levels defined - * - rewritten all the Texture memory stuff - * - written the MesaQuake support (define MESAQUAKE) - * - working with a ZBuffer if glOrtho or not int the default glDepthRange, - * otherwise working with the WBuffer - * written the glDepthRange support - * - * Diego Picciani (d.picciani@novacomp.it) Nova Computer s.r.l. - * - written the fxCloseHardware() and the fxQuaryHardware() (mainly - * for the VoodooWGL emulator) - * - * Brian Paul (brianp@elastic.avid.com) Avid Technology - * - implemented read/write_color_span() so glRead/DrawPixels() works - * - now needs Glide 2.3 or later. Removed GLIDE_FULL_SCREEN and call to grSstOpen() - * - * V0.17 - David Bucciarelli (tech.hmw@plus.it) Humanware s.r.l. - * - optimized the bitmap support (66% faster) - * - tested with the Mesa 2.3beta2 - * - * Diego Picciani (d.picciani@novacomp.it) Nova Computer s.r.l. - * - solved a problem with the drawbitmap() and the Voodoo Rush - * (GR_ORIGIN_LOWER_LEFT did not work with the Stingray) - * - * Brian Paul (brianp@elastic.avid.com) Avid Technology - * - linux stuff - * - general code clean-up - * - added attribList parameter to fxMesaCreateContext() - * - single buffering works now - * - VB colors are now GLubytes, removed ColorShift stuff - * - * Paul Metzger - * - linux stuff - * - * V0.16 - David Bucciarelli (tech.hmw@plus.it) Humanware s.r.l. - * - written the quadfunc support (no performance improvement) - * - written the support for the new Mesa 2.3beta1 driver interface (Wow ! It is faaaster) - * - rewritten the glBitmap support for the Glide 2.3 (~35% slower !) - * - written the glBitmap support for the most common case (fonts) - * - * Jack Palevich - * - Glide 2.3 porting - * - * Diego Picciani (d.picciani@novacomp.it) Nova Computer s.r.l. - * - extended the fxMesaCreateContext() and fxMesaCreateBestContext() - * functions in order to support also the Voodoo Rush - * - tested with the Hercules Stingray 128/3D (The rendering in a window works !) - * - * V0.15 - David Bucciarelli (tech.hmw@plus.it) Humanware s.r.l. - * - written the GL_LUMINANCE_ALPHA support - * - written the GL_ALPHA support - * - written the GL_LUMINANCE support - * - now SETUP correctly set color for mono color sequences - * - written the 9x1,10x1,...,1x9,1x10,... texture map ratio support - * - written the no square texture map support - * - the fog table is no more rebuilt inside setup_fx_units() each time - * - * Henri Fousse (arnaud@pobox.oleane.com) Thomson Training & Simulation - * - written (not yet finished: no texture mapping) support for glOrtho - * - some change to setup functions - * - the fog support is now fully compatible with the standard OpenGL - * - rewritten several parts of the driver in order to take - * advantage of meshes (40% faster !!!) - * - * V0.14 - David Bucciarelli (tech.hmw@plus.it) Humanware s.r.l. - * - now glAlphaFunc() works - * - now glDepthMask() works - * - solved a mipmap problem when using more than one texture - * - moved ti, texid and wscale inside the fxMesaContext (now we can - * easy support more ctx and more boards) - * - the management of the fxMesaContext was completly broken ! - * - solved several problems about Alpha and texture Alpha - * - 4 (RGBA) texture channels supported - * - setting the default color to white - * - * Henri Fousse (arnaud@pobox.oleane.com) Thomson Training & Simulation - * - small change to fxMesaCreateContext() and fxMesaMakeCurrent() - * - written the fog support - * - setting the default clear color to black - * - written cleangraphics() for the onexit() function - * - written fxMesaCreateBestContext() - * - * V0.13 - David Bucciarelli (tech.hmw@plus.it) Humanware s.r.l. - * - now glBlendFunc() works for all glBlendFunc without DST_ALPHA - * (because the alpha buffer is not yet implemented) - * - now fxMesaCreateContext() accept resolution and refresh rate - * - fixed a bug for texture mapping: the w (alias z) must be set - * also without depth buffer - * - fixed a bug for texture image with width!=256 - * - written texparam() - * - written all point, line and triangle functions for all possible supported - * contexts and the driver is slight faster with points, lines and small triangles - * - fixed a small bug in fx/fxmesa.h (glOrtho) - * - * V0.12 - David Bucciarelli (tech.hmw@plus.it) Humanware s.r.l. - * - glDepthFunc supported - * - introduced a trick to discover the far plane distance - * (see fxMesaSetFar and fx/fxmesa.h) - * - now the wbuffer works with homogeneous coordinate (and it - * doesn't work with a glOrtho projection :) - * - solved several problems with homogeneous coordinate and texture mapping - * - fixed a bug in all line functions - * - fixed a clear framebuffer bug - * - solved a display list/teximg problem (but use - * glBindTexture: it is several times faster) - * - * V0.11 - David Bucciarelli (tech.hmw@plus.it) Humanware s.r.l. - * - introduced texture mapping support (not yet finished !) - * - tested with Mesa2.2b6 - * - the driver is faster - * - written glFlush/glFinish - * - the driver print a lot of info about the Glide lib - * - * v0.1 - David Bucciarelli (tech.hmw@plus.it) Humanware s.r.l. - * - Initial revision - * - */ - - -#ifdef HAVE_CONFIG_H -#include "conf.h" -#endif - -#if defined(FX) -#include "fxdrv.h" - -static fxMesaContext fxMesaCurrentCtx=NULL; - -/* - * Status of 3Dfx hardware initialization - */ - -static int glbGlideInitialized=0; -static int glb3DfxPresent=0; -static int glbTotNumCtx=0; - -GrHwConfiguration glbHWConfig; -int glbCurrentBoard=0; - - -#if defined(__WIN32__) -static int cleangraphics(void) -{ - glbTotNumCtx=1; - fxMesaDestroyContext(fxMesaCurrentCtx); - - return 0; -} -#elif defined(__linux__) -static void cleangraphics(void) -{ - glbTotNumCtx=1; - fxMesaDestroyContext(fxMesaCurrentCtx); -} - -static void cleangraphics_handler(int s) -{ - fprintf(stderr,"fxmesa: Received a not handled signal %d\n",s); - - cleangraphics(); -/* abort(); */ - exit(1); -} -#endif - - -/* - * Select the Voodoo board to use when creating - * a new context. - */ -GLboolean GLAPIENTRY fxMesaSelectCurrentBoard(int n) -{ - fxQueryHardware(); - - if((n<0) || (n>=glbHWConfig.num_sst)) - return GL_FALSE; - - glbCurrentBoard=n; - - return GL_TRUE; -} - - -fxMesaContext GLAPIENTRY fxMesaGetCurrentContext(void) -{ - return fxMesaCurrentCtx; -} - - -void GLAPIENTRY fxMesaSetNearFar(GLfloat n, GLfloat f) -{ - if(fxMesaCurrentCtx) - fxDDSetNearFar(fxMesaCurrentCtx->glCtx,n,f); -} - - -/* - * The 3Dfx Global Palette extension for GLQuake. - * More a trick than a real extesion, use the shared global - * palette extension. - */ -extern void GLAPIENTRY gl3DfxSetPaletteEXT(GLuint *pal); /* silence warning */ -void GLAPIENTRY gl3DfxSetPaletteEXT(GLuint *pal) -{ - fxMesaContext fxMesa =fxMesaCurrentCtx; - - if (MESA_VERBOSE&VERBOSE_DRIVER) { - int i; - - fprintf(stderr,"fxmesa: gl3DfxSetPaletteEXT()\n"); - - for(i=0;i<256;i++) - fprintf(stderr,"%x\n",pal[i]); - } - - if(fxMesa) { - fxMesa->haveGlobalPaletteTexture=1; - - FX_grTexDownloadTable(GR_TMU0,GR_TEXTABLE_PALETTE,(GuTexPalette *)pal); - if (fxMesa->haveTwoTMUs) - FX_grTexDownloadTable(GR_TMU1,GR_TEXTABLE_PALETTE,(GuTexPalette *)pal); - } -} - - -static GrScreenResolution_t fxBestResolution(int width, int height, int aux) -{ - static int resolutions[][5]={ - { 512, 384, GR_RESOLUTION_512x384, 2, 2 }, - { 640, 400, GR_RESOLUTION_640x400, 2, 2 }, - { 640, 480, GR_RESOLUTION_640x480, 2, 2 }, - { 800, 600, GR_RESOLUTION_800x600, 4, 2 }, - { 960, 720, GR_RESOLUTION_960x720, 6, 4 } -#ifdef GR_RESOLUTION_1024x768 - ,{ 1024, 768, GR_RESOLUTION_1024x768, 8, 4 } -#endif -#ifdef GR_RESOLUTION_1280x1024 - ,{ 1024, 768, GR_RESOLUTION_1280x1024, 8, 8 } -#endif -#ifdef GR_RESOLUTION_1600x1200 - ,{ 1024, 768, GR_RESOLUTION_1600x1200, 16, 8 } -#endif - }; - int NUM_RESOLUTIONS = sizeof(resolutions) / (sizeof(int)*5); - int i,fbmem; - GrScreenResolution_t lastvalidres=resolutions[1][2]; - - fxQueryHardware(); - - if(glbHWConfig.SSTs[glbCurrentBoard].type==GR_SSTTYPE_VOODOO) { - fbmem=glbHWConfig.SSTs[glbCurrentBoard].sstBoard.VoodooConfig.fbRam; - - if(glbHWConfig.SSTs[glbCurrentBoard].sstBoard.VoodooConfig.sliDetect) - fbmem*=2; - } else if(glbHWConfig.SSTs[glbCurrentBoard].type==GR_SSTTYPE_SST96) - fbmem=glbHWConfig.SSTs[glbCurrentBoard].sstBoard.SST96Config.fbRam; - else - fbmem=2; - - /* A work around for BZFlag */ - - if((width==1) && (height==1)) { - width=640; - height=480; - } - - for(i=0;i0) { - aux=1; - break; - } - } - - res=fxBestResolution(width,height,aux); - - return fxMesaCreateContext(win,res,refresh,attribList); -} - - -#if 0 -void fxsignals() -{ - signal(SIGINT,SIG_IGN); - signal(SIGHUP,SIG_IGN); - signal(SIGPIPE,SIG_IGN); - signal(SIGFPE,SIG_IGN); - signal(SIGBUS,SIG_IGN); - signal(SIGILL,SIG_IGN); - signal(SIGSEGV,SIG_IGN); - signal(SIGTERM,SIG_IGN); -} -#endif - -/* - * Create a new FX/Mesa context and return a handle to it. - */ -fxMesaContext GLAPIENTRY fxMesaCreateContext(GLuint win, - GrScreenResolution_t res, - GrScreenRefresh_t ref, - const GLint attribList[]) -{ - fxMesaContext fxMesa = NULL; - int i,type; - int aux; - GLboolean doubleBuffer=GL_FALSE; - GLboolean alphaBuffer=GL_FALSE; - GLboolean verbose=GL_FALSE; - GLint depthSize=0; - GLint stencilSize=0; - GLint accumSize=0; - GLcontext *shareCtx = NULL; - GLcontext *ctx = 0; - /*FX_GrContext_t glideContext = 0;*/ - char *errorstr; - GLboolean useBGR; - char *system = NULL; - - if (MESA_VERBOSE&VERBOSE_DRIVER) { - fprintf(stderr,"fxmesa: fxMesaCreateContext() Start\n"); - } - - if(getenv("MESA_FX_INFO")) - verbose=GL_TRUE; - - aux=0; - i=0; - while(attribList[i]!=FXMESA_NONE) { - switch (attribList[i]) { - case FXMESA_DOUBLEBUFFER: - doubleBuffer=GL_TRUE; - break; - case FXMESA_ALPHA_SIZE: - i++; - alphaBuffer=attribList[i]>0; - if(alphaBuffer) - aux=1; - break; - case FXMESA_DEPTH_SIZE: - i++; - depthSize=attribList[i]; - if(depthSize) { - aux=1; - depthSize = 16; - } - break; - case FXMESA_STENCIL_SIZE: - i++; - stencilSize=attribList[i]; - break; - case FXMESA_ACCUM_SIZE: - i++; - accumSize=attribList[i]; - break; - /* XXX ugly hack here for sharing display lists */ -#define FXMESA_SHARE_CONTEXT 990099 /* keep in sync with xmesa1.c! */ - case FXMESA_SHARE_CONTEXT: - i++; - { - const void *vPtr = &attribList[i]; - GLcontext **ctx = (GLcontext **) vPtr; - shareCtx = *ctx; - } - break; - default: - if (MESA_VERBOSE&VERBOSE_DRIVER) { - fprintf(stderr,"fxmesa: fxMesaCreateContext() End (defualt)\n"); - } - return NULL; - } - i++; - } - - /* A workaround for Linux GLQuake */ - if(depthSize && alphaBuffer) - alphaBuffer=0; - - if ((type=fxQueryHardware()) < 0) { - fprintf(stderr,"fx Driver: ERROR no Voodoo1/2 Graphics or Voodoo Rush !\n"); - return NULL; - } - - if(type==GR_SSTTYPE_VOODOO) - win=0; - - grSstSelect(glbCurrentBoard); - - fxMesa=(fxMesaContext)calloc(1,sizeof(struct tfxMesaContext)); - if(!fxMesa) { - errorstr = "malloc"; - goto errorhandler; - } - - if(glbHWConfig.SSTs[glbCurrentBoard].type==GR_SSTTYPE_VOODOO) - fxMesa->haveTwoTMUs=(glbHWConfig.SSTs[glbCurrentBoard].sstBoard.VoodooConfig.nTexelfx > 1); - else if(glbHWConfig.SSTs[glbCurrentBoard].type==GR_SSTTYPE_SST96) - fxMesa->haveTwoTMUs=(glbHWConfig.SSTs[glbCurrentBoard].sstBoard.SST96Config.nTexelfx > 1); - else - fxMesa->haveTwoTMUs=GL_FALSE; - - fxMesa->haveAlphaBuffer=alphaBuffer; - fxMesa->haveGlobalPaletteTexture=GL_FALSE; - fxMesa->verbose=verbose; - fxMesa->board=glbCurrentBoard; - - - fxMesa->glideContext = FX_grSstWinOpen((FxU32)win,res,ref, -#if FXMESA_USE_ARGB - GR_COLORFORMAT_ARGB, -#else - GR_COLORFORMAT_ABGR, -#endif - GR_ORIGIN_LOWER_LEFT, - 2,aux); - if (!fxMesa->glideContext){ - errorstr = "grSstWinOpen"; - goto errorhandler; - } - - /* - * Pixel tables are use during pixel read-back - * Either initialize them for RGB or BGR order. - */ -#if FXMESA_USE_ARGB - useBGR = GL_FALSE; /* Force RGB pixel order */ - system = "FXMESA_USE_ARGB"; -#else - if (glbHWConfig.SSTs[glbCurrentBoard].type == GR_SSTTYPE_VOODOO) { - /* jk991130 - Voodoo 3s don't use BGR. Query the # of TMUs - * as Voodoo3s have 2 TMUs on board, Banshee has only 1 - * bk000413 - another suggestion from Joseph Kain is using - * VendorID 0x121a for all 3dfx boards - * DeviceID VG 1/V2 2/VB 3/V3 5 - * For now we cehck for known BGR devices, and presume - * everything else to be a V3/RGB. - */ - GrVoodooConfig_t *voodoo; - voodoo = &glbHWConfig.SSTs[glbCurrentBoard].sstBoard.VoodooConfig; - - if (voodoo->nTexelfx == 1) { - /* Voodoo1 or Banshee */ - useBGR = GL_TRUE; - system = "Voodoo1"; - } - else if (voodoo->nTexelfx == 2 && - voodoo->fbiRev == 260 && - voodoo->tmuConfig[0].tmuRev == 4 && - (voodoo->tmuConfig[0].tmuRam == 2 || - voodoo->tmuConfig[0].tmuRam == 4)) { - /* Voodoo 2 */ - useBGR = GL_TRUE; - system = "Voodoo2"; - } - else if (voodoo->nTexelfx == 2 && - voodoo->fbiRev == 2 && - voodoo->tmuConfig[0].tmuRev == 1 && - voodoo->tmuConfig[0].tmuRam == 4) { - /* Quantum3D Obsidian 50/100 */ - useBGR = GL_TRUE; - system = "Quantum3D Obsidian"; - } - else - /* Brian - * (voodoo->nTexelfx == 2 && - * voodoo->fbiRev == 0 && - * voodoo->tmuConfig[0].tmuRev == 148441048 && - * voodoo->tmuConfig[0].tmuRam == 3) - * Bernd - * (voodoo->nTexelfx == 2 && - * voodoo->fbiRev == 69634 && - * voodoo->tmuConfig[0].tmuRev == 69634 && - * voodoo->tmuConfig[0].tmuRam == 2 ) - */ - { - /* Presumed Voodoo3 */ - useBGR = GL_FALSE; - system = "Voodoo3"; - } - if (getenv("MESA_FX_INFO")) { - printf("Voodoo: Texelfx: %d / FBI Rev.: %d / TMU Rev.: %d / TMU RAM: %d\n", - voodoo->nTexelfx, - voodoo->fbiRev, - voodoo->tmuConfig[0].tmuRev, - voodoo->tmuConfig[0].tmuRam ); - } - } - else { - useBGR = GL_FALSE; /* use RGB pixel order otherwise */ - system = "non-voodoo"; - } -#endif /*FXMESA_USE_ARGB*/ - - if (getenv("MESA_FX_INFO")) - printf("Voodoo pixel order: %s (%s)\n", useBGR ? "BGR" : "RGB", system); - - fxInitPixelTables(fxMesa, useBGR); - - fxMesa->width=FX_grSstScreenWidth(); - fxMesa->height=FX_grSstScreenHeight(); - - fxMesa->clipMinX = 0; - fxMesa->clipMaxX = fxMesa->width; - fxMesa->clipMinY = 0; - fxMesa->clipMaxY = fxMesa->height; - - fxMesa->screen_width = fxMesa->width; - fxMesa->screen_height = fxMesa->height; - fxMesa->x_offset = 0; - fxMesa->y_offset = 0; - fxMesa->y_delta = 0; - - fxMesa->needClip = 0; - - if(verbose) - fprintf(stderr,"Voodoo Glide screen size: %dx%d\n", - (int)FX_grSstScreenWidth(),(int)FX_grSstScreenHeight()); - - fxMesa->glVis=gl_create_visual(GL_TRUE, /* RGB mode */ - alphaBuffer, - doubleBuffer, - GL_FALSE, /* stereo */ - depthSize, /* depth_size */ - stencilSize, /* stencil_size */ - accumSize, /* accum_size */ - 0, /* index bits */ - 5,6,5,0); /* RGBA bits */ - if (!fxMesa->glVis) { - errorstr = "gl_create_visual"; - goto errorhandler; - } - - ctx = fxMesa->glCtx=gl_create_context(fxMesa->glVis, - shareCtx, /* share list context */ - (void *) fxMesa, GL_TRUE); - if (!ctx) { - errorstr = "gl_create_context"; - goto errorhandler; - } - - - if (!fxDDInitFxMesaContext( fxMesa )) { - errorstr = "fxDDInitFxMesaContext failed"; - goto errorhandler; - } - - - fxMesa->glBuffer=gl_create_framebuffer(fxMesa->glVis, - GL_FALSE, /* no software depth */ - fxMesa->glVis->StencilBits > 0, - fxMesa->glVis->AccumRedBits > 0, - fxMesa->glVis->AlphaBits > 0 ); - if (!fxMesa->glBuffer) { - errorstr = "gl_create_framebuffer"; - goto errorhandler; - } - - glbTotNumCtx++; - - /* install signal handlers */ -#if defined(__linux__) - /* Only install if environment var. is not set. */ - if (fxMesa->glCtx->CatchSignals && !getenv("MESA_FX_NO_SIGNALS")) { - signal(SIGINT,cleangraphics_handler); - signal(SIGHUP,cleangraphics_handler); - signal(SIGPIPE,cleangraphics_handler); - signal(SIGFPE,cleangraphics_handler); - signal(SIGBUS,cleangraphics_handler); - signal(SIGILL,cleangraphics_handler); - signal(SIGSEGV,cleangraphics_handler); - signal(SIGTERM,cleangraphics_handler); - } -#endif - - if (MESA_VERBOSE&VERBOSE_DRIVER) { - fprintf(stderr,"fxmesa: fxMesaCreateContext() End\n"); - } - - return fxMesa; - - errorhandler: - if (fxMesa) { - if (fxMesa->glideContext) - FX_grSstWinClose(fxMesa->glideContext); - fxMesa->glideContext = 0; - - if (fxMesa->state) - free(fxMesa->state); - if (fxMesa->fogTable) - free(fxMesa->fogTable); - if (fxMesa->glBuffer) - gl_destroy_framebuffer(fxMesa->glBuffer); - if (fxMesa->glVis) - gl_destroy_visual(fxMesa->glVis); - if (fxMesa->glCtx) - gl_destroy_context(fxMesa->glCtx); - free(fxMesa); - } - - if (MESA_VERBOSE&VERBOSE_DRIVER) { - fprintf(stderr,"fxmesa: fxMesaCreateContext() End (%s)\n",errorstr); - } - return NULL; -} - - -/* - * Function to set the new window size in the context (mainly for the Voodoo Rush) - */ -void GLAPIENTRY fxMesaUpdateScreenSize(fxMesaContext fxMesa) -{ - fxMesa->width=FX_grSstScreenWidth(); - fxMesa->height=FX_grSstScreenHeight(); -} - - -/* - * Destroy the given FX/Mesa context. - */ -void GLAPIENTRY fxMesaDestroyContext(fxMesaContext fxMesa) -{ - if (MESA_VERBOSE&VERBOSE_DRIVER) { - fprintf(stderr,"fxmesa: fxMesaDestroyContext()\n"); - } - - if(fxMesa) { - gl_destroy_visual(fxMesa->glVis); - gl_destroy_context(fxMesa->glCtx); - gl_destroy_framebuffer(fxMesa->glBuffer); - - glbTotNumCtx--; - - fxCloseHardware(); - FX_grSstWinClose(fxMesa->glideContext); - - if(fxMesa->verbose) { - fprintf(stderr,"Misc Stats:\n"); - fprintf(stderr," # swap buffer: %u\n",fxMesa->stats.swapBuffer); - - if(!fxMesa->stats.swapBuffer) - fxMesa->stats.swapBuffer=1; - - fprintf(stderr,"Textures Stats:\n"); - fprintf(stderr," Free texture memory on TMU0: %d:\n",fxMesa->freeTexMem[FX_TMU0]); - if(fxMesa->haveTwoTMUs) - fprintf(stderr," Free texture memory on TMU1: %d:\n",fxMesa->freeTexMem[FX_TMU1]); - fprintf(stderr," # request to TMM to upload a texture objects: %u\n", - fxMesa->stats.reqTexUpload); - fprintf(stderr," # request to TMM to upload a texture objects per swapbuffer: %.2f\n", - fxMesa->stats.reqTexUpload/(float)fxMesa->stats.swapBuffer); - fprintf(stderr," # texture objects uploaded: %u\n", - fxMesa->stats.texUpload); - fprintf(stderr," # texture objects uploaded per swapbuffer: %.2f\n", - fxMesa->stats.texUpload/(float)fxMesa->stats.swapBuffer); - fprintf(stderr," # MBs uploaded to texture memory: %.2f\n", - fxMesa->stats.memTexUpload/(float)(1<<20)); - fprintf(stderr," # MBs uploaded to texture memory per swapbuffer: %.2f\n", - (fxMesa->stats.memTexUpload/(float)fxMesa->stats.swapBuffer)/(float)(1<<20)); - } - if (fxMesa->state) - free(fxMesa->state); - if (fxMesa->fogTable) - free(fxMesa->fogTable); - fxTMClose(fxMesa); - - free(fxMesa); - } - - if(fxMesa==fxMesaCurrentCtx) - fxMesaCurrentCtx=NULL; -} - - -/* - * Make the specified FX/Mesa context the current one. - */ -void GLAPIENTRY fxMesaMakeCurrent(fxMesaContext fxMesa) -{ - if (MESA_VERBOSE&VERBOSE_DRIVER) { - fprintf(stderr,"fxmesa: fxMesaMakeCurrent(...) Start\n"); - } - - if(!fxMesa) { - gl_make_current(NULL,NULL); - fxMesaCurrentCtx=NULL; - - if (MESA_VERBOSE&VERBOSE_DRIVER) { - fprintf(stderr,"fxmesa: fxMesaMakeCurrent(NULL) End\n"); - } - - return; - } - - /* if this context is already the current one, we can return early */ - if (fxMesaCurrentCtx == fxMesa - && fxMesaCurrentCtx->glCtx == gl_get_current_context()) { - if (MESA_VERBOSE&VERBOSE_DRIVER) { - fprintf(stderr,"fxmesa: fxMesaMakeCurrent(fxMesaCurrentCtx==fxMesa) End\n"); - } - - return; - } - - if(fxMesaCurrentCtx) - grGlideGetState((GrState*)fxMesaCurrentCtx->state); - - fxMesaCurrentCtx=fxMesa; - - grSstSelect(fxMesa->board); - grGlideSetState((GrState*)fxMesa->state); - - gl_make_current(fxMesa->glCtx,fxMesa->glBuffer); - - fxSetupDDPointers(fxMesa->glCtx); - - /* The first time we call MakeCurrent we set the initial viewport size */ - if(fxMesa->glCtx->Viewport.Width==0) - gl_Viewport(fxMesa->glCtx,0,0,fxMesa->width,fxMesa->height); - - if (MESA_VERBOSE&VERBOSE_DRIVER) { - fprintf(stderr,"fxmesa: fxMesaMakeCurrent(...) End\n"); - } -} - - -#if 0 -static void QueryCounters(void) -{ - static GLuint prevPassed = 0; - static GLuint prevFailed = 0; - GLuint failed, passed; - GrSstPerfStats_t st; - - FX_grSstPerfStats(&st); - failed = st.zFuncFail - st.aFuncFail - st.chromaFail; - passed = st.pixelsIn - failed; - printf("failed: %d passed: %d\n", failed - prevFailed, passed - prevPassed); - - prevPassed = passed; - prevFailed = failed; -} -#endif - - -/* - * Swap front/back buffers for current context if double buffered. - */ -void GLAPIENTRY fxMesaSwapBuffers(void) -{ - if (MESA_VERBOSE&VERBOSE_DRIVER) { - fprintf(stderr,"fxmesa: ------------------------------- fxMesaSwapBuffers() -------------------------------\n"); - } - - if(fxMesaCurrentCtx) { - FLUSH_VB( fxMesaCurrentCtx->glCtx, "swap buffers" ); - - if (fxMesaCurrentCtx->glVis->DBflag) { - - grBufferSwap(fxMesaCurrentCtx->swapInterval); - - /* - * Don't allow swap buffer commands to build up! - */ - while(FX_grGetInteger(FX_PENDING_BUFFERSWAPS)>fxMesaCurrentCtx->maxPendingSwapBuffers) - /* The driver is able to sleep when waiting for the completation - of multiple swapbuffer operations instead of wasting - CPU time (NOTE: you must uncomment the following line in the - in order to enable this option) */ - /* usleep(10000); */ - ; - - fxMesaCurrentCtx->stats.swapBuffer++; - } - } -} - - -/* - * Query 3Dfx hardware presence/kind - */ -int GLAPIENTRY fxQueryHardware(void) -{ - if (MESA_VERBOSE&VERBOSE_DRIVER) { - fprintf(stderr,"fxmesa: fxQueryHardware() Start\n"); - } - - if (!glbGlideInitialized) { - grGlideInit(); - if (FX_grSstQueryHardware(&glbHWConfig)) { - grSstSelect(glbCurrentBoard); - glb3DfxPresent = 1; - - if (getenv("MESA_FX_INFO")) { - char buf[80]; - - FX_grGlideGetVersion(buf); - fprintf(stderr, "Voodoo Using Glide V%s\n", buf); - fprintf(stderr, "Voodoo Number of boards: %d\n", glbHWConfig.num_sst); - - if (glbHWConfig.SSTs[glbCurrentBoard].type == GR_SSTTYPE_VOODOO) { - GrVoodooConfig_t *voodoo; - voodoo = &glbHWConfig.SSTs[glbCurrentBoard].sstBoard.VoodooConfig; - - fprintf(stderr, "Voodoo Framebuffer RAM: %d\n", - voodoo->sliDetect ? (voodoo->fbRam*2) : voodoo->fbRam); - fprintf(stderr, "Voodoo Number of TMUs: %d\n", voodoo->nTexelfx); - fprintf(stderr, "Voodoo fbRam: %d\n", voodoo->fbRam); - fprintf(stderr, "Voodoo fbiRev: %d\n", voodoo->fbiRev); - - fprintf(stderr,"Voodoo SLI detected: %d\n", voodoo->sliDetect); - } - else if (glbHWConfig.SSTs[glbCurrentBoard].type == GR_SSTTYPE_SST96) { - GrSst96Config_t *sst96; - sst96 = &glbHWConfig.SSTs[glbCurrentBoard].sstBoard.SST96Config; - fprintf(stderr, "Voodoo Framebuffer RAM: %d\n", sst96->fbRam); - fprintf(stderr, "Voodoo Number of TMUs: %d\n", sst96->nTexelfx); - } - - } - } - else { - glb3DfxPresent = 0; - } - - glbGlideInitialized = 1; - -#if defined(__WIN32__) - onexit((_onexit_t)cleangraphics); -#elif defined(__linux__) - /* Only register handler if environment variable is not defined. */ - if (!getenv("MESA_FX_NO_SIGNALS")) { - atexit(cleangraphics); - } -#endif - } - - if (MESA_VERBOSE&VERBOSE_DRIVER) { - fprintf(stderr,"fxmesa: fxQueryHardware() End (voodooo)\n"); - } - - return glbHWConfig.SSTs[glbCurrentBoard].type; -} - - -/* - * Shutdown Glide library - */ -void GLAPIENTRY fxCloseHardware(void) -{ - if (glbGlideInitialized) { - if (getenv("MESA_FX_INFO")) { - GrSstPerfStats_t st; - - FX_grSstPerfStats(&st); - fprintf(stderr,"Pixels Stats:\n"); - fprintf(stderr," # pixels processed (minus buffer clears): %u\n",(unsigned)st.pixelsIn); - fprintf(stderr," # pixels not drawn due to chroma key test failure: %u\n",(unsigned)st.chromaFail); - fprintf(stderr," # pixels not drawn due to depth test failure: %u\n",(unsigned)st.zFuncFail); - fprintf(stderr," # pixels not drawn due to alpha test failure: %u\n",(unsigned)st.aFuncFail); - fprintf(stderr," # pixels drawn (including buffer clears and LFB writes): %u\n",(unsigned)st.pixelsOut); - } - - if (glbTotNumCtx == 0) { - grGlideShutdown(); - glbGlideInitialized = 0; - } - } -} - - -#else - - -/* - * Need this to provide at least one external definition. - */ -extern int gl_fx_dummy_function_api(void); -int gl_fx_dummy_function_api(void) -{ - return 0; -} - -#endif /* FX */ Index: xc/extras/Mesa/src/FX/fxclip.c diff -u xc/extras/Mesa/src/FX/fxclip.c:1.2 xc/extras/Mesa/src/FX/fxclip.c:removed --- xc/extras/Mesa/src/FX/fxclip.c:1.2 Tue Feb 15 02:13:04 2000 +++ xc/extras/Mesa/src/FX/fxclip.c Mon Dec 18 14:21:51 2000 @@ -1,554 +0,0 @@ -/* -*- mode: C; tab-width:8; c-basic-offset:2 -*- */ - -/* - * Mesa 3-D graphics library - * Version: 3.3 - * - * Copyright (C) 1999-2000 Brian Paul All Rights Reserved. - * - * 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 - * BRIAN PAUL 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. - * - * - * Original Mesa / 3Dfx device driver (C) 1999 David Bucciarelli, by the - * terms stated above. - * - * Thank you for your contribution, David! - * - * Please make note of the above copyright/license statement. If you - * contributed code or bug fixes to this code under the previous (GNU - * Library) license and object to the new license, your code will be - * removed at your request. Please see the Mesa docs/COPYRIGHT file - * for more information. - * - * Additional Mesa/3Dfx driver developers: - * Daryll Strauss - * Keith Whitwell - * - * See fxapi.h for more revision/author details. - */ - - -#ifdef HAVE_CONFIG_H -#include "conf.h" -#endif - -#if defined(FX) - -#include "fxdrv.h" -#include "mmath.h" -#include "macros.h" -#include "vector.h" -#include "types.h" - - -#if 0 && defined(__i386__) -#define NEGATIVE(f) ((*(int *)&f) < 0) -#define DIFFERENT_SIGNS(a,b) (((*(int *)&a)^(*(int *)&b)) < 0) -#else -#define NEGATIVE(f) (f < 0) -#define DIFFERENT_SIGNS(a,b) ((a*b) < 0) -#endif - -#define LINTERP( T, A, B ) ( (A) + (T) * ( (B) - (A) ) ) - - -#define CLIP(sgn,v) \ -do { \ - GLuint out = in ^ 1; \ - GLfloat **indata = inlist[in]; \ - GrVertex **inverts = vertlist[in]; \ - GrVertex **outverts = vertlist[out]; \ - GLfloat **outdata = inlist[in = out]; \ - GLfloat *J = indata[n-1]; \ - GLfloat dpJ = (sgn J[v]) + J[3]; \ - GLuint nr = n; \ - \ - for (i = n = 0 ; i < nr ; i++) { \ - GLfloat *I = indata[i]; \ - GLfloat dpI = (sgn I[v]) + I[3]; \ - \ - if (DIFFERENT_SIGNS(dpI, dpJ)) { \ - GLuint j; \ - GLfloat t = dpI / (dpI - dpJ); \ - outverts[n] = 0; \ - outdata[n++] = store; \ - store[3] = LINTERP(t, I[3], J[3]); \ - store[v] = - sgn store[3]; \ - if (v != 0) store[0] = LINTERP(t, I[0], J[0]); \ - if (v != 1) store[1] = LINTERP(t, I[1], J[1]); \ - if (v != 2) store[2] = LINTERP(t, I[2], J[2]); \ - store += 4; \ - for (j = 4 ; j < sz ; j+=4,store+=4) { \ - store[0] = LINTERP(t, I[j], J[j] ); \ - store[1] = LINTERP(t, I[j+1], J[j+1] ); \ - store[2] = LINTERP(t, I[j+2], J[j+2] ); \ - store[3] = LINTERP(t, I[j+3], J[j+3] ); \ - } \ - } \ - \ - if (!NEGATIVE(dpI)) { \ - outverts[n] = inverts[i]; \ - outdata[n++] = I; \ - } \ - \ - \ - J = I; \ - dpJ = dpI; \ - } \ - \ - if (n < 3) return 0; \ -} while (0) - - -/* Originally used this for the viewclip planes as well, as in - * CLIP(-1,0,0,1), which was just as fast, but tended to lead to - * cracks. I haven't figured out exactly why this is, but the above - * code only really differs in the way it sets store[v] to +- w. - */ -#define UCLIP(a,b,c,d) \ -do { \ - GLuint out = in ^ 1; \ - GLfloat **indata = inlist[in]; \ - GrVertex **inverts = vertlist[in]; \ - GrVertex **outverts = vertlist[out]; \ - GLfloat **outdata = inlist[in = out]; \ - GLfloat *J = indata[n-1]; \ - GLfloat dpJ = DOT4V(J,a,b,c,d); \ - GLuint nr = n; \ - \ - for (i = n = 0 ; i < nr ; i++) { \ - GLfloat *I = indata[i]; \ - GLfloat dpI = DOT4V(I,a,b,c,d); \ - \ - if (DIFFERENT_SIGNS(dpI, dpJ)) { \ - GLuint j; \ - GLfloat t = dpI / (dpI - dpJ); \ - outverts[n] = 0; \ - outdata[n++] = store; \ - for (j = 0 ; j < sz ; j+=4,store+=4) { \ - store[0] = LINTERP(t, I[j], J[j] ); \ - store[1] = LINTERP(t, I[j+1], J[j+1] ); \ - store[2] = LINTERP(t, I[j+2], J[j+2] ); \ - store[3] = LINTERP(t, I[j+3], J[j+3] ); \ - } \ - } \ - \ - if (!NEGATIVE(dpI)) { \ - outverts[n] = inverts[i]; \ - outdata[n++] = I; \ - } \ - \ - \ - J = I; \ - dpJ = dpI; \ - } \ - \ - if (n < 3) return 0; \ -} while (0) - - - -/* Data parameter is organized as 4 clip coordinates followed by an - * arbitary number (sz-4) of additional data. The three original - * vertices are packed together at the start, and there is room for at - * least VB_MAX_CLIPPED_VERTS vertices of the same size in this - * storage. - * - */ -static INLINE GLuint fx_clip_triangle( GLcontext *ctx, - GLfloat *inoutlist[], - GrVertex **verts, - GLuint sz, - GLuint mask ) -{ - GLuint n = 3; - GLfloat *store = inoutlist[n-1] + sz; - GLfloat *vlist[VB_MAX_CLIPPED_VERTS]; - GrVertex *verts2[VB_MAX_CLIPPED_VERTS]; - GLfloat **inlist[2]; - GrVertex **vertlist[2]; - GLuint in = 0; - GLuint i; - - inlist[0] = inoutlist; - inlist[1] = vlist; - - vertlist[0] = verts; - vertlist[1] = verts2; - - if (mask & CLIP_ALL_BITS) - { - if (mask & CLIP_RIGHT_BIT) - CLIP(-,0); - - if (mask & CLIP_LEFT_BIT) - CLIP(+,0); - - if (mask & CLIP_TOP_BIT) - CLIP(-,1); - - if (mask & CLIP_BOTTOM_BIT) - CLIP(+,1); - - if (mask & CLIP_FAR_BIT) - CLIP(-,2); - - if (mask & CLIP_NEAR_BIT) - CLIP(+,2); - } - - if (mask & CLIP_USER_BIT) { - GLuint bit; - GLfloat (*plane)[4] = &ctx->Transform.ClipUserPlane[0]; - for (bit = 0x100 ; bit < mask ; plane++, bit *= 2) { - if (mask & bit) { - GLfloat a = plane[0][0]; - GLfloat b = plane[0][1]; - GLfloat c = plane[0][2]; - GLfloat d = plane[0][3]; - UCLIP(a,b,c,d); - } - } - } - - if (inlist[in] != inoutlist) - for (i = 0 ; i < n ; i++) { - inoutlist[i] = inlist[in][i]; - verts[i] = verts2[i]; - } - - return n; -} - - - -static INLINE GLuint fx_view_clip_triangle( GLcontext *ctx, - GLfloat *inoutlist[], - GrVertex **verts, - GLuint sz, - GLubyte mask ) -{ - GLuint n = 3; - GLfloat *store = inoutlist[n-1] + sz; - GLfloat *vlist[VB_MAX_CLIPPED_VERTS]; - GrVertex *verts2[VB_MAX_CLIPPED_VERTS]; - GLfloat **inlist[2]; - GrVertex **vertlist[2]; - GLuint in = 0; - GLuint i; - - inlist[0] = inoutlist; - inlist[1] = vlist; - - vertlist[0] = verts; - vertlist[1] = verts2; - - if (mask & CLIP_RIGHT_BIT) - CLIP(-,0); - - if (mask & CLIP_LEFT_BIT) - CLIP(+,0); - - if (mask & CLIP_TOP_BIT) - CLIP(-,1); - - if (mask & CLIP_BOTTOM_BIT) - CLIP(+,1); - - if (mask & CLIP_FAR_BIT) - CLIP(-,2); - - if (mask & CLIP_NEAR_BIT) - CLIP(+,2); - - if (inlist[in] != inoutlist) - for (i = 0 ; i < n ; i++) { - inoutlist[i] = inlist[in][i]; - verts[i] = verts2[i]; - } - - return n; -} - - - -#undef CLIP - -#define CLIP(x,y,z,w) \ -do { \ - GLfloat dpI = DOT4V(I,x,y,z,w); \ - GLfloat dpJ = DOT4V(J,x,y,z,w); \ - \ - if (DIFFERENT_SIGNS(dpI, dpJ)) { \ - GLuint j; \ - GLfloat t = dpI / (dpI - dpJ); \ - GLfloat *tmp = store; \ - \ - for (j = 0 ; j < sz ; j+=2) { \ - *store++ = LINTERP(t, I[j], J[j] ); \ - *store++ = LINTERP(t, I[j+1], J[j+1] ); \ - } \ - \ - if (NEGATIVE(dpI)) \ - I = tmp; \ - else \ - J = tmp; \ - \ - } \ - else if (NEGATIVE(dpI)) \ - return 0; \ - \ -} while (0) - - -static GLuint fx_clip_line( GLcontext *ctx, - GLfloat *inoutlist[], - GLuint sz, - GLubyte clipor ) -{ - GLfloat *I = inoutlist[0]; - GLfloat *J = inoutlist[1]; - GLfloat *store = J + sz; - - if (clipor & CLIP_ALL_BITS) - { - if (clipor & CLIP_LEFT_BIT) - CLIP(1,0,0,1); - - if (clipor & CLIP_RIGHT_BIT) - CLIP(-1,0,0,1); - - if (clipor & CLIP_TOP_BIT) - CLIP(0,-1,0,1); - - if (clipor & CLIP_BOTTOM_BIT) - CLIP(0,1,0,1); - - if (clipor & CLIP_FAR_BIT) - CLIP(0,0,-1,1); - - if (clipor & CLIP_NEAR_BIT) - CLIP(0,0,1,1); - } - - if (clipor & CLIP_USER_BIT) { - GLuint i; - for (i = 0 ; i < MAX_CLIP_PLANES ; i++) { - if (ctx->Transform.ClipEnabled[i]) { - GLfloat a = ctx->Transform.ClipUserPlane[i][0]; - GLfloat b = ctx->Transform.ClipUserPlane[i][1]; - GLfloat c = ctx->Transform.ClipUserPlane[i][2]; - GLfloat d = ctx->Transform.ClipUserPlane[i][3]; - CLIP(a,b,c,d); - } - } - } - - inoutlist[0] = I; - inoutlist[1] = J; - - return 2; -} - - - - - - -#if defined(FX_V2) - -#define VARS_XYZW \ - GLfloat vsx = mat[MAT_SX]; \ - GLfloat vsy = mat[MAT_SY]; \ - GLfloat vsz = mat[MAT_SZ]; \ - GLfloat vtx = mat[MAT_TX]; \ - GLfloat vty = mat[MAT_TY]; \ - GLfloat vtz = mat[MAT_TZ]; - -#define DO_SETUP_XYZW \ -{ \ - GLfloat oow = 1.0 / data[3]; \ - v->x = data[0]*oow*vsx + vtx; \ - v->y = data[1]*oow*vsy + vty; \ - v->ooz = data[2]*oow*vsz + vtz; \ - v->oow = oow; \ -} -#else - -#if defined(DRIVERTS) - -#define VARS_XYZW \ - GLfloat vsx = mat[MAT_SX]; \ - GLfloat vsy = mat[MAT_SY]; \ - GLfloat vsz = mat[MAT_SZ]; \ - GLfloat vtx = mat[MAT_TX]+fxMesa->x_offset; \ - GLfloat vty = mat[MAT_TY]+fxMesa->y_delta; \ - GLfloat vtz = mat[MAT_TZ]; - -#define DO_SETUP_XYZW \ -{ \ - GLfloat oow = 1.0 / data[3]; \ - v->x = data[0]*oow*vsx + vtx; \ - v->y = data[1]*oow*vsy + vty; \ - v->ooz = data[2]*oow*vsz + vtz; \ - v->oow = oow; \ -} - -#else -#define VARS_XYZW \ - GLfloat vsx = mat[MAT_SX]; \ - GLfloat vsy = mat[MAT_SY]; \ - GLfloat vsz = mat[MAT_SZ]; \ - const GLfloat snapper = (3L << 18); \ - GLfloat snap_tx = mat[MAT_TX] + snapper; \ - GLfloat snap_ty = mat[MAT_TY] + snapper; \ - GLfloat vtz = mat[MAT_TZ]; - -#define DO_SETUP_XYZW \ -{ \ - GLfloat oow = 1.0 / data[3]; \ - v->x = data[0]*oow*vsx + snap_tx; \ - v->y = data[1]*oow*vsy + snap_ty; \ - v->ooz = data[2]*oow*vsz + vtz; \ - v->oow = oow; \ - v->x -= snapper; \ - v->y -= snapper; \ -} - -#endif -#endif - -#define COPY_XYZW_STRIDE \ - { GLfloat *clip = VEC_ELT(VB->ClipPtr, GLfloat, e); \ - COPY_4FV(out, clip); } - -#define VARS_RGBA - -#define COPY_RGBA_STRIDE \ - { GLubyte *color = VEC_ELT(VB->ColorPtr, GLubyte, e); \ - UBYTE_RGBA_TO_FLOAT_255_RGBA((out+4), color); } - -#if FX_USE_PARGB -#define DO_SETUP_RGBA \ - GET_PARGB(v) = (((int)data[4+3]) << 24) | \ - (((int)data[4+0]) << 16) | \ - (((int)data[4+1]) << 8) | \ - (((int)data[4+2]) << 0); -#else -#define DO_SETUP_RGBA \ - v->r = data[4+0]; \ - v->g = data[4+1]; \ - v->b = data[4+2]; \ - v->a = data[4+3]; -#endif /* FX_USE_PARGB */ - -#define VARS_TMU0 \ - struct gl_texture_unit *t0 = &ctx->Texture.Unit[tmu0_source]; \ - GLfloat sScale0 = fxTMGetTexInfo(t0->Current)->sScale; \ - GLfloat tScale0 = fxTMGetTexInfo(t0->Current)->tScale; \ - - -#define COPY_TMU0_STRIDE(offset) \ - { GLfloat *tc0 = VEC_ELT(tc0_vec, GLfloat, e); \ - COPY_2V((out+offset), tc0); } - - -#define DO_SETUP_TMU0(offset) \ - v->tmuvtx[0].sow = data[offset+0]*sScale0*v->oow; \ - v->tmuvtx[0].tow = data[offset+1]*tScale0*v->oow; - -#define VARS_TMU1 \ - struct gl_texture_unit *t1 = &ctx->Texture.Unit[tmu1_source]; \ - GLfloat sScale1 = fxTMGetTexInfo(t1->Current)->sScale; \ - GLfloat tScale1 = fxTMGetTexInfo(t1->Current)->tScale; - -#define COPY_TMU1_STRIDE(offset) \ - { GLfloat *tc1 = VEC_ELT(tc1_vec, GLfloat, e); \ - COPY_2V((out+offset), tc1); } - - -#define DO_SETUP_TMU1(offset) \ - v->tmuvtx[1].sow = data[offset+0]*sScale1*v->oow; \ - v->tmuvtx[1].tow = data[offset+1]*tScale1*v->oow; - -#define COPY_NIL(offset) ASSIGN_2V((out+offset), 0, 0); - -#define IND 0 -#define TAG(x) x##_nil -#include "fxcliptmp.h" - -#define IND SETUP_RGBA -#define TAG(x) x##_RGBA -#include "fxcliptmp.h" - -#define IND SETUP_TMU0 -#define TAG(x) x##_TMU0 -#include "fxcliptmp.h" - -#define IND (SETUP_TMU0|SETUP_TMU1) -#define TAG(x) x##_TMU0_TMU1 -#include "fxcliptmp.h" - -#define IND (SETUP_RGBA|SETUP_TMU0) -#define TAG(x) x##_RGBA_TMU0 -#include "fxcliptmp.h" - -#define IND (SETUP_RGBA|SETUP_TMU0|SETUP_TMU1) -#define TAG(x) x##_RGBA_TMU0_TMU1 -#include "fxcliptmp.h" - -tfxTriViewClipFunc fxTriViewClipTab[0x8]; -tfxTriClipFunc fxTriClipStrideTab[0x8]; -tfxLineClipFunc fxLineClipTab[0x8]; - - -void fxDDClipInit() -{ - fxTriViewClipTab[0] = fx_tri_view_clip_nil; - fxTriViewClipTab[SETUP_RGBA] = fx_tri_view_clip_RGBA; - fxTriViewClipTab[SETUP_TMU0] = fx_tri_view_clip_TMU0; - fxTriViewClipTab[SETUP_TMU0|SETUP_TMU1] = fx_tri_view_clip_TMU0_TMU1; - fxTriViewClipTab[SETUP_RGBA|SETUP_TMU0] = fx_tri_view_clip_RGBA_TMU0; - fxTriViewClipTab[SETUP_RGBA|SETUP_TMU0|SETUP_TMU1] = fx_tri_view_clip_RGBA_TMU0_TMU1; - - fxTriClipStrideTab[0] = fx_tri_clip_stride_nil; - fxTriClipStrideTab[SETUP_RGBA] = fx_tri_clip_stride_RGBA; - fxTriClipStrideTab[SETUP_TMU0] = fx_tri_clip_stride_TMU0; - fxTriClipStrideTab[SETUP_TMU0|SETUP_TMU1] = fx_tri_clip_stride_TMU0_TMU1; - fxTriClipStrideTab[SETUP_RGBA|SETUP_TMU0] = fx_tri_clip_stride_RGBA_TMU0; - fxTriClipStrideTab[SETUP_RGBA|SETUP_TMU0|SETUP_TMU1] = fx_tri_clip_stride_RGBA_TMU0_TMU1; - - fxLineClipTab[0] = fx_line_clip_nil; - fxLineClipTab[SETUP_RGBA] = fx_line_clip_RGBA; - fxLineClipTab[SETUP_TMU0] = fx_line_clip_TMU0; - fxLineClipTab[SETUP_TMU0|SETUP_TMU1] = fx_line_clip_TMU0_TMU1; - fxLineClipTab[SETUP_RGBA|SETUP_TMU0] = fx_line_clip_RGBA_TMU0; - fxLineClipTab[SETUP_RGBA|SETUP_TMU0|SETUP_TMU1] = fx_line_clip_RGBA_TMU0_TMU1; -} - -#else - -/* - * Need this to provide at least one external definition. - */ -int gl_fxclip_dummy(void) -{ - return 0; -} - -#endif Index: xc/extras/Mesa/src/FX/fxcliptmp.h diff -u xc/extras/Mesa/src/FX/fxcliptmp.h:1.2 xc/extras/Mesa/src/FX/fxcliptmp.h:removed --- xc/extras/Mesa/src/FX/fxcliptmp.h:1.2 Tue Feb 15 02:13:05 2000 +++ xc/extras/Mesa/src/FX/fxcliptmp.h Mon Dec 18 14:21:51 2000 @@ -1,346 +0,0 @@ -/* -*- mode: C; tab-width:8; c-basic-offset:2 -*- */ - -/* - * Mesa 3-D graphics library - * Version: 3.3 - * - * Copyright (C) 1999-2000 Brian Paul All Rights Reserved. - * - * 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 - * BRIAN PAUL 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. - * - * - * Original Mesa / 3Dfx device driver (C) 1999 David Bucciarelli, by the - * terms stated above. - * - * Thank you for your contribution, David! - * - * Please make note of the above copyright/license statement. If you - * contributed code or bug fixes to this code under the previous (GNU - * Library) license and object to the new license, your code will be - * removed at your request. Please see the Mesa docs/COPYRIGHT file - * for more information. - * - * Additional Mesa/3Dfx driver developers: - * Daryll Strauss - * Keith Whitwell - * - * See fxapi.h for more revision/author details. - */ - - -#define V1 VARS_XYZW -#define S1 DO_SETUP_XYZW -#define T1 COPY_XYZW_STRIDE -#define Z1 4 - -#if (IND & SETUP_RGBA) -#define V2 V1 VARS_RGBA -#define S2 S1 DO_SETUP_RGBA -#define T2 T1 COPY_RGBA_STRIDE -#define Z2 (Z1 + 4) -#else -#define V2 V1 -#define S2 S1 -#define T2 T1 -#define Z2 Z1 -#endif - -#if (IND & SETUP_TMU0) -#define V3 V2 VARS_TMU0 -#define S3 S2 DO_SETUP_TMU0(Z2) -#define T3 T2 COPY_TMU0_STRIDE(Z2) -#define Z3 (Z2 + 2) -#else -#define V3 V2 -#define S3 S2 -#define T3 T2 -#define Z3 Z2 -#endif - -#if (IND & SETUP_TMU1) -#define V4 V3 VARS_TMU1 -#define S4 S3 DO_SETUP_TMU1(Z3) -#define T4 T3 COPY_TMU1_STRIDE(Z3) -#define Z4 (Z3 + 2) -#else -#define V4 V3 -#define S4 S3 -#define T4 T3 -#define Z4 Z3 -#endif - -#if (Z4 & 2) -#define SIZE (Z4+2) -#define COPY_STRIDE T4 COPY_NIL(Z4) -#else -#define SIZE Z4 -#define COPY_STRIDE T4 -#endif - -#define VARS V4 -#define SETUP S4 - -#define DRAW_LINE(tmp0, tmp1, width) \ - do { \ - GrVertex verts[4]; \ - float dx, dy, ix, iy; \ - \ - dx = tmp0->x - tmp1->x; \ - dy = tmp0->y - tmp1->y; \ - \ - if (dx * dx > dy * dy) { \ - iy = width * .5; \ - ix = 0; \ - } else { \ - iy = 0; \ - ix = width * .5; \ - } \ - \ - verts[0] = *tmp0; \ - verts[1] = *tmp0; \ - verts[2] = *tmp1; \ - verts[3] = *tmp1; \ - \ - verts[0].x = tmp0->x - ix; \ - verts[0].y = tmp0->y - iy; \ - \ - verts[1].x = tmp0->x + ix; \ - verts[1].y = tmp0->y + iy; \ - \ - verts[2].x = tmp1->x + ix; \ - verts[2].y = tmp1->y + iy; \ - \ - verts[3].x = tmp1->x - ix; \ - verts[3].y = tmp1->y - iy; \ - \ - FX_grDrawPolygonVertexList(4, verts); \ - } while (0) - -static void TAG(fx_tri_view_clip)( struct vertex_buffer *VB, - GLuint v[], - GLubyte mask ) -{ - GLcontext *ctx = VB->ctx; - fxMesaContext fxMesa = (fxMesaContext)ctx->DriverCtx; - GLfloat data[VB_MAX_CLIPPED_VERTS*12]; - GLfloat *vlist[VB_MAX_CLIPPED_VERTS]; - GrVertex *verts[VB_MAX_CLIPPED_VERTS]; - fxVertex *gWin = FX_DRIVER_DATA(VB)->verts; - GLfloat *out = data; - GLfloat *mat = ctx->Viewport.WindowMap.m; - GLuint i, n; - GLubyte *clipmask = VB->ClipMask; - - GLuint tmu0_source = fxMesa->tmu_source[0]; - GLuint tmu1_source = fxMesa->tmu_source[1]; - GLvector4f *tc0_vec = VB->TexCoordPtr[tmu0_source]; - GLvector4f *tc1_vec = VB->TexCoordPtr[tmu1_source]; - - (void) fxMesa; - (void) tmu0_source; (void) tc0_vec; - (void) tmu1_source; (void) tc1_vec; - - for (i = 0 ; i < 3 ; i++) { - GLuint e = v[i]; - verts[i] = 0; - if (!clipmask[e]) verts[i] = (GrVertex *)gWin[e].f; - vlist[i] = out; - COPY_STRIDE; - out += SIZE; - } - - if ((n = fx_view_clip_triangle( ctx, vlist, verts, SIZE, mask )) >= 3) - { - GrVertex tmp[VB_MAX_CLIPPED_VERTS]; - GrVertex *v = tmp, *v2, *v3; - VARS; - - for (i = 0 ; i < n ; i++) - if (!verts[i]) { - GLfloat *data = vlist[i]; - SETUP; - verts[i] = v++; - } - - v = verts[0]; - v2 = verts[1]; - v3 = verts[2]; - - for (i = 2 ; i < n ; v2 = v3, v3=verts[++i]) - FX_grDrawTriangle(v, v2, v3); - } -} - - - - - -static void TAG(fx_tri_clip_stride)( struct vertex_buffer *VB, - GLuint v[], - GLuint mask ) -{ - GLcontext *ctx = VB->ctx; - fxMesaContext fxMesa = (fxMesaContext)ctx->DriverCtx; - GLfloat data[VB_MAX_CLIPPED_VERTS*12]; - GLfloat *vlist[VB_MAX_CLIPPED_VERTS]; - GrVertex *verts[VB_MAX_CLIPPED_VERTS]; - fxVertex *gWin = FX_DRIVER_DATA(VB)->verts; - GLfloat *out = data; - GLfloat *mat = ctx->Viewport.WindowMap.m; - GLuint i, n; - GLubyte *clipmask = VB->ClipMask; - - GLuint tmu0_source = fxMesa->tmu_source[0]; - GLuint tmu1_source = fxMesa->tmu_source[1]; - GLvector4f *tc0_vec = VB->TexCoordPtr[tmu0_source]; - GLvector4f *tc1_vec = VB->TexCoordPtr[tmu1_source]; - - (void) fxMesa; - (void) tmu0_source; (void) tc0_vec; - (void) tmu1_source; (void) tc1_vec; - - for (i = 0 ; i < 3 ; i++) { - GLuint e = v[i]; - verts[i] = 0; - if (!clipmask[e]) verts[i] = (GrVertex *)gWin[e].f; - vlist[i] = out; - COPY_STRIDE; - out += SIZE; - } - - if (VB->ClipPtr->size < 4) { - vlist[0][3] = vlist[1][3] = vlist[2][3] = 1.0; - if (VB->ClipPtr->size == 2) - vlist[0][2] = vlist[1][2] = vlist[2][2] = 0.0; - } - - if ((n = fx_clip_triangle( ctx, vlist, verts, SIZE, mask )) >= 3) - { - GrVertex tmp[VB_MAX_CLIPPED_VERTS]; - GrVertex *v = tmp, *v2, *v3; - VARS; - - for (i = 0 ; i < n ; i++) - if (!verts[i]) { - GLfloat *data = vlist[i]; - SETUP; - verts[i] = v++; - } - - v = verts[0]; - v2 = verts[1]; - v3 = verts[2]; - - for (i = 2 ; i < n ; v2 = v3, v3=verts[++i]) - FX_grDrawTriangle(v, v2, v3); - } -} - - - -static void TAG(fx_line_clip)( struct vertex_buffer *VB, - GLuint v1, GLuint v2, - GLubyte mask ) -{ - GLcontext *ctx = VB->ctx; - fxMesaContext fxMesa = (fxMesaContext)ctx->DriverCtx; - GLfloat data[VB_MAX_CLIPPED_VERTS*12]; - GLfloat *vlist[VB_MAX_CLIPPED_VERTS]; - GLfloat *out = data; - GLfloat *mat = ctx->Viewport.WindowMap.m; - GLfloat w = ctx->Line.Width*.5; - GLuint e, n; - - GLuint tmu0_source = fxMesa->tmu_source[0]; - GLuint tmu1_source = fxMesa->tmu_source[1]; - GLvector4f *tc0_vec = VB->TexCoordPtr[tmu0_source]; - GLvector4f *tc1_vec = VB->TexCoordPtr[tmu1_source]; - - VARS; - - (void) fxMesa; - (void) tmu0_source; (void) tc0_vec; - (void) tmu1_source; (void) tc1_vec; - - vlist[0] = out; - e = v1; - COPY_STRIDE; - out += SIZE; - - vlist[1] = out; - e = v2; - COPY_STRIDE; - out += SIZE; - - if (VB->ClipPtr->size < 4) { - vlist[0][3] = vlist[1][3] = 1.0; - if (VB->ClipPtr->size == 2) - vlist[0][2] = vlist[1][2] = 0.0; - } - - if ((n = fx_clip_line( ctx, vlist, SIZE, mask )) != 0) - { - GrVertex gWin[2]; - GrVertex *v; - GLfloat *data; - - v = gWin; - data = vlist[0]; - SETUP; - - v++; - data = vlist[1]; - SETUP; - - DRAW_LINE(gWin, v, w); - } -} - - - -#undef V1 -#undef S1 -#undef C1 -#undef Z1 -#undef T1 - -#undef V2 -#undef S2 -#undef C2 -#undef Z2 -#undef T2 - -#undef V3 -#undef S3 -#undef C3 -#undef Z3 -#undef T3 - -#undef V4 -#undef S4 -#undef C4 -#undef Z4 -#undef T4 - -#undef VARS -#undef SETUP -#undef COPY -#undef COPY_STRIDE -#undef SIZE -#undef IND -#undef TAG Index: xc/extras/Mesa/src/FX/fxcva.c diff -u xc/extras/Mesa/src/FX/fxcva.c:1.2 xc/extras/Mesa/src/FX/fxcva.c:removed --- xc/extras/Mesa/src/FX/fxcva.c:1.2 Tue Feb 15 02:13:05 2000 +++ xc/extras/Mesa/src/FX/fxcva.c Mon Dec 18 14:21:51 2000 @@ -1,513 +0,0 @@ -/* -*- mode: C; tab-width:8; c-basic-offset:2 -*- */ - -/* - * Mesa 3-D graphics library - * Version: 3.3 - * - * Copyright (C) 1999-2000 Brian Paul All Rights Reserved. - * - * 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 - * BRIAN PAUL 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. - * - * - * Original Mesa / 3Dfx device driver (C) 1999 David Bucciarelli, by the - * terms stated above. - * - * Thank you for your contribution, David! - * - * Please make note of the above copyright/license statement. If you - * contributed code or bug fixes to this code under the previous (GNU - * Library) license and object to the new license, your code will be - * removed at your request. Please see the Mesa docs/COPYRIGHT file - * for more information. - * - * Additional Mesa/3Dfx driver developers: - * Daryll Strauss - * Keith Whitwell - * - * See fxapi.h for more revision/author details. - */ - - -/* fxcva.c - the CVA related code */ - - -#ifdef HAVE_CONFIG_H -#include "conf.h" -#endif - -#if defined(FX) - -#include "fxdrv.h" -#include "mmath.h" -#include "vbindirect.h" -#include "pb.h" -#include "fxvsetup.h" -#include "pipeline.h" -#include "stages.h" - -#define PRIM_POINTS 0 -#define PRIM_LINES 1 -#define PRIM_TRIS 2 -#define PRIM_CULLED 3 - - -static GLuint reduce_prim[GL_POLYGON+2] = { - PRIM_POINTS, - PRIM_LINES, - PRIM_LINES, - PRIM_LINES, - PRIM_TRIS, - PRIM_TRIS, - PRIM_TRIS, - PRIM_TRIS, - PRIM_TRIS, - PRIM_TRIS, - PRIM_CULLED -}; - -typedef void (*mergefunc)( struct vertex_buffer *cvaVB, - struct vertex_buffer *VB, - const struct gl_prim_state *state, - GLuint start, - GLuint count ); - -static void fxCvaRenderNoop( struct vertex_buffer *cvaVB, - struct vertex_buffer *VB, - const struct gl_prim_state *state, - GLuint start, - GLuint count ) -{ -} - -static INLINE void fxRenderClippedTriangle2( struct vertex_buffer *VB, - GLuint v1, GLuint v2, GLuint v3 ) -{ - fxVertex *gWin = FX_DRIVER_DATA(VB)->verts; - GLubyte *clipmask = VB->ClipMask; - GLubyte mask = clipmask[v1] | clipmask[v2] | clipmask[v3]; - - if (!mask) { - FX_grDrawTriangle((GrVertex *)gWin[v1].f, - (GrVertex *)gWin[v2].f, - (GrVertex *)gWin[v3].f); - } else if (!(clipmask[v1]&clipmask[v2]&clipmask[v3]&CLIP_ALL_BITS)) { - GLuint n; - GLuint vlist[VB_MAX_CLIPPED_VERTS]; - ASSIGN_3V(vlist, v1, v2, v3); - - n = (VB->ctx->poly_clip_tab[VB->ClipPtr->size])( VB, 3, vlist, mask ); - if (n >= 3) { - GLuint i, j0 = vlist[0]; - for (i=2;iColorPtr->data; \ - GLubyte (*cva_color)[4] = (cvaVB->ColorPtr = cvaVB->LitColor[0])->data; -*/ - -#define CVA_VARS_RGBA \ - GLubyte (*color)[4] = VB->ColorPtr->data; \ - GLubyte (*cva_color)[4] = cvaVB->ColorPtr->data; - - - -#undef DO_SETUP_RGBA -#if FX_USE_PARGB -#define DO_SETUP_RGBA \ -{ \ - GLubyte *col = color[i]; \ - GET_PARGB(v)= ((col[3] << 24) | \ - (col[0] << 16) | \ - (col[1] << 8) | \ - (col[2])); \ -} -#else -#define DO_SETUP_RGBA \ -{ \ - GLubyte *col = color[i]; \ - v[GR_VERTEX_R_OFFSET]=UBYTE_COLOR_TO_FLOAT_255_COLOR(col[0]); \ - v[GR_VERTEX_G_OFFSET]=UBYTE_COLOR_TO_FLOAT_255_COLOR(col[1]); \ - v[GR_VERTEX_B_OFFSET]=UBYTE_COLOR_TO_FLOAT_255_COLOR(col[2]); \ - v[GR_VERTEX_A_OFFSET]=UBYTE_COLOR_TO_FLOAT_255_COLOR(col[3]); \ -} -#endif /* FX_USE_PARGB */ - - -#define CVA_VARS_TMU0 \ - VARS_TMU0 \ - GLfloat (*cva_tex0)[4] = (cvaVB->TexCoordPtr[tmu0_source] = cvaVB->store.TexCoord[tmu0_source])->data; - -#define CVA_VARS_TMU1 \ - VARS_TMU1 \ - GLfloat (*cva_tex1)[4] = (cvaVB->TexCoordPtr[tmu1_source] = cvaVB->store.TexCoord[tmu1_source])->data; - - -#define INIT_RGBA (void) cva_color; -#define INIT_TMU0 (void) cva_tex0; (void) tmu0_stride; (void) tmu0_sz; -#define INIT_TMU1 (void) cva_tex1; (void) tmu1_stride; (void) tmu1_sz; - - -#define DRAW_POINT FX_grDrawPoint( (GrVertex *)v ) -#define DRAW_LINE FX_grDrawLine( (GrVertex *)v, (GrVertex *)prev_v ) -#define DRAW_TRI FX_grDrawTriangle( (GrVertex *)gWin[l[0]].f, (GrVertex *)gWin[l[1]].f, (GrVertex *)v ) -#define DRAW_TRI2 FX_grDrawTriangle( vl[0], vl[1], vl[2] ) -#define CLIP_LINE fxRenderClippedLine( cvaVB, e, prev ) -#define CLIP_OR_DRAW_TRI fxRenderClippedTriangle2( cvaVB, l[0], l[1], e ) -#define DIRECT 1 - -#define TAG(x) x -#define IDX 0 -#define VARS -#define INIT -#define INCR -#define MERGE_RAST -#define MERGE_VB -#include "fxcvatmp.h" - -#define TAG(x) x##RGBA -#define IDX SETUP_RGBA -#define VARS CVA_VARS_RGBA -#define INIT INIT_RGBA -#define INCR -#define MERGE_RAST DO_SETUP_RGBA -#define MERGE_VB COPY_4UBV(cva_color[e], color[i]) -#include "fxcvatmp.h" - -#define TAG(x) x##T0 -#define IDX SETUP_TMU0 -#define VARS CVA_VARS_TMU0 -#define INIT INIT_TMU0 -#define INCR , tmu0_data+=4 -#define MERGE_RAST DO_SETUP_TMU0 -#define MERGE_VB COPY_2FV(cva_tex0[e], tmu0_data) -#include "fxcvatmp.h" - -#define TAG(x) x##T1 -#define IDX SETUP_TMU1 -#define VARS CVA_VARS_TMU1 -#define INIT INIT_TMU1 -#define INCR , tmu1_data+=4 -#define MERGE_RAST DO_SETUP_TMU1 -#define MERGE_VB COPY_2FV(cva_tex1[e], tmu1_data) -#include "fxcvatmp.h" - -#define TAG(x) x##T0T1 -#define IDX SETUP_TMU0|SETUP_TMU1 -#define VARS CVA_VARS_TMU0 CVA_VARS_TMU1 -#define INIT INIT_TMU0 INIT_TMU1 -#define INCR , tmu0_data+=4 , tmu1_data+=4 -#define MERGE_RAST DO_SETUP_TMU0 DO_SETUP_TMU1 -#define MERGE_VB COPY_2FV(cva_tex0[e], tmu0_data); \ - COPY_2FV(cva_tex1[e], tmu1_data); -#include "fxcvatmp.h" - -#define TAG(x) x##RGBAT0 -#define IDX SETUP_RGBA|SETUP_TMU0 -#define VARS CVA_VARS_RGBA CVA_VARS_TMU0 -#define INIT INIT_RGBA INIT_TMU0 -#define INCR , tmu0_data+=4 -#define MERGE_RAST DO_SETUP_RGBA; DO_SETUP_TMU0 -#define MERGE_VB COPY_2FV(cva_tex0[e], tmu0_data); \ - COPY_4UBV(cva_color[e], color[i]); -#include "fxcvatmp.h" - -#define TAG(x) x##RGBAT1 -#define IDX SETUP_RGBA|SETUP_TMU1 -#define VARS CVA_VARS_RGBA CVA_VARS_TMU1 -#define INIT INIT_RGBA INIT_TMU1 -#define INCR , tmu1_data+=4 -#define MERGE_RAST DO_SETUP_RGBA; DO_SETUP_TMU1 -#define MERGE_VB COPY_2FV(cva_tex1[e], tmu1_data); \ - COPY_4UBV(cva_color[e], color[i]); -#include "fxcvatmp.h" - -#define TAG(x) x##RGBAT0T1 -#define IDX SETUP_RGBA|SETUP_TMU0|SETUP_TMU1 -#define VARS CVA_VARS_RGBA CVA_VARS_TMU0 CVA_VARS_TMU1 -#define INIT INIT_RGBA INIT_TMU0 INIT_TMU1 -#define INCR , tmu0_data+=4 , tmu1_data+=4 -#define MERGE_RAST DO_SETUP_RGBA; DO_SETUP_TMU0 DO_SETUP_TMU1 -#define MERGE_VB COPY_2FV(cva_tex0[e], tmu0_data); \ - COPY_2FV(cva_tex1[e], tmu1_data); \ - COPY_4UBV(cva_color[e], color[i]); -#include "fxcvatmp.h" - - - -#undef DRAW_POINT -#undef DRAW_LINE -#undef DRAW_TRI -#undef CLIP_LINE -#undef CLIP_OR_DRAW_TRI -#undef DIRECT - -#define DRAW_POINT ctx->Driver.PointsFunc( ctx, e, e ) -#define DRAW_LINE ctx->Driver.LineFunc( ctx, e, prev, e ) -#define DRAW_TRI ctx->TriangleFunc( ctx, l[0], l[1], e, e ) -#define CLIP_LINE gl_render_clipped_line( ctx, e, prev ) -#define CLIP_OR_DRAW_TRI \ -do { \ - if (clip[l[0]] | clip[l[1]] | clip[e]) { \ - if (!(clip[l[0]] & clip[l[1]] & clip[e] & CLIP_ALL_BITS)) { \ - COPY_3V(vlist, l); \ - gl_render_clipped_triangle( ctx, 3, vlist, e ); \ - } \ - } \ - else ctx->TriangleFunc( ctx, l[0], l[1], e, e ); \ -} while (0) - - -#define DIRECT 0 - -#define TAG(x) x##_indirect -#define IDX 0 -#define VARS -#define INIT -#define INCR -#define MERGE_RAST -#define MERGE_VB -#include "fxcvatmp.h" - -#define TAG(x) x##RGBA_indirect -#define IDX SETUP_RGBA -#define VARS CVA_VARS_RGBA -#define INIT INIT_RGBA -#define INCR -#define MERGE_RAST DO_SETUP_RGBA -#define MERGE_VB COPY_4UBV(cva_color[e], color[i]) -#include "fxcvatmp.h" - -#define TAG(x) x##T0_indirect -#define IDX SETUP_TMU0 -#define VARS CVA_VARS_TMU0 -#define INIT INIT_TMU0 -#define INCR , tmu0_data+=4 -#define MERGE_RAST DO_SETUP_TMU0 -#define MERGE_VB COPY_2FV(cva_tex0[e], tmu0_data) -#include "fxcvatmp.h" - -#define TAG(x) x##T1_indirect -#define IDX SETUP_TMU1 -#define VARS CVA_VARS_TMU1 -#define INIT INIT_TMU1 -#define INCR , tmu1_data+=4 -#define MERGE_RAST DO_SETUP_TMU1 -#define MERGE_VB COPY_2FV(cva_tex1[e], tmu1_data) -#include "fxcvatmp.h" - -#define TAG(x) x##T0T1_indirect -#define IDX SETUP_TMU0|SETUP_TMU1 -#define VARS CVA_VARS_TMU0 CVA_VARS_TMU1 -#define INIT INIT_TMU0 INIT_TMU1 -#define INCR , tmu0_data+=4 , tmu1_data+=4 -#define MERGE_RAST DO_SETUP_TMU0 DO_SETUP_TMU1 -#define MERGE_VB COPY_2FV(cva_tex0[e], tmu0_data); \ - COPY_2FV(cva_tex1[e], tmu1_data); -#include "fxcvatmp.h" - -#define TAG(x) x##RGBAT0_indirect -#define IDX SETUP_RGBA|SETUP_TMU0 -#define VARS CVA_VARS_RGBA CVA_VARS_TMU0 -#define INIT INIT_RGBA INIT_TMU0 -#define INCR , tmu0_data+=4 -#define MERGE_RAST DO_SETUP_RGBA; DO_SETUP_TMU0 -#define MERGE_VB COPY_2FV(cva_tex0[e], tmu0_data); \ - COPY_4UBV(cva_color[e], color[i]); -#include "fxcvatmp.h" - -#define TAG(x) x##RGBAT1_indirect -#define IDX SETUP_RGBA|SETUP_TMU1 -#define VARS CVA_VARS_RGBA CVA_VARS_TMU1 -#define INIT INIT_RGBA INIT_TMU1 -#define INCR , tmu1_data+=4 -#define MERGE_RAST DO_SETUP_RGBA; DO_SETUP_TMU1 -#define MERGE_VB COPY_2FV(cva_tex1[e], tmu1_data); \ - COPY_4UBV(cva_color[e], color[i]); -#include "fxcvatmp.h" - -#define TAG(x) x##RGBAT0T1_indirect -#define IDX SETUP_RGBA|SETUP_TMU0|SETUP_TMU1 -#define VARS CVA_VARS_RGBA CVA_VARS_TMU0 CVA_VARS_TMU1 -#define INIT INIT_RGBA INIT_TMU0 INIT_TMU1 -#define INCR , tmu0_data+=4 , tmu1_data+=4 -#define MERGE_RAST DO_SETUP_RGBA DO_SETUP_TMU0 DO_SETUP_TMU1 -#define MERGE_VB COPY_2FV(cva_tex0[e], tmu0_data); \ - COPY_2FV(cva_tex1[e], tmu1_data); \ - COPY_4UBV(cva_color[e], color[i]); -#include "fxcvatmp.h" - - - - -void fxDDCvaInit() -{ - /* Call grDrawTriangle et al */ - init_cva(); - init_cvaT0(); - init_cvaT1(); - init_cvaT0T1(); - init_cvaRGBA(); - init_cvaRGBAT0(); - init_cvaRGBAT1(); - init_cvaRGBAT0T1(); - - /* Call ctx->TriangleFunc and friends */ - init_cva_indirect(); - init_cvaT0_indirect(); - init_cvaT1_indirect(); - init_cvaT0T1_indirect(); - init_cvaRGBA_indirect(); - init_cvaRGBAT0_indirect(); - init_cvaRGBAT1_indirect(); - init_cvaRGBAT0T1_indirect(); -} - - -void fxDDCheckMergeAndRender( GLcontext *ctx, struct gl_pipeline_stage *d ) -{ - GLuint inputs = ctx->RenderFlags & ~ctx->CVA.pre.outputs; - - if (!(ctx->TriangleCaps & DD_TRI_UNFILLED) && - (ctx->Array.Summary & VERT_OBJ_ANY)) - { - d->inputs = (VERT_SETUP_PART | VERT_ELT | inputs); - d->outputs = 0; - d->type = PIPE_IMMEDIATE; - } - -/* gl_print_vert_flags("merge&render inputs", d->inputs); */ -} - - -extern void fxPointSmooth(GLcontext *ctx, GLuint first, GLuint last); -extern void fxLineSmooth(GLcontext *ctx, GLuint v1, GLuint v2, GLuint pv); -extern void fxTriangleSmooth(GLcontext *ctx, GLuint v1, GLuint v2, GLuint v3, - GLuint pv); -extern const char *gl_prim_name[]; - - -/* static GLboolean edge_flag[GL_POLYGON+2] = { 0,0,0,0,1,0,0,1,0,1,0 }; */ - -void fxDDMergeAndRender( struct vertex_buffer *VB ) -{ - GLcontext *ctx = VB->ctx; - struct vertex_buffer *cvaVB = ctx->CVA.VB; - fxMesaContext fxMesa = (fxMesaContext)ctx->DriverCtx; - GLuint i, next, prim; - GLuint parity = VB->Parity; - GLuint count = VB->Count; - const struct gl_prim_state *state; - mergefunc func; - struct vertex_buffer *saved_vb = ctx->VB; - GLuint inputs = ctx->RenderFlags & ~ctx->CVA.pre.outputs; - GLuint flags = 0; - GLuint direct = (fxMesa->render_index == 0); - mergefunc (*tab)[PRIM_CULLED+1] = merge_and_render_tab[direct]; - GLuint p = 0; - - if (fxMesa->new_state) - fxSetupFXUnits(ctx); - - - /* May actually contain elements not present in fxMesa->setupindex, - * eg RGBA when flat shading. These need to be copied into the cva - * VB so that funcs like fxTriangleFlat will be able to reach them. - * - * This leads to some duplication of effort in the merge funcs. - */ - if (inputs & VERT_RGBA) { - cvaVB->ColorPtr = cvaVB->Color[0] = cvaVB->LitColor[0]; - cvaVB->Color[1] = cvaVB->LitColor[1]; - flags |= SETUP_RGBA; - } - - if (inputs & VERT_TEX0_ANY) { - cvaVB->TexCoordPtr[0] = cvaVB->store.TexCoord[0]; - flags |= fxMesa->tex_dest[0]; - } - - if (inputs & VERT_TEX1_ANY) { - cvaVB->TexCoordPtr[1] = cvaVB->store.TexCoord[1]; - flags |= fxMesa->tex_dest[1]; - } -#if 0 - fxPrintSetupFlags("FX cva merge & render", flags); -#endif - - if (cvaVB->ClipOrMask) - gl_import_client_data( cvaVB, ctx->RenderFlags, - VEC_WRITABLE|VEC_GOOD_STRIDE ); - - ctx->VB = cvaVB; - - do { - for ( i= VB->CopyStart ; i < count ; parity = 0, i = next ) - { - prim = VB->Primitive[i]; - next = VB->NextPrimitive[i]; - - state = gl_prim_state_machine[prim][parity]; - func = tab[flags][reduce_prim[prim]]; - func( cvaVB, VB, state, i, next ); - - if ( ctx->TriangleCaps & DD_TRI_LIGHT_TWOSIDE ) - { - cvaVB->Specular = cvaVB->Spec[0]; - cvaVB->ColorPtr = cvaVB->Color[0]; - cvaVB->IndexPtr = cvaVB->Index[0]; - } - } - } while (ctx->Driver.MultipassFunc && - ctx->Driver.MultipassFunc( VB, ++p )); - - - - if (ctx->PB->count > 0) - gl_flush_pb(ctx); - - ctx->VB = saved_vb; -} - - - -#else - - -/* - * Need this to provide at least one external definition. - */ - -int gl_fx_dummy_function_cva(void) -{ - return 0; -} - - -#endif /* FX */ Index: xc/extras/Mesa/src/FX/fxcva.h diff -u xc/extras/Mesa/src/FX/fxcva.h:1.2 xc/extras/Mesa/src/FX/fxcva.h:removed --- xc/extras/Mesa/src/FX/fxcva.h:1.2 Tue Feb 15 02:13:05 2000 +++ xc/extras/Mesa/src/FX/fxcva.h Mon Dec 18 14:21:51 2000 @@ -1,70 +0,0 @@ -/* -*- mode: C; tab-width:8; c-basic-offset:2 -*- */ - -/* - * Mesa 3-D graphics library - * Version: 3.3 - * - * Copyright (C) 1999-2000 Brian Paul All Rights Reserved. - * - * 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 - * BRIAN PAUL 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. - * - * - * Original Mesa / 3Dfx device driver (C) 1999 David Bucciarelli, by the - * terms stated above. - * - * Thank you for your contribution, David! - * - * Please make note of the above copyright/license statement. If you - * contributed code or bug fixes to this code under the previous (GNU - * Library) license and object to the new license, your code will be - * removed at your request. Please see the Mesa docs/COPYRIGHT file - * for more information. - * - * Additional Mesa/3Dfx driver developers: - * Daryll Strauss - * Keith Whitwell - * - * See fxapi.h for more revision/author details. - */ - - -#ifndef _FXCVA_H_ -#define _FXCVA_H_ - - - -extern GLboolean fxMergeAndRenderCVA( struct vertex_buffer *VB, - struct vertex_buffer *cvaVB ); - - - -extern void fxRenderCVAElements( struct vertex_buffer *VB, - GLenum mode, - GLuint *elts, - GLuint n ); - - -extern GLboolean fxCheckCVA( GLcontext *ctx ); - - -extern void fxPrecalcCVA( struct vertex_buffer *VB ); - - - -#endif - Index: xc/extras/Mesa/src/FX/fxcvatmp.h diff -u xc/extras/Mesa/src/FX/fxcvatmp.h:1.2 xc/extras/Mesa/src/FX/fxcvatmp.h:removed --- xc/extras/Mesa/src/FX/fxcvatmp.h:1.2 Tue Feb 15 02:13:05 2000 +++ xc/extras/Mesa/src/FX/fxcvatmp.h Mon Dec 18 14:21:51 2000 @@ -1,262 +0,0 @@ -/* -*- mode: C; tab-width:8; c-basic-offset:2 -*- */ - -/* - * Mesa 3-D graphics library - * Version: 3.3 - * - * Copyright (C) 1999-2000 Brian Paul All Rights Reserved. - * - * 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 - * BRIAN PAUL 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. - * - * - * Original Mesa / 3Dfx device driver (C) 1999 David Bucciarelli, by the - * terms stated above. - * - * Thank you for your contribution, David! - * - * Please make note of the above copyright/license statement. If you - * contributed code or bug fixes to this code under the previous (GNU - * Library) license and object to the new license, your code will be - * removed at your request. Please see the Mesa docs/COPYRIGHT file - * for more information. - * - * Additional Mesa/3Dfx driver developers: - * Daryll Strauss - * Keith Whitwell - * - * See fxapi.h for more revision/author details. - */ - - -static void TAG(cva_render_points)( struct vertex_buffer *cvaVB, - struct vertex_buffer *VB, - const struct gl_prim_state *state, - GLuint start, - GLuint count ) -{ - GLcontext *ctx = VB->ctx; - fxMesaContext fxMesa = (fxMesaContext)ctx->DriverCtx; - fxVertex *gWin = FX_DRIVER_DATA(cvaVB)->verts; - const GLuint *elt = VB->EltPtr->data; - GLuint i; - - VARS; - INIT; - (void) fxMesa; - - if (cvaVB->ClipOrMask) { - const GLubyte *clip = cvaVB->ClipMask; - for (i = start ; i < count ; i++ INCR) { - GLuint e = elt[i]; - if (!clip[e]) { - GLfloat *v = gWin[e].f; (void) v; - if (!DIRECT) { MERGE_VB; } - MERGE_RAST; - DRAW_POINT; - } - } - } else { - for (i = start ; i < count ; i++ INCR) { - GLuint e = elt[i]; - GLfloat *v = gWin[e].f; (void) v; - if (!DIRECT) { MERGE_VB; } - MERGE_RAST; - DRAW_POINT; - } - } -} - -static void TAG(cva_render_lines)( struct vertex_buffer *cvaVB, - struct vertex_buffer *VB, - const struct gl_prim_state *state, - GLuint start, - GLuint count ) -{ - GLcontext *ctx = VB->ctx; - fxMesaContext fxMesa = (fxMesaContext)ctx->DriverCtx; - fxVertex *gWin = FX_DRIVER_DATA(cvaVB)->verts; - const GLuint *elt = VB->EltPtr->data; - GLuint i; - - VARS; - INIT; - (void) fxMesa; - - if (cvaVB->ClipOrMask) { - const GLubyte *clip = cvaVB->ClipMask; - GLuint prev = 0; - GLfloat *prev_v = 0; - - (void) ctx; - - for (i = start ; i < count ; i++ INCR) { - GLuint e = elt[i]; - GLfloat *v = gWin[e].f; - - MERGE_VB; - - if (!clip[e]) - MERGE_RAST; - - if (state->draw) { - if (clip[e] | clip[prev]) - CLIP_LINE; - else - DRAW_LINE; - } - - prev = e; - prev_v = v; - state = state->next; - } - if (state->finish_loop) { - GLuint e = elt[start]; - GLfloat *v = gWin[e].f; (void) v; - - if (!DIRECT) { MERGE_VB; } - MERGE_RAST; - - if (clip[e] | clip[prev]) - CLIP_LINE; - else - DRAW_LINE; - } - } else { - GLuint prev = 0; - GLfloat *prev_v = 0; - - for (i = start ; i < count ; i++ INCR) { - GLuint e = elt[i]; - GLfloat *v = gWin[e].f; - - if (!DIRECT) { MERGE_VB; } - MERGE_RAST; - if (state->draw) DRAW_LINE; - prev = e; - prev_v = v; - state = state->next; - } - if (state->finish_loop) { - GLuint e = elt[start]; - GLfloat *v = gWin[e].f; (void) v; - - if (!DIRECT) { MERGE_VB; } - MERGE_RAST; - DRAW_LINE; - } - } -} - - -static void TAG(cva_render_tris)( struct vertex_buffer *cvaVB, - struct vertex_buffer *VB, - const struct gl_prim_state *state, - GLuint start, - GLuint count ) -{ - GLcontext *ctx = VB->ctx; - fxMesaContext fxMesa = (fxMesaContext)ctx->DriverCtx; - fxVertex *gWin = FX_DRIVER_DATA(cvaVB)->verts; - const GLuint *elt = VB->EltPtr->data; - GLuint i; - VARS; - INIT; - (void) fxMesa; - - if (cvaVB->ClipOrMask) { - GLuint vlist[VB_MAX_CLIPPED_VERTS]; - GLuint l[3]; - const GLubyte *clip = cvaVB->ClipMask; - - (void) vlist; - - for (i = start ; i < count ; i++ INCR) { - GLuint e = l[2] = elt[i]; - GLfloat *v = gWin[e].f; (void) v; - - MERGE_VB; /* needed for clip-interp */ - - if (!clip[e]) { - MERGE_RAST; - } - - if (state->draw) - CLIP_OR_DRAW_TRI; - - - l[0] = l[state->v0]; - l[1] = l[state->v1]; - state = state->next; - } - } else if (DIRECT) { - GrVertex *vl[3]; - for (i = start ; i < count ; i++ INCR) { - GLuint e = elt[i]; - GLfloat *v = gWin[elt[i]].f; - - vl[2] = (GrVertex *)v; - - (void) v; - (void) e; - - MERGE_RAST; - - if (state->draw) - DRAW_TRI2; - - vl[0] = vl[state->v0]; - vl[1] = vl[state->v1]; - state = state->next; - } - } else { - GLuint l[3]; - for (i = start ; i < count ; i++ INCR) { - GLuint e = l[2] = elt[i]; - GLfloat *v = gWin[e].f; (void) v; - - MERGE_VB; /* needed for ctx->trianglefunc? */ - MERGE_RAST; - - if (state->draw) - DRAW_TRI; - - l[0] = l[state->v0]; - l[1] = l[state->v1]; - state = state->next; - } - } -} - - -static void TAG(init_cva)( void ) -{ - merge_and_render_tab[DIRECT][IDX][PRIM_POINTS] = TAG(cva_render_points); - merge_and_render_tab[DIRECT][IDX][PRIM_LINES] = TAG(cva_render_lines); - merge_and_render_tab[DIRECT][IDX][PRIM_TRIS] = TAG(cva_render_tris); - merge_and_render_tab[DIRECT][IDX][PRIM_CULLED] = fxCvaRenderNoop; -} - - -#undef IDX -#undef MERGE_RAST -#undef MERGE_VB -#undef VARS -#undef INIT -#undef INCR -#undef TAG - Index: xc/extras/Mesa/src/FX/fxdd.c diff -u xc/extras/Mesa/src/FX/fxdd.c:1.6 xc/extras/Mesa/src/FX/fxdd.c:removed --- xc/extras/Mesa/src/FX/fxdd.c:1.6 Tue Jun 20 01:08:17 2000 +++ xc/extras/Mesa/src/FX/fxdd.c Mon Dec 18 14:21:51 2000 @@ -1,1491 +0,0 @@ -/* -*- mode: C; tab-width:8; c-basic-offset:2 -*- */ - -/* - * Mesa 3-D graphics library - * Version: 3.3 - * - * Copyright (C) 1999-2000 Brian Paul All Rights Reserved. - * - * 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 - * BRIAN PAUL 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. - * - * - * Original Mesa / 3Dfx device driver (C) 1999 David Bucciarelli, by the - * terms stated above. - * - * Thank you for your contribution, David! - * - * Please make note of the above copyright/license statement. If you - * contributed code or bug fixes to this code under the previous (GNU - * Library) license and object to the new license, your code will be - * removed at your request. Please see the Mesa docs/COPYRIGHT file - * for more information. - * - * Additional Mesa/3Dfx driver developers: - * Daryll Strauss - * Keith Whitwell - * - * See fxapi.h for more revision/author details. - */ - - -/* fxdd.c - 3Dfx VooDoo Mesa device driver functions */ - - -#ifdef HAVE_CONFIG_H -#include "conf.h" -#endif - -#if defined(FX) - -#include -#include "image.h" -#include "types.h" -#include "fxdrv.h" -#include "enums.h" -#include "extensions.h" -#include "pb.h" - -/* These lookup table are used to extract RGB values in [0,255] from - * 16-bit pixel values. - */ -GLubyte FX_PixelToR[0x10000]; -GLubyte FX_PixelToG[0x10000]; -GLubyte FX_PixelToB[0x10000]; - - -/* - * Initialize the FX_PixelTo{RGB} arrays. - * Input: bgrOrder - if TRUE, pixels are in BGR order, else RGB order. - */ -void fxInitPixelTables(fxMesaContext fxMesa, GLboolean bgrOrder) -{ - GLuint pixel; - - fxMesa->bgrOrder=bgrOrder; - for (pixel = 0; pixel <= 0xffff; pixel++) { - GLuint r, g, b; - if (bgrOrder) { - r = (pixel & 0x001F) << 3; - g = (pixel & 0x07E0) >> 3; - b = (pixel & 0xF800) >> 8; - } - else { - r = (pixel & 0xF800) >> 8; - g = (pixel & 0x07E0) >> 3; - b = (pixel & 0x001F) << 3; - } - r = r * 255 / 0xF8; /* fill in low-order bits */ - g = g * 255 / 0xFC; - b = b * 255 / 0xF8; - FX_PixelToR[pixel] = r; - FX_PixelToG[pixel] = g; - FX_PixelToB[pixel] = b; - } -} - - -/**********************************************************************/ -/***** Miscellaneous functions *****/ -/**********************************************************************/ - - -/* Return buffer size information */ -static void fxDDBufferSize(GLcontext *ctx, GLuint *width, GLuint *height) -{ - fxMesaContext fxMesa = FX_CONTEXT(ctx); - - if (MESA_VERBOSE & VERBOSE_DRIVER) { - fprintf(stderr,"fxmesa: fxDDBufferSize(...) Start\n"); - } - - *width = fxMesa->width; - *height = fxMesa->height; - - if (MESA_VERBOSE & VERBOSE_DRIVER) { - fprintf(stderr,"fxmesa: fxDDBufferSize(...) End\n"); - } -} - - -/* Set current drawing color */ -static void fxDDSetColor(GLcontext *ctx, GLubyte red, GLubyte green, - GLubyte blue, GLubyte alpha ) -{ - fxMesaContext fxMesa = FX_CONTEXT(ctx); - GLubyte col[4]; - ASSIGN_4V( col, red, green, blue, alpha ); - if (MESA_VERBOSE & VERBOSE_DRIVER) { - fprintf(stderr,"fxmesa: fxDDSetColor(%d,%d,%d,%d)\n",red,green,blue,alpha); - } - fxMesa->color = FXCOLOR4(col); -} - - -/* Implements glClearColor() */ -static void fxDDClearColor(GLcontext *ctx, GLubyte red, GLubyte green, - GLubyte blue, GLubyte alpha ) -{ - fxMesaContext fxMesa = FX_CONTEXT(ctx); - GLubyte col[4]; - ASSIGN_4V( col, red, green, blue, 255 ); - if (MESA_VERBOSE & VERBOSE_DRIVER) { - fprintf(stderr,"fxmesa: fxDDClearColor(%d,%d,%d,%d)\n",red,green,blue,alpha); - } - fxMesa->clearC = FXCOLOR4( col ); - fxMesa->clearA = alpha; -} - - -/* Clear the color and/or depth buffers */ -static GLbitfield fxDDClear(GLcontext *ctx, GLbitfield mask, GLboolean all, - GLint x, GLint y, GLint width, GLint height ) -{ - fxMesaContext fxMesa=(fxMesaContext)ctx->DriverCtx; - const GLuint colorMask = *((GLuint *) &ctx->Color.ColorMask); - const FxU32 clearD = (FxU32) (ctx->Depth.Clear * fxMesa->depthClear); - const FxU32 clearS = (FxU32) (ctx->Stencil.Clear); - GLbitfield softwareMask = mask & (DD_ACCUM_BIT); - - /* we can't clear accum buffers */ - mask &= ~(DD_ACCUM_BIT); - - if ((mask & DD_STENCIL_BIT) && !fxMesa->haveHwStencil) { - /* software stencil buffer */ - mask &= ~(DD_STENCIL_BIT); - softwareMask |= DD_STENCIL_BIT; - } - - if (MESA_VERBOSE & VERBOSE_DRIVER) { - fprintf(stderr,"fxmesa: fxDDClear(%d,%d,%d,%d)\n", (int) x, (int) y, - (int) width, (int) height); - } - - if (colorMask != 0xffffffff) { - /* do masked color buffer clears in software */ - softwareMask |= (mask & (DD_FRONT_LEFT_BIT | DD_BACK_LEFT_BIT)); - mask &= ~(DD_FRONT_LEFT_BIT | DD_BACK_LEFT_BIT); - } - - - /* disable stencil ops if enabled (it screws up clearing) */ - if (fxMesa->haveHwStencil) { - if (ctx->Stencil.Enabled) - FX_grDisable(GR_STENCIL_MODE_EXT); - - if (mask & DD_STENCIL_BIT) { - FX_grStencilMask(0xff); - /* set stencil ref value = desired clear value */ - FX_grStencilFunc(GR_CMP_ALWAYS, ctx->Stencil.Clear, 0xff); - } - else { - FX_grStencilMask(0x00); - } - } - - /* - * This could probably be done fancier but doing each possible case - * explicitly is less error prone. - */ - switch (mask & ~DD_STENCIL_BIT) { - case DD_BACK_LEFT_BIT | DD_DEPTH_BIT: - /* back buffer & depth */ - FX_grDepthMask(FXTRUE); - FX_grRenderBuffer(GR_BUFFER_BACKBUFFER); - if (mask & DD_STENCIL_BIT) - FX_grBufferClearExt(fxMesa->clearC, fxMesa->clearA, clearD, clearS); - else - FX_grBufferClear(fxMesa->clearC, fxMesa->clearA, clearD); - if (!ctx->Depth.Mask) { - FX_grDepthMask(FXFALSE); - } - break; - case DD_FRONT_LEFT_BIT | DD_DEPTH_BIT: - /* XXX it appears that the depth buffer isn't cleared when - * glRenderBuffer(GR_BUFFER_FRONTBUFFER) is set. - * This is a work-around/ - */ - /* clear depth */ - FX_grDepthMask(FXTRUE); - FX_grRenderBuffer(GR_BUFFER_BACKBUFFER); - FX_grColorMask(FXFALSE,FXFALSE); - if (mask & DD_STENCIL_BIT) - FX_grBufferClearExt(fxMesa->clearC, fxMesa->clearA, clearD, clearS); - else - FX_grBufferClear(fxMesa->clearC, fxMesa->clearA, clearD); - /* clear front */ - FX_grColorMask(FXTRUE, ctx->Color.ColorMask[ACOMP] && fxMesa->haveAlphaBuffer); - FX_grRenderBuffer(GR_BUFFER_FRONTBUFFER); - if (mask & DD_STENCIL_BIT) - FX_grBufferClearExt(fxMesa->clearC, fxMesa->clearA, clearD, clearS); - else - FX_grBufferClear(fxMesa->clearC, fxMesa->clearA, clearD); - break; - case DD_BACK_LEFT_BIT: - /* back buffer only */ - FX_grDepthMask(FXFALSE); - FX_grRenderBuffer(GR_BUFFER_BACKBUFFER); - if (mask & DD_STENCIL_BIT) - FX_grBufferClearExt(fxMesa->clearC, fxMesa->clearA, clearD, clearS); - else - FX_grBufferClear(fxMesa->clearC, fxMesa->clearA, clearD); - if (ctx->Depth.Mask) { - FX_grDepthMask(FXTRUE); - } - break; - case DD_FRONT_LEFT_BIT: - /* front buffer only */ - FX_grDepthMask(FXFALSE); - FX_grRenderBuffer(GR_BUFFER_FRONTBUFFER); - if (mask & DD_STENCIL_BIT) - FX_grBufferClearExt(fxMesa->clearC, fxMesa->clearA, clearD, clearS); - else - FX_grBufferClear(fxMesa->clearC, fxMesa->clearA, clearD); - if (ctx->Depth.Mask) { - FX_grDepthMask(FXTRUE); - } - break; - case DD_FRONT_LEFT_BIT | DD_BACK_LEFT_BIT: - /* front and back */ - FX_grDepthMask(FXFALSE); - FX_grRenderBuffer(GR_BUFFER_BACKBUFFER); - if (mask & DD_STENCIL_BIT) - FX_grBufferClearExt(fxMesa->clearC, fxMesa->clearA, clearD, clearS); - else - FX_grBufferClear(fxMesa->clearC, fxMesa->clearA, clearD); - FX_grRenderBuffer(GR_BUFFER_FRONTBUFFER); - if (mask & DD_STENCIL_BIT) - FX_grBufferClearExt(fxMesa->clearC, fxMesa->clearA, clearD, clearS); - else - FX_grBufferClear(fxMesa->clearC, fxMesa->clearA, clearD); - if (ctx->Depth.Mask) { - FX_grDepthMask(FXTRUE); - } - break; - case DD_FRONT_LEFT_BIT | DD_BACK_LEFT_BIT | DD_DEPTH_BIT: - /* clear front */ - FX_grDepthMask(FXFALSE); - FX_grRenderBuffer(GR_BUFFER_FRONTBUFFER); - if (mask & DD_STENCIL_BIT) - FX_grBufferClearExt(fxMesa->clearC, fxMesa->clearA, clearD, clearS); - else - FX_grBufferClear(fxMesa->clearC, fxMesa->clearA, clearD); - /* clear back and depth */ - FX_grDepthMask(FXTRUE); - FX_grRenderBuffer(GR_BUFFER_BACKBUFFER); - if (mask & DD_STENCIL_BIT) - FX_grBufferClearExt(fxMesa->clearC, fxMesa->clearA, clearD, clearS); - else - FX_grBufferClear(fxMesa->clearC, fxMesa->clearA, clearD); - if (!ctx->Depth.Mask) { - FX_grDepthMask(FXFALSE); - } - break; - case DD_DEPTH_BIT: - /* just the depth buffer */ - FX_grRenderBuffer(GR_BUFFER_BACKBUFFER); - FX_grColorMask(FXFALSE,FXFALSE); - FX_grDepthMask(FXTRUE); - if (mask & DD_STENCIL_BIT) - FX_grBufferClearExt(fxMesa->clearC, fxMesa->clearA, clearD, clearS); - else - FX_grBufferClear(fxMesa->clearC, fxMesa->clearA, clearD); - FX_grColorMask(FXTRUE, ctx->Color.ColorMask[ACOMP] && fxMesa->haveAlphaBuffer); - if (ctx->Color.DrawDestMask & FRONT_LEFT_BIT) - FX_grRenderBuffer(GR_BUFFER_FRONTBUFFER); - break; - default: - /* error */ - ; - } - - if (fxMesa->haveHwStencil && ctx->Stencil.Enabled) { - /* restore stencil state to as it was before the clear */ - FX_grEnable(GR_STENCIL_MODE_EXT); - FX_grStencilMask(ctx->Stencil.WriteMask); - FX_grStencilFunc(ctx->Stencil.Function - GL_NEVER, - ctx->Stencil.Ref, ctx->Stencil.ValueMask); - } - - return softwareMask; -} - - -/* Set the buffer used for drawing */ -/* XXX support for separate read/draw buffers hasn't been tested */ -static GLboolean fxDDSetDrawBuffer(GLcontext *ctx, GLenum mode) -{ - fxMesaContext fxMesa=(fxMesaContext)ctx->DriverCtx; - - if (MESA_VERBOSE&VERBOSE_DRIVER) { - fprintf(stderr,"fxmesa: fxDDSetBuffer(%x)\n", (int) mode); - } - - if (mode == GL_FRONT_LEFT) { - fxMesa->currentFB = GR_BUFFER_FRONTBUFFER; - FX_grRenderBuffer(fxMesa->currentFB); - return GL_TRUE; - } - else if (mode == GL_BACK_LEFT) { - fxMesa->currentFB = GR_BUFFER_BACKBUFFER; - FX_grRenderBuffer(fxMesa->currentFB); - return GL_TRUE; - } - else if (mode == GL_NONE) { - FX_grColorMask(FXFALSE,FXFALSE); - return GL_TRUE; - } - else { - return GL_FALSE; - } -} - - -/* Set the buffer used for reading */ -/* XXX support for separate read/draw buffers hasn't been tested */ -static void fxDDSetReadBuffer(GLcontext *ctx, GLframebuffer *buffer, - GLenum mode ) -{ - fxMesaContext fxMesa=(fxMesaContext)ctx->DriverCtx; - (void) buffer; - - if (MESA_VERBOSE&VERBOSE_DRIVER) { - fprintf(stderr,"fxmesa: fxDDSetBuffer(%x)\n", (int) mode); - } - - if (mode == GL_FRONT_LEFT) { - fxMesa->currentFB = GR_BUFFER_FRONTBUFFER; - FX_grRenderBuffer(fxMesa->currentFB); - } - else if (mode == GL_BACK_LEFT) { - fxMesa->currentFB = GR_BUFFER_BACKBUFFER; - FX_grRenderBuffer(fxMesa->currentFB); - } -} - - -/* - * These functions just set new-state flags. The exact state - * values will be evaluated later. - */ -static void -fxDDStencilFunc(GLcontext *ctx, GLenum func, GLint ref, GLuint mask) -{ - fxMesaContext fxMesa = FX_CONTEXT(ctx); - (void) func; (void) ref; (void) mask; - fxMesa->new_state |= FX_NEW_STENCIL; - ctx->Driver.RenderStart = fxSetupFXUnits; -} - -static void -fxDDStencilMask(GLcontext *ctx, GLuint mask) -{ - fxMesaContext fxMesa = FX_CONTEXT(ctx); - (void) mask; - fxMesa->new_state |= FX_NEW_STENCIL; - ctx->Driver.RenderStart = fxSetupFXUnits; -} - -static void -fxDDStencilOp(GLcontext *ctx, GLenum sfail, GLenum zfail, GLenum zpass) -{ - fxMesaContext fxMesa = FX_CONTEXT(ctx); - (void) sfail; (void) zfail; (void) zpass; - fxMesa->new_state |= FX_NEW_STENCIL; - ctx->Driver.RenderStart = fxSetupFXUnits; -} - -static void -fxDDDepthFunc(GLcontext *ctx, GLenum func) -{ - fxMesaContext fxMesa = FX_CONTEXT(ctx); - (void) func; - fxMesa->new_state |= FX_NEW_DEPTH; - ctx->Driver.RenderStart = fxSetupFXUnits; -} - -static void -fxDDDepthMask(GLcontext *ctx, GLboolean mask) -{ - fxMesaContext fxMesa = FX_CONTEXT(ctx); - (void) mask; - fxMesa->new_state |= FX_NEW_DEPTH; - ctx->Driver.RenderStart = fxSetupFXUnits; -} - - - - -#ifdef XF86DRI -/* test if window coord (px,py) is visible */ -static GLboolean inClipRects(fxMesaContext fxMesa, int px, int py) -{ - int i; - for (i=0; inumClipRects; i++) { - if ((px>=fxMesa->pClipRects[i].x1) && - (pxpClipRects[i].x2) && - (py>=fxMesa->pClipRects[i].y1) && - (pypClipRects[i].y2)) return GL_TRUE; - } - return GL_FALSE; -} -#endif - - - -static GLboolean -bitmap_R5G6B5(GLcontext *ctx, GLint px, GLint py, - GLsizei width, GLsizei height, - const struct gl_pixelstore_attrib *unpack, - const GLubyte *bitmap) -{ - fxMesaContext fxMesa=(fxMesaContext)ctx->DriverCtx; - GrLfbInfo_t info; - FxU16 color; - const struct gl_pixelstore_attrib *finalUnpack; - struct gl_pixelstore_attrib scissoredUnpack; - - /* check if there's any raster operations enabled which we can't handle */ - if (ctx->RasterMask & (ALPHATEST_BIT | - BLEND_BIT | - DEPTH_BIT | - FOG_BIT | - LOGIC_OP_BIT | - SCISSOR_BIT | - STENCIL_BIT | - MASKING_BIT | - ALPHABUF_BIT | - MULTI_DRAW_BIT)) - return GL_FALSE; - - if (ctx->Scissor.Enabled) { - /* This is a bit tricky, but by carefully adjusting the px, py, - * width, height, skipPixels and skipRows values we can do - * scissoring without special code in the rendering loop. - */ - - /* we'll construct a new pixelstore struct */ - finalUnpack = &scissoredUnpack; - scissoredUnpack = *unpack; - if (scissoredUnpack.RowLength == 0) - scissoredUnpack.RowLength = width; - - /* clip left */ - if (px < ctx->Scissor.X) { - scissoredUnpack.SkipPixels += (ctx->Scissor.X - px); - width -= (ctx->Scissor.X - px); - px = ctx->Scissor.X; - } - /* clip right */ - if (px + width >= ctx->Scissor.X + ctx->Scissor.Width) { - width -= (px + width - (ctx->Scissor.X + ctx->Scissor.Width)); - } - /* clip bottom */ - if (py < ctx->Scissor.Y) { - scissoredUnpack.SkipRows += (ctx->Scissor.Y - py); - height -= (ctx->Scissor.Y - py); - py = ctx->Scissor.Y; - } - /* clip top */ - if (py + height >= ctx->Scissor.Y + ctx->Scissor.Height) { - height -= (py + height - (ctx->Scissor.Y + ctx->Scissor.Height)); - } - - if (width <= 0 || height <= 0) - return GL_TRUE; /* totally scissored away */ - } - else { - finalUnpack = unpack; - } - - /* compute pixel value */ - { - GLint r = (GLint) (ctx->Current.RasterColor[0] * 255.0f); - GLint g = (GLint) (ctx->Current.RasterColor[1] * 255.0f); - GLint b = (GLint) (ctx->Current.RasterColor[2] * 255.0f); - /*GLint a = (GLint)(ctx->Current.RasterColor[3]*255.0f);*/ - if (fxMesa->bgrOrder) - color = (FxU16) - ( ((FxU16)0xf8 & b) << (11-3)) | - ( ((FxU16)0xfc & g) << (5-3+1)) | - ( ((FxU16)0xf8 & r) >> 3); - else - color = (FxU16) - ( ((FxU16)0xf8 & r) << (11-3)) | - ( ((FxU16)0xfc & g) << (5-3+1)) | - ( ((FxU16)0xf8 & b) >> 3); - } - - info.size = sizeof(info); - if (!FX_grLfbLock(GR_LFB_WRITE_ONLY, - fxMesa->currentFB, - GR_LFBWRITEMODE_565, - GR_ORIGIN_UPPER_LEFT, - FXFALSE, - &info)) { -#ifndef FX_SILENT - fprintf(stderr,"fx Driver: error locking the linear frame buffer\n"); -#endif - return GL_TRUE; - } - -#ifdef XF86DRI -#define INSIDE(c, x, y) inClipRects((c), (x), (y)) -#else -#define INSIDE(c, x, y) (1) -#endif - - { - const GLint winX = fxMesa->x_offset; - const GLint winY = fxMesa->y_offset + fxMesa->height - 1; - /* The dest stride depends on the hardware and whether we're drawing - * to the front or back buffer. This compile-time test seems to do - * the job for now. - */ -#ifdef XF86DRI - const GLint dstStride = (fxMesa->glCtx->Color.DrawBuffer == GL_FRONT) - ? (fxMesa->screen_width) : (info.strideInBytes / 2); -#else - const GLint dstStride = info.strideInBytes / 2; /* stride in GLushorts */ -#endif - GLint row; - /* compute dest address of bottom-left pixel in bitmap */ - GLushort *dst = (GLushort *) info.lfbPtr - + (winY - py) * dstStride - + (winX + px); - - for (row = 0; row < height; row++) { - const GLubyte *src = (const GLubyte *) _mesa_image_address( finalUnpack, - bitmap, width, height, GL_COLOR_INDEX, GL_BITMAP, 0, row, 0 ); - if (finalUnpack->LsbFirst) { - /* least significan bit first */ - GLubyte mask = 1U << (finalUnpack->SkipPixels & 0x7); - GLint col; - for (col=0; col> (finalUnpack->SkipPixels & 0x7); - GLint col; - for (col=0; col> 1; - } - } - if (mask != 128) - src++; - } - dst -= dstStride; - } - } - -#undef INSIDE - - FX_grLfbUnlock(GR_LFB_WRITE_ONLY,fxMesa->currentFB); - return GL_TRUE; -} - - -static GLboolean -bitmap_R8G8B8A8(GLcontext *ctx, GLint px, GLint py, - GLsizei width, GLsizei height, - const struct gl_pixelstore_attrib *unpack, - const GLubyte *bitmap) -{ - fxMesaContext fxMesa=(fxMesaContext)ctx->DriverCtx; - GrLfbInfo_t info; - GrLfbWriteMode_t mode; - /*FxU16 color;*/ - GLuint color; - const struct gl_pixelstore_attrib *finalUnpack; - struct gl_pixelstore_attrib scissoredUnpack; - - /* check if there's any raster operations enabled which we can't handle */ - if (ctx->RasterMask & (ALPHATEST_BIT | - BLEND_BIT | - DEPTH_BIT | - FOG_BIT | - LOGIC_OP_BIT | - SCISSOR_BIT | - STENCIL_BIT | - MASKING_BIT | - ALPHABUF_BIT | - MULTI_DRAW_BIT)) - return GL_FALSE; - - if (ctx->Scissor.Enabled) { - /* This is a bit tricky, but by carefully adjusting the px, py, - * width, height, skipPixels and skipRows values we can do - * scissoring without special code in the rendering loop. - */ - - /* we'll construct a new pixelstore struct */ - finalUnpack = &scissoredUnpack; - scissoredUnpack = *unpack; - if (scissoredUnpack.RowLength == 0) - scissoredUnpack.RowLength = width; - - /* clip left */ - if (px < ctx->Scissor.X) { - scissoredUnpack.SkipPixels += (ctx->Scissor.X - px); - width -= (ctx->Scissor.X - px); - px = ctx->Scissor.X; - } - /* clip right */ - if (px + width >= ctx->Scissor.X + ctx->Scissor.Width) { - width -= (px + width - (ctx->Scissor.X + ctx->Scissor.Width)); - } - /* clip bottom */ - if (py < ctx->Scissor.Y) { - scissoredUnpack.SkipRows += (ctx->Scissor.Y - py); - height -= (ctx->Scissor.Y - py); - py = ctx->Scissor.Y; - } - /* clip top */ - if (py + height >= ctx->Scissor.Y + ctx->Scissor.Height) { - height -= (py + height - (ctx->Scissor.Y + ctx->Scissor.Height)); - } - - if (width <= 0 || height <= 0) - return GL_TRUE; /* totally scissored away */ - } - else { - finalUnpack = unpack; - } - - /* compute pixel value */ - { - GLint r = (GLint) (ctx->Current.RasterColor[0] * 255.0f); - GLint g = (GLint) (ctx->Current.RasterColor[1] * 255.0f); - GLint b = (GLint) (ctx->Current.RasterColor[2] * 255.0f); - GLint a = (GLint) (ctx->Current.RasterColor[3] * 255.0f); - if (fxMesa->glCtx->Color.DrawBuffer == GL_FRONT) - color = PACK_BGRA32(r, g, b, a); - else - color = PACK_RGBA32(r, g, b, a); - } - - if (fxMesa->glCtx->Color.DrawBuffer == GL_FRONT) - mode = GR_LFBWRITEMODE_8888; - else - mode = GR_LFBWRITEMODE_888; - - info.size = sizeof(info); - if (!FX_grLfbLock(GR_LFB_WRITE_ONLY, - fxMesa->currentFB, - mode, - GR_ORIGIN_UPPER_LEFT, - FXFALSE, - &info)) { -#ifndef FX_SILENT - fprintf(stderr,"fx Driver: error locking the linear frame buffer\n"); -#endif - return GL_TRUE; - } - -#ifdef XF86DRI -#define INSIDE(c, x, y) inClipRects((c), (x), (y)) -#else -#define INSIDE(c, x, y) (1) -#endif - - { - const GLint winX = fxMesa->x_offset; - const GLint winY = fxMesa->y_offset + fxMesa->height - 1; - GLint dstStride; - GLuint *dst; - GLint row; - - if (fxMesa->glCtx->Color.DrawBuffer == GL_FRONT) { - dstStride = fxMesa->screen_width; - dst = (GLuint *) info.lfbPtr + (winY - py) * dstStride + (winX + px); - } - else { - dstStride = info.strideInBytes / 4; - dst = (GLuint *) info.lfbPtr + (winY - py) * dstStride + (winX + px); - } - - /* compute dest address of bottom-left pixel in bitmap */ - for (row = 0; row < height; row++) { - const GLubyte *src = (const GLubyte *) _mesa_image_address( finalUnpack, - bitmap, width, height, GL_COLOR_INDEX, GL_BITMAP, 0, row, 0 ); - if (finalUnpack->LsbFirst) { - /* least significan bit first */ - GLubyte mask = 1U << (finalUnpack->SkipPixels & 0x7); - GLint col; - for (col=0; col> (finalUnpack->SkipPixels & 0x7); - GLint col; - for (col=0; col> 1; - } - } - if (mask != 128) - src++; - } - dst -= dstStride; - } - } - -#undef INSIDE - - FX_grLfbUnlock(GR_LFB_WRITE_ONLY,fxMesa->currentFB); - return GL_TRUE; -} - - -static GLboolean -readpixels_R5G6B5( GLcontext *ctx, GLint x, GLint y, - GLsizei width, GLsizei height, - GLenum format, GLenum type, - const struct gl_pixelstore_attrib *packing, - GLvoid *dstImage ) -{ - if (ctx->Pixel.ScaleOrBiasRGBA || ctx->Pixel.MapColorFlag) { - return GL_FALSE; /* can't do this */ - } - else { - fxMesaContext fxMesa=(fxMesaContext)ctx->DriverCtx; - GrLfbInfo_t info; - GLboolean result = GL_FALSE; - - BEGIN_BOARD_LOCK(); - info.size=sizeof(info); - if (grLfbLock(GR_LFB_READ_ONLY, - fxMesa->currentFB, - GR_LFBWRITEMODE_ANY, - GR_ORIGIN_UPPER_LEFT, - FXFALSE, - &info)) { - const GLint winX = fxMesa->x_offset; - const GLint winY = fxMesa->y_offset + fxMesa->height - 1; -#ifdef XF86DRI - const GLint srcStride = (fxMesa->glCtx->Color.DrawBuffer == GL_FRONT) - ? (fxMesa->screen_width) : (info.strideInBytes / 2); -#else - const GLint srcStride = info.strideInBytes / 2; /* stride in GLushorts */ -#endif - const GLushort *src = (const GLushort *) info.lfbPtr - + (winY - y) * srcStride + (winX + x); - GLubyte *dst = (GLubyte *) _mesa_image_address(packing, dstImage, - width, height, format, type, 0, 0, 0); - GLint dstStride = _mesa_image_row_stride(packing, width, format, type); - - if (format == GL_RGB && type == GL_UNSIGNED_BYTE) { - /* convert 5R6G5B into 8R8G8B */ - GLint row, col; - const GLint halfWidth = width >> 1; - const GLint extraPixel = (width & 1); - for (row = 0; row < height; row++) { - GLubyte *d = dst; - for (col = 0; col < halfWidth; col++) { - const GLuint pixel = ((const GLuint *) src)[col]; - const GLint pixel0 = pixel & 0xffff; - const GLint pixel1 = pixel >> 16; - *d++ = FX_PixelToR[pixel0]; - *d++ = FX_PixelToG[pixel0]; - *d++ = FX_PixelToB[pixel0]; - *d++ = FX_PixelToR[pixel1]; - *d++ = FX_PixelToG[pixel1]; - *d++ = FX_PixelToB[pixel1]; - } - if (extraPixel) { - GLushort pixel = src[width-1]; - *d++ = FX_PixelToR[pixel]; - *d++ = FX_PixelToG[pixel]; - *d++ = FX_PixelToB[pixel]; - } - dst += dstStride; - src -= srcStride; - } - result = GL_TRUE; - } - else if (format == GL_RGBA && type == GL_UNSIGNED_BYTE) { - /* convert 5R6G5B into 8R8G8B8A */ - GLint row, col; - const GLint halfWidth = width >> 1; - const GLint extraPixel = (width & 1); - for (row = 0; row < height; row++) { - GLubyte *d = dst; - for (col = 0; col < halfWidth; col++) { - const GLuint pixel = ((const GLuint *) src)[col]; - const GLint pixel0 = pixel & 0xffff; - const GLint pixel1 = pixel >> 16; - *d++ = FX_PixelToR[pixel0]; - *d++ = FX_PixelToG[pixel0]; - *d++ = FX_PixelToB[pixel0]; - *d++ = 255; - *d++ = FX_PixelToR[pixel1]; - *d++ = FX_PixelToG[pixel1]; - *d++ = FX_PixelToB[pixel1]; - *d++ = 255; - } - if (extraPixel) { - const GLushort pixel = src[width-1]; - *d++ = FX_PixelToR[pixel]; - *d++ = FX_PixelToG[pixel]; - *d++ = FX_PixelToB[pixel]; - *d++ = 255; - } - dst += dstStride; - src -= srcStride; - } - result = GL_TRUE; - } - else if (format == GL_RGB && type == GL_UNSIGNED_SHORT_5_6_5) { - /* directly memcpy 5R6G5B pixels into client's buffer */ - const GLint widthInBytes = width * 2; - GLint row; - for (row = 0; row < height; row++) { - MEMCPY(dst, src, widthInBytes); - dst += dstStride; - src -= srcStride; - } - result = GL_TRUE; - } - else { - result = GL_FALSE; - } - - grLfbUnlock(GR_LFB_READ_ONLY, fxMesa->currentFB); - } - END_BOARD_LOCK(); - return result; - } -} - - - -static void fxDDFinish(GLcontext *ctx) -{ - FX_grFlush(); -} - - -static GLint fxDDGetParameteri(const GLcontext *ctx, GLint param) -{ - switch(param) { - case DD_HAVE_HARDWARE_FOG: - return 1; - default: - fprintf(stderr,"fx Driver: internal error in fxDDGetParameteri(): %x\n", (int) param); - fxCloseHardware(); - exit(-1); - return 0; - } -} - - -void fxDDSetNearFar(GLcontext *ctx, GLfloat n, GLfloat f) -{ - FX_CONTEXT(ctx)->new_state |= FX_NEW_FOG; - ctx->Driver.RenderStart = fxSetupFXUnits; -} - -/* KW: Put the word Mesa in the render string because quakeworld - * checks for this rather than doing a glGet(GL_MAX_TEXTURE_SIZE). - * Why? - */ -static const GLubyte *fxDDGetString(GLcontext *ctx, GLenum name) -{ -#if defined(GLX_DIRECT_RENDERING) - /* Building for DRI driver */ - switch (name) { - case GL_RENDERER: - { - static char buffer[100]; - char hardware[100]; - strcpy(hardware, grGetString(GR_HARDWARE)); - if (strcmp(hardware, "Voodoo3 (tm)") == 0) - strcpy(hardware, "Voodoo3"); - else if (strcmp(hardware, "Voodoo Banshee (tm)") == 0) - strcpy(hardware, "VoodooBanshee"); - else { - /* unexpected result: replace spaces with hyphens */ - int i; - for (i = 0; hardware[i]; i++) { - if (hardware[i] == ' ' || hardware[i] == '\t') - hardware[i] = '-'; - } - } - /* now make the GL_RENDERER string */ - sprintf(buffer, "Mesa DRI %s 20000616", hardware); - return buffer; - } - case GL_VENDOR: - return "Precision Insight, Inc."; - default: - return NULL; - } - -#else - - /* Building for Voodoo1/2 stand-alone Mesa */ - switch (name) { - case GL_RENDERER: - { - static char buf[80]; - - if (glbHWConfig.SSTs[glbCurrentBoard].type==GR_SSTTYPE_VOODOO) { - GrVoodooConfig_t *vc = - &glbHWConfig.SSTs[glbCurrentBoard].sstBoard.VoodooConfig; - - sprintf(buf, - "Mesa Glide v0.30 Voodoo_Graphics %d " - "CARD/%d FB/%d TM/%d TMU/%s", - glbCurrentBoard, - (vc->sliDetect ? (vc->fbRam*2) : vc->fbRam), - (vc->tmuConfig[GR_TMU0].tmuRam + - ((vc->nTexelfx>1) ? vc->tmuConfig[GR_TMU1].tmuRam : 0)), - vc->nTexelfx, - (vc->sliDetect ? "SLI" : "NOSLI")); - } - else if (glbHWConfig.SSTs[glbCurrentBoard].type==GR_SSTTYPE_SST96) { - GrSst96Config_t *sc = - &glbHWConfig.SSTs[glbCurrentBoard].sstBoard.SST96Config; - - sprintf(buf, - "Glide v0.30 Voodoo_Rush %d " - "CARD/%d FB/%d TM/%d TMU/NOSLI", - glbCurrentBoard, - sc->fbRam, - sc->tmuConfig.tmuRam, - sc->nTexelfx); - } - else { - strcpy(buf, "Glide v0.30 UNKNOWN"); - } - return (GLubyte *) buf; - } - default: - return NULL; - } -#endif -} - - -int fxDDInitFxMesaContext( fxMesaContext fxMesa ) -{ - /* Get Glide3vn function pointers */ - { - void *handle; - handle = dlopen(NULL, RTLD_NOW | RTLD_GLOBAL); - if (!handle) - return 0; - grStencilFuncPtr = dlsym(handle, "grStencilFunc"); - grStencilMaskPtr = dlsym(handle, "grStencilMask"); - grStencilOpPtr = dlsym(handle, "grStencilOp"); - grBufferClearExtPtr = dlsym(handle, "grBufferClearExt"); - /* call dlclose()? */ - } - - - FX_setupGrVertexLayout(); - - if (getenv("FX_EMULATE_SINGLE_TMU")) - fxMesa->haveTwoTMUs = GL_FALSE; - - fxMesa->emulateTwoTMUs = fxMesa->haveTwoTMUs; - - if (!getenv("FX_DONT_FAKE_MULTITEX")) - fxMesa->emulateTwoTMUs = GL_TRUE; - - if(getenv("FX_GLIDE_SWAPINTERVAL")) - fxMesa->swapInterval=atoi(getenv("FX_GLIDE_SWAPINTERVAL")); - else - fxMesa->swapInterval=1; - - if(getenv("MESA_FX_SWAP_PENDING")) - fxMesa->maxPendingSwapBuffers=atoi(getenv("MESA_FX_SWAP_PENDING")); - else - fxMesa->maxPendingSwapBuffers=2; - - if(getenv("MESA_FX_INFO")) - fxMesa->verbose=GL_TRUE; - else - fxMesa->verbose=GL_FALSE; - - fxMesa->depthClear = FX_grGetInteger(FX_ZDEPTH_MAX); - - fxMesa->color=0xffffffff; - fxMesa->clearC=0; - fxMesa->clearA=0; - - fxMesa->stats.swapBuffer=0; - fxMesa->stats.reqTexUpload=0; - fxMesa->stats.texUpload=0; - fxMesa->stats.memTexUpload=0; - - fxMesa->tmuSrc=FX_TMU_NONE; - fxTMInit(fxMesa); - - /* FX units setup */ - - fxMesa->unitsState.alphaTestEnabled=GL_FALSE; - fxMesa->unitsState.alphaTestFunc=GR_CMP_ALWAYS; - fxMesa->unitsState.alphaTestRefValue=0; - - fxMesa->unitsState.blendEnabled=GL_FALSE; - fxMesa->unitsState.blendSrcFuncRGB=GR_BLEND_ONE; - fxMesa->unitsState.blendDstFuncRGB=GR_BLEND_ZERO; - fxMesa->unitsState.blendSrcFuncAlpha=GR_BLEND_ONE; - fxMesa->unitsState.blendDstFuncAlpha=GR_BLEND_ZERO; - - /* - fxMesa->unitsState.depthTestEnabled =GL_FALSE; - fxMesa->unitsState.depthMask =GL_TRUE; - fxMesa->unitsState.depthTestFunc =GR_CMP_LESS; - */ - - FX_grColorMask(FXTRUE, fxMesa->haveAlphaBuffer ? FXTRUE : FXFALSE); - if (fxMesa->glVis->DBflag) { - fxMesa->currentFB = GR_BUFFER_BACKBUFFER; - FX_grRenderBuffer(GR_BUFFER_BACKBUFFER); - } - else { - fxMesa->currentFB = GR_BUFFER_FRONTBUFFER; - FX_grRenderBuffer(GR_BUFFER_FRONTBUFFER); - } - - fxMesa->state = NULL; - fxMesa->fogTable = NULL; - - fxMesa->state = malloc(FX_grGetInteger(FX_GLIDE_STATE_SIZE)); - fxMesa->fogTable = malloc(FX_grGetInteger(FX_FOG_TABLE_ENTRIES)*sizeof(GrFog_t)); - - if (!fxMesa->state || !fxMesa->fogTable) { - if (fxMesa->state) free(fxMesa->state); - if (fxMesa->fogTable) free(fxMesa->fogTable); - return 0; - } - - if (fxMesa->glVis->DepthBits > 0) - FX_grDepthBufferMode(GR_DEPTHBUFFER_ZBUFFER); - -#if (!FXMESA_USE_ARGB) - FX_grLfbWriteColorFormat(GR_COLORFORMAT_ABGR); /* Not every Glide has this */ -#endif - - fxMesa->textureAlign=FX_grGetInteger(FX_TEXTURE_ALIGN); - fxMesa->glCtx->Const.MaxTextureLevels=9; - fxMesa->glCtx->Const.MaxTextureSize=256; - fxMesa->glCtx->Const.MaxTextureUnits=fxMesa->emulateTwoTMUs ? 2 : 1; - fxMesa->glCtx->NewState|=NEW_DRVSTATE1; - fxMesa->new_state = NEW_ALL; - - fxDDSetupInit(); - fxDDCvaInit(); - fxDDClipInit(); - fxDDTrifuncInit(); - fxDDFastPathInit(); - - fxSetupDDPointers(fxMesa->glCtx); - fxDDRenderInit(fxMesa->glCtx); - fxDDInitExtensions(fxMesa->glCtx); - - fxDDSetNearFar(fxMesa->glCtx,1.0,100.0); - - FX_grGlideGetState((GrState*)fxMesa->state); - - /* XXX Fix me: callback not registered when main VB is created. - */ - if (fxMesa->glCtx->VB) - fxDDRegisterVB( fxMesa->glCtx->VB ); - - /* XXX Fix me too: need to have the 'struct dd' prepared prior to - * creating the context... The below is broken if you try to insert - * new stages. - */ - if (fxMesa->glCtx->NrPipelineStages) - fxMesa->glCtx->NrPipelineStages = fxDDRegisterPipelineStages( - fxMesa->glCtx->PipelineStage, - fxMesa->glCtx->PipelineStage, - fxMesa->glCtx->NrPipelineStages); - - /* this little bit ensures that all Glide state gets initialized */ - fxMesa->new_state = NEW_ALL; - fxMesa->glCtx->Driver.RenderStart = fxSetupFXUnits; - - /* Run the config file */ - gl_context_initialize( fxMesa->glCtx ); - - return 1; -} - - -#if 0 -/* Example extension function */ -static void fxFooBarEXT(GLint i) -{ - printf("You called glFooBarEXT(%d)\n", i); -} -#endif - - -void fxDDInitExtensions( GLcontext *ctx ) -{ - fxMesaContext fxMesa=(fxMesaContext)ctx->DriverCtx; - - gl_extensions_disable(ctx, "GL_EXT_blend_logic_op"); - gl_extensions_disable(ctx, "GL_EXT_blend_minmax"); - gl_extensions_disable(ctx, "GL_EXT_blend_subtract"); - gl_extensions_disable(ctx, "GL_EXT_blend_color"); - - gl_extensions_add(ctx, DEFAULT_ON, "3DFX_set_global_palette", 0); - - if (!fxMesa->haveTwoTMUs) - gl_extensions_disable(ctx, "GL_EXT_texture_env_add"); - - if (!fxMesa->emulateTwoTMUs) - gl_extensions_disable(ctx, "GL_ARB_multitexture"); - - - /* Example of hooking in an extension function. - * For DRI-based drivers, also see __driRegisterExtensions in the - * tdfx_xmesa.c file. - */ -#if 0 - { - void **dispatchTable = (void **) ctx->Exec; - const int _gloffset_FooBarEXT = 555; /* just an example number! */ - const int tabSize = _glapi_get_dispatch_table_size(); - assert(_gloffset_FooBarEXT < tabSize); - dispatchTable[_gloffset_FooBarEXT] = (void *) fxFooBarEXT; - /* XXX You would also need to hook into the display list dispatch - * table. Really, the implementation of extensions might as well - * be in the core of Mesa since core Mesa and the device driver - * is one big shared lib. - */ - } -#endif -} - - -/************************************************************************/ -/************************************************************************/ -/************************************************************************/ - -/* Check if the hardware supports the current context - * - * Performs similar work to fxDDChooseRenderState() - should be merged. - */ -static GLboolean fxIsInHardware(GLcontext *ctx) -{ - fxMesaContext fxMesa=(fxMesaContext)ctx->DriverCtx; - - if (!ctx->Hint.AllowDrawMem) - return GL_TRUE; /* you'll take it and like it */ - - if(((ctx->Color.BlendEnabled) && (ctx->Color.BlendEquation!=GL_FUNC_ADD_EXT)) || - ((ctx->Color.ColorLogicOpEnabled) && (ctx->Color.LogicOp!=GL_COPY)) || - (ctx->Light.Model.ColorControl==GL_SEPARATE_SPECULAR_COLOR) || - (!((ctx->Color.ColorMask[RCOMP]==ctx->Color.ColorMask[GCOMP]) && - (ctx->Color.ColorMask[GCOMP]==ctx->Color.ColorMask[BCOMP]) && - (ctx->Color.ColorMask[ACOMP]==ctx->Color.ColorMask[ACOMP]))) - ) - { - return GL_FALSE; - } - /* Unsupported texture/multitexture cases */ - - if(fxMesa->emulateTwoTMUs) { - if((ctx->Enabled & (TEXTURE0_3D | TEXTURE1_3D)) || - /* Not very well written ... */ - ((ctx->Enabled & (TEXTURE0_1D | TEXTURE1_1D)) && - ((ctx->Enabled & (TEXTURE0_2D | TEXTURE1_2D))!=(TEXTURE0_2D | TEXTURE1_2D))) - ) { - return GL_FALSE; - } - - if (ctx->Texture.ReallyEnabled & TEXTURE0_2D) { - if (ctx->Texture.Unit[0].EnvMode == GL_BLEND && - (ctx->Texture.ReallyEnabled & TEXTURE1_2D || - ctx->Texture.Unit[0].EnvColor[0] != 0 || - ctx->Texture.Unit[0].EnvColor[1] != 0 || - ctx->Texture.Unit[0].EnvColor[2] != 0 || - ctx->Texture.Unit[0].EnvColor[3] != 1)) { - return GL_FALSE; - } - if (ctx->Texture.Unit[0].Current->Image[0]->Border > 0) - return GL_FALSE; - } - - if (ctx->Texture.ReallyEnabled & TEXTURE1_2D) { - if (ctx->Texture.Unit[1].EnvMode == GL_BLEND) - return GL_FALSE; - if (ctx->Texture.Unit[0].Current->Image[0]->Border > 0) - return GL_FALSE; - } - - if (MESA_VERBOSE & (VERBOSE_DRIVER|VERBOSE_TEXTURE)) - fprintf(stderr, "fxMesa: fxIsInHardware, envmode is %s/%s\n", - gl_lookup_enum_by_nr(ctx->Texture.Unit[0].EnvMode), - gl_lookup_enum_by_nr(ctx->Texture.Unit[1].EnvMode)); - - /* KW: This was wrong (I think) and I changed it... which doesn't mean - * it is now correct... - */ - if((ctx->Enabled & (TEXTURE0_1D | TEXTURE0_2D | TEXTURE0_3D)) && - (ctx->Enabled & (TEXTURE1_1D | TEXTURE1_2D | TEXTURE1_3D))) - { - /* Can't use multipass to blend a multitextured triangle - fall - * back to software. - */ - if (!fxMesa->haveTwoTMUs && ctx->Color.BlendEnabled) { - return GL_FALSE; - } - - if ((ctx->Texture.Unit[0].EnvMode!=ctx->Texture.Unit[1].EnvMode) && - (ctx->Texture.Unit[0].EnvMode!=GL_MODULATE) && - (ctx->Texture.Unit[0].EnvMode!=GL_REPLACE)) /* q2, seems ok... */ - { - if (MESA_VERBOSE&VERBOSE_DRIVER) - fprintf(stderr, "fxMesa: unsupported multitex env mode\n"); - return GL_FALSE; - } - } - } else { - if((ctx->Enabled & (TEXTURE1_1D | TEXTURE1_2D | TEXTURE1_3D)) || - /* Not very well written ... */ - ((ctx->Enabled & TEXTURE0_1D) && - (!(ctx->Enabled & TEXTURE0_2D))) - ) { - return GL_FALSE; - } - - - if((ctx->Texture.ReallyEnabled & TEXTURE0_2D) && - (ctx->Texture.Unit[0].EnvMode==GL_BLEND)) { - return GL_FALSE; - } - } - - if (ctx->Stencil.Enabled && !fxMesa->haveHwStencil) - return GL_FALSE; - - return GL_TRUE; -} - - - -#define INTERESTED (~(NEW_MODELVIEW|NEW_PROJECTION|NEW_PROJECTION|NEW_TEXTURE_MATRIX|NEW_USER_CLIP|NEW_CLIENT_STATE|NEW_TEXTURE_ENABLE)) - -static void fxDDUpdateDDPointers(GLcontext *ctx) -{ - fxMesaContext fxMesa=(fxMesaContext)ctx->DriverCtx; - GLuint new_state = ctx->NewState; - - if (MESA_VERBOSE&(VERBOSE_DRIVER|VERBOSE_STATE)) - fprintf(stderr,"fxmesa: fxDDUpdateDDPointers(...)\n"); - - if (new_state & (NEW_RASTER_OPS|NEW_TEXTURING)) - fxMesa->is_in_hardware = fxIsInHardware(ctx); - - if (fxMesa->is_in_hardware) { - if (fxMesa->new_state) - fxSetupFXUnits(ctx); - - if(new_state & INTERESTED) { - fxDDChooseRenderState( ctx ); - fxMesa->RenderVBTables=fxDDChooseRenderVBTables(ctx); - fxMesa->RenderVBClippedTab=fxMesa->RenderVBTables[0]; - fxMesa->RenderVBCulledTab=fxMesa->RenderVBTables[1]; - fxMesa->RenderVBRawTab=fxMesa->RenderVBTables[2]; - - ctx->Driver.RasterSetup=fxDDChooseSetupFunction(ctx); - } - - ctx->Driver.PointsFunc=fxMesa->PointsFunc; - ctx->Driver.LineFunc=fxMesa->LineFunc; - ctx->Driver.TriangleFunc=fxMesa->TriangleFunc; - ctx->Driver.QuadFunc=fxMesa->QuadFunc; - } else { - fxMesa->render_index = FX_FALLBACK; - } -} - -static void fxDDReducedPrimitiveChange(GLcontext *ctx, GLenum prim) -{ - if (ctx->Polygon.CullFlag) { - if (ctx->PB->primitive != GL_POLYGON) { /* Lines or Points */ - FX_grCullMode(GR_CULL_DISABLE); - FX_CONTEXT(ctx)->cullMode=GR_CULL_DISABLE; - } - } -} - - -void fxSetupDDPointers(GLcontext *ctx) -{ - fxMesaContext fxMesa = FX_CONTEXT(ctx); - - if (MESA_VERBOSE & VERBOSE_DRIVER) { - fprintf(stderr, "fxmesa: fxSetupDDPointers()\n"); - } - ctx->Driver.UpdateState = fxDDUpdateDDPointers; - ctx->Driver.ClearIndex = NULL; - ctx->Driver.ClearColor = fxDDClearColor; - ctx->Driver.Clear = fxDDClear; - ctx->Driver.Index = NULL; - ctx->Driver.Color = fxDDSetColor; - ctx->Driver.SetDrawBuffer = fxDDSetDrawBuffer; - ctx->Driver.SetReadBuffer = fxDDSetReadBuffer; - ctx->Driver.GetBufferSize = fxDDBufferSize; - ctx->Driver.Finish = fxDDFinish; - ctx->Driver.Flush = NULL; - ctx->Driver.GetString = fxDDGetString; - ctx->Driver.NearFar = fxDDSetNearFar; - ctx->Driver.GetParameteri = fxDDGetParameteri; - - ctx->Driver.WriteDepthSpan=fxDDWriteDepthSpan; - ctx->Driver.WriteDepthPixels=fxDDWriteDepthPixels; - ctx->Driver.ReadDepthSpan=fxDDReadDepthSpan; - ctx->Driver.ReadDepthPixels=fxDDReadDepthPixels; - - if (ctx->Visual->RedBits == 8 && - ctx->Visual->GreenBits == 8 && - ctx->Visual->BlueBits == 8 && - ctx->Visual->AlphaBits == 8) { - ctx->Driver.Bitmap = bitmap_R8G8B8A8; - ctx->Driver.DrawPixels = NULL; - ctx->Driver.ReadPixels = NULL; - } - else { - ctx->Driver.Bitmap = bitmap_R5G6B5; - ctx->Driver.DrawPixels = NULL; - ctx->Driver.ReadPixels = readpixels_R5G6B5; - } - - ctx->Driver.RenderStart=NULL; - ctx->Driver.RenderFinish=NULL; - - ctx->Driver.TexImage2D = fxDDTexImage2D; - ctx->Driver.TexSubImage2D = fxDDTexSubImage2D; - ctx->Driver.GetTexImage = fxDDGetTexImage; - ctx->Driver.TexEnv=fxDDTexEnv; - ctx->Driver.TexParameter=fxDDTexParam; - ctx->Driver.BindTexture=fxDDTexBind; - ctx->Driver.DeleteTexture=fxDDTexDel; - ctx->Driver.UpdateTexturePalette=fxDDTexPalette; - - ctx->Driver.RectFunc=NULL; - - if (fxMesa->haveHwStencil) { - ctx->Driver.StencilFunc = fxDDStencilFunc; - ctx->Driver.StencilMask = fxDDStencilMask; - ctx->Driver.StencilOp = fxDDStencilOp; - } - - ctx->Driver.AlphaFunc=fxDDAlphaFunc; - ctx->Driver.BlendFunc=fxDDBlendFunc; - ctx->Driver.DepthFunc=fxDDDepthFunc; - ctx->Driver.DepthMask=fxDDDepthMask; - ctx->Driver.ColorMask=fxDDColorMask; - ctx->Driver.Fogfv=fxDDFogfv; - ctx->Driver.Scissor=fxDDScissor; - ctx->Driver.FrontFace=fxDDFrontFace; - ctx->Driver.CullFace=fxDDCullFace; - ctx->Driver.ShadeModel=fxDDShadeModel; - ctx->Driver.Enable=fxDDEnable; - ctx->Driver.ReducedPrimitiveChange=fxDDReducedPrimitiveChange; - - ctx->Driver.RegisterVB=fxDDRegisterVB; - ctx->Driver.UnregisterVB=fxDDUnregisterVB; - - ctx->Driver.RegisterPipelineStages = fxDDRegisterPipelineStages; - - ctx->Driver.OptimizeImmediatePipeline = 0; /* nothing done yet */ - ctx->Driver.OptimizePrecalcPipeline = 0; - -/* if (getenv("MESA_USE_FAST") || getenv("FX_USE_FAST")) */ -/* ctx->Driver.OptimizePrecalcPipeline = fxDDOptimizePrecalcPipeline; */ - - if (!getenv("FX_NO_FAST")) - ctx->Driver.BuildPrecalcPipeline = fxDDBuildPrecalcPipeline; - - ctx->Driver.TriangleCaps = DD_TRI_CULL|DD_TRI_OFFSET|DD_TRI_LIGHT_TWOSIDE; - - fxSetupDDSpanPointers(ctx); - - FX_CONTEXT(ctx)->render_index = 1; /* force an update */ - fxDDUpdateDDPointers(ctx); -} - - - -#else - - -/* - * Need this to provide at least one external definition. - */ - -int gl_fx_dummy_function_dd(void) -{ - return 0; -} - -#endif /* FX */ - Index: xc/extras/Mesa/src/FX/fxddspan.c diff -u xc/extras/Mesa/src/FX/fxddspan.c:1.4 xc/extras/Mesa/src/FX/fxddspan.c:removed --- xc/extras/Mesa/src/FX/fxddspan.c:1.4 Fri Jun 16 20:02:33 2000 +++ xc/extras/Mesa/src/FX/fxddspan.c Mon Dec 18 14:21:51 2000 @@ -1,1825 +0,0 @@ -/* -*- mode: C; tab-width:8; c-basic-offset:2 -*- */ - -/* - * Mesa 3-D graphics library - * Version: 3.3 - * - * Copyright (C) 1999-2000 Brian Paul All Rights Reserved. - * - * 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 - * BRIAN PAUL 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. - * - * - * Original Mesa / 3Dfx device driver (C) 1999 David Bucciarelli, by the - * terms stated above. - * - * Thank you for your contribution, David! - * - * Please make note of the above copyright/license statement. If you - * contributed code or bug fixes to this code under the previous (GNU - * Library) license and object to the new license, your code will be - * removed at your request. Please see the Mesa docs/COPYRIGHT file - * for more information. - * - * Additional Mesa/3Dfx driver developers: - * Daryll Strauss - * Keith Whitwell - * - * See fxapi.h for more revision/author details. - */ - - -/* fxdd.c - 3Dfx VooDoo Mesa span and pixel functions */ - - -#include "fxdrv.h" - - - -/* - * Examine the cliprects to generate an array of flags to indicate - * which pixels in a span are visible. Note: (x,y) is a screen - * coordinate. - */ -static void -generate_vismask(const fxMesaContext fxMesa, GLint x, GLint y, GLint n, - GLubyte vismask[]) -{ - GLboolean initialized = GL_FALSE; - GLint i, j; - - /* turn on flags for all visible pixels */ - for (i = 0; i < fxMesa->numClipRects; i++) { - const XF86DRIClipRectPtr rect = &fxMesa->pClipRects[i]; - - if (y >= rect->y1 && y < rect->y2) { - if (x >= rect->x1 && x + n <= rect->x2) { - /* common case, whole span inside cliprect */ - MEMSET(vismask, 1, n); - return; - } - if (x < rect->x2 && x + n >= rect->x1) { - /* some of the span is inside the rect */ - GLint start, end; - if (!initialized) { - MEMSET(vismask, 0, n); - initialized = GL_TRUE; - } - if (x < rect->x1) - start = rect->x1 - x; - else - start = 0; - if (x + n > rect->x2) - end = rect->x2 - x; - else - end = n; - assert(start >= 0); - assert(end <= n); - for (j = start; j < end; j++) - vismask[j] = 1; - } - } - } -} - - -/* - * Examine cliprects and determine if the given screen pixel is visible. - */ -static GLboolean -visible_pixel(const fxMesaContext fxMesa, int scrX, int scrY) -{ - int i; - for (i = 0; i < fxMesa->numClipRects; i++) { - const XF86DRIClipRectPtr rect = &fxMesa->pClipRects[i]; - if (scrX >= rect->x1 && - scrX < rect->x2 && - scrY >= rect->y1 && - scrY < rect->y2) - return GL_TRUE; - } - return GL_FALSE; -} - - - -typedef enum { FBS_READ, FBS_WRITE } FBS_DIRECTION; -/* - * Read or write a single span from the frame buffer. - * Input Parameters: - * fxMesa: The context - * target_buffer: Which buffer to read from. - * xpos, ypos: Starting Coordinates. - * xlength: Length of the span. - * data_size: Size of data elements: 1, 2, or 4. - * buffer: Pointer to the buffer to read - * to or write from. This needs - * to be turned into a pointer. - * direction: Read or Write. - */ -static void -rw_fb_span(fxMesaContext fxMesa, - GrBuffer_t target_buffer, - FxU32 xpos, - FxU32 ypos, - FxU32 xlength, - FxU32 data_size, - void *buffer, - FBS_DIRECTION direction) -{ - GrLfbInfo_t info; - BEGIN_BOARD_LOCK(); - info.size=sizeof(info); - - if (grLfbLock(direction == FBS_READ ? GR_LFB_READ_ONLY : GR_LFB_WRITE_ONLY, - target_buffer, - GR_LFBWRITEMODE_ANY, - GR_ORIGIN_UPPER_LEFT, - FXFALSE, - &info)) { - const GLint winX = fxMesa->x_offset; - const GLint winY = fxMesa->y_offset + fxMesa->height - 1; -#ifdef XF86DRI - /* stride in data elements */ - const GLint srcStride = - (fxMesa->glCtx->Color.DrawBuffer == GL_FRONT) - ? (fxMesa->screen_width) - : (info.strideInBytes / data_size); -#else - /* stride in data elements */ - const GLint srcStride = info.strideInBytes / data_size; -#endif - GLushort *data16 = (GLushort *) info.lfbPtr - + (winY - ypos) * srcStride - + (winX + xpos); - GLubyte *target16 = (GLubyte *) buffer; - GLubyte *data8 = (GLubyte *) data16; - GLubyte *target8 = (GLubyte *) buffer; - GLuint *data32 = (GLuint *) data16; - GLuint *target32 = (GLuint *) buffer; - GLuint i, j; - - for (i = j = 0; i < xlength; i += 1, j += 1) { - switch (data_size) { - case 1: - switch (direction) { - case FBS_READ: - *target8++ = *data8++; - break; - case FBS_WRITE: - *data8++ = *target8++; - break; - } - break; - case 2: - switch (direction) { - case FBS_READ: - *target16++ = *data16++; - break; - case FBS_WRITE: - *data16++ = *target16++; - break; - } - break; - case 4: - switch (direction) { - case FBS_READ: - *target32++ = *data32++; - break; - case FBS_WRITE: - *data32++ = *target32++; - break; - } - break; - } - } - grLfbUnlock(direction == FBS_READ ? GR_LFB_READ_ONLY : GR_LFB_WRITE_ONLY, - target_buffer); - } - END_BOARD_LOCK(); -} - -static FxBool -fb_point_is_clipped(fxMesaContext fxMesa, - FxU32 dst_x, FxU32 dst_y) -{ - int i; - for (i=0; inumClipRects; i++) { - if ((dst_x>=fxMesa->pClipRects[i].x1) && - (dst_xpClipRects[i].x2) && - (dst_y>=fxMesa->pClipRects[i].y1) && - (dst_ypClipRects[i].y2)) { - return GL_FALSE; - } - } - return GL_TRUE; -} - -static FxBool writeRegionClipped(fxMesaContext fxMesa, GrBuffer_t dst_buffer, - FxU32 dst_x, FxU32 dst_y, GrLfbSrcFmt_t src_format, - FxU32 src_width, FxU32 src_height, FxI32 src_stride, - void *src_data) -{ - int i, x, w, srcElt; - void *data; - - if (src_width==1 && src_height==1) { /* Easy case writing a point */ - for (i=0; inumClipRects; i++) { - if ((dst_x>=fxMesa->pClipRects[i].x1) && - (dst_xpClipRects[i].x2) && - (dst_y>=fxMesa->pClipRects[i].y1) && - (dst_ypClipRects[i].y2)) { - FX_grLfbWriteRegion(dst_buffer, dst_x, dst_y, src_format, - 1, 1, src_stride, src_data); - return GL_TRUE; - } - } - } else if (src_height==1) { /* Writing a span */ - if (src_format==GR_LFB_SRC_FMT_8888) srcElt=4; - else if (src_format==GR_LFB_SRC_FMT_ZA16) srcElt=2; - else { - fprintf(stderr, "Unknown src_format passed to writeRegionClipped\n"); - return GL_FALSE; - } - for (i=0; inumClipRects; i++) { - if (dst_y>=fxMesa->pClipRects[i].y1 && dst_ypClipRects[i].y2) { - if (dst_xpClipRects[i].x1) { - x=fxMesa->pClipRects[i].x1; - data=((char*)src_data)+srcElt*(x - dst_x); - w=src_width-(x-dst_x); - } else { - x=dst_x; - data=src_data; - w=src_width; - } - if (x+w>fxMesa->pClipRects[i].x2) { - w=fxMesa->pClipRects[i].x2-x; - } - FX_grLfbWriteRegion(dst_buffer, x, dst_y, src_format, w, 1, - src_stride, data); - } - } - } else { /* Punt on the case of arbitrary rectangles */ - return GL_FALSE; - } - return GL_TRUE; -} - - - -/* KW: Rearranged the args in the call to grLfbWriteRegion(). - */ -#define LFB_WRITE_SPAN_MESA(dst_buffer, \ - dst_x, \ - dst_y, \ - src_width, \ - src_stride, \ - src_data) \ - writeRegionClipped(fxMesa, dst_buffer, \ - dst_x, \ - dst_y, \ - GR_LFB_SRC_FMT_8888, \ - src_width, \ - 1, \ - src_stride, \ - src_data) \ - - - - -/* - * 16bpp span/pixel functions - */ - -static void -write_R5G6B5_rgba_span(const GLcontext *ctx, GLuint n, GLint x, GLint y, - const GLubyte rgba[][4], const GLubyte mask[]) -{ - fxMesaContext fxMesa=(fxMesaContext)ctx->DriverCtx; - GLuint i; - GLint bottom=fxMesa->height+fxMesa->y_offset-1; - - if (MESA_VERBOSE&VERBOSE_DRIVER) { - fprintf(stderr,"fxmesa: fxDDWriteRGBASpan(...)\n"); - } - - x+=fxMesa->x_offset; - if (mask) { - int span=0; - - for (i=0;i 0) { - LFB_WRITE_SPAN_MESA( fxMesa->currentFB, x+i-span, bottom-y, - /* GR_LFB_SRC_FMT_8888,*/ span, /*1,*/ 0, (void *) rgba[i-span] ); - span = 0; - } - } - } - - if (span > 0) - LFB_WRITE_SPAN_MESA( fxMesa->currentFB, x+n-span, bottom-y, - /* GR_LFB_SRC_FMT_8888, */ span, /*1,*/ 0, (void *) rgba[n-span] ); - } else - LFB_WRITE_SPAN_MESA( fxMesa->currentFB, x, bottom-y,/* GR_LFB_SRC_FMT_8888,*/ - n,/* 1,*/ 0, (void *) rgba ); -} - - -static void -write_R5G6B5_rgb_span(const GLcontext *ctx, GLuint n, GLint x, GLint y, - const GLubyte rgb[][3], const GLubyte mask[]) -{ - fxMesaContext fxMesa=(fxMesaContext)ctx->DriverCtx; - GLuint i; - GLint bottom=fxMesa->height+fxMesa->y_offset-1; - GLubyte rgba[MAX_WIDTH][4]; - - if (MESA_VERBOSE&VERBOSE_DRIVER) { - fprintf(stderr,"fxmesa: fxDDWriteRGBSpan()\n"); - } - - x+=fxMesa->x_offset; - if (mask) { - int span=0; - - for (i=0;i 0) { - LFB_WRITE_SPAN_MESA( fxMesa->currentFB, x+i-span, bottom-y, - /*GR_LFB_SRC_FMT_8888,*/ span,/* 1,*/ 0, (void *) rgba ); - span = 0; - } - } - } - - if (span > 0) - LFB_WRITE_SPAN_MESA( fxMesa->currentFB, x+n-span, bottom-y, - /*GR_LFB_SRC_FMT_8888,*/ span,/* 1,*/ 0, (void *) rgba ); - } else { - for (i=0;icurrentFB, x, bottom-y,/* GR_LFB_SRC_FMT_8888,*/ - n,/* 1,*/ 0, (void *) rgba ); - } -} - - -static void -write_R5G6B5_mono_span(const GLcontext *ctx, GLuint n, GLint x, GLint y, - const GLubyte mask[]) -{ - fxMesaContext fxMesa=(fxMesaContext)ctx->DriverCtx; - GLuint i; - GLint bottom=fxMesa->height+fxMesa->y_offset-1; - GLuint data[MAX_WIDTH]; - - if (MESA_VERBOSE&VERBOSE_DRIVER) { - fprintf(stderr,"fxmesa: fxDDWriteMonoRGBASpan(...)\n"); - } - - x+=fxMesa->x_offset; - if (mask) { - int span=0; - - for (i=0;icolor; - ++span; - } else { - if (span > 0) { - writeRegionClipped(fxMesa, fxMesa->currentFB, x+i-span, bottom-y, - GR_LFB_SRC_FMT_8888, span, 1, 0, - (void *) data ); - span = 0; - } - } - } - - if (span > 0) - writeRegionClipped(fxMesa, fxMesa->currentFB, x+n-span, bottom-y, - GR_LFB_SRC_FMT_8888, span, 1, 0, - (void *) data ); - } else { - for (i=0;icolor; - } - - writeRegionClipped(fxMesa, fxMesa->currentFB, x, bottom-y, GR_LFB_SRC_FMT_8888, - n, 1, 0, (void *) data ); - } -} - - -/* - * Read a span of 16-bit RGB pixels. Note, we don't worry about cliprects - * since OpenGL says obscured pixels have undefined values. - */ -static void -read_R5G6B5_span(const GLcontext *ctx, GLuint n, GLint x, GLint y, - GLubyte rgba[][4]) -{ - fxMesaContext fxMesa = FX_CONTEXT(ctx); - GrLfbInfo_t info; - BEGIN_BOARD_LOCK(); - info.size=sizeof(info); - if (grLfbLock(GR_LFB_READ_ONLY, - fxMesa->currentFB, - GR_LFBWRITEMODE_ANY, - GR_ORIGIN_UPPER_LEFT, - FXFALSE, - &info)) { - const GLint winX = fxMesa->x_offset; - const GLint winY = fxMesa->y_offset + fxMesa->height - 1; -#ifdef XF86DRI - const GLint srcStride = (fxMesa->glCtx->Color.DrawBuffer == GL_FRONT) - ? (fxMesa->screen_width) : (info.strideInBytes / 2); -#else - const GLint srcStride = info.strideInBytes / 2; /* stride in GLushorts */ -#endif - const GLushort *data16 = (const GLushort *) info.lfbPtr - + (winY - y) * srcStride - + (winX + x); - const GLuint *data32 = (const GLuint *) data16; - GLuint i, j; - GLuint extraPixel = (n & 1); - n -= extraPixel; - for (i = j = 0; i < n; i += 2, j++) { - GLuint pixel = data32[j]; - GLuint pixel0 = pixel & 0xffff; - GLuint pixel1 = pixel >> 16; - rgba[i][RCOMP] = FX_PixelToR[pixel0]; - rgba[i][GCOMP] = FX_PixelToG[pixel0]; - rgba[i][BCOMP] = FX_PixelToB[pixel0]; - rgba[i][ACOMP] = 255; - rgba[i+1][RCOMP] = FX_PixelToR[pixel1]; - rgba[i+1][GCOMP] = FX_PixelToG[pixel1]; - rgba[i+1][BCOMP] = FX_PixelToB[pixel1]; - rgba[i+1][ACOMP] = 255; - } - if (extraPixel) { - GLushort pixel = data16[n]; - rgba[n][RCOMP] = FX_PixelToR[pixel]; - rgba[n][GCOMP] = FX_PixelToG[pixel]; - rgba[n][BCOMP] = FX_PixelToB[pixel]; - rgba[n][ACOMP] = 255; - } - - grLfbUnlock(GR_LFB_READ_ONLY, fxMesa->currentFB); - } - END_BOARD_LOCK(); -} - - -static void -write_R5G6B5_pixels(const GLcontext *ctx, - GLuint n, const GLint x[], const GLint y[], - CONST GLubyte rgba[][4], const GLubyte mask[]) -{ - fxMesaContext fxMesa=(fxMesaContext)ctx->DriverCtx; - GLuint i; - GLint bottom=fxMesa->height+fxMesa->y_offset-1; - - if (MESA_VERBOSE&VERBOSE_DRIVER) { - fprintf(stderr,"fxmesa: fxDDWriteRGBAPixels(...)\n"); - } - - for(i=0;icurrentFB, x[i]+fxMesa->x_offset, bottom-y[i], - 1, 1, (void *)rgba[i]); -} - - -static void -write_R5G6B5_mono_pixels(const GLcontext *ctx, - GLuint n, const GLint x[], const GLint y[], - const GLubyte mask[]) -{ - fxMesaContext fxMesa=(fxMesaContext)ctx->DriverCtx; - GLuint i; - GLint bottom=fxMesa->height+fxMesa->y_offset-1; - - if (MESA_VERBOSE&VERBOSE_DRIVER) { - fprintf(stderr,"fxmesa: fxDDWriteMonoRGBAPixels(...)\n"); - } - - for(i=0;icurrentFB,x[i]+fxMesa->x_offset,bottom-y[i], - GR_LFB_SRC_FMT_8888,1,1,0,(void *) &fxMesa->color); -} - -static void -read_R5G6B5_pixels(const GLcontext *ctx, - GLuint n, const GLint x[], const GLint y[], - GLubyte rgba[][4], const GLubyte mask[]) -{ - fxMesaContext fxMesa=(fxMesaContext)ctx->DriverCtx; - GLuint i; - GLint bottom=fxMesa->height+fxMesa->y_offset-1; - - if (MESA_VERBOSE&VERBOSE_DRIVER) { - fprintf(stderr,"fxmesa: fxDDReadRGBAPixels(...)\n"); - } - - for(i=0;icurrentFB,x[i],bottom-y[i],1,1,0,&pixel); - rgba[i][RCOMP] = FX_PixelToR[pixel]; - rgba[i][GCOMP] = FX_PixelToG[pixel]; - rgba[i][BCOMP] = FX_PixelToB[pixel]; - rgba[i][ACOMP] = 255; - } - } -} - - -/* - * 24bpp span/pixel functions - */ - -static void -write_R8G8B8_rgb_span(const GLcontext *ctx, GLuint n, GLint x, GLint y, - const GLubyte rgb[][3], const GLubyte mask[]) -{ - fxMesaContext fxMesa = FX_CONTEXT(ctx); - GrLfbWriteMode_t mode; - GrLfbInfo_t info; - - if (fxMesa->glCtx->Color.DrawBuffer == GL_FRONT) - mode = GR_LFBWRITEMODE_888; - else - mode = GR_LFBWRITEMODE_888; - - BEGIN_BOARD_LOCK(); - info.size = sizeof(info); - if (grLfbLock(GR_LFB_WRITE_ONLY, - fxMesa->currentFB, - mode, - GR_ORIGIN_UPPER_LEFT, - FXFALSE, - &info)) { - const GLint winY = fxMesa->y_offset + fxMesa->height - 1; - const GLint winX = fxMesa->x_offset; - const GLint scrX = winX + x; - const GLint scrY = winY - y; - - if (fxMesa->glCtx->Color.DrawBuffer == GL_FRONT) { - /*GLint dstStride = fxMesa->screen_width * 3;*/ - GLint dstStride = info.strideInBytes / 1; - GLubyte *dst = (GLubyte *) info.lfbPtr - + (winY - y) * dstStride + (winX + x) * 1; - GLuint *dst32 = (GLuint *) dst; - GLubyte visMask[MAX_WIDTH]; - GLuint i; - generate_vismask(fxMesa, scrX, scrY, n, visMask); - for (i = 0; i < n; i++) { - if (visMask[i] && (!mask || mask[i])) { - dst32[i] = PACK_BGRA32(rgb[i][0], rgb[i][1], rgb[i][2], 255); - } - } - } - else { - /* back buffer */ - GLint dstStride = info.strideInBytes; - GLubyte *dst = (GLubyte *) info.lfbPtr - + (winY - y) * dstStride + (winX + x) * 4; - GLuint *dst32 = (GLuint *) dst; - if (mask) { - GLuint i; - for (i = 0; i < n; i++) { - if (mask[i]) { - dst32[i] = PACK_RGBA32(rgb[i][0], rgb[i][1], rgb[i][2], 255); - } - } - } - else { - GLuint i; - for (i = 0; i < n; i++) { - dst32[i] = PACK_RGBA32(rgb[i][2], rgb[i][1], rgb[i][0], 255); - } - } - } - grLfbUnlock(GR_LFB_WRITE_ONLY, fxMesa->currentFB); - } - END_BOARD_LOCK(); -} - - - -static void -write_R8G8B8_rgba_span(const GLcontext *ctx, GLuint n, GLint x, GLint y, - const GLubyte rgba[][4], const GLubyte mask[]) -{ - fxMesaContext fxMesa = FX_CONTEXT(ctx); - GrLfbWriteMode_t mode; - GrLfbInfo_t info; - - if (fxMesa->glCtx->Color.DrawBuffer == GL_FRONT) - mode = GR_LFBWRITEMODE_8888; - else - mode = GR_LFBWRITEMODE_888 /*565*/; - - BEGIN_BOARD_LOCK(); - info.size = sizeof(info); - if (grLfbLock(GR_LFB_WRITE_ONLY, - fxMesa->currentFB, - mode, - GR_ORIGIN_UPPER_LEFT, - FXFALSE, - &info)) { - const GLint winY = fxMesa->y_offset + fxMesa->height - 1; - const GLint winX = fxMesa->x_offset; - const GLint scrX = winX + x; - const GLint scrY = winY - y; - - if (fxMesa->glCtx->Color.DrawBuffer == GL_FRONT) { - /* XXX have to do cliprect clipping! */ - GLint dstStride = fxMesa->screen_width * 4; - GLubyte *dst = (GLubyte *) info.lfbPtr - + (winY - y) * dstStride + (winX + x) * 4; - GLuint *dst32 = (GLuint *) dst; - GLubyte visMask[MAX_WIDTH]; - GLuint i; - generate_vismask(fxMesa, scrX, scrY, n, visMask); - for (i = 0; i < n; i++) { - if (visMask[i] && (!mask || mask[i])) { - dst32[i] = PACK_BGRA32(rgba[i][0], rgba[i][1], rgba[i][2], rgba[i][3]); - } - } - } - else { - /* back buffer */ - GLint dstStride = info.strideInBytes; - GLubyte *dst = (GLubyte *) info.lfbPtr - + (winY - y) * dstStride + (winX + x) * 4; - if (mask) { - const GLuint *src32 = (const GLuint *) rgba; - GLuint *dst32 = (GLuint *) dst; - GLuint i; - for (i = 0; i < n; i++) { - if (mask[i]) { - dst32[i] = src32[i]; - } - } - } - else { - /* no mask, write all pixels */ - MEMCPY(dst, rgba, 4 * n); - } - } - grLfbUnlock(GR_LFB_WRITE_ONLY, fxMesa->currentFB); - } - END_BOARD_LOCK(); -} - - -static void -write_R8G8B8_mono_span(const GLcontext *ctx, GLuint n, GLint x, GLint y, - const GLubyte mask[]) -{ - fxMesaContext fxMesa = FX_CONTEXT(ctx); - GLubyte rgba[MAX_WIDTH][4]; - GLuint *data = (GLuint *) rgba; - GLuint i; - - /* XXX this is a simple-minded implementation but good enough for now */ - for (i = 0; i < n; i++) { - data[i] = (GLuint) fxMesa->color; - } - write_R8G8B8_rgba_span(ctx, n, x, y, (const GLubyte (*)[4]) rgba, mask); -} - - -static void -read_R8G8B8_span(const GLcontext *ctx, GLuint n, GLint x, GLint y, - GLubyte rgba[][4]) -{ - fxMesaContext fxMesa = FX_CONTEXT(ctx); - GrLfbWriteMode_t mode; - GrLfbInfo_t info; - - if (1 || fxMesa->glCtx->Color.DrawBuffer == GL_FRONT) { - mode = GR_LFBWRITEMODE_8888; - } - else { - mode = GR_LFBWRITEMODE_565; /*888*/ /*565*/; - } - - BEGIN_BOARD_LOCK(); - info.size = sizeof(info); - if (grLfbLock(GR_LFB_READ_ONLY, - fxMesa->currentFB, - mode, /*GR_LFBWRITEMODE_ANY,*/ - GR_ORIGIN_UPPER_LEFT, - FXFALSE, - &info)) { - const GLint winY = fxMesa->y_offset + fxMesa->height - 1; - const GLint winX = fxMesa->x_offset; - - if (fxMesa->glCtx->Color.DrawBuffer == GL_FRONT) { - GLint srcStride = fxMesa->screen_width * 4; - const GLubyte *src = (const GLubyte *) info.lfbPtr - + (winY - y) * srcStride + (winX + x) * 4; - GLuint i; - for (i = 0; i < n; i++) { - rgba[i][0] = src[i * 4 + 2]; - rgba[i][1] = src[i * 4 + 1]; - rgba[i][2] = src[i * 4 + 0]; - rgba[i][3] = src[i * 4 + 3]; - } - } - else { - /* back buffer */ - GLint srcStride = /*info.strideInBytes;*/ 8192 / 2; /* XXX a hack! */ - const GLubyte *src = (const GLubyte *) info.lfbPtr - + (winY - y) * srcStride + (winX + x) * 4; - GLuint i; - for (i = 0; i < n; i++) { - rgba[i][0] = src[i * 4 + 2]; - rgba[i][1] = src[i * 4 + 1]; - rgba[i][2] = src[i * 4 + 0]; - rgba[i][3] = src[i * 4 + 3]; - } - } - grLfbUnlock(GR_LFB_READ_ONLY, fxMesa->currentFB); - } - END_BOARD_LOCK(); -} - - -static void -write_R8G8B8_pixels(const GLcontext *ctx, - GLuint n, const GLint x[], const GLint y[], - CONST GLubyte rgba[][4], const GLubyte mask[]) -{ -#if 00 - GLuint i; - for (i = 0; i < n; i++) { - write_R8G8B8_rgba_span(ctx, 1, x[i], y[i], rgba + i, mask + i); - } - -#else - fxMesaContext fxMesa = FX_CONTEXT(ctx); - GrLfbWriteMode_t mode; - GrLfbInfo_t info; - - if (fxMesa->glCtx->Color.DrawBuffer == GL_FRONT) - mode = GR_LFBWRITEMODE_8888; - else - mode = GR_LFBWRITEMODE_888 /*565*/; - - BEGIN_BOARD_LOCK(); - info.size = sizeof(info); - if (grLfbLock(GR_LFB_WRITE_ONLY, - fxMesa->currentFB, - mode, - GR_ORIGIN_UPPER_LEFT, - FXFALSE, - &info)) { - if (fxMesa->glCtx->Color.DrawBuffer == GL_FRONT) { - GLuint i; - for (i = 0; i < n; i++) { - const GLint winY = fxMesa->y_offset + fxMesa->height - 1; - const GLint winX = fxMesa->x_offset; - const GLint scrX = winX + x[i]; - const GLint scrY = winY - y[i]; - if (mask[i] && visible_pixel(fxMesa, scrX, scrY)) { - GLint dstStride = fxMesa->screen_width * 4; - GLubyte *dst = (GLubyte *) info.lfbPtr + scrY * dstStride + scrX * 4; - GLuint *dst32 = (GLuint *) dst; - *dst32 = PACK_BGRA32(rgba[i][0], rgba[i][1], - rgba[i][2], rgba[i][3]); - } - } - } - else { - /* back buffer */ - GLuint i; - for (i = 0; i < n; i++) { - const GLint winY = fxMesa->y_offset + fxMesa->height - 1; - const GLint winX = fxMesa->x_offset; - const GLint scrX = winX + x[i]; - const GLint scrY = winY - y[i]; - if (mask[i] && visible_pixel(fxMesa, scrX, scrY)) { - GLint dstStride = info.strideInBytes; - GLubyte *dst = (GLubyte *) info.lfbPtr + scrY * dstStride + scrX * 4; - GLuint *dst32 = (GLuint *) dst; - const GLuint *src32 = (const GLuint *) rgba; - *dst32 = src32[i]; - } - } - } - grLfbUnlock(GR_LFB_WRITE_ONLY, fxMesa->currentFB); - } - END_BOARD_LOCK(); -#endif -} - - -static void -write_R8G8B8_mono_pixels(const GLcontext *ctx, - GLuint n, const GLint x[], const GLint y[], - const GLubyte mask[]) -{ -} - - -static void -read_R8G8B8_pixels(const GLcontext *ctx, - GLuint n, const GLint x[], const GLint y[], - GLubyte rgba[][4], const GLubyte mask[]) -{ - printf("read_R8G8B8_pixels %d\n", n); -} - - - -/* - * 32bpp span/pixel functions - */ - -static void -write_R8G8B8A8_rgb_span(const GLcontext *ctx, GLuint n, GLint x, GLint y, - const GLubyte rgb[][3], const GLubyte mask[]) -{ - fxMesaContext fxMesa = FX_CONTEXT(ctx); - GrLfbWriteMode_t mode; - GrLfbInfo_t info; - - if (fxMesa->glCtx->Color.DrawBuffer == GL_FRONT) - mode = GR_LFBWRITEMODE_8888; - else - mode = GR_LFBWRITEMODE_888 /*565*/; - - BEGIN_BOARD_LOCK(); - info.size = sizeof(info); - if (grLfbLock(GR_LFB_WRITE_ONLY, - fxMesa->currentFB, - mode, - GR_ORIGIN_UPPER_LEFT, - FXFALSE, - &info)) { - const GLint winY = fxMesa->y_offset + fxMesa->height - 1; - const GLint winX = fxMesa->x_offset; - const GLint scrX = winX + x; - const GLint scrY = winY - y; - - if (fxMesa->glCtx->Color.DrawBuffer == GL_FRONT) { - GLint dstStride = fxMesa->screen_width * 4; - GLubyte * dst = (GLubyte *) info.lfbPtr - + (winY - y) * dstStride + (winX + x) * 4; - GLuint *dst32 = (GLuint *) dst; - GLubyte visMask[MAX_WIDTH]; - GLuint i; - generate_vismask(fxMesa, scrX, scrY, n, visMask); - for (i = 0; i < n; i++) { - if (visMask[i] && (!mask || mask[i])) { - dst32[i] = PACK_BGRA32(rgb[i][0], rgb[i][1], rgb[i][2], 255); - } - } - } - else { - /* back buffer */ - GLint dstStride = info.strideInBytes; - GLubyte *dst = (GLubyte *) info.lfbPtr - + (winY - y) * dstStride + (winX + x) * 4; - if (mask) { - GLuint *dst32 = (GLuint *) dst; - GLuint i; - for (i = 0; i < n; i++) { - if (mask[i]) { - dst32[i] = PACK_RGBA32(rgb[i][0], rgb[i][1], rgb[i][2], 255); - } - } - } - else { - GLuint *dst32 = (GLuint *) dst; - GLuint i; - for (i = 0; i < n; i++) { - dst32[i] = PACK_RGBA32(rgb[i][0], rgb[i][1], rgb[i][2], 255); - } - } - } - grLfbUnlock(GR_LFB_WRITE_ONLY, fxMesa->currentFB); - } - END_BOARD_LOCK(); -} - - -/* - *XXX test of grLfbWriteRegion in 32bpp mode. Doesn't seem to work! - */ -#if 0 -static void -write_R8G8B8A8_rgb_span2(const GLcontext *ctx, GLuint n, GLint x, GLint y, - const GLubyte rgb[][3], const GLubyte mask[]) -{ - fxMesaContext fxMesa = FX_CONTEXT(ctx); - GLint bottom = fxMesa->height + fxMesa->y_offset - 1; - GLint x2 = fxMesa->x_offset +x; - GLint y2 = bottom - y; - - FX_grLfbWriteRegion(fxMesa->currentFB, x2, y2, GR_LFB_SRC_FMT_888, - n, 1, 0, rgb); -} -#endif - - -static void -write_R8G8B8A8_rgba_span(const GLcontext *ctx, GLuint n, GLint x, GLint y, - const GLubyte rgba[][4], const GLubyte mask[]) -{ - fxMesaContext fxMesa = FX_CONTEXT(ctx); - GrLfbWriteMode_t mode; - GrLfbInfo_t info; - - if (fxMesa->glCtx->Color.DrawBuffer == GL_FRONT) - mode = GR_LFBWRITEMODE_8888; - else - mode = GR_LFBWRITEMODE_888 /*565*/; - - BEGIN_BOARD_LOCK(); - info.size = sizeof(info); - if (grLfbLock(GR_LFB_WRITE_ONLY, - fxMesa->currentFB, - mode, - GR_ORIGIN_UPPER_LEFT, - FXFALSE, - &info)) { - const GLint winY = fxMesa->y_offset + fxMesa->height - 1; - const GLint winX = fxMesa->x_offset; - const GLint scrX = winX + x; - const GLint scrY = winY - y; - - if (fxMesa->glCtx->Color.DrawBuffer == GL_FRONT) { - GLint dstStride = fxMesa->screen_width * 4; - GLubyte *dst = (GLubyte *) info.lfbPtr - + (winY - y) * dstStride + (winX + x) * 4; - GLuint *dst32 = (GLuint *) dst; - GLubyte visMask[MAX_WIDTH]; - GLuint i; - generate_vismask(fxMesa, scrX, scrY, n, visMask); - for (i = 0; i < n; i++) { - if (visMask[i] && (!mask || mask[i])) { - dst32[i] = PACK_BGRA32(rgba[i][0], rgba[i][1], rgba[i][2], rgba[i][3]); - } - } - } - else { - /* back buffer */ - GLint dstStride = 8192; /* XXX a hack info.strideInBytes; */ - GLubyte *dst = (GLubyte *) info.lfbPtr - + (winY - y) * dstStride + (winX + x) * 4; - if (mask) { - const GLuint *src32 = (const GLuint *) rgba; - GLuint *dst32 = (GLuint *) dst; - GLuint i; - for (i = 0; i < n; i++) { - if (mask[i]) { - dst32[i] = src32[i]; - } - } - } - else { - /* no mask, write all pixels */ - MEMCPY(dst, rgba, 4 * n); - } - } - grLfbUnlock(GR_LFB_WRITE_ONLY, fxMesa->currentFB); - } - else { - info.strideInBytes = -1; - } - END_BOARD_LOCK(); -} - - -static void -write_R8G8B8A8_mono_span(const GLcontext *ctx, GLuint n, GLint x, GLint y, - const GLubyte mask[]) -{ - fxMesaContext fxMesa = FX_CONTEXT(ctx); - GLubyte rgba[MAX_WIDTH][4]; - GLuint *data = (GLuint *) rgba; - GLuint i; - - /* XXX this is a simple-minded implementation but good enough for now */ - for (i = 0; i < n; i++) { - data[i] = (GLuint) fxMesa->color; - } - write_R8G8B8A8_rgba_span(ctx, n, x, y, (const GLubyte (*)[4]) rgba, mask); -} - - -static void -read_R8G8B8A8_span(const GLcontext *ctx, GLuint n, GLint x, GLint y, - GLubyte rgba[][4]) -{ - fxMesaContext fxMesa = FX_CONTEXT(ctx); - GrLfbWriteMode_t mode; - GrLfbInfo_t info; - - if (fxMesa->glCtx->Color.DrawBuffer == GL_FRONT) { - mode = GR_LFBWRITEMODE_8888; - } - else { - mode = GR_LFBWRITEMODE_8888; /*565;*/ - } - - BEGIN_BOARD_LOCK(); - info.size = sizeof(info); - if (grLfbLock(GR_LFB_READ_ONLY, - fxMesa->currentFB, - mode, - GR_ORIGIN_UPPER_LEFT, - FXFALSE, - &info)) { - const GLint winY = fxMesa->y_offset + fxMesa->height - 1; - const GLint winX = fxMesa->x_offset; - - if (fxMesa->glCtx->Color.DrawBuffer == GL_FRONT) { - GLint srcStride = fxMesa->screen_width; - const GLuint *src32 = (const GLuint *) info.lfbPtr - + (winY - y) * srcStride + (winX + x); - GLuint i; - for (i = 0; i < n; i++) { - const GLuint p = src32[i]; - rgba[i][0] = (p >> 16) & 0xff; - rgba[i][1] = (p >> 8) & 0xff; - rgba[i][2] = (p >> 0) & 0xff; - rgba[i][3] = (p >> 24) & 0xff; - } - } - else { - /* back buffer */ - GLint srcStride = 1024; /* XXX a hack */ - const GLuint *src32 = (const GLuint *) info.lfbPtr - + (winY - y) * srcStride + (winX + x); - GLuint i; - for (i = 0; i < n; i++) { - GLuint p = src32[i]; - rgba[i][0] = (p >> 16) & 0xff; - rgba[i][1] = (p >> 8) & 0xff; - rgba[i][2] = (p >> 0) & 0xff; - rgba[i][3] = (p >> 24) & 0xff; - } - } - grLfbUnlock(GR_LFB_READ_ONLY, fxMesa->currentFB); - } - else - info.strideInBytes = -1; - END_BOARD_LOCK(); -} - - -static void -write_R8G8B8A8_pixels(const GLcontext *ctx, - GLuint n, const GLint x[], const GLint y[], - CONST GLubyte rgba[][4], const GLubyte mask[]) -{ -#if 00 - GLuint i; - for (i = 0; i < n; i++) { - write_R8G8B8A8_rgba_span(ctx, 1, x[i], y[i], rgba + i, mask + i); - } - -#else - fxMesaContext fxMesa = FX_CONTEXT(ctx); - GrLfbWriteMode_t mode; - GrLfbInfo_t info; - - if (fxMesa->glCtx->Color.DrawBuffer == GL_FRONT) - mode = GR_LFBWRITEMODE_8888; - else - mode = GR_LFBWRITEMODE_888 /*565*/; - - BEGIN_BOARD_LOCK(); - info.size = sizeof(info); - if (grLfbLock(GR_LFB_WRITE_ONLY, - fxMesa->currentFB, - mode, - GR_ORIGIN_UPPER_LEFT, - FXFALSE, - &info)) { - if (fxMesa->glCtx->Color.DrawBuffer == GL_FRONT) { - GLuint i; - for (i = 0; i < n; i++) { - const GLint winY = fxMesa->y_offset + fxMesa->height - 1; - const GLint winX = fxMesa->x_offset; - const GLint scrX = winX + x[i]; - const GLint scrY = winY - y[i]; - if (mask[i] && visible_pixel(fxMesa, scrX, scrY)) { - GLint dstStride = fxMesa->screen_width * 4; - GLubyte *dst = (GLubyte *) info.lfbPtr + scrY * dstStride + scrX * 4; - GLuint *dst32 = (GLuint *) dst; - *dst32 = PACK_BGRA32(rgba[i][0], rgba[i][1], - rgba[i][2], rgba[i][3]); - } - } - } - else { - /* back buffer */ - GLuint i; - for (i = 0; i < n; i++) { - const GLint winY = fxMesa->y_offset + fxMesa->height - 1; - const GLint winX = fxMesa->x_offset; - const GLint scrX = winX + x[i]; - const GLint scrY = winY - y[i]; - if (mask[i] && visible_pixel(fxMesa, scrX, scrY)) { - GLint dstStride = info.strideInBytes; - GLubyte *dst = (GLubyte *) info.lfbPtr + scrY * dstStride + scrX * 4; - GLuint *dst32 = (GLuint *) dst; - const GLuint *src32 = (const GLuint *) rgba; - *dst32 = src32[i]; - } - } - } - grLfbUnlock(GR_LFB_WRITE_ONLY, fxMesa->currentFB); - } - END_BOARD_LOCK(); -#endif -} - - -static void -write_R8G8B8A8_mono_pixels(const GLcontext *ctx, - GLuint n, const GLint x[], const GLint y[], - const GLubyte mask[]) -{ - fxMesaContext fxMesa = (fxMesaContext)ctx->DriverCtx; - GLuint i; - GLuint color = fxMesa->color; - for (i = 0; i < n; i++) { - if (mask[i]) { - write_R8G8B8A8_rgba_span(ctx, 1, x[i], y[i], - (const GLubyte (*)[4]) &color, mask + i); - } - } -} - - - -static void -read_R8G8B8A8_pixels(const GLcontext *ctx, - GLuint n, const GLint x[], const GLint y[], - GLubyte rgba[][4], const GLubyte mask[]) -{ - GLuint i; - for (i = 0; i < n; i++) { - if (mask[i]) { - read_R8G8B8A8_span(ctx, 1, x[i], y[i], rgba + i); - } - } - printf("read_R8G8B8A8_pixels %d\n", n); -} - - - -/* - * Depth buffer read/write functions. - */ - -void fxDDWriteDepthSpan(GLcontext *ctx, - GLuint n, GLint x, GLint y, const GLdepth depth[], - const GLubyte mask[]) -{ - fxMesaContext fxMesa = (fxMesaContext)ctx->DriverCtx; - GLint bottom = fxMesa->height + fxMesa->y_offset - 1; - GLuint depth_size = fxMesa->glVis->DepthBits; - GLuint stencil_size = fxMesa->glVis->StencilBits; - - if (MESA_VERBOSE & VERBOSE_DRIVER) { - fprintf(stderr, "fxmesa: fxDDWriteDepthSpan(...)\n"); - } - - x += fxMesa->x_offset; - - if (mask) { - GLint i; - for (i = 0; i < n; i++) { - if (mask[i]) { - GLshort d16; - GLuint d32; - switch (depth_size) { - case 16: - d16 = depth[i]; - writeRegionClipped(fxMesa, GR_BUFFER_AUXBUFFER, x + i, bottom - y, - GR_LFB_SRC_FMT_ZA16, 1, 1, 0, (void *) &d16); - break; - case 32: - if (!fb_point_is_clipped(fxMesa, x+i, bottom-y)) { - if (stencil_size > 0) { - rw_fb_span(fxMesa, - GR_BUFFER_AUXBUFFER, - x + i, bottom - y, - 1, - sizeof(GLdepth), - &d32, - FBS_READ); - d32 = depth[i] & 0xFF000000; - break; - } else { - d32 = depth[i]; - } - rw_fb_span(fxMesa, - GR_BUFFER_AUXBUFFER, - x + i, bottom - y, - 1, - sizeof(GLdepth), - &d32, - FBS_WRITE); - } - } - } - } - } else { - GLushort depth16[MAX_WIDTH]; - GLint i; - GLuint d32; - switch (depth_size) { - case 16: - for (i = 0; i < n; i++) { - depth16[i] = depth[i]; - } - writeRegionClipped(fxMesa, GR_BUFFER_AUXBUFFER, x, bottom - y, - GR_LFB_SRC_FMT_ZA16, n, 1, 0, (void *) depth16); - break; - case 32: - for (i = 0; i < n; i++) { - if (fb_point_is_clipped(fxMesa, x+i, bottom-y)) { - if (stencil_size > 0) { - rw_fb_span(fxMesa, - GR_BUFFER_AUXBUFFER, - x + i, bottom - y, - 1, - sizeof(GLdepth), - &d32, - FBS_READ); - d32 = (d32 & 0xFF0000) | (depth[i] & 0x00FFFFFF); - } else { - d32 = depth[i]; - } - rw_fb_span(fxMesa, - GR_BUFFER_AUXBUFFER, - x + i, bottom - y, - 1, - sizeof(GLdepth), - &d32, - FBS_WRITE); - } - } - } - } -} - - -void fxDDReadDepthSpan(GLcontext *ctx, - GLuint n, GLint x, GLint y, GLdepth depth[]) -{ - fxMesaContext fxMesa = (fxMesaContext)ctx->DriverCtx; - GLint bottom = fxMesa->height + fxMesa->y_offset - 1; - GLushort depth16[MAX_WIDTH]; - GLuint i; - GLuint depth_size = fxMesa->glVis->DepthBits; - GLuint stencil_size = fxMesa->glVis->StencilBits; - - if (MESA_VERBOSE & VERBOSE_DRIVER) { - fprintf(stderr, "fxmesa: fxDDReadDepthSpan(...)\n"); - } - - x += fxMesa->x_offset; - switch (depth_size) { - case 16: - FX_grLfbReadRegion(GR_BUFFER_AUXBUFFER, x, bottom - y, n, 1, 0, depth16); - for (i = 0; i < n; i++) { - depth[i] = depth16[i]; - } - break; - case 32: - rw_fb_span(fxMesa, - GR_BUFFER_AUXBUFFER, - x, bottom - y, - n, - sizeof(GLdepth), - depth, - FBS_READ); - if (stencil_size > 0) { - for (i = 0; i < n; i++) { - depth[i] &= 0xFFFFFF; - } - } - } -} - - - -void fxDDWriteDepthPixels(GLcontext *ctx, - GLuint n, const GLint x[], const GLint y[], - const GLdepth depth[], const GLubyte mask[]) -{ - fxMesaContext fxMesa = (fxMesaContext)ctx->DriverCtx; - GLint bottom = fxMesa->height + fxMesa->y_offset - 1; - GLuint i; - GLuint d32; - GLuint depth_size = fxMesa->glVis->DepthBits; - GLuint stencil_size = fxMesa->glVis->StencilBits; - - if (MESA_VERBOSE & VERBOSE_DRIVER) { - fprintf(stderr, "fxmesa: fxDDWriteDepthPixels(...)\n"); - } - - for (i = 0; i < n; i++) { - if (mask[i]) { - int xpos = x[i] + fxMesa->x_offset; - int ypos = bottom - y[i]; - GLushort d16 = depth[i]; - switch (depth_size) { - case 16: - writeRegionClipped(fxMesa, GR_BUFFER_AUXBUFFER, xpos, ypos, - GR_LFB_SRC_FMT_ZA16, 1, 1, 0, - (void *) &d16); - break; - case 32: - if (!fb_point_is_clipped(fxMesa, xpos, ypos)) { - if (stencil_size > 0) { - /* - * Should I sign extend this? I don't - * believe so, since GLdepth is unsigned. - */ - rw_fb_span(fxMesa, - GR_BUFFER_AUXBUFFER, - xpos, ypos, - 1, - sizeof(GLdepth), - &d32, - FBS_READ); - d32 = (d32 &~ 0xFF000000) | (depth[i] & 0x00FFFFFF); - } else { - d32 = depth[i]; - } - rw_fb_span(fxMesa, - GR_BUFFER_AUXBUFFER, - xpos, ypos, - 1, - sizeof(GLdepth), - &d32, - FBS_WRITE); - } - break; - } - } - } -} - - -void fxDDReadDepthPixels(GLcontext *ctx, GLuint n, - const GLint x[], const GLint y[], GLdepth depth[]) -{ - fxMesaContext fxMesa = (fxMesaContext)ctx->DriverCtx; - GLint bottom = fxMesa->height + fxMesa->y_offset - 1; - GLuint i; - - if (MESA_VERBOSE & VERBOSE_DRIVER) { - fprintf(stderr, "fxmesa: fxDDReadDepthPixels(...)\n"); - } - - for (i = 0; i < n; i++) { - int xpos = x[i] + fxMesa->x_offset; - int ypos = bottom - y[i]; - GLushort d16; - GLuint d32; - GLuint depth_size = fxMesa->glVis->DepthBits; - GLuint stencil_size = fxMesa->glVis->StencilBits; - - assert((depth_size == 16) || (depth_size == 24) || (depth_size == 32)); - switch (depth_size) { - case 16: - FX_grLfbReadRegion(GR_BUFFER_AUXBUFFER, xpos, ypos, 1, 1, 0, &d16); - depth[i] = d16; - break; - case 24: - case 32: - rw_fb_span(fxMesa, - GR_BUFFER_AUXBUFFER, - xpos, ypos, - 1, - depth_size/8, - &d32, - FBS_READ); - /* - * Get rid of the stencil bits. Should I sign - * extend this? I don't believe so, since GLdepth - * is unsigned. - */ - if (stencil_size > 0) { - d32 &= 0xFFFFFF; - } - depth[i] = d32; - break; - default: - assert(0); - } - } -} - - -/* - * Stencil buffer read/write functions. - */ - -#define DEPTH_VALUE_TO_STENCIL_VALUE(d) (((d) >> 24) & 0xFF) -#define STENCIL_VALUE_TO_DEPTH_VALUE(s,d) \ - ((((s) & 0xFF) << 24) | ((d) & 0xFFFFFF)) -#define ASSEMBLE_STENCIL_VALUE(os, ns, mask) \ - (((os) &~ (mask)) | ((ns) & (mask))) - -#if 00 -/* - * Read a horizontal span of stencil values from the stencil buffer. - */ -void -fxDDReadStencilSpan( GLcontext *ctx, - GLuint n, - GLint x, - GLint y, - GLstencil stencil[] ) -{ - fxMesaContext fxMesa = (fxMesaContext)ctx->DriverCtx; - GLint bottom = fxMesa->height + fxMesa->y_offset - 1; - GLuint i; - int xpos = x + fxMesa->x_offset; - int ypos = bottom - y; - - if (MESA_VERBOSE & VERBOSE_DRIVER) { - fprintf(stderr, "fxmesa: fxDDReadStencilSpan(...)\n"); - } - - for (i = 0; i < n; i++, ypos += 1) { - GLuint d; - rw_fb_span(fxMesa, - GR_BUFFER_AUXBUFFER, - xpos, ypos, - 1, - sizeof(GLdepth), - &d, - FBS_READ); - stencil[i] = DEPTH_VALUE_TO_STENCIL_VALUE(d); - } -} - -/* - * Write a horizontal span of stencil values into the stencil buffer. - * If mask is NULL, write all stencil values. - * Else, only write stencil[i] if mask[i] is non-zero. - */ -void -fxDDWriteStencilSpan( GLcontext *ctx, - GLuint n, - GLint x, - GLint y, - const GLstencil stencil[], - const GLubyte mask[] ) -{ - fxMesaContext fxMesa = (fxMesaContext)ctx->DriverCtx; - GLint bottom = fxMesa->height + fxMesa->y_offset - 1; - GLuint i; - int xpos = x + fxMesa->x_offset; - int ypos = bottom - y; - - if (MESA_VERBOSE & VERBOSE_DRIVER) { - fprintf(stderr, "fxmesa: fxDDWriteStencilSpan(...)\n"); - } - - for (i = 0; i < n; i++, ypos += 1) { - GLdepth d; - GLstencil ns; - rw_fb_span(fxMesa, - GR_BUFFER_AUXBUFFER, - xpos, ypos, - 1, - sizeof(GLdepth), - &d, - FBS_READ); - /* - * Find the old stencil value, and strip off the bits - * we are going to write. - */ - ns = ASSEMBLE_STENCIL_VALUE(DEPTH_VALUE_TO_STENCIL_VALUE(d), - stencil[i], - mask[i]); - /* - * Now, assemble the new StenDepth value, with the old - * depth value, the old stencil value in the bits - * where mask is 0, and the new stencil value in the bits - * where mask is 1. - */ - d = STENCIL_VALUE_TO_DEPTH_VALUE(ns, d); - rw_fb_span(fxMesa, - GR_BUFFER_AUXBUFFER, - xpos, ypos, - 1, - sizeof(GLdepth), - &d, - FBS_WRITE); - } -} - -/* Write an array of stencil values into the stencil buffer. - * If mask is NULL, write all stencil values. - * Else, only write stencil[i] if mask[i] is non-zero. - */ -void -fxDDReadStencilPixels( GLcontext *ctx, - GLuint n, - const GLint x[], - const GLint y[], - GLstencil stencil[]) -{ - fxMesaContext fxMesa = (fxMesaContext)ctx->DriverCtx; - GLint bottom = fxMesa->height + fxMesa->y_offset - 1; - GLuint i; - - if (MESA_VERBOSE & VERBOSE_DRIVER) { - fprintf(stderr, "fxmesa: fxDDReadStencilPixels(...)\n"); - } - - for (i = 0; i < n; i++) { - int xpos = x[i] + fxMesa->x_offset; - int ypos = bottom - y[i]; - GLuint d; - rw_fb_span(fxMesa, - GR_BUFFER_AUXBUFFER, - xpos, ypos, - 1, - sizeof(GLdepth), - &d, - FBS_READ); - stencil[i] = DEPTH_VALUE_TO_STENCIL_VALUE(d); - } -} - -/* - * Read an array of stencil values from the stencil buffer. - */ -void -fxDDWriteStencilPixels( GLcontext *ctx, - GLuint n, - const GLint x[], - const GLint y[], - const GLstencil stencil[], - const GLstencil mask[]) -{ - fxMesaContext fxMesa = (fxMesaContext)ctx->DriverCtx; - GLint bottom = fxMesa->height + fxMesa->y_offset - 1; - GLuint i; - - if (MESA_VERBOSE & VERBOSE_DRIVER) { - fprintf(stderr, "fxmesa: fxDDWriteStencilPixels(...)\n"); - } - - for (i = 0; i < n; i++) { - int xpos = x[i] + fxMesa->x_offset; - int ypos = bottom - y[i]; - GLuint d; - rw_fb_span(fxMesa, - GR_BUFFER_AUXBUFFER, - xpos, ypos, - 1, - sizeof(GLdepth), - &d, - FBS_READ); - d = STENCIL_VALUE_TO_DEPTH_VALUE(stencil[i], d); - rw_fb_span(fxMesa, - GR_BUFFER_AUXBUFFER, - xpos, ypos, - 1, - sizeof(GLdepth), - &d, - FBS_WRITE); - } -} -#endif /* disable fxddStencil* funcs */ - - -#define EXTRACT_S_FROM_ZS(zs) (((zs) >> 24) & 0xFF) -#define EXTRACT_Z_FROM_ZS(zs) ((zs) & 0xffffff) -#define BUILD_ZS(z, s) (((s) << 24) | (z)) - -static void write_stencil_span(GLcontext *ctx, GLuint n, GLint x, GLint y, - const GLstencil stencil[], - const GLubyte mask[] ) -{ - fxMesaContext fxMesa = FX_CONTEXT(ctx); - GrLfbInfo_t info; - int s; - void *d; - - BEGIN_BOARD_LOCK(); - info.size = sizeof(info); - if (grLfbLock(GR_LFB_WRITE_ONLY, - GR_BUFFER_AUXBUFFER, - GR_LFBWRITEMODE_Z32, - GR_ORIGIN_UPPER_LEFT, - FXFALSE, - &info)) { - const GLint winY = fxMesa->y_offset + fxMesa->height - 1; - const GLint winX = fxMesa->x_offset; - const GLint scrX = winX + x; - const GLint scrY = winY - y; - - GLint dstStride = info.strideInBytes; - GLubyte *dst = (GLubyte *) info.lfbPtr - + (winY - y) * dstStride + (winX + x) * 4; - GLuint *dst32 = (GLuint *) dst; - GLubyte visMask[MAX_WIDTH]; - GLuint i; - generate_vismask(fxMesa, scrX, scrY, n, visMask); - s = dstStride; - d = dst32; - for (i = 0; i < n; i++) { - if (visMask[i] && (!mask || mask[i])) { - GLuint zs = dst32[i]; - GLuint z = EXTRACT_Z_FROM_ZS(zs); - zs = BUILD_ZS(z, stencil[i]); - dst32[i] = /*zs;*/ stencil[i]; - } - } - grLfbUnlock(GR_LFB_WRITE_ONLY, GR_BUFFER_AUXBUFFER); - } - else { - s = -1; - d = 0; - } - END_BOARD_LOCK(); - /* - printf("write stencil span %d %p\n", s, d); - printf("info: size=%d lfbPtr=%p stride=%x writeMode=%x origin=%x\n", - info.size, info.lfbPtr, info.strideInBytes, info.writeMode, info.origin); - */ -} - - -static void -read_stencil_span(GLcontext *ctx, GLuint n, GLint x, GLint y, - GLstencil stencil[]) -{ - fxMesaContext fxMesa = FX_CONTEXT(ctx); - GrLfbInfo_t info; - /* - int s; - void *d; - */ - - BEGIN_BOARD_LOCK(); - info.size = sizeof(info); - if (grLfbLock(GR_LFB_READ_ONLY, - GR_BUFFER_AUXBUFFER, - GR_LFBWRITEMODE_Z32, - GR_ORIGIN_UPPER_LEFT, - FXFALSE, - &info)) { - const GLint winY = fxMesa->y_offset + fxMesa->height - 1; - const GLint winX = fxMesa->x_offset; - GLint srcStride = /*info.strideInBytes;*/ 8192 ; /* XXX a hack! */ - const GLubyte *src = (const GLubyte *) info.lfbPtr - + (winY - y) * srcStride + (winX + x) * 4; - const GLuint *src32 = (const GLuint *) src; - GLuint i; - /* - s = srcStride; - d = src32; - */ - for (i = 0; i < n; i++) { - stencil[i] = EXTRACT_S_FROM_ZS(src32[i]); - } - grLfbUnlock(GR_LFB_READ_ONLY, GR_BUFFER_AUXBUFFER); - } - END_BOARD_LOCK(); - /* - printf("read stencil span %d %p\n", s, d); - printf("info: size=%d lfbPtr=%p stride=%x writeMode=%x origin=%x\n", - info.size, info.lfbPtr, info.strideInBytes, info.writeMode, info.origin); - */ -} - - -static void -write_stencil_pixels( GLcontext *ctx, GLuint n, - const GLint x[], const GLint y[], - const GLstencil stencil[], const GLubyte mask[]) -{ - /* XXX optimize this */ - GLuint i; - for (i = 0; i < n; i++) { - if (mask[i]) { - write_stencil_span(ctx, 1, x[i], y[i], stencil + i, mask + i); - } - } -} - - -static void -read_stencil_pixels(GLcontext *ctx, GLuint n, const GLint x[], const GLint y[], - GLstencil stencil[]) -{ - /* XXX optimize this */ - GLuint i; - for (i = 0; i < n; i++) { - read_stencil_span(ctx, 1, x[i], y[i], stencil + i); - } -} - - - -void fxSetupDDSpanPointers(GLcontext *ctx) -{ - fxMesaContext fxMesa = FX_CONTEXT(ctx); - - if (ctx->Visual->RedBits == 5 && - ctx->Visual->GreenBits == 6 && - ctx->Visual->BlueBits == 5 && - ctx->Visual->AlphaBits == 0) { - /* 16bpp mode */ - ctx->Driver.WriteRGBASpan = write_R5G6B5_rgba_span; - ctx->Driver.WriteRGBSpan = write_R5G6B5_rgb_span; - ctx->Driver.WriteMonoRGBASpan = write_R5G6B5_mono_span; - ctx->Driver.WriteRGBAPixels = write_R5G6B5_pixels; - ctx->Driver.WriteMonoRGBAPixels = write_R5G6B5_mono_pixels; - ctx->Driver.ReadRGBASpan = read_R5G6B5_span; - ctx->Driver.ReadRGBAPixels = read_R5G6B5_pixels; - } - else if (ctx->Visual->RedBits == 8 && - ctx->Visual->GreenBits == 8 && - ctx->Visual->BlueBits == 8 && - ctx->Visual->AlphaBits == 0) { - /* 24bpp mode */ - ctx->Driver.WriteRGBASpan = write_R8G8B8_rgba_span; - ctx->Driver.WriteRGBSpan = write_R8G8B8_rgb_span; - ctx->Driver.WriteMonoRGBASpan = write_R8G8B8_mono_span; - ctx->Driver.WriteRGBAPixels = write_R8G8B8_pixels; - ctx->Driver.WriteMonoRGBAPixels = write_R8G8B8_mono_pixels; - ctx->Driver.ReadRGBASpan = read_R8G8B8_span; - ctx->Driver.ReadRGBAPixels = read_R8G8B8_pixels; - } - else if (ctx->Visual->RedBits == 8 && - ctx->Visual->GreenBits == 8 && - ctx->Visual->BlueBits == 8 && - ctx->Visual->AlphaBits == 8) { - /* 32bpp mode */ - ctx->Driver.WriteRGBASpan = write_R8G8B8A8_rgba_span; - ctx->Driver.WriteRGBSpan = write_R8G8B8A8_rgb_span; - ctx->Driver.WriteMonoRGBASpan = write_R8G8B8A8_mono_span; - ctx->Driver.WriteRGBAPixels = write_R8G8B8A8_pixels; - ctx->Driver.WriteMonoRGBAPixels = write_R8G8B8A8_mono_pixels; - ctx->Driver.ReadRGBASpan = read_R8G8B8A8_span; - ctx->Driver.ReadRGBAPixels = read_R8G8B8A8_pixels; - } - else { - abort(); - } - - if (fxMesa->haveHwStencil) { - ctx->Driver.WriteStencilSpan = write_stencil_span; - ctx->Driver.ReadStencilSpan = read_stencil_span; - ctx->Driver.WriteStencilPixels = write_stencil_pixels; - ctx->Driver.ReadStencilPixels = read_stencil_pixels; - } - - ctx->Driver.WriteCI8Span = NULL; - ctx->Driver.WriteCI32Span = NULL; - ctx->Driver.WriteMonoCISpan = NULL; - ctx->Driver.WriteCI32Pixels = NULL; - ctx->Driver.WriteMonoCIPixels = NULL; - ctx->Driver.ReadCI32Span = NULL; - ctx->Driver.ReadCI32Pixels = NULL; -} Index: xc/extras/Mesa/src/FX/fxddtex.c diff -u xc/extras/Mesa/src/FX/fxddtex.c:1.5 xc/extras/Mesa/src/FX/fxddtex.c:removed --- xc/extras/Mesa/src/FX/fxddtex.c:1.5 Tue Jun 20 01:08:17 2000 +++ xc/extras/Mesa/src/FX/fxddtex.c Mon Dec 18 14:21:51 2000 @@ -1,1089 +0,0 @@ -/* -*- mode: C; tab-width:8; c-basic-offset:2 -*- */ - -/* - * Mesa 3-D graphics library - * Version: 3.3 - * - * Copyright (C) 1999-2000 Brian Paul All Rights Reserved. - * - * 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 - * BRIAN PAUL 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. - * - * - * Original Mesa / 3Dfx device driver (C) 1999 David Bucciarelli, by the - * terms stated above. - * - * Thank you for your contribution, David! - * - * Please make note of the above copyright/license statement. If you - * contributed code or bug fixes to this code under the previous (GNU - * Library) license and object to the new license, your code will be - * removed at your request. Please see the Mesa docs/COPYRIGHT file - * for more information. - * - * Additional Mesa/3Dfx driver developers: - * Daryll Strauss - * Keith Whitwell - * - * See fxapi.h for more revision/author details. - */ - - -#ifdef HAVE_CONFIG_H -#include "conf.h" -#endif - -#if defined(FX) - -#include "fxdrv.h" -#include "image.h" -#include "texutil.h" - - -void fxPrintTextureData(tfxTexInfo *ti) -{ - fprintf(stderr, "Texture Data:\n"); - if (ti->tObj) { - fprintf(stderr, "\tName: %d\n", ti->tObj->Name); - fprintf(stderr, "\tBaseLevel: %d\n", ti->tObj->BaseLevel); - fprintf(stderr, "\tSize: %d x %d\n", - ti->tObj->Image[ti->tObj->BaseLevel]->Width, - ti->tObj->Image[ti->tObj->BaseLevel]->Height); - } else - fprintf(stderr, "\tName: UNNAMED\n"); - fprintf(stderr, "\tLast used: %d\n", ti->lastTimeUsed); - fprintf(stderr, "\tTMU: %ld\n", ti->whichTMU); - fprintf(stderr, "\t%s\n", (ti->isInTM)?"In TMU":"Not in TMU"); - if (ti->tm[0]) - fprintf(stderr, "\tMem0: %x-%x\n", (unsigned) ti->tm[0]->startAddr, - (unsigned) ti->tm[0]->endAddr); - if (ti->tm[1]) - fprintf(stderr, "\tMem1: %x-%x\n", (unsigned) ti->tm[1]->startAddr, - (unsigned) ti->tm[1]->endAddr); - fprintf(stderr, "\tMipmaps: %d-%d\n", ti->minLevel, ti->maxLevel); - fprintf(stderr, "\tFilters: min %d min %d\n", - (int) ti->minFilt, (int) ti->maxFilt); - fprintf(stderr, "\tClamps: s %d t %d\n", (int) ti->sClamp, (int) ti->tClamp); - fprintf(stderr, "\tScales: s %f t %f\n", ti->sScale, ti->tScale); - fprintf(stderr, "\tInt Scales: s %d t %d\n", - ti->int_sScale/0x800000, ti->int_tScale/0x800000); - fprintf(stderr, "\t%s\n", (ti->fixedPalette)?"Fixed palette":"Non fixed palette"); - fprintf(stderr, "\t%s\n", (ti->validated)?"Validated":"Not validated"); -} - - -/************************************************************************/ -/*************************** Texture Mapping ****************************/ -/************************************************************************/ - -static void fxTexInvalidate(GLcontext *ctx, struct gl_texture_object *tObj) -{ - fxMesaContext fxMesa=(fxMesaContext)ctx->DriverCtx; - tfxTexInfo *ti; - - ti=fxTMGetTexInfo(tObj); - if (ti->isInTM) fxTMMoveOutTM(fxMesa,tObj); /* TO DO: SLOW but easy to write */ - - ti->validated=GL_FALSE; - fxMesa->new_state|=FX_NEW_TEXTURING; - ctx->Driver.RenderStart = fxSetupFXUnits; -} - -static tfxTexInfo *fxAllocTexObjData(fxMesaContext fxMesa) -{ - tfxTexInfo *ti; - int i; - - if(!(ti=CALLOC(sizeof(tfxTexInfo)))) { - fprintf(stderr,"fx Driver: out of memory !\n"); - fxCloseHardware(); - exit(-1); - } - - ti->validated=GL_FALSE; - ti->isInTM=GL_FALSE; - - ti->whichTMU=FX_TMU_NONE; - - ti->tm[FX_TMU0]=NULL; - ti->tm[FX_TMU1]=NULL; - - ti->minFilt=GR_TEXTUREFILTER_POINT_SAMPLED; - ti->maxFilt=GR_TEXTUREFILTER_BILINEAR; - - ti->sClamp=GR_TEXTURECLAMP_WRAP; - ti->tClamp=GR_TEXTURECLAMP_WRAP; - - ti->mmMode=GR_MIPMAP_NEAREST; - ti->LODblend=FXFALSE; - - for(i=0;imipmapLevel[i].data=NULL; - } - - return ti; -} - -void fxDDTexBind(GLcontext *ctx, GLenum target, struct gl_texture_object *tObj) -{ - fxMesaContext fxMesa=(fxMesaContext)ctx->DriverCtx; - tfxTexInfo *ti; - - if (MESA_VERBOSE&VERBOSE_DRIVER) { - fprintf(stderr,"fxmesa: fxDDTexBind(%d,%x)\n",tObj->Name,(GLuint)tObj->DriverData); - } - - if(target!=GL_TEXTURE_2D) - return; - - if (!tObj->DriverData) { - tObj->DriverData=fxAllocTexObjData(fxMesa); - } - - ti=fxTMGetTexInfo(tObj); - - fxMesa->texBindNumber++; - ti->lastTimeUsed=fxMesa->texBindNumber; - - fxMesa->new_state|=FX_NEW_TEXTURING; - ctx->Driver.RenderStart = fxSetupFXUnits; -} - -void fxDDTexEnv(GLcontext *ctx, GLenum target, GLenum pname, const GLfloat *param) -{ - fxMesaContext fxMesa=(fxMesaContext)ctx->DriverCtx; - - if (MESA_VERBOSE&VERBOSE_DRIVER) { - if(param) - fprintf(stderr,"fxmesa: texenv(%x,%x)\n",pname,(GLint)(*param)); - else - fprintf(stderr,"fxmesa: texenv(%x)\n",pname); - } - - /* apply any lod biasing right now */ - if (pname==GL_TEXTURE_LOD_BIAS_EXT) { - FX_grTexLodBiasValue(GR_TMU0,*param); - - if(fxMesa->haveTwoTMUs) { - FX_grTexLodBiasValue(GR_TMU1,*param); - } - - } - - fxMesa->new_state|=FX_NEW_TEXTURING; - ctx->Driver.RenderStart = fxSetupFXUnits; -} - -void fxDDTexParam(GLcontext *ctx, GLenum target, struct gl_texture_object *tObj, - GLenum pname, const GLfloat *params) -{ - fxMesaContext fxMesa=(fxMesaContext)ctx->DriverCtx; - GLenum param=(GLenum)(GLint)params[0]; - tfxTexInfo *ti; - - if (MESA_VERBOSE&VERBOSE_DRIVER) { - fprintf(stderr,"fxmesa: fxDDTexParam(%d,%x,%x,%x)\n",tObj->Name,(GLuint)tObj->DriverData,pname,param); - } - - if(target!=GL_TEXTURE_2D) - return; - - if (!tObj->DriverData) - tObj->DriverData=fxAllocTexObjData(fxMesa); - - ti=fxTMGetTexInfo(tObj); - - switch(pname) { - - case GL_TEXTURE_MIN_FILTER: - switch(param) { - case GL_NEAREST: - ti->mmMode=GR_MIPMAP_DISABLE; - ti->minFilt=GR_TEXTUREFILTER_POINT_SAMPLED; - ti->LODblend=FXFALSE; - break; - case GL_LINEAR: - ti->mmMode=GR_MIPMAP_DISABLE; - ti->minFilt=GR_TEXTUREFILTER_BILINEAR; - ti->LODblend=FXFALSE; - break; - case GL_NEAREST_MIPMAP_NEAREST: - ti->mmMode=GR_MIPMAP_NEAREST; - ti->minFilt=GR_TEXTUREFILTER_POINT_SAMPLED; - ti->LODblend=FXFALSE; - break; - case GL_LINEAR_MIPMAP_NEAREST: - ti->mmMode=GR_MIPMAP_NEAREST; - ti->minFilt=GR_TEXTUREFILTER_BILINEAR; - ti->LODblend=FXFALSE; - break; - case GL_NEAREST_MIPMAP_LINEAR: - if(fxMesa->haveTwoTMUs) { - ti->mmMode=GR_MIPMAP_NEAREST; - ti->LODblend=FXTRUE; - } else { - ti->mmMode=GR_MIPMAP_NEAREST_DITHER; - ti->LODblend=FXFALSE; - } - ti->minFilt=GR_TEXTUREFILTER_POINT_SAMPLED; - break; - case GL_LINEAR_MIPMAP_LINEAR: - if(fxMesa->haveTwoTMUs) { - ti->mmMode=GR_MIPMAP_NEAREST; - ti->LODblend=FXTRUE; - } else { - ti->mmMode=GR_MIPMAP_NEAREST_DITHER; - ti->LODblend=FXFALSE; - } - ti->minFilt=GR_TEXTUREFILTER_BILINEAR; - break; - default: - break; - } - fxTexInvalidate(ctx,tObj); - break; - - case GL_TEXTURE_MAG_FILTER: - switch(param) { - case GL_NEAREST: - ti->maxFilt=GR_TEXTUREFILTER_POINT_SAMPLED; - break; - case GL_LINEAR: - ti->maxFilt=GR_TEXTUREFILTER_BILINEAR; - break; - default: - break; - } - fxTexInvalidate(ctx,tObj); - break; - - case GL_TEXTURE_WRAP_S: - switch(param) { - case GL_CLAMP: - ti->sClamp=GR_TEXTURECLAMP_CLAMP; - break; - case GL_REPEAT: - ti->sClamp=GR_TEXTURECLAMP_WRAP; - break; - default: - break; - } - fxMesa->new_state|=FX_NEW_TEXTURING; - ctx->Driver.RenderStart = fxSetupFXUnits; - break; - - case GL_TEXTURE_WRAP_T: - switch(param) { - case GL_CLAMP: - ti->tClamp=GR_TEXTURECLAMP_CLAMP; - break; - case GL_REPEAT: - ti->tClamp=GR_TEXTURECLAMP_WRAP; - break; - default: - break; - } - fxMesa->new_state|=FX_NEW_TEXTURING; - ctx->Driver.RenderStart = fxSetupFXUnits; - break; - - case GL_TEXTURE_BORDER_COLOR: - /* TO DO */ - break; - - case GL_TEXTURE_MIN_LOD: - /* TO DO */ - break; - case GL_TEXTURE_MAX_LOD: - /* TO DO */ - break; - case GL_TEXTURE_BASE_LEVEL: - fxTexInvalidate(ctx,tObj); - break; - case GL_TEXTURE_MAX_LEVEL: - fxTexInvalidate(ctx,tObj); - break; - - default: - break; - } -} - -void fxDDTexDel(GLcontext *ctx, struct gl_texture_object *tObj) -{ - fxMesaContext fxMesa = FX_CONTEXT(ctx); - tfxTexInfo *ti = fxTMGetTexInfo(tObj); - - if (MESA_VERBOSE & VERBOSE_DRIVER) { - fprintf(stderr, "fxmesa: fxDDTexDel(%d,%p)\n", tObj->Name, ti); - } - - if (!ti) - return; - - fxTMFreeTexture(fxMesa, tObj); - - FREE(ti); - tObj->DriverData = NULL; - - ctx->NewState |= NEW_TEXTURING; -} - - - -/* - * Convert a gl_color_table texture palette to Glide's format. - */ -static void -convertPalette(FxU32 data[256], const struct gl_color_table *table) -{ - const GLubyte *tableUB = (const GLubyte *) table->Table; - GLint width = table->Size; - FxU32 r, g, b, a; - GLint i; - - ASSERT(table->TableType == GL_UNSIGNED_BYTE); - - switch (table->Format) { - case GL_INTENSITY: - for (i = 0; i < width; i++) { - r = tableUB[i]; - g = tableUB[i]; - b = tableUB[i]; - a = tableUB[i]; - data[i] = (a << 24) | (r << 16) | (g << 8) | b; - } - break; - case GL_LUMINANCE: - for (i = 0; i < width; i++) { - r = tableUB[i]; - g = tableUB[i]; - b = tableUB[i]; - a = 255; - data[i] = (a << 24) | (r << 16) | (g << 8) | b; - } - break; - case GL_ALPHA: - for (i = 0; i < width; i++) { - r = g = b = 255; - a = tableUB[i]; - data[i] = (a << 24) | (r << 16) | (g << 8) | b; - } - break; - case GL_LUMINANCE_ALPHA: - for (i = 0; i < width; i++) { - r = g = b = tableUB[i*2+0]; - a = tableUB[i*2+1]; - data[i] = (a << 24) | (r << 16) | (g << 8) | b; - } - break; - case GL_RGB: - for (i = 0; i < width; i++) { - r = tableUB[i*3+0]; - g = tableUB[i*3+1]; - b = tableUB[i*3+2]; - a = 255; - data[i] = (a << 24) | (r << 16) | (g << 8) | b; - } - break; - case GL_RGBA: - for (i = 0; i < width; i++) { - r = tableUB[i*4+0]; - g = tableUB[i*4+1]; - b = tableUB[i*4+2]; - a = tableUB[i*4+3]; - data[i] = (a << 24) | (r << 16) | (g << 8) | b; - } - break; - } -} - - -void fxDDTexPalette(GLcontext *ctx, struct gl_texture_object *tObj) -{ - fxMesaContext fxMesa = FX_CONTEXT(ctx); - - if (tObj) { - /* per-texture palette */ - tfxTexInfo *ti; - if (MESA_VERBOSE & VERBOSE_DRIVER) { - fprintf(stderr, "fxmesa: fxDDTexPalette(%d,%x)\n", - tObj->Name, (GLuint) tObj->DriverData); - } - if (!tObj->DriverData) - tObj->DriverData = fxAllocTexObjData(fxMesa); - ti = fxTMGetTexInfo(tObj); - convertPalette(ti->palette.data, &tObj->Palette); - fxTexInvalidate(ctx, tObj); - } - else { - /* global texture palette */ - if (MESA_VERBOSE & VERBOSE_DRIVER) { - fprintf(stderr, "fxmesa: fxDDTexPalette(global)\n"); - } - convertPalette(fxMesa->glbPalette.data, &ctx->Texture.Palette); - fxMesa->new_state |= FX_NEW_TEXTURING; - ctx->Driver.RenderStart = fxSetupFXUnits; - } -} - - -void fxDDTexUseGlbPalette(GLcontext *ctx, GLboolean state) -{ - fxMesaContext fxMesa = FX_CONTEXT(ctx); - - if (MESA_VERBOSE&VERBOSE_DRIVER) { - fprintf(stderr,"fxmesa: fxDDTexUseGlbPalette(%d)\n",state); - } - - if (state) { - fxMesa->haveGlobalPaletteTexture = 1; - - FX_grTexDownloadTable(GR_TMU0,GR_TEXTABLE_PALETTE, &(fxMesa->glbPalette)); - if (fxMesa->haveTwoTMUs) - FX_grTexDownloadTable(GR_TMU1, GR_TEXTABLE_PALETTE, &(fxMesa->glbPalette)); - } - else { - fxMesa->haveGlobalPaletteTexture = 0; - - if ((ctx->Texture.Unit[0].Current == ctx->Texture.Unit[0].CurrentD[2]) && - (ctx->Texture.Unit[0].Current != NULL)) { - struct gl_texture_object *tObj = ctx->Texture.Unit[0].Current; - - if (!tObj->DriverData) - tObj->DriverData = fxAllocTexObjData(fxMesa); - - fxTexInvalidate(ctx, tObj); - } - } -} - - -static int logbase2(int n) -{ - GLint i = 1; - GLint log2 = 0; - - if (n<0) { - return -1; - } - - while (n > i) { - i *= 2; - log2++; - } - if (i != n) { - return -1; - } - else { - return log2; - } -} - -/* Need different versions for different cpus. - */ -#define INT_TRICK(l2) (0x800000 * (l2)) -int fxTexGetInfo(int w, int h, GrLOD_t *lodlevel, - GrAspectRatio_t *aspectratio, - float *sscale, float *tscale, - int *i_sscale, int *i_tscale, - int *wscale, int *hscale) -{ - int logw, logh, ar, l, is, it, ws, hs; - float s, t; - - logw=logbase2(w); - logh=logbase2(h); - ar=logw-logh; - /* Hardware only allows a maximum aspect ratio of 8x1, so handle - |ar|>3 by scaling the image and using an 8x1 aspect ratio */ - if (ar>=0) { - l=logw; - s=256.0; - is=INT_TRICK(8); - ws=1; - if (ar<3) { - t=256>>ar; - it=INT_TRICK(8-ar); - hs=1; - } else { - t=32.0; - it=INT_TRICK(5); - hs=1<<(ar-3); - } - } else { - l=logh; - t=256.0; - it=INT_TRICK(8); - hs=1; - if (-ar<3) { - s=256>>-ar; - is=INT_TRICK(8+ar); - ws=1; - } else { - s=32.0; - is=INT_TRICK(5); - ws=1<<(-ar-3); - } - } - if (ar<-3) ar=-3; - if (ar>3) ar=3; - - /* The above numbers are calculated sensibly and work for Glide3, but - we change them to the whacky glide2 values if needed. */ -#ifdef FX_GLIDE3 - if (lodlevel) *lodlevel=l; - if (aspectratio) *aspectratio=ar; -#else - if (lodlevel) *lodlevel=8-l; - if (aspectratio) *aspectratio=3-ar; -#endif - if (sscale) *sscale=s; - if (tscale) *tscale=t; - if (wscale) *wscale=ws; - if (hscale) *hscale=hs; - if (i_sscale) *i_sscale = is; - if (i_tscale) *i_tscale = it; - return 1; -} - -/* - * Given an OpenGL internal texture format, return the corresponding - * Glide internal texture format and base texture format. - */ -void fxTexGetFormat(GLenum glformat, GrTextureFormat_t *tfmt, GLint *ifmt) -{ - switch(glformat) { - case 1: - case GL_LUMINANCE: - case GL_LUMINANCE4: - case GL_LUMINANCE8: - case GL_LUMINANCE12: - case GL_LUMINANCE16: - if(tfmt) - (*tfmt)=GR_TEXFMT_INTENSITY_8; - if(ifmt) - (*ifmt)=GL_LUMINANCE; - break; - case 2: - case GL_LUMINANCE_ALPHA: - case GL_LUMINANCE4_ALPHA4: - case GL_LUMINANCE6_ALPHA2: - case GL_LUMINANCE8_ALPHA8: - case GL_LUMINANCE12_ALPHA4: - case GL_LUMINANCE12_ALPHA12: - case GL_LUMINANCE16_ALPHA16: - if(tfmt) - (*tfmt)=GR_TEXFMT_ALPHA_INTENSITY_88; - if(ifmt) - (*ifmt)=GL_LUMINANCE_ALPHA; - break; - case GL_INTENSITY: - case GL_INTENSITY4: - case GL_INTENSITY8: - case GL_INTENSITY12: - case GL_INTENSITY16: - if(tfmt) - (*tfmt)=GR_TEXFMT_ALPHA_8; - if(ifmt) - (*ifmt)=GL_INTENSITY; - break; - case GL_ALPHA: - case GL_ALPHA4: - case GL_ALPHA8: - case GL_ALPHA12: - case GL_ALPHA16: - if(tfmt) - (*tfmt)=GR_TEXFMT_ALPHA_8; - if(ifmt) - (*ifmt)=GL_ALPHA; - break; - case 3: - case GL_RGB: - case GL_R3_G3_B2: - case GL_RGB4: - case GL_RGB5: - if(tfmt) - (*tfmt)=GR_TEXFMT_RGB_565; - if(ifmt) - (*ifmt)=GL_RGB; - break; - case GL_RGB8: - case GL_RGB10: - case GL_RGB12: - case GL_RGB16: - if(tfmt) - (*tfmt)=GR_TEXFMT_ARGB_8888; - if(ifmt) - (*ifmt)=GL_RGB; - break; - case 4: - case GL_RGBA: - case GL_RGBA2: - case GL_RGBA4: - if(tfmt) - (*tfmt)=GR_TEXFMT_ARGB_4444; - if(ifmt) - (*ifmt)=GL_RGBA; - break; - case GL_RGBA8: - case GL_RGB10_A2: - case GL_RGBA12: - case GL_RGBA16: - if(tfmt) - (*tfmt)=GR_TEXFMT_ARGB_8888; - if(ifmt) - (*ifmt)=GL_RGBA; - break; - case GL_RGB5_A1: - if(tfmt) - (*tfmt)=GR_TEXFMT_ARGB_1555; - if(ifmt) - (*ifmt)=GL_RGBA; - break; - case GL_COLOR_INDEX: - case GL_COLOR_INDEX1_EXT: - case GL_COLOR_INDEX2_EXT: - case GL_COLOR_INDEX4_EXT: - case GL_COLOR_INDEX8_EXT: - case GL_COLOR_INDEX12_EXT: - case GL_COLOR_INDEX16_EXT: - if(tfmt) - (*tfmt)=GR_TEXFMT_P_8; - if(ifmt) - (*ifmt)=GL_RGBA; /* XXX why is this RGBA? */ - break; - default: - fprintf(stderr, - "fx Driver: unsupported internalFormat in fxTexGetFormat()\n"); - fxCloseHardware(); - exit(-1); - break; - } -} - -static GLboolean fxIsTexSupported(GLenum target, GLint internalFormat, - const struct gl_texture_image *image) -{ - if(target != GL_TEXTURE_2D) - return GL_FALSE; - - if(!fxTexGetInfo(image->Width,image->Height,NULL,NULL,NULL,NULL,NULL,NULL, - NULL,NULL)) - return GL_FALSE; - - if (image->Border > 0) - return GL_FALSE; - - return GL_TRUE; -} - - -/**********************************************************************/ -/**** NEW TEXTURE IMAGE FUNCTIONS ****/ -/**********************************************************************/ - -GLboolean fxDDTexImage2D(GLcontext *ctx, GLenum target, GLint level, - GLenum format, GLenum type, const GLvoid *pixels, - const struct gl_pixelstore_attrib *packing, - struct gl_texture_object *texObj, - struct gl_texture_image *texImage, - GLboolean *retainInternalCopy) -{ - fxMesaContext fxMesa = (fxMesaContext)ctx->DriverCtx; - - if (target != GL_TEXTURE_2D) - return GL_FALSE; - - if (!texObj->DriverData) - texObj->DriverData = fxAllocTexObjData(fxMesa); - - if (fxIsTexSupported(target, texImage->IntFormat, texImage)) { - GrTextureFormat_t gldformat; - tfxTexInfo *ti = fxTMGetTexInfo(texObj); - tfxMipMapLevel *mml = &ti->mipmapLevel[level]; - GLint dstWidth, dstHeight, wScale, hScale, texelSize, dstStride; - MesaIntTexFormat intFormat; - - fxTexGetFormat(texImage->IntFormat, &gldformat, NULL); - - fxTexGetInfo(texImage->Width, texImage->Height, NULL,NULL,NULL,NULL, - NULL,NULL, &wScale, &hScale); - - dstWidth = texImage->Width * wScale; - dstHeight = texImage->Height * hScale; - - switch (texImage->IntFormat) { - case GL_INTENSITY: - case GL_INTENSITY4: - case GL_INTENSITY8: - case GL_INTENSITY12: - case GL_INTENSITY16: - texelSize = 1; - intFormat = MESA_I8; - break; - case 1: - case GL_LUMINANCE: - case GL_LUMINANCE4: - case GL_LUMINANCE8: - case GL_LUMINANCE12: - case GL_LUMINANCE16: - texelSize = 1; - intFormat = MESA_L8; - break; - case GL_ALPHA: - case GL_ALPHA4: - case GL_ALPHA8: - case GL_ALPHA12: - case GL_ALPHA16: - texelSize = 1; - intFormat = MESA_A8; - break; - case GL_COLOR_INDEX: - case GL_COLOR_INDEX1_EXT: - case GL_COLOR_INDEX2_EXT: - case GL_COLOR_INDEX4_EXT: - case GL_COLOR_INDEX8_EXT: - case GL_COLOR_INDEX12_EXT: - case GL_COLOR_INDEX16_EXT: - texelSize = 1; - intFormat = MESA_C8; - break; - case 2: - case GL_LUMINANCE_ALPHA: - case GL_LUMINANCE4_ALPHA4: - case GL_LUMINANCE6_ALPHA2: - case GL_LUMINANCE8_ALPHA8: - case GL_LUMINANCE12_ALPHA4: - case GL_LUMINANCE12_ALPHA12: - case GL_LUMINANCE16_ALPHA16: - texelSize = 2; - intFormat = MESA_A8_L8; - break; - case 3: - case GL_RGB: - case GL_R3_G3_B2: - case GL_RGB4: - case GL_RGB5: - texelSize = 2; - intFormat = MESA_R5_G6_B5; - break; - case GL_RGB8: - case GL_RGB10: - case GL_RGB12: - case GL_RGB16: - texelSize = 4; - intFormat = MESA_A8_R8_G8_B8; - break; - case 4: - case GL_RGBA: - case GL_RGBA2: - case GL_RGBA4: - texelSize = 2; - intFormat = MESA_A4_R4_G4_B4; - break; - case GL_RGBA8: - case GL_RGB10_A2: - case GL_RGBA12: - case GL_RGBA16: - texelSize = 4; - intFormat = MESA_A8_R8_G8_B8; - break; - case GL_RGB5_A1: - texelSize = 2; - intFormat = MESA_A1_R5_G5_B5; - break; - default: - gl_problem(NULL, "tdfx driver: texbuildimagemap() bad format"); - return GL_FALSE; - } - - _mesa_set_teximage_component_sizes(intFormat, texImage); - - /*printf("teximage:\n");*/ - /* allocate new storage for texture image, if needed */ - if (!mml->data || mml->glideFormat != gldformat || - mml->width != dstWidth || mml->height != dstHeight) { - if (mml->data) - FREE(mml->data); - mml->data = MALLOC(dstWidth * dstHeight * texelSize); - if (!mml->data) - return GL_FALSE; - mml->texelSize = texelSize; - mml->glideFormat = gldformat; - mml->width = dstWidth; - mml->height = dstHeight; - fxTexInvalidate(ctx, texObj); - } - - dstStride = dstWidth * texelSize; - - /* store the texture image */ - if (!_mesa_convert_teximage(intFormat, dstWidth, dstHeight, mml->data, - dstStride, - texImage->Width, texImage->Height, - format, type, pixels, packing)) { - return GL_FALSE; - } - - if (ti->validated && ti->isInTM) { - /*printf("reloadmipmaplevels\n");*/ - fxTMReloadMipMapLevel(fxMesa, texObj, level); - } - else { - /*printf("invalidate2\n");*/ - fxTexInvalidate(ctx,texObj); - } - - *retainInternalCopy = GL_FALSE; - return GL_TRUE; - } - else { - gl_problem(NULL, "fx Driver: unsupported texture in fxDDTexImg()\n"); - return GL_FALSE; - } -} - - -GLboolean fxDDTexSubImage2D(GLcontext *ctx, GLenum target, GLint level, - GLint xoffset, GLint yoffset, - GLsizei width, GLsizei height, - GLenum format, GLenum type, const GLvoid *pixels, - const struct gl_pixelstore_attrib *packing, - struct gl_texture_object *texObj, - struct gl_texture_image *texImage) -{ - fxMesaContext fxMesa = (fxMesaContext) ctx->DriverCtx; - tfxTexInfo *ti; - GLint wscale, hscale, dstStride; - tfxMipMapLevel *mml; - GLboolean result; - - if (target != GL_TEXTURE_2D) - return GL_FALSE; - - if (!texObj->DriverData) - return GL_FALSE; - - ti = fxTMGetTexInfo(texObj); - mml = &ti->mipmapLevel[level]; - - fxTexGetInfo( texImage->Width, texImage->Height, NULL,NULL,NULL,NULL, - NULL,NULL, &wscale, &hscale); - - assert(mml->data); /* must have an existing texture image! */ - - switch (mml->glideFormat) { - case GR_TEXFMT_INTENSITY_8: - dstStride = mml->width; - result = _mesa_convert_texsubimage(MESA_I8, xoffset, yoffset, - mml->width, mml->height, mml->data, - dstStride, width, height, - texImage->Width, texImage->Height, - format, type, pixels, packing); - break; - case GR_TEXFMT_ALPHA_8: - dstStride = mml->width; - result = _mesa_convert_texsubimage(MESA_A8, xoffset, yoffset, - mml->width, mml->height, mml->data, - dstStride, width, height, - texImage->Width, texImage->Height, - format, type, pixels, packing); - break; - case GR_TEXFMT_P_8: - dstStride = mml->width; - result = _mesa_convert_texsubimage(MESA_C8, xoffset, yoffset, - mml->width, mml->height, mml->data, - dstStride, width, height, - texImage->Width, texImage->Height, - format, type, pixels, packing); - break; - case GR_TEXFMT_ALPHA_INTENSITY_88: - dstStride = mml->width * 2; - result = _mesa_convert_texsubimage(MESA_A8_L8, xoffset, yoffset, - mml->width, mml->height, mml->data, - dstStride, width, height, - texImage->Width, texImage->Height, - format, type, pixels, packing); - break; - case GR_TEXFMT_RGB_565: - dstStride = mml->width * 2; - result = _mesa_convert_texsubimage(MESA_R5_G6_B5, xoffset, yoffset, - mml->width, mml->height, mml->data, - dstStride, width, height, - texImage->Width, texImage->Height, - format, type, pixels, packing); - break; - case GR_TEXFMT_ARGB_4444: - dstStride = mml->width * 2; - result = _mesa_convert_texsubimage(MESA_A4_R4_G4_B4, xoffset, yoffset, - mml->width, mml->height, mml->data, - dstStride, width, height, - texImage->Width, texImage->Height, - format, type, pixels, packing); - break; - case GR_TEXFMT_ARGB_8888: - dstStride = mml->width * 4; - result = _mesa_convert_texsubimage(MESA_A8_R8_G8_B8, xoffset, yoffset, - mml->width, mml->height, mml->data, - dstStride, width, height, - texImage->Width, texImage->Height, - format, type, pixels, packing); - break; - case GR_TEXFMT_ARGB_1555: - dstStride = mml->width * 2; - result = _mesa_convert_texsubimage(MESA_A1_R5_G5_B5, xoffset, yoffset, - mml->width, mml->height, mml->data, - dstStride, width, height, - texImage->Width, texImage->Height, - format, type, pixels, packing); - break; - default: - gl_problem(NULL, "tdfx driver: fxTexBuildSubImageMap() bad format"); - result = GL_FALSE; - } - - if (!result) { - return GL_FALSE; - } - - if (ti->validated && ti->isInTM) - /* Don't use this, it's very broken. Download whole image for now. - fxTMReloadSubMipMapLevel(fxMesa, texObj, level, yoffset, height); - */ - fxTMReloadMipMapLevel(fxMesa, texObj, level); - else - fxTexInvalidate(ctx, texObj); - - return GL_TRUE; -} - - -static void PrintTexture(int w, int h, int c, const GLubyte *data) -{ - int i, j; - for (i = 0; i < h; i++) { - for (j = 0; j < w; j++) { - if (c==2) - printf("%02x %02x ", data[0], data[1]); - else if (c==3) - printf("%02x %02x %02x ", data[0], data[1], data[2]); - data += c; - } - printf("\n"); - } -} - - -GLvoid *fxDDGetTexImage(GLcontext *ctx, GLenum target, GLint level, - const struct gl_texture_object *texObj, - GLenum *formatOut, GLenum *typeOut, - GLboolean *freeImageOut ) -{ - tfxTexInfo *ti; - tfxMipMapLevel *mml; - - if (target != GL_TEXTURE_2D) - return NULL; - - if (!texObj->DriverData) - return NULL; - - ti = fxTMGetTexInfo(texObj); - mml = &ti->mipmapLevel[level]; - if (mml->data) { - MesaIntTexFormat mesaFormat; - GLenum glFormat; - struct gl_texture_image *texImage = texObj->Image[level]; - GLint srcStride; - - GLubyte *data = (GLubyte *) MALLOC(texImage->Width * texImage->Height * 4); - if (!data) - return NULL; - - switch (mml->glideFormat) { - case GR_TEXFMT_INTENSITY_8: - mesaFormat = MESA_I8; - glFormat = GL_INTENSITY; - srcStride = mml->width; - break; - case GR_TEXFMT_ALPHA_INTENSITY_88: - mesaFormat = MESA_A8_L8; - glFormat = GL_LUMINANCE_ALPHA; - srcStride = mml->width; - break; - case GR_TEXFMT_ALPHA_8: - mesaFormat = MESA_A8; - glFormat = GL_ALPHA; - srcStride = mml->width; - break; - case GR_TEXFMT_RGB_565: - mesaFormat = MESA_R5_G6_B5; - glFormat = GL_RGB; - srcStride = mml->width * 2; - break; - case GR_TEXFMT_ARGB_8888: - mesaFormat = MESA_A8_R8_G8_B8; - glFormat = GL_RGBA; - srcStride = mml->width * 4; - break; - case GR_TEXFMT_ARGB_4444: - mesaFormat = MESA_A4_R4_G4_B4; - glFormat = GL_RGBA; - srcStride = mml->width * 2; - break; - case GR_TEXFMT_ARGB_1555: - mesaFormat = MESA_A1_R5_G5_B5; - glFormat = GL_RGBA; - srcStride = mml->width * 2; - break; - case GR_TEXFMT_P_8: - mesaFormat = MESA_C8; - glFormat = GL_COLOR_INDEX; - srcStride = mml->width; - break; - default: - gl_problem(NULL, "Bad glideFormat in fxDDGetTexImage"); - return NULL; - } - _mesa_unconvert_teximage(mesaFormat, mml->width, mml->height, mml->data, - srcStride, texImage->Width, texImage->Height, - glFormat, data); - *formatOut = glFormat; - *typeOut = GL_UNSIGNED_BYTE; - *freeImageOut = GL_TRUE; - return data; - } - else { - return NULL; - } -} - - -#else - - -/* - * Need this to provide at least one external definition. - */ - -int gl_fx_dummy_function_ddtex(void) -{ - return 0; -} - -#endif /* FX */ Index: xc/extras/Mesa/src/FX/fxdrv.h diff -u xc/extras/Mesa/src/FX/fxdrv.h:1.5 xc/extras/Mesa/src/FX/fxdrv.h:removed --- xc/extras/Mesa/src/FX/fxdrv.h:1.5 Fri Jun 16 20:02:34 2000 +++ xc/extras/Mesa/src/FX/fxdrv.h Mon Dec 18 14:21:51 2000 @@ -1,691 +0,0 @@ -/* -*- mode: C; tab-width:8; c-basic-offset:2 -*- */ - -/* - * Mesa 3-D graphics library - * Version: 3.3 - * - * Copyright (C) 1999-2000 Brian Paul All Rights Reserved. - * - * 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 - * BRIAN PAUL 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. - * - * - * Original Mesa / 3Dfx device driver (C) 1999 David Bucciarelli, by the - * terms stated above. - * - * Thank you for your contribution, David! - * - * Please make note of the above copyright/license statement. If you - * contributed code or bug fixes to this code under the previous (GNU - * Library) license and object to the new license, your code will be - * removed at your request. Please see the Mesa docs/COPYRIGHT file - * for more information. - * - * Additional Mesa/3Dfx driver developers: - * Daryll Strauss - * Keith Whitwell - * - * See fxapi.h for more revision/author details. - */ - - -#ifndef FXDRV_H -#define FXDRV_H - -/* If you comment out this define, a variable takes its place, letting - * you turn debugging on/off from the debugger. - */ - -#ifdef XFree86Server -#include "GL/xf86glx.h" -#else -#include "glheader.h" -#endif - - -#if defined(__linux__) -#include -#endif - -#include "context.h" -#include "macros.h" -#include "matrix.h" -#include "mem.h" -#include "texture.h" -#include "types.h" -#include "vb.h" -#include "xform.h" -#include "clip.h" -#include "vbrender.h" - -#ifdef XF86DRI -typedef struct tfxMesaContext *fxMesaContext; -#else -#include "GL/fxmesa.h" -#endif -#include "fxglidew.h" -/* use gl/gl.h GLAPI/GLAPIENTRY/GLCALLBACK in place of WINGDIAPI/APIENTRY/CALLBACK, */ -/* these are defined in mesa gl/gl.h - tjump@spgs.com */ - - - -extern void fx_sanity_triangle( GrVertex *, GrVertex *, GrVertex * ); -#if defined(MESA_DEBUG) && 0 -#define grDrawTriangle fx_sanity_triangle -#endif - - -/* Define some shorter names for these things. - */ -#define XCOORD GR_VERTEX_X_OFFSET -#define YCOORD GR_VERTEX_Y_OFFSET -#define ZCOORD GR_VERTEX_OOZ_OFFSET -#define OOWCOORD GR_VERTEX_OOW_OFFSET - -#define RCOORD GR_VERTEX_R_OFFSET -#define GCOORD GR_VERTEX_G_OFFSET -#define BCOORD GR_VERTEX_B_OFFSET -#define ACOORD GR_VERTEX_A_OFFSET - -#define S0COORD GR_VERTEX_SOW_TMU0_OFFSET -#define T0COORD GR_VERTEX_TOW_TMU0_OFFSET -#define S1COORD GR_VERTEX_SOW_TMU1_OFFSET -#define T1COORD GR_VERTEX_TOW_TMU1_OFFSET - - -#if FX_USE_PARGB - -#define CLIP_XCOORD 0 /* normal place */ -#define CLIP_YCOROD 1 /* normal place */ -#define CLIP_ZCOORD 2 /* normal place */ -#define CLIP_WCOORD 3 /* normal place */ -#define CLIP_GCOORD 4 /* GR_VERTEX_PARGB_OFFSET */ -#define CLIP_BCOORD 5 /* GR_VERTEX_SOW_TMU0_OFFSET */ -#define CLIP_RCOORD 6 /* GR_VERTEX_TOW_TMU0_OFFSET */ -#define CLIP_ACOORD 7 /* GR_VERTEX_OOW_TMU0_OFFSET */ - -#else - -#define CLIP_XCOORD 0 /* normal place */ -#define CLIP_YCOROD 1 /* normal place */ -#define CLIP_ZCOORD 2 /* GR_VERTEX_Z_OFFSET */ -#define CLIP_WCOORD 3 /* GR_VERTEX_R_OFFSET */ -#define CLIP_GCOORD 4 /* normal place */ -#define CLIP_BCOORD 5 /* normal place */ -#define CLIP_RCOORD 6 /* GR_VERTEX_OOZ_OFFSET */ -#define CLIP_ACOORD 7 /* normal place */ - - -#endif - -/* Should have size == 16 * sizeof(float). - */ -typedef struct { - GLfloat f[15]; /* Same layout as GrVertex */ - GLubyte mask; /* Unsued */ - GLubyte usermask; /* Unused */ -} fxVertex; - - - - -#if defined(FXMESA_USE_ARGB) -#define FXCOLOR4( c ) ( \ - ( ((unsigned int)(c[3]))<<24 ) | \ - ( ((unsigned int)(c[0]))<<16 ) | \ - ( ((unsigned int)(c[1]))<<8 ) | \ - ( (unsigned int)(c[2])) ) - -#else -#ifdef __i386__ -#define FXCOLOR4( c ) (* (int *)c) -#else -#define FXCOLOR4( c ) ( \ - ( ((unsigned int)(c[3]))<<24 ) | \ - ( ((unsigned int)(c[2]))<<16 ) | \ - ( ((unsigned int)(c[1]))<<8 ) | \ - ( (unsigned int)(c[0])) ) -#endif -#endif - - -#define FX_VB_COLOR(fxm, color) \ - do { \ - if (sizeof(GLint) == 4*sizeof(GLubyte)) { \ - if (fxm->constColor != *(GLuint*)color) { \ - fxm->constColor = *(GLuint*)color; \ - FX_grConstantColorValue(FXCOLOR4(color)); \ - } \ - } else { \ - FX_grConstantColorValue(FXCOLOR4(color)); \ - } \ - } while (0) - -#define GOURAUD(x) { \ - GLubyte *col = VB->ColorPtr->data[(x)]; \ - gWin[(x)].v.r=UBYTE_COLOR_TO_FLOAT_255_COLOR(col[0]); \ - gWin[(x)].v.g=UBYTE_COLOR_TO_FLOAT_255_COLOR(col[1]); \ - gWin[(x)].v.b=UBYTE_COLOR_TO_FLOAT_255_COLOR(col[2]); \ - gWin[(x)].v.a=UBYTE_COLOR_TO_FLOAT_255_COLOR(col[3]); \ -} - -#if FX_USE_PARGB -#define GOURAUD2(v, c) { \ - GLubyte *col = c; \ - v->argb=MESACOLOR2PARGB(col); \ -} -#else -#define GOURAUD2(v, c) { \ - GLubyte *col = c; \ - v->r=UBYTE_COLOR_TO_FLOAT_255_COLOR(col[0]); \ - v->g=UBYTE_COLOR_TO_FLOAT_255_COLOR(col[1]); \ - v->b=UBYTE_COLOR_TO_FLOAT_255_COLOR(col[2]); \ - v->a=UBYTE_COLOR_TO_FLOAT_255_COLOR(col[3]); \ -} -#endif - - -/* Mergable items first - */ -#define SETUP_RGBA 0x1 -#define SETUP_TMU0 0x2 -#define SETUP_TMU1 0x4 -#define SETUP_XY 0x8 -#define SETUP_Z 0x10 -#define SETUP_W 0x20 - -#define MAX_MERGABLE 0x8 - - -#define FX_NUM_TMU 2 - -#define FX_TMU0 GR_TMU0 -#define FX_TMU1 GR_TMU1 -#define FX_TMU_SPLIT 98 -#define FX_TMU_BOTH 99 -#define FX_TMU_NONE 100 - -/* Used for fxMesa->lastUnitsMode */ - -#define FX_UM_NONE 0x00000000 - -#define FX_UM_E0_REPLACE 0x00000001 -#define FX_UM_E0_MODULATE 0x00000002 -#define FX_UM_E0_DECAL 0x00000004 -#define FX_UM_E0_BLEND 0x00000008 -#define FX_UM_E0_ADD 0x00000010 - -#define FX_UM_E1_REPLACE 0x00000020 -#define FX_UM_E1_MODULATE 0x00000040 -#define FX_UM_E1_DECAL 0x00000080 -#define FX_UM_E1_BLEND 0x00000100 -#define FX_UM_E1_ADD 0x00000200 - -#define FX_UM_E_ENVMODE 0x000003ff - -#define FX_UM_E0_ALPHA 0x00001000 -#define FX_UM_E0_LUMINANCE 0x00002000 -#define FX_UM_E0_LUMINANCE_ALPHA 0x00004000 -#define FX_UM_E0_INTENSITY 0x00008000 -#define FX_UM_E0_RGB 0x00010000 -#define FX_UM_E0_RGBA 0x00020000 - -#define FX_UM_E1_ALPHA 0x00040000 -#define FX_UM_E1_LUMINANCE 0x00080000 -#define FX_UM_E1_LUMINANCE_ALPHA 0x00100000 -#define FX_UM_E1_INTENSITY 0x00200000 -#define FX_UM_E1_RGB 0x00400000 -#define FX_UM_E1_RGBA 0x00800000 - -#define FX_UM_E_IFMT 0x00fff000 - -#define FX_UM_COLOR_ITERATED 0x01000000 -#define FX_UM_COLOR_CONSTANT 0x02000000 -#define FX_UM_ALPHA_ITERATED 0x04000000 -#define FX_UM_ALPHA_CONSTANT 0x08000000 - - -#define PACK_BGRA32(R, G, B, A) \ - ( (((GLuint) (R)) << 16) | \ - (((GLuint) (G)) << 8) | \ - (((GLuint) (B)) ) | \ - (((GLuint) (A)) << 24) ) - -#define PACK_RGBA32(R, G, B, A) \ - ( (((GLuint) (R)) ) | \ - (((GLuint) (G)) << 8) | \ - (((GLuint) (B)) << 16) | \ - (((GLuint) (A)) << 24) ) - - -typedef void (*tfxRenderVBFunc)(GLcontext *); - -/* - Memory range from startAddr to endAddr-1 -*/ -typedef struct MemRange_t { - struct MemRange_t *next; - FxU32 startAddr, endAddr; -} MemRange; - -typedef struct { - GLsizei width, height; /* image size */ - GLint texelSize; /* How many bytes to a texel */ - GrTextureFormat_t glideFormat; /* Glide image format */ - unsigned short *data; /* Glide-formated texture image */ -} tfxMipMapLevel; - -typedef struct tfxTexInfo_t { - struct tfxTexInfo *next; - struct gl_texture_object *tObj; - - GLuint lastTimeUsed; - FxU32 whichTMU; - GLboolean isInTM; - - tfxMipMapLevel mipmapLevel[MAX_TEXTURE_LEVELS]; - - MemRange *tm[FX_NUM_TMU]; - - GLint minLevel, maxLevel; - GLint baseLevelInternalFormat; - - GrTexInfo info; - - GrTextureFilterMode_t minFilt; - GrTextureFilterMode_t maxFilt; - FxBool LODblend; - - GrTextureClampMode_t sClamp; - GrTextureClampMode_t tClamp; - - GrMipMapMode_t mmMode; - - GLfloat sScale, tScale; - GLint int_sScale, int_tScale; /* x86 floating point trick for - * multiplication by powers of 2. - * Used in fxfasttmp.h - */ - - GuTexPalette palette; - - GLboolean fixedPalette; - GLboolean validated; -} tfxTexInfo; - -typedef struct { - GLuint swapBuffer; - GLuint reqTexUpload; - GLuint texUpload; - GLuint memTexUpload; -} tfxStats; - - -typedef void (*tfxTriViewClipFunc)( struct vertex_buffer *VB, - GLuint v[], - GLubyte mask ); - -typedef void (*tfxTriClipFunc)( struct vertex_buffer *VB, - GLuint v[], - GLuint mask ); - - -typedef void (*tfxLineClipFunc)( struct vertex_buffer *VB, - GLuint v1, GLuint v2, - GLubyte mask ); - - -extern tfxTriViewClipFunc fxTriViewClipTab[0x8]; -extern tfxTriClipFunc fxTriClipStrideTab[0x8]; -extern tfxLineClipFunc fxLineClipTab[0x8]; - -typedef struct { - /* Alpha test */ - GLboolean alphaTestEnabled; - GrCmpFnc_t alphaTestFunc; - GrAlpha_t alphaTestRefValue; - - /* Blend function */ - GLboolean blendEnabled; - GrAlphaBlendFnc_t blendSrcFuncRGB; - GrAlphaBlendFnc_t blendDstFuncRGB; - GrAlphaBlendFnc_t blendSrcFuncAlpha; - GrAlphaBlendFnc_t blendDstFuncAlpha; -} tfxUnitsState; - - - -/* Flags for render_index. - */ -#define FX_OFFSET 0x1 -#define FX_TWOSIDE 0x2 -#define FX_FRONT_BACK 0x4 -#define FX_FLAT 0x8 -#define FX_ANTIALIAS 0x10 -#define FX_FALLBACK 0x20 - - -/* Flags for fxMesa->new_state - */ -#define FX_NEW_TEXTURING 0x1 -#define FX_NEW_BLEND 0x2 -#define FX_NEW_ALPHA 0x4 -#define FX_NEW_DEPTH 0x8 -#define FX_NEW_FOG 0x10 -#define FX_NEW_SCISSOR 0x20 -#define FX_NEW_COLOR_MASK 0x40 -#define FX_NEW_CULL 0x80 -#define FX_NEW_STENCIL 0x100 - -/* FX struct stored in VB->driver_data. - */ -struct tfxMesaVertexBuffer { - GLvector1ui clipped_elements; - - fxVertex *verts; - fxVertex *last_vert; - void *vert_store; -#if defined(FX_GLIDE3) - GrVertex **triangle_b; /* Triangle buffer */ - GrVertex **strips_b; /* Strips buffer */ -#endif - - GLuint size; -}; - -#define FX_DRIVER_DATA(vb) ((struct tfxMesaVertexBuffer *)((vb)->driver_data)) -#define FX_CONTEXT(ctx) ((fxMesaContext)((ctx)->DriverCtx)) -#define FX_TEXTURE_DATA(t) fxTMGetTexInfo((t)->Current) - -#if defined(XFree86Server) || defined(GLX_DIRECT_RENDERING) -#include "tdfx_init.h" -#else -#define DRI_FX_CONTEXT -#define BEGIN_BOARD_LOCK() -#define END_BOARD_LOCK() -#define BEGIN_CLIP_LOOP() -#define END_CLIP_LOOP() -#endif - - -/* These lookup table are used to extract RGB values in [0,255] from - * 16-bit pixel values. - */ -extern GLubyte FX_PixelToR[0x10000]; -extern GLubyte FX_PixelToG[0x10000]; -extern GLubyte FX_PixelToB[0x10000]; - - -struct tfxMesaContext { - GLcontext *glCtx; /* the core Mesa context */ - GLvisual *glVis; /* describes the color buffer */ - GLframebuffer *glBuffer; /* the ancillary buffers */ - - GLint board; /* the board used for this context */ - GLint width, height; /* size of color buffer */ - - GrBuffer_t currentFB; - - GLboolean bgrOrder; - GLuint depthClear; - GrColor_t color; - GrColor_t clearC; - GrAlpha_t clearA; - GLuint constColor; - GrCullMode_t cullMode; - - tfxUnitsState unitsState; - tfxUnitsState restoreUnitsState; /* saved during multipass */ - - GuTexPalette glbPalette; - - GLuint tmu_source[FX_NUM_TMU]; - GLuint tex_dest[MAX_TEXTURE_UNITS]; - GLuint setupindex; - GLuint partial_setup_index; - GLuint setupdone; - GLuint mergeindex; - GLuint mergeinputs; - GLuint render_index; - GLuint last_tri_caps; - GLuint stw_hint_state; /* for grHints */ - GLuint is_in_hardware; - GLuint new_state; - GLuint using_fast_path, passes, multipass; - - tfxLineClipFunc clip_line; - tfxTriClipFunc clip_tri_stride; - tfxTriViewClipFunc view_clip_tri; - - - /* Texture Memory Manager Data */ - - GLuint texBindNumber; - GLint tmuSrc; - GLuint freeTexMem[FX_NUM_TMU]; - MemRange *tmPool; - MemRange *tmFree[FX_NUM_TMU]; - - GLenum fogTableMode; - GLfloat fogDensity; - GLfloat fogStart, fogEnd; - GrFog_t *fogTable; - GLint textureAlign; - - /* Acc. functions */ - - points_func PointsFunc; - line_func LineFunc; - triangle_func TriangleFunc; - quad_func QuadFunc; - - render_func **RenderVBTables; - - render_func *RenderVBClippedTab; - render_func *RenderVBCulledTab; - render_func *RenderVBRawTab; - - - tfxStats stats; - - void *state; - - /* Options */ - - GLboolean verbose; - GLboolean haveTwoTMUs; /* True if we really have 2 tmu's */ - GLboolean emulateTwoTMUs; /* True if we present 2 tmu's to mesa. */ - GLboolean haveAlphaBuffer; - GLboolean haveHwStencil; - GLboolean haveGlobalPaletteTexture; - GLint swapInterval; - GLint maxPendingSwapBuffers; - - FX_GrContext_t glideContext; - - int x_offset; - int y_offset; - int y_delta; - int screen_width; - int screen_height; - int initDone; - int clipMinX; - int clipMaxX; - int clipMinY; - int clipMaxY; - int needClip; - - DRI_FX_CONTEXT -}; - -typedef void (*tfxSetupFunc)(struct vertex_buffer *, GLuint, GLuint); - -extern GrHwConfiguration glbHWConfig; -extern int glbCurrentBoard; - -extern void fxPrintSetupFlags( const char *msg, GLuint flags ); -extern void fxSetupFXUnits(GLcontext *); -extern void fxSetupDDPointers(GLcontext *); -extern void fxDDSetNearFar(GLcontext *, GLfloat, GLfloat); - -extern void fxDDSetupInit(void); -extern void fxDDCvaInit(void); -extern void fxDDTrifuncInit(void); -extern void fxDDFastPathInit(void); - -extern void fxDDChooseRenderState( GLcontext *ctx ); - -extern void fxRenderClippedLine( struct vertex_buffer *VB, - GLuint v1, GLuint v2 ); - -extern void fxRenderClippedTriangle( struct vertex_buffer *VB, - GLuint n, GLuint vlist[] ); - - -extern tfxSetupFunc fxDDChooseSetupFunction(GLcontext *); - -extern points_func fxDDChoosePointsFunction(GLcontext *); -extern line_func fxDDChooseLineFunction(GLcontext *); -extern triangle_func fxDDChooseTriangleFunction(GLcontext *); -extern quad_func fxDDChooseQuadFunction(GLcontext *); -extern render_func **fxDDChooseRenderVBTables(GLcontext *); - -extern void fxDDRenderInit(GLcontext *); -extern void fxDDClipInit(void); - -extern void fxUpdateDDSpanPointers(GLcontext *); -extern void fxSetupDDSpanPointers(GLcontext *); - -extern void fxPrintTextureData(tfxTexInfo *ti); -extern GLboolean fxDDTexImage2D(GLcontext *ctx, GLenum target, GLint level, - GLenum format, GLenum type, const GLvoid *pixels, - const struct gl_pixelstore_attrib *packing, - struct gl_texture_object *texObj, - struct gl_texture_image *texImage, - GLboolean *retainInternalCopy); -extern GLboolean fxDDTexSubImage2D(GLcontext *ctx, GLenum target, GLint level, - GLint xoffset, GLint yoffset, - GLsizei width, GLsizei height, - GLenum format, GLenum type, const GLvoid *pixels, - const struct gl_pixelstore_attrib *packing, - struct gl_texture_object *texObj, - struct gl_texture_image *texImage); -extern GLvoid *fxDDGetTexImage(GLcontext *ctx, GLenum target, GLint level, - const struct gl_texture_object *texObj, - GLenum *formatOut, GLenum *typeOut, - GLboolean *freeImageOut ); -extern void fxDDTexEnv(GLcontext *, GLenum, GLenum, const GLfloat *); -extern void fxDDTexParam(GLcontext *, GLenum, struct gl_texture_object *, - GLenum, const GLfloat *); -extern void fxDDTexBind(GLcontext *, GLenum, struct gl_texture_object *); -extern void fxDDTexDel(GLcontext *, struct gl_texture_object *); -extern void fxDDTexPalette(GLcontext *, struct gl_texture_object *); -extern void fxDDTexUseGlbPalette(GLcontext *, GLboolean); - -extern void fxDDEnable(GLcontext *, GLenum, GLboolean); -extern void fxDDAlphaFunc(GLcontext *, GLenum, GLclampf); -extern void fxDDBlendFunc(GLcontext *, GLenum, GLenum); - -extern void fxDDRegisterVB( struct vertex_buffer *VB ); -extern void fxDDUnregisterVB( struct vertex_buffer *VB ); -extern void fxDDResizeVB( struct vertex_buffer *VB, GLuint size ); - -extern void fxDDCheckMergeAndRender( GLcontext *ctx, - struct gl_pipeline_stage *d ); - -extern void fxDDMergeAndRender( struct vertex_buffer *VB ); - -extern void fxDDCheckPartialRasterSetup( GLcontext *ctx, - struct gl_pipeline_stage *d ); - -extern void fxDDPartialRasterSetup( struct vertex_buffer *VB ); - -extern void fxDDDoRasterSetup( struct vertex_buffer *VB ); - -extern GLuint fxDDRegisterPipelineStages( struct gl_pipeline_stage *out, - const struct gl_pipeline_stage *in, - GLuint nr ); - -extern GLboolean fxDDBuildPrecalcPipeline( GLcontext *ctx ); - -extern void fxDDOptimizePrecalcPipeline( GLcontext *ctx, - struct gl_pipeline *pipe ); - -extern void fxDDRenderElementsDirect( struct vertex_buffer *VB ); -extern void fxDDRenderVBIndirectDirect( struct vertex_buffer *VB ); - -extern void fxDDInitExtensions( GLcontext *ctx ); - -#define fxTMGetTexInfo(o) ((tfxTexInfo*)((o)->DriverData)) -extern void fxTMInit(fxMesaContext ctx); -extern void fxTMClose(fxMesaContext ctx); -extern void fxTMRestoreTextures_NoLock(fxMesaContext ctx); -extern void fxTMMoveInTM(fxMesaContext, struct gl_texture_object *, GLint); -extern void fxTMMoveOutTM(fxMesaContext, struct gl_texture_object *); -#define fxTMMoveOutTM_NoLock fxTMMoveOutTM -extern void fxTMFreeTexture(fxMesaContext, struct gl_texture_object *); -extern void fxTMReloadMipMapLevel(fxMesaContext, struct gl_texture_object *, GLint); -extern void fxTMReloadSubMipMapLevel(fxMesaContext, struct gl_texture_object *, - GLint, GLint, GLint); - -extern void fxTexGetFormat(GLenum, GrTextureFormat_t *, GLint *); -extern int fxTexGetInfo(int, int, GrLOD_t *, GrAspectRatio_t *, - float *, float *, int *, int *, int *, int *); - -extern void fxDDScissor( GLcontext *ctx, - GLint x, GLint y, GLsizei w, GLsizei h ); -extern void fxDDFogfv( GLcontext *ctx, GLenum pname, const GLfloat *params ); -extern GLboolean fxDDColorMask(GLcontext *ctx, - GLboolean r, GLboolean g, - GLboolean b, GLboolean a ); - -extern void fxDDWriteDepthSpan(GLcontext *ctx, GLuint n, GLint x, GLint y, - const GLdepth depth[], const GLubyte mask[]); - -extern void fxDDReadDepthSpan(GLcontext *ctx, GLuint n, GLint x, GLint y, - GLdepth depth[]); - -extern void fxDDWriteDepthPixels(GLcontext *ctx, GLuint n, - const GLint x[], const GLint y[], - const GLdepth depth[], const GLubyte mask[]); - -extern void fxDDReadDepthPixels(GLcontext *ctx, GLuint n, - const GLint x[], const GLint y[], - GLdepth depth[]); - -extern void fxDDFastPath( struct vertex_buffer *VB ); - -extern void fxDDShadeModel(GLcontext *ctx, GLenum mode); - -extern void fxDDCullFace(GLcontext *ctx, GLenum mode); -extern void fxDDFrontFace(GLcontext *ctx, GLenum mode); - -extern void fxPrintRenderState( const char *msg, GLuint state ); -extern void fxPrintHintState( const char *msg, GLuint state ); - -extern void fxDDDoRenderVB( struct vertex_buffer *VB ); - -extern int fxDDInitFxMesaContext( fxMesaContext fxMesa ); - - -extern void fxSetScissorValues(GLcontext *ctx); -extern void fxTMMoveInTM_NoLock(fxMesaContext fxMesa, - struct gl_texture_object *tObj, - GLint where); -extern void fxInitPixelTables(fxMesaContext fxMesa, GLboolean bgrOrder); - -#endif Index: xc/extras/Mesa/src/FX/fxfastpath.c diff -u xc/extras/Mesa/src/FX/fxfastpath.c:1.2 xc/extras/Mesa/src/FX/fxfastpath.c:removed --- xc/extras/Mesa/src/FX/fxfastpath.c:1.2 Tue Feb 15 02:13:06 2000 +++ xc/extras/Mesa/src/FX/fxfastpath.c Mon Dec 18 14:21:52 2000 @@ -1,425 +0,0 @@ -/* -*- mode: C; tab-width:8; c-basic-offset:2 -*- */ - -/* - * Mesa 3-D graphics library - * Version: 3.3 - * - * Copyright (C) 1999-2000 Brian Paul All Rights Reserved. - * - * 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 - * BRIAN PAUL 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. - * - * - * Original Mesa / 3Dfx device driver (C) 1999 David Bucciarelli, by the - * terms stated above. - * - * Thank you for your contribution, David! - * - * Please make note of the above copyright/license statement. If you - * contributed code or bug fixes to this code under the previous (GNU - * Library) license and object to the new license, your code will be - * removed at your request. Please see the Mesa docs/COPYRIGHT file - * for more information. - * - * Additional Mesa/3Dfx driver developers: - * Daryll Strauss - * Keith Whitwell - * - * See fxapi.h for more revision/author details. - */ - - -#ifdef HAVE_CONFIG_H -#include "conf.h" -#endif - - -#if defined(FX) - -#include "types.h" -#include "cva.h" -#include "mmath.h" -#include "fxdrv.h" -#include "vertices.h" -#include "X86/common_x86asm.h" - - -#if 0 && defined(__i386__) -#define NEGATIVE(f) ((*(int *)&f) < 0) -#define DIFFERENT_SIGNS(a,b) (((*(int *)&a)^(*(int *)&b)) < 0) -#else -#define NEGATIVE(f) (f < 0) -#define DIFFERENT_SIGNS(a,b) ((a*b) < 0) -#endif - -#define LINTERP( T, A, B ) ( (A) + (T) * ( (B) - (A) ) ) - - -#define CLIP(sgn,v,PLANE) \ -if (mask & PLANE) { \ - GLuint *indata = inlist[in]; \ - GLuint *outdata = inlist[in ^= 1]; \ - GLuint nr = n; \ - GLfloat *J = verts[indata[nr-1]].f; \ - GLfloat dpJ = (sgn J[v]) + J[CLIP_WCOORD]; \ - \ - inlist[0] = vlist1; \ - for (i = n = 0 ; i < nr ; i++) { \ - GLuint elt_i = indata[i]; \ - GLfloat *I = verts[elt_i].f; \ - GLfloat dpI = (sgn I[v]) + I[CLIP_WCOORD]; \ - \ - if (DIFFERENT_SIGNS(dpI, dpJ)) { \ - GLfloat *O = verts[next_vert].f; \ - GLfloat t = dpI / (dpI - dpJ); \ - GLuint j; \ - \ - clipmask[next_vert] = 0; \ - outdata[n++] = next_vert++; \ - \ - for (j = 0 ; j < SIZE ; j += 2) { \ - O[j] = LINTERP(t, I[j], J[j]); \ - O[j+1] = LINTERP(t, I[j+1], J[j+1]); \ - } \ - } \ - \ - clipmask[elt_i] |= PLANE; /* don't set up */ \ - \ - if (!NEGATIVE(dpI)) { \ - outdata[n++] = elt_i; \ - clipmask[elt_i] &= ~PLANE; /* set up after all */ \ - } \ - \ - J = I; \ - dpJ = dpI; \ - } \ - \ - if (n < 3) return; \ -} - -#define LINE_CLIP(x,y,z,w,PLANE) \ -if (mask & PLANE) { \ - GLfloat dpI = DOT4V(I,x,y,z,w); \ - GLfloat dpJ = DOT4V(J,x,y,z,w); \ - \ - if (DIFFERENT_SIGNS(dpI, dpJ)) { \ - GLfloat *O = verts[next_vert].f; \ - GLfloat t = dpI / (dpI - dpJ); \ - GLuint j; \ - \ - for (j = 0 ; j < SIZE ; j += 2) { \ - O[j] = LINTERP(t, I[j], J[j]); \ - O[j+1] = LINTERP(t, I[j+1], J[j+1]); \ - } \ - \ - clipmask[next_vert] = 0; \ - \ - if (NEGATIVE(dpI)) { \ - clipmask[elts[0]] |= PLANE; \ - I = O; elts[0] = next_vert++; \ - } else { \ - clipmask[elts[1]] |= PLANE; \ - J = O; elts[1] = next_vert++; \ - } \ - } \ - else if (NEGATIVE(dpI)) \ - return; \ -} - - -#define CLIP_POINT( e ) \ - if (mask[e]) \ - *out++ = e - -#define CLIP_LINE( e1, e0 ) \ -do { \ - GLubyte ormask = mask[e0] | mask[e1]; \ - out[0] = e1; \ - out[1] = e0; \ - out+=2; \ - if (ormask) { \ - out-=2; \ - if (!(mask[e0] & mask[e1])) { \ - TAG(fx_line_clip)( &out, verts, mask, &next_vert, ormask); \ - } \ - } \ -} while (0) - -#define CLIP_TRIANGLE( e2, e1, e0 ) \ -do { \ - GLubyte ormask; \ - out[0] = e2; \ - out[1] = e1; \ - out[2] = e0; \ - out += 3; \ - ormask = mask[e2] | mask[e1] | mask[e0]; \ - if (ormask) { \ - out -= 3; \ - if ( !(mask[e2] & mask[e1] & mask[e0])) { \ - TAG(fx_tri_clip)( &out, verts, mask, &next_vert, ormask ); \ - } \ - } \ -} while (0) - -#if defined(FX_V2) || defined(DRIVERTS) - -#define VARS_XYZ \ - GLfloat vsx = mat[MAT_SX]; \ - GLfloat vsy = mat[MAT_SY]; \ - GLfloat vsz = mat[MAT_SZ]; \ - GLfloat vtx = mat[MAT_TX]; \ - GLfloat vty = mat[MAT_TY]; \ - GLfloat vtz = mat[MAT_TZ]; - -#define DO_SETUP_XYZ \ - f[XCOORD] = f[0] * oow * vsx + vtx; \ - f[YCOORD] = f[1] * oow * vsy + vty; \ - f[ZCOORD] = f[2] * oow * vsz + vtz; - -#else -#if defined(HAVE_FAST_MATH) - -#define VARS_XYZ \ - GLfloat vsx = mat[MAT_SX]; \ - GLfloat vsy = mat[MAT_SY]; \ - GLfloat vsz = mat[MAT_SZ]; \ - const GLfloat snapper = (3L << 18); \ - GLfloat vtx = mat[MAT_TX] + snapper; \ - GLfloat vty = mat[MAT_TY] + snapper; \ - GLfloat vtz = mat[MAT_TZ]; - -#define DO_SETUP_XYZ \ - f[XCOORD] = f[0] * oow * vsx + vtx; \ - f[XCOORD] -= snapper; \ - f[YCOORD] = f[1] * oow * vsy + vty; \ - f[YCOORD] -= snapper; \ - f[ZCOORD] = f[2] * oow * vsz + vtz; - -#else - -#define VARS_XYZ \ - GLfloat vsx = mat[MAT_SX] * 16.0f; \ - GLfloat vsy = mat[MAT_SY] * 16.0f; \ - GLfloat vsz = mat[MAT_SZ]; \ - GLfloat vtx = mat[MAT_TX] * 16.0f; \ - GLfloat vty = mat[MAT_TY] * 16.0f; \ - GLfloat vtz = mat[MAT_TZ]; - -#define DO_SETUP_XYZ \ - f[XCOORD] = ((int)(f[0]*oow*vsx+vtx)) * (1.0f/16.0f); \ - f[YCOORD] = ((int)(f[1]*oow*vsy+vty)) * (1.0f/16.0f); \ - f[ZCOORD] = f[2]*oow*vsz + vtz; - - -#endif -#endif - - - -struct fx_fast_tab -{ - void (*build_vertices)( struct vertex_buffer *VB, GLuint do_clip ); - - void (*clip[GL_POLYGON+1])( struct vertex_buffer *VB, - GLuint start, - GLuint count, - GLuint parity ); - - void (*project_clipped_vertices)( GLfloat *first, - GLfloat *last, - const GLfloat *mat, - GLuint stride, - const GLubyte *mask ); - - void (*project_vertices)( GLfloat *first, - GLfloat *last, - const GLfloat *mat, - GLuint stride ); -}; - -/* Pack either rgba or texture into the remaining half of a 32 byte vertex. - */ -#define CLIP_R CLIP_RCOORD -#define CLIP_G CLIP_GCOORD -#define CLIP_B CLIP_BCOORD -#define CLIP_A CLIP_ACOORD -#define CLIP_S0 4 -#define CLIP_T0 5 -#define CLIP_S1 6 -#define CLIP_T1 7 - -#define SIZE 4 -#define TYPE (0) -#define TAG(x) x -#include "fxfasttmp.h" - -#define SIZE 8 -#define TYPE (SETUP_RGBA) -#define TAG(x) x##_RGBA -#include "fxfasttmp.h" - -#define SIZE 6 -#define TYPE (SETUP_TMU0) -#define TAG(x) x##_TMU0 -#include "fxfasttmp.h" - -#define SIZE 8 -#define TYPE (SETUP_TMU0|SETUP_TMU1) -#define TAG(x) x##_TMU0_TMU1 -#include "fxfasttmp.h" - -#undef CLIP_S1 -#undef CLIP_T1 -#define CLIP_S1 4 -#define CLIP_T1 5 - -#define SIZE 6 -#define TYPE (SETUP_TMU1) -#define TAG(x) x##_TMU1 -#include "fxfasttmp.h" - -/* These three need to use a full 64 byte clip-space vertex. - */ -#undef CLIP_S0 -#undef CLIP_T0 -#undef CLIP_S1 -#undef CLIP_T1 - -#define CLIP_S0 8 -#define CLIP_T0 9 -#define CLIP_S1 10 -#define CLIP_T1 11 - -#define SIZE 10 -#define TYPE (SETUP_RGBA|SETUP_TMU0) -#define TAG(x) x##_RGBA_TMU0 -#include "fxfasttmp.h" - -#define SIZE 12 -#define TYPE (SETUP_RGBA|SETUP_TMU0|SETUP_TMU1) -#define TAG(x) x##_RGBA_TMU0_TMU1 -#include "fxfasttmp.h" - -#undef CLIP_S1 -#undef CLIP_T1 -#define CLIP_S1 8 -#define CLIP_T1 9 - -#define SIZE 10 -#define TYPE (SETUP_RGBA|SETUP_TMU1) -#define TAG(x) x##_RGBA_TMU1 -#include "fxfasttmp.h" - -static struct fx_fast_tab fxFastTab[0x8]; - -void fxDDFastPathInit() -{ - fx_init_fastpath( &fxFastTab[0] ); - fx_init_fastpath_RGBA( &fxFastTab[SETUP_RGBA] ); - fx_init_fastpath_TMU0( &fxFastTab[SETUP_TMU0] ); - fx_init_fastpath_TMU1( &fxFastTab[SETUP_TMU1] ); - fx_init_fastpath_RGBA_TMU0( &fxFastTab[SETUP_RGBA|SETUP_TMU0] ); - fx_init_fastpath_RGBA_TMU1( &fxFastTab[SETUP_RGBA|SETUP_TMU1] ); - fx_init_fastpath_TMU0_TMU1( &fxFastTab[SETUP_TMU0|SETUP_TMU1] ); - fx_init_fastpath_RGBA_TMU0_TMU1( &fxFastTab[SETUP_RGBA|SETUP_TMU0| - SETUP_TMU1] ); -} - - - -void fxDDFastPath( struct vertex_buffer *VB ) -{ - GLcontext *ctx = VB->ctx; - GLenum prim = ctx->CVA.elt_mode; - struct tfxMesaContext *fxMesa = FX_CONTEXT(ctx); - struct fx_fast_tab *tab = &fxFastTab[fxMesa->setupindex & 0x7]; - GLuint do_clip = 1; - struct tfxMesaVertexBuffer *fxVB = FX_DRIVER_DATA(VB); -#ifdef DRIVERTS - GLfloat tx, ty; -#endif - - fxVertex *first; - GLfloat *mat = ctx->Viewport.WindowMap.m; - - gl_prepare_arrays_cva( VB ); /* still need this */ - - if (VB->EltPtr->count * 12 > fxVB->size) { - fxDDResizeVB( VB, VB->EltPtr->count * 12 ); - do_clip = 1; - } - - tab->build_vertices( VB, do_clip ); /* object->clip space */ - - first = FX_DRIVER_DATA(VB)->verts; - -#ifdef DRIVERTS - tx=mat[MAT_TX]; - ty=mat[MAT_TY]; - mat[MAT_TX]=tx+fxMesa->x_offset; - mat[MAT_TY]=ty+fxMesa->y_delta; -#endif - - if (VB->ClipOrMask) { - if (!VB->ClipAndMask) { - GLubyte tmp = VB->ClipOrMask; - - tab->clip[prim]( VB, 0, VB->EltPtr->count, 0 ); /* clip */ - - tab->project_clipped_vertices( fxVB->verts->f, - fxVB->last_vert->f, - mat, 16 * 4, - VB->ClipMask ); - - ctx->CVA.elt_mode = gl_reduce_prim[prim]; - VB->EltPtr = &(FX_DRIVER_DATA(VB)->clipped_elements); - - VB->ClipOrMask = 0; - fxDDRenderElementsDirect( VB ); /* render using new list */ - VB->ClipOrMask = tmp; - } - } else { - tab->project_vertices( fxVB->verts->f, - fxVB->last_vert->f, - mat, 16 * 4 ); - - fxDDRenderElementsDirect( VB ); /* render using orig list */ - } - -#ifdef DRIVERTS - mat[MAT_TX]=tx; - mat[MAT_TY]=ty; -#endif - - /* This indicates that there is no cached data to reuse. - */ - VB->pipeline->data_valid = 0; - VB->pipeline->pipeline_valid = 0; -} - - -#else - -/* - * Need this to provide at least one external definition. - */ -int gl_fxfastpath_dummy(void) -{ - return 0; -} - -#endif Index: xc/extras/Mesa/src/FX/fxfasttmp.h diff -u xc/extras/Mesa/src/FX/fxfasttmp.h:1.3 xc/extras/Mesa/src/FX/fxfasttmp.h:removed --- xc/extras/Mesa/src/FX/fxfasttmp.h:1.3 Thu Mar 2 11:07:21 2000 +++ xc/extras/Mesa/src/FX/fxfasttmp.h Mon Dec 18 14:21:52 2000 @@ -1,367 +0,0 @@ -/* -*- mode: C; tab-width:8; c-basic-offset:2 -*- */ - -/* - * Mesa 3-D graphics library - * Version: 3.3 - * - * Copyright (C) 1999-2000 Brian Paul All Rights Reserved. - * - * 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 - * BRIAN PAUL 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. - * - * - * Original Mesa / 3Dfx device driver (C) 1999 David Bucciarelli, by the - * terms stated above. - * - * Thank you for your contribution, David! - * - * Please make note of the above copyright/license statement. If you - * contributed code or bug fixes to this code under the previous (GNU - * Library) license and object to the new license, your code will be - * removed at your request. Please see the Mesa docs/COPYRIGHT file - * for more information. - * - * Additional Mesa/3Dfx driver developers: - * Daryll Strauss - * Keith Whitwell - * - * See fxapi.h for more revision/author details. - */ - - -/* Build clip space vertices from object space data. - */ -static void TAG(fx_setup_full)( struct vertex_buffer *VB, GLuint do_clip ) -{ - GLcontext *ctx = VB->ctx; - GLfloat *f = (GLfloat *) FX_DRIVER_DATA(VB)->verts; - fxMesaContext fxMesa = FX_CONTEXT(VB->ctx); - GLuint count = VB->Count; - GLuint i; - - const GLfloat * const m = ctx->ModelProjectMatrix.m; - -#if (TYPE & SETUP_RGBA) - GLubyte *color = (GLubyte *)VB->ColorPtr->data; - GLuint color_stride = VB->ColorPtr->stride; -#endif - -#if (TYPE & SETUP_TMU0) - GLuint tmu0_source = fxMesa->tmu_source[0]; - struct gl_texture_unit *t0 = &ctx->Texture.Unit[tmu0_source]; - GLint s0scale = FX_TEXTURE_DATA(t0)->int_sScale; - GLint t0scale = FX_TEXTURE_DATA(t0)->int_tScale; - GLint *tmu0_int_data = (GLint *)VB->TexCoordPtr[tmu0_source]->data; - GLuint tmu0_stride = VB->TexCoordPtr[tmu0_source]->stride; -#endif - -#if (TYPE & SETUP_TMU1) - GLuint tmu1_source = fxMesa->tmu_source[1]; - struct gl_texture_unit *t1 = &ctx->Texture.Unit[tmu1_source]; - GLint s1scale = FX_TEXTURE_DATA(t1)->int_sScale; - GLint t1scale = FX_TEXTURE_DATA(t1)->int_tScale; - GLint *tmu1_int_data = (GLint *)VB->TexCoordPtr[tmu1_source]->data; - GLuint tmu1_stride = VB->TexCoordPtr[tmu1_source]->stride; -#endif - - (void) fxMesa; - (void) ctx; - (void) i; - (void) f; - - /* Use 3 seperate loops because it's easier for assembly. A - * best-case solution might be to do all three in a single assembly - * loop. - */ - gl_xform_points3_v16_general(FX_DRIVER_DATA(VB)->verts[0].f, - m, - VB->ObjPtr->start, - VB->ObjPtr->stride, - count); - - if (do_clip) - { - VB->ClipAndMask = ~0; - VB->ClipOrMask = 0; - gl_cliptest_points4_v16(FX_DRIVER_DATA(VB)->verts[0].f, - FX_DRIVER_DATA(VB)->verts[count].f, - &(VB->ClipOrMask), - &(VB->ClipAndMask), - VB->ClipMask); - } - - -#if (TYPE) - for (i = 0 ; i < count ; i++, f += 16) { -#if (TYPE & SETUP_RGBA) - GLubyte *col = color; color += color_stride; - UBYTE_COLOR_TO_FLOAT_255_COLOR2( f[CLIP_R], col[0] ); - UBYTE_COLOR_TO_FLOAT_255_COLOR2( f[CLIP_G], col[1] ); - UBYTE_COLOR_TO_FLOAT_255_COLOR2( f[CLIP_B], col[2] ); - UBYTE_COLOR_TO_FLOAT_255_COLOR2( f[CLIP_A], col[3] ); -#endif -#if (TYPE & SETUP_TMU0) - * (int *) &f[CLIP_S0] = s0scale + tmu0_int_data[0]; - * (int *) &f[CLIP_T0] = t0scale + tmu0_int_data[1]; - STRIDE_T(tmu0_int_data, GLint, tmu0_stride); -#endif -#if (TYPE & SETUP_TMU1) - * (int *) &f[CLIP_S1] = s1scale + tmu1_int_data[0]; - * (int *) &f[CLIP_T1] = t1scale + tmu1_int_data[1]; - STRIDE_T(tmu1_int_data, GLint, tmu1_stride); -#endif - } -#endif - - FX_DRIVER_DATA(VB)->last_vert = &(FX_DRIVER_DATA(VB)->verts[count]); -} - - -/* Do viewport map, device scale and perspective projection. - * - * Rearrange fxVertices to look like grVertices. - */ -static void TAG(fx_project_vertices)( GLfloat *first, - GLfloat *last, - const GLfloat *mat, - GLuint stride ) -{ - GLfloat *f; - VARS_XYZ; - - for ( f = first ; f != last ; STRIDE_F(f, stride)) - { - GLfloat oow = 1.0f/f[CLIP_WCOORD]; /* urp! */ - -#if FX_USE_PARGB - if (TYPE & SETUP_RGBA) { - PACK_4F_ARGB(GET_PARGB(f),f[CLIP_A],f[CLIP_R],f[CLIP_G],f[CLIP_B]); - } -#else - if (TYPE & SETUP_RGBA) { - f[RCOORD]=f[CLIP_R]; - } -#endif - if (TYPE & SETUP_TMU1) { - f[S1COORD] = f[CLIP_S1] * oow; - f[T1COORD] = f[CLIP_T1] * oow; - } - - if (TYPE & SETUP_TMU0) { - f[T0COORD] = f[CLIP_T0] * oow; - f[S0COORD] = f[CLIP_S0] * oow; - } - - DO_SETUP_XYZ; - - f[OOWCOORD] = oow; - } -} - -static void TAG(fx_project_clipped_vertices)( GLfloat *first, - GLfloat *last, - const GLfloat *mat, - GLuint stride, - const GLubyte *mask ) -{ - GLfloat *f; - VARS_XYZ; - - for ( f = first ; f != last ; STRIDE_F(f, stride), mask++) { - if (!*mask) { - - GLfloat oow = 1.0f / f[CLIP_WCOORD]; -#if FX_USE_PARGB - if (TYPE & SETUP_RGBA) { - const GLuint r = f[CLIP_R]; - const GLuint g = f[CLIP_G]; - const GLuint b = f[CLIP_B]; - const GLuint a = f[CLIP_A]; - /* ToDo Optimize */ - GET_PARGB(f) = a << 24 | r << 16 | g << 8 | b; - } -#else - if (TYPE & SETUP_RGBA) { - f[RCOORD]=f[CLIP_R]; - } -#endif - - if (TYPE & SETUP_TMU1) { - f[S1COORD] = f[CLIP_S1] * oow; - f[T1COORD] = f[CLIP_T1] * oow; - } - - if (TYPE & SETUP_TMU0) { - f[T0COORD] = f[CLIP_T0] * oow; - f[S0COORD] = f[CLIP_S0] * oow; - } - - DO_SETUP_XYZ; - - f[OOWCOORD] = oow; - } - } -} - - -static -#if (SIZE <= 8) -INLINE -#endif -void TAG(fx_tri_clip)( GLuint **p_elts, - fxVertex *verts, - GLubyte *clipmask, - GLuint *p_next_vert, - GLubyte mask ) -{ - GLuint *elts = *p_elts; - GLuint next_vert = *p_next_vert; - GLuint vlist1[VB_MAX_CLIPPED_VERTS]; - GLuint vlist2[VB_MAX_CLIPPED_VERTS]; - GLuint *inlist[2]; - GLuint *out; - GLuint in = 0; - GLuint n = 3; - GLuint i; - - inlist[0] = elts; - inlist[1] = vlist2; - - CLIP(-,0,CLIP_RIGHT_BIT); - CLIP(+,0,CLIP_LEFT_BIT); - CLIP(-,1,CLIP_TOP_BIT); - CLIP(+,1,CLIP_BOTTOM_BIT); - CLIP(-,2,CLIP_FAR_BIT); - CLIP(+,2,CLIP_NEAR_BIT); - - /* Convert the planar polygon to a list of triangles. - */ - out = inlist[in]; - - for (i = 2 ; i < n ; i++) { - elts[0] = out[0]; - elts[1] = out[i-1]; - elts[2] = out[i]; - elts += 3; - } - - *p_next_vert = next_vert; - *p_elts = elts; -} - - -static INLINE void TAG(fx_line_clip)( GLuint **p_elts, - fxVertex *verts, - GLubyte *clipmask, - GLuint *p_next_vert, - GLubyte mask ) -{ - GLuint *elts = *p_elts; - GLfloat *I = verts[elts[0]].f; - GLfloat *J = verts[elts[1]].f; - GLuint next_vert = *p_next_vert; - - LINE_CLIP(1,0,0,-1,CLIP_LEFT_BIT); - LINE_CLIP(-1,0,0,1,CLIP_RIGHT_BIT); - LINE_CLIP(0,1,0,-1,CLIP_TOP_BIT); - LINE_CLIP(0,-1,0,1,CLIP_BOTTOM_BIT); - LINE_CLIP(0,0,1,-1,CLIP_FAR_BIT); - LINE_CLIP(0,0,-1,1,CLIP_NEAR_BIT); - - *p_next_vert = next_vert; - *p_elts += 2; -} - - -/* Build a table of functions to clip each primitive type. - */ -#define LOCAL_VARS \ - GLuint *elt = VB->EltPtr->data; \ - fxVertex *verts = FX_DRIVER_DATA(VB)->verts; \ - GLuint next_vert = VB->Count; \ - GLuint *out = FX_DRIVER_DATA(VB)->clipped_elements.data; \ - GLubyte *mask = VB->ClipMask; \ - - -#define POSTFIX \ - FX_DRIVER_DATA(VB)->clipped_elements.count = \ - out - FX_DRIVER_DATA(VB)->clipped_elements.data; \ - FX_DRIVER_DATA(VB)->last_vert = &verts[next_vert]; - -#define INIT(x) - -#define RENDER_POINTS(start, count) \ -do { \ - GLuint i; \ - for (i = start ; i < count ; i++ ) \ - CLIP_POINT( elt[i] ); \ -} while (0) - -#define RENDER_LINE(i1, i0) \ - CLIP_LINE(elt[i1], elt[i0]) - -#define RENDER_TRI(i2, i1, i0, pv, parroty) \ -do { \ - GLuint e2 = elt[i2], e1 = elt[i1], e0 = elt[i0]; \ - if (parroty) e2 = elt[i1], e1 = elt[i2]; \ - CLIP_TRIANGLE( e2, e1, e0 ); \ -} while (0) - -#define RENDER_QUAD(i3, i2, i1, i0, pv) \ - CLIP_TRIANGLE(elt[i3], elt[i2], elt[i0]); \ - CLIP_TRIANGLE(elt[i2], elt[i1], elt[i0]) - -#define PRESERVE_TAG -#include "render_tmp.h" - - -static void TAG(fx_init_fastpath)( struct fx_fast_tab *tab ) -{ - GLuint i; - - /* Use the render templates to do clipping. - */ - TAG(render_init)(); - for (i = 0 ; i < GL_POLYGON+2 ; i++) - tab->clip[i] = TAG(render_tab)[i]; - - tab->build_vertices = TAG(fx_setup_full); - tab->project_vertices = TAG(fx_project_vertices); - tab->project_clipped_vertices = TAG(fx_project_clipped_vertices); - -#if defined(USE_3DNOW_ASM) - if (gl_x86_cpu_features & GL_CPU_3Dnow) { - extern void TAG(fx_3dnow_project_vertices)( GLfloat *first, - GLfloat *last, - const GLfloat *mat, - GLuint stride ); - - extern void TAG(fx_3dnow_project_clipped_vertices)( GLfloat *first, - GLfloat *last, - const GLfloat *mat, - GLuint stride, - const GLubyte *mask ); - - tab->project_vertices = TAG(fx_3dnow_project_vertices); - tab->project_clipped_vertices = TAG(fx_3dnow_project_clipped_vertices); - } -#endif -} - -#undef TYPE -#undef TAG -#undef SIZE Index: xc/extras/Mesa/src/FX/fxglidew.c diff -u xc/extras/Mesa/src/FX/fxglidew.c:1.4 xc/extras/Mesa/src/FX/fxglidew.c:removed --- xc/extras/Mesa/src/FX/fxglidew.c:1.4 Fri Jun 16 20:02:34 2000 +++ xc/extras/Mesa/src/FX/fxglidew.c Mon Dec 18 14:21:52 2000 @@ -1,466 +0,0 @@ -/* -*- mode: C; tab-width:8; c-basic-offset:2 -*- */ - -/* - * Mesa 3-D graphics library - * Version: 3.3 - * - * Copyright (C) 1999-2000 Brian Paul All Rights Reserved. - * - * 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 - * BRIAN PAUL 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. - * - * - * Original Mesa / 3Dfx device driver (C) 1999 David Bucciarelli, by the - * terms stated above. - * - * Thank you for your contribution, David! - * - * Please make note of the above copyright/license statement. If you - * contributed code or bug fixes to this code under the previous (GNU - * Library) license and object to the new license, your code will be - * removed at your request. Please see the Mesa docs/COPYRIGHT file - * for more information. - * - * Additional Mesa/3Dfx driver developers: - * Daryll Strauss - * Keith Whitwell - * - * See fxapi.h for more revision/author details. - */ - - -#ifdef HAVE_CONFIG_H -#include "conf.h" -#endif - -#if defined(FX) -#include "glide.h" -#include "fxglidew.h" -#include "fxdrv.h" - -#include -#include - - -grStencilFunc_t grStencilFuncPtr = NULL; -grStencilMask_t grStencilMaskPtr = NULL; -grStencilOp_t grStencilOpPtr = NULL; -grBufferClearExt_t grBufferClearExtPtr = NULL; - - -FxI32 FX_grGetInteger_NoLock(FxU32 pname) -{ -#if !defined(FX_GLIDE3) - switch (pname) - { - case FX_FOG_TABLE_ENTRIES: - return GR_FOG_TABLE_SIZE; - case FX_GLIDE_STATE_SIZE: - return sizeof(GrState); - case FX_LFB_PIXEL_PIPE: - return FXFALSE; - case FX_PENDING_BUFFERSWAPS: - return grBufferNumPending(); - case FX_TEXTURE_ALIGN: - /* This is a guess from reading the glide3 docs */ - return 8; - case FX_ZDEPTH_MAX: - return 0xFFFF; - default: - if (MESA_VERBOSE&VERBOSE_DRIVER) { - fprintf(stderr,"Wrong parameter in FX_grGetInteger!\n"); - } - return -1; - } -#else - FxU32 grname; - FxI32 result; - - switch (pname) - { - case FX_FOG_TABLE_ENTRIES: - case FX_GLIDE_STATE_SIZE: - case FX_LFB_PIXEL_PIPE: - case FX_PENDING_BUFFERSWAPS: - case FX_TEXTURE_ALIGN: - grname = pname; - break; - case FX_ZDEPTH_MAX: { - int zvals[2]; - - grGet(GR_ZDEPTH_MIN_MAX, 8, zvals); - return zvals[0]; - } - default: - if (MESA_VERBOSE&VERBOSE_DRIVER) { - fprintf(stderr,"Wrong parameter in FX_grGetInteger!\n"); - } - return -1; - } - - grGet(grname,4,&result); - return result; -#endif -} - -FxI32 FX_grGetInteger(FxU32 pname) -{ - int result; - - BEGIN_BOARD_LOCK(); - result=FX_grGetInteger_NoLock(pname); - END_BOARD_LOCK(); - return result; -} - - -FxBool FX_grLfbLock(GrLock_t type, GrBuffer_t buffer, - GrLfbWriteMode_t writeMode, GrOriginLocation_t origin, - FxBool pixelPipeline, GrLfbInfo_t *info ) { - FxBool result; - - BEGIN_BOARD_LOCK(); - result=grLfbLock(type, buffer, writeMode, origin, pixelPipeline, info); - END_BOARD_LOCK(); - return result; -} - -FxU32 FX_grTexTextureMemRequired(FxU32 evenOdd, GrTexInfo *info) { - FxU32 result; - - BEGIN_BOARD_LOCK(); - result=grTexTextureMemRequired(evenOdd, info); - END_BOARD_LOCK(); - return result; -} - -FxU32 FX_grTexMinAddress(GrChipID_t tmu) { - FxU32 result; - - BEGIN_BOARD_LOCK(); - result=grTexMinAddress(tmu); - END_BOARD_LOCK(); - return result; -} - -extern FxU32 FX_grTexMaxAddress(GrChipID_t tmu) { - FxU32 result; - - BEGIN_BOARD_LOCK(); - result=grTexMaxAddress(tmu); - END_BOARD_LOCK(); - return result; -} - -FxBool FX_grSstControl(FxU32 code) -{ -#if defined(FX_GLIDE3) - /* The glide 3 sources call for grEnable/grDisable to be called in exchange - * for grSstControl. */ - switch(code) { - case GR_CONTROL_ACTIVATE: - grEnable(GR_PASSTHRU); - break; - case GR_CONTROL_DEACTIVATE: - grDisable(GR_PASSTHRU); - break; - } - /* Appearently GR_CONTROL_RESIZE can be ignored. */ - return 1; /* OK? */ -#else - FxU32 result; - BEGIN_BOARD_LOCK(); - result = grSstControl(code); - END_BOARD_LOCK(); - return result; -#endif -} - - -#if defined(FX_GLIDE3) - -void FX_grGammaCorrectionValue(float val) -{ - (void)val; -/* ToDo */ -} - -int FX_getFogTableSize(void) -{ - int result; - BEGIN_BOARD_LOCK(); - grGet(GR_FOG_TABLE_ENTRIES,sizeof(int),(void*)&result); - END_BOARD_LOCK(); - return result; -} - -int FX_getGrStateSize(void) -{ - int result; - BEGIN_BOARD_LOCK(); - grGet(GR_GLIDE_STATE_SIZE,sizeof(int),(void*)&result); - END_BOARD_LOCK(); - - return result; - -} - -int FX_grSstScreenWidth() -{ - FxI32 result[4]; - - BEGIN_BOARD_LOCK(); - grGet(GR_VIEWPORT,sizeof(FxI32)*4,result); - END_BOARD_LOCK(); - - return result[2]; -} - -int FX_grSstScreenHeight() -{ - FxI32 result[4]; - - BEGIN_BOARD_LOCK(); - grGet(GR_VIEWPORT,sizeof(FxI32)*4,result); - END_BOARD_LOCK(); - - return result[3]; -} - -void FX_grGlideGetVersion(char *buf) -{ - BEGIN_BOARD_LOCK(); - strcpy(buf,grGetString(GR_VERSION)); - END_BOARD_LOCK(); -} - -void FX_grSstPerfStats(GrSstPerfStats_t *st) -{ - FxI32 n; - grGet(GR_STATS_PIXELS_IN, 4, &n); st->pixelsIn = n; - grGet(GR_STATS_PIXELS_CHROMA_FAIL, 4, &n); st->chromaFail = n; - grGet(GR_STATS_PIXELS_DEPTHFUNC_FAIL, 4, &n); st->zFuncFail = n; - grGet(GR_STATS_PIXELS_AFUNC_FAIL, 4, &n); st->aFuncFail = n; - grGet(GR_STATS_PIXELS_OUT, 4, &n); st->pixelsOut = n; -} - -void FX_grAADrawLine(GrVertex *a,GrVertex *b) -{ - /* ToDo */ - BEGIN_CLIP_LOOP(); - grDrawLine(a,b); - END_CLIP_LOOP(); -} - -void FX_grAADrawPoint(GrVertex *a) -{ - BEGIN_CLIP_LOOP(); - grDrawPoint(a); - END_CLIP_LOOP(); -} - -void FX_grDrawPolygonVertexList(int n, GrVertex *verts) -{ - BEGIN_CLIP_LOOP(); - grDrawVertexArrayContiguous(GR_POLYGON, n, verts, sizeof(GrVertex)); - END_CLIP_LOOP(); -} - -#if FX_USE_PARGB -void FX_setupGrVertexLayout(void) -{ - BEGIN_BOARD_LOCK(); - grReset(GR_VERTEX_PARAMETER); - - grCoordinateSpace(GR_WINDOW_COORDS); - grVertexLayout(GR_PARAM_XY, GR_VERTEX_X_OFFSET << 2, GR_PARAM_ENABLE); - grVertexLayout(GR_PARAM_PARGB, GR_VERTEX_PARGB_OFFSET << 2, GR_PARAM_ENABLE); - grVertexLayout(GR_PARAM_Q, GR_VERTEX_OOW_OFFSET << 2, GR_PARAM_ENABLE); - grVertexLayout(GR_PARAM_Z, GR_VERTEX_OOZ_OFFSET << 2, GR_PARAM_ENABLE); - grVertexLayout(GR_PARAM_ST0, GR_VERTEX_SOW_TMU0_OFFSET << 2, GR_PARAM_ENABLE); - grVertexLayout(GR_PARAM_Q0, GR_VERTEX_OOW_TMU0_OFFSET << 2, GR_PARAM_DISABLE); - grVertexLayout(GR_PARAM_ST1, GR_VERTEX_SOW_TMU1_OFFSET << 2, GR_PARAM_DISABLE); - grVertexLayout(GR_PARAM_Q1, GR_VERTEX_OOW_TMU1_OFFSET << 2, GR_PARAM_DISABLE); - END_BOARD_LOCK(); -} -#else /* FX_USE_PARGB */ -void FX_setupGrVertexLayout(void) -{ - BEGIN_BOARD_LOCK(); - grReset(GR_VERTEX_PARAMETER); - - grCoordinateSpace(GR_WINDOW_COORDS); - grVertexLayout(GR_PARAM_XY, GR_VERTEX_X_OFFSET << 2, GR_PARAM_ENABLE); - grVertexLayout(GR_PARAM_RGB, GR_VERTEX_R_OFFSET << 2, GR_PARAM_ENABLE); - grVertexLayout(GR_PARAM_A, GR_VERTEX_A_OFFSET << 2, GR_PARAM_ENABLE); - grVertexLayout(GR_PARAM_Q, GR_VERTEX_OOW_OFFSET << 2, GR_PARAM_ENABLE); - grVertexLayout(GR_PARAM_Z, GR_VERTEX_OOZ_OFFSET << 2, GR_PARAM_ENABLE); - grVertexLayout(GR_PARAM_ST0, GR_VERTEX_SOW_TMU0_OFFSET << 2, GR_PARAM_ENABLE); - grVertexLayout(GR_PARAM_Q0, GR_VERTEX_OOW_TMU0_OFFSET << 2, GR_PARAM_DISABLE); - grVertexLayout(GR_PARAM_ST1, GR_VERTEX_SOW_TMU1_OFFSET << 2, GR_PARAM_DISABLE); - grVertexLayout(GR_PARAM_Q1, GR_VERTEX_OOW_TMU1_OFFSET << 2, GR_PARAM_DISABLE); - END_BOARD_LOCK(); -} -#endif - -void FX_grHints_NoLock(GrHint_t hintType, FxU32 hintMask) -{ - switch(hintType) { - case GR_HINT_STWHINT: - { - if (hintMask & GR_STWHINT_W_DIFF_TMU0) - grVertexLayout(GR_PARAM_Q0, GR_VERTEX_OOW_TMU0_OFFSET << 2, GR_PARAM_ENABLE); - else - grVertexLayout(GR_PARAM_Q0,GR_VERTEX_OOW_TMU0_OFFSET << 2, GR_PARAM_DISABLE); - - if (hintMask & GR_STWHINT_ST_DIFF_TMU1) - grVertexLayout(GR_PARAM_ST1,GR_VERTEX_SOW_TMU1_OFFSET << 2, GR_PARAM_ENABLE); - else - grVertexLayout(GR_PARAM_ST1,GR_VERTEX_SOW_TMU1_OFFSET << 2, GR_PARAM_DISABLE); - - if (hintMask & GR_STWHINT_W_DIFF_TMU1) - grVertexLayout(GR_PARAM_Q1,GR_VERTEX_OOW_TMU1_OFFSET << 2, GR_PARAM_ENABLE); - else - grVertexLayout(GR_PARAM_Q1,GR_VERTEX_OOW_TMU1_OFFSET << 2, GR_PARAM_DISABLE); - - } - } -} - -void FX_grHints(GrHint_t hintType, FxU32 hintMask) { - BEGIN_BOARD_LOCK(); - FX_grHints_NoLock(hintType, hintMask); - END_BOARD_LOCK(); -} - -int FX_grSstQueryHardware(GrHwConfiguration *config) -{ - int i,j; - int numFB; - - BEGIN_BOARD_LOCK(); - grGet(GR_NUM_BOARDS,4,(void*)&(config->num_sst)); - if (config->num_sst == 0) - return 0; - for (i = 0; i< config->num_sst; i++) - { - config->SSTs[i].type = GR_SSTTYPE_VOODOO; - grSstSelect(i); - grGet(GR_MEMORY_FB,4,(void*)&(config->SSTs[i].sstBoard.VoodooConfig.fbRam)); - config->SSTs[i].sstBoard.VoodooConfig.fbRam/= 1024*1024; - - grGet(GR_NUM_TMU,4,(void*)&(config->SSTs[i].sstBoard.VoodooConfig.nTexelfx)); - - - grGet(GR_NUM_FB,4,(void*)&numFB); - if (numFB > 1) - config->SSTs[i].sstBoard.VoodooConfig.sliDetect = FXTRUE; - else - config->SSTs[i].sstBoard.VoodooConfig.sliDetect = FXFALSE; - for (j = 0; j < config->SSTs[i].sstBoard.VoodooConfig.nTexelfx; j++) - { - grGet(GR_MEMORY_TMU,4,(void*)&(config->SSTs[i].sstBoard.VoodooConfig.tmuConfig[j].tmuRam)); - config->SSTs[i].sstBoard.VoodooConfig.tmuConfig[j].tmuRam /= 1024*1024; - } - } - END_BOARD_LOCK(); - return 1; -} - -#else - -int FX_grSstScreenWidth() -{ - int i; - BEGIN_BOARD_LOCK(); - i = grSstScreenWidth(); - END_BOARD_LOCK(); - return i; -} - -int FX_grSstScreenHeight() -{ - int i; - BEGIN_BOARD_LOCK(); - i = grSstScreenHeight(); - END_BOARD_LOCK(); - return i; -} - -int FX_grSstQueryHardware(GrHwConfiguration *c) -{ - int i; - BEGIN_BOARD_LOCK(); - i = grSstQueryHardware(c); - END_BOARD_LOCK(); - return i; -} - - -#endif /* FX_GLIDE3 */ - -/* It appears to me that this function is needed either way. */ -FX_GrContext_t FX_grSstWinOpen( FxU32 hWnd, - GrScreenResolution_t screen_resolution, - GrScreenRefresh_t refresh_rate, - GrColorFormat_t color_format, - GrOriginLocation_t origin_location, - int nColBuffers, - int nAuxBuffers) -{ - FX_GrContext_t i; - BEGIN_BOARD_LOCK(); - i = grSstWinOpen( hWnd, - screen_resolution, - refresh_rate, - color_format, - origin_location, - nColBuffers, - nAuxBuffers ); - - /* - fprintf(stderr, - "grSstWinOpen( win %d res %d ref %d fmt %d\n" - " org %d ncol %d naux %d )\n" - " ==> %d\n", - hWnd, - screen_resolution, - refresh_rate, - color_format, - origin_location, - nColBuffers, - nAuxBuffers, - i); - */ - END_BOARD_LOCK(); - return i; -} - - - -#else - -/* - * Need this to provide at least one external definition. - */ - -int gl_fx_dummy_function_glidew(void) -{ - return 0; -} - -#endif /* FX */ Index: xc/extras/Mesa/src/FX/fxglidew.h diff -u xc/extras/Mesa/src/FX/fxglidew.h:1.4 xc/extras/Mesa/src/FX/fxglidew.h:removed --- xc/extras/Mesa/src/FX/fxglidew.h:1.4 Fri Jun 16 20:02:34 2000 +++ xc/extras/Mesa/src/FX/fxglidew.h Mon Dec 18 14:21:52 2000 @@ -1,938 +0,0 @@ -/* -*- mode: C; tab-width:8; c-basic-offset:2 -*- */ - -/* - * Mesa 3-D graphics library - * Version: 3.3 - * - * Copyright (C) 1999-2000 Brian Paul All Rights Reserved. - * - * 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 - * BRIAN PAUL 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. - * - * - * Original Mesa / 3Dfx device driver (C) 1999 David Bucciarelli, by the - * terms stated above. - * - * Thank you for your contribution, David! - * - * Please make note of the above copyright/license statement. If you - * contributed code or bug fixes to this code under the previous (GNU - * Library) license and object to the new license, your code will be - * removed at your request. Please see the Mesa docs/COPYRIGHT file - * for more information. - * - * Additional Mesa/3Dfx driver developers: - * Daryll Strauss - * Keith Whitwell - * - * See fxapi.h for more revision/author details. - */ - - -#ifndef __FX_GLIDE_WARPER__ -#define __FX_GLIDE_WARPER__ - -#include -#include - -/* - * These are glide extension definitions. These are not - * defined in glide.h. They should really be defined in - * g3ext.h, but they are not. - */ -#if 0 -FX_ENTRY void FX_CALL -grStencilFunc(GrCmpFnc_t fnc, GrStencil_t ref, GrStencil_t mask); - -FX_ENTRY void FX_CALL -grStencilMask(GrStencil_t write_mask); - -FX_ENTRY void FX_CALL -grStencilOp( - GrStencilOp_t stencil_fail, - GrStencilOp_t depth_fail, - GrStencilOp_t depth_pass); - -FX_ENTRY void FX_CALL -grBufferClearExt( - GrColor_t color, - GrAlpha_t alpha, - FxU32 depth, - GrStencil_t stencil); -#endif - - -typedef void (*grStencilFunc_t)(GrCmpFnc_t fnc, GrStencil_t ref, GrStencil_t mask); -typedef void (*grStencilMask_t)(GrStencil_t write_mask); -typedef void (*grStencilOp_t)(GrStencilOp_t stencil_fail, GrStencilOp_t depth_fail, GrStencilOp_t depth_pass); -typedef void (*grBufferClearExt_t)(GrColor_t color, GrAlpha_t alpha, FxU32 depth, GrStencil_t stencil); - -extern grStencilFunc_t grStencilFuncPtr; -extern grStencilMask_t grStencilMaskPtr; -extern grStencilOp_t grStencilOpPtr; -extern grBufferClearExt_t grBufferClearExtPtr; - - -FX_ENTRY void FX_CALL -grEnable(GrEnableMode_t mode); - -FX_ENTRY void FX_CALL -grEnable(GrEnableMode_t mode); -/* - * General context: - */ -#if !defined(FX_GLIDE3) - typedef FxU32 FX_GrContext_t; /* Not used in Glide2 */ -#else - typedef GrContext_t FX_GrContext_t; -#endif - -/* - * Glide3 emulation on Glide2: - */ -#if !defined(FX_GLIDE3) - /* Constanst for FX_grGetInteger( ) */ - #define FX_FOG_TABLE_ENTRIES 0x0004 /* The number of entries in the hardware fog table. */ - #define FX_GLIDE_STATE_SIZE 0x0006 /* Size of buffer, in bytes, needed to save Glide state. */ - #define FX_LFB_PIXEL_PIPE 0x0009 /* 1 if LFB writes can go through the 3D pixel pipe. */ - #define FX_PENDING_BUFFERSWAPS 0x0014 /* The number of buffer swaps pending. */ - #define FX_TEXTURE_ALIGN 0x0024 /* The required alignment for textures */ -#else - #define FX_FOG_TABLE_ENTRIES GR_FOG_TABLE_ENTRIES - #define FX_GLIDE_STATE_SIZE GR_GLIDE_STATE_SIZE - #define FX_LFB_PIXEL_PIPE GR_LFB_PIXEL_PIPE - #define FX_PENDING_BUFFERSWAPS GR_PENDING_BUFFERSWAPS - #define FX_TEXTURE_ALIGN GR_TEXTURE_ALIGN -#endif -#define FX_ZDEPTH_MAX 0x100 - -/* - * Genral warper functions for Glide2/Glide3: - */ -extern FxI32 FX_grGetInteger_NoLock(FxU32 pname); -extern FxI32 FX_grGetInteger(FxU32 pname); - -/* - * Glide2 emulation on Glide3: - */ -#if defined(FX_GLIDE3) - -#define GR_ASPECT_1x1 GR_ASPECT_LOG2_1x1 -#define GR_ASPECT_2x1 GR_ASPECT_LOG2_2x1 -#define GR_ASPECT_4x1 GR_ASPECT_LOG2_4x1 -#define GR_ASPECT_8x1 GR_ASPECT_LOG2_8x1 -#define GR_ASPECT_1x2 GR_ASPECT_LOG2_1x2 -#define GR_ASPECT_1x4 GR_ASPECT_LOG2_1x4 -#define GR_ASPECT_1x8 GR_ASPECT_LOG2_1x8 - -#define GR_LOD_256 GR_LOD_LOG2_256 -#define GR_LOD_128 GR_LOD_LOG2_128 -#define GR_LOD_64 GR_LOD_LOG2_64 -#define GR_LOD_32 GR_LOD_LOG2_32 -#define GR_LOD_16 GR_LOD_LOG2_16 -#define GR_LOD_8 GR_LOD_LOG2_8 -#define GR_LOD_4 GR_LOD_LOG2_4 -#define GR_LOD_2 GR_LOD_LOG2_2 -#define GR_LOD_1 GR_LOD_LOG2_1 - -#define GR_FOG_WITH_TABLE GR_FOG_WITH_TABLE_ON_Q - -typedef int GrSstType; - -#define MAX_NUM_SST 4 - -#define GR_SSTTYPE_VOODOO 0 -#define GR_SSTTYPE_SST96 1 -#define GR_SSTTYPE_AT3D 2 -#define GR_SSTTYPE_Voodoo2 3 - -typedef struct GrTMUConfig_St { - int tmuRev; /* Rev of Texelfx chip */ - int tmuRam; /* 1, 2, or 4 MB */ -} GrTMUConfig_t; - -typedef struct GrVoodooConfig_St { - int fbRam; /* 1, 2, or 4 MB */ - int fbiRev; /* Rev of Pixelfx chip */ - int nTexelfx; /* How many texelFX chips are there? */ - FxBool sliDetect; /* Is it a scan-line interleaved board? */ - GrTMUConfig_t tmuConfig[GLIDE_NUM_TMU]; /* Configuration of the Texelfx chips */ -} GrVoodooConfig_t; - -typedef struct GrSst96Config_St { - int fbRam; /* How much? */ - int nTexelfx; - GrTMUConfig_t tmuConfig; -} GrSst96Config_t; - -typedef GrVoodooConfig_t GrVoodoo2Config_t; - -typedef struct GrAT3DConfig_St { - int rev; -} GrAT3DConfig_t; - -typedef struct { - int num_sst; /* # of HW units in the system */ - struct { - GrSstType type; /* Which hardware is it? */ - union SstBoard_u { - GrVoodooConfig_t VoodooConfig; - GrSst96Config_t SST96Config; - GrAT3DConfig_t AT3DConfig; - GrVoodoo2Config_t Voodoo2Config; - } sstBoard; - } SSTs[MAX_NUM_SST]; /* configuration for each board */ -} GrHwConfiguration; - -typedef FxU32 GrHint_t; -#define GR_HINTTYPE_MIN 0 -#define GR_HINT_STWHINT 0 - -typedef FxU32 GrSTWHint_t; -#define GR_STWHINT_W_DIFF_FBI FXBIT(0) -#define GR_STWHINT_W_DIFF_TMU0 FXBIT(1) -#define GR_STWHINT_ST_DIFF_TMU0 FXBIT(2) -#define GR_STWHINT_W_DIFF_TMU1 FXBIT(3) -#define GR_STWHINT_ST_DIFF_TMU1 FXBIT(4) -#define GR_STWHINT_W_DIFF_TMU2 FXBIT(5) -#define GR_STWHINT_ST_DIFF_TMU2 FXBIT(6) - -#define GR_CONTROL_ACTIVATE 1 -#define GR_CONTROL_DEACTIVATE 0 - -#define GrState void - -/* -** move the vertex layout defintion to application -*/ -typedef struct { - float sow; /* s texture ordinate (s over w) */ - float tow; /* t texture ordinate (t over w) */ - float oow; /* 1/w (used mipmapping - really 0xfff/w) */ -} GrTmuVertex; - - -#if FX_USE_PARGB - -typedef struct -{ - float x, y; /* X and Y in screen space */ - float ooz; /* 65535/Z (used for Z-buffering) */ - float oow; /* 1/W (used for W-buffering, texturing) */ - FxU32 argb; /* R, G, B, A [0..255.0] */ - GrTmuVertex tmuvtx[GLIDE_NUM_TMU]; - float z; /* Z is ignored */ -} GrVertex; - -#define GR_VERTEX_X_OFFSET 0 -#define GR_VERTEX_Y_OFFSET 1 -#define GR_VERTEX_OOZ_OFFSET 2 -#define GR_VERTEX_OOW_OFFSET 3 -#define GR_VERTEX_PARGB_OFFSET 4 -#define GR_VERTEX_SOW_TMU0_OFFSET 5 -#define GR_VERTEX_TOW_TMU0_OFFSET 6 -#define GR_VERTEX_OOW_TMU0_OFFSET 7 -#define GR_VERTEX_SOW_TMU1_OFFSET 8 -#define GR_VERTEX_TOW_TMU1_OFFSET 9 -#define GR_VERTEX_OOW_TMU1_OFFSET 10 -#define GR_VERTEX_Z_OFFSET 11 - -#define GET_PARGB(v) ((FxU32*)(v))[GR_VERTEX_PARGB_OFFSET] -/* GET_PA: returns the alpha component */ -#if GLIDE_ENDIAN == GLIDE_ENDIAN_BIG - #define GET_PA(v) ((FxU8*)(v))[GR_VERTEX_PARGB_OFFSET*4] -#else - #define GET_PA(v) ((FxU8*)(v))[GR_VERTEX_PARGB_OFFSET*4+3] -#endif -#define MESACOLOR2PARGB(c) (c[ACOMP] << 24 | c[GCOMP] << 16 | c[GCOMP] << 8 | c[BCOMP]) -#define PACK_4F_ARGB(dest,a,r,g,b) { \ - const GLuint cr = (int)r; \ - const GLuint cg = (int)g; \ - const GLuint ca = (int)a; \ - const GLuint cb = (int)b; \ - dest = ca << 24 | cr << 16 | cg << 8 | cb; \ - } - -#else /* FX_USE_PARGB */ - -typedef struct -{ - float x, y, z; /* X, Y, and Z of scrn space -- Z is ignored */ - float r, g, b; /* R, G, B, ([0..255.0]) */ - float ooz; /* 65535/Z (used for Z-buffering) */ - float a; /* Alpha [0..255.0] */ - float oow; /* 1/W (used for W-buffering, texturing) */ - GrTmuVertex tmuvtx[GLIDE_NUM_TMU]; -} GrVertex; - -#define GR_VERTEX_X_OFFSET 0 -#define GR_VERTEX_Y_OFFSET 1 -#define GR_VERTEX_Z_OFFSET 2 -#define GR_VERTEX_R_OFFSET 3 -#define GR_VERTEX_G_OFFSET 4 -#define GR_VERTEX_B_OFFSET 5 -#define GR_VERTEX_OOZ_OFFSET 6 -#define GR_VERTEX_A_OFFSET 7 -#define GR_VERTEX_OOW_OFFSET 8 -#define GR_VERTEX_SOW_TMU0_OFFSET 9 -#define GR_VERTEX_TOW_TMU0_OFFSET 10 -#define GR_VERTEX_OOW_TMU0_OFFSET 11 -#define GR_VERTEX_SOW_TMU1_OFFSET 12 -#define GR_VERTEX_TOW_TMU1_OFFSET 13 -#define GR_VERTEX_OOW_TMU1_OFFSET 14 -#endif /* FX_USE_PARGB */ - -#endif - -/* - * Glide2 functions for Glide3 - */ -#if defined(FX_GLIDE3) -#define FX_grTexDownloadTable(TMU,type,data) \ - do { \ - BEGIN_BOARD_LOCK(); \ - grTexDownloadTable(type,data); \ - END_BOARD_LOCK(); \ - } while (0); -#define FX_grTexDownloadTable_NoLock(TMU,type,data) \ - grTexDownloadTable(type, data) -#else -#define FX_grTexDownloadTable(TMU,type,data) \ - do { \ - BEGIN_BOARD_LOCK(); \ - grTexDownloadTable(TMU,type,data); \ - END_BOARD_LOCK(); \ - } while (0); -#define FX_grTexDownloadTable_NoLock grTexDownloadTable -#endif - -/* - * Flush - */ -#if defined(FX_GLIDE3) -#define FX_grFlush() \ - do { \ - BEGIN_BOARD_LOCK(); \ - grFlush(); \ - END_BOARD_LOCK(); \ - } while (0) -#else -#define FX_grFlush() \ - do { \ - BEGIN_BOARD_LOCK(); \ - grSstIdle(); \ - END_BOARD_LOCK(); \ - } while (0) -#endif - -#define FX_grFinish() \ - do { \ - BEGIN_BOARD_LOCK(); \ - grFinish(); \ - END_BOARD_LOCK(); \ - } while (0) - -/* - * Write region: ToDo possible exploit the PixelPipe parameter. - */ -#if defined(FX_GLIDE3) -#define FX_grLfbWriteRegion(dst_buffer,dst_x,dst_y,src_format,src_width,src_height,src_stride,src_data) \ - do { \ - BEGIN_BOARD_LOCK(); \ - grLfbWriteRegion(dst_buffer,dst_x,dst_y,src_format,src_width,src_height,FXFALSE,src_stride,src_data); \ - END_BOARD_LOCK(); \ - } while(0) -#else -#define FX_grLfbWriteRegion(dst_buffer,dst_x,dst_y,src_format,src_width,src_height,src_stride,src_data) \ - do { \ - BEGIN_BOARD_LOCK(); \ - grLfbWriteRegion(dst_buffer,dst_x,dst_y,src_format,src_width,src_height,src_stride,src_data); \ - END_BOARD_LOCK(); \ - } while (0) -#endif - -/* - * Read region - */ -#define FX_grLfbReadRegion(src_buffer,src_x,src_y,src_width,src_height,dst_stride,dst_data) \ - do { \ - BEGIN_BOARD_LOCK(); \ - grLfbReadRegion(src_buffer,src_x,src_y,src_width,src_height,dst_stride,dst_data); \ - END_BOARD_LOCK(); \ - } while (0); - -/* - * Draw triangle - */ -#define FX_grDrawTriangle(a,b,c) \ - do { \ - BEGIN_CLIP_LOOP(); \ - grDrawTriangle(a,b,c); \ - END_CLIP_LOOP(); \ - } while (0) - -/* - * For Lod/LodLog2 conversion. - */ -#if defined(FX_GLIDE3) - #define FX_largeLodLog2(info) (info).largeLodLog2 -#else - #define FX_largeLodLog2(info) (info).largeLod -#endif - -#if defined(FX_GLIDE3) - #define FX_aspectRatioLog2(info) (info).aspectRatioLog2 -#else - #define FX_aspectRatioLog2(info) (info).aspectRatio -#endif - -#if defined(FX_GLIDE3) - #define FX_smallLodLog2(info) (info).smallLodLog2 -#else - #define FX_smallLodLog2(info) (info).smallLod -#endif - -#if defined(FX_GLIDE3) - #define FX_lodToValue(val) ((int)(GR_LOD_256-val)) -#else - #define FX_lodToValue(val) ((int)(val)) -#endif - -#if defined(FX_GLIDE3) - #define FX_largeLodValue(info) ((int)(GR_LOD_256-(info).largeLodLog2)) -#else - #define FX_largeLodValue(info) ((int)(info).largeLod) -#endif -#define FX_largeLodValue_NoLock FX_largeLodValue - -#if defined(FX_GLIDE3) - #define FX_smallLodValue(info) ((int)(GR_LOD_256-(info).smallLodLog2)) -#else - #define FX_smallLodValue(info) ((int)(info).smallLod) -#endif -#define FX_smallLodValue_NoLock FX_smallLodValue - -#if defined(FX_GLIDE3) - #define FX_valueToLod(val) ((GrLOD_t)(GR_LOD_256-val)) -#else - #define FX_valueToLod(val) ((GrLOD_t)(val)) -#endif - -/* - * ScreenWidth/Height stuff. - */ - extern int FX_grSstScreenWidth(void); - extern int FX_grSstScreenHeight(void); - - - -/* - * Version string. - */ -#if defined(FX_GLIDE3) - extern void FX_grGlideGetVersion(char *buf); -#else - #define FX_grGlideGetVersion(b) \ - do { \ - BEGIN_BOARD_LOCK(); \ - grGlideGetVersion(b); \ - END_BOARD_LOCK(); \ - } while (0) -#endif -/* - * Performance statistics - */ -#if defined(FX_GLIDE3) - extern void FX_grSstPerfStats(GrSstPerfStats_t *st); -#else - #define FX_grSstPerfStats(s) \ - do { \ - BEGIN_BOARD_LOCK(); \ - grSstPerfStats(s); \ - END_BOARD_LOCK(); \ - } while (0) -#endif - -/* - * Hardware Query - */ - extern int FX_grSstQueryHardware(GrHwConfiguration *config); - -/* - * GrHints - */ -#if defined(FX_GLIDE3) - extern void FX_grHints_NoLock(GrHint_t hintType, FxU32 hintMask); - extern void FX_grHints(GrHint_t hintType, FxU32 hintMask); -#else - #define FX_grHints(t,m) \ - do { \ - BEGIN_BOARD_LOCK(); \ - grHints(t, m); \ - END_BOARD_LOCK(); \ - } while(0) - #define FX_grHints_NoLock grHints -#endif -/* - * Antialiashed line+point drawing. - */ -#if defined(FX_GLIDE3) - extern void FX_grAADrawLine(GrVertex *a,GrVertex *b); -#else - #define FX_grAADrawLine(a,b) \ - do { \ - BEGIN_CLIP_LOOP(); \ - grAADrawLine(a,b); \ - END_CLIP_LOOP(); \ - } while (0) -#endif - -#if defined(FX_GLIDE3) - extern void FX_grAADrawPoint(GrVertex *a); -#else - #define FX_grAADrawPoint(a) \ - do { \ - BEGIN_CLIP_LOOP(); \ - grAADrawPoint(a); \ - END_CLIP_LOOP(); \ - } while (0) -#endif - -/* - * Needed for Glide3 only, to set up Glide2 compatible vertex layout. - */ -#if defined(FX_GLIDE3) - extern void FX_setupGrVertexLayout(void); -#else - #define FX_setupGrVertexLayout() do {} while (0) -#endif -/* - * grSstControl stuff - */ -extern FxBool FX_grSstControl(FxU32 code); - -/* - * grGammaCorrectionValue - */ -#if defined(FX_GLIDE3) - extern void FX_grGammaCorrectionValue(float val); -#else - #define FX_grGammaCorrectionValue(v) \ - do { \ - BEGIN_BOARD_LOCK(); \ - grGammaCorrectionValue(v) \ - END_BOARD_LOCK(); \ - } while (0) -#endif - -#if defined(FX_GLIDE3) -#define FX_grSstWinClose(w) \ - do { \ - BEGIN_BOARD_LOCK(); \ - grSstWinClose(w); \ - END_BOARD_LOCK(); \ - } while (0) -#else -#define FX_grSstWinClose(w) \ - do { \ - BEGIN_BOARD_LOCK(); \ - grSstWinClose(); \ - END_BOARD_LOCK(); \ - } while (0) -#endif - - -extern FX_GrContext_t FX_grSstWinOpen( FxU32 hWnd, - GrScreenResolution_t screen_resolution, - GrScreenRefresh_t refresh_rate, - GrColorFormat_t color_format, - GrOriginLocation_t origin_location, - int nColBuffers, - int nAuxBuffers); - - -#define FX_grDrawLine(v1, v2) \ - do { \ - BEGIN_CLIP_LOOP(); \ - grDrawLine(v1, v2); \ - END_CLIP_LOOP(); \ - } while (0) - -#define FX_grDrawPoint(p) \ - do { \ - BEGIN_CLIP_LOOP(); \ - grDrawPoint(p); \ - END_CLIP_LOOP(); \ - } while (0) - -#if defined(FX_GLIDE3) -extern void FX_grDrawPolygonVertexList(int n, GrVertex *v); -#else -#define FX_grDrawPolygonVertexList(n, v) \ - do { \ - BEGIN_CLIP_LOOP(); \ - grDrawPolygonVertexList(n, v); \ - END_CLIP_LOOP(); \ - } while (0) -#endif - -#define FX_grDitherMode(m) \ - do { \ - BEGIN_BOARD_LOCK(); \ - grDitherMode(m); \ - END_BOARD_LOCK(); \ - } while (0) - -#define FX_grRenderBuffer(b) \ - do { \ - BEGIN_BOARD_LOCK(); \ - grRenderBuffer(b); \ - END_BOARD_LOCK(); \ - } while (0) - -#define FX_grBufferClear(c, a, d) \ - do { \ - BEGIN_CLIP_LOOP(); \ - grBufferClear(c, a, d); \ - END_CLIP_LOOP(); \ - } while (0) - -#define FX_grBufferClearExt(c, a, d, s) \ - do { \ - BEGIN_CLIP_LOOP(); \ - (*grBufferClearExtPtr)(c, a, d, s); \ - END_CLIP_LOOP(); \ - } while (0) - -/* - * Enable/Disable - */ -#define FX_grEnable(m) \ - do { \ - BEGIN_BOARD_LOCK(); \ - grEnable(m); \ - END_BOARD_LOCK(); \ - } while (0) - -#define FX_grDisable(m) \ - do { \ - BEGIN_BOARD_LOCK(); \ - grDisable(m); \ - END_BOARD_LOCK(); \ - } while (0) - -/* - * Stencil operations. - */ -#define FX_grStencilFunc(fnc, ref, mask) \ - do { \ - BEGIN_BOARD_LOCK(); \ - (*grStencilFuncPtr)((fnc), (ref), (mask)); \ - END_BOARD_LOCK(); \ - } while (0) - -#define FX_grStencilMask(write_mask) \ - do { \ - BEGIN_BOARD_LOCK(); \ - (*grStencilMaskPtr)(write_mask); \ - END_BOARD_LOCK(); \ - } while (0) - - -#define FX_grStencilOp(stencil_fail, depth_fail, depth_pass) \ - do { \ - BEGIN_BOARD_LOCK(); \ - (*grStencilOpPtr)((stencil_fail), (depth_fail), (depth_pass)); \ - END_BOARD_LOCK(); \ - } while (0) - -#define FX_grDepthMask(m) \ - do { \ - BEGIN_BOARD_LOCK(); \ - grDepthMask(m); \ - END_BOARD_LOCK(); \ - } while (0) - -#define FX_grColorMask(c, a) \ - do { \ - BEGIN_BOARD_LOCK(); \ - grColorMask(c, a); \ - END_BOARD_LOCK(); \ - } while (0) - -extern FxBool FX_grLfbLock(GrLock_t type, GrBuffer_t buffer, - GrLfbWriteMode_t writeMode, - GrOriginLocation_t origin, FxBool pixelPipeline, - GrLfbInfo_t *info ); - -#define FX_grLfbUnlock(t, b) \ - do { \ - BEGIN_BOARD_LOCK(); \ - grLfbUnlock(t, b); \ - END_BOARD_LOCK(); \ - } while (0) - -#define FX_grConstantColorValue(v) \ - do { \ - BEGIN_BOARD_LOCK(); \ - grConstantColorValue(v); \ - END_BOARD_LOCK(); \ - } while (0) - -#define FX_grConstantColorValue_NoLock grConstantColorValue - -#define FX_grAADrawTriangle(a, b, c, ab, bc, ca) \ - do { \ - BEGIN_CLIP_LOOP(); \ - grAADrawTriangle(a, b, c, ab, bc, ca); \ - END_CLIP_LOOP(); \ - } while (0) - -#define FX_grAlphaBlendFunction(rs, rd, as, ad) \ - do { \ - BEGIN_BOARD_LOCK(); \ - grAlphaBlendFunction(rs, rd, as, ad); \ - END_BOARD_LOCK(); \ - } while (0) - -#define FX_grAlphaCombine(func, fact, loc, oth, inv) \ - do { \ - BEGIN_BOARD_LOCK(); \ - grAlphaCombine(func, fact, loc, oth, inv); \ - END_BOARD_LOCK(); \ - } while (0) - -#define FX_grAlphaCombine_NoLock grAlphaCombine - -#define FX_grAlphaTestFunction(f) \ - do { \ - BEGIN_BOARD_LOCK(); \ - grAlphaTestFunction(f); \ - END_BOARD_LOCK(); \ - } while (0) - -#define FX_grAlphaTestReferenceValue(v) \ - do { \ - BEGIN_BOARD_LOCK(); \ - grAlphaTestReferenceValue(v); \ - END_BOARD_LOCK(); \ - } while (0) - -#define FX_grClipWindow(minx, miny, maxx, maxy) \ - do { \ - BEGIN_BOARD_LOCK(); \ - grClipWindow(minx, miny, maxx, maxy); \ - END_BOARD_LOCK(); \ - } while (0) - -#define FX_grClipWindow_NoLock grClipWindow - -#define FX_grColorCombine(func, fact, loc, oth, inv) \ - do { \ - BEGIN_BOARD_LOCK(); \ - grColorCombine(func, fact, loc, oth, inv); \ - END_BOARD_LOCK(); \ - } while (0) - -#define FX_grColorCombine_NoLock grColorCombine - -#define FX_grCullMode(m) \ - do { \ - BEGIN_BOARD_LOCK(); \ - grCullMode(m); \ - END_BOARD_LOCK(); \ - } while (0) - -#define FX_grDepthBiasLevel(lev) \ - do { \ - BEGIN_BOARD_LOCK(); \ - grDepthBiasLevel(lev); \ - END_BOARD_LOCK(); \ - } while (0) - -#define FX_grDepthBufferFunction(func) \ - do { \ - BEGIN_BOARD_LOCK(); \ - grDepthBufferFunction(func); \ - END_BOARD_LOCK(); \ - } while (0) - -#define FX_grFogColorValue(c) \ - do { \ - BEGIN_BOARD_LOCK(); \ - grFogColorValue(c); \ - END_BOARD_LOCK(); \ - } while (0) - -#define FX_grFogMode(m) \ - do { \ - BEGIN_BOARD_LOCK(); \ - grFogMode(m); \ - END_BOARD_LOCK(); \ - } while (0) - -#define FX_grFogTable(t) \ - do { \ - BEGIN_BOARD_LOCK(); \ - grFogTable(t); \ - END_BOARD_LOCK(); \ - } while (0) - -#define FX_grTexClampMode(t, sc, tc) \ - do { \ - BEGIN_BOARD_LOCK(); \ - grTexClampMode(t, sc, tc); \ - END_BOARD_LOCK(); \ - } while (0) - -#define FX_grTexClampMode_NoLock grTexClampMode - -#define FX_grTexCombine(t, rfunc, rfact, afunc, afact, rinv, ainv) \ - do { \ - BEGIN_BOARD_LOCK(); \ - grTexCombine(t, rfunc, rfact, afunc, afact, rinv, ainv); \ - END_BOARD_LOCK(); \ - } while (0) - -#define FX_grTexCombine_NoLock grTexCombine - -#define FX_grTexDownloadMipMapLevel(t, sa, tlod, llod, ar, f, eo, d) \ - do { \ - BEGIN_BOARD_LOCK(); \ - grTexDownloadMipMapLevel(t, sa, tlod, llod, ar, f, eo, d); \ - END_BOARD_LOCK(); \ - } while (0) - -#define FX_grTexDownloadMipMapLevel_NoLock grTexDownloadMipMapLevel - -#define FX_grTexDownloadMipMapLevelPartial(t, sa, tlod, llod, ar, f, eo, d, s, e); \ - do { \ - BEGIN_BOARD_LOCK(); \ - grTexDownloadMipMapLevelPartial(t, sa, tlod, llod, ar, f, eo, d, s, e); \ - END_BOARD_LOCK(); \ - } while (0) - -#define FX_grTexFilterMode(t, minf, magf) \ - do { \ - BEGIN_BOARD_LOCK(); \ - grTexFilterMode(t, minf, magf); \ - END_BOARD_LOCK(); \ - } while (0) - -#define FX_grTexFilterMode_NoLock grTexFilterMode - -extern FxU32 FX_grTexMinAddress(GrChipID_t tmu); -extern FxU32 FX_grTexMaxAddress(GrChipID_t tmu); - -#define FX_grTexMipMapMode(t, m, lod) \ - do { \ - BEGIN_BOARD_LOCK(); \ - grTexMipMapMode(t, m, lod); \ - END_BOARD_LOCK(); \ - } while (0) - -#define FX_grTexMipMapMode_NoLock grTexMipMapMode - -#define FX_grTexSource(t, sa, eo, i) \ - do { \ - BEGIN_BOARD_LOCK(); \ - grTexSource(t, sa, eo, i); \ - END_BOARD_LOCK(); \ - } while (0) - -#define FX_grTexSource_NoLock grTexSource - -extern FxU32 FX_grTexTextureMemRequired(FxU32 evenOdd, GrTexInfo *info); -#define FX_grTexTextureMemRequired_NoLock grTexTextureMemRequired - -#define FX_grGlideGetState(s) \ - do { \ - BEGIN_BOARD_LOCK(); \ - grGlideGetState(s); \ - END_BOARD_LOCK(); \ - } while (0) -#define FX_grGlideGetState_NoLock(s) grGlideGetState(s); - -#define FX_grDRIBufferSwap(i) \ - do { \ - BEGIN_BOARD_LOCK(); \ - grDRIBufferSwap(i); \ - END_BOARD_LOCK(); \ - } while (0) - -#define FX_grSstSelect(b) \ - do { \ - BEGIN_BOARD_LOCK(); \ - grSstSelect(b); \ - END_BOARD_LOCK(); \ - } while (0) - -#define FX_grSstSelect_NoLock grSstSelect - -#define FX_grGlideSetState(s) \ - do { \ - BEGIN_BOARD_LOCK(); \ - grGlideSetState(s); \ - END_BOARD_LOCK(); \ - } while (0) -#define FX_grGlideSetState_NoLock(s) grGlideSetState(s); - -#define FX_grDepthBufferMode(m) \ - do { \ - BEGIN_BOARD_LOCK(); \ - grDepthBufferMode(m); \ - END_BOARD_LOCK(); \ - } while (0) - -#define FX_grLfbWriteColorFormat(f) \ - do { \ - BEGIN_BOARD_LOCK(); \ - grLfbWriteColorFormat(f); \ - END_BOARD_LOCK(); \ - } while (0) - -#define FX_grDrawVertexArray(m, c, p) \ - do { \ - BEGIN_CLIP_LOOP(); \ - grDrawVertexArray(m, c, p); \ - END_CLIP_LOOP(); \ - } while (0) - -#define FX_grGlideShutdown() \ - do { \ - BEGIN_BOARD_LOCK(); \ - grGlideShutdown(); \ - END_BOARD_LOCK(); \ - } while (0) - -#define FX_grTexLodBiasValue_NoLock(t, v) grTexLodBiasValue(t, v) - -#define FX_grTexLodBiasValue(t, v) \ - do { \ - BEGIN_BOARD_LOCK(); \ - grTexLodBiasValue(t, v); \ - END_BOARD_LOCK(); \ - } while (0) - -#define FX_grGlideInit_NoLock grGlideInit -#define FX_grSstWinOpen_NoLock grSstWinOpen - -extern int FX_getFogTableSize(void); -extern int FX_getGrStateSize(void); - -#endif /* __FX_GLIDE_WARPER__ */ - Index: xc/extras/Mesa/src/FX/fxpipeline.c diff -u xc/extras/Mesa/src/FX/fxpipeline.c:1.3 xc/extras/Mesa/src/FX/fxpipeline.c:removed --- xc/extras/Mesa/src/FX/fxpipeline.c:1.3 Fri Jun 16 20:02:34 2000 +++ xc/extras/Mesa/src/FX/fxpipeline.c Mon Dec 18 14:21:52 2000 @@ -1,302 +0,0 @@ -/* -*- mode: C; tab-width:8; c-basic-offset:2 -*- */ - -/* - * Mesa 3-D graphics library - * Version: 3.3 - * - * Copyright (C) 1999-2000 Brian Paul All Rights Reserved. - * - * 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 - * BRIAN PAUL 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. - * - * - * Original Mesa / 3Dfx device driver (C) 1999 David Bucciarelli, by the - * terms stated above. - * - * Thank you for your contribution, David! - * - * Please make note of the above copyright/license statement. If you - * contributed code or bug fixes to this code under the previous (GNU - * Library) license and object to the new license, your code will be - * removed at your request. Please see the Mesa docs/COPYRIGHT file - * for more information. - * - * Additional Mesa/3Dfx driver developers: - * Daryll Strauss - * Keith Whitwell - * - * See fxapi.h for more revision/author details. - */ - - -#ifdef HAVE_CONFIG_H -#include "conf.h" -#endif - - -#if defined(FX) - -#include "fxdrv.h" -#include "vbindirect.h" - - -/* We don't handle texcoord-4 in the safe clip routines - maybe we should. - */ -static void fxDDRenderElements( struct vertex_buffer *VB ) -{ - GLcontext *ctx = VB->ctx; - fxMesaContext fxMesa = (fxMesaContext)ctx->DriverCtx; - - if (fxMesa->render_index != 0 || - ((ctx->Texture.ReallyEnabled & 0xf) && VB->TexCoordPtr[0]->size>2) || - ((ctx->Texture.ReallyEnabled & 0xf0) && VB->TexCoordPtr[1]->size>2) || - (VB->ClipPtr->size != 4)) /* Brokes clipping otherwise */ - gl_render_elts( VB ); - else - fxDDRenderElementsDirect( VB ); -} - -static void fxDDCheckRenderVBIndirect( GLcontext *ctx, - struct gl_pipeline_stage *d ) -{ - d->type = 0; - - if ((ctx->IndirectTriangles & DD_SW_SETUP) == 0 && - ctx->Driver.MultipassFunc == 0) - { - d->type = PIPE_IMMEDIATE; - d->inputs = VERT_SETUP_FULL | VERT_ELT | VERT_PRECALC_DATA; - } -} - -static void fxDDRenderVBIndirect( struct vertex_buffer *VB ) -{ - GLcontext *ctx = VB->ctx; - fxMesaContext fxMesa = (fxMesaContext)ctx->DriverCtx; - struct vertex_buffer *cvaVB = ctx->CVA.VB; - - if (fxMesa->render_index != 0 || - ((ctx->Texture.ReallyEnabled & 0xf) && cvaVB->TexCoordPtr[0]->size>2) || - ((ctx->Texture.ReallyEnabled & 0xf0) && cvaVB->TexCoordPtr[1]->size>2) || - (VB->ClipPtr->size != 4)) /* Brokes clipping otherwise */ - gl_render_vb_indirect( VB ); - else - fxDDRenderVBIndirectDirect( VB ); -} - - -static void fxDDRenderVB( struct vertex_buffer *VB ) -{ - GLcontext *ctx = VB->ctx; - fxMesaContext fxMesa = (fxMesaContext)ctx->DriverCtx; - - if ((fxMesa->render_index != 0) || - ((ctx->Texture.ReallyEnabled & 0xf) && VB->TexCoordPtr[0]->size>2) || - ((ctx->Texture.ReallyEnabled & 0xf0) && VB->TexCoordPtr[1]->size>2)) - gl_render_vb( VB ); - else - fxDDDoRenderVB( VB ); -} - - - - -/* This sort of driver-based reconfiguration of the pipeline could be - * used to support accelerated transformation and lighting on capable - * hardware. - * - */ -GLuint fxDDRegisterPipelineStages( struct gl_pipeline_stage *out, - const struct gl_pipeline_stage *in, - GLuint nr ) -{ - GLuint i, o; - - for (i = o = 0 ; i < nr ; i++) { - switch (in[i].ops) { - case PIPE_OP_RAST_SETUP_1|PIPE_OP_RENDER: - out[o] = in[i]; - out[o].state_change = NEW_CLIENT_STATE; - out[o].check = fxDDCheckMergeAndRender; - out[o].run = fxDDMergeAndRender; - o++; - break; - case PIPE_OP_RAST_SETUP_0: - out[o] = in[i]; - out[o].cva_state_change = NEW_LIGHTING|NEW_TEXTURING|NEW_RASTER_OPS; - out[o].state_change = ~0; - out[o].check = fxDDCheckPartialRasterSetup; - out[o].run = fxDDPartialRasterSetup; - o++; - break; - case PIPE_OP_RAST_SETUP_0|PIPE_OP_RAST_SETUP_1: - out[o] = in[i]; - out[o].run = fxDDDoRasterSetup; - o++; - break; - case PIPE_OP_RENDER: - out[o] = in[i]; - if (in[i].run == gl_render_elts) { - out[o].run = fxDDRenderElements; - } else if (in[i].run == gl_render_vb_indirect) { - out[o].check = fxDDCheckRenderVBIndirect; - out[o].run = fxDDRenderVBIndirect; - } else if (in[i].run == gl_render_vb) { - out[o].run = fxDDRenderVB; - } - - o++; - break; - default: - out[o++] = in[i]; - break; - } - } - - return o; -} - -#define ILLEGAL_ENABLES (TEXTURE0_3D| \ - TEXTURE1_3D| \ - ENABLE_TEXMAT0 | \ - ENABLE_TEXMAT1 | \ - ENABLE_TEXGEN0 | \ - ENABLE_TEXGEN1 | \ - ENABLE_USERCLIP | \ - ENABLE_LIGHT | \ - ENABLE_FOG) - - - -/* Because this is slotted in by the OptimizePipeline function, most - * of the information here is just for gl_print_pipeline(). Only the - * run member is required. - */ -static struct gl_pipeline_stage fx_fast_stage = { - "FX combined vertex transform, setup and rasterization stage", - PIPE_OP_VERT_XFORM|PIPE_OP_RAST_SETUP_0|PIPE_OP_RAST_SETUP_1|PIPE_OP_RENDER, - PIPE_PRECALC, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, /* never called */ - fxDDFastPath -}; - - - - -/* Better than optimizing the pipeline, we can do the whole build very - * quickly with the aid of a new flags member. - */ -GLboolean fxDDBuildPrecalcPipeline( GLcontext *ctx ) -{ - struct gl_pipeline *pipe = &ctx->CVA.pre; - fxMesaContext fxMesa = FX_CONTEXT(ctx); - - - if (fxMesa->is_in_hardware && - fxMesa->render_index == 0 && - (ctx->Enabled & ILLEGAL_ENABLES) == 0 && - (ctx->Array.Flags & (VERT_OBJ_234| - VERT_TEX0_4| - VERT_TEX1_4| - VERT_ELT)) == (VERT_OBJ_23|VERT_ELT)) - { - if (MESA_VERBOSE & (VERBOSE_STATE|VERBOSE_DRIVER)) - if (!fxMesa->using_fast_path) - fprintf(stderr, "fxMesa: using fast path\n"); - - pipe->stages[0] = &fx_fast_stage; - pipe->stages[1] = 0; - pipe->new_inputs = ctx->RenderFlags & VERT_DATA; - pipe->ops = pipe->stages[0]->ops; - fxMesa->using_fast_path = 1; - return 1; - } - - if (fxMesa->using_fast_path) - { - if (MESA_VERBOSE & (VERBOSE_STATE|VERBOSE_DRIVER)) - fprintf(stderr, "fxMesa: fall back to full pipeline %x %x %x %x %x\n", - fxMesa->is_in_hardware, - fxMesa->render_index, - (ctx->Enabled & ILLEGAL_ENABLES), - (ctx->Array.Summary & (VERT_OBJ_23)), - (ctx->Array.Summary & (VERT_OBJ_4|VERT_TEX0_4|VERT_TEX1_4))); - - fxMesa->using_fast_path = 0; - ctx->CVA.VB->ClipOrMask = 0; - ctx->CVA.VB->ClipAndMask = CLIP_ALL_BITS; - ctx->Array.NewArrayState |= ctx->Array.Summary; - return 0; - } - - return 0; -} - - - - - - -/* Perform global optimizations to the pipeline. The fx driver - * implements a single such fast path, which corresponds to the standard - * quake3 cva pipeline. - * - * This is now handled by the 'build' function above. - */ -void fxDDOptimizePrecalcPipeline( GLcontext *ctx, struct gl_pipeline *pipe ) -{ - fxMesaContext fxMesa = FX_CONTEXT(ctx); - - if (fxMesa->is_in_hardware && - fxMesa->render_index == 0 && - (ctx->Enabled & ILLEGAL_ENABLES) == 0 && - (ctx->Array.Summary & VERT_ELT)) - { - pipe->stages[0] = &fx_fast_stage; - pipe->stages[1] = 0; - } -} - - - -/* unused? -void fxDDOptimizeEltPipeline( GLcontext *ctx, struct gl_pipeline *pipe ) -{ - (void) ctx; - (void) pipe; -} -*/ - -#else - -/* - * Need this to provide at least one external definition. - */ -int gl_fxpipeline_dummy(void) -{ - return 0; -} - -#endif Index: xc/extras/Mesa/src/FX/fxrender.c diff -u xc/extras/Mesa/src/FX/fxrender.c:1.3 xc/extras/Mesa/src/FX/fxrender.c:removed --- xc/extras/Mesa/src/FX/fxrender.c:1.3 Fri Jun 16 20:02:34 2000 +++ xc/extras/Mesa/src/FX/fxrender.c Mon Dec 18 14:21:52 2000 @@ -1,785 +0,0 @@ -/* -*- mode: C; tab-width:8; c-basic-offset:2 -*- */ - -/* - * Mesa 3-D graphics library - * Version: 3.3 - * - * Copyright (C) 1999-2000 Brian Paul All Rights Reserved. - * - * 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 - * BRIAN PAUL 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. - * - * - * Original Mesa / 3Dfx device driver (C) 1999 David Bucciarelli, by the - * terms stated above. - * - * Thank you for your contribution, David! - * - * Please make note of the above copyright/license statement. If you - * contributed code or bug fixes to this code under the previous (GNU - * Library) license and object to the new license, your code will be - * removed at your request. Please see the Mesa docs/COPYRIGHT file - * for more information. - * - * Additional Mesa/3Dfx driver developers: - * Daryll Strauss - * Keith Whitwell - * - * See fxapi.h for more revision/author details. - */ - - -/* fxrender.c - 3Dfx VooDoo RenderVB driver function support */ - - -#ifdef HAVE_CONFIG_H -#include "conf.h" -#endif - -#if defined(FX) - -#include "fxdrv.h" -#include "vbcull.h" - -/* - * Render a line segment from VB[v1] to VB[v2] when either one or both - * endpoints must be clipped. - */ -#if !defined(__MWERKS__) -INLINE -#endif -void fxRenderClippedLine( struct vertex_buffer *VB, - GLuint v1, GLuint v2 ) -{ - fxVertex *gWin = FX_DRIVER_DATA(VB)->verts; - GLubyte mask = VB->ClipMask[v1] | VB->ClipMask[v2]; - - if (!mask || (VB->ctx->line_clip_tab[VB->ClipPtr->size])(VB, &v1, &v2, mask)) - FX_grDrawLine((GrVertex *)gWin[v1].f,(GrVertex *)gWin[v2].f); -} - - - - -/* This is legal for Quads as well as triangles, hence the 'n' parameter. - */ -INLINE void fxRenderClippedTriangle( struct vertex_buffer *VB, - GLuint n, GLuint vlist[] ) -{ - GLubyte mask = 0; - GLuint i; - - for (i = 0 ; i < n ; i++) - mask |= VB->ClipMask[vlist[i]]; - - if (mask & CLIP_USER_BIT) { - GLubyte *userclipmask = VB->UserClipMask; - if (userclipmask[vlist[0]] & userclipmask[vlist[1]] & userclipmask[vlist[2]]) - return; - } - - n = (VB->ctx->poly_clip_tab[VB->ClipPtr->size])( VB, n, vlist, mask ); - if (n >= 3) { - fxVertex *gWin = FX_DRIVER_DATA(VB)->verts; - GrVertex *i0 = (GrVertex *)gWin[vlist[0]].f; - GrVertex *i1 = (GrVertex *)gWin[vlist[1]].f; - GrVertex *i2 = (GrVertex *)gWin[vlist[2]].f; - GLuint i; - - for (i=2;iClipMask[v1] | VB->ClipMask[v2]; - - if (!mask) { - fxVertex *gWin = FX_DRIVER_DATA(VB)->verts; - FX_grDrawLine((GrVertex *)gWin[v1].f,(GrVertex *)gWin[v2].f); - } else { - fxMesaContext fxMesa = (fxMesaContext)VB->ctx->DriverCtx; - fxLineClipTab[fxMesa->setupindex & 0x7]( VB, v1, v2, mask ); - } -} - - -static INLINE void fxSafeClippedTriangle( struct vertex_buffer *VB, - fxVertex *gWin, - tfxTriClipFunc cliptri, - GLuint v2, GLuint v1, GLuint v ) -{ - GLubyte *clipmask = VB->ClipMask; - GLubyte mask = clipmask[v2] | clipmask[v1] | clipmask[v]; - - if (!mask) { - FX_grDrawTriangle((GrVertex *)gWin[v2].f, - (GrVertex *)gWin[v1].f, - (GrVertex *)gWin[v].f); - return; - } - - if (!(clipmask[v2] & clipmask[v1] & clipmask[v] & CLIP_ALL_BITS)) - { - GLuint vl[3]; - GLuint imask = mask; - - if (imask & CLIP_USER_BIT) { - GLubyte *userclipmask = VB->UserClipMask; - if (userclipmask[v2] & userclipmask[v1] & userclipmask[v]) - return; - imask |= (userclipmask[v2] | userclipmask[v1] | userclipmask[v]) << 8; - } - - ASSIGN_3V(vl, v2, v1, v ); - cliptri( VB, vl, imask ); - } -} - - -static INLINE void fxSafeClippedTriangle2( struct vertex_buffer *VB, - fxVertex *gWin, - tfxTriViewClipFunc cliptri, - GLuint v2, GLuint v1, GLuint v ) -{ - GLubyte *clipmask = VB->ClipMask; - GLubyte mask = clipmask[v2] | clipmask[v1] | clipmask[v]; - - if (!mask) { - FX_grDrawTriangle((GrVertex *)gWin[v2].f,(GrVertex *)gWin[v1].f, - (GrVertex *)gWin[v].f); - } else if (!(clipmask[v2] & clipmask[v1] & clipmask[v])) { - GLuint vl[3]; - ASSIGN_3V(vl, v2, v1, v ); - cliptri( VB, vl, mask ); - } -} - - -static INLINE void fxSafeClippedTriangle3( struct vertex_buffer *VB, - fxVertex *gWin, - tfxTriClipFunc cliptri, - GLuint v2, GLuint v1, GLuint v ) -{ - GLubyte *clipmask = VB->ClipMask; - GLubyte mask = clipmask[v2] | clipmask[v1] | clipmask[v]; - GLuint imask = mask; - - if (imask & CLIP_USER_BIT) { - GLubyte *userclipmask = VB->UserClipMask; - if (userclipmask[v2] & userclipmask[v1] & userclipmask[v]) - return; - imask |= (userclipmask[v2] | userclipmask[v1] | userclipmask[v]) << 8; - } - - { - GLuint vl[3]; - ASSIGN_3V(vl, v2, v1, v ); - cliptri( VB, vl, imask ); - } -} - - - - - -/************************************************************************/ -/************************ RenderVB functions ****************************/ -/************************************************************************/ - - -/* Render front-facing, non-clipped primitives. - */ - -#define RENDER_POINTS( start, count ) \ - (void) gWin; \ - (void) VB; \ - (VB->ctx->Driver.PointsFunc)( VB->ctx, start, count-1 ) - -#define RENDER_LINE( i1, i ) \ - do { \ - RVB_COLOR(i); \ - FX_grDrawLine((GrVertex *)gWin[i1].f, \ - (GrVertex *)gWin[i].f); \ - } while (0) - -#define RENDER_TRI( i2, i1, i, pv, parity ) \ - do { \ - RVB_COLOR(pv); \ - if (parity) { \ - FX_grDrawTriangle((GrVertex *)gWin[i1].f, \ - (GrVertex *)gWin[i2].f, \ - (GrVertex *)gWin[i].f); \ - } else { \ - FX_grDrawTriangle((GrVertex *)gWin[i2].f, \ - (GrVertex *)gWin[i1].f, \ - (GrVertex *)gWin[i].f); \ - } \ - } while (0) - -#define RENDER_QUAD( i3, i2, i1, i, pv ) \ - do { \ - RVB_COLOR(pv); \ - FX_grDrawTriangle((GrVertex *)gWin[i3].f, \ - (GrVertex *)gWin[i2].f, \ - (GrVertex *)gWin[i].f); \ - FX_grDrawTriangle((GrVertex *)gWin[i2].f, \ - (GrVertex *)gWin[i1].f, \ - (GrVertex *)gWin[i].f); \ - } while (0) - - - -#define LOCAL_VARS \ - fxMesaContext fxMesa=(fxMesaContext)VB->ctx->DriverCtx; \ - fxVertex *gWin = FX_DRIVER_DATA(VB)->verts; \ - (void) fxMesa; - -#define INIT(x) - -#define TAG(x) x##_fx_flat_raw -#undef RVB_COLOR -#define RVB_COLOR(pv) FX_VB_COLOR(fxMesa, VB->ColorPtr->data[pv]) -#define PRESERVE_VB_DEFS - -#include "render_tmp.h" - -#define TAG(x) x##_fx_smooth_raw -#undef RVB_COLOR -#define RVB_COLOR(x) - -#include "render_tmp.h" - - - -/* Render with clipped and/or culled primitives with cullmask information. - */ -#define RENDER_POINTS( start, count ) \ - (void) gWin; \ - (void) cullmask; \ - (VB->ctx->Driver.PointsFunc)( VB->ctx, start, count-1 ) - - -#define RENDER_LINE( i1, i ) \ - do { \ - const GLubyte flags = cullmask[i]; \ - \ - if (!(flags & PRIM_NOT_CULLED)) \ - continue; \ - \ - RVB_COLOR(i); \ - if (flags & PRIM_ANY_CLIP) \ - fxRenderClippedLine( VB, i1, i ); \ - else \ - FX_grDrawLine( (GrVertex *)gWin[i1].f, (GrVertex *)gWin[i].f ); \ - } while (0) - - -#define RENDER_TRI( i2, i1, i, pv, parity) \ - do { \ - const GLubyte flags = cullmask[i]; \ - GLuint e2,e1; \ - \ - if (!(flags & PRIM_NOT_CULLED)) \ - continue; \ - \ - e2=i2, e1=i1; \ - if (parity) { e2=i1; e1=i2; } \ - \ - RVB_COLOR(pv); \ - if (flags & PRIM_ANY_CLIP) { \ - fxSafeClippedTriangle3(VB,gWin,cliptri,e2,e1,i); \ - } else { \ - FX_grDrawTriangle((GrVertex *)gWin[e2].f, \ - (GrVertex *)gWin[e1].f, \ - (GrVertex *)gWin[i].f); \ - } \ - } while (0) - - -#define RENDER_QUAD(i3, i2, i1, i, pv) \ - do { \ - const GLubyte flags = cullmask[i]; \ - \ - if (!(flags & PRIM_NOT_CULLED)) \ - continue; \ - \ - RVB_COLOR(pv); \ - if (flags&PRIM_ANY_CLIP) { \ - fxSafeClippedTriangle3(VB,gWin,cliptri,i3,i2,i); \ - fxSafeClippedTriangle3(VB,gWin,cliptri,i2,i1,i); \ - } else { \ - FX_grDrawTriangle((GrVertex *)gWin[i3].f, \ - (GrVertex *)gWin[i2].f, \ - (GrVertex *)gWin[i].f); \ - FX_grDrawTriangle((GrVertex *)gWin[i2].f, \ - (GrVertex *)gWin[i1].f, \ - (GrVertex *)gWin[i].f); \ - } \ - } while (0) - - - - - -#define LOCAL_VARS \ - fxMesaContext fxMesa=(fxMesaContext)VB->ctx->DriverCtx; \ - fxVertex *gWin = FX_DRIVER_DATA(VB)->verts; \ - const GLubyte *cullmask = VB->CullMask; \ - tfxTriClipFunc cliptri = fxMesa->clip_tri_stride; - - - - -#define INIT(x) (void) cliptri; (void) fxMesa; - -#define TAG(x) x##_fx_smooth_culled -#undef RVB_COLOR -#define RVB_COLOR(x) -#define PRESERVE_VB_DEFS -#include "render_tmp.h" - -#define TAG(x) x##_fx_flat_culled -#undef RVB_COLOR -#define RVB_COLOR(pv) FX_VB_COLOR(fxMesa, VB->ColorPtr->data[pv]) - -#include "render_tmp.h" - - - - -/* Direct, with the possibility of clipping. - */ -#define RENDER_POINTS( start, count ) \ - do { \ - fxVertex *gWin = FX_DRIVER_DATA(VB)->verts; \ - GLubyte *clipmask = VB->ClipMask; \ - GLuint i; \ - for (i = start ; i <= count ; i++) \ - if (clipmask[i] == 0) { \ - RVB_COLOR(i); \ - FX_grDrawPoint( (GrVertex *)gWin[i].f );\ - } \ - } while (0) - -#define RENDER_LINE( i1, i ) \ - do { \ - RVB_COLOR(i); \ - fxSafeClippedLine( VB, i1, i ); \ - } while (0) - -#define RENDER_TRI( i2, i1, i, pv, parity) \ - do { \ - GLuint e2=i2, e1=i1; \ - if (parity) { GLuint t=e2; e2=e1; e1=t; } \ - RVB_COLOR(pv); \ - fxSafeClippedTriangle(VB,gWin,cliptri,e2,e1,i); \ - } while (0) - -#define RENDER_QUAD( i3, i2, i1, i, pv) \ - do { \ - RVB_COLOR(pv); \ - fxSafeClippedTriangle(VB,gWin,cliptri,i3,i2,i); \ - fxSafeClippedTriangle(VB,gWin,cliptri,i2,i1,i); \ - } while (0) - -#define LOCAL_VARS \ - fxMesaContext fxMesa=(fxMesaContext)VB->ctx->DriverCtx; \ - fxVertex *gWin = FX_DRIVER_DATA(VB)->verts; \ - tfxTriClipFunc cliptri = fxMesa->clip_tri_stride; - -#define INIT(x) (void) cliptri; (void) gWin; - -#define TAG(x) x##_fx_smooth_clipped -#undef RVB_COLOR -#define RVB_COLOR(x) -#define PRESERVE_VB_DEFS -#include "render_tmp.h" - - -#define TAG(x) x##_fx_flat_clipped -#undef RVB_COLOR -#define RVB_COLOR(pv) FX_VB_COLOR(fxMesa, VB->ColorPtr->data[pv]) -#include "render_tmp.h" - - - - - - -/* Indirect, with the possibility of clipping. - */ -#define RENDER_POINTS( start, count ) \ - do { \ - fxVertex *gWin = FX_DRIVER_DATA(VB)->verts; \ - GLuint e; \ - GLubyte *clipmask = VB->ClipMask; \ - for(e=start;e<=count;e++) \ - if(clipmask[elt[e]]==0) { \ - FX_grDrawPoint((GrVertex *)gWin[elt[e]].f); \ - } \ - } while (0) - -#define RENDER_LINE( i1, i ) \ - do { \ - GLuint e1 = elt[i1], e = elt[i]; \ - RVB_COLOR(e); \ - fxSafeClippedLine( VB, e1, e ); \ - } while (0) - -#define RENDER_TRI( i2, i1, i, pv, parity) \ - do { \ - GLuint e2 = elt[i2], e1 = elt[i1], e = elt[i]; \ - if (parity) { GLuint t=e2; e2=e1; e1=t; } \ - fxSafeClippedTriangle(VB,gWin,cliptri,e2,e1,e); \ - } while (0) - -#define RENDER_QUAD( i3, i2, i1, i, pv) \ - do { \ - GLuint e3 = elt[i3], e2 = elt[i2], e1 = elt[i1], e = elt[i];\ - fxSafeClippedTriangle(VB,gWin,cliptri,e3,e2,e); \ - fxSafeClippedTriangle(VB,gWin,cliptri,e2,e1,e); \ - } while (0) - -#define LOCAL_VARS const GLuint *elt = VB->EltPtr->data; \ - fxMesaContext fxMesa = (fxMesaContext)VB->ctx->DriverCtx; \ - fxVertex *gWin = FX_DRIVER_DATA(VB)->verts; \ - tfxTriClipFunc cliptri = fxMesa->clip_tri_stride; - -#define INIT(x) (void) cliptri; (void) gWin; - -#define TAG(x) x##_fx_smooth_indirect_clipped -#undef RVB_COLOR -#define RVB_COLOR(x) -#include "render_tmp.h" - - -/* Indirect, clipped, but no user clip. - */ -#define RENDER_POINTS( start, count ) \ - do { \ - fxVertex *gWin = FX_DRIVER_DATA(VB)->verts; \ - GLuint e; \ - GLubyte *clipmask = VB->ClipMask; \ - for(e=start;e<=count;e++) \ - if(clipmask[elt[e]]==0) { \ - FX_grDrawPoint((GrVertex *)gWin[elt[e]].f); \ - } \ - } while (0) - -#define RENDER_LINE( i1, i ) \ - do { \ - GLuint e1 = elt[i1], e = elt[i]; \ - RVB_COLOR(e); \ - fxSafeClippedLine( VB, e1, e ); \ - } while (0) - -#define RENDER_TRI( i2, i1, i, pv, parity) \ - do { \ - GLuint e2 = elt[i2], e1 = elt[i1], e = elt[i]; \ - if (parity) { GLuint t=e2; e2=e1; e1=t; } \ - fxSafeClippedTriangle2(VB,gWin,cliptri,e2,e1,e); \ - } while (0) - -#define RENDER_QUAD( i3, i2, i1, i, pv) \ - do { \ - GLuint e3 = elt[i3], e2 = elt[i2], e1 = elt[i1], e = elt[i];\ - fxSafeClippedTriangle2(VB,gWin,cliptri,e3,e2,e); \ - fxSafeClippedTriangle2(VB,gWin,cliptri,e2,e1,e); \ - } while (0) - -#define LOCAL_VARS const GLuint *elt = VB->EltPtr->data; \ - fxMesaContext fxMesa = (fxMesaContext)VB->ctx->DriverCtx; \ - fxVertex *gWin = FX_DRIVER_DATA(VB)->verts; \ - tfxTriViewClipFunc cliptri = fxMesa->view_clip_tri; - -#define INIT(x) (void) cliptri; (void) gWin; - -#define TAG(x) x##_fx_smooth_indirect_view_clipped -#undef RVB_COLOR -#define RVB_COLOR(x) -#include "render_tmp.h" - - - - - - - -/* Indirect, and no clipping required. - */ -#define RENDER_POINTS( start, count ) \ - do { \ - GLuint e; \ - for(e=start;e<=count;e++) { \ - FX_grDrawPoint((GrVertex *)gWin[elt[e]].f); \ - } \ - } while (0) - -#define RENDER_LINE( i1, i ) \ - do { \ - GLuint e1 = elt[i1], e = elt[i]; \ - FX_grDrawLine((GrVertex *)gWin[e1].f, (GrVertex *)gWin[e].f); \ - } while (0) - - -#define RENDER_TRI( i2, i1, i, pv, parity) \ - do { \ - GLuint e2 = elt[i2], e1 = elt[i1], e = elt[i]; \ - if (parity) {GLuint tmp = e2; e2 = e1; e1 = tmp;} \ - FX_grDrawTriangle((GrVertex *)gWin[e2].f, \ - (GrVertex *)gWin[e1].f, \ - (GrVertex *)gWin[e].f); \ - } while (0) - - -#define RENDER_QUAD( i3, i2, i1, i, pv) \ - do { \ - GLuint e3 = elt[i3], e2 = elt[i2], e1 = elt[i1], e = elt[i];\ - FX_grDrawTriangle((GrVertex *)gWin[e3].f, \ - (GrVertex *)gWin[e2].f, \ - (GrVertex *)gWin[e].f); \ - FX_grDrawTriangle((GrVertex *)gWin[e2].f, \ - (GrVertex *)gWin[e1].f, \ - (GrVertex *)gWin[e].f); \ - } while (0) - -#define LOCAL_VARS \ - fxVertex *gWin = FX_DRIVER_DATA(VB)->verts; \ - const GLuint *elt = VB->EltPtr->data; - -#define INIT(x) - -#define TAG(x) x##_fx_smooth_indirect -#undef RVB_COLOR -#define RVB_COLOR(x) -#include "render_tmp.h" - - - - - -/* Direct in this context means that triangles, lines, points can be - * rendered simply by calling grDrawTriangle, etc., without any - * additional setup (such as calling grConstantColor). We also use a - * 'safe' set of clipping routines which don't require write-access to - * the arrays in the vertex buffer, and don't care about array - * stride. - * - * Thus there is no call to gl_import_arrays() in this function. - * - * This safe clipping should be generalized to call driver->trianglefunc - * under the appropriate conditions. - * - * We don't handle texcoord-4 in the safe clip routines - maybe we should. - * - */ -void fxDDRenderElementsDirect( struct vertex_buffer *VB ) -{ - GLcontext *ctx = VB->ctx; - struct vertex_buffer *saved_vb = ctx->VB; - GLenum prim = ctx->CVA.elt_mode; - GLuint nr = VB->EltPtr->count; - render_func func = render_tab_fx_smooth_indirect[prim]; - fxMesaContext fxMesa=(fxMesaContext)ctx->DriverCtx; - GLuint p = 0; - - if (!nr) - return; - - if (fxMesa->new_state) - fxSetupFXUnits(ctx); - - if (!nr) return; - - if (VB->ClipOrMask) { - func = render_tab_fx_smooth_indirect_view_clipped[prim]; - if (VB->ClipOrMask & CLIP_USER_BIT) - func = render_tab_fx_smooth_indirect_clipped[prim]; - } - - ctx->VB = VB; /* kludge */ - - do { - func( VB, 0, nr, 0 ); - } while (ctx->Driver.MultipassFunc && - ctx->Driver.MultipassFunc( VB, ++p )); - - - ctx->VB = saved_vb; -} - - -void fxDDRenderVBIndirectDirect( struct vertex_buffer *VB ) -{ - GLcontext *ctx = VB->ctx; - struct vertex_buffer *cvaVB = ctx->CVA.VB; - struct vertex_buffer *saved_vb = ctx->VB; - GLuint i, next, count = VB->Count; - render_func *tab = render_tab_fx_smooth_indirect; - fxMesaContext fxMesa=(fxMesaContext)ctx->DriverCtx; - GLuint p = 0; - - if (cvaVB->ClipOrMask) - tab = render_tab_fx_smooth_indirect_clipped; - - if (!VB->CullDone) - gl_fast_copy_vb( VB ); - - if (fxMesa->new_state) - fxSetupFXUnits( ctx ); - - ctx->VB = cvaVB; - cvaVB->EltPtr = VB->EltPtr; - - do { - GLuint parity = VB->Parity; - - for (i = VB->CopyStart ; i < count ; parity = 0, i = next) - { - GLuint prim = VB->Primitive[i]; - next = VB->NextPrimitive[i]; - tab[prim]( cvaVB, i, next, parity ); - } - /* loop never taken */ - } while (ctx->Driver.MultipassFunc && - ctx->Driver.MultipassFunc( cvaVB, ++p )); - - cvaVB->EltPtr = 0; - ctx->VB = saved_vb; -} - - -static render_func *fxDDRenderVBSmooth_tables[3] = { - render_tab_fx_smooth_clipped, - render_tab_fx_smooth_culled, - render_tab_fx_smooth_raw -}; - -static render_func *fxDDRenderVBFlat_tables[3] = { - render_tab_fx_flat_clipped, - render_tab_fx_flat_culled, - render_tab_fx_flat_raw -}; - - -static render_func *null_tables[3] = { - 0, - 0, - 0 -}; - -#if defined(FX_GLIDE3) -#include "fxstripdet.c" -#endif - -void fxDDRenderInit( GLcontext *ctx ) -{ - render_init_fx_smooth_indirect_view_clipped(); - render_init_fx_smooth_indirect_clipped(); - render_init_fx_smooth_indirect(); - render_init_fx_smooth_raw(); - render_init_fx_smooth_culled(); - render_init_fx_smooth_clipped(); - render_init_fx_flat_raw(); - render_init_fx_flat_culled(); - render_init_fx_flat_clipped(); -#if defined(FX_GLIDE3) - fxDDRenderInitGlide3(ctx); -#endif -} - - -/* Now used to set an internal var in fxMesa - we hook out at the - * level of gl_render_vb() instead. - */ -render_func **fxDDChooseRenderVBTables(GLcontext *ctx) -{ - fxMesaContext fxMesa=(fxMesaContext)ctx->DriverCtx; - - if (ctx->IndirectTriangles & DD_SW_SETUP) - return null_tables; - - switch (fxMesa->render_index) { -/* case FX_FLAT: */ -/* return fxDDRenderVBFlat_tables; */ - case 0: - return fxDDRenderVBSmooth_tables; - default: - return null_tables; - } -} - - -void fxDDDoRenderVB( struct vertex_buffer *VB ) -{ - GLcontext *ctx = VB->ctx; - fxMesaContext fxMesa=(fxMesaContext)ctx->DriverCtx; - GLuint i, next, prim; - GLuint parity = VB->Parity; - render_func *tab; - GLuint count = VB->Count; - GLint p = 0; - - if (fxMesa->new_state) - fxSetupFXUnits(ctx); - - if (VB->Indirect) { - return; - } else if (VB->CullMode & CLIP_MASK_ACTIVE) { - tab = fxMesa->RenderVBClippedTab; - } else { - tab = fxMesa->RenderVBRawTab; - } - - if (!VB->CullDone) - gl_fast_copy_vb( VB ); - - do - { - for ( i= VB->CopyStart ; i < count ; parity = 0, i = next ) - { - prim = VB->Primitive[i]; - next = VB->NextPrimitive[i]; - tab[prim]( VB, i, next, parity ); - } - - } while (ctx->Driver.MultipassFunc && - ctx->Driver.MultipassFunc( VB, ++p )); -} - - -#else - - -/* - * Need this to provide at least one external definition. - */ - -int gl_fx_dummy_function_render(void) -{ - return 0; -} - -#endif /* FX */ Index: xc/extras/Mesa/src/FX/fxsanity.c diff -u xc/extras/Mesa/src/FX/fxsanity.c:1.3 xc/extras/Mesa/src/FX/fxsanity.c:removed --- xc/extras/Mesa/src/FX/fxsanity.c:1.3 Tue Feb 15 02:13:08 2000 +++ xc/extras/Mesa/src/FX/fxsanity.c Mon Dec 18 14:21:52 2000 @@ -1,124 +0,0 @@ -/* -*- mode: C; tab-width:8; c-basic-offset:2 -*- */ - -/* - * Mesa 3-D graphics library - * Version: 3.3 - * - * Copyright (C) 1999-2000 Brian Paul All Rights Reserved. - * - * 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 - * BRIAN PAUL 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. - * - * - * Original Mesa / 3Dfx device driver (C) 1999 David Bucciarelli, by the - * terms stated above. - * - * Thank you for your contribution, David! - * - * Please make note of the above copyright/license statement. If you - * contributed code or bug fixes to this code under the previous (GNU - * Library) license and object to the new license, your code will be - * removed at your request. Please see the Mesa docs/COPYRIGHT file - * for more information. - * - * Additional Mesa/3Dfx driver developers: - * Daryll Strauss - * Keith Whitwell - * - * See fxapi.h for more revision/author details. - */ - - -#ifdef HAVE_CONFIG_H -#include "conf.h" -#endif - - - -#if defined(FX) -#include "fxdrv.h" - -/* I have found this quite useful in tracking down transformation & - * clipping bugs. If you get a random graphics card freeze, running - * your triangles through this will probably catch the problem. - */ - -#define WID 640 -#define HI 480 - -#undef grDrawTriangle - -void fx_sanity_triangle( GrVertex *v1, GrVertex *v2, GrVertex *v3 ) -{ - GLuint rv = 1, print = 0; - - GLfloat area = ((v1->x - v3->x) * (v2->y - v3->y) - - (v1->y - v3->y) * (v2->x - v3->x)); - - if (v1->x < 0 || v1->y < 0 || v1->x > WID || v1->y > HI || - v2->x < 0 || v2->y < 0 || v2->x > WID || v2->y > HI || - v3->x < 0 || v3->y < 0 || v3->x > WID || v3->y > HI) - { - fprintf(stderr,"not clipped/set up!!!!!\n"); - rv = 0; - print = 1; - } - - if (area > (WID*HI)) { - fprintf(stderr,"too big\n"); - rv = 0; - } - if (v1->oow == 0 || v2->oow == 0 || v3->oow == 0) { - fprintf(stderr,"zero oow\n"); - rv = 0; - } - if (0 && area == 0) { - fprintf(stderr,"zero area %p %p %p\n", v1,v2,v3); - rv =0; - } - - if (print) { - fprintf(stderr,"v1: %f %f %f %f col %.0f %.0f %.0f %.0f t0 %f %f %f t1 %f %f %f\n", - v1->x, v1->y, v1->ooz, v1->oow, - v1->r, v1->g, v1->b, v1->a, - v1->tmuvtx[0].sow, v1->tmuvtx[0].tow, v1->tmuvtx[0].oow, - v1->tmuvtx[1].sow, v1->tmuvtx[1].tow, v1->tmuvtx[1].oow); - fprintf(stderr,"v2: %f %f %f %f col %.0f %.0f %.0f %.0f t0 %f %f %f t1 %f %f %f\n", - v2->x, v2->y, v2->ooz, v2->oow, - v2->r, v2->g, v2->b, v2->a, - v2->tmuvtx[0].sow, v2->tmuvtx[0].tow, v2->tmuvtx[0].oow, - v2->tmuvtx[1].sow, v2->tmuvtx[1].tow, v2->tmuvtx[1].oow); - fprintf(stderr,"v3: %f %f %f %f col %.0f %.0f %.0f %.0f t0 %f %f %f t1 %f %f %f\n", - v3->x, v3->y, v3->ooz, v3->oow, - v3->r, v3->g, v3->b, v3->a, - v3->tmuvtx[0].sow, v3->tmuvtx[0].tow, v3->tmuvtx[0].oow, - v3->tmuvtx[1].sow, v3->tmuvtx[1].tow, v3->tmuvtx[1].oow); - } - - if (1) - FX_grDrawTriangle(v1,v2,v3); - else - fprintf(stderr, "\n\n\n"); -} - -#else - -void gl_fxsanity_dummy() -{ -} - -#endif Index: xc/extras/Mesa/src/FX/fxsdettmp.h diff -u xc/extras/Mesa/src/FX/fxsdettmp.h:1.2 xc/extras/Mesa/src/FX/fxsdettmp.h:removed --- xc/extras/Mesa/src/FX/fxsdettmp.h:1.2 Tue Feb 15 02:13:08 2000 +++ xc/extras/Mesa/src/FX/fxsdettmp.h Mon Dec 18 14:21:52 2000 @@ -1,161 +0,0 @@ -/* -*- mode: C; tab-width:8; c-basic-offset:2 -*- */ - -/* - * Mesa 3-D graphics library - * Version: 3.3 - * - * Copyright (C) 1999-2000 Brian Paul All Rights Reserved. - * - * 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 - * BRIAN PAUL 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. - * - * - * Original Mesa / 3Dfx device driver (C) 1999 David Bucciarelli, by the - * terms stated above. - * - * Thank you for your contribution, David! - * - * Please make note of the above copyright/license statement. If you - * contributed code or bug fixes to this code under the previous (GNU - * Library) license and object to the new license, your code will be - * removed at your request. Please see the Mesa docs/COPYRIGHT file - * for more information. - * - * Additional Mesa/3Dfx driver developers: - * Daryll Strauss - * Keith Whitwell - * - * See fxapi.h for more revision/author details. - */ - - -/* - * Notes: the folowing code works only if count is > start. - * Corrently we are looking for the pattern: - * v0,v1,v2 v2,v1,v3, v2,v3,v4.... - * - * For this: - * #define STRIP0 ((u1 == v1) && (u2 == v0)) - * #define STRIP1 ((u0 == v0) && (u2 == v1)) - * - */ - - -static void TAG(render_vb_triangles_smooth_indirect_sd) - ( struct vertex_buffer *VB, - GLuint start, - GLuint count, - GLuint parity) -{ - GLint u0,u1,u2; - GLint v0,v1,v2; - GLuint *elt = VB->EltPtr->data; - - int i; - LOCAL_VARS - - INIT(GL_TRIANGLES); - - elt = &elt[start-1]; - u0 = *(++elt); - u1 = *(++elt); - u2 = *(++elt); - i = start+3; - while (i < count) - { - v0 = *(++elt); - v1 = *(++elt); - v2 = *(++elt); - - if (CLIPPED(u0,u1,u2)) - { - if (!CULLED(u0,u1,u2)) SENDCLIPTRI(u0,u1,u2); - } - else - { - if (STRIP0(u,v)) - { - int is_strips = 1; - int parity = 0; - STRIPSLOCAL_VAR - - FLUSHTRI(); - STARTSTRIPS(u0,u1,u2); - while (is_strips && i < count) - { - SENDSTRIPS(v2); - - u0 = v0; u1 = v1; u2 = v2; i+= 3; - v0 = *(++elt); - v1 = *(++elt); - v2 = *(++elt); - - if (parity) { - is_strips = STRIP0(u,v); - parity = 0; - } else { - is_strips = STRIP1(u,v); - parity = 1; - } - } - FLUSHSTRIPS(); - - if (i >= count) - return; - } - else - { - SENDTRI(u0,u1,u2); - } - } - u0 = v0; u1 = v1; u2 = v2; i+= 3; - } - if (CLIPPED(u0,u1,u2)) - { - if (!CULLED(u0,u1,u2)) SENDCLIPTRI(u0,u1,u2); - } - else - { - SENDTRI(u0,u1,u2); - } - FLUSHTRI(); - -} - -#ifndef PRESERVE_VB_DEFS -#undef SENDTRI -#undef STRIP0 -#undef STRIP1 -#undef LOCAL_VARS -#undef STRIPSLOCAL_VAR -#undef INIT -#undef SENDTRI -#undef FLUSHTRI -#undef STARTSTRIPS -#undef SENDSTRIPS -#undef FLUSHSTRIPS -#undef CLIPPED -#undef CULLED -#undef SENDCLIPTRI -#endif - -#ifndef PRESERVE_TAG -#undef TAG -#endif - -#undef PRESERVE_VB_DEFS -#undef PRESERVE_TAG Index: xc/extras/Mesa/src/FX/fxsetup.c diff -u xc/extras/Mesa/src/FX/fxsetup.c:1.6 xc/extras/Mesa/src/FX/fxsetup.c:removed --- xc/extras/Mesa/src/FX/fxsetup.c:1.6 Tue Jun 20 01:08:18 2000 +++ xc/extras/Mesa/src/FX/fxsetup.c Mon Dec 18 14:21:52 2000 @@ -1,1903 +0,0 @@ -/* -*- mode: C; tab-width:8; c-basic-offset:2 -*- */ - -/* - * Mesa 3-D graphics library - * Version: 3.3 - * - * Copyright (C) 1999-2000 Brian Paul All Rights Reserved. - * - * 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 - * BRIAN PAUL 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. - * - * - * Original Mesa / 3Dfx device driver (C) 1999 David Bucciarelli, by the - * terms stated above. - * - * Thank you for your contribution, David! - * - * Please make note of the above copyright/license statement. If you - * contributed code or bug fixes to this code under the previous (GNU - * Library) license and object to the new license, your code will be - * removed at your request. Please see the Mesa docs/COPYRIGHT file - * for more information. - * - * Additional Mesa/3Dfx driver developers: - * Daryll Strauss - * Keith Whitwell - * - * See fxapi.h for more revision/author details. - */ - - -/* fxsetup.c - 3Dfx VooDoo rendering mode setup functions */ - - -#ifdef HAVE_CONFIG_H -#include "conf.h" -#endif - -#if defined(FX) - -#include "fxdrv.h" -#include "enums.h" - -static GLuint fxGetTexSetConfiguration(GLcontext *ctx, - struct gl_texture_object *tObj0, - struct gl_texture_object *tObj1); -static void fxSetupTextureSingleTMU_NoLock(GLcontext *ctx, GLuint textureset); -static void fxSetupDoubleTMU_NoLock(fxMesaContext fxMesa, - struct gl_texture_object *tObj0, - struct gl_texture_object *tObj1); -static void gl_print_fx_state_flags( const char *msg, GLuint flags); -static GLboolean fxMultipassTexture( struct vertex_buffer *, GLuint ); - - - -static void fxTexValidate(GLcontext *ctx, struct gl_texture_object *tObj) -{ - tfxTexInfo *ti=fxTMGetTexInfo(tObj); - GLint minl, maxl; - - if (MESA_VERBOSE&VERBOSE_DRIVER) { - fprintf(stderr,"fxmesa: fxTexValidate(...) Start\n"); - } - - if(ti->validated) { - if (MESA_VERBOSE&VERBOSE_DRIVER) { - fprintf(stderr,"fxmesa: fxTexValidate(...) End (validated=GL_TRUE)\n"); - } - return; - } - - ti->tObj=tObj; - minl=ti->minLevel=tObj->BaseLevel; - maxl=ti->maxLevel=MIN2(tObj->MaxLevel,tObj->Image[0]->MaxLog2); - - fxTexGetInfo(tObj->Image[minl]->Width, tObj->Image[minl]->Height, - &(FX_largeLodLog2(ti->info)), &(FX_aspectRatioLog2(ti->info)), - &(ti->sScale), &(ti->tScale), - &(ti->int_sScale), &(ti->int_tScale), - NULL, NULL); - - if((tObj->MinFilter!=GL_NEAREST) && (tObj->MinFilter!=GL_LINEAR)) - fxTexGetInfo(tObj->Image[maxl]->Width,tObj->Image[maxl]->Height, - &(FX_smallLodLog2(ti->info)),NULL, - NULL,NULL, - NULL,NULL, - NULL,NULL); - else - FX_smallLodLog2(ti->info)=FX_largeLodLog2(ti->info); - - fxTexGetFormat(tObj->Image[minl]->IntFormat,&(ti->info.format),&(ti->baseLevelInternalFormat)); - - switch (tObj->WrapS) { - case GL_CLAMP_TO_EDGE: - /* What's this really mean compared to GL_CLAMP? */ - case GL_CLAMP: - ti->sClamp=1; - break; - case GL_REPEAT: - ti->sClamp=0; - break; - default: - ; /* silence compiler warning */ - } - switch (tObj->WrapT) { - case GL_CLAMP_TO_EDGE: - /* What's this really mean compared to GL_CLAMP? */ - case GL_CLAMP: - ti->tClamp=1; - break; - case GL_REPEAT: - ti->tClamp=0; - break; - default: - ; /* silence compiler warning */ - } - - ti->validated=GL_TRUE; - - ti->info.data=NULL; - - if (MESA_VERBOSE&VERBOSE_DRIVER) { - fprintf(stderr,"fxmesa: fxTexValidate(...) End\n"); - } -} - -static void fxPrintUnitsMode( const char *msg, GLuint mode ) -{ - fprintf(stderr, - "%s: (0x%x) %s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s\n", - msg, - mode, - (mode & FX_UM_E0_REPLACE) ? "E0_REPLACE, " : "", - (mode & FX_UM_E0_MODULATE) ? "E0_MODULATE, " : "", - (mode & FX_UM_E0_DECAL) ? "E0_DECAL, " : "", - (mode & FX_UM_E0_BLEND) ? "E0_BLEND, " : "", - (mode & FX_UM_E1_REPLACE) ? "E1_REPLACE, " : "", - (mode & FX_UM_E1_MODULATE) ? "E1_MODULATE, " : "", - (mode & FX_UM_E1_DECAL) ? "E1_DECAL, " : "", - (mode & FX_UM_E1_BLEND) ? "E1_BLEND, " : "", - (mode & FX_UM_E0_ALPHA) ? "E0_ALPHA, " : "", - (mode & FX_UM_E0_LUMINANCE) ? "E0_LUMINANCE, " : "", - (mode & FX_UM_E0_LUMINANCE_ALPHA) ? "E0_LUMINANCE_ALPHA, " : "", - (mode & FX_UM_E0_INTENSITY) ? "E0_INTENSITY, " : "", - (mode & FX_UM_E0_RGB) ? "E0_RGB, " : "", - (mode & FX_UM_E0_RGBA) ? "E0_RGBA, " : "", - (mode & FX_UM_E1_ALPHA) ? "E1_ALPHA, " : "", - (mode & FX_UM_E1_LUMINANCE) ? "E1_LUMINANCE, " : "", - (mode & FX_UM_E1_LUMINANCE_ALPHA) ? "E1_LUMINANCE_ALPHA, " : "", - (mode & FX_UM_E1_INTENSITY) ? "E1_INTENSITY, " : "", - (mode & FX_UM_E1_RGB) ? "E1_RGB, " : "", - (mode & FX_UM_E1_RGBA) ? "E1_RGBA, " : "", - (mode & FX_UM_COLOR_ITERATED) ? "COLOR_ITERATED, " : "", - (mode & FX_UM_COLOR_CONSTANT) ? "COLOR_CONSTANT, " : "", - (mode & FX_UM_ALPHA_ITERATED) ? "ALPHA_ITERATED, " : "", - (mode & FX_UM_ALPHA_CONSTANT) ? "ALPHA_CONSTANT, " : ""); -} - -static GLuint fxGetTexSetConfiguration(GLcontext *ctx, - struct gl_texture_object *tObj0, - struct gl_texture_object *tObj1) -{ - GLuint unitsmode=0; - GLuint envmode=0; - GLuint ifmt=0; - - if((ctx->Light.ShadeModel==GL_SMOOTH) || 1 || - (ctx->Point.SmoothFlag) || - (ctx->Line.SmoothFlag) || - (ctx->Polygon.SmoothFlag)) - unitsmode|=FX_UM_ALPHA_ITERATED; - else - unitsmode|=FX_UM_ALPHA_CONSTANT; - - if(ctx->Light.ShadeModel==GL_SMOOTH || 1) - unitsmode|=FX_UM_COLOR_ITERATED; - else - unitsmode|=FX_UM_COLOR_CONSTANT; - - - - /* - OpenGL Feeds Texture 0 into Texture 1 - Glide Feeds Texture 1 into Texture 0 - */ - if(tObj0) { - tfxTexInfo *ti0=fxTMGetTexInfo(tObj0); - - switch(ti0->baseLevelInternalFormat) { - case GL_ALPHA: - ifmt|=FX_UM_E0_ALPHA; - break; - case GL_LUMINANCE: - ifmt|=FX_UM_E0_LUMINANCE; - break; - case GL_LUMINANCE_ALPHA: - ifmt|=FX_UM_E0_LUMINANCE_ALPHA; - break; - case GL_INTENSITY: - ifmt|=FX_UM_E0_INTENSITY; - break; - case GL_RGB: - ifmt|=FX_UM_E0_RGB; - break; - case GL_RGBA: - ifmt|=FX_UM_E0_RGBA; - break; - } - - switch(ctx->Texture.Unit[0].EnvMode) { - case GL_DECAL: - envmode|=FX_UM_E0_DECAL; - break; - case GL_MODULATE: - envmode|=FX_UM_E0_MODULATE; - break; - case GL_REPLACE: - envmode|=FX_UM_E0_REPLACE; - break; - case GL_BLEND: - envmode|=FX_UM_E0_BLEND; - break; - case GL_ADD: - envmode|=FX_UM_E0_ADD; - break; - default: - /* do nothing */ - break; - } - } - - if(tObj1) { - tfxTexInfo *ti1=fxTMGetTexInfo(tObj1); - - switch(ti1->baseLevelInternalFormat) { - case GL_ALPHA: - ifmt|=FX_UM_E1_ALPHA; - break; - case GL_LUMINANCE: - ifmt|=FX_UM_E1_LUMINANCE; - break; - case GL_LUMINANCE_ALPHA: - ifmt|=FX_UM_E1_LUMINANCE_ALPHA; - break; - case GL_INTENSITY: - ifmt|=FX_UM_E1_INTENSITY; - break; - case GL_RGB: - ifmt|=FX_UM_E1_RGB; - break; - case GL_RGBA: - ifmt|=FX_UM_E1_RGBA; - break; - default: - /* do nothing */ - break; - } - - switch(ctx->Texture.Unit[1].EnvMode) { - case GL_DECAL: - envmode|=FX_UM_E1_DECAL; - break; - case GL_MODULATE: - envmode|=FX_UM_E1_MODULATE; - break; - case GL_REPLACE: - envmode|=FX_UM_E1_REPLACE; - break; - case GL_BLEND: - envmode|=FX_UM_E1_BLEND; - break; - case GL_ADD: - envmode|=FX_UM_E1_ADD; - break; - default: - /* do nothing */ - break; - } - } - - unitsmode|=(ifmt | envmode); - - if (MESA_VERBOSE & (VERBOSE_DRIVER|VERBOSE_TEXTURE)) - fxPrintUnitsMode("unitsmode", unitsmode); - - return unitsmode; -} - -/************************************************************************/ -/************************* Rendering Mode SetUp *************************/ -/************************************************************************/ - -/************************* Single Texture Set ***************************/ - -static void fxSetupSingleTMU_NoLock(fxMesaContext fxMesa, struct gl_texture_object *tObj) -{ - tfxTexInfo *ti=fxTMGetTexInfo(tObj); - int tmu; - - /* Make sure we're not loaded incorrectly */ - if (ti->isInTM) { - if (ti->LODblend) { - if (ti->whichTMU!=FX_TMU_SPLIT) - fxTMMoveOutTM(fxMesa, tObj); - } else { - if (ti->whichTMU==FX_TMU_SPLIT) - fxTMMoveOutTM(fxMesa, tObj); - } - } - - /* Make sure we're loaded correctly */ - if (!ti->isInTM) { - if (ti->LODblend) - fxTMMoveInTM_NoLock(fxMesa,tObj,FX_TMU_SPLIT); - else { - if (fxMesa->haveTwoTMUs) { - if (fxMesa->freeTexMem[FX_TMU0] > - FX_grTexTextureMemRequired_NoLock(GR_MIPMAPLEVELMASK_BOTH, - &(ti->info))) { - fxTMMoveInTM_NoLock(fxMesa,tObj, FX_TMU0); - } else { - fxTMMoveInTM_NoLock(fxMesa,tObj, FX_TMU1); - } - } else - fxTMMoveInTM_NoLock(fxMesa,tObj,FX_TMU0); - } - } - - if (ti->LODblend && ti->whichTMU == FX_TMU_SPLIT) { - if ((ti->info.format==GR_TEXFMT_P_8) && (!fxMesa->haveGlobalPaletteTexture)) { - if (MESA_VERBOSE&VERBOSE_DRIVER) { - fprintf(stderr,"fxmesa: uploading texture palette\n"); - } - FX_grTexDownloadTable_NoLock(GR_TMU0,GR_TEXTABLE_PALETTE,&(ti->palette)); - FX_grTexDownloadTable_NoLock(GR_TMU1,GR_TEXTABLE_PALETTE,&(ti->palette)); - } - - FX_grTexClampMode_NoLock(GR_TMU0,ti->sClamp,ti->tClamp); - FX_grTexClampMode_NoLock(GR_TMU1,ti->sClamp,ti->tClamp); - FX_grTexFilterMode_NoLock(GR_TMU0,ti->minFilt,ti->maxFilt); - FX_grTexFilterMode_NoLock(GR_TMU1,ti->minFilt,ti->maxFilt); - FX_grTexMipMapMode_NoLock(GR_TMU0,ti->mmMode,ti->LODblend); - FX_grTexMipMapMode_NoLock(GR_TMU1,ti->mmMode,ti->LODblend); - - FX_grTexSource_NoLock(GR_TMU0,ti->tm[FX_TMU0]->startAddr, - GR_MIPMAPLEVELMASK_ODD,&(ti->info)); - FX_grTexSource_NoLock(GR_TMU1,ti->tm[FX_TMU1]->startAddr, - GR_MIPMAPLEVELMASK_EVEN,&(ti->info)); - } else { - if (ti->whichTMU==FX_TMU_BOTH) tmu=FX_TMU0; - else tmu=ti->whichTMU; - - if((ti->info.format==GR_TEXFMT_P_8) && (!fxMesa->haveGlobalPaletteTexture)) { - if (MESA_VERBOSE&VERBOSE_DRIVER) { - fprintf(stderr,"fxmesa: uploading texture palette\n"); - } - FX_grTexDownloadTable_NoLock(tmu, GR_TEXTABLE_PALETTE, &(ti->palette)); - } - - /* KW: The alternative is to do the download to the other tmu. If - * we get to this point, I think it means we are thrashing the - * texture memory, so perhaps it's not a good idea. - */ - if (ti->LODblend && (MESA_VERBOSE&VERBOSE_DRIVER)) - fprintf(stderr, "fxmesa: not blending texture - only on one tmu\n"); - - FX_grTexClampMode_NoLock(tmu, ti->sClamp, ti->tClamp); - FX_grTexFilterMode_NoLock(tmu, ti->minFilt, ti->maxFilt); - FX_grTexMipMapMode_NoLock(tmu, ti->mmMode, FXFALSE); - - FX_grTexSource_NoLock(tmu, ti->tm[tmu]->startAddr, - GR_MIPMAPLEVELMASK_BOTH, &(ti->info)); - } -} - -static void fxSelectSingleTMUSrc_NoLock(fxMesaContext fxMesa, GLint tmu, - FxBool LODblend) -{ - if (MESA_VERBOSE&VERBOSE_DRIVER) { - fprintf(stderr,"fxmesa: fxSelectSingleTMUSrc(%d,%d)\n",tmu,LODblend); - } - - if (LODblend) { - FX_grTexCombine_NoLock(GR_TMU0, - GR_COMBINE_FUNCTION_BLEND, - GR_COMBINE_FACTOR_ONE_MINUS_LOD_FRACTION, - GR_COMBINE_FUNCTION_BLEND, - GR_COMBINE_FACTOR_ONE_MINUS_LOD_FRACTION, - FXFALSE,FXFALSE); - - if (fxMesa->haveTwoTMUs) - FX_grTexCombine_NoLock(GR_TMU1, - GR_COMBINE_FUNCTION_LOCAL,GR_COMBINE_FACTOR_NONE, - GR_COMBINE_FUNCTION_LOCAL,GR_COMBINE_FACTOR_NONE, - FXFALSE,FXFALSE); - fxMesa->tmuSrc=FX_TMU_SPLIT; - } - else { - if (tmu!=FX_TMU1) { - FX_grTexCombine_NoLock(GR_TMU0, - GR_COMBINE_FUNCTION_LOCAL,GR_COMBINE_FACTOR_NONE, - GR_COMBINE_FUNCTION_LOCAL,GR_COMBINE_FACTOR_NONE, - FXFALSE,FXFALSE); - if (fxMesa->haveTwoTMUs) { - FX_grTexCombine_NoLock(GR_TMU1, - GR_COMBINE_FUNCTION_ZERO, GR_COMBINE_FACTOR_NONE, - GR_COMBINE_FUNCTION_ZERO, GR_COMBINE_FACTOR_NONE, - FXFALSE,FXFALSE); - } - fxMesa->tmuSrc=FX_TMU0; - } - else { - FX_grTexCombine_NoLock(GR_TMU1, - GR_COMBINE_FUNCTION_LOCAL,GR_COMBINE_FACTOR_NONE, - GR_COMBINE_FUNCTION_LOCAL,GR_COMBINE_FACTOR_NONE, - FXFALSE,FXFALSE); - - /* GR_COMBINE_FUNCTION_SCALE_OTHER doesn't work ?!? */ - - FX_grTexCombine_NoLock(GR_TMU0, - GR_COMBINE_FUNCTION_BLEND, - GR_COMBINE_FACTOR_ONE, - GR_COMBINE_FUNCTION_BLEND, - GR_COMBINE_FACTOR_ONE, - FXFALSE,FXFALSE); - - fxMesa->tmuSrc=FX_TMU1; - } - } -} - -static void fxSetupTextureSingleTMU_NoLock(GLcontext *ctx, GLuint textureset) -{ - fxMesaContext fxMesa=(fxMesaContext)ctx->DriverCtx; - GrCombineLocal_t localc,locala; - GLuint unitsmode; - GLint ifmt; - tfxTexInfo *ti; - struct gl_texture_object *tObj=ctx->Texture.Unit[textureset].CurrentD[2]; - int tmu; - - if (MESA_VERBOSE&VERBOSE_DRIVER) { - fprintf(stderr,"fxmesa: fxSetupTextureSingleTMU(...) Start\n"); - } - - ti=fxTMGetTexInfo(tObj); - - fxTexValidate(ctx,tObj); - - fxSetupSingleTMU_NoLock(fxMesa,tObj); - - if (ti->whichTMU==FX_TMU_BOTH) tmu=FX_TMU0; - else tmu=ti->whichTMU; - if (fxMesa->tmuSrc!=tmu) - fxSelectSingleTMUSrc_NoLock(fxMesa, tmu, ti->LODblend); - - if(textureset==0 || !fxMesa->haveTwoTMUs) - unitsmode=fxGetTexSetConfiguration(ctx,tObj,NULL); - else - unitsmode=fxGetTexSetConfiguration(ctx,NULL,tObj); - - fxMesa->stw_hint_state = 0; - FX_grHints_NoLock(GR_HINT_STWHINT,0); - - ifmt=ti->baseLevelInternalFormat; - - if(unitsmode & FX_UM_ALPHA_ITERATED) - locala=GR_COMBINE_LOCAL_ITERATED; - else - locala=GR_COMBINE_LOCAL_CONSTANT; - - if(unitsmode & FX_UM_COLOR_ITERATED) - localc=GR_COMBINE_LOCAL_ITERATED; - else - localc=GR_COMBINE_LOCAL_CONSTANT; - - if (MESA_VERBOSE & (VERBOSE_DRIVER|VERBOSE_TEXTURE)) - fprintf(stderr, "fxMesa: fxSetupTextureSingleTMU, envmode is %s\n", - gl_lookup_enum_by_nr(ctx->Texture.Unit[textureset].EnvMode)); - - switch(ctx->Texture.Unit[textureset].EnvMode) { - case GL_DECAL: - FX_grAlphaCombine_NoLock(GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - locala, - GR_COMBINE_OTHER_NONE, - FXFALSE); - - FX_grColorCombine_NoLock(GR_COMBINE_FUNCTION_BLEND, - GR_COMBINE_FACTOR_TEXTURE_ALPHA, - localc, - GR_COMBINE_OTHER_TEXTURE, - FXFALSE); - break; - case GL_MODULATE: - FX_grAlphaCombine_NoLock(GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_LOCAL, - locala, - GR_COMBINE_OTHER_TEXTURE, - FXFALSE); - - if(ifmt==GL_ALPHA) - FX_grColorCombine_NoLock(GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - localc, - GR_COMBINE_OTHER_NONE, - FXFALSE); - else - FX_grColorCombine_NoLock(GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_LOCAL, - localc, - GR_COMBINE_OTHER_TEXTURE, - FXFALSE); - break; - case GL_BLEND: -#if 0 - FX_grAlphaCombine_NoLock(GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_LOCAL, - locala, - GR_COMBINE_OTHER_TEXTURE, - FXFALSE); - if (ifmt==GL_ALPHA) - FX_grColorCombine_NoLock(GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - localc, - GR_COMBINE_OTHER_NONE, - FXFALSE); - else - FX_grColorCombine_NoLock(GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL, - GR_COMBINE_FACTOR_LOCAL, - localc, - GR_COMBINE_OTHER_TEXTURE, - FXTRUE); - ctx->Driver.MultipassFunc = fxMultipassBlend; -#else - if (MESA_VERBOSE&VERBOSE_DRIVER) - fprintf(stderr,"fx Driver: GL_BLEND not yet supported\n"); -#endif - break; - case GL_REPLACE: - if((ifmt==GL_RGB) || (ifmt==GL_LUMINANCE)) - FX_grAlphaCombine_NoLock(GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - locala, - GR_COMBINE_OTHER_NONE, - FXFALSE); - else - FX_grAlphaCombine_NoLock(GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_ONE, - locala, - GR_COMBINE_OTHER_TEXTURE, - FXFALSE); - - if(ifmt==GL_ALPHA) - FX_grColorCombine_NoLock(GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - localc, - GR_COMBINE_OTHER_NONE, - FXFALSE); - else - FX_grColorCombine_NoLock(GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_ONE, - localc, - GR_COMBINE_OTHER_TEXTURE, - FXFALSE); - break; - default: - if (MESA_VERBOSE&VERBOSE_DRIVER) - fprintf(stderr, "fx Driver: %x Texture.EnvMode not yet supported\n", - ctx->Texture.Unit[textureset].EnvMode); - break; - } - - if (MESA_VERBOSE&VERBOSE_DRIVER) { - fprintf(stderr,"fxmesa: fxSetupTextureSingleTMU(...) End\n"); - } -} - -static void fxSetupTextureSingleTMU(GLcontext *ctx, GLuint textureset) -{ - BEGIN_BOARD_LOCK(); - fxSetupTextureSingleTMU_NoLock(ctx, textureset); - END_BOARD_LOCK(); -} - -/************************* Double Texture Set ***************************/ - -static void fxSetupDoubleTMU_NoLock(fxMesaContext fxMesa, - struct gl_texture_object *tObj0, - struct gl_texture_object *tObj1) -{ -#define T0_NOT_IN_TMU 0x01 -#define T1_NOT_IN_TMU 0x02 -#define T0_IN_TMU0 0x04 -#define T1_IN_TMU0 0x08 -#define T0_IN_TMU1 0x10 -#define T1_IN_TMU1 0x20 - - tfxTexInfo *ti0=fxTMGetTexInfo(tObj0); - tfxTexInfo *ti1=fxTMGetTexInfo(tObj1); - GLuint tstate=0; - int tmu0=0, tmu1=1; - - if (MESA_VERBOSE&VERBOSE_DRIVER) { - fprintf(stderr,"fxmesa: fxSetupDoubleTMU(...)\n"); - } - - /* We shouldn't need to do this. There is something wrong with - mutlitexturing when the TMUs are swapped. So, we're forcing - them to always be loaded correctly. !!! */ - if (ti0->whichTMU==FX_TMU1) - fxTMMoveOutTM_NoLock(fxMesa, tObj0); - if (ti1->whichTMU==FX_TMU0) - fxTMMoveOutTM_NoLock(fxMesa, tObj1); - - if (ti0->isInTM) { - switch (ti0->whichTMU) { - case FX_TMU0: - tstate|=T0_IN_TMU0; - break; - case FX_TMU1: - tstate|=T0_IN_TMU1; - break; - case FX_TMU_BOTH: - tstate|=T0_IN_TMU0|T0_IN_TMU1; - break; - case FX_TMU_SPLIT: - tstate|=T0_NOT_IN_TMU; - break; - } - } else tstate|=T0_NOT_IN_TMU; - - if (ti1->isInTM) { - switch (ti1->whichTMU) { - case FX_TMU0: - tstate|=T1_IN_TMU0; - break; - case FX_TMU1: - tstate|=T1_IN_TMU1; - break; - case FX_TMU_BOTH: - tstate|=T1_IN_TMU0|T1_IN_TMU1; - break; - case FX_TMU_SPLIT: - tstate|=T1_NOT_IN_TMU; - break; - } - } else tstate|=T1_NOT_IN_TMU; - - ti0->lastTimeUsed=fxMesa->texBindNumber; - ti1->lastTimeUsed=fxMesa->texBindNumber; - - /* Move texture maps into TMUs */ - - if (!(((tstate&T0_IN_TMU0) && (tstate&T1_IN_TMU1)) || - ((tstate&T0_IN_TMU1) && (tstate&T1_IN_TMU0)))) { - if (tObj0==tObj1) fxTMMoveInTM_NoLock(fxMesa, tObj1, FX_TMU_BOTH); - else { - /* Find the minimal way to correct the situation */ - if ((tstate&T0_IN_TMU0) || (tstate&T1_IN_TMU1)) { - /* We have one in the standard order, setup the other */ - if (tstate&T0_IN_TMU0) { /* T0 is in TMU0, put T1 in TMU1 */ - fxTMMoveInTM_NoLock(fxMesa, tObj1, FX_TMU1); - } else { - fxTMMoveInTM_NoLock(fxMesa, tObj0, FX_TMU0); - } - /* tmu0 and tmu1 are setup */ - } else if ((tstate&T0_IN_TMU1) || (tstate&T1_IN_TMU0)) { - /* we have one in the reverse order, setup the other */ - if (tstate&T1_IN_TMU0) { /* T1 is in TMU0, put T0 in TMU1 */ - fxTMMoveInTM_NoLock(fxMesa, tObj0, FX_TMU1); - } else { - fxTMMoveInTM_NoLock(fxMesa, tObj1, FX_TMU0); - } - tmu0=1; - tmu1=0; - } else { /* Nothing is loaded */ - fxTMMoveInTM_NoLock(fxMesa, tObj0, FX_TMU0); - fxTMMoveInTM_NoLock(fxMesa, tObj1, FX_TMU1); - /* tmu0 and tmu1 are setup */ - } - } - } - - if (!fxMesa->haveGlobalPaletteTexture) { - if (ti0->info.format==GR_TEXFMT_P_8) { - if (MESA_VERBOSE&VERBOSE_DRIVER) { - fprintf(stderr,"fxmesa: uploading texture palette TMU0\n"); - } - FX_grTexDownloadTable_NoLock(tmu0, GR_TEXTABLE_PALETTE, &(ti0->palette)); - } - - if (ti1->info.format==GR_TEXFMT_P_8) { - if (MESA_VERBOSE&VERBOSE_DRIVER) { - fprintf(stderr,"fxmesa: uploading texture palette TMU1\n"); - } - FX_grTexDownloadTable_NoLock(tmu1, GR_TEXTABLE_PALETTE, &(ti1->palette)); - } - } - - FX_grTexSource_NoLock(tmu0, ti0->tm[tmu0]->startAddr, - GR_MIPMAPLEVELMASK_BOTH, &(ti0->info)); - FX_grTexClampMode_NoLock(tmu0, ti0->sClamp, ti0->tClamp); - FX_grTexFilterMode_NoLock(tmu0, ti0->minFilt, ti0->maxFilt); - FX_grTexMipMapMode_NoLock(tmu0, ti0->mmMode, FXFALSE); - - FX_grTexSource_NoLock(tmu1, ti1->tm[tmu1]->startAddr, - GR_MIPMAPLEVELMASK_BOTH, &(ti1->info)); - FX_grTexClampMode_NoLock(tmu1, ti1->sClamp, ti1->tClamp); - FX_grTexFilterMode_NoLock(tmu1, ti1->minFilt, ti1->maxFilt); - FX_grTexMipMapMode_NoLock(tmu1, ti1->mmMode, FXFALSE); - -#undef T0_NOT_IN_TMU -#undef T1_NOT_IN_TMU -#undef T0_IN_TMU0 -#undef T1_IN_TMU0 -#undef T0_IN_TMU1 -#undef T1_IN_TMU1 -} - -static void fxSetupTextureDoubleTMU_NoLock(GLcontext *ctx) -{ - fxMesaContext fxMesa=(fxMesaContext)ctx->DriverCtx; - GrCombineLocal_t localc,locala; - tfxTexInfo *ti0,*ti1; - struct gl_texture_object *tObj0=ctx->Texture.Unit[0].CurrentD[2]; - struct gl_texture_object *tObj1=ctx->Texture.Unit[1].CurrentD[2]; - GLuint envmode,ifmt,unitsmode; - int tmu0=0, tmu1=1; - - if (MESA_VERBOSE&VERBOSE_DRIVER) { - fprintf(stderr,"fxmesa: fxSetupTextureDoubleTMU(...) Start\n"); - } - - ti0=fxTMGetTexInfo(tObj0); - fxTexValidate(ctx,tObj0); - - ti1=fxTMGetTexInfo(tObj1); - fxTexValidate(ctx,tObj1); - - fxSetupDoubleTMU_NoLock(fxMesa,tObj0,tObj1); - - unitsmode=fxGetTexSetConfiguration(ctx,tObj0,tObj1); - - fxMesa->stw_hint_state |= GR_STWHINT_ST_DIFF_TMU1; - FX_grHints_NoLock(GR_HINT_STWHINT, fxMesa->stw_hint_state); - - envmode=unitsmode & FX_UM_E_ENVMODE; - ifmt=unitsmode & FX_UM_E_IFMT; - - if(unitsmode & FX_UM_ALPHA_ITERATED) - locala=GR_COMBINE_LOCAL_ITERATED; - else - locala=GR_COMBINE_LOCAL_CONSTANT; - - if(unitsmode & FX_UM_COLOR_ITERATED) - localc=GR_COMBINE_LOCAL_ITERATED; - else - localc=GR_COMBINE_LOCAL_CONSTANT; - - - if (MESA_VERBOSE & (VERBOSE_DRIVER|VERBOSE_TEXTURE)) - fprintf(stderr, "fxMesa: fxSetupTextureDoubleTMU, envmode is %s/%s\n", - gl_lookup_enum_by_nr(ctx->Texture.Unit[0].EnvMode), - gl_lookup_enum_by_nr(ctx->Texture.Unit[1].EnvMode)); - - - if ((ti0->whichTMU==FX_TMU1) || (ti1->whichTMU==FX_TMU0)) { - tmu0=1; - tmu1=0; - } - fxMesa->tmuSrc=FX_TMU_BOTH; - switch(envmode) { - case (FX_UM_E0_MODULATE | FX_UM_E1_MODULATE): - { - GLboolean isalpha[FX_NUM_TMU]; - - if(ti0->baseLevelInternalFormat==GL_ALPHA) - isalpha[tmu0]=GL_TRUE; - else - isalpha[tmu0]=GL_FALSE; - - if(ti1->baseLevelInternalFormat==GL_ALPHA) - isalpha[tmu1]=GL_TRUE; - else - isalpha[tmu1]=GL_FALSE; - - if(isalpha[FX_TMU1]) - FX_grTexCombine_NoLock(GR_TMU1, - GR_COMBINE_FUNCTION_ZERO, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - FXTRUE,FXFALSE); - else - FX_grTexCombine_NoLock(GR_TMU1, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - FXFALSE,FXFALSE); - - if(isalpha[FX_TMU0]) - FX_grTexCombine_NoLock(GR_TMU0, - GR_COMBINE_FUNCTION_BLEND_OTHER, - GR_COMBINE_FACTOR_ONE, - GR_COMBINE_FUNCTION_BLEND_OTHER, - GR_COMBINE_FACTOR_LOCAL, - FXFALSE,FXFALSE); - else - FX_grTexCombine_NoLock(GR_TMU0, - GR_COMBINE_FUNCTION_BLEND_OTHER, - GR_COMBINE_FACTOR_LOCAL, - GR_COMBINE_FUNCTION_BLEND_OTHER, - GR_COMBINE_FACTOR_LOCAL, - FXFALSE,FXFALSE); - - FX_grColorCombine_NoLock(GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_LOCAL, - localc, - GR_COMBINE_OTHER_TEXTURE, - FXFALSE); - - FX_grAlphaCombine_NoLock(GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_LOCAL, - locala, - GR_COMBINE_OTHER_TEXTURE, - FXFALSE); - break; - } - case (FX_UM_E0_REPLACE | FX_UM_E1_BLEND): /* Only for GLQuake */ - if (tmu1==FX_TMU1) { - FX_grTexCombine_NoLock(GR_TMU1, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - FXTRUE,FXFALSE); - - FX_grTexCombine_NoLock(GR_TMU0, - GR_COMBINE_FUNCTION_BLEND_OTHER, - GR_COMBINE_FACTOR_LOCAL, - GR_COMBINE_FUNCTION_BLEND_OTHER, - GR_COMBINE_FACTOR_LOCAL, - FXFALSE,FXFALSE); - } else { - FX_grTexCombine_NoLock(GR_TMU1, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - FXFALSE,FXFALSE); - - FX_grTexCombine_NoLock(GR_TMU0, - GR_COMBINE_FUNCTION_BLEND_OTHER, - GR_COMBINE_FACTOR_ONE_MINUS_LOCAL, - GR_COMBINE_FUNCTION_BLEND_OTHER, - GR_COMBINE_FACTOR_ONE_MINUS_LOCAL, - FXFALSE,FXFALSE); - } - - FX_grAlphaCombine_NoLock(GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - locala, - GR_COMBINE_OTHER_NONE, - FXFALSE); - - FX_grColorCombine_NoLock(GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_ONE, - localc, - GR_COMBINE_OTHER_TEXTURE, - FXFALSE); - break; - case (FX_UM_E0_REPLACE | FX_UM_E1_MODULATE): /* Quake 2 and 3 */ - if (tmu1==FX_TMU1) { - FX_grTexCombine_NoLock(GR_TMU1, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_FUNCTION_ZERO, - GR_COMBINE_FACTOR_NONE, - FXFALSE,FXTRUE); - - FX_grTexCombine_NoLock(GR_TMU0, - GR_COMBINE_FUNCTION_BLEND_OTHER, - GR_COMBINE_FACTOR_LOCAL, - GR_COMBINE_FUNCTION_BLEND_OTHER, - GR_COMBINE_FACTOR_LOCAL, - FXFALSE,FXFALSE); - - } else { - FX_grTexCombine_NoLock(GR_TMU1, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - FXFALSE,FXFALSE); - - FX_grTexCombine_NoLock(GR_TMU0, - GR_COMBINE_FUNCTION_BLEND_OTHER, - GR_COMBINE_FACTOR_LOCAL, - GR_COMBINE_FUNCTION_BLEND_OTHER, - GR_COMBINE_FACTOR_ONE, - FXFALSE,FXFALSE); - } - - if(ti0->baseLevelInternalFormat==GL_RGB) - FX_grAlphaCombine_NoLock(GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - locala, - GR_COMBINE_OTHER_NONE, - FXFALSE); - else - FX_grAlphaCombine_NoLock(GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_ONE, - locala, - GR_COMBINE_OTHER_NONE, - FXFALSE); - - - FX_grColorCombine_NoLock(GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_ONE, - localc, - GR_COMBINE_OTHER_TEXTURE, - FXFALSE); - break; - - - case (FX_UM_E0_MODULATE | FX_UM_E1_ADD): /* Quake 3 Sky */ - { - GLboolean isalpha[FX_NUM_TMU]; - - if(ti0->baseLevelInternalFormat==GL_ALPHA) - isalpha[tmu0]=GL_TRUE; - else - isalpha[tmu0]=GL_FALSE; - - if(ti1->baseLevelInternalFormat==GL_ALPHA) - isalpha[tmu1]=GL_TRUE; - else - isalpha[tmu1]=GL_FALSE; - - if(isalpha[FX_TMU1]) - FX_grTexCombine_NoLock(GR_TMU1, - GR_COMBINE_FUNCTION_ZERO, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - FXTRUE,FXFALSE); - else - FX_grTexCombine_NoLock(GR_TMU1, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - FXFALSE,FXFALSE); - - if(isalpha[FX_TMU0]) - FX_grTexCombine_NoLock(GR_TMU0, - GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_ONE, - GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL, - GR_COMBINE_FACTOR_ONE, - FXFALSE,FXFALSE); - else - FX_grTexCombine_NoLock(GR_TMU0, - GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL, - GR_COMBINE_FACTOR_ONE, - GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL, - GR_COMBINE_FACTOR_ONE, - FXFALSE,FXFALSE); - - FX_grColorCombine_NoLock(GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_LOCAL, - localc, - GR_COMBINE_OTHER_TEXTURE, - FXFALSE); - - FX_grAlphaCombine_NoLock(GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_LOCAL, - locala, - GR_COMBINE_OTHER_TEXTURE, - FXFALSE); - break; - } - default: - fprintf(stderr, "Unexpected dual texture mode encountered\n"); - break; - } - - if (MESA_VERBOSE&VERBOSE_DRIVER) { - fprintf(stderr,"fxmesa: fxSetupTextureDoubleTMU(...) End\n"); - } -} - -/************************* No Texture ***************************/ - -static void fxSetupTextureNone_NoLock(GLcontext *ctx) -{ - fxMesaContext fxMesa=(fxMesaContext)ctx->DriverCtx; - GrCombineLocal_t localc,locala; - - if (MESA_VERBOSE&VERBOSE_DRIVER) { - fprintf(stderr,"fxmesa: fxSetupTextureNone(...)\n"); - } - - if((ctx->Light.ShadeModel==GL_SMOOTH) || 1 || - (ctx->Point.SmoothFlag) || - (ctx->Line.SmoothFlag) || - (ctx->Polygon.SmoothFlag)) - locala=GR_COMBINE_LOCAL_ITERATED; - else - locala=GR_COMBINE_LOCAL_CONSTANT; - - if(ctx->Light.ShadeModel==GL_SMOOTH || 1) - localc=GR_COMBINE_LOCAL_ITERATED; - else - localc=GR_COMBINE_LOCAL_CONSTANT; - - FX_grAlphaCombine_NoLock(GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - locala, - GR_COMBINE_OTHER_NONE, - FXFALSE); - - FX_grColorCombine_NoLock(GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - localc, - GR_COMBINE_OTHER_NONE, - FXFALSE); -} - -/************************************************************************/ -/************************** Texture Mode SetUp **************************/ -/************************************************************************/ - -static void fxSetupTexture_NoLock(GLcontext *ctx) -{ - fxMesaContext fxMesa=(fxMesaContext)ctx->DriverCtx; - GLuint tex2Denabled; - - if (MESA_VERBOSE&VERBOSE_DRIVER) { - fprintf(stderr,"fxmesa: fxSetupTexture(...)\n"); - } - - /* Disable multipass texturing. - */ - ctx->Driver.MultipassFunc = 0; - - /* Texture Combine, Color Combine and Alpha Combine. - */ - tex2Denabled = (ctx->Texture.ReallyEnabled & TEXTURE0_2D); - - if (fxMesa->emulateTwoTMUs) - tex2Denabled |= (ctx->Texture.ReallyEnabled & TEXTURE1_2D); - - switch(tex2Denabled) { - case TEXTURE0_2D: - fxSetupTextureSingleTMU_NoLock(ctx,0); - break; - case TEXTURE1_2D: - fxSetupTextureSingleTMU_NoLock(ctx,1); - break; - case (TEXTURE0_2D|TEXTURE1_2D): - if (fxMesa->haveTwoTMUs) - fxSetupTextureDoubleTMU_NoLock(ctx); - else { - if (MESA_VERBOSE&VERBOSE_DRIVER) - fprintf(stderr, "fxmesa: enabling fake multitexture\n"); - - fxSetupTextureSingleTMU_NoLock(ctx,0); - ctx->Driver.MultipassFunc = fxMultipassTexture; - } - break; - default: - fxSetupTextureNone_NoLock(ctx); - break; - } -} - -static void fxSetupTexture(GLcontext *ctx) -{ - BEGIN_BOARD_LOCK(); - fxSetupTexture_NoLock(ctx); - END_BOARD_LOCK(); -} - -/************************************************************************/ -/**************************** Blend SetUp *******************************/ -/************************************************************************/ - -/* XXX consider supporting GL_INGR_blend_func_separate */ -void fxDDBlendFunc(GLcontext *ctx, GLenum sfactor, GLenum dfactor) -{ - fxMesaContext fxMesa=(fxMesaContext)ctx->DriverCtx; - tfxUnitsState *us=&fxMesa->unitsState; - GrAlphaBlendFnc_t sfact,dfact,asfact,adfact; - - /* From the Glide documentation: - For alpha source and destination blend function factor - parameters, Voodoo Graphics supports only - GR_BLEND_ZERO and GR_BLEND_ONE. - */ - - switch(sfactor) { - case GL_ZERO: - asfact=sfact=GR_BLEND_ZERO; - break; - case GL_ONE: - asfact=sfact=GR_BLEND_ONE; - break; - case GL_DST_COLOR: - sfact=GR_BLEND_DST_COLOR; - asfact=GR_BLEND_ONE; - break; - case GL_ONE_MINUS_DST_COLOR: - sfact=GR_BLEND_ONE_MINUS_DST_COLOR; - asfact=GR_BLEND_ONE; - break; - case GL_SRC_ALPHA: - sfact=GR_BLEND_SRC_ALPHA; - asfact=GR_BLEND_ONE; - break; - case GL_ONE_MINUS_SRC_ALPHA: - sfact=GR_BLEND_ONE_MINUS_SRC_ALPHA; - asfact=GR_BLEND_ONE; - break; - case GL_DST_ALPHA: - sfact=GR_BLEND_DST_ALPHA; - asfact=GR_BLEND_ONE; - break; - case GL_ONE_MINUS_DST_ALPHA: - sfact=GR_BLEND_ONE_MINUS_DST_ALPHA; - asfact=GR_BLEND_ONE; - break; - case GL_SRC_ALPHA_SATURATE: - sfact=GR_BLEND_ALPHA_SATURATE; - asfact=GR_BLEND_ONE; - break; - case GL_SRC_COLOR: - case GL_ONE_MINUS_SRC_COLOR: - /* USELESS */ - asfact=sfact=GR_BLEND_ONE; - break; - default: - asfact=sfact=GR_BLEND_ONE; - break; - } - - if((sfact!=us->blendSrcFuncRGB) || - (asfact!=us->blendSrcFuncAlpha)) { - us->blendSrcFuncRGB=sfact; - us->blendSrcFuncAlpha=asfact; - fxMesa->new_state |= FX_NEW_BLEND; - ctx->Driver.RenderStart = fxSetupFXUnits; - } - - switch(dfactor) { - case GL_ZERO: - adfact=dfact=GR_BLEND_ZERO; - break; - case GL_ONE: - adfact=dfact=GR_BLEND_ONE; - break; - case GL_SRC_COLOR: - dfact=GR_BLEND_SRC_COLOR; - adfact=GR_BLEND_ZERO; - break; - case GL_ONE_MINUS_SRC_COLOR: - dfact=GR_BLEND_ONE_MINUS_SRC_COLOR; - adfact=GR_BLEND_ZERO; - break; - case GL_SRC_ALPHA: - dfact=GR_BLEND_SRC_ALPHA; - adfact=GR_BLEND_ZERO; - break; - case GL_ONE_MINUS_SRC_ALPHA: - dfact=GR_BLEND_ONE_MINUS_SRC_ALPHA; - adfact=GR_BLEND_ZERO; - break; - case GL_DST_ALPHA: - /* dfact=GR_BLEND_DST_ALPHA; */ - /* We can't do DST_ALPHA */ - dfact=GR_BLEND_ONE; - adfact=GR_BLEND_ZERO; - break; - case GL_ONE_MINUS_DST_ALPHA: - /* dfact=GR_BLEND_ONE_MINUS_DST_ALPHA; */ - /* We can't do DST_ALPHA */ - dfact=GR_BLEND_ZERO; - adfact=GR_BLEND_ZERO; - break; - case GL_SRC_ALPHA_SATURATE: - case GL_DST_COLOR: - case GL_ONE_MINUS_DST_COLOR: - /* USELESS */ - adfact=dfact=GR_BLEND_ZERO; - break; - default: - adfact=dfact=GR_BLEND_ZERO; - break; - } - - if((dfact!=us->blendDstFuncRGB) || - (adfact!=us->blendDstFuncAlpha)) { - us->blendDstFuncRGB=dfact; - us->blendDstFuncAlpha=adfact; - fxMesa->new_state |= FX_NEW_BLEND; - ctx->Driver.RenderStart = fxSetupFXUnits; - } -} - -static void fxSetupBlend(GLcontext *ctx) -{ - fxMesaContext fxMesa = FX_CONTEXT(ctx); - tfxUnitsState *us = &fxMesa->unitsState; - - assert(us->blendEnabled == ctx->Color.BlendEnabled); - - if (us->blendEnabled) - FX_grAlphaBlendFunction(us->blendSrcFuncRGB, us->blendDstFuncRGB, - us->blendSrcFuncAlpha, us->blendDstFuncAlpha); - else - FX_grAlphaBlendFunction(GR_BLEND_ONE, GR_BLEND_ZERO, - GR_BLEND_ONE, GR_BLEND_ZERO); -} - - -/************************************************************************/ -/************************** Alpha Test SetUp ****************************/ -/************************************************************************/ - -void fxDDAlphaFunc(GLcontext *ctx, GLenum func, GLclampf ref) -{ - fxMesaContext fxMesa = FX_CONTEXT(ctx); - tfxUnitsState *us = &fxMesa->unitsState; - GrCmpFnc_t newfunc; - - switch(func) { - case GL_NEVER: - newfunc=GR_CMP_NEVER; - break; - case GL_LESS: - newfunc=GR_CMP_LESS; - break; - case GL_EQUAL: - newfunc=GR_CMP_EQUAL; - break; - case GL_LEQUAL: - newfunc=GR_CMP_LEQUAL; - break; - case GL_GREATER: - newfunc=GR_CMP_GREATER; - break; - case GL_NOTEQUAL: - newfunc=GR_CMP_NOTEQUAL; - break; - case GL_GEQUAL: - newfunc=GR_CMP_GEQUAL; - break; - case GL_ALWAYS: - newfunc=GR_CMP_ALWAYS; - break; - default: - fprintf(stderr,"fx Driver: internal error in fxDDAlphaFunc()\n"); - fxCloseHardware(); - exit(-1); - break; - } - - if(newfunc!=us->alphaTestFunc) { - us->alphaTestFunc=newfunc; - fxMesa->new_state |= FX_NEW_ALPHA; - ctx->Driver.RenderStart = fxSetupFXUnits; - } - - if(ctx->Color.AlphaRef!=us->alphaTestRefValue) { - us->alphaTestRefValue=ctx->Color.AlphaRef; - fxMesa->new_state |= FX_NEW_ALPHA; - ctx->Driver.RenderStart = fxSetupFXUnits; - } -} - -static void fxSetupAlphaTest(GLcontext *ctx) -{ - fxMesaContext fxMesa=(fxMesaContext)ctx->DriverCtx; - tfxUnitsState *us=&fxMesa->unitsState; - - if(us->alphaTestEnabled) { - FX_grAlphaTestFunction(us->alphaTestFunc); - FX_grAlphaTestReferenceValue(us->alphaTestRefValue); - } else - FX_grAlphaTestFunction(GR_CMP_ALWAYS); -} - - -/* - * Evaluate all depth-test state and make the Glide calls. - */ -static void -fxSetupDepthTest(GLcontext *ctx) -{ - if (ctx->Depth.Test) { - GrCmpFnc_t dfunc; - switch (ctx->Depth.Func) { - case GL_NEVER: - dfunc = GR_CMP_NEVER; - break; - case GL_LESS: - dfunc = GR_CMP_LESS; - break; - case GL_GEQUAL: - dfunc = GR_CMP_GEQUAL; - break; - case GL_LEQUAL: - dfunc = GR_CMP_LEQUAL; - break; - case GL_GREATER: - dfunc = GR_CMP_GREATER; - break; - case GL_NOTEQUAL: - dfunc = GR_CMP_NOTEQUAL; - break; - case GL_EQUAL: - dfunc = GR_CMP_EQUAL; - break; - case GL_ALWAYS: - dfunc = GR_CMP_ALWAYS; - break; - default: - gl_problem(ctx, "bad depth mode in fxSetupDepthTest"); - dfunc = GR_CMP_ALWAYS; - } - FX_grDepthBufferFunction(dfunc); - FX_grDepthMask(ctx->Depth.Mask); - } - else { - /* depth test always passes, don't update Z buffer */ - FX_grDepthBufferFunction(GR_CMP_ALWAYS); - FX_grDepthMask(FXFALSE); - } -} - - -/* - * Evaluate all stencil state and make the Glide calls. - */ -static GrStencil_t -fxConvertGLStencilOp(GLenum op) -{ - switch (op) { - case GL_KEEP: - return GR_STENCILOP_KEEP; - case GL_ZERO: - return GR_STENCILOP_ZERO; - case GL_REPLACE: - return GR_STENCILOP_REPLACE; - case GL_INCR: - return GR_STENCILOP_INCR_CLAMP; - case GL_DECR: - return GR_STENCILOP_DECR_CLAMP; - case GL_INVERT: - return GR_STENCILOP_INVERT; - default: - gl_problem(NULL, "bad stencil op in fxConvertGLStencilOp"); - } - return GR_STENCILOP_KEEP; /* never get, silence compiler warning */ -} - -/* - * This function is called just before any rendering is done. - * It will validate the stencil parameters. - */ -static void -fxSetupStencilTest(GLcontext *ctx) -{ - fxMesaContext fxMesa = FX_CONTEXT(ctx); - if (fxMesa->haveHwStencil) { - if (ctx->Stencil.Enabled) { - GrStencil_t sfail = fxConvertGLStencilOp(ctx->Stencil.FailFunc); - GrStencil_t zfail = fxConvertGLStencilOp(ctx->Stencil.ZFailFunc); - GrStencil_t zpass = fxConvertGLStencilOp(ctx->Stencil.ZPassFunc); - FX_grStencilOp(sfail, zfail, zpass); - FX_grStencilFunc(ctx->Stencil.Function - GL_NEVER, - ctx->Stencil.Ref, ctx->Stencil.ValueMask); - FX_grStencilMask(ctx->Stencil.WriteMask); - FX_grEnable(GR_STENCIL_MODE_EXT); - } - else { - FX_grDisable(GR_STENCIL_MODE_EXT); - } - } -} - - -/* - * Set the state so that stencil is either enabled or disabled. - * This is called from Mesa only. Glide is invoked at - * setup time, not now. - */ -static void -fxDDEnableStencil(GLcontext *ctx, GLboolean state) -{ - fxMesaContext fxMesa = FX_CONTEXT(ctx); - (void) state; - fxMesa->new_state |= FX_NEW_STENCIL; - ctx->Driver.RenderStart = fxSetupFXUnits; -} - - -/************************************************************************/ -/**************************** Color Mask SetUp **************************/ -/************************************************************************/ - -GLboolean fxDDColorMask(GLcontext *ctx, - GLboolean r, GLboolean g, - GLboolean b, GLboolean a ) -{ - fxMesaContext fxMesa=(fxMesaContext)ctx->DriverCtx; - fxMesa->new_state |= FX_NEW_COLOR_MASK; - ctx->Driver.RenderStart = fxSetupFXUnits; - (void) r; (void) g; (void) b; (void) a; - return GL_FALSE; -} - -static void fxSetupColorMask(GLcontext *ctx) -{ - fxMesaContext fxMesa = FX_CONTEXT(ctx); - - if (ctx->Color.DrawBuffer == GL_NONE) { - FX_grColorMask(FXFALSE, FXFALSE); - } - else { - FX_grColorMask(ctx->Color.ColorMask[RCOMP] || - ctx->Color.ColorMask[GCOMP] || - ctx->Color.ColorMask[BCOMP], - ctx->Color.ColorMask[ACOMP] && fxMesa->haveAlphaBuffer); - } -} - - - - -/************************************************************************/ -/**************************** Fog Mode SetUp ****************************/ -/************************************************************************/ - -/* - * This is called during state update in order to update the Glide fog state. - */ -static void fxSetupFog(GLcontext *ctx) -{ - if (ctx->Fog.Enabled && ctx->FogMode==FOG_FRAGMENT) { - fxMesaContext fxMesa = FX_CONTEXT(ctx); - - /* update fog color */ - GLubyte col[4]; - col[0]=(unsigned int)(255*ctx->Fog.Color[0]); - col[1]=(unsigned int)(255*ctx->Fog.Color[1]); - col[2]=(unsigned int)(255*ctx->Fog.Color[2]); - col[3]=(unsigned int)(255*ctx->Fog.Color[3]); - FX_grFogColorValue(FXCOLOR4(col)); - - if(fxMesa->fogTableMode != ctx->Fog.Mode || - fxMesa->fogDensity != ctx->Fog.Density || - fxMesa->fogStart != ctx->Fog.Start || - fxMesa->fogEnd != ctx->Fog.End) { - /* reload the fog table */ - switch (ctx->Fog.Mode) { - case GL_LINEAR: - guFogGenerateLinear(fxMesa->fogTable, ctx->Fog.Start, ctx->Fog.End); - break; - case GL_EXP: - guFogGenerateExp(fxMesa->fogTable, ctx->Fog.Density); - break; - case GL_EXP2: - guFogGenerateExp2(fxMesa->fogTable, ctx->Fog.Density); - break; - default: - ; - } - fxMesa->fogTableMode = ctx->Fog.Mode; - fxMesa->fogDensity = ctx->Fog.Density; - fxMesa->fogStart = ctx->Fog.Start; - fxMesa->fogEnd = ctx->Fog.End; - } - - FX_grFogTable(fxMesa->fogTable); - FX_grFogMode(GR_FOG_WITH_TABLE); - } - else { - FX_grFogMode(GR_FOG_DISABLE); - } -} - -void fxDDFogfv( GLcontext *ctx, GLenum pname, const GLfloat *params ) -{ - FX_CONTEXT(ctx)->new_state |= FX_NEW_FOG; - ctx->Driver.RenderStart = fxSetupFXUnits; /* XXX why is this here? */ -} - -/************************************************************************/ -/************************** Scissor Test SetUp **************************/ -/************************************************************************/ - -/* This routine is used in managing the lock state, and therefore can't lock */ -void fxSetScissorValues(GLcontext *ctx) -{ - fxMesaContext fxMesa=(fxMesaContext)ctx->DriverCtx; - int xmin, xmax; - int ymin, ymax, check; - - if (ctx->Scissor.Enabled) { - xmin=ctx->Scissor.X; - xmax=ctx->Scissor.X+ctx->Scissor.Width; - ymin=ctx->Scissor.Y; - ymax=ctx->Scissor.Y+ctx->Scissor.Height; - check=1; - } else { - xmin=0; - ymin=0; - xmax=fxMesa->width; - ymax=fxMesa->height; - check=0; - } - xmin+=fxMesa->x_offset; - xmax+=fxMesa->x_offset; - ymin+=fxMesa->y_delta; - ymax+=fxMesa->y_delta; - if (xminclipMinX) xmin=fxMesa->clipMinX; - if (xmax>fxMesa->clipMaxX) xmax=fxMesa->clipMaxX; - if (yminscreen_height-fxMesa->clipMaxY) - ymin=fxMesa->screen_height-fxMesa->clipMaxY; - if (ymax>fxMesa->screen_height-fxMesa->clipMinY) - ymax=fxMesa->screen_height-fxMesa->clipMinY; - FX_grClipWindow_NoLock(xmin, ymin, xmax, ymax); -} - -static void fxSetupScissor(GLcontext *ctx) -{ - fxMesaContext fxMesa=(fxMesaContext)ctx->DriverCtx; - if (!fxMesa->needClip) { - BEGIN_BOARD_LOCK(); - fxSetScissorValues(ctx); - END_BOARD_LOCK(); - } -} - -void fxDDScissor( GLcontext *ctx, GLint x, GLint y, GLsizei w, GLsizei h ) -{ - FX_CONTEXT(ctx)->new_state |= FX_NEW_SCISSOR; - ctx->Driver.RenderStart = fxSetupFXUnits; -} - -/************************************************************************/ -/*************************** Cull mode setup ****************************/ -/************************************************************************/ - - -void fxDDCullFace(GLcontext *ctx, GLenum mode) -{ - (void) mode; - FX_CONTEXT(ctx)->new_state |= FX_NEW_CULL; - ctx->Driver.RenderStart = fxSetupFXUnits; -} - -void fxDDFrontFace(GLcontext *ctx, GLenum mode) -{ - (void) mode; - FX_CONTEXT(ctx)->new_state |= FX_NEW_CULL; - ctx->Driver.RenderStart = fxSetupFXUnits; -} - - -static void fxSetupCull(GLcontext *ctx) -{ - if (ctx->Polygon.CullFlag) { - switch (ctx->Polygon.CullFaceMode) { - case GL_BACK: - if (ctx->Polygon.FrontFace==GL_CCW) - FX_CONTEXT(ctx)->cullMode=GR_CULL_NEGATIVE; - else - FX_CONTEXT(ctx)->cullMode=GR_CULL_POSITIVE; - break; - case GL_FRONT: - if(ctx->Polygon.FrontFace==GL_CCW) - FX_CONTEXT(ctx)->cullMode=GR_CULL_POSITIVE; - else - FX_CONTEXT(ctx)->cullMode=GR_CULL_NEGATIVE; - break; - case GL_FRONT_AND_BACK: - FX_CONTEXT(ctx)->cullMode=GR_CULL_DISABLE; - break; - default: - break; - } - } else FX_CONTEXT(ctx)->cullMode=GR_CULL_DISABLE; - FX_grCullMode(FX_CONTEXT(ctx)->cullMode); -} - - -/************************************************************************/ -/****************************** DD Enable ******************************/ -/************************************************************************/ - -void fxDDEnable(GLcontext *ctx, GLenum cap, GLboolean state) -{ - fxMesaContext fxMesa = FX_CONTEXT(ctx); - tfxUnitsState *us = &fxMesa->unitsState; - - if (MESA_VERBOSE&VERBOSE_DRIVER) { - fprintf(stderr,"fxmesa: fxDDEnable(...)\n"); - } - - switch(cap) { - case GL_ALPHA_TEST: - if(state!=us->alphaTestEnabled) { - us->alphaTestEnabled=state; - fxMesa->new_state |= FX_NEW_ALPHA; - ctx->Driver.RenderStart = fxSetupFXUnits; - } - break; - case GL_BLEND: - if(state!=us->blendEnabled) { - us->blendEnabled=state; - fxMesa->new_state |= FX_NEW_BLEND; - ctx->Driver.RenderStart = fxSetupFXUnits; - } - break; - case GL_DEPTH_TEST: - fxMesa->new_state |= FX_NEW_DEPTH; - ctx->Driver.RenderStart = fxSetupFXUnits; - break; - case GL_DITHER: - if (state) - FX_grDitherMode(GR_DITHER_4x4); - else - FX_grDitherMode(GR_DITHER_DISABLE); - break; - case GL_SCISSOR_TEST: - fxMesa->new_state |= FX_NEW_SCISSOR; - ctx->Driver.RenderStart = fxSetupFXUnits; - break; - case GL_SHARED_TEXTURE_PALETTE_EXT: - fxDDTexUseGlbPalette(ctx, state); - break; - case GL_FOG: - fxMesa->new_state |= FX_NEW_FOG; - ctx->Driver.RenderStart = fxSetupFXUnits; - break; - case GL_CULL_FACE: - fxMesa->new_state |= FX_NEW_CULL; - ctx->Driver.RenderStart = fxSetupFXUnits; - break; - case GL_LINE_SMOOTH: - case GL_LINE_STIPPLE: - case GL_POINT_SMOOTH: - case GL_POLYGON_SMOOTH: - case GL_TEXTURE_2D: - fxMesa->new_state |= FX_NEW_TEXTURING; - ctx->Driver.RenderStart = fxSetupFXUnits; - break; - case GL_STENCIL_TEST: - fxMesa->new_state |= FX_NEW_STENCIL; - ctx->Driver.RenderStart = fxSetupFXUnits; - break; - default: - ; /* no-op */ - } -} - - -#if 0 -/* - Multipass to do GL_BLEND texture functions - Cf*(1-Ct) has already been written to the buffer during the first pass - Cc*Ct gets written during the second pass (in this function) - Everything gets reset in the third call (in this function) -*/ -static GLboolean fxMultipassBlend(struct vertex_buffer *VB, GLuint pass) -{ - GLcontext *ctx = VB->ctx; - fxMesaContext fxMesa = FX_CONTEXT(ctx); - - switch (pass) { - case 1: - /* Add Cc*Ct */ - fxMesa->restoreUnitsState=fxMesa->unitsState; - if (ctx->Depth.Mask) { - /* We don't want to check or change the depth buffers */ - switch (ctx->Depth.Func) { - case GL_NEVER: - case GL_ALWAYS: - break; - default: - fxDDDepthFunc(ctx, GL_EQUAL); - break; - } - fxDDDepthMask(ctx, FALSE); - } - /* - * Disable stencil as well. - */ - if (ctx->Stencil.Enabled) { - fxDDEnableStencil(ctx, GL_FALSE); - } - /* Enable Cc*Ct mode */ - /* XXX Set the Constant Color ? */ - fxDDEnable(ctx, GL_BLEND, GL_TRUE); - fxDDBlendFunc(ctx, XXX, XXX); - fxSetupTextureSingleTMU(ctx, XXX); - fxSetupBlend(ctx); - fxSetupDepthTest(ctx); - break; - - case 2: - /* Reset everything back to normal */ - fxMesa->unitsState = fxMesa->restoreUnitsState; - fxMesa->setupdone &= XXX; - fxSetupTextureSingleTMU(ctx, XXX); - fxSetupBlend(ctx); - fxSetupDepthTest(ctx); - fxSetupStencilText(ctx); - break; - } - - return pass==1; -} -#endif - -/************************************************************************/ -/******************** Fake Multitexture Support *************************/ -/************************************************************************/ - -/* Its considered cheeky to try to fake ARB multitexture by doing - * multipass rendering, because it is not possible to emulate the full - * spec in this way. The fact is that the voodoo 2 supports only a - * subset of the possible multitexturing modes, and it is possible to - * support almost the same subset using multipass blending on the - * voodoo 1. In all other cases for both voodoo 1 and 2, we fall back - * to software rendering, satisfying the spec if not the user. - */ -static GLboolean fxMultipassTexture( struct vertex_buffer *VB, GLuint pass ) -{ - GLcontext *ctx = VB->ctx; - fxVertex *v = FX_DRIVER_DATA(VB)->verts; - fxVertex *last = FX_DRIVER_DATA(VB)->last_vert; - fxMesaContext fxMesa = FX_CONTEXT(ctx); - - switch (pass) { - case 1: - if (MESA_VERBOSE&(VERBOSE_DRIVER|VERBOSE_PIPELINE|VERBOSE_TEXTURE)) - fprintf(stderr, "fxmesa: Second texture pass\n"); - - for ( ; v != last ; v++) { - v->f[S0COORD] = v->f[S1COORD]; - v->f[T0COORD] = v->f[T1COORD]; - } - - fxMesa->restoreUnitsState = fxMesa->unitsState; - fxMesa->tmu_source[0] = 1; - - if (ctx->Depth.Mask) { - switch (ctx->Depth.Func) { - case GL_NEVER: - case GL_ALWAYS: - break; - default: - /*fxDDDepthFunc( ctx, GL_EQUAL );*/ - FX_grDepthBufferFunction(GR_CMP_EQUAL); - break; - } - - /*fxDDDepthMask( ctx, GL_FALSE ); */ - FX_grDepthMask(FXFALSE); - } - fxDDEnableStencil(ctx, GL_FALSE); - if (ctx->Texture.Unit[1].EnvMode == GL_MODULATE) { - fxDDEnable( ctx, GL_BLEND, GL_TRUE ); - fxDDBlendFunc( ctx, GL_DST_COLOR, GL_ZERO ); - } - - fxSetupTextureSingleTMU( ctx, 1 ); - fxSetupBlend( ctx ); - fxSetupDepthTest( ctx ); - break; - - case 2: - /* Restore original state. - */ - fxMesa->tmu_source[0] = 0; - fxMesa->unitsState = fxMesa->restoreUnitsState; - fxMesa->setupdone &= ~SETUP_TMU0; - fxSetupTextureSingleTMU( ctx, 0 ); - fxSetupBlend( ctx ); - fxSetupDepthTest( ctx ); - fxSetupStencilTest( ctx ); - break; - } - - return pass == 1; -} - - -/************************************************************************/ -/************************** Changes to units state **********************/ -/************************************************************************/ - - -/* All units setup is handled under texture setup. - */ -void fxDDShadeModel(GLcontext *ctx, GLenum mode) -{ - FX_CONTEXT(ctx)->new_state |= FX_NEW_TEXTURING; - ctx->Driver.RenderStart = fxSetupFXUnits; -} - - - -/************************************************************************/ -/****************************** Units SetUp *****************************/ -/************************************************************************/ -static void gl_print_fx_state_flags( const char *msg, GLuint flags ) -{ - fprintf(stderr, - "%s: (0x%x) %s%s%s%s%s%s%s\n", - msg, - flags, - (flags & FX_NEW_TEXTURING) ? "texture, " : "", - (flags & FX_NEW_BLEND) ? "blend, " : "", - (flags & FX_NEW_ALPHA) ? "alpha, " : "", - (flags & FX_NEW_FOG) ? "fog, " : "", - (flags & FX_NEW_SCISSOR) ? "scissor, " : "", - (flags & FX_NEW_COLOR_MASK) ? "colormask, " : "", - (flags & FX_NEW_CULL) ? "cull, " : ""); -} - -void fxSetupFXUnits( GLcontext *ctx ) -{ - fxMesaContext fxMesa=(fxMesaContext)ctx->DriverCtx; - GLuint newstate = fxMesa->new_state; - - if (MESA_VERBOSE&VERBOSE_DRIVER) - gl_print_fx_state_flags("fxmesa: fxSetupFXUnits", newstate); - - if (newstate) { - if (newstate & FX_NEW_TEXTURING) - fxSetupTexture(ctx); - - if (newstate & FX_NEW_BLEND) - fxSetupBlend(ctx); - - if (newstate & FX_NEW_ALPHA) - fxSetupAlphaTest(ctx); - - if (newstate & FX_NEW_DEPTH) - fxSetupDepthTest(ctx); - - if (newstate & FX_NEW_STENCIL) - fxSetupStencilTest(ctx); - - if (newstate & FX_NEW_FOG) - fxSetupFog(ctx); - - if (newstate & FX_NEW_SCISSOR) - fxSetupScissor(ctx); - - if (newstate & FX_NEW_COLOR_MASK) - fxSetupColorMask(ctx); - - if (newstate & FX_NEW_CULL) - fxSetupCull(ctx); - fxMesa->new_state = 0; -/* ctx->Driver.RenderStart = 0; */ - } -} - -#else - - -/* - * Need this to provide at least one external definition. - */ - -int gl_fx_dummy_function_setup(void) -{ - return 0; -} - -#endif /* FX */ Index: xc/extras/Mesa/src/FX/fxstripdet.c diff -u xc/extras/Mesa/src/FX/fxstripdet.c:1.2 xc/extras/Mesa/src/FX/fxstripdet.c:removed --- xc/extras/Mesa/src/FX/fxstripdet.c:1.2 Tue Feb 15 02:13:09 2000 +++ xc/extras/Mesa/src/FX/fxstripdet.c Mon Dec 18 14:21:52 2000 @@ -1,164 +0,0 @@ -/* -*- mode: C; tab-width:8; c-basic-offset:2 -*- */ - -/* - * Mesa 3-D graphics library - * Version: 3.3 - * - * Copyright (C) 1999-2000 Brian Paul All Rights Reserved. - * - * 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 - * BRIAN PAUL 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. - * - * - * Original Mesa / 3Dfx device driver (C) 1999 David Bucciarelli, by the - * terms stated above. - * - * Thank you for your contribution, David! - * - * Please make note of the above copyright/license statement. If you - * contributed code or bug fixes to this code under the previous (GNU - * Library) license and object to the new license, your code will be - * removed at your request. Please see the Mesa docs/COPYRIGHT file - * for more information. - * - * Additional Mesa/3Dfx driver developers: - * Daryll Strauss - * Keith Whitwell - * - * See fxapi.h for more revision/author details. - */ - - -#ifdef HAVE_CONFIG_H -#include "conf.h" -#endif -#if defined(FX) && defined(FX_GLIDE3) - -#include "fxdrv.h" -#include "vbcull.h" - - -#define STRIP0(u,v) ((u1 == v1) && (u2 == v0)) -#define STRIP1(u,v) ((u0 == v0) && (u2 == v1)) - -#define LOCAL_VARS fxVertex* gWin = FX_DRIVER_DATA(VB)->verts; \ - GrVertex** sb = FX_DRIVER_DATA(VB)->strips_b; - -#define STRIPSLOCAL_VAR int sc = 0; - -#define INIT(a) - -#define SENDTRI(u0,u1,u2) FX_grDrawTriangle((GrVertex*)&(gWin[u0].f),(GrVertex*)&(gWin[u1].f),(GrVertex*)&(gWin[u2].f)) -#define FLUSHTRI() /* No-Op */ -#define STARTSTRIPS(u0,u1,u2) { sb[sc++] = (GrVertex*)&(gWin[u0].f); sb[sc++] = (GrVertex*)&(gWin[u1].f); sb[sc++] = (GrVertex*)&(gWin[u2].f); } -#define SENDSTRIPS(v2) { sb[sc++] = (GrVertex*)&(gWin[v2].f); } -#define FLUSHSTRIPS() FX_grDrawVertexArray(GR_TRIANGLE_STRIP,sc,sb) - -#define CLIPPED(a,b,c) 0 -#define CULLED(a,b,c) 0 -#define SENDCLIPTRI(a,b,c) /* NoOp */ - -#define TAG(x) x##_fx - -#include "fxsdettmp.h" - - -/* Clipped but no userclip */ -#define STRIP0(u,v) ((u1 == v1) && (u2 == v0)) && !clipmask[v2] -#define STRIP1(u,v) ((u0 == v0) && (u2 == v1)) && !clipmask[v2] - -#define LOCAL_VARS fxVertex* gWin = FX_DRIVER_DATA(VB)->verts; \ - GrVertex** sb = FX_DRIVER_DATA(VB)->strips_b; \ - const GLubyte *const clipmask = VB->ClipMask; \ - const fxMesaContext fxMesa=(fxMesaContext)VB->ctx->DriverCtx; \ - const tfxTriClipFunc cliptri = fxMesa->clip_tri_stride; - -#define STRIPSLOCAL_VAR int sc = 0; - -#define INIT(a) - -#define SENDTRI(u0,u1,u2) FX_grDrawTriangle((GrVertex*)&(gWin[u0].f),(GrVertex*)&(gWin[u1].f),(GrVertex*)&(gWin[u2].f)) -#define FLUSHTRI() /* No-Op */ -#define STARTSTRIPS(u0,u1,u2) { sb[sc++] = (GrVertex*)&(gWin[u0].f); sb[sc++] = (GrVertex*)&(gWin[u1].f); sb[sc++] = (GrVertex*)&(gWin[u2].f); } -#define SENDSTRIPS(v2) { sb[sc++] = (GrVertex*)&(gWin[v2].f); } -#define FLUSHSTRIPS() FX_grDrawVertexArray(GR_TRIANGLE_STRIP,sc,sb) - -#define CLIPPED(u0,u1,u2) (clipmask[u0] | clipmask[u1] | clipmask[u2]) -#define CULLED(u0,u1,u2) (clipmask[u0] & clipmask[u1] & clipmask[u2]) -#define SENDCLIPTRI(u0,u1,u2) { \ - GLuint vl[3]; \ - ASSIGN_3V(vl, u0, u1, u2 ); \ - cliptri(VB,vl,clipmask[u0] | clipmask[u1] | clipmask[u2]); \ - } - -#define TAG(x) x##_fx_view_clipped - -#include "fxsdettmp.h" - -/* Clipped and might be userclip */ -#define STRIP0(u,v) ((u1 == v1) && (u2 == v0)) && !clipmask[v2] -#define STRIP1(u,v) ((u0 == v0) && (u2 == v1)) && !clipmask[v2] - -#define LOCAL_VARS fxVertex* gWin = FX_DRIVER_DATA(VB)->verts; \ - GrVertex** sb = FX_DRIVER_DATA(VB)->strips_b; \ - const GLubyte *const clipmask = VB->ClipMask; \ - const GLubyte *userclipmask = VB->UserClipMask; \ - const fxMesaContext fxMesa=(fxMesaContext)VB->ctx->DriverCtx; \ - const tfxTriClipFunc cliptri = fxMesa->clip_tri_stride; - -#define STRIPSLOCAL_VAR int sc = 0; - -#define INIT(a) - -#define SENDTRI(u0,u1,u2) FX_grDrawTriangle((GrVertex*)&(gWin[u0].f),(GrVertex*)&(gWin[u1].f),(GrVertex*)&(gWin[u2].f)) -#define FLUSHTRI() /* No-Op */ -#define STARTSTRIPS(u0,u1,u2) { sb[sc++] = (GrVertex*)&(gWin[u0].f); sb[sc++] = (GrVertex*)&(gWin[u1].f); sb[sc++] = (GrVertex*)&(gWin[u2].f); } -#define SENDSTRIPS(v2) { sb[sc++] = (GrVertex*)&(gWin[v2].f); } -#define FLUSHSTRIPS() FX_grDrawVertexArray(GR_TRIANGLE_STRIP,sc,sb) - -#define CLIPPED(u0,u1,u2) (clipmask[u0] | clipmask[u1] | clipmask[u2]) -#define CULLED(u0,u1,u2) (clipmask[u0] & clipmask[u1] & clipmask[u2] & CLIP_ALL_BITS) -#define SENDCLIPTRI(u0,u1,u2) { \ - GLuint vl[3]; \ - GLuint imask = (clipmask[u0] | clipmask[u1] | clipmask[u2]); \ - \ - if (imask & CLIP_USER_BIT) { \ - if (!(userclipmask[u2] & userclipmask[u1] & userclipmask[u0])) \ - { ASSIGN_3V(vl, u2, u1, u0 ); \ - imask |= (userclipmask[u2] | userclipmask[u1] | userclipmask[u0]) << 8; \ - cliptri( VB, vl, imask );} \ - } \ - else { ASSIGN_3V(vl, u2, u1, u0 ); \ - cliptri( VB, vl, imask ); } \ - } - -#define TAG(x) x##_fx_clipped - -#include "fxsdettmp.h" - - -void fxDDRenderInitGlide3(GLcontext *ctx) -{ -#if 0 - render_tab_fx_smooth_indirect[GL_TRIANGLES] = render_vb_triangles_smooth_indirect_sd_fx; - render_tab_fx_smooth_indirect_view_clipped[GL_TRIANGLES] = render_vb_triangles_smooth_indirect_sd_fx_view_clipped; - render_tab_fx_smooth_indirect_clipped[GL_TRIANGLES] = render_vb_triangles_smooth_indirect_sd_fx_clipped; -#endif -} - - -#endif /* defined(FX) && FX_GLIDE3 */ Index: xc/extras/Mesa/src/FX/fxtexman.c diff -u xc/extras/Mesa/src/FX/fxtexman.c:1.4 xc/extras/Mesa/src/FX/fxtexman.c:removed --- xc/extras/Mesa/src/FX/fxtexman.c:1.4 Fri Jun 16 20:02:34 2000 +++ xc/extras/Mesa/src/FX/fxtexman.c Mon Dec 18 14:21:52 2000 @@ -1,743 +0,0 @@ -/* -*- mode: C; tab-width:8; c-basic-offset:2 -*- */ - -/* - * Mesa 3-D graphics library - * Version: 3.3 - * - * Copyright (C) 1999-2000 Brian Paul All Rights Reserved. - * - * 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 - * BRIAN PAUL 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. - * - * - * Original Mesa / 3Dfx device driver (C) 1999 David Bucciarelli, by the - * terms stated above. - * - * Thank you for your contribution, David! - * - * Please make note of the above copyright/license statement. If you - * contributed code or bug fixes to this code under the previous (GNU - * Library) license and object to the new license, your code will be - * removed at your request. Please see the Mesa docs/COPYRIGHT file - * for more information. - * - * Additional Mesa/3Dfx driver developers: - * Daryll Strauss - * Keith Whitwell - * - * See fxapi.h for more revision/author details. - */ - - -/* fxtexman.c - 3Dfx VooDoo texture memory functions */ - - -#ifdef HAVE_CONFIG_H -#include "conf.h" -#endif - -#if defined(FX) - -#include "fxdrv.h" - -int texSwaps=0; - -#define FX_2MB_SPLIT 0x200000 - -static struct gl_texture_object *fxTMFindOldestObject(fxMesaContext fxMesa, - int tmu); - - -#ifdef TEXSANITY -static void fubar() -{ -} - - /* Sanity Check */ -static void sanity(fxMesaContext fxMesa) -{ - MemRange *tmp, *prev, *pos; - - prev=0; - tmp = fxMesa->tmFree[0]; - while (tmp) { - if (!tmp->startAddr && !tmp->endAddr) { - fprintf(stderr, "Textures fubar\n"); - fubar(); - } - if (tmp->startAddr>=tmp->endAddr) { - fprintf(stderr, "Node fubar\n"); - fubar(); - } - if (prev && (prev->startAddr>=tmp->startAddr || - prev->endAddr>tmp->startAddr)) { - fprintf(stderr, "Sorting fubar\n"); - fubar(); - } - prev=tmp; - tmp=tmp->next; - } - prev=0; - tmp = fxMesa->tmFree[1]; - while (tmp) { - if (!tmp->startAddr && !tmp->endAddr) { - fprintf(stderr, "Textures fubar\n"); - fubar(); - } - if (tmp->startAddr>=tmp->endAddr) { - fprintf(stderr, "Node fubar\n"); - fubar(); - } - if (prev && (prev->startAddr>=tmp->startAddr || - prev->endAddr>tmp->startAddr)) { - fprintf(stderr, "Sorting fubar\n"); - fubar(); - } - prev=tmp; - tmp=tmp->next; - } -} -#endif - -static MemRange *fxTMNewRangeNode(fxMesaContext fxMesa, FxU32 start, FxU32 end) { - MemRange *result=0; - - if (fxMesa->tmPool) { - result=fxMesa->tmPool; - fxMesa->tmPool=fxMesa->tmPool->next; - } else { - if (!(result=MALLOC(sizeof(MemRange)))) { - fprintf(stderr, "fxDriver: out of memory!\n"); - fxCloseHardware(); - exit(-1); - } - } - result->startAddr=start; - result->endAddr=end; - return result; -} - -static void fxTMDeleteRangeNode(fxMesaContext fxMesa, MemRange *range) -{ - range->next=fxMesa->tmPool; - fxMesa->tmPool=range; -} - -static void fxTMUInit(fxMesaContext fxMesa, int tmu) -{ - MemRange *tmn, *last; - FxU32 start,end,blockstart,blockend; - - start=FX_grTexMinAddress(tmu); - end=FX_grTexMaxAddress(tmu); - - if(fxMesa->verbose) { - fprintf(stderr,"Voodoo %s configuration:",(tmu==FX_TMU0) ? "TMU0" : "TMU1"); - fprintf(stderr,"Voodoo Lower texture memory address (%u)\n",(unsigned int)start); - fprintf(stderr,"Voodoo Higher texture memory address (%u)\n",(unsigned int)end); - fprintf(stderr,"Voodoo Splitting Texture memory in 2b blocks:\n"); - } - - fxMesa->freeTexMem[tmu]=end-start; - fxMesa->tmFree[tmu]=NULL; - - last=0; - blockstart=start; - while (blockstartend) blockend=end; - else blockend=blockstart+FX_2MB_SPLIT; - - if(fxMesa->verbose) - fprintf(stderr,"Voodoo %07u-%07u\n", - (unsigned int)blockstart,(unsigned int)blockend); - - tmn=fxTMNewRangeNode(fxMesa, blockstart, blockend); - tmn->next=0; - - if (last) last->next=tmn; - else fxMesa->tmFree[tmu]=tmn; - last=tmn; - - blockstart+=FX_2MB_SPLIT; - } -} - -static int fxTMFindStartAddr(fxMesaContext fxMesa, GLint tmu, int size) -{ - MemRange *prev, *tmp; - int result; - struct gl_texture_object *obj; - - while (1) { - prev=0; - tmp=fxMesa->tmFree[tmu]; - while (tmp) { - if (tmp->endAddr-tmp->startAddr>=size) { /* Fits here */ - result=tmp->startAddr; - tmp->startAddr+=size; - if (tmp->startAddr==tmp->endAddr) { /* Empty */ - if (prev) { - prev->next=tmp->next; - } else { - fxMesa->tmFree[tmu]=tmp->next; - } - fxTMDeleteRangeNode(fxMesa, tmp); - } - fxMesa->freeTexMem[tmu]-=size; - return result; - } - prev=tmp; - tmp=tmp->next; - } - /* No free space. Discard oldest */ - obj=fxTMFindOldestObject(fxMesa, tmu); - if (!obj) { - fprintf(stderr, "fx Driver: No space for texture\n"); - return -1; - } - fxTMMoveOutTM(fxMesa, obj); - texSwaps++; - } -} - -static void fxTMRemoveRange(fxMesaContext fxMesa, GLint tmu, MemRange *range) -{ - MemRange *tmp, *prev; - - if (range->startAddr==range->endAddr) { - fxTMDeleteRangeNode(fxMesa, range); - return; - } - fxMesa->freeTexMem[tmu]+=range->endAddr-range->startAddr; - prev=0; - tmp=fxMesa->tmFree[tmu]; - while (tmp) { - if (range->startAddr>tmp->startAddr) { - prev=tmp; - tmp=tmp->next; - } else break; - } - /* When we create the regions, we make a split at the 2MB boundary. - Now we have to make sure we don't join those 2MB boundary regions - back together again. */ - range->next=tmp; - if (tmp) { - if (range->endAddr==tmp->startAddr && tmp->startAddr&(FX_2MB_SPLIT-1)) { - /* Combine */ - tmp->startAddr=range->startAddr; - fxTMDeleteRangeNode(fxMesa, range); - range=tmp; - } - } - if (prev) { - if (prev->endAddr==range->startAddr && range->startAddr&(FX_2MB_SPLIT-1)) { - /* Combine */ - prev->endAddr=range->endAddr; - prev->next=range->next; - fxTMDeleteRangeNode(fxMesa, range); - } else prev->next=range; - } else { - fxMesa->tmFree[tmu]=range; - } -} - -static struct gl_texture_object *fxTMFindOldestObject(fxMesaContext fxMesa, - int tmu) -{ - GLuint age, old, lasttime, bindnumber; - tfxTexInfo *info; - struct gl_texture_object *obj, *tmp; - - tmp=fxMesa->glCtx->Shared->TexObjectList; - if (!tmp) return 0; - obj=0; - old=0; - - bindnumber=fxMesa->texBindNumber; - while (tmp) { - info=fxTMGetTexInfo(tmp); - - if (info && info->isInTM && - ((info->whichTMU==tmu) || (info->whichTMU==FX_TMU_BOTH) || - (info->whichTMU==FX_TMU_SPLIT))) { - lasttime=info->lastTimeUsed; - - if (lasttime>bindnumber) - age=bindnumber+(UINT_MAX-lasttime+1); /* TO DO: check wrap around */ - else - age=bindnumber-lasttime; - - if (age>=old) { - old=age; - obj=tmp; - } - } - tmp=tmp->Next; - } - return obj; -} - -static MemRange *fxTMAddObj(fxMesaContext fxMesa, - struct gl_texture_object *tObj, - GLint tmu, int texmemsize) -{ - FxU32 startAddr; - MemRange *range; - - startAddr=fxTMFindStartAddr(fxMesa, tmu, texmemsize); - if (startAddr<0) return 0; - range=fxTMNewRangeNode(fxMesa, startAddr, startAddr+texmemsize); - return range; -} - -/* External Functions */ - -void fxTMMoveInTM_NoLock(fxMesaContext fxMesa, struct gl_texture_object *tObj, GLint where) -{ - tfxTexInfo *ti=fxTMGetTexInfo(tObj); - int i,l; - int texmemsize; - - if (MESA_VERBOSE&VERBOSE_DRIVER) { - fprintf(stderr,"fxmesa: fxTMMoveInTM(%d)\n",tObj->Name); - } - - fxMesa->stats.reqTexUpload++; - - if (!ti->validated) { - fprintf(stderr,"fx Driver: internal error in fxTMMoveInTM() -> not validated\n"); - fxCloseHardware(); - exit(-1); - } - - if (ti->isInTM) { - if (ti->whichTMU==where) return; - if (where==FX_TMU_SPLIT || ti->whichTMU==FX_TMU_SPLIT) - fxTMMoveOutTM_NoLock(fxMesa, tObj); - else { - if (ti->whichTMU==FX_TMU_BOTH) return; - where=FX_TMU_BOTH; - } - } - - if (MESA_VERBOSE&(VERBOSE_DRIVER|VERBOSE_TEXTURE)) { - fprintf(stderr,"fxmesa: downloading %x (%d) in texture memory in %d\n",(GLuint)tObj,tObj->Name,where); - } - - ti->whichTMU=(FxU32)where; - - switch (where) { - case FX_TMU0: - case FX_TMU1: - texmemsize=(int)FX_grTexTextureMemRequired_NoLock(GR_MIPMAPLEVELMASK_BOTH, - &(ti->info)); - ti->tm[where]=fxTMAddObj(fxMesa, tObj, where, texmemsize); - fxMesa->stats.memTexUpload+=texmemsize; - - for (i=FX_largeLodValue(ti->info), l=ti->minLevel; - i<=FX_smallLodValue(ti->info); - i++,l++) - FX_grTexDownloadMipMapLevel_NoLock(where, - ti->tm[where]->startAddr, - FX_valueToLod(i), - FX_largeLodLog2(ti->info), - FX_aspectRatioLog2(ti->info), - ti->info.format, - GR_MIPMAPLEVELMASK_BOTH, - ti->mipmapLevel[l].data); - break; - case FX_TMU_SPLIT: - texmemsize=(int)FX_grTexTextureMemRequired_NoLock(GR_MIPMAPLEVELMASK_ODD, - &(ti->info)); - ti->tm[FX_TMU0]=fxTMAddObj(fxMesa, tObj, FX_TMU0, texmemsize); - fxMesa->stats.memTexUpload+=texmemsize; - - texmemsize=(int)FX_grTexTextureMemRequired_NoLock(GR_MIPMAPLEVELMASK_EVEN, - &(ti->info)); - ti->tm[FX_TMU1]=fxTMAddObj(fxMesa, tObj, FX_TMU1, texmemsize); - fxMesa->stats.memTexUpload+=texmemsize; - - for (i=FX_largeLodValue(ti->info),l=ti->minLevel; - i<=FX_smallLodValue(ti->info); - i++,l++) { - FX_grTexDownloadMipMapLevel_NoLock(GR_TMU0, - ti->tm[FX_TMU0]->startAddr, - FX_valueToLod(i), - FX_largeLodLog2(ti->info), - FX_aspectRatioLog2(ti->info), - ti->info.format, - GR_MIPMAPLEVELMASK_ODD, - ti->mipmapLevel[l].data); - - FX_grTexDownloadMipMapLevel_NoLock(GR_TMU1, - ti->tm[FX_TMU1]->startAddr, - FX_valueToLod(i), - FX_largeLodLog2(ti->info), - FX_aspectRatioLog2(ti->info), - ti->info.format, - GR_MIPMAPLEVELMASK_EVEN, - ti->mipmapLevel[l].data); - } - break; - case FX_TMU_BOTH: - texmemsize=(int)FX_grTexTextureMemRequired_NoLock(GR_MIPMAPLEVELMASK_BOTH, - &(ti->info)); - ti->tm[FX_TMU0]=fxTMAddObj(fxMesa, tObj, FX_TMU0, texmemsize); - fxMesa->stats.memTexUpload+=texmemsize; - - texmemsize=(int)FX_grTexTextureMemRequired_NoLock(GR_MIPMAPLEVELMASK_BOTH, - &(ti->info)); - ti->tm[FX_TMU1]=fxTMAddObj(fxMesa, tObj, FX_TMU1, texmemsize); - fxMesa->stats.memTexUpload+=texmemsize; - - for (i=FX_largeLodValue(ti->info),l=ti->minLevel; - i<=FX_smallLodValue(ti->info); - i++,l++) { - FX_grTexDownloadMipMapLevel_NoLock(GR_TMU0, - ti->tm[FX_TMU0]->startAddr, - FX_valueToLod(i), - FX_largeLodLog2(ti->info), - FX_aspectRatioLog2(ti->info), - ti->info.format, - GR_MIPMAPLEVELMASK_BOTH, - ti->mipmapLevel[l].data); - - FX_grTexDownloadMipMapLevel_NoLock(GR_TMU1, - ti->tm[FX_TMU1]->startAddr, - FX_valueToLod(i), - FX_largeLodLog2(ti->info), - FX_aspectRatioLog2(ti->info), - ti->info.format, - GR_MIPMAPLEVELMASK_BOTH, - ti->mipmapLevel[l].data); - } - break; - default: - fprintf(stderr,"fx Driver: internal error in fxTMMoveInTM() -> wrong tmu (%d)\n",where); - fxCloseHardware(); - exit(-1); - } - - fxMesa->stats.texUpload++; - - ti->isInTM=GL_TRUE; -} - -void fxTMMoveInTM(fxMesaContext fxMesa, struct gl_texture_object *tObj, GLint where) { - BEGIN_BOARD_LOCK(); - fxTMMoveInTM_NoLock(fxMesa, tObj, where); - END_BOARD_LOCK(); -} - -void fxTMReloadMipMapLevel(fxMesaContext fxMesa, struct gl_texture_object *tObj, GLint level) -{ - tfxTexInfo *ti=fxTMGetTexInfo(tObj); - GrLOD_t lodlevel; - GLint tmu; - - if (!ti->validated) { - fprintf(stderr,"fx Driver: internal error in fxTMReloadMipMapLevel() -> not validated\n"); - fxCloseHardware(); - exit(-1); - } - - tmu=(int)ti->whichTMU; - fxTMMoveInTM(fxMesa, tObj, tmu); - - fxTexGetInfo(ti->mipmapLevel[0].width,ti->mipmapLevel[0].height, - &lodlevel, NULL, NULL, NULL, NULL, NULL, NULL, NULL); - -#ifdef FX_GLIDE3 - lodlevel-=level; -#else - lodlevel+=level; -#endif - switch(tmu) { - case FX_TMU0: - case FX_TMU1: - FX_grTexDownloadMipMapLevel(tmu, - ti->tm[tmu]->startAddr, - FX_valueToLod(FX_lodToValue(lodlevel)), - FX_largeLodLog2(ti->info), - FX_aspectRatioLog2(ti->info), - ti->info.format, - GR_MIPMAPLEVELMASK_BOTH, - ti->mipmapLevel[level].data); - break; - case FX_TMU_SPLIT: - FX_grTexDownloadMipMapLevel(GR_TMU0, - ti->tm[GR_TMU0]->startAddr, - FX_valueToLod(FX_lodToValue(lodlevel)), - FX_largeLodLog2(ti->info), - FX_aspectRatioLog2(ti->info), - ti->info.format, - GR_MIPMAPLEVELMASK_ODD, - ti->mipmapLevel[level].data); - - FX_grTexDownloadMipMapLevel(GR_TMU1, - ti->tm[GR_TMU1]->startAddr, - FX_valueToLod(FX_lodToValue(lodlevel)), - FX_largeLodLog2(ti->info), - FX_aspectRatioLog2(ti->info), - ti->info.format, - GR_MIPMAPLEVELMASK_EVEN, - ti->mipmapLevel[level].data); - break; - case FX_TMU_BOTH: - FX_grTexDownloadMipMapLevel(GR_TMU0, - ti->tm[GR_TMU0]->startAddr, - FX_valueToLod(FX_lodToValue(lodlevel)), - FX_largeLodLog2(ti->info), - FX_aspectRatioLog2(ti->info), - ti->info.format, - GR_MIPMAPLEVELMASK_BOTH, - ti->mipmapLevel[level].data); - - FX_grTexDownloadMipMapLevel(GR_TMU1, - ti->tm[GR_TMU1]->startAddr, - FX_valueToLod(FX_lodToValue(lodlevel)), - FX_largeLodLog2(ti->info), - FX_aspectRatioLog2(ti->info), - ti->info.format, - GR_MIPMAPLEVELMASK_BOTH, - ti->mipmapLevel[level].data); - break; - - default: - fprintf(stderr,"fx Driver: internal error in fxTMReloadMipMapLevel() -> wrong tmu (%d)\n",tmu); - fxCloseHardware(); - exit(-1); - } -} - -void fxTMReloadSubMipMapLevel(fxMesaContext fxMesa, - struct gl_texture_object *tObj, - GLint level, GLint yoffset, GLint height) -{ - tfxTexInfo *ti=fxTMGetTexInfo(tObj); - GrLOD_t lodlevel; - unsigned short *data; - GLint tmu; - - if(!ti->validated) { - fprintf(stderr,"fx Driver: internal error in fxTMReloadSubMipMapLevel() -> not validated\n"); - fxCloseHardware(); - exit(-1); - } - - tmu=(int)ti->whichTMU; - fxTMMoveInTM(fxMesa, tObj, tmu); - - fxTexGetInfo(ti->mipmapLevel[0].width, ti->mipmapLevel[0].height, - &lodlevel, NULL, NULL, NULL, NULL, NULL, NULL, NULL); - - data=ti->mipmapLevel[level].data + - yoffset*ti->mipmapLevel[level].width*ti->mipmapLevel[level].texelSize; - - switch(tmu) { - case FX_TMU0: - case FX_TMU1: - FX_grTexDownloadMipMapLevelPartial(tmu, - ti->tm[tmu]->startAddr, - FX_valueToLod(FX_lodToValue(lodlevel)+level), - FX_largeLodLog2(ti->info), - FX_aspectRatioLog2(ti->info), - ti->info.format, - GR_MIPMAPLEVELMASK_BOTH, - data, - yoffset,yoffset+height-1); - break; - case FX_TMU_SPLIT: - FX_grTexDownloadMipMapLevelPartial(GR_TMU0, - ti->tm[FX_TMU0]->startAddr, - FX_valueToLod(FX_lodToValue(lodlevel)+level), - FX_largeLodLog2(ti->info), - FX_aspectRatioLog2(ti->info), - ti->info.format, - GR_MIPMAPLEVELMASK_ODD, - data, - yoffset,yoffset+height-1); - - FX_grTexDownloadMipMapLevelPartial(GR_TMU1, - ti->tm[FX_TMU1]->startAddr, - FX_valueToLod(FX_lodToValue(lodlevel)+level), - FX_largeLodLog2(ti->info), - FX_aspectRatioLog2(ti->info), - ti->info.format, - GR_MIPMAPLEVELMASK_EVEN, - data, - yoffset,yoffset+height-1); - break; - case FX_TMU_BOTH: - FX_grTexDownloadMipMapLevelPartial(GR_TMU0, - ti->tm[FX_TMU0]->startAddr, - FX_valueToLod(FX_lodToValue(lodlevel)+level), - FX_largeLodLog2(ti->info), - FX_aspectRatioLog2(ti->info), - ti->info.format, - GR_MIPMAPLEVELMASK_BOTH, - data, - yoffset,yoffset+height-1); - - FX_grTexDownloadMipMapLevelPartial(GR_TMU1, - ti->tm[FX_TMU1]->startAddr, - FX_valueToLod(FX_lodToValue(lodlevel)+level), - FX_largeLodLog2(ti->info), - FX_aspectRatioLog2(ti->info), - ti->info.format, - GR_MIPMAPLEVELMASK_BOTH, - data, - yoffset,yoffset+height-1); - break; - default: - fprintf(stderr,"fx Driver: internal error in fxTMReloadSubMipMapLevel() -> wrong tmu (%d)\n",tmu); - fxCloseHardware(); - exit(-1); - } -} - -void fxTMMoveOutTM(fxMesaContext fxMesa, struct gl_texture_object *tObj) -{ - tfxTexInfo *ti=fxTMGetTexInfo(tObj); - - if (MESA_VERBOSE&VERBOSE_DRIVER) { - fprintf(stderr,"fxmesa: fxTMMoveOutTM(%x (%d))\n",(GLuint)tObj,tObj->Name); - } - - if (!ti->isInTM) return; - - switch(ti->whichTMU) { - case FX_TMU0: - case FX_TMU1: - fxTMRemoveRange(fxMesa, (int)ti->whichTMU, ti->tm[ti->whichTMU]); - break; - case FX_TMU_SPLIT: - case FX_TMU_BOTH: - fxTMRemoveRange(fxMesa, FX_TMU0, ti->tm[FX_TMU0]); - fxTMRemoveRange(fxMesa, FX_TMU1, ti->tm[FX_TMU1]); - break; - default: - fprintf(stderr,"fx Driver: internal error in fxTMMoveOutTM()\n"); - fxCloseHardware(); - exit(-1); - } - - ti->isInTM=GL_FALSE; - ti->whichTMU=FX_TMU_NONE; -} - -void fxTMFreeTexture(fxMesaContext fxMesa, struct gl_texture_object *tObj) -{ - tfxTexInfo *ti=fxTMGetTexInfo(tObj); - int i; - - fxTMMoveOutTM(fxMesa, tObj); - - for (i=0; imipmapLevel[i].data) { - FREE(ti->mipmapLevel[i].data); - ti->mipmapLevel[i].data = NULL; - } - } - switch (ti->whichTMU) { - case FX_TMU0: - case FX_TMU1: - fxTMDeleteRangeNode(fxMesa, ti->tm[ti->whichTMU]); - break; - case FX_TMU_SPLIT: - case FX_TMU_BOTH: - fxTMDeleteRangeNode(fxMesa, ti->tm[FX_TMU0]); - fxTMDeleteRangeNode(fxMesa, ti->tm[FX_TMU1]); - break; - } -} - -void fxTMInit(fxMesaContext fxMesa) -{ - fxMesa->texBindNumber=0; - fxMesa->tmPool=0; - - fxTMUInit(fxMesa,FX_TMU0); - - if(fxMesa->haveTwoTMUs) - fxTMUInit(fxMesa,FX_TMU1); -} - -void fxTMClose(fxMesaContext fxMesa) -{ - MemRange *tmp, *next; - - tmp=fxMesa->tmPool; - while (tmp) { - next=tmp->next; - FREE(tmp); - tmp=next; - } - tmp=fxMesa->tmFree[FX_TMU0]; - while (tmp) { - next=tmp->next; - FREE(tmp); - tmp=next; - } - if (fxMesa->haveTwoTMUs) { - tmp=fxMesa->tmFree[FX_TMU1]; - while (tmp) { - next=tmp->next; - FREE(tmp); - tmp=next; - } - } -} - -void -fxTMRestoreTextures_NoLock(fxMesaContext ctx) { - tfxTexInfo *ti; - struct gl_texture_object *tObj; - int i, where; - - tObj=ctx->glCtx->Shared->TexObjectList; - while (tObj) { - ti=fxTMGetTexInfo(tObj); - if (ti && ti->isInTM) { - for (i=0; iglCtx->Texture.Unit[i].Current==tObj) { - /* Force the texture onto the board, as it could be in use */ - where=ti->whichTMU; - fxTMMoveOutTM_NoLock(ctx, tObj); - fxTMMoveInTM_NoLock(ctx, tObj, where); - break; - } - if (i==MAX_TEXTURE_UNITS) /* Mark the texture as off the board */ - fxTMMoveOutTM_NoLock(ctx, tObj); - } - tObj=tObj->Next; - } -} - -#else - - -/* - * Need this to provide at least one external definition. - */ - -int gl_fx_dummy_function_texman(void) -{ - return 0; -} - -#endif /* FX */ Index: xc/extras/Mesa/src/FX/fxtrifuncs.c diff -u xc/extras/Mesa/src/FX/fxtrifuncs.c:1.4 xc/extras/Mesa/src/FX/fxtrifuncs.c:removed --- xc/extras/Mesa/src/FX/fxtrifuncs.c:1.4 Fri Jun 16 20:02:34 2000 +++ xc/extras/Mesa/src/FX/fxtrifuncs.c Mon Dec 18 14:21:52 2000 @@ -1,372 +0,0 @@ -/* -*- mode: C; tab-width:8; c-basic-offset:2 -*- */ - -/* - * Mesa 3-D graphics library - * Version: 3.3 - * - * Copyright (C) 1999-2000 Brian Paul All Rights Reserved. - * - * 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 - * BRIAN PAUL 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. - * - * - * Original Mesa / 3Dfx device driver (C) 1999 David Bucciarelli, by the - * terms stated above. - * - * Thank you for your contribution, David! - * - * Please make note of the above copyright/license statement. If you - * contributed code or bug fixes to this code under the previous (GNU - * Library) license and object to the new license, your code will be - * removed at your request. Please see the Mesa docs/COPYRIGHT file - * for more information. - * - * Additional Mesa/3Dfx driver developers: - * Daryll Strauss - * Keith Whitwell - * - * See fxapi.h for more revision/author details. - */ - - -/* fxtris.c - 3Dfx VooDoo triangle functions */ - - -#ifdef HAVE_CONFIG_H -#include "conf.h" -#endif - -#if defined(FX) - -#include "fxdrv.h" -#include "../mmath.h" - - - -/* Is this enough? Do we need more triangle funcs? - */ -static triangle_func tri_tab[0x40]; /* only 0x20 actually used */ -static quad_func quad_tab[0x40]; /* only 0x20 actually used */ -static line_func line_tab[0x40]; /* less than 0x20 used */ -static points_func points_tab[0x40]; /* less than 0x20 used */ - -#define IND (0) -#define TAG(x) x -#include "fxtritmp.h" - -#define IND (FX_OFFSET) -#define TAG(x) x##_offset -#include "fxtritmp.h" - -#define IND (FX_TWOSIDE) -#define TAG(x) x##_twoside -#include "fxtritmp.h" - -#define IND (FX_TWOSIDE|FX_OFFSET) -#define TAG(x) x##_twoside_offset -#include "fxtritmp.h" - -#define IND (FX_FRONT_BACK) -#define TAG(x) x##_front_back -#include "fxtritmp.h" - -#define IND (FX_FRONT_BACK|FX_OFFSET) -#define TAG(x) x##_front_back_offset -#include "fxtritmp.h" - -#define IND (FX_FRONT_BACK|FX_TWOSIDE) -#define TAG(x) x##_front_back_twoside -#include "fxtritmp.h" - -#define IND (FX_FRONT_BACK|FX_TWOSIDE|FX_OFFSET) -#define TAG(x) x##_front_back_twoside_offset -#include "fxtritmp.h" - -#define IND (FX_FLAT) -#define TAG(x) x##_flat -#include "fxtritmp.h" - -#define IND (FX_FLAT|FX_OFFSET) -#define TAG(x) x##_flat_offset -#include "fxtritmp.h" - -#define IND (FX_FLAT|FX_TWOSIDE) -#define TAG(x) x##_flat_twoside -#include "fxtritmp.h" - -#define IND (FX_FLAT|FX_TWOSIDE|FX_OFFSET) -#define TAG(x) x##_flat_twoside_offset -#include "fxtritmp.h" - -#define IND (FX_FLAT|FX_FRONT_BACK) -#define TAG(x) x##_flat_front_back -#include "fxtritmp.h" - -#define IND (FX_FLAT|FX_FRONT_BACK|FX_OFFSET) -#define TAG(x) x##_flat_front_back_offset -#include "fxtritmp.h" - -#define IND (FX_FLAT|FX_FRONT_BACK|FX_TWOSIDE) -#define TAG(x) x##_flat_front_back_twoside -#include "fxtritmp.h" - -#define IND (FX_FLAT|FX_FRONT_BACK|FX_TWOSIDE|FX_OFFSET) -#define TAG(x) x##_flat_front_back_twoside_offset -#include "fxtritmp.h" - -/* We don't actually do antialiasing correctly. Geometry has to be - sorted for glide's antialiasing to operate */ -#if 0 -#define IND (FX_ANTIALIAS) -#define TAG(x) x##_aa -#include "fxtritmp.h" - -#define IND (FX_ANTIALIAS|FX_OFFSET) -#define TAG(x) x##_aa_offset -#include "fxtritmp.h" - -#define IND (FX_ANTIALIAS|FX_TWOSIDE) -#define TAG(x) x##_aa_twoside -#include "fxtritmp.h" - -#define IND (FX_ANTIALIAS|FX_TWOSIDE|FX_OFFSET) -#define TAG(x) x##_aa_twoside_offset -#include "fxtritmp.h" - -#define IND (FX_ANTIALIAS|FX_FRONT_BACK) -#define TAG(x) x##_aa_front_back -#include "fxtritmp.h" - -#define IND (FX_ANTIALIAS|FX_FRONT_BACK|FX_OFFSET) -#define TAG(x) x##_aa_front_back_offset -#include "fxtritmp.h" - -#define IND (FX_ANTIALIAS|FX_FRONT_BACK|FX_TWOSIDE) -#define TAG(x) x##_aa_front_back_twoside -#include "fxtritmp.h" - -#define IND (FX_ANTIALIAS|FX_FRONT_BACK|FX_TWOSIDE|FX_OFFSET) -#define TAG(x) x##_aa_front_back_twoside_offset -#include "fxtritmp.h" - -#define IND (FX_ANTIALIAS|FX_FLAT) -#define TAG(x) x##_aa_flat -#include "fxtritmp.h" - -#define IND (FX_ANTIALIAS|FX_FLAT|FX_OFFSET) -#define TAG(x) x##_aa_flat_offset -#include "fxtritmp.h" - -#define IND (FX_ANTIALIAS|FX_FLAT|FX_TWOSIDE) -#define TAG(x) x##_aa_flat_twoside -#include "fxtritmp.h" - -#define IND (FX_ANTIALIAS|FX_FLAT|FX_TWOSIDE|FX_OFFSET) -#define TAG(x) x##_aa_flat_twoside_offset -#include "fxtritmp.h" - -#define IND (FX_ANTIALIAS|FX_FLAT|FX_FRONT_BACK) -#define TAG(x) x##_aa_flat_front_back -#include "fxtritmp.h" - -#define IND (FX_ANTIALIAS|FX_FLAT|FX_FRONT_BACK|FX_OFFSET) -#define TAG(x) x##_aa_flat_front_back_offset -#include "fxtritmp.h" - -#define IND (FX_ANTIALIAS|FX_FLAT|FX_FRONT_BACK|FX_TWOSIDE) -#define TAG(x) x##_aa_flat_front_back_twoside -#include "fxtritmp.h" - -#define IND (FX_ANTIALIAS|FX_FLAT|FX_FRONT_BACK|FX_TWOSIDE|FX_OFFSET) -#define TAG(x) x##_aa_flat_front_back_twoside_offset -#include "fxtritmp.h" -#endif - -void fxDDTrifuncInit() -{ - init(); - init_offset(); - init_twoside(); - init_twoside_offset(); - init_front_back(); - init_front_back_offset(); - init_front_back_twoside(); - init_front_back_twoside_offset(); - init_flat(); - init_flat_offset(); - init_flat_twoside(); - init_flat_twoside_offset(); - init_flat_front_back(); - init_flat_front_back_offset(); - init_flat_front_back_twoside(); - init_flat_front_back_twoside_offset(); -#if 0 - init_aa(); - init_aa_offset(); - init_aa_twoside(); - init_aa_twoside_offset(); - init_aa_front_back(); - init_aa_front_back_offset(); - init_aa_front_back_twoside(); - init_aa_front_back_twoside_offset(); - init_aa_flat(); - init_aa_flat_offset(); - init_aa_flat_twoside(); - init_aa_flat_twoside_offset(); - init_aa_flat_front_back(); - init_aa_flat_front_back_offset(); - init_aa_flat_front_back_twoside(); - init_aa_flat_front_back_twoside_offset(); -#endif -} - -void fxPrintRenderState( const char *msg, GLuint state ) -{ - fprintf(stderr, "%s: (%x) %s%s%s%s%s%s\n", - msg, state, - (state & FX_ANTIALIAS) ? "antialias, " : "", - (state & FX_FLAT) ? "flat, " : "", - (state & FX_TWOSIDE) ? "twoside, " : "", - (state & FX_OFFSET) ? "offset, " : "", - (state & FX_FRONT_BACK) ? "front-back, " : "", - (state & FX_FALLBACK) ? "fallback" : ""); -} - - -void fxPrintHintState( const char *msg, GLuint state ) -{ - fprintf(stderr, "%s: (%x) %s %s%s %s%s\n", - msg, state, - (state & GR_STWHINT_W_DIFF_FBI) ? "w-fbi, " : "", - (state & GR_STWHINT_W_DIFF_TMU0) ? "w-tmu0, " : "", - (state & GR_STWHINT_ST_DIFF_TMU0) ? "st-tmu0, " : "", - (state & GR_STWHINT_W_DIFF_TMU1) ? "w-tmu1, " : "", - (state & GR_STWHINT_ST_DIFF_TMU1) ? "st-tmu1, " : ""); - -} - - -void fxDDChooseRenderState( GLcontext *ctx ) -{ - fxMesaContext fxMesa=(fxMesaContext)ctx->DriverCtx; - GLuint ind = 0; - GLuint flags = ctx->TriangleCaps; - - ctx->IndirectTriangles &= ~DD_SW_RASTERIZE; - - if (flags) { - if (fxMesa->render_index & FX_OFFSET) - FX_grDepthBiasLevel(0); - - if (flags & (DD_SELECT|DD_FEEDBACK)) { - fxMesa->PointsFunc = 0; - fxMesa->LineFunc = 0; - fxMesa->TriangleFunc = 0; - fxMesa->QuadFunc = 0; - fxMesa->render_index = FX_FALLBACK; - ctx->IndirectTriangles |= DD_SW_RASTERIZE; -#if 0 - fprintf(stderr, "Fallback select|feeback\n"); -#endif - return; - } - - if (flags & DD_FLATSHADE) ind |= FX_FLAT; - if (flags & DD_TRI_LIGHT_TWOSIDE) ind |= FX_TWOSIDE; - if (flags & DD_MULTIDRAW) ind |= FX_FRONT_BACK; - if (flags & (DD_POINT_ATTEN|DD_POINT_SMOOTH)) { - ind |= FX_FALLBACK; -#if 0 - if (flags&DD_POINT_ATTEN) - fprintf(stderr, "Fallback point atten\n"); - if (flags&DD_POINT_SMOOTH) - fprintf(stderr, "Fallback point smooth\n"); -#endif - } - - fxMesa->render_index = ind; - fxMesa->PointsFunc = points_tab[ind]; - if (ind&FX_FALLBACK) - ctx->IndirectTriangles |= DD_POINT_SW_RASTERIZE; - ind &= ~(FX_ANTIALIAS|FX_FALLBACK); - - if (flags & (DD_LINE_STIPPLE|DD_LINE_SMOOTH)) { - ind |= FX_FALLBACK; -#if 0 - if (flags&DD_LINE_STIPPLE) - fprintf(stderr, "Fallback line stipple\n"); - if (flags&DD_LINE_SMOOTH) - fprintf(stderr, "Fallback line smooth\n"); -#endif - } - - fxMesa->render_index |= ind; - fxMesa->LineFunc = line_tab[ind]; - if (ind&FX_FALLBACK) - ctx->IndirectTriangles |= DD_LINE_SW_RASTERIZE; - ind &= ~(FX_ANTIALIAS|FX_FALLBACK); - - if (flags & DD_TRI_OFFSET) ind |= FX_OFFSET; - if (flags & (DD_TRI_UNFILLED|DD_TRI_STIPPLE|DD_TRI_SMOOTH)) { - ind |= FX_FALLBACK; -#if 0 - if (flags&DD_TRI_UNFILLED) - fprintf(stderr, "Fallback tri unfilled\n"); - if (flags&DD_TRI_STIPPLE) - fprintf(stderr, "Fallback tri stippled\n"); - if (flags&DD_TRI_SMOOTH) - fprintf(stderr, "Fallback tri smooth\n"); -#endif - } - - fxMesa->render_index |= ind; - fxMesa->TriangleFunc = tri_tab[ind]; - fxMesa->QuadFunc = quad_tab[ind]; - - if (ind&FX_FALLBACK) - ctx->IndirectTriangles |= DD_TRI_SW_RASTERIZE | DD_QUAD_SW_RASTERIZE; - } - else if (fxMesa->render_index) - { - if (fxMesa->render_index & FX_OFFSET) - FX_grDepthBiasLevel(0); - - fxMesa->render_index = 0; - fxMesa->PointsFunc = points_tab[0]; - fxMesa->LineFunc = line_tab[0]; - fxMesa->TriangleFunc = tri_tab[0]; - fxMesa->QuadFunc = quad_tab[0]; - } - - if (MESA_VERBOSE&(VERBOSE_STATE|VERBOSE_DRIVER)) - fxPrintRenderState("fxmesa: Render state", fxMesa->render_index); -} - -#else - - -/* - * Need this to provide at least one external definition. - */ - -extern int gl_fx_dummy_function_tris(void); -int gl_fx_dummy_function_tris(void) -{ - return 0; -} - -#endif /* FX */ Index: xc/extras/Mesa/src/FX/fxtritmp.h diff -u xc/extras/Mesa/src/FX/fxtritmp.h:1.3 xc/extras/Mesa/src/FX/fxtritmp.h:removed --- xc/extras/Mesa/src/FX/fxtritmp.h:1.3 Fri Jun 16 20:02:34 2000 +++ xc/extras/Mesa/src/FX/fxtritmp.h Mon Dec 18 14:21:52 2000 @@ -1,474 +0,0 @@ -/* -*- mode: C; tab-width:8; c-basic-offset:2 -*- */ - -/* - * Mesa 3-D graphics library - * Version: 3.3 - * - * Copyright (C) 1999-2000 Brian Paul All Rights Reserved. - * - * 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 - * BRIAN PAUL 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. - * - * - * Original Mesa / 3Dfx device driver (C) 1999 David Bucciarelli, by the - * terms stated above. - * - * Thank you for your contribution, David! - * - * Please make note of the above copyright/license statement. If you - * contributed code or bug fixes to this code under the previous (GNU - * Library) license and object to the new license, your code will be - * removed at your request. Please see the Mesa docs/COPYRIGHT file - * for more information. - * - * Additional Mesa/3Dfx driver developers: - * Daryll Strauss - * Keith Whitwell - * - * See fxapi.h for more revision/author details. - */ - - -static void TAG(fx_tri)(GLcontext *ctx, GLuint e1, GLuint e2, GLuint e3, GLuint pv) -{ - fxMesaContext fxMesa=(fxMesaContext)ctx->DriverCtx; - struct vertex_buffer *VB=ctx->VB; - fxVertex *gWin = FX_DRIVER_DATA(VB)->verts; - GrVertex *v1 = (GrVertex *)gWin[e1].f; - GrVertex *v2 = (GrVertex *)gWin[e2].f; - GrVertex *v3 = (GrVertex *)gWin[e3].f; - - (void) fxMesa; - - if (IND & (FX_TWOSIDE|FX_OFFSET)) - { - GLfloat ex = v1->x - v3->x; - GLfloat ey = v1->y - v3->y; - GLfloat fx = v2->x - v3->x; - GLfloat fy = v2->y - v3->y; - GLfloat c = ex*fy-ey*fx; - - if (IND & FX_TWOSIDE) { - GLuint facing = (c<0.0) ^ ctx->Polygon.FrontBit; - GLubyte (*color)[4] = VB->Color[facing]->data; - if (IND & FX_FLAT) { - GOURAUD2(v1,color[pv]); - GOURAUD2(v2,color[pv]); - GOURAUD2(v3,color[pv]); - } else { - GOURAUD2(v1,color[e1]); - GOURAUD2(v2,color[e2]); - GOURAUD2(v3,color[e3]); - } - } - - /* Should apply a factor to ac to compensate for different x/y - * scaling introduced in the Viewport matrix. - * - * The driver should supply scaling factors for 'factor' and 'units'. - */ - if (IND & FX_OFFSET) { - GLfloat offset = ctx->Polygon.OffsetUnits; - - if (c * c > 1e-16) { - GLfloat factor = ctx->Polygon.OffsetFactor; - GLfloat ez = v1->ooz - v3->ooz; - GLfloat fz = v2->ooz - v3->ooz; - GLfloat a = ey*fz-ez*fy; - GLfloat b = ez*fx-ex*fz; - GLfloat ic = 1.0 / c; - GLfloat ac = a * ic; - GLfloat bc = b * ic; - if (ac<0.0F) ac = -ac; - if (bc<0.0F) bc = -bc; - offset += MAX2( ac, bc ) * factor; - } - /* Probably a lot quicker just to nudge the z values and put - * them back afterwards. - */ - FX_grDepthBiasLevel((int)offset); - } - } - else if (IND & FX_FLAT) { - GLubyte (*color)[4] = VB->Color[0]->data; - GOURAUD2(v1,color[pv]); - GOURAUD2(v2,color[pv]); - GOURAUD2(v3,color[pv]); - } - - if (IND & FX_FRONT_BACK) { - FX_grColorMask(ctx->Color.ColorMask[RCOMP] || - ctx->Color.ColorMask[GCOMP] || - ctx->Color.ColorMask[BCOMP], - FXFALSE); - - FX_grDepthMask(FXFALSE); - FX_grRenderBuffer(GR_BUFFER_BACKBUFFER); - } - - if (IND & FX_ANTIALIAS) - FX_grAADrawTriangle(v1, v2, v3, FXTRUE, FXTRUE, FXTRUE); - else - FX_grDrawTriangle(v1, v2, v3); - - /* Might be quicker to do two passes, one for each buffer? - */ - if (IND & FX_FRONT_BACK) { - FX_grColorMask(ctx->Color.ColorMask[RCOMP] || - ctx->Color.ColorMask[GCOMP] || - ctx->Color.ColorMask[BCOMP], - ctx->Color.ColorMask[ACOMP] && fxMesa->haveAlphaBuffer); - - if(ctx->Depth.Mask) FX_grDepthMask(FXTRUE); - - FX_grRenderBuffer(GR_BUFFER_FRONTBUFFER); - - if (IND & FX_ANTIALIAS) - FX_grAADrawTriangle(v1,v2,v3, FXTRUE,FXTRUE,FXTRUE); - else - FX_grDrawTriangle(v1, v2, v3); - } -} - - -/* Not worth the space? - */ -static void TAG(fx_quad)(GLcontext *ctx, GLuint e1, GLuint e2, GLuint e3, - GLuint e4, GLuint pv) -{ - fxMesaContext fxMesa=(fxMesaContext)ctx->DriverCtx; - struct vertex_buffer *VB=ctx->VB; - fxVertex *gWin = FX_DRIVER_DATA(VB)->verts; - GrVertex *v1 = (GrVertex *)gWin[e1].f; - GrVertex *v2 = (GrVertex *)gWin[e2].f; - GrVertex *v3 = (GrVertex *)gWin[e3].f; - GrVertex *v4 = (GrVertex *)gWin[e4].f; - - (void) fxMesa; - - if (IND & (FX_TWOSIDE|FX_OFFSET)) - { - GLfloat ex = v3->x - v1->x; - GLfloat ey = v3->y - v1->y; - GLfloat fx = v4->x - v2->x; - GLfloat fy = v4->y - v2->y; - GLfloat c = ex*fy-ey*fx; - - if (IND & FX_TWOSIDE) { - GLuint facing = (c<0.0) ^ ctx->Polygon.FrontBit; - GLubyte (*color)[4] = VB->Color[facing]->data; - if (IND & FX_FLAT) { - GOURAUD2(v1,color[pv]); - GOURAUD2(v2,color[pv]); - GOURAUD2(v3,color[pv]); - GOURAUD2(v4,color[pv]); - } else { - GOURAUD2(v1,color[e1]); - GOURAUD2(v2,color[e2]); - GOURAUD2(v3,color[e3]); - GOURAUD2(v4,color[e4]); - } - } - - /* Should apply a factor to ac to compensate for different x/y - * scaling introduced in the Viewport matrix. - * - * The driver should supply scaling factors for 'factor' and 'units'. - */ - if (IND & FX_OFFSET) { - GLfloat offset = ctx->Polygon.OffsetUnits; - - if (c * c > 1e-16) { - GLfloat factor = ctx->Polygon.OffsetFactor; - GLfloat ez = v3->ooz - v1->ooz; - GLfloat fz = v4->ooz - v2->ooz; - GLfloat a = ey*fz-ez*fy; - GLfloat b = ez*fx-ex*fz; - GLfloat ic = 1.0 / c; - GLfloat ac = a * ic; - GLfloat bc = b * ic; - if (ac<0.0F) ac = -ac; - if (bc<0.0F) bc = -bc; - offset += MAX2( ac, bc ) * factor; - } - /* Probably a lot quicker just to nudge the z values and put - * them back afterwards. - */ - FX_grDepthBiasLevel((int)offset); - } - } - else if (IND & FX_FLAT) { - GLubyte (*color)[4] = VB->Color[0]->data; - GOURAUD2(v1,color[pv]); - GOURAUD2(v2,color[pv]); - GOURAUD2(v3,color[pv]); - GOURAUD2(v4,color[pv]); - } - - if (IND & FX_FRONT_BACK) { - FX_grColorMask(ctx->Color.ColorMask[RCOMP] || - ctx->Color.ColorMask[GCOMP] || - ctx->Color.ColorMask[BCOMP], - FXFALSE); - - FX_grDepthMask(FXFALSE); - FX_grRenderBuffer(GR_BUFFER_BACKBUFFER); - } - - if (IND & FX_ANTIALIAS) { - FX_grAADrawTriangle(v1, v2, v4, FXTRUE, FXTRUE, FXTRUE); - FX_grAADrawTriangle(v2, v3, v4, FXTRUE, FXTRUE, FXTRUE); - } else { - FX_grDrawTriangle(v1, v2, v4); - FX_grDrawTriangle(v2, v3, v4); - } - - /* Might be quicker to do two passes, one for each buffer? - */ - if (IND & FX_FRONT_BACK) { - FX_grColorMask(ctx->Color.ColorMask[RCOMP] || - ctx->Color.ColorMask[GCOMP] || - ctx->Color.ColorMask[BCOMP], - ctx->Color.ColorMask[ACOMP] && fxMesa->haveAlphaBuffer); - - if(ctx->Depth.Mask) FX_grDepthMask(FXTRUE); - - FX_grRenderBuffer(GR_BUFFER_FRONTBUFFER); - - if (IND & FX_ANTIALIAS) { - FX_grAADrawTriangle(v1, v2, v4, FXTRUE, FXTRUE, FXTRUE); - FX_grAADrawTriangle(v2, v3, v4, FXTRUE, FXTRUE, FXTRUE); - } else { - FX_grDrawTriangle(v1, v2, v4); - FX_grDrawTriangle(v2, v3, v4); - } - } -} - -#define DRAW_LINE(tmp0, tmp1, width) \ - do { \ - const float xoff = 0.125, yoff = 0.125; \ - GrVertex verts[4]; \ - float dx, dy, wx, wy; \ - \ - dx = tmp0->x - tmp1->x; \ - dy = tmp0->y - tmp1->y; \ - \ - if (dx * dx > dy * dy) { \ - wx = 0; \ - wy = width; \ - } else { \ - wx = width; \ - wy = 0; \ - } \ - \ - verts[0] = *tmp0; \ - verts[1] = *tmp0; \ - verts[2] = *tmp1; \ - verts[3] = *tmp1; \ - \ - verts[0].x = tmp0->x - wx + xoff; \ - verts[0].y = tmp0->y - wy + yoff; \ - \ - verts[1].x = tmp0->x + wx + xoff; \ - verts[1].y = tmp0->y + wy + yoff; \ - \ - verts[2].x = tmp1->x + wx + xoff; \ - verts[2].y = tmp1->y + wy + yoff; \ - \ - verts[3].x = tmp1->x - wx + xoff; \ - verts[3].y = tmp1->y - wy + yoff; \ - \ - FX_grDrawPolygonVertexList(4, verts); \ - } while (0) - -#if (IND & FX_OFFSET) == 0 -static void TAG(fx_line)(GLcontext *ctx, GLuint e1, GLuint e2, GLuint pv) -{ - fxMesaContext fxMesa=(fxMesaContext)ctx->DriverCtx; - struct vertex_buffer *VB=ctx->VB; - fxVertex *gWin = FX_DRIVER_DATA(VB)->verts; - GLubyte (* const color)[4] = VB->ColorPtr->data; - GrVertex *v1 = (GrVertex *)gWin[e1].f; - GrVertex *v2 = (GrVertex *)gWin[e2].f; - GLfloat w = ctx->Line.Width*.5; - - if (IND & FX_FLAT) { - v1->r = v2->r = UBYTE_COLOR_TO_FLOAT_255_COLOR(color[pv][0]); - v1->g = v2->g = UBYTE_COLOR_TO_FLOAT_255_COLOR(color[pv][1]); - v1->b = v2->b = UBYTE_COLOR_TO_FLOAT_255_COLOR(color[pv][2]); - v1->a = v2->a = UBYTE_COLOR_TO_FLOAT_255_COLOR(color[pv][3]); - } - else if (IND & FX_TWOSIDE) - { - /* XXX use signed area of the polygon to determine front/back color choice */ - GOURAUD2(v1,color[e1]); - GOURAUD2(v2,color[e2]); - } - - if (IND & FX_FRONT_BACK) { - FX_grColorMask(ctx->Color.ColorMask[RCOMP] || - ctx->Color.ColorMask[GCOMP] || - ctx->Color.ColorMask[BCOMP], - FXFALSE); - FX_grDepthMask(FXFALSE); - FX_grRenderBuffer(GR_BUFFER_BACKBUFFER); - } - - if (IND & FX_ANTIALIAS) - FX_grAADrawLine(v1,v2); - else - DRAW_LINE(v1,v2,w); - - if (IND & FX_FRONT_BACK) { - FX_grColorMask(ctx->Color.ColorMask[RCOMP] || - ctx->Color.ColorMask[GCOMP] || - ctx->Color.ColorMask[BCOMP], - ctx->Color.ColorMask[ACOMP] && fxMesa->haveAlphaBuffer); - - if(ctx->Depth.Mask) - FX_grDepthMask(FXTRUE); - - FX_grRenderBuffer(GR_BUFFER_FRONTBUFFER); - - if (IND & FX_ANTIALIAS) - FX_grAADrawLine(v1,v2); - else - DRAW_LINE(v1,v2,w); - } -} -#endif - - -#if (IND & FX_OFFSET) == 0 - -#if IND & FX_FLAT -# if IND & FX_ANTIALIAS -#if FX_USE_PARGB -# define FLAT_COLOR(x,y) GET_PA(gWin[i].f) = y[3]; -#else -# define FLAT_COLOR(x,y) gWin[i].f[ACOORD] = y[3]; \ - FX_VB_COLOR(x, y) -#endif -# else -# define FLAT_COLOR(x,y) FX_VB_COLOR(x, y) -# endif -#else -#define FLAT_COLOR(x,y) -#endif - - -#define DRAW_POINT(i, sz) \ - do { \ - GrVertex verts[4], *tmp; \ - \ - tmp = (GrVertex*)gWin[i].f; \ - verts[0] = *tmp; \ - verts[1] = *tmp; \ - verts[2] = *tmp; \ - verts[3] = *tmp; \ - verts[0].x = verts[3].x = tmp->x + sz; \ - verts[0].y = verts[1].y = tmp->y + sz; \ - verts[2].x = verts[1].x = tmp->x - sz; \ - verts[2].y = verts[3].y = tmp->y - sz; \ - \ - FX_grDrawPolygonVertexList(4, verts); \ - } while (0) - -static void TAG(fx_points)(GLcontext *ctx, GLuint first, GLuint last) -{ - fxMesaContext fxMesa=(fxMesaContext)ctx->DriverCtx; - struct vertex_buffer *VB = ctx->VB; - fxVertex *gWin = FX_DRIVER_DATA(VB)->verts; - GLubyte (*color)[4] = VB->ColorPtr->data; - GLuint i; - GLfloat sz = ctx->Point.Size * .5; - - (void) color; (void) fxMesa; - - if (IND & FX_FRONT_BACK) { - FX_grColorMask(ctx->Color.ColorMask[RCOMP] || - ctx->Color.ColorMask[GCOMP] || - ctx->Color.ColorMask[BCOMP], - FXFALSE); - - FX_grDepthMask(FXFALSE); - FX_grRenderBuffer(GR_BUFFER_BACKBUFFER); - } - - if(!VB->ClipOrMask) { - for(i=first;i<=last;i++) { - FLAT_COLOR(fxMesa, color[i]); - DRAW_POINT(i, sz); - } - } else { - for(i=first;i<=last;i++) { - if(VB->ClipMask[i]==0) { - FLAT_COLOR(fxMesa, color[i]); - DRAW_POINT(i, sz); - } - } - } - - if (IND & FX_FRONT_BACK) { - FX_grColorMask(ctx->Color.ColorMask[RCOMP] || - ctx->Color.ColorMask[GCOMP] || - ctx->Color.ColorMask[BCOMP], - ctx->Color.ColorMask[ACOMP] && fxMesa->haveAlphaBuffer); - if(ctx->Depth.Mask) - FX_grDepthMask(FXTRUE); - FX_grRenderBuffer(GR_BUFFER_FRONTBUFFER); - - - if(!VB->ClipOrMask) { - for(i=first;i<=last;i++) { - FLAT_COLOR(fxMesa, color[i]); - DRAW_POINT(i, sz); - } - } else { - for(i=first;i<=last;i++) { - if(VB->ClipMask[i]==0) { - FLAT_COLOR(fxMesa, color[i]); - DRAW_POINT(i, sz); - } - } - } - } -} - -#endif - - - -static void TAG(init)( void ) -{ - tri_tab[IND] = TAG(fx_tri); - quad_tab[IND] = TAG(fx_quad); - -#if ((IND & FX_OFFSET) == 0) - line_tab[IND] = TAG(fx_line); - points_tab[IND] = TAG(fx_points); -#else - line_tab[IND] = line_tab[IND & ~FX_OFFSET]; - points_tab[IND] = points_tab[IND & ~FX_OFFSET]; -#endif -} - -#undef IND -#undef TAG -#undef FLAT_COLOR -#undef DRAW_POINT Index: xc/extras/Mesa/src/FX/fxvs_tmp.h diff -u xc/extras/Mesa/src/FX/fxvs_tmp.h:1.3 xc/extras/Mesa/src/FX/fxvs_tmp.h:removed --- xc/extras/Mesa/src/FX/fxvs_tmp.h:1.3 Fri Jun 16 20:02:34 2000 +++ xc/extras/Mesa/src/FX/fxvs_tmp.h Mon Dec 18 14:21:52 2000 @@ -1,215 +0,0 @@ -/* -*- mode: C; tab-width:8; c-basic-offset:2 -*- */ - -/* - * Mesa 3-D graphics library - * Version: 3.3 - * - * Copyright (C) 1999-2000 Brian Paul All Rights Reserved. - * - * 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 - * BRIAN PAUL 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. - * - * - * Original Mesa / 3Dfx device driver (C) 1999 David Bucciarelli, by the - * terms stated above. - * - * Thank you for your contribution, David! - * - * Please make note of the above copyright/license statement. If you - * contributed code or bug fixes to this code under the previous (GNU - * Library) license and object to the new license, your code will be - * removed at your request. Please see the Mesa docs/COPYRIGHT file - * for more information. - * - * Additional Mesa/3Dfx driver developers: - * Daryll Strauss - * Keith Whitwell - * - * See fxapi.h for more revision/author details. - */ - - -#if (IND & (SETUP_XY|SETUP_W|SETUP_Z)) -#define V1 VARS_XY -#define I1 , INCR_XY -#else -#define V1 -#define I1 -#endif - -#if (IND & SETUP_XY) -#define S1 DO_SETUP_XY -#else -#define S1 -#endif - -#if (IND & SETUP_W) -#define S2 S1 DO_SETUP_W -#define V2 V1 VARS_W -#else -#define S2 S1 -#define V2 V1 -#endif - -#if (IND & SETUP_Z) -#define S3 S2 DO_SETUP_Z -#else -#define S3 S2 -#endif - -#if (IND & SETUP_RGBA) -#define V4 V2 VARS_RGBA -#define S4 S3 DO_SETUP_RGBA -#define I4 I1 , INCR_RGBA -#else -#define V4 V2 -#define S4 S3 -#define I4 I1 -#endif - -#if (IND & SETUP_TMU0) -#define V5 V4 VARS_TMU0 -#define S5 S4 DO_SETUP_TMU0 -#define I5 I4 , INCR_TMU0 -#define F5 FIXUP_TMU0 -#else -#define V5 V4 -#define S5 S4 -#define I5 I4 -#define F5 -#endif - -#if (IND & SETUP_TMU1) -#define V6 V5 VARS_TMU1 -#define S6 S5 DO_SETUP_TMU1 -#define I6 I5 , INCR_TMU1 -#define F6 F5 FIXUP_TMU1 -#else -#define V6 V5 -#define S6 S5 -#define I6 I5 -#define F6 F5 -#endif - -#if (IND & SETUP_TMU0) && (IND & SETUP_TMU1) -#define F7 FIXUP_TMU01 -#else -#define F7 F6 -#endif - -#define VARS V6 -#define DO_SETUP S6 -#define INCR I6 -#define FIXUP F7 - -static void NAME(struct vertex_buffer *VB, GLuint start, GLuint end) -{ - GLcontext *ctx = VB->ctx; - fxMesaContext fxMesa = (fxMesaContext)ctx->DriverCtx; - - if (fxMesa->new_state) - fxSetupFXUnits( ctx ); - - { - const float snapper = (3L<<18); - fxVertex *gWin = FX_DRIVER_DATA(VB)->verts; - GLfloat *v = gWin[start].f; - GLfloat *vend = gWin[end].f; - VARS; - - (void) gWin; - (void) fxMesa; - (void) snapper; - - if (VB->ClipOrMask) { - GLubyte *clipmask = &VB->ClipMask[start]; - for (;v!=vend;v+=16,clipmask++ INCR) { - if (*clipmask == 0) { - DO_SETUP; - } - } - } - else { - for (;v!=vend;v+=16 INCR) { - DO_SETUP; - } - } - - if (ctx->FogMode == FOG_FRAGMENT && ctx->ProjectionMatrix.m[15] != 0.0F) { - /* need to compute W values for fogging purposes */ - const GLfloat m10 = ctx->ProjectionMatrix.m[10]; - const GLfloat m14 = ctx->ProjectionMatrix.m[14]; - const GLfloat v10 = ctx->Viewport.WindowMap.m[10]; - const GLfloat v14 = ctx->Viewport.WindowMap.m[14]; - GLfloat *v = gWin[start].f; - GLfloat *win = VB->Win.data[start]; - if (VB->ClipOrMask) { - GLubyte *clipmask = &VB->ClipMask[start]; - for (;v!=vend;v+=16,clipmask++, win+=4) { - if (*clipmask == 0) { - GLfloat zNDC = (win[2] - v14) / v10; - GLfloat zEye = (zNDC - m14) / m10; - v[OOWCOORD] = -1.0F / zEye; - } - } - } - else { - for (;v!=vend;v+=16, win+=4) { - GLfloat zNDC = (win[2] - v14) / v10; - GLfloat zEye = (zNDC - m14) / m10; - v[OOWCOORD] = -1.0F / zEye; - } - } - } - - /* rare - I hope */ - FIXUP; - } -} - - -#undef V1 -#undef V2 -#undef V3 -#undef V4 -#undef V5 -#undef V6 -#undef VARS - -#undef S1 -#undef S2 -#undef S3 -#undef S4 -#undef S5 -#undef S6 -#undef DO_SETUP - -#undef I1 -#undef I4 -#undef I5 -#undef I6 -#undef INCR - -#undef F5 -#undef F6 -#undef F7 -#undef FIXUP - - -#undef IND -#undef NAME - Index: xc/extras/Mesa/src/FX/fxvsetup.c diff -u xc/extras/Mesa/src/FX/fxvsetup.c:1.5 xc/extras/Mesa/src/FX/fxvsetup.c:removed --- xc/extras/Mesa/src/FX/fxvsetup.c:1.5 Tue Jun 20 01:08:18 2000 +++ xc/extras/Mesa/src/FX/fxvsetup.c Mon Dec 18 14:21:53 2000 @@ -1,575 +0,0 @@ -/* -*- mode: C; tab-width:8; c-basic-offset:2 -*- */ - -/* - * Mesa 3-D graphics library - * Version: 3.3 - * - * Copyright (C) 1999-2000 Brian Paul All Rights Reserved. - * - * 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 - * BRIAN PAUL 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. - * - * - * Original Mesa / 3Dfx device driver (C) 1999 David Bucciarelli, by the - * terms stated above. - * - * Thank you for your contribution, David! - * - * Please make note of the above copyright/license statement. If you - * contributed code or bug fixes to this code under the previous (GNU - * Library) license and object to the new license, your code will be - * removed at your request. Please see the Mesa docs/COPYRIGHT file - * for more information. - * - * Additional Mesa/3Dfx driver developers: - * Daryll Strauss - * Keith Whitwell - * - * See fxapi.h for more revision/author details. - */ - - -/* fxvsetup.c - 3Dfx VooDoo vertices setup functions */ - - -#ifdef HAVE_CONFIG_H -#include "conf.h" -#endif - -#if defined(FX) - -#include "fxdrv.h" -#include "mmath.h" -#include "pipeline.h" -#include "fxvsetup.h" - -void fxPrintSetupFlags( const char *msg, GLuint flags ) -{ - fprintf(stderr, "%s: %d %s%s%s%s%s%s\n", - msg, - flags, - (flags & SETUP_XY) ? " xy," : "", - (flags & SETUP_Z) ? " z," : "", - (flags & SETUP_W) ? " w," : "", - (flags & SETUP_RGBA) ? " rgba," : "", - (flags & SETUP_TMU0) ? " tmu0," : "", - (flags & SETUP_TMU1) ? " tmu1," : ""); -} - -static void project_texcoords( struct vertex_buffer *VB, - GLuint tmu_nr, GLuint tc_nr, - GLuint start, GLuint count ) -{ - fxVertex *v = FX_DRIVER_DATA(VB)->verts + start; - GrTmuVertex *tmu = &(((GrVertex *)v->f)->tmuvtx[tmu_nr]); - GLvector4f *vec = VB->TexCoordPtr[tc_nr]; - - GLuint i; - GLuint stride = vec->stride; - GLfloat *data = VEC_ELT(vec, GLfloat, start); - - for (i = start ; i < count ; i++, STRIDE_F(data, stride), v++) { - tmu->oow = v->f[OOWCOORD] * data[3]; - tmu = (GrTmuVertex *)((char *)tmu + sizeof(fxVertex)); - } -} - - -static void copy_w( struct vertex_buffer *VB, - GLuint tmu_nr, - GLuint start, GLuint count ) -{ - fxVertex *v = FX_DRIVER_DATA(VB)->verts + start; - GrTmuVertex *tmu = &(((GrVertex *)v->f)->tmuvtx[tmu_nr]); - GLuint i; - - for (i = start ; i < count ; i++, v++) { - tmu->oow = v->f[OOWCOORD]; - tmu = (GrTmuVertex *)((char *)tmu + sizeof(fxVertex)); - } -} - - -static tfxSetupFunc setupfuncs[0x40]; - - - - -#define IND SETUP_XY -#define NAME fxsetupXY -#include "fxvs_tmp.h" - -#define IND (SETUP_XY|SETUP_Z) -#define NAME fxsetupXYZ -#include "fxvs_tmp.h" - -#define IND (SETUP_XY|SETUP_W) -#define NAME fxsetupXYW -#include "fxvs_tmp.h" - -#define IND (SETUP_XY|SETUP_Z|SETUP_W) -#define NAME fxsetupXYZW -#include "fxvs_tmp.h" - -#define IND (SETUP_RGBA|SETUP_XY) -#define NAME fxsetupXYRGBA -#include "fxvs_tmp.h" - -#define IND (SETUP_RGBA|SETUP_XY|SETUP_Z) -#define NAME fxsetupXYZRGBA -#include "fxvs_tmp.h" - -#define IND (SETUP_RGBA|SETUP_XY|SETUP_W) -#define NAME fxsetupXYWRGBA -#include "fxvs_tmp.h" - -#define IND (SETUP_RGBA|SETUP_XY|SETUP_Z|SETUP_W) -#define NAME fxsetupXYZWRGBA -#include "fxvs_tmp.h" - -#define IND (SETUP_TMU0|SETUP_XY|SETUP_W) -#define NAME fxsetupXYWT0 -#include "fxvs_tmp.h" - -#define IND (SETUP_TMU0|SETUP_XY|SETUP_Z|SETUP_W) -#define NAME fxsetupXYZWT0 -#include "fxvs_tmp.h" - -#define IND (SETUP_TMU1|SETUP_TMU0|SETUP_XY|SETUP_W) -#define NAME fxsetupXYWT0T1 -#include "fxvs_tmp.h" - -#define IND (SETUP_TMU1|SETUP_TMU0|SETUP_XY|SETUP_Z|SETUP_W) -#define NAME fxsetupXYZWT0T1 -#include "fxvs_tmp.h" - -#define IND (SETUP_TMU0|SETUP_RGBA|SETUP_XY|SETUP_W) -#define NAME fxsetupXYWRGBAT0 -#include "fxvs_tmp.h" - -#define IND (SETUP_TMU0|SETUP_RGBA|SETUP_XY|SETUP_Z|SETUP_W) -#define NAME fxsetupXYZWRGBAT0 -#include "fxvs_tmp.h" - -#define IND (SETUP_TMU1|SETUP_TMU0|SETUP_RGBA|SETUP_XY|SETUP_W) -#define NAME fxsetupXYWRGBAT0T1 -#include "fxvs_tmp.h" - -#define IND (SETUP_TMU1|SETUP_TMU0|SETUP_RGBA|SETUP_XY|SETUP_Z|SETUP_W) -#define NAME fxsetupXYZWRGBAT0T1 -#include "fxvs_tmp.h" - -#define IND (SETUP_RGBA) -#define NAME fxsetupRGBA -#include "fxvs_tmp.h" - -#define IND (SETUP_TMU0) -#define NAME fxsetupT0 -#include "fxvs_tmp.h" - -#define IND (SETUP_TMU1) -#define NAME fxsetupT1 -#include "fxvs_tmp.h" - -#define IND (SETUP_TMU1|SETUP_TMU0) -#define NAME fxsetupT0T1 -#include "fxvs_tmp.h" - -#define IND (SETUP_TMU0|SETUP_RGBA) -#define NAME fxsetupRGBAT0 -#include "fxvs_tmp.h" - -#define IND (SETUP_TMU1|SETUP_RGBA) -#define NAME fxsetupRGBAT1 -#include "fxvs_tmp.h" - -#define IND (SETUP_TMU1|SETUP_TMU0|SETUP_RGBA) -#define NAME fxsetupRGBAT0T1 -#include "fxvs_tmp.h" - -#define IND (SETUP_W|SETUP_RGBA) -#define NAME fxsetupWRGBA -#include "fxvs_tmp.h" - -#define IND (SETUP_W|SETUP_TMU0) -#define NAME fxsetupWT0 -#include "fxvs_tmp.h" - -#define IND (SETUP_W|SETUP_TMU1) -#define NAME fxsetupWT1 -#include "fxvs_tmp.h" - -#define IND (SETUP_W|SETUP_TMU1|SETUP_TMU0) -#define NAME fxsetupWT0T1 -#include "fxvs_tmp.h" - -#define IND (SETUP_W|SETUP_TMU0|SETUP_RGBA) -#define NAME fxsetupWRGBAT0 -#include "fxvs_tmp.h" - -#define IND (SETUP_W|SETUP_TMU1|SETUP_RGBA) -#define NAME fxsetupWRGBAT1 -#include "fxvs_tmp.h" - -#define IND (SETUP_W|SETUP_TMU1|SETUP_TMU0|SETUP_RGBA) -#define NAME fxsetupWRGBAT0T1 -#include "fxvs_tmp.h" - - - -void fxDDSetupInit( void ) -{ - setupfuncs[SETUP_XY] = fxsetupXY; - setupfuncs[SETUP_XY|SETUP_Z] = fxsetupXYZ; - setupfuncs[SETUP_XY|SETUP_W] = fxsetupXYW; - setupfuncs[SETUP_XY|SETUP_Z|SETUP_W] = fxsetupXYZW; - - setupfuncs[SETUP_RGBA|SETUP_XY] = fxsetupXYRGBA; - setupfuncs[SETUP_RGBA|SETUP_XY|SETUP_Z] = fxsetupXYZRGBA; - setupfuncs[SETUP_RGBA|SETUP_XY|SETUP_W] = fxsetupXYWRGBA; - setupfuncs[SETUP_RGBA|SETUP_XY|SETUP_Z|SETUP_W] = fxsetupXYZWRGBA; - - /* If we have texture and xy then we must have w. - * If we have texture1 and w then we must have texture 0. - */ - setupfuncs[SETUP_TMU0|SETUP_XY|SETUP_W] = fxsetupXYWT0; - setupfuncs[SETUP_TMU0|SETUP_XY|SETUP_Z|SETUP_W] = fxsetupXYZWT0; - - setupfuncs[SETUP_TMU1|SETUP_TMU0|SETUP_XY|SETUP_W] = fxsetupXYWT0T1; - setupfuncs[SETUP_TMU1|SETUP_TMU0|SETUP_XY|SETUP_Z|SETUP_W] = fxsetupXYZWT0T1; - - setupfuncs[SETUP_TMU0|SETUP_RGBA|SETUP_XY|SETUP_W] = fxsetupXYWRGBAT0; - setupfuncs[SETUP_TMU0|SETUP_RGBA|SETUP_XY|SETUP_Z|SETUP_W] = fxsetupXYZWRGBAT0; - - setupfuncs[SETUP_TMU1|SETUP_TMU0|SETUP_RGBA|SETUP_XY|SETUP_W] = fxsetupXYWRGBAT0T1; - setupfuncs[SETUP_TMU1|SETUP_TMU0|SETUP_RGBA|SETUP_XY|SETUP_Z|SETUP_W] = fxsetupXYZWRGBAT0T1; - - /* If we don't have xy then we can't have z... w is still a possibility. - */ - setupfuncs[SETUP_RGBA] = fxsetupRGBA; - setupfuncs[SETUP_TMU0] = fxsetupT0; - setupfuncs[SETUP_TMU1] = fxsetupT1; - setupfuncs[SETUP_TMU1|SETUP_TMU0] = fxsetupT0T1; - setupfuncs[SETUP_TMU0|SETUP_RGBA] = fxsetupRGBAT0; - setupfuncs[SETUP_TMU1|SETUP_RGBA] = fxsetupRGBAT1; - setupfuncs[SETUP_TMU1|SETUP_TMU0|SETUP_RGBA] = fxsetupRGBAT0T1; - - setupfuncs[SETUP_W|SETUP_RGBA] = fxsetupWRGBA; - setupfuncs[SETUP_W|SETUP_TMU0] = fxsetupWT0; - setupfuncs[SETUP_W|SETUP_TMU1] = fxsetupWT1; - setupfuncs[SETUP_W|SETUP_TMU1|SETUP_TMU0] = fxsetupWT0T1; - setupfuncs[SETUP_W|SETUP_TMU0|SETUP_RGBA] = fxsetupWRGBAT0; - setupfuncs[SETUP_W|SETUP_TMU1|SETUP_RGBA] = fxsetupWRGBAT1; - setupfuncs[SETUP_W|SETUP_TMU1|SETUP_TMU0|SETUP_RGBA] = fxsetupWRGBAT0T1; - -} - - - -tfxSetupFunc fxDDChooseSetupFunction(GLcontext *ctx) -{ - GLuint setupindex = SETUP_XY|SETUP_Z; - fxMesaContext fxMesa = (fxMesaContext)ctx->DriverCtx; - - fxMesa->setupindex = 0; - - if (ctx->RenderMode != GL_RENDER) - return 0; - - fxMesa->tmu_source[0] = 0; - fxMesa->tmu_source[1] = 1; - - fxMesa->tex_dest[0] = SETUP_TMU0; - fxMesa->tex_dest[1] = SETUP_TMU1; - - if (ctx->Light.ShadeModel == GL_SMOOTH && !ctx->Light.Model.TwoSide) - setupindex |= SETUP_RGBA; - - if (ctx->Fog.Enabled && ctx->FogMode==FOG_FRAGMENT) - setupindex |= SETUP_RGBA|SETUP_W; - - if ((ctx->Texture.ReallyEnabled & (TEXTURE0_2D|TEXTURE0_3D)) == TEXTURE0_2D) - { - /* This doesn't work for non-RGBA textures - if (ctx->Texture.Unit[0].EnvMode == GL_REPLACE) - setupindex &= ~SETUP_RGBA; - */ - setupindex |= SETUP_TMU0|SETUP_W; - } - - if ((ctx->Texture.ReallyEnabled & (TEXTURE1_2D|TEXTURE1_3D)) == TEXTURE1_2D) - { - setupindex |= SETUP_TMU1|SETUP_W; - if (setupindex & SETUP_TMU0) { /* both TMUs in use */ - struct gl_texture_object *tObj=ctx->Texture.Unit[0].CurrentD[2]; - tfxTexInfo *ti=fxTMGetTexInfo(tObj); - - if (ti->whichTMU!=FX_TMU0) { /* TMU0 and TMU1 are swapped */ - fxMesa->tmu_source[0] = 1; fxMesa->tex_dest[1] = SETUP_TMU0; - fxMesa->tmu_source[1] = 0; fxMesa->tex_dest[0] = SETUP_TMU1; - } - } - } - - if (ctx->Color.BlendEnabled) - setupindex |= SETUP_RGBA; - - if (MESA_VERBOSE & (VERBOSE_DRIVER|VERBOSE_PIPELINE|VERBOSE_STATE)) - fxPrintSetupFlags("fxmesa: vertex setup function", setupindex); - - fxMesa->setupindex = setupindex; - fxMesa->view_clip_tri = fxTriViewClipTab[setupindex&0x7]; - fxMesa->clip_tri_stride = fxTriClipStrideTab[setupindex&0x7]; - return setupfuncs[setupindex]; -} - -void fxDDDoRasterSetup( struct vertex_buffer *VB ) -{ - GLcontext *ctx = VB->ctx; - FX_DRIVER_DATA(VB)->last_vert = FX_DRIVER_DATA(VB)->verts + VB->Count; - -#if 0 /* leaving this out fixes the Heretic2 stray polygon bug */ - if ((ctx->IndirectTriangles & DD_SW_RASTERIZE) == DD_SW_RASTERIZE) { - fxMesaContext fxMesa = (fxMesaContext)ctx->DriverCtx; - fxMesa->setupdone = 0; - return; - } -#endif - - if (VB->Type == VB_CVA_PRECALC) - fxDDPartialRasterSetup( VB ); - else if (ctx->Driver.RasterSetup) /* NULL if in feedback/selection mode */ - ctx->Driver.RasterSetup( VB, VB->CopyStart, VB->Count ); - -} - - -/* - * Need to check that merge&render will work before allowing this to - * happen here. Therefore - need to know that this will be fired when - * we get a forbidden input in the elt pipeline - and therefore need to check - * whether we have one *now*. Similarly need to know if state changes cause - * size4 texcoords to be introduced. - */ -void fxDDCheckPartialRasterSetup( GLcontext *ctx, struct gl_pipeline_stage *d ) -{ - fxMesaContext fxMesa = (fxMesaContext)ctx->DriverCtx; - GLuint tmp = fxMesa->setupdone; - - d->type = 0; - d->pre_forbidden_inputs = 0; - fxMesa->setupdone = 0; /* cleared if we return */ - - /* Indirect triangles must be rendered via the immediate pipeline. - * If all rasterization is software, no need to set up. - */ - if ((ctx->Array.Summary & VERT_OBJ_ANY) == 0) - return; - - if ((ctx->IndirectTriangles & DD_SW_SETUP) || - (ctx->IndirectTriangles & DD_SW_RASTERIZE) == DD_SW_RASTERIZE) - return; - - if ((ctx->Texture.ReallyEnabled & 0xf) && - !(ctx->Array.Flags & VERT_TEX0_ANY)) - { - if (ctx->TextureMatrix[0].type == MATRIX_GENERAL || - ctx->TextureMatrix[0].type == MATRIX_PERSPECTIVE || - (ctx->Texture.Unit[1].TexGenEnabled & Q_BIT)) - return; - - d->pre_forbidden_inputs |= VERT_TEX0_4; - } - - if ((ctx->Texture.ReallyEnabled & 0xf0) && - !(ctx->Array.Flags & VERT_TEX1_ANY)) - { - if (ctx->TextureMatrix[1].type == MATRIX_GENERAL || - ctx->TextureMatrix[1].type == MATRIX_PERSPECTIVE || - (ctx->Texture.Unit[1].TexGenEnabled & Q_BIT)) - return; - - d->pre_forbidden_inputs |= VERT_TEX1_4; - } - - - fxMesa->setupdone = tmp; - d->inputs = 0; - d->outputs = VERT_SETUP_PART; - d->type = PIPE_PRECALC; -} - - -/* Will be different every time - no point in trying to precalc the - * function to call. - */ -void fxDDPartialRasterSetup( struct vertex_buffer *VB ) -{ - GLuint new = VB->pipeline->new_outputs; - fxMesaContext fxMesa = (fxMesaContext)VB->ctx->DriverCtx; - GLuint ind = 0; - - FX_DRIVER_DATA(VB)->last_vert = FX_DRIVER_DATA(VB)->verts + VB->Count; - - if (new & VERT_WIN) { - new = VB->pipeline->outputs; - ind |= SETUP_XY|SETUP_W|SETUP_Z; - } - - if (new & VERT_TEX0_ANY) - ind |= SETUP_W | fxMesa->tex_dest[0]; - - if (new & VERT_TEX1_ANY) - ind |= SETUP_W | fxMesa->tex_dest[1]; - - if (new & VERT_RGBA) - ind |= SETUP_W|SETUP_RGBA; - - if ((new & VERT_WIN) == 0) - ind &= ~(fxMesa->setupdone & SETUP_W); - - fxMesa->setupdone &= ~ind; - ind &= fxMesa->setupindex; - fxMesa->setupdone |= ind; - - if (MESA_VERBOSE & (VERBOSE_DRIVER|VERBOSE_PIPELINE)) { - gl_print_vert_flags("new outputs", VB->pipeline->new_outputs); - fxPrintSetupFlags("fxmesa: partial setup function", ind); - } - - if (ind) - setupfuncs[ind]( VB, VB->Start, VB->Count ); -} - -/* Almost certainly never called. - */ -void fxDDResizeVB( struct vertex_buffer *VB, GLuint size ) -{ - struct tfxMesaVertexBuffer *fvb = FX_DRIVER_DATA(VB); - - while (fvb->size < size) - fvb->size *= 2; - - FREE( VB->ClipMask ); - VB->ClipMask = (GLubyte *)MALLOC(sizeof(GLubyte) * fvb->size); - - FREE( fvb->vert_store ); - fvb->vert_store = MALLOC( sizeof(fxVertex) * fvb->size + 31); - if (!fvb->vert_store || !VB->ClipMask) - { - fprintf(stderr,"fx Driver: out of memory !\n"); - fxCloseHardware(); - exit(-1); - } - fvb->verts = (fxVertex *)(((unsigned long)fvb->vert_store + 31) & ~31); - - gl_vector1ui_free( &fvb->clipped_elements ); - gl_vector1ui_alloc( &fvb->clipped_elements, VEC_WRITABLE, fvb->size, 32 ); - - if (!fvb->clipped_elements.start) goto memerror; - - return; -memerror: - fprintf(stderr,"fx Driver: out of memory !\n"); - fxCloseHardware(); - exit(-1); -} - - -void fxDDRegisterVB( struct vertex_buffer *VB ) -{ - struct tfxMesaVertexBuffer *fvb; - - fvb = (struct tfxMesaVertexBuffer *)calloc( 1, sizeof(*fvb) ); - - /* This looks like it allocates a lot of memory, but it basically - * just sets an upper limit on how much can be used - nothing like - * this amount will ever be turned into 'real' memory. - */ - if (VB->Type == VB_CVA_PRECALC) { - fvb->size = VB->Size * 5; - fvb->vert_store = MALLOC( sizeof(fxVertex) * fvb->size + 31); - if (!fvb->vert_store) goto memerror; -#if defined(FX_GLIDE3) - fvb->triangle_b = MALLOC( sizeof(GrVertex*) *4* fvb->size+ 31); - if (!fvb->triangle_b) goto memerror; - fvb->strips_b = MALLOC( sizeof(GrVertex*) *4* fvb->size+ 31); - if (!fvb->strips_b ) goto memerror; -#endif - fvb->verts = (fxVertex *)(((unsigned long)fvb->vert_store + 31) & ~31); - gl_vector1ui_alloc( &fvb->clipped_elements, VEC_WRITABLE, fvb->size, 32 ); - if (!fvb->clipped_elements.start) goto memerror; - - FREE( VB->ClipMask ); - VB->ClipMask = (GLubyte *)MALLOC(sizeof(GLubyte) * fvb->size); - if (!VB->ClipMask) goto memerror; - - } else { - fvb->vert_store = MALLOC( sizeof(fxVertex) * (VB->Size + 12) + 31); - if (!fvb->vert_store) goto memerror; -#if defined(FX_GLIDE3) - fvb->triangle_b = MALLOC( sizeof(GrVertex*) *4* fvb->size+ 31); - if (!fvb->triangle_b) goto memerror; - fvb->strips_b = MALLOC( sizeof(GrVertex*) *4* fvb->size+ 31); - if (!fvb->strips_b ) goto memerror; -#endif - fvb->verts = (fxVertex *)(((unsigned long)fvb->vert_store + 31) & ~31); - fvb->size = VB->Size + 12; - } - - - VB->driver_data = fvb; - return; -memerror: - fprintf(stderr,"fx Driver: out of memory !\n"); - fxCloseHardware(); - exit(-1); -} - -void fxDDUnregisterVB( struct vertex_buffer *VB ) -{ - struct tfxMesaVertexBuffer *fvb = FX_DRIVER_DATA(VB); - - if (fvb) { - if (fvb->vert_store) FREE(fvb->vert_store); - gl_vector1ui_free( &fvb->clipped_elements ); - FREE(fvb); -#if defined(FX_GLIDE3) - if (fvb->strips_b) - FREE(fvb->strips_b); - if (fvb->triangle_b) - FREE(fvb->triangle_b); -#endif - VB->driver_data = 0; - } -} - - - -#else - - -/* - * Need this to provide at least one external definition. - */ - -int gl_fx_dummy_function_vsetup(void) -{ - return 0; -} - -#endif /* FX */ Index: xc/extras/Mesa/src/FX/fxvsetup.h diff -u xc/extras/Mesa/src/FX/fxvsetup.h:1.2 xc/extras/Mesa/src/FX/fxvsetup.h:removed --- xc/extras/Mesa/src/FX/fxvsetup.h:1.2 Tue Feb 15 02:13:10 2000 +++ xc/extras/Mesa/src/FX/fxvsetup.h Mon Dec 18 14:21:54 2000 @@ -1,199 +0,0 @@ -/* -*- mode: C; tab-width:8; c-basic-offset:2 -*- */ - -/* - * Mesa 3-D graphics library - * Version: 3.3 - * - * Copyright (C) 1999-2000 Brian Paul All Rights Reserved. - * - * 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 - * BRIAN PAUL 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. - * - * - * Original Mesa / 3Dfx device driver (C) 1999 David Bucciarelli, by the - * terms stated above. - * - * Thank you for your contribution, David! - * - * Please make note of the above copyright/license statement. If you - * contributed code or bug fixes to this code under the previous (GNU - * Library) license and object to the new license, your code will be - * removed at your request. Please see the Mesa docs/COPYRIGHT file - * for more information. - * - * Additional Mesa/3Dfx driver developers: - * Daryll Strauss - * Keith Whitwell - * - * See fxapi.h for more revision/author details. - */ - - -#ifndef _FXVSETUP_H_ -#define _FXVSETUP_H_ - - -#define VARS_W - -#define VARS_Z - -#define VARS_TMU0 \ - GLuint tmu0_source = fxMesa->tmu_source[0]; \ - GLfloat *tmu0_data = VEC_ELT(VB->TexCoordPtr[tmu0_source], \ - GLfloat, start); \ - GLuint tmu0_stride = VB->TexCoordPtr[tmu0_source]->stride; \ - GLuint tmu0_sz = VB->TexCoordPtr[tmu0_source]->size; \ - struct gl_texture_unit *t0 = &ctx->Texture.Unit[tmu0_source]; \ - GLfloat sscale0 = FX_TEXTURE_DATA(t0)->sScale; \ - GLfloat tscale0 = FX_TEXTURE_DATA(t0)->tScale; - -#define VARS_TMU1 \ - GLuint tmu1_source = fxMesa->tmu_source[1]; \ - GLfloat *tmu1_data = VEC_ELT(VB->TexCoordPtr[tmu1_source], \ - GLfloat, start); \ - GLuint tmu1_stride = VB->TexCoordPtr[tmu1_source]->stride; \ - GLuint tmu1_sz = VB->TexCoordPtr[tmu1_source]->size; \ - struct gl_texture_unit *t1 = &ctx->Texture.Unit[tmu1_source]; \ - GLfloat sscale1 = FX_TEXTURE_DATA(t1)->sScale; \ - GLfloat tscale1 = FX_TEXTURE_DATA(t1)->tScale; - -#define VARS_RGBA \ - GLubyte *color = VEC_ELT(VB->ColorPtr, GLubyte, start); \ - GLuint col_stride = VB->ColorPtr->stride; - -#define VARS_XY GLfloat *win = VB->Win.data[start]; - -#define INCR_XY win += 4 - - -#ifdef FX_V2 -# define DO_SETUP_XY \ - v[XCOORD]=win[0]; \ - v[YCOORD]=win[1]; -#else -#ifdef DRIVERTS -# define DO_SETUP_XY \ - v[XCOORD]=win[0]+fxMesa->x_offset; \ - v[YCOORD]=win[1]+fxMesa->y_delta; -#else -# if (defined(__linux__) && defined(__i386__)) || defined(macintosh) -# define DO_SETUP_XY { \ - GLfloat t1 = win[0] + snapper; \ - GLfloat t2 = win[1] + snapper; \ - v[XCOORD] = t1 - snapper; \ - v[YCOORD] = t2 - snapper; \ - } -# else -# define DO_SETUP_XY { \ - /* trunc (x,y) to multiple of 1/16 */ \ - v[XCOORD]=((int)(win[0]*16.0f))*(1.0f/16.0f); \ - v[YCOORD]=((int)(win[1]*16.0f))*(1.0f/16.0f); \ - } -# endif -#endif -#endif - - -#define DO_SETUP_W { \ - v[OOWCOORD]=win[3]; \ -} - -#define DO_SETUP_Z v[ZCOORD]=win[2]; - -#define DO_SETUP_TMU0 \ -{ \ - v[S0COORD]=sscale0*tmu0_data[0]*v[OOWCOORD]; \ - v[T0COORD]=tscale0*tmu0_data[1]*v[OOWCOORD]; \ -} - -#define INCR_TMU0 STRIDE_F(tmu0_data, tmu0_stride) - -#define DO_SETUP_TMU1 \ -{ \ - v[S1COORD]=sscale1*tmu1_data[0]*v[OOWCOORD]; \ - v[T1COORD]=tscale1*tmu1_data[1]*v[OOWCOORD]; \ -} - -#define INCR_TMU1 STRIDE_F(tmu1_data, tmu1_stride) - -#if FX_USE_PARGB -#define DO_SETUP_RGBA \ - { GET_PARGB(v) = color[ACOMP] << 24 | color[RCOMP] << 16 | color[GCOMP] << 8 | color[BCOMP];} - -#else -#define DO_SETUP_RGBA \ -{ \ - UBYTE_COLOR_TO_FLOAT_255_COLOR2(v[RCOORD], color[0]); \ - UBYTE_COLOR_TO_FLOAT_255_COLOR2(v[GCOORD], color[1]); \ - UBYTE_COLOR_TO_FLOAT_255_COLOR2(v[BCOORD], color[2]); \ - UBYTE_COLOR_TO_FLOAT_255_COLOR2(v[ACOORD], color[3]); \ -} -#endif - -#define INCR_RGBA color += col_stride - - -#define _FIXUP_PRE \ - GLuint hs = fxMesa->stw_hint_state & ~(GR_STWHINT_W_DIFF_TMU0 | \ - GR_STWHINT_W_DIFF_TMU1); - -#define _FIXUP_TMU0 \ - if (tmu0_sz == 4) { \ - project_texcoords( VB, 0, tmu0_source, start, end ); \ - hs |= GR_STWHINT_W_DIFF_TMU0; \ - } - - -#define _FIXUP_TMU1 \ - if (tmu1_sz == 4) { \ - project_texcoords( VB, 1, tmu1_source, start, end ); \ - hs |= GR_STWHINT_W_DIFF_TMU1; \ - } - - -#define _FIXUP_TMU01 \ - if (tmu0_sz == 4) { \ - project_texcoords( VB, 0, tmu0_source, start, end ); \ - if (tmu1_sz == 4) \ - project_texcoords( VB, 1, tmu1_source, start, end ); \ - else \ - copy_w( VB, 1, start, end ); \ - hs |= (GR_STWHINT_W_DIFF_TMU0|GR_STWHINT_W_DIFF_TMU1); \ - } else if (tmu1_sz == 4) { \ - project_texcoords( VB, 1, tmu1_source, start, end ); \ - hs |= GR_STWHINT_W_DIFF_TMU1; \ - } - -#define _FIXUP_POST \ - if (hs != fxMesa->stw_hint_state) { \ - fxMesa->stw_hint_state = hs; \ - FX_grHints(GR_HINT_STWHINT, hs); \ - } - - -#define FIXUP_TMU0 { _FIXUP_PRE _FIXUP_TMU0 _FIXUP_POST } -#define FIXUP_TMU1 { _FIXUP_PRE _FIXUP_TMU1 _FIXUP_POST } -#define FIXUP_TMU01 { _FIXUP_PRE _FIXUP_TMU01 _FIXUP_POST } - - -/* v - pointer to destination GrVertex - * VB - source of data - * i - index into vb for data - */ - - -#endif Index: xc/extras/Mesa/src/FX/fxwgl.c diff -u xc/extras/Mesa/src/FX/fxwgl.c:1.2 xc/extras/Mesa/src/FX/fxwgl.c:removed --- xc/extras/Mesa/src/FX/fxwgl.c:1.2 Tue Feb 15 02:13:11 2000 +++ xc/extras/Mesa/src/FX/fxwgl.c Mon Dec 18 14:21:54 2000 @@ -1,870 +0,0 @@ -/* -*- mode: C; tab-width:8; c-basic-offset:2 -*- */ - -/* - * Mesa 3-D graphics library - * Version: 3.3 - * - * Copyright (C) 1999-2000 Brian Paul All Rights Reserved. - * - * 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 - * BRIAN PAUL 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. - * - * - * Original Mesa / 3Dfx device driver (C) 1999 David Bucciarelli, by the - * terms stated above. - * - * Thank you for your contribution, David! - * - * Please make note of the above copyright/license statement. If you - * contributed code or bug fixes to this code under the previous (GNU - * Library) license and object to the new license, your code will be - * removed at your request. Please see the Mesa docs/COPYRIGHT file - * for more information. - * - * Additional Mesa/3Dfx driver developers: - * Daryll Strauss - * Keith Whitwell - * - * See fxapi.h for more revision/author details. - */ - - - -/* fxwgl.c - Microsoft wgl functions emulation for - * 3Dfx VooDoo/Mesa interface - */ - - -#ifdef __WIN32__ - -#ifdef __cplusplus -extern "C" { -#endif - -#include -#include "GL/gl.h" - -#ifdef __cplusplus - } -#endif - -#include -#include "GL/fxmesa.h" -#include "fxdrv.h" - -#define MAX_MESA_ATTRS 20 - -struct __extensions__ -{ - PROC proc; - char *name; -}; - -struct __pixelformat__ -{ - PIXELFORMATDESCRIPTOR pfd; - GLint mesaAttr[MAX_MESA_ATTRS]; -}; - -WINGDIAPI void GLAPIENTRY gl3DfxSetPaletteEXT(GLuint *); - -static struct __extensions__ ext[] = { - -#ifdef GL_EXT_polygon_offset - { (PROC)glPolygonOffsetEXT, "glPolygonOffsetEXT" }, -#endif - { (PROC)glBlendEquationEXT, "glBlendEquationEXT" }, - { (PROC)glBlendColorEXT, "glBlendColorExt" }, - { (PROC)glVertexPointerEXT, "glVertexPointerEXT" }, - { (PROC)glNormalPointerEXT, "glNormalPointerEXT" }, - { (PROC)glColorPointerEXT, "glColorPointerEXT" }, - { (PROC)glIndexPointerEXT, "glIndexPointerEXT" }, - { (PROC)glTexCoordPointerEXT, "glTexCoordPointer" }, - { (PROC)glEdgeFlagPointerEXT, "glEdgeFlagPointerEXT" }, - { (PROC)glGetPointervEXT, "glGetPointervEXT" }, - { (PROC)glArrayElementEXT, "glArrayElementEXT" }, - { (PROC)glDrawArraysEXT, "glDrawArrayEXT" }, - { (PROC)glAreTexturesResidentEXT, "glAreTexturesResidentEXT" }, - { (PROC)glBindTextureEXT, "glBindTextureEXT" }, - { (PROC)glDeleteTexturesEXT, "glDeleteTexturesEXT" }, - { (PROC)glGenTexturesEXT, "glGenTexturesEXT" }, - { (PROC)glIsTextureEXT, "glIsTextureEXT" }, - { (PROC)glPrioritizeTexturesEXT, "glPrioritizeTexturesEXT" }, - { (PROC)glCopyTexSubImage3DEXT, "glCopyTexSubImage3DEXT" }, - { (PROC)glTexImage3DEXT, "glTexImage3DEXT" }, - { (PROC)glTexSubImage3DEXT, "glTexSubImage3DEXT" }, - { (PROC)gl3DfxSetPaletteEXT, "3DFX_set_global_palette" }, - { (PROC)glColorTableEXT, "glColorTableEXT" }, - { (PROC)glColorSubTableEXT, "glColorSubTableEXT" }, - { (PROC)glGetColorTableEXT, "glGetColorTableEXT" }, - { (PROC)glGetColorTableParameterfvEXT, "glGetColorTableParameterfvEXT" }, - { (PROC)glGetColorTableParameterivEXT, "glGetColorTableParameterivEXT" }, - { (PROC)glPointParameterfEXT, "glPointParameterfEXT" }, - { (PROC)glPointParameterfvEXT, "glPointParameterfvEXT" }, - { (PROC)glBlendFuncSeparateINGR, "glBlendFuncSeparateINGR" }, - { (PROC)glActiveTextureARB, "glActiveTextureARB" }, - { (PROC)glClientActiveTextureARB, "glClientActiveTextureARB" }, - { (PROC)glMultiTexCoord1dARB, "glMultiTexCoord1dARB" }, - { (PROC)glMultiTexCoord1dvARB, "glMultiTexCoord1dvARB" }, - { (PROC)glMultiTexCoord1fARB, "glMultiTexCoord1fARB" }, - { (PROC)glMultiTexCoord1fvARB, "glMultiTexCoord1fvARB" }, - { (PROC)glMultiTexCoord1iARB, "glMultiTexCoord1iARB" }, - { (PROC)glMultiTexCoord1ivARB, "glMultiTexCoord1ivARB" }, - { (PROC)glMultiTexCoord1sARB, "glMultiTexCoord1sARB" }, - { (PROC)glMultiTexCoord1svARB, "glMultiTexCoord1svARB" }, - { (PROC)glMultiTexCoord2dARB, "glMultiTexCoord2dARB" }, - { (PROC)glMultiTexCoord2dvARB, "glMultiTexCoord2dvARB" }, - { (PROC)glMultiTexCoord2fARB, "glMultiTexCoord2fARB" }, - { (PROC)glMultiTexCoord2fvARB, "glMultiTexCoord2fvARB" }, - { (PROC)glMultiTexCoord2iARB, "glMultiTexCoord2iARB" }, - { (PROC)glMultiTexCoord2ivARB, "glMultiTexCoord2ivARB" }, - { (PROC)glMultiTexCoord2sARB, "glMultiTexCoord2sARB" }, - { (PROC)glMultiTexCoord2svARB, "glMultiTexCoord2svARB" }, - { (PROC)glMultiTexCoord3dARB, "glMultiTexCoord3dARB" }, - { (PROC)glMultiTexCoord3dvARB, "glMultiTexCoord3dvARB" }, - { (PROC)glMultiTexCoord3fARB, "glMultiTexCoord3fARB" }, - { (PROC)glMultiTexCoord3fvARB, "glMultiTexCoord3fvARB" }, - { (PROC)glMultiTexCoord3iARB, "glMultiTexCoord3iARB" }, - { (PROC)glMultiTexCoord3ivARB, "glMultiTexCoord3ivARB" }, - { (PROC)glMultiTexCoord3sARB, "glMultiTexCoord3sARB" }, - { (PROC)glMultiTexCoord3svARB, "glMultiTexCoord3svARB" }, - { (PROC)glMultiTexCoord4dARB, "glMultiTexCoord4dARB" }, - { (PROC)glMultiTexCoord4dvARB, "glMultiTexCoord4dvARB" }, - { (PROC)glMultiTexCoord4fARB, "glMultiTexCoord4fARB" }, - { (PROC)glMultiTexCoord4fvARB, "glMultiTexCoord4fvARB" }, - { (PROC)glMultiTexCoord4iARB, "glMultiTexCoord4iARB" }, - { (PROC)glMultiTexCoord4ivARB, "glMultiTexCoord4ivARB" }, - { (PROC)glMultiTexCoord4sARB, "glMultiTexCoord4sARB" }, - { (PROC)glMultiTexCoord4svARB, "glMultiTexCoord4svARB" }, - { (PROC)glLockArraysEXT, "glLockArraysEXT" }, - { (PROC)glUnlockArraysEXT, "glUnlockArraysEXT" } -}; - -static int qt_ext = sizeof(ext) / sizeof(ext[0]); - -struct __pixelformat__ pix[] = -{ - /* None */ - { - { - sizeof(PIXELFORMATDESCRIPTOR), 1, - PFD_DRAW_TO_WINDOW|PFD_SUPPORT_OPENGL| - PFD_DOUBLEBUFFER|PFD_SWAP_COPY, - PFD_TYPE_RGBA, - 32, - 8,0,8,8,8,16,0,24, - 0,0,0,0,0, - 0, - 0, - 0, - PFD_MAIN_PLANE, - 0,0,0,0 - }, - { - FXMESA_DOUBLEBUFFER, - FXMESA_ALPHA_SIZE, 0, - FXMESA_DEPTH_SIZE, 0, - FXMESA_STENCIL_SIZE, 0, - FXMESA_ACCUM_SIZE, 0, - FXMESA_NONE - } - }, - - /* Alpha */ - { - { - sizeof(PIXELFORMATDESCRIPTOR), 1, - PFD_DRAW_TO_WINDOW|PFD_SUPPORT_OPENGL| - PFD_DOUBLEBUFFER|PFD_SWAP_COPY, - PFD_TYPE_RGBA, - 32, - 8,0,8,8,8,16,8,24, - 0,0,0,0,0, - 0, - 0, - 0, - PFD_MAIN_PLANE, - 0,0,0,0 - }, - { - FXMESA_DOUBLEBUFFER, - FXMESA_ALPHA_SIZE, 8, - FXMESA_DEPTH_SIZE, 0, - FXMESA_STENCIL_SIZE, 0, - FXMESA_ACCUM_SIZE, 0, - FXMESA_NONE - } - }, - - /* Depth */ - { - { - sizeof(PIXELFORMATDESCRIPTOR), 1, - PFD_DRAW_TO_WINDOW|PFD_SUPPORT_OPENGL| - PFD_DOUBLEBUFFER|PFD_SWAP_COPY, - PFD_TYPE_RGBA, - 32, - 8,0,8,8,8,16,0,24, - 0,0,0,0,0, - 16, - 0, - 0, - PFD_MAIN_PLANE, - 0,0,0,0 - }, - { - FXMESA_DOUBLEBUFFER, - FXMESA_ALPHA_SIZE, 0, - FXMESA_DEPTH_SIZE, 16, - FXMESA_STENCIL_SIZE, 0, - FXMESA_ACCUM_SIZE, 0, - FXMESA_NONE - } - } -}; -static int qt_pix = sizeof(pix) / sizeof(pix[0]); - -static fxMesaContext ctx = NULL; -static WNDPROC hWNDOldProc; -static int curPFD = 0; -static HDC hDC; -static HWND hWND; - -static GLboolean haveDualHead; - -/* For the in-window-rendering hack */ - -static GLboolean gdiWindowHack; -static GLboolean gdiWindowHackEna; -static void *dibSurfacePtr; -static BITMAPINFO *dibBMI; -static HBITMAP dibHBM; -static HWND dibWnd; - -LONG GLAPIENTRY __wglMonitor(HWND hwnd,UINT message,UINT wParam,LONG lParam) - -{ - long ret; /* Now gives the resized window at the end to hWNDOldProc */ - - if(ctx && hwnd == hWND) { - switch(message) { - case WM_PAINT: - case WM_MOVE: - break; - case WM_DISPLAYCHANGE: - case WM_SIZE: - if (wParam != SIZE_MINIMIZED) { - static int moving = 0; - if (!moving) { - if(fxQueryHardware()!=GR_SSTTYPE_VOODOO) { - if(!FX_grSstControl(GR_CONTROL_RESIZE)) { - moving = 1; - SetWindowPos(hwnd, 0, 0, 0, 300, 300, SWP_NOMOVE|SWP_NOZORDER); - moving = 0; - if(!FX_grSstControl(GR_CONTROL_RESIZE)) { - /*MessageBox(0,_T("Error changing windowsize"),_T("fxMESA"),MB_OK);*/ - PostMessage(hWND,WM_CLOSE,0,0); - } - } - } - - /* Do the clipping in the glide library */ - FX_grClipWindow(0,0,FX_grSstScreenWidth(),FX_grSstScreenHeight()); - /* And let the new size set in the context */ - fxMesaUpdateScreenSize(ctx); - } - } - break; - case WM_ACTIVATE: - if((fxQueryHardware()==GR_SSTTYPE_VOODOO) && - (!gdiWindowHack) && - (!haveDualHead)) { - WORD fActive = LOWORD(wParam); - BOOL fMinimized = (BOOL) HIWORD(wParam); - - if((fActive == WA_INACTIVE) || fMinimized) - FX_grSstControl(GR_CONTROL_DEACTIVATE); - else - FX_grSstControl(GR_CONTROL_ACTIVATE); - } - break; - case WM_SHOWWINDOW: - break; - case WM_SYSKEYDOWN: - case WM_SYSCHAR: - if(gdiWindowHackEna && (VK_RETURN == wParam)) { - if(gdiWindowHack) { - gdiWindowHack = GL_FALSE; - FX_grSstControl(GR_CONTROL_ACTIVATE); - } else { - gdiWindowHack = GL_TRUE; - FX_grSstControl(GR_CONTROL_DEACTIVATE); - } - } - break; - } - } - - /* Finaly call the hWNDOldProc, which handles the resize witch the - now changed window sizes */ - ret = CallWindowProc( hWNDOldProc, hwnd, message, wParam, lParam ); - - return(ret); -} - -BOOL GLAPIENTRY wglCopyContext(HGLRC hglrcSrc,HGLRC hglrcDst,UINT mask) -{ - return(FALSE); -} - -HGLRC GLAPIENTRY wglCreateContext(HDC hdc) -{ - HWND hWnd; - WNDPROC oldProc; - int error; - - if(ctx) { - SetLastError(0); - return(NULL); - } - - if(!(hWnd = WindowFromDC(hdc))) { - SetLastError(0); - return(NULL); - } - - if(curPFD == 0) { - SetLastError(0); - return(NULL); - } - - if((oldProc = (WNDPROC)GetWindowLong(hWnd,GWL_WNDPROC)) != __wglMonitor) { - hWNDOldProc = oldProc; - SetWindowLong(hWnd,GWL_WNDPROC,(LONG)__wglMonitor); - } - -#ifndef FX_SILENT - freopen("MESA.LOG","w",stderr); -#endif - - ShowWindow(hWnd, SW_SHOWNORMAL); - SetForegroundWindow(hWnd); - Sleep(100); /* an hack for win95 */ - - if(fxQueryHardware() == GR_SSTTYPE_VOODOO) { - RECT cliRect; - - GetClientRect(hWnd,&cliRect); - error = !(ctx = fxMesaCreateBestContext((GLuint)hWnd,cliRect.right,cliRect.bottom, - pix[curPFD - 1].mesaAttr)); - - if(!error) { - /* create the DIB section for windowed rendering */ - DWORD *p; - - dibWnd = hWnd; - - hDC = GetDC(dibWnd); - - dibBMI = (BITMAPINFO*) MALLOC( sizeof(BITMAPINFO) + (256*sizeof(RGBQUAD))); - - memset(dibBMI,0,sizeof(BITMAPINFO) + (256*sizeof(RGBQUAD))); - - dibBMI->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); - dibBMI->bmiHeader.biWidth = ctx->width; - dibBMI->bmiHeader.biHeight = -ctx->height; - dibBMI->bmiHeader.biPlanes = (short)1; - dibBMI->bmiHeader.biBitCount = (short)16; - dibBMI->bmiHeader.biCompression = BI_BITFIELDS; - dibBMI->bmiHeader.biSizeImage = 0; - dibBMI->bmiHeader.biXPelsPerMeter = 0; - dibBMI->bmiHeader.biYPelsPerMeter = 0; - dibBMI->bmiHeader.biClrUsed = 3; - dibBMI->bmiHeader.biClrImportant = 3; - - p = (DWORD*)dibBMI->bmiColors; - p[0] = 0xF800; - p[1] = 0x07E0; - p[2] = 0x001F; - - dibHBM = CreateDIBSection(hDC, dibBMI, DIB_RGB_COLORS, &dibSurfacePtr, NULL, 0); - - ReleaseDC(dibWnd, hDC); - - gdiWindowHackEna = (dibHBM != NULL ? GL_TRUE : GL_FALSE); - - if (!getenv("MESA_WGL_FX") || !strcmp(getenv("MESA_WGL_FX"),"fullscreen")) - gdiWindowHack = GL_FALSE; - else { - gdiWindowHack = GL_TRUE; - FX_grSstControl(GR_CONTROL_DEACTIVATE); - } - } - } else { - /* For the Voodoo Rush */ - - if(getenv("MESA_WGL_FX") && !strcmp(getenv("MESA_WGL_FX"),"fullscreen")) { - RECT cliRect; - - GetClientRect(hWnd,&cliRect); - error = !(ctx = fxMesaCreateBestContext((GLuint)hWnd,cliRect.right,cliRect.bottom, - pix[curPFD - 1].mesaAttr)); - } else - error = !(ctx = fxMesaCreateContext((GLuint)hWnd,GR_RESOLUTION_NONE,GR_REFRESH_75Hz, - pix[curPFD - 1].mesaAttr)); - } - - if(getenv("SST_DUALHEAD")) - haveDualHead=((atoi(getenv("SST_DUALHEAD"))==1) ? GL_TRUE:GL_FALSE); - else - haveDualHead=GL_FALSE; - - if(error) { - SetLastError(0); - return(NULL); - } - - hDC = hdc; - hWND = hWnd; - - /* Required by the OpenGL Optimizer 1.1 (is it a Optimizer bug ?) */ - wglMakeCurrent(hdc,(HGLRC)1); - - return((HGLRC)1); -} - -HGLRC GLAPIENTRY wglCreateLayerContext(HDC hdc,int iLayerPlane) -{ - SetLastError(0); - return(NULL); -} - -BOOL GLAPIENTRY wglDeleteContext(HGLRC hglrc) -{ - if(ctx && hglrc == (HGLRC)1) { - if (gdiWindowHackEna) { - DeleteObject(dibHBM); - FREE(dibBMI); - - dibSurfacePtr = NULL; - dibBMI = NULL; - dibHBM = NULL; - dibWnd = NULL; - } - - fxMesaDestroyContext(ctx); - - SetWindowLong(WindowFromDC(hDC),GWL_WNDPROC,(LONG)hWNDOldProc); - - ctx = NULL; - hDC = 0; - return(TRUE); - } - - SetLastError(0); - - return(FALSE); -} - -HGLRC GLAPIENTRY wglGetCurrentContext(VOID) -{ - if(ctx) - return((HGLRC)1); - - SetLastError(0); - return(NULL); -} - -HDC GLAPIENTRY wglGetCurrentDC(VOID) -{ - if(ctx) - return(hDC); - - SetLastError(0); - return(NULL); -} - -PROC GLAPIENTRY wglGetProcAddress(LPCSTR lpszProc) -{ - int i; - - /*fprintf(stderr,"fxMesa: looking for extension %s\n",lpszProc); - fflush(stderr);*/ - - for(i = 0;i < qt_ext;i++) - if(!strcmp(lpszProc,ext[i].name)) { - /*fprintf(stderr,"fxMesa: found extension %s\n",lpszProc); - fflush(stderr);*/ - - return(ext[i].proc); - } - SetLastError(0); - return(NULL); -} - -BOOL GLAPIENTRY wglMakeCurrent(HDC hdc,HGLRC hglrc) -{ - if((hdc==NULL) && (hglrc==NULL)) - return(TRUE); - - if(!ctx || hglrc != (HGLRC)1 || WindowFromDC(hdc) != hWND) { - SetLastError(0); - return(FALSE); - } - - hDC = hdc; - - fxMesaMakeCurrent(ctx); - - return(TRUE); -} - -BOOL GLAPIENTRY wglShareLists(HGLRC hglrc1,HGLRC hglrc2) -{ - if(!ctx || hglrc1 != (HGLRC)1 || hglrc1 != hglrc2) { - SetLastError(0); - return(FALSE); - } - - return(TRUE); -} - -BOOL GLAPIENTRY wglUseFontBitmaps(HDC fontDevice, DWORD firstChar, DWORD numChars, DWORD listBase) -{ -#define VERIFY(a) a - - TEXTMETRIC metric; - BITMAPINFO *dibInfo; - HDC bitDevice; - COLORREF tempColor; - int i; - - VERIFY(GetTextMetrics(fontDevice, &metric)); - - dibInfo = (BITMAPINFO *) calloc(sizeof(BITMAPINFO) + sizeof(RGBQUAD), 1); - dibInfo->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); - dibInfo->bmiHeader.biPlanes = 1; - dibInfo->bmiHeader.biBitCount = 1; - dibInfo->bmiHeader.biCompression = BI_RGB; - - bitDevice = CreateCompatibleDC(fontDevice); - // HDC bitDevice = CreateDC("DISPLAY", NULL, NULL, NULL); - // VERIFY(bitDevice); - - // Swap fore and back colors so the bitmap has the right polarity - tempColor = GetBkColor(bitDevice); - SetBkColor(bitDevice, GetTextColor(bitDevice)); - SetTextColor(bitDevice, tempColor); - - // Place chars based on base line - VERIFY(SetTextAlign(bitDevice, TA_BASELINE) >= 0 ? 1 : 0); - - for(i = 0; i < numChars; i++) { - SIZE size; - char curChar; - int charWidth,charHeight,bmapWidth,bmapHeight,numBytes,res; - HBITMAP bitObject; - HGDIOBJ origBmap; - unsigned char *bmap; - - curChar = i + firstChar; - - // Find how high/wide this character is - VERIFY(GetTextExtentPoint32(bitDevice, &curChar, 1, &size)); - - // Create the output bitmap - charWidth = size.cx; - charHeight = size.cy; - bmapWidth = ((charWidth + 31) / 32) * 32; // Round up to the next multiple of 32 bits - bmapHeight = charHeight; - bitObject = CreateCompatibleBitmap(bitDevice, - bmapWidth, - bmapHeight); - //VERIFY(bitObject); - - // Assign the output bitmap to the device - origBmap = SelectObject(bitDevice, bitObject); - VERIFY(origBmap); - - VERIFY( PatBlt( bitDevice, 0, 0, bmapWidth, bmapHeight,BLACKNESS ) ); - - // Use our source font on the device - VERIFY(SelectObject(bitDevice, GetCurrentObject(fontDevice,OBJ_FONT))); - - // Draw the character - VERIFY(TextOut(bitDevice, 0, metric.tmAscent, &curChar, 1)); - - // Unselect our bmap object - VERIFY(SelectObject(bitDevice, origBmap)); - - // Convert the display dependant representation to a 1 bit deep DIB - numBytes = (bmapWidth * bmapHeight) / 8; - bmap = MALLOC(numBytes); - dibInfo->bmiHeader.biWidth = bmapWidth; - dibInfo->bmiHeader.biHeight = bmapHeight; - res = GetDIBits(bitDevice, bitObject, 0, bmapHeight, bmap, - dibInfo, - DIB_RGB_COLORS); - //VERIFY(res); - - // Create the GL object - glNewList(i + listBase, GL_COMPILE); - glBitmap(bmapWidth, bmapHeight, 0.0, metric.tmDescent, - charWidth, 0.0, - bmap); - glEndList(); - // CheckGL(); - - // Destroy the bmap object - DeleteObject(bitObject); - - // Deallocate the bitmap data - FREE(bmap); - } - - // Destroy the DC - VERIFY(DeleteDC(bitDevice)); - - FREE(dibInfo); - - return TRUE; -#undef VERIFY -} - -BOOL GLAPIENTRY wglUseFontBitmapsW(HDC hdc,DWORD first,DWORD count,DWORD listBase) -{ - return(FALSE); -} - -BOOL GLAPIENTRY wglUseFontOutlinesA(HDC hdc,DWORD first,DWORD count, - DWORD listBase,FLOAT deviation, - FLOAT extrusion,int format, - LPGLYPHMETRICSFLOAT lpgmf) -{ - SetLastError(0); - return(FALSE); -} - -BOOL GLAPIENTRY wglUseFontOutlinesW(HDC hdc,DWORD first,DWORD count, - DWORD listBase,FLOAT deviation, - FLOAT extrusion,int format, - LPGLYPHMETRICSFLOAT lpgmf) -{ - SetLastError(0); - return(FALSE); -} - - -BOOL GLAPIENTRY wglSwapLayerBuffers(HDC hdc,UINT fuPlanes) -{ - if(ctx && WindowFromDC(hdc) == hWND) { - fxMesaSwapBuffers(); - - return(TRUE); - } - - SetLastError(0); - return(FALSE); -} - -int GLAPIENTRY wglChoosePixelFormat(HDC hdc, - CONST PIXELFORMATDESCRIPTOR *ppfd) -{ - int i,best=-1,qt_valid_pix; - - qt_valid_pix = qt_pix; - - if(ppfd->nSize != sizeof(PIXELFORMATDESCRIPTOR) || ppfd->nVersion != 1) { - SetLastError(0); - return(0); - } - - for(i = 0;i < qt_valid_pix;i++) { - if((ppfd->dwFlags & PFD_DRAW_TO_WINDOW) && !(pix[i].pfd.dwFlags & PFD_DRAW_TO_WINDOW)) - continue; - if((ppfd->dwFlags & PFD_DRAW_TO_BITMAP) && !(pix[i].pfd.dwFlags & PFD_DRAW_TO_BITMAP)) - continue; - if((ppfd->dwFlags & PFD_SUPPORT_GDI) && !(pix[i].pfd.dwFlags & PFD_SUPPORT_GDI)) - continue; - if((ppfd->dwFlags & PFD_SUPPORT_OPENGL) && !(pix[i].pfd.dwFlags & PFD_SUPPORT_OPENGL)) - continue; - if(!(ppfd->dwFlags & PFD_DOUBLEBUFFER_DONTCARE) && - ((ppfd->dwFlags & PFD_DOUBLEBUFFER) != (pix[i].pfd.dwFlags & PFD_DOUBLEBUFFER))) - continue; - if(!(ppfd->dwFlags & PFD_STEREO_DONTCARE) && - ((ppfd->dwFlags & PFD_STEREO) != (pix[i].pfd.dwFlags & PFD_STEREO))) - continue; - - if (ppfd->cDepthBits > 0 && pix[i].pfd.cDepthBits == 0) - continue; /* need depth buffer */ - - if (ppfd->cAlphaBits > 0 && pix[i].pfd.cAlphaBits == 0) - continue; /* need alpha buffer */ - - if(ppfd->iPixelType == pix[i].pfd.iPixelType) { - best = i + 1; - break; - } - } - - if(best == -1) { - SetLastError(0); - return(0); - } - - return(best); -} - -int GLAPIENTRY ChoosePixelFormat(HDC hdc, - CONST PIXELFORMATDESCRIPTOR *ppfd) -{ - return wglChoosePixelFormat(hdc,ppfd); -} - -int GLAPIENTRY wglDescribePixelFormat(HDC hdc,int iPixelFormat,UINT nBytes, - LPPIXELFORMATDESCRIPTOR ppfd) -{ - int qt_valid_pix; - - qt_valid_pix = qt_pix; - - if(iPixelFormat < 1 || iPixelFormat > qt_valid_pix || - ((nBytes != sizeof(PIXELFORMATDESCRIPTOR)) && (nBytes != 0))) { - SetLastError(0); - return(0); - } - - if(nBytes != 0) - *ppfd = pix[iPixelFormat - 1].pfd; - - return(qt_valid_pix); -} - -int GLAPIENTRY DescribePixelFormat(HDC hdc,int iPixelFormat,UINT nBytes, - LPPIXELFORMATDESCRIPTOR ppfd) -{ - return wglDescribePixelFormat(hdc,iPixelFormat,nBytes,ppfd); -} - -int GLAPIENTRY wglGetPixelFormat(HDC hdc) -{ - if(curPFD == 0) { - SetLastError(0); - return(0); - } - - return(curPFD); -} - -int GLAPIENTRY GetPixelFormat(HDC hdc) -{ - return wglGetPixelFormat(hdc); -} - -BOOL GLAPIENTRY wglSetPixelFormat(HDC hdc,int iPixelFormat, - CONST PIXELFORMATDESCRIPTOR *ppfd) -{ - int qt_valid_pix; - - qt_valid_pix = qt_pix; - - if(iPixelFormat < 1 || iPixelFormat > qt_valid_pix || ppfd->nSize != sizeof(PIXELFORMATDESCRIPTOR)) { - SetLastError(0); - return(FALSE); - } - curPFD = iPixelFormat; - - return(TRUE); -} - -BOOL GLAPIENTRY wglSwapBuffers(HDC hdc) -{ - if(!ctx) { - SetLastError(0); - return(FALSE); - } - - fxMesaSwapBuffers(); - - if(gdiWindowHack) { - GLuint width=ctx->width; - GLuint height=ctx->height; - - HDC hdcScreen = GetDC(dibWnd); - HDC hdcDIBSection = CreateCompatibleDC(hdcScreen); - HBITMAP holdBitmap = (HBITMAP) SelectObject(hdcDIBSection, dibHBM); - - FX_grLfbReadRegion(GR_BUFFER_FRONTBUFFER, 0, 0, - width, height, - width * 2, - dibSurfacePtr); - - /* Since the hardware is configured for GR_COLORFORMAT_ABGR the pixel data is - * going to come out as BGR 565, which is reverse of what we need for blitting - * to screen, so we need to convert it here pixel-by-pixel (ick). This loop would NOT - * be required if the color format was changed to GR_COLORFORMAT_ARGB, but I do - * not know the ramifications of that, so this will work until that is resolved. - * - * This routine CRIES out for MMX implementation, however since that's not - * guaranteed to be running on MMX enabled hardware so I'm not going to do - * that. I'm just going to try to make a reasonably efficient C - * version. -TAJ - * - * This routine drops frame rate by <1 fps on a 200Mhz MMX processor with a 640x480 - * display. Obviously, it's performance hit will be higher on larger displays and - * less on smaller displays. To support the window-hack display this is probably fine. - */ -#if FXMESA_USE_ARGB - { - unsigned long *pixel = dibSurfacePtr; - unsigned long count = (width * height) / 2; - - while (count--) - { - *pixel++ = (*pixel & 0x07e007e0) /* greens */ - | ((*pixel & 0xf800f800) >> 11) /* swap blues */ - | ((*pixel & 0x001f001f) << 11) /* swap reds */ - ; - } - } -#endif - - BitBlt(hdcScreen, 0, 0, - width, height, - hdcDIBSection, - 0, 0, SRCCOPY); - - ReleaseDC(dibWnd, hdcScreen); - SelectObject(hdcDIBSection, holdBitmap); - DeleteDC(hdcDIBSection); - } - - return(TRUE); -} - -BOOL GLAPIENTRY SetPixelFormat(HDC hdc, int iPixelFormat, - CONST PIXELFORMATDESCRIPTOR *ppfd) -{ - return wglSetPixelFormat(hdc,iPixelFormat,ppfd); -} - -BOOL GLAPIENTRY SwapBuffers(HDC hdc) -{ - return wglSwapBuffers(hdc); -} - -#endif /* FX */ Index: xc/extras/Mesa/src/FX/X86/fx_3dnow_fastpath.S diff -u xc/extras/Mesa/src/FX/X86/fx_3dnow_fastpath.S:1.1 xc/extras/Mesa/src/FX/X86/fx_3dnow_fastpath.S:removed --- xc/extras/Mesa/src/FX/X86/fx_3dnow_fastpath.S:1.1 Mon Dec 13 20:32:09 1999 +++ xc/extras/Mesa/src/FX/X86/fx_3dnow_fastpath.S Mon Dec 18 14:21:54 2000 @@ -1,82 +0,0 @@ -#include "../../X86/assyntax.h" - -#define SETUP_RGBA 0x1 -#define SETUP_TMU0 0x2 -#define SETUP_TMU1 0x4 - - -/* Pack either rgba or texture into the remaining half of a 32 byte vertex. - */ -#define CLIP_R 24 -#define CLIP_G 16 -#define CLIP_B 20 -#define CLIP_A 28 /* defined inf fxdrv.h */ - -#define CLIP_S0 16 -#define CLIP_T0 20 -#define CLIP_S1 24 -#define CLIP_T1 28 - -#define SIZE 4 -#define TYPE (0) -#define TAG(x) x -#include "fx_3dnow_fasttmp.h" - -#define SIZE 8 -#define TYPE (SETUP_RGBA) -#define TAG(x) x##_RGBA -#include "fx_3dnow_fasttmp.h" - -#define SIZE 6 -#define TYPE (SETUP_TMU0) -#define TAG(x) x##_TMU0 -#include "fx_3dnow_fasttmp.h" - -#define SIZE 8 -#define TYPE (SETUP_TMU0|SETUP_TMU1) -#define TAG(x) x##_TMU0_TMU1 -#include "fx_3dnow_fasttmp.h" - -#undef CLIP_S1 -#undef CLIP_T1 -#define CLIP_S1 16 -#define CLIP_T1 20 - -#define SIZE 6 -#define TYPE (SETUP_TMU1) -#define TAG(x) x##_TMU1 -#include "fx_3dnow_fasttmp.h" - -/* These three need to use a full 64 byte clip-space vertex. - */ -#undef CLIP_S0 -#undef CLIP_T0 -#undef CLIP_S1 -#undef CLIP_T1 - -#define CLIP_S0 32 -#define CLIP_T0 36 -#define CLIP_S1 40 -#define CLIP_T1 44 - -#define SIZE 10 -#define TYPE (SETUP_RGBA|SETUP_TMU0) -#define TAG(x) x##_RGBA_TMU0 -#include "fx_3dnow_fasttmp.h" - -#define SIZE 12 -#define TYPE (SETUP_RGBA|SETUP_TMU0|SETUP_TMU1) -#define TAG(x) x##_RGBA_TMU0_TMU1 -#include "fx_3dnow_fasttmp.h" - -#undef CLIP_S1 -#undef CLIP_T1 -#define CLIP_S1 32 -#define CLIP_T1 36 - -#define SIZE 10 -#define TYPE (SETUP_RGBA|SETUP_TMU1) -#define TAG(x) x##_RGBA_TMU1 -#include "fx_3dnow_fasttmp.h" - - Index: xc/extras/Mesa/src/FX/X86/fx_3dnow_fasttmp.h diff -u xc/extras/Mesa/src/FX/X86/fx_3dnow_fasttmp.h:1.1 xc/extras/Mesa/src/FX/X86/fx_3dnow_fasttmp.h:removed --- xc/extras/Mesa/src/FX/X86/fx_3dnow_fasttmp.h:1.1 Mon Dec 13 20:32:10 1999 +++ xc/extras/Mesa/src/FX/X86/fx_3dnow_fasttmp.h Mon Dec 18 14:21:54 2000 @@ -1,313 +0,0 @@ - -#if !defined(NASM_ASSEMBLER) && !defined(MASM_ASSEMBLER) -#define TAGLLBL(a) TAG(.L##a) -#else -#define TAGLLBL(a) TAG(a) -#endif - -#if !GLIDE3 - -#define GR_VERTEX_X_OFFSET 0 -#define GR_VERTEX_Y_OFFSET 4 -#define GR_VERTEX_Z_OFFSET 8 -#define GR_VERTEX_R_OFFSET 12 -#define GR_VERTEX_G_OFFSET 16 -#define GR_VERTEX_B_OFFSET 20 -#define GR_VERTEX_OOZ_OFFSET 24 -#define GR_VERTEX_A_OFFSET 28 -#define GR_VERTEX_OOW_OFFSET 32 - -#else /* GLIDE3 */ - -#define GR_VERTEX_X_OFFSET 0 -#define GR_VERTEX_Y_OFFSET 4 -#define GR_VERTEX_OOZ_OFFSET 8 -#define GR_VERTEX_OOW_OFFSET 12 -#define GR_VERTEX_R_OFFSET 16 -#define GR_VERTEX_G_OFFSET 20 -#define GR_VERTEX_B_OFFSET 24 -#define GR_VERTEX_A_OFFSET 28 -#define GR_VERTEX_Z_OFFSET 32 - -#endif /* GLIDE3 */ - -#define GR_VERTEX_SOW_TMU0_OFFSET 36 -#define GR_VERTEX_TOW_TMU0_OFFSET 40 -#define GR_VERTEX_OOW_TMU0_OFFSET 44 -#define GR_VERTEX_SOW_TMU1_OFFSET 48 -#define GR_VERTEX_TOW_TMU1_OFFSET 52 -#define GR_VERTEX_OOW_TMU1_OFFSET 56 - - - - -/*#define MAT_SX 0 /* accessed by REGIND !! */ -#define MAT_SY 20 -#define MAT_SZ 40 -#define MAT_TX 48 -#define MAT_TY 52 -#define MAT_TZ 56 - - - - -/* Do viewport map, device scale and perspective projection. - * - * void project_verts( GLfloat *first, - * GLfloat *last, - * const GLfloat *m, - * GLuint stride ) - * - * - * Rearrange fxVertices to look like grVertices. - */ - -GLOBL GLNAME( TAG(fx_3dnow_project_vertices) ) -GLNAME( TAG(fx_3dnow_project_vertices) ): - - PUSH_L ( EBP ) - - MOV_L ( REGOFF(8, ESP), ECX ) /* first_vert */ - MOV_L ( REGOFF(12, ESP), EDX ) /* last_vert */ - - CMP_L ( ECX, EDX ) - JE ( TAGLLBL(FXPV_end) ) - - FEMMS - - PREFETCH ( REGIND(ECX) ) /* fetch the first vertex */ - - MOV_L ( REGOFF(16, ESP), EBP ) /* matrix */ - MOV_L ( REGOFF(20, ESP), EAX ) /* stride */ - - MOVD ( REGOFF(MAT_TX, EBP), MM6 ) /* | tx */ - PUNPCKLDQ ( REGOFF(MAT_TY, EBP), MM6 ) /* ty | tx */ - -#if !defined(FX_V2) - MOV_L ( CONST(0x49400000), REGOFF(-8, ESP) ) /* snapper */ - MOV_L ( CONST(0x49400000), REGOFF(-4, ESP) ) /* snapper */ -#endif - - MOVQ ( REGOFF(-8, ESP), MM4 ) /* snapper | snapper */ - PFADD ( MM4, MM6 ) /* ty+snapper | tx+snapper */ - - MOVD ( REGIND(EBP), MM5 ) - PUNPCKLDQ ( REGOFF(MAT_SY, EBP), MM5 ) /* vsy | vsx */ - - MOVD ( REGOFF(MAT_SZ, EBP), MM1 ) /* | vsz */ - - -ALIGNTEXT32 -TAGLLBL(FXPV_loop_start): - - PREFETCH ( REGOFF(64, ECX) ) /* fetch the next-ish vertex */ - - - MOVD ( REGOFF(12, ECX), MM0 ) /* | f[3] */ - PFRCP ( MM0, MM0 ) /* oow = 1/f[3] */ - - MOVD ( REGOFF(12, ECX), MM7 ) /* | f[3] */ - PFRCPIT1 ( MM0, MM7 ) - PFRCPIT2 ( MM0, MM7 ) /* oow | oow */ - - PUNPCKLDQ ( MM7, MM7 ) - - -#if (TYPE & SETUP_RGBA) - MOVD ( REGOFF(CLIP_R, ECX ), MM0 ) /* f[RCOORD] = f[CLIP_R]; */ - MOVD ( MM0, REGOFF(GR_VERTEX_R_OFFSET, ECX) ) -#endif - -#if (TYPE & SETUP_TMU1) - MOVQ ( REGOFF(CLIP_S1, ECX), MM0 ) /* f[S1COORD] = f[CLIP_S1] * oow */ - PFMUL ( MM7, MM0 ) /* f[T1COORD] = f[CLIP_T1] * oow */ - MOVQ ( MM0, REGOFF(GR_VERTEX_SOW_TMU1_OFFSET, ECX) ) -#endif - - -#if (TYPE & SETUP_TMU0) - MOVQ ( REGOFF(CLIP_S0, ECX), MM0 ) /* f[S0COORD] = f[CLIP_S0] * oow */ - PFMUL ( MM7, MM0 ) /* f[T0COORD] = f[CLIP_T0] * oow */ - MOVQ ( MM0, REGOFF(GR_VERTEX_SOW_TMU0_OFFSET, ECX) ) -#endif - - - - - -/* DO_SETUP_XYZ */ - - MOVQ ( REGIND(ECX), MM2 ) /* f[1] | f[0] */ - PFMUL ( MM7, MM2 ) /* f[1] * oow | f[0] * oow */ - - MOVD ( REGOFF(8, ECX), MM3 ) /* | f[2] */ - PFMUL ( MM7, MM3 ) /* | f[2] * oow */ - - MOVD ( REGOFF(MAT_TZ, EBP), MM0 ) /* | vtz */ - PFMUL ( MM1, MM3 ) /* | f[2] *= vsz */ - - PFADD ( MM0, MM3 ) /* | f[2] += vtz */ - PFMUL ( MM5, MM2 ) /* f[1] *= vsy | f[0] *= vsx */ - - PFADD ( MM6, MM2 ) /* f[1] += vty | f[0] += vtx */ - -#if !defined(FX_V2) - PFSUB ( MM4, MM2 ) /* f[0,1] -= snapper */ -#endif - - MOVQ ( MM2, REGOFF(GR_VERTEX_X_OFFSET, ECX) ) - MOVD ( MM3, REGOFF(GR_VERTEX_OOZ_OFFSET, ECX) ) - - -/* end of DO_SETUP_XYZ */ - - MOVD ( MM7, REGOFF(GR_VERTEX_OOW_OFFSET, ECX) ) /* f[OOWCOORD] = oow */ - ADD_L ( EAX, ECX ) /* f += stride */ - - CMP_L ( ECX, EDX ) /* stall??? */ - JA ( TAGLLBL(FXPV_loop_start) ) - -TAGLLBL(FXPV_end): - FEMMS - POP_L ( EBP ) - RET - - - - - - - -/* void project_verts( GLfloat *first, - * GLfloat *last, - * const GLfloat *m, - * GLuint stride, - * const GLubyte *mask ) - * - */ - -GLOBL GLNAME( TAG(fx_3dnow_project_clipped_vertices) ) -GLNAME( TAG(fx_3dnow_project_clipped_vertices) ): - - PUSH_L ( EBP ) - - MOV_L ( REGOFF(8, ESP), ECX ) /* first FXDRIVER(VB)->verts*/ - MOV_L ( REGOFF(12, ESP), EDX ) /* last FXDRIVER(VB)->last_vert */ - - FEMMS - - PUSH_L ( EDI ) - PUSH_L ( ESI ) - - PREFETCH ( REGIND(ECX) ) /* fetch the first vertex */ - - MOV_L ( REGOFF(24, ESP), EBP ) /* mat ctx->Viewport.WindowMap.M */ - MOV_L ( REGOFF(28, ESP), EAX ) /* stride */ - MOV_L ( REGOFF(32, ESP), ESI ) /* VB->ClipMask */ - - MOVD ( REGOFF(MAT_TX, EBP), MM6 ) /* | tx */ - PUNPCKLDQ ( REGOFF(MAT_TY, EBP), MM6 ) /* ty | tx */ - -#if !defined(FX_V2) - MOV_L ( CONST(0x49400000), REGOFF(-8, ESP) ) /* snapper */ - MOV_L ( CONST(0x49400000), REGOFF(-4, ESP) ) /* snapper */ -#endif - - MOVQ ( REGOFF(-8, ESP), MM4 ) /* snapper | snapper */ - PFADD ( MM4, MM6 ) /* ty+snapper | tx+snapper */ - - MOVD ( REGIND(EBP), MM5 ) - PUNPCKLDQ ( REGOFF(MAT_SY, EBP), MM5 ) /* vsy | vsx */ - - MOVD ( REGOFF(MAT_SZ, EBP), MM1 ) /* | vsz */ - - - -ALIGNTEXT32 -TAGLLBL(FXPCV_loop_start): - - PREFETCH ( REGOFF(64, ECX) ) /* fetch the next-ish vertex */ - - CMP_B ( CONST(0), REGIND(ESI) ) - JNE ( TAGLLBL(FXPCV_skip) ) - - MOVD ( REGOFF(12, ECX), MM0) /* | f[3] */ - PFRCP ( MM0, MM0 ) /* oow = 1/f[3] */ - - MOVD ( REGOFF(12, ECX), MM7) /* | f[3] */ - PFRCPIT1 ( MM0, MM7 ) - PFRCPIT2 ( MM0, MM7 ) /* oow | oow */ - - PUNPCKLDQ ( MM7, MM7 ) - - -#if (TYPE & SETUP_RGBA) - MOVD ( REGOFF(CLIP_R, ECX ), MM0 ) /* f[RCOORD] = f[CLIP_R]; */ - MOVD ( MM0, REGOFF(GR_VERTEX_R_OFFSET, ECX) ) -#endif - -#if (TYPE & SETUP_TMU1) - MOVQ ( REGOFF(CLIP_S1, ECX), MM0 ) /* f[S1COORD] = f[CLIP_S1] * oow */ - PFMUL ( MM7, MM0 ) /* f[T1COORD] = f[CLIP_T1] * oow */ - MOVQ ( MM0, REGOFF(GR_VERTEX_SOW_TMU1_OFFSET, ECX) ) -#endif - - -#if (TYPE & SETUP_TMU0) - MOVQ ( REGOFF(CLIP_S0, ECX), MM0 ) /* f[S0COORD] = f[CLIP_S0] * oow */ - PFMUL ( MM7, MM0 ) /* f[T0COORD] = f[CLIP_T0] * oow */ - MOVQ ( MM0, REGOFF(GR_VERTEX_SOW_TMU0_OFFSET, ECX) ) -#endif - - - - -/* DO_SETUP_XYZ */ - - MOVQ ( REGIND(ECX), MM2 ) /* f[1] | f[0] */ - PFMUL ( MM7, MM2 ) /* f[1] * oow | f[0] * oow */ - - MOVD ( REGOFF(8, ECX), MM3 ) /* | f[2] */ - PFMUL ( MM7, MM3 ) /* | f[2] * oow */ - - MOVD ( REGOFF(MAT_TZ, EBP), MM0 ) /* | vtz */ - PFMUL ( MM1, MM3 ) /* | f[2] *= vsz */ - - PFADD ( MM0, MM3 ) /* | f[2] += vtz */ - PFMUL ( MM5, MM2 ) /* f[1] *= vsy | f[0] *= vsx */ - - PFADD ( MM6, MM2 ) /* f[1] += vty | f[0] += vtx */ - -#if !defined(FX_V2) - PFSUB ( MM4, MM2 ) /* f[0,1] -= snapper */ -#endif - - MOVQ ( MM2, REGOFF(GR_VERTEX_X_OFFSET, ECX) ) - MOVD ( MM3, REGOFF(GR_VERTEX_OOZ_OFFSET, ECX) ) - - -/* end of DO_SETUP_XYZ */ - - MOVD ( MM7, REGOFF(GR_VERTEX_OOW_OFFSET, ECX) ) /* f[OOWCOORD] = oow */ - -TAGLLBL(FXPCV_skip): - ADD_L ( EAX, ECX ) /* f += stride */ - - INC_L ( ESI ) /* next ClipMask */ - CMP_L ( ECX, EDX ) - JA ( TAGLLBL(FXPCV_loop_start) ) - - POP_L ( ESI ) - POP_L ( EDI ) - -TAGLLBL(FXPCV_end): - FEMMS - POP_L ( EBP ) - RET - - - -#undef TYPE -#undef TAG -#undef SIZE - Index: xc/extras/Mesa/src/OSmesa/Makefile.am diff -u /dev/null xc/extras/Mesa/src/OSmesa/Makefile.am:1.1.1.2 --- /dev/null Mon Dec 18 14:21:54 2000 +++ xc/extras/Mesa/src/OSmesa/Makefile.am Thu Nov 30 10:24:38 2000 @@ -0,0 +1,12 @@ +## Process this file with automake to produce Makefile.in + +#AUTOMAKE_OPTIONS = no-dependencies + +INCLUDES = -I$(top_srcdir)/include -I$(top_srcdir)/src + +if HAVE_OSMESA +# Build a libtool convenience library. +noinst_LTLIBRARIES = libMesaOS.la +endif + +libMesaOS_la_SOURCES = osmesa.c Index: xc/extras/Mesa/src/OSmesa/osmesa.c diff -u xc/extras/Mesa/src/OSmesa/osmesa.c:1.1 xc/extras/Mesa/src/OSmesa/osmesa.c:1.6 --- xc/extras/Mesa/src/OSmesa/osmesa.c:1.1 Fri Jun 16 20:02:38 2000 +++ xc/extras/Mesa/src/OSmesa/osmesa.c Thu Nov 30 10:39:16 2000 @@ -102,7 +102,7 @@ OSMesaContext osmesa; GLint rshift, gshift, bshift, ashift; GLint rind, gind, bind; - GLint indexBits, alphaBits; + GLint indexBits, alphaBits = 0; GLboolean rgbmode; GLboolean swalpha; GLuint i4 = 1; @@ -225,6 +225,7 @@ } gl_extensions_enable(&(osmesa->gl_ctx),"GL_HP_occlusion_test"); gl_extensions_enable(&(osmesa->gl_ctx), "GL_ARB_texture_cube_map"); + gl_extensions_enable(&(osmesa->gl_ctx), "GL_EXT_texture_env_combine"); osmesa->gl_buffer = gl_create_framebuffer( osmesa->gl_visual, osmesa->gl_visual->DepthBits > 0, @@ -1355,7 +1356,7 @@ OSMesaContext osmesa = (OSMesaContext) ctx; if (ctx->Line.SmoothFlag) return NULL; - if (ctx->Texture.Enabled) return NULL; + if (ctx->Texture.ReallyEnabled) return NULL; if (ctx->Light.ShadeModel!=GL_FLAT) return NULL; if (ctx->Line.Width==1.0F @@ -1541,7 +1542,7 @@ if (ctx->Polygon.SmoothFlag) return NULL; if (ctx->Polygon.StippleFlag) return NULL; - if (ctx->Texture.Enabled) return NULL; + if (ctx->Texture.ReallyEnabled) return NULL; if (ctx->RasterMask==DEPTH_BIT && ctx->Depth.Func==GL_LESS Index: xc/extras/Mesa/src/X/Makefile.am diff -u /dev/null xc/extras/Mesa/src/X/Makefile.am:1.1.1.2 --- /dev/null Mon Dec 18 14:21:55 2000 +++ xc/extras/Mesa/src/X/Makefile.am Thu Nov 30 10:24:45 2000 @@ -0,0 +1,23 @@ +## Process this file with automake to produce Makefile.in + +#AUTOMAKE_OPTIONS = no-dependencies + +INCLUDES = -I$(top_srcdir)/include -I$(top_srcdir)/src $(X_CFLAGS) $(FX_CFLAGS) + +if HAVE_X11 +# Build a libtool convenience library. +noinst_LTLIBRARIES = libMesaX11.la +endif + +libMesaX11_la_SOURCES = \ + glxapi.c \ + glxapi.h \ + fakeglx.c \ + xfonts.c \ + xmesa1.c \ + xmesa2.c \ + xmesa3.c \ + xmesa4.c \ + xmesaP.h + +libMesaX11_la_LIBADD = $(X_LIBS) $(X_PRE_LIBS) $(X_LIBADD) Index: xc/extras/Mesa/src/X/fakeglx.c diff -u xc/extras/Mesa/src/X/fakeglx.c:1.5 xc/extras/Mesa/src/X/fakeglx.c:1.10 --- xc/extras/Mesa/src/X/fakeglx.c:1.5 Fri Jun 16 20:02:38 2000 +++ xc/extras/Mesa/src/X/fakeglx.c Thu Nov 30 13:42:15 2000 @@ -1,7 +1,7 @@ /* * Mesa 3-D graphics library - * Version: 3.3 + * Version: 3.4 * * Copyright (C) 1999-2000 Brian Paul All Rights Reserved. * @@ -30,7 +30,7 @@ * * Thanks to the contributors: * - * Initial version: Philip Brown (philb@CSUA.Berkeley.EDU) + * Initial version: Philip Brown (phil@bolthole.com) * Better glXGetConfig() support: Armin Liebchen (liebchen@asylum.cs.utah.edu) * Further visual-handling refinements: Wolfram Gloger * (wmglo@Dent.MED.Uni-Muenchen.DE). @@ -64,7 +64,7 @@ #define SERVER_MINOR_VERSION 3 /* This is appended onto the glXGetClient/ServerString version strings. */ -#define MESA_GLX_VERSION "Mesa 3.3" +#define MESA_GLX_VERSION "Mesa 3.4" /* Who implemented this GLX? */ #define VENDOR "Brian Paul" @@ -560,7 +560,7 @@ int preferred_class ) { XVisualInfo *vis; - int xclass, visclass; + int xclass, visclass = 0; int depth; if (rgba) { @@ -857,7 +857,7 @@ int *parselist; XVisualInfo *vis; int min_ci = 0; - int min_red=0, min_green=0, min_blue=0; + int min_red=0, min_green=0, min_blue=0, min_alpha=0; GLboolean rgb_flag = GL_FALSE; GLboolean alpha_flag = GL_FALSE; GLboolean double_flag = GL_FALSE; @@ -921,10 +921,8 @@ break; case GLX_ALPHA_SIZE: parselist++; - { - GLint size = *parselist++; - alpha_flag = size>0 ? 1 : 0; - } + min_alpha = *parselist++; + alpha_flag = (min_alpha > 0); break; case GLX_DEPTH_SIZE: parselist++; @@ -1003,6 +1001,16 @@ } } + /* DEBUG + printf("glXChooseVisual:\n"); + printf(" GLX_RED_SIZE = %d\n", min_red); + printf(" GLX_GREEN_SIZE = %d\n", min_green); + printf(" GLX_BLUE_SIZE = %d\n", min_blue); + printf(" GLX_ALPHA_SIZE = %d\n", min_alpha); + printf(" GLX_DEPTH_SIZE = %d\n", depth_size); + printf(" GLX_STENCIL_SIZE = %d\n", stencil_size); + */ + /* * Since we're only simulating the GLX extension this function will never * find any real GL visuals. Instead, all we can do is try to find an RGB @@ -1049,15 +1057,32 @@ if (vis) { /* Note: we're not exactly obeying the glXChooseVisual rules here. * When GLX_DEPTH_SIZE = 1 is specified we're supposed to choose the - * largest depth buffer size, which is 32bits/value. However, we + * largest depth buffer size, which is 32bits/value. Instead, we * return 16 to maintain performance with earlier versions of Mesa. */ - if (depth_size == 1) - depth_size = DEFAULT_SOFTWARE_DEPTH_BITS; - else if (depth_size > 24) - depth_size = 31; + if (depth_size > 24) + depth_size = 31; /* 32 causes int overflow problems */ else if (depth_size > 16) depth_size = 24; + else if (depth_size > 0) + depth_size = DEFAULT_SOFTWARE_DEPTH_BITS; /*16*/ + + /* If using Glide, make sure we don't try to setup an impossible + * visual. This fixes the Q3 bug in which 24-bit Z was being reported. + */ + { + const char *fx = getenv("MESA_GLX_FX"); + if (fx && fx[0] != 'd') + if (depth_size > 16 || + stencil_size > 0 || + (min_red > 1 && min_red > 5) || + (min_green > 1 && min_green > 6) || + (min_blue > 1 && min_blue > 5) || + alpha_flag) + return NULL; + } + + /* we only support one size of stencil and accum buffers. */ if (stencil_size > 0) stencil_size = STENCIL_BITS; @@ -1837,7 +1862,7 @@ { int size = sizeof(struct _glxapi_table) / sizeof(void *); (void) size; - assert(_glxapi_get_dispatch_table_size() >= size); + assert((GLint) _glxapi_get_dispatch_table_size() >= size); } /* initialize the whole table to no-ops */ Index: xc/extras/Mesa/src/X/fakeglx.h diff -u xc/extras/Mesa/src/X/fakeglx.h:1.3 xc/extras/Mesa/src/X/fakeglx.h:removed --- xc/extras/Mesa/src/X/fakeglx.h:1.3 Tue Feb 15 02:13:13 2000 +++ xc/extras/Mesa/src/X/fakeglx.h Mon Dec 18 14:21:55 2000 @@ -1,141 +0,0 @@ - -/* - * Mesa 3-D graphics library - * Version: 3.1 - * - * Copyright (C) 1999 Brian Paul All Rights Reserved. - * - * 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 - * BRIAN PAUL 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. - */ - - - - - -/* - * GLX API functions which either call fake or real GLX implementations - */ - - - -#ifndef FAKEGLX_H -#define FAKEGLX_H - - -#include -#include -#include "GL/glx.h" - - -extern XVisualInfo *Fake_glXChooseVisual( Display *dpy, - int screen, int *list ); - - -extern int Fake_glXGetConfig( Display *dpy, XVisualInfo *visinfo, - int attrib, int *value ); - - -extern GLXContext Fake_glXCreateContext( Display *dpy, XVisualInfo *visinfo, - GLXContext shareList, Bool direct ); - - -extern void Fake_glXDestroyContext( Display *dpy, GLXContext ctx ); - - -extern void Fake_glXCopyContext( Display *dpy, GLXContext src, GLXContext dst, - GLuint mask ); - - -extern Bool Fake_glXMakeCurrent( Display *dpy, GLXDrawable drawable, - GLXContext ctx ); - - -extern GLXContext Fake_glXGetCurrentContext( void ); - - -extern GLXDrawable Fake_glXGetCurrentDrawable( void ); - - -extern GLXPixmap Fake_glXCreateGLXPixmap( Display *dpy, XVisualInfo *visinfo, - Pixmap pixmap ); - - -extern void Fake_glXDestroyGLXPixmap( Display *dpy, GLXPixmap pixmap ); - - -extern Bool Fake_glXQueryExtension( Display *dpy, int *errorb, int *event ); - - -extern Bool Fake_glXIsDirect( Display *dpy, GLXContext ctx ); - - -extern void Fake_glXSwapBuffers( Display *dpy, GLXDrawable drawable ); - - -extern void Fake_glXCopySubBufferMESA( Display *dpy, GLXDrawable drawable, - int x, int y, int width, int height ); - - -extern Bool Fake_glXQueryVersion( Display *dpy, int *maj, int *min ); - - -extern void Fake_glXUseXFont( Font font, int first, int count, int listBase ); - - -extern void Fake_glXWaitGL( void ); - - -extern void Fake_glXWaitX( void ); - - -/* GLX 1.1 and later */ -extern const char *Fake_glXQueryExtensionsString( Display *dpy, int screen ); - - -/* GLX 1.1 and later */ -extern const char *Fake_glXQueryServerString( Display *dpy, int screen, - int name ); - - -/* GLX 1.1 and later */ -extern const char *Fake_glXGetClientString( Display *dpy, int name ); - - -#ifdef GLX_MESA_release_buffers -extern Bool Fake_glXReleaseBuffersMESA( Display *dpy, Window w ); -#endif - - -#ifdef GLX_MESA_pixmap_colormap -extern GLXPixmap Fake_glXCreateGLXPixmapMESA( Display *dpy, - XVisualInfo *visinfo, - Pixmap pixmap, Colormap cmap ); -#endif - - -#ifdef GLX_MESA_set_3dfx_mode -extern GLboolean Fake_glXSet3DfxModeMESA( GLint mode ); -#endif - - -#ifdef GLX_EXT_get_proc_address -/*extern GLfunction Fake_glXGetProcAddress( const GLubyte *procName );*/ -extern void (*Fake_glXGetProcAddress( const GLubyte *procName ))(); -#endif - -#endif Index: xc/extras/Mesa/src/X/realglx.c diff -u xc/extras/Mesa/src/X/realglx.c:1.3 xc/extras/Mesa/src/X/realglx.c:removed --- xc/extras/Mesa/src/X/realglx.c:1.3 Tue Feb 15 02:13:14 2000 +++ xc/extras/Mesa/src/X/realglx.c Mon Dec 18 14:21:55 2000 @@ -1,238 +0,0 @@ - -/* - * Mesa 3-D graphics library - * Version: 3.1 - * - * Copyright (C) 1999 Brian Paul All Rights Reserved. - * - * 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 - * BRIAN PAUL 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. - */ - - - - - -/* - * Real GLX-encoder functions. Called from glxapi.c - * - * Steven Parker's code for the GLX client API functions should be - * put in this file. - * - * Also, the main API functions in api.c should somehow hook into the - * GLX-encoding functions... - */ - - - -#include -#include -#include "realglx.h" - - - -XVisualInfo *Real_glXChooseVisual( Display *dpy, int screen, int *list ) -{ - (void) dpy; - (void) screen; - (void) list; - return 0; -} - - - -int Real_glXGetConfig( Display *dpy, XVisualInfo *visinfo, - int attrib, int *value ) -{ - (void) dpy; - (void) visinfo; - (void) attrib; - (void) value; - return 0; -} - - - -GLXContext Real_glXCreateContext( Display *dpy, XVisualInfo *visinfo, - GLXContext shareList, Bool direct ) -{ - (void) dpy; - (void) visinfo; - (void) shareList; - (void) direct; - return 0; -} - - - -void Real_glXDestroyContext( Display *dpy, GLXContext ctx ) -{ - (void) dpy; - (void) ctx; -} - - - -void Real_glXCopyContext( Display *dpy, GLXContext src, GLXContext dst, - GLuint mask ) -{ - (void) dpy; - (void) src; - (void) dst; - (void) mask; -} - - - -Bool Real_glXMakeCurrent( Display *dpy, GLXDrawable drawable, GLXContext ctx ) -{ - (void) dpy; - (void) drawable; - (void) ctx; - return 0; -} - - - -GLXContext Real_glXGetCurrentContext( void ) -{ - return 0; -} - - - -GLXDrawable Real_glXGetCurrentDrawable( void ) -{ - return 0; -} - - - -GLXPixmap Real_glXCreateGLXPixmap( Display *dpy, XVisualInfo *visinfo, - Pixmap pixmap ) -{ - (void) dpy; - (void) visinfo; - (void) pixmap; - return 0; -} - - -void Real_glXDestroyGLXPixmap( Display *dpy, GLXPixmap pixmap ) -{ - (void) dpy; - (void) pixmap; -} - - - -Bool Real_glXQueryExtension( Display *dpy, int *errorb, int *event ) -{ - (void) dpy; - (void) errorb; - (void) event; - return 0; -} - - - -Bool Real_glXIsDirect( Display *dpy, GLXContext ctx ) -{ - (void) dpy; - (void) ctx; - return 0; -} - - - -void Real_glXSwapBuffers( Display *dpy, GLXDrawable drawable ) -{ - (void) dpy; - (void) drawable; -} - - - -Bool Real_glXQueryVersion( Display *dpy, int *maj, int *min ) -{ - (void) dpy; - (void) maj; - (void) min; - return 0; -} - - - -void Real_glXUseXFont( Font font, int first, int count, int listBase ) -{ - (void) font; - (void) first; - (void) count; - (void) listBase; -} - - -typedef struct { - struct { - int major_opcode; - } codes; - - - -} XExtDisplayInfo; - - -void Real_glXWaitGL( void ) -{ -} - - - -void Real_glXWaitX( void ) -{ -} - - - -/* GLX 1.1 and later */ -const char *Real_glXQueryExtensionsString( Display *dpy, int screen ) -{ - (void) dpy; - (void) screen; - return 0; -} - - - -/* GLX 1.1 and later */ -const char *Real_glXQueryServerString( Display *dpy, int screen, int name ) -{ - (void) dpy; - (void) screen; - (void) name; - return 0; -} - - - -/* GLX 1.1 and later */ -const char *Real_glXGetClientString( Display *dpy, int name ) -{ - (void) dpy; - (void) name; - return 0; -} Index: xc/extras/Mesa/src/X/realglx.h diff -u xc/extras/Mesa/src/X/realglx.h:1.3 xc/extras/Mesa/src/X/realglx.h:removed --- xc/extras/Mesa/src/X/realglx.h:1.3 Tue Feb 15 02:13:14 2000 +++ xc/extras/Mesa/src/X/realglx.h Mon Dec 18 14:21:55 2000 @@ -1,110 +0,0 @@ - -/* - * Mesa 3-D graphics library - * Version: 3.1 - * - * Copyright (C) 1999 Brian Paul All Rights Reserved. - * - * 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 - * BRIAN PAUL 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 REALGLX_H -#define REALGLX_H - - -#include -#include -#include "GL/glx.h" - - - -extern XVisualInfo *Real_glXChooseVisual( Display *dpy, - int screen, int *list ); - - -extern int Real_glXGetConfig( Display *dpy, XVisualInfo *visinfo, - int attrib, int *value ); - - -extern GLXContext Real_glXCreateContext( Display *dpy, XVisualInfo *visinfo, - GLXContext shareList, Bool direct ); - - -extern void Real_glXDestroyContext( Display *dpy, GLXContext ctx ); - - -extern void Real_glXCopyContext( Display *dpy, GLXContext src, GLXContext dst, - GLuint mask ); - - -extern Bool Real_glXMakeCurrent( Display *dpy, GLXDrawable drawable, - GLXContext ctx ); - - -extern GLXContext Real_glXGetCurrentContext( void ); - - -extern GLXDrawable Real_glXGetCurrentDrawable( void ); - - -extern GLXPixmap Real_glXCreateGLXPixmap( Display *dpy, XVisualInfo *visinfo, - Pixmap pixmap ); - - -extern void Real_glXDestroyGLXPixmap( Display *dpy, GLXPixmap pixmap ); - - -extern Bool Real_glXQueryExtension( Display *dpy, int *errorb, int *event ); - - -extern Bool Real_glXIsDirect( Display *dpy, GLXContext ctx ); - - -extern void Real_glXSwapBuffers( Display *dpy, GLXDrawable drawable ); - - -extern Bool Real_glXQueryVersion( Display *dpy, int *maj, int *min ); - - -extern void Real_glXUseXFont( Font font, int first, int count, int listBase ); - - -extern void Real_glXWaitGL( void ); - - -extern void Real_glXWaitX( void ); - - -/* GLX 1.1 and later */ -extern const char *Real_glXQueryExtensionsString( Display *dpy, int screen ); - - -/* GLX 1.1 and later */ -extern const char *Real_glXQueryServerString( Display *dpy, int screen, - int name ); - - -/* GLX 1.1 and later */ -extern const char *Real_glXGetClientString( Display *dpy, int name ); - - -#endif Index: xc/extras/Mesa/src/X/xfonts.c diff -u xc/extras/Mesa/src/X/xfonts.c:1.4 xc/extras/Mesa/src/X/xfonts.c:1.6 --- xc/extras/Mesa/src/X/xfonts.c:1.4 Fri Jun 16 20:02:38 2000 +++ xc/extras/Mesa/src/X/xfonts.c Thu Nov 30 10:39:19 2000 @@ -1,7 +1,7 @@ /* * Mesa 3-D graphics library - * Version: 3.3 + * Version: 3.4 * * Copyright (C) 1999-2000 Brian Paul All Rights Reserved. * @@ -40,11 +40,9 @@ #include #include "GL/gl.h" #include "GL/glx.h" -#include "GL/xmesa.h" #include "context.h" #include "mem.h" #include "xfonts.h" -#include "xmesaP.h" /* Some debugging info. */ @@ -181,7 +179,7 @@ static XCharStruct *isvalid(XFontStruct *fs, int which) { unsigned int rows,pages; - int byte1,byte2; + int byte1 = 0,byte2 = 0; int i,valid = 1; rows = fs->max_byte1 - fs->min_byte1 + 1; @@ -222,7 +220,6 @@ void Fake_glXUseXFont( Font font, int first, int count, int listbase ) { - XMesaContext CC; Display *dpy; Window win; Pixmap pixmap; @@ -230,26 +227,23 @@ XGCValues values; unsigned long valuemask; XFontStruct *fs; - GLint swapbytes, lsbfirst, rowlength; GLint skiprows, skippixels, alignment; - unsigned int max_width, max_height, max_bm_width, max_bm_height; GLubyte *bm; - int i; - CC = XMesaGetCurrentContext(); - dpy = CC->display; - win = CC->xm_buffer->frontbuffer; + dpy = glXGetCurrentDisplay(); + if (!dpy) + return; /* I guess glXMakeCurrent wasn't called */ + win = RootWindow(dpy, DefaultScreen(dpy)); fs = XQueryFont (dpy, font); - if (!fs) - { - gl_error (CC->gl_ctx, GL_INVALID_VALUE, - "Couldn't get font structure information"); + if (!fs) { + gl_error(NULL, GL_INVALID_VALUE, + "Couldn't get font structure information"); return; - } + } /* Allocate a bitmap that can fit all characters. */ max_width = fs->max_bounds.rbearing - fs->min_bounds.lbearing; @@ -261,10 +255,10 @@ (GLubyte)); if (!bm) { XFreeFontInfo( NULL, fs, 0 ); - gl_error (CC->gl_ctx, GL_OUT_OF_MEMORY, + gl_error(NULL, GL_OUT_OF_MEMORY, "Couldn't allocate bitmap in glXUseXFont()"); return; - } + } #if 0 /* get the page info */ @@ -386,16 +380,3 @@ glPixelStorei(GL_UNPACK_SKIP_PIXELS, skippixels); glPixelStorei(GL_UNPACK_ALIGNMENT, alignment); } - - -extern void xmesa_xfonts_dummy( void ); -void xmesa_xfonts_dummy( void ) -{ - /* silence unused var warnings */ - (void) kernel8; - (void) DitherValues; - (void) HPCR_DRGB; - (void) kernel1; -} - -/* The End. */ Index: xc/extras/Mesa/src/X/xmesa1.c diff -u xc/extras/Mesa/src/X/xmesa1.c:1.5 xc/extras/Mesa/src/X/xmesa1.c:1.9 --- xc/extras/Mesa/src/X/xmesa1.c:1.5 Fri Jun 16 20:02:39 2000 +++ xc/extras/Mesa/src/X/xmesa1.c Mon Nov 13 18:31:03 2000 @@ -1,7 +1,7 @@ /* * Mesa 3-D graphics library - * Version: 3.3 + * Version: 3.4 * * Copyright (C) 1999-2000 Brian Paul All Rights Reserved. * @@ -59,12 +59,17 @@ * */ +#ifdef __CYGWIN__ +#undef WIN32 +#undef __WIN32__ +#endif #include "glxheader.h" #include "GL/xmesa.h" #include "xmesaP.h" #include "context.h" #include "extensions.h" +#include "glthread.h" #include "matrix.h" #include "mem.h" #include "types.h" @@ -79,9 +84,10 @@ /* - * Current X/Mesa context pointer: + * Global X driver lock */ -static XMesaContext XMesa = NULL; +_glthread_Mutex _xmesa_lock; + /* @@ -237,7 +243,9 @@ int x, y; unsigned int bw, depth; + _glthread_LOCK_MUTEX(_xmesa_lock); XGetGeometry( dpy, d, &root, &x, &y, width, height, &bw, &depth ); + _glthread_UNLOCK_MUTEX(_xmesa_lock); #endif } @@ -314,7 +322,7 @@ /* * Determine if a given X window ID is valid (window exists). - * Do this by calling XGetWindowAttributes() for the window and + * Do this by calling XGetIconName() for the window and * checking if we catch an X error. * Input: dpy - the display * win - the window to check for existance @@ -335,12 +343,14 @@ static GLboolean window_exists( XMesaDisplay *dpy, Window win ) { - XWindowAttributes wa; + char *name; int (*old_handler)( XMesaDisplay*, XErrorEvent* ); WindowExistsFlag = GL_TRUE; old_handler = XSetErrorHandler(window_exists_err_handler); - XGetWindowAttributes( dpy, win, &wa ); /* dummy request */ + XGetIconName(dpy, win, &name); /* dummy request */ XSetErrorHandler(old_handler); + if (name) + XFree(name); return WindowExistsFlag; } #endif @@ -1459,10 +1469,14 @@ /* For debugging only */ if (getenv("MESA_XSYNC")) { + /* This makes debugging X easier. + * In your debugger, set a breakpoint on _XError to stop when an + * X protocol error is generated. + */ #ifdef XFree86Server /* NOT_NEEDED */ #else - XSynchronize( display, 1 ); /* This makes debugging X easier */ + XSynchronize( display, 1 ); #endif } @@ -1553,6 +1567,9 @@ } } + if (alpha_flag && alpha_bits == 0) + alpha_bits = 8; + v->gl_visual = _mesa_create_visual( rgb_flag, db_flag, stereo_flag, red_bits, green_bits, blue_bits, alpha_bits, @@ -1603,6 +1620,12 @@ XMesaContext c; GLboolean direct = GL_TRUE; /* XXXX */ /* NOT_DONE: should this be GL_FALSE??? */ + static GLboolean firstTime = GL_TRUE; + + if (firstTime) { + _glthread_INIT_MUTEX(_xmesa_lock); + firstTime = GL_FALSE; + } c = (XMesaContext) CALLOC_STRUCT(xmesa_context); if (!c) { @@ -1619,6 +1642,7 @@ gl_extensions_enable(c->gl_ctx, "GL_HP_occlusion_test"); gl_extensions_enable(c->gl_ctx, "GL_ARB_texture_cube_map"); + gl_extensions_enable(c->gl_ctx, "GL_EXT_texture_env_combine"); if (CHECK_BYTE_ORDER(v)) { c->swapbytes = GL_FALSE; @@ -1682,10 +1706,6 @@ } } - /* Set current context ptr to NULL if we freed it */ - if (XMesa == c) - XMesa = NULL; - FREE( c ); } @@ -2012,7 +2032,6 @@ #ifdef FX if (drawBuffer->FXctx) { fxMesaMakeCurrent(drawBuffer->FXctx); - XMesa = c; /* Disassociate old buffer from this context */ if (c->xm_buffer) @@ -2046,7 +2065,6 @@ c->use_read_buffer = (drawBuffer != readBuffer); gl_make_current2(c->gl_ctx, drawBuffer->gl_buffer, readBuffer->gl_buffer); - XMesa = c; if (c->gl_ctx->Viewport.Width == 0) { /* initialize viewport to window size */ @@ -2078,7 +2096,6 @@ else { /* Detach */ gl_make_current2( NULL, NULL, NULL ); - XMesa = NULL; } return GL_TRUE; } @@ -2096,14 +2113,23 @@ XMesaContext XMesaGetCurrentContext( void ) { - return XMesa; + GET_CURRENT_CONTEXT(ctx); + if (ctx) { + XMesaContext xmesa = (XMesaContext) ctx->DriverCtx; + return xmesa; + } + else { + return 0; + } } XMesaBuffer XMesaGetCurrentBuffer( void ) { - if (XMesa) { - return XMesa->xm_buffer; + GET_CURRENT_CONTEXT(ctx); + if (ctx) { + XMesaContext xmesa = (XMesaContext) ctx->DriverCtx; + return xmesa->xm_buffer; } else { return 0; @@ -2114,8 +2140,10 @@ /* New in Mesa 3.1 */ XMesaBuffer XMesaGetCurrentReadBuffer( void ) { - if (XMesa) { - return XMesa->xm_buffer; + GET_CURRENT_CONTEXT(ctx); + if (ctx) { + XMesaContext xmesa = (XMesaContext) ctx->DriverCtx; + return xmesa->xm_buffer; } else { return 0; @@ -2128,12 +2156,10 @@ if (c) { if (c->gl_ctx != gl_get_current_context()) { gl_make_current(c->gl_ctx, c->xm_buffer->gl_buffer); - XMesa = c; } } else { gl_make_current(NULL, NULL); - XMesa = NULL; } return GL_TRUE; } @@ -2143,7 +2169,6 @@ { (void) c; gl_make_current(NULL, NULL); - XMesa = NULL; return GL_TRUE; } @@ -2156,6 +2181,7 @@ #ifdef FX const char *fx = getenv("MESA_GLX_FX"); if (fx && fx[0] != 'd') { + GET_CURRENT_CONTEXT(ctx); GrHwConfiguration hw; if (!FX_grSstQueryHardware(&hw)) { /*fprintf(stderr, "!grSstQueryHardware\n");*/ @@ -2165,17 +2191,18 @@ /*fprintf(stderr, "hw.num_sst < 1\n");*/ return GL_FALSE; } - if (XMesa) { + if (ctx) { + XMesaContext xmesa = (XMesaContext) ctx->DriverCtx; if (mode == XMESA_FX_WINDOW) { - if (XMesa->xm_buffer->FXisHackUsable) { + if (xmesa->xm_buffer->FXisHackUsable) { FX_grSstControl(GR_CONTROL_DEACTIVATE); - XMesa->xm_buffer->FXwindowHack = GL_TRUE; + xmesa->xm_buffer->FXwindowHack = GL_TRUE; return GL_TRUE; } } else if (mode == XMESA_FX_FULLSCREEN) { FX_grSstControl(GR_CONTROL_ACTIVATE); - XMesa->xm_buffer->FXwindowHack = GL_FALSE; + xmesa->xm_buffer->FXwindowHack = GL_FALSE; return GL_TRUE; } else { @@ -2202,8 +2229,9 @@ int x, y; XMesaWindow root; unsigned int bw, depth, width, height; + XMesaContext xmesa = (XMesaContext) b->xm_context->gl_ctx->DriverCtx; - assert(XMesa->xm_buffer->FXctx); + assert(xmesa->xm_buffer->FXctx); #ifdef XFree86Server x = b->frontbuffer->x; @@ -2212,30 +2240,29 @@ height = b->frontbuffer->height; depth = b->frontbuffer->depth; #else - XGetGeometry( XMesa->xm_visual->display, b->frontbuffer, + XGetGeometry( xmesa->xm_visual->display, b->frontbuffer, &root, &x, &y, &width, &height, &bw, &depth); #endif if (b->width != width || b->height != height) { - b->width = MIN2((int)width, XMesa->xm_buffer->FXctx->width); - b->height = MIN2((int)height, XMesa->xm_buffer->FXctx->height); + b->width = MIN2((int)width, xmesa->xm_buffer->FXctx->width); + b->height = MIN2((int)height, xmesa->xm_buffer->FXctx->height); if (b->width & 1) b->width--; /* prevent odd width */ xmesa_alloc_back_buffer( b ); } grLfbWriteColorFormat(GR_COLORFORMAT_ARGB); - if (XMesa->xm_visual->undithered_pf==PF_5R6G5B) { + if (xmesa->xm_visual->undithered_pf==PF_5R6G5B) { /* Special case: 16bpp RGB */ grLfbReadRegion( GR_BUFFER_FRONTBUFFER, /* src buffer */ - 0, XMesa->xm_buffer->FXctx->height - b->height, /*pos*/ + 0, xmesa->xm_buffer->FXctx->height - b->height, /*pos*/ b->width, b->height, /* size */ b->width * sizeof(GLushort), /* stride */ b->backimage->data); /* dest buffer */ } - else if (XMesa->xm_visual->dithered_pf==PF_DITHER - && GET_VISUAL_DEPTH(XMesa->xm_visual)==8) { + else if (xmesa->xm_visual->dithered_pf==PF_DITHER + && GET_VISUAL_DEPTH(xmesa->xm_visual)==8) { /* Special case: 8bpp RGB */ - XMesaContext xmesa = XMesa; /* Needed for DITHER macros */ for (y=0;yheight;y++) { GLubyte *ptr = (GLubyte*) xmesa->xm_buffer->backimage->data + xmesa->xm_buffer->backimage->bytes_per_line * y; @@ -2243,7 +2270,7 @@ /* read row from 3Dfx frame buffer */ grLfbReadRegion( GR_BUFFER_FRONTBUFFER, - 0, XMesa->xm_buffer->FXctx->height-(b->height-y), + 0, xmesa->xm_buffer->FXctx->height-(b->height-y), b->width, 1, 0, pixbuf ); @@ -2262,7 +2289,7 @@ for (y=0;yheight;y++) { /* read row from 3Dfx frame buffer */ grLfbReadRegion( GR_BUFFER_FRONTBUFFER, - 0, XMesa->xm_buffer->FXctx->height-(b->height-y), + 0, xmesa->xm_buffer->FXctx->height-(b->height-y), b->width, 1, 0, pixbuf ); @@ -2270,11 +2297,11 @@ /* write to XImage back buffer */ for (x=0;xwidth;x++) { XMesaPutPixel(b->backimage,x,y, - xmesa_color_to_pixel(XMesa, + xmesa_color_to_pixel(xmesa, (pixbuf[x] & 0xf800) >> 8, (pixbuf[x] & 0x07e0) >> 3, (pixbuf[x] & 0x001f) << 3, - 0xff, XMesa->pixelformat)); + 0xff, xmesa->pixelformat)); } } } @@ -2289,18 +2316,20 @@ */ void XMesaSwapBuffers( XMesaBuffer b ) { -#ifdef PROFILE - GLdouble t0 = gl_time(); -#endif + GET_CURRENT_CONTEXT(ctx); - _mesa_swapbuffers(XMesa->gl_ctx); + /* If we're swapping the buffer associated with the current context + * we have to flush any pending rendering commands first. + */ + if (b->xm_context && b->xm_context->gl_ctx == ctx) + _mesa_swapbuffers(ctx); if (b->db_state) { #ifdef FX - if (XMesa->xm_buffer->FXctx) { + if (b->FXctx) { fxMesaSwapBuffers(); - if (XMesa->xm_buffer->FXwindowHack) + if (b->FXwindowHack) FXgetImage(b); else return; @@ -2310,11 +2339,12 @@ /* Copy Ximage from host's memory to server's window */ #if defined(USE_XSHM) && !defined(XFree86Server) if (b->shm) { + /*_glthread_LOCK_MUTEX(_xmesa_lock);*/ XShmPutImage( b->xm_visual->display, b->frontbuffer, b->cleargc, b->backimage, 0, 0, 0, 0, b->width, b->height, False ); - /* wait for finished event??? */ + /*_glthread_UNLOCK_MUTEX(_xmesa_lock);*/ } else #endif @@ -2322,15 +2352,18 @@ #if defined(GLX_DIRECT_RENDERING) && !defined(XFree86Server) XMesaDriSwapBuffers( b ); #else + /*_glthread_LOCK_MUTEX(_xmesa_lock);*/ XMesaPutImage( b->xm_visual->display, b->frontbuffer, b->cleargc, b->backimage, 0, 0, 0, 0, b->width, b->height ); + /*_glthread_UNLOCK_MUTEX(_xmesa_lock);*/ #endif } } else { /* Copy pixmap to window on server */ + /*_glthread_LOCK_MUTEX(_xmesa_lock);*/ XMesaCopyArea( b->xm_visual->display, b->backpixmap, /* source drawable */ b->frontbuffer, /* dest. drawable */ @@ -2338,17 +2371,12 @@ 0, 0, b->width, b->height, /* source region */ 0, 0 /* dest region */ ); + /*_glthread_UNLOCK_MUTEX(_xmesa_lock);*/ } } -#if defined(GLX_DIRECT_RENDERING) || defined(XFree86Server) - /* NOT_NEEDED */ -#else +#if !defined(GLX_DIRECT_RENDERING) && !defined(XFree86Server) XSync( b->xm_visual->display, False ); #endif -#ifdef PROFILE - XMesa->gl_ctx->SwapCount++; - XMesa->gl_ctx->SwapTime += gl_time() - t0; -#endif } @@ -2358,18 +2386,20 @@ */ void XMesaCopySubBuffer( XMesaBuffer b, int x, int y, int width, int height ) { -#ifdef PROFILE - GLdouble t0 = gl_time(); -#endif + GET_CURRENT_CONTEXT(ctx); - FLUSH_VB( XMesa->gl_ctx, "swap buffers" ); + /* If we're swapping the buffer associated with the current context + * we have to flush any pending rendering commands first. + */ + if (b->xm_context->gl_ctx == ctx) + _mesa_swapbuffers(ctx); if (b->db_state) { int yTop = b->bottom - y - height; #ifdef FX - if (XMesa->xm_buffer->FXctx) { + if (b->FXctx) { fxMesaSwapBuffers(); - if (XMesa->xm_buffer->FXwindowHack) + if (b->FXwindowHack) FXgetImage(b); else return; @@ -2407,15 +2437,6 @@ ); } } -#ifdef XFree86Server - /* NOT_NEEDED */ -#else - XSync( b->xm_visual->display, False ); -#endif -#ifdef PROFILE - XMesa->gl_ctx->SwapCount++; - XMesa->gl_ctx->SwapTime += gl_time() - t0; -#endif } @@ -2490,7 +2511,7 @@ { (void) c; if (name==XMESA_VERSION) { - return "3.1"; + return "3.4"; } else if (name==XMESA_EXTENSIONS) { return ""; @@ -2545,7 +2566,6 @@ XMesaDestroyBuffer(XMesaBufferList); XMesaBufferList = NULL; - XMesa = NULL; } Index: xc/extras/Mesa/src/X/xmesa2.c diff -u xc/extras/Mesa/src/X/xmesa2.c:1.5 xc/extras/Mesa/src/X/xmesa2.c:1.9 --- xc/extras/Mesa/src/X/xmesa2.c:1.5 Fri Jun 16 20:02:39 2000 +++ xc/extras/Mesa/src/X/xmesa2.c Mon Nov 13 18:31:04 2000 @@ -150,8 +150,10 @@ int winx, winy; unsigned int bw, d; + _glthread_LOCK_MUTEX(_xmesa_lock); XGetGeometry( xmesa->display, xmesa->xm_buffer->frontbuffer, &root, &winx, &winy, &winwidth, &winheight, &bw, &d ); + _glthread_UNLOCK_MUTEX(_xmesa_lock); #else winwidth = xmesa->xm_buffer->frontbuffer->width; @@ -209,7 +211,9 @@ #else const XMesaContext xmesa = (XMesaContext) ctx->DriverCtx; if (xmesa) { + _glthread_LOCK_MUTEX(_xmesa_lock); XSync( xmesa->display, False ); + _glthread_UNLOCK_MUTEX(_xmesa_lock); } #endif } @@ -222,7 +226,9 @@ #else const XMesaContext xmesa = (XMesaContext) ctx->DriverCtx; if (xmesa) { + _glthread_LOCK_MUTEX(_xmesa_lock); XFlush( xmesa->display ); + _glthread_UNLOCK_MUTEX(_xmesa_lock); } #endif } @@ -353,8 +359,10 @@ xmesa->clearcolor[3] = a; xmesa->clearpixel = xmesa_color_to_pixel( xmesa, r, g, b, a, xmesa->xm_visual->undithered_pf ); + _glthread_LOCK_MUTEX(_xmesa_lock); XMesaSetForeground( xmesa->display, xmesa->xm_buffer->cleargc, xmesa->clearpixel ); + _glthread_UNLOCK_MUTEX(_xmesa_lock); } @@ -528,8 +536,10 @@ case GL_OR_INVERTED: func = GXorInverted; break; default: return GL_FALSE; } + _glthread_LOCK_MUTEX(_xmesa_lock); XMesaSetFunction( xmesa->display, xmesa->xm_buffer->gc1, func ); XMesaSetFunction( xmesa->display, xmesa->xm_buffer->gc2, func ); + _glthread_UNLOCK_MUTEX(_xmesa_lock); return GL_TRUE; } @@ -5102,7 +5112,7 @@ #endif case GL_VENDOR: #ifdef XFree86Server - return (const GLubyte *) "Precision Insight, Inc."; + return (const GLubyte *) "VA Linux Systems, Inc."; #else return NULL; #endif Index: xc/extras/Mesa/src/X/xmesa3.c diff -u xc/extras/Mesa/src/X/xmesa3.c:1.4 xc/extras/Mesa/src/X/xmesa3.c:1.9 --- xc/extras/Mesa/src/X/xmesa3.c:1.4 Fri Jun 16 20:02:39 2000 +++ xc/extras/Mesa/src/X/xmesa3.c Thu Nov 30 10:39:19 2000 @@ -1,9 +1,9 @@ /* * Mesa 3-D graphics library - * Version: 3.3 + * Version: 3.4 * - * Copyright (C) 1999 Brian Paul All Rights Reserved. + * Copyright (C) 1999-2000 Brian Paul All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), @@ -61,7 +61,7 @@ if (xmesa->xm_visual->gl_visual->RGBAflag) { /* RGB mode */ - for (i=first;i<=last;i++) { + for (i=first;iClipMask[i]==0) { register int x, y; const GLubyte *color = VB->ColorPtr->data[i]; @@ -99,16 +99,16 @@ XMesaContext xmesa = (XMesaContext) ctx->DriverCtx; if (ctx->Point.Size==1.0F && !ctx->Point.SmoothFlag && ctx->RasterMask==0 - && !ctx->Texture.Enabled) { + && !ctx->Texture.ReallyEnabled) { if (xmesa->xm_buffer->buffer==XIMAGE) { - return NULL; /*draw_points_ximage;*/ + return (points_func)NULL; /*draw_points_ximage;*/ } else { return draw_points_ANY_pixmap; } } else { - return NULL; + return (points_func)NULL; } } @@ -670,11 +670,11 @@ (void) DitherValues; /* silence unused var warning */ (void) kernel1; /* silence unused var warning */ - if (ctx->Line.SmoothFlag) return NULL; - if (ctx->Texture.Enabled) return NULL; - if (ctx->Light.ShadeModel!=GL_FLAT) return NULL; + if (ctx->Line.SmoothFlag) return (line_func)NULL; + if (ctx->Texture.ReallyEnabled) return (line_func)NULL; + if (ctx->Light.ShadeModel!=GL_FLAT) return (line_func)NULL; /* X line stippling doesn't match OpenGL stippling */ - if (ctx->Line.StippleFlag==GL_TRUE) return NULL; + if (ctx->Line.StippleFlag==GL_TRUE) return (line_func)NULL; if (xmesa->xm_buffer->buffer==XIMAGE && ctx->RasterMask==DEPTH_BIT @@ -696,9 +696,9 @@ case PF_DITHER_5R6G5B: return flat_DITHER_5R6G5B_z_line; case PF_DITHER: - return (depth==8) ? flat_DITHER8_z_line : NULL; + return (depth==8) ? flat_DITHER8_z_line : (line_func)NULL; case PF_LOOKUP: - return (depth==8) ? flat_LOOKUP8_z_line : NULL; + return (depth==8) ? flat_LOOKUP8_z_line : (line_func)NULL; case PF_HPCR: return flat_HPCR_z_line; default: @@ -722,18 +722,24 @@ case PF_DITHER_5R6G5B: return flat_DITHER_5R6G5B_line; case PF_DITHER: - return (depth==8) ? flat_DITHER8_line : NULL; + return (depth==8) ? flat_DITHER8_line : (line_func)NULL; case PF_LOOKUP: - return (depth==8) ? flat_LOOKUP8_line : NULL; + return (depth==8) ? flat_LOOKUP8_line : (line_func)NULL; case PF_HPCR: return flat_HPCR_line; default: return NULL; } } +#if 0 + /* XXX have to disable this because X's rasterization rules don't match + * software Mesa's. This causes the linehv.c conformance test to fail. + * In the future, we might provide a config option to enable this. + */ if (xmesa->xm_buffer->buffer!=XIMAGE && ctx->RasterMask==0) { setup_x_line_options( ctx ); return flat_pixmap_line; } - return NULL; +#endif + return (line_func)NULL; } Index: xc/extras/Mesa/src/X/xmesa4.c diff -u xc/extras/Mesa/src/X/xmesa4.c:1.4 xc/extras/Mesa/src/X/xmesa4.c:1.8 --- xc/extras/Mesa/src/X/xmesa4.c:1.4 Fri Jun 16 20:02:39 2000 +++ xc/extras/Mesa/src/X/xmesa4.c Mon Nov 13 18:31:04 2000 @@ -1,9 +1,9 @@ /* * Mesa 3-D graphics library - * Version: 3.3 + * Version: 3.4 * - * Copyright (C) 1999 Brian Paul All Rights Reserved. + * Copyright (C) 1999-2000 Brian Paul All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), @@ -1439,6 +1439,98 @@ } +#ifdef DEBUG +void +_xmesa_print_triangle_func( triangle_func triFunc ) +{ + printf("XMesa tri func = "); + if (triFunc ==smooth_TRUECOLOR_z_triangle) + printf("smooth_TRUECOLOR_z_triangle\n"); + else if (triFunc ==smooth_8A8B8G8R_z_triangle) + printf("smooth_8A8B8G8R_z_triangle\n"); + else if (triFunc ==smooth_8R8G8B_z_triangle) + printf("smooth_8R8G8B_z_triangle\n"); + else if (triFunc ==smooth_8R8G8B24_z_triangle) + printf("smooth_8R8G8B24_z_triangle\n"); + else if (triFunc ==smooth_TRUEDITHER_z_triangle) + printf("smooth_TRUEDITHER_z_triangle\n"); + else if (triFunc ==smooth_5R6G5B_z_triangle) + printf("smooth_5R6G5B_z_triangle\n"); + else if (triFunc ==smooth_DITHER_5R6G5B_z_triangle) + printf("smooth_DITHER_5R6G5B_z_triangle\n"); + else if (triFunc ==smooth_HPCR_z_triangle) + printf("smooth_HPCR_z_triangle\n"); + else if (triFunc ==smooth_DITHER8_z_triangle) + printf("smooth_DITHER8_z_triangle\n"); + else if (triFunc ==smooth_LOOKUP8_z_triangle) + printf("smooth_LOOKUP8_z_triangle\n"); + else if (triFunc ==flat_TRUECOLOR_z_triangle) + printf("flat_TRUECOLOR_z_triangle\n"); + else if (triFunc ==flat_8A8B8G8R_z_triangle) + printf("flat_8A8B8G8R_z_triangle\n"); + else if (triFunc ==flat_8R8G8B_z_triangle) + printf("flat_8R8G8B_z_triangle\n"); + else if (triFunc ==flat_8R8G8B24_z_triangle) + printf("flat_8R8G8B24_z_triangle\n"); + else if (triFunc ==flat_TRUEDITHER_z_triangle) + printf("flat_TRUEDITHER_z_triangle\n"); + else if (triFunc ==flat_5R6G5B_z_triangle) + printf("flat_5R6G5B_z_triangle\n"); + else if (triFunc ==flat_DITHER_5R6G5B_z_triangle) + printf("flat_DITHER_5R6G5B_z_triangle\n"); + else if (triFunc ==flat_HPCR_z_triangle) + printf("flat_HPCR_z_triangle\n"); + else if (triFunc ==flat_DITHER8_z_triangle) + printf("flat_DITHER8_z_triangle\n"); + else if (triFunc ==flat_LOOKUP8_z_triangle) + printf("flat_LOOKUP8_z_triangle\n"); + else if (triFunc ==smooth_TRUECOLOR_triangle) + printf("smooth_TRUECOLOR_triangle\n"); + else if (triFunc ==smooth_8A8B8G8R_triangle) + printf("smooth_8A8B8G8R_triangle\n"); + else if (triFunc ==smooth_8R8G8B_triangle) + printf("smooth_8R8G8B_triangle\n"); + else if (triFunc ==smooth_8R8G8B24_triangle) + printf("smooth_8R8G8B24_triangle\n"); + else if (triFunc ==smooth_TRUEDITHER_triangle) + printf("smooth_TRUEDITHER_triangle\n"); + else if (triFunc ==smooth_5R6G5B_triangle) + printf("smooth_5R6G5B_triangle\n"); + else if (triFunc ==smooth_DITHER_5R6G5B_triangle) + printf("smooth_DITHER_5R6G5B_triangle\n"); + else if (triFunc ==smooth_HPCR_triangle) + printf("smooth_HPCR_triangle\n"); + else if (triFunc ==smooth_DITHER8_triangle) + printf("smooth_DITHER8_triangle\n"); + else if (triFunc ==smooth_LOOKUP8_triangle) + printf("smooth_LOOKUP8_triangle\n"); + else if (triFunc ==flat_TRUECOLOR_triangle) + printf("flat_TRUECOLOR_triangle\n"); + else if (triFunc ==flat_TRUEDITHER_triangle) + printf("flat_TRUEDITHER_triangle\n"); + else if (triFunc ==flat_8A8B8G8R_triangle) + printf("flat_8A8B8G8R_triangle\n"); + else if (triFunc ==flat_8R8G8B_triangle) + printf("flat_8R8G8B_triangle\n"); + else if (triFunc ==flat_8R8G8B24_triangle) + printf("flat_8R8G8B24_triangle\n"); + else if (triFunc ==flat_5R6G5B_triangle) + printf("flat_5R6G5B_triangle\n"); + else if (triFunc ==flat_DITHER_5R6G5B_triangle) + printf("flat_DITHER_5R6G5B_triangle\n"); + else if (triFunc ==flat_HPCR_triangle) + printf("flat_HPCR_triangle\n"); + else if (triFunc ==flat_DITHER8_triangle) + printf("flat_DITHER8_triangle\n"); + else if (triFunc ==flat_LOOKUP8_triangle) + printf("flat_LOOKUP8_triangle\n"); + else if (triFunc ==flat_pixmap_triangle) + printf("flat_pixmap_triangle\n"); + else + printf("???\n"); +} +#endif + triangle_func xmesa_get_triangle_func( GLcontext *ctx ) { @@ -1447,8 +1539,8 @@ (void) kernel1; - if (ctx->Polygon.SmoothFlag) return NULL; - if (ctx->Texture.Enabled) return NULL; + if (ctx->Polygon.SmoothFlag) return (triangle_func)NULL; + if (ctx->Texture.ReallyEnabled) return (triangle_func)NULL; if (xmesa->xm_buffer->buffer==XIMAGE) { if ( ctx->Light.ShadeModel==GL_SMOOTH @@ -1478,9 +1570,9 @@ return (depth==8) ? smooth_DITHER8_z_triangle : smooth_DITHER_z_triangle; case PF_LOOKUP: - return (depth==8) ? smooth_LOOKUP8_z_triangle : NULL; + return (depth==8) ? smooth_LOOKUP8_z_triangle : (triangle_func)NULL; default: - return NULL; + return (triangle_func)NULL; } } if ( ctx->Light.ShadeModel==GL_FLAT @@ -1510,9 +1602,9 @@ return (depth==8) ? flat_DITHER8_z_triangle : flat_DITHER_z_triangle; case PF_LOOKUP: - return (depth==8) ? flat_LOOKUP8_z_triangle : NULL; + return (depth==8) ? flat_LOOKUP8_z_triangle : (triangle_func)NULL; default: - return NULL; + return (triangle_func)NULL; } } if ( ctx->RasterMask==0 /* no depth test */ @@ -1539,9 +1631,9 @@ return (depth==8) ? smooth_DITHER8_triangle : smooth_DITHER_triangle; case PF_LOOKUP: - return (depth==8) ? smooth_LOOKUP8_triangle : NULL; + return (depth==8) ? smooth_LOOKUP8_triangle : (triangle_func)NULL; default: - return NULL; + return (triangle_func)NULL; } } @@ -1569,22 +1661,29 @@ return (depth==8) ? flat_DITHER8_triangle : flat_DITHER_triangle; case PF_LOOKUP: - return (depth==8) ? flat_LOOKUP8_triangle : NULL; + return (depth==8) ? flat_LOOKUP8_triangle : (triangle_func)NULL; default: - return NULL; + return (triangle_func)NULL; } } - return NULL; + return (triangle_func)NULL; } else { - /* pixmap */ + /* draw to pixmap */ +#if 0 + /* XXX have to disable this because X's rasterization rules + * don't match software Mesa's. This causes a buffer invariance + * test failure in the conformance tests. + * In the future, we might provide a config option to enable this. + */ if (ctx->Light.ShadeModel==GL_FLAT && ctx->RasterMask==0) { if (ctx->Color.DitherFlag && depth < 24) return NULL; setup_x_polygon_options( ctx ); return flat_pixmap_triangle; } - return NULL; +#endif + return (triangle_func)NULL; } } Index: xc/extras/Mesa/src/X/xmesaP.h diff -u xc/extras/Mesa/src/X/xmesaP.h:1.5 xc/extras/Mesa/src/X/xmesaP.h:1.8 --- xc/extras/Mesa/src/X/xmesaP.h:1.5 Fri Jun 16 20:02:39 2000 +++ xc/extras/Mesa/src/X/xmesaP.h Mon Nov 13 18:31:04 2000 @@ -56,6 +56,9 @@ #endif +extern _glthread_Mutex _xmesa_lock; + + /* for PF_8R8G8B24 pixel format */ typedef struct { GLubyte b; @@ -223,7 +226,7 @@ /* Used to do XAllocColor/XFreeColors accounting: */ int num_alloced; - unsigned long alloced_colors[256]; + Pixel alloced_colors[256]; #if defined(GLX_DIRECT_RENDERING) && !defined(XFree86Server) __DRIdrawablePrivate *driDrawPriv; /* back pointer to DRI drawable Index: xc/extras/Mesa/src/X86/3dnow.c diff -u xc/extras/Mesa/src/X86/3dnow.c:1.4 xc/extras/Mesa/src/X86/3dnow.c:1.9 --- xc/extras/Mesa/src/X86/3dnow.c:1.4 Fri Jun 16 20:02:40 2000 +++ xc/extras/Mesa/src/X86/3dnow.c Thu Nov 30 10:39:21 2000 @@ -1,20 +1,20 @@ /* * Mesa 3-D graphics library - * Version: 3.3 - * + * Version: 3.4 + * * Copyright (C) 1999-2000 Brian Paul All Rights Reserved. - * + * * 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 @@ -23,175 +23,175 @@ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - /* * 3DNow! optimizations contributed by * Holger Waechtler */ -#if defined(USE_3DNOW_ASM) && defined(USE_X86_ASM) -#include "3dnow.h" - -#include -#include -#include -#include +#include "glheader.h" #include "context.h" +#include "shade.h" #include "types.h" -#include "xform.h" #include "vertices.h" +#include "xform.h" +#include "3dnow.h" #ifdef DEBUG #include "debug_xform.h" #endif +#define XFORM_ARGS GLvector4f *to_vec, \ + const GLfloat m[16], \ + const GLvector4f *from_vec, \ + const GLubyte *mask, \ + const GLubyte flag + + +#define DECLARE_XFORM_GROUP( pfx, sz, masked ) \ + extern void _ASMAPI gl_##pfx##_transform_points##sz##_general_##masked( XFORM_ARGS ); \ + extern void _ASMAPI gl_##pfx##_transform_points##sz##_identity_##masked( XFORM_ARGS ); \ + extern void _ASMAPI gl_##pfx##_transform_points##sz##_3d_no_rot_##masked( XFORM_ARGS ); \ + extern void _ASMAPI gl_##pfx##_transform_points##sz##_perspective_##masked( XFORM_ARGS ); \ + extern void _ASMAPI gl_##pfx##_transform_points##sz##_2d_##masked( XFORM_ARGS ); \ + extern void _ASMAPI gl_##pfx##_transform_points##sz##_2d_no_rot_##masked( XFORM_ARGS ); \ + extern void _ASMAPI gl_##pfx##_transform_points##sz##_3d_##masked( XFORM_ARGS ); + + +#define ASSIGN_XFORM_GROUP( pfx, cma, sz, masked ) \ + gl_transform_tab[cma][sz][MATRIX_GENERAL] = \ + gl_##pfx##_transform_points##sz##_general_##masked; \ + gl_transform_tab[cma][sz][MATRIX_IDENTITY] = \ + gl_##pfx##_transform_points##sz##_identity_##masked; \ + gl_transform_tab[cma][sz][MATRIX_3D_NO_ROT] = \ + gl_##pfx##_transform_points##sz##_3d_no_rot_##masked; \ + gl_transform_tab[cma][sz][MATRIX_PERSPECTIVE] = \ + gl_##pfx##_transform_points##sz##_perspective_##masked; \ + gl_transform_tab[cma][sz][MATRIX_2D] = \ + gl_##pfx##_transform_points##sz##_2d_##masked; \ + gl_transform_tab[cma][sz][MATRIX_2D_NO_ROT] = \ + gl_##pfx##_transform_points##sz##_2d_no_rot_##masked; \ + gl_transform_tab[cma][sz][MATRIX_3D] = \ + gl_##pfx##_transform_points##sz##_3d_##masked; + + + +#define NORM_ARGS const GLmatrix *mat, \ + GLfloat scale, \ + const GLvector3f *in, \ + const GLfloat *lengths, \ + const GLubyte mask[], \ + GLvector3f *dest + + +#define DECLARE_NORM_GROUP( pfx, masked ) \ + extern void _ASMAPI gl_##pfx##_rescale_normals_##masked( NORM_ARGS ); \ + extern void _ASMAPI gl_##pfx##_normalize_normals_##masked( NORM_ARGS ); \ + extern void _ASMAPI gl_##pfx##_transform_normals_##masked( NORM_ARGS ); \ + extern void _ASMAPI gl_##pfx##_transform_normals_no_rot_##masked( NORM_ARGS ); \ + extern void _ASMAPI gl_##pfx##_transform_rescale_normals_##masked( NORM_ARGS ); \ + extern void _ASMAPI gl_##pfx##_transform_rescale_normals_no_rot_##masked( NORM_ARGS ); \ + extern void _ASMAPI gl_##pfx##_transform_normalize_normals_##masked( NORM_ARGS ); \ + extern void _ASMAPI gl_##pfx##_transform_normalize_normals_no_rot_##masked( NORM_ARGS ); + + +#define ASSIGN_NORM_GROUP( pfx, cma, masked ) \ + gl_normal_tab[NORM_RESCALE][cma] = \ + gl_##pfx##_rescale_normals_##masked; \ + gl_normal_tab[NORM_NORMALIZE][cma] = \ + gl_##pfx##_normalize_normals_##masked; \ + gl_normal_tab[NORM_TRANSFORM][cma] = \ + gl_##pfx##_transform_normals_##masked; \ + gl_normal_tab[NORM_TRANSFORM_NO_ROT][cma] = \ + gl_##pfx##_transform_normals_no_rot_##masked; \ + gl_normal_tab[NORM_TRANSFORM | NORM_RESCALE][cma] = \ + gl_##pfx##_transform_rescale_normals_##masked; \ + gl_normal_tab[NORM_TRANSFORM_NO_ROT | NORM_RESCALE][cma] = \ + gl_##pfx##_transform_rescale_normals_no_rot_##masked; \ + gl_normal_tab[NORM_TRANSFORM | NORM_NORMALIZE][cma] = \ + gl_##pfx##_transform_normalize_normals_##masked; \ + gl_normal_tab[NORM_TRANSFORM_NO_ROT | NORM_NORMALIZE][cma] = \ + gl_##pfx##_transform_normalize_normals_no_rot_##masked; + + +#ifdef USE_3DNOW_ASM +DECLARE_XFORM_GROUP( 3dnow, 1, raw ) +DECLARE_XFORM_GROUP( 3dnow, 2, raw ) +DECLARE_XFORM_GROUP( 3dnow, 3, raw ) +DECLARE_XFORM_GROUP( 3dnow, 4, raw ) + +DECLARE_XFORM_GROUP( 3dnow, 1, masked ) +DECLARE_XFORM_GROUP( 3dnow, 2, masked ) +DECLARE_XFORM_GROUP( 3dnow, 3, masked ) +DECLARE_XFORM_GROUP( 3dnow, 4, masked ) +DECLARE_NORM_GROUP( 3dnow, raw ) +/*DECLARE_NORM_GROUP( 3dnow, masked )*/ -#define XFORM_ARGS GLvector4f *to_vec, \ - const GLmatrix *mat, \ - const GLvector4f *from_vec, \ - const GLubyte *mask, \ - const GLubyte flag - - - -#define DECLARE_XFORM_GROUP(pfx, v, masked) \ - extern void _ASMAPI gl##pfx##_transform_points##v##_general_##masked(XFORM_ARGS); \ - extern void _ASMAPI gl##pfx##_transform_points##v##_identity_##masked(XFORM_ARGS); \ - extern void _ASMAPI gl##pfx##_transform_points##v##_3d_no_rot_##masked(XFORM_ARGS); \ - extern void _ASMAPI gl##pfx##_transform_points##v##_perspective_##masked(XFORM_ARGS);\ - extern void _ASMAPI gl##pfx##_transform_points##v##_2d_##masked(XFORM_ARGS); \ - extern void _ASMAPI gl##pfx##_transform_points##v##_2d_no_rot_##masked(XFORM_ARGS); \ - extern void _ASMAPI gl##pfx##_transform_points##v##_3d_##masked(XFORM_ARGS); - - - -#define ASSIGN_XFORM_GROUP( pfx, cma, vsize, masked ) \ - gl_transform_tab[cma][vsize][MATRIX_GENERAL] \ - = gl##pfx##_transform_points##vsize##_general_##masked; \ - gl_transform_tab[cma][vsize][MATRIX_IDENTITY] \ - = gl##pfx##_transform_points##vsize##_identity_##masked; \ - gl_transform_tab[cma][vsize][MATRIX_3D_NO_ROT] \ - = gl##pfx##_transform_points##vsize##_3d_no_rot_##masked; \ - gl_transform_tab[cma][vsize][MATRIX_PERSPECTIVE] \ - = gl##pfx##_transform_points##vsize##_perspective_##masked; \ - gl_transform_tab[cma][vsize][MATRIX_2D] \ - = gl##pfx##_transform_points##vsize##_2d_##masked; \ - gl_transform_tab[cma][vsize][MATRIX_2D_NO_ROT] \ - = gl##pfx##_transform_points##vsize##_2d_no_rot_##masked; \ - gl_transform_tab[cma][vsize][MATRIX_3D] \ - = gl##pfx##_transform_points##vsize##_3d_##masked; - - - - -#define NORM_ARGS const GLmatrix *mat, \ - GLfloat scale, \ - const GLvector3f *in, \ - const GLfloat *lengths, \ - const GLubyte mask[], \ - GLvector3f *dest - - - -#define DECLARE_NORM_GROUP(pfx, masked) \ - extern void _ASMAPI gl##pfx##_rescale_normals_##masked## (NORM_ARGS); \ - extern void _ASMAPI gl##pfx##_normalize_normals_##masked## (NORM_ARGS); \ - extern void _ASMAPI gl##pfx##_transform_normals_##masked## (NORM_ARGS); \ - extern void _ASMAPI gl##pfx##_transform_normals_no_rot_##masked## (NORM_ARGS); \ - extern void _ASMAPI gl##pfx##_transform_rescale_normals_##masked## (NORM_ARGS); \ - extern void _ASMAPI gl##pfx##_transform_rescale_normals_no_rot_##masked## (NORM_ARGS); \ - extern void _ASMAPI gl##pfx##_transform_normalize_normals_##masked## (NORM_ARGS); \ - extern void _ASMAPI gl##pfx##_transform_normalize_normals_no_rot_##masked## (NORM_ARGS); - - - -#define ASSIGN_NORM_GROUP( pfx, cma, masked ) \ - gl_normal_tab[NORM_RESCALE][cma] = \ - gl##pfx##_rescale_normals_##masked##; \ - gl_normal_tab[NORM_NORMALIZE][cma] = \ - gl##pfx##_normalize_normals_##masked##; \ - gl_normal_tab[NORM_TRANSFORM][cma] = \ - gl##pfx##_transform_normals_##masked##; \ - gl_normal_tab[NORM_TRANSFORM_NO_ROT][cma] = \ - gl##pfx##_transform_normals_no_rot_##masked##; \ - gl_normal_tab[NORM_TRANSFORM | NORM_RESCALE][cma] = \ - gl##pfx##_transform_rescale_normals_##masked##; \ - gl_normal_tab[NORM_TRANSFORM_NO_ROT | NORM_RESCALE][cma] = \ - gl##pfx##_transform_rescale_normals_no_rot_##masked##; \ - gl_normal_tab[NORM_TRANSFORM | NORM_NORMALIZE][cma] = \ - gl##pfx##_transform_normalize_normals_##masked##; \ - gl_normal_tab[NORM_TRANSFORM_NO_ROT | NORM_NORMALIZE][cma] = \ - gl##pfx##_transform_normalize_normals_no_rot_##masked##; +extern void _ASMAPI gl_v16_3dnow_general_xform( GLfloat *first_vert, + const GLfloat *m, + const GLfloat *src, + GLuint src_stride, + GLuint count ); extern void _ASMAPI gl_3dnow_project_vertices( GLfloat *first, - GLfloat *last, - const GLfloat *m, - GLuint stride ); - -extern void _ASMAPI gl_3dnow_project_clipped_vertices( GLfloat *first, GLfloat *last, const GLfloat *m, - GLuint stride, - const GLubyte *clipmask ); + GLuint stride ); -extern void _ASMAPI gl_v16_3dnow_general_xform( GLfloat *first_vert, - const GLfloat *m, - const GLfloat *src, - GLuint src_stride, - GLuint count ); +extern void _ASMAPI gl_3dnow_project_clipped_vertices( GLfloat *first, + GLfloat *last, + const GLfloat *m, + GLuint stride, + const GLubyte *clipmask ); +#endif -void gl_init_3dnow_asm_transforms (void) + +void gl_init_3dnow_transform_asm( void ) { - DECLARE_XFORM_GROUP( _3dnow, 1, raw ) - DECLARE_XFORM_GROUP( _3dnow, 2, raw ) - DECLARE_XFORM_GROUP( _3dnow, 3, raw ) - DECLARE_XFORM_GROUP( _3dnow, 4, raw ) - - DECLARE_XFORM_GROUP( _3dnow, 1, masked ) - DECLARE_XFORM_GROUP( _3dnow, 2, masked ) - DECLARE_XFORM_GROUP( _3dnow, 3, masked ) - DECLARE_XFORM_GROUP( _3dnow, 4, masked ) - - DECLARE_NORM_GROUP( _3dnow, raw ) -/* DECLARE_NORM_GROUP( _3dnow, masked ) -*/ - - ASSIGN_XFORM_GROUP( _3dnow, 0, 1, raw ) - ASSIGN_XFORM_GROUP( _3dnow, 0, 2, raw ) - ASSIGN_XFORM_GROUP( _3dnow, 0, 3, raw ) - ASSIGN_XFORM_GROUP( _3dnow, 0, 4, raw ) - - ASSIGN_XFORM_GROUP( _3dnow, CULL_MASK_ACTIVE, 1, masked ) - ASSIGN_XFORM_GROUP( _3dnow, CULL_MASK_ACTIVE, 2, masked ) - ASSIGN_XFORM_GROUP( _3dnow, CULL_MASK_ACTIVE, 3, masked ) - ASSIGN_XFORM_GROUP( _3dnow, CULL_MASK_ACTIVE, 4, masked ) - - ASSIGN_NORM_GROUP( _3dnow, 0, raw ) -/* ASSIGN_NORM_GROUP( _3dnow, CULL_MASK_ACTIVE, masked ) -*/ +#ifdef USE_3DNOW_ASM + ASSIGN_XFORM_GROUP( 3dnow, 0, 1, raw ); + ASSIGN_XFORM_GROUP( 3dnow, 0, 2, raw ); + ASSIGN_XFORM_GROUP( 3dnow, 0, 3, raw ); + ASSIGN_XFORM_GROUP( 3dnow, 0, 4, raw ); + + ASSIGN_XFORM_GROUP( 3dnow, CULL_MASK_ACTIVE, 1, masked ); + ASSIGN_XFORM_GROUP( 3dnow, CULL_MASK_ACTIVE, 2, masked ); + ASSIGN_XFORM_GROUP( 3dnow, CULL_MASK_ACTIVE, 3, masked ); + ASSIGN_XFORM_GROUP( 3dnow, CULL_MASK_ACTIVE, 4, masked ); + + ASSIGN_NORM_GROUP( 3dnow, 0, raw ); +/* ASSIGN_NORM_GROUP( 3dnow, CULL_MASK_ACTIVE, masked ); */ #ifdef DEBUG - gl_test_all_transform_functions("3Dnow!"); - gl_test_all_normal_transform_functions("3Dnow!"); + gl_test_all_transform_functions( "3DNow!" ); + gl_test_all_normal_transform_functions( "3DNow!" ); +#endif #endif +} - /* Hook in some stuff for vertices.c. +void gl_init_3dnow_shade_asm( void ) +{ +#ifdef USE_3DNOW_ASM + /* When the time comes, initialize optimized lighting here. */ - gl_xform_points3_v16_general = gl_v16_3dnow_general_xform; - gl_project_v16 = gl_3dnow_project_vertices; - gl_project_clipped_v16 = gl_3dnow_project_clipped_vertices; -} - -#else +#if 0 + gl_test_all_shade_functions( "3DNow!" ); +#endif +#endif +} -/* silence compiler warning */ -extern void _mesa_3dnow_dummy_function(void); -void _mesa_3dnow_dummy_function(void) +void gl_init_3dnow_vertex_asm( void ) { -} +#ifdef USE_3DNOW_ASM + gl_xform_points3_v16_general = gl_v16_3dnow_general_xform; + gl_project_v16 = gl_3dnow_project_vertices; + gl_project_clipped_v16 = gl_3dnow_project_clipped_vertices; +#if 0 + gl_test_all_vertex_functions( "3DNow!" ); +#endif #endif +} Index: xc/extras/Mesa/src/X86/3dnow.h diff -u xc/extras/Mesa/src/X86/3dnow.h:1.3 xc/extras/Mesa/src/X86/3dnow.h:1.5 --- xc/extras/Mesa/src/X86/3dnow.h:1.3 Tue Feb 15 02:13:18 2000 +++ xc/extras/Mesa/src/X86/3dnow.h Thu Nov 30 10:39:21 2000 @@ -1,20 +1,20 @@ /* * Mesa 3-D graphics library - * Version: 3.1 - * + * Version: 3.4 + * * Copyright (C) 1999 Brian Paul All Rights Reserved. - * + * * 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 @@ -23,72 +23,16 @@ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - /* * 3DNow! optimizations contributed by * Holger Waechtler */ - - -#ifndef _3dnow_h -#define _3dnow_h - - - -#include "xform.h" - - -void gl_init_3dnow_asm_transforms (void); - - - - -#if 0 -GLvector4f *gl_project_points( GLvector4f *proj_vec, - const GLvector4f *clip_vec ) -{ - __asm__ ( - " femms \n" - " \n" - " movq (%0), %%mm0 # x1 | x0 \n" - " movq 8(%0), %%mm1 # oow | x2 \n" - " \n" - "1: movq %%mm1, %%mm2 # oow | x2 \n" - " addl %2, %0 # next point \n" - " \n" - " punpckhdq %%mm2, %%mm2 # oow | oow \n" - " addl $16, %1 # next point \n" - " \n" - " pfrcp %%mm2, %%mm3 # 1/oow | 1/oow \n" - " decl %3 \n" - " \n" - " pfmul %%mm3, %%mm0 # x1/oow | x0/oow \n" - " movq %%mm0, -16(%1) # write r0, r1 \n" - " \n" - " pfmul %%mm3, %%mm1 # 1 | x2/oow \n" - " movq (%0), %%mm0 # x1 | x0 \n" - " \n" - " movd %%mm1, 8(%1) # write r2 \n" - " movd %%mm3, 12(%1) # write r3 \n" - " \n" - " movq 8(%0), %%mm1 # oow | x2 \n" - " ja 1b \n" - " \n" - " femms \n" - " " - ::"a" (clip_vec->start), - "c" (proj_vec->start), - "g" (clip_vec->stride), - "d" (clip_vec->count) - ); - - proj_vec->flags |= VEC_SIZE_4; - proj_vec->size = 3; - proj_vec->count = clip_vec->count; - return proj_vec; -} -#endif +#ifndef __3DNOW_H__ +#define __3DNOW_H__ +void gl_init_3dnow_transform_asm( void ); +void gl_init_3dnow_shade_asm( void ); +void gl_init_3dnow_vertex_asm( void ); #endif Index: xc/extras/Mesa/src/X86/3dnow_norm_raw.S diff -u xc/extras/Mesa/src/X86/3dnow_norm_raw.S:1.2 xc/extras/Mesa/src/X86/3dnow_norm_raw.S:1.6 --- xc/extras/Mesa/src/X86/3dnow_norm_raw.S:1.2 Fri Jun 16 20:02:41 2000 +++ xc/extras/Mesa/src/X86/3dnow_norm_raw.S Mon Nov 13 18:31:06 2000 @@ -1,6 +1,6 @@ /* * Mesa 3-D graphics library - * Version: 3.3 + * Version: 3.4 * * Copyright (C) 1999-2000 Brian Paul All Rights Reserved. * @@ -61,7 +61,7 @@ #define V3F_COUNT 8 #define V3F_STRIDE 12 -#define MAT_INV 64 +#define MAT_INV 4 #define M(i) REGOFF(i * 4, ECX) #define STRIDE REGOFF(12, ESI) @@ -72,28 +72,24 @@ GLNAME(gl_3dnow_transform_normalize_normals_raw): #define FRAME_OFFSET 12 - SUB_L ( CONST(4), ESP ) - PUSH_L ( EDI ) - PUSH_L ( ESI ) - MOV_L ( ARG_LENGTHS, EDI ) - MOV_L ( ARG_IN, EAX ) - MOV_L ( ARG_DEST, EDX ) - MOV_L ( REGOFF(V3F_COUNT, EAX), EAX ) /* dest->count = in->count */ - MOV_L ( EAX, REGOFF(V3F_COUNT, EDX) ) - MOV_L ( ARG_IN, ESI ) - MOV_L ( ARG_MAT, ECX ) - MOV_L ( REGOFF(V3F_START, EDX), EAX ) /* dest->start */ - MOV_L ( REGOFF(MAT_INV, ECX), ECX ) /* mat->inv */ - MOV_L ( REGOFF(V3F_START, ESI), EDX ) /* in->start */ - + PUSH_L ( EDI ) + PUSH_L ( ESI ) + PUSH_L ( EBP ) -ALIGNTEXT32 + MOV_L ( ARG_LENGTHS, EDI ) + MOV_L ( ARG_IN, ESI ) + MOV_L ( ARG_DEST, EAX ) + MOV_L ( REGOFF(V3F_COUNT, ESI), EBP ) /* dest->count = in->count */ + MOV_L ( EBP, REGOFF(V3F_COUNT, EAX) ) + MOV_L ( REGOFF(V3F_START, ESI), EDX ) /* in->start */ + MOV_L ( REGOFF(V3F_START, EAX), EAX ) /* dest->start */ + MOV_L ( ARG_MAT, ECX ) + MOV_L ( REGOFF(MAT_INV, ECX), ECX ) /* mat->inv */ - CMP_L ( CONST(0), REGOFF (V3F_COUNT, ESI ) ) /* count > 0 ?? */ + CMP_L ( CONST(0), EBP ) /* count > 0 ?? */ JE ( LLBL (G3TN_end) ) - PUSH_L ( EBP ) MOV_L ( REGOFF (V3F_COUNT, ESI), EBP ) FEMMS @@ -101,7 +97,8 @@ PUSH_L ( EAX ) PUSH_L ( EDX ) /* save counter & pointer for */ /* the normalize pass */ - + #undef FRAME_OFFSET + #define FRAME_OFFSET 24 MOVQ ( M(0), MM3 ) /* m1 | m0 */ MOVQ ( M(4), MM4 ) /* m5 | m4 */ @@ -115,8 +112,6 @@ CMP_L ( CONST(0), EDI ) /* lengths == 0 ? */ JNE ( LLBL (G3TN_scale_end ) ) - #undef FRAME_OFFSET - #define FRAME_OFFSET 28 MOVD ( ARG_SCALE, MM0 ) /* | scale */ PUNPCKLDQ ( MM0, MM0 ) /* scale | scale */ @@ -138,6 +133,8 @@ PFMUL ( MM3, MM0 ) /* x1*m1 | x0*m0 */ ADD_L ( CONST(12), EAX ) /* next r */ + PREFETCHW ( REGIND(EAX) ) + PFMUL ( MM4, MM1 ) /* x1*m5 | x0*m4 */ PFACC ( MM1, MM0 ) /* x0*m4+x1*m5 | x0*m0+x1*m1 */ @@ -156,6 +153,8 @@ PFADD ( MM2, MM1 ) /* *not used* | x0*m8+x1*m9+x2*m*/ ADD_L ( STRIDE, EDX ) /* next normal */ + PREFETCH ( REGIND(EDX) ) + MOVD ( MM1, REGOFF(-4, EAX) ) /* write r2 */ MOVQ ( REGIND (EDX), MM0 ) /* x1 | x0 */ @@ -177,19 +176,24 @@ ALIGNTEXT32 LLBL (G3TN_norm_w_lengths): + + PREFETCHW ( REGOFF(12,EAX) ) + MOVD ( REGIND (EDI), MM3 ) /* | length (x) */ PFMUL ( MM3, MM1 ) /* | x2 (normalize*/ PUNPCKLDQ ( MM3, MM3 ) /* length (x) | length (x) */ PFMUL ( MM3, MM0 ) /* x1 (normalized) | x0 (normalize*/ + ADD_L ( STRIDE, EDX ) /* next normal */ + ADD_L ( CONST(4), EDI ) /* next length */ + + PREFETCH ( REGIND(EDI) ) + MOVQ ( MM0, REGIND(EAX) ) /* write new x0, x1 */ MOVD ( MM1, REGOFF(8, EAX) ) /* write new x2 */ - ADD_L ( STRIDE, EDX ) /* next normal */ ADD_L ( CONST(12), EAX ) /* next r */ - - ADD_L ( CONST(4), EDI ) /* next length */ DEC_L ( EBP ) /* decrement normal counter */ MOVQ ( REGIND(EAX), MM0 ) /* x1 | x0 */ @@ -199,6 +203,9 @@ ALIGNTEXT32 LLBL (G3TN_norm): + + PREFETCHW ( REGIND(EAX) ) + MOVQ ( MM0, MM3 ) /* x1 | x0 */ MOVQ ( MM1, MM4 ) /* | x2 */ @@ -233,46 +240,39 @@ LLBL (G3TN_exit_3dnow): FEMMS - POP_L ( EBP ) LLBL (G3TN_end): + POP_L ( EBP ) POP_L ( ESI ) POP_L ( EDI ) - POP_L ( ECX ) RET ALIGNTEXT16 - GLOBL GLNAME(gl_3dnow_transform_normalize_normals_no_rot_raw) GLNAME(gl_3dnow_transform_normalize_normals_no_rot_raw): - #undef FRAME_OFFSET + #undef FRAME_OFFSET #define FRAME_OFFSET 12 - SUB_L ( CONST(4), ESP ) - PUSH_L ( EDI ) - PUSH_L ( ESI ) - MOV_L ( ARG_LENGTHS, EDI ) - MOV_L ( ARG_IN, EAX ) - MOV_L ( ARG_DEST, EDX ) - MOV_L ( REGOFF(V3F_COUNT, EAX), EAX ) /* dest->count = in->count */ - MOV_L ( EAX, REGOFF(V3F_COUNT, EDX) ) - MOV_L ( ARG_IN, ESI ) - MOV_L ( ARG_MAT, ECX ) - MOV_L ( REGOFF(V3F_START, EDX), EAX ) /* dest->start */ - MOV_L ( REGOFF(MAT_INV, ECX), ECX ) /* mat->inv */ - MOV_L ( REGOFF(V3F_START, ESI), EDX ) /* in->start */ - + PUSH_L ( EDI ) + PUSH_L ( ESI ) + PUSH_L ( EBP ) -ALIGNTEXT32 + MOV_L ( ARG_LENGTHS, EDI ) + MOV_L ( ARG_IN, ESI ) + MOV_L ( ARG_DEST, EAX ) + MOV_L ( REGOFF(V3F_COUNT, ESI), EBP ) /* dest->count = in->count */ + MOV_L ( EBP, REGOFF(V3F_COUNT, EAX) ) + MOV_L ( ARG_MAT, ECX ) + MOV_L ( REGOFF(V3F_START, EAX), EAX ) /* dest->start */ + MOV_L ( REGOFF(MAT_INV, ECX), ECX ) /* mat->inv */ + MOV_L ( REGOFF(V3F_START, ESI), EDX ) /* in->start */ - CMP_L ( CONST(0), REGOFF (V3F_COUNT, ESI ) ) /* count > 0 ?? */ + CMP_L ( CONST(0), EBP ) /* count > 0 ?? */ JE ( LLBL (G3TNNR_end) ) - PUSH_L ( EBP ) - MOV_L ( REGOFF (V3F_COUNT, ESI), EBP ) FEMMS MOVD ( M(0), MM0 ) /* | m0 */ @@ -284,14 +284,13 @@ CMP_L ( CONST(0), EDI ) /* lengths == 0 ? */ JNE ( LLBL (G3TNNR_scale_end ) ) - #undef FRAME_OFFSET - #define FRAME_OFFSET 16 MOVD ( ARG_SCALE, MM7 ) /* | scale */ PUNPCKLDQ ( MM7, MM7 ) /* scale | scale */ PFMUL ( MM7, MM0 ) /* scale * m5 | scale * m0 */ PFMUL ( MM7, MM2 ) /* scale * m10 | scale * m10 */ +ALIGNTEXT32 LLBL (G3TNNR_scale_end): MOVQ ( REGIND(EDX), MM6 ) /* x1 | x0 */ MOVD ( REGOFF(8, EDX), MM7 ) /* | x2 */ @@ -302,10 +301,16 @@ MOVD ( REGIND(EDI), MM3 ) /* | length (x) */ +ALIGNTEXT32 LLBL (G3TNNR_norm_w_lengths): /* use precalculated lengths */ + + PREFETCHW ( REGIND(EAX) ) + PFMUL ( MM0, MM6 ) /* x1*m5 | x0*m0 */ ADD_L ( STRIDE, EDX ) /* next normal */ + PREFETCH ( REGIND(EDX) ) + PFMUL ( MM2, MM7 ) /* | x2*m10 */ ADD_L ( CONST(12), EAX ) /* next r */ @@ -327,7 +332,11 @@ JA ( LLBL (G3TNNR_norm_w_lengths) ) JMP ( LLBL (G3TNNR_exit_3dnow) ) +ALIGNTEXT32 LLBL (G3TNNR_norm): /* need to calculate lengths */ + + PREFETCHW ( REGIND(EAX) ) + PFMUL ( MM0, MM6 ) /* x1*m5 | x0*m0 */ ADD_L ( CONST(12), EAX ) /* next r */ @@ -337,12 +346,15 @@ MOVQ ( MM7, MM4 ) /* | x2 (transformed) */ PFMUL ( MM6, MM3 ) /* x1*x1 | x0*x0 */ + PFMUL ( MM7, MM4 ) /* | x2*x2 */ PFACC ( MM3, MM3 ) /* **not used** | x0*x0+x1*x1 */ PFADD ( MM4, MM3 ) /* | x0*x0+x1*x1+x2*x2*/ ADD_L ( STRIDE, EDX ) /* next normal */ + PREFETCH ( REGIND(EDX) ) + PFRSQRT ( MM3, MM5 ) /* 1/sqrt (x0*x0+x1*x1+x2*x2) */ MOVQ ( MM5, MM4 ) @@ -367,12 +379,11 @@ LLBL (G3TNNR_exit_3dnow): FEMMS - POP_L ( EBP ) LLBL (G3TNNR_end): + POP_L ( EBP ) POP_L ( ESI ) POP_L ( EDI ) - POP_L ( ECX ) RET @@ -381,38 +392,31 @@ ALIGNTEXT16 - GLOBL GLNAME(gl_3dnow_transform_rescale_normals_no_rot_raw) GLNAME(gl_3dnow_transform_rescale_normals_no_rot_raw): - #undef FRAME_OFFSET + #undef FRAME_OFFSET #define FRAME_OFFSET 12 - SUB_L ( CONST(4), ESP ) - PUSH_L ( EDI ) - PUSH_L ( ESI ) - - MOV_L ( ARG_IN, EAX ) - MOV_L ( ARG_DEST, EDX ) - MOV_L ( REGOFF(V3F_COUNT, EAX), EAX ) /* dest->count = in->count */ - MOV_L ( EAX, REGOFF(V3F_COUNT, EDX) ) - MOV_L ( ARG_IN, ESI ) - MOV_L ( ARG_MAT, ECX ) - MOV_L ( REGOFF(V3F_START, EDX), EAX ) /* dest->start */ - MOV_L ( REGOFF(MAT_INV, ECX), ECX ) /* mat->inv */ - MOV_L ( REGOFF(V3F_START, ESI), EDX ) /* in->start */ + PUSH_L ( EDI ) + PUSH_L ( ESI ) + PUSH_L ( EBP ) -ALIGNTEXT32 + MOV_L ( ARG_IN, EAX ) + MOV_L ( ARG_DEST, EDX ) + MOV_L ( REGOFF(V3F_COUNT, EAX), EBP ) /* dest->count = in->count */ + MOV_L ( EBP, REGOFF(V3F_COUNT, EDX) ) + MOV_L ( ARG_IN, ESI ) + MOV_L ( ARG_MAT, ECX ) + MOV_L ( REGOFF(MAT_INV, ECX), ECX ) /* mat->inv */ + MOV_L ( REGOFF(V3F_START, EDX), EAX ) /* dest->start */ + MOV_L ( REGOFF(V3F_START, ESI), EDX ) /* in->start */ - CMP_L ( CONST(0), REGOFF (V3F_COUNT, ESI) ) + CMP_L ( CONST(0), EBP ) JE ( LLBL (G3TRNR_end) ) - PUSH_L ( EBP ) - MOV_L ( REGOFF (V3F_COUNT, ESI), EBP ) FEMMS - #undef FRAME_OFFSET - #define FRAME_OFFSET 16 MOVD ( ARG_SCALE, MM6 ) /* | scale */ PUNPCKLDQ ( MM6, MM6 ) /* scale | scale */ @@ -428,11 +432,15 @@ MOVD ( REGOFF(8, EDX), MM5 ) /* | x2 */ ALIGNTEXT32 - LLBL (G3TRNR_rescale): + + PREFETCHW ( REGIND(EAX) ) + PFMUL ( MM0, MM4 ) /* x1*m5 | x0*m0 */ ADD_L ( STRIDE, EDX ) /* next normal */ + PREFETCH ( REGIND(EDX) ) + PFMUL ( MM2, MM5 ) /* | x2*m10 */ ADD_L ( CONST(12), EAX ) /* next r */ @@ -446,12 +454,11 @@ JA ( LLBL (G3TRNR_rescale) ) /* cnt > 0 ? -> process next normal */ FEMMS - POP_L ( EBP ) LLBL (G3TRNR_end): + POP_L ( EBP ) POP_L ( ESI ) POP_L ( EDI ) - POP_L ( ECX ) RET @@ -463,24 +470,19 @@ GLNAME(gl_3dnow_transform_rescale_normals_raw): #undef FRAME_OFFSET - #define FRAME_OFFSET 12 - SUB_L ( CONST(4), ESP ) - PUSH_L ( EDI ) - PUSH_L ( ESI ) - - MOV_L (REGOFF(24,ESP), EAX) - MOV_L (REGOFF(36,ESP), EDX) - MOV_L (REGOFF(8,EAX), EAX) - MOV_L (EAX, REGOFF(8,EDX)) - MOV_L (REGOFF(24,ESP), EDI) - MOV_L (REGOFF(4,EDX), EAX) - MOV_L (REGOFF(16,ESP), ECX) - MOV_L (REGOFF(24,ESP), ESI) - MOV_L (REGOFF(64,ECX), ECX) - MOV_L (REGOFF(4,EDI), EDX) - MOV_L (REGOFF(8,EDI), EDI) + #define FRAME_OFFSET 8 -ALIGNTEXT32 + PUSH_L ( EDI ) + PUSH_L ( ESI ) + + MOV_L ( ARG_IN, ESI ) + MOV_L ( ARG_DEST, EAX ) + MOV_L ( ARG_MAT, ECX ) + MOV_L ( REGOFF(V3F_COUNT, ESI), EDI ) /* dest->count = in->count */ + MOV_L ( EDI, REGOFF(V3F_COUNT, EAX) ) + MOV_L ( REGOFF(V3F_START, EAX), EAX ) /* dest->start */ + MOV_L ( REGOFF(V3F_START, ESI), EDX ) /* in->start */ + MOV_L ( REGOFF(MAT_INV, ECX), ECX ) /* mat->inv */ CMP_L ( CONST(0), EDI ) JE ( LLBL (G3TR_end) ) @@ -490,12 +492,12 @@ MOVQ ( REGIND(ECX), MM3 ) /* m1 | m0 */ MOVQ ( REGOFF(16,ECX), MM4 ) /* m5 | m4 */ - MOVD ( REGOFF(20, ESP), MM0 ) /* scale */ + MOVD ( ARG_SCALE, MM0 ) /* scale */ MOVD ( REGOFF(8,ECX), MM5 ) /* | m2 */ PUNPCKLDQ ( MM0, MM0 ) /* scale | scale */ - PUNPCKLDQ ( REGOFF(24, ECX), MM5 ) + PUNPCKLDQ ( REGOFF(24, ECX), MM5 ) PFMUL ( MM0, MM3 ) /* scale*m1 | scale*m0 */ MOVQ ( REGOFF(32, ECX), MM6 ) /* m9 | m8*/ @@ -510,7 +512,11 @@ PFMUL ( MM0, MM7 ) /* | scale*m10 */ MOVQ ( REGIND(EDX), MM0 ) /* x1 | x0 */ +ALIGNTEXT32 LLBL (G3TR_rescale): + + PREFETCHW ( REGIND(EAX) ) + MOVQ ( MM0, MM1 ) /* x1 | x0 */ PUNPCKLDQ ( MM2, MM2 ) /* x2 | x2 */ @@ -520,25 +526,28 @@ PFMUL ( MM4, MM1 ) /* x1*m5 | x0*m4 */ PFACC ( MM1, MM0 ) /* x0*m4+x1*m5 | x0*m0+x1*m1 */ + MOVQ ( REGIND(EDX), MM1 ) /* x1 | x0 */ + PFMUL ( MM5, MM2 ) /* x2*m6 | x2*m2 */ PFADD ( MM2, MM0 ) /* x0*m4...+x2*m6| x0*m0+x1*m1+x2*m2 */ - MOVQ ( REGIND(EDX), MM1 ) /* x1 | x0 */ - MOVQ ( MM0, REGOFF(-12, EAX) ) /* write r0, r1 */ + MOVD ( REGOFF(8, EDX), MM2 ) /* | x2 */ + ADD_L ( STRIDE, EDX ) /* next normal */ + PREFETCH ( REGIND(EDX) ) + + MOVQ ( MM0, REGOFF(-12, EAX) ) /* write r0, r1 */ PFMUL ( MM6, MM1 ) /* x1*m9 | x0*m8 */ - MOVD ( REGOFF(8, EDX), MM2 ) /* | x2 */ PFMUL ( MM7, MM2 ) /* | x2*m10 */ PFACC ( MM1, MM1 ) /* *not used* | x0*m8+x1*m9 */ PFADD ( MM2, MM1 ) /* *not used* | x0*m8+x1*m9+x2*m10 */ - ADD_L ( REGOFF(12, ESI), EDX ) /* next normal */ - MOVD ( MM1, REGOFF(-4, EAX) ) /* write r2 */ - MOVQ ( REGIND(EDX), MM0 ) /* x1 | x0 */ + MOVQ ( REGIND(EDX), MM0 ) /* x1 | x0 */ MOVD ( REGOFF(8, EDX), MM2 ) /* | x2 */ + DEC_L ( EDI ) /* decrement normal counter */ JA ( LLBL (G3TR_rescale) ) @@ -547,7 +556,6 @@ LLBL (G3TR_end): POP_L ( ESI ) POP_L ( EDI ) - POP_L ( ECX ) RET @@ -560,25 +568,20 @@ GLOBL GLNAME(gl_3dnow_transform_normals_no_rot_raw) GLNAME(gl_3dnow_transform_normals_no_rot_raw): - #define FRAME_OFFSET 12 - SUB_L ( CONST(4), ESP ) - PUSH_L ( EDI ) - PUSH_L ( ESI ) - - MOV_L (REGOFF(24,ESP), EAX) - MOV_L (REGOFF(36,ESP), EDX) - MOV_L (REGOFF(8,EAX), EAX) - MOV_L (EAX, REGOFF(8,EDX)) - MOV_L (REGOFF(24,ESP), EDI) - MOV_L (REGOFF(4,EDX), EAX) - MOV_L (REGOFF(16,ESP), ECX) - MOV_L (REGOFF(24,ESP), ESI) - MOV_L (REGOFF(64,ECX), ECX) - MOV_L (REGOFF(4,EDI), EDX) - MOV_L (REGOFF(8,EDI), EDI) + #undef FRAME_OFFSET + #define FRAME_OFFSET 8 - -ALIGNTEXT32 + PUSH_L ( EDI ) + PUSH_L ( ESI ) + + MOV_L ( ARG_IN, ESI ) + MOV_L ( ARG_DEST, EAX ) + MOV_L ( ARG_MAT, ECX ) + MOV_L ( REGOFF(V3F_COUNT, ESI), EDI ) /* dest->count = in->count */ + MOV_L ( EDI, REGOFF(V3F_COUNT, EAX) ) + MOV_L ( REGOFF(V3F_START, EAX), EAX ) /* dest->start */ + MOV_L ( REGOFF(V3F_START, ESI), EDX ) /* in->start */ + MOV_L ( REGOFF(MAT_INV, ECX), ECX ) /* mat->inv */ CMP_L ( CONST(0), EDI ) JE ( LLBL (G3TNR_end) ) @@ -595,10 +598,14 @@ MOVD ( REGOFF(8, EDX), MM5 ) /* | x2 */ ALIGNTEXT32 - LLBL (G3TNR_transform): + + PREFETCHW ( REGIND(EAX) ) + PFMUL ( MM0, MM4 ) /* x1*m5 | x0*m0 */ - ADD_L ( REGOFF(12, ESI), EDX) /* next normal */ + ADD_L ( STRIDE, EDX) /* next normal */ + + PREFETCH ( REGIND(EDX) ) PFMUL ( MM2, MM5 ) /* | x2*m10 */ ADD_L ( CONST(12), EAX ) /* next r */ @@ -617,7 +624,6 @@ LLBL (G3TNR_end): POP_L ( ESI ) POP_L ( EDI ) - POP_L ( ECX ) RET @@ -631,24 +637,20 @@ GLOBL GLNAME(gl_3dnow_transform_normals_raw) GLNAME(gl_3dnow_transform_normals_raw): - #define FRAME_OFFSET 12 - SUB_L ( CONST(4), ESP ) - PUSH_L ( EDI ) - PUSH_L ( ESI ) - - MOV_L (REGOFF(24,ESP), EAX) - MOV_L (REGOFF(36,ESP), EDX) - MOV_L (REGOFF(8,EAX), EAX) - MOV_L (EAX, REGOFF(8,EDX)) - MOV_L (REGOFF(24,ESP), EDI) - MOV_L (REGOFF(4,EDX), EAX) - MOV_L (REGOFF(16,ESP), ECX) - MOV_L (REGOFF(24,ESP), ESI) - MOV_L (REGOFF(64,ECX), ECX) - MOV_L (REGOFF(4,EDI), EDX) - MOV_L (REGOFF(8,EDI), EDI) - -ALIGNTEXT32 + #undef FRAME_OFFSET + #define FRAME_OFFSET 8 + + PUSH_L ( EDI ) + PUSH_L ( ESI ) + + MOV_L ( ARG_IN, ESI ) + MOV_L ( ARG_DEST, EAX ) + MOV_L ( ARG_MAT, ECX ) + MOV_L ( REGOFF(V3F_COUNT, ESI), EDI ) /* dest->count = in->count */ + MOV_L ( EDI, REGOFF(V3F_COUNT, EAX) ) + MOV_L ( REGOFF(V3F_START, EAX), EAX ) /* dest->start */ + MOV_L ( REGOFF(V3F_START, ESI), EDX ) /* in->start */ + MOV_L ( REGOFF(MAT_INV, ECX), ECX ) /* mat->inv */ CMP_L ( CONST(0), EDI ) /* count > 0 ?? */ JE ( LLBL (G3T_end) ) @@ -659,15 +661,19 @@ MOVQ ( REGOFF(16, ECX), MM4 ) /* m5 | m4 */ MOVD ( REGOFF(8, ECX), MM5 ) /* | m2 */ - PUNPCKLDQ ( REGOFF(24, ECX), MM5 ) /* m6 | m2*/ + PUNPCKLDQ ( REGOFF(24, ECX), MM5 ) /* m6 | m2 */ - MOVQ ( REGOFF(32,ECX), MM6 ) /* m9 | m8 */ - MOVD ( REGOFF(40,ECX), MM7 ) /* | m10 */ + MOVQ ( REGOFF(32, ECX), MM6 ) /* m9 | m8 */ + MOVD ( REGOFF(40, ECX), MM7 ) /* | m10 */ MOVQ ( REGIND(EDX), MM0 ) /* x1 | x0 */ MOVD ( REGOFF(8, EDX), MM2 ) /* | x2 */ +ALIGNTEXT32 LLBL (G3T_transform): + + PREFETCHW ( REGIND(EAX) ) + MOVQ ( MM0, MM1 ) /* x1 | x0 */ PUNPCKLDQ ( MM2, MM2 ) /* x2 | x2 */ @@ -687,10 +693,12 @@ MOVD ( REGOFF(8, EDX), MM2 ) /* | x2 */ PFMUL ( MM7, MM2 ) /* | x2*m10 */ - PFACC ( MM1, MM1 ) /* *not used* | x0*m8+x1*m9 */ + ADD_L ( STRIDE, EDX ) /* next normal */ + + PREFETCH ( REGIND(EDX) ) + PFACC ( MM1, MM1 ) /* *not used* | x0*m8+x1*m9 */ PFADD ( MM2, MM1 ) /* *not used* | x0*m8+x1*m9+x2*m10 */ - ADD_L ( REGOFF(12, ESI), EDX ) /* next normal */ MOVD ( MM1, REGOFF(-4, EAX) ) /* write r2 */ MOVQ ( REGIND(EDX), MM0 ) /* x1 | x0 */ @@ -704,7 +712,6 @@ LLBL (G3T_end): POP_L ( ESI ) POP_L ( EDI ) - POP_L ( ECX ) RET @@ -716,30 +723,23 @@ GLOBL GLNAME(gl_3dnow_normalize_normals_raw) GLNAME(gl_3dnow_normalize_normals_raw): + #undef FRAME_OFFSET #define FRAME_OFFSET 12 - SUB_L ( CONST(4), ESP ) - PUSH_L ( EDI ) - PUSH_L ( ESI ) - - MOV_L (REGOFF(16,ESP), ESI) - MOV_L (REGOFF(24,ESP), EAX) - MOV_L (REGOFF(36,ESP), EDX) - MOV_L (REGOFF(8,EAX), EAX) - MOV_L (EAX, REGOFF(8,EDX)) - MOV_L (REGOFF(4,EDX), EAX) - MOV_L (REGOFF(24,ESP), ECX) - MOV_L (REGOFF(28,ESP), EDX) - MOV_L (REGOFF(24,ESP), EDI) - MOV_L (REGOFF(4,ECX), ECX) - -ALIGNTEXT32 + PUSH_L ( EDI ) + PUSH_L ( ESI ) + PUSH_L ( EBP ) - CMP_L ( CONST(0), REGOFF(8, EDI) ) /* count > 0 ?? */ - JE ( LLBL (G3N_end) ) + MOV_L ( ARG_IN, ESI ) + MOV_L ( ARG_DEST, EAX ) + MOV_L ( REGOFF(V3F_COUNT, ESI), EBP ) /* dest->count = in->count */ + MOV_L ( EBP, REGOFF(V3F_COUNT, EAX) ) + MOV_L ( REGOFF(V3F_START, EAX), EAX ) /* dest->start */ + MOV_L ( REGOFF(V3F_START, ESI), ECX ) /* in->start */ + MOV_L ( ARG_LENGTHS, EDX ) - PUSH_L ( EBP ) - MOV_L (REGOFF(8,EDI), EBP) + CMP_L ( CONST(0), EBP ) /* count > 0 ?? */ + JE ( LLBL (G3N_end) ) FEMMS @@ -749,17 +749,23 @@ CMP_L ( CONST(0), EDX ) /* lengths == 0 ? */ JE ( LLBL (G3N_norm2) ) /* calculate lengths */ +ALIGNTEXT32 LLBL (G3N_norm1): /* use precalculated lengths */ + + PREFETCH ( REGIND(EAX) ) + MOVD ( REGIND(EDX), MM3 ) /* | length (x) */ PFMUL ( MM3, MM1 ) /* | x2 (normalized) */ PUNPCKLDQ ( MM3, MM3 ) /* length (x) | length (x) */ - PFMUL ( MM3, MM0 ) /* x1 (normalized) | x0 (normalized) */ + ADD_L ( STRIDE, ECX ) /* next normal */ + + PREFETCH ( REGIND(ECX) ) + PFMUL ( MM3, MM0 ) /* x1 (normalized) | x0 (normalized) */ MOVQ ( MM0, REGIND(EAX) ) /* write new x0, x1 */ - MOVD ( MM1, REGOFF(8, EAX) ) /* write new x2 */ - ADD_L ( REGOFF(12, EDI), ECX ) /* next normal */ + MOVD ( MM1, REGOFF(8, EAX) ) /* write new x2 */ ADD_L ( CONST(12), EAX ) /* next r */ ADD_L ( CONST(4), EDX ) /* next length */ @@ -771,10 +777,15 @@ JMP ( LLBL (G3N_end1) ) -LLBL (G3N_norm2): - /* need to calculate lengths */ +ALIGNTEXT32 +LLBL (G3N_norm2): /* need to calculate lengths */ + + PREFETCHW ( REGIND(EAX) ) + MOVQ ( MM0, MM3 ) /* x1 | x0 */ - ADD_L ( REGOFF(12, EDI), ECX ) /* next normal */ + ADD_L ( STRIDE, ECX ) /* next normal */ + + PREFETCH ( REGIND(ECX) ) PFMUL ( MM0, MM3 ) /* x1*x1 | x0*x0 */ MOVQ ( MM1, MM4 ) /* | x2 */ @@ -808,12 +819,11 @@ LLBL (G3N_end1): FEMMS - POP_L ( EBP ) LLBL (G3N_end): - POP_L ( ESI ) - POP_L ( EDI ) - POP_L ( ECX ) + POP_L ( EBP ) + POP_L ( ESI ) + POP_L ( EDI ) RET @@ -825,48 +835,46 @@ GLOBL GLNAME(gl_3dnow_rescale_normals_raw) GLNAME(gl_3dnow_rescale_normals_raw): - #define FRAME_OFFSET 12 - SUB_L ( CONST(4), ESP ) - PUSH_L ( EDI ) - PUSH_L ( ESI ) - - MOV_L (REGOFF(20,ESP), ESI) - MOV_L (REGOFF(24,ESP), EAX) - MOV_L (REGOFF(36,ESP), EDX) - MOV_L (REGOFF(8,EAX), EAX) - MOV_L (EAX, REGOFF(8,EDX)) - MOV_L (REGOFF(24,ESP), EDI) - MOV_L (EDI, ECX) - MOV_L (REGOFF(4,EDX), EAX) - MOV_L (REGOFF(4,ECX), ECX) - MOV_L (REGOFF(8,EDI), EDX) - -ALIGNTEXT32 + #undef FRAME_OFFSET + #define FRAME_OFFSET 8 + PUSH_L ( EDI ) + PUSH_L ( ESI ) + + MOV_L ( ARG_IN, ESI ) + MOV_L ( ARG_DEST, EAX ) + MOV_L ( REGOFF(V3F_COUNT, ESI), EDX ) /* dest->count = in->count */ + MOV_L ( EDX, REGOFF(V3F_COUNT, EAX) ) + MOV_L ( REGOFF(V3F_START, EAX), EAX ) /* dest->start */ + MOV_L ( REGOFF(V3F_START, ESI), ECX ) /* in->start */ CMP_L ( CONST(0), EDX ) JE ( LLBL (G3R_end) ) FEMMS - MOVD ( ESI, MM0 ) /* scale */ + MOVD ( ARG_SCALE, MM0 ) /* scale */ PUNPCKLDQ ( MM0, MM0 ) MOVQ ( REGIND(ECX), MM1 ) /* x1 | x0 */ MOVD ( REGOFF(8, ECX), MM2 ) /* | x2 */ ALIGNTEXT32 - LLBL (G3R_rescale): + + PREFETCHW ( REGIND(EAX) ) + PFMUL ( MM0, MM1 ) /* x1*scale | x0*scale */ - ADD_L ( REGOFF(12, EDI), ECX ) /* next normal */ + ADD_L ( STRIDE, ECX ) /* next normal */ + PREFETCH ( REGIND(ECX) ) + PFMUL ( MM0, MM2 ) /* | x2*scale */ ADD_L ( CONST(12), EAX ) /* next r */ - DEC_L ( EDX ) /* decrement normal counter */ MOVQ ( MM1, REGOFF(-12, EAX) ) /* write r0, r1 */ - MOVD ( MM2, REGOFF(-4, EAX) ) /* write r2 */ + + DEC_L ( EDX ) /* decrement normal counter */ MOVQ ( REGIND(ECX), MM1 ) /* x1 | x0 */ MOVD ( REGOFF(8, ECX), MM2 ) /* | x2 */ @@ -875,17 +883,6 @@ FEMMS LLBL (G3R_end): - POP_L ( ESI ) - POP_L ( EDI ) - POP_L ( ECX ) + POP_L ( ESI ) + POP_L ( EDI ) RET - - - - - - - - - - Index: xc/extras/Mesa/src/X86/3dnow_vertex.S diff -u /dev/null xc/extras/Mesa/src/X86/3dnow_vertex.S:1.1.1.1 --- /dev/null Mon Dec 18 14:21:56 2000 +++ xc/extras/Mesa/src/X86/3dnow_vertex.S Mon Nov 13 16:34:04 2000 @@ -0,0 +1,220 @@ +#include "assyntax.h" + + SEG_TEXT + +#define MAT_SY 20 +#define MAT_SZ 40 +#define MAT_TX 48 +#define MAT_TY 52 +#define MAT_TZ 56 + + +/* + * void gl_v16_3dnow_general_xform( GLfloat *dest, + * const GLfloat *m, + * const GLfloat *src, + * GLuint src_stride, + * GLuint count ) + * + * These tranformation functions could disappear if the standard ones + * took an output stride. + */ +GLOBL GLNAME( gl_v16_3dnow_general_xform ) +GLNAME( gl_v16_3dnow_general_xform ): + + PUSH_L ( EDI ) + PUSH_L ( ESI ) + + MOV_L ( REGOFF(12, ESP), EAX ) /* dest */ + MOV_L ( REGOFF(16, ESP), ESI ) /* mat */ + MOV_L ( REGOFF(20, ESP), EDX ) /* src */ + MOV_L ( REGOFF(24, ESP), EDI ) /* src_stride */ + MOV_L ( REGOFF(28, ESP), ECX ) /* count */ + + FEMMS + + MOVQ ( REGOFF(MAT_TX, ESI), MM7 ) /* ty | tx */ + MOVQ ( REGOFF(MAT_TZ, ESI), MM3 ) /* tw | tz */ + +ALIGNTEXT32 +LLBL( v16_3dnow_general_loop ): + + PREFETCHW ( REGOFF(128, EAX) ) /* write alloc 2 verts ahead */ + PREFETCH ( REGOFF(32, EDX) ) /* prefetch next cache line */ + + MOVQ ( REGIND(EDX), MM0 ) /* x1 | x0 */ + MOVD ( REGOFF(8, EDX), MM1 ) /* | x2 */ + MOVQ ( REGIND(ESI), MM4 ) /* m1 | m0 */ + PUNPCKHDQ ( MM0, MM2 ) /* x1 | */ + MOVQ ( REGOFF(16, ESI), MM5 ) /* m5 | m4 */ + PUNPCKLDQ ( MM0, MM0 ) /* x0 | x0 */ + MOVQ ( REGOFF(32, ESI), MM6 ) /* m9 | m8 */ + PFMUL ( MM0, MM4 ) /* x0*m1 | x0*m0 */ + PUNPCKHDQ ( MM2, MM2 ) /* x1 | x1 */ + PFMUL ( MM2, MM5 ) /* x1*m5 | x1*m4 */ + PUNPCKLDQ ( MM1, MM1 ) /* x2 | x2 */ + PFMUL ( REGOFF(8, ESI), MM0 ) /* x0*m3 | x0*m2 */ + PFMUL ( REGOFF(24, ESI), MM2 ) /* x1*m7 | x1*m6 */ + PFMUL ( MM1, MM6 ) /* x2*m9 | x2*m8 */ + PFADD ( MM4, MM5 ) /* x0*m1+x1*m5 | x0*m0+x1*m4 */ + PFMUL ( REGOFF(40, ESI), MM1 ) /* x2*m11 | x2*m10 */ + PFADD ( MM0, MM2 ) /* x0*m3+x1*m7 | x0*m2+x1*m6 */ + PFADD ( MM5, MM6 ) + PFADD ( MM1, MM2 ) + PFADD ( MM7, MM6 ) /* r1 | r0 */ + PFADD ( MM3, MM2 ) /* r3 | r2 */ + ADD_L ( EDI, EDX ) /* next input vertex */ + MOVQ ( MM6, REGIND(EAX) ) + MOVQ ( MM2, REGOFF(8, EAX) ) + ADD_L ( CONST(64), EAX ) /* next output vertex */ + DEC_L ( ECX ) + JNE ( LLBL(v16_3dnow_general_loop) ) + + FEMMS + + POP_L ( ESI ) + POP_L ( EDI ) + RET + + + +/* Do viewport map and perspective projection. Args should look like: + * + * gl_3dnow_project_vertices( float *first_vertex, + * const float *last_vertex, + * float *matrix, + * GLuint stride ) + * + * This routine assumes a sane vertex layout with x,y,z,w as + * the first four elements, to be projected in clip-space, to + * x/w,y/w,z/w,1/w, and then transformed according to the matrix to + * device space. The device coordinates will overwrite the clip + * coordinates as the first four elements of the vertex. + * + * If projection is required for other elements, such as texcoords, + * you will have to code a specialized version of this routine. See + * FX/X86 for examples. + * + * These routines are simplified versions of the FX code written by + * Holger. + */ + +GLOBL GLNAME( gl_3dnow_project_vertices ) +GLNAME( gl_3dnow_project_vertices ): + + PUSH_L ( EBP ) + FEMMS + PREFETCH ( REGOFF(8, ESP) ) /* fetch the first vertex */ + + MOV_L ( REGOFF(8, ESP), ECX ) /* first_vert */ + MOV_L ( REGOFF(12, ESP), EDX ) /* last_vert */ + MOV_L ( REGOFF(16, ESP), EBP ) /* matrix */ + MOV_L ( REGOFF(20, ESP), EAX ) /* stride */ + + MOVD ( REGOFF(MAT_TX, EBP), MM6 ) /* | tx */ + PUNPCKLDQ ( REGOFF(MAT_TY, EBP), MM6 ) /* ty | tx */ + MOVD ( REGIND(EBP), MM5 ) + PUNPCKLDQ ( REGOFF(MAT_SY, EBP), MM5 ) /* vsy | vsx */ + MOVD ( REGOFF(MAT_SZ, EBP), MM1 ) /* | vsz */ + SUB_L ( ECX, EDX ) /* last -= first */ + +ALIGNTEXT32 +LLBL( v16_3dnow_pv_loop_start ): + + PREFETCH ( REGOFF(64, ECX) ) /* fetch one/two verts ahead */ + MOVD ( REGOFF(12, ECX), MM0 ) /* | f[3] */ + PFRCP ( MM0, MM0 ) /* oow = 1/f[3] */ + MOVD ( REGOFF(12, ECX), MM7 ) /* | f[3] */ + PFRCPIT1 ( MM0, MM7 ) + PFRCPIT2 ( MM0, MM7 ) /* oow | oow */ + PUNPCKLDQ ( MM7, MM7 ) + MOVQ ( REGIND(ECX), MM2 ) /* f[1] | f[0] */ + PFMUL ( MM7, MM2 ) /* f[1] * oow | f[0] * oow */ + MOVD ( REGOFF(8, ECX), MM3 ) /* | f[2] */ + PFMUL ( MM7, MM3 ) /* | f[2] * oow */ + MOVD ( REGOFF(MAT_TZ, EBP), MM0 ) /* | vtz */ + PFMUL ( MM1, MM3 ) /* | f[2] *= vsz */ + PFADD ( MM0, MM3 ) /* | f[2] += vtz */ + PFMUL ( MM5, MM2 ) /* f[1] *= vsy | f[0] *= vsx */ + PFADD ( MM6, MM2 ) /* f[1] += vty | f[0] += vtx */ + PUNPCKLDQ ( MM7, MM3 ) /* f[3] = oow | f[2] */ + MOVQ ( MM2, REGOFF(0, ECX) ) + MOVQ ( MM3, REGOFF(8, ECX) ) + ADD_L ( EAX, ECX ) /* f += stride */ + SUB_L ( EAX, EDX ) + JA ( LLBL(v16_3dnow_pv_loop_start) ) + + FEMMS + POP_L ( EBP ) + RET + + + +/* + * gl_3dnow_project_clipped_vertices( float *first_vertex, + * const float *last_vertex, + * float *matrix, + * GLuint stride, + * const GLubyte *clip_mask ) + */ +GLOBL GLNAME( gl_3dnow_project_clipped_vertices ) +GLNAME( gl_3dnow_project_clipped_vertices ): + + PUSH_L ( EBP ) + PUSH_L ( ESI ) + + FEMMS + + PREFETCH ( REGOFF(12, ESP) ) /* fetch the first vertex */ + + MOV_L ( REGOFF(12, ESP), ECX ) /* first_vert */ + MOV_L ( REGOFF(16, ESP), EDX ) /* last_vert */ + MOV_L ( REGOFF(20, ESP), EBP ) /* matrix */ + MOV_L ( REGOFF(24, ESP), EAX ) /* stride */ + MOV_L ( REGOFF(28, ESP), ESI ) /* clip_mask */ + + + MOVD ( REGOFF(MAT_TX, EBP), MM6 ) /* | tx */ + PUNPCKLDQ ( REGOFF(MAT_TY, EBP), MM6 ) /* ty | tx */ + MOVD ( REGIND(EBP), MM5 ) + PUNPCKLDQ ( REGOFF(MAT_SY, EBP), MM5 ) /* vsy | vsx */ + MOVD ( REGOFF(MAT_SZ, EBP), MM1 ) /* | vsz */ + +ALIGNTEXT32 +LLBL( v16_3dnow_pcv_loop_start ): + + CMP_B ( CONST(0), REGIND(ESI) ) + JNE ( LLBL(v16_3dnow_pcv_skip) ) + + MOVD ( REGOFF(12, ECX), MM0) /* | f[3] */ + PFRCP ( MM0, MM0 ) /* oow = 1/f[3] */ + MOVD ( REGOFF(12, ECX), MM7) /* | f[3] */ + PFRCPIT1 ( MM0, MM7 ) + PFRCPIT2 ( MM0, MM7 ) /* oow | oow */ + PUNPCKLDQ ( MM7, MM7 ) + MOVQ ( REGIND(ECX), MM2 ) /* f[1] | f[0] */ + PFMUL ( MM7, MM2 ) /* f[1] * oow | f[0] * oow */ + MOVD ( REGOFF(8, ECX), MM3 ) /* | f[2] */ + PFMUL ( MM7, MM3 ) /* | f[2] * oow */ + MOVD ( REGOFF(MAT_TZ, EBP), MM0 ) /* | vtz */ + PFMUL ( MM1, MM3 ) /* | f[2] *= vsz */ + PFADD ( MM0, MM3 ) /* | f[2] += vtz */ + PFMUL ( MM5, MM2 ) /* f[1] *= vsy | f[0] *= vsx */ + PFADD ( MM6, MM2 ) /* f[1] += vty | f[0] += vtx */ + PUNPCKLDQ ( MM7, MM3 ) /* f[3] = oow | f[2] */ + MOVQ ( MM2, REGOFF(0, ECX) ) + MOVQ ( MM3, REGOFF(8, ECX) ) + +LLBL( v16_3dnow_pcv_skip ): + + ADD_L ( EAX, ECX ) /* f += stride */ + INC_L ( ESI ) /* next clip_mask */ + + CMP_L ( ECX, EDX ) + JNE ( LLBL(v16_3dnow_pcv_loop_start) ) + + FEMMS + + POP_L ( ESI ) + POP_L ( EBP ) + RET Index: xc/extras/Mesa/src/X86/3dnow_xform_masked1.S diff -u xc/extras/Mesa/src/X86/3dnow_xform_masked1.S:1.2 xc/extras/Mesa/src/X86/3dnow_xform_masked1.S:1.4 --- xc/extras/Mesa/src/X86/3dnow_xform_masked1.S:1.2 Fri Jun 16 20:02:41 2000 +++ xc/extras/Mesa/src/X86/3dnow_xform_masked1.S Mon Nov 13 18:31:06 2000 @@ -1,528 +1,501 @@ -#include "assyntax.h" - SEG_TEXT +/* + * Mesa 3-D graphics library + * Version: 3.4 + * + * Copyright (C) 1999-2000 Brian Paul All Rights Reserved. + * + * 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 + * BRIAN PAUL 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 "assyntax.h" +#include "xform_args.h" -ALIGNTEXT16 -GLOBL GLNAME(gl_3dnow_transform_points1_general_masked) -GLNAME( gl_3dnow_transform_points1_general_masked ): + SEG_TEXT - PUSH_L ( ESI ) - MOV_L ( REGOFF(8, ESP), ECX ) - MOV_L ( REGOFF(12, ESP), ESI ) - MOV_L ( REGOFF(16, ESP), EAX ) - MOV_L ( CONST(4), REGOFF(16, ECX) ) - OR_B ( CONST(15), REGOFF(20, ECX) ) - MOV_L ( REGOFF(8, EAX), EDX ) - MOV_L ( EDX, REGOFF(8, ECX) ) +#define FRAME_OFFSET 16 -ALIGNTEXT32 +ALIGNTEXT16 +GLOBL GLNAME( gl_3dnow_transform_points1_general_masked ) +GLNAME( gl_3dnow_transform_points1_general_masked ): PUSH_L ( ESI ) PUSH_L ( EDI ) PUSH_L ( EBX ) PUSH_L ( EBP ) - MOV_L ( REGOFF(4, ECX), EDX ) + MOV_L ( ARG_DEST, ECX ) + MOV_L ( ARG_MATRIX, ESI ) + MOV_L ( ARG_SOURCE, EAX ) + MOV_L ( CONST(4), REGOFF(V4F_SIZE, ECX) ) + OR_B ( CONST(VEC_SIZE_4), REGOFF(V4F_FLAGS, ECX) ) + MOV_L ( REGOFF(V4F_COUNT, EAX), EDX ) + MOV_L ( EDX, REGOFF(V4F_COUNT, ECX) ) + + MOV_L ( REGOFF(V4F_START, ECX), EDX ) MOV_L ( ESI, ECX ) - MOV_L ( REGOFF(8, EAX), ESI ) /* count */ - MOV_L ( REGOFF(12, EAX), EDI ) /* input stride */ - MOV_L ( REGOFF(4, EAX), EAX ) - MOV_L ( REGOFF(36, ESP), EBP ) /* clipmask */ - MOV_B ( REGOFF(40, ESP), BL ) /* clip flag */ + MOV_L ( REGOFF(V4F_COUNT, EAX), ESI ) + MOV_L ( REGOFF(V4F_STRIDE, EAX), EDI ) + MOV_L ( REGOFF(V4F_START, EAX), EAX ) + MOV_L ( ARG_CLIP, EBP ) + MOV_B ( ARG_FLAG, BL ) - FEMMS + MOVQ ( REGIND(ECX), MM0 ) /* m01 | m00 */ + MOVQ ( REGOFF(8, ECX), MM1 ) /* m03 | m02 */ + + MOVQ ( REGOFF(48, ECX), MM2 ) /* m31 | m30 */ + MOVQ ( REGOFF(56, ECX), MM3 ) /* m33 | m32 */ - MOVQ ( REGIND(ECX), MM0 ) /* m01 | m00 */ - MOVQ ( REGOFF(8, ECX), MM1 ) /* m03 | m02 */ + TEST_L ( ESI, ESI ) + JZ ( LLBL( G3TPGM_4 ) ) - MOVQ ( REGOFF(48, ECX), MM2 ) /* m31 | m30 */ - MOVQ ( REGOFF(56, ECX), MM3 ) /* m33 | m32 */ +ALIGNTEXT16 +LLBL( G3TPGM_2 ): - CMP_L ( CONST(0), ESI ) - JE ( LLBL(G3TPGM_4) ) + TEST_B ( BL, REGIND(EBP) ) /* mask [i] != clip flag ?? */ + JNZ ( LLBL( G3TPGM_3 ) ) /* skip vertex */ + MOVD ( REGIND(EAX), MM4 ) /* | x0 */ + PUNPCKLDQ ( MM4, MM4 ) /* x0 | x0 */ -ALIGNTEXT32 -LLBL(G3TPGM_2): - TEST_B ( BL, REGIND(EBP) ) /* mask [i] != clip flag ?? */ - JNZ ( LLBL(G3TPGM_3) ) /* skip vertex */ + MOVQ ( MM4, MM5 ) /* x0 | x0 */ + PFMUL ( MM0, MM4 ) /* x0*m01 | x0*m00 */ - MOVD ( REGIND(EAX), MM4 ) /* | x0 */ - PUNPCKLDQ ( MM4, MM4 ) /* x0 | x0 */ + PFMUL ( MM1, MM5 ) /* x0*m03 | x0*m02 */ + PFADD ( MM2, MM4 ) /* x0*m01+m31 | x0*m00+m30 */ - MOVQ ( MM4, MM5 ) /* x0 | x0 */ - PFMUL ( MM0, MM4 ) /* x0*m01 | x0*m00 */ + PFADD ( MM3, MM5 ) /* x0*m03+m33 | x0*m02+m32 */ + MOVQ ( MM4, REGIND(EDX) ) /* write r1, r0 */ - PFMUL ( MM1, MM5 ) /* x0*m03 | x0*m02 */ - PFADD ( MM2, MM4 ) /* x0*m01+m31 | x0*m00+m30 */ + MOVQ ( MM5, REGOFF(8, EDX) ) /* write r3, r2 */ - PFADD ( MM3, MM5 ) /* x0*m03+m33 | x0*m02+m32 */ - MOVQ ( MM4, REGIND(EDX) ) /* write r1, r0 */ +LLBL( G3TPGM_3 ): - MOVQ ( MM5, REGOFF(8, EDX) ) /* write r3, r2 */ + ADD_L ( EDI, EAX ) /* next vertex */ -LLBL(G3TPGM_3): - ADD_L ( EDI, EAX ) /* next vertex */ + INC_L ( EBP ) /* next clipmask */ + ADD_L ( CONST(16), EDX ) /* next r */ - INC_L ( EBP ) /* next clipmask */ - ADD_L ( CONST(16), EDX ) /* next r */ + DEC_L ( ESI ) /* decrement vertex counter */ + JNZ ( LLBL( G3TPGM_2 ) ) /* cnt > 0 ? -> process next vertex */ - DEC_L ( ESI ) /* decrement vertex counter */ - JA ( LLBL(G3TPGM_2) ) /* cnt > 0 ? -> process next vertex */ +LLBL( G3TPGM_4 ): -LLBL(G3TPGM_4): FEMMS - POP_L ( EBP ) POP_L ( EBX ) POP_L ( EDI ) POP_L ( ESI ) - - POP_L ( ESI ) RET ALIGNTEXT16 -GLOBL GLNAME(gl_3dnow_transform_points1_identity_masked) -GLNAME( gl_3dnow_transform_points1_identity_masked ): - - PUSH_L ( ESI ) - MOV_L ( REGOFF(8, ESP), ECX ) - MOV_L ( REGOFF(12, ESP), ESI ) - MOV_L ( REGOFF(16, ESP), EAX ) - MOV_L ( CONST(1), REGOFF(16, ECX) ) - OR_B ( CONST(1), REGOFF(20, ECX) ) - MOV_L ( REGOFF(8, EAX), EDX ) - MOV_L ( EDX, REGOFF(8, ECX) ) - -ALIGNTEXT32 +GLOBL GLNAME( gl_3dnow_transform_points1_perspective_masked ) +GLNAME( gl_3dnow_transform_points1_perspective_masked ): PUSH_L ( ESI ) PUSH_L ( EDI ) PUSH_L ( EBX ) PUSH_L ( EBP ) + + MOV_L ( ARG_DEST, ECX ) + MOV_L ( ARG_MATRIX, ESI ) + MOV_L ( ARG_SOURCE, EAX ) + MOV_L ( CONST(4), REGOFF(V4F_SIZE, ECX) ) + OR_B ( CONST(VEC_SIZE_4), REGOFF(V4F_FLAGS, ECX) ) + MOV_L ( REGOFF(V4F_COUNT, EAX), EDX ) + MOV_L ( EDX, REGOFF(V4F_COUNT, ECX) ) - MOV_L ( REGOFF(4, ECX), EDX ) + MOV_L ( REGOFF(V4F_START, ECX), EDX ) MOV_L ( ESI, ECX ) - MOV_L ( REGOFF(8, EAX), ESI ) /* count */ - MOV_L ( REGOFF(12, EAX), EDI ) /* input stride */ - MOV_L ( REGOFF(4, EAX), EAX ) - MOV_L ( REGOFF(36, ESP), EBP ) /* clipmask */ - MOV_B ( REGOFF(40, ESP), BL ) /* clip flag */ + MOV_L ( REGOFF(V4F_COUNT, EAX), ESI ) + MOV_L ( REGOFF(V4F_STRIDE, EAX), EDI ) + MOV_L ( REGOFF(V4F_START, EAX), EAX ) + MOV_L ( ARG_CLIP, EBP ) + MOV_B ( ARG_FLAG, BL ) - FEMMS + MOVD ( REGIND(ECX), MM0 ) /* | m00 */ + MOVD ( REGOFF(56, ECX), MM3 ) /* | m32 */ -ALIGNTEXT32 + TEST_L ( ESI, ESI ) + JZ ( LLBL( G3TPPM_4 ) ) -LLBL(G3TPIM_2): - TEST_B ( BL, REGIND(EBP) ) /* mask [i] != clip flag ?? */ - JNZ ( LLBL(G3TPIM_3) /* skip vertex */ ) +ALIGNTEXT16 +LLBL( G3TPPM_2 ): - MOVD ( REGIND(EAX), MM0 ) /* | x0 */ - MOVD ( MM0, REGIND(EDX) ) /* | r0 */ + TEST_B ( BL, REGIND(EBP) ) /* mask [i] != clip flag ?? */ + JNZ ( LLBL( G3TPPM_3 ) ) /* skip vertex */ -LLBL(G3TPIM_3): - ADD_L ( EDI, EAX ) /* next vertex */ - ADD_L ( CONST(16), EDX ) /* next r */ + MOVD ( REGIND(EAX), MM4 ) /* 0 | x0 */ + PFMUL ( MM0, MM4 ) /* 0 | x0*m00 */ - INC_L ( EBP ) /* next clipmask */ - DEC_L ( ESI ) /* decrement vertex counter */ + MOVQ ( MM4, REGIND(EDX) ) /* write r1, r0 */ + MOVQ ( MM3, REGOFF(8, EDX) ) /* write r2 (=m32), r3 (=0) */ - JA ( LLBL(G3TPIM_2) /* cnt > 0 ? -> process next vertex */ ) +LLBL( G3TPPM_3 ): -LLBL(G3TPIM_4): - FEMMS + ADD_L ( EDI, EAX ) /* next vertex */ + ADD_L ( CONST(16), EDX ) /* next r */ + + INC_L ( EBP ) /* next clipmask */ + DEC_L ( ESI ) /* decrement vertex counter */ + + JNZ ( LLBL( G3TPPM_2 ) ) /* cnt > 0 ? -> process next vertex */ + +LLBL( G3TPPM_4 ): + FEMMS POP_L ( EBP ) POP_L ( EBX ) POP_L ( EDI ) POP_L ( ESI ) - - POP_L ( ESI ) RET ALIGNTEXT16 -GLOBL GLNAME(gl_3dnow_transform_points1_2d_masked) -GLNAME( gl_3dnow_transform_points1_2d_masked ): - - PUSH_L ( ESI ) - MOV_L ( REGOFF(8, ESP), ECX ) - MOV_L ( REGOFF(12, ESP), ESI ) - MOV_L ( REGOFF(16, ESP), EAX ) - MOV_L ( CONST(2), REGOFF(16, ECX) ) - OR_B ( CONST(3), REGOFF(20, ECX) ) - MOV_L ( REGOFF(8, EAX), EDX ) - MOV_L ( EDX, REGOFF(8, ECX) ) - -ALIGNTEXT32 +GLOBL GLNAME( gl_3dnow_transform_points1_3d_masked ) +GLNAME( gl_3dnow_transform_points1_3d_masked ): PUSH_L ( ESI ) PUSH_L ( EDI ) PUSH_L ( EBX ) PUSH_L ( EBP ) + + MOV_L ( ARG_DEST, ECX ) + MOV_L ( ARG_MATRIX, ESI ) + MOV_L ( ARG_SOURCE, EAX ) + MOV_L ( CONST(3), REGOFF(V4F_SIZE, ECX) ) + OR_B ( CONST(VEC_SIZE_3), REGOFF(V4F_FLAGS, ECX) ) + MOV_L ( REGOFF(V4F_COUNT, EAX), EDX ) + MOV_L ( EDX, REGOFF(V4F_COUNT, ECX) ) - MOV_L ( REGOFF(4, ECX), EDX ) + MOV_L ( REGOFF(V4F_START, ECX), EDX ) MOV_L ( ESI, ECX ) - MOV_L ( REGOFF(8, EAX), ESI ) /* count */ - MOV_L ( REGOFF(12, EAX), EDI ) /* input stride */ - MOV_L ( REGOFF(4, EAX), EAX ) - MOV_L ( REGOFF(36, ESP), EBP ) /* clipmask */ - MOV_B ( REGOFF(40, ESP), BL ) /* clip flag */ + MOV_L ( REGOFF(V4F_COUNT, EAX), ESI ) + MOV_L ( REGOFF(V4F_STRIDE, EAX), EDI ) + MOV_L ( REGOFF(V4F_START, EAX), EAX ) + MOV_L ( ARG_CLIP, EBP ) + MOV_B ( ARG_FLAG, BL ) - FEMMS + MOVQ ( REGIND(ECX), MM0 ) /* m01 | m00 */ + MOVD ( REGOFF(8, ECX), MM1 ) /* | m02 */ - MOVQ ( REGIND(ECX), MM0 ) /* m01 | m00 */ - MOVQ ( REGOFF(48, ECX), MM2 ) /* m31 | m30 */ + MOVQ ( REGOFF(48, ECX), MM2 ) /* m31 | m30 */ + MOVD ( REGOFF(56, ECX), MM3 ) /* | m32 */ - CMP_L ( CONST(0), ESI ) - JE ( LLBL(G3TP2M_4) ) + TEST_L ( ESI, ESI ) + JZ ( LLBL( G3TP3M_4 ) ) +ALIGNTEXT16 +LLBL( G3TP3M_2 ): -ALIGNTEXT32 + TEST_B ( BL, REGIND(EBP) ) /* mask [i] != clip flag ?? */ + JNZ ( LLBL( G3TP3M_3 ) ) /* skip vertex */ -LLBL(G3TP2M_2): - TEST_B ( BL, REGIND(EBP) ) /* mask [i] != clip flag ?? */ - JNZ ( LLBL(G3TP2M_3) ) /* skip vertex */ + MOVD ( REGIND(EAX), MM4 ) /* | x0 */ + PUNPCKLDQ ( MM4, MM4 ) /* x0 | x0 */ - MOVD ( REGIND(EAX), MM4 ) /* | x0 */ - PUNPCKLDQ ( MM4, MM4 ) /* x0 | x0 */ + MOVQ ( MM4, MM5 ) /* | x0 */ + PFMUL ( MM0, MM4 ) /* x0*m01 | x0*m00 */ - PFMUL ( MM0, MM4 ) /* x0*m01 | x0*m00 */ - PFADD ( MM2, MM4 ) /* x0*m01+m31 | x0*m00+m30 */ + PFMUL ( MM1, MM5 ) /* | x0*m02 */ + PFADD ( MM2, MM4 ) /* x0*m01+m31 | x0*m00+m30 */ - MOVQ ( MM4, REGIND(EDX) ) /* write r1, r0 */ + PFADD ( MM3, MM5 ) /* | x0*m02+m32 */ + MOVQ ( MM4, REGIND(EDX) ) /* write r1, r0 */ -LLBL(G3TP2M_3): - ADD_L ( EDI, EAX ) /* next vertex */ + MOVD ( MM5, REGOFF(8, EDX) ) /* write r2 */ - ADD_L ( CONST(16), EDX ) /* next r */ - INC_L ( EBP ) /* next clipmask */ +LLBL( G3TP3M_3 ): - DEC_L ( ESI ) /* decrement vertex counter */ - JA ( LLBL(G3TP2M_2) ) /* cnt > 0 ? -> process next vertex */ + ADD_L ( EDI, EAX ) /* next vertex */ + ADD_L ( CONST(16), EDX ) /* next r */ -LLBL(G3TP2M_4): - FEMMS + INC_L ( EBP ) /* next clipmask */ + DEC_L ( ESI ) /* decrement vertex counter */ + JNZ ( LLBL( G3TP3M_2 ) ) /* cnt > 0 ? -> process next vertex */ + +LLBL( G3TP3M_4 ): + FEMMS POP_L ( EBP ) POP_L ( EBX ) POP_L ( EDI ) POP_L ( ESI ) - - POP_L ( ESI ) RET - ALIGNTEXT16 -GLOBL GLNAME(gl_3dnow_transform_points1_2d_no_rot_masked) -GLNAME( gl_3dnow_transform_points1_2d_no_rot_masked ): - - PUSH_L ( ESI ) - MOV_L ( REGOFF(8, ESP), ECX ) - MOV_L ( REGOFF(12, ESP), ESI ) - MOV_L ( REGOFF(16, ESP), EAX ) - MOV_L ( CONST(2), REGOFF(16, ECX) ) - OR_B ( CONST(3), REGOFF(20, ECX) ) - MOV_L ( REGOFF(8, EAX), EDX ) - MOV_L ( EDX, REGOFF(8, ECX) ) - -ALIGNTEXT32 +GLOBL GLNAME( gl_3dnow_transform_points1_3d_no_rot_masked ) +GLNAME( gl_3dnow_transform_points1_3d_no_rot_masked ): PUSH_L ( ESI ) PUSH_L ( EDI ) PUSH_L ( EBX ) PUSH_L ( EBP ) + + MOV_L ( ARG_DEST, ECX ) + MOV_L ( ARG_MATRIX, ESI ) + MOV_L ( ARG_SOURCE, EAX ) + MOV_L ( CONST(3), REGOFF(V4F_SIZE, ECX) ) + OR_B ( CONST(VEC_SIZE_3), REGOFF(V4F_FLAGS, ECX) ) + MOV_L ( REGOFF(V4F_COUNT, EAX), EDX ) + MOV_L ( EDX, REGOFF(V4F_COUNT, ECX) ) - MOV_L ( REGOFF(4, ECX), EDX ) + MOV_L ( REGOFF(V4F_START, ECX), EDX ) MOV_L ( ESI, ECX ) - MOV_L ( REGOFF(8, EAX), ESI ) /* count */ - MOV_L ( REGOFF(12, EAX), EDI ) /* input stride */ - MOV_L ( REGOFF(4, EAX), EAX ) - MOV_L ( REGOFF(36, ESP), EBP ) /* clipmask */ - MOV_B ( REGOFF(40, ESP), BL ) /* clip flag */ + MOV_L ( REGOFF(V4F_COUNT, EAX), ESI ) + MOV_L ( REGOFF(V4F_STRIDE, EAX), EDI ) + MOV_L ( REGOFF(V4F_START, EAX), EAX ) + MOV_L ( ARG_CLIP, EBP ) + MOV_B ( ARG_FLAG, BL ) - FEMMS + MOVD ( REGIND(ECX), MM0 ) /* | m00 */ + MOVQ ( REGOFF(48, ECX), MM2 ) /* m31 | m30 */ - MOVD ( REGIND(ECX), MM0 ) /* | m00 */ - MOVQ ( REGOFF(48, ECX), MM2 ) /* m31 | m30 */ + MOVD ( REGOFF(56, ECX), MM3 ) /* | m32 */ - CMP_L ( CONST(0), ESI ) - JE ( LLBL(G3TP2NRM_4) ) + TEST_L ( ESI, ESI ) + JZ ( LLBL( G3TP3NRM_4 ) ) +ALIGNTEXT16 +LLBL( G3TP3NRM_2 ): -ALIGNTEXT32 + TEST_B ( BL, REGIND(EBP) ) /* mask [i] != clip flag ?? */ + JNZ ( LLBL( G3TP3NRM_3)) /* skip vertex */ -LLBL(G3TP2NRM_2): - TEST_B ( BL, REGIND(EBP) ) /* mask [i] != clip flag ?? */ - JNZ ( LLBL(G3TP2NRM_3) /* skip vertex */ ) + MOVD ( REGIND(EAX), MM4 ) /* | x0 */ + PFMUL ( MM0, MM4 ) /* | x0*m00 */ - MOVD ( REGIND(EAX), MM4 ) /* | x0 */ - PFMUL ( MM0, MM4 ) /* | x0*m00 */ + PFADD ( MM2, MM4 ) /* m31 | x0*m00+m30 */ + MOVQ ( MM4, REGIND(EDX) ) /* write r1, r0 */ - PFADD ( MM2, MM4 ) /* m31 | x0*m00+m30 */ - MOVQ ( MM4, REGIND(EDX) ) /* write r1, r0 */ + MOVD ( MM3, REGOFF(8, EDX) ) /* write r2 */ -LLBL(G3TP2NRM_3): - ADD_L ( CONST(16), EDX ) /* next r */ - ADD_L ( EDI, EAX ) /* next vertex */ +LLBL( G3TP3NRM_3 ): - INC_L ( EBP ) /* next clipmask */ - DEC_L ( ESI ) /* decrement vertex counter */ + ADD_L ( EDI, EAX ) /* next vertex */ + ADD_L ( CONST(16), EDX ) /* next r */ - JA ( LLBL(G3TP2NRM_2) /* cnt > 0 ? -> process next vertex */ ) + INC_L ( EBP ) /* next clipmask */ + DEC_L ( ESI ) /* decrement vertex counter */ + JNZ ( LLBL( G3TP3NRM_2 ) ) /* cnt > 0 ? -> process next vertex */ -LLBL(G3TP2NRM_4): - FEMMS +LLBL( G3TP3NRM_4 ): + FEMMS POP_L ( EBP ) POP_L ( EBX ) POP_L ( EDI ) POP_L ( ESI ) - - POP_L ( ESI ) RET ALIGNTEXT16 -GLOBL GLNAME(gl_3dnow_transform_points1_3d_masked) -GLNAME( gl_3dnow_transform_points1_3d_masked ): - - PUSH_L ( ESI ) - MOV_L ( REGOFF(8, ESP), ECX ) - MOV_L ( REGOFF(12, ESP), ESI ) - MOV_L ( REGOFF(16, ESP), EAX ) - MOV_L ( CONST(3), REGOFF(16, ECX) ) - OR_B ( CONST(7), REGOFF(20, ECX) ) - MOV_L ( REGOFF(8, EAX), EDX ) - MOV_L ( EDX, REGOFF(8, ECX) ) - -ALIGNTEXT32 +GLOBL GLNAME( gl_3dnow_transform_points1_2d_masked ) +GLNAME( gl_3dnow_transform_points1_2d_masked ): PUSH_L ( ESI ) PUSH_L ( EDI ) PUSH_L ( EBX ) PUSH_L ( EBP ) - MOV_L ( REGOFF(4, ECX), EDX ) - MOV_L ( ESI, ECX ) - MOV_L ( REGOFF(8, EAX), ESI ) /* count */ - MOV_L ( REGOFF(12, EAX), EDI ) /* input stride */ - MOV_L ( REGOFF(4, EAX), EAX ) - MOV_L ( REGOFF(36, ESP), EBP ) /* clipmask */ - MOV_B ( REGOFF(40, ESP), BL ) /* clip flag */ - - FEMMS + MOV_L ( ARG_DEST, ECX ) + MOV_L ( ARG_MATRIX, ESI ) + MOV_L ( ARG_SOURCE, EAX ) + MOV_L ( CONST(2), REGOFF(V4F_SIZE, ECX) ) + OR_B ( CONST(VEC_SIZE_2), REGOFF(V4F_FLAGS, ECX) ) + MOV_L ( REGOFF(V4F_COUNT, EAX), EDX ) + MOV_L ( EDX, REGOFF(V4F_COUNT, ECX) ) - MOVQ ( REGIND(ECX), MM0 ) /* m01 | m00 */ - MOVD ( REGOFF(8, ECX), MM1 ) /* | m02 */ + MOV_L ( REGOFF(V4F_START, ECX), EDX ) + MOV_L ( ESI, ECX ) + MOV_L ( REGOFF(V4F_COUNT, EAX), ESI ) + MOV_L ( REGOFF(V4F_STRIDE, EAX), EDI ) + MOV_L ( REGOFF(V4F_START, EAX), EAX ) + MOV_L ( ARG_CLIP, EBP ) + MOV_B ( ARG_FLAG, BL ) - MOVQ ( REGOFF(48, ECX), MM2 ) /* m31 | m30 */ - MOVD ( REGOFF(56, ECX), MM3 ) /* | m32 */ + MOVQ ( REGIND(ECX), MM0 ) /* m01 | m00 */ + MOVQ ( REGOFF(48, ECX), MM2 ) /* m31 | m30 */ - CMP_L ( CONST(0), ESI ) - JE ( LLBL(G3TP3M_4) ) + TEST_L ( ESI, ESI ) + JZ ( LLBL( G3TP2M_4 ) ) -ALIGNTEXT32 +ALIGNTEXT16 +LLBL( G3TP2M_2 ): -LLBL(G3TP3M_2): - TEST_B ( BL, REGIND(EBP) ) /* mask [i] != clip flag ?? */ - JNZ ( LLBL(G3TP3M_3) /* skip vertex */ ) + TEST_B ( BL, REGIND(EBP) ) /* mask [i] != clip flag ?? */ + JNZ ( LLBL( G3TP2M_3 ) ) /* skip vertex */ - MOVD ( REGIND(EAX), MM4 ) /* | x0 */ - PUNPCKLDQ ( MM4, MM4 ) /* x0 | x0 */ + MOVD ( REGIND(EAX), MM4 ) /* | x0 */ + PUNPCKLDQ ( MM4, MM4 ) /* x0 | x0 */ - MOVQ ( MM4, MM5 ) /* | x0 */ - PFMUL ( MM0, MM4 ) /* x0*m01 | x0*m00 */ + PFMUL ( MM0, MM4 ) /* x0*m01 | x0*m00 */ + PFADD ( MM2, MM4 ) /* x0*m01+m31 | x0*m00+m30 */ - PFMUL ( MM1, MM5 ) /* | x0*m02 */ - PFADD ( MM2, MM4 ) /* x0*m01+m31 | x0*m00+m30 */ + MOVQ ( MM4, REGIND(EDX) ) /* write r1, r0 */ - PFADD ( MM3, MM5 ) /* | x0*m02+m32 */ - MOVQ ( MM4, REGIND(EDX) ) /* write r1, r0 */ +LLBL( G3TP2M_3 ): - MOVD ( MM5, REGOFF(8, EDX) ) /* write r2 */ + ADD_L ( EDI, EAX ) /* next vertex */ -LLBL(G3TP3M_3): - ADD_L ( EDI, EAX ) /* next vertex */ + ADD_L ( CONST(16), EDX ) /* next r */ + INC_L ( EBP ) /* next clipmask */ - ADD_L ( CONST(16), EDX ) /* next r */ - INC_L ( EBP ) /* next clipmask */ + DEC_L ( ESI ) /* decrement vertex counter */ + JNZ ( LLBL( G3TP2M_2 ) ) /* cnt > 0 ? -> process next vertex */ - DEC_L ( ESI ) /* decrement vertex counter */ - JA ( LLBL(G3TP3M_2) /* cnt > 0 ? -> process next vertex */ ) +LLBL( G3TP2M_4 ): -LLBL(G3TP3M_4): FEMMS - POP_L ( EBP ) POP_L ( EBX ) POP_L ( EDI ) POP_L ( ESI ) - - POP_L ( ESI ) RET ALIGNTEXT16 -GLOBL GLNAME(gl_3dnow_transform_points1_3d_no_rot_masked) -GLNAME( gl_3dnow_transform_points1_3d_no_rot_masked ): - - PUSH_L ( ESI ) - MOV_L ( REGOFF(8, ESP), ECX ) - MOV_L ( REGOFF(12, ESP), ESI ) - MOV_L ( REGOFF(16, ESP), EAX ) - MOV_L ( CONST(3), REGOFF(16, ECX) ) - OR_B ( CONST(7), REGOFF(20, ECX) ) - MOV_L ( REGOFF(8, EAX), EDX ) - MOV_L ( EDX, REGOFF(8, ECX) ) - - -ALIGNTEXT32 +GLOBL GLNAME(gl_3dnow_transform_points1_2d_no_rot_masked) +GLNAME( gl_3dnow_transform_points1_2d_no_rot_masked ): PUSH_L ( ESI ) PUSH_L ( EDI ) PUSH_L ( EBX ) PUSH_L ( EBP ) + + MOV_L ( ARG_DEST, ECX ) + MOV_L ( ARG_MATRIX, ESI ) + MOV_L ( ARG_SOURCE, EAX ) + MOV_L ( CONST(2), REGOFF(V4F_SIZE, ECX) ) + OR_B ( CONST(VEC_SIZE_2), REGOFF(V4F_FLAGS, ECX) ) + MOV_L ( REGOFF(V4F_COUNT, EAX), EDX ) + MOV_L ( EDX, REGOFF(V4F_COUNT, ECX) ) - MOV_L ( REGOFF(4, ECX), EDX ) + MOV_L ( REGOFF(V4F_START, ECX), EDX ) MOV_L ( ESI, ECX ) - MOV_L ( REGOFF(8, EAX), ESI ) /* count */ - MOV_L ( REGOFF(12, EAX), EDI ) /* input stride */ - MOV_L ( REGOFF(4, EAX), EAX ) - MOV_L ( REGOFF(36, ESP), EBP ) /* clipmask */ - MOV_B ( REGOFF(40, ESP), BL ) /* clip flag */ + MOV_L ( REGOFF(V4F_COUNT, EAX), ESI ) + MOV_L ( REGOFF(V4F_STRIDE, EAX), EDI ) + MOV_L ( REGOFF(V4F_START, EAX), EAX ) + MOV_L ( ARG_CLIP, EBP ) + MOV_B ( ARG_FLAG, BL ) - FEMMS + MOVD ( REGIND(ECX), MM0 ) /* | m00 */ + MOVQ ( REGOFF(48, ECX), MM2 ) /* m31 | m30 */ - MOVD ( REGIND(ECX), MM0 ) /* | m00 */ - MOVQ ( REGOFF(48, ECX), MM2 ) /* m31 | m30 */ + TEST_L ( ESI, ESI ) + JZ ( LLBL( G3TP2NRM_4 ) ) - MOVD ( REGOFF(56, ECX), MM3 ) /* | m32 */ - CMP_L ( CONST(0), ESI ) - JE ( LLBL(G3TP3NRM_4) ) +ALIGNTEXT16 +LLBL( G3TP2NRM_2 ): -ALIGNTEXT32 + TEST_B ( BL, REGIND(EBP) ) /* mask [i] != clip flag ?? */ + JNZ ( LLBL( G3TP2NRM_3 ) ) /* skip vertex */ -LLBL(G3TP3NRM_2): - TEST_B ( BL, REGIND(EBP) ) /* mask [i] != clip flag ?? */ - JNZ ( LLBL(G3TP3NRM_3) /* skip vertex */ ) + MOVD ( REGIND(EAX), MM4 ) /* | x0 */ + PFMUL ( MM0, MM4 ) /* | x0*m00 */ - MOVD ( REGIND(EAX), MM4 ) /* | x0 */ - PFMUL ( MM0, MM4 ) /* | x0*m00 */ + PFADD ( MM2, MM4 ) /* m31 | x0*m00+m30 */ + MOVQ ( MM4, REGIND(EDX) ) /* write r1, r0 */ - PFADD ( MM2, MM4 ) /* m31 | x0*m00+m30 */ - MOVQ ( MM4, REGIND(EDX) ) /* write r1, r0 */ +LLBL( G3TP2NRM_3 ): - MOVD ( MM3, REGOFF(8, EDX) ) /* write r2 */ + ADD_L ( CONST(16), EDX ) /* next r */ + ADD_L ( EDI, EAX ) /* next vertex */ -LLBL(G3TP3NRM_3): - ADD_L ( EDI, EAX ) /* next vertex */ + INC_L ( EBP ) /* next clipmask */ + DEC_L ( ESI ) /* decrement vertex counter */ - ADD_L ( CONST(16), EDX ) /* next r */ - INC_L ( EBP ) /* next clipmask */ + JNZ ( LLBL( G3TP2NRM_2 ) ) /* cnt > 0 ? -> process next vertex */ - DEC_L ( ESI ) /* decrement vertex counter */ - JA ( LLBL(G3TP3NRM_2) /* cnt > 0 ? -> process next vertex */ ) +LLBL( G3TP2NRM_4 ): -LLBL(G3TP3NRM_4): FEMMS - POP_L ( EBP ) POP_L ( EBX ) POP_L ( EDI ) POP_L ( ESI ) - - POP_L ( ESI ) RET ALIGNTEXT16 -GLOBL GLNAME(gl_3dnow_transform_points1_perspective_masked) -GLNAME( gl_3dnow_transform_points1_perspective_masked ): - - PUSH_L ( ESI ) - MOV_L ( REGOFF(8, ESP), ECX ) - MOV_L ( REGOFF(12, ESP), ESI ) - MOV_L ( REGOFF(16, ESP), EAX ) - MOV_L ( CONST(4), REGOFF(16, ECX) ) - OR_B ( CONST(15), REGOFF(20, ECX) ) - MOV_L ( REGOFF(8, EAX), EDX ) - MOV_L ( EDX, REGOFF(8, ECX) ) - -ALIGNTEXT32 +GLOBL GLNAME( gl_3dnow_transform_points1_identity_masked ) +GLNAME( gl_3dnow_transform_points1_identity_masked ): PUSH_L ( ESI ) PUSH_L ( EDI ) PUSH_L ( EBX ) PUSH_L ( EBP ) - MOV_L ( REGOFF(4, ECX), EDX ) - MOV_L ( ESI, ECX ) - MOV_L ( REGOFF(8, EAX), ESI ) /* count */ - MOV_L ( REGOFF(12, EAX), EDI ) /* input stride */ - MOV_L ( REGOFF(4, EAX), EAX ) - MOV_L ( REGOFF(36, ESP), EBP ) /* clipmask */ - MOV_B ( REGOFF(40, ESP), BL ) /* clip flag */ - - FEMMS + MOV_L ( ARG_DEST, ECX ) + MOV_L ( ARG_MATRIX, ESI ) + MOV_L ( ARG_SOURCE, EAX ) + MOV_L ( CONST(1), REGOFF(V4F_SIZE, ECX) ) + OR_B ( CONST(VEC_SIZE_1), REGOFF(V4F_FLAGS, ECX) ) + MOV_L ( REGOFF(V4F_COUNT, EAX), EDX ) + MOV_L ( EDX, REGOFF(V4F_COUNT, ECX) ) - MOVD ( REGIND(ECX), MM0 ) /* | m00 */ - MOVD ( REGOFF(56, ECX), MM3 ) /* | m32 */ + MOV_L ( REGOFF(V4F_START, ECX), EDX ) + MOV_L ( ESI, ECX ) + MOV_L ( REGOFF(V4F_COUNT, EAX), ESI ) + MOV_L ( REGOFF(V4F_STRIDE, EAX), EDI ) + MOV_L ( REGOFF(V4F_START, EAX), EAX ) + MOV_L ( ARG_CLIP, EBP ) + MOV_B ( ARG_FLAG, BL ) - CMP_L ( CONST(0), ESI ) - JE ( LLBL(G3TPPM_4) ) +ALIGNTEXT16 +LLBL( G3TPIM_2 ): -ALIGNTEXT32 + TEST_B ( BL, REGIND(EBP) ) /* mask [i] != clip flag ?? */ + JNZ ( LLBL( G3TPIM_3 ) ) /* skip vertex */ -LLBL(G3TPPM_2): - TEST_B ( BL, REGIND(EBP) ) /* mask [i] != clip flag ?? */ - JNZ ( LLBL(G3TPPM_3) /* skip vertex */ ) + MOVD ( REGIND(EAX), MM0 ) /* | x0 */ + MOVD ( MM0, REGIND(EDX) ) /* | r0 */ - MOVD ( REGIND(EAX), MM4 ) /* 0 | x0 */ - PFMUL ( MM0, MM4 ) /* 0 | x0*m00 */ +LLBL( G3TPIM_3 ): - MOVQ ( MM4, REGIND(EDX) ) /* write r1, r0 */ - MOVQ ( MM3, REGOFF(8, EDX) ) /* write r2 (=m32), r3 (=0) */ + ADD_L ( EDI, EAX ) /* next vertex */ + ADD_L ( CONST(16), EDX ) /* next r */ -LLBL(G3TPPM_3): - ADD_L ( EDI, EAX ) /* next vertex */ - ADD_L ( CONST(16), EDX ) /* next r */ + INC_L ( EBP ) /* next clipmask */ + DEC_L ( ESI ) /* decrement vertex counter */ - INC_L ( EBP ) /* next clipmask */ - DEC_L ( ESI ) /* decrement vertex counter */ + JNZ ( LLBL( G3TPIM_2 ) ) /* cnt > 0 ? -> process next vertex */ - JA ( LLBL(G3TPPM_2) /* cnt > 0 ? -> process next vertex */ ) +LLBL( G3TPIM_4 ): -LLBL(G3TPPM_4): FEMMS - POP_L ( EBP ) POP_L ( EBX ) POP_L ( EDI ) POP_L ( ESI ) - - POP_L ( ESI ) RET - - - - - - - Index: xc/extras/Mesa/src/X86/3dnow_xform_masked2.S diff -u xc/extras/Mesa/src/X86/3dnow_xform_masked2.S:1.2 xc/extras/Mesa/src/X86/3dnow_xform_masked2.S:1.4 --- xc/extras/Mesa/src/X86/3dnow_xform_masked2.S:1.2 Fri Jun 16 20:02:41 2000 +++ xc/extras/Mesa/src/X86/3dnow_xform_masked2.S Mon Nov 13 18:31:06 2000 @@ -1,587 +1,568 @@ + +/* + * Mesa 3-D graphics library + * Version: 3.4 + * + * Copyright (C) 1999-2000 Brian Paul All Rights Reserved. + * + * 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 + * BRIAN PAUL 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 "assyntax.h" +#include "xform_args.h" - SEG_TEXT + SEG_TEXT +#define FRAME_OFFSET 16 + ALIGNTEXT16 -GLOBL GLNAME(gl_3dnow_transform_points2_general_masked) +GLOBL GLNAME( gl_3dnow_transform_points2_general_masked ) GLNAME( gl_3dnow_transform_points2_general_masked ): PUSH_L ( ESI ) - MOV_L ( REGOFF(8, ESP), ECX ) - MOV_L ( REGOFF(12, ESP), ESI ) - MOV_L ( REGOFF(16, ESP), EAX ) - MOV_L ( CONST(4), REGOFF(16, ECX) ) - OR_B ( CONST(15), REGOFF(20, ECX) ) - MOV_L ( REGOFF(8, EAX), EDX ) - MOV_L ( EDX, REGOFF(8, ECX) ) - -ALIGNTEXT32 - - PUSH_L ( ESI ) PUSH_L ( EDI ) PUSH_L ( EBX ) PUSH_L ( EBP ) - - MOV_L ( REGOFF(4, ECX), EDX ) - MOV_L ( ESI, ECX ) - MOV_L ( REGOFF(8, EAX), ESI ) /* count */ - MOV_L ( REGOFF(12, EAX), EDI ) /* input stride */ - MOV_L ( REGOFF(4, EAX), EAX ) - MOV_L ( REGOFF(36, ESP), EBP ) /* clipmask */ - MOV_B ( REGOFF(40, ESP), BL ) /* clip flag */ - - FEMMS - MOVD ( REGIND(ECX), MM0 ) /* | m00 */ - MOVD ( REGOFF(16, ECX), MM7 ) /* | m10 */ - PSLLQ ( CONST(32), MM7 ) /* m10 | */ - POR ( MM7, MM0 ) /* m10 | m00 */ + MOV_L ( ARG_DEST, ECX ) + MOV_L ( ARG_MATRIX, ESI ) + MOV_L ( ARG_SOURCE, EAX ) + MOV_L ( CONST(4), REGOFF(V4F_SIZE, ECX) ) + OR_B ( CONST(VEC_SIZE_4), REGOFF(V4F_FLAGS, ECX) ) + MOV_L ( REGOFF(V4F_COUNT, EAX), EDX ) + MOV_L ( EDX, REGOFF(V4F_COUNT, ECX) ) - MOVD ( REGOFF(4, ECX), MM1 ) /* | m01 */ - MOVD ( REGOFF(20, ECX), MM7 ) /* | m11 */ - PSLLQ ( CONST(32), MM7 ) /* m11 | */ - POR ( MM7, MM1 ) /* m11 | m01 */ + MOV_L ( REGOFF(V4F_START, ECX), EDX ) + MOV_L ( ESI, ECX ) + MOV_L ( REGOFF(V4F_COUNT, EAX), ESI ) + MOV_L ( REGOFF(V4F_STRIDE, EAX), EDI ) + MOV_L ( REGOFF(V4F_START, EAX), EAX ) + MOV_L ( ARG_CLIP, EBP ) + MOV_B ( ARG_FLAG, BL ) + + MOVD ( REGIND(ECX), MM0 ) /* | m00 */ + MOVD ( REGOFF(16, ECX), MM7 ) /* | m10 */ + PSLLQ ( CONST(32), MM7 ) /* m10 | */ + POR ( MM7, MM0 ) /* m10 | m00 */ + + MOVD ( REGOFF(4, ECX), MM1 ) /* | m01 */ + MOVD ( REGOFF(20, ECX), MM7 ) /* | m11 */ + PSLLQ ( CONST(32), MM7 ) /* m11 | */ + POR ( MM7, MM1 ) /* m11 | m01 */ + + MOVD ( REGOFF(8, ECX), MM2 ) /* | m02 */ + MOVD ( REGOFF(24, ECX), MM7 ) /* | m12 */ + PSLLQ ( CONST(32), MM7 ) /* m12 | */ + POR ( MM7, MM2 ) /* m12 | m02 */ + + MOVD ( REGOFF(12, ECX), MM3 ) /* | m03 */ + MOVD ( REGOFF(28, ECX), MM7 ) /* | m13 */ + PSLLQ ( CONST(32), MM7 ) /* m13 | */ + POR ( MM7, MM3 ) /* m13 | m03 */ - MOVD ( REGOFF(8, ECX), MM2 ) /* | m02 */ - MOVD ( REGOFF(24, ECX), MM7 ) /* | m12 */ - PSLLQ ( CONST(32), MM7 ) /* m12 | */ - POR ( MM7, MM2 ) /* m12 | m02 */ + MOVQ ( REGOFF(48, ECX), MM4 ) /* m31 | m30 */ + MOVQ ( REGOFF(56, ECX), MM5 ) /* m33 | m32 */ - MOVD ( REGOFF(12, ECX), MM3 ) /* | m03 */ - MOVD ( REGOFF(28, ECX), MM7 ) /* | m13 */ - PSLLQ ( CONST(32), MM7 ) /* m13 | */ - POR ( MM7, MM3 ) /* m13 | m03 */ + TEST_L ( ESI, ESI ) + JZ ( LLBL( G3TPGM_4 ) ) - MOVQ ( REGOFF(48, ECX), MM4 ) /* m31 | m30 */ - MOVQ ( REGOFF(56, ECX), MM5 ) /* m33 | m32 */ +ALIGNTEXT16 +LLBL( G3TPGM_2 ): - CMP_L ( CONST(0), ESI ) - JE ( LLBL(G3TPGM_4) ) + TEST_B ( BL, REGIND(EBP) ) /* mask [i] != clip flag ?? */ + JNZ ( LLBL( G3TPGM_3 ) ) /* skip vertex */ -ALIGNTEXT32 + MOVQ ( REGIND(EAX), MM6 ) /* x1 | x0 */ + MOVQ ( MM6, MM7 ) /* x1 | x0 */ -LLBL(G3TPGM_2): - TEST_B ( BL, REGIND(EBP) ) /* mask [i] != clip flag ?? */ - JNZ ( LLBL(G3TPGM_3) ) /* skip vertex */ + PFMUL ( MM0, MM6 ) /* x1*m10 | x0*m00 */ + PFMUL ( MM1, MM7 ) /* x1*m11 | x0*m01 */ - MOVQ ( REGIND(EAX), MM6 ) /* x1 | x0 */ - MOVQ ( MM6, MM7 ) /* x1 | x0 */ + PFACC ( MM7, MM6 ) /* x0*m01+x1*m11 | x0*x00+x1*m10 */ + PFADD ( MM4, MM6 ) /* x0*...*m11+m31 | x0*...*m10+m30 */ - PFMUL ( MM0, MM6 ) /* x1*m10 | x0*m00 */ - PFMUL ( MM1, MM7 ) /* x1*m11 | x0*m01 */ + MOVQ ( MM6, REGIND(EDX) ) /* write r1, r0 */ + MOVQ ( REGIND(EAX), MM6 ) /* x1 | x0 */ - PFACC ( MM7, MM6 ) /* x0*m01+x1*m11 | x0*x00+x1*m10 */ - PFADD ( MM4, MM6 ) /* x0*...*m11+m31| x0*x00+x1*m10+m30 */ + MOVQ ( MM6, MM7 ) /* x1 | x0 */ + PFMUL ( MM2, MM6 ) /* x1*m12 | x0*m02 */ - MOVQ ( MM6, REGIND(EDX) ) /* write r1, r0 */ - MOVQ ( REGIND(EAX), MM6 ) /* x1 | x0 */ + PFMUL ( MM3, MM7 ) /* x1*m13 | x0*m03 */ + PFACC ( MM7, MM6 ) /* x0*m03+x1*m13 | x0*x02+x1*m12 */ - MOVQ ( MM6, MM7 ) /* x1 | x0 */ - PFMUL ( MM2, MM6 ) /* x1*m12 | x0*m02 */ + PFADD ( MM5, MM6 ) /* x0*...*m13+m33 | x0*...*m12+m32 */ + MOVQ ( MM6, REGOFF(8, EDX) ) /* write r3, r2 */ - PFMUL ( MM3, MM7 ) /* x1*m13 | x0*m03 */ - PFACC ( MM7, MM6 ) /* x0*m03+x1*m13 | x0*x02+x1*m12 */ +ALIGNTEXT16 +LLBL( G3TPGM_3 ): - PFADD ( MM5, MM6 ) /* x0*...*m13+m33| x0*x02+x1*m12+m32 */ - MOVQ ( MM6, REGOFF(8, EDX) ) /* write r3, r2 */ + ADD_L ( EDI, EAX ) /* next vertex */ + ADD_L ( CONST(16), EDX ) /* next r */ -LLBL(G3TPGM_3): - ADD_L ( EDI, EAX ) /* next vertex */ - ADD_L ( CONST(16), EDX ) /* next r */ + INC_L ( EBP ) /* next clipmask */ + DEC_L ( ESI ) /* decrement vertex counter */ - INC_L ( EBP ) /* next clipmask */ - DEC_L ( ESI ) /* decrement vertex counter */ + JNZ ( LLBL( G3TPGM_2 ) ) /* cnt > 0 ? -> process next vertex */ - JA ( LLBL(G3TPGM_2) ) /* cnt > 0 ? -> process next vertex */ +LLBL( G3TPGM_4 ): -LLBL(G3TPGM_4): FEMMS - POP_L ( EBP ) POP_L ( EBX ) POP_L ( EDI ) POP_L ( ESI ) - - POP_L ( ESI ) RET - ALIGNTEXT16 -GLOBL GLNAME(gl_3dnow_transform_points2_identity_masked) -GLNAME( gl_3dnow_transform_points2_identity_masked ): - - PUSH_L ( ESI ) - MOV_L ( REGOFF(8, ESP), ECX ) - MOV_L ( REGOFF(12, ESP), ESI ) - MOV_L ( REGOFF(16, ESP), EAX ) - MOV_L ( CONST(2), REGOFF(16, ECX) ) - OR_B ( CONST(3), REGOFF(20, ECX) ) - MOV_L ( REGOFF(8, EAX), EDX ) - MOV_L ( EDX, REGOFF(8, ECX) ) - -ALIGNTEXT32 +GLOBL GLNAME( gl_3dnow_transform_points2_perspective_masked ) +GLNAME( gl_3dnow_transform_points2_perspective_masked ): PUSH_L ( ESI ) PUSH_L ( EDI ) PUSH_L ( EBX ) PUSH_L ( EBP ) + + MOV_L ( ARG_DEST, ECX ) + MOV_L ( ARG_MATRIX, ESI ) + MOV_L ( ARG_SOURCE, EAX ) + MOV_L ( CONST(4), REGOFF(V4F_SIZE, ECX) ) + OR_B ( CONST(VEC_SIZE_4), REGOFF(V4F_FLAGS, ECX) ) + MOV_L ( REGOFF(V4F_COUNT, EAX), EDX ) + MOV_L ( EDX, REGOFF(V4F_COUNT, ECX) ) - MOV_L ( REGOFF(4, ECX), EDX ) + MOV_L ( REGOFF(V4F_START, ECX), EDX ) MOV_L ( ESI, ECX ) - MOV_L ( REGOFF(8, EAX), ESI ) /* count */ - MOV_L ( REGOFF(12, EAX), EDI ) /* input stride */ - MOV_L ( REGOFF(4, EAX), EAX ) - MOV_L ( REGOFF(36, ESP), EBP ) /* clipmask */ - MOV_B ( REGOFF(40, ESP), BL ) /* clip flag */ + MOV_L ( REGOFF(V4F_COUNT, EAX), ESI ) + MOV_L ( REGOFF(V4F_STRIDE, EAX), EDI ) + MOV_L ( REGOFF(V4F_START, EAX), EAX ) + MOV_L ( ARG_CLIP, EBP ) + MOV_B ( ARG_FLAG, BL ) + + MOVD ( REGIND(ECX), MM0 ) /* | m00 */ + MOVD ( REGOFF(20, ECX), MM1 ) /* | m11 */ - FEMMS + PSLLQ ( CONST(32), MM1 ) /* m11 | */ + POR ( MM1, MM0 ) /* m11 | m00 */ -ALIGNTEXT32 + MOVD ( REGOFF(56, ECX), MM3 ) /* | m32 */ -LLBL(G3TPIM_2): - TEST_B ( BL, REGIND(EBP) ) /* mask [i] != clip flag ?? */ - JNZ ( LLBL(G3TPIM_3) ) /* skip vertex */ + TEST_L ( ESI, ESI ) + JZ ( LLBL( G3TPPM_4 ) ) - MOVQ ( REGIND(EAX), MM0 ) /* x1 | x0 */ - MOVQ ( MM0, REGIND(EDX) ) /* r1 | r0 */ +ALIGNTEXT16 +LLBL( G3TPPM_2 ): -LLBL(G3TPIM_3): - ADD_L ( EDI, EAX ) /* next vertex */ - ADD_L ( CONST(16), EDX ) /* next r */ + TEST_B ( BL, REGIND(EBP) ) /* mask [i] != clip flag ?? */ + JNZ ( LLBL( G3TPPM_3 ) ) /* skip vertex */ - INC_L ( EBP ) /* next clipmask */ - DEC_L ( ESI ) /* decrement vertex counter */ + MOVQ ( REGIND(EAX), MM4 ) /* x1 | x0 */ + PFMUL ( MM0, MM4 ) /* x1*m11 | x0*m00 */ - JA ( LLBL(G3TPIM_2) ) /* cnt > 0 ? -> process next vertex */ + MOVQ ( MM4, REGIND(EDX) ) /* write r1, r0 */ + MOVQ ( MM3, REGOFF(8, EDX) ) /* write r2 (=m32), r3 (=0) */ -LLBL(G3TPIM_4): - FEMMS +LLBL( G3TPPM_3 ): + + ADD_L ( EDI, EAX ) /* next vertex */ + ADD_L ( CONST(16), EDX ) /* next r */ + INC_L ( EBP ) /* next clipmask */ + DEC_L ( ESI ) /* decrement vertex counter */ + + JNZ ( LLBL( G3TPPM_2 ) ) /* cnt > 0 ? -> process next vertex */ + +LLBL( G3TPPM_4 ): + + FEMMS POP_L ( EBP ) POP_L ( EBX ) POP_L ( EDI ) POP_L ( ESI ) - - POP_L ( ESI ) RET ALIGNTEXT16 -GLOBL GLNAME(gl_3dnow_transform_points2_2d_masked) -GLNAME( gl_3dnow_transform_points2_2d_masked ): - - PUSH_L ( ESI ) - MOV_L ( REGOFF(8, ESP), ECX ) - MOV_L ( REGOFF(12, ESP), ESI ) - MOV_L ( REGOFF(16, ESP), EAX ) - MOV_L ( CONST(2), REGOFF(16, ECX) ) - OR_B ( CONST(3), REGOFF(20, ECX) ) - MOV_L ( REGOFF(8, EAX), EDX ) - MOV_L ( EDX, REGOFF(8, ECX) ) - -ALIGNTEXT32 +GLOBL GLNAME( gl_3dnow_transform_points2_3d_masked ) +GLNAME( gl_3dnow_transform_points2_3d_masked ): PUSH_L ( ESI ) PUSH_L ( EDI ) PUSH_L ( EBX ) PUSH_L ( EBP ) - MOV_L ( REGOFF(4, ECX), EDX ) + MOV_L ( ARG_DEST, ECX ) + MOV_L ( ARG_MATRIX, ESI ) + MOV_L ( ARG_SOURCE, EAX ) + MOV_L ( CONST(3), REGOFF(V4F_SIZE, ECX) ) + OR_B ( CONST(VEC_SIZE_3), REGOFF(V4F_FLAGS, ECX) ) + MOV_L ( REGOFF(V4F_COUNT, EAX), EDX ) + MOV_L ( EDX, REGOFF(V4F_COUNT, ECX) ) + + MOV_L ( REGOFF(V4F_START, ECX), EDX ) MOV_L ( ESI, ECX ) - MOV_L ( REGOFF(8, EAX), ESI ) /* count */ - MOV_L ( REGOFF(12, EAX), EDI ) /* input stride */ - MOV_L ( REGOFF(4, EAX), EAX ) - MOV_L ( REGOFF(36, ESP), EBP ) /* clipmask */ - MOV_B ( REGOFF(40, ESP), BL ) /* clip flag */ + MOV_L ( REGOFF(V4F_COUNT, EAX), ESI ) + MOV_L ( REGOFF(V4F_STRIDE, EAX), EDI ) + MOV_L ( REGOFF(V4F_START, EAX), EAX ) + MOV_L ( ARG_CLIP, EBP ) + MOV_B ( ARG_FLAG, BL ) + + MOVD ( REGIND(ECX), MM0 ) /* | m00 */ + MOVD ( REGOFF(16, ECX), MM7 ) /* | m10 */ + PSLLQ ( CONST(32), MM7 ) /* m10 | */ + POR ( MM7, MM0 ) /* m10 | m00 */ + + MOVD ( REGOFF(4, ECX), MM1 ) /* | m01 */ + MOVD ( REGOFF(20, ECX), MM7 ) /* | m11 */ + PSLLQ ( CONST(32), MM7 ) /* m11 | */ + POR ( MM7, MM1 ) /* m11 | m01 */ + + MOVD ( REGOFF(8, ECX), MM2 ) /* | m02 */ + MOVD ( REGOFF(24, ECX), MM7 ) /* | m12 */ + PSLLQ ( CONST(32), MM7 ) /* m12 | */ + POR ( MM7, MM2 ) /* m12 | m02 */ - FEMMS + MOVQ ( REGOFF(48, ECX), MM4 ) /* m31 | m30 */ + MOVD ( REGOFF(56, ECX), MM5 ) /* | m32 */ - MOVQ ( REGIND(ECX), MM0 ) /* m01 | m00 */ - MOVQ ( REGOFF(16, ECX), MM1 ) /* m11 | m10 */ + TEST_L ( ESI, ESI ) + JZ ( LLBL( G3TP3M_4 ) ) - MOVQ ( REGOFF(48, ECX), MM2 ) /* m31 | m30 */ - CMP_L ( CONST(0), ESI ) - JE ( LLBL(G3TP2M_4) ) +ALIGNTEXT16 +LLBL( G3TP3M_2 ): -ALIGNTEXT32 + TEST_B ( BL, REGIND(EBP) ) /* mask [i] != clip flag ?? */ + JNZ ( LLBL( G3TP3M_3 ) ) /* skip vertex */ -LLBL(G3TP2M_2): - TEST_B ( BL, REGIND(EBP) ) /* mask [i] != clip flag ?? */ - JNZ ( LLBL(G3TP2M_3) ) /* skip vertex */ + MOVQ ( REGIND(EAX), MM6 ) /* x1 | x0 */ + MOVQ ( MM6, MM7 ) /* x1 | x0 */ - MOVD ( REGIND(EAX), MM4 ) /* | x0 */ - MOVD ( REGOFF(4, EAX), MM5 ) /* | x1 */ + PFMUL ( MM0, MM6 ) /* x1*m10 | x0*m00 */ + PFMUL ( MM1, MM7 ) /* x1*m11 | x0*m01 */ - PUNPCKLDQ ( MM4, MM4 ) /* x0 | x0 */ - PFMUL ( MM0, MM4 ) /* x0*m01 | x0*m00 */ + PFACC ( MM7, MM6 ) /* x0*m01+x1*m11 | x0*x00+x1*m10 */ + PFADD ( MM4, MM6 ) /* x0*...*m11+m31 | x0*...*m10+m30 */ - PUNPCKLDQ ( MM5, MM5 ) /* x1 | x1 */ - PFMUL ( MM1, MM5 ) /* x1*m11 | x1*m10 */ + MOVQ ( MM6, REGIND(EDX) ) /* write r1, r0 */ + MOVQ ( REGIND(EAX), MM6 ) /* x1 | x0 */ - PFADD ( MM5, MM4 ) /* x0*m01+x1*m11 | x0*m00+x1*m10 */ - PFADD ( MM2, MM4 ) /* x...x1*m11+31 | x0*m00+x1*m10+m30 */ + MOVQ ( MM6, MM7 ) /* x1 | x0 */ + PFMUL ( MM2, MM6 ) /* x1*m12 | x0*m02 */ - MOVQ ( MM4, REGIND(EDX) ) /* write r1, r0 */ + PFACC ( MM7, MM6 ) /* ***trash*** | x0*x02+x1*m12 */ -LLBL(G3TP2M_3): - ADD_L ( EDI, EAX ) /* next vertex */ + PFADD ( MM5, MM6 ) /* ***trash*** | x0*...*m12+m32 */ + MOVD ( MM6, REGOFF(8, EDX) ) /* write r2 */ - INC_L ( EBP ) /* next clipmask */ - ADD_L ( CONST(16), EDX ) /* next r */ +LLBL( G3TP3M_3 ): - DEC_L ( ESI ) /* decrement vertex counter */ - JA ( LLBL(G3TP2M_2) ) /* cnt > 0 ? -> process next vertex */ + ADD_L ( EDI, EAX ) /* next vertex */ + ADD_L ( CONST(16), EDX ) /* next r */ -LLBL(G3TP2M_4): - FEMMS + INC_L ( EBP ) /* next clipmask */ + DEC_L ( ESI ) /* decrement vertex counter */ + + JNZ ( LLBL( G3TP3M_2 ) ) /* cnt > 0 ? -> process next vertex */ +LLBL( G3TP3M_4 ): + + FEMMS POP_L ( EBP ) POP_L ( EBX ) POP_L ( EDI ) POP_L ( ESI ) - - POP_L ( ESI ) RET - ALIGNTEXT16 -GLOBL GLNAME(gl_3dnow_transform_points2_2d_no_rot_masked) -GLNAME( gl_3dnow_transform_points2_2d_no_rot_masked ): - - PUSH_L ( ESI ) - MOV_L ( REGOFF(8, ESP), ECX ) - MOV_L ( REGOFF(12, ESP), ESI ) - MOV_L ( REGOFF(16, ESP), EAX ) - MOV_L ( CONST(2), REGOFF(16, ECX) ) - OR_B ( CONST(3), REGOFF(20, ECX) ) - MOV_L ( REGOFF(8, EAX), EDX ) - MOV_L ( EDX, REGOFF(8, ECX) ) - -ALIGNTEXT32 +GLOBL GLNAME( gl_3dnow_transform_points2_3d_no_rot_masked ) +GLNAME( gl_3dnow_transform_points2_3d_no_rot_masked ): PUSH_L ( ESI ) PUSH_L ( EDI ) PUSH_L ( EBX ) PUSH_L ( EBP ) + + MOV_L ( ARG_DEST, ECX ) + MOV_L ( ARG_MATRIX, ESI ) + MOV_L ( ARG_SOURCE, EAX ) + MOV_L ( CONST(3), REGOFF(V4F_SIZE, ECX) ) + OR_B ( CONST(VEC_SIZE_3), REGOFF(V4F_FLAGS, ECX) ) + MOV_L ( REGOFF(V4F_COUNT, EAX), EDX ) + MOV_L ( EDX, REGOFF(V4F_COUNT, ECX) ) - MOV_L ( REGOFF(4, ECX), EDX ) + MOV_L ( REGOFF(V4F_START, ECX), EDX ) MOV_L ( ESI, ECX ) - MOV_L ( REGOFF(8, EAX), ESI ) /* count */ - MOV_L ( REGOFF(12, EAX), EDI ) /* input stride */ - MOV_L ( REGOFF(4, EAX), EAX ) - MOV_L ( REGOFF(36, ESP), EBP ) /* clipmask */ - MOV_B ( REGOFF(40, ESP), BL ) /* clip flag */ + MOV_L ( REGOFF(V4F_COUNT, EAX), ESI ) + MOV_L ( REGOFF(V4F_STRIDE, EAX), EDI ) + MOV_L ( REGOFF(V4F_START, EAX), EAX ) + MOV_L ( ARG_CLIP, EBP ) + MOV_B ( ARG_FLAG, BL ) + + MOVD ( REGIND(ECX), MM0 ) /* | m00 */ + MOVD ( REGOFF(20, ECX), MM1 ) /* | m11 */ - FEMMS + PSLLQ ( CONST(32), MM1 ) /* m11 | */ + POR ( MM1, MM0 ) /* m11 | m00 */ + + MOVQ ( REGOFF(48, ECX), MM2 ) /* m31 | m30 */ + MOVD ( REGOFF(56, ECX), MM3 ) /* | m32 */ - MOVD ( REGIND(ECX), MM0 ) /* | m00 */ - MOVD ( REGOFF(20, ECX), MM1 ) /* | m11 */ + TEST_L ( ESI, ESI ) + JZ ( LLBL( G3TP3NRM_4 ) ) - PSLLQ ( CONST(32), MM1 ) /* m11 | */ - POR ( MM1, MM0 ) /* m11 | m00 */ +ALIGNTEXT16 +LLBL( G3TP3NRM_2 ): - MOVQ ( REGOFF(48, ECX), MM2 ) /* m31 | m30 */ - CMP_L ( CONST(0), ESI ) - JE ( LLBL(G3TP2NRM_4) ) + TEST_B ( BL, REGIND(EBP) ) /* mask [i] != clip flag ?? */ + JNZ ( LLBL( G3TP3NRM_3 ) ) /* skip vertex */ -ALIGNTEXT32 + MOVQ ( REGIND(EAX), MM4 ) /* x1 | x0 */ + PFMUL ( MM0, MM4 ) /* x1*m11 | x0*m00 */ -LLBL(G3TP2NRM_2): - TEST_B ( BL, REGIND(EBP) ) /* mask [i] != clip flag ?? */ - JNZ ( LLBL(G3TP2NRM_3) ) /* skip vertex */ + PFADD ( MM2, MM4 ) /* x1*m11+m31 | x0*m00+m30 */ + MOVQ ( MM4, REGIND(EDX) ) /* write r1, r0 */ - MOVQ ( REGIND(EAX), MM4 ) /* x1 | x0 */ - PFMUL ( MM0, MM4 ) /* x1*m11 | x0*m00 */ + MOVD ( MM3, REGOFF(8, EDX) ) /* write r2 */ - PFADD ( MM2, MM4 ) /* m31 | x0*m00+m30 */ - MOVQ ( MM4, REGIND(EDX) ) /* write r1, r0 */ +LLBL( G3TP3NRM_3 ): -LLBL(G3TP2NRM_3): - ADD_L ( EDI, EAX ) /* next vertex */ - ADD_L ( CONST(16), EDX ) /* next r */ + ADD_L ( EDI, EAX ) /* next vertex */ + ADD_L ( CONST(16), EDX ) /* next r */ - INC_L ( EBP ) /* next clipmask */ - DEC_L ( ESI ) /* decrement vertex counter */ + INC_L ( EBP ) /* next clipmask */ + DEC_L ( ESI ) /* decrement vertex counter */ - JA ( LLBL(G3TP2NRM_2) /* cnt > 0 ? -> process next vertex */ ) + JNZ ( LLBL( G3TP3NRM_2 ) ) /* cnt > 0 ? -> process next vertex */ -LLBL(G3TP2NRM_4): - FEMMS +LLBL( G3TP3NRM_4 ): + FEMMS POP_L ( EBP ) POP_L ( EBX ) POP_L ( EDI ) POP_L ( ESI ) - - POP_L ( ESI ) RET - ALIGNTEXT16 -GLOBL GLNAME(gl_3dnow_transform_points2_3d_masked) -GLNAME( gl_3dnow_transform_points2_3d_masked ): - - PUSH_L ( ESI ) - MOV_L ( REGOFF(8, ESP), ECX ) - MOV_L ( REGOFF(12, ESP), ESI ) - MOV_L ( REGOFF(16, ESP), EAX ) - MOV_L ( CONST(3), REGOFF(16, ECX) ) - OR_B ( CONST(7), REGOFF(20, ECX) ) - MOV_L ( REGOFF(8, EAX), EDX ) - MOV_L ( EDX, REGOFF(8, ECX) ) - -ALIGNTEXT32 +GLOBL GLNAME( gl_3dnow_transform_points2_2d_masked ) +GLNAME( gl_3dnow_transform_points2_2d_masked ): PUSH_L ( ESI ) PUSH_L ( EDI ) PUSH_L ( EBX ) PUSH_L ( EBP ) - MOV_L ( REGOFF(4, ECX), EDX ) - MOV_L ( ESI, ECX ) - MOV_L ( REGOFF(8, EAX), ESI ) /* count */ - MOV_L ( REGOFF(12, EAX), EDI ) /* input stride */ - MOV_L ( REGOFF(4, EAX), EAX ) - MOV_L ( REGOFF(36, ESP), EBP ) /* clipmask */ - MOV_B ( REGOFF(40, ESP), BL ) /* clip flag */ + MOV_L ( ARG_DEST, ECX ) + MOV_L ( ARG_MATRIX, ESI ) + MOV_L ( ARG_SOURCE, EAX ) + MOV_L ( CONST(2), REGOFF(V4F_SIZE, ECX) ) + OR_B ( CONST(VEC_SIZE_2), REGOFF(V4F_FLAGS, ECX) ) + MOV_L ( REGOFF(V4F_COUNT, EAX), EDX ) + MOV_L ( EDX, REGOFF(V4F_COUNT, ECX) ) - FEMMS - - MOVD ( REGIND(ECX), MM0 ) /* | m00 */ - MOVD ( REGOFF(16, ECX), MM7 ) /* | m10 */ - PSLLQ ( CONST(32), MM7 ) /* m10 | */ - POR ( MM7, MM0 ) /* m10 | m00 */ - - MOVD ( REGOFF(4, ECX), MM1 ) /* | m01 */ - MOVD ( REGOFF(20, ECX), MM7 ) /* | m11 */ - PSLLQ ( CONST(32), MM7 ) /* m11 | */ - POR ( MM7, MM1 ) /* m11 | m01 */ + MOV_L ( REGOFF(V4F_START, ECX), EDX ) + MOV_L ( ESI, ECX ) + MOV_L ( REGOFF(V4F_COUNT, EAX), ESI ) + MOV_L ( REGOFF(V4F_STRIDE, EAX), EDI ) + MOV_L ( REGOFF(V4F_START, EAX), EAX ) + MOV_L ( ARG_CLIP, EBP ) + MOV_B ( ARG_FLAG, BL ) - MOVD ( REGOFF(8, ECX), MM2 ) /* | m02 */ - MOVD ( REGOFF(24, ECX), MM7 ) /* | m12 */ - PSLLQ ( CONST(32), MM7 ) /* m12 | */ - POR ( MM7, MM2 ) /* m12 | m02 */ + MOVQ ( REGIND(ECX), MM0 ) /* m01 | m00 */ + MOVQ ( REGOFF(16, ECX), MM1 ) /* m11 | m10 */ - MOVQ ( REGOFF(48, ECX), MM4 ) /* m31 | m30 */ - MOVD ( REGOFF(56, ECX), MM5 ) /* | m32 */ + MOVQ ( REGOFF(48, ECX), MM2 ) /* m31 | m30 */ - CMP_L ( CONST(0), ESI ) - JE ( LLBL(G3TP3M_4) ) + TEST_L ( ESI, ESI ) + JZ ( LLBL( G3TP2M_4 ) ) -ALIGNTEXT32 +ALIGNTEXT16 +LLBL( G3TP2M_2 ): -LLBL(G3TP3M_2): - TEST_B ( BL, REGIND(EBP) ) /* mask [i] != clip flag ?? */ - JNZ ( LLBL(G3TP3M_3) ) /* skip vertex */ + TEST_B ( BL, REGIND(EBP) ) /* mask [i] != clip flag ?? */ + JNZ ( LLBL( G3TP2M_3 ) ) /* skip vertex */ - MOVQ ( REGIND(EAX), MM6 ) /* x1 | x0 */ - MOVQ ( MM6, MM7 ) /* x1 | x0 */ + MOVD ( REGIND(EAX), MM4 ) /* | x0 */ + MOVD ( REGOFF(4, EAX), MM5 ) /* | x1 */ - PFMUL ( MM0, MM6 ) /* x1*m10 | x0*m00 */ - PFMUL ( MM1, MM7 ) /* x1*m11 | x0*m01 */ + PUNPCKLDQ ( MM4, MM4 ) /* x0 | x0 */ + PFMUL ( MM0, MM4 ) /* x0*m01 | x0*m00 */ - PFACC ( MM7, MM6 ) /* x0*m01+x1*m11 | x0*x00+x1*m10 */ - PFADD ( MM4, MM6 ) /* x0*...*m11+m31| x0*x00+x1*m10+m30 */ + PUNPCKLDQ ( MM5, MM5 ) /* x1 | x1 */ + PFMUL ( MM1, MM5 ) /* x1*m11 | x1*m10 */ - MOVQ ( MM6, REGIND(EDX) ) /* write r1, r0 */ - MOVQ ( REGIND(EAX), MM6 ) /* x1 | x0 */ + PFADD ( MM5, MM4 ) /* x0*m01+x1*m11 | x0*m00+x1*m10 */ + PFADD ( MM2, MM4 ) /* x...x1*m11+31 | x0*...*m10+m30 */ - MOVQ ( MM6, MM7 ) /* x1 | x0 */ - PFMUL ( MM2, MM6 ) /* x1*m12 | x0*m02 */ + MOVQ ( MM4, REGIND(EDX) ) /* write r1, r0 */ - PFACC ( MM7, MM6 ) /* ***trash*** | x0*x02+x1*m12 */ +LLBL( G3TP2M_3 ): - PFADD ( MM5, MM6 ) /* ***trash*** | x0*x02+x1*m12+m32 */ - MOVD ( MM6, REGOFF(8, EDX) ) /* write r2 */ + ADD_L ( EDI, EAX ) /* next vertex */ -LLBL(G3TP3M_3): - ADD_L ( EDI, EAX ) /* next vertex */ - ADD_L ( CONST(16), EDX ) /* next r */ + INC_L ( EBP ) /* next clipmask */ + ADD_L ( CONST(16), EDX ) /* next r */ - INC_L ( EBP ) /* next clipmask */ - DEC_L ( ESI ) /* decrement vertex counter */ + DEC_L ( ESI ) /* decrement vertex counter */ + JNZ ( LLBL( G3TP2M_2 ) ) /* cnt > 0 ? -> process next vertex */ - JA ( LLBL(G3TP3M_2) ) /* cnt > 0 ? -> process next vertex */ +LLBL( G3TP2M_4 ): -LLBL(G3TP3M_4): FEMMS - POP_L ( EBP ) POP_L ( EBX ) POP_L ( EDI ) POP_L ( ESI ) - - POP_L ( ESI ) RET ALIGNTEXT16 -GLOBL GLNAME(gl_3dnow_transform_points2_3d_no_rot_masked) -GLNAME( gl_3dnow_transform_points2_3d_no_rot_masked ): - - PUSH_L ( ESI ) - MOV_L ( REGOFF(8, ESP), ECX ) - MOV_L ( REGOFF(12, ESP), ESI ) - MOV_L ( REGOFF(16, ESP), EAX ) - MOV_L ( CONST(3), REGOFF(16, ECX) ) - OR_B ( CONST(7), REGOFF(20, ECX) ) - MOV_L ( REGOFF(8, EAX), EDX ) - MOV_L ( EDX, REGOFF(8, ECX) ) - -ALIGNTEXT32 +GLOBL GLNAME( gl_3dnow_transform_points2_2d_no_rot_masked ) +GLNAME( gl_3dnow_transform_points2_2d_no_rot_masked ): PUSH_L ( ESI ) PUSH_L ( EDI ) PUSH_L ( EBX ) PUSH_L ( EBP ) - MOV_L ( REGOFF(4, ECX), EDX ) - MOV_L ( ESI, ECX ) - MOV_L ( REGOFF(8, EAX), ESI ) /* count */ - MOV_L ( REGOFF(12, EAX), EDI ) /* input stride */ - MOV_L ( REGOFF(4, EAX), EAX ) - MOV_L ( REGOFF(36, ESP), EBP ) /* clipmask */ - MOV_B ( REGOFF(40, ESP), BL ) /* clip flag */ - - FEMMS + MOV_L ( ARG_DEST, ECX ) + MOV_L ( ARG_MATRIX, ESI ) + MOV_L ( ARG_SOURCE, EAX ) + MOV_L ( CONST(2), REGOFF(V4F_SIZE, ECX) ) + OR_B ( CONST(VEC_SIZE_2), REGOFF(V4F_FLAGS, ECX) ) + MOV_L ( REGOFF(V4F_COUNT, EAX), EDX ) + MOV_L ( EDX, REGOFF(V4F_COUNT, ECX) ) - MOVD ( REGIND(ECX), MM0 ) /* | m00 */ - MOVD ( REGOFF(20, ECX), MM1 ) /* | m11 */ + MOV_L ( REGOFF(V4F_START, ECX), EDX ) + MOV_L ( ESI, ECX ) + MOV_L ( REGOFF(V4F_COUNT, EAX), ESI ) + MOV_L ( REGOFF(V4F_STRIDE, EAX), EDI ) + MOV_L ( REGOFF(V4F_START, EAX), EAX ) + MOV_L ( ARG_CLIP, EBP ) + MOV_B ( ARG_FLAG, BL ) + + MOVD ( REGIND(ECX), MM0 ) /* | m00 */ + MOVD ( REGOFF(20, ECX), MM1 ) /* | m11 */ - PSLLQ ( CONST(32), MM1 ) /* m11 | */ - POR ( MM1, MM0 ) /* m11 | m00 */ + PSLLQ ( CONST(32), MM1 ) /* m11 | */ + POR ( MM1, MM0 ) /* m11 | m00 */ - MOVQ ( REGOFF(48, ECX), MM2 ) /* m31 | m30 */ - MOVD ( REGOFF(56, ECX), MM3 ) /* | m32 */ + MOVQ ( REGOFF(48, ECX), MM2 ) /* m31 | m30 */ - CMP_L ( CONST(0), ESI ) - JE ( LLBL(G3TP3NRM_4) ) + TEST_L ( ESI, ESI ) + JZ ( LLBL( G3TP2NRM_4 ) ) -ALIGNTEXT32 +ALIGNTEXT16 +LLBL( G3TP2NRM_2 ): -LLBL(G3TP3NRM_2): - TEST_B ( BL, REGIND(EBP) ) /* mask [i] != clip flag ?? */ - JNZ ( LLBL(G3TP3NRM_3) ) /* skip vertex */ + TEST_B ( BL, REGIND(EBP) ) /* mask [i] != clip flag ?? */ + JNZ ( LLBL( G3TP2NRM_3 ) ) /* skip vertex */ - MOVQ ( REGIND(EAX), MM4 ) /* x1 | x0 */ - PFMUL ( MM0, MM4 ) /* x1*m11 | x0*m00 */ + MOVQ ( REGIND(EAX), MM4 ) /* x1 | x0 */ + PFMUL ( MM0, MM4 ) /* x1*m11 | x0*m00 */ - PFADD ( MM2, MM4 ) /* x1*m11+m31 | x0*m00+m30 */ - MOVQ ( MM4, REGIND(EDX) ) /* write r1, r0 */ + PFADD ( MM2, MM4 ) /* m31 | x0*m00+m30 */ + MOVQ ( MM4, REGIND(EDX) ) /* write r1, r0 */ - MOVD ( MM3, REGOFF(8, EDX) ) /* write r2 */ +LLBL( G3TP2NRM_3 ): -LLBL(G3TP3NRM_3): - ADD_L ( EDI, EAX ) /* next vertex */ - ADD_L ( CONST(16), EDX ) /* next r */ + ADD_L ( EDI, EAX ) /* next vertex */ + ADD_L ( CONST(16), EDX ) /* next r */ - INC_L ( EBP ) /* next clipmask */ - DEC_L ( ESI ) /* decrement vertex counter */ + INC_L ( EBP ) /* next clipmask */ + DEC_L ( ESI ) /* decrement vertex counter */ - JA ( LLBL(G3TP3NRM_2) ) /* cnt > 0 ? -> process next vertex */ + JNZ ( LLBL( G3TP2NRM_2 ) ) /* cnt > 0 ? -> process next vertex */ -LLBL(G3TP3NRM_4): +LLBL( G3TP2NRM_4 ): FEMMS - POP_L ( EBP ) POP_L ( EBX ) POP_L ( EDI ) POP_L ( ESI ) - - POP_L ( ESI ) RET ALIGNTEXT16 -GLOBL GLNAME(gl_3dnow_transform_points2_perspective_masked) -GLNAME( gl_3dnow_transform_points2_perspective_masked ): - - PUSH_L ( ESI ) - MOV_L ( REGOFF(8, ESP), ECX ) - MOV_L ( REGOFF(12, ESP), ESI ) - MOV_L ( REGOFF(16, ESP), EAX ) - MOV_L ( CONST(4), REGOFF(16, ECX) ) - OR_B ( CONST(15), REGOFF(20, ECX) ) - MOV_L ( REGOFF(8, EAX), EDX ) - MOV_L ( EDX, REGOFF(8, ECX) ) - -ALIGNTEXT32 +GLOBL GLNAME( gl_3dnow_transform_points2_identity_masked ) +GLNAME( gl_3dnow_transform_points2_identity_masked ): PUSH_L ( ESI ) PUSH_L ( EDI ) PUSH_L ( EBX ) PUSH_L ( EBP ) - MOV_L ( REGOFF(4, ECX), EDX ) - MOV_L ( ESI, ECX ) - MOV_L ( REGOFF(8, EAX), ESI ) /* count */ - MOV_L ( REGOFF(12, EAX), EDI ) /* input stride */ - MOV_L ( REGOFF(4, EAX), EAX ) - MOV_L ( REGOFF(36, ESP), EBP ) /* clipmask */ - MOV_B ( REGOFF(40, ESP), BL ) /* clip flag */ + MOV_L ( ARG_DEST, ECX ) + MOV_L ( ARG_MATRIX, ESI ) + MOV_L ( ARG_SOURCE, EAX ) + MOV_L ( CONST(2), REGOFF(V4F_SIZE, ECX) ) + OR_B ( CONST(VEC_SIZE_2), REGOFF(V4F_FLAGS, ECX) ) + MOV_L ( REGOFF(V4F_COUNT, EAX), EDX ) + MOV_L ( EDX, REGOFF(V4F_COUNT, ECX) ) - FEMMS - - MOVD ( REGIND(ECX), MM0 ) /* | m00 */ - MOVD ( REGOFF(20, ECX), MM1 ) /* | m11 */ - - PSLLQ ( CONST(32), MM1 ) /* m11 | */ - POR ( MM1, MM0 ) /* m11 | m00 */ - - MOVD ( REGOFF(56, ECX), MM3 ) /* | m32 */ - CMP_L ( CONST(0), ESI ) - JE ( LLBL(G3TPPM_4) ) + MOV_L ( REGOFF(V4F_START, ECX), EDX ) + MOV_L ( ESI, ECX ) + MOV_L ( REGOFF(V4F_COUNT, EAX), ESI ) + MOV_L ( REGOFF(V4F_STRIDE, EAX), EDI ) + MOV_L ( REGOFF(V4F_START, EAX), EAX ) + MOV_L ( ARG_CLIP, EBP ) + MOV_B ( ARG_FLAG, BL ) -ALIGNTEXT32 +ALIGNTEXT16 +LLBL( G3TPIM_2 ): -LLBL(G3TPPM_2): + TEST_B ( BL, REGIND(EBP) ) /* mask [i] != clip flag ?? */ + JNZ ( LLBL( G3TPIM_3 ) ) /* skip vertex */ - TEST_B ( BL, REGIND(EBP) ) /* mask [i] != clip flag ?? */ - JNZ ( LLBL(G3TPPM_3) ) /* skip vertex */ + MOVQ ( REGIND(EAX), MM0 ) /* x1 | x0 */ + MOVQ ( MM0, REGIND(EDX) ) /* r1 | r0 */ - MOVQ ( REGIND(EAX), MM4 ) /* x1 | x0 */ - PFMUL ( MM0, MM4 ) /* x1*m11 | x0*m00 */ +LLBL( G3TPIM_3 ): - MOVQ ( MM4, REGIND(EDX) ) /* write r1, r0 */ - MOVQ ( MM3, REGOFF(8, EDX) ) /* write r2 (=m32), r3 (=0) */ + ADD_L ( EDI, EAX ) /* next vertex */ + ADD_L ( CONST(16), EDX ) /* next r */ -LLBL(G3TPPM_3): - ADD_L ( EDI, EAX ) /* next vertex */ - ADD_L ( CONST(16), EDX ) /* next r */ + INC_L ( EBP ) /* next clipmask */ + DEC_L ( ESI ) /* decrement vertex counter */ - INC_L ( EBP ) /* next clipmask */ - DEC_L ( ESI ) /* decrement vertex counter */ + JNZ ( LLBL( G3TPIM_2 ) ) /* cnt > 0 ? -> process next vertex */ - JA ( LLBL(G3TPPM_2) ) /* cnt > 0 ? -> process next vertex */ +LLBL( G3TPIM_4 ): -LLBL(G3TPPM_4): FEMMS - POP_L ( EBP ) POP_L ( EBX ) POP_L ( EDI ) POP_L ( ESI ) - - POP_L ( ESI ) RET - - - - Index: xc/extras/Mesa/src/X86/3dnow_xform_masked3.S diff -u xc/extras/Mesa/src/X86/3dnow_xform_masked3.S:1.2 xc/extras/Mesa/src/X86/3dnow_xform_masked3.S:1.4 --- xc/extras/Mesa/src/X86/3dnow_xform_masked3.S:1.2 Fri Jun 16 20:02:41 2000 +++ xc/extras/Mesa/src/X86/3dnow_xform_masked3.S Mon Nov 13 18:31:07 2000 @@ -1,729 +1,709 @@ + +/* + * Mesa 3-D graphics library + * Version: 3.4 + * + * Copyright (C) 1999-2000 Brian Paul All Rights Reserved. + * + * 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 + * BRIAN PAUL 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 "assyntax.h" +#include "xform_args.h" + + SEG_TEXT - SEG_TEXT +#define FRAME_OFFSET 16 ALIGNTEXT16 -GLOBL GLNAME(gl_3dnow_transform_points3_general_masked) +GLOBL GLNAME( gl_3dnow_transform_points3_general_masked ) GLNAME( gl_3dnow_transform_points3_general_masked ): PUSH_L ( ESI ) - MOV_L ( REGOFF(8, ESP), ECX ) - MOV_L ( REGOFF(12, ESP), ESI ) - MOV_L ( REGOFF(16, ESP), EAX ) - MOV_L ( CONST(4), REGOFF(16, ECX) ) - OR_B ( CONST(15), REGOFF(20, ECX) ) - MOV_L ( REGOFF(8, EAX), EDX ) - MOV_L ( EDX, REGOFF(8, ECX) ) - -ALIGNTEXT32 - - PUSH_L ( ESI ) PUSH_L ( EDI ) PUSH_L ( EBX ) PUSH_L ( EBP ) - MOV_L ( REGOFF(4, ECX), EDX ) - MOV_L ( ESI, ECX ) - MOV_L ( REGOFF(8, EAX), ESI ) /* count */ - MOV_L ( REGOFF(12, EAX), EDI ) /* input stride */ - MOV_L ( REGOFF(4, EAX), EAX ) - MOV_L ( REGOFF(36, ESP), EBP ) /* clipmask */ - MOV_B ( REGOFF(40, ESP), BL ) /* clip flag */ + MOV_L ( ARG_DEST, ECX ) + MOV_L ( ARG_MATRIX, ESI ) + MOV_L ( ARG_SOURCE, EAX ) + MOV_L ( CONST(4), REGOFF(V4F_SIZE, ECX) ) + OR_B ( CONST(VEC_SIZE_4), REGOFF(V4F_FLAGS, ECX) ) + MOV_L ( REGOFF(V4F_COUNT, EAX), EDX ) + MOV_L ( EDX, REGOFF(V4F_COUNT, ECX) ) - FEMMS + MOV_L ( REGOFF(V4F_START, ECX), EDX ) + MOV_L ( ESI, ECX ) + MOV_L ( REGOFF(V4F_COUNT, EAX), ESI ) + MOV_L ( REGOFF(V4F_STRIDE, EAX), EDI ) + MOV_L ( REGOFF(V4F_START, EAX), EAX ) + MOV_L ( ARG_CLIP, EBP ) + MOV_B ( ARG_FLAG, BL ) - MOVD ( REGIND(ECX), MM0 ) /* | m00 */ - MOVD ( REGOFF(16, ECX), MM7 ) /* | m10 */ + MOVD ( REGIND(ECX), MM0 ) /* | m00 */ + MOVD ( REGOFF(16, ECX), MM7 ) /* | m10 */ - PSLLQ ( CONST(32), MM7 ) /* m10 | */ - POR ( MM7, MM0 ) /* m10 | m00 */ + PSLLQ ( CONST(32), MM7 ) /* m10 | */ + POR ( MM7, MM0 ) /* m10 | m00 */ - MOVD ( REGOFF(4, ECX), MM1 ) /* | m01 */ - MOVD ( REGOFF(20, ECX), MM7 ) /* | m11 */ + MOVD ( REGOFF(4, ECX), MM1 ) /* | m01 */ + MOVD ( REGOFF(20, ECX), MM7 ) /* | m11 */ - PSLLQ ( CONST(32), MM7 ) /* m11 | */ - POR ( MM7, MM1 ) /* m11 | m01 */ + PSLLQ ( CONST(32), MM7 ) /* m11 | */ + POR ( MM7, MM1 ) /* m11 | m01 */ - MOVQ ( REGOFF(32, ECX), MM2 ) /* m21 | m20 */ - MOVQ ( REGOFF(48, ECX), MM3 ) /* m31 | m30 */ + MOVQ ( REGOFF(32, ECX), MM2 ) /* m21 | m20 */ + MOVQ ( REGOFF(48, ECX), MM3 ) /* m31 | m30 */ - CMP_L ( CONST(0), ESI ) - JE ( LLBL(G3TPGM_6) ) + TEST_L ( ESI, ESI ) + JZ ( LLBL( G3TPGM_6 ) ) PUSH_L ( EBP ) PUSH_L ( EAX ) PUSH_L ( EDX ) PUSH_L ( ESI ) +ALIGNTEXT16 +LLBL( G3TPGM_2 ): -ALIGNTEXT32 -LLBL(G3TPGM_2): + TEST_B ( BL, REGIND(EBP) ) /* mask [i] != clip flag ?? */ + JNZ ( LLBL( G3TPGM_3 ) ) /* skip vertex */ - TEST_B ( BL, REGIND(EBP) ) /* mask [i] != clip flag ?? */ - JNZ ( LLBL(G3TPGM_3) /* skip vertex */ ) + MOVQ ( REGIND(EAX), MM4 ) /* x1 | x0 */ + MOVD ( REGOFF(8, EAX), MM6 ) /* | x2 */ - MOVQ ( REGIND(EAX), MM4 ) /* x1 | x0 */ - MOVD ( REGOFF(8, EAX), MM6 ) /* | x2 */ + MOVQ ( MM4, MM5 ) /* x1 | x0 */ + PFMUL ( MM0, MM4 ) /* x1*m10 | x0*m00 */ - MOVQ ( MM4, MM5 ) /* x1 | x0 */ - PFMUL ( MM0, MM4 ) /* x1*m10 | x0*m00 */ + PUNPCKLDQ ( MM6, MM6 ) /* x2 | x2 */ + PFMUL ( MM1, MM5 ) /* x1*m11 | x0*m01 */ - PUNPCKLDQ ( MM6, MM6 ) /* x2 | x2 */ - PFMUL ( MM1, MM5 ) /* x1*m11 | x0*m01 */ + PFMUL ( MM2, MM6 ) /* x2*m21 | x2*m20 */ + PFACC ( MM5, MM4 ) /* x0*m01+x1*m11 | x0*m00+x1*m10 */ - PFMUL ( MM2, MM6 ) /* x2*m21 | x2*m20 */ - PFACC ( MM5, MM4 ) /* x0*m01+x1*m11 | x0*m00+x1*m10 */ + PFADD ( MM3, MM6 ) /* x2*m21+m31 | x2*m20+m30 */ + PFADD ( MM4, MM6 ) /* r1 | r0 */ - PFADD ( MM3, MM6 ) /* x2*m21+m31 | x2*m20+m30 */ - PFADD ( MM4, MM6 ) /* r1 | r0 */ + MOVQ ( MM6, REGIND(EDX) ) /* write r0, r1 */ - MOVQ ( MM6, REGIND(EDX) ) /* write r0, r1 */ +ALIGNTEXT16 +LLBL( G3TPGM_3 ): -LLBL(G3TPGM_3): - ADD_L ( EDI, EAX ) /* next vertex */ - ADD_L ( CONST(16), EDX ) /* next r */ + ADD_L ( EDI, EAX ) /* next vertex */ + ADD_L ( CONST(16), EDX ) /* next r */ - INC_L ( EBP ) /* next clipmask */ - DEC_L ( ESI ) /* decrement vertex counter */ + INC_L ( EBP ) /* next clipmask */ + DEC_L ( ESI ) /* decrement vertex counter */ - JA ( LLBL(G3TPGM_2) /* cnt > 0 ? -> process next vertex */ ) - /* and now the second stripe ... */ + JNZ ( LLBL( G3TPGM_2 ) ) /* cnt > 0 ? -> process next vertex */ - POP_L ( ESI ) /* reset counter & pointers */ + /* and now the second stripe ... */ + POP_L ( ESI ) /* reset counter & pointers */ POP_L ( EDX ) POP_L ( EAX ) POP_L ( EBP ) - MOVD ( REGOFF(8, ECX), MM0 ) /* | m02 */ - MOVD ( REGOFF(24, ECX), MM7 ) /* | m12 */ + MOVD ( REGOFF(8, ECX), MM0 ) /* | m02 */ + MOVD ( REGOFF(24, ECX), MM7 ) /* | m12 */ - PSLLQ ( CONST(32), MM7 ) /* m12 | */ - POR ( MM7, MM0 ) /* m12 | m02 */ + PSLLQ ( CONST(32), MM7 ) /* m12 | */ + POR ( MM7, MM0 ) /* m12 | m02 */ - MOVD ( REGOFF(12, ECX), MM1 ) /* | m03 */ - MOVD ( REGOFF(28, ECX), MM7 ) /* | m13 */ + MOVD ( REGOFF(12, ECX), MM1 ) /* | m03 */ + MOVD ( REGOFF(28, ECX), MM7 ) /* | m13 */ - PSLLQ ( CONST(32), MM7 ) /* m13 | */ - POR ( MM7, MM1 ) /* m13 | m03 */ + PSLLQ ( CONST(32), MM7 ) /* m13 | */ + POR ( MM7, MM1 ) /* m13 | m03 */ - MOVQ ( REGOFF(40, ECX), MM2 ) /* m23 | m22 */ - MOVQ ( REGOFF(56, ECX), MM3 ) /* m33 | m32 */ + MOVQ ( REGOFF(40, ECX), MM2 ) /* m23 | m22 */ + MOVQ ( REGOFF(56, ECX), MM3 ) /* m33 | m32 */ +ALIGNTEXT16 +LLBL( G3TPGM_4 ): -ALIGNTEXT32 -LLBL(G3TPGM_4): - TEST_B ( BL, REGIND(EBP) ) /* mask [i] != clip flag ?? */ - JNZ ( LLBL(G3TPGM_5) /* skip vertex */ ) + TEST_B ( BL, REGIND(EBP) ) /* mask [i] != clip flag ?? */ + JNZ ( LLBL( G3TPGM_5 ) ) /* skip vertex */ - MOVQ ( REGIND(EAX), MM4 ) /* x1 | x0 */ - MOVD ( REGOFF(8, EAX), MM6 ) /* | x2 */ + MOVQ ( REGIND(EAX), MM4 ) /* x1 | x0 */ + MOVD ( REGOFF(8, EAX), MM6 ) /* | x2 */ - MOVQ ( MM4, MM5 ) /* x1 | x0 */ - PFMUL ( MM0, MM4 ) /* x1*m12 | x0*m02 */ + MOVQ ( MM4, MM5 ) /* x1 | x0 */ + PFMUL ( MM0, MM4 ) /* x1*m12 | x0*m02 */ - PUNPCKLDQ ( MM6, MM6 ) /* x2 | x2 */ - PFMUL ( MM1, MM5 ) /* x1*m13 | x0*m03 */ + PUNPCKLDQ ( MM6, MM6 ) /* x2 | x2 */ + PFMUL ( MM1, MM5 ) /* x1*m13 | x0*m03 */ - PFMUL ( MM2, MM6 ) /* x2*m23 | x2*m22 */ - PFACC ( MM5, MM4 ) /* x0*m03+x1*m13 | x0*m02+x1*m12 */ + PFMUL ( MM2, MM6 ) /* x2*m23 | x2*m22 */ + PFACC ( MM5, MM4 ) /* x0*m03+x1*m13 | x0*m02+x1*m12 */ - PFADD ( MM3, MM6 ) /* x2*m23+m33 | x2*m22+m32 */ - PFADD ( MM4, MM6 ) /* r3 | r2 */ + PFADD ( MM3, MM6 ) /* x2*m23+m33 | x2*m22+m32 */ + PFADD ( MM4, MM6 ) /* r3 | r2 */ - MOVQ ( MM6, REGOFF(8, EDX) ) /* write r2, r3 */ + MOVQ ( MM6, REGOFF(8, EDX) ) /* write r2, r3 */ -LLBL(G3TPGM_5): - ADD_L ( EDI, EAX ) /* next vertex */ - ADD_L ( CONST(16), EDX ) /* next r */ +ALIGNTEXT16 +LLBL( G3TPGM_5 ): - INC_L ( EBP ) /* next clipmask */ - DEC_L ( ESI ) /* decrement vertex counter */ + ADD_L ( EDI, EAX ) /* next vertex */ + ADD_L ( CONST(16), EDX ) /* next r */ - JA ( LLBL(G3TPGM_4) /* cnt > 0 ? -> process next vertex */ ) + INC_L ( EBP ) /* next clipmask */ + DEC_L ( ESI ) /* decrement vertex counter */ -LLBL(G3TPGM_6): + JNZ ( LLBL( G3TPGM_4 ) ) /* cnt > 0 ? -> process next vertex */ - FEMMS +LLBL( G3TPGM_6 ): + FEMMS POP_L ( EBP ) POP_L ( EBX ) POP_L ( EDI ) POP_L ( ESI ) - - POP_L ( ESI ) RET - - ALIGNTEXT16 -GLOBL GLNAME(gl_3dnow_transform_points3_identity_masked) -GLNAME( gl_3dnow_transform_points3_identity_masked ): - - PUSH_L ( ESI ) - MOV_L ( REGOFF(8, ESP), ECX ) - MOV_L ( REGOFF(12, ESP), ESI ) - MOV_L ( REGOFF(16, ESP), EAX ) - MOV_L ( CONST(3), REGOFF(16, ECX) ) - OR_B ( CONST(7), REGOFF(20, ECX) ) - MOV_L ( REGOFF(8, EAX), EDX ) - MOV_L ( EDX, REGOFF(8, ECX) ) - -ALIGNTEXT32 +GLOBL GLNAME( gl_3dnow_transform_points3_perspective_masked ) +GLNAME( gl_3dnow_transform_points3_perspective_masked ): PUSH_L ( ESI ) PUSH_L ( EDI ) PUSH_L ( EBX ) PUSH_L ( EBP ) + + MOV_L ( ARG_DEST, ECX ) + MOV_L ( ARG_MATRIX, ESI ) + MOV_L ( ARG_SOURCE, EAX ) + MOV_L ( CONST(4), REGOFF(V4F_SIZE, ECX) ) + OR_B ( CONST(VEC_SIZE_4), REGOFF(V4F_FLAGS, ECX) ) + MOV_L ( REGOFF(V4F_COUNT, EAX), EDX ) + MOV_L ( EDX, REGOFF(V4F_COUNT, ECX) ) - MOV_L ( REGOFF(4, ECX), EDX ) + MOV_L ( REGOFF(V4F_START, ECX), EDX ) MOV_L ( ESI, ECX ) - MOV_L ( REGOFF(8, EAX), ESI ) /* count */ - MOV_L ( REGOFF(12, EAX), EDI ) /* input stride */ - MOV_L ( REGOFF(4, EAX), EAX ) - MOV_L ( REGOFF(36, ESP), EBP ) /* clipmask */ - MOV_B ( REGOFF(40, ESP), BL ) /* clip flag */ + MOV_L ( REGOFF(V4F_COUNT, EAX), ESI ) + MOV_L ( REGOFF(V4F_STRIDE, EAX), EDI ) + MOV_L ( REGOFF(V4F_START, EAX), EAX ) + MOV_L ( ARG_CLIP, EBP ) + MOV_B ( ARG_FLAG, BL ) - FEMMS + MOVD ( REGIND(ECX), MM0 ) /* | m00 */ + MOVD ( REGOFF(20, ECX), MM7 ) /* | m11 */ + PSLLQ ( CONST(32), MM7 ) /* m11 | */ + POR ( MM7, MM0 ) /* m11 | m00 */ -ALIGNTEXT32 -LLBL(G3TPIM_2): + MOVQ ( REGOFF(32, ECX), MM1 ) /* m21 | m20 */ + MOVD ( REGOFF(40, ECX), MM2 ) /* | m22 */ - TEST_B ( BL, REGIND(EBP) ) /* mask [i] != clip flag ?? */ - JNZ ( LLBL(G3TPIM_3) /* skip vertex */ ) + MOVD ( REGOFF(56, ECX), MM3 ) /* | m32 */ - MOVQ ( REGIND(EAX), MM0 ) /* x1 | x0 */ - MOVD ( REGOFF(8, EAX), MM1 ) /* | x2 */ + TEST_L ( ESI, ESI ) + JZ ( LLBL( G3TPPM_4 ) ) - MOVQ ( MM0, REGIND(EDX) ) /* r1 | r0 */ - MOVD ( MM1, REGOFF(8, EDX) ) /* | r2 */ +ALIGNTEXT16 +LLBL( G3TPPM_2 ): -LLBL(G3TPIM_3): - ADD_L ( EDI, EAX ) /* next vertex */ - ADD_L ( CONST(16), EDX ) /* next r */ + TEST_B ( BL, REGIND(EBP) ) /* mask [i] != clip flag ?? */ + JNZ ( LLBL( G3TPPM_3 ) ) /* skip vertex */ - INC_L ( EBP ) /* next clipmask */ - DEC_L ( ESI ) /* decrement vertex counter */ + MOVQ ( REGIND(EAX), MM4 ) /* x1 | x0 */ + MOVD ( REGOFF(8, EAX), MM5 ) /* | x2 */ - JA ( LLBL(G3TPIM_2) /* cnt > 0 ? -> process next vertex */ ) + PFMUL ( MM0, MM4 ) /* x1*m11 | x0*m00 */ + MOVQ ( MM5, MM6 ) /* | x2 */ -LLBL(G3TPIM_4): - FEMMS + PUNPCKLDQ ( MM5, MM5 ) /* x2 | x2 */ + PFMUL ( MM1, MM5 ) /* x2*m21 | x2*m20 */ - POP_L ( EBP ) - POP_L ( EBX ) - POP_L ( EDI ) - POP_L ( ESI ) + PFADD ( MM4, MM5 ) /* x1*m11+x2*m21 | x0*m00+x2*m20 */ + MOVQ ( MM5, REGIND(EDX) ) /* write r0, r1 */ - POP_L ( ESI ) - RET + MOVQ ( MM6, MM5 ) /* | x2 */ + PFMUL ( MM2, MM5 ) /* | x2*m22 */ + PFADD ( MM3, MM5 ) /* | x2*m22+m32 */ + PFSUBR ( MM7, MM6 ) /* (LO mm7 == 0) | -x2 */ + MOVD ( MM5, REGOFF(8, EDX) ) /* write r2 */ + MOVD ( MM6, REGOFF(12, EDX) ) /* write r3 */ ALIGNTEXT16 -GLOBL GLNAME(gl_3dnow_transform_points3_2d_masked) -GLNAME( gl_3dnow_transform_points3_2d_masked ): +LLBL( G3TPPM_3 ): - PUSH_L ( ESI ) - MOV_L ( REGOFF(8, ESP), ECX ) - MOV_L ( REGOFF(12, ESP), ESI ) - MOV_L ( REGOFF(16, ESP), EAX ) - MOV_L ( CONST(3), REGOFF(16, ECX) ) - OR_B ( CONST(7), REGOFF(20, ECX) ) - MOV_L ( REGOFF(8, EAX), EDX ) - MOV_L ( EDX, REGOFF(8, ECX) ) + ADD_L ( EDI, EAX ) /* next vertex */ + ADD_L ( CONST(16), EDX ) /* next r */ -ALIGNTEXT32 + INC_L ( EBP ) /* next clipmask */ + DEC_L ( ESI ) /* decrement vertex counter */ - PUSH_L ( ESI ) - PUSH_L ( EDI ) - PUSH_L ( EBX ) - PUSH_L ( EBP ) + JNZ ( LLBL( G3TPPM_2 ) ) /* cnt > 0 ? -> process next vertex */ - MOV_L ( REGOFF(4, ECX), EDX ) - MOV_L ( ESI, ECX ) - MOV_L ( REGOFF(8, EAX), ESI ) /* count */ - MOV_L ( REGOFF(12, EAX), EDI ) /* input stride */ - MOV_L ( REGOFF(4, EAX), EAX ) - MOV_L ( REGOFF(36, ESP), EBP ) /* clipmask */ - MOV_B ( REGOFF(40, ESP), BL ) /* clip flag */ +LLBL( G3TPPM_4 ): FEMMS + POP_L ( EBP ) + POP_L ( EBX ) + POP_L ( EDI ) + POP_L ( ESI ) + RET - MOVD ( REGIND(ECX), MM0 ) /* | m00 */ - MOVD ( REGOFF(16, ECX), MM7 ) /* | m10 */ - PSLLQ ( CONST(32), MM7 ) /* m10 | */ - POR ( MM7, MM0 ) /* m10 | m00 */ - MOVD ( REGOFF(4, ECX), MM1 ) /* | m01 */ - MOVD ( REGOFF(20, ECX), MM7 ) /* | m11 */ - PSLLQ ( CONST(32), MM7 ) /* m11 | */ - POR ( MM7, MM1 ) /* m11 | m01 */ +ALIGNTEXT16 +GLOBL GLNAME( gl_3dnow_transform_points3_3d_masked ) +GLNAME( gl_3dnow_transform_points3_3d_masked ): - MOVQ ( REGOFF(48, ECX), MM2 ) /* m31 | m30 */ - CMP_L ( CONST(0), ESI ) - JE ( LLBL(G3TP2M_4) ) + PUSH_L ( ESI ) + PUSH_L ( EDI ) + PUSH_L ( EBX ) + PUSH_L ( EBP ) + MOV_L ( ARG_DEST, ECX ) + MOV_L ( ARG_MATRIX, ESI ) + MOV_L ( ARG_SOURCE, EAX ) + MOV_L ( CONST(3), REGOFF(V4F_SIZE, ECX) ) + OR_B ( CONST(VEC_SIZE_3), REGOFF(V4F_FLAGS, ECX) ) + MOV_L ( REGOFF(V4F_COUNT, EAX), EDX ) + MOV_L ( EDX, REGOFF(V4F_COUNT, ECX) ) -ALIGNTEXT32 -LLBL(G3TP2M_2): + MOV_L ( REGOFF(V4F_START, ECX), EDX ) + MOV_L ( ESI, ECX ) + MOV_L ( REGOFF(V4F_COUNT, EAX), ESI ) + MOV_L ( REGOFF(V4F_STRIDE, EAX), EDI ) + MOV_L ( REGOFF(V4F_START, EAX), EAX ) + MOV_L ( ARG_CLIP, EBP ) + MOV_B ( ARG_FLAG, BL ) - TEST_B ( BL, REGIND(EBP) ) /* mask [i] != clip flag ?? */ - JNZ ( LLBL(G3TP2M_3) /* skip vertex */ ) + MOVD ( REGIND(ECX), MM0 ) /* | m00 */ + MOVD ( REGOFF(16, ECX), MM7 ) /* | m10 */ - MOVQ ( REGIND(EAX), MM3 ) /* x1 | x0 */ - MOVQ ( MM3, MM4 ) /* x1 | x0 */ + PSLLQ ( CONST(32), MM7 ) /* m10 | */ + POR ( MM7, MM0 ) /* m10 | m00 */ - MOVD ( REGOFF(8, EAX), MM5 ) /* | x2 */ - PFMUL ( MM0, MM3 ) /* x1*m10 | x0*m00 */ + MOVD ( REGOFF(4, ECX), MM1 ) /* | m01 */ + MOVD ( REGOFF(20, ECX), MM7 ) /* | m11 */ - PFMUL ( MM1, MM4 ) /* x1*m11 | x0*m01 */ - PFACC ( MM4, MM3 ) /* x0*m00+x1*m10 | x0*m01+x1*m11 */ + PSLLQ ( CONST(32), MM7 ) /* m11 | */ + POR ( MM7, MM1 ) /* m11 | m01 */ - PFADD ( MM2, MM3 ) /* x0*...*m10+m30| x0*m01+x1*m11+m31 */ - MOVQ ( MM3, REGIND(EDX) ) /* write r0, r1 */ + MOVQ ( REGOFF(32, ECX), MM2 ) /* m21 | m20 */ + MOVQ ( REGOFF(48, ECX), MM3 ) /* m31 | m30 */ - MOVD ( MM5, REGOFF(8, EDX) ) /* write r2 (=x2) */ + TEST_L ( ESI, ESI ) + JZ ( LLBL( G3TP3M_6 ) ) -LLBL(G3TP2M_3): - ADD_L ( EDI, EAX ) /* next vertex */ - ADD_L ( CONST(16), EDX ) /* next r */ + PUSH_L ( EBP ) + PUSH_L ( EAX ) + PUSH_L ( EDX ) + PUSH_L ( ESI ) - INC_L ( EBP ) /* next clipmask */ - DEC_L ( ESI ) /* decrement vertex counter */ +ALIGNTEXT16 +LLBL( G3TP3M_2 ): - JA ( LLBL(G3TP2M_2) /* cnt > 0 ? -> process next vertex */ ) + TEST_B ( BL, REGIND(EBP) ) /* mask [i] != clip flag ?? */ + JNZ ( LLBL( G3TP3M_3 ) ) /* skip vertex */ -LLBL(G3TP2M_4): - FEMMS + MOVQ ( REGIND(EAX), MM4 ) /* x1 | x0 */ + MOVQ ( MM4, MM5 ) /* x1 | x0 */ - POP_L ( EBP ) - POP_L ( EBX ) - POP_L ( EDI ) - POP_L ( ESI ) + PFMUL ( MM0, MM4 ) /* x1*m10 | x0*m00 */ + MOVD ( REGOFF(8, EAX), MM6 ) /* | x2 */ - POP_L ( ESI ) - RET + PFMUL ( MM1, MM5 ) /* x1*m11 | x0*m01 */ + PUNPCKLDQ ( MM6, MM6 ) /* x2 | x2 */ + PFMUL ( MM2, MM6 ) /* x2*m21 | x2*m20 */ + PFACC ( MM5, MM4 ) /* x0*m01+x1*m11 | x0*m00+x1*m10 */ + PFADD ( MM3, MM6 ) /* x2*m21+m31 | x2*m20+m30 */ + PFADD ( MM4, MM6 ) /* r1 | r0 */ + MOVQ ( MM6, REGIND(EDX) ) /* write r0, r1 */ ALIGNTEXT16 -GLOBL GLNAME(gl_3dnow_transform_points3_2d_no_rot_masked) -GLNAME( gl_3dnow_transform_points3_2d_no_rot_masked ): +LLBL( G3TP3M_3 ): - PUSH_L ( ESI ) - MOV_L ( REGOFF(8, ESP), ECX ) - MOV_L ( REGOFF(12, ESP), ESI ) - MOV_L ( REGOFF(16, ESP), EAX ) - MOV_L ( CONST(3), REGOFF(16, ECX) ) - OR_B ( CONST(7), REGOFF(20, ECX) ) - MOV_L ( REGOFF(8, EAX), EDX ) - MOV_L ( EDX, REGOFF(8, ECX) ) + ADD_L ( EDI, EAX ) /* next vertex */ + ADD_L ( CONST(16), EDX ) /* next r */ -ALIGNTEXT32 + INC_L ( EBP ) /* next clipmask */ + DEC_L ( ESI ) /* decrement vertex counter */ - PUSH_L ( ESI ) - PUSH_L ( EDI ) - PUSH_L ( EBX ) - PUSH_L ( EBP ) + JNZ ( LLBL( G3TP3M_2 ) ) /* cnt > 0 ? -> process next vertex */ - MOV_L ( REGOFF(4, ECX), EDX ) - MOV_L ( ESI, ECX ) - MOV_L ( REGOFF(8, EAX), ESI ) /* count */ - MOV_L ( REGOFF(12, EAX), EDI ) /* input stride */ - MOV_L ( REGOFF(4, EAX), EAX ) - MOV_L ( REGOFF(36, ESP), EBP ) /* clipmask */ - MOV_B ( REGOFF(40, ESP), BL ) /* clip flag */ + /* and now the second stripe ... */ + MOVD ( REGOFF(8, ECX), MM0 ) /* | m02 */ - FEMMS + MOVD ( REGOFF(24, ECX), MM7 ) /* | m12 */ + PSLLQ ( CONST(32), MM7 ) /* m12 | */ - MOVD ( REGIND(ECX), MM0 ) /* | m00 */ - MOVD ( REGOFF(20, ECX), MM7 ) /* | m11 */ + POR ( MM7, MM0 ) /* m12 | m02 */ + MOVD ( REGOFF(40, ECX), MM2 ) /* | m22 */ - PSLLQ ( CONST(32), MM7 ) /* m11 | */ - POR ( MM7, MM0 ) /* m11 | m00 */ + MOVD ( REGOFF(56, ECX), MM3 ) /* | m32 */ - MOVQ ( REGOFF(48, ECX), MM1 ) /* m31 | m30 */ - CMP_L ( CONST(0), ESI ) - JE ( LLBL(G3TP2NRM_4) ) + POP_L ( ESI ) /* reset counter & pointers */ + POP_L ( EDX ) + POP_L ( EAX ) + POP_L ( EBP ) +ALIGNTEXT16 +LLBL( G3TP3M_4 ): -ALIGNTEXT32 -LLBL(G3TP2NRM_2): + TEST_B ( BL, REGIND(EBP) ) /* mask [i] != clip flag ?? */ + JNZ ( LLBL( G3TP3M_5 ) ) /* skip vertex */ - TEST_B ( BL, REGIND(EBP) ) /* mask [i] != clip flag ?? */ - JNZ ( LLBL(G3TP2NRM_3) /* skip vertex */ ) + MOVQ ( REGIND(EAX), MM4 ) /* x1 | x0 */ + MOVQ ( MM4, MM5 ) /* x1 | x0 */ - MOVQ ( REGIND(EAX), MM4 ) /* x1 | x0 */ - MOVD ( REGOFF(8, EAX), MM5 ) /* | x2 */ + PFMUL ( MM0, MM4 ) /* x1*m12 | x0*m02 */ + MOVD ( REGOFF(8, EAX), MM6 ) /* | x2 */ - PFMUL ( MM0, MM4 ) /* x1*m11 | x0*m00 */ - MOVD ( MM5, REGOFF(8, EDX) ) /* write r2 (=x2) */ + PFMUL ( MM1, MM5 ) /* x1*m13 | x0*m03 */ + PFACC ( MM5, MM4 ) /* x0*m03+x1*m13 | x0*m02+x1*m12 */ - PFADD ( MM1, MM4 ) /* x1*m11+m31 | x0*m00+m30 */ - MOVQ ( MM4, REGIND(EDX) ) /* write r0, r1 */ + PFMUL ( MM2, MM6 ) /* | x2*m22 */ + PFADD ( MM3, MM6 ) /* | x2*m22+m32 */ -LLBL(G3TP2NRM_3): - ADD_L ( EDI, EAX ) /* next vertex */ - ADD_L ( CONST(16), EDX ) /* next r */ + PFADD ( MM4, MM6 ) /* | r2 */ + MOVD ( MM6, REGOFF(8, EDX) ) /* write r2 */ - INC_L ( EBP ) /* next clipmask */ - DEC_L ( ESI ) /* decrement vertex counter */ +ALIGNTEXT16 +LLBL( G3TP3M_5 ): - JA ( LLBL(G3TP2NRM_2) /* cnt > 0 ? -> process next vertex */ ) + ADD_L ( EDI, EAX ) /* next vertex */ + ADD_L ( CONST(16), EDX ) /* next r */ -LLBL(G3TP2NRM_4): - FEMMS + INC_L ( EBP ) /* next clipmask */ + DEC_L ( ESI ) /* decrement vertex counter */ + + JNZ ( LLBL( G3TP3M_4 ) ) /* cnt > 0 ? -> process next vertex */ + +LLBL( G3TP3M_6 ): + FEMMS POP_L ( EBP ) POP_L ( EBX ) POP_L ( EDI ) POP_L ( ESI ) - - POP_L ( ESI ) RET - ALIGNTEXT16 -GLOBL GLNAME(gl_3dnow_transform_points3_3d_masked) -GLNAME( gl_3dnow_transform_points3_3d_masked ): - - PUSH_L ( ESI ) - MOV_L ( REGOFF(8, ESP), ECX ) - MOV_L ( REGOFF(12, ESP), ESI ) - MOV_L ( REGOFF(16, ESP), EAX ) - MOV_L ( CONST(3), REGOFF(16, ECX) ) - OR_B ( CONST(7), REGOFF(20, ECX) ) - MOV_L ( REGOFF(8, EAX), EDX ) - MOV_L ( EDX, REGOFF(8, ECX) ) - -ALIGNTEXT32 +GLOBL GLNAME( gl_3dnow_transform_points3_3d_no_rot_masked ) +GLNAME( gl_3dnow_transform_points3_3d_no_rot_masked ): PUSH_L ( ESI ) PUSH_L ( EDI ) PUSH_L ( EBX ) PUSH_L ( EBP ) + + MOV_L ( ARG_DEST, ECX ) + MOV_L ( ARG_MATRIX, ESI ) + MOV_L ( ARG_SOURCE, EAX ) + MOV_L ( CONST(3), REGOFF(V4F_SIZE, ECX) ) + OR_B ( CONST(VEC_SIZE_3), REGOFF(V4F_FLAGS, ECX) ) + MOV_L ( REGOFF(V4F_COUNT, EAX), EDX ) + MOV_L ( EDX, REGOFF(V4F_COUNT, ECX) ) - MOV_L ( REGOFF(4, ECX), EDX ) + MOV_L ( REGOFF(V4F_START, ECX), EDX ) MOV_L ( ESI, ECX ) - MOV_L ( REGOFF(8, EAX), ESI ) /* count */ - MOV_L ( REGOFF(12, EAX), EDI ) /* input stride */ - MOV_L ( REGOFF(4, EAX), EAX ) - MOV_L ( REGOFF(36, ESP), EBP ) /* clipmask */ - MOV_B ( REGOFF(40, ESP), BL ) /* clip flag */ + MOV_L ( REGOFF(V4F_COUNT, EAX), ESI ) + MOV_L ( REGOFF(V4F_STRIDE, EAX), EDI ) + MOV_L ( REGOFF(V4F_START, EAX), EAX ) + MOV_L ( ARG_CLIP, EBP ) + MOV_B ( ARG_FLAG, BL ) - FEMMS + MOVD ( REGIND(ECX), MM0 ) /* | m00 */ + MOVD ( REGOFF(20, ECX), MM7 ) /* | m11 */ - MOVD ( REGIND(ECX), MM0 ) /* | m00 */ - MOVD ( REGOFF(16, ECX), MM7 ) /* | m10 */ + PSLLQ ( CONST(32), MM7 ) /* m11 | */ + POR ( MM7, MM0 ) /* m11 | m00 */ - PSLLQ ( CONST(32), MM7 ) /* m10 | */ - POR ( MM7, MM0 ) /* m10 | m00 */ + MOVD ( REGOFF(40, ECX), MM2 ) /* | m22 */ + PUNPCKLDQ ( MM2, MM2 ) /* m22 | m22 */ - MOVD ( REGOFF(4, ECX), MM1 ) /* | m01 */ - MOVD ( REGOFF(20, ECX), MM7 ) /* | m11 */ + MOVQ ( REGOFF(48, ECX), MM1 ) /* m31 | m30 */ + MOVD ( REGOFF(56, ECX), MM3 ) /* | m32 */ - PSLLQ ( CONST(32), MM7 ) /* m11 | */ - POR ( MM7, MM1 ) /* m11 | m01 */ - - MOVQ ( REGOFF(32, ECX), MM2 ) /* m21 | m20 */ - MOVQ ( REGOFF(48, ECX), MM3 ) /* m31 | m30 */ - CMP_L ( CONST(0), ESI ) - JE ( LLBL(G3TP3M_6) ) + PUNPCKLDQ ( MM3, MM3 ) /* m32 | m32 */ - PUSH_L ( EBP ) - PUSH_L ( EAX ) - PUSH_L ( EDX ) - PUSH_L ( ESI ) + TEST_L ( ESI, ESI ) + JZ ( LLBL( G3TP3NRM_4 ) ) +ALIGNTEXT16 +LLBL( G3TP3NRM_2 ): -ALIGNTEXT32 -LLBL(G3TP3M_2): + TEST_B ( BL, REGIND(EBP) ) /* mask [i] != clip flag ?? */ + JNZ ( LLBL( G3TP3NRM_3 ) ) /* skip vertex */ - TEST_B ( BL, REGIND(EBP) ) /* mask [i] != clip flag ?? */ - JNZ ( LLBL(G3TP3M_3) /* skip vertex */ ) + MOVQ ( REGIND(EAX), MM4 ) /* x1 | x0 */ + MOVD ( REGOFF(8, EAX), MM5 ) /* | x2 */ - MOVQ ( REGIND(EAX), MM4 ) /* x1 | x0 */ - MOVQ ( MM4, MM5 ) /* x1 | x0 */ + PFMUL ( MM0, MM4 ) /* x1*m11 | x0*m00 */ + PFMUL ( MM2, MM5 ) /* | x2*m22 */ - PFMUL ( MM0, MM4 ) /* x1*m10 | x0*m00 */ - MOVD ( REGOFF(8, EAX), MM6 ) /* | x2 */ + PFADD ( MM1, MM4 ) /* x1*m11+m31 | x0*m00+m30 */ + PFADD ( MM3, MM5 ) /* | x2*m22+m32 */ - PFMUL ( MM1, MM5 ) /* x1*m11 | x0*m01 */ - PUNPCKLDQ ( MM6, MM6 ) /* x2 | x2 */ + MOVQ ( MM4, REGIND(EDX) ) /* write r0, r1 */ + MOVD ( MM5, REGOFF(8, EDX) ) /* write r2 */ - PFMUL ( MM2, MM6 ) /* x2*m21 | x2*m20 */ - PFACC ( MM5, MM4 ) /* x0*m01+x1*m11 | x0*m00+x1*m10 */ +LLBL( G3TP3NRM_3 ): - PFADD ( MM3, MM6 ) /* x2*m21+m31 | x2*m20+m30 */ - PFADD ( MM4, MM6 ) /* r1 | r0 */ + ADD_L ( EDI, EAX ) /* next vertex */ + ADD_L ( CONST(16), EDX ) /* next r */ - MOVQ ( MM6, REGIND(EDX) ) /* write r0, r1 */ + INC_L ( EBP ) /* next clipmask */ + DEC_L ( ESI ) /* decrement vertex counter */ -LLBL(G3TP3M_3): - ADD_L ( EDI, EAX ) /* next vertex */ - ADD_L ( CONST(16), EDX ) /* next r */ + JNZ ( LLBL( G3TP3NRM_2 ) ) /* cnt > 0 ? -> process next vertex */ - INC_L ( EBP ) /* next clipmask */ - DEC_L ( ESI ) /* decrement vertex counter */ +LLBL( G3TP3NRM_4 ): - JA ( LLBL(G3TP3M_2) /* cnt > 0 ? -> process next vertex */ ) - /* and now the second stripe ... */ - MOVD ( REGOFF(8, ECX), MM0 ) /* | m02 */ + FEMMS + POP_L ( EBP ) + POP_L ( EBX ) + POP_L ( EDI ) + POP_L ( ESI ) + RET - MOVD ( REGOFF(24, ECX), MM7 ) /* | m12 */ - PSLLQ ( CONST(32), MM7 ) /* m12 | */ - POR ( MM7, MM0 ) /* m12 | m02 */ - MOVD ( REGOFF(40, ECX), MM2 ) /* | m22 */ - MOVD ( REGOFF(56, ECX), MM3 ) /* | m32 */ - POP_L ( ESI ) /* reset counter & pointers */ - POP_L ( EDX ) - POP_L ( EAX ) +ALIGNTEXT16 +GLOBL GLNAME( gl_3dnow_transform_points3_2d_masked ) +GLNAME( gl_3dnow_transform_points3_2d_masked ): - POP_L ( EBP ) + PUSH_L ( ESI ) + PUSH_L ( EDI ) + PUSH_L ( EBX ) + PUSH_L ( EBP ) + MOV_L ( ARG_DEST, ECX ) + MOV_L ( ARG_MATRIX, ESI ) + MOV_L ( ARG_SOURCE, EAX ) + MOV_L ( CONST(3), REGOFF(V4F_SIZE, ECX) ) + OR_B ( CONST(VEC_SIZE_3), REGOFF(V4F_FLAGS, ECX) ) + MOV_L ( REGOFF(V4F_COUNT, EAX), EDX ) + MOV_L ( EDX, REGOFF(V4F_COUNT, ECX) ) -ALIGNTEXT32 -LLBL(G3TP3M_4): + MOV_L ( REGOFF(V4F_START, ECX), EDX ) + MOV_L ( ESI, ECX ) + MOV_L ( REGOFF(V4F_COUNT, EAX), ESI ) + MOV_L ( REGOFF(V4F_STRIDE, EAX), EDI ) + MOV_L ( REGOFF(V4F_START, EAX), EAX ) + MOV_L ( ARG_CLIP, EBP ) + MOV_B ( ARG_FLAG, BL ) - TEST_B ( BL, REGIND(EBP) ) /* mask [i] != clip flag ?? */ - JNZ ( LLBL(G3TP3M_5) /* skip vertex */ ) + MOVD ( REGIND(ECX), MM0 ) /* | m00 */ + MOVD ( REGOFF(16, ECX), MM7 ) /* | m10 */ - MOVQ ( REGIND(EAX), MM4 ) /* x1 | x0 */ - MOVQ ( MM4, MM5 ) /* x1 | x0 */ + PSLLQ ( CONST(32), MM7 ) /* m10 | */ + POR ( MM7, MM0 ) /* m10 | m00 */ - PFMUL ( MM0, MM4 ) /* x1*m12 | x0*m02 */ - MOVD ( REGOFF(8, EAX), MM6 ) /* | x2 */ + MOVD ( REGOFF(4, ECX), MM1 ) /* | m01 */ + MOVD ( REGOFF(20, ECX), MM7 ) /* | m11 */ - PFMUL ( MM1, MM5 ) /* x1*m13 | x0*m03 */ - PFACC ( MM5, MM4 ) /* x0*m03+x1*m13 | x0*m02+x1*m12 */ + PSLLQ ( CONST(32), MM7 ) /* m11 | */ + POR ( MM7, MM1 ) /* m11 | m01 */ - PFMUL ( MM2, MM6 ) /* | x2*m22 */ - PFADD ( MM3, MM6 ) /* | x2*m22+m32 */ + MOVQ ( REGOFF(48, ECX), MM2 ) /* m31 | m30 */ - PFADD ( MM4, MM6 ) /* | r2 */ - MOVD ( MM6, REGOFF(8, EDX) ) /* write r2 */ + TEST_L ( ESI, ESI ) + JZ ( LLBL( G3TP2M_4 ) ) -LLBL(G3TP3M_5): - ADD_L ( EDI, EAX ) /* next vertex */ - ADD_L ( CONST(16), EDX ) /* next r */ +ALIGNTEXT16 +LLBL( G3TP2M_2 ): - INC_L ( EBP ) /* next clipmask */ - DEC_L ( ESI ) /* decrement vertex counter */ + TEST_B ( BL, REGIND(EBP) ) /* mask [i] != clip flag ?? */ + JNZ ( LLBL( G3TP2M_3 ) ) /* skip vertex */ - JA ( LLBL(G3TP3M_4) /* cnt > 0 ? -> process next vertex */ ) + MOVQ ( REGIND(EAX), MM3 ) /* x1 | x0 */ + MOVQ ( MM3, MM4 ) /* x1 | x0 */ -LLBL(G3TP3M_6): - FEMMS + MOVD ( REGOFF(8, EAX), MM5 ) /* | x2 */ + PFMUL ( MM0, MM3 ) /* x1*m10 | x0*m00 */ + + PFMUL ( MM1, MM4 ) /* x1*m11 | x0*m01 */ + PFACC ( MM4, MM3 ) /* x0*m00+x1*m10 | x0*m01+x1*m11 */ + + PFADD ( MM2, MM3 ) /* x0*...*m10+m30 | x0*...*m11+m31 */ + MOVQ ( MM3, REGIND(EDX) ) /* write r0, r1 */ + MOVD ( MM5, REGOFF(8, EDX) ) /* write r2 (=x2) */ + +ALIGNTEXT16 +LLBL( G3TP2M_3 ): + + ADD_L ( EDI, EAX ) /* next vertex */ + ADD_L ( CONST(16), EDX ) /* next r */ + + INC_L ( EBP ) /* next clipmask */ + DEC_L ( ESI ) /* decrement vertex counter */ + + JNZ ( LLBL( G3TP2M_2 ) ) /* cnt > 0 ? -> process next vertex */ + +LLBL( G3TP2M_4 ): + + FEMMS POP_L ( EBP ) POP_L ( EBX ) POP_L ( EDI ) POP_L ( ESI ) - - POP_L ( ESI ) RET - - ALIGNTEXT16 -GLOBL GLNAME(gl_3dnow_transform_points3_3d_no_rot_masked) -GLNAME( gl_3dnow_transform_points3_3d_no_rot_masked ): - - PUSH_L ( ESI ) - MOV_L ( REGOFF(8, ESP), ECX ) - MOV_L ( REGOFF(12, ESP), ESI ) - MOV_L ( REGOFF(16, ESP), EAX ) - MOV_L ( CONST(3), REGOFF(16, ECX) ) - OR_B ( CONST(7), REGOFF(20, ECX) ) - MOV_L ( REGOFF(8, EAX), EDX ) - MOV_L ( EDX, REGOFF(8, ECX) ) - -ALIGNTEXT32 +GLOBL GLNAME( gl_3dnow_transform_points3_2d_no_rot_masked ) +GLNAME( gl_3dnow_transform_points3_2d_no_rot_masked ): PUSH_L ( ESI ) PUSH_L ( EDI ) PUSH_L ( EBX ) PUSH_L ( EBP ) - MOV_L ( REGOFF(4, ECX), EDX ) - MOV_L ( ESI, ECX ) - MOV_L ( REGOFF(8, EAX), ESI ) /* count */ - MOV_L ( REGOFF(12, EAX), EDI ) /* input stride */ - MOV_L ( REGOFF(4, EAX), EAX ) - MOV_L ( REGOFF(36, ESP), EBP ) /* clipmask */ - MOV_B ( REGOFF(40, ESP), BL ) /* clip flag */ + MOV_L ( ARG_DEST, ECX ) + MOV_L ( ARG_MATRIX, ESI ) + MOV_L ( ARG_SOURCE, EAX ) + MOV_L ( CONST(3), REGOFF(V4F_SIZE, ECX) ) + OR_B ( CONST(VEC_SIZE_3), REGOFF(V4F_FLAGS, ECX) ) + MOV_L ( REGOFF(V4F_COUNT, EAX), EDX ) + MOV_L ( EDX, REGOFF(V4F_COUNT, ECX) ) - FEMMS - - MOVD ( REGIND(ECX), MM0 ) /* | m00 */ - MOVD ( REGOFF(20, ECX), MM7 ) /* | m11 */ - - PSLLQ ( CONST(32), MM7 ) /* m11 | */ - POR ( MM7, MM0 ) /* m11 | m00 */ + MOV_L ( REGOFF(V4F_START, ECX), EDX ) + MOV_L ( ESI, ECX ) + MOV_L ( REGOFF(V4F_COUNT, EAX), ESI ) + MOV_L ( REGOFF(V4F_STRIDE, EAX), EDI ) + MOV_L ( REGOFF(V4F_START, EAX), EAX ) + MOV_L ( ARG_CLIP, EBP ) + MOV_B ( ARG_FLAG, BL ) + + MOVD ( REGIND(ECX), MM0 ) /* | m00 */ + MOVD ( REGOFF(20, ECX), MM7 ) /* | m11 */ - MOVD ( REGOFF(40, ECX), MM2 ) /* | m22 */ - PUNPCKLDQ ( MM2, MM2 ) /* m22 | m22 */ + PSLLQ ( CONST(32), MM7 ) /* m11 | */ + POR ( MM7, MM0 ) /* m11 | m00 */ - MOVQ ( REGOFF(48, ECX), MM1 ) /* m31 | m30 */ - MOVD ( REGOFF(56, ECX), MM3 ) /* | m32 */ + MOVQ ( REGOFF(48, ECX), MM1 ) /* m31 | m30 */ - PUNPCKLDQ ( MM3, MM3 ) /* m32 | m32 */ - CMP_L ( CONST(0), ESI ) - JE ( LLBL(G3TP3NRM_4) ) + TEST_L ( ESI, ESI ) + JZ ( LLBL( G3TP2NRM_4 ) ) +ALIGNTEXT16 +LLBL( G3TP2NRM_2 ): -ALIGNTEXT32 -LLBL(G3TP3NRM_2): + TEST_B ( BL, REGIND(EBP) ) /* mask [i] != clip flag ?? */ + JNZ ( LLBL( G3TP2NRM_3 ) ) /* skip vertex */ - TEST_B ( BL, REGIND(EBP) ) /* mask [i] != clip flag ?? */ - JNZ ( LLBL(G3TP3NRM_3) /* skip vertex */ ) + MOVQ ( REGIND(EAX), MM4 ) /* x1 | x0 */ + MOVD ( REGOFF(8, EAX), MM5 ) /* | x2 */ - MOVQ ( REGIND(EAX), MM4 ) /* x1 | x0 */ - MOVD ( REGOFF(8, EAX), MM5 ) /* | x2 */ + PFMUL ( MM0, MM4 ) /* x1*m11 | x0*m00 */ + MOVD ( MM5, REGOFF(8, EDX) ) /* write r2 (=x2) */ - PFMUL ( MM0, MM4 ) /* x1*m11 | x0*m00 */ - PFMUL ( MM2, MM5 ) /* | x2*m22 */ + PFADD ( MM1, MM4 ) /* x1*m11+m31 | x0*m00+m30 */ + MOVQ ( MM4, REGIND(EDX) ) /* write r0, r1 */ - PFADD ( MM1, MM4 ) /* x1*m11+m31 | x0*m00+m30 */ - PFADD ( MM3, MM5 ) /* | x2*m22+m32 */ +ALIGNTEXT16 +LLBL( G3TP2NRM_3 ): - MOVQ ( MM4, REGIND(EDX) ) /* write r0, r1 */ - MOVD ( MM5, REGOFF(8, EDX) ) /* write r2 */ + ADD_L ( EDI, EAX ) /* next vertex */ + ADD_L ( CONST(16), EDX ) /* next r */ -LLBL(G3TP3NRM_3): - ADD_L ( EDI, EAX ) /* next vertex */ - ADD_L ( CONST(16), EDX ) /* next r */ + INC_L ( EBP ) /* next clipmask */ + DEC_L ( ESI ) /* decrement vertex counter */ - INC_L ( EBP ) /* next clipmask */ - DEC_L ( ESI ) /* decrement vertex counter */ + JNZ ( LLBL( G3TP2NRM_2 ) ) /* cnt > 0 ? -> process next vertex */ - JA ( LLBL(G3TP3NRM_2) /* cnt > 0 ? -> process next vertex */ ) +LLBL( G3TP2NRM_4 ): -LLBL(G3TP3NRM_4): FEMMS - POP_L ( EBP ) POP_L ( EBX ) POP_L ( EDI ) POP_L ( ESI ) - - POP_L ( ESI ) RET ALIGNTEXT16 -GLOBL GLNAME(gl_3dnow_transform_points3_perspective_masked) -GLNAME( gl_3dnow_transform_points3_perspective_masked ): - - PUSH_L ( ESI ) - MOV_L ( REGOFF(8, ESP), ECX ) - MOV_L ( REGOFF(12, ESP), ESI ) - MOV_L ( REGOFF(16, ESP), EAX ) - MOV_L ( CONST(4), REGOFF(16, ECX) ) - OR_B ( CONST(15), REGOFF(20, ECX) ) - MOV_L ( REGOFF(8, EAX), EDX ) - MOV_L ( EDX, REGOFF(8, ECX) ) - -ALIGNTEXT32 +GLOBL GLNAME( gl_3dnow_transform_points3_identity_masked ) +GLNAME( gl_3dnow_transform_points3_identity_masked ): PUSH_L ( ESI ) PUSH_L ( EDI ) PUSH_L ( EBX ) PUSH_L ( EBP ) - - MOV_L ( REGOFF(4, ECX), EDX ) - MOV_L ( ESI, ECX ) - MOV_L ( REGOFF(8, EAX), ESI ) /* count */ - MOV_L ( REGOFF(12, EAX), EDI ) /* input stride */ - MOV_L ( REGOFF(4, EAX), EAX ) - MOV_L ( REGOFF(36, ESP), EBP ) /* clipmask */ - MOV_B ( REGOFF(40, ESP), BL ) /* clip flag */ - - FEMMS - - MOVD ( REGIND(ECX), MM0 ) /* | m00 */ - MOVD ( REGOFF(20, ECX), MM7 ) /* | m11 */ - - PSLLQ ( CONST(32), MM7 ) /* m11 | */ - POR ( MM7, MM0 ) /* m11 | m00 */ - - MOVQ ( REGOFF(32, ECX), MM1 ) /* m21 | m20 */ - MOVD ( REGOFF(40, ECX), MM2 ) /* | m22 */ - MOVD ( REGOFF(56, ECX), MM3 ) /* | m32 */ - CMP_L ( CONST(0), ESI ) - JE ( LLBL(G3TPPM_4) ) + MOV_L ( ARG_DEST, ECX ) + MOV_L ( ARG_MATRIX, ESI ) + MOV_L ( ARG_SOURCE, EAX ) + MOV_L ( CONST(3), REGOFF(V4F_SIZE, ECX) ) + OR_B ( CONST(VEC_SIZE_3), REGOFF(V4F_FLAGS, ECX) ) + MOV_L ( REGOFF(V4F_COUNT, EAX), EDX ) + MOV_L ( EDX, REGOFF(V4F_COUNT, ECX) ) - -ALIGNTEXT32 -LLBL(G3TPPM_2): - - TEST_B ( BL, REGIND(EBP) ) /* mask [i] != clip flag ?? */ - JNZ ( LLBL(G3TPPM_3) /* skip vertex */ ) - - MOVQ ( REGIND(EAX), MM4 ) /* x1 | x0 */ - MOVD ( REGOFF(8, EAX), MM5 ) /* | x2 */ + MOV_L ( REGOFF(V4F_START, ECX), EDX ) + MOV_L ( ESI, ECX ) + MOV_L ( REGOFF(V4F_COUNT, EAX), ESI ) + MOV_L ( REGOFF(V4F_STRIDE, EAX), EDI ) + MOV_L ( REGOFF(V4F_START, EAX), EAX ) + MOV_L ( ARG_CLIP, EBP ) + MOV_B ( ARG_FLAG, BL ) - PFMUL ( MM0, MM4 ) /* x1*m11 | x0*m00 */ - MOVQ ( MM5, MM6 ) /* | x2 */ +ALIGNTEXT16 +LLBL( G3TPIM_2 ): - PUNPCKLDQ ( MM5, MM5 ) /* x2 | x2 */ - PFMUL ( MM1, MM5 ) /* x2*m21 | x2*m20 */ + TEST_B ( BL, REGIND(EBP) ) /* mask [i] != clip flag ?? */ + JNZ ( LLBL( G3TPIM_3 ) ) /* skip vertex */ - PFADD ( MM4, MM5 ) /* x1*m11+x2*m21 | x0*m00+x2*m20 */ - MOVQ ( MM5, REGIND(EDX) ) /* write r0, r1 */ + MOVQ ( REGIND(EAX), MM0 ) /* x1 | x0 */ + MOVD ( REGOFF(8, EAX), MM1 ) /* | x2 */ - MOVQ ( MM6, MM5 ) /* | x2 */ - PFMUL ( MM2, MM5 ) /* | x2*m22 */ + MOVQ ( MM0, REGIND(EDX) ) /* r1 | r0 */ + MOVD ( MM1, REGOFF(8, EDX) ) /* | r2 */ - PFADD ( MM3, MM5 ) /* | x2*m22+m32 */ - PFSUBR ( MM7, MM6 ) /* (LO mm7 == 0) | -x2 */ +LLBL( G3TPIM_3 ): - MOVD ( MM5, REGOFF(8, EDX) ) /* write r2 */ - MOVD ( MM6, REGOFF(12, EDX) ) /* write r3 */ + ADD_L ( EDI, EAX ) /* next vertex */ + ADD_L ( CONST(16), EDX ) /* next r */ -LLBL(G3TPPM_3): - ADD_L ( EDI, EAX ) /* next vertex */ - ADD_L ( CONST(16), EDX ) /* next r */ + INC_L ( EBP ) /* next clipmask */ + DEC_L ( ESI ) /* decrement vertex counter */ - INC_L ( EBP ) /* next clipmask */ - DEC_L ( ESI ) /* decrement vertex counter */ + JNZ ( LLBL( G3TPIM_2 ) ) /* cnt > 0 ? -> process next vertex */ - JA ( LLBL(G3TPPM_2) /* cnt > 0 ? -> process next vertex */ ) +LLBL( G3TPIM_4 ): -LLBL(G3TPPM_4): FEMMS - POP_L ( EBP ) POP_L ( EBX ) POP_L ( EDI ) POP_L ( ESI ) - - POP_L ( ESI ) RET - - - - - - - Index: xc/extras/Mesa/src/X86/3dnow_xform_masked4.S diff -u xc/extras/Mesa/src/X86/3dnow_xform_masked4.S:1.2 xc/extras/Mesa/src/X86/3dnow_xform_masked4.S:1.4 --- xc/extras/Mesa/src/X86/3dnow_xform_masked4.S:1.2 Fri Jun 16 20:02:41 2000 +++ xc/extras/Mesa/src/X86/3dnow_xform_masked4.S Mon Nov 13 18:31:07 2000 @@ -1,63 +1,87 @@ + +/* + * Mesa 3-D graphics library + * Version: 3.4 + * + * Copyright (C) 1999-2000 Brian Paul All Rights Reserved. + * + * 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 + * BRIAN PAUL 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 "assyntax.h" +#include "xform_args.h" - SEG_TEXT + SEG_TEXT -ALIGNTEXT16 -GLOBL GLNAME(gl_3dnow_transform_points4_general_masked) -GLNAME( gl_3dnow_transform_points4_general_masked ): +#define FRAME_OFFSET 16 - PUSH_L ( ESI ) - MOV_L ( REGOFF(8, ESP), ECX ) - MOV_L ( REGOFF(12, ESP), ESI ) - MOV_L ( REGOFF(16, ESP), EAX ) - MOV_L ( CONST(4), REGOFF(16, ECX) ) - OR_B ( CONST(15), REGOFF(20, ECX) ) - MOV_L ( REGOFF(8, EAX), EDX ) - MOV_L ( EDX, REGOFF(8, ECX) ) -ALIGNTEXT32 +ALIGNTEXT16 +GLOBL GLNAME( gl_3dnow_transform_points4_general_masked ) +GLNAME( gl_3dnow_transform_points4_general_masked ): PUSH_L ( ESI ) PUSH_L ( EDI ) PUSH_L ( EBX ) PUSH_L ( EBP ) - MOV_L ( REGOFF(4, ECX), EDX ) - MOV_L ( ESI, ECX ) - MOV_L ( REGOFF(8, EAX), ESI ) /* count */ - MOV_L ( REGOFF(12, EAX), EDI ) /* input stride */ - MOV_L ( REGOFF(4, EAX), EAX ) - MOV_L ( REGOFF(36, ESP), EBP ) /* clipmask */ - MOV_B ( REGOFF(40, ESP), BL ) /* clip flag */ + MOV_L ( ARG_DEST, ECX ) + MOV_L ( ARG_MATRIX, ESI ) + MOV_L ( ARG_SOURCE, EAX ) + MOV_L ( CONST(4), REGOFF(V4F_SIZE, ECX) ) + OR_B ( CONST(VEC_SIZE_4), REGOFF(V4F_FLAGS, ECX) ) + MOV_L ( REGOFF(V4F_COUNT, EAX), EDX ) + MOV_L ( EDX, REGOFF(V4F_COUNT, ECX) ) - FEMMS + MOV_L ( REGOFF(V4F_START, ECX), EDX ) + MOV_L ( ESI, ECX ) + MOV_L ( REGOFF(V4F_COUNT, EAX), ESI ) + MOV_L ( REGOFF(V4F_STRIDE, EAX), EDI ) + MOV_L ( REGOFF(V4F_START, EAX), EAX ) + MOV_L ( ARG_CLIP, EBP ) + MOV_B ( ARG_FLAG, BL ) - MOVD ( REGIND(ECX), MM0 ) /* | m00 */ - MOVD ( REGOFF(16, ECX), MM7 ) /* | m10 */ + MOVD ( REGIND(ECX), MM0 ) /* | m00 */ + MOVD ( REGOFF(16, ECX), MM7 ) /* | m10 */ - PSLLQ ( CONST(32), MM7 ) /* m10 | */ - POR ( MM7, MM0 ) /* m10 | m00 */ + PSLLQ ( CONST(32), MM7 ) /* m10 | */ + POR ( MM7, MM0 ) /* m10 | m00 */ - MOVD ( REGOFF(4, ECX), MM1 ) /* | m01 */ - MOVD ( REGOFF(20, ECX), MM7 ) /* | m11 */ + MOVD ( REGOFF(4, ECX), MM1 ) /* | m01 */ + MOVD ( REGOFF(20, ECX), MM7 ) /* | m11 */ - PSLLQ ( CONST(32), MM7 ) /* m11 | */ - POR ( MM7, MM1 ) /* m11 | m01 */ + PSLLQ ( CONST(32), MM7 ) /* m11 | */ + POR ( MM7, MM1 ) /* m11 | m01 */ - MOVD ( REGOFF(32, ECX), MM2 ) /* | m20 */ - MOVD ( REGOFF(48, ECX), MM7 ) /* | m30 */ + MOVD ( REGOFF(32, ECX), MM2 ) /* | m20 */ + MOVD ( REGOFF(48, ECX), MM7 ) /* | m30 */ - PSLLQ ( CONST(32), MM7 ) /* m30 | */ - POR ( MM7, MM2 ) /* m30 | m20 */ + PSLLQ ( CONST(32), MM7 ) /* m30 | */ + POR ( MM7, MM2 ) /* m30 | m20 */ - MOVD ( REGOFF(36, ECX), MM3 ) /* | m21 */ - MOVD ( REGOFF(52, ECX), MM7 ) /* | m31 */ + MOVD ( REGOFF(36, ECX), MM3 ) /* | m21 */ + MOVD ( REGOFF(52, ECX), MM7 ) /* | m31 */ - PSLLQ ( CONST(32), MM7 ) /* m31 | */ - POR ( MM7, MM3 ) /* m31 | m21 */ + PSLLQ ( CONST(32), MM7 ) /* m31 | */ + POR ( MM7, MM3 ) /* m31 | m21 */ - CMP_L ( CONST(0), ESI ) - JE ( LLBL(G3TPGM_6) ) + TEST_L ( ESI, ESI ) + JZ ( LLBL( G3TPGM_6 ) ) PUSH_L ( EBP ) PUSH_L ( EAX ) @@ -65,697 +89,664 @@ PUSH_L ( ESI ) ALIGNTEXT32 +LLBL( G3TPGM_2 ): -LLBL(G3TPGM_2): - TEST_B ( BL, REGIND(EBP) ) /* mask [i] != clip flag ?? */ - JNZ ( LLBL(G3TPGM_3) /* skip vertex */ ) + TEST_B ( BL, REGIND(EBP) ) /* mask [i] != clip flag ?? */ + JNZ ( LLBL( G3TPGM_3 ) ) /* skip vertex */ - MOVQ ( REGIND(EAX), MM4 ) /* x1 | x0 */ - MOVQ ( MM4, MM5 ) /* x1 | x0 */ + MOVQ ( REGIND(EAX), MM4 ) /* x1 | x0 */ + MOVQ ( MM4, MM5 ) /* x1 | x0 */ - MOVQ ( REGOFF(8, EAX), MM6 ) /* x3 | x2 */ - PFMUL ( MM0, MM4 ) /* x1*m10 | x0*m00 */ + MOVQ ( REGOFF(8, EAX), MM6 ) /* x3 | x2 */ + PFMUL ( MM0, MM4 ) /* x1*m10 | x0*m00 */ - MOVQ ( MM6, MM7 ) /* x3 | x2 */ - PFMUL ( MM1, MM5 ) /* x1*m11 | x0*m01 */ + MOVQ ( MM6, MM7 ) /* x3 | x2 */ + PFMUL ( MM1, MM5 ) /* x1*m11 | x0*m01 */ - PFMUL ( MM2, MM6 ) /* x3*m30 | x2*m20 */ - PFACC ( MM5, MM4 ) /* x0*m01+x1*m11 | x0*m00+x1*m10 */ + PFMUL ( MM2, MM6 ) /* x3*m30 | x2*m20 */ + PFACC ( MM5, MM4 ) /* x0*m01+x1*m11 | x0*m00+x1*m10 */ - PFMUL ( MM3, MM7 ) /* x3*m31 | x2*m21 */ - PFACC ( MM7, MM6 ) /* x2*m21+x3*m31 | x2*m20+x3*m30 */ + PFMUL ( MM3, MM7 ) /* x3*m31 | x2*m21 */ + PFACC ( MM7, MM6 ) /* x2*m21+x3*m31 | x2*m20+x3*m30 */ - PFADD ( MM4, MM6 ) /* r1 | r0 */ - MOVQ ( MM6, REGIND(EDX) ) /* write r0, r1 */ + PFADD ( MM4, MM6 ) /* r1 | r0 */ + MOVQ ( MM6, REGIND(EDX) ) /* write r0, r1 */ -LLBL(G3TPGM_3): - ADD_L ( EDI, EAX ) /* next vertex */ - ADD_L ( CONST(16), EDX ) /* next r */ +LLBL( G3TPGM_3 ): - INC_L ( EBP ) /* next clipmask */ - DEC_L ( ESI ) /* decrement vertex counter */ + ADD_L ( EDI, EAX ) /* next vertex */ + ADD_L ( CONST(16), EDX ) /* next r */ - JA ( LLBL(G3TPGM_2) /* cnt > 0 ? -> process next vertex */ ) - /* and now the second stripe ... */ - MOVD ( REGOFF(8, ECX), MM0 ) /* | m02 */ - MOVD ( REGOFF(24, ECX), MM7 ) /* | m12 */ + INC_L ( EBP ) /* next clipmask */ + DEC_L ( ESI ) /* decrement vertex counter */ - PSLLQ ( CONST(32), MM7 ) /* m12 | */ - POR ( MM7, MM0 ) /* m12 | m02 */ + JNZ ( LLBL( G3TPGM_2 ) ) /* cnt > 0 ? -> process next vertex */ - MOVD ( REGOFF(12, ECX), MM1 ) /* | m03 */ - MOVD ( REGOFF(28, ECX), MM7 ) /* | m13 */ + /* and now the second stripe ... */ + MOVD ( REGOFF(8, ECX), MM0 ) /* | m02 */ + MOVD ( REGOFF(24, ECX), MM7 ) /* | m12 */ - PSLLQ ( CONST(32), MM7 ) /* m13 | */ - POR ( MM7, MM1 ) /* m13 | m03 */ + PSLLQ ( CONST(32), MM7 ) /* m12 | */ + POR ( MM7, MM0 ) /* m12 | m02 */ - MOVD ( REGOFF(40, ECX), MM2 ) /* | m22 */ - MOVD ( REGOFF(56, ECX), MM7 ) /* | m32 */ + MOVD ( REGOFF(12, ECX), MM1 ) /* | m03 */ + MOVD ( REGOFF(28, ECX), MM7 ) /* | m13 */ - PSLLQ ( CONST(32), MM7 ) /* m32 | */ - POR ( MM7, MM2 ) /* m32 | m22 */ + PSLLQ ( CONST(32), MM7 ) /* m13 | */ + POR ( MM7, MM1 ) /* m13 | m03 */ - MOVD ( REGOFF(44, ECX), MM3 ) /* | m23 */ - MOVD ( REGOFF(60, ECX), MM7 ) /* | m33 */ + MOVD ( REGOFF(40, ECX), MM2 ) /* | m22 */ + MOVD ( REGOFF(56, ECX), MM7 ) /* | m32 */ - PSLLQ ( CONST(32), MM7 ) /* m33 | */ - POR ( MM7, MM3 ) /* m33 | m23 */ + PSLLQ ( CONST(32), MM7 ) /* m32 | */ + POR ( MM7, MM2 ) /* m32 | m22 */ - POP_L ( ESI ) /* reset counter & pointers */ + MOVD ( REGOFF(44, ECX), MM3 ) /* | m23 */ + MOVD ( REGOFF(60, ECX), MM7 ) /* | m33 */ + + PSLLQ ( CONST(32), MM7 ) /* m33 | */ + POR ( MM7, MM3 ) /* m33 | m23 */ + + POP_L ( ESI ) /* reset counter & pointers */ POP_L ( EDX ) POP_L ( EAX ) POP_L ( EBP ) ALIGNTEXT32 +LLBL( G3TPGM_4 ): -LLBL(G3TPGM_4): - TEST_B ( BL, REGIND(EBP) ) /* mask [i] != clip flag ?? */ - JNZ ( LLBL(G3TPGM_5) /* skip vertex */ ) + TEST_B ( BL, REGIND(EBP) ) /* mask [i] != clip flag ?? */ + JNZ ( LLBL( G3TPGM_5 ) ) /* skip vertex */ - MOVQ ( REGIND(EAX), MM4 ) /* x1 | x0 */ - MOVQ ( MM4, MM5 ) /* x1 | x0 */ + MOVQ ( REGIND(EAX), MM4 ) /* x1 | x0 */ + MOVQ ( MM4, MM5 ) /* x1 | x0 */ - MOVQ ( REGOFF(8, EAX), MM6 ) /* x3 | x2 */ - PFMUL ( MM0, MM4 ) /* x1*m12 | x0*m02 */ + MOVQ ( REGOFF(8, EAX), MM6 ) /* x3 | x2 */ + PFMUL ( MM0, MM4 ) /* x1*m12 | x0*m02 */ - MOVQ ( MM6, MM7 ) /* x3 | x2 */ - PFMUL ( MM1, MM5 ) /* x1*m13 | x0*m03 */ + MOVQ ( MM6, MM7 ) /* x3 | x2 */ + PFMUL ( MM1, MM5 ) /* x1*m13 | x0*m03 */ - PFMUL ( MM2, MM6 ) /* x3*m32 | x2*m22 */ - PFACC ( MM5, MM4 ) /* x0*m03+x1*m13 | x0*m02+x1*m12 */ + PFMUL ( MM2, MM6 ) /* x3*m32 | x2*m22 */ + PFACC ( MM5, MM4 ) /* x0*m03+x1*m13 | x0*m02+x1*m12 */ - PFMUL ( MM3, MM7 ) /* x3*m33 | x2*m23 */ - PFACC ( MM7, MM6 ) /* x2*m23+x3*m33 | x2*m22+x3*m32 */ + PFMUL ( MM3, MM7 ) /* x3*m33 | x2*m23 */ + PFACC ( MM7, MM6 ) /* x2*m23+x3*m33 | x2*m22+x3*m32 */ - PFADD ( MM4, MM6 ) /* r3 | r2 */ - MOVQ ( MM6, REGOFF(8, EDX) ) /* write r2, r3 */ + PFADD ( MM4, MM6 ) /* r3 | r2 */ + MOVQ ( MM6, REGOFF(8, EDX) ) /* write r2, r3 */ -LLBL(G3TPGM_5): - ADD_L ( EDI, EAX ) /* next vertex */ - ADD_L ( CONST(16), EDX ) /* next r */ +LLBL( G3TPGM_5 ): - INC_L ( EBP ) /* next clipmask */ - DEC_L ( ESI ) /* decrement vertex counter */ + ADD_L ( EDI, EAX ) /* next vertex */ + ADD_L ( CONST(16), EDX ) /* next r */ - JA ( LLBL(G3TPGM_4) /* cnt > 0 ? -> process next vertex */ ) + INC_L ( EBP ) /* next clipmask */ + DEC_L ( ESI ) /* decrement vertex counter */ -LLBL(G3TPGM_6): - FEMMS + JNZ ( LLBL( G3TPGM_4 ) ) /* cnt > 0 ? -> process next vertex */ +LLBL( G3TPGM_6 ): + + FEMMS POP_L ( EBP ) POP_L ( EBX ) POP_L ( EDI ) POP_L ( ESI ) - - POP_L ( ESI ) RET - ALIGNTEXT16 -GLOBL GLNAME(gl_3dnow_transform_points4_identity_masked) -GLNAME( gl_3dnow_transform_points4_identity_masked ): - - PUSH_L ( ESI ) - MOV_L ( REGOFF(8, ESP), ECX ) - MOV_L ( REGOFF(12, ESP), ESI ) - MOV_L ( REGOFF(16, ESP), EAX ) - MOV_L ( CONST(4), REGOFF(16, ECX) ) - OR_B ( CONST(15), REGOFF(20, ECX) ) - MOV_L ( REGOFF(8, EAX), EDX ) - MOV_L ( EDX, REGOFF(8, ECX) ) - -ALIGNTEXT32 +GLOBL GLNAME( gl_3dnow_transform_points4_perspective_masked ) +GLNAME( gl_3dnow_transform_points4_perspective_masked ): PUSH_L ( ESI ) PUSH_L ( EDI ) PUSH_L ( EBX ) PUSH_L ( EBP ) - MOV_L ( REGOFF(4, ECX), EDX ) + MOV_L ( ARG_DEST, ECX ) + MOV_L ( ARG_MATRIX, ESI ) + MOV_L ( ARG_SOURCE, EAX ) + MOV_L ( CONST(4), REGOFF(V4F_SIZE, ECX) ) + OR_B ( CONST(VEC_SIZE_4), REGOFF(V4F_FLAGS, ECX) ) + MOV_L ( REGOFF(V4F_COUNT, EAX), EDX ) + MOV_L ( EDX, REGOFF(V4F_COUNT, ECX) ) + + MOV_L ( REGOFF(V4F_START, ECX), EDX ) MOV_L ( ESI, ECX ) - MOV_L ( REGOFF(8, EAX), ESI ) /* count */ - MOV_L ( REGOFF(12, EAX), EDI ) /* input stride */ - MOV_L ( REGOFF(4, EAX), EAX ) - MOV_L ( REGOFF(36, ESP), EBP ) /* clipmask */ - MOV_B ( REGOFF(40, ESP), BL ) /* clip flag */ + MOV_L ( REGOFF(V4F_COUNT, EAX), ESI ) + MOV_L ( REGOFF(V4F_STRIDE, EAX), EDI ) + MOV_L ( REGOFF(V4F_START, EAX), EAX ) + MOV_L ( ARG_CLIP, EBP ) + MOV_B ( ARG_FLAG, BL ) - FEMMS + MOVD ( REGIND(ECX), MM0 ) /* | m00 */ + MOVD ( REGOFF(20, ECX), MM7 ) /* | m11 */ + + PSLLQ ( CONST(32), MM7 ) /* m11 | */ + POR ( MM7, MM0 ) /* m11 | m00 */ + MOVD ( REGOFF(40, ECX), MM1 ) /* | m22 */ + MOVD ( REGOFF(56, ECX), MM7 ) /* | m32 */ + + PSLLQ ( CONST(32), MM7 ) /* m32 | */ + POR ( MM7, MM1 ) /* m32 | m22 */ + + MOVQ ( REGOFF(32, ECX), MM2 ) /* m21 | m20 */ + PUNPCKLDQ ( MM7, MM7 ) /* 0 | 0 */ + + TEST_L ( ESI, ESI ) + JZ ( LLBL( G3TPPM_4 ) ) + ALIGNTEXT32 +LLBL( G3TPPM_2 ): -LLBL(G3TPIM_2): - TEST_B ( BL, REGIND(EBP) ) /* mask [i] != clip flag ?? */ - JNZ ( LLBL(G3TPIM_3) /* skip vertex */ ) + TEST_B ( BL, REGIND(EBP) ) /* mask [i] != clip flag ?? */ + JNZ ( LLBL( G3TPPM_3 ) ) /* skip vertex */ - MOVQ ( REGIND(EAX), MM0 ) /* x1 | x0 */ - MOVQ ( MM0, REGIND(EDX) ) /* r1 | r0 */ + MOVQ ( REGIND(EAX), MM4 ) /* x1 | x0 */ + MOVQ ( REGOFF(8, EAX), MM5 ) /* x3 | x2 */ - MOVQ ( REGOFF(8, EAX), MM1 ) /* x3 | x2 */ - MOVQ ( MM1, REGOFF(8, EDX) ) /* r3 | r2 */ + PFMUL ( MM0, MM4 ) /* x1*m11 | x0*m00 */ + MOVQ ( MM5, MM6 ) /* x3 | x2 */ -LLBL(G3TPIM_3): - ADD_L ( EDI, EAX ) /* next vertex */ - ADD_L ( CONST(16), EDX ) /* next r */ + PUNPCKLDQ ( MM5, MM5 ) /* x2 | x2 */ + PFMUL ( MM1, MM6 ) /* x3*m32 | x2*m22 */ - INC_L ( EBP ) /* next clipmask */ - DEC_L ( ESI ) /* decrement vertex counter */ + PFMUL ( MM2, MM5 ) /* x2*m21 | x2*m20 */ + PFADD ( MM4, MM5 ) /* x1*m11+x2*m21 | x0*m00+x2*m20 */ - JA ( LLBL(G3TPIM_2) /* cnt > 0 ? -> process next vertex */ ) + MOVQ ( MM5, REGIND(EDX) ) /* write r0, r1 */ + MOVD ( REGOFF(8, EAX), MM5 ) /* | x2 */ -LLBL(G3TPIM_4): - FEMMS + PFSUBR ( MM7, MM5 ) /* | -x2 */ + PFACC ( MM5, MM6 ) /* -x2 | x2*m22+x3*m32 */ + MOVQ ( MM6, REGOFF(8, EDX) ) /* write r2, r3 */ + +LLBL( G3TPPM_3 ): + + ADD_L ( EDI, EAX ) /* next vertex */ + ADD_L ( CONST(16), EDX ) /* next r */ + + INC_L ( EBP ) /* next clipmask */ + DEC_L ( ESI ) /* decrement vertex counter */ + + JNZ ( LLBL( G3TPPM_2 ) ) /* cnt > 0 ? -> process next vertex */ + +LLBL( G3TPPM_4 ): + + FEMMS POP_L ( EBP ) POP_L ( EBX ) POP_L ( EDI ) POP_L ( ESI ) - - POP_L ( ESI ) RET ALIGNTEXT16 -GLOBL GLNAME(gl_3dnow_transform_points4_2d_masked) -GLNAME( gl_3dnow_transform_points4_2d_masked ): - - PUSH_L ( ESI ) - MOV_L ( REGOFF(8, ESP), ECX ) - MOV_L ( REGOFF(12, ESP), ESI ) - MOV_L ( REGOFF(16, ESP), EAX ) - MOV_L ( CONST(4), REGOFF(16, ECX) ) - OR_B ( CONST(15), REGOFF(20, ECX) ) - MOV_L ( REGOFF(8, EAX), EDX ) - MOV_L ( EDX, REGOFF(8, ECX) ) - -ALIGNTEXT32 +GLOBL GLNAME(gl_3dnow_transform_points4_3d_masked) +GLNAME( gl_3dnow_transform_points4_3d_masked ): PUSH_L ( ESI ) PUSH_L ( EDI ) PUSH_L ( EBX ) PUSH_L ( EBP ) - - MOV_L ( REGOFF(4, ECX), EDX ) - MOV_L ( ESI, ECX ) - MOV_L ( REGOFF(8, EAX), ESI ) /* count */ - MOV_L ( REGOFF(12, EAX), EDI ) /* input stride */ - MOV_L ( REGOFF(4, EAX), EAX ) - MOV_L ( REGOFF(36, ESP), EBP ) /* clipmask */ - MOV_B ( REGOFF(40, ESP), BL ) /* clip flag */ - - FEMMS - - MOVD ( REGIND(ECX), MM0 ) /* | m00 */ - MOVD ( REGOFF(16, ECX), MM7 ) /* | m10 */ - PSLLQ ( CONST(32), MM7 ) /* m10 | */ - POR ( MM7, MM0 ) /* m10 | m00 */ + MOV_L ( ARG_DEST, ECX ) + MOV_L ( ARG_MATRIX, ESI ) + MOV_L ( ARG_SOURCE, EAX ) + MOV_L ( CONST(4), REGOFF(V4F_SIZE, ECX) ) + OR_B ( CONST(VEC_SIZE_4), REGOFF(V4F_FLAGS, ECX) ) + MOV_L ( REGOFF(V4F_COUNT, EAX), EDX ) + MOV_L ( EDX, REGOFF(V4F_COUNT, ECX) ) - MOVD ( REGOFF(4, ECX), MM1 ) /* | m01 */ - MOVD ( REGOFF(20, ECX), MM7 ) /* | m11 */ - - PSLLQ ( CONST(32), MM7 ) /* m11 | */ - POR ( MM7, MM1 ) /* m11 | m01 */ + MOV_L ( REGOFF(V4F_START, ECX), EDX ) + MOV_L ( ESI, ECX ) + MOV_L ( REGOFF(V4F_COUNT, EAX), ESI ) + MOV_L ( REGOFF(V4F_STRIDE, EAX), EDI ) + MOV_L ( REGOFF(V4F_START, EAX), EAX ) + MOV_L ( ARG_CLIP, EBP ) + MOV_B ( ARG_FLAG, BL ) - MOVQ ( REGOFF(48, ECX), MM2 ) /* m31 | m30 */ - CMP_L ( CONST(0), ESI ) - JE ( LLBL(G3TP2M_4) ) + MOVD ( REGIND(ECX), MM0 ) /* | m00 */ + MOVD ( REGOFF(16, ECX), MM7 ) /* | m10 */ -ALIGNTEXT32 + PSLLQ ( CONST(32), MM7 ) /* m10 | */ + POR ( MM7, MM0 ) /* m10 | m00 */ -LLBL(G3TP2M_2): - TEST_B ( BL, REGIND(EBP) ) /* mask [i] != clip flag ?? */ - JNZ ( LLBL(G3TP2M_3) /* skip vertex */ ) + MOVD ( REGOFF(4, ECX), MM1 ) /* | m01 */ + MOVD ( REGOFF(20, ECX), MM7 ) /* | m11 */ - MOVQ ( REGIND(EAX), MM3 ) /* x1 | x0 */ - MOVQ ( MM3, MM4 ) /* x1 | x0 */ + PSLLQ ( CONST(32), MM7 ) /* m11 | */ + POR ( MM7, MM1 ) /* m11 | m01 */ - MOVQ ( REGOFF(8, EAX), MM5 ) /* x3 | x2 */ - PFMUL ( MM0, MM3 ) /* x1*m10 | x0*m00 */ + MOVD ( REGOFF(32, ECX), MM2 ) /* | m20 */ + MOVD ( REGOFF(48, ECX), MM7 ) /* | m30 */ - MOVQ ( MM5, MM6 ) /* x3 | x2 */ - PFMUL ( MM1, MM4 ) /* x1*m11 | x0*m01 */ + PSLLQ ( CONST(32), MM7 ) /* m30 | */ + POR ( MM7, MM2 ) /* m30 | m20 */ - PUNPCKHDQ ( MM6, MM6 ) /* x3 | x3 */ - PFACC ( MM4, MM3 ) /* x0*m01+x1*m11 | x0*m00+x1*m10 */ + MOVD ( REGOFF(36, ECX), MM3 ) /* | m21 */ + MOVD ( REGOFF(52, ECX), MM7 ) /* | m31 */ - PFMUL ( MM2, MM6 ) /* x3*m31 | x3*m30 */ - PFADD ( MM6, MM3 ) /* r1 | r0 */ + PSLLQ ( CONST(32), MM7 ) /* m31 | */ + POR ( MM7, MM3 ) /* m31 | m21 */ - MOVQ ( MM3, REGIND(EDX) ) /* write r0, r1 */ - MOVQ ( MM5, REGOFF(8, EDX) ) /* write r2, r3 */ + TEST_L ( ESI, ESI ) + JZ ( LLBL( G3TP3M_6 ) ) -LLBL(G3TP2M_3): - ADD_L ( EDI, EAX ) /* next vertex */ - ADD_L ( CONST(16), EDX ) /* next r */ + PUSH_L ( EBP ) + PUSH_L ( EAX ) + PUSH_L ( EDX ) + PUSH_L ( ESI ) - INC_L ( EBP ) /* next clipmask */ - DEC_L ( ESI ) /* decrement vertex counter */ +ALIGNTEXT32 +LLBL( G3TP3M_2 ): - JA ( LLBL(G3TP2M_2) /* cnt > 0 ? -> process next vertex */ ) + TEST_B ( BL, REGIND(EBP) ) /* mask [i] != clip flag ?? */ + JNZ ( LLBL( G3TP3M_3 ) ) /* skip vertex */ -LLBL(G3TP2M_4): - FEMMS + MOVQ ( REGIND(EAX), MM4 ) /* x1 | x0 */ + MOVQ ( MM4, MM5 ) /* x1 | x0 */ - POP_L ( EBP ) - POP_L ( EBX ) - POP_L ( EDI ) - POP_L ( ESI ) + PFMUL ( MM0, MM4 ) /* x1*m10 | x0*m00 */ + MOVQ ( REGOFF(8, EAX), MM6 ) /* x3 | x2 */ - POP_L ( ESI ) - RET + PFMUL ( MM1, MM5 ) /* x1*m11 | x0*m01 */ + MOVQ ( MM6, MM7 ) /* x3 | x2 */ + PFMUL ( MM2, MM6 ) /* x3*m30 | x2*m20 */ + PFACC ( MM5, MM4 ) /* x0*m01+x1*m11 | x0*m00+x1*m10 */ + PFMUL ( MM3, MM7 ) /* x3*m31 | x2*m21 */ + PFACC ( MM7, MM6 ) /* x2*m21+x3*m31 | x2*m20+x3*m30 */ + PFADD ( MM4, MM6 ) /* r1 | r0 */ + MOVQ ( MM6, REGIND(EDX) ) /* write r0, r1 */ -ALIGNTEXT16 -GLOBL GLNAME(gl_3dnow_transform_points4_2d_no_rot_masked) -GLNAME( gl_3dnow_transform_points4_2d_no_rot_masked ): +LLBL( G3TP3M_3 ): - PUSH_L ( ESI ) - MOV_L ( REGOFF(8, ESP), ECX ) - MOV_L ( REGOFF(12, ESP), ESI ) - MOV_L ( REGOFF(16, ESP), EAX ) - MOV_L ( CONST(4), REGOFF(16, ECX) ) - OR_B ( CONST(15), REGOFF(20, ECX) ) - MOV_L ( REGOFF(8, EAX), EDX ) - MOV_L ( EDX, REGOFF(8, ECX) ) + ADD_L ( EDI, EAX ) /* next vertex */ + ADD_L ( CONST(16), EDX ) /* next r */ -ALIGNTEXT32 + INC_L ( EBP ) /* next clipmask */ + DEC_L ( ESI ) /* decrement vertex counter */ - PUSH_L ( ESI ) - PUSH_L ( EDI ) - PUSH_L ( EBX ) - PUSH_L ( EBP ) + JNZ ( LLBL( G3TP3M_2 ) ) /* cnt > 0 ? -> process next vertex */ - MOV_L ( REGOFF(4, ECX), EDX ) - MOV_L ( ESI, ECX ) - MOV_L ( REGOFF(8, EAX), ESI ) /* count */ - MOV_L ( REGOFF(12, EAX), EDI ) /* input stride */ - MOV_L ( REGOFF(4, EAX), EAX ) - MOV_L ( REGOFF(36, ESP), EBP ) /* clipmask */ - MOV_B ( REGOFF(40, ESP), BL ) /* clip flag */ + /* and now the second stripe ... */ + MOVD ( REGOFF(8, ECX), MM0 ) /* | m02 */ + MOVD ( REGOFF(24, ECX), MM7 ) /* | m12 */ - FEMMS + PSLLQ ( CONST(32), MM7 ) /* m12 | */ + POR ( MM7, MM0 ) /* m12 | m02 */ - MOVD ( REGIND(ECX), MM0 ) /* | m00 */ - MOVD ( REGOFF(20, ECX), MM7 ) /* | m11 */ + MOVD ( REGOFF(40, ECX), MM2 ) /* | m22 */ + MOVD ( REGOFF(56, ECX), MM7 ) /* | m32 */ - PSLLQ ( CONST(32), MM7 ) /* m11 | */ - POR ( MM7, MM0 ) /* m11 | m00 */ + PSLLQ ( CONST(32), MM7 ) /* m32 | */ + POR ( MM7, MM2 ) /* m32 | m22 */ - MOVQ ( REGOFF(48, ECX), MM1 ) /* m31 | m30 */ - CMP_L ( CONST(0), ESI ) - JE ( LLBL(G3TP2NRM_4) ) + POP_L ( ESI ) /* reset counter & pointers */ + POP_L ( EDX ) + POP_L ( EAX ) + POP_L ( EBP ) ALIGNTEXT32 +LLBL( G3TP3M_4 ): -LLBL(G3TP2NRM_2): - TEST_B ( BL, REGIND(EBP) ) /* mask [i] != clip flag ?? */ - JNZ ( LLBL(G3TP2NRM_3) ) /* skip vertex */ + TEST_B ( BL, REGIND(EBP) ) /* mask [i] != clip flag ?? */ + JNZ ( LLBL( G3TP3M_5 ) ) /* skip vertex */ - MOVQ ( REGIND(EAX), MM4 ) /* x1 | x0 */ - MOVQ ( REGOFF(8, EAX), MM5 ) /* x3 | x2 */ + MOVQ ( REGIND(EAX), MM4 ) /* x1 | x0 */ + MOVQ ( REGOFF(8, EAX), MM6 ) /* x3 | x2 */ - MOVQ ( MM5, MM6 ) /* x3 | x2 */ - PFMUL ( MM0, MM4 ) /* x1*m11 | x0*m00 */ + PFMUL ( MM0, MM4 ) /* x1*m12 | x0*m02 */ + MOVD ( REGOFF(12, EAX), MM7 ) /* | x3 */ - PUNPCKHDQ ( MM6, MM6 ) /* x3 | x2 */ - PFMUL ( MM1, MM6 ) /* x3*m31 | x3*m30 */ + PFMUL ( MM2, MM6 ) /* x3*m32 | x2*m22 */ + PFACC ( MM4, MM6 ) /* x0*m03+x1*m13 | x0*m02+x1*m12 */ - PFADD ( MM6, MM4 ) /* x1*m11+x3*m31 | x0*m00+x3*m30 */ - MOVQ ( MM4, REGIND(EDX) ) /* write r0, r1 */ + PFACC ( MM7, MM6 ) /* x3 | x2*m22+x3*m32 */ + MOVQ ( MM6, REGOFF(8, EDX) ) /* write r2, r3 */ - MOVQ ( MM5, REGOFF(8, EDX) ) /* write r2, r3 */ +LLBL( G3TP3M_5 ): -LLBL(G3TP2NRM_3): - ADD_L ( EDI, EAX ) /* next vertex */ - ADD_L ( CONST(16), EDX ) /* next r */ + ADD_L ( EDI, EAX ) /* next vertex */ + ADD_L ( CONST(16), EDX ) /* next r */ - INC_L ( EBP ) /* next clipmask */ - DEC_L ( ESI ) /* decrement vertex counter */ + INC_L ( EBP ) /* next clipmask */ + DEC_L ( ESI ) /* decrement vertex counter */ - JA ( LLBL(G3TP2NRM_2) /* cnt > 0 ? -> process next vertex */ ) + JNZ ( LLBL( G3TP3M_4 ) ) /* cnt > 0 ? -> process next vertex */ -LLBL(G3TP2NRM_4): - FEMMS +LLBL( G3TP3M_6 ): + FEMMS POP_L ( EBP ) POP_L ( EBX ) POP_L ( EDI ) POP_L ( ESI ) - - POP_L ( ESI ) RET -ALIGNTEXT16 -GLOBL GLNAME(gl_3dnow_transform_points4_3d_masked) -GLNAME( gl_3dnow_transform_points4_3d_masked ): - PUSH_L ( ESI ) - MOV_L ( REGOFF(8, ESP), ECX ) - MOV_L ( REGOFF(12, ESP), ESI ) - MOV_L ( REGOFF(16, ESP), EAX ) - MOV_L ( CONST(4), REGOFF(16, ECX) ) - OR_B ( CONST(15), REGOFF(20, ECX) ) - MOV_L ( REGOFF(8, EAX), EDX ) - MOV_L ( EDX, REGOFF(8, ECX) ) -ALIGNTEXT32 +ALIGNTEXT16 +GLOBL GLNAME( gl_3dnow_transform_points4_3d_no_rot_masked ) +GLNAME( gl_3dnow_transform_points4_3d_no_rot_masked ): PUSH_L ( ESI ) PUSH_L ( EDI ) PUSH_L ( EBX ) PUSH_L ( EBP ) + + MOV_L ( ARG_DEST, ECX ) + MOV_L ( ARG_MATRIX, ESI ) + MOV_L ( ARG_SOURCE, EAX ) + MOV_L ( CONST(4), REGOFF(V4F_SIZE, ECX) ) + OR_B ( CONST(VEC_SIZE_4), REGOFF(V4F_FLAGS, ECX) ) + MOV_L ( REGOFF(V4F_COUNT, EAX), EDX ) + MOV_L ( EDX, REGOFF(V4F_COUNT, ECX) ) - MOV_L ( REGOFF(4, ECX), EDX ) + MOV_L ( REGOFF(V4F_START, ECX), EDX ) MOV_L ( ESI, ECX ) - MOV_L ( REGOFF(8, EAX), ESI ) /* count */ - MOV_L ( REGOFF(12, EAX), EDI ) /* input stride */ - MOV_L ( REGOFF(4, EAX), EAX ) - MOV_L ( REGOFF(36, ESP), EBP ) /* clipmask */ - MOV_B ( REGOFF(40, ESP), BL ) /* clip flag */ + MOV_L ( REGOFF(V4F_COUNT, EAX), ESI ) + MOV_L ( REGOFF(V4F_STRIDE, EAX), EDI ) + MOV_L ( REGOFF(V4F_START, EAX), EAX ) + MOV_L ( ARG_CLIP, EBP ) + MOV_B ( ARG_FLAG, BL ) - FEMMS + MOVD ( REGIND(ECX), MM0 ) /* | m00 */ + MOVD ( REGOFF(20, ECX), MM7 ) /* | m11 */ - MOVD ( REGIND(ECX), MM0 ) /* | m00 */ - MOVD ( REGOFF(16, ECX), MM7 ) /* | m10 */ + PSLLQ ( CONST(32), MM7 ) /* m11 | */ + POR ( MM7, MM0 ) /* m11 | m00 */ - PSLLQ ( CONST(32), MM7 ) /* m10 | */ - POR ( MM7, MM0 ) /* m10 | m00 */ + MOVD ( REGOFF(40, ECX), MM2 ) /* | m22 */ + MOVD ( REGOFF(56, ECX), MM3 ) /* | m32 */ - MOVD ( REGOFF(4, ECX), MM1 ) /* | m01 */ - MOVD ( REGOFF(20, ECX), MM7 ) /* | m11 */ + PSLLQ ( CONST(32), MM3 ) /* m32 | */ + POR ( MM3, MM2 ) /* m32 | m22 */ - PSLLQ ( CONST(32), MM7 ) /* m11 | */ - POR ( MM7, MM1 ) /* m11 | m01 */ + MOVQ ( REGOFF(48, ECX), MM1 ) /* m31 | m30 */ - MOVD ( REGOFF(32, ECX), MM2 ) /* | m20 */ - MOVD ( REGOFF(48, ECX), MM7 ) /* | m30 */ + TEST_L ( ESI, ESI ) + JZ ( LLBL( G3TP3NRM_4 ) ) - PSLLQ ( CONST(32), MM7 ) /* m30 | */ - POR ( MM7, MM2 ) /* m30 | m20 */ +ALIGNTEXT32 +LLBL( G3TP3NRM_2 ): - MOVD ( REGOFF(36, ECX), MM3 ) /* | m21 */ - MOVD ( REGOFF(52, ECX), MM7 ) /* | m31 */ + TEST_B ( BL, REGIND(EBP) ) /* mask [i] != clip flag ?? */ + JNZ ( LLBL( G3TP3NRM_3 ) ) /* skip vertex */ - PSLLQ ( CONST(32), MM7 ) /* m31 | */ - POR ( MM7, MM3 ) /* m31 | m21 */ + MOVQ ( REGIND(EAX), MM4 ) /* x1 | x0 */ + MOVQ ( REGOFF(8, EAX), MM5 ) /* x3 | x2 */ - CMP_L ( CONST(0), ESI ) - JE ( LLBL(G3TP3M_6) ) + MOVQ ( MM5, MM6 ) /* x3 | x2 */ + PFMUL ( MM0, MM4 ) /* x1*m11 | x0*m00 */ - PUSH_L ( EBP ) - PUSH_L ( EAX ) - PUSH_L ( EDX ) - PUSH_L ( ESI ) + MOVD ( REGOFF(12, EAX), MM7 ) /* | x3 */ + PFMUL ( MM2, MM5 ) /* x3*m32 | x2*m22 */ -ALIGNTEXT32 + PUNPCKHDQ ( MM6, MM6 ) /* x3 | x3 */ + PFACC ( MM7, MM5 ) /* x3 | x2*m22+x3*m32 */ -LLBL(G3TP3M_2): - TEST_B ( BL, REGIND(EBP) ) /* mask [i] != clip flag ?? */ - JNZ ( LLBL(G3TP3M_3) ) /* skip vertex */ + PFMUL ( MM1, MM6 ) /* x3*m31 | x3*m30 */ + PFADD ( MM6, MM4 ) /* x1*m11+x3*m31 | x0*m00+x3*m30 */ - MOVQ ( REGIND(EAX), MM4 ) /* x1 | x0 */ - MOVQ ( MM4, MM5 ) /* x1 | x0 */ + MOVQ ( MM4, REGIND(EDX) ) /* write r0, r1 */ + MOVQ ( MM5, REGOFF(8, EDX) ) /* write r2, r3 */ - PFMUL ( MM0, MM4 ) /* x1*m10 | x0*m00 */ - MOVQ ( REGOFF(8, EAX), MM6 ) /* x3 | x2 */ +LLBL( G3TP3NRM_3 ): - PFMUL ( MM1, MM5 ) /* x1*m11 | x0*m01 */ - MOVQ ( MM6, MM7 ) /* x3 | x2 */ + ADD_L ( EDI, EAX ) /* next vertex */ + ADD_L ( CONST(16), EDX ) /* next r */ - PFMUL ( MM2, MM6 ) /* x3*m30 | x2*m20 */ - PFACC ( MM5, MM4 ) /* x0*m01+x1*m11 | x0*m00+x1*m10 */ + INC_L ( EBP ) /* next clipmask */ + DEC_L ( ESI ) /* decrement vertex counter */ - PFMUL ( MM3, MM7 ) /* x3*m31 | x2*m21 */ - PFACC ( MM7, MM6 ) /* x2*m21+x3*m31 | x2*m20+x3*m30 */ + JNZ ( LLBL( G3TP3NRM_2 ) ) /* cnt > 0 ? -> process next vertex */ - PFADD ( MM4, MM6 ) /* r1 | r0 */ - MOVQ ( MM6, REGIND(EDX) ) /* write r0, r1 */ +LLBL( G3TP3NRM_4 ): -LLBL(G3TP3M_3): - ADD_L ( EDI, EAX ) /* next vertex */ - ADD_L ( CONST(16), EDX ) /* next r */ + FEMMS + POP_L ( EBP ) + POP_L ( EBX ) + POP_L ( EDI ) + POP_L ( ESI ) + RET - INC_L ( EBP ) /* next clipmask */ - DEC_L ( ESI ) /* decrement vertex counter */ - JA ( LLBL(G3TP3M_2) ) /* cnt > 0 ? -> process next vertex */ - /* and now the second stripe ... */ - MOVD ( REGOFF(8, ECX), MM0 ) /* | m02 */ - MOVD ( REGOFF(24, ECX), MM7 ) /* | m12 */ - PSLLQ ( CONST(32), MM7 ) /* m12 | */ - POR ( MM7, MM0 ) /* m12 | m02 */ - MOVD ( REGOFF(40, ECX), MM2 ) /* | m22 */ - MOVD ( REGOFF(56, ECX), MM7 ) /* | m32 */ +ALIGNTEXT16 +GLOBL GLNAME( gl_3dnow_transform_points4_2d_masked ) +GLNAME( gl_3dnow_transform_points4_2d_masked ): - PSLLQ ( CONST(32), MM7 ) /* m32 | */ - POR ( MM7, MM2 ) /* m32 | m22 */ + PUSH_L ( ESI ) + PUSH_L ( EDI ) + PUSH_L ( EBX ) + PUSH_L ( EBP ) - POP_L ( ESI ) /* reset counter & pointers */ - POP_L ( EDX ) + MOV_L ( ARG_DEST, ECX ) + MOV_L ( ARG_MATRIX, ESI ) + MOV_L ( ARG_SOURCE, EAX ) + MOV_L ( CONST(4), REGOFF(V4F_SIZE, ECX) ) + OR_B ( CONST(VEC_SIZE_4), REGOFF(V4F_FLAGS, ECX) ) + MOV_L ( REGOFF(V4F_COUNT, EAX), EDX ) + MOV_L ( EDX, REGOFF(V4F_COUNT, ECX) ) - POP_L ( EAX ) - POP_L ( EBP ) + MOV_L ( REGOFF(V4F_START, ECX), EDX ) + MOV_L ( ESI, ECX ) + MOV_L ( REGOFF(V4F_COUNT, EAX), ESI ) + MOV_L ( REGOFF(V4F_STRIDE, EAX), EDI ) + MOV_L ( REGOFF(V4F_START, EAX), EAX ) + MOV_L ( ARG_CLIP, EBP ) + MOV_B ( ARG_FLAG, BL ) + + MOVD ( REGIND(ECX), MM0 ) /* | m00 */ + MOVD ( REGOFF(16, ECX), MM7 ) /* | m10 */ + PSLLQ ( CONST(32), MM7 ) /* m10 | */ + POR ( MM7, MM0 ) /* m10 | m00 */ + + MOVD ( REGOFF(4, ECX), MM1 ) /* | m01 */ + MOVD ( REGOFF(20, ECX), MM7 ) /* | m11 */ + + PSLLQ ( CONST(32), MM7 ) /* m11 | */ + POR ( MM7, MM1 ) /* m11 | m01 */ + + MOVQ ( REGOFF(48, ECX), MM2 ) /* m31 | m30 */ + + TEST_L ( ESI, ESI ) + JZ ( LLBL( G3TP2M_4 ) ) + ALIGNTEXT32 +LLBL( G3TP2M_2 ): -LLBL(G3TP3M_4): - TEST_B ( BL, REGIND(EBP) ) /* mask [i] != clip flag ?? */ - JNZ ( LLBL(G3TP3M_5) ) /* skip vertex */ + TEST_B ( BL, REGIND(EBP) ) /* mask [i] != clip flag ?? */ + JNZ ( LLBL( G3TP2M_3 ) ) /* skip vertex */ - MOVQ ( REGIND(EAX), MM4 ) /* x1 | x0 */ - MOVQ ( REGOFF(8, EAX), MM6 ) /* x3 | x2 */ + MOVQ ( REGIND(EAX), MM3 ) /* x1 | x0 */ + MOVQ ( MM3, MM4 ) /* x1 | x0 */ - PFMUL ( MM0, MM4 ) /* x1*m12 | x0*m02 */ - MOVD ( REGOFF(12, EAX), MM7 ) /* | x3 */ + MOVQ ( REGOFF(8, EAX), MM5 ) /* x3 | x2 */ + PFMUL ( MM0, MM3 ) /* x1*m10 | x0*m00 */ - PFMUL ( MM2, MM6 ) /* x3*m32 | x2*m22 */ - PFACC ( MM4, MM6 ) /* x0*m03+x1*m13 | x0*m02+x1*m12 */ + MOVQ ( MM5, MM6 ) /* x3 | x2 */ + PFMUL ( MM1, MM4 ) /* x1*m11 | x0*m01 */ - PFACC ( MM7, MM6 ) /* x3 | x2*m22+x3*m32 */ - MOVQ ( MM6, REGOFF(8, EDX) ) /* write r2, r3 */ + PUNPCKHDQ ( MM6, MM6 ) /* x3 | x3 */ + PFACC ( MM4, MM3 ) /* x0*m01+x1*m11 | x0*m00+x1*m10 */ -LLBL(G3TP3M_5): - ADD_L ( EDI, EAX ) /* next vertex */ - ADD_L ( CONST(16), EDX ) /* next r */ + PFMUL ( MM2, MM6 ) /* x3*m31 | x3*m30 */ + PFADD ( MM6, MM3 ) /* r1 | r0 */ - INC_L ( EBP ) /* next clipmask */ - DEC_L ( ESI ) /* decrement vertex counter */ + MOVQ ( MM3, REGIND(EDX) ) /* write r0, r1 */ + MOVQ ( MM5, REGOFF(8, EDX) ) /* write r2, r3 */ - JA ( LLBL(G3TP3M_4) ) /* cnt > 0 ? -> process next vertex */ +LLBL( G3TP2M_3 ): -LLBL(G3TP3M_6): - FEMMS + ADD_L ( EDI, EAX ) /* next vertex */ + ADD_L ( CONST(16), EDX ) /* next r */ + + INC_L ( EBP ) /* next clipmask */ + DEC_L ( ESI ) /* decrement vertex counter */ + + JNZ ( LLBL( G3TP2M_2 ) ) /* cnt > 0 ? -> process next vertex */ +LLBL( G3TP2M_4 ): + + FEMMS POP_L ( EBP ) POP_L ( EBX ) POP_L ( EDI ) POP_L ( ESI ) - - POP_L ( ESI ) RET - ALIGNTEXT16 -GLOBL GLNAME(gl_3dnow_transform_points4_3d_no_rot_masked) -GLNAME( gl_3dnow_transform_points4_3d_no_rot_masked ): - - PUSH_L ( ESI ) - MOV_L ( REGOFF(8, ESP), ECX ) - MOV_L ( REGOFF(12, ESP), ESI ) - MOV_L ( REGOFF(16, ESP), EAX ) - MOV_L ( CONST(4), REGOFF(16, ECX) ) - OR_B ( CONST(15), REGOFF(20, ECX) ) - MOV_L ( REGOFF(8, EAX), EDX ) - MOV_L ( EDX, REGOFF(8, ECX) ) - -ALIGNTEXT32 +GLOBL GLNAME( gl_3dnow_transform_points4_2d_no_rot_masked ) +GLNAME( gl_3dnow_transform_points4_2d_no_rot_masked ): PUSH_L ( ESI ) PUSH_L ( EDI ) PUSH_L ( EBX ) PUSH_L ( EBP ) - MOV_L ( REGOFF(4, ECX), EDX ) - MOV_L ( ESI, ECX ) - MOV_L ( REGOFF(8, EAX), ESI ) /* count */ - MOV_L ( REGOFF(12, EAX), EDI ) /* input stride */ - MOV_L ( REGOFF(4, EAX), EAX ) - MOV_L ( REGOFF(36, ESP), EBP ) /* clipmask */ - MOV_B ( REGOFF(40, ESP), BL ) /* clip flag */ + MOV_L ( ARG_DEST, ECX ) + MOV_L ( ARG_MATRIX, ESI ) + MOV_L ( ARG_SOURCE, EAX ) + MOV_L ( CONST(4), REGOFF(V4F_SIZE, ECX) ) + OR_B ( CONST(VEC_SIZE_4), REGOFF(V4F_FLAGS, ECX) ) + MOV_L ( REGOFF(V4F_COUNT, EAX), EDX ) + MOV_L ( EDX, REGOFF(V4F_COUNT, ECX) ) - FEMMS - - MOVD ( REGIND(ECX), MM0 ) /* | m00 */ - MOVD ( REGOFF(20, ECX), MM7 ) /* | m11 */ - - PSLLQ ( CONST(32), MM7 ) /* m11 | */ - POR ( MM7, MM0 ) /* m11 | m00 */ + MOV_L ( REGOFF(V4F_START, ECX), EDX ) + MOV_L ( ESI, ECX ) + MOV_L ( REGOFF(V4F_COUNT, EAX), ESI ) + MOV_L ( REGOFF(V4F_STRIDE, EAX), EDI ) + MOV_L ( REGOFF(V4F_START, EAX), EAX ) + MOV_L ( ARG_CLIP, EBP ) + MOV_B ( ARG_FLAG, BL ) - MOVD ( REGOFF(40, ECX), MM2 ) /* | m22 */ - MOVD ( REGOFF(56, ECX), MM3 ) /* | m32 */ + MOVD ( REGIND(ECX), MM0 ) /* | m00 */ + MOVD ( REGOFF(20, ECX), MM7 ) /* | m11 */ - PSLLQ ( CONST(32), MM3 ) /* m32 | */ - POR ( MM3, MM2 ) /* m32 | m22 */ + PSLLQ ( CONST(32), MM7 ) /* m11 | */ + POR ( MM7, MM0 ) /* m11 | m00 */ - MOVQ ( REGOFF(48, ECX), MM1 ) /* m31 | m30 */ + MOVQ ( REGOFF(48, ECX), MM1 ) /* m31 | m30 */ - CMP_L ( CONST(0), ESI ) - JE ( LLBL(G3TP3NRM_4) ) + TEST_L ( ESI, ESI ) + JZ ( LLBL( G3TP2NRM_4 ) ) ALIGNTEXT32 +LLBL( G3TP2NRM_2 ): -LLBL(G3TP3NRM_2): - TEST_B ( BL, REGIND(EBP) ) /* mask [i] != clip flag ?? */ - JNZ ( LLBL(G3TP3NRM_3) ) /* skip vertex */ + TEST_B ( BL, REGIND(EBP) ) /* mask [i] != clip flag ?? */ + JNZ ( LLBL( G3TP2NRM_3 ) ) /* skip vertex */ - MOVQ ( REGIND(EAX), MM4 ) /* x1 | x0 */ - MOVQ ( REGOFF(8, EAX), MM5 ) /* x3 | x2 */ + MOVQ ( REGIND(EAX), MM4 ) /* x1 | x0 */ + MOVQ ( REGOFF(8, EAX), MM5 ) /* x3 | x2 */ - MOVQ ( MM5, MM6 ) /* x3 | x2 */ - PFMUL ( MM0, MM4 ) /* x1*m11 | x0*m00 */ + MOVQ ( MM5, MM6 ) /* x3 | x2 */ + PFMUL ( MM0, MM4 ) /* x1*m11 | x0*m00 */ - MOVD ( REGOFF(12, EAX), MM7 ) /* | x3 */ - PFMUL ( MM2, MM5 ) /* x3*m32 | x2*m22 */ + PUNPCKHDQ ( MM6, MM6 ) /* x3 | x2 */ + PFMUL ( MM1, MM6 ) /* x3*m31 | x3*m30 */ - PUNPCKHDQ ( MM6, MM6 ) /* x3 | x3 */ - PFACC ( MM7, MM5 ) /* x3 | x2*m22+x3*m32 */ + PFADD ( MM6, MM4 ) /* x1*m11+x3*m31 | x0*m00+x3*m30 */ + MOVQ ( MM4, REGIND(EDX) ) /* write r0, r1 */ - PFMUL ( MM1, MM6 ) /* x3*m31 | x3*m30 */ - PFADD ( MM6, MM4 ) /* x1*m11+x3*m31 | x0*m00+x3*m30 */ + MOVQ ( MM5, REGOFF(8, EDX) ) /* write r2, r3 */ - MOVQ ( MM4, REGIND(EDX) ) /* write r0, r1 */ - MOVQ ( MM5, REGOFF(8, EDX) ) /* write r2, r3 */ +LLBL( G3TP2NRM_3 ): -LLBL(G3TP3NRM_3): - ADD_L ( EDI, EAX ) /* next vertex */ - ADD_L ( CONST(16), EDX ) /* next r */ + ADD_L ( EDI, EAX ) /* next vertex */ + ADD_L ( CONST(16), EDX ) /* next r */ - INC_L ( EBP ) /* next clipmask */ - DEC_L ( ESI ) /* decrement vertex counter */ + INC_L ( EBP ) /* next clipmask */ + DEC_L ( ESI ) /* decrement vertex counter */ - JA ( LLBL(G3TP3NRM_2) /* cnt > 0 ? -> process next vertex */ ) + JNZ ( LLBL( G3TP2NRM_2 ) ) /* cnt > 0 ? -> process next vertex */ -LLBL(G3TP3NRM_4): - FEMMS +LLBL( G3TP2NRM_4 ): + FEMMS POP_L ( EBP ) POP_L ( EBX ) POP_L ( EDI ) POP_L ( ESI ) - - POP_L ( ESI ) RET ALIGNTEXT16 -GLOBL GLNAME(gl_3dnow_transform_points4_perspective_masked) -GLNAME( gl_3dnow_transform_points4_perspective_masked ): - - PUSH_L ( ESI ) - MOV_L ( REGOFF(8, ESP), ECX ) - MOV_L ( REGOFF(12, ESP), ESI ) - MOV_L ( REGOFF(16, ESP), EAX ) - MOV_L ( CONST(4), REGOFF(16, ECX) ) - OR_B ( CONST(15), REGOFF(20, ECX) ) - MOV_L ( REGOFF(8, EAX), EDX ) - MOV_L ( EDX, REGOFF(8, ECX) ) - -ALIGNTEXT32 +GLOBL GLNAME( gl_3dnow_transform_points4_identity_masked ) +GLNAME( gl_3dnow_transform_points4_identity_masked ): PUSH_L ( ESI ) PUSH_L ( EDI ) PUSH_L ( EBX ) PUSH_L ( EBP ) - MOV_L ( REGOFF(4, ECX), EDX ) - MOV_L ( ESI, ECX ) - MOV_L ( REGOFF(8, EAX), ESI ) /* count */ - MOV_L ( REGOFF(12, EAX), EDI ) /* input stride */ - MOV_L ( REGOFF(4, EAX), EAX ) - MOV_L ( REGOFF(36, ESP), EBP ) /* clipmask */ - MOV_B ( REGOFF(40, ESP), BL ) /* clip flag */ - - FEMMS + MOV_L ( ARG_DEST, ECX ) + MOV_L ( ARG_MATRIX, ESI ) + MOV_L ( ARG_SOURCE, EAX ) + MOV_L ( CONST(4), REGOFF(V4F_SIZE, ECX) ) + OR_B ( CONST(VEC_SIZE_4), REGOFF(V4F_FLAGS, ECX) ) + MOV_L ( REGOFF(V4F_COUNT, EAX), EDX ) + MOV_L ( EDX, REGOFF(V4F_COUNT, ECX) ) - MOVD ( REGIND(ECX), MM0 ) /* | m00 */ - MOVD ( REGOFF(20, ECX), MM7 ) /* | m11 */ - - PSLLQ ( CONST(32), MM7 ) /* m11 | */ - POR ( MM7, MM0 ) /* m11 | m00 */ - - MOVD ( REGOFF(40, ECX), MM1 ) /* | m22 */ - MOVD ( REGOFF(56, ECX), MM7 ) /* | m32 */ - - PSLLQ ( CONST(32), MM7 ) /* m32 | */ - POR ( MM7, MM1 ) /* m32 | m22 */ - - MOVQ ( REGOFF(32, ECX), MM2 ) /* m21 | m20 */ - PUNPCKLDQ ( MM7, MM7 ) /* 0 | 0 */ + MOV_L ( REGOFF(V4F_START, ECX), EDX ) + MOV_L ( ESI, ECX ) + MOV_L ( REGOFF(V4F_COUNT, EAX), ESI ) + MOV_L ( REGOFF(V4F_STRIDE, EAX), EDI ) + MOV_L ( REGOFF(V4F_START, EAX), EAX ) + MOV_L ( ARG_CLIP, EBP ) + MOV_B ( ARG_FLAG, BL ) - CMP_L ( CONST(0), ESI ) - JE ( LLBL(G3TPPM_4) ) + TEST_L ( ESI, ESI ) + JZ ( LLBL( G3TPIM_4 ) ) ALIGNTEXT32 +LLBL( G3TPIM_2 ): -LLBL(G3TPPM_2): - TEST_B ( BL, REGIND(EBP) ) /* mask [i] != clip flag ?? */ - JNZ ( LLBL(G3TPPM_3) ) /* skip vertex */ + TEST_B ( BL, REGIND(EBP) ) /* mask [i] != clip flag ?? */ + JNZ ( LLBL( G3TPIM_3 ) ) /* skip vertex */ - MOVQ ( REGIND(EAX), MM4 ) /* x1 | x0 */ - MOVQ ( REGOFF(8, EAX), MM5 ) /* x3 | x2 */ + MOVQ ( REGIND(EAX), MM0 ) /* x1 | x0 */ + MOVQ ( MM0, REGIND(EDX) ) /* r1 | r0 */ - PFMUL ( MM0, MM4 ) /* x1*m11 | x0*m00 */ - MOVQ ( MM5, MM6 ) /* x3 | x2 */ + MOVQ ( REGOFF(8, EAX), MM1 ) /* x3 | x2 */ + MOVQ ( MM1, REGOFF(8, EDX) ) /* r3 | r2 */ - PUNPCKLDQ ( MM5, MM5 ) /* x2 | x2 */ - PFMUL ( MM1, MM6 ) /* x3*m32 | x2*m22 */ +LLBL( G3TPIM_3 ): - PFMUL ( MM2, MM5 ) /* x2*m21 | x2*m20 */ - PFADD ( MM4, MM5 ) /* x1*m11+x2*m21 | x0*m00+x2*m20 */ + ADD_L ( EDI, EAX ) /* next vertex */ + ADD_L ( CONST(16), EDX ) /* next r */ - MOVQ ( MM5, REGIND(EDX) ) /* write r0, r1 */ - MOVD ( REGOFF(8, EAX), MM5 ) /* | x2 */ + INC_L ( EBP ) /* next clipmask */ + DEC_L ( ESI ) /* decrement vertex counter */ - PFSUBR ( MM7, MM5 ) /* | -x2 */ - PFACC ( MM5, MM6 ) /* -x2 | x2*m22+x3*m32 */ + JNZ ( LLBL( G3TPIM_2 ) ) /* cnt > 0 ? -> process next vertex */ - MOVQ ( MM6, REGOFF(8, EDX) ) /* write r2, r3 */ +LLBL( G3TPIM_4 ): -LLBL(G3TPPM_3): - ADD_L ( EDI, EAX ) /* next vertex */ - ADD_L ( CONST(16), EDX ) /* next r */ - - INC_L ( EBP ) /* next clipmask */ - DEC_L ( ESI ) /* decrement vertex counter */ - - JA ( LLBL(G3TPPM_2) ) /* cnt > 0 ? -> process next vertex */ - -LLBL(G3TPPM_4): FEMMS - POP_L ( EBP ) POP_L ( EBX ) POP_L ( EDI ) POP_L ( ESI ) - - POP_L ( ESI ) RET - - - - Index: xc/extras/Mesa/src/X86/3dnow_xform_raw1.S diff -u xc/extras/Mesa/src/X86/3dnow_xform_raw1.S:1.2 xc/extras/Mesa/src/X86/3dnow_xform_raw1.S:1.4 --- xc/extras/Mesa/src/X86/3dnow_xform_raw1.S:1.2 Fri Jun 16 20:02:41 2000 +++ xc/extras/Mesa/src/X86/3dnow_xform_raw1.S Mon Nov 13 18:31:07 2000 @@ -1,125 +1,141 @@ + +/* + * Mesa 3-D graphics library + * Version: 3.4 + * + * Copyright (C) 1999-2000 Brian Paul All Rights Reserved. + * + * 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 + * BRIAN PAUL 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 "assyntax.h" +#include "xform_args.h" + + SEG_TEXT - SEG_TEXT +#define FRAME_OFFSET 4 ALIGNTEXT16 -GLOBL GLNAME(gl_3dnow_transform_points1_general_raw) -GLNAME(gl_3dnow_transform_points1_general_raw): +GLOBL GLNAME( gl_3dnow_transform_points1_general_raw ) +GLNAME( gl_3dnow_transform_points1_general_raw ): PUSH_L ( ESI ) - MOV_L ( REGOFF(8, ESP), ECX ) - MOV_L ( REGOFF(12, ESP), ESI ) - MOV_L ( REGOFF(16, ESP), EAX ) - MOV_L ( CONST(4), REGOFF(16, ECX) ) - OR_B ( CONST(15), REGOFF(20, ECX) ) - MOV_L ( REGOFF(8, EAX), EDX ) - MOV_L ( EDX, REGOFF(8, ECX) ) -ALIGNTEXT32 + MOV_L ( ARG_DEST, ECX ) + MOV_L ( ARG_MATRIX, ESI ) + MOV_L ( ARG_SOURCE, EAX ) + MOV_L ( CONST(4), REGOFF(V4F_SIZE, ECX) ) + OR_B ( CONST(VEC_SIZE_4), REGOFF(V4F_FLAGS, ECX) ) + MOV_L ( REGOFF(V4F_COUNT, EAX), EDX ) + MOV_L ( EDX, REGOFF(V4F_COUNT, ECX) ) PUSH_L ( EDI ) - PUSH_L ( ESI ) MOV_L ( REGOFF(4, ECX), EDX ) MOV_L ( ESI, ECX ) - MOV_L ( REGOFF(8, EAX), ESI ) - MOV_L ( REGOFF(12, EAX), EDI ) - MOV_L ( REGOFF(4, EAX), EAX ) + MOV_L ( REGOFF(V4F_COUNT, EAX), ESI ) + MOV_L ( REGOFF(V4F_STRIDE, EAX), EDI ) + MOV_L ( REGOFF(V4F_START, EAX), EAX ) - FEMMS + TEST_L ( ESI, ESI ) + JZ ( LLBL( G3TPGR_3 ) ) - CMP_L ( CONST(0), ESI ) - JE ( LLBL(G3TPGR_3) ) + MOVQ ( REGIND(ECX), MM0 ) /* m01 | m00 */ + MOVQ ( REGOFF(8, ECX), MM1 ) /* m03 | m02 */ - MOVQ ( REGIND(ECX), MM0 ) /* m01 | m00 */ - MOVQ ( REGOFF(8, ECX), MM1 ) /* m03 | m02 */ + MOVQ ( REGOFF(48, ECX), MM2 ) /* m31 | m30 */ + MOVQ ( REGOFF(56, ECX), MM3 ) /* m33 | m32 */ - MOVQ ( REGOFF(48, ECX), MM2 ) /* m31 | m30 */ - MOVQ ( REGOFF(56, ECX), MM3 ) /* m33 | m32 */ +ALIGNTEXT16 +LLBL( G3TPGR_2 ): -ALIGNTEXT32 -LLBL(G3TPGR_2): + MOVD ( REGIND(EAX), MM4 ) /* | x0 */ + PUNPCKLDQ ( MM4, MM4 ) /* x0 | x0 */ - MOVD ( REGIND(EAX), MM4 ) /* | x0 */ - PUNPCKLDQ ( MM4, MM4 ) /* x0 | x0 */ + MOVQ ( MM4, MM5 ) /* x0 | x0 */ + PFMUL ( MM0, MM4 ) /* x0*m01 | x0*m00 */ - MOVQ ( MM4, MM5 ) /* x0 | x0 */ - PFMUL ( MM0, MM4 ) /* x0*m01 | x0*m00 */ + PFMUL ( MM1, MM5 ) /* x0*m03 | x0*m02 */ + PFADD ( MM2, MM4 ) /* x0*m01+m31 | x0*m00+m30 */ - PFMUL ( MM1, MM5 ) /* x0*m03 | x0*m02 */ - PFADD ( MM2, MM4 ) /* x0*m01+m31 | x0*m00+m30 */ + PFADD ( MM3, MM5 ) /* x0*m03+m33 | x0*m02+m32 */ + MOVQ ( MM4, REGIND(EDX) ) /* write r1, r0 */ - PFADD ( MM3, MM5 ) /* x0*m03+m33 | x0*m02+m32 */ - MOVQ ( MM4, REGIND(EDX) ) /* write r1, r0 */ + MOVQ ( MM5, REGOFF(8, EDX) ) /* write r3, r2 */ + ADD_L ( EDI, EAX ) /* next vertex */ - MOVQ ( MM5, REGOFF(8, EDX) ) /* write r3, r2 */ - ADD_L ( EDI, EAX ) /* next vertex */ + ADD_L ( CONST(16), EDX ) /* next r */ + DEC_L ( ESI ) /* decrement vertex counter */ - ADD_L ( CONST(16), EDX ) /* next r */ - DEC_L ( ESI ) /* decrement vertex counter */ + JNZ ( LLBL( G3TPGR_2 ) ) /* cnt > 0 ? -> process next vertex */ - JA ( LLBL(G3TPGR_2) ) /* cnt > 0 ? -> process next vertex */ +LLBL( G3TPGR_3 ): -LLBL(G3TPGR_3): FEMMS - - POP_L ( ESI ) POP_L ( EDI ) - POP_L ( ESI ) RET - ALIGNTEXT16 -GLOBL GLNAME(gl_3dnow_transform_points1_identity_raw) -GLNAME(gl_3dnow_transform_points1_identity_raw): +GLOBL GLNAME( gl_3dnow_transform_points1_identity_raw ) +GLNAME( gl_3dnow_transform_points1_identity_raw ): PUSH_L ( ESI ) - MOV_L ( REGOFF(8, ESP), ECX ) - MOV_L ( REGOFF(12, ESP), ESI ) - MOV_L ( REGOFF(16, ESP), EAX ) - MOV_L ( CONST(1), REGOFF(16, ECX) ) - OR_B ( CONST(1), REGOFF(20, ECX) ) - MOV_L ( REGOFF(8, EAX), EDX ) - MOV_L ( EDX, REGOFF(8, ECX) ) -ALIGNTEXT32 + MOV_L ( ARG_DEST, ECX ) + MOV_L ( ARG_MATRIX, ESI ) + MOV_L ( ARG_SOURCE, EAX ) + MOV_L ( CONST(1), REGOFF(V4F_SIZE, ECX) ) + OR_B ( CONST(VEC_SIZE_1), REGOFF(V4F_FLAGS, ECX) ) + MOV_L ( REGOFF(V4F_COUNT, EAX), EDX ) + MOV_L ( EDX, REGOFF(V4F_COUNT, ECX) ) PUSH_L ( EDI ) - PUSH_L ( ESI ) MOV_L ( REGOFF(4, ECX), EDX ) MOV_L ( ESI, ECX ) - MOV_L ( REGOFF(8, EAX), ESI ) - MOV_L ( REGOFF(12, EAX), EDI ) - MOV_L ( REGOFF(4, EAX), EAX ) + MOV_L ( REGOFF(V4F_COUNT, EAX), ESI ) + MOV_L ( REGOFF(V4F_STRIDE, EAX), EDI ) + MOV_L ( REGOFF(V4F_START, EAX), EAX ) - FEMMS + TEST_L ( ESI, ESI ) + JZ ( LLBL( G3TPIR_4) ) - CMP_L ( CONST(0), ESI ) - JE ( LLBL(G3TPIR_4) ) +ALIGNTEXT16 +LLBL( G3TPIR_3 ): -LLBL(G3TPIR_3): + MOVD ( REGIND(EAX), MM0 ) /* | x0 */ + ADD_L ( EDI, EAX ) /* next vertex */ - MOVD ( REGIND(EAX), MM0 ) /* | x0 */ - ADD_L ( EDI, EAX ) /* next vertex */ + MOVD ( MM0, REGIND(EDX) ) /* | r0 */ + ADD_L ( CONST(16), EDX ) /* next r */ - MOVD ( MM0, REGIND(EDX) ) /* | r0 */ - ADD_L ( CONST(16), EDX ) /* next r */ + DEC_L ( ESI ) /* decrement vertex counter */ + JNZ ( LLBL( G3TPIR_3 ) ) /* cnt > 0 ? -> process next vertex */ - DEC_L ( ESI ) /* decrement vertex counter */ - JA ( LLBL(G3TPIR_3) ) /* cnt > 0 ? -> process next vertex */ +LLBL( G3TPIR_4 ): -LLBL(G3TPIR_4): FEMMS - - POP_L ( ESI ) POP_L ( EDI ) - POP_L ( ESI ) RET @@ -127,322 +143,280 @@ ALIGNTEXT16 -GLOBL GLNAME(gl_3dnow_transform_points1_2d_raw) -GLNAME(gl_3dnow_transform_points1_2d_raw): +GLOBL GLNAME( gl_3dnow_transform_points1_3d_no_rot_raw ) +GLNAME( gl_3dnow_transform_points1_3d_no_rot_raw ): PUSH_L ( ESI ) - MOV_L ( REGOFF(8, ESP), ECX ) - MOV_L ( REGOFF(12, ESP), ESI ) - MOV_L ( REGOFF(16, ESP), EAX ) - MOV_L ( CONST(2), REGOFF(16, ECX) ) - OR_B ( CONST(3), REGOFF(20, ECX) ) - MOV_L ( REGOFF(8, EAX), EDX ) - MOV_L ( EDX, REGOFF(8, ECX) ) -ALIGNTEXT32 + MOV_L ( ARG_DEST, ECX ) + MOV_L ( ARG_MATRIX, ESI ) + MOV_L ( ARG_SOURCE, EAX ) + MOV_L ( CONST(3), REGOFF(V4F_SIZE, ECX) ) + OR_B ( CONST(VEC_SIZE_3), REGOFF(V4F_FLAGS, ECX) ) + MOV_L ( REGOFF(V4F_COUNT, EAX), EDX ) + MOV_L ( EDX, REGOFF(V4F_COUNT, ECX) ) PUSH_L ( EDI ) - PUSH_L ( ESI ) MOV_L ( REGOFF(4, ECX), EDX ) MOV_L ( ESI, ECX ) - MOV_L ( REGOFF(8, EAX), ESI ) - MOV_L ( REGOFF(12, EAX), EDI ) - MOV_L ( REGOFF(4, EAX), EAX ) + MOV_L ( REGOFF(V4F_COUNT, EAX), ESI ) + MOV_L ( REGOFF(V4F_STRIDE, EAX), EDI ) + MOV_L ( REGOFF(V4F_START, EAX), EAX ) - FEMMS + TEST_L ( ESI, ESI ) + JZ ( LLBL( G3TP3NRR_3 ) ) - CMP_L ( CONST(0), ESI ) - JE ( LLBL(G3TP2R_3) ) + MOVD ( REGIND(ECX), MM0 ) /* | m00 */ + MOVQ ( REGOFF(48, ECX), MM2 ) /* m31 | m30 */ - MOVQ ( REGIND(ECX), MM0 ) /* m01 | m00 */ - MOVQ ( REGOFF(48, ECX), MM2 ) /* m31 | m30 */ + MOVD ( REGOFF(56, ECX), MM3 ) /* | m32 */ +ALIGNTEXT16 +LLBL( G3TP3NRR_2 ): -ALIGNTEXT32 -LLBL(G3TP2R_2): + MOVD ( REGIND(EAX), MM4 ) /* | x0 */ + PFMUL ( MM0, MM4 ) /* | x0*m00 */ - MOVD ( REGIND(EAX), MM4 ) /* | x0 */ - PUNPCKLDQ ( MM4, MM4 ) /* x0 | x0 */ + PFADD ( MM2, MM4 ) /* m31 | x0*m00+m30 */ + MOVQ ( MM4, REGIND(EDX) ) /* write r1, r0 */ - PFMUL ( MM0, MM4 ) /* x0*m01 | x0*m00 */ - PFADD ( MM2, MM4 ) /* x0*m01+m31 | x0*m00+m30 */ + MOVD ( MM3, REGOFF(8, EDX) ) /* write r2 */ + ADD_L ( EDI, EAX ) /* next vertex */ - MOVQ ( MM4, REGIND(EDX) ) /* write r1, r0 */ - ADD_L ( EDI, EAX ) /* next vertex */ + ADD_L ( CONST(16), EDX ) /* next r */ + DEC_L ( ESI ) /* decrement vertex counter */ - ADD_L ( CONST(16), EDX ) /* next r */ - DEC_L ( ESI ) /* decrement vertex counter */ + JNZ ( LLBL( G3TP3NRR_2 ) ) /* cnt > 0 ? -> process next vertex */ - JA ( LLBL(G3TP2R_2) ) /* cnt > 0 ? -> process next vertex */ +LLBL( G3TP3NRR_3 ): -LLBL(G3TP2R_3): FEMMS - - POP_L ( ESI ) POP_L ( EDI ) - POP_L ( ESI ) RET - ALIGNTEXT16 -GLOBL GLNAME(gl_3dnow_transform_points1_2d_no_rot_raw) -GLNAME(gl_3dnow_transform_points1_2d_no_rot_raw): +GLOBL GLNAME( gl_3dnow_transform_points1_perspective_raw ) +GLNAME( gl_3dnow_transform_points1_perspective_raw ): PUSH_L ( ESI ) - MOV_L ( REGOFF(8, ESP), ECX ) - MOV_L ( REGOFF(12, ESP), ESI ) - MOV_L ( REGOFF(16, ESP), EAX ) - MOV_L ( CONST(2), REGOFF(16, ECX) ) - OR_B ( CONST(3), REGOFF(20, ECX) ) - MOV_L ( REGOFF(8, EAX), EDX ) - MOV_L ( EDX, REGOFF(8, ECX) ) -ALIGNTEXT32 + MOV_L ( ARG_DEST, ECX ) + MOV_L ( ARG_MATRIX, ESI ) + MOV_L ( ARG_SOURCE, EAX ) + MOV_L ( CONST(4), REGOFF(V4F_SIZE, ECX) ) + OR_B ( CONST(VEC_SIZE_4), REGOFF(V4F_FLAGS, ECX) ) + MOV_L ( REGOFF(V4F_COUNT, EAX), EDX ) + MOV_L ( EDX, REGOFF(V4F_COUNT, ECX) ) PUSH_L ( EDI ) - PUSH_L ( ESI ) MOV_L ( REGOFF(4, ECX), EDX ) MOV_L ( ESI, ECX ) - MOV_L ( REGOFF(8, EAX), ESI ) - MOV_L ( REGOFF(12, EAX), EDI ) - MOV_L ( REGOFF(4, EAX), EAX ) - - FEMMS + MOV_L ( REGOFF(V4F_COUNT, EAX), ESI ) + MOV_L ( REGOFF(V4F_STRIDE, EAX), EDI ) + MOV_L ( REGOFF(V4F_START, EAX), EAX ) - CMP_L ( CONST(0), ESI ) - JE ( LLBL(G3TP2NRR_3) ) + TEST_L ( ESI, ESI ) + JZ ( LLBL( G3TPPR_3 ) ) - MOVD ( REGIND(ECX), MM0 ) /* | m00 */ - MOVQ ( REGOFF(48, ECX), MM2 ) /* m31 | m30 */ + MOVD ( REGIND(ECX), MM0 ) /* | m00 */ + MOVD ( REGOFF(56, ECX), MM3 ) /* | m32 */ +ALIGNTEXT16 +LLBL( G3TPPR_2 ): -ALIGNTEXT32 -LLBL(G3TP2NRR_2): + MOVD ( REGIND(EAX), MM4 ) /* 0 | x0 */ + PFMUL ( MM0, MM4 ) /* 0 | x0*m00 */ - MOVD ( REGIND(EAX), MM4 ) /* | x0 */ - ADD_L ( EDI, EAX ) /* next vertex */ + MOVQ ( MM4, REGIND(EDX) ) /* write r1, r0 */ + MOVQ ( MM3, REGOFF(8, EDX) ) /* write r2 (=m32), r3 (=0) */ - PFMUL ( MM0, MM4 ) /* | x0*m00 */ - PFADD ( MM2, MM4 ) /* m31 | x0*m00+m30 */ + ADD_L ( EDI, EAX ) /* next vertex */ + ADD_L ( CONST(16), EDX ) /* next r */ - MOVQ ( MM4, REGIND(EDX) ) /* write r1, r0 */ - ADD_L ( CONST(16), EDX ) /* next r */ + DEC_L ( ESI ) /* decrement vertex counter */ + JNZ ( LLBL( G3TPPR_2 ) ) /* cnt > 0 ? -> process next vertex */ - DEC_L ( ESI ) /* decrement vertex counter */ - JA ( LLBL(G3TP2NRR_2) ) /* cnt > 0 ? -> process next vertex */ +LLBL( G3TPPR_3 ): -LLBL(G3TP2NRR_3): FEMMS - - POP_L ( ESI ) POP_L ( EDI ) - POP_L ( ESI ) RET - ALIGNTEXT16 -GLOBL GLNAME(gl_3dnow_transform_points1_3d_raw) -GLNAME(gl_3dnow_transform_points1_3d_raw): +GLOBL GLNAME( gl_3dnow_transform_points1_2d_raw ) +GLNAME( gl_3dnow_transform_points1_2d_raw ): PUSH_L ( ESI ) - MOV_L ( REGOFF(8, ESP), ECX ) - MOV_L ( REGOFF(12, ESP), ESI ) - MOV_L ( REGOFF(16, ESP), EAX ) - MOV_L ( CONST(3), REGOFF(16, ECX) ) - OR_B ( CONST(7), REGOFF(20, ECX) ) - MOV_L ( REGOFF(8, EAX), EDX ) - MOV_L ( EDX, REGOFF(8, ECX) ) -ALIGNTEXT32 + MOV_L ( ARG_DEST, ECX ) + MOV_L ( ARG_MATRIX, ESI ) + MOV_L ( ARG_SOURCE, EAX ) + MOV_L ( CONST(2), REGOFF(V4F_SIZE, ECX) ) + OR_B ( CONST(VEC_SIZE_2), REGOFF(V4F_FLAGS, ECX) ) + MOV_L ( REGOFF(V4F_COUNT, EAX), EDX ) + MOV_L ( EDX, REGOFF(V4F_COUNT, ECX) ) PUSH_L ( EDI ) - PUSH_L ( ESI ) MOV_L ( REGOFF(4, ECX), EDX ) MOV_L ( ESI, ECX ) - MOV_L ( REGOFF(8, EAX), ESI ) - MOV_L ( REGOFF(12, EAX), EDI ) - MOV_L ( REGOFF(4, EAX), EAX ) - - FEMMS - - CMP_L ( CONST(0), ESI ) - JE ( LLBL(G3TP3R_3) ) - - MOVQ ( REGIND(ECX), MM0 ) /* m01 | m00 */ - MOVD ( REGOFF(8, ECX), MM1 ) /* | m02 */ + MOV_L ( REGOFF(V4F_COUNT, EAX), ESI ) + MOV_L ( REGOFF(V4F_STRIDE, EAX), EDI ) + MOV_L ( REGOFF(V4F_START, EAX), EAX ) - MOVQ ( REGOFF(48, ECX), MM2 ) /* m31 | m30 */ - MOVD ( REGOFF(56, ECX), MM3 ) /* | m32 */ + TEST_L ( ESI, ESI ) + JZ ( LLBL( G3TP2R_3 ) ) + MOVQ ( REGIND(ECX), MM0 ) /* m01 | m00 */ + MOVQ ( REGOFF(48, ECX), MM2 ) /* m31 | m30 */ -ALIGNTEXT32 -LLBL(G3TP3R_2): - - MOVD ( REGIND(EAX), MM4 ) /* | x0 */ - PUNPCKLDQ ( MM4, MM4 ) /* x0 | x0 */ +ALIGNTEXT16 +LLBL( G3TP2R_2 ): - MOVQ ( MM4, MM5 ) /* | x0 */ - PFMUL ( MM0, MM4 ) /* x0*m01 | x0*m00 */ + MOVD ( REGIND(EAX), MM4 ) /* | x0 */ + PUNPCKLDQ ( MM4, MM4 ) /* x0 | x0 */ - PFMUL ( MM1, MM5 ) /* | x0*m02 */ - PFADD ( MM2, MM4 ) /* x0*m01+m31 | x0*m00+m30 */ + PFMUL ( MM0, MM4 ) /* x0*m01 | x0*m00 */ + PFADD ( MM2, MM4 ) /* x0*m01+m31 | x0*m00+m30 */ - PFADD ( MM3, MM5 ) /* | x0*m02+m32 */ - MOVQ ( MM4, REGIND(EDX) ) /* write r1, r0 */ + MOVQ ( MM4, REGIND(EDX) ) /* write r1, r0 */ + ADD_L ( EDI, EAX ) /* next vertex */ - MOVD ( MM5, REGOFF(8, EDX) ) /* write r2 */ - ADD_L ( EDI, EAX ) /* next vertex */ + ADD_L ( CONST(16), EDX ) /* next r */ + DEC_L ( ESI ) /* decrement vertex counter */ - ADD_L ( CONST(16), EDX ) /* next r */ - DEC_L ( ESI ) /* decrement vertex counter */ + JNZ ( LLBL( G3TP2R_2 ) ) /* cnt > 0 ? -> process next vertex */ - JA ( LLBL(G3TP3R_2) ) /* cnt > 0 ? -> process next vertex */ +LLBL( G3TP2R_3 ): -LLBL(G3TP3R_3): FEMMS - - POP_L ( ESI ) POP_L ( EDI ) - POP_L ( ESI ) RET - ALIGNTEXT16 -GLOBL GLNAME(gl_3dnow_transform_points1_3d_no_rot_raw) -GLNAME(gl_3dnow_transform_points1_3d_no_rot_raw): +GLOBL GLNAME( gl_3dnow_transform_points1_2d_no_rot_raw ) +GLNAME( gl_3dnow_transform_points1_2d_no_rot_raw ): PUSH_L ( ESI ) - MOV_L ( REGOFF(8, ESP), ECX ) - MOV_L ( REGOFF(12, ESP), ESI ) - MOV_L ( REGOFF(16, ESP), EAX ) - MOV_L ( CONST(3), REGOFF(16, ECX) ) - OR_B ( CONST(7), REGOFF(20, ECX) ) - MOV_L ( REGOFF(8, EAX), EDX ) - MOV_L ( EDX, REGOFF(8, ECX) ) -ALIGNTEXT32 + MOV_L ( ARG_DEST, ECX ) + MOV_L ( ARG_MATRIX, ESI ) + MOV_L ( ARG_SOURCE, EAX ) + MOV_L ( CONST(2), REGOFF(V4F_SIZE, ECX) ) + OR_B ( CONST(VEC_SIZE_2), REGOFF(V4F_FLAGS, ECX) ) + MOV_L ( REGOFF(V4F_COUNT, EAX), EDX ) + MOV_L ( EDX, REGOFF(V4F_COUNT, ECX) ) PUSH_L ( EDI ) - PUSH_L ( ESI ) MOV_L ( REGOFF(4, ECX), EDX ) MOV_L ( ESI, ECX ) - MOV_L ( REGOFF(8, EAX), ESI ) - MOV_L ( REGOFF(12, EAX), EDI ) - MOV_L ( REGOFF(4, EAX), EAX ) - - FEMMS - - CMP_L ( CONST(0), ESI ) - JE ( LLBL(G3TP3NRR_3) ) + MOV_L ( REGOFF(V4F_COUNT, EAX), ESI ) + MOV_L ( REGOFF(V4F_STRIDE, EAX), EDI ) + MOV_L ( REGOFF(V4F_START, EAX), EAX ) - MOVD ( REGIND(ECX), MM0 ) /* | m00 */ - MOVQ ( REGOFF(48, ECX), MM2 ) /* m31 | m30 */ + TEST_L ( ESI, ESI ) + JZ ( LLBL( G3TP2NRR_3 ) ) - MOVD ( REGOFF(56, ECX), MM3 ) /* | m32 */ + MOVD ( REGIND(ECX), MM0 ) /* | m00 */ + MOVQ ( REGOFF(48, ECX), MM2 ) /* m31 | m30 */ -ALIGNTEXT32 -LLBL(G3TP3NRR_2): +ALIGNTEXT16 +LLBL( G3TP2NRR_2 ): - MOVD ( REGIND(EAX), MM4 ) /* | x0 */ - PFMUL ( MM0, MM4 ) /* | x0*m00 */ + MOVD ( REGIND(EAX), MM4 ) /* | x0 */ + ADD_L ( EDI, EAX ) /* next vertex */ - PFADD ( MM2, MM4 ) /* m31 | x0*m00+m30 */ - MOVQ ( MM4, REGIND(EDX) ) /* write r1, r0 */ + PFMUL ( MM0, MM4 ) /* | x0*m00 */ + PFADD ( MM2, MM4 ) /* m31 | x0*m00+m30 */ - MOVD ( MM3, REGOFF(8, EDX) ) /* write r2 */ - ADD_L ( EDI, EAX ) /* next vertex */ + MOVQ ( MM4, REGIND(EDX) ) /* write r1, r0 */ + ADD_L ( CONST(16), EDX ) /* next r */ - ADD_L ( CONST(16), EDX ) /* next r */ - DEC_L ( ESI ) /* decrement vertex counter */ + DEC_L ( ESI ) /* decrement vertex counter */ + JNZ ( LLBL( G3TP2NRR_2 ) ) /* cnt > 0 ? -> process next vertex */ - JA ( LLBL(G3TP3NRR_2) ) /* cnt > 0 ? -> process next vertex */ +LLBL( G3TP2NRR_3 ): -LLBL(G3TP3NRR_3): FEMMS - - POP_L ( ESI ) POP_L ( EDI ) - POP_L ( ESI ) RET - ALIGNTEXT16 -GLOBL GLNAME(gl_3dnow_transform_points1_perspective_raw) -GLNAME(gl_3dnow_transform_points1_perspective_raw): +GLOBL GLNAME( gl_3dnow_transform_points1_3d_raw ) +GLNAME( gl_3dnow_transform_points1_3d_raw ): PUSH_L ( ESI ) - MOV_L ( REGOFF(8, ESP), ECX ) - MOV_L ( REGOFF(12, ESP), ESI ) - MOV_L ( REGOFF(16, ESP), EAX ) - MOV_L ( CONST(4), REGOFF(16, ECX) ) - OR_B ( CONST(15), REGOFF(20, ECX) ) - MOV_L ( REGOFF(8, EAX), EDX ) - MOV_L ( EDX, REGOFF(8, ECX) ) -ALIGNTEXT32 + MOV_L ( ARG_DEST, ECX ) + MOV_L ( ARG_MATRIX, ESI ) + MOV_L ( ARG_SOURCE, EAX ) + MOV_L ( CONST(3), REGOFF(V4F_SIZE, ECX) ) + OR_B ( CONST(VEC_SIZE_3), REGOFF(V4F_FLAGS, ECX) ) + MOV_L ( REGOFF(V4F_COUNT, EAX), EDX ) + MOV_L ( EDX, REGOFF(V4F_COUNT, ECX) ) PUSH_L ( EDI ) - PUSH_L ( ESI ) MOV_L ( REGOFF(4, ECX), EDX ) MOV_L ( ESI, ECX ) - MOV_L ( REGOFF(8, EAX), ESI ) - MOV_L ( REGOFF(12, EAX), EDI ) - MOV_L ( REGOFF(4, EAX), EAX ) - - FEMMS + MOV_L ( REGOFF(V4F_COUNT, EAX), ESI ) + MOV_L ( REGOFF(V4F_STRIDE, EAX), EDI ) + MOV_L ( REGOFF(V4F_START, EAX), EAX ) - CMP_L ( CONST(0), ESI ) - JE ( LLBL(G3TPPR_3) ) + TEST_L ( ESI, ESI ) + JZ ( LLBL( G3TP3R_3 ) ) - MOVD ( REGIND(ECX), MM0 ) /* | m00 */ - MOVD ( REGOFF(56, ECX), MM3 ) /* | m32 */ + MOVQ ( REGIND(ECX), MM0 ) /* m01 | m00 */ + MOVD ( REGOFF(8, ECX), MM1 ) /* | m02 */ -ALIGNTEXT32 -LLBL(G3TPPR_2): - MOVD ( REGIND(EAX), MM4 ) /* 0 | x0 */ - PFMUL ( MM0, MM4 ) /* 0 | x0*m00 */ + MOVQ ( REGOFF(48, ECX), MM2 ) /* m31 | m30 */ + MOVD ( REGOFF(56, ECX), MM3 ) /* | m32 */ - MOVQ ( MM4, REGIND(EDX) ) /* write r1, r0 */ - MOVQ ( MM3, REGOFF(8, EDX) ) /* write r2 (=m32), r3 (=0) */ - - ADD_L ( EDI, EAX ) /* next vertex */ - ADD_L ( CONST(16), EDX ) /* next r */ - - DEC_L ( ESI ) /* decrement vertex counter */ - JA ( LLBL(G3TPPR_2) ) /* cnt > 0 ? -> process next vertex */ +ALIGNTEXT16 +LLBL( G3TP3R_2 ): -LLBL(G3TPPR_3): - FEMMS + MOVD ( REGIND(EAX), MM4 ) /* | x0 */ + PUNPCKLDQ ( MM4, MM4 ) /* x0 | x0 */ - POP_L ( ESI ) - POP_L ( EDI ) + MOVQ ( MM4, MM5 ) /* | x0 */ + PFMUL ( MM0, MM4 ) /* x0*m01 | x0*m00 */ - POP_L ( ESI ) - RET + PFMUL ( MM1, MM5 ) /* | x0*m02 */ + PFADD ( MM2, MM4 ) /* x0*m01+m31 | x0*m00+m30 */ + PFADD ( MM3, MM5 ) /* | x0*m02+m32 */ + MOVQ ( MM4, REGIND(EDX) ) /* write r1, r0 */ + MOVD ( MM5, REGOFF(8, EDX) ) /* write r2 */ + ADD_L ( EDI, EAX ) /* next vertex */ + ADD_L ( CONST(16), EDX ) /* next r */ + DEC_L ( ESI ) /* decrement vertex counter */ + JNZ ( LLBL( G3TP3R_2 ) ) /* cnt > 0 ? -> process next vertex */ +LLBL( G3TP3R_3 ): + FEMMS + POP_L ( EDI ) + POP_L ( ESI ) + RET Index: xc/extras/Mesa/src/X86/3dnow_xform_raw2.S diff -u xc/extras/Mesa/src/X86/3dnow_xform_raw2.S:1.2 xc/extras/Mesa/src/X86/3dnow_xform_raw2.S:1.4 --- xc/extras/Mesa/src/X86/3dnow_xform_raw2.S:1.2 Fri Jun 16 20:02:41 2000 +++ xc/extras/Mesa/src/X86/3dnow_xform_raw2.S Mon Nov 13 18:31:08 2000 @@ -1,142 +1,165 @@ + +/* + * Mesa 3-D graphics library + * Version: 3.4 + * + * Copyright (C) 1999-2000 Brian Paul All Rights Reserved. + * + * 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 + * BRIAN PAUL 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 "assyntax.h" +#include "xform_args.h" + + SEG_TEXT - SEG_TEXT +#define FRAME_OFFSET 4 ALIGNTEXT16 -GLOBL GLNAME(gl_3dnow_transform_points2_general_raw) -GLNAME(gl_3dnow_transform_points2_general_raw): +GLOBL GLNAME( gl_3dnow_transform_points2_general_raw ) +GLNAME( gl_3dnow_transform_points2_general_raw ): PUSH_L ( ESI ) - MOV_L ( REGOFF(8, ESP), ECX ) - MOV_L ( REGOFF(12, ESP), ESI ) - MOV_L ( REGOFF(16, ESP), EAX ) - MOV_L ( CONST(4), REGOFF(16, ECX) ) - OR_B ( CONST(15), REGOFF(20, ECX) ) - MOV_L ( REGOFF(8, EAX), EDX ) - MOV_L ( EDX, REGOFF(8, ECX) ) -ALIGNTEXT32 + MOV_L ( ARG_DEST, ECX ) + MOV_L ( ARG_MATRIX, ESI ) + MOV_L ( ARG_SOURCE, EAX ) + MOV_L ( CONST(4), REGOFF(V4F_SIZE, ECX) ) + OR_B ( CONST(VEC_SIZE_4), REGOFF(V4F_FLAGS, ECX) ) + MOV_L ( REGOFF(V4F_COUNT, EAX), EDX ) + MOV_L ( EDX, REGOFF(V4F_COUNT, ECX) ) PUSH_L ( EDI ) - PUSH_L ( ESI ) - MOV_L ( REGOFF(4, ECX), EDX ) + MOV_L ( REGOFF(V4F_START, ECX), EDX ) MOV_L ( ESI, ECX ) - MOV_L ( REGOFF(8, EAX), ESI ) - MOV_L ( REGOFF(12, EAX), EDI ) - MOV_L ( REGOFF(4, EAX), EAX ) - - FEMMS + MOV_L ( REGOFF(V4F_COUNT, EAX), ESI ) + MOV_L ( REGOFF(V4F_STRIDE, EAX), EDI ) + MOV_L ( REGOFF(V4F_START, EAX), EAX ) - CMP_L ( CONST(0), ESI ) - JE ( LLBL(G3TPGR_3) ) + TEST_L ( ESI, ESI ) + JZ ( LLBL( G3TPGR_3 ) ) - MOVD ( REGIND(ECX), MM0 ) /* | m00 */ - PUNPCKLDQ ( REGOFF(16, ECX), MM0 ) /* m10 | m00 */ + MOVD ( REGIND(ECX), MM0 ) /* | m00 */ + PUNPCKLDQ ( REGOFF(16, ECX), MM0 ) /* m10 | m00 */ - MOVD ( REGOFF(4, ECX), MM1 ) /* | m01 */ - PUNPCKLDQ ( REGOFF(20, ECX), MM1 ) /* m11 | m01 */ + MOVD ( REGOFF(4, ECX), MM1 ) /* | m01 */ + PUNPCKLDQ ( REGOFF(20, ECX), MM1 ) /* m11 | m01 */ - MOVD ( REGOFF(8, ECX), MM2 ) /* | m02 */ - PUNPCKLDQ ( REGOFF(24, ECX), MM2 ) /* m12 | m02 */ + MOVD ( REGOFF(8, ECX), MM2 ) /* | m02 */ + PUNPCKLDQ ( REGOFF(24, ECX), MM2 ) /* m12 | m02 */ - MOVD ( REGOFF(12, ECX), MM3 ) /* | m03 */ - PUNPCKLDQ ( REGOFF(28, ECX), MM3 ) /* m13 | m03 */ + MOVD ( REGOFF(12, ECX), MM3 ) /* | m03 */ + PUNPCKLDQ ( REGOFF(28, ECX), MM3 ) /* m13 | m03 */ - MOVQ ( REGOFF(48, ECX), MM4 ) /* m31 | m30 */ - MOVQ ( REGOFF(56, ECX), MM5 ) /* m33 | m32 */ + MOVQ ( REGOFF(48, ECX), MM4 ) /* m31 | m30 */ + MOVQ ( REGOFF(56, ECX), MM5 ) /* m33 | m32 */ +ALIGNTEXT16 +LLBL( G3TPGR_2 ): -ALIGNTEXT32 -LLBL(G3TPGR_2): + MOVQ ( REGIND(EAX), MM6 ) /* x1 | x0 */ + MOVQ ( MM6, MM7 ) /* x1 | x0 */ - MOVQ ( REGIND(EAX), MM6 ) /* x1 | x0 */ - MOVQ ( MM6, MM7 ) /* x1 | x0 */ + PFMUL ( MM0, MM6 ) /* x1*m10 | x0*m00 */ + PFMUL ( MM1, MM7 ) /* x1*m11 | x0*m01 */ - PFMUL ( MM0, MM6 ) /* x1*m10 | x0*m00 */ - PFMUL ( MM1, MM7 ) /* x1*m11 | x0*m01 */ + PFACC ( MM7, MM6 ) /* x0*m01+x1*m11 | x0*x00+x1*m10 */ + PFADD ( MM4, MM6 ) /* x0*...*m11+m31 | x0*...*m10+m30 */ - PFACC ( MM7, MM6 ) /* x0*m01+x1*m11 | x0*x00+x1*m10 */ - PFADD ( MM4, MM6 ) /* x0*...*m11+m31| x0*x00+x1*m10+m30 */ + MOVQ ( MM6, REGIND(EDX) ) /* write r1, r0 */ + MOVQ ( REGIND(EAX), MM6 ) /* x1 | x0 */ - MOVQ ( MM6, REGIND(EDX) ) /* write r1, r0 */ - MOVQ ( REGIND(EAX), MM6 ) /* x1 | x0 */ + MOVQ ( MM6, MM7 ) /* x1 | x0 */ + PFMUL ( MM2, MM6 ) /* x1*m12 | x0*m02 */ - MOVQ ( MM6, MM7 ) /* x1 | x0 */ - PFMUL ( MM2, MM6 ) /* x1*m12 | x0*m02 */ + PFMUL ( MM3, MM7 ) /* x1*m13 | x0*m03 */ + ADD_L ( EDI, EAX ) /* next vertex */ - PFMUL ( MM3, MM7 ) /* x1*m13 | x0*m03 */ - ADD_L ( EDI, EAX ) /* next vertex */ + PFACC ( MM7, MM6 ) /* x0*m03+x1*m13 | x0*x02+x1*m12 */ + PFADD ( MM5, MM6 ) /* x0*...*m13+m33 | x0*...*m12+m32 */ - PFACC ( MM7, MM6 ) /* x0*m03+x1*m13 | x0*x02+x1*m12 */ - PFADD ( MM5, MM6 ) /* x0*...*m13+m33| x0*x02+x1*m12+m32 */ + MOVQ ( MM6, REGOFF(8, EDX) ) /* write r3, r2 */ + ADD_L ( CONST(16), EDX ) /* next r */ - MOVQ ( MM6, REGOFF(8, EDX) ) /* write r3, r2 */ - ADD_L ( CONST(16), EDX ) /* next r */ + DEC_L ( ESI ) /* decrement vertex counter */ + JNZ ( LLBL( G3TPGR_2 ) ) /* cnt > 0 ? -> process next vertex */ - DEC_L ( ESI ) /* decrement vertex counter */ - JA ( LLBL(G3TPGR_2) ) /* cnt > 0 ? -> process next vertex */ +LLBL( G3TPGR_3 ): -LLBL(G3TPGR_3): FEMMS - - POP_L ( ESI ) POP_L ( EDI ) - POP_L ( ESI ) RET - - ALIGNTEXT16 -GLOBL GLNAME(gl_3dnow_transform_points2_identity_raw) -GLNAME(gl_3dnow_transform_points2_identity_raw): +GLOBL GLNAME( gl_3dnow_transform_points2_perspective_raw ) +GLNAME( gl_3dnow_transform_points2_perspective_raw ): PUSH_L ( ESI ) - MOV_L ( REGOFF(8, ESP), ECX ) - MOV_L ( REGOFF(12, ESP), ESI ) - MOV_L ( REGOFF(16, ESP), EAX ) - MOV_L ( CONST(2), REGOFF(16, ECX) ) - OR_B ( CONST(3), REGOFF(20, ECX) ) - MOV_L ( REGOFF(8, EAX), EDX ) - MOV_L ( EDX, REGOFF(8, ECX) ) -ALIGNTEXT32 + MOV_L ( ARG_DEST, ECX ) + MOV_L ( ARG_MATRIX, ESI ) + MOV_L ( ARG_SOURCE, EAX ) + MOV_L ( CONST(4), REGOFF(V4F_SIZE, ECX) ) + OR_B ( CONST(VEC_SIZE_4), REGOFF(V4F_FLAGS, ECX) ) + MOV_L ( REGOFF(V4F_COUNT, EAX), EDX ) + MOV_L ( EDX, REGOFF(V4F_COUNT, ECX) ) PUSH_L ( EDI ) - PUSH_L ( ESI ) - MOV_L ( REGOFF(4, ECX), EDX ) + MOV_L ( REGOFF(V4F_START, ECX), EDX ) MOV_L ( ESI, ECX ) - MOV_L ( REGOFF(8, EAX), ESI ) - MOV_L ( REGOFF(12, EAX), EDI ) - MOV_L ( REGOFF(4, EAX), EAX ) + MOV_L ( REGOFF(V4F_COUNT, EAX), ESI ) + MOV_L ( REGOFF(V4F_STRIDE, EAX), EDI ) + MOV_L ( REGOFF(V4F_START, EAX), EAX ) - FEMMS + TEST_L ( ESI, ESI ) + JZ ( LLBL( G3TPPR_3 ) ) - CMP_L ( CONST(0), ESI ) - JE ( LLBL(G3TPIR_3) ) + MOVD ( REGIND(ECX), MM0 ) /* | m00 */ + PUNPCKLDQ ( REGOFF(20, ECX), MM0 ) /* m11 | m00 */ -LLBL(G3TPIR_3): - MOVQ ( REGIND(EAX), MM0 ) /* x1 | x0 */ - ADD_L ( EDI, EAX ) /* next vertex */ + MOVD ( REGOFF(56, ECX), MM3 ) /* | m32 */ - MOVQ ( MM0, REGIND(EDX) ) /* r1 | r0 */ - ADD_L ( CONST(16), EDX ) /* next r */ +ALIGNTEXT16 +LLBL( G3TPPR_2 ): - DEC_L ( ESI ) /* decrement vertex counter */ - JA ( LLBL(G3TPIR_3) ) /* cnt > 0 ? -> process next vertex */ + MOVQ ( REGIND(EAX), MM4 ) /* x1 | x0 */ + PFMUL ( MM0, MM4 ) /* x1*m11 | x0*m00 */ -LLBL(G3TPIR_4): - FEMMS + MOVQ ( MM4, REGIND(EDX) ) /* write r1, r0 */ + MOVQ ( MM3, REGOFF(8, EDX) ) /* write r2 (=m32), r3 (=0) */ - POP_L ( ESI ) - POP_L ( EDI ) + ADD_L ( EDI, EAX ) /* next vertex */ + ADD_L ( CONST(16), EDX ) /* next r */ + + DEC_L ( ESI ) /* decrement vertex counter */ + JNZ ( LLBL( G3TPPR_2 ) ) /* cnt > 0 ? -> process next vertex */ +LLBL( G3TPPR_3 ): + + FEMMS + POP_L ( EDI ) POP_L ( ESI ) RET @@ -144,68 +167,75 @@ ALIGNTEXT16 -GLOBL GLNAME(gl_3dnow_transform_points2_2d_raw) -GLNAME(gl_3dnow_transform_points2_2d_raw): +GLOBL GLNAME( gl_3dnow_transform_points2_3d_raw ) +GLNAME( gl_3dnow_transform_points2_3d_raw ): PUSH_L ( ESI ) - MOV_L ( REGOFF(8, ESP), ECX ) - MOV_L ( REGOFF(12, ESP), ESI ) - MOV_L ( REGOFF(16, ESP), EAX ) - MOV_L ( CONST(2), REGOFF(16, ECX) ) - OR_B ( CONST(3), REGOFF(20, ECX) ) - MOV_L ( REGOFF(8, EAX), EDX ) - MOV_L ( EDX, REGOFF(8, ECX) ) -ALIGNTEXT32 + MOV_L ( ARG_DEST, ECX ) + MOV_L ( ARG_MATRIX, ESI ) + MOV_L ( ARG_SOURCE, EAX ) + MOV_L ( CONST(3), REGOFF(V4F_SIZE, ECX) ) + OR_B ( CONST(VEC_SIZE_3 ), REGOFF(V4F_FLAGS, ECX) ) + MOV_L ( REGOFF(V4F_COUNT, EAX), EDX ) + MOV_L ( EDX, REGOFF(V4F_COUNT, ECX) ) PUSH_L ( EDI ) - PUSH_L ( ESI ) - MOV_L ( REGOFF(4, ECX), EDX ) + MOV_L ( REGOFF(V4F_START, ECX), EDX ) MOV_L ( ESI, ECX ) - MOV_L ( REGOFF(8, EAX), ESI ) - MOV_L ( REGOFF(12, EAX), EDI ) - MOV_L ( REGOFF(4, EAX), EAX ) + MOV_L ( REGOFF(V4F_COUNT, EAX), ESI ) + MOV_L ( REGOFF(V4F_STRIDE, EAX), EDI ) + MOV_L ( REGOFF(V4F_START, EAX), EAX ) - FEMMS + TEST_L ( ESI, ESI ) + JZ ( LLBL( G3TP3R_3 ) ) - CMP_L ( CONST(0), ESI ) - JE ( LLBL(G3TP2R_3) ) + MOVD ( REGIND(ECX), MM0 ) /* | m00 */ + PUNPCKLDQ ( REGOFF(16, ECX), MM0 ) /* m10 | m00 */ - MOVQ ( REGIND(ECX), MM0 ) /* m01 | m00 */ - MOVQ ( REGOFF(16, ECX), MM1 ) /* m11 | m10 */ + MOVD ( REGOFF(4, ECX), MM1 ) /* | m01 */ + PUNPCKLDQ ( REGOFF(20, ECX), MM1 ) /* m11 | m01 */ - MOVQ ( REGOFF(48, ECX), MM2 ) /* m31 | m30 */ + MOVD ( REGOFF(8, ECX), MM2 ) /* | m02 */ + PUNPCKLDQ ( REGOFF(24, ECX), MM2 ) /* m12 | m02 */ -ALIGNTEXT32 -LLBL(G3TP2R_2): + MOVQ ( REGOFF(48, ECX), MM4 ) /* m31 | m30 */ + MOVD ( REGOFF(56, ECX), MM5 ) /* | m32 */ - MOVD ( REGIND(EAX), MM4 ) /* | x0 */ - MOVD ( REGOFF(4, EAX), MM5 ) /* | x1 */ +ALIGNTEXT16 +LLBL( G3TP3R_2 ): - PUNPCKLDQ ( MM4, MM4 ) /* x0 | x0 */ - ADD_L ( EDI, EAX ) /* next vertex */ + MOVQ ( REGIND(EAX), MM6 ) /* x1 | x0 */ + MOVQ ( MM6, MM7 ) /* x1 | x0 */ - PFMUL ( MM0, MM4 ) /* x0*m01 | x0*m00 */ - PUNPCKLDQ ( MM5, MM5 ) /* x1 | x1 */ + PFMUL ( MM0, MM6 ) /* x1*m10 | x0*m00 */ + PFMUL ( MM1, MM7 ) /* x1*m11 | x0*m01 */ - PFMUL ( MM1, MM5 ) /* x1*m11 | x1*m10 */ - PFADD ( MM2, MM4 ) /* x...x1*m11+31 | x0*m00+x1*m10+m30 */ + PFACC ( MM7, MM6 ) /* x0*m01+x1*m11 | x0*x00+x1*m10 */ + PFADD ( MM4, MM6 ) /* x0*...*m11+m31 | x0*...*m10+m30 */ - PFADD ( MM5, MM4 ) /* x0*m01+x1*m11 | x0*m00+x1*m10 */ - MOVQ ( MM4, REGIND(EDX) ) /* write r1, r0 */ + MOVQ ( MM6, REGIND(EDX) ) /* write r1, r0 */ + MOVQ ( REGIND(EAX), MM6 ) /* x1 | x0 */ - ADD_L ( CONST(16), EDX ) /* next r */ - DEC_L ( ESI ) /* decrement vertex counter */ + MOVQ ( MM6, MM7 ) /* x1 | x0 */ + PFMUL ( MM2, MM6 ) /* x1*m12 | x0*m02 */ - JA ( LLBL(G3TP2R_2) ) /* cnt > 0 ? -> process next vertex */ + PFACC ( MM7, MM6 ) /* ***trash*** | x0*x02+x1*m12 */ + PFADD ( MM5, MM6 ) /* ***trash*** | x0*...*m12+m32 */ -LLBL(G3TP2R_3): - FEMMS + MOVD ( MM6, REGOFF(8, EDX) ) /* write r2 */ + ADD_L ( EDI, EAX ) /* next vertex */ - POP_L ( ESI ) - POP_L ( EDI ) + ADD_L ( CONST(16), EDX ) /* next r */ + DEC_L ( ESI ) /* decrement vertex counter */ + JNZ ( LLBL( G3TP3R_2 ) ) /* cnt > 0 ? -> process next vertex */ + +LLBL( G3TP3R_3 ): + + FEMMS + POP_L ( EDI ) POP_L ( ESI ) RET @@ -213,144 +243,120 @@ ALIGNTEXT16 -GLOBL GLNAME(gl_3dnow_transform_points2_2d_no_rot_raw) -GLNAME(gl_3dnow_transform_points2_2d_no_rot_raw): +GLOBL GLNAME( gl_3dnow_transform_points2_3d_no_rot_raw ) +GLNAME( gl_3dnow_transform_points2_3d_no_rot_raw ): PUSH_L ( ESI ) - MOV_L ( REGOFF(8, ESP), ECX ) - MOV_L ( REGOFF(12, ESP), ESI ) - MOV_L ( REGOFF(16, ESP), EAX ) - MOV_L ( CONST(2), REGOFF(16, ECX) ) - OR_B ( CONST(3), REGOFF(20, ECX) ) - MOV_L ( REGOFF(8, EAX), EDX ) - MOV_L ( EDX, REGOFF(8, ECX) ) -ALIGNTEXT32 + MOV_L ( ARG_DEST, ECX ) + MOV_L ( ARG_MATRIX, ESI ) + MOV_L ( ARG_SOURCE, EAX ) + MOV_L ( CONST(3), REGOFF(V4F_SIZE, ECX) ) + OR_B ( CONST(VEC_SIZE_3 ), REGOFF(V4F_FLAGS, ECX) ) + MOV_L ( REGOFF(V4F_COUNT, EAX), EDX ) + MOV_L ( EDX, REGOFF(V4F_COUNT, ECX) ) PUSH_L ( EDI ) - PUSH_L ( ESI ) - MOV_L ( REGOFF(4, ECX), EDX ) + MOV_L ( REGOFF(V4F_START, ECX), EDX ) MOV_L ( ESI, ECX ) - MOV_L ( REGOFF(8, EAX), ESI ) - MOV_L ( REGOFF(12, EAX), EDI ) - MOV_L ( REGOFF(4, EAX), EAX ) + MOV_L ( REGOFF(V4F_COUNT, EAX), ESI ) + MOV_L ( REGOFF(V4F_STRIDE, EAX), EDI ) + MOV_L ( REGOFF(V4F_START, EAX), EAX ) - FEMMS + TEST_L ( ESI, ESI ) + JZ ( LLBL( G3TP3NRR_3 ) ) - CMP_L ( CONST(0), ESI ) - JE ( LLBL(G3TP2NRR_3) ) + MOVD ( REGIND(ECX), MM0 ) /* | m00 */ + PUNPCKLDQ ( REGOFF(20, ECX), MM0 ) /* m11 | m00 */ - MOVD ( REGIND(ECX), MM0 ) /* | m00 */ - PUNPCKLDQ ( REGOFF(20, ECX), MM0 ) /* m11 | m00 */ + MOVQ ( REGOFF(48, ECX), MM2 ) /* m31 | m30 */ + MOVD ( REGOFF(56, ECX), MM3 ) /* | m32 */ - MOVQ ( REGOFF(48, ECX), MM2 ) /* m31 | m30 */ +ALIGNTEXT16 +LLBL( G3TP3NRR_2 ): -ALIGNTEXT32 -LLBL(G3TP2NRR_2): + MOVQ ( REGIND(EAX), MM4 ) /* x1 | x0 */ + PFMUL ( MM0, MM4 ) /* x1*m11 | x0*m00 */ - MOVQ ( REGIND(EAX), MM4 ) /* x1 | x0 */ - ADD_L ( EDI, EAX ) /* next vertex */ + PFADD ( MM2, MM4 ) /* x1*m11+m31 | x0*m00+m30 */ + MOVQ ( MM4, REGIND(EDX) ) /* write r1, r0 */ - PFMUL ( MM0, MM4 ) /* x1*m11 | x0*m00 */ - PFADD ( MM2, MM4 ) /* m31 | x0*m00+m30 */ + MOVD ( MM3, REGOFF(8, EDX) ) /* write r2 */ + ADD_L ( EDI, EAX ) /* next vertex */ - MOVQ ( MM4, REGIND(EDX) ) /* write r1, r0 */ - ADD_L ( CONST(16), EDX ) /* next r */ + ADD_L ( CONST(16), EDX ) /* next r */ + DEC_L ( ESI ) /* decrement vertex counter */ - DEC_L ( ESI ) /* decrement vertex counter */ - JA ( LLBL(G3TP2NRR_2) ) /* cnt > 0 ? -> process next vertex */ + JNZ ( LLBL( G3TP3NRR_2 ) ) /* cnt > 0 ? -> process next vertex */ -LLBL(G3TP2NRR_3): - FEMMS +LLBL( G3TP3NRR_3 ): - POP_L ( ESI ) + FEMMS POP_L ( EDI ) - POP_L ( ESI ) RET - ALIGNTEXT16 -GLOBL GLNAME(gl_3dnow_transform_points2_3d_raw) -GLNAME(gl_3dnow_transform_points2_3d_raw): +GLOBL GLNAME( gl_3dnow_transform_points2_2d_raw ) +GLNAME( gl_3dnow_transform_points2_2d_raw ): PUSH_L ( ESI ) - MOV_L ( REGOFF(8, ESP), ECX ) - MOV_L ( REGOFF(12, ESP), ESI ) - MOV_L ( REGOFF(16, ESP), EAX ) - MOV_L ( CONST(3), REGOFF(16, ECX) ) - OR_B ( CONST(7), REGOFF(20, ECX) ) - MOV_L ( REGOFF(8, EAX), EDX ) - MOV_L ( EDX, REGOFF(8, ECX) ) -ALIGNTEXT32 + MOV_L ( ARG_DEST, ECX ) + MOV_L ( ARG_MATRIX, ESI ) + MOV_L ( ARG_SOURCE, EAX ) + MOV_L ( CONST(2), REGOFF(V4F_SIZE, ECX) ) + OR_B ( CONST(VEC_SIZE_2), REGOFF(V4F_FLAGS, ECX) ) + MOV_L ( REGOFF(V4F_COUNT, EAX), EDX ) + MOV_L ( EDX, REGOFF(V4F_COUNT, ECX) ) PUSH_L ( EDI ) - PUSH_L ( ESI ) - MOV_L ( REGOFF(4, ECX), EDX ) + MOV_L ( REGOFF(V4F_START, ECX), EDX ) MOV_L ( ESI, ECX ) - MOV_L ( REGOFF(8, EAX), ESI ) - MOV_L ( REGOFF(12, EAX), EDI ) - MOV_L ( REGOFF(4, EAX), EAX ) - - FEMMS - - CMP_L ( CONST(0), ESI ) - JE ( LLBL(G3TP3R_3) ) - - MOVD ( REGIND(ECX), MM0 ) /* | m00 */ - PUNPCKLDQ ( REGOFF(16, ECX), MM0 ) /* m10 | m00 */ - - MOVD ( REGOFF(4, ECX), MM1 ) /* | m01 */ - PUNPCKLDQ ( REGOFF(20, ECX), MM1 ) /* m11 | m01 */ + MOV_L ( REGOFF(V4F_COUNT, EAX), ESI ) + MOV_L ( REGOFF(V4F_STRIDE, EAX), EDI ) + MOV_L ( REGOFF(V4F_START, EAX), EAX ) - MOVD ( REGOFF(8, ECX), MM2 ) /* | m02 */ - PUNPCKLDQ ( REGOFF(24, ECX), MM2 ) /* m12 | m02 */ + TEST_L ( ESI, ESI ) + JZ ( LLBL( G3TP2R_3 ) ) - MOVQ ( REGOFF(48, ECX), MM4 ) /* m31 | m30 */ - MOVD ( REGOFF(56, ECX), MM5 ) /* | m32 */ + MOVQ ( REGIND(ECX), MM0 ) /* m01 | m00 */ + MOVQ ( REGOFF(16, ECX), MM1 ) /* m11 | m10 */ + MOVQ ( REGOFF(48, ECX), MM2 ) /* m31 | m30 */ -ALIGNTEXT32 -LLBL(G3TP3R_2): - - MOVQ ( REGIND(EAX), MM6 ) /* x1 | x0 */ - MOVQ ( MM6, MM7 ) /* x1 | x0 */ +ALIGNTEXT16 +LLBL( G3TP2R_2 ): - PFMUL ( MM0, MM6 ) /* x1*m10 | x0*m00 */ - PFMUL ( MM1, MM7 ) /* x1*m11 | x0*m01 */ + MOVD ( REGIND(EAX), MM4 ) /* | x0 */ + MOVD ( REGOFF(4, EAX), MM5 ) /* | x1 */ - PFACC ( MM7, MM6 ) /* x0*m01+x1*m11 | x0*x00+x1*m10 */ - PFADD ( MM4, MM6 ) /* x0*...*m11+m31| x0*x00+x1*m10+m30 */ + PUNPCKLDQ ( MM4, MM4 ) /* x0 | x0 */ + ADD_L ( EDI, EAX ) /* next vertex */ - MOVQ ( MM6, REGIND(EDX) ) /* write r1, r0 */ - MOVQ ( REGIND(EAX), MM6 ) /* x1 | x0 */ + PFMUL ( MM0, MM4 ) /* x0*m01 | x0*m00 */ + PUNPCKLDQ ( MM5, MM5 ) /* x1 | x1 */ - MOVQ ( MM6, MM7 ) /* x1 | x0 */ - PFMUL ( MM2, MM6 ) /* x1*m12 | x0*m02 */ + PFMUL ( MM1, MM5 ) /* x1*m11 | x1*m10 */ + PFADD ( MM2, MM4 ) /* x...x1*m11+31 | x0*..*m10+m30 */ - PFACC ( MM7, MM6 ) /* ***trash*** | x0*x02+x1*m12 */ - PFADD ( MM5, MM6 ) /* ***trash*** | x0*x02+x1*m12+m32 */ + PFADD ( MM5, MM4 ) /* x0*m01+x1*m11 | x0*m00+x1*m10 */ + MOVQ ( MM4, REGIND(EDX) ) /* write r1, r0 */ - MOVD ( MM6, REGOFF(8, EDX) ) /* write r2 */ - ADD_L ( EDI, EAX ) /* next vertex */ + ADD_L ( CONST(16), EDX ) /* next r */ + DEC_L ( ESI ) /* decrement vertex counter */ - ADD_L ( CONST(16), EDX ) /* next r */ - DEC_L ( ESI ) /* decrement vertex counter */ + JNZ ( LLBL( G3TP2R_2 ) ) /* cnt > 0 ? -> process next vertex */ - JA ( LLBL(G3TP3R_2) ) /* cnt > 0 ? -> process next vertex */ +LLBL( G3TP2R_3 ): -LLBL(G3TP3R_3): FEMMS - - POP_L ( ESI ) POP_L ( EDI ) - POP_L ( ESI ) RET @@ -358,129 +364,100 @@ ALIGNTEXT16 -GLOBL GLNAME(gl_3dnow_transform_points2_3d_no_rot_raw) -GLNAME(gl_3dnow_transform_points2_3d_no_rot_raw): +GLOBL GLNAME( gl_3dnow_transform_points2_2d_no_rot_raw ) +GLNAME( gl_3dnow_transform_points2_2d_no_rot_raw ): PUSH_L ( ESI ) - MOV_L ( REGOFF(8, ESP), ECX ) - MOV_L ( REGOFF(12, ESP), ESI ) - MOV_L ( REGOFF(16, ESP), EAX ) - MOV_L ( CONST(3), REGOFF(16, ECX) ) - OR_B ( CONST(7), REGOFF(20, ECX) ) - MOV_L ( REGOFF(8, EAX), EDX ) - MOV_L ( EDX, REGOFF(8, ECX) ) -ALIGNTEXT32 + MOV_L ( ARG_DEST, ECX ) + MOV_L ( ARG_MATRIX, ESI ) + MOV_L ( ARG_SOURCE, EAX ) + MOV_L ( CONST(2), REGOFF(V4F_SIZE, ECX) ) + OR_B ( CONST(VEC_SIZE_2), REGOFF(V4F_FLAGS, ECX) ) + MOV_L ( REGOFF(V4F_COUNT, EAX), EDX ) + MOV_L ( EDX, REGOFF(V4F_COUNT, ECX) ) PUSH_L ( EDI ) - PUSH_L ( ESI ) - MOV_L ( REGOFF(4, ECX), EDX ) + MOV_L ( REGOFF(V4F_START, ECX), EDX ) MOV_L ( ESI, ECX ) - MOV_L ( REGOFF(8, EAX), ESI ) - MOV_L ( REGOFF(12, EAX), EDI ) - MOV_L ( REGOFF(4, EAX), EAX ) - - FEMMS - - CMP_L ( CONST(0), ESI ) - JE ( LLBL(G3TP3NRR_3) ) + MOV_L ( REGOFF(V4F_COUNT, EAX), ESI ) + MOV_L ( REGOFF(V4F_STRIDE, EAX), EDI ) + MOV_L ( REGOFF(V4F_START, EAX), EAX ) - MOVD ( REGIND(ECX), MM0 ) /* | m00 */ - PUNPCKLDQ ( REGOFF(20, ECX), MM0 ) /* m11 | m00 */ + TEST_L ( ESI, ESI ) + JZ ( LLBL( G3TP2NRR_3 ) ) - MOVQ ( REGOFF(48, ECX), MM2 ) /* m31 | m30 */ - MOVD ( REGOFF(56, ECX), MM3 ) /* | m32 */ + MOVD ( REGIND(ECX), MM0 ) /* | m00 */ + PUNPCKLDQ ( REGOFF(20, ECX), MM0 ) /* m11 | m00 */ + MOVQ ( REGOFF(48, ECX), MM2 ) /* m31 | m30 */ -ALIGNTEXT32 -LLBL(G3TP3NRR_2): +ALIGNTEXT16 +LLBL( G3TP2NRR_2 ): - MOVQ ( REGIND(EAX), MM4 ) /* x1 | x0 */ - PFMUL ( MM0, MM4 ) /* x1*m11 | x0*m00 */ + MOVQ ( REGIND(EAX), MM4 ) /* x1 | x0 */ + ADD_L ( EDI, EAX ) /* next vertex */ - PFADD ( MM2, MM4 ) /* x1*m11+m31 | x0*m00+m30 */ - MOVQ ( MM4, REGIND(EDX) ) /* write r1, r0 */ + PFMUL ( MM0, MM4 ) /* x1*m11 | x0*m00 */ + PFADD ( MM2, MM4 ) /* m31 | x0*m00+m30 */ - MOVD ( MM3, REGOFF(8, EDX) ) /* write r2 */ - ADD_L ( EDI, EAX ) /* next vertex */ + MOVQ ( MM4, REGIND(EDX) ) /* write r1, r0 */ + ADD_L ( CONST(16), EDX ) /* next r */ - ADD_L ( CONST(16), EDX ) /* next r */ - DEC_L ( ESI ) /* decrement vertex counter */ + DEC_L ( ESI ) /* decrement vertex counter */ + JNZ ( LLBL( G3TP2NRR_2 ) ) /* cnt > 0 ? -> process next vertex */ - JA ( LLBL(G3TP3NRR_2) ) /* cnt > 0 ? -> process next vertex */ +LLBL( G3TP2NRR_3 ): -LLBL(G3TP3NRR_3): FEMMS - - POP_L ( ESI ) POP_L ( EDI ) - POP_L ( ESI ) RET - ALIGNTEXT16 -GLOBL GLNAME(gl_3dnow_transform_points2_perspective_raw) -GLNAME(gl_3dnow_transform_points2_perspective_raw): +GLOBL GLNAME( gl_3dnow_transform_points2_identity_raw ) +GLNAME( gl_3dnow_transform_points2_identity_raw ): PUSH_L ( ESI ) - MOV_L ( REGOFF(8, ESP), ECX ) - MOV_L ( REGOFF(12, ESP), ESI ) - MOV_L ( REGOFF(16, ESP), EAX ) - MOV_L ( CONST(4), REGOFF(16, ECX) ) - OR_B ( CONST(15), REGOFF(20, ECX) ) - MOV_L ( REGOFF(8, EAX), EDX ) - MOV_L ( EDX, REGOFF(8, ECX) ) -ALIGNTEXT32 + MOV_L ( ARG_DEST, ECX ) + MOV_L ( ARG_MATRIX, ESI ) + MOV_L ( ARG_SOURCE, EAX ) + MOV_L ( CONST(2), REGOFF(V4F_SIZE, ECX) ) + OR_B ( CONST(VEC_SIZE_2), REGOFF(V4F_FLAGS, ECX) ) + MOV_L ( REGOFF(V4F_COUNT, EAX), EDX ) + MOV_L ( EDX, REGOFF(V4F_COUNT, ECX) ) PUSH_L ( EDI ) - PUSH_L ( ESI ) - MOV_L ( REGOFF(4, ECX), EDX ) + MOV_L ( REGOFF(V4F_START, ECX), EDX ) MOV_L ( ESI, ECX ) - MOV_L ( REGOFF(8, EAX), ESI ) - MOV_L ( REGOFF(12, EAX), EDI ) - MOV_L ( REGOFF(4, EAX), EAX ) - - FEMMS - - CMP_L ( CONST(0), ESI ) - JE ( LLBL(G3TPPR_3) ) + MOV_L ( REGOFF(V4F_COUNT, EAX), ESI ) + MOV_L ( REGOFF(V4F_STRIDE, EAX), EDI ) + MOV_L ( REGOFF(V4F_START, EAX), EAX ) - MOVD ( REGIND(ECX), MM0 ) /* | m00 */ - PUNPCKLDQ ( REGOFF(20, ECX), MM0 ) /* m11 | m00 */ + TEST_L ( ESI, ESI ) + JZ ( LLBL( G3TPIR_3 ) ) - MOVD ( REGOFF(56, ECX), MM3 ) /* | m32 */ - -ALIGNTEXT32 -LLBL(G3TPPR_2): +ALIGNTEXT16 +LLBL( G3TPIR_3 ): - MOVQ ( REGIND(EAX), MM4 ) /* x1 | x0 */ - PFMUL ( MM0, MM4 ) /* x1*m11 | x0*m00 */ + MOVQ ( REGIND(EAX), MM0 ) /* x1 | x0 */ + ADD_L ( EDI, EAX ) /* next vertex */ - MOVQ ( MM4, REGIND(EDX) ) /* write r1, r0 */ - MOVQ ( MM3, REGOFF(8, EDX) ) /* write r2 (=m32), r3 (=0) */ + MOVQ ( MM0, REGIND(EDX) ) /* r1 | r0 */ + ADD_L ( CONST(16), EDX ) /* next r */ - ADD_L ( EDI, EAX ) /* next vertex */ - ADD_L ( CONST(16), EDX ) /* next r */ + DEC_L ( ESI ) /* decrement vertex counter */ + JNZ ( LLBL( G3TPIR_3 ) ) /* cnt > 0 ? -> process next vertex */ - DEC_L ( ESI ) /* decrement vertex counter */ - JA ( LLBL(G3TPPR_2) ) /* cnt > 0 ? -> process next vertex */ +LLBL( G3TPIR_4 ): -LLBL(G3TPPR_3): FEMMS - - POP_L ( ESI ) POP_L ( EDI ) - POP_L ( ESI ) RET - - - - Index: xc/extras/Mesa/src/X86/3dnow_xform_raw3.S diff -u xc/extras/Mesa/src/X86/3dnow_xform_raw3.S:1.3 xc/extras/Mesa/src/X86/3dnow_xform_raw3.S:1.5 --- xc/extras/Mesa/src/X86/3dnow_xform_raw3.S:1.3 Fri Jun 16 20:02:41 2000 +++ xc/extras/Mesa/src/X86/3dnow_xform_raw3.S Mon Nov 13 18:31:08 2000 @@ -1,96 +1,115 @@ -#include "assyntax.h" - - SEG_TEXT +/* + * Mesa 3-D graphics library + * Version: 3.4 + * + * Copyright (C) 1999-2000 Brian Paul All Rights Reserved. + * + * 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 + * BRIAN PAUL 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 VEC_SIZE_1 1 -#define VEC_SIZE_2 3 -#define VEC_SIZE_3 7 -#define VEC_SIZE_4 15 +#include "assyntax.h" +#include "xform_args.h" + SEG_TEXT +#define FRAME_OFFSET 4 -ALIGNTEXT32 -GLOBL GLNAME(gl_3dnow_transform_points3_general_raw) +ALIGNTEXT16 +GLOBL GLNAME( gl_3dnow_transform_points3_general_raw ) GLNAME( gl_3dnow_transform_points3_general_raw ): PUSH_L ( ESI ) - MOV_L ( REGOFF(8, ESP), ECX ) - MOV_L ( REGOFF(12, ESP), ESI ) - MOV_L ( REGOFF(16, ESP), EAX ) - MOV_L ( CONST(4), REGOFF(16, ECX) ) - OR_B ( CONST(VEC_SIZE_4), REGOFF(20, ECX) ) - MOV_L ( REGOFF(8, EAX), EDX ) - MOV_L ( EDX, REGOFF(8, ECX) ) + MOV_L ( ARG_DEST, ECX ) + MOV_L ( ARG_MATRIX, ESI ) + MOV_L ( ARG_SOURCE, EAX ) + MOV_L ( CONST(4), REGOFF(V4F_SIZE, ECX) ) + OR_B ( CONST(VEC_SIZE_4), REGOFF(V4F_FLAGS, ECX) ) + MOV_L ( REGOFF(V4F_COUNT, EAX), EDX ) + MOV_L ( EDX, REGOFF(V4F_COUNT, ECX) ) + PUSH_L ( EDI ) - MOV_L ( REGOFF(4, ECX), EDX ) + MOV_L ( REGOFF(V4F_START, ECX), EDX ) MOV_L ( ESI, ECX ) - MOV_L ( REGOFF(8, EAX), ESI ) - MOV_L ( REGOFF(12, EAX), EDI ) - MOV_L ( REGOFF(4, EAX), EAX ) + MOV_L ( REGOFF(V4F_COUNT, EAX), ESI ) + MOV_L ( REGOFF(V4F_STRIDE, EAX), EDI ) + MOV_L ( REGOFF(V4F_START, EAX), EAX ) - CMP_L ( CONST(0), ESI ) - JE ( LLBL(G3TPGR_2) ) + TEST_L ( ESI, ESI ) + JZ ( LLBL( G3TPGR_2 ) ) PREFETCHW ( REGIND(EDX) ) - - MOVQ ( REGIND(EAX), MM0 ) /* x1 | x0 */ - MOVD ( REGOFF(8, EAX), MM2 ) /* | x2 */ - ADD_L ( EDI, EAX ) /* next vertex */ + MOVQ ( REGIND(EAX), MM0 ) /* x1 | x0 */ + MOVD ( REGOFF(8, EAX), MM2 ) /* | x2 */ -ALIGNTEXT32 -LLBL(G3TPGR_1): + ADD_L ( EDI, EAX ) /* next vertex */ - PREFETCHW ( REGOFF(32, EDX) ) /* prefetch 2 vertices ahead */ +ALIGNTEXT16 +LLBL( G3TPGR_1 ): + PREFETCHW ( REGOFF(32, EDX) ) /* prefetch 2 vertices ahead */ PREFETCH ( REGIND(EAX) ) - MOVQ ( MM0, MM1 ) /* x1 | x0 */ - PUNPCKLDQ ( MM2, MM2 ) /* x2 | x2 */ + MOVQ ( MM0, MM1 ) /* x1 | x0 */ + PUNPCKLDQ ( MM2, MM2 ) /* x2 | x2 */ - PUNPCKLDQ ( MM0, MM0 ) /* x0 | x0 */ - MOVQ ( MM2, MM5 ) /* x2 | x2 */ + PUNPCKLDQ ( MM0, MM0 ) /* x0 | x0 */ + MOVQ ( MM2, MM5 ) /* x2 | x2 */ - PUNPCKHDQ ( MM1, MM1 ) /* x1 | x1 */ - PFMUL ( REGOFF(32, ECX), MM2 ) /* x2*m9 | x2*m8 */ + PUNPCKHDQ ( MM1, MM1 ) /* x1 | x1 */ + PFMUL ( REGOFF(32, ECX), MM2 ) /* x2*m9 | x2*m8 */ - MOVQ ( MM0, MM3 ) /* x0 | x0 */ - PFMUL ( REGOFF(40, ECX), MM5 ) /* x2*m11 | x2*m10 */ + MOVQ ( MM0, MM3 ) /* x0 | x0 */ + PFMUL ( REGOFF(40, ECX), MM5 ) /* x2*m11 | x2*m10 */ - MOVQ ( MM1, MM4 ) /* x1 | x1 */ - PFMUL ( REGIND(ECX), MM0 ) /* x0*m1 | x0*m0 */ + MOVQ ( MM1, MM4 ) /* x1 | x1 */ + PFMUL ( REGIND(ECX), MM0 ) /* x0*m1 | x0*m0 */ - PFADD ( REGOFF(48, ECX), MM2 ) /* x2*m9+m13 | x2*m8+m12 */ - PFMUL ( REGOFF(16, ECX), MM1 ) /* x1*m5 | x1*m4 */ + PFADD ( REGOFF(48, ECX), MM2 ) /* x2*m9+m13 | x2*m8+m12 */ + PFMUL ( REGOFF(16, ECX), MM1 ) /* x1*m5 | x1*m4 */ - PFADD ( REGOFF(56, ECX), MM5 ) /* x2*m11+m15 | x2*m10+m14 */ - PFADD ( MM0, MM1 ) /* x0*m1+x1*m5 | x0*m0+x1*m4 */ + PFADD ( REGOFF(56, ECX), MM5 ) /* x2*m11+m15 | x2*m10+m14 */ + PFADD ( MM0, MM1 ) /* x0*m1+x1*m5 | x0*m0+x1*m4 */ - PFMUL ( REGOFF(8, ECX), MM3 ) /* x0*m3 | x0*m2 */ - PFADD ( MM1, MM2 ) /* result r1 | r0 */ + PFMUL ( REGOFF(8, ECX), MM3 ) /* x0*m3 | x0*m2 */ + PFADD ( MM1, MM2 ) /* r1 | r0 */ - PFMUL ( REGOFF(24, ECX), MM4 ) /* x1*m7 | x1*m6 */ - ADD_L ( CONST(16), EDX ) /* next r */ + PFMUL ( REGOFF(24, ECX), MM4 ) /* x1*m7 | x1*m6 */ + ADD_L ( CONST(16), EDX ) /* next output vertex */ - PFADD ( MM3, MM4 ) /* x0*m3+x1*m7 | x0*m2+x1*m6 */ - MOVQ ( MM2, REGOFF(-16, EDX) ) /* write r0, r1 */ + PFADD ( MM3, MM4 ) /* x0*m3+x1*m7 | x0*m2+x1*m6 */ + MOVQ ( MM2, REGOFF(-16, EDX) ) /* write r0, r1 */ - PFADD ( MM4, MM5 ) /* r3 | r2 */ - MOVQ ( MM5, REGOFF(-8, EDX) ) /* write r2, r3 */ + PFADD ( MM4, MM5 ) /* r3 | r2 */ + MOVQ ( MM5, REGOFF(-8, EDX) ) /* write r2, r3 */ - MOVQ ( REGIND(EAX), MM0 ) /* x1 | x0 */ - MOVD ( REGOFF(8, EAX), MM2 ) /* | x2 */ + MOVQ ( REGIND(EAX), MM0 ) /* x1 | x0 */ + MOVD ( REGOFF(8, EAX), MM2 ) /* | x2 */ - ADD_L ( EDI, EAX ) /* next vertex */ - DEC_L ( ESI ) /* decrement vertex counter */ - JA ( LLBL(G3TPGR_1) ) /* cnt > 0 ? -> process next vertex */ + ADD_L ( EDI, EAX ) /* next vertex */ + DEC_L ( ESI ) /* decrement vertex counter */ + JNZ ( LLBL( G3TPGR_1 ) ) /* cnt > 0 ? -> process next vertex */ -ALIGNTEXT32 -LLBL(G3TPGR_2): +LLBL( G3TPGR_2 ): FEMMS POP_L ( EDI ) @@ -99,57 +118,83 @@ - -ALIGNTEXT32 -GLOBL GLNAME(gl_3dnow_transform_points3_identity_raw) -GLNAME( gl_3dnow_transform_points3_identity_raw ): +ALIGNTEXT16 +GLOBL GLNAME( gl_3dnow_transform_points3_perspective_raw ) +GLNAME( gl_3dnow_transform_points3_perspective_raw ): PUSH_L ( ESI ) - MOV_L ( REGOFF(8, ESP), ECX ) - MOV_L ( REGOFF(12, ESP), ESI ) - MOV_L ( REGOFF(16, ESP), EAX ) - MOV_L ( CONST(3), REGOFF(16, ECX) ) - OR_B ( CONST(VEC_SIZE_3), REGOFF(20, ECX) ) - MOV_L ( REGOFF(8, EAX), EDX ) - MOV_L ( EDX, REGOFF(8, ECX) ) + + MOV_L ( ARG_DEST, ECX ) + MOV_L ( ARG_MATRIX, ESI ) + MOV_L ( ARG_SOURCE, EAX ) + MOV_L ( CONST(4), REGOFF(V4F_SIZE, ECX) ) + OR_B ( CONST(VEC_SIZE_4), REGOFF(V4F_FLAGS, ECX) ) + MOV_L ( REGOFF(V4F_COUNT, EAX), EDX ) + MOV_L ( EDX, REGOFF(V4F_COUNT, ECX) ) PUSH_L ( EDI ) - MOV_L ( REGOFF(4, ECX), EDX ) + MOV_L ( REGOFF(V4F_START, ECX), EDX ) MOV_L ( ESI, ECX ) - MOV_L ( REGOFF(8, EAX), ESI ) - MOV_L ( REGOFF(12, EAX), EDI ) - MOV_L ( REGOFF(4, EAX), EAX ) + MOV_L ( REGOFF(V4F_COUNT, EAX), ESI ) + MOV_L ( REGOFF(V4F_STRIDE, EAX), EDI ) + MOV_L ( REGOFF(V4F_START, EAX), EAX ) - CMP_L ( CONST(0), ESI ) - JE ( LLBL(G3TPIR_2) ) + TEST_L ( ESI, ESI ) + JZ ( LLBL( G3TPPR_2 ) ) + PREFETCH ( REGIND(EAX) ) PREFETCHW ( REGIND(EDX) ) - MOVQ ( REGIND(EAX), MM0 ) /* x1 | x0 */ - MOVD ( REGOFF(8, EAX), MM1 ) /* | x2 */ + MOVD ( REGIND(ECX), MM0 ) /* | m00 */ + PUNPCKLDQ ( REGOFF(20, ECX), MM0 ) /* m11 | m00 */ -ALIGNTEXT32 -LLBL(G3TPIR_1): + MOVQ ( REGOFF(32, ECX), MM1 ) /* m21 | m20 */ + MOVD ( REGOFF(40, ECX), MM2 ) /* | m22 */ - PREFETCHW ( REGOFF(32, EDX) ) + MOVD ( REGOFF(56, ECX), MM3 ) /* | m32 */ - ADD_L ( EDI, EAX ) /* next vertex */ - ADD_L ( CONST(16), EDX ) /* next r */ + MOVD ( REGOFF(8, EAX), MM5 ) /* | x2 */ + MOVQ ( REGIND(EAX), MM4 ) /* x1 | x0 */ - DEC_L ( ESI ) /* decrement vertex counter */ - MOVQ ( MM0, REGOFF(-16, EDX) ) /* r1 | r0 */ + ADD_L ( EDI, EAX ) /* next vertex */ - MOVD ( MM1, REGOFF(-8, EDX) ) /* | r2 */ - MOVQ ( REGIND(EAX), MM0 ) /* x1 | x0 */ +ALIGNTEXT16 +LLBL( G3TPPR_1 ): - MOVD ( REGOFF(8, EAX), MM1 ) /* | x2 */ - JA ( LLBL(G3TPIR_1) ) /* cnt > 0 ? -> process next vertex */ + PREFETCHW ( REGOFF(32, EDX) ) /* prefetch 2 vertices ahead */ + PREFETCH ( REGIND(EAX) ) + + PXOR ( MM7, MM7 ) /* 0 | 0 */ + MOVQ ( MM5, MM6 ) /* | x2 */ + + PFMUL ( MM0, MM4 ) /* x1*m11 | x0*m00 */ + PFSUB ( MM5, MM7 ) /* | -x2 */ + + PFMUL ( MM2, MM6 ) /* | x2*m22 */ + PUNPCKLDQ ( MM5, MM5 ) /* x2 | x2 */ + + ADD_L ( CONST(16), EDX ) /* next r */ + PFMUL ( MM1, MM5 ) /* x2*m21 | x2*m20 */ + + PFADD ( MM3, MM6 ) /* | x2*m22+m32 */ + PFADD ( MM4, MM5 ) /* x1*m11+x2*m21 | x0*m00+x2*m20 */ -ALIGNTEXT32 -LLBL(G3TPIR_2): + MOVQ ( MM5, REGOFF(-16, EDX) ) /* write r0, r1 */ + MOVD ( MM6, REGOFF(-8, EDX) ) /* write r2 */ + MOVD ( MM7, REGOFF(-4, EDX) ) /* write r3 */ + MOVD ( REGOFF(8, EAX), MM5 ) /* | x2 */ + + MOVQ ( REGIND(EAX), MM4 ) /* x1 | x0 */ + ADD_L ( EDI, EAX ) /* next vertex */ + + DEC_L ( ESI ) /* decrement vertex counter */ + JNZ ( LLBL( G3TPPR_1 ) ) /* cnt > 0 ? -> process next vertex */ + +LLBL( G3TPPR_2 ): + FEMMS POP_L ( EDI ) POP_L ( ESI ) @@ -158,74 +203,87 @@ -ALIGNTEXT32 -GLOBL GLNAME(gl_3dnow_transform_points3_2d_raw) -GLNAME( gl_3dnow_transform_points3_2d_raw ): +ALIGNTEXT16 +GLOBL GLNAME( gl_3dnow_transform_points3_3d_raw ) +GLNAME( gl_3dnow_transform_points3_3d_raw ): PUSH_L ( ESI ) - MOV_L ( REGOFF(8, ESP), ECX ) - MOV_L ( REGOFF(12, ESP), ESI ) - MOV_L ( REGOFF(16, ESP), EAX ) - MOV_L ( CONST(3), REGOFF(16, ECX) ) - OR_B ( CONST(VEC_SIZE_3), REGOFF(20, ECX) ) - MOV_L ( REGOFF(8, EAX), EDX ) - MOV_L ( EDX, REGOFF(8, ECX) ) + + MOV_L ( ARG_DEST, ECX ) + MOV_L ( ARG_MATRIX, ESI ) + MOV_L ( ARG_SOURCE, EAX ) + MOV_L ( CONST(3), REGOFF(V4F_SIZE, ECX) ) + OR_B ( CONST(VEC_SIZE_3), REGOFF(V4F_FLAGS, ECX) ) + MOV_L ( REGOFF(V4F_COUNT, EAX), EDX ) + MOV_L ( EDX, REGOFF(V4F_COUNT, ECX) ) PUSH_L ( EDI ) - MOV_L ( REGOFF(4, ECX), EDX ) + MOV_L ( REGOFF(V4F_START, ECX), EDX ) MOV_L ( ESI, ECX ) - MOV_L ( REGOFF(8, EAX), ESI ) - MOV_L ( REGOFF(12, EAX), EDI ) - MOV_L ( REGOFF(4, EAX), EAX ) + MOV_L ( REGOFF(V4F_COUNT, EAX), ESI ) + MOV_L ( REGOFF(V4F_STRIDE, EAX), EDI ) + MOV_L ( REGOFF(V4F_START, EAX), EAX ) - CMP_L ( CONST(0), ESI ) - JE ( LLBL(G3TP2R_3) ) + TEST_L ( ESI, ESI ) + JZ ( LLBL( G3TP3R_2 ) ) PREFETCH ( REGIND(EAX) ) + PREFETCH ( REGIND(EDX) ) - PREFETCHW ( REGIND(EDX) ) + MOVD ( REGOFF(8, ECX), MM7 ) /* | m2 */ + PUNPCKLDQ ( REGOFF(24, ECX), MM7 ) /* m6 | m2 */ - MOVD ( REGIND(ECX), MM0 ) /* | m00 */ - PUNPCKLDQ ( REGOFF(16, ECX), MM0 ) /* m10 | m00 */ + MOVQ ( REGIND(EAX), MM0 ) /* x1 | x0 */ + MOVD ( REGOFF(8, EAX), MM1 ) /* | x2 */ - MOVD ( REGOFF(4, ECX), MM1 ) /* | m01 */ - PUNPCKLDQ ( REGOFF(20, ECX), MM1 ) /* m11 | m01 */ + ADD_L ( EDI, EAX ) /* next vertex */ - MOVQ ( REGOFF(48, ECX), MM2 ) /* m31 | m30 */ - MOVQ ( REGIND(EAX), MM3 ) /* x1 | x0 */ +ALIGNTEXT16 +LLBL( G3TP3R_1 ): - MOVD ( REGOFF(8, EAX), MM5 ) /* | x2 */ - ADD_L ( EDI, EAX ) /* next vertex */ + PREFETCHW ( REGOFF(32, EDX) ) /* prefetch 2 vertices ahead */ + PREFETCH ( REGIND(EAX) ) -ALIGNTEXT32 -LLBL(G3TP2R_2): + MOVQ ( MM0, MM2 ) /* x1 | x0 */ + ADD_L ( CONST(16), EDX ) /* next r */ - PREFETCHW ( REGOFF(32, EDX) ) /* prefetch 2 vertices ahead */ + PUNPCKLDQ ( MM2, MM2 ) /* x0 | x0 */ + MOVQ ( MM0, MM3 ) /* x1 | x0 */ - PREFETCH ( REGIND(EAX) ) + PFMUL ( REGIND(ECX), MM2 ) /* x0*m1 | x0*m0 */ + PUNPCKHDQ ( MM3, MM3 ) /* x1 | x1 */ - MOVQ ( MM3, MM4 ) /* x1 | x0 */ - PFMUL ( MM0, MM3 ) /* x1*m10 | x0*m00 */ + MOVQ ( MM1, MM4 ) /* | x2 */ + PFMUL ( REGOFF(16, ECX), MM3 ) /* x1*m5 | x1*m4 */ - ADD_L ( CONST(16), EDX ) /* next r */ - PFMUL ( MM1, MM4 ) /* x1*m11 | x0*m01 */ + PUNPCKLDQ ( MM4, MM4 ) /* x2 | x2 */ + PFADD ( MM2, MM3 ) /* x0*m1+x1*m5 | x0*m0+x1*m4 */ + + PFMUL ( REGOFF(32, ECX), MM4 ) /* x2*m9 | x2*m8 */ + PFADD ( REGOFF(48, ECX), MM3 ) /* x0*m1+...+m11 | x0*m0+x1*m4+m12 */ + + PFMUL ( MM7, MM0 ) /* x1*m6 | x0*m2 */ + PFADD ( MM4, MM3 ) /* r1 | r0 */ + + PFMUL ( REGOFF(40, ECX), MM1 ) /* | x2*m10 */ + PUNPCKLDQ ( REGOFF(56, ECX), MM1 ) /* m14 | x2*m10 */ + + PFACC ( MM0, MM1 ) - PFACC ( MM4, MM3 ) /* x0*m00+x1*m10 | x0*m01+x1*m11 */ - MOVD ( MM5, REGOFF(-8, EDX) ) /* write r2 (=x2) */ + MOVQ ( MM3, REGOFF(-16, EDX) ) /* write r0, r1 */ + PFACC ( MM1, MM1 ) /* | r2 */ - PFADD ( MM2, MM3 ) /* x0*...*m10+m30| x0*m01+x1*m11+m31 */ - MOVQ ( MM3, REGOFF(-16, EDX) ) /* write r0, r1 */ + MOVD ( MM1, REGOFF(-8, EDX) ) /* write r2 */ + MOVQ ( REGIND(EAX), MM0 ) /* x1 | x0 */ - MOVQ ( REGIND(EAX), MM3 ) /* x1 | x0 */ - MOVD ( REGOFF(8, EAX), MM5 ) /* | x2 */ + MOVD ( REGOFF(8, EAX), MM1 ) /* | x2 */ - ADD_L ( EDI, EAX ) /* next vertex */ - DEC_L ( ESI ) /* decrement vertex counter */ - JA ( LLBL(G3TP2R_2) ) /* cnt > 0 ? -> process next vertex */ + ADD_L ( EDI, EAX ) /* next vertex */ + DEC_L ( ESI ) /* decrement vertex counter */ + JNZ ( LLBL( G3TP3R_1 ) ) /* cnt > 0 ? -> process next vertex */ -ALIGNTEXT32 -LLBL(G3TP2R_3): +LLBL( G3TP3R_2 ): FEMMS POP_L ( EDI ) @@ -235,70 +293,74 @@ - -ALIGNTEXT32 -GLOBL GLNAME(gl_3dnow_transform_points3_2d_no_rot_raw) -GLNAME( gl_3dnow_transform_points3_2d_no_rot_raw ): +ALIGNTEXT16 +GLOBL GLNAME( gl_3dnow_transform_points3_3d_no_rot_raw ) +GLNAME( gl_3dnow_transform_points3_3d_no_rot_raw ): PUSH_L ( ESI ) - MOV_L ( REGOFF(8, ESP), ECX ) - MOV_L ( REGOFF(12, ESP), ESI ) - MOV_L ( REGOFF(16, ESP), EAX ) - MOV_L ( CONST(3), REGOFF(16, ECX) ) - OR_B ( CONST(VEC_SIZE_3), REGOFF(20, ECX) ) - MOV_L ( REGOFF(8, EAX), EDX ) - MOV_L ( EDX, REGOFF(8, ECX) ) + MOV_L ( ARG_DEST, ECX ) + MOV_L ( ARG_MATRIX, ESI ) + MOV_L ( ARG_SOURCE, EAX ) + MOV_L ( CONST(3), REGOFF(V4F_SIZE, ECX) ) + OR_B ( CONST(VEC_SIZE_3), REGOFF(V4F_FLAGS, ECX) ) + MOV_L ( REGOFF(V4F_COUNT, EAX), EDX ) + MOV_L ( EDX, REGOFF(V4F_COUNT, ECX) ) + PUSH_L ( EDI ) - MOV_L ( REGOFF(4, ECX), EDX ) + MOV_L ( REGOFF(V4F_START, ECX), EDX ) MOV_L ( ESI, ECX ) - MOV_L ( REGOFF(8, EAX), ESI ) - MOV_L ( REGOFF(12, EAX), EDI ) - MOV_L ( REGOFF(4, EAX), EAX ) + MOV_L ( REGOFF(V4F_COUNT, EAX), ESI ) + MOV_L ( REGOFF(V4F_STRIDE, EAX), EDI ) + MOV_L ( REGOFF(V4F_START, EAX), EAX ) - CMP_L ( CONST(0), ESI ) - JE ( LLBL(G3TP2NRR_2) ) + TEST_L ( ESI, ESI ) + JZ ( LLBL( G3TP3NRR_2 ) ) PREFETCH ( REGIND(EAX) ) - PREFETCHW ( REGIND(EDX) ) - MOVD ( REGIND(ECX), MM0 ) /* | m00 */ - PUNPCKLDQ ( REGOFF(20, ECX), MM0 ) /* m11 | m00 */ + MOVD ( REGIND(ECX), MM0 ) /* | m00 */ + PUNPCKLDQ ( REGOFF(20, ECX), MM0 ) /* m11 | m00 */ - MOVQ ( REGOFF(48, ECX), MM1 ) /* m31 | m30 */ - MOVQ ( REGIND(EAX), MM4 ) /* x1 | x0 */ + MOVD ( REGOFF(40, ECX), MM2 ) /* | m22 */ + PUNPCKLDQ ( MM2, MM2 ) /* m22 | m22 */ - MOVD ( REGOFF(8, EAX), MM5 ) /* | x2 */ - ADD_L ( EDI, EAX ) /* next vertex */ + MOVQ ( REGOFF(48, ECX), MM1 ) /* m31 | m30 */ + MOVD ( REGOFF(56, ECX), MM3 ) /* | m32 */ + PUNPCKLDQ ( MM3, MM3 ) /* m32 | m32 */ + MOVQ ( REGIND(EAX), MM4 ) /* x1 | x0 */ -ALIGNTEXT32 -LLBL(G3TP2NRR_1): + MOVD ( REGOFF(8, EAX), MM5 ) /* | x2 */ - PREFETCHW ( REGOFF(32, EDX) ) /* prefetch 2 vertices ahead */ - PREFETCH ( REGIND(EAX) ) +ALIGNTEXT16 +LLBL( G3TP3NRR_1 ): + + PREFETCHW ( REGOFF(32, EDX) ) /* prefetch 2 vertices ahead */ + ADD_L ( EDI, EAX ) /* next vertex */ - PFMUL ( MM0, MM4 ) /* x1*m11 | x0*m00 */ - ADD_L ( CONST(16), EDX ) /* next r */ + PREFETCHW ( REGIND(EAX) ) + PFMUL ( MM0, MM4 ) /* x1*m11 | x0*m00 */ - PFADD ( MM1, MM4 ) /* x1*m11+m31 | x0*m00+m30 */ + PFADD ( MM1, MM4 ) /* x1*m11+m31 | x0*m00+m30 */ + PFMUL ( MM2, MM5 ) /* | x2*m22 */ - MOVQ ( MM4, REGOFF(-16, EDX) ) /* write r0, r1 */ - MOVD ( MM5, REGOFF(-8, EDX) ) /* write r2 (=x2) */ + PFADD ( MM3, MM5 ) /* | x2*m22+m32 */ + MOVQ ( MM4, REGIND(EDX) ) /* write r0, r1 */ - MOVQ ( REGIND(EAX), MM4 ) /* x1 | x0 */ - MOVD ( REGOFF(8, EAX), MM5 ) /* | x2 */ + ADD_L ( CONST(16), EDX ) /* next r */ + DEC_L ( ESI ) /* decrement vertex counter */ - ADD_L ( EDI, EAX ) /* next vertex */ - DEC_L ( ESI ) /* decrement vertex counter */ + MOVD ( MM5, REGOFF(-8, EDX) ) /* write r2 */ + MOVQ ( REGIND(EAX), MM4 ) /* x1 | x0 */ - JA ( LLBL(G3TP2NRR_1) ) /* cnt > 0 ? -> process next vertex */ + MOVD ( REGOFF(8, EAX), MM5 ) /* | x2 */ + JNZ ( LLBL( G3TP3NRR_1 ) ) /* cnt > 0 ? -> process next vertex */ -ALIGNTEXT32 -LLBL(G3TP2NRR_2): +LLBL( G3TP3NRR_2 ): FEMMS POP_L ( EDI ) @@ -308,90 +370,73 @@ -ALIGNTEXT32 -GLOBL GLNAME(gl_3dnow_transform_points3_3d_raw) -GLNAME( gl_3dnow_transform_points3_3d_raw ): +ALIGNTEXT16 +GLOBL GLNAME( gl_3dnow_transform_points3_2d_raw ) +GLNAME( gl_3dnow_transform_points3_2d_raw ): PUSH_L ( ESI ) - MOV_L ( REGOFF(8, ESP), ECX ) - MOV_L ( REGOFF(12, ESP), ESI ) - MOV_L ( REGOFF(16, ESP), EAX ) - MOV_L ( CONST(3), REGOFF(16, ECX) ) - OR_B ( CONST(VEC_SIZE_3), REGOFF(20, ECX) ) - MOV_L ( REGOFF(8, EAX), EDX ) - MOV_L ( EDX, REGOFF(8, ECX) ) + MOV_L ( ARG_DEST, ECX ) + MOV_L ( ARG_MATRIX, ESI ) + MOV_L ( ARG_SOURCE, EAX ) + MOV_L ( CONST(3), REGOFF(V4F_SIZE, ECX) ) + OR_B ( CONST(VEC_SIZE_3), REGOFF(V4F_FLAGS, ECX) ) + MOV_L ( REGOFF(V4F_COUNT, EAX), EDX ) + MOV_L ( EDX, REGOFF(V4F_COUNT, ECX) ) + PUSH_L ( EDI ) - MOV_L ( REGOFF(4, ECX), EDX ) + MOV_L ( REGOFF(V4F_START, ECX), EDX ) MOV_L ( ESI, ECX ) - MOV_L ( REGOFF(8, EAX), ESI ) - MOV_L ( REGOFF(12, EAX), EDI ) - MOV_L ( REGOFF(4, EAX), EAX ) + MOV_L ( REGOFF(V4F_COUNT, EAX), ESI ) + MOV_L ( REGOFF(V4F_STRIDE, EAX), EDI ) + MOV_L ( REGOFF(V4F_START, EAX), EAX ) - CMP_L ( CONST(0), ESI ) - JE ( LLBL(G3TP3R_2) ) + TEST_L ( ESI, ESI ) + JZ ( LLBL( G3TP2R_3) ) PREFETCH ( REGIND(EAX) ) - - PREFETCH ( REGIND(EDX) ) + PREFETCHW ( REGIND(EDX) ) - MOVD ( REGOFF(8, ECX), MM7 ) /* | m2 */ - PUNPCKLDQ ( REGOFF(24, ECX), MM7 ) /* m6 | m2 */ + MOVD ( REGIND(ECX), MM0 ) /* | m00 */ + PUNPCKLDQ ( REGOFF(16, ECX), MM0 ) /* m10 | m00 */ - MOVQ ( REGIND(EAX), MM0 ) /* x1 | x0 */ - MOVD ( REGOFF(8, EAX), MM1 ) /* | x2 */ + MOVD ( REGOFF(4, ECX), MM1 ) /* | m01 */ + PUNPCKLDQ ( REGOFF(20, ECX), MM1 ) /* m11 | m01 */ - ADD_L ( EDI, EAX ) /* next vertex */ + MOVQ ( REGOFF(48, ECX), MM2 ) /* m31 | m30 */ + MOVQ ( REGIND(EAX), MM3 ) /* x1 | x0 */ -ALIGNTEXT32 -LLBL(G3TP3R_1): + MOVD ( REGOFF(8, EAX), MM5 ) /* | x2 */ + ADD_L ( EDI, EAX ) /* next vertex */ - PREFETCHW ( REGOFF(32, EDX) ) /* prefetch 2 vertices ahead */ +ALIGNTEXT16 +LLBL( G3TP2R_2 ): + PREFETCHW ( REGOFF(32, EDX) ) /* prefetch 2 vertices ahead */ PREFETCH ( REGIND(EAX) ) - - MOVQ ( MM0, MM2 ) /* x1 | x0 */ - ADD_L ( CONST(16), EDX ) /* next r */ - - PUNPCKLDQ ( MM2, MM2 ) /* x0 | x0 */ - MOVQ ( MM0, MM3 ) /* x1 | x0 */ - PFMUL ( REGIND(ECX), MM2 ) /* x0*m1 | x0*m0 */ - PUNPCKHDQ ( MM3, MM3 ) /* x1 | x1 */ + MOVQ ( MM3, MM4 ) /* x1 | x0 */ + PFMUL ( MM0, MM3 ) /* x1*m10 | x0*m00 */ - MOVQ ( MM1, MM4 ) /* | x2 */ - PFMUL ( REGOFF(16, ECX), MM3 ) /* x1*m5 | x1*m4 */ + ADD_L ( CONST(16), EDX ) /* next r */ + PFMUL ( MM1, MM4 ) /* x1*m11 | x0*m01 */ - PUNPCKLDQ ( MM4, MM4 ) /* x2 | x2 */ - PFADD ( MM2, MM3 ) /* x0*m1+x1*m5 | x0*m0+x1*m4 */ - - PFMUL ( REGOFF(32, ECX), MM4 ) /* x2*m9 | x2*m8 */ - PFADD ( REGOFF(48, ECX), MM3 ) /* x0*m1+...+m11 | x0*m0+x1*m4+m12 */ - - PFMUL ( MM7, MM0 ) /* x1*m6 | x0*m2 */ - PFADD ( MM4, MM3 ) /* r1 | r0 */ - - PFMUL ( REGOFF(40, ECX), MM1 ) /* | x2*m10 */ - PUNPCKLDQ ( REGOFF(56, ECX), MM1 ) /* m14 | x2*m10 */ - - PFACC ( MM0, MM1 ) + PFACC ( MM4, MM3 ) /* x0*m00+x1*m10 | x0*m01+x1*m11 */ + MOVD ( MM5, REGOFF(-8, EDX) ) /* write r2 (=x2) */ - MOVQ ( MM3, REGOFF(-16, EDX) ) /* write r0, r1 */ - PFACC ( MM1, MM1 ) /* | r2 */ + PFADD ( MM2, MM3 ) /* x0*...*m10+m30 | x0*...*m11+m31 */ + MOVQ ( MM3, REGOFF(-16, EDX) ) /* write r0, r1 */ - MOVD ( MM1, REGOFF(-8, EDX) ) /* write r2 */ - MOVQ ( REGIND(EAX), MM0 ) /* x1 | x0 */ + MOVQ ( REGIND(EAX), MM3 ) /* x1 | x0 */ + MOVD ( REGOFF(8, EAX), MM5 ) /* | x2 */ - MOVD ( REGOFF(8, EAX), MM1 ) /* | x2 */ + ADD_L ( EDI, EAX ) /* next vertex */ + DEC_L ( ESI ) /* decrement vertex counter */ + JNZ ( LLBL( G3TP2R_2 ) ) /* cnt > 0 ? -> process next vertex */ - ADD_L ( EDI, EAX ) /* next vertex */ - DEC_L ( ESI ) /* decrement vertex counter */ - JA ( LLBL(G3TP3R_1) ) /* cnt > 0 ? -> process next vertex */ +LLBL( G3TP2R_3 ): -ALIGNTEXT32 -LLBL(G3TP3R_2): - FEMMS POP_L ( EDI ) POP_L ( ESI ) @@ -400,74 +445,66 @@ -ALIGNTEXT32 -GLOBL GLNAME(gl_3dnow_transform_points3_3d_no_rot_raw) -GLNAME( gl_3dnow_transform_points3_3d_no_rot_raw ): +ALIGNTEXT16 +GLOBL GLNAME( gl_3dnow_transform_points3_2d_no_rot_raw ) +GLNAME( gl_3dnow_transform_points3_2d_no_rot_raw ): PUSH_L ( ESI ) - MOV_L ( REGOFF(8, ESP), ECX ) - MOV_L ( REGOFF(12, ESP), ESI ) - MOV_L ( REGOFF(16, ESP), EAX ) - MOV_L ( CONST(3), REGOFF(16, ECX) ) - OR_B ( CONST(VEC_SIZE_3), REGOFF(20, ECX) ) - MOV_L ( REGOFF(8, EAX), EDX ) - MOV_L ( EDX, REGOFF(8, ECX) ) + MOV_L ( ARG_DEST, ECX ) + MOV_L ( ARG_MATRIX, ESI ) + MOV_L ( ARG_SOURCE, EAX ) + MOV_L ( CONST(3), REGOFF(V4F_SIZE, ECX) ) + OR_B ( CONST(VEC_SIZE_3), REGOFF(V4F_FLAGS, ECX) ) + MOV_L ( REGOFF(V4F_COUNT, EAX), EDX ) + MOV_L ( EDX, REGOFF(V4F_COUNT, ECX) ) + PUSH_L ( EDI ) - MOV_L ( REGOFF(4, ECX), EDX ) + MOV_L ( REGOFF(V4F_START, ECX), EDX ) MOV_L ( ESI, ECX ) - MOV_L ( REGOFF(8, EAX), ESI ) - MOV_L ( REGOFF(12, EAX), EDI ) - MOV_L ( REGOFF(4, EAX), EAX ) + MOV_L ( REGOFF(V4F_COUNT, EAX), ESI ) + MOV_L ( REGOFF(V4F_STRIDE, EAX), EDI ) + MOV_L ( REGOFF(V4F_START, EAX), EAX ) - CMP_L ( CONST(0), ESI ) - JE ( LLBL(G3TP3NRR_2) ) + TEST_L ( ESI, ESI ) + JZ ( LLBL( G3TP2NRR_2 ) ) PREFETCH ( REGIND(EAX) ) - PREFETCHW ( REGIND(EDX) ) - MOVD ( REGIND(ECX), MM0 ) /* | m00 */ - PUNPCKLDQ ( REGOFF(20, ECX), MM0 ) /* m11 | m00 */ + MOVD ( REGIND(ECX), MM0 ) /* | m00 */ + PUNPCKLDQ ( REGOFF(20, ECX), MM0 ) /* m11 | m00 */ - MOVD ( REGOFF(40, ECX), MM2 ) /* | m22 */ - PUNPCKLDQ ( MM2, MM2 ) /* m22 | m22 */ + MOVQ ( REGOFF(48, ECX), MM1 ) /* m31 | m30 */ + MOVQ ( REGIND(EAX), MM4 ) /* x1 | x0 */ - MOVQ ( REGOFF(48, ECX), MM1 ) /* m31 | m30 */ - MOVD ( REGOFF(56, ECX), MM3 ) /* | m32 */ + MOVD ( REGOFF(8, EAX), MM5 ) /* | x2 */ + ADD_L ( EDI, EAX ) /* next vertex */ - PUNPCKLDQ ( MM3, MM3 ) /* m32 | m32 */ - MOVQ ( REGIND(EAX), MM4 ) /* x1 | x0 */ - MOVD ( REGOFF(8, EAX), MM5 ) /* | x2 */ +ALIGNTEXT16 +LLBL( G3TP2NRR_1 ): - -ALIGNTEXT32 -LLBL(G3TP3NRR_1): - PREFETCHW ( REGOFF(32, EDX) ) /* prefetch 2 vertices ahead */ - ADD_L ( EDI, EAX ) /* next vertex */ - - PREFETCHW ( REGIND(EAX) ) - PFMUL ( MM0, MM4 ) /* x1*m11 | x0*m00 */ + PREFETCHW ( REGOFF(32, EDX) ) /* prefetch 2 vertices ahead */ + PREFETCH ( REGIND(EAX) ) - PFADD ( MM1, MM4 ) /* x1*m11+m31 | x0*m00+m30 */ - PFMUL ( MM2, MM5 ) /* | x2*m22 */ + PFMUL ( MM0, MM4 ) /* x1*m11 | x0*m00 */ + ADD_L ( CONST(16), EDX ) /* next r */ - PFADD ( MM3, MM5 ) /* | x2*m22+m32 */ - MOVQ ( MM4, REGIND(EDX) ) /* write r0, r1 */ + PFADD ( MM1, MM4 ) /* x1*m11+m31 | x0*m00+m30 */ - ADD_L ( CONST(16), EDX ) /* next r */ - DEC_L ( ESI ) /* decrement vertex counter */ + MOVQ ( MM4, REGOFF(-16, EDX) ) /* write r0, r1 */ + MOVD ( MM5, REGOFF(-8, EDX) ) /* write r2 (=x2) */ - MOVD ( MM5, REGOFF(-8, EDX) ) /* write r2 */ - MOVQ ( REGIND(EAX), MM4 ) /* x1 | x0 */ + MOVQ ( REGIND(EAX), MM4 ) /* x1 | x0 */ + MOVD ( REGOFF(8, EAX), MM5 ) /* | x2 */ - MOVD ( REGOFF(8, EAX), MM5 ) /* | x2 */ - JA ( LLBL(G3TP3NRR_1) ) /* cnt > 0 ? -> process next vertex */ + ADD_L ( EDI, EAX ) /* next vertex */ + DEC_L ( ESI ) /* decrement vertex counter */ + JNZ ( LLBL( G3TP2NRR_1 ) ) /* cnt > 0 ? -> process next vertex */ -ALIGNTEXT32 -LLBL(G3TP3NRR_2): +LLBL( G3TP2NRR_2 ): FEMMS POP_L ( EDI ) @@ -477,90 +514,56 @@ -ALIGNTEXT32 -GLOBL GLNAME(gl_3dnow_transform_points3_perspective_raw) -GLNAME( gl_3dnow_transform_points3_perspective_raw ): +ALIGNTEXT16 +GLOBL GLNAME( gl_3dnow_transform_points3_identity_raw ) +GLNAME( gl_3dnow_transform_points3_identity_raw ): PUSH_L ( ESI ) - MOV_L ( REGOFF(8, ESP), ECX ) - MOV_L ( REGOFF(12, ESP), ESI ) - MOV_L ( REGOFF(16, ESP), EAX ) - MOV_L ( CONST(4), REGOFF(16, ECX) ) - OR_B ( CONST(VEC_SIZE_4), REGOFF(20, ECX) ) - MOV_L ( REGOFF(8, EAX), EDX ) - MOV_L ( EDX, REGOFF(8, ECX) ) + + MOV_L ( ARG_DEST, ECX ) + MOV_L ( ARG_MATRIX, ESI ) + MOV_L ( ARG_SOURCE, EAX ) + MOV_L ( CONST(3), REGOFF(V4F_SIZE, ECX) ) + OR_B ( CONST(VEC_SIZE_3), REGOFF(V4F_FLAGS, ECX) ) + MOV_L ( REGOFF(V4F_COUNT, EAX), EDX ) + MOV_L ( EDX, REGOFF(V4F_COUNT, ECX) ) PUSH_L ( EDI ) - MOV_L ( REGOFF(4, ECX), EDX ) + MOV_L ( REGOFF(V4F_START, ECX), EDX ) MOV_L ( ESI, ECX ) - MOV_L ( REGOFF(8, EAX), ESI ) - MOV_L ( REGOFF(12, EAX), EDI ) - MOV_L ( REGOFF(4, EAX), EAX ) - - CMP_L ( CONST(0), ESI ) - JE ( LLBL(G3TPPR_2) ) + MOV_L ( REGOFF(V4F_COUNT, EAX), ESI ) + MOV_L ( REGOFF(V4F_STRIDE, EAX), EDI ) + MOV_L ( REGOFF(V4F_START, EAX), EAX ) - PREFETCH ( REGIND(EAX) ) + TEST_L ( ESI, ESI ) + JZ ( LLBL( G3TPIR_2 ) ) PREFETCHW ( REGIND(EDX) ) - - MOVD ( REGIND(ECX), MM0 ) /* | m00 */ - PUNPCKLDQ ( REGOFF(20, ECX), MM0 ) /* m11 | m00 */ - - MOVQ ( REGOFF(32, ECX), MM1 ) /* m21 | m20 */ - MOVD ( REGOFF(40, ECX), MM2 ) /* | m22 */ - MOVD ( REGOFF(56, ECX), MM3 ) /* | m32 */ + MOVQ ( REGIND(EAX), MM0 ) /* x1 | x0 */ + MOVD ( REGOFF(8, EAX), MM1 ) /* | x2 */ - MOVD ( REGOFF(8, EAX), MM5 ) /* | x2 */ - MOVQ ( REGIND(EAX), MM4 ) /* x1 | x0 */ - - ADD_L ( EDI, EAX ) /* next vertex */ - -ALIGNTEXT32 -LLBL(G3TPPR_1): - - PREFETCHW ( REGOFF(32, EDX) ) /* prefetch 2 vertices ahead */ - - PREFETCH ( REGIND(EAX) ) +ALIGNTEXT16 +LLBL( G3TPIR_1 ): - PXOR ( MM7, MM7 ) /* 0 | 0 */ - MOVQ ( MM5, MM6 ) /* | x2 */ - - PFMUL ( MM0, MM4 ) /* x1*m11 | x0*m00 */ - PFSUB ( MM5, MM7 ) /* | -x2 */ - - PFMUL ( MM2, MM6 ) /* | x2*m22 */ - PUNPCKLDQ ( MM5, MM5 ) /* x2 | x2 */ - - ADD_L ( CONST(16), EDX ) /* next r */ - PFMUL ( MM1, MM5 ) /* x2*m21 | x2*m20 */ - - PFADD ( MM3, MM6 ) /* | x2*m22+m32 */ - PFADD ( MM4, MM5 ) /* x1*m11+x2*m21 | x0*m00+x2*m20 */ + PREFETCHW ( REGOFF(32, EDX) ) - MOVQ ( MM5, REGOFF(-16, EDX) ) /* write r0, r1 */ - MOVD ( MM6, REGOFF(-8, EDX) ) /* write r2 */ + ADD_L ( EDI, EAX ) /* next vertex */ + ADD_L ( CONST(16), EDX ) /* next r */ - MOVD ( MM7, REGOFF(-4, EDX) ) /* write r3 */ - MOVD ( REGOFF(8, EAX), MM5 ) /* | x2 */ + DEC_L ( ESI ) /* decrement vertex counter */ + MOVQ ( MM0, REGOFF(-16, EDX) ) /* r1 | r0 */ - MOVQ ( REGIND(EAX), MM4 ) /* x1 | x0 */ - ADD_L ( EDI, EAX ) /* next vertex */ + MOVD ( MM1, REGOFF(-8, EDX) ) /* | r2 */ + MOVQ ( REGIND(EAX), MM0 ) /* x1 | x0 */ - DEC_L ( ESI ) /* decrement vertex counter */ - JA ( LLBL(G3TPPR_1) ) /* cnt > 0 ? -> process next vertex */ + MOVD ( REGOFF(8, EAX), MM1 ) /* | x2 */ + JNZ ( LLBL( G3TPIR_1 ) ) /* cnt > 0 ? -> process next vertex */ -ALIGNTEXT32 -LLBL(G3TPPR_2): +LLBL( G3TPIR_2 ): FEMMS POP_L ( EDI ) POP_L ( ESI ) RET - - - - - Index: xc/extras/Mesa/src/X86/3dnow_xform_raw4.S diff -u xc/extras/Mesa/src/X86/3dnow_xform_raw4.S:1.3 xc/extras/Mesa/src/X86/3dnow_xform_raw4.S:1.5 --- xc/extras/Mesa/src/X86/3dnow_xform_raw4.S:1.3 Fri Jun 16 20:02:41 2000 +++ xc/extras/Mesa/src/X86/3dnow_xform_raw4.S Mon Nov 13 18:31:09 2000 @@ -1,86 +1,105 @@ -#include "assyntax.h" - - SEG_TEXT - +/* + * Mesa 3-D graphics library + * Version: 3.4 + * + * Copyright (C) 1999-2000 Brian Paul All Rights Reserved. + * + * 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 + * BRIAN PAUL 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 VEC_SIZE_1 1 -#define VEC_SIZE_2 3 -#define VEC_SIZE_3 7 -#define VEC_SIZE_4 15 +#include "assyntax.h" +#include "xform_args.h" + SEG_TEXT +#define FRAME_OFFSET 4 -ALIGNTEXT32 -GLOBL GLNAME(gl_3dnow_transform_points4_general_raw) +ALIGNTEXT16 +GLOBL GLNAME( gl_3dnow_transform_points4_general_raw ) GLNAME( gl_3dnow_transform_points4_general_raw ): PUSH_L ( ESI ) - MOV_L ( REGOFF(8, ESP), ECX ) - MOV_L ( REGOFF(12, ESP), ESI ) - MOV_L ( REGOFF(16, ESP), EAX ) - MOV_L ( CONST(4), REGOFF(16, ECX) ) - OR_B ( CONST(VEC_SIZE_4), REGOFF(20, ECX) ) - MOV_L ( REGOFF(8, EAX), EDX ) - MOV_L ( EDX, REGOFF(8, ECX) ) + + MOV_L ( ARG_DEST, ECX ) + MOV_L ( ARG_MATRIX, ESI ) + MOV_L ( ARG_SOURCE, EAX ) + MOV_L ( CONST(4), REGOFF(V4F_SIZE, ECX) ) + OR_B ( CONST(VEC_SIZE_4), REGOFF(V4F_FLAGS, ECX) ) + MOV_L ( REGOFF(V4F_COUNT, EAX), EDX ) + MOV_L ( EDX, REGOFF(V4F_COUNT, ECX) ) PUSH_L ( EDI ) - MOV_L ( REGOFF(4, ECX), EDX ) + MOV_L ( REGOFF(V4F_START, ECX), EDX ) MOV_L ( ESI, ECX ) - MOV_L ( REGOFF(8, EAX), ESI ) - MOV_L ( REGOFF(12, EAX), EDI ) - MOV_L ( REGOFF(4, EAX), EAX ) + MOV_L ( REGOFF(V4F_COUNT, EAX), ESI ) + MOV_L ( REGOFF(V4F_STRIDE, EAX), EDI ) + MOV_L ( REGOFF(V4F_START, EAX), EAX ) - CMP_L ( CONST(0), ESI ) - JE ( LLBL(G3TPGR_2) ) + TEST_L ( ESI, ESI ) + JZ ( LLBL( G3TPGR_2 ) ) PREFETCHW ( REGIND(EDX) ) - MOVQ ( REGIND(EAX), MM0 ) /* x1 | x0 */ - MOVQ ( REGOFF(8, EAX), MM4 ) /* x3 | x2 */ + MOVQ ( REGIND(EAX), MM0 ) /* x1 | x0 */ + MOVQ ( REGOFF(8, EAX), MM4 ) /* x3 | x2 */ - ADD_L ( EDI, EAX ) /* next vertex */ + ADD_L ( EDI, EAX ) /* next vertex */ -ALIGNTEXT32 -LLBL(G3TPGR_1): +ALIGNTEXT16 +LLBL( G3TPGR_1 ): - PREFETCHW ( REGOFF(32, EDX) ) /* prefetch 2 vertices ahead */ - + PREFETCHW ( REGOFF(32, EDX) ) /* prefetch 2 vertices ahead */ PREFETCH ( REGIND(EAX) ) - MOVQ ( MM0, MM2 ) /* x1 | x0 */ - MOVQ ( MM4, MM6 ) /* x3 | x2 */ + MOVQ ( MM0, MM2 ) /* x1 | x0 */ + MOVQ ( MM4, MM6 ) /* x3 | x2 */ - PUNPCKLDQ ( MM0, MM0 ) /* x0 | x0 */ - PUNPCKHDQ ( MM2, MM2 ) /* x1 | x1 */ + PUNPCKLDQ ( MM0, MM0 ) /* x0 | x0 */ + PUNPCKHDQ ( MM2, MM2 ) /* x1 | x1 */ - MOVQ ( MM0, MM1 ) /* x0 | x0 */ - ADD_L ( CONST(16), EDX ) /* next r */ + MOVQ ( MM0, MM1 ) /* x0 | x0 */ + ADD_L ( CONST(16), EDX ) /* next r */ - PFMUL ( REGIND(ECX), MM0 ) /* x0*m1 | x0*m0 */ - MOVQ ( MM2, MM3 ) /* x1 | x1 */ + PFMUL ( REGIND(ECX), MM0 ) /* x0*m1 | x0*m0 */ + MOVQ ( MM2, MM3 ) /* x1 | x1 */ - PFMUL ( REGOFF(8, ECX), MM1 ) /* x0*m3 | x0*m2 */ - PUNPCKLDQ ( MM4, MM4 ) /* x2 | x2 */ + PFMUL ( REGOFF(8, ECX), MM1 ) /* x0*m3 | x0*m2 */ + PUNPCKLDQ ( MM4, MM4 ) /* x2 | x2 */ - PFMUL ( REGOFF(16, ECX), MM2 ) /* x1*m5 | x1*m4 */ - MOVQ ( MM4, MM5 ) /* x2 | x2 */ + PFMUL ( REGOFF(16, ECX), MM2 ) /* x1*m5 | x1*m4 */ + MOVQ ( MM4, MM5 ) /* x2 | x2 */ - PFMUL ( REGOFF(24, ECX), MM3 ) /* x1*m7 | x1*m6 */ - PUNPCKHDQ ( MM6, MM6 ) /* x3 | x3 */ + PFMUL ( REGOFF(24, ECX), MM3 ) /* x1*m7 | x1*m6 */ + PUNPCKHDQ ( MM6, MM6 ) /* x3 | x3 */ - PFMUL ( REGOFF(32, ECX), MM4 ) /* x2*m9 | x2*m8 */ - MOVQ ( MM6, MM7 ) /* x3 | x3 */ + PFMUL ( REGOFF(32, ECX), MM4 ) /* x2*m9 | x2*m8 */ + MOVQ ( MM6, MM7 ) /* x3 | x3 */ - PFMUL ( REGOFF(40, ECX), MM5 ) /* x2*m11 | x2*m10 */ + PFMUL ( REGOFF(40, ECX), MM5 ) /* x2*m11 | x2*m10 */ PFADD ( MM0, MM2 ) - PFMUL ( REGOFF(48, ECX), MM6 ) /* x3*m13 | x3*m12 */ + PFMUL ( REGOFF(48, ECX), MM6 ) /* x3*m13 | x3*m12 */ PFADD ( MM1, MM3 ) - PFMUL ( REGOFF(56, ECX), MM7 ) /* x3*m15 | x3*m14 */ + PFMUL ( REGOFF(56, ECX), MM7 ) /* x3*m15 | x3*m14 */ PFADD ( MM4, MM6 ) PFADD ( MM5, MM7 ) @@ -90,17 +109,15 @@ MOVQ ( MM6, REGOFF(-16, EDX) ) MOVQ ( MM7, REGOFF(-8, EDX) ) - MOVQ ( REGIND(EAX), MM0 ) /* x1 | x0 */ - - MOVQ ( REGOFF(8, EAX), MM4 ) /* x3 | x2 */ - ADD_L ( EDI, EAX ) /* next vertex */ + MOVQ ( REGIND(EAX), MM0 ) /* x1 | x0 */ - DEC_L ( ESI ) /* decrement vertex counter */ - JA ( LLBL(G3TPGR_1) ) /* cnt > 0 ? -> process next vertex */ + MOVQ ( REGOFF(8, EAX), MM4 ) /* x3 | x2 */ + ADD_L ( EDI, EAX ) /* next vertex */ + DEC_L ( ESI ) /* decrement vertex counter */ + JNZ ( LLBL( G3TPGR_1 ) ) /* cnt > 0 ? -> process next vertex */ -ALIGNTEXT32 -LLBL(G3TPGR_2): +LLBL( G3TPGR_2 ): FEMMS POP_L ( EDI ) @@ -110,58 +127,83 @@ - -ALIGNTEXT32 -GLOBL GLNAME(gl_3dnow_transform_points4_identity_raw) -GLNAME( gl_3dnow_transform_points4_identity_raw ): +ALIGNTEXT16 +GLOBL GLNAME( gl_3dnow_transform_points4_perspective_raw ) +GLNAME( gl_3dnow_transform_points4_perspective_raw ): PUSH_L ( ESI ) - MOV_L ( REGOFF(8, ESP), ECX ) - MOV_L ( REGOFF(12, ESP), ESI ) - MOV_L ( REGOFF(16, ESP), EAX ) - MOV_L ( CONST(4), REGOFF(16, ECX) ) - OR_B ( CONST(VEC_SIZE_4), REGOFF(20, ECX) ) - MOV_L ( REGOFF(8, EAX), EDX ) - MOV_L ( EDX, REGOFF(8, ECX) ) + + MOV_L ( ARG_DEST, ECX ) + MOV_L ( ARG_MATRIX, ESI ) + MOV_L ( ARG_SOURCE, EAX ) + MOV_L ( CONST(4), REGOFF(V4F_SIZE, ECX) ) + OR_B ( CONST(VEC_SIZE_4), REGOFF(V4F_FLAGS, ECX) ) + MOV_L ( REGOFF(V4F_COUNT, EAX), EDX ) + MOV_L ( EDX, REGOFF(V4F_COUNT, ECX) ) PUSH_L ( EDI ) - MOV_L ( REGOFF(4, ECX), EDX ) + MOV_L ( REGOFF(V4F_START, ECX), EDX ) MOV_L ( ESI, ECX ) - MOV_L ( REGOFF(8, EAX), ESI ) - MOV_L ( REGOFF(12, EAX), EDI ) - MOV_L ( REGOFF(4, EAX), EAX ) + MOV_L ( REGOFF(V4F_COUNT, EAX), ESI ) + MOV_L ( REGOFF(V4F_STRIDE, EAX), EDI ) + MOV_L ( REGOFF(V4F_START, EAX), EAX ) - CMP_L ( CONST(0), ESI ) - JE ( LLBL(G3TPIR_2) ) + TEST_L ( ESI, ESI ) + JZ ( LLBL( G3TPPR_2 ) ) - MOVQ ( REGIND(EAX), MM0 ) /* x1 | x0 */ - MOVQ ( REGOFF(8, EAX), MM1 ) /* x3 | x2 */ + PREFETCH ( REGIND(EAX) ) + PREFETCHW ( REGIND(EDX) ) - ADD_L ( EDI, EAX ) /* next vertex */ + MOVD ( REGIND(ECX), MM0 ) /* | m00 */ + PUNPCKLDQ ( REGOFF(20, ECX), MM0 ) /* m11 | m00 */ -ALIGNTEXT32 -LLBL(G3TPIR_1): + MOVD ( REGOFF(40, ECX), MM1 ) /* | m22 */ + PUNPCKLDQ ( REGOFF(56, ECX), MM1 ) /* m32 | m22 */ - PREFETCHW ( REGOFF(32, EDX) ) /* prefetch 2 vertices ahead */ + MOVQ ( REGOFF(32, ECX), MM2 ) /* m21 | m20 */ + PXOR ( MM7, MM7 ) /* 0 | 0 */ - PREFETCH ( REGIND(EAX) ) + MOVQ ( REGIND(EAX), MM4 ) /* x1 | x0 */ + MOVQ ( REGOFF(8, EAX), MM5 ) /* x3 | x2 */ + MOVD ( REGOFF(8, EAX), MM3 ) /* | x2 */ + + ADD_L ( EDI, EAX ) /* next vertex */ + +ALIGNTEXT16 +LLBL( G3TPPR_1 ): + + PREFETCHW ( REGOFF(32, EDX) ) /* prefetch 2 vertices ahead */ + PREFETCH ( REGOFF(32, EAX) ) /* hopefully stride is zero */ + + MOVQ ( MM5, MM6 ) /* x3 | x2 */ + PFMUL ( MM0, MM4 ) /* x1*m11 | x0*m00 */ - ADD_L ( CONST(16), EDX ) /* next r */ - MOVQ ( MM0, REGOFF(-16, EDX) ) /* r1 | r0 */ + PUNPCKLDQ ( MM5, MM5 ) /* x2 | x2 */ + ADD_L ( CONST(16), EDX ) /* next r */ - MOVQ ( MM1, REGOFF(-8, EDX) ) /* r3 | r2 */ - MOVQ ( REGIND(EAX), MM0 ) /* x1 | x0 */ + PFMUL ( MM2, MM5 ) /* x2*m21 | x2*m20 */ + PFSUBR ( MM7, MM3 ) /* | -x2 */ - MOVQ ( REGOFF(8, EAX), MM1 ) /* x3 | x2 */ - ADD_L ( EDI, EAX ) /* next vertex */ + PFMUL ( MM1, MM6 ) /* x3*m32 | x2*m22 */ + PFADD ( MM4, MM5 ) /* x1*m11+x2*m21 | x0*m00+x2*m20 */ - DEC_L ( ESI ) /* decrement vertex counter */ - JA ( LLBL(G3TPIR_1) ) /* cnt > 0 ? -> process next vertex */ + PFACC ( MM3, MM6 ) /* -x2 | x2*m22+x3*m32 */ + MOVQ ( MM5, REGOFF(-16, EDX) ) /* write r0, r1 */ -ALIGNTEXT32 -LLBL(G3TPIR_2): + MOVQ ( MM6, REGOFF(-8, EDX) ) /* write r2, r3 */ + MOVQ ( REGIND(EAX), MM4 ) /* x1 | x0 */ + MOVQ ( REGOFF(8, EAX), MM5 ) /* x3 | x2 */ + MOVD ( REGOFF(8, EAX), MM3 ) /* | x2 */ + + ADD_L ( EDI, EAX ) /* next vertex */ + DEC_L ( ESI ) /* decrement vertex counter */ + + JNZ ( LLBL( G3TPPR_1 ) ) /* cnt > 0 ? -> process next vertex */ + +LLBL( G3TPPR_2 ): + FEMMS POP_L ( EDI ) POP_L ( ESI ) @@ -169,79 +211,91 @@ - -ALIGNTEXT32 -GLOBL GLNAME(gl_3dnow_transform_points4_2d_raw) -GLNAME( gl_3dnow_transform_points4_2d_raw ): +ALIGNTEXT16 +GLOBL GLNAME( gl_3dnow_transform_points4_3d_raw ) +GLNAME( gl_3dnow_transform_points4_3d_raw ): PUSH_L ( ESI ) - MOV_L ( REGOFF(8, ESP), ECX ) - MOV_L ( REGOFF(12, ESP), ESI ) - MOV_L ( REGOFF(16, ESP), EAX ) - MOV_L ( CONST(4), REGOFF(16, ECX) ) - OR_B ( CONST(VEC_SIZE_4), REGOFF(20, ECX) ) - MOV_L ( REGOFF(8, EAX), EDX ) - MOV_L ( EDX, REGOFF(8, ECX) ) + + MOV_L ( ARG_DEST, ECX ) + MOV_L ( ARG_MATRIX, ESI ) + MOV_L ( ARG_SOURCE, EAX ) + MOV_L ( CONST(4), REGOFF(V4F_SIZE, ECX) ) + OR_B ( CONST(VEC_SIZE_4), REGOFF(V4F_FLAGS, ECX) ) + MOV_L ( REGOFF(V4F_COUNT, EAX), EDX ) + MOV_L ( EDX, REGOFF(V4F_COUNT, ECX) ) PUSH_L ( EDI ) - MOV_L ( REGOFF(4, ECX), EDX ) + MOV_L ( REGOFF(V4F_START, ECX), EDX ) MOV_L ( ESI, ECX ) - MOV_L ( REGOFF(8, EAX), ESI ) - MOV_L ( REGOFF(12, EAX), EDI ) - MOV_L ( REGOFF(4, EAX), EAX ) + MOV_L ( REGOFF(V4F_COUNT, EAX), ESI ) + MOV_L ( REGOFF(V4F_STRIDE, EAX), EDI ) + MOV_L ( REGOFF(V4F_START, EAX), EAX ) - CMP_L ( CONST(0), ESI ) - JE ( LLBL(G3TP2R_2) ) + TEST_L ( ESI, ESI ) + JZ ( LLBL( G3TP3R_2 ) ) - MOVD ( REGIND(ECX), MM0 ) /* | m00 */ - PUNPCKLDQ ( REGOFF(16, ECX), MM0 ) /* m10 | m00 */ + MOVD ( REGOFF(8, ECX), MM6 ) /* | m2 */ + PUNPCKLDQ ( REGOFF(24, ECX), MM6 ) /* m6 | m2 */ - MOVD ( REGOFF(4, ECX), MM1 ) /* | m01 */ - PUNPCKLDQ ( REGOFF(20, ECX), MM1 ) /* m11 | m01 */ + MOVD ( REGOFF(40, ECX), MM7 ) /* | m10 */ + PUNPCKLDQ ( REGOFF(56, ECX), MM7 ) /* m14 | m10 */ - MOVQ ( REGOFF(48, ECX), MM2 ) /* m31 | m30 */ + MOVQ ( REGIND(EAX), MM2 ) /* x1 | x0 */ + MOVQ ( REGOFF(8, EAX), MM3 ) /* x3 | x2 */ - MOVQ ( REGIND(EAX), MM3 ) /* x1 | x0 */ - MOVQ ( REGOFF(8, EAX), MM5 ) /* x3 | x2 */ +ALIGNTEXT16 +LLBL( G3TP3R_1 ): - ADD_L ( EDI, EAX ) /* next vertex */ + PREFETCHW ( REGOFF(32, EDX) ) /* prefetch 2 vertices ahead */ + PREFETCH ( REGOFF(32, EAX) ) /* hopefully array is tightly packed */ -ALIGNTEXT32 -LLBL(G3TP2R_1): + MOVQ ( MM2, MM0 ) /* x1 | x0 */ + MOVQ ( MM3, MM4 ) /* x3 | x2 */ - PREFETCHW ( REGOFF(32, EDX) ) /* prefetch 2 vertices ahead */ + MOVQ ( MM0, MM1 ) /* x1 | x0 */ + MOVQ ( MM4, MM5 ) /* x3 | x2 */ - PREFETCH ( REGIND(EAX) ) + PUNPCKLDQ ( MM0, MM0 ) /* x0 | x0 */ + PUNPCKHDQ ( MM1, MM1 ) /* x1 | x1 */ - MOVQ ( MM3, MM4 ) /* x1 | x0 */ - MOVQ ( MM5, MM6 ) /* x3 | x2 */ + PFMUL ( REGIND(ECX), MM0 ) /* x0*m1 | x0*m0 */ + PUNPCKLDQ ( MM3, MM3 ) /* x2 | x2 */ - PFMUL ( MM1, MM4 ) /* x1*m11 | x0*m01 */ - PUNPCKHDQ ( MM6, MM6 ) /* x3 | x3 */ + PFMUL ( REGOFF(16, ECX), MM1 ) /* x1*m5 | x1*m4 */ + PUNPCKHDQ ( MM4, MM4 ) /* x3 | x3 */ - PFMUL ( MM0, MM3 ) /* x1*m10 | x0*m00 */ - ADD_L ( CONST(16), EDX ) /* next r */ + PFMUL ( MM6, MM2 ) /* x1*m6 | x0*m2 */ + PFADD ( MM0, MM1 ) /* x0*m1+x1*m5 | x0*m0+x1*m4 */ - PFACC ( MM4, MM3 ) /* x0*m01+x1*m11 | x0*m00+x1*m10 */ - PFMUL ( MM2, MM6 ) /* x3*m31 | x3*m30 */ + PFMUL ( REGOFF(32, ECX), MM3 ) /* x2*m9 | x2*m8 */ + ADD_L ( CONST(16), EDX ) /* next r */ - PFADD ( MM6, MM3 ) /* r1 | r0 */ - MOVQ ( MM5, REGOFF(-8, EDX) ) /* write r2, r3 */ + PFMUL ( REGOFF(48, ECX), MM4 ) /* x3*m13 | x3*m12 */ + PFADD ( MM1, MM3 ) /* x0*m1+..+x2*m9 | x0*m0+...+x2*m8 */ - MOVQ ( MM3, REGOFF(-16, EDX) ) /* write r0, r1 */ - MOVQ ( REGIND(EAX), MM3 ) /* x1 | x0 */ + PFMUL ( MM7, MM5 ) /* x3*m14 | x2*m10 */ + PFADD ( MM3, MM4 ) /* r1 | r0 */ - MOVQ ( REGOFF(8, EAX), MM5 ) /* x3 | x2 */ - ADD_L ( EDI, EAX ) /* next vertex */ + PFACC ( MM2, MM5 ) /* x0*m2+x1*m6 | x2*m10+x3*m14 */ + MOVD ( REGOFF(12, EAX), MM0 ) /* | x3 */ - DEC_L ( ESI ) /* decrement vertex counter */ - JA ( LLBL(G3TP2R_1) ) /* cnt > 0 ? -> process next vertex */ + ADD_L ( EDI, EAX ) /* next vertex */ + PFACC ( MM0, MM5 ) /* r3 | r2 */ -ALIGNTEXT32 -LLBL(G3TP2R_2): + MOVQ ( MM4, REGOFF(-16, EDX) ) /* write r0, r1 */ + MOVQ ( MM5, REGOFF(-8, EDX) ) /* write r2, r3 */ + MOVQ ( REGIND(EAX), MM2 ) /* x1 | x0 */ + MOVQ ( REGOFF(8, EAX), MM3 ) /* x3 | x2 */ + + DEC_L ( ESI ) /* decrement vertex counter */ + JNZ ( LLBL( G3TP3R_1 ) ) /* cnt > 0 ? -> process next vertex */ + +LLBL( G3TP3R_2 ): + FEMMS POP_L ( EDI ) POP_L ( ESI ) @@ -250,70 +304,75 @@ - -ALIGNTEXT32 -GLOBL GLNAME(gl_3dnow_transform_points4_2d_no_rot_raw) -GLNAME( gl_3dnow_transform_points4_2d_no_rot_raw ): +ALIGNTEXT16 +GLOBL GLNAME( gl_3dnow_transform_points4_3d_no_rot_raw ) +GLNAME( gl_3dnow_transform_points4_3d_no_rot_raw ): PUSH_L ( ESI ) - MOV_L ( REGOFF(8, ESP), ECX ) - MOV_L ( REGOFF(12, ESP), ESI ) - MOV_L ( REGOFF(16, ESP), EAX ) - MOV_L ( CONST(4), REGOFF(16, ECX) ) - OR_B ( CONST(VEC_SIZE_4), REGOFF(20, ECX) ) - MOV_L ( REGOFF(8, EAX), EDX ) - MOV_L ( EDX, REGOFF(8, ECX) ) + MOV_L ( ARG_DEST, ECX ) + MOV_L ( ARG_MATRIX, ESI ) + MOV_L ( ARG_SOURCE, EAX ) + MOV_L ( CONST(4), REGOFF(V4F_SIZE, ECX) ) + OR_B ( CONST(VEC_SIZE_4), REGOFF(V4F_FLAGS, ECX) ) + MOV_L ( REGOFF(V4F_COUNT, EAX), EDX ) + MOV_L ( EDX, REGOFF(V4F_COUNT, ECX) ) PUSH_L ( EDI ) - MOV_L ( REGOFF(4, ECX), EDX ) + MOV_L ( REGOFF(V4F_START, ECX), EDX ) MOV_L ( ESI, ECX ) - MOV_L ( REGOFF(8, EAX), ESI ) - MOV_L ( REGOFF(12, EAX), EDI ) - MOV_L ( REGOFF(4, EAX), EAX ) + MOV_L ( REGOFF(V4F_COUNT, EAX), ESI ) + MOV_L ( REGOFF(V4F_STRIDE, EAX), EDI ) + MOV_L ( REGOFF(V4F_START, EAX), EAX ) - CMP_L ( CONST(0), ESI ) - JE ( LLBL(G3TP2NRR_3) ) + TEST_L ( ESI, ESI ) + JZ ( LLBL( G3TP3NRR_2 ) ) - MOVD ( REGIND(ECX), MM0 ) /* | m00 */ - PUNPCKLDQ ( REGOFF(20, ECX), MM0 ) /* m11 | m00 */ + MOVD ( REGIND(ECX), MM0 ) /* | m00 */ + PUNPCKLDQ ( REGOFF(20, ECX), MM0 ) /* m11 | m00 */ - MOVQ ( REGOFF(48, ECX), MM1 ) /* m31 | m30 */ + MOVD ( REGOFF(40, ECX), MM2 ) /* | m22 */ + PUNPCKLDQ ( REGOFF(56, ECX), MM2 ) /* m32 | m22 */ - MOVQ ( REGIND(EAX), MM4 ) /* x1 | x0 */ - MOVQ ( REGOFF(8, EAX), MM5 ) /* x3 | x2 */ + MOVQ ( REGOFF(48, ECX), MM1 ) /* m31 | m30 */ - ADD_L ( EDI, EAX ) /* next vertex */ + MOVQ ( REGIND(EAX), MM4 ) /* x1 | x0 */ + MOVQ ( REGOFF(8, EAX), MM5 ) /* x3 | x2 */ + MOVD ( REGOFF(12, EAX), MM7 ) /* | x3 */ -ALIGNTEXT32 -LLBL(G3TP2NRR_2): + ADD_L ( EDI, EAX ) /* next vertex */ - PREFETCHW ( REGOFF(32, EDX) ) /* prefetch 2 vertices ahead */ +ALIGNTEXT16 +LLBL( G3TP3NRR_1 ): - PREFETCH ( REGIND(EAX) ) + PREFETCHW ( REGOFF(32, EDX) ) /* prefetch 2 vertices ahead */ + PREFETCH ( REGOFF(32, EAX) ) /* hopefully stride is zero */ + + MOVQ ( MM5, MM6 ) /* x3 | x2 */ + PFMUL ( MM0, MM4 ) /* x1*m11 | x0*m00 */ - PFMUL ( MM0, MM4 ) /* x1*m11 | x0*m00 */ - MOVQ ( MM5, MM6 ) /* x3 | x2 */ + PUNPCKHDQ ( MM6, MM6 ) /* x3 | x3 */ + PFMUL ( MM2, MM5 ) /* x3*m32 | x2*m22 */ - ADD_L ( CONST(16), EDX ) /* next r */ - PUNPCKHDQ ( MM6, MM6 ) /* x3 | x3 */ + PFMUL ( MM1, MM6 ) /* x3*m31 | x3*m30 */ + PFACC ( MM7, MM5 ) /* x3 | x2*m22+x3*m32 */ - PFMUL ( MM1, MM6 ) /* x3*m31 | x3*m30 */ - PFADD ( MM4, MM6 ) /* x1*m11+x3*m31 | x0*m00+x3*m30 */ + PFADD ( MM6, MM4 ) /* x1*m11+x3*m31 | x0*m00+x3*m30 */ + ADD_L ( CONST(16), EDX ) /* next r */ - MOVQ ( MM6, REGOFF(-16, EDX) ) /* write r0, r1 */ - MOVQ ( MM5, REGOFF(-8, EDX) ) /* write r2, r3 */ + MOVQ ( MM4, REGOFF(-16, EDX) ) /* write r0, r1 */ + MOVQ ( MM5, REGOFF(-8, EDX) ) /* write r2, r3 */ - MOVQ ( REGIND(EAX), MM4 ) /* x1 | x0 */ - MOVQ ( REGOFF(8, EAX), MM5 ) /* x3 | x2 */ + MOVQ ( REGIND(EAX), MM4 ) /* x1 | x0 */ + MOVQ ( REGOFF(8, EAX), MM5 ) /* x3 | x2 */ - ADD_L ( EDI, EAX ) /* next vertex */ - DEC_L ( ESI ) /* decrement vertex counter */ + MOVD ( REGOFF(12, EAX), MM7 ) /* | x3 */ + ADD_L ( EDI, EAX ) /* next vertex */ - JA ( LLBL(G3TP2NRR_2) ) /* cnt > 0 ? -> process next vertex */ + DEC_L ( ESI ) /* decrement vertex counter */ + JNZ ( LLBL( G3TP3NRR_1 ) ) /* cnt > 0 ? -> process next vertex */ -ALIGNTEXT32 -LLBL(G3TP2NRR_3): +LLBL( G3TP3NRR_2 ): FEMMS POP_L ( EDI ) @@ -323,92 +382,75 @@ - -ALIGNTEXT32 -GLOBL GLNAME(gl_3dnow_transform_points4_3d_raw) -GLNAME( gl_3dnow_transform_points4_3d_raw ): +ALIGNTEXT16 +GLOBL GLNAME( gl_3dnow_transform_points4_2d_raw ) +GLNAME( gl_3dnow_transform_points4_2d_raw ): PUSH_L ( ESI ) - MOV_L ( REGOFF(8, ESP), ECX ) - MOV_L ( REGOFF(12, ESP), ESI ) - MOV_L ( REGOFF(16, ESP), EAX ) - MOV_L ( CONST(4), REGOFF(16, ECX) ) - OR_B ( CONST(VEC_SIZE_4), REGOFF(20, ECX) ) - MOV_L ( REGOFF(8, EAX), EDX ) - MOV_L ( EDX, REGOFF(8, ECX) ) + MOV_L ( ARG_DEST, ECX ) + MOV_L ( ARG_MATRIX, ESI ) + MOV_L ( ARG_SOURCE, EAX ) + MOV_L ( CONST(4), REGOFF(V4F_SIZE, ECX) ) + OR_B ( CONST(VEC_SIZE_4), REGOFF(V4F_FLAGS, ECX) ) + MOV_L ( REGOFF(V4F_COUNT, EAX), EDX ) + MOV_L ( EDX, REGOFF(V4F_COUNT, ECX) ) + PUSH_L ( EDI ) - MOV_L ( REGOFF(4, ECX), EDX ) + MOV_L ( REGOFF(V4F_START, ECX), EDX ) MOV_L ( ESI, ECX ) - MOV_L ( REGOFF(8, EAX), ESI ) - MOV_L ( REGOFF(12, EAX), EDI ) - MOV_L ( REGOFF(4, EAX), EAX ) - - CMP_L ( CONST(0), ESI ) - JE ( LLBL(G3TP3R_2) ) + MOV_L ( REGOFF(V4F_COUNT, EAX), ESI ) + MOV_L ( REGOFF(V4F_STRIDE, EAX), EDI ) + MOV_L ( REGOFF(V4F_START, EAX), EAX ) - MOVD ( REGOFF(8, ECX), MM6 ) /* | m2 */ - PUNPCKLDQ ( REGOFF(24, ECX), MM6 ) /* m6 | m2 */ + TEST_L ( ESI, ESI ) + JZ ( LLBL( G3TP2R_2 ) ) - MOVD ( REGOFF(40, ECX), MM7 ) /* | m10 */ - PUNPCKLDQ ( REGOFF(56, ECX), MM7 ) /* m14 | m10 */ + MOVD ( REGIND(ECX), MM0 ) /* | m00 */ + PUNPCKLDQ ( REGOFF(16, ECX), MM0 ) /* m10 | m00 */ - MOVQ ( REGIND(EAX), MM2 ) /* x1 | x0 */ - MOVQ ( REGOFF(8, EAX), MM3 ) /* x3 | x2 */ + MOVD ( REGOFF(4, ECX), MM1 ) /* | m01 */ + PUNPCKLDQ ( REGOFF(20, ECX), MM1 ) /* m11 | m01 */ -ALIGNTEXT32 -LLBL(G3TP3R_1): + MOVQ ( REGOFF(48, ECX), MM2 ) /* m31 | m30 */ - PREFETCHW ( REGOFF(32, EDX) ) /* prefetch 2 vertices ahead */ - - PREFETCH ( REGOFF(32, EAX) ) /* hopefully array is tightly packed */ - - MOVQ ( MM2, MM0 ) /* x1 | x0 */ - MOVQ ( MM3, MM4 ) /* x3 | x2 */ + MOVQ ( REGIND(EAX), MM3 ) /* x1 | x0 */ + MOVQ ( REGOFF(8, EAX), MM5 ) /* x3 | x2 */ - MOVQ ( MM0, MM1 ) /* x1 | x0 */ - MOVQ ( MM4, MM5 ) /* x3 | x2 */ + ADD_L ( EDI, EAX ) /* next vertex */ - PUNPCKLDQ ( MM0, MM0 ) /* x0 | x0 */ - PUNPCKHDQ ( MM1, MM1 ) /* x1 | x1 */ - - PFMUL ( REGIND(ECX), MM0 ) /* x0*m1 | x0*m0 */ - PUNPCKLDQ ( MM3, MM3 ) /* x2 | x2 */ +ALIGNTEXT16 +LLBL( G3TP2R_1 ): - PFMUL ( REGOFF(16, ECX), MM1 ) /* x1*m5 | x1*m4 */ - PUNPCKHDQ ( MM4, MM4 ) /* x3 | x3 */ - - PFMUL ( MM6, MM2 ) /* x1*m6 | x0*m2 */ - PFADD ( MM0, MM1 ) /* x0*m1+x1*m5 | x0*m0+x1*m4 */ + PREFETCHW ( REGOFF(32, EDX) ) /* prefetch 2 vertices ahead */ + PREFETCH ( REGIND(EAX) ) - PFMUL ( REGOFF(32, ECX), MM3 ) /* x2*m9 | x2*m8 */ - ADD_L ( CONST(16), EDX ) /* next r */ + MOVQ ( MM3, MM4 ) /* x1 | x0 */ + MOVQ ( MM5, MM6 ) /* x3 | x2 */ - PFMUL ( REGOFF(48, ECX), MM4 ) /* x3*m13 | x3*m12 */ - PFADD ( MM1, MM3 ) /* x0*m1+..+x2*m9| x0*m0+...+x2*m8 */ - - PFMUL ( MM7, MM5 ) /* x3*m14 | x2*m10 */ - PFADD ( MM3, MM4 ) /* r1 | r0 */ + PFMUL ( MM1, MM4 ) /* x1*m11 | x0*m01 */ + PUNPCKHDQ ( MM6, MM6 ) /* x3 | x3 */ - PFACC ( MM2, MM5 ) /* x0*m2+x1*m6 | x2*m10+x3*m14 */ - MOVD ( REGOFF(12, EAX), MM0 ) /* | x3 */ + PFMUL ( MM0, MM3 ) /* x1*m10 | x0*m00 */ + ADD_L ( CONST(16), EDX ) /* next r */ - ADD_L ( EDI, EAX ) /* next vertex */ - PFACC ( MM0, MM5 ) /* r3 | r2 */ + PFACC ( MM4, MM3 ) /* x0*m01+x1*m11 | x0*m00+x1*m10 */ + PFMUL ( MM2, MM6 ) /* x3*m31 | x3*m30 */ - MOVQ ( MM4, REGOFF(-16, EDX) ) /* write r0, r1 */ - MOVQ ( MM5, REGOFF(-8, EDX) ) /* write r2, r3 */ + PFADD ( MM6, MM3 ) /* r1 | r0 */ + MOVQ ( MM5, REGOFF(-8, EDX) ) /* write r2, r3 */ - MOVQ ( REGIND(EAX), MM2 ) /* x1 | x0 */ - MOVQ ( REGOFF(8, EAX), MM3 ) /* x3 | x2 */ + MOVQ ( MM3, REGOFF(-16, EDX) ) /* write r0, r1 */ + MOVQ ( REGIND(EAX), MM3 ) /* x1 | x0 */ - DEC_L ( ESI ) /* decrement vertex counter */ - JA ( LLBL(G3TP3R_1) ) /* cnt > 0 ? -> process next vertex */ + MOVQ ( REGOFF(8, EAX), MM5 ) /* x3 | x2 */ + ADD_L ( EDI, EAX ) /* next vertex */ + DEC_L ( ESI ) /* decrement vertex counter */ + JNZ ( LLBL( G3TP2R_1 ) ) /* cnt > 0 ? -> process next vertex */ -ALIGNTEXT32 -LLBL(G3TP3R_2): +LLBL( G3TP2R_2 ): FEMMS POP_L ( EDI ) @@ -417,79 +459,69 @@ - -ALIGNTEXT32 -GLOBL GLNAME(gl_3dnow_transform_points4_3d_no_rot_raw) -GLNAME( gl_3dnow_transform_points4_3d_no_rot_raw ): +ALIGNTEXT16 +GLOBL GLNAME( gl_3dnow_transform_points4_2d_no_rot_raw ) +GLNAME( gl_3dnow_transform_points4_2d_no_rot_raw ): PUSH_L ( ESI ) - MOV_L ( REGOFF(8, ESP), ECX ) - MOV_L ( REGOFF(12, ESP), ESI ) - MOV_L ( REGOFF(16, ESP), EAX ) - MOV_L ( CONST(4), REGOFF(16, ECX) ) - OR_B ( CONST(VEC_SIZE_4), REGOFF(20, ECX) ) - MOV_L ( REGOFF(8, EAX), EDX ) - MOV_L ( EDX, REGOFF(8, ECX) ) + + MOV_L ( ARG_DEST, ECX ) + MOV_L ( ARG_MATRIX, ESI ) + MOV_L ( ARG_SOURCE, EAX ) + MOV_L ( CONST(4), REGOFF(V4F_SIZE, ECX) ) + OR_B ( CONST(VEC_SIZE_4), REGOFF(V4F_FLAGS, ECX) ) + MOV_L ( REGOFF(V4F_COUNT, EAX), EDX ) + MOV_L ( EDX, REGOFF(V4F_COUNT, ECX) ) PUSH_L ( EDI ) - MOV_L ( REGOFF(4, ECX), EDX ) + MOV_L ( REGOFF(V4F_START, ECX), EDX ) MOV_L ( ESI, ECX ) - MOV_L ( REGOFF(8, EAX), ESI ) - MOV_L ( REGOFF(12, EAX), EDI ) - MOV_L ( REGOFF(4, EAX), EAX ) + MOV_L ( REGOFF(V4F_COUNT, EAX), ESI ) + MOV_L ( REGOFF(V4F_STRIDE, EAX), EDI ) + MOV_L ( REGOFF(V4F_START, EAX), EAX ) - CMP_L ( CONST(0), ESI ) - JE ( LLBL(G3TP3NRR_2) ) + TEST_L ( ESI, ESI ) + JZ ( LLBL( G3TP2NRR_3 ) ) - MOVD ( REGIND(ECX), MM0 ) /* | m00 */ - PUNPCKLDQ ( REGOFF(20, ECX), MM0 ) /* m11 | m00 */ + MOVD ( REGIND(ECX), MM0 ) /* | m00 */ + PUNPCKLDQ ( REGOFF(20, ECX), MM0 ) /* m11 | m00 */ - MOVD ( REGOFF(40, ECX), MM2 ) /* | m22 */ - PUNPCKLDQ ( REGOFF(56, ECX), MM2 ) /* m32 | m22 */ + MOVQ ( REGOFF(48, ECX), MM1 ) /* m31 | m30 */ - MOVQ ( REGOFF(48, ECX), MM1 ) /* m31 | m30 */ + MOVQ ( REGIND(EAX), MM4 ) /* x1 | x0 */ + MOVQ ( REGOFF(8, EAX), MM5 ) /* x3 | x2 */ - MOVQ ( REGIND(EAX), MM4 ) /* x1 | x0 */ - MOVQ ( REGOFF(8, EAX), MM5 ) /* x3 | x2 */ - MOVD ( REGOFF(12, EAX), MM7 ) /* | x3 */ - - ADD_L ( EDI, EAX ) /* next vertex */ - -ALIGNTEXT32 -LLBL(G3TP3NRR_1): - - PREFETCHW ( REGOFF(32, EDX) ) /* prefetch 2 vertices ahead */ + ADD_L ( EDI, EAX ) /* next vertex */ - PREFETCH ( REGOFF(32, EAX) ) /* hopefully stride is zero */ +ALIGNTEXT16 +LLBL( G3TP2NRR_2 ): - MOVQ ( MM5, MM6 ) /* x3 | x2 */ - PFMUL ( MM0, MM4 ) /* x1*m11 | x0*m00 */ + PREFETCHW ( REGOFF(32, EDX) ) /* prefetch 2 vertices ahead */ + PREFETCH ( REGIND(EAX) ) - PUNPCKHDQ ( MM6, MM6 ) /* x3 | x3 */ - PFMUL ( MM2, MM5 ) /* x3*m32 | x2*m22 */ + PFMUL ( MM0, MM4 ) /* x1*m11 | x0*m00 */ + MOVQ ( MM5, MM6 ) /* x3 | x2 */ - PFMUL ( MM1, MM6 ) /* x3*m31 | x3*m30 */ - PFACC ( MM7, MM5 ) /* x3 | x2*m22+x3*m32 */ + ADD_L ( CONST(16), EDX ) /* next r */ + PUNPCKHDQ ( MM6, MM6 ) /* x3 | x3 */ - PFADD ( MM6, MM4 ) /* x1*m11+x3*m31 | x0*m00+x3*m30 */ - ADD_L ( CONST(16), EDX ) /* next r */ + PFMUL ( MM1, MM6 ) /* x3*m31 | x3*m30 */ + PFADD ( MM4, MM6 ) /* x1*m11+x3*m31 | x0*m00+x3*m30 */ - MOVQ ( MM4, REGOFF(-16, EDX) ) /* write r0, r1 */ - MOVQ ( MM5, REGOFF(-8, EDX) ) /* write r2, r3 */ + MOVQ ( MM6, REGOFF(-16, EDX) ) /* write r0, r1 */ + MOVQ ( MM5, REGOFF(-8, EDX) ) /* write r2, r3 */ - MOVQ ( REGIND(EAX), MM4 ) /* x1 | x0 */ - MOVQ ( REGOFF(8, EAX), MM5 ) /* x3 | x2 */ + MOVQ ( REGIND(EAX), MM4 ) /* x1 | x0 */ + MOVQ ( REGOFF(8, EAX), MM5 ) /* x3 | x2 */ - MOVD ( REGOFF(12, EAX), MM7 ) /* | x3 */ - ADD_L ( EDI, EAX ) /* next vertex */ + ADD_L ( EDI, EAX ) /* next vertex */ + DEC_L ( ESI ) /* decrement vertex counter */ - DEC_L ( ESI ) /* decrement vertex counter */ - JA ( LLBL(G3TP3NRR_1) ) /* cnt > 0 ? -> process next vertex */ + JNZ ( LLBL( G3TP2NRR_2 ) ) /* cnt > 0 ? -> process next vertex */ -ALIGNTEXT32 -LLBL(G3TP3NRR_2): +LLBL( G3TP2NRR_3 ): FEMMS POP_L ( EDI ) @@ -499,87 +531,57 @@ -ALIGNTEXT32 -GLOBL GLNAME(gl_3dnow_transform_points4_perspective_raw) -GLNAME( gl_3dnow_transform_points4_perspective_raw ): +ALIGNTEXT16 +GLOBL GLNAME( gl_3dnow_transform_points4_identity_raw ) +GLNAME( gl_3dnow_transform_points4_identity_raw ): PUSH_L ( ESI ) - MOV_L ( REGOFF(8, ESP), ECX ) - MOV_L ( REGOFF(12, ESP), ESI ) - MOV_L ( REGOFF(16, ESP), EAX ) - MOV_L ( CONST(4), REGOFF(16, ECX) ) - OR_B ( CONST(VEC_SIZE_4), REGOFF(20, ECX) ) - MOV_L ( REGOFF(8, EAX), EDX ) - MOV_L ( EDX, REGOFF(8, ECX) ) + MOV_L ( ARG_DEST, ECX ) + MOV_L ( ARG_MATRIX, ESI ) + MOV_L ( ARG_SOURCE, EAX ) + MOV_L ( CONST(4), REGOFF(V4F_SIZE, ECX) ) + OR_B ( CONST(VEC_SIZE_4), REGOFF(V4F_FLAGS, ECX) ) + MOV_L ( REGOFF(V4F_COUNT, EAX), EDX ) + MOV_L ( EDX, REGOFF(V4F_COUNT, ECX) ) + PUSH_L ( EDI ) - MOV_L ( REGOFF(4, ECX), EDX ) + MOV_L ( REGOFF(V4F_START, ECX), EDX ) MOV_L ( ESI, ECX ) - MOV_L ( REGOFF(8, EAX), ESI ) - MOV_L ( REGOFF(12, EAX), EDI ) - MOV_L ( REGOFF(4, EAX), EAX ) - - CMP_L ( CONST(0), ESI ) - JE ( LLBL(G3TPPR_2) ) - - PREFETCH ( REGIND(EAX) ) - - PREFETCHW ( REGIND(EDX) ) - - MOVD ( REGIND(ECX), MM0 ) /* | m00 */ - PUNPCKLDQ ( REGOFF(20, ECX), MM0 ) /* m11 | m00 */ + MOV_L ( REGOFF(V4F_COUNT, EAX), ESI ) + MOV_L ( REGOFF(V4F_STRIDE, EAX), EDI ) + MOV_L ( REGOFF(V4F_START, EAX), EAX ) - MOVD ( REGOFF(40, ECX), MM1 ) /* | m22 */ - PUNPCKLDQ ( REGOFF(56, ECX), MM1 ) /* m32 | m22 */ + TEST_L ( ESI, ESI ) + JZ ( LLBL( G3TPIR_2 ) ) - MOVQ ( REGOFF(32, ECX), MM2 ) /* m21 | m20 */ - PXOR ( MM7, MM7 ) /* 0 | 0 */ + MOVQ ( REGIND(EAX), MM0 ) /* x1 | x0 */ + MOVQ ( REGOFF(8, EAX), MM1 ) /* x3 | x2 */ - MOVQ ( REGIND(EAX), MM4 ) /* x1 | x0 */ - MOVQ ( REGOFF(8, EAX), MM5 ) /* x3 | x2 */ - MOVD ( REGOFF(8, EAX), MM3 ) /* | x2 */ + ADD_L ( EDI, EAX ) /* next vertex */ - ADD_L ( EDI, EAX ) /* next vertex */ +ALIGNTEXT16 +LLBL( G3TPIR_1 ): -ALIGNTEXT32 -LLBL(G3TPPR_1): - PREFETCHW ( REGOFF(32, EDX) ) /* prefetch 2 vertices ahead */ - - PREFETCH ( REGOFF(32, EAX) ) /* hopefully stride is zero */ - - MOVQ ( MM5, MM6 ) /* x3 | x2 */ - PFMUL ( MM0, MM4 ) /* x1*m11 | x0*m00 */ - - PUNPCKLDQ ( MM5, MM5 ) /* x2 | x2 */ - ADD_L ( CONST(16), EDX ) /* next r */ - - PFMUL ( MM2, MM5 ) /* x2*m21 | x2*m20 */ - PFSUBR ( MM7, MM3 ) /* | -x2 */ - - PFMUL ( MM1, MM6 ) /* x3*m32 | x2*m22 */ - PFADD ( MM4, MM5 ) /* x1*m11+x2*m21 | x0*m00+x2*m20 */ - - PFACC ( MM3, MM6 ) /* -x2 | x2*m22+x3*m32 */ - MOVQ ( MM5, REGOFF(-16, EDX) ) /* write r0, r1 */ + PREFETCH ( REGIND(EAX) ) - MOVQ ( MM6, REGOFF(-8, EDX) ) /* write r2, r3 */ - MOVQ ( REGIND(EAX), MM4 ) /* x1 | x0 */ + ADD_L ( CONST(16), EDX ) /* next r */ + MOVQ ( MM0, REGOFF(-16, EDX) ) /* r1 | r0 */ - MOVQ ( REGOFF(8, EAX), MM5 ) /* x3 | x2 */ - MOVD ( REGOFF(8, EAX), MM3 ) /* | x2 */ + MOVQ ( MM1, REGOFF(-8, EDX) ) /* r3 | r2 */ + MOVQ ( REGIND(EAX), MM0 ) /* x1 | x0 */ - ADD_L ( EDI, EAX ) /* next vertex */ - DEC_L ( ESI ) /* decrement vertex counter */ + MOVQ ( REGOFF(8, EAX), MM1 ) /* x3 | x2 */ + ADD_L ( EDI, EAX ) /* next vertex */ - JA ( LLBL(G3TPPR_1) ) /* cnt > 0 ? -> process next vertex */ + DEC_L ( ESI ) /* decrement vertex counter */ + JNZ ( LLBL( G3TPIR_1 ) ) /* cnt > 0 ? -> process next vertex */ -ALIGNTEXT32 -LLBL(G3TPPR_2): +LLBL( G3TPIR_2 ): FEMMS POP_L ( EDI ) POP_L ( ESI ) RET - Index: xc/extras/Mesa/src/X86/Makefile.am diff -u /dev/null xc/extras/Mesa/src/X86/Makefile.am:1.1.1.3 --- /dev/null Mon Dec 18 14:21:57 2000 +++ xc/extras/Mesa/src/X86/Makefile.am Thu Nov 30 10:24:51 2000 @@ -0,0 +1,70 @@ +## Process this file with automake to produce Makefile.in + +#AUTOMAKE_OPTIONS = no-dependencies + +x3dnow_files = \ + 3dnow.c \ + 3dnow.h \ + 3dnow_norm_raw.S \ + 3dnow_xform_masked1.S \ + 3dnow_xform_masked2.S \ + 3dnow_xform_masked3.S \ + 3dnow_xform_masked4.S \ + 3dnow_xform_raw1.S \ + 3dnow_xform_raw2.S \ + 3dnow_xform_raw3.S \ + 3dnow_xform_raw4.S \ + vertex_3dnow.S + +katmai_files = \ + katmai.c \ + katmai.h \ + katmai_norm_raw.S \ + katmai_xform_raw1.S \ + katmai_xform_masked1.S \ + katmai_xform_raw2.S \ + katmai_xform_masked2.S \ + katmai_xform_raw3.S \ + katmai_xform_masked3.S \ + katmai_xform_raw4.S \ + katmai_xform_masked4.S \ + vertex_katmai.S + +mmx_files = mmx.h mmx_blend.S + +if HAVE_3DNOW +x3dnow_sources = $(x3dnow_files) +CFLAGS_3DNOW = -DUSE_3DNOW_ASM +endif + +if HAVE_SSE +katmai_sources = $(katmai_files) +CFLAGS_KATMAI = -DUSE_KATMAI_ASM +endif + +if HAVE_MMX +mmx_sources = $(mmx_files) +CFLAGS_MMX = -DUSE_MMX_ASM +endif + +if HAVE_X86 +# Build a libtool convenience library. +noinst_LTLIBRARIES = libMesaX86.la +CFLAGS_X86 = -DUSE_X86_ASM +endif + +libMesaX86_la_SOURCES = x86a.S assyntax.h \ + common_x86.c common_x86_asm.S common_x86_asm.h \ + common_x86_features.h glapi_x86.S \ + x86.c x86.h vertex.S $(mmx_sources) $(x3dnow_sources) $(katmai_sources) + +INCLUDES = -I$(top_srcdir)/include -I$(top_srcdir)/src $(CFLAGS_X86) $(CFLAGS_MMX) $(CFLAGS_3DNOW) $(CFLAGS_KATMAI) + +EXTRA_DIST = x86flatregs.m4 x86a.S.m4 $(x3dnow_files) $(mmx_files) $(katmai_files) + +x86a.S: $(srcdir)/x86flatregs.m4 +x86a.S: $(srcdir)/x86a.S.m4 + m4 $< >$@ + +x86a.asm: x86a.S + gcc -E -P -DNASM_ASSEMBLER $< >$@ Index: xc/extras/Mesa/src/X86/assyntax.h diff -u xc/extras/Mesa/src/X86/assyntax.h:1.6 xc/extras/Mesa/src/X86/assyntax.h:1.8 --- xc/extras/Mesa/src/X86/assyntax.h:1.6 Fri Jun 30 13:15:06 2000 +++ xc/extras/Mesa/src/X86/assyntax.h Mon Nov 13 18:31:09 2000 @@ -1,5 +1,6 @@ + #ifndef __ASSYNTAX_H__ -#define __ASSYNTAX_H__ +#define __ASSYNTAX_H__ /* * Copyright 1992 Vrije Universiteit, The Netherlands @@ -14,12 +15,12 @@ * representations about the suitability of this software for any purpose. * It is provided "as is" without express or implied warranty. * - * The Vrije Universiteit DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, - * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO - * EVENT SHALL The Vrije Universiteit BE LIABLE FOR ANY SPECIAL, INDIRECT OR - * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, - * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER - * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * The Vrije Universiteit DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, + * IN NO EVENT SHALL The Vrije Universiteit BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM + * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE + * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. */ @@ -71,11 +72,10 @@ #define GNU_ASSEMBLER #endif -#if (defined(__STDC__) && !defined(UNIXCPP)) || (defined (sun) && defined (i386) \ - && defined (SVR4) && defined (__STDC__) && !defined (__GNUC__)) -#define CONCAT(x, y) x ## y +#if (defined(__STDC__) && !defined(UNIXCPP)) || (defined (sun) && defined (i386) && defined (SVR4) && defined (__STDC__) && !defined (__GNUC__)) +#define CONCAT(x, y) x ## y #else -#define CONCAT(x, y) x/**/y +#define CONCAT(x, y) x/**/y #endif #ifdef ACK_ASSEMBLER @@ -83,170 +83,170 @@ /* Assume we write code for 32-bit protected mode! */ /* Redefine register names for GAS & AT&T assemblers */ -#define AL al -#define AH ah -#define AX ax -#define EAX ax -#define BL bl -#define BH bh -#define BX bx -#define EBX bx -#define CL cl -#define CH ch -#define CX cx -#define ECX cx -#define DL dl -#define DH dh -#define DX dx -#define EDX dx -#define BP bp -#define EBP bp -#define SI si -#define ESI si -#define DI di -#define EDI di -#define SP sp -#define ESP sp -#define CS cs -#define SS ss -#define DS ds -#define ES es -#define FS fs -#define GS gs +#define AL al +#define AH ah +#define AX ax +#define EAX ax +#define BL bl +#define BH bh +#define BX bx +#define EBX bx +#define CL cl +#define CH ch +#define CX cx +#define ECX cx +#define DL dl +#define DH dh +#define DX dx +#define EDX dx +#define BP bp +#define EBP bp +#define SI si +#define ESI si +#define DI di +#define EDI di +#define SP sp +#define ESP sp +#define CS cs +#define SS ss +#define DS ds +#define ES es +#define FS fs +#define GS gs /* Control Registers */ -#define CR0 cr0 -#define CR1 cr1 -#define CR2 cr2 -#define CR3 cr3 +#define CR0 cr0 +#define CR1 cr1 +#define CR2 cr2 +#define CR3 cr3 /* Debug Registers */ -#define DR0 dr0 -#define DR1 dr1 -#define DR2 dr2 -#define DR3 dr3 -#define DR4 dr4 -#define DR5 dr5 -#define DR6 dr6 -#define DR7 dr7 +#define DR0 dr0 +#define DR1 dr1 +#define DR2 dr2 +#define DR3 dr3 +#define DR4 dr4 +#define DR5 dr5 +#define DR6 dr6 +#define DR7 dr7 /* Floating-point Stack */ -#define ST st +#define ST st -#define AS_BEGIN .sect .text; .sect .rom; .sect .data; .sect .bss; .sect .text +#define AS_BEGIN .sect .text; .sect .rom; .sect .data; .sect .bss; .sect .text -#define _WTOG o16 /* word toggle for _W instructions */ -#define _LTOG /* long toggle for _L instructions */ -#define ADDR_TOGGLE a16 -#define OPSZ_TOGGLE o16 -#define USE16 .use16 -#define USE32 .use32 +#define _WTOG o16 /* word toggle for _W instructions */ +#define _LTOG /* long toggle for _L instructions */ +#define ADDR_TOGGLE a16 +#define OPSZ_TOGGLE o16 +#define USE16 .use16 +#define USE32 .use32 -#define CHOICE(a,b,c) c +#define CHOICE(a,b,c) c #else /* AT&T or GAS */ /* Redefine register names for GAS & AT&T assemblers */ -#define AL %al -#define AH %ah -#define AX %ax -#define EAX %eax -#define BL %bl -#define BH %bh -#define BX %bx -#define EBX %ebx -#define CL %cl -#define CH %ch -#define CX %cx -#define ECX %ecx -#define DL %dl -#define DH %dh -#define DX %dx -#define EDX %edx -#define BP %bp -#define EBP %ebp -#define SI %si -#define ESI %esi -#define DI %di -#define EDI %edi -#define SP %sp -#define ESP %esp -#define CS %cs -#define SS %ss -#define DS %ds -#define ES %es -#define FS %fs -#define GS %gs +#define AL %al +#define AH %ah +#define AX %ax +#define EAX %eax +#define BL %bl +#define BH %bh +#define BX %bx +#define EBX %ebx +#define CL %cl +#define CH %ch +#define CX %cx +#define ECX %ecx +#define DL %dl +#define DH %dh +#define DX %dx +#define EDX %edx +#define BP %bp +#define EBP %ebp +#define SI %si +#define ESI %esi +#define DI %di +#define EDI %edi +#define SP %sp +#define ESP %esp +#define CS %cs +#define SS %ss +#define DS %ds +#define ES %es +#define FS %fs +#define GS %gs /* Control Registers */ -#define CR0 %cr0 -#define CR1 %cr1 -#define CR2 %cr2 -#define CR3 %cr3 +#define CR0 %cr0 +#define CR1 %cr1 +#define CR2 %cr2 +#define CR3 %cr3 /* Debug Registers */ -#define DR0 %db0 -#define DR1 %db1 -#define DR2 %db2 -#define DR3 %db3 -#define DR4 %db4 -#define DR5 %db5 -#define DR6 %db6 -#define DR7 %db7 +#define DR0 %db0 +#define DR1 %db1 +#define DR2 %db2 +#define DR3 %db3 +#define DR4 %db4 +#define DR5 %db5 +#define DR6 %db6 +#define DR7 %db7 /* Floating-point Stack */ -#define _STX0 %st(0) -#define _STX1 %st(1) -#define _STX2 %st(2) -#define _STX3 %st(3) -#define _STX4 %st(4) -#define _STX5 %st(5) -#define _STX6 %st(6) -#define _STX7 %st(7) -#define ST(x) CONCAT(_STX,x) +#define _STX0 %st(0) +#define _STX1 %st(1) +#define _STX2 %st(2) +#define _STX3 %st(3) +#define _STX4 %st(4) +#define _STX5 %st(5) +#define _STX6 %st(6) +#define _STX7 %st(7) +#define ST(x) CONCAT(_STX,x) /* MMX Registers */ -#define MM0 %mm0 -#define MM1 %mm1 -#define MM2 %mm2 -#define MM3 %mm3 -#define MM4 %mm4 -#define MM5 %mm5 -#define MM6 %mm6 -#define MM7 %mm7 +#define MM0 %mm0 +#define MM1 %mm1 +#define MM2 %mm2 +#define MM3 %mm3 +#define MM4 %mm4 +#define MM5 %mm5 +#define MM6 %mm6 +#define MM7 %mm7 /* SSE Registers */ -#define XMM0 %xmm0 -#define XMM1 %xmm1 -#define XMM2 %xmm2 -#define XMM3 %xmm3 -#define XMM4 %xmm4 -#define XMM5 %xmm5 -#define XMM6 %xmm6 -#define XMM7 %xmm7 - -#define AS_BEGIN -#define USE16 -#define USE32 +#define XMM0 %xmm0 +#define XMM1 %xmm1 +#define XMM2 %xmm2 +#define XMM3 %xmm3 +#define XMM4 %xmm4 +#define XMM5 %xmm5 +#define XMM6 %xmm6 +#define XMM7 %xmm7 + +#define AS_BEGIN +#define USE16 +#define USE32 #ifdef GNU_ASSEMBLER -#define ADDR_TOGGLE aword -#define OPSZ_TOGGLE word +#define ADDR_TOGGLE aword +#define OPSZ_TOGGLE word -#define CHOICE(a,b,c) b +#define CHOICE(a,b,c) b #else /* * AT&T ASSEMBLER SYNTAX * ********************* */ -#define CHOICE(a,b,c) a +#define CHOICE(a,b,c) a -#define ADDR_TOGGLE addr16 -#define OPSZ_TOGGLE data16 +#define ADDR_TOGGLE addr16 +#define OPSZ_TOGGLE data16 #endif /* GNU_ASSEMBLER */ #endif /* ACK_ASSEMBLER */ #if defined(__QNX__) || defined(Lynx) || (defined(SYSV) || defined(SVR4)) && !defined(ACK_ASSEMBLER) || defined(__ELF__) || defined(__GNU__) -#define GLNAME(a) a +#define GLNAME(a) a #else -#define GLNAME(a) CONCAT(_,a) +#define GLNAME(a) CONCAT(_,a) #endif @@ -260,59 +260,63 @@ /* Redefine assembler directives */ /*********************************/ #define GLOBL CHOICE(.globl, .globl, .extern) +#define GLOBAL GLOBL +#define EXTERN GLOBL /* -#define ALIGNTEXT32 CHOICE(.align 32, .align ARG2(5,0x90), .align 32) +#define ALIGNTEXT32 CHOICE(.align 32, .align ARG2(5,0x90), .align 32) */ -#define ALIGNTEXT32 CHOICE(.align 32, .balign 32, .align 32) -#define ALIGNTEXT16 CHOICE(.align 16, .balign 16, .align 16) -#define ALIGNTEXT8 CHOICE(.align 8, .balign 8, .align 8) -#define ALIGNTEXT4 CHOICE(.align 4, .balign 4, .align 4) -#define ALIGNTEXT2 CHOICE(.align 2, .balign 2, .align 2) +#define ALIGNTEXT32 CHOICE(.align 32, .balign 32, .align 32) +#define ALIGNTEXT16 CHOICE(.align 16, .balign 16, .align 16) +#define ALIGNTEXT8 CHOICE(.align 8, .balign 8, .align 8) +#define ALIGNTEXT4 CHOICE(.align 4, .balign 4, .align 4) +#define ALIGNTEXT2 CHOICE(.align 2, .balign 2, .align 2) /* ALIGNTEXT4ifNOP is the same as ALIGNTEXT4, but only if the space is * guaranteed to be filled with NOPs. Otherwise it does nothing. */ -#define ALIGNTEXT32ifNOP CHOICE(.align 32, .balign ARG2(32,0x90), /*can't do it*/) -#define ALIGNTEXT16ifNOP CHOICE(.align 16, .balign ARG2(16,0x90), /*can't do it*/) -#define ALIGNTEXT8ifNOP CHOICE(.align 8, .balign ARG2(8,0x90), /*can't do it*/) -#define ALIGNTEXT4ifNOP CHOICE(.align 4, .balign ARG2(4,0x90), /*can't do it*/) -#define ALIGNDATA32 CHOICE(.align 32, .balign ARG2(32,0x0), .align 32) -#define ALIGNDATA16 CHOICE(.align 16, .balign ARG2(16,0x0), .align 16) -#define ALIGNDATA8 CHOICE(.align 8, .balign ARG2(8,0x0), .align 8) -#define ALIGNDATA4 CHOICE(.align 4, .balign ARG2(4,0x0), .align 4) -#define ALIGNDATA2 CHOICE(.align 2, .balign ARG2(2,0x0), .align 2) -#define FILE(s) CHOICE(.file s, .file s, .file s) -#define STRING(s) CHOICE(.string s, .asciz s, .asciz s) -#define D_LONG CHOICE(.long, .long, .data4) -#define D_WORD CHOICE(.value, .short, .data2) -#define D_BYTE CHOICE(.byte, .byte, .data1) -#define SPACE CHOICE(.comm, .space, .space) -#define COMM CHOICE(.comm, .comm, .comm) -#define SEG_DATA CHOICE(.data, .data, .sect .data) -#define SEG_TEXT CHOICE(.text, .text, .sect .text) -#define SEG_BSS CHOICE(.bss, .bss, .sect .bss) +#define ALIGNTEXT32ifNOP CHOICE(.align 32, .balign ARG2(32,0x90), /*can't do it*/) +#define ALIGNTEXT16ifNOP CHOICE(.align 16, .balign ARG2(16,0x90), /*can't do it*/) +#define ALIGNTEXT8ifNOP CHOICE(.align 8, .balign ARG2(8,0x90), /*can't do it*/) +#define ALIGNTEXT4ifNOP CHOICE(.align 4, .balign ARG2(4,0x90), /*can't do it*/) +#define ALIGNDATA32 CHOICE(.align 32, .balign ARG2(32,0x0), .align 32) +#define ALIGNDATA16 CHOICE(.align 16, .balign ARG2(16,0x0), .align 16) +#define ALIGNDATA8 CHOICE(.align 8, .balign ARG2(8,0x0), .align 8) +#define ALIGNDATA4 CHOICE(.align 4, .balign ARG2(4,0x0), .align 4) +#define ALIGNDATA2 CHOICE(.align 2, .balign ARG2(2,0x0), .align 2) +#define FILE(s) CHOICE(.file s, .file s, .file s) +#define STRING(s) CHOICE(.string s, .asciz s, .asciz s) +#define D_LONG CHOICE(.long, .long, .data4) +#define D_WORD CHOICE(.value, .short, .data2) +#define D_BYTE CHOICE(.byte, .byte, .data1) +#define SPACE CHOICE(.comm, .space, .space) +#define COMM CHOICE(.comm, .comm, .comm) +#define SEG_DATA CHOICE(.data, .data, .sect .data) +#define SEG_TEXT CHOICE(.text, .text, .sect .text) +#define SEG_BSS CHOICE(.bss, .bss, .sect .bss) #ifdef GNU_ASSEMBLER -#define D_SPACE(n) . = . + n +#define D_SPACE(n) . = . + n #else -#define D_SPACE(n) .space n +#define D_SPACE(n) .space n #endif /* Addressing Modes */ /* Immediate Mode */ -#define ADDR(a) CHOICE(CONCAT($,a), CONCAT($,a), a) -#define CONST(a) CHOICE(CONCAT($,a), CONCAT($,a), a) +#define ADDR(a) CHOICE(CONCAT($,a), CONCAT($,a), a) +#define CONST(a) CHOICE(CONCAT($,a), CONCAT($,a), a) /* Indirect Mode */ -#define CONTENT(a) CHOICE(a, a, (a)) /* take contents of variable */ -#define REGIND(a) CHOICE((a), (a), (a)) /* Register a indirect */ +#define CONTENT(a) CHOICE(a, a, (a)) /* take contents of variable */ +#define REGIND(a) CHOICE((a), (a), (a)) /* Register a indirect */ /* Register b indirect plus displacement a */ -#define REGOFF(a, b) CHOICE(a(b), a(b), a(b)) +#define REGOFF(a, b) CHOICE(a(b), a(b), a(b)) /* Reg indirect Base + Index + Displacement - this is mainly for 16-bit mode * which has no scaling */ -#define REGBID(b,i,d) CHOICE(d(b,i), d(b,i), d(b)(i)) +#define REGBID(b,i,d) CHOICE(d(b,i), d(b,i), d(b)(i)) +/* Reg indirect Base + (Index * Scale) */ +#define REGBIS(b,i,s) CHOICE((b,i,s), (b,i,s), (b)(i*s)) /* Reg indirect Base + (Index * Scale) + Displacement */ -#define REGBISD(b,i,s,d) CHOICE(d(b,i,s), d(b,i,s), d(b)(i*s)) +#define REGBISD(b,i,s,d) CHOICE(d(b,i,s), d(b,i,s), d(b)(i*s)) /* Displaced Scaled Index: */ #define REGDIS(d,i,s) CHOICE(d(,i,s), d(,i,s), d(i * s)) /* Indexed Base: */ @@ -328,10 +332,10 @@ * eg. (CRT0_PM | CRT_EM) */ -#define EXPR(a) CHOICE([a], (a), [a]) -#define ENOT(a) CHOICE(0!a, ~a, ~a) -#define EMUL(a,b) CHOICE(a\*b, a*b, a*b) -#define EDIV(a,b) CHOICE(a\/b, a/b, a/b) +#define EXPR(a) CHOICE([a], (a), [a]) +#define ENOT(a) CHOICE(0!a, ~a, ~a) +#define EMUL(a,b) CHOICE(a\*b, a*b, a*b) +#define EDIV(a,b) CHOICE(a\/b, a/b, a/b) /* * We have to beat the problem of commas within arguments to choice. @@ -339,436 +343,436 @@ * and other known cpp definitions evaluate arguments before substitution * so the following works. */ -#define ARG2(a, b) a,b -#define ARG3(a,b,c) a,b,c +#define ARG2(a, b) a,b +#define ARG3(a,b,c) a,b,c /* Redefine assembler commands */ -#define AAA CHOICE(aaa, aaa, aaa) -#define AAD CHOICE(aad, aad, aad) -#define AAM CHOICE(aam, aam, aam) -#define AAS CHOICE(aas, aas, aas) -#define ADC_L(a, b) CHOICE(adcl ARG2(a,b), adcl ARG2(a,b), _LTOG adc ARG2(b,a)) -#define ADC_W(a, b) CHOICE(adcw ARG2(a,b), adcw ARG2(a,b), _WTOG adc ARG2(b,a)) -#define ADC_B(a, b) CHOICE(adcb ARG2(a,b), adcb ARG2(a,b), adcb ARG2(b,a)) -#define ADD_L(a, b) CHOICE(addl ARG2(a,b), addl ARG2(a,b), _LTOG add ARG2(b,a)) -#define ADD_W(a, b) CHOICE(addw ARG2(a,b), addw ARG2(a,b), _WTOG add ARG2(b,a)) -#define ADD_B(a, b) CHOICE(addb ARG2(a,b), addb ARG2(a,b), addb ARG2(b,a)) -#define AND_L(a, b) CHOICE(andl ARG2(a,b), andl ARG2(a,b), _LTOG and ARG2(b,a)) -#define AND_W(a, b) CHOICE(andw ARG2(a,b), andw ARG2(a,b), _WTOG and ARG2(b,a)) -#define AND_B(a, b) CHOICE(andb ARG2(a,b), andb ARG2(a,b), andb ARG2(b,a)) -#define ARPL(a,b) CHOICE(arpl ARG2(a,b), arpl ARG2(a,b), arpl ARG2(b,a)) -#define BOUND_L(a, b) CHOICE(boundl ARG2(a,b), boundl ARG2(b,a), _LTOG bound ARG2(b,a)) -#define BOUND_W(a, b) CHOICE(boundw ARG2(a,b), boundw ARG2(b,a), _WTOG bound ARG2(b,a)) -#define BSF_L(a, b) CHOICE(bsfl ARG2(a,b), bsfl ARG2(a,b), _LTOG bsf ARG2(b,a)) -#define BSF_W(a, b) CHOICE(bsfw ARG2(a,b), bsfw ARG2(a,b), _WTOG bsf ARG2(b,a)) -#define BSR_L(a, b) CHOICE(bsrl ARG2(a,b), bsrl ARG2(a,b), _LTOG bsr ARG2(b,a)) -#define BSR_W(a, b) CHOICE(bsrw ARG2(a,b), bsrw ARG2(a,b), _WTOG bsr ARG2(b,a)) -#define BT_L(a, b) CHOICE(btl ARG2(a,b), btl ARG2(a,b), _LTOG bt ARG2(b,a)) -#define BT_W(a, b) CHOICE(btw ARG2(a,b), btw ARG2(a,b), _WTOG bt ARG2(b,a)) -#define BTC_L(a, b) CHOICE(btcl ARG2(a,b), btcl ARG2(a,b), _LTOG btc ARG2(b,a)) -#define BTC_W(a, b) CHOICE(btcw ARG2(a,b), btcw ARG2(a,b), _WTOG btc ARG2(b,a)) -#define BTR_L(a, b) CHOICE(btrl ARG2(a,b), btrl ARG2(a,b), _LTOG btr ARG2(b,a)) -#define BTR_W(a, b) CHOICE(btrw ARG2(a,b), btrw ARG2(a,b), _WTOG btr ARG2(b,a)) -#define BTS_L(a, b) CHOICE(btsl ARG2(a,b), btsl ARG2(a,b), _LTOG bts ARG2(b,a)) -#define BTS_W(a, b) CHOICE(btsw ARG2(a,b), btsw ARG2(a,b), _WTOG bts ARG2(b,a)) -#define CALL(a) CHOICE(call a, call a, call a) -#define CALLF(s,a) CHOICE(lcall ARG2(s,a), lcall ARG2(s,a), callf s:a) -#define CBW CHOICE(cbtw, cbw, cbw) -#define CWDE CHOICE(cwtd, cwde, cwde) -#define CLC CHOICE(clc, clc, clc) -#define CLD CHOICE(cld, cld, cld) -#define CLI CHOICE(cli, cli, cli) -#define CLTS CHOICE(clts, clts, clts) -#define CMC CHOICE(cmc, cmc, cmc) -#define CMP_L(a, b) CHOICE(cmpl ARG2(a,b), cmpl ARG2(a,b), _LTOG cmp ARG2(b,a)) -#define CMP_W(a, b) CHOICE(cmpw ARG2(a,b), cmpw ARG2(a,b), _WTOG cmp ARG2(b,a)) -#define CMP_B(a, b) CHOICE(cmpb ARG2(a,b), cmpb ARG2(a,b), cmpb ARG2(b,a)) -#define CMPS_L CHOICE(cmpsl, cmpsl, _LTOG cmps) -#define CMPS_W CHOICE(cmpsw, cmpsw, _WTOG cmps) -#define CMPS_B CHOICE(cmpsb, cmpsb, cmpsb) -#define CWD CHOICE(cwtl, cwd, cwd) -#define CDQ CHOICE(cltd, cdq, cdq) -#define DAA CHOICE(daa, daa, daa) -#define DAS CHOICE(das, das, das) -#define DEC_L(a) CHOICE(decl a, decl a, _LTOG dec a) -#define DEC_W(a) CHOICE(decw a, decw a, _WTOG dec a) -#define DEC_B(a) CHOICE(decb a, decb a, decb a) -#define DIV_L(a) CHOICE(divl a, divl a, div a) -#define DIV_W(a) CHOICE(divw a, divw a, div a) -#define DIV_B(a) CHOICE(divb a, divb a, divb a) -#define ENTER(a,b) CHOICE(enter ARG2(a,b), enter ARG2(a,b), enter ARG2(b,a)) -#define HLT CHOICE(hlt, hlt, hlt) -#define IDIV_L(a) CHOICE(idivl a, idivl a, _LTOG idiv a) -#define IDIV_W(a) CHOICE(idivw a, idivw a, _WTOG idiv a) -#define IDIV_B(a) CHOICE(idivb a, idivb a, idivb a) +#define AAA CHOICE(aaa, aaa, aaa) +#define AAD CHOICE(aad, aad, aad) +#define AAM CHOICE(aam, aam, aam) +#define AAS CHOICE(aas, aas, aas) +#define ADC_L(a, b) CHOICE(adcl ARG2(a,b), adcl ARG2(a,b), _LTOG adc ARG2(b,a)) +#define ADC_W(a, b) CHOICE(adcw ARG2(a,b), adcw ARG2(a,b), _WTOG adc ARG2(b,a)) +#define ADC_B(a, b) CHOICE(adcb ARG2(a,b), adcb ARG2(a,b), adcb ARG2(b,a)) +#define ADD_L(a, b) CHOICE(addl ARG2(a,b), addl ARG2(a,b), _LTOG add ARG2(b,a)) +#define ADD_W(a, b) CHOICE(addw ARG2(a,b), addw ARG2(a,b), _WTOG add ARG2(b,a)) +#define ADD_B(a, b) CHOICE(addb ARG2(a,b), addb ARG2(a,b), addb ARG2(b,a)) +#define AND_L(a, b) CHOICE(andl ARG2(a,b), andl ARG2(a,b), _LTOG and ARG2(b,a)) +#define AND_W(a, b) CHOICE(andw ARG2(a,b), andw ARG2(a,b), _WTOG and ARG2(b,a)) +#define AND_B(a, b) CHOICE(andb ARG2(a,b), andb ARG2(a,b), andb ARG2(b,a)) +#define ARPL(a,b) CHOICE(arpl ARG2(a,b), arpl ARG2(a,b), arpl ARG2(b,a)) +#define BOUND_L(a, b) CHOICE(boundl ARG2(a,b), boundl ARG2(b,a), _LTOG bound ARG2(b,a)) +#define BOUND_W(a, b) CHOICE(boundw ARG2(a,b), boundw ARG2(b,a), _WTOG bound ARG2(b,a)) +#define BSF_L(a, b) CHOICE(bsfl ARG2(a,b), bsfl ARG2(a,b), _LTOG bsf ARG2(b,a)) +#define BSF_W(a, b) CHOICE(bsfw ARG2(a,b), bsfw ARG2(a,b), _WTOG bsf ARG2(b,a)) +#define BSR_L(a, b) CHOICE(bsrl ARG2(a,b), bsrl ARG2(a,b), _LTOG bsr ARG2(b,a)) +#define BSR_W(a, b) CHOICE(bsrw ARG2(a,b), bsrw ARG2(a,b), _WTOG bsr ARG2(b,a)) +#define BT_L(a, b) CHOICE(btl ARG2(a,b), btl ARG2(a,b), _LTOG bt ARG2(b,a)) +#define BT_W(a, b) CHOICE(btw ARG2(a,b), btw ARG2(a,b), _WTOG bt ARG2(b,a)) +#define BTC_L(a, b) CHOICE(btcl ARG2(a,b), btcl ARG2(a,b), _LTOG btc ARG2(b,a)) +#define BTC_W(a, b) CHOICE(btcw ARG2(a,b), btcw ARG2(a,b), _WTOG btc ARG2(b,a)) +#define BTR_L(a, b) CHOICE(btrl ARG2(a,b), btrl ARG2(a,b), _LTOG btr ARG2(b,a)) +#define BTR_W(a, b) CHOICE(btrw ARG2(a,b), btrw ARG2(a,b), _WTOG btr ARG2(b,a)) +#define BTS_L(a, b) CHOICE(btsl ARG2(a,b), btsl ARG2(a,b), _LTOG bts ARG2(b,a)) +#define BTS_W(a, b) CHOICE(btsw ARG2(a,b), btsw ARG2(a,b), _WTOG bts ARG2(b,a)) +#define CALL(a) CHOICE(call a, call a, call a) +#define CALLF(s,a) CHOICE(lcall ARG2(s,a), lcall ARG2(s,a), callf s:a) +#define CBW CHOICE(cbtw, cbw, cbw) +#define CWDE CHOICE(cwtd, cwde, cwde) +#define CLC CHOICE(clc, clc, clc) +#define CLD CHOICE(cld, cld, cld) +#define CLI CHOICE(cli, cli, cli) +#define CLTS CHOICE(clts, clts, clts) +#define CMC CHOICE(cmc, cmc, cmc) +#define CMP_L(a, b) CHOICE(cmpl ARG2(a,b), cmpl ARG2(a,b), _LTOG cmp ARG2(b,a)) +#define CMP_W(a, b) CHOICE(cmpw ARG2(a,b), cmpw ARG2(a,b), _WTOG cmp ARG2(b,a)) +#define CMP_B(a, b) CHOICE(cmpb ARG2(a,b), cmpb ARG2(a,b), cmpb ARG2(b,a)) +#define CMPS_L CHOICE(cmpsl, cmpsl, _LTOG cmps) +#define CMPS_W CHOICE(cmpsw, cmpsw, _WTOG cmps) +#define CMPS_B CHOICE(cmpsb, cmpsb, cmpsb) +#define CWD CHOICE(cwtl, cwd, cwd) +#define CDQ CHOICE(cltd, cdq, cdq) +#define DAA CHOICE(daa, daa, daa) +#define DAS CHOICE(das, das, das) +#define DEC_L(a) CHOICE(decl a, decl a, _LTOG dec a) +#define DEC_W(a) CHOICE(decw a, decw a, _WTOG dec a) +#define DEC_B(a) CHOICE(decb a, decb a, decb a) +#define DIV_L(a) CHOICE(divl a, divl a, div a) +#define DIV_W(a) CHOICE(divw a, divw a, div a) +#define DIV_B(a) CHOICE(divb a, divb a, divb a) +#define ENTER(a,b) CHOICE(enter ARG2(a,b), enter ARG2(a,b), enter ARG2(b,a)) +#define HLT CHOICE(hlt, hlt, hlt) +#define IDIV_L(a) CHOICE(idivl a, idivl a, _LTOG idiv a) +#define IDIV_W(a) CHOICE(idivw a, idivw a, _WTOG idiv a) +#define IDIV_B(a) CHOICE(idivb a, idivb a, idivb a) /* More forms than this for imul!! */ -#define IMUL_L(a, b) CHOICE(imull ARG2(a,b), imull ARG2(a,b), _LTOG imul ARG2(b,a)) -#define IMUL_W(a, b) CHOICE(imulw ARG2(a,b), imulw ARG2(a,b), _WTOG imul ARG2(b,a)) -#define IMUL_B(a) CHOICE(imulb a, imulb a, imulb a) -#define IN_L CHOICE(inl (DX), inl ARG2(DX,EAX), _LTOG in DX) -#define IN_W CHOICE(inw (DX), inw ARG2(DX,AX), _WTOG in DX) -#define IN_B CHOICE(inb (DX), inb ARG2(DX,AL), inb DX) +#define IMUL_L(a, b) CHOICE(imull ARG2(a,b), imull ARG2(a,b), _LTOG imul ARG2(b,a)) +#define IMUL_W(a, b) CHOICE(imulw ARG2(a,b), imulw ARG2(a,b), _WTOG imul ARG2(b,a)) +#define IMUL_B(a) CHOICE(imulb a, imulb a, imulb a) +#define IN_L CHOICE(inl (DX), inl ARG2(DX,EAX), _LTOG in DX) +#define IN_W CHOICE(inw (DX), inw ARG2(DX,AX), _WTOG in DX) +#define IN_B CHOICE(inb (DX), inb ARG2(DX,AL), inb DX) /* Please AS code writer: use the following ONLY, if you refer to ports<256 * directly, but not in IN1_W(DX), for instance, even if IN1_ looks nicer */ #if defined (sun) -#define IN1_L(a) CHOICE(inl (a), inl ARG2(a,EAX), _LTOG in a) -#define IN1_W(a) CHOICE(inw (a), inw ARG2(a,AX), _WTOG in a) -#define IN1_B(a) CHOICE(inb (a), inb ARG2(a,AL), inb a) +#define IN1_L(a) CHOICE(inl (a), inl ARG2(a,EAX), _LTOG in a) +#define IN1_W(a) CHOICE(inw (a), inw ARG2(a,AX), _WTOG in a) +#define IN1_B(a) CHOICE(inb (a), inb ARG2(a,AL), inb a) #else -#define IN1_L(a) CHOICE(inl a, inl ARG2(a,EAX), _LTOG in a) -#define IN1_W(a) CHOICE(inw a, inw ARG2(a,AX), _WTOG in a) -#define IN1_B(a) CHOICE(inb a, inb ARG2(a,AL), inb a) +#define IN1_L(a) CHOICE(inl a, inl ARG2(a,EAX), _LTOG in a) +#define IN1_W(a) CHOICE(inw a, inw ARG2(a,AX), _WTOG in a) +#define IN1_B(a) CHOICE(inb a, inb ARG2(a,AL), inb a) #endif -#define INC_L(a) CHOICE(incl a, incl a, _LTOG inc a) -#define INC_W(a) CHOICE(incw a, incw a, _WTOG inc a) -#define INC_B(a) CHOICE(incb a, incb a, incb a) -#define INS_L CHOICE(insl, insl, _LTOG ins) -#define INS_W CHOICE(insw, insw, _WTOG ins) -#define INS_B CHOICE(insb, insb, insb) -#define INT(a) CHOICE(int a, int a, int a) -#define INT3 CHOICE(int CONST(3), int3, int CONST(3)) -#define INTO CHOICE(into, into, into) -#define IRET CHOICE(iret, iret, iret) -#define IRETD CHOICE(iret, iret, iretd) -#define JA(a) CHOICE(ja a, ja a, ja a) -#define JAE(a) CHOICE(jae a, jae a, jae a) -#define JB(a) CHOICE(jb a, jb a, jb a) -#define JBE(a) CHOICE(jbe a, jbe a, jbe a) -#define JC(a) CHOICE(jc a, jc a, jc a) -#define JE(a) CHOICE(je a, je a, je a) -#define JG(a) CHOICE(jg a, jg a, jg a) -#define JGE(a) CHOICE(jge a, jge a, jge a) -#define JL(a) CHOICE(jl a, jl a, jl a) -#define JLE(a) CHOICE(jle a, jle a, jle a) -#define JNA(a) CHOICE(jna a, jna a, jna a) -#define JNAE(a) CHOICE(jnae a, jnae a, jnae a) -#define JNB(a) CHOICE(jnb a, jnb a, jnb a) -#define JNBE(a) CHOICE(jnbe a, jnbe a, jnbe a) -#define JNC(a) CHOICE(jnc a, jnc a, jnc a) -#define JNE(a) CHOICE(jne a, jne a, jne a) -#define JNG(a) CHOICE(jng a, jng a, jng a) -#define JNGE(a) CHOICE(jnge a, jnge a, jnge a) -#define JNL(a) CHOICE(jnl a, jnl a, jnl a) -#define JNLE(a) CHOICE(jnle a, jnle a, jnle a) -#define JNO(a) CHOICE(jno a, jno a, jno a) -#define JNP(a) CHOICE(jnp a, jnp a, jnp a) -#define JNS(a) CHOICE(jns a, jns a, jns a) -#define JNZ(a) CHOICE(jnz a, jnz a, jnz a) -#define JO(a) CHOICE(jo a, jo a, jo a) -#define JP(a) CHOICE(jp a, jp a, jp a) -#define JPE(a) CHOICE(jpe a, jpe a, jpe a) -#define JPO(a) CHOICE(jpo a, jpo a, jpo a) -#define JS(a) CHOICE(js a, js a, js a) -#define JZ(a) CHOICE(jz a, jz a, jz a) -#define JMP(a) CHOICE(jmp a, jmp a, jmp a) -#define JMPF(s,a) CHOICE(ljmp ARG2(s,a), ljmp ARG2(s,a), jmpf s:a) -#define LAHF CHOICE(lahf, lahf, lahf) +#define INC_L(a) CHOICE(incl a, incl a, _LTOG inc a) +#define INC_W(a) CHOICE(incw a, incw a, _WTOG inc a) +#define INC_B(a) CHOICE(incb a, incb a, incb a) +#define INS_L CHOICE(insl, insl, _LTOG ins) +#define INS_W CHOICE(insw, insw, _WTOG ins) +#define INS_B CHOICE(insb, insb, insb) +#define INT(a) CHOICE(int a, int a, int a) +#define INT3 CHOICE(int CONST(3), int3, int CONST(3)) +#define INTO CHOICE(into, into, into) +#define IRET CHOICE(iret, iret, iret) +#define IRETD CHOICE(iret, iret, iretd) +#define JA(a) CHOICE(ja a, ja a, ja a) +#define JAE(a) CHOICE(jae a, jae a, jae a) +#define JB(a) CHOICE(jb a, jb a, jb a) +#define JBE(a) CHOICE(jbe a, jbe a, jbe a) +#define JC(a) CHOICE(jc a, jc a, jc a) +#define JE(a) CHOICE(je a, je a, je a) +#define JG(a) CHOICE(jg a, jg a, jg a) +#define JGE(a) CHOICE(jge a, jge a, jge a) +#define JL(a) CHOICE(jl a, jl a, jl a) +#define JLE(a) CHOICE(jle a, jle a, jle a) +#define JNA(a) CHOICE(jna a, jna a, jna a) +#define JNAE(a) CHOICE(jnae a, jnae a, jnae a) +#define JNB(a) CHOICE(jnb a, jnb a, jnb a) +#define JNBE(a) CHOICE(jnbe a, jnbe a, jnbe a) +#define JNC(a) CHOICE(jnc a, jnc a, jnc a) +#define JNE(a) CHOICE(jne a, jne a, jne a) +#define JNG(a) CHOICE(jng a, jng a, jng a) +#define JNGE(a) CHOICE(jnge a, jnge a, jnge a) +#define JNL(a) CHOICE(jnl a, jnl a, jnl a) +#define JNLE(a) CHOICE(jnle a, jnle a, jnle a) +#define JNO(a) CHOICE(jno a, jno a, jno a) +#define JNP(a) CHOICE(jnp a, jnp a, jnp a) +#define JNS(a) CHOICE(jns a, jns a, jns a) +#define JNZ(a) CHOICE(jnz a, jnz a, jnz a) +#define JO(a) CHOICE(jo a, jo a, jo a) +#define JP(a) CHOICE(jp a, jp a, jp a) +#define JPE(a) CHOICE(jpe a, jpe a, jpe a) +#define JPO(a) CHOICE(jpo a, jpo a, jpo a) +#define JS(a) CHOICE(js a, js a, js a) +#define JZ(a) CHOICE(jz a, jz a, jz a) +#define JMP(a) CHOICE(jmp a, jmp a, jmp a) +#define JMPF(s,a) CHOICE(ljmp ARG2(s,a), ljmp ARG2(s,a), jmpf s:a) +#define LAHF CHOICE(lahf, lahf, lahf) #if !defined(_REAL_MODE) && !defined(_V86_MODE) -#define LAR(a, b) CHOICE(lar ARG2(a, b), lar ARG2(a, b), lar ARG2(b, a)) +#define LAR(a, b) CHOICE(lar ARG2(a, b), lar ARG2(a, b), lar ARG2(b, a)) #endif -#define LEA_L(a, b) CHOICE(leal ARG2(a,b), leal ARG2(a,b), _LTOG lea ARG2(b,a)) -#define LEA_W(a, b) CHOICE(leaw ARG2(a,b), leaw ARG2(a,b), _WTOG lea ARG2(b,a)) -#define LEAVE CHOICE(leave, leave, leave) -#define LGDT(a) CHOICE(lgdt a, lgdt a, lgdt a) -#define LIDT(a) CHOICE(lidt a, lidt a, lidt a) -#define LDS(a, b) CHOICE(ldsl ARG2(a,b), lds ARG2(a,b), lds ARG2(b,a)) -#define LES(a, b) CHOICE(lesl ARG2(a,b), les ARG2(a,b), les ARG2(b,a)) -#define LFS(a, b) CHOICE(lfsl ARG2(a,b), lfs ARG2(a,b), lfs ARG2(b,a)) -#define LGS(a, b) CHOICE(lgsl ARG2(a,b), lgs ARG2(a,b), lgs ARG2(b,a)) -#define LSS(a, b) CHOICE(lssl ARG2(a,b), lss ARG2(a,b), lss ARG2(b,a)) -#define LLDT(a) CHOICE(lldt a, lldt a, lldt a) -#define LMSW(a) CHOICE(lmsw a, lmsw a, lmsw a) +#define LEA_L(a, b) CHOICE(leal ARG2(a,b), leal ARG2(a,b), _LTOG lea ARG2(b,a)) +#define LEA_W(a, b) CHOICE(leaw ARG2(a,b), leaw ARG2(a,b), _WTOG lea ARG2(b,a)) +#define LEAVE CHOICE(leave, leave, leave) +#define LGDT(a) CHOICE(lgdt a, lgdt a, lgdt a) +#define LIDT(a) CHOICE(lidt a, lidt a, lidt a) +#define LDS(a, b) CHOICE(ldsl ARG2(a,b), lds ARG2(a,b), lds ARG2(b,a)) +#define LES(a, b) CHOICE(lesl ARG2(a,b), les ARG2(a,b), les ARG2(b,a)) +#define LFS(a, b) CHOICE(lfsl ARG2(a,b), lfs ARG2(a,b), lfs ARG2(b,a)) +#define LGS(a, b) CHOICE(lgsl ARG2(a,b), lgs ARG2(a,b), lgs ARG2(b,a)) +#define LSS(a, b) CHOICE(lssl ARG2(a,b), lss ARG2(a,b), lss ARG2(b,a)) +#define LLDT(a) CHOICE(lldt a, lldt a, lldt a) +#define LMSW(a) CHOICE(lmsw a, lmsw a, lmsw a) #define LOCK CHOICE(lock, lock, lock) -#define LODS_L CHOICE(lodsl, lodsl, _LTOG lods) -#define LODS_W CHOICE(lodsw, lodsw, _WTOG lods) -#define LODS_B CHOICE(lodsb, lodsb, lodsb) -#define LOOP(a) CHOICE(loop a, loop a, loop a) -#define LOOPE(a) CHOICE(loope a, loope a, loope a) -#define LOOPZ(a) CHOICE(loopz a, loopz a, loopz a) -#define LOOPNE(a) CHOICE(loopne a, loopne a, loopne a) -#define LOOPNZ(a) CHOICE(loopnz a, loopnz a, loopnz a) +#define LODS_L CHOICE(lodsl, lodsl, _LTOG lods) +#define LODS_W CHOICE(lodsw, lodsw, _WTOG lods) +#define LODS_B CHOICE(lodsb, lodsb, lodsb) +#define LOOP(a) CHOICE(loop a, loop a, loop a) +#define LOOPE(a) CHOICE(loope a, loope a, loope a) +#define LOOPZ(a) CHOICE(loopz a, loopz a, loopz a) +#define LOOPNE(a) CHOICE(loopne a, loopne a, loopne a) +#define LOOPNZ(a) CHOICE(loopnz a, loopnz a, loopnz a) #if !defined(_REAL_MODE) && !defined(_V86_MODE) -#define LSL(a, b) CHOICE(lsl ARG2(a,b), lsl ARG2(a,b), lsl ARG2(b,a)) +#define LSL(a, b) CHOICE(lsl ARG2(a,b), lsl ARG2(a,b), lsl ARG2(b,a)) #endif -#define LTR(a) CHOICE(ltr a, ltr a, ltr a) -#define MOV_SR(a, b) CHOICE(movw ARG2(a,b), mov ARG2(a,b), mov ARG2(b,a)) -#define MOV_L(a, b) CHOICE(movl ARG2(a,b), movl ARG2(a,b), _LTOG mov ARG2(b,a)) -#define MOV_W(a, b) CHOICE(movw ARG2(a,b), movw ARG2(a,b), _WTOG mov ARG2(b,a)) -#define MOV_B(a, b) CHOICE(movb ARG2(a,b), movb ARG2(a,b), movb ARG2(b,a)) -#define MOVS_L CHOICE(movsl, movsl, _LTOG movs) -#define MOVS_W CHOICE(movsw, movsw, _WTOG movs) -#define MOVS_B CHOICE(movsb, movsb, movsb) -#define MOVSX_BL(a, b) CHOICE(movsbl ARG2(a,b), movsbl ARG2(a,b), movsx ARG2(b,a)) -#define MOVSX_BW(a, b) CHOICE(movsbw ARG2(a,b), movsbw ARG2(a,b), movsx ARG2(b,a)) -#define MOVSX_WL(a, b) CHOICE(movswl ARG2(a,b), movswl ARG2(a,b), movsx ARG2(b,a)) -#define MOVZX_BL(a, b) CHOICE(movzbl ARG2(a,b), movzbl ARG2(a,b), movzx ARG2(b,a)) -#define MOVZX_BW(a, b) CHOICE(movzbw ARG2(a,b), movzbw ARG2(a,b), movzx ARG2(b,a)) -#define MOVZX_WL(a, b) CHOICE(movzwl ARG2(a,b), movzwl ARG2(a,b), movzx ARG2(b,a)) -#define MUL_L(a) CHOICE(mull a, mull a, _LTOG mul a) -#define MUL_W(a) CHOICE(mulw a, mulw a, _WTOG mul a) -#define MUL_B(a) CHOICE(mulb a, mulb a, mulb a) -#define NEG_L(a) CHOICE(negl a, negl a, _LTOG neg a) -#define NEG_W(a) CHOICE(negw a, negw a, _WTOG neg a) -#define NEG_B(a) CHOICE(negb a, negb a, negb a) -#define NOP CHOICE(nop, nop, nop) -#define NOT_L(a) CHOICE(notl a, notl a, _LTOG not a) -#define NOT_W(a) CHOICE(notw a, notw a, _WTOG not a) -#define NOT_B(a) CHOICE(notb a, notb a, notb a) -#define OR_L(a,b) CHOICE(orl ARG2(a,b), orl ARG2(a,b), _LTOG or ARG2(b,a)) -#define OR_W(a,b) CHOICE(orw ARG2(a,b), orw ARG2(a,b), _WTOG or ARG2(b,a)) -#define OR_B(a,b) CHOICE(orb ARG2(a,b), orb ARG2(a,b), orb ARG2(b,a)) -#define OUT_L CHOICE(outl (DX), outl ARG2(EAX,DX), _LTOG out DX) -#define OUT_W CHOICE(outw (DX), outw ARG2(AX,DX), _WTOG out DX) -#define OUT_B CHOICE(outb (DX), outb ARG2(AL,DX), outb DX) +#define LTR(a) CHOICE(ltr a, ltr a, ltr a) +#define MOV_SR(a, b) CHOICE(movw ARG2(a,b), mov ARG2(a,b), mov ARG2(b,a)) +#define MOV_L(a, b) CHOICE(movl ARG2(a,b), movl ARG2(a,b), _LTOG mov ARG2(b,a)) +#define MOV_W(a, b) CHOICE(movw ARG2(a,b), movw ARG2(a,b), _WTOG mov ARG2(b,a)) +#define MOV_B(a, b) CHOICE(movb ARG2(a,b), movb ARG2(a,b), movb ARG2(b,a)) +#define MOVS_L CHOICE(movsl, movsl, _LTOG movs) +#define MOVS_W CHOICE(movsw, movsw, _WTOG movs) +#define MOVS_B CHOICE(movsb, movsb, movsb) +#define MOVSX_BL(a, b) CHOICE(movsbl ARG2(a,b), movsbl ARG2(a,b), movsx ARG2(b,a)) +#define MOVSX_BW(a, b) CHOICE(movsbw ARG2(a,b), movsbw ARG2(a,b), movsx ARG2(b,a)) +#define MOVSX_WL(a, b) CHOICE(movswl ARG2(a,b), movswl ARG2(a,b), movsx ARG2(b,a)) +#define MOVZX_BL(a, b) CHOICE(movzbl ARG2(a,b), movzbl ARG2(a,b), movzx ARG2(b,a)) +#define MOVZX_BW(a, b) CHOICE(movzbw ARG2(a,b), movzbw ARG2(a,b), movzx ARG2(b,a)) +#define MOVZX_WL(a, b) CHOICE(movzwl ARG2(a,b), movzwl ARG2(a,b), movzx ARG2(b,a)) +#define MUL_L(a) CHOICE(mull a, mull a, _LTOG mul a) +#define MUL_W(a) CHOICE(mulw a, mulw a, _WTOG mul a) +#define MUL_B(a) CHOICE(mulb a, mulb a, mulb a) +#define NEG_L(a) CHOICE(negl a, negl a, _LTOG neg a) +#define NEG_W(a) CHOICE(negw a, negw a, _WTOG neg a) +#define NEG_B(a) CHOICE(negb a, negb a, negb a) +#define NOP CHOICE(nop, nop, nop) +#define NOT_L(a) CHOICE(notl a, notl a, _LTOG not a) +#define NOT_W(a) CHOICE(notw a, notw a, _WTOG not a) +#define NOT_B(a) CHOICE(notb a, notb a, notb a) +#define OR_L(a,b) CHOICE(orl ARG2(a,b), orl ARG2(a,b), _LTOG or ARG2(b,a)) +#define OR_W(a,b) CHOICE(orw ARG2(a,b), orw ARG2(a,b), _WTOG or ARG2(b,a)) +#define OR_B(a,b) CHOICE(orb ARG2(a,b), orb ARG2(a,b), orb ARG2(b,a)) +#define OUT_L CHOICE(outl (DX), outl ARG2(EAX,DX), _LTOG out DX) +#define OUT_W CHOICE(outw (DX), outw ARG2(AX,DX), _WTOG out DX) +#define OUT_B CHOICE(outb (DX), outb ARG2(AL,DX), outb DX) /* Please AS code writer: use the following ONLY, if you refer to ports<256 * directly, but not in OUT1_W(DX), for instance, even if OUT1_ looks nicer */ -#define OUT1_L(a) CHOICE(outl (a), outl ARG2(EAX,a), _LTOG out a) -#define OUT1_W(a) CHOICE(outw (a), outw ARG2(AX,a), _WTOG out a) -#define OUT1_B(a) CHOICE(outb (a), outb ARG2(AL,a), outb a) -#define OUTS_L CHOICE(outsl, outsl, _LTOG outs) -#define OUTS_W CHOICE(outsw, outsw, _WTOG outs) -#define OUTS_B CHOICE(outsb, outsb, outsb) -#define POP_SR(a) CHOICE(pop a, pop a, pop a) -#define POP_L(a) CHOICE(popl a, popl a, _LTOG pop a) -#define POP_W(a) CHOICE(popw a, popw a, _WTOG pop a) -#define POPA_L CHOICE(popal, popal, _LTOG popa) -#define POPA_W CHOICE(popaw, popaw, _WTOG popa) -#define POPF_L CHOICE(popfl, popfl, _LTOG popf) -#define POPF_W CHOICE(popfw, popfw, _WTOG popf) -#define PUSH_SR(a) CHOICE(push a, push a, push a) -#define PUSH_L(a) CHOICE(pushl a, pushl a, _LTOG push a) -#define PUSH_W(a) CHOICE(pushw a, pushw a, _WTOG push a) -#define PUSH_B(a) CHOICE(push a, pushb a, push a) -#define PUSHA_L CHOICE(pushal, pushal, _LTOG pusha) -#define PUSHA_W CHOICE(pushaw, pushaw, _WTOG pusha) -#define PUSHF_L CHOICE(pushfl, pushfl, _LTOG pushf) -#define PUSHF_W CHOICE(pushfw, pushfw, _WTOG pushf) -#define RCL_L(a, b) CHOICE(rcll ARG2(a,b), rcll ARG2(a,b), _LTOG rcl ARG2(b,a)) -#define RCL_W(a, b) CHOICE(rclw ARG2(a,b), rclw ARG2(a,b), _WTOG rcl ARG2(b,a)) -#define RCL_B(a, b) CHOICE(rclb ARG2(a,b), rclb ARG2(a,b), rclb ARG2(b,a)) -#define RCR_L(a, b) CHOICE(rcrl ARG2(a,b), rcrl ARG2(a,b), _LTOG rcr ARG2(b,a)) -#define RCR_W(a, b) CHOICE(rcrw ARG2(a,b), rcrw ARG2(a,b), _WTOG rcr ARG2(b,a)) -#define RCR_B(a, b) CHOICE(rcrb ARG2(a,b), rcrb ARG2(a,b), rcrb ARG2(b,a)) -#define ROL_L(a, b) CHOICE(roll ARG2(a,b), roll ARG2(a,b), _LTOG rol ARG2(b,a)) -#define ROL_W(a, b) CHOICE(rolw ARG2(a,b), rolw ARG2(a,b), _WTOG rol ARG2(b,a)) -#define ROL_B(a, b) CHOICE(rolb ARG2(a,b), rolb ARG2(a,b), rolb ARG2(b,a)) -#define ROR_L(a, b) CHOICE(rorl ARG2(a,b), rorl ARG2(a,b), _LTOG ror ARG2(b,a)) -#define ROR_W(a, b) CHOICE(rorw ARG2(a,b), rorw ARG2(a,b), _WTOG ror ARG2(b,a)) -#define ROR_B(a, b) CHOICE(rorb ARG2(a,b), rorb ARG2(a,b), rorb ARG2(b,a)) -#define REP CHOICE(rep ;, rep ;, repe) -#define REPE CHOICE(repz ;, repe ;, repe) -#define REPNE CHOICE(repnz ;, repne ;, repne) -#define REPNZ REPNE -#define REPZ REPE -#define RET CHOICE(ret, ret, ret) -#define SAHF CHOICE(sahf, sahf, sahf) -#define SAL_L(a, b) CHOICE(sall ARG2(a,b), sall ARG2(a,b), _LTOG sal ARG2(b,a)) -#define SAL_W(a, b) CHOICE(salw ARG2(a,b), salw ARG2(a,b), _WTOG sal ARG2(b,a)) -#define SAL_B(a, b) CHOICE(salb ARG2(a,b), salb ARG2(a,b), salb ARG2(b,a)) -#define SAR_L(a, b) CHOICE(sarl ARG2(a,b), sarl ARG2(a,b), _LTOG sar ARG2(b,a)) -#define SAR_W(a, b) CHOICE(sarw ARG2(a,b), sarw ARG2(a,b), _WTOG sar ARG2(b,a)) -#define SAR_B(a, b) CHOICE(sarb ARG2(a,b), sarb ARG2(a,b), sarb ARG2(b,a)) -#define SBB_L(a, b) CHOICE(sbbl ARG2(a,b), sbbl ARG2(a,b), _LTOG sbb ARG2(b,a)) -#define SBB_W(a, b) CHOICE(sbbw ARG2(a,b), sbbw ARG2(a,b), _WTOG sbb ARG2(b,a)) -#define SBB_B(a, b) CHOICE(sbbb ARG2(a,b), sbbb ARG2(a,b), sbbb ARG2(b,a)) -#define SCAS_L CHOICE(scasl, scasl, _LTOG scas) -#define SCAS_W CHOICE(scasw, scasw, _WTOG scas) -#define SCAS_B CHOICE(scasb, scasb, scasb) -#define SETA(a) CHOICE(seta a, seta a, seta a) -#define SETAE(a) CHOICE(setae a, setae a, setae a) -#define SETB(a) CHOICE(setb a, setb a, setb a) -#define SETBE(a) CHOICE(setbe a, setbe a, setbe a) -#define SETC(a) CHOICE(setc a, setb a, setb a) -#define SETE(a) CHOICE(sete a, sete a, sete a) -#define SETG(a) CHOICE(setg a, setg a, setg a) -#define SETGE(a) CHOICE(setge a, setge a, setge a) -#define SETL(a) CHOICE(setl a, setl a, setl a) -#define SETLE(a) CHOICE(setle a, setle a, setle a) -#define SETNA(a) CHOICE(setna a, setna a, setna a) -#define SETNAE(a) CHOICE(setnae a, setnae a, setnae a) -#define SETNB(a) CHOICE(setnb a, setnb a, setnb a) -#define SETNBE(a) CHOICE(setnbe a, setnbe a, setnbe a) -#define SETNC(a) CHOICE(setnc a, setnb a, setnb a) -#define SETNE(a) CHOICE(setne a, setne a, setne a) -#define SETNG(a) CHOICE(setng a, setng a, setng a) -#define SETNGE(a) CHOICE(setnge a, setnge a, setnge a) -#define SETNL(a) CHOICE(setnl a, setnl a, setnl a) -#define SETNLE(a) CHOICE(setnle a, setnle a, setnle a) -#define SETNO(a) CHOICE(setno a, setno a, setno a) -#define SETNP(a) CHOICE(setnp a, setnp a, setnp a) -#define SETNS(a) CHOICE(setns a, setns a, setna a) -#define SETNZ(a) CHOICE(setnz a, setnz a, setnz a) -#define SETO(a) CHOICE(seto a, seto a, seto a) -#define SETP(a) CHOICE(setp a, setp a, setp a) -#define SETPE(a) CHOICE(setpe a, setpe a, setpe a) -#define SETPO(a) CHOICE(setpo a, setpo a, setpo a) -#define SETS(a) CHOICE(sets a, sets a, seta a) -#define SETZ(a) CHOICE(setz a, setz a, setz a) -#define SGDT(a) CHOICE(sgdt a, sgdt a, sgdt a) -#define SIDT(a) CHOICE(sidt a, sidt a, sidt a) -#define SHL_L(a, b) CHOICE(shll ARG2(a,b), shll ARG2(a,b), _LTOG shl ARG2(b,a)) -#define SHL_W(a, b) CHOICE(shlw ARG2(a,b), shlw ARG2(a,b), _WTOG shl ARG2(b,a)) -#define SHL_B(a, b) CHOICE(shlb ARG2(a,b), shlb ARG2(a,b), shlb ARG2(b,a)) -#define SHLD_L(a,b,c) CHOICE(shldl ARG3(a,b,c), shldl ARG3(a,b,c), _LTOG shld ARG3(c,b,a)) -#define SHLD2_L(a,b) CHOICE(shldl ARG2(a,b), shldl ARG3(CL,a,b), _LTOG shld ARG3(b,a,CL)) -#define SHLD_W(a,b,c) CHOICE(shldw ARG3(a,b,c), shldw ARG3(a,b,c), _WTOG shld ARG3(c,b,a)) -#define SHLD2_W(a,b) CHOICE(shldw ARG2(a,b), shldw ARG3(CL,a,b), _WTOG shld ARG3(b,a,CL)) -#define SHR_L(a, b) CHOICE(shrl ARG2(a,b), shrl ARG2(a,b), _LTOG shr ARG2(b,a)) -#define SHR_W(a, b) CHOICE(shrw ARG2(a,b), shrw ARG2(a,b), _WTOG shr ARG2(b,a)) -#define SHR_B(a, b) CHOICE(shrb ARG2(a,b), shrb ARG2(a,b), shrb ARG2(b,a)) -#define SHRD_L(a,b,c) CHOICE(shrdl ARG3(a,b,c), shrdl ARG3(a,b,c), _LTOG shrd ARG3(c,b,a)) -#define SHRD2_L(a,b) CHOICE(shrdl ARG2(a,b), shrdl ARG3(CL,a,b), _LTOG shrd ARG3(b,a,CL)) -#define SHRD_W(a,b,c) CHOICE(shrdw ARG3(a,b,c), shrdw ARG3(a,b,c), _WTOG shrd ARG3(c,b,a)) -#define SHRD2_W(a,b) CHOICE(shrdw ARG2(a,b), shrdw ARG3(CL,a,b), _WTOG shrd ARG3(b,a,CL)) -#define SLDT(a) CHOICE(sldt a, sldt a, sldt a) -#define SMSW(a) CHOICE(smsw a, smsw a, smsw a) -#define STC CHOICE(stc, stc, stc) -#define STD CHOICE(std, std, std) -#define STI CHOICE(sti, sti, sti) -#define STOS_L CHOICE(stosl, stosl, _LTOG stos) -#define STOS_W CHOICE(stosw, stosw, _WTOG stos) -#define STOS_B CHOICE(stosb, stosb, stosb) -#define STR(a) CHOICE(str a, str a, str a) -#define SUB_L(a, b) CHOICE(subl ARG2(a,b), subl ARG2(a,b), _LTOG sub ARG2(b,a)) -#define SUB_W(a, b) CHOICE(subw ARG2(a,b), subw ARG2(a,b), _WTOG sub ARG2(b,a)) -#define SUB_B(a, b) CHOICE(subb ARG2(a,b), subb ARG2(a,b), subb ARG2(b,a)) -#define TEST_L(a, b) CHOICE(testl ARG2(a,b), testl ARG2(a,b), _LTOG test ARG2(b,a)) -#define TEST_W(a, b) CHOICE(testw ARG2(a,b), testw ARG2(a,b), _WTOG test ARG2(b,a)) -#define TEST_B(a, b) CHOICE(testb ARG2(a,b), testb ARG2(a,b), testb ARG2(b,a)) -#define VERR(a) CHOICE(verr a, verr a, verr a) -#define VERW(a) CHOICE(verw a, verw a, verw a) -#define WAIT CHOICE(wait, wait, wait) -#define XCHG_L(a, b) CHOICE(xchgl ARG2(a,b), xchgl ARG2(a,b), _LTOG xchg ARG2(b,a)) -#define XCHG_W(a, b) CHOICE(xchgw ARG2(a,b), xchgw ARG2(a,b), _WTOG xchg ARG2(b,a)) -#define XCHG_B(a, b) CHOICE(xchgb ARG2(a,b), xchgb ARG2(a,b), xchgb ARG2(b,a)) -#define XLAT CHOICE(xlat, xlat, xlat) -#define XOR_L(a, b) CHOICE(xorl ARG2(a,b), xorl ARG2(a,b), _LTOG xor ARG2(b,a)) -#define XOR_W(a, b) CHOICE(xorw ARG2(a,b), xorw ARG2(a,b), _WTOG xor ARG2(b,a)) -#define XOR_B(a, b) CHOICE(xorb ARG2(a,b), xorb ARG2(a,b), xorb ARG2(b,a)) +#define OUT1_L(a) CHOICE(outl (a), outl ARG2(EAX,a), _LTOG out a) +#define OUT1_W(a) CHOICE(outw (a), outw ARG2(AX,a), _WTOG out a) +#define OUT1_B(a) CHOICE(outb (a), outb ARG2(AL,a), outb a) +#define OUTS_L CHOICE(outsl, outsl, _LTOG outs) +#define OUTS_W CHOICE(outsw, outsw, _WTOG outs) +#define OUTS_B CHOICE(outsb, outsb, outsb) +#define POP_SR(a) CHOICE(pop a, pop a, pop a) +#define POP_L(a) CHOICE(popl a, popl a, _LTOG pop a) +#define POP_W(a) CHOICE(popw a, popw a, _WTOG pop a) +#define POPA_L CHOICE(popal, popal, _LTOG popa) +#define POPA_W CHOICE(popaw, popaw, _WTOG popa) +#define POPF_L CHOICE(popfl, popfl, _LTOG popf) +#define POPF_W CHOICE(popfw, popfw, _WTOG popf) +#define PUSH_SR(a) CHOICE(push a, push a, push a) +#define PUSH_L(a) CHOICE(pushl a, pushl a, _LTOG push a) +#define PUSH_W(a) CHOICE(pushw a, pushw a, _WTOG push a) +#define PUSH_B(a) CHOICE(push a, pushb a, push a) +#define PUSHA_L CHOICE(pushal, pushal, _LTOG pusha) +#define PUSHA_W CHOICE(pushaw, pushaw, _WTOG pusha) +#define PUSHF_L CHOICE(pushfl, pushfl, _LTOG pushf) +#define PUSHF_W CHOICE(pushfw, pushfw, _WTOG pushf) +#define RCL_L(a, b) CHOICE(rcll ARG2(a,b), rcll ARG2(a,b), _LTOG rcl ARG2(b,a)) +#define RCL_W(a, b) CHOICE(rclw ARG2(a,b), rclw ARG2(a,b), _WTOG rcl ARG2(b,a)) +#define RCL_B(a, b) CHOICE(rclb ARG2(a,b), rclb ARG2(a,b), rclb ARG2(b,a)) +#define RCR_L(a, b) CHOICE(rcrl ARG2(a,b), rcrl ARG2(a,b), _LTOG rcr ARG2(b,a)) +#define RCR_W(a, b) CHOICE(rcrw ARG2(a,b), rcrw ARG2(a,b), _WTOG rcr ARG2(b,a)) +#define RCR_B(a, b) CHOICE(rcrb ARG2(a,b), rcrb ARG2(a,b), rcrb ARG2(b,a)) +#define ROL_L(a, b) CHOICE(roll ARG2(a,b), roll ARG2(a,b), _LTOG rol ARG2(b,a)) +#define ROL_W(a, b) CHOICE(rolw ARG2(a,b), rolw ARG2(a,b), _WTOG rol ARG2(b,a)) +#define ROL_B(a, b) CHOICE(rolb ARG2(a,b), rolb ARG2(a,b), rolb ARG2(b,a)) +#define ROR_L(a, b) CHOICE(rorl ARG2(a,b), rorl ARG2(a,b), _LTOG ror ARG2(b,a)) +#define ROR_W(a, b) CHOICE(rorw ARG2(a,b), rorw ARG2(a,b), _WTOG ror ARG2(b,a)) +#define ROR_B(a, b) CHOICE(rorb ARG2(a,b), rorb ARG2(a,b), rorb ARG2(b,a)) +#define REP CHOICE(rep ;, rep ;, repe) +#define REPE CHOICE(repz ;, repe ;, repe) +#define REPNE CHOICE(repnz ;, repne ;, repne) +#define REPNZ REPNE +#define REPZ REPE +#define RET CHOICE(ret, ret, ret) +#define SAHF CHOICE(sahf, sahf, sahf) +#define SAL_L(a, b) CHOICE(sall ARG2(a,b), sall ARG2(a,b), _LTOG sal ARG2(b,a)) +#define SAL_W(a, b) CHOICE(salw ARG2(a,b), salw ARG2(a,b), _WTOG sal ARG2(b,a)) +#define SAL_B(a, b) CHOICE(salb ARG2(a,b), salb ARG2(a,b), salb ARG2(b,a)) +#define SAR_L(a, b) CHOICE(sarl ARG2(a,b), sarl ARG2(a,b), _LTOG sar ARG2(b,a)) +#define SAR_W(a, b) CHOICE(sarw ARG2(a,b), sarw ARG2(a,b), _WTOG sar ARG2(b,a)) +#define SAR_B(a, b) CHOICE(sarb ARG2(a,b), sarb ARG2(a,b), sarb ARG2(b,a)) +#define SBB_L(a, b) CHOICE(sbbl ARG2(a,b), sbbl ARG2(a,b), _LTOG sbb ARG2(b,a)) +#define SBB_W(a, b) CHOICE(sbbw ARG2(a,b), sbbw ARG2(a,b), _WTOG sbb ARG2(b,a)) +#define SBB_B(a, b) CHOICE(sbbb ARG2(a,b), sbbb ARG2(a,b), sbbb ARG2(b,a)) +#define SCAS_L CHOICE(scasl, scasl, _LTOG scas) +#define SCAS_W CHOICE(scasw, scasw, _WTOG scas) +#define SCAS_B CHOICE(scasb, scasb, scasb) +#define SETA(a) CHOICE(seta a, seta a, seta a) +#define SETAE(a) CHOICE(setae a, setae a, setae a) +#define SETB(a) CHOICE(setb a, setb a, setb a) +#define SETBE(a) CHOICE(setbe a, setbe a, setbe a) +#define SETC(a) CHOICE(setc a, setb a, setb a) +#define SETE(a) CHOICE(sete a, sete a, sete a) +#define SETG(a) CHOICE(setg a, setg a, setg a) +#define SETGE(a) CHOICE(setge a, setge a, setge a) +#define SETL(a) CHOICE(setl a, setl a, setl a) +#define SETLE(a) CHOICE(setle a, setle a, setle a) +#define SETNA(a) CHOICE(setna a, setna a, setna a) +#define SETNAE(a) CHOICE(setnae a, setnae a, setnae a) +#define SETNB(a) CHOICE(setnb a, setnb a, setnb a) +#define SETNBE(a) CHOICE(setnbe a, setnbe a, setnbe a) +#define SETNC(a) CHOICE(setnc a, setnb a, setnb a) +#define SETNE(a) CHOICE(setne a, setne a, setne a) +#define SETNG(a) CHOICE(setng a, setng a, setng a) +#define SETNGE(a) CHOICE(setnge a, setnge a, setnge a) +#define SETNL(a) CHOICE(setnl a, setnl a, setnl a) +#define SETNLE(a) CHOICE(setnle a, setnle a, setnle a) +#define SETNO(a) CHOICE(setno a, setno a, setno a) +#define SETNP(a) CHOICE(setnp a, setnp a, setnp a) +#define SETNS(a) CHOICE(setns a, setns a, setna a) +#define SETNZ(a) CHOICE(setnz a, setnz a, setnz a) +#define SETO(a) CHOICE(seto a, seto a, seto a) +#define SETP(a) CHOICE(setp a, setp a, setp a) +#define SETPE(a) CHOICE(setpe a, setpe a, setpe a) +#define SETPO(a) CHOICE(setpo a, setpo a, setpo a) +#define SETS(a) CHOICE(sets a, sets a, seta a) +#define SETZ(a) CHOICE(setz a, setz a, setz a) +#define SGDT(a) CHOICE(sgdt a, sgdt a, sgdt a) +#define SIDT(a) CHOICE(sidt a, sidt a, sidt a) +#define SHL_L(a, b) CHOICE(shll ARG2(a,b), shll ARG2(a,b), _LTOG shl ARG2(b,a)) +#define SHL_W(a, b) CHOICE(shlw ARG2(a,b), shlw ARG2(a,b), _WTOG shl ARG2(b,a)) +#define SHL_B(a, b) CHOICE(shlb ARG2(a,b), shlb ARG2(a,b), shlb ARG2(b,a)) +#define SHLD_L(a,b,c) CHOICE(shldl ARG3(a,b,c), shldl ARG3(a,b,c), _LTOG shld ARG3(c,b,a)) +#define SHLD2_L(a,b) CHOICE(shldl ARG2(a,b), shldl ARG3(CL,a,b), _LTOG shld ARG3(b,a,CL)) +#define SHLD_W(a,b,c) CHOICE(shldw ARG3(a,b,c), shldw ARG3(a,b,c), _WTOG shld ARG3(c,b,a)) +#define SHLD2_W(a,b) CHOICE(shldw ARG2(a,b), shldw ARG3(CL,a,b), _WTOG shld ARG3(b,a,CL)) +#define SHR_L(a, b) CHOICE(shrl ARG2(a,b), shrl ARG2(a,b), _LTOG shr ARG2(b,a)) +#define SHR_W(a, b) CHOICE(shrw ARG2(a,b), shrw ARG2(a,b), _WTOG shr ARG2(b,a)) +#define SHR_B(a, b) CHOICE(shrb ARG2(a,b), shrb ARG2(a,b), shrb ARG2(b,a)) +#define SHRD_L(a,b,c) CHOICE(shrdl ARG3(a,b,c), shrdl ARG3(a,b,c), _LTOG shrd ARG3(c,b,a)) +#define SHRD2_L(a,b) CHOICE(shrdl ARG2(a,b), shrdl ARG3(CL,a,b), _LTOG shrd ARG3(b,a,CL)) +#define SHRD_W(a,b,c) CHOICE(shrdw ARG3(a,b,c), shrdw ARG3(a,b,c), _WTOG shrd ARG3(c,b,a)) +#define SHRD2_W(a,b) CHOICE(shrdw ARG2(a,b), shrdw ARG3(CL,a,b), _WTOG shrd ARG3(b,a,CL)) +#define SLDT(a) CHOICE(sldt a, sldt a, sldt a) +#define SMSW(a) CHOICE(smsw a, smsw a, smsw a) +#define STC CHOICE(stc, stc, stc) +#define STD CHOICE(std, std, std) +#define STI CHOICE(sti, sti, sti) +#define STOS_L CHOICE(stosl, stosl, _LTOG stos) +#define STOS_W CHOICE(stosw, stosw, _WTOG stos) +#define STOS_B CHOICE(stosb, stosb, stosb) +#define STR(a) CHOICE(str a, str a, str a) +#define SUB_L(a, b) CHOICE(subl ARG2(a,b), subl ARG2(a,b), _LTOG sub ARG2(b,a)) +#define SUB_W(a, b) CHOICE(subw ARG2(a,b), subw ARG2(a,b), _WTOG sub ARG2(b,a)) +#define SUB_B(a, b) CHOICE(subb ARG2(a,b), subb ARG2(a,b), subb ARG2(b,a)) +#define TEST_L(a, b) CHOICE(testl ARG2(a,b), testl ARG2(a,b), _LTOG test ARG2(b,a)) +#define TEST_W(a, b) CHOICE(testw ARG2(a,b), testw ARG2(a,b), _WTOG test ARG2(b,a)) +#define TEST_B(a, b) CHOICE(testb ARG2(a,b), testb ARG2(a,b), testb ARG2(b,a)) +#define VERR(a) CHOICE(verr a, verr a, verr a) +#define VERW(a) CHOICE(verw a, verw a, verw a) +#define WAIT CHOICE(wait, wait, wait) +#define XCHG_L(a, b) CHOICE(xchgl ARG2(a,b), xchgl ARG2(a,b), _LTOG xchg ARG2(b,a)) +#define XCHG_W(a, b) CHOICE(xchgw ARG2(a,b), xchgw ARG2(a,b), _WTOG xchg ARG2(b,a)) +#define XCHG_B(a, b) CHOICE(xchgb ARG2(a,b), xchgb ARG2(a,b), xchgb ARG2(b,a)) +#define XLAT CHOICE(xlat, xlat, xlat) +#define XOR_L(a, b) CHOICE(xorl ARG2(a,b), xorl ARG2(a,b), _LTOG xor ARG2(b,a)) +#define XOR_W(a, b) CHOICE(xorw ARG2(a,b), xorw ARG2(a,b), _WTOG xor ARG2(b,a)) +#define XOR_B(a, b) CHOICE(xorb ARG2(a,b), xorb ARG2(a,b), xorb ARG2(b,a)) /* Floating Point Instructions */ -#define F2XM1 CHOICE(f2xm1, f2xm1, f2xm1) -#define FABS CHOICE(fabs, fabs, fabs) -#define FADD_D(a) CHOICE(faddl a, faddl a, faddd a) -#define FADD_S(a) CHOICE(fadds a, fadds a, fadds a) -#define FADD2(a, b) CHOICE(fadd ARG2(a,b), fadd ARG2(a,b), fadd ARG2(b,a)) -#define FADDP(a, b) CHOICE(faddp ARG2(a,b), faddp ARG2(a,b), faddp ARG2(b,a)) -#define FIADD_L(a) CHOICE(fiaddl a, fiaddl a, fiaddl a) -#define FIADD_W(a) CHOICE(fiadd a, fiadds a, fiadds a) -#define FBLD(a) CHOICE(fbld a, fbld a, fbld a) -#define FBSTP(a) CHOICE(fbstp a, fbstp a, fbstp a) -#define FCHS CHOICE(fchs, fchs, fchs) -#define FCLEX CHOICE(fclex, wait; fnclex, wait; fclex) -#define FNCLEX CHOICE(fnclex, fnclex, fclex) -#define FCOM(a) CHOICE(fcom a, fcom a, fcom a) -#define FCOM_D(a) CHOICE(fcoml a, fcoml a, fcomd a) -#define FCOM_S(a) CHOICE(fcoms a, fcoms a, fcoms a) -#define FCOMP(a) CHOICE(fcomp a, fcomp a, fcomp a) -#define FCOMP_D(a) CHOICE(fcompl a, fcompl a, fcompd a) -#define FCOMP_S(a) CHOICE(fcomps a, fcomps a, fcomps a) -#define FCOMPP CHOICE(fcompp, fcompp, fcompp) -#define FCOS CHOICE(fcos, fcos, fcos) -#define FDECSTP CHOICE(fdecstp, fdecstp, fdecstp) -#define FDIV_D(a) CHOICE(fdivl a, fdivl a, fdivd a) -#define FDIV_S(a) CHOICE(fdivs a, fdivs a, fdivs a) -#define FDIV2(a, b) CHOICE(fdiv ARG2(a,b), fdiv ARG2(a,b), fdiv ARG2(b,a)) -#define FDIVP(a, b) CHOICE(fdivp ARG2(a,b), fdivp ARG2(a,b), fdivp ARG2(b,a)) -#define FIDIV_L(a) CHOICE(fidivl a, fidivl a, fidivl a) -#define FIDIV_W(a) CHOICE(fidiv a, fidivs a, fidivs a) -#define FDIVR_D(a) CHOICE(fdivrl a, fdivrl a, fdivrd a) -#define FDIVR_S(a) CHOICE(fdivrs a, fdivrs a, fdivrs a) -#define FDIVR2(a, b) CHOICE(fdivr ARG2(a,b), fdivr ARG2(a,b), fdivr ARG2(b,a)) -#define FDIVRP(a, b) CHOICE(fdivrp ARG2(a,b), fdivrp ARG2(a,b), fdivrp ARG2(b,a)) -#define FIDIVR_L(a) CHOICE(fidivrl a, fidivrl a, fidivrl a) -#define FIDIVR_W(a) CHOICE(fidivr a, fidivrs a, fidivrs a) -#define FFREE(a) CHOICE(ffree a, ffree a, ffree a) -#define FICOM_L(a) CHOICE(ficoml a, ficoml a, ficoml a) -#define FICOM_W(a) CHOICE(ficom a, ficoms a, ficoms a) -#define FICOMP_L(a) CHOICE(ficompl a, ficompl a, ficompl a) -#define FICOMP_W(a) CHOICE(ficomp a, ficomps a, ficomps a) -#define FILD_Q(a) CHOICE(fildll a, fildq a, fildq a) -#define FILD_L(a) CHOICE(fildl a, fildl a, fildl a) -#define FILD_W(a) CHOICE(fild a, filds a, filds a) -#define FINCSTP CHOICE(fincstp, fincstp, fincstp) -#define FINIT CHOICE(finit, wait; fninit, wait; finit) -#define FNINIT CHOICE(fninit, fninit, finit) -#define FIST_L(a) CHOICE(fistl a, fistl a, fistl a) -#define FIST_W(a) CHOICE(fist a, fists a, fists a) -#define FISTP_Q(a) CHOICE(fistpll a, fistpq a, fistpq a) -#define FISTP_L(a) CHOICE(fistpl a, fistpl a, fistpl a) -#define FISTP_W(a) CHOICE(fistp a, fistps a, fistps a) -#define FLD_X(a) CHOICE(fldt a, fldt a, fldx a) /* 80 bit data type! */ -#define FLD_D(a) CHOICE(fldl a, fldl a, fldd a) -#define FLD_S(a) CHOICE(flds a, flds a, flds a) -#define FLD1 CHOICE(fld1, fld1, fld1) -#define FLDL2T CHOICE(fldl2t, fldl2t, fldl2t) -#define FLDL2E CHOICE(fldl2e, fldl2e, fldl2e) -#define FLDPI CHOICE(fldpi, fldpi, fldpi) -#define FLDLG2 CHOICE(fldlg2, fldlg2, fldlg2) -#define FLDLN2 CHOICE(fldln2, fldln2, fldln2) -#define FLDZ CHOICE(fldz, fldz, fldz) -#define FLDCW(a) CHOICE(fldcw a, fldcw a, fldcw a) -#define FLDENV(a) CHOICE(fldenv a, fldenv a, fldenv a) -#define FMUL_S(a) CHOICE(fmuls a, fmuls a, fmuls a) -#define FMUL_D(a) CHOICE(fmull a, fmull a, fmuld a) -#define FMUL2(a, b) CHOICE(fmul ARG2(a,b), fmul ARG2(a,b), fmul ARG2(b,a)) -#define FMULP(a, b) CHOICE(fmulp ARG2(a,b), fmulp ARG2(a,b), fmulp ARG2(b,a)) -#define FIMUL_L(a) CHOICE(fimull a, fimull a, fimull a) -#define FIMUL_W(a) CHOICE(fimul a, fimuls a, fimuls a) -#define FNOP CHOICE(fnop, fnop, fnop) -#define FPATAN CHOICE(fpatan, fpatan, fpatan) -#define FPREM CHOICE(fprem, fprem, fprem) -#define FPREM1 CHOICE(fprem1, fprem1, fprem1) -#define FPTAN CHOICE(fptan, fptan, fptan) -#define FRNDINT CHOICE(frndint, frndint, frndint) -#define FRSTOR(a) CHOICE(frstor a, frstor a, frstor a) -#define FSAVE(a) CHOICE(fsave a, wait; fnsave a, wait; fsave a) -#define FNSAVE(a) CHOICE(fnsave a, fnsave a, fsave a) -#define FSCALE CHOICE(fscale, fscale, fscale) -#define FSIN CHOICE(fsin, fsin, fsin) -#define FSINCOS CHOICE(fsincos, fsincos, fsincos) -#define FSQRT CHOICE(fsqrt, fsqrt, fsqrt) -#define FST_D(a) CHOICE(fstl a, fstl a, fstd a) -#define FST_S(a) CHOICE(fsts a, fsts a, fsts a) -#define FSTP_X(a) CHOICE(fstpt a, fstpt a, fstpx a) -#define FSTP_D(a) CHOICE(fstpl a, fstpl a, fstpd a) -#define FSTP_S(a) CHOICE(fstps a, fstps a, fstps a) -#define FSTP(a) CHOICE(fstp a, fstp a, fstp a) -#define FSTCW(a) CHOICE(fstcw a, wait; fnstcw a, wait; fstcw a) -#define FNSTCW(a) CHOICE(fnstcw a, fnstcw a, fstcw a) -#define FSTENV(a) CHOICE(fstenv a, wait; fnstenv a, fstenv a) -#define FNSTENV(a) CHOICE(fnstenv a, fnstenv a, fstenv a) -#define FSTSW(a) CHOICE(fstsw a, wait; fnstsw a, wait; fstsw a) -#define FNSTSW(a) CHOICE(fnstsw a, fnstsw a, fstsw a) -#define FSUB_S(a) CHOICE(fsubs a, fsubs a, fsubs a) -#define FSUB_D(a) CHOICE(fsubl a, fsubl a, fsubd a) -#define FSUB2(a, b) CHOICE(fsub ARG2(a,b), fsub ARG2(a,b), fsub ARG2(b,a)) -#define FSUBP(a, b) CHOICE(fsubp ARG2(a,b), fsubp ARG2(a,b), fsubp ARG2(b,a)) -#define FISUB_L(a) CHOICE(fisubl a, fisubl a, fisubl a) -#define FISUB_W(a) CHOICE(fisub a, fisubs a, fisubs a) -#define FSUBR_S(a) CHOICE(fsubrs a, fsubrs a, fsubrs a) -#define FSUBR_D(a) CHOICE(fsubrl a, fsubrl a, fsubrd a) -#define FSUBR2(a, b) CHOICE(fsubr ARG2(a,b), fsubr ARG2(a,b), fsubr ARG2(b,a)) -#define FSUBRP(a, b) CHOICE(fsubrp ARG2(a,b), fsubrp ARG2(a,b), fsubrp ARG2(b,a)) -#define FISUBR_L(a) CHOICE(fisubrl a, fisubrl a, fisubrl a) -#define FISUBR_W(a) CHOICE(fisubr a, fisubrs a, fisubrs a) -#define FTST CHOICE(ftst, ftst, ftst) -#define FUCOM(a) CHOICE(fucom a, fucom a, fucom a) -#define FUCOMP(a) CHOICE(fucomp a, fucomp a, fucomp a) -#define FUCOMPP CHOICE(fucompp, fucompp, fucompp) -#define FWAIT CHOICE(wait, wait, wait) -#define FXAM CHOICE(fxam, fxam, fxam) -#define FXCH(a) CHOICE(fxch a, fxch a, fxch a) -#define FXTRACT CHOICE(fxtract, fxtract, fxtract) -#define FYL2X CHOICE(fyl2x, fyl2x, fyl2x) -#define FYL2XP1 CHOICE(fyl2xp1, fyl2xp1, fyl2xp1) +#define F2XM1 CHOICE(f2xm1, f2xm1, f2xm1) +#define FABS CHOICE(fabs, fabs, fabs) +#define FADD_D(a) CHOICE(faddl a, faddl a, faddd a) +#define FADD_S(a) CHOICE(fadds a, fadds a, fadds a) +#define FADD2(a, b) CHOICE(fadd ARG2(a,b), fadd ARG2(a,b), fadd ARG2(b,a)) +#define FADDP(a, b) CHOICE(faddp ARG2(a,b), faddp ARG2(a,b), faddp ARG2(b,a)) +#define FIADD_L(a) CHOICE(fiaddl a, fiaddl a, fiaddl a) +#define FIADD_W(a) CHOICE(fiadd a, fiadds a, fiadds a) +#define FBLD(a) CHOICE(fbld a, fbld a, fbld a) +#define FBSTP(a) CHOICE(fbstp a, fbstp a, fbstp a) +#define FCHS CHOICE(fchs, fchs, fchs) +#define FCLEX CHOICE(fclex, wait; fnclex, wait; fclex) +#define FNCLEX CHOICE(fnclex, fnclex, fclex) +#define FCOM(a) CHOICE(fcom a, fcom a, fcom a) +#define FCOM_D(a) CHOICE(fcoml a, fcoml a, fcomd a) +#define FCOM_S(a) CHOICE(fcoms a, fcoms a, fcoms a) +#define FCOMP(a) CHOICE(fcomp a, fcomp a, fcomp a) +#define FCOMP_D(a) CHOICE(fcompl a, fcompl a, fcompd a) +#define FCOMP_S(a) CHOICE(fcomps a, fcomps a, fcomps a) +#define FCOMPP CHOICE(fcompp, fcompp, fcompp) +#define FCOS CHOICE(fcos, fcos, fcos) +#define FDECSTP CHOICE(fdecstp, fdecstp, fdecstp) +#define FDIV_D(a) CHOICE(fdivl a, fdivl a, fdivd a) +#define FDIV_S(a) CHOICE(fdivs a, fdivs a, fdivs a) +#define FDIV2(a, b) CHOICE(fdiv ARG2(a,b), fdiv ARG2(a,b), fdiv ARG2(b,a)) +#define FDIVP(a, b) CHOICE(fdivp ARG2(a,b), fdivp ARG2(a,b), fdivp ARG2(b,a)) +#define FIDIV_L(a) CHOICE(fidivl a, fidivl a, fidivl a) +#define FIDIV_W(a) CHOICE(fidiv a, fidivs a, fidivs a) +#define FDIVR_D(a) CHOICE(fdivrl a, fdivrl a, fdivrd a) +#define FDIVR_S(a) CHOICE(fdivrs a, fdivrs a, fdivrs a) +#define FDIVR2(a, b) CHOICE(fdivr ARG2(a,b), fdivr ARG2(a,b), fdivr ARG2(b,a)) +#define FDIVRP(a, b) CHOICE(fdivrp ARG2(a,b), fdivrp ARG2(a,b), fdivrp ARG2(b,a)) +#define FIDIVR_L(a) CHOICE(fidivrl a, fidivrl a, fidivrl a) +#define FIDIVR_W(a) CHOICE(fidivr a, fidivrs a, fidivrs a) +#define FFREE(a) CHOICE(ffree a, ffree a, ffree a) +#define FICOM_L(a) CHOICE(ficoml a, ficoml a, ficoml a) +#define FICOM_W(a) CHOICE(ficom a, ficoms a, ficoms a) +#define FICOMP_L(a) CHOICE(ficompl a, ficompl a, ficompl a) +#define FICOMP_W(a) CHOICE(ficomp a, ficomps a, ficomps a) +#define FILD_Q(a) CHOICE(fildll a, fildq a, fildq a) +#define FILD_L(a) CHOICE(fildl a, fildl a, fildl a) +#define FILD_W(a) CHOICE(fild a, filds a, filds a) +#define FINCSTP CHOICE(fincstp, fincstp, fincstp) +#define FINIT CHOICE(finit, wait; fninit, wait; finit) +#define FNINIT CHOICE(fninit, fninit, finit) +#define FIST_L(a) CHOICE(fistl a, fistl a, fistl a) +#define FIST_W(a) CHOICE(fist a, fists a, fists a) +#define FISTP_Q(a) CHOICE(fistpll a, fistpq a, fistpq a) +#define FISTP_L(a) CHOICE(fistpl a, fistpl a, fistpl a) +#define FISTP_W(a) CHOICE(fistp a, fistps a, fistps a) +#define FLD_X(a) CHOICE(fldt a, fldt a, fldx a) /* 80 bit data type! */ +#define FLD_D(a) CHOICE(fldl a, fldl a, fldd a) +#define FLD_S(a) CHOICE(flds a, flds a, flds a) +#define FLD1 CHOICE(fld1, fld1, fld1) +#define FLDL2T CHOICE(fldl2t, fldl2t, fldl2t) +#define FLDL2E CHOICE(fldl2e, fldl2e, fldl2e) +#define FLDPI CHOICE(fldpi, fldpi, fldpi) +#define FLDLG2 CHOICE(fldlg2, fldlg2, fldlg2) +#define FLDLN2 CHOICE(fldln2, fldln2, fldln2) +#define FLDZ CHOICE(fldz, fldz, fldz) +#define FLDCW(a) CHOICE(fldcw a, fldcw a, fldcw a) +#define FLDENV(a) CHOICE(fldenv a, fldenv a, fldenv a) +#define FMUL_S(a) CHOICE(fmuls a, fmuls a, fmuls a) +#define FMUL_D(a) CHOICE(fmull a, fmull a, fmuld a) +#define FMUL2(a, b) CHOICE(fmul ARG2(a,b), fmul ARG2(a,b), fmul ARG2(b,a)) +#define FMULP(a, b) CHOICE(fmulp ARG2(a,b), fmulp ARG2(a,b), fmulp ARG2(b,a)) +#define FIMUL_L(a) CHOICE(fimull a, fimull a, fimull a) +#define FIMUL_W(a) CHOICE(fimul a, fimuls a, fimuls a) +#define FNOP CHOICE(fnop, fnop, fnop) +#define FPATAN CHOICE(fpatan, fpatan, fpatan) +#define FPREM CHOICE(fprem, fprem, fprem) +#define FPREM1 CHOICE(fprem1, fprem1, fprem1) +#define FPTAN CHOICE(fptan, fptan, fptan) +#define FRNDINT CHOICE(frndint, frndint, frndint) +#define FRSTOR(a) CHOICE(frstor a, frstor a, frstor a) +#define FSAVE(a) CHOICE(fsave a, wait; fnsave a, wait; fsave a) +#define FNSAVE(a) CHOICE(fnsave a, fnsave a, fsave a) +#define FSCALE CHOICE(fscale, fscale, fscale) +#define FSIN CHOICE(fsin, fsin, fsin) +#define FSINCOS CHOICE(fsincos, fsincos, fsincos) +#define FSQRT CHOICE(fsqrt, fsqrt, fsqrt) +#define FST_D(a) CHOICE(fstl a, fstl a, fstd a) +#define FST_S(a) CHOICE(fsts a, fsts a, fsts a) +#define FSTP_X(a) CHOICE(fstpt a, fstpt a, fstpx a) +#define FSTP_D(a) CHOICE(fstpl a, fstpl a, fstpd a) +#define FSTP_S(a) CHOICE(fstps a, fstps a, fstps a) +#define FSTP(a) CHOICE(fstp a, fstp a, fstp a) +#define FSTCW(a) CHOICE(fstcw a, wait; fnstcw a, wait; fstcw a) +#define FNSTCW(a) CHOICE(fnstcw a, fnstcw a, fstcw a) +#define FSTENV(a) CHOICE(fstenv a, wait; fnstenv a, fstenv a) +#define FNSTENV(a) CHOICE(fnstenv a, fnstenv a, fstenv a) +#define FSTSW(a) CHOICE(fstsw a, wait; fnstsw a, wait; fstsw a) +#define FNSTSW(a) CHOICE(fnstsw a, fnstsw a, fstsw a) +#define FSUB_S(a) CHOICE(fsubs a, fsubs a, fsubs a) +#define FSUB_D(a) CHOICE(fsubl a, fsubl a, fsubd a) +#define FSUB2(a, b) CHOICE(fsub ARG2(a,b), fsub ARG2(a,b), fsub ARG2(b,a)) +#define FSUBP(a, b) CHOICE(fsubp ARG2(a,b), fsubp ARG2(a,b), fsubp ARG2(b,a)) +#define FISUB_L(a) CHOICE(fisubl a, fisubl a, fisubl a) +#define FISUB_W(a) CHOICE(fisub a, fisubs a, fisubs a) +#define FSUBR_S(a) CHOICE(fsubrs a, fsubrs a, fsubrs a) +#define FSUBR_D(a) CHOICE(fsubrl a, fsubrl a, fsubrd a) +#define FSUBR2(a, b) CHOICE(fsubr ARG2(a,b), fsubr ARG2(a,b), fsubr ARG2(b,a)) +#define FSUBRP(a, b) CHOICE(fsubrp ARG2(a,b), fsubrp ARG2(a,b), fsubrp ARG2(b,a)) +#define FISUBR_L(a) CHOICE(fisubrl a, fisubrl a, fisubrl a) +#define FISUBR_W(a) CHOICE(fisubr a, fisubrs a, fisubrs a) +#define FTST CHOICE(ftst, ftst, ftst) +#define FUCOM(a) CHOICE(fucom a, fucom a, fucom a) +#define FUCOMP(a) CHOICE(fucomp a, fucomp a, fucomp a) +#define FUCOMPP CHOICE(fucompp, fucompp, fucompp) +#define FWAIT CHOICE(wait, wait, wait) +#define FXAM CHOICE(fxam, fxam, fxam) +#define FXCH(a) CHOICE(fxch a, fxch a, fxch a) +#define FXTRACT CHOICE(fxtract, fxtract, fxtract) +#define FYL2X CHOICE(fyl2x, fyl2x, fyl2x) +#define FYL2XP1 CHOICE(fyl2xp1, fyl2xp1, fyl2xp1) /* New instructions */ -#define CPUID CHOICE(D_BYTE ARG2(15, 162), cpuid, D_BYTE ARG2(15, 162)) -#define RDTSC CHOICE(D_BYTE ARG2(15, 49), rdtsc, D_BYTE ARG2(15, 49)) +#define CPUID CHOICE(D_BYTE ARG2(15, 162), cpuid, D_BYTE ARG2(15, 162)) +#define RDTSC CHOICE(D_BYTE ARG2(15, 49), rdtsc, D_BYTE ARG2(15, 49)) #else /* NASM_ASSEMBLER || MASM_ASSEMBLER is defined */ @@ -779,166 +783,167 @@ /* */ /****************************************/ -#define P_EAX EAX -#define L_EAX EAX -#define W_AX AX -#define B_AH AH -#define B_AL AL - -#define P_EBX EBX -#define L_EBX EBX -#define W_BX BX -#define B_BH BH -#define B_BL BL - -#define P_ECX ECX -#define L_ECX ECX -#define W_CX CX -#define B_CH CH -#define B_CL CL - -#define P_EDX EDX -#define L_EDX EDX -#define W_DX DX -#define B_DH DH -#define B_DL DL - -#define P_EBP EBP -#define L_EBP EBP -#define W_BP BP - -#define P_ESI ESI -#define L_ESI ESI -#define W_SI SI - -#define P_EDI EDI -#define L_EDI EDI -#define W_DI DI - -#define P_ESP ESP -#define L_ESP ESP -#define W_SP SP - -#define W_CS CS -#define W_SS SS -#define W_DS DS -#define W_ES ES -#define W_FS FS -#define W_GS GS - -#define X_ST ST -#define D_ST ST -#define L_ST ST - -#define P_MM0 mm0 -#define P_MM1 mm1 -#define P_MM2 mm2 -#define P_MM3 mm3 -#define P_MM4 mm4 -#define P_MM5 mm5 -#define P_MM6 mm6 -#define P_MM7 mm7 - -#define P_XMM0 xmm0 -#define P_XMM1 xmm1 -#define P_XMM2 xmm2 -#define P_XMM3 xmm3 -#define P_XMM4 xmm4 -#define P_XMM5 xmm5 -#define P_XMM6 xmm6 -#define P_XMM7 xmm7 +#define P_EAX EAX +#define L_EAX EAX +#define W_AX AX +#define B_AH AH +#define B_AL AL + +#define P_EBX EBX +#define L_EBX EBX +#define W_BX BX +#define B_BH BH +#define B_BL BL + +#define P_ECX ECX +#define L_ECX ECX +#define W_CX CX +#define B_CH CH +#define B_CL CL + +#define P_EDX EDX +#define L_EDX EDX +#define W_DX DX +#define B_DH DH +#define B_DL DL + +#define P_EBP EBP +#define L_EBP EBP +#define W_BP BP + +#define P_ESI ESI +#define L_ESI ESI +#define W_SI SI + +#define P_EDI EDI +#define L_EDI EDI +#define W_DI DI + +#define P_ESP ESP +#define L_ESP ESP +#define W_SP SP + +#define W_CS CS +#define W_SS SS +#define W_DS DS +#define W_ES ES +#define W_FS FS +#define W_GS GS + +#define X_ST ST +#define D_ST ST +#define L_ST ST + +#define P_MM0 mm0 +#define P_MM1 mm1 +#define P_MM2 mm2 +#define P_MM3 mm3 +#define P_MM4 mm4 +#define P_MM5 mm5 +#define P_MM6 mm6 +#define P_MM7 mm7 + +#define P_XMM0 xmm0 +#define P_XMM1 xmm1 +#define P_XMM2 xmm2 +#define P_XMM3 xmm3 +#define P_XMM4 xmm4 +#define P_XMM5 xmm5 +#define P_XMM6 xmm6 +#define P_XMM7 xmm7 -#define CONCAT(x, y) x ## y +#define CONCAT(x, y) x ## y #if defined(NASM_ASSEMBLER) -#define ST(n) st ## n +#define ST(n) st ## n -#define TBYTE_PTR tword -#define QWORD_PTR qword -#define DWORD_PTR dword -#define WORD_PTR word -#define BYTE_PTR byte +#define TBYTE_PTR tword +#define QWORD_PTR qword +#define DWORD_PTR dword +#define WORD_PTR word +#define BYTE_PTR byte #define OFFSET -#define GLOBL GLOBAL -#define ALIGNTEXT32 ALIGN 32 -#define ALIGNTEXT16 ALIGN 16 -#define ALIGNTEXT8 ALIGN 8 -#define ALIGNTEXT4 ALIGN 4 -#define ALIGNTEXT2 ALIGN 2 -#define ALIGNTEXT32ifNOP ALIGN 32 -#define ALIGNTEXT16ifNOP ALIGN 16 -#define ALIGNTEXT8ifNOP ALIGN 8 -#define ALIGNTEXT4ifNOP ALIGN 4 -#define ALIGNDATA32 ALIGN 32 -#define ALIGNDATA16 ALIGN 16 -#define ALIGNDATA8 ALIGN 8 -#define ALIGNDATA4 ALIGN 4 -#define ALIGNDATA2 ALIGN 2 +#define GLOBL GLOBAL +#define ALIGNTEXT32 ALIGN 32 +#define ALIGNTEXT16 ALIGN 16 +#define ALIGNTEXT8 ALIGN 8 +#define ALIGNTEXT4 ALIGN 4 +#define ALIGNTEXT2 ALIGN 2 +#define ALIGNTEXT32ifNOP ALIGN 32 +#define ALIGNTEXT16ifNOP ALIGN 16 +#define ALIGNTEXT8ifNOP ALIGN 8 +#define ALIGNTEXT4ifNOP ALIGN 4 +#define ALIGNDATA32 ALIGN 32 +#define ALIGNDATA16 ALIGN 16 +#define ALIGNDATA8 ALIGN 8 +#define ALIGNDATA4 ALIGN 4 +#define ALIGNDATA2 ALIGN 2 #define FILE(s) -#define STRING(s) db s -#define D_LONG dd -#define D_WORD dw -#define D_BYTE db +#define STRING(s) db s +#define D_LONG dd +#define D_WORD dw +#define D_BYTE db /* #define SPACE */ /* #define COMM */ #if defined(__WATCOMC__) SECTION _TEXT public align=16 class=CODE use32 flat SECTION _DATA public align=16 class=DATA use32 flat -#define SEG_TEXT SECTION _TEXT -#define SEG_DATA SECTION _DATA -#define SEG_BSS SECTION .bss +#define SEG_TEXT SECTION _TEXT +#define SEG_DATA SECTION _DATA +#define SEG_BSS SECTION .bss #else -#define SEG_DATA SECTION .data -#define SEG_TEXT SECTION .text -#define SEG_BSS SECTION .bss +#define SEG_DATA SECTION .data +#define SEG_TEXT SECTION .text +#define SEG_BSS SECTION .bss #endif -#define D_SPACE(n) db n REP 0 +#define D_SPACE(n) db n REP 0 #define AS_BEGIN -#define NEAR near /* Jcc's should be handled better than this... */ +/* Jcc's should be handled better than this... */ +#define NEAR near #else /* MASM */ -#define TBYTE_PTR tbyte ptr -#define QWORD_PTR qword ptr -#define DWORD_PTR dword ptr -#define WORD_PTR word ptr -#define BYTE_PTR byte ptr - -#define OFFSET offset - -#define GLOBL GLOBAL -#define ALIGNTEXT32 ALIGN 32 -#define ALIGNTEXT16 ALIGN 16 -#define ALIGNTEXT8 ALIGN 8 -#define ALIGNTEXT4 ALIGN 4 -#define ALIGNTEXT2 ALIGN 2 -#define ALIGNTEXT32ifNOP ALIGN 32 -#define ALIGNTEXT16ifNOP ALIGN 16 -#define ALIGNTEXT8ifNOP ALIGN 8 -#define ALIGNTEXT4ifNOP ALIGN 4 -#define ALIGNDATA32 ALIGN 32 -#define ALIGNDATA16 ALIGN 16 -#define ALIGNDATA8 ALIGN 8 -#define ALIGNDATA4 ALIGN 4 -#define ALIGNDATA2 ALIGN 2 +#define TBYTE_PTR tbyte ptr +#define QWORD_PTR qword ptr +#define DWORD_PTR dword ptr +#define WORD_PTR word ptr +#define BYTE_PTR byte ptr + +#define OFFSET offset + +#define GLOBL GLOBAL +#define ALIGNTEXT32 ALIGN 32 +#define ALIGNTEXT16 ALIGN 16 +#define ALIGNTEXT8 ALIGN 8 +#define ALIGNTEXT4 ALIGN 4 +#define ALIGNTEXT2 ALIGN 2 +#define ALIGNTEXT32ifNOP ALIGN 32 +#define ALIGNTEXT16ifNOP ALIGN 16 +#define ALIGNTEXT8ifNOP ALIGN 8 +#define ALIGNTEXT4ifNOP ALIGN 4 +#define ALIGNDATA32 ALIGN 32 +#define ALIGNDATA16 ALIGN 16 +#define ALIGNDATA8 ALIGN 8 +#define ALIGNDATA4 ALIGN 4 +#define ALIGNDATA2 ALIGN 2 #define FILE(s) -#define STRING(s) db s -#define D_LONG dd -#define D_WORD dw -#define D_BYTE db +#define STRING(s) db s +#define D_LONG dd +#define D_WORD dw +#define D_BYTE db /* #define SPACE */ /* #define COMM */ -#define SEG_DATA .DATA -#define SEG_TEXT .CODE -#define SEG_BSS .DATA +#define SEG_DATA .DATA +#define SEG_TEXT .CODE +#define SEG_BSS .DATA -#define D_SPACE(n) db n REP 0 +#define D_SPACE(n) db n REP 0 #define AS_BEGIN @@ -949,521 +954,530 @@ #if defined(Lynx) || (defined(SYSV) || defined(SVR4)) \ || (defined(linux) || defined(__OS2ELF__)) && defined(__ELF__) \ || defined(__FreeBSD__) && __FreeBSD__ >= 3 -#define GLNAME(a) a +#define GLNAME(a) a #else -#define GLNAME(a) _ ## a +#define GLNAME(a) _ ## a #endif /* - * Addressing Modes + * Addressing Modes */ /* Immediate Mode */ -#define P_ADDR(a) OFFSET a -#define X_ADDR(a) OFFSET a -#define D_ADDR(a) OFFSET a -#define L_ADDR(a) OFFSET a -#define W_ADDR(a) OFFSET a -#define B_ADDR(a) OFFSET a - -#define P_CONST(a) a -#define X_CONST(a) a -#define D_CONST(a) a -#define L_CONST(a) a -#define W_CONST(a) a -#define B_CONST(a) a +#define P_ADDR(a) OFFSET a +#define X_ADDR(a) OFFSET a +#define D_ADDR(a) OFFSET a +#define L_ADDR(a) OFFSET a +#define W_ADDR(a) OFFSET a +#define B_ADDR(a) OFFSET a + +#define P_CONST(a) a +#define X_CONST(a) a +#define D_CONST(a) a +#define L_CONST(a) a +#define W_CONST(a) a +#define B_CONST(a) a /* Indirect Mode */ -#define P_CONTENT(a) a -#define X_CONTENT(a) TBYTE_PTR a -#define D_CONTENT(a) QWORD_PTR a -#define L_CONTENT(a) DWORD_PTR a -#define W_CONTENT(a) WORD_PTR a -#define B_CONTENT(a) BYTE_PTR a +#define P_CONTENT(a) a +#define X_CONTENT(a) TBYTE_PTR a +#define D_CONTENT(a) QWORD_PTR a +#define L_CONTENT(a) DWORD_PTR a +#define W_CONTENT(a) WORD_PTR a +#define B_CONTENT(a) BYTE_PTR a /* Register a indirect */ -#define P_REGIND(a) [a] -#define X_REGIND(a) TBYTE_PTR [a] -#define D_REGIND(a) QWORD_PTR [a] -#define L_REGIND(a) DWORD_PTR [a] -#define W_REGIND(a) WORD_PTR [a] -#define B_REGIND(a) BYTE_PTR [a] +#define P_REGIND(a) [a] +#define X_REGIND(a) TBYTE_PTR [a] +#define D_REGIND(a) QWORD_PTR [a] +#define L_REGIND(a) DWORD_PTR [a] +#define W_REGIND(a) WORD_PTR [a] +#define B_REGIND(a) BYTE_PTR [a] /* Register b indirect plus displacement a */ -#define P_REGOFF(a, b) [b + a] -#define X_REGOFF(a, b) TBYTE_PTR [b + a] -#define D_REGOFF(a, b) QWORD_PTR [b + a] -#define L_REGOFF(a, b) DWORD_PTR [b + a] -#define W_REGOFF(a, b) WORD_PTR [b + a] -#define B_REGOFF(a, b) BYTE_PTR [b + a] +#define P_REGOFF(a, b) [b + a] +#define X_REGOFF(a, b) TBYTE_PTR [b + a] +#define D_REGOFF(a, b) QWORD_PTR [b + a] +#define L_REGOFF(a, b) DWORD_PTR [b + a] +#define W_REGOFF(a, b) WORD_PTR [b + a] +#define B_REGOFF(a, b) BYTE_PTR [b + a] /* Reg indirect Base + Index + Displacement - this is mainly for 16-bit mode * which has no scaling */ -#define P_REGBID(b, i, d) [b + i + d] -#define X_REGBID(b, i, d) TBYTE_PTR [b + i + d] -#define D_REGBID(b, i, d) QWORD_PTR [b + i + d] -#define L_REGBID(b, i, d) DWORD_PTR [b + i + d] -#define W_REGBID(b, i, d) WORD_PTR [b + i + d] -#define B_REGBID(b, i, d) BYTE_PTR [b + i + d] +#define P_REGBID(b, i, d) [b + i + d] +#define X_REGBID(b, i, d) TBYTE_PTR [b + i + d] +#define D_REGBID(b, i, d) QWORD_PTR [b + i + d] +#define L_REGBID(b, i, d) DWORD_PTR [b + i + d] +#define W_REGBID(b, i, d) WORD_PTR [b + i + d] +#define B_REGBID(b, i, d) BYTE_PTR [b + i + d] + +/* Reg indirect Base + (Index * Scale) */ +#define P_REGBIS(b, i, s) [b + i * s] +#define X_REGBIS(b, i, s) TBYTE_PTR [b + i * s] +#define D_REGBIS(b, i, s) QWORD_PTR [b + i * s] +#define L_REGBIS(b, i, s) DWORD_PTR [b + i * s] +#define W_REGBIS(b, i, s) WORD_PTR [b + i * s] +#define B_REGBIS(b, i, s) BYTE_PTR [b + i * s] /* Reg indirect Base + (Index * Scale) + Displacement */ -#define P_REGBISD(b, i, s, d) [b + i * s + d] -#define X_REGBISD(b, i, s, d) TBYTE_PTR [b + i * s + d] -#define D_REGBISD(b, i, s, d) QWORD_PTR [b + i * s + d] -#define L_REGBISD(b, i, s, d) DWORD_PTR [b + i * s + d] -#define W_REGBISD(b, i, s, d) WORD_PTR [b + i * s + d] -#define B_REGBISD(b, i, s, d) BYTE_PTR [b + i * s + d] +#define P_REGBISD(b, i, s, d) [b + i * s + d] +#define X_REGBISD(b, i, s, d) TBYTE_PTR [b + i * s + d] +#define D_REGBISD(b, i, s, d) QWORD_PTR [b + i * s + d] +#define L_REGBISD(b, i, s, d) DWORD_PTR [b + i * s + d] +#define W_REGBISD(b, i, s, d) WORD_PTR [b + i * s + d] +#define B_REGBISD(b, i, s, d) BYTE_PTR [b + i * s + d] /* Displaced Scaled Index: */ -#define P_REGDIS(d, i, s) [i * s + d] -#define X_REGDIS(d, i, s) TBYTE_PTR [i * s + d] -#define D_REGDIS(d, i, s) QWORD_PTR [i * s + d] -#define L_REGDIS(d, i, s) DWORD_PTR [i * s + d] -#define W_REGDIS(d, i, s) WORD_PTR [i * s + d] -#define B_REGDIS(d, i, s) BYTE_PTR [i * s + d] +#define P_REGDIS(d, i, s) [i * s + d] +#define X_REGDIS(d, i, s) TBYTE_PTR [i * s + d] +#define D_REGDIS(d, i, s) QWORD_PTR [i * s + d] +#define L_REGDIS(d, i, s) DWORD_PTR [i * s + d] +#define W_REGDIS(d, i, s) WORD_PTR [i * s + d] +#define B_REGDIS(d, i, s) BYTE_PTR [i * s + d] /* Indexed Base: */ -#define P_REGBI(b, i) [b + i] -#define X_REGBI(b, i) TBYTE_PTR [b + i] -#define D_REGBI(b, i) QWORD_PTR [b + i] -#define L_REGBI(b, i) DWORD_PTR [b + i] -#define W_REGBI(b, i) WORD_PTR [b + i] -#define B_REGBI(b, i) BYTE_PTR [b + i] +#define P_REGBI(b, i) [b + i] +#define X_REGBI(b, i) TBYTE_PTR [b + i] +#define D_REGBI(b, i) QWORD_PTR [b + i] +#define L_REGBI(b, i) DWORD_PTR [b + i] +#define W_REGBI(b, i) WORD_PTR [b + i] +#define B_REGBI(b, i) BYTE_PTR [b + i] /* Displaced Base: */ -#define P_REGDB(d, b) [b + d] -#define X_REGDB(d, b) TBYTE_PTR [b + d] -#define D_REGDB(d, b) QWORD_PTR [b + d] -#define L_REGDB(d, b) DWORD_PTR [b + d] -#define W_REGDB(d, b) WORD_PTR [b + d] -#define B_REGDB(d, b) BYTE_PTR [b + d] +#define P_REGDB(d, b) [b + d] +#define X_REGDB(d, b) TBYTE_PTR [b + d] +#define D_REGDB(d, b) QWORD_PTR [b + d] +#define L_REGDB(d, b) DWORD_PTR [b + d] +#define W_REGDB(d, b) WORD_PTR [b + d] +#define B_REGDB(d, b) BYTE_PTR [b + d] /* Variable indirect: */ -#define VARINDIRECT(var) var +#define VARINDIRECT(var) var /* Use register contents as jump/call target: */ -#define CODEPTR(reg) reg +#define CODEPTR(reg) reg /* - * Redefine assembler commands + * Redefine assembler commands */ -#define P_(a) P_ ## a -#define X_(a) X_ ## a -#define D_(a) D_ ## a -#define S_(a) L_ ## a -#define L_(a) L_ ## a -#define W_(a) W_ ## a -#define B_(a) B_ ## a - -#define AAA aaa -#define AAD aad -#define AAM aam -#define AAS aas -#define ADC_L(a, b) adc L_(b), L_(a) -#define ADC_W(a, b) adc W_(b), W_(a) -#define ADC_B(a, b) adc B_(b), B_(a) -#define ADD_L(a, b) add L_(b), L_(a) -#define ADD_W(a, b) add W_(b), W_(a) -#define ADD_B(a, b) add B_(b), B_(a) -#define AND_L(a, b) and L_(b), L_(a) -#define AND_W(a, b) and W_(b), W_(a) -#define AND_B(a, b) and B_(b), B_(a) -#define ARPL(a,b) arpl W_(b), a -#define BOUND_L(a, b) bound L_(b), L_(a) -#define BOUND_W(a, b) bound W_(b), W_(a) -#define BSF_L(a, b) bsf L_(b), L_(a) -#define BSF_W(a, b) bsf W_(b), W_(a) -#define BSR_L(a, b) bsr L_(b), L_(a) -#define BSR_W(a, b) bsr W_(b), W_(a) -#define BT_L(a, b) bt L_(b), L_(a) -#define BT_W(a, b) bt W_(b), W_(a) -#define BTC_L(a, b) btc L_(b), L_(a) -#define BTC_W(a, b) btc W_(b), W_(a) -#define BTR_L(a, b) btr L_(b), L_(a) -#define BTR_W(a, b) btr W_(b), W_(a) -#define BTS_L(a, b) bts L_(b), L_(a) -#define BTS_W(a, b) bts W_(b), W_(a) -#define CALL(a) call a -#define CALLF(s,a) call far s:a -#define CBW cbw -#define CWDE cwde -#define CLC clc -#define CLD cld -#define CLI cli -#define CLTS clts -#define CMC cmc -#define CMP_L(a, b) cmp L_(b), L_(a) -#define CMP_W(a, b) cmp W_(b), W_(a) -#define CMP_B(a, b) cmp B_(b), B_(a) -#define CMPS_L cmpsd -#define CMPS_W cmpsw -#define CMPS_B cmpsb -#define CWD cwd -#define CDQ cdq -#define DAA daa -#define DAS das -#define DEC_L(a) dec L_(a) -#define DEC_W(a) dec W_(a) -#define DEC_B(a) dec B_(a) -#define DIV_L(a) div L_(a) -#define DIV_W(a) div W_(a) -#define DIV_B(a) div B_(a) -#define ENTER(a,b) enter b, a -#define HLT hlt -#define IDIV_L(a) idiv L_(a) -#define IDIV_W(a) idiv W_(a) -#define IDIV_B(a) idiv B_(a) -#define IMUL_L(a, b) imul L_(b), L_(a) -#define IMUL_W(a, b) imul W_(b), W_(a) -#define IMUL_B(a) imul B_(a) -#define IN_L in EAX, DX -#define IN_W in AX, DX -#define IN_B in AL, DX -#define IN1_L(a) in1 L_(a) -#define IN1_W(a) in1 W_(a) -#define IN1_B(a) in1 B_(a) -#define INC_L(a) inc L_(a) -#define INC_W(a) inc W_(a) -#define INC_B(a) inc B_(a) -#define INS_L ins -#define INS_W ins -#define INS_B ins -#define INT(a) int B_(a) -#define INT3 int3 -#define INTO into -#define IRET iret -#define IRETD iretd -#define JA(a) ja NEAR a -#define JAE(a) jae NEAR a -#define JB(a) jb NEAR a -#define JBE(a) jbe NEAR a -#define JC(a) jc NEAR a -#define JE(a) je NEAR a -#define JG(a) jg NEAR a -#define JGE(a) jge NEAR a -#define JL(a) jl NEAR a -#define JLE(a) jle NEAR a -#define JNA(a) jna NEAR a -#define JNAE(a) jnae NEAR a -#define JNB(a) jnb NEAR a -#define JNBE(a) jnbe NEAR a -#define JNC(a) jnc NEAR a -#define JNE(a) jne NEAR a -#define JNG(a) jng NEAR a -#define JNGE(a) jnge NEAR a -#define JNL(a) jnl NEAR a -#define JNLE(a) jnle NEAR a -#define JNO(a) jno NEAR a -#define JNP(a) jnp NEAR a -#define JNS(a) jns NEAR a -#define JNZ(a) jnz NEAR a -#define JO(a) jo NEAR a -#define JP(a) jp NEAR a -#define JPE(a) jpe NEAR a -#define JPO(a) jpo NEAR a -#define JS(a) js NEAR a -#define JZ(a) jz NEAR a -#define JMP(a) jmp a -#define JMPF(s,a) jmpf -#define LAHF lahf -#define LAR(a, b) lar b, a -#define LEA_L(a, b) lea P_(b), P_(a) -#define LEA_W(a, b) lea P_(b), P_(a) -#define LEAVE leave -#define LGDT(a) lgdt a -#define LIDT(a) lidt a -#define LDS(a, b) lds b, a -#define LES(a, b) les b, a -#define LFS(a, b) lfs b, a -#define LGS(a, b) lgs b, a -#define LSS(a, b) lss b, a -#define LLDT(a) lldt a -#define LMSW(a) lmsw a -#define LOCK lock -#define LODS_L lodsd -#define LODS_W lodsw -#define LODS_B lodsb -#define LOOP(a) loop a -#define LOOPE(a) loope a -#define LOOPZ(a) loopz a -#define LOOPNE(a) loopne a -#define LOOPNZ(a) loopnz a -#define LSL(a, b) lsl b, a -#define LTR(a) ltr a -#define MOV_SR(a, b) mov S_(b), S_(a) -#define MOV_L(a, b) mov L_(b), L_(a) -#define MOV_W(a, b) mov W_(b), W_(a) -#define MOV_B(a, b) mov B_(b), B_(a) -#define MOVS_L movsd -#define MOVS_W movsw -#define MOVS_B movsb -#define MOVSX_BL(a, b) movsx B_(b), B_(a) -#define MOVSX_BW(a, b) movsx B_(b), B_(a) -#define MOVSX_WL(a, b) movsx W_(b), W_(a) -#define MOVZX_BL(a, b) movzx B_(b), B_(a) -#define MOVZX_BW(a, b) movzx B_(b), B_(a) -#define MOVZX_WL(a, b) movzx W_(b), W_(a) -#define MUL_L(a) mul L_(a) -#define MUL_W(a) mul W_(a) -#define MUL_B(a) mul B_(a) -#define NEG_L(a) neg L_(a) -#define NEG_W(a) neg W_(a) -#define NEG_B(a) neg B_(a) -#define NOP nop -#define NOT_L(a) not L_(a) -#define NOT_W(a) not W_(a) -#define NOT_B(a) not B_(a) -#define OR_L(a,b) or L_(b), L_(a) -#define OR_W(a,b) or W_(b), W_(a) -#define OR_B(a,b) or B_(b), B_(a) -#define OUT_L out DX, EAX -#define OUT_W out DX, AX -#define OUT_B out DX, AL -#define OUT1_L(a) out1 L_(a) -#define OUT1_W(a) out1 W_(a) -#define OUT1_B(a) out1 B_(a) -#define OUTS_L outsd -#define OUTS_W outsw -#define OUTS_B outsb -#define POP_SR(a) pop S_(a) -#define POP_L(a) pop L_(a) -#define POP_W(a) pop W_(a) -#define POPA_L popad -#define POPA_W popa -#define POPF_L popfd -#define POPF_W popf -#define PUSH_SR(a) push S_(a) -#define PUSH_L(a) push L_(a) -#define PUSH_W(a) push W_(a) -#define PUSH_B(a) push B_(a) -#define PUSHA_L pushad -#define PUSHA_W pusha -#define PUSHF_L pushfd -#define PUSHF_W pushf -#define RCL_L(a, b) rcl L_(b), L_(a) -#define RCL_W(a, b) rcl W_(b), W_(a) -#define RCL_B(a, b) rcl B_(b), B_(a) -#define RCR_L(a, b) rcr L_(b), L_(a) -#define RCR_W(a, b) rcr W_(b), W_(a) -#define RCR_B(a, b) rcr B_(b), B_(a) -#define ROL_L(a, b) rol L_(b), L_(a) -#define ROL_W(a, b) rol W_(b), W_(a) -#define ROL_B(a, b) rol B_(b), B_(a) -#define ROR_L(a, b) ror L_(b), L_(a) -#define ROR_W(a, b) ror W_(b), W_(a) -#define ROR_B(a, b) ror B_(b), B_(a) -#define REP rep -#define REPE repe -#define REPNE repne -#define REPNZ REPNE -#define REPZ REPE -#define RET ret -#define SAHF sahf -#define SAL_L(a, b) sal L_(b), L_(a) -#define SAL_W(a, b) sal W_(b), W_(a) -#define SAL_B(a, b) sal B_(b), B_(a) -#define SAR_L(a, b) sar L_(b), L_(a) -#define SAR_W(a, b) sar W_(b), W_(a) -#define SAR_B(a, b) sar B_(b), B_(a) -#define SBB_L(a, b) sbb L_(b), L_(a) -#define SBB_W(a, b) sbb W_(b), W_(a) -#define SBB_B(a, b) sbb B_(b), B_(a) -#define SCAS_L scas -#define SCAS_W scas -#define SCAS_B scas -#define SETA(a) seta a -#define SETAE(a) setae a -#define SETB(a) setb a -#define SETBE(a) setbe a -#define SETC(a) setc a -#define SETE(a) sete a -#define SETG(a) setg a -#define SETGE(a) setge a -#define SETL(a) setl a -#define SETLE(a) setle a -#define SETNA(a) setna a -#define SETNAE(a) setnae a -#define SETNB(a) setnb a -#define SETNBE(a) setnbe a -#define SETNC(a) setnc a -#define SETNE(a) setne a -#define SETNG(a) setng a -#define SETNGE(a) setnge a -#define SETNL(a) setnl a -#define SETNLE(a) setnle a -#define SETNO(a) setno a -#define SETNP(a) setnp a -#define SETNS(a) setns a -#define SETNZ(a) setnz a -#define SETO(a) seto a -#define SETP(a) setp a -#define SETPE(a) setpe a -#define SETPO(a) setpo a -#define SETS(a) sets a -#define SETZ(a) setz a -#define SGDT(a) sgdt a -#define SIDT(a) sidt a -#define SHL_L(a, b) shl L_(b), L_(a) -#define SHL_W(a, b) shl W_(b), W_(a) -#define SHL_B(a, b) shl B_(b), B_(a) -#define SHLD_L(a,b,c) shld -#define SHLD2_L(a,b) shld L_(b), L_(a) -#define SHLD_W(a,b,c) shld -#define SHLD2_W(a,b) shld W_(b), W_(a) -#define SHR_L(a, b) shr L_(b), L_(a) -#define SHR_W(a, b) shr W_(b), W_(a) -#define SHR_B(a, b) shr B_(b), B_(a) -#define SHRD_L(a,b,c) shrd -#define SHRD2_L(a,b) shrd L_(b), L_(a) -#define SHRD_W(a,b,c) shrd -#define SHRD2_W(a,b) shrd W_(b), W_(a) -#define SLDT(a) sldt a -#define SMSW(a) smsw a -#define STC stc -#define STD std -#define STI sti -#define STOS_L stos -#define STOS_W stos -#define STOS_B stos -#define STR(a) str a -#define SUB_L(a, b) sub L_(b), L_(a) -#define SUB_W(a, b) sub W_(b), W_(a) -#define SUB_B(a, b) sub B_(b), B_(a) -#define TEST_L(a, b) test L_(b), L_(a) -#define TEST_W(a, b) test W_(b), W_(a) -#define TEST_B(a, b) test B_(b), B_(a) -#define VERR(a) verr a -#define VERW(a) verw a -#define WAIT wait -#define XCHG_L(a, b) xchg L_(b), L_(a) -#define XCHG_W(a, b) xchg W_(b), W_(a) -#define XCHG_B(a, b) xchg B_(b), B_(a) -#define XLAT xlat -#define XOR_L(a, b) xor L_(b), L_(a) -#define XOR_W(a, b) xor W_(b), W_(a) -#define XOR_B(a, b) xor B_(b), B_(a) -#define F2XM1 f2xm1 -#define FABS fabs -#define FADD_D(a) fadd D_(a) -#define FADD_S(a) fadd S_(a) -#define FADD2(a, b) fadd b, a -#define FADDP(a, b) faddp b, a -#define FIADD_L(a) fiadd L_(a) -#define FIADD_W(a) fiadd W_(a) -#define FBLD(a) fbld a -#define FBSTP(a) fbstp a -#define FCHS fchs -#define FCLEX fclex -#define FNCLEX fnclex -#define FCOM(a) fcom a -#define FCOM_D(a) fcom D_(a) -#define FCOM_S(a) fcom S_(a) -#define FCOMP(a) fcomp a -#define FCOMP_D(a) fcomp D_(a) -#define FCOMP_S(a) fcomp S_(a) -#define FCOMPP fcompp -#define FCOS fcos -#define FDECSTP fdecstp -#define FDIV_D(a) fdiv D_(a) -#define FDIV_S(a) fdiv S_(a) -#define FDIV2(a, b) fdiv b, a -#define FDIVP(a, b) fdivp b, a -#define FIDIV_L(a) fidiv L_(a) -#define FIDIV_W(a) fidiv W_(a) -#define FDIVR_D(a) fdivr D_(a) -#define FDIVR_S(a) fdivr S_(a) -#define FDIVR2(a, b) fdivr b, a -#define FDIVRP(a, b) fdivrp b, a -#define FIDIVR_L(a) fidivr L_(a) -#define FIDIVR_W(a) fidivr W_(a) -#define FFREE(a) ffree a -#define FICOM_L(a) ficom L_(a) -#define FICOM_W(a) ficom W_(a) -#define FICOMP_L(a) ficomp L_(a) -#define FICOMP_W(a) ficomp W_(a) -#define FILD_Q(a) fild D_(a) -#define FILD_L(a) fild L_(a) -#define FILD_W(a) fild W_(a) -#define FINCSTP fincstp -#define FINIT finit -#define FNINIT fninit -#define FIST_L(a) fist L_(a) -#define FIST_W(a) fist W_(a) -#define FISTP_Q(a) fistp D_(a) -#define FISTP_L(a) fistp L_(a) -#define FISTP_W(a) fistp W_(a) -#define FLD_X(a) fld X_(a) -#define FLD_D(a) fld D_(a) -#define FLD_S(a) fld S_(a) -#define FLD1 fld1 -#define FLDL2T fldl2t -#define FLDL2E fldl2e -#define FLDPI fldpi -#define FLDLG2 fldlg2 -#define FLDLN2 fldln2 -#define FLDZ fldz -#define FLDCW(a) fldcw a -#define FLDENV(a) fldenv a -#define FMUL_S(a) fmul S_(a) -#define FMUL_D(a) fmul D_(a) -#define FMUL2(a, b) fmul b, a -#define FMULP(a, b) fmulp b, a -#define FIMUL_L(a) fimul L_(a) -#define FIMUL_W(a) fimul W_(a) -#define FNOP fnop -#define FPATAN fpatan -#define FPREM fprem -#define FPREM1 fprem1 -#define FPTAN fptan -#define FRNDINT frndint -#define FRSTOR(a) frstor a -#define FSAVE(a) fsave a -#define FNSAVE(a) fnsave a -#define FSCALE fscale -#define FSIN fsin -#define FSINCOS fsincos -#define FSQRT fsqrt -#define FST_D(a) fst D_(a) -#define FST_S(a) fst S_(a) -#define FSTP_X(a) fstp X_(a) -#define FSTP_D(a) fstp D_(a) -#define FSTP_S(a) fstp S_(a) -#define FSTP(a) fstp a -#define FSTCW(a) fstcw a -#define FNSTCW(a) fnstcw a -#define FSTENV(a) fstenv a -#define FNSTENV(a) fnstenv a -#define FSTSW(a) fstsw a -#define FNSTSW(a) fnstsw a -#define FSUB_S(a) fsub S_(a) -#define FSUB_D(a) fsub D_(a) -#define FSUB2(a, b) fsub b, a -#define FSUBP(a, b) fsubp b, a -#define FISUB_L(a) fisub L_(a) -#define FISUB_W(a) fisub W_(a) -#define FSUBR_S(a) fsubr S_(a) -#define FSUBR_D(a) fsubr D_(a) -#define FSUBR2(a, b) fsubr b, a -#define FSUBRP(a, b) fsubrp b, a -#define FISUBR_L(a) fisubr L_(a) -#define FISUBR_W(a) fisubr W_(a) -#define FTST ftst -#define FUCOM(a) fucom a -#define FUCOMP(a) fucomp a -#define FUCOMPP fucompp -#define FWAIT fwait -#define FXAM fxam -#define FXCH(a) fxch a -#define FXTRACT fxtract -#define FYL2X fyl2x -#define FYL2XP1 fyl2xp1 +#define P_(a) P_ ## a +#define X_(a) X_ ## a +#define D_(a) D_ ## a +#define S_(a) L_ ## a +#define L_(a) L_ ## a +#define W_(a) W_ ## a +#define B_(a) B_ ## a + +#define AAA aaa +#define AAD aad +#define AAM aam +#define AAS aas +#define ADC_L(a, b) adc L_(b), L_(a) +#define ADC_W(a, b) adc W_(b), W_(a) +#define ADC_B(a, b) adc B_(b), B_(a) +#define ADD_L(a, b) add L_(b), L_(a) +#define ADD_W(a, b) add W_(b), W_(a) +#define ADD_B(a, b) add B_(b), B_(a) +#define AND_L(a, b) and L_(b), L_(a) +#define AND_W(a, b) and W_(b), W_(a) +#define AND_B(a, b) and B_(b), B_(a) +#define ARPL(a,b) arpl W_(b), a +#define BOUND_L(a, b) bound L_(b), L_(a) +#define BOUND_W(a, b) bound W_(b), W_(a) +#define BSF_L(a, b) bsf L_(b), L_(a) +#define BSF_W(a, b) bsf W_(b), W_(a) +#define BSR_L(a, b) bsr L_(b), L_(a) +#define BSR_W(a, b) bsr W_(b), W_(a) +#define BT_L(a, b) bt L_(b), L_(a) +#define BT_W(a, b) bt W_(b), W_(a) +#define BTC_L(a, b) btc L_(b), L_(a) +#define BTC_W(a, b) btc W_(b), W_(a) +#define BTR_L(a, b) btr L_(b), L_(a) +#define BTR_W(a, b) btr W_(b), W_(a) +#define BTS_L(a, b) bts L_(b), L_(a) +#define BTS_W(a, b) bts W_(b), W_(a) +#define CALL(a) call a +#define CALLF(s,a) call far s:a +#define CBW cbw +#define CWDE cwde +#define CLC clc +#define CLD cld +#define CLI cli +#define CLTS clts +#define CMC cmc +#define CMP_L(a, b) cmp L_(b), L_(a) +#define CMP_W(a, b) cmp W_(b), W_(a) +#define CMP_B(a, b) cmp B_(b), B_(a) +#define CMPS_L cmpsd +#define CMPS_W cmpsw +#define CMPS_B cmpsb +#define CPUID cpuid +#define CWD cwd +#define CDQ cdq +#define DAA daa +#define DAS das +#define DEC_L(a) dec L_(a) +#define DEC_W(a) dec W_(a) +#define DEC_B(a) dec B_(a) +#define DIV_L(a) div L_(a) +#define DIV_W(a) div W_(a) +#define DIV_B(a) div B_(a) +#define ENTER(a,b) enter b, a +#define HLT hlt +#define IDIV_L(a) idiv L_(a) +#define IDIV_W(a) idiv W_(a) +#define IDIV_B(a) idiv B_(a) +#define IMUL_L(a, b) imul L_(b), L_(a) +#define IMUL_W(a, b) imul W_(b), W_(a) +#define IMUL_B(a) imul B_(a) +#define IN_L in EAX, DX +#define IN_W in AX, DX +#define IN_B in AL, DX +#define IN1_L(a) in1 L_(a) +#define IN1_W(a) in1 W_(a) +#define IN1_B(a) in1 B_(a) +#define INC_L(a) inc L_(a) +#define INC_W(a) inc W_(a) +#define INC_B(a) inc B_(a) +#define INS_L ins +#define INS_W ins +#define INS_B ins +#define INT(a) int B_(a) +#define INT3 int3 +#define INTO into +#define IRET iret +#define IRETD iretd +#define JA(a) ja NEAR a +#define JAE(a) jae NEAR a +#define JB(a) jb NEAR a +#define JBE(a) jbe NEAR a +#define JC(a) jc NEAR a +#define JE(a) je NEAR a +#define JG(a) jg NEAR a +#define JGE(a) jge NEAR a +#define JL(a) jl NEAR a +#define JLE(a) jle NEAR a +#define JNA(a) jna NEAR a +#define JNAE(a) jnae NEAR a +#define JNB(a) jnb NEAR a +#define JNBE(a) jnbe NEAR a +#define JNC(a) jnc NEAR a +#define JNE(a) jne NEAR a +#define JNG(a) jng NEAR a +#define JNGE(a) jnge NEAR a +#define JNL(a) jnl NEAR a +#define JNLE(a) jnle NEAR a +#define JNO(a) jno NEAR a +#define JNP(a) jnp NEAR a +#define JNS(a) jns NEAR a +#define JNZ(a) jnz NEAR a +#define JO(a) jo NEAR a +#define JP(a) jp NEAR a +#define JPE(a) jpe NEAR a +#define JPO(a) jpo NEAR a +#define JS(a) js NEAR a +#define JZ(a) jz NEAR a +#define JMP(a) jmp a +#define JMPF(s,a) jmpf +#define LAHF lahf +#define LAR(a, b) lar b, a +#define LEA_L(a, b) lea P_(b), P_(a) +#define LEA_W(a, b) lea P_(b), P_(a) +#define LEAVE leave +#define LGDT(a) lgdt a +#define LIDT(a) lidt a +#define LDS(a, b) lds b, a +#define LES(a, b) les b, a +#define LFS(a, b) lfs b, a +#define LGS(a, b) lgs b, a +#define LSS(a, b) lss b, a +#define LLDT(a) lldt a +#define LMSW(a) lmsw a +#define LOCK lock +#define LODS_L lodsd +#define LODS_W lodsw +#define LODS_B lodsb +#define LOOP(a) loop a +#define LOOPE(a) loope a +#define LOOPZ(a) loopz a +#define LOOPNE(a) loopne a +#define LOOPNZ(a) loopnz a +#define LSL(a, b) lsl b, a +#define LTR(a) ltr a +#define MOV_SR(a, b) mov S_(b), S_(a) +#define MOV_L(a, b) mov L_(b), L_(a) +#define MOV_W(a, b) mov W_(b), W_(a) +#define MOV_B(a, b) mov B_(b), B_(a) +#define MOVS_L movsd +#define MOVS_W movsw +#define MOVS_B movsb +#define MOVSX_BL(a, b) movsx B_(b), B_(a) +#define MOVSX_BW(a, b) movsx B_(b), B_(a) +#define MOVSX_WL(a, b) movsx W_(b), W_(a) +#define MOVZX_BL(a, b) movzx B_(b), B_(a) +#define MOVZX_BW(a, b) movzx B_(b), B_(a) +#define MOVZX_WL(a, b) movzx W_(b), W_(a) +#define MUL_L(a) mul L_(a) +#define MUL_W(a) mul W_(a) +#define MUL_B(a) mul B_(a) +#define NEG_L(a) neg L_(a) +#define NEG_W(a) neg W_(a) +#define NEG_B(a) neg B_(a) +#define NOP nop +#define NOT_L(a) not L_(a) +#define NOT_W(a) not W_(a) +#define NOT_B(a) not B_(a) +#define OR_L(a,b) or L_(b), L_(a) +#define OR_W(a,b) or W_(b), W_(a) +#define OR_B(a,b) or B_(b), B_(a) +#define OUT_L out DX, EAX +#define OUT_W out DX, AX +#define OUT_B out DX, AL +#define OUT1_L(a) out1 L_(a) +#define OUT1_W(a) out1 W_(a) +#define OUT1_B(a) out1 B_(a) +#define OUTS_L outsd +#define OUTS_W outsw +#define OUTS_B outsb +#define POP_SR(a) pop S_(a) +#define POP_L(a) pop L_(a) +#define POP_W(a) pop W_(a) +#define POPA_L popad +#define POPA_W popa +#define POPF_L popfd +#define POPF_W popf +#define PUSH_SR(a) push S_(a) +#define PUSH_L(a) push L_(a) +#define PUSH_W(a) push W_(a) +#define PUSH_B(a) push B_(a) +#define PUSHA_L pushad +#define PUSHA_W pusha +#define PUSHF_L pushfd +#define PUSHF_W pushf +#define RCL_L(a, b) rcl L_(b), L_(a) +#define RCL_W(a, b) rcl W_(b), W_(a) +#define RCL_B(a, b) rcl B_(b), B_(a) +#define RCR_L(a, b) rcr L_(b), L_(a) +#define RCR_W(a, b) rcr W_(b), W_(a) +#define RCR_B(a, b) rcr B_(b), B_(a) +#define RDTSC rdtsc +#define ROL_L(a, b) rol L_(b), L_(a) +#define ROL_W(a, b) rol W_(b), W_(a) +#define ROL_B(a, b) rol B_(b), B_(a) +#define ROR_L(a, b) ror L_(b), L_(a) +#define ROR_W(a, b) ror W_(b), W_(a) +#define ROR_B(a, b) ror B_(b), B_(a) +#define REP rep +#define REPE repe +#define REPNE repne +#define REPNZ REPNE +#define REPZ REPE +#define RET ret +#define SAHF sahf +#define SAL_L(a, b) sal L_(b), L_(a) +#define SAL_W(a, b) sal W_(b), W_(a) +#define SAL_B(a, b) sal B_(b), B_(a) +#define SAR_L(a, b) sar L_(b), L_(a) +#define SAR_W(a, b) sar W_(b), W_(a) +#define SAR_B(a, b) sar B_(b), B_(a) +#define SBB_L(a, b) sbb L_(b), L_(a) +#define SBB_W(a, b) sbb W_(b), W_(a) +#define SBB_B(a, b) sbb B_(b), B_(a) +#define SCAS_L scas +#define SCAS_W scas +#define SCAS_B scas +#define SETA(a) seta a +#define SETAE(a) setae a +#define SETB(a) setb a +#define SETBE(a) setbe a +#define SETC(a) setc a +#define SETE(a) sete a +#define SETG(a) setg a +#define SETGE(a) setge a +#define SETL(a) setl a +#define SETLE(a) setle a +#define SETNA(a) setna a +#define SETNAE(a) setnae a +#define SETNB(a) setnb a +#define SETNBE(a) setnbe a +#define SETNC(a) setnc a +#define SETNE(a) setne a +#define SETNG(a) setng a +#define SETNGE(a) setnge a +#define SETNL(a) setnl a +#define SETNLE(a) setnle a +#define SETNO(a) setno a +#define SETNP(a) setnp a +#define SETNS(a) setns a +#define SETNZ(a) setnz a +#define SETO(a) seto a +#define SETP(a) setp a +#define SETPE(a) setpe a +#define SETPO(a) setpo a +#define SETS(a) sets a +#define SETZ(a) setz a +#define SGDT(a) sgdt a +#define SIDT(a) sidt a +#define SHL_L(a, b) shl L_(b), L_(a) +#define SHL_W(a, b) shl W_(b), W_(a) +#define SHL_B(a, b) shl B_(b), B_(a) +#define SHLD_L(a,b,c) shld +#define SHLD2_L(a,b) shld L_(b), L_(a) +#define SHLD_W(a,b,c) shld +#define SHLD2_W(a,b) shld W_(b), W_(a) +#define SHR_L(a, b) shr L_(b), L_(a) +#define SHR_W(a, b) shr W_(b), W_(a) +#define SHR_B(a, b) shr B_(b), B_(a) +#define SHRD_L(a,b,c) shrd +#define SHRD2_L(a,b) shrd L_(b), L_(a) +#define SHRD_W(a,b,c) shrd +#define SHRD2_W(a,b) shrd W_(b), W_(a) +#define SLDT(a) sldt a +#define SMSW(a) smsw a +#define STC stc +#define STD std +#define STI sti +#define STOS_L stos +#define STOS_W stos +#define STOS_B stos +#define STR(a) str a +#define SUB_L(a, b) sub L_(b), L_(a) +#define SUB_W(a, b) sub W_(b), W_(a) +#define SUB_B(a, b) sub B_(b), B_(a) +#define TEST_L(a, b) test L_(b), L_(a) +#define TEST_W(a, b) test W_(b), W_(a) +#define TEST_B(a, b) test B_(b), B_(a) +#define VERR(a) verr a +#define VERW(a) verw a +#define WAIT wait +#define XCHG_L(a, b) xchg L_(b), L_(a) +#define XCHG_W(a, b) xchg W_(b), W_(a) +#define XCHG_B(a, b) xchg B_(b), B_(a) +#define XLAT xlat +#define XOR_L(a, b) xor L_(b), L_(a) +#define XOR_W(a, b) xor W_(b), W_(a) +#define XOR_B(a, b) xor B_(b), B_(a) -/* New instructions */ -#define CPUID D_BYTE 15, 162 -#define RDTSC D_BYTE 15, 49 +/* Floating Point Instructions */ +#define F2XM1 f2xm1 +#define FABS fabs +#define FADD_D(a) fadd D_(a) +#define FADD_S(a) fadd S_(a) +#define FADD2(a, b) fadd b, a +#define FADDP(a, b) faddp b, a +#define FIADD_L(a) fiadd L_(a) +#define FIADD_W(a) fiadd W_(a) +#define FBLD(a) fbld a +#define FBSTP(a) fbstp a +#define FCHS fchs +#define FCLEX fclex +#define FNCLEX fnclex +#define FCOM(a) fcom a +#define FCOM_D(a) fcom D_(a) +#define FCOM_S(a) fcom S_(a) +#define FCOMP(a) fcomp a +#define FCOMP_D(a) fcomp D_(a) +#define FCOMP_S(a) fcomp S_(a) +#define FCOMPP fcompp +#define FCOS fcos +#define FDECSTP fdecstp +#define FDIV_D(a) fdiv D_(a) +#define FDIV_S(a) fdiv S_(a) +#define FDIV2(a, b) fdiv b, a +#define FDIVP(a, b) fdivp b, a +#define FIDIV_L(a) fidiv L_(a) +#define FIDIV_W(a) fidiv W_(a) +#define FDIVR_D(a) fdivr D_(a) +#define FDIVR_S(a) fdivr S_(a) +#define FDIVR2(a, b) fdivr b, a +#define FDIVRP(a, b) fdivrp b, a +#define FIDIVR_L(a) fidivr L_(a) +#define FIDIVR_W(a) fidivr W_(a) +#define FFREE(a) ffree a +#define FICOM_L(a) ficom L_(a) +#define FICOM_W(a) ficom W_(a) +#define FICOMP_L(a) ficomp L_(a) +#define FICOMP_W(a) ficomp W_(a) +#define FILD_Q(a) fild D_(a) +#define FILD_L(a) fild L_(a) +#define FILD_W(a) fild W_(a) +#define FINCSTP fincstp +#define FINIT finit +#define FNINIT fninit +#define FIST_L(a) fist L_(a) +#define FIST_W(a) fist W_(a) +#define FISTP_Q(a) fistp D_(a) +#define FISTP_L(a) fistp L_(a) +#define FISTP_W(a) fistp W_(a) +#define FLD_X(a) fld X_(a) +#define FLD_D(a) fld D_(a) +#define FLD_S(a) fld S_(a) +#define FLD1 fld1 +#define FLDL2T fldl2t +#define FLDL2E fldl2e +#define FLDPI fldpi +#define FLDLG2 fldlg2 +#define FLDLN2 fldln2 +#define FLDZ fldz +#define FLDCW(a) fldcw a +#define FLDENV(a) fldenv a +#define FMUL_S(a) fmul S_(a) +#define FMUL_D(a) fmul D_(a) +#define FMUL2(a, b) fmul b, a +#define FMULP(a, b) fmulp b, a +#define FIMUL_L(a) fimul L_(a) +#define FIMUL_W(a) fimul W_(a) +#define FNOP fnop +#define FPATAN fpatan +#define FPREM fprem +#define FPREM1 fprem1 +#define FPTAN fptan +#define FRNDINT frndint +#define FRSTOR(a) frstor a +#define FSAVE(a) fsave a +#define FNSAVE(a) fnsave a +#define FSCALE fscale +#define FSIN fsin +#define FSINCOS fsincos +#define FSQRT fsqrt +#define FST_D(a) fst D_(a) +#define FST_S(a) fst S_(a) +#define FSTP_X(a) fstp X_(a) +#define FSTP_D(a) fstp D_(a) +#define FSTP_S(a) fstp S_(a) +#define FSTP(a) fstp a +#define FSTCW(a) fstcw a +#define FNSTCW(a) fnstcw a +#define FSTENV(a) fstenv a +#define FNSTENV(a) fnstenv a +#define FSTSW(a) fstsw a +#define FNSTSW(a) fnstsw a +#define FSUB_S(a) fsub S_(a) +#define FSUB_D(a) fsub D_(a) +#define FSUB2(a, b) fsub b, a +#define FSUBP(a, b) fsubp b, a +#define FISUB_L(a) fisub L_(a) +#define FISUB_W(a) fisub W_(a) +#define FSUBR_S(a) fsubr S_(a) +#define FSUBR_D(a) fsubr D_(a) +#define FSUBR2(a, b) fsubr b, a +#define FSUBRP(a, b) fsubrp b, a +#define FISUBR_L(a) fisubr L_(a) +#define FISUBR_W(a) fisubr W_(a) +#define FTST ftst +#define FUCOM(a) fucom a +#define FUCOMP(a) fucomp a +#define FUCOMPP fucompp +#define FWAIT fwait +#define FXAM fxam +#define FXCH(a) fxch a +#define FXTRACT fxtract +#define FYL2X fyl2x +#define FYL2XP1 fyl2xp1 + #endif /* NASM_ASSEMBLER, MASM_ASSEMBLER */ /****************************************/ @@ -1474,182 +1488,188 @@ /****************************************/ #if defined(NASM_ASSEMBLER) || defined(MASM_ASSEMBLER) -#define P_ARG1(a) P_ ## a -#define P_ARG2(a, b) P_ ## b, P_ ## a -#define P_ARG3(a, b, c) P_ ## c, P_ ## b, P_ ## a +#define P_ARG1(a) P_ ## a +#define P_ARG2(a, b) P_ ## b, P_ ## a +#define P_ARG3(a, b, c) P_ ## c, P_ ## b, P_ ## a #else -#define P_ARG1(a) a -#define P_ARG2(a, b) a, b -#define P_ARG3(a, b, c) a, b, c +#define P_ARG1(a) a +#define P_ARG2(a, b) a, b +#define P_ARG3(a, b, c) a, b, c #endif /* MMX */ -#define MOVD(a, b) movd P_ARG2(a, b) -#define MOVQ(a, b) movq P_ARG2(a, b) +#define MOVD(a, b) movd P_ARG2(a, b) +#define MOVQ(a, b) movq P_ARG2(a, b) -#define PADDB(a, b) paddb P_ARG2(a, b) -#define PADDW(a, b) paddw P_ARG2(a, b) -#define PADDD(a, b) paddd P_ARG2(a, b) +#define PADDB(a, b) paddb P_ARG2(a, b) +#define PADDW(a, b) paddw P_ARG2(a, b) +#define PADDD(a, b) paddd P_ARG2(a, b) -#define PADDSB(a, b) paddsb P_ARG2(a, b) -#define PADDSW(a, b) paddsw P_ARG2(a, b) +#define PADDSB(a, b) paddsb P_ARG2(a, b) +#define PADDSW(a, b) paddsw P_ARG2(a, b) -#define PADDUSB(a, b) paddusb P_ARG2(a, b) -#define PADDUSW(a, b) paddusw P_ARG2(a, b) +#define PADDUSB(a, b) paddusb P_ARG2(a, b) +#define PADDUSW(a, b) paddusw P_ARG2(a, b) -#define PSUBB(a, b) psubb P_ARG2(a, b) -#define PSUBW(a, b) psubw P_ARG2(a, b) -#define PSUBD(a, b) psubd P_ARG2(a, b) +#define PSUBB(a, b) psubb P_ARG2(a, b) +#define PSUBW(a, b) psubw P_ARG2(a, b) +#define PSUBD(a, b) psubd P_ARG2(a, b) -#define PSUBSB(a, b) psubsb P_ARG2(a, b) -#define PSUBSW(a, b) psubsw P_ARG2(a, b) +#define PSUBSB(a, b) psubsb P_ARG2(a, b) +#define PSUBSW(a, b) psubsw P_ARG2(a, b) -#define PSUBUSB(a, b) psubusb P_ARG2(a, b) -#define PSUBUSW(a, b) psubusw P_ARG2(a, b) +#define PSUBUSB(a, b) psubusb P_ARG2(a, b) +#define PSUBUSW(a, b) psubusw P_ARG2(a, b) -#define PCMPEQB(a, b) pcmpeqb P_ARG2(a, b) -#define PCMPEQW(a, b) pcmpeqw P_ARG2(a, b) -#define PCMPEQD(a, b) pcmpeqd P_ARG2(a, b) +#define PCMPEQB(a, b) pcmpeqb P_ARG2(a, b) +#define PCMPEQW(a, b) pcmpeqw P_ARG2(a, b) +#define PCMPEQD(a, b) pcmpeqd P_ARG2(a, b) -#define PCMPGTB(a, b) pcmpgtb P_ARG2(a, b) -#define PCMPGTW(a, b) pcmpgtw P_ARG2(a, b) -#define PCMPGTD(a, b) pcmpgtd P_ARG2(a, b) +#define PCMPGTB(a, b) pcmpgtb P_ARG2(a, b) +#define PCMPGTW(a, b) pcmpgtw P_ARG2(a, b) +#define PCMPGTD(a, b) pcmpgtd P_ARG2(a, b) -#define PMULHW(a, b) pmulhw P_ARG2(a, b) -#define PMULLW(a, b) pmullw P_ARG2(a, b) +#define PMULHW(a, b) pmulhw P_ARG2(a, b) +#define PMULLW(a, b) pmullw P_ARG2(a, b) -#define PMADDWD(a, b) pmaddwd P_ARG2(a, b) +#define PMADDWD(a, b) pmaddwd P_ARG2(a, b) -#define PAND(a, b) pand P_ARG2(a, b) +#define PAND(a, b) pand P_ARG2(a, b) -#define PANDN(a, b) pandn P_ARG2(a, b) +#define PANDN(a, b) pandn P_ARG2(a, b) -#define POR(a, b) por P_ARG2(a, b) +#define POR(a, b) por P_ARG2(a, b) -#define PXOR(a, b) pxor P_ARG2(a, b) +#define PXOR(a, b) pxor P_ARG2(a, b) -#define PSRAW(a, b) psraw P_ARG2(a, b) -#define PSRAD(a, b) psrad P_ARG2(a, b) +#define PSRAW(a, b) psraw P_ARG2(a, b) +#define PSRAD(a, b) psrad P_ARG2(a, b) -#define PSRLW(a, b) psrlw P_ARG2(a, b) -#define PSRLD(a, b) psrld P_ARG2(a, b) -#define PSRLQ(a, b) psrlq P_ARG2(a, b) +#define PSRLW(a, b) psrlw P_ARG2(a, b) +#define PSRLD(a, b) psrld P_ARG2(a, b) +#define PSRLQ(a, b) psrlq P_ARG2(a, b) -#define PSLLW(a, b) psllw P_ARG2(a, b) -#define PSLLD(a, b) pslld P_ARG2(a, b) -#define PSLLQ(a, b) psllq P_ARG2(a, b) +#define PSLLW(a, b) psllw P_ARG2(a, b) +#define PSLLD(a, b) pslld P_ARG2(a, b) +#define PSLLQ(a, b) psllq P_ARG2(a, b) -#define PACKSSWB(a, b) packsswb P_ARG2(a, b) -#define PACKSSDW(a, b) packssdw P_ARG2(a, b) -#define PACKUSWB(a, b) packuswb P_ARG2(a, b) +#define PACKSSWB(a, b) packsswb P_ARG2(a, b) +#define PACKSSDW(a, b) packssdw P_ARG2(a, b) +#define PACKUSWB(a, b) packuswb P_ARG2(a, b) -#define PUNPCKHBW(a, b) punpckhbw P_ARG2(a, b) -#define PUNPCKHWD(a, b) punpckhwd P_ARG2(a, b) -#define PUNPCKHDQ(a, b) punpckhdq P_ARG2(a, b) -#define PUNPCKLBW(a, b) punpcklbw P_ARG2(a, b) -#define PUNPCKLWD(a, b) punpcklwd P_ARG2(a, b) -#define PUNPCKLDQ(a, b) punpckldq P_ARG2(a, b) +#define PUNPCKHBW(a, b) punpckhbw P_ARG2(a, b) +#define PUNPCKHWD(a, b) punpckhwd P_ARG2(a, b) +#define PUNPCKHDQ(a, b) punpckhdq P_ARG2(a, b) +#define PUNPCKLBW(a, b) punpcklbw P_ARG2(a, b) +#define PUNPCKLWD(a, b) punpcklwd P_ARG2(a, b) +#define PUNPCKLDQ(a, b) punpckldq P_ARG2(a, b) -#define EMMS emms +#define EMMS emms /* AMD 3DNow! */ -#define PAVGUSB(a, b) pavgusb P_ARG2(a, b) -#define PFADD(a, b) pfadd P_ARG2(a, b) -#define PFSUB(a, b) pfsub P_ARG2(a, b) -#define PFSUBR(a, b) pfsubr P_ARG2(a, b) -#define PFACC(a, b) pfacc P_ARG2(a, b) -#define PFCMPGE(a, b) pfcmpge P_ARG2(a, b) -#define PFCMPGT(a, b) pfcmpgt P_ARG2(a, b) -#define PFCMPEQ(a, b) pfcmpeq P_ARG2(a, b) -#define PFMIN(a, b) pfmin P_ARG2(a, b) -#define PFMAX(a, b) pfmax P_ARG2(a, b) -#define PI2FD(a, b) pi2fd P_ARG2(a, b) -#define PF2ID(a, b) pf2id P_ARG2(a, b) -#define PFRCP(a, b) pfrcp P_ARG2(a, b) -#define PFRSQRT(a, b) pfrsqrt P_ARG2(a, b) -#define PFMUL(a, b) pfmul P_ARG2(a, b) -#define PFRCPIT1(a, b) pfrcpit1 P_ARG2(a, b) -#define PFRSQIT1(a, b) pfrsqit1 P_ARG2(a, b) -#define PFRCPIT2(a, b) pfrcpit2 P_ARG2(a, b) -#define PMULHRW(a, b) pmulhrw P_ARG2(a, b) - -#define FEMMS femms -#define PREFETCH(a) prefetch P_ARG1(a) -#define PREFETCHW(a) prefetchw P_ARG1(a) +#define PAVGUSB(a, b) pavgusb P_ARG2(a, b) +#define PFADD(a, b) pfadd P_ARG2(a, b) +#define PFSUB(a, b) pfsub P_ARG2(a, b) +#define PFSUBR(a, b) pfsubr P_ARG2(a, b) +#define PFACC(a, b) pfacc P_ARG2(a, b) +#define PFCMPGE(a, b) pfcmpge P_ARG2(a, b) +#define PFCMPGT(a, b) pfcmpgt P_ARG2(a, b) +#define PFCMPEQ(a, b) pfcmpeq P_ARG2(a, b) +#define PFMIN(a, b) pfmin P_ARG2(a, b) +#define PFMAX(a, b) pfmax P_ARG2(a, b) +#define PI2FD(a, b) pi2fd P_ARG2(a, b) +#define PF2ID(a, b) pf2id P_ARG2(a, b) +#define PFRCP(a, b) pfrcp P_ARG2(a, b) +#define PFRSQRT(a, b) pfrsqrt P_ARG2(a, b) +#define PFMUL(a, b) pfmul P_ARG2(a, b) +#define PFRCPIT1(a, b) pfrcpit1 P_ARG2(a, b) +#define PFRSQIT1(a, b) pfrsqit1 P_ARG2(a, b) +#define PFRCPIT2(a, b) pfrcpit2 P_ARG2(a, b) +#define PMULHRW(a, b) pmulhrw P_ARG2(a, b) + +#define FEMMS femms +#define PREFETCH(a) prefetch P_ARG1(a) +#define PREFETCHW(a) prefetchw P_ARG1(a) /* Intel SSE */ -#define ADDPS(a, b) addps P_ARG2(a, b) -#define ADDSS(a, b) addss P_ARG2(a, b) -#define ANDNPS(a, b) andnps P_ARG2(a, b) -#define ANDPS(a, b) andps P_ARG2(a, b) -/* - NASM only knows the pseudo ops for these. - #define CMPPS(a, b, c) cmpps P_ARG3(a, b, c) - #define CMPSS(a, b, c) cmpss P_ARG3(a, b, c) +#define ADDPS(a, b) addps P_ARG2(a, b) +#define ADDSS(a, b) addss P_ARG2(a, b) +#define ANDNPS(a, b) andnps P_ARG2(a, b) +#define ANDPS(a, b) andps P_ARG2(a, b) +/* NASM only knows the pseudo ops for these. +#define CMPPS(a, b, c) cmpps P_ARG3(a, b, c) +#define CMPSS(a, b, c) cmpss P_ARG3(a, b, c) */ -#define CMPEQPS(a, b) cmpeqps P_ARG2(a, b) -#define CMPLTPS(a, b) cmpltps P_ARG2(a, b) -#define CMPLEPS(a, b) cmpleps P_ARG2(a, b) +#define CMPEQPS(a, b) cmpeqps P_ARG2(a, b) +#define CMPLTPS(a, b) cmpltps P_ARG2(a, b) +#define CMPLEPS(a, b) cmpleps P_ARG2(a, b) #define CMPUNORDPS(a, b) cmpunordps P_ARG2(a, b) -#define CMPNEQPS(a, b) cmpneqps P_ARG2(a, b) -#define CMPNLTPS(a, b) cmpnltps P_ARG2(a, b) -#define CMPNLEPS(a, b) cmpnleps P_ARG2(a, b) -#define CMPORDPS(a, b) cmpordps P_ARG2(a, b) -#define CMPEQSS(a, b) cmpeqss P_ARG2(a, b) -#define CMPLTSS(a, b) cmpltss P_ARG2(a, b) -#define CMPLESS(a, b) cmpless P_ARG2(a, b) +#define CMPNEQPS(a, b) cmpneqps P_ARG2(a, b) +#define CMPNLTPS(a, b) cmpnltps P_ARG2(a, b) +#define CMPNLEPS(a, b) cmpnleps P_ARG2(a, b) +#define CMPORDPS(a, b) cmpordps P_ARG2(a, b) +#define CMPEQSS(a, b) cmpeqss P_ARG2(a, b) +#define CMPLTSS(a, b) cmpltss P_ARG2(a, b) +#define CMPLESS(a, b) cmpless P_ARG2(a, b) #define CMPUNORDSS(a, b) cmpunordss P_ARG2(a, b) -#define CMPNEQSS(a, b) cmpneqss P_ARG2(a, b) -#define CMPNLTSS(a, b) cmpnltss P_ARG2(a, b) -#define CMPNLESS(a, b) cmpnless P_ARG2(a, b) -#define CMPORDSS(a, b) cmpordss P_ARG2(a, b) -#define COMISS(a, b) comiss P_ARG2(a, b) -#define CVTPI2PS(a, b) cvtpi2ps P_ARG2(a, b) -#define CVTPS2PI(a, b) cvtps2pi P_ARG2(a, b) -#define CVTSI2SS(a, b) cvtsi2ss P_ARG2(a, b) -#define CVTSS2SI(a, b) cvtss2si P_ARG2(a, b) -#define CVTTPS2PI(a, b) cvttps2pi P_ARG2(a, b) -#define CVTTSS2SI(a, b) cvttss2si P_ARG2(a, b) -#define DIVPS(a, b) divps P_ARG2(a, b) -#define DIVSS(a, b) divss P_ARG2(a, b) -#define FXRSTOR(a) fxrstor P_ARG1(a) -#define FXSAVE(a) fxsave P_ARG1(a) -#define LDMXCSR(a) ldmxcsr P_ARG1(a) -#define MAXPS(a, b) maxps P_ARG2(a, b) -#define MAXSS(a, b) maxss P_ARG2(a, b) -#define MINPS(a, b) minps P_ARG2(a, b) -#define MINSS(a, b) minss P_ARG2(a, b) -#define MOVAPS(a, b) movaps P_ARG2(a, b) -#define MOVHLPS(a, b) movhlps P_ARG2(a, b) -#define MOVHPS(a, b) movhps P_ARG2(a, b) -#define MOVLHPS(a, b) movlhps P_ARG2(a, b) -#define MOVLPS(a, b) movlps P_ARG2(a, b) -#define MOVMSKPS(a, b) movmskps P_ARG2(a, b) -#define MOVSS(a, b) movss P_ARG2(a, b) -#define MOVUPS(a, b) movups P_ARG2(a, b) -#define MULPS(a, b) mulps P_ARG2(a, b) -#define MULSS(a, b) mulss P_ARG2(a, b) -#define ORPS(a, b) orps P_ARG2(a, b) -#define RCPPS(a, b) rcpps P_ARG2(a, b) -#define RCPSS(a, b) rcpss P_ARG2(a, b) -#define RSQRTPS(a, b) rsqrtps P_ARG2(a, b) -#define RSQRTSS(a, b) rsqrtss P_ARG2(a, b) -#define SHUFPS(a, b, c) shufps P_ARG3(a, b, c) -#define SQRTPS(a, b) sqrtps P_ARG2(a, b) -#define SQRTSS(a, b) sqrtss P_ARG2(a, b) -#define STMXCSR(a) stmxcsr P_ARG1(a) -#define SUBPS(a, b) subps P_ARG2(a, b) -#define UCOMISS(a, b) ucomiss P_ARG2(a, b) -#define UNPCKHPS(a, b) unpckhps P_ARG2(a, b) -#define UNPCKLPS(a, b) unpcklps P_ARG2(a, b) -#define XORPS(a, b) xorps P_ARG2(a, b) - +#define CMPNEQSS(a, b) cmpneqss P_ARG2(a, b) +#define CMPNLTSS(a, b) cmpnltss P_ARG2(a, b) +#define CMPNLESS(a, b) cmpnless P_ARG2(a, b) +#define CMPORDSS(a, b) cmpordss P_ARG2(a, b) +#define COMISS(a, b) comiss P_ARG2(a, b) +#define CVTPI2PS(a, b) cvtpi2ps P_ARG2(a, b) +#define CVTPS2PI(a, b) cvtps2pi P_ARG2(a, b) +#define CVTSI2SS(a, b) cvtsi2ss P_ARG2(a, b) +#define CVTSS2SI(a, b) cvtss2si P_ARG2(a, b) +#define CVTTPS2PI(a, b) cvttps2pi P_ARG2(a, b) +#define CVTTSS2SI(a, b) cvttss2si P_ARG2(a, b) +#define DIVPS(a, b) divps P_ARG2(a, b) +#define DIVSS(a, b) divss P_ARG2(a, b) +#define FXRSTOR(a) fxrstor P_ARG1(a) +#define FXSAVE(a) fxsave P_ARG1(a) +#define LDMXCSR(a) ldmxcsr P_ARG1(a) +#define MAXPS(a, b) maxps P_ARG2(a, b) +#define MAXSS(a, b) maxss P_ARG2(a, b) +#define MINPS(a, b) minps P_ARG2(a, b) +#define MINSS(a, b) minss P_ARG2(a, b) +#define MOVAPS(a, b) movaps P_ARG2(a, b) +#define MOVHLPS(a, b) movhlps P_ARG2(a, b) +#define MOVHPS(a, b) movhps P_ARG2(a, b) +#define MOVLHPS(a, b) movlhps P_ARG2(a, b) +#define MOVLPS(a, b) movlps P_ARG2(a, b) +#define MOVMSKPS(a, b) movmskps P_ARG2(a, b) +#define MOVNTPS(a, b) movntps P_ARG2(a, b) +#define MOVNTQ(a, b) movntq P_ARG2(a, b) +#define MOVSS(a, b) movss P_ARG2(a, b) +#define MOVUPS(a, b) movups P_ARG2(a, b) +#define MULPS(a, b) mulps P_ARG2(a, b) +#define MULSS(a, b) mulss P_ARG2(a, b) +#define ORPS(a, b) orps P_ARG2(a, b) +#define RCPPS(a, b) rcpps P_ARG2(a, b) +#define RCPSS(a, b) rcpss P_ARG2(a, b) +#define RSQRTPS(a, b) rsqrtps P_ARG2(a, b) +#define RSQRTSS(a, b) rsqrtss P_ARG2(a, b) +#define SHUFPS(a, b, c) shufps P_ARG3(a, b, c) +#define SQRTPS(a, b) sqrtps P_ARG2(a, b) +#define SQRTSS(a, b) sqrtss P_ARG2(a, b) +#define STMXCSR(a) stmxcsr P_ARG1(a) +#define SUBPS(a, b) subps P_ARG2(a, b) +#define UCOMISS(a, b) ucomiss P_ARG2(a, b) +#define UNPCKHPS(a, b) unpckhps P_ARG2(a, b) +#define UNPCKLPS(a, b) unpcklps P_ARG2(a, b) +#define XORPS(a, b) xorps P_ARG2(a, b) + +#define PREFETCHNTA(a) prefetchnta P_ARG1(a) +#define PREFETCHT0(a) prefetcht0 P_ARG1(a) +#define PREFETCHT1(a) prefetcht1 P_ARG1(a) +#define PREFETCHT2(a) prefetcht2 P_ARG1(a) +#define SFENCE sfence /* Added by BrianP for FreeBSD (per David Dawes) */ #if !defined(NASM_ASSEMBLER) && !defined(MASM_ASSEMBLER) && !defined(__bsdi__) -#define LLBL(a) CONCAT(.L,a) +#define LLBL(a) CONCAT(.L,a) #else -#define LLBL(a) a +#define LLBL(a) a #endif Index: xc/extras/Mesa/src/X86/clip_args.h diff -u /dev/null xc/extras/Mesa/src/X86/clip_args.h:1.2 --- /dev/null Mon Dec 18 14:21:57 2000 +++ xc/extras/Mesa/src/X86/clip_args.h Mon Nov 13 18:31:10 2000 @@ -0,0 +1,75 @@ + +/* + * Mesa 3-D graphics library + * Version: 3.4 + * + * Copyright (C) 1999-2000 Brian Paul All Rights Reserved. + * + * 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 + * BRIAN PAUL 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. + */ + +/* + * Clip test function interface for assembly code. Simply define + * FRAME_OFFSET to the number of bytes pushed onto the stack before + * using the ARG_* argument macros. + * + * Gareth Hughes + */ + +#ifndef __CLIP_ARGS_H__ +#define __CLIP_ARGS_H__ + +/* Offsets into GLvector4f + */ +#define V4F_DATA 0 +#define V4F_START 4 +#define V4F_COUNT 8 +#define V4F_STRIDE 12 +#define V4F_SIZE 16 +#define V4F_FLAGS 20 + +/* GLvector4f flags + */ +#define VEC_SIZE_1 1 +#define VEC_SIZE_2 3 +#define VEC_SIZE_3 7 +#define VEC_SIZE_4 15 + +/* + * Offsets for clip_func arguments + * + * typedef GLvector4f *(*clip_func)( GLvector4f *vClip, + * GLvector4f *vProj, + * GLubyte clipMask[], + * GLubyte *orMask, + * GLubyte *andMask ); + */ + +#define OFFSET_SOURCE 4 +#define OFFSET_DEST 8 +#define OFFSET_CLIP 12 +#define OFFSET_OR 16 +#define OFFSET_AND 20 + +#define ARG_SOURCE REGOFF(FRAME_OFFSET+OFFSET_SOURCE, ESP) +#define ARG_DEST REGOFF(FRAME_OFFSET+OFFSET_DEST, ESP) +#define ARG_CLIP REGOFF(FRAME_OFFSET+OFFSET_CLIP, ESP) +#define ARG_OR REGOFF(FRAME_OFFSET+OFFSET_OR, ESP) +#define ARG_AND REGOFF(FRAME_OFFSET+OFFSET_AND, ESP) + +#endif Index: xc/extras/Mesa/src/X86/common_x86.c diff -u xc/extras/Mesa/src/X86/common_x86.c:1.3 xc/extras/Mesa/src/X86/common_x86.c:1.7 --- xc/extras/Mesa/src/X86/common_x86.c:1.3 Tue Feb 15 02:13:19 2000 +++ xc/extras/Mesa/src/X86/common_x86.c Thu Dec 7 15:26:00 2000 @@ -1,20 +1,20 @@ /* * Mesa 3-D graphics library - * Version: 3.3 - * + * Version: 3.4 + * * Copyright (C) 1999-2000 Brian Paul All Rights Reserved. - * + * * 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 @@ -25,81 +25,289 @@ /* - * Check CPU capabilities & initialize optimized funtions for this particular - * processor. + * Check CPU capabilities & initialize optimized funtions for this particular + * processor. * - * Written by Holger Waechtler - * Changed by Andre Werthmann for using the - * new Katmai functions + * Written by Holger Waechtler + * Changed by Andre Werthmann for using the + * new Katmai functions. */ #include #include -#include "common_x86asm.h" +#if defined(USE_KATMAI_ASM) && defined(__linux__) && defined(_POSIX_SOURCE) +#include +#endif +#include "context.h" +#include "common_x86_asm.h" + + int gl_x86_cpu_features = 0; + +/* No reason for this to be public. + */ +extern int gl_identify_x86_cpu_features( void ); + -static void message(const char *msg) +static void message( const char *msg ) { - if (getenv("MESA_DEBUG")) - fprintf(stderr, "%s\n", msg); + GLboolean debug; +#ifdef DEBUG + debug = GL_TRUE; +#else + if ( getenv( "MESA_DEBUG" ) ) { + debug = GL_TRUE; + } else { + debug = GL_FALSE; + } +#endif + if ( debug ) { + fprintf( stderr, "%s", msg ); + } } +#if defined(USE_KATMAI_ASM) +/* + * We must verify that the Streaming SIMD Extensions are truly supported + * on this processor before we go ahead and hook out the optimized code. + * Unfortunately, the CPUID bit isn't enough, as the OS must set the + * OSFXSR bit in CR4 if it supports the extended FPU save and restore + * required to use SSE. Unfortunately, we can't just go ahead and read + * this register, as only the kernel can do that. Similarly, we must + * verify that the OSXMMEXCPT bit in CR4 has been set by the OS, + * signifying that it supports unmasked SIMD FPU exceptions. If we take + * an unmasked exception and the OS doesn't correctly support them, the + * best we'll get is a SIGILL and the worst we'll get is an infinite + * loop in the signal delivery from the kernel as we can't interact with + * the SIMD FPU state to clear the exception bits. Either way, this is + * not good. + */ -void gl_init_all_x86_asm (void) +extern void gl_test_os_katmai_support( void ); +extern void gl_test_os_katmai_exception_support( void ); + +#if defined(__linux__) && defined(_POSIX_SOURCE) +static void sigill_handler( int signal, struct sigcontext sc ) { + message( "SIGILL, " ); + + /* Both the "xorps %%xmm0,%%xmm0" and "divps %xmm0,%%xmm1" + * instructions are 3 bytes long. We must increment the instruction + * pointer manually to avoid repeated execution of the offending + * instruction. + * + * If the SIGILL is caused by a divide-by-zero when unmasked + * exceptions aren't supported, the SIMD FPU status and control + * word will be restored at the end of the test, so we don't need + * to worry about doing it here. Besides, we may not be able to... + */ + sc.eip += 3; + + gl_x86_cpu_features &= ~(X86_FEATURE_XMM); +} + +static void sigfpe_handler( int signal, struct sigcontext sc ) +{ + message( "SIGFPE, " ); + + if ( sc.fpstate->magic != 0xffff ) { + /* Our signal context has the extended FPU state, so reset the + * divide-by-zero exception mask and clear the divide-by-zero + * exception bit. + */ + sc.fpstate->mxcsr |= 0x00000200; + sc.fpstate->mxcsr &= 0xfffffffb; + } else { + /* If we ever get here, we're completely hosed. + */ + message( "\n\n" ); + gl_problem( NULL, "SSE enabling test failed badly!" ); + } +} +#endif /* __linux__ && _POSIX_SOURCE */ + +/* If we're running on a processor that can do SSE, let's see if we + * are allowed to or not. This will catch 2.4.0 or later kernels that + * haven't been configured for a Pentium III but are running on one, + * and RedHat patched 2.2 kernels that have broken exception handling + * support for user space apps that do SSE. + * + * GH: Isn't this just awful? + */ +static void check_os_katmai_support( void ) +{ +#if defined(__linux__) +#if defined(_POSIX_SOURCE) + struct sigaction saved_sigill; + struct sigaction saved_sigfpe; + + /* Save the original signal handlers. + */ + sigaction( SIGILL, NULL, &saved_sigill ); + sigaction( SIGFPE, NULL, &saved_sigfpe ); + + signal( SIGILL, (void (*)(int))sigill_handler ); + signal( SIGFPE, (void (*)(int))sigfpe_handler ); + + /* Emulate test for OSFXSR in CR4. The OS will set this bit if it + * supports the extended FPU save and restore required for SSE. If + * we execute an SSE instruction on a PIII and get a SIGILL, the OS + * doesn't support Streaming SIMD Exceptions, even if the processor + * does. + */ + if ( cpu_has_xmm ) { + message( "Testing OS support for SSE... " ); + + gl_test_os_katmai_support(); + + if ( cpu_has_xmm ) { + message( "yes.\n" ); + } else { + message( "no!\n" ); + } + } + + /* Emulate test for OSXMMEXCPT in CR4. The OS will set this bit if + * it supports unmasked SIMD FPU exceptions. If we unmask the + * exceptions, do a SIMD divide-by-zero and get a SIGILL, the OS + * doesn't support unmasked SIMD FPU exceptions. If we get a SIGFPE + * as expected, we're okay but we need to clean up after it. + * + * Are we being too stringent in our requirement that the OS support + * unmasked exceptions? Certain RedHat 2.2 kernels enable SSE by + * setting CR4.OSFXSR but don't support unmasked exceptions. Win98 + * doesn't even support them. We at least know the user-space SSE + * support is good in kernels that do support unmasked exceptions, + * and therefore to be safe I'm going to leave this test in here. + */ + if ( cpu_has_xmm ) { + message( "Testing OS support for SSE unmasked exceptions... " ); + + gl_test_os_katmai_exception_support(); + + if ( cpu_has_xmm ) { + message( "yes.\n" ); + } else { + message( "no!\n" ); + } + } + + /* Restore the original signal handlers. + */ + sigaction( SIGILL, &saved_sigill, NULL ); + sigaction( SIGFPE, &saved_sigfpe, NULL ); + + /* If we've gotten to here and the XMM CPUID bit is still set, we're + * safe to go ahead and hook out the SSE code throughout Mesa. + */ + if ( cpu_has_xmm ) { + message( "Tests of OS support for SSE passed.\n" ); + } else { + message( "Tests of OS support for SSE failed!\n" ); + } +#else + /* We can't use POSIX signal handling to test the availability of + * SSE, so we disable it by default. + */ + message( "Cannot test OS support for SSE, disabling to be safe.\n" ); + gl_x86_cpu_features &= ~(X86_FEATURE_XMM); +#endif /* _POSIX_SOURCE */ +#else + /* Do nothing on non-Linux platforms for now. + */ + message( "Not testing OS support for SSE, leaving enabled.\n" ); +#endif /* __linux__ */ +} + +#endif /* USE_KATMAI_ASM */ + + +void gl_init_all_x86_transform_asm( void ) +{ #ifdef USE_X86_ASM - gl_x86_cpu_features = gl_identify_x86_cpu_features (); - gl_x86_cpu_features |= GL_CPU_AnyX86; + gl_x86_cpu_features = gl_identify_x86_cpu_features(); - if (getenv("MESA_NO_ASM") != 0) + if ( getenv( "MESA_NO_ASM" ) ) { gl_x86_cpu_features = 0; - - if (gl_x86_cpu_features & GL_CPU_GenuineIntel) { - message("GenuineIntel cpu detected."); } - if (gl_x86_cpu_features) { - gl_init_x86_asm_transforms (); + if ( gl_x86_cpu_features ) { + gl_init_x86_transform_asm(); } #ifdef USE_MMX_ASM - if (gl_x86_cpu_features & GL_CPU_MMX) { - char *s = getenv( "MESA_NO_MMX" ); - if (s == NULL) { - message("MMX cpu detected."); + if ( cpu_has_mmx ) { + if ( getenv( "MESA_NO_MMX" ) == 0 ) { + message( "MMX cpu detected.\n" ); } else { - gl_x86_cpu_features &= (~GL_CPU_MMX); + gl_x86_cpu_features &= ~(X86_FEATURE_MMX); } } #endif - #ifdef USE_3DNOW_ASM - if (gl_x86_cpu_features & GL_CPU_3Dnow) { - char *s = getenv( "MESA_NO_3DNOW" ); - if (s == NULL) { - message("3Dnow cpu detected."); - gl_init_3dnow_asm_transforms (); + if ( cpu_has_3dnow ) { + if ( getenv( "MESA_NO_3DNOW" ) == 0 ) { + message( "3DNow! cpu detected.\n" ); + gl_init_3dnow_transform_asm(); } else { - gl_x86_cpu_features &= (~GL_CPU_3Dnow); + gl_x86_cpu_features &= ~(X86_FEATURE_3DNOW); } } #endif - #ifdef USE_KATMAI_ASM - if (gl_x86_cpu_features & GL_CPU_Katmai) { - char *s = getenv( "MESA_NO_KATMAI" ); - if (s == NULL) { - message("Katmai cpu detected."); - gl_init_katmai_asm_transforms (); + if ( cpu_has_xmm && getenv( "MESA_FORCE_KATMAI" ) == 0 ) { + check_os_katmai_support(); + } + if ( cpu_has_xmm ) { + if ( getenv( "MESA_NO_KATMAI" ) == 0 ) { + message( "Katmai cpu detected.\n" ); + gl_init_katmai_transform_asm(); } else { - gl_x86_cpu_features &= (~GL_CPU_Katmai); + gl_x86_cpu_features &= ~(X86_FEATURE_XMM); } } #endif +#endif +} + +/* Note: the above function must be called before this one, so that + * gl_x86_cpu_features gets correctly initialized. + */ +void gl_init_all_x86_shade_asm( void ) +{ +#ifdef USE_X86_ASM + if ( gl_x86_cpu_features ) { + /* Nothing here yet... */ + } +#ifdef USE_3DNOW_ASM + if ( cpu_has_3dnow && getenv( "MESA_NO_3DNOW" ) == 0 ) { + gl_init_3dnow_shade_asm(); + } +#endif #endif } +void gl_init_all_x86_vertex_asm( void ) +{ +#ifdef USE_X86_ASM + if ( gl_x86_cpu_features ) { + gl_init_x86_vertex_asm(); + } + +#ifdef USE_3DNOW_ASM + if ( cpu_has_3dnow && getenv( "MESA_NO_3DNOW" ) == 0 ) { + gl_init_3dnow_vertex_asm(); + } +#endif + +#ifdef USE_KATMAI_ASM + if ( cpu_has_xmm && getenv( "MESA_NO_KATMAI" ) == 0 ) { + gl_init_katmai_vertex_asm(); + } +#endif +#endif +} Index: xc/extras/Mesa/src/X86/common_x86_asm.S diff -u /dev/null xc/extras/Mesa/src/X86/common_x86_asm.S:1.5 --- /dev/null Mon Dec 18 14:21:57 2000 +++ xc/extras/Mesa/src/X86/common_x86_asm.S Tue Dec 12 18:52:37 2000 @@ -0,0 +1,210 @@ + +/* + * Mesa 3-D graphics library + * Version: 3.4 + * + * Copyright (C) 1999-2000 Brian Paul All Rights Reserved. + * + * 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 + * BRIAN PAUL 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. + */ + +/* + * Check extended CPU capabilities. Now justs returns the raw CPUID + * feature information, allowing the higher level code to interpret the + * results. + * + * Written by Holger Waechtler + * + * Cleaned up and simplified by Gareth Hughes + */ +/* $XFree86: xc/extras/Mesa/src/X86/common_x86_asm.S,v 1.5 2000/12/12 23:52:37 dawes Exp $ */ + +#include "assyntax.h" +#include "common_x86_features.h" + + +/* Intel vendor string + */ +#define GENU 0x756e6547 /* "Genu" */ +#define INEI 0x49656e69 /* "ineI" */ +#define NTEL 0x6c65746e /* "ntel" */ + +/* AMD vendor string + */ +#define AUTH 0x68747541 /* "Auth" */ +#define ENTI 0x69746e65 /* "enti" */ +#define CAMD 0x444d4163 /* "cAMD" */ + + + SEG_DATA + +/* We might want to print out some useful messages. + */ +GLNAME( found_intel ): STRING( "Genuine Intel processor found\n\0" ) +GLNAME( found_amd ): STRING( "Authentic AMD processor found\n\0" ) + +#ifdef USE_KATMAI_ASM +GLNAME( katmai_test_dummy ): + D_LONG 0x3f800000, 0x3f800000, 0x3f800000, 0x3f800000 +#endif + + + SEG_TEXT + +ALIGNTEXT4 +GLOBL GLNAME( gl_identify_x86_cpu_features ) +GLNAME( gl_identify_x86_cpu_features ): + + PUSH_L ( EBX ) + + /* Test for the CPUID command. If the ID Flag bit in EFLAGS + * (bit 21) is writable, the CPUID command is present. + */ + PUSHF_L + POP_L ( EAX ) + MOV_L ( EAX, ECX ) + XOR_L ( CONST(0x00200000), EAX ) + PUSH_L ( EAX ) + POPF_L + PUSHF_L + POP_L ( EAX ) + + /* Verify the ID Flag bit has been written. + */ + CMP_L ( ECX, EAX ) + JZ ( LLBL ( cpuid_done ) ) + + /* Get the CPU vendor info. + */ + XOR_L ( EAX, EAX ) + CPUID + + /* Test for Intel processors. We must look for the + * "GenuineIntel" string in EBX, ECX and EDX. + */ + CMP_L ( CONST(GENU), EBX ) + JNE ( LLBL( cpuid_amd ) ) + CMP_L ( CONST(INEI), EDX ) + JNE ( LLBL( cpuid_amd ) ) + CMP_L ( CONST(NTEL), ECX ) + JNE ( LLBL( cpuid_amd ) ) + + /* We have an Intel processor, so we can get the feature + * information with an CPUID input value of 1. + */ + MOV_L ( CONST(0x1), EAX ) + CPUID + MOV_L ( EDX, EAX ) + JMP ( LLBL( cpuid_done ) ) + +LLBL( cpuid_amd ): + + /* Test for AMD processors. We must look for the + * "AuthenticAMD" string in EBX, ECX and EDX. + */ + CMP_L ( CONST(AUTH), EBX ) + JNE ( LLBL( cpuid_other ) ) + CMP_L ( CONST(ENTI), EDX ) + JNE ( LLBL( cpuid_other ) ) + CMP_L ( CONST(CAMD), ECX ) + JNE ( LLBL( cpuid_other ) ) + + /* We have an AMD processor, so we can get the feature + * information after we verify that the extended functions are + * supported. + */ + MOV_L ( CONST(0x80000000), EAX ) + CPUID + TEST_L ( EAX, EAX ) + JZ ( LLBL ( cpuid_failed ) ) + + MOV_L ( CONST(0x80000001), EAX ) + CPUID + MOV_L ( EDX, EAX ) + JMP ( LLBL ( cpuid_done ) ) + +LLBL( cpuid_other ): + + /* Test for other processors here when required. + */ + +LLBL( cpuid_failed ): + + /* If we can't determine the feature information, we must + * return zero to indicate that no platform-specific + * optimizations can be used. + */ + MOV_L ( CONST(0), EAX ) + +LLBL ( cpuid_done ): + + POP_L ( EBX ) + RET + + +#ifdef USE_KATMAI_ASM +/* Execute an SSE instruction to see if the operating system correctly + * supports SSE. A signal handler for SIGILL should have been set + * before calling this function, otherwise this could kill the client + * application. + */ +ALIGNTEXT4 +GLOBL GLNAME( gl_test_os_katmai_support ) +GLNAME( gl_test_os_katmai_support ): + + XORPS ( XMM0, XMM0 ) + + RET + + +/* Perform an SSE divide-by-zero to see if the operating system + * correctly supports unmasked SIMD FPU exceptions. Signal handlers for + * SIGILL and SIGFPE should have been set before calling this function, + * otherwise this could kill the client application. + */ +ALIGNTEXT4 +GLOBL GLNAME( gl_test_os_katmai_exception_support ) +GLNAME( gl_test_os_katmai_exception_support ): + + PUSH_L ( EBP ) + MOV_L ( ESP, EBP ) + SUB_L ( CONST( 8 ), ESP ) + + /* Save the original MXCSR register value. + */ + STMXCSR ( REGOFF( -4, EBP ) ) + + /* Unmask the divide-by-zero exception and perform one. + */ + STMXCSR ( REGOFF( -8, EBP ) ) + AND_L ( CONST( 0xfffffdff ), REGOFF( -8, EBP ) ) + LDMXCSR ( REGOFF( -8, EBP ) ) + + XORPS ( XMM0, XMM0 ) + MOVUPS ( GLNAME( katmai_test_dummy ), XMM1 ) + + DIVPS ( XMM0, XMM1 ) + + /* Restore the original MXCSR register value. + */ + LDMXCSR ( REGOFF( -4, EBP ) ) + + LEAVE + RET + +#endif Index: xc/extras/Mesa/src/X86/common_x86_asm.h diff -u /dev/null xc/extras/Mesa/src/X86/common_x86_asm.h:1.3 --- /dev/null Mon Dec 18 14:21:57 2000 +++ xc/extras/Mesa/src/X86/common_x86_asm.h Thu Nov 30 10:39:21 2000 @@ -0,0 +1,63 @@ + +/* + * Mesa 3-D graphics library + * Version: 3.4 + * + * Copyright (C) 1999 Brian Paul All Rights Reserved. + * + * 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 + * BRIAN PAUL 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. + */ + +/* + * Check CPU capabilities & initialize optimized funtions for this particular + * processor. + * + * Written by Holger Waechtler + * Changed by Andre Werthmann for using the + * new Katmai functions + * + * Reimplemented by Gareth Hughes in a more + * future-proof manner, based on code in the Linux kernel. + */ + +#ifndef __COMMON_X86_ASM_H__ +#define __COMMON_X86_ASM_H__ + +#include "common_x86_features.h" + +#ifdef HAVE_CONFIG_H +#include "conf.h" +#endif + +#ifdef USE_X86_ASM +#include "x86.h" +#ifdef USE_3DNOW_ASM +#include "3dnow.h" +#endif +#ifdef USE_KATMAI_ASM +#include "katmai.h" +#endif +#endif + +extern int gl_x86_cpu_features; + +extern void gl_init_all_x86_transform_asm( void ); +extern void gl_init_all_x86_shade_asm( void ); +extern void gl_init_all_x86_vertex_asm( void ); + +#endif Index: xc/extras/Mesa/src/X86/common_x86_features.h diff -u /dev/null xc/extras/Mesa/src/X86/common_x86_features.h:1.2 --- /dev/null Mon Dec 18 14:21:57 2000 +++ xc/extras/Mesa/src/X86/common_x86_features.h Mon Nov 13 18:31:11 2000 @@ -0,0 +1,76 @@ + +/* + * Mesa 3-D graphics library + * Version: 3.4 + * + * Copyright (C) 1999 Brian Paul All Rights Reserved. + * + * 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 + * BRIAN PAUL 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. + */ + +/* + * x86 CPUID feature information. The raw data is returned by + * gl_identify_x86_cpu_features() and interpreted with the cpu_has_* + * helper macros. + * + * Gareth Hughes + */ + +#ifndef __COMMON_X86_FEATURES_H__ +#define __COMMON_X86_FEATURES_H__ + +/* Capabilities of CPUs + */ +#define X86_FEATURE_FPU 0x00000001 +#define X86_FEATURE_VME 0x00000002 +#define X86_FEATURE_DE 0x00000004 +#define X86_FEATURE_PSE 0x00000008 +#define X86_FEATURE_TSC 0x00000010 +#define X86_FEATURE_MSR 0x00000020 +#define X86_FEATURE_PAE 0x00000040 +#define X86_FEATURE_MCE 0x00000080 +#define X86_FEATURE_CX8 0x00000100 +#define X86_FEATURE_APIC 0x00000200 +#define X86_FEATURE_10 0x00000400 +#define X86_FEATURE_SEP 0x00000800 +#define X86_FEATURE_MTRR 0x00001000 +#define X86_FEATURE_PGE 0x00002000 +#define X86_FEATURE_MCA 0x00004000 +#define X86_FEATURE_CMOV 0x00008000 +#define X86_FEATURE_PAT 0x00010000 +#define X86_FEATURE_PSE36 0x00020000 +#define X86_FEATURE_18 0x00040000 +#define X86_FEATURE_19 0x00080000 +#define X86_FEATURE_20 0x00100000 +#define X86_FEATURE_21 0x00200000 +#define X86_FEATURE_MMXEXT 0x00400000 +#define X86_FEATURE_MMX 0x00800000 +#define X86_FEATURE_FXSR 0x01000000 +#define X86_FEATURE_XMM 0x02000000 +#define X86_FEATURE_26 0x04000000 +#define X86_FEATURE_27 0x08000000 +#define X86_FEATURE_28 0x10000000 +#define X86_FEATURE_29 0x20000000 +#define X86_FEATURE_3DNOWEXT 0x40000000 +#define X86_FEATURE_3DNOW 0x80000000 + +#define cpu_has_mmx (gl_x86_cpu_features & X86_FEATURE_MMX) +#define cpu_has_xmm (gl_x86_cpu_features & X86_FEATURE_XMM) +#define cpu_has_3dnow (gl_x86_cpu_features & X86_FEATURE_3DNOW) + +#endif Index: xc/extras/Mesa/src/X86/common_x86asm.S diff -u xc/extras/Mesa/src/X86/common_x86asm.S:1.3 xc/extras/Mesa/src/X86/common_x86asm.S:removed --- xc/extras/Mesa/src/X86/common_x86asm.S:1.3 Fri Jun 16 20:02:41 2000 +++ xc/extras/Mesa/src/X86/common_x86asm.S Mon Dec 18 14:21:57 2000 @@ -1,130 +0,0 @@ -/* - * Mesa 3-D graphics library - * Version: 3.3 - * - * Copyright (C) 1999-2000 Brian Paul All Rights Reserved. - * - * 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 - * BRIAN PAUL 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. - */ - -/* - * Check extended CPU capabilities. - * - * Written by Holger Waechtler - */ - - - - -#include "assyntax.h" - - SEG_TEXT - - -#define GL_CPU_GenuineIntel CONST(1) -#define GL_CPU_MMX CONST(2) -#define GL_CPU_3Dnow CONST(4) -#define GL_CPU_Katmai CONST(8) - - -GLOBL GLNAME(gl_identify_x86_cpu_features) - ALIGNTEXT4 -GLNAME(gl_identify_x86_cpu_features): - - PUSH_L ( EBX ) - PUSH_L ( ESI ) - XOR_L ( ESI, ESI ) - - PUSHF_L /* test for the cpuid command */ - POP_L ( EAX ) /* (if the ID-Bit (Bit 21) in */ - MOV_L ( EAX, EBX ) /* EEFLAGS is writable, the */ - XOR_L ( CONST(0x00200000), EAX ) /* cpuid command is present) */ - PUSH_L ( EAX ) - POPF_L - PUSHF_L - POP_L ( EAX ) - CMP_L ( EBX, EAX ) - JZ ( LLBL ( Gidcpu_end ) ) /* cpuid command not supported */ - - XOR_L ( EAX, EAX ) - CPUID - - -LLBL (Gidcpu_intel): - CMP_L ( CONST(0x756e6547), EBX ) /* compare */ - JNE ( LLBL ( Gidcpu_amd ) ) /* vendor string == 'GenuineIntel' ? */ - CMP_L ( CONST(0x49656e69), EDX ) - JNE ( LLBL ( Gidcpu_amd ) ) - CMP_L ( CONST(0x6c65746e), ECX ) - JNE ( LLBL ( Gidcpu_amd ) ) - OR_L ( GL_CPU_GenuineIntel, ESI ) - JMP ( LLBL ( Gidcpu_katmai ) ) - - -LLBL ( Gidcpu_amd ): - CMP_L ( CONST(0x68747541), EBX ) /* compare vendor string == 'Auth'? */ - JNE ( LLBL ( Gidcpu_other ) ) - CMP_L ( CONST(0x69746e65), EDX ) /* 'enti' */ - JNE ( LLBL ( Gidcpu_other ) ) - CMP_L ( CONST(0x444d4163), ECX ) /* 'cAMD' (= 'AuthenticAMD') */ - JE ( LLBL ( Gidcpu_3dnow ) ) - - -LLBL ( Gidcpu_other ): - -/* insert here other vendorstrings with 3dnow capable cpu vendors */ - -JMP ( LLBL ( Gidcpu_mmx ) ) - -LLBL ( Gidcpu_katmai ): - MOV_L ( CONST(0x1), EAX ) - CPUID /* test for Katmai */ - TEST_L ( CONST(0x002000000), EDX ) /* is Bit 25 set ? */ - JZ ( LLBL ( Gidcpu_mmx ) ) /* streaming SIMD-extensions not found... */ - OR_L ( GL_CPU_Katmai, ESI ) /* Katmai detected ! :) */ - JMP ( LLBL ( Gidcpu_mmx ) ) /* check for mmx */ - -LLBL ( Gidcpu_3dnow ): - MOV_L ( CONST(0x80000000), EAX ) /* extended functions supported ? */ - - CPUID - TEST_L ( EAX, EAX ) - JZ ( LLBL ( Gidcpu_end ) ) - - MOV_L ( CONST(0x80000001), EAX ) - CPUID /* test for 3Dnow! */ - TEST_L ( CONST(0x80000000), EDX ) - JZ ( LLBL ( Gidcpu_mmx ) ) - OR_L ( GL_CPU_3Dnow, ESI ) /* (detected 3Dnow! extension) */ - -LLBL ( Gidcpu_mmx ): - MOV_L ( CONST(0x1), EAX ) - CPUID - TEST_L ( CONST(0x00800000), EDX ) /* Bit 23 set ? */ - JZ ( LLBL ( Gidcpu_end ) ) - OR_L ( GL_CPU_MMX, ESI ) /* (detected mmx extension) */ - - -LLBL ( Gidcpu_end ): - MOV_L ( ESI, EAX ) - STC - POP_L ( ESI ) - POP_L ( EBX ) - - RET - Index: xc/extras/Mesa/src/X86/common_x86asm.h diff -u xc/extras/Mesa/src/X86/common_x86asm.h:1.2 xc/extras/Mesa/src/X86/common_x86asm.h:removed --- xc/extras/Mesa/src/X86/common_x86asm.h:1.2 Tue Feb 8 12:18:17 2000 +++ xc/extras/Mesa/src/X86/common_x86asm.h Mon Dec 18 14:21:57 2000 @@ -1,62 +0,0 @@ - -/* - * Mesa 3-D graphics library - * Version: 3.1 - * - * Copyright (C) 1999 Brian Paul All Rights Reserved. - * - * 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 - * BRIAN PAUL 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. - */ - - -/* - * Check CPU capabilities & initialize optimized funtions for this particular - * processor. - * - * Written by Holger Waechtler - * Changed by Andre Werthmann for using the - * new Katmai functions - */ -#ifndef _common_3dnow_h -#define _common_3dnow_h - -#define GL_CPU_GenuineIntel 1 -#define GL_CPU_MMX 2 -#define GL_CPU_3Dnow 4 -#define GL_CPU_Katmai 8 /* set if the katmai-instructions are available */ -#define GL_CPU_AnyX86 16 /* set if x86 asm allowed */ - -#ifdef HAVE_CONFIG_H -#include "conf.h" -#endif - -#ifdef USE_X86_ASM -#include "x86.h" -#ifdef USE_3DNOW_ASM -#include "3dnow.h" -#endif -#ifdef USE_KATMAI_ASM -#include "katmai.h" -#endif -#endif - -extern int gl_x86_cpu_features; -extern void gl_init_all_x86_asm (void); -extern int gl_identify_x86_cpu_features(void); - -#endif Index: xc/extras/Mesa/src/X86/katmai.c diff -u xc/extras/Mesa/src/X86/katmai.c:1.2 xc/extras/Mesa/src/X86/katmai.c:1.7 --- xc/extras/Mesa/src/X86/katmai.c:1.2 Fri Jun 16 20:02:42 2000 +++ xc/extras/Mesa/src/X86/katmai.c Thu Nov 30 10:55:39 2000 @@ -1,19 +1,20 @@ + /* * Mesa 3-D graphics library - * Version: 3.3 - * + * Version: 3.4 + * * Copyright (C) 1999-2000 Brian Paul All Rights Reserved. - * + * * 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 @@ -22,214 +23,198 @@ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - /* * PentiumIII-SIMD (SSE) optimizations contributed by * Andre Werthmann */ - -#if defined(USE_KATMAI_ASM) -#include "katmai.h" - -#include -#include -#include -#include +#include "glheader.h" #include "context.h" #include "types.h" -#include "xform.h" #include "vertices.h" +#include "xform.h" +#include "katmai.h" #ifdef DEBUG #include "debug_xform.h" #endif - +#define XFORM_ARGS GLvector4f *to_vec, \ + const GLfloat m[16], \ + const GLvector4f *from_vec, \ + const GLubyte *mask, \ + const GLubyte flag + + +#define DECLARE_XFORM_GROUP( pfx, sz, masked ) \ + extern void _ASMAPI gl_##pfx##_transform_points##sz##_general_##masked( XFORM_ARGS ); \ + extern void _ASMAPI gl_##pfx##_transform_points##sz##_identity_##masked( XFORM_ARGS ); \ + extern void _ASMAPI gl_##pfx##_transform_points##sz##_3d_no_rot_##masked( XFORM_ARGS ); \ + extern void _ASMAPI gl_##pfx##_transform_points##sz##_perspective_##masked( XFORM_ARGS ); \ + extern void _ASMAPI gl_##pfx##_transform_points##sz##_2d_##masked( XFORM_ARGS ); \ + extern void _ASMAPI gl_##pfx##_transform_points##sz##_2d_no_rot_##masked( XFORM_ARGS ); \ + extern void _ASMAPI gl_##pfx##_transform_points##sz##_3d_##masked( XFORM_ARGS ); + + +#define ASSIGN_XFORM_GROUP( pfx, cma, sz, masked ) \ + gl_transform_tab[cma][sz][MATRIX_GENERAL] = \ + gl_##pfx##_transform_points##sz##_general_##masked; \ + gl_transform_tab[cma][sz][MATRIX_IDENTITY] = \ + gl_##pfx##_transform_points##sz##_identity_##masked; \ + gl_transform_tab[cma][sz][MATRIX_3D_NO_ROT] = \ + gl_##pfx##_transform_points##sz##_3d_no_rot_##masked; \ + gl_transform_tab[cma][sz][MATRIX_PERSPECTIVE] = \ + gl_##pfx##_transform_points##sz##_perspective_##masked; \ + gl_transform_tab[cma][sz][MATRIX_2D] = \ + gl_##pfx##_transform_points##sz##_2d_##masked; \ + gl_transform_tab[cma][sz][MATRIX_2D_NO_ROT] = \ + gl_##pfx##_transform_points##sz##_2d_no_rot_##masked; \ + gl_transform_tab[cma][sz][MATRIX_3D] = \ + gl_##pfx##_transform_points##sz##_3d_##masked; + + + +#define NORM_ARGS const GLmatrix *mat, \ + GLfloat scale, \ + const GLvector3f *in, \ + const GLfloat *lengths, \ + const GLubyte mask[], \ + GLvector3f *dest + + +#define DECLARE_NORM_GROUP( pfx, masked ) \ + extern void _ASMAPI gl_##pfx##_rescale_normals_##masked( NORM_ARGS ); \ + extern void _ASMAPI gl_##pfx##_normalize_normals_##masked( NORM_ARGS ); \ + extern void _ASMAPI gl_##pfx##_transform_normals_##masked( NORM_ARGS ); \ + extern void _ASMAPI gl_##pfx##_transform_normals_no_rot_##masked( NORM_ARGS ); \ + extern void _ASMAPI gl_##pfx##_transform_rescale_normals_##masked( NORM_ARGS ); \ + extern void _ASMAPI gl_##pfx##_transform_rescale_normals_no_rot_##masked( NORM_ARGS ); \ + extern void _ASMAPI gl_##pfx##_transform_normalize_normals_##masked( NORM_ARGS ); \ + extern void _ASMAPI gl_##pfx##_transform_normalize_normals_no_rot_##masked( NORM_ARGS ); + + +#define ASSIGN_NORM_GROUP( pfx, cma, masked ) \ + gl_normal_tab[NORM_RESCALE][cma] = \ + gl_##pfx##_rescale_normals_##masked; \ + gl_normal_tab[NORM_NORMALIZE][cma] = \ + gl_##pfx##_normalize_normals_##masked; \ + gl_normal_tab[NORM_TRANSFORM][cma] = \ + gl_##pfx##_transform_normals_##masked; \ + gl_normal_tab[NORM_TRANSFORM_NO_ROT][cma] = \ + gl_##pfx##_transform_normals_no_rot_##masked; \ + gl_normal_tab[NORM_TRANSFORM | NORM_RESCALE][cma] = \ + gl_##pfx##_transform_rescale_normals_##masked; \ + gl_normal_tab[NORM_TRANSFORM_NO_ROT | NORM_RESCALE][cma] = \ + gl_##pfx##_transform_rescale_normals_no_rot_##masked; \ + gl_normal_tab[NORM_TRANSFORM | NORM_NORMALIZE][cma] = \ + gl_##pfx##_transform_normalize_normals_##masked; \ + gl_normal_tab[NORM_TRANSFORM_NO_ROT | NORM_NORMALIZE][cma] = \ + gl_##pfx##_transform_normalize_normals_no_rot_##masked; + + +#ifdef USE_KATMAI_ASM +DECLARE_XFORM_GROUP( katmai, 1, raw ) +DECLARE_XFORM_GROUP( katmai, 2, raw ) +DECLARE_XFORM_GROUP( katmai, 3, raw ) + +DECLARE_XFORM_GROUP( katmai, 1, masked ) +DECLARE_XFORM_GROUP( katmai, 2, masked ) +DECLARE_XFORM_GROUP( katmai, 3, masked ) + +#if 1 +/* Some functions are not written in SSE-assembly, because the fpu ones are faster */ +extern void gl_katmai_transform_normals_no_rot_raw(NORM_ARGS); +extern void gl_katmai_transform_rescale_normals_raw(NORM_ARGS); +extern void gl_katmai_transform_rescale_normals_no_rot_raw(NORM_ARGS); + +extern void gl_katmai_transform_points4_general_raw(XFORM_ARGS); +extern void gl_katmai_transform_points4_general_masked(XFORM_ARGS); +extern void gl_katmai_transform_points4_identity_masked(XFORM_ARGS); +extern void gl_katmai_transform_points4_3d_no_rot_masked(XFORM_ARGS); +extern void gl_katmai_transform_points4_3d_raw(XFORM_ARGS); +extern void gl_katmai_transform_points4_3d_masked(XFORM_ARGS); +#else +DECLARE_NORM_GROUP( katmai, raw ) +#endif -#define XFORM_ARGS GLvector4f *to_vec, \ - const GLmatrix *mat, \ - const GLvector4f *from_vec, \ - const GLubyte *mask, \ - const GLubyte flag - - - -#define DECLARE_XFORM_GROUP(pfx, v, masked) \ - extern void gl_##pfx##_transform_points##v##_general_##masked(XFORM_ARGS); \ - extern void gl_##pfx##_transform_points##v##_identity_##masked(XFORM_ARGS); \ - extern void gl_##pfx##_transform_points##v##_3d_no_rot_##masked(XFORM_ARGS); \ - extern void gl_##pfx##_transform_points##v##_perspective_##masked(XFORM_ARGS);\ - extern void gl_##pfx##_transform_points##v##_2d_##masked(XFORM_ARGS); \ - extern void gl_##pfx##_transform_points##v##_2d_no_rot_##masked(XFORM_ARGS); \ - extern void gl_##pfx##_transform_points##v##_3d_##masked(XFORM_ARGS); - - - -#define ASSIGN_XFORM_GROUP( pfx, cma, vsize, masked ) \ - gl_transform_tab[cma][vsize][MATRIX_GENERAL] \ - = gl_##pfx##_transform_points##vsize##_general_##masked; \ - gl_transform_tab[cma][vsize][MATRIX_IDENTITY] \ - = gl_##pfx##_transform_points##vsize##_identity_##masked; \ - gl_transform_tab[cma][vsize][MATRIX_3D_NO_ROT] \ - = gl_##pfx##_transform_points##vsize##_3d_no_rot_##masked; \ - gl_transform_tab[cma][vsize][MATRIX_PERSPECTIVE] \ - = gl_##pfx##_transform_points##vsize##_perspective_##masked; \ - gl_transform_tab[cma][vsize][MATRIX_2D] \ - = gl_##pfx##_transform_points##vsize##_2d_##masked; \ - gl_transform_tab[cma][vsize][MATRIX_2D_NO_ROT] \ - = gl_##pfx##_transform_points##vsize##_2d_no_rot_##masked; \ - gl_transform_tab[cma][vsize][MATRIX_3D] \ - = gl_##pfx##_transform_points##vsize##_3d_##masked; - - - - -#define NORM_ARGS const GLmatrix *mat, \ - GLfloat scale, \ - const GLvector3f *in, \ - const GLfloat *lengths, \ - const GLubyte mask[], \ - GLvector3f *dest - - - -#define DECLARE_NORM_GROUP(pfx, masked) \ - extern void gl_##pfx##_rescale_normals_##masked## (NORM_ARGS); \ - extern void gl_##pfx##_normalize_normals_##masked## (NORM_ARGS); \ - extern void gl_##pfx##_transform_normals_##masked## (NORM_ARGS); \ - extern void gl_##pfx##_transform_normals_no_rot_##masked## (NORM_ARGS); \ - extern void gl_##pfx##_transform_rescale_normals_##masked## (NORM_ARGS); \ - extern void gl_##pfx##_transform_rescale_normals_no_rot_##masked## (NORM_ARGS); \ - extern void gl_##pfx##_transform_normalize_normals_##masked## (NORM_ARGS); \ - extern void gl_##pfx##_transform_normalize_normals_no_rot_##masked## (NORM_ARGS); - - - -#define ASSIGN_NORM_GROUP( pfx, cma, masked ) \ - gl_normal_tab[NORM_RESCALE][cma] = \ - gl_##pfx##_rescale_normals_##masked##; \ - gl_normal_tab[NORM_NORMALIZE][cma] = \ - gl_##pfx##_normalize_normals_##masked##; \ - gl_normal_tab[NORM_TRANSFORM][cma] = \ - gl_##pfx##_transform_normals_##masked##; \ - gl_normal_tab[NORM_TRANSFORM_NO_ROT][cma] = \ - gl_##pfx##_transform_normals_no_rot_##masked##; \ - gl_normal_tab[NORM_TRANSFORM | NORM_RESCALE][cma] = \ - gl_##pfx##_transform_rescale_normals_##masked##; \ - gl_normal_tab[NORM_TRANSFORM_NO_ROT | NORM_RESCALE][cma] = \ - gl_##pfx##_transform_rescale_normals_no_rot_##masked##; \ - gl_normal_tab[NORM_TRANSFORM | NORM_NORMALIZE][cma] = \ - gl_##pfx##_transform_normalize_normals_##masked##; \ - gl_normal_tab[NORM_TRANSFORM_NO_ROT | NORM_NORMALIZE][cma] = \ - gl_##pfx##_transform_normalize_normals_no_rot_##masked##; - - -extern void gl_katmai_project_vertices( GLfloat *first, - GLfloat *last, - const GLfloat *m, - GLuint stride ); -extern void gl_katmai_project_clipped_vertices( GLfloat *first, +extern void _ASMAPI gl_v16_katmai_general_xform( GLfloat *first_vert, + const GLfloat *m, + const GLfloat *src, + GLuint src_stride, + GLuint count ); +extern void _ASMAPI gl_katmai_project_vertices( GLfloat *first, GLfloat *last, const GLfloat *m, - GLuint stride, - const GLubyte *clipmask ); - -extern void gl_v16_katmai_general_xform( GLfloat *first_vert, - const GLfloat *m, - const GLfloat *src, - GLuint src_stride, - GLuint count ); + GLuint stride ); +extern void _ASMAPI gl_katmai_project_clipped_vertices( GLfloat *first, + GLfloat *last, + const GLfloat *m, + GLuint stride, + const GLubyte *clipmask ); +#endif -void gl_init_katmai_asm_transforms (void) +void gl_init_katmai_transform_asm( void ) { - extern void gl_katmai_transform_rescale_normals_raw(NORM_ARGS); - extern void gl_katmai_transform_rescale_normals_no_rot_raw(NORM_ARGS); - extern void gl_katmai_transform_normals_no_rot_raw(NORM_ARGS); - - /* Some functions are not written in SSE-assembly, because the fpu ones are faster */ - extern void gl_katmai_transform_points4_general_raw(XFORM_ARGS); - extern void gl_katmai_transform_points4_general_masked(XFORM_ARGS); - extern void gl_katmai_transform_points4_identity_masked(XFORM_ARGS); - extern void gl_katmai_transform_points4_3d_no_rot_masked(XFORM_ARGS); - extern void gl_katmai_transform_points4_3d_raw(XFORM_ARGS); - extern void gl_katmai_transform_points4_3d_masked(XFORM_ARGS); - - - DECLARE_XFORM_GROUP( katmai, 1, raw ) - DECLARE_XFORM_GROUP( katmai, 1, masked ) - - DECLARE_XFORM_GROUP( katmai, 2, raw ) - DECLARE_XFORM_GROUP( katmai, 2, masked ) - - DECLARE_XFORM_GROUP( katmai, 3, raw ) - DECLARE_XFORM_GROUP( katmai, 3, masked ) - - - gl_normal_tab[NORM_TRANSFORM | NORM_RESCALE][0]=gl_katmai_transform_rescale_normals_raw; - gl_normal_tab[NORM_TRANSFORM_NO_ROT | NORM_RESCALE][0]=gl_katmai_transform_rescale_normals_no_rot_raw; - gl_normal_tab[NORM_TRANSFORM_NO_ROT][0]=gl_katmai_transform_normals_no_rot_raw; - - - gl_transform_tab[0][4][MATRIX_GENERAL]=gl_katmai_transform_points4_general_raw; - gl_transform_tab[CULL_MASK_ACTIVE][4][MATRIX_GENERAL]=gl_katmai_transform_points4_general_masked; - - gl_transform_tab[CULL_MASK_ACTIVE][4][MATRIX_IDENTITY]=gl_katmai_transform_points4_identity_masked; - - gl_transform_tab[CULL_MASK_ACTIVE][4][MATRIX_3D_NO_ROT]=gl_katmai_transform_points4_3d_no_rot_masked; +#ifdef USE_KATMAI_ASM + ASSIGN_XFORM_GROUP( katmai, 0, 1, raw ); + ASSIGN_XFORM_GROUP( katmai, 0, 2, raw ); + ASSIGN_XFORM_GROUP( katmai, 0, 3, raw ); + + ASSIGN_XFORM_GROUP( katmai, CULL_MASK_ACTIVE, 1, masked ); + ASSIGN_XFORM_GROUP( katmai, CULL_MASK_ACTIVE, 2, masked ); + ASSIGN_XFORM_GROUP( katmai, CULL_MASK_ACTIVE, 3, masked ); - gl_transform_tab[0][4][MATRIX_3D]=gl_katmai_transform_points4_3d_raw; - gl_transform_tab[CULL_MASK_ACTIVE][4][MATRIX_3D]=gl_katmai_transform_points4_3d_masked; - - - ASSIGN_XFORM_GROUP( katmai, 0, 1, raw ) - ASSIGN_XFORM_GROUP( katmai, CULL_MASK_ACTIVE, 1, masked ) - - ASSIGN_XFORM_GROUP( katmai, 0, 2, raw ) - ASSIGN_XFORM_GROUP( katmai, CULL_MASK_ACTIVE, 2, masked ) - - ASSIGN_XFORM_GROUP( katmai, 0, 3, raw ) - ASSIGN_XFORM_GROUP( katmai, CULL_MASK_ACTIVE, 3, masked ) - - - /* TODO ! (some parts of it) */ - - /* - DECLARE_NORM_GROUP( katmai, raw ) - - ASSIGN_NORM_GROUP( katmai, 0, raw ) - */ +#if 1 + /* TODO: Finish these off. + */ + gl_normal_tab[NORM_TRANSFORM_NO_ROT][0] = + gl_katmai_transform_normals_no_rot_raw; + gl_normal_tab[NORM_TRANSFORM | NORM_RESCALE][0] = + gl_katmai_transform_rescale_normals_raw; + gl_normal_tab[NORM_TRANSFORM_NO_ROT | NORM_RESCALE][0] = + gl_katmai_transform_rescale_normals_no_rot_raw; + + gl_transform_tab[0][4][MATRIX_GENERAL] = + gl_katmai_transform_points4_general_raw; + gl_transform_tab[0][4][MATRIX_3D] = + gl_katmai_transform_points4_3d_raw; + + gl_transform_tab[CULL_MASK_ACTIVE][4][MATRIX_GENERAL] = + gl_katmai_transform_points4_general_masked; + gl_transform_tab[CULL_MASK_ACTIVE][4][MATRIX_IDENTITY] = + gl_katmai_transform_points4_identity_masked; + gl_transform_tab[CULL_MASK_ACTIVE][4][MATRIX_3D_NO_ROT] = + gl_katmai_transform_points4_3d_no_rot_masked; + gl_transform_tab[CULL_MASK_ACTIVE][4][MATRIX_3D] = + gl_katmai_transform_points4_3d_masked; +#else + ASSIGN_NORM_GROUP( katmai, 0, raw ); +#endif #ifdef DEBUG - gl_test_all_transform_functions("Katmai!"); - gl_test_all_normal_transform_functions("Katmai!"); + gl_test_all_transform_functions( "SSE" ); + gl_test_all_normal_transform_functions( "SSE" ); #endif - - /* done */ - - /* Hook in some stuff for vertices.c. - */ - gl_xform_points3_v16_general = gl_v16_katmai_general_xform; - - /* test, if it works correctly ! */ - gl_project_v16 = gl_katmai_project_vertices; - - /* test, if it works correctly ! */ - gl_project_clipped_v16 = gl_katmai_project_clipped_vertices; +#endif } - -#else - -/* silence compiler warning */ -extern void _mesa_katmai_dummy_function(void); -void _mesa_katmai_dummy_function(void) +void gl_init_katmai_vertex_asm( void ) { -} - +#ifdef USE_KATMAI_ASM + gl_xform_points3_v16_general = gl_v16_katmai_general_xform; +#if 0 + /* GH: These are broken. I'm fixing them now. + */ + gl_project_v16 = gl_katmai_project_vertices; + gl_project_clipped_v16 = gl_katmai_project_clipped_vertices; +#endif +#if 0 + gl_test_all_vertex_functions( "SSE" ); #endif +#endif +} Index: xc/extras/Mesa/src/X86/katmai.h diff -u xc/extras/Mesa/src/X86/katmai.h:1.1 xc/extras/Mesa/src/X86/katmai.h:1.4 --- xc/extras/Mesa/src/X86/katmai.h:1.1 Tue Feb 8 12:18:18 2000 +++ xc/extras/Mesa/src/X86/katmai.h Thu Nov 30 10:39:21 2000 @@ -1,19 +1,20 @@ + /* * Mesa 3-D graphics library - * Version: 3.1 - * + * Version: 3.4 + * * Copyright (C) 1999 Brian Paul All Rights Reserved. - * + * * 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 @@ -22,22 +23,15 @@ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - /* * PentiumIII-SIMD (SSE) optimizations contributed by * Andre Werthmann */ - #ifndef __KATMAI_H__ #define __KATMAI_H__ - - - -#include "xform.h" - - -void gl_init_katmai_asm_transforms (void); +void gl_init_katmai_transform_asm( void ); +void gl_init_katmai_vertex_asm( void ); -#endif /* __KATMAI_H__ */ +#endif Index: xc/extras/Mesa/src/X86/katmai_norm_raw.S diff -u xc/extras/Mesa/src/X86/katmai_norm_raw.S:1.2 xc/extras/Mesa/src/X86/katmai_norm_raw.S:1.3 --- xc/extras/Mesa/src/X86/katmai_norm_raw.S:1.2 Fri Jun 16 20:02:42 2000 +++ xc/extras/Mesa/src/X86/katmai_norm_raw.S Mon Nov 13 16:55:43 2000 @@ -3,9 +3,9 @@ * - insert PREFETCH instructions to avoid cache-misses ! * - some more optimizations are possible... * - for 40-50% more performance in the SSE-functions, the - * data (trans-matrix, src_vert, dst_vert) needs to be 16byte aligned ! + * data (trans-matrix, src_vert, dst_vert) needs to be 16byte aligned ! */ - + SEG_TEXT @@ -28,15 +28,15 @@ #define V3F_COUNT 8 #define V3F_STRIDE 12 -#define MAT_INV 64 +#define MAT_INV 4 #define M(i) REGOFF(i * 4, EDX) #define S(i) REGOFF(i * 4, ESI) #define D(i) REGOFF(i * 4, EDI) #define STRIDE REGOFF(12, ESI) - + #undef FRAME_OFFSET - + /* * Offsets for norm_func arguments * @@ -107,8 +107,8 @@ RET #undef FRAME_OFFSET - + ALIGNTEXT16 GLOBL GLNAME(gl_katmai_transform_rescale_normals_raw) GLNAME(gl_katmai_transform_rescale_normals_raw): @@ -136,7 +136,7 @@ MOV_L( REGOFF(V3F_START, EDI), EDI ) /* ptr to first dest vertex */ ADD_L( EDI, ECX ) /* count += dest ptr */ - + ALIGNTEXT32 MOVSS ( M(0), XMM0 ) /* m0 */ MOVSS ( M(4), XMM1 ) /* m4 */ @@ -144,7 +144,7 @@ MOVSS ( ARG_SCALE, XMM4 ) /* scale */ SHUFPS ( CONST(0x0), XMM4, XMM4 ) /* scale | scale */ - + MULPS ( XMM4, XMM0 ) /* m4*scale | m0*scale */ MOVSS ( M(1), XMM1 ) /* m1 */ MOVSS ( M(5), XMM2 ) /* m5 */ @@ -159,7 +159,7 @@ MULSS ( ARG_SCALE, XMM6 ) /* m8*scale */ MOVSS ( M(9), XMM7 ) /* m9 */ MULSS ( ARG_SCALE, XMM7 ) /* m9*scale */ - + ALIGNTEXT32 LLBL(K_G3TRNR_top): MOVSS ( S(0), XMM3 ) /* ux */ @@ -187,7 +187,7 @@ ADDSS ( XMM4, XMM3 ) ADDSS ( XMM5, XMM3 ) MOVSS ( XMM3, D(2) ) - + LLBL(K_G3TRNR_skip): ADD_L ( CONST(12), EDI ) ADD_L ( EAX, ESI ) @@ -234,7 +234,7 @@ MOVSS( M(5), XMM1 ) /* m5 */ UNPCKLPS( XMM1, XMM0 ) /* m5 | m0 */ MOVSS( M(10), XMM1 ) /* m10 */ - + ALIGNTEXT32 LLBL(K_G3TNNRR_top): MOVLPS( S(0), XMM2 ) /* uy | ux */ @@ -244,7 +244,7 @@ MOVSS( S(2), XMM2 ) /* uz */ MULSS( XMM1, XMM2 ) /* uz*m10 */ MOVSS( XMM2, D(2) ) - + LLBL(K_G3TNNRR_skip): ADD_L ( CONST(12), EDI ) ADD_L ( EAX, ESI ) @@ -256,4 +256,3 @@ POP_L ( ESI ) RET #undef FRAME_OFFSET - Index: xc/extras/Mesa/src/X86/katmai_vertex.S diff -u /dev/null xc/extras/Mesa/src/X86/katmai_vertex.S:1.1.1.1 --- /dev/null Mon Dec 18 14:21:58 2000 +++ xc/extras/Mesa/src/X86/katmai_vertex.S Mon Nov 13 16:34:09 2000 @@ -0,0 +1,182 @@ +#include "assyntax.h" + + SEG_TEXT + +#define MAT_SY 20 +#define MAT_SZ 40 +#define MAT_TX 48 +#define MAT_TY 52 +#define MAT_TZ 56 + + +/* + * void gl_v16_katmai_general_xform( GLfloat *dest, + * const GLfloat *m, + * const GLfloat *src, + * GLuint src_stride, + * GLuint count ) + * + */ + +ALIGNTEXT16 +GLOBL GLNAME( gl_v16_katmai_general_xform ) +GLNAME( gl_v16_katmai_general_xform ): + + PUSH_L( EDI ) + PUSH_L( ESI ) + + MOV_L( REGOFF(12, ESP), EAX ) /* destination */ + MOV_L( REGOFF(16, ESP), ESI ) /* matrix */ + MOV_L( REGOFF(20, ESP), EDX ) /* source */ + MOV_L( REGOFF(24, ESP), EDI ) /* src_stride */ + MOV_L( REGOFF(28, ESP), ECX ) /* count */ + + MOVAPS( REGOFF(0, ESI), XMM4 ) /* m3 | m2 | m1 | m0 */ + MOVAPS( REGOFF(16, ESI), XMM5 ) /* m7 | m6 | m5 | m4 */ + MOVAPS( REGOFF(32, ESI), XMM6 ) /* m11 | m10 | m9 | m8 */ + MOVAPS( REGOFF(48, ESI), XMM7 ) /* m15 | m14 | m13 | m12 */ + +ALIGNTEXT32 +LLBL(v16_katmai_general_loop): + + MOVSS( REGOFF(0, EDX), XMM0 ) /* | | | x0 */ + SHUFPS( CONST(0x0), XMM0, XMM0 ) /* x0 | x0 | x0 | x0 */ + MULPS( XMM4, XMM0 ) /* x0*m3 | x0*m2 | x0*m1 | x0*m0 */ + + MOVSS( REGOFF(4, EDX), XMM1 ) /* | | | x1 */ + SHUFPS( CONST(0x0), XMM1, XMM1 ) /* x1 | x1 | x1 | x1 */ + MULPS( XMM5, XMM1 ) /* x1*m7 | x1*m6 | x1*m5 | x1*m4 */ + + MOVSS( REGOFF(8, EDX), XMM2 ) /* | | | x2 */ + SHUFPS( CONST(0x0), XMM2, XMM2 ) /* x2 | x2 | x2 | x2 */ + MULPS( XMM6, XMM2 ) /* x2*m11 | x2*m10 | x2*m9 | x2*m8 */ + + ADDPS( XMM1, XMM0 ) + ADDPS( XMM2, XMM0 ) + ADDPS( XMM7, XMM0 ) /* r3 | r2 | r1 | r1 */ + + MOVAPS( XMM0, REGOFF(0, EAX) ) + + ADD_L( CONST(64), EAX ) /* next output vertex */ + ADD_L( EDI, EDX ) /* next input vertex */ + + DEC_L( ECX ) + JNE( LLBL(v16_katmai_general_loop) ) + + POP_L( ESI ) + POP_L( EDI ) + + RET + + +/* void gl_katmai_project_vertices(GLfloat *first, + * GLfloat *last, + * const GLfloat *m, + * GLuint stride ) + */ + + +ALIGNTEXT16 +GLOBL GLNAME( gl_katmai_project_vertices ) +GLNAME( gl_katmai_project_vertices ): + + PUSH_L( EBP ) + + MOV_L( REGOFF(8, ESP), ECX ) /* first_vert */ + MOV_L( REGOFF(12, ESP), EDX ) /* last_vert */ + MOV_L( REGOFF(16, ESP), EBP ) /* matrix */ + MOV_L( REGOFF(20, ESP), EAX ) /* stride */ + + +ALIGNTEXT32 + MOVAPS( REGOFF(MAT_TX, EBP), XMM0 ) /* (x44), x43, x42, x41 => xmm0 */ + MOVSS( REGOFF(0, EBP), XMM1 ) /* -, -, -, x11 => xmm1 */ + UNPCKLPS( REGOFF(MAT_SY, EBP), XMM1 ) /* -, -, x22, x11 => xmm1 */ + SHUFPS( CONST(0x44), REGOFF(MAT_SZ, EBP), XMM1 ) + /* -, x33, x22, x11 => xmm1 */ + + SUB_L( ECX, EDX ) /* last -= first */ + +LLBL(v16_katmai_pv_loop_start): + MOVAPS( REGOFF(0, ECX), XMM3 ) /* f[3], f[2], f[1], f[0] */ + + MOVSS( REGOFF(12, ECX), XMM2 ) /* -, -, -, f[3] */ + SHUFPS( CONST(0x0), XMM2, XMM2 ) /* f[3], f[3], f[3], f[3] */ + RCPPS( XMM2, XMM2 ) /* 1/f[3], 1/f[3], 1/f[3], 1/f[3] */ + + MULPS( XMM2, XMM1 ) /* -, x33*1/f[3]... */ + MULPS( XMM3, XMM1 ) /* -, x33*1/f[3]*f[2]... */ + ADDPS( XMM0, XMM1 ) /* -, x33*1/f[3]*f[2]+x43... */ + + MOVAPS( XMM1, REGOFF(0, ECX) ) /* back to f */ + MOVSS( XMM2, REGOFF(12, ECX) ) /* 1/f[3] into f[3] ! */ + + + ADD_L( EAX, ECX ) /* f += stride */ + SUB_L( EAX, EDX ) /* (last-first)-stride */ + JA ( LLBL(v16_katmai_pv_loop_start) ) + + POP_L( EBP ) + RET + + + +/* void gl_katmai_project_clipped_vertices(GLfloat *first, + * GLfloat *last, + * const GLfloat *m, + * GLuint stride, + * const GLubyte *clipmask ); + */ + + +ALIGNTEXT16 +GLOBL GLNAME( gl_katmai_project_clipped_vertices ) +GLNAME( gl_katmai_project_clipped_vertices ): + + PUSH_L( EBP ) + PUSH_L( ESI ) + + MOV_L( REGOFF(12, ESP), ECX ) /* first_vert */ + MOV_L( REGOFF(16, ESP), EDX ) /* last_vert */ + MOV_L( REGOFF(20, ESP), EBP ) /* matrix */ + MOV_L( REGOFF(24, ESP), EAX ) /* stride */ + MOV_L( REGOFF(28, ESP), ESI ) /* clip_mask */ + + + +ALIGNTEXT32 + + MOVAPS( REGOFF(MAT_TX, EBP), XMM0 ) /* (x44), x43, x42, x41 => xmm0 */ + MOVSS( REGOFF(0, EBP), XMM1 ) /* -, -, -, x11 => xmm1 */ + UNPCKLPS( REGOFF(MAT_SY, EBP), XMM1 ) /* -, -, x22, x11 => xmm1 */ + SHUFPS( CONST(0x44), REGOFF(MAT_SZ, EBP), XMM1 ) + /* -, x33, x22, x11 => xmm1 */ + +LLBL(v16_katmai_pcv_loop_start): + CMP_B ( CONST(0), REGIND(ESI) ) /* clip_mask == 0 ? */ + JNE( LLBL(v16_katmai_pcv_skip) ) /* no -> skip ! */ + + MOVAPS( REGOFF(0, ECX), XMM3 ) /* f[3], f[2], f[1], f[0] */ + + MOVSS( REGOFF(12, ECX), XMM2 ) /* -, -, -, f[3] */ + SHUFPS( CONST(0x0), XMM2, XMM2 ) /* f[3], f[3], f[3], f[3] */ + RCPPS( XMM2, XMM2 ) /* 1/f[3], 1/f[3], 1/f[3], 1/f[3] */ + + MULPS( XMM2, XMM1 ) /* -, x33*1/f[3]... */ + MULPS( XMM3, XMM1 ) /* -, x33*1/f[3]*f[2]... */ + ADDPS( XMM0, XMM1 ) /* -, x33*1/f[3]*f[2]+x43... */ + + MOVAPS( XMM1, REGOFF(0, ECX) ) /* back to f */ + MOVSS( XMM2, REGOFF(12, ECX) ) /* 1/f[3] into f[3] ! */ + +LLBL(v16_katmai_pcv_skip): + ADD_L( EAX, ECX ) /* f += stride */ + INC_L( ESI ) /* nect ClipMask */ + + CMP_L( ECX, EDX ) /* p_first_vertex == p_last_vertex */ + JNE( LLBL(v16_katmai_pcv_loop_start) ) + /* no -> go on with next vertex */ + + POP_L( ESI ) + POP_L( EBP ) + RET Index: xc/extras/Mesa/src/X86/katmai_xform_masked1.S diff -u xc/extras/Mesa/src/X86/katmai_xform_masked1.S:1.2 xc/extras/Mesa/src/X86/katmai_xform_masked1.S:1.6 --- xc/extras/Mesa/src/X86/katmai_xform_masked1.S:1.2 Fri Jun 16 20:02:42 2000 +++ xc/extras/Mesa/src/X86/katmai_xform_masked1.S Mon Nov 13 18:31:11 2000 @@ -3,9 +3,9 @@ * - insert PREFETCH instructions to avoid cache-misses ! * - some more optimizations are possible... * - for 40-50% more performance in the SSE-functions, the - * data (trans-matrix, src_vert, dst_vert) needs to be 16byte aligned ! + * data (trans-matrix, src_vert, dst_vert) needs to be 16byte aligned ! */ - + SEG_TEXT @@ -31,9 +31,9 @@ /* * Offsets for transform_func arguments * - * typedef void (*transform_func)( GLvector4f *to_vec, - * const GLmatrix *mat, - * const GLvector4f *from_vec, + * typedef void (*transform_func)( GLvector4f *to_vec, + * const GLfloat m[16], + * const GLvector4f *from_vec, * const GLubyte *clipmask, * const GLubyte flag ); */ @@ -65,7 +65,7 @@ MOV_L( ARG_MATRIX, EDX ) /* ptr to matrix */ MOV_L( ARG_CLIP, EBP ) /* ptr to clip mask array */ - + MOV_L( REGOFF(V4F_COUNT, ESI), ECX ) /* source count */ MOV_B( ARG_FLAG, BL ) /* clip mask flags */ @@ -86,19 +86,19 @@ ALIGNTEXT32 - MOVUPS( M(0), XMM0 ) /* m3 | m2 | m1 | m0 */ - MOVUPS( M(12), XMM1 ) /* m15 | m14 | m13 | m12 */ + MOVAPS( M(0), XMM0 ) /* m3 | m2 | m1 | m0 */ + MOVAPS( M(12), XMM1 ) /* m15 | m14 | m13 | m12 */ ALIGNTEXT32 LLBL(K_GTP1GM_top): TEST_B( BL, REGIND(EBP) ) JNZ( LLBL(K_GTP1GM_skip) ) - + MOVSS( S(0), XMM2 ) /* ox */ SHUFPS( CONST(0x0), XMM2, XMM2 ) /* ox | ox | ox | ox */ MULPS( XMM0, XMM2 ) /* ox*m3 | ox*m2 | ox*m1 | ox*m0 */ ADDPS( XMM1, XMM2 ) /* + | + | + | + */ - MOVUPS( XMM2, D(0) ) + MOVAPS( XMM2, D(0) ) LLBL(K_GTP1GM_skip): INC_L ( EBP ) @@ -192,7 +192,7 @@ MOV_L( ARG_MATRIX, EDX ) /* ptr to matrix */ MOV_L( ARG_CLIP, EBP ) /* ptr to clip mask array */ - + MOV_L( REGOFF(V4F_COUNT, ESI), ECX ) /* source count */ MOV_B( ARG_FLAG, BL ) /* clip mask flags */ @@ -217,12 +217,12 @@ MOVSS( M(12), XMM1 ) /* m12 */ MOVSS( M(13), XMM2 ) /* m13 */ MOVSS( M(14), XMM3 ) /* m14 */ - + ALIGNTEXT32 LLBL(K_GTP13DNRM_top): TEST_B( BL, REGIND(EBP) ) JNZ( LLBL(K_GTP13DNRM_skip) ) - + MOVSS( S(0), XMM4 ) /* ox */ MULSS( XMM0, XMM4 ) /* ox*m0 */ ADDSS( XMM1, XMM4 ) /* ox*m0+m12 */ @@ -245,8 +245,8 @@ POP_L ( ESI ) RET #undef FRAME_OFFSET - + ALIGNTEXT4 GLOBL GLNAME(gl_katmai_transform_points1_perspective_masked) GLNAME(gl_katmai_transform_points1_perspective_masked): @@ -284,12 +284,12 @@ XORPS( XMM0, XMM0 ) /* 0 | 0 | 0 | 0 */ MOVSS( M(0), XMM1 ) /* m0 */ MOVSS( M(14), XMM2 ) /* m14 */ - + ALIGNTEXT32 LLBL(K_GTP13PM_top): TEST_B ( BL, REGIND(EBP) ) JNZ ( LLBL(K_GTP13PM_skip) ) - + MOVSS( S(0), XMM3 ) /* ox */ MULSS( XMM1, XMM3 ) /* ox*m0 */ MOVSS( XMM3, D(0) ) /* ox*m0->D(0) */ @@ -297,7 +297,7 @@ MOVSS( XMM0, D(1) ) MOVSS( XMM0, D(3) ) - + LLBL(K_GTP13PM_skip): INC_L( EBP ) ADD_L( CONST(16), EDI ) @@ -323,7 +323,7 @@ PUSH_L( EDI ) PUSH_L( EBX ) PUSH_L( EBP ) - + MOV_L( ARG_SOURCE, ESI ) /* ptr to source GLvector4f */ MOV_L( ARG_DEST, EDI ) /* ptr to dest GLvector4f */ @@ -350,18 +350,18 @@ ALIGNTEXT32 MOVLPS( M(0), XMM0 ) /* m1 | m0 */ MOVLPS( M(12), XMM1 ) /* m13 | m12 */ - + ALIGNTEXT32 LLBL(K_GTP13P2DM_top): TEST_B( BL, REGIND(EBP) ) JNZ( LLBL(K_GTP13P2DM_skip) ) - + MOVSS( S(0), XMM2 ) /* ox */ SHUFPS( CONST(0x0), XMM2, XMM2 ) /* ox | ox | ox | ox */ MULPS( XMM0, XMM2 ) /* - | - | ox*m1 | ox*m0 */ ADDPS( XMM1, XMM2 ) /* - | - | ox*m1+m13 | ox*m0+m12 */ MOVLPS( XMM2, D(0) ) - + LLBL(K_GTP13P2DM_skip): INC_L ( EBP ) ADD_L ( CONST(16), EDI ) @@ -393,7 +393,7 @@ MOV_L( ARG_MATRIX, EDX ) /* ptr to matrix */ MOV_L( ARG_CLIP, EBP ) /* ptr to clip mask array */ - + MOV_L( REGOFF(V4F_COUNT, ESI), ECX ) /* source count */ MOV_B( ARG_FLAG, BL ) /* clip mask flags */ @@ -416,18 +416,18 @@ MOVSS( M(0), XMM0 ) /* m0 */ MOVSS( M(12), XMM1 ) /* m12 */ MOVSS( M(13), XMM2 ) /* m13 */ - + ALIGNTEXT32 LLBL(K_GTP13P2DNRM_top): TEST_B( BL, REGIND(EBP) ) JNZ( LLBL(K_GTP13P2DNRM_skip) ) - + MOVSS( S(0), XMM3 ) /* ox */ MULSS( XMM0, XMM3 ) /* ox*m0 */ ADDSS( XMM1, XMM3 ) /* ox*m0+m12 */ MOVSS( XMM3, D(0) ) MOVSS( XMM2, D(1) ) - + LLBL(K_GTP13P2DNRM_skip): INC_L( EBP ) ADD_L( CONST(16), EDI ) @@ -459,7 +459,7 @@ MOV_L( ARG_MATRIX, EDX ) /* ptr to matrix */ MOV_L( ARG_CLIP, EBP ) /* ptr to clip mask array */ - + MOV_L( REGOFF(V4F_COUNT, ESI), ECX ) /* source count */ MOV_B( ARG_FLAG, BL ) /* clip mask flags */ @@ -479,15 +479,15 @@ ADD_L( EDI, ECX ) /* count += dest ptr */ +ALIGNTEXT32 + MOVAPS( M(0), XMM0 ) /* m3 | m2 | m1 | m0 */ + MOVAPS( M(12), XMM1 ) /* m15 | m14 | m13 | m12 */ + ALIGNTEXT32 - MOVUPS( M(0), XMM0 ) /* m3 | m2 | m1 | m0 */ - MOVUPS( M(12), XMM1 ) /* m15 | m14 | m13 | m12 */ - -ALIGNTEXT32 LLBL(K_GTP13P3DM_top): TEST_B( BL, REGIND(EBP) ) JNZ( LLBL(K_GTP13P3DM_skip) ) - + MOVSS( S(0), XMM2 ) /* ox */ SHUFPS( CONST(0x0), XMM2, XMM2 ) /* ox | ox | ox | ox */ MULPS( XMM0, XMM2 ) /* ox*m3 | ox*m2 | ox*m1 | ox*m0 */ @@ -495,7 +495,7 @@ MOVLPS( XMM2, D(0) ) /* - | - | ->D(1)| ->D(0)*/ UNPCKHPS( XMM2, XMM2 ) /* ox*m3+m15 | ox*m3+m15 | ox*m2+m14 | ox*m2+m14 */ MOVSS( XMM2, D(2) ) /* ->D(2) */ - + LLBL(K_GTP13P3DM_skip): INC_L( EBP ) ADD_L( CONST(16), EDI ) Index: xc/extras/Mesa/src/X86/katmai_xform_masked2.S diff -u xc/extras/Mesa/src/X86/katmai_xform_masked2.S:1.2 xc/extras/Mesa/src/X86/katmai_xform_masked2.S:1.6 --- xc/extras/Mesa/src/X86/katmai_xform_masked2.S:1.2 Fri Jun 16 20:02:42 2000 +++ xc/extras/Mesa/src/X86/katmai_xform_masked2.S Mon Nov 13 18:31:12 2000 @@ -3,9 +3,9 @@ * - insert PREFETCH instructions to avoid cache-misses ! * - some more optimizations are possible... * - for 40-50% more performance in the SSE-functions, the - * data (trans-matrix, src_vert, dst_vert) needs to be 16byte aligned ! + * data (trans-matrix, src_vert, dst_vert) needs to be 16byte aligned ! */ - + SEG_TEXT @@ -31,9 +31,9 @@ /* * Offsets for transform_func arguments * - * typedef void (*transform_func)( GLvector4f *to_vec, - * const GLmatrix *mat, - * const GLvector4f *from_vec, + * typedef void (*transform_func)( GLvector4f *to_vec, + * const GLfloat m[16], + * const GLvector4f *from_vec, * const GLubyte *clipmask, * const GLubyte flag ); */ @@ -65,13 +65,13 @@ MOV_L( ARG_MATRIX, EDX ) /* ptr to matrix */ MOV_L( ARG_CLIP, EBP ) /* ptr to clip mask array */ - + MOV_L( REGOFF(V4F_COUNT, ESI), ECX ) /* source count */ MOV_B( ARG_FLAG, BL ) /* clip mask flags */ TEST_L( ECX, ECX ) JZ( LLBL(K_GTP2GM_finish) ) /* count was zero; go to finish */ - + MOV_L( REGOFF(V4F_STRIDE, ESI), EAX ) /* stride */ OR_L( CONST(VEC_SIZE_4), REGOFF(V4F_FLAGS, EDI) ) /* set dest flags */ @@ -86,15 +86,15 @@ ALIGNTEXT32 - MOVUPS( M(0), XMM0 ) /* m3 | m2 | m1 | m0 */ - MOVUPS( M(4), XMM1 ) /* m7 | m6 | m5 | m4 */ - MOVUPS( M(12), XMM2 ) /* m15 | m14 | m13 | m12 */ + MOVAPS( M(0), XMM0 ) /* m3 | m2 | m1 | m0 */ + MOVAPS( M(4), XMM1 ) /* m7 | m6 | m5 | m4 */ + MOVAPS( M(12), XMM2 ) /* m15 | m14 | m13 | m12 */ ALIGNTEXT32 LLBL(K_GTP2GM_top): TEST_B( BL, REGIND(EBP) ) JNZ( LLBL(K_GTP2GM_skip) ) - + MOVSS( S(0), XMM3 ) /* ox */ SHUFPS( CONST(0x0), XMM3, XMM3 ) /* ox | ox | ox | ox */ MULPS( XMM0, XMM3 ) /* ox*m3 | ox*m2 | ox*m1 | ox*m0 */ @@ -104,8 +104,8 @@ ADDPS( XMM4, XMM3 ) ADDPS( XMM2, XMM3 ) - MOVUPS( XMM3, D(0) ) - + MOVAPS( XMM3, D(0) ) + LLBL(K_GTP2GM_skip): INC_L ( EBP ) ADD_L ( CONST(16), EDI ) @@ -142,7 +142,7 @@ MOV_L( ARG_CLIP, EBP ) /* ptr to clip mask array */ MOV_B( ARG_FLAG, BL ) /* clip mask flags */ - + MOV_L( REGOFF(V4F_STRIDE, ESI), EAX ) /* stride */ OR_L( CONST(VEC_SIZE_2), REGOFF(V4F_FLAGS, EDI) ) /* set dest flags */ @@ -162,12 +162,12 @@ LLBL(K_GTP2IM_top): TEST_B( BL, REGIND(EBP) ) JNZ( LLBL(K_GTP2IM_skip) ) - + MOV_L( S(0), EDX ) MOV_L( EDX, D(0) ) MOV_L( S(1), EDX ) MOV_L( EDX, D(1) ) - + LLBL(K_GTP2IM_skip): INC_L ( EBP ) ADD_L ( CONST(16), EDI ) @@ -199,7 +199,7 @@ MOV_L( ARG_MATRIX, EDX ) /* ptr to matrix */ MOV_L( ARG_CLIP, EBP ) /* ptr to clip mask array */ - + MOV_L( REGOFF(V4F_COUNT, ESI), ECX ) /* source count */ MOV_B( ARG_FLAG, BL ) /* clip mask flags */ @@ -253,7 +253,7 @@ RET #undef FRAME_OFFSET - + ALIGNTEXT4 GLOBL GLNAME(gl_katmai_transform_points2_perspective_masked) GLNAME(gl_katmai_transform_points2_perspective_masked): @@ -269,7 +269,7 @@ MOV_L( ARG_MATRIX, EDX ) /* ptr to matrix */ MOV_L( ARG_CLIP, EBP ) /* ptr to clip mask array */ - + MOV_L( REGOFF(V4F_COUNT, ESI), ECX ) /* source count */ MOV_B( ARG_FLAG, BL ) /* clip mask flags */ @@ -294,18 +294,18 @@ UNPCKLPS ( XMM2, XMM1 ) /* - | - | m5 | m0 */ MOVSS ( M(14), XMM3 ) /* m14 */ XORPS ( XMM0, XMM0 ) /* 0 | 0 | 0 | 0 */ - + ALIGNTEXT32 LLBL(K_GTP23PM_top): TEST_B ( BL, REGIND(EBP) ) JNZ ( LLBL(K_GTP23PM_skip) ) - + MOVLPS( S(0), XMM4 ) /* oy | ox */ MULPS( XMM1, XMM4 ) /* oy*m5 | ox*m0 */ MOVLPS( XMM4, D(0) ) /* ->D(1) | ->D(0) */ MOVSS( XMM3, D(2) ) /* ->D(2) */ MOVSS( XMM0, D(3) ) /* ->D(3) */ - + LLBL(K_GTP23PM_skip): INC_L( EBP ) ADD_L( CONST(16), EDI ) @@ -338,7 +338,7 @@ MOV_L( ARG_MATRIX, EDX ) /* ptr to matrix */ MOV_L( ARG_CLIP, EBP ) /* ptr to clip mask array */ - + MOV_L( REGOFF(V4F_COUNT, ESI), ECX ) /* source count */ MOV_B( ARG_FLAG, BL ) /* clip mask flags */ @@ -361,7 +361,7 @@ MOVLPS( M(0), XMM0 ) /* m1 | m0 */ MOVLPS( M(4), XMM1 ) /* m5 | m4 */ MOVLPS( M(12), XMM2 ) /* m13 | m12 */ - + ALIGNTEXT32 LLBL(K_GTP23P2DM_top): TEST_B( BL, REGIND(EBP) ) @@ -378,7 +378,7 @@ ADDPS( XMM4, XMM3 ) ADDPS( XMM2, XMM3 ) MOVLPS( XMM3, D(0) ) /* ->D(1) | ->D(0) */ - + LLBL(K_GTP23P2DM_skip): INC_L ( EBP ) ADD_L ( CONST(16), EDI ) @@ -411,7 +411,7 @@ MOV_L( ARG_MATRIX, EDX ) /* ptr to matrix */ MOV_L( ARG_CLIP, EBP ) /* ptr to clip mask array */ - + MOV_L( REGOFF(V4F_COUNT, ESI), ECX ) /* source count */ MOV_B( ARG_FLAG, BL ) /* clip mask flags */ @@ -435,7 +435,7 @@ MOVSS ( M(5), XMM2 ) /* m5 */ UNPCKLPS ( XMM2, XMM1 ) /* m5 | m0 */ MOVLPS ( M(12), XMM2 ) /* m13 | m12 */ - + ALIGNTEXT32 LLBL(K_GTP23P2DNRM_top): TEST_B( BL, REGIND(EBP) ) @@ -445,7 +445,7 @@ MULPS( XMM1, XMM0 ) /* oy*m5 | ox*m0 */ ADDPS( XMM2, XMM0 ) /* +m13 | +m12 */ MOVLPS( XMM0, D(0) ) /* ->D(1) | ->D(0) */ - + LLBL(K_GTP23P2DNRM_skip): INC_L( EBP ) ADD_L( CONST(16), EDI ) @@ -478,7 +478,7 @@ MOV_L( ARG_MATRIX, EDX ) /* ptr to matrix */ MOV_L( ARG_CLIP, EBP ) /* ptr to clip mask array */ - + MOV_L( REGOFF(V4F_COUNT, ESI), ECX ) /* source count */ MOV_B( ARG_FLAG, BL ) /* clip mask flags */ @@ -498,11 +498,11 @@ ADD_L( EDI, ECX ) /* count += dest ptr */ ALIGNTEXT32 - MOVUPS( M(0), XMM0 ) /* m2 | m1 | m0 */ - MOVUPS( M(4), XMM1 ) /* m6 | m5 | m4 */ - MOVUPS( M(12), XMM2 ) /* m14 | m13 | m12 */ + MOVAPS( M(0), XMM0 ) /* m2 | m1 | m0 */ + MOVAPS( M(4), XMM1 ) /* m6 | m5 | m4 */ + MOVAPS( M(12), XMM2 ) /* m14 | m13 | m12 */ -ALIGNTEXT32 +ALIGNTEXT32 LLBL(K_GTP23P3DM_top): TEST_B( BL, REGIND(EBP) ) JNZ( LLBL(K_GTP23P3DM_skip) ) @@ -521,7 +521,7 @@ MOVLPS( XMM3, D(0) ) /* ->D(1) | ->D(0) */ UNPCKHPS( XMM3, XMM3 ) MOVSS( XMM3, D(2) ) /* ->D(2) */ - + LLBL(K_GTP23P3DM_skip): INC_L( EBP ) ADD_L( CONST(16), EDI ) Index: xc/extras/Mesa/src/X86/katmai_xform_masked3.S diff -u xc/extras/Mesa/src/X86/katmai_xform_masked3.S:1.2 xc/extras/Mesa/src/X86/katmai_xform_masked3.S:1.6 --- xc/extras/Mesa/src/X86/katmai_xform_masked3.S:1.2 Fri Jun 16 20:02:42 2000 +++ xc/extras/Mesa/src/X86/katmai_xform_masked3.S Mon Nov 13 18:31:12 2000 @@ -3,9 +3,9 @@ * - insert PREFETCH instructions to avoid cache-misses ! * - some more optimizations are possible... * - for 40-50% more performance in the SSE-functions, the - * data (trans-matrix, src_vert, dst_vert) needs to be 16byte aligned ! + * data (trans-matrix, src_vert, dst_vert) needs to be 16byte aligned ! */ - + SEG_TEXT @@ -31,9 +31,9 @@ /* * Offsets for transform_func arguments * - * typedef void (*transform_func)( GLvector4f *to_vec, - * const GLmatrix *mat, - * const GLvector4f *from_vec, + * typedef void (*transform_func)( GLvector4f *to_vec, + * const GLfloat m[16], + * const GLvector4f *from_vec, * const GLubyte *clipmask, * const GLubyte flag ); */ @@ -85,10 +85,10 @@ ALIGNTEXT32 - MOVUPS ( REGOFF(0, EDX), XMM0 ) /* m0 | m1 | m2 | m3 */ - MOVUPS ( REGOFF(16, EDX), XMM1 ) /* m4 | m5 | m6 | m7 */ - MOVUPS ( REGOFF(32, EDX), XMM2 ) /* m8 | m9 | m10 | m11 */ - MOVUPS ( REGOFF(48, EDX), XMM3 ) /* m12 | m13 | m14 | m15 */ + MOVAPS ( REGOFF(0, EDX), XMM0 ) /* m0 | m1 | m2 | m3 */ + MOVAPS ( REGOFF(16, EDX), XMM1 ) /* m4 | m5 | m6 | m7 */ + MOVAPS ( REGOFF(32, EDX), XMM2 ) /* m8 | m9 | m10 | m11 */ + MOVAPS ( REGOFF(48, EDX), XMM3 ) /* m12 | m13 | m14 | m15 */ ALIGNTEXT32 @@ -111,7 +111,7 @@ ADDPS ( XMM6, XMM4 ) ADDPS ( XMM3, XMM4 ) - MOVUPS ( XMM4, REGOFF(0, EDI) ) + MOVAPS ( XMM4, REGOFF(0, EDI) ) LLBL(K_GTPGM_skip): INC_L ( EBP ) @@ -235,7 +235,7 @@ MOVLPS ( M(12), XMM2 ) /* - | - | m13 | m12 */ MOVSS ( M(10), XMM3 ) /* - | - | - | m10 */ MOVSS ( M(14), XMM4 ) /* - | - | - | m14 */ - + ALIGNTEXT32 LLBL(K_GTP3DNRM_top): TEST_B( BL, REGIND(EBP) ) @@ -250,7 +250,7 @@ MULSS ( XMM3, XMM0 ) /* sz*m10 */ ADDSS ( XMM4, XMM0 ) /* +m14 */ MOVSS ( XMM0, D(2) ) /* -> D(2) */ - + LLBL(K_GTP3DNRM_skip): INC_L( EBP ) ADD_L( CONST(16), EDI ) @@ -310,7 +310,7 @@ MOVSS ( M(10), XMM3 ) /* m10 */ MOVSS ( M(14), XMM4 ) /* m14 */ XORPS ( XMM6, XMM6 ) /* 0 */ - + ALIGNTEXT32 LLBL(K_GTP3PM_top): TEST_B ( BL, REGIND(EBP) ) @@ -405,7 +405,7 @@ ADDPS ( XMM4, XMM3 ) ADDPS ( XMM2, XMM3 ) MOVLPS ( XMM3, D(0) ) - + MOVSS ( S(2), XMM3 ) MOVSS ( XMM3, D(2) ) @@ -465,7 +465,7 @@ MOVSS ( M(5), XMM2 ) /* m5 */ UNPCKLPS ( XMM2, XMM1 ) /* m5 | m0 */ MOVLPS ( M(12), XMM2 ) /* m13 | m12 */ - + ALIGNTEXT32 LLBL(K_GTP3P2DNRM_top): TEST_B( BL, REGIND(EBP) ) @@ -478,7 +478,7 @@ MOVSS( S(2), XMM0 ) MOVSS( XMM0, D(2) ) - + LLBL(K_GTP3P2DNRM_skip): INC_L( EBP ) ADD_L( CONST(16), EDI ) @@ -532,16 +532,16 @@ ALIGNTEXT32 - MOVUPS( M(0), XMM0 ) /* m2 | m1 | m0 */ - MOVUPS( M(4), XMM1 ) /* m6 | m5 | m4 */ - MOVUPS( M(8), XMM2 ) /* m10 | m9 | m8 */ - MOVUPS( M(12), XMM3 ) /* m14 | m13 | m12 */ + MOVAPS( M(0), XMM0 ) /* m2 | m1 | m0 */ + MOVAPS( M(4), XMM1 ) /* m6 | m5 | m4 */ + MOVAPS( M(8), XMM2 ) /* m10 | m9 | m8 */ + MOVAPS( M(12), XMM3 ) /* m14 | m13 | m12 */ ALIGNTEXT32 LLBL(K_GTP3P3DM_top): TEST_B( BL, REGIND(EBP) ) JNZ( LLBL(K_GTP3P3DM_skip) ) - + MOVSS( S(0), XMM4 ) SHUFPS( CONST(0x0), XMM4, XMM4 ) /* ox | ox | ox */ MULPS( XMM0, XMM4 ) /* ox*m2 | ox*m1 | ox*m0 */ Index: xc/extras/Mesa/src/X86/katmai_xform_masked4.S diff -u xc/extras/Mesa/src/X86/katmai_xform_masked4.S:1.2 xc/extras/Mesa/src/X86/katmai_xform_masked4.S:1.6 --- xc/extras/Mesa/src/X86/katmai_xform_masked4.S:1.2 Fri Jun 16 20:02:42 2000 +++ xc/extras/Mesa/src/X86/katmai_xform_masked4.S Mon Nov 13 18:31:12 2000 @@ -3,9 +3,9 @@ * - insert PREFETCH instructions to avoid cache-misses ! * - some more optimizations are possible... * - for 40-50% more performance in the SSE-functions, the - * data (trans-matrix, src_vert, dst_vert) needs to be 16byte aligned ! + * data (trans-matrix, src_vert, dst_vert) needs to be 16byte aligned ! */ - + SEG_TEXT @@ -31,9 +31,9 @@ /* * Offsets for transform_func arguments * - * typedef void (*transform_func)( GLvector4f *to_vec, - * const GLmatrix *mat, - * const GLvector4f *from_vec, + * typedef void (*transform_func)( GLvector4f *to_vec, + * const GLfloat m[16], + * const GLvector4f *from_vec, * const GLubyte *clipmask, * const GLubyte flag ); */ @@ -65,7 +65,7 @@ MOV_L( ARG_MATRIX, EDX ) /* ptr to matrix */ MOV_L( ARG_CLIP, EBP ) /* ptr to clip mask array */ - + MOV_L( REGOFF(V4F_COUNT, ESI), ECX ) /* source count */ MOV_B( ARG_FLAG, BL ) /* clip mask flags */ @@ -85,16 +85,16 @@ ADD_L( EDI, ECX ) /* count += dest ptr */ ALIGNTEXT32 - MOVUPS( M(0), XMM0 ) /* m3 | m2 | m1 | m0 */ - MOVUPS( M(4), XMM1 ) /* m7 | m6 | m5 | m4 */ - MOVUPS( M(8), XMM2 ) /* m11 | m10 | m9 | m8 */ - MOVUPS( M(12), XMM3 ) /* m15 | m14 | m13 | m12 */ - + MOVAPS( M(0), XMM0 ) /* m3 | m2 | m1 | m0 */ + MOVAPS( M(4), XMM1 ) /* m7 | m6 | m5 | m4 */ + MOVAPS( M(8), XMM2 ) /* m11 | m10 | m9 | m8 */ + MOVAPS( M(12), XMM3 ) /* m15 | m14 | m13 | m12 */ + ALIGNTEXT32 LLBL(K_GTP4GM_top): TEST_B( BL, REGIND(EBP) ) JNZ( LLBL(K_GTP4GM_skip) ) - + MOVSS( S(0), XMM4 ) /* ox */ SHUFPS( CONST(0x0), XMM4, XMM4 ) /* ox | ox | ox | ox */ MULPS( XMM0, XMM4 ) /* ox*m3 | ox*m2 | ox*m1 | ox*m0 */ @@ -114,7 +114,7 @@ ADDPS( XMM5, XMM4 ) /* ox*m3+oy*m7 | ... */ ADDPS( XMM6, XMM4 ) /* ox*m3+oy*m7+oz*m11 | ... */ ADDPS( XMM7, XMM4 ) /* ox*m3+oy*m7+oz*m11+ow*m15 | ... */ - MOVUPS( XMM4, D(0) ) /* ->D(3) | ->D(2) | ->D(1) | ->D(0) */ + MOVAPS( XMM4, D(0) ) /* ->D(3) | ->D(2) | ->D(1) | ->D(0) */ LLBL(K_GTP4GM_skip): INC_L ( EBP ) @@ -166,7 +166,7 @@ ADD_L( EDI, ECX ) /* count += dest ptr */ MOV_L( EAX, ARG_SOURCE ) - + CMP_L( ESI, EDI ) JE( LLBL(K_GTP4IM_finish) ) @@ -216,7 +216,7 @@ MOV_L( ARG_MATRIX, EDX ) /* ptr to matrix */ MOV_L( ARG_CLIP, EBP ) /* ptr to clip mask array */ - + MOV_L( REGOFF(V4F_COUNT, ESI), ECX ) /* source count */ MOV_B( ARG_FLAG, BL ) /* clip mask flags */ @@ -243,12 +243,12 @@ MOVSS( M(10), XMM1 ) /* m10 */ MOVLPS( M(12), XMM2 ) /* m13 | m12 */ MOVSS( M(14), XMM3 ) /* m14 */ - + ALIGNTEXT32 LLBL(K_GTP43DNRM_top): TEST_B( BL, REGIND(EBP) ) JNZ( LLBL(K_GTP43DNRM_skip) ) - + MOVLPS( S(0), XMM4 ) /* oy | ox */ MULPS( XMM0, XMM4 ) /* oy*m5 | ox*m0 */ MOVSS( S(3), XMM5 ) /* ow */ @@ -296,7 +296,7 @@ MOV_L( ARG_MATRIX, EDX ) /* ptr to matrix */ MOV_L( ARG_CLIP, EBP ) /* ptr to clip mask array */ - + MOV_L( REGOFF(V4F_COUNT, ESI), ECX ) /* source count */ MOV_B( ARG_FLAG, BL ) /* clip mask flags */ @@ -316,17 +316,17 @@ ADD_L( EDI, ECX ) /* count += dest ptr */ +ALIGNTEXT32 + MOVAPS( M(0), XMM0 ) /* m3 | m2 | m1 | m0 */ + MOVAPS( M(4), XMM1 ) /* m7 | m6 | m5 | m4 */ + MOVAPS( M(8), XMM2 ) /* m11 | m10 | m9 | m8 */ + MOVAPS( M(12), XMM3 ) /* m15 | m14 | m13 | m12 */ + ALIGNTEXT32 - MOVUPS( M(0), XMM0 ) /* m3 | m2 | m1 | m0 */ - MOVUPS( M(4), XMM1 ) /* m7 | m6 | m5 | m4 */ - MOVUPS( M(8), XMM2 ) /* m11 | m10 | m9 | m8 */ - MOVUPS( M(12), XMM3 ) /* m15 | m14 | m13 | m12 */ - -ALIGNTEXT32 LLBL(K_GTP43P3DM_top): TEST_B( BL, REGIND(EBP) ) JNZ( LLBL(K_GTP43P3DM_skip) ) - + MOVSS( S(0), XMM4 ) /* ox */ SHUFPS( CONST(0x0), XMM4, XMM4 ) /* ox | ox | ox | ox */ MULPS( XMM0, XMM4 ) /* ox*m3 | ox*m2 | ox*m1 | ox*m0 */ @@ -346,11 +346,11 @@ ADDPS( XMM5, XMM4 ) /* ox*m3+oy*m7 | ... */ ADDPS( XMM6, XMM4 ) /* ox*m3+oy*m7+oz*m11 | ... */ ADDPS( XMM7, XMM4 ) /* ox*m3+oy*m7+oz*m11+ow*m15 | ... */ - MOVUPS( XMM4, D(0) ) /* ->D(3) | ->D(2) | ->D(1) | ->D(0) */ + MOVAPS( XMM4, D(0) ) /* ->D(3) | ->D(2) | ->D(1) | ->D(0) */ MOVSS( S(3), XMM4 ) /* ow */ MOVSS( XMM4, D(3) ) /* ->D(3) */ - + LLBL(K_GTP43P3DM_skip): INC_L( EBP ) ADD_L( CONST(16), EDI ) Index: xc/extras/Mesa/src/X86/katmai_xform_raw1.S diff -u xc/extras/Mesa/src/X86/katmai_xform_raw1.S:1.2 xc/extras/Mesa/src/X86/katmai_xform_raw1.S:1.6 --- xc/extras/Mesa/src/X86/katmai_xform_raw1.S:1.2 Fri Jun 16 20:02:42 2000 +++ xc/extras/Mesa/src/X86/katmai_xform_raw1.S Mon Nov 13 18:31:13 2000 @@ -3,9 +3,9 @@ * - insert PREFETCH instructions to avoid cache-misses ! * - some more optimizations are possible... * - for 40-50% more performance in the SSE-functions, the - * data (trans-matrix, src_vert, dst_vert) needs to be 16byte aligned ! + * data (trans-matrix, src_vert, dst_vert) needs to be 16byte aligned ! */ - + SEG_TEXT @@ -31,9 +31,9 @@ /* * Offsets for transform_func arguments * - * typedef void (*transform_func)( GLvector4f *to_vec, - * const GLmatrix *mat, - * const GLvector4f *from_vec, + * typedef void (*transform_func)( GLvector4f *to_vec, + * const GLfloat m[16], + * const GLvector4f *from_vec, * const GLubyte *clipmask, * const GLubyte flag ); */ @@ -81,8 +81,8 @@ ALIGNTEXT32 - MOVUPS( M(0), XMM0 ) /* m3 | m2 | m1 | m0 */ - MOVUPS( M(12), XMM1 ) /* m15 | m14 | m13 | m12 */ + MOVAPS( M(0), XMM0 ) /* m3 | m2 | m1 | m0 */ + MOVAPS( M(12), XMM1 ) /* m15 | m14 | m13 | m12 */ ALIGNTEXT32 LLBL(K_GTP1GR_top): @@ -142,7 +142,7 @@ LLBL(K_GTP1IR_top): MOV_L( S(0), EDX ) MOV_L( EDX, D(0) ) - + LLBL(K_GTP1IR_skip): ADD_L ( CONST(16), EDI ) ADD_L ( EAX, ESI ) @@ -192,7 +192,7 @@ MOVSS( M(12), XMM1 ) /* m12 */ MOVSS( M(13), XMM2 ) /* m13 */ MOVSS( M(14), XMM3 ) /* m14 */ - + ALIGNTEXT32 LLBL(K_GTP13DNRR_top): MOVSS( S(0), XMM4 ) /* ox */ @@ -214,8 +214,8 @@ POP_L ( ESI ) RET #undef FRAME_OFFSET + - ALIGNTEXT4 GLOBL GLNAME(gl_katmai_transform_points1_perspective_raw) @@ -251,7 +251,7 @@ XORPS( XMM0, XMM0 ) /* 0 | 0 | 0 | 0 */ MOVSS( M(0), XMM1 ) /* m0 */ MOVSS( M(14), XMM2 ) /* m14 */ - + ALIGNTEXT32 LLBL(K_GTP13PR_top): MOVSS( S(0), XMM3 ) /* ox */ @@ -261,7 +261,7 @@ MOVSS( XMM0, D(1) ) MOVSS( XMM0, D(3) ) - + LLBL(K_GTP13PR_skip): ADD_L( CONST(16), EDI ) ADD_L( EAX, ESI ) @@ -307,7 +307,7 @@ ALIGNTEXT32 MOVLPS( M(0), XMM0 ) /* m1 | m0 */ MOVLPS( M(12), XMM1 ) /* m13 | m12 */ - + ALIGNTEXT32 LLBL(K_GTP13P2DR_top): MOVSS( S(0), XMM2 ) /* ox */ @@ -315,7 +315,7 @@ MULPS( XMM0, XMM2 ) /* - | - | ox*m1 | ox*m0 */ ADDPS( XMM1, XMM2 ) /* - | - | ox*m1+m13 | ox*m0+m12 */ MOVLPS( XMM2, D(0) ) - + LLBL(K_GTP13P2DR_skip): ADD_L ( CONST(16), EDI ) ADD_L ( EAX, ESI ) @@ -362,7 +362,7 @@ MOVSS( M(0), XMM0 ) /* m0 */ MOVSS( M(12), XMM1 ) /* m12 */ MOVSS( M(13), XMM2 ) /* m13 */ - + ALIGNTEXT32 LLBL(K_GTP13P2DNRR_top): MOVSS( S(0), XMM3 ) /* ox */ @@ -370,7 +370,7 @@ ADDSS( XMM1, XMM3 ) /* ox*m0+m12 */ MOVSS( XMM3, D(0) ) MOVSS( XMM2, D(1) ) - + LLBL(K_GTP13P2DNRR_skip): ADD_L( CONST(16), EDI ) ADD_L( EAX, ESI ) @@ -416,10 +416,10 @@ ALIGNTEXT32 - MOVUPS( M(0), XMM0 ) /* m3 | m2 | m1 | m0 */ - MOVUPS( M(12), XMM1 ) /* m15 | m14 | m13 | m12 */ - -ALIGNTEXT32 + MOVAPS( M(0), XMM0 ) /* m3 | m2 | m1 | m0 */ + MOVAPS( M(12), XMM1 ) /* m15 | m14 | m13 | m12 */ + +ALIGNTEXT32 LLBL(K_GTP13P3DR_top): MOVSS( S(0), XMM2 ) /* ox */ SHUFPS( CONST(0x0), XMM2, XMM2 ) /* ox | ox | ox | ox */ @@ -428,7 +428,7 @@ MOVLPS( XMM2, D(0) ) /* - | - | ->D(1)| ->D(0)*/ UNPCKHPS( XMM2, XMM2 ) /* ox*m3+m15 | ox*m3+m15 | ox*m2+m14 | ox*m2+m14 */ MOVSS( XMM2, D(2) ) - + LLBL(K_GTP13P3DR_skip): ADD_L( CONST(16), EDI ) ADD_L( EAX, ESI ) Index: xc/extras/Mesa/src/X86/katmai_xform_raw2.S diff -u xc/extras/Mesa/src/X86/katmai_xform_raw2.S:1.2 xc/extras/Mesa/src/X86/katmai_xform_raw2.S:1.6 --- xc/extras/Mesa/src/X86/katmai_xform_raw2.S:1.2 Fri Jun 16 20:02:42 2000 +++ xc/extras/Mesa/src/X86/katmai_xform_raw2.S Mon Nov 13 18:31:13 2000 @@ -3,9 +3,9 @@ * - insert PREFETCH instructions to avoid cache-misses ! * - some more optimizations are possible... * - for 40-50% more performance in the SSE-functions, the - * data (trans-matrix, src_vert, dst_vert) needs to be 16byte aligned ! + * data (trans-matrix, src_vert, dst_vert) needs to be 16byte aligned ! */ - + SEG_TEXT @@ -31,9 +31,9 @@ /* * Offsets for transform_func arguments * - * typedef void (*transform_func)( GLvector4f *to_vec, - * const GLmatrix *mat, - * const GLvector4f *from_vec, + * typedef void (*transform_func)( GLvector4f *to_vec, + * const GLfloat m[16], + * const GLvector4f *from_vec, * const GLubyte *clipmask, * const GLubyte flag ); */ @@ -57,7 +57,7 @@ #define FRAME_OFFSET 8 PUSH_L ( ESI ) PUSH_L ( EDI ) - + MOV_L( REGOFF(OFFSET_SOURCE+8, ESP), ESI ) /* ptr to source GLvector4f */ MOV_L( REGOFF(OFFSET_DEST+8, ESP), EDI ) /* ptr to dest GLvector4f */ @@ -66,7 +66,7 @@ TEST_L( ECX, ECX ) JZ( LLBL(K_GTP2GR_finish) ) /* count was zero; go to finish */ - + MOV_L( REGOFF(V4F_STRIDE, ESI), EAX ) /* stride */ OR_L( CONST(VEC_SIZE_4), REGOFF(V4F_FLAGS, EDI) ) /* set dest flags */ @@ -80,9 +80,9 @@ ADD_L( EDI, ECX ) /* count += dest ptr */ ALIGNTEXT32 - MOVUPS( M(0), XMM0 ) /* m3 | m2 | m1 | m0 */ - MOVUPS( M(4), XMM1 ) /* m7 | m6 | m5 | m4 */ - MOVUPS( M(12), XMM2 ) /* m15 | m14 | m13 | m12 */ + MOVAPS( M(0), XMM0 ) /* m3 | m2 | m1 | m0 */ + MOVAPS( M(4), XMM1 ) /* m7 | m6 | m5 | m4 */ + MOVAPS( M(12), XMM2 ) /* m15 | m14 | m13 | m12 */ ALIGNTEXT32 LLBL(K_GTP2GR_top): @@ -95,8 +95,8 @@ ADDPS( XMM4, XMM3 ) ADDPS( XMM2, XMM3 ) - MOVUPS( XMM3, D(0) ) - + MOVAPS( XMM3, D(0) ) + LLBL(K_GTP2GR_skip): ADD_L ( CONST(16), EDI ) ADD_L ( EAX, ESI ) @@ -148,7 +148,7 @@ MOV_L ( EDX, D(0) ) MOV_L ( S(1), EDX ) MOV_L ( EDX, D(1) ) - + LLBL(K_GTP2IR_skip): ADD_L ( CONST(16), EDI ) ADD_L ( EAX, ESI ) @@ -198,7 +198,7 @@ UNPCKLPS ( XMM2, XMM1 ) /* - | - | m5 | m0 */ MOVLPS ( M(12), XMM2 ) /* - | - | m13 | m12 */ MOVSS ( M(14), XMM3 ) /* - | - | - | m14 */ - + ALIGNTEXT32 LLBL(K_GTP23DNRR_top): MOVLPS ( S(0), XMM0 ) /* - | - | oy | ox */ @@ -220,7 +220,7 @@ RET #undef FRAME_OFFSET - + ALIGNTEXT4 GLOBL GLNAME(gl_katmai_transform_points2_perspective_raw) GLNAME(gl_katmai_transform_points2_perspective_raw): @@ -256,7 +256,7 @@ UNPCKLPS ( XMM2, XMM1 ) /* - | - | m5 | m0 */ MOVSS ( M(14), XMM3 ) /* m14 */ XORPS ( XMM0, XMM0 ) /* 0 | 0 | 0 | 0 */ - + ALIGNTEXT32 LLBL(K_GTP23PR_top): MOVLPS( S(0), XMM4 ) /* oy | ox */ @@ -264,7 +264,7 @@ MOVLPS( XMM4, D(0) ) /* ->D(1) | ->D(0) */ MOVSS( XMM3, D(2) ) /* ->D(2) */ MOVSS( XMM0, D(3) ) /* ->D(3) */ - + LLBL(K_GTP23PR_skip): ADD_L( CONST(16), EDI ) ADD_L( EAX, ESI ) @@ -312,7 +312,7 @@ MOVLPS( M(0), XMM0 ) /* m1 | m0 */ MOVLPS( M(4), XMM1 ) /* m5 | m4 */ MOVLPS( M(12), XMM2 ) /* m13 | m12 */ - + ALIGNTEXT32 LLBL(K_GTP23P2DR_top): MOVSS( S(0), XMM3 ) /* ox */ @@ -375,14 +375,14 @@ MOVSS ( M(5), XMM2 ) /* m5 */ UNPCKLPS ( XMM2, XMM1 ) /* m5 | m0 */ MOVLPS ( M(12), XMM2 ) /* m13 | m12 */ - + ALIGNTEXT32 LLBL(K_GTP23P2DNRR_top): MOVLPS( S(0), XMM0 ) /* oy | ox */ MULPS( XMM1, XMM0 ) /* oy*m5 | ox*m0 */ ADDPS( XMM2, XMM0 ) /* +m13 | +m12 */ MOVLPS( XMM0, D(0) ) /* ->D(1) | ->D(0) */ - + LLBL(K_GTP23P2DNRR_skip): ADD_L( CONST(16), EDI ) ADD_L( EAX, ESI ) @@ -427,11 +427,11 @@ ADD_L( EDI, ECX ) /* count += dest ptr */ ALIGNTEXT32 - MOVUPS( M(0), XMM0 ) /* m2 | m1 | m0 */ - MOVUPS( M(4), XMM1 ) /* m6 | m5 | m4 */ - MOVUPS( M(12), XMM2 ) /* m14 | m13 | m12 */ + MOVAPS( M(0), XMM0 ) /* m2 | m1 | m0 */ + MOVAPS( M(4), XMM1 ) /* m6 | m5 | m4 */ + MOVAPS( M(12), XMM2 ) /* m14 | m13 | m12 */ -ALIGNTEXT32 +ALIGNTEXT32 LLBL(K_GTP23P3DR_top): MOVSS( S(0), XMM3 ) /* ox */ SHUFPS( CONST(0x0), XMM3, XMM3 ) /* ox | ox | ox */ @@ -447,7 +447,7 @@ MOVLPS( XMM3, D(0) ) /* ->D(1) | ->D(0) */ UNPCKHPS( XMM3, XMM3 ) MOVSS( XMM3, D(2) ) /* ->D(2) */ - + LLBL(K_GTP23P3DR_skip): ADD_L( CONST(16), EDI ) ADD_L( EAX, ESI ) @@ -459,5 +459,3 @@ POP_L( ESI ) RET #undef FRAME_OFFSET - - Index: xc/extras/Mesa/src/X86/katmai_xform_raw3.S diff -u xc/extras/Mesa/src/X86/katmai_xform_raw3.S:1.2 xc/extras/Mesa/src/X86/katmai_xform_raw3.S:1.6 --- xc/extras/Mesa/src/X86/katmai_xform_raw3.S:1.2 Fri Jun 16 20:02:42 2000 +++ xc/extras/Mesa/src/X86/katmai_xform_raw3.S Mon Nov 13 18:31:14 2000 @@ -3,9 +3,9 @@ * - insert PREFETCH instructions to avoid cache-misses ! * - some more optimizations are possible... * - for 40-50% more performance in the SSE-functions, the - * data (trans-matrix, src_vert, dst_vert) needs to be 16byte aligned ! + * data (trans-matrix, src_vert, dst_vert) needs to be 16byte aligned ! */ - + SEG_TEXT @@ -31,9 +31,9 @@ /* * Offsets for transform_func arguments * - * typedef void (*transform_func)( GLvector4f *to_vec, - * const GLmatrix *mat, - * const GLvector4f *from_vec, + * typedef void (*transform_func)( GLvector4f *to_vec, + * const GLfloat m[16], + * const GLvector4f *from_vec, * const GLubyte *clipmask, * const GLubyte flag ); */ @@ -81,10 +81,10 @@ ALIGNTEXT32 - MOVUPS ( REGOFF(0, EDX), XMM0 ) /* m0 | m1 | m2 | m3 */ - MOVUPS ( REGOFF(16, EDX), XMM1 ) /* m4 | m5 | m6 | m7 */ - MOVUPS ( REGOFF(32, EDX), XMM2 ) /* m8 | m9 | m10 | m11 */ - MOVUPS ( REGOFF(48, EDX), XMM3 ) /* m12 | m13 | m14 | m15 */ + MOVAPS ( REGOFF(0, EDX), XMM0 ) /* m0 | m1 | m2 | m3 */ + MOVAPS ( REGOFF(16, EDX), XMM1 ) /* m4 | m5 | m6 | m7 */ + MOVAPS ( REGOFF(32, EDX), XMM2 ) /* m8 | m9 | m10 | m11 */ + MOVAPS ( REGOFF(48, EDX), XMM3 ) /* m12 | m13 | m14 | m15 */ ALIGNTEXT32 @@ -104,7 +104,7 @@ ADDPS ( XMM6, XMM4 ) ADDPS ( XMM3, XMM4 ) - MOVUPS ( XMM4, REGOFF(0, EDI) ) + MOVAPS ( XMM4, REGOFF(0, EDI) ) LLBL(K_GTPGR_skip): ADD_L ( CONST(16), EDI ) @@ -236,8 +236,8 @@ POP_L ( ESI ) RET #undef FRAME_OFFSET + - ALIGNTEXT4 GLOBL GLNAME(gl_katmai_transform_points3_perspective_raw) @@ -276,7 +276,7 @@ MOVSS ( M(10), XMM3 ) /* m10 */ MOVSS ( M(14), XMM4 ) /* m14 */ XORPS ( XMM6, XMM6 ) /* 0 */ - + ALIGNTEXT32 LLBL(K_GTP3PR_top): MOVLPS ( S(0), XMM0 ) /* oy | ox */ @@ -344,7 +344,7 @@ MOVLPS( M(0), XMM0 ) /* m1 | m0 */ MOVLPS( M(4), XMM1 ) /* m5 | m4 */ MOVLPS( M(12), XMM2 ) /* m13 | m12 */ - + ALIGNTEXT32 LLBL(K_GTP3P2DR_top): MOVSS ( S(0), XMM3 ) /* ox */ @@ -357,7 +357,7 @@ ADDPS ( XMM4, XMM3 ) ADDPS ( XMM2, XMM3 ) MOVLPS ( XMM3, D(0) ) - + MOVSS ( S(2), XMM3 ) MOVSS ( XMM3, D(2) ) @@ -409,14 +409,14 @@ MOVSS ( M(5), XMM2 ) /* m5 */ UNPCKLPS ( XMM2, XMM1 ) /* m5 | m0 */ MOVLPS ( M(12), XMM2 ) /* m13 | m12 */ - + ALIGNTEXT32 LLBL(K_GTP3P2DNRR_top): MOVLPS( S(0), XMM0 ) /* oy | ox */ MULPS( XMM1, XMM0 ) /* oy*m5 | ox*m0 */ ADDPS( XMM2, XMM0 ) /* +m13 | +m12 */ MOVLPS( XMM0, D(0) ) /* ->D(1) | ->D(0) */ - + MOVSS( S(2), XMM0 ) MOVSS( XMM0, D(2) ) @@ -467,12 +467,12 @@ ALIGNTEXT32 - MOVUPS( M(0), XMM0 ) /* m2 | m1 | m0 */ - MOVUPS( M(4), XMM1 ) /* m6 | m5 | m4 */ - MOVUPS( M(8), XMM2 ) /* m10 | m9 | m8 */ - MOVUPS( M(12), XMM3 ) /* m14 | m13 | m12 */ + MOVAPS( M(0), XMM0 ) /* m2 | m1 | m0 */ + MOVAPS( M(4), XMM1 ) /* m6 | m5 | m4 */ + MOVAPS( M(8), XMM2 ) /* m10 | m9 | m8 */ + MOVAPS( M(12), XMM3 ) /* m14 | m13 | m12 */ -ALIGNTEXT32 +ALIGNTEXT32 LLBL(K_GTP3P3DR_top): MOVSS( S(0), XMM4 ) SHUFPS( CONST(0x0), XMM4, XMM4 ) /* ox | ox | ox */ @@ -505,5 +505,3 @@ POP_L( ESI ) RET #undef FRAME_OFFSET - - Index: xc/extras/Mesa/src/X86/katmai_xform_raw4.S diff -u xc/extras/Mesa/src/X86/katmai_xform_raw4.S:1.2 xc/extras/Mesa/src/X86/katmai_xform_raw4.S:1.6 --- xc/extras/Mesa/src/X86/katmai_xform_raw4.S:1.2 Fri Jun 16 20:02:42 2000 +++ xc/extras/Mesa/src/X86/katmai_xform_raw4.S Mon Nov 13 18:31:16 2000 @@ -3,195 +3,191 @@ * - insert PREFETCH instructions to avoid cache-misses ! * - some more optimizations are possible... * - for 40-50% more performance in the SSE-functions, the - * data (trans-matrix, src_vert, dst_vert) needs to be 16byte aligned ! + * data (trans-matrix, src_vert, dst_vert) needs to be 16byte aligned ! */ - - SEG_TEXT + SEG_TEXT -#define S(i) REGOFF(i * 4, ESI) -#define D(i) REGOFF(i * 4, EDI) -#define M(i) REGOFF(i * 4, EDX) +#define S(i) REGOFF(i * 4, ESI) +#define D(i) REGOFF(i * 4, EDI) +#define M(i) REGOFF(i * 4, EDX) + /* - * Offsets into GLvector4f + * Offsets into GLvector4f */ -#define V4F_DATA 0 -#define V4F_START 4 -#define V4F_COUNT 8 -#define V4F_STRIDE 12 -#define V4F_SIZE 16 -#define V4F_FLAGS 20 - -#define VEC_SIZE_1 1 -#define VEC_SIZE_2 3 -#define VEC_SIZE_3 7 -#define VEC_SIZE_4 15 +#define V4F_DATA 0 +#define V4F_START 4 +#define V4F_COUNT 8 +#define V4F_STRIDE 12 +#define V4F_SIZE 16 +#define V4F_FLAGS 20 + +#define VEC_SIZE_1 1 +#define VEC_SIZE_2 3 +#define VEC_SIZE_3 7 +#define VEC_SIZE_4 15 /* * Offsets for transform_func arguments * - * typedef void (*transform_func)( GLvector4f *to_vec, - * const GLmatrix *mat, - * const GLvector4f *from_vec, + * typedef void (*transform_func)( GLvector4f *to_vec, + * const GLfloat m[16], + * const GLvector4f *from_vec, * const GLubyte *clipmask, * const GLubyte flag ); */ -#define OFFSET_DEST 4 -#define OFFSET_MATRIX 8 -#define OFFSET_SOURCE 12 -#define OFFSET_CLIP 16 -#define OFFSET_FLAG 20 - -#define ARG_DEST REGOFF(FRAME_OFFSET+OFFSET_DEST, ESP) -#define ARG_MATRIX REGOFF(FRAME_OFFSET+OFFSET_MATRIX, ESP) -#define ARG_SOURCE REGOFF(FRAME_OFFSET+OFFSET_SOURCE, ESP) -#define ARG_CLIP REGOFF(FRAME_OFFSET+OFFSET_CLIP, ESP) -#define ARG_FLAG REGOFF(FRAME_OFFSET+OFFSET_FLAG, ESP) +#define OFFSET_DEST 4 +#define OFFSET_MATRIX 8 +#define OFFSET_SOURCE 12 +#define OFFSET_CLIP 16 +#define OFFSET_FLAG 20 + +#define ARG_DEST REGOFF(FRAME_OFFSET+OFFSET_DEST, ESP) +#define ARG_MATRIX REGOFF(FRAME_OFFSET+OFFSET_MATRIX, ESP) +#define ARG_SOURCE REGOFF(FRAME_OFFSET+OFFSET_SOURCE, ESP) +#define ARG_CLIP REGOFF(FRAME_OFFSET+OFFSET_CLIP, ESP) +#define ARG_FLAG REGOFF(FRAME_OFFSET+OFFSET_FLAG, ESP) ALIGNTEXT4 -GLOBL GLNAME(gl_katmai_transform_points4_general_raw) +GLOBL GLNAME( gl_katmai_transform_points4_general_raw ) GLNAME( gl_katmai_transform_points4_general_raw ): #define FRAME_OFFSET 8 - PUSH_L ( ESI ) - PUSH_L ( EDI ) + PUSH_L( ESI ) + PUSH_L( EDI ) - MOV_L( REGOFF(OFFSET_SOURCE+8, ESP), ESI ) /* ptr to source GLvector4f */ - MOV_L( REGOFF(OFFSET_DEST+8, ESP), EDI ) /* ptr to dest GLvector4f */ + MOV_L( ARG_SOURCE, ESI ) /* ptr to source GLvector4f */ + MOV_L( ARG_DEST, EDI ) /* ptr to dest GLvector4f */ - MOV_L( ARG_MATRIX, EDX ) /* ptr to matrix */ - MOV_L( REGOFF(V4F_COUNT, ESI), ECX ) /* source count */ + MOV_L( ARG_MATRIX, EDX ) /* ptr to matrix */ + MOV_L( REGOFF(V4F_COUNT, ESI), ECX ) /* source count */ - CMP_L( CONST(0), ECX ) /* count == 0 ? */ - JE( LLBL(K_GTP4GR_finish) ) /* yes -> nothing to do. */ + CMP_L( CONST(0), ECX ) /* count == 0 ? */ + JE( LLBL(K_GTP4GR_finish) ) /* yes -> nothing to do. */ - MOV_L( REGOFF(V4F_STRIDE, ESI), EAX ) /* stride */ - OR_L( CONST(VEC_SIZE_4), REGOFF(V4F_FLAGS, EDI) ) /* set dest flags */ + MOV_L( REGOFF(V4F_STRIDE, ESI), EAX ) /* stride */ + OR_L( CONST(VEC_SIZE_4), REGOFF(V4F_FLAGS, EDI) ) /* set dest flags */ - MOV_L( ECX, REGOFF(V4F_COUNT, EDI) ) /* set dest count */ - MOV_L( CONST(4), REGOFF(V4F_SIZE, EDI) ) /* set dest size */ + MOV_L( ECX, REGOFF(V4F_COUNT, EDI) ) /* set dest count */ + MOV_L( CONST(4), REGOFF(V4F_SIZE, EDI) )/* set dest size */ - SHL_L( CONST(4), ECX ) /* count *= 16 */ - MOV_L( REGOFF(V4F_START, ESI), ESI ) /* ptr to first source vertex */ + SHL_L( CONST(4), ECX ) /* count *= 16 */ + MOV_L( REGOFF(V4F_START, ESI), ESI ) /* ptr to first source vertex */ - MOV_L( REGOFF(V4F_START, EDI), EDI ) /* ptr to first dest vertex */ - ADD_L( EDI, ECX ) /* count += dest ptr */ + MOV_L( REGOFF(V4F_START, EDI), EDI ) /* ptr to first dest vertex */ + ADD_L( EDI, ECX ) /* count += dest ptr */ -ALIGNTEXT32 - MOVUPS( M(0), XMM0 ) /* m3 | m2 | m1 | m0 */ - MOVUPS( M(4), XMM1 ) /* m7 | m6 | m5 | m4 */ - MOVUPS( M(8), XMM2 ) /* m11 | m10 | m9 | m8 */ - MOVUPS( M(12), XMM3 ) /* m15 | m14 | m13 | m12 */ - + MOVAPS( M(0), XMM0 ) /* m3 | m2 | m1 | m0 */ + MOVAPS( M(4), XMM1 ) /* m7 | m6 | m5 | m4 */ + MOVAPS( M(8), XMM2 ) /* m11 | m10 | m9 | m8 */ + MOVAPS( M(12), XMM3 ) /* m15 | m14 | m13 | m12 */ + ALIGNTEXT32 -LLBL(K_GTP4GR_top): - MOVSS( S(0), XMM4 ) /* ox */ - SHUFPS( CONST(0x0), XMM4, XMM4 ) /* ox | ox | ox | ox */ - MULPS( XMM0, XMM4 ) /* ox*m3 | ox*m2 | ox*m1 | ox*m0 */ - - MOVSS( S(1), XMM5 ) /* oy */ - SHUFPS( CONST(0x0), XMM5, XMM5 ) /* oy | oy | oy | oy */ - MULPS( XMM1, XMM5 ) /* oy*m7 | oy*m6 | oy*m5 | oy*m4 */ - - MOVSS( S(2), XMM6 ) /* oz */ - SHUFPS( CONST(0x0), XMM6, XMM6 ) /* oz | oz | oz | oz */ - MULPS( XMM2, XMM6 ) /* oz*m11 | oz*m10 | oz*m9 | oz*m8 */ - - MOVSS( S(3), XMM7 ) /* ow */ - SHUFPS( CONST(0x0), XMM7, XMM7 ) /* ow | ow | ow | ow */ - MULPS( XMM3, XMM7 ) /* ow*m15 | ow*m14 | ow*m13 | ow*m12 */ - - ADDPS( XMM5, XMM4 ) /* ox*m3+oy*m7 | ... */ - ADDPS( XMM6, XMM4 ) /* ox*m3+oy*m7+oz*m11 | ... */ - ADDPS( XMM7, XMM4 ) /* ox*m3+oy*m7+oz*m11+ow*m15 | ... */ - MOVUPS( XMM4, D(0) ) /* ->D(3) | ->D(2) | ->D(1) | ->D(0) */ - -LLBL(K_GTP4GR_skip): - ADD_L ( CONST(16), EDI ) - ADD_L ( EAX, ESI ) - CMP_L ( ECX, EDI ) - JNE ( LLBL(K_GTP4GR_top) ) - -LLBL(K_GTP4GR_finish): - POP_L ( EDI ) - POP_L ( ESI ) +LLBL( K_GTP4GR_top ): + MOVSS( S(0), XMM4 ) /* ox */ + SHUFPS( CONST(0x0), XMM4, XMM4 ) /* ox | ox | ox | ox */ + MULPS( XMM0, XMM4 ) /* ox*m3 | ox*m2 | ox*m1 | ox*m0 */ + + MOVSS( S(1), XMM5 ) /* oy */ + SHUFPS( CONST(0x0), XMM5, XMM5 ) /* oy | oy | oy | oy */ + MULPS( XMM1, XMM5 ) /* oy*m7 | oy*m6 | oy*m5 | oy*m4 */ + + MOVSS( S(2), XMM6 ) /* oz */ + SHUFPS( CONST(0x0), XMM6, XMM6 ) /* oz | oz | oz | oz */ + MULPS( XMM2, XMM6 ) /* oz*m11 | oz*m10 | oz*m9 | oz*m8 */ + + MOVSS( S(3), XMM7 ) /* ow */ + SHUFPS( CONST(0x0), XMM7, XMM7 ) /* ow | ow | ow | ow */ + MULPS( XMM3, XMM7 ) /* ow*m15 | ow*m14 | ow*m13 | ow*m12 */ + + ADDPS( XMM5, XMM4 ) /* ox*m3+oy*m7 | ... */ + ADDPS( XMM6, XMM4 ) /* ox*m3+oy*m7+oz*m11 | ... */ + ADDPS( XMM7, XMM4 ) /* ox*m3+oy*m7+oz*m11+ow*m15 | ... */ + MOVAPS( XMM4, D(0) ) /* ->D(3) | ->D(2) | ->D(1) | ->D(0) */ + +LLBL( K_GTP4GR_skip ): + ADD_L( CONST(16), EDI ) + ADD_L( EAX, ESI ) + CMP_L( ECX, EDI ) + JNE( LLBL(K_GTP4GR_top) ) + +LLBL( K_GTP4GR_finish ): + POP_L( EDI ) + POP_L( ESI ) RET #undef FRAME_OFFSET ALIGNTEXT4 -GLOBL GLNAME(gl_katmai_transform_points4_3d_raw) -GLNAME(gl_katmai_transform_points4_3d_raw): +GLOBL GLNAME( gl_katmai_transform_points4_3d_raw ) +GLNAME( gl_katmai_transform_points4_3d_raw ): #define FRAME_OFFSET 8 PUSH_L( ESI ) PUSH_L( EDI ) - MOV_L( REGOFF(OFFSET_SOURCE+8, ESP), ESI ) /* ptr to source GLvector4f */ - MOV_L( REGOFF(OFFSET_DEST+8, ESP), EDI ) /* ptr to dest GLvector4f */ + MOV_L( ARG_SOURCE, ESI ) /* ptr to source GLvector4f */ + MOV_L( ARG_DEST, EDI ) /* ptr to dest GLvector4f */ - MOV_L( ARG_MATRIX, EDX ) /* ptr to matrix */ - MOV_L( REGOFF(V4F_COUNT, ESI), ECX ) /* source count */ + MOV_L( ARG_MATRIX, EDX ) /* ptr to matrix */ + MOV_L( REGOFF(V4F_COUNT, ESI), ECX ) /* source count */ TEST_L( ECX, ECX) - JZ( LLBL(K_GTP43P3DR_finish) ) /* count was zero; go to finish */ + JZ( LLBL(K_GTP43P3DR_finish) ) /* count was zero; go to finish */ - MOV_L( REGOFF(V4F_STRIDE, ESI), EAX ) /* stride */ - OR_L( CONST(VEC_SIZE_3), REGOFF(V4F_FLAGS, EDI) ) /* set dest flags */ + MOV_L( REGOFF(V4F_STRIDE, ESI), EAX ) /* stride */ + OR_L( CONST(VEC_SIZE_3), REGOFF(V4F_FLAGS, EDI) ) /* set dest flags */ - MOV_L( ECX, REGOFF(V4F_COUNT, EDI) ) /* set dest count */ - MOV_L( CONST(3), REGOFF(V4F_SIZE, EDI) ) /* set dest size */ + MOV_L( ECX, REGOFF(V4F_COUNT, EDI) ) /* set dest count */ + MOV_L( CONST(3), REGOFF(V4F_SIZE, EDI) )/* set dest size */ - SHL_L( CONST(4), ECX ) /* count *= 16 */ - MOV_L( REGOFF(V4F_START, ESI), ESI ) /* ptr to first source vertex */ + SHL_L( CONST(4), ECX ) /* count *= 16 */ + MOV_L( REGOFF(V4F_START, ESI), ESI ) /* ptr to first source vertex */ - MOV_L( REGOFF(V4F_START, EDI), EDI ) /* ptr to first dest vertex */ - ADD_L( EDI, ECX ) /* count += dest ptr */ + MOV_L( REGOFF(V4F_START, EDI), EDI ) /* ptr to first dest vertex */ + ADD_L( EDI, ECX ) /* count += dest ptr */ + MOVAPS( M(0), XMM0 ) /* m3 | m2 | m1 | m0 */ + MOVAPS( M(4), XMM1 ) /* m7 | m6 | m5 | m4 */ + MOVAPS( M(8), XMM2 ) /* m11 | m10 | m9 | m8 */ + MOVAPS( M(12), XMM3 ) /* m15 | m14 | m13 | m12 */ ALIGNTEXT32 - MOVUPS( M(0), XMM0 ) /* m3 | m2 | m1 | m0 */ - MOVUPS( M(4), XMM1 ) /* m7 | m6 | m5 | m4 */ - MOVUPS( M(8), XMM2 ) /* m11 | m10 | m9 | m8 */ - MOVUPS( M(12), XMM3 ) /* m15 | m14 | m13 | m12 */ - -ALIGNTEXT32 -LLBL(K_GTP43P3DR_top): - MOVSS( S(0), XMM4 ) /* ox */ - SHUFPS( CONST(0x0), XMM4, XMM4 ) /* ox | ox | ox | ox */ - MULPS( XMM0, XMM4 ) /* ox*m3 | ox*m2 | ox*m1 | ox*m0 */ - - MOVSS( S(1), XMM5 ) /* oy */ - SHUFPS( CONST(0x0), XMM5, XMM5 ) /* oy | oy | oy | oy */ - MULPS( XMM1, XMM5 ) /* oy*m7 | oy*m6 | oy*m5 | oy*m4 */ - - MOVSS( S(2), XMM6 ) /* oz */ - SHUFPS( CONST(0x0), XMM6, XMM6 ) /* oz | oz | oz | oz */ - MULPS( XMM2, XMM6 ) /* oz*m11 | oz*m10 | oz*m9 | oz*m8 */ - - MOVSS( S(3), XMM7 ) /* ow */ - SHUFPS( CONST(0x0), XMM7, XMM7 ) /* ow | ow | ow | ow */ - MULPS( XMM3, XMM7 ) /* ow*m15 | ow*m14 | ow*m13 | ow*m12 */ - - ADDPS( XMM5, XMM4 ) /* ox*m3+oy*m7 | ... */ - ADDPS( XMM6, XMM4 ) /* ox*m3+oy*m7+oz*m11 | ... */ - ADDPS( XMM7, XMM4 ) /* ox*m3+oy*m7+oz*m11+ow*m15 | ... */ - MOVUPS( XMM4, D(0) ) /* ->D(3) | ->D(2) | ->D(1) | ->D(0) */ - - MOVSS( S(3), XMM4 ) /* ow */ - MOVSS( XMM4, D(3) ) /* ->D(3) */ - -LLBL(K_GTP43P3DR_skip): +LLBL( K_GTP43P3DR_top ): + MOVSS( S(0), XMM4 ) /* ox */ + SHUFPS( CONST(0x0), XMM4, XMM4 ) /* ox | ox | ox | ox */ + MULPS( XMM0, XMM4 ) /* ox*m3 | ox*m2 | ox*m1 | ox*m0 */ + + MOVSS( S(1), XMM5 ) /* oy */ + SHUFPS( CONST(0x0), XMM5, XMM5 ) /* oy | oy | oy | oy */ + MULPS( XMM1, XMM5 ) /* oy*m7 | oy*m6 | oy*m5 | oy*m4 */ + + MOVSS( S(2), XMM6 ) /* oz */ + SHUFPS( CONST(0x0), XMM6, XMM6 ) /* oz | oz | oz | oz */ + MULPS( XMM2, XMM6 ) /* oz*m11 | oz*m10 | oz*m9 | oz*m8 */ + + MOVSS( S(3), XMM7 ) /* ow */ + SHUFPS( CONST(0x0), XMM7, XMM7 ) /* ow | ow | ow | ow */ + MULPS( XMM3, XMM7 ) /* ow*m15 | ow*m14 | ow*m13 | ow*m12 */ + + ADDPS( XMM5, XMM4 ) /* ox*m3+oy*m7 | ... */ + ADDPS( XMM6, XMM4 ) /* ox*m3+oy*m7+oz*m11 | ... */ + ADDPS( XMM7, XMM4 ) /* ox*m3+oy*m7+oz*m11+ow*m15 | ... */ + MOVAPS( XMM4, D(0) ) /* ->D(3) | ->D(2) | ->D(1) | ->D(0) */ + + MOVSS( S(3), XMM4 ) /* ow */ + MOVSS( XMM4, D(3) ) /* ->D(3) */ + +LLBL( K_GTP43P3DR_skip ): ADD_L( CONST(16), EDI ) ADD_L( EAX, ESI ) CMP_L( ECX, EDI ) JNE( LLBL(K_GTP43P3DR_top) ) -LLBL(K_GTP43P3DR_finish): +LLBL( K_GTP43P3DR_finish ): POP_L( EDI ) POP_L( ESI ) RET #undef FRAME_OFFSET - Index: xc/extras/Mesa/src/X86/mmx.h diff -u xc/extras/Mesa/src/X86/mmx.h:1.2 xc/extras/Mesa/src/X86/mmx.h:1.3 --- xc/extras/Mesa/src/X86/mmx.h:1.2 Tue Feb 8 12:18:20 2000 +++ xc/extras/Mesa/src/X86/mmx.h Mon Nov 13 16:55:48 2000 @@ -1,20 +1,20 @@ /* * Mesa 3-D graphics library - * Version: 3.1 - * + * Version: 3.4 + * * Copyright (C) 1999 Brian Paul All Rights Reserved. - * + * * 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 Index: xc/extras/Mesa/src/X86/mmx_blend.S diff -u xc/extras/Mesa/src/X86/mmx_blend.S:1.2 xc/extras/Mesa/src/X86/mmx_blend.S:1.3 --- xc/extras/Mesa/src/X86/mmx_blend.S:1.2 Fri Jun 16 20:02:42 2000 +++ xc/extras/Mesa/src/X86/mmx_blend.S Mon Nov 13 16:55:48 2000 @@ -350,7 +350,3 @@ MOV_L ( EBP, ESP ) POP_L ( EBP ) RET - - - - Index: xc/extras/Mesa/src/X86/vertex.S diff -u xc/extras/Mesa/src/X86/vertex.S:1.2 xc/extras/Mesa/src/X86/vertex.S:removed --- xc/extras/Mesa/src/X86/vertex.S:1.2 Fri Jun 16 20:02:42 2000 +++ xc/extras/Mesa/src/X86/vertex.S Mon Dec 18 14:21:58 2000 @@ -1,102 +0,0 @@ -#include "assyntax.h" - - - SEG_TEXT - -/*#define MAT_SX 0*/ /* accessed by REGIND !! */ -#define MAT_SY 20 -#define MAT_SZ 40 -#define MAT_TX 48 -#define MAT_TY 52 -#define MAT_TZ 56 - - - - -/* - * void gl_v16_x86_general_xform ( GLfloat *dest, - * const GLfloat *m, - * const GLfloat *src, - * GLuint src_stride, - * GLuint count ) - */ - - -/* This is nothing more glamorous than an objdump of one of Josh's - * routines hacked to match the above. - */ -ALIGNTEXT16 -GLOBL GLNAME( gl_v16_x86_general_xform ) -GLNAME( gl_v16_x86_general_xform ): - - - PUSH_L ( EDI ) - PUSH_L ( ESI ) - - MOV_L ( REGOFF(12, ESP), EAX ) /* dest */ - MOV_L ( REGOFF(16, ESP), ESI ) /* mat */ - MOV_L ( REGOFF(20, ESP), EDX ) /* src */ - MOV_L ( REGOFF(24, ESP), EDI ) /* src_stride */ - MOV_L ( REGOFF(28, ESP), ECX ) /* count */ - - -LLBL(v16x86_loop): - FLD_S ( REGOFF( 0x0, EDX ) ) - FMUL_S ( REGOFF( 0x0, ESI ) ) - FLD_S ( REGOFF( 0x0, EDX ) ) - FMUL_S ( REGOFF( 0x4, ESI ) ) - FLD_S ( REGOFF( 0x0, EDX ) ) - FMUL_S ( REGOFF( 0x8, ESI ) ) - FLD_S ( REGOFF( 0x0, EDX ) ) - FMUL_S ( REGOFF( 0xc, ESI ) ) - FLD_S ( REGOFF( 0x4, EDX ) ) - FMUL_S ( REGOFF( 0x10, ESI ) ) - FLD_S ( REGOFF( 0x4, EDX ) ) - FMUL_S ( REGOFF( 0x14, ESI ) ) - FLD_S ( REGOFF( 0x4, EDX ) ) - FMUL_S ( REGOFF( 0x18, ESI ) ) - FLD_S ( REGOFF( 0x4, EDX ) ) - FMUL_S ( REGOFF( 0x1c, ESI ) ) - FXCH ( ST(3) ) - FADDP ( ST(0),ST(7) ) - FXCH ( ST(1) ) - FADDP ( ST(0),ST(5) ) - FADDP ( ST(0),ST(3) ) - FADDP ( ST(0),ST(1) ) - FLD_S ( REGOFF( 0x8, EDX ) ) - FMUL_S ( REGOFF( 0x20, ESI ) ) - FLD_S ( REGOFF( 0x8, EDX ) ) - FMUL_S ( REGOFF( 0x24, ESI ) ) - FLD_S ( REGOFF( 0x8, EDX ) ) - FMUL_S ( REGOFF( 0x28, ESI ) ) - FLD_S ( REGOFF( 0x8, EDX ) ) - FMUL_S ( REGOFF( 0x2c, ESI ) ) - FXCH ( ST(3) ) - FADDP ( ST(0),ST(7) ) - FXCH ( ST(1) ) - FADDP ( ST(0),ST(5) ) - FADDP ( ST(0),ST(3) ) - FADDP ( ST(0),ST(1) ) - FXCH ( ST(3) ) - FADD_S ( REGOFF( 0x30, ESI ) ) - FXCH ( ST(2) ) - FADD_S ( REGOFF( 0x34, ESI ) ) - FXCH ( ST(1) ) - FADD_S ( REGOFF( 0x38, ESI ) ) - FXCH ( ST(3) ) - FADD_S ( REGOFF( 0x3c, ESI ) ) - FXCH ( ST(2) ) - FSTP_S ( REGOFF( 0x0, EAX ) ) - FSTP_S ( REGOFF( 0x4, EAX ) ) - FXCH ( ST(1) ) - FSTP_S ( REGOFF( 0x8, EAX ) ) - FSTP_S ( REGOFF( 0xc, EAX ) ) - ADD_L ( CONST(64), EAX ) - ADD_L ( EDI, EDX ) - DEC_L ( ECX ) - JNE ( LLBL(v16x86_loop) ) - - POP_L ( ESI ) - POP_L ( EDI ) - RET - Index: xc/extras/Mesa/src/X86/vertex_3dnow.S diff -u xc/extras/Mesa/src/X86/vertex_3dnow.S:1.2 xc/extras/Mesa/src/X86/vertex_3dnow.S:removed --- xc/extras/Mesa/src/X86/vertex_3dnow.S:1.2 Fri Jun 16 20:02:43 2000 +++ xc/extras/Mesa/src/X86/vertex_3dnow.S Mon Dec 18 14:21:58 2000 @@ -1,234 +0,0 @@ -#include "assyntax.h" - - SEG_TEXT - - - -/*#define MAT_SX 0 accessed by REGIND !! */ -#define MAT_SY 20 -#define MAT_SZ 40 -#define MAT_TX 48 -#define MAT_TY 52 -#define MAT_TZ 56 - - - - - -/* Do viewport map and perspective projection. Args should look like: - * - * x86_3dnow_project_vertices( float *first_vertex, - * const float *last_vertex, - * float *matrix, - * GLuint stride ) - * - * This routine assumes a sane vertex layout with x,y,z,w as - * the first four elements, to be projected in clip-space, to - * x/w,y/w,z/w,1/w, and then transformed according to the matrix to - * device space. The device coordinates will overwrite the clip - * coordinates as the first four elements of the vertex. - * - * If projection is required for other elements, such as texcoords, - * you will have to code a specialized version of this routine. See - * FX/X86 for examples. - * - * These routines are simplified versions of the FX code written by - * Holger. - */ - -GLOBL GLNAME( gl_3dnow_project_vertices ) -GLNAME( gl_3dnow_project_vertices ): - - PUSH_L ( EBP ) - FEMMS - PREFETCH ( REGOFF(8, ESP) ) /* fetch the first vertex */ - - MOV_L ( REGOFF(8, ESP), ECX ) /* first_vert */ - MOV_L ( REGOFF(12, ESP), EDX ) /* last_vert */ - MOV_L ( REGOFF(16, ESP), EBP ) /* matrix */ - MOV_L ( REGOFF(20, ESP), EAX ) /* stride */ - - MOVD ( REGOFF(MAT_TX, EBP), MM6 ) /* | tx */ - PUNPCKLDQ ( REGOFF(MAT_TY, EBP), MM6 ) /* ty | tx */ - MOVD ( REGIND(EBP), MM5 ) - PUNPCKLDQ ( REGOFF(MAT_SY, EBP), MM5 ) /* vsy | vsx */ - MOVD ( REGOFF(MAT_SZ, EBP), MM1 ) /* | vsz */ - SUB_L ( ECX, EDX ) /* last -= first */ - -ALIGNTEXT32 -LLBL(v16_3dnow_pv_loop_start): - - PREFETCH ( REGOFF(64, ECX) ) /* fetch one/two verts ahead */ - MOVD ( REGOFF(12, ECX), MM0 ) /* | f[3] */ - PFRCP ( MM0, MM0 ) /* oow = 1/f[3] */ - MOVD ( REGOFF(12, ECX), MM7 ) /* | f[3] */ - PFRCPIT1 ( MM0, MM7 ) - PFRCPIT2 ( MM0, MM7 ) /* oow | oow */ - PUNPCKLDQ ( MM7, MM7 ) - MOVQ ( REGIND(ECX), MM2 ) /* f[1] | f[0] */ - PFMUL ( MM7, MM2 ) /* f[1] * oow | f[0] * oow */ - MOVD ( REGOFF(8, ECX), MM3 ) /* | f[2] */ - PFMUL ( MM7, MM3 ) /* | f[2] * oow */ - MOVD ( REGOFF(MAT_TZ, EBP), MM0 ) /* | vtz */ - PFMUL ( MM1, MM3 ) /* | f[2] *= vsz */ - PFADD ( MM0, MM3 ) /* | f[2] += vtz */ - PFMUL ( MM5, MM2 ) /* f[1] *= vsy | f[0] *= vsx */ - PFADD ( MM6, MM2 ) /* f[1] += vty | f[0] += vtx */ - PUNPCKLDQ ( MM7, MM3 ) /* f[3] = oow | f[2] */ - MOVQ ( MM2, REGOFF(0, ECX) ) - MOVQ ( MM3, REGOFF(8, ECX) ) - ADD_L ( EAX, ECX ) /* f += stride */ - SUB_L ( EAX, EDX ) - JA ( LLBL(v16_3dnow_pv_loop_start) ) - - FEMMS - POP_L ( EBP ) - RET - - - - - - - - -GLOBL GLNAME( gl_3dnow_project_clipped_vertices ) -GLNAME( gl_3dnow_project_clipped_vertices ): - - PUSH_L ( EBP ) - PUSH_L ( ESI ) - - FEMMS - - PREFETCH ( REGOFF(12, ESP) ) /* fetch the first vertex */ - - MOV_L ( REGOFF(12, ESP), ECX ) /* first_vert */ - MOV_L ( REGOFF(16, ESP), EDX ) /* last_vert */ - MOV_L ( REGOFF(20, ESP), EBP ) /* matrix */ - MOV_L ( REGOFF(24, ESP), EAX ) /* stride */ - MOV_L ( REGOFF(28, ESP), ESI ) /* clip_mask */ - - - MOVD ( REGOFF(MAT_TX, EBP), MM6 ) /* | tx */ - PUNPCKLDQ ( REGOFF(MAT_TY, EBP), MM6 ) /* ty | tx */ - MOVD ( REGIND(EBP), MM5 ) - PUNPCKLDQ ( REGOFF(MAT_SY, EBP), MM5 ) /* vsy | vsx */ - MOVD ( REGOFF(MAT_SZ, EBP), MM1 ) /* | vsz */ - - -ALIGNTEXT32 -LLBL(v16_3dnow_pcv_loop_start): - - CMP_B ( CONST(0), REGIND(ESI) ) - JNE ( LLBL(v16_3dnow_pcv_skip) ) - - MOVD ( REGOFF(12, ECX), MM0) /* | f[3] */ - PFRCP ( MM0, MM0 ) /* oow = 1/f[3] */ - MOVD ( REGOFF(12, ECX), MM7) /* | f[3] */ - PFRCPIT1 ( MM0, MM7 ) - PFRCPIT2 ( MM0, MM7 ) /* oow | oow */ - PUNPCKLDQ ( MM7, MM7 ) - MOVQ ( REGIND(ECX), MM2 ) /* f[1] | f[0] */ - PFMUL ( MM7, MM2 ) /* f[1] * oow | f[0] * oow */ - MOVD ( REGOFF(8, ECX), MM3 ) /* | f[2] */ - PFMUL ( MM7, MM3 ) /* | f[2] * oow */ - MOVD ( REGOFF(MAT_TZ, EBP), MM0 ) /* | vtz */ - PFMUL ( MM1, MM3 ) /* | f[2] *= vsz */ - PFADD ( MM0, MM3 ) /* | f[2] += vtz */ - PFMUL ( MM5, MM2 ) /* f[1] *= vsy | f[0] *= vsx */ - PFADD ( MM6, MM2 ) /* f[1] += vty | f[0] += vtx */ - PUNPCKLDQ ( MM7, MM3 ) /* f[3] = oow | f[2] */ - MOVQ ( MM2, REGOFF(0, ECX) ) - MOVQ ( MM3, REGOFF(8, ECX) ) - -LLBL(v16_3dnow_pcv_skip): - ADD_L ( EAX, ECX ) /* f += stride */ - INC_L ( ESI ) /* next ClipMask */ - - CMP_L ( ECX, EDX ) - JNE ( LLBL(v16_3dnow_pcv_loop_start) ) - - FEMMS - - POP_L ( ESI ) - POP_L ( EBP ) - RET - - - - - -/* - * void gl_3dnow_transform_v16 (GLfloat *dest, - * const GLfloat *m, - * const GLfloat *src, - * GLuint src_stride, - * GLuint count ) - * - * These tranformation functions could disappear if the standard ones - * took an output stride. - */ -GLOBL GLNAME( gl_v16_3dnow_general_xform ) -GLNAME( gl_v16_3dnow_general_xform ): - - - PUSH_L ( EDI ) - PUSH_L ( ESI ) - - MOV_L ( REGOFF(12, ESP), EAX ) /* dest */ - MOV_L ( REGOFF(16, ESP), ESI ) /* mat */ - MOV_L ( REGOFF(20, ESP), EDX ) /* src */ - MOV_L ( REGOFF(24, ESP), EDI ) /* src_stride */ - MOV_L ( REGOFF(28, ESP), ECX ) /* count */ - - FEMMS - - MOVQ ( REGOFF(MAT_TX, ESI), MM7 ) /* m31 | m30 */ - MOVQ ( REGOFF(MAT_TZ, ESI), MM3 ) /* m33 | m32 */ - -ALIGNTEXT32 -LLBL(v16_3dnow_general_loop): - PREFETCH ( REGOFF(128, EAX) ) /* prefetch 2 output verts ahead*/ - PREFETCH ( REGOFF(32, EDX) ) /* */ - - MOVQ ( REGIND(EDX), MM0 ) /* x1 | x0 */ - MOVD ( REGOFF(8, EDX), MM1 ) /* | x2 */ - MOVQ ( REGIND(ESI), MM4 ) /* m00 | m01 */ - PUNPCKHDQ ( MM0, MM2 ) /* x1 | */ - MOVQ ( REGOFF(16, ESI),MM5 ) /* m10 | m11 */ - PUNPCKLDQ ( MM0, MM0 ) /* x0 | x0 */ - MOVQ ( REGOFF(32, ESI),MM6 ) /* m20 | m21 */ - PFMUL ( MM0, MM4 ) /* x0.m01 | x0.m00 */ - PUNPCKHDQ ( MM2, MM2 ) /* x1 | x1 */ - PFMUL ( MM2, MM5 ) /* x1.m11 | x1.m10 */ - PUNPCKLDQ ( MM1, MM1 ) /* x2 | x2 */ - PFMUL ( REGOFF(8,ESI), MM0 ) /* x0.m03 | x0.m02 */ - PFMUL ( REGOFF(24,ESI),MM2 ) /* x1.m13 | x1.m12 */ - PFMUL ( MM1, MM6 ) /* x2.m21 | x2.m20 */ - PFADD ( MM4, MM5 ) /* x0m01+x1m11 | x0m00+x1m10 */ - PFMUL ( REGOFF(40,ESI),MM1 ) /* x2.m21 | x2.m20 */ - PFADD ( MM0, MM2 ) /* x0m03+x1m13 | x0m02+x1m12 */ - PFADD ( MM5, MM6 ) /* (xm012)1 | (xm012)0 */ - PFADD ( MM1, MM2 ) /* (xm012)3 | (xm012)2 */ - PFADD ( MM7, MM6 ) /* r1 | r0 */ - PFADD ( MM3, MM2 ) /* r3 | r2 */ - ADD_L ( EDI, EDX ) /* next input */ - MOVQ ( MM6, REGIND(EAX) ) /* */ - MOVQ ( MM2, REGOFF(8,EAX) ) /* */ - ADD_L ( CONST(64), EAX ) /* next output */ - DEC_L ( ECX ) - JNE ( LLBL(v16_3dnow_general_loop) ) - - FEMMS - - POP_L ( ESI ) - POP_L ( EDI ) - RET - - - - - - - - Index: xc/extras/Mesa/src/X86/vertex_katmai.S diff -u xc/extras/Mesa/src/X86/vertex_katmai.S:1.2 xc/extras/Mesa/src/X86/vertex_katmai.S:removed --- xc/extras/Mesa/src/X86/vertex_katmai.S:1.2 Fri Jun 16 20:02:43 2000 +++ xc/extras/Mesa/src/X86/vertex_katmai.S Mon Dec 18 14:21:58 2000 @@ -1,186 +0,0 @@ -#include "assyntax.h" - -#define MAT_SY 20 -#define MAT_SZ 40 -#define MAT_TX 48 -#define MAT_TY 52 -#define MAT_TZ 56 - - - SEG_TEXT - - -/* - * void gl_v16_katmai_general_xform (GLfloat *dest, - * const GLfloat *m, - * const GLfloat *src, - * GLuint src_stride, - * GLuint count ) - * - */ - -ALIGNTEXT16 -GLOBL GLNAME( gl_v16_katmai_general_xform ) -GLNAME( gl_v16_katmai_general_xform ): - - PUSH_L( EDI ) - PUSH_L( ESI ) - - MOV_L( REGOFF(12, ESP), EAX ) /* f - destination */ - MOV_L( REGOFF(16, ESP), ESI ) /* m - matrix */ - MOV_L( REGOFF(20, ESP), EDX ) /* obj - source */ - MOV_L( REGOFF(24, ESP), EDI ) /* obj_stride */ - MOV_L( REGOFF(28, ESP), ECX ) /* count */ - - MOVUPS( REGOFF(0, ESI), XMM4 ) /* x14, x13, x12, x11 => xmm4 */ - MOVUPS( REGOFF(16, ESI), XMM5 ) /* x24, x23, x22, x21 => xmm5 */ - MOVUPS( REGOFF(32, ESI), XMM6 ) /* x34, x33, x32, x31 => xmm6 */ - MOVUPS( REGOFF(48, ESI), XMM7 ) /* x44, x43, x42, x41 => xmm7 */ - -ALIGNTEXT32 -LLBL(loop1): - - MOVSS( REGOFF(0, EDX), XMM0 ) /* s1 => xmm0 */ - SHUFPS( CONST(0x0), XMM0, XMM0 ) /* xmm0 shuffle to other 96 bits */ - MULPS( XMM4, XMM0 ) /* x14*s1, x13*s1, x12*s1, x11*s1 */ - - MOVSS( REGOFF(4, EDX), XMM1 ) /* s2 => xmm1 */ - SHUFPS( CONST(0x0), XMM1, XMM1 ) /* xmm1 shuffle to other 96 bits */ - MULPS( XMM5, XMM1 ) /* x24*s2, x23*s2, x22*s2, x21*s2 */ - - MOVSS( REGOFF(8, EDX), XMM2 ) /* s3 => xmm2 */ - SHUFPS( CONST(0x0), XMM2, XMM2 ) /* xmm2 shuffle to other 96 bits */ - MULPS( XMM6, XMM2 ) /* x34*s3, x33*s3, x32*s3, x31*s3 */ - - ADDPS( XMM1, XMM0 ) /* xmm0 + xmm1 => xmm0 */ - ADDPS( XMM2, XMM0 ) /* xmm0 + xmm2 => xmm0 */ - ADDPS( XMM7, XMM0 ) /* xmm0 + xmm7 => xmm0 */ - - MOVUPS( XMM0, REGOFF(0, EAX) ) /* xmm0 => dest( f11, f12, f13, f14 ) */ - - ADD_L ( CONST(64), EAX ) /* f + 64 bytes => f */ - ADD_L ( EDI, EDX ) /* obj + obj_stride => obj */ - - DEC_L ( ECX ) /* count - 1 => count */ - JNE ( LLBL(loop1) ) /* if not zero, go back to LABL(loop1) */ - - POP_L( ESI ) - POP_L( EDI ) - - RET - - -/* void gl_katmai_project_vertices(GLfloat *first, - * GLfloat *last, - * const GLfloat *m, - * GLuint stride ) - */ - - -ALIGNTEXT16 -GLOBL GLNAME( gl_katmai_project_vertices ) -GLNAME( gl_katmai_project_vertices ): - - PUSH_L( EBP ) - - MOV_L( REGOFF(8, ESP), ECX ) /* first_vert */ - MOV_L( REGOFF(12, ESP), EDX ) /* last_vert */ - MOV_L( REGOFF(16, ESP), EBP ) /* matrix */ - MOV_L( REGOFF(20, ESP), EAX ) /* stride */ - - -ALIGNTEXT32 - MOVUPS( REGOFF(MAT_TX, EBP), XMM0 ) /* (x44), x43, x42, x41 => xmm0 */ - MOVSS( REGOFF(0, EBP), XMM1 ) /* -, -, -, x11 => xmm1 */ - UNPCKLPS( REGOFF(MAT_SY, EBP), XMM1 ) /* -, -, x22, x11 => xmm1 */ - SHUFPS( CONST(0x44), REGOFF(MAT_SZ, EBP), XMM1 ) - /* -, x33, x22, x11 => xmm1 */ - - SUB_L( ECX, EDX ) /* last -= first */ - -LLBL(v16_katmai_pv_loop_start): - MOVUPS( REGOFF(0, ECX), XMM3 ) /* f[3], f[2], f[1], f[0] */ - - MOVSS( REGOFF(12, ECX), XMM2 ) /* -, -, -, f[3] */ - SHUFPS( CONST(0x0), XMM2, XMM2 ) /* f[3], f[3], f[3], f[3] */ - RCPPS( XMM2, XMM2 ) /* 1/f[3], 1/f[3], 1/f[3], 1/f[3] */ - - MULPS( XMM2, XMM1 ) /* -, x33*1/f[3]... */ - MULPS( XMM3, XMM1 ) /* -, x33*1/f[3]*f[2]... */ - ADDPS( XMM0, XMM1 ) /* -, x33*1/f[3]*f[2]+x43... */ - - MOVUPS( XMM1, REGOFF(0, ECX) ) /* back to f */ - MOVSS( XMM2, REGOFF(12, ECX) ) /* 1/f[3] into f[3] ! */ - - - ADD_L( EAX, ECX ) /* f += stride */ - SUB_L( EAX, EDX ) /* (last-first)-stride */ - JA ( LLBL(v16_katmai_pv_loop_start) ) - - POP_L( EBP ) - RET - - - -/* void gl_katmai_project_clipped_vertices(GLfloat *first, - * GLfloat *last, - * const GLfloat *m, - * GLuint stride, - * const GLubyte *clipmask ); - */ - - -ALIGNTEXT16 -GLOBL GLNAME( gl_katmai_project_clipped_vertices ) -GLNAME( gl_katmai_project_clipped_vertices ): - - PUSH_L( EBP ) - PUSH_L( ESI ) - - MOV_L( REGOFF(12, ESP), ECX ) /* first_vert */ - MOV_L( REGOFF(16, ESP), EDX ) /* last_vert */ - MOV_L( REGOFF(20, ESP), EBP ) /* matrix */ - MOV_L( REGOFF(24, ESP), EAX ) /* stride */ - MOV_L( REGOFF(28, ESP), ESI ) /* clip_mask */ - - - -ALIGNTEXT32 - - MOVUPS( REGOFF(MAT_TX, EBP), XMM0 ) /* (x44), x43, x42, x41 => xmm0 */ - MOVSS( REGOFF(0, EBP), XMM1 ) /* -, -, -, x11 => xmm1 */ - UNPCKLPS( REGOFF(MAT_SY, EBP), XMM1 ) /* -, -, x22, x11 => xmm1 */ - SHUFPS( CONST(0x44), REGOFF(MAT_SZ, EBP), XMM1 ) - /* -, x33, x22, x11 => xmm1 */ - -LLBL(v16_katmai_pcv_loop_start): - CMP_B ( CONST(0), REGIND(ESI) ) /* clip_mask == 0 ? */ - JNE( LLBL(v16_katmai_pcv_skip) ) /* no -> skip ! */ - - MOVUPS( REGOFF(0, ECX), XMM3 ) /* f[3], f[2], f[1], f[0] */ - - MOVSS( REGOFF(12, ECX), XMM2 ) /* -, -, -, f[3] */ - SHUFPS( CONST(0x0), XMM2, XMM2 ) /* f[3], f[3], f[3], f[3] */ - RCPPS( XMM2, XMM2 ) /* 1/f[3], 1/f[3], 1/f[3], 1/f[3] */ - - MULPS( XMM2, XMM1 ) /* -, x33*1/f[3]... */ - MULPS( XMM3, XMM1 ) /* -, x33*1/f[3]*f[2]... */ - ADDPS( XMM0, XMM1 ) /* -, x33*1/f[3]*f[2]+x43... */ - - MOVUPS( XMM1, REGOFF(0, ECX) ) /* back to f */ - MOVSS( XMM2, REGOFF(12, ECX) ) /* 1/f[3] into f[3] ! */ - -LLBL(v16_katmai_pcv_skip): - ADD_L( EAX, ECX ) /* f += stride */ - INC_L( ESI ) /* nect ClipMask */ - - CMP_L( ECX, EDX ) /* p_first_vertex == p_last_vertex */ - JNE( LLBL(v16_katmai_pcv_loop_start) ) - /* no -> go on with next vertex */ - - POP_L( ESI ) - POP_L( EBP ) - RET - - - Index: xc/extras/Mesa/src/X86/x86.c diff -u xc/extras/Mesa/src/X86/x86.c:1.4 xc/extras/Mesa/src/X86/x86.c:1.8 --- xc/extras/Mesa/src/X86/x86.c:1.4 Fri Jun 16 20:02:43 2000 +++ xc/extras/Mesa/src/X86/x86.c Mon Nov 13 18:31:17 2000 @@ -1,20 +1,20 @@ /* * Mesa 3-D graphics library - * Version: 3.1 - * + * Version: 3.4 + * * Copyright (C) 1999 Brian Paul All Rights Reserved. - * + * * 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 @@ -27,7 +27,6 @@ * Intel x86 assembly code by Josh Vanderhoof */ - #include "glheader.h" #include "context.h" #include "types.h" @@ -35,90 +34,104 @@ #include "xform.h" #include "x86.h" -#ifdef USE_X86_ASM -extern void _ASMAPI gl_v16_x86_cliptest_points4(GLfloat *first_vert, - GLfloat *last_vert, - GLubyte *or_mask, - GLubyte *and_mask, - GLubyte *clip_mask ); - - -extern void _ASMAPI gl_v16_x86_general_xform(GLfloat *dest, - const GLfloat *m, - const GLfloat *src, - GLuint src_stride, - GLuint count); +#ifdef DEBUG +#include "debug_xform.h" #endif -#define XFORM_ARGS GLvector4f *to_vec, \ - const GLmatrix *mat, \ - const GLvector4f *from_vec, \ - const GLubyte *mask, \ +#define XFORM_ARGS GLvector4f *to_vec, \ + const GLfloat m[16], \ + const GLvector4f *from_vec, \ + const GLubyte *mask, \ const GLubyte flag + -#define DECLARE_XFORM_GROUP(pfx, vsize, masked) \ - extern void _ASMAPI gl_##pfx##_transform_points##vsize##_general_##masked(XFORM_ARGS); \ - extern void _ASMAPI gl_##pfx##_transform_points##vsize##_identity_##masked(XFORM_ARGS); \ - extern void _ASMAPI gl_##pfx##_transform_points##vsize##_3d_no_rot_##masked(XFORM_ARGS); \ - extern void _ASMAPI gl_##pfx##_transform_points##vsize##_perspective_##masked(XFORM_ARGS); \ - extern void _ASMAPI gl_##pfx##_transform_points##vsize##_2d_##masked(XFORM_ARGS); \ - extern void _ASMAPI gl_##pfx##_transform_points##vsize##_2d_no_rot_##masked(XFORM_ARGS); \ - extern void _ASMAPI gl_##pfx##_transform_points##vsize##_3d_##masked(XFORM_ARGS); - -#define ASSIGN_XFORM_GROUP( pfx, cma, vsize, masked ) \ - gl_transform_tab[cma][vsize][MATRIX_GENERAL] \ - = gl_##pfx##_transform_points##vsize##_general_##masked; \ - gl_transform_tab[cma][vsize][MATRIX_IDENTITY] \ - = gl_##pfx##_transform_points##vsize##_identity_##masked; \ - gl_transform_tab[cma][vsize][MATRIX_3D_NO_ROT] \ - = gl_##pfx##_transform_points##vsize##_3d_no_rot_##masked; \ - gl_transform_tab[cma][vsize][MATRIX_PERSPECTIVE] \ - = gl_##pfx##_transform_points##vsize##_perspective_##masked; \ - gl_transform_tab[cma][vsize][MATRIX_2D] \ - = gl_##pfx##_transform_points##vsize##_2d_##masked; \ - gl_transform_tab[cma][vsize][MATRIX_2D_NO_ROT] \ - = gl_##pfx##_transform_points##vsize##_2d_no_rot_##masked; \ - gl_transform_tab[cma][vsize][MATRIX_3D] \ - = gl_##pfx##_transform_points##vsize##_3d_##masked; +#define DECLARE_XFORM_GROUP( pfx, sz, masked ) \ + extern void _ASMAPI gl_##pfx##_transform_points##sz##_general_##masked( XFORM_ARGS ); \ + extern void _ASMAPI gl_##pfx##_transform_points##sz##_identity_##masked( XFORM_ARGS ); \ + extern void _ASMAPI gl_##pfx##_transform_points##sz##_3d_no_rot_##masked( XFORM_ARGS ); \ + extern void _ASMAPI gl_##pfx##_transform_points##sz##_perspective_##masked( XFORM_ARGS ); \ + extern void _ASMAPI gl_##pfx##_transform_points##sz##_2d_##masked( XFORM_ARGS ); \ + extern void _ASMAPI gl_##pfx##_transform_points##sz##_2d_no_rot_##masked( XFORM_ARGS ); \ + extern void _ASMAPI gl_##pfx##_transform_points##sz##_3d_##masked( XFORM_ARGS ); + + +#define ASSIGN_XFORM_GROUP( pfx, cma, sz, masked ) \ + gl_transform_tab[cma][sz][MATRIX_GENERAL] = \ + gl_##pfx##_transform_points##sz##_general_##masked; \ + gl_transform_tab[cma][sz][MATRIX_IDENTITY] = \ + gl_##pfx##_transform_points##sz##_identity_##masked; \ + gl_transform_tab[cma][sz][MATRIX_3D_NO_ROT] = \ + gl_##pfx##_transform_points##sz##_3d_no_rot_##masked; \ + gl_transform_tab[cma][sz][MATRIX_PERSPECTIVE] = \ + gl_##pfx##_transform_points##sz##_perspective_##masked; \ + gl_transform_tab[cma][sz][MATRIX_2D] = \ + gl_##pfx##_transform_points##sz##_2d_##masked; \ + gl_transform_tab[cma][sz][MATRIX_2D_NO_ROT] = \ + gl_##pfx##_transform_points##sz##_2d_no_rot_##masked; \ + gl_transform_tab[cma][sz][MATRIX_3D] = \ + gl_##pfx##_transform_points##sz##_3d_##masked; #ifdef USE_X86_ASM - DECLARE_XFORM_GROUP( x86, 2, raw ) - DECLARE_XFORM_GROUP( x86, 3, raw ) - DECLARE_XFORM_GROUP( x86, 4, raw ) - DECLARE_XFORM_GROUP( x86, 2, masked ) - DECLARE_XFORM_GROUP( x86, 3, masked ) - DECLARE_XFORM_GROUP( x86, 4, masked ) - - extern GLvector4f * _ASMAPI gl_x86_cliptest_points4( GLvector4f *clip_vec, - GLvector4f *proj_vec, - GLubyte clipMask[], - GLubyte *orMask, - GLubyte *andMask ); +DECLARE_XFORM_GROUP( x86, 2, raw ) +DECLARE_XFORM_GROUP( x86, 3, raw ) +DECLARE_XFORM_GROUP( x86, 4, raw ) +DECLARE_XFORM_GROUP( x86, 2, masked ) +DECLARE_XFORM_GROUP( x86, 3, masked ) +DECLARE_XFORM_GROUP( x86, 4, masked ) + + +extern GLvector4f * _ASMAPI gl_x86_cliptest_points4( GLvector4f *clip_vec, + GLvector4f *proj_vec, + GLubyte clipMask[], + GLubyte *orMask, + GLubyte *andMask ); + + +extern void _ASMAPI gl_v16_x86_cliptest_points4( GLfloat *first_vert, + GLfloat *last_vert, + GLubyte *or_mask, + GLubyte *and_mask, + GLubyte *clip_mask ); + + +extern void _ASMAPI gl_v16_x86_general_xform( GLfloat *dest, + const GLfloat *m, + const GLfloat *src, + GLuint src_stride, + GLuint count ); #endif -void gl_init_x86_asm_transforms( void ) +void gl_init_x86_transform_asm( void ) { #ifdef USE_X86_ASM - ASSIGN_XFORM_GROUP( x86, 0, 2, raw ) - ASSIGN_XFORM_GROUP( x86, 0, 3, raw ) - ASSIGN_XFORM_GROUP( x86, 0, 4, raw ) - - ASSIGN_XFORM_GROUP( x86, CULL_MASK_ACTIVE, 2, masked ) - ASSIGN_XFORM_GROUP( x86, CULL_MASK_ACTIVE, 3, masked ) - ASSIGN_XFORM_GROUP( x86, CULL_MASK_ACTIVE, 4, masked ) + ASSIGN_XFORM_GROUP( x86, 0, 2, raw ); + ASSIGN_XFORM_GROUP( x86, 0, 3, raw ); + ASSIGN_XFORM_GROUP( x86, 0, 4, raw ); + + ASSIGN_XFORM_GROUP( x86, CULL_MASK_ACTIVE, 2, masked ); + ASSIGN_XFORM_GROUP( x86, CULL_MASK_ACTIVE, 3, masked ); + ASSIGN_XFORM_GROUP( x86, CULL_MASK_ACTIVE, 4, masked ); /* XXX this function has been found to cause FP overflow exceptions */ gl_clip_tab[4] = gl_x86_cliptest_points4; #ifdef DEBUG - gl_test_all_transform_functions("x86"); + gl_test_all_transform_functions( "x86" ); #endif +#endif +} +void gl_init_x86_vertex_asm( void ) +{ +#ifdef USE_X86_ASM + gl_xform_points3_v16_general = gl_v16_x86_general_xform; + gl_cliptest_points4_v16 = gl_v16_x86_cliptest_points4; - gl_cliptest_points4_v16 = gl_v16_x86_cliptest_points4; - gl_xform_points3_v16_general = gl_v16_x86_general_xform; +#if 0 + gl_test_all_vertex_functions( "x86" ); +#endif #endif } Index: xc/extras/Mesa/src/X86/x86.h diff -u xc/extras/Mesa/src/X86/x86.h:1.3 xc/extras/Mesa/src/X86/x86.h:1.4 --- xc/extras/Mesa/src/X86/x86.h:1.3 Tue Feb 15 02:13:20 2000 +++ xc/extras/Mesa/src/X86/x86.h Mon Nov 13 16:55:50 2000 @@ -1,20 +1,20 @@ /* * Mesa 3-D graphics library - * Version: 3.1 - * + * Version: 3.4 + * * Copyright (C) 1999 Brian Paul All Rights Reserved. - * + * * 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 @@ -27,10 +27,10 @@ * Intel x86 assembly code by Josh Vanderhoof */ +#ifndef __X86_H__ +#define __X86_H__ -#ifndef X86_H -#define X86_H - -extern void gl_init_x86_asm_transforms(void); +extern void gl_init_x86_transform_asm( void ); +extern void gl_init_x86_vertex_asm( void ); #endif Index: xc/extras/Mesa/src/X86/x86_cliptest.S diff -u /dev/null xc/extras/Mesa/src/X86/x86_cliptest.S:1.2 --- /dev/null Mon Dec 18 14:21:59 2000 +++ xc/extras/Mesa/src/X86/x86_cliptest.S Fri Dec 1 09:28:50 2000 @@ -0,0 +1,247 @@ + +/* + * Mesa 3-D graphics library + * Version: 3.4 + * + * Copyright (C) 1999-2000 Brian Paul All Rights Reserved. + * + * 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 + * BRIAN PAUL 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 "assyntax.h" +#include "clip_args.h" + +#define FP_ONE 1065353216 +#define FP_ZERO 0 + +#define SRC(i) REGOFF(i * 4, ESI) +#define DST(i) REGOFF(i * 4, EDI) +#define MAT(i) REGOFF(i * 4, EDX) + + +/* + * Table for clip test. + * + * bit6 = SRC(3) < 0 + * bit5 = SRC(2) < 0 + * bit4 = abs(S(2)) > abs(S(3)) + * bit3 = SRC(1) < 0 + * bit2 = abs(S(1)) > abs(S(3)) + * bit1 = SRC(0) < 0 + * bit0 = abs(S(0)) > abs(S(3)) + */ + + SEG_DATA + +clip_table: + D_BYTE 0, 1, 0, 2, 4, 5, 4, 6 + D_BYTE 0, 1, 0, 2, 8, 9, 8, 10 + D_BYTE 32, 33, 32, 34, 36, 37, 36, 38 + D_BYTE 32, 33, 32, 34, 40, 41, 40, 42 + D_BYTE 0, 1, 0, 2, 4, 5, 4, 6 + D_BYTE 0, 1, 0, 2, 8, 9, 8, 10 + D_BYTE 16, 17, 16, 18, 20, 21, 20, 22 + D_BYTE 16, 17, 16, 18, 24, 25, 24, 26 + D_BYTE 63, 61, 63, 62, 55, 53, 55, 54 + D_BYTE 63, 61, 63, 62, 59, 57, 59, 58 + D_BYTE 47, 45, 47, 46, 39, 37, 39, 38 + D_BYTE 47, 45, 47, 46, 43, 41, 43, 42 + D_BYTE 63, 61, 63, 62, 55, 53, 55, 54 + D_BYTE 63, 61, 63, 62, 59, 57, 59, 58 + D_BYTE 31, 29, 31, 30, 23, 21, 23, 22 + D_BYTE 31, 29, 31, 30, 27, 25, 27, 26 + + + SEG_TEXT + +/* + * gl_x86_cliptest_points4 + * + * AL: ormask + * AH: andmask + * EBX: temp0 + * ECX: temp1 + * EDX: clipmask[] + * ESI: clip[] + * EDI: proj[] + * EBP: temp2 + */ + +#if defined(__ELF__) && defined(__PIC__) && !defined(ELFPIC) +#define ELFPIC +#endif + +ALIGNTEXT16 +GLOBL GLNAME( gl_x86_cliptest_points4 ) +GLNAME( gl_x86_cliptest_points4 ): + +#ifdef ELFPIC +#define FRAME_OFFSET 20 +#else +#define FRAME_OFFSET 16 +#endif + PUSH_L( ESI ) + PUSH_L( EDI ) + PUSH_L( EBP ) + PUSH_L( EBX ) + +#ifdef ELFPIC + /* store pointer to clip_table on stack */ + CALL( LLBL( ctp4_get_eip ) ) + ADD_L( CONST(_GLOBAL_OFFSET_TABLE_), EBX ) + MOV_L( REGOFF(clip_table@GOT, EBX), EBX ) + PUSH_L( EBX ) + JMP( LLBL( ctp4_clip_table_ready ) ) + +LLBL( ctp4_get_eip ): + /* store eip in ebx */ + MOV_L( REGIND(ESP), EBX ) + RET + +LLBL( ctp4_clip_table_ready ): +#endif + + MOV_L( ARG_SOURCE, ESI ) + MOV_L( ARG_DEST, EDI ) + + MOV_L( ARG_CLIP, EDX ) + MOV_L( ARG_OR, EBX ) + + MOV_L( ARG_AND, EBP ) + MOV_L( REGOFF(V4F_STRIDE, ESI), EAX ) + + MOV_L( REGOFF(V4F_COUNT, ESI), ECX ) + MOV_L( REGOFF(V4F_START, ESI), ESI ) + + OR_L( CONST(VEC_SIZE_4), REGOFF(V4F_FLAGS, EDI) ) + MOV_L( EAX, ARG_SOURCE ) /* put stride in ARG_SOURCE */ + + MOV_L( CONST(3), REGOFF(V4F_SIZE, EDI) ) + MOV_L( ECX, REGOFF(V4F_COUNT, EDI) ) + + MOV_L( REGOFF(V4F_START, EDI), EDI ) + ADD_L( EDX, ECX ) + + MOV_L( ECX, ARG_CLIP ) /* put clipmask + count in ARG_CLIP */ + CMP_L( ECX, EDX ) + + MOV_B( REGIND(EBX), AL ) + MOV_B( REGIND(EBP), AH ) + + JZ( LLBL( ctp4_finish ) ) + +ALIGNTEXT16 +LLBL( ctp4_top ): + + FLD1 /* F3 */ + FDIV_S( SRC(3) ) + + MOV_L( SRC(3), EBP ) + MOV_L( SRC(2), EBX ) + + XOR_L( ECX, ECX ) + ADD_L( EBP, EBP ) /* ebp = abs(S(3))*2 ; carry = sign of S(3) */ + + ADC_L( ECX, ECX ) + ADD_L( EBX, EBX ) /* ebx = abs(S(2))*2 ; carry = sign of S(2) */ + + ADC_L( ECX, ECX ) + CMP_L( EBX, EBP ) /* carry = abs(S(2))*2 > abs(S(3))*2 */ + + ADC_L( ECX, ECX ) + MOV_L( SRC(1), EBX ) + + ADD_L( EBX, EBX ) /* ebx = abs(S(1))*2 ; carry = sign of S(1) */ + + ADC_L( ECX, ECX ) + CMP_L( EBX, EBP ) /* carry = abs(S(1))*2 > abs(S(3))*2 */ + + ADC_L( ECX, ECX ) + MOV_L( SRC(0), EBX ) + + ADD_L( EBX, EBX ) /* ebx = abs(S(0))*2 ; carry = sign of S(0) */ + + ADC_L( ECX, ECX ) + CMP_L( EBX, EBP ) /* carry = abs(S(0))*2 > abs(S(3))*2 */ + + ADC_L( ECX, ECX ) + +#ifdef ELFPIC + MOV_L( REGIND(ESP), EBP ) /* clip_table */ + + MOV_B( REGBI(EBP, ECX), CL ) +#else + MOV_B( REGOFF(clip_table,ECX), CL ) +#endif + + OR_B( CL, AL ) + AND_B( CL, AH ) + + TEST_B( CL, CL ) + MOV_B( CL, REGIND(EDX) ) + + JZ( LLBL( ctp4_proj ) ) + + FSTP( ST(0) ) /* */ + JMP( LLBL( ctp4_next ) ) + +LLBL( ctp4_proj ): + + FLD_S( SRC(0) ) /* F0 F3 */ + FMUL2( ST(1), ST(0) ) + + FLD_S( SRC(1) ) /* F1 F0 F3 */ + FMUL2( ST(2), ST(0) ) + + FLD_S( SRC(2) ) /* F2 F1 F0 F3 */ + FMUL2( ST(3), ST(0) ) + + FXCH( ST(2) ) /* F0 F1 F2 F3 */ + FSTP_S( DST(0) ) /* F1 F2 F3 */ + FSTP_S( DST(1) ) /* F2 F3 */ + FSTP_S( DST(2) ) /* F3 */ + FSTP_S( DST(3) ) /* */ + +LLBL( ctp4_next ): + + INC_L( EDX ) + ADD_L( CONST(16), EDI ) + + ADD_L( ARG_SOURCE, ESI ) + CMP_L( EDX, ARG_CLIP ) + + JNZ( LLBL( ctp4_top ) ) + + MOV_L( ARG_OR, ECX ) + MOV_L( ARG_AND, EDX ) + + MOV_B( AL, REGIND(ECX) ) + MOV_B( AH, REGIND(EDX) ) + +LLBL( ctp4_finish ): + + MOV_L( ARG_DEST, EAX ) +#ifdef ELFPIC + POP_L( ESI ) /* discard ptr to clip_table */ +#endif + POP_L( EBX ) + POP_L( EBP ) + POP_L( EDI ) + POP_L( ESI ) + + RET Index: xc/extras/Mesa/src/X86/x86_vertex.S diff -u /dev/null xc/extras/Mesa/src/X86/x86_vertex.S:1.1.1.1 --- /dev/null Mon Dec 18 14:21:59 2000 +++ xc/extras/Mesa/src/X86/x86_vertex.S Mon Nov 13 16:34:13 2000 @@ -0,0 +1,298 @@ +#include "assyntax.h" + + + SEG_TEXT + +/*#define MAT_SX 0*/ /* accessed by REGIND !! */ +#define MAT_SY 20 +#define MAT_SZ 40 +#define MAT_TX 48 +#define MAT_TY 52 +#define MAT_TZ 56 + + +#define FP_ONE 1065353216 +#define FP_ZERO 0 + +#define S(i) REGOFF(i * 4, ESI) +#define D(i) REGOFF(i * 4, EDI) +#define M(i) REGOFF(i * 4, EDX) + + + +/* + * void gl_v16_x86_general_xform ( GLfloat *dest, + * const GLfloat *m, + * const GLfloat *src, + * GLuint src_stride, + * GLuint count ) + */ + + +/* This is nothing more glamorous than an objdump of one of Josh's + * routines hacked to match the above. + */ +ALIGNTEXT16 +GLOBL GLNAME( gl_v16_x86_general_xform ) +GLNAME( gl_v16_x86_general_xform ): + + + PUSH_L ( EDI ) + PUSH_L ( ESI ) + + MOV_L ( REGOFF(12, ESP), EAX ) /* dest */ + MOV_L ( REGOFF(16, ESP), ESI ) /* mat */ + MOV_L ( REGOFF(20, ESP), EDX ) /* src */ + MOV_L ( REGOFF(24, ESP), EDI ) /* src_stride */ + MOV_L ( REGOFF(28, ESP), ECX ) /* count */ + + +LLBL(v16x86_loop): + FLD_S ( REGOFF( 0x0, EDX ) ) + FMUL_S ( REGOFF( 0x0, ESI ) ) + FLD_S ( REGOFF( 0x0, EDX ) ) + FMUL_S ( REGOFF( 0x4, ESI ) ) + FLD_S ( REGOFF( 0x0, EDX ) ) + FMUL_S ( REGOFF( 0x8, ESI ) ) + FLD_S ( REGOFF( 0x0, EDX ) ) + FMUL_S ( REGOFF( 0xc, ESI ) ) + FLD_S ( REGOFF( 0x4, EDX ) ) + FMUL_S ( REGOFF( 0x10, ESI ) ) + FLD_S ( REGOFF( 0x4, EDX ) ) + FMUL_S ( REGOFF( 0x14, ESI ) ) + FLD_S ( REGOFF( 0x4, EDX ) ) + FMUL_S ( REGOFF( 0x18, ESI ) ) + FLD_S ( REGOFF( 0x4, EDX ) ) + FMUL_S ( REGOFF( 0x1c, ESI ) ) + FXCH ( ST(3) ) + FADDP ( ST(0),ST(7) ) + FXCH ( ST(1) ) + FADDP ( ST(0),ST(5) ) + FADDP ( ST(0),ST(3) ) + FADDP ( ST(0),ST(1) ) + FLD_S ( REGOFF( 0x8, EDX ) ) + FMUL_S ( REGOFF( 0x20, ESI ) ) + FLD_S ( REGOFF( 0x8, EDX ) ) + FMUL_S ( REGOFF( 0x24, ESI ) ) + FLD_S ( REGOFF( 0x8, EDX ) ) + FMUL_S ( REGOFF( 0x28, ESI ) ) + FLD_S ( REGOFF( 0x8, EDX ) ) + FMUL_S ( REGOFF( 0x2c, ESI ) ) + FXCH ( ST(3) ) + FADDP ( ST(0),ST(7) ) + FXCH ( ST(1) ) + FADDP ( ST(0),ST(5) ) + FADDP ( ST(0),ST(3) ) + FADDP ( ST(0),ST(1) ) + FXCH ( ST(3) ) + FADD_S ( REGOFF( 0x30, ESI ) ) + FXCH ( ST(2) ) + FADD_S ( REGOFF( 0x34, ESI ) ) + FXCH ( ST(1) ) + FADD_S ( REGOFF( 0x38, ESI ) ) + FXCH ( ST(3) ) + FADD_S ( REGOFF( 0x3c, ESI ) ) + FXCH ( ST(2) ) + FSTP_S ( REGOFF( 0x0, EAX ) ) + FSTP_S ( REGOFF( 0x4, EAX ) ) + FXCH ( ST(1) ) + FSTP_S ( REGOFF( 0x8, EAX ) ) + FSTP_S ( REGOFF( 0xc, EAX ) ) + ADD_L ( CONST(64), EAX ) + ADD_L ( EDI, EDX ) + DEC_L ( ECX ) + JNE ( LLBL(v16x86_loop) ) + + POP_L ( ESI ) + POP_L ( EDI ) + RET + + +/* + * Table for clip test. + * + * bit6 = S(3) < 0 + * bit5 = S(2) < 0 + * bit4 = abs(S(2)) > abs(S(3)) + * bit3 = S(1) < 0 + * bit2 = abs(S(1)) > abs(S(3)) + * bit1 = S(0) < 0 + * bit0 = abs(S(0)) > abs(S(3)) + */ + + + SEG_DATA + +clip_table: + D_BYTE 0, 1, 0, 2, 4, 5, 4, 6 + D_BYTE 0, 1, 0, 2, 8, 9, 8, 10 + D_BYTE 32, 33, 32, 34, 36, 37, 36, 38 + D_BYTE 32, 33, 32, 34, 40, 41, 40, 42 + D_BYTE 0, 1, 0, 2, 4, 5, 4, 6 + D_BYTE 0, 1, 0, 2, 8, 9, 8, 10 + D_BYTE 16, 17, 16, 18, 20, 21, 20, 22 + D_BYTE 16, 17, 16, 18, 24, 25, 24, 26 + D_BYTE 63, 61, 63, 62, 55, 53, 55, 54 + D_BYTE 63, 61, 63, 62, 59, 57, 59, 58 + D_BYTE 47, 45, 47, 46, 39, 37, 39, 38 + D_BYTE 47, 45, 47, 46, 43, 41, 43, 42 + D_BYTE 63, 61, 63, 62, 55, 53, 55, 54 + D_BYTE 63, 61, 63, 62, 59, 57, 59, 58 + D_BYTE 31, 29, 31, 30, 23, 21, 23, 22 + D_BYTE 31, 29, 31, 30, 27, 25, 27, 26 + + SEG_TEXT + + +/* +######################################## +## +## gl_v16_x86_cliptest_points4 +## +## Performs cliptesting equivalent to that done by cliptest_v16() +## in vertices.c +## +## This is a hacked version of the original above. +## +######################################## +*/ + + + +#define OFFSET_V16_SOURCE 4 +#define OFFSET_V16_LAST 8 +#define OFFSET_V16_OR 12 +#define OFFSET_V16_AND 16 +#define OFFSET_V16_MASK 20 + +#define ARG_V16_SOURCE REGOFF(V16_FRAME_OFFSET+OFFSET_V16_SOURCE, ESP) +#define ARG_V16_LAST REGOFF(V16_FRAME_OFFSET+OFFSET_V16_LAST, ESP) +#define ARG_V16_OR REGOFF(V16_FRAME_OFFSET+OFFSET_V16_OR, ESP) +#define ARG_V16_AND REGOFF(V16_FRAME_OFFSET+OFFSET_V16_AND, ESP) +#define ARG_V16_MASK REGOFF(V16_FRAME_OFFSET+OFFSET_V16_MASK, ESP) + + +#if defined(__ELF__) && defined(__PIC__) && !defined(ELFPIC) +#define ELFPIC +#endif + + GLOBL GLNAME(gl_v16_x86_cliptest_points4) + ALIGNTEXT4 + +GLNAME(gl_v16_x86_cliptest_points4): +#ifdef ELFPIC +#define V16_FRAME_OFFSET 20 +#else +#define V16_FRAME_OFFSET 16 +#endif + PUSH_L( ESI ) + PUSH_L( EDI ) + PUSH_L( EBP ) + PUSH_L( EBX ) + +#ifdef ELFPIC + /* store pointer to clip_table on stack */ + CALL( LLBL(v16_ctp4_get_eip) ) + ADD_L( CONST(_GLOBAL_OFFSET_TABLE_), EBX ) + MOV_L( REGOFF(clip_table@GOT, EBX), EBX ) + PUSH_L( EBX ) + JMP( LLBL(v16_ctp4_clip_table_ready) ) + +LLBL(v16_ctp4_get_eip): + /* store eip in ebx */ + MOV_L( REGIND(ESP), EBX ) + RET + +LLBL(v16_ctp4_clip_table_ready): +#endif + + MOV_L( ARG_V16_SOURCE, ESI ) /* ptr to first source vertex */ + MOV_L( ARG_V16_LAST, EDX ) /* ptr to last source vertex */ + MOV_L( ARG_V16_OR, EBX ) + MOV_L( ARG_V16_AND, EBP ) + MOV_L( ARG_V16_MASK, EDI ) + + CMP_L( EDX, ESI ) + + MOV_B( REGIND(EBX), AL ) + MOV_B( REGIND(EBP), AH ) + + JZ( LLBL(v16_ctp4_finish) ) + + ALIGNTEXT4ifNOP +LLBL(v16_ctp4_top): +#if 0 + FLD1 /* F0 */ + FDIV_S( S(3) ) +#endif + + MOV_L( S(3), EBP ) + MOV_L( S(2), EBX ) + + XOR_L( ECX, ECX ) + ADD_L( EBP, EBP ) /* ebp = abs(S(3))*2 ; carry = sign of S(3) */ + + ADC_L( ECX, ECX ) + ADD_L( EBX, EBX ) /* ebx = abs(S(2))*2 ; carry = sign of S(2) */ + + ADC_L( ECX, ECX ) + CMP_L( EBX, EBP ) /* carry = abs(S(2))*2 > abs(S(3))*2 */ + + ADC_L( ECX, ECX ) + MOV_L( S(1), EBX ) + + ADD_L( EBX, EBX ) /* ebx = abs(S(1))*2 ; carry = sign of S(1) */ + + ADC_L( ECX, ECX ) + CMP_L( EBX, EBP ) /* carry = abs(S(1))*2 > abs(S(3))*2 */ + + ADC_L( ECX, ECX ) + MOV_L( S(0), EBX ) + + ADD_L( EBX, EBX ) /* ebx = abs(S(0))*2 ; carry = sign of S(0) */ + + ADC_L( ECX, ECX ) + CMP_L( EBX, EBP ) /* carry = abs(S(0))*2 > abs(S(3))*2 */ + + ADC_L( ECX, ECX ) + +#ifdef ELFPIC + MOV_L( REGIND(ESP), EBP ) /* clip_table */ + + MOV_B( REGBI(EBP, ECX), CL ) +#else + MOV_B( REGOFF(clip_table,ECX), CL ) +#endif + + OR_B( CL, AL ) + AND_B( CL, AH ) + + MOV_B( CL, REGIND(EDI) ) /* save clipmask */ + INC_L( EDI ) /* next clipmask */ + +#if 0 + FSTP_S( S(8) ) /* */ /* GR_VERTEX_OOW_OFFSET */ +#endif + + ADD_L( CONST(64), ESI ) /* next fxVertex */ + + CMP_L( EDX, ESI ) /* finished? */ + JNZ( LLBL(v16_ctp4_top) ) + + MOV_L( ARG_V16_OR, ECX ) + MOV_L( ARG_V16_AND, EDX ) + + MOV_B( AL, REGIND(ECX) ) + MOV_B( AH, REGIND(EDX) ) + +LLBL(v16_ctp4_finish): + +#ifdef ELFPIC + POP_L( ESI ) /* discard ptr to clip_table */ +#endif + POP_L( EBX ) + POP_L( EBP ) + POP_L( EDI ) + POP_L( ESI ) + + RET Index: xc/extras/Mesa/src/X86/x86_xform_masked2.S diff -u /dev/null xc/extras/Mesa/src/X86/x86_xform_masked2.S:1.2 --- /dev/null Mon Dec 18 14:21:59 2000 +++ xc/extras/Mesa/src/X86/x86_xform_masked2.S Mon Nov 13 18:31:18 2000 @@ -0,0 +1,610 @@ + +/* + * Mesa 3-D graphics library + * Version: 3.4 + * + * Copyright (C) 1999-2000 Brian Paul All Rights Reserved. + * + * 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 + * BRIAN PAUL 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 "assyntax.h" +#include "xform_args.h" + + SEG_TEXT + +#define FRAME_OFFSET 16 + +#define FP_ONE 1065353216 +#define FP_ZERO 0 + +#define SRC(i) REGOFF(i * 4, ESI) +#define DST(i) REGOFF(i * 4, EDI) +#define MAT(i) REGOFF(i * 4, EDX) + + +ALIGNTEXT16 +GLOBL GLNAME( gl_x86_transform_points2_general_masked ) +GLNAME( gl_x86_transform_points2_general_masked ): + + PUSH_L( ESI ) + PUSH_L( EDI ) + + PUSH_L( EBX ) + PUSH_L( EBP ) + + MOV_L( ARG_SOURCE, ESI ) + MOV_L( ARG_DEST, EDI ) + + MOV_L( ARG_MATRIX, EDX ) + MOV_L( ARG_CLIP, EBP ) + + MOV_L( REGOFF(V4F_COUNT, ESI), ECX ) + MOV_B( ARG_FLAG, BL ) + + TEST_L( ECX, ECX ) + JZ( LLBL( x86_p2_gm_done ) ) + + MOV_L( REGOFF(V4F_STRIDE, ESI), EAX ) + OR_L( CONST(VEC_SIZE_4), REGOFF(V4F_FLAGS, EDI) ) + + MOV_L( ECX, REGOFF(V4F_COUNT, EDI) ) + MOV_L( CONST(4), REGOFF(V4F_SIZE, EDI) ) + + SHL_L( CONST(4), ECX ) + MOV_L( REGOFF(V4F_START, ESI), ESI ) + + MOV_L( REGOFF(V4F_START, EDI), EDI ) + ADD_L( EDI, ECX ) + +ALIGNTEXT16 +LLBL( x86_p2_gm_loop ): + + TEST_B( BL, REGIND(EBP) ) + JNZ( LLBL( x86_p2_gm_skip ) ) + + FLD_S( SRC(0) ) /* F4 */ + FMUL_S( MAT(0) ) + FLD_S( SRC(0) ) /* F5 F4 */ + FMUL_S( MAT(1) ) + FLD_S( SRC(0) ) /* F6 F5 F4 */ + FMUL_S( MAT(2) ) + FLD_S( SRC(0) ) /* F7 F6 F5 F4 */ + FMUL_S( MAT(3) ) + + FLD_S( SRC(1) ) /* F0 F7 F6 F5 F4 */ + FMUL_S( MAT(4) ) + FLD_S( SRC(1) ) /* F1 F0 F7 F6 F5 F4 */ + FMUL_S( MAT(5) ) + FLD_S( SRC(1) ) /* F2 F1 F0 F7 F6 F5 F4 */ + FMUL_S( MAT(6) ) + FLD_S( SRC(1) ) /* F3 F2 F1 F0 F7 F6 F5 F4 */ + FMUL_S( MAT(7) ) + + FXCH( ST(3) ) /* F0 F2 F1 F3 F7 F6 F5 F4 */ + FADDP( ST(0), ST(7) ) /* F2 F1 F3 F7 F6 F5 F4 */ + FXCH( ST(1) ) /* F1 F2 F3 F7 F6 F5 F4 */ + FADDP( ST(0), ST(5) ) /* F2 F3 F7 F6 F5 F4 */ + FADDP( ST(0), ST(3) ) /* F3 F7 F6 F5 F4 */ + FADDP( ST(0), ST(1) ) /* F7 F6 F5 F4 */ + + FXCH( ST(3) ) /* F4 F6 F5 F7 */ + FADD_S( MAT(12) ) + FXCH( ST(2) ) /* F5 F6 F4 F7 */ + FADD_S( MAT(13) ) + FXCH( ST(1) ) /* F6 F5 F4 F7 */ + FADD_S( MAT(14) ) + FXCH( ST(3) ) /* F7 F5 F4 F6 */ + FADD_S( MAT(15) ) + + FXCH( ST(2) ) /* F4 F5 F7 F6 */ + FSTP_S( DST(0) ) /* F5 F7 F6 */ + FSTP_S( DST(1) ) /* F7 F6 */ + FXCH( ST(1) ) /* F6 F7 */ + FSTP_S( DST(2) ) /* F7 */ + FSTP_S( DST(3) ) /* */ + +LLBL( x86_p2_gm_skip ): + + INC_L( EBP ) + ADD_L( CONST(16), EDI ) + ADD_L( EAX, ESI ) + CMP_L( ECX, EDI ) + JNE( LLBL( x86_p2_gm_loop ) ) + +LLBL( x86_p2_gm_done ): + + POP_L( EBP ) + POP_L( EBX ) + POP_L( EDI ) + POP_L( ESI ) + RET + + + + +ALIGNTEXT16 +GLOBL GLNAME( gl_x86_transform_points2_perspective_masked ) +GLNAME( gl_x86_transform_points2_perspective_masked ): + + PUSH_L( ESI ) + PUSH_L( EDI ) + + PUSH_L( EBX ) + PUSH_L( EBP ) + + MOV_L( ARG_SOURCE, ESI ) + MOV_L( ARG_DEST, EDI ) + + MOV_L( ARG_MATRIX, EDX ) + MOV_L( ARG_CLIP, EBP ) + + MOV_L( REGOFF(V4F_COUNT, ESI), ECX ) + MOV_B( ARG_FLAG, BL ) + + TEST_L( ECX, ECX ) + JZ( LLBL( x86_p2_pm_done ) ) + + MOV_L( REGOFF(V4F_STRIDE, ESI), EAX ) + OR_L( CONST(VEC_SIZE_4), REGOFF(V4F_FLAGS, EDI) ) + + MOV_L( ECX, REGOFF(V4F_COUNT, EDI) ) + MOV_L( CONST(4), REGOFF(V4F_SIZE, EDI) ) + + SHL_L( CONST(4), ECX ) + MOV_L( REGOFF(V4F_START, ESI), ESI ) + + MOV_L( REGOFF(V4F_START, EDI), EDI ) + ADD_L( EDI, ECX ) + + /* need eax; put stride in ARG_SOURCE */ + MOV_L( EAX, ARG_SOURCE ) + + MOV_L( MAT(14), EAX ) + +ALIGNTEXT16 +LLBL( x86_p2_pm_loop ): + + TEST_B( BL, REGIND(EBP) ) + JNZ( LLBL( x86_p2_pm_skip ) ) + + FLD_S( SRC(0) ) /* F4 */ + FMUL_S( MAT(0) ) + + FLD_S( SRC(1) ) /* F1 F4 */ + FMUL_S( MAT(5) ) + + FXCH( ST(1) ) /* F4 F1 */ + FSTP_S( DST(0) ) /* F1 */ + FSTP_S( DST(1) ) /* */ + MOV_L( EAX, DST(2) ) + MOV_L( CONST(FP_ZERO), DST(3) ) + +LLBL( x86_p2_pm_skip ): + + INC_L( EBP ) + ADD_L( CONST(16), EDI ) + ADD_L( ARG_SOURCE, ESI ) + CMP_L( ECX, EDI ) + JNE( LLBL( x86_p2_pm_loop ) ) + +LLBL( x86_p2_pm_done ): + + POP_L( EBP ) + POP_L( EBX ) + POP_L( EDI ) + POP_L( ESI ) + RET + + + + +ALIGNTEXT16 +GLOBL GLNAME( gl_x86_transform_points2_3d_masked ) +GLNAME( gl_x86_transform_points2_3d_masked ): + + PUSH_L( ESI ) + PUSH_L( EDI ) + + PUSH_L( EBX ) + PUSH_L( EBP ) + + MOV_L( ARG_SOURCE, ESI ) + MOV_L( ARG_DEST, EDI ) + + MOV_L( ARG_MATRIX, EDX ) + MOV_L( ARG_CLIP, EBP ) + + MOV_L( REGOFF(V4F_COUNT, ESI), ECX ) + MOV_B( ARG_FLAG, BL ) + + TEST_L( ECX, ECX ) + JZ( LLBL( x86_p2_3dm_done ) ) + + MOV_L( REGOFF(V4F_STRIDE, ESI), EAX ) + OR_L( CONST(VEC_SIZE_3), REGOFF(V4F_FLAGS, EDI) ) + + MOV_L( ECX, REGOFF(V4F_COUNT, EDI) ) + MOV_L( CONST(3), REGOFF(V4F_SIZE, EDI) ) + + SHL_L( CONST(4), ECX ) + MOV_L( REGOFF(V4F_START, ESI), ESI ) + + MOV_L( REGOFF(V4F_START, EDI), EDI ) + ADD_L( EDI, ECX ) + +ALIGNTEXT16 +LLBL( x86_p2_3dm_loop ): + + TEST_B( BL, REGIND(EBP) ) + JNZ( LLBL( x86_p2_3dm_skip ) ) + + FLD_S( SRC(0) ) /* F4 */ + FMUL_S( MAT(0) ) + FLD_S( SRC(0) ) /* F5 F4 */ + FMUL_S( MAT(1) ) + FLD_S( SRC(0) ) /* F6 F5 F4 */ + FMUL_S( MAT(2) ) + + FLD_S( SRC(1) ) /* F0 F6 F5 F4 */ + FMUL_S( MAT(4) ) + FLD_S( SRC(1) ) /* F1 F0 F6 F5 F4 */ + FMUL_S( MAT(5) ) + FLD_S( SRC(1) ) /* F2 F1 F0 F6 F5 F4 */ + FMUL_S( MAT(6) ) + + FXCH( ST(2) ) /* F0 F1 F2 F6 F5 F4 */ + FADDP( ST(0), ST(5) ) /* F1 F2 F6 F5 F4 */ + FADDP( ST(0), ST(3) ) /* F2 F6 F5 F4 */ + FADDP( ST(0), ST(1) ) /* F6 F5 F4 */ + + FXCH( ST(2) ) /* F4 F5 F6 */ + FADD_S( MAT(12) ) + FXCH( ST(1) ) /* F5 F4 F6 */ + FADD_S( MAT(13) ) + FXCH( ST(2) ) /* F6 F4 F5 */ + FADD_S( MAT(14) ) + + FXCH( ST(1) ) /* F4 F6 F5 */ + FSTP_S( DST(0) ) /* F6 F5 */ + FXCH( ST(1) ) /* F5 F6 */ + FSTP_S( DST(1) ) /* F6 */ + FSTP_S( DST(2) ) /* */ + +LLBL( x86_p2_3dm_skip ): + + INC_L( EBP ) + ADD_L( CONST(16), EDI ) + ADD_L( EAX, ESI ) + CMP_L( ECX, EDI ) + JNE( LLBL( x86_p2_3dm_loop ) ) + +LLBL( x86_p2_3dm_done ): + + POP_L( EBP ) + POP_L( EBX ) + POP_L( EDI ) + POP_L( ESI ) + RET + + + + +ALIGNTEXT16 +GLOBL GLNAME( gl_x86_transform_points2_3d_no_rot_masked ) +GLNAME( gl_x86_transform_points2_3d_no_rot_masked ): + + PUSH_L( ESI ) + PUSH_L( EDI ) + + PUSH_L( EBX ) + PUSH_L( EBP ) + + MOV_L( ARG_SOURCE, ESI ) + MOV_L( ARG_DEST, EDI ) + + MOV_L( ARG_MATRIX, EDX ) + MOV_L( ARG_CLIP, EBP ) + + MOV_L( REGOFF(V4F_COUNT, ESI), ECX ) + MOV_B( ARG_FLAG, BL ) + + TEST_L( ECX, ECX ) + JZ( LLBL( x86_p2_3dnrm_done ) ) + + MOV_L( REGOFF(V4F_STRIDE, ESI), EAX ) + OR_L( CONST(VEC_SIZE_3), REGOFF(V4F_FLAGS, EDI) ) + + MOV_L( ECX, REGOFF(V4F_COUNT, EDI) ) + MOV_L( CONST(3), REGOFF(V4F_SIZE, EDI) ) + + SHL_L( CONST(4), ECX ) + MOV_L( REGOFF(V4F_START, ESI), ESI ) + + MOV_L( REGOFF(V4F_START, EDI), EDI ) + ADD_L( EDI, ECX ) + + /* need eax; put stride in ARG_SOURCE */ + MOV_L( EAX, ARG_SOURCE ) + + MOV_L( MAT(14), EAX ) + +ALIGNTEXT16 +LLBL( x86_p2_3dnrm_loop ): + + TEST_B( BL, REGIND(EBP) ) + JNZ( LLBL( x86_p2_3dnrm_skip ) ) + + FLD_S( SRC(0) ) /* F4 */ + FMUL_S( MAT(0) ) + + FLD_S( SRC(1) ) /* F1 F4 */ + FMUL_S( MAT(5) ) + + FXCH( ST(1) ) /* F4 F1 */ + FADD_S( MAT(12) ) + FLD_S( MAT(13) ) /* F5 F4 F1 */ + FXCH( ST(2) ) /* F1 F4 F5 */ + FADDP( ST(0), ST(2) ) /* F4 F5 */ + + FSTP_S( DST(0) ) /* F5 */ + FSTP_S( DST(1) ) /* */ + MOV_L( EAX, DST(2) ) + +LLBL( x86_p2_3dnrm_skip ): + + INC_L( EBP ) + ADD_L( CONST(16), EDI ) + ADD_L( ARG_SOURCE, ESI ) + CMP_L( ECX, EDI ) + JNE( LLBL( x86_p2_3dnrm_loop ) ) + +LLBL( x86_p2_3dnrm_done ): + + POP_L( EBP ) + POP_L( EBX ) + POP_L( EDI ) + POP_L( ESI ) + RET + + + + +ALIGNTEXT16 +GLOBL GLNAME( gl_x86_transform_points2_2d_masked ) +GLNAME( gl_x86_transform_points2_2d_masked ): + + PUSH_L( ESI ) + PUSH_L( EDI ) + + PUSH_L( EBX ) + PUSH_L( EBP ) + + MOV_L( ARG_SOURCE, ESI ) + MOV_L( ARG_DEST, EDI ) + + MOV_L( ARG_MATRIX, EDX ) + MOV_L( ARG_CLIP, EBP ) + + MOV_L( REGOFF(V4F_COUNT, ESI), ECX ) + MOV_B( ARG_FLAG, BL ) + + TEST_L( ECX, ECX ) + JZ( LLBL( x86_p2_2dm_done ) ) + + MOV_L( REGOFF(V4F_STRIDE, ESI), EAX ) + OR_L( CONST(VEC_SIZE_2), REGOFF(V4F_FLAGS, EDI) ) + + MOV_L( ECX, REGOFF(V4F_COUNT, EDI) ) + MOV_L( CONST(2), REGOFF(V4F_SIZE, EDI) ) + + SHL_L( CONST(4), ECX ) + MOV_L( REGOFF(V4F_START, ESI), ESI ) + + MOV_L( REGOFF(V4F_START, EDI), EDI ) + ADD_L( EDI, ECX ) + +ALIGNTEXT16 +LLBL( x86_p2_2dm_loop ): + + TEST_B( BL, REGIND(EBP) ) + JNZ( LLBL( x86_p2_2dm_skip ) ) + + FLD_S( SRC(0) ) /* F4 */ + FMUL_S( MAT(0) ) + FLD_S( SRC(0) ) /* F5 F4 */ + FMUL_S( MAT(1) ) + + FLD_S( SRC(1) ) /* F0 F5 F4 */ + FMUL_S( MAT(4) ) + FLD_S( SRC(1) ) /* F1 F0 F5 F4 */ + FMUL_S( MAT(5) ) + + FXCH( ST(1) ) /* F0 F1 F5 F4 */ + FADDP( ST(0), ST(3) ) /* F1 F5 F4 */ + FADDP( ST(0), ST(1) ) /* F5 F4 */ + + FXCH( ST(1) ) /* F4 F5 */ + FADD_S( MAT(12) ) + FXCH( ST(1) ) /* F5 F4 */ + FADD_S( MAT(13) ) + + FXCH( ST(1) ) /* F4 F5 */ + FSTP_S( DST(0) ) /* F5 */ + FSTP_S( DST(1) ) /* */ + +LLBL( x86_p2_2dm_skip ): + + INC_L( EBP ) + ADD_L( CONST(16), EDI ) + ADD_L( EAX, ESI ) + CMP_L( ECX, EDI ) + JNE( LLBL( x86_p2_2dm_loop ) ) + +LLBL( x86_p2_2dm_done ): + + POP_L( EBP ) + POP_L( EBX ) + POP_L( EDI ) + POP_L( ESI ) + RET + + + + +ALIGNTEXT16 +GLOBL GLNAME( gl_x86_transform_points2_2d_no_rot_masked ) +GLNAME( gl_x86_transform_points2_2d_no_rot_masked ): + + PUSH_L( ESI ) + PUSH_L( EDI ) + + PUSH_L( EBX ) + PUSH_L( EBP ) + + MOV_L( ARG_SOURCE, ESI ) + MOV_L( ARG_DEST, EDI ) + + MOV_L( ARG_MATRIX, EDX ) + MOV_L( ARG_CLIP, EBP ) + + MOV_L( REGOFF(V4F_COUNT, ESI), ECX ) + MOV_B( ARG_FLAG, BL ) + + TEST_L( ECX, ECX ) + JZ( LLBL( x86_p2_2dnrm_done ) ) + + MOV_L( REGOFF(V4F_STRIDE, ESI), EAX ) + OR_L( CONST(VEC_SIZE_2), REGOFF(V4F_FLAGS, EDI) ) + + MOV_L( ECX, REGOFF(V4F_COUNT, EDI) ) + MOV_L( CONST(2), REGOFF(V4F_SIZE, EDI) ) + + SHL_L( CONST(4), ECX ) + MOV_L( REGOFF(V4F_START, ESI), ESI ) + + MOV_L( REGOFF(V4F_START, EDI), EDI ) + ADD_L( EDI, ECX ) + +ALIGNTEXT16 +LLBL( x86_p2_2dnrm_loop ): + + TEST_B( BL, REGIND(EBP) ) + JNZ( LLBL( x86_p2_2dnrm_skip ) ) + + FLD_S( SRC(0) ) /* F4 */ + FMUL_S( MAT(0) ) + + FLD_S( SRC(1) ) /* F1 F4 */ + FMUL_S( MAT(5) ) + + FXCH( ST(1) ) /* F4 F1 */ + FADD_S( MAT(12) ) + FLD_S( MAT(13) ) /* F5 F4 F1 */ + FXCH( ST(2) ) /* F1 F4 F5 */ + FADDP( ST(0), ST(2) ) /* F4 F5 */ + + FSTP_S( DST(0) ) /* F5 */ + FSTP_S( DST(1) ) /* */ + +LLBL( x86_p2_2dnrm_skip ): + + INC_L( EBP ) + ADD_L( CONST(16), EDI ) + ADD_L( EAX, ESI ) + CMP_L( ECX, EDI ) + JNE( LLBL( x86_p2_2dnrm_loop ) ) + +LLBL( x86_p2_2dnrm_done ): + + POP_L( EBP ) + POP_L( EBX ) + POP_L( EDI ) + POP_L( ESI ) + RET + + + + +ALIGNTEXT16 +GLOBL GLNAME( gl_x86_transform_points2_identity_masked ) +GLNAME( gl_x86_transform_points2_identity_masked ): + + PUSH_L( ESI ) + PUSH_L( EDI ) + + PUSH_L( EBX ) + PUSH_L( EBP ) + + MOV_L( ARG_SOURCE, ESI ) + MOV_L( ARG_DEST, EDI ) + + MOV_L( ARG_MATRIX, EDX ) + MOV_L( ARG_CLIP, EBP ) + + MOV_L( REGOFF(V4F_COUNT, ESI), ECX ) + MOV_B( ARG_FLAG, BL ) + + TEST_L( ECX, ECX ) + JZ( LLBL( x86_p2_im_done ) ) + + MOV_L( REGOFF(V4F_STRIDE, ESI), EAX ) + OR_L( CONST(VEC_SIZE_2), REGOFF(V4F_FLAGS, EDI) ) + + MOV_L( ECX, REGOFF(V4F_COUNT, EDI) ) + MOV_L( CONST(2), REGOFF(V4F_SIZE, EDI) ) + + SHL_L( CONST(4), ECX ) + MOV_L( REGOFF(V4F_START, ESI), ESI ) + + MOV_L( REGOFF(V4F_START, EDI), EDI ) + ADD_L( EDI, ECX ) + + /* need eax; put stride in ARG_SOURCE */ + MOV_L( EAX, ARG_SOURCE ) + + CMP_L( ESI, EDI ) + JE( LLBL( x86_p2_im_done ) ) + +ALIGNTEXT16 +LLBL( x86_p2_im_loop ): + + TEST_B( BL, REGIND(EBP) ) + JNZ( LLBL( x86_p2_im_skip ) ) + + MOV_L( SRC(0), EAX ) + MOV_L( SRC(1), EDX ) + + MOV_L( EAX, DST(0) ) + MOV_L( EDX, DST(1) ) + +LLBL( x86_p2_im_skip ): + + INC_L( EBP ) + ADD_L( CONST(16), EDI ) + ADD_L( ARG_SOURCE, ESI ) + CMP_L( ECX, EDI ) + JNE( LLBL( x86_p2_im_loop ) ) + +LLBL( x86_p2_im_done ): + + POP_L( EBP ) + POP_L( EBX ) + POP_L( EDI ) + POP_L( ESI ) + RET Index: xc/extras/Mesa/src/X86/x86_xform_masked3.S diff -u /dev/null xc/extras/Mesa/src/X86/x86_xform_masked3.S:1.2 --- /dev/null Mon Dec 18 14:21:59 2000 +++ xc/extras/Mesa/src/X86/x86_xform_masked3.S Mon Nov 13 18:31:19 2000 @@ -0,0 +1,670 @@ + +/* + * Mesa 3-D graphics library + * Version: 3.4 + * + * Copyright (C) 1999-2000 Brian Paul All Rights Reserved. + * + * 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 + * BRIAN PAUL 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 "assyntax.h" +#include "xform_args.h" + + SEG_TEXT + +#define FRAME_OFFSET 16 + +#define FP_ONE 1065353216 +#define FP_ZERO 0 + +#define SRC(i) REGOFF(i * 4, ESI) +#define DST(i) REGOFF(i * 4, EDI) +#define MAT(i) REGOFF(i * 4, EDX) + + +ALIGNTEXT16 +GLOBL GLNAME( gl_x86_transform_points3_general_masked ) +GLNAME( gl_x86_transform_points3_general_masked ): + + PUSH_L( ESI ) + PUSH_L( EDI ) + + PUSH_L( EBX ) + PUSH_L( EBP ) + + MOV_L( ARG_SOURCE, ESI ) + MOV_L( ARG_DEST, EDI ) + + MOV_L( ARG_MATRIX, EDX ) + MOV_L( ARG_CLIP, EBP ) + + MOV_L( REGOFF(V4F_COUNT, ESI), ECX ) + MOV_B( ARG_FLAG, BL ) + + TEST_L( ECX, ECX ) + JZ( LLBL( x86_p3_gm_done ) ) + + MOV_L( REGOFF(V4F_STRIDE, ESI), EAX ) + OR_L( CONST(VEC_SIZE_4), REGOFF(V4F_FLAGS, EDI) ) + + MOV_L( ECX, REGOFF(V4F_COUNT, EDI) ) + MOV_L( CONST(4), REGOFF(V4F_SIZE, EDI) ) + + SHL_L( CONST(4), ECX ) + MOV_L( REGOFF(V4F_START, ESI), ESI ) + + MOV_L( REGOFF(V4F_START, EDI), EDI ) + ADD_L( EDI, ECX ) + +ALIGNTEXT16 +LLBL( x86_p3_gm_loop ): + + TEST_B( BL, REGIND(EBP) ) + JNZ( LLBL( x86_p3_gm_skip ) ) + + FLD_S( SRC(0) ) /* F4 */ + FMUL_S( MAT(0) ) + FLD_S( SRC(0) ) /* F5 F4 */ + FMUL_S( MAT(1) ) + FLD_S( SRC(0) ) /* F6 F5 F4 */ + FMUL_S( MAT(2) ) + FLD_S( SRC(0) ) /* F7 F6 F5 F4 */ + FMUL_S( MAT(3) ) + + FLD_S( SRC(1) ) /* F0 F7 F6 F5 F4 */ + FMUL_S( MAT(4) ) + FLD_S( SRC(1) ) /* F1 F0 F7 F6 F5 F4 */ + FMUL_S( MAT(5) ) + FLD_S( SRC(1) ) /* F2 F1 F0 F7 F6 F5 F4 */ + FMUL_S( MAT(6) ) + FLD_S( SRC(1) ) /* F3 F2 F1 F0 F7 F6 F5 F4 */ + FMUL_S( MAT(7) ) + + FXCH( ST(3) ) /* F0 F2 F1 F3 F7 F6 F5 F4 */ + FADDP( ST(0), ST(7) ) /* F2 F1 F3 F7 F6 F5 F4 */ + FXCH( ST(1) ) /* F1 F2 F3 F7 F6 F5 F4 */ + FADDP( ST(0), ST(5) ) /* F2 F3 F7 F6 F5 F4 */ + FADDP( ST(0), ST(3) ) /* F3 F7 F6 F5 F4 */ + FADDP( ST(0), ST(1) ) /* F7 F6 F5 F4 */ + + FLD_S( SRC(2) ) /* F0 F7 F6 F5 F4 */ + FMUL_S( MAT(8) ) + FLD_S( SRC(2) ) /* F1 F0 F7 F6 F5 F4 */ + FMUL_S( MAT(9) ) + FLD_S( SRC(2) ) /* F2 F1 F0 F7 F6 F5 F4 */ + FMUL_S( MAT(10) ) + FLD_S( SRC(2) ) /* F3 F2 F1 F0 F7 F6 F5 F4 */ + FMUL_S( MAT(11) ) + + FXCH( ST(3) ) /* F0 F2 F1 F3 F7 F6 F5 F4 */ + FADDP( ST(0), ST(7) ) /* F2 F1 F3 F7 F6 F5 F4 */ + FXCH( ST(1) ) /* F1 F2 F3 F7 F6 F5 F4 */ + FADDP( ST(0), ST(5) ) /* F2 F3 F7 F6 F5 F4 */ + FADDP( ST(0), ST(3) ) /* F3 F7 F6 F5 F4 */ + FADDP( ST(0), ST(1) ) /* F7 F6 F5 F4 */ + + FXCH( ST(3) ) /* F4 F6 F5 F7 */ + FADD_S( MAT(12) ) + FXCH( ST(2) ) /* F5 F6 F4 F7 */ + FADD_S( MAT(13) ) + FXCH( ST(1) ) /* F6 F5 F4 F7 */ + FADD_S( MAT(14) ) + FXCH( ST(3) ) /* F7 F5 F4 F6 */ + FADD_S( MAT(15) ) + + FXCH( ST(2) ) /* F4 F5 F7 F6 */ + FSTP_S( DST(0) ) /* F5 F7 F6 */ + FSTP_S( DST(1) ) /* F7 F6 */ + FXCH( ST(1) ) /* F6 F7 */ + FSTP_S( DST(2) ) /* F7 */ + FSTP_S( DST(3) ) /* */ + +LLBL( x86_p3_gm_skip ): + + INC_L( EBP ) + ADD_L( CONST(16), EDI ) + ADD_L( EAX, ESI ) + CMP_L( ECX, EDI ) + JNE( LLBL( x86_p3_gm_loop ) ) + +LLBL( x86_p3_gm_done ): + + POP_L( EBP ) + POP_L( EBX ) + POP_L( EDI ) + POP_L( ESI ) + RET + + + + +ALIGNTEXT16 +GLOBL GLNAME( gl_x86_transform_points3_perspective_masked ) +GLNAME( gl_x86_transform_points3_perspective_masked ): + + PUSH_L( ESI ) + PUSH_L( EDI ) + + PUSH_L( EBX ) + PUSH_L( EBP ) + + MOV_L( ARG_SOURCE, ESI ) + MOV_L( ARG_DEST, EDI ) + + MOV_L( ARG_MATRIX, EDX ) + MOV_L( ARG_CLIP, EBP ) + + MOV_L( REGOFF(V4F_COUNT, ESI), ECX ) + MOV_B( ARG_FLAG, BL ) + + TEST_L( ECX, ECX ) + JZ( LLBL( x86_p3_pm_done ) ) + + MOV_L( REGOFF(V4F_STRIDE, ESI), EAX ) + OR_L( CONST(VEC_SIZE_4), REGOFF(V4F_FLAGS, EDI) ) + + MOV_L( ECX, REGOFF(V4F_COUNT, EDI) ) + MOV_L( CONST(4), REGOFF(V4F_SIZE, EDI) ) + + SHL_L( CONST(4), ECX ) + MOV_L( REGOFF(V4F_START, ESI), ESI ) + + MOV_L( REGOFF(V4F_START, EDI), EDI ) + ADD_L( EDI, ECX ) + + /* need eax; put stride in ARG_SOURCE */ + MOV_L( EAX, ARG_SOURCE ) + +ALIGNTEXT16 +LLBL( x86_p3_pm_loop ): + + TEST_B( BL, REGIND(EBP) ) + JNZ( LLBL( x86_p3_pm_skip ) ) + + FLD_S( SRC(0) ) /* F4 */ + FMUL_S( MAT(0) ) + + FLD_S( SRC(1) ) /* F5 F4 */ + FMUL_S( MAT(5) ) + + FLD_S( SRC(2) ) /* F0 F5 F4 */ + FMUL_S( MAT(8) ) + FLD_S( SRC(2) ) /* F1 F0 F5 F4 */ + FMUL_S( MAT(9) ) + FLD_S( SRC(2) ) /* F2 F1 F0 F5 F4 */ + FMUL_S( MAT(10) ) + + FXCH( ST(2) ) /* F0 F1 F2 F5 F4 */ + FADDP( ST(0), ST(4) ) /* F1 F2 F5 F4 */ + FADDP( ST(0), ST(2) ) /* F2 F5 F4 */ + FLD_S( MAT(14) ) /* F6 F2 F5 F4 */ + FXCH( ST(1) ) /* F2 F6 F5 F4 */ + FADDP( ST(0), ST(1) ) /* F6 F5 F4 */ + + MOV_L( SRC(2), EAX ) + XOR_L( CONST(-2147483648), EAX )/* change sign */ + + FXCH( ST(2) ) /* F4 F5 F6 */ + FSTP_S( DST(0) ) /* F5 F6 */ + FSTP_S( DST(1) ) /* F6 */ + FSTP_S( DST(2) ) /* */ + MOV_L( EAX, DST(3) ) + +LLBL( x86_p3_pm_skip ): + + INC_L( EBP ) + ADD_L( CONST(16), EDI ) + ADD_L( ARG_SOURCE, ESI ) + CMP_L( ECX, EDI ) + JNE( LLBL( x86_p3_pm_loop ) ) + +LLBL( x86_p3_pm_done ): + + POP_L( EBP ) + POP_L( EBX ) + POP_L( EDI ) + POP_L( ESI ) + RET + + + + +ALIGNTEXT16 +GLOBL GLNAME( gl_x86_transform_points3_3d_masked ) +GLNAME( gl_x86_transform_points3_3d_masked ): + + PUSH_L( ESI ) + PUSH_L( EDI ) + + PUSH_L( EBX ) + PUSH_L( EBP ) + + MOV_L( ARG_SOURCE, ESI ) + MOV_L( ARG_DEST, EDI ) + + MOV_L( ARG_MATRIX, EDX ) + MOV_L( ARG_CLIP, EBP ) + + MOV_L( REGOFF(V4F_COUNT, ESI), ECX ) + MOV_B( ARG_FLAG, BL ) + + TEST_L( ECX, ECX ) + JZ( LLBL( x86_p3_3dm_done ) ) + + MOV_L( REGOFF(V4F_STRIDE, ESI), EAX ) + OR_L( CONST(VEC_SIZE_3), REGOFF(V4F_FLAGS, EDI) ) + + MOV_L( ECX, REGOFF(V4F_COUNT, EDI) ) + MOV_L( CONST(3), REGOFF(V4F_SIZE, EDI) ) + + SHL_L( CONST(4), ECX ) + MOV_L( REGOFF(V4F_START, ESI), ESI ) + + MOV_L( REGOFF(V4F_START, EDI), EDI ) + ADD_L( EDI, ECX ) + +ALIGNTEXT16 +LLBL( x86_p3_3dm_loop ): + + TEST_B( BL, REGIND(EBP) ) + JNZ( LLBL( x86_p3_3dm_skip ) ) + + FLD_S( SRC(0) ) /* F4 */ + FMUL_S( MAT(0) ) + FLD_S( SRC(0) ) /* F5 F4 */ + FMUL_S( MAT(1) ) + FLD_S( SRC(0) ) /* F6 F5 F4 */ + FMUL_S( MAT(2) ) + + FLD_S( SRC(1) ) /* F0 F6 F5 F4 */ + FMUL_S( MAT(4) ) + FLD_S( SRC(1) ) /* F1 F0 F6 F5 F4 */ + FMUL_S( MAT(5) ) + FLD_S( SRC(1) ) /* F2 F1 F0 F6 F5 F4 */ + FMUL_S( MAT(6) ) + + FXCH( ST(2) ) /* F0 F1 F2 F6 F5 F4 */ + FADDP( ST(0), ST(5) ) /* F1 F2 F6 F5 F4 */ + FADDP( ST(0), ST(3) ) /* F2 F6 F5 F4 */ + FADDP( ST(0), ST(1) ) /* F6 F5 F4 */ + + FLD_S( SRC(2) ) /* F0 F6 F5 F4 */ + FMUL_S( MAT(8) ) + FLD_S( SRC(2) ) /* F1 F0 F6 F5 F4 */ + FMUL_S( MAT(9) ) + FLD_S( SRC(2) ) /* F2 F1 F0 F6 F5 F4 */ + FMUL_S( MAT(10) ) + + FXCH( ST(2) ) /* F0 F1 F2 F6 F5 F4 */ + FADDP( ST(0), ST(5) ) /* F1 F2 F6 F5 F4 */ + FADDP( ST(0), ST(3) ) /* F2 F6 F5 F4 */ + FADDP( ST(0), ST(1) ) /* F6 F5 F4 */ + + FXCH( ST(2) ) /* F4 F5 F6 */ + FADD_S( MAT(12) ) + FXCH( ST(1) ) /* F5 F4 F6 */ + FADD_S( MAT(13) ) + FXCH( ST(2) ) /* F6 F4 F5 */ + FADD_S( MAT(14) ) + + FXCH( ST(1) ) /* F4 F6 F5 */ + FSTP_S( DST(0) ) /* F6 F5 */ + FXCH( ST(1) ) /* F5 F6 */ + FSTP_S( DST(1) ) /* F6 */ + FSTP_S( DST(2) ) /* */ + +LLBL( x86_p3_3dm_skip ): + + INC_L( EBP ) + ADD_L( CONST(16), EDI ) + ADD_L( EAX, ESI ) + CMP_L( ECX, EDI ) + JNE( LLBL( x86_p3_3dm_loop ) ) + +LLBL( x86_p3_3dm_done ): + + POP_L( EBP ) + POP_L( EBX ) + POP_L( EDI ) + POP_L( ESI ) + RET + + + + +ALIGNTEXT16 +GLOBL GLNAME( gl_x86_transform_points3_3d_no_rot_masked ) +GLNAME( gl_x86_transform_points3_3d_no_rot_masked ): + + PUSH_L( ESI ) + PUSH_L( EDI ) + + PUSH_L( EBX ) + PUSH_L( EBP ) + + MOV_L( ARG_SOURCE, ESI ) + MOV_L( ARG_DEST, EDI ) + + MOV_L( ARG_MATRIX, EDX ) + MOV_L( ARG_CLIP, EBP ) + + MOV_L( REGOFF(V4F_COUNT, ESI), ECX ) + MOV_B( ARG_FLAG, BL ) + + TEST_L( ECX, ECX ) + JZ( LLBL( x86_p3_3dnrm_done ) ) + + MOV_L( REGOFF(V4F_STRIDE, ESI), EAX ) + OR_L( CONST(VEC_SIZE_3), REGOFF(V4F_FLAGS, EDI) ) + + MOV_L( ECX, REGOFF(V4F_COUNT, EDI) ) + MOV_L( CONST(3), REGOFF(V4F_SIZE, EDI) ) + + SHL_L( CONST(4), ECX ) + MOV_L( REGOFF(V4F_START, ESI), ESI ) + + MOV_L( REGOFF(V4F_START, EDI), EDI ) + ADD_L( EDI, ECX ) + +ALIGNTEXT16 +LLBL( x86_p3_3dnrm_loop ): + + TEST_B( BL, REGIND(EBP) ) + JNZ( LLBL( x86_p3_3dnrm_skip ) ) + + FLD_S( SRC(0) ) /* F4 */ + FMUL_S( MAT(0) ) + + FLD_S( SRC(1) ) /* F1 F4 */ + FMUL_S( MAT(5) ) + + FLD_S( SRC(2) ) /* F2 F1 F4 */ + FMUL_S( MAT(10) ) + + FXCH( ST(2) ) /* F4 F1 F2 */ + FADD_S( MAT(12) ) + FLD_S( MAT(13) ) /* F5 F4 F1 F2 */ + FXCH( ST(2) ) /* F1 F4 F5 F2 */ + FADDP( ST(0), ST(2) ) /* F4 F5 F2 */ + FLD_S( MAT(14) ) /* F6 F4 F5 F2 */ + FXCH( ST(3) ) /* F2 F4 F5 F6 */ + FADDP( ST(0), ST(3) ) /* F4 F5 F6 */ + + FSTP_S( DST(0) ) /* F5 F6 */ + FSTP_S( DST(1) ) /* F6 */ + FSTP_S( DST(2) ) /* */ + +LLBL( x86_p3_3dnrm_skip ): + + INC_L( EBP ) + ADD_L( CONST(16), EDI ) + ADD_L( EAX, ESI ) + CMP_L( ECX, EDI ) + JNE( LLBL( x86_p3_3dnrm_loop ) ) + +LLBL( x86_p3_3dnrm_done ): + + POP_L( EBP ) + POP_L( EBX ) + POP_L( EDI ) + POP_L( ESI ) + RET + + + + +ALIGNTEXT16 +GLOBL GLNAME( gl_x86_transform_points3_2d_masked ) +GLNAME( gl_x86_transform_points3_2d_masked ): + + PUSH_L( ESI ) + PUSH_L( EDI ) + + PUSH_L( EBX ) + PUSH_L( EBP ) + + MOV_L( ARG_SOURCE, ESI ) + MOV_L( ARG_DEST, EDI ) + + MOV_L( ARG_MATRIX, EDX ) + MOV_L( ARG_CLIP, EBP ) + + MOV_L( REGOFF(V4F_COUNT, ESI), ECX ) + MOV_B( ARG_FLAG, BL ) + + TEST_L( ECX, ECX ) + JZ( LLBL( x86_p3_2dm_done ) ) + + MOV_L( REGOFF(V4F_STRIDE, ESI), EAX ) + OR_L( CONST(VEC_SIZE_3), REGOFF(V4F_FLAGS, EDI) ) + + MOV_L( ECX, REGOFF(V4F_COUNT, EDI) ) + MOV_L( CONST(3), REGOFF(V4F_SIZE, EDI) ) + + SHL_L( CONST(4), ECX ) + MOV_L( REGOFF(V4F_START, ESI), ESI ) + + MOV_L( REGOFF(V4F_START, EDI), EDI ) + ADD_L( EDI, ECX ) + + /* need eax; put stride in ARG_SOURCE */ + MOV_L( EAX, ARG_SOURCE ) + +ALIGNTEXT16 +LLBL( x86_p3_2dm_loop ): + + TEST_B( BL, REGIND(EBP) ) + JNZ( LLBL( x86_p3_2dm_skip ) ) + + FLD_S( SRC(0) ) /* F4 */ + FMUL_S( MAT(0) ) + FLD_S( SRC(0) ) /* F5 F4 */ + FMUL_S( MAT(1) ) + + FLD_S( SRC(1) ) /* F0 F5 F4 */ + FMUL_S( MAT(4) ) + FLD_S( SRC(1) ) /* F1 F0 F5 F4 */ + FMUL_S( MAT(5) ) + + FXCH( ST(1) ) /* F0 F1 F5 F4 */ + FADDP( ST(0), ST(3) ) /* F1 F5 F4 */ + FADDP( ST(0), ST(1) ) /* F5 F4 */ + + FXCH( ST(1) ) /* F4 F5 */ + FADD_S( MAT(12) ) + FXCH( ST(1) ) /* F5 F4 */ + FADD_S( MAT(13) ) + + MOV_L( SRC(2), EAX ) + + FXCH( ST(1) ) /* F4 F5 */ + FSTP_S( DST(0) ) /* F5 */ + FSTP_S( DST(1) ) /* */ + MOV_L( EAX, DST(2) ) + +LLBL( x86_p3_2dm_skip ): + + INC_L( EBP ) + ADD_L( CONST(16), EDI ) + ADD_L( ARG_SOURCE, ESI ) + CMP_L( ECX, EDI ) + JNE( LLBL( x86_p3_2dm_loop ) ) + +LLBL( x86_p3_2dm_done ): + + POP_L( EBP ) + POP_L( EBX ) + POP_L( EDI ) + POP_L( ESI ) + RET + + + + +ALIGNTEXT4 +GLOBL GLNAME( gl_x86_transform_points3_2d_no_rot_masked ) +GLNAME( gl_x86_transform_points3_2d_no_rot_masked ): + + PUSH_L( ESI ) + PUSH_L( EDI ) + + PUSH_L( EBX ) + PUSH_L( EBP ) + + MOV_L( ARG_SOURCE, ESI ) + MOV_L( ARG_DEST, EDI ) + + MOV_L( ARG_MATRIX, EDX ) + MOV_L( ARG_CLIP, EBP ) + + MOV_L( REGOFF(V4F_COUNT, ESI), ECX ) + MOV_B( ARG_FLAG, BL ) + + TEST_L( ECX, ECX ) + JZ( LLBL( x86_p3_2dnrm_done ) ) + + MOV_L( REGOFF(V4F_STRIDE, ESI), EAX ) + OR_L( CONST(VEC_SIZE_3), REGOFF(V4F_FLAGS, EDI) ) + + MOV_L( ECX, REGOFF(V4F_COUNT, EDI) ) + MOV_L( CONST(3), REGOFF(V4F_SIZE, EDI) ) + + SHL_L( CONST(4), ECX ) + MOV_L( REGOFF(V4F_START, ESI), ESI ) + + MOV_L( REGOFF(V4F_START, EDI), EDI ) + ADD_L( EDI, ECX ) + + /* need eax; put stride in ARG_SOURCE */ + MOV_L( EAX, ARG_SOURCE ) + +ALIGNTEXT16 +LLBL( x86_p3_2dnrm_loop ): + + TEST_B( BL, REGIND(EBP) ) + JNZ( LLBL( x86_p3_2dnrm_skip ) ) + + FLD_S( SRC(0) ) /* F4 */ + FMUL_S( MAT(0) ) + + FLD_S( SRC(1) ) /* F1 F4 */ + FMUL_S( MAT(5) ) + + FXCH( ST(1) ) /* F4 F1 */ + FADD_S( MAT(12) ) + FLD_S( MAT(13) ) /* F5 F4 F1 */ + + FXCH( ST(2) ) /* F1 F4 F5 */ + FADDP( ST(0), ST(2) ) /* F4 F5 */ + + MOV_L( SRC(2), EAX ) + + FSTP_S( DST(0) ) /* F5 */ + FSTP_S( DST(1) ) /* */ + MOV_L( EAX, DST(2) ) + +LLBL( x86_p3_2dnrm_skip ): + + INC_L( EBP ) + ADD_L( CONST(16), EDI ) + ADD_L( ARG_SOURCE, ESI ) + CMP_L( ECX, EDI ) + JNE( LLBL( x86_p3_2dnrm_loop ) ) + +LLBL( x86_p3_2dnrm_done ): + + POP_L( EBP ) + POP_L( EBX ) + POP_L( EDI ) + POP_L( ESI ) + RET + + + + +ALIGNTEXT16 +GLOBL GLNAME( gl_x86_transform_points3_identity_masked ) +GLNAME( gl_x86_transform_points3_identity_masked ): + + PUSH_L( ESI ) + PUSH_L( EDI ) + + PUSH_L( EBX ) + PUSH_L( EBP ) + + MOV_L( ARG_SOURCE, ESI ) + MOV_L( ARG_DEST, EDI ) + + MOV_L( ARG_MATRIX, EDX ) + MOV_L( ARG_CLIP, EBP ) + + MOV_L( REGOFF(V4F_COUNT, ESI), ECX ) + MOV_B( ARG_FLAG, BL ) + + TEST_L( ECX, ECX ) + JZ( LLBL( x86_p3_im_done ) ) + + MOV_L( REGOFF(V4F_STRIDE, ESI), EAX ) + OR_L( CONST(VEC_SIZE_3), REGOFF(V4F_FLAGS, EDI) ) + + MOV_L( ECX, REGOFF(V4F_COUNT, EDI) ) + MOV_L( CONST(3), REGOFF(V4F_SIZE, EDI) ) + + SHL_L( CONST(4), ECX ) + MOV_L( REGOFF(V4F_START, ESI), ESI ) + + MOV_L( REGOFF(V4F_START, EDI), EDI ) + ADD_L( EDI, ECX ) + + /* need ecx; put dest+count in ARG_DEST */ + MOV_L( EAX, ARG_SOURCE ) + MOV_L( ECX, ARG_DEST ) + + CMP_L( ESI, EDI ) + JE( LLBL( x86_p3_im_done ) ) + +ALIGNTEXT16 +LLBL( x86_p3_im_loop ): + + TEST_B( BL, REGIND(EBP) ) + JNZ( LLBL( x86_p3_im_skip ) ) + + MOV_L( SRC(0), EAX ) + MOV_L( SRC(1), ECX ) + MOV_L( SRC(2), EDX ) + + MOV_L( EAX, DST(0) ) + MOV_L( ECX, DST(1) ) + MOV_L( EDX, DST(2) ) + +LLBL( x86_p3_im_skip ): + + INC_L( EBP ) + ADD_L( CONST(16), EDI ) + ADD_L( ARG_SOURCE, ESI ) + CMP_L( ARG_DEST, EDI ) + JNE( LLBL( x86_p3_im_loop ) ) + +LLBL( x86_p3_im_done ): + + POP_L( EBP ) + POP_L( EBX ) + POP_L( EDI ) + POP_L( ESI ) + RET Index: xc/extras/Mesa/src/X86/x86_xform_masked4.S diff -u /dev/null xc/extras/Mesa/src/X86/x86_xform_masked4.S:1.2 --- /dev/null Mon Dec 18 14:21:59 2000 +++ xc/extras/Mesa/src/X86/x86_xform_masked4.S Mon Nov 13 18:31:19 2000 @@ -0,0 +1,710 @@ + +/* + * Mesa 3-D graphics library + * Version: 3.4 + * + * Copyright (C) 1999-2000 Brian Paul All Rights Reserved. + * + * 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 + * BRIAN PAUL 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 "assyntax.h" +#include "xform_args.h" + + SEG_TEXT + +#define FRAME_OFFSET 16 + +#define FP_ONE 1065353216 +#define FP_ZERO 0 + +#define SRC(i) REGOFF(i * 4, ESI) +#define DST(i) REGOFF(i * 4, EDI) +#define MAT(i) REGOFF(i * 4, EDX) + + +ALIGNTEXT16 +GLOBL GLNAME( gl_x86_transform_points4_general_masked ) +GLNAME( gl_x86_transform_points4_general_masked ): + + PUSH_L( ESI ) + PUSH_L( EDI ) + + PUSH_L( EBX ) + PUSH_L( EBP ) + + MOV_L( ARG_SOURCE, ESI ) + MOV_L( ARG_DEST, EDI ) + + MOV_L( ARG_MATRIX, EDX ) + MOV_L( ARG_CLIP, EBP ) + + MOV_L( REGOFF(V4F_COUNT, ESI), ECX ) + MOV_B( ARG_FLAG, BL ) + + TEST_L( ECX, ECX ) + JZ( LLBL( x86_p4_gm_done ) ) + + MOV_L( REGOFF(V4F_STRIDE, ESI), EAX ) + OR_L( CONST(VEC_SIZE_4), REGOFF(V4F_FLAGS, EDI) ) + + MOV_L( ECX, REGOFF(V4F_COUNT, EDI) ) + MOV_L( CONST(4), REGOFF(V4F_SIZE, EDI) ) + + SHL_L( CONST(4), ECX ) + MOV_L( REGOFF(V4F_START, ESI), ESI ) + + MOV_L( REGOFF(V4F_START, EDI), EDI ) + ADD_L( EDI, ECX ) + +ALIGNTEXT16 +LLBL( x86_p4_gm_loop ): + + TEST_B( BL, REGIND(EBP) ) + JNZ( LLBL( x86_p4_gm_skip ) ) + + FLD_S( SRC(0) ) /* F4 */ + FMUL_S( MAT(0) ) + FLD_S( SRC(0) ) /* F5 F4 */ + FMUL_S( MAT(1) ) + FLD_S( SRC(0) ) /* F6 F5 F4 */ + FMUL_S( MAT(2) ) + FLD_S( SRC(0) ) /* F7 F6 F5 F4 */ + FMUL_S( MAT(3) ) + + FLD_S( SRC(1) ) /* F0 F7 F6 F5 F4 */ + FMUL_S( MAT(4) ) + FLD_S( SRC(1) ) /* F1 F0 F7 F6 F5 F4 */ + FMUL_S( MAT(5) ) + FLD_S( SRC(1) ) /* F2 F1 F0 F7 F6 F5 F4 */ + FMUL_S( MAT(6) ) + FLD_S( SRC(1) ) /* F3 F2 F1 F0 F7 F6 F5 F4 */ + FMUL_S( MAT(7) ) + + FXCH( ST(3) ) /* F0 F2 F1 F3 F7 F6 F5 F4 */ + FADDP( ST(0), ST(7) ) /* F2 F1 F3 F7 F6 F5 F4 */ + FXCH( ST(1) ) /* F1 F2 F3 F7 F6 F5 F4 */ + FADDP( ST(0), ST(5) ) /* F2 F3 F7 F6 F5 F4 */ + FADDP( ST(0), ST(3) ) /* F3 F7 F6 F5 F4 */ + FADDP( ST(0), ST(1) ) /* F7 F6 F5 F4 */ + + FLD_S( SRC(2) ) /* F0 F7 F6 F5 F4 */ + FMUL_S( MAT(8) ) + FLD_S( SRC(2) ) /* F1 F0 F7 F6 F5 F4 */ + FMUL_S( MAT(9) ) + FLD_S( SRC(2) ) /* F2 F1 F0 F7 F6 F5 F4 */ + FMUL_S( MAT(10) ) + FLD_S( SRC(2) ) /* F3 F2 F1 F0 F7 F6 F5 F4 */ + FMUL_S( MAT(11) ) + + FXCH( ST(3) ) /* F0 F2 F1 F3 F7 F6 F5 F4 */ + FADDP( ST(0), ST(7) ) /* F2 F1 F3 F7 F6 F5 F4 */ + FXCH( ST(1) ) /* F1 F2 F3 F7 F6 F5 F4 */ + FADDP( ST(0), ST(5) ) /* F2 F3 F7 F6 F5 F4 */ + FADDP( ST(0), ST(3) ) /* F3 F7 F6 F5 F4 */ + FADDP( ST(0), ST(1) ) /* F7 F6 F5 F4 */ + + FLD_S( SRC(3) ) /* F0 F7 F6 F5 F4 */ + FMUL_S( MAT(12) ) + FLD_S( SRC(3) ) /* F1 F0 F7 F6 F5 F4 */ + FMUL_S( MAT(13) ) + FLD_S( SRC(3) ) /* F2 F1 F0 F7 F6 F5 F4 */ + FMUL_S( MAT(14) ) + FLD_S( SRC(3) ) /* F3 F2 F1 F0 F7 F6 F5 F4 */ + FMUL_S( MAT(15) ) + + FXCH( ST(3) ) /* F0 F2 F1 F3 F7 F6 F5 F4 */ + FADDP( ST(0), ST(7) ) /* F2 F1 F3 F7 F6 F5 F4 */ + FXCH( ST(1) ) /* F1 F2 F3 F7 F6 F5 F4 */ + FADDP( ST(0), ST(5) ) /* F2 F3 F7 F6 F5 F4 */ + FADDP( ST(0), ST(3) ) /* F3 F7 F6 F5 F4 */ + FADDP( ST(0), ST(1) ) /* F7 F6 F5 F4 */ + + FXCH( ST(3) ) /* F4 F6 F5 F7 */ + FSTP_S( DST(0) ) /* F6 F5 F7 */ + FXCH( ST(1) ) /* F5 F6 F7 */ + FSTP_S( DST(1) ) /* F6 F7 */ + FSTP_S( DST(2) ) /* F7 */ + FSTP_S( DST(3) ) /* */ + +LLBL( x86_p4_gm_skip ): + + INC_L( EBP ) + ADD_L( CONST(16), EDI ) + ADD_L( EAX, ESI ) + CMP_L( ECX, EDI ) + JNE( LLBL( x86_p4_gm_loop ) ) + +LLBL( x86_p4_gm_done ): + + POP_L( EBP ) + POP_L( EBX ) + POP_L( EDI ) + POP_L( ESI ) + RET + + + + +ALIGNTEXT16 +GLOBL GLNAME( gl_x86_transform_points4_perspective_masked ) +GLNAME( gl_x86_transform_points4_perspective_masked ): + + PUSH_L( ESI ) + PUSH_L( EDI ) + + PUSH_L( EBX ) + PUSH_L( EBP ) + + MOV_L( ARG_SOURCE, ESI ) + MOV_L( ARG_DEST, EDI ) + + MOV_L( ARG_MATRIX, EDX ) + MOV_L( ARG_CLIP, EBP ) + + MOV_L( REGOFF(V4F_COUNT, ESI), ECX ) + MOV_B( ARG_FLAG, BL ) + + TEST_L( ECX, ECX ) + JZ( LLBL( x86_p4_pm_done ) ) + + MOV_L( REGOFF(V4F_STRIDE, ESI), EAX ) + OR_L( CONST(VEC_SIZE_4), REGOFF(V4F_FLAGS, EDI) ) + + MOV_L( ECX, REGOFF(V4F_COUNT, EDI) ) + MOV_L( CONST(4), REGOFF(V4F_SIZE, EDI) ) + + SHL_L( CONST(4), ECX ) + MOV_L( REGOFF(V4F_START, ESI), ESI ) + + MOV_L( REGOFF(V4F_START, EDI), EDI ) + ADD_L( EDI, ECX ) + + MOV_L( EAX, ARG_SOURCE ) /* need eax; put stride in ARG_SOURCE */ + +ALIGNTEXT16 +LLBL( x86_p4_pm_loop ): + + TEST_B( BL, REGIND(EBP) ) + JNZ( LLBL( x86_p4_pm_skip ) ) + + FLD_S( SRC(0) ) /* F4 */ + FMUL_S( MAT(0) ) + + FLD_S( SRC(1) ) /* F5 F4 */ + FMUL_S( MAT(5) ) + + FLD_S( SRC(2) ) /* F0 F5 F4 */ + FMUL_S( MAT(8) ) + FLD_S( SRC(2) ) /* F1 F0 F5 F4 */ + FMUL_S( MAT(9) ) + FLD_S( SRC(2) ) /* F6 F1 F0 F5 F4 */ + FMUL_S( MAT(10) ) + + FXCH( ST(2) ) /* F0 F1 F6 F5 F4 */ + FADDP( ST(0), ST(4) ) /* F1 F6 F5 F4 */ + FADDP( ST(0), ST(2) ) /* F6 F5 F4 */ + + FLD_S( SRC(3) ) /* F2 F6 F5 F4 */ + FMUL_S( MAT(14) ) + + FADDP( ST(0), ST(1) ) /* F6 F5 F4 */ + + MOV_L( SRC(2), EAX ) + XOR_L( CONST(-2147483648), EAX )/* change sign */ + + FXCH( ST(2) ) /* F4 F5 F6 */ + FSTP_S( DST(0) ) /* F5 F6 */ + FSTP_S( DST(1) ) /* F6 */ + FSTP_S( DST(2) ) /* */ + MOV_L( EAX, DST(3) ) + +LLBL( x86_p4_pm_skip ): + + INC_L( EBP ) + ADD_L( CONST(16), EDI ) + ADD_L( ARG_SOURCE, ESI ) + CMP_L( ECX, EDI ) + JNE( LLBL( x86_p4_pm_loop ) ) + +LLBL( x86_p4_pm_done ): + + POP_L( EBP ) + POP_L( EBX ) + POP_L( EDI ) + POP_L( ESI ) + RET + + + + +ALIGNTEXT16 +GLOBL GLNAME( gl_x86_transform_points4_3d_masked ) +GLNAME( gl_x86_transform_points4_3d_masked ): + + PUSH_L( ESI ) + PUSH_L( EDI ) + + PUSH_L( EBX ) + PUSH_L( EBP ) + + MOV_L( ARG_SOURCE, ESI ) + MOV_L( ARG_DEST, EDI ) + + MOV_L( ARG_MATRIX, EDX ) + MOV_L( ARG_CLIP, EBP ) + + MOV_L( REGOFF(V4F_COUNT, ESI), ECX ) + MOV_B( ARG_FLAG, BL ) + + TEST_L( ECX, ECX ) + JZ( LLBL( x86_p4_3dm_done ) ) + + MOV_L( REGOFF(V4F_STRIDE, ESI), EAX ) + OR_L( CONST(VEC_SIZE_4), REGOFF(V4F_FLAGS, EDI) ) + + MOV_L( ECX, REGOFF(V4F_COUNT, EDI) ) + MOV_L( CONST(4), REGOFF(V4F_SIZE, EDI) ) + + SHL_L( CONST(4), ECX ) + MOV_L( REGOFF(V4F_START, ESI), ESI ) + + MOV_L( REGOFF(V4F_START, EDI), EDI ) + ADD_L( EDI, ECX ) + + MOV_L( EAX, ARG_SOURCE ) /* need eax; put stride in ARG_SOURCE */ + +ALIGNTEXT16 +LLBL( x86_p4_3dm_loop ): + + TEST_B( BL, REGIND(EBP) ) + JNZ( LLBL( x86_p4_3dm_skip ) ) + + FLD_S( SRC(0) ) /* F4 */ + FMUL_S( MAT(0) ) + FLD_S( SRC(0) ) /* F5 F4 */ + FMUL_S( MAT(1) ) + FLD_S( SRC(0) ) /* F6 F5 F4 */ + FMUL_S( MAT(2) ) + + FLD_S( SRC(1) ) /* F0 F6 F5 F4 */ + FMUL_S( MAT(4) ) + FLD_S( SRC(1) ) /* F1 F0 F6 F5 F4 */ + FMUL_S( MAT(5) ) + FLD_S( SRC(1) ) /* F2 F1 F0 F6 F5 F4 */ + FMUL_S( MAT(6) ) + + FXCH( ST(2) ) /* F0 F1 F2 F6 F5 F4 */ + FADDP( ST(0), ST(5) ) /* F1 F2 F6 F5 F4 */ + FADDP( ST(0), ST(3) ) /* F2 F6 F5 F4 */ + FADDP( ST(0), ST(1) ) /* F6 F5 F4 */ + + FLD_S( SRC(2) ) /* F0 F6 F5 F4 */ + FMUL_S( MAT(8) ) + FLD_S( SRC(2) ) /* F1 F0 F6 F5 F4 */ + FMUL_S( MAT(9) ) + FLD_S( SRC(2) ) /* F2 F1 F0 F6 F5 F4 */ + FMUL_S( MAT(10) ) + + FXCH( ST(2) ) /* F0 F1 F2 F6 F5 F4 */ + FADDP( ST(0), ST(5) ) /* F1 F2 F6 F5 F4 */ + FADDP( ST(0), ST(3) ) /* F2 F6 F5 F4 */ + FADDP( ST(0), ST(1) ) /* F6 F5 F4 */ + + FLD_S( SRC(3) ) /* F0 F6 F5 F4 */ + FMUL_S( MAT(12) ) + FLD_S( SRC(3) ) /* F1 F0 F6 F5 F4 */ + FMUL_S( MAT(13) ) + FLD_S( SRC(3) ) /* F2 F1 F0 F6 F5 F4 */ + FMUL_S( MAT(14) ) + + FXCH( ST(2) ) /* F0 F1 F2 F6 F5 F4 */ + FADDP( ST(0), ST(5) ) /* F1 F2 F6 F5 F4 */ + FADDP( ST(0), ST(3) ) /* F2 F6 F5 F4 */ + FADDP( ST(0), ST(1) ) /* F6 F5 F4 */ + + MOV_L( SRC(3), EAX ) + + FXCH( ST(2) ) /* F4 F5 F6 */ + FSTP_S( DST(0) ) /* F5 F6 */ + FSTP_S( DST(1) ) /* F6 */ + FSTP_S( DST(2) ) /* */ + MOV_L( EAX, DST(3) ) + +LLBL( x86_p4_3dm_skip ): + + INC_L( EBP ) + ADD_L( CONST(16), EDI ) + ADD_L( ARG_SOURCE, ESI ) + CMP_L( ECX, EDI ) + JNE( LLBL( x86_p4_3dm_loop ) ) + +LLBL( x86_p4_3dm_done ): + + POP_L( EBP ) + POP_L( EBX ) + POP_L( EDI ) + POP_L( ESI ) + RET + + + + +ALIGNTEXT16 +GLOBL GLNAME( gl_x86_transform_points4_3d_no_rot_masked ) +GLNAME( gl_x86_transform_points4_3d_no_rot_masked ): + + PUSH_L( ESI ) + PUSH_L( EDI ) + + PUSH_L( EBX ) + PUSH_L( EBP ) + + MOV_L( ARG_SOURCE, ESI ) + MOV_L( ARG_DEST, EDI ) + + MOV_L( ARG_MATRIX, EDX ) + MOV_L( ARG_CLIP, EBP ) + + MOV_L( REGOFF(V4F_COUNT, ESI), ECX ) + MOV_B( ARG_FLAG, BL ) + + TEST_L( ECX, ECX ) + JZ( LLBL( x86_p4_3dnrm_done ) ) + + MOV_L( REGOFF(V4F_STRIDE, ESI), EAX ) + OR_L( CONST(VEC_SIZE_4), REGOFF(V4F_FLAGS, EDI) ) + + MOV_L( ECX, REGOFF(V4F_COUNT, EDI) ) + MOV_L( CONST(4), REGOFF(V4F_SIZE, EDI) ) + + SHL_L( CONST(4), ECX ) + MOV_L( REGOFF(V4F_START, ESI), ESI ) + + MOV_L( REGOFF(V4F_START, EDI), EDI ) + ADD_L( EDI, ECX ) + + MOV_L( EAX, ARG_SOURCE ) /* need eax; put stride in ARG_SOURCE */ + +ALIGNTEXT16 +LLBL( x86_p4_3dnrm_loop ): + + TEST_B( BL, REGIND(EBP) ) + JNZ( LLBL( x86_p4_3dnrm_skip ) ) + + FLD_S( SRC(0) ) /* F4 */ + FMUL_S( MAT(0) ) + + FLD_S( SRC(1) ) /* F5 F4 */ + FMUL_S( MAT(5) ) + + FLD_S( SRC(2) ) /* F6 F5 F4 */ + FMUL_S( MAT(10) ) + + FLD_S( SRC(3) ) /* F0 F6 F5 F4 */ + FMUL_S( MAT(12) ) + FLD_S( SRC(3) ) /* F1 F0 F6 F5 F4 */ + FMUL_S( MAT(13) ) + FLD_S( SRC(3) ) /* F2 F1 F0 F6 F5 F4 */ + FMUL_S( MAT(14) ) + + FXCH( ST(2) ) /* F0 F1 F2 F6 F5 F4 */ + FADDP( ST(0), ST(5) ) /* F1 F2 F6 F5 F4 */ + FADDP( ST(0), ST(3) ) /* F2 F6 F5 F4 */ + FADDP( ST(0), ST(1) ) /* F6 F5 F4 */ + + MOV_L( SRC(3), EAX ) + + FXCH( ST(2) ) /* F4 F5 F6 */ + FSTP_S( DST(0) ) /* F5 F6 */ + FSTP_S( DST(1) ) /* F6 */ + FSTP_S( DST(2) ) /* */ + MOV_L( EAX, DST(3) ) + +LLBL( x86_p4_3dnrm_skip ): + + INC_L( EBP ) + ADD_L( CONST(16), EDI ) + ADD_L( ARG_SOURCE, ESI ) + CMP_L( ECX, EDI ) + JNE( LLBL( x86_p4_3dnrm_loop ) ) + +LLBL( x86_p4_3dnrm_done ): + + POP_L( EBP ) + POP_L( EBX ) + POP_L( EDI ) + POP_L( ESI ) + RET + + + + +ALIGNTEXT16 +GLOBL GLNAME( gl_x86_transform_points4_2d_masked ) +GLNAME( gl_x86_transform_points4_2d_masked ): + + PUSH_L( ESI ) + PUSH_L( EDI ) + + PUSH_L( EBX ) + PUSH_L( EBP ) + + MOV_L( ARG_SOURCE, ESI ) + MOV_L( ARG_DEST, EDI ) + + MOV_L( ARG_MATRIX, EDX ) + MOV_L( ARG_CLIP, EBP ) + + MOV_L( REGOFF(V4F_COUNT, ESI), ECX ) + MOV_B( ARG_FLAG, BL ) + + TEST_L( ECX, ECX ) + JZ( LLBL( x86_p4_2dm_done ) ) + + MOV_L( REGOFF(V4F_STRIDE, ESI), EAX ) + OR_L( CONST(VEC_SIZE_4), REGOFF(V4F_FLAGS, EDI) ) + + MOV_L( ECX, REGOFF(V4F_COUNT, EDI) ) + MOV_L( CONST(4), REGOFF(V4F_SIZE, EDI) ) + + SHL_L( CONST(4), ECX ) + MOV_L( REGOFF(V4F_START, ESI), ESI ) + + MOV_L( REGOFF(V4F_START, EDI), EDI ) + ADD_L( EDI, ECX ) + + MOV_L( EAX, ARG_SOURCE ) /* need eax; put stride in ARG_SOURCE */ + MOV_L( ECX, ARG_DEST ) /* need ecx; put dest+count in ARG_DEST */ + +ALIGNTEXT16 +LLBL( x86_p4_2dm_loop ): + + TEST_B( BL, REGIND(EBP) ) + JNZ( LLBL( x86_p4_2dm_skip ) ) + + FLD_S( SRC(0) ) /* F4 */ + FMUL_S( MAT(0) ) + FLD_S( SRC(0) ) /* F5 F4 */ + FMUL_S( MAT(1) ) + + FLD_S( SRC(1) ) /* F0 F5 F4 */ + FMUL_S( MAT(4) ) + FLD_S( SRC(1) ) /* F1 F0 F5 F4 */ + FMUL_S( MAT(5) ) + + FXCH( ST(1) ) /* F0 F1 F5 F4 */ + FADDP( ST(0), ST(3) ) /* F1 F5 F4 */ + FADDP( ST(0), ST(1) ) /* F5 F4 */ + + FLD_S( SRC(3) ) /* F0 F5 F4 */ + FMUL_S( MAT(12) ) + FLD_S( SRC(3) ) /* F1 F0 F5 F4 */ + FMUL_S( MAT(13) ) + + FXCH( ST(1) ) /* F0 F1 F5 F4 */ + FADDP( ST(0), ST(3) ) /* F1 F5 F4 */ + FADDP( ST(0), ST(1) ) /* F5 F4 */ + + MOV_L( SRC(2), EAX ) + MOV_L( SRC(3), ECX ) + + FXCH( ST(1) ) /* F4 F5 */ + FSTP_S( DST(0) ) /* F5 */ + FSTP_S( DST(1) ) /* */ + MOV_L( EAX, DST(2) ) + MOV_L( ECX, DST(3) ) + +LLBL( x86_p4_2dm_skip ): + + INC_L( EBP ) + ADD_L( CONST(16), EDI ) + ADD_L( ARG_SOURCE, ESI ) + CMP_L( ARG_DEST, EDI ) + JNE( LLBL( x86_p4_2dm_loop ) ) + +LLBL( x86_p4_2dm_done ): + + POP_L( EBP ) + POP_L( EBX ) + POP_L( EDI ) + POP_L( ESI ) + RET + + + + +ALIGNTEXT16 +GLOBL GLNAME( gl_x86_transform_points4_2d_no_rot_masked ) +GLNAME( gl_x86_transform_points4_2d_no_rot_masked ): + + PUSH_L( ESI ) + PUSH_L( EDI ) + + PUSH_L( EBX ) + PUSH_L( EBP ) + + MOV_L( ARG_SOURCE, ESI ) + MOV_L( ARG_DEST, EDI ) + + MOV_L( ARG_MATRIX, EDX ) + MOV_L( ARG_CLIP, EBP ) + + MOV_L( REGOFF(V4F_COUNT, ESI), ECX ) + MOV_B( ARG_FLAG, BL ) + + TEST_L( ECX, ECX ) + JZ( LLBL( x86_p4_2dnrm_done ) ) + + MOV_L( REGOFF(V4F_STRIDE, ESI), EAX ) + OR_L( CONST(VEC_SIZE_4), REGOFF(V4F_FLAGS, EDI) ) + + MOV_L( ECX, REGOFF(V4F_COUNT, EDI) ) + MOV_L( CONST(4), REGOFF(V4F_SIZE, EDI) ) + + SHL_L( CONST(4), ECX ) + MOV_L( REGOFF(V4F_START, ESI), ESI ) + + MOV_L( REGOFF(V4F_START, EDI), EDI ) + ADD_L( EDI, ECX ) + + MOV_L( EAX, ARG_SOURCE ) /* need eax; put stride in ARG_SOURCE */ + MOV_L( ECX, ARG_DEST ) /* need ecx; put dest+count in ARG_DEST */ + +ALIGNTEXT16 +LLBL( x86_p4_2dnrm_loop ): + + TEST_B( BL, REGIND(EBP) ) + JNZ( LLBL( x86_p4_2dnrm_skip ) ) + + FLD_S( SRC(0) ) /* F4 */ + FMUL_S( MAT(0) ) + + FLD_S( SRC(1) ) /* F5 F4 */ + FMUL_S( MAT(5) ) + + FLD_S( SRC(3) ) /* F0 F5 F4 */ + FMUL_S( MAT(12) ) + FLD_S( SRC(3) ) /* F1 F0 F5 F4 */ + FMUL_S( MAT(13) ) + + FXCH( ST(1) ) /* F0 F1 F5 F4 */ + FADDP( ST(0), ST(3) ) /* F1 F5 F4 */ + FADDP( ST(0), ST(1) ) /* F5 F4 */ + + MOV_L( SRC(2), EAX ) + MOV_L( SRC(3), ECX ) + + FXCH( ST(1) ) /* F4 F5 */ + FSTP_S( DST(0) ) /* F5 */ + FSTP_S( DST(1) ) /* */ + MOV_L( EAX, DST(2) ) + MOV_L( ECX, DST(3) ) + +LLBL( x86_p4_2dnrm_skip ): + + INC_L( EBP ) + ADD_L( CONST(16), EDI ) + ADD_L( ARG_SOURCE, ESI ) + CMP_L( ARG_DEST, EDI ) + JNE( LLBL( x86_p4_2dnrm_loop ) ) + +LLBL( x86_p4_2dnrm_done ): + + POP_L( EBP ) + POP_L( EBX ) + POP_L( EDI ) + POP_L( ESI ) + RET + + + + +ALIGNTEXT16 +GLOBL GLNAME( gl_x86_transform_points4_identity_masked ) +GLNAME( gl_x86_transform_points4_identity_masked ): + + PUSH_L( ESI ) + PUSH_L( EDI ) + + PUSH_L( EBX ) + PUSH_L( EBP ) + + MOV_L( ARG_SOURCE, ESI ) + MOV_L( ARG_DEST, EDI ) + + MOV_L( ARG_MATRIX, EDX ) + MOV_L( ARG_CLIP, EBP ) + + MOV_L( REGOFF(V4F_COUNT, ESI), ECX ) + MOV_B( ARG_FLAG, BL ) + + TEST_L( ECX, ECX ) + JZ( LLBL( x86_p4_im_done ) ) + + MOV_L( REGOFF(V4F_STRIDE, ESI), EAX ) + OR_L( CONST(VEC_SIZE_4), REGOFF(V4F_FLAGS, EDI) ) + + MOV_L( ECX, REGOFF(V4F_COUNT, EDI) ) + MOV_L( CONST(4), REGOFF(V4F_SIZE, EDI) ) + + SHL_L( CONST(4), ECX ) + MOV_L( REGOFF(V4F_START, ESI), ESI ) + + MOV_L( REGOFF(V4F_START, EDI), EDI ) + ADD_L( EDI, ECX ) + + /* need eax; put stride in ARG_SOURCE */ + MOV_L( EAX, ARG_SOURCE ) + + CMP_L( ESI, EDI ) + JE( LLBL( x86_p4_im_done ) ) + +ALIGNTEXT16 +LLBL( x86_p4_im_loop ): + + TEST_B( BL, REGIND(EBP) ) + JNZ( LLBL( x86_p4_im_skip ) ) + + MOV_L( SRC(0), EAX ) + MOV_L( SRC(1), EDX ) + + MOV_L( EAX, DST(0) ) + MOV_L( EDX, DST(1) ) + + MOV_L( SRC(2), EAX ) + MOV_L( SRC(3), EDX ) + + MOV_L( EAX, DST(2) ) + MOV_L( EDX, DST(3) ) + +LLBL( x86_p4_im_skip ): + + INC_L( EBP ) + ADD_L( CONST(16), EDI ) + ADD_L( ARG_SOURCE, ESI ) + CMP_L( ECX, EDI ) + JNE( LLBL( x86_p4_im_loop ) ) + +LLBL( x86_p4_im_done ): + + POP_L( EBP ) + POP_L( EBX ) + POP_L( EDI ) + POP_L( ESI ) + RET Index: xc/extras/Mesa/src/X86/x86_xform_raw2.S diff -u /dev/null xc/extras/Mesa/src/X86/x86_xform_raw2.S:1.2 --- /dev/null Mon Dec 18 14:21:59 2000 +++ xc/extras/Mesa/src/X86/x86_xform_raw2.S Mon Nov 13 18:31:19 2000 @@ -0,0 +1,535 @@ + +/* + * Mesa 3-D graphics library + * Version: 3.4 + * + * Copyright (C) 1999-2000 Brian Paul All Rights Reserved. + * + * 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 + * BRIAN PAUL 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 "assyntax.h" +#include "xform_args.h" + + SEG_TEXT + +#define FP_ONE 1065353216 +#define FP_ZERO 0 + +#define SRC(i) REGOFF(i * 4, ESI) +#define DST(i) REGOFF(i * 4, EDI) +#define MAT(i) REGOFF(i * 4, EDX) + + +ALIGNTEXT16 +GLOBL GLNAME( gl_x86_transform_points2_general_raw ) +GLNAME( gl_x86_transform_points2_general_raw ): + +#define FRAME_OFFSET 8 + PUSH_L( ESI ) + PUSH_L( EDI ) + + MOV_L( ARG_SOURCE, ESI ) + MOV_L( ARG_DEST, EDI ) + + MOV_L( ARG_MATRIX, EDX ) + MOV_L( REGOFF(V4F_COUNT, ESI), ECX ) + + TEST_L( ECX, ECX ) + JZ( LLBL( x86_p2_gr_done ) ) + + MOV_L( REGOFF(V4F_STRIDE, ESI), EAX ) + OR_L( CONST(VEC_SIZE_4), REGOFF(V4F_FLAGS, EDI) ) + + MOV_L( ECX, REGOFF(V4F_COUNT, EDI) ) + MOV_L( CONST(4), REGOFF(V4F_SIZE, EDI) ) + + SHL_L( CONST(4), ECX ) + MOV_L( REGOFF(V4F_START, ESI), ESI ) + + MOV_L( REGOFF(V4F_START, EDI), EDI ) + ADD_L( EDI, ECX ) + +ALIGNTEXT16 +LLBL( x86_p2_gr_loop ): + + FLD_S( SRC(0) ) /* F4 */ + FMUL_S( MAT(0) ) + FLD_S( SRC(0) ) /* F5 F4 */ + FMUL_S( MAT(1) ) + FLD_S( SRC(0) ) /* F6 F5 F4 */ + FMUL_S( MAT(2) ) + FLD_S( SRC(0) ) /* F7 F6 F5 F4 */ + FMUL_S( MAT(3) ) + + FLD_S( SRC(1) ) /* F0 F7 F6 F5 F4 */ + FMUL_S( MAT(4) ) + FLD_S( SRC(1) ) /* F1 F0 F7 F6 F5 F4 */ + FMUL_S( MAT(5) ) + FLD_S( SRC(1) ) /* F2 F1 F0 F7 F6 F5 F4 */ + FMUL_S( MAT(6) ) + FLD_S( SRC(1) ) /* F3 F2 F1 F0 F7 F6 F5 F4 */ + FMUL_S( MAT(7) ) + + FXCH( ST(3) ) /* F0 F2 F1 F3 F7 F6 F5 F4 */ + FADDP( ST(0), ST(7) ) /* F2 F1 F3 F7 F6 F5 F4 */ + FXCH( ST(1) ) /* F1 F2 F3 F7 F6 F5 F4 */ + FADDP( ST(0), ST(5) ) /* F2 F3 F7 F6 F5 F4 */ + FADDP( ST(0), ST(3) ) /* F3 F7 F6 F5 F4 */ + FADDP( ST(0), ST(1) ) /* F7 F6 F5 F4 */ + + FXCH( ST(3) ) /* F4 F6 F5 F7 */ + FADD_S( MAT(12) ) + FXCH( ST(2) ) /* F5 F6 F4 F7 */ + FADD_S( MAT(13) ) + FXCH( ST(1) ) /* F6 F5 F4 F7 */ + FADD_S( MAT(14) ) + FXCH( ST(3) ) /* F7 F5 F4 F6 */ + FADD_S( MAT(15) ) + + FXCH( ST(2) ) /* F4 F5 F7 F6 */ + FSTP_S( DST(0) ) /* F5 F7 F6 */ + FSTP_S( DST(1) ) /* F7 F6 */ + FXCH( ST(1) ) /* F6 F7 */ + FSTP_S( DST(2) ) /* F7 */ + FSTP_S( DST(3) ) /* */ + +LLBL( x86_p2_gr_skip ): + + ADD_L( CONST(16), EDI ) + ADD_L( EAX, ESI ) + CMP_L( ECX, EDI ) + JNE( LLBL( x86_p2_gr_loop ) ) + +LLBL( x86_p2_gr_done ): + + POP_L( EDI ) + POP_L( ESI ) + RET +#undef FRAME_OFFSET + + + + +ALIGNTEXT16 +GLOBL GLNAME( gl_x86_transform_points2_perspective_raw ) +GLNAME( gl_x86_transform_points2_perspective_raw ): + +#define FRAME_OFFSET 12 + PUSH_L( ESI ) + PUSH_L( EDI ) + PUSH_L( EBX ) + + MOV_L( ARG_SOURCE, ESI ) + MOV_L( ARG_DEST, EDI ) + + MOV_L( ARG_MATRIX, EDX ) + MOV_L( REGOFF(V4F_COUNT, ESI), ECX ) + + TEST_L( ECX, ECX ) + JZ( LLBL( x86_p2_pr_done ) ) + + MOV_L( REGOFF(V4F_STRIDE, ESI), EAX ) + OR_L( CONST(VEC_SIZE_4), REGOFF(V4F_FLAGS, EDI) ) + + MOV_L( ECX, REGOFF(V4F_COUNT, EDI) ) + MOV_L( CONST(4), REGOFF(V4F_SIZE, EDI) ) + + SHL_L( CONST(4), ECX ) + MOV_L( REGOFF(V4F_START, ESI), ESI ) + + MOV_L( REGOFF(V4F_START, EDI), EDI ) + ADD_L( EDI, ECX ) + + MOV_L( MAT(14), EBX ) + +ALIGNTEXT16 +LLBL( x86_p2_pr_loop ): + + FLD_S( SRC(0) ) /* F4 */ + FMUL_S( MAT(0) ) + + FLD_S( SRC(1) ) /* F1 F4 */ + FMUL_S( MAT(5) ) + + FXCH( ST(1) ) /* F4 F1 */ + FSTP_S( DST(0) ) /* F1 */ + FSTP_S( DST(1) ) /* */ + MOV_L( EBX, DST(2) ) + MOV_L( CONST(FP_ZERO), DST(3) ) + +LLBL( x86_p2_pr_skip ): + + ADD_L( CONST(16), EDI ) + ADD_L( EAX, ESI ) + CMP_L( ECX, EDI ) + JNE( LLBL( x86_p2_pr_loop ) ) + +LLBL( x86_p2_pr_done ): + + POP_L( EBX ) + POP_L( EDI ) + POP_L( ESI ) + RET +#undef FRAME_OFFSET + + + + +ALIGNTEXT16 +GLOBL GLNAME( gl_x86_transform_points2_3d_raw ) +GLNAME( gl_x86_transform_points2_3d_raw ): + +#define FRAME_OFFSET 8 + PUSH_L( ESI ) + PUSH_L( EDI ) + + MOV_L( ARG_SOURCE, ESI ) + MOV_L( ARG_DEST, EDI ) + + MOV_L( ARG_MATRIX, EDX ) + MOV_L( REGOFF(V4F_COUNT, ESI), ECX ) + + TEST_L( ECX, ECX ) + JZ( LLBL( x86_p2_3dr_done ) ) + + MOV_L( REGOFF(V4F_STRIDE, ESI), EAX ) + OR_L( CONST(VEC_SIZE_3), REGOFF(V4F_FLAGS, EDI) ) + + MOV_L( ECX, REGOFF(V4F_COUNT, EDI) ) + MOV_L( CONST(3), REGOFF(V4F_SIZE, EDI) ) + + SHL_L( CONST(4), ECX ) + MOV_L( REGOFF(V4F_START, ESI), ESI ) + + MOV_L( REGOFF(V4F_START, EDI), EDI ) + ADD_L( EDI, ECX ) + +ALIGNTEXT16 +LLBL( x86_p2_3dr_loop ): + + FLD_S( SRC(0) ) /* F4 */ + FMUL_S( MAT(0) ) + FLD_S( SRC(0) ) /* F5 F4 */ + FMUL_S( MAT(1) ) + FLD_S( SRC(0) ) /* F6 F5 F4 */ + FMUL_S( MAT(2) ) + + FLD_S( SRC(1) ) /* F0 F6 F5 F4 */ + FMUL_S( MAT(4) ) + FLD_S( SRC(1) ) /* F1 F0 F6 F5 F4 */ + FMUL_S( MAT(5) ) + FLD_S( SRC(1) ) /* F2 F1 F0 F6 F5 F4 */ + FMUL_S( MAT(6) ) + + FXCH( ST(2) ) /* F0 F1 F2 F6 F5 F4 */ + FADDP( ST(0), ST(5) ) /* F1 F2 F6 F5 F4 */ + FADDP( ST(0), ST(3) ) /* F2 F6 F5 F4 */ + FADDP( ST(0), ST(1) ) /* F6 F5 F4 */ + + FXCH( ST(2) ) /* F4 F5 F6 */ + FADD_S( MAT(12) ) + FXCH( ST(1) ) /* F5 F4 F6 */ + FADD_S( MAT(13) ) + FXCH( ST(2) ) /* F6 F4 F5 */ + FADD_S( MAT(14) ) + + FXCH( ST(1) ) /* F4 F6 F5 */ + FSTP_S( DST(0) ) /* F6 F5 */ + FXCH( ST(1) ) /* F5 F6 */ + FSTP_S( DST(1) ) /* F6 */ + FSTP_S( DST(2) ) /* */ + +LLBL( x86_p2_3dr_skip ): + + ADD_L( CONST(16), EDI ) + ADD_L( EAX, ESI ) + CMP_L( ECX, EDI ) + JNE( LLBL( x86_p2_3dr_loop ) ) + +LLBL( x86_p2_3dr_done ): + + POP_L( EDI ) + POP_L( ESI ) + RET +#undef FRAME_OFFSET + + + + +ALIGNTEXT16 +GLOBL GLNAME( gl_x86_transform_points2_3d_no_rot_raw ) +GLNAME( gl_x86_transform_points2_3d_no_rot_raw ): + +#define FRAME_OFFSET 12 + PUSH_L( ESI ) + PUSH_L( EDI ) + PUSH_L( EBX ) + + MOV_L( ARG_SOURCE, ESI ) + MOV_L( ARG_DEST, EDI ) + + MOV_L( ARG_MATRIX, EDX ) + MOV_L( REGOFF(V4F_COUNT, ESI), ECX ) + + TEST_L( ECX, ECX ) + JZ( LLBL( x86_p2_3dnrr_done ) ) + + MOV_L( REGOFF(V4F_STRIDE, ESI), EAX ) + OR_L( CONST(VEC_SIZE_3), REGOFF(V4F_FLAGS, EDI) ) + + MOV_L( ECX, REGOFF(V4F_COUNT, EDI) ) + MOV_L( CONST(3), REGOFF(V4F_SIZE, EDI) ) + + SHL_L( CONST(4), ECX ) + MOV_L( REGOFF(V4F_START, ESI), ESI ) + + MOV_L( REGOFF(V4F_START, EDI), EDI ) + ADD_L( EDI, ECX ) + + MOV_L( MAT(14), EBX ) + +ALIGNTEXT16 +LLBL( x86_p2_3dnrr_loop ): + + FLD_S( SRC(0) ) /* F4 */ + FMUL_S( MAT(0) ) + + FLD_S( SRC(1) ) /* F1 F4 */ + FMUL_S( MAT(5) ) + + FXCH( ST(1) ) /* F4 F1 */ + FADD_S( MAT(12) ) + FLD_S( MAT(13) ) /* F5 F4 F1 */ + FXCH( ST(2) ) /* F1 F4 F5 */ + FADDP( ST(0), ST(2) ) /* F4 F5 */ + + FSTP_S( DST(0) ) /* F5 */ + FSTP_S( DST(1) ) /* */ + MOV_L( EBX, DST(2) ) + +LLBL( x86_p2_3dnrr_skip ): + + ADD_L( CONST(16), EDI ) + ADD_L( EAX, ESI ) + CMP_L( ECX, EDI ) + JNE( LLBL( x86_p2_3dnrr_loop ) ) + +LLBL( x86_p2_3dnrr_done ): + + POP_L( EBX ) + POP_L( EDI ) + POP_L( ESI ) + RET +#undef FRAME_OFFSET + + + + +ALIGNTEXT16 +GLOBL GLNAME( gl_x86_transform_points2_2d_raw ) +GLNAME( gl_x86_transform_points2_2d_raw ): + +#define FRAME_OFFSET 8 + PUSH_L( ESI ) + PUSH_L( EDI ) + + MOV_L( ARG_SOURCE, ESI ) + MOV_L( ARG_DEST, EDI ) + + MOV_L( ARG_MATRIX, EDX ) + MOV_L( REGOFF(V4F_COUNT, ESI), ECX ) + + TEST_L( ECX, ECX ) + JZ( LLBL( x86_p2_2dr_done ) ) + + MOV_L( REGOFF(V4F_STRIDE, ESI), EAX ) + OR_L( CONST(VEC_SIZE_2), REGOFF(V4F_FLAGS, EDI) ) + + MOV_L( ECX, REGOFF(V4F_COUNT, EDI) ) + MOV_L( CONST(2), REGOFF(V4F_SIZE, EDI) ) + + SHL_L( CONST(4), ECX ) + MOV_L( REGOFF(V4F_START, ESI), ESI ) + + MOV_L( REGOFF(V4F_START, EDI), EDI ) + ADD_L( EDI, ECX ) + +ALIGNTEXT16 +LLBL( x86_p2_2dr_loop ): + + FLD_S( SRC(0) ) /* F4 */ + FMUL_S( MAT(0) ) + FLD_S( SRC(0) ) /* F5 F4 */ + FMUL_S( MAT(1) ) + + FLD_S( SRC(1) ) /* F0 F5 F4 */ + FMUL_S( MAT(4) ) + FLD_S( SRC(1) ) /* F1 F0 F5 F4 */ + FMUL_S( MAT(5) ) + + FXCH( ST(1) ) /* F0 F1 F5 F4 */ + FADDP( ST(0), ST(3) ) /* F1 F5 F4 */ + FADDP( ST(0), ST(1) ) /* F5 F4 */ + + FXCH( ST(1) ) /* F4 F5 */ + FADD_S( MAT(12) ) + FXCH( ST(1) ) /* F5 F4 */ + FADD_S( MAT(13) ) + + FXCH( ST(1) ) /* F4 F5 */ + FSTP_S( DST(0) ) /* F5 */ + FSTP_S( DST(1) ) /* */ + +LLBL( x86_p2_2dr_skip ): + + ADD_L( CONST(16), EDI ) + ADD_L( EAX, ESI ) + CMP_L( ECX, EDI ) + JNE( LLBL( x86_p2_2dr_loop ) ) + +LLBL( x86_p2_2dr_done ): + + POP_L( EDI ) + POP_L( ESI ) + RET +#undef FRAME_OFFSET + + + + +ALIGNTEXT4 +GLOBL GLNAME( gl_x86_transform_points2_2d_no_rot_raw ) +GLNAME( gl_x86_transform_points2_2d_no_rot_raw ): + +#define FRAME_OFFSET 8 + PUSH_L( ESI ) + PUSH_L( EDI ) + + MOV_L( ARG_SOURCE, ESI ) + MOV_L( ARG_DEST, EDI ) + + MOV_L( ARG_MATRIX, EDX ) + MOV_L( REGOFF(V4F_COUNT, ESI), ECX ) + + TEST_L( ECX, ECX ) + JZ( LLBL( x86_p2_2dnrr_done ) ) + + MOV_L( REGOFF(V4F_STRIDE, ESI), EAX ) + OR_L( CONST(VEC_SIZE_2), REGOFF(V4F_FLAGS, EDI) ) + + MOV_L( ECX, REGOFF(V4F_COUNT, EDI) ) + MOV_L( CONST(2), REGOFF(V4F_SIZE, EDI) ) + + SHL_L( CONST(4), ECX ) + MOV_L( REGOFF(V4F_START, ESI), ESI ) + + MOV_L( REGOFF(V4F_START, EDI), EDI ) + ADD_L( EDI, ECX ) + +ALIGNTEXT16 +LLBL( x86_p2_2dnrr_loop ): + + FLD_S( SRC(0) ) /* F4 */ + FMUL_S( MAT(0) ) + + FLD_S( SRC(1) ) /* F1 F4 */ + FMUL_S( MAT(5) ) + + FXCH( ST(1) ) /* F4 F1 */ + FADD_S( MAT(12) ) + FLD_S( MAT(13) ) /* F5 F4 F1 */ + FXCH( ST(2) ) /* F1 F4 F5 */ + FADDP( ST(0), ST(2) ) /* F4 F5 */ + + FSTP_S( DST(0) ) /* F5 */ + FSTP_S( DST(1) ) /* */ + +LLBL( x86_p2_2dnrr_skip ): + + ADD_L( CONST(16), EDI ) + ADD_L( EAX, ESI ) + CMP_L( ECX, EDI ) + JNE( LLBL( x86_p2_2dnrr_loop ) ) + +LLBL( x86_p2_2dnrr_done ): + + POP_L( EDI ) + POP_L( ESI ) + RET +#undef FRAME_OFFSET + + + + +ALIGNTEXT16 +GLOBL GLNAME( gl_x86_transform_points2_identity_raw ) +GLNAME( gl_x86_transform_points2_identity_raw ): + +#define FRAME_OFFSET 12 + PUSH_L( ESI ) + PUSH_L( EDI ) + PUSH_L( EBX ) + + MOV_L( ARG_SOURCE, ESI ) + MOV_L( ARG_DEST, EDI ) + + MOV_L( ARG_MATRIX, EDX ) + MOV_L( REGOFF(V4F_COUNT, ESI), ECX ) + + TEST_L( ECX, ECX ) + JZ( LLBL( x86_p2_ir_done ) ) + + MOV_L( REGOFF(V4F_STRIDE, ESI), EAX ) + OR_L( CONST(VEC_SIZE_2), REGOFF(V4F_FLAGS, EDI) ) + + MOV_L( ECX, REGOFF(V4F_COUNT, EDI) ) + MOV_L( CONST(2), REGOFF(V4F_SIZE, EDI) ) + + SHL_L( CONST(4), ECX ) + MOV_L( REGOFF(V4F_START, ESI), ESI ) + + MOV_L( REGOFF(V4F_START, EDI), EDI ) + ADD_L( EDI, ECX ) + + CMP_L( ESI, EDI ) + JE( LLBL( x86_p2_ir_done ) ) + +ALIGNTEXT16 +LLBL( x86_p2_ir_loop ): + + MOV_L( SRC(0), EBX ) + MOV_L( SRC(1), EDX ) + + MOV_L( EBX, DST(0) ) + MOV_L( EDX, DST(1) ) + +LLBL( x86_p2_ir_skip ): + + ADD_L( CONST(16), EDI ) + ADD_L( EAX, ESI ) + CMP_L( ECX, EDI ) + JNE( LLBL( x86_p2_ir_loop ) ) + +LLBL( x86_p2_ir_done ): + + POP_L( EBX ) + POP_L( EDI ) + POP_L( ESI ) + RET +#undef FRAME_OFFSET Index: xc/extras/Mesa/src/X86/x86_xform_raw3.S diff -u /dev/null xc/extras/Mesa/src/X86/x86_xform_raw3.S:1.2 --- /dev/null Mon Dec 18 14:21:59 2000 +++ xc/extras/Mesa/src/X86/x86_xform_raw3.S Mon Nov 13 18:31:19 2000 @@ -0,0 +1,605 @@ + +/* + * Mesa 3-D graphics library + * Version: 3.4 + * + * Copyright (C) 1999-2000 Brian Paul All Rights Reserved. + * + * 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 + * BRIAN PAUL 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 "assyntax.h" +#include "xform_args.h" + + SEG_TEXT + +#define FP_ONE 1065353216 +#define FP_ZERO 0 + +#define SRC(i) REGOFF(i * 4, ESI) +#define DST(i) REGOFF(i * 4, EDI) +#define MAT(i) REGOFF(i * 4, EDX) + + +ALIGNTEXT16 +GLOBL GLNAME( gl_x86_transform_points3_general_raw ) +GLNAME( gl_x86_transform_points3_general_raw ): + +#define FRAME_OFFSET 8 + PUSH_L( ESI ) + PUSH_L( EDI ) + + MOV_L( ARG_SOURCE, ESI ) + MOV_L( ARG_DEST, EDI ) + + MOV_L( ARG_MATRIX, EDX ) + MOV_L( REGOFF(V4F_COUNT, ESI), ECX ) + + TEST_L( ECX, ECX ) + JZ( LLBL( x86_p3_gr_done ) ) + + MOV_L( REGOFF(V4F_STRIDE, ESI), EAX ) + OR_L( CONST(VEC_SIZE_4), REGOFF(V4F_FLAGS, EDI) ) + + MOV_L( ECX, REGOFF(V4F_COUNT, EDI) ) + MOV_L( CONST(4), REGOFF(V4F_SIZE, EDI) ) + + SHL_L( CONST(4), ECX ) + MOV_L( REGOFF(V4F_START, ESI), ESI ) + + MOV_L( REGOFF(V4F_START, EDI), EDI ) + ADD_L( EDI, ECX ) + +ALIGNTEXT16 +LLBL( x86_p3_gr_loop ): + + FLD_S( SRC(0) ) /* F4 */ + FMUL_S( MAT(0) ) + FLD_S( SRC(0) ) /* F5 F4 */ + FMUL_S( MAT(1) ) + FLD_S( SRC(0) ) /* F6 F5 F4 */ + FMUL_S( MAT(2) ) + FLD_S( SRC(0) ) /* F7 F6 F5 F4 */ + FMUL_S( MAT(3) ) + + FLD_S( SRC(1) ) /* F0 F7 F6 F5 F4 */ + FMUL_S( MAT(4) ) + FLD_S( SRC(1) ) /* F1 F0 F7 F6 F5 F4 */ + FMUL_S( MAT(5) ) + FLD_S( SRC(1) ) /* F2 F1 F0 F7 F6 F5 F4 */ + FMUL_S( MAT(6) ) + FLD_S( SRC(1) ) /* F3 F2 F1 F0 F7 F6 F5 F4 */ + FMUL_S( MAT(7) ) + + FXCH( ST(3) ) /* F0 F2 F1 F3 F7 F6 F5 F4 */ + FADDP( ST(0), ST(7) ) /* F2 F1 F3 F7 F6 F5 F4 */ + FXCH( ST(1) ) /* F1 F2 F3 F7 F6 F5 F4 */ + FADDP( ST(0), ST(5) ) /* F2 F3 F7 F6 F5 F4 */ + FADDP( ST(0), ST(3) ) /* F3 F7 F6 F5 F4 */ + FADDP( ST(0), ST(1) ) /* F7 F6 F5 F4 */ + + FLD_S( SRC(2) ) /* F0 F7 F6 F5 F4 */ + FMUL_S( MAT(8) ) + FLD_S( SRC(2) ) /* F1 F0 F7 F6 F5 F4 */ + FMUL_S( MAT(9) ) + FLD_S( SRC(2) ) /* F2 F1 F0 F7 F6 F5 F4 */ + FMUL_S( MAT(10) ) + FLD_S( SRC(2) ) /* F3 F2 F1 F0 F7 F6 F5 F4 */ + FMUL_S( MAT(11) ) + + FXCH( ST(3) ) /* F0 F2 F1 F3 F7 F6 F5 F4 */ + FADDP( ST(0), ST(7) ) /* F2 F1 F3 F7 F6 F5 F4 */ + FXCH( ST(1) ) /* F1 F2 F3 F7 F6 F5 F4 */ + FADDP( ST(0), ST(5) ) /* F2 F3 F7 F6 F5 F4 */ + FADDP( ST(0), ST(3) ) /* F3 F7 F6 F5 F4 */ + FADDP( ST(0), ST(1) ) /* F7 F6 F5 F4 */ + + FXCH( ST(3) ) /* F4 F6 F5 F7 */ + FADD_S( MAT(12) ) + FXCH( ST(2) ) /* F5 F6 F4 F7 */ + FADD_S( MAT(13) ) + FXCH( ST(1) ) /* F6 F5 F4 F7 */ + FADD_S( MAT(14) ) + FXCH( ST(3) ) /* F7 F5 F4 F6 */ + FADD_S( MAT(15) ) + + FXCH( ST(2) ) /* F4 F5 F7 F6 */ + FSTP_S( DST(0) ) /* F5 F7 F6 */ + FSTP_S( DST(1) ) /* F7 F6 */ + FXCH( ST(1) ) /* F6 F7 */ + FSTP_S( DST(2) ) /* F7 */ + FSTP_S( DST(3) ) /* */ + +LLBL( x86_p3_gr_skip ): + + ADD_L( CONST(16), EDI ) + ADD_L( EAX, ESI ) + CMP_L( ECX, EDI ) + JNE( LLBL( x86_p3_gr_loop ) ) + +LLBL( x86_p3_gr_done ): + + POP_L( EDI ) + POP_L( ESI ) + RET +#undef FRAME_OFFSET + + + + +ALIGNTEXT16 +GLOBL GLNAME( gl_x86_transform_points3_perspective_raw ) +GLNAME( gl_x86_transform_points3_perspective_raw ): + +#define FRAME_OFFSET 12 + PUSH_L( ESI ) + PUSH_L( EDI ) + PUSH_L( EBX ) + + MOV_L( ARG_SOURCE, ESI ) + MOV_L( ARG_DEST, EDI ) + + MOV_L( ARG_MATRIX, EDX ) + MOV_L( REGOFF(V4F_COUNT, ESI), ECX ) + + TEST_L( ECX, ECX ) + JZ( LLBL( x86_p3_pr_done ) ) + + MOV_L( REGOFF(V4F_STRIDE, ESI), EAX ) + OR_L( CONST(VEC_SIZE_4), REGOFF(V4F_FLAGS, EDI) ) + + MOV_L( ECX, REGOFF(V4F_COUNT, EDI) ) + MOV_L( CONST(4), REGOFF(V4F_SIZE, EDI) ) + + SHL_L( CONST(4), ECX ) + MOV_L( REGOFF(V4F_START, ESI), ESI ) + + MOV_L( REGOFF(V4F_START, EDI), EDI ) + ADD_L( EDI, ECX ) + +ALIGNTEXT16 +LLBL( x86_p3_pr_loop ): + + FLD_S( SRC(0) ) /* F4 */ + FMUL_S( MAT(0) ) + + FLD_S( SRC(1) ) /* F5 F4 */ + FMUL_S( MAT(5) ) + + FLD_S( SRC(2) ) /* F0 F5 F4 */ + FMUL_S( MAT(8) ) + FLD_S( SRC(2) ) /* F1 F0 F5 F4 */ + FMUL_S( MAT(9) ) + FLD_S( SRC(2) ) /* F2 F1 F0 F5 F4 */ + FMUL_S( MAT(10) ) + + FXCH( ST(2) ) /* F0 F1 F2 F5 F4 */ + FADDP( ST(0), ST(4) ) /* F1 F2 F5 F4 */ + FADDP( ST(0), ST(2) ) /* F2 F5 F4 */ + FLD_S( MAT(14) ) /* F6 F2 F5 F4 */ + FXCH( ST(1) ) /* F2 F6 F5 F4 */ + FADDP( ST(0), ST(1) ) /* F6 F5 F4 */ + + MOV_L( SRC(2), EBX ) + XOR_L( CONST(-2147483648), EBX )/* change sign */ + + FXCH( ST(2) ) /* F4 F5 F6 */ + FSTP_S( DST(0) ) /* F5 F6 */ + FSTP_S( DST(1) ) /* F6 */ + FSTP_S( DST(2) ) /* */ + MOV_L( EBX, DST(3) ) + +LLBL( x86_p3_pr_skip ): + + ADD_L( CONST(16), EDI ) + ADD_L( EAX, ESI ) + CMP_L( ECX, EDI ) + JNE( LLBL( x86_p3_pr_loop ) ) + +LLBL( x86_p3_pr_done ): + + POP_L( EBX ) + POP_L( EDI ) + POP_L( ESI ) + RET +#undef FRAME_OFFSET + + + + +ALIGNTEXT16 +GLOBL GLNAME( gl_x86_transform_points3_3d_raw ) +GLNAME( gl_x86_transform_points3_3d_raw ): + +#define FRAME_OFFSET 8 + PUSH_L( ESI ) + PUSH_L( EDI ) + + MOV_L( ARG_SOURCE, ESI ) + MOV_L( ARG_DEST, EDI ) + + MOV_L( ARG_MATRIX, EDX ) + MOV_L( REGOFF(V4F_COUNT, ESI), ECX ) + + TEST_L( ECX, ECX ) + JZ( LLBL( x86_p3_3dr_done ) ) + + MOV_L( REGOFF(V4F_STRIDE, ESI), EAX ) + OR_L( CONST(VEC_SIZE_3), REGOFF(V4F_FLAGS, EDI) ) + + MOV_L( ECX, REGOFF(V4F_COUNT, EDI) ) + MOV_L( CONST(3), REGOFF(V4F_SIZE, EDI) ) + + SHL_L( CONST(4), ECX ) + MOV_L( REGOFF(V4F_START, ESI), ESI ) + + MOV_L( REGOFF(V4F_START, EDI), EDI ) + ADD_L( EDI, ECX ) + +ALIGNTEXT16 +LLBL( x86_p3_3dr_loop ): + + FLD_S( SRC(0) ) /* F4 */ + FMUL_S( MAT(0) ) + FLD_S( SRC(0) ) /* F5 F4 */ + FMUL_S( MAT(1) ) + FLD_S( SRC(0) ) /* F6 F5 F4 */ + FMUL_S( MAT(2) ) + + FLD_S( SRC(1) ) /* F0 F6 F5 F4 */ + FMUL_S( MAT(4) ) + FLD_S( SRC(1) ) /* F1 F0 F6 F5 F4 */ + FMUL_S( MAT(5) ) + FLD_S( SRC(1) ) /* F2 F1 F0 F6 F5 F4 */ + FMUL_S( MAT(6) ) + + FXCH( ST(2) ) /* F0 F1 F2 F6 F5 F4 */ + FADDP( ST(0), ST(5) ) /* F1 F2 F6 F5 F4 */ + FADDP( ST(0), ST(3) ) /* F2 F6 F5 F4 */ + FADDP( ST(0), ST(1) ) /* F6 F5 F4 */ + + FLD_S( SRC(2) ) /* F0 F6 F5 F4 */ + FMUL_S( MAT(8) ) + FLD_S( SRC(2) ) /* F1 F0 F6 F5 F4 */ + FMUL_S( MAT(9) ) + FLD_S( SRC(2) ) /* F2 F1 F0 F6 F5 F4 */ + FMUL_S( MAT(10) ) + + FXCH( ST(2) ) /* F0 F1 F2 F6 F5 F4 */ + FADDP( ST(0), ST(5) ) /* F1 F2 F6 F5 F4 */ + FADDP( ST(0), ST(3) ) /* F2 F6 F5 F4 */ + FADDP( ST(0), ST(1) ) /* F6 F5 F4 */ + + FXCH( ST(2) ) /* F4 F5 F6 */ + FADD_S( MAT(12) ) + FXCH( ST(1) ) /* F5 F4 F6 */ + FADD_S( MAT(13) ) + FXCH( ST(2) ) /* F6 F4 F5 */ + FADD_S( MAT(14) ) + + FXCH( ST(1) ) /* F4 F6 F5 */ + FSTP_S( DST(0) ) /* F6 F5 */ + FXCH( ST(1) ) /* F5 F6 */ + FSTP_S( DST(1) ) /* F6 */ + FSTP_S( DST(2) ) /* */ + +LLBL( x86_p3_3dr_skip ): + + ADD_L( CONST(16), EDI ) + ADD_L( EAX, ESI ) + CMP_L( ECX, EDI ) + JNE( LLBL( x86_p3_3dr_loop ) ) + +LLBL( x86_p3_3dr_done ): + + POP_L( EDI ) + POP_L( ESI ) + RET +#undef FRAME_OFFSET + + + + +ALIGNTEXT16 +GLOBL GLNAME( gl_x86_transform_points3_3d_no_rot_raw ) +GLNAME( gl_x86_transform_points3_3d_no_rot_raw ): + +#define FRAME_OFFSET 8 + PUSH_L( ESI ) + PUSH_L( EDI ) + + MOV_L( ARG_SOURCE, ESI ) + MOV_L( ARG_DEST, EDI ) + + + MOV_L( ARG_MATRIX, EDX ) + MOV_L( REGOFF(V4F_COUNT, ESI), ECX ) + + TEST_L( ECX, ECX ) + JZ( LLBL( x86_p3_3dnrr_done ) ) + + MOV_L( REGOFF(V4F_STRIDE, ESI), EAX ) + OR_L( CONST(VEC_SIZE_3), REGOFF(V4F_FLAGS, EDI) ) + + MOV_L( ECX, REGOFF(V4F_COUNT, EDI) ) + MOV_L( CONST(3), REGOFF(V4F_SIZE, EDI) ) + + SHL_L( CONST(4), ECX ) + MOV_L( REGOFF(V4F_START, ESI), ESI ) + + MOV_L( REGOFF(V4F_START, EDI), EDI ) + ADD_L( EDI, ECX ) + +ALIGNTEXT16 +LLBL( x86_p3_3dnrr_loop ): + + FLD_S( SRC(0) ) /* F4 */ + FMUL_S( MAT(0) ) + + FLD_S( SRC(1) ) /* F1 F4 */ + FMUL_S( MAT(5) ) + + FLD_S( SRC(2) ) /* F2 F1 F4 */ + FMUL_S( MAT(10) ) + + FXCH( ST(2) ) /* F4 F1 F2 */ + FADD_S( MAT(12) ) + FLD_S( MAT(13) ) /* F5 F4 F1 F2 */ + FXCH( ST(2) ) /* F1 F4 F5 F2 */ + FADDP( ST(0), ST(2) ) /* F4 F5 F2 */ + FLD_S( MAT(14) ) /* F6 F4 F5 F2 */ + FXCH( ST(3) ) /* F2 F4 F5 F6 */ + FADDP( ST(0), ST(3) ) /* F4 F5 F6 */ + + FSTP_S( DST(0) ) /* F5 F6 */ + FSTP_S( DST(1) ) /* F6 */ + FSTP_S( DST(2) ) /* */ + +LLBL( x86_p3_3dnrr_skip ): + + ADD_L( CONST(16), EDI ) + ADD_L( EAX, ESI ) + CMP_L( ECX, EDI ) + JNE( LLBL( x86_p3_3dnrr_loop ) ) + +LLBL( x86_p3_3dnrr_done ): + + POP_L( EDI ) + POP_L( ESI ) + RET +#undef FRAME_OFFSET + + + + +ALIGNTEXT16 +GLOBL GLNAME( gl_x86_transform_points3_2d_raw ) +GLNAME( gl_x86_transform_points3_2d_raw ): + +#define FRAME_OFFSET 12 + PUSH_L( ESI ) + PUSH_L( EDI ) + PUSH_L( EBX ) + + MOV_L( ARG_SOURCE, ESI ) + MOV_L( ARG_DEST, EDI ) + + MOV_L( ARG_MATRIX, EDX ) + MOV_L( REGOFF(V4F_COUNT, ESI), ECX ) + + TEST_L( ECX, ECX ) + JZ( LLBL( x86_p3_2dr_done ) ) + + MOV_L( REGOFF(V4F_STRIDE, ESI), EAX ) + OR_L( CONST(VEC_SIZE_3), REGOFF(V4F_FLAGS, EDI) ) + + MOV_L( ECX, REGOFF(V4F_COUNT, EDI) ) + MOV_L( CONST(3), REGOFF(V4F_SIZE, EDI) ) + + SHL_L( CONST(4), ECX ) + MOV_L( REGOFF(V4F_START, ESI), ESI ) + + MOV_L( REGOFF(V4F_START, EDI), EDI ) + ADD_L( EDI, ECX ) + +ALIGNTEXT16 +LLBL( x86_p3_2dr_loop ): + + FLD_S( SRC(0) ) /* F4 */ + FMUL_S( MAT(0) ) + FLD_S( SRC(0) ) /* F5 F4 */ + FMUL_S( MAT(1) ) + + FLD_S( SRC(1) ) /* F0 F5 F4 */ + FMUL_S( MAT(4) ) + FLD_S( SRC(1) ) /* F1 F0 F5 F4 */ + FMUL_S( MAT(5) ) + + FXCH( ST(1) ) /* F0 F1 F5 F4 */ + FADDP( ST(0), ST(3) ) /* F1 F5 F4 */ + FADDP( ST(0), ST(1) ) /* F5 F4 */ + + FXCH( ST(1) ) /* F4 F5 */ + FADD_S( MAT(12) ) + FXCH( ST(1) ) /* F5 F4 */ + FADD_S( MAT(13) ) + + MOV_L( SRC(2), EBX ) + + FXCH( ST(1) ) /* F4 F5 */ + FSTP_S( DST(0) ) /* F5 */ + FSTP_S( DST(1) ) /* */ + MOV_L( EBX, DST(2) ) + +LLBL( x86_p3_2dr_skip ): + + ADD_L( CONST(16), EDI ) + ADD_L( EAX, ESI ) + CMP_L( ECX, EDI ) + JNE( LLBL( x86_p3_2dr_loop ) ) + +LLBL( x86_p3_2dr_done ): + + POP_L( EBX ) + POP_L( EDI ) + POP_L( ESI ) + RET +#undef FRAME_OFFSET + + + + +ALIGNTEXT16 +GLOBL GLNAME( gl_x86_transform_points3_2d_no_rot_raw ) +GLNAME( gl_x86_transform_points3_2d_no_rot_raw ): + +#define FRAME_OFFSET 12 + PUSH_L( ESI ) + PUSH_L( EDI ) + PUSH_L( EBX ) + + MOV_L( ARG_SOURCE, ESI ) + MOV_L( ARG_DEST, EDI ) + + MOV_L( ARG_MATRIX, EDX ) + MOV_L( REGOFF(V4F_COUNT, ESI), ECX ) + + TEST_L( ECX, ECX ) + JZ( LLBL( x86_p3_2dnrr_done ) ) + + MOV_L( REGOFF(V4F_STRIDE, ESI), EAX ) + OR_L( CONST(VEC_SIZE_3), REGOFF(V4F_FLAGS, EDI) ) + + MOV_L( ECX, REGOFF(V4F_COUNT, EDI) ) + MOV_L( CONST(3), REGOFF(V4F_SIZE, EDI) ) + + SHL_L( CONST(4), ECX ) + MOV_L( REGOFF(V4F_START, ESI), ESI ) + + MOV_L( REGOFF(V4F_START, EDI), EDI ) + ADD_L( EDI, ECX ) + +ALIGNTEXT16 +LLBL( x86_p3_2dnrr_loop ): + + FLD_S( SRC(0) ) /* F4 */ + FMUL_S( MAT(0) ) + + FLD_S( SRC(1) ) /* F1 F4 */ + FMUL_S( MAT(5) ) + + FXCH( ST(1) ) /* F4 F1 */ + FADD_S( MAT(12) ) + FLD_S( MAT(13) ) /* F5 F4 F1 */ + + FXCH( ST(2) ) /* F1 F4 F5 */ + FADDP( ST(0), ST(2) ) /* F4 F5 */ + + MOV_L( SRC(2), EBX ) + + FSTP_S( DST(0) ) /* F5 */ + FSTP_S( DST(1) ) /* */ + MOV_L( EBX, DST(2) ) + +LLBL( x86_p3_2dnrr_skip ): + + ADD_L( CONST(16), EDI ) + ADD_L( EAX, ESI ) + CMP_L( ECX, EDI ) + JNE( LLBL( x86_p3_2dnrr_loop ) ) + +LLBL( x86_p3_2dnrr_done ): + + POP_L( EBX ) + POP_L( EDI ) + POP_L( ESI ) + RET +#undef FRAME_OFFSET + + + + +ALIGNTEXT16 +GLOBL GLNAME( gl_x86_transform_points3_identity_raw ) +GLNAME(gl_x86_transform_points3_identity_raw ): + +#define FRAME_OFFSET 16 + PUSH_L( ESI ) + PUSH_L( EDI ) + PUSH_L( EBX ) + PUSH_L( EBP ) + + MOV_L( ARG_SOURCE, ESI ) + MOV_L( ARG_DEST, EDI ) + + MOV_L( ARG_MATRIX, EDX ) + MOV_L( REGOFF(V4F_COUNT, ESI), ECX ) + + TEST_L( ECX, ECX ) + JZ( LLBL( x86_p3_ir_done ) ) + + MOV_L( REGOFF(V4F_STRIDE, ESI), EAX ) + OR_L( CONST(VEC_SIZE_3), REGOFF(V4F_FLAGS, EDI) ) + + MOV_L( ECX, REGOFF(V4F_COUNT, EDI) ) + MOV_L( CONST(3), REGOFF(V4F_SIZE, EDI) ) + + SHL_L( CONST(4), ECX ) + MOV_L( REGOFF(V4F_START, ESI), ESI ) + + MOV_L( REGOFF(V4F_START, EDI), EDI ) + ADD_L( EDI, ECX ) + + CMP_L( ESI, EDI ) + JE( LLBL( x86_p3_ir_done ) ) + +ALIGNTEXT16 +LLBL( x86_p3_ir_loop ): + +#if 1 + MOV_L( SRC(0), EBX ) + MOV_L( SRC(1), EBP ) + MOV_L( SRC(2), EDX ) + + MOV_L( EBX, DST(0) ) + MOV_L( EBP, DST(1) ) + MOV_L( EDX, DST(2) ) +#else + FLD_S( SRC(0) ) + FLD_S( SRC(1) ) + FLD_S( SRC(2) ) + + FSTP_S( DST(2) ) + FSTP_S( DST(1) ) + FSTP_S( DST(0) ) +#endif + +LLBL( x86_p3_ir_skip ): + + ADD_L( CONST(16), EDI ) + ADD_L( EAX, ESI ) + CMP_L( ECX, EDI ) + JNE( LLBL( x86_p3_ir_loop ) ) + +LLBL( x86_p3_ir_done ): + + POP_L( EBP ) + POP_L( EBX ) + POP_L( EDI ) + POP_L( ESI ) + RET Index: xc/extras/Mesa/src/X86/x86_xform_raw4.S diff -u /dev/null xc/extras/Mesa/src/X86/x86_xform_raw4.S:1.2 --- /dev/null Mon Dec 18 14:21:59 2000 +++ xc/extras/Mesa/src/X86/x86_xform_raw4.S Mon Nov 13 18:31:19 2000 @@ -0,0 +1,638 @@ + +/* + * Mesa 3-D graphics library + * Version: 3.4 + * + * Copyright (C) 1999-2000 Brian Paul All Rights Reserved. + * + * 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 + * BRIAN PAUL 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 "assyntax.h" +#include "xform_args.h" + + SEG_TEXT + +#define FP_ONE 1065353216 +#define FP_ZERO 0 + +#define SRC(i) REGOFF(i * 4, ESI) +#define DST(i) REGOFF(i * 4, EDI) +#define MAT(i) REGOFF(i * 4, EDX) + + +ALIGNTEXT16 +GLOBL GLNAME( gl_x86_transform_points4_general_raw ) +GLNAME( gl_x86_transform_points4_general_raw ): + +#define FRAME_OFFSET 8 + PUSH_L( ESI ) + PUSH_L( EDI ) + + MOV_L( ARG_SOURCE, ESI ) + MOV_L( ARG_DEST, EDI ) + + MOV_L( ARG_MATRIX, EDX ) + MOV_L( REGOFF(V4F_COUNT, ESI), ECX ) + + TEST_L( ECX, ECX ) + JZ( LLBL( x86_p4_gr_done ) ) + + MOV_L( REGOFF(V4F_STRIDE, ESI), EAX ) + OR_L( CONST(VEC_SIZE_4), REGOFF(V4F_FLAGS, EDI) ) + + MOV_L( ECX, REGOFF(V4F_COUNT, EDI) ) + MOV_L( CONST(4), REGOFF(V4F_SIZE, EDI) ) + + SHL_L( CONST(4), ECX ) + MOV_L( REGOFF(V4F_START, ESI), ESI ) + + MOV_L( REGOFF(V4F_START, EDI), EDI ) + ADD_L( EDI, ECX ) + +ALIGNTEXT16 +LLBL( x86_p4_gr_loop ): + + FLD_S( SRC(0) ) /* F4 */ + FMUL_S( MAT(0) ) + FLD_S( SRC(0) ) /* F5 F4 */ + FMUL_S( MAT(1) ) + FLD_S( SRC(0) ) /* F6 F5 F4 */ + FMUL_S( MAT(2) ) + FLD_S( SRC(0) ) /* F7 F6 F5 F4 */ + FMUL_S( MAT(3) ) + + FLD_S( SRC(1) ) /* F0 F7 F6 F5 F4 */ + FMUL_S( MAT(4) ) + FLD_S( SRC(1) ) /* F1 F0 F7 F6 F5 F4 */ + FMUL_S( MAT(5) ) + FLD_S( SRC(1) ) /* F2 F1 F0 F7 F6 F5 F4 */ + FMUL_S( MAT(6) ) + FLD_S( SRC(1) ) /* F3 F2 F1 F0 F7 F6 F5 F4 */ + FMUL_S( MAT(7) ) + + FXCH( ST(3) ) /* F0 F2 F1 F3 F7 F6 F5 F4 */ + FADDP( ST(0), ST(7) ) /* F2 F1 F3 F7 F6 F5 F4 */ + FXCH( ST(1) ) /* F1 F2 F3 F7 F6 F5 F4 */ + FADDP( ST(0), ST(5) ) /* F2 F3 F7 F6 F5 F4 */ + FADDP( ST(0), ST(3) ) /* F3 F7 F6 F5 F4 */ + FADDP( ST(0), ST(1) ) /* F7 F6 F5 F4 */ + + FLD_S( SRC(2) ) /* F0 F7 F6 F5 F4 */ + FMUL_S( MAT(8) ) + FLD_S( SRC(2) ) /* F1 F0 F7 F6 F5 F4 */ + FMUL_S( MAT(9) ) + FLD_S( SRC(2) ) /* F2 F1 F0 F7 F6 F5 F4 */ + FMUL_S( MAT(10) ) + FLD_S( SRC(2) ) /* F3 F2 F1 F0 F7 F6 F5 F4 */ + FMUL_S( MAT(11) ) + + FXCH( ST(3) ) /* F0 F2 F1 F3 F7 F6 F5 F4 */ + FADDP( ST(0), ST(7) ) /* F2 F1 F3 F7 F6 F5 F4 */ + FXCH( ST(1) ) /* F1 F2 F3 F7 F6 F5 F4 */ + FADDP( ST(0), ST(5) ) /* F2 F3 F7 F6 F5 F4 */ + FADDP( ST(0), ST(3) ) /* F3 F7 F6 F5 F4 */ + FADDP( ST(0), ST(1) ) /* F7 F6 F5 F4 */ + + FLD_S( SRC(3) ) /* F0 F7 F6 F5 F4 */ + FMUL_S( MAT(12) ) + FLD_S( SRC(3) ) /* F1 F0 F7 F6 F5 F4 */ + FMUL_S( MAT(13) ) + FLD_S( SRC(3) ) /* F2 F1 F0 F7 F6 F5 F4 */ + FMUL_S( MAT(14) ) + FLD_S( SRC(3) ) /* F3 F2 F1 F0 F7 F6 F5 F4 */ + FMUL_S( MAT(15) ) + + FXCH( ST(3) ) /* F0 F2 F1 F3 F7 F6 F5 F4 */ + FADDP( ST(0), ST(7) ) /* F2 F1 F3 F7 F6 F5 F4 */ + FXCH( ST(1) ) /* F1 F2 F3 F7 F6 F5 F4 */ + FADDP( ST(0), ST(5) ) /* F2 F3 F7 F6 F5 F4 */ + FADDP( ST(0), ST(3) ) /* F3 F7 F6 F5 F4 */ + FADDP( ST(0), ST(1) ) /* F7 F6 F5 F4 */ + + FXCH( ST(3) ) /* F4 F6 F5 F7 */ + FSTP_S( DST(0) ) /* F6 F5 F7 */ + FXCH( ST(1) ) /* F5 F6 F7 */ + FSTP_S( DST(1) ) /* F6 F7 */ + FSTP_S( DST(2) ) /* F7 */ + FSTP_S( DST(3) ) /* */ + +LLBL( x86_p4_gr_skip ): + + ADD_L( CONST(16), EDI ) + ADD_L( EAX, ESI ) + CMP_L( ECX, EDI ) + JNE( LLBL( x86_p4_gr_loop ) ) + +LLBL( x86_p4_gr_done ): + + POP_L( EDI ) + POP_L( ESI ) + RET +#undef FRAME_OFFSET + + + + +ALIGNTEXT16 +GLOBL GLNAME( gl_x86_transform_points4_perspective_raw ) +GLNAME( gl_x86_transform_points4_perspective_raw ): + +#define FRAME_OFFSET 12 + PUSH_L( ESI ) + PUSH_L( EDI ) + PUSH_L( EBX ) + + MOV_L( ARG_SOURCE, ESI ) + MOV_L( ARG_DEST, EDI ) + + MOV_L( ARG_MATRIX, EDX ) + MOV_L( REGOFF(V4F_COUNT, ESI), ECX ) + + TEST_L( ECX, ECX ) + JZ( LLBL( x86_p4_pr_done ) ) + + MOV_L( REGOFF(V4F_STRIDE, ESI), EAX ) + OR_L( CONST(VEC_SIZE_4), REGOFF(V4F_FLAGS, EDI) ) + + MOV_L( ECX, REGOFF(V4F_COUNT, EDI) ) + MOV_L( CONST(4), REGOFF(V4F_SIZE, EDI) ) + + SHL_L( CONST(4), ECX ) + MOV_L( REGOFF(V4F_START, ESI), ESI ) + + MOV_L( REGOFF(V4F_START, EDI), EDI ) + ADD_L( EDI, ECX ) + +ALIGNTEXT16 +LLBL( x86_p4_pr_loop ): + + FLD_S( SRC(0) ) /* F4 */ + FMUL_S( MAT(0) ) + + FLD_S( SRC(1) ) /* F5 F4 */ + FMUL_S( MAT(5) ) + + FLD_S( SRC(2) ) /* F0 F5 F4 */ + FMUL_S( MAT(8) ) + FLD_S( SRC(2) ) /* F1 F0 F5 F4 */ + FMUL_S( MAT(9) ) + FLD_S( SRC(2) ) /* F6 F1 F0 F5 F4 */ + FMUL_S( MAT(10) ) + + FXCH( ST(2) ) /* F0 F1 F6 F5 F4 */ + FADDP( ST(0), ST(4) ) /* F1 F6 F5 F4 */ + FADDP( ST(0), ST(2) ) /* F6 F5 F4 */ + + FLD_S( SRC(3) ) /* F2 F6 F5 F4 */ + FMUL_S( MAT(14) ) + + FADDP( ST(0), ST(1) ) /* F6 F5 F4 */ + + MOV_L( SRC(2), EBX ) + XOR_L( CONST(-2147483648), EBX )/* change sign */ + + FXCH( ST(2) ) /* F4 F5 F6 */ + FSTP_S( DST(0) ) /* F5 F6 */ + FSTP_S( DST(1) ) /* F6 */ + FSTP_S( DST(2) ) /* */ + MOV_L( EBX, DST(3) ) + +LLBL( x86_p4_pr_skip ): + + ADD_L( CONST(16), EDI ) + ADD_L( EAX, ESI ) + CMP_L( ECX, EDI ) + JNE( LLBL( x86_p4_pr_loop ) ) + +LLBL( x86_p4_pr_done ): + + POP_L( EBX ) + POP_L( EDI ) + POP_L( ESI ) + RET +#undef FRAME_OFFSET + + + + +ALIGNTEXT16 +GLOBL GLNAME( gl_x86_transform_points4_3d_raw ) +GLNAME( gl_x86_transform_points4_3d_raw ): + +#define FRAME_OFFSET 12 + PUSH_L( ESI ) + PUSH_L( EDI ) + PUSH_L( EBX ) + + MOV_L( ARG_SOURCE, ESI ) + MOV_L( ARG_DEST, EDI ) + + MOV_L( ARG_MATRIX, EDX ) + MOV_L( REGOFF(V4F_COUNT, ESI), ECX ) + + TEST_L( ECX, ECX ) + JZ( LLBL( x86_p4_3dr_done ) ) + + MOV_L( REGOFF(V4F_STRIDE, ESI), EAX ) + OR_L( CONST(VEC_SIZE_4), REGOFF(V4F_FLAGS, EDI) ) + + MOV_L( ECX, REGOFF(V4F_COUNT, EDI) ) + MOV_L( CONST(4), REGOFF(V4F_SIZE, EDI) ) + + SHL_L( CONST(4), ECX ) + MOV_L( REGOFF(V4F_START, ESI), ESI ) + + MOV_L( REGOFF(V4F_START, EDI), EDI ) + ADD_L( EDI, ECX ) + +ALIGNTEXT16 +LLBL( x86_p4_3dr_loop ): + + FLD_S( SRC(0) ) /* F4 */ + FMUL_S( MAT(0) ) + FLD_S( SRC(0) ) /* F5 F4 */ + FMUL_S( MAT(1) ) + FLD_S( SRC(0) ) /* F6 F5 F4 */ + FMUL_S( MAT(2) ) + + FLD_S( SRC(1) ) /* F0 F6 F5 F4 */ + FMUL_S( MAT(4) ) + FLD_S( SRC(1) ) /* F1 F0 F6 F5 F4 */ + FMUL_S( MAT(5) ) + FLD_S( SRC(1) ) /* F2 F1 F0 F6 F5 F4 */ + FMUL_S( MAT(6) ) + + FXCH( ST(2) ) /* F0 F1 F2 F6 F5 F4 */ + FADDP( ST(0), ST(5) ) /* F1 F2 F6 F5 F4 */ + FADDP( ST(0), ST(3) ) /* F2 F6 F5 F4 */ + FADDP( ST(0), ST(1) ) /* F6 F5 F4 */ + + FLD_S( SRC(2) ) /* F0 F6 F5 F4 */ + FMUL_S( MAT(8) ) + FLD_S( SRC(2) ) /* F1 F0 F6 F5 F4 */ + FMUL_S( MAT(9) ) + FLD_S( SRC(2) ) /* F2 F1 F0 F6 F5 F4 */ + FMUL_S( MAT(10) ) + + FXCH( ST(2) ) /* F0 F1 F2 F6 F5 F4 */ + FADDP( ST(0), ST(5) ) /* F1 F2 F6 F5 F4 */ + FADDP( ST(0), ST(3) ) /* F2 F6 F5 F4 */ + FADDP( ST(0), ST(1) ) /* F6 F5 F4 */ + + FLD_S( SRC(3) ) /* F0 F6 F5 F4 */ + FMUL_S( MAT(12) ) + FLD_S( SRC(3) ) /* F1 F0 F6 F5 F4 */ + FMUL_S( MAT(13) ) + FLD_S( SRC(3) ) /* F2 F1 F0 F6 F5 F4 */ + FMUL_S( MAT(14) ) + + FXCH( ST(2) ) /* F0 F1 F2 F6 F5 F4 */ + FADDP( ST(0), ST(5) ) /* F1 F2 F6 F5 F4 */ + FADDP( ST(0), ST(3) ) /* F2 F6 F5 F4 */ + FADDP( ST(0), ST(1) ) /* F6 F5 F4 */ + + MOV_L( SRC(3), EBX ) + + FXCH( ST(2) ) /* F4 F5 F6 */ + FSTP_S( DST(0) ) /* F5 F6 */ + FSTP_S( DST(1) ) /* F6 */ + FSTP_S( DST(2) ) /* */ + MOV_L( EBX, DST(3) ) + +LLBL( x86_p4_3dr_skip ): + + ADD_L( CONST(16), EDI ) + ADD_L( EAX, ESI ) + CMP_L( ECX, EDI ) + JNE( LLBL( x86_p4_3dr_loop ) ) + +LLBL( x86_p4_3dr_done ): + + POP_L( EBX ) + POP_L( EDI ) + POP_L( ESI ) + RET +#undef FRAME_OFFSET + + + + +ALIGNTEXT16 +GLOBL GLNAME(gl_x86_transform_points4_3d_no_rot_raw) +GLNAME(gl_x86_transform_points4_3d_no_rot_raw): + +#define FRAME_OFFSET 12 + PUSH_L( ESI ) + PUSH_L( EDI ) + PUSH_L( EBX ) + + MOV_L( ARG_SOURCE, ESI ) + MOV_L( ARG_DEST, EDI ) + + MOV_L( ARG_MATRIX, EDX ) + MOV_L( REGOFF(V4F_COUNT, ESI), ECX ) + + TEST_L( ECX, ECX ) + JZ( LLBL( x86_p4_3dnrr_done ) ) + + MOV_L( REGOFF(V4F_STRIDE, ESI), EAX ) + OR_L( CONST(VEC_SIZE_4), REGOFF(V4F_FLAGS, EDI) ) + + MOV_L( ECX, REGOFF(V4F_COUNT, EDI) ) + MOV_L( CONST(4), REGOFF(V4F_SIZE, EDI) ) + + SHL_L( CONST(4), ECX ) + MOV_L( REGOFF(V4F_START, ESI), ESI ) + + MOV_L( REGOFF(V4F_START, EDI), EDI ) + ADD_L( EDI, ECX ) + +ALIGNTEXT16 +LLBL( x86_p4_3dnrr_loop ): + + FLD_S( SRC(0) ) /* F4 */ + FMUL_S( MAT(0) ) + + FLD_S( SRC(1) ) /* F5 F4 */ + FMUL_S( MAT(5) ) + + FLD_S( SRC(2) ) /* F6 F5 F4 */ + FMUL_S( MAT(10) ) + + FLD_S( SRC(3) ) /* F0 F6 F5 F4 */ + FMUL_S( MAT(12) ) + FLD_S( SRC(3) ) /* F1 F0 F6 F5 F4 */ + FMUL_S( MAT(13) ) + FLD_S( SRC(3) ) /* F2 F1 F0 F6 F5 F4 */ + FMUL_S( MAT(14) ) + + FXCH( ST(2) ) /* F0 F1 F2 F6 F5 F4 */ + FADDP( ST(0), ST(5) ) /* F1 F2 F6 F5 F4 */ + FADDP( ST(0), ST(3) ) /* F2 F6 F5 F4 */ + FADDP( ST(0), ST(1) ) /* F6 F5 F4 */ + + MOV_L( SRC(3), EBX ) + + FXCH( ST(2) ) /* F4 F5 F6 */ + FSTP_S( DST(0) ) /* F5 F6 */ + FSTP_S( DST(1) ) /* F6 */ + FSTP_S( DST(2) ) /* */ + MOV_L( EBX, DST(3) ) + +LLBL( x86_p4_3dnrr_skip ): + + ADD_L( CONST(16), EDI ) + ADD_L( EAX, ESI ) + CMP_L( ECX, EDI ) + JNE( LLBL( x86_p4_3dnrr_loop ) ) + +LLBL( x86_p4_3dnrr_done ): + + POP_L( EBX ) + POP_L( EDI ) + POP_L( ESI ) + RET +#undef FRAME_OFFSET + + + + +ALIGNTEXT16 +GLOBL GLNAME( gl_x86_transform_points4_2d_raw ) +GLNAME( gl_x86_transform_points4_2d_raw ): + +#define FRAME_OFFSET 16 + PUSH_L( ESI ) + PUSH_L( EDI ) + PUSH_L( EBX ) + PUSH_L( EBP ) + + MOV_L( ARG_SOURCE, ESI ) + MOV_L( ARG_DEST, EDI ) + + MOV_L( ARG_MATRIX, EDX ) + MOV_L( REGOFF(V4F_COUNT, ESI), ECX ) + + TEST_L( ECX, ECX ) + JZ( LLBL( x86_p4_2dr_done ) ) + + MOV_L( REGOFF(V4F_STRIDE, ESI), EAX ) + OR_L( CONST(VEC_SIZE_4), REGOFF(V4F_FLAGS, EDI) ) + + MOV_L( ECX, REGOFF(V4F_COUNT, EDI) ) + MOV_L( CONST(4), REGOFF(V4F_SIZE, EDI) ) + + SHL_L( CONST(4), ECX ) + MOV_L( REGOFF(V4F_START, ESI), ESI ) + + MOV_L( REGOFF(V4F_START, EDI), EDI ) + ADD_L( EDI, ECX ) + +ALIGNTEXT16 +LLBL( x86_p4_2dr_loop ): + + FLD_S( SRC(0) ) /* F4 */ + FMUL_S( MAT(0) ) + FLD_S( SRC(0) ) /* F5 F4 */ + FMUL_S( MAT(1) ) + + FLD_S( SRC(1) ) /* F0 F5 F4 */ + FMUL_S( MAT(4) ) + FLD_S( SRC(1) ) /* F1 F0 F5 F4 */ + FMUL_S( MAT(5) ) + + FXCH( ST(1) ) /* F0 F1 F5 F4 */ + FADDP( ST(0), ST(3) ) /* F1 F5 F4 */ + FADDP( ST(0), ST(1) ) /* F5 F4 */ + + FLD_S( SRC(3) ) /* F0 F5 F4 */ + FMUL_S( MAT(12) ) + FLD_S( SRC(3) ) /* F1 F0 F5 F4 */ + FMUL_S( MAT(13) ) + + FXCH( ST(1) ) /* F0 F1 F5 F4 */ + FADDP( ST(0), ST(3) ) /* F1 F5 F4 */ + FADDP( ST(0), ST(1) ) /* F5 F4 */ + + MOV_L( SRC(2), EBX ) + MOV_L( SRC(3), EBP ) + + FXCH( ST(1) ) /* F4 F5 */ + FSTP_S( DST(0) ) /* F5 */ + FSTP_S( DST(1) ) /* */ + MOV_L( EBX, DST(2) ) + MOV_L( EBP, DST(3) ) + +LLBL( x86_p4_2dr_skip ): + + ADD_L( CONST(16), EDI ) + ADD_L( EAX, ESI ) + CMP_L( ECX, EDI ) + JNE( LLBL( x86_p4_2dr_loop ) ) + +LLBL( x86_p4_2dr_done ): + + POP_L( EBP ) + POP_L( EBX ) + POP_L( EDI ) + POP_L( ESI ) + RET +#undef FRAME_OFFSET + + + + +ALIGNTEXT16 +GLOBL GLNAME( gl_x86_transform_points4_2d_no_rot_raw ) +GLNAME( gl_x86_transform_points4_2d_no_rot_raw ): + +#define FRAME_OFFSET 16 + PUSH_L( ESI ) + PUSH_L( EDI ) + PUSH_L( EBX ) + PUSH_L( EBP ) + + MOV_L( ARG_SOURCE, ESI ) + MOV_L( ARG_DEST, EDI ) + + MOV_L( ARG_MATRIX, EDX ) + MOV_L( REGOFF(V4F_COUNT, ESI), ECX ) + + TEST_L( ECX, ECX ) + JZ( LLBL( x86_p4_2dnrr_done ) ) + + MOV_L( REGOFF(V4F_STRIDE, ESI), EAX ) + OR_L( CONST(VEC_SIZE_4), REGOFF(V4F_FLAGS, EDI) ) + + MOV_L( ECX, REGOFF(V4F_COUNT, EDI) ) + MOV_L( CONST(4), REGOFF(V4F_SIZE, EDI) ) + + SHL_L( CONST(4), ECX ) + MOV_L( REGOFF(V4F_START, ESI), ESI ) + + MOV_L( REGOFF(V4F_START, EDI), EDI ) + ADD_L( EDI, ECX ) + +ALIGNTEXT16 +LLBL( x86_p4_2dnrr_loop ): + + FLD_S( SRC(0) ) /* F4 */ + FMUL_S( MAT(0) ) + + FLD_S( SRC(1) ) /* F5 F4 */ + FMUL_S( MAT(5) ) + + FLD_S( SRC(3) ) /* F0 F5 F4 */ + FMUL_S( MAT(12) ) + FLD_S( SRC(3) ) /* F1 F0 F5 F4 */ + FMUL_S( MAT(13) ) + + FXCH( ST(1) ) /* F0 F1 F5 F4 */ + FADDP( ST(0), ST(3) ) /* F1 F5 F4 */ + FADDP( ST(0), ST(1) ) /* F5 F4 */ + + MOV_L( SRC(2), EBX ) + MOV_L( SRC(3), EBP ) + + FXCH( ST(1) ) /* F4 F5 */ + FSTP_S( DST(0) ) /* F5 */ + FSTP_S( DST(1) ) /* */ + MOV_L( EBX, DST(2) ) + MOV_L( EBP, DST(3) ) + +LLBL( x86_p4_2dnrr_skip ): + + ADD_L( CONST(16), EDI ) + ADD_L( EAX, ESI ) + CMP_L( ECX, EDI ) + JNE( LLBL( x86_p4_2dnrr_loop ) ) + +LLBL( x86_p4_2dnrr_done ): + + POP_L( EBP ) + POP_L( EBX ) + POP_L( EDI ) + POP_L( ESI ) + RET +#undef FRAME_OFFSET + + + + +ALIGNTEXT16 +GLOBL GLNAME( gl_x86_transform_points4_identity_raw ) +GLNAME( gl_x86_transform_points4_identity_raw ): + +#define FRAME_OFFSET 12 + PUSH_L( ESI ) + PUSH_L( EDI ) + PUSH_L( EBX ) + + MOV_L( ARG_SOURCE, ESI ) + MOV_L( ARG_DEST, EDI ) + + MOV_L( ARG_MATRIX, EDX ) + MOV_L( REGOFF(V4F_COUNT, ESI), ECX ) + + TEST_L( ECX, ECX ) + JZ( LLBL( x86_p4_ir_done ) ) + + MOV_L( REGOFF(V4F_STRIDE, ESI), EAX ) + OR_L( CONST(VEC_SIZE_4), REGOFF(V4F_FLAGS, EDI) ) + + MOV_L( ECX, REGOFF(V4F_COUNT, EDI) ) + MOV_L( CONST(4), REGOFF(V4F_SIZE, EDI) ) + + SHL_L( CONST(4), ECX ) + MOV_L( REGOFF(V4F_START, ESI), ESI ) + + MOV_L( REGOFF(V4F_START, EDI), EDI ) + ADD_L( EDI, ECX ) + + CMP_L( ESI, EDI ) + JE( LLBL( x86_p4_ir_done ) ) + +ALIGNTEXT16 +LLBL( x86_p4_ir_loop ): + + MOV_L( SRC(0), EBX ) + MOV_L( SRC(1), EDX ) + + MOV_L( EBX, DST(0) ) + MOV_L( EDX, DST(1) ) + + MOV_L( SRC(2), EBX ) + MOV_L( SRC(3), EDX ) + + MOV_L( EBX, DST(2) ) + MOV_L( EDX, DST(3) ) + +LLBL( x86_p4_ir_skip ): + + ADD_L( CONST(16), EDI ) + ADD_L( EAX, ESI ) + CMP_L( ECX, EDI ) + JNE( LLBL( x86_p4_ir_loop ) ) + +LLBL( x86_p4_ir_done ): + + POP_L( EBX ) + POP_L( EDI ) + POP_L( ESI ) + RET Index: xc/extras/Mesa/src/X86/x86a.S diff -u xc/extras/Mesa/src/X86/x86a.S:1.2 xc/extras/Mesa/src/X86/x86a.S:removed --- xc/extras/Mesa/src/X86/x86a.S:1.2 Fri Jun 16 20:02:43 2000 +++ xc/extras/Mesa/src/X86/x86a.S Mon Dec 18 14:21:59 2000 @@ -1,9079 +0,0 @@ -#include "assyntax.h" - - SEG_TEXT - -#define FP_ONE 1065353216 -#define FP_ZERO 0 - -#define S(i) REGOFF(i * 4, ESI) -#define D(i) REGOFF(i * 4, EDI) -#define M(i) REGOFF(i * 4, EDX) - -/* - * Offsets into GLvector4f - */ -#define V4F_DATA 0 -#define V4F_START 4 -#define V4F_COUNT 8 -#define V4F_STRIDE 12 -#define V4F_SIZE 16 -#define V4F_FLAGS 20 - -#define VEC_SIZE_1 1 -#define VEC_SIZE_2 3 -#define VEC_SIZE_3 7 -#define VEC_SIZE_4 15 - -/* - * Offsets for transform_func arguments - * - * typedef void (*transform_func)( GLvector4f *to_vec, - * const GLmatrix *mat, - * const GLvector4f *from_vec, - * const GLubyte *clipmask, - * const GLubyte flag ); - */ -#define OFFSET_DEST 4 -#define OFFSET_MATRIX 8 -#define OFFSET_SOURCE 12 -#define OFFSET_CLIP 16 -#define OFFSET_FLAG 20 - -#define ARG_DEST REGOFF(FRAME_OFFSET+OFFSET_DEST, ESP) -#define ARG_MATRIX REGOFF(FRAME_OFFSET+OFFSET_MATRIX, ESP) -#define ARG_SOURCE REGOFF(FRAME_OFFSET+OFFSET_SOURCE, ESP) -#define ARG_CLIP REGOFF(FRAME_OFFSET+OFFSET_CLIP, ESP) -#define ARG_FLAG REGOFF(FRAME_OFFSET+OFFSET_FLAG, ESP) - -/* -######################################## -## -## Masked versions -## -######################################## -*/ - -/* -######################################## -## -## gl_x86_transform_points2_general -## -## -*/ - GLOBL GLNAME(gl_x86_transform_points2_general_masked) - ALIGNTEXT4 -GLNAME(gl_x86_transform_points2_general_masked): - -#define FRAME_OFFSET 16 - PUSH_L( ESI ) - PUSH_L( EDI ) - - PUSH_L( EBX ) - PUSH_L( EBP ) - - MOV_L( ARG_SOURCE, ESI ) /* ptr to source GLvector4f */ - MOV_L( ARG_DEST, EDI ) /* ptr to dest GLvector4f */ - - MOV_L( ARG_MATRIX, EDX ) /* ptr to matrix */ - MOV_L( ARG_CLIP, EBP ) /* ptr to clip mask array */ - - MOV_L( REGOFF(V4F_COUNT, ESI), ECX ) /* source count */ - MOV_B( ARG_FLAG, BL ) /* clip mask flags */ - - TEST_L( ECX, ECX ) - JZ( LLBL(p2mgm_finish) ) /* count was zero; go to finish */ - - MOV_L( REGOFF(V4F_STRIDE, ESI), EAX ) /* stride */ - OR_L( CONST(VEC_SIZE_4), REGOFF(V4F_FLAGS, EDI) ) /* set dest flags */ - - MOV_L( ECX, REGOFF(V4F_COUNT, EDI) ) /* set dest count */ - MOV_L( CONST(4), REGOFF(V4F_SIZE, EDI) ) /* set dest size */ - - SHL_L( CONST(4), ECX ) /* count *= 16 */ - MOV_L( REGOFF(V4F_START, ESI), ESI ) /* ptr to first source vertex */ - - MOV_L( REGOFF(V4F_START, EDI), EDI ) /* ptr to first dest vertex */ - ADD_L( EDI, ECX ) /* count += dest ptr */ - - - - ALIGNTEXT4ifNOP -LLBL(p2mgm_top): - - TEST_B( BL, REGIND(EBP) ) - JNZ( LLBL(p2mgm_skip) ) - - - FLD_S( S(0) ) /* F4 */ - FMUL_S( M(0) ) - FLD_S( S(0) ) /* F5 F4 */ - FMUL_S( M(1) ) - FLD_S( S(0) ) /* F6 F5 F4 */ - FMUL_S( M(2) ) - FLD_S( S(0) ) /* F7 F6 F5 F4 */ - FMUL_S( M(3) ) - - FLD_S( S(1) ) /* F0 F7 F6 F5 F4 */ - FMUL_S( M(4) ) - FLD_S( S(1) ) /* F1 F0 F7 F6 F5 F4 */ - FMUL_S( M(5) ) - FLD_S( S(1) ) /* F2 F1 F0 F7 F6 F5 F4 */ - FMUL_S( M(6) ) - FLD_S( S(1) ) /* F3 F2 F1 F0 F7 F6 F5 F4 */ - FMUL_S( M(7) ) - - FXCH( ST(3) ) /* F0 F2 F1 F3 F7 F6 F5 F4 */ - FADDP( ST(0), ST(7) ) /* F2 F1 F3 F7 F6 F5 F4 */ - FXCH( ST(1) ) /* F1 F2 F3 F7 F6 F5 F4 */ - FADDP( ST(0), ST(5) ) /* F2 F3 F7 F6 F5 F4 */ - FADDP( ST(0), ST(3) ) /* F3 F7 F6 F5 F4 */ - FADDP( ST(0), ST(1) ) /* F7 F6 F5 F4 */ - - FXCH( ST(3) ) /* F4 F6 F5 F7 */ - FADD_S( M(12) ) - FXCH( ST(2) ) /* F5 F6 F4 F7 */ - FADD_S( M(13) ) - FXCH( ST(1) ) /* F6 F5 F4 F7 */ - FADD_S( M(14) ) - FXCH( ST(3) ) /* F7 F5 F4 F6 */ - FADD_S( M(15) ) - - FXCH( ST(2) ) /* F4 F5 F7 F6 */ - FSTP_S( D(0) ) /* F5 F7 F6 */ - FSTP_S( D(1) ) /* F7 F6 */ - FXCH( ST(1) ) /* F6 F7 */ - FSTP_S( D(2) ) /* F7 */ - FSTP_S( D(3) ) /* */ - -LLBL(p2mgm_skip): - INC_L( EBP ) - ADD_L( CONST(16), EDI ) - ADD_L( EAX, ESI ) - CMP_L( ECX, EDI ) - JNE( LLBL(p2mgm_top) ) - - -LLBL(p2mgm_finish): - POP_L( EBP ) - POP_L( EBX ) - POP_L( EDI ) - POP_L( ESI ) - RET -#undef FRAME_OFFSET - -/* -######################################## -## -## gl_x86_transform_points2_identity -## -## -*/ - GLOBL GLNAME(gl_x86_transform_points2_identity_masked) - ALIGNTEXT4 -GLNAME(gl_x86_transform_points2_identity_masked): - -#define FRAME_OFFSET 16 - PUSH_L( ESI ) - PUSH_L( EDI ) - - PUSH_L( EBX ) - PUSH_L( EBP ) - - MOV_L( ARG_SOURCE, ESI ) /* ptr to source GLvector4f */ - MOV_L( ARG_DEST, EDI ) /* ptr to dest GLvector4f */ - - MOV_L( ARG_MATRIX, EDX ) /* ptr to matrix */ - MOV_L( ARG_CLIP, EBP ) /* ptr to clip mask array */ - - MOV_L( REGOFF(V4F_COUNT, ESI), ECX ) /* source count */ - MOV_B( ARG_FLAG, BL ) /* clip mask flags */ - - TEST_L( ECX, ECX ) - JZ( LLBL(p2mim_finish) ) /* count was zero; go to finish */ - - MOV_L( REGOFF(V4F_STRIDE, ESI), EAX ) /* stride */ - OR_L( CONST(VEC_SIZE_2), REGOFF(V4F_FLAGS, EDI) ) /* set dest flags */ - - MOV_L( ECX, REGOFF(V4F_COUNT, EDI) ) /* set dest count */ - MOV_L( CONST(2), REGOFF(V4F_SIZE, EDI) ) /* set dest size */ - - SHL_L( CONST(4), ECX ) /* count *= 16 */ - MOV_L( REGOFF(V4F_START, ESI), ESI ) /* ptr to first source vertex */ - - MOV_L( REGOFF(V4F_START, EDI), EDI ) /* ptr to first dest vertex */ - ADD_L( EDI, ECX ) /* count += dest ptr */ - - MOV_L( EAX, ARG_SOURCE ) /* need eax; put stride in ARG_SOURCE */ - - - CMP_L( ESI, EDI ) - JE( LLBL(p2mim_finish) ) - - ALIGNTEXT4ifNOP -LLBL(p2mim_top): - - TEST_B( BL, REGIND(EBP) ) - JNZ( LLBL(p2mim_skip) ) - - MOV_L( S(0), EAX ) - MOV_L( S(1), EDX ) - - MOV_L( EAX, D(0) ) - MOV_L( EDX, D(1) ) -LLBL(p2mim_skip): - INC_L( EBP ) - ADD_L( CONST(16), EDI ) - ADD_L( ARG_SOURCE, ESI ) - CMP_L( ECX, EDI ) - JNE( LLBL(p2mim_top) ) - - -LLBL(p2mim_finish): - POP_L( EBP ) - POP_L( EBX ) - POP_L( EDI ) - POP_L( ESI ) - RET -#undef FRAME_OFFSET - -/* -######################################## -## -## gl_x86_transform_points2_2d -## -## -*/ - GLOBL GLNAME(gl_x86_transform_points2_2d_masked) - ALIGNTEXT4 -GLNAME(gl_x86_transform_points2_2d_masked): - -#define FRAME_OFFSET 16 - PUSH_L( ESI ) - PUSH_L( EDI ) - - PUSH_L( EBX ) - PUSH_L( EBP ) - - MOV_L( ARG_SOURCE, ESI ) /* ptr to source GLvector4f */ - MOV_L( ARG_DEST, EDI ) /* ptr to dest GLvector4f */ - - MOV_L( ARG_MATRIX, EDX ) /* ptr to matrix */ - MOV_L( ARG_CLIP, EBP ) /* ptr to clip mask array */ - - MOV_L( REGOFF(V4F_COUNT, ESI), ECX ) /* source count */ - MOV_B( ARG_FLAG, BL ) /* clip mask flags */ - - TEST_L( ECX, ECX ) - JZ( LLBL(p2m2dm_finish) ) /* count was zero; go to finish */ - - MOV_L( REGOFF(V4F_STRIDE, ESI), EAX ) /* stride */ - OR_L( CONST(VEC_SIZE_2), REGOFF(V4F_FLAGS, EDI) ) /* set dest flags */ - - MOV_L( ECX, REGOFF(V4F_COUNT, EDI) ) /* set dest count */ - MOV_L( CONST(2), REGOFF(V4F_SIZE, EDI) ) /* set dest size */ - - SHL_L( CONST(4), ECX ) /* count *= 16 */ - MOV_L( REGOFF(V4F_START, ESI), ESI ) /* ptr to first source vertex */ - - MOV_L( REGOFF(V4F_START, EDI), EDI ) /* ptr to first dest vertex */ - ADD_L( EDI, ECX ) /* count += dest ptr */ - - - - ALIGNTEXT4ifNOP -LLBL(p2m2dm_top): - - TEST_B( BL, REGIND(EBP) ) - JNZ( LLBL(p2m2dm_skip) ) - - - FLD_S( S(0) ) /* F4 */ - FMUL_S( M(0) ) - FLD_S( S(0) ) /* F5 F4 */ - FMUL_S( M(1) ) - - FLD_S( S(1) ) /* F0 F5 F4 */ - FMUL_S( M(4) ) - FLD_S( S(1) ) /* F1 F0 F5 F4 */ - FMUL_S( M(5) ) - - FXCH( ST(1) ) /* F0 F1 F5 F4 */ - FADDP( ST(0), ST(3) ) /* F1 F5 F4 */ - FADDP( ST(0), ST(1) ) /* F5 F4 */ - - FXCH( ST(1) ) /* F4 F5 */ - FADD_S( M(12) ) - FXCH( ST(1) ) /* F5 F4 */ - FADD_S( M(13) ) - - FXCH( ST(1) ) /* F4 F5 */ - FSTP_S( D(0) ) /* F5 */ - FSTP_S( D(1) ) /* */ - -LLBL(p2m2dm_skip): - INC_L( EBP ) - ADD_L( CONST(16), EDI ) - ADD_L( EAX, ESI ) - CMP_L( ECX, EDI ) - JNE( LLBL(p2m2dm_top) ) - - -LLBL(p2m2dm_finish): - POP_L( EBP ) - POP_L( EBX ) - POP_L( EDI ) - POP_L( ESI ) - RET -#undef FRAME_OFFSET - -/* -######################################## -## -## gl_x86_transform_points2_2d_no_rot -## -## -*/ - GLOBL GLNAME(gl_x86_transform_points2_2d_no_rot_masked) - ALIGNTEXT4 -GLNAME(gl_x86_transform_points2_2d_no_rot_masked): - -#define FRAME_OFFSET 16 - PUSH_L( ESI ) - PUSH_L( EDI ) - - PUSH_L( EBX ) - PUSH_L( EBP ) - - MOV_L( ARG_SOURCE, ESI ) /* ptr to source GLvector4f */ - MOV_L( ARG_DEST, EDI ) /* ptr to dest GLvector4f */ - - MOV_L( ARG_MATRIX, EDX ) /* ptr to matrix */ - MOV_L( ARG_CLIP, EBP ) /* ptr to clip mask array */ - - MOV_L( REGOFF(V4F_COUNT, ESI), ECX ) /* source count */ - MOV_B( ARG_FLAG, BL ) /* clip mask flags */ - - TEST_L( ECX, ECX ) - JZ( LLBL(p2m2dnrm_finish) ) /* count was zero; go to finish */ - - MOV_L( REGOFF(V4F_STRIDE, ESI), EAX ) /* stride */ - OR_L( CONST(VEC_SIZE_2), REGOFF(V4F_FLAGS, EDI) ) /* set dest flags */ - - MOV_L( ECX, REGOFF(V4F_COUNT, EDI) ) /* set dest count */ - MOV_L( CONST(2), REGOFF(V4F_SIZE, EDI) ) /* set dest size */ - - SHL_L( CONST(4), ECX ) /* count *= 16 */ - MOV_L( REGOFF(V4F_START, ESI), ESI ) /* ptr to first source vertex */ - - MOV_L( REGOFF(V4F_START, EDI), EDI ) /* ptr to first dest vertex */ - ADD_L( EDI, ECX ) /* count += dest ptr */ - - - - ALIGNTEXT4ifNOP -LLBL(p2m2dnrm_top): - - TEST_B( BL, REGIND(EBP) ) - JNZ( LLBL(p2m2dnrm_skip) ) - - - FLD_S( S(0) ) /* F4 */ - FMUL_S( M(0) ) - - FLD_S( S(1) ) /* F1 F4 */ - FMUL_S( M(5) ) - - FXCH( ST(1) ) /* F4 F1 */ - FADD_S( M(12) ) - FLD_S( M(13) ) /* F5 F4 F1 */ - FXCH( ST(2) ) /* F1 F4 F5 */ - FADDP( ST(0), ST(2) ) /* F4 F5 */ - - FSTP_S( D(0) ) /* F5 */ - FSTP_S( D(1) ) /* */ - -LLBL(p2m2dnrm_skip): - INC_L( EBP ) - ADD_L( CONST(16), EDI ) - ADD_L( EAX, ESI ) - CMP_L( ECX, EDI ) - JNE( LLBL(p2m2dnrm_top) ) - - -LLBL(p2m2dnrm_finish): - POP_L( EBP ) - POP_L( EBX ) - POP_L( EDI ) - POP_L( ESI ) - RET -#undef FRAME_OFFSET - -/* -######################################## -## -## gl_x86_transform_points2_3d -## -## -*/ - GLOBL GLNAME(gl_x86_transform_points2_3d_masked) - ALIGNTEXT4 -GLNAME(gl_x86_transform_points2_3d_masked): - -#define FRAME_OFFSET 16 - PUSH_L( ESI ) - PUSH_L( EDI ) - - PUSH_L( EBX ) - PUSH_L( EBP ) - - MOV_L( ARG_SOURCE, ESI ) /* ptr to source GLvector4f */ - MOV_L( ARG_DEST, EDI ) /* ptr to dest GLvector4f */ - - MOV_L( ARG_MATRIX, EDX ) /* ptr to matrix */ - MOV_L( ARG_CLIP, EBP ) /* ptr to clip mask array */ - - MOV_L( REGOFF(V4F_COUNT, ESI), ECX ) /* source count */ - MOV_B( ARG_FLAG, BL ) /* clip mask flags */ - - TEST_L( ECX, ECX ) - JZ( LLBL(p2m3dm_finish) ) /* count was zero; go to finish */ - - MOV_L( REGOFF(V4F_STRIDE, ESI), EAX ) /* stride */ - OR_L( CONST(VEC_SIZE_3), REGOFF(V4F_FLAGS, EDI) ) /* set dest flags */ - - MOV_L( ECX, REGOFF(V4F_COUNT, EDI) ) /* set dest count */ - MOV_L( CONST(3), REGOFF(V4F_SIZE, EDI) ) /* set dest size */ - - SHL_L( CONST(4), ECX ) /* count *= 16 */ - MOV_L( REGOFF(V4F_START, ESI), ESI ) /* ptr to first source vertex */ - - MOV_L( REGOFF(V4F_START, EDI), EDI ) /* ptr to first dest vertex */ - ADD_L( EDI, ECX ) /* count += dest ptr */ - - - - ALIGNTEXT4ifNOP -LLBL(p2m3dm_top): - - TEST_B( BL, REGIND(EBP) ) - JNZ( LLBL(p2m3dm_skip) ) - - - FLD_S( S(0) ) /* F4 */ - FMUL_S( M(0) ) - FLD_S( S(0) ) /* F5 F4 */ - FMUL_S( M(1) ) - FLD_S( S(0) ) /* F6 F5 F4 */ - FMUL_S( M(2) ) - - FLD_S( S(1) ) /* F0 F6 F5 F4 */ - FMUL_S( M(4) ) - FLD_S( S(1) ) /* F1 F0 F6 F5 F4 */ - FMUL_S( M(5) ) - FLD_S( S(1) ) /* F2 F1 F0 F6 F5 F4 */ - FMUL_S( M(6) ) - - FXCH( ST(2) ) /* F0 F1 F2 F6 F5 F4 */ - FADDP( ST(0), ST(5) ) /* F1 F2 F6 F5 F4 */ - FADDP( ST(0), ST(3) ) /* F2 F6 F5 F4 */ - FADDP( ST(0), ST(1) ) /* F6 F5 F4 */ - - FXCH( ST(2) ) /* F4 F5 F6 */ - FADD_S( M(12) ) - FXCH( ST(1) ) /* F5 F4 F6 */ - FADD_S( M(13) ) - FXCH( ST(2) ) /* F6 F4 F5 */ - FADD_S( M(14) ) - - FXCH( ST(1) ) /* F4 F6 F5 */ - FSTP_S( D(0) ) /* F6 F5 */ - FXCH( ST(1) ) /* F5 F6 */ - FSTP_S( D(1) ) /* F6 */ - FSTP_S( D(2) ) /* */ - -LLBL(p2m3dm_skip): - INC_L( EBP ) - ADD_L( CONST(16), EDI ) - ADD_L( EAX, ESI ) - CMP_L( ECX, EDI ) - JNE( LLBL(p2m3dm_top) ) - - -LLBL(p2m3dm_finish): - POP_L( EBP ) - POP_L( EBX ) - POP_L( EDI ) - POP_L( ESI ) - RET -#undef FRAME_OFFSET - -/* -######################################## -## -## gl_x86_transform_points2_3d_no_rot -## -## -*/ - GLOBL GLNAME(gl_x86_transform_points2_3d_no_rot_masked) - ALIGNTEXT4 -GLNAME(gl_x86_transform_points2_3d_no_rot_masked): - -#define FRAME_OFFSET 16 - PUSH_L( ESI ) - PUSH_L( EDI ) - - PUSH_L( EBX ) - PUSH_L( EBP ) - - MOV_L( ARG_SOURCE, ESI ) /* ptr to source GLvector4f */ - MOV_L( ARG_DEST, EDI ) /* ptr to dest GLvector4f */ - - MOV_L( ARG_MATRIX, EDX ) /* ptr to matrix */ - MOV_L( ARG_CLIP, EBP ) /* ptr to clip mask array */ - - MOV_L( REGOFF(V4F_COUNT, ESI), ECX ) /* source count */ - MOV_B( ARG_FLAG, BL ) /* clip mask flags */ - - TEST_L( ECX, ECX ) - JZ( LLBL(p2m3dnrm_finish) ) /* count was zero; go to finish */ - - MOV_L( REGOFF(V4F_STRIDE, ESI), EAX ) /* stride */ - OR_L( CONST(VEC_SIZE_3), REGOFF(V4F_FLAGS, EDI) ) /* set dest flags */ - - MOV_L( ECX, REGOFF(V4F_COUNT, EDI) ) /* set dest count */ - MOV_L( CONST(3), REGOFF(V4F_SIZE, EDI) ) /* set dest size */ - - SHL_L( CONST(4), ECX ) /* count *= 16 */ - MOV_L( REGOFF(V4F_START, ESI), ESI ) /* ptr to first source vertex */ - - MOV_L( REGOFF(V4F_START, EDI), EDI ) /* ptr to first dest vertex */ - ADD_L( EDI, ECX ) /* count += dest ptr */ - - MOV_L( EAX, ARG_SOURCE ) /* need eax; put stride in ARG_SOURCE */ - - - MOV_L( M(14), EAX ) - ALIGNTEXT4ifNOP -LLBL(p2m3dnrm_top): - - TEST_B( BL, REGIND(EBP) ) - JNZ( LLBL(p2m3dnrm_skip) ) - - - FLD_S( S(0) ) /* F4 */ - FMUL_S( M(0) ) - - FLD_S( S(1) ) /* F1 F4 */ - FMUL_S( M(5) ) - - FXCH( ST(1) ) /* F4 F1 */ - FADD_S( M(12) ) - FLD_S( M(13) ) /* F5 F4 F1 */ - FXCH( ST(2) ) /* F1 F4 F5 */ - FADDP( ST(0), ST(2) ) /* F4 F5 */ - - FSTP_S( D(0) ) /* F5 */ - FSTP_S( D(1) ) /* */ - MOV_L( EAX, D(2) ) - -LLBL(p2m3dnrm_skip): - INC_L( EBP ) - ADD_L( CONST(16), EDI ) - ADD_L( ARG_SOURCE, ESI ) - CMP_L( ECX, EDI ) - JNE( LLBL(p2m3dnrm_top) ) - - -LLBL(p2m3dnrm_finish): - POP_L( EBP ) - POP_L( EBX ) - POP_L( EDI ) - POP_L( ESI ) - RET -#undef FRAME_OFFSET - -/* -######################################## -## -## gl_x86_transform_points2_perspective -## -## -*/ - GLOBL GLNAME(gl_x86_transform_points2_perspective_masked) - ALIGNTEXT4 -GLNAME(gl_x86_transform_points2_perspective_masked): - -#define FRAME_OFFSET 16 - PUSH_L( ESI ) - PUSH_L( EDI ) - - PUSH_L( EBX ) - PUSH_L( EBP ) - - MOV_L( ARG_SOURCE, ESI ) /* ptr to source GLvector4f */ - MOV_L( ARG_DEST, EDI ) /* ptr to dest GLvector4f */ - - MOV_L( ARG_MATRIX, EDX ) /* ptr to matrix */ - MOV_L( ARG_CLIP, EBP ) /* ptr to clip mask array */ - - MOV_L( REGOFF(V4F_COUNT, ESI), ECX ) /* source count */ - MOV_B( ARG_FLAG, BL ) /* clip mask flags */ - - TEST_L( ECX, ECX ) - JZ( LLBL(p2mpm_finish) ) /* count was zero; go to finish */ - - MOV_L( REGOFF(V4F_STRIDE, ESI), EAX ) /* stride */ - OR_L( CONST(VEC_SIZE_4), REGOFF(V4F_FLAGS, EDI) ) /* set dest flags */ - - MOV_L( ECX, REGOFF(V4F_COUNT, EDI) ) /* set dest count */ - MOV_L( CONST(4), REGOFF(V4F_SIZE, EDI) ) /* set dest size */ - - SHL_L( CONST(4), ECX ) /* count *= 16 */ - MOV_L( REGOFF(V4F_START, ESI), ESI ) /* ptr to first source vertex */ - - MOV_L( REGOFF(V4F_START, EDI), EDI ) /* ptr to first dest vertex */ - ADD_L( EDI, ECX ) /* count += dest ptr */ - - MOV_L( EAX, ARG_SOURCE ) /* need eax; put stride in ARG_SOURCE */ - - - MOV_L( M(14), EAX ) - ALIGNTEXT4ifNOP -LLBL(p2mpm_top): - - TEST_B( BL, REGIND(EBP) ) - JNZ( LLBL(p2mpm_skip) ) - - - FLD_S( S(0) ) /* F4 */ - FMUL_S( M(0) ) - - FLD_S( S(1) ) /* F1 F4 */ - FMUL_S( M(5) ) - - FXCH( ST(1) ) /* F4 F1 */ - FSTP_S( D(0) ) /* F1 */ - FSTP_S( D(1) ) /* */ - MOV_L( EAX, D(2) ) - MOV_L( CONST(FP_ZERO), D(3) ) - -LLBL(p2mpm_skip): - INC_L( EBP ) - ADD_L( CONST(16), EDI ) - ADD_L( ARG_SOURCE, ESI ) - CMP_L( ECX, EDI ) - JNE( LLBL(p2mpm_top) ) - - -LLBL(p2mpm_finish): - POP_L( EBP ) - POP_L( EBX ) - POP_L( EDI ) - POP_L( ESI ) - RET -#undef FRAME_OFFSET - -/* -######################################## -## -## gl_x86_transform_points3_general -## -## -*/ - GLOBL GLNAME(gl_x86_transform_points3_general_masked) - ALIGNTEXT4 -GLNAME(gl_x86_transform_points3_general_masked): - -#define FRAME_OFFSET 16 - PUSH_L( ESI ) - PUSH_L( EDI ) - - PUSH_L( EBX ) - PUSH_L( EBP ) - - MOV_L( ARG_SOURCE, ESI ) /* ptr to source GLvector4f */ - MOV_L( ARG_DEST, EDI ) /* ptr to dest GLvector4f */ - - MOV_L( ARG_MATRIX, EDX ) /* ptr to matrix */ - MOV_L( ARG_CLIP, EBP ) /* ptr to clip mask array */ - - MOV_L( REGOFF(V4F_COUNT, ESI), ECX ) /* source count */ - MOV_B( ARG_FLAG, BL ) /* clip mask flags */ - - TEST_L( ECX, ECX ) - JZ( LLBL(p3mgm_finish) ) /* count was zero; go to finish */ - - MOV_L( REGOFF(V4F_STRIDE, ESI), EAX ) /* stride */ - OR_L( CONST(VEC_SIZE_4), REGOFF(V4F_FLAGS, EDI) ) /* set dest flags */ - - MOV_L( ECX, REGOFF(V4F_COUNT, EDI) ) /* set dest count */ - MOV_L( CONST(4), REGOFF(V4F_SIZE, EDI) ) /* set dest size */ - - SHL_L( CONST(4), ECX ) /* count *= 16 */ - MOV_L( REGOFF(V4F_START, ESI), ESI ) /* ptr to first source vertex */ - - MOV_L( REGOFF(V4F_START, EDI), EDI ) /* ptr to first dest vertex */ - ADD_L( EDI, ECX ) /* count += dest ptr */ - - - - ALIGNTEXT4ifNOP -LLBL(p3mgm_top): - - TEST_B( BL, REGIND(EBP) ) - JNZ( LLBL(p3mgm_skip) ) - - - FLD_S( S(0) ) /* F4 */ - FMUL_S( M(0) ) - FLD_S( S(0) ) /* F5 F4 */ - FMUL_S( M(1) ) - FLD_S( S(0) ) /* F6 F5 F4 */ - FMUL_S( M(2) ) - FLD_S( S(0) ) /* F7 F6 F5 F4 */ - FMUL_S( M(3) ) - - FLD_S( S(1) ) /* F0 F7 F6 F5 F4 */ - FMUL_S( M(4) ) - FLD_S( S(1) ) /* F1 F0 F7 F6 F5 F4 */ - FMUL_S( M(5) ) - FLD_S( S(1) ) /* F2 F1 F0 F7 F6 F5 F4 */ - FMUL_S( M(6) ) - FLD_S( S(1) ) /* F3 F2 F1 F0 F7 F6 F5 F4 */ - FMUL_S( M(7) ) - - FXCH( ST(3) ) /* F0 F2 F1 F3 F7 F6 F5 F4 */ - FADDP( ST(0), ST(7) ) /* F2 F1 F3 F7 F6 F5 F4 */ - FXCH( ST(1) ) /* F1 F2 F3 F7 F6 F5 F4 */ - FADDP( ST(0), ST(5) ) /* F2 F3 F7 F6 F5 F4 */ - FADDP( ST(0), ST(3) ) /* F3 F7 F6 F5 F4 */ - FADDP( ST(0), ST(1) ) /* F7 F6 F5 F4 */ - - FLD_S( S(2) ) /* F0 F7 F6 F5 F4 */ - FMUL_S( M(8) ) - FLD_S( S(2) ) /* F1 F0 F7 F6 F5 F4 */ - FMUL_S( M(9) ) - FLD_S( S(2) ) /* F2 F1 F0 F7 F6 F5 F4 */ - FMUL_S( M(10) ) - FLD_S( S(2) ) /* F3 F2 F1 F0 F7 F6 F5 F4 */ - FMUL_S( M(11) ) - - FXCH( ST(3) ) /* F0 F2 F1 F3 F7 F6 F5 F4 */ - FADDP( ST(0), ST(7) ) /* F2 F1 F3 F7 F6 F5 F4 */ - FXCH( ST(1) ) /* F1 F2 F3 F7 F6 F5 F4 */ - FADDP( ST(0), ST(5) ) /* F2 F3 F7 F6 F5 F4 */ - FADDP( ST(0), ST(3) ) /* F3 F7 F6 F5 F4 */ - FADDP( ST(0), ST(1) ) /* F7 F6 F5 F4 */ - - FXCH( ST(3) ) /* F4 F6 F5 F7 */ - FADD_S( M(12) ) - FXCH( ST(2) ) /* F5 F6 F4 F7 */ - FADD_S( M(13) ) - FXCH( ST(1) ) /* F6 F5 F4 F7 */ - FADD_S( M(14) ) - FXCH( ST(3) ) /* F7 F5 F4 F6 */ - FADD_S( M(15) ) - - FXCH( ST(2) ) /* F4 F5 F7 F6 */ - FSTP_S( D(0) ) /* F5 F7 F6 */ - FSTP_S( D(1) ) /* F7 F6 */ - FXCH( ST(1) ) /* F6 F7 */ - FSTP_S( D(2) ) /* F7 */ - FSTP_S( D(3) ) /* */ - -LLBL(p3mgm_skip): - INC_L( EBP ) - ADD_L( CONST(16), EDI ) - ADD_L( EAX, ESI ) - CMP_L( ECX, EDI ) - JNE( LLBL(p3mgm_top) ) - - -LLBL(p3mgm_finish): - POP_L( EBP ) - POP_L( EBX ) - POP_L( EDI ) - POP_L( ESI ) - RET -#undef FRAME_OFFSET - -/* -######################################## -## -## gl_x86_transform_points3_identity -## -## -*/ - GLOBL GLNAME(gl_x86_transform_points3_identity_masked) - ALIGNTEXT4 -GLNAME(gl_x86_transform_points3_identity_masked): - -#define FRAME_OFFSET 16 - PUSH_L( ESI ) - PUSH_L( EDI ) - - PUSH_L( EBX ) - PUSH_L( EBP ) - - MOV_L( ARG_SOURCE, ESI ) /* ptr to source GLvector4f */ - MOV_L( ARG_DEST, EDI ) /* ptr to dest GLvector4f */ - - MOV_L( ARG_MATRIX, EDX ) /* ptr to matrix */ - MOV_L( ARG_CLIP, EBP ) /* ptr to clip mask array */ - - MOV_L( REGOFF(V4F_COUNT, ESI), ECX ) /* source count */ - MOV_B( ARG_FLAG, BL ) /* clip mask flags */ - - TEST_L( ECX, ECX ) - JZ( LLBL(p3mim_finish) ) /* count was zero; go to finish */ - - MOV_L( REGOFF(V4F_STRIDE, ESI), EAX ) /* stride */ - OR_L( CONST(VEC_SIZE_3), REGOFF(V4F_FLAGS, EDI) ) /* set dest flags */ - - MOV_L( ECX, REGOFF(V4F_COUNT, EDI) ) /* set dest count */ - MOV_L( CONST(3), REGOFF(V4F_SIZE, EDI) ) /* set dest size */ - - SHL_L( CONST(4), ECX ) /* count *= 16 */ - MOV_L( REGOFF(V4F_START, ESI), ESI ) /* ptr to first source vertex */ - - MOV_L( REGOFF(V4F_START, EDI), EDI ) /* ptr to first dest vertex */ - ADD_L( EDI, ECX ) /* count += dest ptr */ - - MOV_L( EAX, ARG_SOURCE ) /* need eax; put stride in ARG_SOURCE */ - MOV_L( ECX, ARG_DEST ) /* need ecx; put dest+count in ARG_DEST */ - - - CMP_L( ESI, EDI ) - JE( LLBL(p3mim_finish) ) - - ALIGNTEXT4ifNOP -LLBL(p3mim_top): - - TEST_B( BL, REGIND(EBP) ) - JNZ( LLBL(p3mim_skip) ) - - MOV_L( S(0), EAX ) - MOV_L( S(1), ECX ) - MOV_L( S(2), EDX ) - - MOV_L( EAX, D(0) ) - MOV_L( ECX, D(1) ) - MOV_L( EDX, D(2) ) -LLBL(p3mim_skip): - INC_L( EBP ) - ADD_L( CONST(16), EDI ) - ADD_L( ARG_SOURCE, ESI ) - CMP_L( ARG_DEST, EDI ) - JNE( LLBL(p3mim_top) ) - - -LLBL(p3mim_finish): - POP_L( EBP ) - POP_L( EBX ) - POP_L( EDI ) - POP_L( ESI ) - RET -#undef FRAME_OFFSET - -/* -######################################## -## -## gl_x86_transform_points3_2d -## -## -*/ - GLOBL GLNAME(gl_x86_transform_points3_2d_masked) - ALIGNTEXT4 -GLNAME(gl_x86_transform_points3_2d_masked): - -#define FRAME_OFFSET 16 - PUSH_L( ESI ) - PUSH_L( EDI ) - - PUSH_L( EBX ) - PUSH_L( EBP ) - - MOV_L( ARG_SOURCE, ESI ) /* ptr to source GLvector4f */ - MOV_L( ARG_DEST, EDI ) /* ptr to dest GLvector4f */ - - MOV_L( ARG_MATRIX, EDX ) /* ptr to matrix */ - MOV_L( ARG_CLIP, EBP ) /* ptr to clip mask array */ - - MOV_L( REGOFF(V4F_COUNT, ESI), ECX ) /* source count */ - MOV_B( ARG_FLAG, BL ) /* clip mask flags */ - - TEST_L( ECX, ECX ) - JZ( LLBL(p3m2dm_finish) ) /* count was zero; go to finish */ - - MOV_L( REGOFF(V4F_STRIDE, ESI), EAX ) /* stride */ - OR_L( CONST(VEC_SIZE_3), REGOFF(V4F_FLAGS, EDI) ) /* set dest flags */ - - MOV_L( ECX, REGOFF(V4F_COUNT, EDI) ) /* set dest count */ - MOV_L( CONST(3), REGOFF(V4F_SIZE, EDI) ) /* set dest size */ - - SHL_L( CONST(4), ECX ) /* count *= 16 */ - MOV_L( REGOFF(V4F_START, ESI), ESI ) /* ptr to first source vertex */ - - MOV_L( REGOFF(V4F_START, EDI), EDI ) /* ptr to first dest vertex */ - ADD_L( EDI, ECX ) /* count += dest ptr */ - - MOV_L( EAX, ARG_SOURCE ) /* need eax; put stride in ARG_SOURCE */ - - - ALIGNTEXT4ifNOP -LLBL(p3m2dm_top): - - TEST_B( BL, REGIND(EBP) ) - JNZ( LLBL(p3m2dm_skip) ) - - - FLD_S( S(0) ) /* F4 */ - FMUL_S( M(0) ) - FLD_S( S(0) ) /* F5 F4 */ - FMUL_S( M(1) ) - - FLD_S( S(1) ) /* F0 F5 F4 */ - FMUL_S( M(4) ) - FLD_S( S(1) ) /* F1 F0 F5 F4 */ - FMUL_S( M(5) ) - - FXCH( ST(1) ) /* F0 F1 F5 F4 */ - FADDP( ST(0), ST(3) ) /* F1 F5 F4 */ - FADDP( ST(0), ST(1) ) /* F5 F4 */ - - FXCH( ST(1) ) /* F4 F5 */ - FADD_S( M(12) ) - FXCH( ST(1) ) /* F5 F4 */ - FADD_S( M(13) ) - - MOV_L( S(2), EAX ) - - FXCH( ST(1) ) /* F4 F5 */ - FSTP_S( D(0) ) /* F5 */ - FSTP_S( D(1) ) /* */ - MOV_L( EAX, D(2) ) - -LLBL(p3m2dm_skip): - INC_L( EBP ) - ADD_L( CONST(16), EDI ) - ADD_L( ARG_SOURCE, ESI ) - CMP_L( ECX, EDI ) - JNE( LLBL(p3m2dm_top) ) - - -LLBL(p3m2dm_finish): - POP_L( EBP ) - POP_L( EBX ) - POP_L( EDI ) - POP_L( ESI ) - RET -#undef FRAME_OFFSET - -/* -######################################## -## -## gl_x86_transform_points3_2d_no_rot -## -## -*/ - GLOBL GLNAME(gl_x86_transform_points3_2d_no_rot_masked) - ALIGNTEXT4 -GLNAME(gl_x86_transform_points3_2d_no_rot_masked): - -#define FRAME_OFFSET 16 - PUSH_L( ESI ) - PUSH_L( EDI ) - - PUSH_L( EBX ) - PUSH_L( EBP ) - - MOV_L( ARG_SOURCE, ESI ) /* ptr to source GLvector4f */ - MOV_L( ARG_DEST, EDI ) /* ptr to dest GLvector4f */ - - MOV_L( ARG_MATRIX, EDX ) /* ptr to matrix */ - MOV_L( ARG_CLIP, EBP ) /* ptr to clip mask array */ - - MOV_L( REGOFF(V4F_COUNT, ESI), ECX ) /* source count */ - MOV_B( ARG_FLAG, BL ) /* clip mask flags */ - - TEST_L( ECX, ECX ) - JZ( LLBL(p3m2dnrm_finish) ) /* count was zero; go to finish */ - - MOV_L( REGOFF(V4F_STRIDE, ESI), EAX ) /* stride */ - OR_L( CONST(VEC_SIZE_3), REGOFF(V4F_FLAGS, EDI) ) /* set dest flags */ - - MOV_L( ECX, REGOFF(V4F_COUNT, EDI) ) /* set dest count */ - MOV_L( CONST(3), REGOFF(V4F_SIZE, EDI) ) /* set dest size */ - - SHL_L( CONST(4), ECX ) /* count *= 16 */ - MOV_L( REGOFF(V4F_START, ESI), ESI ) /* ptr to first source vertex */ - - MOV_L( REGOFF(V4F_START, EDI), EDI ) /* ptr to first dest vertex */ - ADD_L( EDI, ECX ) /* count += dest ptr */ - - MOV_L( EAX, ARG_SOURCE ) /* need eax; put stride in ARG_SOURCE */ - - - ALIGNTEXT4ifNOP -LLBL(p3m2dnrm_top): - - TEST_B( BL, REGIND(EBP) ) - JNZ( LLBL(p3m2dnrm_skip) ) - - - FLD_S( S(0) ) /* F4 */ - FMUL_S( M(0) ) - - FLD_S( S(1) ) /* F1 F4 */ - FMUL_S( M(5) ) - - FXCH( ST(1) ) /* F4 F1 */ - FADD_S( M(12) ) - FLD_S( M(13) ) /* F5 F4 F1 */ - - FXCH( ST(2) ) /* F1 F4 F5 */ - FADDP( ST(0), ST(2) ) /* F4 F5 */ - - MOV_L( S(2), EAX ) - - FSTP_S( D(0) ) /* F5 */ - FSTP_S( D(1) ) /* */ - MOV_L( EAX, D(2) ) - -LLBL(p3m2dnrm_skip): - INC_L( EBP ) - ADD_L( CONST(16), EDI ) - ADD_L( ARG_SOURCE, ESI ) - CMP_L( ECX, EDI ) - JNE( LLBL(p3m2dnrm_top) ) - - -LLBL(p3m2dnrm_finish): - POP_L( EBP ) - POP_L( EBX ) - POP_L( EDI ) - POP_L( ESI ) - RET -#undef FRAME_OFFSET - -/* -######################################## -## -## gl_x86_transform_points3_3d -## -## -*/ - GLOBL GLNAME(gl_x86_transform_points3_3d_masked) - ALIGNTEXT4 -GLNAME(gl_x86_transform_points3_3d_masked): - -#define FRAME_OFFSET 16 - PUSH_L( ESI ) - PUSH_L( EDI ) - - PUSH_L( EBX ) - PUSH_L( EBP ) - - MOV_L( ARG_SOURCE, ESI ) /* ptr to source GLvector4f */ - MOV_L( ARG_DEST, EDI ) /* ptr to dest GLvector4f */ - - MOV_L( ARG_MATRIX, EDX ) /* ptr to matrix */ - MOV_L( ARG_CLIP, EBP ) /* ptr to clip mask array */ - - MOV_L( REGOFF(V4F_COUNT, ESI), ECX ) /* source count */ - MOV_B( ARG_FLAG, BL ) /* clip mask flags */ - - TEST_L( ECX, ECX ) - JZ( LLBL(p3m3dm_finish) ) /* count was zero; go to finish */ - - MOV_L( REGOFF(V4F_STRIDE, ESI), EAX ) /* stride */ - OR_L( CONST(VEC_SIZE_3), REGOFF(V4F_FLAGS, EDI) ) /* set dest flags */ - - MOV_L( ECX, REGOFF(V4F_COUNT, EDI) ) /* set dest count */ - MOV_L( CONST(3), REGOFF(V4F_SIZE, EDI) ) /* set dest size */ - - SHL_L( CONST(4), ECX ) /* count *= 16 */ - MOV_L( REGOFF(V4F_START, ESI), ESI ) /* ptr to first source vertex */ - - MOV_L( REGOFF(V4F_START, EDI), EDI ) /* ptr to first dest vertex */ - ADD_L( EDI, ECX ) /* count += dest ptr */ - - - - ALIGNTEXT4ifNOP -LLBL(p3m3dm_top): - - TEST_B( BL, REGIND(EBP) ) - JNZ( LLBL(p3m3dm_skip) ) - - - FLD_S( S(0) ) /* F4 */ - FMUL_S( M(0) ) - FLD_S( S(0) ) /* F5 F4 */ - FMUL_S( M(1) ) - FLD_S( S(0) ) /* F6 F5 F4 */ - FMUL_S( M(2) ) - - FLD_S( S(1) ) /* F0 F6 F5 F4 */ - FMUL_S( M(4) ) - FLD_S( S(1) ) /* F1 F0 F6 F5 F4 */ - FMUL_S( M(5) ) - FLD_S( S(1) ) /* F2 F1 F0 F6 F5 F4 */ - FMUL_S( M(6) ) - - FXCH( ST(2) ) /* F0 F1 F2 F6 F5 F4 */ - FADDP( ST(0), ST(5) ) /* F1 F2 F6 F5 F4 */ - FADDP( ST(0), ST(3) ) /* F2 F6 F5 F4 */ - FADDP( ST(0), ST(1) ) /* F6 F5 F4 */ - - FLD_S( S(2) ) /* F0 F6 F5 F4 */ - FMUL_S( M(8) ) - FLD_S( S(2) ) /* F1 F0 F6 F5 F4 */ - FMUL_S( M(9) ) - FLD_S( S(2) ) /* F2 F1 F0 F6 F5 F4 */ - FMUL_S( M(10) ) - - FXCH( ST(2) ) /* F0 F1 F2 F6 F5 F4 */ - FADDP( ST(0), ST(5) ) /* F1 F2 F6 F5 F4 */ - FADDP( ST(0), ST(3) ) /* F2 F6 F5 F4 */ - FADDP( ST(0), ST(1) ) /* F6 F5 F4 */ - - FXCH( ST(2) ) /* F4 F5 F6 */ - FADD_S( M(12) ) - FXCH( ST(1) ) /* F5 F4 F6 */ - FADD_S( M(13) ) - FXCH( ST(2) ) /* F6 F4 F5 */ - FADD_S( M(14) ) - - FXCH( ST(1) ) /* F4 F6 F5 */ - FSTP_S( D(0) ) /* F6 F5 */ - FXCH( ST(1) ) /* F5 F6 */ - FSTP_S( D(1) ) /* F6 */ - FSTP_S( D(2) ) /* */ - -LLBL(p3m3dm_skip): - INC_L( EBP ) - ADD_L( CONST(16), EDI ) - ADD_L( EAX, ESI ) - CMP_L( ECX, EDI ) - JNE( LLBL(p3m3dm_top) ) - - -LLBL(p3m3dm_finish): - POP_L( EBP ) - POP_L( EBX ) - POP_L( EDI ) - POP_L( ESI ) - RET -#undef FRAME_OFFSET - -/* -######################################## -## -## gl_x86_transform_points3_3d_no_rot -## -## -*/ - GLOBL GLNAME(gl_x86_transform_points3_3d_no_rot_masked) - ALIGNTEXT4 -GLNAME(gl_x86_transform_points3_3d_no_rot_masked): - -#define FRAME_OFFSET 16 - PUSH_L( ESI ) - PUSH_L( EDI ) - - PUSH_L( EBX ) - PUSH_L( EBP ) - - MOV_L( ARG_SOURCE, ESI ) /* ptr to source GLvector4f */ - MOV_L( ARG_DEST, EDI ) /* ptr to dest GLvector4f */ - - MOV_L( ARG_MATRIX, EDX ) /* ptr to matrix */ - MOV_L( ARG_CLIP, EBP ) /* ptr to clip mask array */ - - MOV_L( REGOFF(V4F_COUNT, ESI), ECX ) /* source count */ - MOV_B( ARG_FLAG, BL ) /* clip mask flags */ - - TEST_L( ECX, ECX ) - JZ( LLBL(p3m3dnrm_finish) ) /* count was zero; go to finish */ - - MOV_L( REGOFF(V4F_STRIDE, ESI), EAX ) /* stride */ - OR_L( CONST(VEC_SIZE_3), REGOFF(V4F_FLAGS, EDI) ) /* set dest flags */ - - MOV_L( ECX, REGOFF(V4F_COUNT, EDI) ) /* set dest count */ - MOV_L( CONST(3), REGOFF(V4F_SIZE, EDI) ) /* set dest size */ - - SHL_L( CONST(4), ECX ) /* count *= 16 */ - MOV_L( REGOFF(V4F_START, ESI), ESI ) /* ptr to first source vertex */ - - MOV_L( REGOFF(V4F_START, EDI), EDI ) /* ptr to first dest vertex */ - ADD_L( EDI, ECX ) /* count += dest ptr */ - - - - ALIGNTEXT4ifNOP -LLBL(p3m3dnrm_top): - - TEST_B( BL, REGIND(EBP) ) - JNZ( LLBL(p3m3dnrm_skip) ) - - - FLD_S( S(0) ) /* F4 */ - FMUL_S( M(0) ) - - FLD_S( S(1) ) /* F1 F4 */ - FMUL_S( M(5) ) - - FLD_S( S(2) ) /* F2 F1 F4 */ - FMUL_S( M(10) ) - - FXCH( ST(2) ) /* F4 F1 F2 */ - FADD_S( M(12) ) - FLD_S( M(13) ) /* F5 F4 F1 F2 */ - FXCH( ST(2) ) /* F1 F4 F5 F2 */ - FADDP( ST(0), ST(2) ) /* F4 F5 F2 */ - FLD_S( M(14) ) /* F6 F4 F5 F2 */ - FXCH( ST(3) ) /* F2 F4 F5 F6 */ - FADDP( ST(0), ST(3) ) /* F4 F5 F6 */ - - FSTP_S( D(0) ) /* F5 F6 */ - FSTP_S( D(1) ) /* F6 */ - FSTP_S( D(2) ) /* */ - -LLBL(p3m3dnrm_skip): - INC_L( EBP ) - ADD_L( CONST(16), EDI ) - ADD_L( EAX, ESI ) - CMP_L( ECX, EDI ) - JNE( LLBL(p3m3dnrm_top) ) - - -LLBL(p3m3dnrm_finish): - POP_L( EBP ) - POP_L( EBX ) - POP_L( EDI ) - POP_L( ESI ) - RET -#undef FRAME_OFFSET - -/* -######################################## -## -## gl_x86_transform_points3_perspective -## -## -*/ - GLOBL GLNAME(gl_x86_transform_points3_perspective_masked) - ALIGNTEXT4 -GLNAME(gl_x86_transform_points3_perspective_masked): - -#define FRAME_OFFSET 16 - PUSH_L( ESI ) - PUSH_L( EDI ) - - PUSH_L( EBX ) - PUSH_L( EBP ) - - MOV_L( ARG_SOURCE, ESI ) /* ptr to source GLvector4f */ - MOV_L( ARG_DEST, EDI ) /* ptr to dest GLvector4f */ - - MOV_L( ARG_MATRIX, EDX ) /* ptr to matrix */ - MOV_L( ARG_CLIP, EBP ) /* ptr to clip mask array */ - - MOV_L( REGOFF(V4F_COUNT, ESI), ECX ) /* source count */ - MOV_B( ARG_FLAG, BL ) /* clip mask flags */ - - TEST_L( ECX, ECX ) - JZ( LLBL(p3mpm_finish) ) /* count was zero; go to finish */ - - MOV_L( REGOFF(V4F_STRIDE, ESI), EAX ) /* stride */ - OR_L( CONST(VEC_SIZE_4), REGOFF(V4F_FLAGS, EDI) ) /* set dest flags */ - - MOV_L( ECX, REGOFF(V4F_COUNT, EDI) ) /* set dest count */ - MOV_L( CONST(4), REGOFF(V4F_SIZE, EDI) ) /* set dest size */ - - SHL_L( CONST(4), ECX ) /* count *= 16 */ - MOV_L( REGOFF(V4F_START, ESI), ESI ) /* ptr to first source vertex */ - - MOV_L( REGOFF(V4F_START, EDI), EDI ) /* ptr to first dest vertex */ - ADD_L( EDI, ECX ) /* count += dest ptr */ - - MOV_L( EAX, ARG_SOURCE ) /* need eax; put stride in ARG_SOURCE */ - - - ALIGNTEXT4ifNOP -LLBL(p3mpm_top): - - TEST_B( BL, REGIND(EBP) ) - JNZ( LLBL(p3mpm_skip) ) - - - FLD_S( S(0) ) /* F4 */ - FMUL_S( M(0) ) - - FLD_S( S(1) ) /* F5 F4 */ - FMUL_S( M(5) ) - - FLD_S( S(2) ) /* F0 F5 F4 */ - FMUL_S( M(8) ) - FLD_S( S(2) ) /* F1 F0 F5 F4 */ - FMUL_S( M(9) ) - FLD_S( S(2) ) /* F2 F1 F0 F5 F4 */ - FMUL_S( M(10) ) - - FXCH( ST(2) ) /* F0 F1 F2 F5 F4 */ - FADDP( ST(0), ST(4) ) /* F1 F2 F5 F4 */ - FADDP( ST(0), ST(2) ) /* F2 F5 F4 */ - FLD_S( M(14) ) /* F6 F2 F5 F4 */ - FXCH( ST(1) ) /* F2 F6 F5 F4 */ - FADDP( ST(0), ST(1) ) /* F6 F5 F4 */ - - MOV_L( S(2), EAX ) - XOR_L( CONST(-2147483648), EAX ) /* change sign */ - - FXCH( ST(2) ) /* F4 F5 F6 */ - FSTP_S( D(0) ) /* F5 F6 */ - FSTP_S( D(1) ) /* F6 */ - FSTP_S( D(2) ) /* */ - MOV_L( EAX, D(3) ) - -LLBL(p3mpm_skip): - INC_L( EBP ) - ADD_L( CONST(16), EDI ) - ADD_L( ARG_SOURCE, ESI ) - CMP_L( ECX, EDI ) - JNE( LLBL(p3mpm_top) ) - - -LLBL(p3mpm_finish): - POP_L( EBP ) - POP_L( EBX ) - POP_L( EDI ) - POP_L( ESI ) - RET -#undef FRAME_OFFSET - -/* -######################################## -## -## gl_x86_transform_points4_general -## -## -*/ - GLOBL GLNAME(gl_x86_transform_points4_general_masked) - ALIGNTEXT4 -GLNAME(gl_x86_transform_points4_general_masked): - -#define FRAME_OFFSET 16 - PUSH_L( ESI ) - PUSH_L( EDI ) - - PUSH_L( EBX ) - PUSH_L( EBP ) - - MOV_L( ARG_SOURCE, ESI ) /* ptr to source GLvector4f */ - MOV_L( ARG_DEST, EDI ) /* ptr to dest GLvector4f */ - - MOV_L( ARG_MATRIX, EDX ) /* ptr to matrix */ - MOV_L( ARG_CLIP, EBP ) /* ptr to clip mask array */ - - MOV_L( REGOFF(V4F_COUNT, ESI), ECX ) /* source count */ - MOV_B( ARG_FLAG, BL ) /* clip mask flags */ - - TEST_L( ECX, ECX ) - JZ( LLBL(p4mgm_finish) ) /* count was zero; go to finish */ - - MOV_L( REGOFF(V4F_STRIDE, ESI), EAX ) /* stride */ - OR_L( CONST(VEC_SIZE_4), REGOFF(V4F_FLAGS, EDI) ) /* set dest flags */ - - MOV_L( ECX, REGOFF(V4F_COUNT, EDI) ) /* set dest count */ - MOV_L( CONST(4), REGOFF(V4F_SIZE, EDI) ) /* set dest size */ - - SHL_L( CONST(4), ECX ) /* count *= 16 */ - MOV_L( REGOFF(V4F_START, ESI), ESI ) /* ptr to first source vertex */ - - MOV_L( REGOFF(V4F_START, EDI), EDI ) /* ptr to first dest vertex */ - ADD_L( EDI, ECX ) /* count += dest ptr */ - - - - ALIGNTEXT4ifNOP -LLBL(p4mgm_top): - - TEST_B( BL, REGIND(EBP) ) - JNZ( LLBL(p4mgm_skip) ) - - - FLD_S( S(0) ) /* F4 */ - FMUL_S( M(0) ) - FLD_S( S(0) ) /* F5 F4 */ - FMUL_S( M(1) ) - FLD_S( S(0) ) /* F6 F5 F4 */ - FMUL_S( M(2) ) - FLD_S( S(0) ) /* F7 F6 F5 F4 */ - FMUL_S( M(3) ) - - FLD_S( S(1) ) /* F0 F7 F6 F5 F4 */ - FMUL_S( M(4) ) - FLD_S( S(1) ) /* F1 F0 F7 F6 F5 F4 */ - FMUL_S( M(5) ) - FLD_S( S(1) ) /* F2 F1 F0 F7 F6 F5 F4 */ - FMUL_S( M(6) ) - FLD_S( S(1) ) /* F3 F2 F1 F0 F7 F6 F5 F4 */ - FMUL_S( M(7) ) - - FXCH( ST(3) ) /* F0 F2 F1 F3 F7 F6 F5 F4 */ - FADDP( ST(0), ST(7) ) /* F2 F1 F3 F7 F6 F5 F4 */ - FXCH( ST(1) ) /* F1 F2 F3 F7 F6 F5 F4 */ - FADDP( ST(0), ST(5) ) /* F2 F3 F7 F6 F5 F4 */ - FADDP( ST(0), ST(3) ) /* F3 F7 F6 F5 F4 */ - FADDP( ST(0), ST(1) ) /* F7 F6 F5 F4 */ - - FLD_S( S(2) ) /* F0 F7 F6 F5 F4 */ - FMUL_S( M(8) ) - FLD_S( S(2) ) /* F1 F0 F7 F6 F5 F4 */ - FMUL_S( M(9) ) - FLD_S( S(2) ) /* F2 F1 F0 F7 F6 F5 F4 */ - FMUL_S( M(10) ) - FLD_S( S(2) ) /* F3 F2 F1 F0 F7 F6 F5 F4 */ - FMUL_S( M(11) ) - - FXCH( ST(3) ) /* F0 F2 F1 F3 F7 F6 F5 F4 */ - FADDP( ST(0), ST(7) ) /* F2 F1 F3 F7 F6 F5 F4 */ - FXCH( ST(1) ) /* F1 F2 F3 F7 F6 F5 F4 */ - FADDP( ST(0), ST(5) ) /* F2 F3 F7 F6 F5 F4 */ - FADDP( ST(0), ST(3) ) /* F3 F7 F6 F5 F4 */ - FADDP( ST(0), ST(1) ) /* F7 F6 F5 F4 */ - - FLD_S( S(3) ) /* F0 F7 F6 F5 F4 */ - FMUL_S( M(12) ) - FLD_S( S(3) ) /* F1 F0 F7 F6 F5 F4 */ - FMUL_S( M(13) ) - FLD_S( S(3) ) /* F2 F1 F0 F7 F6 F5 F4 */ - FMUL_S( M(14) ) - FLD_S( S(3) ) /* F3 F2 F1 F0 F7 F6 F5 F4 */ - FMUL_S( M(15) ) - - FXCH( ST(3) ) /* F0 F2 F1 F3 F7 F6 F5 F4 */ - FADDP( ST(0), ST(7) ) /* F2 F1 F3 F7 F6 F5 F4 */ - FXCH( ST(1) ) /* F1 F2 F3 F7 F6 F5 F4 */ - FADDP( ST(0), ST(5) ) /* F2 F3 F7 F6 F5 F4 */ - FADDP( ST(0), ST(3) ) /* F3 F7 F6 F5 F4 */ - FADDP( ST(0), ST(1) ) /* F7 F6 F5 F4 */ - - FXCH( ST(3) ) /* F4 F6 F5 F7 */ - FSTP_S( D(0) ) /* F6 F5 F7 */ - FXCH( ST(1) ) /* F5 F6 F7 */ - FSTP_S( D(1) ) /* F6 F7 */ - FSTP_S( D(2) ) /* F7 */ - FSTP_S( D(3) ) /* */ - -LLBL(p4mgm_skip): - INC_L( EBP ) - ADD_L( CONST(16), EDI ) - ADD_L( EAX, ESI ) - CMP_L( ECX, EDI ) - JNE( LLBL(p4mgm_top) ) - - -LLBL(p4mgm_finish): - POP_L( EBP ) - POP_L( EBX ) - POP_L( EDI ) - POP_L( ESI ) - RET -#undef FRAME_OFFSET - -/* -######################################## -## -## gl_x86_transform_points4_identity -## -## -*/ - GLOBL GLNAME(gl_x86_transform_points4_identity_masked) - ALIGNTEXT4 -GLNAME(gl_x86_transform_points4_identity_masked): - -#define FRAME_OFFSET 16 - PUSH_L( ESI ) - PUSH_L( EDI ) - - PUSH_L( EBX ) - PUSH_L( EBP ) - - MOV_L( ARG_SOURCE, ESI ) /* ptr to source GLvector4f */ - MOV_L( ARG_DEST, EDI ) /* ptr to dest GLvector4f */ - - MOV_L( ARG_MATRIX, EDX ) /* ptr to matrix */ - MOV_L( ARG_CLIP, EBP ) /* ptr to clip mask array */ - - MOV_L( REGOFF(V4F_COUNT, ESI), ECX ) /* source count */ - MOV_B( ARG_FLAG, BL ) /* clip mask flags */ - - TEST_L( ECX, ECX ) - JZ( LLBL(p4mim_finish) ) /* count was zero; go to finish */ - - MOV_L( REGOFF(V4F_STRIDE, ESI), EAX ) /* stride */ - OR_L( CONST(VEC_SIZE_4), REGOFF(V4F_FLAGS, EDI) ) /* set dest flags */ - - MOV_L( ECX, REGOFF(V4F_COUNT, EDI) ) /* set dest count */ - MOV_L( CONST(4), REGOFF(V4F_SIZE, EDI) ) /* set dest size */ - - SHL_L( CONST(4), ECX ) /* count *= 16 */ - MOV_L( REGOFF(V4F_START, ESI), ESI ) /* ptr to first source vertex */ - - MOV_L( REGOFF(V4F_START, EDI), EDI ) /* ptr to first dest vertex */ - ADD_L( EDI, ECX ) /* count += dest ptr */ - - MOV_L( EAX, ARG_SOURCE ) /* need eax; put stride in ARG_SOURCE */ - - - CMP_L( ESI, EDI ) - JE( LLBL(p4mim_finish) ) - - ALIGNTEXT4ifNOP -LLBL(p4mim_top): - - TEST_B( BL, REGIND(EBP) ) - JNZ( LLBL(p4mim_skip) ) - - MOV_L( S(0), EAX ) - MOV_L( S(1), EDX ) - - MOV_L( EAX, D(0) ) - MOV_L( EDX, D(1) ) - - MOV_L( S(2), EAX ) - MOV_L( S(3), EDX ) - - MOV_L( EAX, D(2) ) - MOV_L( EDX, D(3) ) -LLBL(p4mim_skip): - INC_L( EBP ) - ADD_L( CONST(16), EDI ) - ADD_L( ARG_SOURCE, ESI ) - CMP_L( ECX, EDI ) - JNE( LLBL(p4mim_top) ) - - -LLBL(p4mim_finish): - POP_L( EBP ) - POP_L( EBX ) - POP_L( EDI ) - POP_L( ESI ) - RET -#undef FRAME_OFFSET - -/* -######################################## -## -## gl_x86_transform_points4_2d -## -## -*/ - GLOBL GLNAME(gl_x86_transform_points4_2d_masked) - ALIGNTEXT4 -GLNAME(gl_x86_transform_points4_2d_masked): - -#define FRAME_OFFSET 16 - PUSH_L( ESI ) - PUSH_L( EDI ) - - PUSH_L( EBX ) - PUSH_L( EBP ) - - MOV_L( ARG_SOURCE, ESI ) /* ptr to source GLvector4f */ - MOV_L( ARG_DEST, EDI ) /* ptr to dest GLvector4f */ - - MOV_L( ARG_MATRIX, EDX ) /* ptr to matrix */ - MOV_L( ARG_CLIP, EBP ) /* ptr to clip mask array */ - - MOV_L( REGOFF(V4F_COUNT, ESI), ECX ) /* source count */ - MOV_B( ARG_FLAG, BL ) /* clip mask flags */ - - TEST_L( ECX, ECX ) - JZ( LLBL(p4m2dm_finish) ) /* count was zero; go to finish */ - - MOV_L( REGOFF(V4F_STRIDE, ESI), EAX ) /* stride */ - OR_L( CONST(VEC_SIZE_4), REGOFF(V4F_FLAGS, EDI) ) /* set dest flags */ - - MOV_L( ECX, REGOFF(V4F_COUNT, EDI) ) /* set dest count */ - MOV_L( CONST(4), REGOFF(V4F_SIZE, EDI) ) /* set dest size */ - - SHL_L( CONST(4), ECX ) /* count *= 16 */ - MOV_L( REGOFF(V4F_START, ESI), ESI ) /* ptr to first source vertex */ - - MOV_L( REGOFF(V4F_START, EDI), EDI ) /* ptr to first dest vertex */ - ADD_L( EDI, ECX ) /* count += dest ptr */ - - MOV_L( EAX, ARG_SOURCE ) /* need eax; put stride in ARG_SOURCE */ - MOV_L( ECX, ARG_DEST ) /* need ecx; put dest+count in ARG_DEST */ - - - ALIGNTEXT4ifNOP -LLBL(p4m2dm_top): - - TEST_B( BL, REGIND(EBP) ) - JNZ( LLBL(p4m2dm_skip) ) - - - FLD_S( S(0) ) /* F4 */ - FMUL_S( M(0) ) - FLD_S( S(0) ) /* F5 F4 */ - FMUL_S( M(1) ) - - FLD_S( S(1) ) /* F0 F5 F4 */ - FMUL_S( M(4) ) - FLD_S( S(1) ) /* F1 F0 F5 F4 */ - FMUL_S( M(5) ) - - FXCH( ST(1) ) /* F0 F1 F5 F4 */ - FADDP( ST(0), ST(3) ) /* F1 F5 F4 */ - FADDP( ST(0), ST(1) ) /* F5 F4 */ - - FLD_S( S(3) ) /* F0 F5 F4 */ - FMUL_S( M(12) ) - FLD_S( S(3) ) /* F1 F0 F5 F4 */ - FMUL_S( M(13) ) - - FXCH( ST(1) ) /* F0 F1 F5 F4 */ - FADDP( ST(0), ST(3) ) /* F1 F5 F4 */ - FADDP( ST(0), ST(1) ) /* F5 F4 */ - - MOV_L( S(2), EAX ) - MOV_L( S(3), ECX ) - - FXCH( ST(1) ) /* F4 F5 */ - FSTP_S( D(0) ) /* F5 */ - FSTP_S( D(1) ) /* */ - MOV_L( EAX, D(2) ) - MOV_L( ECX, D(3) ) - -LLBL(p4m2dm_skip): - INC_L( EBP ) - ADD_L( CONST(16), EDI ) - ADD_L( ARG_SOURCE, ESI ) - CMP_L( ARG_DEST, EDI ) - JNE( LLBL(p4m2dm_top) ) - - -LLBL(p4m2dm_finish): - POP_L( EBP ) - POP_L( EBX ) - POP_L( EDI ) - POP_L( ESI ) - RET -#undef FRAME_OFFSET - -/* -######################################## -## -## gl_x86_transform_points4_2d_no_rot -## -## -*/ - GLOBL GLNAME(gl_x86_transform_points4_2d_no_rot_masked) - ALIGNTEXT4 -GLNAME(gl_x86_transform_points4_2d_no_rot_masked): - -#define FRAME_OFFSET 16 - PUSH_L( ESI ) - PUSH_L( EDI ) - - PUSH_L( EBX ) - PUSH_L( EBP ) - - MOV_L( ARG_SOURCE, ESI ) /* ptr to source GLvector4f */ - MOV_L( ARG_DEST, EDI ) /* ptr to dest GLvector4f */ - - MOV_L( ARG_MATRIX, EDX ) /* ptr to matrix */ - MOV_L( ARG_CLIP, EBP ) /* ptr to clip mask array */ - - MOV_L( REGOFF(V4F_COUNT, ESI), ECX ) /* source count */ - MOV_B( ARG_FLAG, BL ) /* clip mask flags */ - - TEST_L( ECX, ECX ) - JZ( LLBL(p4m2dnrm_finish) ) /* count was zero; go to finish */ - - MOV_L( REGOFF(V4F_STRIDE, ESI), EAX ) /* stride */ - OR_L( CONST(VEC_SIZE_4), REGOFF(V4F_FLAGS, EDI) ) /* set dest flags */ - - MOV_L( ECX, REGOFF(V4F_COUNT, EDI) ) /* set dest count */ - MOV_L( CONST(4), REGOFF(V4F_SIZE, EDI) ) /* set dest size */ - - SHL_L( CONST(4), ECX ) /* count *= 16 */ - MOV_L( REGOFF(V4F_START, ESI), ESI ) /* ptr to first source vertex */ - - MOV_L( REGOFF(V4F_START, EDI), EDI ) /* ptr to first dest vertex */ - ADD_L( EDI, ECX ) /* count += dest ptr */ - - MOV_L( EAX, ARG_SOURCE ) /* need eax; put stride in ARG_SOURCE */ - MOV_L( ECX, ARG_DEST ) /* need ecx; put dest+count in ARG_DEST */ - - - ALIGNTEXT4ifNOP -LLBL(p4m2dnrm_top): - - TEST_B( BL, REGIND(EBP) ) - JNZ( LLBL(p4m2dnrm_skip) ) - - - FLD_S( S(0) ) /* F4 */ - FMUL_S( M(0) ) - - FLD_S( S(1) ) /* F5 F4 */ - FMUL_S( M(5) ) - - FLD_S( S(3) ) /* F0 F5 F4 */ - FMUL_S( M(12) ) - FLD_S( S(3) ) /* F1 F0 F5 F4 */ - FMUL_S( M(13) ) - - FXCH( ST(1) ) /* F0 F1 F5 F4 */ - FADDP( ST(0), ST(3) ) /* F1 F5 F4 */ - FADDP( ST(0), ST(1) ) /* F5 F4 */ - - MOV_L( S(2), EAX ) - MOV_L( S(3), ECX ) - - FXCH( ST(1) ) /* F4 F5 */ - FSTP_S( D(0) ) /* F5 */ - FSTP_S( D(1) ) /* */ - MOV_L( EAX, D(2) ) - MOV_L( ECX, D(3) ) - -LLBL(p4m2dnrm_skip): - INC_L( EBP ) - ADD_L( CONST(16), EDI ) - ADD_L( ARG_SOURCE, ESI ) - CMP_L( ARG_DEST, EDI ) - JNE( LLBL(p4m2dnrm_top) ) - - -LLBL(p4m2dnrm_finish): - POP_L( EBP ) - POP_L( EBX ) - POP_L( EDI ) - POP_L( ESI ) - RET -#undef FRAME_OFFSET - -/* -######################################## -## -## gl_x86_transform_points4_3d -## -## -*/ - GLOBL GLNAME(gl_x86_transform_points4_3d_masked) - ALIGNTEXT4 -GLNAME(gl_x86_transform_points4_3d_masked): - -#define FRAME_OFFSET 16 - PUSH_L( ESI ) - PUSH_L( EDI ) - - PUSH_L( EBX ) - PUSH_L( EBP ) - - MOV_L( ARG_SOURCE, ESI ) /* ptr to source GLvector4f */ - MOV_L( ARG_DEST, EDI ) /* ptr to dest GLvector4f */ - - MOV_L( ARG_MATRIX, EDX ) /* ptr to matrix */ - MOV_L( ARG_CLIP, EBP ) /* ptr to clip mask array */ - - MOV_L( REGOFF(V4F_COUNT, ESI), ECX ) /* source count */ - MOV_B( ARG_FLAG, BL ) /* clip mask flags */ - - TEST_L( ECX, ECX ) - JZ( LLBL(p4m3dm_finish) ) /* count was zero; go to finish */ - - MOV_L( REGOFF(V4F_STRIDE, ESI), EAX ) /* stride */ - OR_L( CONST(VEC_SIZE_4), REGOFF(V4F_FLAGS, EDI) ) /* set dest flags */ - - MOV_L( ECX, REGOFF(V4F_COUNT, EDI) ) /* set dest count */ - MOV_L( CONST(4), REGOFF(V4F_SIZE, EDI) ) /* set dest size */ - - SHL_L( CONST(4), ECX ) /* count *= 16 */ - MOV_L( REGOFF(V4F_START, ESI), ESI ) /* ptr to first source vertex */ - - MOV_L( REGOFF(V4F_START, EDI), EDI ) /* ptr to first dest vertex */ - ADD_L( EDI, ECX ) /* count += dest ptr */ - - MOV_L( EAX, ARG_SOURCE ) /* need eax; put stride in ARG_SOURCE */ - - - ALIGNTEXT4ifNOP -LLBL(p4m3dm_top): - - TEST_B( BL, REGIND(EBP) ) - JNZ( LLBL(p4m3dm_skip) ) - - - FLD_S( S(0) ) /* F4 */ - FMUL_S( M(0) ) - FLD_S( S(0) ) /* F5 F4 */ - FMUL_S( M(1) ) - FLD_S( S(0) ) /* F6 F5 F4 */ - FMUL_S( M(2) ) - - FLD_S( S(1) ) /* F0 F6 F5 F4 */ - FMUL_S( M(4) ) - FLD_S( S(1) ) /* F1 F0 F6 F5 F4 */ - FMUL_S( M(5) ) - FLD_S( S(1) ) /* F2 F1 F0 F6 F5 F4 */ - FMUL_S( M(6) ) - - FXCH( ST(2) ) /* F0 F1 F2 F6 F5 F4 */ - FADDP( ST(0), ST(5) ) /* F1 F2 F6 F5 F4 */ - FADDP( ST(0), ST(3) ) /* F2 F6 F5 F4 */ - FADDP( ST(0), ST(1) ) /* F6 F5 F4 */ - - FLD_S( S(2) ) /* F0 F6 F5 F4 */ - FMUL_S( M(8) ) - FLD_S( S(2) ) /* F1 F0 F6 F5 F4 */ - FMUL_S( M(9) ) - FLD_S( S(2) ) /* F2 F1 F0 F6 F5 F4 */ - FMUL_S( M(10) ) - - FXCH( ST(2) ) /* F0 F1 F2 F6 F5 F4 */ - FADDP( ST(0), ST(5) ) /* F1 F2 F6 F5 F4 */ - FADDP( ST(0), ST(3) ) /* F2 F6 F5 F4 */ - FADDP( ST(0), ST(1) ) /* F6 F5 F4 */ - - FLD_S( S(3) ) /* F0 F6 F5 F4 */ - FMUL_S( M(12) ) - FLD_S( S(3) ) /* F1 F0 F6 F5 F4 */ - FMUL_S( M(13) ) - FLD_S( S(3) ) /* F2 F1 F0 F6 F5 F4 */ - FMUL_S( M(14) ) - - FXCH( ST(2) ) /* F0 F1 F2 F6 F5 F4 */ - FADDP( ST(0), ST(5) ) /* F1 F2 F6 F5 F4 */ - FADDP( ST(0), ST(3) ) /* F2 F6 F5 F4 */ - FADDP( ST(0), ST(1) ) /* F6 F5 F4 */ - - MOV_L( S(3), EAX ) - - FXCH( ST(2) ) /* F4 F5 F6 */ - FSTP_S( D(0) ) /* F5 F6 */ - FSTP_S( D(1) ) /* F6 */ - FSTP_S( D(2) ) /* */ - MOV_L( EAX, D(3) ) - -LLBL(p4m3dm_skip): - INC_L( EBP ) - ADD_L( CONST(16), EDI ) - ADD_L( ARG_SOURCE, ESI ) - CMP_L( ECX, EDI ) - JNE( LLBL(p4m3dm_top) ) - - -LLBL(p4m3dm_finish): - POP_L( EBP ) - POP_L( EBX ) - POP_L( EDI ) - POP_L( ESI ) - RET -#undef FRAME_OFFSET - -/* -######################################## -## -## gl_x86_transform_points4_3d_no_rot -## -## -*/ - GLOBL GLNAME(gl_x86_transform_points4_3d_no_rot_masked) - ALIGNTEXT4 -GLNAME(gl_x86_transform_points4_3d_no_rot_masked): - -#define FRAME_OFFSET 16 - PUSH_L( ESI ) - PUSH_L( EDI ) - - PUSH_L( EBX ) - PUSH_L( EBP ) - - MOV_L( ARG_SOURCE, ESI ) /* ptr to source GLvector4f */ - MOV_L( ARG_DEST, EDI ) /* ptr to dest GLvector4f */ - - MOV_L( ARG_MATRIX, EDX ) /* ptr to matrix */ - MOV_L( ARG_CLIP, EBP ) /* ptr to clip mask array */ - - MOV_L( REGOFF(V4F_COUNT, ESI), ECX ) /* source count */ - MOV_B( ARG_FLAG, BL ) /* clip mask flags */ - - TEST_L( ECX, ECX ) - JZ( LLBL(p4m3dnrm_finish) ) /* count was zero; go to finish */ - - MOV_L( REGOFF(V4F_STRIDE, ESI), EAX ) /* stride */ - OR_L( CONST(VEC_SIZE_4), REGOFF(V4F_FLAGS, EDI) ) /* set dest flags */ - - MOV_L( ECX, REGOFF(V4F_COUNT, EDI) ) /* set dest count */ - MOV_L( CONST(4), REGOFF(V4F_SIZE, EDI) ) /* set dest size */ - - SHL_L( CONST(4), ECX ) /* count *= 16 */ - MOV_L( REGOFF(V4F_START, ESI), ESI ) /* ptr to first source vertex */ - - MOV_L( REGOFF(V4F_START, EDI), EDI ) /* ptr to first dest vertex */ - ADD_L( EDI, ECX ) /* count += dest ptr */ - - MOV_L( EAX, ARG_SOURCE ) /* need eax; put stride in ARG_SOURCE */ - - - ALIGNTEXT4ifNOP -LLBL(p4m3dnrm_top): - - TEST_B( BL, REGIND(EBP) ) - JNZ( LLBL(p4m3dnrm_skip) ) - - - FLD_S( S(0) ) /* F4 */ - FMUL_S( M(0) ) - - FLD_S( S(1) ) /* F5 F4 */ - FMUL_S( M(5) ) - - FLD_S( S(2) ) /* F6 F5 F4 */ - FMUL_S( M(10) ) - - FLD_S( S(3) ) /* F0 F6 F5 F4 */ - FMUL_S( M(12) ) - FLD_S( S(3) ) /* F1 F0 F6 F5 F4 */ - FMUL_S( M(13) ) - FLD_S( S(3) ) /* F2 F1 F0 F6 F5 F4 */ - FMUL_S( M(14) ) - - FXCH( ST(2) ) /* F0 F1 F2 F6 F5 F4 */ - FADDP( ST(0), ST(5) ) /* F1 F2 F6 F5 F4 */ - FADDP( ST(0), ST(3) ) /* F2 F6 F5 F4 */ - FADDP( ST(0), ST(1) ) /* F6 F5 F4 */ - - MOV_L( S(3), EAX ) - - FXCH( ST(2) ) /* F4 F5 F6 */ - FSTP_S( D(0) ) /* F5 F6 */ - FSTP_S( D(1) ) /* F6 */ - FSTP_S( D(2) ) /* */ - MOV_L( EAX, D(3) ) - -LLBL(p4m3dnrm_skip): - INC_L( EBP ) - ADD_L( CONST(16), EDI ) - ADD_L( ARG_SOURCE, ESI ) - CMP_L( ECX, EDI ) - JNE( LLBL(p4m3dnrm_top) ) - - -LLBL(p4m3dnrm_finish): - POP_L( EBP ) - POP_L( EBX ) - POP_L( EDI ) - POP_L( ESI ) - RET -#undef FRAME_OFFSET - -/* -######################################## -## -## gl_x86_transform_points4_perspective -## -## -*/ - GLOBL GLNAME(gl_x86_transform_points4_perspective_masked) - ALIGNTEXT4 -GLNAME(gl_x86_transform_points4_perspective_masked): - -#define FRAME_OFFSET 16 - PUSH_L( ESI ) - PUSH_L( EDI ) - - PUSH_L( EBX ) - PUSH_L( EBP ) - - MOV_L( ARG_SOURCE, ESI ) /* ptr to source GLvector4f */ - MOV_L( ARG_DEST, EDI ) /* ptr to dest GLvector4f */ - - MOV_L( ARG_MATRIX, EDX ) /* ptr to matrix */ - MOV_L( ARG_CLIP, EBP ) /* ptr to clip mask array */ - - MOV_L( REGOFF(V4F_COUNT, ESI), ECX ) /* source count */ - MOV_B( ARG_FLAG, BL ) /* clip mask flags */ - - TEST_L( ECX, ECX ) - JZ( LLBL(p4mpm_finish) ) /* count was zero; go to finish */ - - MOV_L( REGOFF(V4F_STRIDE, ESI), EAX ) /* stride */ - OR_L( CONST(VEC_SIZE_4), REGOFF(V4F_FLAGS, EDI) ) /* set dest flags */ - - MOV_L( ECX, REGOFF(V4F_COUNT, EDI) ) /* set dest count */ - MOV_L( CONST(4), REGOFF(V4F_SIZE, EDI) ) /* set dest size */ - - SHL_L( CONST(4), ECX ) /* count *= 16 */ - MOV_L( REGOFF(V4F_START, ESI), ESI ) /* ptr to first source vertex */ - - MOV_L( REGOFF(V4F_START, EDI), EDI ) /* ptr to first dest vertex */ - ADD_L( EDI, ECX ) /* count += dest ptr */ - - MOV_L( EAX, ARG_SOURCE ) /* need eax; put stride in ARG_SOURCE */ - - - ALIGNTEXT4ifNOP -LLBL(p4mpm_top): - - TEST_B( BL, REGIND(EBP) ) - JNZ( LLBL(p4mpm_skip) ) - - - FLD_S( S(0) ) /* F4 */ - FMUL_S( M(0) ) - - FLD_S( S(1) ) /* F5 F4 */ - FMUL_S( M(5) ) - - FLD_S( S(2) ) /* F0 F5 F4 */ - FMUL_S( M(8) ) - FLD_S( S(2) ) /* F1 F0 F5 F4 */ - FMUL_S( M(9) ) - FLD_S( S(2) ) /* F6 F1 F0 F5 F4 */ - FMUL_S( M(10) ) - - FXCH( ST(2) ) /* F0 F1 F6 F5 F4 */ - FADDP( ST(0), ST(4) ) /* F1 F6 F5 F4 */ - FADDP( ST(0), ST(2) ) /* F6 F5 F4 */ - - FLD_S( S(3) ) /* F2 F6 F5 F4 */ - FMUL_S( M(14) ) - - FADDP( ST(0), ST(1) ) /* F6 F5 F4 */ - - MOV_L( S(2), EAX ) - XOR_L( CONST(-2147483648), EAX ) /* change sign */ - - FXCH( ST(2) ) /* F4 F5 F6 */ - FSTP_S( D(0) ) /* F5 F6 */ - FSTP_S( D(1) ) /* F6 */ - FSTP_S( D(2) ) /* */ - MOV_L( EAX, D(3) ) - -LLBL(p4mpm_skip): - INC_L( EBP ) - ADD_L( CONST(16), EDI ) - ADD_L( ARG_SOURCE, ESI ) - CMP_L( ECX, EDI ) - JNE( LLBL(p4mpm_top) ) - - -LLBL(p4mpm_finish): - POP_L( EBP ) - POP_L( EBX ) - POP_L( EDI ) - POP_L( ESI ) - RET -#undef FRAME_OFFSET - - - -/* -######################################## -## -## Unmasked versions -## -######################################## -*/ - -/* -######################################## -## -## gl_x86_transform_points2_general -## -## -*/ - GLOBL GLNAME(gl_x86_transform_points2_general_raw) - ALIGNTEXT4 -GLNAME(gl_x86_transform_points2_general_raw): - -#define FRAME_OFFSET 8 - PUSH_L( ESI ) - PUSH_L( EDI ) - - MOV_L( REGOFF(OFFSET_SOURCE+8, ESP), ESI ) /* ptr to source GLvector4f */ - MOV_L( REGOFF(OFFSET_DEST+8, ESP), EDI ) /* ptr to dest GLvector4f */ - - - MOV_L( ARG_MATRIX, EDX ) /* ptr to matrix */ - MOV_L( REGOFF(V4F_COUNT, ESI), ECX ) /* source count */ - - TEST_L( ECX, ECX) - JZ( LLBL(p2mgr_finish) ) /* count was zero; go to finish */ - - MOV_L( REGOFF(V4F_STRIDE, ESI), EAX ) /* stride */ - OR_L( CONST(VEC_SIZE_4), REGOFF(V4F_FLAGS, EDI) ) /* set dest flags */ - - MOV_L( ECX, REGOFF(V4F_COUNT, EDI) ) /* set dest count */ - MOV_L( CONST(4), REGOFF(V4F_SIZE, EDI) ) /* set dest size */ - - SHL_L( CONST(4), ECX ) /* count *= 16 */ - MOV_L( REGOFF(V4F_START, ESI), ESI ) /* ptr to first source vertex */ - - MOV_L( REGOFF(V4F_START, EDI), EDI ) /* ptr to first dest vertex */ - ADD_L( EDI, ECX ) /* count += dest ptr */ - - - ALIGNTEXT4ifNOP -LLBL(p2mgr_top): - - - FLD_S( S(0) ) /* F4 */ - FMUL_S( M(0) ) - FLD_S( S(0) ) /* F5 F4 */ - FMUL_S( M(1) ) - FLD_S( S(0) ) /* F6 F5 F4 */ - FMUL_S( M(2) ) - FLD_S( S(0) ) /* F7 F6 F5 F4 */ - FMUL_S( M(3) ) - - FLD_S( S(1) ) /* F0 F7 F6 F5 F4 */ - FMUL_S( M(4) ) - FLD_S( S(1) ) /* F1 F0 F7 F6 F5 F4 */ - FMUL_S( M(5) ) - FLD_S( S(1) ) /* F2 F1 F0 F7 F6 F5 F4 */ - FMUL_S( M(6) ) - FLD_S( S(1) ) /* F3 F2 F1 F0 F7 F6 F5 F4 */ - FMUL_S( M(7) ) - - FXCH( ST(3) ) /* F0 F2 F1 F3 F7 F6 F5 F4 */ - FADDP( ST(0), ST(7) ) /* F2 F1 F3 F7 F6 F5 F4 */ - FXCH( ST(1) ) /* F1 F2 F3 F7 F6 F5 F4 */ - FADDP( ST(0), ST(5) ) /* F2 F3 F7 F6 F5 F4 */ - FADDP( ST(0), ST(3) ) /* F3 F7 F6 F5 F4 */ - FADDP( ST(0), ST(1) ) /* F7 F6 F5 F4 */ - - FXCH( ST(3) ) /* F4 F6 F5 F7 */ - FADD_S( M(12) ) - FXCH( ST(2) ) /* F5 F6 F4 F7 */ - FADD_S( M(13) ) - FXCH( ST(1) ) /* F6 F5 F4 F7 */ - FADD_S( M(14) ) - FXCH( ST(3) ) /* F7 F5 F4 F6 */ - FADD_S( M(15) ) - - FXCH( ST(2) ) /* F4 F5 F7 F6 */ - FSTP_S( D(0) ) /* F5 F7 F6 */ - FSTP_S( D(1) ) /* F7 F6 */ - FXCH( ST(1) ) /* F6 F7 */ - FSTP_S( D(2) ) /* F7 */ - FSTP_S( D(3) ) /* */ - -LLBL(p2mgr_skip): - ADD_L( CONST(16), EDI ) - ADD_L( EAX, ESI ) - CMP_L( ECX, EDI ) - JNE( LLBL(p2mgr_top) ) - - -LLBL(p2mgr_finish): - POP_L( EDI ) - POP_L( ESI ) - RET -#undef FRAME_OFFSET - -/* -######################################## -## -## gl_x86_transform_points2_identity -## -## -*/ - GLOBL GLNAME(gl_x86_transform_points2_identity_raw) - ALIGNTEXT4 -GLNAME(gl_x86_transform_points2_identity_raw): - -#define FRAME_OFFSET 12 - PUSH_L( ESI ) - PUSH_L( EDI ) - - MOV_L( REGOFF(OFFSET_SOURCE+8, ESP), ESI ) /* ptr to source GLvector4f */ - MOV_L( REGOFF(OFFSET_DEST+8, ESP), EDI ) /* ptr to dest GLvector4f */ - - PUSH_L( EBX ) - - MOV_L( ARG_MATRIX, EDX ) /* ptr to matrix */ - MOV_L( REGOFF(V4F_COUNT, ESI), ECX ) /* source count */ - - TEST_L( ECX, ECX) - JZ( LLBL(p2mir_finish) ) /* count was zero; go to finish */ - - MOV_L( REGOFF(V4F_STRIDE, ESI), EAX ) /* stride */ - OR_L( CONST(VEC_SIZE_2), REGOFF(V4F_FLAGS, EDI) ) /* set dest flags */ - - MOV_L( ECX, REGOFF(V4F_COUNT, EDI) ) /* set dest count */ - MOV_L( CONST(2), REGOFF(V4F_SIZE, EDI) ) /* set dest size */ - - SHL_L( CONST(4), ECX ) /* count *= 16 */ - MOV_L( REGOFF(V4F_START, ESI), ESI ) /* ptr to first source vertex */ - - MOV_L( REGOFF(V4F_START, EDI), EDI ) /* ptr to first dest vertex */ - ADD_L( EDI, ECX ) /* count += dest ptr */ - - - CMP_L( ESI, EDI ) - JE( LLBL(p2mir_finish) ) - - ALIGNTEXT4ifNOP -LLBL(p2mir_top): - - MOV_L( S(0), EBX ) - MOV_L( S(1), EDX ) - - MOV_L( EBX, D(0) ) - MOV_L( EDX, D(1) ) -LLBL(p2mir_skip): - ADD_L( CONST(16), EDI ) - ADD_L( EAX, ESI ) - CMP_L( ECX, EDI ) - JNE( LLBL(p2mir_top) ) - - -LLBL(p2mir_finish): - POP_L( EBX ) - POP_L( EDI ) - POP_L( ESI ) - RET -#undef FRAME_OFFSET - -/* -######################################## -## -## gl_x86_transform_points2_2d -## -## -*/ - GLOBL GLNAME(gl_x86_transform_points2_2d_raw) - ALIGNTEXT4 -GLNAME(gl_x86_transform_points2_2d_raw): - -#define FRAME_OFFSET 8 - PUSH_L( ESI ) - PUSH_L( EDI ) - - MOV_L( REGOFF(OFFSET_SOURCE+8, ESP), ESI ) /* ptr to source GLvector4f */ - MOV_L( REGOFF(OFFSET_DEST+8, ESP), EDI ) /* ptr to dest GLvector4f */ - - - MOV_L( ARG_MATRIX, EDX ) /* ptr to matrix */ - MOV_L( REGOFF(V4F_COUNT, ESI), ECX ) /* source count */ - - TEST_L( ECX, ECX) - JZ( LLBL(p2m2dr_finish) ) /* count was zero; go to finish */ - - MOV_L( REGOFF(V4F_STRIDE, ESI), EAX ) /* stride */ - OR_L( CONST(VEC_SIZE_2), REGOFF(V4F_FLAGS, EDI) ) /* set dest flags */ - - MOV_L( ECX, REGOFF(V4F_COUNT, EDI) ) /* set dest count */ - MOV_L( CONST(2), REGOFF(V4F_SIZE, EDI) ) /* set dest size */ - - SHL_L( CONST(4), ECX ) /* count *= 16 */ - MOV_L( REGOFF(V4F_START, ESI), ESI ) /* ptr to first source vertex */ - - MOV_L( REGOFF(V4F_START, EDI), EDI ) /* ptr to first dest vertex */ - ADD_L( EDI, ECX ) /* count += dest ptr */ - - - ALIGNTEXT4ifNOP -LLBL(p2m2dr_top): - - - FLD_S( S(0) ) /* F4 */ - FMUL_S( M(0) ) - FLD_S( S(0) ) /* F5 F4 */ - FMUL_S( M(1) ) - - FLD_S( S(1) ) /* F0 F5 F4 */ - FMUL_S( M(4) ) - FLD_S( S(1) ) /* F1 F0 F5 F4 */ - FMUL_S( M(5) ) - - FXCH( ST(1) ) /* F0 F1 F5 F4 */ - FADDP( ST(0), ST(3) ) /* F1 F5 F4 */ - FADDP( ST(0), ST(1) ) /* F5 F4 */ - - FXCH( ST(1) ) /* F4 F5 */ - FADD_S( M(12) ) - FXCH( ST(1) ) /* F5 F4 */ - FADD_S( M(13) ) - - FXCH( ST(1) ) /* F4 F5 */ - FSTP_S( D(0) ) /* F5 */ - FSTP_S( D(1) ) /* */ - -LLBL(p2m2dr_skip): - ADD_L( CONST(16), EDI ) - ADD_L( EAX, ESI ) - CMP_L( ECX, EDI ) - JNE( LLBL(p2m2dr_top) ) - - -LLBL(p2m2dr_finish): - POP_L( EDI ) - POP_L( ESI ) - RET -#undef FRAME_OFFSET - -/* -######################################## -## -## gl_x86_transform_points2_2d_no_rot -## -## -*/ - GLOBL GLNAME(gl_x86_transform_points2_2d_no_rot_raw) - ALIGNTEXT4 -GLNAME(gl_x86_transform_points2_2d_no_rot_raw): - -#define FRAME_OFFSET 8 - PUSH_L( ESI ) - PUSH_L( EDI ) - - MOV_L( REGOFF(OFFSET_SOURCE+8, ESP), ESI ) /* ptr to source GLvector4f */ - MOV_L( REGOFF(OFFSET_DEST+8, ESP), EDI ) /* ptr to dest GLvector4f */ - - - MOV_L( ARG_MATRIX, EDX ) /* ptr to matrix */ - MOV_L( REGOFF(V4F_COUNT, ESI), ECX ) /* source count */ - - TEST_L( ECX, ECX) - JZ( LLBL(p2m2dnrr_finish) ) /* count was zero; go to finish */ - - MOV_L( REGOFF(V4F_STRIDE, ESI), EAX ) /* stride */ - OR_L( CONST(VEC_SIZE_2), REGOFF(V4F_FLAGS, EDI) ) /* set dest flags */ - - MOV_L( ECX, REGOFF(V4F_COUNT, EDI) ) /* set dest count */ - MOV_L( CONST(2), REGOFF(V4F_SIZE, EDI) ) /* set dest size */ - - SHL_L( CONST(4), ECX ) /* count *= 16 */ - MOV_L( REGOFF(V4F_START, ESI), ESI ) /* ptr to first source vertex */ - - MOV_L( REGOFF(V4F_START, EDI), EDI ) /* ptr to first dest vertex */ - ADD_L( EDI, ECX ) /* count += dest ptr */ - - - ALIGNTEXT4ifNOP -LLBL(p2m2dnrr_top): - - - FLD_S( S(0) ) /* F4 */ - FMUL_S( M(0) ) - - FLD_S( S(1) ) /* F1 F4 */ - FMUL_S( M(5) ) - - FXCH( ST(1) ) /* F4 F1 */ - FADD_S( M(12) ) - FLD_S( M(13) ) /* F5 F4 F1 */ - FXCH( ST(2) ) /* F1 F4 F5 */ - FADDP( ST(0), ST(2) ) /* F4 F5 */ - - FSTP_S( D(0) ) /* F5 */ - FSTP_S( D(1) ) /* */ - -LLBL(p2m2dnrr_skip): - ADD_L( CONST(16), EDI ) - ADD_L( EAX, ESI ) - CMP_L( ECX, EDI ) - JNE( LLBL(p2m2dnrr_top) ) - - -LLBL(p2m2dnrr_finish): - POP_L( EDI ) - POP_L( ESI ) - RET -#undef FRAME_OFFSET - -/* -######################################## -## -## gl_x86_transform_points2_3d -## -## -*/ - GLOBL GLNAME(gl_x86_transform_points2_3d_raw) - ALIGNTEXT4 -GLNAME(gl_x86_transform_points2_3d_raw): - -#define FRAME_OFFSET 8 - PUSH_L( ESI ) - PUSH_L( EDI ) - - MOV_L( REGOFF(OFFSET_SOURCE+8, ESP), ESI ) /* ptr to source GLvector4f */ - MOV_L( REGOFF(OFFSET_DEST+8, ESP), EDI ) /* ptr to dest GLvector4f */ - - - MOV_L( ARG_MATRIX, EDX ) /* ptr to matrix */ - MOV_L( REGOFF(V4F_COUNT, ESI), ECX ) /* source count */ - - TEST_L( ECX, ECX) - JZ( LLBL(p2m3dr_finish) ) /* count was zero; go to finish */ - - MOV_L( REGOFF(V4F_STRIDE, ESI), EAX ) /* stride */ - OR_L( CONST(VEC_SIZE_3), REGOFF(V4F_FLAGS, EDI) ) /* set dest flags */ - - MOV_L( ECX, REGOFF(V4F_COUNT, EDI) ) /* set dest count */ - MOV_L( CONST(3), REGOFF(V4F_SIZE, EDI) ) /* set dest size */ - - SHL_L( CONST(4), ECX ) /* count *= 16 */ - MOV_L( REGOFF(V4F_START, ESI), ESI ) /* ptr to first source vertex */ - - MOV_L( REGOFF(V4F_START, EDI), EDI ) /* ptr to first dest vertex */ - ADD_L( EDI, ECX ) /* count += dest ptr */ - - - ALIGNTEXT4ifNOP -LLBL(p2m3dr_top): - - - FLD_S( S(0) ) /* F4 */ - FMUL_S( M(0) ) - FLD_S( S(0) ) /* F5 F4 */ - FMUL_S( M(1) ) - FLD_S( S(0) ) /* F6 F5 F4 */ - FMUL_S( M(2) ) - - FLD_S( S(1) ) /* F0 F6 F5 F4 */ - FMUL_S( M(4) ) - FLD_S( S(1) ) /* F1 F0 F6 F5 F4 */ - FMUL_S( M(5) ) - FLD_S( S(1) ) /* F2 F1 F0 F6 F5 F4 */ - FMUL_S( M(6) ) - - FXCH( ST(2) ) /* F0 F1 F2 F6 F5 F4 */ - FADDP( ST(0), ST(5) ) /* F1 F2 F6 F5 F4 */ - FADDP( ST(0), ST(3) ) /* F2 F6 F5 F4 */ - FADDP( ST(0), ST(1) ) /* F6 F5 F4 */ - - FXCH( ST(2) ) /* F4 F5 F6 */ - FADD_S( M(12) ) - FXCH( ST(1) ) /* F5 F4 F6 */ - FADD_S( M(13) ) - FXCH( ST(2) ) /* F6 F4 F5 */ - FADD_S( M(14) ) - - FXCH( ST(1) ) /* F4 F6 F5 */ - FSTP_S( D(0) ) /* F6 F5 */ - FXCH( ST(1) ) /* F5 F6 */ - FSTP_S( D(1) ) /* F6 */ - FSTP_S( D(2) ) /* */ - -LLBL(p2m3dr_skip): - ADD_L( CONST(16), EDI ) - ADD_L( EAX, ESI ) - CMP_L( ECX, EDI ) - JNE( LLBL(p2m3dr_top) ) - - -LLBL(p2m3dr_finish): - POP_L( EDI ) - POP_L( ESI ) - RET -#undef FRAME_OFFSET - -/* -######################################## -## -## gl_x86_transform_points2_3d_no_rot -## -## -*/ - GLOBL GLNAME(gl_x86_transform_points2_3d_no_rot_raw) - ALIGNTEXT4 -GLNAME(gl_x86_transform_points2_3d_no_rot_raw): - -#define FRAME_OFFSET 12 - PUSH_L( ESI ) - PUSH_L( EDI ) - - MOV_L( REGOFF(OFFSET_SOURCE+8, ESP), ESI ) /* ptr to source GLvector4f */ - MOV_L( REGOFF(OFFSET_DEST+8, ESP), EDI ) /* ptr to dest GLvector4f */ - - PUSH_L( EBX ) - - MOV_L( ARG_MATRIX, EDX ) /* ptr to matrix */ - MOV_L( REGOFF(V4F_COUNT, ESI), ECX ) /* source count */ - - TEST_L( ECX, ECX) - JZ( LLBL(p2m3dnrr_finish) ) /* count was zero; go to finish */ - - MOV_L( REGOFF(V4F_STRIDE, ESI), EAX ) /* stride */ - OR_L( CONST(VEC_SIZE_3), REGOFF(V4F_FLAGS, EDI) ) /* set dest flags */ - - MOV_L( ECX, REGOFF(V4F_COUNT, EDI) ) /* set dest count */ - MOV_L( CONST(3), REGOFF(V4F_SIZE, EDI) ) /* set dest size */ - - SHL_L( CONST(4), ECX ) /* count *= 16 */ - MOV_L( REGOFF(V4F_START, ESI), ESI ) /* ptr to first source vertex */ - - MOV_L( REGOFF(V4F_START, EDI), EDI ) /* ptr to first dest vertex */ - ADD_L( EDI, ECX ) /* count += dest ptr */ - - - MOV_L( M(14), EBX ) - ALIGNTEXT4ifNOP -LLBL(p2m3dnrr_top): - - - FLD_S( S(0) ) /* F4 */ - FMUL_S( M(0) ) - - FLD_S( S(1) ) /* F1 F4 */ - FMUL_S( M(5) ) - - FXCH( ST(1) ) /* F4 F1 */ - FADD_S( M(12) ) - FLD_S( M(13) ) /* F5 F4 F1 */ - FXCH( ST(2) ) /* F1 F4 F5 */ - FADDP( ST(0), ST(2) ) /* F4 F5 */ - - FSTP_S( D(0) ) /* F5 */ - FSTP_S( D(1) ) /* */ - MOV_L( EBX, D(2) ) - -LLBL(p2m3dnrr_skip): - ADD_L( CONST(16), EDI ) - ADD_L( EAX, ESI ) - CMP_L( ECX, EDI ) - JNE( LLBL(p2m3dnrr_top) ) - - -LLBL(p2m3dnrr_finish): - POP_L( EBX ) - POP_L( EDI ) - POP_L( ESI ) - RET -#undef FRAME_OFFSET - -/* -######################################## -## -## gl_x86_transform_points2_perspective -## -## -*/ - GLOBL GLNAME(gl_x86_transform_points2_perspective_raw) - ALIGNTEXT4 -GLNAME(gl_x86_transform_points2_perspective_raw): - -#define FRAME_OFFSET 12 - PUSH_L( ESI ) - PUSH_L( EDI ) - - MOV_L( REGOFF(OFFSET_SOURCE+8, ESP), ESI ) /* ptr to source GLvector4f */ - MOV_L( REGOFF(OFFSET_DEST+8, ESP), EDI ) /* ptr to dest GLvector4f */ - - PUSH_L( EBX ) - - MOV_L( ARG_MATRIX, EDX ) /* ptr to matrix */ - MOV_L( REGOFF(V4F_COUNT, ESI), ECX ) /* source count */ - - TEST_L( ECX, ECX) - JZ( LLBL(p2mpr_finish) ) /* count was zero; go to finish */ - - MOV_L( REGOFF(V4F_STRIDE, ESI), EAX ) /* stride */ - OR_L( CONST(VEC_SIZE_4), REGOFF(V4F_FLAGS, EDI) ) /* set dest flags */ - - MOV_L( ECX, REGOFF(V4F_COUNT, EDI) ) /* set dest count */ - MOV_L( CONST(4), REGOFF(V4F_SIZE, EDI) ) /* set dest size */ - - SHL_L( CONST(4), ECX ) /* count *= 16 */ - MOV_L( REGOFF(V4F_START, ESI), ESI ) /* ptr to first source vertex */ - - MOV_L( REGOFF(V4F_START, EDI), EDI ) /* ptr to first dest vertex */ - ADD_L( EDI, ECX ) /* count += dest ptr */ - - - MOV_L( M(14), EBX ) - ALIGNTEXT4ifNOP -LLBL(p2mpr_top): - - - FLD_S( S(0) ) /* F4 */ - FMUL_S( M(0) ) - - FLD_S( S(1) ) /* F1 F4 */ - FMUL_S( M(5) ) - - FXCH( ST(1) ) /* F4 F1 */ - FSTP_S( D(0) ) /* F1 */ - FSTP_S( D(1) ) /* */ - MOV_L( EBX, D(2) ) - MOV_L( CONST(FP_ZERO), D(3) ) - -LLBL(p2mpr_skip): - ADD_L( CONST(16), EDI ) - ADD_L( EAX, ESI ) - CMP_L( ECX, EDI ) - JNE( LLBL(p2mpr_top) ) - - -LLBL(p2mpr_finish): - POP_L( EBX ) - POP_L( EDI ) - POP_L( ESI ) - RET -#undef FRAME_OFFSET - -/* -######################################## -## -## gl_x86_transform_points3_general -## -## -*/ - GLOBL GLNAME(gl_x86_transform_points3_general_raw) - ALIGNTEXT4 -GLNAME(gl_x86_transform_points3_general_raw): - -#define FRAME_OFFSET 8 - PUSH_L( ESI ) - PUSH_L( EDI ) - - MOV_L( REGOFF(OFFSET_SOURCE+8, ESP), ESI ) /* ptr to source GLvector4f */ - MOV_L( REGOFF(OFFSET_DEST+8, ESP), EDI ) /* ptr to dest GLvector4f */ - - - MOV_L( ARG_MATRIX, EDX ) /* ptr to matrix */ - MOV_L( REGOFF(V4F_COUNT, ESI), ECX ) /* source count */ - - TEST_L( ECX, ECX) - JZ( LLBL(p3mgr_finish) ) /* count was zero; go to finish */ - - MOV_L( REGOFF(V4F_STRIDE, ESI), EAX ) /* stride */ - OR_L( CONST(VEC_SIZE_4), REGOFF(V4F_FLAGS, EDI) ) /* set dest flags */ - - MOV_L( ECX, REGOFF(V4F_COUNT, EDI) ) /* set dest count */ - MOV_L( CONST(4), REGOFF(V4F_SIZE, EDI) ) /* set dest size */ - - SHL_L( CONST(4), ECX ) /* count *= 16 */ - MOV_L( REGOFF(V4F_START, ESI), ESI ) /* ptr to first source vertex */ - - MOV_L( REGOFF(V4F_START, EDI), EDI ) /* ptr to first dest vertex */ - ADD_L( EDI, ECX ) /* count += dest ptr */ - - - ALIGNTEXT4ifNOP -LLBL(p3mgr_top): - - - FLD_S( S(0) ) /* F4 */ - FMUL_S( M(0) ) - FLD_S( S(0) ) /* F5 F4 */ - FMUL_S( M(1) ) - FLD_S( S(0) ) /* F6 F5 F4 */ - FMUL_S( M(2) ) - FLD_S( S(0) ) /* F7 F6 F5 F4 */ - FMUL_S( M(3) ) - - FLD_S( S(1) ) /* F0 F7 F6 F5 F4 */ - FMUL_S( M(4) ) - FLD_S( S(1) ) /* F1 F0 F7 F6 F5 F4 */ - FMUL_S( M(5) ) - FLD_S( S(1) ) /* F2 F1 F0 F7 F6 F5 F4 */ - FMUL_S( M(6) ) - FLD_S( S(1) ) /* F3 F2 F1 F0 F7 F6 F5 F4 */ - FMUL_S( M(7) ) - - FXCH( ST(3) ) /* F0 F2 F1 F3 F7 F6 F5 F4 */ - FADDP( ST(0), ST(7) ) /* F2 F1 F3 F7 F6 F5 F4 */ - FXCH( ST(1) ) /* F1 F2 F3 F7 F6 F5 F4 */ - FADDP( ST(0), ST(5) ) /* F2 F3 F7 F6 F5 F4 */ - FADDP( ST(0), ST(3) ) /* F3 F7 F6 F5 F4 */ - FADDP( ST(0), ST(1) ) /* F7 F6 F5 F4 */ - - FLD_S( S(2) ) /* F0 F7 F6 F5 F4 */ - FMUL_S( M(8) ) - FLD_S( S(2) ) /* F1 F0 F7 F6 F5 F4 */ - FMUL_S( M(9) ) - FLD_S( S(2) ) /* F2 F1 F0 F7 F6 F5 F4 */ - FMUL_S( M(10) ) - FLD_S( S(2) ) /* F3 F2 F1 F0 F7 F6 F5 F4 */ - FMUL_S( M(11) ) - - FXCH( ST(3) ) /* F0 F2 F1 F3 F7 F6 F5 F4 */ - FADDP( ST(0), ST(7) ) /* F2 F1 F3 F7 F6 F5 F4 */ - FXCH( ST(1) ) /* F1 F2 F3 F7 F6 F5 F4 */ - FADDP( ST(0), ST(5) ) /* F2 F3 F7 F6 F5 F4 */ - FADDP( ST(0), ST(3) ) /* F3 F7 F6 F5 F4 */ - FADDP( ST(0), ST(1) ) /* F7 F6 F5 F4 */ - - FXCH( ST(3) ) /* F4 F6 F5 F7 */ - FADD_S( M(12) ) - FXCH( ST(2) ) /* F5 F6 F4 F7 */ - FADD_S( M(13) ) - FXCH( ST(1) ) /* F6 F5 F4 F7 */ - FADD_S( M(14) ) - FXCH( ST(3) ) /* F7 F5 F4 F6 */ - FADD_S( M(15) ) - - FXCH( ST(2) ) /* F4 F5 F7 F6 */ - FSTP_S( D(0) ) /* F5 F7 F6 */ - FSTP_S( D(1) ) /* F7 F6 */ - FXCH( ST(1) ) /* F6 F7 */ - FSTP_S( D(2) ) /* F7 */ - FSTP_S( D(3) ) /* */ - -LLBL(p3mgr_skip): - ADD_L( CONST(16), EDI ) - ADD_L( EAX, ESI ) - CMP_L( ECX, EDI ) - JNE( LLBL(p3mgr_top) ) - - -LLBL(p3mgr_finish): - POP_L( EDI ) - POP_L( ESI ) - RET -#undef FRAME_OFFSET - -/* -######################################## -## -## gl_x86_transform_points3_identity -## -## -*/ - GLOBL GLNAME(gl_x86_transform_points3_identity_raw) - ALIGNTEXT4 -GLNAME(gl_x86_transform_points3_identity_raw): - -#define FRAME_OFFSET 16 - PUSH_L( ESI ) - PUSH_L( EDI ) - - MOV_L( REGOFF(OFFSET_SOURCE+8, ESP), ESI ) /* ptr to source GLvector4f */ - MOV_L( REGOFF(OFFSET_DEST+8, ESP), EDI ) /* ptr to dest GLvector4f */ - - PUSH_L( EBX ) - PUSH_L( EBP ) - - MOV_L( ARG_MATRIX, EDX ) /* ptr to matrix */ - MOV_L( REGOFF(V4F_COUNT, ESI), ECX ) /* source count */ - - TEST_L( ECX, ECX) - JZ( LLBL(p3mir_finish) ) /* count was zero; go to finish */ - - MOV_L( REGOFF(V4F_STRIDE, ESI), EAX ) /* stride */ - OR_L( CONST(VEC_SIZE_3), REGOFF(V4F_FLAGS, EDI) ) /* set dest flags */ - - MOV_L( ECX, REGOFF(V4F_COUNT, EDI) ) /* set dest count */ - MOV_L( CONST(3), REGOFF(V4F_SIZE, EDI) ) /* set dest size */ - - SHL_L( CONST(4), ECX ) /* count *= 16 */ - MOV_L( REGOFF(V4F_START, ESI), ESI ) /* ptr to first source vertex */ - - MOV_L( REGOFF(V4F_START, EDI), EDI ) /* ptr to first dest vertex */ - ADD_L( EDI, ECX ) /* count += dest ptr */ - - - CMP_L( ESI, EDI ) - JE( LLBL(p3mir_finish) ) - - ALIGNTEXT4ifNOP -LLBL(p3mir_top): - - MOV_L( S(0), EBX ) - MOV_L( S(1), EBP ) - MOV_L( S(2), EDX ) - - MOV_L( EBX, D(0) ) - MOV_L( EBP, D(1) ) - MOV_L( EDX, D(2) ) -LLBL(p3mir_skip): - ADD_L( CONST(16), EDI ) - ADD_L( EAX, ESI ) - CMP_L( ECX, EDI ) - JNE( LLBL(p3mir_top) ) - - -LLBL(p3mir_finish): - POP_L( EBP ) - POP_L( EBX ) - POP_L( EDI ) - POP_L( ESI ) - RET -#undef FRAME_OFFSET - -/* -######################################## -## -## gl_x86_transform_points3_2d -## -## -*/ - GLOBL GLNAME(gl_x86_transform_points3_2d_raw) - ALIGNTEXT4 -GLNAME(gl_x86_transform_points3_2d_raw): - -#define FRAME_OFFSET 12 - PUSH_L( ESI ) - PUSH_L( EDI ) - - MOV_L( REGOFF(OFFSET_SOURCE+8, ESP), ESI ) /* ptr to source GLvector4f */ - MOV_L( REGOFF(OFFSET_DEST+8, ESP), EDI ) /* ptr to dest GLvector4f */ - - PUSH_L( EBX ) - - MOV_L( ARG_MATRIX, EDX ) /* ptr to matrix */ - MOV_L( REGOFF(V4F_COUNT, ESI), ECX ) /* source count */ - - TEST_L( ECX, ECX) - JZ( LLBL(p3m2dr_finish) ) /* count was zero; go to finish */ - - MOV_L( REGOFF(V4F_STRIDE, ESI), EAX ) /* stride */ - OR_L( CONST(VEC_SIZE_3), REGOFF(V4F_FLAGS, EDI) ) /* set dest flags */ - - MOV_L( ECX, REGOFF(V4F_COUNT, EDI) ) /* set dest count */ - MOV_L( CONST(3), REGOFF(V4F_SIZE, EDI) ) /* set dest size */ - - SHL_L( CONST(4), ECX ) /* count *= 16 */ - MOV_L( REGOFF(V4F_START, ESI), ESI ) /* ptr to first source vertex */ - - MOV_L( REGOFF(V4F_START, EDI), EDI ) /* ptr to first dest vertex */ - ADD_L( EDI, ECX ) /* count += dest ptr */ - - - ALIGNTEXT4ifNOP -LLBL(p3m2dr_top): - - - FLD_S( S(0) ) /* F4 */ - FMUL_S( M(0) ) - FLD_S( S(0) ) /* F5 F4 */ - FMUL_S( M(1) ) - - FLD_S( S(1) ) /* F0 F5 F4 */ - FMUL_S( M(4) ) - FLD_S( S(1) ) /* F1 F0 F5 F4 */ - FMUL_S( M(5) ) - - FXCH( ST(1) ) /* F0 F1 F5 F4 */ - FADDP( ST(0), ST(3) ) /* F1 F5 F4 */ - FADDP( ST(0), ST(1) ) /* F5 F4 */ - - FXCH( ST(1) ) /* F4 F5 */ - FADD_S( M(12) ) - FXCH( ST(1) ) /* F5 F4 */ - FADD_S( M(13) ) - - MOV_L( S(2), EBX ) - - FXCH( ST(1) ) /* F4 F5 */ - FSTP_S( D(0) ) /* F5 */ - FSTP_S( D(1) ) /* */ - MOV_L( EBX, D(2) ) - -LLBL(p3m2dr_skip): - ADD_L( CONST(16), EDI ) - ADD_L( EAX, ESI ) - CMP_L( ECX, EDI ) - JNE( LLBL(p3m2dr_top) ) - - -LLBL(p3m2dr_finish): - POP_L( EBX ) - POP_L( EDI ) - POP_L( ESI ) - RET -#undef FRAME_OFFSET - -/* -######################################## -## -## gl_x86_transform_points3_2d_no_rot -## -## -*/ - GLOBL GLNAME(gl_x86_transform_points3_2d_no_rot_raw) - ALIGNTEXT4 -GLNAME(gl_x86_transform_points3_2d_no_rot_raw): - -#define FRAME_OFFSET 12 - PUSH_L( ESI ) - PUSH_L( EDI ) - - MOV_L( REGOFF(OFFSET_SOURCE+8, ESP), ESI ) /* ptr to source GLvector4f */ - MOV_L( REGOFF(OFFSET_DEST+8, ESP), EDI ) /* ptr to dest GLvector4f */ - - PUSH_L( EBX ) - - MOV_L( ARG_MATRIX, EDX ) /* ptr to matrix */ - MOV_L( REGOFF(V4F_COUNT, ESI), ECX ) /* source count */ - - TEST_L( ECX, ECX) - JZ( LLBL(p3m2dnrr_finish) ) /* count was zero; go to finish */ - - MOV_L( REGOFF(V4F_STRIDE, ESI), EAX ) /* stride */ - OR_L( CONST(VEC_SIZE_3), REGOFF(V4F_FLAGS, EDI) ) /* set dest flags */ - - MOV_L( ECX, REGOFF(V4F_COUNT, EDI) ) /* set dest count */ - MOV_L( CONST(3), REGOFF(V4F_SIZE, EDI) ) /* set dest size */ - - SHL_L( CONST(4), ECX ) /* count *= 16 */ - MOV_L( REGOFF(V4F_START, ESI), ESI ) /* ptr to first source vertex */ - - MOV_L( REGOFF(V4F_START, EDI), EDI ) /* ptr to first dest vertex */ - ADD_L( EDI, ECX ) /* count += dest ptr */ - - - ALIGNTEXT4ifNOP -LLBL(p3m2dnrr_top): - - - FLD_S( S(0) ) /* F4 */ - FMUL_S( M(0) ) - - FLD_S( S(1) ) /* F1 F4 */ - FMUL_S( M(5) ) - - FXCH( ST(1) ) /* F4 F1 */ - FADD_S( M(12) ) - FLD_S( M(13) ) /* F5 F4 F1 */ - - FXCH( ST(2) ) /* F1 F4 F5 */ - FADDP( ST(0), ST(2) ) /* F4 F5 */ - - MOV_L( S(2), EBX ) - - FSTP_S( D(0) ) /* F5 */ - FSTP_S( D(1) ) /* */ - MOV_L( EBX, D(2) ) - -LLBL(p3m2dnrr_skip): - ADD_L( CONST(16), EDI ) - ADD_L( EAX, ESI ) - CMP_L( ECX, EDI ) - JNE( LLBL(p3m2dnrr_top) ) - - -LLBL(p3m2dnrr_finish): - POP_L( EBX ) - POP_L( EDI ) - POP_L( ESI ) - RET -#undef FRAME_OFFSET - -/* -######################################## -## -## gl_x86_transform_points3_3d -## -## -*/ - GLOBL GLNAME(gl_x86_transform_points3_3d_raw) - ALIGNTEXT4 -GLNAME(gl_x86_transform_points3_3d_raw): - -#define FRAME_OFFSET 8 - PUSH_L( ESI ) - PUSH_L( EDI ) - - MOV_L( REGOFF(OFFSET_SOURCE+8, ESP), ESI ) /* ptr to source GLvector4f */ - MOV_L( REGOFF(OFFSET_DEST+8, ESP), EDI ) /* ptr to dest GLvector4f */ - - - MOV_L( ARG_MATRIX, EDX ) /* ptr to matrix */ - MOV_L( REGOFF(V4F_COUNT, ESI), ECX ) /* source count */ - - TEST_L( ECX, ECX) - JZ( LLBL(p3m3dr_finish) ) /* count was zero; go to finish */ - - MOV_L( REGOFF(V4F_STRIDE, ESI), EAX ) /* stride */ - OR_L( CONST(VEC_SIZE_3), REGOFF(V4F_FLAGS, EDI) ) /* set dest flags */ - - MOV_L( ECX, REGOFF(V4F_COUNT, EDI) ) /* set dest count */ - MOV_L( CONST(3), REGOFF(V4F_SIZE, EDI) ) /* set dest size */ - - SHL_L( CONST(4), ECX ) /* count *= 16 */ - MOV_L( REGOFF(V4F_START, ESI), ESI ) /* ptr to first source vertex */ - - MOV_L( REGOFF(V4F_START, EDI), EDI ) /* ptr to first dest vertex */ - ADD_L( EDI, ECX ) /* count += dest ptr */ - - - ALIGNTEXT4ifNOP -LLBL(p3m3dr_top): - - - FLD_S( S(0) ) /* F4 */ - FMUL_S( M(0) ) - FLD_S( S(0) ) /* F5 F4 */ - FMUL_S( M(1) ) - FLD_S( S(0) ) /* F6 F5 F4 */ - FMUL_S( M(2) ) - - FLD_S( S(1) ) /* F0 F6 F5 F4 */ - FMUL_S( M(4) ) - FLD_S( S(1) ) /* F1 F0 F6 F5 F4 */ - FMUL_S( M(5) ) - FLD_S( S(1) ) /* F2 F1 F0 F6 F5 F4 */ - FMUL_S( M(6) ) - - FXCH( ST(2) ) /* F0 F1 F2 F6 F5 F4 */ - FADDP( ST(0), ST(5) ) /* F1 F2 F6 F5 F4 */ - FADDP( ST(0), ST(3) ) /* F2 F6 F5 F4 */ - FADDP( ST(0), ST(1) ) /* F6 F5 F4 */ - - FLD_S( S(2) ) /* F0 F6 F5 F4 */ - FMUL_S( M(8) ) - FLD_S( S(2) ) /* F1 F0 F6 F5 F4 */ - FMUL_S( M(9) ) - FLD_S( S(2) ) /* F2 F1 F0 F6 F5 F4 */ - FMUL_S( M(10) ) - - FXCH( ST(2) ) /* F0 F1 F2 F6 F5 F4 */ - FADDP( ST(0), ST(5) ) /* F1 F2 F6 F5 F4 */ - FADDP( ST(0), ST(3) ) /* F2 F6 F5 F4 */ - FADDP( ST(0), ST(1) ) /* F6 F5 F4 */ - - FXCH( ST(2) ) /* F4 F5 F6 */ - FADD_S( M(12) ) - FXCH( ST(1) ) /* F5 F4 F6 */ - FADD_S( M(13) ) - FXCH( ST(2) ) /* F6 F4 F5 */ - FADD_S( M(14) ) - - FXCH( ST(1) ) /* F4 F6 F5 */ - FSTP_S( D(0) ) /* F6 F5 */ - FXCH( ST(1) ) /* F5 F6 */ - FSTP_S( D(1) ) /* F6 */ - FSTP_S( D(2) ) /* */ - -LLBL(p3m3dr_skip): - ADD_L( CONST(16), EDI ) - ADD_L( EAX, ESI ) - CMP_L( ECX, EDI ) - JNE( LLBL(p3m3dr_top) ) - - -LLBL(p3m3dr_finish): - POP_L( EDI ) - POP_L( ESI ) - RET -#undef FRAME_OFFSET - -/* -######################################## -## -## gl_x86_transform_points3_3d_no_rot -## -## -*/ - GLOBL GLNAME(gl_x86_transform_points3_3d_no_rot_raw) - ALIGNTEXT4 -GLNAME(gl_x86_transform_points3_3d_no_rot_raw): - -#define FRAME_OFFSET 8 - PUSH_L( ESI ) - PUSH_L( EDI ) - - MOV_L( REGOFF(OFFSET_SOURCE+8, ESP), ESI ) /* ptr to source GLvector4f */ - MOV_L( REGOFF(OFFSET_DEST+8, ESP), EDI ) /* ptr to dest GLvector4f */ - - - MOV_L( ARG_MATRIX, EDX ) /* ptr to matrix */ - MOV_L( REGOFF(V4F_COUNT, ESI), ECX ) /* source count */ - - TEST_L( ECX, ECX) - JZ( LLBL(p3m3dnrr_finish) ) /* count was zero; go to finish */ - - MOV_L( REGOFF(V4F_STRIDE, ESI), EAX ) /* stride */ - OR_L( CONST(VEC_SIZE_3), REGOFF(V4F_FLAGS, EDI) ) /* set dest flags */ - - MOV_L( ECX, REGOFF(V4F_COUNT, EDI) ) /* set dest count */ - MOV_L( CONST(3), REGOFF(V4F_SIZE, EDI) ) /* set dest size */ - - SHL_L( CONST(4), ECX ) /* count *= 16 */ - MOV_L( REGOFF(V4F_START, ESI), ESI ) /* ptr to first source vertex */ - - MOV_L( REGOFF(V4F_START, EDI), EDI ) /* ptr to first dest vertex */ - ADD_L( EDI, ECX ) /* count += dest ptr */ - - - ALIGNTEXT4ifNOP -LLBL(p3m3dnrr_top): - - - FLD_S( S(0) ) /* F4 */ - FMUL_S( M(0) ) - - FLD_S( S(1) ) /* F1 F4 */ - FMUL_S( M(5) ) - - FLD_S( S(2) ) /* F2 F1 F4 */ - FMUL_S( M(10) ) - - FXCH( ST(2) ) /* F4 F1 F2 */ - FADD_S( M(12) ) - FLD_S( M(13) ) /* F5 F4 F1 F2 */ - FXCH( ST(2) ) /* F1 F4 F5 F2 */ - FADDP( ST(0), ST(2) ) /* F4 F5 F2 */ - FLD_S( M(14) ) /* F6 F4 F5 F2 */ - FXCH( ST(3) ) /* F2 F4 F5 F6 */ - FADDP( ST(0), ST(3) ) /* F4 F5 F6 */ - - FSTP_S( D(0) ) /* F5 F6 */ - FSTP_S( D(1) ) /* F6 */ - FSTP_S( D(2) ) /* */ - -LLBL(p3m3dnrr_skip): - ADD_L( CONST(16), EDI ) - ADD_L( EAX, ESI ) - CMP_L( ECX, EDI ) - JNE( LLBL(p3m3dnrr_top) ) - - -LLBL(p3m3dnrr_finish): - POP_L( EDI ) - POP_L( ESI ) - RET -#undef FRAME_OFFSET - -/* -######################################## -## -## gl_x86_transform_points3_perspective -## -## -*/ - GLOBL GLNAME(gl_x86_transform_points3_perspective_raw) - ALIGNTEXT4 -GLNAME(gl_x86_transform_points3_perspective_raw): - -#define FRAME_OFFSET 12 - PUSH_L( ESI ) - PUSH_L( EDI ) - - MOV_L( REGOFF(OFFSET_SOURCE+8, ESP), ESI ) /* ptr to source GLvector4f */ - MOV_L( REGOFF(OFFSET_DEST+8, ESP), EDI ) /* ptr to dest GLvector4f */ - - PUSH_L( EBX ) - - MOV_L( ARG_MATRIX, EDX ) /* ptr to matrix */ - MOV_L( REGOFF(V4F_COUNT, ESI), ECX ) /* source count */ - - TEST_L( ECX, ECX) - JZ( LLBL(p3mpr_finish) ) /* count was zero; go to finish */ - - MOV_L( REGOFF(V4F_STRIDE, ESI), EAX ) /* stride */ - OR_L( CONST(VEC_SIZE_4), REGOFF(V4F_FLAGS, EDI) ) /* set dest flags */ - - MOV_L( ECX, REGOFF(V4F_COUNT, EDI) ) /* set dest count */ - MOV_L( CONST(4), REGOFF(V4F_SIZE, EDI) ) /* set dest size */ - - SHL_L( CONST(4), ECX ) /* count *= 16 */ - MOV_L( REGOFF(V4F_START, ESI), ESI ) /* ptr to first source vertex */ - - MOV_L( REGOFF(V4F_START, EDI), EDI ) /* ptr to first dest vertex */ - ADD_L( EDI, ECX ) /* count += dest ptr */ - - - ALIGNTEXT4ifNOP -LLBL(p3mpr_top): - - - FLD_S( S(0) ) /* F4 */ - FMUL_S( M(0) ) - - FLD_S( S(1) ) /* F5 F4 */ - FMUL_S( M(5) ) - - FLD_S( S(2) ) /* F0 F5 F4 */ - FMUL_S( M(8) ) - FLD_S( S(2) ) /* F1 F0 F5 F4 */ - FMUL_S( M(9) ) - FLD_S( S(2) ) /* F2 F1 F0 F5 F4 */ - FMUL_S( M(10) ) - - FXCH( ST(2) ) /* F0 F1 F2 F5 F4 */ - FADDP( ST(0), ST(4) ) /* F1 F2 F5 F4 */ - FADDP( ST(0), ST(2) ) /* F2 F5 F4 */ - FLD_S( M(14) ) /* F6 F2 F5 F4 */ - FXCH( ST(1) ) /* F2 F6 F5 F4 */ - FADDP( ST(0), ST(1) ) /* F6 F5 F4 */ - - MOV_L( S(2), EBX ) - XOR_L( CONST(-2147483648), EBX ) /* change sign */ - - FXCH( ST(2) ) /* F4 F5 F6 */ - FSTP_S( D(0) ) /* F5 F6 */ - FSTP_S( D(1) ) /* F6 */ - FSTP_S( D(2) ) /* */ - MOV_L( EBX, D(3) ) - -LLBL(p3mpr_skip): - ADD_L( CONST(16), EDI ) - ADD_L( EAX, ESI ) - CMP_L( ECX, EDI ) - JNE( LLBL(p3mpr_top) ) - - -LLBL(p3mpr_finish): - POP_L( EBX ) - POP_L( EDI ) - POP_L( ESI ) - RET -#undef FRAME_OFFSET - -/* -######################################## -## -## gl_x86_transform_points4_general -## -## -*/ - GLOBL GLNAME(gl_x86_transform_points4_general_raw) - ALIGNTEXT4 -GLNAME(gl_x86_transform_points4_general_raw): - -#define FRAME_OFFSET 8 - PUSH_L( ESI ) - PUSH_L( EDI ) - - MOV_L( REGOFF(OFFSET_SOURCE+8, ESP), ESI ) /* ptr to source GLvector4f */ - MOV_L( REGOFF(OFFSET_DEST+8, ESP), EDI ) /* ptr to dest GLvector4f */ - - - MOV_L( ARG_MATRIX, EDX ) /* ptr to matrix */ - MOV_L( REGOFF(V4F_COUNT, ESI), ECX ) /* source count */ - - TEST_L( ECX, ECX) - JZ( LLBL(p4mgr_finish) ) /* count was zero; go to finish */ - - MOV_L( REGOFF(V4F_STRIDE, ESI), EAX ) /* stride */ - OR_L( CONST(VEC_SIZE_4), REGOFF(V4F_FLAGS, EDI) ) /* set dest flags */ - - MOV_L( ECX, REGOFF(V4F_COUNT, EDI) ) /* set dest count */ - MOV_L( CONST(4), REGOFF(V4F_SIZE, EDI) ) /* set dest size */ - - SHL_L( CONST(4), ECX ) /* count *= 16 */ - MOV_L( REGOFF(V4F_START, ESI), ESI ) /* ptr to first source vertex */ - - MOV_L( REGOFF(V4F_START, EDI), EDI ) /* ptr to first dest vertex */ - ADD_L( EDI, ECX ) /* count += dest ptr */ - - - ALIGNTEXT4ifNOP -LLBL(p4mgr_top): - - - FLD_S( S(0) ) /* F4 */ - FMUL_S( M(0) ) - FLD_S( S(0) ) /* F5 F4 */ - FMUL_S( M(1) ) - FLD_S( S(0) ) /* F6 F5 F4 */ - FMUL_S( M(2) ) - FLD_S( S(0) ) /* F7 F6 F5 F4 */ - FMUL_S( M(3) ) - - FLD_S( S(1) ) /* F0 F7 F6 F5 F4 */ - FMUL_S( M(4) ) - FLD_S( S(1) ) /* F1 F0 F7 F6 F5 F4 */ - FMUL_S( M(5) ) - FLD_S( S(1) ) /* F2 F1 F0 F7 F6 F5 F4 */ - FMUL_S( M(6) ) - FLD_S( S(1) ) /* F3 F2 F1 F0 F7 F6 F5 F4 */ - FMUL_S( M(7) ) - - FXCH( ST(3) ) /* F0 F2 F1 F3 F7 F6 F5 F4 */ - FADDP( ST(0), ST(7) ) /* F2 F1 F3 F7 F6 F5 F4 */ - FXCH( ST(1) ) /* F1 F2 F3 F7 F6 F5 F4 */ - FADDP( ST(0), ST(5) ) /* F2 F3 F7 F6 F5 F4 */ - FADDP( ST(0), ST(3) ) /* F3 F7 F6 F5 F4 */ - FADDP( ST(0), ST(1) ) /* F7 F6 F5 F4 */ - - FLD_S( S(2) ) /* F0 F7 F6 F5 F4 */ - FMUL_S( M(8) ) - FLD_S( S(2) ) /* F1 F0 F7 F6 F5 F4 */ - FMUL_S( M(9) ) - FLD_S( S(2) ) /* F2 F1 F0 F7 F6 F5 F4 */ - FMUL_S( M(10) ) - FLD_S( S(2) ) /* F3 F2 F1 F0 F7 F6 F5 F4 */ - FMUL_S( M(11) ) - - FXCH( ST(3) ) /* F0 F2 F1 F3 F7 F6 F5 F4 */ - FADDP( ST(0), ST(7) ) /* F2 F1 F3 F7 F6 F5 F4 */ - FXCH( ST(1) ) /* F1 F2 F3 F7 F6 F5 F4 */ - FADDP( ST(0), ST(5) ) /* F2 F3 F7 F6 F5 F4 */ - FADDP( ST(0), ST(3) ) /* F3 F7 F6 F5 F4 */ - FADDP( ST(0), ST(1) ) /* F7 F6 F5 F4 */ - - FLD_S( S(3) ) /* F0 F7 F6 F5 F4 */ - FMUL_S( M(12) ) - FLD_S( S(3) ) /* F1 F0 F7 F6 F5 F4 */ - FMUL_S( M(13) ) - FLD_S( S(3) ) /* F2 F1 F0 F7 F6 F5 F4 */ - FMUL_S( M(14) ) - FLD_S( S(3) ) /* F3 F2 F1 F0 F7 F6 F5 F4 */ - FMUL_S( M(15) ) - - FXCH( ST(3) ) /* F0 F2 F1 F3 F7 F6 F5 F4 */ - FADDP( ST(0), ST(7) ) /* F2 F1 F3 F7 F6 F5 F4 */ - FXCH( ST(1) ) /* F1 F2 F3 F7 F6 F5 F4 */ - FADDP( ST(0), ST(5) ) /* F2 F3 F7 F6 F5 F4 */ - FADDP( ST(0), ST(3) ) /* F3 F7 F6 F5 F4 */ - FADDP( ST(0), ST(1) ) /* F7 F6 F5 F4 */ - - FXCH( ST(3) ) /* F4 F6 F5 F7 */ - FSTP_S( D(0) ) /* F6 F5 F7 */ - FXCH( ST(1) ) /* F5 F6 F7 */ - FSTP_S( D(1) ) /* F6 F7 */ - FSTP_S( D(2) ) /* F7 */ - FSTP_S( D(3) ) /* */ - -LLBL(p4mgr_skip): - ADD_L( CONST(16), EDI ) - ADD_L( EAX, ESI ) - CMP_L( ECX, EDI ) - JNE( LLBL(p4mgr_top) ) - - -LLBL(p4mgr_finish): - POP_L( EDI ) - POP_L( ESI ) - RET -#undef FRAME_OFFSET - -/* -######################################## -## -## gl_x86_transform_points4_identity -## -## -*/ - GLOBL GLNAME(gl_x86_transform_points4_identity_raw) - ALIGNTEXT4 -GLNAME(gl_x86_transform_points4_identity_raw): - -#define FRAME_OFFSET 12 - PUSH_L( ESI ) - PUSH_L( EDI ) - - MOV_L( REGOFF(OFFSET_SOURCE+8, ESP), ESI ) /* ptr to source GLvector4f */ - MOV_L( REGOFF(OFFSET_DEST+8, ESP), EDI ) /* ptr to dest GLvector4f */ - - PUSH_L( EBX ) - - MOV_L( ARG_MATRIX, EDX ) /* ptr to matrix */ - MOV_L( REGOFF(V4F_COUNT, ESI), ECX ) /* source count */ - - TEST_L( ECX, ECX) - JZ( LLBL(p4mir_finish) ) /* count was zero; go to finish */ - - MOV_L( REGOFF(V4F_STRIDE, ESI), EAX ) /* stride */ - OR_L( CONST(VEC_SIZE_4), REGOFF(V4F_FLAGS, EDI) ) /* set dest flags */ - - MOV_L( ECX, REGOFF(V4F_COUNT, EDI) ) /* set dest count */ - MOV_L( CONST(4), REGOFF(V4F_SIZE, EDI) ) /* set dest size */ - - SHL_L( CONST(4), ECX ) /* count *= 16 */ - MOV_L( REGOFF(V4F_START, ESI), ESI ) /* ptr to first source vertex */ - - MOV_L( REGOFF(V4F_START, EDI), EDI ) /* ptr to first dest vertex */ - ADD_L( EDI, ECX ) /* count += dest ptr */ - - - CMP_L( ESI, EDI ) - JE( LLBL(p4mir_finish) ) - - ALIGNTEXT4ifNOP -LLBL(p4mir_top): - - MOV_L( S(0), EBX ) - MOV_L( S(1), EDX ) - - MOV_L( EBX, D(0) ) - MOV_L( EDX, D(1) ) - - MOV_L( S(2), EBX ) - MOV_L( S(3), EDX ) - - MOV_L( EBX, D(2) ) - MOV_L( EDX, D(3) ) -LLBL(p4mir_skip): - ADD_L( CONST(16), EDI ) - ADD_L( EAX, ESI ) - CMP_L( ECX, EDI ) - JNE( LLBL(p4mir_top) ) - - -LLBL(p4mir_finish): - POP_L( EBX ) - POP_L( EDI ) - POP_L( ESI ) - RET -#undef FRAME_OFFSET - -/* -######################################## -## -## gl_x86_transform_points4_2d -## -## -*/ - GLOBL GLNAME(gl_x86_transform_points4_2d_raw) - ALIGNTEXT4 -GLNAME(gl_x86_transform_points4_2d_raw): - -#define FRAME_OFFSET 16 - PUSH_L( ESI ) - PUSH_L( EDI ) - - MOV_L( REGOFF(OFFSET_SOURCE+8, ESP), ESI ) /* ptr to source GLvector4f */ - MOV_L( REGOFF(OFFSET_DEST+8, ESP), EDI ) /* ptr to dest GLvector4f */ - - PUSH_L( EBX ) - PUSH_L( EBP ) - - MOV_L( ARG_MATRIX, EDX ) /* ptr to matrix */ - MOV_L( REGOFF(V4F_COUNT, ESI), ECX ) /* source count */ - - TEST_L( ECX, ECX) - JZ( LLBL(p4m2dr_finish) ) /* count was zero; go to finish */ - - MOV_L( REGOFF(V4F_STRIDE, ESI), EAX ) /* stride */ - OR_L( CONST(VEC_SIZE_4), REGOFF(V4F_FLAGS, EDI) ) /* set dest flags */ - - MOV_L( ECX, REGOFF(V4F_COUNT, EDI) ) /* set dest count */ - MOV_L( CONST(4), REGOFF(V4F_SIZE, EDI) ) /* set dest size */ - - SHL_L( CONST(4), ECX ) /* count *= 16 */ - MOV_L( REGOFF(V4F_START, ESI), ESI ) /* ptr to first source vertex */ - - MOV_L( REGOFF(V4F_START, EDI), EDI ) /* ptr to first dest vertex */ - ADD_L( EDI, ECX ) /* count += dest ptr */ - - - ALIGNTEXT4ifNOP -LLBL(p4m2dr_top): - - - FLD_S( S(0) ) /* F4 */ - FMUL_S( M(0) ) - FLD_S( S(0) ) /* F5 F4 */ - FMUL_S( M(1) ) - - FLD_S( S(1) ) /* F0 F5 F4 */ - FMUL_S( M(4) ) - FLD_S( S(1) ) /* F1 F0 F5 F4 */ - FMUL_S( M(5) ) - - FXCH( ST(1) ) /* F0 F1 F5 F4 */ - FADDP( ST(0), ST(3) ) /* F1 F5 F4 */ - FADDP( ST(0), ST(1) ) /* F5 F4 */ - - FLD_S( S(3) ) /* F0 F5 F4 */ - FMUL_S( M(12) ) - FLD_S( S(3) ) /* F1 F0 F5 F4 */ - FMUL_S( M(13) ) - - FXCH( ST(1) ) /* F0 F1 F5 F4 */ - FADDP( ST(0), ST(3) ) /* F1 F5 F4 */ - FADDP( ST(0), ST(1) ) /* F5 F4 */ - - MOV_L( S(2), EBX ) - MOV_L( S(3), EBP ) - - FXCH( ST(1) ) /* F4 F5 */ - FSTP_S( D(0) ) /* F5 */ - FSTP_S( D(1) ) /* */ - MOV_L( EBX, D(2) ) - MOV_L( EBP, D(3) ) - -LLBL(p4m2dr_skip): - ADD_L( CONST(16), EDI ) - ADD_L( EAX, ESI ) - CMP_L( ECX, EDI ) - JNE( LLBL(p4m2dr_top) ) - - -LLBL(p4m2dr_finish): - POP_L( EBP ) - POP_L( EBX ) - POP_L( EDI ) - POP_L( ESI ) - RET -#undef FRAME_OFFSET - -/* -######################################## -## -## gl_x86_transform_points4_2d_no_rot -## -## -*/ - GLOBL GLNAME(gl_x86_transform_points4_2d_no_rot_raw) - ALIGNTEXT4 -GLNAME(gl_x86_transform_points4_2d_no_rot_raw): - -#define FRAME_OFFSET 16 - PUSH_L( ESI ) - PUSH_L( EDI ) - - MOV_L( REGOFF(OFFSET_SOURCE+8, ESP), ESI ) /* ptr to source GLvector4f */ - MOV_L( REGOFF(OFFSET_DEST+8, ESP), EDI ) /* ptr to dest GLvector4f */ - - PUSH_L( EBX ) - PUSH_L( EBP ) - - MOV_L( ARG_MATRIX, EDX ) /* ptr to matrix */ - MOV_L( REGOFF(V4F_COUNT, ESI), ECX ) /* source count */ - - TEST_L( ECX, ECX) - JZ( LLBL(p4m2dnrr_finish) ) /* count was zero; go to finish */ - - MOV_L( REGOFF(V4F_STRIDE, ESI), EAX ) /* stride */ - OR_L( CONST(VEC_SIZE_4), REGOFF(V4F_FLAGS, EDI) ) /* set dest flags */ - - MOV_L( ECX, REGOFF(V4F_COUNT, EDI) ) /* set dest count */ - MOV_L( CONST(4), REGOFF(V4F_SIZE, EDI) ) /* set dest size */ - - SHL_L( CONST(4), ECX ) /* count *= 16 */ - MOV_L( REGOFF(V4F_START, ESI), ESI ) /* ptr to first source vertex */ - - MOV_L( REGOFF(V4F_START, EDI), EDI ) /* ptr to first dest vertex */ - ADD_L( EDI, ECX ) /* count += dest ptr */ - - - ALIGNTEXT4ifNOP -LLBL(p4m2dnrr_top): - - - FLD_S( S(0) ) /* F4 */ - FMUL_S( M(0) ) - - FLD_S( S(1) ) /* F5 F4 */ - FMUL_S( M(5) ) - - FLD_S( S(3) ) /* F0 F5 F4 */ - FMUL_S( M(12) ) - FLD_S( S(3) ) /* F1 F0 F5 F4 */ - FMUL_S( M(13) ) - - FXCH( ST(1) ) /* F0 F1 F5 F4 */ - FADDP( ST(0), ST(3) ) /* F1 F5 F4 */ - FADDP( ST(0), ST(1) ) /* F5 F4 */ - - MOV_L( S(2), EBX ) - MOV_L( S(3), EBP ) - - FXCH( ST(1) ) /* F4 F5 */ - FSTP_S( D(0) ) /* F5 */ - FSTP_S( D(1) ) /* */ - MOV_L( EBX, D(2) ) - MOV_L( EBP, D(3) ) - -LLBL(p4m2dnrr_skip): - ADD_L( CONST(16), EDI ) - ADD_L( EAX, ESI ) - CMP_L( ECX, EDI ) - JNE( LLBL(p4m2dnrr_top) ) - - -LLBL(p4m2dnrr_finish): - POP_L( EBP ) - POP_L( EBX ) - POP_L( EDI ) - POP_L( ESI ) - RET -#undef FRAME_OFFSET - -/* -######################################## -## -## gl_x86_transform_points4_3d -## -## -*/ - GLOBL GLNAME(gl_x86_transform_points4_3d_raw) - ALIGNTEXT4 -GLNAME(gl_x86_transform_points4_3d_raw): - -#define FRAME_OFFSET 12 - PUSH_L( ESI ) - PUSH_L( EDI ) - - MOV_L( REGOFF(OFFSET_SOURCE+8, ESP), ESI ) /* ptr to source GLvector4f */ - MOV_L( REGOFF(OFFSET_DEST+8, ESP), EDI ) /* ptr to dest GLvector4f */ - - PUSH_L( EBX ) - - MOV_L( ARG_MATRIX, EDX ) /* ptr to matrix */ - MOV_L( REGOFF(V4F_COUNT, ESI), ECX ) /* source count */ - - TEST_L( ECX, ECX) - JZ( LLBL(p4m3dr_finish) ) /* count was zero; go to finish */ - - MOV_L( REGOFF(V4F_STRIDE, ESI), EAX ) /* stride */ - OR_L( CONST(VEC_SIZE_4), REGOFF(V4F_FLAGS, EDI) ) /* set dest flags */ - - MOV_L( ECX, REGOFF(V4F_COUNT, EDI) ) /* set dest count */ - MOV_L( CONST(4), REGOFF(V4F_SIZE, EDI) ) /* set dest size */ - - SHL_L( CONST(4), ECX ) /* count *= 16 */ - MOV_L( REGOFF(V4F_START, ESI), ESI ) /* ptr to first source vertex */ - - MOV_L( REGOFF(V4F_START, EDI), EDI ) /* ptr to first dest vertex */ - ADD_L( EDI, ECX ) /* count += dest ptr */ - - - ALIGNTEXT4ifNOP -LLBL(p4m3dr_top): - - - FLD_S( S(0) ) /* F4 */ - FMUL_S( M(0) ) - FLD_S( S(0) ) /* F5 F4 */ - FMUL_S( M(1) ) - FLD_S( S(0) ) /* F6 F5 F4 */ - FMUL_S( M(2) ) - - FLD_S( S(1) ) /* F0 F6 F5 F4 */ - FMUL_S( M(4) ) - FLD_S( S(1) ) /* F1 F0 F6 F5 F4 */ - FMUL_S( M(5) ) - FLD_S( S(1) ) /* F2 F1 F0 F6 F5 F4 */ - FMUL_S( M(6) ) - - FXCH( ST(2) ) /* F0 F1 F2 F6 F5 F4 */ - FADDP( ST(0), ST(5) ) /* F1 F2 F6 F5 F4 */ - FADDP( ST(0), ST(3) ) /* F2 F6 F5 F4 */ - FADDP( ST(0), ST(1) ) /* F6 F5 F4 */ - - FLD_S( S(2) ) /* F0 F6 F5 F4 */ - FMUL_S( M(8) ) - FLD_S( S(2) ) /* F1 F0 F6 F5 F4 */ - FMUL_S( M(9) ) - FLD_S( S(2) ) /* F2 F1 F0 F6 F5 F4 */ - FMUL_S( M(10) ) - - FXCH( ST(2) ) /* F0 F1 F2 F6 F5 F4 */ - FADDP( ST(0), ST(5) ) /* F1 F2 F6 F5 F4 */ - FADDP( ST(0), ST(3) ) /* F2 F6 F5 F4 */ - FADDP( ST(0), ST(1) ) /* F6 F5 F4 */ - - FLD_S( S(3) ) /* F0 F6 F5 F4 */ - FMUL_S( M(12) ) - FLD_S( S(3) ) /* F1 F0 F6 F5 F4 */ - FMUL_S( M(13) ) - FLD_S( S(3) ) /* F2 F1 F0 F6 F5 F4 */ - FMUL_S( M(14) ) - - FXCH( ST(2) ) /* F0 F1 F2 F6 F5 F4 */ - FADDP( ST(0), ST(5) ) /* F1 F2 F6 F5 F4 */ - FADDP( ST(0), ST(3) ) /* F2 F6 F5 F4 */ - FADDP( ST(0), ST(1) ) /* F6 F5 F4 */ - - MOV_L( S(3), EBX ) - - FXCH( ST(2) ) /* F4 F5 F6 */ - FSTP_S( D(0) ) /* F5 F6 */ - FSTP_S( D(1) ) /* F6 */ - FSTP_S( D(2) ) /* */ - MOV_L( EBX, D(3) ) - -LLBL(p4m3dr_skip): - ADD_L( CONST(16), EDI ) - ADD_L( EAX, ESI ) - CMP_L( ECX, EDI ) - JNE( LLBL(p4m3dr_top) ) - - -LLBL(p4m3dr_finish): - POP_L( EBX ) - POP_L( EDI ) - POP_L( ESI ) - RET -#undef FRAME_OFFSET - -/* -######################################## -## -## gl_x86_transform_points4_3d_no_rot -## -## -*/ - GLOBL GLNAME(gl_x86_transform_points4_3d_no_rot_raw) - ALIGNTEXT4 -GLNAME(gl_x86_transform_points4_3d_no_rot_raw): - -#define FRAME_OFFSET 12 - PUSH_L( ESI ) - PUSH_L( EDI ) - - MOV_L( REGOFF(OFFSET_SOURCE+8, ESP), ESI ) /* ptr to source GLvector4f */ - MOV_L( REGOFF(OFFSET_DEST+8, ESP), EDI ) /* ptr to dest GLvector4f */ - - PUSH_L( EBX ) - - MOV_L( ARG_MATRIX, EDX ) /* ptr to matrix */ - MOV_L( REGOFF(V4F_COUNT, ESI), ECX ) /* source count */ - - TEST_L( ECX, ECX) - JZ( LLBL(p4m3dnrr_finish) ) /* count was zero; go to finish */ - - MOV_L( REGOFF(V4F_STRIDE, ESI), EAX ) /* stride */ - OR_L( CONST(VEC_SIZE_4), REGOFF(V4F_FLAGS, EDI) ) /* set dest flags */ - - MOV_L( ECX, REGOFF(V4F_COUNT, EDI) ) /* set dest count */ - MOV_L( CONST(4), REGOFF(V4F_SIZE, EDI) ) /* set dest size */ - - SHL_L( CONST(4), ECX ) /* count *= 16 */ - MOV_L( REGOFF(V4F_START, ESI), ESI ) /* ptr to first source vertex */ - - MOV_L( REGOFF(V4F_START, EDI), EDI ) /* ptr to first dest vertex */ - ADD_L( EDI, ECX ) /* count += dest ptr */ - - - ALIGNTEXT4ifNOP -LLBL(p4m3dnrr_top): - - - FLD_S( S(0) ) /* F4 */ - FMUL_S( M(0) ) - - FLD_S( S(1) ) /* F5 F4 */ - FMUL_S( M(5) ) - - FLD_S( S(2) ) /* F6 F5 F4 */ - FMUL_S( M(10) ) - - FLD_S( S(3) ) /* F0 F6 F5 F4 */ - FMUL_S( M(12) ) - FLD_S( S(3) ) /* F1 F0 F6 F5 F4 */ - FMUL_S( M(13) ) - FLD_S( S(3) ) /* F2 F1 F0 F6 F5 F4 */ - FMUL_S( M(14) ) - - FXCH( ST(2) ) /* F0 F1 F2 F6 F5 F4 */ - FADDP( ST(0), ST(5) ) /* F1 F2 F6 F5 F4 */ - FADDP( ST(0), ST(3) ) /* F2 F6 F5 F4 */ - FADDP( ST(0), ST(1) ) /* F6 F5 F4 */ - - MOV_L( S(3), EBX ) - - FXCH( ST(2) ) /* F4 F5 F6 */ - FSTP_S( D(0) ) /* F5 F6 */ - FSTP_S( D(1) ) /* F6 */ - FSTP_S( D(2) ) /* */ - MOV_L( EBX, D(3) ) - -LLBL(p4m3dnrr_skip): - ADD_L( CONST(16), EDI ) - ADD_L( EAX, ESI ) - CMP_L( ECX, EDI ) - JNE( LLBL(p4m3dnrr_top) ) - - -LLBL(p4m3dnrr_finish): - POP_L( EBX ) - POP_L( EDI ) - POP_L( ESI ) - RET -#undef FRAME_OFFSET - -/* -######################################## -## -## gl_x86_transform_points4_perspective -## -## -*/ - GLOBL GLNAME(gl_x86_transform_points4_perspective_raw) - ALIGNTEXT4 -GLNAME(gl_x86_transform_points4_perspective_raw): - -#define FRAME_OFFSET 12 - PUSH_L( ESI ) - PUSH_L( EDI ) - - MOV_L( REGOFF(OFFSET_SOURCE+8, ESP), ESI ) /* ptr to source GLvector4f */ - MOV_L( REGOFF(OFFSET_DEST+8, ESP), EDI ) /* ptr to dest GLvector4f */ - - PUSH_L( EBX ) - - MOV_L( ARG_MATRIX, EDX ) /* ptr to matrix */ - MOV_L( REGOFF(V4F_COUNT, ESI), ECX ) /* source count */ - - TEST_L( ECX, ECX) - JZ( LLBL(p4mpr_finish) ) /* count was zero; go to finish */ - - MOV_L( REGOFF(V4F_STRIDE, ESI), EAX ) /* stride */ - OR_L( CONST(VEC_SIZE_4), REGOFF(V4F_FLAGS, EDI) ) /* set dest flags */ - - MOV_L( ECX, REGOFF(V4F_COUNT, EDI) ) /* set dest count */ - MOV_L( CONST(4), REGOFF(V4F_SIZE, EDI) ) /* set dest size */ - - SHL_L( CONST(4), ECX ) /* count *= 16 */ - MOV_L( REGOFF(V4F_START, ESI), ESI ) /* ptr to first source vertex */ - - MOV_L( REGOFF(V4F_START, EDI), EDI ) /* ptr to first dest vertex */ - ADD_L( EDI, ECX ) /* count += dest ptr */ - - - ALIGNTEXT4ifNOP -LLBL(p4mpr_top): - - - FLD_S( S(0) ) /* F4 */ - FMUL_S( M(0) ) - - FLD_S( S(1) ) /* F5 F4 */ - FMUL_S( M(5) ) - - FLD_S( S(2) ) /* F0 F5 F4 */ - FMUL_S( M(8) ) - FLD_S( S(2) ) /* F1 F0 F5 F4 */ - FMUL_S( M(9) ) - FLD_S( S(2) ) /* F6 F1 F0 F5 F4 */ - FMUL_S( M(10) ) - - FXCH( ST(2) ) /* F0 F1 F6 F5 F4 */ - FADDP( ST(0), ST(4) ) /* F1 F6 F5 F4 */ - FADDP( ST(0), ST(2) ) /* F6 F5 F4 */ - - FLD_S( S(3) ) /* F2 F6 F5 F4 */ - FMUL_S( M(14) ) - - FADDP( ST(0), ST(1) ) /* F6 F5 F4 */ - - MOV_L( S(2), EBX ) - XOR_L( CONST(-2147483648), EBX ) /* change sign */ - - FXCH( ST(2) ) /* F4 F5 F6 */ - FSTP_S( D(0) ) /* F5 F6 */ - FSTP_S( D(1) ) /* F6 */ - FSTP_S( D(2) ) /* */ - MOV_L( EBX, D(3) ) - -LLBL(p4mpr_skip): - ADD_L( CONST(16), EDI ) - ADD_L( EAX, ESI ) - CMP_L( ECX, EDI ) - JNE( LLBL(p4mpr_top) ) - - -LLBL(p4mpr_finish): - POP_L( EBX ) - POP_L( EDI ) - POP_L( ESI ) - RET -#undef FRAME_OFFSET - - - -#undef OFFSET_DEST -#undef OFFSET_MATRIX -#undef OFFSET_SOURCE -#undef OFFSET_CLIP -#undef OFFSET_FLAG - -#undef ARG_DEST -#undef ARG_MATRIX -#undef ARG_SOURCE -#undef ARG_CLIP -#undef ARG_FLAG - -#define OFFSET_DEST 4 -#define OFFSET_MATRIX 8 -#define OFFSET_SOURCE 12 -#define OFFSET_STRIDE 16 -#define OFFSET_COUNT 20 - -#define ARG_DEST REGOFF(FRAME_OFFSET+OFFSET_DEST, ESP) -#define ARG_MATRIX REGOFF(FRAME_OFFSET+OFFSET_MATRIX, ESP) -#define ARG_SOURCE REGOFF(FRAME_OFFSET+OFFSET_SOURCE, ESP) -#define ARG_STRIDE REGOFF(FRAME_OFFSET+OFFSET_STRIDE, ESP) -#define ARG_COUNT REGOFF(FRAME_OFFSET+OFFSET_COUNT, ESP) - -/* -######################################## -## -## clean (no vertex struct) versions -## -######################################## -*/ - - -/* -######################################## -## -## gl_x86_transform_points2_general -## -## -*/ - GLOBL GLNAME(gl_x86_transform_points2_general_v8) - ALIGNTEXT4 -GLNAME(gl_x86_transform_points2_general_v8): - -#define FRAME_OFFSET 8 - PUSH_L( ESI ) - PUSH_L( EDI ) - - - MOV_L( ARG_SOURCE, ESI ) /* ptr to source */ - MOV_L( ARG_DEST, EDI ) /* ptr to dest */ - - MOV_L( ARG_MATRIX, EDX ) /* ptr to matrix */ - MOV_L( ARG_COUNT, ECX ) /* count */ - - TEST_L( ECX, ECX) - JZ( LLBL(p2mgv8_finish) ) /* count was zero; go to finish */ - - MOV_L( ARG_STRIDE, EAX ) /* stride */ - - - ALIGNTEXT4ifNOP -LLBL(p2mgv8_top): - - - FLD_S( S(0) ) /* F4 */ - FMUL_S( M(0) ) - FLD_S( S(0) ) /* F5 F4 */ - FMUL_S( M(1) ) - FLD_S( S(0) ) /* F6 F5 F4 */ - FMUL_S( M(2) ) - FLD_S( S(0) ) /* F7 F6 F5 F4 */ - FMUL_S( M(3) ) - - FLD_S( S(1) ) /* F0 F7 F6 F5 F4 */ - FMUL_S( M(4) ) - FLD_S( S(1) ) /* F1 F0 F7 F6 F5 F4 */ - FMUL_S( M(5) ) - FLD_S( S(1) ) /* F2 F1 F0 F7 F6 F5 F4 */ - FMUL_S( M(6) ) - FLD_S( S(1) ) /* F3 F2 F1 F0 F7 F6 F5 F4 */ - FMUL_S( M(7) ) - - FXCH( ST(3) ) /* F0 F2 F1 F3 F7 F6 F5 F4 */ - FADDP( ST(0), ST(7) ) /* F2 F1 F3 F7 F6 F5 F4 */ - FXCH( ST(1) ) /* F1 F2 F3 F7 F6 F5 F4 */ - FADDP( ST(0), ST(5) ) /* F2 F3 F7 F6 F5 F4 */ - FADDP( ST(0), ST(3) ) /* F3 F7 F6 F5 F4 */ - FADDP( ST(0), ST(1) ) /* F7 F6 F5 F4 */ - - FXCH( ST(3) ) /* F4 F6 F5 F7 */ - FADD_S( M(12) ) - FXCH( ST(2) ) /* F5 F6 F4 F7 */ - FADD_S( M(13) ) - FXCH( ST(1) ) /* F6 F5 F4 F7 */ - FADD_S( M(14) ) - FXCH( ST(3) ) /* F7 F5 F4 F6 */ - FADD_S( M(15) ) - - FXCH( ST(2) ) /* F4 F5 F7 F6 */ - FSTP_S( D(0) ) /* F5 F7 F6 */ - FSTP_S( D(1) ) /* F7 F6 */ - FXCH( ST(1) ) /* F6 F7 */ - FSTP_S( D(2) ) /* F7 */ - FSTP_S( D(3) ) /* */ - -LLBL(p2mgv8_skip): - ADD_L( CONST(32), EDI ) - ADD_L( EAX, ESI ) - DEC_L( ECX ) - JNZ( LLBL(p2mgv8_top) ) - - -LLBL(p2mgv8_finish): - POP_L( EDI ) - POP_L( ESI ) - RET -#undef FRAME_OFFSET - -/* -######################################## -## -## gl_x86_transform_points2_identity -## -## -*/ - GLOBL GLNAME(gl_x86_transform_points2_identity_v8) - ALIGNTEXT4 -GLNAME(gl_x86_transform_points2_identity_v8): - -#define FRAME_OFFSET 12 - PUSH_L( ESI ) - PUSH_L( EDI ) - - PUSH_L( EBX ) - - MOV_L( ARG_SOURCE, ESI ) /* ptr to source */ - MOV_L( ARG_DEST, EDI ) /* ptr to dest */ - - MOV_L( ARG_MATRIX, EDX ) /* ptr to matrix */ - MOV_L( ARG_COUNT, ECX ) /* count */ - - TEST_L( ECX, ECX) - JZ( LLBL(p2miv8_finish) ) /* count was zero; go to finish */ - - MOV_L( ARG_STRIDE, EAX ) /* stride */ - - - CMP_L( ESI, EDI ) - JE( LLBL(p2miv8_finish) ) - - ALIGNTEXT4ifNOP -LLBL(p2miv8_top): - - MOV_L( S(0), EBX ) - MOV_L( S(1), EDX ) - - MOV_L( EBX, D(0) ) - MOV_L( EDX, D(1) ) - MOV_L( CONST(FP_ZERO), D(2) ) - MOV_L( CONST(FP_ONE), D(3) ) -LLBL(p2miv8_skip): - ADD_L( CONST(32), EDI ) - ADD_L( EAX, ESI ) - DEC_L( ECX ) - JNZ( LLBL(p2miv8_top) ) - - -LLBL(p2miv8_finish): - POP_L( EBX ) - POP_L( EDI ) - POP_L( ESI ) - RET -#undef FRAME_OFFSET - -/* -######################################## -## -## gl_x86_transform_points2_2d -## -## -*/ - GLOBL GLNAME(gl_x86_transform_points2_2d_v8) - ALIGNTEXT4 -GLNAME(gl_x86_transform_points2_2d_v8): - -#define FRAME_OFFSET 8 - PUSH_L( ESI ) - PUSH_L( EDI ) - - - MOV_L( ARG_SOURCE, ESI ) /* ptr to source */ - MOV_L( ARG_DEST, EDI ) /* ptr to dest */ - - MOV_L( ARG_MATRIX, EDX ) /* ptr to matrix */ - MOV_L( ARG_COUNT, ECX ) /* count */ - - TEST_L( ECX, ECX) - JZ( LLBL(p2m2dv8_finish) ) /* count was zero; go to finish */ - - MOV_L( ARG_STRIDE, EAX ) /* stride */ - - - ALIGNTEXT4ifNOP -LLBL(p2m2dv8_top): - - - FLD_S( S(0) ) /* F4 */ - FMUL_S( M(0) ) - FLD_S( S(0) ) /* F5 F4 */ - FMUL_S( M(1) ) - - FLD_S( S(1) ) /* F0 F5 F4 */ - FMUL_S( M(4) ) - FLD_S( S(1) ) /* F1 F0 F5 F4 */ - FMUL_S( M(5) ) - - FXCH( ST(1) ) /* F0 F1 F5 F4 */ - FADDP( ST(0), ST(3) ) /* F1 F5 F4 */ - FADDP( ST(0), ST(1) ) /* F5 F4 */ - - FXCH( ST(1) ) /* F4 F5 */ - FADD_S( M(12) ) - FXCH( ST(1) ) /* F5 F4 */ - FADD_S( M(13) ) - - FXCH( ST(1) ) /* F4 F5 */ - FSTP_S( D(0) ) /* F5 */ - FSTP_S( D(1) ) /* */ - - MOV_L( CONST(FP_ZERO), D(2) ) - MOV_L( CONST(FP_ONE), D(3) ) -LLBL(p2m2dv8_skip): - ADD_L( CONST(32), EDI ) - ADD_L( EAX, ESI ) - DEC_L( ECX ) - JNZ( LLBL(p2m2dv8_top) ) - - -LLBL(p2m2dv8_finish): - POP_L( EDI ) - POP_L( ESI ) - RET -#undef FRAME_OFFSET - -/* -######################################## -## -## gl_x86_transform_points2_2d_no_rot -## -## -*/ - GLOBL GLNAME(gl_x86_transform_points2_2d_no_rot_v8) - ALIGNTEXT4 -GLNAME(gl_x86_transform_points2_2d_no_rot_v8): - -#define FRAME_OFFSET 8 - PUSH_L( ESI ) - PUSH_L( EDI ) - - - MOV_L( ARG_SOURCE, ESI ) /* ptr to source */ - MOV_L( ARG_DEST, EDI ) /* ptr to dest */ - - MOV_L( ARG_MATRIX, EDX ) /* ptr to matrix */ - MOV_L( ARG_COUNT, ECX ) /* count */ - - TEST_L( ECX, ECX) - JZ( LLBL(p2m2dnrv8_finish) ) /* count was zero; go to finish */ - - MOV_L( ARG_STRIDE, EAX ) /* stride */ - - - ALIGNTEXT4ifNOP -LLBL(p2m2dnrv8_top): - - - FLD_S( S(0) ) /* F4 */ - FMUL_S( M(0) ) - - FLD_S( S(1) ) /* F1 F4 */ - FMUL_S( M(5) ) - - FXCH( ST(1) ) /* F4 F1 */ - FADD_S( M(12) ) - FLD_S( M(13) ) /* F5 F4 F1 */ - FXCH( ST(2) ) /* F1 F4 F5 */ - FADDP( ST(0), ST(2) ) /* F4 F5 */ - - FSTP_S( D(0) ) /* F5 */ - FSTP_S( D(1) ) /* */ - - MOV_L( CONST(FP_ZERO), D(2) ) - MOV_L( CONST(FP_ONE), D(3) ) -LLBL(p2m2dnrv8_skip): - ADD_L( CONST(32), EDI ) - ADD_L( EAX, ESI ) - DEC_L( ECX ) - JNZ( LLBL(p2m2dnrv8_top) ) - - -LLBL(p2m2dnrv8_finish): - POP_L( EDI ) - POP_L( ESI ) - RET -#undef FRAME_OFFSET - -/* -######################################## -## -## gl_x86_transform_points2_3d -## -## -*/ - GLOBL GLNAME(gl_x86_transform_points2_3d_v8) - ALIGNTEXT4 -GLNAME(gl_x86_transform_points2_3d_v8): - -#define FRAME_OFFSET 8 - PUSH_L( ESI ) - PUSH_L( EDI ) - - - MOV_L( ARG_SOURCE, ESI ) /* ptr to source */ - MOV_L( ARG_DEST, EDI ) /* ptr to dest */ - - MOV_L( ARG_MATRIX, EDX ) /* ptr to matrix */ - MOV_L( ARG_COUNT, ECX ) /* count */ - - TEST_L( ECX, ECX) - JZ( LLBL(p2m3dv8_finish) ) /* count was zero; go to finish */ - - MOV_L( ARG_STRIDE, EAX ) /* stride */ - - - ALIGNTEXT4ifNOP -LLBL(p2m3dv8_top): - - - FLD_S( S(0) ) /* F4 */ - FMUL_S( M(0) ) - FLD_S( S(0) ) /* F5 F4 */ - FMUL_S( M(1) ) - FLD_S( S(0) ) /* F6 F5 F4 */ - FMUL_S( M(2) ) - - FLD_S( S(1) ) /* F0 F6 F5 F4 */ - FMUL_S( M(4) ) - FLD_S( S(1) ) /* F1 F0 F6 F5 F4 */ - FMUL_S( M(5) ) - FLD_S( S(1) ) /* F2 F1 F0 F6 F5 F4 */ - FMUL_S( M(6) ) - - FXCH( ST(2) ) /* F0 F1 F2 F6 F5 F4 */ - FADDP( ST(0), ST(5) ) /* F1 F2 F6 F5 F4 */ - FADDP( ST(0), ST(3) ) /* F2 F6 F5 F4 */ - FADDP( ST(0), ST(1) ) /* F6 F5 F4 */ - - FXCH( ST(2) ) /* F4 F5 F6 */ - FADD_S( M(12) ) - FXCH( ST(1) ) /* F5 F4 F6 */ - FADD_S( M(13) ) - FXCH( ST(2) ) /* F6 F4 F5 */ - FADD_S( M(14) ) - - FXCH( ST(1) ) /* F4 F6 F5 */ - FSTP_S( D(0) ) /* F6 F5 */ - FXCH( ST(1) ) /* F5 F6 */ - FSTP_S( D(1) ) /* F6 */ - FSTP_S( D(2) ) /* */ - - MOV_L( CONST(FP_ONE), D(3) ) -LLBL(p2m3dv8_skip): - ADD_L( CONST(32), EDI ) - ADD_L( EAX, ESI ) - DEC_L( ECX ) - JNZ( LLBL(p2m3dv8_top) ) - - -LLBL(p2m3dv8_finish): - POP_L( EDI ) - POP_L( ESI ) - RET -#undef FRAME_OFFSET - -/* -######################################## -## -## gl_x86_transform_points2_3d_no_rot -## -## -*/ - GLOBL GLNAME(gl_x86_transform_points2_3d_no_rot_v8) - ALIGNTEXT4 -GLNAME(gl_x86_transform_points2_3d_no_rot_v8): - -#define FRAME_OFFSET 12 - PUSH_L( ESI ) - PUSH_L( EDI ) - - PUSH_L( EBX ) - - MOV_L( ARG_SOURCE, ESI ) /* ptr to source */ - MOV_L( ARG_DEST, EDI ) /* ptr to dest */ - - MOV_L( ARG_MATRIX, EDX ) /* ptr to matrix */ - MOV_L( ARG_COUNT, ECX ) /* count */ - - TEST_L( ECX, ECX) - JZ( LLBL(p2m3dnrv8_finish) ) /* count was zero; go to finish */ - - MOV_L( ARG_STRIDE, EAX ) /* stride */ - - - MOV_L( M(14), EBX ) - ALIGNTEXT4ifNOP -LLBL(p2m3dnrv8_top): - - - FLD_S( S(0) ) /* F4 */ - FMUL_S( M(0) ) - - FLD_S( S(1) ) /* F1 F4 */ - FMUL_S( M(5) ) - - FXCH( ST(1) ) /* F4 F1 */ - FADD_S( M(12) ) - FLD_S( M(13) ) /* F5 F4 F1 */ - FXCH( ST(2) ) /* F1 F4 F5 */ - FADDP( ST(0), ST(2) ) /* F4 F5 */ - - FSTP_S( D(0) ) /* F5 */ - FSTP_S( D(1) ) /* */ - MOV_L( EBX, D(2) ) - - MOV_L( CONST(FP_ONE), D(3) ) -LLBL(p2m3dnrv8_skip): - ADD_L( CONST(32), EDI ) - ADD_L( EAX, ESI ) - DEC_L( ECX ) - JNZ( LLBL(p2m3dnrv8_top) ) - - -LLBL(p2m3dnrv8_finish): - POP_L( EBX ) - POP_L( EDI ) - POP_L( ESI ) - RET -#undef FRAME_OFFSET - -/* -######################################## -## -## gl_x86_transform_points2_perspective -## -## -*/ - GLOBL GLNAME(gl_x86_transform_points2_perspective_v8) - ALIGNTEXT4 -GLNAME(gl_x86_transform_points2_perspective_v8): - -#define FRAME_OFFSET 12 - PUSH_L( ESI ) - PUSH_L( EDI ) - - PUSH_L( EBX ) - - MOV_L( ARG_SOURCE, ESI ) /* ptr to source */ - MOV_L( ARG_DEST, EDI ) /* ptr to dest */ - - MOV_L( ARG_MATRIX, EDX ) /* ptr to matrix */ - MOV_L( ARG_COUNT, ECX ) /* count */ - - TEST_L( ECX, ECX) - JZ( LLBL(p2mpv8_finish) ) /* count was zero; go to finish */ - - MOV_L( ARG_STRIDE, EAX ) /* stride */ - - - MOV_L( M(14), EBX ) - ALIGNTEXT4ifNOP -LLBL(p2mpv8_top): - - - FLD_S( S(0) ) /* F4 */ - FMUL_S( M(0) ) - - FLD_S( S(1) ) /* F1 F4 */ - FMUL_S( M(5) ) - - FXCH( ST(1) ) /* F4 F1 */ - FSTP_S( D(0) ) /* F1 */ - FSTP_S( D(1) ) /* */ - MOV_L( EBX, D(2) ) - MOV_L( CONST(FP_ZERO), D(3) ) - -LLBL(p2mpv8_skip): - ADD_L( CONST(32), EDI ) - ADD_L( EAX, ESI ) - DEC_L( ECX ) - JNZ( LLBL(p2mpv8_top) ) - - -LLBL(p2mpv8_finish): - POP_L( EBX ) - POP_L( EDI ) - POP_L( ESI ) - RET -#undef FRAME_OFFSET - -/* -######################################## -## -## gl_x86_transform_points3_general -## -## -*/ - GLOBL GLNAME(gl_x86_transform_points3_general_v8) - ALIGNTEXT4 -GLNAME(gl_x86_transform_points3_general_v8): - -#define FRAME_OFFSET 8 - PUSH_L( ESI ) - PUSH_L( EDI ) - - - MOV_L( ARG_SOURCE, ESI ) /* ptr to source */ - MOV_L( ARG_DEST, EDI ) /* ptr to dest */ - - MOV_L( ARG_MATRIX, EDX ) /* ptr to matrix */ - MOV_L( ARG_COUNT, ECX ) /* count */ - - TEST_L( ECX, ECX) - JZ( LLBL(p3mgv8_finish) ) /* count was zero; go to finish */ - - MOV_L( ARG_STRIDE, EAX ) /* stride */ - - - ALIGNTEXT4ifNOP -LLBL(p3mgv8_top): - - - FLD_S( S(0) ) /* F4 */ - FMUL_S( M(0) ) - FLD_S( S(0) ) /* F5 F4 */ - FMUL_S( M(1) ) - FLD_S( S(0) ) /* F6 F5 F4 */ - FMUL_S( M(2) ) - FLD_S( S(0) ) /* F7 F6 F5 F4 */ - FMUL_S( M(3) ) - - FLD_S( S(1) ) /* F0 F7 F6 F5 F4 */ - FMUL_S( M(4) ) - FLD_S( S(1) ) /* F1 F0 F7 F6 F5 F4 */ - FMUL_S( M(5) ) - FLD_S( S(1) ) /* F2 F1 F0 F7 F6 F5 F4 */ - FMUL_S( M(6) ) - FLD_S( S(1) ) /* F3 F2 F1 F0 F7 F6 F5 F4 */ - FMUL_S( M(7) ) - - FXCH( ST(3) ) /* F0 F2 F1 F3 F7 F6 F5 F4 */ - FADDP( ST(0), ST(7) ) /* F2 F1 F3 F7 F6 F5 F4 */ - FXCH( ST(1) ) /* F1 F2 F3 F7 F6 F5 F4 */ - FADDP( ST(0), ST(5) ) /* F2 F3 F7 F6 F5 F4 */ - FADDP( ST(0), ST(3) ) /* F3 F7 F6 F5 F4 */ - FADDP( ST(0), ST(1) ) /* F7 F6 F5 F4 */ - - FLD_S( S(2) ) /* F0 F7 F6 F5 F4 */ - FMUL_S( M(8) ) - FLD_S( S(2) ) /* F1 F0 F7 F6 F5 F4 */ - FMUL_S( M(9) ) - FLD_S( S(2) ) /* F2 F1 F0 F7 F6 F5 F4 */ - FMUL_S( M(10) ) - FLD_S( S(2) ) /* F3 F2 F1 F0 F7 F6 F5 F4 */ - FMUL_S( M(11) ) - - FXCH( ST(3) ) /* F0 F2 F1 F3 F7 F6 F5 F4 */ - FADDP( ST(0), ST(7) ) /* F2 F1 F3 F7 F6 F5 F4 */ - FXCH( ST(1) ) /* F1 F2 F3 F7 F6 F5 F4 */ - FADDP( ST(0), ST(5) ) /* F2 F3 F7 F6 F5 F4 */ - FADDP( ST(0), ST(3) ) /* F3 F7 F6 F5 F4 */ - FADDP( ST(0), ST(1) ) /* F7 F6 F5 F4 */ - - FXCH( ST(3) ) /* F4 F6 F5 F7 */ - FADD_S( M(12) ) - FXCH( ST(2) ) /* F5 F6 F4 F7 */ - FADD_S( M(13) ) - FXCH( ST(1) ) /* F6 F5 F4 F7 */ - FADD_S( M(14) ) - FXCH( ST(3) ) /* F7 F5 F4 F6 */ - FADD_S( M(15) ) - - FXCH( ST(2) ) /* F4 F5 F7 F6 */ - FSTP_S( D(0) ) /* F5 F7 F6 */ - FSTP_S( D(1) ) /* F7 F6 */ - FXCH( ST(1) ) /* F6 F7 */ - FSTP_S( D(2) ) /* F7 */ - FSTP_S( D(3) ) /* */ - -LLBL(p3mgv8_skip): - ADD_L( CONST(32), EDI ) - ADD_L( EAX, ESI ) - DEC_L( ECX ) - JNZ( LLBL(p3mgv8_top) ) - - -LLBL(p3mgv8_finish): - POP_L( EDI ) - POP_L( ESI ) - RET -#undef FRAME_OFFSET - -/* -######################################## -## -## gl_x86_transform_points3_identity -## -## -*/ - GLOBL GLNAME(gl_x86_transform_points3_identity_v8) - ALIGNTEXT4 -GLNAME(gl_x86_transform_points3_identity_v8): - -#define FRAME_OFFSET 16 - PUSH_L( ESI ) - PUSH_L( EDI ) - - PUSH_L( EBX ) - PUSH_L( EBP ) - - MOV_L( ARG_SOURCE, ESI ) /* ptr to source */ - MOV_L( ARG_DEST, EDI ) /* ptr to dest */ - - MOV_L( ARG_MATRIX, EDX ) /* ptr to matrix */ - MOV_L( ARG_COUNT, ECX ) /* count */ - - TEST_L( ECX, ECX) - JZ( LLBL(p3miv8_finish) ) /* count was zero; go to finish */ - - MOV_L( ARG_STRIDE, EAX ) /* stride */ - - - CMP_L( ESI, EDI ) - JE( LLBL(p3miv8_finish) ) - - ALIGNTEXT4ifNOP -LLBL(p3miv8_top): - - MOV_L( S(0), EBX ) - MOV_L( S(1), EBP ) - MOV_L( S(2), EDX ) - - MOV_L( EBX, D(0) ) - MOV_L( EBP, D(1) ) - MOV_L( EDX, D(2) ) - MOV_L( CONST(FP_ONE), D(3) ) -LLBL(p3miv8_skip): - ADD_L( CONST(32), EDI ) - ADD_L( EAX, ESI ) - DEC_L( ECX ) - JNZ( LLBL(p3miv8_top) ) - - -LLBL(p3miv8_finish): - POP_L( EBP ) - POP_L( EBX ) - POP_L( EDI ) - POP_L( ESI ) - RET -#undef FRAME_OFFSET - -/* -######################################## -## -## gl_x86_transform_points3_2d -## -## -*/ - GLOBL GLNAME(gl_x86_transform_points3_2d_v8) - ALIGNTEXT4 -GLNAME(gl_x86_transform_points3_2d_v8): - -#define FRAME_OFFSET 12 - PUSH_L( ESI ) - PUSH_L( EDI ) - - PUSH_L( EBX ) - - MOV_L( ARG_SOURCE, ESI ) /* ptr to source */ - MOV_L( ARG_DEST, EDI ) /* ptr to dest */ - - MOV_L( ARG_MATRIX, EDX ) /* ptr to matrix */ - MOV_L( ARG_COUNT, ECX ) /* count */ - - TEST_L( ECX, ECX) - JZ( LLBL(p3m2dv8_finish) ) /* count was zero; go to finish */ - - MOV_L( ARG_STRIDE, EAX ) /* stride */ - - - ALIGNTEXT4ifNOP -LLBL(p3m2dv8_top): - - - FLD_S( S(0) ) /* F4 */ - FMUL_S( M(0) ) - FLD_S( S(0) ) /* F5 F4 */ - FMUL_S( M(1) ) - - FLD_S( S(1) ) /* F0 F5 F4 */ - FMUL_S( M(4) ) - FLD_S( S(1) ) /* F1 F0 F5 F4 */ - FMUL_S( M(5) ) - - FXCH( ST(1) ) /* F0 F1 F5 F4 */ - FADDP( ST(0), ST(3) ) /* F1 F5 F4 */ - FADDP( ST(0), ST(1) ) /* F5 F4 */ - - FXCH( ST(1) ) /* F4 F5 */ - FADD_S( M(12) ) - FXCH( ST(1) ) /* F5 F4 */ - FADD_S( M(13) ) - - MOV_L( S(2), EBX ) - - FXCH( ST(1) ) /* F4 F5 */ - FSTP_S( D(0) ) /* F5 */ - FSTP_S( D(1) ) /* */ - MOV_L( EBX, D(2) ) - - MOV_L( CONST(FP_ONE), D(3) ) -LLBL(p3m2dv8_skip): - ADD_L( CONST(32), EDI ) - ADD_L( EAX, ESI ) - DEC_L( ECX ) - JNZ( LLBL(p3m2dv8_top) ) - - -LLBL(p3m2dv8_finish): - POP_L( EBX ) - POP_L( EDI ) - POP_L( ESI ) - RET -#undef FRAME_OFFSET - -/* -######################################## -## -## gl_x86_transform_points3_2d_no_rot -## -## -*/ - GLOBL GLNAME(gl_x86_transform_points3_2d_no_rot_v8) - ALIGNTEXT4 -GLNAME(gl_x86_transform_points3_2d_no_rot_v8): - -#define FRAME_OFFSET 12 - PUSH_L( ESI ) - PUSH_L( EDI ) - - PUSH_L( EBX ) - - MOV_L( ARG_SOURCE, ESI ) /* ptr to source */ - MOV_L( ARG_DEST, EDI ) /* ptr to dest */ - - MOV_L( ARG_MATRIX, EDX ) /* ptr to matrix */ - MOV_L( ARG_COUNT, ECX ) /* count */ - - TEST_L( ECX, ECX) - JZ( LLBL(p3m2dnrv8_finish) ) /* count was zero; go to finish */ - - MOV_L( ARG_STRIDE, EAX ) /* stride */ - - - ALIGNTEXT4ifNOP -LLBL(p3m2dnrv8_top): - - - FLD_S( S(0) ) /* F4 */ - FMUL_S( M(0) ) - - FLD_S( S(1) ) /* F1 F4 */ - FMUL_S( M(5) ) - - FXCH( ST(1) ) /* F4 F1 */ - FADD_S( M(12) ) - FLD_S( M(13) ) /* F5 F4 F1 */ - - FXCH( ST(2) ) /* F1 F4 F5 */ - FADDP( ST(0), ST(2) ) /* F4 F5 */ - - MOV_L( S(2), EBX ) - - FSTP_S( D(0) ) /* F5 */ - FSTP_S( D(1) ) /* */ - MOV_L( EBX, D(2) ) - - MOV_L( CONST(FP_ONE), D(3) ) -LLBL(p3m2dnrv8_skip): - ADD_L( CONST(32), EDI ) - ADD_L( EAX, ESI ) - DEC_L( ECX ) - JNZ( LLBL(p3m2dnrv8_top) ) - - -LLBL(p3m2dnrv8_finish): - POP_L( EBX ) - POP_L( EDI ) - POP_L( ESI ) - RET -#undef FRAME_OFFSET - -/* -######################################## -## -## gl_x86_transform_points3_3d -## -## -*/ - GLOBL GLNAME(gl_x86_transform_points3_3d_v8) - ALIGNTEXT4 -GLNAME(gl_x86_transform_points3_3d_v8): - -#define FRAME_OFFSET 8 - PUSH_L( ESI ) - PUSH_L( EDI ) - - - MOV_L( ARG_SOURCE, ESI ) /* ptr to source */ - MOV_L( ARG_DEST, EDI ) /* ptr to dest */ - - MOV_L( ARG_MATRIX, EDX ) /* ptr to matrix */ - MOV_L( ARG_COUNT, ECX ) /* count */ - - TEST_L( ECX, ECX) - JZ( LLBL(p3m3dv8_finish) ) /* count was zero; go to finish */ - - MOV_L( ARG_STRIDE, EAX ) /* stride */ - - - ALIGNTEXT4ifNOP -LLBL(p3m3dv8_top): - - - FLD_S( S(0) ) /* F4 */ - FMUL_S( M(0) ) - FLD_S( S(0) ) /* F5 F4 */ - FMUL_S( M(1) ) - FLD_S( S(0) ) /* F6 F5 F4 */ - FMUL_S( M(2) ) - - FLD_S( S(1) ) /* F0 F6 F5 F4 */ - FMUL_S( M(4) ) - FLD_S( S(1) ) /* F1 F0 F6 F5 F4 */ - FMUL_S( M(5) ) - FLD_S( S(1) ) /* F2 F1 F0 F6 F5 F4 */ - FMUL_S( M(6) ) - - FXCH( ST(2) ) /* F0 F1 F2 F6 F5 F4 */ - FADDP( ST(0), ST(5) ) /* F1 F2 F6 F5 F4 */ - FADDP( ST(0), ST(3) ) /* F2 F6 F5 F4 */ - FADDP( ST(0), ST(1) ) /* F6 F5 F4 */ - - FLD_S( S(2) ) /* F0 F6 F5 F4 */ - FMUL_S( M(8) ) - FLD_S( S(2) ) /* F1 F0 F6 F5 F4 */ - FMUL_S( M(9) ) - FLD_S( S(2) ) /* F2 F1 F0 F6 F5 F4 */ - FMUL_S( M(10) ) - - FXCH( ST(2) ) /* F0 F1 F2 F6 F5 F4 */ - FADDP( ST(0), ST(5) ) /* F1 F2 F6 F5 F4 */ - FADDP( ST(0), ST(3) ) /* F2 F6 F5 F4 */ - FADDP( ST(0), ST(1) ) /* F6 F5 F4 */ - - FXCH( ST(2) ) /* F4 F5 F6 */ - FADD_S( M(12) ) - FXCH( ST(1) ) /* F5 F4 F6 */ - FADD_S( M(13) ) - FXCH( ST(2) ) /* F6 F4 F5 */ - FADD_S( M(14) ) - - FXCH( ST(1) ) /* F4 F6 F5 */ - FSTP_S( D(0) ) /* F6 F5 */ - FXCH( ST(1) ) /* F5 F6 */ - FSTP_S( D(1) ) /* F6 */ - FSTP_S( D(2) ) /* */ - - MOV_L( CONST(FP_ONE), D(3) ) -LLBL(p3m3dv8_skip): - ADD_L( CONST(32), EDI ) - ADD_L( EAX, ESI ) - DEC_L( ECX ) - JNZ( LLBL(p3m3dv8_top) ) - - -LLBL(p3m3dv8_finish): - POP_L( EDI ) - POP_L( ESI ) - RET -#undef FRAME_OFFSET - -/* -######################################## -## -## gl_x86_transform_points3_3d_no_rot -## -## -*/ - GLOBL GLNAME(gl_x86_transform_points3_3d_no_rot_v8) - ALIGNTEXT4 -GLNAME(gl_x86_transform_points3_3d_no_rot_v8): - -#define FRAME_OFFSET 8 - PUSH_L( ESI ) - PUSH_L( EDI ) - - - MOV_L( ARG_SOURCE, ESI ) /* ptr to source */ - MOV_L( ARG_DEST, EDI ) /* ptr to dest */ - - MOV_L( ARG_MATRIX, EDX ) /* ptr to matrix */ - MOV_L( ARG_COUNT, ECX ) /* count */ - - TEST_L( ECX, ECX) - JZ( LLBL(p3m3dnrv8_finish) ) /* count was zero; go to finish */ - - MOV_L( ARG_STRIDE, EAX ) /* stride */ - - - ALIGNTEXT4ifNOP -LLBL(p3m3dnrv8_top): - - - FLD_S( S(0) ) /* F4 */ - FMUL_S( M(0) ) - - FLD_S( S(1) ) /* F1 F4 */ - FMUL_S( M(5) ) - - FLD_S( S(2) ) /* F2 F1 F4 */ - FMUL_S( M(10) ) - - FXCH( ST(2) ) /* F4 F1 F2 */ - FADD_S( M(12) ) - FLD_S( M(13) ) /* F5 F4 F1 F2 */ - FXCH( ST(2) ) /* F1 F4 F5 F2 */ - FADDP( ST(0), ST(2) ) /* F4 F5 F2 */ - FLD_S( M(14) ) /* F6 F4 F5 F2 */ - FXCH( ST(3) ) /* F2 F4 F5 F6 */ - FADDP( ST(0), ST(3) ) /* F4 F5 F6 */ - - FSTP_S( D(0) ) /* F5 F6 */ - FSTP_S( D(1) ) /* F6 */ - FSTP_S( D(2) ) /* */ - - MOV_L( CONST(FP_ONE), D(3) ) -LLBL(p3m3dnrv8_skip): - ADD_L( CONST(32), EDI ) - ADD_L( EAX, ESI ) - DEC_L( ECX ) - JNZ( LLBL(p3m3dnrv8_top) ) - - -LLBL(p3m3dnrv8_finish): - POP_L( EDI ) - POP_L( ESI ) - RET -#undef FRAME_OFFSET - -/* -######################################## -## -## gl_x86_transform_points3_perspective -## -## -*/ - GLOBL GLNAME(gl_x86_transform_points3_perspective_v8) - ALIGNTEXT4 -GLNAME(gl_x86_transform_points3_perspective_v8): - -#define FRAME_OFFSET 12 - PUSH_L( ESI ) - PUSH_L( EDI ) - - PUSH_L( EBX ) - - MOV_L( ARG_SOURCE, ESI ) /* ptr to source */ - MOV_L( ARG_DEST, EDI ) /* ptr to dest */ - - MOV_L( ARG_MATRIX, EDX ) /* ptr to matrix */ - MOV_L( ARG_COUNT, ECX ) /* count */ - - TEST_L( ECX, ECX) - JZ( LLBL(p3mpv8_finish) ) /* count was zero; go to finish */ - - MOV_L( ARG_STRIDE, EAX ) /* stride */ - - - ALIGNTEXT4ifNOP -LLBL(p3mpv8_top): - - - FLD_S( S(0) ) /* F4 */ - FMUL_S( M(0) ) - - FLD_S( S(1) ) /* F5 F4 */ - FMUL_S( M(5) ) - - FLD_S( S(2) ) /* F0 F5 F4 */ - FMUL_S( M(8) ) - FLD_S( S(2) ) /* F1 F0 F5 F4 */ - FMUL_S( M(9) ) - FLD_S( S(2) ) /* F2 F1 F0 F5 F4 */ - FMUL_S( M(10) ) - - FXCH( ST(2) ) /* F0 F1 F2 F5 F4 */ - FADDP( ST(0), ST(4) ) /* F1 F2 F5 F4 */ - FADDP( ST(0), ST(2) ) /* F2 F5 F4 */ - FLD_S( M(14) ) /* F6 F2 F5 F4 */ - FXCH( ST(1) ) /* F2 F6 F5 F4 */ - FADDP( ST(0), ST(1) ) /* F6 F5 F4 */ - - MOV_L( S(2), EBX ) - XOR_L( CONST(-2147483648), EBX ) /* change sign */ - - FXCH( ST(2) ) /* F4 F5 F6 */ - FSTP_S( D(0) ) /* F5 F6 */ - FSTP_S( D(1) ) /* F6 */ - FSTP_S( D(2) ) /* */ - MOV_L( EBX, D(3) ) - -LLBL(p3mpv8_skip): - ADD_L( CONST(32), EDI ) - ADD_L( EAX, ESI ) - DEC_L( ECX ) - JNZ( LLBL(p3mpv8_top) ) - - -LLBL(p3mpv8_finish): - POP_L( EBX ) - POP_L( EDI ) - POP_L( ESI ) - RET -#undef FRAME_OFFSET - -/* -######################################## -## -## gl_x86_transform_points4_general -## -## -*/ - GLOBL GLNAME(gl_x86_transform_points4_general_v8) - ALIGNTEXT4 -GLNAME(gl_x86_transform_points4_general_v8): - -#define FRAME_OFFSET 8 - PUSH_L( ESI ) - PUSH_L( EDI ) - - - MOV_L( ARG_SOURCE, ESI ) /* ptr to source */ - MOV_L( ARG_DEST, EDI ) /* ptr to dest */ - - MOV_L( ARG_MATRIX, EDX ) /* ptr to matrix */ - MOV_L( ARG_COUNT, ECX ) /* count */ - - TEST_L( ECX, ECX) - JZ( LLBL(p4mgv8_finish) ) /* count was zero; go to finish */ - - MOV_L( ARG_STRIDE, EAX ) /* stride */ - - - ALIGNTEXT4ifNOP -LLBL(p4mgv8_top): - - - FLD_S( S(0) ) /* F4 */ - FMUL_S( M(0) ) - FLD_S( S(0) ) /* F5 F4 */ - FMUL_S( M(1) ) - FLD_S( S(0) ) /* F6 F5 F4 */ - FMUL_S( M(2) ) - FLD_S( S(0) ) /* F7 F6 F5 F4 */ - FMUL_S( M(3) ) - - FLD_S( S(1) ) /* F0 F7 F6 F5 F4 */ - FMUL_S( M(4) ) - FLD_S( S(1) ) /* F1 F0 F7 F6 F5 F4 */ - FMUL_S( M(5) ) - FLD_S( S(1) ) /* F2 F1 F0 F7 F6 F5 F4 */ - FMUL_S( M(6) ) - FLD_S( S(1) ) /* F3 F2 F1 F0 F7 F6 F5 F4 */ - FMUL_S( M(7) ) - - FXCH( ST(3) ) /* F0 F2 F1 F3 F7 F6 F5 F4 */ - FADDP( ST(0), ST(7) ) /* F2 F1 F3 F7 F6 F5 F4 */ - FXCH( ST(1) ) /* F1 F2 F3 F7 F6 F5 F4 */ - FADDP( ST(0), ST(5) ) /* F2 F3 F7 F6 F5 F4 */ - FADDP( ST(0), ST(3) ) /* F3 F7 F6 F5 F4 */ - FADDP( ST(0), ST(1) ) /* F7 F6 F5 F4 */ - - FLD_S( S(2) ) /* F0 F7 F6 F5 F4 */ - FMUL_S( M(8) ) - FLD_S( S(2) ) /* F1 F0 F7 F6 F5 F4 */ - FMUL_S( M(9) ) - FLD_S( S(2) ) /* F2 F1 F0 F7 F6 F5 F4 */ - FMUL_S( M(10) ) - FLD_S( S(2) ) /* F3 F2 F1 F0 F7 F6 F5 F4 */ - FMUL_S( M(11) ) - - FXCH( ST(3) ) /* F0 F2 F1 F3 F7 F6 F5 F4 */ - FADDP( ST(0), ST(7) ) /* F2 F1 F3 F7 F6 F5 F4 */ - FXCH( ST(1) ) /* F1 F2 F3 F7 F6 F5 F4 */ - FADDP( ST(0), ST(5) ) /* F2 F3 F7 F6 F5 F4 */ - FADDP( ST(0), ST(3) ) /* F3 F7 F6 F5 F4 */ - FADDP( ST(0), ST(1) ) /* F7 F6 F5 F4 */ - - FLD_S( S(3) ) /* F0 F7 F6 F5 F4 */ - FMUL_S( M(12) ) - FLD_S( S(3) ) /* F1 F0 F7 F6 F5 F4 */ - FMUL_S( M(13) ) - FLD_S( S(3) ) /* F2 F1 F0 F7 F6 F5 F4 */ - FMUL_S( M(14) ) - FLD_S( S(3) ) /* F3 F2 F1 F0 F7 F6 F5 F4 */ - FMUL_S( M(15) ) - - FXCH( ST(3) ) /* F0 F2 F1 F3 F7 F6 F5 F4 */ - FADDP( ST(0), ST(7) ) /* F2 F1 F3 F7 F6 F5 F4 */ - FXCH( ST(1) ) /* F1 F2 F3 F7 F6 F5 F4 */ - FADDP( ST(0), ST(5) ) /* F2 F3 F7 F6 F5 F4 */ - FADDP( ST(0), ST(3) ) /* F3 F7 F6 F5 F4 */ - FADDP( ST(0), ST(1) ) /* F7 F6 F5 F4 */ - - FXCH( ST(3) ) /* F4 F6 F5 F7 */ - FSTP_S( D(0) ) /* F6 F5 F7 */ - FXCH( ST(1) ) /* F5 F6 F7 */ - FSTP_S( D(1) ) /* F6 F7 */ - FSTP_S( D(2) ) /* F7 */ - FSTP_S( D(3) ) /* */ - -LLBL(p4mgv8_skip): - ADD_L( CONST(32), EDI ) - ADD_L( EAX, ESI ) - DEC_L( ECX ) - JNZ( LLBL(p4mgv8_top) ) - - -LLBL(p4mgv8_finish): - POP_L( EDI ) - POP_L( ESI ) - RET -#undef FRAME_OFFSET - -/* -######################################## -## -## gl_x86_transform_points4_identity -## -## -*/ - GLOBL GLNAME(gl_x86_transform_points4_identity_v8) - ALIGNTEXT4 -GLNAME(gl_x86_transform_points4_identity_v8): - -#define FRAME_OFFSET 12 - PUSH_L( ESI ) - PUSH_L( EDI ) - - PUSH_L( EBX ) - - MOV_L( ARG_SOURCE, ESI ) /* ptr to source */ - MOV_L( ARG_DEST, EDI ) /* ptr to dest */ - - MOV_L( ARG_MATRIX, EDX ) /* ptr to matrix */ - MOV_L( ARG_COUNT, ECX ) /* count */ - - TEST_L( ECX, ECX) - JZ( LLBL(p4miv8_finish) ) /* count was zero; go to finish */ - - MOV_L( ARG_STRIDE, EAX ) /* stride */ - - - CMP_L( ESI, EDI ) - JE( LLBL(p4miv8_finish) ) - - ALIGNTEXT4ifNOP -LLBL(p4miv8_top): - - MOV_L( S(0), EBX ) - MOV_L( S(1), EDX ) - - MOV_L( EBX, D(0) ) - MOV_L( EDX, D(1) ) - - MOV_L( S(2), EBX ) - MOV_L( S(3), EDX ) - - MOV_L( EBX, D(2) ) - MOV_L( EDX, D(3) ) -LLBL(p4miv8_skip): - ADD_L( CONST(32), EDI ) - ADD_L( EAX, ESI ) - DEC_L( ECX ) - JNZ( LLBL(p4miv8_top) ) - - -LLBL(p4miv8_finish): - POP_L( EBX ) - POP_L( EDI ) - POP_L( ESI ) - RET -#undef FRAME_OFFSET - -/* -######################################## -## -## gl_x86_transform_points4_2d -## -## -*/ - GLOBL GLNAME(gl_x86_transform_points4_2d_v8) - ALIGNTEXT4 -GLNAME(gl_x86_transform_points4_2d_v8): - -#define FRAME_OFFSET 16 - PUSH_L( ESI ) - PUSH_L( EDI ) - - PUSH_L( EBX ) - PUSH_L( EBP ) - - MOV_L( ARG_SOURCE, ESI ) /* ptr to source */ - MOV_L( ARG_DEST, EDI ) /* ptr to dest */ - - MOV_L( ARG_MATRIX, EDX ) /* ptr to matrix */ - MOV_L( ARG_COUNT, ECX ) /* count */ - - TEST_L( ECX, ECX) - JZ( LLBL(p4m2dv8_finish) ) /* count was zero; go to finish */ - - MOV_L( ARG_STRIDE, EAX ) /* stride */ - - - ALIGNTEXT4ifNOP -LLBL(p4m2dv8_top): - - - FLD_S( S(0) ) /* F4 */ - FMUL_S( M(0) ) - FLD_S( S(0) ) /* F5 F4 */ - FMUL_S( M(1) ) - - FLD_S( S(1) ) /* F0 F5 F4 */ - FMUL_S( M(4) ) - FLD_S( S(1) ) /* F1 F0 F5 F4 */ - FMUL_S( M(5) ) - - FXCH( ST(1) ) /* F0 F1 F5 F4 */ - FADDP( ST(0), ST(3) ) /* F1 F5 F4 */ - FADDP( ST(0), ST(1) ) /* F5 F4 */ - - FLD_S( S(3) ) /* F0 F5 F4 */ - FMUL_S( M(12) ) - FLD_S( S(3) ) /* F1 F0 F5 F4 */ - FMUL_S( M(13) ) - - FXCH( ST(1) ) /* F0 F1 F5 F4 */ - FADDP( ST(0), ST(3) ) /* F1 F5 F4 */ - FADDP( ST(0), ST(1) ) /* F5 F4 */ - - MOV_L( S(2), EBX ) - MOV_L( S(3), EBP ) - - FXCH( ST(1) ) /* F4 F5 */ - FSTP_S( D(0) ) /* F5 */ - FSTP_S( D(1) ) /* */ - MOV_L( EBX, D(2) ) - MOV_L( EBP, D(3) ) - -LLBL(p4m2dv8_skip): - ADD_L( CONST(32), EDI ) - ADD_L( EAX, ESI ) - DEC_L( ECX ) - JNZ( LLBL(p4m2dv8_top) ) - - -LLBL(p4m2dv8_finish): - POP_L( EBP ) - POP_L( EBX ) - POP_L( EDI ) - POP_L( ESI ) - RET -#undef FRAME_OFFSET - -/* -######################################## -## -## gl_x86_transform_points4_2d_no_rot -## -## -*/ - GLOBL GLNAME(gl_x86_transform_points4_2d_no_rot_v8) - ALIGNTEXT4 -GLNAME(gl_x86_transform_points4_2d_no_rot_v8): - -#define FRAME_OFFSET 16 - PUSH_L( ESI ) - PUSH_L( EDI ) - - PUSH_L( EBX ) - PUSH_L( EBP ) - - MOV_L( ARG_SOURCE, ESI ) /* ptr to source */ - MOV_L( ARG_DEST, EDI ) /* ptr to dest */ - - MOV_L( ARG_MATRIX, EDX ) /* ptr to matrix */ - MOV_L( ARG_COUNT, ECX ) /* count */ - - TEST_L( ECX, ECX) - JZ( LLBL(p4m2dnrv8_finish) ) /* count was zero; go to finish */ - - MOV_L( ARG_STRIDE, EAX ) /* stride */ - - - ALIGNTEXT4ifNOP -LLBL(p4m2dnrv8_top): - - - FLD_S( S(0) ) /* F4 */ - FMUL_S( M(0) ) - - FLD_S( S(1) ) /* F5 F4 */ - FMUL_S( M(5) ) - - FLD_S( S(3) ) /* F0 F5 F4 */ - FMUL_S( M(12) ) - FLD_S( S(3) ) /* F1 F0 F5 F4 */ - FMUL_S( M(13) ) - - FXCH( ST(1) ) /* F0 F1 F5 F4 */ - FADDP( ST(0), ST(3) ) /* F1 F5 F4 */ - FADDP( ST(0), ST(1) ) /* F5 F4 */ - - MOV_L( S(2), EBX ) - MOV_L( S(3), EBP ) - - FXCH( ST(1) ) /* F4 F5 */ - FSTP_S( D(0) ) /* F5 */ - FSTP_S( D(1) ) /* */ - MOV_L( EBX, D(2) ) - MOV_L( EBP, D(3) ) - -LLBL(p4m2dnrv8_skip): - ADD_L( CONST(32), EDI ) - ADD_L( EAX, ESI ) - DEC_L( ECX ) - JNZ( LLBL(p4m2dnrv8_top) ) - - -LLBL(p4m2dnrv8_finish): - POP_L( EBP ) - POP_L( EBX ) - POP_L( EDI ) - POP_L( ESI ) - RET -#undef FRAME_OFFSET - -/* -######################################## -## -## gl_x86_transform_points4_3d -## -## -*/ - GLOBL GLNAME(gl_x86_transform_points4_3d_v8) - ALIGNTEXT4 -GLNAME(gl_x86_transform_points4_3d_v8): - -#define FRAME_OFFSET 12 - PUSH_L( ESI ) - PUSH_L( EDI ) - - PUSH_L( EBX ) - - MOV_L( ARG_SOURCE, ESI ) /* ptr to source */ - MOV_L( ARG_DEST, EDI ) /* ptr to dest */ - - MOV_L( ARG_MATRIX, EDX ) /* ptr to matrix */ - MOV_L( ARG_COUNT, ECX ) /* count */ - - TEST_L( ECX, ECX) - JZ( LLBL(p4m3dv8_finish) ) /* count was zero; go to finish */ - - MOV_L( ARG_STRIDE, EAX ) /* stride */ - - - ALIGNTEXT4ifNOP -LLBL(p4m3dv8_top): - - - FLD_S( S(0) ) /* F4 */ - FMUL_S( M(0) ) - FLD_S( S(0) ) /* F5 F4 */ - FMUL_S( M(1) ) - FLD_S( S(0) ) /* F6 F5 F4 */ - FMUL_S( M(2) ) - - FLD_S( S(1) ) /* F0 F6 F5 F4 */ - FMUL_S( M(4) ) - FLD_S( S(1) ) /* F1 F0 F6 F5 F4 */ - FMUL_S( M(5) ) - FLD_S( S(1) ) /* F2 F1 F0 F6 F5 F4 */ - FMUL_S( M(6) ) - - FXCH( ST(2) ) /* F0 F1 F2 F6 F5 F4 */ - FADDP( ST(0), ST(5) ) /* F1 F2 F6 F5 F4 */ - FADDP( ST(0), ST(3) ) /* F2 F6 F5 F4 */ - FADDP( ST(0), ST(1) ) /* F6 F5 F4 */ - - FLD_S( S(2) ) /* F0 F6 F5 F4 */ - FMUL_S( M(8) ) - FLD_S( S(2) ) /* F1 F0 F6 F5 F4 */ - FMUL_S( M(9) ) - FLD_S( S(2) ) /* F2 F1 F0 F6 F5 F4 */ - FMUL_S( M(10) ) - - FXCH( ST(2) ) /* F0 F1 F2 F6 F5 F4 */ - FADDP( ST(0), ST(5) ) /* F1 F2 F6 F5 F4 */ - FADDP( ST(0), ST(3) ) /* F2 F6 F5 F4 */ - FADDP( ST(0), ST(1) ) /* F6 F5 F4 */ - - FLD_S( S(3) ) /* F0 F6 F5 F4 */ - FMUL_S( M(12) ) - FLD_S( S(3) ) /* F1 F0 F6 F5 F4 */ - FMUL_S( M(13) ) - FLD_S( S(3) ) /* F2 F1 F0 F6 F5 F4 */ - FMUL_S( M(14) ) - - FXCH( ST(2) ) /* F0 F1 F2 F6 F5 F4 */ - FADDP( ST(0), ST(5) ) /* F1 F2 F6 F5 F4 */ - FADDP( ST(0), ST(3) ) /* F2 F6 F5 F4 */ - FADDP( ST(0), ST(1) ) /* F6 F5 F4 */ - - MOV_L( S(3), EBX ) - - FXCH( ST(2) ) /* F4 F5 F6 */ - FSTP_S( D(0) ) /* F5 F6 */ - FSTP_S( D(1) ) /* F6 */ - FSTP_S( D(2) ) /* */ - MOV_L( EBX, D(3) ) - -LLBL(p4m3dv8_skip): - ADD_L( CONST(32), EDI ) - ADD_L( EAX, ESI ) - DEC_L( ECX ) - JNZ( LLBL(p4m3dv8_top) ) - - -LLBL(p4m3dv8_finish): - POP_L( EBX ) - POP_L( EDI ) - POP_L( ESI ) - RET -#undef FRAME_OFFSET - -/* -######################################## -## -## gl_x86_transform_points4_3d_no_rot -## -## -*/ - GLOBL GLNAME(gl_x86_transform_points4_3d_no_rot_v8) - ALIGNTEXT4 -GLNAME(gl_x86_transform_points4_3d_no_rot_v8): - -#define FRAME_OFFSET 12 - PUSH_L( ESI ) - PUSH_L( EDI ) - - PUSH_L( EBX ) - - MOV_L( ARG_SOURCE, ESI ) /* ptr to source */ - MOV_L( ARG_DEST, EDI ) /* ptr to dest */ - - MOV_L( ARG_MATRIX, EDX ) /* ptr to matrix */ - MOV_L( ARG_COUNT, ECX ) /* count */ - - TEST_L( ECX, ECX) - JZ( LLBL(p4m3dnrv8_finish) ) /* count was zero; go to finish */ - - MOV_L( ARG_STRIDE, EAX ) /* stride */ - - - ALIGNTEXT4ifNOP -LLBL(p4m3dnrv8_top): - - - FLD_S( S(0) ) /* F4 */ - FMUL_S( M(0) ) - - FLD_S( S(1) ) /* F5 F4 */ - FMUL_S( M(5) ) - - FLD_S( S(2) ) /* F6 F5 F4 */ - FMUL_S( M(10) ) - - FLD_S( S(3) ) /* F0 F6 F5 F4 */ - FMUL_S( M(12) ) - FLD_S( S(3) ) /* F1 F0 F6 F5 F4 */ - FMUL_S( M(13) ) - FLD_S( S(3) ) /* F2 F1 F0 F6 F5 F4 */ - FMUL_S( M(14) ) - - FXCH( ST(2) ) /* F0 F1 F2 F6 F5 F4 */ - FADDP( ST(0), ST(5) ) /* F1 F2 F6 F5 F4 */ - FADDP( ST(0), ST(3) ) /* F2 F6 F5 F4 */ - FADDP( ST(0), ST(1) ) /* F6 F5 F4 */ - - MOV_L( S(3), EBX ) - - FXCH( ST(2) ) /* F4 F5 F6 */ - FSTP_S( D(0) ) /* F5 F6 */ - FSTP_S( D(1) ) /* F6 */ - FSTP_S( D(2) ) /* */ - MOV_L( EBX, D(3) ) - -LLBL(p4m3dnrv8_skip): - ADD_L( CONST(32), EDI ) - ADD_L( EAX, ESI ) - DEC_L( ECX ) - JNZ( LLBL(p4m3dnrv8_top) ) - - -LLBL(p4m3dnrv8_finish): - POP_L( EBX ) - POP_L( EDI ) - POP_L( ESI ) - RET -#undef FRAME_OFFSET - -/* -######################################## -## -## gl_x86_transform_points4_perspective -## -## -*/ - GLOBL GLNAME(gl_x86_transform_points4_perspective_v8) - ALIGNTEXT4 -GLNAME(gl_x86_transform_points4_perspective_v8): - -#define FRAME_OFFSET 12 - PUSH_L( ESI ) - PUSH_L( EDI ) - - PUSH_L( EBX ) - - MOV_L( ARG_SOURCE, ESI ) /* ptr to source */ - MOV_L( ARG_DEST, EDI ) /* ptr to dest */ - - MOV_L( ARG_MATRIX, EDX ) /* ptr to matrix */ - MOV_L( ARG_COUNT, ECX ) /* count */ - - TEST_L( ECX, ECX) - JZ( LLBL(p4mpv8_finish) ) /* count was zero; go to finish */ - - MOV_L( ARG_STRIDE, EAX ) /* stride */ - - - ALIGNTEXT4ifNOP -LLBL(p4mpv8_top): - - - FLD_S( S(0) ) /* F4 */ - FMUL_S( M(0) ) - - FLD_S( S(1) ) /* F5 F4 */ - FMUL_S( M(5) ) - - FLD_S( S(2) ) /* F0 F5 F4 */ - FMUL_S( M(8) ) - FLD_S( S(2) ) /* F1 F0 F5 F4 */ - FMUL_S( M(9) ) - FLD_S( S(2) ) /* F6 F1 F0 F5 F4 */ - FMUL_S( M(10) ) - - FXCH( ST(2) ) /* F0 F1 F6 F5 F4 */ - FADDP( ST(0), ST(4) ) /* F1 F6 F5 F4 */ - FADDP( ST(0), ST(2) ) /* F6 F5 F4 */ - - FLD_S( S(3) ) /* F2 F6 F5 F4 */ - FMUL_S( M(14) ) - - FADDP( ST(0), ST(1) ) /* F6 F5 F4 */ - - MOV_L( S(2), EBX ) - XOR_L( CONST(-2147483648), EBX ) /* change sign */ - - FXCH( ST(2) ) /* F4 F5 F6 */ - FSTP_S( D(0) ) /* F5 F6 */ - FSTP_S( D(1) ) /* F6 */ - FSTP_S( D(2) ) /* */ - MOV_L( EBX, D(3) ) - -LLBL(p4mpv8_skip): - ADD_L( CONST(32), EDI ) - ADD_L( EAX, ESI ) - DEC_L( ECX ) - JNZ( LLBL(p4mpv8_top) ) - - -LLBL(p4mpv8_finish): - POP_L( EBX ) - POP_L( EDI ) - POP_L( ESI ) - RET -#undef FRAME_OFFSET - - - -/* -######################################## -## -## gl_x86_transform_points2_general -## -## -*/ - GLOBL GLNAME(gl_x86_transform_points2_general_v12) - ALIGNTEXT4 -GLNAME(gl_x86_transform_points2_general_v12): - -#define FRAME_OFFSET 8 - PUSH_L( ESI ) - PUSH_L( EDI ) - - - MOV_L( ARG_SOURCE, ESI ) /* ptr to source */ - MOV_L( ARG_DEST, EDI ) /* ptr to dest */ - - MOV_L( ARG_MATRIX, EDX ) /* ptr to matrix */ - MOV_L( ARG_COUNT, ECX ) /* count */ - - TEST_L( ECX, ECX) - JZ( LLBL(p2mgv12_finish) ) /* count was zero; go to finish */ - - MOV_L( ARG_STRIDE, EAX ) /* stride */ - - - ALIGNTEXT4ifNOP -LLBL(p2mgv12_top): - - - FLD_S( S(0) ) /* F4 */ - FMUL_S( M(0) ) - FLD_S( S(0) ) /* F5 F4 */ - FMUL_S( M(1) ) - FLD_S( S(0) ) /* F6 F5 F4 */ - FMUL_S( M(2) ) - FLD_S( S(0) ) /* F7 F6 F5 F4 */ - FMUL_S( M(3) ) - - FLD_S( S(1) ) /* F0 F7 F6 F5 F4 */ - FMUL_S( M(4) ) - FLD_S( S(1) ) /* F1 F0 F7 F6 F5 F4 */ - FMUL_S( M(5) ) - FLD_S( S(1) ) /* F2 F1 F0 F7 F6 F5 F4 */ - FMUL_S( M(6) ) - FLD_S( S(1) ) /* F3 F2 F1 F0 F7 F6 F5 F4 */ - FMUL_S( M(7) ) - - FXCH( ST(3) ) /* F0 F2 F1 F3 F7 F6 F5 F4 */ - FADDP( ST(0), ST(7) ) /* F2 F1 F3 F7 F6 F5 F4 */ - FXCH( ST(1) ) /* F1 F2 F3 F7 F6 F5 F4 */ - FADDP( ST(0), ST(5) ) /* F2 F3 F7 F6 F5 F4 */ - FADDP( ST(0), ST(3) ) /* F3 F7 F6 F5 F4 */ - FADDP( ST(0), ST(1) ) /* F7 F6 F5 F4 */ - - FXCH( ST(3) ) /* F4 F6 F5 F7 */ - FADD_S( M(12) ) - FXCH( ST(2) ) /* F5 F6 F4 F7 */ - FADD_S( M(13) ) - FXCH( ST(1) ) /* F6 F5 F4 F7 */ - FADD_S( M(14) ) - FXCH( ST(3) ) /* F7 F5 F4 F6 */ - FADD_S( M(15) ) - - FXCH( ST(2) ) /* F4 F5 F7 F6 */ - FSTP_S( D(0) ) /* F5 F7 F6 */ - FSTP_S( D(1) ) /* F7 F6 */ - FXCH( ST(1) ) /* F6 F7 */ - FSTP_S( D(2) ) /* F7 */ - FSTP_S( D(3) ) /* */ - -LLBL(p2mgv12_skip): - ADD_L( CONST(48), EDI ) - ADD_L( EAX, ESI ) - DEC_L( ECX ) - JNZ( LLBL(p2mgv12_top) ) - - -LLBL(p2mgv12_finish): - POP_L( EDI ) - POP_L( ESI ) - RET -#undef FRAME_OFFSET - -/* -######################################## -## -## gl_x86_transform_points2_identity -## -## -*/ - GLOBL GLNAME(gl_x86_transform_points2_identity_v12) - ALIGNTEXT4 -GLNAME(gl_x86_transform_points2_identity_v12): - -#define FRAME_OFFSET 12 - PUSH_L( ESI ) - PUSH_L( EDI ) - - PUSH_L( EBX ) - - MOV_L( ARG_SOURCE, ESI ) /* ptr to source */ - MOV_L( ARG_DEST, EDI ) /* ptr to dest */ - - MOV_L( ARG_MATRIX, EDX ) /* ptr to matrix */ - MOV_L( ARG_COUNT, ECX ) /* count */ - - TEST_L( ECX, ECX) - JZ( LLBL(p2miv12_finish) ) /* count was zero; go to finish */ - - MOV_L( ARG_STRIDE, EAX ) /* stride */ - - - CMP_L( ESI, EDI ) - JE( LLBL(p2miv12_finish) ) - - ALIGNTEXT4ifNOP -LLBL(p2miv12_top): - - MOV_L( S(0), EBX ) - MOV_L( S(1), EDX ) - - MOV_L( EBX, D(0) ) - MOV_L( EDX, D(1) ) - MOV_L( CONST(FP_ZERO), D(2) ) - MOV_L( CONST(FP_ONE), D(3) ) -LLBL(p2miv12_skip): - ADD_L( CONST(48), EDI ) - ADD_L( EAX, ESI ) - DEC_L( ECX ) - JNZ( LLBL(p2miv12_top) ) - - -LLBL(p2miv12_finish): - POP_L( EBX ) - POP_L( EDI ) - POP_L( ESI ) - RET -#undef FRAME_OFFSET - -/* -######################################## -## -## gl_x86_transform_points2_2d -## -## -*/ - GLOBL GLNAME(gl_x86_transform_points2_2d_v12) - ALIGNTEXT4 -GLNAME(gl_x86_transform_points2_2d_v12): - -#define FRAME_OFFSET 8 - PUSH_L( ESI ) - PUSH_L( EDI ) - - - MOV_L( ARG_SOURCE, ESI ) /* ptr to source */ - MOV_L( ARG_DEST, EDI ) /* ptr to dest */ - - MOV_L( ARG_MATRIX, EDX ) /* ptr to matrix */ - MOV_L( ARG_COUNT, ECX ) /* count */ - - TEST_L( ECX, ECX) - JZ( LLBL(p2m2dv12_finish) ) /* count was zero; go to finish */ - - MOV_L( ARG_STRIDE, EAX ) /* stride */ - - - ALIGNTEXT4ifNOP -LLBL(p2m2dv12_top): - - - FLD_S( S(0) ) /* F4 */ - FMUL_S( M(0) ) - FLD_S( S(0) ) /* F5 F4 */ - FMUL_S( M(1) ) - - FLD_S( S(1) ) /* F0 F5 F4 */ - FMUL_S( M(4) ) - FLD_S( S(1) ) /* F1 F0 F5 F4 */ - FMUL_S( M(5) ) - - FXCH( ST(1) ) /* F0 F1 F5 F4 */ - FADDP( ST(0), ST(3) ) /* F1 F5 F4 */ - FADDP( ST(0), ST(1) ) /* F5 F4 */ - - FXCH( ST(1) ) /* F4 F5 */ - FADD_S( M(12) ) - FXCH( ST(1) ) /* F5 F4 */ - FADD_S( M(13) ) - - FXCH( ST(1) ) /* F4 F5 */ - FSTP_S( D(0) ) /* F5 */ - FSTP_S( D(1) ) /* */ - - MOV_L( CONST(FP_ZERO), D(2) ) - MOV_L( CONST(FP_ONE), D(3) ) -LLBL(p2m2dv12_skip): - ADD_L( CONST(48), EDI ) - ADD_L( EAX, ESI ) - DEC_L( ECX ) - JNZ( LLBL(p2m2dv12_top) ) - - -LLBL(p2m2dv12_finish): - POP_L( EDI ) - POP_L( ESI ) - RET -#undef FRAME_OFFSET - -/* -######################################## -## -## gl_x86_transform_points2_2d_no_rot -## -## -*/ - GLOBL GLNAME(gl_x86_transform_points2_2d_no_rot_v12) - ALIGNTEXT4 -GLNAME(gl_x86_transform_points2_2d_no_rot_v12): - -#define FRAME_OFFSET 8 - PUSH_L( ESI ) - PUSH_L( EDI ) - - - MOV_L( ARG_SOURCE, ESI ) /* ptr to source */ - MOV_L( ARG_DEST, EDI ) /* ptr to dest */ - - MOV_L( ARG_MATRIX, EDX ) /* ptr to matrix */ - MOV_L( ARG_COUNT, ECX ) /* count */ - - TEST_L( ECX, ECX) - JZ( LLBL(p2m2dnrv12_finish) ) /* count was zero; go to finish */ - - MOV_L( ARG_STRIDE, EAX ) /* stride */ - - - ALIGNTEXT4ifNOP -LLBL(p2m2dnrv12_top): - - - FLD_S( S(0) ) /* F4 */ - FMUL_S( M(0) ) - - FLD_S( S(1) ) /* F1 F4 */ - FMUL_S( M(5) ) - - FXCH( ST(1) ) /* F4 F1 */ - FADD_S( M(12) ) - FLD_S( M(13) ) /* F5 F4 F1 */ - FXCH( ST(2) ) /* F1 F4 F5 */ - FADDP( ST(0), ST(2) ) /* F4 F5 */ - - FSTP_S( D(0) ) /* F5 */ - FSTP_S( D(1) ) /* */ - - MOV_L( CONST(FP_ZERO), D(2) ) - MOV_L( CONST(FP_ONE), D(3) ) -LLBL(p2m2dnrv12_skip): - ADD_L( CONST(48), EDI ) - ADD_L( EAX, ESI ) - DEC_L( ECX ) - JNZ( LLBL(p2m2dnrv12_top) ) - - -LLBL(p2m2dnrv12_finish): - POP_L( EDI ) - POP_L( ESI ) - RET -#undef FRAME_OFFSET - -/* -######################################## -## -## gl_x86_transform_points2_3d -## -## -*/ - GLOBL GLNAME(gl_x86_transform_points2_3d_v12) - ALIGNTEXT4 -GLNAME(gl_x86_transform_points2_3d_v12): - -#define FRAME_OFFSET 8 - PUSH_L( ESI ) - PUSH_L( EDI ) - - - MOV_L( ARG_SOURCE, ESI ) /* ptr to source */ - MOV_L( ARG_DEST, EDI ) /* ptr to dest */ - - MOV_L( ARG_MATRIX, EDX ) /* ptr to matrix */ - MOV_L( ARG_COUNT, ECX ) /* count */ - - TEST_L( ECX, ECX) - JZ( LLBL(p2m3dv12_finish) ) /* count was zero; go to finish */ - - MOV_L( ARG_STRIDE, EAX ) /* stride */ - - - ALIGNTEXT4ifNOP -LLBL(p2m3dv12_top): - - - FLD_S( S(0) ) /* F4 */ - FMUL_S( M(0) ) - FLD_S( S(0) ) /* F5 F4 */ - FMUL_S( M(1) ) - FLD_S( S(0) ) /* F6 F5 F4 */ - FMUL_S( M(2) ) - - FLD_S( S(1) ) /* F0 F6 F5 F4 */ - FMUL_S( M(4) ) - FLD_S( S(1) ) /* F1 F0 F6 F5 F4 */ - FMUL_S( M(5) ) - FLD_S( S(1) ) /* F2 F1 F0 F6 F5 F4 */ - FMUL_S( M(6) ) - - FXCH( ST(2) ) /* F0 F1 F2 F6 F5 F4 */ - FADDP( ST(0), ST(5) ) /* F1 F2 F6 F5 F4 */ - FADDP( ST(0), ST(3) ) /* F2 F6 F5 F4 */ - FADDP( ST(0), ST(1) ) /* F6 F5 F4 */ - - FXCH( ST(2) ) /* F4 F5 F6 */ - FADD_S( M(12) ) - FXCH( ST(1) ) /* F5 F4 F6 */ - FADD_S( M(13) ) - FXCH( ST(2) ) /* F6 F4 F5 */ - FADD_S( M(14) ) - - FXCH( ST(1) ) /* F4 F6 F5 */ - FSTP_S( D(0) ) /* F6 F5 */ - FXCH( ST(1) ) /* F5 F6 */ - FSTP_S( D(1) ) /* F6 */ - FSTP_S( D(2) ) /* */ - - MOV_L( CONST(FP_ONE), D(3) ) -LLBL(p2m3dv12_skip): - ADD_L( CONST(48), EDI ) - ADD_L( EAX, ESI ) - DEC_L( ECX ) - JNZ( LLBL(p2m3dv12_top) ) - - -LLBL(p2m3dv12_finish): - POP_L( EDI ) - POP_L( ESI ) - RET -#undef FRAME_OFFSET - -/* -######################################## -## -## gl_x86_transform_points2_3d_no_rot -## -## -*/ - GLOBL GLNAME(gl_x86_transform_points2_3d_no_rot_v12) - ALIGNTEXT4 -GLNAME(gl_x86_transform_points2_3d_no_rot_v12): - -#define FRAME_OFFSET 12 - PUSH_L( ESI ) - PUSH_L( EDI ) - - PUSH_L( EBX ) - - MOV_L( ARG_SOURCE, ESI ) /* ptr to source */ - MOV_L( ARG_DEST, EDI ) /* ptr to dest */ - - MOV_L( ARG_MATRIX, EDX ) /* ptr to matrix */ - MOV_L( ARG_COUNT, ECX ) /* count */ - - TEST_L( ECX, ECX) - JZ( LLBL(p2m3dnrv12_finish) ) /* count was zero; go to finish */ - - MOV_L( ARG_STRIDE, EAX ) /* stride */ - - - MOV_L( M(14), EBX ) - ALIGNTEXT4ifNOP -LLBL(p2m3dnrv12_top): - - - FLD_S( S(0) ) /* F4 */ - FMUL_S( M(0) ) - - FLD_S( S(1) ) /* F1 F4 */ - FMUL_S( M(5) ) - - FXCH( ST(1) ) /* F4 F1 */ - FADD_S( M(12) ) - FLD_S( M(13) ) /* F5 F4 F1 */ - FXCH( ST(2) ) /* F1 F4 F5 */ - FADDP( ST(0), ST(2) ) /* F4 F5 */ - - FSTP_S( D(0) ) /* F5 */ - FSTP_S( D(1) ) /* */ - MOV_L( EBX, D(2) ) - - MOV_L( CONST(FP_ONE), D(3) ) -LLBL(p2m3dnrv12_skip): - ADD_L( CONST(48), EDI ) - ADD_L( EAX, ESI ) - DEC_L( ECX ) - JNZ( LLBL(p2m3dnrv12_top) ) - - -LLBL(p2m3dnrv12_finish): - POP_L( EBX ) - POP_L( EDI ) - POP_L( ESI ) - RET -#undef FRAME_OFFSET - -/* -######################################## -## -## gl_x86_transform_points2_perspective -## -## -*/ - GLOBL GLNAME(gl_x86_transform_points2_perspective_v12) - ALIGNTEXT4 -GLNAME(gl_x86_transform_points2_perspective_v12): - -#define FRAME_OFFSET 12 - PUSH_L( ESI ) - PUSH_L( EDI ) - - PUSH_L( EBX ) - - MOV_L( ARG_SOURCE, ESI ) /* ptr to source */ - MOV_L( ARG_DEST, EDI ) /* ptr to dest */ - - MOV_L( ARG_MATRIX, EDX ) /* ptr to matrix */ - MOV_L( ARG_COUNT, ECX ) /* count */ - - TEST_L( ECX, ECX) - JZ( LLBL(p2mpv12_finish) ) /* count was zero; go to finish */ - - MOV_L( ARG_STRIDE, EAX ) /* stride */ - - - MOV_L( M(14), EBX ) - ALIGNTEXT4ifNOP -LLBL(p2mpv12_top): - - - FLD_S( S(0) ) /* F4 */ - FMUL_S( M(0) ) - - FLD_S( S(1) ) /* F1 F4 */ - FMUL_S( M(5) ) - - FXCH( ST(1) ) /* F4 F1 */ - FSTP_S( D(0) ) /* F1 */ - FSTP_S( D(1) ) /* */ - MOV_L( EBX, D(2) ) - MOV_L( CONST(FP_ZERO), D(3) ) - -LLBL(p2mpv12_skip): - ADD_L( CONST(48), EDI ) - ADD_L( EAX, ESI ) - DEC_L( ECX ) - JNZ( LLBL(p2mpv12_top) ) - - -LLBL(p2mpv12_finish): - POP_L( EBX ) - POP_L( EDI ) - POP_L( ESI ) - RET -#undef FRAME_OFFSET - -/* -######################################## -## -## gl_x86_transform_points3_general -## -## -*/ - GLOBL GLNAME(gl_x86_transform_points3_general_v12) - ALIGNTEXT4 -GLNAME(gl_x86_transform_points3_general_v12): - -#define FRAME_OFFSET 8 - PUSH_L( ESI ) - PUSH_L( EDI ) - - - MOV_L( ARG_SOURCE, ESI ) /* ptr to source */ - MOV_L( ARG_DEST, EDI ) /* ptr to dest */ - - MOV_L( ARG_MATRIX, EDX ) /* ptr to matrix */ - MOV_L( ARG_COUNT, ECX ) /* count */ - - TEST_L( ECX, ECX) - JZ( LLBL(p3mgv12_finish) ) /* count was zero; go to finish */ - - MOV_L( ARG_STRIDE, EAX ) /* stride */ - - - ALIGNTEXT4ifNOP -LLBL(p3mgv12_top): - - - FLD_S( S(0) ) /* F4 */ - FMUL_S( M(0) ) - FLD_S( S(0) ) /* F5 F4 */ - FMUL_S( M(1) ) - FLD_S( S(0) ) /* F6 F5 F4 */ - FMUL_S( M(2) ) - FLD_S( S(0) ) /* F7 F6 F5 F4 */ - FMUL_S( M(3) ) - - FLD_S( S(1) ) /* F0 F7 F6 F5 F4 */ - FMUL_S( M(4) ) - FLD_S( S(1) ) /* F1 F0 F7 F6 F5 F4 */ - FMUL_S( M(5) ) - FLD_S( S(1) ) /* F2 F1 F0 F7 F6 F5 F4 */ - FMUL_S( M(6) ) - FLD_S( S(1) ) /* F3 F2 F1 F0 F7 F6 F5 F4 */ - FMUL_S( M(7) ) - - FXCH( ST(3) ) /* F0 F2 F1 F3 F7 F6 F5 F4 */ - FADDP( ST(0), ST(7) ) /* F2 F1 F3 F7 F6 F5 F4 */ - FXCH( ST(1) ) /* F1 F2 F3 F7 F6 F5 F4 */ - FADDP( ST(0), ST(5) ) /* F2 F3 F7 F6 F5 F4 */ - FADDP( ST(0), ST(3) ) /* F3 F7 F6 F5 F4 */ - FADDP( ST(0), ST(1) ) /* F7 F6 F5 F4 */ - - FLD_S( S(2) ) /* F0 F7 F6 F5 F4 */ - FMUL_S( M(8) ) - FLD_S( S(2) ) /* F1 F0 F7 F6 F5 F4 */ - FMUL_S( M(9) ) - FLD_S( S(2) ) /* F2 F1 F0 F7 F6 F5 F4 */ - FMUL_S( M(10) ) - FLD_S( S(2) ) /* F3 F2 F1 F0 F7 F6 F5 F4 */ - FMUL_S( M(11) ) - - FXCH( ST(3) ) /* F0 F2 F1 F3 F7 F6 F5 F4 */ - FADDP( ST(0), ST(7) ) /* F2 F1 F3 F7 F6 F5 F4 */ - FXCH( ST(1) ) /* F1 F2 F3 F7 F6 F5 F4 */ - FADDP( ST(0), ST(5) ) /* F2 F3 F7 F6 F5 F4 */ - FADDP( ST(0), ST(3) ) /* F3 F7 F6 F5 F4 */ - FADDP( ST(0), ST(1) ) /* F7 F6 F5 F4 */ - - FXCH( ST(3) ) /* F4 F6 F5 F7 */ - FADD_S( M(12) ) - FXCH( ST(2) ) /* F5 F6 F4 F7 */ - FADD_S( M(13) ) - FXCH( ST(1) ) /* F6 F5 F4 F7 */ - FADD_S( M(14) ) - FXCH( ST(3) ) /* F7 F5 F4 F6 */ - FADD_S( M(15) ) - - FXCH( ST(2) ) /* F4 F5 F7 F6 */ - FSTP_S( D(0) ) /* F5 F7 F6 */ - FSTP_S( D(1) ) /* F7 F6 */ - FXCH( ST(1) ) /* F6 F7 */ - FSTP_S( D(2) ) /* F7 */ - FSTP_S( D(3) ) /* */ - -LLBL(p3mgv12_skip): - ADD_L( CONST(48), EDI ) - ADD_L( EAX, ESI ) - DEC_L( ECX ) - JNZ( LLBL(p3mgv12_top) ) - - -LLBL(p3mgv12_finish): - POP_L( EDI ) - POP_L( ESI ) - RET -#undef FRAME_OFFSET - -/* -######################################## -## -## gl_x86_transform_points3_identity -## -## -*/ - GLOBL GLNAME(gl_x86_transform_points3_identity_v12) - ALIGNTEXT4 -GLNAME(gl_x86_transform_points3_identity_v12): - -#define FRAME_OFFSET 16 - PUSH_L( ESI ) - PUSH_L( EDI ) - - PUSH_L( EBX ) - PUSH_L( EBP ) - - MOV_L( ARG_SOURCE, ESI ) /* ptr to source */ - MOV_L( ARG_DEST, EDI ) /* ptr to dest */ - - MOV_L( ARG_MATRIX, EDX ) /* ptr to matrix */ - MOV_L( ARG_COUNT, ECX ) /* count */ - - TEST_L( ECX, ECX) - JZ( LLBL(p3miv12_finish) ) /* count was zero; go to finish */ - - MOV_L( ARG_STRIDE, EAX ) /* stride */ - - - CMP_L( ESI, EDI ) - JE( LLBL(p3miv12_finish) ) - - ALIGNTEXT4ifNOP -LLBL(p3miv12_top): - - MOV_L( S(0), EBX ) - MOV_L( S(1), EBP ) - MOV_L( S(2), EDX ) - - MOV_L( EBX, D(0) ) - MOV_L( EBP, D(1) ) - MOV_L( EDX, D(2) ) - MOV_L( CONST(FP_ONE), D(3) ) -LLBL(p3miv12_skip): - ADD_L( CONST(48), EDI ) - ADD_L( EAX, ESI ) - DEC_L( ECX ) - JNZ( LLBL(p3miv12_top) ) - - -LLBL(p3miv12_finish): - POP_L( EBP ) - POP_L( EBX ) - POP_L( EDI ) - POP_L( ESI ) - RET -#undef FRAME_OFFSET - -/* -######################################## -## -## gl_x86_transform_points3_2d -## -## -*/ - GLOBL GLNAME(gl_x86_transform_points3_2d_v12) - ALIGNTEXT4 -GLNAME(gl_x86_transform_points3_2d_v12): - -#define FRAME_OFFSET 12 - PUSH_L( ESI ) - PUSH_L( EDI ) - - PUSH_L( EBX ) - - MOV_L( ARG_SOURCE, ESI ) /* ptr to source */ - MOV_L( ARG_DEST, EDI ) /* ptr to dest */ - - MOV_L( ARG_MATRIX, EDX ) /* ptr to matrix */ - MOV_L( ARG_COUNT, ECX ) /* count */ - - TEST_L( ECX, ECX) - JZ( LLBL(p3m2dv12_finish) ) /* count was zero; go to finish */ - - MOV_L( ARG_STRIDE, EAX ) /* stride */ - - - ALIGNTEXT4ifNOP -LLBL(p3m2dv12_top): - - - FLD_S( S(0) ) /* F4 */ - FMUL_S( M(0) ) - FLD_S( S(0) ) /* F5 F4 */ - FMUL_S( M(1) ) - - FLD_S( S(1) ) /* F0 F5 F4 */ - FMUL_S( M(4) ) - FLD_S( S(1) ) /* F1 F0 F5 F4 */ - FMUL_S( M(5) ) - - FXCH( ST(1) ) /* F0 F1 F5 F4 */ - FADDP( ST(0), ST(3) ) /* F1 F5 F4 */ - FADDP( ST(0), ST(1) ) /* F5 F4 */ - - FXCH( ST(1) ) /* F4 F5 */ - FADD_S( M(12) ) - FXCH( ST(1) ) /* F5 F4 */ - FADD_S( M(13) ) - - MOV_L( S(2), EBX ) - - FXCH( ST(1) ) /* F4 F5 */ - FSTP_S( D(0) ) /* F5 */ - FSTP_S( D(1) ) /* */ - MOV_L( EBX, D(2) ) - - MOV_L( CONST(FP_ONE), D(3) ) -LLBL(p3m2dv12_skip): - ADD_L( CONST(48), EDI ) - ADD_L( EAX, ESI ) - DEC_L( ECX ) - JNZ( LLBL(p3m2dv12_top) ) - - -LLBL(p3m2dv12_finish): - POP_L( EBX ) - POP_L( EDI ) - POP_L( ESI ) - RET -#undef FRAME_OFFSET - -/* -######################################## -## -## gl_x86_transform_points3_2d_no_rot -## -## -*/ - GLOBL GLNAME(gl_x86_transform_points3_2d_no_rot_v12) - ALIGNTEXT4 -GLNAME(gl_x86_transform_points3_2d_no_rot_v12): - -#define FRAME_OFFSET 12 - PUSH_L( ESI ) - PUSH_L( EDI ) - - PUSH_L( EBX ) - - MOV_L( ARG_SOURCE, ESI ) /* ptr to source */ - MOV_L( ARG_DEST, EDI ) /* ptr to dest */ - - MOV_L( ARG_MATRIX, EDX ) /* ptr to matrix */ - MOV_L( ARG_COUNT, ECX ) /* count */ - - TEST_L( ECX, ECX) - JZ( LLBL(p3m2dnrv12_finish) ) /* count was zero; go to finish */ - - MOV_L( ARG_STRIDE, EAX ) /* stride */ - - - ALIGNTEXT4ifNOP -LLBL(p3m2dnrv12_top): - - - FLD_S( S(0) ) /* F4 */ - FMUL_S( M(0) ) - - FLD_S( S(1) ) /* F1 F4 */ - FMUL_S( M(5) ) - - FXCH( ST(1) ) /* F4 F1 */ - FADD_S( M(12) ) - FLD_S( M(13) ) /* F5 F4 F1 */ - - FXCH( ST(2) ) /* F1 F4 F5 */ - FADDP( ST(0), ST(2) ) /* F4 F5 */ - - MOV_L( S(2), EBX ) - - FSTP_S( D(0) ) /* F5 */ - FSTP_S( D(1) ) /* */ - MOV_L( EBX, D(2) ) - - MOV_L( CONST(FP_ONE), D(3) ) -LLBL(p3m2dnrv12_skip): - ADD_L( CONST(48), EDI ) - ADD_L( EAX, ESI ) - DEC_L( ECX ) - JNZ( LLBL(p3m2dnrv12_top) ) - - -LLBL(p3m2dnrv12_finish): - POP_L( EBX ) - POP_L( EDI ) - POP_L( ESI ) - RET -#undef FRAME_OFFSET - -/* -######################################## -## -## gl_x86_transform_points3_3d -## -## -*/ - GLOBL GLNAME(gl_x86_transform_points3_3d_v12) - ALIGNTEXT4 -GLNAME(gl_x86_transform_points3_3d_v12): - -#define FRAME_OFFSET 8 - PUSH_L( ESI ) - PUSH_L( EDI ) - - - MOV_L( ARG_SOURCE, ESI ) /* ptr to source */ - MOV_L( ARG_DEST, EDI ) /* ptr to dest */ - - MOV_L( ARG_MATRIX, EDX ) /* ptr to matrix */ - MOV_L( ARG_COUNT, ECX ) /* count */ - - TEST_L( ECX, ECX) - JZ( LLBL(p3m3dv12_finish) ) /* count was zero; go to finish */ - - MOV_L( ARG_STRIDE, EAX ) /* stride */ - - - ALIGNTEXT4ifNOP -LLBL(p3m3dv12_top): - - - FLD_S( S(0) ) /* F4 */ - FMUL_S( M(0) ) - FLD_S( S(0) ) /* F5 F4 */ - FMUL_S( M(1) ) - FLD_S( S(0) ) /* F6 F5 F4 */ - FMUL_S( M(2) ) - - FLD_S( S(1) ) /* F0 F6 F5 F4 */ - FMUL_S( M(4) ) - FLD_S( S(1) ) /* F1 F0 F6 F5 F4 */ - FMUL_S( M(5) ) - FLD_S( S(1) ) /* F2 F1 F0 F6 F5 F4 */ - FMUL_S( M(6) ) - - FXCH( ST(2) ) /* F0 F1 F2 F6 F5 F4 */ - FADDP( ST(0), ST(5) ) /* F1 F2 F6 F5 F4 */ - FADDP( ST(0), ST(3) ) /* F2 F6 F5 F4 */ - FADDP( ST(0), ST(1) ) /* F6 F5 F4 */ - - FLD_S( S(2) ) /* F0 F6 F5 F4 */ - FMUL_S( M(8) ) - FLD_S( S(2) ) /* F1 F0 F6 F5 F4 */ - FMUL_S( M(9) ) - FLD_S( S(2) ) /* F2 F1 F0 F6 F5 F4 */ - FMUL_S( M(10) ) - - FXCH( ST(2) ) /* F0 F1 F2 F6 F5 F4 */ - FADDP( ST(0), ST(5) ) /* F1 F2 F6 F5 F4 */ - FADDP( ST(0), ST(3) ) /* F2 F6 F5 F4 */ - FADDP( ST(0), ST(1) ) /* F6 F5 F4 */ - - FXCH( ST(2) ) /* F4 F5 F6 */ - FADD_S( M(12) ) - FXCH( ST(1) ) /* F5 F4 F6 */ - FADD_S( M(13) ) - FXCH( ST(2) ) /* F6 F4 F5 */ - FADD_S( M(14) ) - - FXCH( ST(1) ) /* F4 F6 F5 */ - FSTP_S( D(0) ) /* F6 F5 */ - FXCH( ST(1) ) /* F5 F6 */ - FSTP_S( D(1) ) /* F6 */ - FSTP_S( D(2) ) /* */ - - MOV_L( CONST(FP_ONE), D(3) ) -LLBL(p3m3dv12_skip): - ADD_L( CONST(48), EDI ) - ADD_L( EAX, ESI ) - DEC_L( ECX ) - JNZ( LLBL(p3m3dv12_top) ) - - -LLBL(p3m3dv12_finish): - POP_L( EDI ) - POP_L( ESI ) - RET -#undef FRAME_OFFSET - -/* -######################################## -## -## gl_x86_transform_points3_3d_no_rot -## -## -*/ - GLOBL GLNAME(gl_x86_transform_points3_3d_no_rot_v12) - ALIGNTEXT4 -GLNAME(gl_x86_transform_points3_3d_no_rot_v12): - -#define FRAME_OFFSET 8 - PUSH_L( ESI ) - PUSH_L( EDI ) - - - MOV_L( ARG_SOURCE, ESI ) /* ptr to source */ - MOV_L( ARG_DEST, EDI ) /* ptr to dest */ - - MOV_L( ARG_MATRIX, EDX ) /* ptr to matrix */ - MOV_L( ARG_COUNT, ECX ) /* count */ - - TEST_L( ECX, ECX) - JZ( LLBL(p3m3dnrv12_finish) ) /* count was zero; go to finish */ - - MOV_L( ARG_STRIDE, EAX ) /* stride */ - - - ALIGNTEXT4ifNOP -LLBL(p3m3dnrv12_top): - - - FLD_S( S(0) ) /* F4 */ - FMUL_S( M(0) ) - - FLD_S( S(1) ) /* F1 F4 */ - FMUL_S( M(5) ) - - FLD_S( S(2) ) /* F2 F1 F4 */ - FMUL_S( M(10) ) - - FXCH( ST(2) ) /* F4 F1 F2 */ - FADD_S( M(12) ) - FLD_S( M(13) ) /* F5 F4 F1 F2 */ - FXCH( ST(2) ) /* F1 F4 F5 F2 */ - FADDP( ST(0), ST(2) ) /* F4 F5 F2 */ - FLD_S( M(14) ) /* F6 F4 F5 F2 */ - FXCH( ST(3) ) /* F2 F4 F5 F6 */ - FADDP( ST(0), ST(3) ) /* F4 F5 F6 */ - - FSTP_S( D(0) ) /* F5 F6 */ - FSTP_S( D(1) ) /* F6 */ - FSTP_S( D(2) ) /* */ - - MOV_L( CONST(FP_ONE), D(3) ) -LLBL(p3m3dnrv12_skip): - ADD_L( CONST(48), EDI ) - ADD_L( EAX, ESI ) - DEC_L( ECX ) - JNZ( LLBL(p3m3dnrv12_top) ) - - -LLBL(p3m3dnrv12_finish): - POP_L( EDI ) - POP_L( ESI ) - RET -#undef FRAME_OFFSET - -/* -######################################## -## -## gl_x86_transform_points3_perspective -## -## -*/ - GLOBL GLNAME(gl_x86_transform_points3_perspective_v12) - ALIGNTEXT4 -GLNAME(gl_x86_transform_points3_perspective_v12): - -#define FRAME_OFFSET 12 - PUSH_L( ESI ) - PUSH_L( EDI ) - - PUSH_L( EBX ) - - MOV_L( ARG_SOURCE, ESI ) /* ptr to source */ - MOV_L( ARG_DEST, EDI ) /* ptr to dest */ - - MOV_L( ARG_MATRIX, EDX ) /* ptr to matrix */ - MOV_L( ARG_COUNT, ECX ) /* count */ - - TEST_L( ECX, ECX) - JZ( LLBL(p3mpv12_finish) ) /* count was zero; go to finish */ - - MOV_L( ARG_STRIDE, EAX ) /* stride */ - - - ALIGNTEXT4ifNOP -LLBL(p3mpv12_top): - - - FLD_S( S(0) ) /* F4 */ - FMUL_S( M(0) ) - - FLD_S( S(1) ) /* F5 F4 */ - FMUL_S( M(5) ) - - FLD_S( S(2) ) /* F0 F5 F4 */ - FMUL_S( M(8) ) - FLD_S( S(2) ) /* F1 F0 F5 F4 */ - FMUL_S( M(9) ) - FLD_S( S(2) ) /* F2 F1 F0 F5 F4 */ - FMUL_S( M(10) ) - - FXCH( ST(2) ) /* F0 F1 F2 F5 F4 */ - FADDP( ST(0), ST(4) ) /* F1 F2 F5 F4 */ - FADDP( ST(0), ST(2) ) /* F2 F5 F4 */ - FLD_S( M(14) ) /* F6 F2 F5 F4 */ - FXCH( ST(1) ) /* F2 F6 F5 F4 */ - FADDP( ST(0), ST(1) ) /* F6 F5 F4 */ - - MOV_L( S(2), EBX ) - XOR_L( CONST(-2147483648), EBX ) /* change sign */ - - FXCH( ST(2) ) /* F4 F5 F6 */ - FSTP_S( D(0) ) /* F5 F6 */ - FSTP_S( D(1) ) /* F6 */ - FSTP_S( D(2) ) /* */ - MOV_L( EBX, D(3) ) - -LLBL(p3mpv12_skip): - ADD_L( CONST(48), EDI ) - ADD_L( EAX, ESI ) - DEC_L( ECX ) - JNZ( LLBL(p3mpv12_top) ) - - -LLBL(p3mpv12_finish): - POP_L( EBX ) - POP_L( EDI ) - POP_L( ESI ) - RET -#undef FRAME_OFFSET - -/* -######################################## -## -## gl_x86_transform_points4_general -## -## -*/ - GLOBL GLNAME(gl_x86_transform_points4_general_v12) - ALIGNTEXT4 -GLNAME(gl_x86_transform_points4_general_v12): - -#define FRAME_OFFSET 8 - PUSH_L( ESI ) - PUSH_L( EDI ) - - - MOV_L( ARG_SOURCE, ESI ) /* ptr to source */ - MOV_L( ARG_DEST, EDI ) /* ptr to dest */ - - MOV_L( ARG_MATRIX, EDX ) /* ptr to matrix */ - MOV_L( ARG_COUNT, ECX ) /* count */ - - TEST_L( ECX, ECX) - JZ( LLBL(p4mgv12_finish) ) /* count was zero; go to finish */ - - MOV_L( ARG_STRIDE, EAX ) /* stride */ - - - ALIGNTEXT4ifNOP -LLBL(p4mgv12_top): - - - FLD_S( S(0) ) /* F4 */ - FMUL_S( M(0) ) - FLD_S( S(0) ) /* F5 F4 */ - FMUL_S( M(1) ) - FLD_S( S(0) ) /* F6 F5 F4 */ - FMUL_S( M(2) ) - FLD_S( S(0) ) /* F7 F6 F5 F4 */ - FMUL_S( M(3) ) - - FLD_S( S(1) ) /* F0 F7 F6 F5 F4 */ - FMUL_S( M(4) ) - FLD_S( S(1) ) /* F1 F0 F7 F6 F5 F4 */ - FMUL_S( M(5) ) - FLD_S( S(1) ) /* F2 F1 F0 F7 F6 F5 F4 */ - FMUL_S( M(6) ) - FLD_S( S(1) ) /* F3 F2 F1 F0 F7 F6 F5 F4 */ - FMUL_S( M(7) ) - - FXCH( ST(3) ) /* F0 F2 F1 F3 F7 F6 F5 F4 */ - FADDP( ST(0), ST(7) ) /* F2 F1 F3 F7 F6 F5 F4 */ - FXCH( ST(1) ) /* F1 F2 F3 F7 F6 F5 F4 */ - FADDP( ST(0), ST(5) ) /* F2 F3 F7 F6 F5 F4 */ - FADDP( ST(0), ST(3) ) /* F3 F7 F6 F5 F4 */ - FADDP( ST(0), ST(1) ) /* F7 F6 F5 F4 */ - - FLD_S( S(2) ) /* F0 F7 F6 F5 F4 */ - FMUL_S( M(8) ) - FLD_S( S(2) ) /* F1 F0 F7 F6 F5 F4 */ - FMUL_S( M(9) ) - FLD_S( S(2) ) /* F2 F1 F0 F7 F6 F5 F4 */ - FMUL_S( M(10) ) - FLD_S( S(2) ) /* F3 F2 F1 F0 F7 F6 F5 F4 */ - FMUL_S( M(11) ) - - FXCH( ST(3) ) /* F0 F2 F1 F3 F7 F6 F5 F4 */ - FADDP( ST(0), ST(7) ) /* F2 F1 F3 F7 F6 F5 F4 */ - FXCH( ST(1) ) /* F1 F2 F3 F7 F6 F5 F4 */ - FADDP( ST(0), ST(5) ) /* F2 F3 F7 F6 F5 F4 */ - FADDP( ST(0), ST(3) ) /* F3 F7 F6 F5 F4 */ - FADDP( ST(0), ST(1) ) /* F7 F6 F5 F4 */ - - FLD_S( S(3) ) /* F0 F7 F6 F5 F4 */ - FMUL_S( M(12) ) - FLD_S( S(3) ) /* F1 F0 F7 F6 F5 F4 */ - FMUL_S( M(13) ) - FLD_S( S(3) ) /* F2 F1 F0 F7 F6 F5 F4 */ - FMUL_S( M(14) ) - FLD_S( S(3) ) /* F3 F2 F1 F0 F7 F6 F5 F4 */ - FMUL_S( M(15) ) - - FXCH( ST(3) ) /* F0 F2 F1 F3 F7 F6 F5 F4 */ - FADDP( ST(0), ST(7) ) /* F2 F1 F3 F7 F6 F5 F4 */ - FXCH( ST(1) ) /* F1 F2 F3 F7 F6 F5 F4 */ - FADDP( ST(0), ST(5) ) /* F2 F3 F7 F6 F5 F4 */ - FADDP( ST(0), ST(3) ) /* F3 F7 F6 F5 F4 */ - FADDP( ST(0), ST(1) ) /* F7 F6 F5 F4 */ - - FXCH( ST(3) ) /* F4 F6 F5 F7 */ - FSTP_S( D(0) ) /* F6 F5 F7 */ - FXCH( ST(1) ) /* F5 F6 F7 */ - FSTP_S( D(1) ) /* F6 F7 */ - FSTP_S( D(2) ) /* F7 */ - FSTP_S( D(3) ) /* */ - -LLBL(p4mgv12_skip): - ADD_L( CONST(48), EDI ) - ADD_L( EAX, ESI ) - DEC_L( ECX ) - JNZ( LLBL(p4mgv12_top) ) - - -LLBL(p4mgv12_finish): - POP_L( EDI ) - POP_L( ESI ) - RET -#undef FRAME_OFFSET - -/* -######################################## -## -## gl_x86_transform_points4_identity -## -## -*/ - GLOBL GLNAME(gl_x86_transform_points4_identity_v12) - ALIGNTEXT4 -GLNAME(gl_x86_transform_points4_identity_v12): - -#define FRAME_OFFSET 12 - PUSH_L( ESI ) - PUSH_L( EDI ) - - PUSH_L( EBX ) - - MOV_L( ARG_SOURCE, ESI ) /* ptr to source */ - MOV_L( ARG_DEST, EDI ) /* ptr to dest */ - - MOV_L( ARG_MATRIX, EDX ) /* ptr to matrix */ - MOV_L( ARG_COUNT, ECX ) /* count */ - - TEST_L( ECX, ECX) - JZ( LLBL(p4miv12_finish) ) /* count was zero; go to finish */ - - MOV_L( ARG_STRIDE, EAX ) /* stride */ - - - CMP_L( ESI, EDI ) - JE( LLBL(p4miv12_finish) ) - - ALIGNTEXT4ifNOP -LLBL(p4miv12_top): - - MOV_L( S(0), EBX ) - MOV_L( S(1), EDX ) - - MOV_L( EBX, D(0) ) - MOV_L( EDX, D(1) ) - - MOV_L( S(2), EBX ) - MOV_L( S(3), EDX ) - - MOV_L( EBX, D(2) ) - MOV_L( EDX, D(3) ) -LLBL(p4miv12_skip): - ADD_L( CONST(48), EDI ) - ADD_L( EAX, ESI ) - DEC_L( ECX ) - JNZ( LLBL(p4miv12_top) ) - - -LLBL(p4miv12_finish): - POP_L( EBX ) - POP_L( EDI ) - POP_L( ESI ) - RET -#undef FRAME_OFFSET - -/* -######################################## -## -## gl_x86_transform_points4_2d -## -## -*/ - GLOBL GLNAME(gl_x86_transform_points4_2d_v12) - ALIGNTEXT4 -GLNAME(gl_x86_transform_points4_2d_v12): - -#define FRAME_OFFSET 16 - PUSH_L( ESI ) - PUSH_L( EDI ) - - PUSH_L( EBX ) - PUSH_L( EBP ) - - MOV_L( ARG_SOURCE, ESI ) /* ptr to source */ - MOV_L( ARG_DEST, EDI ) /* ptr to dest */ - - MOV_L( ARG_MATRIX, EDX ) /* ptr to matrix */ - MOV_L( ARG_COUNT, ECX ) /* count */ - - TEST_L( ECX, ECX) - JZ( LLBL(p4m2dv12_finish) ) /* count was zero; go to finish */ - - MOV_L( ARG_STRIDE, EAX ) /* stride */ - - - ALIGNTEXT4ifNOP -LLBL(p4m2dv12_top): - - - FLD_S( S(0) ) /* F4 */ - FMUL_S( M(0) ) - FLD_S( S(0) ) /* F5 F4 */ - FMUL_S( M(1) ) - - FLD_S( S(1) ) /* F0 F5 F4 */ - FMUL_S( M(4) ) - FLD_S( S(1) ) /* F1 F0 F5 F4 */ - FMUL_S( M(5) ) - - FXCH( ST(1) ) /* F0 F1 F5 F4 */ - FADDP( ST(0), ST(3) ) /* F1 F5 F4 */ - FADDP( ST(0), ST(1) ) /* F5 F4 */ - - FLD_S( S(3) ) /* F0 F5 F4 */ - FMUL_S( M(12) ) - FLD_S( S(3) ) /* F1 F0 F5 F4 */ - FMUL_S( M(13) ) - - FXCH( ST(1) ) /* F0 F1 F5 F4 */ - FADDP( ST(0), ST(3) ) /* F1 F5 F4 */ - FADDP( ST(0), ST(1) ) /* F5 F4 */ - - MOV_L( S(2), EBX ) - MOV_L( S(3), EBP ) - - FXCH( ST(1) ) /* F4 F5 */ - FSTP_S( D(0) ) /* F5 */ - FSTP_S( D(1) ) /* */ - MOV_L( EBX, D(2) ) - MOV_L( EBP, D(3) ) - -LLBL(p4m2dv12_skip): - ADD_L( CONST(48), EDI ) - ADD_L( EAX, ESI ) - DEC_L( ECX ) - JNZ( LLBL(p4m2dv12_top) ) - - -LLBL(p4m2dv12_finish): - POP_L( EBP ) - POP_L( EBX ) - POP_L( EDI ) - POP_L( ESI ) - RET -#undef FRAME_OFFSET - -/* -######################################## -## -## gl_x86_transform_points4_2d_no_rot -## -## -*/ - GLOBL GLNAME(gl_x86_transform_points4_2d_no_rot_v12) - ALIGNTEXT4 -GLNAME(gl_x86_transform_points4_2d_no_rot_v12): - -#define FRAME_OFFSET 16 - PUSH_L( ESI ) - PUSH_L( EDI ) - - PUSH_L( EBX ) - PUSH_L( EBP ) - - MOV_L( ARG_SOURCE, ESI ) /* ptr to source */ - MOV_L( ARG_DEST, EDI ) /* ptr to dest */ - - MOV_L( ARG_MATRIX, EDX ) /* ptr to matrix */ - MOV_L( ARG_COUNT, ECX ) /* count */ - - TEST_L( ECX, ECX) - JZ( LLBL(p4m2dnrv12_finish) ) /* count was zero; go to finish */ - - MOV_L( ARG_STRIDE, EAX ) /* stride */ - - - ALIGNTEXT4ifNOP -LLBL(p4m2dnrv12_top): - - - FLD_S( S(0) ) /* F4 */ - FMUL_S( M(0) ) - - FLD_S( S(1) ) /* F5 F4 */ - FMUL_S( M(5) ) - - FLD_S( S(3) ) /* F0 F5 F4 */ - FMUL_S( M(12) ) - FLD_S( S(3) ) /* F1 F0 F5 F4 */ - FMUL_S( M(13) ) - - FXCH( ST(1) ) /* F0 F1 F5 F4 */ - FADDP( ST(0), ST(3) ) /* F1 F5 F4 */ - FADDP( ST(0), ST(1) ) /* F5 F4 */ - - MOV_L( S(2), EBX ) - MOV_L( S(3), EBP ) - - FXCH( ST(1) ) /* F4 F5 */ - FSTP_S( D(0) ) /* F5 */ - FSTP_S( D(1) ) /* */ - MOV_L( EBX, D(2) ) - MOV_L( EBP, D(3) ) - -LLBL(p4m2dnrv12_skip): - ADD_L( CONST(48), EDI ) - ADD_L( EAX, ESI ) - DEC_L( ECX ) - JNZ( LLBL(p4m2dnrv12_top) ) - - -LLBL(p4m2dnrv12_finish): - POP_L( EBP ) - POP_L( EBX ) - POP_L( EDI ) - POP_L( ESI ) - RET -#undef FRAME_OFFSET - -/* -######################################## -## -## gl_x86_transform_points4_3d -## -## -*/ - GLOBL GLNAME(gl_x86_transform_points4_3d_v12) - ALIGNTEXT4 -GLNAME(gl_x86_transform_points4_3d_v12): - -#define FRAME_OFFSET 12 - PUSH_L( ESI ) - PUSH_L( EDI ) - - PUSH_L( EBX ) - - MOV_L( ARG_SOURCE, ESI ) /* ptr to source */ - MOV_L( ARG_DEST, EDI ) /* ptr to dest */ - - MOV_L( ARG_MATRIX, EDX ) /* ptr to matrix */ - MOV_L( ARG_COUNT, ECX ) /* count */ - - TEST_L( ECX, ECX) - JZ( LLBL(p4m3dv12_finish) ) /* count was zero; go to finish */ - - MOV_L( ARG_STRIDE, EAX ) /* stride */ - - - ALIGNTEXT4ifNOP -LLBL(p4m3dv12_top): - - - FLD_S( S(0) ) /* F4 */ - FMUL_S( M(0) ) - FLD_S( S(0) ) /* F5 F4 */ - FMUL_S( M(1) ) - FLD_S( S(0) ) /* F6 F5 F4 */ - FMUL_S( M(2) ) - - FLD_S( S(1) ) /* F0 F6 F5 F4 */ - FMUL_S( M(4) ) - FLD_S( S(1) ) /* F1 F0 F6 F5 F4 */ - FMUL_S( M(5) ) - FLD_S( S(1) ) /* F2 F1 F0 F6 F5 F4 */ - FMUL_S( M(6) ) - - FXCH( ST(2) ) /* F0 F1 F2 F6 F5 F4 */ - FADDP( ST(0), ST(5) ) /* F1 F2 F6 F5 F4 */ - FADDP( ST(0), ST(3) ) /* F2 F6 F5 F4 */ - FADDP( ST(0), ST(1) ) /* F6 F5 F4 */ - - FLD_S( S(2) ) /* F0 F6 F5 F4 */ - FMUL_S( M(8) ) - FLD_S( S(2) ) /* F1 F0 F6 F5 F4 */ - FMUL_S( M(9) ) - FLD_S( S(2) ) /* F2 F1 F0 F6 F5 F4 */ - FMUL_S( M(10) ) - - FXCH( ST(2) ) /* F0 F1 F2 F6 F5 F4 */ - FADDP( ST(0), ST(5) ) /* F1 F2 F6 F5 F4 */ - FADDP( ST(0), ST(3) ) /* F2 F6 F5 F4 */ - FADDP( ST(0), ST(1) ) /* F6 F5 F4 */ - - FLD_S( S(3) ) /* F0 F6 F5 F4 */ - FMUL_S( M(12) ) - FLD_S( S(3) ) /* F1 F0 F6 F5 F4 */ - FMUL_S( M(13) ) - FLD_S( S(3) ) /* F2 F1 F0 F6 F5 F4 */ - FMUL_S( M(14) ) - - FXCH( ST(2) ) /* F0 F1 F2 F6 F5 F4 */ - FADDP( ST(0), ST(5) ) /* F1 F2 F6 F5 F4 */ - FADDP( ST(0), ST(3) ) /* F2 F6 F5 F4 */ - FADDP( ST(0), ST(1) ) /* F6 F5 F4 */ - - MOV_L( S(3), EBX ) - - FXCH( ST(2) ) /* F4 F5 F6 */ - FSTP_S( D(0) ) /* F5 F6 */ - FSTP_S( D(1) ) /* F6 */ - FSTP_S( D(2) ) /* */ - MOV_L( EBX, D(3) ) - -LLBL(p4m3dv12_skip): - ADD_L( CONST(48), EDI ) - ADD_L( EAX, ESI ) - DEC_L( ECX ) - JNZ( LLBL(p4m3dv12_top) ) - - -LLBL(p4m3dv12_finish): - POP_L( EBX ) - POP_L( EDI ) - POP_L( ESI ) - RET -#undef FRAME_OFFSET - -/* -######################################## -## -## gl_x86_transform_points4_3d_no_rot -## -## -*/ - GLOBL GLNAME(gl_x86_transform_points4_3d_no_rot_v12) - ALIGNTEXT4 -GLNAME(gl_x86_transform_points4_3d_no_rot_v12): - -#define FRAME_OFFSET 12 - PUSH_L( ESI ) - PUSH_L( EDI ) - - PUSH_L( EBX ) - - MOV_L( ARG_SOURCE, ESI ) /* ptr to source */ - MOV_L( ARG_DEST, EDI ) /* ptr to dest */ - - MOV_L( ARG_MATRIX, EDX ) /* ptr to matrix */ - MOV_L( ARG_COUNT, ECX ) /* count */ - - TEST_L( ECX, ECX) - JZ( LLBL(p4m3dnrv12_finish) ) /* count was zero; go to finish */ - - MOV_L( ARG_STRIDE, EAX ) /* stride */ - - - ALIGNTEXT4ifNOP -LLBL(p4m3dnrv12_top): - - - FLD_S( S(0) ) /* F4 */ - FMUL_S( M(0) ) - - FLD_S( S(1) ) /* F5 F4 */ - FMUL_S( M(5) ) - - FLD_S( S(2) ) /* F6 F5 F4 */ - FMUL_S( M(10) ) - - FLD_S( S(3) ) /* F0 F6 F5 F4 */ - FMUL_S( M(12) ) - FLD_S( S(3) ) /* F1 F0 F6 F5 F4 */ - FMUL_S( M(13) ) - FLD_S( S(3) ) /* F2 F1 F0 F6 F5 F4 */ - FMUL_S( M(14) ) - - FXCH( ST(2) ) /* F0 F1 F2 F6 F5 F4 */ - FADDP( ST(0), ST(5) ) /* F1 F2 F6 F5 F4 */ - FADDP( ST(0), ST(3) ) /* F2 F6 F5 F4 */ - FADDP( ST(0), ST(1) ) /* F6 F5 F4 */ - - MOV_L( S(3), EBX ) - - FXCH( ST(2) ) /* F4 F5 F6 */ - FSTP_S( D(0) ) /* F5 F6 */ - FSTP_S( D(1) ) /* F6 */ - FSTP_S( D(2) ) /* */ - MOV_L( EBX, D(3) ) - -LLBL(p4m3dnrv12_skip): - ADD_L( CONST(48), EDI ) - ADD_L( EAX, ESI ) - DEC_L( ECX ) - JNZ( LLBL(p4m3dnrv12_top) ) - - -LLBL(p4m3dnrv12_finish): - POP_L( EBX ) - POP_L( EDI ) - POP_L( ESI ) - RET -#undef FRAME_OFFSET - -/* -######################################## -## -## gl_x86_transform_points4_perspective -## -## -*/ - GLOBL GLNAME(gl_x86_transform_points4_perspective_v12) - ALIGNTEXT4 -GLNAME(gl_x86_transform_points4_perspective_v12): - -#define FRAME_OFFSET 12 - PUSH_L( ESI ) - PUSH_L( EDI ) - - PUSH_L( EBX ) - - MOV_L( ARG_SOURCE, ESI ) /* ptr to source */ - MOV_L( ARG_DEST, EDI ) /* ptr to dest */ - - MOV_L( ARG_MATRIX, EDX ) /* ptr to matrix */ - MOV_L( ARG_COUNT, ECX ) /* count */ - - TEST_L( ECX, ECX) - JZ( LLBL(p4mpv12_finish) ) /* count was zero; go to finish */ - - MOV_L( ARG_STRIDE, EAX ) /* stride */ - - - ALIGNTEXT4ifNOP -LLBL(p4mpv12_top): - - - FLD_S( S(0) ) /* F4 */ - FMUL_S( M(0) ) - - FLD_S( S(1) ) /* F5 F4 */ - FMUL_S( M(5) ) - - FLD_S( S(2) ) /* F0 F5 F4 */ - FMUL_S( M(8) ) - FLD_S( S(2) ) /* F1 F0 F5 F4 */ - FMUL_S( M(9) ) - FLD_S( S(2) ) /* F6 F1 F0 F5 F4 */ - FMUL_S( M(10) ) - - FXCH( ST(2) ) /* F0 F1 F6 F5 F4 */ - FADDP( ST(0), ST(4) ) /* F1 F6 F5 F4 */ - FADDP( ST(0), ST(2) ) /* F6 F5 F4 */ - - FLD_S( S(3) ) /* F2 F6 F5 F4 */ - FMUL_S( M(14) ) - - FADDP( ST(0), ST(1) ) /* F6 F5 F4 */ - - MOV_L( S(2), EBX ) - XOR_L( CONST(-2147483648), EBX ) /* change sign */ - - FXCH( ST(2) ) /* F4 F5 F6 */ - FSTP_S( D(0) ) /* F5 F6 */ - FSTP_S( D(1) ) /* F6 */ - FSTP_S( D(2) ) /* */ - MOV_L( EBX, D(3) ) - -LLBL(p4mpv12_skip): - ADD_L( CONST(48), EDI ) - ADD_L( EAX, ESI ) - DEC_L( ECX ) - JNZ( LLBL(p4mpv12_top) ) - - -LLBL(p4mpv12_finish): - POP_L( EBX ) - POP_L( EDI ) - POP_L( ESI ) - RET -#undef FRAME_OFFSET - - - -/* -######################################## -## -## gl_x86_transform_points2_general -## -## -*/ - GLOBL GLNAME(gl_x86_transform_points2_general_v16) - ALIGNTEXT4 -GLNAME(gl_x86_transform_points2_general_v16): - -#define FRAME_OFFSET 8 - PUSH_L( ESI ) - PUSH_L( EDI ) - - - MOV_L( ARG_SOURCE, ESI ) /* ptr to source */ - MOV_L( ARG_DEST, EDI ) /* ptr to dest */ - - MOV_L( ARG_MATRIX, EDX ) /* ptr to matrix */ - MOV_L( ARG_COUNT, ECX ) /* count */ - - TEST_L( ECX, ECX) - JZ( LLBL(p2mgv16_finish) ) /* count was zero; go to finish */ - - MOV_L( ARG_STRIDE, EAX ) /* stride */ - - - ALIGNTEXT4ifNOP -LLBL(p2mgv16_top): - - - FLD_S( S(0) ) /* F4 */ - FMUL_S( M(0) ) - FLD_S( S(0) ) /* F5 F4 */ - FMUL_S( M(1) ) - FLD_S( S(0) ) /* F6 F5 F4 */ - FMUL_S( M(2) ) - FLD_S( S(0) ) /* F7 F6 F5 F4 */ - FMUL_S( M(3) ) - - FLD_S( S(1) ) /* F0 F7 F6 F5 F4 */ - FMUL_S( M(4) ) - FLD_S( S(1) ) /* F1 F0 F7 F6 F5 F4 */ - FMUL_S( M(5) ) - FLD_S( S(1) ) /* F2 F1 F0 F7 F6 F5 F4 */ - FMUL_S( M(6) ) - FLD_S( S(1) ) /* F3 F2 F1 F0 F7 F6 F5 F4 */ - FMUL_S( M(7) ) - - FXCH( ST(3) ) /* F0 F2 F1 F3 F7 F6 F5 F4 */ - FADDP( ST(0), ST(7) ) /* F2 F1 F3 F7 F6 F5 F4 */ - FXCH( ST(1) ) /* F1 F2 F3 F7 F6 F5 F4 */ - FADDP( ST(0), ST(5) ) /* F2 F3 F7 F6 F5 F4 */ - FADDP( ST(0), ST(3) ) /* F3 F7 F6 F5 F4 */ - FADDP( ST(0), ST(1) ) /* F7 F6 F5 F4 */ - - FXCH( ST(3) ) /* F4 F6 F5 F7 */ - FADD_S( M(12) ) - FXCH( ST(2) ) /* F5 F6 F4 F7 */ - FADD_S( M(13) ) - FXCH( ST(1) ) /* F6 F5 F4 F7 */ - FADD_S( M(14) ) - FXCH( ST(3) ) /* F7 F5 F4 F6 */ - FADD_S( M(15) ) - - FXCH( ST(2) ) /* F4 F5 F7 F6 */ - FSTP_S( D(0) ) /* F5 F7 F6 */ - FSTP_S( D(1) ) /* F7 F6 */ - FXCH( ST(1) ) /* F6 F7 */ - FSTP_S( D(2) ) /* F7 */ - FSTP_S( D(3) ) /* */ - -LLBL(p2mgv16_skip): - ADD_L( CONST(64), EDI ) - ADD_L( EAX, ESI ) - DEC_L( ECX ) - JNZ( LLBL(p2mgv16_top) ) - - -LLBL(p2mgv16_finish): - POP_L( EDI ) - POP_L( ESI ) - RET -#undef FRAME_OFFSET - -/* -######################################## -## -## gl_x86_transform_points2_identity -## -## -*/ - GLOBL GLNAME(gl_x86_transform_points2_identity_v16) - ALIGNTEXT4 -GLNAME(gl_x86_transform_points2_identity_v16): - -#define FRAME_OFFSET 12 - PUSH_L( ESI ) - PUSH_L( EDI ) - - PUSH_L( EBX ) - - MOV_L( ARG_SOURCE, ESI ) /* ptr to source */ - MOV_L( ARG_DEST, EDI ) /* ptr to dest */ - - MOV_L( ARG_MATRIX, EDX ) /* ptr to matrix */ - MOV_L( ARG_COUNT, ECX ) /* count */ - - TEST_L( ECX, ECX) - JZ( LLBL(p2miv16_finish) ) /* count was zero; go to finish */ - - MOV_L( ARG_STRIDE, EAX ) /* stride */ - - - CMP_L( ESI, EDI ) - JE( LLBL(p2miv16_finish) ) - - ALIGNTEXT4ifNOP -LLBL(p2miv16_top): - - MOV_L( S(0), EBX ) - MOV_L( S(1), EDX ) - - MOV_L( EBX, D(0) ) - MOV_L( EDX, D(1) ) - MOV_L( CONST(FP_ZERO), D(2) ) - MOV_L( CONST(FP_ONE), D(3) ) -LLBL(p2miv16_skip): - ADD_L( CONST(64), EDI ) - ADD_L( EAX, ESI ) - DEC_L( ECX ) - JNZ( LLBL(p2miv16_top) ) - - -LLBL(p2miv16_finish): - POP_L( EBX ) - POP_L( EDI ) - POP_L( ESI ) - RET -#undef FRAME_OFFSET - -/* -######################################## -## -## gl_x86_transform_points2_2d -## -## -*/ - GLOBL GLNAME(gl_x86_transform_points2_2d_v16) - ALIGNTEXT4 -GLNAME(gl_x86_transform_points2_2d_v16): - -#define FRAME_OFFSET 8 - PUSH_L( ESI ) - PUSH_L( EDI ) - - - MOV_L( ARG_SOURCE, ESI ) /* ptr to source */ - MOV_L( ARG_DEST, EDI ) /* ptr to dest */ - - MOV_L( ARG_MATRIX, EDX ) /* ptr to matrix */ - MOV_L( ARG_COUNT, ECX ) /* count */ - - TEST_L( ECX, ECX) - JZ( LLBL(p2m2dv16_finish) ) /* count was zero; go to finish */ - - MOV_L( ARG_STRIDE, EAX ) /* stride */ - - - ALIGNTEXT4ifNOP -LLBL(p2m2dv16_top): - - - FLD_S( S(0) ) /* F4 */ - FMUL_S( M(0) ) - FLD_S( S(0) ) /* F5 F4 */ - FMUL_S( M(1) ) - - FLD_S( S(1) ) /* F0 F5 F4 */ - FMUL_S( M(4) ) - FLD_S( S(1) ) /* F1 F0 F5 F4 */ - FMUL_S( M(5) ) - - FXCH( ST(1) ) /* F0 F1 F5 F4 */ - FADDP( ST(0), ST(3) ) /* F1 F5 F4 */ - FADDP( ST(0), ST(1) ) /* F5 F4 */ - - FXCH( ST(1) ) /* F4 F5 */ - FADD_S( M(12) ) - FXCH( ST(1) ) /* F5 F4 */ - FADD_S( M(13) ) - - FXCH( ST(1) ) /* F4 F5 */ - FSTP_S( D(0) ) /* F5 */ - FSTP_S( D(1) ) /* */ - - MOV_L( CONST(FP_ZERO), D(2) ) - MOV_L( CONST(FP_ONE), D(3) ) -LLBL(p2m2dv16_skip): - ADD_L( CONST(64), EDI ) - ADD_L( EAX, ESI ) - DEC_L( ECX ) - JNZ( LLBL(p2m2dv16_top) ) - - -LLBL(p2m2dv16_finish): - POP_L( EDI ) - POP_L( ESI ) - RET -#undef FRAME_OFFSET - -/* -######################################## -## -## gl_x86_transform_points2_2d_no_rot -## -## -*/ - GLOBL GLNAME(gl_x86_transform_points2_2d_no_rot_v16) - ALIGNTEXT4 -GLNAME(gl_x86_transform_points2_2d_no_rot_v16): - -#define FRAME_OFFSET 8 - PUSH_L( ESI ) - PUSH_L( EDI ) - - - MOV_L( ARG_SOURCE, ESI ) /* ptr to source */ - MOV_L( ARG_DEST, EDI ) /* ptr to dest */ - - MOV_L( ARG_MATRIX, EDX ) /* ptr to matrix */ - MOV_L( ARG_COUNT, ECX ) /* count */ - - TEST_L( ECX, ECX) - JZ( LLBL(p2m2dnrv16_finish) ) /* count was zero; go to finish */ - - MOV_L( ARG_STRIDE, EAX ) /* stride */ - - - ALIGNTEXT4ifNOP -LLBL(p2m2dnrv16_top): - - - FLD_S( S(0) ) /* F4 */ - FMUL_S( M(0) ) - - FLD_S( S(1) ) /* F1 F4 */ - FMUL_S( M(5) ) - - FXCH( ST(1) ) /* F4 F1 */ - FADD_S( M(12) ) - FLD_S( M(13) ) /* F5 F4 F1 */ - FXCH( ST(2) ) /* F1 F4 F5 */ - FADDP( ST(0), ST(2) ) /* F4 F5 */ - - FSTP_S( D(0) ) /* F5 */ - FSTP_S( D(1) ) /* */ - - MOV_L( CONST(FP_ZERO), D(2) ) - MOV_L( CONST(FP_ONE), D(3) ) -LLBL(p2m2dnrv16_skip): - ADD_L( CONST(64), EDI ) - ADD_L( EAX, ESI ) - DEC_L( ECX ) - JNZ( LLBL(p2m2dnrv16_top) ) - - -LLBL(p2m2dnrv16_finish): - POP_L( EDI ) - POP_L( ESI ) - RET -#undef FRAME_OFFSET - -/* -######################################## -## -## gl_x86_transform_points2_3d -## -## -*/ - GLOBL GLNAME(gl_x86_transform_points2_3d_v16) - ALIGNTEXT4 -GLNAME(gl_x86_transform_points2_3d_v16): - -#define FRAME_OFFSET 8 - PUSH_L( ESI ) - PUSH_L( EDI ) - - - MOV_L( ARG_SOURCE, ESI ) /* ptr to source */ - MOV_L( ARG_DEST, EDI ) /* ptr to dest */ - - MOV_L( ARG_MATRIX, EDX ) /* ptr to matrix */ - MOV_L( ARG_COUNT, ECX ) /* count */ - - TEST_L( ECX, ECX) - JZ( LLBL(p2m3dv16_finish) ) /* count was zero; go to finish */ - - MOV_L( ARG_STRIDE, EAX ) /* stride */ - - - ALIGNTEXT4ifNOP -LLBL(p2m3dv16_top): - - - FLD_S( S(0) ) /* F4 */ - FMUL_S( M(0) ) - FLD_S( S(0) ) /* F5 F4 */ - FMUL_S( M(1) ) - FLD_S( S(0) ) /* F6 F5 F4 */ - FMUL_S( M(2) ) - - FLD_S( S(1) ) /* F0 F6 F5 F4 */ - FMUL_S( M(4) ) - FLD_S( S(1) ) /* F1 F0 F6 F5 F4 */ - FMUL_S( M(5) ) - FLD_S( S(1) ) /* F2 F1 F0 F6 F5 F4 */ - FMUL_S( M(6) ) - - FXCH( ST(2) ) /* F0 F1 F2 F6 F5 F4 */ - FADDP( ST(0), ST(5) ) /* F1 F2 F6 F5 F4 */ - FADDP( ST(0), ST(3) ) /* F2 F6 F5 F4 */ - FADDP( ST(0), ST(1) ) /* F6 F5 F4 */ - - FXCH( ST(2) ) /* F4 F5 F6 */ - FADD_S( M(12) ) - FXCH( ST(1) ) /* F5 F4 F6 */ - FADD_S( M(13) ) - FXCH( ST(2) ) /* F6 F4 F5 */ - FADD_S( M(14) ) - - FXCH( ST(1) ) /* F4 F6 F5 */ - FSTP_S( D(0) ) /* F6 F5 */ - FXCH( ST(1) ) /* F5 F6 */ - FSTP_S( D(1) ) /* F6 */ - FSTP_S( D(2) ) /* */ - - MOV_L( CONST(FP_ONE), D(3) ) -LLBL(p2m3dv16_skip): - ADD_L( CONST(64), EDI ) - ADD_L( EAX, ESI ) - DEC_L( ECX ) - JNZ( LLBL(p2m3dv16_top) ) - - -LLBL(p2m3dv16_finish): - POP_L( EDI ) - POP_L( ESI ) - RET -#undef FRAME_OFFSET - -/* -######################################## -## -## gl_x86_transform_points2_3d_no_rot -## -## -*/ - GLOBL GLNAME(gl_x86_transform_points2_3d_no_rot_v16) - ALIGNTEXT4 -GLNAME(gl_x86_transform_points2_3d_no_rot_v16): - -#define FRAME_OFFSET 12 - PUSH_L( ESI ) - PUSH_L( EDI ) - - PUSH_L( EBX ) - - MOV_L( ARG_SOURCE, ESI ) /* ptr to source */ - MOV_L( ARG_DEST, EDI ) /* ptr to dest */ - - MOV_L( ARG_MATRIX, EDX ) /* ptr to matrix */ - MOV_L( ARG_COUNT, ECX ) /* count */ - - TEST_L( ECX, ECX) - JZ( LLBL(p2m3dnrv16_finish) ) /* count was zero; go to finish */ - - MOV_L( ARG_STRIDE, EAX ) /* stride */ - - - MOV_L( M(14), EBX ) - ALIGNTEXT4ifNOP -LLBL(p2m3dnrv16_top): - - - FLD_S( S(0) ) /* F4 */ - FMUL_S( M(0) ) - - FLD_S( S(1) ) /* F1 F4 */ - FMUL_S( M(5) ) - - FXCH( ST(1) ) /* F4 F1 */ - FADD_S( M(12) ) - FLD_S( M(13) ) /* F5 F4 F1 */ - FXCH( ST(2) ) /* F1 F4 F5 */ - FADDP( ST(0), ST(2) ) /* F4 F5 */ - - FSTP_S( D(0) ) /* F5 */ - FSTP_S( D(1) ) /* */ - MOV_L( EBX, D(2) ) - - MOV_L( CONST(FP_ONE), D(3) ) -LLBL(p2m3dnrv16_skip): - ADD_L( CONST(64), EDI ) - ADD_L( EAX, ESI ) - DEC_L( ECX ) - JNZ( LLBL(p2m3dnrv16_top) ) - - -LLBL(p2m3dnrv16_finish): - POP_L( EBX ) - POP_L( EDI ) - POP_L( ESI ) - RET -#undef FRAME_OFFSET - -/* -######################################## -## -## gl_x86_transform_points2_perspective -## -## -*/ - GLOBL GLNAME(gl_x86_transform_points2_perspective_v16) - ALIGNTEXT4 -GLNAME(gl_x86_transform_points2_perspective_v16): - -#define FRAME_OFFSET 12 - PUSH_L( ESI ) - PUSH_L( EDI ) - - PUSH_L( EBX ) - - MOV_L( ARG_SOURCE, ESI ) /* ptr to source */ - MOV_L( ARG_DEST, EDI ) /* ptr to dest */ - - MOV_L( ARG_MATRIX, EDX ) /* ptr to matrix */ - MOV_L( ARG_COUNT, ECX ) /* count */ - - TEST_L( ECX, ECX) - JZ( LLBL(p2mpv16_finish) ) /* count was zero; go to finish */ - - MOV_L( ARG_STRIDE, EAX ) /* stride */ - - - MOV_L( M(14), EBX ) - ALIGNTEXT4ifNOP -LLBL(p2mpv16_top): - - - FLD_S( S(0) ) /* F4 */ - FMUL_S( M(0) ) - - FLD_S( S(1) ) /* F1 F4 */ - FMUL_S( M(5) ) - - FXCH( ST(1) ) /* F4 F1 */ - FSTP_S( D(0) ) /* F1 */ - FSTP_S( D(1) ) /* */ - MOV_L( EBX, D(2) ) - MOV_L( CONST(FP_ZERO), D(3) ) - -LLBL(p2mpv16_skip): - ADD_L( CONST(64), EDI ) - ADD_L( EAX, ESI ) - DEC_L( ECX ) - JNZ( LLBL(p2mpv16_top) ) - - -LLBL(p2mpv16_finish): - POP_L( EBX ) - POP_L( EDI ) - POP_L( ESI ) - RET -#undef FRAME_OFFSET - -/* -######################################## -## -## gl_x86_transform_points3_general -## -## -*/ - GLOBL GLNAME(gl_x86_transform_points3_general_v16) - ALIGNTEXT4 -GLNAME(gl_x86_transform_points3_general_v16): - -#define FRAME_OFFSET 8 - PUSH_L( ESI ) - PUSH_L( EDI ) - - - MOV_L( ARG_SOURCE, ESI ) /* ptr to source */ - MOV_L( ARG_DEST, EDI ) /* ptr to dest */ - - MOV_L( ARG_MATRIX, EDX ) /* ptr to matrix */ - MOV_L( ARG_COUNT, ECX ) /* count */ - - TEST_L( ECX, ECX) - JZ( LLBL(p3mgv16_finish) ) /* count was zero; go to finish */ - - MOV_L( ARG_STRIDE, EAX ) /* stride */ - - - ALIGNTEXT4ifNOP -LLBL(p3mgv16_top): - - - FLD_S( S(0) ) /* F4 */ - FMUL_S( M(0) ) - FLD_S( S(0) ) /* F5 F4 */ - FMUL_S( M(1) ) - FLD_S( S(0) ) /* F6 F5 F4 */ - FMUL_S( M(2) ) - FLD_S( S(0) ) /* F7 F6 F5 F4 */ - FMUL_S( M(3) ) - - FLD_S( S(1) ) /* F0 F7 F6 F5 F4 */ - FMUL_S( M(4) ) - FLD_S( S(1) ) /* F1 F0 F7 F6 F5 F4 */ - FMUL_S( M(5) ) - FLD_S( S(1) ) /* F2 F1 F0 F7 F6 F5 F4 */ - FMUL_S( M(6) ) - FLD_S( S(1) ) /* F3 F2 F1 F0 F7 F6 F5 F4 */ - FMUL_S( M(7) ) - - FXCH( ST(3) ) /* F0 F2 F1 F3 F7 F6 F5 F4 */ - FADDP( ST(0), ST(7) ) /* F2 F1 F3 F7 F6 F5 F4 */ - FXCH( ST(1) ) /* F1 F2 F3 F7 F6 F5 F4 */ - FADDP( ST(0), ST(5) ) /* F2 F3 F7 F6 F5 F4 */ - FADDP( ST(0), ST(3) ) /* F3 F7 F6 F5 F4 */ - FADDP( ST(0), ST(1) ) /* F7 F6 F5 F4 */ - - FLD_S( S(2) ) /* F0 F7 F6 F5 F4 */ - FMUL_S( M(8) ) - FLD_S( S(2) ) /* F1 F0 F7 F6 F5 F4 */ - FMUL_S( M(9) ) - FLD_S( S(2) ) /* F2 F1 F0 F7 F6 F5 F4 */ - FMUL_S( M(10) ) - FLD_S( S(2) ) /* F3 F2 F1 F0 F7 F6 F5 F4 */ - FMUL_S( M(11) ) - - FXCH( ST(3) ) /* F0 F2 F1 F3 F7 F6 F5 F4 */ - FADDP( ST(0), ST(7) ) /* F2 F1 F3 F7 F6 F5 F4 */ - FXCH( ST(1) ) /* F1 F2 F3 F7 F6 F5 F4 */ - FADDP( ST(0), ST(5) ) /* F2 F3 F7 F6 F5 F4 */ - FADDP( ST(0), ST(3) ) /* F3 F7 F6 F5 F4 */ - FADDP( ST(0), ST(1) ) /* F7 F6 F5 F4 */ - - FXCH( ST(3) ) /* F4 F6 F5 F7 */ - FADD_S( M(12) ) - FXCH( ST(2) ) /* F5 F6 F4 F7 */ - FADD_S( M(13) ) - FXCH( ST(1) ) /* F6 F5 F4 F7 */ - FADD_S( M(14) ) - FXCH( ST(3) ) /* F7 F5 F4 F6 */ - FADD_S( M(15) ) - - FXCH( ST(2) ) /* F4 F5 F7 F6 */ - FSTP_S( D(0) ) /* F5 F7 F6 */ - FSTP_S( D(1) ) /* F7 F6 */ - FXCH( ST(1) ) /* F6 F7 */ - FSTP_S( D(2) ) /* F7 */ - FSTP_S( D(3) ) /* */ - -LLBL(p3mgv16_skip): - ADD_L( CONST(64), EDI ) - ADD_L( EAX, ESI ) - DEC_L( ECX ) - JNZ( LLBL(p3mgv16_top) ) - - -LLBL(p3mgv16_finish): - POP_L( EDI ) - POP_L( ESI ) - RET -#undef FRAME_OFFSET - -/* -######################################## -## -## gl_x86_transform_points3_identity -## -## -*/ - GLOBL GLNAME(gl_x86_transform_points3_identity_v16) - ALIGNTEXT4 -GLNAME(gl_x86_transform_points3_identity_v16): - -#define FRAME_OFFSET 16 - PUSH_L( ESI ) - PUSH_L( EDI ) - - PUSH_L( EBX ) - PUSH_L( EBP ) - - MOV_L( ARG_SOURCE, ESI ) /* ptr to source */ - MOV_L( ARG_DEST, EDI ) /* ptr to dest */ - - MOV_L( ARG_MATRIX, EDX ) /* ptr to matrix */ - MOV_L( ARG_COUNT, ECX ) /* count */ - - TEST_L( ECX, ECX) - JZ( LLBL(p3miv16_finish) ) /* count was zero; go to finish */ - - MOV_L( ARG_STRIDE, EAX ) /* stride */ - - - CMP_L( ESI, EDI ) - JE( LLBL(p3miv16_finish) ) - - ALIGNTEXT4ifNOP -LLBL(p3miv16_top): - - MOV_L( S(0), EBX ) - MOV_L( S(1), EBP ) - MOV_L( S(2), EDX ) - - MOV_L( EBX, D(0) ) - MOV_L( EBP, D(1) ) - MOV_L( EDX, D(2) ) - MOV_L( CONST(FP_ONE), D(3) ) -LLBL(p3miv16_skip): - ADD_L( CONST(64), EDI ) - ADD_L( EAX, ESI ) - DEC_L( ECX ) - JNZ( LLBL(p3miv16_top) ) - - -LLBL(p3miv16_finish): - POP_L( EBP ) - POP_L( EBX ) - POP_L( EDI ) - POP_L( ESI ) - RET -#undef FRAME_OFFSET - -/* -######################################## -## -## gl_x86_transform_points3_2d -## -## -*/ - GLOBL GLNAME(gl_x86_transform_points3_2d_v16) - ALIGNTEXT4 -GLNAME(gl_x86_transform_points3_2d_v16): - -#define FRAME_OFFSET 12 - PUSH_L( ESI ) - PUSH_L( EDI ) - - PUSH_L( EBX ) - - MOV_L( ARG_SOURCE, ESI ) /* ptr to source */ - MOV_L( ARG_DEST, EDI ) /* ptr to dest */ - - MOV_L( ARG_MATRIX, EDX ) /* ptr to matrix */ - MOV_L( ARG_COUNT, ECX ) /* count */ - - TEST_L( ECX, ECX) - JZ( LLBL(p3m2dv16_finish) ) /* count was zero; go to finish */ - - MOV_L( ARG_STRIDE, EAX ) /* stride */ - - - ALIGNTEXT4ifNOP -LLBL(p3m2dv16_top): - - - FLD_S( S(0) ) /* F4 */ - FMUL_S( M(0) ) - FLD_S( S(0) ) /* F5 F4 */ - FMUL_S( M(1) ) - - FLD_S( S(1) ) /* F0 F5 F4 */ - FMUL_S( M(4) ) - FLD_S( S(1) ) /* F1 F0 F5 F4 */ - FMUL_S( M(5) ) - - FXCH( ST(1) ) /* F0 F1 F5 F4 */ - FADDP( ST(0), ST(3) ) /* F1 F5 F4 */ - FADDP( ST(0), ST(1) ) /* F5 F4 */ - - FXCH( ST(1) ) /* F4 F5 */ - FADD_S( M(12) ) - FXCH( ST(1) ) /* F5 F4 */ - FADD_S( M(13) ) - - MOV_L( S(2), EBX ) - - FXCH( ST(1) ) /* F4 F5 */ - FSTP_S( D(0) ) /* F5 */ - FSTP_S( D(1) ) /* */ - MOV_L( EBX, D(2) ) - - MOV_L( CONST(FP_ONE), D(3) ) -LLBL(p3m2dv16_skip): - ADD_L( CONST(64), EDI ) - ADD_L( EAX, ESI ) - DEC_L( ECX ) - JNZ( LLBL(p3m2dv16_top) ) - - -LLBL(p3m2dv16_finish): - POP_L( EBX ) - POP_L( EDI ) - POP_L( ESI ) - RET -#undef FRAME_OFFSET - -/* -######################################## -## -## gl_x86_transform_points3_2d_no_rot -## -## -*/ - GLOBL GLNAME(gl_x86_transform_points3_2d_no_rot_v16) - ALIGNTEXT4 -GLNAME(gl_x86_transform_points3_2d_no_rot_v16): - -#define FRAME_OFFSET 12 - PUSH_L( ESI ) - PUSH_L( EDI ) - - PUSH_L( EBX ) - - MOV_L( ARG_SOURCE, ESI ) /* ptr to source */ - MOV_L( ARG_DEST, EDI ) /* ptr to dest */ - - MOV_L( ARG_MATRIX, EDX ) /* ptr to matrix */ - MOV_L( ARG_COUNT, ECX ) /* count */ - - TEST_L( ECX, ECX) - JZ( LLBL(p3m2dnrv16_finish) ) /* count was zero; go to finish */ - - MOV_L( ARG_STRIDE, EAX ) /* stride */ - - - ALIGNTEXT4ifNOP -LLBL(p3m2dnrv16_top): - - - FLD_S( S(0) ) /* F4 */ - FMUL_S( M(0) ) - - FLD_S( S(1) ) /* F1 F4 */ - FMUL_S( M(5) ) - - FXCH( ST(1) ) /* F4 F1 */ - FADD_S( M(12) ) - FLD_S( M(13) ) /* F5 F4 F1 */ - - FXCH( ST(2) ) /* F1 F4 F5 */ - FADDP( ST(0), ST(2) ) /* F4 F5 */ - - MOV_L( S(2), EBX ) - - FSTP_S( D(0) ) /* F5 */ - FSTP_S( D(1) ) /* */ - MOV_L( EBX, D(2) ) - - MOV_L( CONST(FP_ONE), D(3) ) -LLBL(p3m2dnrv16_skip): - ADD_L( CONST(64), EDI ) - ADD_L( EAX, ESI ) - DEC_L( ECX ) - JNZ( LLBL(p3m2dnrv16_top) ) - - -LLBL(p3m2dnrv16_finish): - POP_L( EBX ) - POP_L( EDI ) - POP_L( ESI ) - RET -#undef FRAME_OFFSET - -/* -######################################## -## -## gl_x86_transform_points3_3d -## -## -*/ - GLOBL GLNAME(gl_x86_transform_points3_3d_v16) - ALIGNTEXT4 -GLNAME(gl_x86_transform_points3_3d_v16): - -#define FRAME_OFFSET 8 - PUSH_L( ESI ) - PUSH_L( EDI ) - - - MOV_L( ARG_SOURCE, ESI ) /* ptr to source */ - MOV_L( ARG_DEST, EDI ) /* ptr to dest */ - - MOV_L( ARG_MATRIX, EDX ) /* ptr to matrix */ - MOV_L( ARG_COUNT, ECX ) /* count */ - - TEST_L( ECX, ECX) - JZ( LLBL(p3m3dv16_finish) ) /* count was zero; go to finish */ - - MOV_L( ARG_STRIDE, EAX ) /* stride */ - - - ALIGNTEXT4ifNOP -LLBL(p3m3dv16_top): - - - FLD_S( S(0) ) /* F4 */ - FMUL_S( M(0) ) - FLD_S( S(0) ) /* F5 F4 */ - FMUL_S( M(1) ) - FLD_S( S(0) ) /* F6 F5 F4 */ - FMUL_S( M(2) ) - - FLD_S( S(1) ) /* F0 F6 F5 F4 */ - FMUL_S( M(4) ) - FLD_S( S(1) ) /* F1 F0 F6 F5 F4 */ - FMUL_S( M(5) ) - FLD_S( S(1) ) /* F2 F1 F0 F6 F5 F4 */ - FMUL_S( M(6) ) - - FXCH( ST(2) ) /* F0 F1 F2 F6 F5 F4 */ - FADDP( ST(0), ST(5) ) /* F1 F2 F6 F5 F4 */ - FADDP( ST(0), ST(3) ) /* F2 F6 F5 F4 */ - FADDP( ST(0), ST(1) ) /* F6 F5 F4 */ - - FLD_S( S(2) ) /* F0 F6 F5 F4 */ - FMUL_S( M(8) ) - FLD_S( S(2) ) /* F1 F0 F6 F5 F4 */ - FMUL_S( M(9) ) - FLD_S( S(2) ) /* F2 F1 F0 F6 F5 F4 */ - FMUL_S( M(10) ) - - FXCH( ST(2) ) /* F0 F1 F2 F6 F5 F4 */ - FADDP( ST(0), ST(5) ) /* F1 F2 F6 F5 F4 */ - FADDP( ST(0), ST(3) ) /* F2 F6 F5 F4 */ - FADDP( ST(0), ST(1) ) /* F6 F5 F4 */ - - FXCH( ST(2) ) /* F4 F5 F6 */ - FADD_S( M(12) ) - FXCH( ST(1) ) /* F5 F4 F6 */ - FADD_S( M(13) ) - FXCH( ST(2) ) /* F6 F4 F5 */ - FADD_S( M(14) ) - - FXCH( ST(1) ) /* F4 F6 F5 */ - FSTP_S( D(0) ) /* F6 F5 */ - FXCH( ST(1) ) /* F5 F6 */ - FSTP_S( D(1) ) /* F6 */ - FSTP_S( D(2) ) /* */ - - MOV_L( CONST(FP_ONE), D(3) ) -LLBL(p3m3dv16_skip): - ADD_L( CONST(64), EDI ) - ADD_L( EAX, ESI ) - DEC_L( ECX ) - JNZ( LLBL(p3m3dv16_top) ) - - -LLBL(p3m3dv16_finish): - POP_L( EDI ) - POP_L( ESI ) - RET -#undef FRAME_OFFSET - -/* -######################################## -## -## gl_x86_transform_points3_3d_no_rot -## -## -*/ - GLOBL GLNAME(gl_x86_transform_points3_3d_no_rot_v16) - ALIGNTEXT4 -GLNAME(gl_x86_transform_points3_3d_no_rot_v16): - -#define FRAME_OFFSET 8 - PUSH_L( ESI ) - PUSH_L( EDI ) - - - MOV_L( ARG_SOURCE, ESI ) /* ptr to source */ - MOV_L( ARG_DEST, EDI ) /* ptr to dest */ - - MOV_L( ARG_MATRIX, EDX ) /* ptr to matrix */ - MOV_L( ARG_COUNT, ECX ) /* count */ - - TEST_L( ECX, ECX) - JZ( LLBL(p3m3dnrv16_finish) ) /* count was zero; go to finish */ - - MOV_L( ARG_STRIDE, EAX ) /* stride */ - - - ALIGNTEXT4ifNOP -LLBL(p3m3dnrv16_top): - - - FLD_S( S(0) ) /* F4 */ - FMUL_S( M(0) ) - - FLD_S( S(1) ) /* F1 F4 */ - FMUL_S( M(5) ) - - FLD_S( S(2) ) /* F2 F1 F4 */ - FMUL_S( M(10) ) - - FXCH( ST(2) ) /* F4 F1 F2 */ - FADD_S( M(12) ) - FLD_S( M(13) ) /* F5 F4 F1 F2 */ - FXCH( ST(2) ) /* F1 F4 F5 F2 */ - FADDP( ST(0), ST(2) ) /* F4 F5 F2 */ - FLD_S( M(14) ) /* F6 F4 F5 F2 */ - FXCH( ST(3) ) /* F2 F4 F5 F6 */ - FADDP( ST(0), ST(3) ) /* F4 F5 F6 */ - - FSTP_S( D(0) ) /* F5 F6 */ - FSTP_S( D(1) ) /* F6 */ - FSTP_S( D(2) ) /* */ - - MOV_L( CONST(FP_ONE), D(3) ) -LLBL(p3m3dnrv16_skip): - ADD_L( CONST(64), EDI ) - ADD_L( EAX, ESI ) - DEC_L( ECX ) - JNZ( LLBL(p3m3dnrv16_top) ) - - -LLBL(p3m3dnrv16_finish): - POP_L( EDI ) - POP_L( ESI ) - RET -#undef FRAME_OFFSET - -/* -######################################## -## -## gl_x86_transform_points3_perspective -## -## -*/ - GLOBL GLNAME(gl_x86_transform_points3_perspective_v16) - ALIGNTEXT4 -GLNAME(gl_x86_transform_points3_perspective_v16): - -#define FRAME_OFFSET 12 - PUSH_L( ESI ) - PUSH_L( EDI ) - - PUSH_L( EBX ) - - MOV_L( ARG_SOURCE, ESI ) /* ptr to source */ - MOV_L( ARG_DEST, EDI ) /* ptr to dest */ - - MOV_L( ARG_MATRIX, EDX ) /* ptr to matrix */ - MOV_L( ARG_COUNT, ECX ) /* count */ - - TEST_L( ECX, ECX) - JZ( LLBL(p3mpv16_finish) ) /* count was zero; go to finish */ - - MOV_L( ARG_STRIDE, EAX ) /* stride */ - - - ALIGNTEXT4ifNOP -LLBL(p3mpv16_top): - - - FLD_S( S(0) ) /* F4 */ - FMUL_S( M(0) ) - - FLD_S( S(1) ) /* F5 F4 */ - FMUL_S( M(5) ) - - FLD_S( S(2) ) /* F0 F5 F4 */ - FMUL_S( M(8) ) - FLD_S( S(2) ) /* F1 F0 F5 F4 */ - FMUL_S( M(9) ) - FLD_S( S(2) ) /* F2 F1 F0 F5 F4 */ - FMUL_S( M(10) ) - - FXCH( ST(2) ) /* F0 F1 F2 F5 F4 */ - FADDP( ST(0), ST(4) ) /* F1 F2 F5 F4 */ - FADDP( ST(0), ST(2) ) /* F2 F5 F4 */ - FLD_S( M(14) ) /* F6 F2 F5 F4 */ - FXCH( ST(1) ) /* F2 F6 F5 F4 */ - FADDP( ST(0), ST(1) ) /* F6 F5 F4 */ - - MOV_L( S(2), EBX ) - XOR_L( CONST(-2147483648), EBX ) /* change sign */ - - FXCH( ST(2) ) /* F4 F5 F6 */ - FSTP_S( D(0) ) /* F5 F6 */ - FSTP_S( D(1) ) /* F6 */ - FSTP_S( D(2) ) /* */ - MOV_L( EBX, D(3) ) - -LLBL(p3mpv16_skip): - ADD_L( CONST(64), EDI ) - ADD_L( EAX, ESI ) - DEC_L( ECX ) - JNZ( LLBL(p3mpv16_top) ) - - -LLBL(p3mpv16_finish): - POP_L( EBX ) - POP_L( EDI ) - POP_L( ESI ) - RET -#undef FRAME_OFFSET - -/* -######################################## -## -## gl_x86_transform_points4_general -## -## -*/ - GLOBL GLNAME(gl_x86_transform_points4_general_v16) - ALIGNTEXT4 -GLNAME(gl_x86_transform_points4_general_v16): - -#define FRAME_OFFSET 8 - PUSH_L( ESI ) - PUSH_L( EDI ) - - - MOV_L( ARG_SOURCE, ESI ) /* ptr to source */ - MOV_L( ARG_DEST, EDI ) /* ptr to dest */ - - MOV_L( ARG_MATRIX, EDX ) /* ptr to matrix */ - MOV_L( ARG_COUNT, ECX ) /* count */ - - TEST_L( ECX, ECX) - JZ( LLBL(p4mgv16_finish) ) /* count was zero; go to finish */ - - MOV_L( ARG_STRIDE, EAX ) /* stride */ - - - ALIGNTEXT4ifNOP -LLBL(p4mgv16_top): - - - FLD_S( S(0) ) /* F4 */ - FMUL_S( M(0) ) - FLD_S( S(0) ) /* F5 F4 */ - FMUL_S( M(1) ) - FLD_S( S(0) ) /* F6 F5 F4 */ - FMUL_S( M(2) ) - FLD_S( S(0) ) /* F7 F6 F5 F4 */ - FMUL_S( M(3) ) - - FLD_S( S(1) ) /* F0 F7 F6 F5 F4 */ - FMUL_S( M(4) ) - FLD_S( S(1) ) /* F1 F0 F7 F6 F5 F4 */ - FMUL_S( M(5) ) - FLD_S( S(1) ) /* F2 F1 F0 F7 F6 F5 F4 */ - FMUL_S( M(6) ) - FLD_S( S(1) ) /* F3 F2 F1 F0 F7 F6 F5 F4 */ - FMUL_S( M(7) ) - - FXCH( ST(3) ) /* F0 F2 F1 F3 F7 F6 F5 F4 */ - FADDP( ST(0), ST(7) ) /* F2 F1 F3 F7 F6 F5 F4 */ - FXCH( ST(1) ) /* F1 F2 F3 F7 F6 F5 F4 */ - FADDP( ST(0), ST(5) ) /* F2 F3 F7 F6 F5 F4 */ - FADDP( ST(0), ST(3) ) /* F3 F7 F6 F5 F4 */ - FADDP( ST(0), ST(1) ) /* F7 F6 F5 F4 */ - - FLD_S( S(2) ) /* F0 F7 F6 F5 F4 */ - FMUL_S( M(8) ) - FLD_S( S(2) ) /* F1 F0 F7 F6 F5 F4 */ - FMUL_S( M(9) ) - FLD_S( S(2) ) /* F2 F1 F0 F7 F6 F5 F4 */ - FMUL_S( M(10) ) - FLD_S( S(2) ) /* F3 F2 F1 F0 F7 F6 F5 F4 */ - FMUL_S( M(11) ) - - FXCH( ST(3) ) /* F0 F2 F1 F3 F7 F6 F5 F4 */ - FADDP( ST(0), ST(7) ) /* F2 F1 F3 F7 F6 F5 F4 */ - FXCH( ST(1) ) /* F1 F2 F3 F7 F6 F5 F4 */ - FADDP( ST(0), ST(5) ) /* F2 F3 F7 F6 F5 F4 */ - FADDP( ST(0), ST(3) ) /* F3 F7 F6 F5 F4 */ - FADDP( ST(0), ST(1) ) /* F7 F6 F5 F4 */ - - FLD_S( S(3) ) /* F0 F7 F6 F5 F4 */ - FMUL_S( M(12) ) - FLD_S( S(3) ) /* F1 F0 F7 F6 F5 F4 */ - FMUL_S( M(13) ) - FLD_S( S(3) ) /* F2 F1 F0 F7 F6 F5 F4 */ - FMUL_S( M(14) ) - FLD_S( S(3) ) /* F3 F2 F1 F0 F7 F6 F5 F4 */ - FMUL_S( M(15) ) - - FXCH( ST(3) ) /* F0 F2 F1 F3 F7 F6 F5 F4 */ - FADDP( ST(0), ST(7) ) /* F2 F1 F3 F7 F6 F5 F4 */ - FXCH( ST(1) ) /* F1 F2 F3 F7 F6 F5 F4 */ - FADDP( ST(0), ST(5) ) /* F2 F3 F7 F6 F5 F4 */ - FADDP( ST(0), ST(3) ) /* F3 F7 F6 F5 F4 */ - FADDP( ST(0), ST(1) ) /* F7 F6 F5 F4 */ - - FXCH( ST(3) ) /* F4 F6 F5 F7 */ - FSTP_S( D(0) ) /* F6 F5 F7 */ - FXCH( ST(1) ) /* F5 F6 F7 */ - FSTP_S( D(1) ) /* F6 F7 */ - FSTP_S( D(2) ) /* F7 */ - FSTP_S( D(3) ) /* */ - -LLBL(p4mgv16_skip): - ADD_L( CONST(64), EDI ) - ADD_L( EAX, ESI ) - DEC_L( ECX ) - JNZ( LLBL(p4mgv16_top) ) - - -LLBL(p4mgv16_finish): - POP_L( EDI ) - POP_L( ESI ) - RET -#undef FRAME_OFFSET - -/* -######################################## -## -## gl_x86_transform_points4_identity -## -## -*/ - GLOBL GLNAME(gl_x86_transform_points4_identity_v16) - ALIGNTEXT4 -GLNAME(gl_x86_transform_points4_identity_v16): - -#define FRAME_OFFSET 12 - PUSH_L( ESI ) - PUSH_L( EDI ) - - PUSH_L( EBX ) - - MOV_L( ARG_SOURCE, ESI ) /* ptr to source */ - MOV_L( ARG_DEST, EDI ) /* ptr to dest */ - - MOV_L( ARG_MATRIX, EDX ) /* ptr to matrix */ - MOV_L( ARG_COUNT, ECX ) /* count */ - - TEST_L( ECX, ECX) - JZ( LLBL(p4miv16_finish) ) /* count was zero; go to finish */ - - MOV_L( ARG_STRIDE, EAX ) /* stride */ - - - CMP_L( ESI, EDI ) - JE( LLBL(p4miv16_finish) ) - - ALIGNTEXT4ifNOP -LLBL(p4miv16_top): - - MOV_L( S(0), EBX ) - MOV_L( S(1), EDX ) - - MOV_L( EBX, D(0) ) - MOV_L( EDX, D(1) ) - - MOV_L( S(2), EBX ) - MOV_L( S(3), EDX ) - - MOV_L( EBX, D(2) ) - MOV_L( EDX, D(3) ) -LLBL(p4miv16_skip): - ADD_L( CONST(64), EDI ) - ADD_L( EAX, ESI ) - DEC_L( ECX ) - JNZ( LLBL(p4miv16_top) ) - - -LLBL(p4miv16_finish): - POP_L( EBX ) - POP_L( EDI ) - POP_L( ESI ) - RET -#undef FRAME_OFFSET - -/* -######################################## -## -## gl_x86_transform_points4_2d -## -## -*/ - GLOBL GLNAME(gl_x86_transform_points4_2d_v16) - ALIGNTEXT4 -GLNAME(gl_x86_transform_points4_2d_v16): - -#define FRAME_OFFSET 16 - PUSH_L( ESI ) - PUSH_L( EDI ) - - PUSH_L( EBX ) - PUSH_L( EBP ) - - MOV_L( ARG_SOURCE, ESI ) /* ptr to source */ - MOV_L( ARG_DEST, EDI ) /* ptr to dest */ - - MOV_L( ARG_MATRIX, EDX ) /* ptr to matrix */ - MOV_L( ARG_COUNT, ECX ) /* count */ - - TEST_L( ECX, ECX) - JZ( LLBL(p4m2dv16_finish) ) /* count was zero; go to finish */ - - MOV_L( ARG_STRIDE, EAX ) /* stride */ - - - ALIGNTEXT4ifNOP -LLBL(p4m2dv16_top): - - - FLD_S( S(0) ) /* F4 */ - FMUL_S( M(0) ) - FLD_S( S(0) ) /* F5 F4 */ - FMUL_S( M(1) ) - - FLD_S( S(1) ) /* F0 F5 F4 */ - FMUL_S( M(4) ) - FLD_S( S(1) ) /* F1 F0 F5 F4 */ - FMUL_S( M(5) ) - - FXCH( ST(1) ) /* F0 F1 F5 F4 */ - FADDP( ST(0), ST(3) ) /* F1 F5 F4 */ - FADDP( ST(0), ST(1) ) /* F5 F4 */ - - FLD_S( S(3) ) /* F0 F5 F4 */ - FMUL_S( M(12) ) - FLD_S( S(3) ) /* F1 F0 F5 F4 */ - FMUL_S( M(13) ) - - FXCH( ST(1) ) /* F0 F1 F5 F4 */ - FADDP( ST(0), ST(3) ) /* F1 F5 F4 */ - FADDP( ST(0), ST(1) ) /* F5 F4 */ - - MOV_L( S(2), EBX ) - MOV_L( S(3), EBP ) - - FXCH( ST(1) ) /* F4 F5 */ - FSTP_S( D(0) ) /* F5 */ - FSTP_S( D(1) ) /* */ - MOV_L( EBX, D(2) ) - MOV_L( EBP, D(3) ) - -LLBL(p4m2dv16_skip): - ADD_L( CONST(64), EDI ) - ADD_L( EAX, ESI ) - DEC_L( ECX ) - JNZ( LLBL(p4m2dv16_top) ) - - -LLBL(p4m2dv16_finish): - POP_L( EBP ) - POP_L( EBX ) - POP_L( EDI ) - POP_L( ESI ) - RET -#undef FRAME_OFFSET - -/* -######################################## -## -## gl_x86_transform_points4_2d_no_rot -## -## -*/ - GLOBL GLNAME(gl_x86_transform_points4_2d_no_rot_v16) - ALIGNTEXT4 -GLNAME(gl_x86_transform_points4_2d_no_rot_v16): - -#define FRAME_OFFSET 16 - PUSH_L( ESI ) - PUSH_L( EDI ) - - PUSH_L( EBX ) - PUSH_L( EBP ) - - MOV_L( ARG_SOURCE, ESI ) /* ptr to source */ - MOV_L( ARG_DEST, EDI ) /* ptr to dest */ - - MOV_L( ARG_MATRIX, EDX ) /* ptr to matrix */ - MOV_L( ARG_COUNT, ECX ) /* count */ - - TEST_L( ECX, ECX) - JZ( LLBL(p4m2dnrv16_finish) ) /* count was zero; go to finish */ - - MOV_L( ARG_STRIDE, EAX ) /* stride */ - - - ALIGNTEXT4ifNOP -LLBL(p4m2dnrv16_top): - - - FLD_S( S(0) ) /* F4 */ - FMUL_S( M(0) ) - - FLD_S( S(1) ) /* F5 F4 */ - FMUL_S( M(5) ) - - FLD_S( S(3) ) /* F0 F5 F4 */ - FMUL_S( M(12) ) - FLD_S( S(3) ) /* F1 F0 F5 F4 */ - FMUL_S( M(13) ) - - FXCH( ST(1) ) /* F0 F1 F5 F4 */ - FADDP( ST(0), ST(3) ) /* F1 F5 F4 */ - FADDP( ST(0), ST(1) ) /* F5 F4 */ - - MOV_L( S(2), EBX ) - MOV_L( S(3), EBP ) - - FXCH( ST(1) ) /* F4 F5 */ - FSTP_S( D(0) ) /* F5 */ - FSTP_S( D(1) ) /* */ - MOV_L( EBX, D(2) ) - MOV_L( EBP, D(3) ) - -LLBL(p4m2dnrv16_skip): - ADD_L( CONST(64), EDI ) - ADD_L( EAX, ESI ) - DEC_L( ECX ) - JNZ( LLBL(p4m2dnrv16_top) ) - - -LLBL(p4m2dnrv16_finish): - POP_L( EBP ) - POP_L( EBX ) - POP_L( EDI ) - POP_L( ESI ) - RET -#undef FRAME_OFFSET - -/* -######################################## -## -## gl_x86_transform_points4_3d -## -## -*/ - GLOBL GLNAME(gl_x86_transform_points4_3d_v16) - ALIGNTEXT4 -GLNAME(gl_x86_transform_points4_3d_v16): - -#define FRAME_OFFSET 12 - PUSH_L( ESI ) - PUSH_L( EDI ) - - PUSH_L( EBX ) - - MOV_L( ARG_SOURCE, ESI ) /* ptr to source */ - MOV_L( ARG_DEST, EDI ) /* ptr to dest */ - - MOV_L( ARG_MATRIX, EDX ) /* ptr to matrix */ - MOV_L( ARG_COUNT, ECX ) /* count */ - - TEST_L( ECX, ECX) - JZ( LLBL(p4m3dv16_finish) ) /* count was zero; go to finish */ - - MOV_L( ARG_STRIDE, EAX ) /* stride */ - - - ALIGNTEXT4ifNOP -LLBL(p4m3dv16_top): - - - FLD_S( S(0) ) /* F4 */ - FMUL_S( M(0) ) - FLD_S( S(0) ) /* F5 F4 */ - FMUL_S( M(1) ) - FLD_S( S(0) ) /* F6 F5 F4 */ - FMUL_S( M(2) ) - - FLD_S( S(1) ) /* F0 F6 F5 F4 */ - FMUL_S( M(4) ) - FLD_S( S(1) ) /* F1 F0 F6 F5 F4 */ - FMUL_S( M(5) ) - FLD_S( S(1) ) /* F2 F1 F0 F6 F5 F4 */ - FMUL_S( M(6) ) - - FXCH( ST(2) ) /* F0 F1 F2 F6 F5 F4 */ - FADDP( ST(0), ST(5) ) /* F1 F2 F6 F5 F4 */ - FADDP( ST(0), ST(3) ) /* F2 F6 F5 F4 */ - FADDP( ST(0), ST(1) ) /* F6 F5 F4 */ - - FLD_S( S(2) ) /* F0 F6 F5 F4 */ - FMUL_S( M(8) ) - FLD_S( S(2) ) /* F1 F0 F6 F5 F4 */ - FMUL_S( M(9) ) - FLD_S( S(2) ) /* F2 F1 F0 F6 F5 F4 */ - FMUL_S( M(10) ) - - FXCH( ST(2) ) /* F0 F1 F2 F6 F5 F4 */ - FADDP( ST(0), ST(5) ) /* F1 F2 F6 F5 F4 */ - FADDP( ST(0), ST(3) ) /* F2 F6 F5 F4 */ - FADDP( ST(0), ST(1) ) /* F6 F5 F4 */ - - FLD_S( S(3) ) /* F0 F6 F5 F4 */ - FMUL_S( M(12) ) - FLD_S( S(3) ) /* F1 F0 F6 F5 F4 */ - FMUL_S( M(13) ) - FLD_S( S(3) ) /* F2 F1 F0 F6 F5 F4 */ - FMUL_S( M(14) ) - - FXCH( ST(2) ) /* F0 F1 F2 F6 F5 F4 */ - FADDP( ST(0), ST(5) ) /* F1 F2 F6 F5 F4 */ - FADDP( ST(0), ST(3) ) /* F2 F6 F5 F4 */ - FADDP( ST(0), ST(1) ) /* F6 F5 F4 */ - - MOV_L( S(3), EBX ) - - FXCH( ST(2) ) /* F4 F5 F6 */ - FSTP_S( D(0) ) /* F5 F6 */ - FSTP_S( D(1) ) /* F6 */ - FSTP_S( D(2) ) /* */ - MOV_L( EBX, D(3) ) - -LLBL(p4m3dv16_skip): - ADD_L( CONST(64), EDI ) - ADD_L( EAX, ESI ) - DEC_L( ECX ) - JNZ( LLBL(p4m3dv16_top) ) - - -LLBL(p4m3dv16_finish): - POP_L( EBX ) - POP_L( EDI ) - POP_L( ESI ) - RET -#undef FRAME_OFFSET - -/* -######################################## -## -## gl_x86_transform_points4_3d_no_rot -## -## -*/ - GLOBL GLNAME(gl_x86_transform_points4_3d_no_rot_v16) - ALIGNTEXT4 -GLNAME(gl_x86_transform_points4_3d_no_rot_v16): - -#define FRAME_OFFSET 12 - PUSH_L( ESI ) - PUSH_L( EDI ) - - PUSH_L( EBX ) - - MOV_L( ARG_SOURCE, ESI ) /* ptr to source */ - MOV_L( ARG_DEST, EDI ) /* ptr to dest */ - - MOV_L( ARG_MATRIX, EDX ) /* ptr to matrix */ - MOV_L( ARG_COUNT, ECX ) /* count */ - - TEST_L( ECX, ECX) - JZ( LLBL(p4m3dnrv16_finish) ) /* count was zero; go to finish */ - - MOV_L( ARG_STRIDE, EAX ) /* stride */ - - - ALIGNTEXT4ifNOP -LLBL(p4m3dnrv16_top): - - - FLD_S( S(0) ) /* F4 */ - FMUL_S( M(0) ) - - FLD_S( S(1) ) /* F5 F4 */ - FMUL_S( M(5) ) - - FLD_S( S(2) ) /* F6 F5 F4 */ - FMUL_S( M(10) ) - - FLD_S( S(3) ) /* F0 F6 F5 F4 */ - FMUL_S( M(12) ) - FLD_S( S(3) ) /* F1 F0 F6 F5 F4 */ - FMUL_S( M(13) ) - FLD_S( S(3) ) /* F2 F1 F0 F6 F5 F4 */ - FMUL_S( M(14) ) - - FXCH( ST(2) ) /* F0 F1 F2 F6 F5 F4 */ - FADDP( ST(0), ST(5) ) /* F1 F2 F6 F5 F4 */ - FADDP( ST(0), ST(3) ) /* F2 F6 F5 F4 */ - FADDP( ST(0), ST(1) ) /* F6 F5 F4 */ - - MOV_L( S(3), EBX ) - - FXCH( ST(2) ) /* F4 F5 F6 */ - FSTP_S( D(0) ) /* F5 F6 */ - FSTP_S( D(1) ) /* F6 */ - FSTP_S( D(2) ) /* */ - MOV_L( EBX, D(3) ) - -LLBL(p4m3dnrv16_skip): - ADD_L( CONST(64), EDI ) - ADD_L( EAX, ESI ) - DEC_L( ECX ) - JNZ( LLBL(p4m3dnrv16_top) ) - - -LLBL(p4m3dnrv16_finish): - POP_L( EBX ) - POP_L( EDI ) - POP_L( ESI ) - RET -#undef FRAME_OFFSET - -/* -######################################## -## -## gl_x86_transform_points4_perspective -## -## -*/ - GLOBL GLNAME(gl_x86_transform_points4_perspective_v16) - ALIGNTEXT4 -GLNAME(gl_x86_transform_points4_perspective_v16): - -#define FRAME_OFFSET 12 - PUSH_L( ESI ) - PUSH_L( EDI ) - - PUSH_L( EBX ) - - MOV_L( ARG_SOURCE, ESI ) /* ptr to source */ - MOV_L( ARG_DEST, EDI ) /* ptr to dest */ - - MOV_L( ARG_MATRIX, EDX ) /* ptr to matrix */ - MOV_L( ARG_COUNT, ECX ) /* count */ - - TEST_L( ECX, ECX) - JZ( LLBL(p4mpv16_finish) ) /* count was zero; go to finish */ - - MOV_L( ARG_STRIDE, EAX ) /* stride */ - - - ALIGNTEXT4ifNOP -LLBL(p4mpv16_top): - - - FLD_S( S(0) ) /* F4 */ - FMUL_S( M(0) ) - - FLD_S( S(1) ) /* F5 F4 */ - FMUL_S( M(5) ) - - FLD_S( S(2) ) /* F0 F5 F4 */ - FMUL_S( M(8) ) - FLD_S( S(2) ) /* F1 F0 F5 F4 */ - FMUL_S( M(9) ) - FLD_S( S(2) ) /* F6 F1 F0 F5 F4 */ - FMUL_S( M(10) ) - - FXCH( ST(2) ) /* F0 F1 F6 F5 F4 */ - FADDP( ST(0), ST(4) ) /* F1 F6 F5 F4 */ - FADDP( ST(0), ST(2) ) /* F6 F5 F4 */ - - FLD_S( S(3) ) /* F2 F6 F5 F4 */ - FMUL_S( M(14) ) - - FADDP( ST(0), ST(1) ) /* F6 F5 F4 */ - - MOV_L( S(2), EBX ) - XOR_L( CONST(-2147483648), EBX ) /* change sign */ - - FXCH( ST(2) ) /* F4 F5 F6 */ - FSTP_S( D(0) ) /* F5 F6 */ - FSTP_S( D(1) ) /* F6 */ - FSTP_S( D(2) ) /* */ - MOV_L( EBX, D(3) ) - -LLBL(p4mpv16_skip): - ADD_L( CONST(64), EDI ) - ADD_L( EAX, ESI ) - DEC_L( ECX ) - JNZ( LLBL(p4mpv16_top) ) - - -LLBL(p4mpv16_finish): - POP_L( EBX ) - POP_L( EDI ) - POP_L( ESI ) - RET -#undef FRAME_OFFSET - - - -#undef OFFSET_DEST -#undef OFFSET_MATRIX -#undef OFFSET_SOURCE -#undef OFFSET_STRIDE -#undef OFFSET_COUNT - -#undef ARG_DEST -#undef ARG_MATRIX -#undef ARG_SOURCE -#undef ARG_STRIDE -#undef ARG_COUNT - - -/* - * Table for clip test. - * - * bit6 = S(3) < 0 - * bit5 = S(2) < 0 - * bit4 = abs(S(2)) > abs(S(3)) - * bit3 = S(1) < 0 - * bit2 = abs(S(1)) > abs(S(3)) - * bit1 = S(0) < 0 - * bit0 = abs(S(0)) > abs(S(3)) - */ - - - SEG_DATA - -clip_table: - D_BYTE 0, 1, 0, 2, 4, 5, 4, 6 - D_BYTE 0, 1, 0, 2, 8, 9, 8, 10 - D_BYTE 32, 33, 32, 34, 36, 37, 36, 38 - D_BYTE 32, 33, 32, 34, 40, 41, 40, 42 - D_BYTE 0, 1, 0, 2, 4, 5, 4, 6 - D_BYTE 0, 1, 0, 2, 8, 9, 8, 10 - D_BYTE 16, 17, 16, 18, 20, 21, 20, 22 - D_BYTE 16, 17, 16, 18, 24, 25, 24, 26 - D_BYTE 63, 61, 63, 62, 55, 53, 55, 54 - D_BYTE 63, 61, 63, 62, 59, 57, 59, 58 - D_BYTE 47, 45, 47, 46, 39, 37, 39, 38 - D_BYTE 47, 45, 47, 46, 43, 41, 43, 42 - D_BYTE 63, 61, 63, 62, 55, 53, 55, 54 - D_BYTE 63, 61, 63, 62, 59, 57, 59, 58 - D_BYTE 31, 29, 31, 30, 23, 21, 23, 22 - D_BYTE 31, 29, 31, 30, 27, 25, 27, 26 - - SEG_TEXT - -/* - * Offsets for clip_func arguments - * - * typedef GLvector4f *(*clip_func)( GLvector4f *vClip, - * GLvector4f *vProj, - * GLubyte clipMask[], - * GLubyte *orMask, - * GLubyte *andMask ); - */ - -#define OFFSET_SOURCE 4 -#define OFFSET_DEST 8 -#define OFFSET_CLIP 12 -#define OFFSET_OR 16 -#define OFFSET_AND 20 - -#define ARG_SOURCE REGOFF(FRAME_OFFSET+OFFSET_SOURCE, ESP) -#define ARG_DEST REGOFF(FRAME_OFFSET+OFFSET_DEST, ESP) -#define ARG_CLIP REGOFF(FRAME_OFFSET+OFFSET_CLIP, ESP) -#define ARG_OR REGOFF(FRAME_OFFSET+OFFSET_OR, ESP) -#define ARG_AND REGOFF(FRAME_OFFSET+OFFSET_AND, ESP) - -/* -######################################## -## -## gl_x86_cliptest_points4 -## -## AL: ormask -## AH: andmask -## EBX: temp0 -## ECX: temp1 -## EDX: clipmask[] -## ESI: clip[] -## EDI: proj[] -## EBP: temp2 -## -######################################## -*/ - -#if defined(__ELF__) && defined(__PIC__) && !defined(ELFPIC) -#define ELFPIC -#endif - - GLOBL GLNAME(gl_x86_cliptest_points4) - ALIGNTEXT4 - -GLNAME(gl_x86_cliptest_points4): -#ifdef ELFPIC -#define FRAME_OFFSET 20 -#else -#define FRAME_OFFSET 16 -#endif - PUSH_L( ESI ) - PUSH_L( EDI ) - PUSH_L( EBP ) - PUSH_L( EBX ) - -#ifdef ELFPIC - /* store pointer to clip_table on stack */ - CALL( LLBL(ctp4_get_eip) ) - ADD_L( CONST(_GLOBAL_OFFSET_TABLE_), EBX ) - MOV_L( REGOFF(clip_table@GOT, EBX), EBX ) - PUSH_L( EBX ) - JMP( LLBL(ctp4_clip_table_ready) ) - -LLBL(ctp4_get_eip): - /* store eip in ebx */ - MOV_L( REGIND(ESP), EBX ) - RET - -LLBL(ctp4_clip_table_ready): -#endif - - MOV_L( ARG_SOURCE, ESI ) - MOV_L( ARG_DEST, EDI ) - - MOV_L( ARG_CLIP, EDX ) - MOV_L( ARG_OR, EBX ) - - MOV_L( ARG_AND, EBP ) - MOV_L( REGOFF(V4F_STRIDE, ESI), EAX ) /* source stride */ - - MOV_L( REGOFF(V4F_COUNT, ESI), ECX ) /* source count */ - MOV_L( REGOFF(V4F_START, ESI), ESI ) /* ptr to first source vertex */ - - OR_L( CONST(VEC_SIZE_4), REGOFF(V4F_FLAGS, EDI) ) /* set dest flags */ - MOV_L( EAX, ARG_SOURCE ) /* put stride in ARG_SOURCE */ - - MOV_L( CONST(3), REGOFF(V4F_SIZE, EDI) ) /* set dest size */ - MOV_L( ECX, REGOFF(V4F_COUNT, EDI) ) /* set dest count */ - - MOV_L( REGOFF(V4F_START, EDI), EDI ) /* ptr to first dest vertex */ - ADD_L( EDX, ECX ) - - MOV_L( ECX, ARG_CLIP ) /* put clipmask + count in ARG_CLIP */ - CMP_L( ECX, EDX ) - - MOV_B( REGIND(EBX), AL ) - MOV_B( REGIND(EBP), AH ) - - JZ( LLBL(ctp4_finish) ) - - ALIGNTEXT4ifNOP -LLBL(ctp4_top): - FLD1 /* F3 */ - FDIV_S( S(3) ) - - MOV_L( S(3), EBP ) - MOV_L( S(2), EBX ) - - XOR_L( ECX, ECX ) - ADD_L( EBP, EBP ) /* ebp = abs(S(3))*2 ; carry = sign of S(3) */ - - ADC_L( ECX, ECX ) - ADD_L( EBX, EBX ) /* ebx = abs(S(2))*2 ; carry = sign of S(2) */ - - ADC_L( ECX, ECX ) - CMP_L( EBX, EBP ) /* carry = abs(S(2))*2 > abs(S(3))*2 */ - - ADC_L( ECX, ECX ) - MOV_L( S(1), EBX ) - - ADD_L( EBX, EBX ) /* ebx = abs(S(1))*2 ; carry = sign of S(1) */ - - ADC_L( ECX, ECX ) - CMP_L( EBX, EBP ) /* carry = abs(S(1))*2 > abs(S(3))*2 */ - - ADC_L( ECX, ECX ) - MOV_L( S(0), EBX ) - - ADD_L( EBX, EBX ) /* ebx = abs(S(0))*2 ; carry = sign of S(0) */ - - ADC_L( ECX, ECX ) - CMP_L( EBX, EBP ) /* carry = abs(S(0))*2 > abs(S(3))*2 */ - - ADC_L( ECX, ECX ) - -#ifdef ELFPIC - MOV_L( REGIND(ESP), EBP ) /* clip_table */ - - MOV_B( REGBI(EBP, ECX), CL ) -#else - MOV_B( REGOFF(clip_table,ECX), CL ) -#endif - - OR_B( CL, AL ) - AND_B( CL, AH ) - - TEST_B( CL, CL ) - MOV_B( CL, REGIND(EDX) ) - - JZ( LLBL(ctp4_proj) ) - - FSTP( ST(0) ) /* */ - JMP( LLBL(ctp4_next) ) - -LLBL(ctp4_proj): - FLD_S( S(0) ) /* F0 F3 */ - FMUL2( ST(1), ST(0) ) - - FLD_S( S(1) ) /* F1 F0 F3 */ - FMUL2( ST(2), ST(0) ) - - FLD_S( S(2) ) /* F2 F1 F0 F3 */ - FMUL2( ST(3), ST(0) ) - - FXCH( ST(2) ) /* F0 F1 F2 F3 */ - FSTP_S( D(0) ) /* F1 F2 F3 */ - FSTP_S( D(1) ) /* F2 F3 */ - FSTP_S( D(2) ) /* F3 */ - FSTP_S( D(3) ) /* */ - -LLBL(ctp4_next): - INC_L( EDX ) - ADD_L( CONST(16), EDI ) - - ADD_L( ARG_SOURCE, ESI ) - CMP_L( EDX, ARG_CLIP ) - - JNZ( LLBL(ctp4_top) ) - - MOV_L( ARG_OR, ECX ) - MOV_L( ARG_AND, EDX ) - - MOV_B( AL, REGIND(ECX) ) - MOV_B( AH, REGIND(EDX) ) - -LLBL(ctp4_finish): - MOV_L( ARG_DEST, EAX ) -#ifdef ELFPIC - POP_L( ESI ) /* discard ptr to clip_table */ -#endif - POP_L( EBX ) - POP_L( EBP ) - POP_L( EDI ) - POP_L( ESI ) - - RET - - - - -/* -######################################## -## -## gl_v16_x86_cliptest_points4 -## -## Performs cliptesting equivalent to that done by cliptest_v16() -## in vertices.c -## -## This is a hacked version of the original above. -## -######################################## -*/ - - - -#define OFFSET_V16_SOURCE 4 -#define OFFSET_V16_LAST 8 -#define OFFSET_V16_OR 12 -#define OFFSET_V16_AND 16 -#define OFFSET_V16_MASK 20 - -#define ARG_V16_SOURCE REGOFF(V16_FRAME_OFFSET+OFFSET_V16_SOURCE, ESP) -#define ARG_V16_LAST REGOFF(V16_FRAME_OFFSET+OFFSET_V16_LAST, ESP) -#define ARG_V16_OR REGOFF(V16_FRAME_OFFSET+OFFSET_V16_OR, ESP) -#define ARG_V16_AND REGOFF(V16_FRAME_OFFSET+OFFSET_V16_AND, ESP) -#define ARG_V16_MASK REGOFF(V16_FRAME_OFFSET+OFFSET_V16_MASK, ESP) - - -#if defined(__ELF__) && defined(__PIC__) && !defined(ELFPIC) -#define ELFPIC -#endif - - GLOBL GLNAME(gl_v16_x86_cliptest_points4) - ALIGNTEXT4 - -GLNAME(gl_v16_x86_cliptest_points4): -#ifdef ELFPIC -#define V16_FRAME_OFFSET 20 -#else -#define V16_FRAME_OFFSET 16 -#endif - PUSH_L( ESI ) - PUSH_L( EDI ) - PUSH_L( EBP ) - PUSH_L( EBX ) - -#ifdef ELFPIC - /* store pointer to clip_table on stack */ - CALL( LLBL(v16_ctp4_get_eip) ) - ADD_L( CONST(_GLOBAL_OFFSET_TABLE_), EBX ) - MOV_L( REGOFF(clip_table@GOT, EBX), EBX ) - PUSH_L( EBX ) - JMP( LLBL(v16_ctp4_clip_table_ready) ) - -LLBL(v16_ctp4_get_eip): - /* store eip in ebx */ - MOV_L( REGIND(ESP), EBX ) - RET - -LLBL(v16_ctp4_clip_table_ready): -#endif - - MOV_L( ARG_V16_SOURCE, ESI ) /* ptr to first source vertex */ - MOV_L( ARG_V16_LAST, EDX ) /* ptr to last source vertex */ - MOV_L( ARG_V16_OR, EBX ) - MOV_L( ARG_V16_AND, EBP ) - MOV_L( ARG_V16_MASK, EDI ) - - CMP_L( EDX, ESI ) - - MOV_B( REGIND(EBX), AL ) - MOV_B( REGIND(EBP), AH ) - - JZ( LLBL(v16_ctp4_finish) ) - - ALIGNTEXT4ifNOP -LLBL(v16_ctp4_top): -#if 0 - FLD1 /* F0 */ - FDIV_S( S(3) ) -#endif - - MOV_L( S(3), EBP ) - MOV_L( S(2), EBX ) - - XOR_L( ECX, ECX ) - ADD_L( EBP, EBP ) /* ebp = abs(S(3))*2 ; carry = sign of S(3) */ - - ADC_L( ECX, ECX ) - ADD_L( EBX, EBX ) /* ebx = abs(S(2))*2 ; carry = sign of S(2) */ - - ADC_L( ECX, ECX ) - CMP_L( EBX, EBP ) /* carry = abs(S(2))*2 > abs(S(3))*2 */ - - ADC_L( ECX, ECX ) - MOV_L( S(1), EBX ) - - ADD_L( EBX, EBX ) /* ebx = abs(S(1))*2 ; carry = sign of S(1) */ - - ADC_L( ECX, ECX ) - CMP_L( EBX, EBP ) /* carry = abs(S(1))*2 > abs(S(3))*2 */ - - ADC_L( ECX, ECX ) - MOV_L( S(0), EBX ) - - ADD_L( EBX, EBX ) /* ebx = abs(S(0))*2 ; carry = sign of S(0) */ - - ADC_L( ECX, ECX ) - CMP_L( EBX, EBP ) /* carry = abs(S(0))*2 > abs(S(3))*2 */ - - ADC_L( ECX, ECX ) - -#ifdef ELFPIC - MOV_L( REGIND(ESP), EBP ) /* clip_table */ - - MOV_B( REGBI(EBP, ECX), CL ) -#else - MOV_B( REGOFF(clip_table,ECX), CL ) -#endif - - OR_B( CL, AL ) - AND_B( CL, AH ) - - MOV_B( CL, REGIND(EDI) ) /* save clipmask */ - INC_L( EDI ) /* next clipmask */ - -#if 0 - FSTP_S( S(8) ) /* */ /* GR_VERTEX_OOW_OFFSET */ -#endif - - ADD_L( CONST(64), ESI ) /* next fxVertex */ - - CMP_L( EDX, ESI ) /* finished? */ - JNZ( LLBL(v16_ctp4_top) ) - - MOV_L( ARG_V16_OR, ECX ) - MOV_L( ARG_V16_AND, EDX ) - - MOV_B( AL, REGIND(ECX) ) - MOV_B( AH, REGIND(EDX) ) - -LLBL(v16_ctp4_finish): - -#ifdef ELFPIC - POP_L( ESI ) /* discard ptr to clip_table */ -#endif - POP_L( EBX ) - POP_L( EBP ) - POP_L( EDI ) - POP_L( ESI ) - - RET - Index: xc/extras/Mesa/src/X86/x86a.S.m4 diff -u xc/extras/Mesa/src/X86/x86a.S.m4:1.1 xc/extras/Mesa/src/X86/x86a.S.m4:removed --- xc/extras/Mesa/src/X86/x86a.S.m4:1.1 Mon Dec 13 20:32:20 1999 +++ xc/extras/Mesa/src/X86/x86a.S.m4 Mon Dec 18 14:21:59 2000 @@ -1,1751 +0,0 @@ -include(x86flatregs.m4)dnl -dnl ############################################################ -dnl ## output_x86_transform_functions -dnl ## -dnl ## This macro is called twice. Once with mask checking -dnl ## versions of FUNCTION_HEAD, LOOP_HEAD, LOOP_TAIL and -dnl ## FUNCTION_TAIL, and once with versions that don't check -dnl ## the clip mask. -dnl ## -dnl ## The parameters for FUNCTION_HEAD are: -dnl ## - The function's name. The mask checking version will -dnl ## append "_masked" to this, the unmasked version appends -dnl ## "_raw". -dnl ## - A unique string (for labels). -dnl ## - The number of integer registers needed. Can be 0-2. -dnl ## If not zero, IREG_0 and/or IREG_1 will be defined. -dnl ## - The output vector size. -dnl ############################################################ -define(`output_x86_transform_functions', `dnl -/* -######################################## -## -## gl_x86_transform_points2_general -## -## -*/ -FUNCTION_HEAD(gl_x86_transform_points2_general, p2mg, 0, 4) - -LOOP_HEAD - - F_FLD_S( S(0), F4 ) - F_FMUL_S( M(0), F4 ) - F_FLD_S( S(0), F5 ) - F_FMUL_S( M(1), F5 ) - F_FLD_S( S(0), F6 ) - F_FMUL_S( M(2), F6 ) - F_FLD_S( S(0), F7 ) - F_FMUL_S( M(3), F7 ) - - F_FLD_S( S(1), F0 ) - F_FMUL_S( M(4), F0 ) - F_FLD_S( S(1), F1 ) - F_FMUL_S( M(5), F1 ) - F_FLD_S( S(1), F2 ) - F_FMUL_S( M(6), F2 ) - F_FLD_S( S(1), F3 ) - F_FMUL_S( M(7), F3 ) - - F_FADDP( F0, F4 ) - F_FADDP( F1, F5 ) - F_FADDP( F2, F6 ) - F_FADDP( F3, F7 ) - - F_FADD_S( M(12), F4 ) - F_FADD_S( M(13), F5 ) - F_FADD_S( M(14), F6 ) - F_FADD_S( M(15), F7 ) - - F_FSTP_S( F4, D(0) ) - F_FSTP_S( F5, D(1) ) - F_FSTP_S( F6, D(2) ) - F_FSTP_S( F7, D(3) ) - -LOOP_TAIL - -FUNCTION_TAIL - -/* -######################################## -## -## gl_x86_transform_points2_identity -## -## -*/ -FUNCTION_HEAD(gl_x86_transform_points2_identity, p2mi, 1, 2) - - CMP_L( ESI, EDI ) - JE( LLBL(SHORT_NAME`'_finish) ) - -LOOP_HEAD - MOV_L( S(0), IREG_0 ) - MOV_L( S(1), EDX ) - - MOV_L( IREG_0, D(0) ) - MOV_L( EDX, D(1) ) -LOOP_TAIL - -FUNCTION_TAIL - -/* -######################################## -## -## gl_x86_transform_points2_2d -## -## -*/ -FUNCTION_HEAD(gl_x86_transform_points2_2d, p2m2d, 0, 2) - -LOOP_HEAD - - F_FLD_S( S(0), F4 ) - F_FMUL_S( M(0), F4 ) - F_FLD_S( S(0), F5 ) - F_FMUL_S( M(1), F5 ) - - F_FLD_S( S(1), F0 ) - F_FMUL_S( M(4), F0 ) - F_FLD_S( S(1), F1 ) - F_FMUL_S( M(5), F1 ) - - F_FADDP( F0, F4 ) - F_FADDP( F1, F5 ) - - F_FADD_S( M(12), F4 ) - F_FADD_S( M(13), F5 ) - - F_FSTP_S( F4, D(0) ) - F_FSTP_S( F5, D(1) ) - -LOOP_TAIL - -FUNCTION_TAIL - -/* -######################################## -## -## gl_x86_transform_points2_2d_no_rot -## -## -*/ -FUNCTION_HEAD(gl_x86_transform_points2_2d_no_rot, p2m2dnr, 0, 2) - -LOOP_HEAD - - F_FLD_S( S(0), F4 ) - F_FMUL_S( M(0), F4 ) - - F_FLD_S( S(1), F1 ) - F_FMUL_S( M(5), F1 ) - - F_FADD_S( M(12), F4 ) - F_FLD_S( M(13), F5 ) - F_FADDP( F1, F5 ) - - F_FSTP_S( F4, D(0) ) - F_FSTP_S( F5, D(1) ) - -LOOP_TAIL - -FUNCTION_TAIL - -/* -######################################## -## -## gl_x86_transform_points2_3d -## -## -*/ -FUNCTION_HEAD(gl_x86_transform_points2_3d, p2m3d, 0, 3) - -LOOP_HEAD - - F_FLD_S( S(0), F4 ) - F_FMUL_S( M(0), F4 ) - F_FLD_S( S(0), F5 ) - F_FMUL_S( M(1), F5 ) - F_FLD_S( S(0), F6 ) - F_FMUL_S( M(2), F6 ) - - F_FLD_S( S(1), F0 ) - F_FMUL_S( M(4), F0 ) - F_FLD_S( S(1), F1 ) - F_FMUL_S( M(5), F1 ) - F_FLD_S( S(1), F2 ) - F_FMUL_S( M(6), F2 ) - - F_FADDP( F0, F4 ) - F_FADDP( F1, F5 ) - F_FADDP( F2, F6 ) - - F_FADD_S( M(12), F4 ) - F_FADD_S( M(13), F5 ) - F_FADD_S( M(14), F6 ) - - F_FSTP_S( F4, D(0) ) - F_FSTP_S( F5, D(1) ) - F_FSTP_S( F6, D(2) ) - -LOOP_TAIL - -FUNCTION_TAIL - -/* -######################################## -## -## gl_x86_transform_points2_3d_no_rot -## -## -*/ -FUNCTION_HEAD(gl_x86_transform_points2_3d_no_rot, p2m3dnr, 1, 3) - - MOV_L( M(14), IREG_0 ) -LOOP_HEAD - - F_FLD_S( S(0), F4 ) - F_FMUL_S( M(0), F4 ) - - F_FLD_S( S(1), F1 ) - F_FMUL_S( M(5), F1 ) - - F_FADD_S( M(12), F4 ) - F_FLD_S( M(13), F5 ) - F_FADDP( F1, F5 ) - - F_FSTP_S( F4, D(0) ) - F_FSTP_S( F5, D(1) ) - MOV_L( IREG_0, D(2) ) - -LOOP_TAIL - -FUNCTION_TAIL - -/* -######################################## -## -## gl_x86_transform_points2_perspective -## -## -*/ -FUNCTION_HEAD(gl_x86_transform_points2_perspective, p2mp, 1, 4) - - MOV_L( M(14), IREG_0 ) -LOOP_HEAD - - F_FLD_S( S(0), F4 ) - F_FMUL_S( M(0), F4 ) - - F_FLD_S( S(1), F1 ) - F_FMUL_S( M(5), F1 ) - - F_FSTP_S( F4, D(0) ) - F_FSTP_S( F1, D(1) ) - MOV_L( IREG_0, D(2) ) - MOV_L( CONST(FP_ZERO), D(3) ) - -LOOP_TAIL - -FUNCTION_TAIL - -/* -######################################## -## -## gl_x86_transform_points3_general -## -## -*/ -FUNCTION_HEAD(gl_x86_transform_points3_general, p3mg, 0, 4) - -LOOP_HEAD - - F_FLD_S( S(0), F4 ) - F_FMUL_S( M(0), F4 ) - F_FLD_S( S(0), F5 ) - F_FMUL_S( M(1), F5 ) - F_FLD_S( S(0), F6 ) - F_FMUL_S( M(2), F6 ) - F_FLD_S( S(0), F7 ) - F_FMUL_S( M(3), F7 ) - - F_FLD_S( S(1), F0 ) - F_FMUL_S( M(4), F0 ) - F_FLD_S( S(1), F1 ) - F_FMUL_S( M(5), F1 ) - F_FLD_S( S(1), F2 ) - F_FMUL_S( M(6), F2 ) - F_FLD_S( S(1), F3 ) - F_FMUL_S( M(7), F3 ) - - F_FADDP( F0, F4 ) - F_FADDP( F1, F5 ) - F_FADDP( F2, F6 ) - F_FADDP( F3, F7 ) - - F_FLD_S( S(2), F0 ) - F_FMUL_S( M(8), F0 ) - F_FLD_S( S(2), F1 ) - F_FMUL_S( M(9), F1 ) - F_FLD_S( S(2), F2 ) - F_FMUL_S( M(10), F2 ) - F_FLD_S( S(2), F3 ) - F_FMUL_S( M(11), F3 ) - - F_FADDP( F0, F4 ) - F_FADDP( F1, F5 ) - F_FADDP( F2, F6 ) - F_FADDP( F3, F7 ) - - F_FADD_S( M(12), F4 ) - F_FADD_S( M(13), F5 ) - F_FADD_S( M(14), F6 ) - F_FADD_S( M(15), F7 ) - - F_FSTP_S( F4, D(0) ) - F_FSTP_S( F5, D(1) ) - F_FSTP_S( F6, D(2) ) - F_FSTP_S( F7, D(3) ) - -LOOP_TAIL - -FUNCTION_TAIL - -/* -######################################## -## -## gl_x86_transform_points3_identity -## -## -*/ -FUNCTION_HEAD(gl_x86_transform_points3_identity, p3mi, 2, 3) - - CMP_L( ESI, EDI ) - JE( LLBL(SHORT_NAME`'_finish) ) - -LOOP_HEAD - MOV_L( S(0), IREG_0 ) - MOV_L( S(1), IREG_1 ) - MOV_L( S(2), EDX ) - - MOV_L( IREG_0, D(0) ) - MOV_L( IREG_1, D(1) ) - MOV_L( EDX, D(2) ) -LOOP_TAIL - -FUNCTION_TAIL - -/* -######################################## -## -## gl_x86_transform_points3_2d -## -## -*/ -FUNCTION_HEAD(gl_x86_transform_points3_2d, p3m2d, 1, 3) - -LOOP_HEAD - - F_FLD_S( S(0), F4 ) - F_FMUL_S( M(0), F4 ) - F_FLD_S( S(0), F5 ) - F_FMUL_S( M(1), F5 ) - - F_FLD_S( S(1), F0 ) - F_FMUL_S( M(4), F0 ) - F_FLD_S( S(1), F1 ) - F_FMUL_S( M(5), F1 ) - - F_FADDP( F0, F4 ) - F_FADDP( F1, F5 ) - - F_FADD_S( M(12), F4 ) - F_FADD_S( M(13), F5 ) - - MOV_L( S(2), IREG_0 ) - - F_FSTP_S( F4, D(0) ) - F_FSTP_S( F5, D(1) ) - MOV_L( IREG_0, D(2) ) - -LOOP_TAIL - -FUNCTION_TAIL - -/* -######################################## -## -## gl_x86_transform_points3_2d_no_rot -## -## -*/ -FUNCTION_HEAD(gl_x86_transform_points3_2d_no_rot, p3m2dnr, 1, 3) - -LOOP_HEAD - - F_FLD_S( S(0), F4 ) - F_FMUL_S( M(0), F4 ) - - F_FLD_S( S(1), F1 ) - F_FMUL_S( M(5), F1 ) - - F_FADD_S( M(12), F4 ) - F_FLD_S( M(13), F5 ) - - F_FADDP( F1, F5 ) - - MOV_L( S(2), IREG_0 ) - - F_FSTP_S( F4, D(0) ) - F_FSTP_S( F5, D(1) ) - MOV_L( IREG_0, D(2) ) - -LOOP_TAIL - -FUNCTION_TAIL - -/* -######################################## -## -## gl_x86_transform_points3_3d -## -## -*/ -FUNCTION_HEAD(gl_x86_transform_points3_3d, p3m3d, 0, 3) - -LOOP_HEAD - - F_FLD_S( S(0), F4 ) - F_FMUL_S( M(0), F4 ) - F_FLD_S( S(0), F5 ) - F_FMUL_S( M(1), F5 ) - F_FLD_S( S(0), F6 ) - F_FMUL_S( M(2), F6 ) - - F_FLD_S( S(1), F0 ) - F_FMUL_S( M(4), F0 ) - F_FLD_S( S(1), F1 ) - F_FMUL_S( M(5), F1 ) - F_FLD_S( S(1), F2 ) - F_FMUL_S( M(6), F2 ) - - F_FADDP( F0, F4 ) - F_FADDP( F1, F5 ) - F_FADDP( F2, F6 ) - - F_FLD_S( S(2), F0 ) - F_FMUL_S( M(8), F0 ) - F_FLD_S( S(2), F1 ) - F_FMUL_S( M(9), F1 ) - F_FLD_S( S(2), F2 ) - F_FMUL_S( M(10), F2 ) - - F_FADDP( F0, F4 ) - F_FADDP( F1, F5 ) - F_FADDP( F2, F6 ) - - F_FADD_S( M(12), F4 ) - F_FADD_S( M(13), F5 ) - F_FADD_S( M(14), F6 ) - - F_FSTP_S( F4, D(0) ) - F_FSTP_S( F5, D(1) ) - F_FSTP_S( F6, D(2) ) - -LOOP_TAIL - -FUNCTION_TAIL - -/* -######################################## -## -## gl_x86_transform_points3_3d_no_rot -## -## -*/ -FUNCTION_HEAD(gl_x86_transform_points3_3d_no_rot, p3m3dnr, 0, 3) - -LOOP_HEAD - - F_FLD_S( S(0), F4 ) - F_FMUL_S( M(0), F4 ) - - F_FLD_S( S(1), F1 ) - F_FMUL_S( M(5), F1 ) - - F_FLD_S( S(2), F2 ) - F_FMUL_S( M(10), F2 ) - - F_FADD_S( M(12), F4 ) - F_FLD_S( M(13), F5 ) - F_FADDP( F1, F5 ) - F_FLD_S( M(14), F6 ) - F_FADDP( F2, F6 ) - - F_FSTP_S( F4, D(0) ) - F_FSTP_S( F5, D(1) ) - F_FSTP_S( F6, D(2) ) - -LOOP_TAIL - -FUNCTION_TAIL - -/* -######################################## -## -## gl_x86_transform_points3_perspective -## -## -*/ -FUNCTION_HEAD(gl_x86_transform_points3_perspective, p3mp, 1, 4) - -LOOP_HEAD - - F_FLD_S( S(0), F4 ) - F_FMUL_S( M(0), F4 ) - - F_FLD_S( S(1), F5 ) - F_FMUL_S( M(5), F5 ) - - F_FLD_S( S(2), F0 ) - F_FMUL_S( M(8), F0 ) - F_FLD_S( S(2), F1 ) - F_FMUL_S( M(9), F1 ) - F_FLD_S( S(2), F2 ) - F_FMUL_S( M(10), F2 ) - - F_FADDP( F0, F4 ) - F_FADDP( F1, F5 ) - F_FLD_S( M(14), F6 ) - F_FADDP( F2, F6 ) - - MOV_L( S(2), IREG_0 ) - XOR_L( CONST(eval(0x80000000)), IREG_0 ) /* change sign */ - - F_FSTP_S( F4, D(0) ) - F_FSTP_S( F5, D(1) ) - F_FSTP_S( F6, D(2) ) - MOV_L( IREG_0, D(3) ) - -LOOP_TAIL - -FUNCTION_TAIL - -/* -######################################## -## -## gl_x86_transform_points4_general -## -## -*/ -FUNCTION_HEAD(gl_x86_transform_points4_general, p4mg, 0, 4) - -LOOP_HEAD - - F_FLD_S( S(0), F4 ) - F_FMUL_S( M(0), F4 ) - F_FLD_S( S(0), F5 ) - F_FMUL_S( M(1), F5 ) - F_FLD_S( S(0), F6 ) - F_FMUL_S( M(2), F6 ) - F_FLD_S( S(0), F7 ) - F_FMUL_S( M(3), F7 ) - - F_FLD_S( S(1), F0 ) - F_FMUL_S( M(4), F0 ) - F_FLD_S( S(1), F1 ) - F_FMUL_S( M(5), F1 ) - F_FLD_S( S(1), F2 ) - F_FMUL_S( M(6), F2 ) - F_FLD_S( S(1), F3 ) - F_FMUL_S( M(7), F3 ) - - F_FADDP( F0, F4 ) - F_FADDP( F1, F5 ) - F_FADDP( F2, F6 ) - F_FADDP( F3, F7 ) - - F_FLD_S( S(2), F0 ) - F_FMUL_S( M(8), F0 ) - F_FLD_S( S(2), F1 ) - F_FMUL_S( M(9), F1 ) - F_FLD_S( S(2), F2 ) - F_FMUL_S( M(10), F2 ) - F_FLD_S( S(2), F3 ) - F_FMUL_S( M(11), F3 ) - - F_FADDP( F0, F4 ) - F_FADDP( F1, F5 ) - F_FADDP( F2, F6 ) - F_FADDP( F3, F7 ) - - F_FLD_S( S(3), F0 ) - F_FMUL_S( M(12), F0 ) - F_FLD_S( S(3), F1 ) - F_FMUL_S( M(13), F1 ) - F_FLD_S( S(3), F2 ) - F_FMUL_S( M(14), F2 ) - F_FLD_S( S(3), F3 ) - F_FMUL_S( M(15), F3 ) - - F_FADDP( F0, F4 ) - F_FADDP( F1, F5 ) - F_FADDP( F2, F6 ) - F_FADDP( F3, F7 ) - - F_FSTP_S( F4, D(0) ) - F_FSTP_S( F5, D(1) ) - F_FSTP_S( F6, D(2) ) - F_FSTP_S( F7, D(3) ) - -LOOP_TAIL - -FUNCTION_TAIL - -/* -######################################## -## -## gl_x86_transform_points4_identity -## -## -*/ -FUNCTION_HEAD(gl_x86_transform_points4_identity, p4mi, 1, 4) - - CMP_L( ESI, EDI ) - JE( LLBL(SHORT_NAME`'_finish) ) - -LOOP_HEAD - MOV_L( S(0), IREG_0 ) - MOV_L( S(1), EDX ) - - MOV_L( IREG_0, D(0) ) - MOV_L( EDX, D(1) ) - - MOV_L( S(2), IREG_0 ) - MOV_L( S(3), EDX ) - - MOV_L( IREG_0, D(2) ) - MOV_L( EDX, D(3) ) -LOOP_TAIL - -FUNCTION_TAIL - -/* -######################################## -## -## gl_x86_transform_points4_2d -## -## -*/ -FUNCTION_HEAD(gl_x86_transform_points4_2d, p4m2d, 2, 4) - -LOOP_HEAD - - F_FLD_S( S(0), F4 ) - F_FMUL_S( M(0), F4 ) - F_FLD_S( S(0), F5 ) - F_FMUL_S( M(1), F5 ) - - F_FLD_S( S(1), F0 ) - F_FMUL_S( M(4), F0 ) - F_FLD_S( S(1), F1 ) - F_FMUL_S( M(5), F1 ) - - F_FADDP( F0, F4 ) - F_FADDP( F1, F5 ) - - F_FLD_S( S(3), F0 ) - F_FMUL_S( M(12), F0 ) - F_FLD_S( S(3), F1 ) - F_FMUL_S( M(13), F1 ) - - F_FADDP( F0, F4 ) - F_FADDP( F1, F5 ) - - MOV_L( S(2), IREG_0 ) - MOV_L( S(3), IREG_1 ) - - F_FSTP_S( F4, D(0) ) - F_FSTP_S( F5, D(1) ) - MOV_L( IREG_0, D(2) ) - MOV_L( IREG_1, D(3) ) - -LOOP_TAIL - -FUNCTION_TAIL - -/* -######################################## -## -## gl_x86_transform_points4_2d_no_rot -## -## -*/ -FUNCTION_HEAD(gl_x86_transform_points4_2d_no_rot, p4m2dnr, 2, 4) - -LOOP_HEAD - - F_FLD_S( S(0), F4 ) - F_FMUL_S( M(0), F4 ) - - F_FLD_S( S(1), F5 ) - F_FMUL_S( M(5), F5 ) - - F_FLD_S( S(3), F0 ) - F_FMUL_S( M(12), F0 ) - F_FLD_S( S(3), F1 ) - F_FMUL_S( M(13), F1 ) - - F_FADDP( F0, F4 ) - F_FADDP( F1, F5 ) - - MOV_L( S(2), IREG_0 ) - MOV_L( S(3), IREG_1 ) - - F_FSTP_S( F4, D(0) ) - F_FSTP_S( F5, D(1) ) - MOV_L( IREG_0, D(2) ) - MOV_L( IREG_1, D(3) ) - -LOOP_TAIL - -FUNCTION_TAIL - -/* -######################################## -## -## gl_x86_transform_points4_3d -## -## -*/ -FUNCTION_HEAD(gl_x86_transform_points4_3d, p4m3d, 1, 4) - -LOOP_HEAD - - F_FLD_S( S(0), F4 ) - F_FMUL_S( M(0), F4 ) - F_FLD_S( S(0), F5 ) - F_FMUL_S( M(1), F5 ) - F_FLD_S( S(0), F6 ) - F_FMUL_S( M(2), F6 ) - - F_FLD_S( S(1), F0 ) - F_FMUL_S( M(4), F0 ) - F_FLD_S( S(1), F1 ) - F_FMUL_S( M(5), F1 ) - F_FLD_S( S(1), F2 ) - F_FMUL_S( M(6), F2 ) - - F_FADDP( F0, F4 ) - F_FADDP( F1, F5 ) - F_FADDP( F2, F6 ) - - F_FLD_S( S(2), F0 ) - F_FMUL_S( M(8), F0 ) - F_FLD_S( S(2), F1 ) - F_FMUL_S( M(9), F1 ) - F_FLD_S( S(2), F2 ) - F_FMUL_S( M(10), F2 ) - - F_FADDP( F0, F4 ) - F_FADDP( F1, F5 ) - F_FADDP( F2, F6 ) - - F_FLD_S( S(3), F0 ) - F_FMUL_S( M(12), F0 ) - F_FLD_S( S(3), F1 ) - F_FMUL_S( M(13), F1 ) - F_FLD_S( S(3), F2 ) - F_FMUL_S( M(14), F2 ) - - F_FADDP( F0, F4 ) - F_FADDP( F1, F5 ) - F_FADDP( F2, F6 ) - - MOV_L( S(3), IREG_0 ) - - F_FSTP_S( F4, D(0) ) - F_FSTP_S( F5, D(1) ) - F_FSTP_S( F6, D(2) ) - MOV_L( IREG_0, D(3) ) - -LOOP_TAIL - -FUNCTION_TAIL - -/* -######################################## -## -## gl_x86_transform_points4_3d_no_rot -## -## -*/ -FUNCTION_HEAD(gl_x86_transform_points4_3d_no_rot, p4m3dnr, 1, 4) - -LOOP_HEAD - - F_FLD_S( S(0), F4 ) - F_FMUL_S( M(0), F4 ) - - F_FLD_S( S(1), F5 ) - F_FMUL_S( M(5), F5 ) - - F_FLD_S( S(2), F6 ) - F_FMUL_S( M(10), F6 ) - - F_FLD_S( S(3), F0 ) - F_FMUL_S( M(12), F0 ) - F_FLD_S( S(3), F1 ) - F_FMUL_S( M(13), F1 ) - F_FLD_S( S(3), F2 ) - F_FMUL_S( M(14), F2 ) - - F_FADDP( F0, F4 ) - F_FADDP( F1, F5 ) - F_FADDP( F2, F6 ) - - MOV_L( S(3), IREG_0 ) - - F_FSTP_S( F4, D(0) ) - F_FSTP_S( F5, D(1) ) - F_FSTP_S( F6, D(2) ) - MOV_L( IREG_0, D(3) ) - -LOOP_TAIL - -FUNCTION_TAIL - -/* -######################################## -## -## gl_x86_transform_points4_perspective -## -## -*/ -FUNCTION_HEAD(gl_x86_transform_points4_perspective, p4mp, 1, 4) - -LOOP_HEAD - - F_FLD_S( S(0), F4 ) - F_FMUL_S( M(0), F4 ) - - F_FLD_S( S(1), F5 ) - F_FMUL_S( M(5), F5 ) - - F_FLD_S( S(2), F0 ) - F_FMUL_S( M(8), F0 ) - F_FLD_S( S(2), F1 ) - F_FMUL_S( M(9), F1 ) - F_FLD_S( S(2), F6 ) - F_FMUL_S( M(10), F6 ) - - F_FADDP( F0, F4 ) - F_FADDP( F1, F5 ) - - F_FLD_S( S(3), F2 ) - F_FMUL_S( M(14), F2 ) - - F_FADDP( F2, F6 ) - - MOV_L( S(2), IREG_0 ) - XOR_L( CONST(eval(0x80000000)), IREG_0 ) /* change sign */ - - F_FSTP_S( F4, D(0) ) - F_FSTP_S( F5, D(1) ) - F_FSTP_S( F6, D(2) ) - MOV_L( IREG_0, D(3) ) - -LOOP_TAIL - -FUNCTION_TAIL - -')dnl -#include "assyntax.h" - - SEG_TEXT - -`#'define FP_ONE eval(0x3f800000) -`#'define FP_ZERO 0 - -`#'if !defined(NASM_ASSEMBLER) && !defined(MASM_ASSEMBLER) -`#'define LLBL(a) .L ## a -`#'else -`#'define LLBL(a) a -`#'endif - -`#'define S(i) REGOFF(i * 4, ESI) -`#'define D(i) REGOFF(i * 4, EDI) -`#'define M(i) REGOFF(i * 4, EDX) - -/* - * Offsets into GLvector4f - */ -`#'define V4F_DATA 0 -`#'define V4F_START 4 -`#'define V4F_COUNT 8 -`#'define V4F_STRIDE 12 -`#'define V4F_SIZE 16 -`#'define V4F_FLAGS 20 - -define(`VEC_DIRTY_0', 1)dnl -define(`VEC_DIRTY_1', 2)dnl -define(`VEC_DIRTY_2', 4)dnl -define(`VEC_DIRTY_3', 8)dnl -`#'define VEC_SIZE_1 eval(VEC_DIRTY_0) -`#'define VEC_SIZE_2 eval(VEC_DIRTY_0|VEC_DIRTY_1) -`#'define VEC_SIZE_3 eval(VEC_DIRTY_0|VEC_DIRTY_1|VEC_DIRTY_2) -`#'define VEC_SIZE_4 eval(VEC_DIRTY_0|VEC_DIRTY_1|VEC_DIRTY_2|VEC_DIRTY_3) - -/* - * Offsets for transform_func arguments - * - * typedef void (*transform_func)( GLvector4f *to_vec, - * const GLmatrix *mat, - * const GLvector4f *from_vec, - * const GLubyte *clipmask, - * const GLubyte flag ); - */ -`#'define OFFSET_DEST 4 -`#'define OFFSET_MATRIX 8 -`#'define OFFSET_SOURCE 12 -`#'define OFFSET_CLIP 16 -`#'define OFFSET_FLAG 20 - -`#'define ARG_DEST REGOFF(FRAME_OFFSET+OFFSET_DEST, ESP) -`#'define ARG_MATRIX REGOFF(FRAME_OFFSET+OFFSET_MATRIX, ESP) -`#'define ARG_SOURCE REGOFF(FRAME_OFFSET+OFFSET_SOURCE, ESP) -`#'define ARG_CLIP REGOFF(FRAME_OFFSET+OFFSET_CLIP, ESP) -`#'define ARG_FLAG REGOFF(FRAME_OFFSET+OFFSET_FLAG, ESP) - -/* -######################################## -## -## Masked versions -## -######################################## -*/ -divert(-1) -#################### -## FUNCTION_HEAD( -## long_name, -## short_name, -## regs_needed, -## output_vector_size -## ); -## -## EAX: stride or temp0 -## EBX: clipflag -## ECX: dst + count or temp1 -## EDX: matrix -## ESI: src[] -## EDI: dst[] -## EBP: clipmask[] -## -#################### -define(`FUNCTION_HEAD', `dnl -define(`LONG_NAME', $1`'_masked)dnl -define(`SHORT_NAME', $2`'m)dnl -define(`TEMP_REGS_NEEDED', $3)dnl -define(`VEC_SIZE', $4)dnl - GLOBL GLNAME(LONG_NAME) - ALIGNTEXT4 -GLNAME(LONG_NAME): - -`#'define FRAME_OFFSET 16 - PUSH_L( ESI ) - PUSH_L( EDI ) - - PUSH_L( EBX ) - PUSH_L( EBP ) - - MOV_L( ARG_SOURCE, ESI ) /* ptr to source GLvector4f */ - MOV_L( ARG_DEST, EDI ) /* ptr to dest GLvector4f */ - - MOV_L( ARG_MATRIX, EDX ) /* ptr to matrix */ - MOV_L( ARG_CLIP, EBP ) /* ptr to clip mask array */ - - MOV_L( REGOFF(V4F_COUNT, ESI), ECX ) /* source count */ - MOV_B( ARG_FLAG, BL ) /* clip mask flags */ - - TEST_L( ECX, ECX ) - JZ( LLBL(SHORT_NAME`'_finish) ) /* count was zero; go to finish */ - - MOV_L( REGOFF(V4F_STRIDE, ESI), EAX ) /* stride */ - OR_L( CONST(`VEC_SIZE_'VEC_SIZE), REGOFF(V4F_FLAGS, EDI) ) /* set dest flags */ - - MOV_L( ECX, REGOFF(V4F_COUNT, EDI) ) /* set dest count */ - MOV_L( CONST(VEC_SIZE), REGOFF(V4F_SIZE, EDI) ) /* set dest size */ - - SHL_L( CONST(4), ECX ) /* count *= 16 */ - MOV_L( REGOFF(V4F_START, ESI), ESI ) /* ptr to first source vertex */ - - MOV_L( REGOFF(V4F_START, EDI), EDI ) /* ptr to first dest vertex */ - ADD_L( EDI, ECX ) /* count += dest ptr */ - -dnl ########## -ifelse(eval(TEMP_REGS_NEEDED > 0), 1, -` MOV_L( EAX, ARG_SOURCE ) /* need eax; put stride in ARG_SOURCE */ -define(`IREG_0', `EAX')define(`STRIDE', `ARG_SOURCE')dnl -', -`define(`STRIDE', `EAX')')dnl -dnl ########## -ifelse(eval(TEMP_REGS_NEEDED > 1), 1, -` MOV_L( ECX, ARG_DEST ) /* need ecx; put dest+count in ARG_DEST */ -define(`IREG_1', `ECX')define(`DEST_END', `ARG_DEST')dnl -', -`define(`DEST_END', `ECX')')dnl -dnl ########## -') - -#################### -## LOOP_HEAD -#################### -define(`LOOP_HEAD', -` ALIGNTEXT4ifNOP -LLBL(SHORT_NAME`'_top): - - TEST_B( BL, REGIND(EBP) ) - JNZ( LLBL(SHORT_NAME`'_skip) ) -') - -#################### -## LOOP_TAIL -#################### -define(`LOOP_TAIL', -`LLBL(SHORT_NAME`'_skip): - INC_L( EBP ) - ADD_L( CONST(16), EDI ) - ADD_L( STRIDE, ESI ) - CMP_L( DEST_END, EDI ) - JNE( LLBL(SHORT_NAME`'_top) ) -') - -#################### -## FUNCTION_TAIL -#################### -define(`FUNCTION_TAIL', -`LLBL(SHORT_NAME`'_finish): - POP_L( EBP ) - POP_L( EBX ) - POP_L( EDI ) - POP_L( ESI ) - RET -undefine(`LONG_NAME')dnl -undefine(`SHORT_NAME')dnl -undefine(`TEMP_REGS_NEEDED')dnl -undefine(`VEC_SIZE')dnl -undefine(`IREG_0')dnl -undefine(`IREG_1')dnl -undefine(`STRIDE')dnl -undefine(`DEST_END')dnl -`#'undef FRAME_OFFSET') - -#################### -divert -output_x86_transform_functions - -/* -######################################## -## -## Unmasked versions -## -######################################## -*/ -divert(-1) -#################### -## FUNCTION_HEAD( -## long_name, -## short_name, -## regs_needed, -## output_vector_size -## ); -## -## EAX: stride -## EBX: temp0 -## ECX: dst + count -## EDX: matrix -## ESI: src[] -## EDI: dst[] -## EBP: temp1 -## -#################### -define(`FUNCTION_HEAD', `dnl -define(`LONG_NAME', $1`'_raw)dnl -define(`SHORT_NAME', $2`'r)dnl -define(`TEMP_REGS_NEEDED', $3)dnl -define(`VEC_SIZE', $4)dnl - GLOBL GLNAME(LONG_NAME) - ALIGNTEXT4 -GLNAME(LONG_NAME): - -`#'define FRAME_OFFSET eval(TEMP_REGS_NEEDED * 4 + 8) - PUSH_L( ESI ) - PUSH_L( EDI ) - - MOV_L( REGOFF(OFFSET_SOURCE+8, ESP), ESI ) /* ptr to source GLvector4f */ - MOV_L( REGOFF(OFFSET_DEST+8, ESP), EDI ) /* ptr to dest GLvector4f */ - -ifelse(eval(TEMP_REGS_NEEDED > 0), 1, -` PUSH_L( EBX )define(`IREG_0', EBX) -')dnl -ifelse(eval(TEMP_REGS_NEEDED > 1), 1, -` PUSH_L( EBP )define(`IREG_1', EBP) -')dnl - - MOV_L( ARG_MATRIX, EDX ) /* ptr to matrix */ - MOV_L( REGOFF(V4F_COUNT, ESI), ECX ) /* source count */ - - TEST_L( ECX, ECX) - JZ( LLBL(SHORT_NAME`'_finish) ) /* count was zero; go to finish */ - - MOV_L( REGOFF(V4F_STRIDE, ESI), EAX ) /* stride */ - OR_L( CONST(`VEC_SIZE_'VEC_SIZE), REGOFF(V4F_FLAGS, EDI) ) /* set dest flags */ - - MOV_L( ECX, REGOFF(V4F_COUNT, EDI) ) /* set dest count */ - MOV_L( CONST(VEC_SIZE), REGOFF(V4F_SIZE, EDI) ) /* set dest size */ - - SHL_L( CONST(4), ECX ) /* count *= 16 */ - MOV_L( REGOFF(V4F_START, ESI), ESI ) /* ptr to first source vertex */ - - MOV_L( REGOFF(V4F_START, EDI), EDI ) /* ptr to first dest vertex */ - ADD_L( EDI, ECX ) /* count += dest ptr */ -') - -#################### -## LOOP_HEAD -#################### -define(`LOOP_HEAD', -` ALIGNTEXT4ifNOP -LLBL(SHORT_NAME`'_top): -') - -#################### -## LOOP_TAIL -#################### -define(`LOOP_TAIL', -`LLBL(SHORT_NAME`'_skip): - ADD_L( CONST(16), EDI ) - ADD_L( EAX, ESI ) - CMP_L( ECX, EDI ) - JNE( LLBL(SHORT_NAME`'_top) ) -') - -#################### -## FUNCTION_TAIL -#################### -define(`FUNCTION_TAIL', -`LLBL(SHORT_NAME`'_finish): -ifelse(eval(TEMP_REGS_NEEDED > 1), 1, -` POP_L( EBP ) -')dnl -ifelse(eval(TEMP_REGS_NEEDED > 0), 1, -` POP_L( EBX ) -')dnl - POP_L( EDI ) - POP_L( ESI ) - RET -undefine(`LONG_NAME')dnl -undefine(`SHORT_NAME')dnl -undefine(`TEMP_REGS_NEEDED')dnl -undefine(`VEC_SIZE')dnl -undefine(`IREG_0')dnl -undefine(`IREG_1')dnl -`#'undef FRAME_OFFSET') - - -#################### -divert -output_x86_transform_functions - -`#'undef OFFSET_DEST -`#'undef OFFSET_MATRIX -`#'undef OFFSET_SOURCE -`#'undef OFFSET_CLIP -`#'undef OFFSET_FLAG - -`#'undef ARG_DEST -`#'undef ARG_MATRIX -`#'undef ARG_SOURCE -`#'undef ARG_CLIP -`#'undef ARG_FLAG - -`#'define OFFSET_DEST 4 -`#'define OFFSET_MATRIX 8 -`#'define OFFSET_SOURCE 12 -`#'define OFFSET_STRIDE 16 -`#'define OFFSET_COUNT 20 - -`#'define ARG_DEST REGOFF(FRAME_OFFSET+OFFSET_DEST, ESP) -`#'define ARG_MATRIX REGOFF(FRAME_OFFSET+OFFSET_MATRIX, ESP) -`#'define ARG_SOURCE REGOFF(FRAME_OFFSET+OFFSET_SOURCE, ESP) -`#'define ARG_STRIDE REGOFF(FRAME_OFFSET+OFFSET_STRIDE, ESP) -`#'define ARG_COUNT REGOFF(FRAME_OFFSET+OFFSET_COUNT, ESP) - -/* -######################################## -## -## clean (no vertex struct) versions -## -######################################## -*/ -divert(-1) -#################### -## FUNCTION_HEAD( -## long_name, -## short_name, -## regs_needed, -## output_vector_size -## ); -## -## EAX: stride -## EBX: temp0 -## ECX: dst + count -## EDX: matrix -## ESI: src[] -## EDI: dst[] -## EBP: temp1 -## -#################### -define(`FUNCTION_HEAD', `dnl -define(`LONG_NAME', $1`'_v`'DEST_STRIDE)dnl -define(`SHORT_NAME', $2`'v`'DEST_STRIDE)dnl -define(`TEMP_REGS_NEEDED', $3)dnl -define(`VEC_SIZE', $4)dnl - GLOBL GLNAME(LONG_NAME) - ALIGNTEXT4 -GLNAME(LONG_NAME): - -`#'define FRAME_OFFSET eval(TEMP_REGS_NEEDED * 4 + 8) - PUSH_L( ESI ) - PUSH_L( EDI ) - -ifelse(eval(TEMP_REGS_NEEDED > 0), 1, -` PUSH_L( EBX )define(`IREG_0', EBX) -')dnl -ifelse(eval(TEMP_REGS_NEEDED > 1), 1, -` PUSH_L( EBP )define(`IREG_1', EBP) -')dnl - - MOV_L( ARG_SOURCE, ESI ) /* ptr to source */ - MOV_L( ARG_DEST, EDI ) /* ptr to dest */ - - MOV_L( ARG_MATRIX, EDX ) /* ptr to matrix */ - MOV_L( ARG_COUNT, ECX ) /* count */ - - TEST_L( ECX, ECX) - JZ( LLBL(SHORT_NAME`'_finish) ) /* count was zero; go to finish */ - - MOV_L( ARG_STRIDE, EAX ) /* stride */ -') - -#################### -## LOOP_HEAD -#################### -define(`LOOP_HEAD', -` ALIGNTEXT4ifNOP -LLBL(SHORT_NAME`'_top): -') - -#################### -## LOOP_TAIL -#################### -define(`LOOP_TAIL', -`ifelse(eval(VEC_SIZE == 1), 1, ` MOV_L( CONST(FP_ZERO), D(1) ) -')dnl -ifelse(eval(VEC_SIZE <= 2), 1, ` MOV_L( CONST(FP_ZERO), D(2) ) -')dnl -ifelse(eval(VEC_SIZE <= 3), 1, ` MOV_L( CONST(FP_ONE), D(3) ) -')dnl -LLBL(SHORT_NAME`'_skip): - ADD_L( CONST(eval(DEST_STRIDE*4)), EDI ) - ADD_L( EAX, ESI ) - DEC_L( ECX ) - JNZ( LLBL(SHORT_NAME`'_top) ) -') - -#################### -## FUNCTION_TAIL -#################### -define(`FUNCTION_TAIL', -`LLBL(SHORT_NAME`'_finish): -ifelse(eval(TEMP_REGS_NEEDED > 1), 1, -` POP_L( EBP ) -')dnl -ifelse(eval(TEMP_REGS_NEEDED > 0), 1, -` POP_L( EBX ) -')dnl - POP_L( EDI ) - POP_L( ESI ) - RET -undefine(`LONG_NAME')dnl -undefine(`SHORT_NAME')dnl -undefine(`TEMP_REGS_NEEDED')dnl -undefine(`VEC_SIZE')dnl -undefine(`IREG_0')dnl -undefine(`IREG_1')dnl -`#'undef FRAME_OFFSET') - - -#################### -divert - -define(`DEST_STRIDE', 8)dnl -output_x86_transform_functions -undefine(`DEST_STRIDE')dnl - -define(`DEST_STRIDE', 12)dnl -output_x86_transform_functions -undefine(`DEST_STRIDE')dnl - -define(`DEST_STRIDE', 16)dnl -output_x86_transform_functions -undefine(`DEST_STRIDE')dnl - -`#'undef OFFSET_DEST -`#'undef OFFSET_MATRIX -`#'undef OFFSET_SOURCE -`#'undef OFFSET_STRIDE -`#'undef OFFSET_COUNT - -`#'undef ARG_DEST -`#'undef ARG_MATRIX -`#'undef ARG_SOURCE -`#'undef ARG_STRIDE -`#'undef ARG_COUNT - - -/* - * Table for clip test. - * - * bit6 = S(3) < 0 - * bit5 = S(2) < 0 - * bit4 = abs(S(2)) > abs(S(3)) - * bit3 = S(1) < 0 - * bit2 = abs(S(1)) > abs(S(3)) - * bit1 = S(0) < 0 - * bit0 = abs(S(0)) > abs(S(3)) - */ -divert(-1) -# Vertex buffer clipping flags (from vb.h) -define(`CLIP_RIGHT_BIT', `0x01') -define(`CLIP_LEFT_BIT', `0x02') -define(`CLIP_TOP_BIT', `0x04') -define(`CLIP_BOTTOM_BIT', `0x08') -define(`CLIP_NEAR_BIT', `0x10') -define(`CLIP_FAR_BIT', `0x20') - -define(`MAGN_X', `(~((($1) & 1) - 1))') -define(`SIGN_X', `(~(((($1) >> 1) & 1) - 1))') -define(`MAGN_Y', `(~(((($1) >> 2) & 1) - 1))') -define(`SIGN_Y', `(~(((($1) >> 3) & 1) - 1))') -define(`MAGN_Z', `(~(((($1) >> 4) & 1) - 1))') -define(`SIGN_Z', `(~(((($1) >> 5) & 1) - 1))') -define(`SIGN_W', `(~(((($1) >> 6) & 1) - 1))') - -define(`CLIP_VALUE', `eval( - (CLIP_RIGHT_BIT - & ((~SIGN_X($1) & SIGN_W($1)) - | (~SIGN_X($1) & ~SIGN_W($1) & MAGN_X($1)) - | (SIGN_X($1) & SIGN_W($1) & ~MAGN_X($1)))) - | (CLIP_LEFT_BIT - & ((SIGN_X($1) & SIGN_W($1)) - | (~SIGN_X($1) & SIGN_W($1) & ~MAGN_X($1)) - | (SIGN_X($1) & ~SIGN_W($1) & MAGN_X($1)))) - | (CLIP_TOP_BIT - & ((~SIGN_Y($1) & SIGN_W($1)) - | (~SIGN_Y($1) & ~SIGN_W($1) & MAGN_Y($1)) - | (SIGN_Y($1) & SIGN_W($1) & ~MAGN_Y($1)))) - | (CLIP_BOTTOM_BIT - & ((SIGN_Y($1) & SIGN_W($1)) - | (~SIGN_Y($1) & SIGN_W($1) & ~MAGN_Y($1)) - | (SIGN_Y($1) & ~SIGN_W($1) & MAGN_Y($1)))) - | (CLIP_FAR_BIT - & ((~SIGN_Z($1) & SIGN_W($1)) - | (~SIGN_Z($1) & ~SIGN_W($1) & MAGN_Z($1)) - | (SIGN_Z($1) & SIGN_W($1) & ~MAGN_Z($1)))) - | (CLIP_NEAR_BIT - & ((SIGN_Z($1) & SIGN_W($1)) - | (~SIGN_Z($1) & SIGN_W($1) & ~MAGN_Z($1)) - | (SIGN_Z($1) & ~SIGN_W($1) & MAGN_Z($1)))) -)') -define(`CLIP_VALUE8', -`CLIP_VALUE($1 + 0), CLIP_VALUE($1 + 1), CLIP_VALUE($1 + 2), CLIP_VALUE($1 + 3), dnl -CLIP_VALUE($1 + 4), CLIP_VALUE($1 + 5), CLIP_VALUE($1 + 6), CLIP_VALUE($1 + 7)') -divert - - SEG_DATA - -clip_table: - D_BYTE CLIP_VALUE8(0x00) - D_BYTE CLIP_VALUE8(0x08) - D_BYTE CLIP_VALUE8(0x10) - D_BYTE CLIP_VALUE8(0x18) - D_BYTE CLIP_VALUE8(0x20) - D_BYTE CLIP_VALUE8(0x28) - D_BYTE CLIP_VALUE8(0x30) - D_BYTE CLIP_VALUE8(0x38) - D_BYTE CLIP_VALUE8(0x40) - D_BYTE CLIP_VALUE8(0x48) - D_BYTE CLIP_VALUE8(0x50) - D_BYTE CLIP_VALUE8(0x58) - D_BYTE CLIP_VALUE8(0x60) - D_BYTE CLIP_VALUE8(0x68) - D_BYTE CLIP_VALUE8(0x70) - D_BYTE CLIP_VALUE8(0x78) - - SEG_TEXT - -/* - * Offsets for clip_func arguments - * - * typedef GLvector4f *(*clip_func)( GLvector4f *vClip, - * GLvector4f *vProj, - * GLubyte clipMask[], - * GLubyte *orMask, - * GLubyte *andMask ); - */ - -`#'define OFFSET_SOURCE 4 -`#'define OFFSET_DEST 8 -`#'define OFFSET_CLIP 12 -`#'define OFFSET_OR 16 -`#'define OFFSET_AND 20 - -`#'define ARG_SOURCE REGOFF(FRAME_OFFSET+OFFSET_SOURCE, ESP) -`#'define ARG_DEST REGOFF(FRAME_OFFSET+OFFSET_DEST, ESP) -`#'define ARG_CLIP REGOFF(FRAME_OFFSET+OFFSET_CLIP, ESP) -`#'define ARG_OR REGOFF(FRAME_OFFSET+OFFSET_OR, ESP) -`#'define ARG_AND REGOFF(FRAME_OFFSET+OFFSET_AND, ESP) - -/* -######################################## -## -## gl_x86_cliptest_points4 -## -## AL: ormask -## AH: andmask -## EBX: temp0 -## ECX: temp1 -## EDX: clipmask[] -## ESI: clip[] -## EDI: proj[] -## EBP: temp2 -## -######################################## -*/ - -`#'if defined(__ELF__) && defined(__PIC__) && !defined(ELFPIC) -`#'define ELFPIC -`#'endif - - GLOBL GLNAME(gl_x86_cliptest_points4) - ALIGNTEXT4 - -GLNAME(gl_x86_cliptest_points4): -`#'ifdef ELFPIC -`#'define FRAME_OFFSET 20 -`#'else -`#'define FRAME_OFFSET 16 -`#'endif - PUSH_L( ESI ) - PUSH_L( EDI ) - PUSH_L( EBP ) - PUSH_L( EBX ) - -`#'ifdef ELFPIC - /* store pointer to clip_table on stack */ - CALL( LLBL(ctp4_get_eip) ) - ADD_L( CONST(_GLOBAL_OFFSET_TABLE_), EBX ) - MOV_L( REGOFF(clip_table@GOT, EBX), EBX ) - PUSH_L( EBX ) - JMP( LLBL(ctp4_clip_table_ready) ) - -LLBL(ctp4_get_eip): - /* store eip in ebx */ - MOV_L( REGIND(ESP), EBX ) - RET - -LLBL(ctp4_clip_table_ready): -`#'endif - - MOV_L( ARG_SOURCE, ESI ) - MOV_L( ARG_DEST, EDI ) - - MOV_L( ARG_CLIP, EDX ) - MOV_L( ARG_OR, EBX ) - - MOV_L( ARG_AND, EBP ) - MOV_L( REGOFF(V4F_STRIDE, ESI), EAX ) /* source stride */ - - MOV_L( REGOFF(V4F_COUNT, ESI), ECX ) /* source count */ - MOV_L( REGOFF(V4F_START, ESI), ESI ) /* ptr to first source vertex */ - - OR_L( CONST(VEC_SIZE_4), REGOFF(V4F_FLAGS, EDI) ) /* set dest flags */ - MOV_L( EAX, ARG_SOURCE ) /* put stride in ARG_SOURCE */ - - MOV_L( CONST(3), REGOFF(V4F_SIZE, EDI) ) /* set dest size */ - MOV_L( ECX, REGOFF(V4F_COUNT, EDI) ) /* set dest count */ - - MOV_L( REGOFF(V4F_START, EDI), EDI ) /* ptr to first dest vertex */ - ADD_L( EDX, ECX ) - - MOV_L( ECX, ARG_CLIP ) /* put clipmask + count in ARG_CLIP */ - CMP_L( ECX, EDX ) - - MOV_B( REGIND(EBX), AL ) - MOV_B( REGIND(EBP), AH ) - - JZ( LLBL(ctp4_finish) ) - - ALIGNTEXT4ifNOP -LLBL(ctp4_top): - F_PUSH0( FLD1, F3 ) - F_FDIV_S( S(3), F3 ) - - MOV_L( S(3), EBP ) - MOV_L( S(2), EBX ) - - XOR_L( ECX, ECX ) - ADD_L( EBP, EBP ) /* ebp = abs(S(3))*2 ; carry = sign of S(3) */ - - ADC_L( ECX, ECX ) - ADD_L( EBX, EBX ) /* ebx = abs(S(2))*2 ; carry = sign of S(2) */ - - ADC_L( ECX, ECX ) - CMP_L( EBX, EBP ) /* carry = abs(S(2))*2 > abs(S(3))*2 */ - - ADC_L( ECX, ECX ) - MOV_L( S(1), EBX ) - - ADD_L( EBX, EBX ) /* ebx = abs(S(1))*2 ; carry = sign of S(1) */ - - ADC_L( ECX, ECX ) - CMP_L( EBX, EBP ) /* carry = abs(S(1))*2 > abs(S(3))*2 */ - - ADC_L( ECX, ECX ) - MOV_L( S(0), EBX ) - - ADD_L( EBX, EBX ) /* ebx = abs(S(0))*2 ; carry = sign of S(0) */ - - ADC_L( ECX, ECX ) - CMP_L( EBX, EBP ) /* carry = abs(S(0))*2 > abs(S(3))*2 */ - - ADC_L( ECX, ECX ) - -`#'ifdef ELFPIC - MOV_L( REGIND(ESP), EBP ) /* clip_table */ - - MOV_B( REGBI(EBP, ECX), CL ) -`#'else - MOV_B( REGOFF(clip_table,ECX), CL ) -`#'endif - - OR_B( CL, AL ) - AND_B( CL, AH ) - - TEST_B( CL, CL ) - MOV_B( CL, REGIND(EDX) ) - - JZ( LLBL(ctp4_proj) ) - -pushdef(`F_STACK', F_STACK)dnl - F_FSTP( F3, F3 ) -popdef(`F_STACK')dnl - JMP( LLBL(ctp4_next) ) - -LLBL(ctp4_proj): - F_FLD_S( S(0), F0 ) - F_FMUL2( F3, F0 ) - - F_FLD_S( S(1), F1 ) - F_FMUL2( F3, F1 ) - - F_FLD_S( S(2), F2 ) - F_FMUL2( F3, F2 ) - - F_FSTP_S( F0, D(0) ) - F_FSTP_S( F1, D(1) ) - F_FSTP_S( F2, D(2) ) - F_FSTP_S( F3, D(3) ) - -LLBL(ctp4_next): - INC_L( EDX ) - ADD_L( CONST(16), EDI ) - - ADD_L( ARG_SOURCE, ESI ) - CMP_L( EDX, ARG_CLIP ) - - JNZ( LLBL(ctp4_top) ) - - MOV_L( ARG_OR, ECX ) - MOV_L( ARG_AND, EDX ) - - MOV_B( AL, REGIND(ECX) ) - MOV_B( AH, REGIND(EDX) ) - -LLBL(ctp4_finish): - MOV_L( ARG_DEST, EAX ) -`#'ifdef ELFPIC - POP_L( ESI ) /* discard ptr to clip_table */ -`#'endif - POP_L( EBX ) - POP_L( EBP ) - POP_L( EDI ) - POP_L( ESI ) - - RET - - - - -/* -######################################## -## -## gl_v16_x86_cliptest_points4 -## -## Performs cliptesting equivalent to that done by cliptest_v16() -## in vertices.c -## -## This is a hacked version of the original above. -## -######################################## -*/ - - - -`#'define OFFSET_V16_SOURCE 4 -`#'define OFFSET_V16_LAST 8 -`#'define OFFSET_V16_OR 12 -`#'define OFFSET_V16_AND 16 -`#'define OFFSET_V16_MASK 20 - -`#'define ARG_V16_SOURCE REGOFF(V16_FRAME_OFFSET+OFFSET_V16_SOURCE, ESP) -`#'define ARG_V16_LAST REGOFF(V16_FRAME_OFFSET+OFFSET_V16_LAST, ESP) -`#'define ARG_V16_OR REGOFF(V16_FRAME_OFFSET+OFFSET_V16_OR, ESP) -`#'define ARG_V16_AND REGOFF(V16_FRAME_OFFSET+OFFSET_V16_AND, ESP) -`#'define ARG_V16_MASK REGOFF(V16_FRAME_OFFSET+OFFSET_V16_MASK, ESP) - - -`#'if defined(__ELF__) && defined(__PIC__) && !defined(ELFPIC) -`#'define ELFPIC -`#'endif - - GLOBL GLNAME(gl_v16_x86_cliptest_points4) - ALIGNTEXT4 - -GLNAME(gl_v16_x86_cliptest_points4): -`#'ifdef ELFPIC -`#'define V16_FRAME_OFFSET 20 -`#'else -`#'define V16_FRAME_OFFSET 16 -`#'endif - PUSH_L( ESI ) - PUSH_L( EDI ) - PUSH_L( EBP ) - PUSH_L( EBX ) - -`#'ifdef ELFPIC - /* store pointer to clip_table on stack */ - CALL( LLBL(v16_ctp4_get_eip) ) - ADD_L( CONST(_GLOBAL_OFFSET_TABLE_), EBX ) - MOV_L( REGOFF(clip_table@GOT, EBX), EBX ) - PUSH_L( EBX ) - JMP( LLBL(v16_ctp4_clip_table_ready) ) - -LLBL(v16_ctp4_get_eip): - /* store eip in ebx */ - MOV_L( REGIND(ESP), EBX ) - RET - -LLBL(v16_ctp4_clip_table_ready): -`#'endif - - MOV_L( ARG_V16_SOURCE, ESI ) /* ptr to first source vertex */ - MOV_L( ARG_V16_LAST, EDX ) /* ptr to last source vertex */ - MOV_L( ARG_V16_OR, EBX ) - MOV_L( ARG_V16_AND, EBP ) - MOV_L( ARG_V16_MASK, EDI ) - - CMP_L( EDX, ESI ) - - MOV_B( REGIND(EBX), AL ) - MOV_B( REGIND(EBP), AH ) - - JZ( LLBL(v16_ctp4_finish) ) - - ALIGNTEXT4ifNOP -LLBL(v16_ctp4_top): -`#'if 0 - F_PUSH0( FLD1, F0 ) - F_FDIV_S( S(3), F0 ) -`#'endif - - MOV_L( S(3), EBP ) - MOV_L( S(2), EBX ) - - XOR_L( ECX, ECX ) - ADD_L( EBP, EBP ) /* ebp = abs(S(3))*2 ; carry = sign of S(3) */ - - ADC_L( ECX, ECX ) - ADD_L( EBX, EBX ) /* ebx = abs(S(2))*2 ; carry = sign of S(2) */ - - ADC_L( ECX, ECX ) - CMP_L( EBX, EBP ) /* carry = abs(S(2))*2 > abs(S(3))*2 */ - - ADC_L( ECX, ECX ) - MOV_L( S(1), EBX ) - - ADD_L( EBX, EBX ) /* ebx = abs(S(1))*2 ; carry = sign of S(1) */ - - ADC_L( ECX, ECX ) - CMP_L( EBX, EBP ) /* carry = abs(S(1))*2 > abs(S(3))*2 */ - - ADC_L( ECX, ECX ) - MOV_L( S(0), EBX ) - - ADD_L( EBX, EBX ) /* ebx = abs(S(0))*2 ; carry = sign of S(0) */ - - ADC_L( ECX, ECX ) - CMP_L( EBX, EBP ) /* carry = abs(S(0))*2 > abs(S(3))*2 */ - - ADC_L( ECX, ECX ) - -`#'ifdef ELFPIC - MOV_L( REGIND(ESP), EBP ) /* clip_table */ - - MOV_B( REGBI(EBP, ECX), CL ) -`#'else - MOV_B( REGOFF(clip_table,ECX), CL ) -`#'endif - - OR_B( CL, AL ) - AND_B( CL, AH ) - - MOV_B( CL, REGIND(EDI) ) /* save clipmask */ - INC_L( EDI ) /* next clipmask */ - -`#'if 0 - F_FSTP_S( F0, S(8) ) /* GR_VERTEX_OOW_OFFSET */ -`#'endif - - ADD_L( CONST(64), ESI ) /* next fxVertex */ - - CMP_L( EDX, ESI ) /* finished? */ - JNZ( LLBL(v16_ctp4_top) ) - - MOV_L( ARG_V16_OR, ECX ) - MOV_L( ARG_V16_AND, EDX ) - - MOV_B( AL, REGIND(ECX) ) - MOV_B( AH, REGIND(EDX) ) - -LLBL(v16_ctp4_finish): - -`#'ifdef ELFPIC - POP_L( ESI ) /* discard ptr to clip_table */ -`#'endif - POP_L( EBX ) - POP_L( EBP ) - POP_L( EDI ) - POP_L( ESI ) - - RET - Index: xc/extras/Mesa/src/X86/x86flatregs.m4 diff -u xc/extras/Mesa/src/X86/x86flatregs.m4:1.1 xc/extras/Mesa/src/X86/x86flatregs.m4:removed --- xc/extras/Mesa/src/X86/x86flatregs.m4:1.1 Mon Dec 13 20:32:20 1999 +++ xc/extras/Mesa/src/X86/x86flatregs.m4 Mon Dec 18 14:22:00 2000 @@ -1,200 +0,0 @@ -divert(-1) -############################################################ -## These m4 macros make the x86 floating point register -## stack look more like normal registers. -## -## They do *NOT* know about jump instructions or any other -## form of conditional execution! -############################################################ - -######################################## -## define the stack -######################################## -define(`F_STACK', `') - -######################################## -## print the stack -######################################## -define(`F_SHOW_STACK', `patsubst(F_STACK, `[0-7]', `F`'\& ')') - -######################################## -## define the flat floating point regs -######################################## -define(`F0', 0) -define(`F1', 1) -define(`F2', 2) -define(`F3', 3) -define(`F4', 4) -define(`F5', 5) -define(`F6', 6) -define(`F7', 7) - -######################################## -## F_PUSH_STACK(REG) -## push a register -######################################## -define(`F_PUSH_STACK', -`ifelse(len(F_STACK), 8, ` [ERROR - STACK OVERFLOW] ')dnl -ifelse(eval(F_FIND_REG($1) != -1), 1, ` [ERROR - F`'$1 PUSHED TWICE] ')dnl -define(`F_STACK', eval($1)`'F_STACK)') - -######################################## -## F_POP_STACK() -## pop top of stack -######################################## -define(`F_POP_STACK', -`ifelse(len(F_STACK), 0, ` [ERROR - STACK UNDERFLOW] ')dnl -define(`F_STACK', substr(F_STACK, 1))') - -######################################## -## F_FIND_REG(REG) -## find register -######################################## -define(`F_FIND_REG', `index(F_STACK, eval($1))') - -######################################## -## F_XCH_TO_TOP(REG) -## swap to top of stack -######################################## -define(`F_XCH_TO_TOP', -`define(`F_INDEX', F_FIND_REG($1))dnl -ifelse( -eval(F_INDEX > 0), 1, -`FXCH( ST('F_FIND_REG($1)`) )dnl -define(`F_STACK', - translit(F_STACK, - substr(F_STACK, 0, 1)`'eval($1), - eval($1)`'substr(F_STACK, 0, 1)))F_PCOMMENT(`F$1 to top') - ', -eval(F_INDEX == -1), 1, -` [ERROR - F`'$1 NOT ON STACK] ')') - -######################################## -## F_PUSH(INSN, SRC, DST) -## SRC - memory -## DST - register -## execute an insn that pushes a register -######################################## -define(`F_PUSH', -`$1( $2 )F_PUSH_STACK($3)F_PCOMMENT(`$1 $2, F$3')') - -######################################## -## F_PUSHR(INSN, SRC, DST) -## SRC - register -## DST - register -## execute an insn that pushes a register -######################################## -define(`F_PUSHR', -`$1( ST(F_FIND_REG($2) )F_PUSH_STACK($3)F_PCOMMENT(`$1 F$2, F$3')') - -######################################## -## F_PUSH0(INSN, DST) -## DST - register -## execute an insn that pushes a register -######################################## -define(`F_PUSH0', -`$1`'F_PUSH_STACK($2)F_PCOMMENT(`$1 F$3')') - -######################################## -## F_POP(INSN, SRC, DST) -## SRC - register -## DST - memory -## execute an insn that pops a register -######################################## -define(`F_POP', -`F_XCH_TO_TOP($2)dnl -$1( $3 )F_POP_STACK()F_PCOMMENT(`$1 F$2, $3')') - -######################################## -## F_POPR(INSN, SRC, DST) -## SRC - register -## DST - register -## execute an insn that pops a register -######################################## -define(`F_POPR', -`F_XCH_TO_TOP($2)dnl -$1( ST(0), ST(F_FIND_REG($3)) )F_POP_STACK()F_PCOMMENT(`$1 F$2, F$3')') - -######################################## -## F_POP1(INSN, SRC, DST) -## SRC - register -## DST - register -## execute an insn that pops a register -## with st(0) arg omitted -######################################## -define(`F_POP1', -`F_XCH_TO_TOP($2)dnl -$1( ST(F_FIND_REG($3)) )F_POP_STACK()F_PCOMMENT(`$1 F$2, F$3')') - -######################################## -## F_EXEC(INSN, SRC, DST) -## SRC - memory -## DST - register -## execute an insn that doesn't change the stack -######################################## -define(`F_EXEC', -`F_XCH_TO_TOP($3)dnl -$1( $2 )F_COMMENT(`$1 $2, F$3')') - -######################################## -## F_EXECR(INSN, SRC, DST) -## SRC - register -## DST - register -## execute an insn that doesn't change the stack -######################################## -define(`F_EXECR', -`F_XCH_TO_TOP($3)dnl -$1( ST(F_FIND_REG($2)), ST(0) )F_COMMENT(`$1 F$2, F$3')') - -######################################## -## F_EXEC0(INSN, REG) -## REG - register -## execute an insn that doesn't change -## the stack or have any arguments -## besides the stack top. -######################################## -define(`F_EXEC0', -`F_XCH_TO_TOP($2)dnl -$1`'F_COMMENT(`$1 F$2')') - -######################################## -## Some common fp operations - -######################################## -define(`F_FADD2', `F_EXECR( FADD2, $1, $2 )') -define(`F_FADD_S', `F_EXEC( FADD_S, $1, $2 )') -define(`F_FADDP', `F_POPR( FADDP, $1, $2 )') - -define(`F_FDIV2', `F_EXECR( FDIV2, $1, $2 )') -define(`F_FDIV_S', `F_EXEC( FDIV_S, $1, $2 )') -define(`F_FDIVP', `F_POPR( FDIVP, $1, $2 )') - -define(`F_FDIVR2', `F_EXECR( FDIVR2, $1, $2 )') -define(`F_FDIVR_S', `F_EXEC( FDIVR_S, $1, $2 )') -define(`F_FDIVRP', `F_POPR( FDIVRP, $1, $2 )') - -define(`F_FLD_S', `F_PUSH( FLD_S, $1, $2 )') - -define(`F_FMUL2', `F_EXECR( FMUL2, $1, $2 )') -define(`F_FMUL_S', `F_EXEC( FMUL_S, $1, $2 )') -define(`F_FMULP', `F_POPR( FMULP, $1, $2 )') - -define(`F_FSTP_S', `F_POP( FSTP_S, $1, $2 )') -define(`F_FSTP', `F_POP1( FSTP, $1, $2 )') - -define(`F_FSUB2', `F_EXECR( FSUB2, $1, $2 )') -define(`F_FSUB_S', `F_EXEC( FSUB_S, $1, $2 )') -define(`F_FSUBP', `F_POPR( FSUBP, $1, $2 )') - -define(`F_FSUBR2', `F_EXECR( FSUBR2, $1, $2 )') -define(`F_FSUBR_S', `F_EXEC( FSUBR_S, $1, $2 )') -define(`F_FSUBRP', `F_POPR( FSUBRP, $1, $2 )') - -######################################## -## Comments -######################################## -## define(`F_COMMENT', ` /* `$1' */') -## define(`F_PCOMMENT', ` /* `$1' { F_SHOW_STACK} */') -define(`F_COMMENT', `') -define(`F_PCOMMENT', ` /* F_SHOW_STACK*/') - -divert`'dnl Index: xc/extras/Mesa/src/X86/xform_args.h diff -u /dev/null xc/extras/Mesa/src/X86/xform_args.h:1.2 --- /dev/null Mon Dec 18 14:22:00 2000 +++ xc/extras/Mesa/src/X86/xform_args.h Mon Nov 13 18:31:20 2000 @@ -0,0 +1,73 @@ + +/* + * Mesa 3-D graphics library + * Version: 3.4 + * + * Copyright (C) 1999-2000 Brian Paul All Rights Reserved. + * + * 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 + * BRIAN PAUL 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. + */ + +/* + * Transform function interface for assembly code. Simply define + * FRAME_OFFSET to the number of bytes pushed onto the stack before + * using the ARG_* argument macros. + * + * Gareth Hughes + */ + +#ifndef __XFORM_ARGS_H__ +#define __XFORM_ARGS_H__ + +/* Offsets into GLvector4f + */ +#define V4F_DATA 0 +#define V4F_START 4 +#define V4F_COUNT 8 +#define V4F_STRIDE 12 +#define V4F_SIZE 16 +#define V4F_FLAGS 20 + +/* GLvector4f flags + */ +#define VEC_SIZE_1 1 +#define VEC_SIZE_2 3 +#define VEC_SIZE_3 7 +#define VEC_SIZE_4 15 + +/* Offsets for transform_func arguments + * + * typedef void (*transform_func)( GLvector4f *to_vec, + * const GLfloat m[16], + * const GLvector4f *from_vec, + * const GLubyte *clipmask, + * const GLubyte flag ); + */ +#define OFFSET_DEST 4 +#define OFFSET_MATRIX 8 +#define OFFSET_SOURCE 12 +#define OFFSET_CLIP 16 +#define OFFSET_FLAG 20 + +#define ARG_DEST REGOFF(FRAME_OFFSET+OFFSET_DEST, ESP) +#define ARG_MATRIX REGOFF(FRAME_OFFSET+OFFSET_MATRIX, ESP) +#define ARG_SOURCE REGOFF(FRAME_OFFSET+OFFSET_SOURCE, ESP) +#define ARG_CLIP REGOFF(FRAME_OFFSET+OFFSET_CLIP, ESP) +#define ARG_FLAG REGOFF(FRAME_OFFSET+OFFSET_FLAG, ESP) + +#endif Index: xc/extras/X-TrueType/xttfuncs.c diff -u xc/extras/X-TrueType/xttfuncs.c:1.7 xc/extras/X-TrueType/xttfuncs.c:1.8 --- xc/extras/X-TrueType/xttfuncs.c:1.7 Thu May 18 19:46:10 2000 +++ xc/extras/X-TrueType/xttfuncs.c Tue Sep 26 11:56:41 2000 @@ -31,7 +31,7 @@ Notice=== */ -/* $XFree86: xc/extras/X-TrueType/xttfuncs.c,v 1.7 2000/05/18 23:46:10 dawes Exp $ */ +/* $XFree86: xc/extras/X-TrueType/xttfuncs.c,v 1.8 2000/09/26 15:56:41 tsi Exp $ */ #include "xttversion.h" @@ -463,7 +463,7 @@ } else { linesize = 16; } - if ((ft->cache = FontCacheOpenCache((void *) linesize)) == NULL) { + if ((ft->cache = FontCacheOpenCache((void *)(long) linesize)) == NULL) { result = AllocError; goto doneInstQuit; } Index: xc/extras/X-TrueType/BIG5/BIG5toUCS2.c diff -u xc/extras/X-TrueType/BIG5/BIG5toUCS2.c:1.2 xc/extras/X-TrueType/BIG5/BIG5toUCS2.c:1.4 --- xc/extras/X-TrueType/BIG5/BIG5toUCS2.c:1.2 Mon Feb 14 14:20:22 2000 +++ xc/extras/X-TrueType/BIG5/BIG5toUCS2.c Wed Nov 29 12:40:21 2000 @@ -33,6 +33,7 @@ This table data derived from Unicode, Inc. (ftp://ftp.unicode.org/Public/MAPPINGS/EASTASIA/OTHER/BIG5.TXT) */ +/* $XFree86: xc/extras/X-TrueType/BIG5/BIG5toUCS2.c,v 1.4 2000/11/29 17:40:21 dawes Exp $ */ #include "xttversion.h" @@ -48,10 +49,10 @@ static ucs2_t tblBig5ToUcs2[] = { /* 0xA140 - 0xA1FF */ - 0x3000, 0xFF0C, 0x3001, 0x3002, 0xFF0E, 0x2022, 0xFF1B, 0xFF1A, - 0xFF1F, 0xFF01, 0xFE30, 0x2026, 0x2025, 0xFE50, 0xFF64, 0xFE52, + 0x3000, 0xFF0C, 0x3001, 0x3002, 0xFF0E, 0x2027, 0xFF1B, 0xFF1A, + 0xFF1F, 0xFF01, 0xFE30, 0x2026, 0x2025, 0xFE50, 0xFE51, 0xFE52, 0x00B7, 0xFE54, 0xFE55, 0xFE56, 0xFE57, 0xFF5C, 0x2013, 0xFE31, - 0x2014, 0xFE33, 0xFFFD, 0xFE34, 0xFE4F, 0xFF08, 0xFF09, 0xFE35, + 0x2014, 0xFE33, 0x2574, 0xFE34, 0xFE4F, 0xFF08, 0xFF09, 0xFE35, 0xFE36, 0xFF5B, 0xFF5D, 0xFE37, 0xFE38, 0x3014, 0x3015, 0xFE39, 0xFE3A, 0x3010, 0x3011, 0xFE3B, 0xFE3C, 0x300A, 0x300B, 0xFE3D, 0xFE3E, 0x3008, 0x3009, 0xFE3F, 0xFE40, 0x300C, 0x300D, 0xFE41, @@ -64,16 +65,16 @@ 0x201D, 0x301D, 0x301E, 0x2035, 0x2032, 0xFF03, 0xFF06, 0xFF0A, 0x203B, 0x00A7, 0x3003, 0x25CB, 0x25CF, 0x25B3, 0x25B2, 0x25CE, 0x2606, 0x2605, 0x25C7, 0x25C6, 0x25A1, 0x25A0, 0x25BD, 0x25BC, - 0x32A3, 0x2105, 0x203E, 0xFFFD, 0xFF3F, 0xFFFD, 0xFE49, 0xFE4A, + 0x32A3, 0x2105, 0x00AF, 0xFFE3, 0xFF3F, 0x02CD, 0xFE49, 0xFE4A, 0xFE4D, 0xFE4E, 0xFE4B, 0xFE4C, 0xFE5F, 0xFE60, 0xFE61, 0xFF0B, 0xFF0D, 0x00D7, 0x00F7, 0x00B1, 0x221A, 0xFF1C, 0xFF1E, 0xFF1D, 0x2266, 0x2267, 0x2260, 0x221E, 0x2252, 0x2261, 0xFE62, 0xFE63, - 0xFE64, 0xFE65, 0xFE66, 0x223C, 0x2229, 0x222A, 0x22A5, 0x2220, + 0xFE64, 0xFE65, 0xFE66, 0xFF5E, 0x2229, 0x222A, 0x22A5, 0x2220, 0x221F, 0x22BF, 0x33D2, 0x33D1, 0x222B, 0x222E, 0x2235, 0x2234, - 0x2640, 0x2642, 0x2641, 0x2609, 0x2191, 0x2193, 0x2190, 0x2192, - 0x2196, 0x2197, 0x2199, 0x2198, 0x2225, 0x2223, 0xFFFD, ALTCHR, + 0x2640, 0x2642, 0x2295, 0x2299, 0x2191, 0x2193, 0x2190, 0x2192, + 0x2196, 0x2197, 0x2199, 0x2198, 0x2225, 0x2223, 0xFF0F, ALTCHR, /* 0xA240 - 0xA2FF */ - 0xFFFD, 0xFF0F, 0xFF3C, 0xFF04, 0x00A5, 0x3012, 0x00A2, 0x00A3, + 0xFF3C, 0x2215, 0xFE68, 0xFF04, 0xFFE5, 0x3012, 0xFFE0, 0xFFE1, 0xFF05, 0xFF20, 0x2103, 0x2109, 0xFE69, 0xFE6A, 0xFE6B, 0x33D5, 0x339C, 0x339D, 0x339E, 0x33CE, 0x33A1, 0x338E, 0x338F, 0x33C4, 0x00B0, 0x5159, 0x515B, 0x515E, 0x515D, 0x5161, 0x5163, 0x55E7, @@ -90,7 +91,7 @@ 0xFF11, 0xFF12, 0xFF13, 0xFF14, 0xFF15, 0xFF16, 0xFF17, 0xFF18, 0xFF19, 0x2160, 0x2161, 0x2162, 0x2163, 0x2164, 0x2165, 0x2166, 0x2167, 0x2168, 0x2169, 0x3021, 0x3022, 0x3023, 0x3024, 0x3025, - 0x3026, 0x3027, 0x3028, 0x3029, 0xFFFD, 0x5344, 0xFFFD, 0xFF21, + 0x3026, 0x3027, 0x3028, 0x3029, 0x5341, 0x5344, 0x5345, 0xFF21, 0xFF22, 0xFF23, 0xFF24, 0xFF25, 0xFF26, 0xFF27, 0xFF28, 0xFF29, 0xFF2A, 0xFF2B, 0xFF2C, 0xFF2D, 0xFF2E, 0xFF2F, 0xFF30, 0xFF31, 0xFF32, 0xFF33, 0xFF34, 0xFF35, 0xFF36, 0xFF37, 0xFF38, 0xFF39, @@ -118,10 +119,10 @@ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, + ALTCHR, 0x20AC, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, - ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, /* 0xA440 - 0xA4FF */ 0x4E00, 0x4E59, 0x4E01, 0x4E03, 0x4E43, 0x4E5D, 0x4E86, 0x4E8C, 0x4EBA, 0x513F, 0x5165, 0x516B, 0x51E0, 0x5200, 0x5201, 0x529B, @@ -985,68 +986,68 @@ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, - ALTCHR, 0x30FE, 0x309D, 0x309E, 0x3005, 0x3041, 0x3042, 0x3043, - 0x3044, 0x3045, 0x3046, 0x3047, 0x3048, 0x3049, 0x304A, 0x304B, - 0x304C, 0x304D, 0x304E, 0x304F, 0x3050, 0x3051, 0x3052, 0x3053, - 0x3054, 0x3055, 0x3056, 0x3057, 0x3058, 0x3059, 0x305A, 0x305B, - 0x305C, 0x305D, 0x305E, 0x305F, 0x3060, 0x3061, 0x3062, 0x3063, - 0x3064, 0x3065, 0x3066, 0x3067, 0x3068, 0x3069, 0x306A, 0x306B, - 0x306C, 0x306D, 0x306E, 0x306F, 0x3070, 0x3071, 0x3072, 0x3073, - 0x3074, 0x3075, 0x3076, 0x3077, 0x3078, 0x3079, 0x307A, 0x307B, - 0x307C, 0x307D, 0x307E, 0x307F, 0x3080, 0x3081, 0x3082, 0x3083, - 0x3084, 0x3085, 0x3086, 0x3087, 0x3088, 0x3089, 0x308A, 0x308B, - 0x308C, 0x308D, 0x308E, 0x308F, 0x3090, 0x3091, 0x3092, 0x3093, - 0x30A1, 0x30A2, 0x30A3, 0x30A4, 0x30A5, 0x30A6, 0x30A7, ALTCHR, + ALTCHR, 0xF6B1, 0xF6B2, 0xF6B3, 0xF6B4, 0xF6B5, 0xF6B6, 0xF6B7, + 0xF6B8, 0xF6B9, 0xF6BA, 0xF6BB, 0xF6BC, 0xF6BD, 0xF6BE, 0xF6BF, + 0xF6C0, 0xF6C1, 0xF6C2, 0xF6C3, 0xF6C4, 0xF6C5, 0xF6C6, 0xF6C7, + 0xF6C8, 0xF6C9, 0xF6CA, 0xF6CB, 0xF6CC, 0xF6CD, 0xF6CE, 0xF6CF, + 0xF6D0, 0xF6D1, 0xF6D2, 0xF6D3, 0xF6D4, 0xF6D5, 0xF6D6, 0xF6D7, + 0xF6D8, 0xF6D9, 0xF6DA, 0xF6DB, 0xF6DC, 0xF6DD, 0xF6DE, 0xF6DF, + 0xF6E0, 0xF6E1, 0xF6E2, 0xF6E3, 0xF6E4, 0xF6E5, 0xF6E6, 0xF6E7, + 0xF6E8, 0xF6E9, 0xF6EA, 0xF6EB, 0xF6EC, 0xF6ED, 0xF6EE, 0xF6EF, + 0xF6F0, 0xF6F1, 0xF6F2, 0xF6F3, 0xF6F4, 0xF6F5, 0xF6F6, 0xF6F7, + 0xF6F8, 0xF6F9, 0xF6FA, 0xF6FB, 0xF6FC, 0xF6FD, 0xF6FE, 0xF6FF, + 0xF700, 0xF701, 0xF702, 0xF703, 0xF704, 0xF705, 0xF706, 0xF707, + 0xF708, 0xF709, 0xF70A, 0xF70B, 0xF70C, 0xF70D, 0xF70E, ALTCHR, /* 0xC740 - 0xC7FF */ - 0x30A8, 0x30A9, 0x30AA, 0x30AB, 0x30AC, 0x30AD, 0x30AE, 0x30AF, - 0x30B0, 0x30B1, 0x30B2, 0x30B3, 0x30B4, 0x30B5, 0x30B6, 0x30B7, - 0x30B8, 0x30B9, 0x30BA, 0x30BB, 0x30BC, 0x30BD, 0x30BE, 0x30BF, - 0x30C0, 0x30C1, 0x30C2, 0x30C3, 0x30C4, 0x30C5, 0x30C6, 0x30C7, - 0x30C8, 0x30C9, 0x30CA, 0x30CB, 0x30CC, 0x30CD, 0x30CE, 0x30CF, - 0x30D0, 0x30D1, 0x30D2, 0x30D3, 0x30D4, 0x30D5, 0x30D6, 0x30D7, - 0x30D8, 0x30D9, 0x30DA, 0x30DB, 0x30DC, 0x30DD, 0x30DE, 0x30DF, - 0x30E0, 0x30E1, 0x30E2, 0x30E3, 0x30E4, 0x30E5, 0x30E6, ALTCHR, + 0xF70F, 0xF710, 0xF711, 0xF712, 0xF713, 0xF714, 0xF715, 0xF716, + 0xF717, 0xF718, 0xF719, 0xF71A, 0xF71B, 0xF71C, 0xF71D, 0xF71E, + 0xF71F, 0xF720, 0xF721, 0xF722, 0xF723, 0xF724, 0xF725, 0xF726, + 0xF727, 0xF728, 0xF729, 0xF72A, 0xF72B, 0xF72C, 0xF72D, 0xF72E, + 0xF72F, 0xF730, 0xF731, 0xF732, 0xF733, 0xF734, 0xF735, 0xF736, + 0xF737, 0xF738, 0xF739, 0xF73A, 0xF73B, 0xF73C, 0xF73D, 0xF73E, + 0xF73F, 0xF740, 0xF741, 0xF742, 0xF743, 0xF744, 0xF745, 0xF746, + 0xF747, 0xF748, 0xF749, 0xF74A, 0xF74B, 0xF74C, 0xF74D, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, - ALTCHR, 0x30E7, 0x30E8, 0x30E9, 0x30EA, 0x30EB, 0x30EC, 0x30ED, - 0x30EE, 0x30EF, 0x30F0, 0x30F1, 0x30F2, 0x30F3, 0x30F4, 0x30F5, - 0x30F6, 0x0414, 0x0415, 0x0401, 0x0416, 0x0417, 0x0418, 0x0419, - 0x041A, 0x041B, 0x041C, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, - 0x0428, 0x0429, 0x042A, 0x042B, 0x042C, 0x042D, 0x042E, 0x042F, - 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0451, 0x0436, - 0x0437, 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, - 0x043F, 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, - 0x0447, 0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, 0x044E, - 0x044F, 0x2460, 0x2461, 0x2462, 0x2463, 0x2464, 0x2465, 0x2466, - 0x2467, 0x2468, 0x2469, 0x2474, 0x2475, 0x2476, 0x2477, 0x2478, - 0x2479, 0x247A, 0x247B, 0x247C, 0x247D, ALTCHR, ALTCHR, ALTCHR, + ALTCHR, 0xF74E, 0xF74F, 0xF750, 0xF751, 0xF752, 0xF753, 0xF754, + 0xF755, 0xF756, 0xF757, 0xF758, 0xF759, 0xF75A, 0xF75B, 0xF75C, + 0xF75D, 0xF75E, 0xF75F, 0xF760, 0xF761, 0xF762, 0xF763, 0xF764, + 0xF765, 0xF766, 0xF767, 0xF768, 0xF769, 0xF76A, 0xF76B, 0xF76C, + 0xF76D, 0xF76E, 0xF76F, 0xF770, 0xF771, 0xF772, 0xF773, 0xF774, + 0xF775, 0xF776, 0xF777, 0xF778, 0xF779, 0xF77A, 0xF77B, 0xF77C, + 0xF77D, 0xF77E, 0xF77F, 0xF780, 0xF781, 0xF782, 0xF783, 0xF784, + 0xF785, 0xF786, 0xF787, 0xF788, 0xF789, 0xF78A, 0xF78B, 0xF78C, + 0xF78D, 0xF78E, 0xF78F, 0xF790, 0xF791, 0xF792, 0xF793, 0xF794, + 0xF795, 0xF796, 0xF797, 0xF798, 0xF799, 0xF79A, 0xF79B, 0xF79C, + 0xF79D, 0xF79E, 0xF79F, 0xF7A0, 0xF7A1, 0xF7A2, 0xF7A3, 0xF7A4, + 0xF7A5, 0xF7A6, 0xF7A7, 0xF7A8, 0xF7A9, 0xF7AA, 0xF7AB, ALTCHR, /* 0xC840 - 0xC8FF */ - ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, - ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, - ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, - ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, - ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, - ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, - ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, - ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, - ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, - ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, - ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, - ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, + 0xF7AC, 0xF7AD, 0xF7AE, 0xF7AF, 0xF7B0, 0xF7B1, 0xF7B2, 0xF7B3, + 0xF7B4, 0xF7B5, 0xF7B6, 0xF7B7, 0xF7B8, 0xF7B9, 0xF7BA, 0xF7BB, + 0xF7BC, 0xF7BD, 0xF7BE, 0xF7BF, 0xF7C0, 0xF7C1, 0xF7C2, 0xF7C3, + 0xF7C4, 0xF7C5, 0xF7C6, 0xF7C7, 0xF7C8, 0xF7C9, 0xF7CA, 0xF7CB, + 0xF7CC, 0xF7CD, 0xF7CE, 0xF7CF, 0xF7D0, 0xF7D1, 0xF7D2, 0xF7D3, + 0xF7D4, 0xF7D5, 0xF7D6, 0xF7D7, 0xF7D8, 0xF7D9, 0xF7DA, 0xF7DB, + 0xF7DC, 0xF7DD, 0xF7DE, 0xF7DF, 0xF7E0, 0xF7E1, 0xF7E2, 0xF7E3, + 0xF7E4, 0xF7E5, 0xF7E6, 0xF7E7, 0xF7E8, 0xF7E9, 0xF7EA, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, - ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, - ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, - ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, - ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, - ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, - ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, - ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, - ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, + ALTCHR, 0xF7EB, 0xF7EC, 0xF7ED, 0xF7EE, 0xF7EF, 0xF7F0, 0xF7F1, + 0xF7F2, 0xF7F3, 0xF7F4, 0xF7F5, 0xF7F6, 0xF7F7, 0xF7F8, 0xF7F9, + 0xF7FA, 0xF7FB, 0xF7FC, 0xF7FD, 0xF7FE, 0xF7FF, 0xF800, 0xF801, + 0xF802, 0xF803, 0xF804, 0xF805, 0xF806, 0xF807, 0xF808, 0xF809, + 0xF80A, 0xF80B, 0xF80C, 0xF80D, 0xF80E, 0xF80F, 0xF810, 0xF811, + 0xF812, 0xF813, 0xF814, 0xF815, 0xF816, 0xF817, 0xF818, 0xF819, + 0xF81A, 0xF81B, 0xF81C, 0xF81D, 0xF81E, 0xF81F, 0xF820, 0xF821, + 0xF822, 0xF823, 0xF824, 0xF825, 0xF826, 0xF827, 0xF828, 0xF829, + 0xF82A, 0xF82B, 0xF82C, 0xF82D, 0xF82E, 0xF82F, 0xF830, 0xF831, + 0xF832, 0xF833, 0xF834, 0xF835, 0xF836, 0xF837, 0xF838, 0xF839, + 0xF83A, 0xF83B, 0xF83C, 0xF83D, 0xF83E, 0xF83F, 0xF840, 0xF841, + 0xF842, 0xF843, 0xF844, 0xF845, 0xF846, 0xF847, 0xF848, ALTCHR, /* 0xC940 - 0xC9FF */ 0x4E42, 0x4E5C, 0x51F5, 0x531A, 0x5382, 0x4E07, 0x4E0C, 0x4E47, 0x4E8D, 0x56D7, 0xFA0C, 0x5C6E, 0x5F73, 0x4E0F, 0x5187, 0x4E0E, @@ -2266,12 +2267,12 @@ 0x9E17, 0x9F48, 0x6207, 0x6B1E, 0x7227, 0x864C, 0x8EA8, 0x9482, 0x9480, 0x9481, 0x9A69, 0x9A68, 0x9B2E, 0x9E19, 0x7229, 0x864B, 0x8B9F, 0x9483, 0x9C79, 0x9EB7, 0x7675, 0x9A6B, 0x9C7A, 0x9E1D, - 0x7069, 0x706A, 0x9EA4, 0x9F7E, 0x9F49, 0x9F98, ALTCHR, ALTCHR, - ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, - ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, - ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, - ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, - ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, + 0x7069, 0x706A, 0x9EA4, 0x9F7E, 0x9F49, 0x9F98, 0x7881, 0x92B9, + 0x88CF, 0x58BB, 0x6052, 0x7CA7, 0x5AFA, 0x2554, 0x2566, 0x2557, + 0x2560, 0x256C, 0x2563, 0x255A, 0x2569, 0x255D, 0x2552, 0x2564, + 0x2555, 0x255E, 0x256A, 0x2561, 0x2558, 0x2567, 0x255B, 0x2553, + 0x2565, 0x2556, 0x255F, 0x256B, 0x2562, 0x2559, 0x2568, 0x255C, + 0x2551, 0x2550, 0x256D, 0x256E, 0x2570, 0x256F, 0x2593, ALTCHR, }; CODE_CONV_TWO_OCTET_TO_UCS2(cc_big5_to_ucs2, /* function name */ Index: xc/extras/Xpm/lib/XpmI.h diff -u xc/extras/Xpm/lib/XpmI.h:1.1.1.1 xc/extras/Xpm/lib/XpmI.h:1.4 --- xc/extras/Xpm/lib/XpmI.h:1.1.1.1 Mon Jan 11 08:23:11 1999 +++ xc/extras/Xpm/lib/XpmI.h Tue Sep 26 11:56:42 2000 @@ -22,6 +22,7 @@ * used in advertising or otherwise to promote the sale, use or other dealings * in this Software without prior written authorization from GROUPE BULL. */ +/* $XFree86: xc/extras/Xpm/lib/XpmI.h,v 1.4 2000/09/26 15:56:42 tsi Exp $ */ /*****************************************************************************\ * XpmI.h: * @@ -55,7 +56,7 @@ extern FILE *popen(); #endif -#if defined(SYSV) || defined(SVR4) || defined(VMS) || defined(WIN32) +#if defined(SYSV) || defined(SVR4) || defined(VMS) || defined(WIN32) || defined(linux) #include #ifndef index @@ -82,7 +83,8 @@ #endif /* the following is defined in X11R6 but not in previous versions */ -#ifdef __alpha +#if defined(__alpha) || defined(__alpha__) || \ + defined(ia64) || defined(__ia64__) #ifndef LONG64 #define LONG64 #endif @@ -226,8 +228,8 @@ FUNC(xpmHashSlot, xpmHashAtom *, (xpmHashTable *table, char *s)); FUNC(xpmHashIntern, int, (xpmHashTable *table, char *tag, void *data)); -#define HashAtomData(i) ((void *)i) -#define HashColorIndex(slot) ((unsigned int)((*slot)->data)) +#define HashAtomData(i) ((void *)(long)i) +#define HashColorIndex(slot) ((unsigned long)((*slot)->data)) #define USE_HASHTABLE (cpp > 2 && ncolors > 4) /* I/O utility */ Index: xc/extras/Xpm/lib/parse.c diff -u xc/extras/Xpm/lib/parse.c:1.1.1.1 xc/extras/Xpm/lib/parse.c:1.2 --- xc/extras/Xpm/lib/parse.c:1.1.1.1 Mon Jan 11 08:23:11 1999 +++ xc/extras/Xpm/lib/parse.c Tue Sep 26 11:56:43 2000 @@ -22,6 +22,7 @@ * used in advertising or otherwise to promote the sale, use or other dealings * in this Software without prior written authorization from GROUPE BULL. */ +/* $XFree86: xc/extras/Xpm/lib/parse.c,v 1.2 2000/09/26 15:56:43 tsi Exp $ */ /*****************************************************************************\ * parse.c: * @@ -40,6 +41,7 @@ #include "XpmI.h" #include +#include LFUNC(ParsePixels, int, (xpmData *data, unsigned int width, unsigned int height, unsigned int ncolors, Index: xc/extras/fonts/ClearlyU/README diff -u xc/extras/fonts/ClearlyU/README:1.2 xc/extras/fonts/ClearlyU/README:1.3 --- xc/extras/fonts/ClearlyU/README:1.2 Sun Apr 25 06:01:03 1999 +++ xc/extras/fonts/ClearlyU/README Thu Dec 7 13:47:04 2000 @@ -1,8 +1,7 @@ # -# From: Id: README,v 1.8 1999/04/22 18:39:50 mleisher Exp $ +# Id: README,v 1.11 2000/12/06 22:13:11 mleisher Exp $ # -# Copyright 1996, 1997, 1998, 1999 Computing Research Lab, -# New Mexico State University +# Copyright 2000 Computing Research Lab, New Mexico State University # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), @@ -23,14 +22,14 @@ # THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -Version: 1.7 -22 April 1999 +Version: 1.8 +6 December 2000 This set of fonts provides a 12pt, 100dpi proportional font with many of the glyphs needed for Unicode text. I call the typeface "ClearlyU" and it was influenced by Donald Knuth's Computer Modern. -The fonts together contain 4270 glyphs at the moment. +The fonts together contain 7564 glyphs at the moment. Information about this font and samples, are located at: @@ -47,6 +46,52 @@ CHANGES ======= + +CHANGES FROM 1.7 +--------------- + + o Adjusted the shapes of U+01A2 and U+01A3 based on: + http://www.indigo.ie/egt/standards/iso10646/pdf/gha.pdf + + o Added some more glyphs for Unicode 3.0. + + o Some minor lightening of a few glyphs. + + o Redrew the Hebrew glyphs to be more consistent with the other scripts. + + o Removed a combination from the PUA font that is in Unicode 3.0. + + o Made the digits in the Arabic glyphs heavier to reflect more common + practice. The Urdu digit glyphs in the alternate font updated as well. + + o Modified the Arabic block glyphs to be smaller and less silly looking. + + o Added Devanagari glyphs including those needed to actually present text. + + o Adjusted the advance widths of the Cyrillic capital letters to make + presentation more consistent. + + o Adjusted the width of the Lao vowels, I, II, Y, and YY. + + o Renamed all the glyphs to "uniXXXX". + + o Added a Macedonian/Serbian alternate for U+0431 to cu-alt12. + + o Added the Romanian alternates using virgule instead of cedilla for + U+015E, U+015F, U+0162, and U+0163. + + o Added the Persian alternate glyph for the decimal separator at U+066B to + the alternate font. + + o Fixed up some of the Greek glyphs so the small iota follows the capital + letters. + + o Improved the Greek drachma sign. + + o Adjusted the Cyrillic block to match Unicode 3.0 and moved the extra + characters to the PUA font. + + o Initial addition of some basic Hangul glyphs. CHANGES FROM 1.6 ---------------- Index: xc/extras/fonts/ClearlyU/cu-alt12.bdf diff -u xc/extras/fonts/ClearlyU/cu-alt12.bdf:1.2 xc/extras/fonts/ClearlyU/cu-alt12.bdf:1.3 --- xc/extras/fonts/ClearlyU/cu-alt12.bdf:1.2 Sun Apr 25 06:01:03 1999 +++ xc/extras/fonts/ClearlyU/cu-alt12.bdf Thu Dec 7 13:47:04 2000 @@ -1,6 +1,6 @@ STARTFONT 2.1 COMMENT -COMMENT From: Id: cu-alt12.bdf,v 1.8 1999/04/22 18:39:51 mleisher Exp $ +COMMENT Id: cu-alt12.bdf,v 1.9 2000/12/06 21:58:14 mleisher Exp $ COMMENT COMMENT Copyright 1997, 1998, 1999 Computing Research Labs, New Mexico State COMMENT University @@ -32,7 +32,7 @@ FONT -MUTT-ClearlyU Alternate Glyphs-Medium-R-Normal--17-120-100-100-P-91-ISO10646-1 SIZE 12 100 100 FONTBOUNDINGBOX 18 24 -1 -7 -STARTPROPERTIES 23 +STARTPROPERTIES 21 COPYRIGHT "1997, 1998 Computing Research Lab, New Mexico State University." POINT_SIZE 120 PIXEL_SIZE 17 @@ -50,15 +50,13 @@ ADD_STYLE_NAME "" CHARSET_REGISTRY "ISO10646" CHARSET_ENCODING "1" -_XMBDFED_INFO "Edited with xmbdfed 3.8." +_XMBDFED_INFO "Edited with xmbdfed 4.4." CAP_HEIGHT 11 X_HEIGHT 7 DEFAULT_CHAR 65534 -_XFREE86_GLYPH_RANGES "271 291 318 990_991 1729_1731 1780 1782_1783 4256_4294 4304_4341 7942_7943 7950_7951 7974_7975 7982_7983 7990_7991 7998_7999 8022_8023 8031 8038_8039 8046_8047 8070_8071 8078_8079 8086_8087 8094_8095 8102_8103 8110_8111 8118_8119 8128_8129 8134_8135 8143 8150_8151 8159 8166_8167" -_XFREE86_GLYPH_RANGES "8182_8183 8355 8470 61638 61687_61688 64424 65260 65533_65534" ENDPROPERTIES -CHARS 142 -STARTCHAR 0x010F +CHARS 157 +STARTCHAR uni010F ENCODING 271 SWIDTH 420 0 DWIDTH 7 0 @@ -81,7 +79,7 @@ 48 7C ENDCHAR -STARTCHAR 0x0123 +STARTCHAR uni0123 ENCODING 291 SWIDTH 480 0 DWIDTH 8 0 @@ -102,7 +100,7 @@ 08 38 ENDCHAR -STARTCHAR 0x013E +STARTCHAR uni013E ENCODING 318 SWIDTH 240 0 DWIDTH 4 0 @@ -125,7 +123,94 @@ 20 70 ENDCHAR -STARTCHAR 0x03DE +STARTCHAR uni015E +ENCODING 350 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 6 16 1 -5 +BITMAP +7C +84 +84 +80 +40 +30 +08 +04 +84 +84 +F8 +00 +30 +30 +10 +20 +ENDCHAR +STARTCHAR uni015F +ENCODING 351 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 12 1 -5 +BITMAP +78 +88 +80 +70 +08 +88 +F0 +00 +30 +30 +10 +20 +ENDCHAR +STARTCHAR uni0162 +ENCODING 354 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 9 16 1 -5 +BITMAP +FF80 +8880 +8880 +8880 +0800 +0800 +0800 +0800 +0800 +0800 +3E00 +0000 +0C00 +0C00 +0400 +0800 +ENDCHAR +STARTCHAR uni0163 +ENCODING 355 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 6 15 0 -5 +BITMAP +20 +20 +20 +F8 +20 +20 +20 +24 +24 +18 +00 +18 +18 +08 +10 +ENDCHAR +STARTCHAR uni03DE ENCODING 990 SWIDTH 540 0 DWIDTH 9 0 @@ -143,7 +228,7 @@ 04 08 ENDCHAR -STARTCHAR 0x03DF +STARTCHAR uni03DF ENCODING 991 SWIDTH 420 0 DWIDTH 7 0 @@ -160,24 +245,57 @@ 10 20 ENDCHAR -STARTCHAR 0x06C1 +STARTCHAR uni0431 +ENCODING 1073 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 11 1 0 +BITMAP +78 +80 +80 +40 +20 +50 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni066B +ENCODING 1643 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 4 8 1 -2 +BITMAP +10 +10 +20 +20 +40 +40 +80 +80 +ENDCHAR +STARTCHAR uni06C1 ENCODING 1729 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 5 6 1 0 +SWIDTH 300 0 +DWIDTH 5 0 +BBX 4 6 1 0 BITMAP 20 30 50 -98 -88 -78 +90 +90 +60 ENDCHAR -STARTCHAR 0x06C2 +STARTCHAR uni06C2 ENCODING 1730 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 5 11 1 0 +SWIDTH 300 0 +DWIDTH 5 0 +BBX 4 11 1 0 BITMAP 30 40 @@ -187,15 +305,15 @@ 20 30 50 -98 -88 -78 +90 +90 +60 ENDCHAR -STARTCHAR 0x06C3 +STARTCHAR uni06C3 ENCODING 1731 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 5 10 1 0 +SWIDTH 300 0 +DWIDTH 5 0 +BBX 4 10 1 0 BITMAP 50 50 @@ -204,59 +322,175 @@ 20 30 50 -98 -88 -78 +90 +90 +60 ENDCHAR -STARTCHAR 0x06F4 +STARTCHAR uni06F4 ENCODING 1780 SWIDTH 540 0 DWIDTH 9 0 -BBX 7 10 2 0 +BBX 7 10 1 0 BITMAP -F2 -EC -C8 +72 +FE +CC +48 60 60 20 -30 -10 -10 -10 +20 +20 +20 ENDCHAR -STARTCHAR 0x06F6 -ENCODING 1782 +STARTCHAR uni06F7 +ENCODING 1783 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 8 8 1 1 +BITMAP +03 +0E +38 +60 +E0 +78 +1E +07 +ENDCHAR +STARTCHAR uni0916 +ENCODING 2326 +SWIDTH 840 0 +DWIDTH 14 0 +BBX 14 11 0 0 +BITMAP +FFFC +1020 +1020 +13A0 +B660 +E460 +44E0 +43A0 +2020 +1020 +0820 +ENDCHAR +STARTCHAR uni0959 +ENCODING 2393 +SWIDTH 840 0 +DWIDTH 14 0 +BBX 14 11 0 0 +BITMAP +FFFC +1020 +1020 +13A0 +B660 +E460 +44E0 +43A0 +2020 +1120 +0920 +ENDCHAR +STARTCHAR uni096A +ENCODING 2410 SWIDTH 540 0 DWIDTH 9 0 -BBX 8 10 1 0 +BBX 6 10 3 1 BITMAP -04 -DC -74 -04 -04 -06 -02 -03 -03 -01 +88 +84 +84 +48 +30 +30 +68 +48 +58 +30 ENDCHAR -STARTCHAR 0x06F7 -ENCODING 1783 +STARTCHAR uni096B +ENCODING 2411 SWIDTH 420 0 DWIDTH 7 0 -BBX 6 7 1 2 +BBX 6 13 1 -2 BITMAP +84 +84 +84 +84 +4C +34 04 -18 -60 +08 +08 +F0 +F0 +10 +08 +ENDCHAR +STARTCHAR uni096C +ENCODING 2412 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 6 17 2 -2 +BITMAP +30 +48 +40 +20 +70 +80 +80 +80 +78 +40 +40 +40 +3C +3C +20 +40 80 +ENDCHAR +STARTCHAR uni096E +ENCODING 2414 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +FF80 +2000 +4000 +4000 +4000 +4000 +2300 +1C80 +0080 +0100 +ENDCHAR +STARTCHAR uni096F +ENCODING 2415 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 6 11 2 0 +BITMAP 60 -18 -04 +90 +88 +40 +60 +90 +80 +80 +40 +30 +0C ENDCHAR -STARTCHAR 0x10A0 +STARTCHAR uni10A0 ENCODING 4256 SWIDTH 480 0 DWIDTH 8 0 @@ -271,7 +505,7 @@ 1E 02 ENDCHAR -STARTCHAR 0x10A1 +STARTCHAR uni10A1 ENCODING 4257 SWIDTH 480 0 DWIDTH 8 0 @@ -288,7 +522,7 @@ 82 7C ENDCHAR -STARTCHAR 0x10A2 +STARTCHAR uni10A2 ENCODING 4258 SWIDTH 540 0 DWIDTH 9 0 @@ -306,7 +540,7 @@ 41 3E ENDCHAR -STARTCHAR 0x10A3 +STARTCHAR uni10A3 ENCODING 4259 SWIDTH 480 0 DWIDTH 8 0 @@ -324,7 +558,7 @@ 44 38 ENDCHAR -STARTCHAR 0x10A4 +STARTCHAR uni10A4 ENCODING 4260 SWIDTH 480 0 DWIDTH 8 0 @@ -341,7 +575,7 @@ 02 07 ENDCHAR -STARTCHAR 0x10A5 +STARTCHAR uni10A5 ENCODING 4261 SWIDTH 720 0 DWIDTH 12 0 @@ -358,7 +592,7 @@ 0200 0700 ENDCHAR -STARTCHAR 0x10A6 +STARTCHAR uni10A6 ENCODING 4262 SWIDTH 480 0 DWIDTH 8 0 @@ -376,7 +610,7 @@ 22 3C ENDCHAR -STARTCHAR 0x10A7 +STARTCHAR uni10A7 ENCODING 4263 SWIDTH 720 0 DWIDTH 12 0 @@ -389,7 +623,7 @@ 4440 EEE0 ENDCHAR -STARTCHAR 0x10A8 +STARTCHAR uni10A8 ENCODING 4264 SWIDTH 300 0 DWIDTH 5 0 @@ -403,7 +637,7 @@ 20 70 ENDCHAR -STARTCHAR 0x10A9 +STARTCHAR uni10A9 ENCODING 4265 SWIDTH 480 0 DWIDTH 8 0 @@ -423,7 +657,7 @@ 04 0E ENDCHAR -STARTCHAR 0x10AA +STARTCHAR uni10AA ENCODING 4266 SWIDTH 780 0 DWIDTH 13 0 @@ -437,7 +671,7 @@ 2220 7770 ENDCHAR -STARTCHAR 0x10AB +STARTCHAR uni10AB ENCODING 4267 SWIDTH 360 0 DWIDTH 6 0 @@ -455,7 +689,7 @@ 88 70 ENDCHAR -STARTCHAR 0x10AC +STARTCHAR uni10AC ENCODING 4268 SWIDTH 480 0 DWIDTH 8 0 @@ -473,7 +707,7 @@ 44 EE ENDCHAR -STARTCHAR 0x10AD +STARTCHAR uni10AD ENCODING 4269 SWIDTH 720 0 DWIDTH 12 0 @@ -486,7 +720,7 @@ 4CC0 3360 ENDCHAR -STARTCHAR 0x10AE +STARTCHAR uni10AE ENCODING 4270 SWIDTH 540 0 DWIDTH 9 0 @@ -500,7 +734,7 @@ 26 1B ENDCHAR -STARTCHAR 0x10AF +STARTCHAR uni10AF ENCODING 4271 SWIDTH 540 0 DWIDTH 9 0 @@ -517,7 +751,7 @@ 02 07 ENDCHAR -STARTCHAR 0x10B0 +STARTCHAR uni10B0 ENCODING 4272 SWIDTH 720 0 DWIDTH 12 0 @@ -533,7 +767,7 @@ 4C40 34E0 ENDCHAR -STARTCHAR 0x10B1 +STARTCHAR uni10B1 ENCODING 4273 SWIDTH 480 0 DWIDTH 8 0 @@ -550,7 +784,7 @@ 4C 36 ENDCHAR -STARTCHAR 0x10B2 +STARTCHAR uni10B2 ENCODING 4274 SWIDTH 360 0 DWIDTH 6 0 @@ -567,7 +801,7 @@ 84 78 ENDCHAR -STARTCHAR 0x10B3 +STARTCHAR uni10B3 ENCODING 4275 SWIDTH 960 0 DWIDTH 16 0 @@ -583,7 +817,7 @@ 0004 000E ENDCHAR -STARTCHAR 0x10B4 +STARTCHAR uni10B4 ENCODING 4276 SWIDTH 420 0 DWIDTH 7 0 @@ -599,7 +833,7 @@ 10 38 ENDCHAR -STARTCHAR 0x10B5 +STARTCHAR uni10B5 ENCODING 4277 SWIDTH 600 0 DWIDTH 10 0 @@ -619,7 +853,7 @@ 0800 1C00 ENDCHAR -STARTCHAR 0x10B6 +STARTCHAR uni10B6 ENCODING 4278 SWIDTH 540 0 DWIDTH 9 0 @@ -633,7 +867,7 @@ 22 77 ENDCHAR -STARTCHAR 0x10B7 +STARTCHAR uni10B7 ENCODING 4279 SWIDTH 540 0 DWIDTH 9 0 @@ -650,7 +884,7 @@ 02 07 ENDCHAR -STARTCHAR 0x10B8 +STARTCHAR uni10B8 ENCODING 4280 SWIDTH 420 0 DWIDTH 7 0 @@ -667,7 +901,7 @@ 84 78 ENDCHAR -STARTCHAR 0x10B9 +STARTCHAR uni10B9 ENCODING 4281 SWIDTH 480 0 DWIDTH 8 0 @@ -687,7 +921,7 @@ 40 E0 ENDCHAR -STARTCHAR 0x10BA +STARTCHAR uni10BA ENCODING 4282 SWIDTH 480 0 DWIDTH 8 0 @@ -704,7 +938,7 @@ 44 38 ENDCHAR -STARTCHAR 0x10BB +STARTCHAR uni10BB ENCODING 4283 SWIDTH 660 0 DWIDTH 11 0 @@ -720,7 +954,7 @@ 4440 EEE0 ENDCHAR -STARTCHAR 0x10BC +STARTCHAR uni10BC ENCODING 4284 SWIDTH 660 0 DWIDTH 11 0 @@ -736,7 +970,7 @@ 4000 E000 ENDCHAR -STARTCHAR 0x10BD +STARTCHAR uni10BD ENCODING 4285 SWIDTH 480 0 DWIDTH 8 0 @@ -752,7 +986,7 @@ 82 7C ENDCHAR -STARTCHAR 0x10BE +STARTCHAR uni10BE ENCODING 4286 SWIDTH 420 0 DWIDTH 7 0 @@ -769,7 +1003,7 @@ 42 3C ENDCHAR -STARTCHAR 0x10BF +STARTCHAR uni10BF ENCODING 4287 SWIDTH 480 0 DWIDTH 8 0 @@ -786,7 +1020,7 @@ 50 20 ENDCHAR -STARTCHAR 0x10C0 +STARTCHAR uni10C0 ENCODING 4288 SWIDTH 720 0 DWIDTH 12 0 @@ -800,7 +1034,7 @@ 2660 19A0 ENDCHAR -STARTCHAR 0x10C1 +STARTCHAR uni10C1 ENCODING 4289 SWIDTH 420 0 DWIDTH 7 0 @@ -820,7 +1054,7 @@ 40 E0 ENDCHAR -STARTCHAR 0x10C2 +STARTCHAR uni10C2 ENCODING 4290 SWIDTH 420 0 DWIDTH 7 0 @@ -833,7 +1067,7 @@ 84 78 ENDCHAR -STARTCHAR 0x10C3 +STARTCHAR uni10C3 ENCODING 4291 SWIDTH 480 0 DWIDTH 8 0 @@ -853,7 +1087,7 @@ 04 0E ENDCHAR -STARTCHAR 0x10C4 +STARTCHAR uni10C4 ENCODING 4292 SWIDTH 540 0 DWIDTH 9 0 @@ -869,7 +1103,7 @@ 0800 1C00 ENDCHAR -STARTCHAR 0x10C5 +STARTCHAR uni10C5 ENCODING 4293 SWIDTH 600 0 DWIDTH 10 0 @@ -887,7 +1121,7 @@ 8900 7180 ENDCHAR -STARTCHAR 0x10C6 +STARTCHAR uni10C6 ENCODING 4294 SWIDTH 600 0 DWIDTH 10 0 @@ -906,7 +1140,7 @@ 0800 1C00 ENDCHAR -STARTCHAR 0x10D0 +STARTCHAR uni10D0 ENCODING 4304 SWIDTH 420 0 DWIDTH 7 0 @@ -924,7 +1158,7 @@ 84 78 ENDCHAR -STARTCHAR 0x10D1 +STARTCHAR uni10D1 ENCODING 4305 SWIDTH 480 0 DWIDTH 8 0 @@ -943,7 +1177,7 @@ 44 38 ENDCHAR -STARTCHAR 0x10D2 +STARTCHAR uni10D2 ENCODING 4306 SWIDTH 540 0 DWIDTH 9 0 @@ -962,7 +1196,7 @@ 22 1C ENDCHAR -STARTCHAR 0x10D3 +STARTCHAR uni10D3 ENCODING 4307 SWIDTH 660 0 DWIDTH 11 0 @@ -981,7 +1215,7 @@ 0080 0040 ENDCHAR -STARTCHAR 0x10D4 +STARTCHAR uni10D4 ENCODING 4308 SWIDTH 420 0 DWIDTH 7 0 @@ -1000,7 +1234,7 @@ 84 78 ENDCHAR -STARTCHAR 0x10D5 +STARTCHAR uni10D5 ENCODING 4309 SWIDTH 420 0 DWIDTH 7 0 @@ -1019,7 +1253,7 @@ 84 78 ENDCHAR -STARTCHAR 0x10D6 +STARTCHAR uni10D6 ENCODING 4310 SWIDTH 720 0 DWIDTH 12 0 @@ -1039,7 +1273,7 @@ 0440 0380 ENDCHAR -STARTCHAR 0x10D7 +STARTCHAR uni10D7 ENCODING 4311 SWIDTH 840 0 DWIDTH 14 0 @@ -1058,7 +1292,7 @@ 4410 3820 ENDCHAR -STARTCHAR 0x10D8 +STARTCHAR uni10D8 ENCODING 4312 SWIDTH 480 0 DWIDTH 8 0 @@ -1077,7 +1311,7 @@ 44 28 ENDCHAR -STARTCHAR 0x10D9 +STARTCHAR uni10D9 ENCODING 4313 SWIDTH 420 0 DWIDTH 7 0 @@ -1096,7 +1330,7 @@ 84 78 ENDCHAR -STARTCHAR 0x10DA +STARTCHAR uni10DA ENCODING 4314 SWIDTH 840 0 DWIDTH 14 0 @@ -1115,7 +1349,7 @@ 0020 0010 ENDCHAR -STARTCHAR 0x10DB +STARTCHAR uni10DB ENCODING 4315 SWIDTH 420 0 DWIDTH 7 0 @@ -1134,7 +1368,7 @@ 84 78 ENDCHAR -STARTCHAR 0x10DC +STARTCHAR uni10DC ENCODING 4316 SWIDTH 420 0 DWIDTH 7 0 @@ -1153,7 +1387,7 @@ 84 78 ENDCHAR -STARTCHAR 0x10DD +STARTCHAR uni10DD ENCODING 4317 SWIDTH 600 0 DWIDTH 10 0 @@ -1172,7 +1406,7 @@ C180 4100 ENDCHAR -STARTCHAR 0x10DE +STARTCHAR uni10DE ENCODING 4318 SWIDTH 420 0 DWIDTH 7 0 @@ -1191,7 +1425,7 @@ 84 78 ENDCHAR -STARTCHAR 0x10DF +STARTCHAR uni10DF ENCODING 4319 SWIDTH 420 0 DWIDTH 7 0 @@ -1210,7 +1444,7 @@ 84 78 ENDCHAR -STARTCHAR 0x10E0 +STARTCHAR uni10E0 ENCODING 4320 SWIDTH 600 0 DWIDTH 10 0 @@ -1229,7 +1463,7 @@ 8080 C180 ENDCHAR -STARTCHAR 0x10E1 +STARTCHAR uni10E1 ENCODING 4321 SWIDTH 420 0 DWIDTH 7 0 @@ -1248,7 +1482,7 @@ 84 78 ENDCHAR -STARTCHAR 0x10E2 +STARTCHAR uni10E2 ENCODING 4322 SWIDTH 600 0 DWIDTH 10 0 @@ -1267,7 +1501,7 @@ 4100 3E00 ENDCHAR -STARTCHAR 0x10E3 +STARTCHAR uni10E3 ENCODING 4323 SWIDTH 660 0 DWIDTH 11 0 @@ -1286,7 +1520,7 @@ 0880 0700 ENDCHAR -STARTCHAR 0x10E4 +STARTCHAR uni10E4 ENCODING 4324 SWIDTH 600 0 DWIDTH 10 0 @@ -1305,7 +1539,7 @@ 1100 0E00 ENDCHAR -STARTCHAR 0x10E5 +STARTCHAR uni10E5 ENCODING 4325 SWIDTH 420 0 DWIDTH 7 0 @@ -1324,7 +1558,7 @@ 84 78 ENDCHAR -STARTCHAR 0x10E6 +STARTCHAR uni10E6 ENCODING 4326 SWIDTH 600 0 DWIDTH 10 0 @@ -1343,7 +1577,7 @@ 0100 0080 ENDCHAR -STARTCHAR 0x10E7 +STARTCHAR uni10E7 ENCODING 4327 SWIDTH 420 0 DWIDTH 7 0 @@ -1362,7 +1596,7 @@ 84 78 ENDCHAR -STARTCHAR 0x10E8 +STARTCHAR uni10E8 ENCODING 4328 SWIDTH 480 0 DWIDTH 8 0 @@ -1381,7 +1615,7 @@ 42 3C ENDCHAR -STARTCHAR 0x10E9 +STARTCHAR uni10E9 ENCODING 4329 SWIDTH 420 0 DWIDTH 7 0 @@ -1400,7 +1634,7 @@ 84 88 ENDCHAR -STARTCHAR 0x10EA +STARTCHAR uni10EA ENCODING 4330 SWIDTH 480 0 DWIDTH 8 0 @@ -1419,7 +1653,7 @@ 44 38 ENDCHAR -STARTCHAR 0x10EB +STARTCHAR uni10EB ENCODING 4331 SWIDTH 420 0 DWIDTH 7 0 @@ -1438,7 +1672,7 @@ 84 78 ENDCHAR -STARTCHAR 0x10EC +STARTCHAR uni10EC ENCODING 4332 SWIDTH 480 0 DWIDTH 8 0 @@ -1457,7 +1691,7 @@ 10 10 ENDCHAR -STARTCHAR 0x10ED +STARTCHAR uni10ED ENCODING 4333 SWIDTH 540 0 DWIDTH 9 0 @@ -1476,7 +1710,7 @@ 84 78 ENDCHAR -STARTCHAR 0x10EE +STARTCHAR uni10EE ENCODING 4334 SWIDTH 540 0 DWIDTH 9 0 @@ -1494,7 +1728,7 @@ 21 1E ENDCHAR -STARTCHAR 0x10EF +STARTCHAR uni10EF ENCODING 4335 SWIDTH 780 0 DWIDTH 13 0 @@ -1513,7 +1747,7 @@ 90E0 6000 ENDCHAR -STARTCHAR 0x10F0 +STARTCHAR uni10F0 ENCODING 4336 SWIDTH 420 0 DWIDTH 7 0 @@ -1532,7 +1766,7 @@ 84 78 ENDCHAR -STARTCHAR 0x10F1 +STARTCHAR uni10F1 ENCODING 4337 SWIDTH 480 0 DWIDTH 8 0 @@ -1551,7 +1785,7 @@ 42 3C ENDCHAR -STARTCHAR 0x10F2 +STARTCHAR uni10F2 ENCODING 4338 SWIDTH 420 0 DWIDTH 7 0 @@ -1570,7 +1804,7 @@ 48 FC ENDCHAR -STARTCHAR 0x10F3 +STARTCHAR uni10F3 ENCODING 4339 SWIDTH 420 0 DWIDTH 7 0 @@ -1589,7 +1823,7 @@ 84 78 ENDCHAR -STARTCHAR 0x10F4 +STARTCHAR uni10F4 ENCODING 4340 SWIDTH 420 0 DWIDTH 7 0 @@ -1609,7 +1843,7 @@ 84 78 ENDCHAR -STARTCHAR 0x10F5 +STARTCHAR uni10F5 ENCODING 4341 SWIDTH 480 0 DWIDTH 8 0 @@ -1629,7 +1863,7 @@ 84 78 ENDCHAR -STARTCHAR 0x1F06 +STARTCHAR uni1F06 ENCODING 7942 SWIDTH 480 0 DWIDTH 8 0 @@ -1650,7 +1884,7 @@ 98 66 ENDCHAR -STARTCHAR 0x1F07 +STARTCHAR uni1F07 ENCODING 7943 SWIDTH 480 0 DWIDTH 8 0 @@ -1671,7 +1905,7 @@ 98 66 ENDCHAR -STARTCHAR 0x1F0E +STARTCHAR uni1F0E ENCODING 7950 SWIDTH 720 0 DWIDTH 12 0 @@ -1693,7 +1927,7 @@ 1040 78F0 ENDCHAR -STARTCHAR 0x1F0F +STARTCHAR uni1F0F ENCODING 7951 SWIDTH 720 0 DWIDTH 12 0 @@ -1715,7 +1949,7 @@ 1040 78F0 ENDCHAR -STARTCHAR 0x1F26 +STARTCHAR uni1F26 ENCODING 7974 SWIDTH 420 0 DWIDTH 7 0 @@ -1740,7 +1974,7 @@ 04 04 ENDCHAR -STARTCHAR 0x1F27 +STARTCHAR uni1F27 ENCODING 7975 SWIDTH 420 0 DWIDTH 7 0 @@ -1765,7 +1999,7 @@ 04 04 ENDCHAR -STARTCHAR 0x1F2E +STARTCHAR uni1F2E ENCODING 7982 SWIDTH 1020 0 DWIDTH 17 0 @@ -1787,7 +2021,7 @@ 0104 07DF ENDCHAR -STARTCHAR 0x1F2F +STARTCHAR uni1F2F ENCODING 7983 SWIDTH 1020 0 DWIDTH 17 0 @@ -1809,7 +2043,7 @@ 0104 07DF ENDCHAR -STARTCHAR 0x1F36 +STARTCHAR uni1F36 ENCODING 7990 SWIDTH 360 0 DWIDTH 6 0 @@ -1830,7 +2064,7 @@ 28 10 ENDCHAR -STARTCHAR 0x1F37 +STARTCHAR uni1F37 ENCODING 7991 SWIDTH 360 0 DWIDTH 6 0 @@ -1851,7 +2085,7 @@ 28 10 ENDCHAR -STARTCHAR 0x1F3E +STARTCHAR uni1F3E ENCODING 7998 SWIDTH 660 0 DWIDTH 11 0 @@ -1873,7 +2107,7 @@ 0100 07C0 ENDCHAR -STARTCHAR 0x1F3F +STARTCHAR uni1F3F ENCODING 7999 SWIDTH 660 0 DWIDTH 11 0 @@ -1895,7 +2129,7 @@ 0100 07C0 ENDCHAR -STARTCHAR 0x1F56 +STARTCHAR uni1F56 ENCODING 8022 SWIDTH 420 0 DWIDTH 7 0 @@ -1916,7 +2150,7 @@ 48 30 ENDCHAR -STARTCHAR 0x1F57 +STARTCHAR uni1F57 ENCODING 8023 SWIDTH 420 0 DWIDTH 7 0 @@ -1937,7 +2171,7 @@ 48 30 ENDCHAR -STARTCHAR 0x1F5F +STARTCHAR uni1F5F ENCODING 8031 SWIDTH 960 0 DWIDTH 16 0 @@ -1958,7 +2192,7 @@ 0040 01F0 ENDCHAR -STARTCHAR 0x1F66 +STARTCHAR uni1F66 ENCODING 8038 SWIDTH 600 0 DWIDTH 10 0 @@ -1979,7 +2213,7 @@ 8880 7700 ENDCHAR -STARTCHAR 0x1F67 +STARTCHAR uni1F67 ENCODING 8039 SWIDTH 600 0 DWIDTH 10 0 @@ -2000,7 +2234,7 @@ 8880 7700 ENDCHAR -STARTCHAR 0x1F6E +STARTCHAR uni1F6E ENCODING 8046 SWIDTH 840 0 DWIDTH 14 0 @@ -2022,7 +2256,7 @@ 0A28 0E38 ENDCHAR -STARTCHAR 0x1F6F +STARTCHAR uni1F6F ENCODING 8047 SWIDTH 840 0 DWIDTH 14 0 @@ -2044,7 +2278,7 @@ 0A28 0E38 ENDCHAR -STARTCHAR 0x1F86 +STARTCHAR uni1F86 ENCODING 8070 SWIDTH 480 0 DWIDTH 8 0 @@ -2070,7 +2304,7 @@ 28 10 ENDCHAR -STARTCHAR 0x1F87 +STARTCHAR uni1F87 ENCODING 8071 SWIDTH 480 0 DWIDTH 8 0 @@ -2096,7 +2330,7 @@ 28 10 ENDCHAR -STARTCHAR 0x1F8E +STARTCHAR uni1F8E ENCODING 8078 SWIDTH 720 0 DWIDTH 12 0 @@ -2122,7 +2356,7 @@ 0280 0100 ENDCHAR -STARTCHAR 0x1F8F +STARTCHAR uni1F8F ENCODING 8079 SWIDTH 720 0 DWIDTH 12 0 @@ -2148,7 +2382,7 @@ 0280 0100 ENDCHAR -STARTCHAR 0x1F96 +STARTCHAR uni1F96 ENCODING 8086 SWIDTH 420 0 DWIDTH 7 0 @@ -2173,7 +2407,7 @@ 44 64 ENDCHAR -STARTCHAR 0x1F97 +STARTCHAR uni1F97 ENCODING 8087 SWIDTH 420 0 DWIDTH 7 0 @@ -2198,7 +2432,7 @@ 44 64 ENDCHAR -STARTCHAR 0x1F9E +STARTCHAR uni1F9E ENCODING 8094 SWIDTH 1020 0 DWIDTH 17 0 @@ -2225,7 +2459,7 @@ 0050 0020 ENDCHAR -STARTCHAR 0x1F9F +STARTCHAR uni1F9F ENCODING 8095 SWIDTH 1020 0 DWIDTH 17 0 @@ -2252,7 +2486,7 @@ 0050 0020 ENDCHAR -STARTCHAR 0x1FA6 +STARTCHAR uni1FA6 ENCODING 8102 SWIDTH 600 0 DWIDTH 10 0 @@ -2278,7 +2512,7 @@ 0A00 0400 ENDCHAR -STARTCHAR 0x1FA7 +STARTCHAR uni1FA7 ENCODING 8103 SWIDTH 600 0 DWIDTH 10 0 @@ -2304,7 +2538,7 @@ 0A00 0400 ENDCHAR -STARTCHAR 0x1FAE +STARTCHAR uni1FAE ENCODING 8110 SWIDTH 840 0 DWIDTH 14 0 @@ -2330,7 +2564,7 @@ 00A0 0040 ENDCHAR -STARTCHAR 0x1FAF +STARTCHAR uni1FAF ENCODING 8111 SWIDTH 840 0 DWIDTH 14 0 @@ -2356,7 +2590,7 @@ 00A0 0040 ENDCHAR -STARTCHAR 0x1FB6 +STARTCHAR uni1FB6 ENCODING 8118 SWIDTH 480 0 DWIDTH 8 0 @@ -2373,7 +2607,7 @@ 98 66 ENDCHAR -STARTCHAR 0x1FB7 +STARTCHAR uni1FB7 ENCODING 8119 SWIDTH 480 0 DWIDTH 8 0 @@ -2395,7 +2629,7 @@ 28 10 ENDCHAR -STARTCHAR 0x1FC0 +STARTCHAR uni1FC0 ENCODING 8128 SWIDTH 420 0 DWIDTH 7 0 @@ -2404,7 +2638,7 @@ 78 84 ENDCHAR -STARTCHAR 0x1FC1 +STARTCHAR uni1FC1 ENCODING 8129 SWIDTH 360 0 DWIDTH 6 0 @@ -2416,7 +2650,7 @@ D8 D8 ENDCHAR -STARTCHAR 0x1FC6 +STARTCHAR uni1FC6 ENCODING 8134 SWIDTH 420 0 DWIDTH 7 0 @@ -2437,7 +2671,7 @@ 04 04 ENDCHAR -STARTCHAR 0x1FC7 +STARTCHAR uni1FC7 ENCODING 8135 SWIDTH 420 0 DWIDTH 7 0 @@ -2458,7 +2692,7 @@ 44 64 ENDCHAR -STARTCHAR 0x1FCF +STARTCHAR uni1FCF ENCODING 8143 SWIDTH 420 0 DWIDTH 7 0 @@ -2471,7 +2705,7 @@ 10 20 ENDCHAR -STARTCHAR 0x1FD6 +STARTCHAR uni1FD6 ENCODING 8150 SWIDTH 300 0 DWIDTH 5 0 @@ -2488,7 +2722,7 @@ 28 10 ENDCHAR -STARTCHAR 0x1FD7 +STARTCHAR uni1FD7 ENCODING 8151 SWIDTH 300 0 DWIDTH 5 0 @@ -2509,7 +2743,7 @@ 28 10 ENDCHAR -STARTCHAR 0x1FDF +STARTCHAR uni1FDF ENCODING 8159 SWIDTH 420 0 DWIDTH 7 0 @@ -2522,7 +2756,7 @@ 20 10 ENDCHAR -STARTCHAR 0x1FE6 +STARTCHAR uni1FE6 ENCODING 8166 SWIDTH 420 0 DWIDTH 7 0 @@ -2540,7 +2774,7 @@ 48 30 ENDCHAR -STARTCHAR 0x1FE7 +STARTCHAR uni1FE7 ENCODING 8167 SWIDTH 420 0 DWIDTH 7 0 @@ -2561,7 +2795,7 @@ 48 30 ENDCHAR -STARTCHAR 0x1FF6 +STARTCHAR uni1FF6 ENCODING 8182 SWIDTH 600 0 DWIDTH 10 0 @@ -2578,7 +2812,7 @@ 8880 7700 ENDCHAR -STARTCHAR 0x1FF7 +STARTCHAR uni1FF7 ENCODING 8183 SWIDTH 600 0 DWIDTH 10 0 @@ -2600,7 +2834,31 @@ 0A00 0400 ENDCHAR -STARTCHAR 0x20A3 +STARTCHAR uni204C +ENCODING 8268 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 8 5 1 3 +BITMAP +3D +7D +FD +7D +3D +ENDCHAR +STARTCHAR uni204D +ENCODING 8269 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 8 5 1 3 +BITMAP +BC +BE +BF +BE +BC +ENDCHAR +STARTCHAR uni20A3 ENCODING 8355 SWIDTH 600 0 DWIDTH 10 0 @@ -2617,8 +2875,27 @@ 2000 2000 F800 +ENDCHAR +STARTCHAR uni20AF +ENCODING 8367 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 9 12 2 0 +BITMAP +0400 +0800 +3E00 +4900 +1080 +1080 +1080 +2080 +2080 +6080 +B100 +4E00 ENDCHAR -STARTCHAR 0x2116 +STARTCHAR uni2116 ENCODING 8470 SWIDTH 1080 0 DWIDTH 18 0 @@ -2636,7 +2913,7 @@ 2180 F880 ENDCHAR -STARTCHAR 0xF0C6 +STARTCHAR uniF0C6 ENCODING 61638 SWIDTH 720 0 DWIDTH 12 0 @@ -2656,7 +2933,7 @@ 0420 03C0 ENDCHAR -STARTCHAR 0xF0F7 +STARTCHAR uniF0F7 ENCODING 61687 SWIDTH 420 0 DWIDTH 7 0 @@ -2675,7 +2952,7 @@ 84 78 ENDCHAR -STARTCHAR 0xF0F8 +STARTCHAR uniF0F8 ENCODING 61688 SWIDTH 420 0 DWIDTH 7 0 @@ -2694,38 +2971,39 @@ 84 78 ENDCHAR -STARTCHAR 0xFBA8 +STARTCHAR uniFBA8 ENCODING 64424 -SWIDTH 240 0 -DWIDTH 4 0 -BBX 4 10 0 -5 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 7 10 0 -4 BITMAP 10 10 10 10 10 -E0 +EE 00 10 20 30 ENDCHAR -STARTCHAR 0xFEEC +STARTCHAR uniFEEC ENCODING 65260 SWIDTH 360 0 DWIDTH 6 0 -BBX 6 7 0 -6 +BBX 6 8 0 -6 BITMAP 40 CC 30 20 20 -20 -20 +24 +28 +0C ENDCHAR -STARTCHAR 0xFFFD +STARTCHAR uniFFFD ENCODING 65533 SWIDTH 960 0 DWIDTH 16 0 @@ -2747,7 +3025,7 @@ 0380 0100 ENDCHAR -STARTCHAR C072 +STARTCHAR uniFFFE ENCODING 65534 SWIDTH 600 0 DWIDTH 10 0 Index: xc/extras/fonts/ClearlyU/cu-arabic12.bdf diff -u xc/extras/fonts/ClearlyU/cu-arabic12.bdf:1.2 xc/extras/fonts/ClearlyU/cu-arabic12.bdf:1.3 --- xc/extras/fonts/ClearlyU/cu-arabic12.bdf:1.2 Sun Apr 25 06:01:03 1999 +++ xc/extras/fonts/ClearlyU/cu-arabic12.bdf Thu Dec 7 13:47:04 2000 @@ -1,6 +1,6 @@ STARTFONT 2.1 COMMENT -COMMENT From: Id: cu-arabic12.bdf,v 1.4 1999/04/22 18:39:51 mleisher Exp $ +COMMENT Id: cu-arabic12.bdf,v 1.5 2000/12/06 21:58:14 mleisher Exp $ COMMENT COMMENT Copyright 1997, 1998, 1999 Computing Research Labs, New Mexico State COMMENT University @@ -31,8 +31,8 @@ COMMENT FONT -MUTT-ClearlyU Arabic Extra-Medium-R-Normal--17-120-100-100-P-103-FontSpecific-0 SIZE 12 100 100 -FONTBOUNDINGBOX 22 26 -1 -9 -STARTPROPERTIES 20 +FONTBOUNDINGBOX 21 29 -1 -10 +STARTPROPERTIES 19 POINT_SIZE 120 PIXEL_SIZE 17 RESOLUTION_X 100 @@ -49,17 +49,16 @@ ADD_STYLE_NAME "" CHARSET_REGISTRY "FontSpecific" CHARSET_ENCODING "0" -_XMBDFED_INFO "Edited with xmbdfed 3.5." +_XMBDFED_INFO "Edited with xmbdfed 4.3." CAP_HEIGHT 11 X_HEIGHT 7 -_XFREE86_GLYPH_RANGES "0_178 208_213 240 244" ENDPROPERTIES -CHARS 187 -STARTCHAR 0x0000 +CHARS 198 +STARTCHAR uni0000 ENCODING 0 SWIDTH 300 0 DWIDTH 5 0 -BBX 5 16 -1 0 +BBX 5 15 -1 0 BITMAP 18 20 @@ -67,7 +66,6 @@ E0 00 10 -10 18 10 10 @@ -78,11 +76,11 @@ 10 10 ENDCHAR -STARTCHAR 0x0001 +STARTCHAR uni0001 ENCODING 1 -SWIDTH 360 0 -DWIDTH 6 0 -BBX 7 18 -1 -1 +SWIDTH 300 0 +DWIDTH 5 0 +BBX 6 16 -1 0 BITMAP 18 20 @@ -91,7 +89,6 @@ 00 00 10 -10 18 10 10 @@ -100,17 +97,15 @@ 10 10 10 -10 -0E +0C ENDCHAR -STARTCHAR 0x0002 +STARTCHAR uni0002 ENCODING 2 SWIDTH 300 0 DWIDTH 5 0 -BBX 5 16 -1 -5 +BBX 5 15 -1 -5 BITMAP 10 -10 18 10 10 @@ -126,14 +121,13 @@ 18 E0 ENDCHAR -STARTCHAR 0x0003 +STARTCHAR uni0003 ENCODING 3 -SWIDTH 360 0 -DWIDTH 6 0 -BBX 7 17 -1 -6 +SWIDTH 300 0 +DWIDTH 5 0 +BBX 6 16 -1 -6 BITMAP 10 -10 18 10 10 @@ -141,16 +135,16 @@ 10 10 10 -10 10 -0E +0C 00 +00 18 20 18 E0 ENDCHAR -STARTCHAR 0x0004 +STARTCHAR uni0004 ENCODING 4 SWIDTH 360 0 DWIDTH 6 0 @@ -158,7 +152,7 @@ BITMAP 0C 10 -8C +0C 90 C0 80 @@ -170,11 +164,11 @@ 80 80 ENDCHAR -STARTCHAR 0x0005 +STARTCHAR uni0005 ENCODING 5 SWIDTH 360 0 DWIDTH 6 0 -BBX 6 14 2 -1 +BBX 6 13 2 0 BITMAP 0C 10 @@ -188,19 +182,20 @@ 80 80 80 -80 -70 +60 ENDCHAR -STARTCHAR 0x0006 +STARTCHAR uni0006 ENCODING 6 SWIDTH 540 0 DWIDTH 9 0 -BBX 10 12 -1 -3 +BBX 9 14 0 -3 BITMAP -00C0 -0100 -00C0 -0100 +0180 +0200 +0180 +0200 +0000 +0000 0400 0A00 0A00 @@ -210,635 +205,638 @@ 8400 7800 ENDCHAR -STARTCHAR 0x0007 +STARTCHAR uni0007 ENCODING 7 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 10 12 1 -3 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 14 1 -4 BITMAP -00C0 -0100 -00C0 -0100 +0180 +0200 +0180 +0200 +0000 +0000 0400 0A00 0A00 -0E00 -0300 -0280 +0780 +0200 +0200 8400 7800 ENDCHAR -STARTCHAR 0x0008 +STARTCHAR uni0008 ENCODING 8 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 13 13 0 -3 +SWIDTH 840 0 +DWIDTH 14 0 +BBX 13 14 1 -2 BITMAP 0018 0020 0018 0020 0000 -01C0 +0000 +01E0 +0200 4200 -4400 -8700 -8080 -8080 -8300 -7C00 +8180 +8040 +8040 +4180 +3E00 ENDCHAR -STARTCHAR 0x0009 +STARTCHAR uni0009 ENCODING 9 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 10 10 1 -5 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 13 12 1 -5 BITMAP -00C0 -0100 -00C0 -0100 +0018 +0020 +0018 +0020 0000 -41C0 -8300 -8080 -8300 -7C00 +0000 +41E0 +8200 +8180 +8040 +4180 +3E00 ENDCHAR -STARTCHAR 0x000A +STARTCHAR uni000A ENCODING 10 -SWIDTH 360 0 -DWIDTH 6 0 -BBX 8 10 0 -1 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 7 11 0 0 BITMAP -03 -04 -03 -04 -10 +06 +08 +06 08 +00 +00 +10 08 08 08 F0 ENDCHAR -STARTCHAR 0x000B +STARTCHAR uni000B ENCODING 11 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 7 10 0 -1 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 7 10 0 0 BITMAP 06 08 06 08 -20 -20 +00 +00 10 10 10 -FE +EC ENDCHAR -STARTCHAR 0x000C +STARTCHAR uni000C ENCODING 12 -SWIDTH 840 0 -DWIDTH 14 0 -BBX 12 12 0 -4 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 13 11 0 -4 BITMAP -0A00 -0A00 -0000 -0020 -8010 -8010 -8010 -4060 -3F80 +0500 +0500 +0008 +4008 +8008 +8008 +C030 +7FC0 0600 0900 0600 ENDCHAR -STARTCHAR 0x000D +STARTCHAR uni000D ENCODING 13 SWIDTH 900 0 DWIDTH 15 0 -BBX 14 12 1 -4 +BBX 15 11 1 -4 BITMAP -0A00 -0A00 +0500 +0500 0000 -0020 -8020 +4000 8010 8010 -4070 -3F8C +C06E +7F80 0600 0900 0600 ENDCHAR -STARTCHAR 0x000E +STARTCHAR uni000E ENCODING 14 SWIDTH 360 0 DWIDTH 6 0 -BBX 5 13 0 -4 +BBX 5 11 0 -3 BITMAP 28 28 00 -00 10 08 08 08 -08 F0 60 90 60 ENDCHAR -STARTCHAR 0x000F +STARTCHAR uni000F ENCODING 15 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 7 13 0 -4 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 6 10 0 -3 BITMAP -50 -50 -00 +28 +28 00 -20 -20 10 10 10 -EE +EC 60 90 60 ENDCHAR -STARTCHAR 0x0010 +STARTCHAR uni0010 ENCODING 16 SWIDTH 840 0 DWIDTH 14 0 -BBX 12 9 0 -1 +BBX 13 10 1 -1 BITMAP -0A00 -0A00 -0000 -0420 -8410 -8010 -8010 -4060 -3F80 +0500 +0500 +0200 +0200 +0008 +4008 +8008 +8008 +C030 +7FC0 ENDCHAR -STARTCHAR 0x0011 +STARTCHAR uni0011 ENCODING 17 SWIDTH 900 0 DWIDTH 15 0 -BBX 14 12 1 -1 +BBX 15 10 1 -1 BITMAP -0A00 -0A00 -0000 -0400 -0400 +0500 +0500 +0200 +0200 0000 -0020 -8020 +4000 8010 8010 -4070 -3F8C +C06E +7F80 ENDCHAR -STARTCHAR 0x0012 +STARTCHAR uni0012 ENCODING 18 SWIDTH 360 0 DWIDTH 6 0 -BBX 5 13 0 -1 +BBX 5 10 0 0 BITMAP 28 28 -00 10 10 00 -00 10 08 08 08 -08 F0 ENDCHAR -STARTCHAR 0x0013 +STARTCHAR uni0013 ENCODING 19 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 7 13 0 -1 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 6 10 0 0 BITMAP -50 -50 -00 -20 -20 +28 +28 +10 +10 00 00 -20 -20 10 10 10 -EE +EC ENDCHAR -STARTCHAR 0x0014 +STARTCHAR uni0014 ENCODING 20 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 8 16 1 -6 -BITMAP -18 -20 -18 -20 -00 -7E -B0 -40 -C0 -80 -80 -80 -80 -C0 -61 -3E -ENDCHAR -STARTCHAR 0x0015 -ENCODING 21 SWIDTH 660 0 DWIDTH 11 0 -BBX 10 15 1 -6 +BBX 10 17 1 -6 BITMAP -1800 -2000 -1800 -2000 +0C00 +1000 +0C00 +1000 0000 -7F00 -B200 -4200 -C200 -81C0 +0000 +7000 +8F00 +3800 +4000 +4000 8000 8000 -C000 -6100 -3E00 +8000 +4000 +60C0 +1F00 ENDCHAR -STARTCHAR 0x0016 -ENCODING 22 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 10 11 0 -1 +STARTCHAR uni0015 +ENCODING 21 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 10 17 1 -6 BITMAP -1800 -2000 -1800 -2000 +0600 +0800 +0600 +0800 0000 -1800 -2400 -4200 -0100 -0080 -FFC0 -ENDCHAR -STARTCHAR 0x0017 -ENCODING 23 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 11 11 0 -1 -BITMAP -1800 -2000 -1800 -2000 0000 -1800 -2400 +7000 +8F00 +3A00 4200 -0100 -0080 -FFE0 +41C0 +8000 +8000 +8000 +4000 +60C0 +1F00 ENDCHAR -STARTCHAR 0x0018 -ENCODING 24 +STARTCHAR uni0016 +ENCODING 22 SWIDTH 600 0 DWIDTH 10 0 -BBX 8 18 1 -6 +BBX 9 11 0 0 BITMAP -10 -10 -00 -10 -10 -00 -00 -7E -B0 -40 -C0 -80 -80 -80 -80 -C0 -61 -3E +0300 +0400 +0300 +0400 +0000 +0000 +3800 +4780 +0C00 +1000 +E000 ENDCHAR -STARTCHAR 0x0019 -ENCODING 25 +STARTCHAR uni0017 +ENCODING 23 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 10 11 0 0 +BITMAP +0300 +0400 +0300 +0400 +0000 +0000 +3800 +4780 +0D00 +1100 +E0C0 +ENDCHAR +STARTCHAR uni0018 +ENCODING 24 SWIDTH 660 0 DWIDTH 11 0 -BBX 10 16 1 -6 +BBX 10 18 1 -6 BITMAP -1000 -1000 +0800 +0800 0000 -1000 -1000 +0800 +0800 0000 -7F00 -B200 -4200 -C200 -81C0 +0000 +7000 +8F00 +3800 +4000 +4000 8000 8000 -C000 -6100 -3E00 +8000 +4000 +60C0 +1F00 ENDCHAR -STARTCHAR 0x001A -ENCODING 26 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 10 12 0 -1 +STARTCHAR uni0019 +ENCODING 25 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 10 18 1 -6 BITMAP -1000 -1000 +0800 +0800 0000 -1000 -1000 +0800 +0800 0000 -1800 -2400 +0000 +7000 +8F00 +3A00 4200 -0100 -0080 -FFC0 +41C0 +8000 +8000 +8000 +4000 +60C0 +1F00 ENDCHAR -STARTCHAR 0x001B -ENCODING 27 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 11 12 0 -1 +STARTCHAR uni001A +ENCODING 26 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 12 0 0 BITMAP -1000 -1000 +0400 +0400 0000 -1000 -1000 +0400 +0400 0000 -1800 -2400 -4200 -0100 -0080 -FFE0 +0000 +3800 +4780 +0C00 +1000 +E000 ENDCHAR -STARTCHAR 0x001C -ENCODING 28 +STARTCHAR uni001B +ENCODING 27 SWIDTH 600 0 DWIDTH 10 0 -BBX 8 18 1 -6 +BBX 10 12 0 0 BITMAP -10 -10 -00 -28 -28 -00 -00 -7E -B0 -40 -C0 -80 -80 -80 -80 -C0 -61 -3E +0400 +0400 +0000 +0400 +0400 +0000 +0000 +3800 +4780 +0D00 +1100 +E0C0 ENDCHAR -STARTCHAR 0x001D -ENCODING 29 +STARTCHAR uni001C +ENCODING 28 SWIDTH 660 0 DWIDTH 11 0 -BBX 10 16 1 -6 +BBX 10 17 1 -6 BITMAP -1000 -1000 +0800 +0800 +1400 +1400 0000 -2800 -2800 +0000 +7000 +8F00 +3800 +4000 +4000 +8000 +8000 +8000 +4000 +60C0 +1F00 +ENDCHAR +STARTCHAR uni001D +ENCODING 29 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 10 17 1 -6 +BITMAP +0800 +0800 +1400 +1400 +0000 0000 -7F00 -B200 +7000 +8F00 +3A00 4200 -C200 -81C0 +41C0 8000 8000 -C000 -6100 -3E00 +8000 +4000 +60C0 +1F00 ENDCHAR -STARTCHAR 0x001E +STARTCHAR uni001E ENCODING 30 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 10 12 0 -1 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 11 0 0 BITMAP -1000 -1000 +0400 +0400 +0A00 +0A00 0000 -2800 -2800 0000 -1800 -2400 -4200 -0100 -0080 -FFC0 +3800 +4780 +0C00 +1000 +E000 ENDCHAR -STARTCHAR 0x001F +STARTCHAR uni001F ENCODING 31 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 11 12 0 -1 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 10 11 0 0 BITMAP -1000 -1000 +0400 +0400 +0A00 +0A00 0000 -2800 -2800 0000 -1800 -2400 -4200 -0100 -0080 -FFE0 +3800 +4780 +0D00 +1100 +E0C0 ENDCHAR -STARTCHAR 0x0020 +STARTCHAR uni0020 ENCODING 32 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 5 8 0 -3 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 9 1 -3 BITMAP -10 +20 10 08 08 -88 -78 -28 -10 +08 +F0 +20 +50 +20 ENDCHAR -STARTCHAR 0x0021 +STARTCHAR uni0021 ENCODING 33 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 8 1 -3 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 7 9 1 -2 BITMAP 10 10 08 08 -8C -7A -28 -10 +08 +98 +66 +50 +20 ENDCHAR -STARTCHAR 0x0022 +STARTCHAR uni0022 ENCODING 34 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 5 9 0 -4 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 10 1 -4 BITMAP -10 +20 10 08 08 -88 -78 +08 +F0 00 -10 -10 +00 +20 +20 ENDCHAR -STARTCHAR 0x0023 +STARTCHAR uni0023 ENCODING 35 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 9 1 -4 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 7 11 1 -4 BITMAP 10 10 08 08 -8C -7A +08 +98 +66 00 -10 -10 +00 +20 +20 ENDCHAR -STARTCHAR 0x0024 +STARTCHAR uni0024 ENCODING 36 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 5 14 0 -4 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 16 1 -4 BITMAP -20 -20 -38 -38 +40 +40 +70 +70 00 -10 +00 +20 10 08 08 -88 -78 +08 +F0 00 -18 -18 +00 +20 +20 ENDCHAR -STARTCHAR 0x0025 +STARTCHAR uni0025 ENCODING 37 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 14 1 -4 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 7 17 1 -4 BITMAP -20 -20 -38 -38 +40 +40 +70 +70 +00 00 10 10 08 08 -8C -7A +08 +98 +66 00 -18 -18 +00 +20 +20 ENDCHAR -STARTCHAR 0x0026 +STARTCHAR uni0026 ENCODING 38 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 5 13 0 -1 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 12 1 0 BITMAP 50 50 -00 20 20 00 00 -10 +20 10 08 08 -88 -78 +08 +F0 ENDCHAR -STARTCHAR 0x0027 +STARTCHAR uni0027 ENCODING 39 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 13 1 -1 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 7 13 1 0 BITMAP 50 50 -00 20 20 00 @@ -847,14 +845,15 @@ 10 08 08 -8C -7A +08 +98 +66 ENDCHAR -STARTCHAR 0x0028 +STARTCHAR uni0028 ENCODING 40 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 5 13 0 -1 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 13 1 0 BITMAP 50 50 @@ -863,18 +862,18 @@ 50 00 00 -10 +20 10 08 08 -88 -78 +08 +F0 ENDCHAR -STARTCHAR 0x0029 +STARTCHAR uni0029 ENCODING 41 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 13 1 -1 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 7 14 1 0 BITMAP 50 50 @@ -887,825 +886,830 @@ 10 08 08 -8C -7A +08 +98 +66 ENDCHAR -STARTCHAR 0x002A +STARTCHAR uni002A ENCODING 42 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 7 12 0 -4 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 7 13 1 -4 BITMAP -12 -0C +22 +14 +08 00 00 +08 +08 04 -06 -02 -02 -02 04 -8C -78 +04 +0C +18 +F0 ENDCHAR -STARTCHAR 0x002B +STARTCHAR uni002B ENCODING 43 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 12 1 -4 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 8 13 1 -5 BITMAP -1200 -0C00 -0000 -0000 -0400 -0600 -0200 -0300 -0280 -0400 -8C00 -7800 +22 +14 +08 +00 +00 +08 +0C +07 +04 +04 +0C +18 +F0 ENDCHAR -STARTCHAR 0x002C +STARTCHAR uni002C ENCODING 44 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 7 9 0 -5 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 6 9 1 -5 BITMAP +08 +08 04 -06 -02 -02 -02 04 -8C -7A 04 +0C +18 +F4 +0C ENDCHAR -STARTCHAR 0x002D +STARTCHAR uni002D ENCODING 45 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 9 1 -5 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 8 9 1 -6 BITMAP -0400 -0600 -0200 -0300 -0280 -0400 -8C00 -7A00 -0400 +08 +0C +07 +04 +04 +0C +18 +F4 +0C ENDCHAR -STARTCHAR 0x002E +STARTCHAR uni002E ENCODING 46 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 7 10 0 -6 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 6 10 1 -6 BITMAP +08 +08 04 -06 -02 -02 -02 04 -8C -78 +04 +0C +18 +F0 04 04 ENDCHAR -STARTCHAR 0x002F +STARTCHAR uni002F ENCODING 47 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 10 1 -6 -BITMAP -0400 -0600 -0200 -0300 -0280 -0400 -8C00 -7800 -0400 -0400 -ENDCHAR -STARTCHAR 0x0030 -ENCODING 48 SWIDTH 540 0 DWIDTH 9 0 -BBX 7 11 0 -7 +BBX 8 10 1 -7 BITMAP +08 +0C +07 04 -06 -02 -02 -02 04 -8C -78 -00 -24 +0C 18 +F0 +04 +04 ENDCHAR -STARTCHAR 0x0031 -ENCODING 49 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 11 1 -7 +STARTCHAR uni0030 +ENCODING 48 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 6 12 1 -8 BITMAP -0400 -0600 -0200 -0300 -0280 -0400 -8C00 -7800 -0000 -2400 -1800 +08 +08 +04 +04 +04 +0C +18 +F0 +00 +44 +28 +10 ENDCHAR -STARTCHAR 0x0032 -ENCODING 50 +STARTCHAR uni0031 +ENCODING 49 SWIDTH 540 0 DWIDTH 9 0 -BBX 7 10 0 -6 +BBX 8 12 1 -9 BITMAP +08 +0C +07 04 -06 -02 -22 -22 04 -8C -78 +0C +18 +F0 +00 +44 +28 +10 +ENDCHAR +STARTCHAR uni0032 +ENCODING 50 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 6 10 1 -6 +BITMAP +08 +08 04 +44 +44 +0C +18 +F0 +04 04 ENDCHAR -STARTCHAR 0x0033 +STARTCHAR uni0033 ENCODING 51 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 10 1 -6 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 8 10 1 -7 BITMAP -0400 -0600 -0200 -2300 -2280 -0400 -8C00 -7800 -0400 -0400 +08 +0C +07 +44 +44 +0C +18 +F0 +04 +04 ENDCHAR -STARTCHAR 0x0034 +STARTCHAR uni0034 ENCODING 52 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 7 12 0 -4 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 6 12 1 -4 BITMAP -0A -0A +14 +14 00 00 +08 +08 04 -06 -02 -02 -02 04 -8C -78 +04 +0C +18 +F0 ENDCHAR -STARTCHAR 0x0035 +STARTCHAR uni0035 ENCODING 53 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 12 1 -4 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 8 12 1 -5 BITMAP -0A00 -0A00 -0000 -0000 -0400 -0600 -0200 -0300 -0280 -0400 -8C00 -7800 +14 +14 +00 +00 +08 +0C +07 +04 +04 +0C +18 +F0 ENDCHAR -STARTCHAR 0x0036 +STARTCHAR uni0036 ENCODING 54 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 7 15 0 -4 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 6 15 1 -4 BITMAP -0A -0A +14 +14 00 -0A -0A +14 +14 00 00 +08 +08 04 -06 -02 -02 -02 04 -8C -78 +04 +0C +18 +F0 ENDCHAR -STARTCHAR 0x0037 +STARTCHAR uni0037 ENCODING 55 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 15 1 -4 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 8 15 1 -5 BITMAP -0A00 -0A00 -0000 -0A00 -0A00 -0000 -0000 -0400 -0600 -0200 -0300 -0280 -0400 -8C00 -7800 +14 +14 +00 +14 +14 +00 +00 +08 +0C +07 +04 +04 +0C +18 +F0 ENDCHAR -STARTCHAR 0x0038 +STARTCHAR uni0038 ENCODING 56 SWIDTH 960 0 DWIDTH 16 0 -BBX 14 11 0 -5 +BBX 15 12 1 -5 BITMAP -0040 -0040 -0000 -0004 -4124 -8124 -81FC -8100 -4200 -3C10 0010 +0010 +0002 +0002 +0012 +0112 +40EC +8080 +8080 +8088 +4308 +3C00 ENDCHAR -STARTCHAR 0x0039 +STARTCHAR uni0039 ENCODING 57 -SWIDTH 960 0 -DWIDTH 16 0 -BBX 15 11 1 -5 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 17 11 1 -5 BITMAP -0040 -0040 -0000 -0004 -4124 -8124 -81FE -8100 -4200 -3C10 -0010 +001000 +001000 +000000 +000200 +011200 +40ED80 +808000 +808000 +808800 +430800 +3C0000 ENDCHAR -STARTCHAR 0x003A +STARTCHAR uni003A ENCODING 58 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 11 0 -5 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 11 11 0 -4 BITMAP -0800 -0800 +0100 +0100 0000 -0080 -2480 -2480 -FF80 +0020 +0120 +1120 +EEC0 0000 0000 -0200 -0200 +0080 +0080 ENDCHAR -STARTCHAR 0x003B +STARTCHAR uni003B ENCODING 59 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 10 11 0 -5 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 13 11 0 -4 BITMAP -0800 -0800 +0100 +0100 0000 -0080 -2480 -2480 -FFC0 0000 +0100 +1120 +EED8 0000 -0200 -0200 +0000 +0080 +0080 ENDCHAR -STARTCHAR 0x003C +STARTCHAR uni003C ENCODING 60 SWIDTH 960 0 DWIDTH 16 0 -BBX 14 11 0 -8 +BBX 15 10 1 -6 BITMAP -0004 -4124 -8124 -81FC -8100 -4200 -3C28 -0028 -0000 -0010 -0010 +0002 +0012 +0112 +40EC +8080 +8080 +8094 +4314 +3C08 +0008 ENDCHAR -STARTCHAR 0x003D +STARTCHAR uni003D ENCODING 61 -SWIDTH 960 0 -DWIDTH 16 0 -BBX 15 10 1 -7 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 17 9 1 -6 BITMAP -0004 -4124 -8124 -81FE -8100 -4250 -3C50 -0000 -0020 -0020 +000200 +011200 +40ED80 +808000 +808000 +809400 +431400 +3C0800 +000800 ENDCHAR -STARTCHAR 0x003E +STARTCHAR uni003E ENCODING 62 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 10 0 -7 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 11 10 0 -6 BITMAP -0080 -2480 -2480 -FF80 +0020 +0120 +1120 +EEC0 0000 -0A00 -0A00 0000 -0400 -0400 +0280 +0280 +0100 +0100 ENDCHAR -STARTCHAR 0x003F +STARTCHAR uni003F ENCODING 63 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 10 10 0 -7 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 13 9 0 -6 BITMAP -0080 -2480 -2480 -FFC0 +0100 +1120 +EED8 0000 -0A00 -0A00 0000 -0400 -0400 +0280 +0280 +0100 +0100 ENDCHAR -STARTCHAR 0x0040 +STARTCHAR uni0040 ENCODING 64 SWIDTH 960 0 DWIDTH 16 0 -BBX 14 17 0 -8 +BBX 15 15 1 -6 BITMAP -0020 -0020 -0000 -0050 -0050 -0000 -0004 -4124 -8124 -81FC -8100 -4200 -3C28 -0028 -0000 0010 0010 +0028 +0028 +0000 +0002 +0012 +0112 +40EC +8080 +8080 +8094 +4314 +3C08 +0008 ENDCHAR -STARTCHAR 0x0041 +STARTCHAR uni0041 ENCODING 65 -SWIDTH 960 0 -DWIDTH 16 0 -BBX 15 16 1 -7 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 17 14 1 -6 BITMAP -0020 -0020 -0000 -0050 -0050 -0000 -0004 -4124 -8124 -81FE -8100 -4250 -3C50 -0000 -0020 -0020 +001000 +001000 +002800 +002800 +000000 +000200 +011200 +40ED80 +808000 +808000 +809400 +431400 +3C0800 +000800 ENDCHAR -STARTCHAR 0x0042 +STARTCHAR uni0042 ENCODING 66 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 16 0 -7 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 11 15 0 -6 BITMAP -0400 -0400 -0000 -0A00 -0A00 +0100 +0100 +0280 +0280 0000 -0080 -2480 -2480 -FF80 +0020 +0120 +1120 +EEC0 0000 -0A00 -0A00 0000 -0400 -0400 +0280 +0280 +0100 +0100 ENDCHAR -STARTCHAR 0x0043 +STARTCHAR uni0043 ENCODING 67 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 10 16 0 -7 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 13 15 0 -6 BITMAP -0400 -0400 +0100 +0100 +0280 +0280 0000 -0A00 -0A00 0000 -0080 -2480 -2480 -FFC0 +0100 +1120 +EED8 0000 -0A00 -0A00 0000 -0400 -0400 +0280 +0280 +0100 +0100 ENDCHAR -STARTCHAR 0x0044 +STARTCHAR uni0044 ENCODING 68 -SWIDTH 1200 0 -DWIDTH 20 0 -BBX 19 7 0 -4 -BITMAP -000380 -410C40 -811020 -81FFE0 -810000 -420500 -3C0500 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 17 10 1 -5 +BITMAP +000700 +000880 +001080 +012700 +40F800 +80C000 +808000 +808A00 +430A00 +3C0000 ENDCHAR -STARTCHAR 0x0045 +STARTCHAR uni0045 ENCODING 69 -SWIDTH 1260 0 -DWIDTH 21 0 -BBX 20 7 1 -4 -BITMAP -000380 -410C40 -811020 -81FFF0 -810000 -420A00 -3C0A00 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 18 10 1 -5 +BITMAP +000700 +000880 +001080 +012100 +40FFC0 +80C000 +808000 +808A00 +430A00 +3C0000 ENDCHAR -STARTCHAR 0x0046 +STARTCHAR uni0046 ENCODING 70 -SWIDTH 960 0 -DWIDTH 16 0 -BBX 15 7 0 -4 +SWIDTH 840 0 +DWIDTH 14 0 +BBX 13 9 0 -4 BITMAP -0038 -10C4 -1102 -EFFE +0070 +0088 +0108 +2270 +DF80 +0400 0000 -00A0 -00A0 +0140 +0140 ENDCHAR -STARTCHAR 0x0047 +STARTCHAR uni0047 ENCODING 71 -SWIDTH 960 0 -DWIDTH 16 0 -BBX 16 7 0 -4 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 13 9 0 -4 BITMAP -0038 -10C4 -1102 -EFFF +00E0 +0110 +0210 +2420 +DFF8 +0800 0000 -00A0 -00A0 +0280 +0280 ENDCHAR -STARTCHAR 0x0048 +STARTCHAR uni0048 ENCODING 72 -SWIDTH 1200 0 -DWIDTH 20 0 -BBX 19 14 0 -4 -BITMAP -000400 -000400 -000000 -000A00 -000A00 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 17 15 1 -5 +BITMAP +001000 +001000 +002800 +002800 000000 -000000 -000380 -410C40 -811020 -81FFE0 -810000 -420000 +000700 +000880 +001080 +012700 +40F800 +80C000 +808000 +808000 +430000 3C0000 ENDCHAR -STARTCHAR 0x0049 +STARTCHAR uni0049 ENCODING 73 -SWIDTH 1260 0 -DWIDTH 21 0 -BBX 20 14 1 -4 -BITMAP -000400 -000400 -000000 -000A00 -000A00 -000000 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 18 15 1 -5 +BITMAP +001000 +001000 +002800 +002800 000000 -000380 -410C40 -811020 -81FFF0 -810000 -420000 +000700 +000880 +001080 +012100 +40FFC0 +80C000 +808000 +808000 +430000 3C0000 ENDCHAR -STARTCHAR 0x004A +STARTCHAR uni004A ENCODING 74 -SWIDTH 960 0 -DWIDTH 16 0 -BBX 15 11 0 -1 +SWIDTH 840 0 +DWIDTH 14 0 +BBX 13 11 0 -1 BITMAP -0040 -0040 -0000 -00A0 -00A0 -0000 +0100 +0100 +0280 +0280 0000 -0038 -10C4 -1102 -EFFE +0070 +0088 +0108 +2270 +DF80 +0400 ENDCHAR -STARTCHAR 0x004B +STARTCHAR uni004B ENCODING 75 -SWIDTH 960 0 -DWIDTH 16 0 -BBX 16 11 0 -1 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 13 11 0 -1 BITMAP -0040 -0040 -0000 -00A0 -00A0 -0000 +0200 +0200 +0500 +0500 0000 -0038 -10C4 -1102 -EFFF +00E0 +0110 +0210 +2420 +DFF8 +0800 ENDCHAR -STARTCHAR 0x004C +STARTCHAR uni004C ENCODING 76 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 10 12 0 -1 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 8 10 1 0 BITMAP -1000 -1100 -1900 -1000 -1280 -1280 -1000 -1380 -1440 -1840 -1040 -FF80 +22 +32 +25 +25 +20 +26 +29 +31 +26 +F8 ENDCHAR -STARTCHAR 0x004D +STARTCHAR uni004D ENCODING 77 -SWIDTH 780 0 -DWIDTH 13 0 -BBX 12 12 1 -1 -BITMAP -1000 -1100 -1900 -1000 -1280 -1280 -1000 -1380 -1440 -1840 -1040 -FFF0 -ENDCHAR -STARTCHAR 0x004E -ENCODING 78 SWIDTH 600 0 DWIDTH 10 0 -BBX 9 12 0 -1 +BBX 10 10 1 0 BITMAP -2000 2200 3200 -2000 2500 2500 2000 -2700 -2880 -3080 -2080 -FF00 +2600 +2900 +3100 +2200 +FFC0 +ENDCHAR +STARTCHAR uni004E +ENCODING 78 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 8 10 0 0 +BITMAP +22 +32 +25 +25 +20 +26 +29 +31 +26 +F8 ENDCHAR -STARTCHAR 0x004F +STARTCHAR uni004F ENCODING 79 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 11 12 0 -1 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 10 10 0 0 BITMAP -2000 2200 3200 -2000 2500 2500 2000 -2700 -2880 -3080 -2080 -FFE0 +2600 +2900 +3100 +2200 +FFC0 ENDCHAR -STARTCHAR 0x0050 +STARTCHAR uni0050 ENCODING 80 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 7 18 0 -5 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 18 1 -7 BITMAP -10 -10 -00 -28 -28 -00 -00 -38 -40 -40 -38 -60 -40 -80 -80 -80 -82 -7C +1000 +1000 +2800 +2800 +0000 +0000 +3800 +4000 +8000 +4C00 +3000 +4000 +4000 +8000 +8000 +8000 +4180 +3E00 ENDCHAR -STARTCHAR 0x0051 +STARTCHAR uni0051 ENCODING 81 SWIDTH 540 0 DWIDTH 9 0 -BBX 8 15 1 -5 +BBX 9 17 1 -6 BITMAP -20 -20 -00 -50 -50 -00 -70 -78 -38 -70 -8F -80 -80 -82 -7C +1000 +1000 +2800 +2800 +0000 +0000 +3800 +6C00 +1000 +3800 +4780 +4000 +8000 +8000 +8000 +4180 +3E00 ENDCHAR -STARTCHAR 0x0052 +STARTCHAR uni0052 ENCODING 82 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 8 11 0 -1 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 7 11 0 0 BITMAP 08 08 -00 14 14 00 +00 1C -22 20 -10 -FF +40 +26 +F8 ENDCHAR -STARTCHAR 0x0053 +STARTCHAR uni0053 ENCODING 83 SWIDTH 480 0 DWIDTH 8 0 -BBX 8 11 0 -1 +BBX 8 11 0 0 BITMAP -10 -10 +08 +08 +14 +14 00 -28 -28 00 -38 -3C 1C -18 -E7 +36 +08 +1C +E3 ENDCHAR -STARTCHAR 0x0054 +STARTCHAR uni0054 ENCODING 84 SWIDTH 900 0 DWIDTH 15 0 -BBX 13 7 0 -1 +BBX 14 8 1 0 BITMAP -0030 -0058 -8048 -8058 -8028 -4008 -3FF0 +0018 +002C +0024 +802C +8014 +8004 +4038 +3FC0 ENDCHAR -STARTCHAR 0x0055 +STARTCHAR uni0055 ENCODING 85 -SWIDTH 900 0 -DWIDTH 15 0 -BBX 14 7 1 -1 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 16 8 1 -1 BITMAP -0030 -0058 -8048 -8058 -8028 -4008 -3FFC +0018 +002C +0024 +802C +8014 +8004 +403B +3FC0 ENDCHAR -STARTCHAR 0x0056 +STARTCHAR uni0056 ENCODING 86 SWIDTH 360 0 DWIDTH 6 0 -BBX 5 7 0 -1 +BBX 5 7 0 0 BITMAP 30 58 @@ -1715,59 +1719,62 @@ 08 F0 ENDCHAR -STARTCHAR 0x0057 +STARTCHAR uni0057 ENCODING 87 -SWIDTH 360 0 -DWIDTH 6 0 -BBX 6 7 0 -1 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 8 6 0 0 BITMAP -30 -58 -48 -58 +18 +24 +24 28 -08 -FC +10 +EF ENDCHAR -STARTCHAR 0x0058 +STARTCHAR uni0058 ENCODING 88 SWIDTH 900 0 DWIDTH 15 0 -BBX 13 10 0 -4 +BBX 14 12 1 -4 BITMAP -0030 -0058 -8048 -8058 -8028 -4008 -3FF0 +0018 +002C +0024 +802C +8014 +8004 +4038 +3FC0 0000 -0020 -0020 +0000 +0100 +0100 ENDCHAR -STARTCHAR 0x0059 +STARTCHAR uni0059 ENCODING 89 -SWIDTH 900 0 -DWIDTH 15 0 -BBX 14 10 1 -4 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 16 12 1 -5 BITMAP -0030 -0058 -8048 -8058 -8028 -4008 -3FFC +0018 +002C +0024 +802C +8014 +8004 +403B +3FC0 0000 -0020 -0020 +0000 +0100 +0100 ENDCHAR -STARTCHAR 0x005A +STARTCHAR uni005A ENCODING 90 SWIDTH 360 0 DWIDTH 6 0 -BBX 5 10 0 -4 +BBX 5 11 0 -4 BITMAP 30 58 @@ -1777,73 +1784,78 @@ 08 F0 00 -20 -20 +00 +80 +80 ENDCHAR -STARTCHAR 0x005B +STARTCHAR uni005B ENCODING 91 -SWIDTH 360 0 -DWIDTH 6 0 -BBX 6 10 0 -4 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 8 10 0 -4 BITMAP -30 -58 -48 -58 +18 +24 +24 28 -08 -FC +10 +EF 00 -20 -20 +00 +40 +40 ENDCHAR -STARTCHAR 0x005C +STARTCHAR uni005C ENCODING 92 SWIDTH 900 0 DWIDTH 15 0 -BBX 13 14 0 -4 +BBX 14 16 1 -4 BITMAP -0020 -0020 +0010 +0010 0000 0000 -0030 -0058 -8048 -8058 -8028 -4008 -3FF0 +0018 +002C +0024 +802C +8014 +8004 +4038 +3FC0 0000 +0000 0100 0100 ENDCHAR -STARTCHAR 0x005D +STARTCHAR uni005D ENCODING 93 -SWIDTH 900 0 -DWIDTH 15 0 -BBX 14 14 1 -4 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 16 16 1 -5 BITMAP -0020 -0020 +0010 +0010 0000 0000 -0030 -0058 -8048 -8058 -8028 -4008 -3FFC +0018 +002C +0024 +802C +8014 +8004 +403B +3FC0 0000 -0080 -0080 +0000 +0100 +0100 ENDCHAR -STARTCHAR 0x005E +STARTCHAR uni005E ENCODING 94 SWIDTH 360 0 DWIDTH 6 0 -BBX 5 14 0 -4 +BBX 5 15 0 -4 BITMAP 20 20 @@ -1857,75 +1869,76 @@ 08 F0 00 +00 80 80 ENDCHAR -STARTCHAR 0x005F +STARTCHAR uni005F ENCODING 95 -SWIDTH 360 0 -DWIDTH 6 0 -BBX 6 14 0 -4 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 8 14 0 -4 BITMAP -20 -20 +08 +08 00 00 -30 -58 -48 -58 +18 +24 +24 28 -08 -FC +10 +EF 00 -80 -80 +00 +40 +40 ENDCHAR -STARTCHAR 0x0060 +STARTCHAR uni0060 ENCODING 96 SWIDTH 900 0 DWIDTH 15 0 -BBX 13 13 0 -7 +BBX 14 13 1 -5 BITMAP -0030 -0058 -8048 -8058 -8028 -4008 -3FF0 -0000 -0050 -0050 +0018 +002C +0024 +802C +8014 +8004 +4038 +3FC0 0000 -0020 -0020 +0028 +0028 +0010 +0010 ENDCHAR -STARTCHAR 0x0061 +STARTCHAR uni0061 ENCODING 97 -SWIDTH 900 0 -DWIDTH 15 0 -BBX 14 13 1 -7 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 16 13 1 -6 BITMAP -0030 -0058 -8048 -8058 -8028 -4008 -3FFC -0000 -0050 -0050 +0018 +002C +0024 +802C +8014 +8004 +403B +3FC0 0000 -0020 -0020 +0028 +0028 +0010 +0010 ENDCHAR -STARTCHAR 0x0062 +STARTCHAR uni0062 ENCODING 98 SWIDTH 360 0 DWIDTH 6 0 -BBX 5 13 0 -7 +BBX 5 13 0 -6 BITMAP 30 58 @@ -1935,77 +1948,78 @@ 08 F0 00 +00 50 50 -00 20 20 ENDCHAR -STARTCHAR 0x0063 +STARTCHAR uni0063 ENCODING 99 -SWIDTH 360 0 -DWIDTH 6 0 -BBX 6 13 0 -7 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 8 12 0 -6 BITMAP -30 -58 -48 -58 +18 +24 +24 28 -08 -FC +10 +EF 00 -50 -50 00 -20 -20 +28 +28 +10 +10 ENDCHAR -STARTCHAR 0x0064 +STARTCHAR uni0064 ENCODING 100 SWIDTH 600 0 DWIDTH 10 0 -BBX 8 13 0 -4 +BBX 9 14 1 -3 BITMAP -04 -04 -00 -00 -06 -0B -09 -0B -85 -81 -81 -42 -3C +0200 +0200 +0000 +0000 +0300 +0580 +0480 +0480 +4380 +8080 +8080 +8100 +4200 +3C00 ENDCHAR -STARTCHAR 0x0065 +STARTCHAR uni0065 ENCODING 101 SWIDTH 720 0 DWIDTH 12 0 -BBX 11 13 1 -4 +BBX 11 14 1 -5 BITMAP -0400 -0400 +0200 +0200 0000 0000 -0600 -0B00 -0900 -0B00 -85C0 -8160 +0300 +0580 +0480 +0480 +43E0 +8080 +8080 8100 4200 3C00 ENDCHAR -STARTCHAR 0x0066 +STARTCHAR uni0066 ENCODING 102 -SWIDTH 360 0 -DWIDTH 6 0 -BBX 5 10 0 -1 +SWIDTH 240 0 +DWIDTH 4 0 +BBX 5 11 0 0 BITMAP 20 20 @@ -2016,80 +2030,80 @@ 48 58 28 +08 F0 ENDCHAR -STARTCHAR 0x0067 +STARTCHAR uni0067 ENCODING 103 -SWIDTH 360 0 -DWIDTH 6 0 -BBX 6 10 0 -1 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 8 10 0 0 BITMAP -20 -20 +10 +10 00 00 -30 -58 -48 -58 +18 +24 +24 28 -FC +10 +EF ENDCHAR -STARTCHAR 0x0068 +STARTCHAR uni0068 ENCODING 104 SWIDTH 600 0 DWIDTH 10 0 -BBX 8 16 0 -4 +BBX 9 16 1 -3 BITMAP -04 -04 -00 -0A -0A -00 -00 -06 -0B -09 -0B -85 -81 -81 -42 -3C +0200 +0200 +0500 +0500 +0000 +0000 +0300 +0580 +0480 +0480 +4380 +8080 +8080 +8100 +4200 +3C00 ENDCHAR -STARTCHAR 0x0069 +STARTCHAR uni0069 ENCODING 105 SWIDTH 720 0 DWIDTH 12 0 -BBX 11 16 1 -4 +BBX 11 16 1 -5 BITMAP -0400 -0400 -0000 -0A00 -0A00 +0200 +0200 +0500 +0500 0000 0000 -0600 -0B00 -0900 -0B00 -85C0 -8160 +0300 +0580 +0480 +0480 +43E0 +8080 +8080 8100 4200 3C00 ENDCHAR -STARTCHAR 0x006A +STARTCHAR uni006A ENCODING 106 -SWIDTH 360 0 -DWIDTH 6 0 -BBX 5 13 0 -1 +SWIDTH 240 0 +DWIDTH 4 0 +BBX 5 13 0 0 BITMAP 20 20 -00 50 50 00 @@ -2099,33 +2113,33 @@ 48 58 28 +08 F0 ENDCHAR -STARTCHAR 0x006B +STARTCHAR uni006B ENCODING 107 -SWIDTH 360 0 -DWIDTH 6 0 -BBX 6 13 0 -1 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 8 12 0 0 BITMAP -20 -20 -00 -50 -50 +10 +10 +28 +28 00 00 -30 -58 -48 -58 +18 +24 +24 28 -FC +10 +EF ENDCHAR -STARTCHAR 0x006C +STARTCHAR uni006C ENCODING 108 SWIDTH 960 0 DWIDTH 16 0 -BBX 14 8 0 -1 +BBX 14 8 0 0 BITMAP 0600 1800 @@ -2136,12 +2150,13 @@ 8004 7FF8 ENDCHAR -STARTCHAR 0x006D +STARTCHAR uni006D ENCODING 109 SWIDTH 1020 0 DWIDTH 17 0 -BBX 16 8 1 -1 +BBX 16 9 1 0 BITMAP +0180 0600 1800 2000 @@ -2151,11 +2166,11 @@ 8004 7FFB ENDCHAR -STARTCHAR 0x006E +STARTCHAR uni006E ENCODING 110 SWIDTH 900 0 DWIDTH 15 0 -BBX 14 8 0 -1 +BBX 14 8 0 0 BITMAP 0600 1800 @@ -2166,11 +2181,11 @@ 0004 FFF8 ENDCHAR -STARTCHAR 0x006F +STARTCHAR uni006F ENCODING 111 SWIDTH 960 0 DWIDTH 16 0 -BBX 16 8 0 -1 +BBX 16 8 0 0 BITMAP 0600 1800 @@ -2181,604 +2196,626 @@ 0004 FFFB ENDCHAR -STARTCHAR 0x0070 +STARTCHAR uni0070 ENCODING 112 -SWIDTH 900 0 -DWIDTH 15 0 -BBX 15 12 0 -1 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 15 14 1 -1 BITMAP 0006 -001C -0074 -0094 -0088 -0060 +0018 +0068 +01A8 +0210 +0200 +0100 +00C0 +0020 4010 -8010 -8010 -8010 -4060 -3F80 +8008 +8008 +C030 +7FC0 ENDCHAR -STARTCHAR 0x0071 +STARTCHAR uni0071 ENCODING 113 SWIDTH 1020 0 DWIDTH 17 0 -BBX 16 12 1 -1 +BBX 16 14 1 -1 BITMAP 0006 -001C -0074 -0094 -0088 -0060 +0018 +0068 +01A8 +0210 +0200 +0100 +00C0 +0020 4010 -8010 -8010 -8010 -4068 -3F87 +8008 +8008 +C037 +7FC0 ENDCHAR -STARTCHAR 0x0072 +STARTCHAR uni0072 ENCODING 114 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 9 12 0 -1 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 10 11 0 0 BITMAP -0180 -0700 -1D00 -2500 -2200 +00C0 +0300 +0D00 +3500 +4200 +4000 +2000 1800 0400 -0400 -0400 0400 -1800 -E000 +F800 ENDCHAR -STARTCHAR 0x0073 +STARTCHAR uni0073 ENCODING 115 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 10 12 0 -1 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 11 11 0 0 BITMAP -0180 -0700 -1D00 -2500 -2200 +00C0 +0300 +0D00 +3500 +4200 +4000 +2000 1800 -0400 0400 -0400 -0400 -1A00 -E1C0 +0700 +F8E0 ENDCHAR -STARTCHAR 0x0074 +STARTCHAR uni0074 ENCODING 116 SWIDTH 660 0 DWIDTH 11 0 -BBX 10 15 0 -1 +BBX 9 13 1 0 BITMAP -0200 -0200 +0800 +0800 0000 -0080 -0080 -00C0 -0080 -0480 -0C80 -0480 -0C80 -8080 -8080 -4080 -3F00 +0100 +0180 +0100 +0900 +1900 +0900 +1900 +0100 +0100 +FE00 ENDCHAR -STARTCHAR 0x0075 +STARTCHAR uni0075 ENCODING 117 -SWIDTH 780 0 -DWIDTH 13 0 -BBX 12 15 1 -1 +SWIDTH 900 0 +DWIDTH 15 0 +BBX 14 14 1 -1 BITMAP 0200 0200 0000 -0080 -0080 -00C0 -0080 -0480 -0C80 -0480 -0C80 -8080 -8080 -40E0 -3F30 +0010 +0018 +0010 +0210 +0610 +0210 +4610 +8010 +8010 +C06C +7F80 ENDCHAR -STARTCHAR 0x0076 +STARTCHAR uni0076 ENCODING 118 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 9 14 0 -1 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 10 13 0 0 BITMAP -0800 -0800 -0180 -0600 -1800 -2000 +1000 +1000 +00C0 +0300 +0C00 +3000 +4000 +4000 2000 1800 0400 -0400 0400 -0400 -1800 -E000 +F800 ENDCHAR -STARTCHAR 0x0077 +STARTCHAR uni0077 ENCODING 119 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 10 14 0 -1 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 11 13 0 0 BITMAP -0800 -0800 -0180 -0600 -1800 -2000 +1000 +1000 +00C0 +0300 +0C00 +3000 +4000 +4000 2000 1800 -0400 -0400 -0400 0400 -1A00 -E1C0 +0700 +F8E0 ENDCHAR -STARTCHAR 0x0078 +STARTCHAR uni0078 ENCODING 120 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 10 18 0 -7 -BITMAP -0080 -0080 -00C0 -0080 -0480 -0C80 -0480 -0C80 -8080 -8080 -4080 -3F00 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 9 16 1 -6 +BITMAP +0100 +0180 +0100 +0900 +1900 +0900 +1900 +0100 +0100 +FE00 0000 -1400 -1400 0000 -0800 -0800 +2800 +2800 +1000 +1000 ENDCHAR -STARTCHAR 0x0079 +STARTCHAR uni0079 ENCODING 121 -SWIDTH 780 0 -DWIDTH 13 0 -BBX 12 18 1 -7 +SWIDTH 900 0 +DWIDTH 15 0 +BBX 14 20 1 -7 BITMAP -0080 -0080 -00C0 -0080 -0480 -0C80 -0480 -0C80 -8080 -8080 -40E0 -3F30 +0200 +0200 0000 -1400 -1400 +0010 +0018 +0010 +0210 +0610 +0210 +4610 +8010 +8010 +C06C +7F80 0000 -0800 -0800 +0000 +0A00 +0A00 +0400 +0400 ENDCHAR -STARTCHAR 0x007A +STARTCHAR uni007A ENCODING 122 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 9 18 0 -7 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 10 19 0 -6 BITMAP -0180 -0600 -1800 -2000 +1000 +1000 +00C0 +0300 +0C00 +3000 +4000 +4000 2000 1800 0400 -0400 -0400 0400 -1800 -E000 +F800 0000 +0000 5000 5000 -0000 2000 2000 ENDCHAR -STARTCHAR 0x007B +STARTCHAR uni007B ENCODING 123 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 10 18 0 -7 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 11 19 0 -6 BITMAP -0180 -0600 -1800 -2000 +1000 +1000 +00C0 +0300 +0C00 +3000 +4000 +4000 2000 1800 -0400 -0400 0400 -0400 -1A00 -E1C0 +0700 +F8E0 0000 +0000 5000 5000 -0000 2000 2000 ENDCHAR -STARTCHAR 0x007C +STARTCHAR uni007C ENCODING 124 SWIDTH 960 0 DWIDTH 16 0 -BBX 15 14 0 -1 +BBX 15 17 1 -1 BITMAP -0006 +0004 0018 -0066 -009C -0074 -0094 -0088 0060 +0186 +0218 +0068 +01A8 +0210 +0200 +0100 +00C0 +0020 4010 -8010 -8010 -8010 -4060 -3F80 +8008 +8008 +C030 +7FC0 ENDCHAR -STARTCHAR 0x007D +STARTCHAR uni007D ENCODING 125 SWIDTH 1020 0 DWIDTH 17 0 -BBX 16 14 1 -1 +BBX 16 17 1 -1 BITMAP -0006 +0004 0018 -0066 -009C -0074 -0094 -0088 0060 +0186 +0218 +0068 +01A8 +0210 +0200 +0100 +00C0 +0020 4010 -8010 -8010 -8010 -4068 -3F87 +8008 +8008 +C037 +7FC0 ENDCHAR -STARTCHAR 0x007E +STARTCHAR uni007E ENCODING 126 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 9 14 0 -1 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 10 14 0 0 BITMAP -0180 -0600 -1980 -2700 -1D00 -2500 -2200 +0080 +0300 +0C00 +30C0 +4300 +0D00 +3500 +4200 +4000 +2000 1800 0400 -0400 0400 -0400 -1800 -E000 +F800 ENDCHAR -STARTCHAR 0x007F +STARTCHAR uni007F ENCODING 127 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 10 14 0 -1 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 11 14 0 0 BITMAP -0180 -0600 -1980 -2700 -1D00 -2500 -2200 +0080 +0300 +0C00 +30C0 +4300 +0D00 +3500 +4200 +4000 +2000 1800 -0400 -0400 -0400 0400 -1A00 -E1C0 +0700 +F8E0 ENDCHAR -STARTCHAR 0x0080 +STARTCHAR uni0080 ENCODING 128 -SWIDTH 900 0 -DWIDTH 15 0 -BBX 15 17 0 -4 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 15 21 1 -5 BITMAP -0006 +0004 0018 -0066 -0098 0060 -0080 -0080 +0186 +0218 0060 +0180 +0200 +0200 +0100 +00C0 +0020 4010 -8010 -8010 -8010 -4060 -3F80 +8008 +8008 +C030 +7FC0 0000 -0A00 -0A00 +0000 +0500 +0500 ENDCHAR -STARTCHAR 0x0081 +STARTCHAR uni0081 ENCODING 129 SWIDTH 1020 0 DWIDTH 17 0 -BBX 16 17 1 -4 +BBX 16 21 1 -5 BITMAP -0006 +0004 0018 -0066 -0098 0060 -0080 -0080 +0186 +0218 0060 +0180 +0200 +0200 +0100 +00C0 +0020 4010 -8010 -8010 -8010 -4068 -3F87 +8008 +8008 +C037 +7FC0 0000 -0A00 -0A00 +0000 +0500 +0500 ENDCHAR -STARTCHAR 0x0082 +STARTCHAR uni0082 ENCODING 130 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 9 17 0 -4 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 10 18 0 -4 BITMAP -0180 -0600 -1980 -2600 -1800 -2000 +0080 +0300 +0C00 +30C0 +4300 +0C00 +3000 +4000 +4000 2000 1800 0400 -0400 0400 -0400 -1800 -E000 +F800 +0000 0000 5000 5000 ENDCHAR -STARTCHAR 0x0083 +STARTCHAR uni0083 ENCODING 131 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 10 17 0 -4 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 11 18 0 -4 BITMAP -0180 -0600 -1980 -2600 -1800 -2000 +0080 +0300 +0C00 +30C0 +4300 +0C00 +3000 +4000 +4000 2000 1800 -0400 -0400 0400 -0400 -1A00 -E1C0 +0700 +F8E0 0000 +0000 5000 5000 ENDCHAR -STARTCHAR 0x0084 +STARTCHAR uni0084 ENCODING 132 -SWIDTH 900 0 -DWIDTH 15 0 -BBX 15 18 0 -1 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 15 20 1 -1 BITMAP -0040 +0100 +0100 0040 -0010 -0050 -0046 -0018 -0066 -0098 +0144 +0118 0060 -0080 -0080 +0186 +0218 0060 +0180 +0200 +0200 +0100 +00C0 +0020 4010 -8010 -8010 -8010 -4060 -3F80 +8008 +8008 +C030 +7FC0 ENDCHAR -STARTCHAR 0x0085 +STARTCHAR uni0085 ENCODING 133 SWIDTH 1020 0 DWIDTH 17 0 -BBX 16 18 1 -1 +BBX 16 20 1 -1 BITMAP -0040 +0100 +0100 0040 -0010 -0050 -0046 -0018 -0066 -0098 +0144 +0118 0060 -0080 -0080 +0186 +0218 0060 +0180 +0200 +0200 +0100 +00C0 +0020 4010 -8010 -8010 -8010 -4068 -3F87 +8008 +8008 +C037 +7FC0 ENDCHAR -STARTCHAR 0x0086 +STARTCHAR uni0086 ENCODING 134 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 9 18 0 -1 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 10 17 0 0 BITMAP -1000 -1000 -0400 -1400 -1180 -0600 -1980 -2600 -1800 2000 2000 +0800 +2880 +2300 +0C00 +30C0 +4300 +0C00 +3000 +4000 +4000 +2000 1800 0400 -0400 -0400 0400 -1800 -E000 +F800 ENDCHAR -STARTCHAR 0x0087 +STARTCHAR uni0087 ENCODING 135 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 10 18 0 -1 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 11 17 0 0 BITMAP -1000 -1000 -0400 -1400 -1180 -0600 -1980 -2600 -1800 2000 2000 +0800 +2880 +2300 +0C00 +30C0 +4300 +0C00 +3000 +4000 +4000 +2000 1800 -0400 -0400 -0400 0400 -1A00 -E1C0 +0700 +F8E0 ENDCHAR -STARTCHAR 0x0088 +STARTCHAR uni0088 ENCODING 136 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 8 16 0 -3 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 17 1 -2 BITMAP -09 -06 -00 -02 -02 -03 -02 -02 -02 -02 -02 -82 -82 -82 -44 -38 +0880 +0500 +0200 +0000 +0000 +0200 +0300 +0200 +0200 +0200 +0200 +0200 +4200 +8200 +8200 +8400 +7800 ENDCHAR -STARTCHAR 0x0089 +STARTCHAR uni0089 ENCODING 137 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 10 16 1 -3 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 9 19 1 -4 BITMAP -0900 -0600 +0880 +0500 +0200 0000 +0000 0200 0200 -0300 0200 0200 0200 0200 0200 +0200 +0300 +4280 8200 -8380 -82C0 -4400 -3800 +8200 +8400 +7800 ENDCHAR -STARTCHAR 0x008A +STARTCHAR uni008A ENCODING 138 SWIDTH 300 0 DWIDTH 5 0 -BBX 4 14 0 -1 +BBX 5 15 0 0 BITMAP -90 -60 -00 +88 +50 20 +00 +00 20 30 20 @@ -2790,18 +2827,19 @@ 20 C0 ENDCHAR -STARTCHAR 0x008B +STARTCHAR uni008B ENCODING 139 SWIDTH 300 0 DWIDTH 5 0 -BBX 5 14 0 -1 +BBX 5 15 0 0 BITMAP -90 -60 +88 +50 +20 +00 00 20 20 -30 20 20 20 @@ -2809,37 +2847,36 @@ 20 20 20 -D8 +D0 ENDCHAR -STARTCHAR 0x008C +STARTCHAR uni008C ENCODING 140 SWIDTH 540 0 DWIDTH 9 0 -BBX 8 17 0 -3 +BBX 8 16 1 -2 BITMAP 02 02 00 00 02 -02 03 02 02 02 02 02 -82 +42 82 82 -44 -38 +84 +78 ENDCHAR -STARTCHAR 0x008D +STARTCHAR uni008D ENCODING 141 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 10 17 1 -3 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 9 18 1 -4 BITMAP 0200 0200 @@ -2847,30 +2884,30 @@ 0000 0200 0200 -0300 0200 0200 0200 0200 0200 +0200 +0300 +4280 8200 -8380 -82C0 -4400 -3800 +8200 +8400 +7800 ENDCHAR -STARTCHAR 0x008E +STARTCHAR uni008E ENCODING 142 SWIDTH 300 0 DWIDTH 5 0 -BBX 4 15 0 -1 +BBX 4 14 0 0 BITMAP 20 20 00 00 20 -20 30 20 20 @@ -2881,11 +2918,11 @@ 20 C0 ENDCHAR -STARTCHAR 0x008F +STARTCHAR uni008F ENCODING 143 -SWIDTH 300 0 -DWIDTH 5 0 -BBX 5 15 0 -1 +SWIDTH 240 0 +DWIDTH 4 0 +BBX 4 14 0 0 BITMAP 20 20 @@ -2893,7 +2930,6 @@ 00 20 20 -30 20 20 20 @@ -2901,77 +2937,73 @@ 20 20 20 -D8 +D0 ENDCHAR -STARTCHAR 0x0090 +STARTCHAR uni0090 ENCODING 144 SWIDTH 540 0 DWIDTH 9 0 -BBX 8 20 0 -3 +BBX 8 18 1 -2 BITMAP 02 02 -00 05 05 00 00 02 -02 03 02 02 02 02 02 -82 +42 82 82 -44 -38 +84 +78 ENDCHAR -STARTCHAR 0x0091 +STARTCHAR uni0091 ENCODING 145 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 10 20 1 -3 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 9 20 1 -4 BITMAP 0200 0200 -0000 0500 0500 0000 0000 0200 0200 -0300 0200 0200 0200 0200 0200 +0200 +0300 +4280 8200 -8380 -82C0 -4400 -3800 +8200 +8400 +7800 ENDCHAR -STARTCHAR 0x0092 +STARTCHAR uni0092 ENCODING 146 SWIDTH 300 0 DWIDTH 5 0 -BBX 4 18 0 -1 +BBX 4 16 0 0 BITMAP 20 20 -00 50 50 00 00 20 -20 30 20 20 @@ -2982,22 +3014,20 @@ 20 C0 ENDCHAR -STARTCHAR 0x0093 +STARTCHAR uni0093 ENCODING 147 -SWIDTH 300 0 -DWIDTH 5 0 -BBX 5 18 0 -1 +SWIDTH 240 0 +DWIDTH 4 0 +BBX 4 16 0 0 BITMAP 20 20 -00 50 50 00 00 20 20 -30 20 20 20 @@ -3005,95 +3035,91 @@ 20 20 20 -D8 +D0 ENDCHAR -STARTCHAR 0x0094 +STARTCHAR uni0094 ENCODING 148 SWIDTH 600 0 DWIDTH 10 0 -BBX 8 12 1 -5 +BBX 9 11 1 -3 BITMAP -10 -10 -00 -02 -02 -41 -81 -81 -82 -86 -7D -07 +1000 +1000 +0000 +0200 +0200 +4100 +8100 +8100 +8300 +7E80 +0380 ENDCHAR -STARTCHAR 0x0095 +STARTCHAR uni0095 ENCODING 149 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 10 12 1 -5 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 9 11 1 -5 BITMAP 1000 1000 0000 0200 0200 -4100 -8180 -8140 -8200 -8600 -7D00 -0700 +4180 +8100 +8100 +8300 +7E80 +0380 ENDCHAR -STARTCHAR 0x0096 +STARTCHAR uni0096 ENCODING 150 SWIDTH 360 0 DWIDTH 6 0 -BBX 5 12 0 -4 +BBX 5 12 0 -3 BITMAP -10 -10 +20 +20 00 +00 10 08 08 08 -08 F0 60 90 60 ENDCHAR -STARTCHAR 0x0097 +STARTCHAR uni0097 ENCODING 151 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 7 12 0 -4 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 6 11 0 -3 BITMAP -20 -20 +10 +10 00 -20 -20 +00 10 10 10 -FE +EC 60 90 60 ENDCHAR -STARTCHAR 0x0098 +STARTCHAR uni0098 ENCODING 152 SWIDTH 600 0 DWIDTH 10 0 -BBX 8 14 1 -4 +BBX 8 12 1 -2 BITMAP -10 -10 -00 -28 -28 +08 +08 +14 +14 00 02 02 @@ -3101,73 +3127,67 @@ 81 81 82 -86 -78 +7C ENDCHAR -STARTCHAR 0x0099 +STARTCHAR uni0099 ENCODING 153 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 10 14 1 -4 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 9 12 1 -4 BITMAP -1000 -1000 -0000 -2800 -2800 +0800 +0800 +1400 +1400 0000 0200 0200 -4100 -8180 -8140 +4180 +8100 +8100 8200 -8600 -7800 +7C00 ENDCHAR -STARTCHAR 0x009A +STARTCHAR uni009A ENCODING 154 SWIDTH 360 0 DWIDTH 6 0 -BBX 5 12 0 -1 +BBX 5 11 0 -6 BITMAP 10 -10 -00 -28 -28 -00 -10 08 08 08 -08 F0 +00 +00 +28 +28 +10 +10 ENDCHAR -STARTCHAR 0x009B +STARTCHAR uni009B ENCODING 155 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 7 12 0 -1 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 6 10 0 -6 BITMAP -20 -20 +10 +10 +10 +EC 00 -50 -50 00 -20 -20 -10 +28 +28 10 10 -FE ENDCHAR -STARTCHAR 0x009C +STARTCHAR uni009C ENCODING 156 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 5 11 1 0 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 4 11 1 0 BITMAP 30 40 @@ -3177,15 +3197,15 @@ 20 30 50 -98 -88 -78 +90 +90 +60 ENDCHAR -STARTCHAR 0x009D +STARTCHAR uni009D ENCODING 157 SWIDTH 420 0 DWIDTH 7 0 -BBX 6 13 1 -1 +BBX 6 12 1 0 BITMAP 18 20 @@ -3198,14 +3218,13 @@ 90 90 70 -10 0C ENDCHAR -STARTCHAR 0x009E +STARTCHAR uni009E ENCODING 158 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 5 11 1 0 +SWIDTH 300 0 +DWIDTH 5 0 +BBX 4 11 1 0 BITMAP 30 40 @@ -3215,11 +3234,11 @@ 20 30 50 -98 -88 -78 +90 +90 +60 ENDCHAR -STARTCHAR 0x009F +STARTCHAR uni009F ENCODING 159 SWIDTH 420 0 DWIDTH 7 0 @@ -3236,11 +3255,11 @@ 8C 04 ENDCHAR -STARTCHAR 0x00A0 +STARTCHAR uni00A0 ENCODING 160 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 5 10 1 0 +SWIDTH 300 0 +DWIDTH 5 0 +BBX 4 10 1 0 BITMAP 50 50 @@ -3249,11 +3268,11 @@ 20 30 50 -98 -88 -78 +90 +90 +60 ENDCHAR -STARTCHAR 0x00A1 +STARTCHAR uni00A1 ENCODING 161 SWIDTH 420 0 DWIDTH 7 0 @@ -3268,7 +3287,7 @@ 8C 04 ENDCHAR -STARTCHAR 0x00A2 +STARTCHAR uni00A2 ENCODING 162 SWIDTH 540 0 DWIDTH 9 0 @@ -3280,25 +3299,25 @@ 0E 12 2A -9C +94 78 ENDCHAR -STARTCHAR 0x00A3 +STARTCHAR uni00A3 ENCODING 163 SWIDTH 600 0 DWIDTH 10 0 -BBX 9 8 1 -3 +BBX 9 8 1 -4 BITMAP 0400 0A00 0A00 -0E00 -1300 -2A80 -9C00 +0780 +1200 +2A00 +9400 7800 ENDCHAR -STARTCHAR 0x00A4 +STARTCHAR uni00A4 ENCODING 164 SWIDTH 540 0 DWIDTH 9 0 @@ -3317,11 +3336,11 @@ 84 78 ENDCHAR -STARTCHAR 0x00A5 +STARTCHAR uni00A5 ENCODING 165 SWIDTH 600 0 DWIDTH 10 0 -BBX 9 12 1 -3 +BBX 9 12 1 -4 BITMAP 0A00 0A00 @@ -3330,368 +3349,600 @@ 0400 0A00 0A00 -0E00 -0300 -0280 +0780 +0200 +0200 8400 7800 ENDCHAR -STARTCHAR 0x00A6 +STARTCHAR uni00A6 ENCODING 166 -SWIDTH 840 0 -DWIDTH 14 0 -BBX 12 8 0 -3 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 13 8 0 -2 BITMAP -0070 +0078 +0080 1080 -3100 -61C0 -A020 -2020 -20C0 -1F00 +2060 +6010 +A010 +1060 +0F80 ENDCHAR -STARTCHAR 0x00A7 +STARTCHAR uni00A7 ENCODING 167 -SWIDTH 780 0 -DWIDTH 13 0 -BBX 12 6 1 -5 +SWIDTH 840 0 +DWIDTH 14 0 +BBX 13 6 1 -5 BITMAP -1000 -3070 -60C0 -A020 -20C0 -1F00 +1078 +2080 +6060 +A010 +1060 +0F80 ENDCHAR -STARTCHAR 0x00A8 +STARTCHAR uni00A8 ENCODING 168 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 10 10 0 -3 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 11 11 0 -2 BITMAP -2400 -1800 -01C0 -4200 4400 -8700 -8080 -8080 -8300 -7C00 +2800 +1000 +01E0 +0200 +4200 +8180 +8040 +8040 +4180 +3E00 ENDCHAR -STARTCHAR 0x00A9 +STARTCHAR uni00A9 ENCODING 169 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 10 7 1 -5 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 11 11 1 -5 BITMAP -2400 -1800 -41C0 -8300 -8080 -8300 -7C00 +2200 +1400 +0800 +0000 +0000 +41E0 +8200 +8180 +8040 +4180 +3E00 ENDCHAR -STARTCHAR 0x00AA +STARTCHAR uni00AA ENCODING 170 SWIDTH 360 0 DWIDTH 6 0 -BBX 5 9 0 -1 +BBX 6 10 0 0 BITMAP -48 -30 +44 +28 +10 +00 00 10 08 08 08 -08 F0 ENDCHAR -STARTCHAR 0x00AB +STARTCHAR uni00AB ENCODING 171 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 7 9 0 -1 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 6 9 0 0 BITMAP -90 -60 +44 +28 +10 +00 +00 +10 +10 +10 +EC +ENDCHAR +STARTCHAR uni00AC +ENCODING 172 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 11 13 1 -7 +BITMAP +01E0 +0200 +4200 +8180 +8040 +8040 +4180 +3E00 +0000 +2800 +2800 +1000 +1000 +ENDCHAR +STARTCHAR uni00AD +ENCODING 173 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 11 11 1 -10 +BITMAP +41E0 +8200 +8180 +8040 +4180 +3E00 +0000 +2800 +2800 +1000 +1000 +ENDCHAR +STARTCHAR uni00AE +ENCODING 174 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 10 0 -5 +BITMAP +10 +08 +08 +08 +F0 00 +50 +50 20 20 +ENDCHAR +STARTCHAR uni00AF +ENCODING 175 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 6 9 0 -5 +BITMAP +10 +10 +10 +EC +00 +28 +28 +10 +10 +ENDCHAR +STARTCHAR uni00B0 +ENCODING 176 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +10 +08 +08 +08 +F0 +ENDCHAR +STARTCHAR uni00B1 +ENCODING 177 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 6 4 0 0 +BITMAP 10 10 10 -FE +EC +ENDCHAR +STARTCHAR uni00B2 +ENCODING 178 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 14 1 -4 +BITMAP +1180 +2A00 +1180 +2A00 +4000 +0000 +0400 +0A00 +0A00 +0780 +0200 +0200 +8400 +7800 +ENDCHAR +STARTCHAR uni00B3 +ENCODING 179 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 15 14 1 -5 +BITMAP +0010 +0010 +0028 +0028 +0000 +0002 +0012 +0112 +40EC +8080 +8080 +8088 +4308 +3C00 +ENDCHAR +STARTCHAR uni00B4 +ENCODING 180 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 17 13 1 -5 +BITMAP +001000 +001000 +002800 +002800 +000000 +000200 +011200 +40ED80 +808000 +808000 +808800 +430800 +3C0000 +ENDCHAR +STARTCHAR uni00B5 +ENCODING 181 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 11 13 0 -4 +BITMAP +0100 +0100 +0280 +0280 +0000 +0020 +0120 +1120 +EEC0 +0000 +0000 +0080 +0080 +ENDCHAR +STARTCHAR uni00B6 +ENCODING 182 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 13 13 0 -4 +BITMAP +0100 +0100 +0280 +0280 +0000 +0000 +0100 +1120 +EED8 +0000 +0000 +0080 +0080 ENDCHAR -STARTCHAR 0x00AC -ENCODING 172 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 10 14 0 -9 +STARTCHAR uni00B7 +ENCODING 183 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 17 12 1 -5 +BITMAP +002000 +002000 +000700 +000880 +001080 +012700 +40F800 +80C000 +808000 +808400 +430400 +3C0000 +ENDCHAR +STARTCHAR uni00B8 +ENCODING 184 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 18 12 1 -5 +BITMAP +002000 +002000 +000700 +000880 +001080 +012100 +40FFC0 +80C000 +808000 +808400 +430400 +3C0000 +ENDCHAR +STARTCHAR uni00B9 +ENCODING 185 +SWIDTH 840 0 +DWIDTH 14 0 +BBX 13 11 0 -4 BITMAP -01C0 -4200 -4400 -8700 -8080 -8080 -8300 -7C00 +0200 +0200 +0070 +0088 +0108 +2270 +DF80 +0400 0000 -2800 -2800 +0040 +0040 +ENDCHAR +STARTCHAR uni00BA +ENCODING 186 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 13 11 0 -4 +BITMAP +0400 +0400 +00E0 +0110 +0210 +2420 +DFF8 +0800 0000 -1000 -1000 +0080 +0080 ENDCHAR -STARTCHAR 0x00AD -ENCODING 173 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 10 9 1 -9 +STARTCHAR uni00BB +ENCODING 187 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 16 1 -7 BITMAP -41C0 -8300 -8080 -8300 -7C00 +2000 +2000 0000 -6C00 0000 +3800 +4000 +8000 +4C00 3000 +4000 +4000 +8800 +8800 +8000 +4180 +3E00 ENDCHAR -STARTCHAR 0x00AE -ENCODING 174 -SWIDTH 360 0 -DWIDTH 6 0 -BBX 5 12 0 -7 +STARTCHAR uni00BC +ENCODING 188 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 9 15 1 -6 BITMAP -10 -08 -08 -08 -08 -F0 -00 -50 -50 -00 -20 -20 +1000 +1000 +0000 +0000 +3800 +6C00 +1000 +3800 +4780 +4000 +8800 +8800 +8000 +4180 +3E00 ENDCHAR -STARTCHAR 0x00AF -ENCODING 175 +STARTCHAR uni00BD +ENCODING 189 SWIDTH 420 0 DWIDTH 7 0 -BBX 7 12 0 -7 +BBX 7 13 0 -4 BITMAP -20 -20 -10 10 10 -FE 00 -28 -28 00 +1C +20 +40 +26 +F8 +00 +00 10 10 ENDCHAR -STARTCHAR 0x00B0 -ENCODING 176 -SWIDTH 360 0 -DWIDTH 6 0 -BBX 5 6 0 -1 +STARTCHAR uni00BE +ENCODING 190 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 8 13 0 -4 BITMAP -10 08 08 +00 +00 +1C +36 08 +1C +E3 +00 +00 08 -F0 -ENDCHAR -STARTCHAR 0x00B1 -ENCODING 177 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 7 6 0 -1 -BITMAP -20 -20 -10 -10 -10 -FE -ENDCHAR -STARTCHAR 0x00B2 -ENCODING 178 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 10 13 -1 -3 -BITMAP -1000 -28C0 -1100 -28C0 -4100 -0400 -0A00 -0A00 -0E00 -0300 -0280 -8400 -7800 +08 ENDCHAR -STARTCHAR 0x00D0 +STARTCHAR uni00D0 ENCODING 208 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 15 1 -1 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 8 15 1 0 BITMAP -12 -0C -00 -04 -06 +11 +0A 04 +00 +00 C4 -E4 -28 -18 -18 -18 -28 -48 -70 +E6 +24 +14 +14 +08 +0C +14 +24 +38 ENDCHAR -STARTCHAR 0x00D1 +STARTCHAR uni00D1 ENCODING 209 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 11 16 1 -2 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 10 16 1 -1 BITMAP -0900 -0600 -0000 +0880 +0500 0200 +0000 +0000 0200 -0300 -6200 +6300 7200 1200 -1200 +0A00 0A00 0A00 0D00 -1900 -70E0 -C000 +0900 +30C0 +E000 ENDCHAR -STARTCHAR 0x00D2 +STARTCHAR uni00D2 ENCODING 210 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 16 1 -1 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 7 14 1 0 BITMAP 04 04 00 00 -04 -06 -04 C4 -E4 -28 -18 -18 -18 -28 -48 -70 +E6 +24 +14 +14 +08 +0C +14 +24 +38 ENDCHAR -STARTCHAR 0x00D3 +STARTCHAR uni00D3 ENCODING 211 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 11 17 1 -2 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 10 15 1 -1 BITMAP 0200 0200 0000 0000 -0200 0200 -0300 -6200 +6300 7200 1200 -1200 0A00 0A00 +0A00 0D00 -1900 -70E0 -C000 +0900 +30C0 +E000 ENDCHAR -STARTCHAR 0x00D4 +STARTCHAR uni00D4 ENCODING 212 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 18 1 -1 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 7 16 1 0 BITMAP 04 04 -00 0A 0A 00 -04 -06 -04 +00 C4 -E4 -28 -18 -18 -18 -28 -48 -70 +E6 +24 +14 +14 +08 +0C +14 +24 +38 ENDCHAR -STARTCHAR 0x00D5 +STARTCHAR uni00D5 ENCODING 213 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 11 19 1 -2 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 10 17 1 -1 BITMAP 0200 0200 -0000 0500 0500 0000 -0200 +0000 0200 -0300 -6200 +6300 7200 1200 -1200 +0A00 0A00 0A00 0D00 -1900 -70E0 -C000 +0900 +30C0 +E000 ENDCHAR -STARTCHAR 0x00F0 +STARTCHAR uni00F0 ENCODING 240 SWIDTH 1260 0 DWIDTH 21 0 @@ -3711,22 +3962,5 @@ 440040 3858C0 005780 -ENDCHAR -STARTCHAR 0x00F4 -ENCODING 244 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 8 10 2 0 -BITMAP -B9 -EE -E4 -60 -60 -20 -30 -10 -10 -10 ENDCHAR ENDFONT Index: xc/extras/fonts/ClearlyU/cu-lig12.bdf diff -u xc/extras/fonts/ClearlyU/cu-lig12.bdf:1.2 xc/extras/fonts/ClearlyU/cu-lig12.bdf:1.3 --- xc/extras/fonts/ClearlyU/cu-lig12.bdf:1.2 Sun Apr 25 06:01:04 1999 +++ xc/extras/fonts/ClearlyU/cu-lig12.bdf Thu Dec 7 13:47:04 2000 @@ -1,6 +1,6 @@ STARTFONT 2.1 COMMENT -COMMENT From: Id: cu-lig12.bdf,v 1.4 1999/04/22 18:39:51 mleisher Exp $ +COMMENT Id: cu-lig12.bdf,v 1.5 2000/12/06 21:58:14 mleisher Exp $ COMMENT COMMENT Copyright 1997, 1998, 1999 Computing Research Labs, New Mexico State COMMENT University @@ -41,7 +41,7 @@ FONT -MUTT-ClearlyU Ligature-Medium-R-Normal--17-120-100-100-P-141-FontSpecific-0 SIZE 12 100 100 FONTBOUNDINGBOX 23 19 0 -6 -STARTPROPERTIES 21 +STARTPROPERTIES 20 COPYRIGHT "1997, 1998 Computing Research Lab, New Mexico State University." POINT_SIZE 120 PIXEL_SIZE 17 @@ -59,13 +59,12 @@ ADD_STYLE_NAME "" CHARSET_REGISTRY "FontSpecific" CHARSET_ENCODING "0" -_XMBDFED_INFO "Edited with xmbdfed 3.5." +_XMBDFED_INFO "Edited with xmbdfed 4.3." CAP_HEIGHT 11 X_HEIGHT 7 -_XFREE86_GLYPH_RANGES "0_5 7 64_66 128_174" ENDPROPERTIES CHARS 57 -STARTCHAR 0x0000 +STARTCHAR uni0000 ENCODING 0 SWIDTH 420 0 DWIDTH 7 0 @@ -87,7 +86,7 @@ 09 06 ENDCHAR -STARTCHAR 0x0001 +STARTCHAR uni0001 ENCODING 1 SWIDTH 720 0 DWIDTH 12 0 @@ -109,7 +108,7 @@ 0048 0030 ENDCHAR -STARTCHAR 0x0002 +STARTCHAR uni0002 ENCODING 2 SWIDTH 480 0 DWIDTH 8 0 @@ -128,7 +127,7 @@ 2200 7700 ENDCHAR -STARTCHAR 0x0003 +STARTCHAR uni0003 ENCODING 3 SWIDTH 720 0 DWIDTH 12 0 @@ -147,7 +146,7 @@ 2220 7770 ENDCHAR -STARTCHAR 0x0004 +STARTCHAR uni0004 ENCODING 4 SWIDTH 420 0 DWIDTH 7 0 @@ -170,7 +169,7 @@ 24 38 ENDCHAR -STARTCHAR 0x0005 +STARTCHAR uni0005 ENCODING 5 SWIDTH 720 0 DWIDTH 12 0 @@ -193,7 +192,7 @@ 0120 01C0 ENDCHAR -STARTCHAR 0x0007 +STARTCHAR uni0007 ENCODING 7 SWIDTH 780 0 DWIDTH 13 0 @@ -212,7 +211,7 @@ 8890 7060 ENDCHAR -STARTCHAR 0x0040 +STARTCHAR uni0040 ENCODING 64 SWIDTH 720 0 DWIDTH 12 0 @@ -233,7 +232,7 @@ 0020 00C0 ENDCHAR -STARTCHAR 0x0041 +STARTCHAR uni0041 ENCODING 65 SWIDTH 900 0 DWIDTH 15 0 @@ -254,7 +253,7 @@ 0008 001C ENDCHAR -STARTCHAR 0x0042 +STARTCHAR uni0042 ENCODING 66 SWIDTH 840 0 DWIDTH 14 0 @@ -275,7 +274,7 @@ 0008 001C ENDCHAR -STARTCHAR 0x0080 +STARTCHAR uni0080 ENCODING 128 SWIDTH 780 0 DWIDTH 13 0 @@ -293,7 +292,7 @@ 8510 78E0 ENDCHAR -STARTCHAR 0x0081 +STARTCHAR uni0081 ENCODING 129 SWIDTH 1020 0 DWIDTH 17 0 @@ -311,7 +310,7 @@ 8501 7882 ENDCHAR -STARTCHAR 0x0082 +STARTCHAR uni0082 ENCODING 130 SWIDTH 780 0 DWIDTH 13 0 @@ -329,7 +328,7 @@ 8510 78E0 ENDCHAR -STARTCHAR 0x0083 +STARTCHAR uni0083 ENCODING 131 SWIDTH 720 0 DWIDTH 12 0 @@ -353,7 +352,7 @@ 0220 01C0 ENDCHAR -STARTCHAR 0x0084 +STARTCHAR uni0084 ENCODING 132 SWIDTH 480 0 DWIDTH 8 0 @@ -372,7 +371,7 @@ 84 78 ENDCHAR -STARTCHAR 0x0085 +STARTCHAR uni0085 ENCODING 133 SWIDTH 780 0 DWIDTH 13 0 @@ -390,7 +389,7 @@ 8510 78E0 ENDCHAR -STARTCHAR 0x0086 +STARTCHAR uni0086 ENCODING 134 SWIDTH 600 0 DWIDTH 10 0 @@ -413,7 +412,7 @@ 8400 0200 ENDCHAR -STARTCHAR 0x0087 +STARTCHAR uni0087 ENCODING 135 SWIDTH 960 0 DWIDTH 16 0 @@ -431,7 +430,7 @@ 0A08 0400 ENDCHAR -STARTCHAR 0x0088 +STARTCHAR uni0088 ENCODING 136 SWIDTH 900 0 DWIDTH 15 0 @@ -453,7 +452,7 @@ 0A00 0400 ENDCHAR -STARTCHAR 0x0089 +STARTCHAR uni0089 ENCODING 137 SWIDTH 1200 0 DWIDTH 20 0 @@ -471,7 +470,7 @@ 0A0080 040000 ENDCHAR -STARTCHAR 0x008A +STARTCHAR uni008A ENCODING 138 SWIDTH 840 0 DWIDTH 14 0 @@ -493,7 +492,7 @@ 0A00 0400 ENDCHAR -STARTCHAR 0x008B +STARTCHAR uni008B ENCODING 139 SWIDTH 720 0 DWIDTH 12 0 @@ -516,7 +515,7 @@ 0A00 0400 ENDCHAR -STARTCHAR 0x008C +STARTCHAR uni008C ENCODING 140 SWIDTH 840 0 DWIDTH 14 0 @@ -538,7 +537,7 @@ 0A00 0400 ENDCHAR -STARTCHAR 0x008D +STARTCHAR uni008D ENCODING 141 SWIDTH 1020 0 DWIDTH 17 0 @@ -560,7 +559,7 @@ 8A40 7180 ENDCHAR -STARTCHAR 0x008E +STARTCHAR uni008E ENCODING 142 SWIDTH 840 0 DWIDTH 14 0 @@ -582,7 +581,7 @@ 0A00 0400 ENDCHAR -STARTCHAR 0x008F +STARTCHAR uni008F ENCODING 143 SWIDTH 780 0 DWIDTH 13 0 @@ -601,7 +600,7 @@ 0A00 0400 ENDCHAR -STARTCHAR 0x0090 +STARTCHAR uni0090 ENCODING 144 SWIDTH 1140 0 DWIDTH 19 0 @@ -623,7 +622,7 @@ 0A0000 040000 ENDCHAR -STARTCHAR 0x0091 +STARTCHAR uni0091 ENCODING 145 SWIDTH 720 0 DWIDTH 12 0 @@ -643,7 +642,7 @@ 4040 3F80 ENDCHAR -STARTCHAR 0x0092 +STARTCHAR uni0092 ENCODING 146 SWIDTH 1200 0 DWIDTH 20 0 @@ -661,7 +660,7 @@ 0A0080 040000 ENDCHAR -STARTCHAR 0x0093 +STARTCHAR uni0093 ENCODING 147 SWIDTH 660 0 DWIDTH 11 0 @@ -685,7 +684,7 @@ 0A00 0400 ENDCHAR -STARTCHAR 0x0094 +STARTCHAR uni0094 ENCODING 148 SWIDTH 960 0 DWIDTH 16 0 @@ -703,7 +702,7 @@ 0A04 0400 ENDCHAR -STARTCHAR 0x0095 +STARTCHAR uni0095 ENCODING 149 SWIDTH 840 0 DWIDTH 14 0 @@ -725,7 +724,7 @@ 0A00 0400 ENDCHAR -STARTCHAR 0x0096 +STARTCHAR uni0096 ENCODING 150 SWIDTH 1020 0 DWIDTH 17 0 @@ -743,7 +742,7 @@ 4891 310E ENDCHAR -STARTCHAR 0x0097 +STARTCHAR uni0097 ENCODING 151 SWIDTH 1020 0 DWIDTH 17 0 @@ -761,7 +760,7 @@ 4891 310E ENDCHAR -STARTCHAR 0x0098 +STARTCHAR uni0098 ENCODING 152 SWIDTH 780 0 DWIDTH 13 0 @@ -779,7 +778,7 @@ 8510 48E0 ENDCHAR -STARTCHAR 0x0099 +STARTCHAR uni0099 ENCODING 153 SWIDTH 780 0 DWIDTH 13 0 @@ -797,7 +796,7 @@ 8510 48E0 ENDCHAR -STARTCHAR 0x009A +STARTCHAR uni009A ENCODING 154 SWIDTH 720 0 DWIDTH 12 0 @@ -815,7 +814,7 @@ A500 4200 ENDCHAR -STARTCHAR 0x009B +STARTCHAR uni009B ENCODING 155 SWIDTH 960 0 DWIDTH 16 0 @@ -838,7 +837,7 @@ 2A80 1100 ENDCHAR -STARTCHAR 0x009C +STARTCHAR uni009C ENCODING 156 SWIDTH 720 0 DWIDTH 12 0 @@ -860,7 +859,7 @@ 2800 1000 ENDCHAR -STARTCHAR 0x009D +STARTCHAR uni009D ENCODING 157 SWIDTH 720 0 DWIDTH 12 0 @@ -882,7 +881,7 @@ 2800 1000 ENDCHAR -STARTCHAR 0x009E +STARTCHAR uni009E ENCODING 158 SWIDTH 960 0 DWIDTH 16 0 @@ -901,7 +900,7 @@ 8A40 7180 ENDCHAR -STARTCHAR 0x009F +STARTCHAR uni009F ENCODING 159 SWIDTH 1020 0 DWIDTH 17 0 @@ -923,7 +922,7 @@ 8A40 7180 ENDCHAR -STARTCHAR 0x00A0 +STARTCHAR uni00A0 ENCODING 160 SWIDTH 1200 0 DWIDTH 20 0 @@ -944,7 +943,7 @@ 80C000 002000 ENDCHAR -STARTCHAR 0x00A1 +STARTCHAR uni00A1 ENCODING 161 SWIDTH 780 0 DWIDTH 13 0 @@ -962,7 +961,7 @@ 8800 7000 ENDCHAR -STARTCHAR 0x00A2 +STARTCHAR uni00A2 ENCODING 162 SWIDTH 960 0 DWIDTH 16 0 @@ -981,7 +980,7 @@ 0140 0080 ENDCHAR -STARTCHAR 0x00A3 +STARTCHAR uni00A3 ENCODING 163 SWIDTH 1020 0 DWIDTH 17 0 @@ -1000,7 +999,7 @@ 8080 4100 ENDCHAR -STARTCHAR 0x00A4 +STARTCHAR uni00A4 ENCODING 164 SWIDTH 840 0 DWIDTH 14 0 @@ -1019,7 +1018,7 @@ 2200 1C00 ENDCHAR -STARTCHAR 0x00A5 +STARTCHAR uni00A5 ENCODING 165 SWIDTH 840 0 DWIDTH 14 0 @@ -1037,7 +1036,7 @@ 2288 1C70 ENDCHAR -STARTCHAR 0x00A6 +STARTCHAR uni00A6 ENCODING 166 SWIDTH 900 0 DWIDTH 15 0 @@ -1057,7 +1056,7 @@ 0808 07F0 ENDCHAR -STARTCHAR 0x00A7 +STARTCHAR uni00A7 ENCODING 167 SWIDTH 1380 0 DWIDTH 23 0 @@ -1075,7 +1074,7 @@ 014010 008000 ENDCHAR -STARTCHAR 0x00A8 +STARTCHAR uni00A8 ENCODING 168 SWIDTH 840 0 DWIDTH 14 0 @@ -1095,7 +1094,7 @@ 1010 0FE0 ENDCHAR -STARTCHAR 0x00A9 +STARTCHAR uni00A9 ENCODING 169 SWIDTH 840 0 DWIDTH 14 0 @@ -1115,7 +1114,7 @@ 1010 0FE0 ENDCHAR -STARTCHAR 0x00AA +STARTCHAR uni00AA ENCODING 170 SWIDTH 780 0 DWIDTH 13 0 @@ -1134,7 +1133,7 @@ 0A00 0400 ENDCHAR -STARTCHAR 0x00AB +STARTCHAR uni00AB ENCODING 171 SWIDTH 960 0 DWIDTH 16 0 @@ -1152,7 +1151,7 @@ 0A08 0400 ENDCHAR -STARTCHAR 0x00AC +STARTCHAR uni00AC ENCODING 172 SWIDTH 960 0 DWIDTH 16 0 @@ -1171,7 +1170,7 @@ 8A40 7180 ENDCHAR -STARTCHAR 0x00AD +STARTCHAR uni00AD ENCODING 173 SWIDTH 1020 0 DWIDTH 17 0 @@ -1193,7 +1192,7 @@ 8A40 7180 ENDCHAR -STARTCHAR 0x00AE +STARTCHAR uni00AE ENCODING 174 SWIDTH 900 0 DWIDTH 15 0 Index: xc/extras/fonts/ClearlyU/cu-pua12.bdf diff -u xc/extras/fonts/ClearlyU/cu-pua12.bdf:1.2 xc/extras/fonts/ClearlyU/cu-pua12.bdf:1.3 --- xc/extras/fonts/ClearlyU/cu-pua12.bdf:1.2 Sun Apr 25 06:01:04 1999 +++ xc/extras/fonts/ClearlyU/cu-pua12.bdf Thu Dec 7 13:47:04 2000 @@ -1,6 +1,6 @@ STARTFONT 2.1 COMMENT -COMMENT From: Id: cu-pua12.bdf,v 1.5 1999/04/22 18:39:52 mleisher Exp $ +COMMENT Id: cu-pua12.bdf,v 1.6 2000/12/06 21:58:14 mleisher Exp $ COMMENT COMMENT Copyright 1997, 1998, 1999 Computing Research Labs, New Mexico State COMMENT University @@ -34,10 +34,10 @@ COMMENT 2. The glyph represents a character not encoded in Unicode, but is COMMENT used. COMMENT -FONT -MUTT-ClearlyU PUA-Medium-R-Normal--17-120-100-100-P-111-ISO10646-1 +FONT -MUTT-ClearlyU PUA-Medium-R-Normal--17-120-100-100-P-110-ISO10646-1 SIZE 12 100 100 FONTBOUNDINGBOX 21 23 -5 -4 -STARTPROPERTIES 20 +STARTPROPERTIES 19 COPYRIGHT "1997, 1998 Computing Research Lab, New Mexico State University." POINT_SIZE 120 PIXEL_SIZE 17 @@ -45,7 +45,7 @@ RESOLUTION_Y 100 FONT_ASCENT 13 FONT_DESCENT 4 -AVERAGE_WIDTH 111 +AVERAGE_WIDTH 110 SPACING "P" FOUNDRY "MUTT" FAMILY_NAME "ClearlyU PUA" @@ -55,12 +55,11 @@ ADD_STYLE_NAME "" CHARSET_REGISTRY "ISO10646" CHARSET_ENCODING "1" -_XMBDFED_INFO "Edited with xmbdfed 3.8." +_XMBDFED_INFO "Edited with xmbdfed 4.4." DEFAULT_CHAR 65534 -_XFREE86_GLYPH_RANGES "57646_57647 57840 57908_57909 57951 58842 60909_60910 61638 61641 61687_61689 63696_63721 63728_63737 65533_65534" ENDPROPERTIES -CHARS 52 -STARTCHAR C073 +CHARS 59 +STARTCHAR uniE12E ENCODING 57646 SWIDTH 360 0 DWIDTH 6 0 @@ -86,7 +85,7 @@ 48 30 ENDCHAR -STARTCHAR 0x012F +STARTCHAR uniE12F ENCODING 57647 SWIDTH 240 0 DWIDTH 4 0 @@ -108,7 +107,7 @@ 90 60 ENDCHAR -STARTCHAR 0xE1F0 +STARTCHAR uniE1F0 ENCODING 57840 SWIDTH 420 0 DWIDTH 7 0 @@ -130,7 +129,7 @@ 90 E0 ENDCHAR -STARTCHAR 0xE234 +STARTCHAR uniE234 ENCODING 57908 SWIDTH 660 0 DWIDTH 11 0 @@ -152,7 +151,7 @@ 2080 1F80 ENDCHAR -STARTCHAR 0xE235 +STARTCHAR uniE235 ENCODING 57909 SWIDTH 480 0 DWIDTH 8 0 @@ -174,7 +173,7 @@ 82 7C ENDCHAR -STARTCHAR 0xE25F +STARTCHAR uniE25F ENCODING 57951 SWIDTH 300 0 DWIDTH 5 0 @@ -191,27 +190,161 @@ 90 E0 ENDCHAR -STARTCHAR 0xE5DA -ENCODING 58842 +STARTCHAR uni04C5 +ENCODING 58565 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 10 13 1 -2 +BITMAP +7FC0 +2100 +2100 +2100 +2100 +2100 +2100 +2100 +2100 +A100 +C7C0 +00C0 +0040 +ENDCHAR +STARTCHAR uni04C6 +ENCODING 58566 SWIDTH 480 0 DWIDTH 8 0 -BBX 7 13 1 -4 +BBX 7 9 1 -2 BITMAP -40 FE -04 -04 -74 -24 -04 -04 -04 -04 -04 +44 +44 +44 +44 +C4 +CE +02 +02 +ENDCHAR +STARTCHAR uni04C9 +ENCODING 58569 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 11 17 0 -2 +BITMAP +1100 +0E00 +0000 +0000 +FBE0 +2180 +2180 +2280 +2280 +2480 +2880 +2880 +3080 +3080 +FBE0 +0060 +0020 +ENDCHAR +STARTCHAR uni04CA +ENCODING 58570 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 7 13 1 -2 +BITMAP +44 +38 +00 +00 +EE +4C +54 +54 +54 +64 +EE +02 +02 +ENDCHAR +STARTCHAR uni04CD +ENCODING 58573 +SWIDTH 840 0 +DWIDTH 14 0 +BBX 14 13 0 -2 +BITMAP +F03C +3030 +3030 +2850 +2850 +2890 +2490 +2490 +2310 +2310 +FB7C +000C +0004 +ENDCHAR +STARTCHAR uni04CE +ENCODING 58574 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 9 1 -2 +BITMAP +C180 +6300 +6300 +5500 +5500 +4900 +EB80 +0080 +0080 +ENDCHAR +STARTCHAR uni04FA +ENCODING 58618 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 9 14 1 0 +BITMAP +3600 +3600 +0000 +BC00 +C200 +8100 +8080 +0080 +1F80 +0080 +8080 +8100 +4200 +3C00 +ENDCHAR +STARTCHAR uni04FB +ENCODING 58619 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 6 10 1 0 +BITMAP +D8 +D8 +00 +70 +48 04 +3C 04 +88 +70 ENDCHAR -STARTCHAR 0xEDED +STARTCHAR uniEDED ENCODING 60909 SWIDTH 480 0 DWIDTH 8 0 @@ -237,7 +370,7 @@ 0010 0010 ENDCHAR -STARTCHAR 0xEDEE +STARTCHAR uniEDEE ENCODING 60910 SWIDTH 480 0 DWIDTH 8 0 @@ -262,7 +395,7 @@ 0020 0020 ENDCHAR -STARTCHAR 0xF0C6 +STARTCHAR uniF0C6 ENCODING 61638 SWIDTH 720 0 DWIDTH 12 0 @@ -280,7 +413,7 @@ 0400 0E00 ENDCHAR -STARTCHAR 0xF0C9 +STARTCHAR uniF0C9 ENCODING 61641 SWIDTH 480 0 DWIDTH 8 0 @@ -298,7 +431,7 @@ 40 E0 ENDCHAR -STARTCHAR 0xF0F7 +STARTCHAR uniF0F7 ENCODING 61687 SWIDTH 360 0 DWIDTH 6 0 @@ -316,7 +449,7 @@ 88 70 ENDCHAR -STARTCHAR 0xF0F8 +STARTCHAR uniF0F8 ENCODING 61688 SWIDTH 420 0 DWIDTH 7 0 @@ -332,7 +465,7 @@ 84 78 ENDCHAR -STARTCHAR 0xF0F9 +STARTCHAR uniF0F9 ENCODING 61689 SWIDTH 480 0 DWIDTH 8 0 @@ -352,7 +485,7 @@ 40 E0 ENDCHAR -STARTCHAR 0xF8D0 +STARTCHAR uniF8D0 ENCODING 63696 SWIDTH 900 0 DWIDTH 15 0 @@ -373,7 +506,7 @@ 000C 0004 ENDCHAR -STARTCHAR 0xF8D1 +STARTCHAR uniF8D1 ENCODING 63697 SWIDTH 840 0 DWIDTH 14 0 @@ -394,7 +527,7 @@ 0060 0020 ENDCHAR -STARTCHAR 0xF8D2 +STARTCHAR uniF8D2 ENCODING 63698 SWIDTH 900 0 DWIDTH 15 0 @@ -414,7 +547,7 @@ 0FF0 03E0 ENDCHAR -STARTCHAR 0xF8D3 +STARTCHAR uniF8D3 ENCODING 63699 SWIDTH 720 0 DWIDTH 12 0 @@ -434,7 +567,7 @@ FF80 7E00 ENDCHAR -STARTCHAR 0xF8D4 +STARTCHAR uniF8D4 ENCODING 63700 SWIDTH 660 0 DWIDTH 11 0 @@ -454,7 +587,7 @@ 6000 6000 ENDCHAR -STARTCHAR 0xF8D5 +STARTCHAR uniF8D5 ENCODING 63701 SWIDTH 960 0 DWIDTH 16 0 @@ -474,7 +607,7 @@ 7C02 E000 ENDCHAR -STARTCHAR 0xF8D6 +STARTCHAR uniF8D6 ENCODING 63702 SWIDTH 480 0 DWIDTH 8 0 @@ -494,7 +627,7 @@ 18 08 ENDCHAR -STARTCHAR 0xF8D7 +STARTCHAR uniF8D7 ENCODING 63703 SWIDTH 780 0 DWIDTH 13 0 @@ -514,7 +647,7 @@ 0380 01C0 ENDCHAR -STARTCHAR 0xF8D8 +STARTCHAR uniF8D8 ENCODING 63704 SWIDTH 840 0 DWIDTH 14 0 @@ -533,7 +666,7 @@ 4000 8000 ENDCHAR -STARTCHAR 0xF8D9 +STARTCHAR uniF8D9 ENCODING 63705 SWIDTH 600 0 DWIDTH 10 0 @@ -552,7 +685,7 @@ FF80 0180 ENDCHAR -STARTCHAR 0xF8DA +STARTCHAR uniF8DA ENCODING 63706 SWIDTH 660 0 DWIDTH 11 0 @@ -572,7 +705,7 @@ 1C00 0C00 ENDCHAR -STARTCHAR 0xF8DB +STARTCHAR uniF8DB ENCODING 63707 SWIDTH 780 0 DWIDTH 13 0 @@ -593,7 +726,7 @@ 03F0 01F0 ENDCHAR -STARTCHAR 0xF8DC +STARTCHAR uniF8DC ENCODING 63708 SWIDTH 960 0 DWIDTH 16 0 @@ -613,7 +746,7 @@ 0300 00C0 ENDCHAR -STARTCHAR 0xF8DD +STARTCHAR uniF8DD ENCODING 63709 SWIDTH 840 0 DWIDTH 14 0 @@ -634,7 +767,7 @@ 00F0 0038 ENDCHAR -STARTCHAR 0xF8DE +STARTCHAR uniF8DE ENCODING 63710 SWIDTH 600 0 DWIDTH 10 0 @@ -653,7 +786,7 @@ 3C00 F000 ENDCHAR -STARTCHAR 0xF8DF +STARTCHAR uniF8DF ENCODING 63711 SWIDTH 420 0 DWIDTH 7 0 @@ -672,7 +805,7 @@ 18 10 ENDCHAR -STARTCHAR 0xF8E0 +STARTCHAR uniF8E0 ENCODING 63712 SWIDTH 600 0 DWIDTH 10 0 @@ -692,7 +825,7 @@ 7000 E000 ENDCHAR -STARTCHAR 0xF8E1 +STARTCHAR uniF8E1 ENCODING 63713 SWIDTH 780 0 DWIDTH 13 0 @@ -711,7 +844,7 @@ 3000 4000 ENDCHAR -STARTCHAR 0xF8E2 +STARTCHAR uniF8E2 ENCODING 63714 SWIDTH 840 0 DWIDTH 14 0 @@ -730,7 +863,7 @@ 7FF0 E038 ENDCHAR -STARTCHAR 0xF8E3 +STARTCHAR uniF8E3 ENCODING 63715 SWIDTH 840 0 DWIDTH 14 0 @@ -750,7 +883,7 @@ E000 C000 ENDCHAR -STARTCHAR 0xF8E4 +STARTCHAR uniF8E4 ENCODING 63716 SWIDTH 900 0 DWIDTH 15 0 @@ -771,7 +904,7 @@ 07C0 01E0 ENDCHAR -STARTCHAR 0xF8E5 +STARTCHAR uniF8E5 ENCODING 63717 SWIDTH 840 0 DWIDTH 14 0 @@ -790,7 +923,7 @@ E000 8000 ENDCHAR -STARTCHAR 0xF8E6 +STARTCHAR uniF8E6 ENCODING 63718 SWIDTH 960 0 DWIDTH 16 0 @@ -810,7 +943,7 @@ E00E C000 ENDCHAR -STARTCHAR 0xF8E7 +STARTCHAR uniF8E7 ENCODING 63719 SWIDTH 780 0 DWIDTH 13 0 @@ -830,7 +963,7 @@ 1800 0800 ENDCHAR -STARTCHAR 0xF8E8 +STARTCHAR uniF8E8 ENCODING 63720 SWIDTH 840 0 DWIDTH 14 0 @@ -852,7 +985,7 @@ 0070 0030 ENDCHAR -STARTCHAR 0xF8E9 +STARTCHAR uniF8E9 ENCODING 63721 SWIDTH 300 0 DWIDTH 5 0 @@ -867,7 +1000,7 @@ C0 60 ENDCHAR -STARTCHAR 0xF8F0 +STARTCHAR uniF8F0 ENCODING 63728 SWIDTH 840 0 DWIDTH 14 0 @@ -878,7 +1011,7 @@ FFF8 3FE0 ENDCHAR -STARTCHAR 0xF8F1 +STARTCHAR uniF8F1 ENCODING 63729 SWIDTH 900 0 DWIDTH 15 0 @@ -898,7 +1031,7 @@ 8000 8000 ENDCHAR -STARTCHAR 0xF8F2 +STARTCHAR uniF8F2 ENCODING 63730 SWIDTH 360 0 DWIDTH 6 0 @@ -917,7 +1050,7 @@ 30 18 ENDCHAR -STARTCHAR 0xF8F3 +STARTCHAR uniF8F3 ENCODING 63731 SWIDTH 660 0 DWIDTH 11 0 @@ -936,7 +1069,7 @@ 0700 01C0 ENDCHAR -STARTCHAR 0xF8F4 +STARTCHAR uniF8F4 ENCODING 63732 SWIDTH 900 0 DWIDTH 15 0 @@ -956,7 +1089,7 @@ 7FF8 3FFC ENDCHAR -STARTCHAR 0xF8F5 +STARTCHAR uniF8F5 ENCODING 63733 SWIDTH 480 0 DWIDTH 8 0 @@ -977,7 +1110,7 @@ 18 08 ENDCHAR -STARTCHAR 0xF8F6 +STARTCHAR uniF8F6 ENCODING 63734 SWIDTH 900 0 DWIDTH 15 0 @@ -996,7 +1129,7 @@ 2010 0010 ENDCHAR -STARTCHAR 0xF8F7 +STARTCHAR uniF8F7 ENCODING 63735 SWIDTH 660 0 DWIDTH 11 0 @@ -1015,7 +1148,7 @@ 0080 0040 ENDCHAR -STARTCHAR 0xF8F8 +STARTCHAR uniF8F8 ENCODING 63736 SWIDTH 900 0 DWIDTH 15 0 @@ -1035,7 +1168,7 @@ 6798 CFCC ENDCHAR -STARTCHAR 0xF8F9 +STARTCHAR uniF8F9 ENCODING 63737 SWIDTH 660 0 DWIDTH 11 0 @@ -1055,7 +1188,7 @@ 1E00 3300 ENDCHAR -STARTCHAR 0xFFFD +STARTCHAR uniFFFD ENCODING 65533 SWIDTH 960 0 DWIDTH 16 0 @@ -1077,7 +1210,7 @@ 0380 0100 ENDCHAR -STARTCHAR C072 +STARTCHAR uniFFFE ENCODING 65534 SWIDTH 600 0 DWIDTH 10 0 Index: xc/extras/fonts/ClearlyU/cu12.bdf diff -u xc/extras/fonts/ClearlyU/cu12.bdf:1.2 xc/extras/fonts/ClearlyU/cu12.bdf:1.3 --- xc/extras/fonts/ClearlyU/cu12.bdf:1.2 Sun Apr 25 06:01:06 1999 +++ xc/extras/fonts/ClearlyU/cu12.bdf Thu Dec 7 13:47:04 2000 @@ -1,8 +1,8 @@ STARTFONT 2.1 COMMENT -COMMENT From: Id: cu12.bdf,v 1.11 1999/04/22 18:39:52 mleisher Exp $ +COMMENT Id: cu12.bdf,v 1.14 2000/12/06 22:13:11 mleisher Exp $ COMMENT -COMMENT Copyright 1997, 1998, 1999 Computing Research Labs, New Mexico State +COMMENT Copyright 1997, 1998 Computing Research Labs, New Mexico State COMMENT University COMMENT COMMENT Permission is hereby granted, free of charge, to any person @@ -26,14 +26,14 @@ COMMENT OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE COMMENT SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. COMMENT -FONT -MUTT-ClearlyU-Medium-R-Normal--17-120-100-100-P-101-ISO10646-1 +FONT -MUTT-ClearlyU-Medium-R-Normal--17-120-100-100-P-128-ISO10646-1 SIZE 12 100 100 -FONTBOUNDINGBOX 25 29 -4 -9 -STARTPROPERTIES 26 +FONTBOUNDINGBOX 27 30 -6 -10 +STARTPROPERTIES 21 FONT_ASCENT 20 FONT_DESCENT 9 COPYRIGHT "1997, 1998 Computing Research Lab, New Mexico State University." -_XMBDFED_INFO "Edited with xmbdfed 3.8." +_XMBDFED_INFO "Edited with xmbdfed 4.4." FOUNDRY "MUTT" FAMILY_NAME "ClearlyU" WEIGHT_NAME "Medium" @@ -45,27 +45,22 @@ RESOLUTION_X 100 RESOLUTION_Y 100 SPACING "P" -AVERAGE_WIDTH 101 +AVERAGE_WIDTH 128 CHARSET_REGISTRY "ISO10646" CHARSET_ENCODING "1" -DEFAULT_CHAR 65534 +DEFAULT_CHAR 65533 CAP_HEIGHT 11 X_HEIGHT 7 -_XFREE86_GLYPH_RANGES "32_126 160_543 546_563 592_685 688_750 768_846 864_866 884_885 890 894 900_906 908 910_929 931_974 976_983 986_1011 1024_1158 1166_1230 1232_1269 1272_1279 1329_1366 1369_1375 1377_1415 1417_1418 1425_1441 1443_1465 1467_1476 1488_1514 1520_1524 1548 1563 1567 1569_1594 1600_1618 1632_1645" -_XFREE86_GLYPH_RANGES "1648_1719 1722_1726 1728_1742 1744_1749 1776_1785 3585_3642 3647_3675 3713_3714 3716 3719_3720 3722 3725 3732_3735 3737_3743 3745_3747 3749 3751 3754_3755 3757_3769 3771_3773 3776_3780 3782 3784_3789 3792_3801 3804_3805 4256_4293 4304_4342 4347 4608_4614 4616_4678 4680 4682_4685" -_XFREE86_GLYPH_RANGES "4688_4694 4696 4698_4701 4704_4742 4744 4746_4749 4752_4782 4784 4786_4789 4792_4798 4800 4802_4805 4808_4814 4816_4822 4824_4878 4880 4882_4885 4888_4934 4936_4954 4960_4988 4991 7680_7835 7840_7929 7936_7957 7960_7965 7968_8005 8008_8013 8016_8023 8025 8027 8029 8031_8061 8064_8116" -_XFREE86_GLYPH_RANGES "8118_8132 8134_8147 8150_8155 8157_8175 8178_8180 8182_8190 8203 8208_8231 8240_8262 8304 8308_8334 8352_8364 8400_8415 8448_8506 8531_8579 8592_8691 8704_8945 8960 8962_8966 8968_8976 9216_9254 9280_9289 9312_9450 9632_9719 64256_64262 64275_64279 64286_64310 64312_64316 64318" -_XFREE86_GLYPH_RANGES "64320_64321 64323_64324 64326_64419 64422_64433 64467_64489 64508_64511 64830_64831 65010 65056_65059 65104_65106 65108_65119 65122_65123 65126 65136_65138 65140 65142_65276 65281_65374 65382_65433 65504_65509 65533_65534" ENDPROPERTIES -CHARS 3832 -STARTCHAR 0x0020 +CHARS 7093 +STARTCHAR space ENCODING 32 SWIDTH 300 0 DWIDTH 5 0 BBX 0 0 0 0 BITMAP ENDCHAR -STARTCHAR 0x0021 +STARTCHAR C033 ENCODING 33 SWIDTH 300 0 DWIDTH 5 0 @@ -84,7 +79,7 @@ C0 C0 ENDCHAR -STARTCHAR 0x0022 +STARTCHAR C034 ENCODING 34 SWIDTH 480 0 DWIDTH 8 0 @@ -96,7 +91,7 @@ 48 90 ENDCHAR -STARTCHAR 0x0023 +STARTCHAR C035 ENCODING 35 SWIDTH 720 0 DWIDTH 12 0 @@ -118,7 +113,7 @@ 4800 4800 ENDCHAR -STARTCHAR 0x0024 +STARTCHAR C036 ENCODING 36 SWIDTH 480 0 DWIDTH 8 0 @@ -139,7 +134,7 @@ 70 20 ENDCHAR -STARTCHAR 0x0025 +STARTCHAR C037 ENCODING 37 SWIDTH 840 0 DWIDTH 14 0 @@ -159,7 +154,7 @@ 2120 40C0 ENDCHAR -STARTCHAR 0x0026 +STARTCHAR C038 ENCODING 38 SWIDTH 780 0 DWIDTH 13 0 @@ -178,7 +173,7 @@ C440 7B80 ENDCHAR -STARTCHAR 0x0027 +STARTCHAR C039 ENCODING 39 SWIDTH 300 0 DWIDTH 5 0 @@ -190,7 +185,7 @@ 40 80 ENDCHAR -STARTCHAR 0x0028 +STARTCHAR C040 ENCODING 40 SWIDTH 360 0 DWIDTH 6 0 @@ -212,7 +207,7 @@ 20 10 ENDCHAR -STARTCHAR 0x0029 +STARTCHAR C041 ENCODING 41 SWIDTH 360 0 DWIDTH 6 0 @@ -234,7 +229,7 @@ 40 80 ENDCHAR -STARTCHAR 0x002A +STARTCHAR C042 ENCODING 42 SWIDTH 420 0 DWIDTH 7 0 @@ -248,7 +243,7 @@ 92 10 ENDCHAR -STARTCHAR 0x002B +STARTCHAR C043 ENCODING 43 SWIDTH 660 0 DWIDTH 11 0 @@ -266,7 +261,7 @@ 0800 0800 ENDCHAR -STARTCHAR 0x002C +STARTCHAR C044 ENCODING 44 SWIDTH 300 0 DWIDTH 5 0 @@ -278,7 +273,7 @@ 40 80 ENDCHAR -STARTCHAR 0x002D +STARTCHAR C045 ENCODING 45 SWIDTH 420 0 DWIDTH 7 0 @@ -286,7 +281,7 @@ BITMAP F0 ENDCHAR -STARTCHAR 0x002E +STARTCHAR C046 ENCODING 46 SWIDTH 300 0 DWIDTH 5 0 @@ -295,7 +290,7 @@ C0 C0 ENDCHAR -STARTCHAR 0x002F +STARTCHAR C047 ENCODING 47 SWIDTH 480 0 DWIDTH 8 0 @@ -318,7 +313,7 @@ 80 80 ENDCHAR -STARTCHAR 0x0030 +STARTCHAR C048 ENCODING 48 SWIDTH 420 0 DWIDTH 7 0 @@ -336,7 +331,7 @@ 50 70 ENDCHAR -STARTCHAR 0x0031 +STARTCHAR C049 ENCODING 49 SWIDTH 420 0 DWIDTH 7 0 @@ -354,7 +349,7 @@ 20 F8 ENDCHAR -STARTCHAR 0x0032 +STARTCHAR C050 ENCODING 50 SWIDTH 420 0 DWIDTH 7 0 @@ -372,7 +367,7 @@ 48 F8 ENDCHAR -STARTCHAR 0x0033 +STARTCHAR C051 ENCODING 51 SWIDTH 420 0 DWIDTH 7 0 @@ -390,7 +385,7 @@ 88 70 ENDCHAR -STARTCHAR 0x0034 +STARTCHAR C052 ENCODING 52 SWIDTH 540 0 DWIDTH 9 0 @@ -408,7 +403,7 @@ 08 3E ENDCHAR -STARTCHAR 0x0035 +STARTCHAR C053 ENCODING 53 SWIDTH 420 0 DWIDTH 7 0 @@ -426,7 +421,7 @@ 90 60 ENDCHAR -STARTCHAR 0x0036 +STARTCHAR C054 ENCODING 54 SWIDTH 420 0 DWIDTH 7 0 @@ -444,7 +439,7 @@ 50 70 ENDCHAR -STARTCHAR 0x0037 +STARTCHAR C055 ENCODING 55 SWIDTH 480 0 DWIDTH 8 0 @@ -463,7 +458,7 @@ 20 20 ENDCHAR -STARTCHAR 0x0038 +STARTCHAR C056 ENCODING 56 SWIDTH 420 0 DWIDTH 7 0 @@ -481,7 +476,7 @@ 88 70 ENDCHAR -STARTCHAR 0x0039 +STARTCHAR C057 ENCODING 57 SWIDTH 420 0 DWIDTH 7 0 @@ -499,10 +494,10 @@ 90 60 ENDCHAR -STARTCHAR 0x003A +STARTCHAR C058 ENCODING 58 -SWIDTH 300 0 -DWIDTH 5 0 +SWIDTH 420 0 +DWIDTH 7 0 BBX 2 7 3 0 BITMAP C0 @@ -513,7 +508,7 @@ C0 C0 ENDCHAR -STARTCHAR 0x003B +STARTCHAR C059 ENCODING 59 SWIDTH 300 0 DWIDTH 5 0 @@ -530,7 +525,7 @@ 40 80 ENDCHAR -STARTCHAR 0x003C +STARTCHAR char60 ENCODING 60 SWIDTH 360 0 DWIDTH 6 0 @@ -546,7 +541,7 @@ 10 08 ENDCHAR -STARTCHAR 0x003D +STARTCHAR C061 ENCODING 61 SWIDTH 780 0 DWIDTH 13 0 @@ -558,7 +553,7 @@ 0000 FFC0 ENDCHAR -STARTCHAR 0x003E +STARTCHAR char60 ENCODING 62 SWIDTH 360 0 DWIDTH 6 0 @@ -574,7 +569,7 @@ 40 80 ENDCHAR -STARTCHAR 0x003F +STARTCHAR C063 ENCODING 63 SWIDTH 480 0 DWIDTH 8 0 @@ -593,7 +588,7 @@ 60 60 ENDCHAR -STARTCHAR 0x0040 +STARTCHAR C064 ENCODING 64 SWIDTH 720 0 DWIDTH 12 0 @@ -1083,7 +1078,7 @@ 46 FE ENDCHAR -STARTCHAR 0x005B +STARTCHAR C091 ENCODING 91 SWIDTH 300 0 DWIDTH 5 0 @@ -1106,7 +1101,7 @@ 80 E0 ENDCHAR -STARTCHAR 0x005C +STARTCHAR C047 ENCODING 92 SWIDTH 480 0 DWIDTH 8 0 @@ -1129,7 +1124,7 @@ 08 08 ENDCHAR -STARTCHAR 0x005D +STARTCHAR C093 ENCODING 93 SWIDTH 300 0 DWIDTH 5 0 @@ -1152,7 +1147,7 @@ 20 E0 ENDCHAR -STARTCHAR 0x005E +STARTCHAR C094 ENCODING 94 SWIDTH 360 0 DWIDTH 6 0 @@ -1162,7 +1157,7 @@ 70 88 ENDCHAR -STARTCHAR 0x005F +STARTCHAR char95 ENCODING 95 SWIDTH 720 0 DWIDTH 12 0 @@ -1170,7 +1165,7 @@ BITMAP FFE0 ENDCHAR -STARTCHAR 0x0060 +STARTCHAR C096 ENCODING 96 SWIDTH 300 0 DWIDTH 5 0 @@ -1182,7 +1177,7 @@ C0 C0 ENDCHAR -STARTCHAR 0x0061 +STARTCHAR C097 ENCODING 97 SWIDTH 420 0 DWIDTH 7 0 @@ -1196,7 +1191,7 @@ 88 7C ENDCHAR -STARTCHAR 0x0062 +STARTCHAR C098 ENCODING 98 SWIDTH 420 0 DWIDTH 7 0 @@ -1215,7 +1210,7 @@ 44 78 ENDCHAR -STARTCHAR 0x0063 +STARTCHAR C099 ENCODING 99 SWIDTH 360 0 DWIDTH 6 0 @@ -1229,7 +1224,7 @@ 88 70 ENDCHAR -STARTCHAR 0x0064 +STARTCHAR C100 ENCODING 100 SWIDTH 420 0 DWIDTH 7 0 @@ -1248,7 +1243,7 @@ 88 7C ENDCHAR -STARTCHAR 0x0065 +STARTCHAR C101 ENCODING 101 SWIDTH 360 0 DWIDTH 6 0 @@ -1262,7 +1257,7 @@ 88 70 ENDCHAR -STARTCHAR 0x0066 +STARTCHAR C102 ENCODING 102 SWIDTH 360 0 DWIDTH 6 0 @@ -1281,7 +1276,7 @@ 40 E0 ENDCHAR -STARTCHAR 0x0067 +STARTCHAR C103 ENCODING 103 SWIDTH 480 0 DWIDTH 8 0 @@ -1299,7 +1294,7 @@ 82 7C ENDCHAR -STARTCHAR 0x0068 +STARTCHAR C104 ENCODING 104 SWIDTH 480 0 DWIDTH 8 0 @@ -1357,7 +1352,7 @@ 90 E0 ENDCHAR -STARTCHAR 0x006B +STARTCHAR C107 ENCODING 107 SWIDTH 480 0 DWIDTH 8 0 @@ -1376,7 +1371,7 @@ 48 EE ENDCHAR -STARTCHAR 0x006C +STARTCHAR C108 ENCODING 108 SWIDTH 240 0 DWIDTH 4 0 @@ -1395,7 +1390,7 @@ 40 E0 ENDCHAR -STARTCHAR 0x006D +STARTCHAR C109 ENCODING 109 SWIDTH 720 0 DWIDTH 12 0 @@ -1409,7 +1404,7 @@ 4440 EEE0 ENDCHAR -STARTCHAR 0x006E +STARTCHAR C110 ENCODING 110 SWIDTH 480 0 DWIDTH 8 0 @@ -1423,7 +1418,7 @@ 44 EE ENDCHAR -STARTCHAR 0x006F +STARTCHAR C111 ENCODING 111 SWIDTH 360 0 DWIDTH 6 0 @@ -1437,7 +1432,7 @@ 88 70 ENDCHAR -STARTCHAR 0x0070 +STARTCHAR C112 ENCODING 112 SWIDTH 420 0 DWIDTH 7 0 @@ -1454,7 +1449,7 @@ 40 E0 ENDCHAR -STARTCHAR 0x0071 +STARTCHAR C113 ENCODING 113 SWIDTH 420 0 DWIDTH 7 0 @@ -1471,7 +1466,7 @@ 08 1C ENDCHAR -STARTCHAR 0x0072 +STARTCHAR C114 ENCODING 114 SWIDTH 360 0 DWIDTH 6 0 @@ -1485,7 +1480,7 @@ 40 F0 ENDCHAR -STARTCHAR 0x0073 +STARTCHAR C115 ENCODING 115 SWIDTH 360 0 DWIDTH 6 0 @@ -1499,7 +1494,7 @@ 88 F0 ENDCHAR -STARTCHAR 0x0074 +STARTCHAR C116 ENCODING 116 SWIDTH 420 0 DWIDTH 7 0 @@ -1516,7 +1511,7 @@ 24 18 ENDCHAR -STARTCHAR 0x0075 +STARTCHAR C117 ENCODING 117 SWIDTH 480 0 DWIDTH 8 0 @@ -1530,7 +1525,7 @@ 44 3E ENDCHAR -STARTCHAR 0x0076 +STARTCHAR C118 ENCODING 118 SWIDTH 540 0 DWIDTH 9 0 @@ -1544,7 +1539,7 @@ 18 18 ENDCHAR -STARTCHAR 0x0077 +STARTCHAR C119 ENCODING 119 SWIDTH 660 0 DWIDTH 11 0 @@ -1555,10 +1550,10 @@ 2A80 2A80 2A80 -1100 +1B00 1100 ENDCHAR -STARTCHAR 0x0078 +STARTCHAR C120 ENCODING 120 SWIDTH 540 0 DWIDTH 9 0 @@ -1572,7 +1567,7 @@ 24 E7 ENDCHAR -STARTCHAR 0x0079 +STARTCHAR C121 ENCODING 121 SWIDTH 480 0 DWIDTH 8 0 @@ -1589,7 +1584,7 @@ 90 E0 ENDCHAR -STARTCHAR 0x007A +STARTCHAR C122 ENCODING 122 SWIDTH 360 0 DWIDTH 6 0 @@ -1603,7 +1598,7 @@ 48 F8 ENDCHAR -STARTCHAR 0x007B +STARTCHAR char123 ENCODING 123 SWIDTH 360 0 DWIDTH 6 0 @@ -1626,7 +1621,7 @@ 20 18 ENDCHAR -STARTCHAR 0x007C +STARTCHAR char123 ENCODING 124 SWIDTH 180 0 DWIDTH 3 0 @@ -1649,7 +1644,7 @@ 80 80 ENDCHAR -STARTCHAR 0x007D +STARTCHAR char124 ENCODING 125 SWIDTH 300 0 DWIDTH 5 0 @@ -1672,7 +1667,7 @@ 20 C0 ENDCHAR -STARTCHAR 0x007E +STARTCHAR C126 ENCODING 126 SWIDTH 480 0 DWIDTH 8 0 @@ -1682,14 +1677,14 @@ A8 90 ENDCHAR -STARTCHAR 0x00A0 +STARTCHAR space ENCODING 160 SWIDTH 300 0 DWIDTH 5 0 BBX 0 0 0 0 BITMAP ENDCHAR -STARTCHAR 0x00A1 +STARTCHAR C060 ENCODING 161 SWIDTH 300 0 DWIDTH 5 0 @@ -1708,7 +1703,7 @@ C0 C0 ENDCHAR -STARTCHAR 0x00A2 +STARTCHAR C099 ENCODING 162 SWIDTH 420 0 DWIDTH 7 0 @@ -1726,7 +1721,7 @@ 40 40 ENDCHAR -STARTCHAR 0x00A3 +STARTCHAR C036 ENCODING 163 SWIDTH 540 0 DWIDTH 9 0 @@ -1745,7 +1740,7 @@ B2 CC ENDCHAR -STARTCHAR 0x00A4 +STARTCHAR C111 ENCODING 164 SWIDTH 540 0 DWIDTH 9 0 @@ -1759,7 +1754,7 @@ 7C 82 ENDCHAR -STARTCHAR 0x00A5 +STARTCHAR C089 ENCODING 165 SWIDTH 720 0 DWIDTH 12 0 @@ -1777,7 +1772,7 @@ 0400 1F00 ENDCHAR -STARTCHAR 0x00A6 +STARTCHAR char123 ENCODING 166 SWIDTH 180 0 DWIDTH 3 0 @@ -1800,7 +1795,7 @@ 80 80 ENDCHAR -STARTCHAR 0x00A7 +STARTCHAR char167 ENCODING 167 SWIDTH 360 0 DWIDTH 6 0 @@ -1820,7 +1815,7 @@ 90 60 ENDCHAR -STARTCHAR 0x00A8 +STARTCHAR C127 ENCODING 168 SWIDTH 360 0 DWIDTH 6 0 @@ -1829,7 +1824,7 @@ D8 D8 ENDCHAR -STARTCHAR 0x00A9 +STARTCHAR C099 ENCODING 169 SWIDTH 600 0 DWIDTH 10 0 @@ -1846,7 +1841,7 @@ 4100 3E00 ENDCHAR -STARTCHAR 0x00AA +STARTCHAR char170 ENCODING 170 SWIDTH 300 0 DWIDTH 5 0 @@ -1859,7 +1854,7 @@ 70 F0 ENDCHAR -STARTCHAR 0x00AB +STARTCHAR char171 ENCODING 171 SWIDTH 540 0 DWIDTH 9 0 @@ -1873,7 +1868,7 @@ 24 12 ENDCHAR -STARTCHAR 0x00AC +STARTCHAR char172 ENCODING 172 SWIDTH 480 0 DWIDTH 8 0 @@ -1884,7 +1879,7 @@ 04 04 ENDCHAR -STARTCHAR 0x00AD +STARTCHAR C045 ENCODING 173 SWIDTH 300 0 DWIDTH 5 0 @@ -1892,7 +1887,7 @@ BITMAP E0 ENDCHAR -STARTCHAR 0x00AE +STARTCHAR C099 ENCODING 174 SWIDTH 600 0 DWIDTH 10 0 @@ -1909,7 +1904,7 @@ 4100 3E00 ENDCHAR -STARTCHAR 0x00AF +STARTCHAR C022 ENCODING 175 SWIDTH 420 0 DWIDTH 7 0 @@ -1917,7 +1912,7 @@ BITMAP F8 ENDCHAR -STARTCHAR 0x00B0 +STARTCHAR C023 ENCODING 176 SWIDTH 360 0 DWIDTH 6 0 @@ -1928,7 +1923,7 @@ 90 60 ENDCHAR -STARTCHAR 0x00B1 +STARTCHAR char177 ENCODING 177 SWIDTH 540 0 DWIDTH 9 0 @@ -1944,7 +1939,7 @@ 00 FE ENDCHAR -STARTCHAR 0x00B2 +STARTCHAR char178 ENCODING 178 SWIDTH 300 0 DWIDTH 5 0 @@ -1958,7 +1953,7 @@ 40 F0 ENDCHAR -STARTCHAR 0x00B3 +STARTCHAR char179 ENCODING 179 SWIDTH 300 0 DWIDTH 5 0 @@ -1972,7 +1967,7 @@ 90 60 ENDCHAR -STARTCHAR 0x00B4 +STARTCHAR C019 ENCODING 180 SWIDTH 360 0 DWIDTH 6 0 @@ -1983,7 +1978,7 @@ 40 80 ENDCHAR -STARTCHAR 0x00B5 +STARTCHAR C104 ENCODING 181 SWIDTH 480 0 DWIDTH 8 0 @@ -2000,7 +1995,7 @@ 80 80 ENDCHAR -STARTCHAR 0x00B6 +STARTCHAR char182 ENCODING 182 SWIDTH 480 0 DWIDTH 8 0 @@ -2022,7 +2017,7 @@ 14 14 ENDCHAR -STARTCHAR 0x00B7 +STARTCHAR char183 ENCODING 183 SWIDTH 240 0 DWIDTH 4 0 @@ -2031,7 +2026,7 @@ C0 C0 ENDCHAR -STARTCHAR 0x00B8 +STARTCHAR C024 ENCODING 184 SWIDTH 420 0 DWIDTH 7 0 @@ -2041,7 +2036,7 @@ 20 E0 ENDCHAR -STARTCHAR 0x00B9 +STARTCHAR char185 ENCODING 185 SWIDTH 240 0 DWIDTH 4 0 @@ -2055,7 +2050,7 @@ 40 E0 ENDCHAR -STARTCHAR 0x00BA +STARTCHAR char171 ENCODING 186 SWIDTH 300 0 DWIDTH 5 0 @@ -2068,7 +2063,7 @@ 60 F0 ENDCHAR -STARTCHAR 0x00BB +STARTCHAR char171 ENCODING 187 SWIDTH 480 0 DWIDTH 8 0 @@ -2082,7 +2077,7 @@ 48 90 ENDCHAR -STARTCHAR 0x00BC +STARTCHAR char185 ENCODING 188 SWIDTH 720 0 DWIDTH 12 0 @@ -2100,7 +2095,7 @@ 1040 10E0 ENDCHAR -STARTCHAR 0x00BD +STARTCHAR char185 ENCODING 189 SWIDTH 720 0 DWIDTH 12 0 @@ -2118,7 +2113,7 @@ 1080 11E0 ENDCHAR -STARTCHAR 0x00BE +STARTCHAR char185 ENCODING 190 SWIDTH 780 0 DWIDTH 13 0 @@ -2136,7 +2131,7 @@ 0820 0870 ENDCHAR -STARTCHAR 0x00BF +STARTCHAR C062 ENCODING 191 SWIDTH 480 0 DWIDTH 8 0 @@ -2155,7 +2150,7 @@ 88 70 ENDCHAR -STARTCHAR 0x00C0 +STARTCHAR C065 ENCODING 192 SWIDTH 660 0 DWIDTH 11 0 @@ -2178,7 +2173,7 @@ 2080 F1E0 ENDCHAR -STARTCHAR 0x00C1 +STARTCHAR C065 ENCODING 193 SWIDTH 660 0 DWIDTH 11 0 @@ -2201,7 +2196,7 @@ 2080 F1E0 ENDCHAR -STARTCHAR 0x00C2 +STARTCHAR C065 ENCODING 194 SWIDTH 660 0 DWIDTH 11 0 @@ -2223,7 +2218,7 @@ 2080 F1E0 ENDCHAR -STARTCHAR 0x00C3 +STARTCHAR C065 ENCODING 195 SWIDTH 660 0 DWIDTH 11 0 @@ -2245,7 +2240,7 @@ 2080 F1E0 ENDCHAR -STARTCHAR 0x00C4 +STARTCHAR C065 ENCODING 196 SWIDTH 660 0 DWIDTH 11 0 @@ -2266,7 +2261,7 @@ 2080 F1E0 ENDCHAR -STARTCHAR 0x00C5 +STARTCHAR C065 ENCODING 197 SWIDTH 660 0 DWIDTH 11 0 @@ -2288,7 +2283,7 @@ 2080 F1E0 ENDCHAR -STARTCHAR 0x00C6 +STARTCHAR C029 ENCODING 198 SWIDTH 900 0 DWIDTH 15 0 @@ -2306,7 +2301,7 @@ 2208 F7F8 ENDCHAR -STARTCHAR 0x00C7 +STARTCHAR C067 ENCODING 199 SWIDTH 600 0 DWIDTH 10 0 @@ -2327,7 +2322,7 @@ 0400 1C00 ENDCHAR -STARTCHAR 0x00C8 +STARTCHAR C069 ENCODING 200 SWIDTH 660 0 DWIDTH 11 0 @@ -2350,7 +2345,7 @@ 2080 FF80 ENDCHAR -STARTCHAR 0x00C9 +STARTCHAR C069 ENCODING 201 SWIDTH 660 0 DWIDTH 11 0 @@ -2373,7 +2368,7 @@ 2080 FF80 ENDCHAR -STARTCHAR 0x00CA +STARTCHAR C069 ENCODING 202 SWIDTH 660 0 DWIDTH 11 0 @@ -2395,7 +2390,7 @@ 2080 FF80 ENDCHAR -STARTCHAR 0x00CB +STARTCHAR C069 ENCODING 203 SWIDTH 660 0 DWIDTH 11 0 @@ -2416,7 +2411,7 @@ 2080 FF80 ENDCHAR -STARTCHAR 0x00CC +STARTCHAR C073 ENCODING 204 SWIDTH 360 0 DWIDTH 6 0 @@ -2439,7 +2434,7 @@ 20 F8 ENDCHAR -STARTCHAR 0x00CD +STARTCHAR C073 ENCODING 205 SWIDTH 360 0 DWIDTH 6 0 @@ -2462,7 +2457,7 @@ 20 F8 ENDCHAR -STARTCHAR 0x00CE +STARTCHAR C073 ENCODING 206 SWIDTH 360 0 DWIDTH 6 0 @@ -2484,7 +2479,7 @@ 20 F8 ENDCHAR -STARTCHAR 0x00CF +STARTCHAR C073 ENCODING 207 SWIDTH 360 0 DWIDTH 6 0 @@ -2505,7 +2500,7 @@ 20 F8 ENDCHAR -STARTCHAR 0x00D0 +STARTCHAR C032 ENCODING 208 SWIDTH 660 0 DWIDTH 11 0 @@ -2523,7 +2518,7 @@ 2180 FE00 ENDCHAR -STARTCHAR 0x00D1 +STARTCHAR C078 ENCODING 209 SWIDTH 720 0 DWIDTH 12 0 @@ -2545,7 +2540,7 @@ 2180 F880 ENDCHAR -STARTCHAR 0x00D2 +STARTCHAR C079 ENCODING 210 SWIDTH 720 0 DWIDTH 12 0 @@ -2568,7 +2563,7 @@ 2100 1E00 ENDCHAR -STARTCHAR 0x00D3 +STARTCHAR C079 ENCODING 211 SWIDTH 720 0 DWIDTH 12 0 @@ -2591,7 +2586,7 @@ 2100 1E00 ENDCHAR -STARTCHAR 0x00D4 +STARTCHAR C079 ENCODING 212 SWIDTH 720 0 DWIDTH 12 0 @@ -2613,7 +2608,7 @@ 2100 1E00 ENDCHAR -STARTCHAR 0x00D5 +STARTCHAR C079 ENCODING 213 SWIDTH 720 0 DWIDTH 12 0 @@ -2635,7 +2630,7 @@ 2100 1E00 ENDCHAR -STARTCHAR 0x00D6 +STARTCHAR C079 ENCODING 214 SWIDTH 720 0 DWIDTH 12 0 @@ -2656,7 +2651,7 @@ 2100 1E00 ENDCHAR -STARTCHAR 0x00D7 +STARTCHAR char215 ENCODING 215 SWIDTH 540 0 DWIDTH 9 0 @@ -2670,7 +2665,7 @@ 44 82 ENDCHAR -STARTCHAR 0x00D8 +STARTCHAR C031 ENCODING 216 SWIDTH 720 0 DWIDTH 12 0 @@ -2690,7 +2685,7 @@ 3E00 4000 ENDCHAR -STARTCHAR 0x00D9 +STARTCHAR C085 ENCODING 217 SWIDTH 720 0 DWIDTH 12 0 @@ -2713,7 +2708,7 @@ 1100 0E00 ENDCHAR -STARTCHAR 0x00DA +STARTCHAR C085 ENCODING 218 SWIDTH 720 0 DWIDTH 12 0 @@ -2736,7 +2731,7 @@ 1100 0E00 ENDCHAR -STARTCHAR 0x00DB +STARTCHAR C085 ENCODING 219 SWIDTH 720 0 DWIDTH 12 0 @@ -2758,7 +2753,7 @@ 1100 0E00 ENDCHAR -STARTCHAR 0x00DC +STARTCHAR C085 ENCODING 220 SWIDTH 720 0 DWIDTH 12 0 @@ -2779,7 +2774,7 @@ 1100 0E00 ENDCHAR -STARTCHAR 0x00DD +STARTCHAR C089 ENCODING 221 SWIDTH 720 0 DWIDTH 12 0 @@ -2802,7 +2797,7 @@ 0400 1F00 ENDCHAR -STARTCHAR 0x00DE +STARTCHAR C030 ENCODING 222 SWIDTH 600 0 DWIDTH 10 0 @@ -2820,7 +2815,7 @@ 2000 F800 ENDCHAR -STARTCHAR 0x00DF +STARTCHAR C025 ENCODING 223 SWIDTH 420 0 DWIDTH 7 0 @@ -2839,7 +2834,7 @@ 44 D8 ENDCHAR -STARTCHAR 0x00E0 +STARTCHAR C097 ENCODING 224 SWIDTH 420 0 DWIDTH 7 0 @@ -2858,7 +2853,7 @@ 88 7C ENDCHAR -STARTCHAR 0x00E1 +STARTCHAR C097 ENCODING 225 SWIDTH 420 0 DWIDTH 7 0 @@ -2877,7 +2872,7 @@ 88 7C ENDCHAR -STARTCHAR 0x00E2 +STARTCHAR C097 ENCODING 226 SWIDTH 420 0 DWIDTH 7 0 @@ -2895,7 +2890,7 @@ 88 7C ENDCHAR -STARTCHAR 0x00E3 +STARTCHAR C097 ENCODING 227 SWIDTH 420 0 DWIDTH 7 0 @@ -2913,7 +2908,7 @@ 88 7C ENDCHAR -STARTCHAR 0x00E4 +STARTCHAR C097 ENCODING 228 SWIDTH 420 0 DWIDTH 7 0 @@ -2930,7 +2925,7 @@ 88 7C ENDCHAR -STARTCHAR 0x00E5 +STARTCHAR C097 ENCODING 229 SWIDTH 420 0 DWIDTH 7 0 @@ -2948,7 +2943,7 @@ 88 7C ENDCHAR -STARTCHAR 0x00E6 +STARTCHAR C026 ENCODING 230 SWIDTH 660 0 DWIDTH 11 0 @@ -2962,7 +2957,7 @@ 8C40 7380 ENDCHAR -STARTCHAR 0x00E7 +STARTCHAR C099 ENCODING 231 SWIDTH 360 0 DWIDTH 6 0 @@ -2979,7 +2974,7 @@ 10 70 ENDCHAR -STARTCHAR 0x00E8 +STARTCHAR C101 ENCODING 232 SWIDTH 360 0 DWIDTH 6 0 @@ -2998,7 +2993,7 @@ 88 70 ENDCHAR -STARTCHAR 0x00E9 +STARTCHAR C101 ENCODING 233 SWIDTH 360 0 DWIDTH 6 0 @@ -3017,7 +3012,7 @@ 88 70 ENDCHAR -STARTCHAR 0x00EA +STARTCHAR C101 ENCODING 234 SWIDTH 360 0 DWIDTH 6 0 @@ -3035,7 +3030,7 @@ 88 70 ENDCHAR -STARTCHAR 0x00EB +STARTCHAR C101 ENCODING 235 SWIDTH 360 0 DWIDTH 6 0 @@ -3052,7 +3047,7 @@ 88 70 ENDCHAR -STARTCHAR 0x00EC +STARTCHAR C105 ENCODING 236 SWIDTH 240 0 DWIDTH 4 0 @@ -3071,7 +3066,7 @@ 20 70 ENDCHAR -STARTCHAR 0x00ED +STARTCHAR C105 ENCODING 237 SWIDTH 240 0 DWIDTH 4 0 @@ -3090,7 +3085,7 @@ 40 E0 ENDCHAR -STARTCHAR 0x00EE +STARTCHAR C105 ENCODING 238 SWIDTH 300 0 DWIDTH 5 0 @@ -3108,7 +3103,7 @@ 20 70 ENDCHAR -STARTCHAR 0x00EF +STARTCHAR C105 ENCODING 239 SWIDTH 360 0 DWIDTH 6 0 @@ -3125,7 +3120,7 @@ 20 70 ENDCHAR -STARTCHAR 0x00F0 +STARTCHAR C031 ENCODING 240 SWIDTH 360 0 DWIDTH 6 0 @@ -3144,7 +3139,7 @@ 88 70 ENDCHAR -STARTCHAR 0x00F1 +STARTCHAR C110 ENCODING 241 SWIDTH 480 0 DWIDTH 8 0 @@ -3162,7 +3157,7 @@ 44 EE ENDCHAR -STARTCHAR 0x00F2 +STARTCHAR C111 ENCODING 242 SWIDTH 360 0 DWIDTH 6 0 @@ -3181,7 +3176,7 @@ 88 70 ENDCHAR -STARTCHAR 0x00F3 +STARTCHAR C111 ENCODING 243 SWIDTH 360 0 DWIDTH 6 0 @@ -3200,7 +3195,7 @@ 88 70 ENDCHAR -STARTCHAR 0x00F4 +STARTCHAR C111 ENCODING 244 SWIDTH 360 0 DWIDTH 6 0 @@ -3218,7 +3213,7 @@ 88 70 ENDCHAR -STARTCHAR 0x00F5 +STARTCHAR C111 ENCODING 245 SWIDTH 360 0 DWIDTH 6 0 @@ -3236,7 +3231,7 @@ 88 70 ENDCHAR -STARTCHAR 0x00F6 +STARTCHAR C111 ENCODING 246 SWIDTH 360 0 DWIDTH 6 0 @@ -3253,7 +3248,7 @@ 88 70 ENDCHAR -STARTCHAR 0x00F7 +STARTCHAR char247 ENCODING 247 SWIDTH 660 0 DWIDTH 11 0 @@ -3267,7 +3262,7 @@ 0800 0800 ENDCHAR -STARTCHAR 0x00F8 +STARTCHAR C028 ENCODING 248 SWIDTH 360 0 DWIDTH 6 0 @@ -3285,7 +3280,7 @@ 40 80 ENDCHAR -STARTCHAR 0x00F9 +STARTCHAR C117 ENCODING 249 SWIDTH 480 0 DWIDTH 8 0 @@ -3304,7 +3299,7 @@ 44 3E ENDCHAR -STARTCHAR 0x00FA +STARTCHAR C117 ENCODING 250 SWIDTH 480 0 DWIDTH 8 0 @@ -3323,7 +3318,7 @@ 44 3E ENDCHAR -STARTCHAR 0x00FB +STARTCHAR C117 ENCODING 251 SWIDTH 480 0 DWIDTH 8 0 @@ -3341,7 +3336,7 @@ 44 3E ENDCHAR -STARTCHAR 0x00FC +STARTCHAR C117 ENCODING 252 SWIDTH 480 0 DWIDTH 8 0 @@ -3358,7 +3353,7 @@ 44 3E ENDCHAR -STARTCHAR 0x00FD +STARTCHAR C121 ENCODING 253 SWIDTH 480 0 DWIDTH 8 0 @@ -3380,7 +3375,7 @@ 90 E0 ENDCHAR -STARTCHAR 0x00FE +STARTCHAR C028 ENCODING 254 SWIDTH 420 0 DWIDTH 7 0 @@ -3402,7 +3397,7 @@ 40 E0 ENDCHAR -STARTCHAR 0x00FF +STARTCHAR C121 ENCODING 255 SWIDTH 480 0 DWIDTH 8 0 @@ -3422,7 +3417,7 @@ 90 E0 ENDCHAR -STARTCHAR 0x0100 +STARTCHAR C065 ENCODING 256 SWIDTH 660 0 DWIDTH 11 0 @@ -3442,7 +3437,7 @@ 2080 F1E0 ENDCHAR -STARTCHAR 0x0101 +STARTCHAR C097 ENCODING 257 SWIDTH 420 0 DWIDTH 7 0 @@ -3458,7 +3453,7 @@ 88 7C ENDCHAR -STARTCHAR 0x0102 +STARTCHAR C065 ENCODING 258 SWIDTH 660 0 DWIDTH 11 0 @@ -3479,7 +3474,7 @@ 2080 F1E0 ENDCHAR -STARTCHAR 0x0103 +STARTCHAR C097 ENCODING 259 SWIDTH 420 0 DWIDTH 7 0 @@ -3496,7 +3491,7 @@ 88 7C ENDCHAR -STARTCHAR 0x0104 +STARTCHAR C065 ENCODING 260 SWIDTH 660 0 DWIDTH 11 0 @@ -3517,7 +3512,7 @@ 0120 00C0 ENDCHAR -STARTCHAR 0x0105 +STARTCHAR C097 ENCODING 261 SWIDTH 420 0 DWIDTH 7 0 @@ -3534,7 +3529,7 @@ 12 0C ENDCHAR -STARTCHAR 0x0106 +STARTCHAR C067 ENCODING 262 SWIDTH 660 0 DWIDTH 11 0 @@ -3557,7 +3552,7 @@ 2100 1E00 ENDCHAR -STARTCHAR 0x0107 +STARTCHAR C099 ENCODING 263 SWIDTH 360 0 DWIDTH 6 0 @@ -3576,7 +3571,7 @@ 88 70 ENDCHAR -STARTCHAR 0x0108 +STARTCHAR C067 ENCODING 264 SWIDTH 660 0 DWIDTH 11 0 @@ -3598,7 +3593,7 @@ 2100 1E00 ENDCHAR -STARTCHAR 0x0109 +STARTCHAR C099 ENCODING 265 SWIDTH 360 0 DWIDTH 6 0 @@ -3616,7 +3611,7 @@ 88 70 ENDCHAR -STARTCHAR 0x010A +STARTCHAR C067 ENCODING 266 SWIDTH 660 0 DWIDTH 11 0 @@ -3637,7 +3632,7 @@ 2100 1E00 ENDCHAR -STARTCHAR 0x010B +STARTCHAR C099 ENCODING 267 SWIDTH 360 0 DWIDTH 6 0 @@ -3654,7 +3649,7 @@ 88 70 ENDCHAR -STARTCHAR 0x010C +STARTCHAR C067 ENCODING 268 SWIDTH 660 0 DWIDTH 11 0 @@ -3676,7 +3671,7 @@ 2100 1E00 ENDCHAR -STARTCHAR 0x010D +STARTCHAR C099 ENCODING 269 SWIDTH 360 0 DWIDTH 6 0 @@ -3694,7 +3689,7 @@ 88 70 ENDCHAR -STARTCHAR 0x010E +STARTCHAR C032 ENCODING 270 SWIDTH 720 0 DWIDTH 12 0 @@ -3716,17 +3711,21 @@ 2180 FF00 ENDCHAR -STARTCHAR 0x010F +STARTCHAR C100 ENCODING 271 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 8 12 1 0 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 6 16 1 0 BITMAP -1B -0B -09 -09 -0A +88 +70 +20 +00 +18 +08 +08 +08 +08 78 48 88 @@ -3735,7 +3734,7 @@ 48 7C ENDCHAR -STARTCHAR 0x0110 +STARTCHAR C032 ENCODING 272 SWIDTH 720 0 DWIDTH 12 0 @@ -3753,7 +3752,7 @@ 2180 FF00 ENDCHAR -STARTCHAR 0x0111 +STARTCHAR C100 ENCODING 273 SWIDTH 420 0 DWIDTH 7 0 @@ -3772,7 +3771,7 @@ 48 7C ENDCHAR -STARTCHAR 0x0112 +STARTCHAR C069 ENCODING 274 SWIDTH 660 0 DWIDTH 11 0 @@ -3792,7 +3791,7 @@ 2080 FF80 ENDCHAR -STARTCHAR 0x0113 +STARTCHAR C101 ENCODING 275 SWIDTH 360 0 DWIDTH 6 0 @@ -3808,7 +3807,7 @@ 88 70 ENDCHAR -STARTCHAR 0x0114 +STARTCHAR C069 ENCODING 276 SWIDTH 660 0 DWIDTH 11 0 @@ -3829,7 +3828,7 @@ 2080 FF80 ENDCHAR -STARTCHAR 0x0115 +STARTCHAR C101 ENCODING 277 SWIDTH 360 0 DWIDTH 6 0 @@ -3846,7 +3845,7 @@ 88 70 ENDCHAR -STARTCHAR 0x0116 +STARTCHAR C069 ENCODING 278 SWIDTH 660 0 DWIDTH 11 0 @@ -3867,7 +3866,7 @@ 2080 FF80 ENDCHAR -STARTCHAR 0x0117 +STARTCHAR C101 ENCODING 279 SWIDTH 360 0 DWIDTH 6 0 @@ -3884,7 +3883,7 @@ 88 70 ENDCHAR -STARTCHAR 0x0118 +STARTCHAR C069 ENCODING 280 SWIDTH 660 0 DWIDTH 11 0 @@ -3905,7 +3904,7 @@ 1200 0C00 ENDCHAR -STARTCHAR 0x0119 +STARTCHAR C101 ENCODING 281 SWIDTH 360 0 DWIDTH 6 0 @@ -3922,7 +3921,7 @@ 90 60 ENDCHAR -STARTCHAR 0x011A +STARTCHAR C069 ENCODING 282 SWIDTH 660 0 DWIDTH 11 0 @@ -3944,7 +3943,7 @@ 2080 FF80 ENDCHAR -STARTCHAR 0x011B +STARTCHAR C101 ENCODING 283 SWIDTH 360 0 DWIDTH 6 0 @@ -3962,7 +3961,7 @@ 88 70 ENDCHAR -STARTCHAR 0x011C +STARTCHAR C071 ENCODING 284 SWIDTH 780 0 DWIDTH 13 0 @@ -3984,7 +3983,7 @@ 2080 1F80 ENDCHAR -STARTCHAR 0x011D +STARTCHAR C103 ENCODING 285 SWIDTH 480 0 DWIDTH 8 0 @@ -4006,7 +4005,7 @@ C6 38 ENDCHAR -STARTCHAR 0x011E +STARTCHAR C071 ENCODING 286 SWIDTH 780 0 DWIDTH 13 0 @@ -4027,7 +4026,7 @@ 2080 1F80 ENDCHAR -STARTCHAR 0x011F +STARTCHAR C103 ENCODING 287 SWIDTH 480 0 DWIDTH 8 0 @@ -4048,7 +4047,7 @@ C6 38 ENDCHAR -STARTCHAR 0x0120 +STARTCHAR C071 ENCODING 288 SWIDTH 780 0 DWIDTH 13 0 @@ -4069,7 +4068,7 @@ 2080 1F80 ENDCHAR -STARTCHAR 0x0121 +STARTCHAR C103 ENCODING 289 SWIDTH 480 0 DWIDTH 8 0 @@ -4090,7 +4089,7 @@ C6 38 ENDCHAR -STARTCHAR 0x0122 +STARTCHAR C071 ENCODING 290 SWIDTH 780 0 DWIDTH 13 0 @@ -4111,7 +4110,7 @@ 0400 1C00 ENDCHAR -STARTCHAR 0x0123 +STARTCHAR C103 ENCODING 291 SWIDTH 480 0 DWIDTH 8 0 @@ -4136,7 +4135,7 @@ C6 38 ENDCHAR -STARTCHAR 0x0124 +STARTCHAR C072 ENCODING 292 SWIDTH 720 0 DWIDTH 12 0 @@ -4158,7 +4157,7 @@ 2080 FBE0 ENDCHAR -STARTCHAR 0x0125 +STARTCHAR C104 ENCODING 293 SWIDTH 480 0 DWIDTH 8 0 @@ -4181,7 +4180,7 @@ 44 EE ENDCHAR -STARTCHAR 0x0126 +STARTCHAR C072 ENCODING 294 SWIDTH 720 0 DWIDTH 12 0 @@ -4199,7 +4198,7 @@ 2080 FBE0 ENDCHAR -STARTCHAR 0x0127 +STARTCHAR C104 ENCODING 295 SWIDTH 480 0 DWIDTH 8 0 @@ -4218,7 +4217,7 @@ 44 EE ENDCHAR -STARTCHAR 0x0128 +STARTCHAR C073 ENCODING 296 SWIDTH 360 0 DWIDTH 6 0 @@ -4240,7 +4239,7 @@ 20 F8 ENDCHAR -STARTCHAR 0x0129 +STARTCHAR C105 ENCODING 297 SWIDTH 240 0 DWIDTH 4 0 @@ -4258,7 +4257,7 @@ 20 70 ENDCHAR -STARTCHAR 0x012A +STARTCHAR C073 ENCODING 298 SWIDTH 360 0 DWIDTH 6 0 @@ -4278,7 +4277,7 @@ 20 F8 ENDCHAR -STARTCHAR 0x012B +STARTCHAR C105 ENCODING 299 SWIDTH 240 0 DWIDTH 4 0 @@ -4294,7 +4293,7 @@ 20 70 ENDCHAR -STARTCHAR 0x012C +STARTCHAR C073 ENCODING 300 SWIDTH 360 0 DWIDTH 6 0 @@ -4315,7 +4314,7 @@ 10 7C ENDCHAR -STARTCHAR 0x012D +STARTCHAR C105 ENCODING 301 SWIDTH 240 0 DWIDTH 4 0 @@ -4333,7 +4332,7 @@ 10 38 ENDCHAR -STARTCHAR 0x012E +STARTCHAR C073 ENCODING 302 SWIDTH 360 0 DWIDTH 6 0 @@ -4375,7 +4374,7 @@ 90 60 ENDCHAR -STARTCHAR 0x0130 +STARTCHAR C073 ENCODING 304 SWIDTH 360 0 DWIDTH 6 0 @@ -4396,7 +4395,7 @@ 20 F8 ENDCHAR -STARTCHAR 0x0131 +STARTCHAR C016 ENCODING 305 SWIDTH 240 0 DWIDTH 4 0 @@ -4410,7 +4409,7 @@ 40 E0 ENDCHAR -STARTCHAR 0x0132 +STARTCHAR C073 ENCODING 306 SWIDTH 780 0 DWIDTH 13 0 @@ -4449,7 +4448,7 @@ 12 1C ENDCHAR -STARTCHAR 0x0134 +STARTCHAR C074 ENCODING 308 SWIDTH 480 0 DWIDTH 8 0 @@ -4471,7 +4470,7 @@ 90 E0 ENDCHAR -STARTCHAR 0x0135 +STARTCHAR C106 ENCODING 309 SWIDTH 360 0 DWIDTH 6 0 @@ -4492,7 +4491,7 @@ 90 E0 ENDCHAR -STARTCHAR 0x0136 +STARTCHAR C075 ENCODING 310 SWIDTH 720 0 DWIDTH 12 0 @@ -4513,7 +4512,7 @@ 0800 3800 ENDCHAR -STARTCHAR 0x0137 +STARTCHAR C107 ENCODING 311 SWIDTH 480 0 DWIDTH 8 0 @@ -4535,7 +4534,7 @@ 20 E0 ENDCHAR -STARTCHAR 0x0138 +STARTCHAR C075 ENCODING 312 SWIDTH 480 0 DWIDTH 8 0 @@ -4549,7 +4548,7 @@ 48 E6 ENDCHAR -STARTCHAR 0x0139 +STARTCHAR C076 ENCODING 313 SWIDTH 600 0 DWIDTH 10 0 @@ -4572,7 +4571,7 @@ 23 FF ENDCHAR -STARTCHAR 0x013A +STARTCHAR C108 ENCODING 314 SWIDTH 240 0 DWIDTH 4 0 @@ -4596,7 +4595,7 @@ 40 E0 ENDCHAR -STARTCHAR 0x013B +STARTCHAR C076 ENCODING 315 SWIDTH 600 0 DWIDTH 10 0 @@ -4617,7 +4616,7 @@ 04 1C ENDCHAR -STARTCHAR 0x013C +STARTCHAR C108 ENCODING 316 SWIDTH 240 0 DWIDTH 4 0 @@ -4639,7 +4638,7 @@ 20 E0 ENDCHAR -STARTCHAR 0x013D +STARTCHAR C076 ENCODING 317 SWIDTH 600 0 DWIDTH 10 0 @@ -4661,26 +4660,30 @@ 23 FF ENDCHAR -STARTCHAR 0x013E +STARTCHAR C108 ENCODING 318 -SWIDTH 360 0 -DWIDTH 6 0 -BBX 5 12 1 0 +SWIDTH 240 0 +DWIDTH 4 0 +BBX 5 16 0 0 BITMAP -D8 -58 -48 -48 -50 -40 -40 -40 -40 -40 -40 -E0 +88 +70 +20 +00 +60 +20 +20 +20 +20 +20 +20 +20 +20 +20 +20 +70 ENDCHAR -STARTCHAR 0x013F +STARTCHAR C076 ENCODING 319 SWIDTH 600 0 DWIDTH 10 0 @@ -4698,7 +4701,7 @@ 23 FF ENDCHAR -STARTCHAR 0x0140 +STARTCHAR C108 ENCODING 320 SWIDTH 360 0 DWIDTH 6 0 @@ -4717,7 +4720,7 @@ 40 E0 ENDCHAR -STARTCHAR 0x0141 +STARTCHAR C076 ENCODING 321 SWIDTH 600 0 DWIDTH 10 0 @@ -4735,7 +4738,7 @@ 23 FF ENDCHAR -STARTCHAR 0x0142 +STARTCHAR C108 ENCODING 322 SWIDTH 240 0 DWIDTH 4 0 @@ -4754,7 +4757,7 @@ 20 70 ENDCHAR -STARTCHAR 0x0143 +STARTCHAR C078 ENCODING 323 SWIDTH 720 0 DWIDTH 12 0 @@ -4777,7 +4780,7 @@ 2180 F880 ENDCHAR -STARTCHAR 0x0144 +STARTCHAR C110 ENCODING 324 SWIDTH 480 0 DWIDTH 8 0 @@ -4796,7 +4799,7 @@ 44 EE ENDCHAR -STARTCHAR 0x0145 +STARTCHAR C078 ENCODING 325 SWIDTH 720 0 DWIDTH 12 0 @@ -4817,7 +4820,7 @@ 0800 3800 ENDCHAR -STARTCHAR 0x0146 +STARTCHAR C110 ENCODING 326 SWIDTH 480 0 DWIDTH 8 0 @@ -4834,7 +4837,7 @@ 20 E0 ENDCHAR -STARTCHAR 0x0147 +STARTCHAR C078 ENCODING 327 SWIDTH 720 0 DWIDTH 12 0 @@ -4856,7 +4859,7 @@ 2180 F880 ENDCHAR -STARTCHAR 0x0148 +STARTCHAR C110 ENCODING 328 SWIDTH 480 0 DWIDTH 8 0 @@ -4874,7 +4877,7 @@ 44 EE ENDCHAR -STARTCHAR 0x0149 +STARTCHAR C110 ENCODING 329 SWIDTH 480 0 DWIDTH 8 0 @@ -4894,7 +4897,7 @@ 44 EE ENDCHAR -STARTCHAR 0x014A +STARTCHAR C078 ENCODING 330 SWIDTH 720 0 DWIDTH 12 0 @@ -4915,7 +4918,7 @@ 0480 0700 ENDCHAR -STARTCHAR 0x014B +STARTCHAR C110 ENCODING 331 SWIDTH 420 0 DWIDTH 7 0 @@ -4932,7 +4935,7 @@ 14 18 ENDCHAR -STARTCHAR 0x014C +STARTCHAR C079 ENCODING 332 SWIDTH 720 0 DWIDTH 12 0 @@ -4952,7 +4955,7 @@ 2100 1E00 ENDCHAR -STARTCHAR 0x014D +STARTCHAR C111 ENCODING 333 SWIDTH 360 0 DWIDTH 6 0 @@ -4968,7 +4971,7 @@ 88 70 ENDCHAR -STARTCHAR 0x014E +STARTCHAR C079 ENCODING 334 SWIDTH 720 0 DWIDTH 12 0 @@ -4989,7 +4992,7 @@ 2100 1E00 ENDCHAR -STARTCHAR 0x014F +STARTCHAR C111 ENCODING 335 SWIDTH 360 0 DWIDTH 6 0 @@ -5006,7 +5009,7 @@ 88 70 ENDCHAR -STARTCHAR 0x0150 +STARTCHAR C079 ENCODING 336 SWIDTH 720 0 DWIDTH 12 0 @@ -5029,7 +5032,7 @@ 2100 1E00 ENDCHAR -STARTCHAR 0x0151 +STARTCHAR C111 ENCODING 337 SWIDTH 360 0 DWIDTH 6 0 @@ -5048,7 +5051,7 @@ 88 70 ENDCHAR -STARTCHAR 0x0152 +STARTCHAR C030 ENCODING 338 SWIDTH 900 0 DWIDTH 15 0 @@ -5066,7 +5069,7 @@ 6308 1FF8 ENDCHAR -STARTCHAR 0x0153 +STARTCHAR C027 ENCODING 339 SWIDTH 720 0 DWIDTH 12 0 @@ -5080,7 +5083,7 @@ 4A20 31C0 ENDCHAR -STARTCHAR 0x0154 +STARTCHAR C082 ENCODING 340 SWIDTH 660 0 DWIDTH 11 0 @@ -5103,7 +5106,7 @@ 2100 F8E0 ENDCHAR -STARTCHAR 0x0155 +STARTCHAR C114 ENCODING 341 SWIDTH 360 0 DWIDTH 6 0 @@ -5122,7 +5125,7 @@ 40 F0 ENDCHAR -STARTCHAR 0x0156 +STARTCHAR C082 ENCODING 342 SWIDTH 660 0 DWIDTH 11 0 @@ -5143,7 +5146,7 @@ 0800 3800 ENDCHAR -STARTCHAR 0x0157 +STARTCHAR C114 ENCODING 343 SWIDTH 360 0 DWIDTH 6 0 @@ -5160,7 +5163,7 @@ 10 70 ENDCHAR -STARTCHAR 0x0158 +STARTCHAR C082 ENCODING 344 SWIDTH 660 0 DWIDTH 11 0 @@ -5182,7 +5185,7 @@ 2100 F8E0 ENDCHAR -STARTCHAR 0x0159 +STARTCHAR C114 ENCODING 345 SWIDTH 360 0 DWIDTH 6 0 @@ -5200,7 +5203,7 @@ 40 F0 ENDCHAR -STARTCHAR 0x015A +STARTCHAR C083 ENCODING 346 SWIDTH 480 0 DWIDTH 8 0 @@ -5223,7 +5226,7 @@ 84 F8 ENDCHAR -STARTCHAR 0x015B +STARTCHAR C115 ENCODING 347 SWIDTH 360 0 DWIDTH 6 0 @@ -5242,7 +5245,7 @@ 88 F0 ENDCHAR -STARTCHAR 0x015C +STARTCHAR C083 ENCODING 348 SWIDTH 480 0 DWIDTH 8 0 @@ -5264,7 +5267,7 @@ 84 F8 ENDCHAR -STARTCHAR 0x015D +STARTCHAR C115 ENCODING 349 SWIDTH 360 0 DWIDTH 6 0 @@ -5282,7 +5285,7 @@ 88 F0 ENDCHAR -STARTCHAR 0x015E +STARTCHAR C083 ENCODING 350 SWIDTH 480 0 DWIDTH 8 0 @@ -5303,7 +5306,7 @@ 10 70 ENDCHAR -STARTCHAR 0x015F +STARTCHAR C115 ENCODING 351 SWIDTH 360 0 DWIDTH 6 0 @@ -5320,7 +5323,7 @@ 10 70 ENDCHAR -STARTCHAR 0x0160 +STARTCHAR C083 ENCODING 352 SWIDTH 480 0 DWIDTH 8 0 @@ -5342,7 +5345,7 @@ 84 F8 ENDCHAR -STARTCHAR 0x0161 +STARTCHAR C115 ENCODING 353 SWIDTH 360 0 DWIDTH 6 0 @@ -5360,7 +5363,7 @@ 88 F0 ENDCHAR -STARTCHAR 0x0162 +STARTCHAR C084 ENCODING 354 SWIDTH 660 0 DWIDTH 11 0 @@ -5381,7 +5384,7 @@ 0400 1C00 ENDCHAR -STARTCHAR 0x0163 +STARTCHAR C116 ENCODING 355 SWIDTH 360 0 DWIDTH 6 0 @@ -5401,7 +5404,7 @@ 04 1C ENDCHAR -STARTCHAR 0x0164 +STARTCHAR C084 ENCODING 356 SWIDTH 660 0 DWIDTH 11 0 @@ -5423,7 +5426,7 @@ 0800 3E00 ENDCHAR -STARTCHAR 0x0165 +STARTCHAR C116 ENCODING 357 SWIDTH 360 0 DWIDTH 6 0 @@ -5444,7 +5447,7 @@ 24 18 ENDCHAR -STARTCHAR 0x0166 +STARTCHAR C084 ENCODING 358 SWIDTH 660 0 DWIDTH 11 0 @@ -5462,7 +5465,7 @@ 0800 3E00 ENDCHAR -STARTCHAR 0x0167 +STARTCHAR C116 ENCODING 359 SWIDTH 360 0 DWIDTH 6 0 @@ -5479,7 +5482,7 @@ 24 18 ENDCHAR -STARTCHAR 0x0168 +STARTCHAR C085 ENCODING 360 SWIDTH 720 0 DWIDTH 12 0 @@ -5501,7 +5504,7 @@ 1100 0E00 ENDCHAR -STARTCHAR 0x0169 +STARTCHAR C117 ENCODING 361 SWIDTH 480 0 DWIDTH 8 0 @@ -5519,7 +5522,7 @@ 44 3E ENDCHAR -STARTCHAR 0x016A +STARTCHAR C085 ENCODING 362 SWIDTH 720 0 DWIDTH 12 0 @@ -5539,7 +5542,7 @@ 1100 0E00 ENDCHAR -STARTCHAR 0x016B +STARTCHAR C117 ENCODING 363 SWIDTH 480 0 DWIDTH 8 0 @@ -5555,7 +5558,7 @@ 44 3E ENDCHAR -STARTCHAR 0x016C +STARTCHAR C085 ENCODING 364 SWIDTH 720 0 DWIDTH 12 0 @@ -5576,7 +5579,7 @@ 1100 0E00 ENDCHAR -STARTCHAR 0x016D +STARTCHAR C117 ENCODING 365 SWIDTH 480 0 DWIDTH 8 0 @@ -5593,7 +5596,7 @@ 44 3E ENDCHAR -STARTCHAR 0x016E +STARTCHAR C085 ENCODING 366 SWIDTH 720 0 DWIDTH 12 0 @@ -5616,7 +5619,7 @@ 1100 0E00 ENDCHAR -STARTCHAR 0x016F +STARTCHAR C117 ENCODING 367 SWIDTH 480 0 DWIDTH 8 0 @@ -5635,7 +5638,7 @@ 44 3E ENDCHAR -STARTCHAR 0x0170 +STARTCHAR C085 ENCODING 368 SWIDTH 720 0 DWIDTH 12 0 @@ -5658,7 +5661,7 @@ 1100 0E00 ENDCHAR -STARTCHAR 0x0171 +STARTCHAR C117 ENCODING 369 SWIDTH 480 0 DWIDTH 8 0 @@ -5677,7 +5680,7 @@ 44 3E ENDCHAR -STARTCHAR 0x0172 +STARTCHAR C085 ENCODING 370 SWIDTH 720 0 DWIDTH 12 0 @@ -5698,7 +5701,7 @@ 0900 0600 ENDCHAR -STARTCHAR 0x0173 +STARTCHAR C117 ENCODING 371 SWIDTH 480 0 DWIDTH 8 0 @@ -5715,7 +5718,7 @@ 09 06 ENDCHAR -STARTCHAR 0x0174 +STARTCHAR C087 ENCODING 372 SWIDTH 1020 0 DWIDTH 17 0 @@ -5737,7 +5740,7 @@ 0C30 0810 ENDCHAR -STARTCHAR 0x0175 +STARTCHAR C119 ENCODING 373 SWIDTH 720 0 DWIDTH 12 0 @@ -5752,10 +5755,10 @@ 2A80 2A80 2A80 -1100 +1B00 1100 ENDCHAR -STARTCHAR 0x0176 +STARTCHAR C089 ENCODING 374 SWIDTH 720 0 DWIDTH 12 0 @@ -5777,7 +5780,7 @@ 0400 1F00 ENDCHAR -STARTCHAR 0x0177 +STARTCHAR C121 ENCODING 375 SWIDTH 480 0 DWIDTH 8 0 @@ -5798,7 +5801,7 @@ 90 E0 ENDCHAR -STARTCHAR 0x0178 +STARTCHAR C089 ENCODING 376 SWIDTH 720 0 DWIDTH 12 0 @@ -5819,7 +5822,7 @@ 0400 1F00 ENDCHAR -STARTCHAR 0x0179 +STARTCHAR C090 ENCODING 377 SWIDTH 480 0 DWIDTH 8 0 @@ -5842,7 +5845,7 @@ 46 FE ENDCHAR -STARTCHAR 0x017A +STARTCHAR C122 ENCODING 378 SWIDTH 360 0 DWIDTH 6 0 @@ -5861,7 +5864,7 @@ 48 F8 ENDCHAR -STARTCHAR 0x017B +STARTCHAR C090 ENCODING 379 SWIDTH 480 0 DWIDTH 8 0 @@ -5882,7 +5885,7 @@ 46 FE ENDCHAR -STARTCHAR 0x017C +STARTCHAR C122 ENCODING 380 SWIDTH 360 0 DWIDTH 6 0 @@ -5899,7 +5902,7 @@ 48 F8 ENDCHAR -STARTCHAR 0x017D +STARTCHAR C090 ENCODING 381 SWIDTH 480 0 DWIDTH 8 0 @@ -5921,7 +5924,7 @@ 46 FE ENDCHAR -STARTCHAR 0x017E +STARTCHAR C122 ENCODING 382 SWIDTH 360 0 DWIDTH 6 0 @@ -5939,7 +5942,7 @@ 48 F8 ENDCHAR -STARTCHAR 0x017F +STARTCHAR C102 ENCODING 383 SWIDTH 360 0 DWIDTH 6 0 @@ -5958,7 +5961,7 @@ 40 E0 ENDCHAR -STARTCHAR 0x0180 +STARTCHAR C098 ENCODING 384 SWIDTH 420 0 DWIDTH 7 0 @@ -5977,7 +5980,7 @@ 44 78 ENDCHAR -STARTCHAR 0x0181 +STARTCHAR C066 ENCODING 385 SWIDTH 660 0 DWIDTH 11 0 @@ -5995,7 +5998,7 @@ 1040 7F80 ENDCHAR -STARTCHAR 0x0182 +STARTCHAR C098 ENCODING 386 SWIDTH 600 0 DWIDTH 10 0 @@ -6013,7 +6016,7 @@ 2080 FF00 ENDCHAR -STARTCHAR 0x0183 +STARTCHAR C098 ENCODING 387 SWIDTH 420 0 DWIDTH 7 0 @@ -6032,7 +6035,7 @@ 44 78 ENDCHAR -STARTCHAR 0x0184 +STARTCHAR C098 ENCODING 388 SWIDTH 600 0 DWIDTH 10 0 @@ -6050,7 +6053,7 @@ 2080 FF00 ENDCHAR -STARTCHAR 0x0185 +STARTCHAR C098 ENCODING 389 SWIDTH 480 0 DWIDTH 8 0 @@ -6069,7 +6072,7 @@ 22 3C ENDCHAR -STARTCHAR 0x0186 +STARTCHAR C067 ENCODING 390 SWIDTH 660 0 DWIDTH 11 0 @@ -6087,7 +6090,7 @@ C200 BC00 ENDCHAR -STARTCHAR 0x0187 +STARTCHAR C067 ENCODING 391 SWIDTH 660 0 DWIDTH 11 0 @@ -6107,7 +6110,7 @@ 2100 1E00 ENDCHAR -STARTCHAR 0x0188 +STARTCHAR C099 ENCODING 392 SWIDTH 420 0 DWIDTH 7 0 @@ -6123,7 +6126,7 @@ 88 70 ENDCHAR -STARTCHAR 0x0189 +STARTCHAR C032 ENCODING 393 SWIDTH 660 0 DWIDTH 11 0 @@ -6141,7 +6144,7 @@ 2180 FE00 ENDCHAR -STARTCHAR 0x018A +STARTCHAR C032 ENCODING 394 SWIDTH 720 0 DWIDTH 12 0 @@ -6159,7 +6162,7 @@ 10C0 7F00 ENDCHAR -STARTCHAR 0x018B +STARTCHAR C098 ENCODING 395 SWIDTH 600 0 DWIDTH 10 0 @@ -6177,7 +6180,7 @@ 8200 7F80 ENDCHAR -STARTCHAR 0x018C +STARTCHAR C098 ENCODING 396 SWIDTH 420 0 DWIDTH 7 0 @@ -6196,7 +6199,7 @@ 88 78 ENDCHAR -STARTCHAR 0x018D +STARTCHAR C111 ENCODING 397 SWIDTH 360 0 DWIDTH 6 0 @@ -6214,7 +6217,7 @@ 48 30 ENDCHAR -STARTCHAR 0x018E +STARTCHAR C069 ENCODING 398 SWIDTH 660 0 DWIDTH 11 0 @@ -6232,7 +6235,7 @@ 4100 7FC0 ENDCHAR -STARTCHAR 0x018F +STARTCHAR C079 ENCODING 399 SWIDTH 660 0 DWIDTH 11 0 @@ -6250,7 +6253,7 @@ 2100 1E00 ENDCHAR -STARTCHAR 0x0190 +STARTCHAR C051 ENCODING 400 SWIDTH 480 0 DWIDTH 8 0 @@ -6268,7 +6271,7 @@ 82 7C ENDCHAR -STARTCHAR 0x0191 +STARTCHAR C070 ENCODING 401 SWIDTH 600 0 DWIDTH 10 0 @@ -6289,7 +6292,7 @@ 9000 E000 ENDCHAR -STARTCHAR 0x0192 +STARTCHAR C102 ENCODING 402 SWIDTH 360 0 DWIDTH 6 0 @@ -6311,7 +6314,7 @@ A0 C0 ENDCHAR -STARTCHAR 0x0193 +STARTCHAR C071 ENCODING 403 SWIDTH 720 0 DWIDTH 12 0 @@ -6331,7 +6334,7 @@ 2080 1F80 ENDCHAR -STARTCHAR 0x0194 +STARTCHAR C089 ENCODING 404 SWIDTH 720 0 DWIDTH 12 0 @@ -6349,7 +6352,7 @@ 0A00 0400 ENDCHAR -STARTCHAR 0x0195 +STARTCHAR C110 ENCODING 405 SWIDTH 600 0 DWIDTH 10 0 @@ -6367,7 +6370,7 @@ 4880 E700 ENDCHAR -STARTCHAR 0x0196 +STARTCHAR char405 ENCODING 406 SWIDTH 300 0 DWIDTH 5 0 @@ -6387,7 +6390,7 @@ 48 30 ENDCHAR -STARTCHAR 0x0197 +STARTCHAR C073 ENCODING 407 SWIDTH 360 0 DWIDTH 6 0 @@ -6405,7 +6408,7 @@ 20 F8 ENDCHAR -STARTCHAR 0x0198 +STARTCHAR C075 ENCODING 408 SWIDTH 720 0 DWIDTH 12 0 @@ -6423,7 +6426,7 @@ 2080 F9E0 ENDCHAR -STARTCHAR 0x0199 +STARTCHAR C107 ENCODING 409 SWIDTH 480 0 DWIDTH 8 0 @@ -6443,7 +6446,7 @@ 48 EE ENDCHAR -STARTCHAR 0x019A +STARTCHAR C108 ENCODING 410 SWIDTH 240 0 DWIDTH 4 0 @@ -6462,7 +6465,7 @@ 20 70 ENDCHAR -STARTCHAR 0x019B +STARTCHAR C121 ENCODING 411 SWIDTH 540 0 DWIDTH 9 0 @@ -6479,7 +6482,7 @@ 42 E7 ENDCHAR -STARTCHAR 0x019C +STARTCHAR C087 ENCODING 412 SWIDTH 960 0 DWIDTH 16 0 @@ -6497,7 +6500,7 @@ 2298 1C6E ENDCHAR -STARTCHAR 0x019D +STARTCHAR C078 ENCODING 413 SWIDTH 780 0 DWIDTH 13 0 @@ -6518,7 +6521,7 @@ 9000 E000 ENDCHAR -STARTCHAR 0x019E +STARTCHAR C110 ENCODING 414 SWIDTH 420 0 DWIDTH 7 0 @@ -6533,9 +6536,9 @@ E4 04 04 -0E +06 ENDCHAR -STARTCHAR 0x019F +STARTCHAR C079 ENCODING 415 SWIDTH 720 0 DWIDTH 12 0 @@ -6553,7 +6556,7 @@ 6180 1E00 ENDCHAR -STARTCHAR 0x01A0 +STARTCHAR C079 ENCODING 416 SWIDTH 720 0 DWIDTH 12 0 @@ -6572,7 +6575,7 @@ 2100 1E00 ENDCHAR -STARTCHAR 0x01A1 +STARTCHAR C111 ENCODING 417 SWIDTH 360 0 DWIDTH 6 0 @@ -6587,7 +6590,7 @@ 88 70 ENDCHAR -STARTCHAR 0x01A2 +STARTCHAR C079 ENCODING 418 SWIDTH 900 0 DWIDTH 15 0 @@ -6608,7 +6611,7 @@ 0008 001C ENDCHAR -STARTCHAR 0x01A3 +STARTCHAR C111 ENCODING 419 SWIDTH 600 0 DWIDTH 10 0 @@ -6626,7 +6629,7 @@ 0100 0380 ENDCHAR -STARTCHAR 0x01A4 +STARTCHAR C080 ENCODING 420 SWIDTH 660 0 DWIDTH 11 0 @@ -6644,7 +6647,7 @@ 1000 7C00 ENDCHAR -STARTCHAR 0x01A5 +STARTCHAR C112 ENCODING 421 SWIDTH 540 0 DWIDTH 9 0 @@ -6663,7 +6666,7 @@ 40 E0 ENDCHAR -STARTCHAR 0x01A6 +STARTCHAR C082 ENCODING 422 SWIDTH 720 0 DWIDTH 12 0 @@ -6683,7 +6686,7 @@ 0100 00E0 ENDCHAR -STARTCHAR 0x01A7 +STARTCHAR C083 ENCODING 423 SWIDTH 420 0 DWIDTH 7 0 @@ -6701,7 +6704,7 @@ 84 7C ENDCHAR -STARTCHAR 0x01A8 +STARTCHAR C115 ENCODING 424 SWIDTH 360 0 DWIDTH 6 0 @@ -6715,7 +6718,7 @@ 88 78 ENDCHAR -STARTCHAR 0x01A9 +STARTCHAR C006 ENCODING 425 SWIDTH 600 0 DWIDTH 10 0 @@ -6733,7 +6736,7 @@ 4180 FF80 ENDCHAR -STARTCHAR 0x01AA +STARTCHAR char405 ENCODING 426 SWIDTH 360 0 DWIDTH 6 0 @@ -6753,7 +6756,7 @@ 24 18 ENDCHAR -STARTCHAR 0x01AB +STARTCHAR C116 ENCODING 427 SWIDTH 360 0 DWIDTH 6 0 @@ -6772,7 +6775,7 @@ 44 38 ENDCHAR -STARTCHAR 0x01AC +STARTCHAR C084 ENCODING 428 SWIDTH 600 0 DWIDTH 10 0 @@ -6790,7 +6793,7 @@ 0800 3E00 ENDCHAR -STARTCHAR 0x01AD +STARTCHAR C116 ENCODING 429 SWIDTH 360 0 DWIDTH 6 0 @@ -6809,7 +6812,7 @@ 24 18 ENDCHAR -STARTCHAR 0x01AE +STARTCHAR C084 ENCODING 430 SWIDTH 600 0 DWIDTH 10 0 @@ -6830,7 +6833,7 @@ 0A00 0600 ENDCHAR -STARTCHAR 0x01AF +STARTCHAR C085 ENCODING 431 SWIDTH 720 0 DWIDTH 12 0 @@ -6850,7 +6853,7 @@ 1100 0E00 ENDCHAR -STARTCHAR 0x01B0 +STARTCHAR C117 ENCODING 432 SWIDTH 480 0 DWIDTH 8 0 @@ -6866,7 +6869,7 @@ 44 3E ENDCHAR -STARTCHAR 0x01B1 +STARTCHAR C010 ENCODING 433 SWIDTH 720 0 DWIDTH 12 0 @@ -6884,7 +6887,7 @@ 2080 1F00 ENDCHAR -STARTCHAR 0x01B2 +STARTCHAR C085 ENCODING 434 SWIDTH 660 0 DWIDTH 11 0 @@ -6903,7 +6906,7 @@ 1100 0E00 ENDCHAR -STARTCHAR 0x01B3 +STARTCHAR C089 ENCODING 435 SWIDTH 720 0 DWIDTH 12 0 @@ -6921,7 +6924,7 @@ 0200 0F80 ENDCHAR -STARTCHAR 0x01B4 +STARTCHAR C121 ENCODING 436 SWIDTH 480 0 DWIDTH 8 0 @@ -6940,7 +6943,7 @@ 90 E0 ENDCHAR -STARTCHAR 0x01B5 +STARTCHAR C090 ENCODING 437 SWIDTH 480 0 DWIDTH 8 0 @@ -6958,7 +6961,7 @@ 46 FE ENDCHAR -STARTCHAR 0x01B6 +STARTCHAR C122 ENCODING 438 SWIDTH 360 0 DWIDTH 6 0 @@ -6972,7 +6975,7 @@ 48 F8 ENDCHAR -STARTCHAR 0x01B7 +STARTCHAR C053 ENCODING 439 SWIDTH 420 0 DWIDTH 7 0 @@ -6990,7 +6993,7 @@ 88 70 ENDCHAR -STARTCHAR 0x01B8 +STARTCHAR C053 ENCODING 440 SWIDTH 420 0 DWIDTH 7 0 @@ -7008,7 +7011,7 @@ 44 38 ENDCHAR -STARTCHAR 0x01B9 +STARTCHAR C053 ENCODING 441 SWIDTH 360 0 DWIDTH 6 0 @@ -7024,7 +7027,7 @@ 88 70 ENDCHAR -STARTCHAR 0x01BA +STARTCHAR C053 ENCODING 442 SWIDTH 360 0 DWIDTH 6 0 @@ -7040,7 +7043,7 @@ 88 70 ENDCHAR -STARTCHAR 0x01BB +STARTCHAR C050 ENCODING 443 SWIDTH 420 0 DWIDTH 7 0 @@ -7058,7 +7061,7 @@ 48 F8 ENDCHAR -STARTCHAR 0x01BC +STARTCHAR C053 ENCODING 444 SWIDTH 420 0 DWIDTH 7 0 @@ -7076,7 +7079,7 @@ 88 70 ENDCHAR -STARTCHAR 0x01BD +STARTCHAR C053 ENCODING 445 SWIDTH 360 0 DWIDTH 6 0 @@ -7090,7 +7093,7 @@ 88 70 ENDCHAR -STARTCHAR 0x01BE +STARTCHAR C099 ENCODING 446 SWIDTH 360 0 DWIDTH 6 0 @@ -7108,7 +7111,7 @@ 88 70 ENDCHAR -STARTCHAR 0x01BF +STARTCHAR C112 ENCODING 447 SWIDTH 420 0 DWIDTH 7 0 @@ -7125,7 +7128,7 @@ 40 E0 ENDCHAR -STARTCHAR 0x01C0 +STARTCHAR char123 ENCODING 448 SWIDTH 240 0 DWIDTH 4 0 @@ -7144,7 +7147,7 @@ 80 80 ENDCHAR -STARTCHAR 0x01C1 +STARTCHAR char123 ENCODING 449 SWIDTH 300 0 DWIDTH 5 0 @@ -7163,7 +7166,7 @@ A0 A0 ENDCHAR -STARTCHAR 0x01C2 +STARTCHAR char123 ENCODING 450 SWIDTH 420 0 DWIDTH 7 0 @@ -7182,7 +7185,7 @@ 20 20 ENDCHAR -STARTCHAR 0x01C3 +STARTCHAR C033 ENCODING 451 SWIDTH 300 0 DWIDTH 5 0 @@ -7201,7 +7204,7 @@ C0 C0 ENDCHAR -STARTCHAR 0x01C4 +STARTCHAR C068 ENCODING 452 SWIDTH 1140 0 DWIDTH 19 0 @@ -7223,7 +7226,7 @@ 2188C0 FF1FC0 ENDCHAR -STARTCHAR 0x01C5 +STARTCHAR C068 ENCODING 453 SWIDTH 1020 0 DWIDTH 17 0 @@ -7241,7 +7244,7 @@ 2189 FF1F ENDCHAR -STARTCHAR 0x01C6 +STARTCHAR C100 ENCODING 454 SWIDTH 780 0 DWIDTH 13 0 @@ -7260,7 +7263,7 @@ 4890 7DF0 ENDCHAR -STARTCHAR 0x01C7 +STARTCHAR C076 ENCODING 455 SWIDTH 960 0 DWIDTH 16 0 @@ -7321,7 +7324,7 @@ 12 1C ENDCHAR -STARTCHAR 0x01CA +STARTCHAR C078 ENCODING 458 SWIDTH 1080 0 DWIDTH 18 0 @@ -7381,7 +7384,7 @@ 0240 0380 ENDCHAR -STARTCHAR 0x01CD +STARTCHAR C065 ENCODING 461 SWIDTH 660 0 DWIDTH 11 0 @@ -7403,7 +7406,7 @@ 2080 F1E0 ENDCHAR -STARTCHAR 0x01CE +STARTCHAR C097 ENCODING 462 SWIDTH 420 0 DWIDTH 7 0 @@ -7421,7 +7424,7 @@ 88 7C ENDCHAR -STARTCHAR 0x01CF +STARTCHAR C073 ENCODING 463 SWIDTH 360 0 DWIDTH 6 0 @@ -7443,7 +7446,7 @@ 20 F8 ENDCHAR -STARTCHAR 0x01D0 +STARTCHAR C105 ENCODING 464 SWIDTH 240 0 DWIDTH 4 0 @@ -7461,7 +7464,7 @@ 20 70 ENDCHAR -STARTCHAR 0x01D1 +STARTCHAR C079 ENCODING 465 SWIDTH 720 0 DWIDTH 12 0 @@ -7483,7 +7486,7 @@ 2100 1E00 ENDCHAR -STARTCHAR 0x01D2 +STARTCHAR C111 ENCODING 466 SWIDTH 360 0 DWIDTH 6 0 @@ -7501,7 +7504,7 @@ 88 70 ENDCHAR -STARTCHAR 0x01D3 +STARTCHAR C085 ENCODING 467 SWIDTH 720 0 DWIDTH 12 0 @@ -7523,7 +7526,7 @@ 1100 0E00 ENDCHAR -STARTCHAR 0x01D4 +STARTCHAR C117 ENCODING 468 SWIDTH 480 0 DWIDTH 8 0 @@ -7541,7 +7544,7 @@ 44 3E ENDCHAR -STARTCHAR 0x01D5 +STARTCHAR C085 ENCODING 469 SWIDTH 720 0 DWIDTH 12 0 @@ -7564,7 +7567,7 @@ 1100 0E00 ENDCHAR -STARTCHAR 0x01D6 +STARTCHAR C117 ENCODING 470 SWIDTH 480 0 DWIDTH 8 0 @@ -7583,7 +7586,7 @@ 44 3E ENDCHAR -STARTCHAR 0x01D7 +STARTCHAR C085 ENCODING 471 SWIDTH 720 0 DWIDTH 12 0 @@ -7609,7 +7612,7 @@ 1100 0E00 ENDCHAR -STARTCHAR 0x01D8 +STARTCHAR C117 ENCODING 472 SWIDTH 480 0 DWIDTH 8 0 @@ -7631,7 +7634,7 @@ 44 3E ENDCHAR -STARTCHAR 0x01D9 +STARTCHAR C085 ENCODING 473 SWIDTH 720 0 DWIDTH 12 0 @@ -7656,7 +7659,7 @@ 1100 0E00 ENDCHAR -STARTCHAR 0x01DA +STARTCHAR C117 ENCODING 474 SWIDTH 480 0 DWIDTH 8 0 @@ -7677,7 +7680,7 @@ 44 3E ENDCHAR -STARTCHAR 0x01DB +STARTCHAR C085 ENCODING 475 SWIDTH 720 0 DWIDTH 12 0 @@ -7703,7 +7706,7 @@ 1100 0E00 ENDCHAR -STARTCHAR 0x01DC +STARTCHAR C117 ENCODING 476 SWIDTH 480 0 DWIDTH 8 0 @@ -7725,7 +7728,7 @@ 44 3E ENDCHAR -STARTCHAR 0x01DD +STARTCHAR C101 ENCODING 477 SWIDTH 360 0 DWIDTH 6 0 @@ -7739,7 +7742,7 @@ 88 70 ENDCHAR -STARTCHAR 0x01DE +STARTCHAR C065 ENCODING 478 SWIDTH 660 0 DWIDTH 11 0 @@ -7762,7 +7765,7 @@ 2080 F1E0 ENDCHAR -STARTCHAR 0x01DF +STARTCHAR C097 ENCODING 479 SWIDTH 420 0 DWIDTH 7 0 @@ -7781,7 +7784,7 @@ 88 7C ENDCHAR -STARTCHAR 0x01E0 +STARTCHAR C065 ENCODING 480 SWIDTH 660 0 DWIDTH 11 0 @@ -7804,7 +7807,7 @@ 2080 F1E0 ENDCHAR -STARTCHAR 0x01E1 +STARTCHAR C097 ENCODING 481 SWIDTH 420 0 DWIDTH 7 0 @@ -7823,7 +7826,7 @@ 88 7C ENDCHAR -STARTCHAR 0x01E2 +STARTCHAR C029 ENCODING 482 SWIDTH 900 0 DWIDTH 15 0 @@ -7843,7 +7846,7 @@ 2208 F7F8 ENDCHAR -STARTCHAR 0x01E3 +STARTCHAR C026 ENCODING 483 SWIDTH 660 0 DWIDTH 11 0 @@ -7859,7 +7862,7 @@ 8C40 7380 ENDCHAR -STARTCHAR 0x01E4 +STARTCHAR C071 ENCODING 484 SWIDTH 660 0 DWIDTH 11 0 @@ -7877,7 +7880,7 @@ 2080 1F80 ENDCHAR -STARTCHAR 0x01E5 +STARTCHAR C103 ENCODING 485 SWIDTH 480 0 DWIDTH 8 0 @@ -7895,7 +7898,7 @@ 82 7C ENDCHAR -STARTCHAR 0x01E6 +STARTCHAR C071 ENCODING 486 SWIDTH 660 0 DWIDTH 11 0 @@ -7917,7 +7920,7 @@ 2080 1F80 ENDCHAR -STARTCHAR 0x01E7 +STARTCHAR C103 ENCODING 487 SWIDTH 480 0 DWIDTH 8 0 @@ -7939,7 +7942,7 @@ 82 7C ENDCHAR -STARTCHAR 0x01E8 +STARTCHAR C075 ENCODING 488 SWIDTH 720 0 DWIDTH 12 0 @@ -7961,7 +7964,7 @@ 2080 F9E0 ENDCHAR -STARTCHAR 0x01E9 +STARTCHAR C107 ENCODING 489 SWIDTH 480 0 DWIDTH 8 0 @@ -7984,7 +7987,7 @@ 48 EE ENDCHAR -STARTCHAR 0x01EA +STARTCHAR C079 ENCODING 490 SWIDTH 720 0 DWIDTH 12 0 @@ -8005,7 +8008,7 @@ 1200 0C00 ENDCHAR -STARTCHAR 0x01EB +STARTCHAR C111 ENCODING 491 SWIDTH 360 0 DWIDTH 6 0 @@ -8022,7 +8025,7 @@ 90 60 ENDCHAR -STARTCHAR 0x01EC +STARTCHAR C079 ENCODING 492 SWIDTH 720 0 DWIDTH 12 0 @@ -8045,7 +8048,7 @@ 1200 0C00 ENDCHAR -STARTCHAR 0x01ED +STARTCHAR C111 ENCODING 493 SWIDTH 360 0 DWIDTH 6 0 @@ -8064,7 +8067,7 @@ 90 60 ENDCHAR -STARTCHAR 0x01EE +STARTCHAR C053 ENCODING 494 SWIDTH 420 0 DWIDTH 7 0 @@ -8086,7 +8089,7 @@ 88 70 ENDCHAR -STARTCHAR 0x01EF +STARTCHAR C053 ENCODING 495 SWIDTH 360 0 DWIDTH 6 0 @@ -8106,7 +8109,7 @@ 88 70 ENDCHAR -STARTCHAR 0x01F0 +STARTCHAR C106 ENCODING 496 SWIDTH 360 0 DWIDTH 6 0 @@ -8127,7 +8130,7 @@ 90 E0 ENDCHAR -STARTCHAR 0x01F1 +STARTCHAR C068 ENCODING 497 SWIDTH 1140 0 DWIDTH 19 0 @@ -8145,7 +8148,7 @@ 2188C0 FF1FC0 ENDCHAR -STARTCHAR 0x01F2 +STARTCHAR C068 ENCODING 498 SWIDTH 1020 0 DWIDTH 17 0 @@ -8163,7 +8166,7 @@ 2189 FF1F ENDCHAR -STARTCHAR 0x01F3 +STARTCHAR C100 ENCODING 499 SWIDTH 780 0 DWIDTH 13 0 @@ -8182,7 +8185,7 @@ 8890 7DF0 ENDCHAR -STARTCHAR 0x01F4 +STARTCHAR C071 ENCODING 500 SWIDTH 660 0 DWIDTH 11 0 @@ -8205,7 +8208,7 @@ 2080 1F80 ENDCHAR -STARTCHAR 0x01F5 +STARTCHAR C103 ENCODING 501 SWIDTH 480 0 DWIDTH 8 0 @@ -8227,86 +8230,8 @@ 82 82 7C -ENDCHAR -STARTCHAR 0x0124 -ENCODING 502 -SWIDTH 840 0 -DWIDTH 14 0 -BBX 14 11 0 0 -BITMAP -FBE0 -2080 -2080 -2080 -2080 -3F9C -2084 -2084 -2084 -2084 -F878 -ENDCHAR -STARTCHAR C080 -ENCODING 503 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 9 11 1 0 -BITMAP -6F00 -B180 -2080 -2080 -2100 -2600 -2800 -3000 -2000 -2000 -F800 -ENDCHAR -STARTCHAR C078 -ENCODING 504 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 11 16 1 0 -BITMAP -2000 -3000 -1000 -0800 -0000 -E3E0 -3080 -3080 -2880 -2880 -2480 -2280 -2280 -2180 -2180 -F880 -ENDCHAR -STARTCHAR 0x006E -ENCODING 505 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 12 1 0 -BITMAP -40 -60 -20 -10 -00 -F8 -44 -44 -44 -44 -44 -EE ENDCHAR -STARTCHAR 0x01FA +STARTCHAR C065 ENCODING 506 SWIDTH 660 0 DWIDTH 11 0 @@ -8333,7 +8258,7 @@ 2080 F1E0 ENDCHAR -STARTCHAR 0x01FB +STARTCHAR C097 ENCODING 507 SWIDTH 420 0 DWIDTH 7 0 @@ -8356,7 +8281,7 @@ 88 7C ENDCHAR -STARTCHAR 0x01FC +STARTCHAR C029 ENCODING 508 SWIDTH 900 0 DWIDTH 15 0 @@ -8379,7 +8304,7 @@ 2208 F7F8 ENDCHAR -STARTCHAR 0x01FD +STARTCHAR C026 ENCODING 509 SWIDTH 660 0 DWIDTH 11 0 @@ -8398,7 +8323,7 @@ 8C40 7380 ENDCHAR -STARTCHAR 0x01FE +STARTCHAR C031 ENCODING 510 SWIDTH 720 0 DWIDTH 12 0 @@ -8422,7 +8347,7 @@ 3E00 4000 ENDCHAR -STARTCHAR 0x01FF +STARTCHAR C028 ENCODING 511 SWIDTH 360 0 DWIDTH 6 0 @@ -8443,7 +8368,7 @@ 40 80 ENDCHAR -STARTCHAR 0x0200 +STARTCHAR C065 ENCODING 512 SWIDTH 660 0 DWIDTH 11 0 @@ -8466,7 +8391,7 @@ 2080 F1E0 ENDCHAR -STARTCHAR 0x0201 +STARTCHAR C097 ENCODING 513 SWIDTH 420 0 DWIDTH 7 0 @@ -8485,7 +8410,7 @@ 44 3E ENDCHAR -STARTCHAR 0x0202 +STARTCHAR C065 ENCODING 514 SWIDTH 660 0 DWIDTH 11 0 @@ -8506,7 +8431,7 @@ 2080 F1E0 ENDCHAR -STARTCHAR 0x0203 +STARTCHAR C097 ENCODING 515 SWIDTH 420 0 DWIDTH 7 0 @@ -8523,7 +8448,7 @@ 88 7C ENDCHAR -STARTCHAR 0x0204 +STARTCHAR C069 ENCODING 516 SWIDTH 660 0 DWIDTH 11 0 @@ -8546,7 +8471,7 @@ 2080 FF80 ENDCHAR -STARTCHAR 0x0205 +STARTCHAR C101 ENCODING 517 SWIDTH 360 0 DWIDTH 6 0 @@ -8565,7 +8490,7 @@ 44 38 ENDCHAR -STARTCHAR 0x0206 +STARTCHAR C069 ENCODING 518 SWIDTH 660 0 DWIDTH 11 0 @@ -8586,7 +8511,7 @@ 2080 FF80 ENDCHAR -STARTCHAR 0x0207 +STARTCHAR C101 ENCODING 519 SWIDTH 360 0 DWIDTH 6 0 @@ -8603,7 +8528,7 @@ 88 70 ENDCHAR -STARTCHAR 0x0208 +STARTCHAR C073 ENCODING 520 SWIDTH 360 0 DWIDTH 6 0 @@ -8626,7 +8551,7 @@ 10 7C ENDCHAR -STARTCHAR 0x0209 +STARTCHAR C105 ENCODING 521 SWIDTH 240 0 DWIDTH 4 0 @@ -8645,7 +8570,7 @@ 10 38 ENDCHAR -STARTCHAR 0x020A +STARTCHAR C073 ENCODING 522 SWIDTH 360 0 DWIDTH 6 0 @@ -8666,7 +8591,7 @@ 10 7C ENDCHAR -STARTCHAR 0x020B +STARTCHAR C105 ENCODING 523 SWIDTH 240 0 DWIDTH 4 0 @@ -8683,7 +8608,7 @@ 10 38 ENDCHAR -STARTCHAR 0x020C +STARTCHAR C079 ENCODING 524 SWIDTH 720 0 DWIDTH 12 0 @@ -8706,7 +8631,7 @@ 2100 1E00 ENDCHAR -STARTCHAR 0x020D +STARTCHAR C111 ENCODING 525 SWIDTH 360 0 DWIDTH 6 0 @@ -8725,7 +8650,7 @@ 44 38 ENDCHAR -STARTCHAR 0x020E +STARTCHAR C079 ENCODING 526 SWIDTH 720 0 DWIDTH 12 0 @@ -8746,7 +8671,7 @@ 2100 1E00 ENDCHAR -STARTCHAR 0x020F +STARTCHAR C111 ENCODING 527 SWIDTH 360 0 DWIDTH 6 0 @@ -8763,7 +8688,7 @@ 88 70 ENDCHAR -STARTCHAR 0x0210 +STARTCHAR C082 ENCODING 528 SWIDTH 660 0 DWIDTH 11 0 @@ -8786,7 +8711,7 @@ 2100 F8E0 ENDCHAR -STARTCHAR 0x0211 +STARTCHAR C114 ENCODING 529 SWIDTH 420 0 DWIDTH 7 0 @@ -8805,7 +8730,7 @@ 20 78 ENDCHAR -STARTCHAR 0x0212 +STARTCHAR C082 ENCODING 530 SWIDTH 660 0 DWIDTH 11 0 @@ -8826,7 +8751,7 @@ 2100 F8E0 ENDCHAR -STARTCHAR 0x0213 +STARTCHAR C114 ENCODING 531 SWIDTH 420 0 DWIDTH 7 0 @@ -8843,7 +8768,7 @@ 40 F0 ENDCHAR -STARTCHAR 0x0214 +STARTCHAR C085 ENCODING 532 SWIDTH 720 0 DWIDTH 12 0 @@ -8866,7 +8791,7 @@ 1100 0E00 ENDCHAR -STARTCHAR 0x0215 +STARTCHAR C117 ENCODING 533 SWIDTH 480 0 DWIDTH 8 0 @@ -8885,7 +8810,7 @@ 22 1F ENDCHAR -STARTCHAR 0x0216 +STARTCHAR C085 ENCODING 534 SWIDTH 720 0 DWIDTH 12 0 @@ -8906,7 +8831,7 @@ 1100 0E00 ENDCHAR -STARTCHAR 0x0217 +STARTCHAR C117 ENCODING 535 SWIDTH 480 0 DWIDTH 8 0 @@ -8923,7 +8848,7 @@ 44 3E ENDCHAR -STARTCHAR 0x0218 +STARTCHAR C083 ENCODING 536 SWIDTH 480 0 DWIDTH 8 0 @@ -8947,7 +8872,7 @@ 10 20 ENDCHAR -STARTCHAR 0x0219 +STARTCHAR C115 ENCODING 537 SWIDTH 360 0 DWIDTH 6 0 @@ -8967,7 +8892,7 @@ 10 20 ENDCHAR -STARTCHAR 0x021A +STARTCHAR C084 ENCODING 538 SWIDTH 660 0 DWIDTH 11 0 @@ -8991,7 +8916,7 @@ 0400 0800 ENDCHAR -STARTCHAR 0x021B +STARTCHAR C116 ENCODING 539 SWIDTH 360 0 DWIDTH 6 0 @@ -9013,42 +8938,8 @@ 10 10 20 -ENDCHAR -STARTCHAR 0x0033 -ENCODING 540 -SWIDTH 360 0 -DWIDTH 6 0 -BBX 5 11 1 0 -BITMAP -B0 -C8 -88 -08 -10 -30 -48 -08 -08 -10 -E0 -ENDCHAR -STARTCHAR 0x0292 -ENCODING 541 -SWIDTH 360 0 -DWIDTH 6 0 -BBX 5 9 1 0 -BITMAP -B0 -C8 -88 -10 -30 -48 -08 -10 -E0 ENDCHAR -STARTCHAR 0x021E +STARTCHAR C072 ENCODING 542 SWIDTH 720 0 DWIDTH 12 0 @@ -9070,7 +8961,7 @@ 2080 FBE0 ENDCHAR -STARTCHAR 0x021F +STARTCHAR C104 ENCODING 543 SWIDTH 480 0 DWIDTH 8 0 @@ -9092,81 +8983,8 @@ 44 44 EE -ENDCHAR -STARTCHAR 0x022E -ENCODING 546 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 8 10 1 0 -BITMAP -66 -81 -81 -42 -3C -42 -81 -81 -42 -3C -ENDCHAR -STARTCHAR 0x022E -ENCODING 547 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 6 10 1 0 -BITMAP -48 -84 -84 -48 -30 -48 -84 -84 -48 -30 -ENDCHAR -STARTCHAR C090 -ENCODING 548 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 7 15 1 -4 -BITMAP -FE -C4 -84 -88 -08 -10 -22 -22 -42 -46 -FE -02 -02 -14 -18 -ENDCHAR -STARTCHAR 0x007A -ENCODING 549 -SWIDTH 360 0 -DWIDTH 6 0 -BBX 5 10 1 -3 -BITMAP -F8 -90 -90 -20 -48 -48 -F8 -08 -28 -30 ENDCHAR -STARTCHAR 0x0226 +STARTCHAR C065 ENCODING 550 SWIDTH 660 0 DWIDTH 11 0 @@ -9187,7 +9005,7 @@ 2080 F1E0 ENDCHAR -STARTCHAR 0x0227 +STARTCHAR C097 ENCODING 551 SWIDTH 420 0 DWIDTH 7 0 @@ -9204,7 +9022,7 @@ 88 7C ENDCHAR -STARTCHAR 0x0228 +STARTCHAR C069 ENCODING 552 SWIDTH 660 0 DWIDTH 11 0 @@ -9225,7 +9043,7 @@ 0400 1C00 ENDCHAR -STARTCHAR 0x0229 +STARTCHAR C101 ENCODING 553 SWIDTH 360 0 DWIDTH 6 0 @@ -9242,7 +9060,7 @@ 10 70 ENDCHAR -STARTCHAR 0x022A +STARTCHAR C079 ENCODING 554 SWIDTH 720 0 DWIDTH 12 0 @@ -9265,7 +9083,7 @@ 2100 1E00 ENDCHAR -STARTCHAR 0x022B +STARTCHAR C111 ENCODING 555 SWIDTH 360 0 DWIDTH 6 0 @@ -9284,7 +9102,7 @@ 88 70 ENDCHAR -STARTCHAR 0x022C +STARTCHAR C079 ENCODING 556 SWIDTH 720 0 DWIDTH 12 0 @@ -9308,7 +9126,7 @@ 2100 1E00 ENDCHAR -STARTCHAR 0x022D +STARTCHAR C111 ENCODING 557 SWIDTH 360 0 DWIDTH 6 0 @@ -9328,7 +9146,7 @@ 88 70 ENDCHAR -STARTCHAR 0x022E +STARTCHAR C079 ENCODING 558 SWIDTH 720 0 DWIDTH 12 0 @@ -9349,7 +9167,7 @@ 2100 1E00 ENDCHAR -STARTCHAR 0x022F +STARTCHAR C111 ENCODING 559 SWIDTH 360 0 DWIDTH 6 0 @@ -9366,7 +9184,7 @@ 88 70 ENDCHAR -STARTCHAR 0x0230 +STARTCHAR C079 ENCODING 560 SWIDTH 720 0 DWIDTH 12 0 @@ -9389,7 +9207,7 @@ 2100 1E00 ENDCHAR -STARTCHAR 0x0231 +STARTCHAR C111 ENCODING 561 SWIDTH 360 0 DWIDTH 6 0 @@ -9408,7 +9226,7 @@ 88 70 ENDCHAR -STARTCHAR 0x0232 +STARTCHAR C089 ENCODING 562 SWIDTH 720 0 DWIDTH 12 0 @@ -9429,7 +9247,7 @@ 0400 1F00 ENDCHAR -STARTCHAR 0x0233 +STARTCHAR C121 ENCODING 563 SWIDTH 480 0 DWIDTH 8 0 @@ -9448,7 +9266,7 @@ 90 E0 ENDCHAR -STARTCHAR 0x0250 +STARTCHAR C097 ENCODING 592 SWIDTH 420 0 DWIDTH 7 0 @@ -9462,7 +9280,7 @@ 44 38 ENDCHAR -STARTCHAR 0x0251 +STARTCHAR C097 ENCODING 593 SWIDTH 480 0 DWIDTH 8 0 @@ -9476,7 +9294,7 @@ 9A 6C ENDCHAR -STARTCHAR 0x0252 +STARTCHAR C097 ENCODING 594 SWIDTH 480 0 DWIDTH 8 0 @@ -9490,7 +9308,7 @@ 32 2C ENDCHAR -STARTCHAR 0x0253 +STARTCHAR C098 ENCODING 595 SWIDTH 360 0 DWIDTH 6 0 @@ -9510,7 +9328,7 @@ 88 F0 ENDCHAR -STARTCHAR 0x0254 +STARTCHAR C099 ENCODING 596 SWIDTH 360 0 DWIDTH 6 0 @@ -9524,7 +9342,7 @@ 88 70 ENDCHAR -STARTCHAR 0x0255 +STARTCHAR C099 ENCODING 597 SWIDTH 360 0 DWIDTH 6 0 @@ -9539,7 +9357,7 @@ 70 80 ENDCHAR -STARTCHAR 0x0256 +STARTCHAR C100 ENCODING 598 SWIDTH 360 0 DWIDTH 6 0 @@ -9561,7 +9379,7 @@ 09 07 ENDCHAR -STARTCHAR 0x0257 +STARTCHAR C100 ENCODING 599 SWIDTH 360 0 DWIDTH 6 0 @@ -9581,7 +9399,7 @@ 88 7C ENDCHAR -STARTCHAR 0x0258 +STARTCHAR C101 ENCODING 600 SWIDTH 360 0 DWIDTH 6 0 @@ -9595,7 +9413,7 @@ 88 70 ENDCHAR -STARTCHAR 0x0259 +STARTCHAR C101 ENCODING 601 SWIDTH 360 0 DWIDTH 6 0 @@ -9609,7 +9427,7 @@ 88 70 ENDCHAR -STARTCHAR 0x025A +STARTCHAR C101 ENCODING 602 SWIDTH 480 0 DWIDTH 8 0 @@ -9623,7 +9441,7 @@ 90 60 ENDCHAR -STARTCHAR 0x025B +STARTCHAR char603 ENCODING 603 SWIDTH 360 0 DWIDTH 6 0 @@ -9637,7 +9455,7 @@ 88 70 ENDCHAR -STARTCHAR 0x025C +STARTCHAR char603 ENCODING 604 SWIDTH 360 0 DWIDTH 6 0 @@ -9651,7 +9469,7 @@ 88 70 ENDCHAR -STARTCHAR 0x025D +STARTCHAR char603 ENCODING 605 SWIDTH 600 0 DWIDTH 10 0 @@ -9665,7 +9483,7 @@ 8800 7000 ENDCHAR -STARTCHAR 0x025E +STARTCHAR C111 ENCODING 606 SWIDTH 480 0 DWIDTH 8 0 @@ -9679,7 +9497,7 @@ 42 3C ENDCHAR -STARTCHAR 0x025F +STARTCHAR C106 ENCODING 607 SWIDTH 360 0 DWIDTH 6 0 @@ -9696,7 +9514,7 @@ 90 E0 ENDCHAR -STARTCHAR 0x0260 +STARTCHAR C098 ENCODING 608 SWIDTH 420 0 DWIDTH 7 0 @@ -9715,7 +9533,7 @@ 88 F0 ENDCHAR -STARTCHAR 0x0261 +STARTCHAR C098 ENCODING 609 SWIDTH 360 0 DWIDTH 6 0 @@ -9732,7 +9550,7 @@ 88 F0 ENDCHAR -STARTCHAR 0x0262 +STARTCHAR char610 ENCODING 610 SWIDTH 480 0 DWIDTH 8 0 @@ -9746,7 +9564,7 @@ 44 3C ENDCHAR -STARTCHAR 0x0263 +STARTCHAR C089 ENCODING 611 SWIDTH 720 0 DWIDTH 12 0 @@ -9764,7 +9582,7 @@ 0A00 0400 ENDCHAR -STARTCHAR 0x0264 +STARTCHAR C118 ENCODING 612 SWIDTH 540 0 DWIDTH 9 0 @@ -9778,7 +9596,7 @@ 24 18 ENDCHAR -STARTCHAR 0x0265 +STARTCHAR C104 ENCODING 613 SWIDTH 480 0 DWIDTH 8 0 @@ -9795,7 +9613,7 @@ 04 06 ENDCHAR -STARTCHAR 0x0266 +STARTCHAR C104 ENCODING 614 SWIDTH 480 0 DWIDTH 8 0 @@ -9815,7 +9633,7 @@ 44 EE ENDCHAR -STARTCHAR 0x0267 +STARTCHAR C104 ENCODING 615 SWIDTH 420 0 DWIDTH 7 0 @@ -9838,7 +9656,7 @@ 24 38 ENDCHAR -STARTCHAR 0x0268 +STARTCHAR C105 ENCODING 616 SWIDTH 240 0 DWIDTH 4 0 @@ -9857,7 +9675,7 @@ 20 70 ENDCHAR -STARTCHAR 0x0269 +STARTCHAR C105 ENCODING 617 SWIDTH 300 0 DWIDTH 5 0 @@ -9871,7 +9689,7 @@ 50 70 ENDCHAR -STARTCHAR 0x026A +STARTCHAR char618 ENCODING 618 SWIDTH 240 0 DWIDTH 4 0 @@ -9885,7 +9703,7 @@ 40 E0 ENDCHAR -STARTCHAR 0x026B +STARTCHAR C108 ENCODING 619 SWIDTH 300 0 DWIDTH 5 0 @@ -9904,7 +9722,7 @@ 20 70 ENDCHAR -STARTCHAR 0x026C +STARTCHAR C108 ENCODING 620 SWIDTH 420 0 DWIDTH 7 0 @@ -9923,7 +9741,7 @@ 10 38 ENDCHAR -STARTCHAR 0x026D +STARTCHAR C108 ENCODING 621 SWIDTH 240 0 DWIDTH 4 0 @@ -9945,7 +9763,7 @@ 48 38 ENDCHAR -STARTCHAR 0x026E +STARTCHAR C104 ENCODING 622 SWIDTH 420 0 DWIDTH 7 0 @@ -9967,7 +9785,7 @@ 22 1C ENDCHAR -STARTCHAR 0x026F +STARTCHAR C109 ENCODING 623 SWIDTH 720 0 DWIDTH 12 0 @@ -9981,7 +9799,7 @@ 4440 3BE0 ENDCHAR -STARTCHAR 0x0270 +STARTCHAR C109 ENCODING 624 SWIDTH 720 0 DWIDTH 12 0 @@ -9998,7 +9816,7 @@ 0040 0060 ENDCHAR -STARTCHAR 0x0271 +STARTCHAR C109 ENCODING 625 SWIDTH 660 0 DWIDTH 11 0 @@ -10015,7 +9833,7 @@ 0240 0380 ENDCHAR -STARTCHAR 0x0272 +STARTCHAR C110 ENCODING 626 SWIDTH 480 0 DWIDTH 8 0 @@ -10032,7 +9850,7 @@ 9000 E000 ENDCHAR -STARTCHAR 0x0273 +STARTCHAR C110 ENCODING 627 SWIDTH 480 0 DWIDTH 8 0 @@ -10049,7 +9867,7 @@ 0480 0380 ENDCHAR -STARTCHAR 0x0274 +STARTCHAR char628 ENCODING 628 SWIDTH 480 0 DWIDTH 8 0 @@ -10063,7 +9881,7 @@ 4C E4 ENDCHAR -STARTCHAR 0x0275 +STARTCHAR C111 ENCODING 629 SWIDTH 360 0 DWIDTH 6 0 @@ -10077,7 +9895,7 @@ 88 70 ENDCHAR -STARTCHAR 0x0276 +STARTCHAR char630 ENCODING 630 SWIDTH 600 0 DWIDTH 10 0 @@ -10091,7 +9909,7 @@ 4900 3F00 ENDCHAR -STARTCHAR 0x0277 +STARTCHAR C111 ENCODING 631 SWIDTH 480 0 DWIDTH 8 0 @@ -10105,7 +9923,7 @@ 92 6C ENDCHAR -STARTCHAR 0x0278 +STARTCHAR C073 ENCODING 632 SWIDTH 360 0 DWIDTH 6 0 @@ -10123,7 +9941,7 @@ 20 F8 ENDCHAR -STARTCHAR 0x0279 +STARTCHAR C114 ENCODING 633 SWIDTH 360 0 DWIDTH 6 0 @@ -10137,7 +9955,7 @@ B0 58 ENDCHAR -STARTCHAR 0x027A +STARTCHAR C114 ENCODING 634 SWIDTH 360 0 DWIDTH 6 0 @@ -10155,7 +9973,7 @@ B0 58 ENDCHAR -STARTCHAR 0x027B +STARTCHAR C114 ENCODING 635 SWIDTH 420 0 DWIDTH 7 0 @@ -10172,7 +9990,7 @@ 12 0E ENDCHAR -STARTCHAR 0x027C +STARTCHAR C114 ENCODING 636 SWIDTH 360 0 DWIDTH 6 0 @@ -10190,7 +10008,7 @@ 40 F0 ENDCHAR -STARTCHAR 0x027D +STARTCHAR C114 ENCODING 637 SWIDTH 360 0 DWIDTH 6 0 @@ -10207,7 +10025,7 @@ 48 38 ENDCHAR -STARTCHAR 0x027E +STARTCHAR char638 ENCODING 638 SWIDTH 360 0 DWIDTH 6 0 @@ -10221,7 +10039,7 @@ 40 F0 ENDCHAR -STARTCHAR 0x027F +STARTCHAR char638 ENCODING 639 SWIDTH 360 0 DWIDTH 6 0 @@ -10235,7 +10053,7 @@ 10 78 ENDCHAR -STARTCHAR 0x0280 +STARTCHAR char640 ENCODING 640 SWIDTH 480 0 DWIDTH 8 0 @@ -10249,7 +10067,7 @@ 48 E6 ENDCHAR -STARTCHAR 0x0281 +STARTCHAR char640 ENCODING 641 SWIDTH 480 0 DWIDTH 8 0 @@ -10263,7 +10081,7 @@ 48 F0 ENDCHAR -STARTCHAR 0x0282 +STARTCHAR C115 ENCODING 642 SWIDTH 360 0 DWIDTH 6 0 @@ -10280,7 +10098,7 @@ A0 60 ENDCHAR -STARTCHAR 0x0283 +STARTCHAR C106 ENCODING 643 SWIDTH 360 0 DWIDTH 6 0 @@ -10301,7 +10119,7 @@ 90 E0 ENDCHAR -STARTCHAR 0x0284 +STARTCHAR C106 ENCODING 644 SWIDTH 480 0 DWIDTH 8 0 @@ -10322,7 +10140,7 @@ 90 E0 ENDCHAR -STARTCHAR 0x0285 +STARTCHAR C106 ENCODING 645 SWIDTH 420 0 DWIDTH 7 0 @@ -10343,7 +10161,7 @@ 12 0E ENDCHAR -STARTCHAR 0x0286 +STARTCHAR C106 ENCODING 646 SWIDTH 360 0 DWIDTH 6 0 @@ -10364,7 +10182,7 @@ 94 74 ENDCHAR -STARTCHAR 0x0287 +STARTCHAR C116 ENCODING 647 SWIDTH 360 0 DWIDTH 6 0 @@ -10381,7 +10199,7 @@ 20 20 ENDCHAR -STARTCHAR 0x0288 +STARTCHAR C116 ENCODING 648 SWIDTH 420 0 DWIDTH 7 0 @@ -10401,7 +10219,7 @@ 24 1C ENDCHAR -STARTCHAR 0x0289 +STARTCHAR C117 ENCODING 649 SWIDTH 420 0 DWIDTH 7 0 @@ -10415,7 +10233,7 @@ 48 3C ENDCHAR -STARTCHAR 0x028A +STARTCHAR char650 ENCODING 650 SWIDTH 420 0 DWIDTH 7 0 @@ -10429,7 +10247,7 @@ 84 78 ENDCHAR -STARTCHAR 0x028B +STARTCHAR char651 ENCODING 651 SWIDTH 480 0 DWIDTH 8 0 @@ -10444,7 +10262,7 @@ 44 38 ENDCHAR -STARTCHAR 0x028C +STARTCHAR C118 ENCODING 652 SWIDTH 540 0 DWIDTH 9 0 @@ -10458,21 +10276,21 @@ 24 E7 ENDCHAR -STARTCHAR 0x028D +STARTCHAR C119 ENCODING 653 SWIDTH 720 0 DWIDTH 12 0 BBX 11 7 0 0 BITMAP -1100 1100 +1B00 2A80 2A80 2A80 2480 EEE0 ENDCHAR -STARTCHAR 0x028E +STARTCHAR C121 ENCODING 654 SWIDTH 540 0 DWIDTH 9 0 @@ -10489,7 +10307,7 @@ 24 E7 ENDCHAR -STARTCHAR 0x028F +STARTCHAR char655 ENCODING 655 SWIDTH 480 0 DWIDTH 8 0 @@ -10503,7 +10321,7 @@ 10 38 ENDCHAR -STARTCHAR 0x0290 +STARTCHAR C122 ENCODING 656 SWIDTH 480 0 DWIDTH 8 0 @@ -10520,7 +10338,7 @@ 09 07 ENDCHAR -STARTCHAR 0x0291 +STARTCHAR C122 ENCODING 657 SWIDTH 420 0 DWIDTH 7 0 @@ -10535,7 +10353,7 @@ FC 20 ENDCHAR -STARTCHAR 0x0292 +STARTCHAR C053 ENCODING 658 SWIDTH 360 0 DWIDTH 6 0 @@ -10551,7 +10369,7 @@ 88 70 ENDCHAR -STARTCHAR 0x0293 +STARTCHAR C053 ENCODING 659 SWIDTH 360 0 DWIDTH 6 0 @@ -10568,7 +10386,7 @@ 70 08 ENDCHAR -STARTCHAR 0x0294 +STARTCHAR C099 ENCODING 660 SWIDTH 360 0 DWIDTH 6 0 @@ -10586,7 +10404,7 @@ 40 40 ENDCHAR -STARTCHAR 0x0295 +STARTCHAR C099 ENCODING 661 SWIDTH 360 0 DWIDTH 6 0 @@ -10604,7 +10422,7 @@ 10 10 ENDCHAR -STARTCHAR 0x0296 +STARTCHAR C099 ENCODING 662 SWIDTH 360 0 DWIDTH 6 0 @@ -10622,7 +10440,7 @@ 88 70 ENDCHAR -STARTCHAR 0x0297 +STARTCHAR C099 ENCODING 663 SWIDTH 360 0 DWIDTH 6 0 @@ -10640,7 +10458,7 @@ 88 70 ENDCHAR -STARTCHAR 0x0298 +STARTCHAR char664 ENCODING 664 SWIDTH 420 0 DWIDTH 7 0 @@ -10653,7 +10471,7 @@ 48 30 ENDCHAR -STARTCHAR 0x0299 +STARTCHAR char665 ENCODING 665 SWIDTH 420 0 DWIDTH 7 0 @@ -10667,7 +10485,7 @@ 44 F8 ENDCHAR -STARTCHAR 0x029A +STARTCHAR C111 ENCODING 666 SWIDTH 480 0 DWIDTH 8 0 @@ -10681,7 +10499,7 @@ 84 78 ENDCHAR -STARTCHAR 0x029B +STARTCHAR char610 ENCODING 667 SWIDTH 540 0 DWIDTH 9 0 @@ -10696,7 +10514,7 @@ 44 3C ENDCHAR -STARTCHAR 0x029C +STARTCHAR char668 ENCODING 668 SWIDTH 480 0 DWIDTH 8 0 @@ -10710,7 +10528,7 @@ 44 EE ENDCHAR -STARTCHAR 0x029D +STARTCHAR C106 ENCODING 669 SWIDTH 240 0 DWIDTH 4 0 @@ -10732,7 +10550,7 @@ 90 60 ENDCHAR -STARTCHAR 0x029E +STARTCHAR C107 ENCODING 670 SWIDTH 480 0 DWIDTH 8 0 @@ -10751,7 +10569,7 @@ 04 06 ENDCHAR -STARTCHAR 0x029F +STARTCHAR char671 ENCODING 671 SWIDTH 420 0 DWIDTH 7 0 @@ -10765,7 +10583,7 @@ 4C FC ENDCHAR -STARTCHAR 0x02A0 +STARTCHAR C113 ENCODING 672 SWIDTH 480 0 DWIDTH 8 0 @@ -10784,7 +10602,7 @@ 08 1C ENDCHAR -STARTCHAR 0x02A1 +STARTCHAR C099 ENCODING 673 SWIDTH 420 0 DWIDTH 7 0 @@ -10802,7 +10620,7 @@ 20 20 ENDCHAR -STARTCHAR 0x02A2 +STARTCHAR C099 ENCODING 674 SWIDTH 420 0 DWIDTH 7 0 @@ -10820,7 +10638,7 @@ 10 10 ENDCHAR -STARTCHAR 0x02A3 +STARTCHAR C100 ENCODING 675 SWIDTH 660 0 DWIDTH 11 0 @@ -10839,7 +10657,7 @@ 8A40 7FC0 ENDCHAR -STARTCHAR 0x02A4 +STARTCHAR C100 ENCODING 676 SWIDTH 660 0 DWIDTH 11 0 @@ -10860,7 +10678,7 @@ 0440 0380 ENDCHAR -STARTCHAR 0x02A5 +STARTCHAR C100 ENCODING 677 SWIDTH 720 0 DWIDTH 12 0 @@ -10880,7 +10698,7 @@ 7FC0 0100 ENDCHAR -STARTCHAR 0x02A6 +STARTCHAR C116 ENCODING 678 SWIDTH 600 0 DWIDTH 10 0 @@ -10897,7 +10715,7 @@ 2080 1F00 ENDCHAR -STARTCHAR 0x02A7 +STARTCHAR C116 ENCODING 679 SWIDTH 540 0 DWIDTH 9 0 @@ -10918,7 +10736,7 @@ 1200 1C00 ENDCHAR -STARTCHAR 0x02A8 +STARTCHAR C116 ENCODING 680 SWIDTH 720 0 DWIDTH 12 0 @@ -10935,104 +10753,8 @@ 26A0 19C0 0200 -ENDCHAR -STARTCHAR 0x0066 -ENCODING 681 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 10 15 1 -3 -BITMAP -3800 -4800 -4000 -4000 -4000 -FF80 -4440 -4440 -4440 -4440 -4440 -EE40 -0040 -0140 -0180 -ENDCHAR -STARTCHAR 0x006C -ENCODING 682 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 12 1 0 -BITMAP -C0 -40 -40 -40 -40 -5E -62 -60 -5C -42 -62 -FC -ENDCHAR -STARTCHAR 0x006C -ENCODING 683 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 12 1 0 -BITMAP -C0 -40 -40 -40 -40 -7E -64 -64 -48 -52 -52 -FE -ENDCHAR -STARTCHAR 0x0077 -ENCODING 684 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 11 1 0 -BITMAP -DD80 -4900 -5500 -5500 -2200 -0000 -DD80 -4900 -5500 -5500 -2200 -ENDCHAR -STARTCHAR 0x0077 -ENCODING 685 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 11 1 0 -BITMAP -FE -82 -82 -82 -00 -00 -00 -FE -82 -82 -82 ENDCHAR -STARTCHAR 0x02B0 +STARTCHAR C104 ENCODING 688 SWIDTH 480 0 DWIDTH 8 0 @@ -11051,7 +10773,7 @@ 44 EE ENDCHAR -STARTCHAR 0x02B1 +STARTCHAR C104 ENCODING 689 SWIDTH 480 0 DWIDTH 8 0 @@ -11070,7 +10792,7 @@ 44 EE ENDCHAR -STARTCHAR 0x02B2 +STARTCHAR C106 ENCODING 690 SWIDTH 240 0 DWIDTH 4 0 @@ -11090,7 +10812,7 @@ A0 C0 ENDCHAR -STARTCHAR 0x02B3 +STARTCHAR C114 ENCODING 691 SWIDTH 360 0 DWIDTH 6 0 @@ -11104,7 +10826,7 @@ 40 E0 ENDCHAR -STARTCHAR 0x02B4 +STARTCHAR C114 ENCODING 692 SWIDTH 360 0 DWIDTH 6 0 @@ -11118,7 +10840,7 @@ B0 58 ENDCHAR -STARTCHAR 0x02B5 +STARTCHAR C114 ENCODING 693 SWIDTH 420 0 DWIDTH 7 0 @@ -11134,7 +10856,7 @@ 14 08 ENDCHAR -STARTCHAR 0x02B6 +STARTCHAR char640 ENCODING 694 SWIDTH 480 0 DWIDTH 8 0 @@ -11148,7 +10870,7 @@ 48 F0 ENDCHAR -STARTCHAR 0x02B7 +STARTCHAR C119 ENCODING 695 SWIDTH 660 0 DWIDTH 11 0 @@ -11159,10 +10881,10 @@ 2A80 2A80 2A80 -1100 +1B00 1100 ENDCHAR -STARTCHAR 0x02B8 +STARTCHAR C121 ENCODING 696 SWIDTH 480 0 DWIDTH 8 0 @@ -11179,7 +10901,7 @@ 90 E0 ENDCHAR -STARTCHAR 0x02B9 +STARTCHAR C019 ENCODING 697 SWIDTH 300 0 DWIDTH 5 0 @@ -11191,7 +10913,7 @@ 40 80 ENDCHAR -STARTCHAR 0x02BA +STARTCHAR C019 ENCODING 698 SWIDTH 540 0 DWIDTH 9 0 @@ -11203,7 +10925,7 @@ 44 88 ENDCHAR -STARTCHAR 0x02BB +STARTCHAR C044 ENCODING 699 SWIDTH 300 0 DWIDTH 5 0 @@ -11215,7 +10937,7 @@ C0 C0 ENDCHAR -STARTCHAR 0x02BC +STARTCHAR C044 ENCODING 700 SWIDTH 300 0 DWIDTH 5 0 @@ -11227,7 +10949,7 @@ 40 80 ENDCHAR -STARTCHAR 0x02BD +STARTCHAR C044 ENCODING 701 SWIDTH 300 0 DWIDTH 5 0 @@ -11239,7 +10961,7 @@ 80 40 ENDCHAR -STARTCHAR 0x02BE +STARTCHAR C065 ENCODING 702 SWIDTH 240 0 DWIDTH 4 0 @@ -11251,7 +10973,7 @@ 40 80 ENDCHAR -STARTCHAR 0x02BF +STARTCHAR C065 ENCODING 703 SWIDTH 240 0 DWIDTH 4 0 @@ -11263,7 +10985,7 @@ 80 40 ENDCHAR -STARTCHAR 0x02C0 +STARTCHAR C099 ENCODING 704 SWIDTH 360 0 DWIDTH 6 0 @@ -11280,7 +11002,7 @@ 40 40 ENDCHAR -STARTCHAR 0x02C1 +STARTCHAR C099 ENCODING 705 SWIDTH 360 0 DWIDTH 6 0 @@ -11297,7 +11019,7 @@ 10 10 ENDCHAR -STARTCHAR 0x02C2 +STARTCHAR char60 ENCODING 706 SWIDTH 540 0 DWIDTH 9 0 @@ -11311,7 +11033,7 @@ 0C 03 ENDCHAR -STARTCHAR 0x02C3 +STARTCHAR char60 ENCODING 707 SWIDTH 540 0 DWIDTH 9 0 @@ -11325,7 +11047,7 @@ 30 C0 ENDCHAR -STARTCHAR 0x02C4 +STARTCHAR char60 ENCODING 708 SWIDTH 480 0 DWIDTH 8 0 @@ -11340,7 +11062,7 @@ 10 10 ENDCHAR -STARTCHAR 0x02C5 +STARTCHAR char60 ENCODING 709 SWIDTH 480 0 DWIDTH 8 0 @@ -11355,7 +11077,7 @@ 82 82 ENDCHAR -STARTCHAR 0x02C6 +STARTCHAR char710 ENCODING 710 SWIDTH 360 0 DWIDTH 6 0 @@ -11365,7 +11087,7 @@ 70 88 ENDCHAR -STARTCHAR 0x02C7 +STARTCHAR char710 ENCODING 711 SWIDTH 360 0 DWIDTH 6 0 @@ -11375,7 +11097,7 @@ 70 20 ENDCHAR -STARTCHAR 0x02C8 +STARTCHAR char712 ENCODING 712 SWIDTH 120 0 DWIDTH 2 0 @@ -11385,7 +11107,7 @@ 80 80 ENDCHAR -STARTCHAR 0x02C9 +STARTCHAR char713 ENCODING 713 SWIDTH 360 0 DWIDTH 6 0 @@ -11393,7 +11115,7 @@ BITMAP F8 ENDCHAR -STARTCHAR 0x02CA +STARTCHAR C019 ENCODING 714 SWIDTH 300 0 DWIDTH 5 0 @@ -11404,7 +11126,7 @@ 40 80 ENDCHAR -STARTCHAR 0x02CB +STARTCHAR C019 ENCODING 715 SWIDTH 300 0 DWIDTH 5 0 @@ -11415,7 +11137,7 @@ 40 20 ENDCHAR -STARTCHAR 0x02CC +STARTCHAR char716 ENCODING 716 SWIDTH 120 0 DWIDTH 2 0 @@ -11425,7 +11147,7 @@ 80 80 ENDCHAR -STARTCHAR 0x02CD +STARTCHAR char717 ENCODING 717 SWIDTH 360 0 DWIDTH 6 0 @@ -11433,7 +11155,7 @@ BITMAP F8 ENDCHAR -STARTCHAR 0x02CE +STARTCHAR C019 ENCODING 718 SWIDTH 300 0 DWIDTH 5 0 @@ -11444,7 +11166,7 @@ 40 20 ENDCHAR -STARTCHAR 0x02CF +STARTCHAR C019 ENCODING 719 SWIDTH 300 0 DWIDTH 5 0 @@ -11455,7 +11177,7 @@ 40 80 ENDCHAR -STARTCHAR 0x02D0 +STARTCHAR char720 ENCODING 720 SWIDTH 240 0 DWIDTH 4 0 @@ -11471,7 +11193,7 @@ E0 E0 ENDCHAR -STARTCHAR 0x02D1 +STARTCHAR char720 ENCODING 721 SWIDTH 240 0 DWIDTH 4 0 @@ -11481,7 +11203,7 @@ E0 40 ENDCHAR -STARTCHAR 0x02D2 +STARTCHAR C065 ENCODING 722 SWIDTH 240 0 DWIDTH 4 0 @@ -11493,7 +11215,7 @@ 40 80 ENDCHAR -STARTCHAR 0x02D3 +STARTCHAR C065 ENCODING 723 SWIDTH 240 0 DWIDTH 4 0 @@ -11505,7 +11227,7 @@ 80 40 ENDCHAR -STARTCHAR 0x02D4 +STARTCHAR char724 ENCODING 724 SWIDTH 360 0 DWIDTH 6 0 @@ -11516,7 +11238,7 @@ 20 F8 ENDCHAR -STARTCHAR 0x02D5 +STARTCHAR char724 ENCODING 725 SWIDTH 360 0 DWIDTH 6 0 @@ -11527,7 +11249,7 @@ 20 20 ENDCHAR -STARTCHAR 0x02D6 +STARTCHAR char724 ENCODING 726 SWIDTH 360 0 DWIDTH 6 0 @@ -11539,7 +11261,7 @@ 20 20 ENDCHAR -STARTCHAR 0x02D7 +STARTCHAR char724 ENCODING 727 SWIDTH 360 0 DWIDTH 6 0 @@ -11547,7 +11269,7 @@ BITMAP F8 ENDCHAR -STARTCHAR 0x02D8 +STARTCHAR C065 ENCODING 728 SWIDTH 360 0 DWIDTH 6 0 @@ -11556,7 +11278,7 @@ 88 70 ENDCHAR -STARTCHAR 0x02D9 +STARTCHAR C095 ENCODING 729 SWIDTH 180 0 DWIDTH 3 0 @@ -11565,7 +11287,7 @@ C0 C0 ENDCHAR -STARTCHAR 0x02DA +STARTCHAR C065 ENCODING 730 SWIDTH 300 0 DWIDTH 5 0 @@ -11576,7 +11298,7 @@ 90 60 ENDCHAR -STARTCHAR 0x02DB +STARTCHAR C024 ENCODING 731 SWIDTH 300 0 DWIDTH 5 0 @@ -11586,7 +11308,7 @@ 90 60 ENDCHAR -STARTCHAR 0x02DC +STARTCHAR C065 ENCODING 732 SWIDTH 360 0 DWIDTH 6 0 @@ -11596,7 +11318,7 @@ A8 90 ENDCHAR -STARTCHAR 0x02DD +STARTCHAR C019 ENCODING 733 SWIDTH 480 0 DWIDTH 8 0 @@ -11607,7 +11329,7 @@ 48 90 ENDCHAR -STARTCHAR 0x02DE +STARTCHAR char603 ENCODING 734 SWIDTH 360 0 DWIDTH 6 0 @@ -11617,20 +11339,8 @@ A0 28 10 -ENDCHAR -STARTCHAR 0x00D7 -ENCODING 735 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 5 5 1 4 -BITMAP -88 -50 -20 -50 -88 ENDCHAR -STARTCHAR 0x02E0 +STARTCHAR C089 ENCODING 736 SWIDTH 600 0 DWIDTH 10 0 @@ -11647,7 +11357,7 @@ 1400 0800 ENDCHAR -STARTCHAR 0x02E1 +STARTCHAR C108 ENCODING 737 SWIDTH 240 0 DWIDTH 4 0 @@ -11666,7 +11376,7 @@ 40 E0 ENDCHAR -STARTCHAR 0x02E2 +STARTCHAR C115 ENCODING 738 SWIDTH 360 0 DWIDTH 6 0 @@ -11680,7 +11390,7 @@ 88 F0 ENDCHAR -STARTCHAR 0x02E3 +STARTCHAR C120 ENCODING 739 SWIDTH 420 0 DWIDTH 7 0 @@ -11694,7 +11404,7 @@ 48 CC ENDCHAR -STARTCHAR 0x02E4 +STARTCHAR C099 ENCODING 740 SWIDTH 360 0 DWIDTH 6 0 @@ -11713,7 +11423,7 @@ 10 10 ENDCHAR -STARTCHAR 0x02E5 +STARTCHAR C099 ENCODING 741 SWIDTH 360 0 DWIDTH 6 0 @@ -11729,7 +11439,7 @@ 08 08 ENDCHAR -STARTCHAR 0x02E6 +STARTCHAR C099 ENCODING 742 SWIDTH 360 0 DWIDTH 6 0 @@ -11745,7 +11455,7 @@ 08 08 ENDCHAR -STARTCHAR 0x02E7 +STARTCHAR C099 ENCODING 743 SWIDTH 360 0 DWIDTH 6 0 @@ -11761,7 +11471,7 @@ 08 08 ENDCHAR -STARTCHAR 0x02E8 +STARTCHAR C099 ENCODING 744 SWIDTH 360 0 DWIDTH 6 0 @@ -11777,7 +11487,7 @@ 08 08 ENDCHAR -STARTCHAR 0x02E9 +STARTCHAR C099 ENCODING 745 SWIDTH 360 0 DWIDTH 6 0 @@ -11793,63 +11503,7 @@ 08 F8 ENDCHAR -STARTCHAR char746 -ENCODING 746 -SWIDTH 300 0 -DWIDTH 5 0 -BBX 3 4 1 6 -BITMAP -80 -80 -80 -E0 -ENDCHAR -STARTCHAR char746 -ENCODING 747 -SWIDTH 300 0 -DWIDTH 5 0 -BBX 3 5 1 5 -BITMAP -80 -80 -E0 -80 -80 -ENDCHAR -STARTCHAR char748 -ENCODING 748 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 5 4 1 0 -BITMAP -88 -50 -70 -20 -ENDCHAR -STARTCHAR 0x02CD -ENCODING 749 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 6 3 1 9 -BITMAP -FC -00 -FC -ENDCHAR -STARTCHAR 0x0022 -ENCODING 750 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 5 5 1 7 -BITMAP -D8 -D8 -48 -48 -90 -ENDCHAR -STARTCHAR 0x0300 +STARTCHAR C125 ENCODING 768 SWIDTH 0 0 DWIDTH 0 0 @@ -11860,7 +11514,7 @@ 40 20 ENDCHAR -STARTCHAR 0x0301 +STARTCHAR C125 ENCODING 769 SWIDTH 0 0 DWIDTH 0 0 @@ -11871,7 +11525,7 @@ 40 80 ENDCHAR -STARTCHAR 0x0302 +STARTCHAR C079 ENCODING 770 SWIDTH 0 0 DWIDTH 0 0 @@ -11881,7 +11535,7 @@ 70 88 ENDCHAR -STARTCHAR 0x0303 +STARTCHAR C065 ENCODING 771 SWIDTH 0 0 DWIDTH 0 0 @@ -11891,7 +11545,7 @@ A8 90 ENDCHAR -STARTCHAR 0x0304 +STARTCHAR C069 ENCODING 772 SWIDTH 0 0 DWIDTH 0 0 @@ -11899,7 +11553,7 @@ BITMAP F8 ENDCHAR -STARTCHAR 0x0305 +STARTCHAR C069 ENCODING 773 SWIDTH 0 0 DWIDTH 0 0 @@ -11907,7 +11561,7 @@ BITMAP FFC0 ENDCHAR -STARTCHAR 0x0306 +STARTCHAR C065 ENCODING 774 SWIDTH 0 0 DWIDTH 0 0 @@ -11916,7 +11570,7 @@ 88 70 ENDCHAR -STARTCHAR 0x0307 +STARTCHAR C095 ENCODING 775 SWIDTH 0 0 DWIDTH 0 0 @@ -11925,7 +11579,7 @@ C0 C0 ENDCHAR -STARTCHAR 0x0308 +STARTCHAR C079 ENCODING 776 SWIDTH 0 0 DWIDTH 0 0 @@ -11934,7 +11588,7 @@ D8 D8 ENDCHAR -STARTCHAR 0x0309 +STARTCHAR C079 ENCODING 777 SWIDTH 0 0 DWIDTH 0 0 @@ -11946,7 +11600,7 @@ 40 40 ENDCHAR -STARTCHAR 0x030A +STARTCHAR C065 ENCODING 778 SWIDTH 0 0 DWIDTH 0 0 @@ -11957,7 +11611,7 @@ 90 60 ENDCHAR -STARTCHAR 0x030B +STARTCHAR C125 ENCODING 779 SWIDTH 0 0 DWIDTH 0 0 @@ -11968,7 +11622,7 @@ 48 90 ENDCHAR -STARTCHAR 0x030C +STARTCHAR C079 ENCODING 780 SWIDTH 0 0 DWIDTH 0 0 @@ -11978,7 +11632,7 @@ 70 20 ENDCHAR -STARTCHAR 0x030D +STARTCHAR char781 ENCODING 781 SWIDTH 0 0 DWIDTH 0 0 @@ -11989,7 +11643,7 @@ 80 80 ENDCHAR -STARTCHAR 0x030E +STARTCHAR char781 ENCODING 782 SWIDTH 120 0 DWIDTH 2 0 @@ -12000,7 +11654,7 @@ A0 A0 ENDCHAR -STARTCHAR 0x030F +STARTCHAR C125 ENCODING 783 SWIDTH 0 0 DWIDTH 0 0 @@ -12011,7 +11665,7 @@ 48 24 ENDCHAR -STARTCHAR 0x0310 +STARTCHAR C065 ENCODING 784 SWIDTH 0 0 DWIDTH 0 0 @@ -12022,7 +11676,7 @@ 84 78 ENDCHAR -STARTCHAR 0x0311 +STARTCHAR C065 ENCODING 785 SWIDTH 0 0 DWIDTH 0 0 @@ -12031,7 +11685,7 @@ 70 88 ENDCHAR -STARTCHAR 0x0312 +STARTCHAR C044 ENCODING 786 SWIDTH 0 0 DWIDTH 0 0 @@ -12043,7 +11697,7 @@ C0 C0 ENDCHAR -STARTCHAR 0x0313 +STARTCHAR C044 ENCODING 787 SWIDTH 0 0 DWIDTH 0 0 @@ -12055,7 +11709,7 @@ 40 80 ENDCHAR -STARTCHAR 0x0314 +STARTCHAR C044 ENCODING 788 SWIDTH 0 0 DWIDTH 0 0 @@ -12067,7 +11721,7 @@ 80 40 ENDCHAR -STARTCHAR 0x0315 +STARTCHAR C044 ENCODING 789 SWIDTH 0 0 DWIDTH 0 0 @@ -12079,7 +11733,7 @@ 40 80 ENDCHAR -STARTCHAR 0x0316 +STARTCHAR C125 ENCODING 790 SWIDTH 0 0 DWIDTH 0 0 @@ -12090,7 +11744,7 @@ 40 20 ENDCHAR -STARTCHAR 0x0317 +STARTCHAR C125 ENCODING 791 SWIDTH 0 0 DWIDTH 0 0 @@ -12101,7 +11755,7 @@ 40 80 ENDCHAR -STARTCHAR 0x0318 +STARTCHAR char792 ENCODING 792 SWIDTH 180 0 DWIDTH 3 0 @@ -12113,7 +11767,7 @@ 20 20 ENDCHAR -STARTCHAR 0x0319 +STARTCHAR char792 ENCODING 793 SWIDTH 0 0 DWIDTH 0 0 @@ -12125,7 +11779,7 @@ 80 80 ENDCHAR -STARTCHAR 0x031A +STARTCHAR char794 ENCODING 794 SWIDTH 300 0 DWIDTH 5 0 @@ -12135,7 +11789,7 @@ 08 08 ENDCHAR -STARTCHAR 0x031B +STARTCHAR C079 ENCODING 795 SWIDTH 0 0 DWIDTH 0 0 @@ -12146,7 +11800,7 @@ 20 C0 ENDCHAR -STARTCHAR 0x031C +STARTCHAR C065 ENCODING 796 SWIDTH 120 0 DWIDTH 2 0 @@ -12158,7 +11812,7 @@ 80 40 ENDCHAR -STARTCHAR 0x031D +STARTCHAR char792 ENCODING 797 SWIDTH 300 0 DWIDTH 5 0 @@ -12168,7 +11822,7 @@ 20 F8 ENDCHAR -STARTCHAR 0x031E +STARTCHAR char792 ENCODING 798 SWIDTH 300 0 DWIDTH 5 0 @@ -12178,7 +11832,7 @@ 20 20 ENDCHAR -STARTCHAR 0x031F +STARTCHAR char792 ENCODING 799 SWIDTH 300 0 DWIDTH 5 0 @@ -12190,7 +11844,7 @@ 20 20 ENDCHAR -STARTCHAR 0x0320 +STARTCHAR C069 ENCODING 800 SWIDTH 0 0 DWIDTH 0 0 @@ -12198,7 +11852,7 @@ BITMAP F0 ENDCHAR -STARTCHAR 0x0321 +STARTCHAR C079 ENCODING 801 SWIDTH 0 0 DWIDTH 0 0 @@ -12210,7 +11864,7 @@ A0 C0 ENDCHAR -STARTCHAR 0x0322 +STARTCHAR C079 ENCODING 802 SWIDTH 0 0 DWIDTH 0 0 @@ -12222,7 +11876,7 @@ A0 60 ENDCHAR -STARTCHAR 0x0323 +STARTCHAR C095 ENCODING 803 SWIDTH 0 0 DWIDTH 0 0 @@ -12231,7 +11885,7 @@ C0 C0 ENDCHAR -STARTCHAR 0x0324 +STARTCHAR C079 ENCODING 804 SWIDTH 0 0 DWIDTH 0 0 @@ -12240,7 +11894,7 @@ D8 D8 ENDCHAR -STARTCHAR 0x0325 +STARTCHAR C065 ENCODING 805 SWIDTH 0 0 DWIDTH 0 0 @@ -12251,7 +11905,7 @@ 90 60 ENDCHAR -STARTCHAR 0x0326 +STARTCHAR C044 ENCODING 806 SWIDTH 0 0 DWIDTH 0 0 @@ -12263,7 +11917,7 @@ 40 80 ENDCHAR -STARTCHAR 0x0327 +STARTCHAR C024 ENCODING 807 SWIDTH 420 0 DWIDTH 7 0 @@ -12273,7 +11927,7 @@ 20 E0 ENDCHAR -STARTCHAR 0x0328 +STARTCHAR C024 ENCODING 808 SWIDTH 0 0 DWIDTH 0 0 @@ -12283,7 +11937,7 @@ 90 60 ENDCHAR -STARTCHAR 0x0329 +STARTCHAR char781 ENCODING 809 SWIDTH 0 0 DWIDTH 0 0 @@ -12294,7 +11948,7 @@ 80 80 ENDCHAR -STARTCHAR 0x032A +STARTCHAR char810 ENCODING 810 SWIDTH 0 0 DWIDTH 0 0 @@ -12303,7 +11957,7 @@ F8 88 ENDCHAR -STARTCHAR 0x032B +STARTCHAR char810 ENCODING 811 SWIDTH 0 0 DWIDTH 0 0 @@ -12313,7 +11967,7 @@ A8 50 ENDCHAR -STARTCHAR 0x032C +STARTCHAR C079 ENCODING 812 SWIDTH 0 0 DWIDTH 0 0 @@ -12323,7 +11977,7 @@ 70 20 ENDCHAR -STARTCHAR 0x032D +STARTCHAR C079 ENCODING 813 SWIDTH 0 0 DWIDTH 0 0 @@ -12333,7 +11987,7 @@ 70 88 ENDCHAR -STARTCHAR 0x032E +STARTCHAR C065 ENCODING 814 SWIDTH 0 0 DWIDTH 0 0 @@ -12342,7 +11996,7 @@ 88 70 ENDCHAR -STARTCHAR 0x032F +STARTCHAR C065 ENCODING 815 SWIDTH 0 0 DWIDTH 0 0 @@ -12351,7 +12005,7 @@ 70 88 ENDCHAR -STARTCHAR 0x0330 +STARTCHAR C065 ENCODING 816 SWIDTH 0 0 DWIDTH 0 0 @@ -12361,7 +12015,7 @@ A8 90 ENDCHAR -STARTCHAR 0x0331 +STARTCHAR C069 ENCODING 817 SWIDTH 0 0 DWIDTH 0 0 @@ -12369,7 +12023,7 @@ BITMAP F8 ENDCHAR -STARTCHAR 0x0332 +STARTCHAR C069 ENCODING 818 SWIDTH 0 0 DWIDTH 0 0 @@ -12377,7 +12031,7 @@ BITMAP FFC0 ENDCHAR -STARTCHAR 0x0333 +STARTCHAR C069 ENCODING 819 SWIDTH 0 0 DWIDTH 0 0 @@ -12387,7 +12041,7 @@ 0000 FFC0 ENDCHAR -STARTCHAR 0x0334 +STARTCHAR C065 ENCODING 820 SWIDTH 0 0 DWIDTH 0 0 @@ -12397,7 +12051,7 @@ A8 90 ENDCHAR -STARTCHAR 0x0335 +STARTCHAR C069 ENCODING 821 SWIDTH 0 0 DWIDTH 0 0 @@ -12405,7 +12059,7 @@ BITMAP F8 ENDCHAR -STARTCHAR 0x0336 +STARTCHAR C069 ENCODING 822 SWIDTH 0 0 DWIDTH 0 0 @@ -12413,7 +12067,7 @@ BITMAP FFC0 ENDCHAR -STARTCHAR 0x0337 +STARTCHAR C047 ENCODING 823 SWIDTH 0 0 DWIDTH 0 0 @@ -12426,7 +12080,7 @@ 80 80 ENDCHAR -STARTCHAR 0x0338 +STARTCHAR C047 ENCODING 824 SWIDTH 0 0 DWIDTH 0 0 @@ -12445,7 +12099,7 @@ 80 80 ENDCHAR -STARTCHAR 0x0339 +STARTCHAR C065 ENCODING 825 SWIDTH 120 0 DWIDTH 2 0 @@ -12457,7 +12111,7 @@ 40 80 ENDCHAR -STARTCHAR 0x033A +STARTCHAR char810 ENCODING 826 SWIDTH 0 0 DWIDTH 0 0 @@ -12466,7 +12120,7 @@ 88 F8 ENDCHAR -STARTCHAR 0x033B +STARTCHAR char827 ENCODING 827 SWIDTH 0 0 DWIDTH 0 0 @@ -12476,7 +12130,7 @@ A0 E0 ENDCHAR -STARTCHAR 0x033C +STARTCHAR char828 ENCODING 828 SWIDTH 0 0 DWIDTH 0 0 @@ -12486,7 +12140,7 @@ 20 20 ENDCHAR -STARTCHAR 0x033D +STARTCHAR C065 ENCODING 829 SWIDTH 0 0 DWIDTH 0 0 @@ -12496,7 +12150,7 @@ 60 90 ENDCHAR -STARTCHAR 0x033E +STARTCHAR C065 ENCODING 830 SWIDTH 0 0 DWIDTH 0 0 @@ -12508,7 +12162,7 @@ 20 40 ENDCHAR -STARTCHAR 0x033F +STARTCHAR C069 ENCODING 831 SWIDTH 0 0 DWIDTH 0 0 @@ -12518,7 +12172,7 @@ 0000 FFC0 ENDCHAR -STARTCHAR 0x0340 +STARTCHAR C125 ENCODING 832 SWIDTH 0 0 DWIDTH 0 0 @@ -12529,7 +12183,7 @@ 40 20 ENDCHAR -STARTCHAR 0x0341 +STARTCHAR C125 ENCODING 833 SWIDTH 0 0 DWIDTH 0 0 @@ -12540,7 +12194,7 @@ 40 80 ENDCHAR -STARTCHAR 0x0342 +STARTCHAR C065 ENCODING 834 SWIDTH 0 0 DWIDTH 0 0 @@ -12550,7 +12204,7 @@ A8 90 ENDCHAR -STARTCHAR 0x0343 +STARTCHAR C044 ENCODING 835 SWIDTH 0 0 DWIDTH 0 0 @@ -12562,126 +12216,30 @@ 40 80 ENDCHAR -STARTCHAR 0x0385 +STARTCHAR char901 ENCODING 836 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 6 4 3 12 -BITMAP -10 -10 -EC -CC -ENDCHAR -STARTCHAR 0x0345 -ENCODING 837 -SWIDTH 300 0 -DWIDTH 5 0 -BBX 4 3 1 -3 -BITMAP -40 -90 -60 -ENDCHAR -STARTCHAR char838 -ENCODING 838 -SWIDTH 0 0 -DWIDTH 0 0 -BBX 5 2 1 12 -BITMAP -F8 -88 -ENDCHAR -STARTCHAR 0x0333 -ENCODING 839 SWIDTH 0 0 DWIDTH 0 0 -BBX 5 3 1 -3 -BITMAP -F8 -00 -F8 -ENDCHAR -STARTCHAR char840 -ENCODING 840 -SWIDTH 0 0 -DWIDTH 0 0 -BBX 3 4 1 -4 -BITMAP -A0 -A0 -A0 -A0 -ENDCHAR -STARTCHAR char840 -ENCODING 841 -SWIDTH 0 0 -DWIDTH 0 0 -BBX 3 4 1 -4 +BBX 5 5 0 12 BITMAP -E0 -20 20 20 -ENDCHAR -STARTCHAR 0x0342 -ENCODING 842 -SWIDTH 0 0 -DWIDTH 0 0 -BBX 7 3 0 12 -BITMAP -6A -92 -AC -ENDCHAR -STARTCHAR 0x0342 -ENCODING 843 -SWIDTH 0 0 -DWIDTH 0 0 -BBX 7 5 0 11 -BITMAP -08 -62 -92 -8C 20 -ENDCHAR -STARTCHAR 0x0342 -ENCODING 844 -SWIDTH 0 0 -DWIDTH 0 0 -BBX 5 6 0 12 -BITMAP -48 -A8 -90 -48 -A8 -90 -ENDCHAR -STARTCHAR 0x0333 -ENCODING 845 -SWIDTH 0 0 -DWIDTH 0 0 -BBX 7 3 1 -3 -BITMAP -44 -FE -44 +D8 +D8 ENDCHAR -STARTCHAR char840 -ENCODING 846 +STARTCHAR char837 +ENCODING 837 SWIDTH 0 0 DWIDTH 0 0 -BBX 3 5 1 -5 +BBX 4 4 0 -4 BITMAP -40 -E0 -40 -40 +C0 40 +50 +20 ENDCHAR -STARTCHAR 0x0360 +STARTCHAR C065 ENCODING 864 SWIDTH 0 0 DWIDTH 0 0 @@ -12691,7 +12249,7 @@ 8420 83C0 ENDCHAR -STARTCHAR 0x0361 +STARTCHAR C065 ENCODING 865 SWIDTH 0 0 DWIDTH 0 0 @@ -12700,18 +12258,8 @@ 3F80 4040 8020 -ENDCHAR -STARTCHAR 0x0333 -ENCODING 866 -SWIDTH 0 0 -DWIDTH 0 0 -BBX 9 3 1 -3 -BITMAP -0100 -FF80 -0100 ENDCHAR -STARTCHAR 0x0374 +STARTCHAR C125 ENCODING 884 SWIDTH 420 0 DWIDTH 7 0 @@ -12722,18 +12270,18 @@ 40 80 ENDCHAR -STARTCHAR 0x0375 +STARTCHAR C125 ENCODING 885 SWIDTH 420 0 DWIDTH 7 0 BBX 3 4 4 -2 BITMAP 20 +60 40 -C0 80 ENDCHAR -STARTCHAR 0x037A +STARTCHAR C024 ENCODING 890 SWIDTH 420 0 DWIDTH 7 0 @@ -12744,7 +12292,7 @@ 50 20 ENDCHAR -STARTCHAR 0x037E +STARTCHAR C059 ENCODING 894 SWIDTH 300 0 DWIDTH 5 0 @@ -12761,7 +12309,7 @@ 40 80 ENDCHAR -STARTCHAR 0x0384 +STARTCHAR char900 ENCODING 900 SWIDTH 300 0 DWIDTH 5 0 @@ -12771,7 +12319,7 @@ 40 80 ENDCHAR -STARTCHAR 0x0385 +STARTCHAR char901 ENCODING 901 SWIDTH 540 0 DWIDTH 9 0 @@ -12782,7 +12330,7 @@ EC CC ENDCHAR -STARTCHAR 0x0386 +STARTCHAR C065 ENCODING 902 SWIDTH 660 0 DWIDTH 11 0 @@ -12801,7 +12349,7 @@ 2080 F1E0 ENDCHAR -STARTCHAR 0x0387 +STARTCHAR char183 ENCODING 903 SWIDTH 420 0 DWIDTH 7 0 @@ -12867,7 +12415,7 @@ 08 3E ENDCHAR -STARTCHAR 0x038C +STARTCHAR C079 ENCODING 908 SWIDTH 780 0 DWIDTH 13 0 @@ -12924,7 +12472,7 @@ 28A0 38E0 ENDCHAR -STARTCHAR 0x0390 +STARTCHAR C105 ENCODING 912 SWIDTH 360 0 DWIDTH 6 0 @@ -12943,7 +12491,7 @@ 28 10 ENDCHAR -STARTCHAR 0x0391 +STARTCHAR C065 ENCODING 913 SWIDTH 660 0 DWIDTH 11 0 @@ -12961,7 +12509,7 @@ 2080 F1E0 ENDCHAR -STARTCHAR 0x0392 +STARTCHAR C066 ENCODING 914 SWIDTH 660 0 DWIDTH 11 0 @@ -12979,7 +12527,7 @@ 2080 FF00 ENDCHAR -STARTCHAR 0x0393 +STARTCHAR C071 ENCODING 915 SWIDTH 540 0 DWIDTH 9 0 @@ -12997,7 +12545,7 @@ 20 F8 ENDCHAR -STARTCHAR 0x0394 +STARTCHAR C068 ENCODING 916 SWIDTH 720 0 DWIDTH 12 0 @@ -13015,7 +12563,7 @@ 8020 FFE0 ENDCHAR -STARTCHAR 0x0395 +STARTCHAR C069 ENCODING 917 SWIDTH 660 0 DWIDTH 11 0 @@ -13033,7 +12581,7 @@ 2080 FF80 ENDCHAR -STARTCHAR 0x0396 +STARTCHAR C090 ENCODING 918 SWIDTH 480 0 DWIDTH 8 0 @@ -13051,7 +12599,7 @@ 46 FE ENDCHAR -STARTCHAR 0x0397 +STARTCHAR C072 ENCODING 919 SWIDTH 720 0 DWIDTH 12 0 @@ -13069,7 +12617,7 @@ 2080 FBE0 ENDCHAR -STARTCHAR 0x0398 +STARTCHAR C081 ENCODING 920 SWIDTH 720 0 DWIDTH 12 0 @@ -13087,7 +12635,7 @@ 2100 1E00 ENDCHAR -STARTCHAR 0x0399 +STARTCHAR C073 ENCODING 921 SWIDTH 360 0 DWIDTH 6 0 @@ -13105,7 +12653,7 @@ 20 F8 ENDCHAR -STARTCHAR 0x039A +STARTCHAR C075 ENCODING 922 SWIDTH 720 0 DWIDTH 12 0 @@ -13123,7 +12671,7 @@ 2080 F9E0 ENDCHAR -STARTCHAR 0x039B +STARTCHAR C076 ENCODING 923 SWIDTH 720 0 DWIDTH 12 0 @@ -13141,7 +12689,7 @@ 2080 F1E0 ENDCHAR -STARTCHAR 0x039C +STARTCHAR C077 ENCODING 924 SWIDTH 900 0 DWIDTH 15 0 @@ -13159,7 +12707,7 @@ 2310 FB7C ENDCHAR -STARTCHAR 0x039D +STARTCHAR C078 ENCODING 925 SWIDTH 720 0 DWIDTH 12 0 @@ -13177,7 +12725,7 @@ 2180 F880 ENDCHAR -STARTCHAR 0x039E +STARTCHAR C004 ENCODING 926 SWIDTH 540 0 DWIDTH 9 0 @@ -13195,7 +12743,7 @@ 81 FF ENDCHAR -STARTCHAR 0x039F +STARTCHAR C079 ENCODING 927 SWIDTH 720 0 DWIDTH 12 0 @@ -13213,7 +12761,7 @@ 2100 1E00 ENDCHAR -STARTCHAR 0x03A0 +STARTCHAR C080 ENCODING 928 SWIDTH 720 0 DWIDTH 12 0 @@ -13231,7 +12779,7 @@ 2080 FBE0 ENDCHAR -STARTCHAR 0x03A1 +STARTCHAR C082 ENCODING 929 SWIDTH 600 0 DWIDTH 10 0 @@ -13249,7 +12797,7 @@ 2000 F800 ENDCHAR -STARTCHAR 0x03A3 +STARTCHAR C083 ENCODING 931 SWIDTH 600 0 DWIDTH 10 0 @@ -13267,7 +12815,7 @@ 4180 FF80 ENDCHAR -STARTCHAR 0x03A4 +STARTCHAR C084 ENCODING 932 SWIDTH 600 0 DWIDTH 10 0 @@ -13285,7 +12833,7 @@ 0800 3E00 ENDCHAR -STARTCHAR 0x03A5 +STARTCHAR C089 ENCODING 933 SWIDTH 720 0 DWIDTH 12 0 @@ -13321,7 +12869,7 @@ 0800 3E00 ENDCHAR -STARTCHAR 0x03A7 +STARTCHAR C088 ENCODING 935 SWIDTH 660 0 DWIDTH 11 0 @@ -13339,7 +12887,7 @@ 2080 F1E0 ENDCHAR -STARTCHAR 0x03A8 +STARTCHAR C089 ENCODING 936 SWIDTH 660 0 DWIDTH 11 0 @@ -13375,7 +12923,7 @@ A280 E380 ENDCHAR -STARTCHAR 0x03AA +STARTCHAR C073 ENCODING 938 SWIDTH 360 0 DWIDTH 6 0 @@ -13396,7 +12944,7 @@ 20 F8 ENDCHAR -STARTCHAR 0x03AB +STARTCHAR C089 ENCODING 939 SWIDTH 720 0 DWIDTH 12 0 @@ -13417,7 +12965,7 @@ 0400 1F00 ENDCHAR -STARTCHAR 0x03AC +STARTCHAR C097 ENCODING 940 SWIDTH 480 0 DWIDTH 8 0 @@ -13435,7 +12983,7 @@ 98 66 ENDCHAR -STARTCHAR 0x03AD +STARTCHAR C090 ENCODING 941 SWIDTH 360 0 DWIDTH 6 0 @@ -13453,7 +13001,7 @@ 88 70 ENDCHAR -STARTCHAR 0x03AE +STARTCHAR C104 ENCODING 942 SWIDTH 420 0 DWIDTH 7 0 @@ -13475,7 +13023,7 @@ 04 04 ENDCHAR -STARTCHAR 0x03AF +STARTCHAR C105 ENCODING 943 SWIDTH 300 0 DWIDTH 5 0 @@ -13493,7 +13041,7 @@ 50 20 ENDCHAR -STARTCHAR 0x03B0 +STARTCHAR C117 ENCODING 944 SWIDTH 420 0 DWIDTH 7 0 @@ -13512,7 +13060,7 @@ 48 30 ENDCHAR -STARTCHAR 0x03B1 +STARTCHAR C097 ENCODING 945 SWIDTH 480 0 DWIDTH 8 0 @@ -13526,7 +13074,7 @@ 98 66 ENDCHAR -STARTCHAR 0x03B2 +STARTCHAR C098 ENCODING 946 SWIDTH 360 0 DWIDTH 6 0 @@ -13549,7 +13097,7 @@ 80 80 ENDCHAR -STARTCHAR 0x03B3 +STARTCHAR char947 ENCODING 947 SWIDTH 540 0 DWIDTH 9 0 @@ -13566,7 +13114,7 @@ 08 08 ENDCHAR -STARTCHAR 0x03B4 +STARTCHAR C100 ENCODING 948 SWIDTH 360 0 DWIDTH 6 0 @@ -13585,7 +13133,7 @@ 88 70 ENDCHAR -STARTCHAR 0x03B5 +STARTCHAR C090 ENCODING 949 SWIDTH 360 0 DWIDTH 6 0 @@ -13599,7 +13147,7 @@ 88 70 ENDCHAR -STARTCHAR 0x03B6 +STARTCHAR C122 ENCODING 950 SWIDTH 420 0 DWIDTH 7 0 @@ -13620,7 +13168,7 @@ 04 08 ENDCHAR -STARTCHAR 0x03B7 +STARTCHAR C104 ENCODING 951 SWIDTH 420 0 DWIDTH 7 0 @@ -13638,7 +13186,7 @@ 04 04 ENDCHAR -STARTCHAR 0x03B8 +STARTCHAR C111 ENCODING 952 SWIDTH 360 0 DWIDTH 6 0 @@ -13656,7 +13204,7 @@ 50 20 ENDCHAR -STARTCHAR 0x03B9 +STARTCHAR C105 ENCODING 953 SWIDTH 300 0 DWIDTH 5 0 @@ -13670,7 +13218,7 @@ 50 20 ENDCHAR -STARTCHAR 0x03BA +STARTCHAR C075 ENCODING 954 SWIDTH 480 0 DWIDTH 8 0 @@ -13684,7 +13232,7 @@ 48 E6 ENDCHAR -STARTCHAR 0x03BB +STARTCHAR C121 ENCODING 955 SWIDTH 420 0 DWIDTH 7 0 @@ -13701,7 +13249,7 @@ 84 84 ENDCHAR -STARTCHAR 0x03BC +STARTCHAR C104 ENCODING 956 SWIDTH 480 0 DWIDTH 8 0 @@ -13718,7 +13266,7 @@ 80 80 ENDCHAR -STARTCHAR 0x03BD +STARTCHAR C110 ENCODING 957 SWIDTH 420 0 DWIDTH 7 0 @@ -13732,7 +13280,7 @@ 30 20 ENDCHAR -STARTCHAR 0x03BE +STARTCHAR C099 ENCODING 958 SWIDTH 420 0 DWIDTH 7 0 @@ -13753,7 +13301,7 @@ 04 08 ENDCHAR -STARTCHAR 0x03BF +STARTCHAR C111 ENCODING 959 SWIDTH 360 0 DWIDTH 6 0 @@ -13767,7 +13315,7 @@ 88 70 ENDCHAR -STARTCHAR 0x03C0 +STARTCHAR C112 ENCODING 960 SWIDTH 480 0 DWIDTH 8 0 @@ -13781,7 +13329,7 @@ 88 86 ENDCHAR -STARTCHAR 0x03C1 +STARTCHAR C114 ENCODING 961 SWIDTH 360 0 DWIDTH 6 0 @@ -13799,7 +13347,7 @@ 80 80 ENDCHAR -STARTCHAR 0x03C2 +STARTCHAR C106 ENCODING 962 SWIDTH 300 0 DWIDTH 5 0 @@ -13816,7 +13364,7 @@ 10 20 ENDCHAR -STARTCHAR 0x03C3 +STARTCHAR C115 ENCODING 963 SWIDTH 420 0 DWIDTH 7 0 @@ -13830,7 +13378,7 @@ 88 70 ENDCHAR -STARTCHAR 0x03C4 +STARTCHAR C116 ENCODING 964 SWIDTH 420 0 DWIDTH 7 0 @@ -13844,7 +13392,7 @@ 14 08 ENDCHAR -STARTCHAR 0x03C5 +STARTCHAR C117 ENCODING 965 SWIDTH 420 0 DWIDTH 7 0 @@ -13858,7 +13406,7 @@ 48 30 ENDCHAR -STARTCHAR 0x03C6 +STARTCHAR C102 ENCODING 966 SWIDTH 360 0 DWIDTH 6 0 @@ -13878,7 +13426,7 @@ 20 20 ENDCHAR -STARTCHAR 0x03C7 +STARTCHAR C120 ENCODING 967 SWIDTH 420 0 DWIDTH 7 0 @@ -13895,7 +13443,7 @@ 54 8C ENDCHAR -STARTCHAR 0x03C8 +STARTCHAR C121 ENCODING 968 SWIDTH 600 0 DWIDTH 10 0 @@ -13916,7 +13464,7 @@ 0800 0800 ENDCHAR -STARTCHAR 0x03C9 +STARTCHAR C119 ENCODING 969 SWIDTH 600 0 DWIDTH 10 0 @@ -13930,7 +13478,7 @@ 8880 7700 ENDCHAR -STARTCHAR 0x03CA +STARTCHAR C105 ENCODING 970 SWIDTH 300 0 DWIDTH 5 0 @@ -13947,7 +13495,7 @@ 28 10 ENDCHAR -STARTCHAR 0x03CB +STARTCHAR C117 ENCODING 971 SWIDTH 420 0 DWIDTH 7 0 @@ -13964,7 +13512,7 @@ 48 30 ENDCHAR -STARTCHAR 0x03CC +STARTCHAR C111 ENCODING 972 SWIDTH 360 0 DWIDTH 6 0 @@ -13982,7 +13530,7 @@ 88 70 ENDCHAR -STARTCHAR 0x03CD +STARTCHAR C117 ENCODING 973 SWIDTH 420 0 DWIDTH 7 0 @@ -14000,7 +13548,7 @@ 48 30 ENDCHAR -STARTCHAR 0x03CE +STARTCHAR C119 ENCODING 974 SWIDTH 600 0 DWIDTH 10 0 @@ -14018,7 +13566,7 @@ 8880 7700 ENDCHAR -STARTCHAR 0x03D0 +STARTCHAR C025 ENCODING 976 SWIDTH 420 0 DWIDTH 7 0 @@ -14037,7 +13585,7 @@ 84 78 ENDCHAR -STARTCHAR 0x03D1 +STARTCHAR C117 ENCODING 977 SWIDTH 480 0 DWIDTH 8 0 @@ -14054,7 +13602,7 @@ 48 30 ENDCHAR -STARTCHAR 0x03D2 +STARTCHAR C085 ENCODING 978 SWIDTH 600 0 DWIDTH 10 0 @@ -14091,7 +13639,7 @@ 0200 0F80 ENDCHAR -STARTCHAR 0x03D4 +STARTCHAR C085 ENCODING 980 SWIDTH 600 0 DWIDTH 10 0 @@ -14112,7 +13660,7 @@ 0800 3E00 ENDCHAR -STARTCHAR 0x03D5 +STARTCHAR C102 ENCODING 981 SWIDTH 480 0 DWIDTH 8 0 @@ -14130,7 +13678,7 @@ 10 10 ENDCHAR -STARTCHAR 0x03D6 +STARTCHAR C119 ENCODING 982 SWIDTH 600 0 DWIDTH 10 0 @@ -14160,7 +13708,7 @@ 0A 0C ENDCHAR -STARTCHAR 0x03DA +STARTCHAR C106 ENCODING 986 SWIDTH 480 0 DWIDTH 8 0 @@ -14197,7 +13745,7 @@ 10 20 ENDCHAR -STARTCHAR 0x03DC +STARTCHAR C071 ENCODING 988 SWIDTH 540 0 DWIDTH 9 0 @@ -14305,7 +13853,7 @@ 44 E8 ENDCHAR -STARTCHAR 0x03E2 +STARTCHAR C087 ENCODING 994 SWIDTH 840 0 DWIDTH 14 0 @@ -14326,7 +13874,7 @@ 03E0 0600 ENDCHAR -STARTCHAR 0x03E3 +STARTCHAR C119 ENCODING 995 SWIDTH 600 0 DWIDTH 10 0 @@ -14343,7 +13891,7 @@ 0F00 1800 ENDCHAR -STARTCHAR 0x03E4 +STARTCHAR C082 ENCODING 996 SWIDTH 600 0 DWIDTH 10 0 @@ -14361,7 +13909,7 @@ 0200 0F80 ENDCHAR -STARTCHAR 0x03E5 +STARTCHAR C082 ENCODING 997 SWIDTH 360 0 DWIDTH 6 0 @@ -14379,7 +13927,7 @@ 08 08 ENDCHAR -STARTCHAR 0x03E6 +STARTCHAR C082 ENCODING 998 SWIDTH 660 0 DWIDTH 11 0 @@ -14400,7 +13948,7 @@ FF00 8000 ENDCHAR -STARTCHAR 0x03E7 +STARTCHAR char999 ENCODING 999 SWIDTH 600 0 DWIDTH 10 0 @@ -14415,7 +13963,7 @@ 9180 4F00 ENDCHAR -STARTCHAR 0x03E8 +STARTCHAR C083 ENCODING 1000 SWIDTH 480 0 DWIDTH 8 0 @@ -14435,7 +13983,7 @@ 70 1C ENDCHAR -STARTCHAR 0x03E9 +STARTCHAR C083 ENCODING 1001 SWIDTH 360 0 DWIDTH 6 0 @@ -14451,7 +13999,7 @@ 60 38 ENDCHAR -STARTCHAR 0x03EA +STARTCHAR C088 ENCODING 1002 SWIDTH 720 0 DWIDTH 12 0 @@ -14469,7 +14017,7 @@ 2080 FFE0 ENDCHAR -STARTCHAR 0x03EB +STARTCHAR C120 ENCODING 1003 SWIDTH 540 0 DWIDTH 9 0 @@ -14483,7 +14031,7 @@ 24 FF ENDCHAR -STARTCHAR 0x03EC +STARTCHAR C079 ENCODING 1004 SWIDTH 660 0 DWIDTH 11 0 @@ -14502,7 +14050,7 @@ 4080 3F00 ENDCHAR -STARTCHAR 0x03ED +STARTCHAR C079 ENCODING 1005 SWIDTH 420 0 DWIDTH 7 0 @@ -14517,7 +14065,7 @@ 84 78 ENDCHAR -STARTCHAR 0x03EE +STARTCHAR C073 ENCODING 1006 SWIDTH 660 0 DWIDTH 11 0 @@ -14535,7 +14083,7 @@ 0400 1F00 ENDCHAR -STARTCHAR 0x03EF +STARTCHAR C073 ENCODING 1007 SWIDTH 480 0 DWIDTH 8 0 @@ -14566,7 +14114,7 @@ 45 42 ENDCHAR -STARTCHAR 0x03F1 +STARTCHAR C114 ENCODING 1009 SWIDTH 360 0 DWIDTH 6 0 @@ -14584,7 +14132,7 @@ 88 70 ENDCHAR -STARTCHAR 0x03F2 +STARTCHAR C115 ENCODING 1010 SWIDTH 420 0 DWIDTH 7 0 @@ -14619,10 +14167,10 @@ 90 E0 ENDCHAR -STARTCHAR 0x0400 +STARTCHAR C069 ENCODING 1024 -SWIDTH 660 0 -DWIDTH 11 0 +SWIDTH 600 0 +DWIDTH 10 0 BBX 10 15 0 0 BITMAP 3000 @@ -14641,10 +14189,10 @@ 2080 FF80 ENDCHAR -STARTCHAR 0x0401 +STARTCHAR C062 ENCODING 1025 -SWIDTH 660 0 -DWIDTH 11 0 +SWIDTH 600 0 +DWIDTH 10 0 BBX 10 14 0 0 BITMAP 3600 @@ -14662,10 +14210,10 @@ 2080 FF80 ENDCHAR -STARTCHAR 0x0402 +STARTCHAR C116 ENCODING 1026 -SWIDTH 720 0 -DWIDTH 12 0 +SWIDTH 660 0 +DWIDTH 11 0 BBX 11 14 1 -3 BITMAP FF80 @@ -14683,10 +14231,10 @@ 0320 01C0 ENDCHAR -STARTCHAR 0x0403 +STARTCHAR C103 ENCODING 1027 -SWIDTH 660 0 -DWIDTH 11 0 +SWIDTH 540 0 +DWIDTH 9 0 BBX 9 15 0 0 BITMAP 0600 @@ -14705,10 +14253,10 @@ 2000 F800 ENDCHAR -STARTCHAR 0x0404 +STARTCHAR C124 ENCODING 1028 -SWIDTH 660 0 -DWIDTH 11 0 +SWIDTH 600 0 +DWIDTH 10 0 BBX 9 11 1 0 BITMAP 1E80 @@ -14723,10 +14271,10 @@ 2100 1E00 ENDCHAR -STARTCHAR 0x0405 +STARTCHAR C083 ENCODING 1029 -SWIDTH 540 0 -DWIDTH 9 0 +SWIDTH 420 0 +DWIDTH 7 0 BBX 6 11 1 0 BITMAP 7C @@ -14741,10 +14289,10 @@ 84 F8 ENDCHAR -STARTCHAR 0x0406 +STARTCHAR C073 ENCODING 1030 -SWIDTH 360 0 -DWIDTH 6 0 +SWIDTH 300 0 +DWIDTH 5 0 BBX 5 11 1 0 BITMAP F8 @@ -14759,10 +14307,10 @@ 20 F8 ENDCHAR -STARTCHAR 0x0407 +STARTCHAR C073 ENCODING 1031 -SWIDTH 360 0 -DWIDTH 6 0 +SWIDTH 300 0 +DWIDTH 5 0 BBX 5 14 1 0 BITMAP D8 @@ -14780,10 +14328,10 @@ 20 F8 ENDCHAR -STARTCHAR 0x0408 +STARTCHAR C074 ENCODING 1032 -SWIDTH 420 0 -DWIDTH 7 0 +SWIDTH 360 0 +DWIDTH 6 0 BBX 6 11 1 0 BITMAP 7C @@ -14798,10 +14346,10 @@ 90 E0 ENDCHAR -STARTCHAR 0x0409 +STARTCHAR C108 ENCODING 1033 -SWIDTH 960 0 -DWIDTH 16 0 +SWIDTH 900 0 +DWIDTH 15 0 BBX 14 11 1 0 BITMAP 7FC0 @@ -14816,10 +14364,10 @@ A108 C7F0 ENDCHAR -STARTCHAR 0x040A +STARTCHAR C110 ENCODING 1034 -SWIDTH 900 0 -DWIDTH 15 0 +SWIDTH 960 0 +DWIDTH 16 0 BBX 15 11 0 0 BITMAP FBE0 @@ -14834,10 +14382,10 @@ 2084 FBF8 ENDCHAR -STARTCHAR 0x040B +STARTCHAR C116 ENCODING 1035 -SWIDTH 840 0 -DWIDTH 14 0 +SWIDTH 780 0 +DWIDTH 13 0 BBX 13 11 1 0 BITMAP FF80 @@ -14852,10 +14400,10 @@ 0820 3EF8 ENDCHAR -STARTCHAR 0x040C +STARTCHAR C107 ENCODING 1036 -SWIDTH 720 0 -DWIDTH 12 0 +SWIDTH 660 0 +DWIDTH 11 0 BBX 11 15 1 0 BITMAP 0300 @@ -14874,10 +14422,10 @@ 2080 F9E0 ENDCHAR -STARTCHAR 0x040D +STARTCHAR C105 ENCODING 1037 -SWIDTH 720 0 -DWIDTH 12 0 +SWIDTH 660 0 +DWIDTH 11 0 BBX 11 15 0 0 BITMAP 3000 @@ -14896,10 +14444,10 @@ 3080 FBE0 ENDCHAR -STARTCHAR 0x040E +STARTCHAR C117 ENCODING 1038 -SWIDTH 720 0 -DWIDTH 12 0 +SWIDTH 660 0 +DWIDTH 11 0 BBX 11 14 0 0 BITMAP 1100 @@ -14917,10 +14465,10 @@ 4400 3800 ENDCHAR -STARTCHAR 0x040F +STARTCHAR C099 ENCODING 1039 -SWIDTH 720 0 -DWIDTH 12 0 +SWIDTH 660 0 +DWIDTH 11 0 BBX 11 13 0 -2 BITMAP FBE0 @@ -14937,7 +14485,7 @@ 0400 0400 ENDCHAR -STARTCHAR 0x0410 +STARTCHAR C097 ENCODING 1040 SWIDTH 660 0 DWIDTH 11 0 @@ -14955,10 +14503,10 @@ 2080 F1E0 ENDCHAR -STARTCHAR 0x0411 +STARTCHAR C098 ENCODING 1041 -SWIDTH 660 0 -DWIDTH 11 0 +SWIDTH 600 0 +DWIDTH 10 0 BBX 10 11 0 0 BITMAP FF80 @@ -14973,10 +14521,10 @@ 2080 FF00 ENDCHAR -STARTCHAR 0x0412 +STARTCHAR C119 ENCODING 1042 -SWIDTH 660 0 -DWIDTH 11 0 +SWIDTH 600 0 +DWIDTH 10 0 BBX 10 11 0 0 BITMAP FF00 @@ -14991,7 +14539,7 @@ 2080 FF00 ENDCHAR -STARTCHAR 0x0413 +STARTCHAR C103 ENCODING 1043 SWIDTH 540 0 DWIDTH 9 0 @@ -15009,10 +14557,10 @@ 2000 F800 ENDCHAR -STARTCHAR 0x0414 +STARTCHAR C100 ENCODING 1044 -SWIDTH 720 0 -DWIDTH 12 0 +SWIDTH 660 0 +DWIDTH 11 0 BBX 11 13 0 -2 BITMAP 3FE0 @@ -15029,10 +14577,10 @@ 8060 8020 ENDCHAR -STARTCHAR 0x0415 +STARTCHAR C101 ENCODING 1045 -SWIDTH 660 0 -DWIDTH 11 0 +SWIDTH 600 0 +DWIDTH 10 0 BBX 10 11 0 0 BITMAP FF80 @@ -15047,10 +14595,10 @@ 2080 FF80 ENDCHAR -STARTCHAR 0x0416 +STARTCHAR C118 ENCODING 1046 -SWIDTH 960 0 -DWIDTH 16 0 +SWIDTH 900 0 +DWIDTH 15 0 BBX 15 11 0 0 BITMAP F39E @@ -15065,10 +14613,10 @@ 2108 F39E ENDCHAR -STARTCHAR 0x0417 +STARTCHAR C122 ENCODING 1047 -SWIDTH 540 0 -DWIDTH 9 0 +SWIDTH 480 0 +DWIDTH 8 0 BBX 7 11 1 0 BITMAP BC @@ -15083,10 +14631,10 @@ 82 7C ENDCHAR -STARTCHAR 0x0418 +STARTCHAR C105 ENCODING 1048 -SWIDTH 720 0 -DWIDTH 12 0 +SWIDTH 660 0 +DWIDTH 11 0 BBX 11 11 0 0 BITMAP FBE0 @@ -15101,10 +14649,10 @@ 3080 FBE0 ENDCHAR -STARTCHAR 0x0419 +STARTCHAR C106 ENCODING 1049 -SWIDTH 720 0 -DWIDTH 12 0 +SWIDTH 660 0 +DWIDTH 11 0 BBX 11 15 0 0 BITMAP 1100 @@ -15123,10 +14671,10 @@ 3080 FBE0 ENDCHAR -STARTCHAR 0x041A +STARTCHAR C107 ENCODING 1050 -SWIDTH 720 0 -DWIDTH 12 0 +SWIDTH 660 0 +DWIDTH 11 0 BBX 11 11 1 0 BITMAP F9E0 @@ -15141,10 +14689,10 @@ 2080 F9E0 ENDCHAR -STARTCHAR 0x041B +STARTCHAR C108 ENCODING 1051 -SWIDTH 660 0 -DWIDTH 11 0 +SWIDTH 600 0 +DWIDTH 10 0 BBX 10 11 1 0 BITMAP 7FC0 @@ -15159,10 +14707,10 @@ A100 C7C0 ENDCHAR -STARTCHAR 0x041C +STARTCHAR C109 ENCODING 1052 -SWIDTH 900 0 -DWIDTH 15 0 +SWIDTH 840 0 +DWIDTH 14 0 BBX 14 11 0 0 BITMAP F03C @@ -15177,10 +14725,10 @@ 2310 FB7C ENDCHAR -STARTCHAR 0x041D +STARTCHAR C110 ENCODING 1053 -SWIDTH 720 0 -DWIDTH 12 0 +SWIDTH 660 0 +DWIDTH 11 0 BBX 11 11 0 0 BITMAP FBE0 @@ -15195,10 +14743,10 @@ 2080 FBE0 ENDCHAR -STARTCHAR 0x041E +STARTCHAR C111 ENCODING 1054 -SWIDTH 720 0 -DWIDTH 12 0 +SWIDTH 600 0 +DWIDTH 10 0 BBX 10 11 1 0 BITMAP 1E00 @@ -15213,10 +14761,10 @@ 2100 1E00 ENDCHAR -STARTCHAR 0x041F +STARTCHAR C112 ENCODING 1055 -SWIDTH 720 0 -DWIDTH 12 0 +SWIDTH 660 0 +DWIDTH 11 0 BBX 11 11 0 0 BITMAP FFE0 @@ -15231,10 +14779,10 @@ 2080 FBE0 ENDCHAR -STARTCHAR 0x0420 +STARTCHAR C114 ENCODING 1056 -SWIDTH 660 0 -DWIDTH 11 0 +SWIDTH 540 0 +DWIDTH 9 0 BBX 9 11 0 0 BITMAP FF00 @@ -15249,10 +14797,10 @@ 2000 F800 ENDCHAR -STARTCHAR 0x0421 +STARTCHAR C115 ENCODING 1057 -SWIDTH 660 0 -DWIDTH 11 0 +SWIDTH 600 0 +DWIDTH 10 0 BBX 9 11 1 0 BITMAP 1E80 @@ -15267,10 +14815,10 @@ 2100 1E00 ENDCHAR -STARTCHAR 0x0422 +STARTCHAR C116 ENCODING 1058 -SWIDTH 660 0 -DWIDTH 11 0 +SWIDTH 540 0 +DWIDTH 9 0 BBX 9 11 1 0 BITMAP FF80 @@ -15285,10 +14833,10 @@ 0800 3E00 ENDCHAR -STARTCHAR 0x0423 +STARTCHAR C117 ENCODING 1059 -SWIDTH 720 0 -DWIDTH 12 0 +SWIDTH 660 0 +DWIDTH 11 0 BBX 11 11 0 0 BITMAP F1E0 @@ -15303,10 +14851,10 @@ 4400 3800 ENDCHAR -STARTCHAR 0x0424 +STARTCHAR C102 ENCODING 1060 -SWIDTH 720 0 -DWIDTH 12 0 +SWIDTH 660 0 +DWIDTH 11 0 BBX 11 11 0 0 BITMAP 0E00 @@ -15321,7 +14869,7 @@ 0400 0E00 ENDCHAR -STARTCHAR 0x0425 +STARTCHAR C104 ENCODING 1061 SWIDTH 660 0 DWIDTH 11 0 @@ -15339,10 +14887,10 @@ 2080 F1E0 ENDCHAR -STARTCHAR 0x0426 +STARTCHAR C099 ENCODING 1062 -SWIDTH 720 0 -DWIDTH 12 0 +SWIDTH 660 0 +DWIDTH 11 0 BBX 11 13 0 -2 BITMAP FBE0 @@ -15359,10 +14907,10 @@ 0060 0020 ENDCHAR -STARTCHAR 0x0427 +STARTCHAR C126 ENCODING 1063 -SWIDTH 720 0 -DWIDTH 12 0 +SWIDTH 540 0 +DWIDTH 9 0 BBX 9 11 1 0 BITMAP E380 @@ -15377,10 +14925,10 @@ 0100 0380 ENDCHAR -STARTCHAR 0x0428 +STARTCHAR C123 ENCODING 1064 -SWIDTH 1020 0 -DWIDTH 17 0 +SWIDTH 900 0 +DWIDTH 15 0 BBX 15 11 0 0 BITMAP F39E @@ -15395,10 +14943,10 @@ 2108 FFFE ENDCHAR -STARTCHAR 0x0429 +STARTCHAR C125 ENCODING 1065 -SWIDTH 1020 0 -DWIDTH 17 0 +SWIDTH 900 0 +DWIDTH 15 0 BBX 15 13 0 -2 BITMAP F39E @@ -15415,10 +14963,10 @@ 0006 0002 ENDCHAR -STARTCHAR 0x042A +STARTCHAR C127 ENCODING 1066 -SWIDTH 900 0 -DWIDTH 15 0 +SWIDTH 840 0 +DWIDTH 14 0 BBX 13 11 0 0 BITMAP FF00 @@ -15433,10 +14981,10 @@ 0410 1FE0 ENDCHAR -STARTCHAR 0x042B +STARTCHAR C121 ENCODING 1067 -SWIDTH 1020 0 -DWIDTH 17 0 +SWIDTH 900 0 +DWIDTH 15 0 BBX 15 11 1 0 BITMAP F83E @@ -15451,7 +14999,7 @@ 20C8 FF3E ENDCHAR -STARTCHAR 0x042C +STARTCHAR C120 ENCODING 1068 SWIDTH 660 0 DWIDTH 11 0 @@ -15469,10 +15017,10 @@ 2080 FF00 ENDCHAR -STARTCHAR 0x042D +STARTCHAR C124 ENCODING 1069 -SWIDTH 660 0 -DWIDTH 11 0 +SWIDTH 600 0 +DWIDTH 10 0 BBX 9 11 1 0 BITMAP BC00 @@ -15487,7 +15035,7 @@ 4200 3C00 ENDCHAR -STARTCHAR 0x042E +STARTCHAR C096 ENCODING 1070 SWIDTH 1080 0 DWIDTH 18 0 @@ -15505,10 +15053,10 @@ 208200 F87C00 ENDCHAR -STARTCHAR 0x042F +STARTCHAR C113 ENCODING 1071 -SWIDTH 720 0 -DWIDTH 12 0 +SWIDTH 660 0 +DWIDTH 11 0 BBX 11 11 0 0 BITMAP 1FE0 @@ -15523,7 +15071,7 @@ 2080 E3E0 ENDCHAR -STARTCHAR 0x0430 +STARTCHAR C065 ENCODING 1072 SWIDTH 420 0 DWIDTH 7 0 @@ -15537,7 +15085,7 @@ 88 7C ENDCHAR -STARTCHAR 0x0431 +STARTCHAR C066 ENCODING 1073 SWIDTH 360 0 DWIDTH 6 0 @@ -15555,7 +15103,7 @@ 88 70 ENDCHAR -STARTCHAR 0x0432 +STARTCHAR C087 ENCODING 1074 SWIDTH 420 0 DWIDTH 7 0 @@ -15569,7 +15117,7 @@ 44 F8 ENDCHAR -STARTCHAR 0x0433 +STARTCHAR C071 ENCODING 1075 SWIDTH 420 0 DWIDTH 7 0 @@ -15583,7 +15131,7 @@ 40 F0 ENDCHAR -STARTCHAR 0x0434 +STARTCHAR C068 ENCODING 1076 SWIDTH 480 0 DWIDTH 8 0 @@ -15599,7 +15147,7 @@ 82 82 ENDCHAR -STARTCHAR 0x0435 +STARTCHAR C069 ENCODING 1077 SWIDTH 360 0 DWIDTH 6 0 @@ -15613,7 +15161,7 @@ 88 70 ENDCHAR -STARTCHAR 0x0436 +STARTCHAR C086 ENCODING 1078 SWIDTH 720 0 DWIDTH 12 0 @@ -15627,7 +15175,7 @@ 2480 EEE0 ENDCHAR -STARTCHAR 0x0437 +STARTCHAR C090 ENCODING 1079 SWIDTH 360 0 DWIDTH 6 0 @@ -15641,7 +15189,7 @@ 88 70 ENDCHAR -STARTCHAR 0x0438 +STARTCHAR C073 ENCODING 1080 SWIDTH 480 0 DWIDTH 8 0 @@ -15655,7 +15203,7 @@ 64 EE ENDCHAR -STARTCHAR 0x0439 +STARTCHAR C074 ENCODING 1081 SWIDTH 480 0 DWIDTH 8 0 @@ -15673,7 +15221,7 @@ 64 EE ENDCHAR -STARTCHAR 0x043A +STARTCHAR C075 ENCODING 1082 SWIDTH 480 0 DWIDTH 8 0 @@ -15687,7 +15235,7 @@ 48 E6 ENDCHAR -STARTCHAR 0x043B +STARTCHAR C076 ENCODING 1083 SWIDTH 480 0 DWIDTH 8 0 @@ -15701,7 +15249,7 @@ C4 CE ENDCHAR -STARTCHAR 0x043C +STARTCHAR C077 ENCODING 1084 SWIDTH 600 0 DWIDTH 10 0 @@ -15715,7 +15263,7 @@ 4900 EB80 ENDCHAR -STARTCHAR 0x043D +STARTCHAR C078 ENCODING 1085 SWIDTH 480 0 DWIDTH 8 0 @@ -15729,7 +15277,7 @@ 44 EE ENDCHAR -STARTCHAR 0x043E +STARTCHAR C079 ENCODING 1086 SWIDTH 360 0 DWIDTH 6 0 @@ -15743,7 +15291,7 @@ 88 70 ENDCHAR -STARTCHAR 0x043F +STARTCHAR C080 ENCODING 1087 SWIDTH 480 0 DWIDTH 8 0 @@ -15757,7 +15305,7 @@ 44 EE ENDCHAR -STARTCHAR 0x0440 +STARTCHAR C082 ENCODING 1088 SWIDTH 420 0 DWIDTH 7 0 @@ -15774,7 +15322,7 @@ 40 E0 ENDCHAR -STARTCHAR 0x0441 +STARTCHAR C083 ENCODING 1089 SWIDTH 360 0 DWIDTH 6 0 @@ -15788,7 +15336,7 @@ 88 70 ENDCHAR -STARTCHAR 0x0442 +STARTCHAR C084 ENCODING 1090 SWIDTH 480 0 DWIDTH 8 0 @@ -15802,7 +15350,7 @@ 10 7C ENDCHAR -STARTCHAR 0x0443 +STARTCHAR C085 ENCODING 1091 SWIDTH 540 0 DWIDTH 9 0 @@ -15819,7 +15367,7 @@ 10 E0 ENDCHAR -STARTCHAR 0x0444 +STARTCHAR C070 ENCODING 1092 SWIDTH 600 0 DWIDTH 10 0 @@ -15839,7 +15387,7 @@ 0800 1C00 ENDCHAR -STARTCHAR 0x0445 +STARTCHAR C072 ENCODING 1093 SWIDTH 540 0 DWIDTH 9 0 @@ -15853,7 +15401,7 @@ 24 E7 ENDCHAR -STARTCHAR 0x0446 +STARTCHAR C067 ENCODING 1094 SWIDTH 480 0 DWIDTH 8 0 @@ -15869,7 +15417,7 @@ 02 02 ENDCHAR -STARTCHAR 0x0447 +STARTCHAR C094 ENCODING 1095 SWIDTH 480 0 DWIDTH 8 0 @@ -15883,7 +15431,7 @@ 04 0E ENDCHAR -STARTCHAR 0x0448 +STARTCHAR C091 ENCODING 1096 SWIDTH 720 0 DWIDTH 12 0 @@ -15897,7 +15445,7 @@ 4440 FFE0 ENDCHAR -STARTCHAR 0x0449 +STARTCHAR C093 ENCODING 1097 SWIDTH 720 0 DWIDTH 12 0 @@ -15913,7 +15461,7 @@ 0020 0020 ENDCHAR -STARTCHAR 0x044A +STARTCHAR C095 ENCODING 1098 SWIDTH 540 0 DWIDTH 9 0 @@ -15927,7 +15475,7 @@ 11 3E ENDCHAR -STARTCHAR 0x044B +STARTCHAR C089 ENCODING 1099 SWIDTH 600 0 DWIDTH 10 0 @@ -15941,7 +15489,7 @@ 4500 FB80 ENDCHAR -STARTCHAR 0x044C +STARTCHAR C088 ENCODING 1100 SWIDTH 420 0 DWIDTH 7 0 @@ -15955,7 +15503,7 @@ 44 F8 ENDCHAR -STARTCHAR 0x044D +STARTCHAR C092 ENCODING 1101 SWIDTH 420 0 DWIDTH 7 0 @@ -15969,7 +15517,7 @@ 88 70 ENDCHAR -STARTCHAR 0x044E +STARTCHAR C064 ENCODING 1102 SWIDTH 720 0 DWIDTH 12 0 @@ -15983,7 +15531,7 @@ 4440 E380 ENDCHAR -STARTCHAR 0x044F +STARTCHAR C081 ENCODING 1103 SWIDTH 420 0 DWIDTH 7 0 @@ -15997,7 +15545,7 @@ 28 CC ENDCHAR -STARTCHAR 0x0450 +STARTCHAR C101 ENCODING 1104 SWIDTH 360 0 DWIDTH 6 0 @@ -16015,7 +15563,7 @@ 88 70 ENDCHAR -STARTCHAR 0x0451 +STARTCHAR C060 ENCODING 1105 SWIDTH 360 0 DWIDTH 6 0 @@ -16032,7 +15580,7 @@ 88 70 ENDCHAR -STARTCHAR 0x0452 +STARTCHAR C104 ENCODING 1106 SWIDTH 420 0 DWIDTH 7 0 @@ -16053,7 +15601,7 @@ 34 18 ENDCHAR -STARTCHAR 0x0453 +STARTCHAR C071 ENCODING 1107 SWIDTH 420 0 DWIDTH 7 0 @@ -16071,7 +15619,7 @@ 40 F0 ENDCHAR -STARTCHAR 0x0454 +STARTCHAR C092 ENCODING 1108 SWIDTH 420 0 DWIDTH 7 0 @@ -16085,7 +15633,7 @@ 44 38 ENDCHAR -STARTCHAR 0x0455 +STARTCHAR C115 ENCODING 1109 SWIDTH 360 0 DWIDTH 6 0 @@ -16117,7 +15665,7 @@ 40 E0 ENDCHAR -STARTCHAR 0x0457 +STARTCHAR C105 ENCODING 1111 SWIDTH 240 0 DWIDTH 4 0 @@ -16155,7 +15703,7 @@ 90 E0 ENDCHAR -STARTCHAR 0x0459 +STARTCHAR C076 ENCODING 1113 SWIDTH 660 0 DWIDTH 11 0 @@ -16169,7 +15717,7 @@ C440 CF80 ENDCHAR -STARTCHAR 0x045A +STARTCHAR C078 ENCODING 1114 SWIDTH 660 0 DWIDTH 11 0 @@ -16183,7 +15731,7 @@ 4440 EF80 ENDCHAR -STARTCHAR 0x045B +STARTCHAR C104 ENCODING 1115 SWIDTH 480 0 DWIDTH 8 0 @@ -16201,7 +15749,7 @@ 44 EE ENDCHAR -STARTCHAR 0x045C +STARTCHAR C075 ENCODING 1116 SWIDTH 480 0 DWIDTH 8 0 @@ -16219,7 +15767,7 @@ 48 E6 ENDCHAR -STARTCHAR 0x045D +STARTCHAR C073 ENCODING 1117 SWIDTH 480 0 DWIDTH 8 0 @@ -16237,7 +15785,7 @@ 64 EE ENDCHAR -STARTCHAR 0x045E +STARTCHAR C085 ENCODING 1118 SWIDTH 540 0 DWIDTH 9 0 @@ -16257,7 +15805,7 @@ 10 E0 ENDCHAR -STARTCHAR 0x045F +STARTCHAR C080 ENCODING 1119 SWIDTH 480 0 DWIDTH 8 0 @@ -16275,8 +15823,8 @@ ENDCHAR STARTCHAR 0x0460 ENCODING 1120 -SWIDTH 900 0 -DWIDTH 15 0 +SWIDTH 780 0 +DWIDTH 13 0 BBX 13 11 1 0 BITMAP 3060 @@ -16343,8 +15891,8 @@ ENDCHAR STARTCHAR 0x0464 ENCODING 1124 -SWIDTH 1020 0 -DWIDTH 17 0 +SWIDTH 960 0 +DWIDTH 16 0 BBX 15 11 0 0 BITMAP F87A @@ -16375,8 +15923,8 @@ ENDCHAR STARTCHAR 0x0466 ENCODING 1126 -SWIDTH 1020 0 -DWIDTH 17 0 +SWIDTH 900 0 +DWIDTH 15 0 BBX 15 11 0 0 BITMAP 0100 @@ -16407,8 +15955,8 @@ ENDCHAR STARTCHAR 0x0468 ENCODING 1128 -SWIDTH 1260 0 -DWIDTH 21 0 +SWIDTH 1200 0 +DWIDTH 20 0 BBX 20 11 0 0 BITMAP F80800 @@ -16439,8 +15987,8 @@ ENDCHAR STARTCHAR 0x046A ENCODING 1130 -SWIDTH 1020 0 -DWIDTH 17 0 +SWIDTH 900 0 +DWIDTH 15 0 BBX 15 11 0 0 BITMAP 1FF0 @@ -16471,8 +16019,8 @@ ENDCHAR STARTCHAR 0x046C ENCODING 1132 -SWIDTH 1260 0 -DWIDTH 21 0 +SWIDTH 1200 0 +DWIDTH 20 0 BBX 20 11 0 0 BITMAP F8FF80 @@ -16503,8 +16051,8 @@ ENDCHAR STARTCHAR 0x046E ENCODING 1134 -SWIDTH 600 0 -DWIDTH 10 0 +SWIDTH 540 0 +DWIDTH 9 0 BBX 8 18 0 -3 BITMAP 22 @@ -16549,8 +16097,8 @@ ENDCHAR STARTCHAR 0x0470 ENCODING 1136 -SWIDTH 720 0 -DWIDTH 12 0 +SWIDTH 600 0 +DWIDTH 10 0 BBX 10 11 1 0 BITMAP 1F00 @@ -16588,8 +16136,8 @@ ENDCHAR STARTCHAR 0x0472 ENCODING 1138 -SWIDTH 720 0 -DWIDTH 12 0 +SWIDTH 600 0 +DWIDTH 10 0 BBX 10 11 1 0 BITMAP 1E00 @@ -16620,8 +16168,8 @@ ENDCHAR STARTCHAR 0x0474 ENCODING 1140 -SWIDTH 780 0 -DWIDTH 13 0 +SWIDTH 660 0 +DWIDTH 11 0 BBX 11 11 0 0 BITMAP F0E0 @@ -16652,8 +16200,8 @@ ENDCHAR STARTCHAR 0x0476 ENCODING 1142 -SWIDTH 780 0 -DWIDTH 13 0 +SWIDTH 660 0 +DWIDTH 11 0 BBX 11 16 0 0 BITMAP 1400 @@ -16694,8 +16242,8 @@ ENDCHAR STARTCHAR 0x0478 ENCODING 1144 -SWIDTH 1140 0 -DWIDTH 19 0 +SWIDTH 1020 0 +DWIDTH 17 0 BBX 17 14 1 -3 BITMAP 100000 @@ -16732,8 +16280,8 @@ ENDCHAR STARTCHAR 0x047A ENCODING 1146 -SWIDTH 840 0 -DWIDTH 14 0 +SWIDTH 720 0 +DWIDTH 12 0 BBX 12 13 1 -1 BITMAP 0600 @@ -16768,8 +16316,8 @@ ENDCHAR STARTCHAR 0x047C ENCODING 1148 -SWIDTH 900 0 -DWIDTH 15 0 +SWIDTH 780 0 +DWIDTH 13 0 BBX 13 16 1 0 BITMAP 0F00 @@ -16809,8 +16357,8 @@ ENDCHAR STARTCHAR 0x047E ENCODING 1150 -SWIDTH 900 0 -DWIDTH 15 0 +SWIDTH 780 0 +DWIDTH 13 0 BBX 13 14 1 0 BITMAP 1FC0 @@ -16847,8 +16395,8 @@ ENDCHAR STARTCHAR 0x0480 ENCODING 1152 -SWIDTH 660 0 -DWIDTH 11 0 +SWIDTH 540 0 +DWIDTH 9 0 BBX 9 14 1 -3 BITMAP 1E80 @@ -16940,28 +16488,60 @@ F8 08 ENDCHAR -STARTCHAR 0x048E -ENCODING 1166 +STARTCHAR C120 +ENCODING 1164 SWIDTH 660 0 DWIDTH 11 0 -BBX 9 11 0 0 +BBX 10 11 0 0 BITMAP -FF00 -2180 -2080 -2480 -2780 -3F00 -2100 2000 2000 -2000 F800 +2000 +2000 +3F80 +20C0 +2040 +2040 +2080 +FF00 ENDCHAR -STARTCHAR 0x048F -ENCODING 1167 +STARTCHAR C088 +ENCODING 1165 SWIDTH 420 0 DWIDTH 7 0 +BBX 6 7 1 0 +BITMAP +40 +E0 +40 +78 +44 +44 +F8 +ENDCHAR +STARTCHAR 0x048E +ENCODING 1166 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 9 11 0 0 +BITMAP +FF00 +2180 +2080 +2480 +2780 +3F00 +2100 +2000 +2000 +2000 +F800 +ENDCHAR +STARTCHAR 0x048F +ENCODING 1167 +SWIDTH 420 0 +DWIDTH 7 0 BBX 6 10 1 -3 BITMAP F8 @@ -17046,8 +16626,8 @@ ENDCHAR STARTCHAR 0x0494 ENCODING 1172 -SWIDTH 660 0 -DWIDTH 11 0 +SWIDTH 600 0 +DWIDTH 10 0 BBX 9 14 1 -3 BITMAP FF00 @@ -17084,8 +16664,8 @@ ENDCHAR STARTCHAR 0x0496 ENCODING 1174 -SWIDTH 960 0 -DWIDTH 16 0 +SWIDTH 900 0 +DWIDTH 15 0 BBX 15 14 0 -3 BITMAP F39E @@ -17121,8 +16701,8 @@ ENDCHAR STARTCHAR 0x0498 ENCODING 1176 -SWIDTH 540 0 -DWIDTH 9 0 +SWIDTH 480 0 +DWIDTH 8 0 BBX 7 14 1 -3 BITMAP BC @@ -17159,8 +16739,8 @@ ENDCHAR STARTCHAR 0x049A ENCODING 1178 -SWIDTH 720 0 -DWIDTH 12 0 +SWIDTH 660 0 +DWIDTH 11 0 BBX 11 14 1 -3 BITMAP F9E0 @@ -17196,8 +16776,8 @@ ENDCHAR STARTCHAR 0x049C ENCODING 1180 -SWIDTH 720 0 -DWIDTH 12 0 +SWIDTH 660 0 +DWIDTH 11 0 BBX 11 11 1 0 BITMAP F9E0 @@ -17228,8 +16808,8 @@ ENDCHAR STARTCHAR 0x049E ENCODING 1182 -SWIDTH 720 0 -DWIDTH 12 0 +SWIDTH 660 0 +DWIDTH 11 0 BBX 11 11 1 0 BITMAP F9E0 @@ -17292,8 +16872,8 @@ ENDCHAR STARTCHAR 0x04A2 ENCODING 1186 -SWIDTH 780 0 -DWIDTH 13 0 +SWIDTH 660 0 +DWIDTH 11 0 BBX 11 14 0 -3 BITMAP FBE0 @@ -17361,8 +16941,8 @@ ENDCHAR STARTCHAR 0x04A6 ENCODING 1190 -SWIDTH 1020 0 -DWIDTH 17 0 +SWIDTH 960 0 +DWIDTH 16 0 BBX 15 14 0 -3 BITMAP FFE0 @@ -17399,8 +16979,8 @@ ENDCHAR STARTCHAR 0x04A8 ENCODING 1192 -SWIDTH 780 0 -DWIDTH 13 0 +SWIDTH 660 0 +DWIDTH 11 0 BBX 11 11 1 0 BITMAP 1F00 @@ -17431,8 +17011,8 @@ ENDCHAR STARTCHAR 0x04AA ENCODING 1194 -SWIDTH 660 0 -DWIDTH 11 0 +SWIDTH 600 0 +DWIDTH 10 0 BBX 9 14 1 -3 BITMAP 1E80 @@ -17469,8 +17049,8 @@ ENDCHAR STARTCHAR 0x04AC ENCODING 1196 -SWIDTH 660 0 -DWIDTH 11 0 +SWIDTH 540 0 +DWIDTH 9 0 BBX 9 14 1 -3 BITMAP FF80 @@ -17506,8 +17086,8 @@ ENDCHAR STARTCHAR 0x04AE ENCODING 1198 -SWIDTH 720 0 -DWIDTH 12 0 +SWIDTH 660 0 +DWIDTH 11 0 BBX 11 14 0 -3 BITMAP F1E0 @@ -17544,8 +17124,8 @@ ENDCHAR STARTCHAR 0x04B0 ENCODING 1200 -SWIDTH 720 0 -DWIDTH 12 0 +SWIDTH 660 0 +DWIDTH 11 0 BBX 11 14 0 -3 BITMAP F1E0 @@ -17619,8 +17199,8 @@ ENDCHAR STARTCHAR 0x04B4 ENCODING 1204 -SWIDTH 1020 0 -DWIDTH 17 0 +SWIDTH 900 0 +DWIDTH 15 0 BBX 15 13 0 -2 BITMAP FFBE @@ -17655,8 +17235,8 @@ ENDCHAR STARTCHAR 0x04B6 ENCODING 1206 -SWIDTH 720 0 -DWIDTH 12 0 +SWIDTH 600 0 +DWIDTH 10 0 BBX 10 14 1 -3 BITMAP E380 @@ -17692,8 +17272,8 @@ ENDCHAR STARTCHAR 0x04B8 ENCODING 1208 -SWIDTH 660 0 -DWIDTH 11 0 +SWIDTH 540 0 +DWIDTH 9 0 BBX 9 11 1 0 BITMAP E380 @@ -17756,8 +17336,8 @@ ENDCHAR STARTCHAR 0x04BC ENCODING 1212 -SWIDTH 840 0 -DWIDTH 14 0 +SWIDTH 780 0 +DWIDTH 13 0 BBX 13 11 0 0 BITMAP 03C0 @@ -17788,8 +17368,8 @@ ENDCHAR STARTCHAR 0x04BE ENCODING 1214 -SWIDTH 840 0 -DWIDTH 14 0 +SWIDTH 780 0 +DWIDTH 13 0 BBX 13 14 0 -3 BITMAP 03C0 @@ -17826,8 +17406,8 @@ ENDCHAR STARTCHAR 0x04C0 ENCODING 1216 -SWIDTH 360 0 -DWIDTH 6 0 +SWIDTH 300 0 +DWIDTH 5 0 BBX 5 11 1 0 BITMAP F8 @@ -17844,8 +17424,8 @@ ENDCHAR STARTCHAR 0x04C1 ENCODING 1217 -SWIDTH 960 0 -DWIDTH 16 0 +SWIDTH 900 0 +DWIDTH 15 0 BBX 15 14 0 0 BITMAP 0440 @@ -17882,8 +17462,8 @@ ENDCHAR STARTCHAR 0x04C3 ENCODING 1219 -SWIDTH 780 0 -DWIDTH 13 0 +SWIDTH 660 0 +DWIDTH 11 0 BBX 11 14 0 -3 BITMAP F9E0 @@ -17918,46 +17498,10 @@ 34 18 ENDCHAR -STARTCHAR 0x04C5 -ENCODING 1221 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 10 13 1 -2 -BITMAP -7FC0 -2100 -2100 -2100 -2100 -2100 -2100 -2100 -2100 -A100 -C7C0 -00C0 -0040 -ENDCHAR -STARTCHAR 0x04C6 -ENCODING 1222 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 9 1 -2 -BITMAP -FE -44 -44 -44 -44 -C4 -CE -02 -02 -ENDCHAR STARTCHAR 0x04C7 ENCODING 1223 -SWIDTH 780 0 -DWIDTH 13 0 +SWIDTH 660 0 +DWIDTH 11 0 BBX 11 14 0 -3 BITMAP FBE0 @@ -17992,54 +17536,10 @@ 34 18 ENDCHAR -STARTCHAR 0x04C9 -ENCODING 1225 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 11 17 0 -2 -BITMAP -1100 -0E00 -0000 -0000 -FBE0 -2180 -2180 -2280 -2280 -2480 -2880 -2880 -3080 -3080 -FBE0 -0060 -0020 -ENDCHAR -STARTCHAR 0x04CA -ENCODING 1226 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 13 1 -2 -BITMAP -44 -38 -00 -00 -EE -4C -54 -54 -54 -64 -EE -02 -02 -ENDCHAR STARTCHAR 0x04CB ENCODING 1227 -SWIDTH 660 0 -DWIDTH 11 0 +SWIDTH 540 0 +DWIDTH 9 0 BBX 9 14 1 -3 BITMAP E380 @@ -18073,42 +17573,6 @@ 08 08 ENDCHAR -STARTCHAR 0x04CD -ENCODING 1229 -SWIDTH 900 0 -DWIDTH 15 0 -BBX 14 13 0 -2 -BITMAP -F03C -3030 -3030 -2850 -2850 -2890 -2490 -2490 -2310 -2310 -FB7C -000C -0004 -ENDCHAR -STARTCHAR 0x04CE -ENCODING 1230 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 9 1 -2 -BITMAP -C180 -6300 -6300 -5500 -5500 -4900 -EB80 -0080 -0080 -ENDCHAR STARTCHAR 0x04D0 ENCODING 1232 SWIDTH 660 0 @@ -18187,8 +17651,8 @@ ENDCHAR STARTCHAR 0x04D4 ENCODING 1236 -SWIDTH 900 0 -DWIDTH 15 0 +SWIDTH 840 0 +DWIDTH 14 0 BBX 14 11 0 0 BITMAP 0FF8 @@ -18219,8 +17683,8 @@ ENDCHAR STARTCHAR 0x04D6 ENCODING 1238 -SWIDTH 660 0 -DWIDTH 11 0 +SWIDTH 600 0 +DWIDTH 10 0 BBX 10 14 0 0 BITMAP 2100 @@ -18257,8 +17721,8 @@ ENDCHAR STARTCHAR 0x04D8 ENCODING 1240 -SWIDTH 780 0 -DWIDTH 13 0 +SWIDTH 600 0 +DWIDTH 10 0 BBX 10 11 1 0 BITMAP 3E00 @@ -18289,8 +17753,8 @@ ENDCHAR STARTCHAR 0x04DA ENCODING 1242 -SWIDTH 780 0 -DWIDTH 13 0 +SWIDTH 600 0 +DWIDTH 10 0 BBX 10 14 1 0 BITMAP 3600 @@ -18327,8 +17791,8 @@ ENDCHAR STARTCHAR 0x04DC ENCODING 1244 -SWIDTH 960 0 -DWIDTH 16 0 +SWIDTH 900 0 +DWIDTH 15 0 BBX 15 14 0 0 BITMAP 06C0 @@ -18365,8 +17829,8 @@ ENDCHAR STARTCHAR 0x04DE ENCODING 1246 -SWIDTH 540 0 -DWIDTH 9 0 +SWIDTH 480 0 +DWIDTH 8 0 BBX 7 14 1 0 BITMAP 6C @@ -18437,8 +17901,8 @@ ENDCHAR STARTCHAR 0x04E2 ENCODING 1250 -SWIDTH 720 0 -DWIDTH 12 0 +SWIDTH 660 0 +DWIDTH 11 0 BBX 11 13 0 0 BITMAP 1F00 @@ -18473,8 +17937,8 @@ ENDCHAR STARTCHAR 0x04E4 ENCODING 1252 -SWIDTH 720 0 -DWIDTH 12 0 +SWIDTH 660 0 +DWIDTH 11 0 BBX 11 14 0 0 BITMAP 1B00 @@ -18511,8 +17975,8 @@ ENDCHAR STARTCHAR 0x04E6 ENCODING 1254 -SWIDTH 720 0 -DWIDTH 12 0 +SWIDTH 600 0 +DWIDTH 10 0 BBX 10 14 1 0 BITMAP 3600 @@ -18549,8 +18013,8 @@ ENDCHAR STARTCHAR 0x04E8 ENCODING 1256 -SWIDTH 720 0 -DWIDTH 12 0 +SWIDTH 600 0 +DWIDTH 10 0 BBX 10 11 1 0 BITMAP 1E00 @@ -18581,8 +18045,8 @@ ENDCHAR STARTCHAR 0x04EA ENCODING 1258 -SWIDTH 720 0 -DWIDTH 12 0 +SWIDTH 600 0 +DWIDTH 10 0 BBX 10 14 1 0 BITMAP 3600 @@ -18619,8 +18083,8 @@ ENDCHAR STARTCHAR 0x04EC ENCODING 1260 -SWIDTH 660 0 -DWIDTH 11 0 +SWIDTH 540 0 +DWIDTH 9 0 BBX 9 14 1 0 BITMAP 3600 @@ -18657,8 +18121,8 @@ ENDCHAR STARTCHAR 0x04EE ENCODING 1262 -SWIDTH 720 0 -DWIDTH 12 0 +SWIDTH 660 0 +DWIDTH 11 0 BBX 11 13 0 0 BITMAP 1F00 @@ -18696,8 +18160,8 @@ ENDCHAR STARTCHAR 0x04F0 ENCODING 1264 -SWIDTH 720 0 -DWIDTH 12 0 +SWIDTH 660 0 +DWIDTH 11 0 BBX 11 14 0 0 BITMAP 1B00 @@ -18737,8 +18201,8 @@ ENDCHAR STARTCHAR 0x04F2 ENCODING 1266 -SWIDTH 720 0 -DWIDTH 12 0 +SWIDTH 660 0 +DWIDTH 11 0 BBX 11 15 0 0 BITMAP 06C0 @@ -18780,8 +18244,8 @@ ENDCHAR STARTCHAR 0x04F4 ENCODING 1268 -SWIDTH 660 0 -DWIDTH 11 0 +SWIDTH 540 0 +DWIDTH 9 0 BBX 9 14 1 0 BITMAP 3600 @@ -18818,8 +18282,8 @@ ENDCHAR STARTCHAR 0x04F8 ENCODING 1272 -SWIDTH 1020 0 -DWIDTH 17 0 +SWIDTH 900 0 +DWIDTH 15 0 BBX 15 14 0 0 BITMAP 06C0 @@ -18853,126 +18317,8 @@ 4500 4500 FB80 -ENDCHAR -STARTCHAR 0x04FA -ENCODING 1274 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 9 14 1 0 -BITMAP -3600 -3600 -0000 -BC00 -C200 -8100 -8080 -0080 -1F80 -0080 -8080 -8100 -4200 -3C00 -ENDCHAR -STARTCHAR 0x04FB -ENCODING 1275 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 6 10 1 0 -BITMAP -D8 -D8 -00 -70 -48 -04 -3C -04 -88 -70 -ENDCHAR -STARTCHAR 0x04FC -ENCODING 1276 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 11 17 0 -2 -BITMAP -1100 -0E00 -0000 -0000 -FBE0 -2180 -2180 -2280 -2280 -2480 -2880 -2880 -3080 -3080 -FBE0 -0060 -0020 -ENDCHAR -STARTCHAR 0x04FD -ENCODING 1277 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 13 1 -2 -BITMAP -44 -38 -00 -00 -EE -4C -54 -54 -54 -64 -EE -02 -02 -ENDCHAR -STARTCHAR 0x04FE -ENCODING 1278 -SWIDTH 840 0 -DWIDTH 14 0 -BBX 14 13 0 -2 -BITMAP -F03C -3030 -3030 -2850 -2850 -2890 -2490 -2490 -2310 -2310 -FB7C -000C -0004 -ENDCHAR -STARTCHAR 0x04FF -ENCODING 1279 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 9 1 -2 -BITMAP -C180 -6300 -6300 -5500 -5500 -4900 -EB80 -0080 -0080 ENDCHAR -STARTCHAR 0x0531 +STARTCHAR C065 ENCODING 1329 SWIDTH 780 0 DWIDTH 13 0 @@ -18990,7 +18336,7 @@ 1130 0E10 ENDCHAR -STARTCHAR 0x0532 +STARTCHAR C080 ENCODING 1330 SWIDTH 660 0 DWIDTH 11 0 @@ -19008,7 +18354,7 @@ 2000 F800 ENDCHAR -STARTCHAR 0x0533 +STARTCHAR C075 ENCODING 1331 SWIDTH 720 0 DWIDTH 12 0 @@ -19026,7 +18372,7 @@ 0200 0F80 ENDCHAR -STARTCHAR 0x0534 +STARTCHAR C084 ENCODING 1332 SWIDTH 780 0 DWIDTH 13 0 @@ -19044,7 +18390,7 @@ 0100 07C0 ENDCHAR -STARTCHAR 0x0535 +STARTCHAR C069 ENCODING 1333 SWIDTH 660 0 DWIDTH 11 0 @@ -19062,7 +18408,7 @@ 2080 1F00 ENDCHAR -STARTCHAR 0x0536 +STARTCHAR C090 ENCODING 1334 SWIDTH 600 0 DWIDTH 10 0 @@ -19081,7 +18427,7 @@ FE00 C300 ENDCHAR -STARTCHAR 0x0537 +STARTCHAR C063 ENCODING 1335 SWIDTH 540 0 DWIDTH 9 0 @@ -19101,7 +18447,7 @@ 06 02 ENDCHAR -STARTCHAR 0x0538 +STARTCHAR C087 ENCODING 1336 SWIDTH 600 0 DWIDTH 10 0 @@ -19121,7 +18467,7 @@ 0180 0080 ENDCHAR -STARTCHAR 0x0539 +STARTCHAR C041 ENCODING 1337 SWIDTH 780 0 DWIDTH 13 0 @@ -19139,7 +18485,7 @@ 2000 F800 ENDCHAR -STARTCHAR 0x053A +STARTCHAR C067 ENCODING 1338 SWIDTH 720 0 DWIDTH 12 0 @@ -19157,7 +18503,7 @@ 4400 3800 ENDCHAR -STARTCHAR 0x053B +STARTCHAR C073 ENCODING 1339 SWIDTH 720 0 DWIDTH 12 0 @@ -19175,7 +18521,7 @@ 2000 F800 ENDCHAR -STARTCHAR 0x053C +STARTCHAR C076 ENCODING 1340 SWIDTH 480 0 DWIDTH 8 0 @@ -19195,7 +18541,7 @@ 02 02 ENDCHAR -STARTCHAR 0x053D +STARTCHAR C088 ENCODING 1341 SWIDTH 720 0 DWIDTH 12 0 @@ -19213,7 +18559,7 @@ 23C0 F800 ENDCHAR -STARTCHAR 0x053E +STARTCHAR C091 ENCODING 1342 SWIDTH 780 0 DWIDTH 13 0 @@ -19232,7 +18578,7 @@ 2080 1F00 ENDCHAR -STARTCHAR 0x053F +STARTCHAR C071 ENCODING 1343 SWIDTH 660 0 DWIDTH 11 0 @@ -19250,7 +18596,7 @@ 0100 07C0 ENDCHAR -STARTCHAR 0x0540 +STARTCHAR C072 ENCODING 1344 SWIDTH 660 0 DWIDTH 11 0 @@ -19268,7 +18614,7 @@ 0080 0040 ENDCHAR -STARTCHAR 0x0541 +STARTCHAR C124 ENCODING 1345 SWIDTH 540 0 DWIDTH 9 0 @@ -19286,7 +18632,7 @@ 99 66 ENDCHAR -STARTCHAR 0x0542 +STARTCHAR C081 ENCODING 1346 SWIDTH 780 0 DWIDTH 13 0 @@ -19306,7 +18652,7 @@ 0030 0010 ENDCHAR -STARTCHAR 0x0543 +STARTCHAR C074 ENCODING 1347 SWIDTH 660 0 DWIDTH 11 0 @@ -19324,7 +18670,7 @@ 2300 1DC0 ENDCHAR -STARTCHAR 0x0544 +STARTCHAR C077 ENCODING 1348 SWIDTH 780 0 DWIDTH 13 0 @@ -19342,7 +18688,7 @@ 1100 0E00 ENDCHAR -STARTCHAR 0x0545 +STARTCHAR C089 ENCODING 1349 SWIDTH 540 0 DWIDTH 9 0 @@ -19360,7 +18706,7 @@ 42 3C ENDCHAR -STARTCHAR 0x0546 +STARTCHAR C078 ENCODING 1350 SWIDTH 660 0 DWIDTH 11 0 @@ -19378,7 +18724,7 @@ 1100 0E00 ENDCHAR -STARTCHAR 0x0547 +STARTCHAR C070 ENCODING 1351 SWIDTH 600 0 DWIDTH 10 0 @@ -19396,7 +18742,7 @@ 4100 3E00 ENDCHAR -STARTCHAR 0x0548 +STARTCHAR C060 ENCODING 1352 SWIDTH 720 0 DWIDTH 12 0 @@ -19414,7 +18760,7 @@ 2080 FBE0 ENDCHAR -STARTCHAR 0x0549 +STARTCHAR C043 ENCODING 1353 SWIDTH 480 0 DWIDTH 8 0 @@ -19434,7 +18780,7 @@ 1C 04 ENDCHAR -STARTCHAR 0x054A +STARTCHAR C066 ENCODING 1354 SWIDTH 780 0 DWIDTH 13 0 @@ -19452,7 +18798,7 @@ 0040 01F0 ENDCHAR -STARTCHAR 0x054B +STARTCHAR C061 ENCODING 1355 SWIDTH 600 0 DWIDTH 10 0 @@ -19472,7 +18818,7 @@ C180 0080 ENDCHAR -STARTCHAR 0x054C +STARTCHAR C042 ENCODING 1356 SWIDTH 840 0 DWIDTH 14 0 @@ -19490,7 +18836,7 @@ 2080 FBE0 ENDCHAR -STARTCHAR 0x054D +STARTCHAR C083 ENCODING 1357 SWIDTH 720 0 DWIDTH 12 0 @@ -19508,7 +18854,7 @@ 1100 0E00 ENDCHAR -STARTCHAR 0x054E +STARTCHAR C086 ENCODING 1358 SWIDTH 780 0 DWIDTH 13 0 @@ -19528,7 +18874,7 @@ 0030 0010 ENDCHAR -STARTCHAR 0x054F +STARTCHAR C068 ENCODING 1359 SWIDTH 480 0 DWIDTH 8 0 @@ -19546,7 +18892,7 @@ C4 B8 ENDCHAR -STARTCHAR 0x0550 +STARTCHAR C082 ENCODING 1360 SWIDTH 660 0 DWIDTH 11 0 @@ -19564,7 +18910,7 @@ 2000 F800 ENDCHAR -STARTCHAR 0x0551 +STARTCHAR C093 ENCODING 1361 SWIDTH 540 0 DWIDTH 9 0 @@ -19582,7 +18928,7 @@ 42 3C ENDCHAR -STARTCHAR 0x0552 +STARTCHAR C085 ENCODING 1362 SWIDTH 720 0 DWIDTH 12 0 @@ -19600,7 +18946,7 @@ 2000 F800 ENDCHAR -STARTCHAR 0x0553 +STARTCHAR C033 ENCODING 1363 SWIDTH 600 0 DWIDTH 10 0 @@ -19618,7 +18964,7 @@ 0800 3E00 ENDCHAR -STARTCHAR 0x0554 +STARTCHAR C062 ENCODING 1364 SWIDTH 660 0 DWIDTH 11 0 @@ -19636,7 +18982,7 @@ 1000 7C00 ENDCHAR -STARTCHAR 0x0555 +STARTCHAR C079 ENCODING 1365 SWIDTH 600 0 DWIDTH 10 0 @@ -19654,7 +19000,7 @@ 4100 3E00 ENDCHAR -STARTCHAR 0x0556 +STARTCHAR C040 ENCODING 1366 SWIDTH 600 0 DWIDTH 10 0 @@ -19672,7 +19018,7 @@ 4900 3E00 ENDCHAR -STARTCHAR 0x0559 +STARTCHAR char1369 ENCODING 1369 SWIDTH 120 0 DWIDTH 2 0 @@ -19683,7 +19029,7 @@ 80 40 ENDCHAR -STARTCHAR 0x055A +STARTCHAR char1369 ENCODING 1370 SWIDTH 120 0 DWIDTH 2 0 @@ -19694,7 +19040,7 @@ 40 80 ENDCHAR -STARTCHAR 0x055B +STARTCHAR C125 ENCODING 1371 SWIDTH 180 0 DWIDTH 3 0 @@ -19705,7 +19051,7 @@ 40 80 ENDCHAR -STARTCHAR 0x055C +STARTCHAR C021 ENCODING 1372 SWIDTH 420 0 DWIDTH 7 0 @@ -19714,7 +19060,7 @@ 72 9C ENDCHAR -STARTCHAR 0x055D +STARTCHAR C127 ENCODING 1373 SWIDTH 180 0 DWIDTH 3 0 @@ -19725,7 +19071,7 @@ 40 20 ENDCHAR -STARTCHAR 0x055E +STARTCHAR C022 ENCODING 1374 SWIDTH 360 0 DWIDTH 6 0 @@ -19735,7 +19081,7 @@ 4C 8C ENDCHAR -STARTCHAR 0x055F +STARTCHAR C022 ENCODING 1375 SWIDTH 300 0 DWIDTH 5 0 @@ -19747,7 +19093,7 @@ 80 78 ENDCHAR -STARTCHAR 0x0561 +STARTCHAR C097 ENCODING 1377 SWIDTH 720 0 DWIDTH 12 0 @@ -19761,7 +19107,7 @@ 4440 3BE0 ENDCHAR -STARTCHAR 0x0562 +STARTCHAR C112 ENCODING 1378 SWIDTH 420 0 DWIDTH 7 0 @@ -19778,7 +19124,7 @@ 40 E0 ENDCHAR -STARTCHAR 0x0563 +STARTCHAR C107 ENCODING 1379 SWIDTH 480 0 DWIDTH 8 0 @@ -19795,7 +19141,7 @@ 04 0E ENDCHAR -STARTCHAR 0x0564 +STARTCHAR C116 ENCODING 1380 SWIDTH 540 0 DWIDTH 9 0 @@ -19812,7 +19158,7 @@ 04 0E ENDCHAR -STARTCHAR 0x0565 +STARTCHAR C101 ENCODING 1381 SWIDTH 480 0 DWIDTH 8 0 @@ -19830,7 +19176,7 @@ 4C 36 ENDCHAR -STARTCHAR 0x0566 +STARTCHAR C122 ENCODING 1382 SWIDTH 480 0 DWIDTH 8 0 @@ -19847,7 +19193,7 @@ 04 07 ENDCHAR -STARTCHAR 0x0567 +STARTCHAR C047 ENCODING 1383 SWIDTH 360 0 DWIDTH 6 0 @@ -19866,7 +19212,7 @@ 78 0C ENDCHAR -STARTCHAR 0x0568 +STARTCHAR C119 ENCODING 1384 SWIDTH 480 0 DWIDTH 8 0 @@ -19883,7 +19229,7 @@ 40 7E ENDCHAR -STARTCHAR 0x0569 +STARTCHAR C057 ENCODING 1385 SWIDTH 540 0 DWIDTH 9 0 @@ -19900,7 +19246,7 @@ 40 E0 ENDCHAR -STARTCHAR 0x056A +STARTCHAR C099 ENCODING 1386 SWIDTH 540 0 DWIDTH 9 0 @@ -19918,7 +19264,7 @@ 48 30 ENDCHAR -STARTCHAR 0x056B +STARTCHAR C105 ENCODING 1387 SWIDTH 480 0 DWIDTH 8 0 @@ -19939,7 +19285,7 @@ 40 E0 ENDCHAR -STARTCHAR 0x056C +STARTCHAR C108 ENCODING 1388 SWIDTH 240 0 DWIDTH 4 0 @@ -19957,7 +19303,7 @@ 40 70 ENDCHAR -STARTCHAR 0x056D +STARTCHAR C120 ENCODING 1389 SWIDTH 660 0 DWIDTH 11 0 @@ -19978,7 +19324,7 @@ 4000 E000 ENDCHAR -STARTCHAR 0x056E +STARTCHAR C099 ENCODING 1390 SWIDTH 480 0 DWIDTH 8 0 @@ -19995,7 +19341,7 @@ 48 30 ENDCHAR -STARTCHAR 0x056F +STARTCHAR C103 ENCODING 1391 SWIDTH 480 0 DWIDTH 8 0 @@ -20016,7 +19362,7 @@ 04 0E ENDCHAR -STARTCHAR 0x0570 +STARTCHAR C104 ENCODING 1392 SWIDTH 480 0 DWIDTH 8 0 @@ -20034,7 +19380,7 @@ 44 EE ENDCHAR -STARTCHAR 0x0571 +STARTCHAR C048 ENCODING 1393 SWIDTH 480 0 DWIDTH 8 0 @@ -20052,7 +19398,7 @@ 4C 36 ENDCHAR -STARTCHAR 0x0572 +STARTCHAR C113 ENCODING 1394 SWIDTH 480 0 DWIDTH 8 0 @@ -20069,7 +19415,7 @@ 04 06 ENDCHAR -STARTCHAR 0x0573 +STARTCHAR C053 ENCODING 1395 SWIDTH 480 0 DWIDTH 8 0 @@ -20087,7 +19433,7 @@ 8C 76 ENDCHAR -STARTCHAR 0x0574 +STARTCHAR C109 ENCODING 1396 SWIDTH 480 0 DWIDTH 8 0 @@ -20105,7 +19451,7 @@ 4C 36 ENDCHAR -STARTCHAR 0x0575 +STARTCHAR C121 ENCODING 1397 SWIDTH 300 0 DWIDTH 5 0 @@ -20122,7 +19468,7 @@ 90 E0 ENDCHAR -STARTCHAR 0x0576 +STARTCHAR C110 ENCODING 1398 SWIDTH 420 0 DWIDTH 7 0 @@ -20140,7 +19486,7 @@ 98 6C ENDCHAR -STARTCHAR 0x0577 +STARTCHAR C102 ENCODING 1399 SWIDTH 360 0 DWIDTH 6 0 @@ -20157,7 +19503,7 @@ 80 F8 ENDCHAR -STARTCHAR 0x0578 +STARTCHAR C055 ENCODING 1400 SWIDTH 480 0 DWIDTH 8 0 @@ -20171,7 +19517,7 @@ 44 EE ENDCHAR -STARTCHAR 0x0579 +STARTCHAR C059 ENCODING 1401 SWIDTH 300 0 DWIDTH 5 0 @@ -20188,7 +19534,7 @@ 80 70 ENDCHAR -STARTCHAR 0x057A +STARTCHAR C098 ENCODING 1402 SWIDTH 720 0 DWIDTH 12 0 @@ -20205,7 +19551,7 @@ 0040 00E0 ENDCHAR -STARTCHAR 0x057B +STARTCHAR C050 ENCODING 1403 SWIDTH 360 0 DWIDTH 6 0 @@ -20222,7 +19568,7 @@ 40 78 ENDCHAR -STARTCHAR 0x057C +STARTCHAR C052 ENCODING 1404 SWIDTH 480 0 DWIDTH 8 0 @@ -20236,7 +19582,7 @@ 48 EE ENDCHAR -STARTCHAR 0x057D +STARTCHAR C115 ENCODING 1405 SWIDTH 480 0 DWIDTH 8 0 @@ -20250,7 +19596,7 @@ 4C 36 ENDCHAR -STARTCHAR 0x057E +STARTCHAR C118 ENCODING 1406 SWIDTH 480 0 DWIDTH 8 0 @@ -20271,7 +19617,7 @@ 04 06 ENDCHAR -STARTCHAR 0x057F +STARTCHAR C100 ENCODING 1407 SWIDTH 720 0 DWIDTH 12 0 @@ -20285,7 +19631,7 @@ 4C40 36E0 ENDCHAR -STARTCHAR 0x0580 +STARTCHAR C114 ENCODING 1408 SWIDTH 480 0 DWIDTH 8 0 @@ -20302,7 +19648,7 @@ 40 E0 ENDCHAR -STARTCHAR 0x0581 +STARTCHAR C054 ENCODING 1409 SWIDTH 420 0 DWIDTH 7 0 @@ -20319,7 +19665,7 @@ C8 70 ENDCHAR -STARTCHAR 0x0582 +STARTCHAR C117 ENCODING 1410 SWIDTH 300 0 DWIDTH 5 0 @@ -20333,7 +19679,7 @@ 40 70 ENDCHAR -STARTCHAR 0x0583 +STARTCHAR C049 ENCODING 1411 SWIDTH 720 0 DWIDTH 12 0 @@ -20354,7 +19700,7 @@ 0400 0E00 ENDCHAR -STARTCHAR 0x0584 +STARTCHAR C051 ENCODING 1412 SWIDTH 480 0 DWIDTH 8 0 @@ -20371,7 +19717,7 @@ 40 E0 ENDCHAR -STARTCHAR 0x0585 +STARTCHAR C111 ENCODING 1413 SWIDTH 480 0 DWIDTH 8 0 @@ -20385,7 +19731,7 @@ 44 38 ENDCHAR -STARTCHAR 0x0586 +STARTCHAR C056 ENCODING 1414 SWIDTH 480 0 DWIDTH 8 0 @@ -20406,7 +19752,7 @@ 10 38 ENDCHAR -STARTCHAR 0x0587 +STARTCHAR C000 ENCODING 1415 SWIDTH 540 0 DWIDTH 9 0 @@ -20424,7 +19770,7 @@ 4C 37 ENDCHAR -STARTCHAR 0x0589 +STARTCHAR C058 ENCODING 1417 SWIDTH 300 0 DWIDTH 5 0 @@ -20438,7 +19784,7 @@ C0 C0 ENDCHAR -STARTCHAR 0x058A +STARTCHAR C044 ENCODING 1418 SWIDTH 540 0 DWIDTH 9 0 @@ -20448,7 +19794,7 @@ C2 7C ENDCHAR -STARTCHAR 0x0591 +STARTCHAR char1425 ENCODING 1425 SWIDTH 0 0 DWIDTH 0 0 @@ -20459,7 +19805,7 @@ 70 88 ENDCHAR -STARTCHAR 0x0592 +STARTCHAR char1456 ENCODING 1426 SWIDTH 0 0 DWIDTH 0 0 @@ -20470,7 +19816,7 @@ CC CC ENDCHAR -STARTCHAR 0x0593 +STARTCHAR char1427 ENCODING 1427 SWIDTH 0 0 DWIDTH 0 0 @@ -20484,7 +19830,7 @@ 40 80 ENDCHAR -STARTCHAR 0x0594 +STARTCHAR char1456 ENCODING 1428 SWIDTH 0 0 DWIDTH 0 0 @@ -20496,7 +19842,7 @@ C0 C0 ENDCHAR -STARTCHAR 0x0595 +STARTCHAR char1456 ENCODING 1429 SWIDTH 0 0 DWIDTH 0 0 @@ -20508,7 +19854,7 @@ B0 B0 ENDCHAR -STARTCHAR 0x0596 +STARTCHAR char1430 ENCODING 1430 SWIDTH 0 0 DWIDTH 0 0 @@ -20518,7 +19864,7 @@ 80 60 ENDCHAR -STARTCHAR 0x0597 +STARTCHAR char1431 ENCODING 1431 SWIDTH 300 0 DWIDTH 5 0 @@ -20530,7 +19876,7 @@ 70 20 ENDCHAR -STARTCHAR 0x0598 +STARTCHAR char1430 ENCODING 1432 SWIDTH 0 0 DWIDTH 0 0 @@ -20541,7 +19887,7 @@ 92 4C ENDCHAR -STARTCHAR 0x0599 +STARTCHAR char1430 ENCODING 1433 SWIDTH 0 0 DWIDTH 0 0 @@ -20551,7 +19897,7 @@ 20 20 ENDCHAR -STARTCHAR 0x059A +STARTCHAR char1434 ENCODING 1434 SWIDTH 0 0 DWIDTH 0 0 @@ -20563,7 +19909,7 @@ 40 20 ENDCHAR -STARTCHAR 0x059B +STARTCHAR char1430 ENCODING 1435 SWIDTH 0 0 DWIDTH 0 0 @@ -20573,7 +19919,7 @@ 20 C0 ENDCHAR -STARTCHAR 0x059C +STARTCHAR char1430 ENCODING 1436 SWIDTH 0 0 DWIDTH 0 0 @@ -20583,7 +19929,7 @@ 80 80 ENDCHAR -STARTCHAR 0x059D +STARTCHAR char1430 ENCODING 1437 SWIDTH 0 0 DWIDTH 0 0 @@ -20593,7 +19939,7 @@ 80 80 ENDCHAR -STARTCHAR 0x059E +STARTCHAR char1430 ENCODING 1438 SWIDTH 0 0 DWIDTH 0 0 @@ -20603,7 +19949,7 @@ 90 90 ENDCHAR -STARTCHAR 0x059F +STARTCHAR char1439 ENCODING 1439 SWIDTH 0 0 DWIDTH 0 0 @@ -20614,7 +19960,7 @@ 44 28 ENDCHAR -STARTCHAR 0x05A0 +STARTCHAR char1439 ENCODING 1440 SWIDTH 0 0 DWIDTH 0 0 @@ -20625,7 +19971,7 @@ 40 80 ENDCHAR -STARTCHAR 0x05A1 +STARTCHAR char1441 ENCODING 1441 SWIDTH 0 0 DWIDTH 0 0 @@ -20635,7 +19981,7 @@ 70 80 ENDCHAR -STARTCHAR 0x05A3 +STARTCHAR char1443 ENCODING 1443 SWIDTH 0 0 DWIDTH 0 0 @@ -20645,7 +19991,7 @@ 20 E0 ENDCHAR -STARTCHAR 0x05A4 +STARTCHAR char1434 ENCODING 1444 SWIDTH 0 0 DWIDTH 0 0 @@ -20657,7 +20003,7 @@ 40 20 ENDCHAR -STARTCHAR 0x05A5 +STARTCHAR char1430 ENCODING 1445 SWIDTH 0 0 DWIDTH 0 0 @@ -20667,7 +20013,7 @@ 20 C0 ENDCHAR -STARTCHAR 0x05A6 +STARTCHAR char1430 ENCODING 1446 SWIDTH 0 0 DWIDTH 0 0 @@ -20677,7 +20023,7 @@ 24 D8 ENDCHAR -STARTCHAR 0x05A7 +STARTCHAR char1447 ENCODING 1447 SWIDTH 0 0 DWIDTH 0 0 @@ -20689,7 +20035,7 @@ 10 60 ENDCHAR -STARTCHAR 0x05A8 +STARTCHAR char1430 ENCODING 1448 SWIDTH 0 0 DWIDTH 0 0 @@ -20699,7 +20045,7 @@ 20 20 ENDCHAR -STARTCHAR 0x05A9 +STARTCHAR char1439 ENCODING 1449 SWIDTH 0 0 DWIDTH 0 0 @@ -20710,7 +20056,7 @@ 40 20 ENDCHAR -STARTCHAR 0x05AA +STARTCHAR char1425 ENCODING 1450 SWIDTH 0 0 DWIDTH 0 0 @@ -20721,7 +20067,7 @@ 20 20 ENDCHAR -STARTCHAR 0x05AB +STARTCHAR char1434 ENCODING 1451 SWIDTH 0 0 DWIDTH 0 0 @@ -20733,7 +20079,7 @@ 40 20 ENDCHAR -STARTCHAR 0x05AC +STARTCHAR char1452 ENCODING 1452 SWIDTH 0 0 DWIDTH 0 0 @@ -20743,7 +20089,7 @@ 20 E0 ENDCHAR -STARTCHAR 0x05AD +STARTCHAR char1430 ENCODING 1453 SWIDTH 0 0 DWIDTH 0 0 @@ -20753,7 +20099,7 @@ 80 60 ENDCHAR -STARTCHAR 0x05AE +STARTCHAR char1430 ENCODING 1454 SWIDTH 0 0 DWIDTH 0 0 @@ -20764,7 +20110,7 @@ 92 4C ENDCHAR -STARTCHAR 0x05AF +STARTCHAR char1439 ENCODING 1455 SWIDTH 0 0 DWIDTH 0 0 @@ -20774,7 +20120,7 @@ A0 40 ENDCHAR -STARTCHAR 0x05B0 +STARTCHAR char1456 ENCODING 1456 SWIDTH 120 0 DWIDTH 2 0 @@ -20786,7 +20132,7 @@ 80 80 ENDCHAR -STARTCHAR 0x05B1 +STARTCHAR char1456 ENCODING 1457 SWIDTH 480 0 DWIDTH 8 0 @@ -20798,7 +20144,7 @@ 44 44 ENDCHAR -STARTCHAR 0x05B2 +STARTCHAR char1456 ENCODING 1458 SWIDTH 300 0 DWIDTH 5 0 @@ -20810,7 +20156,7 @@ 08 08 ENDCHAR -STARTCHAR 0x05B3 +STARTCHAR char1456 ENCODING 1459 SWIDTH 300 0 DWIDTH 5 0 @@ -20822,7 +20168,7 @@ 48 08 ENDCHAR -STARTCHAR 0x05B4 +STARTCHAR char1456 ENCODING 1460 SWIDTH 120 0 DWIDTH 2 0 @@ -20831,7 +20177,7 @@ 80 80 ENDCHAR -STARTCHAR 0x05B5 +STARTCHAR char1456 ENCODING 1461 SWIDTH 240 0 DWIDTH 4 0 @@ -20840,7 +20186,7 @@ A0 A0 ENDCHAR -STARTCHAR 0x05B6 +STARTCHAR char1456 ENCODING 1462 SWIDTH 240 0 DWIDTH 4 0 @@ -20852,7 +20198,7 @@ 40 40 ENDCHAR -STARTCHAR 0x05B7 +STARTCHAR char1463 ENCODING 1463 SWIDTH 300 0 DWIDTH 5 0 @@ -20860,7 +20206,7 @@ BITMAP F8 ENDCHAR -STARTCHAR 0x05B8 +STARTCHAR char1463 ENCODING 1464 SWIDTH 300 0 DWIDTH 5 0 @@ -20870,7 +20216,7 @@ 20 20 ENDCHAR -STARTCHAR 0x05B9 +STARTCHAR char1456 ENCODING 1465 SWIDTH 120 0 DWIDTH 2 0 @@ -20879,7 +20225,7 @@ 80 80 ENDCHAR -STARTCHAR 0x05BB +STARTCHAR char1456 ENCODING 1467 SWIDTH 360 0 DWIDTH 6 0 @@ -20890,7 +20236,7 @@ 28 08 ENDCHAR -STARTCHAR 0x05BC +STARTCHAR char1456 ENCODING 1468 SWIDTH 120 0 DWIDTH 2 0 @@ -20899,7 +20245,7 @@ 80 80 ENDCHAR -STARTCHAR 0x05BD +STARTCHAR char1468 ENCODING 1469 SWIDTH 0 0 DWIDTH 0 0 @@ -20910,7 +20256,7 @@ 80 80 ENDCHAR -STARTCHAR 0x05BE +STARTCHAR char1469 ENCODING 1470 SWIDTH 420 0 DWIDTH 7 0 @@ -20919,7 +20265,7 @@ 7C F8 ENDCHAR -STARTCHAR 0x05BF +STARTCHAR char1463 ENCODING 1471 SWIDTH 0 0 DWIDTH 0 0 @@ -20927,7 +20273,7 @@ BITMAP F0 ENDCHAR -STARTCHAR 0x05C0 +STARTCHAR char1472 ENCODING 1472 SWIDTH 120 0 DWIDTH 2 0 @@ -20942,7 +20288,7 @@ 80 80 ENDCHAR -STARTCHAR 0x05C1 +STARTCHAR char1456 ENCODING 1473 SWIDTH 120 0 DWIDTH 2 0 @@ -20951,7 +20297,7 @@ 80 80 ENDCHAR -STARTCHAR 0x05C2 +STARTCHAR char1456 ENCODING 1474 SWIDTH 120 0 DWIDTH 2 0 @@ -20960,7 +20306,7 @@ 80 80 ENDCHAR -STARTCHAR 0x05C3 +STARTCHAR char1475 ENCODING 1475 SWIDTH 180 0 DWIDTH 3 0 @@ -20973,7 +20319,7 @@ C0 C0 ENDCHAR -STARTCHAR 0x05C4 +STARTCHAR char1456 ENCODING 1476 SWIDTH 120 0 DWIDTH 2 0 @@ -20984,35 +20330,35 @@ ENDCHAR STARTCHAR 0x05D0 ENCODING 1488 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 8 9 1 0 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 7 9 1 0 BITMAP -81 -81 -61 -39 -4A -44 +84 +84 +46 +28 +50 +88 +84 42 -41 -E1 +C2 ENDCHAR -STARTCHAR 0x05D1 +STARTCHAR 0x05D3 ENCODING 1489 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 9 1 0 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 8 9 1 0 BITMAP 80 -FC -04 -04 -04 -04 -04 -04 FE +02 +02 +02 +02 +02 +02 +FF ENDCHAR STARTCHAR 0x05D2 ENCODING 1490 @@ -21020,31 +20366,31 @@ DWIDTH 6 0 BBX 5 9 1 0 BITMAP -40 +80 F0 10 10 10 -18 +10 +10 28 -48 -88 +C8 ENDCHAR STARTCHAR 0x05D3 ENCODING 1491 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 9 1 0 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 8 9 1 0 BITMAP -40 -FE -08 -08 -08 -08 -08 -08 -08 +80 +FF +02 +02 +02 +02 +02 +02 +02 ENDCHAR STARTCHAR 0x05D4 ENCODING 1492 @@ -21052,58 +20398,57 @@ DWIDTH 9 0 BBX 8 9 1 0 BITMAP -40 -FE -03 -01 -41 -41 -41 -41 -41 -ENDCHAR -STARTCHAR 0x05D5 -ENCODING 1493 -SWIDTH 240 0 -DWIDTH 4 0 -BBX 3 9 1 0 -BITMAP -40 -E0 -20 -20 -20 -20 -20 -20 -20 +80 +FF +02 +82 +82 +82 +82 +82 +82 ENDCHAR -STARTCHAR 0x05D6 -ENCODING 1494 +STARTCHAR 0x05D5 +ENCODING 1493 SWIDTH 300 0 DWIDTH 5 0 -BBX 4 10 1 0 +BBX 4 9 1 0 BITMAP 80 -C0 -60 -50 -40 -40 -40 -60 -20 -20 +F0 +10 +10 +10 +10 +10 +10 +10 +ENDCHAR +STARTCHAR 0x05D5 +ENCODING 1494 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 9 1 0 +BITMAP +80 +F8 +10 +10 +10 +10 +10 +10 +10 ENDCHAR -STARTCHAR 0x05D7 +STARTCHAR 0x05D4 ENCODING 1495 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 9 1 0 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 8 9 1 0 BITMAP -40 -FC -86 +80 +FF +42 82 82 82 @@ -21115,127 +20460,128 @@ ENCODING 1496 SWIDTH 600 0 DWIDTH 10 0 -BBX 9 9 1 0 +BBX 8 9 2 0 BITMAP -0700 -C980 -4080 -4080 -4080 -2080 -2100 -3600 -1C00 +8E +D1 +41 +81 +81 +81 +82 +84 +F8 ENDCHAR STARTCHAR 0x05D9 ENCODING 1497 -SWIDTH 300 0 -DWIDTH 5 0 -BBX 4 7 1 2 +SWIDTH 240 0 +DWIDTH 4 0 +BBX 3 5 1 4 BITMAP -40 +80 E0 -30 -10 -10 -10 20 +20 +40 ENDCHAR STARTCHAR 0x05DA ENCODING 1498 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 13 1 -4 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 8 13 1 -4 BITMAP -40 -FE -04 -04 -04 -04 -04 -04 -04 -04 -04 -04 -04 +80 +FF +02 +02 +02 +02 +02 +02 +02 +02 +02 +02 +02 ENDCHAR STARTCHAR 0x05DB ENCODING 1499 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 6 9 1 0 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 7 9 1 0 BITMAP 80 -F8 -0C -04 -04 -04 -04 -0C -F8 +FC +02 +02 +02 +02 +02 +02 +FC ENDCHAR STARTCHAR 0x05DC ENCODING 1500 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 6 11 1 0 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 8 13 0 0 BITMAP -80 80 -80 -F8 -0C -04 -04 +C0 +40 +40 +40 +7F +01 +01 +01 +01 +02 04 -08 -10 -60 +18 ENDCHAR STARTCHAR 0x05DD ENCODING 1501 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 9 1 0 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 7 9 1 0 BITMAP -4000 -FF00 -4180 -4080 -4080 -4080 -4080 -4180 -7F00 +80 +FC +42 +82 +82 +82 +82 +82 +FE ENDCHAR STARTCHAR 0x05DE ENCODING 1502 SWIDTH 540 0 DWIDTH 9 0 -BBX 8 9 1 0 +BBX 7 9 2 0 BITMAP -4E -D3 -71 -21 -21 -41 -41 -43 -1E +98 +E4 +42 +82 +82 +82 +82 +84 +B8 ENDCHAR -STARTCHAR 0x05DF +STARTCHAR 0x05D5 ENCODING 1503 SWIDTH 300 0 DWIDTH 5 0 -BBX 4 12 1 -3 +BBX 4 13 1 -4 BITMAP -40 -E0 -30 +80 +F0 +10 +10 10 10 10 @@ -21246,189 +20592,191 @@ 10 10 ENDCHAR -STARTCHAR 0x05E0 +STARTCHAR 0x05D2 ENCODING 1504 SWIDTH 300 0 DWIDTH 5 0 BBX 4 9 1 0 BITMAP -40 -60 -30 +80 +F0 10 10 10 10 -30 -E0 +10 +10 +F0 ENDCHAR STARTCHAR 0x05E1 ENCODING 1505 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 8 9 1 0 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 7 9 1 0 BITMAP 80 -FF -81 -81 -41 -41 +FC 42 -64 +82 +82 +82 +82 +44 38 ENDCHAR STARTCHAR 0x05E2 ENCODING 1506 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 6 10 1 -1 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 8 9 1 0 BITMAP -84 -8C 44 -44 -24 -28 -28 -30 -60 -80 +77 +22 +22 +22 +14 +14 +18 +E0 ENDCHAR -STARTCHAR 0x05E3 +STARTCHAR 0x05DA ENCODING 1507 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 12 1 -3 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 8 13 1 -4 BITMAP -70 -CC -84 +80 +FF +42 82 82 -E2 -42 +C2 +02 +02 02 02 02 02 02 ENDCHAR -STARTCHAR 0x05E4 +STARTCHAR 0x05DB ENCODING 1508 SWIDTH 480 0 DWIDTH 8 0 BBX 7 9 1 0 BITMAP -30 -6C -44 +80 +FC 42 -62 +82 +82 +C2 02 02 -06 FC ENDCHAR STARTCHAR 0x05E5 ENCODING 1509 SWIDTH 480 0 DWIDTH 8 0 -BBX 7 12 1 -3 +BBX 7 13 1 -4 BITMAP -40 -C4 -46 -44 +88 +EE 24 -14 -08 -04 -04 -02 -02 -02 +48 +48 +50 +60 +40 +40 +40 +40 +40 +40 ENDCHAR STARTCHAR 0x05E6 ENCODING 1510 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 9 1 0 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 8 9 1 0 BITMAP -44 -C2 -22 -14 +84 +E7 +42 +24 +28 +10 +10 08 -04 -04 -04 FC ENDCHAR -STARTCHAR 0x05E7 +STARTCHAR 0x05DB ENCODING 1511 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 8 12 1 -3 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 7 13 1 -4 BITMAP -40 -FE -03 -01 -41 -42 -42 -44 -58 -40 -40 -40 +80 +FC +02 +82 +82 +82 +82 +82 +BC +80 +80 +80 +80 ENDCHAR -STARTCHAR 0x05E8 +STARTCHAR 0x05D3 ENCODING 1512 SWIDTH 480 0 DWIDTH 8 0 BBX 7 9 1 0 BITMAP -40 -FC -06 +80 +FE 02 02 02 02 02 02 +02 ENDCHAR STARTCHAR 0x05E9 ENCODING 1513 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 8 9 1 0 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 10 9 1 0 BITMAP -89 -8B -89 -49 -49 -51 -62 -24 -38 +9100 +DDC0 +4880 +8880 +9100 +9100 +A200 +A400 +F800 ENDCHAR -STARTCHAR 0x05EA +STARTCHAR 0x05D4 ENCODING 1514 SWIDTH 540 0 DWIDTH 9 0 BBX 8 9 1 0 BITMAP 40 -FE -23 -21 -21 -21 +7F 21 +41 +41 +41 +41 21 E1 ENDCHAR @@ -21438,7 +20786,7 @@ DWIDTH 8 0 BBX 7 9 1 0 BITMAP -44 +88 EE 22 22 @@ -21450,33 +20798,31 @@ ENDCHAR STARTCHAR 0x05F1 ENCODING 1521 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 8 9 1 0 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 7 9 1 0 BITMAP -44 +88 EE -23 -21 -21 -21 22 -20 -20 +22 +42 +02 +02 +02 +02 ENDCHAR STARTCHAR 0x05F2 ENCODING 1522 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 8 7 1 2 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 7 5 1 4 BITMAP -44 +88 EE -33 -11 -11 -11 22 +22 +44 ENDCHAR STARTCHAR 0x05F3 ENCODING 1523 @@ -21555,7 +20901,7 @@ C0 80 ENDCHAR -STARTCHAR 0x0622 +STARTCHAR 0xFE81 ENCODING 1570 SWIDTH 300 0 DWIDTH 5 0 @@ -21564,7 +20910,7 @@ 04 78 80 -20 +00 20 30 20 @@ -21576,11 +20922,11 @@ 20 20 ENDCHAR -STARTCHAR 0x0623 +STARTCHAR 0xFE83 ENCODING 1571 -SWIDTH 300 0 -DWIDTH 5 0 -BBX 3 17 1 0 +SWIDTH 240 0 +DWIDTH 4 0 +BBX 3 16 1 0 BITMAP 60 80 @@ -21589,7 +20935,6 @@ 00 00 40 -40 60 40 40 @@ -21600,11 +20945,11 @@ 40 40 ENDCHAR -STARTCHAR 0x0624 +STARTCHAR 0xFE85 ENCODING 1572 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 14 1 -3 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 7 14 0 -3 BITMAP 06 08 @@ -21621,14 +20966,13 @@ 84 78 ENDCHAR -STARTCHAR 0x0625 +STARTCHAR 0xFE87 ENCODING 1573 -SWIDTH 360 0 -DWIDTH 6 0 -BBX 3 17 1 -6 +SWIDTH 300 0 +DWIDTH 5 0 +BBX 3 16 1 -6 BITMAP 40 -40 60 40 40 @@ -21645,34 +20989,33 @@ 60 80 ENDCHAR -STARTCHAR 0x0626 +STARTCHAR 00F0 ENCODING 1574 SWIDTH 660 0 DWIDTH 11 0 -BBX 10 13 1 -3 +BBX 11 13 0 -2 BITMAP 1800 2000 1800 2000 0000 -01C0 +01E0 +0200 4200 -4400 -8700 -8080 -8080 -8300 -7C00 +8180 +8040 +8040 +4180 +3E00 ENDCHAR -STARTCHAR 0x0627 +STARTCHAR 0xFE8D ENCODING 1575 SWIDTH 300 0 DWIDTH 5 0 -BBX 2 11 2 0 +BBX 2 10 2 0 BITMAP 80 -80 C0 80 80 @@ -21683,27 +21026,26 @@ 80 80 ENDCHAR -STARTCHAR 0x0628 +STARTCHAR 0048 ENCODING 1576 -SWIDTH 840 0 -DWIDTH 14 0 -BBX 12 10 1 -5 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 13 9 0 -4 BITMAP -0020 -8010 -8010 -8010 -4060 -3F80 -0000 +0008 +4008 +8008 +8008 +C030 +7FC0 0000 -0400 -0400 +0200 +0200 ENDCHAR -STARTCHAR 0x0629 +STARTCHAR 0xFE93 ENCODING 1577 -SWIDTH 480 0 -DWIDTH 8 0 +SWIDTH 420 0 +DWIDTH 7 0 BBX 5 10 1 0 BITMAP 50 @@ -21717,307 +21059,308 @@ 88 78 ENDCHAR -STARTCHAR 0x062A +STARTCHAR 0050 ENCODING 1578 -SWIDTH 840 0 -DWIDTH 14 0 -BBX 12 9 1 -1 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 13 8 0 -1 BITMAP -0A00 -0A00 -0000 -0020 -8010 -8010 -8010 -4060 -3F80 +0500 +0500 +0008 +4008 +8008 +8008 +C030 +7FC0 ENDCHAR -STARTCHAR 0x062B +STARTCHAR 0050 ENCODING 1579 SWIDTH 840 0 DWIDTH 14 0 -BBX 12 12 1 -1 +BBX 13 10 1 -1 BITMAP -0400 -0400 -0000 -0A00 -0A00 -0000 -0020 -8010 -8010 -8010 -4060 -3F80 +0200 +0200 +0500 +0500 +0008 +4008 +8008 +8008 +C030 +7FC0 ENDCHAR -STARTCHAR 0x062C +STARTCHAR 0057 ENCODING 1580 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 8 11 1 -6 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 10 11 1 -6 BITMAP -7E -B0 -40 -C0 -80 -88 -88 -80 -C0 -61 -3E +7000 +8F00 +3800 +4000 +4000 +8800 +8800 +8000 +4000 +60C0 +1F00 ENDCHAR -STARTCHAR 0x062D +STARTCHAR 0057 ENCODING 1581 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 8 11 1 -6 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 10 11 1 -6 BITMAP -7E -B0 -40 -C0 -80 -80 -80 -80 -C0 -61 -3E +7000 +8F00 +3800 +4000 +4000 +8000 +8000 +8000 +4000 +60C0 +1F00 ENDCHAR -STARTCHAR 0x062E +STARTCHAR 0057 ENCODING 1582 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 8 15 1 -6 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 10 14 1 -6 BITMAP -10 -10 -00 -00 -7E -B0 -40 -C0 -80 -80 -80 -80 -C0 -61 -3E +0800 +0800 +0000 +7000 +8F00 +3800 +4000 +4000 +8000 +8000 +8000 +4000 +60C0 +1F00 ENDCHAR -STARTCHAR 0x062F +STARTCHAR 0065 ENCODING 1583 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 5 6 1 -1 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 6 1 0 BITMAP -10 +20 10 08 08 -88 -78 +08 +F0 ENDCHAR -STARTCHAR 0x0630 +STARTCHAR 0065 ENCODING 1584 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 5 10 1 -1 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 10 1 0 BITMAP 20 20 00 00 -10 +20 10 08 08 -88 -78 +08 +F0 ENDCHAR -STARTCHAR 0x0631 +STARTCHAR 0069 ENCODING 1585 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 7 8 1 -4 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 6 8 1 -4 BITMAP +08 +08 04 -06 -02 -02 -02 04 -8C -78 +04 +0C +18 +F0 ENDCHAR -STARTCHAR 0x0632 +STARTCHAR 0069 ENCODING 1586 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 7 12 1 -4 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 6 12 1 -4 BITMAP 08 08 00 00 +08 +08 04 -06 -02 -02 -02 04 -8C -78 +04 +0C +18 +F0 ENDCHAR -STARTCHAR 0x0633 +STARTCHAR 0072 ENCODING 1587 SWIDTH 960 0 DWIDTH 16 0 -BBX 14 7 1 -4 +BBX 15 10 1 -5 BITMAP -0004 -4124 -8124 -81FC -8100 -4200 +0002 +0002 +0012 +0112 +40EC +8080 +8080 +8080 +4300 3C00 ENDCHAR -STARTCHAR 0x0634 +STARTCHAR 0072 ENCODING 1588 SWIDTH 960 0 DWIDTH 16 0 -BBX 14 14 1 -4 +BBX 15 14 1 -5 BITMAP -0020 -0020 -0000 -0050 -0050 -0000 +0010 +0010 +0028 +0028 0000 -0004 -4124 -8124 -81FC -8100 -4200 +0002 +0012 +0112 +40EC +8080 +8080 +8080 +4300 3C00 ENDCHAR -STARTCHAR 0x0635 +STARTCHAR 0079 ENCODING 1589 -SWIDTH 1260 0 -DWIDTH 21 0 -BBX 19 7 1 -4 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 17 10 1 -5 BITMAP -000380 -410C40 -811020 -81FFE0 -810000 -420000 +000700 +000880 +001080 +012700 +40F800 +80C000 +808000 +808000 +430000 3C0000 ENDCHAR -STARTCHAR 0x0636 +STARTCHAR 0079 ENCODING 1590 -SWIDTH 1260 0 -DWIDTH 21 0 -BBX 19 11 1 -4 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 17 12 1 -5 BITMAP -000800 -000800 -000000 -000000 -000380 -410C40 -811020 -81FFE0 -810000 -420000 +002000 +002000 +000700 +000880 +001080 +012700 +40F800 +80C000 +808000 +808000 +430000 3C0000 ENDCHAR -STARTCHAR 0x0637 +STARTCHAR 00BC ENCODING 1591 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 10 12 1 -1 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 8 10 1 0 BITMAP -1000 -1000 -1800 -1000 -1000 -1000 -1000 -1380 -1440 -1840 -1040 -FF80 +20 +30 +20 +20 +20 +26 +29 +31 +26 +F8 ENDCHAR -STARTCHAR 0x0638 +STARTCHAR 00BC ENCODING 1592 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 10 12 1 -1 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 8 10 1 0 BITMAP -1000 -1000 -1800 -1100 -1100 -1000 -1000 -1380 -1440 -1840 -1040 -FF80 +20 +30 +26 +20 +20 +26 +29 +31 +26 +F8 ENDCHAR -STARTCHAR 0x0639 +STARTCHAR 00CB ENCODING 1593 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 7 11 1 -5 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 12 1 -7 BITMAP -38 -40 -40 -38 -60 -40 -80 -80 -80 -82 -7C +3800 +4000 +8000 +4C00 +3000 +4000 +4000 +8000 +8000 +8000 +4180 +3E00 ENDCHAR -STARTCHAR 0x063A +STARTCHAR 00CB ENCODING 1594 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 7 15 1 -5 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 16 1 -7 BITMAP -10 -10 -00 -00 -38 -40 -40 -38 -60 -40 -80 -80 -80 -82 -7C +2000 +2000 +0000 +0000 +3800 +4000 +8000 +4C00 +3000 +4000 +4000 +8000 +8000 +8000 +4180 +3E00 ENDCHAR STARTCHAR 0x0640 ENCODING 1600 @@ -22027,93 +21370,93 @@ BITMAP FF80 ENDCHAR -STARTCHAR 0x0641 +STARTCHAR 00CF ENCODING 1601 SWIDTH 900 0 DWIDTH 15 0 -BBX 13 11 1 -1 +BBX 14 12 1 0 BITMAP -0040 -0040 +0010 +0010 0000 0000 -0030 -0058 -8048 -8058 -8028 -4008 -3FF0 +0018 +002C +0024 +802C +8014 +8004 +4038 +3FC0 ENDCHAR -STARTCHAR 0x0642 +STARTCHAR 00D2 ENCODING 1602 SWIDTH 600 0 DWIDTH 10 0 -BBX 8 13 1 -4 +BBX 9 14 1 -3 BITMAP -0A -0A -00 -00 -06 -0B -09 -0B -85 -81 -81 -42 -3C +0500 +0500 +0000 +0000 +0300 +0580 +0480 +0480 +4380 +8080 +8080 +8100 +4200 +3C00 ENDCHAR -STARTCHAR 0x0643 +STARTCHAR 0xFED9 ENCODING 1603 SWIDTH 660 0 DWIDTH 11 0 -BBX 10 12 1 -1 +BBX 9 10 1 0 BITMAP -0080 -0080 -00C0 -0080 -0480 -0C80 -0480 -0C80 -8080 -8080 -4080 -3F00 +0100 +0180 +0100 +0900 +1900 +0900 +1900 +0100 +0100 +FE00 ENDCHAR -STARTCHAR 0x0644 +STARTCHAR 00DE ENCODING 1604 SWIDTH 540 0 DWIDTH 9 0 -BBX 8 13 1 -3 +BBX 8 12 1 -2 BITMAP 02 -02 03 02 02 02 02 02 -82 +42 82 82 -44 -38 +84 +78 ENDCHAR -STARTCHAR 0x0645 +STARTCHAR 00E3 ENCODING 1605 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 6 11 1 -8 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 6 13 1 -9 BITMAP -20 -70 -18 -FC +40 +B0 +08 +7C +80 80 80 80 @@ -22121,12 +21464,13 @@ 80 80 80 +80 ENDCHAR -STARTCHAR 0x0646 +STARTCHAR 00E7 ENCODING 1606 SWIDTH 600 0 DWIDTH 10 0 -BBX 8 11 1 -4 +BBX 8 10 1 -2 BITMAP 10 10 @@ -22137,10 +21481,9 @@ 81 81 82 -86 -78 +7C ENDCHAR -STARTCHAR 0x0647 +STARTCHAR 0xFEE9 ENCODING 1607 SWIDTH 420 0 DWIDTH 7 0 @@ -22149,15 +21492,15 @@ 20 30 50 -98 88 -78 +88 +70 ENDCHAR -STARTCHAR 0x0648 +STARTCHAR 0xFEED ENCODING 1608 SWIDTH 540 0 DWIDTH 9 0 -BBX 7 8 1 -3 +BBX 7 8 0 -3 BITMAP 04 0A @@ -22168,35 +21511,35 @@ 84 78 ENDCHAR -STARTCHAR 0x0649 +STARTCHAR 00F0 ENCODING 1609 SWIDTH 660 0 DWIDTH 11 0 -BBX 10 8 1 -3 +BBX 11 8 0 -2 BITMAP -01C0 +01E0 +0200 4200 -4400 -8700 -8080 -8080 -8300 -7C00 +8180 +8040 +8040 +4180 +3E00 ENDCHAR -STARTCHAR 0x064A +STARTCHAR 00F0 ENCODING 1610 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 10 11 1 -6 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 11 11 1 -5 BITMAP -01C0 +01E0 +0200 4200 -4400 -8700 -8080 -8080 -8300 -7C00 +8180 +8040 +8040 +4180 +3E00 0000 2800 2800 @@ -22214,16 +21557,14 @@ ENDCHAR STARTCHAR 0x064C ENCODING 1612 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 6 6 1 10 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 4 1 11 BITMAP -0C -14 -5C -C8 -50 -60 +18 +58 +D0 +60 ENDCHAR STARTCHAR 0x064D ENCODING 1613 @@ -22248,16 +21589,14 @@ ENDCHAR STARTCHAR 0x064F ENCODING 1615 -SWIDTH 0 0 -DWIDTH 0 0 -BBX 5 7 1 10 +SWIDTH 300 0 +DWIDTH 5 0 +BBX 4 5 1 11 BITMAP 20 50 -50 -38 20 -40 +50 80 ENDCHAR STARTCHAR 0x0650 @@ -22274,100 +21613,129 @@ ENCODING 1617 SWIDTH 0 0 DWIDTH 0 0 -BBX 5 5 1 10 +BBX 5 3 1 12 BITMAP 08 A8 -A8 -B0 -40 +D0 ENDCHAR STARTCHAR 0x0652 ENCODING 1618 -SWIDTH 300 0 -DWIDTH 5 0 -BBX 4 5 1 10 +SWIDTH 240 0 +DWIDTH 4 0 +BBX 3 4 1 11 +BITMAP +40 +A0 +A0 +C0 +ENDCHAR +STARTCHAR char1619 +ENCODING 1619 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 6 3 1 11 +BITMAP +04 +78 +80 +ENDCHAR +STARTCHAR char1620 +ENCODING 1620 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 3 4 1 11 BITMAP 60 -90 -90 -90 +80 +60 +80 +ENDCHAR +STARTCHAR char1620 +ENCODING 1621 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 3 4 1 -4 +BITMAP 60 +80 +60 +80 ENDCHAR -STARTCHAR 0x0660 +STARTCHAR 0030 ENCODING 1632 -SWIDTH 240 0 -DWIDTH 4 0 -BBX 2 2 2 3 +SWIDTH 300 0 +DWIDTH 5 0 +BBX 3 3 1 3 BITMAP -C0 -C0 +40 +E0 +40 ENDCHAR -STARTCHAR 0x0661 +STARTCHAR 0031 ENCODING 1633 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 3 11 3 0 +SWIDTH 300 0 +DWIDTH 5 0 +BBX 3 10 1 0 BITMAP -80 -80 C0 C0 -40 +C0 +E0 60 -20 +60 20 20 20 20 ENDCHAR -STARTCHAR 0x0662 +STARTCHAR 0031 ENCODING 1634 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 6 10 2 0 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 6 10 1 0 BITMAP -84 C4 +FC F8 60 60 +60 20 -30 -10 -10 -10 +20 +20 +20 ENDCHAR STARTCHAR 0x0663 ENCODING 1635 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 7 10 2 0 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 6 10 1 0 BITMAP -8A -CA -F4 +94 +FC +E8 +60 60 60 20 -30 -10 -10 -10 +20 +20 +20 ENDCHAR STARTCHAR 0x0664 ENCODING 1636 SWIDTH 420 0 DWIDTH 7 0 -BBX 5 11 2 -1 +BBX 5 11 1 -1 BITMAP 20 -40 +60 +C0 80 -E0 +F0 60 -20 -40 +C0 80 80 F8 @@ -22377,87 +21745,81 @@ ENCODING 1637 SWIDTH 420 0 DWIDTH 7 0 -BBX 5 8 2 -1 +BBX 5 8 2 1 BITMAP 30 -50 -48 -88 -88 +70 +58 88 88 -70 +D8 +F0 +60 ENDCHAR -STARTCHAR 0x0666 +STARTCHAR 0031 ENCODING 1638 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 7 11 1 0 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 6 9 1 0 BITMAP -80 +88 F8 -08 -08 -08 +78 08 08 0C +0C 04 04 -06 ENDCHAR -STARTCHAR 0x0667 +STARTCHAR 0037 ENCODING 1639 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 7 11 1 -1 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 6 10 1 0 BITMAP -82 -82 -C4 -44 -48 -28 -28 +84 +84 +CC +C8 +68 +68 +38 30 10 10 -10 ENDCHAR -STARTCHAR 0x0668 +STARTCHAR 0037 ENCODING 1640 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 7 12 1 -1 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 6 10 1 0 BITMAP -10 -10 -18 -18 -28 -28 -24 -44 -46 -C2 -82 -80 +20 +20 +30 +70 +58 +58 +4C +CC +84 +84 ENDCHAR -STARTCHAR 0x0669 +STARTCHAR 0031 ENCODING 1641 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 5 11 2 0 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 5 10 1 0 BITMAP 60 -A0 -A0 -A0 -A0 +B0 +90 +F0 50 10 -10 -08 +18 +18 08 08 ENDCHAR @@ -22526,11 +21888,11 @@ 80 80 ENDCHAR -STARTCHAR 0x0671 +STARTCHAR 0xFB50 ENCODING 1649 SWIDTH 300 0 DWIDTH 5 0 -BBX 5 16 0 0 +BBX 5 15 0 0 BITMAP 10 28 @@ -22538,7 +21900,6 @@ 80 00 20 -20 30 20 20 @@ -22549,11 +21910,11 @@ 20 20 ENDCHAR -STARTCHAR 0x0672 +STARTCHAR 0x0000 ENCODING 1650 SWIDTH 300 0 DWIDTH 5 0 -BBX 5 16 -1 0 +BBX 5 15 -1 0 BITMAP 18 20 @@ -22561,7 +21922,6 @@ E0 00 10 -10 18 10 10 @@ -22572,14 +21932,13 @@ 10 10 ENDCHAR -STARTCHAR 0x0673 +STARTCHAR 0x0002 ENCODING 1651 SWIDTH 300 0 DWIDTH 5 0 -BBX 5 16 -1 -5 +BBX 5 15 -1 -5 BITMAP 10 -10 18 10 10 @@ -22606,7 +21965,7 @@ 60 80 ENDCHAR -STARTCHAR 0x0675 +STARTCHAR 0x0004 ENCODING 1653 SWIDTH 360 0 DWIDTH 6 0 @@ -22614,7 +21973,7 @@ BITMAP 0C 10 -8C +0C 90 C0 80 @@ -22626,16 +21985,18 @@ 80 80 ENDCHAR -STARTCHAR 0x0676 +STARTCHAR 0xFE85 ENCODING 1654 SWIDTH 540 0 DWIDTH 9 0 -BBX 10 12 1 -3 +BBX 9 14 0 -3 BITMAP -00C0 -0100 -00C0 -0100 +0180 +0200 +0180 +0200 +0000 +0000 0400 0A00 0A00 @@ -22645,17 +22006,18 @@ 8400 7800 ENDCHAR -STARTCHAR 0x0677 +STARTCHAR 0xFE85 ENCODING 1655 SWIDTH 540 0 DWIDTH 9 0 -BBX 10 13 1 -3 +BBX 9 14 0 -3 BITMAP -1000 -28C0 -1100 -28C0 -4100 +1180 +2A00 +1180 +2A00 +4000 +0000 0400 0A00 0A00 @@ -22665,457 +22027,466 @@ 8400 7800 ENDCHAR -STARTCHAR 0x0678 +STARTCHAR 00F0 ENCODING 1656 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 13 13 1 -3 +SWIDTH 840 0 +DWIDTH 14 0 +BBX 13 14 1 -2 BITMAP 0018 0020 0018 0020 0000 -01C0 +0000 +01E0 +0200 4200 -4400 -8700 -8080 -8080 -8300 -7C00 +8180 +8040 +8040 +4180 +3E00 ENDCHAR -STARTCHAR 0x0679 +STARTCHAR 0050 ENCODING 1657 SWIDTH 840 0 DWIDTH 14 0 -BBX 12 11 1 -1 +BBX 13 9 1 -1 BITMAP -0800 -0800 -0E00 -0E00 -0000 -0020 -8010 -8010 -8010 -4060 -3F80 +0400 +0400 +0700 +0708 +4008 +8008 +8008 +C030 +7FC0 ENDCHAR -STARTCHAR 0x067A +STARTCHAR 0050 ENCODING 1658 -SWIDTH 840 0 -DWIDTH 14 0 -BBX 12 10 1 -1 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 13 11 0 -1 BITMAP -0600 -0000 -0600 +0200 +0200 0000 -0020 -8010 -8010 -8010 -4060 -3F80 +0200 +0200 +0008 +4008 +8008 +8008 +C030 +7FC0 ENDCHAR -STARTCHAR 0x067B +STARTCHAR 0048 ENCODING 1659 SWIDTH 840 0 DWIDTH 14 0 -BBX 12 10 1 -5 +BBX 13 12 1 -7 BITMAP -0020 -8010 -8010 -8010 -4060 -3F80 +0008 +4008 +8008 +8008 +C030 +7FC0 0000 -0600 +0200 +0200 0000 -0600 +0200 +0200 ENDCHAR -STARTCHAR 0x067C +STARTCHAR 0050 ENCODING 1660 -SWIDTH 840 0 -DWIDTH 14 0 -BBX 12 12 1 -4 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 13 11 0 -4 BITMAP -0A00 -0A00 -0000 -0020 -8010 -8010 -8010 -4060 -3F80 +0500 +0500 +0008 +4008 +8008 +8008 +C030 +7FC0 0600 0900 0600 ENDCHAR -STARTCHAR 0x067D +STARTCHAR 0050 ENCODING 1661 SWIDTH 840 0 DWIDTH 14 0 -BBX 12 9 1 -1 +BBX 13 10 1 -1 BITMAP -0A00 -0A00 -0000 -0420 -8410 -8010 -8010 -4060 -3F80 +0500 +0500 +0200 +0200 +0008 +4008 +8008 +8008 +C030 +7FC0 ENDCHAR -STARTCHAR 0x067E +STARTCHAR 004C ENCODING 1662 SWIDTH 840 0 DWIDTH 14 0 -BBX 12 10 1 -5 +BBX 13 11 1 -6 BITMAP -0020 -8010 -8010 -8010 -4060 -3F80 -0000 -0D80 +0008 +4008 +8008 +8008 +C030 +7FC0 0000 -0300 +0A00 +0A00 +0400 +0400 ENDCHAR -STARTCHAR 0x067F +STARTCHAR 0050 ENCODING 1663 SWIDTH 840 0 DWIDTH 14 0 -BBX 12 9 1 -1 +BBX 13 11 1 -1 BITMAP -0A00 -0A00 +0500 +0500 0000 -0A20 -8A10 -8010 -8010 -4060 -3F80 +0500 +0500 +0008 +4008 +8008 +8008 +C030 +7FC0 ENDCHAR -STARTCHAR 0x0680 +STARTCHAR 0048 ENCODING 1664 SWIDTH 840 0 DWIDTH 14 0 -BBX 12 10 1 -5 +BBX 13 12 1 -7 BITMAP -0020 -8010 -8010 -8010 -4060 -3F80 +0008 +4008 +8008 +8008 +C030 +7FC0 0000 -0D80 +0500 +0500 0000 -0D80 +0500 +0500 ENDCHAR -STARTCHAR 0x0681 +STARTCHAR 0057 ENCODING 1665 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 8 16 1 -6 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 10 17 1 -6 BITMAP -18 -20 -18 -20 -00 -7E -B0 -40 -C0 -80 -80 -80 -80 -C0 -61 -3E +0C00 +1000 +0C00 +1000 +0000 +0000 +7000 +8F00 +3800 +4000 +4000 +8000 +8000 +8000 +4000 +60C0 +1F00 ENDCHAR -STARTCHAR 0x0682 +STARTCHAR 0057 ENCODING 1666 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 8 18 1 -6 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 10 18 1 -6 BITMAP -10 -10 -00 -10 -10 -00 -00 -7E -B0 -40 -C0 -80 -80 -80 -80 -C0 -61 -3E +0800 +0800 +0000 +0800 +0800 +0000 +0000 +7000 +8F00 +3800 +4000 +4000 +8000 +8000 +8000 +4000 +60C0 +1F00 ENDCHAR -STARTCHAR 0x0683 +STARTCHAR 0057 ENCODING 1667 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 8 11 1 -6 -BITMAP -7E -B0 -40 -C0 -80 -94 -94 -80 -C0 -61 -3E -ENDCHAR -STARTCHAR 0x0684 -ENCODING 1668 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 8 11 1 -6 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 10 11 1 -6 BITMAP -7E -B0 -40 -C0 -98 -80 -98 -80 -C0 -61 -3E +7000 +8F00 +3800 +4000 +4000 +8A00 +8A00 +8000 +4000 +60C0 +1F00 +ENDCHAR +STARTCHAR 0057 +ENCODING 1668 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 10 11 1 -6 +BITMAP +7000 +8F00 +3800 +4000 +4800 +8800 +8000 +8800 +4800 +60C0 +1F00 ENDCHAR -STARTCHAR 0x0685 +STARTCHAR 0057 ENCODING 1669 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 8 18 1 -6 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 10 17 1 -6 BITMAP -10 -10 -00 -28 -28 -00 -00 -7E -B0 -40 -C0 -80 -80 -80 -80 -C0 -61 -3E +0800 +0800 +1400 +1400 +0000 +0000 +7000 +8F00 +3800 +4000 +4000 +8000 +8000 +8000 +4000 +60C0 +1F00 ENDCHAR -STARTCHAR 0x0686 +STARTCHAR 0057 ENCODING 1670 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 8 11 1 -6 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 10 11 1 -6 BITMAP -7E -B0 -40 -D4 -94 -80 -88 -88 -C0 -61 -3E +7000 +8F00 +3800 +4000 +4000 +9400 +9400 +8800 +4800 +60C0 +1F00 ENDCHAR -STARTCHAR 0x0687 +STARTCHAR 0057 ENCODING 1671 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 8 11 1 -6 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 10 11 1 -6 BITMAP -7E -B0 -40 -D4 -94 -80 -94 -94 -C0 -61 -3E +7000 +8F00 +3800 +4000 +4A00 +8A00 +8000 +8A00 +4A00 +60C0 +1F00 ENDCHAR -STARTCHAR 0x0688 +STARTCHAR 0065 ENCODING 1672 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 5 12 1 -1 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 12 1 0 BITMAP -20 -20 -38 -38 +80 +80 +E0 +E0 00 00 -10 +20 10 08 08 -88 -78 +08 +F0 ENDCHAR -STARTCHAR 0x0689 +STARTCHAR 0065 ENCODING 1673 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 5 8 1 -3 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 9 1 -3 BITMAP -10 +20 10 08 08 -88 -78 -28 -10 +08 +F0 +20 +50 +20 ENDCHAR -STARTCHAR 0x068A +STARTCHAR 0065 ENCODING 1674 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 5 9 1 -4 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 10 1 -4 BITMAP -10 +20 10 08 08 -88 -78 +08 +F0 00 -10 -10 +00 +20 +20 ENDCHAR -STARTCHAR 0x068B +STARTCHAR 0065 ENCODING 1675 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 5 14 1 -4 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 16 1 -4 BITMAP -20 -20 -38 -38 +40 +40 +70 +70 00 -10 +00 +20 10 08 08 -88 -78 +08 +F0 00 -18 -18 +00 +20 +20 ENDCHAR -STARTCHAR 0x068C +STARTCHAR 0065 ENCODING 1676 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 5 10 1 -1 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 10 1 0 BITMAP 50 50 00 00 -10 +20 10 08 08 -88 -78 +08 +F0 ENDCHAR -STARTCHAR 0x068D +STARTCHAR 0065 ENCODING 1677 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 5 9 1 -4 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 9 1 -3 BITMAP -10 +20 10 08 08 -88 -78 +08 +F0 00 50 50 ENDCHAR -STARTCHAR 0x068E +STARTCHAR 0065 ENCODING 1678 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 5 13 1 -1 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 12 1 0 BITMAP 20 20 -00 50 50 00 00 -10 +20 10 08 08 -88 -78 +08 +F0 ENDCHAR -STARTCHAR 0x068F +STARTCHAR 0065 ENCODING 1679 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 5 13 1 -1 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 12 1 0 BITMAP 50 50 -00 20 20 00 00 -10 +20 10 08 08 -88 -78 +08 +F0 ENDCHAR -STARTCHAR 0x0690 +STARTCHAR 0065 ENCODING 1680 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 5 13 1 -1 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 13 1 0 BITMAP 50 50 @@ -23124,505 +22495,519 @@ 50 00 00 -10 +20 10 08 08 -88 -78 +08 +F0 ENDCHAR -STARTCHAR 0x0691 +STARTCHAR 0069 ENCODING 1681 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 7 14 1 -4 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 6 14 1 -4 BITMAP -08 -08 -0E -0E +20 +20 +38 +38 00 00 +08 +08 04 -06 -02 -02 -02 04 -8C -78 +04 +0C +18 +F0 ENDCHAR -STARTCHAR 0x0692 +STARTCHAR 0069 ENCODING 1682 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 7 12 1 -4 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 7 13 1 -4 BITMAP -12 -0C +22 +14 +08 00 00 +08 +08 04 -06 -02 -02 -02 04 -8C -78 +04 +0C +18 +F0 ENDCHAR -STARTCHAR 0x0693 +STARTCHAR 0069 ENCODING 1683 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 7 9 1 -5 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 6 9 1 -5 BITMAP +08 +08 04 -06 -02 -02 -02 04 -8C -7A 04 +0C +18 +F4 +0C ENDCHAR -STARTCHAR 0x0694 +STARTCHAR 0069 ENCODING 1684 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 7 10 1 -6 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 6 10 1 -6 BITMAP +08 +08 04 -06 -02 -02 -02 04 -8C -78 04 +0C +18 +F0 +04 04 ENDCHAR -STARTCHAR 0x0695 +STARTCHAR 0069 ENCODING 1685 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 7 11 1 -7 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 6 12 1 -8 BITMAP +08 +08 04 -06 -02 -02 -02 04 -8C -78 -00 -24 +04 +0C 18 +F0 +00 +44 +28 +10 ENDCHAR -STARTCHAR 0x0696 +STARTCHAR 0069 ENCODING 1686 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 7 10 1 -6 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 6 10 1 -6 BITMAP -04 -06 -02 -22 -22 +08 +08 04 -8C -78 +44 +44 +0C +18 +F0 04 04 ENDCHAR -STARTCHAR 0x0697 +STARTCHAR 0069 ENCODING 1687 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 7 12 1 -4 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 6 12 1 -4 BITMAP -0A -0A +14 +14 00 00 +08 +08 04 -06 -02 -02 -02 04 -8C -78 +04 +0C +18 +F0 ENDCHAR -STARTCHAR 0x0698 +STARTCHAR 0069 ENCODING 1688 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 7 15 1 -4 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 6 14 1 -4 BITMAP -04 -04 -00 -0A -0A +08 +08 +14 +14 00 00 +08 +08 04 -06 -02 -02 -02 04 -8C -78 +04 +0C +18 +F0 ENDCHAR -STARTCHAR 0x0699 +STARTCHAR 0069 ENCODING 1689 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 7 15 1 -4 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 6 15 1 -4 BITMAP -0A -0A +14 +14 00 -0A -0A +14 +14 00 00 +08 +08 04 -06 -02 -02 -02 04 -8C -78 +04 +0C +18 +F0 ENDCHAR -STARTCHAR 0x069A +STARTCHAR 0072 ENCODING 1690 SWIDTH 960 0 DWIDTH 16 0 -BBX 14 11 1 -5 +BBX 15 12 1 -5 BITMAP -0040 -0040 -0000 -0004 -4124 -8124 -81FC -8100 -4200 -3C10 0010 +0010 +0002 +0002 +0012 +0112 +40EC +8080 +8080 +8088 +4308 +3C00 ENDCHAR -STARTCHAR 0x069B +STARTCHAR 0072 ENCODING 1691 SWIDTH 960 0 DWIDTH 16 0 -BBX 14 11 1 -8 +BBX 15 10 1 -6 BITMAP -0004 -4124 -8124 -81FC -8100 -4200 -3C28 -0028 -0000 -0010 -0010 +0002 +0012 +0112 +40EC +8080 +8080 +8094 +4314 +3C08 +0008 ENDCHAR -STARTCHAR 0x069C +STARTCHAR 0072 ENCODING 1692 SWIDTH 960 0 DWIDTH 16 0 -BBX 14 17 1 -8 +BBX 15 15 1 -6 BITMAP -0020 -0020 -0000 -0050 -0050 -0000 -0004 -4124 -8124 -81FC -8100 -4200 -3C28 -0028 -0000 0010 0010 +0028 +0028 +0000 +0002 +0012 +0112 +40EC +8080 +8080 +8094 +4314 +3C08 +0008 ENDCHAR -STARTCHAR 0x069D +STARTCHAR 0079 ENCODING 1693 -SWIDTH 1200 0 -DWIDTH 20 0 -BBX 19 7 1 -4 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 17 10 1 -5 BITMAP -000380 -410C40 -811020 -81FFE0 -810000 -420500 -3C0500 +000700 +000880 +001080 +012700 +40F800 +80C000 +808000 +808A00 +430A00 +3C0000 ENDCHAR -STARTCHAR 0x069E +STARTCHAR 0079 ENCODING 1694 -SWIDTH 1200 0 -DWIDTH 20 0 -BBX 19 14 1 -4 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 17 15 1 -5 BITMAP -000400 -000400 -000000 -000A00 -000A00 +001000 +001000 +002800 +002800 000000 -000000 -000380 -410C40 -811020 -81FFE0 -810000 -420000 +000700 +000880 +001080 +012700 +40F800 +80C000 +808000 +808000 +430000 3C0000 ENDCHAR -STARTCHAR 0x069F +STARTCHAR 00BC ENCODING 1695 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 10 12 1 -1 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 8 10 1 0 BITMAP -1000 -1100 -1900 -1000 -1280 -1280 -1000 -1380 -1440 -1840 -1040 -FF80 +22 +32 +25 +25 +20 +26 +29 +31 +26 +F8 ENDCHAR -STARTCHAR 0x06A0 +STARTCHAR 00CB ENCODING 1696 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 7 18 1 -5 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 18 1 -7 BITMAP -10 -10 -00 -28 -28 -00 -00 -38 -40 -40 -38 -60 -40 -80 -80 -80 -82 -7C +1000 +1000 +2800 +2800 +0000 +0000 +3800 +4000 +8000 +4C00 +3000 +4000 +4000 +8000 +8000 +8000 +4180 +3E00 ENDCHAR -STARTCHAR 0x06A1 +STARTCHAR 00CF ENCODING 1697 SWIDTH 900 0 DWIDTH 15 0 -BBX 13 7 1 -1 +BBX 14 8 1 0 BITMAP -0030 -0058 -8048 -8058 -8028 -4008 -3FF0 +0018 +002C +0024 +802C +8014 +8004 +4038 +3FC0 ENDCHAR -STARTCHAR 0x06A2 +STARTCHAR 00CF ENCODING 1698 SWIDTH 900 0 DWIDTH 15 0 -BBX 13 10 1 -4 +BBX 14 12 1 -4 BITMAP -0030 -0058 -8048 -8058 -8028 -4008 -3FF0 +0018 +002C +0024 +802C +8014 +8004 +4038 +3FC0 0000 -0020 -0020 +0000 +0100 +0100 ENDCHAR -STARTCHAR 0x06A3 +STARTCHAR 00CF ENCODING 1699 SWIDTH 900 0 DWIDTH 15 0 -BBX 13 14 1 -4 +BBX 14 16 1 -4 BITMAP -0020 -0020 +0010 +0010 0000 0000 -0030 -0058 -8048 -8058 -8028 -4008 -3FF0 +0018 +002C +0024 +802C +8014 +8004 +4038 +3FC0 0000 +0000 0100 0100 ENDCHAR -STARTCHAR 0x06A4 +STARTCHAR 00CF ENCODING 1700 SWIDTH 900 0 DWIDTH 15 0 -BBX 13 14 1 -1 +BBX 14 14 1 0 BITMAP -0020 -0020 -0000 -0050 -0050 +0010 +0010 +0028 +0028 0000 0000 -0030 -0058 -8048 -8058 -8028 -4008 -3FF0 +0018 +002C +0024 +802C +8014 +8004 +4038 +3FC0 ENDCHAR -STARTCHAR 0x06A5 +STARTCHAR 00CF ENCODING 1701 SWIDTH 900 0 DWIDTH 15 0 -BBX 13 13 1 -7 +BBX 14 13 1 -5 BITMAP -0030 -0058 -8048 -8058 -8028 -4008 -3FF0 -0000 -0050 -0050 +0018 +002C +0024 +802C +8014 +8004 +4038 +3FC0 0000 -0020 -0020 +0028 +0028 +0010 +0010 ENDCHAR -STARTCHAR 0x06A6 +STARTCHAR 00CF ENCODING 1702 SWIDTH 900 0 DWIDTH 15 0 -BBX 13 14 1 -1 +BBX 14 15 1 0 BITMAP -0050 -0050 +0028 +0028 0000 -0050 -0050 +0028 +0028 0000 0000 -0030 -0058 -8048 -8058 -8028 -4008 -3FF0 +0018 +002C +0024 +802C +8014 +8004 +4038 +3FC0 ENDCHAR -STARTCHAR 0x06A7 +STARTCHAR 00D2 ENCODING 1703 SWIDTH 600 0 DWIDTH 10 0 -BBX 8 13 1 -4 +BBX 9 14 1 -3 BITMAP -04 -04 -00 -00 -06 -0B -09 -0B -85 -81 -81 -42 -3C +0200 +0200 +0000 +0000 +0300 +0580 +0480 +0480 +4380 +8080 +8080 +8100 +4200 +3C00 ENDCHAR -STARTCHAR 0x06A8 +STARTCHAR 00D2 ENCODING 1704 SWIDTH 600 0 DWIDTH 10 0 -BBX 8 16 1 -4 +BBX 9 16 1 -3 BITMAP -04 -04 -00 -0A -0A -00 -00 -06 -0B -09 -0B -85 -81 -81 -42 -3C +0200 +0200 +0500 +0500 +0000 +0000 +0300 +0580 +0480 +0480 +4380 +8080 +8080 +8100 +4200 +3C00 ENDCHAR -STARTCHAR 0x06A9 +STARTCHAR 00D7 ENCODING 1705 -SWIDTH 840 0 -DWIDTH 14 0 -BBX 14 12 1 -1 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 15 17 1 -1 BITMAP -000C -0030 -00C0 -0100 -0100 +0004 +0018 +0060 +0186 +0218 +0060 +0180 +0200 +0200 0100 -0080 -4040 -8040 -8020 -8020 +00C0 +0020 +4010 +8008 +8008 +C030 7FC0 ENDCHAR STARTCHAR 0x06AA ENCODING 1706 SWIDTH 960 0 DWIDTH 16 0 -BBX 14 8 1 -1 +BBX 14 9 1 0 BITMAP +0180 0600 1800 2000 @@ -23632,313 +23017,324 @@ 8004 7FF8 ENDCHAR -STARTCHAR 0x06AB +STARTCHAR 00D7 ENCODING 1707 -SWIDTH 900 0 -DWIDTH 15 0 -BBX 15 12 1 -1 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 15 14 1 -1 BITMAP 0006 -001C -0074 -0094 -0088 -0060 +0018 +0068 +01A8 +0210 +0200 +0100 +00C0 +0020 4010 -8010 -8010 -8010 -4060 -3F80 +8008 +8008 +C030 +7FC0 ENDCHAR -STARTCHAR 0x06AC +STARTCHAR 0xFED9 ENCODING 1708 SWIDTH 660 0 DWIDTH 11 0 -BBX 10 15 1 -1 +BBX 9 13 1 0 BITMAP -0200 -0200 +0800 +0800 0000 -0080 -0080 -00C0 -0080 -0480 -0C80 -0480 -0C80 -8080 -8080 -4080 -3F00 +0100 +0180 +0100 +0900 +1900 +0900 +1900 +0100 +0100 +FE00 ENDCHAR -STARTCHAR 0x06AD +STARTCHAR 0xFED9 ENCODING 1709 SWIDTH 660 0 DWIDTH 11 0 -BBX 10 16 1 -1 +BBX 9 12 1 0 BITMAP -0800 -0800 -0000 -1400 -1480 -0080 -00C0 -0080 -0480 -0C80 -0480 -0C80 -8080 -8080 -4080 -3F00 +1000 +1000 +2900 +2980 +0100 +0900 +1900 +0900 +1900 +0100 +0100 +FE00 ENDCHAR -STARTCHAR 0x06AE +STARTCHAR 0xFED9 ENCODING 1710 SWIDTH 660 0 DWIDTH 11 0 -BBX 10 18 1 -7 +BBX 9 16 1 -6 BITMAP -0080 -0080 -00C0 -0080 -0480 -0C80 -0480 -0C80 -8080 -8080 -4080 -3F00 +0100 +0180 +0100 +0900 +1900 +0900 +1900 +0100 +0100 +FE00 0000 -1400 -1400 0000 -0800 -0800 +2800 +2800 +1000 +1000 ENDCHAR -STARTCHAR 0x06AF +STARTCHAR 00D7 ENCODING 1711 -SWIDTH 900 0 -DWIDTH 15 0 -BBX 15 14 1 -1 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 15 17 1 -1 BITMAP -0006 +0004 0018 -0066 -0098 0060 -0080 -0080 +0186 +0218 0060 +0180 +0200 +0200 +0100 +00C0 +0020 4010 -8010 -8010 -8010 -4060 -3F80 +8008 +8008 +C030 +7FC0 ENDCHAR -STARTCHAR 0x06B0 +STARTCHAR 00D7 ENCODING 1712 SWIDTH 960 0 DWIDTH 16 0 -BBX 15 14 1 -1 +BBX 15 17 1 -1 BITMAP -0006 +0004 0018 -0066 -009C -0074 -0094 -0088 0060 +0186 +0218 +0068 +01A8 +0210 +0200 +0100 +00C0 +0020 4010 -8010 -8010 -8010 -4060 -3F80 +8008 +8008 +C030 +7FC0 ENDCHAR -STARTCHAR 0x06B1 +STARTCHAR 00D7 ENCODING 1713 -SWIDTH 900 0 -DWIDTH 15 0 -BBX 15 16 1 -1 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 15 18 1 -1 BITMAP -0010 -0050 -0046 -0018 -0066 -0098 +0040 +0144 +0118 0060 -0080 -0080 +0186 +0218 0060 +0180 +0200 +0200 +0100 +00C0 +0020 4010 -8010 -8010 -8010 -4060 -3F80 +8008 +8008 +C030 +7FC0 ENDCHAR -STARTCHAR 0x06B2 +STARTCHAR 00D7 ENCODING 1714 -SWIDTH 900 0 -DWIDTH 15 0 -BBX 15 17 1 -4 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 15 21 1 -5 BITMAP -0006 +0004 0018 -0066 -0098 0060 -0080 -0080 +0186 +0218 0060 +0180 +0200 +0200 +0100 +00C0 +0020 4010 -8010 -8010 -8010 -4060 -3F80 +8008 +8008 +C030 +7FC0 0000 -0A00 -0A00 +0000 +0500 +0500 ENDCHAR -STARTCHAR 0x06B3 +STARTCHAR 00D7 ENCODING 1715 -SWIDTH 900 0 -DWIDTH 15 0 -BBX 15 18 1 -5 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 15 23 1 -7 BITMAP -0006 +0004 0018 -0066 -0098 0060 -0080 -0080 +0186 +0218 0060 +0180 +0200 +0200 +0100 +00C0 +0020 4010 -8010 -8010 -8010 -4060 -3F80 +8008 +8008 +C030 +7FC0 0000 -0C00 +0400 +0400 0000 -0C00 +0400 +0400 ENDCHAR -STARTCHAR 0x06B4 +STARTCHAR 00D7 ENCODING 1716 -SWIDTH 900 0 -DWIDTH 15 0 -BBX 15 18 1 -1 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 15 20 1 -1 BITMAP -0040 +0100 +0100 0040 -0010 -0050 -0046 -0018 -0066 -0098 +0144 +0118 0060 -0080 -0080 +0186 +0218 0060 +0180 +0200 +0200 +0100 +00C0 +0020 4010 -8010 -8010 -8010 -4060 -3F80 +8008 +8008 +C030 +7FC0 ENDCHAR -STARTCHAR 0x06B5 +STARTCHAR 00DE ENCODING 1717 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 8 16 1 -3 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 17 1 -2 BITMAP -09 -06 -00 -02 -02 -03 -02 -02 -02 -02 -02 -82 -82 -82 -44 -38 +0880 +0500 +0200 +0000 +0000 +0200 +0300 +0200 +0200 +0200 +0200 +0200 +4200 +8200 +8200 +8400 +7800 ENDCHAR -STARTCHAR 0x06B6 +STARTCHAR 00DE ENCODING 1718 SWIDTH 540 0 DWIDTH 9 0 -BBX 8 17 1 -3 +BBX 8 16 1 -2 BITMAP 02 02 00 00 02 -02 03 02 02 02 02 02 -82 +42 82 82 -44 -38 +84 +78 ENDCHAR -STARTCHAR 0x06B7 +STARTCHAR 00DE ENCODING 1719 SWIDTH 540 0 DWIDTH 9 0 -BBX 8 20 1 -3 +BBX 8 18 1 -2 BITMAP 02 02 -00 05 05 00 00 02 -02 03 02 02 02 02 02 -82 +42 82 82 -44 -38 +84 +78 ENDCHAR -STARTCHAR 0x06BA +STARTCHAR 00E7 ENCODING 1722 SWIDTH 600 0 DWIDTH 10 0 -BBX 8 8 1 -4 +BBX 8 7 1 -2 BITMAP 02 02 @@ -23946,59 +23342,56 @@ 81 81 82 -86 -78 +7C ENDCHAR -STARTCHAR 0x06BB +STARTCHAR 00E7 ENCODING 1723 SWIDTH 600 0 DWIDTH 10 0 -BBX 8 13 1 -4 +BBX 8 13 1 -2 BITMAP 20 20 38 38 00 +00 02 02 41 81 81 82 -86 -78 +7C ENDCHAR -STARTCHAR 0x06BC +STARTCHAR 00E7 ENCODING 1724 SWIDTH 600 0 DWIDTH 10 0 -BBX 8 12 1 -5 +BBX 9 11 1 -3 BITMAP -10 -10 -00 -02 -02 -41 -81 -81 -82 -86 -7D -07 +1000 +1000 +0000 +0200 +0200 +4100 +8100 +8100 +8300 +7E80 +0380 ENDCHAR -STARTCHAR 0x06BD +STARTCHAR 00E7 ENCODING 1725 SWIDTH 600 0 DWIDTH 10 0 -BBX 8 14 1 -4 +BBX 8 12 1 -2 BITMAP -10 -10 -00 -28 -28 +08 +08 +14 +14 00 02 02 @@ -24006,22 +23399,20 @@ 81 81 82 -86 -78 +7C ENDCHAR -STARTCHAR 0x06BE +STARTCHAR 00EA ENCODING 1726 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 7 1 -1 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 8 6 1 -1 BITMAP -18 -04 -1A -2A -2A -32 -CC +38 +4E +49 +59 +26 +C0 ENDCHAR STARTCHAR 0x06C0 ENCODING 1728 @@ -24084,11 +23475,11 @@ 8C 04 ENDCHAR -STARTCHAR 0x06C4 +STARTCHAR 0xFE85 ENCODING 1732 SWIDTH 540 0 DWIDTH 9 0 -BBX 7 8 1 -3 +BBX 7 8 0 -3 BITMAP 04 0A @@ -24096,14 +23487,14 @@ 0E 12 2A -9C +94 78 ENDCHAR -STARTCHAR 0x06C5 +STARTCHAR 0xFE85 ENCODING 1733 SWIDTH 540 0 DWIDTH 9 0 -BBX 7 8 1 -3 +BBX 7 8 0 -3 BITMAP 04 0A @@ -24114,14 +23505,15 @@ 84 78 ENDCHAR -STARTCHAR 0x06C6 +STARTCHAR 0xFE85 ENCODING 1734 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 7 12 1 -3 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 8 13 0 -3 BITMAP -12 -0C +11 +0A +04 00 00 04 @@ -24133,11 +23525,11 @@ 84 78 ENDCHAR -STARTCHAR 0x06C7 +STARTCHAR 0xFE85 ENCODING 1735 SWIDTH 540 0 DWIDTH 9 0 -BBX 7 14 1 -3 +BBX 7 14 0 -3 BITMAP 04 0A @@ -24154,11 +23546,11 @@ 84 78 ENDCHAR -STARTCHAR 0x06C8 +STARTCHAR 0xFE85 ENCODING 1736 SWIDTH 540 0 DWIDTH 9 0 -BBX 7 14 1 -3 +BBX 7 14 0 -3 BITMAP 04 04 @@ -24175,14 +23567,15 @@ 84 78 ENDCHAR -STARTCHAR 0x06C9 +STARTCHAR 0xFE85 ENCODING 1737 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 7 12 1 -3 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 8 13 0 -3 BITMAP -0C -12 +04 +0A +11 00 00 04 @@ -24194,11 +23587,11 @@ 84 78 ENDCHAR -STARTCHAR 0x06CA +STARTCHAR 0xFE85 ENCODING 1738 SWIDTH 540 0 DWIDTH 9 0 -BBX 7 12 1 -3 +BBX 7 12 0 -3 BITMAP 0A 0A @@ -24213,15 +23606,14 @@ 84 78 ENDCHAR -STARTCHAR 0x06CB +STARTCHAR 0xFE85 ENCODING 1739 SWIDTH 540 0 DWIDTH 9 0 -BBX 7 15 1 -3 +BBX 7 14 0 -3 BITMAP 04 04 -00 0A 0A 00 @@ -24235,94 +23627,96 @@ 84 78 ENDCHAR -STARTCHAR 0x06CC +STARTCHAR 00F0 ENCODING 1740 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 10 8 1 -3 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 11 8 1 -2 BITMAP -01C0 +01E0 +0200 4200 -4400 -8700 -8080 -8080 -8300 -7C00 +8180 +8040 +8040 +4180 +3E00 ENDCHAR -STARTCHAR 0x06CD +STARTCHAR 00F0 ENCODING 1741 -SWIDTH 840 0 -DWIDTH 14 0 -BBX 12 8 1 -3 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 13 8 0 -2 BITMAP -0070 +0078 +0080 1080 -3100 -61C0 -A020 -2020 -20C0 -1F00 +2060 +6010 +A010 +1060 +0F80 ENDCHAR -STARTCHAR 0x06CE +STARTCHAR 00F0 ENCODING 1742 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 10 10 1 -3 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 11 11 0 -2 BITMAP -2400 -1800 -01C0 -4200 4400 -8700 -8080 -8080 -8300 -7C00 +2800 +1000 +01E0 +0200 +4200 +8180 +8040 +8040 +4180 +3E00 ENDCHAR -STARTCHAR 0x06D0 +STARTCHAR 00F0 ENCODING 1744 SWIDTH 720 0 DWIDTH 12 0 -BBX 10 12 1 -7 +BBX 11 14 1 -8 BITMAP -01C0 +01E0 +0200 4200 -4400 -8700 -8080 -8080 -8300 -7C00 +8180 +8040 +8040 +4180 +3E00 0000 -3000 +0800 +0800 0000 -3000 +0800 +0800 ENDCHAR -STARTCHAR 0x06D1 +STARTCHAR 00F0 ENCODING 1745 SWIDTH 720 0 DWIDTH 12 0 -BBX 10 14 1 -9 +BBX 11 13 1 -7 BITMAP -01C0 +01E0 +0200 4200 -4400 -8700 -8080 -8080 -8300 -7C00 +8180 +8040 +8040 +4180 +3E00 0000 2800 2800 -0000 1000 1000 ENDCHAR -STARTCHAR 0x06D2 +STARTCHAR 0xFBAE ENCODING 1746 SWIDTH 900 0 DWIDTH 15 0 @@ -24337,7 +23731,7 @@ 8000 7FF8 ENDCHAR -STARTCHAR 0x06D3 +STARTCHAR 0xFBAE ENCODING 1747 SWIDTH 900 0 DWIDTH 15 0 @@ -24365,1889 +23759,2644 @@ ENDCHAR STARTCHAR 0x06D5 ENCODING 1749 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 5 6 1 0 +SWIDTH 300 0 +DWIDTH 5 0 +BBX 4 6 1 0 BITMAP 20 30 50 -98 -88 -78 +90 +90 +60 ENDCHAR -STARTCHAR 0x06F0 +STARTCHAR 0030 ENCODING 1776 SWIDTH 240 0 DWIDTH 4 0 -BBX 2 2 2 3 +BBX 3 3 1 3 BITMAP -C0 -C0 +40 +E0 +40 ENDCHAR -STARTCHAR 0x06F1 +STARTCHAR 0031 ENCODING 1777 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 3 11 3 0 +SWIDTH 300 0 +DWIDTH 5 0 +BBX 3 10 1 0 BITMAP -80 -80 C0 C0 -40 +C0 +E0 60 -20 +60 20 20 20 20 ENDCHAR -STARTCHAR 0x06F2 +STARTCHAR 0031 ENCODING 1778 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 6 10 2 0 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 6 10 1 0 BITMAP -84 C4 +FC F8 60 60 +60 20 -30 -10 -10 -10 +20 +20 +20 ENDCHAR -STARTCHAR 0x06F3 +STARTCHAR 0x0663 ENCODING 1779 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 7 10 2 0 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 6 10 1 0 BITMAP -8A -CA -F4 +94 +FC +E8 60 60 +60 20 -30 -10 -10 -10 +20 +20 +20 ENDCHAR -STARTCHAR 0x06F4 +STARTCHAR 0031 ENCODING 1780 SWIDTH 480 0 DWIDTH 8 0 -BBX 6 11 2 0 +BBX 6 10 1 0 BITMAP -10 -A4 -C4 -F8 -60 -60 +98 +FC +C0 +64 +7C +78 20 -30 -10 -10 -10 +20 +20 +20 ENDCHAR -STARTCHAR 0x06F5 +STARTCHAR 0035 ENCODING 1781 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 5 9 2 0 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 6 10 1 0 BITMAP 20 -50 -50 -88 -88 -88 -A8 -A8 -50 +30 +70 +58 +58 +8C +84 +94 +FC +68 ENDCHAR -STARTCHAR 0x06F6 +STARTCHAR 0036 ENCODING 1782 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 5 9 2 0 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 6 10 1 0 BITMAP -38 -40 -40 -48 +30 +78 +C0 +C4 +78 30 60 -40 +C0 80 80 ENDCHAR -STARTCHAR 0x06F7 +STARTCHAR 0037 ENCODING 1783 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 7 11 1 -1 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 6 10 1 0 BITMAP -82 -82 -C4 -44 -48 -28 -28 +84 +84 +CC +C8 +68 +68 +38 30 10 10 -10 ENDCHAR -STARTCHAR 0x06F8 +STARTCHAR 0037 ENCODING 1784 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 7 12 1 -1 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 6 10 1 0 BITMAP -10 -10 -18 -18 -28 -28 -24 -44 -46 -C2 -82 -80 +20 +20 +30 +70 +58 +58 +4C +CC +84 +84 ENDCHAR -STARTCHAR 0x06F9 +STARTCHAR 0031 ENCODING 1785 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 5 11 2 0 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 5 10 1 0 BITMAP 60 -A0 -A0 -A0 -A0 +B0 +90 +F0 50 10 -10 -08 +18 +18 08 08 ENDCHAR -STARTCHAR 0x0E01 -ENCODING 3585 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 9 1 0 +STARTCHAR 0072 +ENCODING 1786 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 15 14 1 -5 BITMAP -7C -86 -42 -82 -82 -82 -82 -82 -82 +0010 +0010 +0028 +0028 +0000 +0002 +0012 +0112 +40EC +8080 +8080 +8088 +4308 +3C00 ENDCHAR -STARTCHAR 0x0E02 -ENCODING 3586 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 8 9 1 0 +STARTCHAR 0079 +ENCODING 1787 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 17 12 1 -5 BITMAP -71 -A9 -49 -11 -11 -11 -11 -11 -3F -ENDCHAR -STARTCHAR 0x0E03 -ENCODING 3587 +002000 +002000 +000700 +000880 +001080 +012700 +40F800 +80C000 +808000 +808400 +430400 +3C0000 +ENDCHAR +STARTCHAR 00CB +ENCODING 1788 SWIDTH 600 0 DWIDTH 10 0 -BBX 9 9 1 0 +BBX 9 16 1 -7 BITMAP -4880 -B480 -CC80 -A880 -4880 -0880 -0880 -0880 -1F80 +2000 +2000 +0000 +0000 +3800 +4000 +8000 +4C00 +3000 +4000 +4000 +8800 +8800 +8000 +4180 +3E00 ENDCHAR -STARTCHAR 0x0E04 -ENCODING 3588 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 8 9 1 0 +STARTCHAR 0x0621 +ENCODING 1789 +SWIDTH 300 0 +DWIDTH 5 0 +BBX 4 13 1 0 BITMAP -7E -83 -81 -B1 -E9 -51 -41 -41 -41 +70 +80 +80 +70 +C0 +80 +00 +50 +50 +50 +50 +50 +50 ENDCHAR -STARTCHAR 0x0E05 -ENCODING 3589 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 8 9 1 0 +STARTCHAR 00E3 +ENCODING 1790 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 6 13 1 -1 BITMAP -66 -99 -81 -B1 -E9 -51 -41 -41 -41 +40 +B0 +08 +7C +80 +80 +94 +94 +94 +94 +94 +94 +80 ENDCHAR -STARTCHAR 0x0E06 -ENCODING 3590 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 10 9 1 0 +STARTCHAR 00FA +ENCODING 2305 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 6 4 0 13 BITMAP -6840 -9440 -C840 -A840 -4840 -1E40 -2940 -28C0 -1840 +20 +A4 +8C +78 ENDCHAR -STARTCHAR 0x0E07 -ENCODING 3591 +STARTCHAR 00F7 +ENCODING 2306 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 1 2 0 14 +BITMAP +80 +80 +ENDCHAR +STARTCHAR 0048 +ENCODING 2307 SWIDTH 420 0 DWIDTH 7 0 -BBX 6 9 1 0 +BBX 3 9 2 1 BITMAP -08 -14 -0C -84 -84 -44 -24 -14 -0C +40 +E0 +40 +00 +00 +00 +40 +E0 +40 ENDCHAR -STARTCHAR 0x0E08 -ENCODING 3592 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 9 1 0 +STARTCHAR 0041 +ENCODING 2309 +SWIDTH 840 0 +DWIDTH 14 0 +BBX 15 12 0 -1 BITMAP -7C -86 -02 -1A -2E -16 -02 -02 -02 +78FE +0420 +0220 +0420 +3C20 +83E0 +8120 +4120 +2320 +1E20 +0020 +0020 ENDCHAR -STARTCHAR 0x0E09 -ENCODING 3593 +STARTCHAR 0041 +ENCODING 2310 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 18 12 0 -1 +BITMAP +78FFC0 +042100 +022100 +042100 +3C2100 +83E100 +822100 +422100 +262100 +1C2100 +002100 +002100 +ENDCHAR +STARTCHAR 0045 +ENCODING 2311 SWIDTH 600 0 DWIDTH 10 0 -BBX 9 9 1 0 +BBX 10 13 0 -2 BITMAP +FFC0 +0400 +7C00 +4000 +4000 +3800 +0400 +0400 3C00 -4600 +3C00 +0400 0200 -4200 -A200 -6700 -2A80 -3280 -2100 +0100 ENDCHAR -STARTCHAR 0x0E0A -ENCODING 3594 +STARTCHAR 0049 +ENCODING 2312 SWIDTH 600 0 DWIDTH 10 0 -BBX 9 9 1 0 +BBX 10 18 0 -2 BITMAP -7180 -AA00 -4900 -1100 -1100 -1100 -1100 -1100 -3F00 +0C00 +1200 +1000 +0800 +0400 +FFC0 +0400 +7C00 +4000 +4000 +3800 +0400 +0400 +3C00 +3C00 +0400 +0200 +0100 ENDCHAR -STARTCHAR 0x0E0B -ENCODING 3595 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 10 9 1 0 +STARTCHAR 0055 +ENCODING 2313 +SWIDTH 900 0 +DWIDTH 15 0 +BBX 16 11 0 0 BITMAP -48C0 -B500 -8480 -C880 -A880 -4880 -0880 -0880 -1F80 +FFFF +0100 +0100 +0100 +1E00 +8300 +8080 +4080 +4080 +3180 +0F00 ENDCHAR -STARTCHAR 0x0E0C -ENCODING 3596 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 10 9 1 0 +STARTCHAR 0055 +ENCODING 2314 +SWIDTH 900 0 +DWIDTH 15 0 +BBX 16 11 0 0 BITMAP -7840 -8440 -4440 -8440 -8440 -8440 -CF40 -ACC0 -4840 +FFFF +0100 +0100 +0100 +1E00 +83B0 +80C8 +4088 +4088 +3190 +0F00 ENDCHAR -STARTCHAR 0x0E0D -ENCODING 3597 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 10 13 1 -4 +STARTCHAR 003F +ENCODING 2315 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 17 12 0 -1 BITMAP -7840 -8440 -4440 -8440 -8440 -8440 -C440 -A440 -4FC0 -0000 -0440 -0A40 -0780 +FFFF80 +010000 +010000 +391000 +453800 +03F000 +031000 +0D0800 +311000 +012000 +012000 +001C00 ENDCHAR -STARTCHAR 0x0E0E -ENCODING 3598 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 14 1 -5 +STARTCHAR 003B +ENCODING 2316 +SWIDTH 900 0 +DWIDTH 15 0 +BBX 15 13 0 -2 BITMAP -1F00 +FFFE +0040 +0040 +0040 +78E0 +C590 +8308 +8008 +4008 +4070 2080 1080 -2080 -2080 -2080 -6080 -A080 -4080 -0480 -3C80 -4A80 -3180 -0080 +0078 ENDCHAR -STARTCHAR 0x0E0F -ENCODING 3599 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 14 1 -5 +STARTCHAR 004F +ENCODING 2317 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 12 21 0 -5 BITMAP -1F00 -2080 -1080 -2080 -2080 -2080 -6080 -A080 -4080 -0480 -3880 -4A80 -3580 +0420 +0460 +03C0 +0000 +0000 +FFF0 +4100 +4100 +4100 +4100 +4100 +4100 +4600 +2000 +1000 +0C00 +0200 +0180 +0040 +0040 0080 ENDCHAR -STARTCHAR 0x0E10 -ENCODING 3600 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 8 14 1 -5 +STARTCHAR 004F +ENCODING 2318 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 12 21 0 -5 BITMAP -1C -23 -78 -06 -1A -2E -16 -02 -02 -00 -16 -66 -AA -D4 +4000 +4000 +3E00 +0100 +0100 +FFF0 +4100 +4100 +4100 +4100 +4100 +4100 +4600 +2000 +1000 +0C00 +0200 +0180 +0040 +0040 +0080 ENDCHAR -STARTCHAR 0x0E11 -ENCODING 3601 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 10 9 1 0 +STARTCHAR 004F +ENCODING 2319 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 12 16 0 -5 BITMAP -5880 -A540 -CA40 -AA40 -4C40 -0C40 -0840 -0840 -0840 +FFF0 +4100 +4100 +4100 +4100 +4100 +4100 +4600 +2000 +1000 +0C00 +0200 +0180 +0040 +0040 +0080 ENDCHAR -STARTCHAR 0x0E12 -ENCODING 3602 -SWIDTH 780 0 -DWIDTH 13 0 -BBX 12 9 1 0 +STARTCHAR 004F +ENCODING 2320 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 12 21 0 -5 BITMAP -6610 -9910 -9110 -A910 -9910 -5110 -63D0 -6530 -6310 +6000 +1800 +0400 +0200 +0100 +FFF0 +4100 +4100 +4100 +4100 +4100 +4100 +4600 +2000 +1000 +0C00 +0200 +0180 +0040 +0040 +0080 ENDCHAR -STARTCHAR 0x0E13 -ENCODING 3603 -SWIDTH 780 0 -DWIDTH 13 0 -BBX 12 9 1 0 +STARTCHAR 0041 +ENCODING 2321 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 18 16 0 -1 BITMAP -7840 -8440 -4440 -8440 -8440 -84E0 -C550 -A650 -4460 +001080 +001180 +000F00 +000000 +78FFC0 +042100 +022100 +042100 +3C2100 +83E100 +812100 +412100 +232100 +1E2100 +002100 +002100 ENDCHAR -STARTCHAR 0x0E14 -ENCODING 3604 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 8 9 1 0 +STARTCHAR 0041 +ENCODING 2322 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 18 17 0 -1 BITMAP -3E -43 -91 -A9 -99 -B1 -61 -41 -41 +004000 +004000 +003E00 +000100 +000100 +78FFC0 +042100 +022100 +042100 +3C2100 +83E100 +822100 +422100 +262100 +1C2100 +002100 +002100 ENDCHAR -STARTCHAR 0x0E15 -ENCODING 3605 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 8 9 1 0 +STARTCHAR 0041 +ENCODING 2323 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 18 17 0 -1 BITMAP -66 -99 -91 -A9 -99 -B1 -61 -41 -41 +006000 +001800 +000400 +000200 +000100 +78FFC0 +042100 +022100 +042100 +3C2100 +83E100 +822100 +422100 +262100 +1C2100 +002100 +002100 ENDCHAR -STARTCHAR 0x0E16 -ENCODING 3606 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 9 1 0 +STARTCHAR 0041 +ENCODING 2324 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 18 18 0 -1 BITMAP -7C -86 -42 -82 -82 -82 -C2 -A2 -42 +003000 +000800 +00C400 +003A00 +000700 +000100 +78FFC0 +042100 +022100 +042100 +3C2100 +83E100 +822100 +422100 +262100 +1C2100 +002100 +002100 ENDCHAR -STARTCHAR 0x0E17 -ENCODING 3607 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 8 9 1 0 +STARTCHAR 006B +ENCODING 2325 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 14 11 0 0 BITMAP -42 -A5 -69 -29 -31 -31 -21 -21 -21 +FFFC +0400 +0400 +7400 +8DC0 +8620 +8C20 +7420 +0420 +0440 +0400 ENDCHAR -STARTCHAR 0x0E18 -ENCODING 3608 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 9 1 0 +STARTCHAR 004B +ENCODING 2326 +SWIDTH 840 0 +DWIDTH 14 0 +BBX 14 11 0 0 BITMAP -38 -46 -F0 -0C -24 -24 -24 -24 -7C +FFFC +1020 +1020 +13A0 +B660 +E460 +44E0 +43A0 +2020 +1060 +0FA0 ENDCHAR -STARTCHAR 0x0E19 -ENCODING 3609 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 10 9 1 0 +STARTCHAR 005E +ENCODING 2327 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 12 11 0 0 BITMAP -4100 +FFF0 +2100 +2100 +2100 +2100 +2100 A100 6100 2100 -2100 -2780 -2940 -3140 -2180 +0100 +0100 ENDCHAR -STARTCHAR 0x0E1A -ENCODING 3610 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 9 1 0 +STARTCHAR 0047 +ENCODING 2328 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 13 11 0 0 BITMAP +FFF8 4080 -A080 -6080 -2080 -2080 -2080 -2080 +4080 +3C80 +3080 2080 -7F80 -ENDCHAR -STARTCHAR 0x0E1B -ENCODING 3611 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 13 1 0 -BITMAP -0080 +2180 +1E80 0080 0080 0080 -4080 -A080 -6080 -2080 -2080 -2080 -2080 -2080 -7F80 ENDCHAR -STARTCHAR 0x0E1C -ENCODING 3612 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 9 2 0 +STARTCHAR 007B +ENCODING 2329 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 13 10 0 1 BITMAP -42 -A2 -C2 -82 -92 -AA -C6 -82 -82 +FFF8 +0200 +3E00 +2000 +2020 +1E20 +8100 +8100 +4100 +3E00 ENDCHAR -STARTCHAR 0x0E1D -ENCODING 3613 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 13 2 0 +STARTCHAR 0063 +ENCODING 2330 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 13 11 0 0 BITMAP -02 -02 -02 -02 -42 -A2 -C2 -82 -92 -AA -C6 -82 -82 +FFF8 +0080 +0080 +0080 +7F80 +0880 +1080 +1180 +0E80 +0080 +0080 ENDCHAR -STARTCHAR 0x0E1E -ENCODING 3614 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 10 9 1 0 +STARTCHAR 0043 +ENCODING 2331 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 16 12 0 -1 BITMAP -4040 -A640 -6640 -2940 -2940 -30C0 -30C0 -2040 -2040 +FFFF +0020 +0020 +3870 +40C8 +4088 +3E48 +1838 +1018 +1018 +1864 +0F84 ENDCHAR -STARTCHAR 0x0E1F -ENCODING 3615 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 10 13 1 0 +STARTCHAR 006A +ENCODING 2332 +SWIDTH 840 0 +DWIDTH 14 0 +BBX 14 11 0 0 BITMAP +FFFC 0040 0040 0040 +8FC0 +8440 +4240 +4240 +2240 +1C40 0040 -4040 -A640 -6640 -2940 -2940 -30C0 -30C0 -2040 -2040 -ENDCHAR -STARTCHAR 0x0E20 -ENCODING 3616 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -1F00 -2180 -1080 -2080 -2080 -2080 -6080 -A080 -4080 -ENDCHAR -STARTCHAR 0x0E21 -ENCODING 3617 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 8 9 1 0 -BITMAP -41 -A1 -61 -21 -21 -79 -A5 -A3 -61 ENDCHAR -STARTCHAR 0x0E22 -ENCODING 3618 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 9 1 0 +STARTCHAR 004A +ENCODING 2333 +SWIDTH 900 0 +DWIDTH 15 0 +BBX 15 12 0 -1 BITMAP -62 -D2 -A2 -82 -62 -82 -82 -82 -FC +FFFE +0420 +7C20 +4020 +4020 +3FE0 +0420 +0420 +3C20 +3C20 +0420 +0200 ENDCHAR -STARTCHAR 0x0E23 -ENCODING 3619 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 9 1 0 +STARTCHAR 0057 +ENCODING 2334 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 13 11 0 0 BITMAP -38 -46 -F0 -0C -04 -04 -0C -14 -08 +FFF8 +0080 +1880 +2480 +0780 +8480 +4C80 +3880 +0080 +0080 +0080 ENDCHAR -STARTCHAR 0x0E24 -ENCODING 3620 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 14 1 -5 +STARTCHAR 0058 +ENCODING 2335 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 12 11 0 0 BITMAP -7C -86 -42 -82 -82 -82 -C2 -A2 -42 -02 -02 -02 -02 -02 +FFF0 +0200 +0200 +3E00 +6000 +C000 +8000 +8000 +8100 +4300 +3E00 ENDCHAR -STARTCHAR 0x0E25 -ENCODING 3621 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 7 9 2 0 +STARTCHAR 0059 +ENCODING 2336 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 12 11 0 0 BITMAP -7C -86 -02 -72 -8A -86 -C6 -A2 -42 +FFF0 +0200 +0200 +1E00 +3100 +6080 +4080 +4080 +4080 +2180 +1F00 ENDCHAR -STARTCHAR 0x0E26 -ENCODING 3622 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 14 1 -5 +STARTCHAR 0052 +ENCODING 2337 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 12 10 0 1 BITMAP -1F00 -2180 -1080 -2080 -2080 -2080 -6080 -A080 +FFF0 +0200 +3E00 +2000 +1000 +0E00 +8100 +8080 4080 -0080 -0080 -0080 -0080 -0080 +3F00 ENDCHAR -STARTCHAR 0x0E27 -ENCODING 3623 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 9 1 0 +STARTCHAR 005A +ENCODING 2338 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 11 11 0 0 BITMAP -7C -86 -02 -02 -02 -02 -06 -0A -04 +FFE0 +0200 +0200 +7E00 +C000 +8000 +8600 +8D00 +4900 +2900 +1E00 ENDCHAR -STARTCHAR 0x0E28 -ENCODING 3624 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 8 10 1 0 +STARTCHAR 004E +ENCODING 2339 +SWIDTH 840 0 +DWIDTH 14 0 +BBX 14 11 0 0 BITMAP -02 -7E -87 -89 -B9 -E9 -51 -41 -41 -41 +FFFC +4440 +4440 +4440 +4440 +4440 +4440 +2440 +1840 +0040 +0040 ENDCHAR -STARTCHAR 0x0E29 -ENCODING 3625 +STARTCHAR 0074 +ENCODING 2340 SWIDTH 660 0 DWIDTH 11 0 -BBX 10 9 1 0 +BBX 12 12 0 -1 BITMAP +FFF0 +0100 +0100 +0100 +7F00 +C100 +8100 +8100 4100 -A100 -6D40 -2B80 -2700 -2100 -2100 +4100 2100 -7F00 +1000 ENDCHAR -STARTCHAR 0x0E2A -ENCODING 3626 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 10 1 0 +STARTCHAR 0054 +ENCODING 2341 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 12 11 0 0 BITMAP -02 -7E -86 -0A -7A -8A -86 -E6 -92 -62 +67F0 +D100 +8900 +7900 +3100 +E100 +4100 +2100 +1F00 +0100 +0100 ENDCHAR -STARTCHAR 0x0E2B -ENCODING 3627 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 8 9 1 0 +STARTCHAR 0064 +ENCODING 2342 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 11 11 0 0 BITMAP -42 -A5 -66 -29 -29 -31 -31 -21 -21 +FFE0 +0400 +0400 +7C00 +8000 +8000 +8600 +4600 +3E00 +0200 +0100 ENDCHAR -STARTCHAR 0x0E2C -ENCODING 3628 +STARTCHAR 0044 +ENCODING 2343 SWIDTH 660 0 DWIDTH 11 0 -BBX 12 10 1 0 +BBX 12 11 0 0 BITMAP -0090 -4160 -A6C0 -6640 -2940 -2940 -30C0 -30C0 -2040 -2040 +47F0 +8100 +8100 +7900 +6100 +4100 +4300 +3D00 +0100 +0100 +0100 ENDCHAR -STARTCHAR 0x0E2D -ENCODING 3629 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 7 9 2 0 +STARTCHAR 006E +ENCODING 2344 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 12 11 0 0 BITMAP -7C -86 -02 -42 -A2 -C2 -82 -82 -FE +FFF0 +0100 +0100 +0100 +FF00 +C100 +4100 +2100 +0100 +0100 +0100 ENDCHAR -STARTCHAR 0x0E2E -ENCODING 3630 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 8 9 1 0 +STARTCHAR 006E +ENCODING 2345 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 12 11 0 0 BITMAP -7D -82 -7E -02 -42 -A2 -C2 -82 -7E +FFF0 +0100 +0100 +0100 +FF00 +C100 +4100 +2100 +0100 +0900 +0900 ENDCHAR -STARTCHAR 0x0E2F -ENCODING 3631 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 9 1 0 +STARTCHAR 0070 +ENCODING 2346 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 11 11 0 0 BITMAP -42 -A2 -C6 -8A -72 -02 -02 -06 -18 +FFE0 +4200 +4200 +4200 +4200 +4200 +4600 +3A00 +0200 +0200 +0200 ENDCHAR -STARTCHAR 0x0E30 -ENCODING 3632 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 6 9 1 0 +STARTCHAR 0050 +ENCODING 2347 +SWIDTH 840 0 +DWIDTH 14 0 +BBX 15 11 0 0 BITMAP -40 -A4 -C4 -78 -00 -40 -A4 -C4 -78 +FFFE +4200 +4200 +42E0 +4310 +4610 +3A10 +0210 +0220 +0200 +0200 ENDCHAR -STARTCHAR 0x0E31 -ENCODING 3633 -SWIDTH 0 0 -DWIDTH 0 0 -BBX 6 4 0 10 +STARTCHAR 0062 +ENCODING 2348 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 11 11 0 0 BITMAP -40 -A4 -C4 -78 +FFE0 +0200 +0200 +7A00 +E600 +9600 +8E00 +7A00 +0200 +0200 +0200 ENDCHAR -STARTCHAR 0x0E32 -ENCODING 3634 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 9 1 0 +STARTCHAR 0042 +ENCODING 2349 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 12 11 0 0 BITMAP -7C -86 -02 -02 -02 -02 -02 -02 -02 +C7F0 +A100 +9100 +7100 +1100 +FF00 +6100 +2100 +0100 +0100 +0100 ENDCHAR -STARTCHAR 0x0E33 -ENCODING 3635 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 11 15 -3 0 +STARTCHAR 006D +ENCODING 2350 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 12 11 0 0 BITMAP -4000 -A000 -A000 -4000 -0000 -0000 -07C0 -0860 -0020 +FFF0 +2100 +2100 +2100 +2100 +FF00 +6100 +2100 +0100 +0100 +0100 +ENDCHAR +STARTCHAR 0079 +ENCODING 2351 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 12 11 0 0 +BITMAP +FFF0 +1100 +1100 +2100 +C100 +8100 +4300 +3D00 +0100 +0100 +0100 +ENDCHAR +STARTCHAR 0072 +ENCODING 2352 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 11 12 0 -1 +BITMAP +FFE0 +0400 +0400 +0400 +2C00 +3800 +1000 +1000 +0800 +0800 +0400 +0200 +ENDCHAR +STARTCHAR 0072 +ENCODING 2353 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 11 12 0 -1 +BITMAP +FFE0 +0400 +0400 +0400 +2C00 +3800 +1000 +1000 +0800 +2800 +2400 +0200 +ENDCHAR +STARTCHAR 006C +ENCODING 2354 +SWIDTH 840 0 +DWIDTH 14 0 +BBX 15 11 0 0 +BITMAP +FFFE 0020 0020 0020 +78E0 +8520 +8220 +8020 +4020 +4020 +2020 +ENDCHAR +STARTCHAR 004C +ENCODING 2355 +SWIDTH 840 0 +DWIDTH 14 0 +BBX 14 11 0 0 +BITMAP +FFFC 0020 0020 0020 -ENDCHAR -STARTCHAR 0x0E34 -ENCODING 3636 -SWIDTH 0 0 -DWIDTH 0 0 -BBX 7 4 0 9 -BITMAP -38 -44 -FE -02 -ENDCHAR -STARTCHAR 0x0E35 -ENCODING 3637 -SWIDTH 0 0 -DWIDTH 0 0 -BBX 7 5 0 9 -BITMAP -02 -3A -46 -FE -02 +7860 +C490 +8108 +8208 +8308 +4498 +3870 ENDCHAR -STARTCHAR 0x0E36 -ENCODING 3638 -SWIDTH 0 0 -DWIDTH 0 0 -BBX 7 5 0 9 +STARTCHAR 004C +ENCODING 2356 +SWIDTH 840 0 +DWIDTH 14 0 +BBX 14 15 0 -4 BITMAP -06 -3A -44 -FE -02 +FFFC +0020 +0020 +0020 +7860 +C490 +8108 +8208 +8308 +4498 +3870 +0000 +0000 +0200 +0200 ENDCHAR -STARTCHAR 0x0E37 -ENCODING 3639 -SWIDTH 0 0 -DWIDTH 0 0 -BBX 7 5 0 9 +STARTCHAR 0076 +ENCODING 2357 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 11 11 0 0 BITMAP -0A -3A -46 -FE -02 +FFE0 +0200 +0200 +7A00 +8600 +8600 +8600 +7A00 +0200 +0200 +0200 ENDCHAR -STARTCHAR 0x0E38 -ENCODING 3640 -SWIDTH 0 0 -DWIDTH 0 0 -BBX 3 6 0 -7 +STARTCHAR 0053 +ENCODING 2358 +SWIDTH 840 0 +DWIDTH 14 0 +BBX 14 11 0 0 BITMAP -40 -A0 -A0 -60 -20 -20 +FFFC +1440 +2240 +2240 +2240 +1E40 +2240 +5C40 +3840 +0440 +0440 ENDCHAR -STARTCHAR 0x0E39 -ENCODING 3641 -SWIDTH 0 0 -DWIDTH 0 0 -BBX 6 6 0 -7 +STARTCHAR 005C +ENCODING 2359 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 11 11 0 0 BITMAP -44 -A4 -A4 -64 -24 -18 +FFE0 +6200 +5200 +5200 +4A00 +4A00 +2600 +1E00 +0200 +0200 +0200 ENDCHAR -STARTCHAR 0x0E3A -ENCODING 3642 -SWIDTH 0 0 -DWIDTH 0 0 -BBX 2 2 0 -3 +STARTCHAR 0073 +ENCODING 2360 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 13 12 0 -1 BITMAP -C0 -C0 +FFF8 +1080 +1080 +1080 +B180 +FE80 +4080 +4080 +2080 +2080 +1080 +0800 ENDCHAR -STARTCHAR 0x0E3F -ENCODING 3647 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 11 11 1 0 +STARTCHAR 0068 +ENCODING 2361 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 11 14 0 -3 BITMAP -3F20 -10C0 -10C0 -1140 -1280 -1F00 -1880 -1040 -3040 -5080 -BF00 +FFE0 +0200 +0200 +1E00 +2000 +1000 +1E00 +3100 +2100 +2200 +2000 +1000 +0800 +0600 ENDCHAR -STARTCHAR 0x0E40 -ENCODING 3648 -SWIDTH 240 0 -DWIDTH 4 0 -BBX 3 9 1 0 +STARTCHAR 0026 +ENCODING 2364 +SWIDTH 60 0 +DWIDTH 1 0 +BBX 1 2 0 -2 BITMAP 80 80 -80 -80 -80 -80 -C0 -A0 -40 ENDCHAR -STARTCHAR 0x0E41 -ENCODING 3649 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 9 1 0 +STARTCHAR 007C +ENCODING 2365 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 7 12 1 -1 BITMAP -88 -88 -88 -88 +3E +60 +40 +40 +20 +10 88 88 -CC -AA -44 +84 +84 +4C +38 ENDCHAR -STARTCHAR 0x0E42 -ENCODING 3650 +STARTCHAR 0061 +ENCODING 2366 SWIDTH 360 0 DWIDTH 6 0 -BBX 5 17 1 0 +BBX 6 11 0 0 BITMAP -F0 -98 +FC 40 -20 -20 -20 -20 -20 -20 -20 -20 -20 -20 -20 -30 -28 -10 +40 +40 +40 +40 +40 +40 +40 +40 +40 ENDCHAR -STARTCHAR 0x0E43 -ENCODING 3651 +STARTCHAR 0065 +ENCODING 2367 SWIDTH 360 0 DWIDTH 6 0 -BBX 5 17 1 0 +BBX 9 16 0 0 BITMAP -40 -A0 -60 -20 -20 -20 -20 -20 -20 -20 -20 -20 -20 -20 -30 -28 -10 +3C00 +4300 +4080 +4000 +4000 +FC00 +4000 +4000 +4000 +4000 +4000 +4000 +4000 +4000 +4000 +4000 ENDCHAR -STARTCHAR 0x0E44 -ENCODING 3652 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 7 17 1 0 +STARTCHAR 0069 +ENCODING 2368 +SWIDTH 300 0 +DWIDTH 5 0 +BBX 12 16 -5 0 BITMAP -18 -98 -A8 -68 -48 -08 -08 -08 -08 -08 -08 -08 -08 -08 -0C -0A -04 +7800 +8400 +8200 +8100 +0100 +03F0 +0100 +0100 +0100 +0100 +0100 +0100 +0100 +0100 +0100 +0100 ENDCHAR -STARTCHAR 0x0E45 -ENCODING 3653 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 14 1 -5 +STARTCHAR 00D8 +ENCODING 2369 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 8 4 0 -4 BITMAP -7C -86 -02 -02 -02 -02 -02 -02 -02 -02 -02 -02 -02 -02 +0E +89 +61 +1F ENDCHAR -STARTCHAR 0x0E46 -ENCODING 3654 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 13 1 -3 +STARTCHAR 00DC +ENCODING 2370 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 7 5 0 -5 BITMAP -6C -92 -C2 -A2 +E0 +98 +84 42 -02 -02 -02 -02 -02 -02 -04 -18 +30 ENDCHAR -STARTCHAR 0x0E47 -ENCODING 3655 +STARTCHAR 00E0 +ENCODING 2371 SWIDTH 0 0 DWIDTH 0 0 -BBX 6 5 0 10 +BBX 5 4 0 -4 BITMAP -04 +70 +C0 +80 78 -88 -F4 -18 ENDCHAR -STARTCHAR 0x0E48 -ENCODING 3656 +STARTCHAR 00E4 +ENCODING 2372 SWIDTH 0 0 DWIDTH 0 0 -BBX 1 3 0 10 +BBX 6 7 0 -7 BITMAP +70 80 80 +78 +80 80 +7C ENDCHAR -STARTCHAR 0x0E49 -ENCODING 3657 +STARTCHAR 00F4 +ENCODING 2373 SWIDTH 0 0 DWIDTH 0 0 -BBX 6 4 0 10 +BBX 6 3 0 13 BITMAP -40 -A4 +84 44 -F8 +38 ENDCHAR -STARTCHAR 0x0E4A -ENCODING 3658 +STARTCHAR 00F1 +ENCODING 2374 SWIDTH 0 0 DWIDTH 0 0 -BBX 9 4 0 10 +BBX 7 5 0 10 BITMAP -6C00 -9280 -D300 -D600 +80 +80 +7C +02 +02 ENDCHAR -STARTCHAR 0x0E4B -ENCODING 3659 -SWIDTH 0 0 -DWIDTH 0 0 -BBX 3 3 0 10 +STARTCHAR 00F1 +ENCODING 2375 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 7 5 0 11 BITMAP -40 E0 -40 -ENDCHAR -STARTCHAR 0x0E4C -ENCODING 3660 -SWIDTH 0 0 -DWIDTH 0 0 -BBX 4 4 0 10 -BITMAP 10 -60 -A0 -40 -ENDCHAR -STARTCHAR 0x0E4D -ENCODING 3661 -SWIDTH 0 0 -DWIDTH 0 0 -BBX 3 4 0 10 -BITMAP -40 -A0 -A0 -40 +08 +04 +02 ENDCHAR -STARTCHAR 0x0E4E -ENCODING 3662 +STARTCHAR 00F2 +ENCODING 2376 SWIDTH 0 0 DWIDTH 0 0 -BBX 3 5 0 10 -BITMAP -60 -80 -60 -80 -60 -ENDCHAR -STARTCHAR 0x0E4F -ENCODING 3663 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 8 8 1 1 -BITMAP -3C -42 -99 -BD -BD -99 -42 -3C -ENDCHAR -STARTCHAR 0x0E50 -ENCODING 3664 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 8 7 1 0 +BBX 8 6 0 11 BITMAP -3C -42 -81 -81 -81 -42 -3C +30 +18 +E4 +7A +06 +01 ENDCHAR -STARTCHAR 0x0E51 -ENCODING 3665 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 8 8 1 -1 +STARTCHAR 0061 +ENCODING 2377 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 7 15 -1 0 BITMAP -3C -42 -89 -95 -8D -C5 -79 -02 +84 +44 +38 +00 +7E +20 +20 +20 +20 +20 +20 +20 +20 +20 +20 ENDCHAR -STARTCHAR 0x0E52 -ENCODING 3666 +STARTCHAR 0061 +ENCODING 2378 SWIDTH 660 0 DWIDTH 11 0 -BBX 10 10 1 0 +BBX 11 16 -5 0 BITMAP -C000 -4000 -4000 -4D80 -5240 -5840 -5440 -4840 -4040 -3F80 +8000 +8000 +7C00 +0200 +0200 +07E0 +0200 +0200 +0200 +0200 +0200 +0200 +0200 +0200 +0200 +0200 ENDCHAR -STARTCHAR 0x0E53 -ENCODING 3667 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 7 1 0 +STARTCHAR 0061 +ENCODING 2379 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 11 16 -5 0 BITMAP -7700 -8980 -8880 -8880 -C880 -A880 -4900 +E000 +1000 +0800 +0400 +0200 +07E0 +0200 +0200 +0200 +0200 +0200 +0200 +0200 +0200 +0200 +0200 ENDCHAR -STARTCHAR 0x0E54 -ENCODING 3668 +STARTCHAR 0061 +ENCODING 2380 SWIDTH 720 0 DWIDTH 12 0 -BBX 11 11 1 0 +BBX 12 17 -6 0 BITMAP -0020 -0020 -0060 -0040 -3F80 -4000 -8800 -9400 -8C00 -4700 -3FC0 +3000 +1800 +E400 +7A00 +0600 +0100 +03F0 +0100 +0100 +0100 +0100 +0100 +0100 +0100 +0100 +0100 +0100 ENDCHAR -STARTCHAR 0x0E55 -ENCODING 3669 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 11 10 1 0 +STARTCHAR 00CE +ENCODING 2381 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 5 3 0 -3 BITMAP -0820 -1460 -1C40 -3F80 -4000 -8800 -9400 -9800 -4E00 -3FC0 +E0 +10 +08 ENDCHAR -STARTCHAR 0x0E56 -ENCODING 3670 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 11 0 0 +STARTCHAR 0021 +ENCODING 2384 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 15 13 1 -1 +BITMAP +0010 +0092 +7882 +0446 +023C +0400 +080C +1E12 +8132 +81AC +4140 +2300 +1E00 +ENDCHAR +STARTCHAR 00F1 +ENCODING 2385 +SWIDTH 60 0 +DWIDTH 1 0 +BBX 1 4 0 11 BITMAP 80 80 +80 +80 +ENDCHAR +STARTCHAR C019 +ENCODING 2386 +SWIDTH 240 0 +DWIDTH 4 0 +BBX 4 4 0 11 +BITMAP +80 40 +20 +10 +ENDCHAR +STARTCHAR C019 +ENCODING 2387 +SWIDTH 240 0 +DWIDTH 4 0 +BBX 4 4 0 11 +BITMAP +10 +20 40 -7C -46 -02 -02 -22 -54 -38 +80 ENDCHAR -STARTCHAR 0x0E57 -ENCODING 3671 +STARTCHAR 006B +ENCODING 2392 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 14 11 0 0 +BITMAP +FFFC +0400 +0400 +7400 +8DC0 +8620 +8C20 +7420 +0420 +2440 +2400 +ENDCHAR +STARTCHAR 004B +ENCODING 2393 +SWIDTH 840 0 +DWIDTH 14 0 +BBX 14 15 0 -4 +BITMAP +FFFC +1020 +1020 +13A0 +B660 +E460 +44E0 +43A0 +2020 +1060 +0FA0 +0000 +0000 +0100 +0100 +ENDCHAR +STARTCHAR 005E +ENCODING 2394 SWIDTH 720 0 DWIDTH 12 0 -BBX 11 11 1 0 +BBX 12 11 0 0 BITMAP -0020 -0040 -0040 -0040 -7640 -D940 -8940 -8140 -A140 -D280 -6300 +FFF0 +2100 +2100 +2100 +2100 +2100 +A100 +6100 +2100 +0900 +0900 ENDCHAR -STARTCHAR 0x0E58 -ENCODING 3672 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 10 10 1 0 +STARTCHAR 006A +ENCODING 2395 +SWIDTH 840 0 +DWIDTH 14 0 +BBX 14 15 0 -4 BITMAP +FFFC 0040 0040 0040 -3CC0 -4380 +8FC0 +8440 +4240 +4240 +2240 +1C40 +0040 +0000 +0000 +0200 +0200 +ENDCHAR +STARTCHAR 0052 +ENCODING 2396 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 12 15 0 -4 +BITMAP +FFF0 +0200 +3E00 +2000 +2000 +1E00 8100 -B280 -A980 -6480 -2300 +8100 +4100 +3E00 +0000 +0000 +0000 +0400 +0400 ENDCHAR -STARTCHAR 0x0E59 -ENCODING 3673 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 11 1 0 +STARTCHAR 005A +ENCODING 2397 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 11 15 0 -4 BITMAP -0100 -0080 -0080 -0080 -7280 -CD80 -8400 +FFE0 +0200 +0200 +7E00 +C000 +8000 8600 -9200 -A900 -7100 +8D00 +4900 +2900 +1E00 +0000 +0000 +0800 +0800 ENDCHAR -STARTCHAR 0x0E5A -ENCODING 3674 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 8 11 1 -2 +STARTCHAR 0050 +ENCODING 2398 +SWIDTH 840 0 +DWIDTH 14 0 +BBX 15 11 0 0 BITMAP -42 -A2 -C6 -8A -72 -02 -02 -02 -02 -01 -06 +FFFE +4200 +4200 +42C0 +4320 +4610 +3A10 +0210 +0210 +1220 +1200 ENDCHAR -STARTCHAR 0x0E5B -ENCODING 3675 -SWIDTH 840 0 -DWIDTH 14 0 -BBX 13 11 1 0 +STARTCHAR 0079 +ENCODING 2399 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 12 15 0 -4 BITMAP -6000 -9000 -A018 -8930 -8920 -8920 -8920 -8920 -8920 -D6A0 -7240 +FFF0 +1100 +1100 +2100 +C100 +8100 +4300 +3D00 +0100 +0100 +0100 +0000 +0000 +1000 +1000 ENDCHAR -STARTCHAR 0x0E81 -ENCODING 3713 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 9 1 0 +STARTCHAR 0040 +ENCODING 2400 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 17 14 0 -3 BITMAP -DC -B2 -62 -22 -22 -22 -62 -A2 -42 +FFFF80 +010000 +010000 +391000 +453800 +03F000 +030800 +0D0800 +311000 +012400 +012800 +001200 +001400 +000800 ENDCHAR -STARTCHAR 0x0E82 -ENCODING 3714 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 9 1 0 +STARTCHAR 003D +ENCODING 2401 +SWIDTH 900 0 +DWIDTH 15 0 +BBX 15 15 0 -4 BITMAP -38 -44 -C2 -A2 -42 -04 -78 -82 -7C +FFFE +0040 +0040 +0040 +78E0 +C590 +8308 +8008 +4070 +40C0 +2080 +1070 +00C0 +0080 +0078 ENDCHAR -STARTCHAR 0x0E84 -ENCODING 3716 +STARTCHAR 00E8 +ENCODING 2402 SWIDTH 480 0 DWIDTH 8 0 -BBX 7 9 1 0 +BBX 8 5 0 -5 BITMAP -7C -86 -82 -A2 -52 -A2 +6C +92 82 -B2 -72 +44 +03 ENDCHAR -STARTCHAR 0x0E87 -ENCODING 3719 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 11 1 -2 +STARTCHAR 00EC +ENCODING 2403 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 7 7 0 -7 BITMAP -7C -C6 -A2 -42 -02 -02 -02 -02 -82 -44 +6C +92 +84 +48 +06 +08 +06 +ENDCHAR +STARTCHAR 002E +ENCODING 2404 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 1 11 7 -1 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR 002F +ENCODING 2405 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 5 11 5 -1 +BITMAP +88 +88 +88 +88 +88 +88 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR 0030 +ENCODING 2406 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 6 7 0 2 +BITMAP +70 +C8 +84 +84 +84 +4C 38 ENDCHAR -STARTCHAR 0x0E88 -ENCODING 3720 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 9 1 0 +STARTCHAR 0031 +ENCODING 2407 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 5 15 1 -4 BITMAP +60 +D0 +88 +88 78 -C4 -82 -1A -2E -12 +08 +10 +20 +40 +C0 +40 +20 +10 +38 +08 +ENDCHAR +STARTCHAR 0032 +ENCODING 2408 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 8 12 1 -2 +BITMAP +FC 02 +01 +01 +61 +7E +38 +10 +08 +04 02 02 ENDCHAR -STARTCHAR 0x0E8A -ENCODING 3722 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 13 1 -4 +STARTCHAR 0033 +ENCODING 2409 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 7 13 1 -2 BITMAP -38 -44 -C2 -A2 -42 +F0 +08 +08 +08 +78 04 -38 -44 -7C 04 04 +78 +78 +08 04 02 ENDCHAR -STARTCHAR 0x0E8D -ENCODING 3725 +STARTCHAR 0034 +ENCODING 2410 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 10 10 1 1 +BITMAP +8040 +40C0 +2180 +1300 +0E00 +0C00 +1A00 +1200 +1600 +0C00 +ENDCHAR +STARTCHAR 0035 +ENCODING 2411 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 12 1 -1 +BITMAP +8000 +8000 +8600 +8600 +4600 +3C00 +0200 +0200 +0100 +0100 +0080 +0080 +ENDCHAR +STARTCHAR 0033 +ENCODING 2412 SWIDTH 480 0 DWIDTH 8 0 -BBX 7 9 1 0 +BBX 6 13 2 -2 BITMAP -72 -B2 -82 -82 -62 -82 -82 -C6 -7C +70 +80 +80 +80 +78 +40 +40 +40 +3C +3C +20 +40 +80 ENDCHAR -STARTCHAR 0x0E94 -ENCODING 3732 +STARTCHAR 0037 +ENCODING 2413 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 10 11 1 0 +BITMAP +8000 +8000 +8300 +8680 +4440 +4440 +42C0 +21C0 +2040 +1880 +0700 +ENDCHAR +STARTCHAR 0039 +ENCODING 2414 SWIDTH 480 0 DWIDTH 8 0 -BBX 7 9 1 0 +BBX 7 11 1 0 BITMAP -7C -C6 -82 -82 -82 -82 -C2 -A2 -62 +02 +04 +08 +10 +20 +40 +80 +80 +86 +4C +38 ENDCHAR -STARTCHAR 0x0E95 -ENCODING 3733 +STARTCHAR 0039 +ENCODING 2415 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 14 1 -3 +BITMAP +7000 +C800 +8800 +9800 +7000 +2000 +2000 +1000 +0800 +0400 +0200 +0100 +0380 +0100 +ENDCHAR +STARTCHAR 007D +ENCODING 2416 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 5 5 3 5 +BITMAP +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR 00A1 +ENCODING 3585 SWIDTH 480 0 DWIDTH 8 0 BBX 7 9 1 0 BITMAP -6C -92 +7C +86 +42 82 82 82 82 -C2 -A2 -42 +82 +82 ENDCHAR -STARTCHAR 0x0E96 -ENCODING 3734 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 8 13 1 -4 +STARTCHAR 00A2 +ENCODING 3586 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 8 9 1 0 BITMAP -CE -B1 -61 -21 -21 -21 -31 -29 +71 +A9 +49 11 -01 -01 -01 -01 +11 +11 +11 +11 +3F ENDCHAR -STARTCHAR 0x0E97 -ENCODING 3735 +STARTCHAR 00A3 +ENCODING 3587 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +4880 +B480 +CC80 +A880 +4880 +0880 +0880 +0880 +1F80 +ENDCHAR +STARTCHAR 00A4 +ENCODING 3588 SWIDTH 540 0 DWIDTH 9 0 BBX 8 9 1 0 BITMAP -46 -A9 -69 -49 -89 -89 -89 -89 -71 +7E +83 +81 +B1 +E9 +51 +41 +41 +41 ENDCHAR -STARTCHAR 0x0E99 -ENCODING 3737 +STARTCHAR 00A4 +ENCODING 3589 SWIDTH 540 0 DWIDTH 9 0 BBX 8 9 1 0 BITMAP +66 +99 +81 +B1 +E9 +51 41 -A1 -61 -21 -21 -21 -21 -21 -DE +41 +41 ENDCHAR -STARTCHAR 0x0E9A -ENCODING 3738 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 9 1 0 +STARTCHAR 00A6 +ENCODING 3590 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 10 9 1 0 BITMAP -42 -A2 -62 -42 -82 -82 -82 -C6 -7C +6840 +9440 +C840 +A840 +4840 +1E40 +2940 +28C0 +1840 ENDCHAR -STARTCHAR 0x0E9B -ENCODING 3739 +STARTCHAR 00A7 +ENCODING 3591 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 6 9 1 0 +BITMAP +08 +14 +0C +84 +84 +44 +24 +14 +0C +ENDCHAR +STARTCHAR 00A8 +ENCODING 3592 SWIDTH 480 0 DWIDTH 8 0 -BBX 7 13 1 0 +BBX 7 9 1 0 BITMAP +7C +86 02 +1A +2E +16 02 02 02 -42 -A2 -62 -42 -82 -82 -82 -C6 -7C ENDCHAR -STARTCHAR 0x0E9C -ENCODING 3740 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 8 9 1 0 -BITMAP -45 -AB -C6 -82 -82 -92 -92 -92 -6C +STARTCHAR 00A9 +ENCODING 3593 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +3C00 +4600 +0200 +4200 +A200 +6700 +2A80 +3280 +2100 ENDCHAR -STARTCHAR 0x0E9D -ENCODING 3741 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 13 1 0 +STARTCHAR 00AA +ENCODING 3594 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 9 1 0 BITMAP -02 -02 +7180 +AA00 +4900 +1100 +1100 +1100 +1100 +1100 +3F00 +ENDCHAR +STARTCHAR 00AB +ENCODING 3595 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 10 9 1 0 +BITMAP +48C0 +B500 +8480 +C880 +A880 +4880 +0880 +0880 +1F80 +ENDCHAR +STARTCHAR 00AC +ENCODING 3596 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 10 9 1 0 +BITMAP +7840 +8440 +4440 +8440 +8440 +8440 +CF40 +ACC0 +4840 +ENDCHAR +STARTCHAR 00AD +ENCODING 3597 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 10 13 1 -4 +BITMAP +7840 +8440 +4440 +8440 +8440 +8440 +C440 +A440 +4FC0 +0000 +0440 +0A40 +0780 +ENDCHAR +STARTCHAR 00AE +ENCODING 3598 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 14 1 -5 +BITMAP +1F00 +2080 +1080 +2080 +2080 +2080 +6080 +A080 +4080 +0480 +3C80 +4A80 +3180 +0080 +ENDCHAR +STARTCHAR 00AF +ENCODING 3599 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 14 1 -5 +BITMAP +1F00 +2080 +1080 +2080 +2080 +2080 +6080 +A080 +4080 +0480 +3880 +4A80 +3580 +0080 +ENDCHAR +STARTCHAR 00B0 +ENCODING 3600 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 8 14 1 -5 +BITMAP +1C +23 +78 +06 +1A +2E +16 02 02 +00 +16 +66 +AA +D4 +ENDCHAR +STARTCHAR 00B1 +ENCODING 3601 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 10 9 1 0 +BITMAP +5880 +A540 +CA40 +AA40 +4C40 +0C40 +0840 +0840 +0840 +ENDCHAR +STARTCHAR 00B2 +ENCODING 3602 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 12 9 1 0 +BITMAP +6610 +9910 +9110 +A910 +9910 +5110 +63D0 +6530 +6310 +ENDCHAR +STARTCHAR 00B3 +ENCODING 3603 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 12 9 1 0 +BITMAP +7840 +8440 +4440 +8440 +8440 +84E0 +C550 +A650 +4460 +ENDCHAR +STARTCHAR 00B4 +ENCODING 3604 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 8 9 1 0 +BITMAP +3E +43 +91 +A9 +99 +B1 +61 +41 +41 +ENDCHAR +STARTCHAR 00B5 +ENCODING 3605 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 8 9 1 0 +BITMAP +66 +99 +91 +A9 +99 +B1 +61 +41 +41 +ENDCHAR +STARTCHAR 00B6 +ENCODING 3606 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 7 9 1 0 +BITMAP +7C +86 42 -A2 -C2 82 -92 -92 -92 -92 -6C +82 +82 +C2 +A2 +42 ENDCHAR -STARTCHAR 0x0E9E -ENCODING 3742 +STARTCHAR 00B7 +ENCODING 3607 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 8 9 1 0 +BITMAP +42 +A5 +69 +29 +31 +31 +21 +21 +21 +ENDCHAR +STARTCHAR 00B8 +ENCODING 3608 SWIDTH 480 0 DWIDTH 8 0 BBX 7 9 1 0 BITMAP +38 +46 +F0 +0C +24 +24 +24 +24 +7C +ENDCHAR +STARTCHAR 00B9 +ENCODING 3609 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 10 9 1 0 +BITMAP +4100 +A100 +6100 +2100 +2100 +2780 +2940 +3140 +2180 +ENDCHAR +STARTCHAR 00BA +ENCODING 3610 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +4080 +A080 +6080 +2080 +2080 +2080 +2080 +2080 +7F80 +ENDCHAR +STARTCHAR 00BB +ENCODING 3611 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 13 1 0 +BITMAP +0080 +0080 +0080 +0080 +4080 +A080 +6080 +2080 +2080 +2080 +2080 +2080 +7F80 +ENDCHAR +STARTCHAR 00BC +ENCODING 3612 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 7 9 2 0 +BITMAP 42 A2 -62 -42 +C2 82 92 -92 -92 -6C +AA +C6 +82 +82 ENDCHAR -STARTCHAR 0x0E9F -ENCODING 3743 +STARTCHAR 00BD +ENCODING 3613 SWIDTH 480 0 DWIDTH 8 0 -BBX 7 13 1 0 +BBX 7 13 2 0 BITMAP 02 02 @@ -26255,462 +26404,614 @@ 02 42 A2 -62 -42 +C2 82 -92 -92 92 -6C +AA +C6 +82 +82 ENDCHAR -STARTCHAR 0x0EA1 -ENCODING 3745 +STARTCHAR 00BE +ENCODING 3614 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 10 9 1 0 +BITMAP +4040 +A640 +6640 +2940 +2940 +30C0 +30C0 +2040 +2040 +ENDCHAR +STARTCHAR 00BF +ENCODING 3615 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 10 13 1 0 +BITMAP +0040 +0040 +0040 +0040 +4040 +A640 +6640 +2940 +2940 +30C0 +30C0 +2040 +2040 +ENDCHAR +STARTCHAR 00C0 +ENCODING 3616 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +1F00 +2180 +1080 +2080 +2080 +2080 +6080 +A080 +4080 +ENDCHAR +STARTCHAR 00C1 +ENCODING 3617 SWIDTH 540 0 DWIDTH 9 0 BBX 8 9 1 0 BITMAP +41 +A1 61 21 -21 -21 21 -21 +79 +A5 +A3 61 -B1 -4E ENDCHAR -STARTCHAR 0x0EA2 -ENCODING 3746 +STARTCHAR 00C2 +ENCODING 3618 SWIDTH 480 0 DWIDTH 8 0 -BBX 7 13 1 0 +BBX 7 9 1 0 BITMAP -02 -02 -02 -02 -72 -B2 -82 +62 +D2 +A2 82 62 82 82 -C6 -7C +82 +FC ENDCHAR -STARTCHAR 0x0EA3 -ENCODING 3747 +STARTCHAR 00C3 +ENCODING 3619 SWIDTH 480 0 DWIDTH 8 0 BBX 7 9 1 0 BITMAP -78 -84 -82 -C0 -3C -42 -A2 -C6 -7C +38 +46 +F0 +0C +04 +04 +0C +14 +08 ENDCHAR -STARTCHAR 0x0EA5 -ENCODING 3749 +STARTCHAR 00C4 +ENCODING 3620 SWIDTH 480 0 DWIDTH 8 0 -BBX 7 9 1 0 +BBX 7 14 1 -5 BITMAP 7C 86 +42 +82 82 +82 +C2 +A2 +42 +02 +02 02 02 +02 +ENDCHAR +STARTCHAR 00C5 +ENCODING 3621 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 7 9 2 0 +BITMAP +7C +86 +02 72 -CA -AA -44 +8A +86 +C6 +A2 +42 ENDCHAR -STARTCHAR 0x0EA7 -ENCODING 3751 +STARTCHAR 00C6 +ENCODING 3622 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 14 1 -5 +BITMAP +1F00 +2180 +1080 +2080 +2080 +2080 +6080 +A080 +4080 +0080 +0080 +0080 +0080 +0080 +ENDCHAR +STARTCHAR 00C7 +ENCODING 3623 SWIDTH 480 0 DWIDTH 8 0 BBX 7 9 1 0 BITMAP 7C 86 -82 02 02 -42 -A2 -C2 -7C +02 +02 +06 +0A +04 ENDCHAR -STARTCHAR 0x0EAA -ENCODING 3754 +STARTCHAR 00A4 +ENCODING 3624 SWIDTH 540 0 DWIDTH 9 0 -BBX 8 9 1 0 +BBX 8 10 1 0 BITMAP -79 -86 -86 -7A 02 -72 -CA -AA -44 +7E +87 +89 +B9 +E9 +51 +41 +41 +41 ENDCHAR -STARTCHAR 0x0EAB -ENCODING 3755 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 11 9 1 0 +STARTCHAR 00C9 +ENCODING 3625 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 10 9 1 0 BITMAP -4DC0 -AB20 -6620 -4220 -8220 -8220 -8220 -C620 -7C20 +4100 +A100 +6D40 +2B80 +2700 +2100 +2100 +2100 +7F00 ENDCHAR -STARTCHAR 0x0EAD -ENCODING 3757 +STARTCHAR 00CA +ENCODING 3626 SWIDTH 480 0 DWIDTH 8 0 -BBX 7 9 1 0 +BBX 7 10 1 0 BITMAP -7C -86 +02 +7E 86 +0A 7A +8A +86 +E6 +92 +62 +ENDCHAR +STARTCHAR 00CB +ENCODING 3627 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 8 9 1 0 +BITMAP +42 +A5 +66 +29 +29 +31 +31 +21 +21 +ENDCHAR +STARTCHAR 00CC +ENCODING 3628 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 12 10 1 0 +BITMAP +0090 +4160 +A6C0 +6640 +2940 +2940 +30C0 +30C0 +2040 +2040 +ENDCHAR +STARTCHAR 00CD +ENCODING 3629 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 7 9 2 0 +BITMAP +7C +86 02 42 A2 C2 -7C +82 +82 +FE ENDCHAR -STARTCHAR 0x0EAE -ENCODING 3758 +STARTCHAR 00CE +ENCODING 3630 SWIDTH 540 0 DWIDTH 9 0 BBX 8 9 1 0 BITMAP -78 -85 +7D 82 -C0 -3C +7E +02 42 A2 -C6 -7C +C2 +82 +7E ENDCHAR -STARTCHAR 0x0EAF -ENCODING 3759 +STARTCHAR 00CF +ENCODING 3631 SWIDTH 480 0 DWIDTH 8 0 -BBX 7 15 1 -4 +BBX 7 9 1 0 BITMAP 42 -A6 -CA +A2 +C6 +8A 72 02 -02 -02 -02 02 -02 -02 -82 -82 -46 -3C +06 +18 ENDCHAR -STARTCHAR 0x0EB0 -ENCODING 3760 +STARTCHAR 00D0 +ENCODING 3632 SWIDTH 420 0 DWIDTH 7 0 -BBX 6 7 1 1 +BBX 6 9 1 0 BITMAP 40 A4 -7C +C4 +78 00 40 A4 -7C +C4 +78 ENDCHAR -STARTCHAR 0x0EB1 -ENCODING 3761 +STARTCHAR 00D1 +ENCODING 3633 SWIDTH 0 0 DWIDTH 0 0 -BBX 8 4 0 10 +BBX 6 4 0 10 BITMAP 40 -A1 -C1 -7E +A4 +C4 +78 ENDCHAR -STARTCHAR 0x0EB2 -ENCODING 3762 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 6 9 1 0 +STARTCHAR 00D2 +ENCODING 3634 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 7 9 1 0 BITMAP -78 -C4 -A4 -44 -04 -04 -04 -04 -04 +7C +86 +02 +02 +02 +02 +02 +02 +02 ENDCHAR -STARTCHAR 0x0EB3 -ENCODING 3763 +STARTCHAR 00D3 +ENCODING 3635 SWIDTH 480 0 DWIDTH 8 0 -BBX 11 14 -4 0 +BBX 11 15 -3 0 BITMAP 4000 A000 A000 4000 0000 -03C0 -0620 -0520 -0220 +0000 +07C0 +0860 +0020 0020 0020 0020 0020 0020 +0020 ENDCHAR -STARTCHAR 0x0EB4 -ENCODING 3764 +STARTCHAR 00D4 +ENCODING 3636 SWIDTH 0 0 DWIDTH 0 0 -BBX 8 5 0 10 +BBX 7 4 0 9 BITMAP -7E -C3 -81 -81 -42 +38 +44 +FE +02 ENDCHAR -STARTCHAR 0x0EB5 -ENCODING 3765 +STARTCHAR 00D5 +ENCODING 3637 SWIDTH 0 0 DWIDTH 0 0 -BBX 10 5 0 10 +BBX 7 5 0 9 BITMAP -7E00 -C300 -8100 -8140 -4380 +02 +3A +46 +FE +02 ENDCHAR -STARTCHAR 0x0EB6 -ENCODING 3766 +STARTCHAR 00D6 +ENCODING 3638 SWIDTH 0 0 DWIDTH 0 0 -BBX 8 5 0 10 +BBX 7 5 0 9 BITMAP -7E -C3 -99 -99 -42 +06 +3A +44 +FE +02 ENDCHAR -STARTCHAR 0x0EB7 -ENCODING 3767 +STARTCHAR 00D7 +ENCODING 3639 SWIDTH 0 0 DWIDTH 0 0 -BBX 10 5 0 10 +BBX 7 5 0 9 BITMAP -7E00 -C300 -9900 -9940 -4380 +0A +3A +46 +FE +02 ENDCHAR -STARTCHAR 0x0EB8 -ENCODING 3768 +STARTCHAR 00D8 +ENCODING 3640 SWIDTH 0 0 DWIDTH 0 0 -BBX 3 5 0 -5 +BBX 3 6 0 -7 BITMAP 40 A0 +A0 60 20 -40 -ENDCHAR -STARTCHAR 0x0EB9 -ENCODING 3769 -SWIDTH 0 0 -DWIDTH 0 0 -BBX 4 5 0 -5 -BITMAP -D0 -D0 -90 -90 -60 +20 ENDCHAR -STARTCHAR 0x0EBB -ENCODING 3771 +STARTCHAR 00D9 +ENCODING 3641 SWIDTH 0 0 DWIDTH 0 0 -BBX 8 4 0 10 +BBX 6 6 0 -7 BITMAP -7E -C1 -A1 -40 +44 +A4 +A4 +64 +24 +18 ENDCHAR -STARTCHAR 0x0EBC -ENCODING 3772 +STARTCHAR char3642 +ENCODING 3642 SWIDTH 0 0 DWIDTH 0 0 -BBX 6 3 0 -3 +BBX 2 2 0 -3 BITMAP -70 -AC -40 +C0 +C0 ENDCHAR -STARTCHAR 0x0EBD -ENCODING 3773 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 13 1 -2 +STARTCHAR C066 +ENCODING 3647 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 11 11 1 0 BITMAP -60 -5C -40 -30 -08 -04 -62 -D2 -A2 -82 -82 -C6 -7C +3F20 +10C0 +10C0 +1140 +1280 +1F00 +1880 +1040 +3040 +5080 +BF00 ENDCHAR -STARTCHAR 0x0EC0 -ENCODING 3776 -SWIDTH 360 0 -DWIDTH 6 0 -BBX 5 9 1 0 +STARTCHAR 00E0 +ENCODING 3648 +SWIDTH 240 0 +DWIDTH 4 0 +BBX 3 9 1 0 BITMAP -70 80 80 80 80 80 -90 -A8 -70 -ENDCHAR -STARTCHAR 0x0EC1 -ENCODING 3777 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 10 9 1 0 -BITMAP -7380 -8400 -8400 -8400 -8400 -8400 -9480 -AD40 -7380 +80 +C0 +A0 +40 ENDCHAR -STARTCHAR 0x0EC2 -ENCODING 3778 +STARTCHAR 00E1 +ENCODING 3649 SWIDTH 480 0 DWIDTH 8 0 -BBX 7 15 1 0 +BBX 7 9 1 0 BITMAP -60 -90 88 +88 +88 +88 +88 +88 +CC +AA 44 -22 +ENDCHAR +STARTCHAR 00E2 +ENCODING 3650 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 17 1 0 +BITMAP +F0 +98 +40 +20 +20 +20 +20 +20 +20 +20 +20 +20 +20 +20 +30 +28 +10 +ENDCHAR +STARTCHAR 00E3 +ENCODING 3651 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 17 1 0 +BITMAP +40 +A0 +60 +20 +20 +20 +20 +20 +20 +20 +20 +20 +20 +20 +30 +28 10 +ENDCHAR +STARTCHAR 00E4 +ENCODING 3652 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 7 17 1 0 +BITMAP +18 +98 +A8 +68 +48 08 08 08 08 08 08 +08 +08 +08 0C 0A 04 -ENDCHAR -STARTCHAR 0x0EC3 -ENCODING 3779 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 15 0 0 -BITMAP -38 -44 -82 -82 -82 -4C -10 -10 -10 -10 -10 -10 -18 -14 -08 ENDCHAR -STARTCHAR 0x0EC4 -ENCODING 3780 +STARTCHAR 00E5 +ENCODING 3653 SWIDTH 480 0 DWIDTH 8 0 -BBX 7 15 0 0 +BBX 7 14 1 -5 BITMAP -C0 -40 -40 -40 -58 -68 -08 -10 -10 -10 -10 -10 -14 -1A -0C +7C +86 +02 +02 +02 +02 +02 +02 +02 +02 +02 +02 +02 +02 ENDCHAR -STARTCHAR 0x0EC6 -ENCODING 3782 +STARTCHAR 00E6 +ENCODING 3654 SWIDTH 480 0 DWIDTH 8 0 -BBX 7 15 1 -4 +BBX 7 13 1 -3 BITMAP 6C 92 @@ -26723,13 +27024,23 @@ 02 02 02 -82 -82 -46 -3C +04 +18 ENDCHAR -STARTCHAR 0x0EC8 -ENCODING 3784 +STARTCHAR 00E7 +ENCODING 3655 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 6 5 0 10 +BITMAP +04 +78 +88 +F4 +18 +ENDCHAR +STARTCHAR char3656 +ENCODING 3656 SWIDTH 0 0 DWIDTH 0 0 BBX 1 3 0 10 @@ -26738,30 +27049,30 @@ 80 80 ENDCHAR -STARTCHAR 0x0EC9 -ENCODING 3785 +STARTCHAR 00E9 +ENCODING 3657 SWIDTH 0 0 DWIDTH 0 0 BBX 6 4 0 10 BITMAP 40 -A0 +A4 44 -FC +F8 ENDCHAR -STARTCHAR 0x0ECA -ENCODING 3786 +STARTCHAR 00EA +ENCODING 3658 SWIDTH 0 0 DWIDTH 0 0 -BBX 8 4 0 9 +BBX 9 4 0 10 BITMAP -6C -92 -C3 -C6 +6C00 +9280 +D300 +D600 ENDCHAR -STARTCHAR 0x0ECB -ENCODING 3787 +STARTCHAR 00EB +ENCODING 3659 SWIDTH 0 0 DWIDTH 0 0 BBX 3 3 0 10 @@ -26770,19 +27081,19 @@ E0 40 ENDCHAR -STARTCHAR 0x0ECC -ENCODING 3788 +STARTCHAR 00EC +ENCODING 3660 SWIDTH 0 0 DWIDTH 0 0 -BBX 6 4 0 10 +BBX 4 4 0 10 BITMAP -04 -78 +10 +60 A0 40 ENDCHAR -STARTCHAR 0x0ECD -ENCODING 3789 +STARTCHAR 00ED +ENCODING 3661 SWIDTH 0 0 DWIDTH 0 0 BBX 3 4 0 10 @@ -26792,2820 +27103,2982 @@ A0 40 ENDCHAR -STARTCHAR 0x0ED0 -ENCODING 3792 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 9 1 0 +STARTCHAR 00EE +ENCODING 3662 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 3 5 0 10 BITMAP -38 -44 -82 -82 -82 -82 -82 -44 -38 +60 +80 +60 +80 +60 ENDCHAR -STARTCHAR 0x0ED1 -ENCODING 3793 +STARTCHAR 00EF +ENCODING 3663 SWIDTH 540 0 DWIDTH 9 0 -BBX 8 10 1 -1 +BBX 8 8 1 1 BITMAP 3C 42 -81 -81 -91 -A9 -72 -02 -1C -20 -ENDCHAR -STARTCHAR 0x0ED2 -ENCODING 3794 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 13 1 0 -BITMAP -02 -02 -02 -04 -18 -20 -40 -80 -8C -96 -8A +99 +BD +BD +99 42 3C -ENDCHAR -STARTCHAR 0x0ED3 -ENCODING 3795 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 13 1 0 -BITMAP -02 -3C -30 -0C -22 -52 -52 -52 -52 -52 -62 -B2 -6C ENDCHAR -STARTCHAR 0x0ED4 -ENCODING 3796 +STARTCHAR 00F0 +ENCODING 3664 SWIDTH 540 0 DWIDTH 9 0 -BBX 8 13 1 0 +BBX 8 7 1 0 BITMAP -01 -01 -7E -80 -82 -85 -86 -84 -84 -84 -84 -84 -7B +3C +42 +81 +81 +81 +42 +3C ENDCHAR -STARTCHAR 0x0ED5 -ENCODING 3797 +STARTCHAR 00F1 +ENCODING 3665 SWIDTH 540 0 DWIDTH 9 0 -BBX 8 13 1 0 -BITMAP -11 -29 -3E -40 -82 -85 -86 -84 -84 -84 -84 -84 -7B -ENDCHAR -STARTCHAR 0x0ED6 -ENCODING 3798 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 13 1 0 +BBX 8 8 1 -1 BITMAP -02 3C -30 -0C -42 -A2 -C2 -82 -82 -82 -92 -92 -6C -ENDCHAR -STARTCHAR 0x0ED7 -ENCODING 3799 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 13 1 -4 -BITMAP -CC -B2 -62 -22 -22 -22 -62 -A2 42 -02 -02 -02 +89 +95 +8D +C5 +79 02 ENDCHAR -STARTCHAR 0x0ED8 -ENCODING 3800 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 9 13 1 -4 +STARTCHAR 00F2 +ENCODING 3666 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 10 10 1 0 BITMAP -CC00 -B200 -6200 -2200 -2200 -2200 -6200 -A200 -4200 -0F80 -1300 -1680 -0900 +C000 +4000 +4000 +4D80 +5240 +5840 +5440 +4840 +4040 +3F80 ENDCHAR -STARTCHAR 0x0ED9 -ENCODING 3801 +STARTCHAR 00F3 +ENCODING 3667 SWIDTH 600 0 DWIDTH 10 0 -BBX 9 9 1 0 +BBX 9 7 1 0 BITMAP -7080 -8880 -8880 -8880 +7700 +8980 8880 8880 C880 A880 -4700 +4900 ENDCHAR -STARTCHAR 0x0EDC -ENCODING 3804 -SWIDTH 960 0 -DWIDTH 16 0 -BBX 15 9 1 0 +STARTCHAR 00F4 +ENCODING 3668 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 11 11 1 0 BITMAP -4DC2 -AB22 -6622 -4222 -8222 -8222 -8222 -C622 -7CDC +0020 +0020 +0060 +0040 +3F80 +4000 +8800 +9400 +8C00 +4700 +3FC0 ENDCHAR -STARTCHAR 0x0EDD -ENCODING 3805 -SWIDTH 960 0 -DWIDTH 16 0 -BBX 15 9 1 0 +STARTCHAR 00F5 +ENCODING 3669 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 11 10 1 0 BITMAP -4DC2 -AA22 -6622 -4222 -8222 -8222 -8262 -C6B6 -7C4C +0820 +1460 +1C40 +3F80 +4000 +8800 +9400 +9800 +4E00 +3FC0 ENDCHAR -STARTCHAR 0x10A0 -ENCODING 4256 +STARTCHAR 00F6 +ENCODING 3670 SWIDTH 480 0 DWIDTH 8 0 -BBX 7 11 1 0 +BBX 7 11 0 0 BITMAP -DC -66 -00 -E0 -40 +80 +80 40 40 -78 -04 -04 -0E +7C +46 +02 +02 +22 +54 +38 ENDCHAR -STARTCHAR 0x10A1 -ENCODING 4257 +STARTCHAR 00F7 +ENCODING 3671 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 11 11 1 0 +BITMAP +0020 +0040 +0040 +0040 +7640 +D940 +8940 +8140 +A140 +D280 +6300 +ENDCHAR +STARTCHAR 00F8 +ENCODING 3672 SWIDTH 660 0 DWIDTH 11 0 -BBX 10 11 1 0 +BBX 10 10 1 0 BITMAP -EE00 -4400 -4400 -4400 -3C00 -0400 -0400 -0F00 +0040 +0040 +0040 +3CC0 +4380 +8100 +B280 +A980 +6480 +2300 +ENDCHAR +STARTCHAR 00F9 +ENCODING 3673 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 11 1 0 +BITMAP +0100 0080 0080 -01C0 +0080 +7280 +CD80 +8400 +8600 +9200 +A900 +7100 ENDCHAR -STARTCHAR 0x10A2 -ENCODING 4258 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 11 11 1 0 +STARTCHAR 00CF +ENCODING 3674 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 8 11 1 -2 BITMAP -FE00 -4400 -4400 -E400 -0400 -0400 -0E00 -0100 -0380 -0040 -00E0 +42 +A2 +C6 +8A +72 +02 +02 +02 +02 +01 +06 ENDCHAR -STARTCHAR 0x10A3 -ENCODING 4259 +STARTCHAR char3675 +ENCODING 3675 +SWIDTH 840 0 +DWIDTH 14 0 +BBX 13 11 1 0 +BITMAP +6000 +9000 +A018 +8930 +8920 +8920 +8920 +8920 +8920 +D6A0 +7240 +ENDCHAR +STARTCHAR 0064 +ENCODING 3713 SWIDTH 480 0 DWIDTH 8 0 -BBX 7 11 1 0 +BBX 7 9 1 0 BITMAP -FE -92 -10 -10 +DC +B2 +62 +22 +22 +22 +62 +A2 +42 +ENDCHAR +STARTCHAR 0030 +ENCODING 3714 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 7 9 1 0 +BITMAP 38 44 +C2 +A2 +42 +04 +78 +82 +7C +ENDCHAR +STARTCHAR 0037 +ENCODING 3716 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 7 9 1 0 +BITMAP +7C +86 82 +A2 +52 +A2 82 +B2 +72 +ENDCHAR +STARTCHAR 0043 +ENCODING 3719 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 7 11 1 -2 +BITMAP +7C +C6 +A2 +42 +02 +02 +02 +02 82 44 38 ENDCHAR -STARTCHAR 0x10A4 -ENCODING 4260 +STARTCHAR 0039 +ENCODING 3720 SWIDTH 480 0 DWIDTH 8 0 -BBX 7 11 1 0 +BBX 7 9 1 0 BITMAP -FE -44 +78 +C4 +82 +1A +2E +12 +02 +02 +02 +ENDCHAR +STARTCHAR 002D +ENCODING 3722 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 7 13 1 -4 +BITMAP +38 44 -E4 -04 -04 +C2 +A2 +42 04 +38 +44 +7C 04 04 04 -0E -ENDCHAR -STARTCHAR 0x10A5 -ENCODING 4261 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 11 11 1 0 -BITMAP -FE00 -4400 -4400 -E400 -0400 -07C0 -0440 -04E0 -0400 -0400 -0E00 +02 ENDCHAR -STARTCHAR 0x10A6 -ENCODING 4262 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 11 1 0 +STARTCHAR 0070 +ENCODING 3725 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 7 9 1 0 BITMAP -E000 -4000 -3C00 -0800 -0800 -0F00 -0880 -0880 -0880 -0880 -0700 -ENDCHAR -STARTCHAR 0x10A7 -ENCODING 4263 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 11 11 1 0 -BITMAP -1E00 -6400 -4400 -8400 -8580 -8640 -8440 -84E0 -4400 -6400 -1E00 -ENDCHAR -STARTCHAR 0x10A8 -ENCODING 4264 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 6 11 1 0 -BITMAP -E0 -40 -3C -08 -08 -08 -08 -08 -08 -08 -1C +72 +B2 +82 +82 +62 +82 +82 +C6 +7C ENDCHAR -STARTCHAR 0x10A9 -ENCODING 4265 +STARTCHAR 0066 +ENCODING 3732 SWIDTH 480 0 DWIDTH 8 0 -BBX 7 11 1 0 -BITMAP -E0 -40 -40 -40 -78 -44 -44 -3C -04 -04 -0E -ENDCHAR -STARTCHAR 0x10AA -ENCODING 4266 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 11 1 0 -BITMAP -FC00 -4800 -4800 -4800 -4800 -E800 -0F00 -0880 -0880 -0880 -0700 -ENDCHAR -STARTCHAR 0x10AB -ENCODING 4267 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 10 11 1 0 +BBX 7 9 1 0 BITMAP -E000 -4000 -3C00 -0800 -0800 -0800 -7F80 -8880 -8880 -8880 -71C0 +7C +C6 +82 +82 +82 +82 +C2 +A2 +62 ENDCHAR -STARTCHAR 0x10AC -ENCODING 4268 +STARTCHAR 0038 +ENCODING 3733 SWIDTH 480 0 DWIDTH 8 0 -BBX 7 11 1 0 +BBX 7 9 1 0 BITMAP -FC -44 -44 -4E -40 -78 -44 -44 -44 -44 -EE +6C +92 +82 +82 +82 +82 +C2 +A2 +42 ENDCHAR -STARTCHAR 0x10AD -ENCODING 4269 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 11 11 1 0 +STARTCHAR 0034 +ENCODING 3734 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 8 13 1 -4 BITMAP -1000 -6C00 -4400 -8200 -8200 -8200 -8200 -82E0 -4440 -6C40 -1380 +CE +B1 +61 +21 +21 +21 +31 +29 +11 +01 +01 +01 +01 ENDCHAR -STARTCHAR 0x10AE -ENCODING 4270 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 10 11 1 0 +STARTCHAR 006D +ENCODING 3735 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 8 9 1 0 BITMAP -E000 -4000 -4000 -3DC0 -0880 -0880 -0880 -0880 -0880 -0880 -0700 +46 +A9 +69 +49 +89 +89 +89 +89 +71 ENDCHAR -STARTCHAR 0x10AF -ENCODING 4271 +STARTCHAR 006F +ENCODING 3737 SWIDTH 540 0 DWIDTH 9 0 -BBX 8 11 1 0 +BBX 8 9 1 0 BITMAP -E7 +41 +A1 +61 +21 +21 +21 +21 +21 +DE +ENDCHAR +STARTCHAR 005B +ENCODING 3738 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 7 9 1 0 +BITMAP 42 +A2 +62 42 -32 -22 -1E +82 +82 +82 +C6 +7C +ENDCHAR +STARTCHAR 005B +ENCODING 3739 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 7 13 1 0 +BITMAP 02 02 02 02 -07 -ENDCHAR -STARTCHAR 0x10B0 -ENCODING 4272 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 11 1 0 -BITMAP -1C00 -0800 -0800 -0800 -0800 -2E00 -4900 -8900 -8B80 -8800 -7000 +42 +A2 +62 +42 +82 +82 +82 +C6 +7C ENDCHAR -STARTCHAR 0x10B1 -ENCODING 4273 -SWIDTH 360 0 -DWIDTH 6 0 -BBX 6 11 1 0 +STARTCHAR 007A +ENCODING 3740 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 8 9 1 0 BITMAP -E0 -40 -40 -40 -40 -50 -48 -44 -44 -44 -38 +45 +AB +C6 +82 +82 +92 +92 +92 +6C ENDCHAR -STARTCHAR 0x10B2 -ENCODING 4274 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 6 11 1 0 +STARTCHAR 002F +ENCODING 3741 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 7 13 1 0 BITMAP -F8 -44 -44 -44 -78 -40 -40 -F0 -08 -08 -1C +02 +02 +02 +02 +42 +A2 +C2 +82 +92 +92 +92 +92 +6C ENDCHAR -STARTCHAR 0x10B3 -ENCODING 4275 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 11 11 1 0 +STARTCHAR 0072 +ENCODING 3742 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 7 9 1 0 BITMAP -1000 -6C00 -4400 -8200 -8200 -8200 -8200 -8380 -4440 -6C40 -10E0 +42 +A2 +62 +42 +82 +92 +92 +92 +6C ENDCHAR -STARTCHAR 0x10B4 -ENCODING 4276 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 11 1 0 +STARTCHAR 0032 +ENCODING 3743 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 7 13 1 0 BITMAP -7F00 -8880 -8880 -8880 -7F00 -0800 -0800 -0800 -0800 -0800 -1C00 +02 +02 +02 +02 +42 +A2 +62 +42 +82 +92 +92 +92 +6C ENDCHAR -STARTCHAR 0x10B5 -ENCODING 4277 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 11 1 0 +STARTCHAR 002C +ENCODING 3745 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 8 9 1 0 BITMAP -1C00 -0800 -0800 -EA00 -4D00 -5900 -2B80 -0800 -0800 -0800 -1C00 +61 +21 +21 +21 +21 +21 +61 +B1 +4E ENDCHAR -STARTCHAR 0x10B6 -ENCODING 4278 +STARTCHAR 0070 +ENCODING 3746 SWIDTH 480 0 DWIDTH 8 0 -BBX 7 11 1 0 +BBX 7 13 1 0 BITMAP -38 -44 -44 -44 -44 -44 -44 -44 -44 -44 -EE +02 +02 +02 +02 +72 +B2 +82 +82 +62 +82 +82 +C6 +7C ENDCHAR -STARTCHAR 0x10B7 -ENCODING 4279 +STARTCHAR 0069 +ENCODING 3747 SWIDTH 480 0 DWIDTH 8 0 -BBX 7 11 1 0 +BBX 7 9 1 0 BITMAP -EE -44 -44 -44 +78 +84 +82 +C0 3C -04 -04 -04 -04 -04 -0E +42 +A2 +C6 +7C ENDCHAR -STARTCHAR 0x10B8 -ENCODING 4280 +STARTCHAR 005D +ENCODING 3749 SWIDTH 480 0 DWIDTH 8 0 -BBX 7 11 1 0 +BBX 7 9 1 0 BITMAP -EE -44 -44 -44 -3C -04 -04 -64 -44 +7C +86 +82 +02 +02 +72 +CA +AA 44 -38 ENDCHAR -STARTCHAR 0x10B9 -ENCODING 4281 +STARTCHAR 003B +ENCODING 3751 SWIDTH 480 0 DWIDTH 8 0 -BBX 7 11 1 0 +BBX 7 9 1 0 BITMAP -E0 -40 -40 -58 -64 -44 -4E -40 -40 -40 -E0 +7C +86 +82 +02 +02 +42 +A2 +C2 +7C ENDCHAR -STARTCHAR 0x10BA -ENCODING 4282 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 11 11 1 0 +STARTCHAR 006C +ENCODING 3754 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 8 9 1 0 BITMAP -1C00 -6200 -4200 -8700 -8000 -8000 -87C0 -8240 -4240 -62E0 -1C00 +79 +86 +86 +7A +02 +72 +CA +AA +44 ENDCHAR -STARTCHAR 0x10BB -ENCODING 4283 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 10 11 1 0 +STARTCHAR 0073 +ENCODING 3755 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 11 9 1 0 BITMAP -1C00 -0800 -0800 -0800 -0800 -0800 -7F80 -8880 -8880 -8880 -71C0 +4DC0 +AB20 +6620 +4220 +8220 +8220 +8220 +C620 +7C20 ENDCHAR -STARTCHAR 0x10BC -ENCODING 4284 +STARTCHAR 0076 +ENCODING 3757 SWIDTH 480 0 DWIDTH 8 0 -BBX 7 11 1 0 +BBX 7 9 1 0 BITMAP -F8 -44 -44 -78 -40 -78 -44 -44 -4E -40 -E0 +7C +86 +86 +7A +02 +42 +A2 +C2 +7C ENDCHAR -STARTCHAR 0x10BD -ENCODING 4285 +STARTCHAR 0049 +ENCODING 3758 SWIDTH 540 0 DWIDTH 9 0 -BBX 8 11 1 0 +BBX 8 9 1 0 BITMAP -FE -42 +78 +85 +82 +C0 +3C 42 -47 -40 +A2 +C6 7C -02 -E1 -41 -42 -3C ENDCHAR -STARTCHAR 0x10BE -ENCODING 4286 +STARTCHAR 004D +ENCODING 3759 SWIDTH 480 0 DWIDTH 8 0 -BBX 7 11 1 0 -BITMAP -EE -44 -44 -4C -70 -40 -40 -40 -78 -04 -0E -ENDCHAR -STARTCHAR 0x10BF -ENCODING 4287 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 11 1 0 -BITMAP -E000 -4000 -4000 -3F00 -0880 -0880 -0F00 -3800 -4800 -4800 -FC00 -ENDCHAR -STARTCHAR 0x10C0 -ENCODING 4288 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 11 1 0 +BBX 7 15 1 -4 BITMAP -FC00 -4800 -4800 -4800 -4800 -E800 -0B00 -0880 -0880 -0880 -0700 +42 +A6 +CA +72 +02 +02 +02 +02 +02 +02 +02 +82 +82 +46 +3C ENDCHAR -STARTCHAR 0x10C1 -ENCODING 4289 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 11 1 0 +STARTCHAR 0074 +ENCODING 3760 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 6 7 1 1 BITMAP -FE -42 -40 -58 -64 -44 -4E 40 -40 +A4 +7C +00 40 -E0 +A4 +7C ENDCHAR -STARTCHAR 0x10C2 -ENCODING 4290 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 8 11 1 0 +STARTCHAR 0061 +ENCODING 3761 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 8 4 0 10 BITMAP -70 -20 -20 -10 -0C -02 -01 -E1 -41 -42 -3C +40 +A1 +C1 +7E ENDCHAR -STARTCHAR 0x10C3 -ENCODING 4291 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 11 1 0 +STARTCHAR 006B +ENCODING 3762 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 6 9 1 0 BITMAP -0E +78 +C4 +A4 +44 04 04 -E4 -44 -44 -44 -3C 04 04 -0E +04 ENDCHAR -STARTCHAR 0x10C4 -ENCODING 4292 +STARTCHAR 0065 +ENCODING 3763 SWIDTH 480 0 DWIDTH 8 0 -BBX 7 11 1 0 +BBX 11 14 -4 0 BITMAP -EE -44 -44 +4000 +A000 +A000 +4000 +0000 +03C0 +0620 +0520 +0220 +0020 +0020 +0020 +0020 +0020 +ENDCHAR +STARTCHAR 0079 +ENCODING 3764 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 7 5 0 10 +BITMAP +7C +C6 +82 +82 44 +ENDCHAR +STARTCHAR 0075 +ENCODING 3765 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 9 5 0 10 +BITMAP +7C00 +C600 +8200 +8280 +4700 +ENDCHAR +STARTCHAR 0079 +ENCODING 3766 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 7 5 0 10 +BITMAP +7C +C6 +92 +92 44 -FE -10 -10 -10 -10 -38 ENDCHAR -STARTCHAR 0x10C5 -ENCODING 4293 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 10 11 1 0 +STARTCHAR 0075 +ENCODING 3767 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 9 5 0 10 BITMAP -1F00 -0880 -0880 -0F00 -0800 -0800 -7F80 -8880 -8880 -8880 -71C0 +7C00 +C600 +9200 +9280 +4700 ENDCHAR -STARTCHAR 0x10D0 -ENCODING 4304 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 6 7 1 0 +STARTCHAR 0035 +ENCODING 3768 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 3 5 0 -5 BITMAP -20 +40 +A0 +60 20 -18 -04 -84 -84 -78 +40 ENDCHAR -STARTCHAR 0x10D1 -ENCODING 4305 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 6 12 1 0 +STARTCHAR 0036 +ENCODING 3769 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 4 5 0 -5 BITMAP -80 -E0 -10 -10 -10 -30 -48 -84 -84 -84 -84 -78 +D0 +D0 +90 +90 +60 ENDCHAR -STARTCHAR 0x10D2 -ENCODING 4306 +STARTCHAR 0061 +ENCODING 3771 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 8 4 0 10 +BITMAP +7E +C1 +A1 +40 +ENDCHAR +STARTCHAR 0061 +ENCODING 3772 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 6 3 0 -3 +BITMAP +70 +AC +40 +ENDCHAR +STARTCHAR 0050 +ENCODING 3773 SWIDTH 480 0 DWIDTH 8 0 -BBX 7 11 1 -4 +BBX 7 13 1 -2 BITMAP +60 +5C +40 30 -48 -48 08 -38 -44 -82 +04 +62 +D2 +A2 82 82 -44 -38 -ENDCHAR -STARTCHAR 0x10D3 -ENCODING 4307 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 10 1 -3 -BITMAP -7700 -8880 -8880 -8880 -8880 -4700 -2000 -D800 -8400 -0200 -ENDCHAR -STARTCHAR 0x10D4 -ENCODING 4308 -SWIDTH 360 0 -DWIDTH 6 0 -BBX 5 11 1 -4 -BITMAP -70 -88 -C8 -08 -08 -08 -48 -88 -88 -88 -70 +C6 +7C ENDCHAR -STARTCHAR 0x10D5 -ENCODING 4309 +STARTCHAR 0067 +ENCODING 3776 SWIDTH 360 0 DWIDTH 6 0 -BBX 5 11 1 -4 +BBX 5 9 1 0 BITMAP -70 -88 -C8 -08 -30 -08 -48 -88 -88 -88 70 -ENDCHAR -STARTCHAR 0x10D6 -ENCODING 4310 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 8 12 0 0 -BITMAP -60 -90 +80 +80 +80 +80 +80 90 -92 -74 -1C -1A -11 -11 -11 -11 -0E +A8 +70 ENDCHAR -STARTCHAR 0x10D7 -ENCODING 4311 +STARTCHAR 0067 +ENCODING 3777 SWIDTH 660 0 DWIDTH 11 0 -BBX 10 7 1 0 +BBX 10 9 1 0 BITMAP -3300 -4C80 -8440 -8440 -8440 -4880 -3100 +7380 +8400 +8400 +8400 +8400 +8400 +9480 +AD40 +7380 ENDCHAR -STARTCHAR 0x10D8 -ENCODING 4312 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 6 7 1 0 +STARTCHAR 0033 +ENCODING 3778 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 7 15 1 0 BITMAP -70 +60 +90 88 -84 -84 -84 -84 -48 -ENDCHAR -STARTCHAR 0x10D9 -ENCODING 4313 -SWIDTH 360 0 -DWIDTH 6 0 -BBX 5 11 1 -4 -BITMAP +44 +22 10 08 08 08 -30 08 -C8 -88 -88 -88 -70 +08 +08 +0C +0A +04 ENDCHAR -STARTCHAR 0x10DA -ENCODING 4314 -SWIDTH 840 0 -DWIDTH 14 0 -BBX 13 10 1 -3 +STARTCHAR 002E +ENCODING 3779 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 7 15 0 0 BITMAP -7770 -8888 -8888 -8888 -9DC8 -4010 -3800 -C700 -80C0 -0020 +38 +44 +82 +82 +82 +4C +10 +10 +10 +10 +10 +10 +18 +14 +08 ENDCHAR -STARTCHAR 0x10DB -ENCODING 4315 -SWIDTH 360 0 -DWIDTH 6 0 -BBX 5 11 1 0 +STARTCHAR 0077 +ENCODING 3780 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 7 15 0 0 BITMAP -70 -88 -88 -08 +C0 +40 +40 +40 +58 68 -98 -88 -88 -88 -88 -70 +08 +10 +10 +10 +10 +10 +14 +1A +0C ENDCHAR -STARTCHAR 0x10DC -ENCODING 4316 -SWIDTH 360 0 -DWIDTH 6 0 -BBX 5 11 1 0 +STARTCHAR 004D +ENCODING 3782 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 7 15 1 -4 BITMAP -48 -B0 +6C +92 +C2 +A2 +42 +02 +02 +02 +02 +02 +02 +82 +82 +46 +3C +ENDCHAR +STARTCHAR char3784 +ENCODING 3784 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 1 3 0 10 +BITMAP 80 80 -B0 -C8 -88 -88 -88 -88 -70 +80 ENDCHAR -STARTCHAR 0x10DD -ENCODING 4317 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 7 1 0 +STARTCHAR 0068 +ENCODING 3785 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 6 4 0 10 BITMAP -7700 -8880 -8880 -9C80 -8080 -8080 -4100 +40 +A0 +44 +FC ENDCHAR -STARTCHAR 0x10DE -ENCODING 4318 -SWIDTH 360 0 -DWIDTH 6 0 -BBX 5 12 1 0 +STARTCHAR 0048 +ENCODING 3786 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 8 4 0 9 BITMAP -20 -10 -08 -08 -08 -30 -08 -08 -C8 -88 -88 -70 +6C +92 +C3 +C6 ENDCHAR -STARTCHAR 0x10DF -ENCODING 4319 -SWIDTH 360 0 -DWIDTH 6 0 -BBX 5 11 1 -4 +STARTCHAR char3784 +ENCODING 3787 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 3 3 0 10 BITMAP -08 -38 -A8 -A8 -48 -08 -48 -88 -88 -88 -70 +40 +E0 +40 ENDCHAR -STARTCHAR 0x10E0 -ENCODING 4320 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 12 1 0 +STARTCHAR 0061 +ENCODING 3788 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 6 4 0 10 BITMAP -0200 -0200 -0400 -1800 -2000 -7700 -8880 -8880 -9C80 -8080 -8080 -4100 +04 +78 +A0 +40 ENDCHAR -STARTCHAR 0x10E1 -ENCODING 4321 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 7 11 0 0 +STARTCHAR 003D +ENCODING 3789 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 3 4 0 10 BITMAP -60 +40 A0 -20 -24 -28 -2C -22 -22 -22 -22 -1C +A0 +40 ENDCHAR -STARTCHAR 0x10E2 -ENCODING 4322 +STARTCHAR 0057 +ENCODING 3792 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 7 9 1 0 +BITMAP +38 +44 +82 +82 +82 +82 +82 +44 +38 +ENDCHAR +STARTCHAR 0021 +ENCODING 3793 SWIDTH 540 0 DWIDTH 9 0 -BBX 8 14 1 -4 +BBX 8 10 1 -1 BITMAP -08 -14 -14 -28 -54 -92 -8D -81 -81 -81 +3C +42 81 81 +91 +A9 +72 +02 +1C +20 +ENDCHAR +STARTCHAR 0040 +ENCODING 3794 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 7 13 1 0 +BITMAP +02 +02 +02 +04 +18 +20 +40 +80 +8C +96 +8A 42 3C ENDCHAR -STARTCHAR 0x10E3 -ENCODING 4323 +STARTCHAR 0023 +ENCODING 3795 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 7 13 1 0 +BITMAP +02 +3C +30 +0C +22 +52 +52 +52 +52 +52 +62 +B2 +6C +ENDCHAR +STARTCHAR 0024 +ENCODING 3796 SWIDTH 540 0 DWIDTH 9 0 -BBX 8 11 1 -4 +BBX 8 13 1 0 BITMAP -96 -E9 -09 -1D 01 01 -09 -11 -11 +7E +80 +82 +85 +86 +84 +84 +84 +84 +84 +7B +ENDCHAR +STARTCHAR 0026 +ENCODING 3797 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 8 13 1 0 +BITMAP 11 -0E +29 +3E +40 +82 +85 +86 +84 +84 +84 +84 +84 +7B ENDCHAR -STARTCHAR 0x10E4 -ENCODING 4324 +STARTCHAR 002A +ENCODING 3798 SWIDTH 480 0 DWIDTH 8 0 -BBX 7 11 1 -4 +BBX 7 13 1 0 BITMAP -6C -92 +02 +3C +30 +0C +42 +A2 +C2 +82 +82 +82 92 92 +6C +ENDCHAR +STARTCHAR 0028 +ENCODING 3799 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 7 13 1 -4 +BITMAP +CC +B2 62 -0C 22 -42 -42 +22 +22 +62 +A2 42 -3C +02 +02 +02 +02 ENDCHAR -STARTCHAR 0x10E5 -ENCODING 4325 -SWIDTH 360 0 -DWIDTH 6 0 -BBX 5 16 1 -4 +STARTCHAR 0029 +ENCODING 3800 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 9 13 1 -4 BITMAP -08 -18 -28 -08 -08 -38 -48 -48 -08 -08 -08 -48 -88 -88 -88 -70 +CC00 +B200 +6200 +2200 +2200 +2200 +6200 +A200 +4200 +0F80 +1300 +1680 +0900 ENDCHAR -STARTCHAR 0x10E6 -ENCODING 4326 +STARTCHAR 005F +ENCODING 3801 SWIDTH 600 0 DWIDTH 10 0 -BBX 9 10 1 -3 +BBX 9 9 1 0 BITMAP -7700 +7080 8880 8880 8880 -9C80 -4100 -3000 -CC00 -8200 -0100 +8880 +8880 +C880 +A880 +4700 ENDCHAR -STARTCHAR 0x10E7 -ENCODING 4327 -SWIDTH 360 0 -DWIDTH 6 0 -BBX 5 11 1 -4 +STARTCHAR 007C +ENCODING 3804 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 15 9 1 0 BITMAP -48 -88 -88 -98 -68 -08 -48 -88 -88 -88 -70 +4DC2 +AB22 +6622 +4222 +8222 +8222 +8222 +C622 +7CDC ENDCHAR -STARTCHAR 0x10E8 -ENCODING 4328 +STARTCHAR 005C +ENCODING 3805 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 15 9 1 0 +BITMAP +4DC2 +AA22 +6622 +4222 +8222 +8222 +8262 +C6B6 +7C4C +ENDCHAR +STARTCHAR GEORGIAN CAPITAL LETTER AN +ENCODING 4256 SWIDTH 480 0 DWIDTH 8 0 BBX 7 11 1 0 -BITMAP -6C -92 -D2 -02 -1A -26 -22 -22 -22 -22 -1C -ENDCHAR -STARTCHAR 0x10E9 -ENCODING 4329 -SWIDTH 360 0 -DWIDTH 6 0 -BBX 5 11 1 0 BITMAP -60 -90 +DC +66 +00 E0 -80 -B0 -C8 -88 -88 -88 -88 -90 +40 +40 +40 +78 +04 +04 +0E ENDCHAR -STARTCHAR 0x10EA -ENCODING 4330 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 11 1 -4 +STARTCHAR GEORGIAN CAPITAL LETTER BAN +ENCODING 4257 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 10 11 1 0 BITMAP -28 -44 -42 -82 -82 -8C -82 -82 -82 -42 -3C +EE00 +4400 +4400 +4400 +3C00 +0400 +0400 +0F00 +0080 +0080 +01C0 ENDCHAR -STARTCHAR 0x10EB -ENCODING 4331 -SWIDTH 360 0 -DWIDTH 6 0 -BBX 5 11 1 0 +STARTCHAR GEORGIAN CAPITAL LETTER GAN +ENCODING 4258 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 11 11 1 0 BITMAP -60 -10 -08 -08 -68 -98 -88 -88 -88 -88 -70 +FE00 +4400 +4400 +E400 +0400 +0400 +0E00 +0100 +0380 +0040 +00E0 ENDCHAR -STARTCHAR 0x10EC -ENCODING 4332 +STARTCHAR GEORGIAN CAPITAL LETTER DON +ENCODING 4259 SWIDTH 480 0 DWIDTH 8 0 -BBX 7 15 1 -3 +BBX 7 11 1 0 BITMAP -6C +FE 92 +10 +10 +38 +44 82 -80 -40 -7C +82 +82 44 +38 +ENDCHAR +STARTCHAR GEORGIAN CAPITAL LETTER EN +ENCODING 4260 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 7 11 1 0 +BITMAP +FE 44 44 -28 -28 -28 -10 -10 -10 +E4 +04 +04 +04 +04 +04 +04 +0E ENDCHAR -STARTCHAR 0x10ED -ENCODING 4333 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 6 16 1 -4 +STARTCHAR GEORGIAN CAPITAL LETTER VIN +ENCODING 4261 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 11 11 1 0 BITMAP -40 -70 -10 -10 -14 -74 -98 -74 -14 -10 -10 -48 -84 -84 -84 -78 +FE00 +4400 +4400 +E400 +0400 +07C0 +0440 +04E0 +0400 +0400 +0E00 ENDCHAR -STARTCHAR 0x10EE -ENCODING 4334 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 7 11 0 0 +STARTCHAR GEORGIAN CAPITAL LETTER ZEN +ENCODING 4262 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 11 1 0 BITMAP -60 -A0 -24 -28 -3C -32 -22 -22 -22 -22 -1C +E000 +4000 +3C00 +0800 +0800 +0F00 +0880 +0880 +0880 +0880 +0700 ENDCHAR -STARTCHAR 0x10EF -ENCODING 4335 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 10 11 1 -4 +STARTCHAR GEORGIAN CAPITAL LETTER TAN +ENCODING 4263 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 11 11 1 0 BITMAP -6380 -9040 -9180 -4A00 -0C00 -1400 -2480 -4240 -2240 -1180 -E000 +1E00 +6400 +4400 +8400 +8580 +8640 +8440 +84E0 +4400 +6400 +1E00 ENDCHAR -STARTCHAR 0x10F0 -ENCODING 4336 +STARTCHAR GEORGIAN CAPITAL LETTER IN +ENCODING 4264 SWIDTH 420 0 DWIDTH 7 0 BBX 6 11 1 0 BITMAP -10 +E0 +40 +3C 08 -04 -04 -18 -04 -04 -18 -C4 -84 -78 +08 +08 +08 +08 +08 +08 +1C ENDCHAR -STARTCHAR 0x10F1 -ENCODING 4337 +STARTCHAR GEORGIAN CAPITAL LETTER KAN +ENCODING 4265 SWIDTH 480 0 DWIDTH 8 0 BBX 7 11 1 0 BITMAP -28 +E0 +40 +40 +40 +78 44 -42 -82 -8C -82 -82 -8C -82 -42 +44 3C +04 +04 +0E ENDCHAR -STARTCHAR 0x10F2 -ENCODING 4338 +STARTCHAR GEORGIAN CAPITAL LETTER LAS +ENCODING 4266 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 11 1 0 +BITMAP +FC00 +4800 +4800 +4800 +4800 +E800 +0F00 +0880 +0880 +0880 +0700 +ENDCHAR +STARTCHAR GEORGIAN CAPITAL LETTER MAN +ENCODING 4267 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 10 11 1 0 +BITMAP +E000 +4000 +3C00 +0800 +0800 +0800 +7F80 +8880 +8880 +8880 +71C0 +ENDCHAR +STARTCHAR GEORGIAN CAPITAL LETTER NAR +ENCODING 4268 SWIDTH 480 0 DWIDTH 8 0 -BBX 7 7 1 0 +BBX 7 11 1 0 BITMAP -38 +FC +44 44 +4E +40 +78 44 44 -28 -92 +44 +44 EE ENDCHAR -STARTCHAR 0x10F3 -ENCODING 4339 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 6 11 1 -4 +STARTCHAR GEORGIAN CAPITAL LETTER ON +ENCODING 4269 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 11 11 1 0 BITMAP -7C -04 -08 -10 -30 -08 -44 -84 -84 -84 -78 +1000 +6C00 +4400 +8200 +8200 +8200 +8200 +82E0 +4440 +6C40 +1380 ENDCHAR -STARTCHAR 0x10F4 -ENCODING 4340 -SWIDTH 420 0 -DWIDTH 7 0 +STARTCHAR GEORGIAN CAPITAL LETTER PAR +ENCODING 4270 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 10 11 1 0 +BITMAP +E000 +4000 +4000 +3DC0 +0880 +0880 +0880 +0880 +0880 +0880 +0700 +ENDCHAR +STARTCHAR GEORGIAN CAPITAL LETTER ZHAR +ENCODING 4271 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 8 11 1 0 +BITMAP +E7 +42 +42 +32 +22 +1E +02 +02 +02 +02 +07 +ENDCHAR +STARTCHAR GEORGIAN CAPITAL LETTER RAE +ENCODING 4272 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 11 1 0 +BITMAP +1C00 +0800 +0800 +0800 +0800 +2E00 +4900 +8900 +8B80 +8800 +7000 +ENDCHAR +STARTCHAR GEORGIAN CAPITAL LETTER SAN +ENCODING 4273 +SWIDTH 360 0 +DWIDTH 6 0 BBX 6 11 1 0 BITMAP -20 -38 -04 -04 -18 -04 +E0 +40 +40 +40 +40 +50 +48 44 -84 -84 -84 -78 +44 +44 +38 ENDCHAR -STARTCHAR 0x10F5 -ENCODING 4341 +STARTCHAR GEORGIAN CAPITAL LETTER TAR +ENCODING 4274 SWIDTH 420 0 DWIDTH 7 0 BBX 6 11 1 0 BITMAP -70 -88 -88 -88 -7C +F8 +44 +44 +44 +78 +40 +40 +F0 08 -7C -88 -88 -88 -70 +08 +1C ENDCHAR -STARTCHAR 0x10F6 -ENCODING 4342 +STARTCHAR GEORGIAN CAPITAL LETTER UN +ENCODING 4275 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 11 11 1 0 +BITMAP +1000 +6C00 +4400 +8200 +8200 +8200 +8200 +8380 +4440 +6C40 +10E0 +ENDCHAR +STARTCHAR GEORGIAN CAPITAL LETTER PHAR +ENCODING 4276 SWIDTH 600 0 DWIDTH 10 0 -BBX 9 16 1 -4 +BBX 9 11 1 0 BITMAP -7000 -8800 -C800 +7F00 +8880 +8880 +8880 +7F00 0800 0800 -3E00 -4900 -4900 -4900 -3E00 0800 0800 0800 -0980 -0880 -0700 +1C00 ENDCHAR -STARTCHAR 0x10FB -ENCODING 4347 -SWIDTH 360 0 -DWIDTH 6 0 -BBX 5 6 1 1 +STARTCHAR GEORGIAN CAPITAL LETTER KHAR +ENCODING 4277 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 11 1 0 BITMAP -C0 -C0 -18 -18 -C0 -C0 +1C00 +0800 +0800 +EA00 +4D00 +5900 +2B80 +0800 +0800 +0800 +1C00 ENDCHAR -STARTCHAR 0x1200 -ENCODING 4608 -SWIDTH 960 0 -DWIDTH 16 0 -BBX 8 11 0 0 +STARTCHAR GEORGIAN CAPITAL LETTER GHAN +ENCODING 4278 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 7 11 1 0 BITMAP -07 -C3 -C3 -C3 -C3 -C3 -C3 -C6 -C6 -7C 38 -ENDCHAR -STARTCHAR 0x1201 -ENCODING 4609 -SWIDTH 960 0 -DWIDTH 16 0 -BBX 12 11 0 0 -BITMAP -0700 -C300 -C300 -C300 -C3F0 -C330 -C300 -C600 -C600 -7C00 -3800 +44 +44 +44 +44 +44 +44 +44 +44 +44 +EE ENDCHAR -STARTCHAR 0x1202 -ENCODING 4610 -SWIDTH 960 0 -DWIDTH 16 0 -BBX 8 12 0 0 +STARTCHAR GEORGIAN CAPITAL LETTER QAR +ENCODING 4279 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 7 11 1 0 BITMAP -66 -C6 -C6 -C6 -C6 -7C +EE +44 +44 +44 3C -0C -18 -30 -33 -3F +04 +04 +04 +04 +04 +0E ENDCHAR -STARTCHAR 0x1203 -ENCODING 4611 -SWIDTH 960 0 -DWIDTH 16 0 -BBX 7 12 0 0 +STARTCHAR GEORGIAN CAPITAL LETTER SHIN +ENCODING 4280 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 7 11 1 0 BITMAP -66 -C6 -C6 -C6 -C6 -7C +EE +44 +44 +44 3C -0C -18 -30 -30 -30 +04 +04 +64 +44 +44 +38 ENDCHAR -STARTCHAR 0x1204 -ENCODING 4612 -SWIDTH 960 0 -DWIDTH 16 0 -BBX 7 12 0 0 +STARTCHAR GEORGIAN CAPITAL LETTER CHIN +ENCODING 4281 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 7 11 1 0 BITMAP -66 -C6 -C6 -C6 -C6 -7C -3C -0C -1C -34 -32 -3E +E0 +40 +40 +58 +64 +44 +4E +40 +40 +40 +E0 ENDCHAR -STARTCHAR 0x1205 -ENCODING 4613 -SWIDTH 960 0 -DWIDTH 16 0 -BBX 9 11 0 0 +STARTCHAR GEORGIAN CAPITAL LETTER CAN +ENCODING 4282 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 11 11 1 0 BITMAP -C380 -C180 -E180 -7180 -3180 -6180 -6180 -6180 -6300 -3F00 -1E00 +1C00 +6200 +4200 +8700 +8000 +8000 +87C0 +8240 +4240 +62E0 +1C00 ENDCHAR -STARTCHAR 0x1206 -ENCODING 4614 -SWIDTH 960 0 -DWIDTH 16 0 -BBX 11 11 0 0 +STARTCHAR GEORGIAN CAPITAL LETTER JIL +ENCODING 4283 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 10 11 1 0 BITMAP -03C0 -C320 -C360 -C380 -C300 -C300 -C300 -C600 -C600 -7C00 -3800 +1C00 +0800 +0800 +0800 +0800 +0800 +7F80 +8880 +8880 +8880 +71C0 ENDCHAR -STARTCHAR 0x1208 -ENCODING 4616 -SWIDTH 960 0 -DWIDTH 16 0 -BBX 7 12 0 0 +STARTCHAR GEORGIAN CAPITAL LETTER CIL +ENCODING 4284 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 7 11 1 0 BITMAP -30 -30 -30 +F8 +44 +44 +78 +40 78 +44 +44 +4E +40 +E0 +ENDCHAR +STARTCHAR GEORGIAN CAPITAL LETTER CHAR +ENCODING 4285 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 8 11 1 0 +BITMAP +FE +42 +42 +47 +40 7C -CE -C6 -C6 -C6 -C6 -C6 -C6 +02 +E1 +41 +42 +3C ENDCHAR -STARTCHAR 0x1209 -ENCODING 4617 -SWIDTH 960 0 -DWIDTH 16 0 -BBX 11 12 0 0 +STARTCHAR GEORGIAN CAPITAL LETTER XAN +ENCODING 4286 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 7 11 1 0 BITMAP -3000 -3000 -3000 -7800 -7C00 -CE00 -C600 -C600 -C7E0 -C660 -C600 -C600 +EE +44 +44 +4C +70 +40 +40 +40 +78 +04 +0E ENDCHAR -STARTCHAR 0x120A -ENCODING 4618 -SWIDTH 960 0 -DWIDTH 16 0 -BBX 11 12 0 0 +STARTCHAR GEORGIAN CAPITAL LETTER JHANe +ENCODING 4287 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 11 1 0 BITMAP -3000 -3000 -3000 -7800 -7C00 -CE00 -C600 -C600 -C600 -C600 -C660 -C7E0 +E000 +4000 +4000 +3F00 +0880 +0880 +0F00 +3800 +4800 +4800 +FC00 ENDCHAR -STARTCHAR 0x120B -ENCODING 4619 -SWIDTH 960 0 -DWIDTH 16 0 -BBX 7 12 0 0 +STARTCHAR GEORGIAN CAPITAL LETTER HAE +ENCODING 4288 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 11 1 0 BITMAP -30 -30 -30 -78 -7C -CE -C6 -C6 -C6 -06 -06 -06 +FC00 +4800 +4800 +4800 +4800 +E800 +0B00 +0880 +0880 +0880 +0700 ENDCHAR -STARTCHAR 0x120C -ENCODING 4620 -SWIDTH 960 0 -DWIDTH 16 0 -BBX 11 12 0 0 +STARTCHAR GEORGIAN CAPITAL LETTER HE +ENCODING 4289 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 7 11 1 0 BITMAP -3000 -3000 -3000 -7800 -7C00 -CE00 -C600 -C600 -C600 -C7C0 -C660 -C7C0 +FE +42 +40 +58 +64 +44 +4E +40 +40 +40 +E0 ENDCHAR -STARTCHAR 0x120D -ENCODING 4621 -SWIDTH 960 0 -DWIDTH 16 0 -BBX 8 12 0 0 +STARTCHAR GEORGIAN CAPITAL LETTER HIE +ENCODING 4290 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 8 11 1 0 BITMAP -18 -18 -18 +70 +20 +20 +10 +0C +02 +01 +E1 +41 +42 3C -3E -67 -63 -C3 -C3 -F3 -DB -F3 ENDCHAR -STARTCHAR 0x120E -ENCODING 4622 -SWIDTH 960 0 -DWIDTH 16 0 -BBX 12 12 0 0 +STARTCHAR GEORGIAN CAPITAL LETTER WE +ENCODING 4291 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 7 11 1 0 BITMAP -3000 -3000 -3000 -7800 -7C00 -CE00 -C600 -C7E0 -C6B0 -C6E0 -C600 -C600 +0E +04 +04 +E4 +44 +44 +44 +3C +04 +04 +0E ENDCHAR -STARTCHAR 0x120F -ENCODING 4623 -SWIDTH 960 0 -DWIDTH 16 0 -BBX 10 14 0 -2 +STARTCHAR GEORGIAN CAPITAL LETTER HAR +ENCODING 4292 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 7 11 1 0 BITMAP -3000 -3000 -3000 -7800 -7C00 -CE00 -C600 -C600 -C600 -0600 -0600 -0600 -1F80 -30C0 +EE +44 +44 +44 +44 +FE +10 +10 +10 +10 +38 ENDCHAR -STARTCHAR 0x1210 -ENCODING 4624 -SWIDTH 960 0 -DWIDTH 16 0 -BBX 10 12 0 0 +STARTCHAR GEORGIAN CAPITAL LETTER HOE +ENCODING 4293 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 10 11 1 0 BITMAP -0C00 -0C00 -0C00 -0C00 -0C00 -3F00 -6D80 -6D80 -CCC0 -CCC0 -CCC0 -CCC0 +1F00 +0880 +0880 +0F00 +0800 +0800 +7F80 +8880 +8880 +8880 +71C0 ENDCHAR -STARTCHAR 0x1211 -ENCODING 4625 -SWIDTH 960 0 -DWIDTH 16 0 -BBX 14 12 0 0 +STARTCHAR GEORGIAN LETTER AN +ENCODING 4304 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 6 7 1 0 BITMAP -0C00 -0C00 -0C00 -0C00 -0C00 -3F00 -6D80 -6D80 -CCFC -CCCC -CCC0 -CCC0 +20 +20 +18 +04 +84 +84 +78 ENDCHAR -STARTCHAR 0x1212 -ENCODING 4626 -SWIDTH 960 0 -DWIDTH 16 0 -BBX 14 12 0 0 +STARTCHAR GEORGIAN LETTER BAN +ENCODING 4305 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 6 12 1 0 BITMAP -0C00 -0C00 -0C00 -0C00 -0C00 -3F00 -6D80 -6D80 -CCC0 -CCC0 -CCCC -CCFC +80 +E0 +10 +10 +10 +30 +48 +84 +84 +84 +84 +78 ENDCHAR -STARTCHAR 0x1213 -ENCODING 4627 -SWIDTH 960 0 -DWIDTH 16 0 -BBX 10 12 0 0 +STARTCHAR GEORGIAN LETTER GAN +ENCODING 4306 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 7 11 1 -4 BITMAP -0C00 -0C00 -0C00 -0C00 -0C00 -3F00 -6D80 -6D80 -CCC0 -00C0 -00C0 -00C0 -ENDCHAR -STARTCHAR 0x1214 -ENCODING 4628 -SWIDTH 960 0 -DWIDTH 16 0 -BBX 13 12 0 0 -BITMAP -0C00 -0C00 -0C00 -0C00 -0C00 -3F00 -6D80 -6D80 -CC80 -CCF0 -CC98 -CCF0 +30 +48 +48 +08 +38 +44 +82 +82 +82 +44 +38 ENDCHAR -STARTCHAR 0x1215 -ENCODING 4629 -SWIDTH 960 0 -DWIDTH 16 0 -BBX 10 12 0 0 +STARTCHAR GEORGIAN LETTER DON +ENCODING 4307 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 10 1 -3 BITMAP -3000 -3000 -3000 -3C00 -0C00 -3F00 -6D80 -6D80 -CCC0 -CCC0 -CCC0 -CCC0 +7700 +8880 +8880 +8880 +8880 +4700 +2000 +D800 +8400 +0200 ENDCHAR -STARTCHAR 0x1216 -ENCODING 4630 -SWIDTH 960 0 -DWIDTH 16 0 -BBX 10 12 0 0 +STARTCHAR GEORGIAN LETTER EN +ENCODING 4308 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 11 1 -4 BITMAP -0C00 -0C00 -0C00 -0C00 -0C00 -3F00 -6D80 -6D80 -CCC0 -C000 -C000 -C000 +70 +88 +C8 +08 +08 +08 +48 +88 +88 +88 +70 ENDCHAR -STARTCHAR 0x1217 -ENCODING 4631 -SWIDTH 960 0 -DWIDTH 16 0 -BBX 14 14 0 -2 +STARTCHAR GEORGIAN LETTER VIN +ENCODING 4309 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 11 1 -4 BITMAP -0C00 -0C00 -0C00 -0C00 -0C00 -3F00 -6D80 -6D80 -CCC0 -00C0 -00C0 -00C0 -07F8 -0E1C +70 +88 +C8 +08 +30 +08 +48 +88 +88 +88 +70 ENDCHAR -STARTCHAR 0x1218 -ENCODING 4632 -SWIDTH 960 0 -DWIDTH 16 0 -BBX 12 8 0 2 +STARTCHAR GEORGIAN LETTER ZEN +ENCODING 4310 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 8 12 0 0 BITMAP -3FF0 -7FF0 -4490 -C590 -8D10 -9930 -F1E0 -F1C0 +60 +90 +90 +92 +74 +1C +1A +11 +11 +11 +11 +0E ENDCHAR -STARTCHAR 0x1219 -ENCODING 4633 -SWIDTH 960 0 -DWIDTH 16 0 -BBX 15 8 0 2 +STARTCHAR GEORGIAN LETTER TAN +ENCODING 4311 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 10 7 1 0 BITMAP -3FF0 -7FF0 -4490 -C59E -8D12 -9932 -F1E0 -F1C0 +3300 +4C80 +8440 +8440 +8440 +4880 +3100 ENDCHAR -STARTCHAR 0x121A -ENCODING 4634 -SWIDTH 960 0 -DWIDTH 16 0 -BBX 14 12 0 0 +STARTCHAR GEORGIAN LETTER IN +ENCODING 4312 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 6 7 1 0 BITMAP -3FF0 -7FF0 -C510 -8510 -8A10 -FBF0 -71F0 -0020 -0020 -0040 -004C -007C +70 +88 +84 +84 +84 +84 +48 ENDCHAR -STARTCHAR 0x121B -ENCODING 4635 -SWIDTH 960 0 -DWIDTH 16 0 -BBX 12 12 0 0 +STARTCHAR GEORGIAN LETTER KAN +ENCODING 4313 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 11 1 -4 BITMAP -3FF0 -7FF0 -C510 -8510 -8A10 -FBF0 -71F0 -0020 -0020 -0040 -0040 -0040 +10 +08 +08 +08 +30 +08 +C8 +88 +88 +88 +70 ENDCHAR -STARTCHAR 0x121C -ENCODING 4636 -SWIDTH 960 0 -DWIDTH 16 0 -BBX 14 12 0 0 +STARTCHAR GEORGIAN LETTER LAS +ENCODING 4314 +SWIDTH 840 0 +DWIDTH 14 0 +BBX 13 10 1 -3 BITMAP -3FF0 -7FF0 -C510 -8510 -8A10 -FBF0 -71F0 -0020 +7770 +8888 +8888 +8888 +9DC8 +4010 +3800 +C700 +80C0 0020 -0078 -004C -0078 ENDCHAR -STARTCHAR 0x121D -ENCODING 4637 -SWIDTH 960 0 -DWIDTH 16 0 -BBX 11 12 0 0 +STARTCHAR GEORGIAN LETTER MAN +ENCODING 4315 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 11 1 0 BITMAP -7FC0 -7FE0 -CA20 -8A20 -8A20 -8BE0 -F9C0 -7800 -0800 -1800 -3000 -6000 +70 +88 +88 +08 +68 +98 +88 +88 +88 +88 +70 ENDCHAR -STARTCHAR 0x121E -ENCODING 4638 -SWIDTH 960 0 -DWIDTH 16 0 -BBX 11 12 0 0 +STARTCHAR GEORGIAN LETTER NAR +ENCODING 4316 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 11 1 0 BITMAP -7FC0 -7FE0 -CA20 -8A20 -8A20 -8BE0 -F9C0 -7800 -0800 -0800 -0800 -0C00 +48 +B0 +80 +80 +B0 +C8 +88 +88 +88 +88 +70 ENDCHAR -STARTCHAR 0x121F -ENCODING 4639 -SWIDTH 960 0 -DWIDTH 16 0 -BBX 13 14 0 -2 +STARTCHAR GEORGIAN LETTER ON +ENCODING 4317 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 7 1 0 BITMAP -3FF0 -7FF0 -C510 -8510 -8A10 -FBF0 -71F0 -0020 -0020 -0060 -0040 -0040 -03F0 -0618 +7700 +8880 +8880 +9C80 +8080 +8080 +4100 ENDCHAR -STARTCHAR 0x1220 -ENCODING 4640 -SWIDTH 960 0 -DWIDTH 16 0 -BBX 10 9 0 1 +STARTCHAR GEORGIAN LETTER PAR +ENCODING 4318 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 12 1 0 BITMAP -4CC0 -CCC0 -CCC0 -CCC0 -CCC0 -CD80 -CF80 -6C00 -3C00 +20 +10 +08 +08 +08 +30 +08 +08 +C8 +88 +88 +70 ENDCHAR -STARTCHAR 0x1221 -ENCODING 4641 -SWIDTH 960 0 -DWIDTH 16 0 -BBX 13 9 0 1 +STARTCHAR GEORGIAN LETTER ZHAR +ENCODING 4319 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 11 1 -4 BITMAP -4D80 -CD80 -CDF8 -CD98 -CD80 -CD80 -CF80 -6C00 -3C00 +08 +38 +A8 +A8 +48 +08 +48 +88 +88 +88 +70 ENDCHAR -STARTCHAR 0x1222 -ENCODING 4642 -SWIDTH 960 0 -DWIDTH 16 0 -BBX 14 12 0 0 +STARTCHAR GEORGIAN LETTER RAE +ENCODING 4320 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 12 1 0 BITMAP -CC80 -CCC0 -CCC0 -CCC0 -CCC0 -EDC0 -7FC0 -00C0 -00C0 -00C0 -00CC -00FC +0200 +0200 +0400 +1800 +2000 +7700 +8880 +8880 +9C80 +8080 +8080 +4100 ENDCHAR -STARTCHAR 0x1223 -ENCODING 4643 -SWIDTH 960 0 -DWIDTH 16 0 -BBX 10 12 0 0 +STARTCHAR GEORGIAN LETTER SAN +ENCODING 4321 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 7 11 0 0 BITMAP -CC80 -CCC0 -CCC0 -CCC0 -CCC0 -EDC0 -7FC0 -00C0 -00C0 -00C0 -00C0 -00C0 +60 +A0 +20 +24 +28 +2C +22 +22 +22 +22 +1C ENDCHAR -STARTCHAR 0x1224 -ENCODING 4644 -SWIDTH 960 0 -DWIDTH 16 0 -BBX 12 12 0 0 +STARTCHAR GEORGIAN LETTER TAR +ENCODING 4322 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 8 14 1 -4 BITMAP -CC80 -CCC0 -CCC0 -CCC0 -CCC0 -EDC0 -7FC0 -00C0 -00C0 -00E0 -0190 -01E0 +08 +14 +14 +28 +54 +92 +8D +81 +81 +81 +81 +81 +42 +3C ENDCHAR -STARTCHAR 0x1225 -ENCODING 4645 -SWIDTH 960 0 -DWIDTH 16 0 -BBX 10 12 0 0 +STARTCHAR GEORGIAN LETTER UN +ENCODING 4323 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 8 11 1 -4 BITMAP -CC80 -CCC0 -CCC0 -CCC0 -CCC0 -EDC0 -FF80 -E000 -C000 -C000 -C000 -C000 -ENDCHAR -STARTCHAR 0x1226 -ENCODING 4646 -SWIDTH 960 0 -DWIDTH 16 0 -BBX 10 12 0 0 -BITMAP -CCC0 -CCC0 -CCC0 -CCC0 -CCC0 -EDC0 -7F80 -1C00 -1800 -3800 -7000 -6000 +96 +E9 +09 +1D +01 +01 +09 +11 +11 +11 +0E ENDCHAR -STARTCHAR 0x1227 -ENCODING 4647 -SWIDTH 960 0 -DWIDTH 16 0 -BBX 14 14 0 -2 +STARTCHAR GEORGIAN LETTER PHAR +ENCODING 4324 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 7 11 1 -4 BITMAP -CC80 -CCC0 -CCC0 -CCC0 -CCC0 -EDC0 -7FC0 -00C0 -00C0 -00C0 -00C0 -00C0 -07F8 -0E1C +6C +92 +92 +92 +62 +0C +22 +42 +42 +42 +3C ENDCHAR -STARTCHAR 0x1228 -ENCODING 4648 -SWIDTH 960 0 -DWIDTH 16 0 -BBX 8 12 0 0 +STARTCHAR GEORGIAN LETTER KHAR +ENCODING 4325 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 16 1 -4 BITMAP -0C -0C -0C +08 18 +28 +08 +08 38 +48 +48 +08 +08 +08 +48 +88 +88 +88 70 -E0 -C0 -C0 -E3 -7F -3F ENDCHAR -STARTCHAR 0x1229 -ENCODING 4649 -SWIDTH 960 0 -DWIDTH 16 0 -BBX 10 12 0 0 +STARTCHAR GEORGIAN LETTER GHAN +ENCODING 4326 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 10 1 -3 BITMAP -0C00 -0C00 -1C00 -3800 -7000 -6000 -C000 -E000 -7FC0 -3FC0 -0600 -0600 +7700 +8880 +8880 +8880 +9C80 +4100 +3000 +CC00 +8200 +0100 ENDCHAR -STARTCHAR 0x122A -ENCODING 4650 -SWIDTH 960 0 -DWIDTH 16 0 -BBX 9 12 0 0 +STARTCHAR GEORGIAN LETTER QAR +ENCODING 4327 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 11 1 -4 BITMAP -0C00 -0C00 -0C00 -1800 -3800 -7000 -E000 -C300 -C380 -E180 -7F00 -3E00 +48 +88 +88 +98 +68 +08 +48 +88 +88 +88 +70 ENDCHAR -STARTCHAR 0x122B -ENCODING 4651 -SWIDTH 960 0 -DWIDTH 16 0 -BBX 11 12 0 0 +STARTCHAR GEORGIAN LETTER SHIN +ENCODING 4328 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 7 11 1 0 BITMAP -0C00 -0C00 -0C00 -1800 -3800 -7000 -E000 -C1E0 -C3E0 -E660 -7E00 -3C00 +6C +92 +D2 +02 +1A +26 +22 +22 +22 +22 +1C ENDCHAR -STARTCHAR 0x122C -ENCODING 4652 -SWIDTH 960 0 -DWIDTH 16 0 -BBX 10 12 0 0 +STARTCHAR GEORGIAN LETTER CHIN +ENCODING 4329 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 11 1 0 BITMAP -0C00 -0C00 -0C00 -1800 -3800 -7000 -E000 -C000 -C000 -E780 -7CC0 -3F80 +60 +90 +E0 +80 +B0 +C8 +88 +88 +88 +88 +90 ENDCHAR -STARTCHAR 0x122D -ENCODING 4653 -SWIDTH 960 0 -DWIDTH 16 0 -BBX 8 11 0 0 +STARTCHAR GEORGIAN LETTER CAN +ENCODING 4330 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 7 11 1 -4 BITMAP -3F -7F -C3 -C0 -C0 -C0 -C0 -C0 -C3 -FF -7E +28 +44 +42 +82 +82 +8C +82 +82 +82 +42 +3C ENDCHAR -STARTCHAR 0x122E -ENCODING 4654 -SWIDTH 960 0 -DWIDTH 16 0 -BBX 10 11 0 0 +STARTCHAR GEORGIAN LETTER JIL +ENCODING 4331 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 11 1 0 BITMAP -3F80 -7CC0 -C780 -C000 -C000 -C000 -C000 -C000 -C300 -FF00 -7E00 +60 +10 +08 +08 +68 +98 +88 +88 +88 +88 +70 ENDCHAR -STARTCHAR 0x122F -ENCODING 4655 -SWIDTH 960 0 -DWIDTH 16 0 -BBX 11 13 0 -2 +STARTCHAR GEORGIAN LETTER CIL +ENCODING 4332 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 7 15 1 -3 BITMAP -C0C0 -7380 -0C00 -0C00 -1800 -3800 -7000 -E000 -C1E0 -C3E0 -E660 -7E00 -3C00 +6C +92 +82 +80 +40 +7C +44 +44 +44 +28 +28 +28 +10 +10 +10 ENDCHAR -STARTCHAR 0x1230 -ENCODING 4656 -SWIDTH 960 0 -DWIDTH 16 0 -BBX 7 12 0 0 +STARTCHAR GEORGIAN LETTER CHAR +ENCODING 4333 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 6 16 1 -4 BITMAP +40 +70 10 10 -38 -7C -C6 -C6 -C6 -C6 -C6 -C6 -C6 -C6 +14 +74 +98 +74 +14 +10 +10 +48 +84 +84 +84 +78 ENDCHAR -STARTCHAR 0x1231 -ENCODING 4657 -SWIDTH 960 0 -DWIDTH 16 0 -BBX 11 12 0 0 +STARTCHAR GEORGIAN LETTER XAN +ENCODING 4334 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 7 11 0 0 BITMAP -1000 -1000 -3800 -7C00 -C600 -C600 -C600 -C7E0 -C660 -C600 -C600 -C600 +60 +A0 +24 +28 +3C +32 +22 +22 +22 +22 +1C ENDCHAR -STARTCHAR 0x1232 -ENCODING 4658 -SWIDTH 960 0 -DWIDTH 16 0 -BBX 11 12 0 0 +STARTCHAR GEORGIAN LETTER JHAN +ENCODING 4335 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 10 11 1 -4 BITMAP -1000 -1000 -3800 -7C00 -C600 -C600 -C600 -C600 -C600 -C600 -C660 -C7E0 +6380 +9040 +9180 +4A00 +0C00 +1400 +2480 +4240 +2240 +1180 +E000 ENDCHAR -STARTCHAR 0x1233 -ENCODING 4659 -SWIDTH 960 0 -DWIDTH 16 0 -BBX 7 12 0 0 +STARTCHAR GEORGIAN LETTER HAE +ENCODING 4336 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 6 11 1 0 BITMAP 10 -10 -38 -7C -C6 -C6 -C6 -C6 -C6 -06 -06 -06 +08 +04 +04 +18 +04 +04 +18 +C4 +84 +78 ENDCHAR -STARTCHAR 0x1234 -ENCODING 4660 -SWIDTH 960 0 -DWIDTH 16 0 -BBX 10 12 0 0 +STARTCHAR GEORGIAN LETTER HE +ENCODING 4337 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 7 11 1 0 BITMAP -1000 -1000 -3800 -7C00 -C600 -C600 -C600 -C600 -C700 -C680 -C640 -C7C0 +28 +44 +42 +82 +8C +82 +82 +8C +82 +42 +3C ENDCHAR -STARTCHAR 0x1235 -ENCODING 4661 -SWIDTH 960 0 -DWIDTH 16 0 -BBX 8 11 0 0 +STARTCHAR GEORGIAN LETTER HIE +ENCODING 4338 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 7 7 1 0 BITMAP -30 -18 -1C -3E -63 -63 -63 -63 -63 -63 -63 +38 +44 +44 +44 +28 +92 +EE ENDCHAR -STARTCHAR 0x1236 -ENCODING 4662 -SWIDTH 960 0 -DWIDTH 16 0 -BBX 7 12 0 0 +STARTCHAR GEORGIAN LETTER WE +ENCODING 4339 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 6 11 1 -4 BITMAP -10 -10 -38 7C -C6 -C6 -C6 -C6 -C6 +04 +08 +10 +30 +08 +44 +84 +84 +84 +78 +ENDCHAR +STARTCHAR GEORGIAN LETTER HAR +ENCODING 4340 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 6 11 1 0 +BITMAP +20 +38 +04 +04 +18 +04 +44 +84 +84 +84 +78 +ENDCHAR +STARTCHAR GEORGIAN LETTER HOE +ENCODING 4341 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 6 11 1 0 +BITMAP +70 +88 +88 +88 +7C +08 +7C +88 +88 +88 +70 +ENDCHAR +STARTCHAR GEORGIAN LETTER FI +ENCODING 4342 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 16 1 -4 +BITMAP +7000 +8800 +C800 +0800 +0800 +3E00 +4900 +4900 +4900 +3E00 +0800 +0800 +0800 +0980 +0880 +0700 +ENDCHAR +STARTCHAR GEORGIAN PARAGRAPH SEPARATOR +ENCODING 4347 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 6 1 1 +BITMAP C0 C0 +18 +18 C0 +C0 ENDCHAR -STARTCHAR 0x1237 -ENCODING 4663 +STARTCHAR he +ENCODING 4608 SWIDTH 960 0 DWIDTH 16 0 -BBX 10 14 0 -2 +BBX 8 11 0 0 BITMAP -1000 -1000 -3800 -7C00 -C600 -C600 -C600 +07 +C3 +C3 +C3 +C3 +C3 +C3 +C6 +C6 +7C +38 +ENDCHAR +STARTCHAR hu +ENCODING 4609 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 12 11 0 0 +BITMAP +0700 +C300 +C300 +C300 +C3F0 +C330 +C300 C600 C600 -0600 -0600 -0600 -1F80 -30C0 +7C00 +3800 ENDCHAR -STARTCHAR 0x1238 -ENCODING 4664 +STARTCHAR hi +ENCODING 4610 SWIDTH 960 0 DWIDTH 16 0 -BBX 9 12 0 0 +BBX 8 12 0 0 BITMAP -C180 -7F00 -0800 -1C00 -3E00 -6300 -6300 -6300 -6300 -6300 -6300 -6300 +66 +C6 +C6 +C6 +C6 +7C +3C +0C +18 +30 +33 +3F ENDCHAR -STARTCHAR 0x1239 -ENCODING 4665 +STARTCHAR ha +ENCODING 4611 SWIDTH 960 0 DWIDTH 16 0 -BBX 12 12 0 0 +BBX 7 12 0 0 BITMAP -C180 -7F00 -0800 -1C00 -3E00 -6300 -6300 -63F0 -6330 -6330 -6300 -6300 +66 +C6 +C6 +C6 +C6 +7C +3C +0C +18 +30 +30 +30 ENDCHAR -STARTCHAR 0x123A -ENCODING 4666 +STARTCHAR hE +ENCODING 4612 SWIDTH 960 0 DWIDTH 16 0 -BBX 12 12 0 0 +BBX 7 12 0 0 BITMAP -C180 -7F00 -0800 -1C00 -3E00 -6300 -6300 -6300 -6300 -6300 -6330 -63F0 +66 +C6 +C6 +C6 +C6 +7C +3C +0C +1C +34 +32 +3E ENDCHAR -STARTCHAR 0x123B -ENCODING 4667 +STARTCHAR h +ENCODING 4613 SWIDTH 960 0 DWIDTH 16 0 -BBX 9 12 0 0 +BBX 9 11 0 0 BITMAP +C380 C180 -7F00 -0800 -1C00 -3E00 -6300 -6300 -6300 +E180 +7180 +3180 +6180 +6180 +6180 6300 -0300 -0300 -0300 +3F00 +1E00 ENDCHAR -STARTCHAR 0x123C -ENCODING 4668 +STARTCHAR ho +ENCODING 4614 SWIDTH 960 0 DWIDTH 16 0 -BBX 12 12 0 0 +BBX 11 11 0 0 BITMAP -C180 -7F00 -0800 -1C00 -3E00 -6300 -6300 -6300 -6300 -63E0 -6330 -63E0 +03C0 +C320 +C360 +C380 +C300 +C300 +C300 +C600 +C600 +7C00 +3800 ENDCHAR -STARTCHAR 0x123D -ENCODING 4669 +STARTCHAR le +ENCODING 4616 SWIDTH 960 0 DWIDTH 16 0 -BBX 9 12 0 0 +BBX 7 12 0 0 BITMAP -C300 -7E00 -0C00 -0E00 -1F00 -1980 -3180 -3180 -3180 -3180 -3180 -3180 +30 +30 +30 +78 +7C +CE +C6 +C6 +C6 +C6 +C6 +C6 ENDCHAR -STARTCHAR 0x123E -ENCODING 4670 +STARTCHAR lu +ENCODING 4617 SWIDTH 960 0 DWIDTH 16 0 -BBX 9 12 0 0 +BBX 11 12 0 0 BITMAP -C180 -7F00 -0800 -1C00 -3E00 -6300 -6300 -6300 -6300 -6000 -6000 -6000 +3000 +3000 +3000 +7800 +7C00 +CE00 +C600 +C600 +C7E0 +C660 +C600 +C600 ENDCHAR -STARTCHAR 0x123F -ENCODING 4671 +STARTCHAR li +ENCODING 4618 SWIDTH 960 0 DWIDTH 16 0 -BBX 11 14 0 -2 +BBX 11 12 0 0 BITMAP -C180 -7F00 -0800 -1C00 -3E00 -6300 -6300 -6300 -6300 -6300 -0300 -0300 -0FC0 -1860 +3000 +3000 +3000 +7800 +7C00 +CE00 +C600 +C600 +C600 +C600 +C660 +C7E0 ENDCHAR -STARTCHAR 0x1240 -ENCODING 4672 +STARTCHAR la +ENCODING 4619 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 7 12 0 0 +BITMAP +30 +30 +30 +78 +7C +CE +C6 +C6 +C6 +06 +06 +06 +ENDCHAR +STARTCHAR lE +ENCODING 4620 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 11 12 0 0 +BITMAP +3000 +3000 +3000 +7800 +7C00 +CE00 +C600 +C600 +C600 +C7C0 +C660 +C7C0 +ENDCHAR +STARTCHAR l +ENCODING 4621 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 8 12 0 0 +BITMAP +18 +18 +18 +3C +3E +67 +63 +C3 +C3 +F3 +DB +F3 +ENDCHAR +STARTCHAR lo +ENCODING 4622 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 12 12 0 0 +BITMAP +3000 +3000 +3000 +7800 +7C00 +CE00 +C600 +C7E0 +C6B0 +C6E0 +C600 +C600 +ENDCHAR +STARTCHAR lWa +ENCODING 4623 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 10 14 0 -2 +BITMAP +3000 +3000 +3000 +7800 +7C00 +CE00 +C600 +C600 +C600 +0600 +0600 +0600 +1F80 +30C0 +ENDCHAR +STARTCHAR He +ENCODING 4624 SWIDTH 960 0 DWIDTH 16 0 BBX 10 12 0 0 @@ -29613,56 +30086,56 @@ 0C00 0C00 0C00 -1F80 -6CC0 -CCC0 -CD80 -7E00 -0C00 -0C00 0C00 0C00 +3F00 +6D80 +6D80 +CCC0 +CCC0 +CCC0 +CCC0 ENDCHAR -STARTCHAR 0x1241 -ENCODING 4673 +STARTCHAR Hu +ENCODING 4625 SWIDTH 960 0 DWIDTH 16 0 -BBX 10 12 0 0 +BBX 14 12 0 0 BITMAP 0C00 0C00 0C00 -1F80 -6CC0 -CCC0 -CD80 -7E00 0C00 -0FC0 -0CC0 0C00 +3F00 +6D80 +6D80 +CCFC +CCCC +CCC0 +CCC0 ENDCHAR -STARTCHAR 0x1242 -ENCODING 4674 +STARTCHAR Hi +ENCODING 4626 SWIDTH 960 0 DWIDTH 16 0 -BBX 10 12 0 0 +BBX 14 12 0 0 BITMAP 0C00 0C00 0C00 -1F80 -6CC0 -CCC0 -CD80 -7E00 0C00 0C00 -0CC0 -0FC0 +3F00 +6D80 +6D80 +CCC0 +CCC0 +CCCC +CCFC ENDCHAR -STARTCHAR 0x1243 -ENCODING 4675 +STARTCHAR Ha +ENCODING 4627 SWIDTH 960 0 DWIDTH 16 0 BBX 10 12 0 0 @@ -29670,410 +30143,547 @@ 0C00 0C00 0C00 -1F80 -6CC0 -CCC0 -CD80 -7E00 0C00 -1800 -3000 -6000 +0C00 +3F00 +6D80 +6D80 +CCC0 +00C0 +00C0 +00C0 ENDCHAR -STARTCHAR 0x1244 -ENCODING 4676 +STARTCHAR HE +ENCODING 4628 SWIDTH 960 0 DWIDTH 16 0 -BBX 10 12 0 0 +BBX 13 12 0 0 BITMAP 0C00 0C00 0C00 -1F80 -6CC0 -CCC0 -CD80 -7E00 0C00 -0F80 -0CC0 -0F80 +0C00 +3F00 +6D80 +6D80 +CC80 +CCF0 +CC98 +CCF0 ENDCHAR -STARTCHAR 0x1245 -ENCODING 4677 +STARTCHAR H +ENCODING 4629 SWIDTH 960 0 DWIDTH 16 0 BBX 10 12 0 0 BITMAP 3000 3000 +3000 3C00 0C00 -1F80 -6CC0 +3F00 +6D80 +6D80 CCC0 -CD80 -7E00 -0C00 -0C00 -0C00 +CCC0 +CCC0 +CCC0 ENDCHAR -STARTCHAR 0x1246 -ENCODING 4678 +STARTCHAR Ho +ENCODING 4630 SWIDTH 960 0 DWIDTH 16 0 BBX 10 12 0 0 BITMAP -0700 -0980 -0B00 0C00 -1F80 -6CC0 -CCC0 -CD80 -7E00 0C00 0C00 0C00 +0C00 +3F00 +6D80 +6D80 +CCC0 +C000 +C000 +C000 ENDCHAR -STARTCHAR 0x1248 -ENCODING 4680 +STARTCHAR HWa +ENCODING 4631 SWIDTH 960 0 DWIDTH 16 0 -BBX 11 12 0 0 +BBX 14 14 0 -2 BITMAP 0C00 0C00 0C00 -1F80 -6CC0 -CCC0 -CD80 -7E00 -0FC0 -0D60 -0DC0 0C00 +0C00 +3F00 +6D80 +6D80 +CCC0 +00C0 +00C0 +00C0 +07F8 +0E1C ENDCHAR -STARTCHAR 0x124A -ENCODING 4682 +STARTCHAR me +ENCODING 4632 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 12 8 0 2 +BITMAP +3FF0 +7FF0 +4490 +C590 +8D10 +9930 +F1E0 +F1C0 +ENDCHAR +STARTCHAR mu +ENCODING 4633 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 15 8 0 2 +BITMAP +3FF0 +7FF0 +4490 +C59E +8D12 +9932 +F1E0 +F1C0 +ENDCHAR +STARTCHAR mi +ENCODING 4634 SWIDTH 960 0 DWIDTH 16 0 BBX 14 12 0 0 BITMAP -0C00 -0C00 -0C00 -1F80 -6CD8 -CCD8 -CDF8 -7E0C -0C0C -0C00 -0C00 -0C00 +3FF0 +7FF0 +C510 +8510 +8A10 +FBF0 +71F0 +0020 +0020 +0040 +004C +007C ENDCHAR -STARTCHAR 0x124B -ENCODING 4683 +STARTCHAR ma +ENCODING 4635 SWIDTH 960 0 DWIDTH 16 0 -BBX 10 14 0 -2 +BBX 12 12 0 0 BITMAP -0C00 -0C00 +3FF0 +7FF0 +C510 +8510 +8A10 +FBF0 +71F0 +0020 +0020 +0040 +0040 +0040 +ENDCHAR +STARTCHAR mE +ENCODING 4636 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 14 12 0 0 +BITMAP +3FF0 +7FF0 +C510 +8510 +8A10 +FBF0 +71F0 +0020 +0020 +0078 +004C +0078 +ENDCHAR +STARTCHAR m +ENCODING 4637 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 11 12 0 0 +BITMAP +7FC0 +7FE0 +CA20 +8A20 +8A20 +8BE0 +F9C0 +7800 +0800 +1800 +3000 +6000 +ENDCHAR +STARTCHAR mo +ENCODING 4638 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 11 12 0 0 +BITMAP +7FC0 +7FE0 +CA20 +8A20 +8A20 +8BE0 +F9C0 +7800 +0800 +0800 +0800 0C00 -1F80 -6CC0 +ENDCHAR +STARTCHAR mWa +ENCODING 4639 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 13 14 0 -2 +BITMAP +3FF0 +7FF0 +C510 +8510 +8A10 +FBF0 +71F0 +0020 +0020 +0060 +0040 +0040 +03F0 +0618 +ENDCHAR +STARTCHAR `se/s2e +ENCODING 4640 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 10 9 0 1 +BITMAP +4CC0 +CCC0 +CCC0 +CCC0 CCC0 CD80 -7E00 -0C00 -0C00 -0C00 -0C00 -3F00 -6180 +CF80 +6C00 +3C00 ENDCHAR -STARTCHAR 0x124C -ENCODING 4684 +STARTCHAR `su/s2u +ENCODING 4641 SWIDTH 960 0 DWIDTH 16 0 -BBX 10 14 0 -2 +BBX 13 9 0 1 BITMAP -0C00 -0C00 -0C00 -1F80 -6CC0 -CCC0 +4D80 CD80 -7E00 -0C00 -0C00 -0F80 -0CC0 -3F80 -6000 +CDF8 +CD98 +CD80 +CD80 +CF80 +6C00 +3C00 ENDCHAR -STARTCHAR 0x124D -ENCODING 4685 +STARTCHAR `si/s2i +ENCODING 4642 SWIDTH 960 0 DWIDTH 16 0 BBX 14 12 0 0 BITMAP -0C00 -0C30 -0C30 -1FFC -6CCC +CC80 CCC0 -CD80 -7E00 -0C00 -0C00 -0C00 -0C00 +CCC0 +CCC0 +CCC0 +EDC0 +7FC0 +00C0 +00C0 +00C0 +00CC +00FC ENDCHAR -STARTCHAR 0x1250 -ENCODING 4688 +STARTCHAR `sa/s2a +ENCODING 4643 SWIDTH 960 0 DWIDTH 16 0 BBX 10 12 0 0 BITMAP -6180 -3F00 -0C00 -0C00 -1F80 -6CC0 +CC80 CCC0 -CD80 -7E00 -0C00 -0C00 -0C00 +CCC0 +CCC0 +CCC0 +EDC0 +7FC0 +00C0 +00C0 +00C0 +00C0 +00C0 ENDCHAR -STARTCHAR 0x1251 -ENCODING 4689 +STARTCHAR `sE/s2E +ENCODING 4644 SWIDTH 960 0 DWIDTH 16 0 -BBX 10 12 0 0 +BBX 12 12 0 0 BITMAP -6180 -3F00 -0C00 -0C00 -1F80 -6CC0 +CC80 CCC0 -CD80 -7E00 -0C00 -0FC0 -0CC0 +CCC0 +CCC0 +CCC0 +EDC0 +7FC0 +00C0 +00C0 +00E0 +0190 +01E0 ENDCHAR -STARTCHAR 0x1252 -ENCODING 4690 +STARTCHAR `s/s2 +ENCODING 4645 SWIDTH 960 0 DWIDTH 16 0 BBX 10 12 0 0 BITMAP -6180 -3F00 -0C00 -0C00 -1F80 -6CC0 +CC80 CCC0 -CD80 -7E00 -0C00 -0CC0 -0FC0 +CCC0 +CCC0 +CCC0 +EDC0 +FF80 +E000 +C000 +C000 +C000 +C000 ENDCHAR -STARTCHAR 0x1253 -ENCODING 4691 +STARTCHAR `so/s2o +ENCODING 4646 SWIDTH 960 0 DWIDTH 16 0 BBX 10 12 0 0 BITMAP -6180 -3F00 -0C00 -0C00 -1F80 -6CC0 CCC0 -CD80 -7E00 -0C00 +CCC0 +CCC0 +CCC0 +CCC0 +EDC0 +7F80 +1C00 1800 -3000 +3800 +7000 +6000 ENDCHAR -STARTCHAR 0x1254 -ENCODING 4692 +STARTCHAR `sWa/s2Wa +ENCODING 4647 SWIDTH 960 0 DWIDTH 16 0 -BBX 10 12 0 0 +BBX 14 14 0 -2 BITMAP -6180 -3F00 -0C00 -1F80 -6CC0 +CC80 CCC0 -CD80 -7E00 -0C00 -0F80 -0CC0 -0F80 +CCC0 +CCC0 +CCC0 +EDC0 +7FC0 +00C0 +00C0 +00C0 +00C0 +00C0 +07F8 +0E1C ENDCHAR -STARTCHAR 0x1255 -ENCODING 4693 +STARTCHAR re +ENCODING 4648 SWIDTH 960 0 DWIDTH 16 0 -BBX 11 12 0 0 +BBX 8 12 0 0 BITMAP -C300 -7E00 -1800 -1E00 -0600 -0FC0 -3660 -6660 -66C0 -3F00 -0600 -0600 +0C +0C +0C +18 +38 +70 +E0 +C0 +C0 +E3 +7F +3F ENDCHAR -STARTCHAR 0x1256 -ENCODING 4694 +STARTCHAR ru +ENCODING 4649 SWIDTH 960 0 DWIDTH 16 0 BBX 10 12 0 0 BITMAP -60C0 -3F80 -0900 -0B00 -0C00 -1F80 -6CC0 -CCC0 -CD80 -7E00 0C00 0C00 +1C00 +3800 +7000 +6000 +C000 +E000 +7FC0 +3FC0 +0600 +0600 ENDCHAR -STARTCHAR 0x1258 -ENCODING 4696 +STARTCHAR ri +ENCODING 4650 SWIDTH 960 0 DWIDTH 16 0 -BBX 11 12 0 0 +BBX 9 12 0 0 BITMAP -6180 -3F00 0C00 -1F80 -6CC0 -CCC0 -CD80 -7E00 -0FC0 -0D60 -0DC0 0C00 +0C00 +1800 +3800 +7000 +E000 +C300 +C380 +E180 +7F00 +3E00 ENDCHAR -STARTCHAR 0x125A -ENCODING 4698 +STARTCHAR ra +ENCODING 4651 SWIDTH 960 0 DWIDTH 16 0 -BBX 14 12 0 0 +BBX 11 12 0 0 BITMAP -6180 -3F00 -0C00 0C00 -1F80 -6CD8 -CCD8 -CDF8 -7E0C -0C0C 0C00 0C00 +1800 +3800 +7000 +E000 +C1E0 +C3E0 +E660 +7E00 +3C00 ENDCHAR -STARTCHAR 0x125B -ENCODING 4699 +STARTCHAR rE +ENCODING 4652 SWIDTH 960 0 DWIDTH 16 0 -BBX 10 14 0 0 +BBX 10 12 0 0 BITMAP -6180 -3F00 0C00 0C00 -1F80 -6CC0 -CCC0 -CD80 -7E00 -0C00 -0C00 0C00 -3F00 -6180 +1800 +3800 +7000 +E000 +C000 +C000 +E780 +7CC0 +3F80 ENDCHAR -STARTCHAR 0x125C -ENCODING 4700 +STARTCHAR r +ENCODING 4653 SWIDTH 960 0 DWIDTH 16 0 -BBX 10 14 0 -2 +BBX 8 11 0 0 BITMAP -6180 -3F00 -0C00 -0C00 -1F80 -6CC0 -CCC0 -CD80 -7E00 -0C00 -0F80 -0CC0 -3F80 -6000 +3F +7F +C3 +C0 +C0 +C0 +C0 +C0 +C3 +FF +7E ENDCHAR -STARTCHAR 0x125D -ENCODING 4701 +STARTCHAR ro +ENCODING 4654 SWIDTH 960 0 DWIDTH 16 0 -BBX 14 12 0 0 +BBX 10 11 0 0 BITMAP -6180 -3F00 -0C30 -0C30 -1FFC -6CCC -CCC0 -CD80 +3F80 +7CC0 +C780 +C000 +C000 +C000 +C000 +C000 +C300 +FF00 7E00 -0C00 +ENDCHAR +STARTCHAR rWa +ENCODING 4655 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 11 13 0 -2 +BITMAP +C0C0 +7380 0C00 0C00 +1800 +3800 +7000 +E000 +C1E0 +C3E0 +E660 +7E00 +3C00 ENDCHAR -STARTCHAR 0x1260 -ENCODING 4704 +STARTCHAR se +ENCODING 4656 SWIDTH 960 0 DWIDTH 16 0 -BBX 7 11 0 0 +BBX 7 12 0 0 BITMAP +10 +10 38 7C C6 @@ -30084,14 +30694,15 @@ C6 C6 C6 -C6 ENDCHAR -STARTCHAR 0x1261 -ENCODING 4705 +STARTCHAR su +ENCODING 4657 SWIDTH 960 0 DWIDTH 16 0 -BBX 11 11 0 0 +BBX 11 12 0 0 BITMAP +1000 +1000 3800 7C00 C600 @@ -30099,17 +30710,18 @@ C600 C7E0 C660 -C660 C600 C600 C600 ENDCHAR -STARTCHAR 0x1262 -ENCODING 4706 +STARTCHAR si +ENCODING 4658 SWIDTH 960 0 DWIDTH 16 0 -BBX 11 11 0 0 +BBX 11 12 0 0 BITMAP +1000 +1000 3800 7C00 C600 @@ -30118,16 +30730,17 @@ C600 C600 C600 -C600 C660 C7E0 ENDCHAR -STARTCHAR 0x1263 -ENCODING 4707 +STARTCHAR sa +ENCODING 4659 SWIDTH 960 0 DWIDTH 16 0 -BBX 7 11 0 0 +BBX 7 12 0 0 BITMAP +10 +10 38 7C C6 @@ -30138,50 +30751,52 @@ 06 06 06 -06 ENDCHAR -STARTCHAR 0x1264 -ENCODING 4708 +STARTCHAR sE +ENCODING 4660 SWIDTH 960 0 DWIDTH 16 0 -BBX 11 11 0 0 +BBX 10 12 0 0 BITMAP +1000 +1000 3800 7C00 C600 C600 C600 -C600 -C600 C600 -C7C0 -C660 +C700 +C680 +C640 C7C0 ENDCHAR -STARTCHAR 0x1265 -ENCODING 4709 +STARTCHAR s +ENCODING 4661 SWIDTH 960 0 DWIDTH 16 0 -BBX 11 11 0 0 +BBX 8 11 0 0 BITMAP -0380 -07C0 -0C60 -0C60 -0C60 -FC60 -CC60 -CC60 -0C60 -0C60 -0C60 +30 +18 +1C +3E +63 +63 +63 +63 +63 +63 +63 ENDCHAR -STARTCHAR 0x1266 -ENCODING 4710 +STARTCHAR so +ENCODING 4662 SWIDTH 960 0 DWIDTH 16 0 -BBX 7 11 0 0 +BBX 7 12 0 0 BITMAP +10 +10 38 7C C6 @@ -30192,14 +30807,15 @@ C0 C0 C0 -C0 ENDCHAR -STARTCHAR 0x1267 -ENCODING 4711 +STARTCHAR sWa +ENCODING 4663 SWIDTH 960 0 DWIDTH 16 0 -BBX 10 13 0 -2 +BBX 10 14 0 -2 BITMAP +1000 +1000 3800 7C00 C600 @@ -30210,19 +30826,18 @@ 0600 0600 0600 -0600 1F80 30C0 ENDCHAR -STARTCHAR 0x1268 -ENCODING 4712 +STARTCHAR xe +ENCODING 4664 SWIDTH 960 0 DWIDTH 16 0 BBX 9 12 0 0 BITMAP C180 7F00 -0000 +0800 1C00 3E00 6300 @@ -30233,15 +30848,15 @@ 6300 6300 ENDCHAR -STARTCHAR 0x1269 -ENCODING 4713 +STARTCHAR xu +ENCODING 4665 SWIDTH 960 0 DWIDTH 16 0 BBX 12 12 0 0 BITMAP C180 7F00 -0000 +0800 1C00 3E00 6300 @@ -30252,15 +30867,15 @@ 6300 6300 ENDCHAR -STARTCHAR 0x126A -ENCODING 4714 +STARTCHAR xi +ENCODING 4666 SWIDTH 960 0 DWIDTH 16 0 BBX 12 12 0 0 BITMAP C180 7F00 -0000 +0800 1C00 3E00 6300 @@ -30271,34 +30886,34 @@ 6330 63F0 ENDCHAR -STARTCHAR 0x126B -ENCODING 4715 +STARTCHAR xa +ENCODING 4667 SWIDTH 960 0 DWIDTH 16 0 BBX 9 12 0 0 BITMAP C180 7F00 -0000 +0800 1C00 3E00 6300 6300 6300 6300 -6300 0300 0300 +0300 ENDCHAR -STARTCHAR 0x126C -ENCODING 4716 +STARTCHAR xE +ENCODING 4668 SWIDTH 960 0 DWIDTH 16 0 BBX 12 12 0 0 BITMAP C180 7F00 -0000 +0800 1C00 3E00 6300 @@ -30309,53 +30924,53 @@ 6330 63E0 ENDCHAR -STARTCHAR 0x126D -ENCODING 4717 +STARTCHAR x +ENCODING 4669 SWIDTH 960 0 DWIDTH 16 0 -BBX 12 12 0 0 +BBX 9 12 0 0 BITMAP -1830 -0FE0 -0000 -0380 -07C0 -0C60 -0C60 -FC60 -CC60 -CC60 -0C60 -0C60 +C300 +7E00 +0C00 +0E00 +1F00 +1980 +3180 +3180 +3180 +3180 +3180 +3180 ENDCHAR -STARTCHAR 0x126E -ENCODING 4718 +STARTCHAR xo +ENCODING 4670 SWIDTH 960 0 DWIDTH 16 0 BBX 9 12 0 0 BITMAP C180 7F00 -0000 +0800 1C00 3E00 6300 6300 6300 6300 -6300 6000 6000 +6000 ENDCHAR -STARTCHAR 0x126F -ENCODING 4719 +STARTCHAR xWa +ENCODING 4671 SWIDTH 960 0 DWIDTH 16 0 BBX 11 14 0 -2 BITMAP C180 7F00 -0000 +0800 1C00 3E00 6300 @@ -30368,3456 +30983,3244 @@ 0FC0 1860 ENDCHAR -STARTCHAR 0x1270 -ENCODING 4720 +STARTCHAR qe +ENCODING 4672 SWIDTH 960 0 DWIDTH 16 0 -BBX 12 12 0 0 +BBX 10 12 0 0 BITMAP -0E00 -0600 -0600 -0600 -7FE0 -FFF0 -C630 -0600 -0600 -0600 -0600 -0600 +0C00 +0C00 +0C00 +1F80 +6CC0 +CCC0 +CD80 +7E00 +0C00 +0C00 +0C00 +0C00 ENDCHAR -STARTCHAR 0x1271 -ENCODING 4721 +STARTCHAR qu +ENCODING 4673 SWIDTH 960 0 DWIDTH 16 0 -BBX 12 12 0 0 +BBX 10 12 0 0 BITMAP -0E00 -0600 -0600 -0600 -7FE0 -FFF0 -C630 -0600 -07E0 -0660 -0600 -0600 +0C00 +0C00 +0C00 +1F80 +6CC0 +CCC0 +CD80 +7E00 +0C00 +0FC0 +0CC0 +0C00 ENDCHAR -STARTCHAR 0x1272 -ENCODING 4722 +STARTCHAR qi +ENCODING 4674 SWIDTH 960 0 DWIDTH 16 0 -BBX 12 12 0 0 +BBX 10 12 0 0 BITMAP -0E00 -0600 -0600 -0600 -7FE0 -FFF0 -C630 -0600 -0600 -0600 -0660 -07E0 +0C00 +0C00 +0C00 +1F80 +6CC0 +CCC0 +CD80 +7E00 +0C00 +0C00 +0CC0 +0FC0 ENDCHAR -STARTCHAR 0x1273 -ENCODING 4723 +STARTCHAR qa +ENCODING 4675 SWIDTH 960 0 DWIDTH 16 0 -BBX 12 12 0 0 +BBX 10 12 0 0 BITMAP -0E00 -0600 -0600 -0600 -7FE0 -FFF0 -C630 -0600 -0600 -0E00 -1C00 -3800 +0C00 +0C00 +0C00 +1F80 +6CC0 +CCC0 +CD80 +7E00 +0C00 +1800 +3000 +6000 ENDCHAR -STARTCHAR 0x1274 -ENCODING 4724 +STARTCHAR qE +ENCODING 4676 SWIDTH 960 0 DWIDTH 16 0 -BBX 12 12 0 0 +BBX 10 12 0 0 BITMAP -0E00 -0600 -0600 -0600 -7FE0 -FFF0 -C630 -0600 -0600 -07C0 -0660 -07C0 +0C00 +0C00 +0C00 +1F80 +6CC0 +CCC0 +CD80 +7E00 +0C00 +0F80 +0CC0 +0F80 ENDCHAR -STARTCHAR 0x1275 -ENCODING 4725 +STARTCHAR q +ENCODING 4677 SWIDTH 960 0 DWIDTH 16 0 -BBX 12 12 0 0 +BBX 10 12 0 0 BITMAP -1800 -1C00 -0E00 -0600 -0600 -7FE0 -FFF0 -C630 -0600 -0600 -0600 -0600 +3000 +3000 +3C00 +0C00 +1F80 +6CC0 +CCC0 +CD80 +7E00 +0C00 +0C00 +0C00 ENDCHAR -STARTCHAR 0x1276 -ENCODING 4726 +STARTCHAR qo +ENCODING 4678 SWIDTH 960 0 DWIDTH 16 0 -BBX 12 12 0 0 +BBX 10 12 0 0 BITMAP -0F80 -0C80 -0580 -0600 -7FE0 -FFF0 -C630 -0600 -0600 -0600 -0600 -0600 +0700 +0980 +0B00 +0C00 +1F80 +6CC0 +CCC0 +CD80 +7E00 +0C00 +0C00 +0C00 ENDCHAR -STARTCHAR 0x1277 -ENCODING 4727 +STARTCHAR qWe +ENCODING 4680 SWIDTH 960 0 DWIDTH 16 0 -BBX 12 14 0 -2 +BBX 11 12 0 0 BITMAP -0E00 -0600 -0600 -0600 -7FE0 -FFF0 -C630 -0600 -0600 -0600 -0600 -0600 +0C00 +0C00 +0C00 1F80 -30C0 +6CC0 +CCC0 +CD80 +7E00 +0FC0 +0D60 +0DC0 +0C00 ENDCHAR -STARTCHAR 0x1278 -ENCODING 4728 +STARTCHAR qWi +ENCODING 4682 SWIDTH 960 0 DWIDTH 16 0 -BBX 12 12 0 0 +BBX 14 12 0 0 BITMAP -6060 -7FE0 -FFF0 -C630 -0600 -7FE0 -FFF0 -C630 -0600 -0600 -0600 -0600 +0C00 +0C00 +0C00 +1F80 +6CD8 +CCD8 +CDF8 +7E0C +0C0C +0C00 +0C00 +0C00 ENDCHAR -STARTCHAR 0x1279 -ENCODING 4729 +STARTCHAR qWa +ENCODING 4683 SWIDTH 960 0 DWIDTH 16 0 -BBX 12 12 0 0 +BBX 10 14 0 -2 BITMAP -6060 -7FE0 -FFF0 -C630 -0600 -7FE0 -FFF0 -C630 -0600 -07E0 -0660 -0600 +0C00 +0C00 +0C00 +1F80 +6CC0 +CCC0 +CD80 +7E00 +0C00 +0C00 +0C00 +0C00 +3F00 +6180 ENDCHAR -STARTCHAR 0x127A -ENCODING 4730 +STARTCHAR qWE +ENCODING 4684 SWIDTH 960 0 DWIDTH 16 0 -BBX 12 12 0 0 +BBX 10 14 0 -2 BITMAP -6060 -7FE0 -FFF0 -C630 -0600 -7FE0 -FFF0 -C630 -0600 -0600 -0660 -07E0 -ENDCHAR -STARTCHAR 0x127B -ENCODING 4731 -SWIDTH 960 0 -DWIDTH 16 0 -BBX 12 12 0 0 -BITMAP -6060 -7FE0 -FFF0 -C630 -0600 -7FE0 -FFF0 -C630 -0600 -0E00 -1C00 -3800 +0C00 +0C00 +0C00 +1F80 +6CC0 +CCC0 +CD80 +7E00 +0C00 +0C00 +0F80 +0CC0 +3F80 +6000 ENDCHAR -STARTCHAR 0x127C -ENCODING 4732 +STARTCHAR qWu/qW +ENCODING 4685 SWIDTH 960 0 DWIDTH 16 0 -BBX 12 12 0 0 +BBX 14 12 0 0 BITMAP -6060 -7FE0 -FFF0 -C630 -0600 -7FE0 -FFF0 -C630 -0600 -07C0 -0660 -07C0 +0C00 +0C30 +0C30 +1FFC +6CCC +CCC0 +CD80 +7E00 +0C00 +0C00 +0C00 +0C00 ENDCHAR -STARTCHAR 0x127D -ENCODING 4733 +STARTCHAR Qe +ENCODING 4688 SWIDTH 960 0 DWIDTH 16 0 -BBX 13 12 0 0 +BBX 10 12 0 0 BITMAP 6180 -7F80 -FFC0 +3F00 +0C00 +0C00 +1F80 +6CC0 CCC0 -0E00 -0300 -3FF0 -7FF8 -6318 -0300 -0300 -0300 -ENDCHAR -STARTCHAR 0x127E -ENCODING 4734 -SWIDTH 960 0 -DWIDTH 16 0 -BBX 12 12 0 0 -BITMAP -30C0 -7FE0 -6960 -0900 -0600 -7FE0 -FFF0 -C630 -0600 -0600 -0600 -0600 +CD80 +7E00 +0C00 +0C00 +0C00 ENDCHAR -STARTCHAR 0x127F -ENCODING 4735 +STARTCHAR Qu +ENCODING 4689 SWIDTH 960 0 DWIDTH 16 0 -BBX 12 14 0 -2 +BBX 10 12 0 0 BITMAP -6060 -7FE0 -FFF0 -C630 -0600 -7FE0 -FFF0 -C630 -0600 -0600 -0600 -0600 +6180 +3F00 +0C00 +0C00 1F80 -30C0 -ENDCHAR -STARTCHAR 0x1280 -ENCODING 4736 -SWIDTH 960 0 -DWIDTH 16 0 -BBX 8 12 0 0 -BITMAP -0C -0C -0C -FC -CF -03 -03 -03 -03 -03 -03 -03 +6CC0 +CCC0 +CD80 +7E00 +0C00 +0FC0 +0CC0 ENDCHAR -STARTCHAR 0x1281 -ENCODING 4737 +STARTCHAR Qi +ENCODING 4690 SWIDTH 960 0 DWIDTH 16 0 -BBX 12 12 0 0 +BBX 10 12 0 0 BITMAP +6180 +3F00 0C00 0C00 +1F80 +6CC0 +CCC0 +CD80 +7E00 0C00 -FC00 -CF00 -0300 -0300 -03F0 -0330 -0300 -0300 -0300 +0CC0 +0FC0 ENDCHAR -STARTCHAR 0x1282 -ENCODING 4738 +STARTCHAR Qa +ENCODING 4691 SWIDTH 960 0 DWIDTH 16 0 -BBX 12 12 0 0 +BBX 10 12 0 0 BITMAP +6180 +3F00 0C00 0C00 +1F80 +6CC0 +CCC0 +CD80 +7E00 0C00 -FC00 -CF00 -0300 -0300 -0300 -0300 -0300 -0330 -03F0 -ENDCHAR -STARTCHAR 0x1283 -ENCODING 4739 -SWIDTH 960 0 -DWIDTH 16 0 -BBX 8 12 0 0 -BITMAP -0C -0C -0C -FC -CF -03 -03 -03 -0E -18 -30 -30 +1800 +3000 ENDCHAR -STARTCHAR 0x1284 -ENCODING 4740 +STARTCHAR QE +ENCODING 4692 SWIDTH 960 0 DWIDTH 16 0 -BBX 12 12 0 0 +BBX 10 12 0 0 BITMAP -0C00 +6180 +3F00 0C00 +1F80 +6CC0 +CCC0 +CD80 +7E00 0C00 -FC00 -CF00 -0300 -0300 -0300 -0300 -03E0 -0330 -03E0 +0F80 +0CC0 +0F80 ENDCHAR -STARTCHAR 0x1285 -ENCODING 4741 +STARTCHAR Q +ENCODING 4693 SWIDTH 960 0 DWIDTH 16 0 -BBX 8 12 0 0 +BBX 11 12 0 0 BITMAP -0C -0C -0C -3C -6F -C3 -C3 -03 -03 -03 -03 -03 +C300 +7E00 +1800 +1E00 +0600 +0FC0 +3660 +6660 +66C0 +3F00 +0600 +0600 ENDCHAR -STARTCHAR 0x1286 -ENCODING 4742 +STARTCHAR Qo +ENCODING 4694 SWIDTH 960 0 DWIDTH 16 0 -BBX 12 12 0 0 +BBX 10 12 0 0 BITMAP -07E0 -0F90 -18E0 -F800 -D800 -1800 +60C0 +3F80 +0900 +0B00 +0C00 1F80 -0F80 -0180 -0180 -0180 -0180 +6CC0 +CCC0 +CD80 +7E00 +0C00 +0C00 ENDCHAR -STARTCHAR 0x1288 -ENCODING 4744 +STARTCHAR QWe +ENCODING 4696 SWIDTH 960 0 DWIDTH 16 0 -BBX 13 12 0 0 +BBX 11 12 0 0 BITMAP -0C00 +6180 +3F00 0C00 +1F80 +6CC0 +CCC0 +CD80 +7E00 +0FC0 +0D60 +0DC0 0C00 -FC00 -CF00 -0300 -03F0 -0358 -0370 -0300 -0300 -0300 ENDCHAR -STARTCHAR 0x128A -ENCODING 4746 +STARTCHAR QWi +ENCODING 4698 SWIDTH 960 0 DWIDTH 16 0 -BBX 13 12 0 0 +BBX 14 12 0 0 BITMAP +6180 +3F00 0C00 0C00 +1F80 +6CD8 +CCD8 +CDF8 +7E0C +0C0C 0C00 -FC00 -CF00 -0330 -0330 -03F0 -0318 -0318 -0300 -0300 +0C00 ENDCHAR -STARTCHAR 0x128B -ENCODING 4747 +STARTCHAR QWa +ENCODING 4699 SWIDTH 960 0 DWIDTH 16 0 -BBX 11 14 0 -2 +BBX 10 14 0 0 BITMAP +6180 +3F00 +0C00 0C00 +1F80 +6CC0 +CCC0 +CD80 +7E00 0C00 0C00 -FC00 -CF00 -0300 -0300 -0300 -0300 -0300 -0300 -0300 -0FC0 -1860 +0C00 +3F00 +6180 ENDCHAR -STARTCHAR 0x128C -ENCODING 4748 +STARTCHAR QWE +ENCODING 4700 SWIDTH 960 0 DWIDTH 16 0 -BBX 12 14 0 -2 +BBX 10 14 0 -2 BITMAP +6180 +3F00 0C00 0C00 +1F80 +6CC0 +CCC0 +CD80 +7E00 0C00 -FC00 -CF00 -0300 -0300 -0300 -0300 -0300 -03E0 -0330 -0FE0 -1800 +0F80 +0CC0 +3F80 +6000 ENDCHAR -STARTCHAR 0x128D -ENCODING 4749 +STARTCHAR QWu/QW +ENCODING 4701 SWIDTH 960 0 DWIDTH 16 0 -BBX 13 12 0 0 +BBX 14 12 0 0 BITMAP +6180 +3F00 +0C30 +0C30 +1FFC +6CCC +CCC0 +CD80 +7E00 0C00 0C00 0C00 -FC60 -CF60 -03F8 -0318 -0300 -0300 -0300 -0300 -0300 ENDCHAR -STARTCHAR 0x1290 -ENCODING 4752 +STARTCHAR be +ENCODING 4704 SWIDTH 960 0 DWIDTH 16 0 -BBX 5 12 0 0 +BBX 7 11 0 0 BITMAP -C0 -C0 -C0 -F0 38 -30 -30 -30 -60 -60 -60 -60 +7C +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 ENDCHAR -STARTCHAR 0x1291 -ENCODING 4753 +STARTCHAR bu +ENCODING 4705 SWIDTH 960 0 DWIDTH 16 0 -BBX 7 12 0 0 +BBX 11 11 0 0 BITMAP -C0 -C0 -C0 -F0 -38 -30 -30 -3E -66 -60 -60 -60 +3800 +7C00 +C600 +C600 +C600 +C7E0 +C660 +C660 +C600 +C600 +C600 ENDCHAR -STARTCHAR 0x1292 -ENCODING 4754 +STARTCHAR bi +ENCODING 4706 SWIDTH 960 0 DWIDTH 16 0 -BBX 7 12 0 0 +BBX 11 11 0 0 BITMAP -C0 -C0 -C0 -F0 -38 -30 -30 -30 -60 -60 -66 -7E +3800 +7C00 +C600 +C600 +C600 +C600 +C600 +C600 +C600 +C660 +C7E0 ENDCHAR -STARTCHAR 0x1293 -ENCODING 4755 +STARTCHAR ba +ENCODING 4707 SWIDTH 960 0 DWIDTH 16 0 -BBX 9 12 0 0 +BBX 7 11 0 0 BITMAP -1F00 -3F80 -6180 -C000 -E000 -7C00 -0E00 -0600 -0400 -0C00 -0C00 -0C00 +38 +7C +C6 +C6 +C6 +C6 +C6 +06 +06 +06 +06 ENDCHAR -STARTCHAR 0x1294 -ENCODING 4756 +STARTCHAR bE +ENCODING 4708 SWIDTH 960 0 DWIDTH 16 0 -BBX 6 12 0 0 +BBX 11 11 0 0 BITMAP -C0 -C0 -C0 -F0 -38 -30 -30 -30 -78 -64 -6C -78 +3800 +7C00 +C600 +C600 +C600 +C600 +C600 +C600 +C7C0 +C660 +C7C0 ENDCHAR -STARTCHAR 0x1295 -ENCODING 4757 +STARTCHAR b +ENCODING 4709 SWIDTH 960 0 DWIDTH 16 0 -BBX 8 12 0 0 +BBX 11 11 0 0 BITMAP -FF -FE +0380 +07C0 +0C60 +0C60 +0C60 +FC60 +CC60 +CC60 +0C60 +0C60 +0C60 +ENDCHAR +STARTCHAR bo +ENCODING 4710 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 7 11 0 0 +BITMAP +38 +7C C6 -0C -1F -03 -06 -0C -0C -18 -18 -30 +C6 +C6 +C6 +C6 +C0 +C0 +C0 +C0 ENDCHAR -STARTCHAR 0x1296 -ENCODING 4758 +STARTCHAR bWa +ENCODING 4711 SWIDTH 960 0 DWIDTH 16 0 -BBX 11 12 0 0 +BBX 10 13 0 -2 BITMAP -1FC0 -3F20 -6160 -C0C0 -E000 +3800 7C00 -0E00 +C600 +C600 +C600 +C600 +C600 0600 -0400 -0C00 -0C00 -0C00 +0600 +0600 +0600 +1F80 +30C0 ENDCHAR -STARTCHAR 0x1297 -ENCODING 4759 +STARTCHAR ve +ENCODING 4712 SWIDTH 960 0 DWIDTH 16 0 -BBX 9 13 0 -2 +BBX 9 12 0 0 BITMAP -1F00 -3F80 -6180 -C000 -E000 -7C00 -0E00 -0600 -0400 -0C00 -0C00 -3F00 -6180 +C180 +7F00 +0000 +1C00 +3E00 +6300 +6300 +6300 +6300 +6300 +6300 +6300 ENDCHAR -STARTCHAR 0x1298 -ENCODING 4760 +STARTCHAR vu +ENCODING 4713 SWIDTH 960 0 DWIDTH 16 0 -BBX 10 12 0 0 +BBX 12 12 0 0 BITMAP -6180 -FFC0 -8C40 -0C00 -0F00 -0380 -0300 -0300 -0600 -0600 -0600 -0600 +C180 +7F00 +0000 +1C00 +3E00 +6300 +6300 +63F0 +6330 +6330 +6300 +6300 ENDCHAR -STARTCHAR 0x1299 -ENCODING 4761 +STARTCHAR vi +ENCODING 4714 SWIDTH 960 0 DWIDTH 16 0 -BBX 11 12 0 0 +BBX 12 12 0 0 BITMAP -6180 -FFC0 -8C40 -0C00 -0F00 -0380 -0300 -03E0 -0660 -0600 -0600 -0600 +C180 +7F00 +0000 +1C00 +3E00 +6300 +6300 +6300 +6300 +6300 +6330 +63F0 ENDCHAR -STARTCHAR 0x129A -ENCODING 4762 +STARTCHAR va +ENCODING 4715 SWIDTH 960 0 DWIDTH 16 0 -BBX 11 12 0 0 +BBX 9 12 0 0 BITMAP -6180 -FFC0 -8C40 -0C00 -0F00 -0380 +C180 +7F00 +0000 +1C00 +3E00 +6300 +6300 +6300 +6300 +6300 0300 0300 -0600 -0600 -0660 -07E0 ENDCHAR -STARTCHAR 0x129B -ENCODING 4763 +STARTCHAR vE +ENCODING 4716 SWIDTH 960 0 DWIDTH 16 0 -BBX 11 13 0 0 +BBX 12 12 0 0 BITMAP -30C0 -7FE0 -4620 -1F00 -3F80 -6180 -C000 -E000 -7C00 -0E00 -0600 -0C00 -0C00 +C180 +7F00 +0000 +1C00 +3E00 +6300 +6300 +6300 +6300 +63E0 +6330 +63E0 ENDCHAR -STARTCHAR 0x129C -ENCODING 4764 +STARTCHAR v +ENCODING 4717 SWIDTH 960 0 DWIDTH 16 0 -BBX 10 12 0 0 +BBX 12 12 0 0 BITMAP -6180 -FFC0 -8C40 -0C00 -0F00 +1830 +0FE0 +0000 0380 -0300 -0300 -0780 -0640 -06C0 -0780 +07C0 +0C60 +0C60 +FC60 +CC60 +CC60 +0C60 +0C60 ENDCHAR -STARTCHAR 0x129D -ENCODING 4765 +STARTCHAR vo +ENCODING 4718 SWIDTH 960 0 DWIDTH 16 0 -BBX 10 13 0 0 +BBX 9 12 0 0 BITMAP -6180 -FFC0 -8C40 -3F80 +C180 7F00 +0000 +1C00 +3E00 6300 -0600 -0F80 -0180 +6300 +6300 +6300 +6300 +6000 +6000 +ENDCHAR +STARTCHAR vWa +ENCODING 4719 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 11 14 0 -2 +BITMAP +C180 +7F00 +0000 +1C00 +3E00 +6300 +6300 +6300 +6300 +6300 0300 -0600 -0600 -0600 +0300 +0FC0 +1860 ENDCHAR -STARTCHAR 0x129E -ENCODING 4766 +STARTCHAR te +ENCODING 4720 SWIDTH 960 0 DWIDTH 16 0 -BBX 11 13 0 0 +BBX 12 12 0 0 BITMAP -3180 -7FC0 -4440 -1FC0 -3F20 -6160 -C0C0 -E000 -7C00 0E00 0600 -0C00 -0C00 +0600 +0600 +7FE0 +FFF0 +C630 +0600 +0600 +0600 +0600 +0600 ENDCHAR -STARTCHAR 0x129F -ENCODING 4767 +STARTCHAR tu +ENCODING 4721 SWIDTH 960 0 DWIDTH 16 0 -BBX 11 15 0 -2 +BBX 12 12 0 0 BITMAP -30C0 -7FE0 -4620 -1F00 -3F80 -6180 -C000 -E000 -7C00 0E00 0600 -0C00 -0C00 -3F00 -6180 +0600 +0600 +7FE0 +FFF0 +C630 +0600 +07E0 +0660 +0600 +0600 ENDCHAR -STARTCHAR 0x12A0 -ENCODING 4768 +STARTCHAR ti +ENCODING 4722 SWIDTH 960 0 DWIDTH 16 0 -BBX 7 12 0 0 +BBX 12 12 0 0 BITMAP -60 -60 -60 -78 -18 -38 -3C -6E -E6 -C6 -C6 -C6 +0E00 +0600 +0600 +0600 +7FE0 +FFF0 +C630 +0600 +0600 +0600 +0660 +07E0 ENDCHAR -STARTCHAR 0x12A1 -ENCODING 4769 +STARTCHAR ta +ENCODING 4723 SWIDTH 960 0 DWIDTH 16 0 -BBX 11 12 0 0 +BBX 12 12 0 0 BITMAP -6000 -6000 -6000 -7800 -1800 +0E00 +0600 +0600 +0600 +7FE0 +FFF0 +C630 +0600 +0600 +0E00 +1C00 3800 -3C00 -6E00 -E7E0 -C660 -C600 -C600 ENDCHAR -STARTCHAR 0x12A2 -ENCODING 4770 +STARTCHAR tE +ENCODING 4724 SWIDTH 960 0 DWIDTH 16 0 -BBX 11 12 0 0 +BBX 12 12 0 0 BITMAP -6000 -6000 -6000 -7800 -1800 -3800 -3C00 -6E00 -E600 -C600 -C660 -C7E0 +0E00 +0600 +0600 +0600 +7FE0 +FFF0 +C630 +0600 +0600 +07C0 +0660 +07C0 ENDCHAR -STARTCHAR 0x12A3 -ENCODING 4771 +STARTCHAR t +ENCODING 4725 SWIDTH 960 0 DWIDTH 16 0 -BBX 7 12 0 0 +BBX 12 12 0 0 BITMAP -60 -60 -60 -78 -18 -3C -6E -C6 -C6 -C6 -06 -06 +1800 +1C00 +0E00 +0600 +0600 +7FE0 +FFF0 +C630 +0600 +0600 +0600 +0600 ENDCHAR -STARTCHAR 0x12A4 -ENCODING 4772 +STARTCHAR to +ENCODING 4726 SWIDTH 960 0 DWIDTH 16 0 -BBX 11 12 0 0 +BBX 12 12 0 0 BITMAP -6000 -6000 -6000 -7800 -1800 -3800 -3C00 -6E00 -E600 -C7C0 -C660 -C7C0 +0F80 +0C80 +0580 +0600 +7FE0 +FFF0 +C630 +0600 +0600 +0600 +0600 +0600 ENDCHAR -STARTCHAR 0x12A5 -ENCODING 4773 +STARTCHAR tWa +ENCODING 4727 SWIDTH 960 0 DWIDTH 16 0 -BBX 7 12 0 0 +BBX 12 14 0 -2 BITMAP -C0 -C0 -E0 -60 -30 -38 -7C -EE -C6 -C6 -C6 -C6 +0E00 +0600 +0600 +0600 +7FE0 +FFF0 +C630 +0600 +0600 +0600 +0600 +0600 +1F80 +30C0 ENDCHAR -STARTCHAR 0x12A6 -ENCODING 4774 +STARTCHAR ce +ENCODING 4728 SWIDTH 960 0 DWIDTH 16 0 -BBX 7 12 0 0 +BBX 12 12 0 0 BITMAP -60 -60 -60 -78 -18 -3C -6E -C6 -C6 -C6 -C0 -C0 +6060 +7FE0 +FFF0 +C630 +0600 +7FE0 +FFF0 +C630 +0600 +0600 +0600 +0600 ENDCHAR -STARTCHAR 0x12A7 -ENCODING 4775 +STARTCHAR cu +ENCODING 4729 SWIDTH 960 0 DWIDTH 16 0 -BBX 9 13 0 0 +BBX 12 12 0 0 BITMAP -6300 -7F00 -D980 -1800 -1E00 +6060 +7FE0 +FFF0 +C630 0600 -0E00 -0F00 -1B80 -3980 -3180 -3180 -3180 +7FE0 +FFF0 +C630 +0600 +07E0 +0660 +0600 ENDCHAR -STARTCHAR 0x12A8 -ENCODING 4776 +STARTCHAR ci +ENCODING 4730 SWIDTH 960 0 DWIDTH 16 0 -BBX 9 11 0 0 +BBX 12 12 0 0 BITMAP -C000 -CE00 -FF00 -F180 -3180 -3180 -3180 -3180 -3180 -3180 -3180 +6060 +7FE0 +FFF0 +C630 +0600 +7FE0 +FFF0 +C630 +0600 +0600 +0660 +07E0 ENDCHAR -STARTCHAR 0x12A9 -ENCODING 4777 +STARTCHAR ca +ENCODING 4731 SWIDTH 960 0 DWIDTH 16 0 -BBX 13 11 0 0 +BBX 12 12 0 0 BITMAP -C000 -CE00 -FF00 -F180 -3180 -3180 -31F8 -3198 -3180 -3180 -3180 +6060 +7FE0 +FFF0 +C630 +0600 +7FE0 +FFF0 +C630 +0600 +0E00 +1C00 +3800 ENDCHAR -STARTCHAR 0x12AA -ENCODING 4778 +STARTCHAR cE +ENCODING 4732 SWIDTH 960 0 DWIDTH 16 0 -BBX 13 11 0 0 +BBX 12 12 0 0 BITMAP -C000 -CE00 -FF00 -F180 -3180 -3180 -3180 -3180 -3180 -3198 -31F8 +6060 +7FE0 +FFF0 +C630 +0600 +7FE0 +FFF0 +C630 +0600 +07C0 +0660 +07C0 ENDCHAR -STARTCHAR 0x12AB -ENCODING 4779 +STARTCHAR c +ENCODING 4733 SWIDTH 960 0 DWIDTH 16 0 -BBX 9 11 0 0 +BBX 13 12 0 0 BITMAP -C000 -CE00 -FF00 -F180 -3180 -3180 -3180 -3180 -0180 -0180 -0180 +6180 +7F80 +FFC0 +CCC0 +0E00 +0300 +3FF0 +7FF8 +6318 +0300 +0300 +0300 ENDCHAR -STARTCHAR 0x12AC -ENCODING 4780 +STARTCHAR co +ENCODING 4734 SWIDTH 960 0 DWIDTH 16 0 -BBX 13 11 0 0 +BBX 12 12 0 0 BITMAP -C000 -CE00 -FF00 -F180 -3180 -3180 -3180 -3180 -31F0 -3198 -31F0 +30C0 +7FE0 +6960 +0900 +0600 +7FE0 +FFF0 +C630 +0600 +0600 +0600 +0600 ENDCHAR -STARTCHAR 0x12AD -ENCODING 4781 +STARTCHAR cWa +ENCODING 4735 SWIDTH 960 0 DWIDTH 16 0 -BBX 9 11 0 0 +BBX 12 14 0 -2 BITMAP -C000 -CE00 -DF00 -F180 -6180 -7180 -3180 -3180 -3180 -3180 -3180 +6060 +7FE0 +FFF0 +C630 +0600 +7FE0 +FFF0 +C630 +0600 +0600 +0600 +0600 +1F80 +30C0 ENDCHAR -STARTCHAR 0x12AE -ENCODING 4782 +STARTCHAR `he/h2e +ENCODING 4736 SWIDTH 960 0 DWIDTH 16 0 -BBX 9 11 0 0 +BBX 8 12 0 0 BITMAP -C000 -CE00 -FF00 -F180 -3180 -3180 -3180 -3180 -3000 -3000 -3000 +0C +0C +0C +FC +CF +03 +03 +03 +03 +03 +03 +03 ENDCHAR -STARTCHAR 0x12B0 -ENCODING 4784 +STARTCHAR `hu/h2u +ENCODING 4737 SWIDTH 960 0 DWIDTH 16 0 -BBX 13 11 0 0 +BBX 12 12 0 0 BITMAP -C000 -CC00 -FE00 -F300 -3300 -33F0 -3358 -3370 -3300 -3300 -3300 +0C00 +0C00 +0C00 +FC00 +CF00 +0300 +0300 +03F0 +0330 +0300 +0300 +0300 ENDCHAR -STARTCHAR 0x12B2 -ENCODING 4786 +STARTCHAR `hi/h2i +ENCODING 4738 SWIDTH 960 0 DWIDTH 16 0 -BBX 13 11 0 0 +BBX 12 12 0 0 BITMAP -C000 -CC00 -FE00 -F300 -3330 -3330 -33F0 -3318 -3318 -3300 -3300 +0C00 +0C00 +0C00 +FC00 +CF00 +0300 +0300 +0300 +0300 +0300 +0330 +03F0 ENDCHAR -STARTCHAR 0x12B3 -ENCODING 4787 +STARTCHAR `ha/h2a +ENCODING 4739 SWIDTH 960 0 DWIDTH 16 0 -BBX 12 13 0 -2 +BBX 8 12 0 0 BITMAP -C000 -CE00 -FF00 -F180 -3180 -3180 -3180 -3180 -0180 -0180 -0180 -07E0 -0C30 +0C +0C +0C +FC +CF +03 +03 +03 +0E +18 +30 +30 ENDCHAR -STARTCHAR 0x12B4 -ENCODING 4788 +STARTCHAR `hE/h2E +ENCODING 4740 SWIDTH 960 0 DWIDTH 16 0 -BBX 16 13 0 -2 +BBX 12 12 0 0 BITMAP -C000 -CE00 -FF00 -F180 -3180 -3180 -3180 -3180 -0180 -01F0 -0198 -07F0 0C00 -ENDCHAR -STARTCHAR 0x12B5 -ENCODING 4789 -SWIDTH 960 0 -DWIDTH 16 0 -BBX 13 11 0 0 -BITMAP -C000 -CC60 -FE60 -F3F8 -3318 -3300 -3300 -3300 -3300 -3300 -3300 +0C00 +0C00 +FC00 +CF00 +0300 +0300 +0300 +0300 +03E0 +0330 +03E0 ENDCHAR -STARTCHAR 0x12B8 -ENCODING 4792 +STARTCHAR `h/h2 +ENCODING 4741 SWIDTH 960 0 DWIDTH 16 0 -BBX 11 12 0 0 +BBX 8 12 0 0 BITMAP -C300 -7E00 -1800 -1B80 -1FC0 -0C60 -0C60 -0C60 -0C60 -0C60 -0C60 -0C60 +0C +0C +0C +3C +6F +C3 +C3 +03 +03 +03 +03 +03 ENDCHAR -STARTCHAR 0x12B9 -ENCODING 4793 +STARTCHAR `ho/h2o +ENCODING 4742 SWIDTH 960 0 DWIDTH 16 0 -BBX 15 12 0 0 +BBX 12 12 0 0 BITMAP -C300 -7E00 +07E0 +0F90 +18E0 +F800 +D800 1800 -1B80 -1FC0 -0C60 -0C60 -0C7E -0C66 -0C60 -0C60 -0C60 +1F80 +0F80 +0180 +0180 +0180 +0180 ENDCHAR -STARTCHAR 0x12BA -ENCODING 4794 +STARTCHAR hWe +ENCODING 4744 SWIDTH 960 0 DWIDTH 16 0 -BBX 15 12 0 0 +BBX 13 12 0 0 BITMAP -C300 -7E00 -1800 -1B80 -1FC0 -0C60 -0C60 -0C60 -0C60 -0C60 -0C66 -0C7E +0C00 +0C00 +0C00 +FC00 +CF00 +0300 +03F0 +0358 +0370 +0300 +0300 +0300 ENDCHAR -STARTCHAR 0x12BB -ENCODING 4795 +STARTCHAR hWi +ENCODING 4746 SWIDTH 960 0 DWIDTH 16 0 -BBX 11 12 0 0 +BBX 13 12 0 0 BITMAP -C300 -7E00 -1800 -1B80 -1FC0 -0C60 -0C60 -0C60 -0C60 -0060 -0060 -0060 +0C00 +0C00 +0C00 +FC00 +CF00 +0330 +0330 +03F0 +0318 +0318 +0300 +0300 ENDCHAR -STARTCHAR 0x12BC -ENCODING 4796 +STARTCHAR hWa +ENCODING 4747 SWIDTH 960 0 DWIDTH 16 0 -BBX 15 12 0 0 +BBX 11 14 0 -2 BITMAP -C300 -7E00 -1800 -1B80 -1FC0 -0C60 -0C60 -0C60 -0C60 -0C7C -0C66 -0C7C +0C00 +0C00 +0C00 +FC00 +CF00 +0300 +0300 +0300 +0300 +0300 +0300 +0300 +0FC0 +1860 ENDCHAR -STARTCHAR 0x12BD -ENCODING 4797 +STARTCHAR hWE +ENCODING 4748 SWIDTH 960 0 DWIDTH 16 0 -BBX 12 12 0 0 +BBX 12 14 0 -2 BITMAP -C300 -7E00 -1800 -1DC0 -1FE0 -0630 -0730 -0330 -0330 -0330 -0330 +0C00 +0C00 +0C00 +FC00 +CF00 +0300 +0300 +0300 +0300 +0300 +03E0 0330 +0FE0 +1800 ENDCHAR -STARTCHAR 0x12BE -ENCODING 4798 +STARTCHAR hWu/hW +ENCODING 4749 SWIDTH 960 0 DWIDTH 16 0 -BBX 11 12 0 0 +BBX 13 12 0 0 BITMAP -C300 -7E00 -1800 -1B80 -1FC0 -0C60 -0C60 -0C60 -0C60 0C00 0C00 0C00 -ENDCHAR -STARTCHAR 0x12C0 -ENCODING 4800 -SWIDTH 960 0 -DWIDTH 16 0 -BBX 16 12 0 0 -BITMAP -C300 -7E00 -1800 -1B80 -1FC0 -0C60 -0C7E -0C6B -0C6E -0C60 -0C60 -0C60 +FC60 +CF60 +03F8 +0318 +0300 +0300 +0300 +0300 +0300 ENDCHAR -STARTCHAR 0x12C2 -ENCODING 4802 +STARTCHAR ne +ENCODING 4752 SWIDTH 960 0 DWIDTH 16 0 -BBX 16 12 0 0 +BBX 5 12 0 0 BITMAP -C300 -7E00 -1800 -1B80 -1FC0 -0C66 -0C66 -0C7E -0C63 -0C63 -0C60 -0C60 +C0 +C0 +C0 +F0 +38 +30 +30 +30 +60 +60 +60 +60 ENDCHAR -STARTCHAR 0x12C3 -ENCODING 4803 +STARTCHAR nu +ENCODING 4753 SWIDTH 960 0 DWIDTH 16 0 -BBX 14 14 0 -2 +BBX 7 12 0 0 BITMAP -C300 -7E00 -1800 -1B80 -1FC0 -0CE0 -0C60 -0C60 -0C60 -0060 -0060 -0060 -01F8 -030C +C0 +C0 +C0 +F0 +38 +30 +30 +3E +66 +60 +60 +60 ENDCHAR -STARTCHAR 0x12C4 -ENCODING 4804 +STARTCHAR ni +ENCODING 4754 SWIDTH 960 0 DWIDTH 16 0 -BBX 15 14 0 -2 +BBX 7 12 0 0 BITMAP -C300 -7E00 -1800 -1B80 -1FC0 -0CE0 -0C60 -0C60 -0C60 -0060 -007C -0066 -01FC -0300 +C0 +C0 +C0 +F0 +38 +30 +30 +30 +60 +60 +66 +7E ENDCHAR -STARTCHAR 0x12C5 -ENCODING 4805 +STARTCHAR na +ENCODING 4755 SWIDTH 960 0 DWIDTH 16 0 -BBX 16 12 0 0 +BBX 9 12 0 0 BITMAP -C300 -7E00 -180C -1B8C -1FFF -0C63 -0C60 -0C60 -0C60 -0C60 -0C60 -0C60 +1F00 +3F80 +6180 +C000 +E000 +7C00 +0E00 +0600 +0400 +0C00 +0C00 +0C00 ENDCHAR -STARTCHAR 0x12C8 -ENCODING 4808 +STARTCHAR nE +ENCODING 4756 SWIDTH 960 0 DWIDTH 16 0 -BBX 11 8 0 1 +BBX 6 12 0 0 BITMAP -3FC0 -76E0 -C660 -C660 -CC60 -CCC0 -EDC0 -7F00 +C0 +C0 +C0 +F0 +38 +30 +30 +30 +78 +64 +6C +78 ENDCHAR -STARTCHAR 0x12C9 -ENCODING 4809 +STARTCHAR n +ENCODING 4757 SWIDTH 960 0 DWIDTH 16 0 -BBX 15 9 0 -1 +BBX 8 12 0 0 BITMAP -3FC0 -76E0 -C660 -C660 -CC60 -CCE0 -EDC6 -7FFC -000C +FF +FE +C6 +0C +1F +03 +06 +0C +0C +18 +18 +30 ENDCHAR -STARTCHAR 0x12CA -ENCODING 4810 +STARTCHAR no +ENCODING 4758 SWIDTH 960 0 DWIDTH 16 0 BBX 11 12 0 0 BITMAP -3FC0 -76E0 -C660 -C660 -CC60 -EEC0 -7F80 -0C00 -0C00 -1C00 -18C0 1FC0 -ENDCHAR -STARTCHAR 0x12CB -ENCODING 4811 -SWIDTH 960 0 -DWIDTH 16 0 -BBX 11 12 0 0 -BITMAP -3FC0 -76E0 -C660 -C660 -CC60 -EEC0 -7F80 -0C00 +3F20 +6160 +C0C0 +E000 +7C00 +0E00 +0600 +0400 0C00 0C00 0C00 -1C00 ENDCHAR -STARTCHAR 0x12CC -ENCODING 4812 +STARTCHAR nWa +ENCODING 4759 SWIDTH 960 0 DWIDTH 16 0 -BBX 11 12 0 0 +BBX 9 13 0 -2 BITMAP -3FC0 -76E0 -C660 -C660 -CC60 -EEC0 -7F80 +1F00 +3F80 +6180 +C000 +E000 +7C00 +0E00 +0600 +0400 0C00 0C00 -1E00 -1980 -1F00 +3F00 +6180 ENDCHAR -STARTCHAR 0x12CD -ENCODING 4813 +STARTCHAR Ne +ENCODING 4760 SWIDTH 960 0 DWIDTH 16 0 -BBX 15 8 0 1 +BBX 10 12 0 0 BITMAP -3FC0 -76E0 -C660 -C67E -CC66 -CCC2 -EDC0 -7F00 +6180 +FFC0 +8C40 +0C00 +0F00 +0380 +0300 +0300 +0600 +0600 +0600 +0600 ENDCHAR -STARTCHAR 0x12CE -ENCODING 4814 +STARTCHAR Nu +ENCODING 4761 SWIDTH 960 0 DWIDTH 16 0 BBX 11 12 0 0 BITMAP -3FC0 -76E0 -C660 -C660 -CC60 -EEC0 -7F80 +6180 +FFC0 +8C40 0C00 -1800 -3000 -6000 -6000 +0F00 +0380 +0300 +03E0 +0660 +0600 +0600 +0600 ENDCHAR -STARTCHAR 0x12D0 -ENCODING 4816 +STARTCHAR Ni +ENCODING 4762 SWIDTH 960 0 DWIDTH 16 0 -BBX 8 11 0 0 +BBX 11 12 0 0 BITMAP -1E -63 -C3 -C3 -C3 -C3 -C3 -C3 -C3 -7F -60 +6180 +FFC0 +8C40 +0C00 +0F00 +0380 +0300 +0300 +0600 +0600 +0660 +07E0 ENDCHAR -STARTCHAR 0x12D1 -ENCODING 4817 +STARTCHAR Na +ENCODING 4763 SWIDTH 960 0 DWIDTH 16 0 -BBX 12 11 0 0 +BBX 11 13 0 0 BITMAP -1E00 -6300 -C300 -C300 -C300 -C300 -C3F0 -C330 -C300 -7F00 -6000 +30C0 +7FE0 +4620 +1F00 +3F80 +6180 +C000 +E000 +7C00 +0E00 +0600 +0C00 +0C00 ENDCHAR -STARTCHAR 0x12D2 -ENCODING 4818 +STARTCHAR NE +ENCODING 4764 SWIDTH 960 0 DWIDTH 16 0 -BBX 12 11 0 0 +BBX 10 12 0 0 BITMAP -3E00 -6300 -C300 -C300 -C300 -7F80 -0180 -0180 +6180 +FFC0 +8C40 +0C00 +0F00 +0380 0300 -0330 -03F0 +0300 +0780 +0640 +06C0 +0780 ENDCHAR -STARTCHAR 0x12D3 -ENCODING 4819 +STARTCHAR N +ENCODING 4765 SWIDTH 960 0 DWIDTH 16 0 -BBX 9 11 0 0 +BBX 10 13 0 0 BITMAP -3E00 +6180 +FFC0 +8C40 +3F80 +7F00 6300 -C300 -C300 -C300 -7F80 -0180 -0180 +0600 +0F80 0180 -0300 0300 +0600 +0600 +0600 ENDCHAR -STARTCHAR 0x12D4 -ENCODING 4820 +STARTCHAR No +ENCODING 4766 SWIDTH 960 0 DWIDTH 16 0 -BBX 12 11 0 0 +BBX 11 13 0 0 BITMAP -3E00 -6300 -C300 -C300 -C300 -7F80 -0180 -0180 -03E0 -0330 -03E0 +3180 +7FC0 +4440 +1FC0 +3F20 +6160 +C0C0 +E000 +7C00 +0E00 +0600 +0C00 +0C00 ENDCHAR -STARTCHAR 0x12D5 -ENCODING 4821 +STARTCHAR NWa +ENCODING 4767 SWIDTH 960 0 DWIDTH 16 0 -BBX 8 13 0 0 +BBX 11 15 0 -2 BITMAP -18 -18 -18 -7E -E3 -C3 -C3 -C3 -C3 -C3 -C3 -7F -60 -ENDCHAR -STARTCHAR 0x12D6 -ENCODING 4822 -SWIDTH 960 0 -DWIDTH 16 0 -BBX 8 12 0 0 -BITMAP -3C -66 -C3 -C3 -C3 -E7 -7E -3C -70 -C0 -C0 -C0 +30C0 +7FE0 +4620 +1F00 +3F80 +6180 +C000 +E000 +7C00 +0E00 +0600 +0C00 +0C00 +3F00 +6180 ENDCHAR -STARTCHAR 0x12D8 -ENCODING 4824 +STARTCHAR e/a +ENCODING 4768 SWIDTH 960 0 DWIDTH 16 0 BBX 7 12 0 0 BITMAP -C6 -C6 -C6 -C6 -C6 -FE -FE -C6 -C6 +60 +60 +60 +78 +18 +38 +3C +6E +E6 C6 C6 C6 ENDCHAR -STARTCHAR 0x12D9 -ENCODING 4825 +STARTCHAR u/U +ENCODING 4769 SWIDTH 960 0 DWIDTH 16 0 BBX 11 12 0 0 BITMAP -C600 -C600 -C600 -C600 -C600 -FE00 -FE00 -C7E0 -C660 +6000 +6000 +6000 +7800 +1800 +3800 +3C00 +6E00 +E7E0 C660 C600 C600 ENDCHAR -STARTCHAR 0x12DA -ENCODING 4826 +STARTCHAR i +ENCODING 4770 SWIDTH 960 0 DWIDTH 16 0 BBX 11 12 0 0 BITMAP -C600 -C600 -C600 -C600 -C600 -FE00 -FE00 -C600 -C600 +6000 +6000 +6000 +7800 +1800 +3800 +3C00 +6E00 +E600 C600 C660 C7E0 ENDCHAR -STARTCHAR 0x12DB -ENCODING 4827 +STARTCHAR a/A +ENCODING 4771 SWIDTH 960 0 DWIDTH 16 0 BBX 7 12 0 0 BITMAP -C6 -C6 -C6 -C6 -FE -FE +60 +60 +60 +78 +18 +3C +6E C6 C6 C6 06 06 -06 ENDCHAR -STARTCHAR 0x12DC -ENCODING 4828 +STARTCHAR E +ENCODING 4772 SWIDTH 960 0 DWIDTH 16 0 BBX 11 12 0 0 BITMAP -C600 -C600 -C600 -C600 -C600 -FE00 -FE00 -C600 -C600 +6000 +6000 +6000 +7800 +1800 +3800 +3C00 +6E00 +E600 C7C0 C660 C7C0 -ENDCHAR -STARTCHAR 0x12DD -ENCODING 4829 -SWIDTH 960 0 -DWIDTH 16 0 -BBX 10 12 0 0 -BITMAP -70C0 -D8C0 -D8C0 -18C0 -18C0 -1FC0 -1FC0 -18C0 -18C0 -18C0 -18C0 -18C0 ENDCHAR -STARTCHAR 0x12DE -ENCODING 4830 +STARTCHAR I +ENCODING 4773 SWIDTH 960 0 DWIDTH 16 0 BBX 7 12 0 0 BITMAP +C0 +C0 +E0 +60 +30 +38 +7C +EE C6 C6 C6 C6 -FE -FE +ENDCHAR +STARTCHAR o/O +ENCODING 4774 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 7 12 0 0 +BITMAP +60 +60 +60 +78 +18 +3C +6E C6 C6 C6 C0 C0 -C0 ENDCHAR -STARTCHAR 0x12DF -ENCODING 4831 +STARTCHAR e3 +ENCODING 4775 SWIDTH 960 0 DWIDTH 16 0 -BBX 10 14 0 -2 +BBX 9 13 0 0 BITMAP -C600 -C600 -C600 -C600 -FE00 -FE00 -C600 -C600 -C600 -0600 -0600 +6300 +7F00 +D980 +1800 +1E00 0600 -1F80 -30C0 +0E00 +0F00 +1B80 +3980 +3180 +3180 +3180 ENDCHAR -STARTCHAR 0x12E0 -ENCODING 4832 +STARTCHAR ke +ENCODING 4776 SWIDTH 960 0 DWIDTH 16 0 -BBX 12 12 0 0 +BBX 9 11 0 0 BITMAP -70E0 -D9B0 -D9B0 -1980 -1980 -1F80 -1F80 -1980 -1980 -1980 -1980 -1980 +C000 +CE00 +FF00 +F180 +3180 +3180 +3180 +3180 +3180 +3180 +3180 ENDCHAR -STARTCHAR 0x12E1 -ENCODING 4833 +STARTCHAR ku +ENCODING 4777 SWIDTH 960 0 DWIDTH 16 0 -BBX 13 12 0 0 +BBX 13 11 0 0 BITMAP -70E0 -D9B0 -D9B0 -1980 -1980 -1F80 -1F80 -19F8 -1998 -1998 -1980 -1980 +C000 +CE00 +FF00 +F180 +3180 +3180 +31F8 +3198 +3180 +3180 +3180 ENDCHAR -STARTCHAR 0x12E2 -ENCODING 4834 +STARTCHAR ki +ENCODING 4778 SWIDTH 960 0 DWIDTH 16 0 -BBX 13 12 0 0 +BBX 13 11 0 0 BITMAP -70E0 -D9B0 -D9B0 -1980 -1980 -1F80 -1F80 -1980 -1980 -1980 -1998 -19F8 +C000 +CE00 +FF00 +F180 +3180 +3180 +3180 +3180 +3180 +3198 +31F8 ENDCHAR -STARTCHAR 0x12E3 -ENCODING 4835 +STARTCHAR ka +ENCODING 4779 SWIDTH 960 0 DWIDTH 16 0 -BBX 12 12 0 0 +BBX 9 11 0 0 BITMAP -70E0 -D9B0 -D9B0 -1980 -1F80 -1F80 -1980 -1980 -1980 +C000 +CE00 +FF00 +F180 +3180 +3180 +3180 +3180 0180 0180 0180 ENDCHAR -STARTCHAR 0x12E4 -ENCODING 4836 +STARTCHAR kE +ENCODING 4780 SWIDTH 960 0 DWIDTH 16 0 -BBX 13 12 0 0 +BBX 13 11 0 0 BITMAP -70E0 -D9B0 -D9B0 -1980 -1980 -1F80 -1F80 -1980 -1980 -19F0 -1998 -19F0 +C000 +CE00 +FF00 +F180 +3180 +3180 +3180 +3180 +31F0 +3198 +31F0 ENDCHAR -STARTCHAR 0x12E5 -ENCODING 4837 +STARTCHAR k +ENCODING 4781 SWIDTH 960 0 DWIDTH 16 0 -BBX 13 13 0 0 +BBX 9 11 0 0 BITMAP -C300 -7E00 -1800 -3870 -6CD8 -6CD8 -0CC0 -0FC0 -0FC0 -0CC0 -0CC0 -0CC0 -0CC0 +C000 +CE00 +DF00 +F180 +6180 +7180 +3180 +3180 +3180 +3180 +3180 ENDCHAR -STARTCHAR 0x12E6 -ENCODING 4838 +STARTCHAR ko +ENCODING 4782 SWIDTH 960 0 DWIDTH 16 0 -BBX 12 12 0 0 +BBX 9 11 0 0 BITMAP -70E0 -D9B0 -D9B0 -1980 -1F80 -1F80 -1980 -1980 -1980 -1800 -1800 -1800 +C000 +CE00 +FF00 +F180 +3180 +3180 +3180 +3180 +3000 +3000 +3000 ENDCHAR -STARTCHAR 0x12E7 -ENCODING 4839 +STARTCHAR kWe +ENCODING 4784 SWIDTH 960 0 DWIDTH 16 0 -BBX 12 14 0 -2 +BBX 13 11 0 0 BITMAP -70E0 -D9B0 -D9B0 -1980 -1F80 -1F80 -1980 -1980 -1980 +C000 +CC00 +FE00 +F300 +3300 +33F0 +3358 +3370 +3300 +3300 +3300 +ENDCHAR +STARTCHAR kWi +ENCODING 4786 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 13 11 0 0 +BITMAP +C000 +CC00 +FE00 +F300 +3330 +3330 +33F0 +3318 +3318 +3300 +3300 +ENDCHAR +STARTCHAR kWa +ENCODING 4787 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 12 13 0 -2 +BITMAP +C000 +CE00 +FF00 +F180 +3180 +3180 +3180 +3180 0180 0180 0180 07E0 0C30 ENDCHAR -STARTCHAR 0x12E8 -ENCODING 4840 +STARTCHAR kWE +ENCODING 4788 SWIDTH 960 0 DWIDTH 16 0 -BBX 7 12 0 0 +BBX 16 13 0 -2 BITMAP -38 -6C -C6 -C6 -C6 -C6 -EC -78 -30 -30 -30 -30 +C000 +CE00 +FF00 +F180 +3180 +3180 +3180 +3180 +0180 +01F0 +0198 +07F0 +0C00 ENDCHAR -STARTCHAR 0x12E9 -ENCODING 4841 +STARTCHAR kWu/kW +ENCODING 4789 SWIDTH 960 0 DWIDTH 16 0 -BBX 8 12 0 0 +BBX 13 11 0 0 BITMAP -38 -6C -C6 -C6 -C6 -C6 -EC -78 -30 -3F -33 -30 +C000 +CC60 +FE60 +F3F8 +3318 +3300 +3300 +3300 +3300 +3300 +3300 ENDCHAR -STARTCHAR 0x12EA -ENCODING 4842 +STARTCHAR Ke +ENCODING 4792 SWIDTH 960 0 DWIDTH 16 0 -BBX 10 12 0 0 +BBX 11 12 0 0 BITMAP -3800 -6C00 -C600 -C600 -C600 -C600 -EC00 -7800 -3300 -3FC0 -30C0 -3000 +C300 +7E00 +1800 +1B80 +1FC0 +0C60 +0C60 +0C60 +0C60 +0C60 +0C60 +0C60 ENDCHAR -STARTCHAR 0x12EB -ENCODING 4843 +STARTCHAR Ku +ENCODING 4793 SWIDTH 960 0 DWIDTH 16 0 -BBX 7 12 0 0 +BBX 15 12 0 0 BITMAP -38 -6C -C6 -C6 -C6 -CC -F8 -70 -38 -0C -38 -70 +C300 +7E00 +1800 +1B80 +1FC0 +0C60 +0C60 +0C7E +0C66 +0C60 +0C60 +0C60 ENDCHAR -STARTCHAR 0x12EC -ENCODING 4844 +STARTCHAR Ki +ENCODING 4794 SWIDTH 960 0 DWIDTH 16 0 -BBX 10 12 0 0 +BBX 15 12 0 0 BITMAP -3800 -6C00 -C600 -C600 -C600 -C600 -EC00 -7800 -3780 -3CC0 -3780 -3000 +C300 +7E00 +1800 +1B80 +1FC0 +0C60 +0C60 +0C60 +0C60 +0C60 +0C66 +0C7E ENDCHAR -STARTCHAR 0x12ED -ENCODING 4845 +STARTCHAR Ka +ENCODING 4795 SWIDTH 960 0 DWIDTH 16 0 BBX 11 12 0 0 BITMAP -0F00 -1980 -3180 -3180 -3180 -1B00 -1E60 -0E60 -07C0 -7C00 -E000 -C000 +C300 +7E00 +1800 +1B80 +1FC0 +0C60 +0C60 +0C60 +0C60 +0060 +0060 +0060 ENDCHAR -STARTCHAR 0x12EE -ENCODING 4846 +STARTCHAR KE +ENCODING 4796 SWIDTH 960 0 DWIDTH 16 0 -BBX 11 12 0 0 +BBX 15 12 0 0 BITMAP -3800 -6C00 -C600 -C7E0 -C660 -C600 -EC00 -7800 -3000 -3000 -3000 -3000 +C300 +7E00 +1800 +1B80 +1FC0 +0C60 +0C60 +0C60 +0C60 +0C7C +0C66 +0C7C ENDCHAR -STARTCHAR 0x12EF -ENCODING 4847 +STARTCHAR K +ENCODING 4797 SWIDTH 960 0 DWIDTH 16 0 -BBX 9 15 0 -2 +BBX 12 12 0 0 BITMAP -E380 -7F00 -1C00 -1C00 -3600 -6300 -6300 -6300 -6300 -7600 -3C00 -1800 -1800 -1800 +C300 +7E00 1800 +1DC0 +1FE0 +0630 +0730 +0330 +0330 +0330 +0330 +0330 ENDCHAR -STARTCHAR 0x12F0 -ENCODING 4848 +STARTCHAR Ko +ENCODING 4798 SWIDTH 960 0 DWIDTH 16 0 -BBX 10 12 0 0 +BBX 11 12 0 0 BITMAP -1C00 -3E00 -6200 -6200 -6600 -7C00 -3000 -1800 +C300 +7E00 1800 +1B80 +1FC0 +0C60 +0C60 +0C60 +0C60 0C00 -FFC0 -C0C0 +0C00 +0C00 ENDCHAR -STARTCHAR 0x12F1 -ENCODING 4849 +STARTCHAR KWe +ENCODING 4800 SWIDTH 960 0 DWIDTH 16 0 -BBX 12 12 0 0 +BBX 16 12 0 0 BITMAP -1C00 -3E00 -6200 -6600 -7C00 -3000 -1800 -7F00 C300 -C3F0 -0630 -0600 +7E00 +1800 +1B80 +1FC0 +0C60 +0C7E +0C6B +0C6E +0C60 +0C60 +0C60 ENDCHAR -STARTCHAR 0x12F2 -ENCODING 4850 +STARTCHAR KWi +ENCODING 4802 SWIDTH 960 0 DWIDTH 16 0 -BBX 11 12 0 0 +BBX 16 12 0 0 BITMAP -1C00 -3E00 -6200 -6600 -7C00 -3000 -1800 -7F00 C300 -C300 -0660 -07E0 +7E00 +1800 +1B80 +1FC0 +0C66 +0C66 +0C7E +0C63 +0C63 +0C60 +0C60 ENDCHAR -STARTCHAR 0x12F3 -ENCODING 4851 +STARTCHAR KWa +ENCODING 4803 SWIDTH 960 0 DWIDTH 16 0 -BBX 8 12 0 0 +BBX 14 14 0 -2 BITMAP -1C -3E -62 -66 -7C -30 -18 -FF -C3 -C3 -03 -03 +C300 +7E00 +1800 +1B80 +1FC0 +0CE0 +0C60 +0C60 +0C60 +0060 +0060 +0060 +01F8 +030C ENDCHAR -STARTCHAR 0x12F4 -ENCODING 4852 +STARTCHAR KWE +ENCODING 4804 SWIDTH 960 0 DWIDTH 16 0 -BBX 11 12 0 0 +BBX 15 14 0 -2 BITMAP -1C00 -3E00 -6200 -6200 -6600 -7C00 -3000 -1800 +C300 +7E00 1800 -0FC0 -FE60 -C3C0 +1B80 +1FC0 +0CE0 +0C60 +0C60 +0C60 +0060 +007C +0066 +01FC +0300 ENDCHAR -STARTCHAR 0x12F5 -ENCODING 4853 +STARTCHAR KWu/KW +ENCODING 4805 SWIDTH 960 0 DWIDTH 16 0 -BBX 11 12 0 0 +BBX 16 12 0 0 BITMAP -1C00 -3E00 -63E0 -6260 -6600 -7C00 -3000 -1800 -1800 -0C00 -FFC0 -C0C0 +C300 +7E00 +180C +1B8C +1FFF +0C63 +0C60 +0C60 +0C60 +0C60 +0C60 +0C60 ENDCHAR -STARTCHAR 0x12F6 -ENCODING 4854 +STARTCHAR we +ENCODING 4808 SWIDTH 960 0 DWIDTH 16 0 -BBX 9 12 0 0 +BBX 11 8 0 1 BITMAP -0E00 -1F00 -3100 -3300 -3E00 -1C00 -3F80 -6180 -C000 -C000 -C000 -C000 +3FC0 +76E0 +C660 +C660 +CC60 +CCC0 +EDC0 +7F00 ENDCHAR -STARTCHAR 0x12F7 -ENCODING 4855 +STARTCHAR wu +ENCODING 4809 SWIDTH 960 0 DWIDTH 16 0 -BBX 11 14 0 -2 +BBX 15 9 0 -1 BITMAP -1C00 -3E00 -6200 -6600 -7C00 -3000 -1800 -FF00 -C300 -C300 -0300 -0300 -0FC0 -1860 +3FC0 +76E0 +C660 +C660 +CC60 +CCE0 +EDC6 +7FFC +000C ENDCHAR -STARTCHAR 0x12F8 -ENCODING 4856 +STARTCHAR wi +ENCODING 4810 SWIDTH 960 0 DWIDTH 16 0 -BBX 8 12 0 0 +BBX 11 12 0 0 BITMAP -10 -10 -38 -7C -C4 -CC -F8 -60 -30 -18 -FF -C3 +3FC0 +76E0 +C660 +C660 +CC60 +EEC0 +7F80 +0C00 +0C00 +1C00 +18C0 +1FC0 ENDCHAR -STARTCHAR 0x12F9 -ENCODING 4857 +STARTCHAR wa +ENCODING 4811 SWIDTH 960 0 DWIDTH 16 0 -BBX 12 12 0 0 +BBX 11 12 0 0 BITMAP -0800 -0800 +3FC0 +76E0 +C660 +C660 +CC60 +EEC0 +7F80 +0C00 +0C00 +0C00 +0C00 1C00 -3E00 -6200 -6600 -7C00 -3000 -7F00 -C3F0 -C630 -0600 ENDCHAR -STARTCHAR 0x12FA -ENCODING 4858 +STARTCHAR wE +ENCODING 4812 SWIDTH 960 0 DWIDTH 16 0 BBX 11 12 0 0 BITMAP -0800 -0800 -1C00 -3E00 -6200 -6600 -7C00 -3000 -7F00 -C300 +3FC0 +76E0 C660 -07E0 +C660 +CC60 +EEC0 +7F80 +0C00 +0C00 +1E00 +1980 +1F00 ENDCHAR -STARTCHAR 0x12FB -ENCODING 4859 +STARTCHAR w +ENCODING 4813 SWIDTH 960 0 DWIDTH 16 0 -BBX 8 12 0 0 +BBX 15 8 0 1 BITMAP -08 -08 -1C -3E -62 -66 -7C -30 -FF -C3 -03 -03 +3FC0 +76E0 +C660 +C67E +CC66 +CCC2 +EDC0 +7F00 ENDCHAR -STARTCHAR 0x12FC -ENCODING 4860 +STARTCHAR wo +ENCODING 4814 SWIDTH 960 0 DWIDTH 16 0 BBX 11 12 0 0 BITMAP -1000 -1000 -3800 -7C00 -C400 -CC00 -F800 -6000 +3FC0 +76E0 +C660 +C660 +CC60 +EEC0 +7F80 +0C00 +1800 3000 -1BC0 -FE60 -C3C0 -ENDCHAR -STARTCHAR 0x12FD -ENCODING 4861 -SWIDTH 960 0 -DWIDTH 16 0 -BBX 10 12 0 0 -BITMAP -1000 -1000 -3800 -7C00 -C7C0 -CCC0 -F800 6000 -3000 -1800 -FF00 -C300 +6000 ENDCHAR -STARTCHAR 0x12FE -ENCODING 4862 +STARTCHAR `e/e2 +ENCODING 4816 SWIDTH 960 0 DWIDTH 16 0 -BBX 10 12 0 0 +BBX 8 11 0 0 BITMAP -0400 -0400 -0E00 -1F00 -3100 -3300 -3E00 -1FC0 -30C0 -6000 -6000 -6000 +1E +63 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +7F +60 ENDCHAR -STARTCHAR 0x12FF -ENCODING 4863 +STARTCHAR `u/u2 +ENCODING 4817 SWIDTH 960 0 DWIDTH 16 0 -BBX 11 16 0 -2 +BBX 12 11 0 0 BITMAP -0800 -0800 -1C00 -3E00 -6200 -6600 -7C00 -3000 -1800 -FF00 +1E00 +6300 C300 C300 -0300 -0300 -0FC0 -1860 -ENDCHAR -STARTCHAR 0x1300 -ENCODING 4864 -SWIDTH 960 0 -DWIDTH 16 0 -BBX 10 13 0 0 -BITMAP -C0C0 -7F80 -0C00 -1E00 -3300 -3100 -3300 -1E00 -1800 -1C00 -0C00 -7F80 -6180 +C300 +C300 +C3F0 +C330 +C300 +7F00 +6000 ENDCHAR -STARTCHAR 0x1301 -ENCODING 4865 +STARTCHAR `i/i2 +ENCODING 4818 SWIDTH 960 0 DWIDTH 16 0 -BBX 13 13 0 0 +BBX 12 11 0 0 BITMAP -C0C0 +3E00 +6300 +C300 +C300 +C300 7F80 -0C00 -1E00 -3300 -3300 -1E00 -0C00 -3F80 -6180 -61F8 -0318 +0180 +0180 0300 -ENDCHAR -STARTCHAR 0x1302 -ENCODING 4866 -SWIDTH 960 0 -DWIDTH 16 0 -BBX 12 13 0 0 -BITMAP -C0C0 -7F80 -0C00 -1E00 -3300 -3300 -1E00 -0C00 -3F80 -6180 -6180 0330 03F0 ENDCHAR -STARTCHAR 0x1303 -ENCODING 4867 +STARTCHAR `a/A2 +ENCODING 4819 SWIDTH 960 0 DWIDTH 16 0 -BBX 10 13 0 0 +BBX 9 11 0 0 BITMAP -C0C0 -7F80 -0C00 -1E00 -3300 -3300 -1E00 -0C00 +3E00 +6300 +C300 +C300 +C300 7F80 -6180 -6180 0180 0180 -ENDCHAR -STARTCHAR 0x1304 -ENCODING 4868 -SWIDTH 960 0 -DWIDTH 16 0 -BBX 12 13 0 0 -BITMAP -C0C0 -7F80 -0C00 -1E00 -3300 -3100 -3300 -1E00 -1800 -1C00 -0FE0 -7F30 -61E0 +0180 +0300 +0300 ENDCHAR -STARTCHAR 0x1305 -ENCODING 4869 +STARTCHAR `E/E2 +ENCODING 4820 SWIDTH 960 0 DWIDTH 16 0 -BBX 12 13 0 0 +BBX 12 11 0 0 BITMAP -C0C0 -7F80 -0C00 -1E00 -3300 -31F0 -3330 -1E00 -1800 -1C00 -0C00 +3E00 +6300 +C300 +C300 +C300 7F80 -6180 +0180 +0180 +03E0 +0330 +03E0 ENDCHAR -STARTCHAR 0x1306 -ENCODING 4870 +STARTCHAR `I/I2 +ENCODING 4821 SWIDTH 960 0 DWIDTH 16 0 -BBX 10 13 0 0 +BBX 8 13 0 0 BITMAP -C0C0 -7F80 -0C00 -1E00 -3300 -3300 -1E00 -1FC0 -30C0 -6000 -6000 -6000 -6000 +18 +18 +18 +7E +E3 +C3 +C3 +C3 +C3 +C3 +C3 +7F +60 ENDCHAR -STARTCHAR 0x1307 -ENCODING 4871 +STARTCHAR `o/o2 +ENCODING 4822 SWIDTH 960 0 DWIDTH 16 0 -BBX 13 15 0 -2 +BBX 8 12 0 0 BITMAP -C0C0 -7F80 -0C00 -1E00 -3300 -3300 -1E00 -0C00 -7F80 -6180 -6180 -0180 -0180 -0FF0 -1C38 +3C +66 +C3 +C3 +C3 +E7 +7E +3C +70 +C0 +C0 +C0 ENDCHAR -STARTCHAR 0x1308 -ENCODING 4872 +STARTCHAR ze +ENCODING 4824 SWIDTH 960 0 DWIDTH 16 0 -BBX 7 11 0 0 +BBX 7 12 0 0 BITMAP -7C C6 C6 -06 -06 -06 -0C -0C -0C -0C -0C +C6 +C6 +C6 +FE +FE +C6 +C6 +C6 +C6 +C6 ENDCHAR -STARTCHAR 0x1309 -ENCODING 4873 +STARTCHAR zu +ENCODING 4825 SWIDTH 960 0 DWIDTH 16 0 -BBX 11 11 0 0 +BBX 11 12 0 0 BITMAP -7C00 C600 C600 -0600 -0600 -0600 -0FE0 -0C60 -0C00 -0C00 -0C00 +C600 +C600 +C600 +FE00 +FE00 +C7E0 +C660 +C660 +C600 +C600 ENDCHAR -STARTCHAR 0x130A -ENCODING 4874 +STARTCHAR zi +ENCODING 4826 SWIDTH 960 0 DWIDTH 16 0 -BBX 10 11 0 0 +BBX 11 12 0 0 BITMAP -7C00 C600 C600 -0600 -0600 -0600 -0C00 -0C00 -0C00 -0CC0 -0FC0 +C600 +C600 +C600 +FE00 +FE00 +C600 +C600 +C600 +C660 +C7E0 ENDCHAR -STARTCHAR 0x130B -ENCODING 4875 +STARTCHAR za +ENCODING 4827 SWIDTH 960 0 DWIDTH 16 0 -BBX 7 11 0 0 +BBX 7 12 0 0 BITMAP -78 +C6 +C6 +C6 +C6 +FE FE C6 +C6 +C6 06 06 06 -0C -1C -78 -E0 -C0 ENDCHAR -STARTCHAR 0x130C -ENCODING 4876 +STARTCHAR zE +ENCODING 4828 SWIDTH 960 0 DWIDTH 16 0 -BBX 10 11 0 0 +BBX 11 12 0 0 BITMAP -7C00 C600 C600 -0600 -0600 -0600 -0C00 -0C00 -0F80 -0CC0 -0F80 +C600 +C600 +C600 +FE00 +FE00 +C600 +C600 +C7C0 +C660 +C7C0 ENDCHAR -STARTCHAR 0x130D -ENCODING 4877 +STARTCHAR z +ENCODING 4829 SWIDTH 960 0 DWIDTH 16 0 -BBX 9 11 0 0 +BBX 10 12 0 0 BITMAP -7F00 -CD80 -7980 -0180 -0180 -0300 -0300 -0300 -0300 -0300 -0300 +70C0 +D8C0 +D8C0 +18C0 +18C0 +1FC0 +1FC0 +18C0 +18C0 +18C0 +18C0 +18C0 ENDCHAR -STARTCHAR 0x130E -ENCODING 4878 +STARTCHAR zo +ENCODING 4830 SWIDTH 960 0 DWIDTH 16 0 BBX 7 12 0 0 BITMAP -10 -10 -10 -7C C6 C6 -06 -04 -0C -0C -0C -0C +C6 +C6 +FE +FE +C6 +C6 +C6 +C0 +C0 +C0 ENDCHAR -STARTCHAR 0x1310 -ENCODING 4880 +STARTCHAR zWa +ENCODING 4831 SWIDTH 960 0 DWIDTH 16 0 -BBX 12 11 0 0 +BBX 10 14 0 -2 BITMAP -7C00 C600 C600 +C600 +C600 +FE00 +FE00 +C600 +C600 +C600 0600 0600 -07E0 -0EB0 -0CE0 -0C00 -0C00 -0C00 +0600 +1F80 +30C0 ENDCHAR -STARTCHAR 0x1312 -ENCODING 4882 +STARTCHAR Ze +ENCODING 4832 SWIDTH 960 0 DWIDTH 16 0 -BBX 11 11 0 0 +BBX 12 12 0 0 BITMAP -7C00 -C600 -C600 -0600 -06C0 -06C0 -0FC0 -0C60 -0C60 -0C00 -0C00 +70E0 +D9B0 +D9B0 +1980 +1980 +1F80 +1F80 +1980 +1980 +1980 +1980 +1980 ENDCHAR -STARTCHAR 0x1313 -ENCODING 4883 +STARTCHAR Zu +ENCODING 4833 SWIDTH 960 0 DWIDTH 16 0 -BBX 7 11 0 0 +BBX 13 12 0 0 BITMAP -78 -CC -CC -0C -7E -66 -06 -06 -06 -06 -06 +70E0 +D9B0 +D9B0 +1980 +1980 +1F80 +1F80 +19F8 +1998 +1998 +1980 +1980 ENDCHAR -STARTCHAR 0x1314 -ENCODING 4884 +STARTCHAR Zi +ENCODING 4834 SWIDTH 960 0 DWIDTH 16 0 -BBX 10 13 0 -2 +BBX 13 12 0 0 BITMAP -7C00 -C600 -C600 -0600 -0600 -0600 -0C00 -0C00 -0C00 -0F80 -0CC0 -3F80 -6000 +70E0 +D9B0 +D9B0 +1980 +1980 +1F80 +1F80 +1980 +1980 +1980 +1998 +19F8 ENDCHAR -STARTCHAR 0x1315 -ENCODING 4885 +STARTCHAR Za +ENCODING 4835 SWIDTH 960 0 DWIDTH 16 0 -BBX 12 11 0 0 +BBX 12 12 0 0 BITMAP -7C00 -C6C0 -C6C0 -07F0 -0630 -0600 -0E00 -0C00 -0C00 -0C00 -0C00 -ENDCHAR -STARTCHAR 0x1318 -ENCODING 4888 -SWIDTH 960 0 -DWIDTH 16 0 -BBX 8 12 0 0 -BITMAP -C3 -7E -00 -7C -C6 -C6 -06 -04 -0C -0C -0C -0C +70E0 +D9B0 +D9B0 +1980 +1F80 +1F80 +1980 +1980 +1980 +0180 +0180 +0180 ENDCHAR -STARTCHAR 0x1319 -ENCODING 4889 +STARTCHAR ZE +ENCODING 4836 SWIDTH 960 0 DWIDTH 16 0 -BBX 11 12 0 0 +BBX 13 12 0 0 BITMAP -C300 -7E00 -0000 -7C00 -C600 -C600 -0600 -0600 -0FE0 -0C60 -0C00 -0C00 +70E0 +D9B0 +D9B0 +1980 +1980 +1F80 +1F80 +1980 +1980 +19F0 +1998 +19F0 ENDCHAR -STARTCHAR 0x131A -ENCODING 4890 +STARTCHAR Z +ENCODING 4837 SWIDTH 960 0 DWIDTH 16 0 -BBX 10 12 0 0 +BBX 13 13 0 0 BITMAP C300 7E00 -0000 -7C00 -C600 -C600 -0600 -0400 -0C00 -0C00 +1800 +3870 +6CD8 +6CD8 0CC0 0FC0 +0FC0 +0CC0 +0CC0 +0CC0 +0CC0 ENDCHAR -STARTCHAR 0x131B -ENCODING 4891 +STARTCHAR Zo +ENCODING 4838 SWIDTH 960 0 DWIDTH 16 0 -BBX 8 12 0 0 +BBX 12 12 0 0 BITMAP -C3 -7E -00 -3C -7F -43 -03 -03 -0E -3C -70 -E0 +70E0 +D9B0 +D9B0 +1980 +1F80 +1F80 +1980 +1980 +1980 +1800 +1800 +1800 ENDCHAR -STARTCHAR 0x131C -ENCODING 4892 +STARTCHAR ZWa +ENCODING 4839 SWIDTH 960 0 DWIDTH 16 0 -BBX 10 12 0 0 +BBX 12 14 0 -2 BITMAP -C300 -7E00 -0000 -7C00 -C600 -C600 -0600 -0400 -0C00 -0F80 -0CC0 -0F80 +70E0 +D9B0 +D9B0 +1980 +1F80 +1F80 +1980 +1980 +1980 +0180 +0180 +0180 +07E0 +0C30 ENDCHAR -STARTCHAR 0x131D -ENCODING 4893 +STARTCHAR ye +ENCODING 4840 SWIDTH 960 0 DWIDTH 16 0 -BBX 9 12 0 0 +BBX 7 12 0 0 BITMAP -C300 -7E00 -0000 -7F00 -CD80 -7980 -0180 -0100 -0300 -0300 -0300 -0300 +38 +6C +C6 +C6 +C6 +C6 +EC +78 +30 +30 +30 +30 ENDCHAR -STARTCHAR 0x131E -ENCODING 4894 +STARTCHAR yu +ENCODING 4841 SWIDTH 960 0 DWIDTH 16 0 -BBX 7 12 0 0 +BBX 8 12 0 0 BITMAP +38 +6C C6 -7C -10 -7C C6 C6 -06 -04 -0C -0C -0C -0C +C6 +EC +78 +30 +3F +33 +30 ENDCHAR -STARTCHAR 0x131F -ENCODING 4895 +STARTCHAR yi +ENCODING 4842 SWIDTH 960 0 DWIDTH 16 0 -BBX 8 14 0 -2 +BBX 10 12 0 0 BITMAP -C3 -7E -00 -78 -CC -CC -0C -7E -66 -06 -06 -06 -06 -06 +3800 +6C00 +C600 +C600 +C600 +C600 +EC00 +7800 +3300 +3FC0 +30C0 +3000 ENDCHAR -STARTCHAR 0x1320 -ENCODING 4896 +STARTCHAR ya +ENCODING 4843 SWIDTH 960 0 DWIDTH 16 0 -BBX 9 10 0 0 +BBX 7 12 0 0 BITMAP -3E00 -6B00 -6B00 -C980 -C980 -C980 -C980 -C980 -C980 -C980 +38 +6C +C6 +C6 +C6 +CC +F8 +70 +38 +0C +38 +70 ENDCHAR -STARTCHAR 0x1321 -ENCODING 4897 +STARTCHAR yE +ENCODING 4844 SWIDTH 960 0 DWIDTH 16 0 -BBX 13 10 0 0 +BBX 10 12 0 0 BITMAP -3E00 -6B00 -6B00 -C980 -C980 -C9F8 -C998 -C980 -C980 -C980 +3800 +6C00 +C600 +C600 +C600 +C600 +EC00 +7800 +3780 +3CC0 +3780 +3000 ENDCHAR -STARTCHAR 0x1322 -ENCODING 4898 +STARTCHAR y +ENCODING 4845 SWIDTH 960 0 DWIDTH 16 0 -BBX 13 10 0 0 +BBX 11 12 0 0 BITMAP -3E00 -6B00 -6B00 -C980 -C980 -C980 -C980 -C980 -C998 -C9F8 +0F00 +1980 +3180 +3180 +3180 +1B00 +1E60 +0E60 +07C0 +7C00 +E000 +C000 ENDCHAR -STARTCHAR 0x1323 -ENCODING 4899 +STARTCHAR yo +ENCODING 4846 SWIDTH 960 0 DWIDTH 16 0 -BBX 9 11 0 0 +BBX 11 12 0 0 BITMAP -3E00 -6B00 -6B00 -C980 -C980 -C980 -C980 -0180 -0180 -0180 -0180 +3800 +6C00 +C600 +C7E0 +C660 +C600 +EC00 +7800 +3000 +3000 +3000 +3000 ENDCHAR -STARTCHAR 0x1324 -ENCODING 4900 +STARTCHAR yWa +ENCODING 4847 SWIDTH 960 0 DWIDTH 16 0 -BBX 13 11 0 0 +BBX 9 15 0 -2 BITMAP -3E00 -6B00 -6B00 -C980 -C980 -C980 -C980 -C980 -C9F0 -C998 -C9F0 +E380 +7F00 +1C00 +1C00 +3600 +6300 +6300 +6300 +6300 +7600 +3C00 +1800 +1800 +1800 +1800 ENDCHAR -STARTCHAR 0x1325 -ENCODING 4901 +STARTCHAR de +ENCODING 4848 SWIDTH 960 0 DWIDTH 16 0 -BBX 11 11 0 0 +BBX 10 12 0 0 BITMAP -3F80 -7FC0 -4CC0 -CC60 -CE60 -C660 -0600 -0600 -0600 -0600 -0600 +1C00 +3E00 +6200 +6200 +6600 +7C00 +3000 +1800 +1800 +0C00 +FFC0 +C0C0 ENDCHAR -STARTCHAR 0x1326 -ENCODING 4902 +STARTCHAR du +ENCODING 4849 SWIDTH 960 0 DWIDTH 16 0 -BBX 9 11 0 0 +BBX 12 12 0 0 BITMAP +1C00 3E00 -6B00 -6B00 -C980 -C980 -C980 -C980 -C000 -C000 -C000 -C000 +6200 +6600 +7C00 +3000 +1800 +7F00 +C300 +C3F0 +0630 +0600 ENDCHAR -STARTCHAR 0x1327 -ENCODING 4903 +STARTCHAR di +ENCODING 4850 SWIDTH 960 0 DWIDTH 16 0 -BBX 12 13 0 -2 +BBX 11 12 0 0 BITMAP +1C00 3E00 -6B00 -6B00 -C980 -C980 -C980 -C980 -0180 -0180 -0180 -0180 +6200 +6600 +7C00 +3000 +1800 +7F00 +C300 +C300 +0660 07E0 -0C30 ENDCHAR -STARTCHAR 0x1328 -ENCODING 4904 +STARTCHAR da +ENCODING 4851 SWIDTH 960 0 DWIDTH 16 0 -BBX 15 10 0 0 +BBX 8 12 0 0 BITMAP -1F80 -3FC0 -6260 -C230 -C230 -C230 -F338 -DAB6 -CAB2 -FBBE +1C +3E +62 +66 +7C +30 +18 +FF +C3 +C3 +03 +03 ENDCHAR -STARTCHAR 0x1329 -ENCODING 4905 +STARTCHAR dE +ENCODING 4852 SWIDTH 960 0 DWIDTH 16 0 -BBX 16 10 0 0 +BBX 11 12 0 0 BITMAP -1F80 -3FC0 -6260 -C230 -C23F -C233 -F338 -DAB4 -CAB2 -FBBE +1C00 +3E00 +6200 +6200 +6600 +7C00 +3000 +1800 +1800 +0FC0 +FE60 +C3C0 ENDCHAR -STARTCHAR 0x132A -ENCODING 4906 +STARTCHAR d +ENCODING 4853 SWIDTH 960 0 DWIDTH 16 0 -BBX 16 10 0 0 +BBX 11 12 0 0 BITMAP -1F80 -3FC0 +1C00 +3E00 +63E0 6260 -C230 -C230 -C230 -F330 -DAB0 -CAB3 -FBBF +6600 +7C00 +3000 +1800 +1800 +0C00 +FFC0 +C0C0 ENDCHAR -STARTCHAR 0x132B -ENCODING 4907 +STARTCHAR do +ENCODING 4854 SWIDTH 960 0 DWIDTH 16 0 -BBX 14 12 0 0 +BBX 9 12 0 0 BITMAP -1FC0 -3FE0 -6230 -C230 -E330 -D2B0 -CAB0 -FBB0 -0030 -0068 -0064 -007C -ENDCHAR -STARTCHAR 0x132C -ENCODING 4908 -SWIDTH 960 0 -DWIDTH 16 0 -BBX 16 10 0 0 -BITMAP -1F80 -3FC0 -6260 -C23F -C239 -C237 -F330 -DABC -CAB2 -FBBE +0E00 +1F00 +3100 +3300 +3E00 +1C00 +3F80 +6180 +C000 +C000 +C000 +C000 ENDCHAR -STARTCHAR 0x132D -ENCODING 4909 +STARTCHAR dWa +ENCODING 4855 SWIDTH 960 0 DWIDTH 16 0 -BBX 14 11 0 0 +BBX 11 14 0 -2 BITMAP -1FC0 -7FE0 -C630 -E638 -9724 -F33C +1C00 +3E00 +6200 +6600 +7C00 +3000 +1800 +FF00 +C300 +C300 0300 -0380 -0340 -0320 -03E0 -ENDCHAR -STARTCHAR 0x132E -ENCODING 4910 -SWIDTH 960 0 -DWIDTH 16 0 -BBX 14 12 0 0 -BITMAP -1FC0 -3FE0 -3430 -6430 -4630 -C528 -C4A4 -C738 -E000 -D000 -C800 -F800 -ENDCHAR -STARTCHAR 0x132F -ENCODING 4911 -SWIDTH 960 0 -DWIDTH 16 0 -BBX 14 13 0 -2 -BITMAP -1FC0 -3FE0 -6230 -C230 -E330 -D2B0 -CAB0 -FBB0 -0030 -0060 -0060 -01F8 -030C +0300 +0FC0 +1860 ENDCHAR -STARTCHAR 0x1330 -ENCODING 4912 +STARTCHAR De +ENCODING 4856 SWIDTH 960 0 DWIDTH 16 0 BBX 8 12 0 0 BITMAP -18 -18 +10 +10 +38 +7C +C4 +CC +F8 +60 +30 18 -3C -66 -66 -3C -7E -E7 -C3 -C3 +FF C3 ENDCHAR -STARTCHAR 0x1331 -ENCODING 4913 +STARTCHAR Du +ENCODING 4857 SWIDTH 960 0 DWIDTH 16 0 BBX 12 12 0 0 BITMAP -1800 -1800 -1800 -3C00 -6600 +0800 +0800 +1C00 +3E00 +6200 6600 -3C00 -7E00 -E700 +7C00 +3000 +7F00 C3F0 -C330 -C300 +C630 +0600 ENDCHAR -STARTCHAR 0x1332 -ENCODING 4914 +STARTCHAR Di +ENCODING 4858 SWIDTH 960 0 DWIDTH 16 0 -BBX 12 12 0 0 +BBX 11 12 0 0 BITMAP -1800 -1800 -1800 -3C00 -6600 +0800 +0800 +1C00 +3E00 +6200 6600 -3C00 -7E00 -E700 +7C00 +3000 +7F00 C300 -C330 -C3F0 +C660 +07E0 ENDCHAR -STARTCHAR 0x1333 -ENCODING 4915 +STARTCHAR Da +ENCODING 4859 SWIDTH 960 0 DWIDTH 16 0 BBX 8 12 0 0 BITMAP -18 -18 -18 -3C +08 +08 +1C +3E +62 66 -3C -7E -E7 -C7 +7C +30 +FF C3 03 03 ENDCHAR -STARTCHAR 0x1334 -ENCODING 4916 +STARTCHAR DE +ENCODING 4860 SWIDTH 960 0 DWIDTH 16 0 -BBX 12 12 0 0 +BBX 11 12 0 0 BITMAP -1800 -1800 -1800 -3C00 -6600 -6600 -3C00 -7E00 -E700 -C3E0 -C330 -C3E0 +1000 +1000 +3800 +7C00 +C400 +CC00 +F800 +6000 +3000 +1BC0 +FE60 +C3C0 ENDCHAR -STARTCHAR 0x1335 -ENCODING 4917 +STARTCHAR D +ENCODING 4861 SWIDTH 960 0 DWIDTH 16 0 -BBX 11 12 0 0 +BBX 10 12 0 0 BITMAP -1800 -1800 +1000 +1000 +3800 +7C00 +C7C0 +CCC0 +F800 +6000 +3000 1800 -3C00 -67E0 -6660 -3C00 -7E00 -E700 -C300 -C300 +FF00 C300 ENDCHAR -STARTCHAR 0x1336 -ENCODING 4918 +STARTCHAR Do +ENCODING 4862 SWIDTH 960 0 DWIDTH 16 0 -BBX 8 12 0 0 +BBX 10 12 0 0 BITMAP -18 -18 -18 -3C -66 -3C -7E -E7 -C3 -C3 -C0 -C0 +0400 +0400 +0E00 +1F00 +3100 +3300 +3E00 +1FC0 +30C0 +6000 +6000 +6000 ENDCHAR -STARTCHAR 0x1337 -ENCODING 4919 +STARTCHAR DWa +ENCODING 4863 SWIDTH 960 0 DWIDTH 16 0 -BBX 11 14 0 -2 +BBX 11 16 0 -2 BITMAP -1800 -1800 -1800 -3C00 +0800 +0800 +1C00 +3E00 +6200 6600 -3C00 -7E00 -E700 +7C00 +3000 +1800 +FF00 C300 C300 0300 @@ -33825,2031 +34228,2232 @@ 0FC0 1860 ENDCHAR -STARTCHAR 0x1338 -ENCODING 4920 +STARTCHAR je +ENCODING 4864 SWIDTH 960 0 DWIDTH 16 0 -BBX 8 10 0 0 +BBX 10 13 0 0 BITMAP -18 -3C -66 -66 -3C -7E -E7 -C3 -C3 -C3 +C0C0 +7F80 +0C00 +1E00 +3300 +3100 +3300 +1E00 +1800 +1C00 +0C00 +7F80 +6180 ENDCHAR -STARTCHAR 0x1339 -ENCODING 4921 +STARTCHAR ju +ENCODING 4865 SWIDTH 960 0 DWIDTH 16 0 -BBX 12 10 0 0 +BBX 13 13 0 0 BITMAP -1800 -3C00 -6600 -6600 -3C00 -7E00 -E700 -C3F0 -C330 -C300 +C0C0 +7F80 +0C00 +1E00 +3300 +3300 +1E00 +0C00 +3F80 +6180 +61F8 +0318 +0300 ENDCHAR -STARTCHAR 0x133A -ENCODING 4922 +STARTCHAR ji +ENCODING 4866 SWIDTH 960 0 DWIDTH 16 0 -BBX 12 10 0 0 +BBX 12 13 0 0 BITMAP -1800 -3C00 -6600 -6600 -3C00 -7E00 -E700 -C300 -C330 -C3F0 +C0C0 +7F80 +0C00 +1E00 +3300 +3300 +1E00 +0C00 +3F80 +6180 +6180 +0330 +03F0 ENDCHAR -STARTCHAR 0x133B -ENCODING 4923 +STARTCHAR ja +ENCODING 4867 SWIDTH 960 0 DWIDTH 16 0 -BBX 8 11 0 0 +BBX 10 13 0 0 BITMAP -18 -3C -66 -66 -3C -7E -E6 -C7 -C3 -03 -03 +C0C0 +7F80 +0C00 +1E00 +3300 +3300 +1E00 +0C00 +7F80 +6180 +6180 +0180 +0180 ENDCHAR -STARTCHAR 0x133C -ENCODING 4924 +STARTCHAR jE +ENCODING 4868 SWIDTH 960 0 DWIDTH 16 0 -BBX 11 10 0 0 +BBX 12 13 0 0 BITMAP +C0C0 +7F80 +0C00 +1E00 +3300 +3100 +3300 +1E00 1800 -3C00 -6600 -6600 -3C00 -7E00 -E700 -C3C0 -C360 -C3C0 +1C00 +0FE0 +7F30 +61E0 ENDCHAR -STARTCHAR 0x133D -ENCODING 4925 +STARTCHAR j +ENCODING 4869 SWIDTH 960 0 DWIDTH 16 0 -BBX 11 10 0 0 +BBX 12 13 0 0 BITMAP +C0C0 +7F80 +0C00 +1E00 +3300 +31F0 +3330 +1E00 1800 -3C00 -67E0 -6660 -3C00 -7E00 -E700 -C300 -C300 -C300 +1C00 +0C00 +7F80 +6180 ENDCHAR -STARTCHAR 0x133E -ENCODING 4926 +STARTCHAR jo +ENCODING 4870 SWIDTH 960 0 DWIDTH 16 0 -BBX 8 11 0 0 +BBX 10 13 0 0 BITMAP -18 -3C -66 -66 -3C -7E -E7 -C3 -C3 -C0 -C0 +C0C0 +7F80 +0C00 +1E00 +3300 +3300 +1E00 +1FC0 +30C0 +6000 +6000 +6000 +6000 ENDCHAR -STARTCHAR 0x133F -ENCODING 4927 +STARTCHAR jWa +ENCODING 4871 SWIDTH 960 0 DWIDTH 16 0 -BBX 11 13 0 -2 +BBX 13 15 0 -2 BITMAP -1800 -3C00 -6600 -6600 -3C00 -7E00 -E600 -C700 -C300 -0300 -0300 -0FC0 -1860 +C0C0 +7F80 +0C00 +1E00 +3300 +3300 +1E00 +0C00 +7F80 +6180 +6180 +0180 +0180 +0FF0 +1C38 ENDCHAR -STARTCHAR 0x1340 -ENCODING 4928 +STARTCHAR ge +ENCODING 4872 SWIDTH 960 0 DWIDTH 16 0 -BBX 8 11 0 0 +BBX 7 11 0 0 BITMAP -1E -63 -C3 -C3 -C3 -FF -C3 -C3 -C3 -7F -60 -ENDCHAR -STARTCHAR 0x1341 -ENCODING 4929 -SWIDTH 960 0 -DWIDTH 16 0 -BBX 12 11 0 0 -BITMAP -1E00 -6300 -C300 -C300 -C300 -FF00 -C3F0 -C330 -C300 -7F00 -6000 -ENDCHAR -STARTCHAR 0x1342 -ENCODING 4930 -SWIDTH 960 0 -DWIDTH 16 0 -BBX 11 12 0 0 -BITMAP -7E00 -C300 -C300 -FF00 -C300 -C300 -7F00 -0300 -0300 -0300 -0330 -03F0 -ENDCHAR -STARTCHAR 0x1343 -ENCODING 4931 -SWIDTH 960 0 -DWIDTH 16 0 -BBX 8 12 0 0 -BITMAP -7E -C3 -C3 -FF -C3 -C3 -7F -03 -03 -03 -03 -03 +7C +C6 +C6 +06 +06 +06 +0C +0C +0C +0C +0C ENDCHAR -STARTCHAR 0x1344 -ENCODING 4932 +STARTCHAR gu +ENCODING 4873 SWIDTH 960 0 DWIDTH 16 0 -BBX 12 12 0 0 +BBX 11 11 0 0 BITMAP -7E00 -C300 -C300 -FF00 -C300 -C300 -7F00 -0300 -0300 -03E0 -0330 -03E0 +7C00 +C600 +C600 +0600 +0600 +0600 +0FE0 +0C60 +0C00 +0C00 +0C00 ENDCHAR -STARTCHAR 0x1345 -ENCODING 4933 +STARTCHAR gi +ENCODING 4874 SWIDTH 960 0 DWIDTH 16 0 -BBX 8 13 0 0 +BBX 10 11 0 0 BITMAP -18 -18 -18 -7E -E3 -C3 -C3 -FF -C3 -C3 -C3 -7F -60 +7C00 +C600 +C600 +0600 +0600 +0600 +0C00 +0C00 +0C00 +0CC0 +0FC0 ENDCHAR -STARTCHAR 0x1346 -ENCODING 4934 +STARTCHAR ga +ENCODING 4875 SWIDTH 960 0 DWIDTH 16 0 -BBX 8 12 0 0 +BBX 7 11 0 0 BITMAP -3C -66 -C3 -FF -C3 -E7 -7E -3C -70 -C0 -C0 +78 +FE +C6 +06 +06 +06 +0C +1C +78 +E0 C0 ENDCHAR -STARTCHAR 0x1348 -ENCODING 4936 +STARTCHAR gE +ENCODING 4876 SWIDTH 960 0 DWIDTH 16 0 BBX 10 11 0 0 BITMAP +7C00 +C600 +C600 0600 -0200 +0600 0600 0C00 -1800 -3000 -7800 -CC00 -C440 -7FC0 -1F40 +0C00 +0F80 +0CC0 +0F80 ENDCHAR -STARTCHAR 0x1349 -ENCODING 4937 +STARTCHAR g +ENCODING 4877 SWIDTH 960 0 DWIDTH 16 0 -BBX 9 12 0 0 +BBX 9 11 0 0 BITMAP -0400 -0C00 -1800 -3000 -6000 -F800 -C880 -CF80 -FE00 -1800 -3000 -3000 +7F00 +CD80 +7980 +0180 +0180 +0300 +0300 +0300 +0300 +0300 +0300 ENDCHAR -STARTCHAR 0x134A -ENCODING 4938 +STARTCHAR go +ENCODING 4878 SWIDTH 960 0 DWIDTH 16 0 -BBX 10 11 0 0 +BBX 7 12 0 0 BITMAP -0600 -0200 -0600 -0C00 -1800 -3000 -78C0 -CC40 -C4C0 -7F80 -3E00 +10 +10 +10 +7C +C6 +C6 +06 +04 +0C +0C +0C +0C ENDCHAR -STARTCHAR 0x134B -ENCODING 4939 +STARTCHAR gWe +ENCODING 4880 SWIDTH 960 0 DWIDTH 16 0 -BBX 10 12 0 0 +BBX 12 11 0 0 BITMAP -0800 +7C00 +C600 +C600 +0600 +0600 +07E0 +0EB0 +0CE0 0C00 -1800 -1000 -3000 -7000 -D800 -CC80 -7FC0 -0C40 0C00 0C00 ENDCHAR -STARTCHAR 0x134C -ENCODING 4940 +STARTCHAR gWi +ENCODING 4882 SWIDTH 960 0 DWIDTH 16 0 -BBX 11 12 0 0 +BBX 11 11 0 0 BITMAP -0600 -0200 +7C00 +C600 +C600 0600 +06C0 +06C0 +0FC0 +0C60 +0C60 0C00 -1800 -3000 -7800 -CC00 -C4C0 -7FA0 -1F20 -01C0 +0C00 ENDCHAR -STARTCHAR 0x134D -ENCODING 4941 +STARTCHAR gWa +ENCODING 4883 SWIDTH 960 0 DWIDTH 16 0 -BBX 8 12 0 0 +BBX 7 11 0 0 BITMAP -3E -67 -43 -C0 -C0 -F8 -CF -DD -6C -0C -0C +78 +CC +CC 0C -ENDCHAR -STARTCHAR 0x134E -ENCODING 4942 -SWIDTH 960 0 -DWIDTH 16 0 -BBX 10 11 0 0 -BITMAP -1F80 -3E40 -63C0 -C000 -C000 -C000 -F000 -E800 -C4C0 -6D80 -3F80 +7E +66 +06 +06 +06 +06 +06 ENDCHAR -STARTCHAR 0x134F -ENCODING 4943 +STARTCHAR gWE +ENCODING 4884 SWIDTH 960 0 DWIDTH 16 0 BBX 10 13 0 -2 BITMAP -0800 +7C00 +C600 +C600 +0600 +0600 +0600 0C00 -1800 -1000 -3000 -7000 -D800 -CC80 -7FC0 -0C40 0C00 -3F00 -6180 +0C00 +0F80 +0CC0 +3F80 +6000 ENDCHAR -STARTCHAR 0x1350 -ENCODING 4944 +STARTCHAR gWu/gW +ENCODING 4885 SWIDTH 960 0 DWIDTH 16 0 -BBX 10 12 0 0 +BBX 12 11 0 0 BITMAP -6180 -7F80 -FFC0 -CCC0 -0C00 -0C00 -0C00 -0C00 +7C00 +C6C0 +C6C0 +07F0 +0630 +0600 +0E00 0C00 0C00 0C00 0C00 ENDCHAR -STARTCHAR 0x1351 -ENCODING 4945 +STARTCHAR Ge +ENCODING 4888 SWIDTH 960 0 DWIDTH 16 0 -BBX 10 12 0 0 +BBX 8 12 0 0 BITMAP -6180 -7F80 -FFC0 -CCC0 -0C00 -0C00 -0C00 -0FC0 -0CC0 -0C00 +C3 +7E +00 +7C +C6 +C6 +06 +04 +0C +0C +0C +0C +ENDCHAR +STARTCHAR Gu +ENCODING 4889 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 11 12 0 0 +BITMAP +C300 +7E00 +0000 +7C00 +C600 +C600 +0600 +0600 +0FE0 +0C60 0C00 0C00 ENDCHAR -STARTCHAR 0x1352 -ENCODING 4946 +STARTCHAR Gi +ENCODING 4890 SWIDTH 960 0 DWIDTH 16 0 BBX 10 12 0 0 BITMAP -6180 -7F80 -FFC0 -CCC0 -0C00 -0C00 -0C00 -0C00 +C300 +7E00 +0000 +7C00 +C600 +C600 +0600 +0400 0C00 0C00 0CC0 0FC0 ENDCHAR -STARTCHAR 0x1353 -ENCODING 4947 +STARTCHAR Ga +ENCODING 4891 SWIDTH 960 0 DWIDTH 16 0 -BBX 10 12 0 0 +BBX 8 12 0 0 BITMAP -6180 -7F80 -FFC0 -CCC0 -0C00 -0C00 -0C00 -0C00 -1800 -3000 -6000 -4000 +C3 +7E +00 +3C +7F +43 +03 +03 +0E +3C +70 +E0 ENDCHAR -STARTCHAR 0x1354 -ENCODING 4948 +STARTCHAR GE +ENCODING 4892 SWIDTH 960 0 DWIDTH 16 0 BBX 10 12 0 0 BITMAP -6180 -7F80 -FFC0 -CCC0 -0C00 -0C00 -0C00 -0C00 +C300 +7E00 +0000 +7C00 +C600 +C600 +0600 +0400 0C00 0F80 0CC0 0F80 ENDCHAR -STARTCHAR 0x1355 -ENCODING 4949 +STARTCHAR G +ENCODING 4893 SWIDTH 960 0 DWIDTH 16 0 -BBX 10 12 0 0 +BBX 9 12 0 0 BITMAP -6180 -7F80 -FFC0 -CCC0 -0C00 -0F00 -0300 -0300 +C300 +7E00 +0000 +7F00 +CD80 +7980 +0180 +0100 0300 0300 0300 0300 ENDCHAR -STARTCHAR 0x1356 -ENCODING 4950 +STARTCHAR Go +ENCODING 4894 SWIDTH 960 0 DWIDTH 16 0 -BBX 10 12 0 0 +BBX 7 12 0 0 BITMAP -6180 -7F80 -FFC0 -CCC0 -0C00 -0C00 -1800 -1800 -3000 -3000 -3000 -3000 +C6 +7C +10 +7C +C6 +C6 +06 +04 +0C +0C +0C +0C ENDCHAR -STARTCHAR 0x1357 -ENCODING 4951 +STARTCHAR GWa +ENCODING 4895 SWIDTH 960 0 DWIDTH 16 0 -BBX 10 14 0 -2 +BBX 8 14 0 -2 BITMAP -6180 -7F80 -FFC0 -CCC0 -0C00 -0C00 -0C00 -0C00 -0C00 -0C00 -0C00 -0C00 -7F80 -E1C0 +C3 +7E +00 +78 +CC +CC +0C +7E +66 +06 +06 +06 +06 +06 ENDCHAR -STARTCHAR 0x1358 -ENCODING 4952 +STARTCHAR Te +ENCODING 4896 SWIDTH 960 0 DWIDTH 16 0 -BBX 12 15 2 -1 +BBX 9 10 0 0 BITMAP -7070 -1FC0 -0700 -3FF0 -7FF0 -C510 -8510 -8A10 -FBF0 -71F0 -0020 -0020 -0040 -0040 -0040 +3E00 +6B00 +6B00 +C980 +C980 +C980 +C980 +C980 +C980 +C980 ENDCHAR -STARTCHAR 0x1359 -ENCODING 4953 +STARTCHAR Tu +ENCODING 4897 SWIDTH 960 0 DWIDTH 16 0 -BBX 10 14 3 -1 +BBX 13 10 0 0 BITMAP -C0C0 -7F80 -0C00 -0C00 -0C00 -1800 -3800 -7000 -E000 -C300 -C380 -E180 -7F00 3E00 +6B00 +6B00 +C980 +C980 +C9F8 +C998 +C980 +C980 +C980 ENDCHAR -STARTCHAR 0x135A -ENCODING 4954 +STARTCHAR Ti +ENCODING 4898 SWIDTH 960 0 DWIDTH 16 0 -BBX 11 13 2 0 +BBX 13 10 0 0 BITMAP -6060 -3FC0 -0600 -0200 -0600 -0C00 -1800 -3000 -78C0 -CC40 -C4C0 -7F80 3E00 +6B00 +6B00 +C980 +C980 +C980 +C980 +C980 +C998 +C9F8 ENDCHAR -STARTCHAR 0x1360 -ENCODING 4960 +STARTCHAR Ta +ENCODING 4899 SWIDTH 960 0 DWIDTH 16 0 -BBX 0 0 0 0 +BBX 9 11 0 0 BITMAP +3E00 +6B00 +6B00 +C980 +C980 +C980 +C980 +0180 +0180 +0180 +0180 ENDCHAR -STARTCHAR 0x1361 -ENCODING 4961 +STARTCHAR TE +ENCODING 4900 SWIDTH 960 0 DWIDTH 16 0 -BBX 2 6 2 2 +BBX 13 11 0 0 BITMAP -C0 -C0 -00 -00 -C0 -C0 +3E00 +6B00 +6B00 +C980 +C980 +C980 +C980 +C980 +C9F0 +C998 +C9F0 ENDCHAR -STARTCHAR 0x1362 -ENCODING 4962 +STARTCHAR T +ENCODING 4901 SWIDTH 960 0 DWIDTH 16 0 -BBX 6 6 0 2 +BBX 11 11 0 0 BITMAP -CC -CC -00 -00 -CC -CC +3F80 +7FC0 +4CC0 +CC60 +CE60 +C660 +0600 +0600 +0600 +0600 +0600 ENDCHAR -STARTCHAR 0x1363 -ENCODING 4963 +STARTCHAR To +ENCODING 4902 SWIDTH 960 0 DWIDTH 16 0 -BBX 6 7 0 2 +BBX 9 11 0 0 BITMAP -FC -00 -30 -30 -00 -30 -30 +3E00 +6B00 +6B00 +C980 +C980 +C980 +C980 +C000 +C000 +C000 +C000 ENDCHAR -STARTCHAR 0x1364 -ENCODING 4964 +STARTCHAR TWa +ENCODING 4903 SWIDTH 960 0 DWIDTH 16 0 -BBX 6 9 0 1 +BBX 12 13 0 -2 BITMAP -FC -00 -30 -30 -00 -30 -30 -00 -FC +3E00 +6B00 +6B00 +C980 +C980 +C980 +C980 +0180 +0180 +0180 +0180 +07E0 +0C30 ENDCHAR -STARTCHAR 0x1365 -ENCODING 4965 +STARTCHAR Ce +ENCODING 4904 SWIDTH 960 0 DWIDTH 16 0 -BBX 6 7 0 2 +BBX 15 10 0 0 BITMAP -30 -30 -00 -FC -00 -30 -30 +1F80 +3FC0 +6260 +C230 +C230 +C230 +F338 +DAB6 +CAB2 +FBBE ENDCHAR -STARTCHAR 0x1366 -ENCODING 4966 +STARTCHAR Cu +ENCODING 4905 SWIDTH 960 0 DWIDTH 16 0 -BBX 6 7 0 2 +BBX 16 10 0 0 BITMAP -C0 -C0 -00 -7C -00 -C0 -C0 +1F80 +3FC0 +6260 +C230 +C23F +C233 +F338 +DAB4 +CAB2 +FBBE ENDCHAR -STARTCHAR 0x1367 -ENCODING 4967 +STARTCHAR Ci +ENCODING 4906 SWIDTH 960 0 DWIDTH 16 0 -BBX 2 10 0 1 +BBX 16 10 0 0 BITMAP -C0 -C0 -00 -00 -C0 -C0 -00 -00 -C0 -C0 +1F80 +3FC0 +6260 +C230 +C230 +C230 +F330 +DAB0 +CAB3 +FBBF ENDCHAR -STARTCHAR 0x1368 -ENCODING 4968 +STARTCHAR Ca +ENCODING 4907 SWIDTH 960 0 DWIDTH 16 0 -BBX 8 9 0 1 +BBX 14 12 0 0 BITMAP -18 -18 -C3 -DB -18 -C3 -C3 -18 -18 +1FC0 +3FE0 +6230 +C230 +E330 +D2B0 +CAB0 +FBB0 +0030 +0068 +0064 +007C ENDCHAR -STARTCHAR 0x1369 -ENCODING 4969 +STARTCHAR CE +ENCODING 4908 SWIDTH 960 0 DWIDTH 16 0 -BBX 9 13 0 -1 +BBX 16 10 0 0 BITMAP -C180 -7F00 -0000 -0C00 -0C00 -1800 -3E00 -6300 -6300 -3E00 -0000 -7F00 -C180 +1F80 +3FC0 +6260 +C23F +C239 +C237 +F330 +DABC +CAB2 +FBBE ENDCHAR -STARTCHAR 0x136A -ENCODING 4970 +STARTCHAR C +ENCODING 4909 SWIDTH 960 0 DWIDTH 16 0 -BBX 9 13 0 -1 +BBX 14 11 0 0 BITMAP -C180 -7F00 -0000 -1C00 -3600 -6600 -7C00 -6000 -7C00 -3600 -1C00 -7F00 -C180 +1FC0 +7FE0 +C630 +E638 +9724 +F33C +0300 +0380 +0340 +0320 +03E0 ENDCHAR -STARTCHAR 0x136B -ENCODING 4971 +STARTCHAR Co +ENCODING 4910 SWIDTH 960 0 DWIDTH 16 0 -BBX 8 12 0 -1 +BBX 14 12 0 0 BITMAP -C3 -7E -00 -7E -66 -60 -60 -60 -60 -00 -7E -C3 +1FC0 +3FE0 +3430 +6430 +4630 +C528 +C4A4 +C738 +E000 +D000 +C800 +F800 ENDCHAR -STARTCHAR 0x136C -ENCODING 4972 +STARTCHAR CWa +ENCODING 4911 SWIDTH 960 0 DWIDTH 16 0 -BBX 8 12 0 -1 +BBX 14 13 0 -2 BITMAP -C3 -7E -00 +1FC0 +3FE0 +6230 +C230 +E330 +D2B0 +CAB0 +FBB0 +0030 +0060 +0060 +01F8 +030C +ENDCHAR +STARTCHAR Pe +ENCODING 4912 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 8 12 0 0 +BITMAP +18 +18 +18 3C 66 66 -66 -66 3C -00 7E +E7 C3 +C3 +C3 ENDCHAR -STARTCHAR 0x136D -ENCODING 4973 +STARTCHAR Pu +ENCODING 4913 SWIDTH 960 0 DWIDTH 16 0 -BBX 9 13 0 -1 +BBX 12 12 0 0 BITMAP -C180 -7F00 -0000 1800 1800 -3F00 -7300 -6000 -6300 -3F00 -0000 -7F00 -C180 +1800 +3C00 +6600 +6600 +3C00 +7E00 +E700 +C3F0 +C330 +C300 ENDCHAR -STARTCHAR 0x136E -ENCODING 4974 +STARTCHAR Pi +ENCODING 4914 SWIDTH 960 0 DWIDTH 16 0 -BBX 9 14 0 -1 +BBX 12 12 0 0 BITMAP -C180 -7F00 -0000 +1800 +1800 +1800 3C00 -7E00 6600 -0600 -0C00 -0E00 -1B00 -1E00 -0000 -7F00 -C180 +6600 +3C00 +7E00 +E700 +C300 +C330 +C3F0 ENDCHAR -STARTCHAR 0x136F -ENCODING 4975 +STARTCHAR Pa +ENCODING 4915 SWIDTH 960 0 DWIDTH 16 0 -BBX 9 14 0 -1 +BBX 8 12 0 0 BITMAP -C180 -7F00 -0000 -3C00 -7E00 -6600 -0600 -0C00 -0800 -1900 -1F00 -0000 -7F00 -C180 +18 +18 +18 +3C +66 +3C +7E +E7 +C7 +C3 +03 +03 ENDCHAR -STARTCHAR 0x1370 -ENCODING 4976 +STARTCHAR PE +ENCODING 4916 SWIDTH 960 0 DWIDTH 16 0 -BBX 10 13 0 -1 +BBX 12 12 0 0 BITMAP -C0C0 -7F80 -0000 -7F80 -6D80 -0C00 -0C00 -0C00 -7F80 -6180 -0000 -7F80 -C0C0 +1800 +1800 +1800 +3C00 +6600 +6600 +3C00 +7E00 +E700 +C3E0 +C330 +C3E0 ENDCHAR -STARTCHAR 0x1371 -ENCODING 4977 +STARTCHAR P +ENCODING 4917 SWIDTH 960 0 DWIDTH 16 0 -BBX 8 13 0 -1 +BBX 11 12 0 0 BITMAP -C3 -7E -00 -00 -66 -66 -7E -66 -64 -38 -00 -7E -C3 +1800 +1800 +1800 +3C00 +67E0 +6660 +3C00 +7E00 +E700 +C300 +C300 +C300 ENDCHAR -STARTCHAR 0x1372 -ENCODING 4978 +STARTCHAR Po +ENCODING 4918 SWIDTH 960 0 DWIDTH 16 0 -BBX 8 12 0 -1 +BBX 8 12 0 0 BITMAP -C3 -7E -00 18 18 18 -18 -18 -18 -00 +3C +66 +3C 7E +E7 C3 +C3 +C0 +C0 ENDCHAR -STARTCHAR 0x1373 -ENCODING 4979 +STARTCHAR PWa +ENCODING 4919 SWIDTH 960 0 DWIDTH 16 0 -BBX 10 12 0 -1 +BBX 11 14 0 -2 BITMAP -C0C0 -7F80 -0000 -3F00 -2D00 -0C00 -1E00 -3300 -3300 -0000 -7F80 -C0C0 +1800 +1800 +1800 +3C00 +6600 +3C00 +7E00 +E700 +C300 +C300 +0300 +0300 +0FC0 +1860 ENDCHAR -STARTCHAR 0x1374 -ENCODING 4980 +STARTCHAR Se +ENCODING 4920 SWIDTH 960 0 DWIDTH 16 0 -BBX 10 12 0 -1 +BBX 8 10 0 0 BITMAP -C0C0 -7F80 -0000 -2F00 -6D80 -6D80 -6D80 -6D80 -3980 -0000 -7F80 -C0C0 +18 +3C +66 +66 +3C +7E +E7 +C3 +C3 +C3 ENDCHAR -STARTCHAR 0x1375 -ENCODING 4981 +STARTCHAR Su +ENCODING 4921 SWIDTH 960 0 DWIDTH 16 0 -BBX 10 13 0 -1 +BBX 12 10 0 0 BITMAP -C0C0 -7F80 -0000 -6D80 -6D80 -6D80 -3F80 -0180 -0180 -0180 -0000 -7F80 -C0C0 +1800 +3C00 +6600 +6600 +3C00 +7E00 +E700 +C3F0 +C330 +C300 ENDCHAR -STARTCHAR 0x1376 -ENCODING 4982 +STARTCHAR Si +ENCODING 4922 SWIDTH 960 0 DWIDTH 16 0 -BBX 8 13 0 -1 +BBX 12 10 0 0 BITMAP -C3 -7E -00 -3E +1800 +3C00 +6600 +6600 +3C00 +7E00 +E700 +C300 +C330 +C3F0 +ENDCHAR +STARTCHAR Sa +ENCODING 4923 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 8 11 0 0 +BITMAP +18 +3C 66 -3E -06 -0C -0C -0C -00 +66 +3C 7E +E6 +C7 C3 +03 +03 ENDCHAR -STARTCHAR 0x1377 -ENCODING 4983 +STARTCHAR SE +ENCODING 4924 SWIDTH 960 0 DWIDTH 16 0 -BBX 10 13 0 -1 +BBX 11 10 0 0 BITMAP -C0C0 -7F80 -0000 -7F80 -6D80 -0C00 -0E00 -0600 -7F80 -6180 -0000 -7F80 -C0C0 +1800 +3C00 +6600 +6600 +3C00 +7E00 +E700 +C3C0 +C360 +C3C0 ENDCHAR -STARTCHAR 0x1378 -ENCODING 4984 +STARTCHAR S +ENCODING 4925 SWIDTH 960 0 DWIDTH 16 0 -BBX 8 12 0 -1 +BBX 11 10 0 0 BITMAP -C3 -7E -00 -3E -6B -6E -60 +1800 +3C00 +67E0 +6660 +3C00 +7E00 +E700 +C300 +C300 +C300 +ENDCHAR +STARTCHAR So +ENCODING 4926 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 8 11 0 0 +BITMAP +18 +3C 66 -3E -00 +66 +3C 7E +E7 +C3 C3 +C0 +C0 ENDCHAR -STARTCHAR 0x1379 -ENCODING 4985 +STARTCHAR SWa +ENCODING 4927 SWIDTH 960 0 DWIDTH 16 0 -BBX 11 12 0 -1 +BBX 11 13 0 -2 BITMAP -C060 -7FC0 -0000 -7FC0 -5B40 -1B00 -1B00 -1B00 -1B00 -0000 -7FC0 -C060 +1800 +3C00 +6600 +6600 +3C00 +7E00 +E600 +C700 +C300 +0300 +0300 +0FC0 +1860 ENDCHAR -STARTCHAR 0x137A -ENCODING 4986 +STARTCHAR `Se/S2e +ENCODING 4928 SWIDTH 960 0 DWIDTH 16 0 -BBX 9 14 0 -1 +BBX 8 11 0 0 BITMAP -C180 +1E +63 +C3 +C3 +C3 +FF +C3 +C3 +C3 +7F +60 +ENDCHAR +STARTCHAR `Su/S2u +ENCODING 4929 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 12 11 0 0 +BITMAP +1E00 +6300 +C300 +C300 +C300 +FF00 +C3F0 +C330 +C300 7F00 -0000 -3E00 -3600 -0C00 -0E00 -0600 -0C00 -0C00 -0C00 -0000 +6000 +ENDCHAR +STARTCHAR `Si/S2i +ENCODING 4930 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 11 12 0 0 +BITMAP +7E00 +C300 +C300 +FF00 +C300 +C300 7F00 -C180 +0300 +0300 +0300 +0330 +03F0 ENDCHAR -STARTCHAR 0x137B -ENCODING 4987 +STARTCHAR `Sa/S2a +ENCODING 4931 SWIDTH 960 0 DWIDTH 16 0 -BBX 8 13 0 -1 +BBX 8 12 0 0 BITMAP -C3 -7E -00 -3C -66 -7C -60 -30 -30 -30 -00 7E C3 +C3 +FF +C3 +C3 +7F +03 +03 +03 +03 +03 ENDCHAR -STARTCHAR 0x137C -ENCODING 4988 +STARTCHAR `SE/S2E +ENCODING 4932 SWIDTH 960 0 DWIDTH 16 0 -BBX 12 13 0 -1 +BBX 12 12 0 0 BITMAP -C030 -7FE0 -0000 -79E0 -CF30 -FBE0 +7E00 C300 -6180 -6180 -6180 -0000 -7FE0 -C030 -ENDCHAR -STARTCHAR 0x137F -ENCODING 4991 -SWIDTH 1020 0 -DWIDTH 17 0 -BBX 15 14 1 -1 -BITMAP -0FE0 -1838 -37CC -6CCC -ECC6 -CCC6 -C8C6 -C8C6 -C8C4 -C8CC -60F0 -7000 -3800 -0F80 +C300 +FF00 +C300 +C300 +7F00 +0300 +0300 +03E0 +0330 +03E0 ENDCHAR -STARTCHAR 0x1E00 -ENCODING 7680 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 11 15 0 -4 +STARTCHAR `S/S2 +ENCODING 4933 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 8 13 0 0 BITMAP -0400 -0400 -0A00 -0A00 -0A00 -1100 -1100 -1F00 -2080 -2080 -F1E0 -0C00 -1200 -1200 -0C00 +18 +18 +18 +7E +E3 +C3 +C3 +FF +C3 +C3 +C3 +7F +60 ENDCHAR -STARTCHAR 0x1E01 -ENCODING 7681 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 6 11 1 -4 +STARTCHAR `So/S2o +ENCODING 4934 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 8 12 0 0 BITMAP +3C +66 +C3 +FF +C3 +E7 +7E +3C 70 -88 -08 -78 -88 -88 -7C -30 -48 -48 -30 +C0 +C0 +C0 ENDCHAR -STARTCHAR 0x1E02 -ENCODING 7682 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 10 14 0 0 +STARTCHAR fe +ENCODING 4936 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 10 11 0 0 BITMAP -0C00 +0600 +0200 +0600 0C00 -0000 -FF00 -2080 -2040 -2040 -2080 -3F00 -2080 -2040 -2040 -2080 -FF00 +1800 +3000 +7800 +CC00 +C440 +7FC0 +1F40 ENDCHAR -STARTCHAR 0x1E03 -ENCODING 7683 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 6 15 1 0 +STARTCHAR fu +ENCODING 4937 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 9 12 0 0 BITMAP -30 -30 -00 -C0 -40 -40 -40 -40 -78 -44 -44 -44 -44 -44 -78 +0400 +0C00 +1800 +3000 +6000 +F800 +C880 +CF80 +FE00 +1800 +3000 +3000 ENDCHAR -STARTCHAR 0x1E04 -ENCODING 7684 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 10 14 0 -3 +STARTCHAR fi +ENCODING 4938 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 10 11 0 0 BITMAP -FF00 -2080 -2040 -2040 -2080 -3F00 -2080 -2040 -2040 -2080 -FF00 -0000 -0C00 +0600 +0200 +0600 0C00 +1800 +3000 +78C0 +CC40 +C4C0 +7F80 +3E00 ENDCHAR -STARTCHAR 0x1E05 -ENCODING 7685 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 6 15 1 -3 +STARTCHAR fa +ENCODING 4939 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 10 12 0 0 BITMAP -C0 -40 -40 -40 -40 -78 -44 -44 -44 -44 -44 -78 -00 -30 -30 +0800 +0C00 +1800 +1000 +3000 +7000 +D800 +CC80 +7FC0 +0C40 +0C00 +0C00 ENDCHAR -STARTCHAR 0x1E06 -ENCODING 7686 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 10 13 0 -2 +STARTCHAR fE +ENCODING 4940 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 11 12 0 0 BITMAP -FF00 -2080 -2040 -2040 -2080 -3F00 -2080 -2040 -2040 -2080 -FF00 -0000 -1F00 +0600 +0200 +0600 +0C00 +1800 +3000 +7800 +CC00 +C4C0 +7FA0 +1F20 +01C0 ENDCHAR -STARTCHAR 0x1E07 -ENCODING 7687 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 6 14 1 -2 +STARTCHAR f +ENCODING 4941 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 8 12 0 0 BITMAP +3E +67 +43 C0 -40 -40 -40 -40 -78 -44 -44 -44 -44 -44 -78 -00 -7C +C0 +F8 +CF +DD +6C +0C +0C +0C ENDCHAR -STARTCHAR 0x1E08 -ENCODING 7688 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 9 19 1 -3 +STARTCHAR fo +ENCODING 4942 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 10 11 0 0 BITMAP -0400 -0C00 +1F80 +3E40 +63C0 +C000 +C000 +C000 +F000 +E800 +C4C0 +6D80 +3F80 +ENDCHAR +STARTCHAR fWa +ENCODING 4943 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 10 13 0 -2 +BITMAP 0800 +0C00 +1800 1000 -0000 -1E80 -2180 -4080 -8080 -8000 -8000 -8000 -8080 -4080 -2100 -1E00 -0800 -0400 -1C00 +3000 +7000 +D800 +CC80 +7FC0 +0C40 +0C00 +3F00 +6180 ENDCHAR -STARTCHAR 0x1E09 -ENCODING 7689 -SWIDTH 360 0 -DWIDTH 6 0 -BBX 5 15 1 -3 +STARTCHAR pe +ENCODING 4944 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 10 12 0 0 BITMAP -10 -30 -20 -40 -00 -70 -88 -80 -80 -80 -88 -70 -20 -10 -70 +6180 +7F80 +FFC0 +CCC0 +0C00 +0C00 +0C00 +0C00 +0C00 +0C00 +0C00 +0C00 ENDCHAR -STARTCHAR 0x1E0A -ENCODING 7690 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 10 14 0 0 +STARTCHAR pu +ENCODING 4945 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 10 12 0 0 BITMAP +6180 +7F80 +FFC0 +CCC0 0C00 0C00 -0000 -FE00 -2180 -2080 -2040 -2040 -2040 -2040 -2040 -2080 -2180 -FE00 +0C00 +0FC0 +0CC0 +0C00 +0C00 +0C00 ENDCHAR -STARTCHAR 0x1E0B -ENCODING 7691 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 6 15 1 0 +STARTCHAR pi +ENCODING 4946 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 10 12 0 0 BITMAP -30 -30 -00 -18 -08 -08 -08 -08 -78 -88 -88 -88 -88 -88 -7C +6180 +7F80 +FFC0 +CCC0 +0C00 +0C00 +0C00 +0C00 +0C00 +0C00 +0CC0 +0FC0 ENDCHAR -STARTCHAR 0x1E0C -ENCODING 7692 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 10 14 0 -3 +STARTCHAR pa +ENCODING 4947 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 10 12 0 0 BITMAP -FE00 -2180 -2080 -2040 -2040 -2040 -2040 -2040 -2080 -2180 -FE00 -0000 +6180 +7F80 +FFC0 +CCC0 0C00 0C00 +0C00 +0C00 +1800 +3000 +6000 +4000 ENDCHAR -STARTCHAR 0x1E0D -ENCODING 7693 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 6 15 1 -3 +STARTCHAR pE +ENCODING 4948 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 10 12 0 0 BITMAP -18 -08 -08 -08 -08 -78 -88 -88 -88 -88 -88 -7C -00 -30 -30 +6180 +7F80 +FFC0 +CCC0 +0C00 +0C00 +0C00 +0C00 +0C00 +0F80 +0CC0 +0F80 ENDCHAR -STARTCHAR 0x1E0E -ENCODING 7694 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 10 13 0 -2 +STARTCHAR p +ENCODING 4949 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 10 12 0 0 BITMAP -FE00 -2180 -2080 -2040 -2040 -2040 -2040 -2040 -2080 -2180 -FE00 -0000 -3E00 +6180 +7F80 +FFC0 +CCC0 +0C00 +0F00 +0300 +0300 +0300 +0300 +0300 +0300 ENDCHAR -STARTCHAR 0x1E0F -ENCODING 7695 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 6 14 1 -2 +STARTCHAR po +ENCODING 4950 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 10 12 0 0 BITMAP -18 -08 -08 -08 -08 -78 -88 -88 -88 -88 -88 -7C -00 -F8 +6180 +7F80 +FFC0 +CCC0 +0C00 +0C00 +1800 +1800 +3000 +3000 +3000 +3000 ENDCHAR -STARTCHAR 0x1E10 -ENCODING 7696 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 10 14 0 -3 +STARTCHAR pWa +ENCODING 4951 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 10 14 0 -2 BITMAP -FE00 -2180 -2080 -2040 -2040 -2040 -2040 -2040 -2080 -2180 -FE00 -0800 -0400 -1C00 +6180 +7F80 +FFC0 +CCC0 +0C00 +0C00 +0C00 +0C00 +0C00 +0C00 +0C00 +0C00 +7F80 +E1C0 ENDCHAR -STARTCHAR 0x1E11 -ENCODING 7697 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 6 15 1 -3 +STARTCHAR mYa +ENCODING 4952 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 12 15 2 -1 BITMAP -18 -08 -08 -08 -08 -78 -88 -88 -88 -88 -88 -7C -20 -10 -70 -ENDCHAR -STARTCHAR 0x1E12 -ENCODING 7698 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 10 15 0 -4 -BITMAP -FE00 -2180 -2080 -2040 -2040 -2040 -2040 -2040 -2080 -2180 -FE00 -0000 -0800 -1C00 -2200 +7070 +1FC0 +0700 +3FF0 +7FF0 +C510 +8510 +8A10 +FBF0 +71F0 +0020 +0020 +0040 +0040 +0040 ENDCHAR -STARTCHAR 0x1E13 -ENCODING 7699 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 6 16 1 -4 +STARTCHAR rYa +ENCODING 4953 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 10 14 3 -1 BITMAP -18 -08 -08 -08 -08 -78 -88 -88 -88 -88 -88 -7C -00 -20 -70 -88 +C0C0 +7F80 +0C00 +0C00 +0C00 +1800 +3800 +7000 +E000 +C300 +C380 +E180 +7F00 +3E00 ENDCHAR -STARTCHAR 0x1E14 -ENCODING 7700 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 10 18 0 0 +STARTCHAR fYa +ENCODING 4954 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 11 13 2 0 BITMAP -1000 +6060 +3FC0 +0600 +0200 +0600 +0C00 1800 -0800 -0400 -0000 -3E00 -0000 -FF80 -2080 -2080 -2280 -2200 +3000 +78C0 +CC40 +C4C0 +7F80 3E00 -2240 -2240 -2080 -2080 -FF80 ENDCHAR -STARTCHAR 0x1E15 -ENCODING 7701 -SWIDTH 360 0 -DWIDTH 6 0 -BBX 5 14 1 0 +STARTCHAR Space +ENCODING 4960 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 0 0 0 0 BITMAP -40 -60 -20 -10 +ENDCHAR +STARTCHAR Ethiopic-Wordspace +ENCODING 4961 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 2 6 2 2 +BITMAP +C0 +C0 00 -F8 00 -70 -88 -F8 -80 -80 -88 -70 +C0 +C0 ENDCHAR -STARTCHAR 0x1E16 -ENCODING 7702 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 10 18 0 0 +STARTCHAR Ethiopic-Full-Stop +ENCODING 4962 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 6 6 0 2 BITMAP -0400 -0C00 -0800 -1000 -0000 -3E00 -0000 -FF80 -2080 -2080 -2280 -2200 -3E00 -2240 -2240 -2080 -2080 -FF80 +CC +CC +00 +00 +CC +CC ENDCHAR -STARTCHAR 0x1E17 -ENCODING 7703 -SWIDTH 360 0 -DWIDTH 6 0 -BBX 5 14 1 0 +STARTCHAR Ethiopic-Comma +ENCODING 4963 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 6 7 0 2 BITMAP -10 -30 -20 -40 +FC 00 -F8 +30 +30 00 -70 -88 -F8 -80 -80 -88 -70 +30 +30 ENDCHAR -STARTCHAR 0x1E18 -ENCODING 7704 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 10 15 0 -4 +STARTCHAR Ethiopic-Semicolon +ENCODING 4964 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 6 9 0 1 BITMAP -FF80 -2080 -2080 -2280 -2200 -3E00 -2240 -2240 -2080 -2080 -FF80 -0000 -0800 -1C00 -2200 +FC +00 +30 +30 +00 +30 +30 +00 +FC ENDCHAR -STARTCHAR 0x1E19 -ENCODING 7705 -SWIDTH 360 0 -DWIDTH 6 0 -BBX 5 11 1 -4 +STARTCHAR Ethiopic-Colon +ENCODING 4965 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 6 7 0 2 BITMAP -70 -88 -F8 -80 -80 -88 -70 +30 +30 00 -20 -70 -88 +FC +00 +30 +30 ENDCHAR -STARTCHAR 0x1E1A -ENCODING 7706 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 10 15 0 -4 +STARTCHAR Ethiopic-Preface-Colon +ENCODING 4966 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 6 7 0 2 BITMAP -FF80 -2080 -2080 -2280 -2200 -3E00 -2240 -2240 -2080 -2080 -FF80 -0000 -1200 -2A00 -2400 +C0 +C0 +00 +7C +00 +C0 +C0 ENDCHAR -STARTCHAR 0x1E1B -ENCODING 7707 -SWIDTH 360 0 -DWIDTH 6 0 -BBX 5 11 1 -4 +STARTCHAR Ethiopic-Question-Mark +ENCODING 4967 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 2 10 0 1 BITMAP -70 -88 -F8 -80 -80 -88 -70 +C0 +C0 00 -48 -A8 -90 +00 +C0 +C0 +00 +00 +C0 +C0 ENDCHAR -STARTCHAR 0x1E1C -ENCODING 7708 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 10 17 0 -3 +STARTCHAR Ethiopic-End-Paragraph +ENCODING 4968 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 8 9 0 1 BITMAP -2100 -1E00 -0000 -FF80 -2080 -2080 -2280 -2200 -3E00 -2240 -2240 -2080 -2080 -FF80 -0800 -0400 -1C00 +18 +18 +C3 +DB +18 +C3 +C3 +18 +18 ENDCHAR -STARTCHAR 0x1E1D -ENCODING 7709 -SWIDTH 360 0 -DWIDTH 6 0 -BBX 6 13 0 -3 +STARTCHAR Ethiopic-1 +ENCODING 4969 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 9 13 0 -1 BITMAP -84 -78 -00 -38 -44 -7C -40 -40 -44 -38 -10 -08 -38 +C180 +7F00 +0000 +0C00 +0C00 +1800 +3E00 +6300 +6300 +3E00 +0000 +7F00 +C180 ENDCHAR -STARTCHAR 0x1E1E -ENCODING 7710 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 14 0 0 +STARTCHAR Ethiopic-2 +ENCODING 4970 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 9 13 0 -1 BITMAP -1800 -1800 +C180 +7F00 0000 -FF80 -2080 -2080 -2280 -2200 -3E00 -2200 -2200 -2000 -2000 -F800 +1C00 +3600 +6600 +7C00 +6000 +7C00 +3600 +1C00 +7F00 +C180 ENDCHAR -STARTCHAR 0x1E1F -ENCODING 7711 -SWIDTH 360 0 -DWIDTH 6 0 -BBX 5 15 1 0 +STARTCHAR Ethiopic-3 +ENCODING 4971 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 8 12 0 -1 BITMAP +C3 +7E +00 +7E +66 +60 +60 60 60 00 -38 -48 -40 -40 -40 -F0 -40 -40 -40 -40 -40 -E0 -ENDCHAR -STARTCHAR 0x1E20 -ENCODING 7712 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 10 13 1 0 -BITMAP -3E00 -0000 -1E80 -2180 -4080 -8080 -8000 -8000 -83C0 -8080 -4080 -2080 -1F80 +7E +C3 ENDCHAR -STARTCHAR 0x1E21 -ENCODING 7713 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 13 1 -4 +STARTCHAR Ethiopic-4 +ENCODING 4972 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 8 12 0 -1 BITMAP -7C +C3 +7E 00 -3E -44 -44 -44 -78 -40 -7C -82 -82 -82 -7C +3C +66 +66 +66 +66 +3C +00 +7E +C3 ENDCHAR -STARTCHAR 0x1E22 -ENCODING 7714 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 11 14 0 0 +STARTCHAR Ethiopic-5 +ENCODING 4973 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 9 13 0 -1 BITMAP -0C00 -0C00 +C180 +7F00 0000 -FBE0 -2080 -2080 -2080 -2080 -3F80 -2080 -2080 -2080 -2080 -FBE0 -ENDCHAR -STARTCHAR 0x1E23 -ENCODING 7715 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 15 1 0 +1800 +1800 +3F00 +7300 +6000 +6300 +3F00 +0000 +7F00 +C180 +ENDCHAR +STARTCHAR Ethiopic-6 +ENCODING 4974 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 9 14 0 -1 BITMAP -30 -30 -00 -C0 -40 -40 -40 -40 -78 -44 -44 -44 -44 -44 -EE +C180 +7F00 +0000 +3C00 +7E00 +6600 +0600 +0C00 +0E00 +1B00 +1E00 +0000 +7F00 +C180 ENDCHAR -STARTCHAR 0x1E24 -ENCODING 7716 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 11 14 0 -3 +STARTCHAR Ethiopic-7 +ENCODING 4975 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 9 14 0 -1 BITMAP -FBE0 -2080 -2080 -2080 -2080 -3F80 -2080 -2080 -2080 -2080 -FBE0 +C180 +7F00 +0000 +3C00 +7E00 +6600 +0600 +0C00 +0800 +1900 +1F00 +0000 +7F00 +C180 +ENDCHAR +STARTCHAR Ethiopic-8 +ENCODING 4976 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 10 13 0 -1 +BITMAP +C0C0 +7F80 0000 +7F80 +6D80 +0C00 0C00 0C00 +7F80 +6180 +0000 +7F80 +C0C0 ENDCHAR -STARTCHAR 0x1E25 -ENCODING 7717 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 15 1 -3 +STARTCHAR Ethiopic-9 +ENCODING 4977 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 8 13 0 -1 BITMAP -C0 -40 -40 -40 -40 -78 -44 -44 -44 -44 -44 -EE +C3 +7E +00 +00 +66 +66 +7E +66 +64 +38 +00 +7E +C3 +ENDCHAR +STARTCHAR Ethiopic-10 +ENCODING 4978 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 8 12 0 -1 +BITMAP +C3 +7E 00 18 18 +18 +18 +18 +18 +00 +7E +C3 ENDCHAR -STARTCHAR 0x1E26 -ENCODING 7718 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 11 14 0 0 +STARTCHAR Ethiopic-20 +ENCODING 4979 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 10 12 0 -1 +BITMAP +C0C0 +7F80 +0000 +3F00 +2D00 +0C00 +1E00 +3300 +3300 +0000 +7F80 +C0C0 +ENDCHAR +STARTCHAR Ethiopic-30 +ENCODING 4980 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 10 12 0 -1 +BITMAP +C0C0 +7F80 +0000 +2F00 +6D80 +6D80 +6D80 +6D80 +3980 +0000 +7F80 +C0C0 +ENDCHAR +STARTCHAR Ethiopic-40 +ENCODING 4981 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 10 13 0 -1 +BITMAP +C0C0 +7F80 +0000 +6D80 +6D80 +6D80 +3F80 +0180 +0180 +0180 +0000 +7F80 +C0C0 +ENDCHAR +STARTCHAR Ethiopic-50 +ENCODING 4982 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 8 13 0 -1 +BITMAP +C3 +7E +00 +3E +66 +3E +06 +0C +0C +0C +00 +7E +C3 +ENDCHAR +STARTCHAR Ethiopic-60 +ENCODING 4983 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 10 13 0 -1 +BITMAP +C0C0 +7F80 +0000 +7F80 +6D80 +0C00 +0E00 +0600 +7F80 +6180 +0000 +7F80 +C0C0 +ENDCHAR +STARTCHAR Ethiopic-70 +ENCODING 4984 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 8 12 0 -1 +BITMAP +C3 +7E +00 +3E +6B +6E +60 +66 +3E +00 +7E +C3 +ENDCHAR +STARTCHAR Ethiopic-80 +ENCODING 4985 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 11 12 0 -1 BITMAP +C060 +7FC0 +0000 +7FC0 +5B40 +1B00 1B00 1B00 +1B00 +0000 +7FC0 +C060 +ENDCHAR +STARTCHAR Ethiopic-90 +ENCODING 4986 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 9 14 0 -1 +BITMAP +C180 +7F00 +0000 +3E00 +3600 +0C00 +0E00 +0600 +0C00 +0C00 +0C00 +0000 +7F00 +C180 +ENDCHAR +STARTCHAR Ethiopic-100 +ENCODING 4987 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 8 13 0 -1 +BITMAP +C3 +7E +00 +3C +66 +7C +60 +30 +30 +30 +00 +7E +C3 +ENDCHAR +STARTCHAR Ethiopic-10000 +ENCODING 4988 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 12 13 0 -1 +BITMAP +C030 +7FE0 0000 +79E0 +CF30 FBE0 -2080 -2080 +C300 +6180 +6180 +6180 +0000 +7FE0 +C030 +ENDCHAR +STARTCHAR char4991 +ENCODING 4991 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -1 +BITMAP +0FE0 +1838 +37CC +6CCC +ECC6 +CCC6 +C8C6 +C8C6 +C8C4 +C8CC +60F0 +7000 +3800 +0F80 +ENDCHAR +STARTCHAR C065 +ENCODING 7680 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 11 15 0 -4 +BITMAP +0400 +0400 +0A00 +0A00 +0A00 +1100 +1100 +1F00 2080 2080 -3F80 +F1E0 +0C00 +1200 +1200 +0C00 +ENDCHAR +STARTCHAR C097 +ENCODING 7681 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 6 11 1 -4 +BITMAP +70 +88 +08 +78 +88 +88 +7C +30 +48 +48 +30 +ENDCHAR +STARTCHAR C066 +ENCODING 7682 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 10 14 0 0 +BITMAP +0C00 +0C00 +0000 +FF00 2080 +2040 +2040 2080 +3F00 2080 +2040 +2040 2080 -FBE0 +FF00 ENDCHAR -STARTCHAR 0x1E27 -ENCODING 7719 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 15 1 0 +STARTCHAR C098 +ENCODING 7683 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 6 15 1 0 BITMAP -D8 -D8 +30 +30 00 C0 40 @@ -35862,34 +36466,34 @@ 44 44 44 -EE +78 ENDCHAR -STARTCHAR 0x1E28 -ENCODING 7720 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 11 14 0 -3 +STARTCHAR C066 +ENCODING 7684 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 10 14 0 -3 BITMAP -FBE0 -2080 -2080 -2080 -2080 -3F80 +FF00 2080 +2040 +2040 2080 +3F00 2080 +2040 +2040 2080 -FBE0 -1000 -0800 -3800 +FF00 +0000 +0C00 +0C00 ENDCHAR -STARTCHAR 0x1E29 -ENCODING 7721 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 15 1 -3 +STARTCHAR C098 +ENCODING 7685 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 6 15 1 -3 BITMAP C0 40 @@ -35902,37 +36506,36 @@ 44 44 44 -EE -40 -20 -E0 +78 +00 +30 +30 ENDCHAR -STARTCHAR 0x1E2A -ENCODING 7722 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 11 14 0 -3 +STARTCHAR C066 +ENCODING 7686 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 10 13 0 -2 BITMAP -FBE0 -2080 -2080 -2080 -2080 -3F80 +FF00 2080 +2040 +2040 2080 +3F00 2080 +2040 +2040 2080 -FBE0 +FF00 0000 -1080 -0F00 +1F00 ENDCHAR -STARTCHAR 0x1E2B -ENCODING 7723 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 15 1 -3 +STARTCHAR C098 +ENCODING 7687 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 6 14 1 -2 BITMAP C0 40 @@ -35945,555 +36548,608 @@ 44 44 44 -EE +78 00 -42 -3C +7C ENDCHAR -STARTCHAR 0x1E2C -ENCODING 7724 -SWIDTH 360 0 -DWIDTH 6 0 -BBX 5 15 1 -4 +STARTCHAR C067 +ENCODING 7688 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 9 19 1 -3 BITMAP -F8 -20 -20 -20 -20 -20 -20 -20 -20 -20 -F8 -00 -48 -A8 -90 -ENDCHAR -STARTCHAR 0x1E2D -ENCODING 7725 -SWIDTH 240 0 -DWIDTH 4 0 -BBX 5 11 0 -4 -BITMAP -60 -20 -20 -20 -20 -20 -70 -00 -48 -A8 -90 +0400 +0C00 +0800 +1000 +0000 +1E80 +2180 +4080 +8080 +8000 +8000 +8000 +8080 +4080 +2100 +1E00 +0800 +0400 +1C00 ENDCHAR -STARTCHAR 0x1E2E -ENCODING 7726 +STARTCHAR C099 +ENCODING 7689 SWIDTH 360 0 DWIDTH 6 0 -BBX 5 19 1 0 +BBX 5 15 1 -3 BITMAP 10 30 20 40 -00 -D8 -D8 00 -F8 -20 -20 -20 -20 -20 -20 -20 -20 +70 +88 +80 +80 +80 +88 +70 20 -F8 -ENDCHAR -STARTCHAR 0x1E2F -ENCODING 7727 -SWIDTH 240 0 -DWIDTH 4 0 -BBX 5 15 0 0 -BITMAP 10 -30 -20 -40 -00 -D8 -D8 -00 -60 -20 -20 -20 -20 -20 70 ENDCHAR -STARTCHAR 0x1E30 -ENCODING 7728 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 11 16 1 0 +STARTCHAR C068 +ENCODING 7690 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 10 14 0 0 BITMAP -0200 -0600 -0400 -0800 +0C00 +0C00 0000 -F9E0 +FE00 +2180 2080 -2100 -2200 -2400 -2E00 -3200 -2100 -2100 +2040 +2040 +2040 +2040 +2040 2080 -F9E0 +2180 +FE00 ENDCHAR -STARTCHAR 0x1E31 -ENCODING 7729 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 17 1 0 +STARTCHAR C100 +ENCODING 7691 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 6 15 1 0 BITMAP -08 -18 -10 -20 +30 +30 00 -C0 -40 -40 -40 -40 -5E -48 -50 -70 -58 -48 -EE +18 +08 +08 +08 +08 +78 +88 +88 +88 +88 +88 +7C ENDCHAR -STARTCHAR 0x1E32 -ENCODING 7730 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 11 14 1 -3 +STARTCHAR C068 +ENCODING 7692 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 10 14 0 -3 BITMAP -F9E0 +FE00 +2180 2080 -2100 -2200 -2400 -2E00 -3200 -2100 -2100 +2040 +2040 +2040 +2040 +2040 2080 -F9E0 +2180 +FE00 0000 -0600 -0600 +0C00 +0C00 ENDCHAR -STARTCHAR 0x1E33 -ENCODING 7731 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 15 1 -3 +STARTCHAR C100 +ENCODING 7693 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 6 15 1 -3 BITMAP -C0 -40 -40 -40 -40 -5E -48 -50 -70 -58 -48 -EE +18 +08 +08 +08 +08 +78 +88 +88 +88 +88 +88 +7C 00 30 30 ENDCHAR -STARTCHAR 0x1E34 -ENCODING 7732 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 11 13 1 -2 +STARTCHAR C068 +ENCODING 7694 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 10 13 0 -2 BITMAP -F9E0 +FE00 +2180 2080 -2100 -2200 -2400 -2E00 -3200 -2100 -2100 +2040 +2040 +2040 +2040 +2040 2080 -F9E0 +2180 +FE00 0000 -1F00 +3E00 ENDCHAR -STARTCHAR 0x1E35 -ENCODING 7733 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 14 1 -2 +STARTCHAR C100 +ENCODING 7695 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 6 14 1 -2 BITMAP -C0 -40 -40 -40 -40 -5E -48 -50 -70 -58 -48 -EE -00 +18 +08 +08 +08 +08 +78 +88 +88 +88 +88 +88 7C -ENDCHAR -STARTCHAR 0x1E36 -ENCODING 7734 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 8 14 0 -3 -BITMAP -F8 -20 -20 -20 -20 -20 -21 -21 -21 -23 -FF 00 -18 -18 +F8 ENDCHAR -STARTCHAR 0x1E37 -ENCODING 7735 -SWIDTH 240 0 -DWIDTH 4 0 -BBX 3 15 1 -3 +STARTCHAR C068 +ENCODING 7696 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 10 14 0 -3 BITMAP -C0 -40 -40 -40 -40 -40 -40 -40 -40 -40 -40 -E0 -00 -60 -60 +FE00 +2180 +2080 +2040 +2040 +2040 +2040 +2040 +2080 +2180 +FE00 +0800 +0400 +1C00 ENDCHAR -STARTCHAR 0x1E38 -ENCODING 7736 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 8 16 0 -3 +STARTCHAR C100 +ENCODING 7697 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 6 15 1 -3 BITMAP -F8 -00 -F8 -20 -20 -20 -20 -20 -21 -21 -21 -23 -FF -00 18 -18 +08 +08 +08 +08 +78 +88 +88 +88 +88 +88 +7C +20 +10 +70 ENDCHAR -STARTCHAR 0x1E39 -ENCODING 7737 -SWIDTH 240 0 -DWIDTH 4 0 -BBX 5 17 0 -3 +STARTCHAR C032 +ENCODING 7698 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 10 15 0 -4 BITMAP -F8 +FE00 +2180 +2080 +2040 +2040 +2040 +2040 +2040 +2080 +2180 +FE00 +0000 +0800 +1C00 +2200 +ENDCHAR +STARTCHAR C100 +ENCODING 7699 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 6 16 1 -4 +BITMAP +18 +08 +08 +08 +08 +78 +88 +88 +88 +88 +88 +7C 00 -60 -20 -20 -20 -20 -20 -20 20 -20 -20 -20 70 -00 -30 -30 +88 ENDCHAR -STARTCHAR 0x1E3A -ENCODING 7738 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 8 13 0 -2 +STARTCHAR C069 +ENCODING 7700 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 10 18 0 0 BITMAP -F8 -20 -20 -20 -20 -20 -21 -21 -21 -23 -FF -00 -3E +1000 +1800 +0800 +0400 +0000 +3E00 +0000 +FF80 +2080 +2080 +2280 +2200 +3E00 +2240 +2240 +2080 +2080 +FF80 ENDCHAR -STARTCHAR 0x1E3B -ENCODING 7739 -SWIDTH 240 0 -DWIDTH 4 0 -BBX 5 14 0 -2 +STARTCHAR C101 +ENCODING 7701 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 14 1 0 BITMAP +40 60 -20 -20 -20 -20 -20 -20 -20 -20 20 -20 -70 +10 00 F8 -ENDCHAR -STARTCHAR 0x1E3C -ENCODING 7740 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 8 15 0 -4 -BITMAP +00 +70 +88 F8 -20 -20 -20 -20 +80 +80 +88 +70 +ENDCHAR +STARTCHAR C069 +ENCODING 7702 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 10 18 0 0 +BITMAP +0400 +0C00 +0800 +1000 +0000 +3E00 +0000 +FF80 +2080 +2080 +2280 +2200 +3E00 +2240 +2240 +2080 +2080 +FF80 +ENDCHAR +STARTCHAR C101 +ENCODING 7703 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 14 1 0 +BITMAP +10 +30 20 -21 -21 -21 -23 -FF +40 00 -10 -38 -44 +F8 +00 +70 +88 +F8 +80 +80 +88 +70 ENDCHAR -STARTCHAR 0x1E3D -ENCODING 7741 -SWIDTH 240 0 -DWIDTH 4 0 -BBX 5 16 0 -4 +STARTCHAR C069 +ENCODING 7704 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 10 15 0 -4 BITMAP -60 -20 -20 -20 -20 -20 -20 -20 -20 -20 -20 +FF80 +2080 +2080 +2280 +2200 +3E00 +2240 +2240 +2080 +2080 +FF80 +0000 +0800 +1C00 +2200 +ENDCHAR +STARTCHAR C101 +ENCODING 7705 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 11 1 -4 +BITMAP 70 +88 +F8 +80 +80 +88 +70 00 20 70 88 ENDCHAR -STARTCHAR 0x1E3E -ENCODING 7742 -SWIDTH 900 0 -DWIDTH 15 0 -BBX 14 16 1 0 +STARTCHAR C069 +ENCODING 7706 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 10 15 0 -4 BITMAP -0100 -0300 -0200 -0400 +FF80 +2080 +2080 +2280 +2200 +3E00 +2240 +2240 +2080 +2080 +FF80 0000 -F03C -3030 -3030 -2850 -2850 -2890 -2490 -2490 -2310 -2310 -FB7C +1200 +2A00 +2400 ENDCHAR -STARTCHAR 0x1E3F -ENCODING 7743 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 11 12 1 0 +STARTCHAR C101 +ENCODING 7707 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 11 1 -4 BITMAP -0200 -0600 -0400 -0800 -0000 -FB80 -4440 -4440 -4440 -4440 -4440 -E660 +70 +88 +F8 +80 +80 +88 +70 +00 +48 +A8 +90 ENDCHAR -STARTCHAR 0x1E40 -ENCODING 7744 -SWIDTH 900 0 -DWIDTH 15 0 -BBX 14 14 1 0 +STARTCHAR C069 +ENCODING 7708 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 10 17 0 -3 BITMAP -0300 -0300 +2100 +1E00 0000 -F03C -3030 -3030 -2850 -2850 -2890 -2490 -2490 -2310 -2310 -FB7C +FF80 +2080 +2080 +2280 +2200 +3E00 +2240 +2240 +2080 +2080 +FF80 +0800 +0400 +1C00 ENDCHAR -STARTCHAR 0x1E41 -ENCODING 7745 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 11 10 1 0 +STARTCHAR C101 +ENCODING 7709 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 6 13 0 -3 BITMAP -0C00 -0C00 -0000 -FB80 -4440 -4440 -4440 -4440 -4440 -E660 +84 +78 +00 +38 +44 +7C +40 +40 +44 +38 +10 +08 +38 ENDCHAR -STARTCHAR 0x1E42 -ENCODING 7746 -SWIDTH 900 0 -DWIDTH 15 0 -BBX 14 14 1 -3 +STARTCHAR C070 +ENCODING 7710 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 14 0 0 BITMAP -F03C -3030 -3030 -2850 -2850 -2890 -2490 -2490 -2310 -2310 -FB7C +1800 +1800 0000 -0300 -0300 +FF80 +2080 +2080 +2280 +2200 +3E00 +2200 +2200 +2000 +2000 +F800 ENDCHAR -STARTCHAR 0x1E43 -ENCODING 7747 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 11 10 1 -3 +STARTCHAR C102 +ENCODING 7711 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 15 1 0 BITMAP -FB80 -4440 -4440 -4440 -4440 -4440 -E660 +60 +60 +00 +38 +48 +40 +40 +40 +F0 +40 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR C071 +ENCODING 7712 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 10 13 1 0 +BITMAP +3E00 0000 -0C00 -0C00 +1E80 +2180 +4080 +8080 +8000 +8000 +83C0 +8080 +4080 +2080 +1F80 ENDCHAR -STARTCHAR 0x1E44 -ENCODING 7748 +STARTCHAR C103 +ENCODING 7713 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 7 13 1 -4 +BITMAP +7C +00 +3E +44 +44 +44 +78 +40 +7C +82 +82 +82 +7C +ENDCHAR +STARTCHAR C072 +ENCODING 7714 SWIDTH 720 0 DWIDTH 12 0 -BBX 11 14 1 0 +BBX 11 14 0 0 BITMAP 0C00 0C00 0000 -E3E0 -3080 -3080 -2880 -2880 -2480 -2280 -2280 -2180 -2180 -F880 +FBE0 +2080 +2080 +2080 +2080 +3F80 +2080 +2080 +2080 +2080 +FBE0 ENDCHAR -STARTCHAR 0x1E45 -ENCODING 7749 +STARTCHAR C104 +ENCODING 7715 SWIDTH 480 0 DWIDTH 8 0 -BBX 7 10 1 0 +BBX 7 15 1 0 BITMAP 30 30 00 -F8 +C0 +40 +40 +40 +40 +78 44 44 44 @@ -36501,34 +37157,39 @@ 44 EE ENDCHAR -STARTCHAR 0x1E46 -ENCODING 7750 +STARTCHAR C072 +ENCODING 7716 SWIDTH 720 0 DWIDTH 12 0 -BBX 11 14 1 -3 +BBX 11 14 0 -3 BITMAP -E3E0 -3080 -3080 -2880 -2880 -2480 -2280 -2280 -2180 -2180 -F880 +FBE0 +2080 +2080 +2080 +2080 +3F80 +2080 +2080 +2080 +2080 +FBE0 0000 0C00 0C00 ENDCHAR -STARTCHAR 0x1E47 -ENCODING 7751 +STARTCHAR C104 +ENCODING 7717 SWIDTH 480 0 DWIDTH 8 0 -BBX 7 10 1 -3 +BBX 7 15 1 -3 BITMAP -F8 +C0 +40 +40 +40 +40 +78 44 44 44 @@ -36539,2685 +37200,2438 @@ 18 18 ENDCHAR -STARTCHAR 0x1E48 -ENCODING 7752 +STARTCHAR C072 +ENCODING 7718 SWIDTH 720 0 DWIDTH 12 0 -BBX 11 13 1 -2 +BBX 11 14 0 0 BITMAP -E3E0 -3080 -3080 -2880 -2880 -2480 -2280 -2280 -2180 -2180 -F880 +1B00 +1B00 0000 -1F00 +FBE0 +2080 +2080 +2080 +2080 +3F80 +2080 +2080 +2080 +2080 +FBE0 ENDCHAR -STARTCHAR 0x1E49 -ENCODING 7753 +STARTCHAR C104 +ENCODING 7719 SWIDTH 480 0 DWIDTH 8 0 -BBX 7 9 1 -2 +BBX 7 15 1 0 BITMAP -F8 +D8 +D8 +00 +C0 +40 +40 +40 +40 +78 44 44 44 44 44 EE -00 -7C ENDCHAR -STARTCHAR 0x1E4A -ENCODING 7754 +STARTCHAR C072 +ENCODING 7720 SWIDTH 720 0 DWIDTH 12 0 -BBX 11 15 1 -4 +BBX 11 14 0 -3 BITMAP -E3E0 -3080 -3080 -2880 -2880 -2480 -2280 -2280 -2180 -2180 -F880 -0000 -0400 -0E00 -1100 +FBE0 +2080 +2080 +2080 +2080 +3F80 +2080 +2080 +2080 +2080 +FBE0 +1000 +0800 +3800 ENDCHAR -STARTCHAR 0x1E4B -ENCODING 7755 +STARTCHAR C104 +ENCODING 7721 SWIDTH 480 0 DWIDTH 8 0 -BBX 7 11 1 -4 +BBX 7 15 1 -3 BITMAP -F8 -4C -44 -44 -44 -44 -EE -00 -10 -38 +C0 +40 +40 +40 +40 +78 +44 +44 +44 44 +44 +EE +40 +20 +E0 ENDCHAR -STARTCHAR 0x1E4C -ENCODING 7756 +STARTCHAR C072 +ENCODING 7722 SWIDTH 720 0 DWIDTH 12 0 -BBX 10 20 1 0 +BBX 11 14 0 -3 BITMAP -0400 -0C00 -0800 -1000 -0000 -1200 -2A00 -2400 +FBE0 +2080 +2080 +2080 +2080 +3F80 +2080 +2080 +2080 +2080 +FBE0 0000 -1E00 -2100 -4080 -8040 -8040 -8040 -8040 -8040 -4080 -2100 -1E00 +1080 +0F00 ENDCHAR -STARTCHAR 0x1E4D -ENCODING 7757 +STARTCHAR C104 +ENCODING 7723 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 7 15 1 -3 +BITMAP +C0 +40 +40 +40 +40 +78 +44 +44 +44 +44 +44 +EE +00 +42 +3C +ENDCHAR +STARTCHAR C073 +ENCODING 7724 SWIDTH 360 0 DWIDTH 6 0 -BBX 5 16 1 0 +BBX 5 15 1 -4 BITMAP -10 -30 +F8 20 -40 +20 +20 +20 +20 +20 +20 +20 +20 +F8 00 48 A8 90 -00 -70 -88 -88 -88 -88 -88 -70 -ENDCHAR -STARTCHAR 0x1E4E -ENCODING 7758 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 10 18 1 0 -BITMAP -3600 -3600 -0000 -1200 -2A00 -2400 -0000 -1E00 -2100 -4080 -8040 -8040 -8040 -8040 -8040 -4080 -2100 -1E00 ENDCHAR -STARTCHAR 0x1E4F -ENCODING 7759 -SWIDTH 360 0 -DWIDTH 6 0 -BBX 5 14 1 0 +STARTCHAR C105 +ENCODING 7725 +SWIDTH 240 0 +DWIDTH 4 0 +BBX 5 11 0 -4 BITMAP -D8 -D8 +60 +20 +20 +20 +20 +20 +70 00 48 A8 90 -00 -70 -88 -88 -88 -88 -88 -70 -ENDCHAR -STARTCHAR 0x1E50 -ENCODING 7760 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 10 18 1 0 -BITMAP -1000 -1800 -0800 -0400 -0000 -3E00 -0000 -1E00 -2100 -4080 -8040 -8040 -8040 -8040 -8040 -4080 -2100 -1E00 ENDCHAR -STARTCHAR 0x1E51 -ENCODING 7761 +STARTCHAR C073 +ENCODING 7726 SWIDTH 360 0 DWIDTH 6 0 -BBX 5 14 1 0 +BBX 5 19 1 0 BITMAP -40 -60 -20 10 +30 +20 +40 00 -F8 +D8 +D8 00 -70 -88 -88 -88 -88 -88 -70 -ENDCHAR -STARTCHAR 0x1E52 -ENCODING 7762 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 10 18 1 0 -BITMAP -0400 -0C00 -0800 -1000 -0000 -3E00 -0000 -1E00 -2100 -4080 -8040 -8040 -8040 -8040 -8040 -4080 -2100 -1E00 +F8 +20 +20 +20 +20 +20 +20 +20 +20 +20 +F8 ENDCHAR -STARTCHAR 0x1E53 -ENCODING 7763 -SWIDTH 360 0 -DWIDTH 6 0 -BBX 5 14 1 0 +STARTCHAR C105 +ENCODING 7727 +SWIDTH 240 0 +DWIDTH 4 0 +BBX 5 15 0 0 BITMAP 10 30 20 40 00 -F8 +D8 +D8 00 -70 -88 -88 -88 -88 -88 +60 +20 +20 +20 +20 +20 70 ENDCHAR -STARTCHAR 0x1E54 -ENCODING 7764 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 16 0 0 +STARTCHAR C075 +ENCODING 7728 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 11 16 1 0 BITMAP +0200 +0600 0400 -0C00 0800 -1000 0000 -FF00 -2180 +F9E0 2080 +2100 +2200 +2400 +2E00 +3200 +2100 +2100 2080 -2180 -3F00 -2000 -2000 -2000 -2000 -F800 +F9E0 ENDCHAR -STARTCHAR 0x1E55 -ENCODING 7765 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 6 15 1 -3 +STARTCHAR C107 +ENCODING 7729 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 7 17 1 0 BITMAP +08 +18 10 -30 20 -40 00 -F8 -44 -44 -44 -44 -44 -78 +C0 40 40 -E0 -ENDCHAR -STARTCHAR 0x1E56 -ENCODING 7766 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 14 0 0 -BITMAP -1800 -1800 -0000 -FF00 -2180 -2080 -2080 -2180 -3F00 -2000 -2000 -2000 -2000 -F800 -ENDCHAR -STARTCHAR 0x1E57 -ENCODING 7767 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 6 13 1 -3 -BITMAP -30 -30 -00 -F8 -44 -44 -44 -44 -44 -78 40 40 -E0 +5E +48 +50 +70 +58 +48 +EE ENDCHAR -STARTCHAR 0x1E58 -ENCODING 7768 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 11 14 1 0 +STARTCHAR C075 +ENCODING 7730 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 11 14 1 -3 BITMAP -1800 -1800 -0000 -FE00 -2100 -2080 +F9E0 2080 -2100 -3E00 -2300 2100 +2200 +2400 +2E00 +3200 2100 2100 -F8E0 +2080 +F9E0 +0000 +0600 +0600 ENDCHAR -STARTCHAR 0x1E59 -ENCODING 7769 -SWIDTH 360 0 -DWIDTH 6 0 -BBX 5 10 1 0 +STARTCHAR C107 +ENCODING 7731 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 7 15 1 -3 BITMAP -60 -60 -00 -D0 -68 +C0 40 40 40 40 -F0 +5E +48 +50 +70 +58 +48 +EE +00 +30 +30 ENDCHAR -STARTCHAR 0x1E5A -ENCODING 7770 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 11 14 1 -3 +STARTCHAR C075 +ENCODING 7732 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 11 13 1 -2 BITMAP -FE00 -2100 -2080 +F9E0 2080 2100 -3E00 -2300 -2100 +2200 +2400 +2E00 +3200 2100 2100 -F8E0 +2080 +F9E0 0000 -0C00 -0C00 +1F00 ENDCHAR -STARTCHAR 0x1E5B -ENCODING 7771 -SWIDTH 360 0 -DWIDTH 6 0 -BBX 5 10 1 -3 +STARTCHAR C107 +ENCODING 7733 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 7 14 1 -2 BITMAP -D0 -68 +C0 40 40 40 40 -F0 +5E +48 +50 +70 +58 +48 +EE 00 -60 -60 -ENDCHAR -STARTCHAR 0x1E5C -ENCODING 7772 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 11 16 1 -3 -BITMAP -3E00 -0000 -FE00 -2100 -2080 -2080 -2100 -3E00 -2300 -2100 -2100 -2100 -F8E0 -0000 -0C00 -0C00 +7C ENDCHAR -STARTCHAR 0x1E5D -ENCODING 7773 -SWIDTH 360 0 -DWIDTH 6 0 -BBX 5 12 1 -3 +STARTCHAR C076 +ENCODING 7734 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 8 14 0 -3 BITMAP F8 +20 +20 +20 +20 +20 +21 +21 +21 +23 +FF 00 -D0 -68 +18 +18 +ENDCHAR +STARTCHAR C108 +ENCODING 7735 +SWIDTH 240 0 +DWIDTH 4 0 +BBX 3 15 1 -3 +BITMAP +C0 40 40 40 40 -F0 +40 +40 +40 +40 +40 +40 +E0 00 60 60 ENDCHAR -STARTCHAR 0x1E5E -ENCODING 7774 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 11 13 1 -2 -BITMAP -FE00 -2100 -2080 -2080 -2100 -3E00 -2300 -2100 -2100 -2100 -F8E0 -0000 -1F00 -ENDCHAR -STARTCHAR 0x1E5F -ENCODING 7775 -SWIDTH 360 0 -DWIDTH 6 0 -BBX 5 9 1 -2 +STARTCHAR C076 +ENCODING 7736 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 8 16 0 -3 BITMAP -D0 -68 -40 -40 -40 -40 -F0 -00 F8 -ENDCHAR -STARTCHAR 0x1E60 -ENCODING 7776 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 6 14 1 0 -BITMAP -30 -30 00 -7C -84 -84 -80 -40 -30 -08 -04 -84 -84 F8 -ENDCHAR -STARTCHAR 0x1E61 -ENCODING 7777 -SWIDTH 360 0 -DWIDTH 6 0 -BBX 5 10 1 0 -BITMAP -60 -60 +20 +20 +20 +20 +20 +21 +21 +21 +23 +FF 00 -78 -88 -80 -70 -08 -88 -F0 +18 +18 ENDCHAR -STARTCHAR 0x1E62 -ENCODING 7778 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 6 14 1 -3 +STARTCHAR C108 +ENCODING 7737 +SWIDTH 240 0 +DWIDTH 4 0 +BBX 5 17 0 -3 BITMAP -7C -84 -84 -80 -40 -30 -08 -04 -84 -84 F8 00 -30 -30 -ENDCHAR -STARTCHAR 0x1E63 -ENCODING 7779 -SWIDTH 360 0 -DWIDTH 6 0 -BBX 5 10 1 -3 -BITMAP -78 -88 -80 -70 -08 -88 -F0 -00 60 -60 -ENDCHAR -STARTCHAR 0x1E64 -ENCODING 7780 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 6 19 1 0 -BITMAP -30 -30 -00 -08 -18 -10 20 -00 -7C -84 -84 -80 -40 -30 -08 -04 -84 -84 -F8 -ENDCHAR -STARTCHAR 0x1E65 -ENCODING 7781 -SWIDTH 360 0 -DWIDTH 6 0 -BBX 5 15 1 0 -BITMAP -60 -60 -00 -10 -30 20 -40 -00 -78 -88 -80 -70 -08 -88 -F0 -ENDCHAR -STARTCHAR 0x1E66 -ENCODING 7782 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 6 18 1 0 -BITMAP -30 -30 -00 -44 -38 -10 -00 -7C -84 -84 -80 -40 -30 -08 -04 -84 -84 -F8 -ENDCHAR -STARTCHAR 0x1E67 -ENCODING 7783 -SWIDTH 360 0 -DWIDTH 6 0 -BBX 5 14 1 0 -BITMAP -60 -60 -00 -88 -70 20 -00 -78 -88 -80 +20 +20 +20 +20 +20 +20 +20 70 -08 -88 -F0 -ENDCHAR -STARTCHAR 0x1E68 -ENCODING 7784 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 6 17 1 -3 -BITMAP -30 -30 -00 -7C -84 -84 -80 -40 -30 -08 -04 -84 -84 -F8 00 30 30 -ENDCHAR -STARTCHAR 0x1E69 -ENCODING 7785 -SWIDTH 360 0 -DWIDTH 6 0 -BBX 5 13 1 -3 -BITMAP -60 -60 -00 -78 -88 -80 -70 -08 -88 -F0 -00 -60 -60 -ENDCHAR -STARTCHAR 0x1E6A -ENCODING 7786 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 14 1 0 -BITMAP -1800 -1800 -0000 -FF80 -8880 -8880 -8880 -0800 -0800 -0800 -0800 -0800 -0800 -3E00 ENDCHAR -STARTCHAR 0x1E6B -ENCODING 7787 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 6 13 1 0 +STARTCHAR C076 +ENCODING 7738 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 8 13 0 -2 BITMAP -30 -30 -00 -20 +F8 20 20 -F8 20 20 20 -24 -24 -18 -ENDCHAR -STARTCHAR 0x1E6C -ENCODING 7788 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 14 1 -3 -BITMAP -FF80 -8880 -8880 -8880 -0800 -0800 -0800 -0800 -0800 -0800 -3E00 -0000 -1800 -1800 +21 +21 +21 +23 +FF +00 +3E ENDCHAR -STARTCHAR 0x1E6D -ENCODING 7789 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 6 13 1 -3 +STARTCHAR C108 +ENCODING 7739 +SWIDTH 240 0 +DWIDTH 4 0 +BBX 5 14 0 -2 BITMAP +60 20 20 20 -F8 20 20 20 -24 -24 -18 +20 +20 +20 +20 +70 00 -30 -30 -ENDCHAR -STARTCHAR 0x1E6E -ENCODING 7790 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 13 1 -2 -BITMAP -FF80 -8880 -8880 -8880 -0800 -0800 -0800 -0800 -0800 -0800 -3E00 -0000 -3E00 +F8 ENDCHAR -STARTCHAR 0x1E6F -ENCODING 7791 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 6 12 1 -2 +STARTCHAR C076 +ENCODING 7740 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 8 15 0 -4 BITMAP +F8 20 20 20 -F8 -20 20 20 -24 -24 -18 +21 +21 +21 +23 +FF 00 -7C -ENDCHAR -STARTCHAR 0x1E70 -ENCODING 7792 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 15 1 -4 -BITMAP -FF80 -8880 -8880 -8880 -0800 -0800 -0800 -0800 -0800 -0800 -3E00 -0000 -0800 -1C00 -2200 +10 +38 +44 ENDCHAR -STARTCHAR 0x1E71 -ENCODING 7793 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 6 14 1 -4 +STARTCHAR C108 +ENCODING 7741 +SWIDTH 240 0 +DWIDTH 4 0 +BBX 5 16 0 -4 BITMAP +60 20 20 20 -F8 20 20 20 -24 -24 -18 +20 +20 +20 +20 +70 00 -10 -38 -44 +20 +70 +88 ENDCHAR -STARTCHAR 0x1E72 -ENCODING 7794 +STARTCHAR C077 +ENCODING 7742 +SWIDTH 900 0 +DWIDTH 15 0 +BBX 14 16 1 0 +BITMAP +0100 +0300 +0200 +0400 +0000 +F03C +3030 +3030 +2850 +2850 +2890 +2490 +2490 +2310 +2310 +FB7C +ENDCHAR +STARTCHAR C109 +ENCODING 7743 SWIDTH 720 0 DWIDTH 12 0 -BBX 11 14 1 -3 +BBX 11 12 1 0 BITMAP -FBE0 -2080 -2080 -2080 -2080 -2080 -2080 -2080 -2080 -1100 -0E00 +0200 +0600 +0400 +0800 0000 -1B00 -1B00 +FB80 +4440 +4440 +4440 +4440 +4440 +E660 ENDCHAR -STARTCHAR 0x1E73 -ENCODING 7795 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 10 1 -3 +STARTCHAR C077 +ENCODING 7744 +SWIDTH 900 0 +DWIDTH 15 0 +BBX 14 14 1 0 BITMAP -CC -44 -44 -44 -44 -44 -3E -00 -6C -6C +0300 +0300 +0000 +F03C +3030 +3030 +2850 +2850 +2890 +2490 +2490 +2310 +2310 +FB7C ENDCHAR -STARTCHAR 0x1E74 -ENCODING 7796 +STARTCHAR C109 +ENCODING 7745 SWIDTH 720 0 DWIDTH 12 0 -BBX 11 15 1 -4 +BBX 11 10 1 0 BITMAP -FBE0 -2080 -2080 -2080 -2080 -2080 -2080 -2080 -2080 -1100 -0E00 +0C00 +0C00 0000 -0900 -1500 -1200 +FB80 +4440 +4440 +4440 +4440 +4440 +E660 ENDCHAR -STARTCHAR 0x1E75 -ENCODING 7797 +STARTCHAR C077 +ENCODING 7746 +SWIDTH 900 0 +DWIDTH 15 0 +BBX 14 14 1 -3 +BITMAP +F03C +3030 +3030 +2850 +2850 +2890 +2490 +2490 +2310 +2310 +FB7C +0000 +0300 +0300 +ENDCHAR +STARTCHAR C109 +ENCODING 7747 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 11 10 1 -3 +BITMAP +FB80 +4440 +4440 +4440 +4440 +4440 +E660 +0000 +0C00 +0C00 +ENDCHAR +STARTCHAR C078 +ENCODING 7748 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 11 14 1 0 +BITMAP +0C00 +0C00 +0000 +E3E0 +3080 +3080 +2880 +2880 +2480 +2280 +2280 +2180 +2180 +F880 +ENDCHAR +STARTCHAR C110 +ENCODING 7749 SWIDTH 480 0 DWIDTH 8 0 -BBX 7 11 1 -4 +BBX 7 10 1 0 BITMAP -CC +30 +30 +00 +F8 44 44 44 44 44 -3E -00 -24 -54 -48 +EE ENDCHAR -STARTCHAR 0x1E76 -ENCODING 7798 +STARTCHAR C078 +ENCODING 7750 SWIDTH 720 0 DWIDTH 12 0 -BBX 11 15 1 -4 +BBX 11 14 1 -3 BITMAP -FBE0 -2080 -2080 -2080 -2080 -2080 -2080 -2080 -2080 -1100 -0E00 +E3E0 +3080 +3080 +2880 +2880 +2480 +2280 +2280 +2180 +2180 +F880 0000 -0400 -0E00 -1100 +0C00 +0C00 ENDCHAR -STARTCHAR 0x1E77 -ENCODING 7799 +STARTCHAR C110 +ENCODING 7751 SWIDTH 480 0 DWIDTH 8 0 -BBX 7 11 1 -4 +BBX 7 10 1 -3 BITMAP -CC +F8 44 44 44 44 44 -3E +EE 00 -10 -38 -44 +18 +18 ENDCHAR -STARTCHAR 0x1E78 -ENCODING 7800 +STARTCHAR C078 +ENCODING 7752 SWIDTH 720 0 DWIDTH 12 0 -BBX 11 20 1 0 +BBX 11 13 1 -2 BITMAP -0200 -0600 -0400 -0800 -0000 -0900 -1500 -1200 +E3E0 +3080 +3080 +2880 +2880 +2480 +2280 +2280 +2180 +2180 +F880 0000 -FBE0 -2080 -2080 -2080 -2080 -2080 -2080 -2080 -2080 -1100 -0E00 +1F00 ENDCHAR -STARTCHAR 0x1E79 -ENCODING 7801 +STARTCHAR C110 +ENCODING 7753 SWIDTH 480 0 DWIDTH 8 0 -BBX 7 16 1 0 +BBX 7 9 1 -2 BITMAP -08 -18 -10 -20 -00 -24 -54 -48 -00 -CC +F8 44 44 44 44 44 -3E +EE +00 +7C ENDCHAR -STARTCHAR 0x1E7A -ENCODING 7802 +STARTCHAR C078 +ENCODING 7754 SWIDTH 720 0 DWIDTH 12 0 -BBX 11 16 1 0 +BBX 11 15 1 -4 BITMAP -1B00 -1B00 -0000 -1F00 +E3E0 +3080 +3080 +2880 +2880 +2480 +2280 +2280 +2180 +2180 +F880 0000 -FBE0 -2080 -2080 -2080 -2080 -2080 -2080 -2080 -2080 -1100 +0400 0E00 +1100 ENDCHAR -STARTCHAR 0x1E7B -ENCODING 7803 +STARTCHAR C110 +ENCODING 7755 SWIDTH 480 0 DWIDTH 8 0 -BBX 7 12 1 0 +BBX 7 11 1 -4 BITMAP -6C -6C -00 -7C -00 -CC +F8 +4C 44 44 44 44 +EE +00 +10 +38 44 -3E ENDCHAR -STARTCHAR 0x1E7C -ENCODING 7804 +STARTCHAR C079 +ENCODING 7756 SWIDTH 720 0 DWIDTH 12 0 -BBX 11 15 0 0 +BBX 10 20 1 0 BITMAP -0900 -1500 +0400 +0C00 +0800 +1000 +0000 1200 +2A00 +2400 0000 -F1E0 -2080 -2080 -1100 -1100 -1100 -0A00 -0A00 -0A00 -0400 -0400 +1E00 +2100 +4080 +8040 +8040 +8040 +8040 +8040 +4080 +2100 +1E00 ENDCHAR -STARTCHAR 0x1E7D -ENCODING 7805 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 8 11 1 0 +STARTCHAR C111 +ENCODING 7757 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 16 1 0 BITMAP -12 -2A -24 +10 +30 +20 +40 00 -E7 -24 -24 -24 -18 -18 -18 +48 +A8 +90 +00 +70 +88 +88 +88 +88 +88 +70 ENDCHAR -STARTCHAR 0x1E7E -ENCODING 7806 +STARTCHAR C079 +ENCODING 7758 SWIDTH 720 0 DWIDTH 12 0 -BBX 11 14 0 -3 +BBX 10 18 1 0 BITMAP -F1E0 -2080 -2080 -1100 -1100 -1100 -0A00 -0A00 -0A00 -0400 -0400 +3600 +3600 0000 -0C00 -0C00 +1200 +2A00 +2400 +0000 +1E00 +2100 +4080 +8040 +8040 +8040 +8040 +8040 +4080 +2100 +1E00 ENDCHAR -STARTCHAR 0x1E7F -ENCODING 7807 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 8 10 1 -3 +STARTCHAR C111 +ENCODING 7759 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 14 1 0 BITMAP -E7 -24 -24 -24 -18 -18 -18 +D8 +D8 00 -18 -18 -ENDCHAR -STARTCHAR 0x1E80 -ENCODING 7808 -SWIDTH 1020 0 -DWIDTH 17 0 -BBX 16 16 0 0 -BITMAP -0200 -0300 -0100 -0080 -0000 -F1CF -2184 -2184 -2244 -1248 -1248 -1248 -1428 -0C30 -0C30 -0810 +48 +A8 +90 +00 +70 +88 +88 +88 +88 +88 +70 ENDCHAR -STARTCHAR 0x1E81 -ENCODING 7809 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 11 12 0 0 +STARTCHAR C079 +ENCODING 7760 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 10 18 1 0 BITMAP +1000 +1800 0800 -0C00 0400 -0200 0000 -EEE0 -2480 -2A80 -2A80 -2A80 -1B00 -1100 +3E00 +0000 +1E00 +2100 +4080 +8040 +8040 +8040 +8040 +8040 +4080 +2100 +1E00 ENDCHAR -STARTCHAR 0x1E82 -ENCODING 7810 -SWIDTH 1020 0 -DWIDTH 17 0 -BBX 16 16 0 0 +STARTCHAR C111 +ENCODING 7761 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 14 1 0 BITMAP -0080 -0180 -0100 -0200 -0000 -F1CF -2184 -2184 -2244 -1248 -1248 -1248 -1428 -0C30 -0C30 -0810 +40 +60 +20 +10 +00 +F8 +00 +70 +88 +88 +88 +88 +88 +70 ENDCHAR -STARTCHAR 0x1E83 -ENCODING 7811 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 11 12 0 0 +STARTCHAR C079 +ENCODING 7762 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 10 18 1 0 BITMAP -0200 -0600 0400 +0C00 0800 +1000 0000 -EEE0 -2480 -2A80 -2A80 -2A80 -1B00 -1100 +3E00 +0000 +1E00 +2100 +4080 +8040 +8040 +8040 +8040 +8040 +4080 +2100 +1E00 ENDCHAR -STARTCHAR 0x1E84 -ENCODING 7812 -SWIDTH 1020 0 -DWIDTH 17 0 -BBX 16 14 0 0 +STARTCHAR C111 +ENCODING 7763 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 14 1 0 BITMAP -06C0 -06C0 -0000 -F1CF -2184 -2184 -2244 -1248 -1248 -1248 -1428 -0C30 -0C30 -0810 +10 +30 +20 +40 +00 +F8 +00 +70 +88 +88 +88 +88 +88 +70 ENDCHAR -STARTCHAR 0x1E85 -ENCODING 7813 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 11 10 0 0 +STARTCHAR C080 +ENCODING 7764 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 16 0 0 BITMAP -1B00 -1B00 +0400 +0C00 +0800 +1000 0000 -EEE0 -2480 -2A80 -2A80 -2A80 -1B00 -1100 +FF00 +2180 +2080 +2080 +2180 +3F00 +2000 +2000 +2000 +2000 +F800 ENDCHAR -STARTCHAR 0x1E86 -ENCODING 7814 -SWIDTH 1020 0 -DWIDTH 17 0 -BBX 16 14 0 0 +STARTCHAR C112 +ENCODING 7765 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 6 15 1 -3 BITMAP -0180 -0180 -0000 -F1CF -2184 -2184 -2244 -1248 -1248 -1248 -1428 -0C30 -0C30 -0810 +10 +30 +20 +40 +00 +F8 +44 +44 +44 +44 +44 +78 +40 +40 +E0 ENDCHAR -STARTCHAR 0x1E87 -ENCODING 7815 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 11 10 0 0 +STARTCHAR C080 +ENCODING 7766 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 14 0 0 BITMAP -0600 -0600 +1800 +1800 0000 -EEE0 -2480 -2A80 -2A80 -2A80 -1B00 -1100 +FF00 +2180 +2080 +2080 +2180 +3F00 +2000 +2000 +2000 +2000 +F800 ENDCHAR -STARTCHAR 0x1E88 -ENCODING 7816 -SWIDTH 1020 0 -DWIDTH 17 0 -BBX 16 14 0 -3 +STARTCHAR C112 +ENCODING 7767 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 6 13 1 -3 BITMAP -F1CF -2184 -2184 -2244 -1248 -1248 -1248 -1428 -0C30 -0C30 -0810 -0000 -0180 -0180 +30 +30 +00 +F8 +44 +44 +44 +44 +44 +78 +40 +40 +E0 ENDCHAR -STARTCHAR 0x1E89 -ENCODING 7817 +STARTCHAR C082 +ENCODING 7768 SWIDTH 660 0 DWIDTH 11 0 -BBX 11 10 0 -3 +BBX 11 14 1 0 BITMAP -EEE0 -2480 -2A80 -2A80 -2A80 -1B00 -1100 +1800 +1800 0000 -0C00 -0C00 +FE00 +2100 +2080 +2080 +2100 +3E00 +2300 +2100 +2100 +2100 +F8E0 ENDCHAR -STARTCHAR 0x1E8A -ENCODING 7818 +STARTCHAR C114 +ENCODING 7769 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 10 1 0 +BITMAP +60 +60 +00 +D0 +68 +40 +40 +40 +40 +F0 +ENDCHAR +STARTCHAR C082 +ENCODING 7770 SWIDTH 660 0 DWIDTH 11 0 -BBX 11 14 1 0 +BBX 11 14 1 -3 BITMAP -0C00 -0C00 +FE00 +2100 +2080 +2080 +2100 +3E00 +2300 +2100 +2100 +2100 +F8E0 0000 -F3C0 -1100 -1200 -0A00 0C00 -0400 -0A00 -1A00 -1100 -2080 -F1E0 +0C00 ENDCHAR -STARTCHAR 0x1E8B -ENCODING 7819 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 8 10 1 0 +STARTCHAR C114 +ENCODING 7771 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 10 1 -3 BITMAP -18 -18 +D0 +68 +40 +40 +40 +40 +F0 00 -E7 -24 -18 -18 -18 -24 -E7 +60 +60 ENDCHAR -STARTCHAR 0x1E8C -ENCODING 7820 +STARTCHAR C082 +ENCODING 7772 SWIDTH 660 0 DWIDTH 11 0 -BBX 11 14 1 0 +BBX 11 16 1 -3 BITMAP -1B00 -1B00 +3E00 0000 -F3C0 -1100 -1200 -0A00 -0C00 -0400 -0A00 -1A00 -1100 +FE00 +2100 2080 -F1E0 +2080 +2100 +3E00 +2300 +2100 +2100 +2100 +F8E0 +0000 +0C00 +0C00 ENDCHAR -STARTCHAR 0x1E8D -ENCODING 7821 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 8 10 1 0 +STARTCHAR C114 +ENCODING 7773 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 12 1 -3 BITMAP -36 -36 +F8 00 -E7 -24 -18 -18 -18 -24 -E7 +D0 +68 +40 +40 +40 +40 +F0 +00 +60 +60 ENDCHAR -STARTCHAR 0x1E8E -ENCODING 7822 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 11 14 0 0 +STARTCHAR C082 +ENCODING 7774 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 11 13 1 -2 BITMAP -0C00 -0C00 -0000 -F1E0 +FE00 +2100 2080 -1100 -1100 -0A00 -0E00 -0400 -0400 -0400 -0400 +2080 +2100 +3E00 +2300 +2100 +2100 +2100 +F8E0 +0000 1F00 ENDCHAR -STARTCHAR 0x1E8F -ENCODING 7823 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 8 13 1 -3 +STARTCHAR C114 +ENCODING 7775 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 9 1 -2 BITMAP -18 -18 +D0 +68 +40 +40 +40 +40 +F0 00 -E7 -24 -24 -24 -18 -18 -18 -10 -90 -E0 +F8 ENDCHAR -STARTCHAR 0x1E90 -ENCODING 7824 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 15 1 0 +STARTCHAR C083 +ENCODING 7776 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 6 14 1 0 BITMAP -10 -38 -44 +30 +30 00 -FE -C4 +7C 84 -88 +84 +80 +40 +30 08 -10 -20 -22 -42 -46 -FE +04 +84 +84 +F8 ENDCHAR -STARTCHAR 0x1E91 -ENCODING 7825 +STARTCHAR C115 +ENCODING 7777 SWIDTH 360 0 DWIDTH 6 0 -BBX 5 11 1 0 +BBX 5 10 1 0 BITMAP -20 +60 +60 +00 +78 +88 +80 70 +08 88 -00 -F8 -90 -90 -20 -48 -48 -F8 +F0 ENDCHAR -STARTCHAR 0x1E92 -ENCODING 7826 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 14 1 -3 +STARTCHAR C083 +ENCODING 7778 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 6 14 1 -3 BITMAP -FE -C4 +7C 84 -88 +84 +80 +40 +30 08 -10 -20 -22 -42 -46 -FE +04 +84 +84 +F8 00 30 30 ENDCHAR -STARTCHAR 0x1E93 -ENCODING 7827 +STARTCHAR C115 +ENCODING 7779 SWIDTH 360 0 DWIDTH 6 0 BBX 5 10 1 -3 BITMAP -F8 -90 -90 -20 -48 -48 -F8 +78 +88 +80 +70 +08 +88 +F0 00 60 60 ENDCHAR -STARTCHAR 0x1E94 -ENCODING 7828 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 13 1 -2 +STARTCHAR C083 +ENCODING 7780 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 6 19 1 0 BITMAP -FE -C4 -84 -88 +30 +30 +00 08 +18 10 20 -22 -42 -46 -FE 00 7C +84 +84 +80 +40 +30 +08 +04 +84 +84 +F8 ENDCHAR -STARTCHAR 0x1E95 -ENCODING 7829 +STARTCHAR C115 +ENCODING 7781 SWIDTH 360 0 DWIDTH 6 0 -BBX 5 9 1 -2 +BBX 5 15 1 0 BITMAP -F8 -90 -90 -20 -48 -48 -F8 +60 +60 00 -F8 -ENDCHAR -STARTCHAR 0x1E96 -ENCODING 7830 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 14 1 -2 -BITMAP -C0 -40 -40 -40 +10 +30 +20 40 -78 -44 -44 -44 -44 -44 -EE 00 -7C +78 +88 +80 +70 +08 +88 +F0 ENDCHAR -STARTCHAR 0x1E97 -ENCODING 7831 +STARTCHAR C083 +ENCODING 7782 SWIDTH 420 0 DWIDTH 7 0 -BBX 6 13 1 0 +BBX 6 18 1 0 BITMAP -D8 -D8 +30 +30 00 -20 -20 -20 +44 +38 +10 +00 +7C +84 +84 +80 +40 +30 +08 +04 +84 +84 F8 -20 -20 -20 -24 -24 -18 -ENDCHAR -STARTCHAR 0x1E98 -ENCODING 7832 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 11 12 0 0 -BITMAP -0600 -0900 -0900 -0600 -0000 -EEE0 -2480 -2A80 -2A80 -2A80 -1B00 -1100 ENDCHAR -STARTCHAR 0x1E99 -ENCODING 7833 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 8 15 1 -3 +STARTCHAR C115 +ENCODING 7783 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 14 1 0 BITMAP -18 -24 -24 -18 +60 +60 00 -E7 -24 -24 -24 -18 -18 -18 -10 -90 -E0 +88 +70 +20 +00 +78 +88 +80 +70 +08 +88 +F0 ENDCHAR -STARTCHAR 0x1E9A -ENCODING 7834 +STARTCHAR C083 +ENCODING 7784 SWIDTH 420 0 DWIDTH 7 0 -BBX 6 12 1 0 +BBX 6 17 1 -3 BITMAP -18 -04 -04 -18 +30 +30 00 -70 -88 -08 -78 -88 -88 7C +84 +84 +80 +40 +30 +08 +04 +84 +84 +F8 +00 +30 +30 ENDCHAR -STARTCHAR 0x1E9B -ENCODING 7835 +STARTCHAR C115 +ENCODING 7785 SWIDTH 360 0 DWIDTH 6 0 -BBX 5 15 1 0 +BBX 5 13 1 -3 BITMAP 60 60 00 -38 -48 -40 -40 -40 -C0 -40 -40 -40 -40 -40 -E0 +78 +88 +80 +70 +08 +88 +F0 +00 +60 +60 ENDCHAR -STARTCHAR 0x1EA0 -ENCODING 7840 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 11 14 0 -3 +STARTCHAR C084 +ENCODING 7786 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 14 1 0 BITMAP -0400 -0400 -0A00 -0A00 -0A00 -1100 -1100 -1F00 -2080 -2080 -F1E0 +1800 +1800 0000 -0600 -0600 +FF80 +8880 +8880 +8880 +0800 +0800 +0800 +0800 +0800 +0800 +3E00 ENDCHAR -STARTCHAR 0x1EA1 -ENCODING 7841 +STARTCHAR C116 +ENCODING 7787 SWIDTH 420 0 DWIDTH 7 0 -BBX 6 10 1 -3 +BBX 6 13 1 0 BITMAP -70 -88 -08 -78 -88 -88 -7C -00 30 30 +00 +20 +20 +20 +F8 +20 +20 +20 +24 +24 +18 ENDCHAR -STARTCHAR 0x1EA2 -ENCODING 7842 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 11 17 0 0 +STARTCHAR C084 +ENCODING 7788 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 14 1 -3 BITMAP -0400 -0A00 -0200 -0400 -0400 +FF80 +8880 +8880 +8880 +0800 +0800 +0800 +0800 +0800 +0800 +3E00 0000 -0400 -0400 -0A00 -0A00 -0A00 -1100 -1100 -1F00 -2080 -2080 -F1E0 +1800 +1800 ENDCHAR -STARTCHAR 0x1EA3 -ENCODING 7843 +STARTCHAR C116 +ENCODING 7789 SWIDTH 420 0 DWIDTH 7 0 -BBX 6 13 1 0 +BBX 6 13 1 -3 BITMAP 20 -50 -10 20 20 +F8 +20 +20 +20 +24 +24 +18 00 -70 -88 -08 -78 -88 -88 -7C +30 +30 ENDCHAR -STARTCHAR 0x1EA4 -ENCODING 7844 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 11 16 0 0 +STARTCHAR C084 +ENCODING 7790 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 13 1 -2 BITMAP -0080 -0500 -0E00 -1100 +FF80 +8880 +8880 +8880 +0800 +0800 +0800 +0800 +0800 +0800 +3E00 0000 -0400 -0400 -0A00 -0A00 -0A00 -1100 -1100 -1F00 -2080 -2080 -F1E0 +3E00 ENDCHAR -STARTCHAR 0x1EA5 -ENCODING 7845 +STARTCHAR C116 +ENCODING 7791 SWIDTH 420 0 DWIDTH 7 0 -BBX 6 12 1 0 +BBX 6 12 1 -2 BITMAP -04 -28 -70 -88 +20 +20 +20 +F8 +20 +20 +20 +24 +24 +18 00 -70 -88 -08 -78 -88 -88 7C ENDCHAR -STARTCHAR 0x1EA6 -ENCODING 7846 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 11 16 0 0 +STARTCHAR C084 +ENCODING 7792 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 15 1 -4 BITMAP -2000 -1400 -0E00 -1100 +FF80 +8880 +8880 +8880 +0800 +0800 +0800 +0800 +0800 +0800 +3E00 0000 -0400 -0400 -0A00 -0A00 -0A00 -1100 -1100 -1F00 -2080 -2080 -F1E0 +0800 +1C00 +2200 ENDCHAR -STARTCHAR 0x1EA7 -ENCODING 7847 +STARTCHAR C116 +ENCODING 7793 SWIDTH 420 0 DWIDTH 7 0 -BBX 7 12 0 0 +BBX 6 14 1 -4 BITMAP -80 -50 -38 -44 +20 +20 +20 +F8 +20 +20 +20 +24 +24 +18 00 +10 38 44 -04 -3C -44 -44 -3E ENDCHAR -STARTCHAR 0x1EA8 -ENCODING 7848 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 11 18 0 0 +STARTCHAR C085 +ENCODING 7794 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 11 14 1 -3 BITMAP -0100 -0280 -0080 -0500 -0F00 -1100 -0000 -0400 -0400 -0A00 -0A00 -0A00 -1100 -1100 -1F00 +FBE0 2080 2080 -F1E0 +2080 +2080 +2080 +2080 +2080 +2080 +1100 +0E00 +0000 +1B00 +1B00 ENDCHAR -STARTCHAR 0x1EA9 -ENCODING 7849 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 6 14 1 0 +STARTCHAR C117 +ENCODING 7795 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 7 10 1 -3 BITMAP -08 -14 -04 -28 -78 -88 +CC +44 +44 +44 +44 +44 +3E 00 -70 -88 -08 -78 -88 -88 -7C +6C +6C ENDCHAR -STARTCHAR 0x1EAA -ENCODING 7850 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 11 19 0 0 +STARTCHAR C085 +ENCODING 7796 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 11 15 1 -4 BITMAP +FBE0 +2080 +2080 +2080 +2080 +2080 +2080 +2080 +2080 +1100 +0E00 +0000 0900 1500 1200 -0000 -0400 -0E00 -1100 -0000 -0400 -0400 -0A00 -0A00 -0A00 -1100 -1100 -1F00 -2080 -2080 -F1E0 ENDCHAR -STARTCHAR 0x1EAB -ENCODING 7851 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 6 15 1 0 +STARTCHAR C117 +ENCODING 7797 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 7 11 1 -4 BITMAP -48 -A8 -90 -00 -20 -70 -88 +CC +44 +44 +44 +44 +44 +3E 00 -70 -88 -08 -78 -88 -88 -7C +24 +54 +48 ENDCHAR -STARTCHAR 0x1EAC -ENCODING 7852 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 11 18 0 -3 +STARTCHAR C085 +ENCODING 7798 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 11 15 1 -4 BITMAP -0400 -0E00 +FBE0 +2080 +2080 +2080 +2080 +2080 +2080 +2080 +2080 1100 +0E00 0000 0400 -0400 -0A00 -0A00 -0A00 -1100 +0E00 1100 -1F00 -2080 -2080 -F1E0 -0000 -0600 -0600 ENDCHAR -STARTCHAR 0x1EAD -ENCODING 7853 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 6 14 1 -3 +STARTCHAR C117 +ENCODING 7799 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 7 11 1 -4 BITMAP -20 -70 -88 -00 -70 -88 -08 -78 -88 -88 -7C +CC +44 +44 +44 +44 +44 +3E 00 -30 -30 +10 +38 +44 ENDCHAR -STARTCHAR 0x1EAE -ENCODING 7854 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 11 18 0 0 +STARTCHAR C085 +ENCODING 7800 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 11 20 1 0 BITMAP -0100 -0300 0200 +0600 0400 -1100 -0E00 +0800 0000 -0400 -0400 -0A00 -0A00 -0A00 -1100 -1100 -1F00 +0900 +1500 +1200 +0000 +FBE0 2080 2080 -F1E0 +2080 +2080 +2080 +2080 +2080 +2080 +1100 +0E00 ENDCHAR -STARTCHAR 0x1EAF -ENCODING 7855 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 6 14 1 0 +STARTCHAR C117 +ENCODING 7801 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 7 16 1 0 BITMAP 08 18 10 20 -88 -70 00 -70 -88 -08 -78 -88 -88 -7C +24 +54 +48 +00 +CC +44 +44 +44 +44 +44 +3E ENDCHAR -STARTCHAR 0x1EB0 -ENCODING 7856 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 11 18 0 0 +STARTCHAR C085 +ENCODING 7802 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 11 16 1 0 BITMAP -1000 -1800 -0800 -0400 -1100 -0E00 +1B00 +1B00 0000 -0400 -0400 -0A00 -0A00 -0A00 -1100 -1100 1F00 +0000 +FBE0 2080 2080 -F1E0 -ENDCHAR -STARTCHAR 0x1EB1 -ENCODING 7857 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 6 14 1 0 -BITMAP -80 -C0 -40 -20 -88 -70 -00 -70 -88 -08 -78 -88 -88 -7C -ENDCHAR -STARTCHAR 0x1EB2 -ENCODING 7858 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 11 19 0 0 -BITMAP -0400 -0A00 -0200 -0400 -0400 -1100 -0E00 -0000 -0400 -0400 -0A00 -0A00 -0A00 -1100 -1100 -1F00 2080 2080 -F1E0 +2080 +2080 +2080 +2080 +1100 +0E00 ENDCHAR -STARTCHAR 0x1EB3 -ENCODING 7859 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 6 15 1 0 +STARTCHAR C117 +ENCODING 7803 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 7 12 1 0 BITMAP -20 -50 -10 -20 -20 -88 -70 +6C +6C 00 -70 -88 -08 -78 -88 -88 7C +00 +CC +44 +44 +44 +44 +44 +3E ENDCHAR -STARTCHAR 0x1EB4 -ENCODING 7860 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 11 18 0 0 +STARTCHAR C086 +ENCODING 7804 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 11 15 0 0 BITMAP 0900 1500 1200 0000 +F1E0 +2080 +2080 1100 -0E00 -0000 -0400 -0400 +1100 +1100 0A00 0A00 0A00 -1100 -1100 -1F00 -2080 -2080 -F1E0 +0400 +0400 ENDCHAR -STARTCHAR 0x1EB5 -ENCODING 7861 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 6 14 1 0 +STARTCHAR C118 +ENCODING 7805 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 8 11 1 0 BITMAP -48 -A8 -90 -00 -88 -70 +12 +2A +24 00 -70 -88 -08 -78 -88 -88 -7C +E7 +24 +24 +24 +18 +18 +18 ENDCHAR -STARTCHAR 0x1EB6 -ENCODING 7862 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 11 17 0 -3 +STARTCHAR C086 +ENCODING 7806 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 11 14 0 -3 BITMAP +F1E0 +2080 +2080 1100 -0E00 -0000 -0400 -0400 +1100 +1100 0A00 0A00 0A00 -1100 -1100 -1F00 -2080 -2080 -F1E0 +0400 +0400 0000 -0600 -0600 +0C00 +0C00 ENDCHAR -STARTCHAR 0x1EB7 -ENCODING 7863 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 6 13 1 -3 +STARTCHAR C118 +ENCODING 7807 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 8 10 1 -3 BITMAP -88 -70 -00 -70 -88 -08 -78 -88 -88 -7C +E7 +24 +24 +24 +18 +18 +18 00 -30 -30 +18 +18 ENDCHAR -STARTCHAR 0x1EB8 -ENCODING 7864 +STARTCHAR C087 +ENCODING 7808 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 16 16 0 0 +BITMAP +0200 +0300 +0100 +0080 +0000 +F1CF +2184 +2184 +2244 +1248 +1248 +1248 +1428 +0C30 +0C30 +0810 +ENDCHAR +STARTCHAR C119 +ENCODING 7809 SWIDTH 660 0 DWIDTH 11 0 -BBX 10 14 0 -3 +BBX 11 12 0 0 BITMAP -FF80 -2080 -2080 -2280 -2200 -3E00 -2240 -2240 -2080 -2080 -FF80 -0000 -0C00 +0800 0C00 +0400 +0200 +0000 +EEE0 +2480 +2A80 +2A80 +2A80 +1B00 +1100 ENDCHAR -STARTCHAR 0x1EB9 -ENCODING 7865 -SWIDTH 360 0 -DWIDTH 6 0 -BBX 5 10 1 -3 +STARTCHAR C087 +ENCODING 7810 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 16 16 0 0 BITMAP -70 -88 -F8 -80 -80 -88 -70 -00 -30 -30 +0080 +0180 +0100 +0200 +0000 +F1CF +2184 +2184 +2244 +1248 +1248 +1248 +1428 +0C30 +0C30 +0810 ENDCHAR -STARTCHAR 0x1EBA -ENCODING 7866 +STARTCHAR C119 +ENCODING 7811 SWIDTH 660 0 DWIDTH 11 0 -BBX 10 17 0 0 +BBX 11 12 0 0 BITMAP -0800 -1400 +0200 +0600 0400 0800 -0800 0000 -FF80 -2080 -2080 -2280 -2200 -3E00 -2240 -2240 -2080 -2080 -FF80 +EEE0 +2480 +2A80 +2A80 +2A80 +1B00 +1100 ENDCHAR -STARTCHAR 0x1EBB -ENCODING 7867 -SWIDTH 360 0 -DWIDTH 6 0 -BBX 5 13 1 0 -BITMAP -20 -50 -10 -20 -20 -00 -70 -88 -F8 -80 -80 -88 -70 +STARTCHAR C087 +ENCODING 7812 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 16 14 0 0 +BITMAP +06C0 +06C0 +0000 +F1CF +2184 +2184 +2244 +1248 +1248 +1248 +1428 +0C30 +0C30 +0810 ENDCHAR -STARTCHAR 0x1EBC -ENCODING 7868 +STARTCHAR C119 +ENCODING 7813 SWIDTH 660 0 DWIDTH 11 0 -BBX 10 15 0 0 +BBX 11 10 0 0 BITMAP -1200 -2A00 -2400 +1B00 +1B00 0000 -FF80 -2080 -2080 -2280 -2200 -3E00 -2240 -2240 -2080 -2080 -FF80 +EEE0 +2480 +2A80 +2A80 +2A80 +1B00 +1100 ENDCHAR -STARTCHAR 0x1EBD -ENCODING 7869 -SWIDTH 360 0 -DWIDTH 6 0 -BBX 5 11 1 0 +STARTCHAR C087 +ENCODING 7814 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 16 14 0 0 BITMAP -48 -A8 -90 -00 -70 -88 -F8 -80 -80 -88 -70 +0180 +0180 +0000 +F1CF +2184 +2184 +2244 +1248 +1248 +1248 +1428 +0C30 +0C30 +0810 ENDCHAR -STARTCHAR 0x1EBE -ENCODING 7870 +STARTCHAR C119 +ENCODING 7815 SWIDTH 660 0 DWIDTH 11 0 -BBX 10 16 0 0 +BBX 11 10 0 0 BITMAP -0100 -0A00 -1C00 -2200 +0600 +0600 0000 -FF80 -2080 -2080 -2280 -2200 -3E00 -2240 -2240 -2080 -2080 -FF80 +EEE0 +2480 +2A80 +2A80 +2A80 +1B00 +1100 ENDCHAR -STARTCHAR 0x1EBF -ENCODING 7871 -SWIDTH 360 0 -DWIDTH 6 0 -BBX 6 12 1 0 +STARTCHAR C087 +ENCODING 7816 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 16 14 0 -3 BITMAP -04 -28 -70 -88 -00 -70 -88 -F8 -80 -80 -88 -70 +F1CF +2184 +2184 +2244 +1248 +1248 +1248 +1428 +0C30 +0C30 +0810 +0000 +0180 +0180 ENDCHAR -STARTCHAR 0x1EC0 -ENCODING 7872 +STARTCHAR C119 +ENCODING 7817 SWIDTH 660 0 DWIDTH 11 0 -BBX 10 16 0 0 +BBX 11 10 0 -3 BITMAP -4000 -2800 -1C00 -2200 +EEE0 +2480 +2A80 +2A80 +2A80 +1B00 +1100 0000 -FF80 -2080 -2080 -2280 -2200 -3E00 -2240 -2240 -2080 -2080 -FF80 -ENDCHAR -STARTCHAR 0x1EC1 -ENCODING 7873 -SWIDTH 360 0 -DWIDTH 6 0 -BBX 6 12 0 0 -BITMAP -80 -50 -38 -44 -00 -38 -44 -7C -40 -40 -44 -38 +0C00 +0C00 ENDCHAR -STARTCHAR 0x1EC2 -ENCODING 7874 +STARTCHAR C088 +ENCODING 7818 SWIDTH 660 0 DWIDTH 11 0 -BBX 10 18 0 0 +BBX 11 14 1 0 BITMAP -0200 -0500 -0100 -0A00 -1E00 -2200 +0C00 +0C00 0000 -FF80 -2080 -2080 -2280 -2200 -3E00 -2240 -2240 -2080 +F3C0 +1100 +1200 +0A00 +0C00 +0400 +0A00 +1A00 +1100 2080 -FF80 +F1E0 ENDCHAR -STARTCHAR 0x1EC3 -ENCODING 7875 -SWIDTH 360 0 -DWIDTH 6 0 -BBX 6 14 1 0 +STARTCHAR C120 +ENCODING 7819 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 8 10 1 0 BITMAP -08 -14 -04 -28 -78 -88 +18 +18 00 -70 -88 -F8 -80 -80 -88 -70 +E7 +24 +18 +18 +18 +24 +E7 ENDCHAR -STARTCHAR 0x1EC4 -ENCODING 7876 +STARTCHAR C088 +ENCODING 7820 SWIDTH 660 0 DWIDTH 11 0 -BBX 10 19 0 0 +BBX 11 14 1 0 BITMAP -1200 -2A00 -2400 -0000 -0800 -1C00 -2200 +1B00 +1B00 0000 -FF80 -2080 -2080 -2280 -2200 -3E00 -2240 -2240 -2080 +F3C0 +1100 +1200 +0A00 +0C00 +0400 +0A00 +1A00 +1100 2080 -FF80 +F1E0 ENDCHAR -STARTCHAR 0x1EC5 -ENCODING 7877 -SWIDTH 360 0 -DWIDTH 6 0 -BBX 5 15 1 0 +STARTCHAR C120 +ENCODING 7821 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 8 10 1 0 BITMAP -48 -A8 -90 -00 -20 -70 -88 +36 +36 00 -70 -88 -F8 -80 -80 -88 -70 +E7 +24 +18 +18 +18 +24 +E7 ENDCHAR -STARTCHAR 0x1EC6 -ENCODING 7878 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 10 18 0 -3 +STARTCHAR C089 +ENCODING 7822 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 11 14 0 0 BITMAP -0800 -1C00 -2200 -0000 -FF80 -2080 -2080 -2280 -2200 -3E00 -2240 -2240 -2080 -2080 -FF80 -0000 0C00 0C00 +0000 +F1E0 +2080 +1100 +1100 +0A00 +0E00 +0400 +0400 +0400 +0400 +1F00 ENDCHAR -STARTCHAR 0x1EC7 -ENCODING 7879 +STARTCHAR C121 +ENCODING 7823 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 8 13 1 -3 +BITMAP +18 +18 +00 +E7 +24 +24 +24 +18 +18 +18 +10 +90 +E0 +ENDCHAR +STARTCHAR C090 +ENCODING 7824 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 7 15 1 0 +BITMAP +10 +38 +44 +00 +FE +C4 +84 +88 +08 +10 +20 +22 +42 +46 +FE +ENDCHAR +STARTCHAR C122 +ENCODING 7825 SWIDTH 360 0 DWIDTH 6 0 -BBX 5 14 1 -3 +BBX 5 11 1 0 BITMAP 20 70 88 00 -70 -88 F8 -80 -80 +90 +90 +20 +48 +48 +F8 +ENDCHAR +STARTCHAR C090 +ENCODING 7826 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 7 14 1 -3 +BITMAP +FE +C4 +84 88 -70 +08 +10 +20 +22 +42 +46 +FE 00 30 30 ENDCHAR -STARTCHAR 0x1EC8 -ENCODING 7880 +STARTCHAR C122 +ENCODING 7827 SWIDTH 360 0 DWIDTH 6 0 -BBX 5 17 1 0 +BBX 5 10 1 -3 BITMAP +F8 +90 +90 20 -50 +48 +48 +F8 +00 +60 +60 +ENDCHAR +STARTCHAR C090 +ENCODING 7828 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 7 13 1 -2 +BITMAP +FE +C4 +84 +88 +08 10 -20 20 +22 +42 +46 +FE 00 +7C +ENDCHAR +STARTCHAR C122 +ENCODING 7829 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 9 1 -2 +BITMAP F8 -20 -20 -20 -20 -20 -20 -20 -20 +90 +90 20 +48 +48 +F8 +00 F8 ENDCHAR -STARTCHAR 0x1EC9 -ENCODING 7881 -SWIDTH 240 0 -DWIDTH 4 0 -BBX 3 13 1 0 +STARTCHAR C104 +ENCODING 7830 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 7 14 1 -2 BITMAP -40 -A0 -20 -40 -40 -00 C0 40 40 40 -40 40 -E0 -ENDCHAR -STARTCHAR 0x1ECA -ENCODING 7882 -SWIDTH 360 0 -DWIDTH 6 0 -BBX 5 14 1 -3 +78 +44 +44 +44 +44 +44 +EE +00 +7C +ENDCHAR +STARTCHAR C116 +ENCODING 7831 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 6 13 1 0 BITMAP -F8 -20 -20 -20 +D8 +D8 +00 20 20 20 +F8 20 20 20 -F8 +24 +24 +18 +ENDCHAR +STARTCHAR C119 +ENCODING 7832 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 11 12 0 0 +BITMAP +0600 +0900 +0900 +0600 +0000 +EEE0 +2480 +2A80 +2A80 +2A80 +1B00 +1100 +ENDCHAR +STARTCHAR C121 +ENCODING 7833 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 8 15 1 -3 +BITMAP +18 +24 +24 +18 00 -60 -60 +E7 +24 +24 +24 +18 +18 +18 +10 +90 +E0 ENDCHAR -STARTCHAR 0x1ECB -ENCODING 7883 -SWIDTH 240 0 -DWIDTH 4 0 -BBX 3 14 1 -3 +STARTCHAR C097 +ENCODING 7834 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 6 12 1 0 BITMAP -C0 -C0 +18 +04 +04 +18 00 +70 +88 +08 +78 +88 +88 +7C +ENDCHAR +STARTCHAR C102 +ENCODING 7835 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 15 1 0 +BITMAP +60 +60 00 +38 +48 +40 +40 +40 C0 40 40 @@ -39225,77 +39639,74 @@ 40 40 E0 -00 -C0 -C0 ENDCHAR -STARTCHAR 0x1ECC -ENCODING 7884 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 10 14 1 -3 +STARTCHAR C065 +ENCODING 7840 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 11 14 0 -3 BITMAP -1E00 -2100 -4080 -8040 -8040 -8040 -8040 -8040 -4080 -2100 -1E00 +0400 +0400 +0A00 +0A00 +0A00 +1100 +1100 +1F00 +2080 +2080 +F1E0 0000 -0C00 -0C00 +0600 +0600 ENDCHAR -STARTCHAR 0x1ECD -ENCODING 7885 -SWIDTH 360 0 -DWIDTH 6 0 -BBX 5 10 1 -3 +STARTCHAR C097 +ENCODING 7841 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 6 10 1 -3 BITMAP 70 -88 88 -88 +08 +78 88 88 -70 +7C 00 30 30 ENDCHAR -STARTCHAR 0x1ECE -ENCODING 7886 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 10 17 1 0 +STARTCHAR C065 +ENCODING 7842 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 11 17 0 0 BITMAP -0800 -1400 0400 -0800 -0800 +0A00 +0200 +0400 +0400 0000 -1E00 -2100 -4080 -8040 -8040 -8040 -8040 -8040 -4080 -2100 -1E00 +0400 +0400 +0A00 +0A00 +0A00 +1100 +1100 +1F00 +2080 +2080 +F1E0 ENDCHAR -STARTCHAR 0x1ECF -ENCODING 7887 -SWIDTH 360 0 -DWIDTH 6 0 -BBX 5 13 1 0 +STARTCHAR C097 +ENCODING 7843 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 6 13 1 0 BITMAP 20 50 @@ -39304,40 +39715,40 @@ 20 00 70 -88 -88 88 +08 +78 88 88 -70 +7C ENDCHAR -STARTCHAR 0x1ED0 -ENCODING 7888 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 10 16 1 0 +STARTCHAR C065 +ENCODING 7844 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 11 16 0 0 BITMAP -0100 -0A00 -1C00 -2200 +0080 +0500 +0E00 +1100 0000 -1E00 -2100 -4080 -8040 -8040 -8040 -8040 -8040 -4080 -2100 -1E00 +0400 +0400 +0A00 +0A00 +0A00 +1100 +1100 +1F00 +2080 +2080 +F1E0 ENDCHAR -STARTCHAR 0x1ED1 -ENCODING 7889 -SWIDTH 360 0 -DWIDTH 6 0 +STARTCHAR C097 +ENCODING 7845 +SWIDTH 420 0 +DWIDTH 7 0 BBX 6 12 1 0 BITMAP 04 @@ -39346,41 +39757,41 @@ 88 00 70 -88 88 -88 +08 +78 88 88 -70 +7C ENDCHAR -STARTCHAR 0x1ED2 -ENCODING 7890 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 10 16 1 0 +STARTCHAR C065 +ENCODING 7846 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 11 16 0 0 BITMAP -4000 -2800 -1C00 -2200 +2000 +1400 +0E00 +1100 0000 -1E00 -2100 -4080 -8040 -8040 -8040 -8040 -8040 -4080 -2100 -1E00 +0400 +0400 +0A00 +0A00 +0A00 +1100 +1100 +1F00 +2080 +2080 +F1E0 ENDCHAR -STARTCHAR 0x1ED3 -ENCODING 7891 -SWIDTH 360 0 -DWIDTH 6 0 -BBX 6 12 0 0 +STARTCHAR C097 +ENCODING 7847 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 7 12 0 0 BITMAP 80 50 @@ -39388,42 +39799,42 @@ 44 00 38 -44 -44 44 +04 +3C 44 44 -38 +3E ENDCHAR -STARTCHAR 0x1ED4 -ENCODING 7892 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 10 18 1 0 +STARTCHAR C065 +ENCODING 7848 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 11 18 0 0 BITMAP -0200 -0500 0100 -0A00 -1E00 -2200 +0280 +0080 +0500 +0F00 +1100 0000 -1E00 -2100 -4080 -8040 -8040 -8040 -8040 -8040 -4080 -2100 -1E00 +0400 +0400 +0A00 +0A00 +0A00 +1100 +1100 +1F00 +2080 +2080 +F1E0 ENDCHAR -STARTCHAR 0x1ED5 -ENCODING 7893 -SWIDTH 360 0 -DWIDTH 6 0 +STARTCHAR C097 +ENCODING 7849 +SWIDTH 420 0 +DWIDTH 7 0 BBX 6 14 1 0 BITMAP 08 @@ -39434,44 +39845,44 @@ 88 00 70 -88 88 -88 +08 +78 88 88 -70 +7C ENDCHAR -STARTCHAR 0x1ED6 -ENCODING 7894 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 10 19 1 0 +STARTCHAR C065 +ENCODING 7850 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 11 19 0 0 BITMAP +0900 +1500 1200 -2A00 -2400 0000 -0800 -1C00 -2200 +0400 +0E00 +1100 0000 -1E00 -2100 -4080 -8040 -8040 -8040 -8040 -8040 -4080 -2100 -1E00 +0400 +0400 +0A00 +0A00 +0A00 +1100 +1100 +1F00 +2080 +2080 +F1E0 ENDCHAR -STARTCHAR 0x1ED7 -ENCODING 7895 -SWIDTH 360 0 -DWIDTH 6 0 -BBX 5 15 1 0 +STARTCHAR C097 +ENCODING 7851 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 6 15 1 0 BITMAP 48 A8 @@ -39482,1940 +39893,1986 @@ 88 00 70 -88 -88 88 +08 +78 88 88 -70 +7C ENDCHAR -STARTCHAR 0x1ED8 -ENCODING 7896 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 10 18 1 -3 +STARTCHAR C065 +ENCODING 7852 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 11 18 0 -3 BITMAP -0800 -1C00 -2200 +0400 +0E00 +1100 0000 -1E00 -2100 -4080 -8040 -8040 -8040 -8040 -8040 -4080 -2100 -1E00 +0400 +0400 +0A00 +0A00 +0A00 +1100 +1100 +1F00 +2080 +2080 +F1E0 0000 -0C00 -0C00 +0600 +0600 ENDCHAR -STARTCHAR 0x1ED9 -ENCODING 7897 -SWIDTH 360 0 -DWIDTH 6 0 -BBX 5 14 1 -3 +STARTCHAR C097 +ENCODING 7853 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 6 14 1 -3 BITMAP 20 70 88 00 70 -88 88 -88 +08 +78 88 88 -70 +7C 00 30 30 ENDCHAR -STARTCHAR 0x1EDA -ENCODING 7898 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 11 16 1 0 +STARTCHAR C065 +ENCODING 7854 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 11 18 0 0 BITMAP +0100 +0300 +0200 0400 -0C00 -0800 -1000 -0060 -1E20 -21C0 -4080 -8040 -8040 -8040 -8040 -8040 -4080 -2100 -1E00 -ENDCHAR -STARTCHAR 0x1EDB -ENCODING 7899 -SWIDTH 360 0 -DWIDTH 6 0 -BBX 7 12 1 0 -BITMAP -10 -30 -20 -40 -06 -72 -8C +1100 +0E00 +0000 +0400 +0400 +0A00 +0A00 +0A00 +1100 +1100 +1F00 +2080 +2080 +F1E0 +ENDCHAR +STARTCHAR C097 +ENCODING 7855 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 6 14 1 0 +BITMAP +08 +18 +10 +20 88 +70 +00 +70 88 +08 +78 88 88 -70 +7C ENDCHAR -STARTCHAR 0x1EDC -ENCODING 7900 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 11 16 1 0 +STARTCHAR C065 +ENCODING 7856 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 11 18 0 0 BITMAP 1000 1800 0800 0400 -0060 -1E20 -21C0 -4080 -8040 -8040 -8040 -8040 -8040 -4080 -2100 -1E00 +1100 +0E00 +0000 +0400 +0400 +0A00 +0A00 +0A00 +1100 +1100 +1F00 +2080 +2080 +F1E0 ENDCHAR -STARTCHAR 0x1EDD -ENCODING 7901 -SWIDTH 360 0 -DWIDTH 6 0 -BBX 7 12 1 0 +STARTCHAR C097 +ENCODING 7857 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 6 14 1 0 BITMAP +80 +C0 40 -60 20 -10 -06 -72 -8C 88 +70 +00 +70 88 +08 +78 88 88 -70 +7C ENDCHAR -STARTCHAR 0x1EDE -ENCODING 7902 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 11 17 1 0 +STARTCHAR C065 +ENCODING 7858 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 11 19 0 0 BITMAP -0800 -1400 0400 -0800 -0800 -0060 -1E20 -21C0 -4080 -8040 -8040 -8040 -8040 -8040 -4080 -2100 -1E00 +0A00 +0200 +0400 +0400 +1100 +0E00 +0000 +0400 +0400 +0A00 +0A00 +0A00 +1100 +1100 +1F00 +2080 +2080 +F1E0 ENDCHAR -STARTCHAR 0x1EDF -ENCODING 7903 -SWIDTH 360 0 -DWIDTH 6 0 -BBX 7 13 1 0 +STARTCHAR C097 +ENCODING 7859 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 6 15 1 0 BITMAP 20 50 10 20 20 -06 -72 -8C 88 +70 +00 +70 88 +08 +78 88 88 -70 +7C ENDCHAR -STARTCHAR 0x1EE0 -ENCODING 7904 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 11 15 1 0 +STARTCHAR C065 +ENCODING 7860 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 11 18 0 0 BITMAP +0900 +1500 1200 -2A00 -2400 -0060 -1E20 -21C0 -4080 -8040 -8040 -8040 -8040 -8040 -4080 -2100 -1E00 +0000 +1100 +0E00 +0000 +0400 +0400 +0A00 +0A00 +0A00 +1100 +1100 +1F00 +2080 +2080 +F1E0 ENDCHAR -STARTCHAR 0x1EE1 -ENCODING 7905 -SWIDTH 360 0 -DWIDTH 6 0 -BBX 7 11 1 0 +STARTCHAR C097 +ENCODING 7861 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 6 14 1 0 BITMAP 48 A8 90 -06 -72 -8C +00 88 +70 +00 +70 88 +08 +78 88 88 -70 +7C ENDCHAR -STARTCHAR 0x1EE2 -ENCODING 7906 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 11 15 1 -3 +STARTCHAR C065 +ENCODING 7862 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 11 17 0 -3 BITMAP -0060 -1E20 -21C0 -4080 -8040 -8040 -8040 -8040 -8040 -4080 -2100 -1E00 +1100 +0E00 0000 -0C00 -0C00 +0400 +0400 +0A00 +0A00 +0A00 +1100 +1100 +1F00 +2080 +2080 +F1E0 +0000 +0600 +0600 ENDCHAR -STARTCHAR 0x1EE3 -ENCODING 7907 -SWIDTH 360 0 -DWIDTH 6 0 -BBX 7 11 1 -3 +STARTCHAR C097 +ENCODING 7863 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 6 13 1 -3 BITMAP -06 -72 -8C 88 +70 +00 +70 88 +08 +78 88 88 -70 +7C 00 30 30 ENDCHAR -STARTCHAR 0x1EE4 -ENCODING 7908 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 11 14 1 -3 +STARTCHAR C069 +ENCODING 7864 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 10 14 0 -3 BITMAP -FBE0 -2080 -2080 -2080 -2080 +FF80 2080 2080 +2280 +2200 +3E00 +2240 +2240 2080 2080 -1100 -0E00 +FF80 0000 0C00 0C00 ENDCHAR -STARTCHAR 0x1EE5 -ENCODING 7909 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 10 1 -3 +STARTCHAR C101 +ENCODING 7865 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 10 1 -3 BITMAP -CC -44 -44 -44 -44 -44 -3E +70 +88 +F8 +80 +80 +88 +70 00 -18 -18 +30 +30 ENDCHAR -STARTCHAR 0x1EE6 -ENCODING 7910 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 11 17 1 0 +STARTCHAR C069 +ENCODING 7866 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 10 17 0 0 BITMAP -0400 -0A00 -0200 -0400 +0800 +1400 0400 +0800 +0800 0000 -FBE0 -2080 -2080 -2080 -2080 +FF80 2080 2080 +2280 +2200 +3E00 +2240 +2240 2080 2080 -1100 -0E00 +FF80 ENDCHAR -STARTCHAR 0x1EE7 -ENCODING 7911 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 13 1 0 +STARTCHAR C101 +ENCODING 7867 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 13 1 0 BITMAP -10 -28 -08 -10 +20 +50 10 +20 +20 00 -CC -44 -44 -44 -44 -44 -3E +70 +88 +F8 +80 +80 +88 +70 ENDCHAR -STARTCHAR 0x1EE8 -ENCODING 7912 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 12 16 1 0 +STARTCHAR C069 +ENCODING 7868 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 10 15 0 0 BITMAP -0200 -0600 -0400 -0830 -0010 -FBE0 +1200 +2A00 +2400 +0000 +FF80 2080 2080 +2280 +2200 +3E00 +2240 +2240 2080 2080 +FF80 +ENDCHAR +STARTCHAR C101 +ENCODING 7869 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 11 1 0 +BITMAP +48 +A8 +90 +00 +70 +88 +F8 +80 +80 +88 +70 +ENDCHAR +STARTCHAR C069 +ENCODING 7870 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 10 16 0 0 +BITMAP +0100 +0A00 +1C00 +2200 +0000 +FF80 2080 2080 +2280 +2200 +3E00 +2240 +2240 2080 2080 -1100 -0E00 +FF80 ENDCHAR -STARTCHAR 0x1EE9 -ENCODING 7913 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 8 12 1 0 +STARTCHAR C101 +ENCODING 7871 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 6 12 1 0 BITMAP 04 -0C -08 -13 -01 -CE -44 -44 -44 -44 -44 -3E +28 +70 +88 +00 +70 +88 +F8 +80 +80 +88 +70 ENDCHAR -STARTCHAR 0x1EEA -ENCODING 7914 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 12 16 1 0 +STARTCHAR C069 +ENCODING 7872 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 10 16 0 0 BITMAP -0800 -0C00 -0400 -0230 -0010 -FBE0 -2080 -2080 -2080 -2080 +4000 +2800 +1C00 +2200 +0000 +FF80 2080 2080 +2280 +2200 +3E00 +2240 +2240 2080 2080 -1100 -0E00 +FF80 ENDCHAR -STARTCHAR 0x1EEB -ENCODING 7915 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 8 12 1 0 -BITMAP -40 -60 -20 -13 -01 -CE -44 -44 +STARTCHAR C101 +ENCODING 7873 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 6 12 0 0 +BITMAP +80 +50 +38 44 +00 +38 44 +7C +40 +40 44 -3E +38 ENDCHAR -STARTCHAR 0x1EEC -ENCODING 7916 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 12 17 1 0 +STARTCHAR C069 +ENCODING 7874 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 10 18 0 0 BITMAP -0400 -0A00 0200 -0400 -0430 -0010 -FBE0 -2080 -2080 -2080 -2080 +0500 +0100 +0A00 +1E00 +2200 +0000 +FF80 2080 2080 +2280 +2200 +3E00 +2240 +2240 2080 2080 -1100 -0E00 +FF80 ENDCHAR -STARTCHAR 0x1EED -ENCODING 7917 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 8 13 1 0 +STARTCHAR C101 +ENCODING 7875 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 6 14 1 0 BITMAP -10 -28 08 -10 -13 -01 -CE -44 -44 -44 -44 -44 -3E +14 +04 +28 +78 +88 +00 +70 +88 +F8 +80 +80 +88 +70 ENDCHAR -STARTCHAR 0x1EEE -ENCODING 7918 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 12 15 1 0 +STARTCHAR C069 +ENCODING 7876 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 10 19 0 0 BITMAP -0900 -1500 -1230 -0010 -FBE0 -2080 -2080 -2080 -2080 +1200 +2A00 +2400 +0000 +0800 +1C00 +2200 +0000 +FF80 2080 2080 +2280 +2200 +3E00 +2240 +2240 2080 2080 -1100 -0E00 +FF80 ENDCHAR -STARTCHAR 0x1EEF -ENCODING 7919 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 8 12 1 0 +STARTCHAR C101 +ENCODING 7877 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 15 1 0 BITMAP -24 -54 48 -03 -01 -CE -44 -44 -44 -44 -44 -3E +A8 +90 +00 +20 +70 +88 +00 +70 +88 +F8 +80 +80 +88 +70 ENDCHAR -STARTCHAR 0x1EF0 -ENCODING 7920 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 12 16 1 -3 +STARTCHAR C069 +ENCODING 7878 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 10 18 0 -3 BITMAP -0030 -0010 -FBE0 -2080 -2080 -2080 -2080 +0800 +1C00 +2200 +0000 +FF80 2080 2080 +2280 +2200 +3E00 +2240 +2240 2080 2080 -1100 -0E00 +FF80 0000 0C00 0C00 ENDCHAR -STARTCHAR 0x1EF1 -ENCODING 7921 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 8 12 1 -3 +STARTCHAR C101 +ENCODING 7879 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 14 1 -3 BITMAP -03 -01 -CE -44 -44 -44 -44 -44 -3E +20 +70 +88 00 -18 -18 +70 +88 +F8 +80 +80 +88 +70 +00 +30 +30 ENDCHAR -STARTCHAR 0x1EF2 -ENCODING 7922 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 11 16 0 0 +STARTCHAR C073 +ENCODING 7880 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 17 1 0 BITMAP -0800 -0C00 -0400 -0200 -0000 -F1E0 -2080 -1100 -1100 -0A00 -0E00 -0400 -0400 -0400 -0400 -1F00 +20 +50 +10 +20 +20 +00 +F8 +20 +20 +20 +20 +20 +20 +20 +20 +20 +F8 ENDCHAR -STARTCHAR 0x1EF3 -ENCODING 7923 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 8 15 1 -3 +STARTCHAR C105 +ENCODING 7881 +SWIDTH 240 0 +DWIDTH 4 0 +BBX 3 13 1 0 BITMAP +40 +A0 20 -30 -10 -08 +40 +40 00 -E7 -24 -24 -24 -18 -18 -18 -10 -90 +C0 +40 +40 +40 +40 +40 E0 ENDCHAR -STARTCHAR 0x1EF4 -ENCODING 7924 +STARTCHAR C073 +ENCODING 7882 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 14 1 -3 +BITMAP +F8 +20 +20 +20 +20 +20 +20 +20 +20 +20 +F8 +00 +60 +60 +ENDCHAR +STARTCHAR 0x1ECB +ENCODING 7883 +SWIDTH 240 0 +DWIDTH 4 0 +BBX 3 14 1 -3 +BITMAP +C0 +C0 +00 +00 +C0 +40 +40 +40 +40 +40 +E0 +00 +C0 +C0 +ENDCHAR +STARTCHAR C079 +ENCODING 7884 SWIDTH 720 0 DWIDTH 12 0 -BBX 11 14 0 -3 +BBX 10 14 1 -3 BITMAP -F1E0 -2080 -1100 -1100 -0A00 -0E00 -0400 -0400 -0400 -0400 -1F00 +1E00 +2100 +4080 +8040 +8040 +8040 +8040 +8040 +4080 +2100 +1E00 0000 0C00 0C00 ENDCHAR -STARTCHAR 0x1EF5 -ENCODING 7925 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 8 10 1 -3 +STARTCHAR C111 +ENCODING 7885 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 10 1 -3 BITMAP -E7 -24 -24 -24 -18 -18 -18 -10 -96 -E6 +70 +88 +88 +88 +88 +88 +70 +00 +30 +30 ENDCHAR -STARTCHAR 0x1EF6 -ENCODING 7926 +STARTCHAR C079 +ENCODING 7886 SWIDTH 720 0 DWIDTH 12 0 -BBX 11 17 0 0 +BBX 10 17 1 0 BITMAP -0400 -0A00 -0200 -0400 +0800 +1400 0400 +0800 +0800 0000 -F1E0 -2080 -1100 -1100 -0A00 -0E00 -0400 -0400 -0400 -0400 -1F00 +1E00 +2100 +4080 +8040 +8040 +8040 +8040 +8040 +4080 +2100 +1E00 ENDCHAR -STARTCHAR 0x1EF7 -ENCODING 7927 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 8 16 1 -3 +STARTCHAR C111 +ENCODING 7887 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 13 1 0 BITMAP -10 -28 -08 -10 +20 +50 10 +20 +20 00 -E7 -24 -24 -24 -18 -18 -18 -10 -90 -E0 +70 +88 +88 +88 +88 +88 +70 ENDCHAR -STARTCHAR 0x1EF8 -ENCODING 7928 +STARTCHAR C079 +ENCODING 7888 SWIDTH 720 0 DWIDTH 12 0 -BBX 11 15 0 0 +BBX 10 16 1 0 BITMAP -0900 -1500 -1200 -0000 -F1E0 -2080 -1100 -1100 +0100 0A00 -0E00 -0400 -0400 -0400 -0400 -1F00 +1C00 +2200 +0000 +1E00 +2100 +4080 +8040 +8040 +8040 +8040 +8040 +4080 +2100 +1E00 ENDCHAR -STARTCHAR 0x1EF9 -ENCODING 7929 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 8 14 1 -3 +STARTCHAR C111 +ENCODING 7889 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 6 12 1 0 BITMAP -12 -2A -24 +04 +28 +70 +88 00 -E7 -24 -24 -24 -18 -18 -18 -10 -90 -E0 -ENDCHAR -STARTCHAR 0x1F00 -ENCODING 7936 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 12 1 0 -BITMAP -18 -18 -08 -10 -00 -62 -92 -94 -8C -88 -98 -66 -ENDCHAR -STARTCHAR 0x1F01 -ENCODING 7937 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 12 1 0 -BITMAP -30 -30 -20 -10 -00 -62 -92 -94 -8C -88 -98 -66 -ENDCHAR -STARTCHAR 0x1F02 -ENCODING 7938 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 12 1 0 -BITMAP -68 -68 -24 -44 -00 -62 -92 -94 -8C -88 -98 -66 -ENDCHAR -STARTCHAR 0x1F03 -ENCODING 7939 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 12 1 0 -BITMAP -68 -68 -44 -24 -00 -62 -92 -94 -8C +70 88 -98 -66 -ENDCHAR -STARTCHAR 0x1F04 -ENCODING 7940 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 12 1 0 -BITMAP -64 -64 -28 -48 -00 -62 -92 -94 -8C 88 -98 -66 -ENDCHAR -STARTCHAR 0x1F05 -ENCODING 7941 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 12 1 0 -BITMAP -64 -64 -48 -28 -00 -62 -92 -94 -8C 88 -98 -66 -ENDCHAR -STARTCHAR 0x1F06 -ENCODING 7942 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 16 1 0 -BITMAP -24 -54 -48 -00 -18 -18 -08 -10 -00 -62 -92 -94 -8C 88 -98 -66 -ENDCHAR -STARTCHAR 0x1F07 -ENCODING 7943 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 16 1 0 -BITMAP -24 -54 -48 -00 -30 -30 -20 -10 -00 -62 -92 -94 -8C 88 -98 -66 -ENDCHAR -STARTCHAR 0x1F08 -ENCODING 7944 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 11 13 0 0 -BITMAP -6000 -6000 -2400 -4400 -0A00 -0A00 -0A00 -1100 -1100 -1F00 -2080 -2080 -F1E0 -ENDCHAR -STARTCHAR 0x1F09 -ENCODING 7945 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 11 13 0 0 -BITMAP -6000 -6000 -4400 -2400 -0A00 -0A00 -0A00 -1100 -1100 -1F00 -2080 -2080 -F1E0 +70 ENDCHAR -STARTCHAR 0x1F0A -ENCODING 7946 +STARTCHAR C079 +ENCODING 7890 SWIDTH 720 0 DWIDTH 12 0 -BBX 12 13 0 0 +BBX 10 16 1 0 BITMAP -D000 -D000 -4A00 -8A00 -0500 -0500 -0500 -0880 -0880 -0F80 -1040 -1040 -78F0 +4000 +2800 +1C00 +2200 +0000 +1E00 +2100 +4080 +8040 +8040 +8040 +8040 +8040 +4080 +2100 +1E00 ENDCHAR -STARTCHAR 0x1F0B -ENCODING 7947 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 12 13 0 0 +STARTCHAR C111 +ENCODING 7891 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 6 12 0 0 BITMAP -D000 -D000 -8A00 -4A00 -0500 -0500 -0500 -0880 -0880 -0F80 -1040 -1040 -78F0 +80 +50 +38 +44 +00 +38 +44 +44 +44 +44 +44 +38 ENDCHAR -STARTCHAR 0x1F0C -ENCODING 7948 +STARTCHAR C079 +ENCODING 7892 SWIDTH 720 0 DWIDTH 12 0 -BBX 12 13 0 0 +BBX 10 18 1 0 BITMAP -C800 -C800 -5200 -9200 -0500 -0500 +0200 0500 -0880 -0880 -0F80 -1040 -1040 -78F0 +0100 +0A00 +1E00 +2200 +0000 +1E00 +2100 +4080 +8040 +8040 +8040 +8040 +8040 +4080 +2100 +1E00 ENDCHAR -STARTCHAR 0x1F0D -ENCODING 7949 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 12 13 0 0 +STARTCHAR C111 +ENCODING 7893 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 6 14 1 0 BITMAP -C800 -C800 -9200 -5200 -0500 -0500 -0500 -0880 -0880 -0F80 -1040 -1040 -78F0 +08 +14 +04 +28 +78 +88 +00 +70 +88 +88 +88 +88 +88 +70 ENDCHAR -STARTCHAR 0x1F0E -ENCODING 7950 +STARTCHAR C079 +ENCODING 7894 SWIDTH 720 0 DWIDTH 12 0 -BBX 12 17 0 0 +BBX 10 19 1 0 BITMAP -4800 -A800 -9000 -0000 -3000 -3000 1200 -2200 -0500 -0500 -0500 -0880 -0880 -0F80 -1040 -1040 -78F0 -ENDCHAR -STARTCHAR 0x1F0F -ENCODING 7951 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 12 17 0 0 -BITMAP -4800 -A800 -9000 +2A00 +2400 0000 -3000 -3000 +0800 +1C00 2200 -1200 -0500 -0500 -0500 -0880 -0880 -0F80 -1040 -1040 -78F0 +0000 +1E00 +2100 +4080 +8040 +8040 +8040 +8040 +8040 +4080 +2100 +1E00 ENDCHAR -STARTCHAR 0x1F10 -ENCODING 7952 +STARTCHAR C111 +ENCODING 7895 SWIDTH 360 0 DWIDTH 6 0 -BBX 5 12 1 0 +BBX 5 15 1 0 BITMAP -60 -60 +48 +A8 +90 +00 20 -40 +70 +88 00 70 -90 -80 -60 -80 88 +88 +88 +88 +88 70 ENDCHAR -STARTCHAR 0x1F11 -ENCODING 7953 +STARTCHAR C079 +ENCODING 7896 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 10 18 1 -3 +BITMAP +0800 +1C00 +2200 +0000 +1E00 +2100 +4080 +8040 +8040 +8040 +8040 +8040 +4080 +2100 +1E00 +0000 +0C00 +0C00 +ENDCHAR +STARTCHAR C111 +ENCODING 7897 SWIDTH 360 0 DWIDTH 6 0 -BBX 5 12 1 0 +BBX 5 14 1 -3 BITMAP -60 -60 -40 20 +70 +88 00 70 -90 -80 -60 -80 88 +88 +88 +88 +88 70 +00 +30 +30 ENDCHAR -STARTCHAR 0x1F12 -ENCODING 7954 +STARTCHAR C079 +ENCODING 7898 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 11 16 1 0 +BITMAP +0400 +0C00 +0800 +1000 +0060 +1E20 +21C0 +4080 +8040 +8040 +8040 +8040 +8040 +4080 +2100 +1E00 +ENDCHAR +STARTCHAR C111 +ENCODING 7899 SWIDTH 360 0 DWIDTH 6 0 -BBX 5 12 1 0 +BBX 7 12 1 0 BITMAP -D0 -D0 -48 +10 +30 +20 +40 +06 +72 +8C 88 -00 -70 -90 -80 -60 -80 88 +88 +88 70 ENDCHAR -STARTCHAR 0x1F13 -ENCODING 7955 -SWIDTH 360 0 -DWIDTH 6 0 -BBX 5 12 1 0 +STARTCHAR C079 +ENCODING 7900 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 11 16 1 0 BITMAP -D0 -D0 -88 -48 -00 -70 -90 -80 -60 -80 -88 -70 +1000 +1800 +0800 +0400 +0060 +1E20 +21C0 +4080 +8040 +8040 +8040 +8040 +8040 +4080 +2100 +1E00 ENDCHAR -STARTCHAR 0x1F14 -ENCODING 7956 +STARTCHAR C111 +ENCODING 7901 SWIDTH 360 0 DWIDTH 6 0 -BBX 5 12 1 0 +BBX 7 12 1 0 BITMAP -C8 -C8 -50 -90 -00 -70 -90 -80 +40 60 -80 +20 +10 +06 +72 +8C +88 88 +88 +88 70 ENDCHAR -STARTCHAR 0x1F15 -ENCODING 7957 +STARTCHAR C079 +ENCODING 7902 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 11 17 1 0 +BITMAP +0800 +1400 +0400 +0800 +0800 +0060 +1E20 +21C0 +4080 +8040 +8040 +8040 +8040 +8040 +4080 +2100 +1E00 +ENDCHAR +STARTCHAR C111 +ENCODING 7903 SWIDTH 360 0 DWIDTH 6 0 -BBX 5 12 1 0 +BBX 7 13 1 0 BITMAP -C8 -C8 -90 +20 50 -00 -70 -90 -80 -60 -80 +10 +20 +20 +06 +72 +8C +88 +88 88 +88 70 -ENDCHAR -STARTCHAR 0x1F18 -ENCODING 7960 -SWIDTH 840 0 -DWIDTH 14 0 -BBX 13 13 0 0 -BITMAP -C000 -C000 -5FF0 -8410 -0410 -0450 -0440 -07C0 -0448 -0448 -0410 -0410 -1FF0 ENDCHAR -STARTCHAR 0x1F19 -ENCODING 7961 -SWIDTH 840 0 -DWIDTH 14 0 -BBX 13 13 0 0 +STARTCHAR C079 +ENCODING 7904 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 11 15 1 0 BITMAP -C000 -C000 -9FF0 -4410 -0410 -0450 -0440 -07C0 -0448 -0448 -0410 -0410 -1FF0 +1200 +2A00 +2400 +0060 +1E20 +21C0 +4080 +8040 +8040 +8040 +8040 +8040 +4080 +2100 +1E00 ENDCHAR -STARTCHAR 0x1F1A -ENCODING 7962 -SWIDTH 960 0 -DWIDTH 16 0 -BBX 15 13 0 0 +STARTCHAR C111 +ENCODING 7905 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 7 11 1 0 BITMAP -D000 -D000 -4FFC -8904 -0104 -0114 -0110 -01F0 -0112 -0112 -0104 -0104 -07FC +48 +A8 +90 +06 +72 +8C +88 +88 +88 +88 +70 ENDCHAR -STARTCHAR 0x1F1B -ENCODING 7963 -SWIDTH 960 0 -DWIDTH 16 0 -BBX 15 13 0 0 +STARTCHAR C079 +ENCODING 7906 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 11 15 1 -3 BITMAP -D000 -D000 -8FFC -4904 -0104 -0114 -0110 -01F0 -0112 -0112 -0104 -0104 -07FC +0060 +1E20 +21C0 +4080 +8040 +8040 +8040 +8040 +8040 +4080 +2100 +1E00 +0000 +0C00 +0C00 ENDCHAR -STARTCHAR 0x1F1C -ENCODING 7964 -SWIDTH 960 0 -DWIDTH 16 0 -BBX 15 13 0 0 +STARTCHAR C111 +ENCODING 7907 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 7 11 1 -3 BITMAP -C800 -C800 -57FC -9104 -0104 -0114 -0110 -01F0 -0112 -0112 -0104 -0104 -07FC +06 +72 +8C +88 +88 +88 +88 +70 +00 +30 +30 ENDCHAR -STARTCHAR 0x1F1D -ENCODING 7965 -SWIDTH 960 0 -DWIDTH 16 0 -BBX 15 13 0 0 +STARTCHAR C085 +ENCODING 7908 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 11 14 1 -3 BITMAP -C800 -C800 -97FC -5104 -0104 -0114 -0110 -01F0 -0112 -0112 -0104 -0104 -07FC +FBE0 +2080 +2080 +2080 +2080 +2080 +2080 +2080 +2080 +1100 +0E00 +0000 +0C00 +0C00 ENDCHAR -STARTCHAR 0x1F20 -ENCODING 7968 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 6 16 1 -4 +STARTCHAR C117 +ENCODING 7909 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 7 10 1 -3 BITMAP -30 -30 -10 -20 -00 -98 -64 +CC 44 44 44 44 44 -04 -04 -04 -04 +3E +00 +18 +18 ENDCHAR -STARTCHAR 0x1F21 -ENCODING 7969 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 6 16 1 -4 +STARTCHAR C085 +ENCODING 7910 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 11 17 1 0 BITMAP -30 -30 -20 +0400 +0A00 +0200 +0400 +0400 +0000 +FBE0 +2080 +2080 +2080 +2080 +2080 +2080 +2080 +2080 +1100 +0E00 +ENDCHAR +STARTCHAR C117 +ENCODING 7911 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 7 13 1 0 +BITMAP +10 +28 +08 10 +10 00 -98 -64 +CC 44 44 44 44 44 -04 -04 -04 -04 +3E ENDCHAR -STARTCHAR 0x1F22 -ENCODING 7970 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 6 16 1 -4 +STARTCHAR C085 +ENCODING 7912 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 12 16 1 0 BITMAP -68 -68 -24 -44 -00 -98 -64 +0200 +0600 +0400 +0830 +0010 +FBE0 +2080 +2080 +2080 +2080 +2080 +2080 +2080 +2080 +1100 +0E00 +ENDCHAR +STARTCHAR C117 +ENCODING 7913 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 8 12 1 0 +BITMAP +04 +0C +08 +13 +01 +CE 44 44 44 44 44 -04 -04 -04 -04 +3E ENDCHAR -STARTCHAR 0x1F23 -ENCODING 7971 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 6 16 1 -4 +STARTCHAR C085 +ENCODING 7914 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 12 16 1 0 BITMAP -68 -68 -44 -24 -00 -98 -64 +0800 +0C00 +0400 +0230 +0010 +FBE0 +2080 +2080 +2080 +2080 +2080 +2080 +2080 +2080 +1100 +0E00 +ENDCHAR +STARTCHAR C117 +ENCODING 7915 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 8 12 1 0 +BITMAP +40 +60 +20 +13 +01 +CE 44 44 44 44 44 -04 -04 -04 -04 +3E ENDCHAR -STARTCHAR 0x1F24 -ENCODING 7972 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 6 16 1 -4 +STARTCHAR C085 +ENCODING 7916 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 12 17 1 0 BITMAP -64 -64 +0400 +0A00 +0200 +0400 +0430 +0010 +FBE0 +2080 +2080 +2080 +2080 +2080 +2080 +2080 +2080 +1100 +0E00 +ENDCHAR +STARTCHAR C117 +ENCODING 7917 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 8 13 1 0 +BITMAP +10 28 -48 -00 -98 -64 +08 +10 +13 +01 +CE 44 44 44 44 44 -04 -04 -04 -04 +3E ENDCHAR -STARTCHAR 0x1F25 -ENCODING 7973 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 6 16 1 -4 +STARTCHAR C085 +ENCODING 7918 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 12 15 1 0 BITMAP -64 -64 -48 -28 -00 -98 -64 -44 -44 -44 -44 -44 -04 -04 -04 -04 +0900 +1500 +1230 +0010 +FBE0 +2080 +2080 +2080 +2080 +2080 +2080 +2080 +2080 +1100 +0E00 ENDCHAR -STARTCHAR 0x1F26 -ENCODING 7974 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 6 20 1 -4 +STARTCHAR C117 +ENCODING 7919 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 8 12 1 0 BITMAP +24 +54 48 -A8 -90 -00 -30 -30 -10 -20 -00 -98 -64 +03 +01 +CE 44 44 44 44 44 -04 -04 -04 -04 +3E ENDCHAR -STARTCHAR 0x1F27 -ENCODING 7975 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 6 20 1 -4 +STARTCHAR C085 +ENCODING 7920 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 12 16 1 -3 BITMAP -48 -A8 -90 -00 -30 -30 -20 -10 -00 -98 -64 +0030 +0010 +FBE0 +2080 +2080 +2080 +2080 +2080 +2080 +2080 +2080 +1100 +0E00 +0000 +0C00 +0C00 +ENDCHAR +STARTCHAR C117 +ENCODING 7921 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 8 12 1 -3 +BITMAP +03 +01 +CE 44 44 44 44 44 -04 -04 -04 -04 +3E +00 +18 +18 ENDCHAR -STARTCHAR 0x1F28 -ENCODING 7976 -SWIDTH 900 0 -DWIDTH 15 0 -BBX 14 13 0 0 +STARTCHAR C089 +ENCODING 7922 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 11 16 0 0 BITMAP -C000 -C000 -5F7C -8410 -0410 -0410 -0410 -07F0 -0410 -0410 -0410 -0410 -1F7C +0800 +0C00 +0400 +0200 +0000 +F1E0 +2080 +1100 +1100 +0A00 +0E00 +0400 +0400 +0400 +0400 +1F00 ENDCHAR -STARTCHAR 0x1F29 -ENCODING 7977 -SWIDTH 900 0 -DWIDTH 15 0 -BBX 14 13 0 0 +STARTCHAR C121 +ENCODING 7923 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 8 15 1 -3 BITMAP -C000 -C000 -9F7C -4410 -0410 -0410 -0410 -07F0 -0410 -0410 -0410 -0410 -1F7C +20 +30 +10 +08 +00 +E7 +24 +24 +24 +18 +18 +18 +10 +90 +E0 ENDCHAR -STARTCHAR 0x1F2A -ENCODING 7978 -SWIDTH 1020 0 -DWIDTH 17 0 -BBX 16 13 0 0 +STARTCHAR C089 +ENCODING 7924 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 11 14 0 -3 BITMAP -D000 -D000 -4FDF -8904 -0104 -0104 -0104 -01FC -0104 -0104 -0104 -0104 -07DF +F1E0 +2080 +1100 +1100 +0A00 +0E00 +0400 +0400 +0400 +0400 +1F00 +0000 +0C00 +0C00 ENDCHAR -STARTCHAR 0x1F2B -ENCODING 7979 -SWIDTH 1020 0 -DWIDTH 17 0 -BBX 16 13 0 0 +STARTCHAR C121 +ENCODING 7925 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 8 10 1 -3 BITMAP -D000 -D000 -8FDF -4904 -0104 -0104 -0104 -01FC -0104 -0104 -0104 -0104 -07DF +E7 +24 +24 +24 +18 +18 +18 +10 +96 +E6 ENDCHAR -STARTCHAR 0x1F2C -ENCODING 7980 -SWIDTH 1020 0 -DWIDTH 17 0 -BBX 16 13 0 0 +STARTCHAR C089 +ENCODING 7926 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 11 17 0 0 BITMAP -C800 -C800 -57DF -9104 -0104 -0104 -0104 -01FC -0104 -0104 -0104 -0104 -07DF +0400 +0A00 +0200 +0400 +0400 +0000 +F1E0 +2080 +1100 +1100 +0A00 +0E00 +0400 +0400 +0400 +0400 +1F00 ENDCHAR -STARTCHAR 0x1F2D -ENCODING 7981 -SWIDTH 1020 0 -DWIDTH 17 0 -BBX 16 13 0 0 +STARTCHAR C121 +ENCODING 7927 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 8 16 1 -3 BITMAP -C800 -C800 -97DF -5104 -0104 -0104 -0104 -01FC -0104 -0104 -0104 -0104 -07DF +10 +28 +08 +10 +10 +00 +E7 +24 +24 +24 +18 +18 +18 +10 +90 +E0 ENDCHAR -STARTCHAR 0x1F2E -ENCODING 7982 -SWIDTH 1020 0 -DWIDTH 17 0 -BBX 16 17 0 0 +STARTCHAR C089 +ENCODING 7928 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 11 15 0 0 BITMAP -4800 -A800 -9000 +0900 +1500 +1200 0000 -3000 -3000 -17DF -2104 -0104 -0104 -0104 -01FC -0104 -0104 -0104 -0104 -07DF +F1E0 +2080 +1100 +1100 +0A00 +0E00 +0400 +0400 +0400 +0400 +1F00 ENDCHAR -STARTCHAR 0x1F2F -ENCODING 7983 -SWIDTH 1020 0 -DWIDTH 17 0 -BBX 16 17 0 0 +STARTCHAR C121 +ENCODING 7929 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 8 14 1 -3 BITMAP -4800 -A800 -9000 -0000 -3000 -3000 -27DF -1104 -0104 -0104 -0104 -01FC -0104 -0104 -0104 -0104 -07DF +12 +2A +24 +00 +E7 +24 +24 +24 +18 +18 +18 +10 +90 +E0 ENDCHAR -STARTCHAR 0x1F30 -ENCODING 7984 -SWIDTH 300 0 -DWIDTH 5 0 -BBX 4 12 1 0 +STARTCHAR C130 +ENCODING 7936 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 7 12 1 0 BITMAP -60 -60 -20 -40 +18 +18 +08 +10 00 -40 -C0 -40 -40 -40 -50 -20 +62 +92 +94 +8C +88 +98 +66 ENDCHAR -STARTCHAR 0x1F31 -ENCODING 7985 -SWIDTH 300 0 -DWIDTH 5 0 -BBX 4 12 1 0 +STARTCHAR C129 +ENCODING 7937 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 7 12 1 0 BITMAP -60 -60 -40 +30 +30 20 +10 00 -40 -C0 -40 -40 -40 -50 -20 +62 +92 +94 +8C +88 +98 +66 ENDCHAR -STARTCHAR 0x1F32 -ENCODING 7986 -SWIDTH 300 0 -DWIDTH 5 0 -BBX 5 12 1 0 +STARTCHAR C138 +ENCODING 7938 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 7 12 1 0 BITMAP -D0 -D0 -48 -88 +68 +68 +24 +44 00 -40 -C0 -40 -40 -40 -50 -20 +62 +92 +94 +8C +88 +98 +66 ENDCHAR -STARTCHAR 0x1F33 -ENCODING 7987 -SWIDTH 300 0 -DWIDTH 5 0 -BBX 5 12 1 0 +STARTCHAR C138 +ENCODING 7939 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 7 12 1 0 BITMAP -D0 -D0 -88 -48 +68 +68 +44 +24 00 -40 -C0 -40 -40 -40 -50 -20 +62 +92 +94 +8C +88 +98 +66 ENDCHAR -STARTCHAR 0x1F34 -ENCODING 7988 -SWIDTH 300 0 -DWIDTH 5 0 -BBX 5 12 1 0 +STARTCHAR C138 +ENCODING 7940 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 7 12 1 0 BITMAP -C8 -C8 -50 -90 +64 +64 +28 +48 00 -40 -C0 -40 -40 -40 -50 -20 +62 +92 +94 +8C +88 +98 +66 ENDCHAR -STARTCHAR 0x1F35 -ENCODING 7989 -SWIDTH 300 0 -DWIDTH 5 0 -BBX 5 12 1 0 +STARTCHAR C138 +ENCODING 7941 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 7 12 1 0 BITMAP -C8 -C8 -90 -50 +64 +64 +48 +28 00 -40 -C0 -40 -40 -40 -50 -20 +62 +92 +94 +8C +88 +98 +66 ENDCHAR -STARTCHAR 0x1F36 -ENCODING 7990 -SWIDTH 300 0 -DWIDTH 5 0 -BBX 5 16 1 0 +STARTCHAR C130 +ENCODING 7942 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 7 16 1 0 BITMAP +24 +54 48 -A8 -90 00 -60 -60 -20 -40 +18 +18 +08 +10 00 -40 -C0 -40 -40 -40 -50 -20 +62 +92 +94 +8C +88 +98 +66 ENDCHAR -STARTCHAR 0x1F37 -ENCODING 7991 -SWIDTH 300 0 -DWIDTH 5 0 -BBX 5 16 1 0 +STARTCHAR C129 +ENCODING 7943 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 7 16 1 0 BITMAP +24 +54 48 -A8 -90 00 -60 -60 -40 +30 +30 20 +10 00 -40 -C0 -40 -40 -40 -50 -20 -ENDCHAR -STARTCHAR 0x1F38 -ENCODING 7992 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 8 13 0 0 -BITMAP -C0 -C0 -5F -84 -04 -04 -04 -04 -04 -04 -04 -04 -1F +62 +92 +94 +8C +88 +98 +66 ENDCHAR -STARTCHAR 0x1F39 -ENCODING 7993 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 8 13 0 0 +STARTCHAR C065 +ENCODING 7944 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 11 13 0 0 BITMAP -C0 -C0 -9F -44 -04 -04 -04 -04 -04 -04 -04 -04 -1F +6000 +6000 +2400 +4400 +0A00 +0A00 +0A00 +1100 +1100 +1F00 +2080 +2080 +F1E0 ENDCHAR -STARTCHAR 0x1F3A -ENCODING 7994 +STARTCHAR C065 +ENCODING 7945 SWIDTH 660 0 DWIDTH 11 0 -BBX 10 13 0 0 +BBX 11 13 0 0 +BITMAP +6000 +6000 +4400 +2400 +0A00 +0A00 +0A00 +1100 +1100 +1F00 +2080 +2080 +F1E0 +ENDCHAR +STARTCHAR 0x1F0A +ENCODING 7946 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 12 13 0 0 BITMAP D000 D000 -4FC0 -8900 -0100 -0100 -0100 -0100 -0100 -0100 -0100 -0100 -07C0 +4A00 +8A00 +0500 +0500 +0500 +0880 +0880 +0F80 +1040 +1040 +78F0 ENDCHAR -STARTCHAR 0x1F3B -ENCODING 7995 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 10 13 0 0 +STARTCHAR 0x1F0B +ENCODING 7947 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 12 13 0 0 BITMAP D000 D000 -8FC0 -4900 -0100 -0100 -0100 -0100 -0100 -0100 -0100 -0100 -07C0 +8A00 +4A00 +0500 +0500 +0500 +0880 +0880 +0F80 +1040 +1040 +78F0 ENDCHAR -STARTCHAR 0x1F3C -ENCODING 7996 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 10 13 0 0 +STARTCHAR 0x1F0C +ENCODING 7948 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 12 13 0 0 BITMAP C800 C800 -57C0 -9100 -0100 -0100 -0100 -0100 -0100 -0100 -0100 -0100 -07C0 +5200 +9200 +0500 +0500 +0500 +0880 +0880 +0F80 +1040 +1040 +78F0 ENDCHAR -STARTCHAR 0x1F3D -ENCODING 7997 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 10 13 0 0 +STARTCHAR 0x1F0D +ENCODING 7949 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 12 13 0 0 BITMAP C800 C800 -97C0 -5100 -0100 -0100 -0100 -0100 -0100 -0100 -0100 -0100 -07C0 +9200 +5200 +0500 +0500 +0500 +0880 +0880 +0F80 +1040 +1040 +78F0 ENDCHAR -STARTCHAR 0x1F3E -ENCODING 7998 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 10 17 0 0 +STARTCHAR 0x1F0E +ENCODING 7950 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 12 17 0 0 BITMAP 4800 A800 @@ -41423,23 +41880,23 @@ 0000 3000 3000 -17C0 -2100 -0100 -0100 -0100 -0100 -0100 -0100 -0100 -0100 -07C0 +1200 +2200 +0500 +0500 +0500 +0880 +0880 +0F80 +1040 +1040 +78F0 ENDCHAR -STARTCHAR 0x1F3F -ENCODING 7999 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 10 17 0 0 +STARTCHAR 0x1F0F +ENCODING 7951 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 12 17 0 0 BITMAP 4800 A800 @@ -41447,20 +41904,20 @@ 0000 3000 3000 -27C0 -1100 -0100 -0100 -0100 -0100 -0100 -0100 -0100 -0100 -07C0 +2200 +1200 +0500 +0500 +0500 +0880 +0880 +0F80 +1040 +1040 +78F0 ENDCHAR -STARTCHAR 0x1F40 -ENCODING 8000 +STARTCHAR C090 +ENCODING 7952 SWIDTH 360 0 DWIDTH 6 0 BBX 5 12 1 0 @@ -41471,15 +41928,15 @@ 40 00 70 -88 -88 -88 -88 +90 +80 +60 +80 88 70 ENDCHAR -STARTCHAR 0x1F41 -ENCODING 8001 +STARTCHAR C090 +ENCODING 7953 SWIDTH 360 0 DWIDTH 6 0 BBX 5 12 1 0 @@ -41490,15 +41947,15 @@ 20 00 70 -88 -88 -88 -88 +90 +80 +60 +80 88 70 ENDCHAR -STARTCHAR 0x1F42 -ENCODING 8002 +STARTCHAR C090 +ENCODING 7954 SWIDTH 360 0 DWIDTH 6 0 BBX 5 12 1 0 @@ -41509,15 +41966,15 @@ 88 00 70 -88 -88 -88 -88 +90 +80 +60 +80 88 70 ENDCHAR -STARTCHAR 0x1F43 -ENCODING 8003 +STARTCHAR C090 +ENCODING 7955 SWIDTH 360 0 DWIDTH 6 0 BBX 5 12 1 0 @@ -41528,15 +41985,15 @@ 48 00 70 -88 -88 -88 -88 +90 +80 +60 +80 88 70 ENDCHAR -STARTCHAR 0x1F44 -ENCODING 8004 +STARTCHAR C090 +ENCODING 7956 SWIDTH 360 0 DWIDTH 6 0 BBX 5 12 1 0 @@ -41547,15 +42004,15 @@ 90 00 70 -88 -88 -88 -88 +90 +80 +60 +80 88 70 ENDCHAR -STARTCHAR 0x1F45 -ENCODING 8005 +STARTCHAR C090 +ENCODING 7957 SWIDTH 360 0 DWIDTH 6 0 BBX 5 12 1 0 @@ -41566,252 +42023,276 @@ 50 00 70 -88 -88 -88 -88 +90 +80 +60 +80 88 70 ENDCHAR -STARTCHAR 0x1F48 -ENCODING 8008 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 11 13 0 0 +STARTCHAR 0x1F18 +ENCODING 7960 +SWIDTH 840 0 +DWIDTH 14 0 +BBX 13 13 0 0 BITMAP C000 C000 -4F00 -9080 -2040 -4020 -4020 -4020 -4020 -4020 -2040 -1080 -0F00 +5FF0 +8410 +0410 +0450 +0440 +07C0 +0448 +0448 +0410 +0410 +1FF0 ENDCHAR -STARTCHAR 0x1F49 -ENCODING 8009 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 11 13 0 0 +STARTCHAR 0x1F19 +ENCODING 7961 +SWIDTH 840 0 +DWIDTH 14 0 +BBX 13 13 0 0 BITMAP C000 C000 -8F00 -5080 -2040 -4020 -4020 -4020 -4020 -4020 -2040 -1080 -0F00 +9FF0 +4410 +0410 +0450 +0440 +07C0 +0448 +0448 +0410 +0410 +1FF0 ENDCHAR -STARTCHAR 0x1F4A -ENCODING 8010 -SWIDTH 900 0 -DWIDTH 15 0 -BBX 14 13 0 0 +STARTCHAR 0x1F1A +ENCODING 7962 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 15 13 0 0 BITMAP D000 D000 -49E0 -8A10 -0408 -0804 -0804 -0804 -0804 -0804 -0408 -0210 -01E0 +4FFC +8904 +0104 +0114 +0110 +01F0 +0112 +0112 +0104 +0104 +07FC ENDCHAR -STARTCHAR 0x1F4B -ENCODING 8011 -SWIDTH 900 0 -DWIDTH 15 0 -BBX 14 13 0 0 +STARTCHAR 0x1F1B +ENCODING 7963 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 15 13 0 0 BITMAP D000 D000 -89E0 -4A10 -0408 -0804 -0804 -0804 -0804 -0804 -0408 -0210 -01E0 +8FFC +4904 +0104 +0114 +0110 +01F0 +0112 +0112 +0104 +0104 +07FC ENDCHAR -STARTCHAR 0x1F4C -ENCODING 8012 -SWIDTH 900 0 -DWIDTH 15 0 -BBX 14 13 0 0 +STARTCHAR 0x1F1C +ENCODING 7964 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 15 13 0 0 BITMAP C800 C800 -51E0 -9210 -0408 -0804 -0804 -0804 -0804 -0804 -0408 -0210 -01E0 +57FC +9104 +0104 +0114 +0110 +01F0 +0112 +0112 +0104 +0104 +07FC ENDCHAR -STARTCHAR 0x1F4D -ENCODING 8013 -SWIDTH 900 0 -DWIDTH 15 0 -BBX 14 13 0 0 +STARTCHAR 0x1F1D +ENCODING 7965 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 15 13 0 0 BITMAP C800 C800 -91E0 -5210 -0408 -0804 -0804 -0804 -0804 -0804 -0408 -0210 -01E0 +97FC +5104 +0104 +0114 +0110 +01F0 +0112 +0112 +0104 +0104 +07FC ENDCHAR -STARTCHAR 0x1F50 -ENCODING 8016 +STARTCHAR C090 +ENCODING 7968 SWIDTH 420 0 DWIDTH 7 0 -BBX 6 12 1 0 +BBX 6 16 1 -4 BITMAP 30 30 10 20 00 -C8 +98 +64 44 44 44 44 -48 -30 +44 +04 +04 +04 +04 ENDCHAR -STARTCHAR 0x1F51 -ENCODING 8017 +STARTCHAR C090 +ENCODING 7969 SWIDTH 420 0 DWIDTH 7 0 -BBX 6 12 1 0 +BBX 6 16 1 -4 BITMAP 30 30 20 10 00 -C8 +98 +64 44 44 44 44 -48 -30 +44 +04 +04 +04 +04 ENDCHAR -STARTCHAR 0x1F52 -ENCODING 8018 +STARTCHAR C090 +ENCODING 7970 SWIDTH 420 0 DWIDTH 7 0 -BBX 6 12 1 0 +BBX 6 16 1 -4 BITMAP 68 68 24 44 00 -C8 +98 +64 44 44 44 44 -48 -30 +44 +04 +04 +04 +04 ENDCHAR -STARTCHAR 0x1F53 -ENCODING 8019 +STARTCHAR C090 +ENCODING 7971 SWIDTH 420 0 DWIDTH 7 0 -BBX 6 12 1 0 +BBX 6 16 1 -4 BITMAP 68 68 44 24 00 -C8 +98 +64 44 44 44 44 -48 -30 +44 +04 +04 +04 +04 ENDCHAR -STARTCHAR 0x1F54 -ENCODING 8020 +STARTCHAR C090 +ENCODING 7972 SWIDTH 420 0 DWIDTH 7 0 -BBX 6 12 1 0 +BBX 6 16 1 -4 BITMAP 64 64 28 48 00 -C8 +98 +64 44 44 44 44 -48 -30 +44 +04 +04 +04 +04 ENDCHAR -STARTCHAR 0x1F55 -ENCODING 8021 +STARTCHAR C090 +ENCODING 7973 SWIDTH 420 0 DWIDTH 7 0 -BBX 6 12 1 0 +BBX 6 16 1 -4 BITMAP 64 64 48 28 00 -C8 +98 +64 44 44 44 44 -48 -30 +44 +04 +04 +04 +04 ENDCHAR -STARTCHAR 0x1F56 -ENCODING 8022 +STARTCHAR C130 +ENCODING 7974 SWIDTH 420 0 DWIDTH 7 0 -BBX 6 16 1 0 +BBX 6 20 1 -4 BITMAP 48 A8 @@ -41822,19 +42303,23 @@ 10 20 00 -C8 +98 +64 44 44 44 44 -48 -30 +44 +04 +04 +04 +04 ENDCHAR -STARTCHAR 0x1F57 -ENCODING 8023 +STARTCHAR C130 +ENCODING 7975 SWIDTH 420 0 DWIDTH 7 0 -BBX 6 16 1 0 +BBX 6 20 1 -4 BITMAP 48 A8 @@ -41845,553 +42330,253 @@ 20 10 00 -C8 +98 +64 44 44 44 44 -48 -30 +44 +04 +04 +04 +04 ENDCHAR -STARTCHAR 0x1F59 -ENCODING 8025 -SWIDTH 840 0 -DWIDTH 14 0 -BBX 13 12 0 0 +STARTCHAR C072 +ENCODING 7976 +SWIDTH 900 0 +DWIDTH 15 0 +BBX 14 13 0 0 BITMAP C000 -FC78 -4820 -8440 -0440 -0280 -0380 -0100 -0100 -0100 -0100 -07C0 +C000 +5F7C +8410 +0410 +0410 +0410 +07F0 +0410 +0410 +0410 +0410 +1F7C ENDCHAR -STARTCHAR 0x1F5B -ENCODING 8027 +STARTCHAR C072 +ENCODING 7977 +SWIDTH 900 0 +DWIDTH 15 0 +BBX 14 13 0 0 +BITMAP +C000 +C000 +9F7C +4410 +0410 +0410 +0410 +07F0 +0410 +0410 +0410 +0410 +1F7C +ENDCHAR +STARTCHAR C072 +ENCODING 7978 SWIDTH 1020 0 DWIDTH 17 0 -BBX 16 12 0 0 +BBX 16 13 0 0 BITMAP D000 -D78F +D000 +4FDF 8904 -4888 -0088 -0050 -0070 -0020 -0020 -0020 -0020 -00F8 +0104 +0104 +0104 +01FC +0104 +0104 +0104 +0104 +07DF ENDCHAR -STARTCHAR 0x1F5D -ENCODING 8029 +STARTCHAR C072 +ENCODING 7979 SWIDTH 1020 0 DWIDTH 17 0 -BBX 16 12 0 0 +BBX 16 13 0 0 BITMAP +D000 +D000 +8FDF +4904 +0104 +0104 +0104 +01FC +0104 +0104 +0104 +0104 +07DF +ENDCHAR +STARTCHAR C072 +ENCODING 7980 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 16 13 0 0 +BITMAP C800 -CF8F +C800 +57DF 9104 -5088 -0088 -0050 -0070 -0020 -0020 -0020 -0020 -00F8 +0104 +0104 +0104 +01FC +0104 +0104 +0104 +0104 +07DF ENDCHAR -STARTCHAR 0x1F5F -ENCODING 8031 -SWIDTH 960 0 -DWIDTH 16 0 -BBX 15 16 0 0 +STARTCHAR C072 +ENCODING 7981 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 16 13 0 0 +BITMAP +C800 +C800 +97DF +5104 +0104 +0104 +0104 +01FC +0104 +0104 +0104 +0104 +07DF +ENDCHAR +STARTCHAR 0x1F2E +ENCODING 7982 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 16 17 0 0 BITMAP 4800 A800 9000 0000 3000 -3F1E -2208 -1110 -0110 -00A0 -00E0 -0040 -0040 -0040 -0040 -01F0 -ENDCHAR -STARTCHAR 0x1F60 -ENCODING 8032 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 12 1 0 -BITMAP -1800 -1800 -0800 -1000 -0000 -2200 -4100 -8080 -8880 -8880 -8880 -7700 +3000 +17DF +2104 +0104 +0104 +0104 +01FC +0104 +0104 +0104 +0104 +07DF ENDCHAR -STARTCHAR 0x1F61 -ENCODING 8033 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 12 1 0 +STARTCHAR 0x1F2F +ENCODING 7983 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 16 17 0 0 BITMAP -1800 -1800 -1000 -0800 +4800 +A800 +9000 0000 -2200 -4100 -8080 -8880 -8880 -8880 -7700 +3000 +3000 +27DF +1104 +0104 +0104 +0104 +01FC +0104 +0104 +0104 +0104 +07DF ENDCHAR -STARTCHAR 0x1F62 -ENCODING 8034 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 12 1 0 +STARTCHAR C090 +ENCODING 7984 +SWIDTH 300 0 +DWIDTH 5 0 +BBX 4 12 1 0 BITMAP -3400 -3400 -1200 -2200 -0000 -2200 -4100 -8080 -8880 -8880 -8880 -7700 -ENDCHAR -STARTCHAR 0x1F63 -ENCODING 8035 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 12 1 0 -BITMAP -3400 -3400 -2200 -1200 -0000 -2200 -4100 -8080 -8880 -8880 -8880 -7700 -ENDCHAR -STARTCHAR 0x1F64 -ENCODING 8036 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 12 1 0 -BITMAP -3200 -3200 -1400 -2400 -0000 -2200 -4100 -8080 -8880 -8880 -8880 -7700 -ENDCHAR -STARTCHAR 0x1F65 -ENCODING 8037 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 12 1 0 -BITMAP -3200 -3200 -2400 -1400 -0000 -2200 -4100 -8080 -8880 -8880 -8880 -7700 -ENDCHAR -STARTCHAR 0x1F66 -ENCODING 8038 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 16 1 0 -BITMAP -2400 -5400 -4800 -0000 -1800 -1800 -0800 -1000 -0000 -2200 -4100 -8080 -8880 -8880 -8880 -7700 -ENDCHAR -STARTCHAR 0x1F67 -ENCODING 8039 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 16 1 0 -BITMAP -2400 -5400 -4800 -0000 -1800 -1800 -1000 -0800 -0000 -2200 -4100 -8080 -8880 -8880 -8880 -7700 -ENDCHAR -STARTCHAR 0x1F68 -ENCODING 8040 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 11 13 0 0 -BITMAP -C000 -C000 -4F80 -9040 -2020 -2020 -2020 -2020 -1040 -1040 -0880 -28A0 -38E0 -ENDCHAR -STARTCHAR 0x1F69 -ENCODING 8041 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 11 13 0 0 -BITMAP -C000 -C000 -8F80 -5040 -2020 -2020 -2020 -2020 -1040 -1040 -0880 -28A0 -38E0 -ENDCHAR -STARTCHAR 0x1F6A -ENCODING 8042 -SWIDTH 900 0 -DWIDTH 15 0 -BBX 14 13 0 0 -BITMAP -D000 -D000 -49F0 -8A08 -0404 -0404 -0404 -0404 -0208 -0208 -0110 -0514 -071C -ENDCHAR -STARTCHAR 0x1F6B -ENCODING 8043 -SWIDTH 900 0 -DWIDTH 15 0 -BBX 14 13 0 0 -BITMAP -D000 -D000 -89F0 -4A08 -0404 -0404 -0404 -0404 -0208 -0208 -0110 -0514 -071C -ENDCHAR -STARTCHAR 0x1F6C -ENCODING 8044 -SWIDTH 840 0 -DWIDTH 14 0 -BBX 13 13 0 0 -BITMAP -C800 -C800 -53E0 -9410 -0808 -0808 -0808 -0808 -0410 -0410 -0220 -0A28 -0E38 -ENDCHAR -STARTCHAR 0x1F6D -ENCODING 8045 -SWIDTH 840 0 -DWIDTH 14 0 -BBX 13 13 0 0 -BITMAP -C800 -C800 -93E0 -5410 -0808 -0808 -0808 -0808 -0410 -0410 -0220 -0A28 -0E38 -ENDCHAR -STARTCHAR 0x1F6E -ENCODING 8046 -SWIDTH 840 0 -DWIDTH 14 0 -BBX 13 17 0 0 -BITMAP -4800 -A800 -9000 -0000 -3000 -3000 -13E0 -2410 -0808 -0808 -0808 -0808 -0410 -0410 -0220 -0A28 -0E38 -ENDCHAR -STARTCHAR 0x1F6F -ENCODING 8047 -SWIDTH 840 0 -DWIDTH 14 0 -BBX 13 17 0 0 -BITMAP -4800 -A800 -9000 -0000 -3000 -3000 -23E0 -1410 -0808 -0808 -0808 -0808 -0410 -0410 -0220 -0A28 -0E38 -ENDCHAR -STARTCHAR 0x1F70 -ENCODING 8048 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 12 1 0 -BITMAP -20 +60 +60 20 -10 -10 +40 00 -62 -92 -94 -8C -88 -98 -66 +40 +C0 +40 +40 +40 +50 +20 ENDCHAR -STARTCHAR 0x1F71 -ENCODING 8049 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 12 1 0 +STARTCHAR C090 +ENCODING 7985 +SWIDTH 300 0 +DWIDTH 5 0 +BBX 4 12 1 0 BITMAP -10 -10 -20 +60 +60 +40 20 00 -62 -92 -94 -8C -88 -98 -66 -ENDCHAR -STARTCHAR 0x1F72 -ENCODING 8050 -SWIDTH 360 0 -DWIDTH 6 0 -BBX 5 12 1 0 -BITMAP +40 +C0 40 40 +40 +50 20 -20 -00 -70 -90 -80 -60 -80 -88 -70 ENDCHAR -STARTCHAR 0x1F73 -ENCODING 8051 -SWIDTH 360 0 -DWIDTH 6 0 +STARTCHAR C090 +ENCODING 7986 +SWIDTH 300 0 +DWIDTH 5 0 BBX 5 12 1 0 BITMAP -10 -10 -20 -20 -00 -70 -90 -80 -60 -80 +D0 +D0 +48 88 -70 -ENDCHAR -STARTCHAR 0x1F74 -ENCODING 8052 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 6 16 1 -4 -BITMAP -20 -20 -10 -10 00 -98 -64 -44 -44 -44 -44 -44 -04 -04 -04 -04 -ENDCHAR -STARTCHAR 0x1F75 -ENCODING 8053 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 6 16 1 -4 -BITMAP -10 -10 -20 +40 +C0 +40 +40 +40 +50 20 -00 -98 -64 -44 -44 -44 -44 -44 -04 -04 -04 -04 ENDCHAR -STARTCHAR 0x1F76 -ENCODING 8054 +STARTCHAR C090 +ENCODING 7987 SWIDTH 300 0 DWIDTH 5 0 -BBX 4 11 1 0 +BBX 5 12 1 0 BITMAP -80 -80 -40 +D0 +D0 +88 +48 00 40 C0 @@ -42401,15 +42586,16 @@ 50 20 ENDCHAR -STARTCHAR 0x1F77 -ENCODING 8055 +STARTCHAR C090 +ENCODING 7988 SWIDTH 300 0 DWIDTH 5 0 -BBX 4 11 1 0 +BBX 5 12 1 0 BITMAP -20 -20 -40 +C8 +C8 +50 +90 00 40 C0 @@ -42419,657 +42605,592 @@ 50 20 ENDCHAR -STARTCHAR 0x1F78 -ENCODING 8056 -SWIDTH 360 0 -DWIDTH 6 0 -BBX 5 11 1 0 +STARTCHAR C090 +ENCODING 7989 +SWIDTH 300 0 +DWIDTH 5 0 +BBX 5 12 1 0 BITMAP +C8 +C8 +90 +50 +00 +40 +C0 +40 40 40 +50 20 -00 -70 -88 -88 -88 -88 -88 -70 ENDCHAR -STARTCHAR 0x1F79 -ENCODING 8057 -SWIDTH 360 0 -DWIDTH 6 0 -BBX 5 11 1 0 +STARTCHAR C090 +ENCODING 7990 +SWIDTH 300 0 +DWIDTH 5 0 +BBX 5 16 1 0 BITMAP -20 +48 +A8 +90 +00 +60 +60 20 40 00 -70 -88 -88 -88 -88 -88 -70 +40 +C0 +40 +40 +40 +50 +20 ENDCHAR -STARTCHAR 0x1F7A -ENCODING 8058 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 6 11 1 0 +STARTCHAR C090 +ENCODING 7991 +SWIDTH 300 0 +DWIDTH 5 0 +BBX 5 16 1 0 BITMAP +48 +A8 +90 +00 +60 +60 +40 20 -20 -10 00 -C8 -44 -44 -44 -44 -48 -30 +40 +C0 +40 +40 +40 +50 +20 ENDCHAR -STARTCHAR 0x1F7B -ENCODING 8059 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 6 11 1 0 +STARTCHAR C072 +ENCODING 7992 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 8 13 0 0 BITMAP -10 -10 -20 -00 -C8 -44 -44 -44 +C0 +C0 +5F +84 +04 +04 +04 +04 +04 +04 +04 +04 +1F +ENDCHAR +STARTCHAR C072 +ENCODING 7993 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +C0 +C0 +9F 44 -48 -30 +04 +04 +04 +04 +04 +04 +04 +04 +1F ENDCHAR -STARTCHAR 0x1F7C -ENCODING 8060 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 11 1 0 +STARTCHAR C072 +ENCODING 7994 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 10 13 0 0 BITMAP -1000 -1000 -0800 -0000 -2200 -4100 -8080 -8880 -8880 -8880 -7700 +D000 +D000 +4FC0 +8900 +0100 +0100 +0100 +0100 +0100 +0100 +0100 +0100 +07C0 ENDCHAR -STARTCHAR 0x1F7D -ENCODING 8061 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 11 1 0 +STARTCHAR C072 +ENCODING 7995 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 10 13 0 0 BITMAP -0400 -0400 -0800 +D000 +D000 +8FC0 +4900 +0100 +0100 +0100 +0100 +0100 +0100 +0100 +0100 +07C0 +ENDCHAR +STARTCHAR C072 +ENCODING 7996 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 10 13 0 0 +BITMAP +C800 +C800 +57C0 +9100 +0100 +0100 +0100 +0100 +0100 +0100 +0100 +0100 +07C0 +ENDCHAR +STARTCHAR C072 +ENCODING 7997 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 10 13 0 0 +BITMAP +C800 +C800 +97C0 +5100 +0100 +0100 +0100 +0100 +0100 +0100 +0100 +0100 +07C0 +ENDCHAR +STARTCHAR C072 +ENCODING 7998 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 10 17 0 0 +BITMAP +4800 +A800 +9000 0000 -2200 -4100 -8080 -8880 -8880 -8880 -7700 +3000 +3000 +17C0 +2100 +0100 +0100 +0100 +0100 +0100 +0100 +0100 +0100 +07C0 ENDCHAR -STARTCHAR 0x1F80 -ENCODING 8064 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 17 1 -5 +STARTCHAR C072 +ENCODING 7999 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 10 17 0 0 BITMAP -18 -18 -08 -10 -00 -62 -92 -94 -8C -88 -98 -66 -00 -60 -20 -28 -10 +4800 +A800 +9000 +0000 +3000 +3000 +27C0 +1100 +0100 +0100 +0100 +0100 +0100 +0100 +0100 +0100 +07C0 ENDCHAR -STARTCHAR 0x1F81 -ENCODING 8065 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 17 1 -5 +STARTCHAR C090 +ENCODING 8000 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 12 1 0 BITMAP -30 -30 +60 +60 20 -10 +40 00 -62 -92 -94 -8C +70 88 -98 -66 -00 -60 -20 -28 -10 +88 +88 +88 +88 +70 ENDCHAR -STARTCHAR 0x1F82 -ENCODING 8066 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 17 1 -5 +STARTCHAR C090 +ENCODING 8001 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 12 1 0 BITMAP -68 -68 -24 -44 -00 -62 -92 -94 -8C -88 -98 -66 -00 60 +60 +40 20 -28 -10 -ENDCHAR -STARTCHAR 0x1F83 -ENCODING 8067 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 17 1 -5 -BITMAP -68 -68 -44 -24 00 -62 -92 -94 -8C +70 88 -98 -66 -00 -60 -20 -28 -10 +88 +88 +88 +88 +70 ENDCHAR -STARTCHAR 0x1F84 -ENCODING 8068 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 17 1 -5 +STARTCHAR C090 +ENCODING 8002 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 12 1 0 BITMAP -64 -64 -28 +D0 +D0 48 -00 -62 -92 -94 -8C 88 -98 -66 00 -60 -20 -28 -10 +70 +88 +88 +88 +88 +88 +70 ENDCHAR -STARTCHAR 0x1F85 -ENCODING 8069 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 17 1 -5 +STARTCHAR C090 +ENCODING 8003 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 12 1 0 BITMAP -64 -64 +D0 +D0 +88 48 -28 00 -62 -92 -94 -8C +70 88 -98 -66 -00 -60 -20 -28 -10 +88 +88 +88 +88 +70 ENDCHAR -STARTCHAR 0x1F86 -ENCODING 8070 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 21 1 -5 +STARTCHAR C090 +ENCODING 8004 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 12 1 0 BITMAP -24 -54 -48 -00 -18 -18 -08 -10 +C8 +C8 +50 +90 00 -62 -92 -94 -8C +70 88 -98 -66 -00 -60 -20 -28 -10 +88 +88 +88 +88 +70 ENDCHAR -STARTCHAR 0x1F87 -ENCODING 8071 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 21 1 -5 +STARTCHAR C090 +ENCODING 8005 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 12 1 0 BITMAP -24 -54 -48 -00 -30 -30 -20 -10 +C8 +C8 +90 +50 00 -62 -92 -94 -8C +70 88 -98 -66 -00 -60 -20 -28 -10 +88 +88 +88 +88 +70 ENDCHAR -STARTCHAR 0x1F88 -ENCODING 8072 +STARTCHAR C079 +ENCODING 8008 SWIDTH 660 0 DWIDTH 11 0 -BBX 11 17 0 -4 +BBX 11 13 0 0 BITMAP -6000 -6000 -2400 -4400 -0A00 -0A00 -0A00 -1100 -1100 -1F00 -2080 -2080 -F1E0 -0C00 -0400 -0500 -0200 +C000 +C000 +4F00 +9080 +2040 +4020 +4020 +4020 +4020 +4020 +2040 +1080 +0F00 ENDCHAR -STARTCHAR 0x1F89 -ENCODING 8073 +STARTCHAR C079 +ENCODING 8009 SWIDTH 660 0 DWIDTH 11 0 -BBX 11 17 0 -4 +BBX 11 13 0 0 BITMAP -6000 -6000 -4400 -2400 -0A00 -0A00 -0A00 -1100 -1100 -1F00 -2080 -2080 -F1E0 -0C00 -0400 -0500 -0200 +C000 +C000 +8F00 +5080 +2040 +4020 +4020 +4020 +4020 +4020 +2040 +1080 +0F00 ENDCHAR -STARTCHAR 0x1F8A -ENCODING 8074 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 12 17 0 -4 +STARTCHAR 0x1F4A +ENCODING 8010 +SWIDTH 900 0 +DWIDTH 15 0 +BBX 14 13 0 0 BITMAP D000 D000 -4A00 -8A00 -0500 -0500 -0500 -0880 -0880 -0F80 -1040 -1040 -78F0 -0600 -0200 -0280 -0100 +49E0 +8A10 +0408 +0804 +0804 +0804 +0804 +0804 +0408 +0210 +01E0 ENDCHAR -STARTCHAR 0x1F8B -ENCODING 8075 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 12 17 0 -4 +STARTCHAR 0x1F4B +ENCODING 8011 +SWIDTH 900 0 +DWIDTH 15 0 +BBX 14 13 0 0 BITMAP D000 D000 -8A00 -4A00 -0500 -0500 -0500 -0880 -0880 -0F80 -1040 -1040 -78F0 -0600 -0200 -0280 -0100 +89E0 +4A10 +0408 +0804 +0804 +0804 +0804 +0804 +0408 +0210 +01E0 ENDCHAR -STARTCHAR 0x1F8C -ENCODING 8076 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 12 17 0 -4 +STARTCHAR 0x1F4C +ENCODING 8012 +SWIDTH 900 0 +DWIDTH 15 0 +BBX 14 13 0 0 BITMAP C800 C800 -5200 -9200 -0500 -0500 -0500 -0880 -0880 -0F80 -1040 -1040 -78F0 -0600 -0200 -0280 -0100 +51E0 +9210 +0408 +0804 +0804 +0804 +0804 +0804 +0408 +0210 +01E0 ENDCHAR -STARTCHAR 0x1F8D -ENCODING 8077 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 12 17 0 -4 +STARTCHAR 0x1F4D +ENCODING 8013 +SWIDTH 900 0 +DWIDTH 15 0 +BBX 14 13 0 0 BITMAP C800 C800 -9200 -5200 -0500 -0500 -0500 -0880 -0880 -0F80 -1040 -1040 -78F0 -0600 -0200 -0280 -0100 -ENDCHAR -STARTCHAR 0x1F8E -ENCODING 8078 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 12 21 0 -4 -BITMAP -4800 -A800 -9000 -0000 -3000 -3000 -1200 -2200 -0500 -0500 -0500 -0880 -0880 -0F80 -1040 -1040 -78F0 -0600 -0200 -0280 -0100 -ENDCHAR -STARTCHAR 0x1F8F -ENCODING 8079 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 12 21 0 -4 -BITMAP -4800 -A800 -9000 -0000 -3000 -3000 -2200 -1200 -0500 -0500 -0500 -0880 -0880 -0F80 -1040 -1040 -78F0 -0600 -0200 -0280 -0100 +91E0 +5210 +0408 +0804 +0804 +0804 +0804 +0804 +0408 +0210 +01E0 ENDCHAR -STARTCHAR 0x1F90 -ENCODING 8080 +STARTCHAR C117 +ENCODING 8016 SWIDTH 420 0 DWIDTH 7 0 -BBX 6 16 1 -4 +BBX 6 12 1 0 BITMAP 30 30 10 20 00 -98 -64 -44 -44 +C8 44 44 44 -04 -C4 44 -64 +48 +30 ENDCHAR -STARTCHAR 0x1F91 -ENCODING 8081 +STARTCHAR C117 +ENCODING 8017 SWIDTH 420 0 DWIDTH 7 0 -BBX 6 16 1 -4 +BBX 6 12 1 0 BITMAP 30 30 20 10 00 -98 -64 -44 -44 +C8 44 44 44 -04 -C4 44 -64 +48 +30 ENDCHAR -STARTCHAR 0x1F92 -ENCODING 8082 +STARTCHAR C117 +ENCODING 8018 SWIDTH 420 0 DWIDTH 7 0 -BBX 6 16 1 -4 +BBX 6 12 1 0 BITMAP 68 68 24 44 00 -98 -64 -44 -44 +C8 44 44 44 -04 -C4 44 -64 +48 +30 ENDCHAR -STARTCHAR 0x1F93 -ENCODING 8083 +STARTCHAR C117 +ENCODING 8019 SWIDTH 420 0 DWIDTH 7 0 -BBX 6 16 1 -4 +BBX 6 12 1 0 BITMAP 68 68 44 24 00 -98 -64 -44 -44 +C8 44 44 44 -04 -C4 44 -64 +48 +30 ENDCHAR -STARTCHAR 0x1F94 -ENCODING 8084 +STARTCHAR C117 +ENCODING 8020 SWIDTH 420 0 DWIDTH 7 0 -BBX 6 16 1 -4 +BBX 6 12 1 0 BITMAP 64 64 28 48 00 -98 -64 -44 -44 +C8 44 44 44 -04 -C4 44 -64 +48 +30 ENDCHAR -STARTCHAR 0x1F95 -ENCODING 8085 +STARTCHAR C117 +ENCODING 8021 SWIDTH 420 0 DWIDTH 7 0 -BBX 6 16 1 -4 +BBX 6 12 1 0 BITMAP 64 64 48 28 00 -98 -64 -44 -44 +C8 44 44 44 -04 -C4 44 -64 +48 +30 ENDCHAR -STARTCHAR 0x1F96 -ENCODING 8086 +STARTCHAR C117 +ENCODING 8022 SWIDTH 420 0 DWIDTH 7 0 -BBX 6 20 1 -4 +BBX 6 16 1 0 BITMAP 48 A8 @@ -43080,23 +43201,19 @@ 10 20 00 -98 -64 -44 -44 +C8 44 44 44 -04 -C4 44 -64 +48 +30 ENDCHAR -STARTCHAR 0x1F97 -ENCODING 8087 +STARTCHAR C117 +ENCODING 8023 SWIDTH 420 0 DWIDTH 7 0 -BBX 6 20 1 -4 +BBX 6 16 1 0 BITMAP 48 A8 @@ -43107,231 +43224,99 @@ 20 10 00 -98 -64 -44 -44 +C8 44 44 44 -04 -C4 44 -64 -ENDCHAR -STARTCHAR 0x1F98 -ENCODING 8088 -SWIDTH 900 0 -DWIDTH 15 0 -BBX 14 18 0 -5 -BITMAP -C000 -C000 -5F7C -8410 -0410 -0410 -0410 -07F0 -0410 -0410 -0410 -0410 -1F7C -0000 -0180 -0080 -00A0 -0040 +48 +30 ENDCHAR -STARTCHAR 0x1F99 -ENCODING 8089 -SWIDTH 900 0 -DWIDTH 15 0 -BBX 14 18 0 -5 +STARTCHAR 0x1F59 +ENCODING 8025 +SWIDTH 840 0 +DWIDTH 14 0 +BBX 13 12 0 0 BITMAP -C000 C000 -9F7C -4410 -0410 -0410 -0410 -07F0 -0410 -0410 -0410 -0410 -1F7C -0000 -00C0 -0040 -0050 -0020 +FC78 +4820 +8440 +0440 +0280 +0380 +0100 +0100 +0100 +0100 +07C0 ENDCHAR -STARTCHAR 0x1F9A -ENCODING 8090 +STARTCHAR 0x1F5B +ENCODING 8027 SWIDTH 1020 0 DWIDTH 17 0 -BBX 16 18 0 -5 +BBX 16 12 0 0 BITMAP D000 -D000 -4FDF +D78F 8904 -0104 -0104 -0104 -01FC -0104 -0104 -0104 -0104 -07DF -0000 -00C0 -0040 +4888 +0088 0050 +0070 0020 -ENDCHAR -STARTCHAR 0x1F9B -ENCODING 8091 -SWIDTH 1020 0 -DWIDTH 17 0 -BBX 16 18 0 -5 -BITMAP -D000 -D000 -8FDF -4904 -0104 -0104 -0104 -01FC -0104 -0104 -0104 -0104 -07DF -0000 -00C0 -0040 -0050 0020 +0020 +0020 +00F8 ENDCHAR -STARTCHAR 0x1F9C -ENCODING 8092 +STARTCHAR 0x1F5D +ENCODING 8029 SWIDTH 1020 0 DWIDTH 17 0 -BBX 16 18 0 -5 +BBX 16 12 0 0 BITMAP -C800 C800 -57DF +CF8F 9104 -0104 -0104 -0104 -01FC -0104 -0104 -0104 -0104 -07DF -0000 -00C0 -0040 +5088 +0088 0050 +0070 0020 -ENDCHAR -STARTCHAR 0x1F9D -ENCODING 8093 -SWIDTH 1020 0 -DWIDTH 17 0 -BBX 16 18 0 -5 -BITMAP -C800 -C800 -97DF -5104 -0104 -0104 -0104 -01FC -0104 -0104 -0104 -0104 -07DF -0000 -00C0 -0040 -0050 0020 +0020 +0020 +00F8 ENDCHAR -STARTCHAR 0x1F9E -ENCODING 8094 -SWIDTH 1020 0 -DWIDTH 17 0 -BBX 16 22 0 -5 +STARTCHAR 0x1F5F +ENCODING 8031 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 15 16 0 0 BITMAP 4800 A800 9000 0000 -3000 3000 -17DF -2104 -0104 -0104 -0104 -01FC -0104 -0104 -0104 -0104 -07DF -0000 -00C0 -0040 -0050 -0020 -ENDCHAR -STARTCHAR 0x1F9F -ENCODING 8095 -SWIDTH 1020 0 -DWIDTH 17 0 -BBX 16 22 0 -5 -BITMAP -4800 -A800 -9000 -0000 -3000 -3000 -27DF -1104 -0104 -0104 -0104 -01FC -0104 -0104 -0104 -0104 -07DF -0000 -00C0 +3F1E +2208 +1110 +0110 +00A0 +00E0 0040 -0050 -0020 +0040 +0040 +0040 +01F0 ENDCHAR -STARTCHAR 0x1FA0 -ENCODING 8096 +STARTCHAR C117 +ENCODING 8032 SWIDTH 600 0 DWIDTH 10 0 -BBX 9 17 1 -5 +BBX 9 12 1 0 BITMAP 1800 1800 @@ -43345,17 +43330,12 @@ 8880 8880 7700 -0000 -1800 -0800 -0A00 -0400 ENDCHAR -STARTCHAR 0x1FA1 -ENCODING 8097 +STARTCHAR C117 +ENCODING 8033 SWIDTH 600 0 DWIDTH 10 0 -BBX 9 17 1 -5 +BBX 9 12 1 0 BITMAP 1800 1800 @@ -43369,17 +43349,12 @@ 8880 8880 7700 -0000 -1800 -0800 -0A00 -0400 ENDCHAR -STARTCHAR 0x1FA2 -ENCODING 8098 +STARTCHAR C117 +ENCODING 8034 SWIDTH 600 0 DWIDTH 10 0 -BBX 9 17 1 -5 +BBX 9 12 1 0 BITMAP 3400 3400 @@ -43393,17 +43368,12 @@ 8880 8880 7700 -0000 -1800 -0800 -0A00 -0400 ENDCHAR -STARTCHAR 0x1FA3 -ENCODING 8099 +STARTCHAR C117 +ENCODING 8035 SWIDTH 600 0 DWIDTH 10 0 -BBX 9 17 1 -5 +BBX 9 12 1 0 BITMAP 3400 3400 @@ -43417,17 +43387,12 @@ 8880 8880 7700 -0000 -1800 -0800 -0A00 -0400 ENDCHAR -STARTCHAR 0x1FA4 -ENCODING 8100 +STARTCHAR C117 +ENCODING 8036 SWIDTH 600 0 DWIDTH 10 0 -BBX 9 17 1 -5 +BBX 9 12 1 0 BITMAP 3200 3200 @@ -43441,17 +43406,12 @@ 8880 8880 7700 -0000 -1800 -0800 -0A00 -0400 ENDCHAR -STARTCHAR 0x1FA5 -ENCODING 8101 +STARTCHAR C117 +ENCODING 8037 SWIDTH 600 0 DWIDTH 10 0 -BBX 9 17 1 -5 +BBX 9 12 1 0 BITMAP 3200 3200 @@ -43465,17 +43425,12 @@ 8880 8880 7700 -0000 -1800 -0800 -0A00 -0400 ENDCHAR -STARTCHAR 0x1FA6 -ENCODING 8102 +STARTCHAR C117 +ENCODING 8038 SWIDTH 600 0 DWIDTH 10 0 -BBX 9 21 1 -5 +BBX 9 16 1 0 BITMAP 2400 5400 @@ -43493,17 +43448,12 @@ 8880 8880 7700 -0000 -1800 -0800 -0A00 -0400 ENDCHAR -STARTCHAR 0x1FA7 -ENCODING 8103 +STARTCHAR C117 +ENCODING 8039 SWIDTH 600 0 DWIDTH 10 0 -BBX 9 21 1 -5 +BBX 9 16 1 0 BITMAP 2400 5400 @@ -43521,17 +43471,12 @@ 8880 8880 7700 -0000 -1800 -0800 -0A00 -0400 ENDCHAR -STARTCHAR 0x1FA8 -ENCODING 8104 +STARTCHAR 0x1F68 +ENCODING 8040 SWIDTH 720 0 DWIDTH 12 0 -BBX 11 17 0 -4 +BBX 11 13 0 0 BITMAP C000 C000 @@ -43546,16 +43491,12 @@ 0880 28A0 38E0 -0600 -0200 -0280 -0100 ENDCHAR -STARTCHAR 0x1FA9 -ENCODING 8105 +STARTCHAR 0x1F69 +ENCODING 8041 SWIDTH 720 0 DWIDTH 12 0 -BBX 11 17 0 -4 +BBX 11 13 0 0 BITMAP C000 C000 @@ -43570,16 +43511,12 @@ 0880 28A0 38E0 -0600 -0200 -0280 -0100 ENDCHAR -STARTCHAR 0x1FAA -ENCODING 8106 +STARTCHAR 0x1F6A +ENCODING 8042 SWIDTH 900 0 DWIDTH 15 0 -BBX 14 17 0 -4 +BBX 14 13 0 0 BITMAP D000 D000 @@ -43594,16 +43531,12 @@ 0110 0514 071C -00C0 -0040 -0050 -0020 ENDCHAR -STARTCHAR 0x1FAB -ENCODING 8107 +STARTCHAR 0x1F6B +ENCODING 8043 SWIDTH 900 0 DWIDTH 15 0 -BBX 14 17 0 -4 +BBX 14 13 0 0 BITMAP D000 D000 @@ -43618,16 +43551,12 @@ 0110 0514 071C -00C0 -0040 -0050 -0020 ENDCHAR -STARTCHAR 0x1FAC -ENCODING 8108 +STARTCHAR 0x1F6C +ENCODING 8044 SWIDTH 840 0 DWIDTH 14 0 -BBX 13 17 0 -4 +BBX 13 13 0 0 BITMAP C800 C800 @@ -43642,16 +43571,12 @@ 0220 0A28 0E38 -0180 -0080 -00A0 -0040 ENDCHAR -STARTCHAR 0x1FAD -ENCODING 8109 +STARTCHAR 0x1F6D +ENCODING 8045 SWIDTH 840 0 DWIDTH 14 0 -BBX 13 17 0 -4 +BBX 13 13 0 0 BITMAP C800 C800 @@ -43666,16 +43591,12 @@ 0220 0A28 0E38 -0180 -0080 -00A0 -0040 ENDCHAR -STARTCHAR 0x1FAE -ENCODING 8110 +STARTCHAR 0x1F6E +ENCODING 8046 SWIDTH 840 0 DWIDTH 14 0 -BBX 13 21 0 -4 +BBX 13 17 0 0 BITMAP 4800 A800 @@ -43694,16 +43615,12 @@ 0220 0A28 0E38 -0180 -0080 -00A0 -0040 ENDCHAR -STARTCHAR 0x1FAF -ENCODING 8111 +STARTCHAR 0x1F6F +ENCODING 8047 SWIDTH 840 0 DWIDTH 14 0 -BBX 13 21 0 -4 +BBX 13 17 0 0 BITMAP 4800 A800 @@ -43722,20 +43639,17 @@ 0220 0A28 0E38 -0180 -0080 -00A0 -0040 ENDCHAR -STARTCHAR 0x1FB0 -ENCODING 8112 +STARTCHAR C138 +ENCODING 8048 SWIDTH 480 0 DWIDTH 8 0 -BBX 7 11 1 0 +BBX 7 12 1 0 BITMAP -44 -38 -00 +20 +20 +10 +10 00 62 92 @@ -43745,14 +43659,16 @@ 98 66 ENDCHAR -STARTCHAR 0x1FB1 -ENCODING 8113 +STARTCHAR C138 +ENCODING 8049 SWIDTH 480 0 DWIDTH 8 0 -BBX 7 10 1 0 +BBX 7 12 1 0 BITMAP -7C -00 +10 +10 +20 +20 00 62 92 @@ -43762,16 +43678,244 @@ 98 66 ENDCHAR -STARTCHAR 0x1FB2 -ENCODING 8114 +STARTCHAR C090 +ENCODING 8050 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 12 1 0 +BITMAP +40 +40 +20 +20 +00 +70 +90 +80 +60 +80 +88 +70 +ENDCHAR +STARTCHAR C090 +ENCODING 8051 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 12 1 0 +BITMAP +10 +10 +20 +20 +00 +70 +90 +80 +60 +80 +88 +70 +ENDCHAR +STARTCHAR C090 +ENCODING 8052 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 6 16 1 -4 +BITMAP +20 +20 +10 +10 +00 +98 +64 +44 +44 +44 +44 +44 +04 +04 +04 +04 +ENDCHAR +STARTCHAR C090 +ENCODING 8053 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 6 16 1 -4 +BITMAP +10 +10 +20 +20 +00 +98 +64 +44 +44 +44 +44 +44 +04 +04 +04 +04 +ENDCHAR +STARTCHAR C090 +ENCODING 8054 +SWIDTH 300 0 +DWIDTH 5 0 +BBX 4 11 1 0 +BITMAP +80 +80 +40 +00 +40 +C0 +40 +40 +40 +50 +20 +ENDCHAR +STARTCHAR C090 +ENCODING 8055 +SWIDTH 300 0 +DWIDTH 5 0 +BBX 4 11 1 0 +BITMAP +20 +20 +40 +00 +40 +C0 +40 +40 +40 +50 +20 +ENDCHAR +STARTCHAR C090 +ENCODING 8056 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 11 1 0 +BITMAP +40 +40 +20 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR C090 +ENCODING 8057 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 11 1 0 +BITMAP +20 +20 +40 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR C117 +ENCODING 8058 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 6 11 1 0 +BITMAP +20 +20 +10 +00 +C8 +44 +44 +44 +44 +48 +30 +ENDCHAR +STARTCHAR C117 +ENCODING 8059 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 6 11 1 0 +BITMAP +10 +10 +20 +00 +C8 +44 +44 +44 +44 +48 +30 +ENDCHAR +STARTCHAR C117 +ENCODING 8060 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 11 1 0 +BITMAP +1000 +1000 +0800 +0000 +2200 +4100 +8080 +8880 +8880 +8880 +7700 +ENDCHAR +STARTCHAR C117 +ENCODING 8061 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 11 1 0 +BITMAP +0400 +0400 +0800 +0000 +2200 +4100 +8080 +8880 +8880 +8880 +7700 +ENDCHAR +STARTCHAR C130 +ENCODING 8064 SWIDTH 480 0 DWIDTH 8 0 BBX 7 17 1 -5 BITMAP -10 -10 -08 +18 +18 08 +10 00 62 92 @@ -43786,12 +43930,17 @@ 28 10 ENDCHAR -STARTCHAR 0x1FB3 -ENCODING 8115 +STARTCHAR C129 +ENCODING 8065 SWIDTH 480 0 DWIDTH 8 0 -BBX 7 12 1 -5 +BBX 7 17 1 -5 BITMAP +30 +30 +20 +10 +00 62 92 94 @@ -43805,16 +43954,16 @@ 28 10 ENDCHAR -STARTCHAR 0x1FB4 -ENCODING 8116 +STARTCHAR C138 +ENCODING 8066 SWIDTH 480 0 DWIDTH 8 0 BBX 7 17 1 -5 BITMAP -08 -08 -10 -10 +68 +68 +24 +44 00 62 92 @@ -43829,15 +43978,16 @@ 28 10 ENDCHAR -STARTCHAR 0x1FB6 -ENCODING 8118 +STARTCHAR C138 +ENCODING 8067 SWIDTH 480 0 DWIDTH 8 0 -BBX 7 11 1 0 +BBX 7 17 1 -5 BITMAP +68 +68 +44 24 -54 -48 00 62 92 @@ -43846,15 +43996,21 @@ 88 98 66 +00 +60 +20 +28 +10 ENDCHAR -STARTCHAR 0x1FB7 -ENCODING 8119 +STARTCHAR C138 +ENCODING 8068 SWIDTH 480 0 DWIDTH 8 0 -BBX 7 16 1 -5 +BBX 7 17 1 -5 BITMAP -24 -54 +64 +64 +28 48 00 62 @@ -43870,76 +44026,95 @@ 28 10 ENDCHAR -STARTCHAR 0x1FB8 -ENCODING 8120 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 11 14 0 0 +STARTCHAR C138 +ENCODING 8069 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 7 17 1 -5 BITMAP -1100 -0E00 -0000 -0400 -0400 -0A00 -0A00 -0A00 -1100 -1100 -1F00 -2080 -2080 -F1E0 -ENDCHAR -STARTCHAR 0x1FB9 -ENCODING 8121 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 11 13 0 0 +64 +64 +48 +28 +00 +62 +92 +94 +8C +88 +98 +66 +00 +60 +20 +28 +10 +ENDCHAR +STARTCHAR C130 +ENCODING 8070 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 7 21 1 -5 BITMAP -1F00 -0000 -0400 -0400 -0A00 -0A00 -0A00 -1100 -1100 -1F00 -2080 -2080 -F1E0 +24 +54 +48 +00 +18 +18 +08 +10 +00 +62 +92 +94 +8C +88 +98 +66 +00 +60 +20 +28 +10 ENDCHAR -STARTCHAR 0x1FBA -ENCODING 8122 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 11 13 0 0 +STARTCHAR C129 +ENCODING 8071 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 7 21 1 -5 BITMAP -4000 -4000 -2400 -2400 -0A00 -0A00 -0A00 -1100 -1100 -1F00 -2080 -2080 -F1E0 +24 +54 +48 +00 +30 +30 +20 +10 +00 +62 +92 +94 +8C +88 +98 +66 +00 +60 +20 +28 +10 ENDCHAR -STARTCHAR 0x1FBB -ENCODING 8123 +STARTCHAR C065 +ENCODING 8072 SWIDTH 660 0 DWIDTH 11 0 -BBX 11 13 0 0 +BBX 11 17 0 -4 BITMAP -2000 -2000 -4400 +6000 +6000 +2400 4400 0A00 0A00 @@ -43950,15 +44125,21 @@ 2080 2080 F1E0 +0C00 +0400 +0500 +0200 ENDCHAR -STARTCHAR 0x1FBC -ENCODING 8124 +STARTCHAR C065 +ENCODING 8073 SWIDTH 660 0 DWIDTH 11 0 -BBX 11 15 0 -4 +BBX 11 17 0 -4 BITMAP -0400 -0400 +6000 +6000 +4400 +2400 0A00 0A00 0A00 @@ -43973,71 +44154,189 @@ 0500 0200 ENDCHAR -STARTCHAR 0x1FBD -ENCODING 8125 -SWIDTH 180 0 -DWIDTH 3 0 -BBX 2 5 1 11 +STARTCHAR 0x1F8A +ENCODING 8074 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 12 17 0 -4 BITMAP -C0 -C0 -40 -40 -80 +D000 +D000 +4A00 +8A00 +0500 +0500 +0500 +0880 +0880 +0F80 +1040 +1040 +78F0 +0600 +0200 +0280 +0100 ENDCHAR -STARTCHAR 0x1FBE -ENCODING 8126 -SWIDTH 300 0 -DWIDTH 5 0 -BBX 4 4 1 -4 +STARTCHAR 0x1F8B +ENCODING 8075 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 12 17 0 -4 BITMAP -C0 -40 -50 -20 +D000 +D000 +8A00 +4A00 +0500 +0500 +0500 +0880 +0880 +0F80 +1040 +1040 +78F0 +0600 +0200 +0280 +0100 ENDCHAR -STARTCHAR 0x1FBF -ENCODING 8127 -SWIDTH 180 0 -DWIDTH 3 0 -BBX 2 5 1 11 +STARTCHAR 0x1F8C +ENCODING 8076 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 12 17 0 -4 BITMAP -C0 -C0 -40 -40 -80 +C800 +C800 +5200 +9200 +0500 +0500 +0500 +0880 +0880 +0F80 +1040 +1040 +78F0 +0600 +0200 +0280 +0100 ENDCHAR -STARTCHAR 0x1FC0 -ENCODING 8128 -SWIDTH 360 0 -DWIDTH 6 0 -BBX 5 3 1 11 +STARTCHAR 0x1F8D +ENCODING 8077 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 12 17 0 -4 BITMAP -48 -A8 -90 +C800 +C800 +9200 +5200 +0500 +0500 +0500 +0880 +0880 +0F80 +1040 +1040 +78F0 +0600 +0200 +0280 +0100 ENDCHAR -STARTCHAR 0x1FC1 -ENCODING 8129 -SWIDTH 360 0 -DWIDTH 6 0 -BBX 5 6 1 11 +STARTCHAR 0x1F8E +ENCODING 8078 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 12 21 0 -4 BITMAP -48 -A8 -90 -00 -D8 -D8 +4800 +A800 +9000 +0000 +3000 +3000 +1200 +2200 +0500 +0500 +0500 +0880 +0880 +0F80 +1040 +1040 +78F0 +0600 +0200 +0280 +0100 ENDCHAR -STARTCHAR 0x1FC2 -ENCODING 8130 +STARTCHAR 0x1F8F +ENCODING 8079 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 12 21 0 -4 +BITMAP +4800 +A800 +9000 +0000 +3000 +3000 +2200 +1200 +0500 +0500 +0500 +0880 +0880 +0F80 +1040 +1040 +78F0 +0600 +0200 +0280 +0100 +ENDCHAR +STARTCHAR C090 +ENCODING 8080 SWIDTH 420 0 DWIDTH 7 0 -BBX 6 15 1 -4 +BBX 6 16 1 -4 BITMAP +30 +30 +10 20 +00 +98 +64 +44 +44 +44 +44 +44 +04 +C4 +44 +64 +ENDCHAR +STARTCHAR C090 +ENCODING 8081 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 6 16 1 -4 +BITMAP +30 +30 20 10 00 @@ -44053,12 +44352,17 @@ 44 64 ENDCHAR -STARTCHAR 0x1FC3 -ENCODING 8131 +STARTCHAR C090 +ENCODING 8082 SWIDTH 420 0 DWIDTH 7 0 -BBX 6 11 1 -4 +BBX 6 16 1 -4 BITMAP +68 +68 +24 +44 +00 98 64 44 @@ -44071,15 +44375,16 @@ 44 64 ENDCHAR -STARTCHAR 0x1FC4 -ENCODING 8132 +STARTCHAR C090 +ENCODING 8083 SWIDTH 420 0 DWIDTH 7 0 -BBX 6 15 1 -4 +BBX 6 16 1 -4 BITMAP -10 -10 -20 +68 +68 +44 +24 00 98 64 @@ -44093,14 +44398,15 @@ 44 64 ENDCHAR -STARTCHAR 0x1FC6 -ENCODING 8134 +STARTCHAR C090 +ENCODING 8084 SWIDTH 420 0 DWIDTH 7 0 -BBX 6 15 1 -4 +BBX 6 16 1 -4 BITMAP -24 -54 +64 +64 +28 48 00 98 @@ -44111,19 +44417,20 @@ 44 44 04 -04 -04 -04 +C4 +44 +64 ENDCHAR -STARTCHAR 0x1FC7 -ENCODING 8135 +STARTCHAR C090 +ENCODING 8085 SWIDTH 420 0 DWIDTH 7 0 -BBX 6 15 1 -4 +BBX 6 16 1 -4 BITMAP -24 -54 +64 +64 48 +28 00 98 64 @@ -44137,56 +44444,70 @@ 44 64 ENDCHAR -STARTCHAR 0x1FC8 -ENCODING 8136 -SWIDTH 840 0 -DWIDTH 14 0 -BBX 13 13 0 0 +STARTCHAR C130 +ENCODING 8086 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 6 20 1 -4 BITMAP -8000 -8000 -5FF0 -4410 -0410 -0450 -0440 -07C0 -0448 -0448 -0410 -0410 -1FF0 +48 +A8 +90 +00 +30 +30 +10 +20 +00 +98 +64 +44 +44 +44 +44 +44 +04 +C4 +44 +64 ENDCHAR -STARTCHAR 0x1FC9 -ENCODING 8137 -SWIDTH 840 0 -DWIDTH 14 0 -BBX 13 13 0 0 +STARTCHAR C130 +ENCODING 8087 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 6 20 1 -4 BITMAP -4000 -4000 -9FF0 -8410 -0410 -0450 -0440 -07C0 -0448 -0448 -0410 -0410 -1FF0 +48 +A8 +90 +00 +30 +30 +20 +10 +00 +98 +64 +44 +44 +44 +44 +44 +04 +C4 +44 +64 ENDCHAR -STARTCHAR 0x1FCA -ENCODING 8138 +STARTCHAR C072 +ENCODING 8088 SWIDTH 900 0 DWIDTH 15 0 -BBX 14 13 0 0 +BBX 14 18 0 -5 BITMAP -8000 -8000 +C000 +C000 5F7C -4410 +8410 0410 0410 0410 @@ -44196,17 +44517,22 @@ 0410 0410 1F7C +0000 +0180 +0080 +00A0 +0040 ENDCHAR -STARTCHAR 0x1FCB -ENCODING 8139 +STARTCHAR C072 +ENCODING 8089 SWIDTH 900 0 DWIDTH 15 0 -BBX 14 13 0 0 +BBX 14 18 0 -5 BITMAP -4000 -4000 +C000 +C000 9F7C -8410 +4410 0410 0410 0410 @@ -44216,3898 +44542,70540 @@ 0410 0410 1F7C +0000 +00C0 +0040 +0050 +0020 ENDCHAR -STARTCHAR 0x1FCC -ENCODING 8140 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 11 16 0 -5 -BITMAP +STARTCHAR C072 +ENCODING 8090 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 16 18 0 -5 +BITMAP +D000 +D000 +4FDF +8904 +0104 +0104 +0104 +01FC +0104 +0104 +0104 +0104 +07DF +0000 +00C0 +0040 +0050 +0020 +ENDCHAR +STARTCHAR C072 +ENCODING 8091 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 16 18 0 -5 +BITMAP +D000 +D000 +8FDF +4904 +0104 +0104 +0104 +01FC +0104 +0104 +0104 +0104 +07DF +0000 +00C0 +0040 +0050 +0020 +ENDCHAR +STARTCHAR C072 +ENCODING 8092 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 16 18 0 -5 +BITMAP +C800 +C800 +57DF +9104 +0104 +0104 +0104 +01FC +0104 +0104 +0104 +0104 +07DF +0000 +00C0 +0040 +0050 +0020 +ENDCHAR +STARTCHAR C072 +ENCODING 8093 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 16 18 0 -5 +BITMAP +C800 +C800 +97DF +5104 +0104 +0104 +0104 +01FC +0104 +0104 +0104 +0104 +07DF +0000 +00C0 +0040 +0050 +0020 +ENDCHAR +STARTCHAR 0x1F9E +ENCODING 8094 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 16 22 0 -5 +BITMAP +4800 +A800 +9000 +0000 +3000 +3000 +17DF +2104 +0104 +0104 +0104 +01FC +0104 +0104 +0104 +0104 +07DF +0000 +00C0 +0040 +0050 +0020 +ENDCHAR +STARTCHAR 0x1F9F +ENCODING 8095 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 16 22 0 -5 +BITMAP +4800 +A800 +9000 +0000 +3000 +3000 +27DF +1104 +0104 +0104 +0104 +01FC +0104 +0104 +0104 +0104 +07DF +0000 +00C0 +0040 +0050 +0020 +ENDCHAR +STARTCHAR C117 +ENCODING 8096 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 17 1 -5 +BITMAP +1800 +1800 +0800 +1000 +0000 +2200 +4100 +8080 +8880 +8880 +8880 +7700 +0000 +1800 +0800 +0A00 +0400 +ENDCHAR +STARTCHAR C117 +ENCODING 8097 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 17 1 -5 +BITMAP +1800 +1800 +1000 +0800 +0000 +2200 +4100 +8080 +8880 +8880 +8880 +7700 +0000 +1800 +0800 +0A00 +0400 +ENDCHAR +STARTCHAR C117 +ENCODING 8098 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 17 1 -5 +BITMAP +3400 +3400 +1200 +2200 +0000 +2200 +4100 +8080 +8880 +8880 +8880 +7700 +0000 +1800 +0800 +0A00 +0400 +ENDCHAR +STARTCHAR C117 +ENCODING 8099 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 17 1 -5 +BITMAP +3400 +3400 +2200 +1200 +0000 +2200 +4100 +8080 +8880 +8880 +8880 +7700 +0000 +1800 +0800 +0A00 +0400 +ENDCHAR +STARTCHAR C117 +ENCODING 8100 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 17 1 -5 +BITMAP +3200 +3200 +1400 +2400 +0000 +2200 +4100 +8080 +8880 +8880 +8880 +7700 +0000 +1800 +0800 +0A00 +0400 +ENDCHAR +STARTCHAR C117 +ENCODING 8101 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 17 1 -5 +BITMAP +3200 +3200 +2400 +1400 +0000 +2200 +4100 +8080 +8880 +8880 +8880 +7700 +0000 +1800 +0800 +0A00 +0400 +ENDCHAR +STARTCHAR C117 +ENCODING 8102 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 21 1 -5 +BITMAP +2400 +5400 +4800 +0000 +1800 +1800 +0800 +1000 +0000 +2200 +4100 +8080 +8880 +8880 +8880 +7700 +0000 +1800 +0800 +0A00 +0400 +ENDCHAR +STARTCHAR C117 +ENCODING 8103 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 21 1 -5 +BITMAP +2400 +5400 +4800 +0000 +1800 +1800 +1000 +0800 +0000 +2200 +4100 +8080 +8880 +8880 +8880 +7700 +0000 +1800 +0800 +0A00 +0400 +ENDCHAR +STARTCHAR 0x1FA8 +ENCODING 8104 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 11 17 0 -4 +BITMAP +C000 +C000 +4F80 +9040 +2020 +2020 +2020 +2020 +1040 +1040 +0880 +28A0 +38E0 +0600 +0200 +0280 +0100 +ENDCHAR +STARTCHAR 0x1FA9 +ENCODING 8105 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 11 17 0 -4 +BITMAP +C000 +C000 +8F80 +5040 +2020 +2020 +2020 +2020 +1040 +1040 +0880 +28A0 +38E0 +0600 +0200 +0280 +0100 +ENDCHAR +STARTCHAR 0x1FAA +ENCODING 8106 +SWIDTH 900 0 +DWIDTH 15 0 +BBX 14 17 0 -4 +BITMAP +D000 +D000 +49F0 +8A08 +0404 +0404 +0404 +0404 +0208 +0208 +0110 +0514 +071C +00C0 +0040 +0050 +0020 +ENDCHAR +STARTCHAR 0x1FAB +ENCODING 8107 +SWIDTH 900 0 +DWIDTH 15 0 +BBX 14 17 0 -4 +BITMAP +D000 +D000 +89F0 +4A08 +0404 +0404 +0404 +0404 +0208 +0208 +0110 +0514 +071C +00C0 +0040 +0050 +0020 +ENDCHAR +STARTCHAR 0x1FAC +ENCODING 8108 +SWIDTH 840 0 +DWIDTH 14 0 +BBX 13 17 0 -4 +BITMAP +C800 +C800 +53E0 +9410 +0808 +0808 +0808 +0808 +0410 +0410 +0220 +0A28 +0E38 +0180 +0080 +00A0 +0040 +ENDCHAR +STARTCHAR 0x1FAD +ENCODING 8109 +SWIDTH 840 0 +DWIDTH 14 0 +BBX 13 17 0 -4 +BITMAP +C800 +C800 +93E0 +5410 +0808 +0808 +0808 +0808 +0410 +0410 +0220 +0A28 +0E38 +0180 +0080 +00A0 +0040 +ENDCHAR +STARTCHAR 0x1FAE +ENCODING 8110 +SWIDTH 840 0 +DWIDTH 14 0 +BBX 13 21 0 -4 +BITMAP +4800 +A800 +9000 +0000 +3000 +3000 +13E0 +2410 +0808 +0808 +0808 +0808 +0410 +0410 +0220 +0A28 +0E38 +0180 +0080 +00A0 +0040 +ENDCHAR +STARTCHAR 0x1FAF +ENCODING 8111 +SWIDTH 840 0 +DWIDTH 14 0 +BBX 13 21 0 -4 +BITMAP +4800 +A800 +9000 +0000 +3000 +3000 +23E0 +1410 +0808 +0808 +0808 +0808 +0410 +0410 +0220 +0A28 +0E38 +0180 +0080 +00A0 +0040 +ENDCHAR +STARTCHAR C130 +ENCODING 8112 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 7 11 1 0 +BITMAP +44 +38 +00 +00 +62 +92 +94 +8C +88 +98 +66 +ENDCHAR +STARTCHAR C130 +ENCODING 8113 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 7 10 1 0 +BITMAP +7C +00 +00 +62 +92 +94 +8C +88 +98 +66 +ENDCHAR +STARTCHAR C130 +ENCODING 8114 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 7 17 1 -5 +BITMAP +10 +10 +08 +08 +00 +62 +92 +94 +8C +88 +98 +66 +00 +60 +20 +28 +10 +ENDCHAR +STARTCHAR C130 +ENCODING 8115 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 7 12 1 -5 +BITMAP +62 +92 +94 +8C +88 +98 +66 +00 +60 +20 +28 +10 +ENDCHAR +STARTCHAR C130 +ENCODING 8116 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 7 17 1 -5 +BITMAP +08 +08 +10 +10 +00 +62 +92 +94 +8C +88 +98 +66 +00 +60 +20 +28 +10 +ENDCHAR +STARTCHAR C130 +ENCODING 8118 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 7 11 1 0 +BITMAP +24 +54 +48 +00 +62 +92 +94 +8C +88 +98 +66 +ENDCHAR +STARTCHAR C130 +ENCODING 8119 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 7 16 1 -5 +BITMAP +24 +54 +48 +00 +62 +92 +94 +8C +88 +98 +66 +00 +60 +20 +28 +10 +ENDCHAR +STARTCHAR C065 +ENCODING 8120 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 11 14 0 0 +BITMAP +1100 +0E00 +0000 +0400 +0400 +0A00 +0A00 +0A00 +1100 +1100 +1F00 +2080 +2080 +F1E0 +ENDCHAR +STARTCHAR C065 +ENCODING 8121 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 11 13 0 0 +BITMAP +1F00 +0000 +0400 +0400 +0A00 +0A00 +0A00 +1100 +1100 +1F00 +2080 +2080 +F1E0 +ENDCHAR +STARTCHAR C065 +ENCODING 8122 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 11 13 0 0 +BITMAP +4000 +4000 +2400 +2400 +0A00 +0A00 +0A00 +1100 +1100 +1F00 +2080 +2080 +F1E0 +ENDCHAR +STARTCHAR C065 +ENCODING 8123 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 11 13 0 0 +BITMAP +2000 +2000 +4400 +4400 +0A00 +0A00 +0A00 +1100 +1100 +1F00 +2080 +2080 +F1E0 +ENDCHAR +STARTCHAR C065 +ENCODING 8124 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 11 15 0 -4 +BITMAP +0400 +0400 +0A00 +0A00 +0A00 +1100 +1100 +1F00 +2080 +2080 +F1E0 +0C00 +0400 +0500 +0200 +ENDCHAR +STARTCHAR C044 +ENCODING 8125 +SWIDTH 180 0 +DWIDTH 3 0 +BBX 2 5 1 11 +BITMAP +C0 +C0 +40 +40 +80 +ENDCHAR +STARTCHAR char837 +ENCODING 8126 +SWIDTH 300 0 +DWIDTH 5 0 +BBX 4 4 1 -4 +BITMAP +C0 +40 +50 +20 +ENDCHAR +STARTCHAR C044 +ENCODING 8127 +SWIDTH 180 0 +DWIDTH 3 0 +BBX 2 5 1 11 +BITMAP +C0 +C0 +40 +40 +80 +ENDCHAR +STARTCHAR char8128 +ENCODING 8128 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 3 1 11 +BITMAP +48 +A8 +90 +ENDCHAR +STARTCHAR char8128 +ENCODING 8129 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 6 1 11 +BITMAP +48 +A8 +90 +00 +D8 +D8 +ENDCHAR +STARTCHAR C090 +ENCODING 8130 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 6 15 1 -4 +BITMAP +20 +20 +10 +00 +98 +64 +44 +44 +44 +44 +44 +04 +C4 +44 +64 +ENDCHAR +STARTCHAR C090 +ENCODING 8131 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 6 11 1 -4 +BITMAP +98 +64 +44 +44 +44 +44 +44 +04 +C4 +44 +64 +ENDCHAR +STARTCHAR C090 +ENCODING 8132 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 6 15 1 -4 +BITMAP +10 +10 +20 +00 +98 +64 +44 +44 +44 +44 +44 +04 +C4 +44 +64 +ENDCHAR +STARTCHAR C090 +ENCODING 8134 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 6 15 1 -4 +BITMAP +24 +54 +48 +00 +98 +64 +44 +44 +44 +44 +44 +04 +04 +04 +04 +ENDCHAR +STARTCHAR C090 +ENCODING 8135 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 6 15 1 -4 +BITMAP +24 +54 +48 +00 +98 +64 +44 +44 +44 +44 +44 +04 +C4 +44 +64 +ENDCHAR +STARTCHAR 0x1FC8 +ENCODING 8136 +SWIDTH 840 0 +DWIDTH 14 0 +BBX 13 13 0 0 +BITMAP +8000 +8000 +5FF0 +4410 +0410 +0450 +0440 +07C0 +0448 +0448 +0410 +0410 +1FF0 +ENDCHAR +STARTCHAR 0x1FC9 +ENCODING 8137 +SWIDTH 840 0 +DWIDTH 14 0 +BBX 13 13 0 0 +BITMAP +4000 +4000 +9FF0 +8410 +0410 +0450 +0440 +07C0 +0448 +0448 +0410 +0410 +1FF0 +ENDCHAR +STARTCHAR 0x1FCA +ENCODING 8138 +SWIDTH 900 0 +DWIDTH 15 0 +BBX 14 13 0 0 +BITMAP +8000 +8000 +5F7C +4410 +0410 +0410 +0410 +07F0 +0410 +0410 +0410 +0410 +1F7C +ENDCHAR +STARTCHAR 0x1FCB +ENCODING 8139 +SWIDTH 900 0 +DWIDTH 15 0 +BBX 14 13 0 0 +BITMAP +4000 +4000 +9F7C +8410 +0410 +0410 +0410 +07F0 +0410 +0410 +0410 +0410 +1F7C +ENDCHAR +STARTCHAR 0x1FCC +ENCODING 8140 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 11 16 0 -5 +BITMAP +FBE0 +2080 +2080 +2080 +2080 +3F80 +2080 +2080 +2080 +2080 +FBE0 +0000 +0C00 +0400 +0500 +0200 +ENDCHAR +STARTCHAR char8141 +ENCODING 8141 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 4 1 11 +BITMAP +D0 +D0 +48 +88 +ENDCHAR +STARTCHAR char8141 +ENCODING 8142 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 4 1 11 +BITMAP +C8 +C8 +50 +90 +ENDCHAR +STARTCHAR char8143 +ENCODING 8143 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 8 1 11 +BITMAP +48 +A8 +90 +00 +30 +30 +10 +20 +ENDCHAR +STARTCHAR C090 +ENCODING 8144 +SWIDTH 300 0 +DWIDTH 5 0 +BBX 5 11 0 0 +BITMAP +88 +70 +00 +00 +20 +60 +20 +20 +20 +28 +10 +ENDCHAR +STARTCHAR C090 +ENCODING 8145 +SWIDTH 300 0 +DWIDTH 5 0 +BBX 5 10 0 0 +BITMAP +F8 +00 +00 +20 +60 +20 +20 +20 +28 +10 +ENDCHAR +STARTCHAR C090 +ENCODING 8146 +SWIDTH 300 0 +DWIDTH 5 0 +BBX 6 13 -1 0 +BITMAP +20 +20 +DC +CC +00 +00 +10 +30 +10 +10 +10 +14 +08 +ENDCHAR +STARTCHAR C090 +ENCODING 8147 +SWIDTH 300 0 +DWIDTH 5 0 +BBX 6 13 -1 0 +BITMAP +10 +10 +EC +CC +00 +00 +10 +30 +10 +10 +10 +14 +08 +ENDCHAR +STARTCHAR C090 +ENCODING 8150 +SWIDTH 300 0 +DWIDTH 5 0 +BBX 5 12 0 0 +BITMAP +48 +A8 +90 +00 +00 +20 +60 +20 +20 +20 +28 +10 +ENDCHAR +STARTCHAR C090 +ENCODING 8151 +SWIDTH 300 0 +DWIDTH 5 0 +BBX 5 15 0 0 +BITMAP +48 +A8 +90 +00 +D8 +D8 +00 +00 +20 +60 +20 +20 +20 +28 +10 +ENDCHAR +STARTCHAR C072 +ENCODING 8152 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 14 1 0 +BITMAP +88 +70 +00 +F8 +20 +20 +20 +20 +20 +20 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR C072 +ENCODING 8153 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 13 1 0 +BITMAP +F8 +00 +F8 +20 +20 +20 +20 +20 +20 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR C072 +ENCODING 8154 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +80 +80 +5F +44 +04 +04 +04 +04 +04 +04 +04 +04 +1F +ENDCHAR +STARTCHAR C072 +ENCODING 8155 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +40 +40 +9F +84 +04 +04 +04 +04 +04 +04 +04 +04 +1F +ENDCHAR +STARTCHAR char8141 +ENCODING 8157 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 4 1 11 +BITMAP +D0 +D0 +88 +48 +ENDCHAR +STARTCHAR char8141 +ENCODING 8158 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 4 1 11 +BITMAP +C8 +C8 +90 +50 +ENDCHAR +STARTCHAR char8143 +ENCODING 8159 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 8 1 11 +BITMAP +48 +A8 +90 +00 +30 +30 +20 +10 +ENDCHAR +STARTCHAR C090 +ENCODING 8160 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 6 11 1 0 +BITMAP +44 +38 +00 +00 +C8 +44 +44 +44 +44 +48 +30 +ENDCHAR +STARTCHAR C090 +ENCODING 8161 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 6 10 1 0 +BITMAP +7C +00 +00 +C8 +44 +44 +44 +44 +48 +30 +ENDCHAR +STARTCHAR C090 +ENCODING 8162 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 6 13 1 0 +BITMAP +20 +20 +DC +CC +00 +00 +C8 +44 +44 +44 +44 +48 +30 +ENDCHAR +STARTCHAR C090 +ENCODING 8163 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 6 13 1 0 +BITMAP +10 +10 +EC +CC +00 +00 +C8 +44 +44 +44 +44 +48 +30 +ENDCHAR +STARTCHAR C114 +ENCODING 8164 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 17 1 -4 +BITMAP +30 +30 +10 +20 +00 +00 +70 +88 +88 +88 +88 +88 +F0 +80 +80 +80 +80 +ENDCHAR +STARTCHAR C114 +ENCODING 8165 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 17 1 -4 +BITMAP +60 +60 +40 +20 +00 +00 +70 +88 +88 +88 +88 +88 +F0 +80 +80 +80 +80 +ENDCHAR +STARTCHAR C090 +ENCODING 8166 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 6 12 1 0 +BITMAP +24 +54 +48 +00 +00 +C8 +44 +44 +44 +44 +48 +30 +ENDCHAR +STARTCHAR C090 +ENCODING 8167 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 6 15 1 0 +BITMAP +24 +54 +48 +00 +6C +6C +00 +00 +C8 +44 +44 +44 +44 +48 +30 +ENDCHAR +STARTCHAR C085 +ENCODING 8168 +SWIDTH 840 0 +DWIDTH 14 0 +BBX 11 14 0 0 +BITMAP +1100 +0E00 +0000 +F1E0 +2080 +1100 +1100 +0A00 +0E00 +0400 +0400 +0400 +0400 +1F00 +ENDCHAR +STARTCHAR C085 +ENCODING 8169 +SWIDTH 840 0 +DWIDTH 14 0 +BBX 11 13 0 0 +BITMAP +1F00 +0000 +F1E0 +2080 +1100 +1100 +0A00 +0E00 +0400 +0400 +0400 +0400 +1F00 +ENDCHAR +STARTCHAR 0x1FEA +ENCODING 8170 +SWIDTH 840 0 +DWIDTH 14 0 +BBX 13 12 0 0 +BITMAP +8000 +BC78 +4820 +4440 +0440 +0280 +0380 +0100 +0100 +0100 +0100 +07C0 +ENDCHAR +STARTCHAR 0x1FEB +ENCODING 8171 +SWIDTH 840 0 +DWIDTH 14 0 +BBX 13 12 0 0 +BITMAP +4000 +7C78 +8820 +8440 +0440 +0280 +0380 +0100 +0100 +0100 +0100 +07C0 +ENDCHAR +STARTCHAR C082 +ENCODING 8172 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 12 13 0 0 +BITMAP +C000 +C000 +9FE0 +8430 +4410 +0410 +0430 +07E0 +0400 +0400 +0400 +0400 +1F00 +ENDCHAR +STARTCHAR char901 +ENCODING 8173 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 6 4 2 11 +BITMAP +20 +20 +DC +CC +ENDCHAR +STARTCHAR char901 +ENCODING 8174 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 6 4 2 11 +BITMAP +10 +10 +EC +CC +ENDCHAR +STARTCHAR char8141 +ENCODING 8175 +SWIDTH 180 0 +DWIDTH 3 0 +BBX 2 4 1 11 +BITMAP +80 +80 +40 +40 +ENDCHAR +STARTCHAR C117 +ENCODING 8178 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 16 1 -5 +BITMAP +1000 +1000 +0800 +0000 +2200 +4100 +8080 +8880 +8880 +8880 +7700 +0000 +1800 +0800 +0A00 +0400 +ENDCHAR +STARTCHAR C117 +ENCODING 8179 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 12 1 -5 +BITMAP +2200 +4100 +8080 +8880 +8880 +8880 +7700 +0000 +1800 +0800 +0A00 +0400 +ENDCHAR +STARTCHAR C117 +ENCODING 8180 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 16 1 -5 +BITMAP +0400 +0400 +0800 +0000 +2200 +4100 +8080 +8880 +8880 +8880 +7700 +0000 +1800 +0800 +0A00 +0400 +ENDCHAR +STARTCHAR C117 +ENCODING 8182 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 11 1 0 +BITMAP +1200 +2A00 +2400 +0000 +2200 +4100 +8080 +8880 +8880 +8880 +7700 +ENDCHAR +STARTCHAR C117 +ENCODING 8183 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 16 1 -5 +BITMAP +1200 +2A00 +2400 +0000 +2200 +4100 +8080 +8880 +8880 +8880 +7700 +0000 +1800 +0800 +0A00 +0400 +ENDCHAR +STARTCHAR C079 +ENCODING 8184 +SWIDTH 840 0 +DWIDTH 14 0 +BBX 12 13 0 0 +BITMAP +8000 +8000 +4780 +4840 +1020 +2010 +2010 +2010 +2010 +2010 +1020 +0840 +0780 +ENDCHAR +STARTCHAR C079 +ENCODING 8185 +SWIDTH 840 0 +DWIDTH 14 0 +BBX 12 13 0 0 +BITMAP +4000 +4000 +8780 +8840 +1020 +2010 +2010 +2010 +2010 +2010 +1020 +0840 +0780 +ENDCHAR +STARTCHAR 0x1FFA +ENCODING 8186 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 12 13 0 0 +BITMAP +8000 +8000 +47C0 +4820 +1010 +1010 +1010 +1010 +0820 +0820 +0440 +1450 +1C70 +ENDCHAR +STARTCHAR 0x1FFB +ENCODING 8187 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 12 13 0 0 +BITMAP +4000 +4000 +87C0 +8820 +1010 +1010 +1010 +1010 +0820 +0820 +0440 +1450 +1C70 +ENDCHAR +STARTCHAR 0x1FFC +ENCODING 8188 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 15 1 -4 +BITMAP +3E00 +4100 +8080 +8080 +8080 +8080 +4100 +4100 +2200 +A280 +E380 +1800 +0800 +0A00 +0400 +ENDCHAR +STARTCHAR char8141 +ENCODING 8189 +SWIDTH 180 0 +DWIDTH 3 0 +BBX 2 4 1 11 +BITMAP +40 +40 +80 +80 +ENDCHAR +STARTCHAR C044 +ENCODING 8190 +SWIDTH 180 0 +DWIDTH 3 0 +BBX 2 5 1 11 +BITMAP +C0 +C0 +80 +80 +40 +ENDCHAR +STARTCHAR char8192 +ENCODING 8192 +SWIDTH 900 0 +DWIDTH 15 0 +BBX 15 15 0 0 +BITMAP +B6D6 +8000 +2272 +B288 +2A8A +A69A +A278 +0002 +9EF2 +A088 +1CF2 +8282 +BC80 +0002 +DB6A +ENDCHAR +STARTCHAR char8192 +ENCODING 8203 +SWIDTH 900 0 +DWIDTH 15 0 +BBX 15 15 0 0 +BITMAP +B6D6 +8000 +3EAA +84A8 +08AA +90AA +BE50 +0002 +9EF2 +A088 +1CF2 +8282 +BC80 +0002 +DB6A +ENDCHAR +STARTCHAR char8192 +ENCODING 8204 +SWIDTH 900 0 +DWIDTH 15 0 +BBX 15 15 0 0 +BITMAP +B6D6 +8000 +3EAA +84A8 +08AA +90AA +BE50 +0002 +A20A +B208 +2A0A +A68A +A270 +0002 +DB6A +ENDCHAR +STARTCHAR char8192 +ENCODING 8205 +SWIDTH 900 0 +DWIDTH 15 0 +BBX 15 15 0 0 +BITMAP +B6D6 +8000 +3EAA +84A8 +08AA +90AA +BE50 +0002 +8042 +8040 +0042 +8442 +8380 +0002 +DB6A +ENDCHAR +STARTCHAR C032 +ENCODING 8208 +SWIDTH 300 0 +DWIDTH 5 0 +BBX 4 1 1 4 +BITMAP +F0 +ENDCHAR +STARTCHAR C045 +ENCODING 8209 +SWIDTH 300 0 +DWIDTH 5 0 +BBX 4 1 1 4 +BITMAP +F0 +ENDCHAR +STARTCHAR EN DASH +ENCODING 8210 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 7 1 1 4 +BITMAP +FE +ENDCHAR +STARTCHAR EN DASH +ENCODING 8211 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 7 1 1 4 +BITMAP +FE +ENDCHAR +STARTCHAR EM DASH +ENCODING 8212 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 15 1 1 4 +BITMAP +FFFE +ENDCHAR +STARTCHAR EM DASH +ENCODING 8213 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 16 1 1 4 +BITMAP +FFFF +ENDCHAR +STARTCHAR EM DASH +ENCODING 8214 +SWIDTH 240 0 +DWIDTH 4 0 +BBX 3 13 0 0 +BITMAP +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR C069 +ENCODING 8215 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 10 3 0 -3 +BITMAP +FFC0 +0000 +FFC0 +ENDCHAR +STARTCHAR C044 +ENCODING 8216 +SWIDTH 180 0 +DWIDTH 3 0 +BBX 2 5 1 7 +BITMAP +40 +80 +80 +C0 +C0 +ENDCHAR +STARTCHAR C044 +ENCODING 8217 +SWIDTH 180 0 +DWIDTH 3 0 +BBX 2 5 1 7 +BITMAP +C0 +C0 +40 +40 +80 +ENDCHAR +STARTCHAR C044 +ENCODING 8218 +SWIDTH 180 0 +DWIDTH 3 0 +BBX 2 5 1 -3 +BITMAP +C0 +C0 +40 +40 +80 +ENDCHAR +STARTCHAR C044 +ENCODING 8219 +SWIDTH 180 0 +DWIDTH 3 0 +BBX 2 5 1 7 +BITMAP +C0 +C0 +80 +80 +40 +ENDCHAR +STARTCHAR C092 +ENCODING 8220 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 5 1 7 +BITMAP +48 +90 +90 +D8 +D8 +ENDCHAR +STARTCHAR C034 +ENCODING 8221 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 5 1 7 +BITMAP +D8 +D8 +48 +48 +90 +ENDCHAR +STARTCHAR C034 +ENCODING 8222 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 5 1 -3 +BITMAP +D8 +D8 +48 +48 +90 +ENDCHAR +STARTCHAR C034 +ENCODING 8223 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 5 1 7 +BITMAP +D8 +D8 +90 +90 +48 +ENDCHAR +STARTCHAR C121 +ENCODING 8224 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 7 15 1 -3 +BITMAP +10 +38 +10 +10 +54 +FE +54 +10 +10 +38 +10 +10 +10 +10 +10 +ENDCHAR +STARTCHAR C121 +ENCODING 8225 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 7 15 1 -3 +BITMAP +10 +38 +10 +10 +54 +FE +56 +10 +54 +FE +54 +10 +10 +38 +10 +ENDCHAR +STARTCHAR C045 +ENCODING 8226 +SWIDTH 300 0 +DWIDTH 5 0 +BBX 4 4 1 3 +BITMAP +60 +F0 +F0 +60 +ENDCHAR +STARTCHAR C045 +ENCODING 8227 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 6 1 2 +BITMAP +80 +E0 +F8 +F8 +E0 +80 +ENDCHAR +STARTCHAR C046 +ENCODING 8228 +SWIDTH 300 0 +DWIDTH 5 0 +BBX 2 2 1 0 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR C046 +ENCODING 8229 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 6 2 1 0 +BITMAP +CC +CC +ENDCHAR +STARTCHAR C046 +ENCODING 8230 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 10 2 1 0 +BITMAP +CCC0 +CCC0 +ENDCHAR +STARTCHAR C046 +ENCODING 8231 +SWIDTH 180 0 +DWIDTH 3 0 +BBX 2 2 1 3 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR C037 +ENCODING 8240 +SWIDTH 900 0 +DWIDTH 15 0 +BBX 14 13 1 -1 +BITMAP +6080 +9900 +9700 +9200 +9400 +6400 +0800 +1318 +14A4 +24A4 +44A4 +44A4 +8318 +ENDCHAR +STARTCHAR C037 +ENCODING 8241 +SWIDTH 1200 0 +DWIDTH 20 0 +BBX 19 13 1 -1 +BITMAP +608000 +990000 +970000 +920000 +940000 +640000 +080000 +1318C0 +14A520 +24A520 +44A520 +44A520 +8318C0 +ENDCHAR +STARTCHAR C125 +ENCODING 8242 +SWIDTH 240 0 +DWIDTH 4 0 +BBX 3 4 1 7 +BITMAP +20 +60 +40 +80 +ENDCHAR +STARTCHAR C125 +ENCODING 8243 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 6 4 1 7 +BITMAP +24 +6C +48 +90 +ENDCHAR +STARTCHAR C125 +ENCODING 8244 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 4 1 7 +BITMAP +2480 +6D80 +4900 +9200 +ENDCHAR +STARTCHAR C125 +ENCODING 8245 +SWIDTH 240 0 +DWIDTH 4 0 +BBX 3 4 1 7 +BITMAP +80 +C0 +40 +20 +ENDCHAR +STARTCHAR C125 +ENCODING 8246 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 6 4 1 7 +BITMAP +90 +D8 +48 +24 +ENDCHAR +STARTCHAR C125 +ENCODING 8247 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 4 1 7 +BITMAP +9200 +DB00 +4900 +2480 +ENDCHAR +STARTCHAR char8248 +ENCODING 8248 +SWIDTH 240 0 +DWIDTH 4 0 +BBX 3 4 1 -2 +BITMAP +40 +40 +A0 +A0 +ENDCHAR +STARTCHAR char171 +ENCODING 8249 +SWIDTH 300 0 +DWIDTH 5 0 +BBX 4 7 1 0 +BITMAP +10 +20 +60 +C0 +60 +20 +10 +ENDCHAR +STARTCHAR char171 +ENCODING 8250 +SWIDTH 300 0 +DWIDTH 5 0 +BBX 4 7 1 0 +BITMAP +80 +40 +60 +30 +60 +40 +80 +ENDCHAR +STARTCHAR char8251 +ENCODING 8251 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 10 13 1 0 +BITMAP +8040 +4C80 +4C80 +2100 +1200 +1200 +CCC0 +D2C0 +1200 +2100 +4C80 +4C80 +8040 +ENDCHAR +STARTCHAR C033 +ENCODING 8252 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 5 12 1 0 +BITMAP +D8 +D8 +D8 +D8 +D8 +D8 +D8 +00 +00 +00 +D8 +D8 +ENDCHAR +STARTCHAR C063 +ENCODING 8253 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 6 12 1 0 +BITMAP +78 +84 +A4 +24 +28 +30 +20 +60 +60 +00 +60 +60 +ENDCHAR +STARTCHAR C069 +ENCODING 8254 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 10 1 0 12 +BITMAP +FFC0 +ENDCHAR +STARTCHAR C065 +ENCODING 8255 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 11 3 1 0 +BITMAP +8020 +4040 +3F80 +ENDCHAR +STARTCHAR C065 +ENCODING 8256 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 11 3 1 12 +BITMAP +3F80 +4040 +8020 +ENDCHAR +STARTCHAR C047 +ENCODING 8257 +SWIDTH 300 0 +DWIDTH 5 0 +BBX 4 8 1 -4 +BITMAP +10 +10 +20 +20 +40 +60 +90 +90 +ENDCHAR +STARTCHAR C042 +ENCODING 8258 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 11 10 1 1 +BITMAP +0400 +1500 +0E00 +1500 +0400 +2080 +AAA0 +71C0 +AAA0 +2080 +ENDCHAR +STARTCHAR C045 +ENCODING 8259 +SWIDTH 300 0 +DWIDTH 5 0 +BBX 4 2 1 3 +BITMAP +F0 +F0 +ENDCHAR +STARTCHAR C047 +ENCODING 8260 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 8 16 1 -4 +BITMAP +01 +01 +02 +02 +04 +04 +08 +08 +10 +10 +20 +20 +40 +40 +80 +80 +ENDCHAR +STARTCHAR C091 +ENCODING 8261 +SWIDTH 300 0 +DWIDTH 5 0 +BBX 3 16 1 -4 +BITMAP +E0 +80 +80 +80 +80 +80 +80 +E0 +80 +80 +80 +80 +80 +80 +80 +E0 +ENDCHAR +STARTCHAR C093 +ENCODING 8262 +SWIDTH 300 0 +DWIDTH 5 0 +BBX 3 16 0 -4 +BITMAP +E0 +20 +20 +20 +20 +20 +20 +E0 +20 +20 +20 +20 +20 +20 +20 +E0 +ENDCHAR +STARTCHAR char8304 +ENCODING 8304 +SWIDTH 300 0 +DWIDTH 5 0 +BBX 4 7 1 6 +BITMAP +60 +90 +90 +90 +90 +90 +60 +ENDCHAR +STARTCHAR char185 +ENCODING 8308 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 7 1 6 +BITMAP +10 +30 +50 +90 +F8 +10 +38 +ENDCHAR +STARTCHAR char8309 +ENCODING 8309 +SWIDTH 300 0 +DWIDTH 5 0 +BBX 4 7 1 6 +BITMAP +F0 +80 +A0 +D0 +10 +90 +60 +ENDCHAR +STARTCHAR char8310 +ENCODING 8310 +SWIDTH 300 0 +DWIDTH 5 0 +BBX 4 7 1 6 +BITMAP +60 +90 +80 +E0 +90 +90 +60 +ENDCHAR +STARTCHAR char8311 +ENCODING 8311 +SWIDTH 300 0 +DWIDTH 5 0 +BBX 4 7 1 6 +BITMAP +F0 +90 +20 +20 +40 +40 +40 +ENDCHAR +STARTCHAR char8310 +ENCODING 8312 +SWIDTH 300 0 +DWIDTH 5 0 +BBX 4 7 1 6 +BITMAP +60 +90 +90 +60 +90 +90 +60 +ENDCHAR +STARTCHAR char8310 +ENCODING 8313 +SWIDTH 300 0 +DWIDTH 5 0 +BBX 4 7 1 6 +BITMAP +60 +90 +90 +70 +10 +90 +60 +ENDCHAR +STARTCHAR char8314 +ENCODING 8314 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 5 1 7 +BITMAP +20 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR char8314 +ENCODING 8315 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 1 1 9 +BITMAP +F8 +ENDCHAR +STARTCHAR char8314 +ENCODING 8316 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 3 1 8 +BITMAP +F8 +00 +F8 +ENDCHAR +STARTCHAR char8317 +ENCODING 8317 +SWIDTH 180 0 +DWIDTH 3 0 +BBX 2 7 1 6 +BITMAP +40 +80 +80 +80 +80 +80 +40 +ENDCHAR +STARTCHAR char8317 +ENCODING 8318 +SWIDTH 180 0 +DWIDTH 3 0 +BBX 2 7 1 6 +BITMAP +80 +40 +40 +40 +40 +40 +80 +ENDCHAR +STARTCHAR C110 +ENCODING 8319 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 5 1 6 +BITMAP +D0 +68 +48 +48 +48 +ENDCHAR +STARTCHAR char8304 +ENCODING 8320 +SWIDTH 300 0 +DWIDTH 5 0 +BBX 4 7 1 -4 +BITMAP +60 +90 +90 +90 +90 +90 +60 +ENDCHAR +STARTCHAR char185 +ENCODING 8321 +SWIDTH 240 0 +DWIDTH 4 0 +BBX 3 7 1 -4 +BITMAP +40 +C0 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR char178 +ENCODING 8322 +SWIDTH 300 0 +DWIDTH 5 0 +BBX 4 7 1 -4 +BITMAP +60 +90 +10 +10 +20 +40 +F0 +ENDCHAR +STARTCHAR char8323 +ENCODING 8323 +SWIDTH 300 0 +DWIDTH 5 0 +BBX 4 7 1 -4 +BITMAP +60 +90 +10 +20 +10 +90 +60 +ENDCHAR +STARTCHAR char185 +ENCODING 8324 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 7 1 -4 +BITMAP +10 +30 +50 +90 +F8 +10 +38 +ENDCHAR +STARTCHAR char8309 +ENCODING 8325 +SWIDTH 300 0 +DWIDTH 5 0 +BBX 4 7 1 -4 +BITMAP +F0 +80 +A0 +D0 +10 +90 +60 +ENDCHAR +STARTCHAR char8310 +ENCODING 8326 +SWIDTH 300 0 +DWIDTH 5 0 +BBX 4 7 1 -4 +BITMAP +60 +90 +80 +E0 +90 +90 +60 +ENDCHAR +STARTCHAR char8311 +ENCODING 8327 +SWIDTH 300 0 +DWIDTH 5 0 +BBX 4 7 1 -4 +BITMAP +F0 +90 +20 +20 +40 +40 +40 +ENDCHAR +STARTCHAR char8310 +ENCODING 8328 +SWIDTH 300 0 +DWIDTH 5 0 +BBX 4 7 1 -4 +BITMAP +60 +90 +90 +60 +90 +90 +60 +ENDCHAR +STARTCHAR char8310 +ENCODING 8329 +SWIDTH 300 0 +DWIDTH 5 0 +BBX 4 7 1 -4 +BITMAP +60 +90 +90 +70 +10 +90 +60 +ENDCHAR +STARTCHAR char8314 +ENCODING 8330 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 5 1 -3 +BITMAP +20 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR char8314 +ENCODING 8331 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 1 1 -1 +BITMAP +F8 +ENDCHAR +STARTCHAR char8314 +ENCODING 8332 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 3 1 -2 +BITMAP +F8 +00 +F8 +ENDCHAR +STARTCHAR char8317 +ENCODING 8333 +SWIDTH 180 0 +DWIDTH 3 0 +BBX 2 7 1 -4 +BITMAP +40 +80 +80 +80 +80 +80 +40 +ENDCHAR +STARTCHAR char8317 +ENCODING 8334 +SWIDTH 180 0 +DWIDTH 3 0 +BBX 2 7 1 -4 +BITMAP +80 +40 +40 +40 +40 +40 +80 +ENDCHAR +STARTCHAR C067 +ENCODING 8352 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 8 12 2 0 +BITMAP +34 +4C +84 +80 +9F +89 +48 +3E +08 +08 +09 +1F +ENDCHAR +STARTCHAR C067 +ENCODING 8353 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 9 16 2 -2 +BITMAP +0500 +0500 +0A00 +1E80 +2B80 +4A80 +9480 +9400 +9400 +9400 +A880 +6880 +2900 +3E00 +5000 +5000 +ENDCHAR +STARTCHAR C067 +ENCODING 8354 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 9 11 2 0 +BITMAP +1E80 +2180 +4080 +8080 +9A00 +8D00 +8800 +8880 +4880 +2900 +1E00 +ENDCHAR +STARTCHAR C070 +ENCODING 8355 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 9 11 2 0 +BITMAP +FF80 +2080 +2080 +2000 +2700 +3C80 +2480 +2700 +2500 +2480 +FC80 +ENDCHAR +STARTCHAR C036 +ENCODING 8356 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 8 12 2 0 +BITMAP +06 +09 +11 +10 +7C +10 +7C +10 +10 +51 +B2 +CC +ENDCHAR +STARTCHAR C109 +ENCODING 8357 +SWIDTH 840 0 +DWIDTH 14 0 +BBX 11 11 2 -2 +BITMAP +0100 +0100 +FB80 +4640 +4440 +4440 +4C40 +4C40 +FEE0 +1000 +1000 +ENDCHAR +STARTCHAR C078 +ENCODING 8358 +SWIDTH 840 0 +DWIDTH 14 0 +BBX 11 11 2 0 +BITMAP +E3E0 +3080 +3080 +2880 +FFE0 +2480 +FFE0 +2280 +2180 +2180 +F880 +ENDCHAR +STARTCHAR C080 +ENCODING 8359 +SWIDTH 840 0 +DWIDTH 14 0 +BBX 11 11 2 0 +BITMAP +FF00 +2180 +2080 +FFE0 +2080 +2180 +3F00 +2000 +2000 +2000 +F800 +ENDCHAR +STARTCHAR C082 +ENCODING 8360 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 15 11 2 0 +BITMAP +FE00 +2100 +2080 +FFE0 +209E +2122 +3E20 +231C +2102 +2122 +F8FC +ENDCHAR +STARTCHAR C087 +ENCODING 8361 +SWIDTH 1140 0 +DWIDTH 19 0 +BBX 16 11 2 0 +BITMAP +F1CF +2184 +2184 +2244 +FFFF +1248 +FFFF +1428 +0C30 +0C30 +0810 +ENDCHAR +STARTCHAR 00A6 +ENCODING 8362 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 10 9 2 0 +BITMAP +FC00 +8600 +9240 +9240 +9240 +9240 +9040 +10C0 +1F80 +ENDCHAR +STARTCHAR C100 +ENCODING 8363 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 6 14 2 -2 +BITMAP +18 +08 +7C +08 +08 +78 +48 +88 +88 +88 +48 +7C +00 +7C +ENDCHAR +STARTCHAR C067 +ENCODING 8364 +SWIDTH 840 0 +DWIDTH 14 0 +BBX 11 11 2 0 +BITMAP +07A0 +0860 +1020 +2020 +FF80 +2000 +FE00 +2020 +1020 +0840 +0780 +ENDCHAR +STARTCHAR C075 +ENCODING 8365 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 8 11 2 0 +BITMAP +E7 +42 +44 +48 +50 +FE +50 +48 +44 +42 +E7 +ENDCHAR +STARTCHAR C084 +ENCODING 8366 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 9 11 2 0 +BITMAP +FF80 +8880 +8880 +8A80 +0C00 +1A00 +2C00 +1800 +2800 +0800 +3E00 +ENDCHAR +STARTCHAR C036 +ENCODING 8367 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 11 13 2 0 +BITMAP +0180 +0200 +1F80 +2440 +0420 +0820 +0820 +1020 +1020 +1040 +7040 +B180 +CE00 +ENDCHAR +STARTCHAR C069 +ENCODING 8400 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 6 2 0 12 +BITMAP +40 +FC +ENDCHAR +STARTCHAR C069 +ENCODING 8401 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 6 2 0 12 +BITMAP +08 +FC +ENDCHAR +STARTCHAR EM DASH +ENCODING 8402 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 1 13 0 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR EM DASH +ENCODING 8403 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 1 7 0 1 +BITMAP +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR char8404 +ENCODING 8404 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 13 5 0 9 +BITMAP +0780 +1860 +A010 +C008 +E000 +ENDCHAR +STARTCHAR char8404 +ENCODING 8405 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 13 5 0 9 +BITMAP +0F00 +30C0 +4028 +8018 +0038 +ENDCHAR +STARTCHAR C069 +ENCODING 8406 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 6 3 0 11 +BITMAP +40 +FC +40 +ENDCHAR +STARTCHAR C069 +ENCODING 8407 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 6 3 0 11 +BITMAP +08 +FC +08 +ENDCHAR +STARTCHAR C023 +ENCODING 8408 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 5 5 0 4 +BITMAP +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR C023 +ENCODING 8409 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 6 6 0 4 +BITMAP +04 +78 +98 +A8 +88 +70 +ENDCHAR +STARTCHAR C023 +ENCODING 8410 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 6 6 0 3 +BITMAP +70 +88 +A8 +98 +78 +04 +ENDCHAR +STARTCHAR C046 +ENCODING 8411 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 8 2 0 11 +BITMAP +DB +DB +ENDCHAR +STARTCHAR C046 +ENCODING 8412 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 11 2 0 11 +BITMAP +DB60 +DB60 +ENDCHAR +STARTCHAR C040 +ENCODING 8413 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 17 17 0 -3 +BITMAP +07F000 +180C00 +200200 +400100 +400100 +800080 +800080 +800080 +800080 +800080 +800080 +800080 +400100 +400100 +200200 +180C00 +07F000 +ENDCHAR +STARTCHAR C040 +ENCODING 8414 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 17 17 0 -3 +BITMAP +FFFF80 +800080 +800080 +800080 +800080 +800080 +800080 +800080 +800080 +800080 +800080 +800080 +800080 +800080 +800080 +800080 +FFFF80 +ENDCHAR +STARTCHAR C040 +ENCODING 8415 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 17 17 0 -3 +BITMAP +008000 +014000 +022000 +041000 +080800 +100400 +200200 +400100 +800080 +400100 +200200 +100400 +080800 +041000 +022000 +014000 +008000 +ENDCHAR +STARTCHAR char8448 +ENCODING 8448 +SWIDTH 900 0 +DWIDTH 15 0 +BBX 13 11 1 0 +BITMAP +3440 +4840 +8880 +9080 +9500 +6930 +0248 +0280 +0480 +0490 +0060 +ENDCHAR +STARTCHAR char8448 +ENCODING 8449 +SWIDTH 900 0 +DWIDTH 15 0 +BBX 13 11 1 0 +BITMAP +3440 +4840 +8880 +9080 +9500 +6938 +0248 +0220 +0410 +0448 +0070 +ENDCHAR +STARTCHAR C067 +ENCODING 8450 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 10 11 1 0 +BITMAP +1F40 +30C0 +5040 +A040 +A000 +A000 +A000 +A040 +5040 +3080 +1F00 +ENDCHAR +STARTCHAR C067 +ENCODING 8451 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 12 1 0 +BITMAP +7000 +887A +8886 +8902 +7202 +0200 +0200 +0200 +0202 +0102 +0084 +0078 +ENDCHAR +STARTCHAR C076 +ENCODING 8452 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 9 11 1 0 +BITMAP +7C00 +1000 +3C00 +5200 +9000 +9000 +9000 +5200 +3C00 +1080 +7F00 +ENDCHAR +STARTCHAR char8448 +ENCODING 8453 +SWIDTH 900 0 +DWIDTH 15 0 +BBX 13 11 1 0 +BITMAP +3080 +4880 +8100 +8100 +9200 +6230 +0448 +0488 +0888 +0890 +0060 +ENDCHAR +STARTCHAR char8448 +ENCODING 8454 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 15 11 1 0 +BITMAP +3080 +4880 +8100 +8100 +9200 +6264 +0424 +0424 +0848 +084A +0034 +ENDCHAR +STARTCHAR C119 +ENCODING 8455 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 8 11 1 0 +BITMAP +3D +43 +81 +81 +40 +38 +40 +80 +81 +41 +3E +ENDCHAR +STARTCHAR C124 +ENCODING 8456 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 9 11 1 0 +BITMAP +BC00 +C200 +8100 +8080 +0080 +1F80 +0080 +8080 +8100 +4200 +3C00 +ENDCHAR +STARTCHAR C067 +ENCODING 8457 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 12 1 0 +BITMAP +7000 +8BFE +8882 +8882 +708A +0088 +00F8 +0088 +0088 +0080 +0080 +03E0 +ENDCHAR +STARTCHAR C113 +ENCODING 8458 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 6 10 1 -4 +BITMAP +18 +24 +44 +44 +48 +38 +1C +70 +90 +E0 +ENDCHAR +STARTCHAR char8464 +ENCODING 8459 +SWIDTH 840 0 +DWIDTH 14 0 +BBX 12 11 1 0 +BITMAP +0A10 +1610 +0210 +0420 +0420 +1FE0 +2840 +4840 +4840 +9090 +60E0 +ENDCHAR +STARTCHAR char8460 +ENCODING 8460 +SWIDTH 900 0 +DWIDTH 15 0 +BBX 13 12 1 -1 +BITMAP +7038 +D850 +8840 +C840 +4840 +4FC0 +0840 +0840 +1840 +F058 +6070 +0060 +ENDCHAR +STARTCHAR C072 +ENCODING 8461 +SWIDTH 840 0 +DWIDTH 14 0 +BBX 12 11 1 0 +BITMAP +F9F0 +50A0 +50A0 +50A0 +50A0 +5FA0 +50A0 +50A0 +50A0 +50A0 +F9F0 +ENDCHAR +STARTCHAR char104 +ENCODING 8462 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +30 +10 +10 +20 +20 +38 +44 +44 +44 +88 +8A +8C +ENDCHAR +STARTCHAR char104 +ENCODING 8463 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +30 +10 +1C +30 +E0 +38 +44 +44 +44 +88 +8A +8C +ENDCHAR +STARTCHAR char8464 +ENCODING 8464 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +0E +12 +22 +04 +04 +04 +08 +38 +48 +90 +60 +ENDCHAR +STARTCHAR char8465 +ENCODING 8465 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 9 11 1 0 +BITMAP +7F00 +C200 +8600 +C400 +6600 +2200 +0300 +0180 +4080 +E180 +3F00 +ENDCHAR +STARTCHAR C036 +ENCODING 8466 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 10 11 1 0 +BITMAP +0380 +0440 +0480 +3F00 +0800 +0800 +0800 +1000 +5000 +B100 +CE00 +ENDCHAR +STARTCHAR C036 +ENCODING 8467 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 6 11 1 0 +BITMAP +10 +28 +28 +28 +50 +50 +50 +60 +60 +C4 +38 +ENDCHAR +STARTCHAR C108 +ENCODING 8468 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 11 12 1 0 +BITMAP +6600 +2200 +FFE0 +2200 +2200 +23C0 +2220 +2220 +2220 +2220 +2220 +73C0 +ENDCHAR +STARTCHAR C078 +ENCODING 8469 +SWIDTH 900 0 +DWIDTH 15 0 +BBX 13 11 1 0 +BITMAP +F8F8 +2420 +3420 +2A20 +2A20 +2520 +22A0 +22A0 +2160 +2120 +F8E0 +ENDCHAR +STARTCHAR C078 +ENCODING 8470 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 11 1 0 +BITMAP +E3E0 +3080 +3080 +289C +28A2 +24A2 +22A2 +22A2 +219C +2180 +F8BE +ENDCHAR +STARTCHAR C099 +ENCODING 8471 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 9 10 1 3 +BITMAP +3E00 +4100 +BC80 +9280 +9280 +9C80 +9080 +B880 +4100 +3E00 +ENDCHAR +STARTCHAR char8472 +ENCODING 8472 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 9 13 1 -4 +BITMAP +4000 +8700 +8880 +9080 +9080 +A480 +AC80 +4900 +A600 +A000 +9000 +9000 +6000 +ENDCHAR +STARTCHAR C080 +ENCODING 8473 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 10 11 1 0 +BITMAP +FF80 +52C0 +5140 +5140 +5140 +52C0 +5F80 +5000 +5000 +5000 +F800 +ENDCHAR +STARTCHAR C081 +ENCODING 8474 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 11 14 1 -3 +BITMAP +1F00 +3180 +5140 +A0A0 +A0A0 +A0A0 +A0A0 +A0A0 +5540 +3B80 +1F00 +0500 +0520 +03C0 +ENDCHAR +STARTCHAR C036 +ENCODING 8475 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 11 11 1 0 +BITMAP +01C0 +0620 +0A20 +1440 +2480 +4B00 +4A00 +8A00 +9100 +9120 +60C0 +ENDCHAR +STARTCHAR char8460 +ENCODING 8476 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 10 11 1 0 +BITMAP +7380 +DCC0 +8840 +C8C0 +4880 +4B00 +0B00 +0B00 +1900 +F1C0 +6180 +ENDCHAR +STARTCHAR C082 +ENCODING 8477 +SWIDTH 840 0 +DWIDTH 14 0 +BBX 12 11 1 0 +BITMAP +FF00 +5280 +5140 +5140 +5280 +5F00 +5580 +5280 +5280 +5280 +F970 +ENDCHAR +STARTCHAR C082 +ENCODING 8478 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 11 11 1 0 +BITMAP +FE00 +2100 +2080 +2080 +2100 +3E20 +2340 +2180 +2100 +2300 +F4E0 +ENDCHAR +STARTCHAR C082 +ENCODING 8479 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 11 17 1 -3 +BITMAP +1800 +0600 +0200 +FE00 +2500 +2480 +2480 +2900 +3E00 +2B00 +2900 +3100 +3100 +F8E0 +1000 +2000 +2000 +ENDCHAR +STARTCHAR char8480 +ENCODING 8480 +SWIDTH 900 0 +DWIDTH 15 0 +BBX 13 7 1 4 +BITMAP +7618 +9330 +8330 +62D0 +12D0 +9210 +E738 +ENDCHAR +STARTCHAR char8480 +ENCODING 8481 +SWIDTH 1140 0 +DWIDTH 19 0 +BBX 17 7 1 4 +BITMAP +FBEE00 +A92400 +210400 +21C400 +210400 +212480 +73EF80 +ENDCHAR +STARTCHAR char8480 +ENCODING 8482 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 14 7 1 4 +BITMAP +FB0C +A998 +2198 +2168 +2168 +2108 +739C +ENDCHAR +STARTCHAR C086 +ENCODING 8483 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 11 17 1 -2 +BITMAP +1800 +0600 +0200 +0400 +F5E0 +2480 +2480 +1900 +1900 +1900 +0A00 +1A00 +1A00 +1400 +1400 +2000 +2000 +ENDCHAR +STARTCHAR C090 +ENCODING 8484 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +FE +CA +8A +94 +14 +28 +52 +52 +A2 +A6 +FE +ENDCHAR +STARTCHAR C053 +ENCODING 8485 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 6 15 1 -4 +BITMAP +7C +08 +10 +20 +7C +08 +10 +20 +70 +08 +04 +04 +C4 +88 +70 +ENDCHAR +STARTCHAR C087 +ENCODING 8486 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 9 11 1 0 +BITMAP +3E00 +4100 +8080 +8080 +8080 +8080 +4100 +4100 +2200 +A280 +E380 +ENDCHAR +STARTCHAR C087 +ENCODING 8487 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 9 11 1 0 +BITMAP +E380 +A280 +2200 +4100 +4100 +8080 +8080 +8080 +8080 +4100 +3E00 +ENDCHAR +STARTCHAR C119 +ENCODING 8488 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +78 +84 +02 +22 +44 +38 +44 +02 +02 +64 +98 +ENDCHAR +STARTCHAR C105 +ENCODING 8489 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +40 +A0 +20 +20 +20 +30 +20 +ENDCHAR +STARTCHAR C075 +ENCODING 8490 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 11 11 1 0 +BITMAP +F9E0 +2180 +2300 +2600 +2C00 +2E00 +3200 +2100 +2100 +2080 +F9E0 +ENDCHAR +STARTCHAR C065 +ENCODING 8491 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 11 15 1 0 +BITMAP +0600 +0900 +0900 +0600 +0400 +0400 +0A00 +0A00 +0A00 +1100 +1100 +1F00 +2080 +2080 +F1E0 +ENDCHAR +STARTCHAR C036 +ENCODING 8492 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 11 11 1 0 +BITMAP +01C0 +0620 +0A20 +1440 +2480 +4BC0 +4C20 +8820 +9020 +9840 +6780 +ENDCHAR +STARTCHAR C067 +ENCODING 8493 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 10 11 1 0 +BITMAP +1F40 +3180 +6300 +C180 +C080 +C180 +C300 +C000 +6040 +3080 +1F00 +ENDCHAR +STARTCHAR C101 +ENCODING 8494 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 7 9 1 0 +BITMAP +38 +44 +C6 +C6 +FE +C0 +C0 +46 +3C +ENDCHAR +STARTCHAR C101 +ENCODING 8495 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 7 7 1 0 +BITMAP +1C +22 +4C +70 +80 +88 +70 +ENDCHAR +STARTCHAR char8497 +ENCODING 8496 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 9 11 1 0 +BITMAP +0700 +0880 +1080 +1100 +1000 +3C00 +4000 +8F00 +9080 +8100 +7E00 +ENDCHAR +STARTCHAR C036 +ENCODING 8497 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 9 11 1 0 +BITMAP +1880 +2700 +3100 +0200 +7F80 +0400 +0400 +7C00 +8C00 +9200 +6200 +ENDCHAR +STARTCHAR C070 +ENCODING 8498 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 9 11 1 0 +BITMAP +0F80 +0200 +0200 +2200 +2200 +3E00 +2200 +A200 +8200 +8200 +FF80 +ENDCHAR +STARTCHAR char8499 +ENCODING 8499 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 16 11 1 0 +BITMAP +00C6 +00C6 +014A +014A +0294 +0294 +04A4 +64A4 +8948 +8949 +7086 +ENDCHAR +STARTCHAR C111 +ENCODING 8500 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +30 +48 +88 +88 +88 +90 +60 +ENDCHAR +STARTCHAR 00E0 +ENCODING 8501 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 10 11 1 0 +BITMAP +4100 +4100 +6180 +30C0 +1940 +2E40 +4600 +4300 +4180 +6080 +C080 +ENDCHAR +STARTCHAR 00E1 +ENCODING 8502 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 9 11 1 0 +BITMAP +4000 +FC00 +7E00 +0600 +0200 +0200 +0200 +0200 +0200 +7F80 +FF00 +ENDCHAR +STARTCHAR 00E2 +ENCODING 8503 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 6 11 1 0 +BITMAP +40 +F0 +78 +08 +08 +08 +08 +78 +C8 +8C +88 +ENDCHAR +STARTCHAR 00E3 +ENCODING 8504 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 8 11 1 0 +BITMAP +40 +FE +7F +04 +04 +04 +04 +04 +04 +04 +04 +ENDCHAR +STARTCHAR char185 +ENCODING 8531 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 11 12 1 0 +BITMAP +4200 +C200 +4200 +4400 +4400 +44C0 +E920 +0820 +0840 +1020 +1120 +10C0 +ENDCHAR +STARTCHAR char185 +ENCODING 8532 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 12 12 1 0 +BITMAP +6100 +9100 +1100 +1200 +2200 +4260 +F490 +0410 +0420 +0810 +0890 +0860 +ENDCHAR +STARTCHAR char185 +ENCODING 8533 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 11 12 1 0 +BITMAP +4200 +C200 +4200 +4400 +4400 +45E0 +E900 +0940 +09A0 +1020 +1120 +10C0 +ENDCHAR +STARTCHAR char185 +ENCODING 8534 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 12 12 1 0 +BITMAP +6100 +9100 +1100 +1200 +2200 +42F0 +F480 +04A0 +04D0 +0810 +0890 +0860 +ENDCHAR +STARTCHAR char185 +ENCODING 8535 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 12 12 1 0 +BITMAP +6100 +9100 +1100 +2200 +1200 +92F0 +6480 +04A0 +04D0 +0810 +0890 +0860 +ENDCHAR +STARTCHAR char185 +ENCODING 8536 +SWIDTH 840 0 +DWIDTH 14 0 +BBX 13 12 1 0 +BITMAP +1080 +3080 +5080 +9100 +F900 +1178 +3A40 +0250 +0268 +0408 +0448 +0430 +ENDCHAR +STARTCHAR char185 +ENCODING 8537 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 11 12 1 0 +BITMAP +4200 +C200 +4200 +4400 +4400 +44C0 +E920 +0900 +09C0 +1120 +1120 +10C0 +ENDCHAR +STARTCHAR char185 +ENCODING 8538 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 12 12 1 0 +BITMAP +F100 +8100 +A100 +D200 +1200 +9260 +6490 +0480 +04E0 +0890 +0890 +0860 +ENDCHAR +STARTCHAR char185 +ENCODING 8539 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 11 12 1 0 +BITMAP +4200 +C200 +4200 +4400 +4400 +44C0 +E920 +0920 +08C0 +1120 +1120 +10C0 +ENDCHAR +STARTCHAR char185 +ENCODING 8540 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 12 12 1 0 +BITMAP +6100 +9100 +1100 +2200 +1200 +9260 +6490 +0490 +0460 +0890 +0890 +0860 +ENDCHAR +STARTCHAR char185 +ENCODING 8541 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 12 12 1 0 +BITMAP +F100 +8100 +A100 +D200 +1200 +9260 +6490 +0490 +0460 +0890 +0890 +0860 +ENDCHAR +STARTCHAR char185 +ENCODING 8542 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 11 12 1 0 +BITMAP +F200 +9200 +2200 +2400 +4400 +44C0 +4920 +0920 +08C0 +1120 +1120 +10C0 +ENDCHAR +STARTCHAR char185 +ENCODING 8543 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 7 12 1 0 +BITMAP +42 +C2 +42 +44 +44 +44 +E8 +08 +08 +10 +10 +10 +ENDCHAR +STARTCHAR C073 +ENCODING 8544 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 11 1 0 +BITMAP +F8 +20 +20 +20 +20 +20 +20 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR C073 +ENCODING 8545 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 8 11 1 0 +BITMAP +FF +24 +24 +24 +24 +24 +24 +24 +24 +24 +FF +ENDCHAR +STARTCHAR C073 +ENCODING 8546 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 11 11 1 0 +BITMAP +FFE0 +2480 +2480 +2480 +2480 +2480 +2480 +2480 +2480 +2480 +FFE0 +ENDCHAR +STARTCHAR C086 +ENCODING 8547 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 16 11 1 0 +BITMAP +FF8F +2104 +2104 +2088 +2088 +2088 +2050 +2050 +2050 +2020 +F820 +ENDCHAR +STARTCHAR C086 +ENCODING 8548 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 11 11 1 0 +BITMAP +F1E0 +2080 +2080 +1100 +1100 +1100 +0A00 +0A00 +0A00 +0400 +0400 +ENDCHAR +STARTCHAR C086 +ENCODING 8549 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 16 11 1 0 +BITMAP +F1FF +2084 +2084 +1104 +1104 +1104 +0A04 +0A04 +0A04 +0404 +041F +ENDCHAR +STARTCHAR C086 +ENCODING 8550 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 17 11 1 0 +BITMAP +F3FF80 +211200 +211200 +121200 +121200 +121200 +121200 +141200 +081200 +081200 +087F80 +ENDCHAR +STARTCHAR C086 +ENCODING 8551 +SWIDTH 1260 0 +DWIDTH 21 0 +BBX 20 11 1 0 +BITMAP +F3FFF0 +211240 +211240 +121240 +121240 +121240 +121240 +141240 +081240 +081240 +087FF0 +ENDCHAR +STARTCHAR C088 +ENCODING 8552 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 16 11 1 0 +BITMAP +FF9E +2088 +2090 +2050 +2060 +2020 +2050 +20D0 +2088 +2104 +FF8F +ENDCHAR +STARTCHAR C088 +ENCODING 8553 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 11 11 1 0 +BITMAP +F3C0 +1100 +1200 +0A00 +0C00 +0400 +0A00 +1A00 +1100 +2080 +F1E0 +ENDCHAR +STARTCHAR C088 +ENCODING 8554 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 15 11 1 0 +BITMAP +F3FE +1108 +1208 +0A08 +0C08 +0408 +0A08 +1A08 +1108 +2088 +F1FE +ENDCHAR +STARTCHAR C088 +ENCODING 8555 +SWIDTH 1140 0 +DWIDTH 19 0 +BBX 18 11 1 0 +BITMAP +F3FFC0 +110900 +120900 +0A0900 +0C0900 +040900 +0A0900 +1A0900 +110900 +208900 +F1FFC0 +ENDCHAR +STARTCHAR C076 +ENCODING 8556 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 8 11 1 0 +BITMAP +F8 +20 +20 +20 +20 +20 +21 +21 +21 +23 +FF +ENDCHAR +STARTCHAR C067 +ENCODING 8557 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 11 1 0 +BITMAP +1E80 +2180 +4080 +8080 +8000 +8000 +8000 +8080 +4080 +2100 +1E00 +ENDCHAR +STARTCHAR C068 +ENCODING 8558 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 10 11 1 0 +BITMAP +FE00 +2180 +2080 +2040 +2040 +2040 +2040 +2040 +2080 +2180 +FE00 +ENDCHAR +STARTCHAR C077 +ENCODING 8559 +SWIDTH 900 0 +DWIDTH 15 0 +BBX 14 11 1 0 +BITMAP +F03C +3030 +3030 +2850 +2850 +2890 +2490 +2490 +2310 +2310 +FB7C +ENDCHAR +STARTCHAR 0x2170 +ENCODING 8560 +SWIDTH 240 0 +DWIDTH 4 0 +BBX 3 11 1 0 +BITMAP +C0 +C0 +00 +00 +C0 +40 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR 0x2171 +ENCODING 8561 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 7 11 1 0 +BITMAP +CC +CC +00 +00 +CC +44 +44 +44 +44 +44 +EE +ENDCHAR +STARTCHAR 0x2172 +ENCODING 8562 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 11 11 1 0 +BITMAP +CCC0 +CCC0 +0000 +0000 +CCC0 +4440 +4440 +4440 +4440 +4440 +EEE0 +ENDCHAR +STARTCHAR 0x2173 +ENCODING 8563 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 12 11 1 0 +BITMAP +C000 +C000 +0000 +0000 +CE70 +4240 +4240 +4240 +4180 +4180 +E180 +ENDCHAR +STARTCHAR C118 +ENCODING 8564 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 8 7 1 0 +BITMAP +E7 +24 +24 +24 +18 +18 +18 +ENDCHAR +STARTCHAR 0x2175 +ENCODING 8565 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 12 11 1 0 +BITMAP +0060 +0060 +0000 +0000 +E760 +2420 +2420 +2420 +1820 +1820 +1870 +ENDCHAR +STARTCHAR 0x2176 +ENCODING 8566 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 16 11 1 0 +BITMAP +0066 +0066 +0000 +0000 +E766 +2422 +2422 +2422 +1822 +1822 +1877 +ENDCHAR +STARTCHAR 0x2177 +ENCODING 8567 +SWIDTH 1260 0 +DWIDTH 21 0 +BBX 20 11 1 0 +BITMAP +006660 +006660 +000000 +000000 +E76660 +242220 +242220 +242220 +182220 +182220 +187770 +ENDCHAR +STARTCHAR 0x2178 +ENCODING 8568 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 12 11 1 0 +BITMAP +C000 +C000 +0000 +0000 +CE70 +4240 +4180 +4180 +4180 +4240 +EE70 +ENDCHAR +STARTCHAR C120 +ENCODING 8569 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 8 7 1 0 +BITMAP +E7 +24 +18 +18 +18 +24 +E7 +ENDCHAR +STARTCHAR 0x217A +ENCODING 8570 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 12 11 1 0 +BITMAP +0060 +0060 +0000 +0000 +E760 +2420 +1820 +1820 +1820 +2420 +E770 +ENDCHAR +STARTCHAR 0x217B +ENCODING 8571 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 16 11 1 0 +BITMAP +0066 +0066 +0000 +0000 +E766 +2422 +1822 +1822 +1822 +2422 +E777 +ENDCHAR +STARTCHAR C108 +ENCODING 8572 +SWIDTH 240 0 +DWIDTH 4 0 +BBX 3 12 1 0 +BITMAP +C0 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR C099 +ENCODING 8573 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 7 1 0 +BITMAP +70 +88 +80 +80 +80 +88 +70 +ENDCHAR +STARTCHAR C100 +ENCODING 8574 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 6 12 1 0 +BITMAP +18 +08 +08 +08 +08 +78 +88 +88 +88 +88 +88 +7C +ENDCHAR +STARTCHAR C109 +ENCODING 8575 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 11 7 1 0 +BITMAP +FB80 +4440 +4440 +4440 +4440 +4440 +EEE0 +ENDCHAR +STARTCHAR C067 +ENCODING 8576 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 16 11 1 0 +BITMAP +1FF8 +2186 +4082 +8081 +8081 +8081 +8081 +8081 +4082 +2186 +1FF8 +ENDCHAR +STARTCHAR char8577 +ENCODING 8577 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 10 11 1 0 +BITMAP +FE00 +2180 +3880 +2440 +2240 +2240 +2240 +2440 +3880 +2180 +FE00 +ENDCHAR +STARTCHAR C067 +ENCODING 8578 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 16 11 1 0 +BITMAP +1FF8 +2186 +43E2 +8491 +8889 +8889 +8889 +8491 +43E2 +2186 +1FF8 +ENDCHAR +STARTCHAR char8592 +ENCODING 8592 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 11 5 1 4 +BITMAP +2000 +4000 +FFE0 +4000 +2000 +ENDCHAR +STARTCHAR char8592 +ENCODING 8593 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 11 1 1 +BITMAP +20 +70 +A8 +20 +20 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR char8592 +ENCODING 8594 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 11 5 1 4 +BITMAP +0080 +0040 +FFE0 +0040 +0080 +ENDCHAR +STARTCHAR char8592 +ENCODING 8595 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 11 1 1 +BITMAP +20 +20 +20 +20 +20 +20 +20 +20 +A8 +70 +20 +ENDCHAR +STARTCHAR char8592 +ENCODING 8596 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 11 5 1 4 +BITMAP +2080 +4040 +FFE0 +4040 +2080 +ENDCHAR +STARTCHAR char8592 +ENCODING 8597 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 11 1 1 +BITMAP +20 +70 +A8 +20 +20 +20 +20 +20 +A8 +70 +20 +ENDCHAR +STARTCHAR char8598 +ENCODING 8598 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 9 1 1 +BITMAP +F000 +C000 +A000 +9000 +0800 +0400 +0200 +0100 +0080 +ENDCHAR +STARTCHAR char8598 +ENCODING 8599 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 9 1 1 +BITMAP +0780 +0180 +0280 +0480 +0800 +1000 +2000 +4000 +8000 +ENDCHAR +STARTCHAR char8598 +ENCODING 8600 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 9 1 1 +BITMAP +8000 +4000 +2000 +1000 +0800 +0480 +0280 +0180 +0780 +ENDCHAR +STARTCHAR char8598 +ENCODING 8601 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 9 1 1 +BITMAP +0080 +0100 +0200 +0400 +0800 +9000 +A000 +C000 +F000 +ENDCHAR +STARTCHAR char8592 +ENCODING 8602 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 11 5 1 4 +BITMAP +2080 +4100 +FFE0 +4200 +2400 +ENDCHAR +STARTCHAR char8592 +ENCODING 8603 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 11 5 1 4 +BITMAP +0480 +0840 +FFE0 +1040 +2080 +ENDCHAR +STARTCHAR char8592 +ENCODING 8604 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 12 4 1 5 +BITMAP +F000 +C1C0 +A220 +9C10 +ENDCHAR +STARTCHAR char8592 +ENCODING 8605 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 12 4 1 5 +BITMAP +00F0 +3830 +4450 +8390 +ENDCHAR +STARTCHAR char8592 +ENCODING 8606 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 11 5 1 4 +BITMAP +2800 +5000 +FFE0 +5000 +2800 +ENDCHAR +STARTCHAR char8592 +ENCODING 8607 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 11 1 1 +BITMAP +20 +70 +A8 +70 +A8 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR char8592 +ENCODING 8608 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 11 5 1 4 +BITMAP +0280 +0140 +FFE0 +0140 +0280 +ENDCHAR +STARTCHAR char8592 +ENCODING 8609 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 11 1 1 +BITMAP +20 +20 +20 +20 +20 +20 +A8 +70 +A8 +70 +20 +ENDCHAR +STARTCHAR char8592 +ENCODING 8610 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 11 5 1 4 +BITMAP +2060 +4180 +FF00 +4180 +2060 +ENDCHAR +STARTCHAR char8592 +ENCODING 8611 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 11 5 1 4 +BITMAP +C080 +3040 +1FE0 +3040 +C080 +ENDCHAR +STARTCHAR char8592 +ENCODING 8612 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 11 7 1 3 +BITMAP +0020 +2020 +4020 +FFE0 +4020 +2020 +0020 +ENDCHAR +STARTCHAR char8592 +ENCODING 8613 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 7 11 1 1 +BITMAP +10 +38 +54 +10 +10 +10 +10 +10 +10 +10 +FE +ENDCHAR +STARTCHAR char8592 +ENCODING 8614 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 11 7 1 3 +BITMAP +8000 +8080 +8040 +FFE0 +8040 +8080 +8000 +ENDCHAR +STARTCHAR char8592 +ENCODING 8615 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 7 11 1 1 +BITMAP +FE +10 +10 +10 +10 +10 +10 +10 +54 +38 +10 +ENDCHAR +STARTCHAR char8592 +ENCODING 8616 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 7 11 1 1 +BITMAP +10 +38 +54 +10 +10 +10 +10 +10 +54 +38 +FE +ENDCHAR +STARTCHAR char8592 +ENCODING 8617 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 11 7 1 4 +BITMAP +01C0 +0020 +2020 +4020 +FFC0 +4000 +2000 +ENDCHAR +STARTCHAR char8592 +ENCODING 8618 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 11 7 1 4 +BITMAP +7000 +8000 +8080 +8040 +7FE0 +0040 +0080 +ENDCHAR +STARTCHAR char8592 +ENCODING 8619 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 11 7 1 4 +BITMAP +01C0 +0220 +2220 +4220 +FFC0 +4200 +2200 +ENDCHAR +STARTCHAR char8592 +ENCODING 8620 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 11 7 1 4 +BITMAP +7000 +8800 +8880 +8840 +7FE0 +0840 +0880 +ENDCHAR +STARTCHAR char8592 +ENCODING 8621 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 12 5 1 4 +BITMAP +2640 +4920 +E970 +50A0 +2040 +ENDCHAR +STARTCHAR char8592 +ENCODING 8622 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 12 5 1 4 +BITMAP +2140 +4220 +FFF0 +4420 +2840 +ENDCHAR +STARTCHAR char8592 +ENCODING 8623 +SWIDTH 300 0 +DWIDTH 5 0 +BBX 4 11 1 1 +BITMAP +10 +10 +20 +40 +B0 +D0 +20 +A0 +A0 +C0 +F0 +ENDCHAR +STARTCHAR char8592 +ENCODING 8624 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 6 11 1 1 +BITMAP +20 +40 +FC +44 +24 +04 +04 +04 +04 +04 +04 +ENDCHAR +STARTCHAR char8592 +ENCODING 8625 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 6 11 1 1 +BITMAP +10 +08 +FC +88 +90 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR char8592 +ENCODING 8626 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 6 11 1 1 +BITMAP +04 +04 +04 +04 +04 +04 +24 +44 +FC +40 +20 +ENDCHAR +STARTCHAR char8592 +ENCODING 8627 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 6 11 1 1 +BITMAP +80 +80 +80 +80 +80 +80 +90 +88 +FC +08 +10 +ENDCHAR +STARTCHAR char8592 +ENCODING 8628 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 8 6 1 2 +BITMAP +FC +04 +04 +15 +0E +04 +ENDCHAR +STARTCHAR char8592 +ENCODING 8629 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 6 8 1 1 +BITMAP +04 +04 +04 +24 +44 +FC +40 +20 +ENDCHAR +STARTCHAR char8630 +ENCODING 8630 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 11 8 1 1 +BITMAP +0F80 +1040 +2020 +2020 +2020 +A820 +7000 +2000 +ENDCHAR +STARTCHAR char8630 +ENCODING 8631 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 11 8 1 1 +BITMAP +3E00 +4100 +8080 +8080 +8080 +82A0 +01C0 +0080 +ENDCHAR +STARTCHAR char8598 +ENCODING 8632 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 11 1 1 +BITMAP +FF80 +0000 +F000 +C000 +A000 +9000 +0800 +0400 +0200 +0100 +0080 +ENDCHAR +STARTCHAR char8592 +ENCODING 8633 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 12 13 1 0 +BITMAP +8000 +9000 +A000 +FFF0 +A000 +9000 +8010 +0090 +0050 +FFF0 +0050 +0090 +0010 +ENDCHAR +STARTCHAR char8630 +ENCODING 8634 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 10 7 1 2 +BITMAP +03C0 +4300 +8280 +8280 +8080 +4100 +3E00 +ENDCHAR +STARTCHAR char8630 +ENCODING 8635 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 10 7 1 2 +BITMAP +F000 +3080 +5040 +5040 +4040 +2080 +1F00 +ENDCHAR +STARTCHAR char8592 +ENCODING 8636 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 11 3 1 6 +BITMAP +2000 +4000 +FFE0 +ENDCHAR +STARTCHAR char8592 +ENCODING 8637 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 11 3 1 6 +BITMAP +FFE0 +4000 +2000 +ENDCHAR +STARTCHAR char8592 +ENCODING 8638 +SWIDTH 240 0 +DWIDTH 4 0 +BBX 3 11 1 1 +BITMAP +80 +C0 +A0 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR char8592 +ENCODING 8639 +SWIDTH 240 0 +DWIDTH 4 0 +BBX 3 11 1 1 +BITMAP +20 +60 +A0 +20 +20 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR char8592 +ENCODING 8640 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 11 3 1 6 +BITMAP +0080 +0040 +FFE0 +ENDCHAR +STARTCHAR char8592 +ENCODING 8641 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 11 3 1 6 +BITMAP +FFE0 +0040 +0080 +ENDCHAR +STARTCHAR char8592 +ENCODING 8642 +SWIDTH 240 0 +DWIDTH 4 0 +BBX 3 11 1 1 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +A0 +C0 +80 +ENDCHAR +STARTCHAR char8592 +ENCODING 8643 +SWIDTH 240 0 +DWIDTH 4 0 +BBX 3 11 1 1 +BITMAP +20 +20 +20 +20 +20 +20 +20 +20 +A0 +60 +20 +ENDCHAR +STARTCHAR char8592 +ENCODING 8644 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 11 11 1 1 +BITMAP +0080 +0040 +FFE0 +0040 +0080 +0000 +2000 +4000 +FFE0 +4000 +2000 +ENDCHAR +STARTCHAR char8592 +ENCODING 8645 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 11 11 1 1 +BITMAP +2080 +7080 +A880 +2080 +2080 +2080 +2080 +2080 +22A0 +21C0 +2080 +ENDCHAR +STARTCHAR char8592 +ENCODING 8646 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 11 11 1 1 +BITMAP +2000 +4000 +FFE0 +4000 +2000 +0000 +0080 +0040 +FFE0 +0040 +0080 +ENDCHAR +STARTCHAR char8592 +ENCODING 8647 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 11 11 1 1 +BITMAP +2000 +4000 +FFE0 +4000 +2000 +0000 +2000 +4000 +FFE0 +4000 +2000 +ENDCHAR +STARTCHAR char8592 +ENCODING 8648 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 11 11 1 1 +BITMAP +2080 +71C0 +AAA0 +2080 +2080 +2080 +2080 +2080 +2080 +2080 +2080 +ENDCHAR +STARTCHAR char8592 +ENCODING 8649 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 11 11 1 1 +BITMAP +0080 +0040 +FFE0 +0040 +0080 +0000 +0080 +0040 +FFE0 +0040 +0080 +ENDCHAR +STARTCHAR char8592 +ENCODING 8650 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 11 11 1 1 +BITMAP +2080 +2080 +2080 +2080 +2080 +2080 +2080 +2080 +AAA0 +71C0 +2080 +ENDCHAR +STARTCHAR char8592 +ENCODING 8651 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 11 8 1 3 +BITMAP +2000 +4000 +FFE0 +0000 +0000 +FFE0 +0040 +0080 +ENDCHAR +STARTCHAR char8592 +ENCODING 8652 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 11 8 1 3 +BITMAP +0080 +0040 +FFE0 +0000 +0000 +FFE0 +4000 +2000 +ENDCHAR +STARTCHAR char8592 +ENCODING 8653 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 11 7 1 3 +BITMAP +1080 +2080 +7FE0 +8100 +7FE0 +2200 +1200 +ENDCHAR +STARTCHAR char8592 +ENCODING 8654 +SWIDTH 840 0 +DWIDTH 14 0 +BBX 13 7 1 3 +BITMAP +1140 +2120 +7FF0 +8208 +7FF0 +2420 +1440 +ENDCHAR +STARTCHAR char8592 +ENCODING 8655 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 11 7 1 3 +BITMAP +0900 +0880 +FFC0 +1020 +FFC0 +2080 +2100 +ENDCHAR +STARTCHAR char8592 +ENCODING 8656 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 11 7 1 3 +BITMAP +1000 +2000 +7FE0 +8000 +7FE0 +2000 +1000 +ENDCHAR +STARTCHAR char8592 +ENCODING 8657 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 7 11 1 1 +BITMAP +10 +28 +6C +AA +28 +28 +28 +28 +28 +28 +28 +ENDCHAR +STARTCHAR char8592 +ENCODING 8658 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 11 7 1 3 +BITMAP +0100 +0080 +FFC0 +0020 +FFC0 +0080 +0100 +ENDCHAR +STARTCHAR char8592 +ENCODING 8659 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 7 11 1 1 +BITMAP +28 +28 +28 +28 +28 +28 +28 +AA +6C +28 +10 +ENDCHAR +STARTCHAR char8592 +ENCODING 8660 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 12 7 1 3 +BITMAP +1080 +2040 +7FE0 +8010 +7FE0 +2040 +1080 +ENDCHAR +STARTCHAR char8592 +ENCODING 8661 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 7 12 1 0 +BITMAP +10 +28 +6C +AA +28 +28 +28 +28 +AA +6C +28 +10 +ENDCHAR +STARTCHAR char8598 +ENCODING 8662 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 10 10 1 1 +BITMAP +F800 +9000 +8800 +C400 +A200 +1100 +0880 +0440 +0200 +0100 +ENDCHAR +STARTCHAR char8598 +ENCODING 8663 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 10 10 1 1 +BITMAP +07C0 +0240 +0440 +08C0 +1140 +2200 +4400 +8800 +1000 +2000 +ENDCHAR +STARTCHAR char8598 +ENCODING 8664 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 10 10 1 1 +BITMAP +2000 +1000 +8800 +4400 +2200 +1140 +08C0 +0440 +0240 +07C0 +ENDCHAR +STARTCHAR char8598 +ENCODING 8665 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 10 10 1 1 +BITMAP +0100 +0200 +0440 +0880 +1100 +A200 +C400 +8800 +9000 +F800 +ENDCHAR +STARTCHAR char8592 +ENCODING 8666 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 11 7 1 3 +BITMAP +1000 +3FE0 +4000 +FFE0 +4000 +3FE0 +1000 +ENDCHAR +STARTCHAR char8592 +ENCODING 8667 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 11 7 1 3 +BITMAP +0100 +FF80 +0040 +FFE0 +0040 +FF80 +0100 +ENDCHAR +STARTCHAR char8592 +ENCODING 8668 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 12 5 1 4 +BITMAP +2000 +4880 +F550 +4220 +2000 +ENDCHAR +STARTCHAR char8592 +ENCODING 8669 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 12 5 1 4 +BITMAP +0040 +1120 +AAF0 +4420 +0040 +ENDCHAR +STARTCHAR char8592 +ENCODING 8670 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 11 1 1 +BITMAP +20 +70 +A8 +20 +20 +F8 +20 +F8 +20 +20 +20 +ENDCHAR +STARTCHAR char8592 +ENCODING 8671 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 11 1 1 +BITMAP +20 +20 +20 +F8 +20 +F8 +20 +20 +A8 +70 +20 +ENDCHAR +STARTCHAR char8592 +ENCODING 8672 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 11 5 1 4 +BITMAP +2000 +4000 +EEE0 +4000 +2000 +ENDCHAR +STARTCHAR char8592 +ENCODING 8673 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 11 1 1 +BITMAP +20 +70 +A8 +00 +20 +20 +20 +00 +20 +20 +20 +ENDCHAR +STARTCHAR char8592 +ENCODING 8674 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 11 5 1 4 +BITMAP +0080 +0040 +EEE0 +0040 +0080 +ENDCHAR +STARTCHAR char8592 +ENCODING 8675 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 11 1 1 +BITMAP +20 +20 +20 +00 +20 +20 +20 +00 +A8 +70 +20 +ENDCHAR +STARTCHAR char8592 +ENCODING 8676 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 12 7 1 3 +BITMAP +8000 +9000 +A000 +FFF0 +A000 +9000 +8000 +ENDCHAR +STARTCHAR char8592 +ENCODING 8677 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 12 7 1 3 +BITMAP +0010 +0090 +0050 +FFF0 +0050 +0090 +0010 +ENDCHAR +STARTCHAR char8592 +ENCODING 8678 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 12 9 1 2 +BITMAP +0800 +1800 +2FF0 +4010 +8010 +4010 +2FF0 +1800 +0800 +ENDCHAR +STARTCHAR char8592 +ENCODING 8679 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 12 1 1 +BITMAP +0800 +1400 +2200 +4100 +E380 +2200 +2200 +2200 +2200 +2200 +2200 +3E00 +ENDCHAR +STARTCHAR char8592 +ENCODING 8680 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 12 9 1 2 +BITMAP +0100 +0180 +FF40 +8020 +8010 +8020 +FF40 +0180 +0100 +ENDCHAR +STARTCHAR char8592 +ENCODING 8681 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 12 1 1 +BITMAP +3E00 +2200 +2200 +2200 +2200 +2200 +2200 +E380 +4100 +2200 +1400 +0800 +ENDCHAR +STARTCHAR char8592 +ENCODING 8682 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 17 1 0 +BITMAP +0800 +1400 +2200 +4100 +E380 +2200 +2200 +2200 +2200 +2200 +2200 +3E00 +0000 +3E00 +2200 +2200 +3E00 +ENDCHAR +STARTCHAR C068 +ENCODING 8704 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 11 11 1 0 +BITMAP +8020 +8020 +4040 +4040 +3F80 +2080 +1100 +1100 +0A00 +0A00 +0400 +ENDCHAR +STARTCHAR C067 +ENCODING 8705 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 6 11 1 0 +BITMAP +78 +84 +84 +80 +80 +80 +80 +80 +84 +84 +78 +ENDCHAR +STARTCHAR C100 +ENCODING 8706 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 11 1 0 +BITMAP +60 +10 +10 +08 +38 +48 +88 +88 +88 +90 +60 +ENDCHAR +STARTCHAR C069 +ENCODING 8707 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 8 11 1 0 +BITMAP +FF +01 +01 +01 +01 +FF +01 +01 +01 +01 +FF +ENDCHAR +STARTCHAR C069 +ENCODING 8708 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 8 15 1 -2 +BITMAP +02 +02 +FF +05 +05 +05 +09 +FF +09 +09 +11 +11 +FF +20 +20 +ENDCHAR +STARTCHAR C079 +ENCODING 8709 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 11 11 1 0 +BITMAP +1F20 +20C0 +40C0 +8120 +8220 +8420 +8820 +9020 +6040 +6080 +9F00 +ENDCHAR +STARTCHAR C068 +ENCODING 8710 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 11 11 1 0 +BITMAP +0400 +0E00 +0E00 +1300 +1300 +2180 +2180 +40C0 +40C0 +8060 +FFE0 +ENDCHAR +STARTCHAR C068 +ENCODING 8711 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 11 11 1 0 +BITMAP +FFE0 +8060 +40C0 +40C0 +2180 +2180 +1300 +1300 +0E00 +0E00 +0400 +ENDCHAR +STARTCHAR C069 +ENCODING 8712 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 8 11 1 0 +BITMAP +1F +20 +40 +80 +80 +FF +80 +80 +40 +20 +1F +ENDCHAR +STARTCHAR C069 +ENCODING 8713 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 8 15 1 -2 +BITMAP +02 +02 +1F +24 +44 +84 +88 +FF +88 +88 +50 +30 +1F +20 +20 +ENDCHAR +STARTCHAR C069 +ENCODING 8714 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 7 7 1 2 +BITMAP +3E +40 +80 +FE +80 +40 +3E +ENDCHAR +STARTCHAR C069 +ENCODING 8715 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 8 11 1 0 +BITMAP +F8 +04 +02 +01 +01 +FF +01 +01 +02 +04 +F8 +ENDCHAR +STARTCHAR C069 +ENCODING 8716 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 8 15 1 -2 +BITMAP +40 +40 +F8 +24 +22 +21 +11 +FF +11 +11 +0A +0C +F8 +04 +04 +ENDCHAR +STARTCHAR C069 +ENCODING 8717 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 7 7 1 2 +BITMAP +F8 +04 +02 +FE +02 +04 +F8 +ENDCHAR +STARTCHAR char9632 +ENCODING 8718 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 9 1 1 +BITMAP +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +ENDCHAR +STARTCHAR C080 +ENCODING 8719 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 11 11 0 0 +BITMAP +FFE0 +2080 +2080 +2080 +2080 +2080 +2080 +2080 +2080 +2080 +FBE0 +ENDCHAR +STARTCHAR C080 +ENCODING 8720 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 11 11 0 0 +BITMAP +FBE0 +2080 +2080 +2080 +2080 +2080 +2080 +2080 +2080 +2080 +FFE0 +ENDCHAR +STARTCHAR C083 +ENCODING 8721 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 11 1 0 +BITMAP +FF80 +4180 +2080 +2080 +1000 +1800 +1000 +2080 +2080 +4180 +FF80 +ENDCHAR +STARTCHAR C043 +ENCODING 8722 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 7 1 1 5 +BITMAP +FE +ENDCHAR +STARTCHAR char177 +ENCODING 8723 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 7 9 1 1 +BITMAP +FE +00 +10 +10 +10 +FE +10 +10 +10 +ENDCHAR +STARTCHAR char177 +ENCODING 8724 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 7 11 1 1 +BITMAP +10 +38 +10 +00 +10 +10 +10 +FE +10 +10 +10 +ENDCHAR +STARTCHAR C047 +ENCODING 8725 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 8 16 1 -4 +BITMAP +01 +01 +02 +02 +04 +04 +08 +08 +10 +10 +20 +20 +40 +40 +80 +80 +ENDCHAR +STARTCHAR C047 +ENCODING 8726 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 6 12 1 0 +BITMAP +80 +80 +40 +40 +20 +20 +10 +10 +08 +08 +04 +04 +ENDCHAR +STARTCHAR C042 +ENCODING 8727 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 7 7 1 2 +BITMAP +10 +92 +54 +38 +54 +92 +10 +ENDCHAR +STARTCHAR C023 +ENCODING 8728 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 4 4 1 4 +BITMAP +60 +90 +90 +60 +ENDCHAR +STARTCHAR C023 +ENCODING 8729 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 4 4 1 4 +BITMAP +60 +F0 +F0 +60 +ENDCHAR +STARTCHAR C068 +ENCODING 8730 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 11 11 1 0 +BITMAP +0020 +0020 +0040 +0040 +F080 +3080 +1900 +1900 +0E00 +0E00 +0400 +ENDCHAR +STARTCHAR C068 +ENCODING 8731 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 11 14 1 0 +BITMAP +0600 +0900 +0100 +0220 +0120 +0940 +0640 +F080 +3080 +1900 +1900 +0E00 +0E00 +0400 +ENDCHAR +STARTCHAR C068 +ENCODING 8732 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 11 14 1 0 +BITMAP +0200 +0600 +0A00 +1220 +1F20 +0240 +0740 +F080 +3080 +1900 +1900 +0E00 +0E00 +0400 +ENDCHAR +STARTCHAR char8733 +ENCODING 8733 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 9 5 1 3 +BITMAP +7180 +8A00 +8400 +8A00 +7180 +ENDCHAR +STARTCHAR char8733 +ENCODING 8734 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 11 5 1 3 +BITMAP +71C0 +8A20 +8420 +8A20 +71C0 +ENDCHAR +STARTCHAR char8735 +ENCODING 8735 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 7 7 1 2 +BITMAP +80 +80 +80 +80 +80 +80 +FE +ENDCHAR +STARTCHAR char8735 +ENCODING 8736 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 7 7 1 2 +BITMAP +04 +08 +10 +20 +40 +80 +FE +ENDCHAR +STARTCHAR char8735 +ENCODING 8737 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 8 9 1 0 +BITMAP +04 +68 +10 +28 +44 +84 +FF +04 +04 +ENDCHAR +STARTCHAR char8735 +ENCODING 8738 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 7 9 1 1 +BITMAP +20 +16 +18 +68 +88 +68 +18 +16 +20 +ENDCHAR +STARTCHAR char123 +ENCODING 8739 +SWIDTH 180 0 +DWIDTH 3 0 +BBX 1 12 1 0 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR char123 +ENCODING 8740 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 5 12 1 0 +BITMAP +20 +20 +20 +28 +30 +20 +60 +A0 +20 +20 +20 +20 +ENDCHAR +STARTCHAR char123 +ENCODING 8741 +SWIDTH 300 0 +DWIDTH 5 0 +BBX 3 12 1 0 +BITMAP +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR char123 +ENCODING 8742 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +28 +28 +2A +2C +28 +38 +28 +68 +A8 +28 +28 +28 +ENDCHAR +STARTCHAR C068 +ENCODING 8743 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 11 11 1 0 +BITMAP +0400 +0A00 +0A00 +1100 +1100 +2080 +2080 +4040 +4040 +8020 +8020 +ENDCHAR +STARTCHAR C068 +ENCODING 8744 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 11 11 1 0 +BITMAP +8020 +8020 +4040 +4040 +2080 +2080 +1100 +1100 +0A00 +0A00 +0400 +ENDCHAR +STARTCHAR C060 +ENCODING 8745 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 8 11 1 0 +BITMAP +3C +42 +81 +81 +81 +81 +81 +81 +81 +81 +81 +ENDCHAR +STARTCHAR C060 +ENCODING 8746 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 8 11 1 0 +BITMAP +81 +81 +81 +81 +81 +81 +81 +81 +81 +42 +3C +ENDCHAR +STARTCHAR char8747 +ENCODING 8747 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 7 19 1 -4 +BITMAP +0E +12 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +90 +E0 +ENDCHAR +STARTCHAR char8747 +ENCODING 8748 +SWIDTH 840 0 +DWIDTH 14 0 +BBX 12 19 1 -4 +BITMAP +0E70 +1290 +1080 +1080 +1080 +1080 +1080 +1080 +1080 +1080 +1080 +1080 +1080 +1080 +1080 +1080 +1080 +9480 +E700 +ENDCHAR +STARTCHAR char8747 +ENCODING 8749 +SWIDTH 1140 0 +DWIDTH 19 0 +BBX 17 19 1 -4 +BITMAP +0E7380 +129480 +108400 +108400 +108400 +108400 +108400 +108400 +108400 +108400 +108400 +108400 +108400 +108400 +108400 +108400 +108400 +94A400 +E73800 +ENDCHAR +STARTCHAR char8747 +ENCODING 8750 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 7 19 1 -4 +BITMAP +0E +12 +10 +10 +10 +10 +38 +54 +92 +92 +92 +54 +38 +10 +10 +10 +10 +90 +E0 +ENDCHAR +STARTCHAR char8747 +ENCODING 8751 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 12 19 1 -4 +BITMAP +0E70 +1290 +1080 +1080 +1080 +1080 +3FC0 +50A0 +9090 +9090 +9090 +50A0 +3FC0 +1080 +1080 +1080 +1080 +9480 +E700 +ENDCHAR +STARTCHAR char8747 +ENCODING 8752 +SWIDTH 1140 0 +DWIDTH 19 0 +BBX 17 19 1 -4 +BITMAP +0E7380 +129480 +108400 +108400 +108400 +108400 +3FFE00 +508500 +908480 +908480 +908480 +508500 +3FFE00 +108400 +108400 +108400 +108400 +94A400 +E73800 +ENDCHAR +STARTCHAR char8747 +ENCODING 8753 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 8 19 1 -4 +BITMAP +0E +12 +10 +10 +10 +10 +10 +7D +93 +17 +10 +10 +10 +10 +10 +10 +10 +90 +E0 +ENDCHAR +STARTCHAR char8747 +ENCODING 8754 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 9 19 1 -4 +BITMAP +0700 +0900 +0800 +0800 +0800 +0800 +3E80 +4980 +8B80 +8880 +8880 +4900 +3E00 +0800 +0800 +0800 +0800 +4800 +7000 +ENDCHAR +STARTCHAR char8747 +ENCODING 8755 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 19 1 -4 +BITMAP +0700 +0900 +0800 +0800 +0800 +0800 +3F80 +4B00 +8A80 +8880 +8880 +4900 +3E00 +0800 +0800 +0800 +0800 +4800 +7000 +ENDCHAR +STARTCHAR char8756 +ENCODING 8756 +SWIDTH 900 0 +DWIDTH 15 0 +BBX 13 11 1 0 +BITMAP +0200 +0700 +0200 +0000 +0000 +0000 +0000 +0000 +4010 +E038 +4010 +ENDCHAR +STARTCHAR char8756 +ENCODING 8757 +SWIDTH 900 0 +DWIDTH 15 0 +BBX 13 11 1 0 +BITMAP +4010 +E038 +4010 +0000 +0000 +0000 +0000 +0000 +0200 +0700 +0200 +ENDCHAR +STARTCHAR char8756 +ENCODING 8758 +SWIDTH 300 0 +DWIDTH 5 0 +BBX 3 11 1 0 +BITMAP +40 +E0 +40 +00 +00 +00 +00 +00 +40 +E0 +40 +ENDCHAR +STARTCHAR char8756 +ENCODING 8759 +SWIDTH 900 0 +DWIDTH 15 0 +BBX 13 11 1 0 +BITMAP +4010 +E038 +4010 +0000 +0000 +0000 +0000 +0000 +4010 +E038 +4010 +ENDCHAR +STARTCHAR C043 +ENCODING 8760 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 9 5 1 5 +BITMAP +0800 +1C00 +0800 +0000 +FF80 +ENDCHAR +STARTCHAR C043 +ENCODING 8761 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 10 9 1 1 +BITMAP +0080 +01C0 +0080 +0000 +FE00 +0000 +0080 +01C0 +0080 +ENDCHAR +STARTCHAR C043 +ENCODING 8762 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 10 9 1 1 +BITMAP +4080 +E1C0 +4080 +0000 +FFC0 +0000 +4080 +E1C0 +4080 +ENDCHAR +STARTCHAR C043 +ENCODING 8763 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 10 10 1 1 +BITMAP +0400 +0E00 +0400 +0000 +7840 +8780 +0000 +0400 +0E00 +0400 +ENDCHAR +STARTCHAR C043 +ENCODING 8764 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 10 2 1 6 +BITMAP +7840 +8780 +ENDCHAR +STARTCHAR C043 +ENCODING 8765 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 10 2 1 6 +BITMAP +8780 +7840 +ENDCHAR +STARTCHAR C043 +ENCODING 8766 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 10 4 1 4 +BITMAP +7080 +8840 +8440 +4380 +ENDCHAR +STARTCHAR C043 +ENCODING 8767 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 10 8 1 2 +BITMAP +7000 +8800 +8800 +8800 +0440 +0440 +0440 +0380 +ENDCHAR +STARTCHAR C043 +ENCODING 8768 +SWIDTH 240 0 +DWIDTH 4 0 +BBX 2 10 1 2 +BITMAP +80 +40 +40 +40 +40 +80 +80 +80 +80 +40 +ENDCHAR +STARTCHAR C043 +ENCODING 8769 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 10 6 1 4 +BITMAP +0200 +0200 +7C40 +8780 +0800 +0800 +ENDCHAR +STARTCHAR C043 +ENCODING 8770 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 10 4 1 4 +BITMAP +FFC0 +0000 +7840 +8780 +ENDCHAR +STARTCHAR C043 +ENCODING 8771 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 10 4 1 4 +BITMAP +7840 +8780 +0000 +FFC0 +ENDCHAR +STARTCHAR C043 +ENCODING 8772 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 10 8 1 2 +BITMAP +0200 +0200 +7C40 +8780 +0800 +FFC0 +1000 +1000 +ENDCHAR +STARTCHAR C043 +ENCODING 8773 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 10 6 1 3 +BITMAP +7840 +8780 +0000 +FFC0 +0000 +FFC0 +ENDCHAR +STARTCHAR C043 +ENCODING 8774 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 10 8 1 1 +BITMAP +7840 +8780 +0400 +FFC0 +0800 +FFC0 +1000 +1000 +ENDCHAR +STARTCHAR C043 +ENCODING 8775 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 10 9 1 1 +BITMAP +0200 +7A40 +8780 +0400 +FFC0 +0800 +FFC0 +1000 +1000 +ENDCHAR +STARTCHAR C043 +ENCODING 8776 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 10 5 1 3 +BITMAP +7840 +8780 +0000 +7840 +8780 +ENDCHAR +STARTCHAR C043 +ENCODING 8777 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 10 8 1 1 +BITMAP +0200 +7A40 +8780 +0400 +7C40 +8F80 +0800 +0800 +ENDCHAR +STARTCHAR C043 +ENCODING 8778 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 10 7 1 3 +BITMAP +7840 +8780 +0000 +7840 +8780 +0000 +FFC0 +ENDCHAR +STARTCHAR C043 +ENCODING 8779 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 10 8 1 2 +BITMAP +7840 +8780 +0000 +7840 +8780 +0000 +7840 +8780 +ENDCHAR +STARTCHAR C043 +ENCODING 8780 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 10 8 1 2 +BITMAP +7080 +8840 +8440 +4380 +0000 +FFC0 +0000 +FFC0 +ENDCHAR +STARTCHAR C043 +ENCODING 8781 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 10 5 1 3 +BITMAP +C0C0 +3F00 +0000 +3F00 +C0C0 +ENDCHAR +STARTCHAR C043 +ENCODING 8782 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 10 7 1 2 +BITMAP +0C00 +1200 +F3C0 +0000 +F3C0 +1200 +0C00 +ENDCHAR +STARTCHAR C043 +ENCODING 8783 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 10 5 1 4 +BITMAP +0C00 +1200 +F3C0 +0000 +FFC0 +ENDCHAR +STARTCHAR C043 +ENCODING 8784 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 9 8 1 4 +BITMAP +0800 +1C00 +0800 +0000 +FF80 +0000 +0000 +FF80 +ENDCHAR +STARTCHAR C043 +ENCODING 8785 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 9 12 1 0 +BITMAP +0800 +1C00 +0800 +0000 +FF80 +0000 +0000 +FF80 +0000 +0800 +1C00 +0800 +ENDCHAR +STARTCHAR C043 +ENCODING 8786 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 9 12 1 0 +BITMAP +4000 +E000 +4000 +0000 +FF80 +0000 +0000 +FF80 +0000 +0100 +0380 +0100 +ENDCHAR +STARTCHAR C043 +ENCODING 8787 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 9 12 1 0 +BITMAP +0100 +0380 +0100 +0000 +FF80 +0000 +0000 +FF80 +0000 +4000 +E000 +4000 +ENDCHAR +STARTCHAR C043 +ENCODING 8788 +SWIDTH 900 0 +DWIDTH 15 0 +BBX 13 7 1 2 +BITMAP +4000 +EFF8 +4000 +0000 +4000 +EFF8 +4000 +ENDCHAR +STARTCHAR C043 +ENCODING 8789 +SWIDTH 900 0 +DWIDTH 15 0 +BBX 13 7 1 2 +BITMAP +0010 +FFB8 +0010 +0000 +0010 +FFB8 +0010 +ENDCHAR +STARTCHAR C043 +ENCODING 8790 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 9 4 1 4 +BITMAP +FF80 +1400 +1400 +FF80 +ENDCHAR +STARTCHAR C043 +ENCODING 8791 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 10 9 1 4 +BITMAP +0C00 +1200 +1200 +0C00 +0000 +FFC0 +0000 +0000 +FFC0 +ENDCHAR +STARTCHAR C043 +ENCODING 8792 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 10 7 1 4 +BITMAP +1E00 +2100 +0000 +FFC0 +0000 +0000 +FFC0 +ENDCHAR +STARTCHAR C043 +ENCODING 8793 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 9 9 1 4 +BITMAP +0800 +1400 +2200 +4100 +0000 +FF80 +0000 +0000 +FF80 +ENDCHAR +STARTCHAR C043 +ENCODING 8794 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 9 9 1 4 +BITMAP +4100 +2200 +1400 +0800 +0000 +FF80 +0000 +0000 +FF80 +ENDCHAR +STARTCHAR C043 +ENCODING 8795 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 9 10 1 4 +BITMAP +0800 +0800 +3E00 +1C00 +3600 +0000 +FF80 +0000 +0000 +FF80 +ENDCHAR +STARTCHAR C043 +ENCODING 8796 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 9 10 1 4 +BITMAP +0800 +1400 +2200 +4100 +7F00 +0000 +FF80 +0000 +0000 +FF80 +ENDCHAR +STARTCHAR C043 +ENCODING 8797 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 11 12 1 4 +BITMAP +1040 +10A0 +1480 +7BC0 +9E80 +9880 +7680 +0000 +FFE0 +0000 +0000 +FFE0 +ENDCHAR +STARTCHAR C043 +ENCODING 8798 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 9 10 1 4 +BITMAP +F600 +4900 +4900 +4900 +4900 +0000 +FF80 +0000 +0000 +FF80 +ENDCHAR +STARTCHAR C043 +ENCODING 8799 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 9 12 1 4 +BITMAP +1800 +2400 +0C00 +1000 +1000 +0000 +1000 +0000 +FF80 +0000 +0000 +FF80 +ENDCHAR +STARTCHAR C043 +ENCODING 8800 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 9 8 1 2 +BITMAP +0400 +0400 +FF80 +0800 +0800 +FF80 +1000 +1000 +ENDCHAR +STARTCHAR C043 +ENCODING 8801 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 9 5 1 3 +BITMAP +FF80 +0000 +FF80 +0000 +FF80 +ENDCHAR +STARTCHAR C043 +ENCODING 8802 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 9 9 1 1 +BITMAP +0400 +0400 +FF80 +0800 +FF80 +1000 +FF80 +2000 +2000 +ENDCHAR +STARTCHAR C043 +ENCODING 8803 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 9 7 1 3 +BITMAP +FF80 +0000 +FF80 +0000 +FF80 +0000 +FF80 +ENDCHAR +STARTCHAR char8804 +ENCODING 8804 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 7 9 1 2 +BITMAP +06 +18 +60 +80 +60 +18 +06 +00 +FE +ENDCHAR +STARTCHAR char8804 +ENCODING 8805 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 7 9 1 2 +BITMAP +C0 +30 +0C +02 +0C +30 +C0 +00 +FE +ENDCHAR +STARTCHAR char8804 +ENCODING 8806 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 7 9 1 2 +BITMAP +0E +70 +80 +70 +0E +00 +FE +00 +FE +ENDCHAR +STARTCHAR char8804 +ENCODING 8807 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 7 9 1 2 +BITMAP +E0 +1C +02 +1C +E0 +00 +FE +00 +FE +ENDCHAR +STARTCHAR char8804 +ENCODING 8808 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 7 10 1 1 +BITMAP +0E +70 +80 +70 +0E +10 +FE +20 +FE +40 +ENDCHAR +STARTCHAR char8804 +ENCODING 8809 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 7 10 1 1 +BITMAP +E0 +1C +02 +1C +E0 +08 +FE +10 +FE +20 +ENDCHAR +STARTCHAR char8804 +ENCODING 8810 +SWIDTH 840 0 +DWIDTH 14 0 +BBX 12 7 1 3 +BITMAP +0630 +18C0 +6300 +8400 +6300 +18C0 +0630 +ENDCHAR +STARTCHAR char8804 +ENCODING 8811 +SWIDTH 840 0 +DWIDTH 14 0 +BBX 12 7 1 3 +BITMAP +C600 +3180 +0C60 +0210 +0C60 +3180 +C600 +ENDCHAR +STARTCHAR char8812 +ENCODING 8812 +SWIDTH 300 0 +DWIDTH 5 0 +BBX 3 11 1 1 +BITMAP +A0 +40 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +40 +A0 +ENDCHAR +STARTCHAR C043 +ENCODING 8813 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 10 7 1 2 +BITMAP +0200 +C2C0 +3F00 +0400 +3F00 +C8C0 +0800 +ENDCHAR +STARTCHAR char8804 +ENCODING 8814 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 7 10 1 2 +BITMAP +08 +08 +0E +18 +70 +90 +60 +38 +26 +20 +ENDCHAR +STARTCHAR char8804 +ENCODING 8815 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 7 9 1 2 +BITMAP +08 +C8 +38 +14 +12 +1C +30 +E0 +20 +ENDCHAR +STARTCHAR char8804 +ENCODING 8816 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 7 11 1 1 +BITMAP +08 +08 +0E +18 +70 +90 +60 +B8 +66 +78 +46 +ENDCHAR +STARTCHAR char8804 +ENCODING 8817 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +08 +C8 +38 +14 +12 +1C +32 +EC +30 +E0 +20 +ENDCHAR +STARTCHAR char8804 +ENCODING 8818 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 8 10 1 1 +BITMAP +06 +18 +60 +80 +60 +18 +06 +00 +71 +8E +ENDCHAR +STARTCHAR char8804 +ENCODING 8819 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 8 10 1 1 +BITMAP +60 +18 +06 +01 +06 +18 +60 +00 +71 +8E +ENDCHAR +STARTCHAR char8804 +ENCODING 8820 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 8 13 1 0 +BITMAP +04 +04 +06 +18 +68 +88 +70 +38 +16 +20 +71 +AE +20 +ENDCHAR +STARTCHAR char8804 +ENCODING 8821 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 8 13 1 0 +BITMAP +02 +02 +62 +1C +06 +05 +0E +18 +68 +10 +71 +9E +20 +ENDCHAR +STARTCHAR char8804 +ENCODING 8822 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 7 10 1 1 +BITMAP +0E +70 +80 +70 +0E +E0 +1C +02 +1C +E0 +ENDCHAR +STARTCHAR char8804 +ENCODING 8823 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 7 10 1 1 +BITMAP +E0 +1C +02 +1C +E0 +0E +70 +80 +70 +0E +ENDCHAR +STARTCHAR char8804 +ENCODING 8824 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 7 14 1 -1 +BITMAP +10 +10 +1E +70 +90 +70 +1E +F0 +1C +12 +1C +F0 +10 +10 +ENDCHAR +STARTCHAR char8804 +ENCODING 8825 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 7 14 1 -1 +BITMAP +10 +10 +F0 +1C +12 +1C +F0 +1E +70 +90 +70 +1E +10 +10 +ENDCHAR +STARTCHAR char8804 +ENCODING 8826 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 9 1 2 +BITMAP +0080 +0100 +0600 +3800 +C000 +3800 +0600 +0100 +0080 +ENDCHAR +STARTCHAR char8804 +ENCODING 8827 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 9 1 2 +BITMAP +8000 +4000 +3000 +0E00 +0180 +0E00 +3000 +4000 +8000 +ENDCHAR +STARTCHAR char8804 +ENCODING 8828 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 11 1 0 +BITMAP +0080 +0100 +0600 +3800 +C000 +3800 +C600 +3900 +0480 +0200 +0100 +ENDCHAR +STARTCHAR char8804 +ENCODING 8829 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 11 1 0 +BITMAP +8000 +4000 +3000 +0E00 +0180 +0E00 +3180 +4E00 +9000 +2000 +4000 +ENDCHAR +STARTCHAR char8804 +ENCODING 8830 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 10 12 1 1 +BITMAP +0040 +0080 +0300 +1C00 +6000 +1C00 +0300 +0080 +0040 +0000 +7840 +8780 +ENDCHAR +STARTCHAR char8804 +ENCODING 8831 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 10 12 1 1 +BITMAP +8000 +4000 +3000 +0E00 +0180 +0E00 +3000 +4000 +8000 +0000 +7840 +8780 +ENDCHAR +STARTCHAR char8804 +ENCODING 8832 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 10 1 2 +BITMAP +0400 +0480 +0500 +0E00 +3800 +C800 +3800 +1600 +1100 +1080 +ENDCHAR +STARTCHAR char8804 +ENCODING 8833 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 10 1 1 +BITMAP +8200 +4200 +3400 +0E00 +0980 +0E00 +3000 +5000 +A000 +2000 +ENDCHAR +STARTCHAR C060 +ENCODING 8834 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 8 9 1 2 +BITMAP +3F +40 +80 +80 +80 +80 +80 +40 +3F +ENDCHAR +STARTCHAR C060 +ENCODING 8835 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 8 9 1 2 +BITMAP +FC +02 +01 +01 +01 +01 +01 +02 +FC +ENDCHAR +STARTCHAR C060 +ENCODING 8836 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 8 13 1 0 +BITMAP +02 +02 +3F +44 +84 +88 +88 +90 +90 +60 +3F +40 +40 +ENDCHAR +STARTCHAR C060 +ENCODING 8837 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 8 13 1 0 +BITMAP +02 +02 +FC +06 +09 +09 +11 +11 +21 +22 +FC +40 +40 +ENDCHAR +STARTCHAR C060 +ENCODING 8838 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 8 11 1 0 +BITMAP +3F +40 +80 +80 +80 +80 +80 +40 +3F +00 +FF +ENDCHAR +STARTCHAR C060 +ENCODING 8839 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 8 11 1 0 +BITMAP +FC +02 +01 +01 +01 +01 +01 +02 +FC +00 +FF +ENDCHAR +STARTCHAR C060 +ENCODING 8840 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 8 14 1 -1 +BITMAP +02 +02 +3F +44 +84 +88 +88 +90 +90 +60 +3F +40 +FF +80 +ENDCHAR +STARTCHAR C060 +ENCODING 8841 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 8 14 1 -1 +BITMAP +02 +02 +FC +06 +09 +09 +11 +11 +21 +22 +FC +40 +FF +80 +ENDCHAR +STARTCHAR C060 +ENCODING 8842 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 8 12 1 -1 +BITMAP +3F +40 +80 +80 +80 +80 +80 +40 +3F +08 +FF +10 +ENDCHAR +STARTCHAR C060 +ENCODING 8843 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 8 12 1 -1 +BITMAP +FC +02 +01 +01 +01 +01 +01 +02 +FC +08 +FF +10 +ENDCHAR +STARTCHAR C060 +ENCODING 8844 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 9 11 1 0 +BITMAP +8080 +8080 +8080 +8080 +9080 +B080 +FF80 +B080 +9080 +4100 +3E00 +ENDCHAR +STARTCHAR C060 +ENCODING 8845 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 9 11 1 0 +BITMAP +8080 +8080 +8080 +8080 +8080 +9C80 +9C80 +9C80 +8080 +4100 +3E00 +ENDCHAR +STARTCHAR C060 +ENCODING 8846 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 9 11 1 0 +BITMAP +8080 +8080 +8080 +8080 +8880 +8880 +BE80 +8880 +8880 +4100 +3E00 +ENDCHAR +STARTCHAR char8847 +ENCODING 8847 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 8 10 1 2 +BITMAP +FF +80 +80 +80 +80 +80 +80 +80 +80 +FF +ENDCHAR +STARTCHAR char8847 +ENCODING 8848 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 8 10 1 2 +BITMAP +FF +01 +01 +01 +01 +01 +01 +01 +01 +FF +ENDCHAR +STARTCHAR char8847 +ENCODING 8849 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 8 12 1 0 +BITMAP +FF +80 +80 +80 +80 +80 +80 +80 +80 +FF +00 +FF +ENDCHAR +STARTCHAR char8847 +ENCODING 8850 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 8 12 1 0 +BITMAP +FF +01 +01 +01 +01 +01 +01 +01 +01 +FF +00 +FF +ENDCHAR +STARTCHAR char8847 +ENCODING 8851 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 9 10 1 2 +BITMAP +FF80 +8080 +8080 +8080 +8080 +8080 +8080 +8080 +8080 +8080 +ENDCHAR +STARTCHAR char8847 +ENCODING 8852 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 9 10 1 2 +BITMAP +8080 +8080 +8080 +8080 +8080 +8080 +8080 +8080 +8080 +FF80 +ENDCHAR +STARTCHAR char8853 +ENCODING 8853 +SWIDTH 900 0 +DWIDTH 15 0 +BBX 13 13 1 0 +BITMAP +0F80 +3260 +6230 +4210 +8208 +8208 +FFF8 +8208 +8208 +4210 +6230 +3260 +0F80 +ENDCHAR +STARTCHAR char8853 +ENCODING 8854 +SWIDTH 900 0 +DWIDTH 15 0 +BBX 13 13 1 0 +BITMAP +0F80 +3060 +6030 +4010 +8008 +8008 +FFF8 +8008 +8008 +4010 +6030 +3060 +0F80 +ENDCHAR +STARTCHAR char8853 +ENCODING 8855 +SWIDTH 900 0 +DWIDTH 15 0 +BBX 13 13 1 0 +BITMAP +0F80 +3060 +6030 +5050 +8888 +8508 +8208 +8508 +8888 +5050 +6030 +3060 +0F80 +ENDCHAR +STARTCHAR char8853 +ENCODING 8856 +SWIDTH 900 0 +DWIDTH 15 0 +BBX 13 13 1 0 +BITMAP +0F80 +3060 +6030 +4050 +8088 +8108 +8208 +8408 +8808 +5010 +6030 +3060 +0F80 +ENDCHAR +STARTCHAR char8853 +ENCODING 8857 +SWIDTH 900 0 +DWIDTH 15 0 +BBX 13 13 1 0 +BITMAP +0F80 +3060 +6030 +4010 +8008 +8708 +8708 +8708 +8008 +4010 +6030 +3060 +0F80 +ENDCHAR +STARTCHAR char8853 +ENCODING 8858 +SWIDTH 900 0 +DWIDTH 15 0 +BBX 13 13 1 0 +BITMAP +0F80 +3060 +6030 +4010 +8708 +8888 +8888 +8888 +8708 +4010 +6030 +3060 +0F80 +ENDCHAR +STARTCHAR char8853 +ENCODING 8859 +SWIDTH 900 0 +DWIDTH 15 0 +BBX 13 13 1 0 +BITMAP +0F80 +3060 +6030 +4210 +9248 +8A88 +8708 +8A88 +9248 +4210 +6030 +3060 +0F80 +ENDCHAR +STARTCHAR char8853 +ENCODING 8860 +SWIDTH 900 0 +DWIDTH 15 0 +BBX 13 13 1 0 +BITMAP +0F80 +3060 +6030 +4010 +8008 +9FC8 +8008 +9FC8 +8008 +4010 +6030 +3060 +0F80 +ENDCHAR +STARTCHAR char8853 +ENCODING 8861 +SWIDTH 900 0 +DWIDTH 15 0 +BBX 13 13 1 0 +BITMAP +0F80 +3060 +6030 +4010 +8008 +8008 +9FC8 +8008 +8008 +4010 +6030 +3060 +0F80 +ENDCHAR +STARTCHAR char8847 +ENCODING 8862 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 11 11 1 0 +BITMAP +FFE0 +8420 +8420 +8420 +8420 +FFE0 +8420 +8420 +8420 +8420 +FFE0 +ENDCHAR +STARTCHAR char8847 +ENCODING 8863 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 11 11 1 0 +BITMAP +FFE0 +8020 +8020 +8020 +8020 +FFE0 +8020 +8020 +8020 +8020 +FFE0 +ENDCHAR +STARTCHAR char8847 +ENCODING 8864 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 11 11 1 0 +BITMAP +FFE0 +C060 +A0A0 +9120 +8A20 +8420 +8A20 +9120 +A0A0 +C060 +FFE0 +ENDCHAR +STARTCHAR char8847 +ENCODING 8865 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 11 11 1 0 +BITMAP +FFE0 +8020 +8020 +8020 +8420 +8E20 +8420 +8020 +8020 +8020 +FFE0 +ENDCHAR +STARTCHAR char8847 +ENCODING 8866 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 11 11 1 0 +BITMAP +8000 +8000 +8000 +8000 +8000 +FFE0 +8000 +8000 +8000 +8000 +8000 +ENDCHAR +STARTCHAR char8847 +ENCODING 8867 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 11 11 1 0 +BITMAP +0020 +0020 +0020 +0020 +0020 +FFE0 +0020 +0020 +0020 +0020 +0020 +ENDCHAR +STARTCHAR char8847 +ENCODING 8868 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 11 11 1 0 +BITMAP +FFE0 +0400 +0400 +0400 +0400 +0400 +0400 +0400 +0400 +0400 +0400 +ENDCHAR +STARTCHAR char8847 +ENCODING 8869 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 11 11 1 0 +BITMAP +0400 +0400 +0400 +0400 +0400 +0400 +0400 +0400 +0400 +0400 +FFE0 +ENDCHAR +STARTCHAR char8847 +ENCODING 8870 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 6 11 1 0 +BITMAP +80 +80 +80 +80 +80 +FC +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR char8847 +ENCODING 8871 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +80 +80 +80 +80 +FE +80 +80 +FE +80 +80 +80 +80 +ENDCHAR +STARTCHAR char8847 +ENCODING 8872 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 11 12 1 0 +BITMAP +8000 +8000 +8000 +8000 +FFE0 +8000 +8000 +FFE0 +8000 +8000 +8000 +8000 +ENDCHAR +STARTCHAR char8847 +ENCODING 8873 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 11 11 1 0 +BITMAP +9000 +9000 +9000 +9000 +9000 +9FE0 +9000 +9000 +9000 +9000 +9000 +ENDCHAR +STARTCHAR char8847 +ENCODING 8874 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 11 11 1 0 +BITMAP +9200 +9200 +9200 +9200 +9200 +93E0 +9200 +9200 +9200 +9200 +9200 +ENDCHAR +STARTCHAR char8847 +ENCODING 8875 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 11 12 1 0 +BITMAP +9000 +9000 +9000 +9000 +9FE0 +9000 +9000 +9FE0 +9000 +9000 +9000 +9000 +ENDCHAR +STARTCHAR char8847 +ENCODING 8876 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 11 14 1 -2 +BITMAP +0080 +8080 +8100 +8100 +8200 +8200 +FFE0 +8400 +8800 +8800 +9000 +9000 +2000 +2000 +ENDCHAR +STARTCHAR char8847 +ENCODING 8877 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 11 16 1 -2 +BITMAP +0080 +0080 +8100 +8100 +8200 +8200 +FFE0 +8400 +8400 +FFE0 +8800 +8800 +9000 +9000 +2000 +2000 +ENDCHAR +STARTCHAR char8847 +ENCODING 8878 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 11 14 1 -2 +BITMAP +0040 +9040 +9080 +9080 +9100 +9100 +9FE0 +9200 +9400 +9400 +9800 +9800 +1000 +1000 +ENDCHAR +STARTCHAR char8847 +ENCODING 8879 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 11 16 1 -2 +BITMAP +0040 +0040 +9080 +9080 +9100 +9100 +9FE0 +9200 +9200 +9FE0 +9400 +9400 +9800 +9800 +1000 +1000 +ENDCHAR +STARTCHAR char8804 +ENCODING 8880 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 8 11 1 1 +BITMAP +02 +05 +01 +06 +38 +C0 +38 +06 +01 +05 +02 +ENDCHAR +STARTCHAR char8804 +ENCODING 8881 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 8 11 1 1 +BITMAP +40 +A0 +80 +60 +1C +03 +1C +60 +80 +A0 +40 +ENDCHAR +STARTCHAR char8882 +ENCODING 8882 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 9 6 1 3 +BITMAP +0380 +1C80 +E080 +E080 +1C80 +0380 +ENDCHAR +STARTCHAR char8882 +ENCODING 8883 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 9 6 1 3 +BITMAP +E000 +9C00 +8380 +8380 +9C00 +E000 +ENDCHAR +STARTCHAR char8882 +ENCODING 8884 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 9 9 1 0 +BITMAP +0380 +1C80 +E080 +E080 +1C80 +0380 +0000 +0000 +FF80 +ENDCHAR +STARTCHAR char8882 +ENCODING 8885 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +E000 +9C00 +8380 +8380 +9C00 +E000 +0000 +0000 +FF80 +ENDCHAR +STARTCHAR char8886 +ENCODING 8886 +SWIDTH 900 0 +DWIDTH 15 0 +BBX 14 5 1 3 +BITMAP +6018 +903C +9FFC +903C +6018 +ENDCHAR +STARTCHAR char8886 +ENCODING 8887 +SWIDTH 900 0 +DWIDTH 15 0 +BBX 14 5 1 3 +BITMAP +6018 +F024 +FFE4 +F024 +6018 +ENDCHAR +STARTCHAR char8886 +ENCODING 8888 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 11 5 1 3 +BITMAP +00C0 +0120 +FF20 +0120 +00C0 +ENDCHAR +STARTCHAR char8853 +ENCODING 8889 +SWIDTH 900 0 +DWIDTH 15 0 +BBX 13 13 1 0 +BITMAP +0200 +0200 +0200 +0200 +0200 +0000 +F8F8 +0000 +0200 +0200 +0200 +0200 +0200 +ENDCHAR +STARTCHAR char8847 +ENCODING 8890 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +FE +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +ENDCHAR +STARTCHAR char8804 +ENCODING 8891 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 7 9 1 2 +BITMAP +82 +82 +44 +44 +28 +28 +10 +00 +FE +ENDCHAR +STARTCHAR char8804 +ENCODING 8892 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 7 9 1 2 +BITMAP +FE +00 +10 +28 +28 +44 +44 +82 +82 +ENDCHAR +STARTCHAR char8804 +ENCODING 8893 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 7 9 1 2 +BITMAP +FE +00 +82 +82 +44 +44 +28 +28 +10 +ENDCHAR +STARTCHAR char8894 +ENCODING 8894 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 11 11 1 0 +BITMAP +8000 +8000 +8000 +E000 +9800 +8400 +8200 +8200 +8100 +8100 +FFE0 +ENDCHAR +STARTCHAR char8894 +ENCODING 8895 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 11 11 1 0 +BITMAP +0020 +0060 +00A0 +0120 +0220 +0420 +0820 +1020 +2020 +4020 +FFE0 +ENDCHAR +STARTCHAR char8804 +ENCODING 8896 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 9 8 1 3 +BITMAP +0800 +1C00 +3600 +3600 +6300 +6300 +C180 +C180 +ENDCHAR +STARTCHAR char8804 +ENCODING 8897 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 9 8 1 3 +BITMAP +C180 +C180 +6300 +6300 +3600 +3600 +1C00 +0800 +ENDCHAR +STARTCHAR C060 +ENCODING 8898 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 7 9 1 3 +BITMAP +38 +7C +C6 +C6 +C6 +C6 +C6 +C6 +C6 +ENDCHAR +STARTCHAR C060 +ENCODING 8899 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 7 9 1 3 +BITMAP +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7C +38 +ENDCHAR +STARTCHAR char8900 +ENCODING 8900 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 5 10 1 2 +BITMAP +20 +20 +50 +50 +88 +88 +50 +50 +20 +20 +ENDCHAR +STARTCHAR char8901 +ENCODING 8901 +SWIDTH 240 0 +DWIDTH 4 0 +BBX 2 2 1 5 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR char8902 +ENCODING 8902 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 5 5 1 4 +BITMAP +20 +20 +F8 +70 +D8 +ENDCHAR +STARTCHAR char8903 +ENCODING 8903 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 11 11 1 0 +BITMAP +8420 +4E40 +2480 +1100 +0A00 +FFE0 +0A00 +1100 +2480 +4E40 +8420 +ENDCHAR +STARTCHAR char8903 +ENCODING 8904 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 11 11 1 0 +BITMAP +8020 +C060 +A0A0 +9120 +8A20 +8420 +8A20 +9120 +A0A0 +C060 +8020 +ENDCHAR +STARTCHAR char8903 +ENCODING 8905 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 11 11 1 0 +BITMAP +8020 +C040 +A080 +9100 +8A00 +8400 +8A00 +9100 +A080 +C040 +8020 +ENDCHAR +STARTCHAR char8903 +ENCODING 8906 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 11 11 1 0 +BITMAP +8020 +4060 +20A0 +1120 +0A20 +0420 +0A20 +1120 +20A0 +4060 +8020 +ENDCHAR +STARTCHAR char8903 +ENCODING 8907 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 11 11 1 0 +BITMAP +8000 +4000 +2000 +1000 +0800 +0400 +0A00 +1100 +2080 +4040 +8020 +ENDCHAR +STARTCHAR char8903 +ENCODING 8908 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 11 11 1 0 +BITMAP +0020 +0040 +0080 +0100 +0200 +0400 +0A00 +1100 +2080 +4040 +8020 +ENDCHAR +STARTCHAR C043 +ENCODING 8909 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 10 4 1 4 +BITMAP +8780 +7840 +0000 +FFC0 +ENDCHAR +STARTCHAR char8804 +ENCODING 8910 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 9 9 1 2 +BITMAP +8080 +4100 +2200 +2200 +1400 +1400 +1400 +0800 +0800 +ENDCHAR +STARTCHAR char8804 +ENCODING 8911 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 9 9 1 2 +BITMAP +0800 +0800 +1400 +1400 +1400 +2200 +2200 +4100 +8080 +ENDCHAR +STARTCHAR C060 +ENCODING 8912 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 8 9 1 2 +BITMAP +3F +40 +9F +A0 +A0 +A0 +9F +40 +3F +ENDCHAR +STARTCHAR C060 +ENCODING 8913 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 8 9 1 2 +BITMAP +FC +02 +F9 +05 +05 +05 +F9 +02 +FC +ENDCHAR +STARTCHAR C060 +ENCODING 8914 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 8 11 1 0 +BITMAP +3C +42 +99 +A5 +A5 +A5 +A5 +A5 +A5 +A5 +A5 +ENDCHAR +STARTCHAR C060 +ENCODING 8915 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 8 11 1 0 +BITMAP +A5 +A5 +A5 +A5 +A5 +A5 +A5 +A5 +99 +42 +3C +ENDCHAR +STARTCHAR C060 +ENCODING 8916 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +10 +10 +10 +38 +54 +92 +92 +92 +92 +92 +92 +92 +92 +ENDCHAR +STARTCHAR char123 +ENCODING 8917 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 9 12 1 0 +BITMAP +1400 +1400 +1400 +1400 +FF80 +1400 +1400 +FF80 +1400 +1400 +1400 +1400 +ENDCHAR +STARTCHAR char8804 +ENCODING 8918 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 9 7 1 4 +BITMAP +0380 +1C00 +6200 +8700 +6200 +1C00 +0380 +ENDCHAR +STARTCHAR char8804 +ENCODING 8919 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 9 7 1 4 +BITMAP +E000 +1C00 +2300 +7080 +2300 +1C00 +E000 +ENDCHAR +STARTCHAR char8804 +ENCODING 8920 +SWIDTH 1140 0 +DWIDTH 19 0 +BBX 17 7 1 3 +BITMAP +063180 +18C600 +631800 +842000 +631800 +18C600 +063180 +ENDCHAR +STARTCHAR char8804 +ENCODING 8921 +SWIDTH 1140 0 +DWIDTH 19 0 +BBX 17 7 1 3 +BITMAP +C63000 +318C00 +0C6300 +021080 +0C6300 +318C00 +C63000 +ENDCHAR +STARTCHAR char8804 +ENCODING 8922 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 7 13 1 1 +BITMAP +0E +70 +80 +70 +0E +00 +FE +00 +E0 +1C +02 +1C +E0 +ENDCHAR +STARTCHAR char8804 +ENCODING 8923 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 7 13 1 1 +BITMAP +E0 +1C +02 +1C +E0 +00 +FE +00 +0E +70 +80 +70 +0E +ENDCHAR +STARTCHAR char8804 +ENCODING 8924 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 7 9 1 2 +BITMAP +FE +00 +06 +18 +60 +80 +60 +18 +06 +ENDCHAR +STARTCHAR char8804 +ENCODING 8925 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 7 9 1 2 +BITMAP +FE +00 +C0 +30 +0C +02 +0C +30 +C0 +ENDCHAR +STARTCHAR char8804 +ENCODING 8926 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 11 1 0 +BITMAP +0100 +0200 +0480 +3900 +C600 +3800 +C000 +3800 +0600 +0100 +0080 +ENDCHAR +STARTCHAR char8804 +ENCODING 8927 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 11 1 0 +BITMAP +4000 +2000 +9000 +4E00 +3180 +0E00 +0180 +0E00 +3000 +4000 +8000 +ENDCHAR +STARTCHAR char8804 +ENCODING 8928 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 12 1 0 +BITMAP +0400 +0480 +0500 +0E00 +3800 +C800 +3800 +D600 +3900 +1480 +1200 +0100 +ENDCHAR +STARTCHAR char8804 +ENCODING 8929 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 9 11 1 0 +BITMAP +8200 +4200 +3400 +0E00 +0980 +0E00 +3180 +5E00 +9000 +2000 +6000 +ENDCHAR +STARTCHAR char8847 +ENCODING 8930 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 8 16 1 -2 +BITMAP +02 +02 +FF +84 +84 +84 +88 +88 +88 +88 +90 +FF +10 +FF +20 +20 +ENDCHAR +STARTCHAR char8847 +ENCODING 8931 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 8 16 1 -2 +BITMAP +40 +40 +FF +21 +21 +21 +11 +11 +11 +11 +09 +FF +08 +FF +04 +04 +ENDCHAR +STARTCHAR char8847 +ENCODING 8932 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 8 13 1 -1 +BITMAP +FF +80 +80 +80 +80 +80 +80 +80 +80 +FF +08 +FF +20 +ENDCHAR +STARTCHAR char8847 +ENCODING 8933 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 8 13 1 -1 +BITMAP +FF +01 +01 +01 +01 +01 +01 +01 +01 +FF +08 +FF +10 +ENDCHAR +STARTCHAR char8804 +ENCODING 8934 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 8 11 1 0 +BITMAP +06 +18 +60 +80 +60 +18 +06 +04 +79 +9E +20 +ENDCHAR +STARTCHAR char8804 +ENCODING 8935 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 8 11 1 0 +BITMAP +60 +18 +06 +01 +06 +18 +60 +04 +79 +9E +20 +ENDCHAR +STARTCHAR char8804 +ENCODING 8936 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 10 13 0 0 +BITMAP +0040 +0080 +0300 +1C00 +6000 +1C00 +0300 +0080 +0040 +0200 +7C40 +8F80 +1000 +ENDCHAR +STARTCHAR char8804 +ENCODING 8937 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 10 13 1 0 +BITMAP +8000 +4000 +3000 +0E00 +0180 +0E00 +3000 +4000 +8000 +0200 +7C40 +8F80 +1000 +ENDCHAR +STARTCHAR char8882 +ENCODING 8938 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 9 10 1 1 +BITMAP +0200 +0200 +0380 +1C80 +E480 +E480 +1C80 +0B80 +0800 +0800 +ENDCHAR +STARTCHAR char8882 +ENCODING 8939 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 9 9 1 1 +BITMAP +0400 +E400 +9C00 +8B80 +8B80 +9C00 +F000 +1000 +1000 +ENDCHAR +STARTCHAR char8882 +ENCODING 8940 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 10 13 1 -2 +BITMAP +0100 +0100 +01C0 +0E40 +7240 +7240 +0E40 +05C0 +0400 +0400 +FFC0 +0800 +0800 +ENDCHAR +STARTCHAR char8882 +ENCODING 8941 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 10 12 1 -2 +BITMAP +0400 +E400 +9C00 +8B80 +8B80 +9C00 +E800 +1000 +1000 +FFC0 +1000 +2000 +ENDCHAR +STARTCHAR char8756 +ENCODING 8942 +SWIDTH 300 0 +DWIDTH 5 0 +BBX 3 11 1 0 +BITMAP +40 +E0 +40 +00 +40 +E0 +40 +00 +40 +E0 +40 +ENDCHAR +STARTCHAR char8756 +ENCODING 8943 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 11 3 1 5 +BITMAP +4440 +EEE0 +4440 +ENDCHAR +STARTCHAR char8756 +ENCODING 8944 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 11 13 1 0 +BITMAP +0040 +00E0 +0040 +0000 +0000 +0400 +0E00 +0400 +0000 +0000 +4000 +E000 +4000 +ENDCHAR +STARTCHAR char8756 +ENCODING 8945 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 11 13 1 0 +BITMAP +4000 +E000 +4000 +0000 +0000 +0400 +0E00 +0400 +0000 +0000 +0040 +00E0 +0040 +ENDCHAR +STARTCHAR char8960 +ENCODING 8960 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 8 8 1 2 +BITMAP +3D +42 +85 +89 +91 +A1 +42 +BC +ENDCHAR +STARTCHAR char8962 +ENCODING 8962 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 11 12 1 0 +BITMAP +0400 +0A00 +1100 +2080 +4040 +8020 +8020 +8020 +8020 +8020 +8020 +FFE0 +ENDCHAR +STARTCHAR char8963 +ENCODING 8963 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 7 7 1 5 +BITMAP +10 +28 +28 +44 +44 +82 +82 +ENDCHAR +STARTCHAR char8963 +ENCODING 8964 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 7 7 1 0 +BITMAP +82 +82 +44 +44 +28 +28 +10 +ENDCHAR +STARTCHAR char8963 +ENCODING 8965 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 7 9 1 2 +BITMAP +FE +00 +10 +28 +28 +44 +44 +82 +82 +ENDCHAR +STARTCHAR char8963 +ENCODING 8966 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 7 11 1 2 +BITMAP +FE +00 +FE +00 +10 +28 +28 +44 +44 +82 +82 +ENDCHAR +STARTCHAR C091 +ENCODING 8968 +SWIDTH 300 0 +DWIDTH 5 0 +BBX 4 12 1 0 +BITMAP +F0 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR C091 +ENCODING 8969 +SWIDTH 300 0 +DWIDTH 5 0 +BBX 4 12 1 0 +BITMAP +F0 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +ENDCHAR +STARTCHAR C091 +ENCODING 8970 +SWIDTH 300 0 +DWIDTH 5 0 +BBX 4 12 1 0 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +F0 +ENDCHAR +STARTCHAR C091 +ENCODING 8971 +SWIDTH 300 0 +DWIDTH 5 0 +BBX 4 12 1 0 +BITMAP +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +F0 +ENDCHAR +STARTCHAR C091 +ENCODING 8972 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 6 6 1 0 +BITMAP +3C +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR C091 +ENCODING 8973 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 6 6 1 0 +BITMAP +F0 +04 +04 +04 +04 +04 +ENDCHAR +STARTCHAR C091 +ENCODING 8974 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 6 6 1 6 +BITMAP +80 +80 +80 +80 +80 +3C +ENDCHAR +STARTCHAR C091 +ENCODING 8975 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 6 6 1 6 +BITMAP +04 +04 +04 +04 +04 +F0 +ENDCHAR +STARTCHAR char172 +ENCODING 8976 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 6 4 1 2 +BITMAP +FC +80 +80 +80 +ENDCHAR +STARTCHAR char9216 +ENCODING 9216 +SWIDTH 1140 0 +DWIDTH 19 0 +BBX 17 7 1 3 +BITMAP +8A2800 +8A2800 +CA2800 +AA2800 +9A2800 +8A2800 +89CF80 +ENDCHAR +STARTCHAR char9217 +ENCODING 9217 +SWIDTH 1140 0 +DWIDTH 19 0 +BBX 17 7 1 3 +BITMAP +71C880 +8A2880 +822880 +722F80 +0A2880 +8A2880 +71C880 +ENDCHAR +STARTCHAR char9218 +ENCODING 9218 +SWIDTH 1140 0 +DWIDTH 19 0 +BBX 17 7 1 3 +BITMAP +73E880 +888880 +808500 +708200 +088500 +888880 +708880 +ENDCHAR +STARTCHAR char9219 +ENCODING 9219 +SWIDTH 1140 0 +DWIDTH 19 0 +BBX 17 7 1 3 +BITMAP +FBE880 +808880 +808500 +F08200 +808500 +808880 +F88880 +ENDCHAR +STARTCHAR char9220 +ENCODING 9220 +SWIDTH 1140 0 +DWIDTH 19 0 +BBX 17 7 1 3 +BITMAP +F9CF80 +822200 +822200 +F22200 +822200 +822200 +F9C200 +ENDCHAR +STARTCHAR char9221 +ENCODING 9221 +SWIDTH 1140 0 +DWIDTH 19 0 +BBX 17 8 1 2 +BITMAP +FA2700 +822880 +832880 +F2A880 +826880 +822A80 +FA2700 +000080 +ENDCHAR +STARTCHAR char9222 +ENCODING 9222 +SWIDTH 1140 0 +DWIDTH 19 0 +BBX 17 7 1 3 +BITMAP +21C880 +522900 +8A0A00 +8A0C00 +FA0A00 +8A2900 +89C880 +ENDCHAR +STARTCHAR char9223 +ENCODING 9223 +SWIDTH 1140 0 +DWIDTH 19 0 +BBX 17 7 1 3 +BITMAP +F3E800 +4A0800 +4A0800 +73C800 +4A0800 +4A0800 +F3EF80 +ENDCHAR +STARTCHAR char9224 +ENCODING 9224 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 11 7 1 3 +BITMAP +F1C0 +4A20 +4A00 +71C0 +4820 +4A20 +F1C0 +ENDCHAR +STARTCHAR char9225 +ENCODING 9225 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 11 7 1 3 +BITMAP +8BE0 +8880 +8880 +F880 +8880 +8880 +8880 +ENDCHAR +STARTCHAR char9226 +ENCODING 9226 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 11 7 1 3 +BITMAP +83E0 +8200 +8200 +83C0 +8200 +8200 +FA00 +ENDCHAR +STARTCHAR char9227 +ENCODING 9227 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 11 7 1 4 +BITMAP +8BE0 +8880 +8880 +5080 +5080 +5080 +2080 +ENDCHAR +STARTCHAR char9228 +ENCODING 9228 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 11 7 1 3 +BITMAP +FBE0 +8200 +8200 +F3C0 +8200 +8200 +8200 +ENDCHAR +STARTCHAR char9229 +ENCODING 9229 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 11 7 1 3 +BITMAP +73C0 +8A20 +8220 +83C0 +8280 +8A40 +7220 +ENDCHAR +STARTCHAR char9230 +ENCODING 9230 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 11 7 1 3 +BITMAP +71C0 +8A20 +8220 +7220 +0A20 +8A20 +71C0 +ENDCHAR +STARTCHAR char9231 +ENCODING 9231 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 9 7 1 3 +BITMAP +7380 +8900 +8100 +7100 +0900 +8900 +7380 +ENDCHAR +STARTCHAR char9232 +ENCODING 9232 +SWIDTH 1140 0 +DWIDTH 19 0 +BBX 17 7 1 3 +BITMAP +F20F80 +4A0800 +4A0800 +4A0F00 +4A0800 +4A0800 +F3EF80 +ENDCHAR +STARTCHAR char9233 +ENCODING 9233 +SWIDTH 1140 0 +DWIDTH 19 0 +BBX 17 7 1 3 +BITMAP +F1C200 +4A2600 +4A0A00 +4A0200 +4A0200 +4A2200 +F1CF80 +ENDCHAR +STARTCHAR char9234 +ENCODING 9234 +SWIDTH 1140 0 +DWIDTH 19 0 +BBX 17 7 1 3 +BITMAP +F1C700 +4A2880 +4A0080 +4A0300 +4A0400 +4A2800 +F1CF80 +ENDCHAR +STARTCHAR char9235 +ENCODING 9235 +SWIDTH 1140 0 +DWIDTH 19 0 +BBX 17 7 1 3 +BITMAP +F1CF80 +4A2080 +4A0100 +4A0300 +4A0080 +4A2880 +F1C700 +ENDCHAR +STARTCHAR char9236 +ENCODING 9236 +SWIDTH 1140 0 +DWIDTH 19 0 +BBX 17 7 1 3 +BITMAP +F1C100 +4A2300 +4A0500 +4A0900 +4A0F80 +4A2100 +F1C100 +ENDCHAR +STARTCHAR char9237 +ENCODING 9237 +SWIDTH 1140 0 +DWIDTH 19 0 +BBX 17 7 1 3 +BITMAP +888880 +894900 +CA2A00 +AA2C00 +9BEA00 +8A2900 +8A2880 +ENDCHAR +STARTCHAR char9238 +ENCODING 9238 +SWIDTH 1140 0 +DWIDTH 19 0 +BBX 17 7 1 3 +BITMAP +722880 +8A2880 +814C80 +708A80 +088980 +888880 +708880 +ENDCHAR +STARTCHAR char9239 +ENCODING 9239 +SWIDTH 1140 0 +DWIDTH 19 0 +BBX 17 7 1 3 +BITMAP +FBEF00 +808480 +808480 +F08700 +808480 +808480 +F88F00 +ENDCHAR +STARTCHAR char9240 +ENCODING 9240 +SWIDTH 1140 0 +DWIDTH 19 0 +BBX 17 7 1 3 +BITMAP +708880 +894880 +822C80 +822A80 +83E980 +8A2880 +722880 +ENDCHAR +STARTCHAR char9241 +ENCODING 9241 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 11 7 1 3 +BITMAP +FA20 +8220 +8360 +F2A0 +8220 +8220 +FA20 +ENDCHAR +STARTCHAR char9242 +ENCODING 9242 +SWIDTH 1140 0 +DWIDTH 19 0 +BBX 17 7 1 3 +BITMAP +722F00 +8A2480 +822480 +722700 +0A2480 +8A2480 +71CF00 +ENDCHAR +STARTCHAR char9243 +ENCODING 9243 +SWIDTH 1140 0 +DWIDTH 19 0 +BBX 17 7 1 3 +BITMAP +F9C700 +822880 +820800 +F1C800 +802800 +822880 +F9C700 +ENDCHAR +STARTCHAR char9244 +ENCODING 9244 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 11 7 1 3 +BITMAP +F9C0 +8220 +8200 +F1C0 +8020 +8220 +81C0 +ENDCHAR +STARTCHAR char9245 +ENCODING 9245 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 11 7 1 3 +BITMAP +71C0 +8A20 +8200 +81C0 +9820 +8A20 +71C0 +ENDCHAR +STARTCHAR char9246 +ENCODING 9246 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 11 7 1 3 +BITMAP +F1C0 +8A20 +8A00 +F1C0 +A020 +9220 +89C0 +ENDCHAR +STARTCHAR char9247 +ENCODING 9247 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 11 7 1 3 +BITMAP +89C0 +8A20 +8A00 +89C0 +8820 +8A20 +71C0 +ENDCHAR +STARTCHAR char9248 +ENCODING 9248 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 11 7 1 3 +BITMAP +73C0 +8A20 +8220 +73C0 +0A00 +8A00 +7200 +ENDCHAR +STARTCHAR char9249 +ENCODING 9249 +SWIDTH 1140 0 +DWIDTH 19 0 +BBX 17 7 1 3 +BITMAP +F3E800 +4A0800 +4A0800 +4BC800 +4A0800 +4A0800 +F3EF80 +ENDCHAR +STARTCHAR C098 +ENCODING 9250 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 6 13 1 -3 +BITMAP +C8 +48 +48 +78 +54 +54 +54 +64 +64 +78 +20 +40 +40 +ENDCHAR +STARTCHAR char9251 +ENCODING 9251 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 9 3 1 -2 +BITMAP +8080 +8080 +FF80 +ENDCHAR +STARTCHAR char9216 +ENCODING 9252 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 11 11 1 1 +BITMAP +8800 +8800 +C800 +A800 +9A00 +8A00 +8A00 +0200 +0200 +0200 +03E0 +ENDCHAR +STARTCHAR char9280 +ENCODING 9280 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 7 11 1 1 +BITMAP +1E +12 +12 +12 +10 +10 +10 +90 +90 +90 +F0 +ENDCHAR +STARTCHAR char9281 +ENCODING 9281 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 7 11 1 1 +BITMAP +02 +02 +02 +02 +02 +FE +82 +82 +82 +82 +82 +ENDCHAR +STARTCHAR char9281 +ENCODING 9282 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 7 11 1 1 +BITMAP +82 +82 +82 +82 +82 +FE +10 +10 +10 +10 +10 +ENDCHAR +STARTCHAR char9281 +ENCODING 9283 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 7 11 1 1 +BITMAP +FE +92 +92 +92 +10 +10 +10 +92 +92 +92 +FE +ENDCHAR +STARTCHAR char9284 +ENCODING 9284 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 7 5 1 7 +BITMAP +C6 +AA +92 +AA +C6 +ENDCHAR +STARTCHAR char9285 +ENCODING 9285 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 7 9 1 2 +BITMAP +0E +CE +CE +C0 +C0 +C0 +CE +CE +0E +ENDCHAR +STARTCHAR char9285 +ENCODING 9286 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 7 11 1 1 +BITMAP +06 +06 +06 +16 +16 +10 +D0 +D0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR char9287 +ENCODING 9287 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 7 8 1 2 +BITMAP +0E +0E +AE +AE +AE +A0 +A0 +A0 +ENDCHAR +STARTCHAR char9285 +ENCODING 9288 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 7 5 1 4 +BITMAP +DA +DA +DA +DA +DA +ENDCHAR +STARTCHAR C047 +ENCODING 9289 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 7 12 1 0 +BITMAP +90 +90 +48 +48 +48 +48 +24 +24 +24 +24 +12 +12 +ENDCHAR +STARTCHAR C040 +ENCODING 9312 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 17 17 1 -3 +BITMAP +07F000 +180C00 +200200 +408100 +438100 +808080 +808080 +808080 +808080 +808080 +808080 +808080 +408100 +43E100 +200200 +180C00 +07F000 +ENDCHAR +STARTCHAR C040 +ENCODING 9313 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 17 17 1 -3 +BITMAP +07F000 +180C00 +200200 +41C100 +422100 +822080 +822080 +802080 +804080 +804080 +808080 +812080 +412100 +43E100 +200200 +180C00 +07F000 +ENDCHAR +STARTCHAR C040 +ENCODING 9314 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 17 17 1 -3 +BITMAP +07F000 +180C00 +200200 +41C100 +422100 +822080 +802080 +802080 +80C080 +802080 +802080 +822080 +422100 +41C100 +200200 +180C00 +07F000 +ENDCHAR +STARTCHAR C040 +ENCODING 9315 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 17 17 1 -3 +BITMAP +07F000 +180C00 +200200 +40C100 +40C100 +814080 +814080 +824080 +864080 +87F080 +804080 +804080 +404100 +41F100 +200200 +180C00 +07F000 +ENDCHAR +STARTCHAR C040 +ENCODING 9316 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 17 17 1 -3 +BITMAP +07F000 +180C00 +200200 +422100 +43C100 +820080 +820080 +83C080 +832080 +802080 +802080 +822080 +424100 +418100 +200200 +180C00 +07F000 +ENDCHAR +STARTCHAR C040 +ENCODING 9317 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 17 17 1 -3 +BITMAP +07F000 +180C00 +200200 +40C100 +412100 +810080 +820080 +83C080 +822080 +822080 +822080 +822080 +414100 +41C100 +200200 +180C00 +07F000 +ENDCHAR +STARTCHAR C040 +ENCODING 9318 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 17 17 1 -3 +BITMAP +07F000 +180C00 +220200 +43F100 +421100 +822080 +804080 +804080 +804080 +808080 +808080 +808080 +408100 +408100 +200200 +180C00 +07F000 +ENDCHAR +STARTCHAR C040 +ENCODING 9319 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 17 17 1 -3 +BITMAP +07F000 +180C00 +200200 +41C100 +422100 +822080 +822080 +814080 +81C080 +822080 +822080 +822080 +422100 +41C100 +200200 +180C00 +07F000 +ENDCHAR +STARTCHAR C040 +ENCODING 9320 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 17 17 1 -3 +BITMAP +07F000 +180C00 +200200 +41C100 +414100 +822080 +822080 +822080 +822080 +81E080 +802080 +804080 +424100 +418100 +200200 +180C00 +07F000 +ENDCHAR +STARTCHAR C040 +ENCODING 9321 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 17 17 1 -3 +BITMAP +07F000 +180C00 +200200 +447100 +5C5100 +848880 +848880 +848880 +848880 +848880 +848880 +848880 +445100 +5F7100 +200200 +180C00 +07F000 +ENDCHAR +STARTCHAR C040 +ENCODING 9322 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 17 17 1 -3 +BITMAP +07F000 +180C00 +200200 +441100 +5C7100 +841080 +841080 +841080 +841080 +841080 +841080 +841080 +441100 +5F7D00 +200200 +180C00 +07F000 +ENDCHAR +STARTCHAR C040 +ENCODING 9323 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 17 17 1 -3 +BITMAP +07F000 +180C00 +200200 +447100 +5C8900 +848880 +848880 +840880 +841080 +841080 +842080 +844880 +444900 +5FF900 +200200 +180C00 +07F000 +ENDCHAR +STARTCHAR C040 +ENCODING 9324 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 17 17 1 -3 +BITMAP +07F000 +180C00 +200200 +447100 +5C8900 +848880 +840880 +840880 +843080 +840880 +840880 +848880 +448900 +5F7100 +200200 +180C00 +07F000 +ENDCHAR +STARTCHAR C040 +ENCODING 9325 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 17 17 1 -3 +BITMAP +07F000 +180C00 +200200 +443100 +5C3100 +845080 +845080 +849080 +859080 +85FC80 +841080 +841080 +441100 +5F7D00 +200200 +180C00 +07F000 +ENDCHAR +STARTCHAR C040 +ENCODING 9326 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 17 17 1 -3 +BITMAP +07F000 +180C00 +200200 +448900 +5CF100 +848080 +848080 +84F080 +84C880 +840880 +840880 +848880 +449100 +5F6100 +200200 +180C00 +07F000 +ENDCHAR +STARTCHAR C040 +ENCODING 9327 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 17 17 1 -3 +BITMAP +07F000 +180C00 +200200 +443100 +5C4900 +844080 +848080 +84F080 +848880 +848880 +848880 +848880 +445100 +5F7100 +200200 +180C00 +07F000 +ENDCHAR +STARTCHAR C040 +ENCODING 9328 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 17 17 1 -3 +BITMAP +07F000 +180C00 +208200 +44FD00 +5C8500 +848880 +841080 +841080 +841080 +842080 +842080 +842080 +442100 +5F2100 +200200 +180C00 +07F000 +ENDCHAR +STARTCHAR C040 +ENCODING 9329 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 17 17 1 -3 +BITMAP +07F000 +180C00 +200200 +447100 +5C8900 +848880 +848880 +845080 +847080 +848880 +848880 +848880 +448900 +5F7100 +200200 +180C00 +07F000 +ENDCHAR +STARTCHAR C040 +ENCODING 9330 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 17 17 1 -3 +BITMAP +07F000 +180C00 +200200 +447100 +5C5100 +848880 +848880 +848880 +848880 +847880 +840880 +841080 +449100 +5F6100 +200200 +180C00 +07F000 +ENDCHAR +STARTCHAR C040 +ENCODING 9331 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 17 17 1 -3 +BITMAP +07F000 +180C00 +200200 +4E3900 +512900 +914480 +914480 +814480 +824480 +824480 +844480 +894480 +492900 +5F3900 +200200 +180C00 +07F000 +ENDCHAR +STARTCHAR C040 +ENCODING 9332 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 17 15 1 -3 +BITMAP +100400 +208200 +438100 +408100 +808080 +808080 +808080 +808080 +808080 +808080 +808080 +43E100 +400100 +200200 +100400 +ENDCHAR +STARTCHAR C040 +ENCODING 9333 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 17 15 1 -3 +BITMAP +100400 +21C200 +422100 +422100 +822080 +802080 +804080 +804080 +808080 +812080 +812080 +43E100 +400100 +200200 +100400 +ENDCHAR +STARTCHAR C040 +ENCODING 9334 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 17 15 1 -3 +BITMAP +100400 +21C200 +422100 +422100 +802080 +802080 +80C080 +802080 +802080 +822080 +822080 +41C100 +400100 +200200 +100400 +ENDCHAR +STARTCHAR C040 +ENCODING 9335 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 17 15 1 -3 +BITMAP +100400 +20C200 +40C100 +414100 +814080 +824080 +864080 +87F080 +804080 +804080 +804080 +41F100 +400100 +200200 +100400 +ENDCHAR +STARTCHAR C040 +ENCODING 9336 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 17 15 1 -3 +BITMAP +100400 +222200 +43C100 +420100 +820080 +83C080 +832080 +802080 +802080 +822080 +824080 +418100 +400100 +200200 +100400 +ENDCHAR +STARTCHAR C040 +ENCODING 9337 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 17 15 1 -3 +BITMAP +100400 +20C200 +412100 +410100 +820080 +83C080 +822080 +822080 +822080 +822080 +814080 +41C100 +400100 +200200 +100400 +ENDCHAR +STARTCHAR C040 +ENCODING 9338 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 17 15 1 -3 +BITMAP +120400 +23F200 +421100 +422100 +804080 +804080 +804080 +808080 +808080 +808080 +808080 +408100 +400100 +200200 +100400 +ENDCHAR +STARTCHAR C040 +ENCODING 9339 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 17 15 1 -3 +BITMAP +100400 +21C200 +422100 +422100 +822080 +814080 +81C080 +822080 +822080 +822080 +822080 +41C100 +400100 +200200 +100400 +ENDCHAR +STARTCHAR C040 +ENCODING 9340 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 17 15 1 -3 +BITMAP +100400 +21C200 +414100 +422100 +822080 +822080 +822080 +81E080 +802080 +804080 +824080 +418100 +400100 +200200 +100400 +ENDCHAR +STARTCHAR C040 +ENCODING 9341 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 17 15 1 -3 +BITMAP +100400 +247200 +5C5100 +448900 +848880 +848880 +848880 +848880 +848880 +848880 +845080 +5F7100 +400100 +200200 +100400 +ENDCHAR +STARTCHAR C040 +ENCODING 9342 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 17 15 1 -3 +BITMAP +100400 +241200 +5C7100 +441100 +841080 +841080 +841080 +841080 +841080 +841080 +841080 +5F7D00 +400100 +200200 +100400 +ENDCHAR +STARTCHAR C040 +ENCODING 9343 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 17 15 1 -3 +BITMAP +100400 +247200 +5C8900 +448900 +848880 +840880 +841080 +841080 +842080 +844880 +844880 +5FF900 +400100 +200200 +100400 +ENDCHAR +STARTCHAR C040 +ENCODING 9344 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 17 15 1 -3 +BITMAP +100400 +247200 +5C8900 +448900 +840880 +840880 +843080 +840880 +840880 +848880 +848880 +5F7100 +400100 +200200 +100400 +ENDCHAR +STARTCHAR C040 +ENCODING 9345 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 17 15 1 -3 +BITMAP +100400 +243200 +5C3100 +445100 +845080 +849080 +859080 +85F880 +841080 +841080 +841080 +5F7900 +400100 +200200 +100400 +ENDCHAR +STARTCHAR C040 +ENCODING 9346 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 17 15 1 -3 +BITMAP +100400 +248A00 +5CF100 +448100 +848080 +84F080 +84C880 +840880 +840880 +848880 +849080 +5F6100 +400100 +200200 +100400 +ENDCHAR +STARTCHAR C040 +ENCODING 9347 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 17 15 1 -3 +BITMAP +100400 +243200 +5C4900 +444100 +848080 +84F080 +848880 +848880 +848880 +848880 +845080 +5F7100 +400100 +200200 +100400 +ENDCHAR +STARTCHAR C040 +ENCODING 9348 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 17 15 1 -3 +BITMAP +108400 +24FE00 +5C8500 +448900 +841080 +841080 +841080 +842080 +842080 +842080 +842080 +5F2100 +400100 +200200 +100400 +ENDCHAR +STARTCHAR C040 +ENCODING 9349 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 17 15 1 -3 +BITMAP +100400 +247200 +5C8900 +448900 +848880 +845080 +847080 +848880 +848880 +848880 +848880 +5F7100 +400100 +200200 +100400 +ENDCHAR +STARTCHAR C040 +ENCODING 9350 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 17 15 1 -3 +BITMAP +100400 +247200 +5C5100 +448900 +848880 +848880 +848880 +847880 +840880 +841080 +849080 +5F6100 +400100 +200200 +100400 +ENDCHAR +STARTCHAR C040 +ENCODING 9351 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 17 15 1 -3 +BITMAP +100400 +2E3A00 +512900 +514500 +914480 +814480 +824480 +824480 +844480 +894480 +892880 +5F3900 +400100 +200200 +100400 +ENDCHAR +STARTCHAR C049 +ENCODING 9352 +SWIDTH 840 0 +DWIDTH 14 0 +BBX 9 11 3 0 +BITMAP +2000 +E000 +2000 +2000 +2000 +2000 +2000 +2000 +2000 +2180 +F980 +ENDCHAR +STARTCHAR C050 +ENCODING 9353 +SWIDTH 840 0 +DWIDTH 14 0 +BBX 9 11 3 0 +BITMAP +7000 +8800 +8800 +8800 +0800 +1000 +1000 +2000 +4800 +4980 +F980 +ENDCHAR +STARTCHAR C051 +ENCODING 9354 +SWIDTH 840 0 +DWIDTH 14 0 +BBX 9 11 3 0 +BITMAP +7000 +8800 +8800 +0800 +0800 +3000 +0800 +0800 +8800 +8980 +7180 +ENDCHAR +STARTCHAR C052 +ENCODING 9355 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 11 11 3 0 +BITMAP +1800 +1800 +2800 +2800 +4800 +C800 +FE00 +0800 +0800 +0860 +3E60 +ENDCHAR +STARTCHAR C053 +ENCODING 9356 +SWIDTH 840 0 +DWIDTH 14 0 +BBX 9 11 3 0 +BITMAP +8800 +F000 +8000 +8000 +F000 +C800 +0800 +0800 +8800 +9180 +6180 +ENDCHAR +STARTCHAR C054 +ENCODING 9357 +SWIDTH 840 0 +DWIDTH 14 0 +BBX 9 11 3 0 +BITMAP +3000 +4800 +4000 +8000 +F000 +8800 +8800 +8800 +8800 +5180 +7180 +ENDCHAR +STARTCHAR C055 +ENCODING 9358 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 7 12 3 0 +BITMAP +80 +FC +84 +88 +10 +10 +10 +20 +20 +20 +26 +26 +ENDCHAR +STARTCHAR C056 +ENCODING 9359 +SWIDTH 840 0 +DWIDTH 14 0 +BBX 9 11 3 0 +BITMAP +7000 +8800 +8800 +8800 +5000 +7000 +8800 +8800 +8800 +8980 +7180 +ENDCHAR +STARTCHAR C057 +ENCODING 9360 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 8 11 3 0 +BITMAP +70 +50 +88 +88 +88 +88 +78 +08 +10 +93 +63 +ENDCHAR +STARTCHAR C040 +ENCODING 9361 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 13 11 3 0 +BITMAP +2380 +E280 +2440 +2440 +2440 +2440 +2440 +2440 +2440 +2298 +FB98 +ENDCHAR +STARTCHAR C040 +ENCODING 9362 +SWIDTH 1200 0 +DWIDTH 20 0 +BBX 15 11 3 0 +BITMAP +2080 +E380 +2080 +2080 +2080 +2080 +2080 +2080 +2080 +2086 +FBE6 +ENDCHAR +STARTCHAR C040 +ENCODING 9363 +SWIDTH 1140 0 +DWIDTH 19 0 +BBX 14 11 3 0 +BITMAP +2380 +E440 +2440 +2440 +2040 +2080 +2080 +2100 +2240 +224C +FFCC +ENDCHAR +STARTCHAR C040 +ENCODING 9364 +SWIDTH 1140 0 +DWIDTH 19 0 +BBX 14 11 3 0 +BITMAP +2380 +E440 +2440 +2040 +2040 +2180 +2040 +2040 +2440 +244C +FB8C +ENDCHAR +STARTCHAR C040 +ENCODING 9365 +SWIDTH 1140 0 +DWIDTH 19 0 +BBX 14 11 3 0 +BITMAP +2180 +E180 +2280 +2280 +2480 +2C80 +2FC0 +2080 +2080 +208C +FBCC +ENDCHAR +STARTCHAR C040 +ENCODING 9366 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 13 11 3 0 +BITMAP +2440 +E780 +2400 +2400 +2780 +2640 +2040 +2040 +2440 +2498 +FB18 +ENDCHAR +STARTCHAR C040 +ENCODING 9367 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 13 11 3 0 +BITMAP +2180 +E240 +2200 +2400 +2780 +2440 +2440 +2440 +2440 +2298 +FB98 +ENDCHAR +STARTCHAR C040 +ENCODING 9368 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 12 3 0 +BITMAP +0400 +27E0 +E420 +2440 +2080 +2080 +2080 +2100 +2100 +2100 +2130 +F930 +ENDCHAR +STARTCHAR C040 +ENCODING 9369 +SWIDTH 1140 0 +DWIDTH 19 0 +BBX 14 11 3 0 +BITMAP +2380 +E440 +2440 +2440 +2280 +2380 +2440 +2440 +2440 +244C +FB8C +ENDCHAR +STARTCHAR C040 +ENCODING 9370 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 13 11 3 0 +BITMAP +2380 +E280 +2440 +2440 +2440 +2440 +23C0 +2040 +2080 +2498 +FB18 +ENDCHAR +STARTCHAR C040 +ENCODING 9371 +SWIDTH 1140 0 +DWIDTH 19 0 +BBX 14 11 3 0 +BITMAP +71C0 +8940 +8A20 +8A20 +0A20 +1220 +1220 +2220 +4A20 +494C +F9CC +ENDCHAR +STARTCHAR C109 +ENCODING 9372 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 17 15 1 -3 +BITMAP +100400 +200200 +400100 +400100 +800080 +838080 +844080 +804080 +83C080 +844080 +844080 +43E100 +400100 +200200 +100400 +ENDCHAR +STARTCHAR C109 +ENCODING 9373 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 17 15 1 -3 +BITMAP +160400 +220200 +420100 +420100 +820080 +83C080 +822080 +822080 +822080 +822080 +822080 +43C100 +400100 +200200 +100400 +ENDCHAR +STARTCHAR C109 +ENCODING 9374 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 17 15 1 -3 +BITMAP +100400 +200200 +400100 +400100 +800080 +81C080 +822080 +820080 +820080 +820080 +822080 +41C100 +400100 +200200 +100400 +ENDCHAR +STARTCHAR C109 +ENCODING 9375 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 17 15 1 -3 +BITMAP +10C400 +204200 +404100 +404100 +804080 +83C080 +844080 +844080 +844080 +844080 +844080 +43E100 +400100 +200200 +100400 +ENDCHAR +STARTCHAR C109 +ENCODING 9376 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 17 15 1 -3 +BITMAP +100400 +200200 +400100 +400100 +800080 +81C080 +822080 +83E080 +820080 +820080 +822080 +41C100 +400100 +200200 +100400 +ENDCHAR +STARTCHAR C109 +ENCODING 9377 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 17 15 1 -3 +BITMAP +10E400 +212200 +410100 +410100 +810080 +83C080 +810080 +810080 +810080 +810080 +810080 +438100 +400100 +200200 +100400 +ENDCHAR +STARTCHAR C109 +ENCODING 9378 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 17 16 1 -4 +BITMAP +100400 +200200 +400100 +400100 +800080 +81F080 +822080 +822080 +822080 +83C080 +820080 +43E100 +441100 +241200 +141400 +03E000 +ENDCHAR +STARTCHAR C109 +ENCODING 9379 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 17 15 1 -3 +BITMAP +160400 +220200 +420100 +420100 +820080 +83C080 +822080 +822080 +822080 +822080 +822080 +477100 +400100 +200200 +100400 +ENDCHAR +STARTCHAR 0x24A4 +ENCODING 9380 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 17 15 1 -3 +BITMAP +100400 +218200 +418100 +400100 +800080 +818080 +808080 +808080 +808080 +808080 +808080 +41C100 +400100 +200200 +100400 +ENDCHAR +STARTCHAR 0x24A5 +ENCODING 9381 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 17 15 1 -3 +BITMAP +100400 +20C200 +40C100 +400100 +800080 +80C080 +804080 +804080 +804080 +804080 +804080 +404100 +404100 +224200 +138400 +ENDCHAR +STARTCHAR C109 +ENCODING 9382 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 17 15 1 -3 +BITMAP +160400 +220200 +420100 +420100 +820080 +82F080 +824080 +828080 +838080 +82C080 +824080 +477100 +400100 +200200 +100400 +ENDCHAR +STARTCHAR C109 +ENCODING 9383 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 17 15 1 -3 +BITMAP +118400 +208200 +408100 +408100 +808080 +808080 +808080 +808080 +808080 +808080 +808080 +41C100 +400100 +200200 +100400 +ENDCHAR +STARTCHAR C109 +ENCODING 9384 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 17 15 1 -3 +BITMAP +100400 +200200 +400100 +400100 +800080 +9F7080 +888880 +888880 +888880 +888880 +888880 +5DDD00 +400100 +200200 +100400 +ENDCHAR +STARTCHAR C109 +ENCODING 9385 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 17 15 1 -3 +BITMAP +100400 +200200 +400100 +400100 +800080 +87C080 +822080 +822080 +822080 +822080 +822080 +477100 +400100 +200200 +100400 +ENDCHAR +STARTCHAR C109 +ENCODING 9386 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 17 15 1 -3 +BITMAP +100400 +200200 +400100 +400100 +800080 +81C080 +822080 +822080 +822080 +822080 +822080 +41C100 +400100 +200200 +100400 +ENDCHAR +STARTCHAR C109 +ENCODING 9387 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 17 15 1 -3 +BITMAP +100400 +200200 +400100 +400100 +800080 +87C080 +822080 +822080 +822080 +822080 +822080 +43C100 +420100 +220200 +170400 +ENDCHAR +STARTCHAR C109 +ENCODING 9388 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 17 15 1 -3 +BITMAP +100400 +200200 +400100 +400100 +800080 +83C080 +844080 +844080 +844080 +844080 +844080 +43C100 +404100 +204200 +10E400 +ENDCHAR +STARTCHAR C109 +ENCODING 9389 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 17 15 1 -3 +BITMAP +100400 +200200 +400100 +400100 +800080 +834080 +81A080 +810080 +810080 +810080 +810080 +43C100 +400100 +200200 +100400 +ENDCHAR +STARTCHAR C109 +ENCODING 9390 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 17 15 1 -3 +BITMAP +100400 +200200 +400100 +400100 +800080 +81E080 +822080 +820080 +81C080 +802080 +822080 +43C100 +400100 +200200 +100400 +ENDCHAR +STARTCHAR C109 +ENCODING 9391 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 17 15 1 -3 +BITMAP +100400 +200200 +410100 +410100 +830080 +87C080 +810080 +810080 +810080 +812080 +812080 +40C100 +400100 +200200 +100400 +ENDCHAR +STARTCHAR C109 +ENCODING 9392 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 17 15 1 -3 +BITMAP +100400 +200200 +400100 +400100 +800080 +866080 +822080 +822080 +822080 +822080 +822080 +41F100 +400100 +200200 +100400 +ENDCHAR +STARTCHAR C109 +ENCODING 9393 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 17 15 1 -3 +BITMAP +100400 +200200 +400100 +400100 +800080 +8E7080 +824080 +824080 +824080 +818080 +818080 +418100 +400100 +200200 +100400 +ENDCHAR +STARTCHAR C119 +ENCODING 9394 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 17 15 1 -3 +BITMAP +100400 +200200 +400100 +400100 +800080 +9DDC80 +849080 +855080 +855080 +855080 +836080 +422100 +400100 +200200 +100400 +ENDCHAR +STARTCHAR C109 +ENCODING 9395 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 17 15 1 -3 +BITMAP +100400 +200200 +400100 +400100 +800080 +8E7080 +824080 +818080 +818080 +818080 +824080 +4E7100 +400100 +200200 +100400 +ENDCHAR +STARTCHAR C109 +ENCODING 9396 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 17 15 1 -3 +BITMAP +100400 +200200 +400100 +400100 +800080 +873880 +812080 +812080 +812080 +80C080 +80C080 +40C100 +408100 +248200 +170400 +ENDCHAR +STARTCHAR C109 +ENCODING 9397 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 17 15 1 -3 +BITMAP +100400 +200200 +400100 +400100 +800080 +83E080 +824080 +824080 +808080 +812080 +812080 +43E100 +400100 +200200 +100400 +ENDCHAR +STARTCHAR C040 +ENCODING 9398 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 17 17 1 -3 +BITMAP +07F000 +180C00 +200200 +408100 +408100 +814080 +814080 +814080 +822080 +822080 +83E080 +841080 +441100 +5E3D00 +200200 +180C00 +07F000 +ENDCHAR +STARTCHAR C040 +ENCODING 9399 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 17 17 1 -3 +BITMAP +07F000 +180C00 +200200 +5FE100 +441100 +840880 +840880 +841080 +87E080 +841080 +840880 +840880 +441100 +5FE100 +200200 +180C00 +07F000 +ENDCHAR +STARTCHAR C040 +ENCODING 9400 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 17 17 1 -3 +BITMAP +07F000 +180C00 +200200 +41E900 +421900 +840880 +880880 +880080 +880080 +880080 +880880 +840880 +421100 +41E100 +200200 +180C00 +07F000 +ENDCHAR +STARTCHAR C040 +ENCODING 9401 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 17 17 1 -3 +BITMAP +07F000 +180C00 +200200 +5FC100 +443100 +841080 +840880 +840880 +840880 +840880 +840880 +841080 +443100 +5FC100 +200200 +180C00 +07F000 +ENDCHAR +STARTCHAR C040 +ENCODING 9402 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 17 17 1 -3 +BITMAP +07F000 +180C00 +200200 +5FF100 +441100 +841080 +845080 +844080 +87C080 +844880 +844880 +841080 +441100 +5FF100 +200200 +180C00 +07F000 +ENDCHAR +STARTCHAR C040 +ENCODING 9403 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 17 17 1 -3 +BITMAP +07F000 +180C00 +200200 +4FF900 +420900 +820880 +822880 +822080 +83E080 +822080 +822080 +820080 +420100 +4F8100 +200200 +180C00 +07F000 +ENDCHAR +STARTCHAR C040 +ENCODING 9404 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 17 17 1 -3 +BITMAP +07F000 +180C00 +200200 +43D100 +443100 +881080 +901080 +900080 +900080 +907880 +901080 +881080 +441100 +43F100 +200200 +180C00 +07F000 +ENDCHAR +STARTCHAR C040 +ENCODING 9405 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 17 17 1 -3 +BITMAP +07F000 +180C00 +200200 +5F7D00 +441100 +841080 +841080 +841080 +87F080 +841080 +841080 +841080 +441100 +5F7D00 +200200 +180C00 +07F000 +ENDCHAR +STARTCHAR C040 +ENCODING 9406 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 17 17 1 -3 +BITMAP +07F000 +180C00 +200200 +43E100 +408100 +808080 +808080 +808080 +808080 +808080 +808080 +808080 +408100 +43E100 +200200 +180C00 +07F000 +ENDCHAR +STARTCHAR C040 +ENCODING 9407 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 17 17 1 -3 +BITMAP +07F000 +180C00 +200200 +41F100 +404100 +804080 +804080 +804080 +804080 +804080 +804080 +804080 +424100 +438100 +200200 +180C00 +07F000 +ENDCHAR +STARTCHAR C040 +ENCODING 9408 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 17 17 1 -3 +BITMAP +07F000 +180C00 +200200 +5F3D00 +441100 +842080 +844080 +848080 +85C080 +864080 +842080 +842080 +441100 +5F3D00 +200200 +180C00 +07F000 +ENDCHAR +STARTCHAR C040 +ENCODING 9409 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 17 17 1 -3 +BITMAP +07F000 +180C00 +200200 +47C100 +410100 +810080 +810080 +810080 +810080 +810880 +810880 +810880 +411900 +47F900 +200200 +180C00 +07F000 +ENDCHAR +STARTCHAR C040 +ENCODING 9410 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 17 17 1 -3 +BITMAP +07F000 +180C00 +200200 +5C1D00 +4C1900 +8C1880 +8A2880 +8A2880 +8A4880 +894880 +894880 +888880 +488900 +5C9D00 +200200 +180C00 +07F000 +ENDCHAR +STARTCHAR C040 +ENCODING 9411 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 17 17 1 -3 +BITMAP +07F000 +180C00 +200200 +5C7D00 +461100 +861080 +851080 +851080 +849080 +845080 +845080 +843080 +443100 +5F1100 +200200 +180C00 +07F000 +ENDCHAR +STARTCHAR C040 +ENCODING 9412 +SWIDTH 2100 0 +DWIDTH 35 0 +BBX 17 17 1 -3 +BITMAP +07F000 +180C00 +200200 +43C100 +442100 +881080 +900880 +900880 +900880 +900880 +900880 +881080 +442100 +43C100 +200200 +180C00 +07F000 +ENDCHAR +STARTCHAR C040 +ENCODING 9413 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 17 17 1 -3 +BITMAP +07F000 +180C00 +200200 +4FF100 +421900 +820880 +820880 +821880 +83F080 +820080 +820080 +820080 +420100 +4F8100 +200200 +180C00 +07F000 +ENDCHAR +STARTCHAR C040 +ENCODING 9414 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 17 17 1 -3 +BITMAP +07F000 +180C00 +200200 +43C100 +442100 +881080 +900880 +900880 +900880 +900880 +900880 +8B9080 +466100 +43C100 +204A00 +183C00 +07F000 +ENDCHAR +STARTCHAR C040 +ENCODING 9415 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 17 17 1 -3 +BITMAP +07F000 +180C00 +200200 +4FE100 +421100 +820880 +820880 +821080 +83E080 +823080 +821080 +821080 +421100 +4F8F00 +200200 +180C00 +07F000 +ENDCHAR +STARTCHAR C040 +ENCODING 9416 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 17 17 1 -3 +BITMAP +07F000 +180C00 +200200 +43E100 +442100 +842080 +840080 +820080 +818080 +804080 +802080 +842080 +442100 +47C100 +200200 +180C00 +07F000 +ENDCHAR +STARTCHAR C040 +ENCODING 9417 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 17 17 1 -3 +BITMAP +07F000 +180C00 +200200 +4FF900 +488900 +888880 +888880 +808080 +808080 +808080 +808080 +808080 +408100 +43E100 +200200 +180C00 +07F000 +ENDCHAR +STARTCHAR C040 +ENCODING 9418 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 17 17 1 -3 +BITMAP +07F000 +180C00 +200200 +5F7D00 +441100 +841080 +841080 +841080 +841080 +841080 +841080 +841080 +422100 +41C100 +200200 +180C00 +07F000 +ENDCHAR +STARTCHAR C040 +ENCODING 9419 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 17 17 1 -3 +BITMAP +07F000 +180C00 +200200 +5E3D00 +441100 +841080 +822080 +822080 +822080 +814080 +814080 +814080 +408100 +408100 +200200 +180C00 +07F000 +ENDCHAR +STARTCHAR C040 +ENCODING 9420 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 17 17 1 -3 +BITMAP +07F000 +180C00 +200200 +400100 +788F00 +908480 +908480 +914480 +894880 +894880 +894880 +8A2880 +463100 +463100 +241200 +180C00 +07F000 +ENDCHAR +STARTCHAR C040 +ENCODING 9421 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 17 17 1 -3 +BITMAP +07F000 +180C00 +200200 +5E7900 +422100 +824080 +814080 +818080 +808080 +814080 +834080 +822080 +441100 +5E3D00 +200200 +180C00 +07F000 +ENDCHAR +STARTCHAR C040 +ENCODING 9422 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 17 17 1 -3 +BITMAP +07F000 +180C00 +200200 +5E3D00 +441100 +822080 +822080 +814080 +81C080 +808080 +808080 +808080 +408100 +43E100 +200200 +180C00 +07F000 +ENDCHAR +STARTCHAR C040 +ENCODING 9423 +SWIDTH 2100 0 +DWIDTH 35 0 +BBX 17 17 1 -3 +BITMAP +07F000 +180C00 +200200 +47F100 +462100 +842080 +844080 +804080 +808080 +811080 +811080 +821080 +423100 +47F100 +200200 +180C00 +07F000 +ENDCHAR +STARTCHAR C040 +ENCODING 9424 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 17 17 1 -3 +BITMAP +07F000 +180C00 +200200 +400100 +400100 +838080 +844080 +804080 +83C080 +844080 +844080 +83E080 +400100 +400100 +200200 +180C00 +07F000 +ENDCHAR +STARTCHAR C040 +ENCODING 9425 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 17 17 1 -3 +BITMAP +07F000 +180C00 +230200 +410100 +410100 +810080 +810080 +81E080 +811080 +811080 +811080 +811080 +411100 +41E100 +200200 +180C00 +07F000 +ENDCHAR +STARTCHAR C040 +ENCODING 9426 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 17 17 1 -3 +BITMAP +07F000 +180C00 +200200 +400100 +400100 +81C080 +822080 +820080 +820080 +820080 +822080 +81C080 +400100 +400100 +200200 +180C00 +07F000 +ENDCHAR +STARTCHAR C040 +ENCODING 9427 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 17 17 1 -3 +BITMAP +07F000 +180C00 +20C200 +404100 +404100 +804080 +804080 +83C080 +844080 +844080 +844080 +844080 +444100 +43E100 +200200 +180C00 +07F000 +ENDCHAR +STARTCHAR C040 +ENCODING 9428 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 17 17 1 -3 +BITMAP +07F000 +180C00 +200200 +400100 +400100 +81C080 +822080 +83E080 +820080 +820080 +822080 +81C080 +400100 +400100 +200200 +180C00 +07F000 +ENDCHAR +STARTCHAR C040 +ENCODING 9429 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 17 17 1 -3 +BITMAP +07F000 +180C00 +20E200 +412100 +410100 +810080 +810080 +83C080 +810080 +810080 +810080 +810080 +410100 +438100 +200200 +180C00 +07F000 +ENDCHAR +STARTCHAR C040 +ENCODING 9430 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 17 17 1 -3 +BITMAP +07F000 +180C00 +200200 +41F100 +422100 +822080 +822080 +83C080 +820080 +83E080 +841080 +841080 +441100 +43E100 +200200 +180C00 +07F000 +ENDCHAR +STARTCHAR C040 +ENCODING 9431 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 17 17 1 -3 +BITMAP +07F000 +180C00 +260200 +420100 +420100 +820080 +820080 +83C080 +822080 +822080 +822080 +822080 +422100 +477100 +200200 +180C00 +07F000 +ENDCHAR +STARTCHAR 0x24D8 +ENCODING 9432 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 17 17 1 -3 +BITMAP +07F000 +180C00 +200200 +418100 +418100 +800080 +800080 +818080 +808080 +808080 +808080 +808080 +408100 +41C100 +200200 +180C00 +07F000 +ENDCHAR +STARTCHAR C040 +ENCODING 9433 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 17 17 1 -3 +BITMAP +07F000 +180C00 +20C200 +40C100 +400100 +800080 +80C080 +804080 +804080 +804080 +804080 +804080 +404100 +424100 +238200 +180C00 +07F000 +ENDCHAR +STARTCHAR C040 +ENCODING 9434 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 17 17 1 -3 +BITMAP +07F000 +180C00 +260200 +420100 +420100 +820080 +820080 +82F080 +824080 +828080 +838080 +82C080 +424100 +477100 +200200 +180C00 +07F000 +ENDCHAR +STARTCHAR C040 +ENCODING 9435 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 17 17 1 -3 +BITMAP +07F000 +180C00 +218200 +408100 +408100 +808080 +808080 +808080 +808080 +808080 +808080 +808080 +408100 +41C100 +200200 +180C00 +07F000 +ENDCHAR +STARTCHAR C040 +ENCODING 9436 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 17 17 1 -3 +BITMAP +07F000 +180C00 +200200 +400100 +400100 +9F7080 +888880 +888880 +888880 +888880 +888880 +9DDC80 +400100 +400100 +200200 +180C00 +07F000 +ENDCHAR +STARTCHAR C040 +ENCODING 9437 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 17 17 1 -3 +BITMAP +07F000 +180C00 +200200 +400100 +400100 +87C080 +822080 +822080 +822080 +822080 +822080 +877080 +400100 +400100 +200200 +180C00 +07F000 +ENDCHAR +STARTCHAR C040 +ENCODING 9438 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 17 17 1 -3 +BITMAP +07F000 +180C00 +200200 +400100 +400100 +81C080 +822080 +822080 +822080 +822080 +822080 +81C080 +400100 +400100 +200200 +180C00 +07F000 +ENDCHAR +STARTCHAR C040 +ENCODING 9439 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 17 17 1 -3 +BITMAP +07F000 +180C00 +200200 +400100 +47C100 +822080 +822080 +822080 +822080 +822080 +83C080 +820080 +420100 +470100 +200200 +180C00 +07F000 +ENDCHAR +STARTCHAR C040 +ENCODING 9440 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 17 17 1 -3 +BITMAP +07F000 +180C00 +200200 +400100 +43C100 +844080 +844080 +844080 +844080 +844080 +83C080 +804080 +404100 +40E100 +200200 +180C00 +07F000 +ENDCHAR +STARTCHAR C040 +ENCODING 9441 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 17 17 1 -3 +BITMAP +07F000 +180C00 +200200 +400100 +400100 +834080 +81A080 +810080 +810080 +810080 +810080 +83C080 +400100 +400100 +200200 +180C00 +07F000 +ENDCHAR +STARTCHAR C040 +ENCODING 9442 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 17 17 1 -3 +BITMAP +07F000 +180C00 +200200 +400100 +400100 +81E080 +822080 +820080 +81C080 +802080 +822080 +83C080 +400100 +400100 +200200 +180C00 +07F000 +ENDCHAR +STARTCHAR C040 +ENCODING 9443 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 17 17 1 -3 +BITMAP +07F000 +180C00 +200200 +410100 +410100 +830080 +87C080 +810080 +810080 +810080 +812080 +812080 +40C100 +400100 +200200 +180C00 +07F000 +ENDCHAR +STARTCHAR C040 +ENCODING 9444 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 17 17 1 -3 +BITMAP +07F000 +180C00 +200200 +400100 +400100 +866080 +822080 +822080 +822080 +822080 +822080 +81F080 +400100 +400100 +200200 +180C00 +07F000 +ENDCHAR +STARTCHAR C040 +ENCODING 9445 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 17 17 1 -3 +BITMAP +07F000 +180C00 +200200 +400100 +400100 +873880 +812080 +812080 +812080 +80C080 +80C080 +80C080 +400100 +400100 +200200 +180C00 +07F000 +ENDCHAR +STARTCHAR C040 +ENCODING 9446 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 17 17 1 -3 +BITMAP +07F000 +180C00 +200200 +400100 +400100 +9DDC80 +849080 +855080 +855080 +855080 +836080 +822080 +400100 +400100 +200200 +180C00 +07F000 +ENDCHAR +STARTCHAR C040 +ENCODING 9447 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 17 17 1 -3 +BITMAP +07F000 +180C00 +200200 +400100 +400100 +8E7080 +824080 +818080 +818080 +818080 +824080 +8E7080 +400100 +400100 +200200 +180C00 +07F000 +ENDCHAR +STARTCHAR C040 +ENCODING 9448 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 17 17 1 -3 +BITMAP +07F000 +180C00 +200200 +400100 +473900 +812080 +812080 +812080 +80C080 +80C080 +80C080 +808080 +448100 +470100 +200200 +180C00 +07F000 +ENDCHAR +STARTCHAR C040 +ENCODING 9449 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 17 17 1 -3 +BITMAP +07F000 +180C00 +200200 +400100 +400100 +83E080 +824080 +824080 +808080 +812080 +812080 +83E080 +400100 +400100 +200200 +180C00 +07F000 +ENDCHAR +STARTCHAR C040 +ENCODING 9450 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 17 17 1 -3 +BITMAP +07F000 +180C00 +200200 +41C100 +414100 +822080 +822080 +822080 +822080 +822080 +822080 +822080 +414100 +41C100 +200200 +180C00 +07F000 +ENDCHAR +STARTCHAR char9632 +ENCODING 9632 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 9 1 1 +BITMAP +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +ENDCHAR +STARTCHAR char9632 +ENCODING 9633 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 9 1 1 +BITMAP +FF80 +8080 +8080 +8080 +8080 +8080 +8080 +8080 +FF80 +ENDCHAR +STARTCHAR char9632 +ENCODING 9634 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 9 1 1 +BITMAP +7F00 +8080 +8080 +8080 +8080 +8080 +8080 +8080 +7F00 +ENDCHAR +STARTCHAR char9632 +ENCODING 9635 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 9 1 1 +BITMAP +FF80 +8080 +BE80 +BE80 +BE80 +BE80 +BE80 +8080 +FF80 +ENDCHAR +STARTCHAR char9632 +ENCODING 9636 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 9 1 1 +BITMAP +FF80 +8080 +FF80 +8080 +FF80 +8080 +FF80 +8080 +FF80 +ENDCHAR +STARTCHAR char9632 +ENCODING 9637 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 9 1 1 +BITMAP +FF80 +AA80 +AA80 +AA80 +AA80 +AA80 +AA80 +AA80 +FF80 +ENDCHAR +STARTCHAR char9632 +ENCODING 9638 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 9 1 1 +BITMAP +FF80 +AA80 +FF80 +AA80 +FF80 +AA80 +FF80 +AA80 +FF80 +ENDCHAR +STARTCHAR char9632 +ENCODING 9639 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 9 1 1 +BITMAP +FF80 +9280 +C980 +A480 +9280 +C980 +A480 +9280 +FF80 +ENDCHAR +STARTCHAR char9632 +ENCODING 9640 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 9 1 1 +BITMAP +FF80 +A480 +C980 +9280 +A480 +C980 +9280 +A480 +FF80 +ENDCHAR +STARTCHAR char9632 +ENCODING 9641 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 9 1 1 +BITMAP +FF80 +D580 +AA80 +D580 +AA80 +D580 +AA80 +D580 +FF80 +ENDCHAR +STARTCHAR char9632 +ENCODING 9642 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 5 3 3 +BITMAP +F8 +F8 +F8 +F8 +F8 +ENDCHAR +STARTCHAR char9632 +ENCODING 9643 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 5 3 3 +BITMAP +F8 +88 +88 +88 +F8 +ENDCHAR +STARTCHAR char9632 +ENCODING 9644 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 10 5 1 3 +BITMAP +FFC0 +FFC0 +FFC0 +FFC0 +FFC0 +ENDCHAR +STARTCHAR char9632 +ENCODING 9645 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 10 5 1 3 +BITMAP +FFC0 +8040 +8040 +8040 +FFC0 +ENDCHAR +STARTCHAR char9632 +ENCODING 9646 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 10 1 0 +BITMAP +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +ENDCHAR +STARTCHAR char9632 +ENCODING 9647 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 10 1 0 +BITMAP +F8 +88 +88 +88 +88 +88 +88 +88 +88 +F8 +ENDCHAR +STARTCHAR char9632 +ENCODING 9648 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 12 5 1 3 +BITMAP +1FF0 +3FE0 +7FE0 +7FC0 +FF80 +ENDCHAR +STARTCHAR char9632 +ENCODING 9649 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 12 5 1 3 +BITMAP +1FF0 +2010 +4020 +8040 +FF80 +ENDCHAR +STARTCHAR char9650 +ENCODING 9650 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 10 1 1 +BITMAP +0800 +0800 +1C00 +1C00 +3E00 +3E00 +7F00 +7F00 +FF80 +FF80 +ENDCHAR +STARTCHAR char9650 +ENCODING 9651 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 10 1 1 +BITMAP +0800 +0800 +1400 +1400 +2200 +2200 +4100 +4100 +8080 +FF80 +ENDCHAR +STARTCHAR char9650 +ENCODING 9652 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 7 7 1 2 +BITMAP +10 +38 +38 +7C +7C +FE +FE +ENDCHAR +STARTCHAR char9650 +ENCODING 9653 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 7 7 1 2 +BITMAP +10 +28 +28 +44 +44 +82 +FE +ENDCHAR +STARTCHAR char9650 +ENCODING 9654 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 10 9 1 1 +BITMAP +C000 +F000 +FC00 +FF00 +FFC0 +FF00 +FC00 +F000 +C000 +ENDCHAR +STARTCHAR char9650 +ENCODING 9655 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 10 9 1 1 +BITMAP +C000 +B000 +8C00 +8300 +80C0 +8300 +8C00 +B000 +C000 +ENDCHAR +STARTCHAR char9650 +ENCODING 9656 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 7 7 1 2 +BITMAP +C0 +F0 +FC +FE +FC +F0 +C0 +ENDCHAR +STARTCHAR char9650 +ENCODING 9657 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 7 7 1 2 +BITMAP +C0 +B0 +8C +82 +8C +B0 +C0 +ENDCHAR +STARTCHAR char9650 +ENCODING 9658 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 10 5 1 3 +BITMAP +F000 +FF00 +FFC0 +FF00 +F000 +ENDCHAR +STARTCHAR char9650 +ENCODING 9659 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 10 5 1 3 +BITMAP +F000 +8F00 +80C0 +8F00 +F000 +ENDCHAR +STARTCHAR char9650 +ENCODING 9660 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 10 1 1 +BITMAP +FF80 +FF80 +7F00 +7F00 +3E00 +3E00 +1C00 +1C00 +0800 +0800 +ENDCHAR +STARTCHAR char9650 +ENCODING 9661 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 10 1 1 +BITMAP +FF80 +8080 +4100 +4100 +2200 +2200 +1400 +1400 +0800 +0800 +ENDCHAR +STARTCHAR char9650 +ENCODING 9662 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 7 7 1 2 +BITMAP +FE +FE +7C +7C +38 +38 +10 +ENDCHAR +STARTCHAR char9650 +ENCODING 9663 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 7 7 1 2 +BITMAP +FE +82 +44 +44 +28 +28 +10 +ENDCHAR +STARTCHAR char9650 +ENCODING 9664 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 10 9 1 1 +BITMAP +00C0 +03C0 +0FC0 +3FC0 +FFC0 +3FC0 +0FC0 +03C0 +00C0 +ENDCHAR +STARTCHAR char9650 +ENCODING 9665 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 10 9 1 1 +BITMAP +00C0 +0340 +0C40 +3040 +C040 +3040 +0C40 +0340 +00C0 +ENDCHAR +STARTCHAR char9650 +ENCODING 9666 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 7 7 1 2 +BITMAP +06 +1E +7E +FE +7E +1E +06 +ENDCHAR +STARTCHAR char9650 +ENCODING 9667 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 7 7 1 2 +BITMAP +06 +1A +62 +82 +62 +1A +06 +ENDCHAR +STARTCHAR char9650 +ENCODING 9668 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 10 5 1 3 +BITMAP +03C0 +3FC0 +FFC0 +3FC0 +03C0 +ENDCHAR +STARTCHAR char9650 +ENCODING 9669 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 10 5 1 3 +BITMAP +03C0 +3C40 +C040 +3C40 +03C0 +ENDCHAR +STARTCHAR char9670 +ENCODING 9670 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 9 1 1 +BITMAP +0800 +1C00 +3E00 +7F00 +FF80 +7F00 +3E00 +1C00 +0800 +ENDCHAR +STARTCHAR char9670 +ENCODING 9671 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 9 1 1 +BITMAP +0800 +1400 +2200 +4100 +8080 +4100 +2200 +1400 +0800 +ENDCHAR +STARTCHAR char9670 +ENCODING 9672 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 9 1 1 +BITMAP +0800 +1400 +2A00 +5D00 +BE80 +5D00 +2A00 +1400 +0800 +ENDCHAR +STARTCHAR char9670 +ENCODING 9673 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 9 1 1 +BITMAP +3E00 +4100 +9C80 +BE80 +BE80 +BE80 +9C80 +4100 +3E00 +ENDCHAR +STARTCHAR char9670 +ENCODING 9674 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 7 12 1 0 +BITMAP +10 +28 +28 +44 +44 +82 +82 +44 +44 +28 +28 +10 +ENDCHAR +STARTCHAR char9670 +ENCODING 9675 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 9 1 1 +BITMAP +3E00 +4100 +8080 +8080 +8080 +8080 +8080 +4100 +3E00 +ENDCHAR +STARTCHAR char9670 +ENCODING 9676 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 9 1 1 +BITMAP +3600 +0000 +8080 +8080 +0000 +8080 +8080 +0000 +3600 +ENDCHAR +STARTCHAR char9670 +ENCODING 9677 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 9 1 1 +BITMAP +3E00 +6B00 +AA80 +AA80 +AA80 +AA80 +AA80 +6B00 +3E00 +ENDCHAR +STARTCHAR char9670 +ENCODING 9678 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 9 1 1 +BITMAP +3E00 +4100 +9C80 +A280 +A280 +A280 +9C80 +4100 +3E00 +ENDCHAR +STARTCHAR char9670 +ENCODING 9679 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 9 1 1 +BITMAP +3E00 +7F00 +FF80 +FF80 +FF80 +FF80 +FF80 +7F00 +3E00 +ENDCHAR +STARTCHAR char9670 +ENCODING 9680 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 9 1 1 +BITMAP +3E00 +7100 +F080 +F080 +F080 +F080 +F080 +7100 +3E00 +ENDCHAR +STARTCHAR char9670 +ENCODING 9681 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 9 1 1 +BITMAP +3E00 +4700 +8780 +8780 +8780 +8780 +8780 +4700 +3E00 +ENDCHAR +STARTCHAR char9670 +ENCODING 9682 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 9 1 1 +BITMAP +3E00 +7F00 +FF80 +FF80 +8080 +8080 +8080 +4100 +3E00 +ENDCHAR +STARTCHAR char9670 +ENCODING 9683 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 9 1 1 +BITMAP +3E00 +4100 +8080 +8080 +8080 +FF80 +FF80 +7F00 +3E00 +ENDCHAR +STARTCHAR char9670 +ENCODING 9684 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 9 1 1 +BITMAP +3E00 +4F00 +8F80 +8F80 +8F80 +8080 +8080 +4100 +3E00 +ENDCHAR +STARTCHAR char9670 +ENCODING 9685 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 9 1 1 +BITMAP +3E00 +4700 +8780 +8780 +8780 +FF80 +FF80 +7F00 +3E00 +ENDCHAR +STARTCHAR char9670 +ENCODING 9686 +SWIDTH 300 0 +DWIDTH 5 0 +BBX 4 9 1 1 +BITMAP +30 +70 +F0 +F0 +F0 +F0 +F0 +70 +30 +ENDCHAR +STARTCHAR char9670 +ENCODING 9687 +SWIDTH 300 0 +DWIDTH 5 0 +BBX 4 9 1 1 +BITMAP +C0 +E0 +F0 +F0 +F0 +F0 +F0 +E0 +C0 +ENDCHAR +STARTCHAR char9632 +ENCODING 9688 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 9 1 1 +BITMAP +FF80 +FF80 +E380 +C180 +C180 +C180 +E380 +FF80 +FF80 +ENDCHAR +STARTCHAR char9632 +ENCODING 9689 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 9 1 1 +BITMAP +FF80 +E380 +DD80 +BE80 +BE80 +BE80 +DD80 +E380 +FF80 +ENDCHAR +STARTCHAR char9632 +ENCODING 9690 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 5 1 0 +BITMAP +FF80 +E380 +DD80 +BE80 +BE80 +ENDCHAR +STARTCHAR char9632 +ENCODING 9691 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 5 1 0 +BITMAP +BE80 +BE80 +DD80 +E380 +FF80 +ENDCHAR +STARTCHAR char9670 +ENCODING 9692 +SWIDTH 300 0 +DWIDTH 5 0 +BBX 5 5 0 0 +BITMAP +38 +40 +80 +80 +80 +ENDCHAR +STARTCHAR char9670 +ENCODING 9693 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +E0 +10 +08 +08 +08 +ENDCHAR +STARTCHAR char9670 +ENCODING 9694 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +08 +08 +08 +10 +E0 +ENDCHAR +STARTCHAR char9670 +ENCODING 9695 +SWIDTH 300 0 +DWIDTH 5 0 +BBX 5 5 0 0 +BITMAP +80 +80 +80 +40 +38 +ENDCHAR +STARTCHAR char9670 +ENCODING 9696 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 5 1 -1 +BITMAP +3E00 +4100 +8080 +8080 +8080 +ENDCHAR +STARTCHAR char9670 +ENCODING 9697 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 5 1 0 +BITMAP +8080 +8080 +8080 +4100 +3E00 +ENDCHAR +STARTCHAR char9632 +ENCODING 9698 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 9 1 1 +BITMAP +0080 +0180 +0380 +0780 +0F80 +1F80 +3F80 +7F80 +FF80 +ENDCHAR +STARTCHAR char9632 +ENCODING 9699 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 9 1 1 +BITMAP +8000 +C000 +E000 +F000 +F800 +FC00 +FE00 +FF00 +FF80 +ENDCHAR +STARTCHAR char9632 +ENCODING 9700 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 9 1 1 +BITMAP +FF80 +FF00 +FE00 +FC00 +F800 +F000 +E000 +C000 +8000 +ENDCHAR +STARTCHAR char9632 +ENCODING 9701 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 9 1 1 +BITMAP +FF80 +7F80 +3F80 +1F80 +0F80 +0780 +0380 +0180 +0080 +ENDCHAR +STARTCHAR char9670 +ENCODING 9702 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 7 7 1 2 +BITMAP +38 +44 +82 +82 +82 +44 +38 +ENDCHAR +STARTCHAR char9632 +ENCODING 9703 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 9 1 1 +BITMAP +FF80 +F080 +F080 +F080 +F080 +F080 +F080 +F080 +FF80 +ENDCHAR +STARTCHAR char9632 +ENCODING 9704 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 9 1 1 +BITMAP +FF80 +8780 +8780 +8780 +8780 +8780 +8780 +8780 +FF80 +ENDCHAR +STARTCHAR char9632 +ENCODING 9705 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 9 1 1 +BITMAP +FF80 +FF80 +FE80 +FC80 +F880 +F080 +E080 +C080 +FF80 +ENDCHAR +STARTCHAR char9632 +ENCODING 9706 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 9 1 1 +BITMAP +FF80 +8180 +8380 +8780 +8F80 +9F80 +BF80 +FF80 +FF80 +ENDCHAR +STARTCHAR char9632 +ENCODING 9707 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 9 1 1 +BITMAP +FF80 +8880 +8880 +8880 +8880 +8880 +8880 +8880 +FF80 +ENDCHAR +STARTCHAR char9650 +ENCODING 9708 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 10 1 1 +BITMAP +0800 +0800 +1400 +1400 +2200 +2A00 +5D00 +4900 +8080 +FF80 +ENDCHAR +STARTCHAR char9650 +ENCODING 9709 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 10 1 1 +BITMAP +0800 +0800 +1C00 +1C00 +3A00 +3A00 +7900 +7900 +F880 +FF80 +ENDCHAR +STARTCHAR char9650 +ENCODING 9710 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 10 1 1 +BITMAP +0800 +0800 +1C00 +1C00 +2E00 +2E00 +4F00 +4F00 +8F80 +FF80 +ENDCHAR +STARTCHAR char9670 +ENCODING 9711 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 10 10 1 0 +BITMAP +1E00 +6180 +4080 +8040 +8040 +8040 +8040 +4080 +6180 +1E00 +ENDCHAR +STARTCHAR char10049 +ENCODING 10049 +SWIDTH 840 0 +DWIDTH 14 0 +BBX 11 11 2 1 +BITMAP +1700 +2880 +4540 +B520 +8A40 +B5A0 +4A20 +95A0 +5440 +2280 +1D00 +ENDCHAR +STARTCHAR 3131 +ENCODING 12593 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 11 9 2 0 +BITMAP +FFE0 +6020 +0020 +0020 +0020 +0020 +0020 +0020 +0020 +ENDCHAR +STARTCHAR 3132 +ENCODING 12594 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 8 2 1 +BITMAP +FDF0 +0410 +0410 +0410 +0410 +0410 +0410 +0410 +ENDCHAR +STARTCHAR 3133 +ENCODING 12595 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 9 2 1 +BITMAP +0080 +F860 +0840 +0840 +08C0 +08A0 +0910 +0908 +0A08 +ENDCHAR +STARTCHAR 3134 +ENCODING 12596 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 7 3 2 +BITMAP +C000 +4000 +4000 +4000 +4000 +4060 +3FF0 +ENDCHAR +STARTCHAR 3135 +ENCODING 12597 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 9 2 0 +BITMAP +C3F8 +4140 +4060 +4040 +4060 +4490 +5908 +6208 +0400 +ENDCHAR +STARTCHAR 3136 +ENCODING 12598 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 10 2 0 +BITMAP +00F0 +C000 +400C +43F0 +4020 +40F0 +4108 +5D08 +6108 +00F0 +ENDCHAR +STARTCHAR 3137 +ENCODING 12599 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 8 3 2 +BITMAP +0040 +FFE0 +4000 +4000 +4000 +4000 +4070 +7FF0 +ENDCHAR +STARTCHAR 3138 +ENCODING 12600 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 8 2 1 +BITMAP +FDF0 +4100 +4100 +4100 +4100 +4300 +4D00 +71F8 +ENDCHAR +STARTCHAR 3139 +ENCODING 12601 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 9 3 1 +BITMAP +0040 +FFC0 +4040 +0040 +7FC0 +4000 +4000 +4060 +7FF0 +ENDCHAR +STARTCHAR 313A +ENCODING 12602 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 8 2 1 +BITMAP +FDF0 +0410 +0810 +FC10 +4010 +4010 +4210 +7C10 +ENDCHAR +STARTCHAR 313B +ENCODING 12603 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 8 2 1 +BITMAP +7CF8 +0488 +0888 +FC88 +4088 +4088 +42F8 +7C80 +ENDCHAR +STARTCHAR 313C +ENCODING 12604 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 10 2 1 +BITMAP +0010 +0208 +7D08 +0508 +09F8 +FD08 +4108 +4108 +43F8 +7D08 +ENDCHAR +STARTCHAR 313D +ENCODING 12605 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 9 2 1 +BITMAP +0040 +7C20 +0460 +0840 +FC40 +40A0 +4090 +4308 +7C08 +ENDCHAR +STARTCHAR 313E +ENCODING 12606 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 9 2 1 +BITMAP +0010 +7DF8 +0900 +0910 +FDF0 +4100 +4100 +4308 +7DF8 +ENDCHAR +STARTCHAR 313F +ENCODING 12607 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 8 2 1 +BITMAP +7FF8 +0410 +0810 +FD10 +4120 +40A0 +442C +7FF4 +ENDCHAR +STARTCHAR 3140 +ENCODING 12608 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 10 1 0 +BITMAP +FC70 +0800 +0800 +0BFE +78F0 +4188 +4108 +4508 +7888 +00F0 +ENDCHAR +STARTCHAR 3141 +ENCODING 12609 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 11 8 3 1 +BITMAP +FFE0 +4020 +4040 +4040 +4040 +4040 +7FC0 +4000 +ENDCHAR +STARTCHAR 3142 +ENCODING 12610 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 10 11 3 0 +BITMAP +00C0 +C040 +4040 +4040 +7FC0 +4040 +4040 +4040 +4040 +7FC0 +0040 +ENDCHAR +STARTCHAR 3143 +ENCODING 12611 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 11 2 0 +BITMAP +0018 +0988 +C488 +4488 +44F8 +7C88 +4488 +4488 +4488 +7CF8 +4488 +ENDCHAR +STARTCHAR 3144 +ENCODING 12612 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 11 2 0 +BITMAP +0C00 +C440 +4420 +4440 +7C40 +4440 +44A0 +4490 +4508 +7E08 +4000 +ENDCHAR +STARTCHAR 3145 +ENCODING 12613 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 9 3 1 +BITMAP +0800 +0600 +0400 +0C00 +0B00 +1080 +2060 +4020 +8010 +ENDCHAR +STARTCHAR 3146 +ENCODING 12614 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 9 2 1 +BITMAP +1040 +0860 +0860 +1040 +18C0 +27A0 +4110 +8208 +0008 +ENDCHAR +STARTCHAR 3147 +ENCODING 12615 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 9 9 4 1 +BITMAP +0800 +3E00 +4100 +8080 +8080 +8080 +8080 +4100 +3E00 +ENDCHAR +STARTCHAR 3148 +ENCODING 12616 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 11 9 3 1 +BITMAP +0040 +FFE0 +0600 +0600 +0E00 +0900 +10C0 +6060 +8020 +ENDCHAR +STARTCHAR 3149 +ENCODING 12617 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 9 2 1 +BITMAP +0008 +FEF0 +5860 +1840 +10C0 +28B0 +4508 +8204 +0400 +ENDCHAR +STARTCHAR 314A +ENCODING 12618 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 11 9 3 1 +BITMAP +1F00 +0000 +FFE0 +4400 +0400 +0A00 +1180 +2060 +C020 +ENDCHAR +STARTCHAR 314B +ENCODING 12619 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 10 10 3 1 +BITMAP +0040 +FFC0 +6040 +0040 +01C0 +1E40 +E040 +0080 +0080 +0080 +ENDCHAR +STARTCHAR 314C +ENCODING 12620 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 8 3 1 +BITMAP +FFE0 +4000 +4000 +7FC0 +4000 +4000 +4070 +7FF0 +ENDCHAR +STARTCHAR 314D +ENCODING 12621 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 9 2 1 +BITMAP +0030 +7FF0 +20C0 +0040 +10C0 +0880 +0890 +0BF8 +FC00 +ENDCHAR +STARTCHAR 314E +ENCODING 12622 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 10 2 0 +BITMAP +0F80 +0010 +FFF8 +0200 +0D00 +10C0 +1040 +1040 +18C0 +0F80 +ENDCHAR +STARTCHAR 314F +ENCODING 12623 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 6 14 7 -2 +BITMAP +C0 +40 +40 +40 +40 +44 +7C +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR 3150 +ENCODING 12624 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 6 15 6 -2 +BITMAP +1C +04 +C4 +44 +44 +44 +44 +44 +7C +44 +44 +44 +44 +44 +44 +ENDCHAR +STARTCHAR 3151 +ENCODING 12625 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 7 15 5 -2 +BITMAP +E0 +20 +20 +20 +24 +3E +20 +20 +20 +24 +3E +20 +20 +20 +20 +ENDCHAR +STARTCHAR 3152 +ENCODING 12626 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 8 14 4 -2 +BITMAP +C3 +21 +21 +21 +3F +21 +21 +21 +3F +21 +21 +21 +21 +01 +ENDCHAR +STARTCHAR 3153 +ENCODING 12627 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 6 15 5 -2 +BITMAP +10 +0C +04 +04 +04 +04 +04 +FC +04 +04 +04 +04 +04 +04 +04 +ENDCHAR +STARTCHAR 3154 +ENCODING 12628 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 9 15 3 -2 +BITMAP +0180 +0080 +0C80 +0480 +0480 +0480 +0480 +FC80 +0480 +0480 +0480 +0480 +0480 +0480 +0080 +ENDCHAR +STARTCHAR 3155 +ENCODING 12629 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 6 14 5 -2 +BITMAP +0C +04 +04 +04 +FC +44 +04 +04 +04 +FC +04 +04 +04 +04 +ENDCHAR +STARTCHAR 3156 +ENCODING 12630 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 9 15 3 -2 +BITMAP +0380 +0880 +0480 +0480 +0480 +FC80 +4480 +0480 +0480 +0480 +7C80 +0480 +0480 +0480 +0080 +ENDCHAR +STARTCHAR 3157 +ENCODING 12631 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 7 1 2 +BITMAP +0300 +0100 +0100 +0100 +0100 +010C +FFFE +ENDCHAR +STARTCHAR 3158 +ENCODING 12632 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -2 +BITMAP +00E0 +0020 +0020 +1C20 +0420 +0420 +0420 +043E +0420 +05E0 +FE20 +0020 +0020 +0020 +0020 +ENDCHAR +STARTCHAR 3159 +ENCODING 12633 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0190 +0090 +3090 +1090 +1090 +1090 +10F0 +1190 +1E90 +E090 +0090 +0090 +0090 +0010 +ENDCHAR +STARTCHAR 315A +ENCODING 12634 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 14 1 -2 +BITMAP +0030 +0010 +0810 +0410 +0410 +0410 +0410 +0410 +04F0 +FF10 +2010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR 315B +ENCODING 12635 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 7 2 2 +BITMAP +1860 +0860 +0840 +0840 +0840 +0840 +FFFE +ENDCHAR +STARTCHAR 315C +ENCODING 12636 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 12 1 -2 +BITMAP +0004 +FFFE +6100 +0100 +0100 +0100 +0100 +0100 +0100 +0100 +0100 +0100 +ENDCHAR +STARTCHAR 315D +ENCODING 12637 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 14 1 -2 +BITMAP +0018 +0008 +0008 +0008 +FF88 +2408 +0408 +0478 +0408 +0408 +0408 +0408 +0008 +0008 +ENDCHAR +STARTCHAR 315E +ENCODING 12638 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 1 -2 +BITMAP +0018 +0008 +0048 +0048 +0048 +0348 +FC48 +0848 +0BC8 +0848 +0848 +0848 +0048 +0008 +0008 +ENDCHAR +STARTCHAR 315F +ENCODING 12639 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0040 +0030 +0010 +0010 +0010 +00F0 +FF10 +0410 +0410 +0410 +0410 +0410 +0410 +0010 +0010 +ENDCHAR +STARTCHAR 3160 +ENCODING 12640 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 12 1 -2 +BITMAP +0006 +FFFE +6820 +0820 +0820 +0820 +0820 +0820 +0820 +0820 +0820 +0820 +ENDCHAR +STARTCHAR 3161 +ENCODING 12641 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 2 2 4 +BITMAP +001C +FFFC +ENDCHAR +STARTCHAR 3162 +ENCODING 12642 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 1 -2 +BITMAP +0040 +0030 +0010 +0010 +0010 +0010 +0010 +0010 +01F0 +FE10 +0010 +0010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR 3163 +ENCODING 12643 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 2 15 7 -2 +BITMAP +C0 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR 3164 +ENCODING 12644 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 0 0 0 0 +BITMAP +ENDCHAR +STARTCHAR 3165 +ENCODING 12645 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 9 2 1 +BITMAP +0300 +C100 +4100 +4100 +4100 +4100 +4500 +59F8 +2000 +ENDCHAR +STARTCHAR 3166 +ENCODING 12646 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 9 2 1 +BITMAP +0010 +C1F0 +4100 +4100 +4100 +4100 +4100 +5D18 +61F8 +ENDCHAR +STARTCHAR 3167 +ENCODING 12647 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 8 3 2 +BITMAP +0180 +8080 +8080 +8100 +8180 +8240 +9420 +E810 +ENDCHAR +STARTCHAR 3168 +ENCODING 12648 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 9 2 1 +BITMAP +00C0 +C040 +40C0 +40A0 +4120 +4110 +4508 +5A08 +63FC +ENDCHAR +STARTCHAR 3169 +ENCODING 12649 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 9 1 1 +BITMAP +FB90 +1098 +1090 +9090 +6090 +40A8 +40A4 +58C4 +6080 +ENDCHAR +STARTCHAR 316A +ENCODING 12650 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 9 2 1 +BITMAP +0018 +FFF8 +0900 +0900 +FD00 +4100 +4100 +4300 +7DFC +ENDCHAR +STARTCHAR 316B +ENCODING 12651 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 10 3 0 +BITMAP +0240 +F920 +2920 +2920 +EF20 +8960 +8950 +8998 +EF08 +0800 +ENDCHAR +STARTCHAR 316C +ENCODING 12652 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 9 2 1 +BITMAP +0040 +FC60 +0460 +0460 +7C90 +4090 +4108 +4508 +79F8 +ENDCHAR +STARTCHAR 316D +ENCODING 12653 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 9 1 1 +BITMAP +0004 +FDFE +4800 +0820 +F878 +4088 +4084 +4288 +7C78 +ENDCHAR +STARTCHAR 316E +ENCODING 12654 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 10 2 0 +BITMAP +0018 +0108 +FC88 +8888 +88F8 +8888 +8888 +8888 +F8F8 +8008 +ENDCHAR +STARTCHAR 316F +ENCODING 12655 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 9 2 1 +BITMAP +00C0 +F860 +8840 +8840 +88C0 +88A0 +8910 +FA08 +8408 +ENDCHAR +STARTCHAR 3170 +ENCODING 12656 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 8 2 1 +BITMAP +F840 +8860 +88A0 +88A0 +8890 +8910 +8908 +F9F8 +ENDCHAR +STARTCHAR 3171 +ENCODING 12657 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 8 12 5 -1 +BITMAP +FF +82 +82 +82 +FE +00 +7C +C6 +82 +82 +C6 +7C +ENDCHAR +STARTCHAR 3172 +ENCODING 12658 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 9 2 0 +BITMAP +CDF0 +4410 +4410 +7C10 +4410 +4410 +4410 +7C10 +0400 +ENDCHAR +STARTCHAR 3173 +ENCODING 12659 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 10 2 0 +BITMAP +0118 +CCE0 +4480 +4480 +7C80 +4480 +4480 +4488 +7CFC +4400 +ENDCHAR +STARTCHAR 3174 +ENCODING 12660 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 10 1 0 +BITMAP +1900 +C8BC +4884 +4884 +7984 +4944 +4A64 +4C24 +7C04 +4000 +ENDCHAR +STARTCHAR 3175 +ENCODING 12661 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 9 2 1 +BITMAP +3200 +91F8 +9240 +9240 +F240 +9540 +94C0 +98C0 +F838 +ENDCHAR +STARTCHAR 3176 +ENCODING 12662 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 10 2 0 +BITMAP +1800 +CBF8 +4840 +4840 +7840 +48A0 +4890 +4918 +7A08 +4400 +ENDCHAR +STARTCHAR 3177 +ENCODING 12663 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 10 2 0 +BITMAP +1018 +89F8 +8900 +8900 +F9F0 +8900 +8900 +8900 +F9F8 +8000 +ENDCHAR +STARTCHAR 3178 +ENCODING 12664 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 8 14 5 -2 +BITMAP +03 +81 +81 +FF +81 +81 +FF +81 +7C +C2 +82 +82 +C2 +7C +ENDCHAR +STARTCHAR 3179 +ENCODING 12665 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 14 2 -2 +BITMAP +C510 +4510 +7DF0 +4510 +4510 +45F0 +7D00 +4000 +0F80 +10C0 +1040 +1040 +10C0 +0F80 +ENDCHAR +STARTCHAR 317A +ENCODING 12666 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 9 2 1 +BITMAP +1000 +09F8 +0808 +1808 +1808 +2808 +2608 +4208 +8008 +ENDCHAR +STARTCHAR 317B +ENCODING 12667 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 9 1 1 +BITMAP +1800 +0C40 +0840 +0840 +1840 +1440 +2240 +4344 +807E +ENDCHAR +STARTCHAR 317C +ENCODING 12668 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 9 1 1 +BITMAP +1008 +0CFC +0880 +0880 +1880 +1480 +2280 +4280 +80FC +ENDCHAR +STARTCHAR 317D +ENCODING 12669 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 9 1 1 +BITMAP +198C +0C84 +0884 +08FC +1884 +1484 +2284 +43FC +8084 +ENDCHAR +STARTCHAR 317E +ENCODING 12670 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 10 1 0 +BITMAP +1000 +0DFC +0820 +0830 +1820 +1430 +2250 +428C +8084 +0100 +ENDCHAR +STARTCHAR 317F +ENCODING 12671 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 10 9 4 1 +BITMAP +0800 +0800 +1400 +1200 +2200 +4100 +4080 +8080 +FFC0 +ENDCHAR +STARTCHAR 3180 +ENCODING 12672 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 7 2 1 +BITMAP +78F0 +8988 +8508 +8508 +8508 +8D88 +78F0 +ENDCHAR +STARTCHAR 3181 +ENCODING 12673 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 7 9 5 1 +BITMAP +10 +10 +7C +C6 +82 +82 +82 +C6 +7C +ENDCHAR +STARTCHAR 3182 +ENCODING 12674 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 9 2 1 +BITMAP +30C0 +1060 +7840 +CC40 +84C0 +84A0 +8510 +CE08 +7808 +ENDCHAR +STARTCHAR 3183 +ENCODING 12675 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 9 2 1 +BITMAP +1040 +1040 +78A0 +CCA0 +8490 +8510 +8508 +CD08 +7BF8 +ENDCHAR +STARTCHAR 3184 +ENCODING 12676 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 11 13 3 -1 +BITMAP +0040 +7FE0 +0180 +1100 +1100 +0100 +FFE0 +1E00 +3180 +2080 +2080 +3180 +1F00 +ENDCHAR +STARTCHAR 3185 +ENCODING 12677 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 10 1 0 +BITMAP +1C38 +0000 +0202 +FEFE +0830 +3448 +4284 +4284 +66CC +3C78 +ENDCHAR +STARTCHAR 3186 +ENCODING 12678 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 11 11 3 0 +BITMAP +0060 +FFE0 +0000 +0000 +0000 +1F00 +3180 +2080 +2080 +3180 +1F00 +ENDCHAR +STARTCHAR 3187 +ENCODING 12679 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +0070 +0010 +0010 +0110 +1110 +111E +1110 +1110 +1170 +FE9E +0010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR 3188 +ENCODING 12680 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 11 14 3 -2 +BITMAP +00E0 +0160 +0960 +0560 +65E0 +2520 +2520 +25E0 +3F20 +C120 +0120 +0120 +0120 +0020 +ENDCHAR +STARTCHAR 3189 +ENCODING 12681 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 14 2 -2 +BITMAP +0030 +0010 +0010 +0110 +1110 +1110 +1110 +1110 +11F0 +FE10 +0010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR 318A +ENCODING 12682 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 11 14 3 -2 +BITMAP +0060 +0020 +0020 +0020 +7F20 +A420 +25E0 +2420 +2420 +25E0 +2420 +0420 +0020 +0020 +ENDCHAR +STARTCHAR 318B +ENCODING 12683 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 14 1 -2 +BITMAP +0018 +00C8 +0048 +0048 +00C8 +FF48 +13C8 +1248 +1248 +13C8 +1248 +0048 +0008 +0008 +ENDCHAR +STARTCHAR 318C +ENCODING 12684 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 14 2 -2 +BITMAP +0030 +0010 +0010 +0010 +00D0 +FF10 +1110 +1110 +1110 +1110 +1110 +1110 +0010 +0010 +ENDCHAR +STARTCHAR 318D +ENCODING 12685 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 3 3 7 4 +BITMAP +E0 +E0 +60 +ENDCHAR +STARTCHAR 318E +ENCODING 12686 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 9 14 4 -2 +BITMAP +0180 +0080 +0080 +0080 +6080 +E080 +6080 +0080 +0080 +0080 +0080 +0080 +0080 +0080 +ENDCHAR +STARTCHAR 3200 +ENCODING 12800 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +1010 +2008 +4004 +4004 +BFE2 +8022 +8022 +8022 +8022 +8022 +4024 +4024 +2008 +1010 +ENDCHAR +STARTCHAR 3201 +ENCODING 12801 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +0010 +0008 +2004 +4004 +7802 +8802 +8802 +8802 +8802 +883A +8FC4 +4004 +4008 +2010 +ENDCHAR +STARTCHAR 3202 +ENCODING 12802 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +1010 +2008 +4004 +4004 +9FF2 +8802 +8802 +8802 +8802 +8802 +4FF4 +4004 +2008 +1010 +ENDCHAR +STARTCHAR 3203 +ENCODING 12803 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +1010 +2008 +4004 +5FE4 +8022 +8022 +8FE2 +8802 +8802 +8802 +4FF4 +4004 +2008 +1010 +ENDCHAR +STARTCHAR 3204 +ENCODING 12804 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +1010 +2008 +4004 +4004 +9FF2 +8822 +8822 +8822 +8822 +8FE2 +4804 +4004 +2008 +1010 +ENDCHAR +STARTCHAR 3205 +ENCODING 12805 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +1010 +2008 +4004 +4064 +8822 +8822 +8FE2 +8822 +8822 +8822 +4FE4 +4824 +2008 +1010 +ENDCHAR +STARTCHAR 3206 +ENCODING 12806 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +1010 +2008 +4004 +4104 +8082 +8102 +8382 +8242 +8432 +8812 +5004 +4004 +2008 +1010 +ENDCHAR +STARTCHAR 3207 +ENCODING 12807 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +1000 +2008 +4104 +47C4 +8822 +9012 +9012 +9012 +9012 +8824 +47C4 +4008 +2000 +1000 +ENDCHAR +STARTCHAR 3208 +ENCODING 12808 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +1010 +2008 +4024 +5FF4 +8822 +8042 +8082 +8182 +8262 +8C32 +5004 +4004 +2008 +1010 +ENDCHAR +STARTCHAR 3209 +ENCODING 12809 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +1010 +2408 +43C4 +4004 +8022 +8FE2 +8042 +8182 +8242 +8C32 +7014 +4004 +2008 +1010 +ENDCHAR +STARTCHAR 320A +ENCODING 12810 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +1010 +2008 +4014 +4FF4 +8812 +8012 +80E2 +8F22 +8022 +8042 +4044 +4084 +2008 +1010 +ENDCHAR +STARTCHAR 320B +ENCODING 12811 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +1010 +2008 +4024 +4FE4 +8802 +8802 +8822 +8FE2 +8802 +8802 +4FFC +4004 +2008 +1010 +ENDCHAR +STARTCHAR 320C +ENCODING 12812 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +0010 +0008 +2004 +5FF4 +4002 +80C2 +8442 +8442 +8282 +8082 +BFFC +4004 +4008 +2010 +ENDCHAR +STARTCHAR 320D +ENCODING 12813 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +1010 +2008 +4004 +43C4 +8002 +9FFA +8102 +87C2 +8822 +8822 +4824 +47C4 +2008 +1010 +ENDCHAR +STARTCHAR 320E +ENCODING 12814 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +1010 +2068 +4024 +4024 +9FA2 +8122 +8122 +823E +8422 +8822 +7024 +4024 +2028 +1010 +ENDCHAR +STARTCHAR 320F +ENCODING 12815 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +1010 +2068 +4024 +6024 +9022 +9022 +9022 +903A +90A2 +9F22 +4024 +4024 +2028 +1010 +ENDCHAR +STARTCHAR 3210 +ENCODING 12816 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +1010 +2068 +4024 +4124 +9FA2 +9022 +9022 +903A +90A2 +9F22 +4024 +4024 +2028 +1010 +ENDCHAR +STARTCHAR 3211 +ENCODING 12817 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +1010 +2068 +4024 +4024 +BF22 +8122 +8122 +9F3A +9022 +9022 +53A4 +5C24 +2028 +1010 +ENDCHAR +STARTCHAR 3212 +ENCODING 12818 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +1010 +2068 +4024 +4024 +BF22 +9122 +9122 +913E +9F22 +9022 +4024 +4024 +2028 +1010 +ENDCHAR +STARTCHAR 3213 +ENCODING 12819 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +1010 +2068 +4024 +4324 +9122 +9122 +9F22 +913A +9122 +9F22 +5024 +4024 +2028 +1010 +ENDCHAR +STARTCHAR 3214 +ENCODING 12820 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +1010 +2068 +4024 +4624 +8222 +8422 +8422 +8B3E +91A2 +8022 +4024 +4024 +2028 +1010 +ENDCHAR +STARTCHAR 3215 +ENCODING 12821 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +1010 +2028 +4024 +4C24 +9E22 +A322 +A122 +A13A +B322 +9E22 +4024 +4024 +2028 +1010 +ENDCHAR +STARTCHAR 3216 +ENCODING 12822 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +1010 +2068 +4024 +4024 +9F22 +8222 +8422 +8A3A +91A2 +A022 +4024 +4024 +2028 +1010 +ENDCHAR +STARTCHAR 3217 +ENCODING 12823 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +1010 +2028 +4024 +4E24 +8022 +9F22 +8222 +843A +8B22 +90A2 +4024 +4024 +2028 +1010 +ENDCHAR +STARTCHAR 3218 +ENCODING 12824 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +1010 +2068 +4024 +4024 +9F22 +8122 +8222 +9E3E +8422 +8822 +5024 +4024 +2028 +1010 +ENDCHAR +STARTCHAR 3219 +ENCODING 12825 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +1010 +2068 +4024 +4024 +BF22 +9022 +9F22 +903E +9062 +9FA2 +4024 +4024 +2028 +1010 +ENDCHAR +STARTCHAR 321A +ENCODING 12826 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +1010 +2068 +4024 +41A4 +9E22 +9122 +8922 +893A +82A2 +BD22 +4024 +4024 +2028 +1010 +ENDCHAR +STARTCHAR 321B +ENCODING 12827 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +1000 +2060 +4028 +4E24 +8024 +BFA2 +8722 +88BA +88A2 +88A2 +4724 +4024 +2028 +1008 +ENDCHAR +STARTCHAR 321C +ENCODING 12828 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 13 1 -1 +BITMAP +0008 +5FE4 +80C4 +8182 +8282 +8C72 +9002 +BFFA +8102 +8102 +8104 +4104 +0108 +ENDCHAR +STARTCHAR 3260 +ENCODING 12896 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 16 1 -3 +BITMAP +07C0 +1830 +2008 +600C +4004 +9FF2 +8012 +8012 +8012 +8012 +8012 +4014 +601C +2018 +1830 +07C0 +ENDCHAR +STARTCHAR 3261 +ENCODING 12897 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 16 1 -3 +BITMAP +07C0 +1830 +2008 +600C +5804 +8802 +8802 +8802 +8802 +8812 +87FA +4004 +600C +2008 +1830 +07C0 +ENDCHAR +STARTCHAR 3262 +ENCODING 12898 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 16 1 -3 +BITMAP +07C0 +1830 +2008 +600C +4004 +8FF2 +8802 +8802 +8802 +8802 +8802 +4FF4 +600C +2008 +1830 +07C0 +ENDCHAR +STARTCHAR 3263 +ENCODING 12899 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 16 1 -3 +BITMAP +07C0 +1830 +2008 +400C +5FE4 +8022 +8022 +8FE2 +8802 +8802 +8802 +4FF4 +600C +2018 +1830 +07C0 +ENDCHAR +STARTCHAR 3264 +ENCODING 12900 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 16 1 -3 +BITMAP +07C0 +1830 +2008 +600C +4004 +9FF2 +8822 +8822 +8822 +8822 +8FE2 +4804 +600C +2008 +1830 +07C0 +ENDCHAR +STARTCHAR 3265 +ENCODING 12901 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 16 1 -3 +BITMAP +07C0 +1830 +2008 +606C +4824 +8822 +8FE2 +8822 +8822 +8822 +8FE2 +4824 +600C +2008 +1830 +07C0 +ENDCHAR +STARTCHAR 3266 +ENCODING 12902 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 16 1 -3 +BITMAP +07C0 +1830 +2008 +400C +4184 +8182 +8102 +8282 +8642 +8832 +9012 +4004 +600C +2008 +1830 +07C0 +ENDCHAR +STARTCHAR 3267 +ENCODING 12903 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 16 1 -3 +BITMAP +07C0 +1830 +2008 +600C +4104 +87C2 +8C32 +8812 +8812 +8812 +8C22 +47C4 +600C +2008 +1830 +07C0 +ENDCHAR +STARTCHAR 3268 +ENCODING 12904 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 16 1 -3 +BITMAP +07C0 +1830 +2008 +400C +4024 +9FF2 +8822 +8042 +80C2 +8182 +8262 +4C14 +600C +2008 +1830 +07C0 +ENDCHAR +STARTCHAR 3269 +ENCODING 12905 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 16 1 -3 +BITMAP +07C0 +1830 +2008 +440C +43C4 +8022 +9FF2 +8862 +80C2 +8182 +8242 +4C34 +600C +2008 +1830 +07C0 +ENDCHAR +STARTCHAR 326A +ENCODING 12906 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 16 1 -3 +BITMAP +07C0 +1830 +2008 +600C +4014 +9FF2 +8012 +8012 +80F2 +9F22 +8022 +4044 +604C +2088 +1830 +07C0 +ENDCHAR +STARTCHAR 326B +ENCODING 12907 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 16 1 -3 +BITMAP +07C0 +1830 +2008 +402C +4FE4 +8802 +8802 +8802 +8FE2 +8802 +8802 +4FFC +600C +2008 +1830 +07C0 +ENDCHAR +STARTCHAR 326C +ENCODING 12908 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 16 1 -3 +BITMAP +07C0 +1830 +2008 +600C +5FF4 +80C2 +8042 +8442 +8482 +8082 +BFFA +4004 +600C +2008 +1830 +07C0 +ENDCHAR +STARTCHAR 326D +ENCODING 12909 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 16 1 -3 +BITMAP +07C0 +1830 +2008 +400C +43C4 +8002 +BFFA +8102 +87C2 +8822 +8822 +4824 +67CC +2008 +1830 +07C0 +ENDCHAR +STARTCHAR 326E +ENCODING 12910 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 16 1 -3 +BITMAP +07C0 +1830 +2008 +402C +4024 +9F22 +8122 +8222 +843E +8822 +9022 +4024 +602C +2028 +1830 +07C0 +ENDCHAR +STARTCHAR 326F +ENCODING 12911 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 16 1 -3 +BITMAP +07C0 +1830 +2008 +602C +4024 +9022 +9022 +9022 +903A +93A2 +9C22 +4024 +602C +2028 +1830 +07C0 +ENDCHAR +STARTCHAR 3270 +ENCODING 12912 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 16 1 -3 +BITMAP +07C0 +1830 +2048 +602C +4024 +BF22 +9022 +9022 +903A +9062 +9FA2 +4024 +602C +2028 +1830 +07C0 +ENDCHAR +STARTCHAR 3271 +ENCODING 12913 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 16 1 -3 +BITMAP +07C0 +1830 +2008 +602C +4024 +9F22 +8122 +BF22 +903E +9022 +97A2 +5824 +602C +2028 +1830 +07C0 +ENDCHAR +STARTCHAR 3272 +ENCODING 12914 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 16 1 -3 +BITMAP +07C0 +1830 +2008 +402C +4024 +9F22 +9122 +9122 +923E +9F22 +9022 +4024 +602C +2028 +1830 +07C0 +ENDCHAR +STARTCHAR 3273 +ENCODING 12915 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 16 1 -3 +BITMAP +07C0 +1830 +2008 +402C +4324 +9122 +9122 +9F22 +913A +9122 +9F22 +5124 +602C +2028 +1830 +07C0 +ENDCHAR +STARTCHAR 3274 +ENCODING 12916 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 16 1 -3 +BITMAP +07C0 +1830 +2048 +602C +4424 +8222 +8422 +8422 +8B3A +9122 +A022 +4024 +602C +2028 +1830 +07C0 +ENDCHAR +STARTCHAR 3275 +ENCODING 12917 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 16 1 -3 +BITMAP +07C0 +1830 +2008 +402C +4824 +9E22 +A322 +A122 +A13E +A322 +9E22 +4024 +602C +2028 +1830 +07C0 +ENDCHAR +STARTCHAR 3276 +ENCODING 12918 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 16 1 -3 +BITMAP +07C0 +1830 +2008 +602C +4024 +BF22 +8222 +8622 +863E +8922 +B022 +4024 +602C +2028 +1830 +07C0 +ENDCHAR +STARTCHAR 3277 +ENCODING 12919 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 16 1 -3 +BITMAP +07C0 +1830 +2048 +602C +4624 +8022 +BF22 +8322 +823E +8622 +8922 +7024 +602C +2028 +1830 +07C0 +ENDCHAR +STARTCHAR 3278 +ENCODING 12920 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 16 1 -3 +BITMAP +07C0 +1830 +2048 +402C +4024 +9F22 +8122 +BE22 +823A +8422 +8822 +5024 +602C +2028 +1830 +07C0 +ENDCHAR +STARTCHAR 3279 +ENCODING 12921 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 16 1 -3 +BITMAP +07C0 +1830 +2008 +402C +4024 +BF22 +9022 +9F22 +903E +90A2 +9F22 +4024 +602C +2028 +1830 +07C0 +ENDCHAR +STARTCHAR 327A +ENCODING 12922 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 16 1 -3 +BITMAP +07C0 +1830 +2048 +602C +4124 +9E22 +9122 +892A +8A32 +83E2 +BC22 +4024 +602C +2028 +1830 +07C0 +ENDCHAR +STARTCHAR 327B +ENCODING 12923 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 16 1 -3 +BITMAP +07C0 +1830 +2048 +602C +4E24 +8022 +BFA2 +9E2A +B132 +A122 +B122 +5E24 +602C +2028 +1830 +07C0 +ENDCHAR +STARTCHAR 327F +ENCODING 12927 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 13 2 -1 +BITMAP +0FC0 +3060 +6010 +4888 +8908 +8A00 +EE3C +090C +8988 +C898 +6850 +3060 +0F80 +ENDCHAR +STARTCHAR AC00 +ENCODING 44032 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 2 -2 +BITMAP +0080 +0060 +0020 +FE20 +0220 +0420 +0420 +083E +1020 +1020 +6020 +8020 +0020 +0020 +0020 +ENDCHAR +STARTCHAR AC01 +ENCODING 44033 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 16 1 -3 +BITMAP +0040 +0030 +0010 +7F10 +0310 +0210 +041E +0810 +1010 +2000 +DFF0 +0010 +0010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR AC04 +ENCODING 44036 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 2 -2 +BITMAP +0060 +0020 +7E20 +0420 +0420 +0820 +103C +2020 +4020 +B820 +0800 +0800 +0800 +0FF0 +ENDCHAR +STARTCHAR AC07 +ENCODING 44039 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0060 +0020 +0020 +FE20 +0220 +043C +0820 +1020 +2020 +4020 +1FE0 +0800 +0800 +0800 +0FF0 +ENDCHAR +STARTCHAR AC08 +ENCODING 44040 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0060 +0020 +0020 +FE20 +0620 +043C +0820 +1020 +2000 +5FE0 +8020 +0020 +0FE0 +0800 +0FF0 +ENDCHAR +STARTCHAR AC09 +ENCODING 44041 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +00E0 +0020 +FE20 +0620 +0424 +0838 +1020 +2020 +4000 +7DE0 +0420 +7C20 +2020 +2220 +3C20 +ENDCHAR +STARTCHAR AC0A +ENCODING 44042 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 14 3 -2 +BITMAP +00C0 +FC40 +0C40 +0840 +1048 +2070 +4040 +8040 +7BC0 +0A40 +DA40 +6240 +47C0 +7A00 +ENDCHAR +STARTCHAR AC10 +ENCODING 44048 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 16 2 -3 +BITMAP +00C0 +0060 +0020 +FE20 +0620 +0420 +083C +1020 +2020 +4000 +9FE0 +0820 +0820 +0840 +0FE0 +0800 +ENDCHAR +STARTCHAR AC11 +ENCODING 44049 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 16 2 -3 +BITMAP +00C0 +0060 +0020 +FE20 +0620 +0420 +083C +1020 +2020 +5020 +8820 +0FE0 +0820 +0820 +0FE0 +0820 +ENDCHAR +STARTCHAR AC12 +ENCODING 44050 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 16 2 -3 +BITMAP +0080 +0060 +0020 +FE20 +0620 +0420 +083C +1020 +2020 +6260 +9220 +1E40 +1270 +1290 +1F08 +1200 +ENDCHAR +STARTCHAR AC13 +ENCODING 44051 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0060 +0020 +0020 +FE20 +0620 +043C +0820 +1020 +2020 +4120 +8100 +0380 +0660 +0830 +1010 +ENDCHAR +STARTCHAR AC14 +ENCODING 44052 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +00C0 +0060 +0020 +FE20 +0620 +0420 +083C +1020 +2020 +5840 +8860 +0840 +16A0 +2310 +4000 +ENDCHAR +STARTCHAR AC15 +ENCODING 44053 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0060 +0020 +0020 +FE20 +0620 +043C +0820 +1020 +2020 +4180 +8660 +0420 +0420 +0660 +03C0 +ENDCHAR +STARTCHAR AC16 +ENCODING 44054 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 16 2 -3 +BITMAP +00C0 +0060 +0020 +FE20 +0620 +0420 +083C +1020 +2020 +4000 +BFC0 +0300 +0680 +0860 +1010 +2000 +ENDCHAR +STARTCHAR AC17 +ENCODING 44055 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 16 2 -3 +BITMAP +00C0 +0020 +FE20 +0220 +0420 +082C +1030 +2020 +4380 +8000 +3FF0 +0100 +0280 +0470 +1818 +2000 +ENDCHAR +STARTCHAR AC19 +ENCODING 44057 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +00C0 +0060 +0020 +FE20 +0620 +0420 +083C +1020 +2020 +4000 +8FE0 +0800 +0FE0 +0800 +0FF0 +ENDCHAR +STARTCHAR AC1A +ENCODING 44058 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 16 2 -3 +BITMAP +00C0 +0060 +0020 +FE20 +0620 +0420 +083C +1020 +2020 +4000 +9FE0 +0840 +0440 +0480 +3FF0 +1800 +ENDCHAR +STARTCHAR AC1B +ENCODING 44059 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 3 -2 +BITMAP +0100 +00C0 +FE40 +0440 +0C40 +1840 +1070 +6040 +8040 +0740 +7E80 +0300 +0C80 +0880 +0700 +ENDCHAR +STARTCHAR AC1C +ENCODING 44060 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0190 +0090 +0090 +FC90 +0890 +0890 +10F0 +1090 +2090 +4090 +8090 +0090 +0090 +0010 +ENDCHAR +STARTCHAR AC1D +ENCODING 44061 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0030 +0110 +0090 +FC90 +0C90 +0890 +10F0 +1090 +2090 +4090 +1FF0 +0010 +0010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR AC20 +ENCODING 44064 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0110 +0090 +FC90 +0C90 +0890 +1890 +10F0 +2090 +4090 +9090 +0890 +0800 +0800 +0FF8 +ENDCHAR +STARTCHAR AC24 +ENCODING 44068 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0190 +0090 +FC90 +0C90 +0890 +10F0 +1090 +2090 +4090 +1FF0 +0020 +0FF0 +0800 +0FF0 +ENDCHAR +STARTCHAR AC2C +ENCODING 44076 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0030 +0190 +0090 +FC90 +0C90 +0890 +10F0 +1090 +2090 +4090 +0FF0 +0410 +0420 +0420 +07F0 +0400 +ENDCHAR +STARTCHAR AC2D +ENCODING 44077 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0030 +0190 +0090 +FC90 +0C90 +0890 +10F0 +1090 +2090 +48B0 +0410 +07F0 +0410 +0410 +07F0 +0410 +ENDCHAR +STARTCHAR AC2F +ENCODING 44079 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0090 +0090 +FC90 +0490 +0890 +10F0 +1090 +2090 +4190 +0080 +0180 +0260 +0410 +1808 +ENDCHAR +STARTCHAR AC30 +ENCODING 44080 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 14 2 -2 +BITMAP +0330 +0090 +FC90 +0490 +0890 +08F0 +1090 +2090 +44B0 +0420 +0C60 +0A50 +1088 +6100 +ENDCHAR +STARTCHAR AC31 +ENCODING 44081 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0030 +0190 +0090 +FC90 +0C90 +0890 +18F0 +1090 +2090 +4090 +03E0 +0630 +0410 +0410 +0630 +01E0 +ENDCHAR +STARTCHAR AC38 +ENCODING 44088 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +00E0 +0020 +0020 +FE20 +0220 +043C +0420 +0820 +1020 +102C +6030 +8020 +0020 +0020 +0020 +ENDCHAR +STARTCHAR AC39 +ENCODING 44089 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 16 2 -3 +BITMAP +0060 +0020 +FE20 +0620 +0438 +0820 +1820 +203C +4020 +8000 +3FE0 +1020 +0020 +0020 +0020 +0020 +ENDCHAR +STARTCHAR AC3C +ENCODING 44092 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 3 -2 +BITMAP +00C0 +0040 +0040 +FE40 +0478 +0840 +0840 +1040 +2078 +4040 +A040 +1000 +1000 +1020 +1FE0 +ENDCHAR +STARTCHAR AC40 +ENCODING 44096 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +00C0 +0060 +FE20 +0620 +042C +0830 +1020 +2020 +4038 +8020 +1FE0 +0020 +1FE0 +0800 +0FF0 +ENDCHAR +STARTCHAR AC4B +ENCODING 44107 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0060 +0020 +0020 +FE2C +0630 +0420 +0824 +1038 +2220 +4120 +0100 +0280 +0460 +0810 +1000 +ENDCHAR +STARTCHAR AC4D +ENCODING 44109 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0060 +0020 +FE20 +0620 +043C +0820 +1020 +202C +4130 +83A0 +0440 +0820 +0820 +0460 +0380 +ENDCHAR +STARTCHAR AC54 +ENCODING 44116 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 1 -2 +BITMAP +0018 +0088 +0088 +0088 +7E88 +06F8 +0488 +0488 +0888 +10F8 +1088 +2088 +C088 +0088 +0008 +ENDCHAR +STARTCHAR AC58 +ENCODING 44120 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 1 -2 +BITMAP +0098 +0048 +7E48 +0448 +0478 +0848 +1878 +1048 +6048 +8848 +0408 +0400 +0400 +07FC +ENDCHAR +STARTCHAR AC5C +ENCODING 44124 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0020 +0190 +0090 +FC90 +0CF0 +0890 +10F0 +2090 +4090 +9FE0 +0020 +1FE0 +0800 +0800 +0FF0 +ENDCHAR +STARTCHAR AC70 +ENCODING 44144 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0070 +0030 +0010 +FF10 +0210 +0610 +0410 +09F0 +0810 +1010 +2010 +C010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR AC71 +ENCODING 44145 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 1 -2 +BITMAP +0018 +0008 +4308 +3D08 +0208 +0278 +0408 +0808 +1008 +6FF8 +8408 +0008 +0008 +0008 +0008 +ENDCHAR +STARTCHAR AC74 +ENCODING 44148 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +0010 +7E10 +0210 +0410 +09F0 +0810 +1010 +6010 +B010 +0810 +0800 +0810 +0FF0 +ENDCHAR +STARTCHAR AC77 +ENCODING 44151 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +FE10 +0610 +0410 +09F0 +1810 +3010 +4010 +8020 +1FE0 +0800 +0800 +0800 +0FF0 +ENDCHAR +STARTCHAR AC78 +ENCODING 44152 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0020 +0010 +FE10 +0210 +0410 +0DF0 +0810 +1010 +2010 +C010 +1FF0 +0020 +1FF0 +0800 +0FF0 +ENDCHAR +STARTCHAR AC7A +ENCODING 44154 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0030 +0010 +7F10 +0210 +0410 +05F0 +0810 +1010 +6010 +8000 +3DE0 +0520 +3D20 +11E0 +1700 +0800 +ENDCHAR +STARTCHAR AC80 +ENCODING 44160 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0030 +0010 +FE10 +0210 +0410 +0DF0 +0810 +1010 +2010 +C000 +1FE0 +0820 +0820 +0840 +0FE0 +0800 +ENDCHAR +STARTCHAR AC81 +ENCODING 44161 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0030 +0010 +FE10 +0210 +0410 +0CF0 +0810 +1010 +2010 +C830 +0420 +07E0 +0420 +0420 +07E0 +0420 +ENDCHAR +STARTCHAR AC83 +ENCODING 44163 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0010 +FF10 +0210 +0410 +0DF0 +0810 +1010 +2010 +C110 +0100 +0380 +0660 +0C30 +1018 +ENDCHAR +STARTCHAR AC84 +ENCODING 44164 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0010 +FE10 +0610 +05F0 +0810 +1810 +1010 +6040 +8420 +0420 +0A60 +1290 +2108 +4200 +ENDCHAR +STARTCHAR AC85 +ENCODING 44165 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0030 +0010 +FF10 +0210 +0410 +0DF0 +0810 +1010 +2010 +C010 +0080 +0360 +0410 +0410 +0630 +03E0 +ENDCHAR +STARTCHAR AC86 +ENCODING 44166 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 16 1 -3 +BITMAP +0018 +0008 +4308 +3D08 +0208 +0278 +0408 +0808 +1000 +6018 +8FF8 +00C0 +00C0 +0130 +0208 +0C04 +ENDCHAR +STARTCHAR AC89 +ENCODING 44169 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +FE10 +0210 +0410 +09F0 +0810 +1010 +6010 +8000 +0FE0 +0820 +0FE0 +0800 +07F0 +ENDCHAR +STARTCHAR AC8A +ENCODING 44170 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0010 +FE10 +0210 +0410 +0DF0 +0810 +1010 +2030 +DFF0 +0000 +0060 +0440 +0440 +3FF8 +ENDCHAR +STARTCHAR AC8B +ENCODING 44171 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +0210 +7E10 +0410 +0CF0 +0810 +1010 +6010 +83D0 +1F20 +01C0 +0220 +0260 +03C0 +ENDCHAR +STARTCHAR AC8C +ENCODING 44172 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0060 +0030 +0190 +0090 +FC90 +0890 +0890 +0F90 +1090 +2090 +2090 +4090 +0090 +0090 +0090 +ENDCHAR +STARTCHAR AC90 +ENCODING 44176 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0110 +0090 +FC90 +0490 +0890 +0F90 +1090 +2090 +4090 +9090 +0890 +0800 +0800 +0FF8 +ENDCHAR +STARTCHAR AC94 +ENCODING 44180 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 11 15 3 -2 +BITMAP +0060 +0220 +0120 +F920 +1920 +1120 +3F20 +2120 +4120 +BFC0 +0040 +0040 +3FC0 +1000 +1FE0 +ENDCHAR +STARTCHAR AC9C +ENCODING 44188 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0030 +0010 +0090 +0490 +7C90 +0890 +0F90 +1090 +2090 +4080 +8FF0 +0420 +0420 +0420 +07F0 +0400 +ENDCHAR +STARTCHAR AC9D +ENCODING 44189 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0030 +0110 +0090 +FC90 +0490 +0890 +0F90 +1090 +2080 +48B0 +8410 +07F0 +0410 +0410 +07F0 +0410 +ENDCHAR +STARTCHAR AC9F +ENCODING 44191 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 3 -2 +BITMAP +0060 +0220 +0120 +F920 +1920 +1120 +3F20 +2120 +4120 +8620 +0100 +0300 +0480 +0860 +3010 +ENDCHAR +STARTCHAR ACA0 +ENCODING 44192 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0110 +0090 +FC90 +0490 +0890 +1F90 +1090 +2090 +4000 +0430 +0420 +0A50 +1288 +2108 +ENDCHAR +STARTCHAR ACA1 +ENCODING 44193 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0110 +0090 +FC90 +0490 +0890 +0F90 +1090 +2090 +43C0 +8660 +0420 +0420 +0660 +03C0 +ENDCHAR +STARTCHAR ACA8 +ENCODING 44200 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +0010 +7E10 +03F0 +0410 +0410 +0810 +11F0 +2010 +4010 +8010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR ACA9 +ENCODING 44201 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0060 +0030 +FE10 +0210 +04F0 +0410 +0810 +11F0 +2010 +DFF0 +0010 +0010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR ACAA +ENCODING 44202 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 1 -2 +BITMAP +0030 +0018 +4308 +3D08 +0278 +0208 +0408 +08F8 +1008 +6008 +8F78 +0108 +0108 +0108 +0108 +ENDCHAR +STARTCHAR ACAC +ENCODING 44204 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 3 -2 +BITMAP +0060 +0020 +0020 +FE20 +05E0 +0820 +0820 +1020 +21E0 +4020 +B820 +0800 +0800 +0810 +0FF0 +ENDCHAR +STARTCHAR ACAF +ENCODING 44207 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 14 2 -1 +BITMAP +0030 +0010 +7F10 +0230 +07F0 +0410 +0810 +11F0 +2010 +C020 +1FE0 +0800 +0810 +0FF0 +ENDCHAR +STARTCHAR ACB0 +ENCODING 44208 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0060 +0030 +FE10 +0610 +04F0 +0810 +1810 +33F0 +4010 +8010 +1FE0 +0020 +1FE0 +0800 +0FF8 +ENDCHAR +STARTCHAR ACB8 +ENCODING 44216 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 11 16 3 -3 +BITMAP +00C0 +0060 +FE20 +0420 +07E0 +0820 +1020 +2020 +43E0 +8020 +1FE0 +0820 +0840 +0840 +0FE0 +0800 +ENDCHAR +STARTCHAR ACB9 +ENCODING 44217 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0060 +0030 +FE10 +0210 +04F0 +0C10 +0810 +11F0 +2010 +C810 +0410 +07F0 +0410 +0410 +07F0 +0410 +ENDCHAR +STARTCHAR ACBB +ENCODING 44219 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0010 +FF10 +0270 +03F0 +0410 +0C10 +0810 +11F0 +6110 +0190 +0190 +0240 +0430 +1818 +ENDCHAR +STARTCHAR ACBC +ENCODING 44220 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0060 +0030 +FE10 +0210 +04F0 +0C10 +0810 +11F0 +2010 +C070 +0C30 +0820 +1E50 +1288 +6108 +ENDCHAR +STARTCHAR ACBD +ENCODING 44221 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0060 +0030 +FE10 +0210 +04F0 +0C10 +0810 +11F0 +2010 +C090 +0360 +0410 +0410 +0630 +03E0 +ENDCHAR +STARTCHAR ACC1 +ENCODING 44225 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0060 +0030 +FE10 +0210 +04F0 +0C10 +0810 +11F0 +2010 +C000 +07F0 +0400 +07F0 +0400 +07F8 +ENDCHAR +STARTCHAR ACC4 +ENCODING 44228 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +0190 +0490 +7C90 +0F90 +0890 +0890 +1790 +2090 +4090 +8090 +0090 +0090 +0010 +ENDCHAR +STARTCHAR ACC8 +ENCODING 44232 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 3 -2 +BITMAP +0060 +0220 +0120 +F920 +0920 +1720 +3120 +2F20 +4120 +8120 +6120 +1020 +1000 +1000 +1FF0 +ENDCHAR +STARTCHAR ACCC +ENCODING 44236 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 11 15 3 -2 +BITMAP +0060 +0220 +0120 +F920 +0920 +1720 +1120 +2F20 +7FC0 +8040 +0040 +3FC0 +1000 +1000 +1FE0 +ENDCHAR +STARTCHAR ACD5 +ENCODING 44245 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0030 +0010 +0090 +FC90 +0490 +0B90 +0890 +1790 +2090 +48B0 +0410 +07F0 +0410 +0410 +07F0 +0410 +ENDCHAR +STARTCHAR ACD7 +ENCODING 44247 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0060 +0030 +0090 +FC90 +0490 +0B90 +1890 +1790 +2090 +4190 +8090 +0180 +0240 +0430 +1808 +ENDCHAR +STARTCHAR ACE0 +ENCODING 44256 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 10 2 0 +BITMAP +7FF0 +0030 +0020 +0020 +0620 +0240 +0240 +0200 +0200 +FFFC +ENDCHAR +STARTCHAR ACE1 +ENCODING 44257 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +0018 +1FF8 +0010 +0310 +0100 +0100 +FFFE +0000 +00F0 +1F10 +0010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR ACE4 +ENCODING 44260 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 13 1 -2 +BITMAP +3FF8 +0008 +0010 +0310 +0110 +0100 +FFFE +0000 +0000 +1800 +0800 +0800 +0FF8 +ENDCHAR +STARTCHAR ACE7 +ENCODING 44263 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +0018 +1FF8 +0010 +0310 +0100 +0100 +FFFE +2000 +0000 +1FE0 +0800 +0800 +0800 +0FF8 +ENDCHAR +STARTCHAR ACE8 +ENCODING 44264 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +0018 +1FF8 +0010 +0310 +0100 +0100 +FFFE +2000 +0000 +1FE0 +0020 +1FF0 +0800 +0FF0 +ENDCHAR +STARTCHAR ACEA +ENCODING 44266 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -3 +BITMAP +3FF8 +0010 +0010 +0310 +0100 +0100 +FFFE +0000 +0000 +1EF8 +0288 +3690 +1890 +13F0 +1C80 +ENDCHAR +STARTCHAR ACEC +ENCODING 44268 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +0018 +1FF8 +0310 +0110 +0100 +01FE +FF00 +0000 +1E10 +0230 +3E30 +1048 +1284 +1C00 +ENDCHAR +STARTCHAR ACEF +ENCODING 44271 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +1FF8 +0010 +0010 +0110 +0100 +FFFE +0000 +00F0 +1E00 +02F8 +1ED0 +1088 +1688 +0870 +ENDCHAR +STARTCHAR ACF0 +ENCODING 44272 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -3 +BITMAP +0038 +1FD8 +0010 +0310 +0100 +0100 +FFFE +2000 +0000 +1FE0 +0820 +0820 +0820 +0FE0 +0800 +ENDCHAR +STARTCHAR ACF1 +ENCODING 44273 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -3 +BITMAP +0038 +1FD8 +0010 +0310 +0100 +0100 +FFFE +0000 +1060 +0820 +0FE0 +0820 +0820 +0FE0 +0820 +ENDCHAR +STARTCHAR ACF3 +ENCODING 44275 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -3 +BITMAP +2078 +1F98 +0010 +0310 +0100 +0100 +FFFE +0000 +0200 +0100 +0300 +06C0 +0830 +1010 +2000 +ENDCHAR +STARTCHAR ACF5 +ENCODING 44277 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +0018 +1FF8 +0010 +0310 +0100 +0100 +FFFE +0000 +0100 +06C0 +0820 +0820 +0C60 +07C0 +ENDCHAR +STARTCHAR ACF6 +ENCODING 44278 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +0018 +1FF8 +0010 +0310 +0100 +0100 +FFFE +2000 +3FF8 +0100 +0380 +0660 +0810 +3008 +ENDCHAR +STARTCHAR ACFC +ENCODING 44284 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0060 +0020 +0020 +7F20 +0120 +0120 +1220 +0A3C +0820 +0BE0 +F420 +0020 +0020 +0020 +0020 +ENDCHAR +STARTCHAR ACFD +ENCODING 44285 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 16 1 -3 +BITMAP +0030 +0010 +7F90 +0110 +1910 +0912 +087C +FF90 +0010 +0000 +0FF0 +0010 +0010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR AD00 +ENCODING 44288 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0060 +0020 +0020 +7F20 +0120 +3220 +122C +10F0 +FF20 +0020 +0020 +0800 +0800 +0800 +0FF8 +ENDCHAR +STARTCHAR AD04 +ENCODING 44292 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0060 +0020 +7F20 +0120 +3220 +122C +10F0 +FF20 +0020 +0000 +1FE0 +0040 +1FE0 +0800 +0FF0 +ENDCHAR +STARTCHAR AD06 +ENCODING 44294 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 2 -2 +BITMAP +0060 +7F20 +0120 +0220 +1220 +102C +13F0 +FC20 +7C30 +05D0 +7D20 +2120 +3DE0 +0100 +ENDCHAR +STARTCHAR AD0C +ENCODING 44300 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0060 +0020 +7F20 +0120 +1220 +123C +13E0 +FC20 +0000 +0FE0 +0820 +0820 +0840 +0FE0 +0800 +ENDCHAR +STARTCHAR AD0D +ENCODING 44301 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0060 +0020 +7F20 +0120 +3220 +122C +11F0 +FE20 +0000 +1020 +0820 +0FE0 +0820 +0FE0 +0820 +ENDCHAR +STARTCHAR AD0F +ENCODING 44303 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0060 +0020 +FF20 +0120 +2120 +1220 +127C +1FA0 +E020 +0300 +0100 +0380 +0240 +0C30 +1010 +ENDCHAR +STARTCHAR AD11 +ENCODING 44305 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -2 +BITMAP +0030 +0010 +3F90 +0090 +0110 +0916 +0838 +DFD0 +2010 +0080 +03E0 +0630 +0410 +0630 +03E0 +ENDCHAR +STARTCHAR AD18 +ENCODING 44312 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 11 15 3 -2 +BITMAP +0080 +0260 +0120 +0120 +F920 +0920 +4920 +29E0 +2120 +3F20 +C120 +0120 +0120 +0120 +0020 +ENDCHAR +STARTCHAR AD1C +ENCODING 44316 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 1 -2 +BITMAP +0018 +0088 +0048 +7F48 +0248 +0248 +1A48 +0878 +09C8 +FE48 +0848 +0448 +0400 +0400 +03FC +ENDCHAR +STARTCHAR AD20 +ENCODING 44320 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 14 2 -2 +BITMAP +01B0 +0090 +FC90 +0490 +3490 +14F0 +1390 +FC90 +0090 +1FE0 +0020 +1FE0 +0800 +0FF0 +ENDCHAR +STARTCHAR AD29 +ENCODING 44329 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0030 +0190 +0090 +FE90 +0490 +3490 +14F0 +1390 +FC90 +0CB0 +0420 +07E0 +0420 +0420 +07E0 +0420 +ENDCHAR +STARTCHAR AD2C +ENCODING 44332 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 16 2 -3 +BITMAP +0030 +0190 +0090 +FC90 +0490 +3490 +14F0 +1390 +FC90 +00D0 +0C20 +0840 +0C60 +1298 +2108 +C000 +ENDCHAR +STARTCHAR AD2D +ENCODING 44333 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0090 +0090 +FE90 +0490 +3490 +14F0 +1790 +F890 +0090 +03E0 +0630 +0410 +0630 +03E0 +ENDCHAR +STARTCHAR AD34 +ENCODING 44340 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 11 15 3 -2 +BITMAP +0060 +0020 +0020 +FF20 +0220 +0220 +1220 +1420 +10E0 +3F20 +C020 +0020 +0020 +0020 +0020 +ENDCHAR +STARTCHAR AD35 +ENCODING 44341 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0030 +0010 +3F90 +0090 +1910 +0910 +0870 +FF90 +0010 +0000 +1FF0 +0810 +0010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR AD38 +ENCODING 44344 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0010 +0010 +7F90 +0110 +1910 +0910 +08F0 +FF10 +0010 +0010 +1800 +0800 +0800 +07F8 +ENDCHAR +STARTCHAR AD3C +ENCODING 44348 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 3 -2 +BITMAP +0060 +0020 +FF20 +0220 +3220 +1220 +11E0 +FE20 +0000 +3FC0 +0040 +3FC0 +1000 +1000 +1FF0 +ENDCHAR +STARTCHAR AD44 +ENCODING 44356 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0030 +0010 +7F90 +0090 +1910 +0910 +0870 +FF90 +0010 +0000 +0BF0 +0410 +0420 +0420 +07F0 +0400 +ENDCHAR +STARTCHAR AD45 +ENCODING 44357 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0030 +0010 +7F90 +0110 +1110 +0910 +0870 +FF90 +0010 +0C10 +0410 +07F0 +0410 +0410 +07F0 +0410 +ENDCHAR +STARTCHAR AD47 +ENCODING 44359 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0010 +7F90 +0110 +0110 +0910 +0810 +09F0 +FE10 +0010 +0180 +0180 +0240 +0430 +1808 +ENDCHAR +STARTCHAR AD49 +ENCODING 44361 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 11 15 3 -2 +BITMAP +0060 +0020 +FF20 +0220 +0220 +1220 +1020 +1FE0 +E020 +0120 +06C0 +0820 +0820 +0C60 +07C0 +ENDCHAR +STARTCHAR AD50 +ENCODING 44368 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 10 1 0 +BITMAP +3FF8 +0008 +0008 +0010 +0990 +0490 +0490 +0480 +0480 +FFFE +ENDCHAR +STARTCHAR AD54 +ENCODING 44372 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 12 1 -1 +BITMAP +1FF8 +0008 +0010 +0850 +0440 +0444 +FFFE +1000 +0800 +0800 +0800 +07F8 +ENDCHAR +STARTCHAR AD58 +ENCODING 44376 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 13 2 -1 +BITMAP +3FF0 +0020 +01A0 +09A0 +0900 +FFFC +0000 +3FE0 +0020 +0040 +1FE0 +1000 +0FF0 +ENDCHAR +STARTCHAR AD61 +ENCODING 44385 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 13 2 -2 +BITMAP +3FF0 +01A0 +09A0 +0920 +FFFC +0000 +3040 +1040 +1FC0 +1040 +1040 +1FC0 +1040 +ENDCHAR +STARTCHAR AD63 +ENCODING 44387 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 13 1 -2 +BITMAP +1FF8 +0008 +0010 +0850 +0450 +0440 +FFFE +0100 +0100 +0380 +0660 +0818 +1008 +ENDCHAR +STARTCHAR AD6C +ENCODING 44396 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 13 1 -2 +BITMAP +1FF8 +0010 +0010 +0020 +0020 +FFDE +0120 +0100 +0100 +0100 +0100 +0100 +0100 +ENDCHAR +STARTCHAR AD6D +ENCODING 44397 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +1FE0 +0010 +0010 +0020 +0020 +FFFE +0100 +0100 +3FE0 +0020 +0020 +0020 +0020 +0020 +ENDCHAR +STARTCHAR AD70 +ENCODING 44400 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 13 1 -2 +BITMAP +1FF0 +0010 +0010 +0020 +0020 +FFDE +0120 +0100 +1900 +0900 +0800 +0800 +07F8 +ENDCHAR +STARTCHAR AD73 +ENCODING 44403 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 13 1 -2 +BITMAP +1FF8 +0010 +0010 +0020 +FFFE +0100 +0100 +0100 +1FF0 +0800 +0800 +0800 +0FF0 +ENDCHAR +STARTCHAR AD74 +ENCODING 44404 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +1FE0 +0010 +0010 +0010 +0020 +FFFE +0100 +0100 +1F20 +00E0 +0020 +1FF0 +0800 +0FF8 +ENDCHAR +STARTCHAR AD75 +ENCODING 44405 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 13 1 -2 +BITMAP +1FF8 +0010 +0010 +0010 +0020 +FFFE +0100 +1F30 +0250 +3E10 +1010 +1310 +1C10 +ENDCHAR +STARTCHAR AD76 +ENCODING 44406 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 13 1 -2 +BITMAP +1FF8 +0010 +0010 +0020 +FFFE +0100 +0100 +1EF8 +0248 +1E48 +1048 +1E78 +0040 +ENDCHAR +STARTCHAR AD7B +ENCODING 44411 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +1FF8 +0010 +0010 +0020 +FFFE +0100 +0160 +1E10 +03FC +3620 +18D8 +1188 +1EC8 +0070 +ENDCHAR +STARTCHAR AD7C +ENCODING 44412 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +1FF0 +0010 +0010 +0020 +0020 +FFFE +0100 +0100 +0100 +0FE0 +0820 +0820 +0FE0 +0800 +ENDCHAR +STARTCHAR AD7D +ENCODING 44413 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +1FF8 +0010 +0010 +0020 +0020 +FFFE +0100 +0100 +0960 +0420 +07E0 +0420 +07E0 +0420 +ENDCHAR +STARTCHAR AD7F +ENCODING 44415 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -3 +BITMAP +1FF8 +0010 +0010 +0020 +0020 +FFFE +0100 +0100 +0300 +0100 +0280 +0460 +1810 +2000 +ENDCHAR +STARTCHAR AD81 +ENCODING 44417 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 13 1 -2 +BITMAP +1FF0 +0010 +0020 +0020 +03FE +FF00 +0100 +0100 +07C0 +0C60 +0820 +0C60 +07C0 +ENDCHAR +STARTCHAR AD82 +ENCODING 44418 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +3FF0 +0010 +0010 +0020 +0020 +FFFE +0100 +0100 +01F8 +1F00 +0300 +06C0 +0830 +3008 +ENDCHAR +STARTCHAR AD88 +ENCODING 44424 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +FF10 +0310 +0210 +0210 +0210 +0F10 +F810 +09F0 +0810 +0810 +0810 +0810 +0010 +ENDCHAR +STARTCHAR AD89 +ENCODING 44425 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0030 +0010 +FF10 +0210 +0210 +0310 +FC10 +08F0 +0810 +0800 +1FF0 +0010 +0010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR AD8C +ENCODING 44428 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0010 +0010 +3F10 +0110 +0210 +0390 +FC10 +09F0 +0810 +0010 +0C00 +0400 +0400 +03F8 +ENDCHAR +STARTCHAR AD90 +ENCODING 44432 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 1 -2 +BITMAP +0018 +0008 +3F88 +0188 +0108 +0108 +FF88 +2478 +0408 +0400 +07F8 +0008 +07F8 +0200 +03FC +ENDCHAR +STARTCHAR AD9C +ENCODING 44444 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0030 +0010 +7F10 +0110 +0210 +0390 +FC10 +08F0 +0810 +0060 +0420 +0420 +0A50 +1188 +2104 +ENDCHAR +STARTCHAR AD9D +ENCODING 44445 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 14 1 -2 +BITMAP +0018 +3F88 +0108 +0108 +02C8 +FD08 +0478 +0408 +0448 +01A0 +0210 +0210 +0330 +01E0 +ENDCHAR +STARTCHAR ADA4 +ENCODING 44452 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 11 15 3 -2 +BITMAP +0060 +0120 +00A0 +FCA0 +04A0 +04A0 +08A0 +0CA0 +F0A0 +17A0 +10A0 +10A0 +10A0 +00A0 +0020 +ENDCHAR +STARTCHAR ADB7 +ENCODING 44471 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 1 -2 +BITMAP +0018 +0068 +0028 +7E28 +0228 +0228 +0428 +FE28 +09E8 +08A8 +0840 +0080 +0160 +0218 +0C0C +ENDCHAR +STARTCHAR ADC0 +ENCODING 44480 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +FF10 +0310 +0210 +0210 +0210 +0790 +F810 +0810 +0810 +0810 +0810 +0810 +0010 +ENDCHAR +STARTCHAR ADC1 +ENCODING 44481 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0020 +0010 +3F90 +0110 +0110 +02F0 +FF10 +0410 +0410 +0410 +3FE0 +0020 +0020 +0020 +0020 +0020 +ENDCHAR +STARTCHAR ADC4 +ENCODING 44484 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0010 +7F10 +0110 +0110 +0230 +01D0 +FE10 +0410 +0410 +0010 +1810 +0800 +0800 +0FF8 +ENDCHAR +STARTCHAR ADC8 +ENCODING 44488 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0020 +0010 +7F90 +0090 +0110 +01F0 +FF10 +0410 +0410 +0FF0 +0010 +0FF0 +0400 +0400 +07F8 +ENDCHAR +STARTCHAR ADD0 +ENCODING 44496 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0020 +0010 +3F90 +0110 +0110 +01F0 +FF10 +0410 +0410 +0010 +0FF0 +0410 +0420 +0420 +07F0 +0400 +ENDCHAR +STARTCHAR ADD1 +ENCODING 44497 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0030 +0010 +3F90 +0110 +0110 +01F0 +FF90 +0410 +0410 +0C30 +0410 +07F0 +0410 +0410 +07F0 +0410 +ENDCHAR +STARTCHAR ADD3 +ENCODING 44499 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0020 +0010 +3F90 +0110 +0110 +02F0 +FF90 +0410 +0410 +0590 +0190 +0180 +0240 +0C30 +1008 +ENDCHAR +STARTCHAR ADDC +ENCODING 44508 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 13 2 -2 +BITMAP +3FF0 +0020 +0020 +0020 +0040 +FFFC +0840 +0840 +0840 +0840 +0840 +0840 +0840 +ENDCHAR +STARTCHAR ADE0 +ENCODING 44512 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 13 2 -2 +BITMAP +3FE0 +0020 +0040 +0040 +0040 +FFFC +0880 +0880 +4880 +2880 +2080 +2000 +3FE0 +ENDCHAR +STARTCHAR ADE4 +ENCODING 44516 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 13 2 -2 +BITMAP +3FE0 +0020 +0040 +0040 +FFFC +0880 +0880 +3FC0 +0040 +3FC0 +1000 +1000 +1FE0 +ENDCHAR +STARTCHAR ADF8 +ENCODING 44536 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 10 1 0 +BITMAP +3FF8 +0018 +0010 +0010 +0010 +0010 +0020 +0020 +FFFE +2000 +ENDCHAR +STARTCHAR ADF9 +ENCODING 44537 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 13 1 -2 +BITMAP +1FF8 +0010 +0010 +0010 +FFFE +0000 +0000 +1FF0 +0010 +0010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR ADFC +ENCODING 44540 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 12 1 -1 +BITMAP +1FF8 +0018 +0010 +0010 +0010 +FFFE +0000 +3800 +0800 +0800 +0800 +07F8 +ENDCHAR +STARTCHAR ADFF +ENCODING 44543 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 12 1 -1 +BITMAP +1FF8 +0010 +0010 +0020 +FFFE +0000 +0000 +0FF0 +0800 +0800 +0800 +0FF0 +ENDCHAR +STARTCHAR AE00 +ENCODING 44544 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 12 2 -1 +BITMAP +1FF0 +0010 +0020 +0020 +FFFC +0000 +0000 +1FE0 +0040 +1FE0 +0800 +0FF0 +ENDCHAR +STARTCHAR AE01 +ENCODING 44545 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 13 1 -2 +BITMAP +1FF8 +0010 +0010 +0020 +FFFE +0000 +0000 +1E10 +02F0 +3E10 +1010 +1310 +1C10 +ENDCHAR +STARTCHAR AE08 +ENCODING 44552 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 13 1 -2 +BITMAP +1FF8 +0010 +0010 +0020 +FFFE +0000 +0000 +0FF0 +0410 +0410 +0410 +07F0 +0400 +ENDCHAR +STARTCHAR AE09 +ENCODING 44553 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 13 1 -2 +BITMAP +1FF8 +0010 +0010 +0020 +FFFE +0000 +0860 +0420 +07E0 +0420 +0420 +07E0 +0420 +ENDCHAR +STARTCHAR AE0B +ENCODING 44555 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 13 1 -2 +BITMAP +1FF8 +0018 +0010 +0010 +0020 +FFFE +2000 +0100 +0100 +0280 +0460 +0818 +3008 +ENDCHAR +STARTCHAR AE0D +ENCODING 44557 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 13 1 -2 +BITMAP +1FF8 +0018 +0010 +0010 +FFFE +0000 +0100 +07C0 +0C60 +0820 +0820 +0C60 +03C0 +ENDCHAR +STARTCHAR AE14 +ENCODING 44564 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +0010 +7F90 +0110 +0110 +0110 +0110 +0030 +FFD0 +6010 +0010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR AE30 +ENCODING 44592 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0060 +0010 +0010 +7F10 +0210 +0410 +0410 +0810 +1010 +2010 +4010 +8010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR AE31 +ENCODING 44593 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +FF10 +0210 +0610 +0410 +0810 +1010 +6010 +9FF0 +0010 +0010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR AE34 +ENCODING 44596 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 3 -2 +BITMAP +0060 +0020 +0020 +FE20 +0420 +0820 +0820 +1020 +2020 +4020 +F020 +1020 +1000 +1020 +1FF0 +ENDCHAR +STARTCHAR AE37 +ENCODING 44599 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 14 2 -1 +BITMAP +0030 +0010 +7E10 +0210 +0410 +0810 +0810 +1010 +6000 +9FE0 +0800 +0800 +0810 +0FF8 +ENDCHAR +STARTCHAR AE38 +ENCODING 44600 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +7E10 +0210 +0410 +0410 +0810 +1010 +2000 +DFE0 +0020 +1FE0 +0800 +0800 +0FF0 +ENDCHAR +STARTCHAR AE3A +ENCODING 44602 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +FE10 +0410 +0410 +0810 +1010 +2010 +C400 +3DE0 +0920 +7D20 +2120 +21E0 +3D00 +ENDCHAR +STARTCHAR AE40 +ENCODING 44608 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +7E10 +0210 +0410 +0410 +0810 +1010 +2010 +C7F0 +0410 +0410 +0420 +07F0 +0400 +ENDCHAR +STARTCHAR AE41 +ENCODING 44609 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +7E10 +0210 +0410 +0410 +0810 +1010 +2000 +CC10 +0410 +07F0 +0410 +07F0 +0410 +ENDCHAR +STARTCHAR AE43 +ENCODING 44611 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0010 +7E10 +0210 +0410 +0410 +0810 +1010 +2010 +C190 +0180 +0140 +0230 +0C18 +1000 +ENDCHAR +STARTCHAR AE45 +ENCODING 44613 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 11 15 3 -2 +BITMAP +00C0 +0060 +0620 +7C20 +0420 +0820 +1020 +2020 +4020 +8120 +0680 +0840 +0840 +0CC0 +0780 +ENDCHAR +STARTCHAR AE46 +ENCODING 44614 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 3 -2 +BITMAP +0060 +0020 +FE20 +0420 +0820 +1820 +3020 +4020 +8000 +21F0 +1F00 +0300 +04C0 +0830 +3010 +ENDCHAR +STARTCHAR AE4A +ENCODING 44618 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0010 +7E10 +0210 +0410 +0410 +0810 +1010 +2010 +DFF0 +0000 +0460 +0440 +0040 +3FF8 +ENDCHAR +STARTCHAR AE4C +ENCODING 44620 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 2 -2 +BITMAP +0040 +0020 +0020 +FFA0 +1120 +1120 +2220 +623E +4620 +8420 +0820 +1020 +0020 +0020 +0020 +ENDCHAR +STARTCHAR AE4D +ENCODING 44621 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 3 -2 +BITMAP +0080 +0040 +3340 +DF40 +2240 +4448 +4470 +8840 +3040 +7FC0 +0040 +0040 +0040 +0040 +0040 +ENDCHAR +STARTCHAR AE4E +ENCODING 44622 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 3 -2 +BITMAP +0080 +0040 +3340 +DF40 +2240 +4458 +4460 +8840 +1040 +0040 +7BC0 +0840 +0840 +0840 +0840 +ENDCHAR +STARTCHAR AE50 +ENCODING 44624 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -2 +BITMAP +0060 +0010 +0010 +3F90 +0910 +1110 +221E +4210 +8410 +0810 +0810 +0410 +0400 +0400 +07F8 +ENDCHAR +STARTCHAR AE54 +ENCODING 44628 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 3 -2 +BITMAP +0080 +0040 +3340 +DF40 +2240 +4448 +4470 +8840 +1040 +3FC0 +0080 +3FC0 +1000 +1000 +1FE0 +ENDCHAR +STARTCHAR AE56 +ENCODING 44630 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 2 -2 +BITMAP +0060 +F920 +1720 +1120 +2224 +4438 +8020 +7C00 +05F0 +0920 +3120 +2120 +3DE0 +0100 +ENDCHAR +STARTCHAR AE5C +ENCODING 44636 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 3 -2 +BITMAP +0080 +0040 +3340 +DF40 +2240 +2448 +4470 +8840 +1040 +3FC0 +0840 +0840 +0840 +0FC0 +0800 +ENDCHAR +STARTCHAR AE5D +ENCODING 44637 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 3 -2 +BITMAP +0080 +0040 +3340 +DF40 +2240 +2448 +4470 +8840 +1040 +3040 +0840 +0FC0 +0840 +0FC0 +0840 +ENDCHAR +STARTCHAR AE5F +ENCODING 44639 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 3 -2 +BITMAP +0180 +0040 +0040 +FF40 +2240 +2240 +4478 +8840 +1440 +2240 +0600 +0500 +08C0 +1060 +6020 +ENDCHAR +STARTCHAR AE60 +ENCODING 44640 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 2 -1 +BITMAP +0040 +0020 +19A0 +7FA0 +1120 +222C +2230 +C420 +0800 +1420 +0C20 +0C60 +1290 +2088 +ENDCHAR +STARTCHAR AE61 +ENCODING 44641 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 3 -2 +BITMAP +0080 +0040 +3340 +DF40 +2240 +2448 +4470 +8840 +1040 +2340 +0CC0 +0840 +0840 +0CC0 +0780 +ENDCHAR +STARTCHAR AE65 +ENCODING 44645 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 3 -2 +BITMAP +0080 +0040 +3340 +DF40 +2240 +2448 +4470 +8840 +1040 +20C0 +1F00 +1000 +1FC0 +1000 +1FE0 +ENDCHAR +STARTCHAR AE68 +ENCODING 44648 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0190 +0090 +0290 +7E90 +2490 +2490 +48F0 +8890 +1090 +1090 +2090 +0090 +0090 +0010 +ENDCHAR +STARTCHAR AE69 +ENCODING 44649 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 1 -2 +BITMAP +0018 +0048 +0048 +7F48 +0948 +1248 +2278 +4448 +8848 +1040 +0FF8 +0008 +0008 +0008 +0008 +ENDCHAR +STARTCHAR AE6C +ENCODING 44652 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 1 -2 +BITMAP +0018 +00C8 +0048 +0048 +3F48 +1148 +1248 +2478 +4448 +8848 +1048 +0248 +0200 +0200 +03FC +ENDCHAR +STARTCHAR AE70 +ENCODING 44656 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0020 +0110 +0090 +7E90 +2290 +2490 +44F0 +8890 +1090 +2FF0 +0010 +0FF0 +0400 +0400 +07F8 +ENDCHAR +STARTCHAR AE78 +ENCODING 44664 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 1 -2 +BITMAP +0018 +00C8 +0048 +7F48 +1348 +1248 +2478 +4448 +8848 +1040 +07F8 +0208 +0210 +03F8 +0200 +ENDCHAR +STARTCHAR AE79 +ENCODING 44665 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0130 +0090 +0090 +7E90 +2290 +24F0 +4490 +8890 +1080 +2C10 +0410 +07F0 +0410 +0410 +07F0 +0410 +ENDCHAR +STARTCHAR AE7B +ENCODING 44667 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 1 -2 +BITMAP +0018 +0048 +0048 +7FC8 +0948 +1148 +1278 +2448 +C448 +08C8 +0040 +00C0 +0120 +0218 +0C04 +ENDCHAR +STARTCHAR AE7C +ENCODING 44668 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0060 +0190 +0090 +7E90 +1290 +2490 +44F0 +8890 +1090 +0860 +0420 +0460 +0A50 +1088 +6108 +ENDCHAR +STARTCHAR AE7D +ENCODING 44669 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0190 +0090 +7E90 +1290 +2490 +44F0 +8890 +1090 +0090 +0160 +0210 +0210 +0330 +01E0 +ENDCHAR +STARTCHAR AE84 +ENCODING 44676 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0060 +0020 +0020 +7FA0 +0920 +113C +2220 +2220 +4420 +843C +0820 +1020 +0020 +0020 +0020 +ENDCHAR +STARTCHAR AE85 +ENCODING 44677 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 16 1 -3 +BITMAP +0070 +0010 +0010 +7F92 +199C +1110 +2210 +421E +8410 +0000 +1FF0 +0010 +0010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR AE8C +ENCODING 44684 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 2 -2 +BITMAP +00E0 +FFA0 +1120 +332C +2230 +4420 +882C +1030 +1FE0 +0020 +1FE0 +0800 +0800 +0FF0 +ENDCHAR +STARTCHAR AEBC +ENCODING 44732 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +0010 +3F90 +0890 +1110 +11F0 +2210 +4210 +8410 +0810 +1010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR AEBD +ENCODING 44733 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +7F90 +1190 +11F0 +2210 +4410 +8810 +0010 +3FE0 +0020 +0020 +0020 +0020 +0020 +ENDCHAR +STARTCHAR AEBE +ENCODING 44734 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +7F90 +1190 +11F0 +2210 +4410 +8810 +0010 +47E0 +3C20 +0420 +0420 +0420 +0420 +ENDCHAR +STARTCHAR AEC0 +ENCODING 44736 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 3 -2 +BITMAP +0060 +0020 +0020 +FF20 +2220 +6220 +45E0 +8820 +0820 +3020 +3820 +0800 +0800 +0800 +0FF8 +ENDCHAR +STARTCHAR AEC4 +ENCODING 44740 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0010 +7F90 +1190 +11F0 +2210 +4410 +8410 +1800 +0FF0 +0010 +0FF0 +0400 +0400 +07F8 +ENDCHAR +STARTCHAR AECC +ENCODING 44748 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +7F90 +1990 +11F0 +2210 +4210 +8410 +0810 +0FF0 +0410 +0420 +0420 +07F0 +0400 +ENDCHAR +STARTCHAR AECD +ENCODING 44749 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +7F90 +1990 +11F0 +2210 +4210 +8410 +0800 +0820 +0420 +07E0 +0420 +07E0 +0420 +ENDCHAR +STARTCHAR AECF +ENCODING 44751 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0010 +7F90 +0890 +1110 +11F0 +2210 +4410 +8410 +0910 +0190 +0180 +0260 +0410 +1808 +ENDCHAR +STARTCHAR AED0 +ENCODING 44752 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0010 +7F90 +0890 +1110 +21F0 +4210 +8410 +0800 +0830 +0430 +0C20 +0A50 +1188 +2108 +ENDCHAR +STARTCHAR AED1 +ENCODING 44753 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +7F90 +1990 +11F0 +2210 +4210 +8410 +0810 +0080 +0360 +0410 +0410 +0630 +03E0 +ENDCHAR +STARTCHAR AED8 +ENCODING 44760 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 1 -2 +BITMAP +0020 +0098 +0048 +1948 +3748 +1248 +2248 +25C8 +4448 +8848 +1048 +0048 +0048 +0048 +0008 +ENDCHAR +STARTCHAR AED9 +ENCODING 44761 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0110 +0090 +FE90 +2490 +4490 +4B90 +9090 +1090 +0080 +1FF0 +1010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR AEDC +ENCODING 44764 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 1 -2 +BITMAP +0018 +0088 +0048 +7F48 +1248 +1248 +25C8 +4448 +8848 +1048 +0048 +0400 +0400 +0400 +07FC +ENDCHAR +STARTCHAR AEE8 +ENCODING 44776 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0090 +0050 +7F50 +1250 +2650 +45D0 +8850 +1050 +2000 +07F0 +0410 +0420 +07F0 +0400 +ENDCHAR +STARTCHAR AEEB +ENCODING 44779 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0110 +0090 +7E90 +2490 +4490 +4B90 +9090 +1090 +0110 +0100 +0380 +0640 +0830 +3008 +ENDCHAR +STARTCHAR AEED +ENCODING 44781 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0110 +0090 +FE90 +2490 +4490 +4B90 +9090 +1090 +0080 +03E0 +0630 +0410 +0630 +03E0 +ENDCHAR +STARTCHAR AEF4 +ENCODING 44788 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +0010 +FF90 +1110 +11F0 +2310 +2210 +45F0 +0810 +0810 +0010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR AEF8 +ENCODING 44792 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 14 2 -2 +BITMAP +0030 +0010 +FF90 +1110 +11F0 +2210 +4410 +89F0 +1010 +1010 +0810 +0800 +0800 +0FF8 +ENDCHAR +STARTCHAR AEFC +ENCODING 44796 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0010 +7F90 +1190 +1170 +2210 +42F0 +8410 +1800 +0FF0 +0010 +0FF0 +0400 +0400 +07F8 +ENDCHAR +STARTCHAR AF07 +ENCODING 44807 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 11 14 3 -2 +BITMAP +0060 +0020 +FF20 +1120 +22E0 +2220 +47E0 +8820 +1620 +2320 +0300 +04C0 +0860 +3020 +ENDCHAR +STARTCHAR AF08 +ENCODING 44808 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0020 +0010 +7F90 +1190 +1170 +2210 +4210 +84F0 +0810 +0830 +0430 +0C20 +0A50 +1188 +2008 +ENDCHAR +STARTCHAR AF0D +ENCODING 44813 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 11 15 3 -2 +BITMAP +0060 +0020 +FF20 +2260 +23A0 +4420 +8BE0 +1020 +2040 +1FC0 +1000 +1FC0 +1000 +1000 +0FE0 +ENDCHAR +STARTCHAR AF10 +ENCODING 44816 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 1 -2 +BITMAP +0020 +0098 +0048 +1B48 +3748 +13C8 +2248 +2448 +45C8 +8848 +1048 +0048 +0048 +0048 +0008 +ENDCHAR +STARTCHAR AF2C +ENCODING 44844 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 10 1 1 +BITMAP +FDF8 +0C10 +0810 +0810 +0820 +1320 +1120 +0100 +0100 +FFFE +ENDCHAR +STARTCHAR AF2D +ENCODING 44845 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +04F8 +3C10 +0410 +0990 +08A0 +0084 +FFFE +0000 +1FF0 +0010 +0010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR AF30 +ENCODING 44848 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 12 1 -1 +BITMAP +7CF8 +0410 +0410 +0B10 +0900 +0104 +FFFE +0000 +1800 +0800 +0808 +07F8 +ENDCHAR +STARTCHAR AF32 +ENCODING 44850 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +04F8 +3C08 +0410 +0710 +0910 +0900 +FFFE +0100 +30FC +11E0 +10F0 +1088 +1C90 +0060 +ENDCHAR +STARTCHAR AF34 +ENCODING 44852 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +04F8 +3C10 +0410 +0B10 +0920 +0104 +FFFE +0000 +1FF0 +0020 +1FE0 +0800 +0800 +0FF8 +ENDCHAR +STARTCHAR AF3C +ENCODING 44860 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +00F8 +3C18 +0410 +0710 +0900 +0900 +FFFE +0000 +0000 +1FE0 +0820 +0820 +0FE0 +0800 +ENDCHAR +STARTCHAR AF3D +ENCODING 44861 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +04F8 +3C18 +0410 +0B10 +0900 +0104 +FFFE +0000 +1060 +0820 +0FE0 +0820 +0FE0 +0820 +ENDCHAR +STARTCHAR AF3F +ENCODING 44863 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +04F8 +1C08 +0410 +0910 +0910 +0100 +FFFE +0000 +0100 +0100 +03C0 +0630 +0818 +3008 +ENDCHAR +STARTCHAR AF41 +ENCODING 44865 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +01F8 +3E10 +0410 +0710 +09A0 +0904 +FFFE +0000 +0080 +0340 +0420 +0420 +0660 +03C0 +ENDCHAR +STARTCHAR AF42 +ENCODING 44866 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +3EF8 +0408 +0410 +0610 +0100 +0100 +FFFE +0000 +1FF0 +0100 +0380 +0660 +0810 +3000 +ENDCHAR +STARTCHAR AF43 +ENCODING 44867 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +3EF8 +2448 +0410 +0510 +0900 +FFFE +0000 +0000 +03C0 +3FF8 +0100 +02C0 +0430 +1818 +ENDCHAR +STARTCHAR AF48 +ENCODING 44872 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -2 +BITMAP +0060 +0010 +0010 +7B90 +0890 +1090 +1890 +1416 +0418 +05D0 +FE10 +0010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR AF49 +ENCODING 44873 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0060 +0020 +11A0 +F2A0 +1120 +1520 +253C +04E0 +FF20 +0020 +3FE0 +0020 +0020 +0020 +0020 +ENDCHAR +STARTCHAR AF50 +ENCODING 44880 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +00C0 +0020 +FFA0 +10A0 +1120 +1520 +2438 +05E0 +FA20 +1FE0 +0020 +0040 +1FE0 +0800 +0FF0 +ENDCHAR +STARTCHAR AF5C +ENCODING 44892 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +00C0 +0020 +F7A0 +1120 +1120 +2520 +243C +05E0 +FA20 +0040 +0420 +0420 +0A60 +1198 +2108 +ENDCHAR +STARTCHAR AF5D +ENCODING 44893 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +00C0 +0020 +17A0 +70A0 +1120 +1520 +253C +04E0 +FF20 +00A0 +03C0 +0420 +0420 +0660 +03C0 +ENDCHAR +STARTCHAR AF64 +ENCODING 44900 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0060 +0190 +0050 +FF50 +2250 +2250 +3A50 +4870 +4850 +0F50 +7050 +0050 +0050 +0050 +0010 +ENDCHAR +STARTCHAR AF65 +ENCODING 44901 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0030 +0090 +0090 +EE90 +2290 +2A90 +48F0 +0990 +FE90 +0090 +1FF0 +0010 +0010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR AF79 +ENCODING 44921 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 1 -2 +BITMAP +0018 +0048 +0048 +7F48 +1148 +1948 +1478 +0448 +FFC8 +0048 +01F0 +0318 +0208 +0318 +01F0 +ENDCHAR +STARTCHAR AF80 +ENCODING 44928 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0060 +0010 +0010 +7790 +1090 +2110 +3910 +2910 +0810 +0FD0 +F010 +0010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR AF84 +ENCODING 44932 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0010 +0010 +7B90 +0890 +1910 +1510 +0530 +FED0 +0010 +0010 +0400 +0400 +0400 +07F8 +ENDCHAR +STARTCHAR AF88 +ENCODING 44936 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 3 -2 +BITMAP +00C0 +0020 +FF20 +2120 +2220 +2E20 +0A20 +0FE0 +F020 +1FE0 +0020 +0040 +1FE0 +0800 +0FF0 +ENDCHAR +STARTCHAR AF90 +ENCODING 44944 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0040 +0030 +0590 +3A90 +1090 +1D10 +1510 +04F0 +FF10 +0000 +0FE0 +0820 +0840 +0FE0 +0800 +ENDCHAR +STARTCHAR AF91 +ENCODING 44945 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 11 15 3 -2 +BITMAP +00C0 +0020 +FF20 +1120 +2120 +2E20 +2A20 +0BE0 +F400 +10E0 +0840 +0FC0 +0840 +0FC0 +0800 +ENDCHAR +STARTCHAR AF95 +ENCODING 44949 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 14 2 -2 +BITMAP +0030 +0090 +3B90 +1090 +1D10 +1510 +0470 +FF90 +0090 +0360 +0410 +0410 +0630 +03E0 +ENDCHAR +STARTCHAR AF9C +ENCODING 44956 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 11 2 0 +BITMAP +F9F8 +0808 +0818 +1010 +1010 +3890 +28A0 +08A0 +0880 +088C +F770 +ENDCHAR +STARTCHAR AFB8 +ENCODING 44984 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +00F8 +1E08 +0410 +0410 +0410 +0004 +FFFE +0100 +0100 +0100 +0100 +0100 +0100 +0100 +ENDCHAR +STARTCHAR AFB9 +ENCODING 44985 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +00F8 +1E18 +0210 +0410 +0404 +FFFE +0100 +0100 +0100 +3FF0 +0010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR AFBC +ENCODING 44988 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +3EF8 +1610 +0410 +0410 +0404 +07FE +FF00 +0100 +0100 +3100 +1100 +1100 +1000 +1FF0 +ENDCHAR +STARTCHAR AFC0 +ENCODING 44992 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +3EF8 +0418 +0410 +0410 +0000 +FFFE +0100 +0100 +1FF0 +0020 +1FE0 +0800 +0800 +07F0 +ENDCHAR +STARTCHAR AFC7 +ENCODING 44999 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 2 -2 +BITMAP +01F0 +3820 +0820 +0840 +1040 +FFFC +0200 +3E60 +0418 +7DE0 +20E0 +2110 +3910 +00E0 +ENDCHAR +STARTCHAR AFC8 +ENCODING 45000 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +00F8 +3E08 +0210 +0410 +0400 +FFFE +0100 +0100 +0100 +0FE0 +0820 +0820 +0FE0 +0800 +ENDCHAR +STARTCHAR AFC9 +ENCODING 45001 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +3EF8 +0208 +0410 +0410 +0810 +FFFE +0100 +0100 +1920 +0820 +0FE0 +0820 +0FE0 +0820 +ENDCHAR +STARTCHAR AFCB +ENCODING 45003 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 2 -2 +BITMAP +7DF0 +0820 +0820 +0840 +1040 +FFFC +0200 +0200 +0600 +0200 +0700 +0C80 +1060 +6000 +ENDCHAR +STARTCHAR AFCD +ENCODING 45005 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +3E00 +0278 +0408 +0410 +0410 +FFFE +0100 +0100 +0100 +0EC0 +0820 +0820 +0C60 +03C0 +ENDCHAR +STARTCHAR AFCE +ENCODING 45006 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 2 -2 +BITMAP +7DF0 +0830 +0820 +0820 +1040 +FFFC +4200 +0200 +3FF0 +0200 +0300 +04C0 +1830 +6010 +ENDCHAR +STARTCHAR AFD4 +ENCODING 45012 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +1190 +7310 +1110 +2110 +2010 +1F10 +E810 +08F0 +0810 +0810 +0810 +0010 +0010 +ENDCHAR +STARTCHAR AFDC +ENCODING 45020 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 1 -2 +BITMAP +0018 +0008 +3FC8 +0848 +0888 +08A8 +FF48 +02F8 +0408 +0FF8 +0010 +0010 +0FF8 +0400 +07F8 +ENDCHAR +STARTCHAR AFE8 +ENCODING 45032 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0010 +F710 +1110 +2110 +2290 +FD10 +08F0 +0810 +1060 +0820 +0860 +1660 +2298 +C108 +ENDCHAR +STARTCHAR AFE9 +ENCODING 45033 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 1 -2 +BITMAP +0010 +0008 +3B88 +0888 +0888 +1148 +FE88 +0408 +0478 +0448 +01E8 +0210 +0210 +0330 +01E0 +ENDCHAR +STARTCHAR AFF0 +ENCODING 45040 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0110 +0090 +2E90 +6290 +2490 +2490 +0C90 +F090 +1790 +1090 +1090 +1090 +0090 +0010 +ENDCHAR +STARTCHAR AFF1 +ENCODING 45041 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 16 1 -3 +BITMAP +0030 +0088 +0048 +7748 +1148 +1248 +2248 +FD48 +0BC8 +0840 +0FF8 +0008 +0008 +0008 +0008 +0008 +ENDCHAR +STARTCHAR AFF4 +ENCODING 45044 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0060 +0130 +0090 +0090 +7690 +2290 +2290 +2290 +FC90 +0B90 +0090 +0C10 +0400 +0400 +07F8 +ENDCHAR +STARTCHAR AFF8 +ENCODING 45048 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0110 +00D0 +2ED0 +62D0 +2490 +2490 +F890 +1790 +1000 +0FF0 +0020 +0FF0 +0400 +07F8 +ENDCHAR +STARTCHAR B000 +ENCODING 45056 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 16 1 -3 +BITMAP +0030 +00D8 +0048 +7748 +1148 +1248 +1248 +FD48 +0BC8 +0848 +07F8 +0208 +0208 +0210 +03F8 +0200 +ENDCHAR +STARTCHAR B001 +ENCODING 45057 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0030 +0190 +0090 +EE90 +2290 +2490 +2490 +F890 +1790 +0830 +0410 +07F0 +0410 +0410 +07F0 +0410 +ENDCHAR +STARTCHAR B004 +ENCODING 45060 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 16 2 -3 +BITMAP +0030 +0190 +0090 +EE90 +2290 +2490 +4490 +FA90 +1790 +1000 +0420 +0C60 +0C60 +1298 +2108 +4000 +ENDCHAR +STARTCHAR B00C +ENCODING 45068 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 1 -2 +BITMAP +0018 +0008 +03C8 +38C8 +0888 +0888 +1088 +11C8 +FE08 +0408 +0408 +0408 +0408 +0408 +0008 +ENDCHAR +STARTCHAR B010 +ENCODING 45072 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 3 -2 +BITMAP +0060 +0020 +F720 +2120 +2220 +2220 +4FE0 +F820 +0820 +0820 +0020 +3000 +1000 +1020 +1FF0 +ENDCHAR +STARTCHAR B014 +ENCODING 45076 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0010 +3B90 +1110 +1110 +11F0 +FE10 +0410 +0400 +0FF0 +0010 +0020 +0FF0 +0400 +07F8 +ENDCHAR +STARTCHAR B01C +ENCODING 45084 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +7B90 +0890 +1110 +1130 +FED0 +0410 +0410 +0000 +07F0 +0410 +0420 +07E0 +0400 +ENDCHAR +STARTCHAR B01D +ENCODING 45085 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0030 +0010 +3B90 +0890 +0890 +10F0 +FF10 +0410 +0400 +0C30 +0410 +07F0 +0410 +0410 +07F0 +0410 +ENDCHAR +STARTCHAR B028 +ENCODING 45096 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -3 +BITMAP +7DF0 +0410 +0410 +0820 +0820 +1020 +FFFC +0840 +0840 +0840 +0840 +0840 +0840 +0840 +0040 +ENDCHAR +STARTCHAR B044 +ENCODING 45124 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 10 1 0 +BITMAP +3EF8 +0608 +0408 +0410 +0410 +0410 +0820 +0804 +FFFE +2000 +ENDCHAR +STARTCHAR B045 +ENCODING 45125 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +3EF8 +0408 +0410 +0810 +0810 +CFFE +3000 +0000 +3FF0 +0010 +0010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR B048 +ENCODING 45128 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 13 1 -1 +BITMAP +00F8 +1E08 +0410 +0410 +0410 +0006 +FFFE +0000 +3800 +0800 +0800 +0800 +0FF8 +ENDCHAR +STARTCHAR B04A +ENCODING 45130 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +00F8 +1E08 +0408 +0410 +0400 +FFFE +0000 +20E0 +13F8 +10E0 +1110 +1308 +1D10 +00E0 +ENDCHAR +STARTCHAR B04C +ENCODING 45132 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +3EFC +0608 +0408 +0410 +0410 +FFFE +0000 +0000 +1FE0 +0020 +1FE0 +0800 +0800 +07E0 +ENDCHAR +STARTCHAR B04E +ENCODING 45134 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +7EF8 +0408 +0410 +0410 +0810 +FFFE +0000 +3E00 +02F0 +0490 +1890 +1090 +16F0 +0880 +ENDCHAR +STARTCHAR B053 +ENCODING 45139 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +3CF8 +0408 +0410 +0410 +FFFE +0000 +00F0 +3C00 +05F8 +7CE0 +2110 +2308 +3D10 +00F0 +ENDCHAR +STARTCHAR B054 +ENCODING 45140 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +1EF8 +0608 +0410 +0410 +0814 +FFFE +0000 +0000 +1FE0 +0820 +0820 +0820 +0FE0 +0800 +ENDCHAR +STARTCHAR B055 +ENCODING 45141 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +7EF8 +0408 +0410 +0410 +0810 +0820 +CFFE +7820 +0820 +0FE0 +0820 +0820 +0FE0 +0820 +ENDCHAR +STARTCHAR B057 +ENCODING 45143 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 2 -2 +BITMAP +7C00 +04F0 +0810 +0820 +0820 +0000 +FFFC +0000 +0200 +0200 +0500 +08C0 +3020 +4010 +ENDCHAR +STARTCHAR B059 +ENCODING 45145 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +3EF8 +0408 +0408 +0410 +0810 +8FFE +7000 +0000 +0100 +06C0 +0820 +0820 +0460 +0380 +ENDCHAR +STARTCHAR B05D +ENCODING 45149 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 13 1 -1 +BITMAP +06F8 +1C08 +0410 +0410 +0000 +FFFE +0000 +0000 +1FF0 +0800 +0FF0 +0800 +0FF8 +ENDCHAR +STARTCHAR B07C +ENCODING 45180 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 1 -2 +BITMAP +0038 +0008 +0008 +7FC8 +0C48 +0888 +1888 +1108 +2108 +4208 +8408 +0808 +0008 +0008 +0008 +ENDCHAR +STARTCHAR B07D +ENCODING 45181 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0030 +0010 +0010 +7F90 +1110 +3210 +2210 +C410 +0810 +1000 +3FE0 +1020 +0020 +0020 +0020 +0020 +ENDCHAR +STARTCHAR B080 +ENCODING 45184 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 1 -2 +BITMAP +0018 +0008 +0008 +3FC8 +0888 +1188 +2108 +4208 +8408 +0808 +0C08 +0400 +0400 +0400 +07FC +ENDCHAR +STARTCHAR B084 +ENCODING 45188 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +7F90 +1190 +1110 +2210 +4210 +8410 +0800 +17F0 +0020 +0FF0 +0400 +0400 +03F0 +ENDCHAR +STARTCHAR B08C +ENCODING 45196 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +FF90 +0890 +1110 +2110 +2210 +4410 +8810 +1000 +27F0 +0410 +0420 +07F0 +0400 +ENDCHAR +STARTCHAR B08D +ENCODING 45197 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 16 1 -3 +BITMAP +0018 +0008 +04C8 +3B48 +0888 +1188 +2108 +4208 +8400 +0E08 +0208 +03F8 +0208 +0208 +03F8 +0208 +ENDCHAR +STARTCHAR B08F +ENCODING 45199 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 11 15 3 -2 +BITMAP +0060 +0020 +0320 +FF20 +2220 +2420 +4420 +8820 +1020 +2320 +0300 +0300 +04C0 +0860 +3020 +ENDCHAR +STARTCHAR B091 +ENCODING 45201 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 11 15 3 -2 +BITMAP +0060 +0020 +0020 +FF20 +2220 +2220 +4420 +8820 +1020 +2120 +06C0 +0820 +0820 +0C60 +03C0 +ENDCHAR +STARTCHAR B098 +ENCODING 45208 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0040 +0020 +0020 +0020 +C020 +4020 +4020 +403C +4060 +4FA0 +7020 +0020 +0020 +0020 +0020 +ENDCHAR +STARTCHAR B099 +ENCODING 45209 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0060 +0020 +0020 +C020 +4020 +403C +43A0 +7C20 +0000 +3FE0 +0020 +0020 +0020 +0020 +0020 +ENDCHAR +STARTCHAR B09A +ENCODING 45210 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0060 +0020 +0020 +C020 +4020 +403C +43A0 +7C20 +0000 +7DE0 +0420 +0420 +0420 +0420 +0420 +ENDCHAR +STARTCHAR B09C +ENCODING 45212 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 1 -2 +BITMAP +0030 +0010 +0010 +E010 +2010 +2010 +201C +21D0 +3E10 +0010 +1C10 +0400 +0400 +0400 +07FC +ENDCHAR +STARTCHAR B09F +ENCODING 45215 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -2 +BITMAP +0030 +0010 +C010 +2010 +2010 +2016 +23F8 +3C10 +0010 +0000 +0FF0 +0400 +0400 +0400 +07F8 +ENDCHAR +STARTCHAR B0A0 +ENCODING 45216 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0060 +0020 +0020 +C020 +4024 +4038 +43A0 +7C20 +0000 +1FE0 +0020 +0FE0 +0800 +0800 +07E0 +ENDCHAR +STARTCHAR B0A1 +ENCODING 45217 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0060 +0020 +0020 +C020 +4020 +41B8 +7E20 +0020 +0C20 +34E0 +0820 +3020 +2020 +3C20 +0020 +ENDCHAR +STARTCHAR B0A2 +ENCODING 45218 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +0030 +0010 +E010 +2010 +2016 +20F8 +3F10 +0010 +1EF0 +0290 +3E90 +1090 +11F0 +1E80 +ENDCHAR +STARTCHAR B0A8 +ENCODING 45224 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0060 +0020 +0020 +C020 +4020 +403C +43A0 +7C20 +0020 +0000 +0FE0 +0820 +0820 +0FE0 +0800 +ENDCHAR +STARTCHAR B0A9 +ENCODING 45225 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0060 +0020 +0020 +C020 +4020 +4078 +43A0 +7C20 +0000 +1020 +0820 +0FE0 +0820 +0FE0 +0820 +ENDCHAR +STARTCHAR B0AB +ENCODING 45227 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +0030 +0010 +E010 +2010 +2010 +203E +21D0 +3E10 +0090 +0090 +01C0 +0320 +0618 +080C +ENDCHAR +STARTCHAR B0AC +ENCODING 45228 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -2 +BITMAP +0030 +0010 +E010 +2010 +2010 +2016 +21D8 +3E10 +0000 +0630 +0210 +0620 +0950 +108C +2104 +ENDCHAR +STARTCHAR B0AD +ENCODING 45229 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0060 +0020 +0020 +C020 +4020 +402C +40B0 +7F20 +0020 +0100 +06C0 +0820 +0820 +0C60 +03C0 +ENDCHAR +STARTCHAR B0AE +ENCODING 45230 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -2 +BITMAP +0030 +0010 +E010 +2010 +2010 +203E +27D0 +3810 +0000 +1FF8 +0080 +0180 +0360 +0418 +1808 +ENDCHAR +STARTCHAR B0AF +ENCODING 45231 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 16 2 -3 +BITMAP +0060 +0020 +8020 +4020 +4020 +4078 +43A0 +7C20 +0380 +03F0 +3F00 +0100 +0380 +0660 +0810 +3000 +ENDCHAR +STARTCHAR B0B1 +ENCODING 45233 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 2 -1 +BITMAP +0060 +0020 +C020 +4020 +402C +43B0 +7C20 +0000 +0020 +0FE0 +0800 +0FE0 +0800 +0FF0 +ENDCHAR +STARTCHAR B0B3 +ENCODING 45235 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -2 +BITMAP +0030 +0010 +E010 +2010 +2016 +2058 +3F90 +0200 +01C0 +0FFC +01E0 +0210 +0210 +0310 +01E0 +ENDCHAR +STARTCHAR B0B4 +ENCODING 45236 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 1 -2 +BITMAP +0318 +0088 +0088 +E088 +2088 +2088 +2088 +20F8 +2088 +2F88 +3088 +0088 +0088 +0088 +0008 +ENDCHAR +STARTCHAR B0B5 +ENCODING 45237 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0020 +0610 +0110 +C110 +4110 +4110 +41F0 +4710 +7910 +0110 +1FF0 +0010 +0010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR B0B8 +ENCODING 45240 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0040 +0330 +0090 +8090 +4090 +4090 +4090 +47F0 +7890 +0090 +0C90 +0490 +0400 +0400 +07FC +ENDCHAR +STARTCHAR B0BC +ENCODING 45244 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 1 -2 +BITMAP +0018 +0188 +E088 +2088 +2088 +20F8 +2788 +3888 +0080 +0FF0 +0010 +0FF0 +0400 +0400 +07FC +ENDCHAR +STARTCHAR B0C4 +ENCODING 45252 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0060 +0310 +0110 +C110 +4110 +4110 +41F0 +4710 +7910 +0110 +1FF0 +0830 +0820 +0820 +0FC0 +ENDCHAR +STARTCHAR B0C5 +ENCODING 45253 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 14 1 -2 +BITMAP +0318 +0088 +E088 +2088 +2088 +20F8 +2188 +3E88 +0E08 +0208 +03F8 +0208 +03F8 +0208 +ENDCHAR +STARTCHAR B0C7 +ENCODING 45255 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0190 +0090 +C090 +4090 +4090 +41F0 +4E90 +7090 +0310 +0180 +0180 +0240 +0C30 +1018 +ENDCHAR +STARTCHAR B0C8 +ENCODING 45256 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0060 +0190 +0090 +C090 +4090 +4090 +41F0 +4690 +7890 +08A0 +0420 +0C60 +1250 +2188 +4108 +ENDCHAR +STARTCHAR B0C9 +ENCODING 45257 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 1 -2 +BITMAP +0020 +0318 +0088 +E088 +2088 +2088 +20F8 +2188 +2E88 +3048 +01A0 +0210 +0210 +0330 +01E0 +ENDCHAR +STARTCHAR B0D0 +ENCODING 45264 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +00C0 +0020 +0020 +8020 +4020 +403C +4020 +4020 +40E0 +4F2C +7030 +0020 +0020 +0020 +0020 +ENDCHAR +STARTCHAR B0D1 +ENCODING 45265 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0060 +0020 +0020 +C020 +4038 +4020 +47E0 +783C +0020 +01E0 +3E20 +0020 +0020 +0020 +0020 +ENDCHAR +STARTCHAR B0D4 +ENCODING 45268 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0060 +0020 +0020 +C020 +403C +4020 +4020 +43E0 +7C2C +0030 +1020 +0800 +0800 +0800 +0FF0 +ENDCHAR +STARTCHAR B0D8 +ENCODING 45272 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0060 +0020 +E020 +202C +2030 +2060 +27A4 +3838 +0000 +1FE0 +0020 +0040 +0FE0 +0800 +0FF0 +ENDCHAR +STARTCHAR B0E0 +ENCODING 45280 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0060 +0020 +0020 +C020 +403C +4020 +43E0 +7C3C +0020 +0FE0 +0820 +0820 +0840 +0FE0 +0800 +ENDCHAR +STARTCHAR B0E5 +ENCODING 45285 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0040 +0020 +0020 +C020 +403C +4020 +40A0 +7F3C +0020 +00A0 +0340 +0420 +0420 +0660 +03C0 +ENDCHAR +STARTCHAR B108 +ENCODING 45320 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 1 -2 +BITMAP +0018 +0008 +0008 +E008 +2008 +21F8 +2008 +2008 +2008 +2188 +3E08 +0008 +0008 +0008 +0008 +ENDCHAR +STARTCHAR B109 +ENCODING 45321 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 11 16 3 -3 +BITMAP +00C0 +0020 +0020 +C020 +41E0 +4020 +4020 +7F20 +2020 +0000 +7FC0 +2040 +0040 +0040 +0040 +0040 +ENDCHAR +STARTCHAR B10B +ENCODING 45323 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 1 -2 +BITMAP +0018 +0008 +E008 +21F8 +2008 +2008 +2388 +3C08 +0020 +7E10 +0210 +0230 +0268 +0244 +0284 +ENDCHAR +STARTCHAR B10C +ENCODING 45324 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 14 2 -1 +BITMAP +0060 +0010 +0010 +C010 +43F0 +4010 +4010 +4310 +7C10 +0010 +1810 +0800 +0800 +0FF8 +ENDCHAR +STARTCHAR B110 +ENCODING 45328 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 1 -2 +BITMAP +0010 +0008 +E008 +20F8 +2008 +2008 +2308 +3C08 +0008 +07F8 +0010 +0FF8 +0400 +0400 +07FC +ENDCHAR +STARTCHAR B112 +ENCODING 45330 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0060 +0030 +8010 +41F0 +4010 +4010 +4210 +7C10 +0000 +3CF0 +0490 +7C90 +2090 +22F0 +3C80 +ENDCHAR +STARTCHAR B113 +ENCODING 45331 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0020 +0010 +C010 +41F0 +4010 +4010 +5E10 +2000 +0310 +7D10 +05F0 +6D10 +3110 +23F0 +3D10 +ENDCHAR +STARTCHAR B118 +ENCODING 45336 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 1 -2 +BITMAP +0030 +0008 +E008 +2008 +21F8 +2008 +2048 +3F88 +0008 +07F8 +0208 +0208 +0210 +03F8 +0200 +ENDCHAR +STARTCHAR B119 +ENCODING 45337 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 16 1 -3 +BITMAP +0030 +0008 +E008 +2008 +20F8 +2008 +2048 +2788 +3808 +0618 +0210 +03F0 +0210 +0210 +03F0 +0210 +ENDCHAR +STARTCHAR B11B +ENCODING 45339 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 1 -2 +BITMAP +0030 +0008 +E008 +2008 +20F8 +2008 +2048 +2788 +3808 +0088 +00C8 +01C0 +0330 +0418 +1804 +ENDCHAR +STARTCHAR B11C +ENCODING 45340 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 1 -2 +BITMAP +0010 +0008 +E008 +21F8 +2008 +2008 +2088 +3F08 +0000 +0610 +0210 +0630 +0D28 +1044 +2080 +ENDCHAR +STARTCHAR B11D +ENCODING 45341 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 1 -2 +BITMAP +0030 +0008 +E008 +2008 +21F8 +2008 +2088 +3F08 +0008 +0048 +01A0 +0210 +0210 +0330 +01E0 +ENDCHAR +STARTCHAR B123 +ENCODING 45347 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 1 -2 +BITMAP +0018 +0008 +E008 +20F8 +2008 +2008 +2F08 +1000 +01C0 +1FBC +00C0 +0320 +0210 +0220 +01E0 +ENDCHAR +STARTCHAR B124 +ENCODING 45348 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0610 +0110 +0110 +C110 +4110 +4F10 +4110 +4110 +4510 +7910 +0110 +0110 +0110 +0010 +ENDCHAR +STARTCHAR B125 +ENCODING 45349 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0030 +0190 +0090 +C090 +4F90 +4090 +4090 +7C90 +0090 +0000 +1FF0 +0010 +0010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR B128 +ENCODING 45352 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0030 +0110 +0090 +C090 +4090 +4790 +4090 +4090 +7890 +0090 +0890 +0400 +0400 +0400 +07FC +ENDCHAR +STARTCHAR B12C +ENCODING 45356 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0310 +0090 +C090 +4B90 +4490 +4090 +5C90 +2090 +1FE0 +0020 +0020 +1FE0 +0800 +0FF0 +ENDCHAR +STARTCHAR B134 +ENCODING 45364 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0030 +0110 +0090 +C090 +4090 +4390 +4090 +4890 +3090 +0000 +0FF0 +0410 +0420 +0420 +07F0 +0400 +ENDCHAR +STARTCHAR B135 +ENCODING 45365 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -3 +BITMAP +0030 +0090 +C090 +4090 +4F90 +4090 +4C90 +7090 +0830 +0410 +07F0 +0410 +0410 +07F0 +0410 +ENDCHAR +STARTCHAR B137 +ENCODING 45367 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0110 +0090 +0090 +C090 +4790 +4090 +4290 +7C90 +0310 +0190 +0180 +0240 +0430 +1818 +ENDCHAR +STARTCHAR B138 +ENCODING 45368 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0110 +0090 +C090 +4090 +4390 +4090 +5C90 +6090 +0060 +0420 +0C60 +0A50 +1288 +6308 +ENDCHAR +STARTCHAR B139 +ENCODING 45369 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0110 +0090 +C090 +4090 +4390 +4090 +5C90 +6090 +0110 +02C0 +0420 +0420 +0660 +03C0 +ENDCHAR +STARTCHAR B140 +ENCODING 45376 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +0010 +C030 +40D0 +4010 +4010 +41F0 +4010 +4210 +7C10 +0010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR B141 +ENCODING 45377 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 16 1 -3 +BITMAP +0018 +0008 +E008 +2078 +2008 +2088 +23F8 +3C08 +0008 +0000 +1FF0 +0810 +0010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR B144 +ENCODING 45380 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0010 +0010 +C170 +4090 +4010 +4010 +4FF0 +7010 +0010 +0010 +1800 +0800 +0800 +0FF8 +ENDCHAR +STARTCHAR B148 +ENCODING 45384 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +0010 +C1F0 +4010 +4010 +41F0 +4410 +7810 +1FE0 +0020 +0020 +1FE0 +0800 +0FF0 +ENDCHAR +STARTCHAR B150 +ENCODING 45392 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0070 +0010 +0010 +C1F0 +4010 +4010 +4210 +7CF0 +0010 +0000 +1FE0 +0820 +0820 +0820 +0FE0 +0800 +ENDCHAR +STARTCHAR B151 +ENCODING 45393 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0030 +0010 +0010 +C1F0 +4010 +4010 +41F0 +4410 +7810 +0C10 +0410 +07F0 +0410 +0410 +07F0 +0410 +ENDCHAR +STARTCHAR B154 +ENCODING 45396 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0010 +0010 +C0F0 +4010 +4010 +47F0 +7810 +0010 +0860 +0420 +0860 +1E50 +2288 +4108 +ENDCHAR +STARTCHAR B155 +ENCODING 45397 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0060 +0010 +0010 +C1F0 +4010 +4010 +4610 +79F0 +0010 +0090 +0340 +0420 +0420 +0660 +03C0 +ENDCHAR +STARTCHAR B158 +ENCODING 45400 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0030 +0010 +8010 +41F0 +4010 +4010 +41F0 +5C10 +6010 +0000 +1FF0 +0020 +01E0 +1E20 +0040 +0040 +ENDCHAR +STARTCHAR B15C +ENCODING 45404 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 1 -2 +BITMAP +0018 +00C8 +0048 +C048 +2048 +23C8 +2048 +27C8 +2048 +2648 +3848 +0048 +0048 +0048 +0008 +ENDCHAR +STARTCHAR B160 +ENCODING 45408 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 14 2 -2 +BITMAP +0030 +0190 +0090 +C090 +4790 +4090 +4790 +5890 +6090 +1C90 +0410 +0400 +0400 +07F8 +ENDCHAR +STARTCHAR B178 +ENCODING 45432 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 9 1 1 +BITMAP +3000 +1000 +1000 +1018 +1FF8 +0100 +0100 +0100 +FFFE +ENDCHAR +STARTCHAR B179 +ENCODING 45433 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -3 +BITMAP +3000 +1000 +1010 +0FF8 +0100 +0100 +FFFE +0000 +0000 +1FF0 +0010 +0010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR B17C +ENCODING 45436 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 13 1 -1 +BITMAP +7000 +1000 +1000 +1010 +0FF8 +0100 +0100 +FFFE +0000 +1800 +0800 +0800 +0FF8 +ENDCHAR +STARTCHAR B180 +ENCODING 45440 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 13 1 -1 +BITMAP +3000 +1000 +1010 +0FF0 +0100 +0100 +FFFE +0000 +1FF0 +0010 +1FF0 +0800 +0FF8 +ENDCHAR +STARTCHAR B182 +ENCODING 45442 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +3000 +1000 +1000 +0FF0 +0100 +0100 +FFFE +0000 +1EF8 +0290 +1E90 +1190 +1EF0 +0080 +ENDCHAR +STARTCHAR B188 +ENCODING 45448 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -3 +BITMAP +3000 +1000 +1000 +0FF0 +0100 +0100 +FFFE +0000 +0000 +1FE0 +0820 +0820 +0820 +0FE0 +0800 +ENDCHAR +STARTCHAR B189 +ENCODING 45449 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -2 +BITMAP +2000 +1000 +1000 +1010 +0FF0 +0100 +0100 +FFFE +0000 +1820 +0820 +0FE0 +0820 +0FE0 +0820 +ENDCHAR +STARTCHAR B18B +ENCODING 45451 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 2 -2 +BITMAP +6000 +1000 +1000 +1030 +0FF0 +0300 +0200 +03FE +FF00 +0600 +0200 +0700 +04C0 +1820 +2010 +ENDCHAR +STARTCHAR B18D +ENCODING 45453 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +3000 +1000 +1010 +0FF8 +0100 +0100 +FFFE +0000 +0100 +06C0 +0820 +0820 +0460 +0380 +ENDCHAR +STARTCHAR B192 +ENCODING 45458 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 13 2 -1 +BITMAP +6000 +2000 +2000 +1FE0 +0200 +0200 +FFFC +0000 +3FE0 +00C0 +0880 +0880 +7FF8 +ENDCHAR +STARTCHAR B193 +ENCODING 45459 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +3000 +1000 +1010 +0FF0 +0100 +FFFE +0000 +03C0 +1FF8 +0100 +06C0 +0420 +0440 +03C0 +ENDCHAR +STARTCHAR B194 +ENCODING 45460 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -2 +BITMAP +0070 +0010 +E010 +2010 +2010 +20D0 +1F10 +021E +0210 +0FF0 +3010 +0010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR B198 +ENCODING 45464 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 2 -2 +BITMAP +0060 +0020 +6020 +2020 +2120 +1E20 +042C +04F0 +FF20 +0020 +0820 +0800 +0800 +0FF8 +ENDCHAR +STARTCHAR B19C +ENCODING 45468 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0060 +6020 +2020 +2020 +3F20 +082C +0870 +FFA0 +0020 +1FE0 +0020 +0040 +1FE0 +0800 +0FF0 +ENDCHAR +STARTCHAR B1A8 +ENCODING 45480 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0060 +0020 +6020 +2020 +21A0 +3E20 +0438 +04E0 +FB20 +0040 +0C20 +0840 +0CE0 +1298 +6308 +ENDCHAR +STARTCHAR B1CC +ENCODING 45516 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0060 +0010 +4010 +2010 +2010 +2090 +3F10 +0410 +0410 +05D0 +FA10 +0010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR B1D0 +ENCODING 45520 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 14 3 -1 +BITMAP +0060 +0020 +C020 +4020 +4020 +4720 +3820 +0820 +1FE0 +E020 +3020 +1000 +1000 +1FF0 +ENDCHAR +STARTCHAR B1D4 +ENCODING 45524 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +2010 +2010 +2190 +1E10 +0430 +FFD0 +0000 +1FE0 +0020 +1FE0 +0800 +0800 +0FF0 +ENDCHAR +STARTCHAR B1DC +ENCODING 45532 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0070 +0010 +6010 +2010 +2190 +3E10 +0410 +0470 +FF90 +0010 +1FF0 +0830 +0820 +0820 +0FF0 +0800 +ENDCHAR +STARTCHAR B1DD +ENCODING 45533 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 11 15 3 -2 +BITMAP +0060 +0020 +4020 +4020 +4320 +3C20 +0820 +0FC0 +F000 +1040 +0840 +0FC0 +0840 +0FC0 +0840 +ENDCHAR +STARTCHAR B1DF +ENCODING 45535 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0010 +6010 +2010 +2010 +3F10 +0410 +05F0 +FA10 +0010 +0090 +0180 +0340 +0430 +1808 +ENDCHAR +STARTCHAR B1E8 +ENCODING 45544 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 10 1 1 +BITMAP +3000 +1000 +1000 +1000 +1FF8 +0040 +0420 +0420 +0440 +FFFE +ENDCHAR +STARTCHAR B1E9 +ENCODING 45545 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 2 -2 +BITMAP +6000 +2000 +2000 +3FE0 +18C0 +0880 +FFFC +0000 +3FE0 +1020 +0020 +0020 +0020 +0020 +ENDCHAR +STARTCHAR B1EC +ENCODING 45548 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 13 1 -1 +BITMAP +2000 +1000 +1000 +1010 +1FE0 +0440 +0440 +FFFE +0000 +1800 +0800 +0800 +0FF8 +ENDCHAR +STARTCHAR B1F0 +ENCODING 45552 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 13 1 -1 +BITMAP +3000 +1000 +1000 +0FF0 +0480 +0480 +FFFE +0000 +1FF0 +0010 +1FF0 +0800 +0FF8 +ENDCHAR +STARTCHAR B1F9 +ENCODING 45561 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +3000 +1000 +1000 +1FF0 +0C40 +0440 +FFFE +0000 +1060 +0820 +0FE0 +0820 +0FE0 +0820 +ENDCHAR +STARTCHAR B1FB +ENCODING 45563 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +7000 +1000 +1000 +1010 +0FF0 +04C0 +04C0 +0880 +FFFC +0400 +0200 +0600 +0D80 +1060 +6030 +ENDCHAR +STARTCHAR B1FD +ENCODING 45565 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 1 -2 +BITMAP +3000 +1000 +1000 +0FF8 +0440 +0440 +FFFC +0000 +0100 +06C0 +0820 +0820 +0460 +0380 +ENDCHAR +STARTCHAR B204 +ENCODING 45572 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -2 +BITMAP +6000 +1000 +1000 +1000 +1FF0 +0000 +0000 +FFFE +0100 +0100 +0100 +0100 +0100 +0100 +0100 +ENDCHAR +STARTCHAR B205 +ENCODING 45573 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -3 +BITMAP +7000 +1000 +1000 +1FF0 +0000 +0004 +FFFE +0100 +0100 +0160 +0EA0 +0020 +0020 +0020 +0020 +ENDCHAR +STARTCHAR B208 +ENCODING 45576 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 13 1 -1 +BITMAP +7000 +1000 +1000 +1FF0 +0000 +0004 +FFFE +0100 +2100 +1100 +1100 +1100 +1FF0 +ENDCHAR +STARTCHAR B20B +ENCODING 45579 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 2 -2 +BITMAP +3000 +1000 +1000 +1FF0 +0000 +0008 +FFFC +0200 +0200 +1FE0 +1000 +1000 +1000 +0FE0 +ENDCHAR +STARTCHAR B20C +ENCODING 45580 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +7000 +1000 +1030 +1FF0 +0000 +FFFE +0100 +0100 +3FF0 +0020 +1FE0 +0800 +0800 +0FF8 +ENDCHAR +STARTCHAR B214 +ENCODING 45588 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +7000 +1000 +1000 +1FF0 +0000 +0000 +FFFE +0100 +0100 +0FE0 +0820 +0820 +0FE0 +0800 +ENDCHAR +STARTCHAR B215 +ENCODING 45589 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 2 -2 +BITMAP +6000 +2000 +2000 +3FE0 +0000 +0000 +FFFC +0200 +22C0 +1240 +1FC0 +1040 +1FC0 +1040 +ENDCHAR +STARTCHAR B217 +ENCODING 45591 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 2 -2 +BITMAP +6000 +2000 +2060 +3FE0 +0000 +0000 +FFFC +0200 +0200 +0200 +0200 +0580 +1860 +6000 +ENDCHAR +STARTCHAR B219 +ENCODING 45593 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +1800 +0800 +0800 +0FF8 +0000 +0000 +FFFE +0100 +0100 +06C0 +0820 +0820 +0C60 +07C0 +ENDCHAR +STARTCHAR B220 +ENCODING 45600 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 1 -2 +BITMAP +0038 +0008 +6008 +2008 +2188 +3F88 +0008 +0048 +FF88 +04F8 +0408 +0408 +0408 +0408 +0008 +ENDCHAR +STARTCHAR B234 +ENCODING 45620 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0010 +C010 +2010 +2110 +3F10 +0090 +FF10 +08F0 +0800 +0C30 +0C20 +1A70 +22C8 +4108 +ENDCHAR +STARTCHAR B23C +ENCODING 45628 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 1 -2 +BITMAP +0018 +0088 +0048 +0048 +2048 +2048 +2048 +2748 +1B48 +FC48 +09C8 +0848 +0848 +0048 +0008 +ENDCHAR +STARTCHAR B258 +ENCODING 45656 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0070 +0010 +E010 +2010 +2010 +2390 +1C10 +0010 +00D0 +FF10 +0410 +0410 +0410 +0410 +0410 +ENDCHAR +STARTCHAR B25C +ENCODING 45660 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0010 +6010 +2010 +2110 +3F10 +0030 +FFD0 +0410 +0410 +0010 +0C00 +0400 +0400 +07F8 +ENDCHAR +STARTCHAR B260 +ENCODING 45664 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +6010 +2010 +2110 +3F10 +00F0 +FF10 +0410 +0400 +0FF0 +0010 +0FF0 +0400 +0400 +07F8 +ENDCHAR +STARTCHAR B268 +ENCODING 45672 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0030 +0010 +6010 +2010 +2110 +3F10 +01F0 +FE10 +0410 +0000 +0FF0 +0410 +0410 +0420 +07F0 +0400 +ENDCHAR +STARTCHAR B269 +ENCODING 45673 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0030 +6010 +2010 +2010 +3F10 +0010 +00F0 +FF10 +0410 +0830 +0410 +07F0 +0410 +0410 +07F0 +0410 +ENDCHAR +STARTCHAR B274 +ENCODING 45684 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 2 -2 +BITMAP +6000 +2000 +2000 +3FE0 +0000 +0000 +FFFC +0840 +0840 +0840 +0840 +0840 +0840 +0840 +ENDCHAR +STARTCHAR B275 +ENCODING 45685 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 14 2 -2 +BITMAP +3000 +1000 +1000 +1FF0 +0000 +0008 +FFF8 +0880 +0880 +3FC0 +0040 +0040 +0040 +0040 +ENDCHAR +STARTCHAR B27C +ENCODING 45692 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 13 2 -1 +BITMAP +3000 +1000 +1000 +1FF0 +0000 +0000 +FFFC +0880 +3F80 +0040 +1FC0 +1000 +1FE0 +ENDCHAR +STARTCHAR B284 +ENCODING 45700 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 2 -2 +BITMAP +7000 +1000 +1000 +1FF0 +0000 +FFFC +0840 +0840 +0000 +1FC0 +1040 +1080 +1F80 +1000 +ENDCHAR +STARTCHAR B285 +ENCODING 45701 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 2 -2 +BITMAP +6000 +2000 +2000 +3FE0 +0000 +FFFC +0880 +0880 +30C0 +1040 +1FC0 +1040 +1FC0 +1040 +ENDCHAR +STARTCHAR B289 +ENCODING 45705 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +3000 +1000 +1000 +1FF8 +0000 +0000 +FFFE +0420 +0920 +06C0 +0820 +0820 +0C60 +03C0 +ENDCHAR +STARTCHAR B290 +ENCODING 45712 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 10 1 0 +BITMAP +3000 +1000 +1000 +1010 +1FF8 +0000 +0000 +0000 +0000 +FFFE +ENDCHAR +STARTCHAR B291 +ENCODING 45713 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -3 +BITMAP +2000 +1000 +1000 +1000 +1FF0 +0000 +FFFE +0000 +0000 +1FF0 +0010 +0010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR B294 +ENCODING 45716 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 12 1 -1 +BITMAP +3000 +1000 +1030 +1FF0 +0000 +0004 +FFFE +3000 +0800 +0800 +0800 +0FF8 +ENDCHAR +STARTCHAR B298 +ENCODING 45720 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +7000 +1000 +1000 +1FF0 +0000 +0000 +FFFE +0000 +1FF0 +0010 +1FF0 +0800 +0800 +07F0 +ENDCHAR +STARTCHAR B299 +ENCODING 45721 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +3000 +1000 +1000 +1FF0 +0000 +FFFE +0000 +0000 +3EF0 +0210 +3E10 +1010 +1110 +1E10 +ENDCHAR +STARTCHAR B29A +ENCODING 45722 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 2 -2 +BITMAP +3000 +1000 +1000 +1FF0 +0000 +0008 +FFFC +0000 +7C00 +05F0 +6D20 +3120 +2DE0 +1100 +ENDCHAR +STARTCHAR B2A0 +ENCODING 45728 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +7000 +1000 +1000 +1FF0 +0000 +0000 +FFFE +0000 +0000 +1FF0 +0820 +0820 +0FE0 +0800 +ENDCHAR +STARTCHAR B2A1 +ENCODING 45729 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 2 -2 +BITMAP +3000 +1000 +1000 +1FF0 +0000 +0000 +FFFC +3040 +1040 +1FC0 +1040 +1040 +1FC0 +1040 +ENDCHAR +STARTCHAR B2A3 +ENCODING 45731 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 2 -2 +BITMAP +3000 +1000 +1000 +1000 +1FF0 +0000 +FFFC +0000 +0200 +0200 +0700 +0CC0 +1020 +2000 +ENDCHAR +STARTCHAR B2A5 +ENCODING 45733 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +3000 +1000 +1010 +1FF0 +0000 +0004 +FFFE +2100 +07C0 +0C60 +0820 +0820 +0C60 +03C0 +ENDCHAR +STARTCHAR B2A6 +ENCODING 45734 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +3000 +1000 +1010 +0FE0 +0000 +0000 +FFFE +2000 +2078 +1F80 +0100 +02C0 +0C30 +1008 +ENDCHAR +STARTCHAR B2AA +ENCODING 45738 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 13 2 -1 +BITMAP +E000 +2000 +2020 +3FE0 +0000 +0000 +FFFC +4000 +40E0 +3FC0 +0880 +0880 +7FF0 +ENDCHAR +STARTCHAR B2AC +ENCODING 45740 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 1 -2 +BITMAP +0030 +0008 +2008 +1008 +1008 +1048 +1FC8 +0008 +0008 +00E8 +FF08 +0008 +0008 +0008 +0008 +ENDCHAR +STARTCHAR B2B0 +ENCODING 45744 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 14 2 -1 +BITMAP +0030 +0010 +4010 +2010 +2010 +2010 +3F90 +0010 +FFF0 +2010 +1810 +0800 +0810 +0FF8 +ENDCHAR +STARTCHAR B2B4 +ENCODING 45748 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 11 15 3 -2 +BITMAP +00C0 +0060 +C020 +4020 +4120 +7F20 +0020 +03E0 +FC20 +3FE0 +0020 +3FE0 +1000 +1000 +1FE0 +ENDCHAR +STARTCHAR B2C8 +ENCODING 45768 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 1 -2 +BITMAP +0038 +0008 +0008 +E008 +2008 +2008 +2008 +2008 +2068 +3F88 +3008 +0008 +0008 +0008 +0008 +ENDCHAR +STARTCHAR B2C9 +ENCODING 45769 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 1 -2 +BITMAP +0018 +0008 +E008 +2008 +2008 +2008 +21C8 +3E08 +0000 +1FF0 +0010 +0010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR B2CC +ENCODING 45772 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 1 -1 +BITMAP +0018 +0008 +C008 +2008 +2008 +2008 +2048 +2F88 +3008 +0008 +0C08 +0400 +0400 +07FC +ENDCHAR +STARTCHAR B2D0 +ENCODING 45776 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 1 -1 +BITMAP +0018 +0008 +E008 +2008 +2008 +2028 +2FC8 +1008 +0010 +0FF0 +0010 +07F8 +0400 +07FC +ENDCHAR +STARTCHAR B2D2 +ENCODING 45778 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 14 2 -2 +BITMAP +0060 +0020 +C020 +4020 +4020 +43E0 +7C20 +7C20 +04D0 +0890 +3090 +2090 +3CF0 +0080 +ENDCHAR +STARTCHAR B2D8 +ENCODING 45784 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +8010 +4010 +4010 +4010 +4390 +7C10 +0000 +1FE0 +0820 +0820 +0820 +0FE0 +0800 +ENDCHAR +STARTCHAR B2D9 +ENCODING 45785 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0070 +0010 +0010 +C010 +4010 +4010 +43D0 +7C10 +0000 +1C10 +0410 +07F0 +0410 +07F0 +0410 +ENDCHAR +STARTCHAR B2DB +ENCODING 45787 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 3 -2 +BITMAP +0040 +0020 +8020 +4020 +4020 +4020 +43E0 +7C20 +0020 +0220 +0100 +0300 +0480 +1860 +2010 +ENDCHAR +STARTCHAR B2DD +ENCODING 45789 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +0010 +C010 +4010 +4010 +4090 +7F10 +0010 +0090 +0360 +0410 +0410 +0630 +03E0 +ENDCHAR +STARTCHAR B2E2 +ENCODING 45794 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 14 2 -1 +BITMAP +0030 +0010 +8010 +4010 +4010 +4010 +41F0 +7E10 +0010 +1FF0 +0060 +0440 +0640 +3FF8 +ENDCHAR +STARTCHAR B2E4 +ENCODING 45796 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -2 +BITMAP +0070 +0010 +0010 +FF90 +2010 +2010 +2010 +201E +2030 +23D0 +3C10 +0010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR B2E5 +ENCODING 45797 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 16 2 -3 +BITMAP +0060 +0020 +0220 +FC20 +4020 +402C +40B0 +5F20 +2020 +0000 +3FE0 +0020 +0020 +0020 +0020 +0020 +ENDCHAR +STARTCHAR B2E6 +ENCODING 45798 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 3 -2 +BITMAP +00C0 +0440 +FC40 +8040 +8040 +8078 +8740 +F840 +0000 +7BC0 +0840 +0840 +0840 +0840 +0040 +ENDCHAR +STARTCHAR B2E8 +ENCODING 45800 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +00E0 +0020 +0220 +FE20 +4020 +4024 +4038 +40A0 +4F20 +7020 +1020 +0800 +0800 +0800 +0FF8 +ENDCHAR +STARTCHAR B2EB +ENCODING 45803 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -2 +BITMAP +0060 +0030 +0110 +FF10 +2010 +2010 +201E +21D0 +3E10 +0000 +0FF0 +0400 +0400 +0408 +07FC +ENDCHAR +STARTCHAR B2EC +ENCODING 45804 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +00C0 +0260 +FE20 +4020 +4020 +402C +43B0 +7C20 +0020 +1FE0 +0020 +1FE0 +0800 +0800 +07F0 +ENDCHAR +STARTCHAR B2ED +ENCODING 45805 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0060 +0220 +FE20 +4020 +4024 +4078 +4FA0 +3020 +0000 +7DE0 +0420 +6C20 +3020 +2220 +3C20 +ENDCHAR +STARTCHAR B2EE +ENCODING 45806 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0060 +0020 +FE20 +4020 +402C +40F0 +4F20 +7020 +0000 +7DF0 +0520 +7D20 +2120 +23E0 +3D00 +ENDCHAR +STARTCHAR B2EF +ENCODING 45807 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 16 3 -3 +BITMAP +00C0 +0040 +FC40 +8040 +8040 +8058 +87E0 +F840 +0000 +FA40 +1240 +0BC0 +7240 +4640 +7BC0 +0240 +ENDCHAR +STARTCHAR B2F3 +ENCODING 45811 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +00E0 +0020 +8E20 +7020 +4020 +4078 +5FA0 +2000 +00E0 +3C18 +09E0 +30A0 +2110 +3D10 +00E0 +ENDCHAR +STARTCHAR B2F4 +ENCODING 45812 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +00E0 +0020 +0220 +FE20 +4020 +403C +4020 +43A0 +7C20 +0000 +0FE0 +0820 +0820 +0FE0 +0800 +ENDCHAR +STARTCHAR B2F5 +ENCODING 45813 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 3 -2 +BITMAP +01C0 +0040 +0C40 +F040 +8040 +8078 +8140 +FE40 +0000 +30C0 +1040 +1FC0 +1040 +1FC0 +1040 +ENDCHAR +STARTCHAR B2F7 +ENCODING 45815 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 3 -2 +BITMAP +0100 +00C0 +0040 +F840 +8040 +8040 +80F8 +8F40 +F040 +0240 +0100 +0300 +0480 +0860 +3010 +ENDCHAR +STARTCHAR B2F8 +ENCODING 45816 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 3 -2 +BITMAP +00C0 +0440 +FC40 +8040 +8040 +80F0 +8F40 +7040 +0000 +10C0 +0840 +1880 +24C0 +4130 +8610 +ENDCHAR +STARTCHAR B2F9 +ENCODING 45817 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0060 +0020 +8620 +7820 +4020 +403C +40A0 +7F20 +0020 +0100 +06C0 +0820 +0820 +0C60 +03C0 +ENDCHAR +STARTCHAR B2FA +ENCODING 45818 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0060 +0020 +FF20 +4020 +4020 +403C +47E0 +7820 +0020 +3FF0 +0100 +0380 +0640 +0830 +3010 +ENDCHAR +STARTCHAR B2FB +ENCODING 45819 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 16 2 -3 +BITMAP +0060 +0020 +0020 +FE20 +4020 +403C +43A0 +7C20 +0780 +0000 +3FF0 +0100 +0280 +0460 +1810 +2000 +ENDCHAR +STARTCHAR B2FF +ENCODING 45823 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 3 -3 +BITMAP +00C0 +0040 +0840 +F040 +8040 +8040 +8170 +FE40 +0040 +0700 +7FE0 +0200 +0F80 +0880 +0880 +0700 +ENDCHAR +STARTCHAR B300 +ENCODING 45824 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 11 15 3 -2 +BITMAP +00C0 +0220 +0120 +0120 +F120 +8120 +8120 +8120 +81E0 +8720 +F920 +0120 +0120 +0120 +0020 +ENDCHAR +STARTCHAR B301 +ENCODING 45825 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0040 +0230 +0110 +FD10 +4110 +4110 +41F0 +4310 +7D10 +0110 +1FF0 +0810 +0010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR B304 +ENCODING 45828 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0040 +0130 +0090 +8890 +7090 +4090 +4090 +47F0 +7890 +0090 +0C90 +0490 +0400 +0400 +03FC +ENDCHAR +STARTCHAR B308 +ENCODING 45832 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0130 +0090 +8C90 +7090 +4090 +40F0 +4390 +7C90 +0FF0 +0010 +0020 +0FF0 +0400 +0400 +07F8 +ENDCHAR +STARTCHAR B310 +ENCODING 45840 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0060 +0010 +0310 +FD10 +4110 +4110 +43F0 +5D10 +7110 +0110 +1FE0 +0820 +0820 +0FE0 +0800 +ENDCHAR +STARTCHAR B311 +ENCODING 45841 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0030 +0190 +FC90 +4090 +4090 +40F0 +4190 +7E90 +0080 +0810 +0410 +07F0 +0410 +0410 +07F0 +0410 +ENDCHAR +STARTCHAR B313 +ENCODING 45843 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0090 +0090 +F890 +4090 +4090 +40F0 +4390 +7C90 +0190 +0180 +0180 +0260 +0C10 +1008 +ENDCHAR +STARTCHAR B314 +ENCODING 45844 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0060 +0310 +0090 +FC90 +4090 +4090 +41F0 +5E90 +6090 +0820 +0420 +0C20 +1A50 +2188 +4108 +ENDCHAR +STARTCHAR B315 +ENCODING 45845 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0060 +0190 +0090 +8C90 +7090 +4090 +40F0 +4190 +4E90 +7090 +0340 +0420 +0420 +0660 +03C0 +ENDCHAR +STARTCHAR B31C +ENCODING 45852 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +00E0 +0020 +0220 +FF20 +4020 +4038 +4020 +4020 +40E0 +473C +3820 +0020 +0020 +0020 +0020 +ENDCHAR +STARTCHAR B354 +ENCODING 45908 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0070 +0010 +0210 +FE10 +4010 +4010 +41F0 +4010 +4010 +4090 +7F10 +0010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR B355 +ENCODING 45909 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0070 +0210 +FE10 +4010 +43F0 +4010 +4010 +4610 +7810 +0000 +3FE0 +0020 +0020 +0020 +0020 +0020 +ENDCHAR +STARTCHAR B356 +ENCODING 45910 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0070 +0010 +CE10 +7010 +41F0 +4010 +4010 +7E10 +0010 +0000 +7CF0 +0410 +0410 +0410 +0410 +ENDCHAR +STARTCHAR B358 +ENCODING 45912 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 3 -2 +BITMAP +00E0 +0020 +0420 +F820 +8020 +83E0 +8020 +8020 +FC20 +0020 +0020 +3000 +1000 +1000 +1FF0 +ENDCHAR +STARTCHAR B35B +ENCODING 45915 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 14 2 -2 +BITMAP +0070 +0610 +F810 +4010 +41F0 +4010 +7E10 +0010 +0010 +1FF0 +0800 +0800 +0800 +0FF0 +ENDCHAR +STARTCHAR B35C +ENCODING 45916 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +CE10 +7010 +41F0 +4010 +4110 +7E10 +1FE0 +0020 +0020 +1FE0 +0800 +0800 +07F0 +ENDCHAR +STARTCHAR B35E +ENCODING 45918 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0210 +FE10 +4010 +41F0 +4010 +4110 +7E10 +0000 +3CF8 +0490 +6C90 +3090 +20F0 +3E80 +ENDCHAR +STARTCHAR B35F +ENCODING 45919 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +FE10 +4010 +41F0 +4010 +4110 +7E10 +0110 +7D10 +05F0 +6D10 +3110 +23F0 +3D10 +ENDCHAR +STARTCHAR B364 +ENCODING 45924 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 1 -3 +BITMAP +0018 +E308 +3C08 +2008 +21F8 +2008 +2188 +3E08 +0008 +0FF0 +0410 +0410 +0410 +07F0 +0400 +ENDCHAR +STARTCHAR B365 +ENCODING 45925 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +C610 +7810 +41F0 +4010 +4010 +4610 +7C30 +0420 +07E0 +0420 +0420 +07E0 +0420 +ENDCHAR +STARTCHAR B367 +ENCODING 45927 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0010 +8610 +7810 +4010 +41F0 +4010 +4110 +7E10 +0110 +0190 +0180 +0240 +0C30 +1008 +ENDCHAR +STARTCHAR B369 +ENCODING 45929 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0210 +FE10 +4010 +43F0 +4010 +4010 +4610 +7810 +0080 +0360 +0410 +0410 +0630 +01E0 +ENDCHAR +STARTCHAR B36B +ENCODING 45931 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 11 15 3 -2 +BITMAP +0060 +0020 +FE20 +4020 +43E0 +4020 +4020 +7E20 +0020 +0700 +3FE0 +0200 +0500 +18C0 +6020 +ENDCHAR +STARTCHAR B36E +ENCODING 45934 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 1 -1 +BITMAP +0018 +0008 +FF08 +2008 +20F8 +2008 +2088 +3F08 +0018 +1FF8 +0020 +0420 +0240 +3FFC +ENDCHAR +STARTCHAR B370 +ENCODING 45936 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 11 15 3 -2 +BITMAP +0060 +0620 +0120 +1120 +E120 +8120 +8320 +8D20 +8120 +8920 +F120 +0120 +0120 +0120 +0020 +ENDCHAR +STARTCHAR B371 +ENCODING 45937 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0030 +0190 +0090 +F890 +4090 +4790 +4090 +4C90 +3090 +0090 +1FF0 +0010 +0010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR B374 +ENCODING 45940 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0110 +0090 +F890 +4090 +4390 +4090 +4090 +5C90 +2090 +0090 +0C00 +0400 +0400 +07F8 +ENDCHAR +STARTCHAR B378 +ENCODING 45944 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0110 +0090 +F890 +4090 +4790 +4090 +4C90 +7090 +0080 +1FF0 +0020 +1FE0 +0800 +0FF0 +ENDCHAR +STARTCHAR B380 +ENCODING 45952 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 14 2 -2 +BITMAP +0030 +0090 +FC90 +4090 +4F90 +4090 +4490 +7890 +0090 +07F0 +0410 +0420 +07F0 +0400 +ENDCHAR +STARTCHAR B381 +ENCODING 45953 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0030 +0110 +0090 +F890 +4090 +4790 +4090 +4C90 +7090 +0C10 +0410 +07F0 +0410 +0410 +07F0 +0410 +ENDCHAR +STARTCHAR B383 +ENCODING 45955 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0110 +0090 +F890 +4090 +4790 +4090 +4090 +7C90 +0110 +0090 +0180 +0360 +0410 +1808 +ENDCHAR +STARTCHAR B384 +ENCODING 45956 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0110 +0090 +F890 +4090 +4790 +4090 +4C90 +7090 +0040 +0420 +0840 +1E60 +1298 +6308 +ENDCHAR +STARTCHAR B385 +ENCODING 45957 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0190 +0090 +F890 +4090 +4790 +4090 +4C90 +7090 +0080 +0340 +0420 +0420 +0660 +03C0 +ENDCHAR +STARTCHAR B38C +ENCODING 45964 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +0210 +FE10 +40F0 +4010 +4010 +4010 +40F0 +4090 +7F10 +0010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR B390 +ENCODING 45968 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 14 3 -1 +BITMAP +0060 +0020 +0C20 +F3E0 +8020 +8020 +83E0 +8020 +F820 +2020 +1020 +1000 +1020 +1FF0 +ENDCHAR +STARTCHAR B394 +ENCODING 45972 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0070 +0010 +CE10 +71F0 +4010 +41F0 +4110 +7E10 +1FF0 +0020 +0020 +1FE0 +0800 +0800 +0FF8 +ENDCHAR +STARTCHAR B3A0 +ENCODING 45984 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 3 -2 +BITMAP +0060 +0020 +0C20 +F1E0 +8020 +8020 +83E0 +F820 +0000 +1040 +0840 +1840 +24A0 +4510 +8210 +ENDCHAR +STARTCHAR B3A1 +ENCODING 45985 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +C610 +78F0 +4010 +4010 +40F0 +4210 +7C10 +0040 +03A0 +0210 +0210 +0230 +01E0 +ENDCHAR +STARTCHAR B3A8 +ENCODING 45992 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 11 15 3 -2 +BITMAP +0060 +0620 +0120 +1120 +E120 +8F20 +8120 +8F20 +8120 +8920 +F120 +0120 +0120 +0120 +0020 +ENDCHAR +STARTCHAR B3AC +ENCODING 45996 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0310 +0090 +FC90 +4790 +4090 +4190 +4290 +5C90 +6090 +0890 +0400 +0400 +0408 +07F8 +ENDCHAR +STARTCHAR B3C4 +ENCODING 46020 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 11 1 0 +BITMAP +0010 +3FF0 +1000 +1000 +1000 +1000 +1FF8 +0100 +0100 +0100 +FFFE +ENDCHAR +STARTCHAR B3C5 +ENCODING 46021 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 1 -2 +BITMAP +1FF0 +1000 +1000 +1000 +0FF0 +0100 +0100 +FFFC +0000 +3FF0 +0010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR B3C8 +ENCODING 46024 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +3FF0 +1000 +1000 +1000 +1FE0 +0100 +0100 +FFFE +0000 +1000 +0800 +0800 +0800 +0FF8 +ENDCHAR +STARTCHAR B3CB +ENCODING 46027 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 1 -2 +BITMAP +0030 +3FF0 +1000 +1000 +1020 +1FC0 +0100 +0100 +FFFC +0000 +77F0 +1800 +1000 +1000 +0FF0 +ENDCHAR +STARTCHAR B3CC +ENCODING 46028 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +30F0 +1F00 +1000 +1000 +1FF0 +0100 +FFFE +0000 +3FF0 +0010 +1FE0 +0800 +0800 +0FF8 +ENDCHAR +STARTCHAR B3CE +ENCODING 46030 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +3FF0 +1000 +1000 +1000 +1FF0 +0100 +FFFE +0000 +3E00 +06F8 +3E90 +1090 +16F0 +0880 +ENDCHAR +STARTCHAR B3D0 +ENCODING 46032 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 2 -2 +BITMAP +31E0 +1E00 +1000 +1000 +1FE0 +0200 +FFFC +0000 +3CC0 +0440 +6CC0 +30A0 +2D10 +3200 +ENDCHAR +STARTCHAR B3D4 +ENCODING 46036 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 2 -2 +BITMAP +1FF0 +1000 +1000 +1020 +1FC0 +0100 +FFFC +0000 +0000 +1FC0 +1040 +1040 +1FC0 +1000 +ENDCHAR +STARTCHAR B3D5 +ENCODING 46037 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +1FF0 +1000 +1000 +1010 +0FF0 +0100 +FFFE +0000 +1820 +0820 +0FE0 +0820 +0FE0 +0820 +ENDCHAR +STARTCHAR B3D7 +ENCODING 46039 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 2 -2 +BITMAP +3FF0 +1000 +1000 +1030 +1FC0 +0100 +0100 +FFFE +0400 +0300 +0200 +0580 +0860 +3010 +ENDCHAR +STARTCHAR B3D9 +ENCODING 46041 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 2 -2 +BITMAP +0FF0 +1000 +1000 +1000 +1FF0 +0100 +FFFC +0000 +0200 +0D80 +1040 +1040 +18C0 +0F80 +ENDCHAR +STARTCHAR B3DB +ENCODING 46043 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -3 +BITMAP +1FF0 +1000 +1000 +1030 +0FC0 +0200 +FFFC +0780 +0000 +7FF0 +0200 +0700 +0CC0 +1020 +2000 +ENDCHAR +STARTCHAR B3DD +ENCODING 46045 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 2 -2 +BITMAP +1FE0 +1000 +1000 +1000 +1FF0 +0200 +FFFC +0000 +0000 +1FE0 +1000 +1FE0 +1000 +1FE0 +ENDCHAR +STARTCHAR B3E0 +ENCODING 46048 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 16 1 -3 +BITMAP +0060 +0010 +0110 +7F10 +2010 +2010 +2010 +2190 +1E16 +0418 +04F0 +FF10 +0010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR B3E4 +ENCODING 46052 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 14 3 -2 +BITMAP +00C0 +0040 +8740 +7840 +4040 +4240 +3C48 +0870 +0FC0 +F040 +3040 +1000 +1000 +1FF0 +ENDCHAR +STARTCHAR B3E8 +ENCODING 46056 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -2 +BITMAP +0030 +0110 +3F10 +2010 +2010 +1F96 +0418 +FFF0 +0000 +0FF0 +0020 +0020 +0FF0 +0400 +07F8 +ENDCHAR +STARTCHAR B3FC +ENCODING 46076 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0060 +0110 +0090 +DC90 +6090 +4090 +4490 +7890 +10F0 +1090 +1E90 +F090 +0090 +0090 +0010 +ENDCHAR +STARTCHAR B410 +ENCODING 46096 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0110 +0090 +7C90 +4090 +7E90 +10F0 +1390 +FC90 +0040 +0C20 +0C40 +0E60 +3298 +4108 +ENDCHAR +STARTCHAR B418 +ENCODING 46104 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 11 15 3 -2 +BITMAP +00E0 +0020 +0220 +FE20 +4020 +4020 +4120 +7F20 +0820 +0820 +0FA0 +F020 +0020 +0020 +0020 +ENDCHAR +STARTCHAR B41C +ENCODING 46108 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 14 2 -1 +BITMAP +0030 +0110 +7F10 +2010 +2010 +2090 +3F90 +0410 +0430 +FFD0 +1810 +0800 +0800 +0FF8 +ENDCHAR +STARTCHAR B420 +ENCODING 46112 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 11 15 3 -2 +BITMAP +0060 +0220 +FE20 +4020 +4020 +4F20 +3820 +0BA0 +F400 +3FC0 +0040 +3FC0 +1000 +1000 +1FE0 +ENDCHAR +STARTCHAR B428 +ENCODING 46120 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +7F10 +2010 +2010 +2190 +1E10 +0410 +FFD0 +0000 +0FF0 +0410 +0420 +07F0 +0400 +ENDCHAR +STARTCHAR B429 +ENCODING 46121 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +7F90 +2010 +2010 +2190 +1E10 +0410 +FFC0 +2C30 +0410 +07F0 +0410 +07F0 +0410 +ENDCHAR +STARTCHAR B42B +ENCODING 46123 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 3 -2 +BITMAP +00E0 +0020 +7E20 +4020 +4020 +4320 +3C20 +0860 +F7A0 +0220 +0100 +0300 +0480 +0860 +3010 +ENDCHAR +STARTCHAR B434 +ENCODING 46132 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 11 1 0 +BITMAP +3FF0 +1000 +1000 +1000 +1010 +1FF8 +0000 +0C60 +0420 +0440 +FFFE +ENDCHAR +STARTCHAR B450 +ENCODING 46160 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -3 +BITMAP +3FF0 +1000 +1000 +1010 +1FF0 +0000 +0004 +FFFE +0100 +0100 +0100 +0100 +0100 +0100 +0100 +ENDCHAR +STARTCHAR B451 +ENCODING 46161 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -3 +BITMAP +1FF0 +1000 +1000 +1000 +1FF0 +0000 +FFFE +0100 +0100 +1FF0 +0010 +0010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR B454 +ENCODING 46164 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 13 1 -1 +BITMAP +3FF0 +1000 +1000 +1000 +1FF0 +0000 +FFFE +0100 +0100 +0900 +0900 +0800 +07F8 +ENDCHAR +STARTCHAR B458 +ENCODING 46168 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +3FE0 +1000 +1000 +1000 +1FF0 +0000 +FFFE +0100 +3F00 +00E0 +1FE0 +0800 +0800 +0FF0 +ENDCHAR +STARTCHAR B460 +ENCODING 46176 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +1FB0 +0840 +0800 +0800 +0FF0 +0004 +FFFE +0100 +0100 +0FE0 +0820 +0820 +0FE0 +0800 +ENDCHAR +STARTCHAR B461 +ENCODING 46177 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -3 +BITMAP +3FE0 +1000 +1000 +1000 +1FF0 +0000 +FFFC +0200 +22C0 +1040 +1FC0 +1040 +1040 +1FC0 +1040 +ENDCHAR +STARTCHAR B463 +ENCODING 46179 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 2 -2 +BITMAP +0FE0 +1000 +1000 +1000 +1FF0 +0000 +FFFC +0200 +0200 +0300 +0200 +0580 +1860 +6010 +ENDCHAR +STARTCHAR B465 +ENCODING 46181 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 2 -2 +BITMAP +1FE0 +1000 +1000 +1000 +1FF0 +0000 +FFFC +0100 +0100 +0780 +0840 +0840 +0C40 +0780 +ENDCHAR +STARTCHAR B46C +ENCODING 46188 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +6790 +3810 +2010 +2110 +3F10 +0010 +0110 +FE30 +08D0 +0810 +0810 +0810 +0010 +ENDCHAR +STARTCHAR B480 +ENCODING 46208 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0010 +3F10 +2010 +2110 +3F10 +0190 +FEF0 +0010 +0060 +0420 +0C60 +0A50 +1288 +6108 +ENDCHAR +STARTCHAR B488 +ENCODING 46216 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0070 +0110 +0090 +FE90 +4090 +4090 +4490 +3890 +0290 +7C90 +0F90 +0890 +0890 +0890 +0010 +ENDCHAR +STARTCHAR B49D +ENCODING 46237 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0020 +01B0 +0C90 +7090 +4090 +4E90 +3090 +FE90 +1390 +1090 +03D0 +0420 +0420 +0620 +03C0 +ENDCHAR +STARTCHAR B4A4 +ENCODING 46244 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0110 +7F10 +2010 +2010 +2110 +3F90 +0010 +00D0 +FF10 +0410 +0410 +0410 +0410 +0010 +ENDCHAR +STARTCHAR B4A8 +ENCODING 46248 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0110 +3E10 +2010 +2110 +3F90 +0030 +FFD0 +0410 +0410 +0010 +0C00 +0400 +0400 +07F8 +ENDCHAR +STARTCHAR B4AC +ENCODING 46252 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +0010 +3F10 +2110 +3F10 +0030 +FFD0 +0410 +1FE0 +0020 +0020 +1FE0 +0810 +0FF0 +ENDCHAR +STARTCHAR B4B5 +ENCODING 46261 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0070 +0110 +3F10 +2010 +2110 +1F10 +0010 +FFF0 +0410 +0810 +0410 +07F0 +0410 +0410 +07F0 +0410 +ENDCHAR +STARTCHAR B4B7 +ENCODING 46263 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 16 2 -3 +BITMAP +0070 +0110 +3F10 +2010 +2010 +2110 +1F90 +00D0 +FF10 +0810 +0890 +0180 +0140 +0630 +0808 +1000 +ENDCHAR +STARTCHAR B4B9 +ENCODING 46265 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0110 +3F10 +2010 +2110 +3F10 +0010 +FFF0 +0410 +0490 +0360 +0410 +0410 +0630 +03E0 +ENDCHAR +STARTCHAR B4C0 +ENCODING 46272 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -3 +BITMAP +3FF0 +1000 +1000 +1000 +1FF0 +0000 +0000 +FFFC +0840 +0840 +0840 +0840 +0840 +0840 +0040 +ENDCHAR +STARTCHAR B4C4 +ENCODING 46276 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 13 1 -1 +BITMAP +1FF8 +0800 +0800 +0800 +0FF8 +0000 +FFFE +0420 +0420 +1C20 +0820 +0800 +0FF8 +ENDCHAR +STARTCHAR B4C8 +ENCODING 46280 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 13 2 -1 +BITMAP +30E0 +1F00 +1000 +1020 +1FF0 +0000 +FFFC +08C0 +2FE0 +1020 +1FE0 +0800 +0FF0 +ENDCHAR +STARTCHAR B4D0 +ENCODING 46288 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -3 +BITMAP +1FE0 +1000 +1000 +1000 +1FE0 +C03C +FFE0 +0840 +0800 +3FC0 +1040 +1080 +1080 +1FC0 +1000 +ENDCHAR +STARTCHAR B4D5 +ENCODING 46293 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +07F8 +0800 +0800 +0800 +0FF8 +0000 +FFFE +0420 +0520 +06C0 +0820 +0820 +0C60 +03C0 +ENDCHAR +STARTCHAR B4DC +ENCODING 46300 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 11 2 0 +BITMAP +0060 +7FE0 +2000 +2000 +2060 +3FE0 +0000 +0000 +0008 +03FC +FE00 +ENDCHAR +STARTCHAR B4DD +ENCODING 46301 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -3 +BITMAP +0020 +3FF0 +1000 +1030 +1FF0 +0000 +0000 +FFFC +0000 +3FE0 +0020 +0020 +0020 +0020 +0020 +ENDCHAR +STARTCHAR B4E0 +ENCODING 46304 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 12 2 -1 +BITMAP +1FF0 +1000 +1030 +1FF0 +0000 +0000 +FFFC +6000 +1000 +1000 +1000 +1FF0 +ENDCHAR +STARTCHAR B4E3 +ENCODING 46307 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +3FF0 +1000 +1000 +1000 +1FF0 +0000 +FFFE +0000 +0000 +0FF0 +0800 +0800 +0800 +07F8 +ENDCHAR +STARTCHAR B4E4 +ENCODING 46308 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +0FF0 +3000 +1000 +1000 +1FF0 +0000 +FFFE +0000 +1FF0 +0020 +1FF0 +0800 +0800 +07F0 +ENDCHAR +STARTCHAR B4E6 +ENCODING 46310 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 2 -2 +BITMAP +3FE0 +1000 +1000 +1000 +1FE0 +0000 +FFFC +0000 +0000 +3DF0 +0510 +3920 +2DE0 +1100 +ENDCHAR +STARTCHAR B4EC +ENCODING 46316 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 2 -2 +BITMAP +3FF0 +1000 +1000 +1000 +1FF0 +0000 +FFFC +0000 +0000 +3FC0 +1040 +1040 +1FC0 +1000 +ENDCHAR +STARTCHAR B4ED +ENCODING 46317 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +0030 +0FF0 +0800 +0810 +0FF8 +0000 +FFFE +0000 +1820 +0820 +0FE0 +0820 +0FE0 +0820 +ENDCHAR +STARTCHAR B4EF +ENCODING 46319 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 2 -2 +BITMAP +0060 +3FE0 +1000 +1020 +1FF0 +0000 +0000 +FFFC +0400 +0300 +0300 +0480 +1860 +2010 +ENDCHAR +STARTCHAR B4F1 +ENCODING 46321 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +0038 +1FF8 +0800 +0800 +0FF8 +0000 +0000 +FFFE +0100 +07C0 +0C60 +0820 +0C60 +03C0 +ENDCHAR +STARTCHAR B4F8 +ENCODING 46328 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0060 +0010 +0110 +3F10 +2010 +2010 +2090 +3F90 +0010 +0010 +00F0 +FF10 +0010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR B514 +ENCODING 46356 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0070 +0010 +0010 +FF10 +4010 +4010 +4010 +4010 +4010 +4390 +7C10 +0010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR B515 +ENCODING 46357 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 10 16 4 -3 +BITMAP +00C0 +0040 +0C40 +F040 +8040 +8040 +8140 +FE40 +0040 +0000 +FF80 +0080 +0080 +0080 +0080 +0080 +ENDCHAR +STARTCHAR B518 +ENCODING 46360 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0010 +0610 +F810 +4010 +4010 +4010 +4190 +7E10 +0010 +1C10 +0400 +0400 +0400 +07F8 +ENDCHAR +STARTCHAR B51B +ENCODING 46363 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 1 -2 +BITMAP +0018 +0008 +0108 +FF08 +2008 +2008 +2008 +20C8 +3F08 +0010 +0FF0 +0400 +0400 +0400 +07F8 +ENDCHAR +STARTCHAR B51C +ENCODING 46364 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 1 -2 +BITMAP +0018 +0008 +E708 +3808 +2008 +2008 +21C8 +3E08 +0000 +0FF0 +0010 +0FF0 +0400 +0400 +03F8 +ENDCHAR +STARTCHAR B524 +ENCODING 46372 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +0210 +FE10 +4010 +4010 +4010 +4090 +7F10 +0000 +0FF0 +0410 +0420 +0420 +07C0 +ENDCHAR +STARTCHAR B525 +ENCODING 46373 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0030 +0210 +FE10 +4010 +4010 +4010 +4190 +7E10 +0000 +0830 +0410 +07F0 +0410 +0410 +07F0 +0410 +ENDCHAR +STARTCHAR B527 +ENCODING 46375 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 3 -2 +BITMAP +0060 +0020 +0020 +FE20 +4020 +4020 +4020 +40A0 +7F20 +0320 +0180 +0180 +0240 +0C30 +1010 +ENDCHAR +STARTCHAR B528 +ENCODING 46376 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 3 -2 +BITMAP +00C0 +0020 +0220 +FE20 +4020 +4020 +4020 +43E0 +3C20 +00C0 +0840 +0840 +14A0 +2310 +4208 +ENDCHAR +STARTCHAR B529 +ENCODING 46377 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +0210 +FE10 +4010 +4010 +4010 +4190 +7E10 +0040 +01A0 +0210 +0210 +0230 +01E0 +ENDCHAR +STARTCHAR B52A +ENCODING 46378 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +0210 +FE10 +4010 +4010 +4010 +4190 +7E10 +0000 +1FF0 +0100 +0380 +0470 +1810 +ENDCHAR +STARTCHAR B530 +ENCODING 46384 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0060 +0020 +0020 +F7A0 +4420 +4420 +4420 +443C +4460 +5FA0 +6020 +0020 +0020 +0020 +0020 +ENDCHAR +STARTCHAR B531 +ENCODING 46385 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 16 2 -3 +BITMAP +0060 +0020 +FFA0 +4420 +4420 +443C +4CE0 +7720 +0020 +0000 +3FE0 +0020 +0020 +0020 +0020 +0020 +ENDCHAR +STARTCHAR B534 +ENCODING 46388 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 3 -2 +BITMAP +00C0 +0040 +3B40 +CC40 +8840 +8840 +8878 +BBC0 +CC40 +0040 +2040 +1040 +1000 +1000 +0FE0 +ENDCHAR +STARTCHAR B538 +ENCODING 46392 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0060 +0020 +F7A0 +4420 +4420 +443C +5FE0 +6020 +0000 +0000 +0FE0 +0020 +0FE0 +0800 +0FF0 +ENDCHAR +STARTCHAR B540 +ENCODING 46400 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 16 2 -3 +BITMAP +0060 +0020 +FFA0 +4420 +4420 +443C +4CE0 +7720 +0020 +0000 +1FE0 +0820 +0840 +0840 +0FE0 +0800 +ENDCHAR +STARTCHAR B541 +ENCODING 46401 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 16 2 -3 +BITMAP +0060 +0020 +9FA0 +6420 +4420 +4424 +4478 +7FA0 +0020 +0C60 +0420 +07E0 +0420 +0420 +07E0 +0420 +ENDCHAR +STARTCHAR B543 +ENCODING 46403 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 3 -2 +BITMAP +00C0 +0040 +0340 +CC40 +8840 +8848 +88F0 +FF40 +0040 +0340 +0200 +0700 +0C80 +1060 +2020 +ENDCHAR +STARTCHAR B544 +ENCODING 46404 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0060 +0020 +FFA0 +4420 +4420 +442C +4470 +7FA0 +0020 +0860 +0420 +0420 +0A60 +1198 +2108 +ENDCHAR +STARTCHAR B545 +ENCODING 46405 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0060 +0020 +9FA0 +6420 +4420 +442C +4C70 +77A0 +0020 +0080 +0340 +0420 +0420 +0660 +03C0 +ENDCHAR +STARTCHAR B54B +ENCODING 46411 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 3 -2 +BITMAP +01C0 +0040 +EF40 +8840 +8848 +8870 +FBC0 +0400 +0700 +3FF0 +0100 +0EC0 +0840 +0C40 +0780 +ENDCHAR +STARTCHAR B54C +ENCODING 46412 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 11 15 3 -2 +BITMAP +0040 +0220 +0120 +2520 +D920 +9120 +9120 +91E0 +9120 +FF20 +8120 +0120 +0120 +0120 +0020 +ENDCHAR +STARTCHAR B54D +ENCODING 46413 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 11 15 3 -3 +BITMAP +0060 +0120 +2520 +D920 +9120 +91E0 +9320 +FD20 +0120 +3FE0 +0020 +0020 +0020 +0020 +0020 +ENDCHAR +STARTCHAR B550 +ENCODING 46416 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0020 +0110 +0090 +FE90 +4890 +4890 +4890 +48F0 +7F90 +0090 +0090 +0C90 +0400 +0400 +07F8 +ENDCHAR +STARTCHAR B554 +ENCODING 46420 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0020 +00D0 +0050 +F750 +4450 +4450 +4470 +7FD0 +0FF0 +0020 +0020 +0FF0 +0400 +0400 +07F8 +ENDCHAR +STARTCHAR B55C +ENCODING 46428 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0020 +0110 +0090 +FE90 +4890 +4890 +48F0 +5B90 +6490 +0080 +07F0 +0410 +0420 +0420 +07F0 +0400 +ENDCHAR +STARTCHAR B55D +ENCODING 46429 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0020 +0110 +0090 +FE90 +4890 +4890 +48F0 +7F90 +0090 +0C10 +0410 +07F0 +0410 +0410 +07F0 +0410 +ENDCHAR +STARTCHAR B55F +ENCODING 46431 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0020 +0090 +0050 +F750 +4450 +4450 +4470 +4DD0 +7650 +0110 +0180 +0140 +0220 +0C10 +3008 +ENDCHAR +STARTCHAR B560 +ENCODING 46432 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0020 +0190 +0090 +EC90 +4890 +4890 +48F0 +7F90 +0090 +0C20 +0420 +0620 +0950 +1088 +6100 +ENDCHAR +STARTCHAR B561 +ENCODING 46433 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 14 2 -2 +BITMAP +0110 +0090 +FE90 +4890 +4890 +48F0 +5B90 +6C90 +0010 +03C0 +0420 +0420 +0660 +03C0 +ENDCHAR +STARTCHAR B5A0 +ENCODING 46496 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +0010 +F790 +4410 +4410 +4470 +4410 +4410 +5C90 +6710 +0010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR B5A1 +ENCODING 46497 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0030 +0010 +FF90 +4410 +44F0 +4410 +4410 +7F10 +0010 +0000 +3FE0 +0020 +0020 +0020 +0020 +0020 +ENDCHAR +STARTCHAR B5A4 +ENCODING 46500 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 3 -2 +BITMAP +0060 +0020 +0020 +CE20 +8820 +89E0 +8820 +8820 +FE20 +0020 +0020 +1800 +0800 +0800 +0FF0 +ENDCHAR +STARTCHAR B5A8 +ENCODING 46504 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +9F10 +6410 +44F0 +4410 +4C10 +7710 +1FE0 +0020 +0020 +1FE0 +0800 +0800 +0FF0 +ENDCHAR +STARTCHAR B5AA +ENCODING 46506 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0030 +0010 +FF10 +4410 +44F0 +4410 +4C10 +7710 +0000 +7C00 +05F0 +4530 +3930 +2130 +3DF0 +0100 +ENDCHAR +STARTCHAR B5AB +ENCODING 46507 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0030 +0010 +BF90 +4410 +44F0 +4410 +4C10 +7710 +0000 +05B0 +3C90 +08F0 +3090 +2090 +3CF0 +0090 +ENDCHAR +STARTCHAR B5B0 +ENCODING 46512 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +FF10 +4410 +44F0 +4410 +4C10 +7710 +0000 +0000 +0FE0 +0820 +0820 +0FE0 +0800 +ENDCHAR +STARTCHAR B5B1 +ENCODING 46513 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0030 +0010 +9F10 +6410 +44F0 +4410 +4C10 +7710 +0000 +1C20 +0420 +07E0 +0420 +0420 +07E0 +0420 +ENDCHAR +STARTCHAR B5B3 +ENCODING 46515 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +DF90 +6410 +4410 +45F0 +4410 +5D90 +6610 +0310 +0110 +0380 +0660 +0830 +3010 +ENDCHAR +STARTCHAR B5B4 +ENCODING 46516 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 3 -2 +BITMAP +0060 +0020 +3B20 +CC20 +8BE0 +8820 +8820 +FF20 +8020 +1040 +0840 +18C0 +24A0 +4110 +8610 +ENDCHAR +STARTCHAR B5B5 +ENCODING 46517 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +9F90 +6410 +44F0 +4410 +4410 +7F10 +0010 +0080 +0360 +0410 +0410 +0630 +03E0 +ENDCHAR +STARTCHAR B5BB +ENCODING 46523 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +9F10 +6410 +44F0 +4410 +4F90 +7610 +3FF0 +0100 +0380 +0440 +0440 +0440 +0380 +ENDCHAR +STARTCHAR B5BC +ENCODING 46524 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 11 15 3 -2 +BITMAP +0040 +0220 +0120 +3520 +D920 +9120 +9120 +9720 +9120 +B520 +D920 +0120 +0120 +0120 +0020 +ENDCHAR +STARTCHAR B5BD +ENCODING 46525 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0030 +0110 +0090 +EE90 +4890 +4B90 +4890 +7C90 +0090 +0000 +1FF0 +0010 +0010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR B5C0 +ENCODING 46528 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0090 +0050 +FE50 +4850 +49D0 +4850 +4950 +7E50 +0050 +0050 +0C50 +0400 +0400 +03F8 +ENDCHAR +STARTCHAR B5C4 +ENCODING 46532 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0090 +0050 +E750 +4450 +45D0 +4450 +7E50 +0050 +0000 +1FF0 +1FE0 +0800 +0800 +0FF0 +ENDCHAR +STARTCHAR B5CC +ENCODING 46540 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0030 +0110 +0090 +FC90 +4890 +4B90 +4890 +7E90 +0090 +0000 +07F0 +0410 +0410 +0420 +07F0 +0400 +ENDCHAR +STARTCHAR B5CD +ENCODING 46541 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 11 16 3 -3 +BITMAP +0060 +0120 +00A0 +D8A0 +90A0 +93A0 +90A0 +F8A0 +00A0 +1860 +0820 +0FE0 +0820 +0820 +0FE0 +0820 +ENDCHAR +STARTCHAR B5CF +ENCODING 46543 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 3 -2 +BITMAP +0060 +0120 +00A0 +D8A0 +90A0 +93A0 +90A0 +F8A0 +00A0 +06A0 +0300 +0200 +0580 +1860 +2010 +ENDCHAR +STARTCHAR B5D0 +ENCODING 46544 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 3 -2 +BITMAP +0060 +0120 +00A0 +D8A0 +90A0 +93A0 +90A0 +F8A0 +00A0 +0040 +0820 +0860 +1460 +2498 +4108 +ENDCHAR +STARTCHAR B5D1 +ENCODING 46545 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 11 15 3 -2 +BITMAP +0060 +0120 +00A0 +D8A0 +90A0 +93A0 +90A0 +F8A0 +00A0 +0100 +07C0 +0C60 +0820 +0C60 +07C0 +ENDCHAR +STARTCHAR B5D8 +ENCODING 46552 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0060 +0010 +0010 +DF90 +6410 +44F0 +4410 +4410 +45F0 +5C90 +6710 +0010 +0010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR B5EC +ENCODING 46572 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 14 2 -2 +BITMAP +0030 +9D90 +6610 +44F0 +4410 +4470 +7F90 +0010 +0860 +0420 +0C40 +1AF0 +2118 +4208 +ENDCHAR +STARTCHAR B610 +ENCODING 46608 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 11 1 0 +BITMAP +7CF8 +2080 +2080 +2080 +2280 +3CFC +0300 +0100 +0100 +010C +FFFE +ENDCHAR +STARTCHAR B611 +ENCODING 46609 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 2 -2 +BITMAP +4F30 +31C0 +2100 +2100 +3CF0 +0300 +010C +FFFC +0000 +3FE0 +0020 +0020 +0020 +0020 +ENDCHAR +STARTCHAR B614 +ENCODING 46612 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 12 1 -1 +BITMAP +38F8 +2080 +2080 +26F8 +3900 +0100 +FFFE +0000 +0800 +0800 +0800 +0FF8 +ENDCHAR +STARTCHAR B618 +ENCODING 46616 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 2 -2 +BITMAP +6DF0 +3100 +2100 +2500 +3FF0 +0200 +FFFC +0000 +3FC0 +0040 +3FC0 +1000 +1000 +1FE0 +ENDCHAR +STARTCHAR B625 +ENCODING 46629 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +4CF8 +3080 +2080 +2080 +3CFC +0100 +0104 +FFFE +0100 +06C0 +0820 +0820 +0C60 +07C0 +ENDCHAR +STARTCHAR B62C +ENCODING 46636 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -2 +BITMAP +0030 +0010 +0010 +3390 +2210 +2210 +2610 +3DD6 +0418 +0470 +FF90 +0010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR B634 +ENCODING 46644 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0060 +0020 +B7A0 +4420 +4420 +77AC +0870 +1FA0 +7FE0 +0040 +0040 +1FE0 +0800 +0800 +0FF0 +ENDCHAR +STARTCHAR B648 +ENCODING 46664 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0020 +0010 +0090 +0090 +6C90 +4890 +4890 +7690 +08F0 +0990 +FE90 +0090 +0090 +0090 +0010 +ENDCHAR +STARTCHAR B664 +ENCODING 46692 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 1 -2 +BITMAP +0030 +0008 +0268 +3188 +2108 +2108 +2528 +38C8 +0208 +0218 +8FE8 +7008 +0008 +0008 +0008 +ENDCHAR +STARTCHAR B668 +ENCODING 46696 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 14 2 -1 +BITMAP +0030 +0010 +1D90 +6610 +4410 +4490 +7F10 +0430 +9FD0 +6010 +1810 +0800 +0810 +0FF8 +ENDCHAR +STARTCHAR B69C +ENCODING 46748 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -3 +BITMAP +27F8 +1880 +1080 +1080 +1EF8 +0000 +0000 +FFFE +0100 +0100 +0100 +0100 +0100 +0100 +0100 +ENDCHAR +STARTCHAR B69D +ENCODING 46749 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +7DF8 +2080 +2080 +2280 +3CF8 +0000 +FFFE +0100 +0100 +3FE0 +0020 +0020 +0020 +0020 +ENDCHAR +STARTCHAR B6A0 +ENCODING 46752 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 13 1 -1 +BITMAP +02F8 +1C80 +1080 +1080 +1EFC +0000 +FFFE +0100 +0100 +0900 +0900 +0800 +0FF8 +ENDCHAR +STARTCHAR B6A4 +ENCODING 46756 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +3FF8 +1080 +1080 +1180 +1E78 +0004 +FFFE +0100 +1F20 +00E0 +1FE0 +0800 +0800 +0FF0 +ENDCHAR +STARTCHAR B6AB +ENCODING 46763 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 2 -2 +BITMAP +38F0 +2100 +2100 +3D10 +00E0 +87FC +FE00 +02E0 +3E00 +07F0 +6CE0 +3110 +2710 +18E0 +ENDCHAR +STARTCHAR B6AC +ENCODING 46764 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +05F8 +3880 +2080 +2080 +3CF8 +0004 +FFFE +0100 +0100 +0FE0 +0820 +0820 +0820 +0FC0 +ENDCHAR +STARTCHAR B6B1 +ENCODING 46769 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 2 -2 +BITMAP +99F0 +6100 +4100 +4500 +79F0 +0000 +7800 +87FC +0200 +0E00 +1980 +1040 +18C0 +0780 +ENDCHAR +STARTCHAR B6D4 +ENCODING 46804 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +0090 +0090 +FE90 +4890 +4890 +7E90 +0090 +0E90 +F890 +0B90 +0890 +0890 +0090 +ENDCHAR +STARTCHAR B6F0 +ENCODING 46832 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +9F90 +6410 +4410 +4410 +7F90 +0010 +00D0 +FF10 +0410 +0410 +0410 +0410 +0010 +ENDCHAR +STARTCHAR B6F4 +ENCODING 46836 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0010 +BF90 +4410 +4410 +4C90 +7310 +00D0 +FF10 +0810 +0810 +0C10 +0400 +0400 +07F8 +ENDCHAR +STARTCHAR B6F8 +ENCODING 46840 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0010 +F790 +4410 +4410 +7790 +00F0 +FF10 +0FF0 +0010 +0020 +0FF0 +0400 +0400 +07F8 +ENDCHAR +STARTCHAR B700 +ENCODING 46848 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 16 1 -3 +BITMAP +0018 +0008 +3F88 +1208 +1208 +19C8 +0018 +FFE8 +2208 +0200 +07F8 +0208 +0208 +0210 +03F8 +0200 +ENDCHAR +STARTCHAR B701 +ENCODING 46849 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0030 +0010 +7F10 +2410 +2410 +3F90 +00F0 +FF10 +0410 +0C10 +0410 +07F0 +0410 +0410 +07F0 +0410 +ENDCHAR +STARTCHAR B705 +ENCODING 46853 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 14 1 -2 +BITMAP +0018 +07C8 +1A08 +1208 +17C8 +1808 +0078 +FF88 +0208 +01E0 +0210 +0210 +0330 +01E0 +ENDCHAR +STARTCHAR B728 +ENCODING 46888 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 11 1 0 +BITMAP +0400 +38F8 +2080 +2080 +2280 +3CF8 +0000 +0000 +0000 +0000 +FFFE +ENDCHAR +STARTCHAR B729 +ENCODING 46889 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 2 -2 +BITMAP +7DF0 +2100 +2100 +2100 +3DF0 +0000 +07FC +FF00 +0000 +3FE0 +0020 +0020 +0020 +0020 +ENDCHAR +STARTCHAR B72C +ENCODING 46892 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 13 1 -1 +BITMAP +4CF8 +3080 +2080 +2080 +2CF8 +1000 +0000 +FFFE +0000 +0800 +0800 +0800 +0FF8 +ENDCHAR +STARTCHAR B72F +ENCODING 46895 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 13 2 -1 +BITMAP +4F30 +31C0 +2100 +2300 +3DF8 +0000 +7800 +87F8 +0000 +1FE0 +1000 +1000 +1FF0 +ENDCHAR +STARTCHAR B730 +ENCODING 46896 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +3E18 +10E0 +1080 +11F8 +1E00 +0000 +FFFE +0000 +1FF0 +0020 +1FE0 +0800 +0800 +0FF0 +ENDCHAR +STARTCHAR B738 +ENCODING 46904 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +1EF8 +1080 +1080 +1680 +08F8 +0000 +FFFE +0000 +0000 +0FE0 +0820 +0840 +0FE0 +0800 +ENDCHAR +STARTCHAR B739 +ENCODING 46905 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -3 +BITMAP +00F8 +1C80 +1080 +1080 +12F8 +1C00 +0004 +FFFE +1870 +0830 +0FE0 +0820 +0820 +0FE0 +0820 +ENDCHAR +STARTCHAR B73B +ENCODING 46907 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +78F8 +2080 +2080 +2280 +3C88 +00F8 +0004 +FFFE +2200 +0100 +0300 +02C0 +0C30 +1018 +ENDCHAR +STARTCHAR B744 +ENCODING 46916 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +0010 +F710 +4410 +4410 +4C10 +7390 +0010 +00D0 +FF10 +0010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR B748 +ENCODING 46920 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 14 2 -1 +BITMAP +0030 +0010 +0190 +6610 +4410 +4410 +5790 +2030 +FFD0 +6010 +1C10 +0400 +0400 +07F8 +ENDCHAR +STARTCHAR B74C +ENCODING 46924 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0010 +F790 +4410 +4410 +7F90 +0070 +FF90 +0FF0 +0010 +0020 +0FF0 +0400 +0400 +07F8 +ENDCHAR +STARTCHAR B754 +ENCODING 46932 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +F790 +4410 +4410 +7790 +0070 +FF90 +0010 +0830 +07D0 +0410 +0420 +07F0 +0400 +ENDCHAR +STARTCHAR B755 +ENCODING 46933 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0030 +0010 +7F10 +2410 +2410 +3B90 +0070 +FFA0 +0000 +0C20 +0420 +07E0 +0420 +0420 +07E0 +0420 +ENDCHAR +STARTCHAR B760 +ENCODING 46944 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +0010 +F790 +4410 +4410 +4410 +4410 +4C30 +77D0 +0010 +0010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR B764 +ENCODING 46948 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0060 +0010 +0010 +F790 +4410 +4410 +4410 +4410 +7CF0 +0310 +0810 +0410 +0400 +0400 +07F8 +ENDCHAR +STARTCHAR B768 +ENCODING 46952 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +BF90 +4410 +4410 +4410 +4CF0 +7710 +0000 +1FE0 +0020 +1FE0 +0800 +0800 +0FF0 +ENDCHAR +STARTCHAR B770 +ENCODING 46960 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0030 +0010 +97D0 +6210 +4210 +4210 +4670 +7B90 +0010 +0000 +0FF0 +0410 +0420 +0420 +07F0 +0400 +ENDCHAR +STARTCHAR B771 +ENCODING 46961 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0030 +0010 +F3D0 +4210 +4210 +4210 +5EF0 +6310 +0010 +0C10 +0410 +07F0 +0410 +0410 +07F0 +0410 +ENDCHAR +STARTCHAR B773 +ENCODING 46963 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0010 +9D90 +6610 +4410 +4410 +4410 +5C90 +6710 +0310 +0180 +0180 +0260 +0C10 +1008 +ENDCHAR +STARTCHAR B775 +ENCODING 46965 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +F3D0 +4210 +4210 +4210 +4E70 +7190 +0010 +0080 +0360 +0410 +0410 +0630 +03E0 +ENDCHAR +STARTCHAR B77C +ENCODING 46972 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +00C0 +0020 +0020 +FE20 +0420 +0420 +FE20 +402C +4030 +4060 +43A0 +7C20 +0020 +0020 +0020 +ENDCHAR +STARTCHAR B77D +ENCODING 46973 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 16 2 -3 +BITMAP +00C0 +0020 +FE20 +0220 +0220 +7E2C +4030 +43A0 +7C20 +0000 +3FE0 +0020 +0020 +0020 +0020 +0020 +ENDCHAR +STARTCHAR B780 +ENCODING 46976 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +00C0 +0060 +FE20 +0220 +0220 +FE20 +4024 +4038 +43A0 +7C20 +0020 +1820 +0800 +0800 +07F8 +ENDCHAR +STARTCHAR B784 +ENCODING 46980 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0060 +0020 +0020 +7C20 +0420 +FC2C +4030 +4120 +7E00 +1FE0 +0040 +0040 +1FE0 +0800 +0FF0 +ENDCHAR +STARTCHAR B78C +ENCODING 46988 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 16 2 -3 +BITMAP +0060 +0020 +FE20 +0420 +0420 +FC2C +4030 +40A0 +5F20 +2000 +0FE0 +0820 +0820 +0840 +0FE0 +0800 +ENDCHAR +STARTCHAR B78D +ENCODING 46989 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 16 2 -3 +BITMAP +00C0 +0020 +FE20 +0420 +0420 +FC20 +403C +40A0 +5F20 +3820 +0820 +0FE0 +0820 +0820 +0FE0 +0820 +ENDCHAR +STARTCHAR B78F +ENCODING 46991 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 3 -2 +BITMAP +00C0 +0040 +FE40 +0440 +0440 +FC40 +4078 +4040 +4340 +7E40 +0100 +0300 +06C0 +0830 +3010 +ENDCHAR +STARTCHAR B790 +ENCODING 46992 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0060 +0020 +FE20 +0220 +0420 +FE24 +4038 +4020 +4720 +7840 +0420 +0C40 +0A60 +1198 +2108 +ENDCHAR +STARTCHAR B791 +ENCODING 46993 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0060 +0020 +FE20 +0420 +0420 +FE2C +4030 +40A0 +5F20 +6100 +06C0 +0820 +0820 +0C60 +07C0 +ENDCHAR +STARTCHAR B792 +ENCODING 46994 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 2 -2 +BITMAP +0060 +FE20 +0420 +0420 +FC24 +4038 +40E0 +7F20 +33F0 +0D00 +0300 +04C0 +0830 +3010 +ENDCHAR +STARTCHAR B796 +ENCODING 46998 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 2 -2 +BITMAP +0060 +FE20 +0420 +0420 +F820 +403C +4FE0 +7C20 +0020 +3FF0 +00C0 +0480 +0480 +3FF0 +ENDCHAR +STARTCHAR B797 +ENCODING 46999 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +00C0 +7E20 +0220 +0420 +FE20 +403C +4120 +7E20 +03C0 +3FF8 +0380 +0440 +0440 +0440 +0380 +ENDCHAR +STARTCHAR B798 +ENCODING 47000 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0060 +0310 +0090 +FC90 +0890 +0890 +0890 +7090 +40F0 +4190 +4E90 +7090 +0090 +0090 +0010 +ENDCHAR +STARTCHAR B799 +ENCODING 47001 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 11 16 3 -3 +BITMAP +0060 +0320 +0120 +F920 +1120 +1920 +E1E0 +8720 +F920 +C120 +7FE0 +0020 +0020 +0020 +0020 +0020 +ENDCHAR +STARTCHAR B79C +ENCODING 47004 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0010 +0090 +FC90 +0890 +0890 +F890 +40F0 +4190 +4E90 +7090 +1890 +0810 +0800 +0FF8 +ENDCHAR +STARTCHAR B7A0 +ENCODING 47008 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 11 15 3 -2 +BITMAP +0040 +0220 +0120 +F920 +1120 +1120 +E1E0 +8720 +F920 +FFC0 +0040 +0040 +1FC0 +1000 +1FE0 +ENDCHAR +STARTCHAR B7A8 +ENCODING 47016 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 11 16 3 -3 +BITMAP +0060 +0320 +0120 +F920 +0920 +0920 +F1E0 +8720 +F920 +C120 +1FE0 +0840 +0840 +0840 +0FE0 +0800 +ENDCHAR +STARTCHAR B7A9 +ENCODING 47017 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0190 +FC90 +0490 +0890 +FC90 +40F0 +4190 +7E90 +7C30 +0410 +07F0 +0410 +07F0 +0410 +ENDCHAR +STARTCHAR B7AB +ENCODING 47019 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 11 15 3 -2 +BITMAP +0060 +0220 +0120 +F120 +1120 +1120 +E1E0 +8120 +8720 +FF20 +0200 +0700 +0C80 +1860 +2000 +ENDCHAR +STARTCHAR B7AC +ENCODING 47020 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0060 +0130 +0090 +0090 +7890 +0890 +F8F0 +4090 +4390 +4CF0 +3420 +0C20 +0E60 +1298 +6108 +ENDCHAR +STARTCHAR B7AD +ENCODING 47021 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 11 15 3 -2 +BITMAP +0060 +0320 +0120 +F120 +1120 +1120 +E1E0 +8320 +BD20 +E120 +06C0 +0820 +0820 +0C60 +07C0 +ENDCHAR +STARTCHAR B7B4 +ENCODING 47028 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +00C0 +0020 +0020 +FE20 +0420 +043C +FC20 +4020 +4060 +43AC +7C30 +0020 +0020 +0020 +0020 +ENDCHAR +STARTCHAR B7B5 +ENCODING 47029 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 16 2 -3 +BITMAP +0060 +0020 +FE20 +022C +0230 +FE20 +4060 +43BC +7C20 +0000 +3FE0 +1020 +0020 +0020 +0020 +0020 +ENDCHAR +STARTCHAR B7B8 +ENCODING 47032 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0060 +0020 +FE20 +0220 +022C +FE30 +4020 +4020 +43E4 +7C38 +0020 +1820 +0800 +0800 +0FF0 +ENDCHAR +STARTCHAR B7C7 +ENCODING 47047 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0060 +0020 +FE20 +042C +0430 +7E20 +4020 +43FC +7C20 +0180 +0100 +0180 +0260 +0410 +1808 +ENDCHAR +STARTCHAR B7C9 +ENCODING 47049 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 3 -2 +BITMAP +00C0 +0040 +FE40 +0448 +0470 +F840 +4040 +4378 +7C40 +0100 +0680 +0840 +0840 +0CC0 +0780 +ENDCHAR +STARTCHAR B7EC +ENCODING 47084 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +0010 +FE10 +0410 +0410 +FCF0 +4010 +4010 +4010 +4210 +7C10 +0010 +0010 +0010 +ENDCHAR +STARTCHAR B7ED +ENCODING 47085 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +FE10 +0410 +0410 +FCF0 +4010 +4110 +4E10 +7000 +1FF0 +0010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR B7F0 +ENCODING 47088 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0010 +FE10 +0410 +0410 +FDF0 +4010 +4010 +4210 +7C10 +0010 +1810 +0800 +0800 +0FF8 +ENDCHAR +STARTCHAR B7F4 +ENCODING 47092 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 14 3 -1 +BITMAP +0060 +0020 +FE20 +0420 +FDE0 +4020 +4020 +4620 +7800 +3FE0 +0040 +1FE0 +1000 +0FF0 +ENDCHAR +STARTCHAR B7FC +ENCODING 47100 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0070 +0010 +FE10 +0410 +05F0 +FC10 +4010 +4010 +4E10 +7000 +0FE0 +0820 +0820 +0FE0 +0800 +ENDCHAR +STARTCHAR B7FD +ENCODING 47101 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0060 +0010 +FE10 +0410 +0410 +FDF0 +4010 +4110 +5E10 +2070 +0830 +0FE0 +0820 +0820 +0FE0 +0820 +ENDCHAR +STARTCHAR B7FF +ENCODING 47103 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 16 2 -3 +BITMAP +0030 +0010 +FE10 +0410 +0410 +FCF0 +4010 +4010 +4210 +7D10 +0080 +0180 +0340 +0430 +0818 +1000 +ENDCHAR +STARTCHAR B800 +ENCODING 47104 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0070 +0010 +FE10 +0410 +0410 +F8F0 +4010 +4210 +7C10 +0020 +0C20 +0860 +1650 +2288 +4108 +ENDCHAR +STARTCHAR B801 +ENCODING 47105 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0060 +0010 +FE10 +0410 +0410 +FCF0 +4010 +4010 +4C10 +7180 +0640 +0420 +0420 +0660 +03C0 +ENDCHAR +STARTCHAR B807 +ENCODING 47111 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +FE10 +0210 +0410 +FEF0 +4010 +4210 +7C10 +03C0 +3FF8 +0100 +06C0 +0420 +0640 +03C0 +ENDCHAR +STARTCHAR B808 +ENCODING 47112 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 11 15 3 -2 +BITMAP +0060 +0220 +0120 +3920 +D120 +1120 +1120 +EF20 +8120 +8520 +9920 +E120 +0120 +0120 +0020 +ENDCHAR +STARTCHAR B809 +ENCODING 47113 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0070 +0310 +0090 +7890 +0890 +9F90 +6090 +4090 +7890 +0080 +1FF0 +0010 +0010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR B80C +ENCODING 47116 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0310 +0090 +F890 +0890 +0890 +FB90 +4090 +4490 +7890 +0090 +0800 +0800 +0800 +0FF8 +ENDCHAR +STARTCHAR B810 +ENCODING 47120 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0190 +0090 +7C90 +0890 +FB90 +4090 +4290 +7C80 +0FF0 +0010 +0FF0 +0400 +0400 +07F8 +ENDCHAR +STARTCHAR B818 +ENCODING 47128 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0030 +0190 +0090 +7890 +0890 +DF90 +6090 +4090 +7890 +0080 +0FF0 +0410 +0420 +0420 +07F0 +0400 +ENDCHAR +STARTCHAR B819 +ENCODING 47129 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0030 +0310 +0090 +7890 +0890 +9F90 +6090 +4090 +7880 +0810 +0410 +07F0 +0410 +0410 +07F0 +0410 +ENDCHAR +STARTCHAR B81B +ENCODING 47131 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 3 -2 +BITMAP +0060 +0220 +0120 +F920 +1120 +1120 +E720 +8120 +8920 +F220 +0100 +0300 +0480 +0860 +3010 +ENDCHAR +STARTCHAR B81D +ENCODING 47133 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0190 +0090 +7890 +0890 +9F90 +6090 +4290 +7C90 +0010 +03C0 +0420 +0420 +0660 +03C0 +ENDCHAR +STARTCHAR B824 +ENCODING 47140 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0070 +0010 +0010 +FE10 +05F0 +0410 +0410 +FC10 +41F0 +4010 +4110 +4E10 +7010 +0010 +0010 +ENDCHAR +STARTCHAR B825 +ENCODING 47141 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0070 +0010 +FE10 +0610 +04F0 +FE10 +4010 +4110 +5EF0 +2010 +3FE0 +0020 +0020 +0020 +0020 +0020 +ENDCHAR +STARTCHAR B828 +ENCODING 47144 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0010 +FE10 +0410 +05F0 +FC10 +4010 +4110 +4EF0 +7010 +0010 +1800 +0800 +0800 +0FF8 +ENDCHAR +STARTCHAR B82C +ENCODING 47148 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 14 2 -1 +BITMAP +0060 +0010 +FC10 +05F0 +FC10 +4010 +4110 +5EF0 +2000 +1FE0 +0020 +1FE0 +0810 +0FF8 +ENDCHAR +STARTCHAR B834 +ENCODING 47156 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0060 +0010 +FC10 +0410 +04F0 +DC10 +6010 +4110 +47F0 +7810 +0FE0 +0820 +0820 +0FE0 +0800 +ENDCHAR +STARTCHAR B835 +ENCODING 47157 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0020 +0010 +FE10 +05F0 +0410 +F810 +4310 +5FF0 +7C10 +3820 +0820 +0FE0 +0820 +0FE0 +0800 +ENDCHAR +STARTCHAR B837 +ENCODING 47159 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +FE10 +02F0 +0410 +8610 +79F0 +4010 +4210 +7F10 +0110 +0380 +0640 +0830 +3000 +ENDCHAR +STARTCHAR B838 +ENCODING 47160 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 14 2 -2 +BITMAP +0030 +FC10 +0410 +0470 +FC10 +4010 +47F0 +7810 +0860 +0420 +0C60 +1A50 +2298 +4108 +ENDCHAR +STARTCHAR B839 +ENCODING 47161 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +FE10 +0410 +05F0 +0410 +FC10 +4090 +47F0 +7810 +6080 +0340 +0420 +0420 +0660 +03C0 +ENDCHAR +STARTCHAR B840 +ENCODING 47168 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +0190 +0C90 +7890 +0F90 +0890 +F890 +4790 +4090 +4C90 +7090 +0090 +0090 +0010 +ENDCHAR +STARTCHAR B844 +ENCODING 47172 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 14 2 -1 +BITMAP +0030 +0310 +0090 +FC90 +0F90 +0890 +7890 +4790 +4490 +7890 +0C90 +0400 +0400 +07F8 +ENDCHAR +STARTCHAR B851 +ENCODING 47185 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0030 +0110 +0090 +7890 +0F90 +F890 +4390 +4090 +7880 +0C20 +0420 +07E0 +0420 +0420 +07E0 +0420 +ENDCHAR +STARTCHAR B853 +ENCODING 47187 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0110 +0090 +7890 +0F90 +9890 +6790 +4090 +7890 +0290 +0100 +0300 +06C0 +0830 +3010 +ENDCHAR +STARTCHAR B85C +ENCODING 47196 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 11 1 0 +BITMAP +1FF8 +0010 +0010 +1FF0 +0800 +0800 +0800 +0FF0 +0100 +0104 +FFFE +ENDCHAR +STARTCHAR B85D +ENCODING 47197 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 2 -2 +BITMAP +3FE0 +0020 +3FE0 +1000 +1000 +1FF0 +0100 +FFFC +0000 +3FE0 +0020 +0020 +0020 +0020 +ENDCHAR +STARTCHAR B860 +ENCODING 47200 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 13 2 -1 +BITMAP +3FE0 +0020 +0020 +1FE0 +1000 +1FF0 +0200 +FFFC +0000 +3000 +1000 +1000 +1FF0 +ENDCHAR +STARTCHAR B864 +ENCODING 47204 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 2 -2 +BITMAP +3FE0 +0020 +3FE0 +1000 +1000 +1FE0 +0200 +FFFC +3FE0 +0020 +3FE0 +1000 +1000 +0FF0 +ENDCHAR +STARTCHAR B86C +ENCODING 47212 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -3 +BITMAP +3FE0 +0020 +3FE0 +1000 +1000 +1FE0 +0200 +FFFC +0000 +3FE0 +1040 +1040 +1040 +1FC0 +1000 +ENDCHAR +STARTCHAR B86D +ENCODING 47213 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 2 -2 +BITMAP +3FE0 +0040 +3FC0 +1000 +1000 +1FC0 +0200 +FFFC +30C0 +1040 +1FC0 +1040 +1FC0 +1040 +ENDCHAR +STARTCHAR B86F +ENCODING 47215 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 2 -2 +BITMAP +3FE0 +0040 +3FE0 +1000 +1000 +1FC0 +0200 +FFFC +0000 +0200 +0600 +0D80 +1060 +6020 +ENDCHAR +STARTCHAR B871 +ENCODING 47217 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 2 -2 +BITMAP +3FE0 +0020 +3FE0 +1000 +1000 +1FF0 +0200 +FFFE +0200 +0F80 +18C0 +1040 +18C0 +0780 +ENDCHAR +STARTCHAR B878 +ENCODING 47224 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +00E0 +0020 +7F20 +0120 +0220 +7F20 +2020 +2024 +1FB8 +0820 +08E0 +F720 +0020 +0020 +0020 +ENDCHAR +STARTCHAR B87C +ENCODING 47228 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +0030 +0010 +3F90 +0090 +3F90 +1010 +1196 +0E18 +FFF0 +0010 +0C10 +0400 +0400 +07F8 +ENDCHAR +STARTCHAR B88D +ENCODING 47245 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 1 -2 +BITMAP +0030 +3F90 +0090 +3F90 +1010 +119C +0E10 +FFF0 +0050 +01E0 +0210 +0210 +0330 +01E0 +ENDCHAR +STARTCHAR B8A8 +ENCODING 47272 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 1 -2 +BITMAP +0020 +00D0 +0050 +1E50 +7E50 +2050 +2050 +1E70 +08D0 +FF50 +0630 +0220 +0570 +08C8 +1088 +ENDCHAR +STARTCHAR B8B0 +ENCODING 47280 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0070 +0010 +7F10 +0110 +0210 +7F10 +2010 +2010 +3F90 +0410 +0450 +FF90 +0010 +0010 +0010 +ENDCHAR +STARTCHAR B8B4 +ENCODING 47284 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0060 +0010 +7F10 +0110 +0210 +7F10 +2010 +2190 +1E10 +05F0 +FA10 +1810 +0800 +0800 +0FF8 +ENDCHAR +STARTCHAR B8B8 +ENCODING 47288 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0070 +0010 +7F10 +0110 +3F10 +2010 +2390 +1C10 +FFF0 +0FF0 +0010 +0FF0 +0400 +0400 +07F8 +ENDCHAR +STARTCHAR B8C0 +ENCODING 47296 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +7F10 +0110 +3F10 +2010 +3F90 +0410 +FFF0 +0000 +0FF0 +0410 +0420 +07F0 +0400 +ENDCHAR +STARTCHAR B8C1 +ENCODING 47297 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 11 16 3 -3 +BITMAP +0060 +0020 +FE20 +0220 +FE20 +4020 +4320 +3C20 +0BE0 +F460 +0820 +0FE0 +0820 +0820 +0FE0 +0820 +ENDCHAR +STARTCHAR B8C3 +ENCODING 47299 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 1 -2 +BITMAP +0010 +0008 +3F88 +0088 +1F88 +1008 +1008 +0F88 +FFF8 +20C8 +0040 +00C0 +0120 +0218 +0C04 +ENDCHAR +STARTCHAR B8C5 +ENCODING 47301 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 1 -2 +BITMAP +0038 +0018 +3F88 +0088 +3F88 +1008 +10C8 +0F08 +FFF8 +0008 +01E0 +0210 +0210 +0330 +01E0 +ENDCHAR +STARTCHAR B8CC +ENCODING 47308 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 11 1 0 +BITMAP +1FF8 +0010 +0010 +1FF0 +0800 +0800 +0FF8 +0860 +0420 +0420 +FFFE +ENDCHAR +STARTCHAR B8D0 +ENCODING 47312 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 13 2 -1 +BITMAP +3FE0 +0020 +0020 +1FC0 +1000 +0FF0 +0880 +F8FE +0700 +3000 +1000 +1020 +0FF0 +ENDCHAR +STARTCHAR B8D4 +ENCODING 47316 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0060 +3FE0 +0040 +1FE0 +1000 +1FC0 +0880 +FFFC +0000 +3FC0 +0040 +0040 +1FC0 +1000 +1FE0 +ENDCHAR +STARTCHAR B8DD +ENCODING 47325 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -3 +BITMAP +3FE0 +0040 +1FE0 +1000 +1FC0 +0880 +FFFC +0000 +30C0 +1040 +1FC0 +1040 +1040 +1FC0 +1040 +ENDCHAR +STARTCHAR B8DF +ENCODING 47327 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 2 -2 +BITMAP +3FE0 +0040 +1FE0 +1000 +1000 +0FC0 +0880 +FFFC +0000 +0200 +0600 +0D80 +1060 +6020 +ENDCHAR +STARTCHAR B8E1 +ENCODING 47329 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 2 -2 +BITMAP +3FE0 +0020 +3FE0 +1000 +1000 +1FF0 +08C0 +FFFC +0200 +0D80 +1040 +1040 +18C0 +0780 +ENDCHAR +STARTCHAR B8E8 +ENCODING 47336 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +1FF0 +0010 +0010 +0FE0 +0800 +0FF8 +0000 +FFFE +0100 +0100 +0100 +0100 +0100 +0100 +ENDCHAR +STARTCHAR B8E9 +ENCODING 47337 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -3 +BITMAP +1FF0 +0010 +1FF0 +0800 +0800 +0FF8 +0000 +FFFE +0100 +01F0 +0E10 +0010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR B8EC +ENCODING 47340 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +1FF0 +0020 +1FE0 +0800 +0800 +0FF8 +0004 +FFFE +0100 +0100 +1900 +0900 +0800 +07F8 +ENDCHAR +STARTCHAR B8F0 +ENCODING 47344 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 2 -2 +BITMAP +3FE0 +0020 +3FE0 +1000 +1000 +1FE8 +03FC +FE00 +3E00 +01E0 +0040 +3FE0 +1000 +1FE0 +ENDCHAR +STARTCHAR B8F8 +ENCODING 47352 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -3 +BITMAP +1FF0 +0010 +1FF0 +0800 +0800 +0FF0 +0000 +FFFE +0100 +1FE0 +0820 +0820 +0820 +0FE0 +0800 +ENDCHAR +STARTCHAR B8F9 +ENCODING 47353 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +1FF0 +0020 +1FE0 +0800 +0FF0 +0000 +FFFE +0100 +1160 +0820 +0FE0 +0820 +0FE0 +0820 +ENDCHAR +STARTCHAR B8FB +ENCODING 47355 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +1FF0 +0010 +1FF0 +0800 +0FF8 +0000 +0000 +FFFE +0100 +0300 +0100 +0280 +0460 +1810 +ENDCHAR +STARTCHAR B8FD +ENCODING 47357 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +1FF0 +0010 +1FF0 +0800 +0FF0 +0000 +0004 +FFFE +0100 +0300 +0CE0 +0820 +0C60 +07C0 +ENDCHAR +STARTCHAR B904 +ENCODING 47364 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 1 -2 +BITMAP +0018 +0008 +3F88 +0088 +3F88 +1008 +1008 +1FC8 +0068 +FF88 +04F8 +0408 +0408 +0408 +0008 +ENDCHAR +STARTCHAR B918 +ENCODING 47384 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0010 +7F10 +7E10 +2010 +3F10 +0010 +0090 +FF30 +08D0 +0420 +0C60 +0A60 +1298 +6108 +ENDCHAR +STARTCHAR B920 +ENCODING 47392 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0090 +0050 +FC50 +0450 +FC50 +4050 +4650 +3850 +FE50 +08D0 +0950 +0850 +0850 +0010 +ENDCHAR +STARTCHAR B93C +ENCODING 47420 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 1 -2 +BITMAP +0018 +3F88 +0088 +0108 +3F88 +1008 +1FC8 +0008 +01C8 +FE08 +0408 +0408 +0408 +0408 +0008 +ENDCHAR +STARTCHAR B93D +ENCODING 47421 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 11 14 3 -2 +BITMAP +0060 +FE20 +0420 +FE20 +4020 +7E20 +1F20 +F020 +1020 +3FE0 +0020 +0020 +0020 +0020 +ENDCHAR +STARTCHAR B940 +ENCODING 47424 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 3 -2 +BITMAP +0060 +0020 +FE20 +0220 +FE20 +4020 +7E20 +1F20 +F020 +1020 +1020 +0820 +0800 +0800 +0FF8 +ENDCHAR +STARTCHAR B944 +ENCODING 47428 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0010 +3F10 +7F10 +2010 +3F10 +0010 +FF10 +0800 +0FF0 +0010 +0FF0 +0400 +0400 +03F8 +ENDCHAR +STARTCHAR B94C +ENCODING 47436 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0030 +7F10 +0210 +7F10 +2010 +3F10 +0010 +FF90 +0810 +0800 +0FF0 +0410 +0420 +0420 +07F0 +0400 +ENDCHAR +STARTCHAR B94F +ENCODING 47439 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -3 +BITMAP +0030 +7F10 +0110 +7F10 +2010 +3F10 +00D0 +FF10 +0810 +0890 +0080 +0160 +0610 +0808 +1000 +ENDCHAR +STARTCHAR B951 +ENCODING 47441 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 14 2 -2 +BITMAP +0030 +7F10 +0210 +7F10 +2010 +3F90 +F810 +0810 +0890 +0350 +0420 +0420 +0660 +03C0 +ENDCHAR +STARTCHAR B958 +ENCODING 47448 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 2 -2 +BITMAP +3FE0 +0020 +0040 +3FE0 +1000 +1FE0 +0000 +FFFC +0840 +0840 +0840 +0840 +0840 +0840 +ENDCHAR +STARTCHAR B959 +ENCODING 47449 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 14 2 -2 +BITMAP +3FC0 +0040 +3FC0 +1000 +1000 +1FE0 +0000 +FFF8 +0880 +2FC0 +1040 +0040 +0040 +0040 +ENDCHAR +STARTCHAR B95C +ENCODING 47452 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +1FF0 +0010 +1FF0 +0800 +0800 +0FF0 +0000 +FFFE +0420 +0420 +1C20 +0820 +0800 +0FF8 +ENDCHAR +STARTCHAR B960 +ENCODING 47456 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 2 -2 +BITMAP +3FE0 +0020 +3FE0 +1000 +1FE0 +0000 +FFFC +08C0 +0880 +3FE0 +0040 +3FE0 +1000 +1FF0 +ENDCHAR +STARTCHAR B968 +ENCODING 47464 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +1FF0 +0020 +1FE0 +0800 +0FF0 +0000 +FFFE +0460 +0040 +0FE0 +0820 +0840 +0FC0 +0800 +ENDCHAR +STARTCHAR B969 +ENCODING 47465 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -3 +BITMAP +1FF0 +0020 +0020 +0FC0 +0830 +07C0 +FFFE +0440 +1840 +0820 +0FE0 +0820 +0820 +0FE0 +0820 +ENDCHAR +STARTCHAR B96B +ENCODING 47467 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 2 -2 +BITMAP +3FE0 +0040 +3FE0 +1000 +1FE0 +0000 +FFFC +0840 +0840 +0B40 +0200 +0500 +08E0 +3020 +ENDCHAR +STARTCHAR B96D +ENCODING 47469 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +1FF0 +0010 +0FF0 +0800 +0FF8 +0000 +FFFE +0420 +04A0 +0340 +0420 +0420 +0660 +03C0 +ENDCHAR +STARTCHAR B974 +ENCODING 47476 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 11 2 0 +BITMAP +7FE0 +0040 +0040 +60C0 +3F00 +2000 +20E0 +1F00 +0000 +0018 +FFE0 +ENDCHAR +STARTCHAR B975 +ENCODING 47477 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +1FF0 +0020 +1FE0 +0800 +0FF0 +0000 +03FE +FF80 +0000 +3FE0 +0020 +0020 +0020 +0020 +ENDCHAR +STARTCHAR B978 +ENCODING 47480 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 12 1 -1 +BITMAP +1FF0 +0010 +1FF0 +0800 +0FF8 +0000 +01FE +FF80 +1800 +0800 +0810 +0FF8 +ENDCHAR +STARTCHAR B97C +ENCODING 47484 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +1FF0 +0010 +1FF0 +0800 +0800 +0FF4 +FFFE +0000 +0FF0 +0020 +1FF0 +0800 +0800 +07F0 +ENDCHAR +STARTCHAR B984 +ENCODING 47492 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +1FF0 +0010 +1FF0 +0800 +0800 +0FF8 +0000 +FFFE +0000 +1FF0 +0820 +0820 +0FE0 +0800 +ENDCHAR +STARTCHAR B985 +ENCODING 47493 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -3 +BITMAP +1FF0 +0020 +1FE0 +0800 +0800 +0FF0 +0000 +FFFE +1820 +0820 +0FE0 +0820 +0820 +0FE0 +0820 +ENDCHAR +STARTCHAR B987 +ENCODING 47495 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 2 -2 +BITMAP +3FE0 +0020 +0040 +1F80 +1000 +1FE0 +0008 +FFFC +0400 +0200 +0600 +0D80 +1060 +6000 +ENDCHAR +STARTCHAR B989 +ENCODING 47497 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +1FF0 +0010 +1FF0 +0800 +0800 +0FF0 +FFFE +2100 +07C0 +0C60 +0820 +0820 +0460 +03C0 +ENDCHAR +STARTCHAR B98A +ENCODING 47498 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -3 +BITMAP +1FF0 +0020 +1FE0 +0800 +0FF0 +0000 +FFFE +0000 +0000 +1FF8 +0100 +0300 +06C0 +0830 +3000 +ENDCHAR +STARTCHAR B98D +ENCODING 47501 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +1FF0 +0020 +1FE0 +0800 +0FF0 +0000 +FFFE +0000 +0000 +0FF0 +0800 +0FE0 +0800 +0FF0 +ENDCHAR +STARTCHAR B98E +ENCODING 47502 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +1FF0 +0010 +0010 +1FF0 +0800 +0FF0 +0000 +FFFE +2000 +1FF0 +0840 +0440 +0498 +1B60 +ENDCHAR +STARTCHAR B9AC +ENCODING 47532 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0070 +0010 +0010 +FE10 +0210 +0410 +0410 +FE10 +4010 +4050 +4390 +7C10 +0010 +0010 +0010 +ENDCHAR +STARTCHAR B9AD +ENCODING 47533 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0030 +0010 +FE10 +0410 +0410 +FE10 +4050 +4790 +7810 +0000 +3FE0 +1020 +0020 +0020 +0020 +0020 +ENDCHAR +STARTCHAR B9B0 +ENCODING 47536 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0040 +0030 +FE10 +0410 +0410 +FE10 +4010 +4050 +4390 +7C10 +0010 +1810 +0800 +0800 +0FF8 +ENDCHAR +STARTCHAR B9B4 +ENCODING 47540 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0010 +8E10 +7210 +0410 +7E10 +4010 +4390 +7C00 +1FE0 +0020 +1FE0 +0800 +0800 +0FF8 +ENDCHAR +STARTCHAR B9BC +ENCODING 47548 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 11 16 3 -3 +BITMAP +0060 +0020 +FE20 +0220 +0420 +7E20 +4060 +47A0 +7820 +0000 +3FC0 +1040 +1040 +1040 +1FC0 +1000 +ENDCHAR +STARTCHAR B9BD +ENCODING 47549 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 11 15 3 -3 +BITMAP +0060 +FE20 +0420 +0420 +FE20 +4020 +40A0 +5F20 +3060 +0820 +0FE0 +0820 +0820 +0FE0 +0820 +ENDCHAR +STARTCHAR B9BF +ENCODING 47551 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0010 +FE10 +0410 +0410 +FE10 +4010 +4050 +4790 +7910 +0080 +0180 +0260 +0410 +1808 +ENDCHAR +STARTCHAR B9C1 +ENCODING 47553 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 11 15 3 -2 +BITMAP +0060 +0020 +FE20 +0220 +0420 +FE20 +4020 +40E0 +4F20 +7120 +06C0 +0820 +0820 +0C60 +07C0 +ENDCHAR +STARTCHAR B9C8 +ENCODING 47560 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 3 -2 +BITMAP +00C0 +0040 +0040 +0040 +FC40 +8440 +8440 +8478 +8840 +FC40 +8040 +0040 +0040 +0040 +0040 +ENDCHAR +STARTCHAR B9C9 +ENCODING 47561 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0060 +0020 +FE20 +4220 +4220 +423C +4420 +7E20 +4000 +3FE0 +0020 +0020 +0020 +0020 +0020 +ENDCHAR +STARTCHAR B9CC +ENCODING 47564 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0060 +0020 +0020 +FE20 +4220 +4220 +4438 +7E20 +4020 +0020 +3820 +0800 +0800 +0800 +0FF0 +ENDCHAR +STARTCHAR B9CE +ENCODING 47566 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0060 +0020 +FE20 +4220 +422C +4230 +7E20 +4000 +00C0 +63F0 +20E0 +2110 +2510 +3910 +00E0 +ENDCHAR +STARTCHAR B9CF +ENCODING 47567 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 3 -2 +BITMAP +00C0 +0040 +0040 +FC40 +8440 +8448 +8870 +FC40 +8040 +0000 +3FC0 +1000 +1000 +1000 +1FE0 +ENDCHAR +STARTCHAR B9D0 +ENCODING 47568 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +00C0 +0020 +FE20 +4220 +4220 +4420 +4438 +7E20 +4020 +1FE0 +0020 +1FE0 +0800 +0800 +0FF0 +ENDCHAR +STARTCHAR B9D1 +ENCODING 47569 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 3 -2 +BITMAP +00C0 +0040 +FC40 +8440 +8458 +8860 +FC40 +8040 +0000 +FBC0 +0840 +D840 +6040 +4440 +7840 +ENDCHAR +STARTCHAR B9D2 +ENCODING 47570 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0060 +0020 +FE20 +4220 +4224 +4238 +4420 +7E20 +4400 +3DF0 +0520 +7D20 +2120 +23F0 +3D00 +ENDCHAR +STARTCHAR B9D8 +ENCODING 47576 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 16 2 -3 +BITMAP +0060 +0020 +0020 +FE20 +4220 +423C +4220 +7E20 +4020 +0000 +0FE0 +0820 +0840 +0840 +0FE0 +0800 +ENDCHAR +STARTCHAR B9D9 +ENCODING 47577 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +00E0 +0020 +FE20 +4220 +4220 +423C +4420 +7E20 +4020 +1820 +0820 +0FE0 +0820 +0FE0 +0820 +ENDCHAR +STARTCHAR B9DB +ENCODING 47579 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 14 3 -2 +BITMAP +00C0 +0040 +FC40 +8440 +8440 +8878 +FC40 +8040 +0240 +0300 +0300 +04C0 +0820 +3010 +ENDCHAR +STARTCHAR B9DD +ENCODING 47581 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 3 -2 +BITMAP +00C0 +0040 +0040 +FC40 +8440 +847C +8440 +FC40 +8040 +0100 +0780 +0840 +0840 +0C40 +0780 +ENDCHAR +STARTCHAR B9DE +ENCODING 47582 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 2 -2 +BITMAP +0060 +0020 +FE20 +4220 +4220 +423C +7E20 +4020 +0030 +1FC0 +0300 +06C0 +0830 +3000 +ENDCHAR +STARTCHAR B9E1 +ENCODING 47585 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0060 +0020 +FE20 +4220 +4220 +423C +4220 +7E20 +4000 +0FE0 +0800 +0FE0 +0800 +0800 +07F0 +ENDCHAR +STARTCHAR B9E3 +ENCODING 47587 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0060 +0020 +FE20 +4220 +422C +4230 +7E20 +4000 +0380 +0010 +3FE0 +0180 +0640 +0440 +0780 +ENDCHAR +STARTCHAR B9E4 +ENCODING 47588 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 11 15 3 -2 +BITMAP +0080 +0260 +0120 +0120 +F920 +8920 +8920 +8920 +89E0 +F920 +8120 +0120 +0120 +0120 +0020 +ENDCHAR +STARTCHAR B9E5 +ENCODING 47589 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 11 16 3 -3 +BITMAP +0060 +0220 +0120 +F920 +8920 +8920 +89E0 +F920 +8120 +0120 +3FE0 +0020 +0020 +0020 +0020 +0020 +ENDCHAR +STARTCHAR B9E8 +ENCODING 47592 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 3 -2 +BITMAP +0040 +0020 +0320 +0120 +F920 +8920 +8920 +89E0 +F920 +8120 +0120 +3120 +1000 +1000 +1FF0 +ENDCHAR +STARTCHAR B9EC +ENCODING 47596 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0110 +0090 +FC90 +4490 +4490 +44F0 +7C90 +4090 +0FF0 +0010 +0FF0 +0400 +0400 +07F8 +ENDCHAR +STARTCHAR B9F4 +ENCODING 47604 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0190 +0090 +FC90 +4490 +4490 +44F0 +7C90 +4090 +0090 +0FF0 +0410 +0420 +0420 +07C0 +ENDCHAR +STARTCHAR B9F5 +ENCODING 47605 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 11 16 3 -3 +BITMAP +0040 +0060 +0120 +F920 +8920 +8920 +89E0 +F920 +8120 +1820 +0820 +0FE0 +0820 +0820 +0FE0 +0820 +ENDCHAR +STARTCHAR B9F7 +ENCODING 47607 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 3 -2 +BITMAP +0060 +0220 +0120 +F920 +8920 +8920 +89E0 +F920 +8120 +0320 +0100 +0280 +0440 +0820 +3010 +ENDCHAR +STARTCHAR B9F8 +ENCODING 47608 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0110 +0090 +FE90 +4490 +4490 +44F0 +7C90 +4090 +08F0 +0420 +0C60 +1A60 +2298 +4108 +ENDCHAR +STARTCHAR B9F9 +ENCODING 47609 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0090 +0090 +FC90 +4490 +44F0 +4490 +4490 +7C10 +4080 +0360 +0410 +0410 +0630 +03E0 +ENDCHAR +STARTCHAR B9FA +ENCODING 47610 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0030 +0090 +0090 +FE90 +4490 +44F0 +4490 +7C90 +4090 +0000 +3FF0 +0100 +0300 +04C0 +0830 +7000 +ENDCHAR +STARTCHAR BA00 +ENCODING 47616 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0060 +0020 +0020 +FE20 +4220 +423C +4220 +4420 +7E20 +403C +0020 +0020 +0020 +0020 +0020 +ENDCHAR +STARTCHAR BA01 +ENCODING 47617 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 16 2 -3 +BITMAP +0060 +0020 +0020 +FE20 +4238 +4220 +4420 +7E3C +4020 +0000 +3FE0 +0020 +0020 +0020 +0020 +0020 +ENDCHAR +STARTCHAR BA08 +ENCODING 47624 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 3 -2 +BITMAP +00C0 +0040 +0040 +FC58 +8460 +8440 +8848 +FC70 +8000 +3FC0 +0040 +0040 +1FC0 +1000 +1FE0 +ENDCHAR +STARTCHAR BA15 +ENCODING 47637 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0060 +0020 +0020 +FE20 +423C +4220 +4220 +7E2C +4030 +0100 +06C0 +0820 +0820 +0C60 +07C0 +ENDCHAR +STARTCHAR BA38 +ENCODING 47672 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 11 15 3 -2 +BITMAP +00E0 +0020 +0020 +0020 +FE20 +8420 +87E0 +8420 +8420 +FC20 +8020 +0020 +0020 +0020 +0020 +ENDCHAR +STARTCHAR BA39 +ENCODING 47673 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0060 +0010 +0010 +FF10 +4210 +43F0 +4210 +7E10 +4010 +0010 +3FE0 +1020 +0020 +0020 +0020 +0020 +ENDCHAR +STARTCHAR BA3C +ENCODING 47676 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0070 +0010 +0010 +FF10 +4210 +43F0 +4210 +7E10 +4010 +0010 +0010 +0C00 +0400 +0400 +07F8 +ENDCHAR +STARTCHAR BA40 +ENCODING 47680 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0020 +0010 +FF10 +4210 +43F0 +4390 +4210 +7E10 +4010 +1FE0 +0020 +1FE0 +0800 +0800 +0FF0 +ENDCHAR +STARTCHAR BA42 +ENCODING 47682 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0020 +0010 +FF10 +4210 +43F0 +4390 +4210 +7E10 +4010 +3DE0 +0520 +7D20 +2120 +23E0 +3D00 +ENDCHAR +STARTCHAR BA48 +ENCODING 47688 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 11 16 3 -3 +BITMAP +00C0 +0020 +0020 +FE20 +8420 +87E0 +8420 +FC20 +8020 +0020 +1FE0 +0820 +0820 +0840 +0FE0 +0800 +ENDCHAR +STARTCHAR BA49 +ENCODING 47689 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0020 +0010 +FF10 +4210 +43F0 +4390 +4210 +7E10 +4010 +0C10 +0410 +07F0 +0410 +07F0 +0410 +ENDCHAR +STARTCHAR BA4B +ENCODING 47691 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 3 -2 +BITMAP +00E0 +0020 +0020 +FE20 +8620 +85E0 +8420 +FE20 +8020 +0620 +0320 +0300 +0480 +0860 +3010 +ENDCHAR +STARTCHAR BA4D +ENCODING 47693 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 11 15 3 -2 +BITMAP +00E0 +0020 +0020 +FE20 +8420 +87E0 +8420 +FC20 +8020 +0120 +06C0 +0820 +0820 +0C60 +07C0 +ENDCHAR +STARTCHAR BA4E +ENCODING 47694 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 11 16 3 -3 +BITMAP +0180 +00C0 +0040 +FC40 +8440 +87C0 +8840 +FC40 +8040 +0060 +7F80 +0200 +0500 +18C0 +2020 +4000 +ENDCHAR +STARTCHAR BA53 +ENCODING 47699 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0060 +0010 +FF10 +4210 +43F0 +43D0 +4210 +7E10 +4010 +03D0 +1FF8 +0100 +06C0 +0440 +03C0 +ENDCHAR +STARTCHAR BA54 +ENCODING 47700 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 1 -2 +BITMAP +0018 +00C8 +0048 +FE48 +2248 +2248 +23C8 +2248 +2448 +3E48 +2048 +0048 +0048 +0048 +0008 +ENDCHAR +STARTCHAR BA55 +ENCODING 47701 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 11 16 3 -3 +BITMAP +0060 +0220 +0120 +F920 +8920 +8F20 +9120 +F920 +8120 +0100 +3FE0 +0020 +0020 +0020 +0020 +0020 +ENDCHAR +STARTCHAR BA58 +ENCODING 47704 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 14 2 -1 +BITMAP +0030 +0010 +0090 +FC90 +4490 +4490 +4790 +4490 +7C90 +4090 +1890 +0880 +0800 +0FF8 +ENDCHAR +STARTCHAR BA5C +ENCODING 47708 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0060 +01B0 +0090 +FC90 +4490 +4790 +4490 +7C90 +4090 +0F70 +0020 +0FF0 +0400 +0400 +07F8 +ENDCHAR +STARTCHAR BA64 +ENCODING 47716 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0060 +01B0 +0090 +FC90 +4490 +4790 +4490 +4490 +7C90 +4010 +0FF0 +0410 +0420 +0420 +07C0 +ENDCHAR +STARTCHAR BA65 +ENCODING 47717 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0060 +0130 +0090 +FC90 +4490 +4790 +4890 +7C90 +4090 +08B0 +0410 +07F0 +0410 +07F0 +0410 +ENDCHAR +STARTCHAR BA67 +ENCODING 47719 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0090 +0090 +FC90 +4490 +4790 +4490 +4890 +7C90 +4110 +0080 +0180 +0240 +0430 +1808 +ENDCHAR +STARTCHAR BA68 +ENCODING 47720 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0060 +01B0 +0090 +FC90 +4490 +4790 +4890 +7C90 +4090 +0060 +0420 +0420 +0A50 +1088 +6100 +ENDCHAR +STARTCHAR BA69 +ENCODING 47721 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0060 +01B0 +0090 +FC90 +4490 +4790 +4890 +7C90 +4090 +0090 +0360 +0410 +0410 +0630 +03E0 +ENDCHAR +STARTCHAR BA70 +ENCODING 47728 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0030 +0010 +0010 +FF10 +43F0 +4210 +4210 +4210 +43F0 +7E10 +4010 +0010 +0010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR BA71 +ENCODING 47729 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +FE10 +43F0 +4210 +4210 +4210 +7EF0 +4010 +0010 +3FE0 +0020 +0020 +0020 +0020 +ENDCHAR +STARTCHAR BA74 +ENCODING 47732 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 3 -2 +BITMAP +00E0 +0020 +0020 +FE20 +85E0 +8420 +87E0 +FC20 +8020 +0020 +2020 +1000 +1000 +1000 +1FF0 +ENDCHAR +STARTCHAR BA78 +ENCODING 47736 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0020 +0010 +FE10 +43F0 +43F0 +4210 +4210 +7EF0 +4010 +1FE0 +0020 +1FE0 +0800 +0800 +0FF0 +ENDCHAR +STARTCHAR BA83 +ENCODING 47747 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0010 +FF10 +43F0 +4210 +4210 +4210 +7EF0 +4010 +0110 +0110 +0380 +0660 +0810 +3008 +ENDCHAR +STARTCHAR BA84 +ENCODING 47748 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 3 -2 +BITMAP +0040 +0020 +FE20 +87E0 +8420 +8420 +8420 +FDE0 +8020 +00A0 +1840 +10C0 +3CC0 +4530 +8610 +ENDCHAR +STARTCHAR BA85 +ENCODING 47749 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 11 15 3 -2 +BITMAP +00C0 +0060 +0020 +FC20 +87E0 +8420 +8660 +FDA0 +8020 +0100 +0680 +0840 +0840 +0CC0 +0780 +ENDCHAR +STARTCHAR BA87 +ENCODING 47751 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 11 16 3 -3 +BITMAP +0040 +0020 +FE20 +87E0 +8420 +8420 +FDE0 +8020 +0F20 +0000 +7FE0 +0200 +0500 +08C0 +3020 +4000 +ENDCHAR +STARTCHAR BA8C +ENCODING 47756 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0190 +0050 +0050 +FE50 +47D0 +4450 +4450 +47D0 +7C50 +4050 +0050 +0050 +0050 +0010 +ENDCHAR +STARTCHAR BAA8 +ENCODING 47784 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 10 1 0 +BITMAP +0FF0 +0810 +0810 +0810 +0FF0 +0800 +0100 +0100 +0100 +FFFE +ENDCHAR +STARTCHAR BAA9 +ENCODING 47785 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 2 -2 +BITMAP +1FE0 +1020 +1040 +1040 +1FC0 +1200 +0200 +FFFC +0000 +7FC0 +0040 +0040 +0040 +0040 +ENDCHAR +STARTCHAR BAAB +ENCODING 47787 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +1FE0 +0820 +0820 +0820 +0FE0 +0900 +FFFE +0000 +0460 +3C20 +0460 +0450 +0488 +0500 +ENDCHAR +STARTCHAR BAAC +ENCODING 47788 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 12 2 -1 +BITMAP +1FE0 +1020 +1040 +1FC0 +1200 +0200 +FFFC +2000 +1000 +1000 +1000 +1FF0 +ENDCHAR +STARTCHAR BAB0 +ENCODING 47792 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 2 -2 +BITMAP +3FE0 +1040 +1040 +1040 +1FC0 +0200 +FFFC +0000 +3FE0 +0040 +3FC0 +1000 +1000 +1FE0 +ENDCHAR +STARTCHAR BAB2 +ENCODING 47794 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +1FF0 +0820 +0820 +0820 +0FE0 +0100 +FFFE +0000 +3E00 +02F8 +3E90 +1090 +16F0 +0880 +ENDCHAR +STARTCHAR BAB8 +ENCODING 47800 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 2 -2 +BITMAP +1FE0 +1020 +1040 +1040 +1FC0 +1200 +FFFC +0000 +0000 +1FC0 +1040 +1040 +1FC0 +1000 +ENDCHAR +STARTCHAR BAB9 +ENCODING 47801 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 2 -2 +BITMAP +1FE0 +1020 +1040 +1040 +1FC0 +1200 +FFFC +0000 +3040 +1040 +1FC0 +1040 +1FC0 +1040 +ENDCHAR +STARTCHAR BABB +ENCODING 47803 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 2 -2 +BITMAP +1FE0 +1020 +1020 +1040 +1FE0 +1200 +0200 +FFFC +4400 +0200 +0700 +0C80 +1060 +6010 +ENDCHAR +STARTCHAR BABD +ENCODING 47805 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +1FF0 +0830 +0820 +0820 +0FE0 +0900 +01FE +FF00 +0100 +07C0 +0C60 +0820 +0C60 +07C0 +ENDCHAR +STARTCHAR BAC4 +ENCODING 47812 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0060 +0020 +7FA0 +2120 +2120 +2120 +2120 +1F3C +0420 +04E0 +FB20 +0020 +0020 +0020 +0020 +ENDCHAR +STARTCHAR BAC8 +ENCODING 47816 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0060 +0020 +0020 +7F20 +2220 +2220 +3E20 +083C +08E0 +FF20 +0020 +1820 +0800 +0800 +0FF0 +ENDCHAR +STARTCHAR BAD8 +ENCODING 47832 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 2 -2 +BITMAP +0060 +7F20 +2220 +2220 +3E20 +283C +09E0 +FE20 +0000 +0420 +0C60 +0A60 +1290 +6108 +ENDCHAR +STARTCHAR BAD9 +ENCODING 47833 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 2 -2 +BITMAP +0060 +0020 +7F20 +2120 +2220 +3F2C +0830 +09E0 +F6A0 +03E0 +0420 +0420 +0660 +03C0 +ENDCHAR +STARTCHAR BAFC +ENCODING 47868 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0060 +0010 +0010 +3F90 +2110 +2110 +2110 +3F10 +0410 +0410 +05F0 +FA10 +0010 +0010 +0010 +ENDCHAR +STARTCHAR BB00 +ENCODING 47872 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0010 +3F10 +2110 +2110 +3F10 +2410 +0430 +FFD0 +0010 +0010 +1C00 +0400 +0400 +07F8 +ENDCHAR +STARTCHAR BB04 +ENCODING 47876 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0010 +3F10 +2110 +2110 +3F10 +0410 +04F0 +FB10 +0000 +0FF0 +0020 +0FF0 +0400 +07F8 +ENDCHAR +STARTCHAR BB0D +ENCODING 47885 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0030 +0010 +3F10 +2110 +2110 +3F10 +0410 +0430 +FFD0 +0860 +0420 +07E0 +0420 +0420 +07E0 +0420 +ENDCHAR +STARTCHAR BB0F +ENCODING 47887 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 11 15 3 -2 +BITMAP +0060 +0020 +7E20 +4220 +4220 +3C20 +0820 +0FE0 +F020 +0200 +0200 +0500 +08C0 +1020 +6000 +ENDCHAR +STARTCHAR BB11 +ENCODING 47889 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +7F10 +2110 +2110 +3F10 +2410 +0470 +FB90 +0090 +0360 +0410 +0410 +0630 +03E0 +ENDCHAR +STARTCHAR BB18 +ENCODING 47896 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 10 2 0 +BITMAP +3FE0 +1020 +1020 +1020 +1FE0 +1000 +1840 +0840 +0840 +FFFC +ENDCHAR +STARTCHAR BB1C +ENCODING 47900 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 13 2 -1 +BITMAP +3FE0 +1020 +1040 +1040 +1FE0 +08C0 +0880 +FFFC +2000 +1000 +1000 +1020 +1FF0 +ENDCHAR +STARTCHAR BB20 +ENCODING 47904 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 2 -2 +BITMAP +1FE0 +1040 +1040 +1040 +1F80 +0880 +FFFC +0000 +3FC0 +0040 +3FC0 +1000 +1000 +1FE0 +ENDCHAR +STARTCHAR BB29 +ENCODING 47913 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 2 -2 +BITMAP +3FE0 +1060 +1040 +1040 +1FC0 +1080 +0880 +FFFC +3040 +1040 +1FC0 +1040 +1FC0 +1040 +ENDCHAR +STARTCHAR BB2B +ENCODING 47915 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 2 -2 +BITMAP +1FE0 +1020 +1040 +1040 +1FC0 +10C0 +0888 +FF7C +0400 +0300 +0300 +04C0 +1820 +2010 +ENDCHAR +STARTCHAR BB34 +ENCODING 47924 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -3 +BITMAP +1FF0 +0810 +0820 +0820 +0FE0 +0800 +0000 +FFFE +0100 +0100 +0100 +0100 +0100 +0100 +0100 +ENDCHAR +STARTCHAR BB35 +ENCODING 47925 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +1FE0 +0820 +0820 +0820 +0FE0 +0800 +FFFE +0100 +0100 +1FE0 +0020 +0020 +0020 +0020 +ENDCHAR +STARTCHAR BB36 +ENCODING 47926 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 2 -2 +BITMAP +7FC0 +1040 +1040 +1FC0 +1000 +0000 +FFFC +0200 +0200 +7DE0 +0420 +0420 +0420 +0420 +ENDCHAR +STARTCHAR BB38 +ENCODING 47928 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 13 2 -1 +BITMAP +3FE0 +1040 +1040 +1040 +1FC0 +1004 +FFFE +0100 +0100 +3100 +1100 +1000 +0FF0 +ENDCHAR +STARTCHAR BB3B +ENCODING 47931 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +1FF0 +0820 +0820 +0820 +0FE0 +0800 +FFFE +0100 +0100 +0FF0 +0800 +0800 +0800 +07F0 +ENDCHAR +STARTCHAR BB3C +ENCODING 47932 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 2 -2 +BITMAP +3FE0 +1040 +1040 +1040 +1FC0 +1000 +FFFC +0200 +3E40 +01C0 +3FC0 +1000 +1000 +1FE0 +ENDCHAR +STARTCHAR BB3D +ENCODING 47933 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +1FF0 +0820 +0820 +0820 +0FE0 +0800 +FFFE +0100 +01F0 +1E10 +2410 +1810 +1310 +1C10 +ENDCHAR +STARTCHAR BB3E +ENCODING 47934 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 2 -2 +BITMAP +7FE0 +1040 +1040 +1040 +1FC0 +1000 +FFFC +0200 +3DF0 +0590 +6D90 +30A0 +22F0 +3C00 +ENDCHAR +STARTCHAR BB44 +ENCODING 47940 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -3 +BITMAP +1FF0 +0820 +0820 +0820 +0FE0 +0800 +FFFE +0100 +0100 +1F60 +08A0 +0820 +0820 +0FE0 +0800 +ENDCHAR +STARTCHAR BB45 +ENCODING 47941 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -3 +BITMAP +1FE0 +0820 +0820 +0840 +0FE0 +0804 +FFFE +0100 +1920 +0920 +0FE0 +0820 +0820 +0FE0 +0820 +ENDCHAR +STARTCHAR BB47 +ENCODING 47943 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +1FE0 +0820 +0820 +0820 +0FE0 +0804 +FFFE +0100 +0100 +0100 +0300 +02C0 +0C30 +1010 +ENDCHAR +STARTCHAR BB49 +ENCODING 47945 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +1FE0 +0820 +0820 +0820 +0FE0 +0804 +FFFE +0100 +0100 +06C0 +0820 +0820 +0C60 +07C0 +ENDCHAR +STARTCHAR BB4D +ENCODING 47949 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +1FE0 +0820 +0820 +0840 +0FE0 +0804 +FFFE +2100 +0160 +0E80 +0800 +0FE0 +0800 +0FF0 +ENDCHAR +STARTCHAR BB4F +ENCODING 47951 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +1FF0 +0820 +0820 +0FE0 +0800 +C7FE +7F00 +0100 +03C0 +1FF8 +0100 +06C0 +0640 +03C0 +ENDCHAR +STARTCHAR BB50 +ENCODING 47952 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +7F10 +2110 +2110 +2210 +3F10 +2010 +0F10 +F9F0 +0810 +0810 +0810 +0810 +0010 +ENDCHAR +STARTCHAR BB54 +ENCODING 47956 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0010 +7F10 +2110 +2210 +3F10 +2010 +0190 +FE10 +04F0 +0010 +1800 +0800 +0810 +0FF8 +ENDCHAR +STARTCHAR BB58 +ENCODING 47960 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +7F10 +2110 +2210 +3F10 +2050 +FF90 +08F0 +0800 +1FF0 +0020 +1FF0 +0800 +0FF0 +ENDCHAR +STARTCHAR BB61 +ENCODING 47969 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0030 +0010 +7F10 +2110 +2210 +3F10 +2050 +FF90 +08F0 +0830 +0410 +07F0 +0410 +0410 +07F0 +0410 +ENDCHAR +STARTCHAR BB63 +ENCODING 47971 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0060 +0030 +7F10 +2110 +2210 +3F10 +2010 +FF10 +0830 +09D0 +0190 +0100 +02C0 +0430 +1808 +ENDCHAR +STARTCHAR BB6C +ENCODING 47980 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0110 +0090 +FC90 +4490 +4490 +4490 +7C90 +4C90 +F090 +1390 +1090 +1090 +0090 +0010 +ENDCHAR +STARTCHAR BB88 +ENCODING 48008 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +7F10 +2110 +2210 +2210 +3F10 +2010 +0F10 +F810 +0810 +0810 +0810 +0810 +0010 +ENDCHAR +STARTCHAR BB8C +ENCODING 48012 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 14 3 -1 +BITMAP +0060 +0020 +7E20 +4220 +4420 +7E20 +4020 +0F20 +F820 +1020 +3020 +1000 +1000 +1FF0 +ENDCHAR +STARTCHAR BB90 +ENCODING 48016 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +7F10 +2110 +2210 +3E10 +2090 +FF10 +0810 +1FF0 +0010 +0020 +1FF0 +0800 +0FF0 +ENDCHAR +STARTCHAR BBA4 +ENCODING 48036 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 14 2 -2 +BITMAP +3FE0 +1040 +1040 +1040 +1FC0 +1000 +0000 +FFF8 +0880 +0880 +0880 +0880 +0880 +0880 +ENDCHAR +STARTCHAR BBA8 +ENCODING 48040 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 2 -2 +BITMAP +1FE0 +1060 +1040 +1040 +1FE0 +1000 +FFFC +0440 +0440 +0440 +3040 +1000 +1000 +1FF0 +ENDCHAR +STARTCHAR BBAC +ENCODING 48044 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 2 -2 +BITMAP +7FE0 +1040 +1040 +1040 +1FC0 +1000 +FFFC +0880 +0880 +3FC0 +0040 +3FC0 +1000 +1FE0 +ENDCHAR +STARTCHAR BBB4 +ENCODING 48052 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -3 +BITMAP +3FC0 +1040 +1040 +1040 +1FC0 +1000 +FFFC +0880 +0880 +3FE0 +1040 +1040 +1040 +1FC0 +1000 +ENDCHAR +STARTCHAR BBB7 +ENCODING 48055 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 2 -2 +BITMAP +3FE0 +1040 +1040 +1040 +1FC0 +1000 +FFFC +0840 +0C40 +0A40 +0B40 +0480 +1860 +6010 +ENDCHAR +STARTCHAR BBC0 +ENCODING 48064 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 10 1 0 +BITMAP +1FF0 +0810 +0810 +0820 +0FF0 +0800 +0000 +0000 +0000 +FFFE +ENDCHAR +STARTCHAR BBC4 +ENCODING 48068 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 2 -2 +BITMAP +3FE0 +1040 +1040 +1040 +1FC0 +1008 +FFFC +0000 +0000 +0000 +3000 +1000 +1000 +1FF0 +ENDCHAR +STARTCHAR BBC8 +ENCODING 48072 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +0FE0 +0820 +0820 +0FE0 +0800 +0004 +FFFE +0000 +0FE0 +0020 +1FE0 +0800 +0800 +0FF0 +ENDCHAR +STARTCHAR BBD0 +ENCODING 48080 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +1FF0 +0820 +0820 +0820 +0FE0 +0804 +FFFE +0000 +0000 +0FE0 +0820 +0820 +0FE0 +0800 +ENDCHAR +STARTCHAR BBD3 +ENCODING 48083 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +1FF0 +0810 +0820 +0820 +0FF0 +0800 +0004 +FFFE +0200 +0100 +0380 +0660 +0810 +1008 +ENDCHAR +STARTCHAR BBF8 +ENCODING 48120 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +0010 +FF10 +4210 +4210 +4210 +4210 +4210 +7E10 +4010 +0010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR BBF9 +ENCODING 48121 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 11 15 3 -2 +BITMAP +0060 +0020 +FE20 +4220 +4220 +4220 +4420 +7E20 +4000 +7FC0 +0040 +0040 +0040 +0040 +0040 +ENDCHAR +STARTCHAR BBFC +ENCODING 48124 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 3 -2 +BITMAP +0060 +0020 +0020 +FE20 +8420 +8420 +8420 +FC20 +8020 +0020 +7020 +1000 +1000 +1020 +1FF0 +ENDCHAR +STARTCHAR BBFF +ENCODING 48127 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 14 2 -1 +BITMAP +0030 +0010 +0010 +FF10 +4210 +4210 +4210 +7E10 +4000 +0020 +0FE0 +0800 +0800 +0FF0 +ENDCHAR +STARTCHAR BC00 +ENCODING 48128 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 14 2 -1 +BITMAP +0030 +0010 +FF10 +4210 +4210 +4210 +7E10 +4010 +0000 +1FF0 +0020 +1FF0 +0800 +0FF0 +ENDCHAR +STARTCHAR BC02 +ENCODING 48130 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 11 15 2 -3 +BITMAP +0060 +FF20 +4220 +4220 +4220 +7E20 +4020 +0020 +3DE0 +0520 +6D20 +3120 +2120 +3DE0 +0100 +ENDCHAR +STARTCHAR BC08 +ENCODING 48136 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 10 16 4 -3 +BITMAP +00C0 +0040 +0040 +FC40 +8440 +8440 +8440 +FC40 +8040 +0000 +1FC0 +1040 +1080 +1080 +1FC0 +1000 +ENDCHAR +STARTCHAR BC09 +ENCODING 48137 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 11 15 3 -2 +BITMAP +0060 +0020 +FE20 +8220 +8620 +8620 +8420 +FE20 +8000 +1820 +0820 +0FE0 +0820 +0FE0 +0820 +ENDCHAR +STARTCHAR BC0B +ENCODING 48139 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0010 +0010 +FF10 +4210 +4210 +4210 +7E10 +4010 +0110 +0080 +0180 +0240 +0430 +1808 +ENDCHAR +STARTCHAR BC0C +ENCODING 48140 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0010 +FF10 +4210 +4210 +4210 +7E10 +4010 +0000 +0860 +0C20 +0C60 +1250 +2088 +4308 +ENDCHAR +STARTCHAR BC0D +ENCODING 48141 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 10 15 4 -2 +BITMAP +00C0 +0040 +0040 +FC40 +8440 +8440 +8440 +FC40 +8040 +0200 +1D00 +1080 +1080 +1180 +0F00 +ENDCHAR +STARTCHAR BC0F +ENCODING 48143 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 3 -3 +BITMAP +0060 +FC20 +8420 +8420 +8420 +FC20 +8020 +0700 +0000 +7FF0 +0200 +0700 +08C0 +3020 +C000 +ENDCHAR +STARTCHAR BC11 +ENCODING 48145 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 11 14 3 -1 +BITMAP +0060 +0020 +FC20 +8420 +8420 +8420 +FC20 +8020 +0000 +1FE0 +1000 +1FC0 +1000 +1FE0 +ENDCHAR +STARTCHAR BC14 +ENCODING 48148 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0060 +0020 +0620 +C220 +4220 +7E20 +4220 +423C +4220 +7E20 +4220 +0020 +0020 +0020 +0020 +ENDCHAR +STARTCHAR BC15 +ENCODING 48149 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0060 +0420 +C220 +4220 +7E20 +422C +4230 +7E20 +4220 +0000 +3FE0 +0020 +0020 +0020 +0020 +ENDCHAR +STARTCHAR BC16 +ENCODING 48150 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0060 +0020 +C220 +4220 +7E20 +423C +4220 +7E20 +4200 +03E0 +3C20 +0420 +0420 +0420 +0420 +ENDCHAR +STARTCHAR BC17 +ENCODING 48151 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0060 +0020 +C220 +4220 +7E20 +422C +4230 +7E20 +4220 +00C0 +3C60 +0440 +04A0 +0498 +0508 +ENDCHAR +STARTCHAR BC18 +ENCODING 48152 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0060 +0020 +0620 +C220 +4220 +7E20 +423C +4220 +7E20 +4220 +0020 +1800 +0800 +0800 +0FF0 +ENDCHAR +STARTCHAR BC1B +ENCODING 48155 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0060 +0420 +C220 +4220 +7E20 +422C +4230 +7E20 +4220 +0000 +1FE0 +0800 +0800 +0800 +07F0 +ENDCHAR +STARTCHAR BC1C +ENCODING 48156 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0060 +0020 +C220 +4220 +7E20 +423C +4220 +7E20 +4200 +1FE0 +0020 +0020 +1FE0 +0800 +0FF0 +ENDCHAR +STARTCHAR BC1D +ENCODING 48157 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0060 +0020 +C220 +4220 +7E24 +4238 +4220 +7E20 +4200 +7FE0 +0420 +0420 +3820 +2220 +3C20 +ENDCHAR +STARTCHAR BC1E +ENCODING 48158 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 16 2 -3 +BITMAP +0060 +0020 +C220 +4220 +7E20 +422C +4230 +7E20 +4220 +0000 +7FF0 +0520 +7D20 +2120 +2DE0 +1100 +ENDCHAR +STARTCHAR BC1F +ENCODING 48159 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 2 -2 +BITMAP +0060 +C220 +4220 +7E20 +4224 +4238 +7E20 +4220 +7F20 +0520 +05E0 +3920 +23E0 +3D20 +ENDCHAR +STARTCHAR BC24 +ENCODING 48164 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -2 +BITMAP +0030 +0010 +E110 +2110 +3F10 +211E +2110 +3F10 +2110 +0000 +07F0 +0410 +0420 +07F0 +0400 +ENDCHAR +STARTCHAR BC25 +ENCODING 48165 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 16 2 -3 +BITMAP +0060 +0020 +C220 +4220 +7E20 +423C +4220 +7E20 +4200 +1020 +0820 +0FE0 +0820 +0820 +0FE0 +0820 +ENDCHAR +STARTCHAR BC27 +ENCODING 48167 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0060 +0020 +0420 +C220 +4220 +7E20 +423C +4220 +7E20 +4320 +0080 +0180 +0260 +0410 +1808 +ENDCHAR +STARTCHAR BC29 +ENCODING 48169 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0060 +0420 +C220 +4220 +7E20 +423C +4220 +7E20 +4220 +0080 +0340 +0420 +0420 +0660 +03C0 +ENDCHAR +STARTCHAR BC2D +ENCODING 48173 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 13 2 -1 +BITMAP +0060 +C220 +4220 +7E20 +4220 +423C +7E20 +4220 +0FE0 +0800 +0FE0 +0800 +0FF0 +ENDCHAR +STARTCHAR BC30 +ENCODING 48176 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +0190 +8490 +4490 +4490 +7C90 +4490 +44F0 +7C90 +4490 +0090 +0090 +0090 +0090 +ENDCHAR +STARTCHAR BC31 +ENCODING 48177 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0070 +0130 +0090 +C490 +4490 +7C90 +44F0 +4490 +7C90 +4090 +3FF0 +1010 +0010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR BC34 +ENCODING 48180 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 3 -2 +BITMAP +0060 +0120 +1120 +8920 +8920 +F920 +89E0 +8920 +F920 +8920 +0120 +7020 +1000 +1000 +1FF0 +ENDCHAR +STARTCHAR BC38 +ENCODING 48184 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0060 +0090 +C490 +4490 +7C90 +44F0 +4490 +7C90 +4490 +1FF0 +0020 +1FE0 +0800 +0800 +0FF8 +ENDCHAR +STARTCHAR BC40 +ENCODING 48192 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0030 +0190 +0890 +C490 +4490 +7C90 +44F0 +4490 +7C90 +4490 +0FF0 +0410 +0410 +0420 +07F0 +0400 +ENDCHAR +STARTCHAR BC41 +ENCODING 48193 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0020 +0010 +0890 +C490 +4490 +7C90 +44F0 +4490 +7C90 +4C10 +0410 +07F0 +0410 +0410 +07F0 +0410 +ENDCHAR +STARTCHAR BC43 +ENCODING 48195 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 3 -2 +BITMAP +0060 +0320 +1920 +8920 +8920 +F920 +89E0 +8920 +F920 +8920 +0300 +0300 +0480 +0860 +3010 +ENDCHAR +STARTCHAR BC44 +ENCODING 48196 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 16 2 -3 +BITMAP +0030 +0190 +C490 +4490 +7C90 +4490 +44F0 +7C90 +4490 +0090 +0C60 +0C60 +0C60 +1298 +2108 +4000 +ENDCHAR +STARTCHAR BC45 +ENCODING 48197 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0190 +0890 +C490 +4490 +7C90 +44F0 +4490 +7C90 +4490 +03E0 +0610 +0610 +0210 +01E0 +ENDCHAR +STARTCHAR BC49 +ENCODING 48201 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 14 2 -2 +BITMAP +00B0 +C490 +4490 +7C90 +44F0 +4490 +7C90 +4490 +0020 +0FE0 +0800 +0FE0 +0800 +0FF0 +ENDCHAR +STARTCHAR BC4C +ENCODING 48204 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0060 +0020 +0020 +0620 +C220 +423C +7E20 +4220 +4220 +7E2C +4230 +0020 +0020 +0020 +0020 +ENDCHAR +STARTCHAR BC4D +ENCODING 48205 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 16 2 -3 +BITMAP +0060 +0420 +C220 +4220 +7E3C +4220 +4220 +7E3C +4220 +0000 +3FE0 +0020 +0020 +0020 +0020 +0020 +ENDCHAR +STARTCHAR BC50 +ENCODING 48208 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0060 +0020 +0420 +C220 +423C +7E20 +4220 +4220 +7E3C +4220 +1020 +0800 +0800 +0800 +0FF0 +ENDCHAR +STARTCHAR BC5D +ENCODING 48221 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 2 -2 +BITMAP +0060 +C220 +4220 +7E3C +4220 +4220 +7E38 +4200 +1820 +0820 +0FE0 +0820 +0FE0 +0820 +ENDCHAR +STARTCHAR BC84 +ENCODING 48260 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0060 +0010 +0410 +8210 +4210 +4210 +7E10 +43F0 +4210 +4210 +7E10 +4210 +0010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR BC85 +ENCODING 48261 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0070 +0410 +C210 +4210 +7E10 +43F0 +4210 +7E10 +4210 +0000 +3FE0 +0020 +0020 +0020 +0020 +0020 +ENDCHAR +STARTCHAR BC88 +ENCODING 48264 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0070 +0010 +0610 +C210 +4210 +7E10 +43F0 +4210 +7E10 +4210 +1010 +2810 +0800 +0800 +0FF8 +ENDCHAR +STARTCHAR BC8B +ENCODING 48267 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 11 15 3 -2 +BITMAP +0040 +0820 +8420 +8420 +FC20 +87E0 +8520 +8420 +FC20 +8020 +3FC0 +1000 +1000 +1020 +1FE0 +ENDCHAR +STARTCHAR BC8C +ENCODING 48268 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0070 +0030 +C210 +4210 +7E10 +43F0 +4210 +7E10 +4210 +1FE0 +0020 +0020 +1FE0 +0800 +0FF8 +ENDCHAR +STARTCHAR BC8E +ENCODING 48270 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0060 +0030 +C210 +4210 +7E10 +43F0 +4210 +7E10 +4210 +0010 +7FF0 +0920 +3D20 +2120 +3DE0 +0100 +ENDCHAR +STARTCHAR BC94 +ENCODING 48276 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0070 +0030 +C210 +4210 +7E10 +43F0 +4210 +7E10 +4210 +0000 +0FE0 +0820 +0820 +0840 +0FE0 +0800 +ENDCHAR +STARTCHAR BC95 +ENCODING 48277 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0070 +0030 +C210 +4210 +7E10 +43F0 +4210 +7E10 +4000 +0830 +0410 +07F0 +0410 +0410 +07F0 +0410 +ENDCHAR +STARTCHAR BC97 +ENCODING 48279 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 3 -2 +BITMAP +0040 +0820 +8420 +8420 +FC20 +87E0 +8420 +8420 +FC20 +8220 +0320 +0300 +0480 +0860 +3010 +ENDCHAR +STARTCHAR BC99 +ENCODING 48281 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0410 +C210 +4210 +7E10 +43F0 +4210 +7E10 +4210 +0090 +0340 +0420 +0420 +0660 +03C0 +ENDCHAR +STARTCHAR BC9A +ENCODING 48282 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0060 +0410 +C210 +4210 +7E10 +43F0 +4210 +7E10 +4210 +0020 +1FF0 +0100 +0300 +06E0 +0830 +3000 +ENDCHAR +STARTCHAR BCA0 +ENCODING 48288 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0110 +0090 +0C90 +C490 +4490 +7C90 +4790 +4490 +7C90 +4490 +0090 +0090 +0090 +0010 +ENDCHAR +STARTCHAR BCA1 +ENCODING 48289 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0030 +0110 +C490 +4490 +7C90 +4490 +4790 +7C90 +4490 +0080 +1FF0 +0010 +0010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR BCA4 +ENCODING 48292 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0190 +0890 +C490 +4490 +7C90 +4790 +4490 +7C90 +4490 +0090 +0C00 +0400 +0400 +07F8 +ENDCHAR +STARTCHAR BCA7 +ENCODING 48295 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0020 +0010 +0090 +C490 +4490 +7C90 +4790 +4490 +7C90 +44B0 +1FE0 +0800 +0800 +0800 +0FF0 +ENDCHAR +STARTCHAR BCA8 +ENCODING 48296 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0060 +0190 +0090 +C490 +4490 +7F90 +4490 +7C90 +4090 +0770 +0010 +0FF0 +0400 +0400 +07F8 +ENDCHAR +STARTCHAR BCB0 +ENCODING 48304 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0030 +0110 +0090 +C490 +4490 +7C90 +4790 +4490 +7C90 +4480 +07F0 +0410 +0420 +0420 +07F0 +0400 +ENDCHAR +STARTCHAR BCB1 +ENCODING 48305 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0030 +0110 +0090 +C490 +4490 +7C90 +4790 +7C90 +4490 +0810 +0410 +07F0 +0410 +0410 +07F0 +0410 +ENDCHAR +STARTCHAR BCB3 +ENCODING 48307 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0110 +0090 +C490 +4490 +7C90 +4790 +7C90 +4490 +0190 +0180 +0100 +02C0 +0C30 +1018 +ENDCHAR +STARTCHAR BCB4 +ENCODING 48308 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0010 +0090 +C490 +4490 +7C90 +4790 +7C90 +4490 +00C0 +0420 +0C60 +0E60 +1298 +6108 +ENDCHAR +STARTCHAR BCB5 +ENCODING 48309 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0060 +0010 +0190 +C490 +4490 +7C90 +4790 +7C90 +4490 +0090 +0340 +0420 +0420 +0660 +03C0 +ENDCHAR +STARTCHAR BCBC +ENCODING 48316 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +0610 +C210 +43F0 +7E10 +4210 +4210 +43F0 +7F10 +4010 +0010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR BCBD +ENCODING 48317 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0070 +0410 +C210 +43F0 +7E10 +4210 +4210 +7FF0 +4010 +0000 +1FF0 +0010 +0010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR BCC0 +ENCODING 48320 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0060 +0010 +0610 +C210 +4210 +7FF0 +4210 +4230 +7FD0 +4010 +1010 +0810 +0800 +0800 +0FF8 +ENDCHAR +STARTCHAR BCC4 +ENCODING 48324 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0610 +C210 +43F0 +7E30 +4230 +4230 +7FD0 +4010 +1FE0 +0020 +0FE0 +0800 +0800 +07F0 +ENDCHAR +STARTCHAR BCCD +ENCODING 48333 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0210 +C110 +41F0 +7F10 +4110 +4130 +7FD0 +4010 +0830 +0410 +07F0 +0410 +07F0 +0410 +ENDCHAR +STARTCHAR BCCF +ENCODING 48335 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0210 +C110 +41F0 +7F10 +4110 +4110 +7FF0 +4010 +0110 +0100 +0300 +06C0 +0830 +3008 +ENDCHAR +STARTCHAR BCD0 +ENCODING 48336 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0210 +C110 +41F0 +7F10 +4110 +4110 +7FF0 +4010 +0050 +0C20 +0840 +1CE0 +2298 +4308 +ENDCHAR +STARTCHAR BCD1 +ENCODING 48337 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 11 15 3 -2 +BITMAP +00C0 +0020 +8420 +87E0 +FC20 +8420 +8420 +87E0 +FD20 +8120 +06C0 +0820 +0820 +0440 +0380 +ENDCHAR +STARTCHAR BCD5 +ENCODING 48341 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0210 +C110 +41F0 +7F10 +4110 +4110 +7FF0 +4010 +0000 +0FE0 +0800 +0FE0 +0800 +0FF8 +ENDCHAR +STARTCHAR BCD8 +ENCODING 48344 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0190 +0890 +0490 +C490 +4790 +7C90 +4490 +4790 +7C90 +4490 +0090 +0090 +0090 +0010 +ENDCHAR +STARTCHAR BCDC +ENCODING 48348 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +0190 +C490 +4490 +7F90 +4490 +4790 +7C90 +4490 +1090 +0890 +0800 +0810 +0FF0 +ENDCHAR +STARTCHAR BCF4 +ENCODING 48372 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 11 1 0 +BITMAP +0030 +1820 +0820 +0FE0 +0820 +0820 +0FE0 +0920 +0100 +0100 +FFFE +ENDCHAR +STARTCHAR BCF5 +ENCODING 48373 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +1830 +0820 +0FE0 +0820 +0FE0 +0920 +0100 +FFFE +0000 +3FE0 +0020 +0020 +0020 +0020 +ENDCHAR +STARTCHAR BCF6 +ENCODING 48374 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -2 +BITMAP +1820 +0820 +0FE0 +0820 +0820 +0FE0 +0920 +FF00 +00FE +0000 +1EF0 +0210 +0210 +0210 +0210 +ENDCHAR +STARTCHAR BCF8 +ENCODING 48376 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 2 -2 +BITMAP +3060 +1040 +1FC0 +1040 +1040 +1FC0 +0200 +0200 +FFFC +0000 +1000 +1000 +1000 +1FE0 +ENDCHAR +STARTCHAR BCFC +ENCODING 48380 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 2 -2 +BITMAP +3040 +1040 +1FC0 +1040 +1FC0 +1240 +03FC +FC0C +0000 +3FC0 +0040 +1FC0 +1000 +1FF0 +ENDCHAR +STARTCHAR BD04 +ENCODING 48388 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -3 +BITMAP +1820 +0820 +0FE0 +0820 +0FE0 +0900 +0100 +FFFE +0000 +1FE0 +0820 +0820 +0840 +0FE0 +0800 +ENDCHAR +STARTCHAR BD05 +ENCODING 48389 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +1030 +0820 +0FE0 +0820 +0FE0 +0920 +0100 +C1FE +3E60 +0820 +0FE0 +0820 +0FE0 +0820 +ENDCHAR +STARTCHAR BD07 +ENCODING 48391 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 2 -2 +BITMAP +3040 +1040 +1FC0 +1040 +1040 +1FC0 +0200 +FFFC +0000 +0200 +0600 +0D80 +1860 +6010 +ENDCHAR +STARTCHAR BD09 +ENCODING 48393 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +1820 +0820 +0FE0 +0820 +0FE0 +0900 +0100 +FFFE +0100 +06C0 +0820 +0820 +0C60 +0380 +ENDCHAR +STARTCHAR BD10 +ENCODING 48400 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -2 +BITMAP +0030 +0110 +6090 +2090 +3F90 +2090 +2090 +3F9E +2410 +0430 +BFD0 +6010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR BD14 +ENCODING 48404 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0040 +0020 +6320 +2120 +3F20 +2220 +3E20 +283C +09E0 +FE20 +0020 +1820 +0800 +0800 +0FF8 +ENDCHAR +STARTCHAR BD24 +ENCODING 48420 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0060 +6320 +2120 +3F20 +2120 +212C +3F30 +2820 +08E0 +FF00 +0C60 +0840 +1CE0 +1390 +6208 +ENDCHAR +STARTCHAR BD2C +ENCODING 48428 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 16 1 -3 +BITMAP +0030 +0098 +0048 +6248 +2248 +3E48 +2248 +2248 +3E78 +2848 +0FC8 +F848 +0048 +0048 +0048 +0008 +ENDCHAR +STARTCHAR BD40 +ENCODING 48448 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 3 -2 +BITMAP +0060 +0320 +8D20 +4520 +7D20 +4520 +79E0 +5320 +1D20 +E080 +0840 +0880 +14E0 +2130 +C210 +ENDCHAR +STARTCHAR BD48 +ENCODING 48456 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0070 +0010 +6110 +2110 +3F10 +2110 +2110 +3F10 +2810 +0810 +0FD0 +F010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR BD49 +ENCODING 48457 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 16 1 -3 +BITMAP +0018 +2188 +1088 +1F88 +1088 +1088 +1F88 +1208 +02F8 +FD08 +1FF0 +0010 +0010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR BD4C +ENCODING 48460 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0020 +0010 +6110 +2110 +3F10 +2110 +3F10 +2810 +08F0 +FF10 +0010 +1810 +0800 +0800 +0FF8 +ENDCHAR +STARTCHAR BD50 +ENCODING 48464 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +4310 +2110 +3F10 +2110 +3F10 +2810 +0B90 +F410 +0000 +1FE0 +0020 +1FE0 +0800 +0FF0 +ENDCHAR +STARTCHAR BD58 +ENCODING 48472 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 16 1 -3 +BITMAP +0018 +20C8 +10C8 +1F88 +1088 +1088 +1F88 +1208 +8EF8 +7108 +07F8 +0208 +0210 +0210 +03F8 +0200 +ENDCHAR +STARTCHAR BD59 +ENCODING 48473 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0030 +4310 +2110 +3F10 +2110 +2110 +3F10 +2410 +05F0 +FE30 +0410 +07F0 +0410 +0410 +07F0 +0410 +ENDCHAR +STARTCHAR BD64 +ENCODING 48484 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 12 2 0 +BITMAP +0020 +3020 +1020 +1FE0 +1020 +1020 +1020 +1FE0 +10C0 +0840 +0840 +FFFC +ENDCHAR +STARTCHAR BD68 +ENCODING 48488 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 2 -2 +BITMAP +30C0 +1040 +1FC0 +1040 +1040 +1FC0 +1880 +0880 +FFFC +2000 +1000 +1000 +1000 +1FE0 +ENDCHAR +STARTCHAR BD80 +ENCODING 48512 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +1820 +0820 +0FE0 +0820 +0FE0 +0800 +0000 +FFFE +0100 +0100 +0100 +0100 +0100 +0100 +ENDCHAR +STARTCHAR BD81 +ENCODING 48513 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +1820 +0820 +0FE0 +0820 +0FE0 +0820 +0004 +FFFE +0100 +01F0 +1E20 +0020 +0020 +0020 +ENDCHAR +STARTCHAR BD84 +ENCODING 48516 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +1820 +0820 +0FE0 +0820 +0FE0 +0800 +0004 +FFFE +0100 +0100 +1900 +0900 +0800 +07F8 +ENDCHAR +STARTCHAR BD87 +ENCODING 48519 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +1820 +0820 +0FE0 +0820 +0FE0 +0820 +0004 +FFFE +0100 +1F20 +08C0 +0800 +0810 +0FF0 +ENDCHAR +STARTCHAR BD88 +ENCODING 48520 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +3820 +0820 +0FE0 +0820 +0FE0 +0804 +FFFE +0100 +1100 +0EE0 +0020 +0FE0 +0800 +0FF0 +ENDCHAR +STARTCHAR BD89 +ENCODING 48521 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -2 +BITMAP +1060 +0820 +0FE0 +0820 +0820 +0FE0 +0804 +FFFE +0100 +0310 +1EF0 +2610 +1810 +1310 +1C10 +ENDCHAR +STARTCHAR BD8A +ENCODING 48522 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 16 1 -3 +BITMAP +1860 +0820 +0FE0 +0820 +0820 +0FE0 +0800 +FFFE +0100 +0100 +3EF8 +0288 +3690 +1890 +1EF0 +0080 +ENDCHAR +STARTCHAR BD90 +ENCODING 48528 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 16 1 -3 +BITMAP +1860 +0820 +0FE0 +0820 +0820 +0FE0 +0800 +FFFE +0100 +0100 +1FE0 +0820 +0820 +0820 +0FE0 +0800 +ENDCHAR +STARTCHAR BD91 +ENCODING 48529 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +1860 +0820 +0FE0 +0820 +0FE0 +0820 +FFFE +0100 +1160 +0820 +0FE0 +0820 +0FE0 +0820 +ENDCHAR +STARTCHAR BD93 +ENCODING 48531 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 16 1 -3 +BITMAP +3060 +0820 +0FE0 +0820 +0820 +0FE0 +0804 +C7FE +7D00 +0100 +0100 +0100 +0300 +06C0 +0830 +3010 +ENDCHAR +STARTCHAR BD95 +ENCODING 48533 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -2 +BITMAP +1860 +0820 +0FE0 +0820 +0820 +0FE0 +0820 +FFFE +0100 +0100 +06C0 +0820 +0820 +0C60 +07C0 +ENDCHAR +STARTCHAR BD99 +ENCODING 48537 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +1820 +0820 +0FE0 +0820 +0FE0 +0824 +FFFE +0100 +1FF0 +0800 +0800 +0FE0 +0800 +0FF0 +ENDCHAR +STARTCHAR BD9A +ENCODING 48538 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -2 +BITMAP +1860 +0820 +0FE0 +0820 +0820 +0FE0 +0820 +FFFE +0100 +0100 +1FF0 +0040 +0440 +0280 +3FF8 +ENDCHAR +STARTCHAR BD9C +ENCODING 48540 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +4110 +2110 +3F10 +2110 +2110 +3F10 +2110 +0710 +F810 +08F0 +0810 +0810 +0810 +0010 +ENDCHAR +STARTCHAR BDA4 +ENCODING 48548 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0020 +0310 +2110 +3F10 +2110 +2110 +3F10 +2390 +FCF0 +0400 +0FF0 +0020 +0FF0 +0400 +07F8 +ENDCHAR +STARTCHAR BDB0 +ENCODING 48560 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 3 -3 +BITMAP +0C60 +4420 +7C20 +4420 +4420 +7C20 +4720 +F820 +11E0 +10A0 +1840 +1840 +18C0 +2530 +4210 +8000 +ENDCHAR +STARTCHAR BDB8 +ENCODING 48568 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0090 +8250 +4250 +7E50 +4250 +4250 +7E50 +4250 +0E50 +79D0 +0850 +0850 +0850 +0010 +ENDCHAR +STARTCHAR BDD4 +ENCODING 48596 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0070 +0210 +E110 +2110 +3F10 +2110 +3F10 +2010 +00D0 +FF10 +0410 +0410 +0410 +0410 +0010 +ENDCHAR +STARTCHAR BDD5 +ENCODING 48597 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0030 +0310 +2110 +3F10 +2110 +3F10 +20F0 +FF10 +0410 +0400 +3FE0 +0020 +0020 +0020 +0020 +0020 +ENDCHAR +STARTCHAR BDD8 +ENCODING 48600 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +6110 +2110 +3F10 +2110 +2110 +3F10 +2070 +FF90 +0410 +0410 +3810 +0800 +0810 +0FF8 +ENDCHAR +STARTCHAR BDDC +ENCODING 48604 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0310 +2110 +3F10 +2110 +3F10 +2030 +FFD0 +0410 +0400 +1FF0 +0010 +1FF0 +0800 +0FF0 +ENDCHAR +STARTCHAR BDE9 +ENCODING 48617 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0310 +2110 +3F10 +2110 +3F10 +2030 +FFD0 +0410 +0480 +0340 +0420 +0420 +0660 +03C0 +ENDCHAR +STARTCHAR BDF0 +ENCODING 48624 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +1820 +0820 +0FE0 +0820 +0FE0 +0800 +000E +FFF0 +0820 +0820 +0820 +0820 +0820 +0820 +ENDCHAR +STARTCHAR BDF4 +ENCODING 48628 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 1 -2 +BITMAP +1820 +0820 +0FE0 +0820 +0FE0 +0800 +FFFC +0440 +0440 +0440 +1840 +0800 +0810 +0FF8 +ENDCHAR +STARTCHAR BDF8 +ENCODING 48632 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 2 -2 +BITMAP +3040 +1040 +1FC0 +1040 +1FC0 +1040 +FFBC +0880 +3FC0 +0040 +3FC0 +1000 +1000 +1FF0 +ENDCHAR +STARTCHAR BE00 +ENCODING 48640 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -2 +BITMAP +1060 +0820 +0FE0 +0820 +0820 +0FE0 +0820 +FFFE +0420 +0020 +1FE0 +0820 +0840 +0FC0 +0800 +ENDCHAR +STARTCHAR BE03 +ENCODING 48643 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -3 +BITMAP +3040 +1040 +1FC0 +1040 +1FC0 +1040 +0008 +FFFC +0840 +0E40 +0600 +0D80 +1840 +2020 +4000 +ENDCHAR +STARTCHAR BE05 +ENCODING 48645 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +3860 +0820 +0FE0 +0820 +0FE0 +0820 +0000 +FFFE +04A0 +07E0 +0420 +0420 +0620 +03C0 +ENDCHAR +STARTCHAR BE0C +ENCODING 48652 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 11 2 1 +BITMAP +0040 +3040 +1040 +1FC0 +1040 +1040 +1040 +1FC0 +1000 +0000 +FFFC +ENDCHAR +STARTCHAR BE0D +ENCODING 48653 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 2 -2 +BITMAP +3040 +1040 +1FC0 +1040 +1FC0 +1040 +0000 +FFFC +0000 +7FC0 +0040 +0040 +0040 +0040 +ENDCHAR +STARTCHAR BE10 +ENCODING 48656 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -2 +BITMAP +0040 +1820 +0820 +0FE0 +0820 +0820 +0FE0 +0800 +FFFE +0000 +0000 +0800 +0800 +0800 +07F0 +ENDCHAR +STARTCHAR BE14 +ENCODING 48660 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 2 -2 +BITMAP +20C0 +1040 +1FC0 +1040 +1FC0 +1000 +0000 +FFFC +0000 +1FC0 +0040 +3FC0 +1000 +1FF0 +ENDCHAR +STARTCHAR BE1C +ENCODING 48668 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 16 2 -3 +BITMAP +30C0 +1040 +1FC0 +1040 +1040 +1FC0 +1040 +01FC +FE00 +0000 +3FC0 +1040 +1040 +1080 +1FC0 +1000 +ENDCHAR +STARTCHAR BE1D +ENCODING 48669 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -3 +BITMAP +1820 +0820 +0FE0 +0820 +0FE0 +0824 +FFFE +2000 +1820 +0820 +0FE0 +0820 +0820 +0FE0 +0820 +ENDCHAR +STARTCHAR BE1F +ENCODING 48671 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +3830 +0810 +0FF0 +0810 +0810 +0FF0 +0810 +FFFE +0300 +0100 +0380 +0660 +0830 +3000 +ENDCHAR +STARTCHAR BE44 +ENCODING 48708 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0070 +0010 +0610 +C210 +4210 +7E10 +4210 +4210 +4210 +7E10 +4210 +0010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR BE45 +ENCODING 48709 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0060 +0410 +C210 +4210 +7E10 +4210 +4210 +7E10 +4010 +0000 +3FE0 +0020 +0020 +0020 +0020 +0020 +ENDCHAR +STARTCHAR BE48 +ENCODING 48712 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0060 +0610 +C210 +4210 +7E10 +4210 +4210 +4210 +7E10 +4210 +0010 +1810 +0800 +0810 +0FF8 +ENDCHAR +STARTCHAR BE4C +ENCODING 48716 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0410 +C310 +4210 +7E10 +4210 +4210 +7E10 +4200 +1FE0 +0020 +1FE0 +0800 +0800 +0FF8 +ENDCHAR +STARTCHAR BE4E +ENCODING 48718 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0070 +0210 +C110 +4110 +7F10 +4110 +4110 +7F10 +4110 +0000 +7C00 +09F0 +7D20 +2120 +3DE0 +0100 +ENDCHAR +STARTCHAR BE54 +ENCODING 48724 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0070 +0410 +C310 +4210 +7E10 +4210 +4210 +7E10 +4210 +0000 +1FF0 +0830 +0820 +0820 +0FF0 +0800 +ENDCHAR +STARTCHAR BE55 +ENCODING 48725 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0070 +0410 +C310 +4210 +7E10 +4210 +4210 +7E10 +4240 +1830 +0820 +0FE0 +0820 +0820 +0FE0 +0820 +ENDCHAR +STARTCHAR BE57 +ENCODING 48727 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0610 +C310 +4210 +7E10 +4210 +4210 +7E10 +4210 +0110 +0180 +0180 +0240 +0C30 +1010 +ENDCHAR +STARTCHAR BE59 +ENCODING 48729 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0070 +0410 +C310 +4210 +7E10 +4210 +4210 +7E10 +4210 +0080 +0740 +0420 +0420 +0660 +03C0 +ENDCHAR +STARTCHAR BE5A +ENCODING 48730 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0210 +C110 +4110 +7F10 +4110 +4110 +7F10 +4110 +3FF0 +0100 +0380 +0660 +0830 +3000 +ENDCHAR +STARTCHAR BE5B +ENCODING 48731 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0030 +0410 +C310 +4210 +7E10 +4210 +4210 +7E10 +4200 +0380 +3FF0 +0100 +0280 +0470 +1810 +2000 +ENDCHAR +STARTCHAR BE60 +ENCODING 48736 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0060 +0020 +0020 +D4A0 +54A0 +54A0 +77A0 +54AC +54B0 +54A0 +77A0 +54A0 +0020 +0020 +0020 +ENDCHAR +STARTCHAR BE61 +ENCODING 48737 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 16 3 -3 +BITMAP +00C0 +0240 +4940 +A940 +AF40 +E958 +A960 +AF40 +E840 +0000 +7FC0 +0040 +0040 +0040 +0040 +0040 +ENDCHAR +STARTCHAR BE64 +ENCODING 48740 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 3 -2 +BITMAP +00C0 +0040 +7140 +A940 +A940 +EF40 +A958 +A960 +EF40 +A940 +0040 +3000 +1000 +1000 +1FE0 +ENDCHAR +STARTCHAR BE68 +ENCODING 48744 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 3 -2 +BITMAP +00C0 +0240 +A540 +A540 +E740 +A558 +A560 +E740 +A500 +3FE0 +0040 +3FE0 +1000 +1000 +1FE0 +ENDCHAR +STARTCHAR BE6A +ENCODING 48746 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 3 -3 +BITMAP +00C0 +0440 +AB40 +A940 +EF40 +A940 +A970 +EF40 +A840 +0000 +F7C0 +1480 +9480 +6480 +5F80 +2400 +ENDCHAR +STARTCHAR BE70 +ENCODING 48752 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 16 2 -3 +BITMAP +0060 +01A0 +D4A0 +54A0 +77A0 +54A4 +54B8 +77A0 +54A0 +0000 +1FE0 +0840 +0840 +0840 +0FE0 +0800 +ENDCHAR +STARTCHAR BE71 +ENCODING 48753 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 16 3 -3 +BITMAP +00C0 +0340 +A940 +A940 +EF40 +A958 +A960 +EF40 +A900 +3040 +1040 +1FC0 +1040 +1040 +1FC0 +1040 +ENDCHAR +STARTCHAR BE73 +ENCODING 48755 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0060 +0020 +0120 +D2A0 +52A0 +73A0 +52BC +52A0 +73A0 +53A0 +0080 +0180 +0260 +0410 +1800 +ENDCHAR +STARTCHAR BE74 +ENCODING 48756 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0060 +01A0 +52A0 +52A0 +73A0 +52AC +52B0 +73A0 +52A0 +1840 +0C40 +0840 +16A0 +2310 +C000 +ENDCHAR +STARTCHAR BE75 +ENCODING 48757 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0060 +01A0 +02A0 +D2A0 +53A0 +72A4 +52B8 +52A0 +73A0 +5280 +03C0 +0460 +0420 +0660 +03C0 +ENDCHAR +STARTCHAR BE7B +ENCODING 48763 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 3 -2 +BITMAP +0180 +02C0 +9540 +9540 +F740 +9540 +9558 +F760 +9540 +07C0 +3FF0 +0700 +0880 +0880 +0700 +ENDCHAR +STARTCHAR BE7C +ENCODING 48764 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0060 +0090 +0050 +3950 +9950 +9950 +FF50 +9950 +9970 +9F50 +F950 +9050 +0050 +0050 +0010 +ENDCHAR +STARTCHAR BE7D +ENCODING 48765 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 11 16 3 -3 +BITMAP +0040 +01A0 +46A0 +AAA0 +AAA0 +EEA0 +AAE0 +AAA0 +EEA0 +AA00 +3FE0 +1020 +0020 +0020 +0020 +0020 +ENDCHAR +STARTCHAR BE80 +ENCODING 48768 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 3 -2 +BITMAP +0060 +01A0 +04A0 +AAA0 +AAA0 +EEA0 +AAE0 +AAA0 +EEA0 +AAA0 +20A0 +1000 +1000 +1000 +0FF0 +ENDCHAR +STARTCHAR BE84 +ENCODING 48772 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0020 +0090 +0050 +D550 +5550 +7750 +5570 +5750 +7050 +0000 +0FF0 +0010 +0FF0 +0410 +07F8 +ENDCHAR +STARTCHAR BE8C +ENCODING 48780 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0020 +0090 +0250 +D550 +5550 +7750 +5570 +5550 +7750 +0000 +0FF0 +0410 +0420 +0420 +07F0 +0400 +ENDCHAR +STARTCHAR BE8D +ENCODING 48781 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 11 16 3 -3 +BITMAP +0040 +01A0 +0AA0 +AAA0 +AEA0 +EAA0 +AAE0 +EEA0 +88A0 +1860 +0820 +0FE0 +0820 +0820 +0FE0 +0820 +ENDCHAR +STARTCHAR BE8F +ENCODING 48783 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0020 +00D0 +0350 +D550 +5550 +7750 +5570 +5550 +7750 +0190 +0080 +0140 +0230 +0418 +1800 +ENDCHAR +STARTCHAR BE90 +ENCODING 48784 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0020 +00D0 +0350 +D550 +5550 +7750 +5570 +5550 +7750 +0420 +0420 +0C20 +0A50 +1088 +2108 +ENDCHAR +STARTCHAR BE91 +ENCODING 48785 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0020 +0090 +0350 +D550 +5550 +7750 +5570 +5550 +7750 +0050 +01A0 +0210 +0210 +0330 +01E0 +ENDCHAR +STARTCHAR BE98 +ENCODING 48792 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 16 2 -3 +BITMAP +00C0 +0020 +0020 +94A0 +54A0 +54A4 +77B8 +54A0 +54A0 +54A0 +77AC +5030 +0020 +0020 +0020 +0020 +ENDCHAR +STARTCHAR BE99 +ENCODING 48793 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 3 -2 +BITMAP +00C0 +0240 +0940 +A940 +AF78 +E940 +A940 +EF70 +A840 +0000 +7FC0 +0040 +0040 +0040 +0040 +ENDCHAR +STARTCHAR BEA8 +ENCODING 48808 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 16 2 -3 +BITMAP +0060 +0120 +D4A0 +54AC +77B0 +54A0 +54A0 +77BC +5420 +0000 +1FE0 +0820 +0840 +0840 +0FE0 +0800 +ENDCHAR +STARTCHAR BED0 +ENCODING 48848 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0060 +0010 +BC90 +5490 +5490 +7790 +54F0 +5490 +5490 +7790 +5410 +0010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR BED1 +ENCODING 48849 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 11 16 3 -3 +BITMAP +0060 +4B20 +B520 +A520 +E720 +A5E0 +A520 +E720 +A520 +0020 +7FC0 +0040 +0040 +0040 +0040 +0040 +ENDCHAR +STARTCHAR BED4 +ENCODING 48852 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0020 +2190 +D490 +5490 +7790 +5490 +54F0 +5490 +7790 +5410 +1010 +0810 +0810 +0800 +0FF8 +ENDCHAR +STARTCHAR BED7 +ENCODING 48855 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 3 -2 +BITMAP +00E0 +0320 +4520 +A520 +A720 +E5E0 +A520 +A720 +E520 +A020 +1FE0 +0800 +0800 +0800 +0FF0 +ENDCHAR +STARTCHAR BED8 +ENCODING 48856 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 3 -2 +BITMAP +0060 +0220 +A520 +A520 +E720 +A5E0 +A520 +E720 +A520 +3FC0 +0040 +0040 +1FC0 +1000 +1FF0 +ENDCHAR +STARTCHAR BEE0 +ENCODING 48864 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0070 +0110 +0290 +CA90 +4B90 +7AF0 +4A90 +7B90 +4A90 +0010 +0FF0 +0410 +0420 +0420 +07F0 +0400 +ENDCHAR +STARTCHAR BEE3 +ENCODING 48867 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0590 +CA90 +4A90 +7B90 +4AF0 +4A90 +4B90 +7A90 +4910 +0090 +0180 +0340 +0430 +1808 +ENDCHAR +STARTCHAR BEE4 +ENCODING 48868 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 3 -2 +BITMAP +0060 +0320 +A920 +A920 +EF20 +A9E0 +A920 +EF20 +A820 +00C0 +0840 +1840 +14C0 +2330 +4210 +ENDCHAR +STARTCHAR BEE5 +ENCODING 48869 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 11 15 3 -2 +BITMAP +00E0 +0220 +9520 +9520 +F720 +95E0 +9520 +F720 +9520 +0120 +06C0 +0820 +0820 +0C60 +07C0 +ENDCHAR +STARTCHAR BEEC +ENCODING 48876 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0090 +0050 +1B50 +D950 +5950 +7F50 +59D0 +5950 +5F50 +7950 +0050 +0050 +0010 +0010 +ENDCHAR +STARTCHAR BF01 +ENCODING 48897 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 11 15 3 -2 +BITMAP +0060 +0120 +06A0 +AAA0 +AAA0 +EFA0 +AAA0 +AAA0 +EEA0 +0120 +06C0 +0820 +0820 +0C60 +07C0 +ENDCHAR +STARTCHAR BF08 +ENCODING 48904 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +D490 +5490 +54F0 +7790 +5490 +5490 +54F0 +7790 +5410 +0010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR BF09 +ENCODING 48905 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0020 +0190 +CA90 +4AF0 +7B90 +4A90 +4AF0 +7BD0 +4A10 +0000 +1FF0 +0010 +0010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR BF18 +ENCODING 48920 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0110 +CA90 +4AF0 +7B90 +4A90 +4AF0 +7B90 +4A10 +0000 +07F0 +0410 +0420 +07F0 +0400 +ENDCHAR +STARTCHAR BF19 +ENCODING 48921 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0030 +0190 +DA90 +52F0 +7390 +5290 +52F0 +7390 +5210 +0C60 +0420 +07E0 +0420 +0420 +07E0 +0420 +ENDCHAR +STARTCHAR BF1B +ENCODING 48923 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 3 -2 +BITMAP +0060 +0820 +9520 +9520 +F7E0 +9520 +9520 +F7E0 +8420 +0220 +0120 +0300 +0480 +0860 +3010 +ENDCHAR +STARTCHAR BF1C +ENCODING 48924 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 3 -2 +BITMAP +0060 +0020 +A520 +A520 +E7E0 +A520 +A5E0 +E720 +A400 +1060 +0C20 +0840 +16E0 +2290 +4108 +ENDCHAR +STARTCHAR BF1D +ENCODING 48925 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 11 15 3 -2 +BITMAP +0060 +0220 +6520 +A5E0 +A720 +E520 +A5E0 +E520 +A740 +0500 +07C0 +0840 +0840 +0CC0 +0780 +ENDCHAR +STARTCHAR BF40 +ENCODING 48960 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 12 1 0 +BITMAP +0198 +0C88 +2488 +24F8 +3C88 +2488 +2488 +3CF8 +2588 +0100 +0100 +FFFE +ENDCHAR +STARTCHAR BF41 +ENCODING 48961 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 2 -2 +BITMAP +C510 +4510 +7DF0 +4510 +7DF0 +4710 +010C +FFFC +0000 +3FE0 +0020 +0020 +0020 +0020 +ENDCHAR +STARTCHAR BF44 +ENCODING 48964 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +6688 +2688 +3CF8 +2488 +3CF8 +2788 +0100 +FFFE +0000 +0000 +0800 +0800 +0800 +07F0 +ENDCHAR +STARTCHAR BF48 +ENCODING 48968 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 2 -2 +BITMAP +8490 +4490 +7CF0 +4490 +7CF0 +4790 +0100 +FFFC +0000 +7FC0 +0040 +3FC0 +1000 +1FF0 +ENDCHAR +STARTCHAR BF50 +ENCODING 48976 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -3 +BITMAP +6248 +2248 +3E78 +2248 +3E78 +2148 +0100 +FFFE +0000 +1FE0 +0820 +0820 +0840 +0FE0 +0800 +ENDCHAR +STARTCHAR BF51 +ENCODING 48977 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -3 +BITMAP +6488 +2488 +3CF8 +2488 +2488 +3FF8 +2180 +FFFE +1860 +0820 +0FE0 +0820 +0820 +0FE0 +0820 +ENDCHAR +STARTCHAR BF55 +ENCODING 48981 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +4588 +2488 +3CF8 +2488 +2488 +3CF8 +2780 +01FE +FF00 +03C0 +0420 +0420 +0460 +03C0 +ENDCHAR +STARTCHAR BF94 +ENCODING 49044 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0030 +0590 +0290 +4A90 +4B90 +7A90 +4B90 +7A90 +4890 +0870 +0FD0 +F810 +0010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR BFB0 +ENCODING 49072 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 12 1 0 +BITMAP +04C8 +2248 +2248 +3E78 +2248 +2248 +2248 +3E78 +2C60 +0420 +0440 +FFFE +ENDCHAR +STARTCHAR BFC5 +ENCODING 49093 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 14 2 -2 +BITMAP +C510 +4510 +7DF0 +4510 +7DF0 +4510 +0180 +F880 +07F8 +0700 +18C0 +1040 +18C0 +0F80 +ENDCHAR +STARTCHAR BFCC +ENCODING 49100 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 16 1 -3 +BITMAP +0010 +6488 +2488 +3CF8 +2488 +2488 +3CF8 +2088 +FFFE +0100 +0100 +0100 +0100 +0100 +0100 +0100 +ENDCHAR +STARTCHAR BFCD +ENCODING 49101 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -2 +BITMAP +0198 +3688 +12F8 +1E88 +1288 +1EF8 +128C +FFFE +0100 +0100 +1FF0 +0020 +0020 +0020 +0020 +ENDCHAR +STARTCHAR BFD0 +ENCODING 49104 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +6688 +2288 +3EF8 +2288 +2288 +3EF8 +228C +FFFE +0100 +0100 +1900 +0900 +0800 +0FF8 +ENDCHAR +STARTCHAR BFD4 +ENCODING 49108 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +6490 +2490 +3CF0 +2490 +3CF0 +2484 +FFFE +0100 +0100 +1FE0 +0020 +1FE0 +0800 +0FF0 +ENDCHAR +STARTCHAR BFDC +ENCODING 49116 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -3 +BITMAP +6448 +2448 +3C78 +2448 +3C78 +2448 +0000 +FFFE +0100 +0100 +1EE0 +0820 +0840 +0FE0 +0800 +ENDCHAR +STARTCHAR BFDF +ENCODING 49119 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 2 -2 +BITMAP +6490 +2490 +3CF0 +2490 +3CF0 +2490 +FFFC +0200 +0200 +0200 +0200 +0580 +1860 +2030 +ENDCHAR +STARTCHAR BFE1 +ENCODING 49121 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +3648 +1248 +1E78 +1248 +1E78 +1248 +0000 +FFFE +0100 +0380 +0C60 +0820 +0C60 +07C0 +ENDCHAR +STARTCHAR C03C +ENCODING 49212 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -2 +BITMAP +0010 +6248 +2248 +3E78 +2248 +2248 +3E78 +2248 +FFFE +0420 +0420 +0420 +0420 +0420 +0420 +ENDCHAR +STARTCHAR C051 +ENCODING 49233 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 2 -2 +BITMAP +6490 +2490 +3CF0 +2490 +3CD0 +2CF0 +3490 +CF6C +0940 +07C0 +0840 +0840 +0CC0 +0780 +ENDCHAR +STARTCHAR C058 +ENCODING 49240 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 11 1 1 +BITMAP +0188 +0688 +1288 +12F8 +1E88 +1288 +1288 +1EF8 +1288 +0000 +FFFE +ENDCHAR +STARTCHAR C05C +ENCODING 49244 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0030 +C490 +4490 +7CF0 +4490 +4490 +7CF0 +4480 +03FC +FF00 +0000 +3000 +1000 +1000 +1FF0 +ENDCHAR +STARTCHAR C060 +ENCODING 49248 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -2 +BITMAP +0188 +2688 +12F8 +1E88 +1288 +1EF8 +1288 +FFFE +0000 +1FE0 +0020 +0020 +1FE0 +0800 +0FF8 +ENDCHAR +STARTCHAR C068 +ENCODING 49256 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0020 +6510 +2510 +3DF0 +2510 +25F0 +3D10 +2400 +FFFC +0000 +3FC0 +1040 +1080 +1FC0 +1000 +ENDCHAR +STARTCHAR C069 +ENCODING 49257 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +3288 +1288 +1EF8 +1288 +12F8 +1E80 +1200 +FFFE +0C60 +0420 +07E0 +0420 +07E0 +0420 +ENDCHAR +STARTCHAR C090 +ENCODING 49296 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +0290 +D290 +5290 +5390 +7290 +5290 +5290 +7390 +5290 +0010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR C091 +ENCODING 49297 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0030 +0110 +0290 +CA90 +4B90 +7A90 +4A90 +7B90 +4A10 +0000 +3FE0 +0020 +0020 +0020 +0020 +0020 +ENDCHAR +STARTCHAR C094 +ENCODING 49300 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 3 -2 +BITMAP +0060 +0020 +2920 +9520 +9520 +F720 +9520 +9520 +F720 +9520 +0020 +0820 +0800 +0800 +0FF8 +ENDCHAR +STARTCHAR C098 +ENCODING 49304 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 11 15 3 -2 +BITMAP +0060 +0220 +9520 +9520 +F720 +9520 +9520 +F720 +9500 +3FC0 +0040 +3FC0 +1000 +1000 +1FE0 +ENDCHAR +STARTCHAR C0A0 +ENCODING 49312 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0030 +0010 +CA90 +4A90 +7B90 +4A90 +4A90 +7B90 +4A90 +0000 +0FF0 +0410 +0410 +0420 +07F0 +0400 +ENDCHAR +STARTCHAR C0A1 +ENCODING 49313 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0030 +0110 +CA90 +4A90 +7B90 +4A90 +4A90 +7B90 +4280 +0C30 +0420 +07E0 +0420 +0420 +07E0 +0420 +ENDCHAR +STARTCHAR C0A3 +ENCODING 49315 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 3 -2 +BITMAP +0060 +0020 +0220 +D520 +5520 +7720 +5520 +5520 +7720 +5620 +0120 +0300 +02C0 +0C20 +1010 +ENDCHAR +STARTCHAR C0A5 +ENCODING 49317 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 11 15 3 -2 +BITMAP +00E0 +0320 +0520 +9520 +9720 +F520 +9520 +9520 +F720 +8500 +0780 +0840 +0840 +0C40 +0780 +ENDCHAR +STARTCHAR C0AC +ENCODING 49324 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -2 +BITMAP +0030 +0010 +0810 +0410 +0410 +0810 +1C10 +121E +2310 +4110 +8010 +0010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR C0AD +ENCODING 49325 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 16 2 -3 +BITMAP +0060 +0020 +1820 +0820 +1020 +382C +4630 +8320 +0020 +0000 +3FE0 +1020 +0020 +0020 +0020 +0020 +ENDCHAR +STARTCHAR C0AF +ENCODING 49327 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0060 +1020 +0820 +1820 +1820 +242C +4230 +8020 +0080 +F860 +0840 +0860 +0890 +0918 +0A08 +ENDCHAR +STARTCHAR C0B0 +ENCODING 49328 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -2 +BITMAP +0030 +0010 +0410 +0410 +0C10 +0C10 +131E +2090 +C010 +0010 +1C10 +0400 +0400 +0400 +07F8 +ENDCHAR +STARTCHAR C0B3 +ENCODING 49331 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -2 +BITMAP +0030 +0010 +0C10 +0410 +0C10 +0C1E +1310 +2090 +C010 +0000 +0FF0 +0400 +0400 +0408 +03FC +ENDCHAR +STARTCHAR C0B4 +ENCODING 49332 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0060 +0020 +0820 +0820 +1820 +343C +4320 +8120 +0000 +1FE0 +0020 +1FE0 +0800 +0800 +0FF0 +ENDCHAR +STARTCHAR C0B5 +ENCODING 49333 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0060 +0020 +0820 +0820 +1820 +243C +4320 +8120 +0000 +3DE0 +0420 +7E20 +2020 +2620 +3820 +ENDCHAR +STARTCHAR C0B6 +ENCODING 49334 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0060 +1020 +0C20 +0820 +1820 +263C +4120 +8020 +0000 +3DF0 +0520 +6D20 +3120 +21F0 +3F00 +ENDCHAR +STARTCHAR C0BC +ENCODING 49340 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 16 2 -3 +BITMAP +0060 +0020 +0820 +0820 +1820 +142C +2330 +C120 +0020 +1FE0 +0820 +0840 +0840 +0840 +0FE0 +0800 +ENDCHAR +STARTCHAR C0BD +ENCODING 49341 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0040 +0020 +0820 +0820 +1020 +283C +4620 +8320 +0000 +1820 +0820 +0FE0 +0820 +0FE0 +0820 +ENDCHAR +STARTCHAR C0BF +ENCODING 49343 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0060 +0020 +1820 +0820 +1020 +3824 +2638 +4220 +8020 +01A0 +0080 +0180 +0240 +0430 +1808 +ENDCHAR +STARTCHAR C0C0 +ENCODING 49344 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0060 +0020 +1820 +0820 +1020 +3C3C +6220 +8120 +0000 +0C60 +0840 +0C40 +16B0 +2318 +C008 +ENDCHAR +STARTCHAR C0C1 +ENCODING 49345 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -2 +BITMAP +0030 +0010 +0410 +0410 +0C10 +0C16 +1318 +2090 +C010 +0050 +01A0 +0210 +0210 +0330 +01E0 +ENDCHAR +STARTCHAR C0C5 +ENCODING 49349 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0060 +1020 +0C20 +0820 +1820 +343C +6320 +8120 +0000 +0FE0 +0820 +0FE0 +0800 +0800 +0FF0 +ENDCHAR +STARTCHAR C0C8 +ENCODING 49352 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0030 +0010 +0190 +1090 +1890 +1090 +3090 +2890 +4CF0 +8490 +0090 +0090 +0090 +0090 +0090 +0010 +ENDCHAR +STARTCHAR C0C9 +ENCODING 49353 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0020 +0110 +1090 +0890 +1890 +1090 +2CF0 +4690 +8290 +0090 +1FF0 +0810 +0010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR C0CC +ENCODING 49356 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 1 -2 +BITMAP +0018 +0088 +0048 +0448 +0448 +0848 +1C48 +1278 +6248 +8048 +0048 +0C48 +0400 +0400 +07FC +ENDCHAR +STARTCHAR C0D0 +ENCODING 49360 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0020 +0110 +1090 +0890 +1090 +1090 +2CF0 +4490 +8090 +1FF0 +0020 +1FF0 +0800 +0800 +0FF0 +ENDCHAR +STARTCHAR C0D8 +ENCODING 49368 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0020 +0110 +0090 +0890 +0890 +1090 +28F0 +4490 +8290 +0090 +0FF0 +0410 +0420 +0420 +07F0 +0400 +ENDCHAR +STARTCHAR C0D9 +ENCODING 49369 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0020 +0110 +1890 +0890 +1090 +1090 +2CF0 +4690 +8090 +0C10 +0410 +07F0 +0410 +0410 +07F0 +0410 +ENDCHAR +STARTCHAR C0DB +ENCODING 49371 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 16 2 -3 +BITMAP +0030 +0190 +0090 +0890 +1890 +1090 +28F0 +4690 +8290 +0110 +0080 +0180 +0360 +0410 +0808 +1000 +ENDCHAR +STARTCHAR C0DC +ENCODING 49372 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 16 2 -3 +BITMAP +0030 +0190 +0890 +0890 +1090 +2890 +44F0 +8290 +0090 +0090 +0C20 +0460 +0C60 +1290 +2108 +4000 +ENDCHAR +STARTCHAR C0DD +ENCODING 49373 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0110 +1090 +0890 +0890 +1090 +28F0 +4490 +8290 +0090 +0360 +0410 +0410 +0630 +03E0 +ENDCHAR +STARTCHAR C0E4 +ENCODING 49380 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +00E0 +0020 +1020 +0C20 +0820 +183C +1820 +2420 +4220 +812C +0030 +0020 +0020 +0020 +0020 +ENDCHAR +STARTCHAR C0E5 +ENCODING 49381 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0060 +0020 +0820 +0824 +1838 +3820 +4620 +833C +0020 +3FE0 +0020 +0020 +0020 +0020 +0020 +ENDCHAR +STARTCHAR C0E8 +ENCODING 49384 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0060 +0020 +1820 +0C20 +083C +1820 +2420 +4320 +812C +0030 +3020 +0820 +0800 +0810 +0FF0 +ENDCHAR +STARTCHAR C0EC +ENCODING 49388 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -2 +BITMAP +0030 +0010 +0410 +0410 +0C1E +1A10 +1110 +609E +8010 +0FF0 +0010 +0FF0 +0400 +0400 +07F8 +ENDCHAR +STARTCHAR C0F4 +ENCODING 49396 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 16 2 -3 +BITMAP +0060 +0020 +1820 +0C24 +0838 +1820 +2620 +413C +8020 +0000 +1FE0 +0820 +0820 +0840 +0FE0 +0800 +ENDCHAR +STARTCHAR C0F5 +ENCODING 49397 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0060 +0020 +0820 +082C +1030 +2C20 +423C +8120 +0000 +1820 +0820 +0FE0 +0820 +0FE0 +0820 +ENDCHAR +STARTCHAR C0F7 +ENCODING 49399 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0060 +0020 +1820 +082C +1030 +3820 +2620 +423C +8020 +01A0 +0180 +0180 +0260 +0410 +1808 +ENDCHAR +STARTCHAR C0F9 +ENCODING 49401 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0060 +0020 +0C20 +0820 +083C +1820 +2620 +4224 +8038 +00A0 +0340 +0420 +0420 +0660 +03C0 +ENDCHAR +STARTCHAR C100 +ENCODING 49408 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 1 -2 +BITMAP +0018 +00C8 +0048 +1848 +0C48 +0878 +1848 +1848 +2648 +4278 +8048 +0048 +0048 +0048 +0008 +ENDCHAR +STARTCHAR C104 +ENCODING 49412 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 1 -2 +BITMAP +0018 +00C8 +0448 +0448 +0878 +1448 +1248 +6378 +8048 +0048 +0C48 +0400 +0400 +07FC +ENDCHAR +STARTCHAR C108 +ENCODING 49416 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0190 +1090 +0890 +18F0 +1090 +28F0 +4490 +8080 +1FE0 +0020 +1FE0 +0800 +0800 +0FF0 +ENDCHAR +STARTCHAR C110 +ENCODING 49424 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0060 +0110 +0090 +1890 +08F0 +1090 +2890 +44F0 +8490 +0090 +0FF0 +0410 +0420 +0420 +07F0 +0400 +ENDCHAR +STARTCHAR C115 +ENCODING 49429 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0110 +1090 +0890 +10F0 +1090 +2890 +44F0 +8090 +0090 +0340 +0420 +0420 +0660 +03C0 +ENDCHAR +STARTCHAR C11C +ENCODING 49436 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +1010 +0810 +0810 +1010 +30F0 +2810 +4610 +8210 +0010 +0010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR C11D +ENCODING 49437 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 1 -2 +BITMAP +0038 +0808 +0408 +0408 +08F8 +1408 +2308 +4108 +8008 +1FF0 +0810 +0010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR C11E +ENCODING 49438 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +1010 +0C10 +0810 +18F0 +1410 +2210 +C210 +0000 +7DF0 +0410 +0410 +0410 +0410 +0410 +ENDCHAR +STARTCHAR C11F +ENCODING 49439 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 14 2 -2 +BITMAP +0030 +0810 +0810 +0810 +1010 +2CF0 +4610 +8210 +00D0 +3C60 +0440 +04A0 +0498 +0508 +ENDCHAR +STARTCHAR C120 +ENCODING 49440 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0010 +0810 +0C10 +0810 +18F0 +2410 +4210 +8110 +0010 +0010 +1800 +0800 +0800 +0FF8 +ENDCHAR +STARTCHAR C123 +ENCODING 49443 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +0C10 +0C10 +0830 +18D0 +2410 +4210 +8010 +0020 +1FE0 +0800 +0800 +0800 +0FF0 +ENDCHAR +STARTCHAR C124 +ENCODING 49444 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 1 -2 +BITMAP +0018 +0008 +0408 +0408 +08F8 +1C08 +3308 +4108 +8000 +0FF0 +0010 +0FF0 +0400 +0400 +07F8 +ENDCHAR +STARTCHAR C126 +ENCODING 49446 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0070 +0010 +0810 +0810 +1810 +18F0 +2410 +4610 +8210 +0000 +7DF0 +0520 +7D20 +2120 +3DE0 +0100 +ENDCHAR +STARTCHAR C127 +ENCODING 49447 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 16 1 -3 +BITMAP +0018 +0008 +0608 +0408 +0CF8 +0C08 +1308 +2108 +C000 +1F48 +0148 +0178 +0E48 +08C8 +0F78 +0048 +ENDCHAR +STARTCHAR C12C +ENCODING 49452 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 16 1 -3 +BITMAP +0038 +0008 +0608 +0408 +04F8 +0A08 +1108 +6088 +8008 +0000 +0FF0 +0410 +0410 +0420 +07F0 +0400 +ENDCHAR +STARTCHAR C12D +ENCODING 49453 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0030 +0010 +0C10 +0810 +09F0 +1810 +2410 +4210 +8000 +1C30 +0410 +07F0 +0410 +0410 +07F0 +0410 +ENDCHAR +STARTCHAR C12F +ENCODING 49455 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 1 -2 +BITMAP +0018 +0008 +0608 +0408 +0CF8 +0C08 +1308 +2108 +C008 +00C8 +0040 +00C0 +0130 +0208 +0C04 +ENDCHAR +STARTCHAR C130 +ENCODING 49456 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +1010 +0810 +0810 +19F0 +3410 +6610 +8210 +0000 +0820 +0420 +0C60 +1250 +2088 +4100 +ENDCHAR +STARTCHAR C131 +ENCODING 49457 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +0810 +0C10 +09F0 +1810 +2410 +4210 +8010 +0080 +0360 +0410 +0410 +0630 +01E0 +ENDCHAR +STARTCHAR C136 +ENCODING 49462 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 1 -2 +BITMAP +0018 +0008 +0608 +0408 +0CF8 +0A08 +1108 +6188 +8000 +0FF8 +0040 +0220 +0220 +0040 +1FFC +ENDCHAR +STARTCHAR C138 +ENCODING 49464 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 1 -2 +BITMAP +0018 +0088 +0048 +0848 +0C48 +0848 +1BC8 +1848 +2448 +4248 +8048 +0048 +0048 +0048 +0008 +ENDCHAR +STARTCHAR C139 +ENCODING 49465 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0030 +0110 +0090 +0890 +1890 +1390 +2890 +4490 +8490 +0000 +1FF0 +0010 +0010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR C13C +ENCODING 49468 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0110 +0090 +0890 +0890 +1090 +2B90 +4490 +8490 +0090 +0090 +0890 +0800 +0800 +0FF8 +ENDCHAR +STARTCHAR C140 +ENCODING 49472 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0110 +0090 +0890 +0890 +1790 +2890 +4490 +8480 +0FF0 +0010 +0010 +0FF0 +0400 +07F8 +ENDCHAR +STARTCHAR C148 +ENCODING 49480 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0110 +0090 +0890 +1890 +1790 +2890 +4490 +8090 +0000 +07F0 +0420 +0420 +07F0 +0400 +ENDCHAR +STARTCHAR C149 +ENCODING 49481 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0190 +1090 +0890 +1890 +1790 +2890 +4490 +8480 +0C10 +0410 +07F0 +0410 +07F0 +0410 +ENDCHAR +STARTCHAR C14B +ENCODING 49483 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0110 +0090 +1890 +1890 +1090 +3390 +4890 +8490 +0210 +0180 +0180 +0240 +0430 +1810 +ENDCHAR +STARTCHAR C14C +ENCODING 49484 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -2 +BITMAP +0018 +00C8 +1848 +0448 +0848 +1BC8 +1448 +2248 +C248 +0430 +0210 +0210 +0528 +08C4 +1086 +ENDCHAR +STARTCHAR C14D +ENCODING 49485 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0190 +1090 +0890 +1090 +1390 +2C90 +4490 +8090 +0090 +0360 +0410 +0410 +0630 +03E0 +ENDCHAR +STARTCHAR C154 +ENCODING 49492 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0070 +0010 +1010 +0810 +09F0 +1010 +1810 +2430 +44D0 +8210 +0010 +0010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR C155 +ENCODING 49493 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 1 -2 +BITMAP +0018 +0808 +0408 +0478 +0C08 +1C08 +13F8 +6108 +8008 +0FF8 +0008 +0008 +0008 +0008 +0008 +ENDCHAR +STARTCHAR C158 +ENCODING 49496 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0070 +0010 +0810 +09F0 +1810 +1010 +2810 +46F0 +8210 +0010 +1C10 +0400 +0400 +0400 +07FC +ENDCHAR +STARTCHAR C15C +ENCODING 49500 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0070 +1010 +0810 +09F0 +1010 +2C10 +4610 +82F0 +0010 +1FE0 +0020 +1FE0 +0800 +0800 +0FF8 +ENDCHAR +STARTCHAR C164 +ENCODING 49508 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 1 -2 +BITMAP +0038 +0008 +0408 +0478 +0808 +1408 +2308 +4178 +8008 +0000 +03F8 +0208 +0208 +03F8 +0200 +ENDCHAR +STARTCHAR C165 +ENCODING 49509 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0030 +0010 +0C10 +0C10 +08F0 +1810 +2410 +46F0 +8210 +0C20 +0420 +07E0 +0420 +0420 +07E0 +0420 +ENDCHAR +STARTCHAR C167 +ENCODING 49511 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 1 -2 +BITMAP +0018 +0008 +0408 +0478 +0808 +1C08 +13F8 +2108 +C008 +0088 +0080 +01C0 +0330 +0408 +1804 +ENDCHAR +STARTCHAR C168 +ENCODING 49512 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 1 -2 +BITMAP +0038 +0C08 +0608 +04F8 +0C08 +1C08 +32F8 +4108 +8008 +0410 +0610 +0630 +0928 +1144 +2084 +ENDCHAR +STARTCHAR C169 +ENCODING 49513 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 1 -2 +BITMAP +0018 +0008 +0608 +04F8 +0C08 +0C08 +12F8 +2108 +C008 +0040 +01B0 +0208 +0208 +0318 +01F0 +ENDCHAR +STARTCHAR C170 +ENCODING 49520 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 1 -2 +BITMAP +0018 +0008 +00C8 +1848 +0C48 +0BC8 +0848 +1848 +2448 +47C8 +8248 +0048 +0048 +0048 +0008 +ENDCHAR +STARTCHAR C174 +ENCODING 49524 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0010 +0190 +0890 +0F90 +1090 +1890 +2F90 +4490 +8090 +0090 +0890 +0800 +0800 +0FF8 +ENDCHAR +STARTCHAR C178 +ENCODING 49528 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +0190 +1890 +0890 +1390 +3890 +4F90 +8480 +1FE0 +0020 +1FE0 +0800 +0800 +0FF0 +ENDCHAR +STARTCHAR C185 +ENCODING 49541 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0110 +2090 +1890 +1790 +3090 +2890 +4F90 +8490 +0090 +0360 +0410 +0410 +0630 +03E0 +ENDCHAR +STARTCHAR C18C +ENCODING 49548 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 12 1 0 +BITMAP +0300 +0180 +0300 +0300 +04E0 +1818 +2004 +0200 +0100 +0100 +0100 +FFFE +ENDCHAR +STARTCHAR C18D +ENCODING 49549 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -2 +BITMAP +0300 +0180 +0300 +04F0 +180C +2300 +0100 +0100 +FFFE +0000 +3FE0 +0020 +0020 +0020 +0020 +ENDCHAR +STARTCHAR C18E +ENCODING 49550 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0400 +0300 +0200 +0580 +1878 +6200 +0200 +FFFC +0000 +0000 FBE0 -2080 -2080 -2080 -2080 -3F80 -2080 -2080 +0820 +0820 +0820 +0820 +ENDCHAR +STARTCHAR C190 +ENCODING 49552 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -2 +BITMAP +0200 +0180 +0100 +0380 +0C78 +1204 +2100 +0100 +FFFE +0000 +1000 +0800 +0800 +0810 +07F8 +ENDCHAR +STARTCHAR C194 +ENCODING 49556 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -2 +BITMAP +0200 +0180 +0100 +06C0 +0838 +3100 +0100 +FFFE +0000 +1FE0 +0020 +0020 +0FE0 +0800 +0FF0 +ENDCHAR +STARTCHAR C196 +ENCODING 49558 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 16 2 -3 +BITMAP +0200 +0300 +0700 +08F0 +3008 +4200 +0200 +FFFC +0000 +0000 +7DF0 +0910 +6D20 +3120 +3DF0 +0100 +ENDCHAR +STARTCHAR C19C +ENCODING 49564 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -2 +BITMAP +0200 +0180 +0300 +06C0 +0838 +3100 +0100 +FFFE +0000 +0000 +1FE0 +0820 +0820 +0FE0 +0800 +ENDCHAR +STARTCHAR C19D +ENCODING 49565 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0600 +0200 +0700 +08F0 +3408 +C200 +0200 +FFFC +0000 +3040 +1040 +1FC0 +1040 +1FC0 +1040 +ENDCHAR +STARTCHAR C19F +ENCODING 49567 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -3 +BITMAP +0300 +0100 +0300 +04F0 +1B08 +2100 +0100 +FFFE +0200 +0100 +0300 +06C0 +0830 +1010 +2000 +ENDCHAR +STARTCHAR C1A1 +ENCODING 49569 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +0180 +0100 +0280 +0C78 +3300 +0100 +0100 +FFFE +0100 +07C0 +0C60 +0820 +0C60 +07C0 +ENDCHAR +STARTCHAR C1A5 +ENCODING 49573 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -2 +BITMAP +0300 +0100 +0380 +0478 +180C +6100 +0100 +FFFE +2000 +0000 +0FF0 +0800 +0FE0 +0810 +0FF0 +ENDCHAR +STARTCHAR C1A8 +ENCODING 49576 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -2 +BITMAP +0030 +0010 +0C10 +0410 +0410 +0B90 +1050 +6C16 +8418 +0470 +0F90 +7010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR C1A9 +ENCODING 49577 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 16 1 -3 +BITMAP +0030 +0410 +0210 +0410 +1BD0 +2C12 +441C +04F0 +FF10 +0000 +1FF0 +0010 +0010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR C1AC +ENCODING 49580 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -2 +BITMAP +0030 +0010 +0410 +0610 +0C10 +13D0 +6416 +0438 +8FD0 +7010 +0010 +0C10 +0400 +0400 +07FC +ENDCHAR +STARTCHAR C1B0 +ENCODING 49584 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -2 +BITMAP +0030 +0610 +0610 +0E10 +11D0 +6416 +0418 +9FF0 +6000 +0FF0 +0010 +0FF0 +0400 +0400 +07FC +ENDCHAR +STARTCHAR C1BD +ENCODING 49597 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 14 2 -2 +BITMAP +0060 +0C20 +0C20 +1E20 +21E0 +C020 +0C38 +09E0 +FEA0 +0360 +0420 +0420 +0620 +03C0 +ENDCHAR +STARTCHAR C1C4 +ENCODING 49604 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0060 +0110 +1090 +0890 +1090 +3C90 +4290 +8090 +18F0 +1090 +1F90 +E090 +0090 +0090 +0010 +ENDCHAR +STARTCHAR C1C8 +ENCODING 49608 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 14 2 -2 +BITMAP +0030 +0190 +0890 +1890 +2E90 +4090 +18F0 +1090 +1F90 +E090 +1890 +0810 +0800 +0FF8 +ENDCHAR +STARTCHAR C1CC +ENCODING 49612 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 14 1 -2 +BITMAP +0098 +0848 +0448 +0848 +3748 +0878 +0848 +FFC8 +0FF0 +0010 +0010 +0FF0 +0400 +07F8 +ENDCHAR +STARTCHAR C1D4 +ENCODING 49620 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 1 -2 +BITMAP +0020 +0098 +0048 +0448 +0848 +1748 +7878 +0848 +8FC8 +7000 +07F8 +0208 +0210 +0210 +03E0 +ENDCHAR +STARTCHAR C1D7 +ENCODING 49623 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 14 2 -2 +BITMAP +0130 +0090 +0890 +1090 +2E90 +F0F0 +1090 +1790 +EB10 +0180 +0180 +0260 +0410 +1808 +ENDCHAR +STARTCHAR C1D8 +ENCODING 49624 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 1 -2 +BITMAP +0098 +0848 +0448 +0848 +1748 +7878 +0848 +FFC8 +2030 +0210 +0210 +0528 +08C4 +1084 +ENDCHAR +STARTCHAR C1E0 +ENCODING 49632 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +0C10 +0410 +0810 +1710 +20D0 +4810 +8410 +0410 +07D0 +7810 +0010 +0010 +0010 +ENDCHAR +STARTCHAR C1E4 +ENCODING 49636 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0010 +0410 +0410 +0E10 +31D0 +4410 +0430 +DFD0 +2010 +0010 +0C00 +0400 +0400 +07F8 +ENDCHAR +STARTCHAR C1E8 +ENCODING 49640 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0810 +0410 +0810 +1790 +6C10 +0410 +05F0 +FA10 +0000 +1FE0 +0020 +1FE0 +0800 +0FF8 +ENDCHAR +STARTCHAR C1F0 +ENCODING 49648 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 11 15 3 -2 +BITMAP +0060 +1020 +0820 +1020 +2F20 +D820 +0820 +0BE0 +F420 +0000 +1FE0 +0820 +0840 +0840 +0F80 +ENDCHAR +STARTCHAR C1F1 +ENCODING 49649 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 11 16 3 -3 +BITMAP +0060 +1020 +0820 +1820 +2720 +D820 +0820 +0FE0 +F020 +1840 +0840 +0FC0 +0840 +0840 +0FC0 +0840 +ENDCHAR +STARTCHAR C1F3 +ENCODING 49651 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0010 +0410 +0C10 +1F90 +2810 +C410 +04F0 +FF10 +0010 +0180 +0180 +0240 +0430 +1818 +ENDCHAR +STARTCHAR C1FC +ENCODING 49660 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 16 12 1 0 +BITMAP +0200 +0180 +0100 +0380 +0478 +080C +3000 +0860 +0420 +0420 +0420 +FFFF +ENDCHAR +STARTCHAR C1FD +ENCODING 49661 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -2 +BITMAP +0200 +0100 +0100 +0380 +0C78 +1044 +2420 +0420 +FFFE +0000 +3FE0 +0020 +0020 +0020 +0020 +ENDCHAR +STARTCHAR C200 +ENCODING 49664 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +0100 +0180 +0300 +06F0 +084C +3440 +0440 +FFFE +0000 +1000 +0800 +0800 +0800 +07F8 +ENDCHAR +STARTCHAR C204 +ENCODING 49668 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 2 -2 +BITMAP +0200 +0300 +0700 +08F0 +3840 +4840 +FFFC +0000 +3FC0 +0040 +0040 +1FC0 +1000 +1FE0 +ENDCHAR +STARTCHAR C20C +ENCODING 49676 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -3 +BITMAP +0300 +0200 +0580 +1870 +2088 +4840 +0840 +FFFC +0000 +1FE0 +0820 +0820 +0820 +0FE0 +0800 +ENDCHAR +STARTCHAR C20D +ENCODING 49677 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -3 +BITMAP +0200 +0300 +0700 +08F0 +3848 +4840 +FFFC +0000 +1840 +0840 +0FC0 +0840 +0840 +0FC0 +0840 +ENDCHAR +STARTCHAR C20F +ENCODING 49679 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 2 -2 +BITMAP +0200 +0300 +0700 +08F0 +3848 +C840 +FFFC +0000 +0600 +0200 +0700 +0CC0 +1060 +2010 +ENDCHAR +STARTCHAR C211 +ENCODING 49681 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +0100 +0180 +0380 +0478 +1C24 +6420 +FFFE +0000 +03C0 +0660 +0420 +0420 +0660 +03C0 +ENDCHAR +STARTCHAR C218 +ENCODING 49688 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 16 1 -3 +BITMAP +0200 +0180 +0100 +02C0 +0C3C +3000 +0000 +83FE +FF00 +0100 +0100 +0100 +0100 +0100 +0100 +0100 +ENDCHAR +STARTCHAR C219 +ENCODING 49689 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -2 +BITMAP +0300 +0100 +0300 +04F0 +180C +6000 +0004 +FFFE +0100 +0100 +21E0 +1E20 +0020 +0020 +0020 +ENDCHAR +STARTCHAR C21C +ENCODING 49692 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -2 +BITMAP +0200 +0180 +0100 +0280 +0C78 +1000 +2004 +FFFE +0100 +0100 +0100 +0900 +0900 +0800 +07F8 +ENDCHAR +STARTCHAR C21F +ENCODING 49695 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0400 +0300 +0200 +0580 +1870 +6000 +0000 +FFFC +0200 +0240 +3FC0 +1000 +1000 +1000 +1FE0 +ENDCHAR +STARTCHAR C220 +ENCODING 49696 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +0300 +0180 +0300 +04F8 +1808 +2004 +FFFE +0100 +0100 +0EE0 +0020 +1FE0 +0800 +0FF0 +ENDCHAR +STARTCHAR C228 +ENCODING 49704 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 16 1 -3 +BITMAP +0300 +0100 +0300 +0CF8 +1000 +2000 +0000 +FFFE +0100 +0100 +1960 +0EA0 +0820 +0840 +0FE0 +0800 +ENDCHAR +STARTCHAR C229 +ENCODING 49705 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 16 1 -3 +BITMAP +0300 +0100 +0380 +0478 +1804 +6000 +0000 +FFFE +0100 +1960 +0820 +0FE0 +0820 +0820 +0FE0 +0820 +ENDCHAR +STARTCHAR C22B +ENCODING 49707 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +0180 +0100 +06E0 +081C +3000 +0000 +FFFE +0100 +0100 +0100 +0100 +0280 +0470 +1818 +ENDCHAR +STARTCHAR C22D +ENCODING 49709 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -2 +BITMAP +0300 +0180 +0100 +02C0 +0C3C +3000 +0004 +FFFE +0100 +07C0 +0C60 +0820 +0820 +0460 +03C0 +ENDCHAR +STARTCHAR C22F +ENCODING 49711 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 16 2 -3 +BITMAP +0400 +0200 +0600 +0DC0 +3038 +C008 +0FFC +FA00 +0200 +0F00 +03F0 +7E00 +0200 +0580 +0860 +3010 +ENDCHAR +STARTCHAR C231 +ENCODING 49713 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0400 +0300 +0600 +0DE0 +1010 +E000 +0FFC +FE00 +0200 +1FE0 +1000 +1000 +1FC0 +1000 +1FF0 +ENDCHAR +STARTCHAR C232 +ENCODING 49714 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +0300 +0100 +0300 +04F8 +180C +6004 +FFFE +0100 +0100 +1FF0 +0040 +0440 +0040 +3FF8 +ENDCHAR +STARTCHAR C234 +ENCODING 49716 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +0410 +0C10 +1C10 +23D0 +C010 +0010 +0F90 +F810 +08F0 +0810 +0810 +0810 +0010 +ENDCHAR +STARTCHAR C248 +ENCODING 49736 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0810 +0610 +0C10 +3390 +4010 +0090 +FF30 +08D0 +0840 +0420 +0420 +0A50 +1288 +2108 +ENDCHAR +STARTCHAR C250 +ENCODING 49744 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0110 +1090 +0890 +1890 +3890 +4690 +8090 +0C90 +F090 +1390 +1090 +1090 +0090 +0010 +ENDCHAR +STARTCHAR C251 +ENCODING 49745 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 16 1 -3 +BITMAP +0030 +0098 +0848 +0448 +1848 +27C8 +C048 +FF48 +0BC8 +0848 +0FF8 +0408 +0008 +0008 +0008 +0008 +ENDCHAR +STARTCHAR C254 +ENCODING 49748 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0020 +0110 +0090 +0C90 +1890 +2790 +C090 +0290 +7C90 +0B90 +0090 +0C10 +0400 +0400 +03F8 +ENDCHAR +STARTCHAR C258 +ENCODING 49752 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0090 +1050 +0850 +1850 +2650 +C050 +FC50 +13D0 +1000 +0FF0 +0010 +0FF0 +0400 +07F8 +ENDCHAR +STARTCHAR C260 +ENCODING 49760 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 1 -3 +BITMAP +0098 +0848 +0448 +0848 +3748 +4048 +FF48 +0BC8 +0848 +07F8 +0210 +0210 +0210 +03F8 +0200 +ENDCHAR +STARTCHAR C265 +ENCODING 49765 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 1 -2 +BITMAP +0010 +00C8 +0848 +0C48 +1C48 +6348 +0048 +FF48 +09C8 +0848 +01F0 +0318 +0208 +0318 +01F0 +ENDCHAR +STARTCHAR C26C +ENCODING 49772 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +0C10 +0C10 +1C10 +2390 +C010 +0010 +0F90 +F810 +0810 +0810 +0810 +0810 +0010 +ENDCHAR +STARTCHAR C26D +ENCODING 49773 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 11 16 3 -3 +BITMAP +00C0 +1060 +0820 +1020 +6FA0 +8020 +0060 +3FA0 +C820 +0820 +3FE0 +0020 +0020 +0020 +0020 +0020 +ENDCHAR +STARTCHAR C270 +ENCODING 49776 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0810 +0410 +0810 +1790 +6010 +8010 +03D0 +FC10 +0810 +0810 +1800 +0800 +0810 +0FF0 +ENDCHAR +STARTCHAR C274 +ENCODING 49780 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +1010 +0C10 +1810 +2790 +C010 +0F90 +F810 +0810 +1FE0 +0020 +0020 +1FE0 +0800 +0FF0 +ENDCHAR +STARTCHAR C27C +ENCODING 49788 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 16 1 -3 +BITMAP +0018 +0608 +0608 +0E08 +11E8 +2008 +0078 +FF88 +0408 +0400 +0FF8 +0208 +0210 +0210 +03F8 +0200 +ENDCHAR +STARTCHAR C27D +ENCODING 49789 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0030 +0810 +0410 +0810 +1790 +6010 +00D0 +FF10 +0410 +0830 +0410 +07F0 +0410 +0410 +07F0 +0400 +ENDCHAR +STARTCHAR C27F +ENCODING 49791 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0010 +0610 +0C10 +1B90 +6010 +0070 +FF90 +0410 +0510 +0480 +0180 +0260 +0410 +1808 +ENDCHAR +STARTCHAR C281 +ENCODING 49793 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 11 15 3 -2 +BITMAP +0060 +1820 +0C20 +1820 +27A0 +C020 +07E0 +F820 +0820 +0900 +07C0 +0C60 +0820 +0C60 +07C0 +ENDCHAR +STARTCHAR C288 +ENCODING 49800 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 2 -3 +BITMAP +0200 +0300 +0600 +09E0 +3018 +C000 +0000 +FFFE +0840 +0840 +0840 +0840 +0840 +0840 +0040 +ENDCHAR +STARTCHAR C289 +ENCODING 49801 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0600 +0300 +0300 +0500 +18F0 +6018 +0008 +FFF8 +0880 +0880 +3FC0 +0040 +0040 +0040 +0040 +ENDCHAR +STARTCHAR C290 +ENCODING 49808 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0400 +0300 +0200 +0500 +18F0 +6000 +0000 +FFFC +0880 +0FC0 +1040 +3FC0 +1000 +1000 +1FE0 +ENDCHAR +STARTCHAR C298 +ENCODING 49816 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -3 +BITMAP +0100 +0180 +0300 +04F8 +1800 +2000 +FFFE +2420 +0420 +1FE0 +0820 +0840 +0840 +0FE0 +0800 +ENDCHAR +STARTCHAR C29B +ENCODING 49819 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0400 +0300 +0200 +0D80 +1070 +6000 +0000 +FFFC +0840 +0C40 +0A40 +0F40 +0C80 +1060 +6010 +ENDCHAR +STARTCHAR C29D +ENCODING 49821 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 2 -2 +BITMAP +0200 +0300 +0600 +09F0 +3018 +4000 +FFFC +0840 +0A40 +0DC0 +1040 +1040 +18C0 +0F80 +ENDCHAR +STARTCHAR C2A4 +ENCODING 49828 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 11 2 0 +BITMAP +0300 +0300 +0600 +0DC0 +1838 +2000 +4000 +0000 +0008 +FFFC +4000 +ENDCHAR +STARTCHAR C2A5 +ENCODING 49829 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -2 +BITMAP +0300 +0100 +0300 +04F0 +180C +6000 +0004 +FFFE +2000 +0000 +3FE0 +0020 +0020 +0020 +0020 +ENDCHAR +STARTCHAR C2A8 +ENCODING 49832 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 13 1 -1 +BITMAP +0100 +0180 +0300 +06F8 +180C +6000 +0004 +FFFE +1000 +0800 +0800 +0810 +0FF8 +ENDCHAR +STARTCHAR C2AC +ENCODING 49836 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +0300 +0180 +0300 +0CF8 +3004 +0004 +FFFE +0000 +1FF0 +0020 +1FE0 +0800 +0800 +07F8 +ENDCHAR +STARTCHAR C2AD +ENCODING 49837 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +0100 +0100 +0380 +0C78 +3000 +0004 +FFFE +0000 +1FF0 +0210 +3610 +1810 +1310 +1C10 +ENDCHAR +STARTCHAR C2B4 +ENCODING 49844 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +0100 +0180 +0300 +06F8 +1804 +6000 +FFFE +0000 +0000 +1FE0 +0820 +0820 +0FE0 +0800 +ENDCHAR +STARTCHAR C2B5 +ENCODING 49845 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -3 +BITMAP +0600 +0300 +0600 +09F0 +3018 +C000 +FFFC +0000 +3040 +1040 +1FC0 +1040 +1040 +1FC0 +1040 +ENDCHAR +STARTCHAR C2B7 +ENCODING 49847 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +0100 +0180 +0300 +06F0 +080C +3000 +FFFE +0000 +0300 +0180 +0380 +0660 +0818 +3008 +ENDCHAR +STARTCHAR C2B9 +ENCODING 49849 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +0300 +0180 +0300 +04F0 +180C +6004 +FFFE +2000 +0100 +06C0 +0820 +0820 +0460 +0380 +ENDCHAR +STARTCHAR C2DC +ENCODING 49884 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0070 +0010 +0010 +0C10 +0810 +0810 +1810 +2410 +4310 +8110 +0010 +0010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR C2DD +ENCODING 49885 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 1 -2 +BITMAP +0018 +0008 +0608 +0608 +0408 +0A08 +1188 +2048 +C008 +3FF0 +0810 +0010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR C2E0 +ENCODING 49888 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0060 +0010 +0810 +0C10 +0810 +1410 +2210 +4110 +8090 +0010 +3010 +0800 +0800 +0800 +0FF8 +ENDCHAR +STARTCHAR C2E3 +ENCODING 49891 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0060 +0010 +0C10 +0410 +0810 +1410 +2210 +4110 +8010 +0000 +0FE0 +0400 +0400 +0400 +07F8 +ENDCHAR +STARTCHAR C2E4 +ENCODING 49892 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 1 -2 +BITMAP +0018 +0008 +0608 +0608 +0408 +0B88 +10C8 +6008 +8000 +0FF8 +0010 +0FF8 +0400 +0400 +07FC +ENDCHAR +STARTCHAR C2EB +ENCODING 49899 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 1 -2 +BITMAP +0018 +0408 +0208 +0408 +0E08 +1188 +2088 +C000 +3E70 +040C +04F0 +1858 +1088 +1C88 +0070 +ENDCHAR +STARTCHAR C2EC +ENCODING 49900 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 16 1 -3 +BITMAP +0018 +0008 +0608 +0608 +0408 +0A08 +1108 +2088 +C008 +0000 +0FF0 +0410 +0410 +0410 +07F0 +0400 +ENDCHAR +STARTCHAR C2ED +ENCODING 49901 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +0C10 +0C10 +0810 +1410 +2310 +4110 +8000 +0C20 +0420 +07E0 +0420 +07E0 +0420 +ENDCHAR +STARTCHAR C2EF +ENCODING 49903 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0010 +0810 +0810 +0810 +1410 +2210 +4110 +8010 +0090 +0080 +0180 +0360 +0410 +0808 +ENDCHAR +STARTCHAR C2F1 +ENCODING 49905 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +0C10 +0C10 +0810 +1410 +2310 +4110 +8010 +0090 +0340 +0420 +0420 +0660 +03E0 +ENDCHAR +STARTCHAR C2F6 +ENCODING 49910 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 14 2 -1 +BITMAP +0030 +0010 +0C10 +0810 +1810 +1410 +2210 +C110 +0000 +3FF0 +0040 +0440 +0490 +7FF8 +ENDCHAR +STARTCHAR C2F8 +ENCODING 49912 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0040 +0020 +0020 +2120 +3120 +2220 +5220 +9E24 +0538 +08A0 +10A0 +2020 +0020 +0020 +0020 +ENDCHAR +STARTCHAR C2F9 +ENCODING 49913 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 16 1 -3 +BITMAP +0030 +0010 +1190 +0890 +1110 +2B16 +4698 +8450 +0850 +0000 +1FF0 +0810 +0010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR C2FB +ENCODING 49915 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -2 +BITMAP +0030 +0110 +0890 +0990 +1910 +2696 +4658 +8850 +0000 +7C30 +0420 +0430 +0448 +048C +0504 +ENDCHAR +STARTCHAR C2FC +ENCODING 49916 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0060 +0020 +2320 +1120 +3120 +3220 +4D2C +85B0 +08A0 +1020 +1020 +0820 +0800 +0810 +0FF0 +ENDCHAR +STARTCHAR C300 +ENCODING 49920 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -2 +BITMAP +0030 +0010 +1190 +0990 +1110 +2F16 +42D8 +8450 +0800 +1FF0 +0020 +0FF0 +0400 +0400 +07F8 +ENDCHAR +STARTCHAR C308 +ENCODING 49928 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 16 1 -3 +BITMAP +0030 +0010 +1890 +0890 +1110 +2910 +42DC +8450 +0810 +1000 +0FF0 +0410 +0420 +0420 +07F0 +0400 +ENDCHAR +STARTCHAR C309 +ENCODING 49929 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0060 +0220 +1120 +1120 +3220 +4B2C +84B0 +08A0 +1000 +1020 +0820 +0FE0 +0820 +0FE0 +0820 +ENDCHAR +STARTCHAR C30C +ENCODING 49932 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0060 +0020 +3320 +1120 +2220 +3B2C +4CB0 +88A0 +1020 +0820 +0420 +0C60 +1250 +2088 +4108 +ENDCHAR +STARTCHAR C30D +ENCODING 49933 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -2 +BITMAP +0030 +0010 +1190 +0890 +1110 +2910 +469E +8450 +0810 +1050 +01A0 +0210 +0210 +0330 +01E0 +ENDCHAR +STARTCHAR C313 +ENCODING 49939 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -2 +BITMAP +0030 +0010 +1990 +1110 +3110 +4A9E +8450 +0810 +01C0 +0000 +0FFC +00C0 +0330 +0110 +00E0 +ENDCHAR +STARTCHAR C314 +ENCODING 49940 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0060 +0090 +0050 +6650 +3250 +2450 +5450 +5C50 +8A70 +1150 +2050 +0050 +0050 +0050 +0010 +ENDCHAR +STARTCHAR C315 +ENCODING 49941 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 16 1 -3 +BITMAP +0018 +00C8 +0248 +1148 +1348 +3248 +4D78 +88C8 +1048 +2048 +0FF8 +0008 +0008 +0008 +0008 +0008 +ENDCHAR +STARTCHAR C318 +ENCODING 49944 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0060 +0030 +00D0 +2250 +2250 +2450 +5650 +8970 +1150 +0050 +0050 +1850 +0810 +0800 +0FF8 +ENDCHAR +STARTCHAR C31C +ENCODING 49948 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 1 -2 +BITMAP +0018 +00C8 +0248 +1148 +1348 +2A48 +4D78 +88C8 +1048 +2FF0 +0010 +0FF0 +0400 +0400 +07F8 +ENDCHAR +STARTCHAR C324 +ENCODING 49956 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 16 1 -3 +BITMAP +0018 +0068 +0228 +1128 +1128 +2A28 +4D38 +84A8 +1828 +0000 +07F8 +0208 +0208 +0208 +03F8 +0200 +ENDCHAR +STARTCHAR C325 +ENCODING 49957 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 16 1 -3 +BITMAP +0018 +0068 +0228 +1128 +1128 +2A28 +4D38 +88A8 +1028 +2408 +0208 +03F8 +0208 +0208 +03F8 +0208 +ENDCHAR +STARTCHAR C328 +ENCODING 49960 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -2 +BITMAP +0018 +0068 +0228 +1128 +1328 +2A28 +4D38 +88A8 +1028 +0008 +0218 +0210 +0728 +0CC4 +1082 +ENDCHAR +STARTCHAR C329 +ENCODING 49961 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 1 -2 +BITMAP +0018 +00C8 +0248 +1148 +1248 +3248 +4D78 +88C8 +1048 +2048 +01F0 +0208 +0208 +0318 +01F0 +ENDCHAR +STARTCHAR C345 +ENCODING 49989 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +00C0 +0020 +3120 +1120 +323C +4A20 +8520 +08A0 +103C +0120 +06C0 +0820 +0820 +0C60 +07C0 +ENDCHAR +STARTCHAR C368 +ENCODING 50024 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0060 +0030 +0210 +3110 +2110 +2210 +52F0 +8E10 +0990 +1090 +0090 +0010 +0010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR C369 +ENCODING 50025 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 16 1 -3 +BITMAP +0018 +0008 +1188 +1188 +1108 +2B78 +4688 +84C8 +0848 +1000 +1FF0 +0010 +0010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR C36C +ENCODING 50028 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0070 +0010 +3110 +1990 +1110 +2A70 +4B90 +84D0 +0850 +1010 +0010 +0C00 +0400 +0400 +07F8 +ENDCHAR +STARTCHAR C370 +ENCODING 50032 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +2310 +1310 +2210 +5670 +4610 +8910 +1000 +1FE0 +0020 +1FE0 +0800 +0800 +0FF0 +ENDCHAR +STARTCHAR C372 +ENCODING 50034 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0030 +0010 +2310 +3110 +2210 +52F0 +8510 +0890 +1090 +2000 +7DF0 +0510 +7D10 +2130 +3DF0 +0100 +ENDCHAR +STARTCHAR C378 +ENCODING 50040 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0030 +0010 +1110 +1110 +3210 +4A70 +8D10 +0890 +1010 +0000 +0FF0 +0410 +0420 +0420 +07F0 +0400 +ENDCHAR +STARTCHAR C379 +ENCODING 50041 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 16 1 -3 +BITMAP +0018 +0008 +18C8 +0888 +18F8 +1D88 +2648 +C428 +0800 +0608 +0208 +03F8 +0208 +0208 +03F8 +0208 +ENDCHAR +STARTCHAR C37C +ENCODING 50044 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 1 -2 +BITMAP +0038 +0008 +1188 +0888 +1118 +2F28 +4688 +8448 +0808 +0430 +0210 +0630 +0530 +08CC +3084 +ENDCHAR +STARTCHAR C37D +ENCODING 50045 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0070 +0010 +2310 +1110 +2310 +5270 +4D10 +8890 +1090 +0090 +0340 +0420 +0420 +0460 +03C0 +ENDCHAR +STARTCHAR C384 +ENCODING 50052 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0060 +0030 +0050 +6650 +2250 +2250 +5450 +95D0 +0A50 +1250 +2050 +0050 +0050 +0050 +0010 +0010 +ENDCHAR +STARTCHAR C388 +ENCODING 50056 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 1 -2 +BITMAP +0018 +0048 +0028 +1128 +1128 +3268 +2BA8 +C4A8 +0828 +1028 +0828 +0400 +0400 +0400 +03FC +ENDCHAR +STARTCHAR C38C +ENCODING 50060 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 1 -2 +BITMAP +0018 +00C8 +0248 +1248 +1248 +3FC8 +4D48 +8948 +1048 +07F8 +0008 +07F8 +0200 +0200 +03FC +ENDCHAR +STARTCHAR C399 +ENCODING 50073 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 14 2 -2 +BITMAP +0130 +0090 +4490 +2690 +2790 +5490 +8D90 +9290 +1290 +3090 +0810 +0800 +0810 +0FF0 +ENDCHAR +STARTCHAR C3D8 +ENCODING 50136 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 11 1 0 +BITMAP +0860 +0430 +0C20 +0E40 +12F0 +618C +0204 +0700 +0100 +0100 +FFFE +ENDCHAR +STARTCHAR C3D9 +ENCODING 50137 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +0420 +0C40 +1AE0 +219C +0200 +0500 +0100 +FFFE +2000 +3FE0 +0020 +0020 +0020 +0020 +ENDCHAR +STARTCHAR C3DC +ENCODING 50140 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -1 +BITMAP +0040 +0C20 +0C40 +0CC0 +13BC +6200 +0500 +0100 +FFFE +1000 +0800 +0800 +0800 +0FF8 +ENDCHAR +STARTCHAR C3DF +ENCODING 50143 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 2 -2 +BITMAP +1840 +0840 +1880 +2570 +4208 +0600 +0200 +FFFC +0000 +1FE0 +1000 +1000 +1000 +0FE0 +ENDCHAR +STARTCHAR C3E0 +ENCODING 50144 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -2 +BITMAP +0040 +0C20 +0440 +0CB8 +1304 +6580 +0100 +FFFE +2000 +1FE0 +0020 +0020 +1FE0 +0800 +0FF8 +ENDCHAR +STARTCHAR C3E2 +ENCODING 50146 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -3 +BITMAP +0C60 +0420 +0C40 +12B8 +6104 +0700 +0100 +FFFE +0000 +3F00 +02F8 +1E90 +1090 +1EF0 +0080 +ENDCHAR +STARTCHAR C3E8 +ENCODING 50152 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +0860 +0420 +0C40 +12B8 +2104 +0380 +0100 +FFFE +0000 +1FE0 +0820 +0840 +0FE0 +0800 +ENDCHAR +STARTCHAR C3E9 +ENCODING 50153 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 16 1 -3 +BITMAP +0060 +0C60 +0440 +0CB8 +1304 +6500 +0100 +C17E +FE8E +0C20 +0420 +07E0 +0420 +0420 +07E0 +0420 +ENDCHAR +STARTCHAR C3ED +ENCODING 50157 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +0820 +0420 +0840 +16BC +2100 +0700 +0100 +FFFE +2100 +07C0 +0C60 +0820 +0C60 +07C0 +ENDCHAR +STARTCHAR C3F4 +ENCODING 50164 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -2 +BITMAP +0030 +0010 +1090 +0890 +1190 +3D90 +4250 +8436 +0A18 +0210 +7FD0 +2010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR C3F5 +ENCODING 50165 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 16 1 -3 +BITMAP +0030 +0110 +1890 +0910 +1E90 +2450 +4E1E +0270 +FD90 +0000 +1FF0 +0010 +0010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR C3F8 +ENCODING 50168 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0060 +0220 +3120 +1220 +3D20 +48A0 +943C +04E0 +FB20 +0020 +0020 +0800 +0800 +0810 +0FF0 +ENDCHAR +STARTCHAR C408 +ENCODING 50184 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -2 +BITMAP +0030 +0110 +0890 +0910 +1E90 +2450 +4A1E +0270 +FF90 +0000 +0630 +0420 +0B70 +114C +2084 +ENDCHAR +STARTCHAR C410 +ENCODING 50192 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 1 -2 +BITMAP +0030 +0088 +0048 +1348 +1248 +1648 +2D48 +4848 +1878 +09C8 +FE48 +0048 +0048 +0048 +0008 +ENDCHAR +STARTCHAR C424 +ENCODING 50212 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0190 +2690 +1490 +3C90 +4A90 +98F0 +0890 +1F90 +E040 +0420 +0C60 +0B50 +1188 +6100 +ENDCHAR +STARTCHAR C42C +ENCODING 50220 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +3110 +1910 +1210 +2F90 +44D0 +0C10 +3410 +0470 +FF90 +0010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR C430 +ENCODING 50224 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 14 2 -1 +BITMAP +0030 +0010 +1110 +1110 +3B10 +44D0 +8C10 +1430 +FFD0 +4010 +1810 +0800 +0800 +0FF8 +ENDCHAR +STARTCHAR C434 +ENCODING 50228 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 1 -2 +BITMAP +0018 +0188 +0888 +0988 +1548 +2628 +CA08 +02F8 +3D08 +07F8 +0008 +07F8 +0200 +0200 +03FC +ENDCHAR +STARTCHAR C43C +ENCODING 50236 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +1110 +1110 +3B90 +4450 +8C10 +04F0 +FF10 +0000 +07F0 +0420 +0420 +07F0 +0400 +ENDCHAR +STARTCHAR C43D +ENCODING 50237 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0110 +1910 +1310 +2CD0 +4C10 +0410 +8FF0 +7000 +0C10 +0410 +07F0 +0410 +07F0 +0410 +ENDCHAR +STARTCHAR C448 +ENCODING 50248 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 11 1 0 +BITMAP +0C30 +0420 +0420 +0A60 +1198 +2104 +0200 +0420 +0420 +0440 +FFFE +ENDCHAR +STARTCHAR C464 +ENCODING 50276 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -3 +BITMAP +0860 +0460 +0C40 +12B8 +2104 +C200 +0000 +FFFE +0100 +0100 +0100 +0100 +0100 +0100 +0100 +ENDCHAR +STARTCHAR C465 +ENCODING 50277 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -2 +BITMAP +0040 +0420 +0C20 +0E60 +329C +4100 +0604 +FFFE +0100 +0100 +21F0 +1E10 +0010 +0010 +0010 +ENDCHAR +STARTCHAR C468 +ENCODING 50280 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -2 +BITMAP +0040 +0420 +0420 +0C40 +12B8 +6104 +0200 +000E +FFFC +0100 +0100 +1900 +0900 +0900 +0FF8 +ENDCHAR +STARTCHAR C46C +ENCODING 50284 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -2 +BITMAP +0040 +0420 +0420 +0C40 +32B8 +4104 +0604 +FFFE +0100 +1F00 +00E0 +0020 +1FE0 +0800 +0FF0 +ENDCHAR +STARTCHAR C474 +ENCODING 50292 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 16 1 -3 +BITMAP +0020 +0420 +0460 +0C50 +138C +6200 +0000 +FFFE +0100 +0100 +1FE0 +0820 +0820 +0820 +0FE0 +0800 +ENDCHAR +STARTCHAR C475 +ENCODING 50293 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -2 +BITMAP +0040 +0420 +0420 +0E40 +30BC +4100 +0200 +FFFE +0100 +1920 +0920 +0FE0 +0820 +0FE0 +0820 +ENDCHAR +STARTCHAR C479 +ENCODING 50297 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -2 +BITMAP +0060 +0420 +0460 +0ED8 +1184 +6200 +0004 +FFFE +0100 +07C0 +0C60 +0820 +0820 +0C60 +03C0 +ENDCHAR +STARTCHAR C480 +ENCODING 50304 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +1110 +1110 +3B10 +4C90 +8810 +1010 +0F90 +7410 +04F0 +0410 +0410 +0410 +0010 +ENDCHAR +STARTCHAR C494 +ENCODING 50324 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +2310 +1110 +3210 +4D90 +8810 +0010 +FF10 +08F0 +0800 +0430 +0420 +0A60 +1198 +6108 +ENDCHAR +STARTCHAR C49C +ENCODING 50332 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 11 15 3 -2 +BITMAP +0060 +01A0 +00A0 +24A0 +24A0 +5CA0 +92A0 +20A0 +06A0 +F8A0 +13A0 +10A0 +10A0 +00A0 +0020 +ENDCHAR +STARTCHAR C4B8 +ENCODING 50360 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0070 +0010 +3110 +1110 +3310 +4C90 +8810 +0010 +3F90 +C810 +0810 +0810 +0810 +0810 +0010 +ENDCHAR +STARTCHAR C4BC +ENCODING 50364 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 1 -2 +BITMAP +0018 +0008 +1888 +0988 +1D08 +22E8 +CC08 +FFF8 +2408 +0408 +0408 +0C08 +0400 +0400 +07FC +ENDCHAR +STARTCHAR C4E9 +ENCODING 50409 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -2 +BITMAP +0040 +0420 +0420 +0E60 +129C +6104 +0204 +FFFE +0420 +0520 +06E0 +0820 +0820 +0C60 +07C0 +ENDCHAR +STARTCHAR C4F0 +ENCODING 50416 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 11 1 0 +BITMAP +0820 +0430 +0420 +0C40 +12F0 +208C +C300 +0400 +0000 +0000 +FFFE +ENDCHAR +STARTCHAR C4F1 +ENCODING 50417 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -2 +BITMAP +0040 +0C20 +0420 +0E60 +129C +6100 +0206 +FFFE +2000 +0000 +1FF0 +0010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR C4F4 +ENCODING 50420 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +0C20 +0430 +0C20 +1270 +608C +0300 +0000 +FFFE +0000 +1000 +0800 +0800 +0800 +0FF8 +ENDCHAR +STARTCHAR C4F8 +ENCODING 50424 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +0C60 +0420 +0C40 +32B8 +410C +0200 +FFFE +0000 +0000 +1FF0 +0020 +1FE0 +0800 +0FF8 +ENDCHAR +STARTCHAR C4FA +ENCODING 50426 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 16 1 -3 +BITMAP +0040 +0C30 +0420 +0C60 +1AD8 +218C +C200 +0000 +7FFE +0000 +3FF8 +0290 +3E90 +1090 +16F0 +0880 +ENDCHAR +STARTCHAR C4FF +ENCODING 50431 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +0C20 +0420 +0C40 +12F8 +2104 +C204 +01FE +FF00 +3E70 +041C +3CE0 +1098 +1688 +1870 +ENDCHAR +STARTCHAR C500 +ENCODING 50432 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -3 +BITMAP +0860 +0420 +0840 +16F0 +210C +C200 +0404 +FFFE +2000 +0000 +1FE0 +0820 +0820 +0FE0 +0800 +ENDCHAR +STARTCHAR C501 +ENCODING 50433 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +0C60 +0C20 +0C40 +32B8 +4104 +0200 +FFFE +0000 +1820 +0820 +0FE0 +0820 +0FE0 +0820 +ENDCHAR +STARTCHAR C50C +ENCODING 50444 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 11 15 3 -2 +BITMAP +0060 +0020 +4220 +3220 +2220 +5620 +89A0 +10A0 +2020 +0060 +3FA0 +C020 +0020 +0020 +0020 +ENDCHAR +STARTCHAR C510 +ENCODING 50448 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0010 +0110 +1910 +1310 +2ED0 +4450 +1810 +00F0 +FF10 +0010 +1810 +0800 +0800 +0FF8 +ENDCHAR +STARTCHAR C514 +ENCODING 50452 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0210 +1910 +1110 +2B90 +4450 +1870 +FF90 +0000 +1FE0 +0020 +1FE0 +0800 +0800 +0FF8 +ENDCHAR +STARTCHAR C51C +ENCODING 50460 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0060 +0030 +1110 +1910 +1B10 +66D0 +8850 +0010 +FFF0 +2010 +0FF0 +0410 +0410 +0420 +07F0 +0400 +ENDCHAR +STARTCHAR C528 +ENCODING 50472 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +0310 +1190 +1110 +2110 +3210 +4F10 +8C90 +0850 +1010 +2010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR C529 +ENCODING 50473 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 16 1 -3 +BITMAP +0018 +0008 +1888 +0888 +1108 +2988 +4648 +8468 +0808 +0000 +1FF0 +0010 +0010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR C52C +ENCODING 50476 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 1 -2 +BITMAP +0018 +0008 +1188 +0888 +0888 +1908 +2688 +4248 +8408 +0808 +0008 +0600 +0200 +0200 +03FC +ENDCHAR +STARTCHAR C530 +ENCODING 50480 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 1 -2 +BITMAP +0018 +0008 +0888 +0888 +1088 +2D88 +4648 +8428 +0800 +0FF8 +0010 +0010 +1FF8 +0400 +07FC +ENDCHAR +STARTCHAR C538 +ENCODING 50488 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0030 +0010 +1190 +1990 +1110 +2B10 +4290 +8450 +0810 +1000 +0FF0 +0410 +0420 +0420 +07F0 +0400 +ENDCHAR +STARTCHAR C539 +ENCODING 50489 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 16 1 -3 +BITMAP +0030 +0018 +1888 +0888 +1888 +1D88 +2648 +C468 +0808 +0608 +0208 +03F8 +0208 +0208 +03F8 +0208 +ENDCHAR +STARTCHAR C53B +ENCODING 50491 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 16 1 -3 +BITMAP +0018 +0008 +1888 +0888 +1888 +1988 +2648 +C428 +0008 +00C8 +0040 +00C0 +0130 +0208 +0404 +0800 +ENDCHAR +STARTCHAR C53D +ENCODING 50493 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +3110 +1110 +3110 +2B10 +4E90 +84D0 +0810 +00C0 +0320 +0410 +0410 +0630 +03E0 +ENDCHAR +STARTCHAR C544 +ENCODING 50500 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +00E0 +0020 +0020 +0820 +7C20 +C620 +8220 +822C +C630 +3C20 +0020 +0020 +0020 +0020 +0020 +ENDCHAR +STARTCHAR C545 +ENCODING 50501 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 16 2 -3 +BITMAP +00C0 +1020 +7C20 +C620 +8220 +8224 +C638 +3C20 +0020 +0000 +3FE0 +0020 +0020 +0020 +0020 +0020 +ENDCHAR +STARTCHAR C548 +ENCODING 50504 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0060 +0020 +1020 +7C20 +C620 +822C +8230 +C620 +3C20 +0020 +3020 +0800 +0800 +0810 +0FF0 +ENDCHAR +STARTCHAR C549 +ENCODING 50505 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +00C0 +1020 +7C20 +8220 +8220 +823C +4420 +3820 +0000 +63F8 +2040 +20C0 +24B0 +3910 +0600 +ENDCHAR +STARTCHAR C54A +ENCODING 50506 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0060 +1020 +7C20 +8220 +822C +8230 +4420 +3800 +01F0 +6780 +21C0 +2220 +2620 +3A20 +01C0 +ENDCHAR +STARTCHAR C54C +ENCODING 50508 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0060 +0020 +1020 +6C20 +8220 +823C +C620 +7C20 +0000 +1FE0 +0020 +1FE0 +0800 +0800 +0FF0 +ENDCHAR +STARTCHAR C54D +ENCODING 50509 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 16 2 -3 +BITMAP +0060 +1020 +7C20 +C620 +822C +8230 +C620 +7C00 +0000 +7E60 +04A0 +4620 +3820 +2220 +3C20 +0020 +ENDCHAR +STARTCHAR C54E +ENCODING 50510 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0060 +1020 +7C20 +C620 +8220 +823C +C620 +7820 +0000 +3DF0 +0520 +7D20 +2120 +27E0 +3900 +ENDCHAR +STARTCHAR C553 +ENCODING 50515 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0060 +1020 +3820 +C620 +8220 +8238 +6C20 +1000 +00E0 +7C00 +0BF0 +6CE0 +3110 +2110 +3CE0 +ENDCHAR +STARTCHAR C554 +ENCODING 50516 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 16 2 -3 +BITMAP +0060 +1020 +7C20 +C620 +8220 +822C +4630 +3C20 +0020 +0000 +1FE0 +0820 +0820 +0820 +0FE0 +0800 +ENDCHAR +STARTCHAR C555 +ENCODING 50517 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 16 2 -3 +BITMAP +0060 +1020 +7C20 +C620 +8220 +823C +C620 +3820 +0000 +1820 +0820 +0FE0 +0820 +0820 +0FE0 +0820 +ENDCHAR +STARTCHAR C557 +ENCODING 50519 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0060 +1020 +7C20 +C620 +8220 +822C +4630 +3820 +0020 +0120 +0100 +0380 +0640 +0830 +1010 +ENDCHAR +STARTCHAR C558 +ENCODING 50520 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0060 +0020 +7C20 +C620 +8220 +823C +C620 +3C20 +0000 +0860 +0860 +0C40 +12A0 +2118 +4208 +ENDCHAR +STARTCHAR C559 +ENCODING 50521 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0060 +1020 +3820 +C620 +8220 +822C +4430 +3820 +0020 +0100 +06C0 +0820 +0820 +0C60 +03C0 +ENDCHAR +STARTCHAR C55D +ENCODING 50525 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0060 +1020 +7C20 +C620 +8220 +823C +C620 +3C20 +0000 +0FE0 +0800 +0FE0 +0800 +0800 +07F0 +ENDCHAR +STARTCHAR C55E +ENCODING 50526 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0060 +1020 +7C20 +C620 +8220 +823C +C620 +3C20 +0000 +0000 +3FF0 +08C0 +0440 +0480 +7FF8 +ENDCHAR +STARTCHAR C560 +ENCODING 50528 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0190 +0090 +1090 +6890 +8490 +8490 +CCF0 +7890 +0090 +0090 +0090 +0090 +0090 +0010 +ENDCHAR +STARTCHAR C561 +ENCODING 50529 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0030 +0010 +1090 +6890 +8490 +8490 +CCF0 +7890 +0090 +0090 +1FF0 +1010 +0010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR C564 +ENCODING 50532 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0070 +0090 +0090 +0890 +7490 +8290 +82F0 +C690 +7C90 +0090 +0090 +1800 +0800 +0800 +07F8 +ENDCHAR +STARTCHAR C568 +ENCODING 50536 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0110 +1090 +7890 +CC90 +8490 +84F0 +7890 +0090 +1F90 +0060 +0020 +1FE0 +0800 +0FF0 +ENDCHAR +STARTCHAR C570 +ENCODING 50544 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0030 +0110 +1090 +6890 +8490 +8490 +CCF0 +7890 +0090 +0090 +0FF0 +0410 +0410 +0420 +07F0 +0400 +ENDCHAR +STARTCHAR C571 +ENCODING 50545 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0070 +0090 +0090 +7890 +8490 +84F0 +8490 +7890 +0000 +0C10 +0410 +07F0 +0410 +07F0 +0410 +ENDCHAR +STARTCHAR C573 +ENCODING 50547 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0070 +0130 +1090 +6890 +8490 +8490 +8CF0 +7890 +0090 +0190 +0080 +0140 +0220 +0418 +1808 +ENDCHAR +STARTCHAR C574 +ENCODING 50548 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0070 +0130 +1090 +6890 +8490 +8490 +CCF0 +7890 +0090 +0CB0 +0420 +0C60 +1250 +2088 +4100 +ENDCHAR +STARTCHAR C575 +ENCODING 50549 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0110 +1090 +6890 +8490 +8490 +8CF0 +7890 +0090 +0090 +0360 +0410 +0410 +0630 +03E0 +ENDCHAR +STARTCHAR C57C +ENCODING 50556 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0040 +0020 +0020 +1020 +7C20 +C63C +8220 +8220 +C620 +3C2C +0030 +0020 +0020 +0020 +0020 +ENDCHAR +STARTCHAR C57D +ENCODING 50557 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0060 +1020 +1020 +6C24 +8238 +8220 +C620 +383C +0020 +3FE0 +0020 +0020 +0020 +0020 +0020 +ENDCHAR +STARTCHAR C580 +ENCODING 50560 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0060 +0020 +1020 +7820 +863C +8220 +8220 +4420 +382C +0030 +0020 +1820 +0800 +0800 +0FF0 +ENDCHAR +STARTCHAR C584 +ENCODING 50564 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0060 +1020 +7C20 +C62C +8230 +8220 +C624 +3C38 +0000 +1FE0 +0020 +0020 +1FE0 +0800 +0FF0 +ENDCHAR +STARTCHAR C587 +ENCODING 50567 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0040 +1020 +7C20 +C624 +8238 +8220 +4620 +3C3C +0330 +7D10 +05F0 +6D10 +3110 +23F0 +3D10 +ENDCHAR +STARTCHAR C58C +ENCODING 50572 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 16 2 -3 +BITMAP +0060 +0020 +1020 +6C24 +8238 +8220 +C220 +7C3C +0020 +0000 +1FE0 +0820 +0820 +0840 +0FE0 +0800 +ENDCHAR +STARTCHAR C58D +ENCODING 50573 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 16 2 -3 +BITMAP +0060 +1020 +7C20 +C62C +8230 +8220 +C62C +3C30 +0000 +1820 +0820 +0FE0 +0820 +0820 +0FE0 +0820 +ENDCHAR +STARTCHAR C58F +ENCODING 50575 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 2 -1 +BITMAP +0060 +1020 +3020 +4C20 +8238 +8220 +4620 +382C +0330 +01A0 +0100 +0280 +0460 +1810 +ENDCHAR +STARTCHAR C591 +ENCODING 50577 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0040 +1020 +3020 +4C20 +823C +8220 +C420 +382C +0030 +0120 +06C0 +0820 +0820 +0C60 +07C0 +ENDCHAR +STARTCHAR C595 +ENCODING 50581 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0060 +0020 +7C20 +C63C +8220 +8220 +C62C +3C30 +0020 +1FF0 +0800 +0800 +0FE0 +0800 +0FF0 +ENDCHAR +STARTCHAR C597 +ENCODING 50583 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0060 +0020 +0020 +7C20 +C63C +8220 +C620 +7C20 +003C +03A0 +3F40 +0180 +0640 +0440 +0380 +ENDCHAR +STARTCHAR C598 +ENCODING 50584 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0190 +0090 +0090 +1090 +68F0 +8490 +8490 +CCF0 +7890 +0090 +0090 +0090 +0090 +0010 +ENDCHAR +STARTCHAR C59C +ENCODING 50588 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0060 +0190 +0090 +1090 +68F0 +8490 +8490 +CCF0 +7890 +0090 +0090 +1810 +0800 +0800 +0FF8 +ENDCHAR +STARTCHAR C5A0 +ENCODING 50592 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0020 +0190 +1090 +7C90 +C6F0 +8290 +C690 +7CF0 +0080 +1FE0 +0020 +1FE0 +0800 +0800 +0FF0 +ENDCHAR +STARTCHAR C5A9 +ENCODING 50601 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0060 +0190 +1090 +7890 +84F0 +8490 +8490 +78F0 +0090 +0C90 +0410 +07F0 +0410 +0410 +07F0 +0410 +ENDCHAR +STARTCHAR C5B4 +ENCODING 50612 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0060 +0010 +0010 +0810 +7C10 +C610 +8210 +83F0 +4610 +3C10 +0010 +0010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR C5B5 +ENCODING 50613 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0060 +1010 +3810 +C610 +8210 +83F0 +C610 +3C10 +0010 +0000 +3FE0 +1020 +0020 +0020 +0020 +ENDCHAR +STARTCHAR C5B8 +ENCODING 50616 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0060 +0010 +0810 +7C10 +C610 +8330 +82D0 +4610 +3C10 +0010 +1010 +0810 +0800 +0800 +0FF8 +ENDCHAR +STARTCHAR C5B9 +ENCODING 50617 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0810 +7C10 +C610 +83F0 +8310 +4610 +3C10 +0010 +4030 +23C0 +20C0 +20A0 +3D10 +0600 +ENDCHAR +STARTCHAR C5BB +ENCODING 50619 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +1010 +3810 +4610 +8210 +83F0 +C610 +3C10 +0010 +0000 +3FF0 +0800 +0800 +0800 +0FF8 +ENDCHAR +STARTCHAR C5BC +ENCODING 50620 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0010 +7C10 +8210 +83F0 +C610 +7C10 +0010 +3FE0 +0020 +0020 +1FE0 +0800 +0800 +0FF8 +ENDCHAR +STARTCHAR C5BD +ENCODING 50621 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0070 +0810 +3C10 +4610 +83F0 +8310 +C610 +3C10 +0010 +0000 +3CF0 +0410 +3810 +2010 +3C10 +ENDCHAR +STARTCHAR C5BE +ENCODING 50622 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 16 2 -3 +BITMAP +0070 +0810 +3C10 +4310 +83F0 +8310 +4210 +3C10 +0010 +3C00 +05F8 +6D30 +3130 +2330 +3DF0 +0100 +ENDCHAR +STARTCHAR C5C4 +ENCODING 50628 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0070 +1010 +7810 +8610 +8230 +83D0 +4610 +3C10 +0010 +0000 +1FE0 +0820 +0820 +0820 +0FE0 +0800 +ENDCHAR +STARTCHAR C5C5 +ENCODING 50629 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0070 +1010 +3810 +C610 +8210 +83F0 +C610 +3C10 +0010 +1C30 +0420 +07E0 +0420 +0420 +07E0 +0420 +ENDCHAR +STARTCHAR C5C6 +ENCODING 50630 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +1010 +6E10 +8210 +83F0 +C610 +3C10 +0010 +4400 +2420 +3C20 +2460 +2450 +3C88 +2500 +ENDCHAR +STARTCHAR C5C7 +ENCODING 50631 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0810 +7C10 +C610 +8210 +83F0 +4610 +3C10 +0010 +0190 +0110 +0380 +0660 +0810 +1008 +ENDCHAR +STARTCHAR C5C8 +ENCODING 50632 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0060 +1010 +7C10 +C610 +82F0 +8310 +C610 +3C10 +0010 +0820 +0820 +0860 +1650 +2288 +4108 +ENDCHAR +STARTCHAR C5C9 +ENCODING 50633 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0070 +1010 +3810 +C610 +8210 +83F0 +C610 +3C10 +0010 +0090 +0340 +0420 +0420 +0660 +03C0 +ENDCHAR +STARTCHAR C5CA +ENCODING 50634 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +7C10 +8210 +83F0 +C610 +7C10 +0010 +0000 +3FF0 +0100 +0300 +06C0 +0830 +3010 +ENDCHAR +STARTCHAR C5CC +ENCODING 50636 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0810 +7C10 +C610 +83F0 +8310 +4610 +3C10 +0010 +00F0 +1F30 +00E0 +3F20 +0040 +0040 +ENDCHAR +STARTCHAR C5CE +ENCODING 50638 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 14 2 -1 +BITMAP +0030 +0810 +7C10 +C610 +83F0 +8210 +4610 +3C10 +0030 +1FF0 +0060 +0440 +0440 +3FF8 +ENDCHAR +STARTCHAR C5D0 +ENCODING 50640 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +0190 +1090 +3890 +C490 +8490 +8790 +4490 +3890 +0090 +0090 +0090 +0090 +0010 +ENDCHAR +STARTCHAR C5D1 +ENCODING 50641 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0030 +0190 +1090 +6890 +8490 +8790 +C490 +7890 +0090 +0000 +1FF0 +0810 +0010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR C5D4 +ENCODING 50644 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0030 +0190 +0090 +1090 +6C90 +8490 +8790 +C490 +7890 +0090 +0090 +0C10 +0400 +0408 +03FC +ENDCHAR +STARTCHAR C5D8 +ENCODING 50648 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0190 +1090 +6890 +8490 +8790 +C490 +7890 +0FE0 +0020 +0020 +1FE0 +0800 +0800 +0FF0 +ENDCHAR +STARTCHAR C5E0 +ENCODING 50656 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0070 +0010 +0090 +1090 +6890 +8490 +8790 +C490 +7890 +0080 +0FF0 +0410 +0420 +0420 +07F0 +0400 +ENDCHAR +STARTCHAR C5E1 +ENCODING 50657 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0060 +01B0 +1090 +6890 +8490 +8790 +C490 +7890 +0090 +0C30 +0420 +07E0 +0420 +0420 +07E0 +0420 +ENDCHAR +STARTCHAR C5E3 +ENCODING 50659 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0110 +0090 +1090 +6C90 +8490 +8790 +C490 +7890 +0390 +0090 +0180 +0240 +0430 +1810 +ENDCHAR +STARTCHAR C5E5 +ENCODING 50661 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0070 +0190 +1090 +7890 +8490 +8490 +8790 +4C90 +3090 +0080 +0340 +0420 +0420 +0660 +03C0 +ENDCHAR +STARTCHAR C5EC +ENCODING 50668 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0070 +0010 +0010 +1010 +7D70 +C690 +8210 +8210 +C7F0 +3C10 +0010 +0010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR C5ED +ENCODING 50669 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -3 +BITMAP +1060 +3010 +4C10 +82F0 +8210 +C610 +7DF0 +0010 +0010 +3FE0 +1020 +0020 +0020 +0020 +0020 +ENDCHAR +STARTCHAR C5EE +ENCODING 50670 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0030 +0010 +1010 +6CF0 +8210 +8210 +C7F0 +7C10 +0000 +01F0 +7C10 +0410 +0410 +0410 +0410 +0400 +ENDCHAR +STARTCHAR C5F0 +ENCODING 50672 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0010 +1010 +6DF0 +8210 +8210 +C610 +7CF0 +0010 +0010 +1010 +0800 +0800 +0800 +0FF8 +ENDCHAR +STARTCHAR C5F4 +ENCODING 50676 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +1010 +3010 +4CF0 +8210 +8210 +C7F0 +7C10 +0380 +0C60 +0020 +1FE0 +0800 +0800 +0FF8 +ENDCHAR +STARTCHAR C5F6 +ENCODING 50678 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0060 +0030 +1010 +6C10 +8270 +8210 +C610 +7DF0 +0010 +3DF0 +0530 +6D30 +3130 +2330 +3DF0 +0100 +ENDCHAR +STARTCHAR C5F7 +ENCODING 50679 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +1010 +6CF0 +8210 +8210 +C6F0 +7C10 +0010 +7D10 +09F0 +7D10 +2110 +25F0 +3910 +ENDCHAR +STARTCHAR C5FC +ENCODING 50684 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +1010 +3810 +44F0 +8210 +8210 +C610 +7CF0 +0010 +0000 +0FE0 +0820 +0820 +0FE0 +0800 +ENDCHAR +STARTCHAR C5FD +ENCODING 50685 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0030 +0010 +3010 +4CF0 +8210 +8210 +C2F0 +7C10 +0000 +0C70 +0420 +07E0 +0420 +0420 +07E0 +0420 +ENDCHAR +STARTCHAR C5FE +ENCODING 50686 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0030 +1010 +6C10 +82F0 +8210 +C610 +7CF0 +0010 +6200 +2230 +3E20 +2220 +2250 +3E88 +2304 +ENDCHAR +STARTCHAR C5FF +ENCODING 50687 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +1010 +7C10 +C6F0 +8210 +8210 +C7F0 +3C10 +0010 +0110 +0100 +0280 +0460 +0810 +3008 +ENDCHAR +STARTCHAR C600 +ENCODING 50688 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +1010 +3810 +44F0 +8210 +8210 +C7F0 +3C10 +0000 +0820 +0C20 +0C60 +1250 +2298 +4108 +ENDCHAR +STARTCHAR C601 +ENCODING 50689 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +1010 +1010 +6DF0 +8210 +8210 +C7F0 +3C10 +0010 +0080 +0340 +0420 +0420 +0660 +03C0 +ENDCHAR +STARTCHAR C605 +ENCODING 50693 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +1010 +3810 +C6F0 +8210 +8210 +C6F0 +3C10 +0000 +1FF0 +0800 +0800 +0FE0 +0800 +0FF0 +ENDCHAR +STARTCHAR C606 +ENCODING 50694 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +1010 +3810 +46F0 +8210 +8210 +C7F0 +7C10 +0000 +0000 +1FF0 +0440 +0440 +0040 +3FF8 +ENDCHAR +STARTCHAR C607 +ENCODING 50695 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +1010 +6DF0 +8210 +8210 +C7F0 +7C10 +0390 +0000 +1FF0 +0100 +06C0 +0440 +0380 +ENDCHAR +STARTCHAR C608 +ENCODING 50696 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0390 +0090 +1090 +7890 +C790 +8490 +8490 +C490 +7B90 +0090 +0090 +0090 +0090 +0010 +ENDCHAR +STARTCHAR C60C +ENCODING 50700 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0030 +0090 +1090 +7890 +C790 +8490 +8490 +C790 +7890 +0090 +0090 +0C10 +0400 +0400 +03FC +ENDCHAR +STARTCHAR C610 +ENCODING 50704 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0110 +1090 +7890 +8790 +8490 +C490 +7B90 +0080 +1FE0 +0020 +1FE0 +0800 +0800 +0FF0 +ENDCHAR +STARTCHAR C618 +ENCODING 50712 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0030 +0190 +1090 +7890 +8790 +8490 +C490 +7B90 +0090 +0000 +0FF0 +0410 +0420 +0420 +07F0 +0400 +ENDCHAR +STARTCHAR C619 +ENCODING 50713 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0030 +0190 +1090 +7890 +8790 +8490 +C490 +7B90 +0090 +0810 +0410 +07F0 +0410 +0410 +07F0 +0410 +ENDCHAR +STARTCHAR C61B +ENCODING 50715 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0070 +0190 +1090 +7890 +8790 +8490 +8490 +CF90 +7890 +0090 +0190 +0180 +0340 +0430 +1810 +ENDCHAR +STARTCHAR C61C +ENCODING 50716 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 16 2 -3 +BITMAP +0030 +0190 +1090 +7890 +8790 +8490 +C490 +7B90 +0090 +0040 +0420 +0C60 +0E60 +1298 +2108 +4000 +ENDCHAR +STARTCHAR C624 +ENCODING 50724 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 12 1 0 +BITMAP +0100 +07C0 +0C60 +0820 +0820 +0820 +0440 +0380 +0300 +0100 +0100 +FFFE +ENDCHAR +STARTCHAR C625 +ENCODING 50725 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 16 1 -3 +BITMAP +0100 +07C0 +0C60 +0820 +0820 +0460 +0380 +0100 +FFFE +0000 +3FE0 +0020 +0020 +0020 +0020 +0020 +ENDCHAR +STARTCHAR C628 +ENCODING 50728 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0200 +0F80 +18C0 +1040 +1040 +0880 +0700 +0200 +FFFC +0000 +2000 +1000 +1000 +1000 +1FF0 +ENDCHAR +STARTCHAR C62C +ENCODING 50732 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -2 +BITMAP +0100 +0380 +0440 +0820 +0820 +0440 +0380 +0104 +FFFE +0000 +1FE0 +0020 +0FE0 +0800 +0FF0 +ENDCHAR +STARTCHAR C62D +ENCODING 50733 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 16 1 -2 +BITMAP +0100 +0380 +0FC0 +0820 +0820 +0820 +06C0 +0104 +FFFE +0000 +3EF0 +0210 +3610 +1810 +1110 +1E10 +ENDCHAR +STARTCHAR C62E +ENCODING 50734 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +0100 +06C0 +0820 +0820 +0C60 +0380 +0100 +FFFE +0000 +3EF8 +0290 +1C90 +16F0 +0880 +ENDCHAR +STARTCHAR C630 +ENCODING 50736 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +0100 +06C0 +0820 +0820 +0C60 +07C0 +0100 +FFFE +1E20 +0220 +3660 +1858 +1688 +1900 +ENDCHAR +STARTCHAR C633 +ENCODING 50739 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -2 +BITMAP +0100 +07C0 +0C60 +0820 +0820 +0440 +0380 +FFFE +0000 +3E60 +03F8 +36C0 +18B0 +1690 +08F0 +ENDCHAR +STARTCHAR C634 +ENCODING 50740 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 16 1 -3 +BITMAP +0100 +0380 +0C40 +0820 +0820 +0440 +0380 +0104 +FFFE +0000 +1FF0 +0820 +0820 +0820 +0FE0 +0800 +ENDCHAR +STARTCHAR C635 +ENCODING 50741 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 16 1 -3 +BITMAP +0100 +0380 +0C60 +0820 +0820 +0440 +0380 +0106 +FFF8 +1820 +0820 +0FE0 +0820 +0820 +0FE0 +0820 +ENDCHAR +STARTCHAR C637 +ENCODING 50743 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -2 +BITMAP +0100 +07C0 +0C60 +0820 +0820 +0440 +0380 +0104 +FFFE +0000 +0100 +0100 +02C0 +0430 +1810 +ENDCHAR +STARTCHAR C639 +ENCODING 50745 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -2 +BITMAP +0100 +0380 +0C60 +0820 +0820 +06C0 +0100 +0104 +FFFE +0100 +06C0 +0820 +0820 +0C60 +07C0 +ENDCHAR +STARTCHAR C63B +ENCODING 50747 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -2 +BITMAP +0100 +07C0 +0C60 +0820 +0820 +04C0 +0300 +FFFE +0000 +03C0 +0038 +1FC0 +0380 +0460 +1810 +ENDCHAR +STARTCHAR C640 +ENCODING 50752 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +00E0 +0020 +0820 +3620 +4120 +4120 +4120 +3E2C +0830 +09A0 +FE20 +0020 +0020 +0020 +0020 +ENDCHAR +STARTCHAR C641 +ENCODING 50753 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -2 +BITMAP +0030 +0010 +0E10 +3190 +2090 +3190 +1F1E +0410 +8FD0 +7000 +1FF0 +0010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR C644 +ENCODING 50756 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -2 +BITMAP +0030 +0410 +0E10 +3190 +3090 +3090 +1912 +061C +0470 +FF90 +0010 +0C10 +0400 +0400 +07F8 +ENDCHAR +STARTCHAR C648 +ENCODING 50760 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0060 +0820 +3E20 +6320 +4120 +222C +1C30 +0BA0 +F420 +1FE0 +0040 +0040 +1FE0 +0800 +0FF0 +ENDCHAR +STARTCHAR C650 +ENCODING 50768 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 16 1 -3 +BITMAP +0060 +0030 +0E10 +3190 +2090 +3090 +1F16 +0638 +8FD0 +7010 +0FF0 +0410 +0410 +0420 +07F0 +0400 +ENDCHAR +STARTCHAR C651 +ENCODING 50769 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 16 1 -3 +BITMAP +0060 +0430 +0E10 +3190 +2090 +3190 +1F1E +0430 +FFD0 +0C30 +0410 +07F0 +0410 +0410 +07F0 +0410 +ENDCHAR +STARTCHAR C653 +ENCODING 50771 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 16 2 -3 +BITMAP +0060 +0420 +1E20 +2120 +2120 +2120 +1E3C +04E0 +FF20 +0120 +0180 +0180 +0240 +0430 +0808 +1000 +ENDCHAR +STARTCHAR C654 +ENCODING 50772 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -2 +BITMAP +0030 +0410 +1F10 +2090 +2090 +3090 +0F1E +0450 +FF90 +0020 +0610 +0430 +0F30 +1948 +2084 +ENDCHAR +STARTCHAR C655 +ENCODING 50773 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 1 -2 +BITMAP +0030 +0410 +0E10 +3190 +2090 +3190 +1F1C +0630 +9FD0 +6050 +01E0 +0210 +0210 +0330 +01E0 +ENDCHAR +STARTCHAR C65C +ENCODING 50780 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0060 +0110 +0090 +1890 +6690 +4290 +4290 +2490 +18F0 +1190 +FE90 +0090 +0090 +0090 +0010 +ENDCHAR +STARTCHAR C65D +ENCODING 50781 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0060 +0190 +1090 +6C90 +4490 +6490 +38F0 +1390 +FC90 +0000 +1FF0 +0010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR C660 +ENCODING 50784 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 14 2 -2 +BITMAP +0130 +0890 +7490 +4290 +4490 +3C90 +10F0 +0F90 +F090 +0090 +0810 +0800 +0800 +0FF8 +ENDCHAR +STARTCHAR C66C +ENCODING 50796 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0060 +0190 +0090 +7C90 +4490 +4490 +3CF0 +1190 +FE90 +0000 +0FF0 +0420 +0420 +0420 +07F0 +0400 +ENDCHAR +STARTCHAR C66F +ENCODING 50799 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 14 2 -2 +BITMAP +0030 +0090 +3090 +4C90 +4490 +44F0 +3890 +1790 +E910 +0080 +0180 +0260 +0410 +1808 +ENDCHAR +STARTCHAR C671 +ENCODING 50801 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0060 +0190 +0090 +7C90 +4290 +4490 +38F0 +1190 +FE90 +0090 +0360 +0410 +0410 +0630 +03E0 +ENDCHAR +STARTCHAR C678 +ENCODING 50808 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0070 +0810 +0810 +3610 +4110 +4110 +2310 +1C10 +0810 +09D0 +FE10 +0010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR C679 +ENCODING 50809 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 11 16 3 -3 +BITMAP +0060 +1820 +6620 +4220 +4220 +2420 +1820 +0FE0 +F020 +0000 +3FE0 +0020 +0020 +0020 +0020 +0020 +ENDCHAR +STARTCHAR C67C +ENCODING 50812 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 3 -2 +BITMAP +0060 +0020 +3C20 +4220 +4220 +4220 +3C20 +1020 +0FA0 +F020 +0020 +1800 +0800 +0800 +0FF0 +ENDCHAR +STARTCHAR C680 +ENCODING 50816 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 3 -2 +BITMAP +0060 +0820 +7620 +4220 +4220 +2220 +1C20 +0FE0 +F020 +1FE0 +0040 +1FC0 +0800 +0800 +0FF0 +ENDCHAR +STARTCHAR C688 +ENCODING 50824 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0030 +0410 +3A10 +2110 +2110 +1210 +0C10 +0BF0 +FC10 +0000 +0FF0 +0410 +0420 +0420 +07F0 +0400 +ENDCHAR +STARTCHAR C689 +ENCODING 50825 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0030 +0C10 +3310 +2110 +2110 +1210 +0C10 +0BF0 +F410 +0810 +0410 +07F0 +0410 +0410 +07F0 +0410 +ENDCHAR +STARTCHAR C68B +ENCODING 50827 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 3 -2 +BITMAP +00C0 +0820 +3C20 +6620 +4220 +4220 +2420 +1860 +0FA0 +F020 +0320 +0300 +0480 +0860 +3010 +ENDCHAR +STARTCHAR C68D +ENCODING 50829 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 11 15 3 -2 +BITMAP +0060 +0820 +7620 +4220 +4220 +2420 +1820 +17E0 +E820 +0020 +0780 +0840 +0840 +0CC0 +0780 +ENDCHAR +STARTCHAR C694 +ENCODING 50836 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 13 1 -1 +BITMAP +0100 +0100 +06C0 +0820 +0820 +0820 +0440 +03C0 +0420 +0420 +0444 +FFFE +2000 +ENDCHAR +STARTCHAR C695 +ENCODING 50837 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -2 +BITMAP +0100 +07C0 +0C60 +0820 +0820 +0C40 +0FE0 +0420 +FFFE +0000 +3FE0 +0020 +0020 +0020 +0020 +ENDCHAR +STARTCHAR C698 +ENCODING 50840 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +0100 +06C0 +0820 +0820 +0C60 +0FC0 +0420 +FF3E +00C0 +0000 +0800 +0800 +0800 +0FF0 +ENDCHAR +STARTCHAR C69C +ENCODING 50844 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -2 +BITMAP +0100 +07C0 +0860 +0820 +0820 +07C0 +0460 +0440 +FFFE +0000 +1FE0 +0020 +1FE0 +0800 +0FF0 +ENDCHAR +STARTCHAR C6A4 +ENCODING 50852 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 16 1 -3 +BITMAP +0100 +07C0 +0820 +0820 +0820 +07C0 +0420 +0440 +FFFE +0000 +0FF0 +0410 +0420 +0420 +07F0 +0400 +ENDCHAR +STARTCHAR C6A5 +ENCODING 50853 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 16 1 -3 +BITMAP +0100 +07C0 +0820 +0820 +0820 +07C0 +0460 +044E +FFB0 +1820 +0820 +0FE0 +0820 +0820 +0FE0 +0820 +ENDCHAR +STARTCHAR C6A7 +ENCODING 50855 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +0100 +06C0 +0820 +0820 +0C60 +07C0 +0460 +0440 +FFFE +0100 +0100 +02C0 +0430 +1818 +ENDCHAR +STARTCHAR C6A9 +ENCODING 50857 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0200 +0F80 +18C0 +1040 +1040 +0880 +1FC0 +0888 +FFFC +0200 +0D80 +1040 +1040 +18C0 +0780 +ENDCHAR +STARTCHAR C6B0 +ENCODING 50864 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -3 +BITMAP +0100 +06C0 +0820 +0820 +0C60 +07C0 +0000 +FFFE +0100 +0100 +0100 +0100 +0100 +0100 +0100 +ENDCHAR +STARTCHAR C6B1 +ENCODING 50865 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -2 +BITMAP +0100 +07C0 +0C60 +0820 +0820 +0C60 +03C0 +0004 +FFFE +0100 +0120 +0EE0 +0020 +0020 +0020 +ENDCHAR +STARTCHAR C6B4 +ENCODING 50868 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 14 3 -2 +BITMAP +0200 +0F80 +1040 +1040 +1040 +0D80 +0200 +FFF8 +0200 +0200 +1200 +1200 +1000 +1FE0 +ENDCHAR +STARTCHAR C6B8 +ENCODING 50872 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -2 +BITMAP +0100 +07C0 +0860 +0820 +0820 +0440 +0384 +FFFE +0100 +0100 +0EE0 +0040 +1FE0 +0800 +0FF0 +ENDCHAR +STARTCHAR C6B9 +ENCODING 50873 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -2 +BITMAP +0100 +06C0 +0C20 +0820 +0460 +03C0 +0000 +FFFE +0100 +3F10 +0470 +3E10 +1010 +1310 +1C10 +ENDCHAR +STARTCHAR C6BA +ENCODING 50874 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -2 +BITMAP +0100 +06C0 +0820 +0820 +0C60 +07C0 +0000 +FFFE +0100 +1FF8 +04C8 +3E50 +1050 +1378 +1C00 +ENDCHAR +STARTCHAR C6C0 +ENCODING 50880 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -3 +BITMAP +07C0 +0820 +0820 +0660 +03C0 +F800 +07FE +0100 +1F00 +08E0 +0860 +0860 +0FE0 +0800 +ENDCHAR +STARTCHAR C6C1 +ENCODING 50881 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 16 1 -3 +BITMAP +0100 +06C0 +0820 +0820 +0C60 +07C0 +0004 +FFFE +0100 +1160 +0920 +0FE0 +0820 +0820 +0FE0 +0820 +ENDCHAR +STARTCHAR C6C3 +ENCODING 50883 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 2 -2 +BITMAP +0F80 +08C0 +1040 +0840 +0480 +0300 +FFFC +0200 +0200 +0200 +0200 +0580 +1860 +2000 +ENDCHAR +STARTCHAR C6C5 +ENCODING 50885 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -2 +BITMAP +0100 +03C0 +0420 +0420 +0420 +03C0 +0000 +FFFE +0100 +0100 +07C0 +0860 +0820 +0C60 +07C0 +ENDCHAR +STARTCHAR C6CC +ENCODING 50892 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0810 +1E10 +2110 +2110 +2110 +1E10 +0190 +FE10 +09F0 +0810 +0810 +0810 +0010 +0010 +ENDCHAR +STARTCHAR C6CD +ENCODING 50893 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0C10 +3310 +2110 +3110 +1E10 +0190 +FE30 +08D0 +0800 +1FF0 +0810 +0010 +0010 +0010 +ENDCHAR +STARTCHAR C6D0 +ENCODING 50896 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 1 -2 +BITMAP +0018 +0008 +0608 +1988 +1088 +1888 +0F08 +0188 +FE08 +0478 +0408 +0E08 +0200 +0200 +03FC +ENDCHAR +STARTCHAR C6D4 +ENCODING 50900 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0C10 +3310 +2110 +2110 +1E10 +0190 +FE70 +1FF0 +0010 +0020 +1FF0 +0800 +0800 +0FF0 +ENDCHAR +STARTCHAR C6DC +ENCODING 50908 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0030 +0C10 +3310 +2110 +2110 +1E10 +0190 +FEF0 +0810 +0800 +0FF0 +0410 +0420 +0420 +07F0 +0400 +ENDCHAR +STARTCHAR C6DD +ENCODING 50909 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0030 +0C10 +3310 +2110 +2110 +1E10 +0190 +FE70 +0890 +0830 +0410 +07F0 +0410 +0410 +07F0 +0410 +ENDCHAR +STARTCHAR C6E0 +ENCODING 50912 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0C10 +3310 +2110 +3110 +1E10 +0090 +FF10 +08F0 +0000 +0C20 +0420 +0A60 +1298 +6108 +ENDCHAR +STARTCHAR C6E1 +ENCODING 50913 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +1E10 +2110 +2110 +2110 +1E10 +0190 +FE10 +08F0 +0890 +03E0 +0610 +0410 +0630 +03C0 +ENDCHAR +STARTCHAR C6E8 +ENCODING 50920 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 1 -2 +BITMAP +0030 +0088 +0048 +0848 +3648 +2248 +3248 +1C48 +0348 +FC48 +09C8 +0848 +0848 +0048 +0008 +ENDCHAR +STARTCHAR C6E9 +ENCODING 50921 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0190 +7C90 +4290 +4490 +3C90 +0190 +FE90 +1790 +1080 +1FF0 +0010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR C6EC +ENCODING 50924 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0070 +0010 +0890 +3690 +4290 +2690 +1C90 +0290 +FC90 +0B90 +0090 +1C00 +0400 +0400 +07F8 +ENDCHAR +STARTCHAR C6F0 +ENCODING 50928 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0110 +0090 +7C90 +4490 +6490 +3C90 +0290 +FF90 +1FF0 +1020 +0FF0 +0400 +0400 +03F8 +ENDCHAR +STARTCHAR C6F8 +ENCODING 50936 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0030 +0110 +0090 +7C90 +4290 +4490 +3C90 +0190 +FF90 +1080 +1FF0 +0410 +0420 +0420 +07F0 +0400 +ENDCHAR +STARTCHAR C6F9 +ENCODING 50937 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0030 +0990 +7490 +4290 +4490 +3C90 +0190 +FE90 +1790 +1C90 +0410 +07F0 +0410 +0410 +07F0 +0410 +ENDCHAR +STARTCHAR C6FD +ENCODING 50941 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 1 -2 +BITMAP +0018 +0048 +0048 +3E48 +2248 +2248 +1E48 +00C8 +FF48 +0848 +09E0 +0210 +0210 +0210 +01E0 +ENDCHAR +STARTCHAR C704 +ENCODING 50948 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 11 15 3 -2 +BITMAP +0060 +0820 +3C20 +4220 +4220 +4220 +3C20 +0020 +01A0 +FE20 +0820 +0820 +0820 +0820 +0020 +ENDCHAR +STARTCHAR C705 +ENCODING 50949 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0C10 +3310 +2110 +3110 +1E10 +0070 +FF90 +0410 +0410 +1FF0 +0010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR C708 +ENCODING 50952 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0010 +1E10 +2110 +2110 +3110 +1E10 +00D0 +FF10 +0410 +0010 +0C00 +0400 +0400 +07F8 +ENDCHAR +STARTCHAR C70C +ENCODING 50956 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0C10 +3310 +2110 +3110 +1E10 +0190 +FE10 +0810 +0800 +1FE0 +1FE0 +0800 +0800 +0FF0 +ENDCHAR +STARTCHAR C714 +ENCODING 50964 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0030 +0C10 +3310 +2110 +3110 +1E10 +0070 +FF90 +0410 +0000 +0FF0 +0410 +0420 +0420 +07F0 +0400 +ENDCHAR +STARTCHAR C715 +ENCODING 50965 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0030 +1E10 +3110 +2110 +2110 +1E10 +00F0 +FF10 +0410 +0810 +0410 +07F0 +0410 +0410 +07F0 +0410 +ENDCHAR +STARTCHAR C717 +ENCODING 50967 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0020 +0010 +0C10 +3310 +2110 +3110 +1E10 +01D0 +FE10 +0510 +0480 +0180 +0240 +0430 +1808 +ENDCHAR +STARTCHAR C719 +ENCODING 50969 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0C10 +3310 +2110 +3110 +1E10 +00D0 +FF10 +0410 +0080 +0340 +0420 +0420 +0660 +03C0 +ENDCHAR +STARTCHAR C720 +ENCODING 50976 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -3 +BITMAP +0200 +0D80 +1040 +1040 +18C0 +0F80 +0000 +FFFC +4880 +0880 +0880 +0880 +0880 +0880 +0080 +ENDCHAR +STARTCHAR C721 +ENCODING 50977 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 14 2 -2 +BITMAP +0200 +0D80 +1040 +1040 +18C0 +0F80 +0008 +FFF0 +0880 +0FC0 +1040 +0040 +0040 +0040 +ENDCHAR +STARTCHAR C724 +ENCODING 50980 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 2 -2 +BITMAP +0200 +0D80 +1040 +1040 +18C0 +0F80 +001C +FFE4 +0840 +0840 +3040 +1000 +1000 +1FF0 +ENDCHAR +STARTCHAR C728 +ENCODING 50984 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0200 +0D80 +1040 +1040 +18C0 +0F80 +0000 +FFFC +0880 +0880 +3FC0 +0040 +3FC0 +1000 +1FE0 +ENDCHAR +STARTCHAR C730 +ENCODING 50992 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 16 2 -3 +BITMAP +0200 +0F80 +18C0 +1040 +1040 +0880 +0700 +FFFC +0880 +0880 +3FC0 +1040 +1080 +1080 +1FC0 +1000 +ENDCHAR +STARTCHAR C731 +ENCODING 50993 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 16 1 -3 +BITMAP +0100 +07C0 +0860 +0820 +0840 +06C0 +0104 +FFFA +0440 +1840 +0820 +0FE0 +0820 +0820 +0FE0 +0820 +ENDCHAR +STARTCHAR C733 +ENCODING 50995 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0200 +0F80 +18C0 +1040 +1040 +0880 +0700 +FFFC +0840 +0840 +0A40 +0240 +0580 +0860 +3030 +ENDCHAR +STARTCHAR C735 +ENCODING 50997 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 2 -2 +BITMAP +0200 +0D80 +1040 +1040 +18C0 +0780 +7800 +9FFC +1040 +0700 +18C0 +1040 +18C0 +0F80 +ENDCHAR +STARTCHAR C737 +ENCODING 50999 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 16 1 -3 +BITMAP +0100 +07C0 +0820 +0820 +0820 +06C0 +0100 +FFFE +0440 +0240 +0180 +1FF8 +0100 +03C0 +0430 +3800 +ENDCHAR +STARTCHAR C73C +ENCODING 51004 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 11 1 0 +BITMAP +0100 +0EC0 +1020 +1020 +1020 +0840 +0780 +0000 +0000 +0000 +FFFE +ENDCHAR +STARTCHAR C73D +ENCODING 51005 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -3 +BITMAP +0200 +1D80 +1040 +1040 +18C0 +0780 +0000 +FFFC +0000 +7FC0 +0040 +0040 +0040 +0040 +0040 +ENDCHAR +STARTCHAR C740 +ENCODING 51008 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +0100 +06C0 +0820 +0820 +0820 +07C0 +0004 +FFFE +2000 +0000 +1800 +0800 +0800 +0FF8 +ENDCHAR +STARTCHAR C744 +ENCODING 51012 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 1 -2 +BITMAP +0100 +06C0 +0820 +0820 +0C60 +07C0 +FE00 +01FC +0000 +1FE0 +0020 +1FE0 +0800 +0FF0 +ENDCHAR +STARTCHAR C74A +ENCODING 51018 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0200 +0F80 +10C0 +1040 +1040 +0D80 +0208 +FFFC +0000 +0270 +7DC0 +0920 +7D20 +2140 +3BF8 +ENDCHAR +STARTCHAR C74C +ENCODING 51020 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +0100 +0EC0 +0820 +0820 +0C60 +07C0 +0000 +FFFE +0000 +0FF0 +0820 +0820 +0FE0 +0800 +ENDCHAR +STARTCHAR C74D +ENCODING 51021 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -3 +BITMAP +0200 +0D80 +1040 +1040 +18C0 +0F80 +0000 +FFFC +1840 +0840 +0FC0 +0840 +0840 +0FC0 +0840 +ENDCHAR +STARTCHAR C74F +ENCODING 51023 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -2 +BITMAP +0100 +0300 +04C0 +0820 +0820 +0C60 +03C0 +0004 +FFFE +0000 +0100 +0100 +02C0 +0430 +1810 +ENDCHAR +STARTCHAR C751 +ENCODING 51025 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +0100 +06C0 +0820 +0820 +0C60 +07C0 +0004 +FFFE +2100 +07C0 +0C60 +0820 +0C60 +07C0 +ENDCHAR +STARTCHAR C752 +ENCODING 51026 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 16 1 -3 +BITMAP +0100 +07C0 +0860 +0820 +0820 +0440 +0380 +FFFE +0000 +0000 +3FF8 +0100 +0300 +06C0 +0C30 +3018 +ENDCHAR +STARTCHAR C753 +ENCODING 51027 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -2 +BITMAP +0100 +06C0 +0840 +0820 +0C40 +0780 +0000 +FFFE +0000 +03C0 +0038 +1FC0 +0380 +0660 +1810 +ENDCHAR +STARTCHAR C754 +ENCODING 51028 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 14 2 -2 +BITMAP +0200 +0D80 +1040 +1040 +1880 +0F00 +0000 +FFF8 +0000 +1FE0 +0060 +7FC0 +0040 +0080 +ENDCHAR +STARTCHAR C755 +ENCODING 51029 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 1 -2 +BITMAP +0100 +06C0 +0820 +0820 +0C40 +0780 +FC00 +03FC +0FE0 +0800 +0800 +0FE0 +0800 +0FF0 +ENDCHAR +STARTCHAR C756 +ENCODING 51030 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +0100 +06C0 +0820 +0820 +0C60 +07C0 +0000 +FFFE +0000 +1FE0 +0440 +0240 +0080 +3FF8 +ENDCHAR +STARTCHAR C757 +ENCODING 51031 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -2 +BITMAP +0100 +06C0 +0820 +0820 +0C40 +07C0 +0000 +FFFE +0000 +03C0 +1FF8 +0100 +06C0 +0640 +03C0 +ENDCHAR +STARTCHAR C758 +ENCODING 51032 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +0810 +3E10 +4110 +4110 +4110 +3E10 +0010 +01D0 +FE10 +0010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR C75C +ENCODING 51036 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0410 +1A10 +2110 +2110 +3310 +1E10 +0010 +01F0 +FE10 +0010 +0C10 +0400 +0400 +03F8 +ENDCHAR +STARTCHAR C760 +ENCODING 51040 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 3 -2 +BITMAP +0060 +0020 +1C20 +6220 +4220 +4620 +3C20 +03E0 +FC20 +1FE0 +0020 +0040 +1FE0 +0800 +0FF0 +ENDCHAR +STARTCHAR C768 +ENCODING 51048 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 11 15 3 -2 +BITMAP +0060 +0020 +3820 +4620 +4220 +4620 +3C20 +03E0 +FC20 +1FE0 +0820 +0840 +0840 +0FE0 +0800 +ENDCHAR +STARTCHAR C76B +ENCODING 51051 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 3 -3 +BITMAP +0060 +0020 +1820 +6620 +4220 +4220 +3C20 +0020 +03E0 +FE20 +0320 +0300 +04C0 +1820 +2010 +4000 +ENDCHAR +STARTCHAR C774 +ENCODING 51060 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +0010 +0010 +7C10 +C610 +8210 +8210 +C610 +3C10 +0010 +0010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR C775 +ENCODING 51061 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0060 +0010 +1010 +6C10 +8210 +8210 +C610 +7C10 +0000 +01E0 +1E20 +0020 +0020 +0020 +0020 +ENDCHAR +STARTCHAR C778 +ENCODING 51064 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +1010 +3810 +C410 +8210 +8210 +C610 +3C10 +0010 +3010 +0800 +0800 +0800 +0FF0 +ENDCHAR +STARTCHAR C77C +ENCODING 51068 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +1010 +6C10 +8210 +8210 +C610 +3C10 +0010 +1FF0 +0020 +0020 +1FF0 +0800 +0800 +0FF8 +ENDCHAR +STARTCHAR C77D +ENCODING 51069 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +0810 +7410 +8210 +8210 +C610 +7C10 +0000 +7DE0 +0420 +4C20 +3020 +2220 +3C20 +ENDCHAR +STARTCHAR C77E +ENCODING 51070 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +1010 +6C10 +8210 +8210 +C610 +7C10 +0000 +7FF0 +0520 +6D20 +3120 +23E0 +3D00 +ENDCHAR +STARTCHAR C783 +ENCODING 51075 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 3 -2 +BITMAP +0060 +1020 +F820 +8420 +8420 +8420 +7820 +0000 +F9C0 +0FF0 +9880 +6360 +4620 +7A20 +01C0 +ENDCHAR +STARTCHAR C784 +ENCODING 51076 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0030 +1010 +1010 +6C10 +8210 +8210 +C610 +3C10 +0010 +0000 +1FE0 +0820 +0820 +0820 +0FE0 +0800 +ENDCHAR +STARTCHAR C785 +ENCODING 51077 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +1010 +6C10 +8210 +8210 +C610 +3C10 +0010 +1810 +0810 +0FF0 +0810 +0810 +0FF0 +0810 +ENDCHAR +STARTCHAR C787 +ENCODING 51079 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +1010 +1010 +6C10 +8210 +8210 +C610 +3C10 +0010 +0310 +0180 +0100 +02C0 +0430 +1810 +ENDCHAR +STARTCHAR C788 +ENCODING 51080 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 3 -2 +BITMAP +0060 +0020 +1020 +6C20 +8220 +8220 +C420 +7820 +0000 +1040 +0840 +18C0 +24A0 +4110 +8600 +ENDCHAR +STARTCHAR C789 +ENCODING 51081 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +1010 +3810 +C410 +8210 +8210 +4610 +3810 +0010 +0100 +06C0 +0820 +0820 +0C60 +07C0 +ENDCHAR +STARTCHAR C78A +ENCODING 51082 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +1010 +7C10 +C610 +8210 +8210 +4410 +3810 +0030 +3FC0 +0100 +0280 +0460 +1830 +6000 +ENDCHAR +STARTCHAR C78E +ENCODING 51086 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 14 2 -1 +BITMAP +0030 +1010 +7C10 +8210 +8210 +8210 +4410 +3810 +0000 +1FE0 +0840 +0440 +0480 +3FF8 +ENDCHAR +STARTCHAR C790 +ENCODING 51088 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -2 +BITMAP +0060 +0010 +0010 +7F10 +0110 +0210 +0610 +0416 +0A18 +1190 +6090 +8010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR C791 +ENCODING 51089 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 16 2 -3 +BITMAP +0080 +0060 +0020 +7F20 +0220 +0420 +083C +1620 +2120 +C020 +3FE0 +0020 +0020 +0020 +0020 +0020 +ENDCHAR +STARTCHAR C794 +ENCODING 51092 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0080 +0060 +0020 +7F20 +0320 +0220 +042C +0B30 +11A0 +60A0 +8820 +0420 +0400 +0408 +07FC +ENDCHAR +STARTCHAR C796 +ENCODING 51094 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0080 +0060 +7E20 +0620 +0420 +0C3C +1320 +6120 +81F0 +6F80 +20C0 +2320 +2620 +3B20 +01C0 +ENDCHAR +STARTCHAR C797 +ENCODING 51095 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0060 +0020 +7F20 +0220 +0420 +083C +1620 +2120 +C020 +0020 +1FE0 +0800 +0800 +0810 +0FF0 +ENDCHAR +STARTCHAR C798 +ENCODING 51096 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +00C0 +0020 +7E20 +0620 +0420 +0C20 +133C +6120 +8020 +1FE0 +0040 +1FE0 +0800 +0800 +0FF0 +ENDCHAR +STARTCHAR C79A +ENCODING 51098 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0060 +0020 +7F20 +0220 +0420 +083C +1620 +2120 +C000 +3DF0 +0520 +6D20 +3120 +23E0 +3D00 +ENDCHAR +STARTCHAR C7A0 +ENCODING 51104 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 16 2 -3 +BITMAP +00C0 +0020 +FE20 +0620 +0420 +0820 +1638 +2120 +C020 +0000 +1FE0 +0820 +0840 +0840 +0FE0 +0800 +ENDCHAR +STARTCHAR C7A1 +ENCODING 51105 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 3 -3 +BITMAP +00C0 +0040 +FE40 +0440 +0840 +1878 +3440 +4240 +B040 +1040 +1FC0 +1040 +1040 +1FC0 +1040 +ENDCHAR +STARTCHAR C7A3 +ENCODING 51107 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +00C0 +0020 +FE20 +0620 +0420 +0820 +163C +6120 +8020 +0120 +01A0 +0380 +0240 +0C30 +1008 +ENDCHAR +STARTCHAR C7A4 +ENCODING 51108 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +00C0 +0020 +7F20 +0220 +0420 +0C24 +1338 +2120 +C020 +0860 +0C20 +0840 +1670 +2298 +4108 +ENDCHAR +STARTCHAR C7A5 +ENCODING 51109 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0060 +0020 +7F20 +0220 +0420 +083C +1620 +2120 +C020 +0080 +0340 +0420 +0420 +0660 +03C0 +ENDCHAR +STARTCHAR C7A6 +ENCODING 51110 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0080 +0060 +7F20 +0220 +0420 +0C2C +1330 +2120 +C000 +1FF0 +0100 +0100 +06C0 +0830 +1010 +ENDCHAR +STARTCHAR C7AC +ENCODING 51116 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0060 +0010 +0190 +0090 +FC90 +0490 +0890 +0890 +18F0 +2490 +4690 +8090 +0090 +0090 +0090 +0010 +ENDCHAR +STARTCHAR C7AD +ENCODING 51117 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0030 +0110 +0090 +FC90 +0C90 +0890 +10F0 +2C90 +4690 +8090 +1FF0 +0010 +0010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR C7B0 +ENCODING 51120 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0010 +0090 +0090 +FC90 +0C90 +0890 +10F0 +2C90 +4290 +8090 +1890 +0800 +0800 +0FF8 +ENDCHAR +STARTCHAR C7B4 +ENCODING 51124 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0090 +0090 +7C90 +0890 +0890 +18F0 +2490 +C290 +0000 +1FE0 +0020 +1FE0 +0800 +0FF0 +ENDCHAR +STARTCHAR C7BC +ENCODING 51132 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 16 1 -3 +BITMAP +0018 +00C8 +0048 +3E48 +0648 +0448 +0C78 +1248 +2148 +C048 +07F8 +0208 +0210 +0210 +03F8 +0200 +ENDCHAR +STARTCHAR C7BD +ENCODING 51133 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 1 -2 +BITMAP +0018 +0048 +0048 +3E48 +0648 +0478 +0C48 +1348 +2100 +C608 +0208 +03F8 +0208 +03F8 +0208 +ENDCHAR +STARTCHAR C7BF +ENCODING 51135 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0190 +0090 +7C90 +0890 +0890 +18F0 +2690 +C290 +0190 +0190 +0180 +0240 +0430 +1808 +ENDCHAR +STARTCHAR C7C0 +ENCODING 51136 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 1 -2 +BITMAP +0030 +0098 +0048 +3E48 +0648 +0448 +0C78 +1348 +6148 +8258 +0210 +0630 +0928 +1044 +2084 +ENDCHAR +STARTCHAR C7C1 +ENCODING 51137 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 1 -2 +BITMAP +0018 +00C8 +0048 +7E48 +0648 +0448 +0C78 +1248 +2148 +C048 +01A0 +0210 +0210 +0330 +01E0 +ENDCHAR +STARTCHAR C7C8 +ENCODING 51144 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -2 +BITMAP +0030 +0010 +0010 +7F90 +0110 +021E +0210 +0410 +0B10 +109E +2050 +C010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR C7C9 +ENCODING 51145 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 16 2 -3 +BITMAP +0060 +0020 +7F20 +0224 +0438 +0820 +1620 +213C +C020 +0000 +3FE0 +0020 +0020 +0020 +0020 +0020 +ENDCHAR +STARTCHAR C7CC +ENCODING 51148 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -2 +BITMAP +0030 +0010 +0010 +3F90 +011E +0210 +0610 +0910 +1096 +2058 +C810 +0410 +0400 +0400 +07F8 +ENDCHAR +STARTCHAR C7CE +ENCODING 51150 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0060 +0020 +7E20 +0620 +043C +0820 +1620 +213C +C020 +01E0 +67F8 +20C0 +2120 +2510 +3920 +ENDCHAR +STARTCHAR C7D0 +ENCODING 51152 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0060 +0020 +7E20 +062C +0430 +0C20 +1324 +6138 +8000 +1FE0 +0020 +1FE0 +0800 +0800 +0FF0 +ENDCHAR +STARTCHAR C7D8 +ENCODING 51160 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 16 2 -3 +BITMAP +0060 +0020 +FE20 +0224 +0438 +0C20 +1220 +213C +C020 +0000 +1FE0 +0820 +0840 +0840 +0FE0 +0800 +ENDCHAR +STARTCHAR C7DD +ENCODING 51165 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0060 +0020 +7F20 +0220 +0438 +0820 +1620 +212C +C030 +0100 +06C0 +0820 +0820 +0C60 +03C0 +ENDCHAR +STARTCHAR C7E4 +ENCODING 51172 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0190 +0090 +0090 +FC90 +04F0 +0890 +0890 +1890 +24F0 +4490 +8090 +0090 +0090 +0010 +ENDCHAR +STARTCHAR C7E8 +ENCODING 51176 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 14 2 -1 +BITMAP +0030 +0190 +0090 +0C90 +34F0 +0890 +1890 +1490 +66F0 +9A90 +0890 +0810 +0800 +07F8 +ENDCHAR +STARTCHAR C7EC +ENCODING 51180 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 1 -2 +BITMAP +0020 +0098 +0048 +3E48 +0478 +0C48 +0C48 +1378 +6148 +8FF8 +0008 +0010 +0FF8 +0400 +07FC +ENDCHAR +STARTCHAR C800 +ENCODING 51200 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 1 -2 +BITMAP +0018 +0008 +0008 +7F88 +0108 +0308 +02F8 +0408 +0A08 +1188 +2088 +C008 +0008 +0008 +0008 +ENDCHAR +STARTCHAR C801 +ENCODING 51201 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +7F10 +0210 +0410 +08F0 +1610 +2310 +4110 +BFE0 +0020 +0020 +0020 +0020 +0020 +ENDCHAR +STARTCHAR C804 +ENCODING 51204 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 1 -2 +BITMAP +0018 +0008 +0008 +3F88 +0108 +02F8 +0608 +0A08 +1108 +2088 +C808 +0408 +0400 +0400 +07FC +ENDCHAR +STARTCHAR C808 +ENCODING 51208 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +7E10 +0610 +05F0 +0810 +1610 +6310 +8100 +1FE0 +0020 +1FE0 +0800 +0800 +0FF0 +ENDCHAR +STARTCHAR C80A +ENCODING 51210 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +7E10 +0210 +05F0 +0810 +1610 +6310 +8100 +7FF0 +0530 +6D30 +3130 +23F0 +3D00 +ENDCHAR +STARTCHAR C810 +ENCODING 51216 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 11 15 3 -2 +BITMAP +0060 +0020 +FE20 +0420 +0820 +11E0 +2820 +4620 +8220 +0000 +1FC0 +1040 +1040 +1FC0 +1000 +ENDCHAR +STARTCHAR C811 +ENCODING 51217 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0030 +0010 +FF10 +0210 +0410 +08F0 +1410 +2310 +4100 +8C10 +0410 +07F0 +0410 +0410 +07F0 +0410 +ENDCHAR +STARTCHAR C813 +ENCODING 51219 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0020 +0010 +7F10 +0210 +0410 +08F0 +1610 +6310 +8010 +0110 +0190 +0180 +0240 +0C30 +1008 +ENDCHAR +STARTCHAR C815 +ENCODING 51221 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 1 -2 +BITMAP +0030 +0010 +7F90 +0110 +0210 +04F0 +0A10 +1110 +2090 +C040 +01A0 +0210 +0210 +0330 +01E0 +ENDCHAR +STARTCHAR C816 +ENCODING 51222 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +7E10 +0210 +0410 +08F0 +1610 +2310 +4110 +BFF0 +0100 +0100 +02C0 +0430 +1810 +ENDCHAR +STARTCHAR C81C +ENCODING 51228 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0040 +0030 +0190 +0090 +FC90 +0490 +0890 +1B90 +1890 +2490 +4490 +8090 +0090 +0090 +0010 +0010 +ENDCHAR +STARTCHAR C81D +ENCODING 51229 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0030 +0110 +0090 +7C90 +0890 +1090 +3B90 +4490 +8090 +0080 +1FF0 +0010 +0010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR C820 +ENCODING 51232 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0310 +0090 +FC90 +0C90 +0890 +1790 +2890 +4490 +8090 +0090 +0810 +0800 +0800 +07F8 +ENDCHAR +STARTCHAR C824 +ENCODING 51236 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0110 +0090 +FC90 +0890 +0890 +1390 +2890 +4490 +9FF0 +0020 +1FF0 +0C00 +0400 +07F8 +ENDCHAR +STARTCHAR C82C +ENCODING 51244 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0030 +0110 +0090 +7C90 +0890 +1090 +2B90 +4490 +8090 +0080 +07F0 +0410 +0410 +0420 +07F0 +0400 +ENDCHAR +STARTCHAR C82D +ENCODING 51245 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 16 1 -3 +BITMAP +0018 +0088 +0048 +3E48 +0448 +0848 +19C8 +1648 +6248 +8448 +0208 +03F8 +0208 +0208 +03F8 +0208 +ENDCHAR +STARTCHAR C82F +ENCODING 51247 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0190 +0090 +3C90 +0C90 +0890 +1B90 +2490 +4490 +8110 +0180 +0180 +0240 +0430 +1808 +ENDCHAR +STARTCHAR C831 +ENCODING 51249 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0190 +0090 +7C90 +0890 +1090 +2B90 +4490 +8490 +0090 +0360 +0410 +0410 +0630 +03E0 +ENDCHAR +STARTCHAR C838 +ENCODING 51256 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0070 +0010 +0010 +FF10 +0210 +04F0 +0C10 +0810 +15F0 +2210 +4310 +8010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR C83C +ENCODING 51260 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0070 +0010 +7F10 +03F0 +0410 +0810 +1410 +22F0 +C210 +0010 +1010 +0800 +0800 +0800 +07F8 +ENDCHAR +STARTCHAR C840 +ENCODING 51264 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0010 +7F10 +02F0 +0410 +0810 +16F0 +6110 +8000 +1FE0 +0020 +0020 +0FE0 +0800 +0FF8 +ENDCHAR +STARTCHAR C848 +ENCODING 51272 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 16 1 -3 +BITMAP +0018 +0008 +3F08 +0378 +0208 +0408 +0A78 +1108 +6108 +87F8 +0208 +0210 +0210 +0210 +03F8 +0200 +ENDCHAR +STARTCHAR C849 +ENCODING 51273 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 16 1 -3 +BITMAP +0018 +0008 +3F08 +0378 +0208 +0408 +0A78 +1108 +6100 +8408 +0208 +03F8 +0208 +0208 +03F8 +0208 +ENDCHAR +STARTCHAR C84C +ENCODING 51276 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0010 +7E10 +02F0 +0410 +0810 +14F0 +2210 +C200 +1820 +0C20 +0820 +1650 +2298 +4108 +ENDCHAR +STARTCHAR C84D +ENCODING 51277 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 1 -2 +BITMAP +0018 +0008 +3F88 +0178 +0208 +0608 +0A78 +1188 +2088 +C040 +01B0 +0208 +0208 +0110 +00E0 +ENDCHAR +STARTCHAR C854 +ENCODING 51284 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 16 1 -3 +BITMAP +0020 +0018 +00C8 +0048 +7E48 +07C8 +0448 +0C48 +0FC8 +1248 +2248 +C048 +0048 +0048 +0008 +0008 +ENDCHAR +STARTCHAR C870 +ENCODING 51312 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 11 1 0 +BITMAP +3FF0 +0060 +00C0 +0180 +02C0 +0C3C +3000 +0100 +0100 +0100 +FFFE +ENDCHAR +STARTCHAR C871 +ENCODING 51313 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +3FF0 +0060 +0180 +06F0 +180C +E100 +0100 +FFFE +0000 +3FE0 +0020 +0020 +0020 +0020 +ENDCHAR +STARTCHAR C874 +ENCODING 51316 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 13 1 -1 +BITMAP +3FF0 +0040 +0180 +06F8 +1804 +2100 +0104 +FFFE +0000 +1800 +0800 +0800 +0FF8 +ENDCHAR +STARTCHAR C878 +ENCODING 51320 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +3FF0 +0060 +0180 +06F8 +1904 +2100 +FFFE +0000 +1FF0 +0020 +1FF0 +0800 +0800 +0FF8 +ENDCHAR +STARTCHAR C87A +ENCODING 51322 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -3 +BITMAP +1FF0 +0060 +0180 +02C0 +1C3C +2100 +0100 +FFFE +0000 +1E80 +02F8 +3E90 +1090 +1670 +0800 +ENDCHAR +STARTCHAR C880 +ENCODING 51328 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -3 +BITMAP +3FF0 +0060 +0080 +03F0 +0D0C +3100 +C1FE +FF00 +0000 +1FE0 +0820 +0820 +0840 +0FE0 +0800 +ENDCHAR +STARTCHAR C881 +ENCODING 51329 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +3FF0 +0060 +0080 +03C0 +1D3C +2100 +017E +FF80 +1820 +0820 +0FE0 +0820 +0FE0 +0820 +ENDCHAR +STARTCHAR C883 +ENCODING 51331 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 2 -2 +BITMAP +3FE0 +00C0 +0300 +0580 +3878 +4200 +0200 +FFFC +0000 +0200 +0600 +0D80 +1060 +6010 +ENDCHAR +STARTCHAR C885 +ENCODING 51333 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +3FF0 +0040 +0180 +06F8 +1800 +2100 +0104 +FFFE +0000 +03C0 +0460 +0C20 +0460 +03C0 +ENDCHAR +STARTCHAR C886 +ENCODING 51334 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -3 +BITMAP +1FF0 +0060 +0180 +02C0 +1C3C +2100 +0100 +FFFE +0000 +1FF8 +0100 +0380 +0660 +0810 +3000 +ENDCHAR +STARTCHAR C887 +ENCODING 51335 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -3 +BITMAP +3FF0 +0060 +0180 +06F0 +1900 +2100 +FFFE +0000 +07C0 +3FF8 +0100 +0280 +0470 +1808 +2000 +ENDCHAR +STARTCHAR C88B +ENCODING 51339 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +3FF0 +0040 +0180 +0F78 +3100 +01FE +FF00 +0380 +0000 +3FF8 +0100 +06C0 +0440 +0380 +ENDCHAR +STARTCHAR C88C +ENCODING 51340 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 16 15 1 -2 +BITMAP +0030 +0010 +3F90 +0110 +0210 +0610 +19D0 +201F +0210 +0210 +87D0 +7810 +0010 +0010 +0010 +ENDCHAR +STARTCHAR C88D +ENCODING 51341 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 16 2 -3 +BITMAP +0060 +0020 +7F20 +0320 +0C20 +3FE4 +C8F8 +FF20 +0020 +0000 +3FE0 +0020 +0020 +0020 +0020 +0020 +ENDCHAR +STARTCHAR C894 +ENCODING 51348 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0060 +0020 +7F20 +0220 +0C20 +3BAC +CB70 +F420 +0000 +1FE0 +0020 +1FE0 +0800 +0800 +0FF8 +ENDCHAR +STARTCHAR C89D +ENCODING 51357 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0060 +0020 +7F20 +0220 +0C20 +3BBC +CB60 +F420 +0000 +1820 +0820 +0FE0 +0820 +0FE0 +0820 +ENDCHAR +STARTCHAR C89F +ENCODING 51359 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0060 +0020 +7F20 +0220 +0C20 +33A0 +C838 +09E0 +F620 +0120 +0180 +0180 +0260 +0C10 +1000 +ENDCHAR +STARTCHAR C8A1 +ENCODING 51361 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0060 +0020 +7F20 +0220 +0C20 +3BBC +C8E0 +FF20 +0020 +0100 +06C0 +0820 +0820 +0C60 +07C0 +ENDCHAR +STARTCHAR C8A8 +ENCODING 51368 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0060 +0110 +0090 +7E90 +0490 +0890 +1490 +6390 +98F0 +1090 +1F90 +E090 +0090 +0090 +0010 +ENDCHAR +STARTCHAR C8BC +ENCODING 51388 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 1 -2 +BITMAP +0098 +0248 +3E48 +0C48 +13C8 +7878 +0848 +FFC8 +2030 +0210 +0210 +0528 +08C4 +1084 +ENDCHAR +STARTCHAR C8BD +ENCODING 51389 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 14 1 -2 +BITMAP +0098 +0248 +3E48 +0C48 +13C8 +7878 +0848 +FFC8 +2028 +00F0 +0108 +0108 +0188 +00F0 +ENDCHAR +STARTCHAR C8C4 +ENCODING 51396 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0060 +0010 +0010 +7F90 +0310 +0610 +0C10 +33D0 +C410 +0410 +07D0 +F810 +0010 +0010 +0010 +ENDCHAR +STARTCHAR C8C8 +ENCODING 51400 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0010 +7F90 +0310 +0610 +0B90 +3C10 +4430 +FFD0 +2010 +0010 +0C00 +0400 +0400 +07F8 +ENDCHAR +STARTCHAR C8CC +ENCODING 51404 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 3 -2 +BITMAP +0060 +0020 +FE20 +0420 +0820 +3720 +C820 +0FE0 +F020 +1FE0 +0020 +0040 +1FE0 +0800 +0FF0 +ENDCHAR +STARTCHAR C8D4 +ENCODING 51412 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +7F10 +0210 +0C10 +3FD0 +C410 +07F0 +7810 +0000 +0FF0 +0410 +0420 +07F0 +0400 +ENDCHAR +STARTCHAR C8D5 +ENCODING 51413 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -3 +BITMAP +0030 +7F10 +0210 +0C10 +3390 +CC10 +0410 +07F0 +7860 +0820 +0FE0 +0820 +0820 +0FE0 +0820 +ENDCHAR +STARTCHAR C8D7 +ENCODING 51415 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +7F10 +0210 +0410 +1F90 +6C10 +8470 +FF90 +0010 +0180 +0100 +02C0 +0430 +1810 +ENDCHAR +STARTCHAR C8D9 +ENCODING 51417 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +7F10 +0210 +0410 +1F90 +6C10 +8470 +FF90 +0090 +0360 +0410 +0410 +0630 +03E0 +ENDCHAR +STARTCHAR C8E0 +ENCODING 51424 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 11 1 0 +BITMAP +1FF0 +0020 +0040 +0180 +02C0 +0C3C +3000 +0420 +0420 +0440 +FFFE +ENDCHAR +STARTCHAR C8E1 +ENCODING 51425 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -3 +BITMAP +1FF0 +0060 +0180 +03F8 +1C6C +2460 +0440 +FFFE +0000 +1FF0 +0010 +0010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR C8E4 +ENCODING 51428 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 13 1 -1 +BITMAP +3FF0 +0040 +0180 +07C0 +183C +6840 +0440 +0440 +FFFE +0800 +0800 +0800 +0FF8 +ENDCHAR +STARTCHAR C8F5 +ENCODING 51445 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +3FF0 +0040 +0180 +06F8 +1860 +2440 +0440 +FFFE +0000 +07C0 +0420 +0C20 +0460 +03C0 +ENDCHAR +STARTCHAR C8FC +ENCODING 51452 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -3 +BITMAP +3FE0 +0040 +0080 +0380 +0C78 +7000 +000C +FFFE +0100 +0100 +0100 +0100 +0100 +0100 +0100 +ENDCHAR +STARTCHAR C8FD +ENCODING 51453 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +1FF0 +0060 +0080 +03F8 +1C04 +2004 +FFFE +0100 +0100 +3FE0 +0020 +0020 +0020 +0020 +ENDCHAR +STARTCHAR C900 +ENCODING 51456 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +3FF0 +0060 +00C0 +0380 +0C7C +7000 +0004 +FFFE +0100 +0100 +1900 +0900 +0900 +0FF8 +ENDCHAR +STARTCHAR C904 +ENCODING 51460 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +1FF0 +0060 +0080 +03F8 +1C04 +2000 +FFFE +0100 +1F00 +00E0 +0020 +1FE0 +0800 +0FF0 +ENDCHAR +STARTCHAR C905 +ENCODING 51461 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +1FF0 +0060 +0080 +0378 +1C04 +2000 +FFFE +0100 +1FF8 +0208 +3608 +1808 +1108 +1E08 +ENDCHAR +STARTCHAR C906 +ENCODING 51462 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +1FF0 +0060 +0080 +0378 +1C04 +2000 +FFFE +0100 +1FF8 +02C8 +36C8 +18D0 +1150 +1E78 +ENDCHAR +STARTCHAR C90C +ENCODING 51468 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -3 +BITMAP +3FF0 +0060 +0180 +06F8 +1804 +2000 +FFFE +0100 +0100 +1F20 +08E0 +0820 +0820 +0FE0 +0800 +ENDCHAR +STARTCHAR C90D +ENCODING 51469 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -3 +BITMAP +1FF0 +0060 +0180 +06F0 +180C +2004 +FFFE +0100 +1960 +0920 +0FE0 +0820 +0820 +0FE0 +0820 +ENDCHAR +STARTCHAR C90F +ENCODING 51471 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -3 +BITMAP +3FF0 +0060 +0080 +03C0 +0C3C +7004 +FFFE +0100 +0100 +0300 +0300 +06C0 +0830 +1008 +2000 +ENDCHAR +STARTCHAR C911 +ENCODING 51473 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +1FF0 +0060 +0080 +03F0 +1C0C +2000 +FC00 +03FE +0100 +0700 +08C0 +0820 +0C60 +07C0 +ENDCHAR +STARTCHAR C918 +ENCODING 51480 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +7F10 +0310 +0410 +0F90 +3050 +C010 +03D0 +7C10 +04F0 +0410 +0410 +0410 +0010 +ENDCHAR +STARTCHAR C92C +ENCODING 51500 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0010 +7F10 +0210 +0C10 +1390 +E310 +FC10 +04F0 +0060 +0420 +0420 +0A50 +1088 +2100 +ENDCHAR +STARTCHAR C934 +ENCODING 51508 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0090 +0050 +7E50 +0450 +0850 +3650 +C050 +0650 +7850 +09D0 +0850 +0850 +0050 +0010 +ENDCHAR +STARTCHAR C950 +ENCODING 51536 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +7F10 +0310 +0410 +0F90 +3050 +C010 +03D0 +7C10 +0410 +0410 +0410 +0410 +0010 +ENDCHAR +STARTCHAR C951 +ENCODING 51537 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0070 +0010 +7F10 +0210 +0C10 +33D0 +C0F0 +FF10 +0410 +0410 +1FF0 +0010 +0010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR C954 +ENCODING 51540 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 1 -2 +BITMAP +0018 +0008 +3F88 +0108 +0208 +0FC8 +3008 +C7F8 +7A08 +0208 +0008 +0C08 +0400 +0400 +07FC +ENDCHAR +STARTCHAR C958 +ENCODING 51544 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0020 +0010 +7F10 +0210 +0C10 +1390 +E7F0 +7C10 +0000 +0060 +0FA0 +0020 +1FE0 +0800 +0FF0 +ENDCHAR +STARTCHAR C960 +ENCODING 51552 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0060 +0010 +7F10 +0210 +0C10 +33D0 +C010 +0FF0 +7410 +0410 +0FF0 +0410 +0420 +0420 +07F0 +0400 +ENDCHAR +STARTCHAR C961 +ENCODING 51553 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0030 +0010 +7F10 +0210 +0410 +1BD0 +6070 +FF90 +0410 +1810 +0410 +07F0 +0410 +0410 +07F0 +0410 +ENDCHAR +STARTCHAR C963 +ENCODING 51555 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0010 +7F90 +0310 +0410 +1BD0 +E3B0 +7C10 +0410 +0510 +0180 +0100 +02C0 +0430 +1808 +ENDCHAR +STARTCHAR C96C +ENCODING 51564 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -3 +BITMAP +7FC0 +0080 +0100 +0700 +18F8 +E000 +0008 +FFF8 +0880 +0880 +0880 +0880 +0880 +0880 +0080 +ENDCHAR +STARTCHAR C970 +ENCODING 51568 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +1FF0 +0020 +00C0 +0180 +067C +3800 +FFFE +0440 +0440 +0440 +0840 +0800 +0800 +0FF8 +ENDCHAR +STARTCHAR C974 +ENCODING 51572 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 2 -2 +BITMAP +3FE0 +00C0 +0180 +0200 +1DF8 +E000 +FFFC +0880 +3FC0 +0040 +3FC0 +1000 +1000 +1FE0 +ENDCHAR +STARTCHAR C97C +ENCODING 51580 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 14 2 -2 +BITMAP +3FE0 +0080 +0300 +0CF8 +F000 +0000 +FFF8 +0880 +0840 +3FC0 +1080 +1080 +1FC0 +1000 +ENDCHAR +STARTCHAR C988 +ENCODING 51592 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 10 2 0 +BITMAP +7FE0 +0040 +0080 +0300 +0580 +1870 +E000 +0000 +0000 +FFFC +ENDCHAR +STARTCHAR C989 +ENCODING 51593 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -3 +BITMAP +3FF0 +0060 +0180 +0380 +1C78 +2000 +FFFE +0000 +0000 +3FE0 +0020 +0020 +0020 +0020 +0020 +ENDCHAR +STARTCHAR C98C +ENCODING 51596 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 13 1 -1 +BITMAP +1FF0 +0060 +0080 +03C0 +1C3C +2000 +0004 +FFFE +1000 +0800 +0800 +0810 +0FF8 +ENDCHAR +STARTCHAR C990 +ENCODING 51600 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 13 1 -1 +BITMAP +3FF0 +0060 +0180 +06F8 +1804 +2004 +FFFE +0000 +1FE0 +0020 +1FE0 +0800 +0FF0 +ENDCHAR +STARTCHAR C998 +ENCODING 51608 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -3 +BITMAP +3FE0 +00C0 +0100 +0780 +3878 +4000 +FFFC +0000 +0000 +3FC0 +1040 +1040 +1080 +1FC0 +1000 +ENDCHAR +STARTCHAR C999 +ENCODING 51609 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +1FF0 +0060 +0180 +0378 +1C0C +2004 +FFFE +0000 +1820 +0820 +0FE0 +0820 +0FE0 +0820 +ENDCHAR +STARTCHAR C99B +ENCODING 51611 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 2 -2 +BITMAP +3FE0 +00C0 +0100 +0780 +3878 +4000 +0000 +FFFC +0600 +0200 +0700 +0C80 +1060 +6010 +ENDCHAR +STARTCHAR C99D +ENCODING 51613 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +33F0 +1C20 +00C0 +0300 +0CF8 +7000 +FFFE +0000 +0100 +06C0 +0840 +0860 +0440 +0380 +ENDCHAR +STARTCHAR C9C0 +ENCODING 51648 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0070 +0010 +0010 +FF10 +0210 +0610 +0C10 +0C10 +3210 +4190 +8090 +0010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR C9C1 +ENCODING 51649 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 11 15 3 -2 +BITMAP +0060 +0020 +FE20 +0420 +0C20 +1820 +3420 +4320 +8020 +3FE0 +1020 +0020 +0020 +0020 +0020 +ENDCHAR +STARTCHAR C9C4 +ENCODING 51652 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 1 -2 +BITMAP +0030 +0008 +0008 +3F88 +0108 +0308 +0608 +0D08 +1088 +2048 +C808 +0400 +0400 +0400 +03FC +ENDCHAR +STARTCHAR C9C7 +ENCODING 51655 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 11 15 3 -2 +BITMAP +00C0 +0060 +FE20 +0620 +0420 +0820 +1420 +2320 +C120 +0040 +3FC0 +1000 +1000 +1000 +1FE0 +ENDCHAR +STARTCHAR C9C8 +ENCODING 51656 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +7F10 +0210 +0610 +0C10 +1B90 +2090 +C000 +1FE0 +0020 +1FE0 +0800 +0800 +0FF0 +ENDCHAR +STARTCHAR C9CA +ENCODING 51658 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 16 2 -3 +BITMAP +0030 +0010 +0010 +7F10 +0210 +0610 +0C10 +1310 2080 +FC00 +04F8 +6C90 +3090 +2290 +3CF8 +0080 +ENDCHAR +STARTCHAR C9D0 +ENCODING 51664 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 11 16 3 -3 +BITMAP +0060 +0020 +FE20 +0620 +0420 +0820 +1420 +6320 +8020 +0000 +0FE0 +0820 +0820 +0840 +0FE0 +0800 +ENDCHAR +STARTCHAR C9D1 +ENCODING 51665 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0030 +0010 +7F10 +0210 +0610 +0C10 +1E20 +2100 +C000 +1860 +0820 +0FE0 +0820 +0820 +0FE0 +0820 +ENDCHAR +STARTCHAR C9D3 +ENCODING 51667 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0010 +0010 +7F10 +0210 +0410 +0C10 +1210 +2190 +C110 +0080 +0180 +0240 +0430 +1818 +ENDCHAR +STARTCHAR C9D5 +ENCODING 51669 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +7F10 +0210 +0610 +0C10 +1B10 +2190 +4010 +8090 +0360 +0410 +0410 +0630 +03E0 +ENDCHAR +STARTCHAR C9D6 +ENCODING 51670 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0010 +0010 +7F10 +0210 +0410 +0C10 +1390 2080 -FBE0 +C070 +1F80 +0180 +0240 +0C30 +1008 +ENDCHAR +STARTCHAR C9D9 +ENCODING 51673 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +7F10 +0210 +0610 +0C10 +1A10 +2190 +4000 +9FE0 +0800 +0FE0 +0800 +0800 +0FF0 +ENDCHAR +STARTCHAR C9DA +ENCODING 51674 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 14 2 -1 +BITMAP +0030 +0010 +7F10 +0210 +0610 +0C10 +1310 +2190 +C000 +3FF0 +0840 +0440 +0480 +7FF8 +ENDCHAR +STARTCHAR C9DC +ENCODING 51676 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0040 +0020 +0020 +FFA0 +1120 +2120 +3220 +4F2C +84B0 +08A0 +1020 +0020 +0020 +0020 +0020 +ENDCHAR +STARTCHAR C9DD +ENCODING 51677 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 16 2 -3 +BITMAP +0060 +0020 +0020 +7F20 +3120 +3224 +4D38 +88A0 +1020 +0000 +3FE0 +1020 +0020 +0020 +0020 +0020 +ENDCHAR +STARTCHAR C9E0 +ENCODING 51680 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0060 +0020 +0020 +7FA0 +1120 +3320 +4B2C +84B0 +08A0 +1020 +1020 +0820 +0800 +0800 +0FF0 +ENDCHAR +STARTCHAR C9E2 +ENCODING 51682 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0060 +0020 +99A0 +7720 +1120 +3220 +4DB8 +88A0 +1020 +21C0 +2070 +2380 +2160 +2520 +3920 +ENDCHAR +STARTCHAR C9E4 +ENCODING 51684 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0060 +0020 +FBA0 +1520 +3220 +2B3C +4CA0 +88A0 +1000 +1FE0 +0040 +1FE0 +0800 +0800 +0FF0 +ENDCHAR +STARTCHAR C9E7 +ENCODING 51687 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -2 +BITMAP +0030 +0010 +7FD0 +0C90 +0890 +159E +6250 +8430 +1B90 +0490 +02F0 +3E90 +1090 +11F0 +1E90 +ENDCHAR +STARTCHAR C9EC +ENCODING 51692 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 16 1 -3 +BITMAP +0030 +0010 +0010 +3FD0 +0890 +1916 +2798 +4250 +8410 +0800 +0FF0 +0420 +0420 +0420 +07F0 +0400 +ENDCHAR +STARTCHAR C9ED +ENCODING 51693 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 16 2 -3 +BITMAP +0060 +0020 +79A0 +1F20 +1120 +2B2C +4CB0 +8820 +1000 +2C20 +0420 +07E0 +0420 +0420 +07E0 +0420 +ENDCHAR +STARTCHAR C9EF +ENCODING 51695 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0060 +0020 +0020 +FFA0 +1120 +322C +4B30 +84A0 +0820 +1120 +0180 +0100 +02C0 +0C30 +1008 +ENDCHAR +STARTCHAR C9F0 +ENCODING 51696 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0060 +0020 +7FA0 +1120 +3320 +2B24 +4CB8 +88A0 +1000 +0840 +0420 +0C40 +1AE0 +2090 +4108 +ENDCHAR +STARTCHAR C9F1 +ENCODING 51697 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 3 -2 +BITMAP +00C0 +0040 +0040 +7F40 +2240 +3258 +5660 +8940 +10C0 +2140 +0680 +0840 +0840 +0CC0 +0780 +ENDCHAR +STARTCHAR C9F8 +ENCODING 51704 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 1 -2 +BITMAP +0030 +0048 +0028 +0028 +3F28 +1128 +1228 +2A28 +4538 +88A8 +1028 +0028 +0028 +0028 +0008 +ENDCHAR +STARTCHAR C9F9 +ENCODING 51705 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 16 1 -3 +BITMAP +0030 +00C8 +0048 +3FC8 +0948 +1248 +2A78 +45C8 +88C8 +1048 +0FF8 +0008 +0008 +0008 +0008 +0008 +ENDCHAR +STARTCHAR C9FC +ENCODING 51708 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 1 -2 +BITMAP +0018 +0048 +0048 +7F48 +1B48 +1248 +2E78 +4548 +88C8 +1048 +2048 +0C48 +0400 +0400 +03F8 +ENDCHAR +STARTCHAR CA00 +ENCODING 51712 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0110 +0090 +7E90 +2290 +2490 +56F0 +8990 +1090 +0FF0 +0010 +0020 +0FF0 +0400 +07F8 +ENDCHAR +STARTCHAR CA08 +ENCODING 51720 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0020 +0110 +0090 +7E90 +3290 +2490 +56F0 +8990 +1090 +0090 +07F0 +0420 +0420 +0420 +07E0 +0400 +ENDCHAR +STARTCHAR CA09 +ENCODING 51721 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0030 +00D0 +0050 +7F50 +1250 +2450 +5670 +8950 +1150 +0810 +0410 +07F0 +0410 +0410 +07F0 +0410 +ENDCHAR +STARTCHAR CA0B +ENCODING 51723 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 1 -2 +BITMAP +0018 +00C8 +0048 +7FC8 +0948 +1348 +2A78 +45C8 +88C8 +1048 +0040 +00C0 +0130 +0208 +0C04 +ENDCHAR +STARTCHAR CA0C +ENCODING 51724 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 16 2 -3 +BITMAP +0030 +00D0 +0050 +7F50 +1250 +2650 +5670 +8950 +1150 +0050 +0C20 +0C40 +0C60 +1298 +2108 +4000 +ENDCHAR +STARTCHAR CA0D +ENCODING 51725 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 1 -2 +BITMAP +0018 +0068 +0028 +3FA8 +0928 +1328 +2B38 +44A8 +88A8 +0000 +01E0 +0210 +0210 +0330 +01E0 +ENDCHAR +STARTCHAR CA14 +ENCODING 51732 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -2 +BITMAP +0030 +0010 +0010 +4C50 +3FD0 +089E +1990 +2590 +4650 +845E +0810 +1010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR CA18 +ENCODING 51736 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0060 +0020 +0020 +7FA0 +113C +3120 +2B20 +44A0 +88BC +1020 +1020 +0820 +0800 +0800 +0FF0 +ENDCHAR +STARTCHAR CA29 +ENCODING 51753 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0060 +0020 +0020 +7F20 +1138 +3220 +4D20 +88AC +10B0 +2100 +06C0 +0820 +0820 +0C60 +03C0 +ENDCHAR +STARTCHAR CA4C +ENCODING 51788 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0060 +0030 +0010 +7FD0 +0890 +1090 +1910 +2570 +4290 +8450 +0850 +1010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR CA4D +ENCODING 51789 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 1 -3 +BITMAP +0018 +0088 +3F88 +0888 +1908 +26B8 +4248 +8448 +0008 +0FF8 +0408 +0008 +0008 +0008 +0008 +ENDCHAR +STARTCHAR CA50 +ENCODING 51792 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0010 +FF90 +1110 +2110 +32F0 +4E10 +8910 +1090 +2010 +1010 +0810 +0800 +0800 +0FF8 +ENDCHAR +STARTCHAR CA54 +ENCODING 51796 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +FF90 +1110 +2110 +3A70 +4D90 +8890 +1000 +3FE0 +0020 +1FE0 +0800 +0800 +0FF0 +ENDCHAR +STARTCHAR CA5C +ENCODING 51804 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0030 +0010 +FF90 +1110 +3310 +3270 +4D10 +8890 +1010 +0000 +1FE0 +0820 +0820 +0840 +0FE0 +0800 +ENDCHAR +STARTCHAR CA5D +ENCODING 51805 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0030 +0010 +7F90 +1110 +2210 +3A70 +4D10 +8890 +1010 +0C60 +0420 +07E0 +0420 +0420 +07E0 +0420 +ENDCHAR +STARTCHAR CA5F +ENCODING 51807 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0010 +FB90 +1510 +1110 +3270 +4D10 +8890 +1090 +0110 +0100 +0380 +0660 +0810 +1008 +ENDCHAR +STARTCHAR CA60 +ENCODING 51808 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0010 +FF90 +1190 +3110 +2A70 +4B10 +8490 +0800 +0860 +0420 +0C60 +1290 +2118 +4208 +ENDCHAR +STARTCHAR CA61 +ENCODING 51809 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +FF90 +1110 +3310 +3270 +4D10 +8890 +1010 +0090 +03C0 +0420 +0420 +0420 +03C0 +ENDCHAR +STARTCHAR CA68 +ENCODING 51816 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0090 +0050 +0050 +7E50 +2250 +2450 +55D0 +9C50 +1250 +1250 +2050 +0050 +0050 +0010 +ENDCHAR +STARTCHAR CA7D +ENCODING 51837 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 1 -2 +BITMAP +0018 +0068 +0028 +3F28 +0928 +1AE8 +2B28 +44A8 +8828 +1028 +00D0 +0108 +0108 +0198 +00F0 +ENDCHAR +STARTCHAR CA84 +ENCODING 51844 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 1 -2 +BITMAP +0030 +0010 +0010 +3FD0 +08F0 +1090 +1D10 +26F0 +4290 +8450 +0850 +1010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR CA98 +ENCODING 51864 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0010 +FF90 +11F0 +3110 +2A10 +4B30 +8490 +0810 +0860 +0420 +0C40 +12B0 +2118 +4208 +ENDCHAR +STARTCHAR CABC +ENCODING 51900 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 11 1 0 +BITMAP +7FF8 +0410 +0C20 +0A60 +13D8 +610C +8200 +0500 +0100 +0100 +FFFE +ENDCHAR +STARTCHAR CABD +ENCODING 51901 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +3F30 +04E0 +0C40 +12B8 +6104 +0700 +0100 +FFFE +2000 +3FE0 +1020 +0020 +0020 +0020 +ENDCHAR +STARTCHAR CAC0 +ENCODING 51904 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +3EF0 +0630 +0460 +1B9C +2100 +0780 +0100 +FFFE +2000 +0000 +0800 +0800 +0800 +07F8 +ENDCHAR +STARTCHAR CAC4 +ENCODING 51908 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 2 -2 +BITMAP +7DE0 +0C40 +1880 +2578 +C600 +0100 +FFFC +0000 +3FC0 +0040 +3FC0 +1000 +1000 +1FE0 +ENDCHAR +STARTCHAR CACC +ENCODING 51916 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +2210 +1E70 +0C60 +12F0 +210C +0700 +0100 +FFFE +0000 +0FE0 +0820 +0840 +0FC0 +0800 +ENDCHAR +STARTCHAR CACD +ENCODING 51917 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +2210 +1E70 +0460 +1AF0 +210C +0700 +0100 +FFFE +0C60 +0420 +07E0 +0420 +07E0 +0420 +ENDCHAR +STARTCHAR CACF +ENCODING 51919 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +3210 +0E70 +0C60 +12F0 +210C +0700 +0100 +FFFE +0180 +0100 +0380 +0660 +0810 +3008 +ENDCHAR +STARTCHAR CAD1 +ENCODING 51921 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +1E10 +0470 +0A20 +11F0 +210C +0700 +0100 +FFFE +0080 +03C0 +0420 +0420 +0420 +03C0 +ENDCHAR +STARTCHAR CAD3 +ENCODING 51923 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 2 -2 +BITMAP +7DE0 +0C40 +1C80 +2378 +C600 +0200 +FFFC +0000 +0700 +7FF0 +0200 +0700 +08E0 +7010 +ENDCHAR +STARTCHAR CAD8 +ENCODING 51928 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -2 +BITMAP +0030 +0010 +7FD0 +0890 +1990 +2590 +4250 +8416 +0A18 +02F0 +7D10 +0010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR CAD9 +ENCODING 51929 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 16 1 -3 +BITMAP +0030 +0010 +7F90 +1990 +2B10 +44D6 +0E18 +0470 +FF90 +0000 +1FF0 +0010 +0010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR CAE0 +ENCODING 51936 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -2 +BITMAP +0020 +0010 +7FD0 +0890 +1990 +2670 +C61E +1AF0 +0790 +7FF0 +0010 +0FF0 +0400 +0400 +07F8 +ENDCHAR +STARTCHAR CAEC +ENCODING 51948 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -2 +BITMAP +0020 +0010 +7FD0 +0890 +1990 +2670 +C616 +1AF8 +0790 +7820 +0210 +0210 +0530 +0848 +3084 +ENDCHAR +STARTCHAR CAF4 +ENCODING 51956 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0020 +0090 +0050 +FF50 +1350 +2250 +5F50 +8850 +1870 +0850 +1FD0 +6050 +0050 +0050 +0010 +ENDCHAR +STARTCHAR CB08 +ENCODING 51976 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 2 -2 +BITMAP +0030 +00D0 +7F50 +2250 +5750 +88F0 +1450 +07D0 +7870 +0620 +0420 +0B58 +1188 +6104 +ENDCHAR +STARTCHAR CB10 +ENCODING 51984 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +FFD0 +1890 +1110 +2B10 +44D0 +0C10 +1410 +04F0 +FB10 +0010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR CB14 +ENCODING 51988 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 3 -2 +BITMAP +0060 +0020 +FFA0 +1120 +3320 +4CA0 +8C20 +34E0 +0F20 +F020 +0020 +1820 +0800 +0800 +0FF8 +ENDCHAR +STARTCHAR CB18 +ENCODING 51992 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 14 2 -1 +BITMAP +0060 +0010 +7F90 +0890 +1190 +2E50 +C610 +0EF0 +0790 +7FF0 +0020 +0FF0 +0400 +07F8 +ENDCHAR +STARTCHAR CB20 +ENCODING 52000 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +7F90 +0890 +1990 +2650 +C610 +0AF0 +0790 +7800 +0FF0 +0410 +0420 +07F0 +0400 +ENDCHAR +STARTCHAR CB21 +ENCODING 52001 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0C90 +3B90 +1110 +22D0 +C410 +0E10 +07F0 +7800 +0810 +0410 +07F0 +0410 +07F0 +0410 +ENDCHAR +STARTCHAR CB41 +ENCODING 52033 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 2 -2 +BITMAP +7C00 +09E0 +1C40 +65C0 +8238 +0D80 +0888 +FFFC +0200 +0F80 +18C0 +1040 +18C0 +0F80 +ENDCHAR +STARTCHAR CB48 +ENCODING 52040 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -3 +BITMAP +3E10 +06F0 +0420 +0A70 +308C +0300 +0004 +FFFE +0100 +0100 +0100 +0100 +0100 +0100 +0100 +ENDCHAR +STARTCHAR CB49 +ENCODING 52041 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +3EF0 +0420 +0C60 +12DC +2100 +4204 +FFFE +0100 +0100 +3FE0 +0020 +0020 +0020 +0020 +ENDCHAR +STARTCHAR CB4C +ENCODING 52044 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +3EF0 +0610 +0420 +1B78 +2184 +0200 +FFFE +0100 +0100 +0100 +1900 +0900 +0800 +07F8 +ENDCHAR +STARTCHAR CB50 +ENCODING 52048 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +3FF0 +0430 +0E60 +11D8 +6104 +0600 +FFFE +0100 +1F20 +00E0 +1FE0 +0800 +0800 +0FF0 +ENDCHAR +STARTCHAR CB58 +ENCODING 52056 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -3 +BITMAP +7DF0 +0C20 +0840 +34C0 +4338 +0208 +FFF4 +0200 +0200 +3FC0 +1040 +1040 +1040 +1FC0 +1000 +ENDCHAR +STARTCHAR CB59 +ENCODING 52057 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -3 +BITMAP +3EF0 +0610 +0C20 +1A50 +208C +0100 +FFFE +0100 +1960 +0920 +0FE0 +0820 +0820 +0FE0 +0820 +ENDCHAR +STARTCHAR CB5D +ENCODING 52061 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +3EF8 +0610 +0420 +0A5C +3182 +0204 +FFFE +0100 +0100 +06C0 +0820 +0820 +0C60 +07C0 +ENDCHAR +STARTCHAR CB64 +ENCODING 52068 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +FF90 +1090 +1110 +2A90 +4450 +8810 +01D0 +7E10 +04F0 +0410 +0410 +0410 +0010 +ENDCHAR +STARTCHAR CB78 +ENCODING 52088 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0010 +7F90 +1110 +3B10 +44D0 +0850 +FF90 +04F0 +0000 +0C30 +0420 +0A30 +1148 +2088 +ENDCHAR +STARTCHAR CB79 +ENCODING 52089 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +7F90 +1110 +2B10 +44D0 +0850 +FF90 +04F0 +0040 +01E0 +0210 +0210 +0310 +01E0 +ENDCHAR +STARTCHAR CB9C +ENCODING 52124 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +D890 +2F90 +1110 +2B90 +4450 +8810 +00D0 +FF10 +0410 +0410 +0410 +0410 +0010 +ENDCHAR +STARTCHAR CBB8 +ENCODING 52152 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 2 -3 +BITMAP +7C20 +0DE0 +0840 +14A0 +6118 +0600 +001E +FFE0 +4840 +0840 +0840 +0840 +0840 +0840 +0040 +ENDCHAR +STARTCHAR CBD4 +ENCODING 52180 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 11 1 0 +BITMAP +3FF8 +0410 +0C30 +0A20 +1158 +6084 +0300 +0400 +000C +FFFE +2000 +ENDCHAR +STARTCHAR CBE4 +ENCODING 52196 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -3 +BITMAP +3E00 +04F0 +0C20 +1A70 +208C +4100 +060E +FFF8 +2000 +1FE0 +0820 +0820 +0840 +0FE0 +0800 +ENDCHAR +STARTCHAR CBE7 +ENCODING 52199 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 2 -2 +BITMAP +7DF0 +0C20 +0840 +14A0 +6318 +0200 +0008 +FFFC +4600 +0300 +0700 +04C0 +1820 +6010 +ENDCHAR +STARTCHAR CBE9 +ENCODING 52201 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +3EF8 +0210 +0420 +0A50 +318C +0104 +FFFE +0000 +0100 +06C0 +0420 +0C20 +0460 +03C0 +ENDCHAR +STARTCHAR CC0C +ENCODING 52236 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +0010 +7FD0 +0890 +1190 +2910 +2710 +4290 +8450 +0850 +0010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR CC0D +ENCODING 52237 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +FF90 +1190 +1110 +2B10 +4E90 +8450 +1850 +3FF0 +0810 +0010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR CC10 +ENCODING 52240 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0060 +0010 +0010 +FF90 +1190 +1110 +2B10 +4A90 +8490 +0850 +1810 +0810 +0800 +0810 +07F8 +ENDCHAR +STARTCHAR CC14 +ENCODING 52244 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0010 +7FD0 +1890 +1110 +2B10 +42D0 +8C50 +1000 +0FF0 +0010 +0FF0 +0400 +0400 +07F8 +ENDCHAR +STARTCHAR CC1C +ENCODING 52252 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0030 +0010 +1810 +2F90 +1110 +2910 +4290 +84D0 +0850 +0000 +0FF0 +0410 +0420 +0420 +07F0 +0400 +ENDCHAR +STARTCHAR CC1D +ENCODING 52253 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0030 +0010 +F990 +1E90 +1110 +2B10 +42D0 +8450 +0810 +0C30 +0410 +07F0 +0410 +0410 +07F0 +0410 +ENDCHAR +STARTCHAR CC21 +ENCODING 52257 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +F990 +1E90 +1110 +2B10 +42D0 +8450 +0810 +0090 +03C0 +0420 +0420 +0660 +03C0 +ENDCHAR +STARTCHAR CC22 +ENCODING 52258 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0010 +FF90 +1990 +1110 +2B10 +4690 +8450 +0800 +3FF0 +0100 +0180 +0640 +0830 +3008 +ENDCHAR +STARTCHAR CC27 +ENCODING 52263 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +0090 +7F90 +1110 +3110 +4A90 +8450 +0810 +03D0 +1F20 +02C0 +0440 +0240 +0380 +ENDCHAR +STARTCHAR CC28 +ENCODING 52264 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -2 +BITMAP +0070 +0010 +0E10 +0010 +7F90 +0110 +0210 +041E +0A10 +1190 +2090 +C010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR CC29 +ENCODING 52265 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 16 2 -3 +BITMAP +00C0 +1E20 +0020 +FF20 +0220 +0420 +0C38 +3320 +4020 +8000 +3FE0 +0020 +0020 +0020 +0020 +0020 +ENDCHAR +STARTCHAR CC2C +ENCODING 52268 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -2 +BITMAP +0060 +0010 +0F10 +0010 +3F90 +0110 +0210 +061E +0990 +3090 +C010 +0C10 +0400 +0400 +07F8 +ENDCHAR +STARTCHAR CC2E +ENCODING 52270 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 14 3 -2 +BITMAP +1CC0 +0040 +FE40 +0440 +0878 +1440 +2340 +C3C0 +C000 +47E0 +41E0 +4620 +7A20 +01E0 +ENDCHAR +STARTCHAR CC30 +ENCODING 52272 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +00C0 +0020 +1E20 +0020 +7F20 +0224 +0438 +0A20 +3120 +5FE0 +8020 +1FE0 +0800 +0800 +0FF0 +ENDCHAR +STARTCHAR CC38 +ENCODING 52280 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 16 2 -3 +BITMAP +00C0 +0020 +1C20 +0020 +7F20 +0220 +043E +0A20 +3120 +4000 +9FE0 +0840 +0840 +0840 +0FE0 +0800 +ENDCHAR +STARTCHAR CC39 +ENCODING 52281 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -3 +BITMAP +0060 +3E20 +0020 +7F20 +0220 +043C +0C20 +3320 +5920 +8820 +0FE0 +0820 +0820 +0FE0 +0820 +ENDCHAR +STARTCHAR CC3B +ENCODING 52283 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 3 -2 +BITMAP +0180 +0040 +3C40 +0040 +FE40 +0440 +0858 +1460 +2240 +C240 +0140 +0300 +0480 +0860 +3010 +ENDCHAR +STARTCHAR CC3C +ENCODING 52284 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 14 2 -2 +BITMAP +0060 +1E20 +0020 +7F20 +0220 +0420 +0C38 +3320 +4860 +8420 +0C40 +12E0 +2098 +4108 +ENDCHAR +STARTCHAR CC3D +ENCODING 52285 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +00C0 +1E20 +0020 +7F20 +0220 +0420 +0C3C +1320 +6020 +80A0 +0340 +0420 +0420 +0660 +03C0 +ENDCHAR +STARTCHAR CC3E +ENCODING 52286 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 16 2 -3 +BITMAP +00C0 +0020 +1E20 +7F20 +0220 +0420 +0C3C +3320 +40A0 +8000 +3FF0 +0100 +0300 +04C0 +1830 +6010 +ENDCHAR +STARTCHAR CC44 +ENCODING 52292 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0060 +0110 +0090 +3C90 +0090 +7C90 +0490 +0890 +18F0 +2490 +4090 +8090 +0090 +0090 +0010 +ENDCHAR +STARTCHAR CC45 +ENCODING 52293 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 11 16 3 -3 +BITMAP +0060 +0320 +7920 +0120 +FD20 +0920 +11E0 +2920 +4520 +8120 +3FE0 +0020 +0020 +0020 +0020 +0020 +ENDCHAR +STARTCHAR CC48 +ENCODING 52296 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 3 -2 +BITMAP +0060 +0320 +0120 +7920 +0120 +FD20 +0920 +11E0 +2920 +4520 +8120 +1920 +0800 +0810 +0FF0 +ENDCHAR +STARTCHAR CC4C +ENCODING 52300 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0060 +01B0 +3C90 +0090 +FE90 +0490 +08F0 +1490 +2290 +C090 +1FF0 +0020 +0FE0 +0800 +0FF0 +ENDCHAR +STARTCHAR CC54 +ENCODING 52308 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 11 16 3 -3 +BITMAP +0060 +0320 +3920 +0120 +FD20 +0920 +11E0 +2920 +4520 +8120 +0FE0 +0820 +0820 +0840 +0FE0 +0800 +ENDCHAR +STARTCHAR CC55 +ENCODING 52309 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 1 -2 +BITMAP +0010 +0048 +1C48 +0048 +7E48 +0678 +0C48 +1248 +2108 +C608 +0208 +03F8 +0208 +03F8 +0208 +ENDCHAR +STARTCHAR CC57 +ENCODING 52311 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0090 +3C90 +0090 +FE90 +0490 +08F0 +1890 +6690 +8110 +0100 +0300 +06C0 +0830 +3018 +ENDCHAR +STARTCHAR CC58 +ENCODING 52312 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 3 -2 +BITMAP +0060 +0320 +3920 +0120 +FD20 +0920 +11E0 +3120 +4D20 +81A0 +0840 +0840 +14C0 +2730 +4010 +ENDCHAR +STARTCHAR CC59 +ENCODING 52313 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 11 14 2 -1 +BITMAP +0060 +3B20 +0120 +0120 +7920 +1120 +29E0 +4520 +8120 +0680 +0860 +0820 +0C60 +07C0 +ENDCHAR +STARTCHAR CC60 +ENCODING 52320 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -2 +BITMAP +0030 +0010 +0E10 +0010 +0010 +7F9E +0110 +0210 +0410 +0A16 +1198 +2090 +C010 +0010 +0010 +ENDCHAR +STARTCHAR CC64 +ENCODING 52324 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -2 +BITMAP +0030 +0F10 +0010 +0010 +3F96 +0118 +0210 +0610 +0996 +3098 +C810 +0400 +0400 +0400 +07F8 +ENDCHAR +STARTCHAR CC66 +ENCODING 52326 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 3 -2 +BITMAP +0180 +3C40 +0040 +0040 +FE78 +0440 +0840 +1458 +6260 +81C0 +2070 +23C0 +2120 +2D20 +31E0 +ENDCHAR +STARTCHAR CC68 +ENCODING 52328 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 3 -2 +BITMAP +00C0 +0040 +3C40 +0058 +FE60 +0440 +0848 +1470 +6200 +BFC0 +0040 +3FC0 +1000 +1000 +1FE0 +ENDCHAR +STARTCHAR CC70 +ENCODING 52336 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 16 1 -3 +BITMAP +0070 +0010 +0F10 +0010 +7F9E +0110 +0210 +0510 +089C +3000 +CFF0 +0420 +0420 +0420 +07F0 +0400 +ENDCHAR +STARTCHAR CC75 +ENCODING 52341 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0060 +1C20 +0020 +FE20 +063C +0420 +0C20 +332C +4030 +8120 +06C0 +0820 +0820 +0C60 +07C0 +ENDCHAR +STARTCHAR CC98 +ENCODING 52376 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 1 -2 +BITMAP +0018 +0008 +0E08 +0008 +7F08 +0308 +0298 +0468 +0A08 +1188 +6088 +8008 +0008 +0008 +0008 +ENDCHAR +STARTCHAR CC99 +ENCODING 52377 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +1E10 +0010 +7F10 +0210 +04F0 +0C10 +3310 +4110 +BFE0 +0020 +0020 +0020 +0020 +0020 +ENDCHAR +STARTCHAR CC9C +ENCODING 52380 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0060 +0010 +1E10 +0010 +7F10 +0210 +0410 +0CF0 +1210 +6110 +8010 +1810 +0800 +0800 +07F8 +ENDCHAR +STARTCHAR CCA0 +ENCODING 52384 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +1E10 +0010 +7F10 +0210 +05F0 +0A10 +3110 +C000 +1FE0 +0020 +1FE0 +0800 +0800 +0FF0 +ENDCHAR +STARTCHAR CCA8 +ENCODING 52392 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 11 16 3 -3 +BITMAP +0060 +0020 +3C20 +0020 +FE20 +0420 +09E0 +1820 +2620 +C200 +0FE0 +0820 +0840 +0840 +0FE0 +0800 +ENDCHAR +STARTCHAR CCA9 +ENCODING 52393 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0030 +1E10 +0010 +0010 +7F10 +0210 +04F0 +0C10 +3200 +4D30 +8420 +07E0 +0420 +0420 +07E0 +0420 +ENDCHAR +STARTCHAR CCAB +ENCODING 52395 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 11 15 3 -2 +BITMAP +0060 +0020 +3C20 +0020 +FE20 +07E0 +0820 +1820 +2620 +C620 +0320 +0300 +04C0 +1860 +2020 +ENDCHAR +STARTCHAR CCAC +ENCODING 52396 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +1E10 +0010 +7E10 +0610 +04F0 +0C10 +3310 +4100 +8820 +0420 +0C60 +1250 +2298 +4108 +ENDCHAR +STARTCHAR CCAD +ENCODING 52397 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 11 15 3 -2 +BITMAP +0060 +3C20 +0020 +FE20 +0420 +0BE0 +1820 +2620 +C220 +0120 +0680 +0840 +0840 +0CC0 +0780 +ENDCHAR +STARTCHAR CCB4 +ENCODING 52404 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0060 +0130 +0090 +3C90 +0090 +FC90 +0C90 +0F90 +1090 +2890 +4490 +8090 +0090 +0090 +0010 +0010 +ENDCHAR +STARTCHAR CCB5 +ENCODING 52405 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 11 16 3 -3 +BITMAP +0060 +0220 +3920 +0120 +FD20 +0920 +1120 +3720 +4920 +8500 +3FE0 +0020 +0020 +0020 +0020 +0020 +ENDCHAR +STARTCHAR CCB8 +ENCODING 52408 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0060 +0130 +3C90 +0090 +0090 +FC90 +0C90 +0F90 +1890 +2490 +4290 +1890 +0810 +0800 +0FF8 +ENDCHAR +STARTCHAR CCBC +ENCODING 52412 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0020 +0110 +3890 +0090 +FC90 +0C90 +0F90 +1890 +2690 +C090 +1FF0 +0020 +1FE0 +0800 +0800 +0FF0 +ENDCHAR +STARTCHAR CCC4 +ENCODING 52420 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0060 +0130 +3890 +0090 +FC90 +0C90 +0B90 +1490 +2690 +C290 +0FF0 +0410 +0420 +0420 +07F0 +0400 +ENDCHAR +STARTCHAR CCC5 +ENCODING 52421 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0060 +0130 +3890 +0090 +FC90 +0890 +1F90 +1890 +6490 +8810 +0410 +07F0 +0410 +0410 +07F0 +0410 +ENDCHAR +STARTCHAR CCC7 +ENCODING 52423 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0060 +0130 +3C90 +FC90 +0C90 +0890 +1790 +2690 +C290 +0110 +0090 +0180 +0240 +0430 +1808 +ENDCHAR +STARTCHAR CCC9 +ENCODING 52425 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0060 +0130 +3890 +0090 +FC90 +0890 +1F90 +1890 +6490 +8290 +0340 +0420 +0420 +0660 +03C0 +ENDCHAR +STARTCHAR CCD0 +ENCODING 52432 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +1E10 +0010 +7E10 +02F0 +0410 +0810 +15F0 +2210 +4110 +8010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR CCD4 +ENCODING 52436 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0030 +0010 +1E10 +0010 +7F10 +0270 +0610 +0C10 +1370 +2110 +C010 +0C10 +0400 +0400 +07FC +ENDCHAR +STARTCHAR CCE4 +ENCODING 52452 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0070 +1C10 +0010 +0010 +7FF0 +0410 +0810 +15F0 +2210 +C860 +0420 +0C20 +0A50 +1098 +6108 +ENDCHAR +STARTCHAR CCEC +ENCODING 52460 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0040 +0030 +0190 +3890 +0090 +FC90 +0F90 +0890 +1090 +2B90 +4490 +8090 +0090 +0090 +0010 +0010 +ENDCHAR +STARTCHAR CCF0 +ENCODING 52464 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 1 -2 +BITMAP +0060 +0030 +00D0 +1E50 +0050 +7E50 +03D0 +0450 +0C50 +12D0 +2250 +CC50 +0450 +0400 +07F8 +ENDCHAR +STARTCHAR CD01 +ENCODING 52481 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0020 +0190 +3890 +0090 +FC90 +0B90 +1890 +3B90 +4490 +8090 +0360 +0410 +0410 +0630 +03E0 +ENDCHAR +STARTCHAR CD08 +ENCODING 52488 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 11 1 0 +BITMAP +03C0 +0000 +3FF0 +0060 +0080 +0380 +0C78 +3100 +0100 +0100 +FFFE +ENDCHAR +STARTCHAR CD09 +ENCODING 52489 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +0780 +0060 +1FC0 +0180 +0E7C +3100 +0100 +FFFE +0000 +3FE0 +0020 +0020 +0020 +0020 +ENDCHAR +STARTCHAR CD0C +ENCODING 52492 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +0380 +0000 +1FF0 +0060 +0180 +0678 +1904 +2104 +FFFE +0000 +0800 +0800 +0800 +0FF8 +ENDCHAR +STARTCHAR CD10 +ENCODING 52496 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +03C0 +3FE0 +00C0 +0180 +0E7C +7100 +0104 +FFFE +0000 +1FE0 +0020 +1FE0 +0800 +0FF0 +ENDCHAR +STARTCHAR CD18 +ENCODING 52504 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -3 +BITMAP +03C0 +1FE0 +00C0 +0180 +0E78 +7100 +0100 +FFFE +0000 +1FE0 +0820 +0820 +0820 +0FE0 +0800 +ENDCHAR +STARTCHAR CD19 +ENCODING 52505 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -3 +BITMAP +0380 +1FE0 +0040 +0180 +0F78 +7100 +817E +7F80 +3820 +0820 +0FE0 +0820 +0820 +0FE0 +0820 +ENDCHAR +STARTCHAR CD1B +ENCODING 52507 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +0780 +3FE0 +00C0 +0180 +0678 +3900 +0100 +FFFE +0000 +0300 +0100 +02C0 +0C30 +1008 +ENDCHAR +STARTCHAR CD1D +ENCODING 52509 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +0780 +3FE0 +00C0 +0300 +0CF8 +7100 +0104 +FFFE +0100 +06C0 +0820 +0820 +0C60 +0380 +ENDCHAR +STARTCHAR CD24 +ENCODING 52516 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -2 +BITMAP +0030 +0010 +0F10 +0010 +3F90 +0110 +0210 +0F16 +1CD8 +E410 +05F0 +7A10 +0010 +0010 +0010 +ENDCHAR +STARTCHAR CD28 +ENCODING 52520 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0060 +0020 +1E20 +0020 +7E20 +0C20 +13AC +6C30 +09A0 +FE20 +0020 +1820 +0800 +0800 +07F0 +ENDCHAR +STARTCHAR CD2C +ENCODING 52524 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0060 +1E20 +0020 +7F20 +0420 +1BA4 +6C38 +0460 +FFA0 +0000 +1FE0 +0020 +1FE0 +0800 +0FF0 +ENDCHAR +STARTCHAR CD39 +ENCODING 52537 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 1 -2 +BITMAP +0030 +0F10 +3F90 +0110 +0610 +1FD0 +223C +FFD0 +0010 +01E0 +0210 +0210 +0330 +01E0 +ENDCHAR +STARTCHAR CD5C +ENCODING 52572 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0060 +0010 +0E10 +0010 +7F90 +0310 +0610 +0F10 +3CD0 +C410 +07D0 +7810 +0010 +0010 +0010 +ENDCHAR +STARTCHAR CD60 +ENCODING 52576 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 3 -2 +BITMAP +0060 +0020 +1C20 +0020 +7E20 +0820 +37A0 +C820 +1FE0 +E020 +0020 +1800 +0800 +0800 +0FF0 +ENDCHAR +STARTCHAR CD64 +ENCODING 52580 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +1E10 +0010 +7F10 +0210 +0C10 +37D0 +C4F0 +FF10 +0000 +0FF0 +0020 +0FF0 +0400 +07F8 +ENDCHAR +STARTCHAR CD6C +ENCODING 52588 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0030 +1E10 +0010 +7F10 +0310 +0C10 +17D0 +E4F0 +FB10 +0000 +0FF0 +0410 +0420 +0420 +07F0 +0400 +ENDCHAR +STARTCHAR CD6D +ENCODING 52589 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0030 +1E10 +0010 +7F10 +0210 +0C10 +3790 +C4F0 +FF10 +0C20 +0420 +07E0 +0420 +0420 +07E0 +0420 +ENDCHAR +STARTCHAR CD6F +ENCODING 52591 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 16 2 -3 +BITMAP +0030 +0010 +1E10 +0710 +3E10 +0F90 +3C10 +C4F0 +FF10 +0010 +0180 +0180 +0240 +0430 +0808 +1000 +ENDCHAR +STARTCHAR CD71 +ENCODING 52593 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 14 2 -2 +BITMAP +0030 +1E10 +7F10 +0210 +0C10 +33D0 +C410 +04F0 +FB10 +03D0 +0420 +0420 +0620 +03C0 +ENDCHAR +STARTCHAR CD78 +ENCODING 52600 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 12 2 0 +BITMAP +0780 +0000 +0000 +3FE0 +00C0 +0180 +0380 +0C78 +70C0 +0840 +0848 +FFFC +ENDCHAR +STARTCHAR CD88 +ENCODING 52616 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -3 +BITMAP +03C0 +1FE0 +0040 +0180 +0678 +38C0 +0440 +FFFE +2000 +1FE0 +0820 +0820 +0840 +0FE0 +0800 +ENDCHAR +STARTCHAR CD94 +ENCODING 52628 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +03C0 +3FE0 +00C0 +0180 +0678 +3800 +0004 +FFFE +0100 +0100 +0100 +0100 +0100 +0100 +ENDCHAR +STARTCHAR CD95 +ENCODING 52629 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +0380 +1FF0 +0040 +0180 +0E78 +7000 +0000 +FFFE +0100 +1FE0 +0020 +0020 +0020 +0020 +ENDCHAR +STARTCHAR CD98 +ENCODING 52632 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +0780 +3FE0 +00C0 +0100 +06F8 +3800 +000C +FFFE +0100 +0100 +1900 +0900 +0810 +0FF8 +ENDCHAR +STARTCHAR CD9C +ENCODING 52636 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +0780 +3FE0 +00C0 +0100 +0EF8 +7004 +FFFE +0100 +0100 +1FE0 +0020 +1FE0 +0800 +0FF0 +ENDCHAR +STARTCHAR CDA4 +ENCODING 52644 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 16 1 -3 +BITMAP +0780 +0000 +3FE0 +0040 +0180 +0678 +3804 +FFFE +0100 +0100 +0FE0 +0820 +0820 +0820 +0FE0 +0800 +ENDCHAR +STARTCHAR CDA5 +ENCODING 52645 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -3 +BITMAP +0380 +3FE0 +0040 +0180 +0E7C +7000 +FFFE +0100 +1920 +0920 +0FE0 +0820 +0820 +0FE0 +0820 +ENDCHAR +STARTCHAR CDA7 +ENCODING 52647 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 1 -3 +BITMAP +0780 +3FE0 +0040 +0180 +0EFC +7000 +0004 +FFF8 +0100 +0100 +0100 +0380 +0660 +0810 +3000 +ENDCHAR +STARTCHAR CDA9 +ENCODING 52649 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +0380 +1FE0 +0040 +0180 +0678 +3800 +FFFE +0100 +0100 +07C0 +0C60 +0820 +0C60 +07C0 +ENDCHAR +STARTCHAR CDB0 +ENCODING 52656 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 11 15 3 -2 +BITMAP +0060 +3C20 +0020 +FF20 +0420 +1820 +67A0 +8020 +0720 +F820 +09E0 +0820 +0820 +0820 +0020 +ENDCHAR +STARTCHAR CDC4 +ENCODING 52676 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 3 -2 +BITMAP +0060 +0020 +1C20 +FE20 +0420 +1C20 +6220 +8F20 +F9E0 +0000 +0840 +0840 +18C0 +2530 +4210 +ENDCHAR +STARTCHAR CDCC +ENCODING 52684 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 11 15 3 -2 +BITMAP +0060 +0320 +3920 +0120 +FD20 +1920 +3120 +4D20 +8D20 +F120 +1F20 +1120 +1120 +1120 +0020 +ENDCHAR +STARTCHAR CDD0 +ENCODING 52688 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0020 +01B0 +0090 +1C90 +7E90 +0C90 +1E90 +6290 +FC90 +1390 +1090 +0C90 +0410 +0400 +07F8 +ENDCHAR +STARTCHAR CDE8 +ENCODING 52712 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0E10 +0010 +7F90 +0310 +0410 +1BD0 +6010 +0050 +FF90 +0410 +0410 +0410 +0410 +0010 +ENDCHAR +STARTCHAR CDEC +ENCODING 52716 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +1E10 +0010 +7F10 +0210 +0C10 +13F0 +FF10 +6410 +0410 +0010 +0C00 +0400 +0400 +07F8 +ENDCHAR +STARTCHAR CDF0 +ENCODING 52720 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 1 -2 +BITMAP +0018 +0F08 +0008 +3F88 +0308 +0608 +19D8 +E7A8 +3A08 +0000 +0FF8 +0010 +07F8 +0400 +03FC +ENDCHAR +STARTCHAR CDF8 +ENCODING 52728 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0030 +0E10 +0010 +7F10 +0210 +0E10 +11D0 +E070 +8F90 +7400 +0FF0 +0410 +0420 +0420 +07F0 +0400 +ENDCHAR +STARTCHAR CDF9 +ENCODING 52729 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0030 +0E10 +0010 +7F10 +0210 +0C10 +13D0 +E070 +9F90 +6430 +0410 +07F0 +0410 +0410 +07F0 +0410 +ENDCHAR +STARTCHAR CDFB +ENCODING 52731 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 1 -2 +BITMAP +0018 +0F08 +0008 +3F88 +0308 +0608 +19D8 +EFA8 +3208 +0288 +0040 +00A0 +0110 +0208 +0C04 +ENDCHAR +STARTCHAR CDFD +ENCODING 52733 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0020 +1E10 +0010 +7F10 +0610 +0C10 +33B0 +DF50 +E810 +0890 +0360 +0410 +0410 +0630 +03E0 +ENDCHAR +STARTCHAR CE04 +ENCODING 52740 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 2 -2 +BITMAP +0780 +0000 +3FE0 +00C0 +0300 +0CF8 +7008 +FFFC +4840 +0840 +0840 +0840 +0840 +0840 +ENDCHAR +STARTCHAR CE08 +ENCODING 52744 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +0780 +3FE0 +00C0 +0100 +06F8 +3800 +0000 +FFFE +0840 +0840 +3840 +1040 +1000 +0FF0 +ENDCHAR +STARTCHAR CE0C +ENCODING 52748 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -3 +BITMAP +0700 +7FC0 +0080 +0300 +1CF0 +E008 +FFF4 +0880 +0880 +3FC0 +0040 +3FC0 +1000 +1000 +1FF0 +ENDCHAR +STARTCHAR CE14 +ENCODING 52756 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -3 +BITMAP +0380 +3FE0 +0040 +0180 +0E78 +7000 +803E +7FE0 +0400 +0FE0 +0820 +0820 +0840 +0FE0 +0800 +ENDCHAR +STARTCHAR CE19 +ENCODING 52761 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +0380 +3FE0 +0040 +0180 +0E78 +7000 +803E +7FE0 +0520 +06C0 +0820 +0820 +0C60 +07C0 +ENDCHAR +STARTCHAR CE20 +ENCODING 52768 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 11 1 0 +BITMAP +07C0 +0000 +3FF0 +0060 +00C0 +0100 +06F8 +3800 +0000 +0000 +FFFE +ENDCHAR +STARTCHAR CE21 +ENCODING 52769 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -3 +BITMAP +0380 +1FF0 +0060 +0180 +0678 +3800 +0000 +FFFE +0000 +3FE0 +0020 +0020 +0020 +0020 +0020 +ENDCHAR +STARTCHAR CE24 +ENCODING 52772 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +0780 +0000 +3FE0 +0080 +0778 +3804 +83FE +FF00 +2000 +0000 +1800 +0800 +0810 +0FF8 +ENDCHAR +STARTCHAR CE28 +ENCODING 52776 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +0380 +3FE0 +0040 +0180 +0E78 +7004 +FFFE +2000 +0000 +1FE0 +0020 +1FE0 +0800 +0FF0 +ENDCHAR +STARTCHAR CE30 +ENCODING 52784 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -3 +BITMAP +0700 +7FC0 +0080 +0300 +0CF0 +F000 +FFFC +0000 +0000 +3FC0 +1040 +1040 +1080 +1FC0 +1000 +ENDCHAR +STARTCHAR CE31 +ENCODING 52785 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 16 1 -3 +BITMAP +0380 +0000 +3FE0 +0040 +0180 +0EFC +7000 +FFFE +0000 +1820 +0820 +0FE0 +0820 +0820 +0FE0 +0820 +ENDCHAR +STARTCHAR CE33 +ENCODING 52787 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 2 -2 +BITMAP +0F00 +7FC0 +0080 +0300 +0CF0 +7000 +0000 +FFFC +4000 +0200 +0200 +0580 +0860 +3010 +ENDCHAR +STARTCHAR CE35 +ENCODING 52789 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +0780 +3FF0 +0040 +0180 +0E78 +7000 +0004 +FFFE +0100 +07C0 +0C60 +0820 +0C60 +07C0 +ENDCHAR +STARTCHAR CE58 +ENCODING 52824 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +1E10 +0010 +7F10 +0310 +0610 +0C10 +1A10 +2110 +4090 +8010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR CE59 +ENCODING 52825 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +1E10 +0010 +0010 +7F10 +0210 +0410 +0A10 +3190 +7FE0 +9020 +0020 +0020 +0020 +0020 +ENDCHAR +STARTCHAR CE5C +ENCODING 52828 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0060 +0010 +1E10 +0010 +7F10 +0210 +0410 +0C10 +1210 +6110 +9010 +0810 +0800 +0800 +07F8 +ENDCHAR +STARTCHAR CE5F +ENCODING 52831 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 11 15 3 -2 +BITMAP +0060 +3C20 +0020 +FE20 +0420 +0820 +1420 +6320 +8020 +0040 +1FC0 +1000 +1000 +1000 +1FE0 +ENDCHAR +STARTCHAR CE60 +ENCODING 52832 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 11 15 3 -2 +BITMAP +0060 +3C20 +0020 +FE20 +0420 +0820 +1420 +6220 +8000 +3FC0 +0040 +3FC0 +1000 +1000 +1FE0 +ENDCHAR +STARTCHAR CE61 +ENCODING 52833 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 1 -2 +BITMAP +0018 +0F08 +0008 +3F88 +0188 +0308 +0508 +08C8 +3048 +C000 +1EF0 +0210 +1C10 +1110 +1E10 +ENDCHAR +STARTCHAR CE68 +ENCODING 52840 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0030 +1E10 +0010 +0010 +7F10 +0210 +0410 +0A10 +1110 +6080 +8FF0 +0410 +0410 +0410 +07F0 +0400 +ENDCHAR +STARTCHAR CE69 +ENCODING 52841 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0030 +1E10 +0010 +0010 +7F10 +0210 +0410 +0A10 +1180 +6C10 +8410 +07F0 +0410 +0410 +07F0 +0410 +ENDCHAR +STARTCHAR CE6B +ENCODING 52843 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0030 +1010 +0E10 +7F10 +0210 +0410 +0A10 +1190 +6090 +8110 +0180 +0100 +06C0 +0C30 +1010 +2000 +ENDCHAR +STARTCHAR CE6D +ENCODING 52845 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +1E10 +0010 +7F10 +0210 +0410 +0A10 +1190 +6090 +8360 +0420 +0420 +0660 +03C0 +ENDCHAR +STARTCHAR CE74 +ENCODING 52852 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +00C0 +0020 +0020 +7F20 +0320 +0220 +0620 +FC2C +0830 +0820 +1020 +2020 +4020 +0020 +0020 +ENDCHAR +STARTCHAR CE75 +ENCODING 52853 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 16 1 -3 +BITMAP +0060 +0010 +7F90 +0110 +0210 +FE16 +0418 +0810 +1010 +2000 +5FF0 +0010 +0010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR CE78 +ENCODING 52856 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -2 +BITMAP +0060 +0010 +0010 +3F90 +0110 +0110 +FE10 +041E +0410 +0810 +1C10 +2410 +0400 +0408 +03FC +ENDCHAR +STARTCHAR CE7C +ENCODING 52860 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +00C0 +0020 +7F20 +0220 +0420 +FC20 +0838 +1020 +2000 +5FE0 +0020 +1FE0 +0800 +0800 +0FF8 +ENDCHAR +STARTCHAR CE84 +ENCODING 52868 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 16 2 -3 +BITMAP +0060 +0020 +7F20 +0220 +0220 +FC2C +0830 +1020 +2020 +4000 +8FE0 +0820 +0840 +0840 +0FE0 +0800 +ENDCHAR +STARTCHAR CE85 +ENCODING 52869 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 16 2 -3 +BITMAP +00C0 +0020 +7F20 +0220 +0620 +FC20 +083C +1020 +2000 +5820 +0820 +0FE0 +0820 +0820 +0FE0 +0820 +ENDCHAR +STARTCHAR CE87 +ENCODING 52871 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 16 2 -3 +BITMAP +0080 +0060 +7F20 +0220 +0620 +FC20 +083C +1020 +2020 +C320 +0120 +0300 +06C0 +0830 +1010 +2000 +ENDCHAR +STARTCHAR CE89 +ENCODING 52873 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +00C0 +0020 +7F20 +0220 +0620 +FC24 +0838 +1020 +2120 +4100 +86C0 +0820 +0820 +0C60 +03C0 +ENDCHAR +STARTCHAR CE90 +ENCODING 52880 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 1 -2 +BITMAP +0018 +00C8 +0048 +7F48 +0248 +0248 +9C48 +6478 +0848 +1048 +2048 +4048 +0048 +0048 +0008 +ENDCHAR +STARTCHAR CE91 +ENCODING 52881 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 16 1 -3 +BITMAP +0010 +00C8 +0048 +3E48 +0248 +BC48 +4478 +0848 +1048 +2048 +0FF8 +0008 +0008 +0008 +0008 +0008 +ENDCHAR +STARTCHAR CE94 +ENCODING 52884 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0020 +0110 +0090 +FC90 +0490 +0890 +F890 +10F0 +2090 +4090 +8090 +1890 +0800 +0800 +0FF8 +ENDCHAR +STARTCHAR CE98 +ENCODING 52888 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0190 +0090 +7E90 +0490 +0490 +F8F0 +1090 +1090 +2770 +4020 +0FF0 +0400 +0400 +07F8 +ENDCHAR +STARTCHAR CEA0 +ENCODING 52896 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0070 +0190 +0090 +7E90 +0490 +0490 +F8F0 +0890 +1090 +2090 +4FF0 +0410 +0410 +0420 +07F0 +0400 +ENDCHAR +STARTCHAR CEA1 +ENCODING 52897 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0070 +0110 +0090 +FE90 +0490 +0490 +F8F0 +1090 +1090 +28B0 +4410 +07F0 +0410 +07F0 +0410 +ENDCHAR +STARTCHAR CEA3 +ENCODING 52899 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 1 -2 +BITMAP +0010 +00C8 +0048 +3E48 +0248 +FC48 +0478 +0848 +1048 +2088 +0040 +00C0 +0120 +0218 +0C0C +ENDCHAR +STARTCHAR CEA4 +ENCODING 52900 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0190 +0090 +7E90 +0490 +F890 +08F0 +1090 +2090 +4090 +0430 +0420 +0C60 +1298 +2108 +ENDCHAR +STARTCHAR CEA5 +ENCODING 52901 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 14 2 -2 +BITMAP +0130 +0090 +0090 +7C90 +0490 +F8F0 +0890 +1090 +2090 +4360 +0410 +0410 +0630 +03E0 +ENDCHAR +STARTCHAR CEAC +ENCODING 52908 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0060 +0020 +0020 +7F20 +0220 +023C +0C20 +F420 +0820 +083C +1020 +2020 +4020 +0020 +0020 +ENDCHAR +STARTCHAR CEAD +ENCODING 52909 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 16 1 -3 +BITMAP +0030 +0010 +0010 +3F10 +021E +8E10 +7410 +0816 +1018 +2000 +5FF0 +0010 +0010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR CEC1 +ENCODING 52929 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0060 +0020 +7F20 +0224 +0638 +FC20 +0820 +103C +2020 +4100 +86C0 +0820 +0820 +0C60 +03C0 +ENDCHAR +STARTCHAR CEE4 +ENCODING 52964 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +0010 +7F10 +0210 +0210 +3C10 +44F0 +0810 +1010 +2010 +4010 +8010 +0010 +0010 +ENDCHAR +STARTCHAR CEE5 +ENCODING 52965 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 1 -2 +BITMAP +0018 +0008 +3F88 +0108 +0108 +FEF8 +0608 +0408 +0808 +3FF8 +0408 +0008 +0008 +0008 +0008 +ENDCHAR +STARTCHAR CEE8 +ENCODING 52968 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +7F10 +0210 +0610 +FC30 +08D0 +0810 +1010 +2010 +C010 +1800 +0800 +0800 +0FF0 +ENDCHAR +STARTCHAR CEEB +ENCODING 52971 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +7F10 +0210 +0210 +FCF0 +0810 +1810 +2010 +4020 +0FF0 +0800 +0800 +0800 +07F0 +ENDCHAR +STARTCHAR CEEC +ENCODING 52972 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +7F10 +0310 +0210 +FCF0 +0410 +0810 +1000 +7FE0 +8020 +1FE0 +0800 +0800 +0FF0 +ENDCHAR +STARTCHAR CEF4 +ENCODING 52980 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 16 1 -3 +BITMAP +0018 +0008 +7F08 +0108 +0208 +FEF8 +0408 +0808 +1008 +6000 +87F0 +0410 +0410 +0420 +07F0 +0400 +ENDCHAR +STARTCHAR CEF5 +ENCODING 52981 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0030 +0010 +7F10 +0210 +0210 +FCF0 +0810 +1810 +2000 +4C10 +0410 +07F0 +0410 +0410 +07F0 +0410 +ENDCHAR +STARTCHAR CEF7 +ENCODING 52983 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0010 +7F10 +0210 +0210 +FDF0 +0810 +1810 +2010 +4190 +0080 +0180 +0260 +0410 +1808 +ENDCHAR +STARTCHAR CEF8 +ENCODING 52984 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0010 +7F10 +0310 +0210 +FCF0 +0810 +1010 +2000 +4430 +0420 +0C20 +1250 +2088 +4100 +ENDCHAR +STARTCHAR CEF9 +ENCODING 52985 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +7F10 +0210 +0210 +FCF0 +0810 +1010 +2010 +4090 +0340 +0420 +0420 +0660 +03C0 +ENDCHAR +STARTCHAR CF00 +ENCODING 52992 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0040 +01B0 +0090 +FE90 +0490 +0490 +1890 +EF90 +1090 +2090 +2090 +C090 +0090 +0090 +0010 +0010 +ENDCHAR +STARTCHAR CF01 +ENCODING 52993 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0020 +0030 +0190 +FC90 +0490 +0890 +FF90 +1090 +2090 +4090 +9FF0 +0810 +0010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR CF04 +ENCODING 52996 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0060 +01B0 +0090 +7E90 +0490 +0490 +FF90 +1890 +1090 +2090 +7090 +0890 +0800 +0800 +07F8 +ENDCHAR +STARTCHAR CF08 +ENCODING 53000 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 1 -2 +BITMAP +0010 +0098 +0048 +7E48 +0648 +0448 +FFC8 +0848 +1FF0 +2010 +4010 +0FF0 +0400 +0400 +07F8 +ENDCHAR +STARTCHAR CF10 +ENCODING 53008 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0020 +0030 +0190 +FC90 +0490 +0890 +FF90 +1090 +2090 +4090 +87F0 +0410 +0420 +0420 +07F0 +ENDCHAR +STARTCHAR CF11 +ENCODING 53009 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0020 +0030 +0190 +FC90 +0490 +0890 +FF90 +1090 +2090 +4890 +8410 +07F0 +0410 +07F0 +0410 +ENDCHAR +STARTCHAR CF13 +ENCODING 53011 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0020 +0030 +0090 +FC90 +0490 +0890 +FF90 +1090 +2090 +4190 +8100 +0380 +0240 +0C30 +1008 +ENDCHAR +STARTCHAR CF15 +ENCODING 53013 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0020 +0030 +0190 +FC90 +0490 +0890 +FF90 +1090 +2090 +4090 +8340 +0420 +0420 +0660 +03C0 +ENDCHAR +STARTCHAR CF1C +ENCODING 53020 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 11 16 3 -3 +BITMAP +00C0 +0020 +0020 +FE20 +0220 +07E0 +1D20 +E820 +0820 +13E0 +2020 +4020 +8020 +0020 +0020 +0020 +ENDCHAR +STARTCHAR CF20 +ENCODING 53024 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0010 +7F10 +0110 +03F0 +FE10 +0410 +0810 +11F0 +2010 +7810 +0810 +0800 +0800 +07F8 +ENDCHAR +STARTCHAR CF24 +ENCODING 53028 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0010 +7F10 +0110 +03F0 +FE10 +0410 +08F0 +1010 +2FF0 +C010 +0FF0 +0400 +0408 +07F8 +ENDCHAR +STARTCHAR CF2C +ENCODING 53036 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +7F10 +0170 +0290 +FE10 +0410 +09F0 +1010 +6010 +07F0 +0410 +0420 +0420 +07F0 +ENDCHAR +STARTCHAR CF2D +ENCODING 53037 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 11 15 3 -2 +BITMAP +00C0 +0020 +FE20 +0420 +07E0 +0C20 +F820 +1060 +23A0 +7020 +9020 +1FE0 +1020 +1FE0 +1020 +ENDCHAR +STARTCHAR CF2F +ENCODING 53039 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0020 +0010 +0010 +7E10 +03F0 +0C10 +F410 +0810 +11F0 +2110 +C190 +0190 +0240 +0430 +1818 +ENDCHAR +STARTCHAR CF30 +ENCODING 53040 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0020 +0010 +7F10 +0210 +03F0 +FE10 +0410 +09F0 +1010 +2860 +C420 +0C20 +1A50 +2198 +4108 +ENDCHAR +STARTCHAR CF31 +ENCODING 53041 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +7F10 +01F0 +0290 +FC10 +0410 +08F0 +3010 +4090 +0360 +0410 +0410 +0630 +01C0 +ENDCHAR +STARTCHAR CF38 +ENCODING 53048 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0060 +01B0 +0090 +FC90 +0490 +0490 +1B90 +E890 +1090 +2790 +2090 +C090 +0090 +0090 +0010 +ENDCHAR +STARTCHAR CF54 +ENCODING 53076 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 10 2 1 +BITMAP +3FF8 +0010 +0010 +0010 +7FE0 +0020 +0220 +0200 +0200 +FFFC +ENDCHAR +STARTCHAR CF55 +ENCODING 53077 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 2 -2 +BITMAP +3FF0 +0010 +0020 +7FE0 +0220 +0240 +FFFC +0000 +0000 +1FE0 +0020 +0020 +0020 +0020 +ENDCHAR +STARTCHAR CF58 +ENCODING 53080 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 13 1 -1 +BITMAP +1FF8 +0008 +0008 +3FF0 +0010 +0120 +0100 +FFFE +3800 +0800 +0800 +0810 +0FF8 +ENDCHAR +STARTCHAR CF5C +ENCODING 53084 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +1FF8 +0018 +0010 +3FF0 +0310 +0104 +FFFE +0000 +1FF0 +0020 +1FE0 +0800 +0800 +0FF8 +ENDCHAR +STARTCHAR CF64 +ENCODING 53092 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +1FF8 +0008 +0010 +3FF0 +0110 +0104 +FFFE +0000 +0000 +0FE0 +0820 +0820 +0FE0 +0800 +ENDCHAR +STARTCHAR CF65 +ENCODING 53093 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -3 +BITMAP +1FF8 +0008 +0018 +3FF0 +0110 +0104 +FFFE +0000 +0C60 +0420 +07E0 +0420 +0420 +07E0 +0420 +ENDCHAR +STARTCHAR CF67 +ENCODING 53095 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +1FF8 +0010 +0030 +3FD0 +0020 +0100 +0100 +FFFE +0200 +0100 +0380 +0260 +0C10 +3008 +ENDCHAR +STARTCHAR CF69 +ENCODING 53097 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +1FF8 +0018 +0010 +3FF0 +0110 +0120 +017E +FF80 +0100 +07C0 +0C60 +0820 +0460 +03C0 +ENDCHAR +STARTCHAR CF70 +ENCODING 53104 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0060 +0020 +0020 +7FA0 +0120 +0120 +0F20 +792C +0A30 +08E0 +FF20 +4020 +0020 +0020 +0020 +ENDCHAR +STARTCHAR CF71 +ENCODING 53105 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 16 1 -3 +BITMAP +0030 +0010 +3F90 +0090 +0090 +7F10 +051C +05F0 +FA10 +0000 +1FF0 +0810 +0010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR CF74 +ENCODING 53108 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -2 +BITMAP +0030 +0010 +3F90 +0090 +0090 +7F10 +0D16 +0878 +9F90 +6010 +0010 +0C10 +0400 +043C +07C0 +ENDCHAR +STARTCHAR CF78 +ENCODING 53112 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0060 +0020 +7F20 +0120 +0120 +7F20 +0A3C +0FE0 +F020 +0000 +1FE0 +0040 +1FE0 +0800 +0FF0 +ENDCHAR +STARTCHAR CF80 +ENCODING 53120 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 16 2 -3 +BITMAP +0060 +0020 +7F20 +0120 +0120 +7F20 +0A3C +0FE0 +F020 +0000 +1FE0 +0820 +0840 +0840 +0FE0 +0800 +ENDCHAR +STARTCHAR CF85 +ENCODING 53125 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0060 +0020 +7FA0 +0120 +0120 +FF20 +0A3C +09E0 +FE20 +00A0 +0340 +0420 +0420 +0660 +03C0 +ENDCHAR +STARTCHAR CF8C +ENCODING 53132 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0060 +0110 +0090 +7E90 +0290 +0490 +FC90 +2490 +10F0 +1790 +E890 +0090 +0090 +0090 +0010 +ENDCHAR +STARTCHAR CFA1 +ENCODING 53153 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0060 +0190 +0090 +7E90 +0290 +0C90 +7490 +11F0 +FE90 +0090 +0360 +0410 +0410 +0630 +03E0 +ENDCHAR +STARTCHAR CFA8 +ENCODING 53160 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +7F90 +0190 +0190 +0710 +7910 +1910 +0810 +08F0 +FF10 +0010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR CFB0 +ENCODING 53168 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 14 2 -1 +BITMAP +0060 +0010 +7F90 +0190 +0110 +7F10 +0910 +09F0 +FE10 +1FF0 +0020 +1FF0 +0800 +0FF0 +ENDCHAR +STARTCHAR CFC4 +ENCODING 53188 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 12 2 -1 +BITMAP +0030 +7FF0 +0010 +0030 +0020 +FFE0 +21A0 +18A0 +0880 +0888 +FFFC +4000 +ENDCHAR +STARTCHAR CFE0 +ENCODING 53216 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -3 +BITMAP +3BF8 +0418 +0010 +01F0 +1E10 +0020 +0020 +FFFE +0100 +0100 +0100 +0100 +0100 +0100 +0100 +ENDCHAR +STARTCHAR CFE1 +ENCODING 53217 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -3 +BITMAP +1FF0 +0010 +0010 +3FE0 +0020 +0020 +FFFE +0100 +0100 +21F0 +1E10 +0010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR CFE4 +ENCODING 53220 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 13 1 -1 +BITMAP +03F0 +1C10 +0030 +3FE0 +0020 +0020 +FFFE +0100 +0100 +1900 +0900 +0800 +07F8 +ENDCHAR +STARTCHAR CFE8 +ENCODING 53224 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +1FF8 +0010 +0030 +1FD0 +0020 +FFFE +0100 +0100 +0EE0 +0020 +3FF0 +0800 +0800 +0FF8 +ENDCHAR +STARTCHAR CFF0 +ENCODING 53232 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 2 -2 +BITMAP +03F0 +1C20 +0060 +7FA0 +0040 +0040 +FFFC +0200 +0200 +3FE0 +1040 +1040 +1FC0 +1000 +ENDCHAR +STARTCHAR CFF1 +ENCODING 53233 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +01F0 +1E10 +0030 +3FE0 +0020 +0020 +FFFE +0100 +1160 +0920 +0FE0 +0820 +0FE0 +0820 +ENDCHAR +STARTCHAR CFF3 +ENCODING 53235 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +1FF0 +0010 +0030 +3FE0 +0020 +0020 +FFFE +0100 +0100 +0300 +0300 +02C0 +0430 +1810 +ENDCHAR +STARTCHAR CFF5 +ENCODING 53237 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +3FF8 +0010 +0010 +7FF0 +0010 +0020 +FFFE +0100 +0100 +0680 +0860 +0820 +0C60 +07C0 +ENDCHAR +STARTCHAR CFFC +ENCODING 53244 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 1 -2 +BITMAP +0018 +0008 +3F88 +0088 +0088 +7F08 +0108 +0148 +FE88 +2418 +0468 +0408 +0408 +0408 +0008 +ENDCHAR +STARTCHAR D000 +ENCODING 53248 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 1 -2 +BITMAP +0018 +0008 +0008 +1F88 +0088 +3F88 +0128 +FFC8 +2208 +0278 +0008 +0C08 +0400 +0408 +07FC +ENDCHAR +STARTCHAR D004 +ENCODING 53252 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0010 +3F90 +0090 +0110 +3F10 +0150 +FEB0 +04D0 +0400 +0FF0 +0010 +0FF0 +0400 +07F8 +ENDCHAR +STARTCHAR D011 +ENCODING 53265 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 1 -2 +BITMAP +0038 +0008 +3F88 +0088 +0188 +3F08 +0148 +FE88 +0478 +0448 +01E0 +0210 +0210 +0310 +01E0 +ENDCHAR +STARTCHAR D018 +ENCODING 53272 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0110 +0090 +FC90 +0490 +1C90 +E890 +0E90 +F090 +1790 +1090 +1090 +1090 +0090 +0010 +ENDCHAR +STARTCHAR D02D +ENCODING 53293 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 1 -2 +BITMAP +0018 +00C8 +6E48 +1248 +0648 +7C48 +0448 +FF48 +09C8 +08C0 +01E0 +0210 +0210 +0230 +01E0 +ENDCHAR +STARTCHAR D034 +ENCODING 53300 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +3F90 +0090 +0110 +7F10 +2110 +01F0 +FF10 +2410 +0410 +0410 +0410 +0410 +0010 +ENDCHAR +STARTCHAR D035 +ENCODING 53301 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 16 1 -3 +BITMAP +0018 +0008 +3F88 +0088 +0188 +3F08 +0148 +FE88 +0408 +0400 +0FF8 +0008 +0008 +0008 +0008 +0008 +ENDCHAR +STARTCHAR D038 +ENCODING 53304 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0010 +7F10 +0110 +0310 +7E30 +01D0 +FE10 +0410 +0410 +0010 +1810 +0800 +0800 +0FF8 +ENDCHAR +STARTCHAR D03C +ENCODING 53308 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 1 -2 +BITMAP +0018 +0008 +3F88 +0088 +0088 +3F08 +0168 +FE88 +0200 +07F8 +0008 +07F8 +0200 +0200 +03FC +ENDCHAR +STARTCHAR D044 +ENCODING 53316 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 16 1 -3 +BITMAP +0018 +0008 +3F88 +0088 +0088 +3F08 +0148 +FE88 +0408 +0400 +07F8 +0208 +0208 +0210 +03F8 +0200 +ENDCHAR +STARTCHAR D045 +ENCODING 53317 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 16 1 -3 +BITMAP +0018 +0008 +3F88 +0088 +0088 +3F08 +0148 +FE88 +0408 +0608 +0208 +03F8 +0208 +0208 +03F8 +0208 +ENDCHAR +STARTCHAR D047 +ENCODING 53319 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 1 -2 +BITMAP +0018 +0008 +3F88 +0088 +0108 +3F08 +0148 +FE88 +0408 +0588 +04C0 +00C0 +0130 +0208 +0C04 +ENDCHAR +STARTCHAR D049 +ENCODING 53321 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 1 -2 +BITMAP +0018 +0008 +3F88 +0088 +0188 +3F08 +0148 +FE88 +0408 +0448 +01B0 +0208 +0208 +0318 +01F0 +ENDCHAR +STARTCHAR D050 +ENCODING 53328 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 2 -2 +BITMAP +3FF0 +0010 +0010 +7FE0 +0020 +0020 +FFFC +0840 +0840 +0840 +0840 +0840 +0840 +0840 +ENDCHAR +STARTCHAR D054 +ENCODING 53332 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 13 2 -1 +BITMAP +3FF0 +0010 +0030 +7FE0 +0020 +0040 +FFFC +0440 +0440 +1440 +1040 +1020 +1FF0 +ENDCHAR +STARTCHAR D058 +ENCODING 53336 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0070 +3FE0 +0020 +00C0 +3F40 +007C +FF80 +0880 +0880 +3FC0 +0040 +3FC0 +1000 +1000 +1FE0 +ENDCHAR +STARTCHAR D060 +ENCODING 53344 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 14 2 -2 +BITMAP +3FE0 +0020 +0020 +7FC0 +0040 +0058 +FFA0 +0880 +0880 +3FC0 +1040 +1080 +1F80 +1000 +ENDCHAR +STARTCHAR D06C +ENCODING 53356 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 9 1 1 +BITMAP +3FF8 +0008 +0018 +0030 +3FD0 +0010 +0020 +0020 +FFFE +ENDCHAR +STARTCHAR D06D +ENCODING 53357 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -3 +BITMAP +3FF0 +0030 +0020 +7FE0 +0020 +0040 +FFFC +4000 +0000 +3FE0 +0020 +0020 +0020 +0020 +0020 +ENDCHAR +STARTCHAR D070 +ENCODING 53360 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 12 1 -1 +BITMAP +1FF8 +0008 +0010 +0030 +1FD0 +0020 +FFFE +3000 +0800 +0800 +0800 +0FF8 +ENDCHAR +STARTCHAR D074 +ENCODING 53364 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +1FF8 +0018 +0010 +3FF0 +0010 +0020 +FFFE +0000 +0FE0 +0020 +1FF0 +0800 +0800 +07F8 +ENDCHAR +STARTCHAR D07C +ENCODING 53372 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +1FF8 +0010 +0010 +0070 +1FA0 +0020 +FFFE +0000 +0000 +1FE0 +0820 +0820 +0FE0 +0800 +ENDCHAR +STARTCHAR D07D +ENCODING 53373 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +1FF8 +0010 +0010 +3FF0 +0020 +0020 +FFFE +0000 +0C60 +0420 +07E0 +0420 +07E0 +0420 +ENDCHAR +STARTCHAR D081 +ENCODING 53377 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +1FF8 +0010 +0010 +3FF0 +0020 +0020 +FFFE +0000 +0100 +06C0 +0820 +0820 +0C60 +07C0 +ENDCHAR +STARTCHAR D0A4 +ENCODING 53412 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0070 +0010 +0010 +7F10 +0310 +0210 +0E10 +F410 +0410 +0810 +1010 +2010 +4010 +0010 +0010 +ENDCHAR +STARTCHAR D0A5 +ENCODING 53413 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0030 +0010 +7F10 +0210 +0610 +FC10 +0810 +1010 +2010 +4000 +BFE0 +0020 +0020 +0020 +0020 +0020 +ENDCHAR +STARTCHAR D0A8 +ENCODING 53416 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 3 -2 +BITMAP +00C0 +0020 +0020 +7E20 +0420 +1C20 +E820 +1020 +2020 +4020 +A020 +1020 +1000 +1000 +0FF0 +ENDCHAR +STARTCHAR D0AC +ENCODING 53420 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0010 +7F10 +0210 +0210 +FC10 +0810 +1010 +2000 +DFF0 +0020 +1FF0 +0800 +0800 +0FF8 +ENDCHAR +STARTCHAR D0B4 +ENCODING 53428 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0030 +0010 +7F10 +0210 +0210 +FC10 +0810 +1010 +2010 +4000 +1FE0 +0820 +0820 +0840 +0FE0 +0800 +ENDCHAR +STARTCHAR D0B5 +ENCODING 53429 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0030 +0010 +8710 +7A10 +0610 +FC10 +0810 +1010 +2000 +CC10 +0410 +07F0 +0410 +0410 +07F0 +0410 +ENDCHAR +STARTCHAR D0B7 +ENCODING 53431 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0010 +7F10 +0210 +0210 +FC10 +0810 +1010 +2010 +4190 +0080 +0180 +0260 +0410 +1808 +ENDCHAR +STARTCHAR D0B9 +ENCODING 53433 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +7F10 +0110 +0210 +FE10 +0410 +0810 +1010 +6080 +0340 +0420 +0420 +0660 +03C0 +ENDCHAR +STARTCHAR D0C0 +ENCODING 53440 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 16 2 -3 +BITMAP +0060 +0020 +0220 +FE20 +4020 +4020 +4220 +7E20 +403C +4020 +41E0 +7E20 +2020 +0020 +0020 +0020 +ENDCHAR +STARTCHAR D0C1 +ENCODING 53441 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 16 2 -3 +BITMAP +00C0 +0220 +FE20 +4020 +4020 +7E3C +4060 +43A0 +3C20 +0000 +3FE0 +0020 +0020 +0020 +0020 +0020 +ENDCHAR +STARTCHAR D0C4 +ENCODING 53444 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0040 +0020 +0220 +FF20 +4020 +7E20 +403C +4060 +4FA0 +7020 +1020 +0820 +0800 +0800 +0FF8 +ENDCHAR +STARTCHAR D0C8 +ENCODING 53448 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +00C0 +0220 +FE20 +4020 +4020 +7C3C +40E0 +4F20 +3000 +1FE0 +0040 +1FE0 +0800 +0800 +0FF0 +ENDCHAR +STARTCHAR D0C9 +ENCODING 53449 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0060 +0020 +FC20 +4020 +4E20 +703C +41E0 +7E20 +0000 +3DE0 +0420 +7C20 +2020 +2620 +3820 +ENDCHAR +STARTCHAR D0D0 +ENCODING 53456 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +00C0 +0220 +FE20 +4020 +4020 +7E20 +4038 +40E0 +7F20 +0000 +1FE0 +0840 +0840 +0FC0 +0800 +ENDCHAR +STARTCHAR D0D1 +ENCODING 53457 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 16 2 -3 +BITMAP +0040 +0020 +0620 +F820 +4020 +4E20 +7038 +43E0 +7C20 +1820 +0820 +0FE0 +0820 +0820 +0FE0 +0820 +ENDCHAR +STARTCHAR D0D3 +ENCODING 53459 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0040 +0020 +FE20 +4020 +4020 +4E2C +7030 +40E0 +4F20 +3220 +0180 +0180 +0240 +0430 +1810 +ENDCHAR +STARTCHAR D0D4 +ENCODING 53460 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0040 +0020 +FE20 +4020 +4020 +5E3C +6020 +43E0 +3C20 +0860 +0420 +0C60 +0A50 +1198 +6108 +ENDCHAR +STARTCHAR D0D5 +ENCODING 53461 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0040 +0020 +CE20 +7020 +4020 +7E20 +403C +43E0 +7C20 +00A0 +0340 +0420 +0420 +0660 +03C0 +ENDCHAR +STARTCHAR D0DC +ENCODING 53468 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0190 +0090 +DC90 +6090 +4090 +4090 +7CF0 +4090 +4790 +7890 +0090 +0090 +0090 +0010 +ENDCHAR +STARTCHAR D0DD +ENCODING 53469 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 11 15 3 -2 +BITMAP +00C0 +0320 +0920 +F120 +8120 +B920 +C1E0 +8120 +9F20 +6120 +7FC0 +0040 +0040 +0040 +0040 +ENDCHAR +STARTCHAR D0E0 +ENCODING 53472 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 14 2 -1 +BITMAP +0030 +0010 +0190 +CC90 +7090 +4090 +7CF0 +4390 +7C90 +6090 +1890 +0810 +0800 +0FF8 +ENDCHAR +STARTCHAR D0E4 +ENCODING 53476 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 14 2 -2 +BITMAP +0130 +CC90 +7090 +4090 +7C90 +40F0 +4390 +7C90 +7FE0 +0020 +1FE0 +0800 +0800 +0FF0 +ENDCHAR +STARTCHAR D0EC +ENCODING 53484 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 11 16 3 -3 +BITMAP +0040 +0320 +1120 +E120 +8120 +F920 +81E0 +8320 +9D20 +E120 +1FC0 +1040 +1040 +1080 +1FC0 +1000 +ENDCHAR +STARTCHAR D0ED +ENCODING 53485 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0030 +0090 +8C90 +7090 +4090 +7890 +40F0 +4790 +7890 +0C90 +0410 +07F0 +0410 +0410 +07F0 +0410 +ENDCHAR +STARTCHAR D0EF +ENCODING 53487 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 3 -2 +BITMAP +00C0 +0320 +0120 +F120 +8120 +B920 +C1E0 +8120 +8F20 +F320 +0300 +0300 +04C0 +0820 +3010 +ENDCHAR +STARTCHAR D0F0 +ENCODING 53488 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0110 +8C90 +7090 +4090 +7C90 +41F0 +7E90 +7090 +00E0 +0420 +0420 +0A60 +1198 +2108 +ENDCHAR +STARTCHAR D0F1 +ENCODING 53489 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0020 +0110 +CC90 +7090 +4090 +7C90 +40F0 +4390 +7C90 +0090 +03C0 +0420 +0420 +0620 +03C0 +ENDCHAR +STARTCHAR D0F8 +ENCODING 53496 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 16 2 -3 +BITMAP +0060 +0020 +0220 +FE20 +4020 +402C +4230 +7E20 +4020 +4020 +41FC +7E20 +2020 +0020 +0020 +0020 +ENDCHAR +STARTCHAR D10D +ENCODING 53517 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0080 +0060 +0020 +FC20 +403C +4620 +7820 +4064 +47B8 +78A0 +0340 +0420 +0420 +0660 +03C0 +ENDCHAR +STARTCHAR D130 +ENCODING 53552 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +0010 +FC10 +4010 +4010 +4CF0 +7010 +4010 +4090 +4F10 +7010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR D131 +ENCODING 53553 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0030 +0010 +CE10 +7010 +41F0 +7C10 +4010 +4310 +7C10 +0000 +3FE0 +0020 +0020 +0020 +0020 +0020 +ENDCHAR +STARTCHAR D134 +ENCODING 53556 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0010 +FE10 +4010 +4010 +4CF0 +7010 +4010 +4310 +7C10 +0010 +1800 +0800 +0800 +0FF8 +ENDCHAR +STARTCHAR D138 +ENCODING 53560 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +0210 +FC10 +41F0 +5C10 +6010 +4110 +7FE0 +0020 +0020 +1FE0 +0800 +0810 +0FF0 +ENDCHAR +STARTCHAR D13A +ENCODING 53562 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0030 +0010 +0210 +FC10 +41F0 +5C10 +6010 +4110 +7E00 +35F0 +0520 +6D20 +3120 +2320 +3DF0 +0100 +ENDCHAR +STARTCHAR D140 +ENCODING 53568 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0030 +8610 +7810 +4010 +5CF0 +6010 +4010 +4610 +7810 +0000 +0FF0 +0410 +0410 +0410 +07F0 +0400 +ENDCHAR +STARTCHAR D141 +ENCODING 53569 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +8610 +7810 +4010 +5DF0 +6010 +4010 +4610 +7C10 +0410 +07F0 +0410 +0410 +07F0 +0410 +ENDCHAR +STARTCHAR D143 +ENCODING 53571 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0010 +0610 +F810 +4010 +5CF0 +6010 +4010 +4710 +7B10 +0090 +0100 +02C0 +0430 +1808 +ENDCHAR +STARTCHAR D144 +ENCODING 53572 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0610 +F810 +4010 +5CF0 +6010 +4090 +4710 +7810 +0830 +0430 +0C20 +1A50 +2088 +4100 +ENDCHAR +STARTCHAR D145 +ENCODING 53573 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +8610 +7810 +4010 +4DF0 +7010 +4010 +4610 +78D0 +0320 +0410 +0410 +0630 +03E0 +ENDCHAR +STARTCHAR D14C +ENCODING 53580 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0020 +0310 +0090 +DC90 +6090 +4090 +5890 +6390 +4090 +4490 +7890 +0090 +0090 +0090 +0010 +ENDCHAR +STARTCHAR D14D +ENCODING 53581 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 11 15 3 -2 +BITMAP +0060 +0320 +0120 +F920 +8120 +9F20 +E120 +8520 +F920 +0000 +3FE0 +0020 +0020 +0020 +0020 +ENDCHAR +STARTCHAR D150 +ENCODING 53584 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0030 +0110 +0090 +FC90 +4090 +4090 +7B90 +4090 +4490 +7890 +0890 +0410 +0400 +0400 +07FC +ENDCHAR +STARTCHAR D154 +ENCODING 53588 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 3 -2 +BITMAP +0060 +0220 +0120 +F120 +8120 +F720 +8120 +8920 +F100 +1FE0 +0020 +1FE0 +0800 +0800 +0FF0 +ENDCHAR +STARTCHAR D15C +ENCODING 53596 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0030 +0110 +0890 +F090 +4090 +7F90 +4090 +4490 +7890 +0080 +0FF0 +0410 +0420 +0420 +07F0 +0400 +ENDCHAR +STARTCHAR D15D +ENCODING 53597 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0030 +0190 +0C90 +F090 +4090 +7B90 +4090 +4C90 +7090 +0810 +0410 +07F0 +0410 +0410 +07F0 +0410 +ENDCHAR +STARTCHAR D15F +ENCODING 53599 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0190 +0C90 +F090 +4090 +7B90 +4090 +4490 +7890 +0190 +0180 +0180 +0240 +0430 +1808 +ENDCHAR +STARTCHAR D161 +ENCODING 53601 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 1 -2 +BITMAP +0030 +00C8 +EE48 +3048 +2048 +3DC8 +2048 +2248 +3C48 +00C8 +0320 +0210 +0210 +0330 +01E0 +ENDCHAR +STARTCHAR D168 +ENCODING 53608 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +0010 +FC10 +41F0 +4010 +4C10 +7070 +4090 +4010 +4610 +7810 +0010 +0010 +0010 +ENDCHAR +STARTCHAR D16C +ENCODING 53612 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +FE10 +41F0 +4010 +4C10 +71F0 +4010 +4210 +7C10 +1010 +0800 +0800 +0830 +07F0 +ENDCHAR +STARTCHAR D17C +ENCODING 53628 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 16 2 -3 +BITMAP +0030 +0010 +0610 +F9F0 +4010 +4C10 +71F0 +4010 +4610 +7810 +0C20 +0420 +0C60 +1290 +2108 +C000 +ENDCHAR +STARTCHAR D184 +ENCODING 53636 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0020 +0310 +0090 +DC90 +6090 +4790 +5890 +6090 +4390 +4490 +7890 +0090 +0090 +0090 +0010 +ENDCHAR +STARTCHAR D188 +ENCODING 53640 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 3 -2 +BITMAP +0060 +0320 +0120 +F120 +8320 +B120 +C720 +8520 +F920 +0120 +0120 +1820 +0800 +0800 +0FF8 +ENDCHAR +STARTCHAR D1A0 +ENCODING 53664 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 11 1 0 +BITMAP +3FF8 +1000 +1000 +1FF0 +1000 +1000 +1010 +1FF8 +0100 +0100 +FFFE +ENDCHAR +STARTCHAR D1A1 +ENCODING 53665 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 1 -2 +BITMAP +1FE0 +1000 +1000 +1FE0 +1020 +1FE0 +0104 +FFFC +0000 +3FE0 +0020 +0020 +0020 +0020 +ENDCHAR +STARTCHAR D1A4 +ENCODING 53668 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +1FF0 +1000 +1000 +1FF0 +1010 +1FF0 +0100 +C1FE +FE00 +1000 +0800 +0800 +0800 +07F8 +ENDCHAR +STARTCHAR D1A8 +ENCODING 53672 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +3FF0 +1000 +1FE0 +1000 +1FF0 +0100 +0100 +FFFE +1FF0 +0020 +0020 +0FF0 +0800 +0FF8 +ENDCHAR +STARTCHAR D1B0 +ENCODING 53680 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 2 -2 +BITMAP +1F60 +1080 +1FE0 +1000 +1000 +0FE0 +0200 +FFFC +0000 +3FC0 +1040 +1080 +1FC0 +1000 +ENDCHAR +STARTCHAR D1B1 +ENCODING 53681 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +3FF0 +1000 +1FE0 +1000 +1030 +0FC0 +0100 +FFFE +3860 +0820 +0FE0 +0820 +0FE0 +0820 +ENDCHAR +STARTCHAR D1B3 +ENCODING 53683 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 1 -2 +BITMAP +1FE0 +1000 +1000 +1FE0 +1000 +1FE0 +0100 +FFFC +0000 +0100 +0300 +02C0 +0C30 +1010 +ENDCHAR +STARTCHAR D1B5 +ENCODING 53685 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +1FF0 +1000 +1FE0 +1000 +1030 +0FC0 +0100 +FFFE +0100 +06C0 +0820 +0820 +0C60 +07C0 +ENDCHAR +STARTCHAR D1BA +ENCODING 53690 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 2 -2 +BITMAP +0FE0 +3000 +1FE0 +1000 +1020 +1FC0 +0200 +FFFC +0000 +3FE0 +0880 +0C80 +0100 +7FF0 +ENDCHAR +STARTCHAR D1BC +ENCODING 53692 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0060 +01A0 +7FA0 +2020 +2120 +3F20 +2020 +21A0 +3E3C +0420 +07E0 +F820 +0020 +0020 +0020 +ENDCHAR +STARTCHAR D1C0 +ENCODING 53696 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +0030 +0110 +3F90 +2010 +3F90 +2090 +3F1E +0410 +07F0 +F810 +0C10 +0410 +0400 +07F8 +ENDCHAR +STARTCHAR D1D8 +ENCODING 53720 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -3 +BITMAP +0130 +0090 +0C90 +7090 +4C90 +7090 +5E90 +28F0 +0990 +0E90 +F090 +0090 +0090 +0090 +0010 +ENDCHAR +STARTCHAR D1F4 +ENCODING 53748 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0030 +0010 +7F90 +2010 +2010 +3F10 +2010 +2090 +3F10 +0410 +07F0 +FE10 +0010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR D1F8 +ENCODING 53752 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0110 +3F10 +2010 +3F10 +2190 +3E10 +0470 +0790 +F810 +0010 +1800 +0800 +0800 +0FF8 +ENDCHAR +STARTCHAR D207 +ENCODING 53767 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0070 +0130 +7F10 +2110 +3F10 +2090 +3F10 +04F0 +0F10 +F110 +0090 +0180 +0360 +0410 +1808 +ENDCHAR +STARTCHAR D209 +ENCODING 53769 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 11 15 3 -2 +BITMAP +00E0 +0260 +7F20 +4020 +7E20 +4120 +7E20 +0820 +1FE0 +E220 +0580 +0840 +0840 +0CC0 +0780 +ENDCHAR +STARTCHAR D210 +ENCODING 53776 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 13 2 -1 +BITMAP +0060 +7FE0 +2000 +2000 +3FE0 +2000 +2020 +3FE0 +10C0 +0840 +0848 +FFFC +4000 +ENDCHAR +STARTCHAR D22C +ENCODING 53804 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +1FF8 +0800 +0800 +0FF0 +0800 +0FF8 +0000 +FFFE +0100 +0100 +0100 +0100 +0100 +0100 +ENDCHAR +STARTCHAR D22D +ENCODING 53805 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +1FF0 +0800 +0FF0 +0800 +0FF0 +0000 +0000 +FFFE +0100 +01E0 +1E20 +0020 +0020 +0020 +ENDCHAR +STARTCHAR D230 +ENCODING 53808 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +2070 +1FA0 +1FE0 +1000 +1000 +1FF0 +0004 +FFFE +0100 +0100 +1900 +0900 +0800 +0FF0 +ENDCHAR +STARTCHAR D234 +ENCODING 53812 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 2 -2 +BITMAP +0FF0 +3000 +1FE0 +1000 +1FE0 +0000 +FFFC +0200 +0200 +1DC0 +0040 +1FC0 +1000 +1FE0 +ENDCHAR +STARTCHAR D23C +ENCODING 53820 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -3 +BITMAP +3FF0 +1000 +1FE0 +1000 +1000 +1FF0 +0000 +FFFE +0100 +1F00 +08E0 +0820 +0820 +0FE0 +0800 +ENDCHAR +STARTCHAR D23D +ENCODING 53821 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -3 +BITMAP +1FF8 +0810 +0FF0 +0810 +0FF0 +0000 +FFFE +0100 +1920 +0920 +0FE0 +0820 +0820 +0FE0 +0820 +ENDCHAR +STARTCHAR D23F +ENCODING 53823 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -3 +BITMAP +0FF8 +0800 +0FF0 +0800 +0FF0 +0000 +0000 +FFFE +0100 +0100 +0100 +0300 +06C0 +0830 +3010 +ENDCHAR +STARTCHAR D241 +ENCODING 53825 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +0FF8 +0800 +0FF0 +0800 +0FF8 +0000 +0000 +FFFE +0100 +0300 +0CE0 +0820 +0C60 +07C0 +ENDCHAR +STARTCHAR D248 +ENCODING 53832 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 1 -2 +BITMAP +0018 +0008 +3FC8 +1008 +1F88 +10C8 +1FC8 +0008 +00C8 +FF08 +04F8 +0408 +0408 +0408 +0008 +ENDCHAR +STARTCHAR D25C +ENCODING 53852 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0110 +7F10 +2310 +3F10 +2110 +3F10 +FE10 +04F0 +0000 +0C30 +0420 +0A60 +1158 +2188 +ENDCHAR +STARTCHAR D264 +ENCODING 53860 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0090 +0050 +FC50 +4050 +7C50 +4050 +7C50 +0050 +0E50 +7850 +09D0 +0850 +0850 +0010 +ENDCHAR +STARTCHAR D280 +ENCODING 53888 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0070 +0010 +3F90 +2010 +3810 +2610 +2010 +3F90 +0010 +00F0 +FF10 +0410 +0410 +0410 +0410 +0010 +ENDCHAR +STARTCHAR D281 +ENCODING 53889 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0030 +7F10 +2010 +3F10 +2010 +3F10 +0010 +FFF0 +0410 +0400 +1FF0 +0010 +0010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR D284 +ENCODING 53892 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 3 -2 +BITMAP +0060 +0020 +FE20 +4220 +7E20 +4020 +7E60 +3FA0 +C820 +0820 +0020 +1800 +0800 +0800 +0FF0 +ENDCHAR +STARTCHAR D288 +ENCODING 53896 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 1 -2 +BITMAP +0018 +0008 +3F88 +1008 +1F88 +1088 +1F88 +0078 +FF88 +0600 +07F8 +0008 +0FF8 +0400 +07F8 +ENDCHAR +STARTCHAR D290 +ENCODING 53904 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0030 +7F10 +2010 +3F10 +2010 +3F90 +0030 +FFD0 +0410 +0400 +0FF0 +0410 +0420 +0420 +07F0 +0400 +ENDCHAR +STARTCHAR D291 +ENCODING 53905 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 16 1 -3 +BITMAP +0018 +3F88 +1008 +1F88 +1008 +1F88 +0008 +FFF8 +2408 +0418 +0608 +03F8 +0208 +0208 +03F8 +0208 +ENDCHAR +STARTCHAR D295 +ENCODING 53909 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +3F10 +2010 +3F10 +2010 +3F10 +0010 +FFF0 +0410 +0490 +0360 +0410 +0410 +0630 +03E0 +ENDCHAR +STARTCHAR D29C +ENCODING 53916 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 2 -2 +BITMAP +1FF0 +1000 +1FE0 +1000 +1000 +1FF0 +0000 +FFFC +0840 +0840 +0840 +0840 +0840 +0840 +ENDCHAR +STARTCHAR D2A0 +ENCODING 53920 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 2 -2 +BITMAP +3FE0 +1000 +1000 +1FE0 +1000 +1FF0 +0000 +FFFC +0840 +0840 +3040 +1040 +1000 +1FF0 +ENDCHAR +STARTCHAR D2A4 +ENCODING 53924 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 2 -2 +BITMAP +3FE0 +1000 +1FE0 +1020 +1FE0 0000 -0C00 +FFFC +0880 +0880 +3FE0 +0040 +1FE0 +1000 +1FF0 +ENDCHAR +STARTCHAR D2AC +ENCODING 53932 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +1FF0 +0800 +0FE0 +0810 +0FF0 +0000 +FFFE +0C40 +0C60 +1FE0 +0820 +0840 +0FE0 +0800 +ENDCHAR +STARTCHAR D2B1 +ENCODING 53937 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 2 -2 +BITMAP +1FF0 +1000 +1FE0 +1000 +1000 +1FF0 +0000 +FFFC +0940 +0FC0 +0840 +0840 +0840 +0780 +ENDCHAR +STARTCHAR D2B8 +ENCODING 53944 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 11 1 0 +BITMAP +1FF0 +3000 +1000 +1000 +1FF0 +1000 +1030 +1FF0 +0000 +0000 +FFFE +ENDCHAR +STARTCHAR D2B9 +ENCODING 53945 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -3 +BITMAP +3FE0 +1000 +1FE0 +1000 +1000 +1FF0 +0000 +FFFE +2000 +3FE0 +0020 +0020 +0020 +0020 +0020 +ENDCHAR +STARTCHAR D2BC +ENCODING 53948 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +0070 +3FF0 +1000 +1FE0 +1000 +1FF0 +0004 +FFFE +0000 +0000 +0800 +0800 +0810 +07F8 +ENDCHAR +STARTCHAR D2BF +ENCODING 53951 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +1FF0 +0800 +0FF0 +0800 +0FF0 +0000 +FFFE +2000 +0020 +1FF0 +0800 +0800 +0800 +0FF0 +ENDCHAR +STARTCHAR D2C0 +ENCODING 53952 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 2 -2 +BITMAP +1FC0 +6000 +3FC0 +2000 +2000 +3FC0 +7800 +87FC +03E0 +3C40 +0040 +3FE0 +1000 +1FF0 +ENDCHAR +STARTCHAR D2C2 +ENCODING 53954 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -3 +BITMAP +1FF0 +0800 +0FF0 +0800 +0FF0 +0000 +0004 +FFFE +2000 +3EF8 +0290 +3E90 +1090 +16F0 +0880 +ENDCHAR +STARTCHAR D2C8 +ENCODING 53960 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -3 +BITMAP +3FF0 +1000 +1FE0 +1000 +1020 +1FF0 +0004 +FFFE +0000 +1FE0 +0820 +0820 +0820 +0FE0 +0800 +ENDCHAR +STARTCHAR D2C9 +ENCODING 53961 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 +BITMAP +1FF0 +0800 +0FF0 +0800 +0FF0 +0000 +0004 +FFFE +3820 +0820 +0FE0 +0820 +0FE0 +0820 +ENDCHAR +STARTCHAR D2CB +ENCODING 53963 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 2 -2 +BITMAP +3FF0 +1000 +1FE0 +1020 +1FF0 +0000 +0000 +FFFC 0400 -0500 0200 +0600 +0D80 +1060 +6020 +ENDCHAR +STARTCHAR D2D4 +ENCODING 53972 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 11 15 3 -2 +BITMAP +0040 +0020 +7F20 +4020 +4020 +7F20 +4020 +4020 +3F20 +01E0 +FE20 +0020 +0020 +0020 +0020 +ENDCHAR +STARTCHAR D2D8 +ENCODING 53976 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 14 3 -1 +BITMAP +0060 +0220 +FE20 +4020 +7E20 +4120 +7F20 +0020 +1FE0 +E020 +3020 +1000 +1000 +1FF0 +ENDCHAR +STARTCHAR D2DC +ENCODING 53980 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0110 +7F10 +2010 +3F10 +2190 +3F90 +00F0 +FF10 +0000 +0FF0 +0010 +07F0 +0400 +07F8 +ENDCHAR +STARTCHAR D2E4 +ENCODING 53988 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0110 +7F10 +2010 +3F10 +2190 +3F90 +00F0 +FF10 +0000 +0FF0 +0410 +0420 +07F0 +0400 +ENDCHAR +STARTCHAR D2E5 +ENCODING 53989 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 11 15 3 -2 +BITMAP +0060 +0020 +7E20 +4020 +7E20 +4020 +7F20 +07E0 +F800 +1860 +0860 +0FC0 +0840 +0FC0 +0840 +ENDCHAR +STARTCHAR D2F0 +ENCODING 54000 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0060 +0010 +0210 +FE10 +4010 +4010 +4210 +7E10 +4010 +4010 +40F0 +7F10 +0010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR D2F1 +ENCODING 54001 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 10 15 4 -2 +BITMAP +01C0 +0440 +FC40 +8040 +8440 +FC40 +80C0 +8740 +7840 +0000 +7F80 +0080 +0080 +0080 +0080 +ENDCHAR +STARTCHAR D2F4 +ENCODING 54004 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 3 -2 +BITMAP +0060 +0020 +0420 +FC20 +8420 +FC20 +8020 +80E0 +FF20 +4020 +1020 +0820 +0800 +0800 +07F0 +ENDCHAR +STARTCHAR D2F8 +ENCODING 54008 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 11 15 4 -2 +BITMAP +01C0 +0040 +FC40 +8040 +8040 +FC40 +80C0 +8F40 +7000 +3FC0 +0040 +3FC0 +1000 +1000 +1FE0 +ENDCHAR +STARTCHAR D300 +ENCODING 54016 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 11 16 3 -3 +BITMAP +0060 +0420 +FC20 +8020 +8420 +FC20 +8020 +83E0 +7C20 +0000 +3FC0 +1040 +1040 +1080 +1FC0 +1000 +ENDCHAR +STARTCHAR D301 +ENCODING 54017 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0030 +0010 +FF10 +2010 +2010 +3F10 +2010 +21F0 +3E10 +0C20 +0420 +07E0 +0420 +0420 +07E0 +0420 +ENDCHAR +STARTCHAR D303 +ENCODING 54019 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 11 15 3 -2 +BITMAP +0060 +0020 +FC20 +8020 +8020 +FC20 +8020 +80E0 +8F20 +7620 +0300 +0300 +0480 +1860 +2020 +ENDCHAR +STARTCHAR D305 +ENCODING 54021 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 11 15 3 -2 +BITMAP +0060 +0020 +DE20 +6020 +4020 +7E20 +4020 +43E0 +7C20 +0120 +0680 +0840 +0840 +0CC0 +0780 +ENDCHAR +STARTCHAR D30C +ENCODING 54028 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0060 +0020 +00A0 +7FA0 +0620 +2120 +1220 +123C +1220 +03E0 +FC20 +0020 +0020 +0020 +0020 +ENDCHAR +STARTCHAR D30D +ENCODING 54029 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +00C0 +01A0 +7FA0 +0020 +2220 +122C +1230 +03E0 +FC20 +3FE0 +0020 +0020 +0020 +0020 +0020 +ENDCHAR +STARTCHAR D30E +ENCODING 54030 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0060 +01A0 +7F20 +0220 +2220 +143C +13E0 +FC20 +0000 +07E0 +3C20 +0420 +0420 +0420 +0420 +ENDCHAR +STARTCHAR D310 +ENCODING 54032 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 2 -2 +BITMAP +0060 +01A0 +7E20 +2620 +2220 +1220 +123C +05E0 +FA20 +0020 +1820 +0820 +0800 +0FF0 +ENDCHAR +STARTCHAR D314 +ENCODING 54036 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 2 -2 +BITMAP +0160 +7F20 +0020 +2320 +1220 +123C +03E0 +FC20 +1FE0 +0020 +0020 +0FE0 +0800 +0FF8 +ENDCHAR +STARTCHAR D316 +ENCODING 54038 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 16 1 -3 +BITMAP +0060 +0090 +3FD0 +0310 +1110 +1910 +027C +FF90 +2010 +3EF8 +0290 +3690 +1890 +1190 +1EF8 +0080 +ENDCHAR +STARTCHAR D31C +ENCODING 54044 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 3 -2 +BITMAP +0180 +0040 +FF40 +0040 +4440 +2448 +2470 +0FC0 +F040 +0000 +3FC0 +1080 +1080 +1080 +1F00 ENDCHAR -STARTCHAR 0x1FCD -ENCODING 8141 -SWIDTH 360 0 -DWIDTH 6 0 -BBX 5 4 1 11 +STARTCHAR D31D +ENCODING 54045 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 16 2 -3 BITMAP -D0 -D0 -48 -88 +00C0 +0120 +7FA0 +0020 +2220 +2220 +143C +03E0 +FC20 +1820 +0820 +0FE0 +0820 +0820 +0FE0 +0820 ENDCHAR -STARTCHAR 0x1FCE -ENCODING 8142 -SWIDTH 360 0 -DWIDTH 6 0 -BBX 5 4 1 11 +STARTCHAR D31F +ENCODING 54047 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 BITMAP -C8 -C8 -50 -90 +00C0 +0020 +01A0 +3E20 +2320 +1220 +123C +1460 +FFA0 +4120 +00A0 +0180 +0260 +0410 +1808 ENDCHAR -STARTCHAR 0x1FCF -ENCODING 8143 -SWIDTH 360 0 -DWIDTH 6 0 -BBX 5 8 1 11 +STARTCHAR D320 +ENCODING 54048 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 3 -2 BITMAP -48 -A8 -90 -00 -30 -30 -10 -20 +0180 +0040 +FF40 +0C40 +4440 +2448 +2470 +0FC0 +F040 +10C0 +0840 +1480 +2540 +4230 +8410 ENDCHAR -STARTCHAR 0x1FD0 -ENCODING 8144 -SWIDTH 300 0 -DWIDTH 5 0 -BBX 5 11 0 0 +STARTCHAR D321 +ENCODING 54049 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 BITMAP -88 -70 -00 -00 -20 -60 -20 -20 -20 -28 -10 +00C0 +0120 +7FA0 +0020 +2320 +122C +1230 +14E0 +FF20 +00A0 +0340 +0420 +0420 +0660 +03C0 ENDCHAR -STARTCHAR 0x1FD1 -ENCODING 8145 -SWIDTH 300 0 -DWIDTH 5 0 -BBX 5 10 0 0 +STARTCHAR D325 +ENCODING 54053 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 BITMAP -F8 -00 -00 -20 -60 -20 -20 -20 -28 -10 +00C0 +0020 +7FA0 +0020 +2220 +1220 +1478 +1FA0 +E000 +0FE0 +0800 +0FE0 +0800 +0800 +07F0 ENDCHAR -STARTCHAR 0x1FD2 -ENCODING 8146 -SWIDTH 300 0 -DWIDTH 5 0 -BBX 6 13 -1 0 +STARTCHAR D328 +ENCODING 54056 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 1 -2 BITMAP -20 -20 -DC -CC -00 -00 -10 -30 -10 -10 -10 -14 -08 +0018 +00C8 +0048 +4748 +3848 +2248 +2248 +1478 +1448 +8FC8 +7048 +0048 +0048 +0048 +0008 ENDCHAR -STARTCHAR 0x1FD3 -ENCODING 8147 -SWIDTH 300 0 -DWIDTH 5 0 -BBX 6 13 -1 0 +STARTCHAR D329 +ENCODING 54057 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 BITMAP -10 -10 -EC -CC -00 -00 -10 -30 -10 -10 -10 -14 -08 +0060 +0090 +0050 +7E50 +0050 +2250 +2270 +0450 +05D0 +FA50 +1FF0 +0010 +0010 +0010 +0010 +0010 ENDCHAR -STARTCHAR 0x1FD6 -ENCODING 8150 -SWIDTH 300 0 -DWIDTH 5 0 -BBX 5 12 0 0 +STARTCHAR D32C +ENCODING 54060 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 BITMAP -48 -A8 -90 -00 -00 -20 -60 -20 -20 -20 -28 -10 +0030 +0190 +0090 +7E90 +0490 +0490 +2890 +28F0 +0F90 +F090 +0090 +0C10 +0400 +0400 +07FC ENDCHAR -STARTCHAR 0x1FD7 -ENCODING 8151 -SWIDTH 300 0 -DWIDTH 5 0 -BBX 5 15 0 0 +STARTCHAR D330 +ENCODING 54064 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 BITMAP -48 -A8 -90 -00 -D8 -D8 -00 -00 -20 -60 -20 -20 -20 -28 -10 +0060 +0190 +0090 +FE90 +4490 +2490 +28F0 +0F90 +F090 +1FE0 +0020 +0020 +1FE0 +0800 +0FF0 ENDCHAR -STARTCHAR 0x1FD8 -ENCODING 8152 -SWIDTH 360 0 -DWIDTH 6 0 -BBX 5 14 1 0 +STARTCHAR D338 +ENCODING 54072 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 BITMAP -88 -70 -00 -F8 -20 -20 -20 -20 -20 -20 -20 -20 -20 -F8 +0040 +0130 +0090 +FE90 +4C90 +2490 +24F0 +2B90 +F490 +0090 +07F0 +0410 +0420 +0420 +07F0 ENDCHAR -STARTCHAR 0x1FD9 -ENCODING 8153 -SWIDTH 360 0 -DWIDTH 6 0 -BBX 5 13 1 0 +STARTCHAR D339 +ENCODING 54073 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 BITMAP -F8 -00 -F8 -20 -20 -20 -20 -20 -20 -20 -20 -20 -F8 +0060 +0110 +0090 +FE90 +4490 +2490 +24F0 +2B90 +F490 +0C90 +0410 +07F0 +0410 +0410 +07F0 +0410 ENDCHAR -STARTCHAR 0x1FDA -ENCODING 8154 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 8 13 0 0 +STARTCHAR D33B +ENCODING 54075 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -3 BITMAP -80 -80 -5F -44 -04 -04 -04 -04 -04 -04 -04 -04 -1F +0130 +0090 +FE90 +4C90 +4490 +28F0 +2890 +1F90 +E110 +0080 +0180 +0240 +0430 +0808 +1000 ENDCHAR -STARTCHAR 0x1FDB -ENCODING 8155 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 8 13 0 0 +STARTCHAR D33C +ENCODING 54076 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 BITMAP -40 -40 -9F -84 -04 -04 -04 -04 -04 -04 -04 -04 -1F +0060 +0190 +0090 +7C90 +4490 +2490 +24F0 +0790 +F890 +00D0 +0420 +0420 +0A60 +1298 +2104 ENDCHAR -STARTCHAR 0x1FDD -ENCODING 8157 -SWIDTH 360 0 -DWIDTH 6 0 -BBX 5 4 1 11 +STARTCHAR D33D +ENCODING 54077 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 14 2 -2 BITMAP -D0 -D0 -88 -48 +0130 +0090 +FC90 +4C90 +4490 +28F0 +2890 +1F90 +E090 +01C0 +0620 +0420 +0620 +03C0 ENDCHAR -STARTCHAR 0x1FDE -ENCODING 8158 -SWIDTH 360 0 -DWIDTH 6 0 -BBX 5 4 1 11 +STARTCHAR D344 +ENCODING 54084 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 BITMAP -C8 -C8 -90 -50 +00C0 +0020 +00A0 +7FA0 +0020 +032C +2130 +1220 +1220 +1264 +FFB8 +4020 +0020 +0020 +0020 ENDCHAR -STARTCHAR 0x1FDF -ENCODING 8159 -SWIDTH 360 0 -DWIDTH 6 0 -BBX 5 8 1 11 +STARTCHAR D345 +ENCODING 54085 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -2 BITMAP -48 -A8 -90 -00 -30 -30 -20 -10 +0060 +0010 +0010 +3F90 +011C +1110 +0910 +02FE +FD10 +1FF0 +0810 +0010 +0010 +0010 +0010 ENDCHAR -STARTCHAR 0x1FE0 -ENCODING 8160 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 6 11 1 0 +STARTCHAR D37C +ENCODING 54140 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 BITMAP -44 -38 -00 -00 -C8 -44 -44 -44 -44 -48 -30 +0030 +0010 +0110 +FF10 +0010 +0310 +22F0 +3210 +1210 +0490 +FF10 +0010 +0010 +0010 +0010 ENDCHAR -STARTCHAR 0x1FE1 -ENCODING 8161 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 6 10 1 0 +STARTCHAR D37D +ENCODING 54141 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 BITMAP -7C -00 -00 -C8 -44 -44 -44 -44 -48 -30 +0030 +0110 +FF10 +0610 +2210 +2270 +1210 +0510 +FA10 +0000 +1FF0 +0010 +0010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR D380 +ENCODING 54144 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 3 -2 +BITMAP +0060 +0020 +FF20 +0020 +4420 +45E0 +2420 +2820 +1E20 +E020 +0020 +0820 +0800 +0800 +07F0 +ENDCHAR +STARTCHAR D384 +ENCODING 54148 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 +BITMAP +0030 +0010 +FF10 +0610 +22F0 +3210 +1410 +0710 +7800 +1FE0 +0020 +1FE0 +0800 +0810 +0FF0 ENDCHAR -STARTCHAR 0x1FE2 -ENCODING 8162 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 6 13 1 0 +STARTCHAR D38C +ENCODING 54156 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 BITMAP -20 -20 -DC -CC -00 -00 -C8 -44 -44 -44 -44 -48 -30 +0030 +0010 +7F90 +0410 +2210 +2270 +1210 +1590 +FA10 +0000 +0FF0 +0420 +0420 +0420 +07F0 +0400 ENDCHAR -STARTCHAR 0x1FE3 -ENCODING 8163 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 6 13 1 0 +STARTCHAR D38D +ENCODING 54157 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 BITMAP -10 -10 -EC -CC -00 -00 -C8 -44 -44 -44 -44 -48 -30 +0030 +0110 +FF10 +0610 +22F0 +2210 +0410 +0F10 +F000 +0C10 +0410 +07F0 +0410 +0410 +07F0 +0410 ENDCHAR -STARTCHAR 0x1FE4 -ENCODING 8164 -SWIDTH 360 0 -DWIDTH 6 0 -BBX 5 17 1 -4 +STARTCHAR D38F +ENCODING 54159 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 BITMAP -30 -30 -10 -20 -00 -00 -70 -88 -88 -88 -88 -88 -F0 -80 -80 -80 -80 +0030 +0110 +FF10 +0610 +2310 +2270 +1210 +0590 +FA10 +0110 +0180 +0180 +0260 +0C10 +3008 ENDCHAR -STARTCHAR 0x1FE5 -ENCODING 8165 -SWIDTH 360 0 -DWIDTH 6 0 -BBX 5 17 1 -4 +STARTCHAR D390 +ENCODING 54160 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 BITMAP -60 -60 -40 -20 -00 -00 -70 -88 -88 -88 -88 -88 -F0 -80 -80 -80 -80 +0030 +0110 +FF10 +0610 +2210 +2270 +2210 +0590 +FA10 +0060 +0C20 +0840 +1E60 +2290 +4108 ENDCHAR -STARTCHAR 0x1FE6 -ENCODING 8166 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 6 12 1 0 +STARTCHAR D391 +ENCODING 54161 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 BITMAP -24 -54 -48 -00 -00 -C8 -44 -44 -44 -44 -48 -30 +0030 +0110 +FF10 +0610 +2310 +2270 +3210 +0590 +FA10 +0080 +0360 +0410 +0410 +0630 +03E0 ENDCHAR -STARTCHAR 0x1FE7 -ENCODING 8167 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 6 15 1 0 +STARTCHAR D398 +ENCODING 54168 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 1 -2 BITMAP -24 -54 -48 -00 -6C -6C -00 -00 -C8 -44 -44 -44 -44 -48 -30 +0018 +0008 +00C8 +0748 +3848 +2448 +2448 +17C8 +1448 +1948 +FE48 +0048 +0048 +0048 +0008 ENDCHAR -STARTCHAR 0x1FE8 -ENCODING 8168 -SWIDTH 840 0 -DWIDTH 14 0 -BBX 11 14 0 0 +STARTCHAR D399 +ENCODING 54169 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 16 1 -3 BITMAP -1100 -0E00 -0000 -F1E0 -2080 -1100 -1100 -0A00 -0E00 -0400 -0400 -0400 -0400 -1F00 +0030 +0098 +0348 +3C48 +2448 +17C8 +1448 +0648 +F848 +0008 +0FF8 +0408 +0008 +0008 +0008 +0008 ENDCHAR -STARTCHAR 0x1FE9 -ENCODING 8169 -SWIDTH 840 0 -DWIDTH 14 0 -BBX 11 13 0 0 +STARTCHAR D39C +ENCODING 54172 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 BITMAP -1F00 -0000 -F1E0 -2080 -1100 -1100 -0A00 -0E00 -0400 -0400 +0030 +0110 +0090 +FE90 +0890 +4490 +2B90 +2890 +0C90 +F090 +0090 +0410 0400 0400 -1F00 +07F8 ENDCHAR -STARTCHAR 0x1FEA -ENCODING 8170 -SWIDTH 840 0 -DWIDTH 14 0 -BBX 13 12 0 0 +STARTCHAR D3A0 +ENCODING 54176 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 BITMAP -8000 -BC78 -4820 -4440 -0440 -0280 -0380 -0100 -0100 -0100 -0100 -07C0 +0030 +0110 +0690 +7890 +4890 +2F90 +2890 +0C90 +FFE0 +0020 +0020 +1FE0 +0800 +0800 +0FF0 ENDCHAR -STARTCHAR 0x1FEB -ENCODING 8171 -SWIDTH 840 0 -DWIDTH 14 0 -BBX 13 12 0 0 +STARTCHAR D3A8 +ENCODING 54184 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 16 1 -3 BITMAP -4000 -7C78 -8820 -8440 -0440 -0280 -0380 -0100 -0100 -0100 -0100 -07C0 +0018 +0088 +0248 +7F48 +2448 +17C8 +1448 +0A48 +F448 +0040 +07F8 +0208 +0210 +0210 +03F8 +0200 ENDCHAR -STARTCHAR 0x1FEC -ENCODING 8172 -SWIDTH 780 0 -DWIDTH 13 0 -BBX 12 13 0 0 +STARTCHAR D3A9 +ENCODING 54185 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 16 1 -3 BITMAP -C000 -C000 -9FE0 -8430 -4410 -0410 -0430 -07E0 -0400 -0400 -0400 -0400 -1F00 +0018 +0088 +0348 +3C48 +2448 +17C8 +1448 +0A48 +F448 +0418 +0208 +03F8 +0208 +0208 +03F8 +0208 ENDCHAR -STARTCHAR 0x1FED -ENCODING 8173 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 6 4 2 11 +STARTCHAR D3AB +ENCODING 54187 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 1 -2 BITMAP -20 -20 -DC -CC +0018 +0088 +0048 +7E48 +2448 +17C8 +1448 +0648 +F848 +01C8 +00C8 +0080 +0160 +0218 +0C04 ENDCHAR -STARTCHAR 0x1FEE -ENCODING 8174 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 6 4 2 11 +STARTCHAR D3AD +ENCODING 54189 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 BITMAP -10 -10 -EC -CC +0030 +0110 +0090 +FE90 +4890 +2F90 +2890 +0C90 +F090 +0090 +0360 +0410 +0410 +0630 +03E0 ENDCHAR -STARTCHAR 0x1FEF -ENCODING 8175 -SWIDTH 180 0 -DWIDTH 3 0 -BBX 2 4 1 11 +STARTCHAR D3B4 +ENCODING 54196 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 1 -2 BITMAP -80 -80 -40 -40 +0018 +0008 +0088 +7F88 +0278 +0108 +1108 +1908 +1A38 +0248 +FF88 +0008 +0008 +0008 +0008 ENDCHAR -STARTCHAR 0x1FF2 -ENCODING 8178 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 16 1 -5 +STARTCHAR D3B8 +ENCODING 54200 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 BITMAP -1000 -1000 -0800 -0000 -2200 -4100 -8080 -8880 -8880 -8880 -7700 -0000 -1800 +0030 +0010 +FF10 +44F0 +4210 +2210 +24F0 +2410 +3E10 +4010 +0010 +1810 0800 -0A00 -0400 -ENDCHAR -STARTCHAR 0x1FF3 -ENCODING 8179 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 12 1 -5 -BITMAP -2200 -4100 -8080 -8880 -8880 -8880 -7700 -0000 -1800 0800 -0A00 -0400 +0FF0 ENDCHAR -STARTCHAR 0x1FF4 -ENCODING 8180 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 16 1 -5 +STARTCHAR D3BC +ENCODING 54204 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 BITMAP -0400 -0400 +0030 +0010 +FF10 +04F0 +2210 +2410 +24F0 +0710 +F800 +1FF0 +0020 +1FF0 0800 -0000 -2200 -4100 -8080 -8880 -8880 -8880 -7700 -0000 -1800 0800 -0A00 -0400 +0FF0 ENDCHAR -STARTCHAR 0x1FF6 -ENCODING 8182 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 11 1 0 +STARTCHAR D3C4 +ENCODING 54212 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -3 BITMAP -1200 -2A00 -2400 -0000 -2200 -4100 -8080 -8880 -8880 -8880 -7700 +0030 +FF10 +0010 +0270 +2210 +2410 +0470 +0E10 +7010 +0FF0 +0410 +0420 +0420 +07F0 +0400 ENDCHAR -STARTCHAR 0x1FF7 -ENCODING 8183 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 16 1 -5 +STARTCHAR D3C5 +ENCODING 54213 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 BITMAP -1200 -2A00 -2400 -0000 -2200 -4100 -8080 -8880 -8880 -8880 -7700 -0000 -1800 -0800 -0A00 -0400 +0030 +0110 +FF10 +04F0 +2210 +2210 +24F0 +0710 +F800 +0C10 +0410 +07F0 +0410 +0410 +07F0 +0410 ENDCHAR -STARTCHAR 0x1FF8 -ENCODING 8184 -SWIDTH 840 0 -DWIDTH 14 0 -BBX 12 13 0 0 +STARTCHAR D3C8 +ENCODING 54216 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 BITMAP -8000 -8000 -4780 -4840 -1020 -2010 -2010 -2010 -2010 -2010 -1020 -0840 -0780 +0060 +0010 +FF10 +0410 +0270 +2410 +2410 +0970 +FE10 +1860 +0C20 +0C60 +1250 +2298 +4108 ENDCHAR -STARTCHAR 0x1FF9 -ENCODING 8185 -SWIDTH 840 0 -DWIDTH 14 0 -BBX 12 13 0 0 +STARTCHAR D3C9 +ENCODING 54217 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 BITMAP -4000 -4000 -8780 -8840 -1020 -2010 -2010 -2010 -2010 -2010 -1020 -0840 -0780 +0030 +0310 +FF10 +00F0 +4210 +2410 +24F0 +2410 +0E10 +7090 +0360 +0410 +0410 +0630 +03E0 ENDCHAR -STARTCHAR 0x1FFA -ENCODING 8186 -SWIDTH 780 0 -DWIDTH 13 0 -BBX 12 13 0 0 +STARTCHAR D3D0 +ENCODING 54224 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 1 -2 BITMAP -8000 -8000 -47C0 -4820 -1010 -1010 -1010 -1010 -0820 -0820 -0440 -1450 -1C70 +0018 +0088 +0048 +4748 +3848 +27C8 +2448 +1448 +15C8 +1948 +FE48 +0048 +0048 +0048 +0008 ENDCHAR -STARTCHAR 0x1FFB -ENCODING 8187 -SWIDTH 780 0 -DWIDTH 13 0 -BBX 12 13 0 0 +STARTCHAR D3D8 +ENCODING 54232 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 BITMAP -4000 -4000 -87C0 -8820 -1010 -1010 -1010 -1010 -0820 -0820 -0440 -1450 -1C70 +0030 +0110 +0690 +7890 +4790 +2890 +2B90 +0E90 +FFE0 +0020 +0020 +1FE0 +0800 +0800 +0FF0 ENDCHAR -STARTCHAR 0x1FFC -ENCODING 8188 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 15 1 -4 +STARTCHAR D3E1 +ENCODING 54241 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 BITMAP -3E00 -4100 -8080 -8080 -8080 -8080 -4100 -4100 -2200 -A280 -E380 -1800 -0800 -0A00 -0400 +0030 +0110 +0690 +7890 +4790 +2890 +2B90 +0E90 +F080 +0C10 +0410 +07F0 +0410 +07F0 +0410 ENDCHAR -STARTCHAR 0x1FFD -ENCODING 8189 -SWIDTH 180 0 -DWIDTH 3 0 -BBX 2 4 1 11 +STARTCHAR D3E3 +ENCODING 54243 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 BITMAP -40 -40 -80 -80 +0030 +0110 +0690 +7890 +4790 +2890 +2B90 +0E90 +F090 +0190 +0080 +0180 +0260 +0410 +1808 ENDCHAR -STARTCHAR 0x1FFE -ENCODING 8190 -SWIDTH 180 0 -DWIDTH 3 0 -BBX 2 5 1 11 +STARTCHAR D3EC +ENCODING 54252 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 12 1 0 BITMAP -C0 -C0 -80 -80 -40 +0010 +3FF8 +0000 +0020 +0440 +0440 +0040 +3FF8 +0100 +0100 +0100 +FFFE ENDCHAR -STARTCHAR 0x200B -ENCODING 8203 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 3 3 2 4 +STARTCHAR D3ED +ENCODING 54253 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -2 BITMAP -A0 -40 -A0 +0010 +1FF8 +0840 +0440 +0480 +1FF0 +0100 +0100 +FFFE +2000 +3FE0 +0020 +0020 +0020 +0020 ENDCHAR -STARTCHAR 0x2010 -ENCODING 8208 -SWIDTH 300 0 -DWIDTH 5 0 -BBX 4 1 1 4 +STARTCHAR D3F0 +ENCODING 54256 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 13 1 -1 BITMAP -F0 +2078 +1FE0 +0440 +0480 +1FF0 +0100 +0100 +FFFE +6000 +0800 +0800 +0800 +07F8 ENDCHAR -STARTCHAR 0x2011 -ENCODING 8209 -SWIDTH 300 0 -DWIDTH 5 0 -BBX 4 1 1 4 +STARTCHAR D3F4 +ENCODING 54260 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -2 BITMAP -F0 +0010 +1FF0 +0840 +0440 +0480 +1B60 +0100 +FFFE +0000 +0000 +0FE0 +0020 +1FE0 +0800 +0FF0 ENDCHAR -STARTCHAR 0x2012 -ENCODING 8210 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 1 1 4 +STARTCHAR D3FC +ENCODING 54268 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -3 BITMAP -FE +1FF8 +0040 +0480 +0680 +3FF0 +0100 +0100 +FFFE +0000 +1FE0 +0820 +0820 +0840 +0FE0 +0800 ENDCHAR -STARTCHAR 0x2013 -ENCODING 8211 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 1 1 4 +STARTCHAR D3FD +ENCODING 54269 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 16 1 -3 BITMAP -FE +0010 +1FF0 +0840 +0440 +0480 +1B60 +0100 +FFFE +0000 +1860 +0820 +0FE0 +0820 +0820 +0FE0 +0820 ENDCHAR -STARTCHAR 0x2014 -ENCODING 8212 -SWIDTH 960 0 -DWIDTH 16 0 -BBX 15 1 1 4 +STARTCHAR D3FF +ENCODING 54271 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 BITMAP +1FF8 +0000 +0460 +0440 +0040 +0FB0 +0100 FFFE +0200 +0100 +0300 +06C0 +0830 +3018 ENDCHAR -STARTCHAR 0x2015 -ENCODING 8213 +STARTCHAR D401 +ENCODING 54273 SWIDTH 1020 0 DWIDTH 17 0 -BBX 16 1 1 4 +BBX 15 14 1 -2 BITMAP -FFFF +1FF8 +0840 +0440 +0480 +01F0 +0F00 +0100 +FFFE +0100 +07C0 +0C60 +0820 +0C60 +07C0 ENDCHAR -STARTCHAR 0x2016 -ENCODING 8214 -SWIDTH 240 0 -DWIDTH 4 0 -BBX 3 13 0 0 +STARTCHAR D408 +ENCODING 54280 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -2 BITMAP -A0 -A0 -A0 -A0 -A0 -A0 -A0 -A0 -A0 -A0 -A0 -A0 -A0 +0060 +00D0 +7FD0 +0210 +1310 +0A10 +0A90 +7D16 +0418 +0430 +8FD0 +7010 +0010 +0010 +0010 ENDCHAR -STARTCHAR 0x2017 -ENCODING 8215 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 10 3 0 -3 +STARTCHAR D41D +ENCODING 54301 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 BITMAP -FFC0 -0000 -FFC0 +0060 +0120 +FF20 +0420 +2220 +1420 +FF20 +0838 +0FA0 +F120 +06C0 +0820 +0820 +0C60 +07C0 ENDCHAR -STARTCHAR 0x2018 -ENCODING 8216 -SWIDTH 180 0 -DWIDTH 3 0 -BBX 2 5 1 7 +STARTCHAR D440 +ENCODING 54336 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 BITMAP -40 -80 -80 -C0 -C0 +0060 +0090 +7F90 +0210 +1310 +1210 +1290 +7F10 +0410 +0430 +8FD0 +7010 +0010 +0010 +0010 ENDCHAR -STARTCHAR 0x2019 -ENCODING 8217 -SWIDTH 180 0 -DWIDTH 3 0 -BBX 2 5 1 7 +STARTCHAR D444 +ENCODING 54340 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 1 -2 BITMAP -C0 -C0 -40 -40 -80 +0018 +0048 +3FC8 +0108 +0A08 +0BC8 +7408 +0418 +8FE8 +7008 +0008 +0600 +0200 +0200 +03FC ENDCHAR -STARTCHAR 0x201A -ENCODING 8218 -SWIDTH 180 0 -DWIDTH 3 0 -BBX 2 5 1 -3 +STARTCHAR D45C +ENCODING 54364 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 12 2 0 BITMAP -C0 -C0 -40 -40 -80 +0020 +7FF0 +10C0 +1080 +0880 +0900 +7FF0 +18C0 +0840 +0840 +0848 +FFFC ENDCHAR -STARTCHAR 0x201B -ENCODING 8219 -SWIDTH 180 0 -DWIDTH 3 0 -BBX 2 5 1 7 +STARTCHAR D460 +ENCODING 54368 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 13 1 -1 BITMAP -C0 -C0 -80 -80 -40 +0018 +1FF8 +0460 +0440 +0040 +0FF0 +0440 +FFFE +0000 +0800 +0800 +0800 +0FF8 ENDCHAR -STARTCHAR 0x201C -ENCODING 8220 -SWIDTH 360 0 -DWIDTH 6 0 -BBX 5 5 1 7 +STARTCHAR D464 +ENCODING 54372 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 BITMAP -48 -90 -90 -D8 -D8 +1FF8 +0040 +0440 +0480 +01E0 +1E40 +0440 +FFFE +1FE0 +0020 +0020 +0FE0 +0800 +0FF0 ENDCHAR -STARTCHAR 0x201D -ENCODING 8221 -SWIDTH 360 0 -DWIDTH 6 0 -BBX 5 5 1 7 +STARTCHAR D46D +ENCODING 54381 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -3 +BITMAP +1FF8 +0060 +0440 +0440 +01F0 +0E40 +0440 +FFFE +1860 +0820 +0FE0 +0820 +0820 +0FE0 +0820 +ENDCHAR +STARTCHAR D46F +ENCODING 54383 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 BITMAP -D8 -D8 -48 -48 -90 +1FF8 +0060 +0440 +0440 +01F0 +0E40 +0440 +FFFE +0200 +0100 +0300 +06C0 +0830 +3008 ENDCHAR -STARTCHAR 0x201E -ENCODING 8222 -SWIDTH 360 0 -DWIDTH 6 0 -BBX 5 5 1 -3 +STARTCHAR D478 +ENCODING 54392 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -2 BITMAP -D8 -D8 -48 -48 -90 +0010 +3FF8 +0080 +0840 +0440 +0480 +3FF0 +0000 +FFFE +0100 +0100 +0100 +0100 +0100 +0100 ENDCHAR -STARTCHAR 0x201F -ENCODING 8223 -SWIDTH 360 0 -DWIDTH 6 0 -BBX 5 5 1 7 +STARTCHAR D479 +ENCODING 54393 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 16 1 -3 BITMAP -D8 -D8 -90 -90 -48 +0010 +3FF0 +0840 +0440 +0480 +1FF0 +0000 +FFFE +0100 +0100 +3FE0 +0020 +0020 +0020 +0020 +0020 ENDCHAR -STARTCHAR 0x2020 -ENCODING 8224 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 15 1 -3 +STARTCHAR D47C +ENCODING 54396 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -2 BITMAP -10 -38 -10 -10 -54 -FE -54 -10 -10 -38 -10 -10 -10 -10 -10 +0010 +3FF8 +0060 +0440 +0480 +1FF0 +0000 +0000 +FFFE +0100 +0100 +0900 +0900 +0900 +07F8 ENDCHAR -STARTCHAR 0x2021 -ENCODING 8225 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 15 1 -3 +STARTCHAR D47F +ENCODING 54399 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -2 BITMAP -10 -38 -10 -10 -54 -FE -56 -10 -54 -FE -54 -10 -10 -38 -10 +0010 +3FF8 +0060 +0440 +0480 +1FF0 +0000 +803E +7FC0 +0100 +0160 +1E80 +0800 +0800 +0FF0 ENDCHAR -STARTCHAR 0x2022 -ENCODING 8226 -SWIDTH 300 0 -DWIDTH 5 0 -BBX 4 4 1 3 +STARTCHAR D480 +ENCODING 54400 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -2 BITMAP -60 -F0 -F0 -60 +0010 +1FF8 +0840 +0440 +0480 +1FF0 +0004 +FFFE +0100 +1FE0 +0020 +0020 +1FE0 +0800 +0FF0 ENDCHAR -STARTCHAR 0x2023 -ENCODING 8227 -SWIDTH 360 0 -DWIDTH 6 0 -BBX 5 6 1 2 +STARTCHAR D482 +ENCODING 54402 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 16 1 -3 BITMAP -80 -E0 -F8 -F8 -E0 -80 +0010 +1FF8 +0860 +0440 +0490 +1FF0 +0000 +FFFE +0100 +0100 +1EF8 +2288 +1C90 +1690 +08F0 +0080 ENDCHAR -STARTCHAR 0x2024 -ENCODING 8228 -SWIDTH 300 0 -DWIDTH 5 0 -BBX 2 2 1 0 +STARTCHAR D488 +ENCODING 54408 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -3 BITMAP -C0 -C0 +3FF8 +0040 +0440 +0490 +3FF0 +0000 +0004 +FFFE +0100 +1F00 +08E0 +0820 +0840 +0FE0 +0800 ENDCHAR -STARTCHAR 0x2025 -ENCODING 8229 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 6 2 1 0 +STARTCHAR D489 +ENCODING 54409 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 16 1 -3 BITMAP -CC -CC +0010 +3FF0 +0040 +0440 +0490 +1FF0 +0000 +FFFE +0100 +0D20 +0420 +07E0 +0420 +0420 +07E0 +0420 ENDCHAR -STARTCHAR 0x2026 -ENCODING 8230 -SWIDTH 780 0 -DWIDTH 13 0 -BBX 10 2 1 0 +STARTCHAR D48B +ENCODING 54411 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -3 BITMAP -CCC0 -CCC0 +3FF0 +10C0 +0880 +0920 +3FF0 +0000 +0000 +FFFC +0200 +0200 +0200 +0200 +0580 +0860 +3020 ENDCHAR -STARTCHAR 0x2027 -ENCODING 8231 -SWIDTH 180 0 -DWIDTH 3 0 -BBX 2 2 1 3 +STARTCHAR D48D +ENCODING 54413 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 2 -2 BITMAP -C0 -C0 +3FF0 +00C0 +0880 +0880 +3FE0 +0000 +0008 +FFFC +0100 +0200 +0DC0 +0840 +0C40 +0780 ENDCHAR -STARTCHAR 0x2030 -ENCODING 8240 -SWIDTH 900 0 -DWIDTH 15 0 -BBX 14 13 1 -1 +STARTCHAR D494 +ENCODING 54420 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 BITMAP -6080 -9900 -9700 -9200 -9400 -6400 -0800 -1318 -14A4 -24A4 -44A4 -44A4 -8318 +0030 +0010 +FF90 +0610 +1210 +1410 +FF10 +0010 +0F10 +F9F0 +0810 +0810 +0810 +0810 +0010 ENDCHAR -STARTCHAR 0x2031 -ENCODING 8241 -SWIDTH 1200 0 -DWIDTH 20 0 -BBX 19 13 1 -1 +STARTCHAR D4A9 +ENCODING 54441 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 BITMAP -608000 -990000 -970000 -920000 -940000 -640000 -080000 -1318C0 -14A520 -24A520 -44A520 -44A520 -8318C0 +0030 +0110 +FF10 +2610 +1410 +0590 +7A10 +0310 +FCF0 +0810 +0880 +0360 +0410 +0410 +0630 +03E0 ENDCHAR -STARTCHAR 0x2032 -ENCODING 8242 -SWIDTH 240 0 -DWIDTH 4 0 -BBX 3 4 1 7 +STARTCHAR D4CC +ENCODING 54476 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 BITMAP -20 -60 -40 -80 +0030 +0010 +7F90 +2210 +1110 +1210 +05D0 +3A10 +01F0 +FE10 +0410 +0410 +0410 +0410 +0010 ENDCHAR -STARTCHAR 0x2033 -ENCODING 8243 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 6 4 1 7 +STARTCHAR D4D0 +ENCODING 54480 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 BITMAP -24 -6C -48 -90 +0030 +0010 +7F90 +0210 +1210 +1390 +2C70 +FF90 +0410 +0410 +0010 +0C00 +0400 +0400 +03F8 ENDCHAR -STARTCHAR 0x2034 -ENCODING 8244 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 4 1 7 +STARTCHAR D4D4 +ENCODING 54484 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 BITMAP -2480 -6D80 -4900 -9200 +0030 +0090 +3F90 +1210 +1210 +0290 +7F90 +87F0 +7C10 +0400 +0FF0 +0010 +0FF0 +0400 +07F8 ENDCHAR -STARTCHAR 0x2035 -ENCODING 8245 -SWIDTH 240 0 -DWIDTH 4 0 -BBX 3 4 1 7 +STARTCHAR D4DC +ENCODING 54492 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 11 16 3 -3 BITMAP -80 -C0 -40 -20 +0060 +0020 +FF20 +2420 +2420 +0520 +FF20 +03E0 +FC20 +0800 +1FE0 +0820 +0840 +0840 +0FE0 +0800 ENDCHAR -STARTCHAR 0x2036 -ENCODING 8246 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 6 4 1 7 +STARTCHAR D4DF +ENCODING 54495 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 BITMAP -90 -D8 -48 -24 +0030 +7F90 +0210 +1210 +1290 +7F90 +0030 +FFD0 +0410 +0590 +0080 +0180 +0240 +0430 +1808 ENDCHAR -STARTCHAR 0x2037 -ENCODING 8247 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 4 1 7 +STARTCHAR D4E8 +ENCODING 54504 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -3 BITMAP -9200 -DB00 -4900 -2480 +7FF0 +10C0 +0880 +08A0 +3FF0 +0000 +0004 +FFFC +0840 +0840 +0840 +0840 +0840 +0840 +0040 ENDCHAR -STARTCHAR 0x2038 -ENCODING 8248 -SWIDTH 240 0 -DWIDTH 4 0 -BBX 3 4 1 -2 +STARTCHAR D4EC +ENCODING 54508 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 BITMAP -40 -40 -A0 -A0 +1FF8 +0000 +0040 +0440 +0480 +3FF0 +0000 +FFFE +0440 +0840 +3040 +1040 +1000 +1FF0 ENDCHAR -STARTCHAR 0x2039 -ENCODING 8249 -SWIDTH 300 0 -DWIDTH 5 0 -BBX 4 7 1 0 +STARTCHAR D4F0 +ENCODING 54512 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 BITMAP -10 -20 -60 -C0 -60 -20 -10 +1FF8 +0040 +0440 +0440 +1FF0 +0000 +FFFE +0440 +1FC0 +0020 +0020 +0FE0 +0800 +0FF0 ENDCHAR -STARTCHAR 0x203A -ENCODING 8250 -SWIDTH 300 0 -DWIDTH 5 0 -BBX 4 7 1 0 +STARTCHAR D4F8 +ENCODING 54520 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 13 2 -1 BITMAP -80 -40 -60 -30 -60 -40 -80 +3FF0 +1080 +0880 +0900 +7FE0 +0008 +FFFC +0880 +0880 +1FC0 +1040 +1040 +1FC0 ENDCHAR -STARTCHAR 0x203B -ENCODING 8251 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 10 13 1 0 +STARTCHAR D4FB +ENCODING 54523 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 BITMAP -8040 -4C80 -4C80 -2100 -1200 -1200 -CCC0 -D2C0 -1200 -2100 -4C80 -4C80 -8040 +1FF8 +0840 +0440 +0480 +1FF8 +0004 +FFFE +0840 +0A40 +0180 +0180 +0240 +0C30 +1008 ENDCHAR -STARTCHAR 0x203C -ENCODING 8252 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 5 12 1 0 +STARTCHAR D4FD +ENCODING 54525 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 BITMAP -D8 -D8 -D8 -D8 -D8 -D8 -D8 -00 -00 -00 -D8 -D8 +1FF8 +0020 +0440 +0440 +1FF8 +0000 +0000 +FFFE +04A0 +07E0 +0420 +0420 +0620 +03C0 ENDCHAR -STARTCHAR 0x203D -ENCODING 8253 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 6 12 1 0 +STARTCHAR D504 +ENCODING 54532 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 11 2 0 BITMAP -78 -84 -A4 -24 -28 -30 -20 -60 -60 -00 -60 -60 +7FF0 +0000 +0040 +0880 +0880 +0900 +7FF0 +0000 +0000 +0000 +FFFC ENDCHAR -STARTCHAR 0x203E -ENCODING 8254 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 10 1 0 12 +STARTCHAR D508 +ENCODING 54536 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 13 2 -1 BITMAP -FFC0 +7FF0 +0000 +00C0 +0880 +0880 +3FF0 +0000 +FFFC +0000 +3000 +1000 +1000 +1FF0 ENDCHAR -STARTCHAR 0x203F -ENCODING 8255 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 11 3 1 0 +STARTCHAR D50C +ENCODING 54540 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 BITMAP -8020 -4040 -3F80 +1FF8 +0840 +0440 +0480 +1FF0 +0000 +FFFE +0000 +1FE0 +0020 +1FE0 +0800 +0800 +0FF0 ENDCHAR -STARTCHAR 0x2040 -ENCODING 8256 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 11 3 1 12 +STARTCHAR D514 +ENCODING 54548 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 16 1 -3 BITMAP -3F80 -4040 -8020 +0010 +3FF8 +0040 +0440 +0480 +31F8 +0E00 +0000 +FFFE +0000 +1FE0 +0820 +0820 +0820 +0FE0 +0800 ENDCHAR -STARTCHAR 0x2041 -ENCODING 8257 -SWIDTH 300 0 -DWIDTH 5 0 -BBX 4 8 1 -4 +STARTCHAR D515 +ENCODING 54549 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -3 BITMAP -10 -10 -20 -20 -40 -60 -90 -90 +7FF0 +0080 +0880 +0900 +3FE0 +0000 +FFFC +0000 +1840 +0840 +0FC0 +0840 +0840 +0FC0 +0840 ENDCHAR -STARTCHAR 0x2042 -ENCODING 8258 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 11 10 1 1 +STARTCHAR D517 +ENCODING 54551 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 BITMAP -0400 -1500 +0038 +0FE0 +0440 +0440 +01F8 0E00 -1500 -0400 -2080 -AAA0 -71C0 -AAA0 -2080 +0004 +FFFE +0300 +0100 +0380 +0660 +0830 +3000 ENDCHAR -STARTCHAR 0x2043 -ENCODING 8259 -SWIDTH 300 0 -DWIDTH 5 0 -BBX 4 2 1 3 +STARTCHAR D53C +ENCODING 54588 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 BITMAP -F0 -F0 +0040 +0030 +0190 +FF90 +0010 +2110 +2110 +1110 +1210 +12F0 +FD10 +0010 +0010 +0010 +0010 ENDCHAR -STARTCHAR 0x2044 -ENCODING 8260 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 8 16 1 -4 +STARTCHAR D53D +ENCODING 54589 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 BITMAP -01 -01 -02 -02 -04 -04 -08 -08 -10 -10 -20 -20 -40 -40 -80 -80 +0060 +0190 +FF90 +0210 +2110 +1110 +1210 +13F0 +FC10 +0000 +7FE0 +0020 +0020 +0020 +0020 +0020 ENDCHAR -STARTCHAR 0x2045 -ENCODING 8261 -SWIDTH 300 0 -DWIDTH 5 0 -BBX 3 16 1 -4 +STARTCHAR D540 +ENCODING 54592 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 BITMAP -E0 -80 -80 -80 -80 -80 -80 -E0 -80 -80 -80 -80 -80 -80 -80 -E0 +0060 +0010 +0190 +FF90 +2310 +2110 +1210 +1270 +1F90 +6010 +0010 +1810 +0800 +0800 +0FF8 ENDCHAR -STARTCHAR 0x2046 -ENCODING 8262 -SWIDTH 300 0 -DWIDTH 5 0 -BBX 3 16 0 -4 +STARTCHAR D544 +ENCODING 54596 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 BITMAP -E0 -20 -20 -20 -20 -20 -20 -E0 -20 -20 -20 -20 -20 -20 -20 -E0 +0060 +0190 +FF90 +0210 +2110 +1110 +1210 +03F0 +7C10 +1FF0 +0020 +1FF0 +0800 +0800 +0FF8 ENDCHAR -STARTCHAR 0x2070 -ENCODING 8304 -SWIDTH 300 0 -DWIDTH 5 0 -BBX 4 7 1 6 +STARTCHAR D54C +ENCODING 54604 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 BITMAP -60 -90 -90 -90 -90 -90 -60 +0060 +0190 +7F90 +0010 +2310 +1210 +1210 +03F0 +FC10 +0000 +0FF0 +0410 +0410 +0420 +07F0 +0400 ENDCHAR -STARTCHAR 0x2074 -ENCODING 8308 -SWIDTH 360 0 -DWIDTH 6 0 -BBX 5 7 1 6 +STARTCHAR D54D +ENCODING 54605 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 11 15 3 -2 BITMAP -10 -30 -50 -90 -F8 -10 -38 +0080 +0060 +0320 +FC20 +4220 +2220 +2420 +07E0 +F820 +3060 +1020 +1FE0 +1020 +1FE0 +1020 ENDCHAR -STARTCHAR 0x2075 -ENCODING 8309 -SWIDTH 300 0 -DWIDTH 5 0 -BBX 4 7 1 6 +STARTCHAR D54F +ENCODING 54607 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 BITMAP -F0 -80 -A0 -D0 -10 -90 -60 +0060 +0010 +0090 +FF90 +2110 +2110 +1210 +12F0 +FD10 +0090 +0090 +0180 +0360 +0418 +1808 ENDCHAR -STARTCHAR 0x2076 -ENCODING 8310 -SWIDTH 300 0 -DWIDTH 5 0 -BBX 4 7 1 6 +STARTCHAR D551 +ENCODING 54609 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 11 15 3 -2 BITMAP -60 -90 -80 -E0 -90 -90 -60 +00C0 +0120 +FF20 +0420 +4220 +2220 +2420 +07E0 +F820 +0120 +0680 +0840 +0840 +0CC0 +0780 ENDCHAR -STARTCHAR 0x2077 -ENCODING 8311 -SWIDTH 300 0 -DWIDTH 5 0 -BBX 4 7 1 6 +STARTCHAR D558 +ENCODING 54616 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 BITMAP -F0 -90 -20 -20 -40 -40 -40 +0060 +0020 +1E20 +01A0 +FFA0 +0020 +0820 +363C +4120 +4120 +6320 +3E20 +0020 +0020 +0020 ENDCHAR -STARTCHAR 0x2078 -ENCODING 8312 -SWIDTH 300 0 -DWIDTH 5 0 -BBX 4 7 1 6 +STARTCHAR D559 +ENCODING 54617 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 16 2 -3 BITMAP -60 -90 -90 -60 -90 -90 -60 +0060 +3C20 +0020 +FFE0 +1820 +6624 +4138 +6320 +3E20 +0000 +3FE0 +0020 +0020 +0020 +0020 +0020 ENDCHAR -STARTCHAR 0x2079 -ENCODING 8313 -SWIDTH 300 0 -DWIDTH 5 0 -BBX 4 7 1 6 +STARTCHAR D55C +ENCODING 54620 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 BITMAP -60 -90 -90 -70 -10 -90 -60 +0060 +0020 +1E20 +0020 +FFA0 +1C20 +6324 +4138 +6320 +3E20 +0020 +0C00 +0400 +0400 +07F8 ENDCHAR -STARTCHAR 0x207A -ENCODING 8314 -SWIDTH 360 0 -DWIDTH 6 0 -BBX 5 5 1 7 +STARTCHAR D560 +ENCODING 54624 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 BITMAP -20 -20 -F8 -20 -20 +0060 +1C20 +0020 +FFA0 +1820 +263C +4220 +2220 +3C00 +1FE0 +0020 +0040 +1FE0 +0800 +0FF0 ENDCHAR -STARTCHAR 0x207B -ENCODING 8315 -SWIDTH 360 0 -DWIDTH 6 0 -BBX 5 1 1 9 +STARTCHAR D565 +ENCODING 54629 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 BITMAP -F8 +0060 +1C20 +0020 +FFA0 +0820 +7420 +423C +6220 +3C20 +0000 +3DE0 +0900 +31E0 +2300 +3DF0 ENDCHAR -STARTCHAR 0x207C -ENCODING 8316 -SWIDTH 360 0 -DWIDTH 6 0 -BBX 5 3 1 8 +STARTCHAR D568 +ENCODING 54632 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 16 2 -3 BITMAP -F8 -00 -F8 +0060 +3C20 +0120 +FE20 +3C20 +4224 +4238 +6220 +3C20 +0000 +1FE0 +0820 +0840 +0840 +0FE0 +0800 ENDCHAR -STARTCHAR 0x207D -ENCODING 8317 -SWIDTH 180 0 -DWIDTH 3 0 -BBX 2 7 1 6 +STARTCHAR D569 +ENCODING 54633 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 16 2 -3 BITMAP -40 -80 -80 -80 -80 -80 -40 +0060 +3C20 +0120 +FE20 +3C20 +422C +4230 +6220 +3C00 +1020 +0820 +0FE0 +0820 +0820 +0FE0 +0820 ENDCHAR -STARTCHAR 0x207E -ENCODING 8318 -SWIDTH 180 0 -DWIDTH 3 0 -BBX 2 7 1 6 +STARTCHAR D56B +ENCODING 54635 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 BITMAP -80 -40 -40 -40 -40 -40 -80 +0060 +1E20 +0020 +87A0 +7820 +3C20 +423C +4220 +6220 +3D20 +0080 +0180 +0260 +0410 +1808 ENDCHAR -STARTCHAR 0x207F -ENCODING 8319 -SWIDTH 360 0 -DWIDTH 6 0 -BBX 5 5 1 6 +STARTCHAR D56D +ENCODING 54637 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 BITMAP -D0 -68 -48 -48 -48 +0060 +2020 +1C20 +FF20 +0820 +3C20 +423C +4220 +2620 +18A0 +03C0 +0420 +0420 +0660 +03C0 ENDCHAR -STARTCHAR 0x2080 -ENCODING 8320 -SWIDTH 300 0 -DWIDTH 5 0 -BBX 4 7 1 -4 +STARTCHAR D574 +ENCODING 54644 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 1 -3 BITMAP -60 -90 -90 -90 -90 -90 -60 +0018 +00C8 +1C48 +0048 +FF48 +0848 +3C48 +4278 +4248 +6248 +3C48 +0048 +0048 +0048 +0008 ENDCHAR -STARTCHAR 0x2081 -ENCODING 8321 -SWIDTH 240 0 -DWIDTH 4 0 -BBX 3 7 1 -4 +STARTCHAR D575 +ENCODING 54645 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 BITMAP -40 -C0 -40 -40 -40 -40 -E0 +0030 +0090 +3890 +FE90 +3090 +4890 +84F0 +4490 +7890 +0080 +1FF0 +0010 +0010 +0010 +0010 +0010 ENDCHAR -STARTCHAR 0x2082 -ENCODING 8322 -SWIDTH 300 0 -DWIDTH 5 0 -BBX 4 7 1 -4 +STARTCHAR D578 +ENCODING 54648 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 BITMAP -60 -90 -10 -10 -20 -40 -F0 +0060 +0030 +3C90 +0090 +FF90 +0890 +3490 +42F0 +4290 +3C90 +0090 +1890 +0800 +0800 +0FF8 ENDCHAR -STARTCHAR 0x2083 -ENCODING 8323 -SWIDTH 300 0 -DWIDTH 5 0 -BBX 4 7 1 -4 +STARTCHAR D57C +ENCODING 54652 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 BITMAP -60 -90 -10 -20 -10 -90 -60 +0070 +0090 +3890 +1E90 +F090 +3C90 +44F0 +4490 +3890 +0090 +1FF0 +0020 +1FF0 +0800 +0FF0 ENDCHAR -STARTCHAR 0x2084 -ENCODING 8324 -SWIDTH 360 0 -DWIDTH 6 0 -BBX 5 7 1 -4 +STARTCHAR D584 +ENCODING 54660 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 11 16 3 -3 BITMAP -10 -30 -50 -90 -F8 -10 -38 +0060 +0220 +7920 +0120 +FF20 +3120 +4920 +85E0 +4520 +7920 +1FE0 +0840 +0840 +0840 +0FE0 +0800 ENDCHAR -STARTCHAR 0x2085 -ENCODING 8325 -SWIDTH 300 0 -DWIDTH 5 0 -BBX 4 7 1 -4 +STARTCHAR D585 +ENCODING 54661 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 BITMAP -F0 -80 -A0 -D0 -10 -90 -60 +0030 +0090 +3890 +0090 +FE90 +1090 +6CF0 +4490 +4490 +3C30 +0410 +07F0 +0410 +0410 +07F0 +0410 ENDCHAR -STARTCHAR 0x2086 -ENCODING 8326 -SWIDTH 300 0 -DWIDTH 5 0 -BBX 4 7 1 -4 +STARTCHAR D587 +ENCODING 54663 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 3 -2 BITMAP -60 -90 -80 -E0 -90 -90 -60 +0060 +0120 +7920 +0120 +FF20 +7920 +C5E0 +8520 +4520 +7820 +0320 +0300 +0480 +0860 +3030 ENDCHAR -STARTCHAR 0x2087 -ENCODING 8327 -SWIDTH 300 0 -DWIDTH 5 0 -BBX 4 7 1 -4 +STARTCHAR D588 +ENCODING 54664 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 3 -2 BITMAP -F0 -90 -20 -20 -40 -40 -40 +0260 +0120 +0120 +7920 +DF20 +3120 +4DE0 +8520 +4520 +7800 +0840 +0840 +1EA0 +2310 +4210 ENDCHAR -STARTCHAR 0x2088 -ENCODING 8328 -SWIDTH 300 0 -DWIDTH 5 0 -BBX 4 7 1 -4 +STARTCHAR D589 +ENCODING 54665 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 BITMAP -60 -90 -90 -60 -90 -90 -60 +0030 +0090 +3890 +0090 +FC90 +1890 +64F0 +4490 +4490 +3890 +03C0 +0420 +0420 +0620 +03C0 ENDCHAR -STARTCHAR 0x2089 -ENCODING 8329 -SWIDTH 300 0 -DWIDTH 5 0 -BBX 4 7 1 -4 +STARTCHAR D590 +ENCODING 54672 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 BITMAP -60 -90 -90 -70 -10 -90 -60 +0060 +0020 +1C20 +00A0 +FFA0 +083C +3E20 +6320 +4120 +412C +6330 +1E20 +0020 +0020 +0020 ENDCHAR -STARTCHAR 0x208A -ENCODING 8330 -SWIDTH 360 0 -DWIDTH 6 0 -BBX 5 5 1 -3 +STARTCHAR D5A5 +ENCODING 54693 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 BITMAP -20 -20 -F8 -20 -20 +0060 +3820 +0420 +FFA0 +083C +3420 +4220 +422C +6630 +18A0 +0340 +0420 +0420 +0660 +03C0 ENDCHAR -STARTCHAR 0x208B -ENCODING 8331 -SWIDTH 360 0 -DWIDTH 6 0 -BBX 5 1 1 -1 +STARTCHAR D5C8 +ENCODING 54728 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 11 15 2 -2 BITMAP -F8 +0060 +0020 +3C20 +0120 +FFA0 +0820 +3420 +43E0 +4220 +6620 +3C20 +0020 +0020 +0020 +0020 ENDCHAR -STARTCHAR 0x208C -ENCODING 8332 -SWIDTH 360 0 -DWIDTH 6 0 -BBX 5 3 1 -2 +STARTCHAR D5C9 +ENCODING 54729 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 BITMAP -F8 -00 -F8 +0030 +1810 +0490 +FFD0 +1810 +66F0 +4110 +6310 +3E10 +0000 +1FF0 +0010 +0010 +0010 +0010 +0010 ENDCHAR -STARTCHAR 0x208D -ENCODING 8333 -SWIDTH 180 0 -DWIDTH 3 0 -BBX 2 7 1 -4 +STARTCHAR D5CC +ENCODING 54732 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 BITMAP -40 -80 -80 -80 -80 -80 -40 +0060 +3C20 +0020 +FF20 +0820 +3C20 +43E0 +4220 +4220 +3C20 +0020 +0C20 +0400 +0400 +03FC ENDCHAR -STARTCHAR 0x208E -ENCODING 8334 -SWIDTH 180 0 -DWIDTH 3 0 -BBX 2 7 1 -4 +STARTCHAR D5D0 +ENCODING 54736 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 3 -2 BITMAP -80 -40 -40 -40 -40 -40 -80 +0060 +3820 +0020 +FE20 +7820 +C5E0 +8420 +4420 +7820 +3FC0 +0040 +0040 +3FC0 +1000 +1FF0 ENDCHAR -STARTCHAR 0x20A0 -ENCODING 8352 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 8 12 2 0 +STARTCHAR D5D2 +ENCODING 54738 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 BITMAP -34 -4C -84 -80 -9F -89 -48 -3E -08 -08 -09 -1F +0030 +3C10 +0010 +FF90 +3C10 +63F0 +4210 +6210 +3C10 +0000 +09F0 +3510 +6920 +3120 +2DE0 +1100 +ENDCHAR +STARTCHAR D5D8 +ENCODING 54744 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 +BITMAP +0030 +3810 +0510 +FF10 +3C10 +42F0 +4210 +4210 +3C10 +0000 +0FF0 +0410 +0410 +0420 +07F0 +0400 ENDCHAR -STARTCHAR 0x20A1 -ENCODING 8353 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 9 16 2 -2 +STARTCHAR D5D9 +ENCODING 54745 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 BITMAP -0500 -0500 -0A00 -1E80 -2B80 -4A80 -9480 -9400 -9400 -9400 -A880 -6880 -2900 -3E00 -5000 -5000 +0030 +3C10 +0010 +FF10 +3810 +44F0 +4210 +6210 +3C10 +0810 +0410 +07F0 +0410 +0410 +07F0 +0410 ENDCHAR -STARTCHAR 0x20A2 -ENCODING 8354 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 9 11 2 0 +STARTCHAR D5DB +ENCODING 54747 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 BITMAP -1E80 -2180 -4080 -8080 -9A00 -8D00 -8800 -8880 -4880 -2900 -1E00 +0020 +0010 +1E10 +0090 +FF10 +1EF0 +2110 +2110 +3110 +1E10 +0080 +0180 +0340 +0430 +1808 ENDCHAR -STARTCHAR 0x20A3 -ENCODING 8355 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 9 11 2 0 +STARTCHAR D5DD +ENCODING 54749 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 BITMAP -FF80 -2080 -2080 -2000 -2700 -3C80 -2480 -2700 -2500 -2480 -FC80 +0030 +3C10 +0110 +FE10 +1C10 +62F0 +4210 +4210 +3C10 +0090 +03C0 +0420 +0420 +0620 +03C0 ENDCHAR -STARTCHAR 0x20A4 -ENCODING 8356 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 8 12 2 0 +STARTCHAR D5E4 +ENCODING 54756 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 1 -2 BITMAP -06 -09 -11 -10 -7C -10 -7C -10 -10 -51 -B2 -CC +0018 +00C8 +1C48 +0048 +0148 +FF48 +1C48 +23C8 +2248 +3248 +1C48 +0048 +0048 +0048 +0008 ENDCHAR -STARTCHAR 0x20A5 -ENCODING 8357 -SWIDTH 840 0 -DWIDTH 14 0 -BBX 11 11 2 -2 +STARTCHAR D5E5 +ENCODING 54757 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 BITMAP -0100 -0100 -FB80 -4640 -4440 -4440 -4C40 -4C40 -FEE0 -1000 -1000 +0060 +0030 +3890 +1E90 +F090 +3890 +4790 +4490 +3890 +0090 +1FF0 +0810 +0010 +0010 +0010 +0010 ENDCHAR -STARTCHAR 0x20A6 -ENCODING 8358 -SWIDTH 840 0 -DWIDTH 14 0 -BBX 11 11 2 0 +STARTCHAR D5E8 +ENCODING 54760 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 BITMAP -E3E0 -3080 -3080 -2880 -FFE0 -2480 -FFE0 -2280 -2180 -2180 -F880 +0030 +0190 +3890 +0090 +FE90 +3090 +4C90 +4790 +4490 +3890 +0090 +0410 +0400 +0408 +03F8 ENDCHAR -STARTCHAR 0x20A7 -ENCODING 8359 -SWIDTH 840 0 -DWIDTH 14 0 -BBX 11 11 2 0 +STARTCHAR D5EC +ENCODING 54764 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 3 -2 BITMAP -FF00 -2180 -2080 -FFE0 -2080 -2180 -3F00 -2000 -2000 -2000 -F800 +00C0 +0320 +3920 +1D20 +E120 +7920 +8F20 +8920 +7120 +1FE0 +0040 +1FE0 +0800 +0800 +0FF0 ENDCHAR -STARTCHAR 0x20A8 -ENCODING 8360 -SWIDTH 1080 0 -DWIDTH 18 0 -BBX 15 11 2 0 +STARTCHAR D5F4 +ENCODING 54772 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 BITMAP -FE00 -2100 -2080 -FFE0 -209E -2122 -3E20 -231C -2102 -2122 -F8FC +0060 +01B0 +0090 +3890 +DE90 +3590 +4E90 +4490 +3890 +0090 +0FF0 +0410 +0410 +0420 +07F0 +0400 ENDCHAR -STARTCHAR 0x20A9 -ENCODING 8361 -SWIDTH 1140 0 -DWIDTH 19 0 -BBX 16 11 2 0 +STARTCHAR D5F5 +ENCODING 54773 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 BITMAP -F1CF -2184 -2184 -2244 -FFFF -1248 -FFFF -1428 -0C30 -0C30 +0060 +01B0 +3890 +0090 +FC90 +7F90 +4490 +4490 +7890 0810 +0410 +07F0 +0410 +0410 +07F0 +0410 ENDCHAR -STARTCHAR 0x20AA -ENCODING 8362 -SWIDTH 780 0 -DWIDTH 13 0 -BBX 10 9 2 0 +STARTCHAR D5F7 +ENCODING 54775 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 BITMAP -FC00 -8600 -9240 -9240 -9240 -9240 -9040 -10C0 -1F80 +0070 +0110 +3890 +0090 +FE90 +3090 +4F90 +4490 +3890 +0310 +0110 +0300 +06C0 +0830 +1010 +2000 ENDCHAR -STARTCHAR 0x20AB -ENCODING 8363 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 6 14 2 -2 +STARTCHAR D5F9 +ENCODING 54777 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 BITMAP -18 -08 -7C -08 -08 -78 -48 -88 -88 -88 -48 -7C -00 -7C +0060 +0130 +0090 +3890 +DE90 +7490 +CB90 +C490 +7890 +0090 +03E0 +0430 +0410 +0630 +03E0 ENDCHAR -STARTCHAR 0x20AC -ENCODING 8364 -SWIDTH 840 0 -DWIDTH 14 0 -BBX 11 11 2 0 +STARTCHAR D600 +ENCODING 54784 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 BITMAP -07A0 -0860 -1020 -2020 -FF80 -2000 -FE00 -2020 -1020 -0840 -0780 +0020 +0010 +3C10 +0110 +FF10 +0810 +36F0 +4210 +4310 +63F0 +3C10 +0010 +0010 +0010 +0010 ENDCHAR -STARTCHAR 0x20D0 -ENCODING 8400 -SWIDTH 0 0 -DWIDTH 0 0 -BBX 6 2 0 12 +STARTCHAR D601 +ENCODING 54785 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 BITMAP -40 -FC +0030 +3C10 +0110 +FE10 +1DF0 +6210 +4210 +43F0 +3C20 +0000 +3FF0 +0020 +0020 +0020 +0020 +0020 ENDCHAR -STARTCHAR 0x20D1 -ENCODING 8401 -SWIDTH 0 0 -DWIDTH 0 0 -BBX 6 2 0 12 +STARTCHAR D604 +ENCODING 54788 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 BITMAP -08 -FC +0020 +0010 +3C10 +0390 +FC10 +3EF0 +4210 +4310 +63F0 +3C10 +0010 +0C10 +0410 +0400 +07F8 ENDCHAR -STARTCHAR 0x20D2 -ENCODING 8402 -SWIDTH 0 0 -DWIDTH 0 0 -BBX 1 13 0 -2 +STARTCHAR D608 +ENCODING 54792 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 3 -2 BITMAP -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 +0060 +7820 +0020 +FEE0 +3D20 +4420 +87E0 +47E0 +3820 +1FE0 +0020 +0040 +0FE0 +0800 +0FF0 ENDCHAR -STARTCHAR 0x20D3 -ENCODING 8403 -SWIDTH 0 0 -DWIDTH 0 0 -BBX 1 7 0 1 +STARTCHAR D610 +ENCODING 54800 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 BITMAP -80 -80 -80 -80 -80 -80 -80 +0070 +3C10 +0010 +FF90 +1810 +66F0 +4210 +6210 +3DF0 +0000 +0FF0 +0410 +0410 +0420 +07F0 +0400 ENDCHAR -STARTCHAR 0x20D4 -ENCODING 8404 -SWIDTH 0 0 -DWIDTH 0 0 -BBX 13 5 0 9 +STARTCHAR D611 +ENCODING 54801 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 BITMAP -0780 -1860 -A010 -C008 -E000 +0070 +1E10 +0010 +FF90 +1810 +6670 +4210 +4210 +3DF0 +0870 +0430 +07E0 +0420 +0420 +07E0 +0420 ENDCHAR -STARTCHAR 0x20D5 -ENCODING 8405 -SWIDTH 0 0 -DWIDTH 0 0 -BBX 13 5 0 9 +STARTCHAR D613 +ENCODING 54803 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 BITMAP -0F00 -30C0 -4028 -8018 -0038 +0020 +1C10 +0010 +0F10 +F810 +1CF0 +6210 +4210 +42F0 +3D10 +0090 +0180 +0240 +0430 +1800 ENDCHAR -STARTCHAR 0x20D6 -ENCODING 8406 -SWIDTH 0 0 -DWIDTH 0 0 -BBX 6 3 0 11 +STARTCHAR D614 +ENCODING 54804 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 BITMAP -40 -FC -40 +0070 +3C10 +0010 +FF90 +1810 +64F0 +4210 +6210 +3DF0 +0040 +0420 +0C60 +0A50 +1098 +2108 ENDCHAR -STARTCHAR 0x20D7 -ENCODING 8407 -SWIDTH 0 0 -DWIDTH 0 0 -BBX 6 3 0 11 +STARTCHAR D615 +ENCODING 54805 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 BITMAP -08 -FC -08 +0030 +1C10 +0010 +FF10 +1CF0 +6610 +4210 +43F0 +3C10 +0090 +0340 +0420 +0420 +0660 +03C0 ENDCHAR -STARTCHAR 0x20D8 -ENCODING 8408 -SWIDTH 0 0 -DWIDTH 0 0 -BBX 5 5 0 4 +STARTCHAR D61C +ENCODING 54812 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 BITMAP -70 -88 -88 -88 -70 +0030 +0010 +0090 +3890 +0090 +FE90 +7990 +8C90 +8490 +CF90 +7890 +0090 +0090 +0090 +0010 ENDCHAR -STARTCHAR 0x20D9 -ENCODING 8409 -SWIDTH 0 0 -DWIDTH 0 0 -BBX 6 6 0 4 +STARTCHAR D620 +ENCODING 54816 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 3 -2 BITMAP -04 -78 -98 -A8 -88 -70 +0060 +0020 +7B20 +0120 +1D20 +E120 +7720 +8920 +8F20 +7920 +0120 +0820 +0800 +0810 +07F0 ENDCHAR -STARTCHAR 0x20DA -ENCODING 8410 -SWIDTH 0 0 -DWIDTH 0 0 -BBX 6 6 0 3 +STARTCHAR D624 +ENCODING 54820 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 BITMAP -70 -88 -A8 -98 -78 -04 +0030 +0190 +3C90 +0090 +FE90 +3F90 +4490 +4790 +3C90 +0FF0 +0010 +0020 +0FF0 +0400 +07F8 ENDCHAR -STARTCHAR 0x20DB -ENCODING 8411 -SWIDTH 0 0 -DWIDTH 0 0 -BBX 8 2 0 11 +STARTCHAR D62D +ENCODING 54829 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 BITMAP -DB -DB +0030 +0010 +3990 +0090 +FE90 +7090 +CB90 +C790 +7890 +0810 +0410 +07F0 +0410 +0410 +07F0 +0410 ENDCHAR -STARTCHAR 0x20DC -ENCODING 8412 -SWIDTH 0 0 -DWIDTH 0 0 -BBX 11 2 0 11 +STARTCHAR D638 +ENCODING 54840 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 13 1 -1 BITMAP -DB60 -DB60 +03C0 +0000 +0000 +3FF8 +07C0 +0C60 +0820 +0820 +0440 +0380 +0100 +E1FE +1E00 ENDCHAR -STARTCHAR 0x20DD -ENCODING 8413 -SWIDTH 0 0 -DWIDTH 0 0 -BBX 17 17 0 -3 +STARTCHAR D639 +ENCODING 54841 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 16 2 -3 BITMAP -07F000 -180C00 -200200 -400100 -400100 -800080 -800080 -800080 -800080 -800080 -800080 -800080 -400100 -400100 -200200 -180C00 -07F000 +0780 +0000 +3FF0 +0600 +0F80 +0880 +0880 +0480 +0300 +FFFC +0000 +7FC0 +0040 +0040 +0040 +0040 ENDCHAR -STARTCHAR 0x20DE -ENCODING 8414 -SWIDTH 0 0 -DWIDTH 0 0 -BBX 17 17 0 -3 +STARTCHAR D63C +ENCODING 54844 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 BITMAP -FFFF80 -800080 -800080 -800080 -800080 -800080 -800080 -800080 -800080 -800080 -800080 -800080 -800080 -800080 -800080 -800080 -FFFF80 +0380 +3FF8 +0300 +0F80 +0840 +0840 +0480 +0300 +FFFE +0000 +1800 +0800 +0800 +0FF0 ENDCHAR -STARTCHAR 0x20DF -ENCODING 8415 -SWIDTH 0 0 -DWIDTH 0 0 -BBX 17 17 0 -3 +STARTCHAR D640 +ENCODING 54848 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 2 -2 BITMAP -008000 -014000 -022000 -041000 -080800 -100400 -200200 -400100 -800080 -400100 -200200 -100400 -080800 -041000 -022000 -014000 -008000 +0780 +3FF0 +0600 +0DC0 +0840 +0840 +0780 +FFFE +0000 +3FC0 +0040 +3FC0 +1000 +1FE0 ENDCHAR -STARTCHAR 0x2100 -ENCODING 8448 -SWIDTH 900 0 -DWIDTH 15 0 -BBX 13 11 1 0 +STARTCHAR D645 +ENCODING 54853 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 2 -2 BITMAP -3440 -4840 -8880 -9080 -9500 -6930 -0248 -0280 -0480 -0490 -0060 +0F00 +3BF0 +0600 +0D80 +0840 +0880 +0700 +FFFC +03F0 +3D00 +0560 +3D80 +2130 +3CC0 ENDCHAR -STARTCHAR 0x2101 -ENCODING 8449 -SWIDTH 900 0 -DWIDTH 15 0 -BBX 13 11 1 0 +STARTCHAR D648 +ENCODING 54856 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 16 2 -3 BITMAP -3440 -4840 -8880 -9080 -9500 -6938 -0248 -0220 -0410 -0448 -0070 +0780 +0000 +3FF0 +0E00 +0980 +0880 +0880 +0700 +FFFC +0000 +3FC0 +1040 +1040 +1080 +1FC0 +1000 ENDCHAR -STARTCHAR 0x2102 -ENCODING 8450 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 10 11 1 0 +STARTCHAR D649 +ENCODING 54857 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 16 1 -3 BITMAP -1F40 -30C0 -5040 -A040 -A000 -A000 -A000 -A040 -5040 -3080 -1F00 +03C0 +0000 +3FF8 +0100 +0EE0 +0820 +0440 +0380 +FFFE +0820 +0420 +07E0 +0420 +0420 +07E0 +0420 ENDCHAR -STARTCHAR 0x2103 -ENCODING 8451 +STARTCHAR D64B +ENCODING 54859 SWIDTH 1020 0 DWIDTH 17 0 -BBX 15 12 1 0 +BBX 14 15 2 -3 BITMAP -7000 -887A -8886 -8902 -7202 -0200 +0780 +3FF0 0200 +0780 +0840 +0840 +0880 +0700 +FFFC +0600 0200 -0202 -0102 -0084 -0078 +0500 +08E0 +1020 +2000 ENDCHAR -STARTCHAR 0x2104 -ENCODING 8452 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 9 11 1 0 +STARTCHAR D64D +ENCODING 54861 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 BITMAP -7C00 +0780 +0000 +3FF0 +0600 +0F00 +0880 +0880 +0900 +0600 +FFFC +0F80 +18C0 +1040 +18C0 +0780 +ENDCHAR +STARTCHAR D651 +ENCODING 54865 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0F00 +0000 +3FF0 +0600 +0980 +0840 +0880 +0700 +FFFC +0000 +1FE0 1000 -3C00 -5200 -9000 -9000 -9000 -5200 -3C00 -1080 -7F00 +1FC0 +1000 +1FE0 ENDCHAR -STARTCHAR 0x2105 -ENCODING 8453 -SWIDTH 900 0 -DWIDTH 15 0 -BBX 13 11 1 0 +STARTCHAR D654 +ENCODING 54868 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -3 BITMAP -3080 -4880 -8100 -8100 -9200 -6230 -0448 -0488 -0888 -0890 0060 +1E20 +0020 +7FA0 +0420 +3A20 +2120 +212C +3F30 +0C20 +0FE0 +F820 +0020 +0020 +0020 ENDCHAR -STARTCHAR 0x2106 -ENCODING 8454 -SWIDTH 960 0 -DWIDTH 16 0 -BBX 15 11 1 0 +STARTCHAR D655 +ENCODING 54869 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 BITMAP -3080 -4880 -8100 -8100 -9200 -6264 -0424 -0424 -0848 -084A -0034 +0060 +1E20 +7FA0 +0420 +3F20 +2120 +213C +1E20 +07E0 +F820 +3FE0 +0020 +0020 +0020 +0020 ENDCHAR -STARTCHAR 0x2107 -ENCODING 8455 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 8 11 1 0 +STARTCHAR D658 +ENCODING 54872 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 1 -2 BITMAP -3D -43 -81 -81 -40 -38 -40 -80 -81 -41 -3E +0060 +0F10 +0010 +3FD0 +0210 +1D10 +1090 +1990 +0F1C +06F0 +F910 +0C10 +0400 +0408 +07F8 ENDCHAR -STARTCHAR 0x2108 -ENCODING 8456 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 9 11 1 0 +STARTCHAR D65C +ENCODING 54876 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 BITMAP -BC00 -C200 -8100 -8080 0080 -1F80 -0080 -8080 -8100 -4200 -3C00 +1E60 +0020 +FFA0 +1820 +2620 +2220 +3E3C +08E0 +FF20 +1FE0 +0020 +0FE0 +0800 +0FF0 +ENDCHAR +STARTCHAR D667 +ENCODING 54887 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 3 -2 +BITMAP +0180 +3C40 +0040 +FF40 +1040 +6C40 +4240 +6C58 +3860 +1FC0 +E340 +0300 +0680 +0860 +3030 +ENDCHAR +STARTCHAR D669 +ENCODING 54889 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -2 +BITMAP +0060 +1C20 +7FA0 +0820 +1620 +2120 +223C +1E20 +0DE0 +FA20 +0180 +0660 +0420 +0660 +03C0 ENDCHAR -STARTCHAR 0x2109 -ENCODING 8457 +STARTCHAR D670 +ENCODING 54896 SWIDTH 1020 0 DWIDTH 17 0 -BBX 15 12 1 0 +BBX 13 16 1 -3 BITMAP -7000 -8BFE -8882 -8882 -708A -0088 -00F8 -0088 +0030 0088 -0080 -0080 -03E0 +1E48 +0048 +7F48 +0848 +3648 +2248 +3278 +1E48 +09C8 +FE48 +0048 +0048 +0048 +0008 ENDCHAR -STARTCHAR 0x210A -ENCODING 8458 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 6 10 1 -4 +STARTCHAR D671 +ENCODING 54897 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 BITMAP -18 -24 -44 -44 -48 -38 -1C -70 -90 -E0 +0030 +0190 +1890 +FE90 +1090 +2C90 +24F0 +3890 +1F90 +E090 +1FF0 +0010 +0010 +0010 +0010 +0010 ENDCHAR -STARTCHAR 0x210B -ENCODING 8459 -SWIDTH 840 0 -DWIDTH 14 0 -BBX 12 11 1 0 +STARTCHAR D674 +ENCODING 54900 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 14 2 -2 BITMAP -0A10 -1610 -0210 -0420 -0420 -1FE0 -2840 -4840 -4840 -9090 -60E0 +0130 +1C90 +0090 +FE90 +1890 +2490 +2290 +3CF0 +0990 +FE90 +0C90 +0410 +0400 +07F8 ENDCHAR -STARTCHAR 0x210C -ENCODING 8460 -SWIDTH 900 0 -DWIDTH 15 0 -BBX 13 12 1 -1 +STARTCHAR D683 +ENCODING 54915 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -3 BITMAP -7038 -D850 -8840 -C840 -4840 -4FC0 -0840 -0840 -1840 -F058 -6070 -0060 +0130 +3C90 +0090 +FE90 +1890 +2490 +2290 +3CF0 +0990 +FF90 +0090 +0140 +0230 +0C10 +1000 ENDCHAR -STARTCHAR 0x210D -ENCODING 8461 -SWIDTH 840 0 -DWIDTH 14 0 -BBX 12 11 1 0 +STARTCHAR D685 +ENCODING 54917 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 1 -2 BITMAP -F9F0 -50A0 -50A0 -50A0 -50A0 -5FA0 -50A0 -50A0 -50A0 -50A0 -F9F0 +0010 +00C8 +0C48 +7F48 +0C48 +1248 +1278 +0C48 +FFC8 +2048 +01B0 +0208 +0208 +0318 +01F0 ENDCHAR -STARTCHAR 0x210E -ENCODING 8462 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 7 12 1 0 +STARTCHAR D68C +ENCODING 54924 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 1 -3 BITMAP -30 -10 -10 -20 -20 -38 -44 -44 -44 -88 -8A -8C +0018 +0F08 +0008 +3F88 +0608 +1988 +1088 +1088 +0F08 +0238 +FFC8 +0008 +0008 +0008 +0008 ENDCHAR -STARTCHAR 0x210F -ENCODING 8463 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 7 12 1 0 +STARTCHAR D68D +ENCODING 54925 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 1 -2 BITMAP -30 -10 -1C -30 -E0 -38 -44 -44 -44 -88 -8A -8C +0030 +0708 +3FE8 +0E08 +1988 +1088 +1988 +0608 +DFF8 +2008 +1FF0 +0010 +0010 +0010 +0010 ENDCHAR -STARTCHAR 0x2110 -ENCODING 8464 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 7 11 1 0 +STARTCHAR D690 +ENCODING 54928 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 BITMAP -0E -12 -22 -04 -04 -04 -08 -38 -48 -90 -60 +0030 +1E10 +0010 +FFD0 +0410 +3B10 +2110 +3310 +1E10 +07F0 +F810 +1810 +0810 +0800 +0FF8 ENDCHAR -STARTCHAR 0x2111 -ENCODING 8465 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 9 11 1 0 +STARTCHAR D694 +ENCODING 54932 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 11 14 4 -2 BITMAP -7F00 -C200 -8600 -C400 -6600 -2200 -0300 -0180 -4080 -E180 -3F00 +38C0 +0040 +FF40 +3840 +4440 +4440 +2840 +1FC0 +E000 +3FC0 +0080 +3FC0 +1000 +1FE0 ENDCHAR -STARTCHAR 0x2112 -ENCODING 8466 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 10 11 1 0 +STARTCHAR D69D +ENCODING 54941 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 10 15 3 -3 BITMAP -0380 -0440 -0480 -3F00 -0800 -0800 -0800 -1000 -5000 -B100 -CE00 +1CC0 +0040 +7F40 +3C40 +4640 +4240 +2440 +1FC0 +F0C0 +0840 +0FC0 +0840 +0840 +0FC0 +0840 ENDCHAR -STARTCHAR 0x2113 -ENCODING 8467 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 6 11 1 0 +STARTCHAR D69F +ENCODING 54943 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 1 -2 BITMAP -10 -28 -28 -28 -50 -50 -50 -60 -60 -C4 -38 +0030 +0708 +0048 +3F88 +0D08 +1088 +1188 +0F08 +0678 +FD88 +00C0 +0080 +0160 +0218 +0C0C ENDCHAR -STARTCHAR 0x2114 -ENCODING 8468 -SWIDTH 780 0 -DWIDTH 13 0 -BBX 11 12 1 0 +STARTCHAR D6A1 +ENCODING 54945 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 BITMAP -6600 -2200 -FFE0 -2200 -2200 -23C0 -2220 -2220 -2220 -2220 -2220 -73C0 +0060 +1E10 +0090 +7F10 +1610 +2110 +2310 +1E10 +0DF0 +FA10 +0180 +0660 +0420 +0660 +03C0 ENDCHAR -STARTCHAR 0x2115 -ENCODING 8469 -SWIDTH 900 0 -DWIDTH 15 0 -BBX 13 11 1 0 +STARTCHAR D6A8 +ENCODING 54952 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 13 2 -1 BITMAP -F8F8 -2420 -3420 -2A20 -2A20 -2520 -22A0 -22A0 -2160 -2120 -F8E0 +0780 +0000 +7FF0 +0200 +0F80 +1040 +1040 +1040 +0F80 +18C0 +0840 +084C +F7B0 ENDCHAR -STARTCHAR 0x2116 -ENCODING 8470 +STARTCHAR D6AC +ENCODING 54956 SWIDTH 1020 0 DWIDTH 17 0 -BBX 15 11 1 0 +BBX 14 14 2 -2 BITMAP -E3E0 -3080 -3080 -289C -28A2 -24A2 -22A2 -22A2 -219C -2180 -F8BE +0790 +3FF8 +0200 +0780 +0840 +0840 +0C80 +07C0 +FFFC +0000 +3000 +1000 +1020 +1FE0 ENDCHAR -STARTCHAR 0x2117 -ENCODING 8471 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 9 10 1 3 +STARTCHAR D6B0 +ENCODING 54960 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 14 1 -2 BITMAP -3E00 -4100 -BC80 -9280 -9280 -9C80 -9080 -B880 -4100 -3E00 +03C0 +1FF8 +0300 +04E0 +0420 +0420 +03E0 +FFFE +0000 +1FE0 +0020 +1FE0 +0800 +0FF0 ENDCHAR -STARTCHAR 0x2118 -ENCODING 8472 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 9 13 1 -4 +STARTCHAR D6B9 +ENCODING 54969 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 16 2 -3 BITMAP -4000 -8700 -8880 -9080 -9080 -A480 -AC80 -4900 -A600 -A000 -9000 -9000 -6000 +0780 +0000 +3FF0 +0780 +0880 +0880 +0880 +0F80 +FFFC +10C0 +0840 +0FC0 +0840 +0840 +0FC0 +0840 ENDCHAR -STARTCHAR 0x2119 -ENCODING 8473 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 10 11 1 0 +STARTCHAR D6BB +ENCODING 54971 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 2 -2 BITMAP -FF80 -52C0 -5140 -5140 -5140 -52C0 -5F80 -5000 -5000 -5000 -F800 +0780 +3FF0 +0700 +0880 +0840 +0C40 +1FC0 +0840 +FFFC +0200 +0200 +0580 +0860 +3020 ENDCHAR -STARTCHAR 0x211A -ENCODING 8474 -SWIDTH 780 0 -DWIDTH 13 0 -BBX 11 14 1 -3 +STARTCHAR D6C4 +ENCODING 54980 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -3 BITMAP -1F00 -3180 -5140 -A0A0 -A0A0 -A0A0 -A0A0 -A0A0 -5540 -3B80 -1F00 -0500 -0520 03C0 +1FF8 +0100 +03C0 +0420 +0420 +03C0 +0000 +FFFE +0100 +0100 +0100 +0100 +0100 +0100 +ENDCHAR +STARTCHAR D6C5 +ENCODING 54981 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -2 +BITMAP +0380 +0000 +3FF0 +0300 +0CC0 +0840 +0840 +0780 +FFFE +0100 +3FE0 +0020 +0020 +0020 +0020 ENDCHAR -STARTCHAR 0x211B -ENCODING 8475 -SWIDTH 780 0 -DWIDTH 13 0 -BBX 11 11 1 0 +STARTCHAR D6C8 +ENCODING 54984 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -2 BITMAP -01C0 -0620 -0A20 -1440 -2480 -4B00 -4A00 -8A00 -9100 -9120 -60C0 +03C0 +0000 +1FF8 +03C0 +0420 +0420 +0420 +03C0 +FFFE +0100 +0100 +0900 +0900 +0800 +07F8 ENDCHAR -STARTCHAR 0x211C -ENCODING 8476 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 10 11 1 0 +STARTCHAR D6CC +ENCODING 54988 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 2 -2 BITMAP -7380 -DCC0 -8840 -C8C0 -4880 -4B00 -0B00 -0B00 -1900 -F1C0 -6180 +0700 +0000 +7FF0 +0900 +0880 +0880 +0F80 +FFFC +0200 +1DC0 +0040 +3FC0 +1000 +1FE0 ENDCHAR -STARTCHAR 0x211D -ENCODING 8477 -SWIDTH 840 0 -DWIDTH 14 0 -BBX 12 11 1 0 +STARTCHAR D6D1 +ENCODING 54993 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 1 -3 BITMAP -FF00 -5280 -5140 -5140 -5280 -5F00 -5580 -5280 -5280 -5280 -F970 +03C0 +1FF8 +03C0 +0440 +0440 +03C0 +FC00 +03FC +0100 +3FB8 +02C0 +36B0 +18C0 +1298 +1C60 ENDCHAR -STARTCHAR 0x211E -ENCODING 8478 -SWIDTH 780 0 -DWIDTH 13 0 -BBX 11 11 1 0 +STARTCHAR D6D4 +ENCODING 54996 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -3 BITMAP -FE00 -2100 -2080 -2080 -2100 -3E20 -2340 -2180 -2100 -2300 -F4E0 +0780 +1F70 +0380 +0440 +0420 +0440 +0380 +FFFE +0100 +0F00 +08E0 +0820 +0840 +0FE0 +0800 ENDCHAR -STARTCHAR 0x211F -ENCODING 8479 -SWIDTH 780 0 -DWIDTH 13 0 -BBX 11 17 1 -3 +STARTCHAR D6D7 +ENCODING 54999 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 16 1 -3 BITMAP -1800 -0600 -0200 -FE00 -2500 -2480 -2480 -2900 -3E00 -2B00 -2900 -3100 -3100 -F8E0 +0380 +0000 +3FF0 +0100 +0680 +0840 +0C40 +0780 +FFFE +0100 +0300 +0100 +0380 +0460 +0810 1000 -2000 -2000 ENDCHAR -STARTCHAR 0x2120 -ENCODING 8480 -SWIDTH 900 0 -DWIDTH 15 0 -BBX 13 7 1 4 +STARTCHAR D6D9 +ENCODING 55001 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 1 -2 BITMAP -7618 -9330 -8330 -62D0 -12D0 -9210 -E738 +0380 +3FF8 +0100 +06C0 +0440 +0440 +0384 +FF78 +0100 +07C0 +0C60 +0820 +0C60 +07C0 ENDCHAR -STARTCHAR 0x2121 -ENCODING 8481 -SWIDTH 1140 0 -DWIDTH 19 0 -BBX 17 7 1 4 +STARTCHAR D6E0 +ENCODING 55008 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 BITMAP -FBEE00 -A92400 -210400 -21C400 -210400 -212480 -73EF80 +0030 +1E10 +0010 +FF90 +0C10 +3310 +2110 +3110 +0E10 +1F10 +E9F0 +0810 +0810 +0810 +0010 ENDCHAR -STARTCHAR 0x2122 -ENCODING 8482 -SWIDTH 960 0 -DWIDTH 16 0 -BBX 14 7 1 4 +STARTCHAR D6E4 +ENCODING 55012 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 BITMAP -FB0C -A998 -2198 -2168 -2168 -2108 -739C +0030 +1E10 +0010 +7F90 +1E10 +2210 +2210 +1E10 +0390 +FDF0 +0810 +1C10 +0400 +0400 +07F8 ENDCHAR -STARTCHAR 0x2123 -ENCODING 8483 -SWIDTH 780 0 -DWIDTH 13 0 -BBX 11 17 1 -2 +STARTCHAR D6E8 +ENCODING 55016 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 BITMAP -1800 -0600 -0200 +0030 +1E10 +0790 +FC10 +3A10 +2310 +1E10 +0390 +FCF0 0400 -F5E0 -2480 -2480 -1900 -1900 -1900 -0A00 -1A00 -1A00 -1400 -1400 -2000 -2000 +0FF0 +0010 +0FF0 +0400 +07F8 ENDCHAR -STARTCHAR 0x2124 -ENCODING 8484 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 7 11 1 0 +STARTCHAR D6F0 +ENCODING 55024 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 BITMAP -FE -CA -8A -94 -14 -28 -52 -52 -A2 -A6 -FE +0030 +3C10 +0010 +7F90 +3410 +2210 +1C10 +0310 +FCF0 +0810 +0FF0 +0410 +0420 +0420 +07F0 +0400 ENDCHAR -STARTCHAR 0x2125 -ENCODING 8485 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 6 15 1 -4 +STARTCHAR D6F5 +ENCODING 55029 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 BITMAP -7C -08 -10 -20 -7C -08 -10 -20 -70 -08 -04 -04 -C4 -88 -70 +0030 +1C10 +0110 +7E10 +3610 +2210 +1C10 +0310 +FCF0 +0810 +0080 +0360 +0410 +0410 +0630 +03E0 ENDCHAR -STARTCHAR 0x2126 -ENCODING 8486 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 9 11 1 0 +STARTCHAR D6FC +ENCODING 55036 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 11 16 3 -3 BITMAP -3E00 -4100 -8080 -8080 -8080 -8080 -4100 -4100 -2200 -A280 -E380 +00C0 +0260 +7920 +0120 +F920 +3920 +4920 +4520 +4920 +3D20 +F120 +1720 +2120 +0120 +0020 +0020 ENDCHAR -STARTCHAR 0x2127 -ENCODING 8487 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 9 11 1 0 +STARTCHAR D6FD +ENCODING 55037 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 BITMAP -E380 -A280 -2200 -4100 -4100 -8080 -8080 -8080 -8080 -4100 -3E00 +0030 +00D0 +1C50 +0650 +7C50 +2450 +2450 +1950 +FE50 +09D0 +1FF0 +0810 +0010 +0010 +0010 +0010 ENDCHAR -STARTCHAR 0x2128 -ENCODING 8488 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 7 11 1 0 +STARTCHAR D700 +ENCODING 55040 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 BITMAP -78 -84 -02 -22 -44 -38 -44 -02 -02 -64 -98 +0020 +0110 +1C90 +8790 +3C90 +2690 +2490 +1890 +1E90 +6F90 +0890 +0C10 +0400 +0400 +07F8 ENDCHAR -STARTCHAR 0x2129 -ENCODING 8489 -SWIDTH 360 0 -DWIDTH 6 0 -BBX 4 7 1 0 +STARTCHAR D704 +ENCODING 55044 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 1 -2 BITMAP -40 -A0 -20 -20 -20 -30 -20 +0018 +0068 +1E28 +7F28 +0C28 +1228 +1E28 +1EA8 +FD28 +04E0 +0FF8 +0010 +0FF0 +0400 +07F8 ENDCHAR -STARTCHAR 0x212A -ENCODING 8490 -SWIDTH 780 0 -DWIDTH 13 0 -BBX 11 11 1 0 +STARTCHAR D711 +ENCODING 55057 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 1 -2 BITMAP -F9E0 -2180 -2300 -2600 -2C00 -2E00 -3200 -2100 -2100 -2080 -F9E0 +0010 +0058 +1E48 +7F48 +0C48 +1248 +1E48 +1EC8 +FFC8 +0488 +01E8 +0210 +0210 +0210 +01E0 ENDCHAR -STARTCHAR 0x212B -ENCODING 8491 -SWIDTH 780 0 -DWIDTH 13 0 -BBX 11 15 1 0 +STARTCHAR D718 +ENCODING 55064 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 16 1 -3 BITMAP -0600 -0900 -0900 -0600 -0400 -0400 -0A00 -0A00 -0A00 -1100 -1100 -1F00 -2080 -2080 -F1E0 +0018 +0F08 +0008 +3FC8 +0608 +1908 +1088 +1088 +0F08 +00F8 +FF08 +0408 +0408 +0408 +0008 +0008 ENDCHAR -STARTCHAR 0x212C -ENCODING 8492 -SWIDTH 780 0 -DWIDTH 13 0 -BBX 11 11 1 0 +STARTCHAR D719 +ENCODING 55065 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 BITMAP -01C0 -0620 -0A20 -1440 -2480 -4BC0 -4C20 -8820 -9020 -9840 -6780 +0030 +1E10 +4390 +3C10 +1310 +1110 +1E10 +FFF0 +0410 +0410 +1FF0 +0810 +0010 +0010 +0010 ENDCHAR -STARTCHAR 0x212D -ENCODING 8493 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 10 11 1 0 +STARTCHAR D71C +ENCODING 55068 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 3 -2 +BITMAP +0060 +3C20 +0320 +7C20 +3C20 +4220 +4220 +3C20 +0FE0 +F820 +0820 +3820 +0800 +0800 +0FF0 +ENDCHAR +STARTCHAR D720 +ENCODING 55072 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 3 -2 BITMAP -1F40 -3180 -6300 -C180 -C080 -C180 -C300 -C000 -6040 -3080 -1F00 +0060 +3C20 +0020 +FF20 +3C20 +2620 +2620 +3C20 +01A0 +FFE0 +0020 +1FE0 +0800 +0800 +0FF0 ENDCHAR -STARTCHAR 0x212E -ENCODING 8494 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 7 9 1 0 +STARTCHAR D728 +ENCODING 55080 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 11 16 3 -3 BITMAP -38 -44 -C6 -C6 -FE -C0 -C0 -46 -3C +0060 +3C20 +0F20 +7C20 +2220 +2220 +3C20 +0FE0 +F820 +0820 +1FE0 +0820 +0820 +0840 +0B80 +0400 ENDCHAR -STARTCHAR 0x212F -ENCODING 8495 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 7 7 1 0 +STARTCHAR D729 +ENCODING 55081 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 11 16 3 -3 BITMAP -1C -22 -4C -70 -80 -88 -70 +0060 +3C20 +0F20 +7820 +3C20 +6220 +2220 +3C60 +1FA0 +E800 +0860 +1820 +0FE0 +0820 +0FE0 +0820 ENDCHAR -STARTCHAR 0x2130 -ENCODING 8496 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 9 11 1 0 +STARTCHAR D72B +ENCODING 55083 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 16 2 -3 BITMAP -0700 -0880 -1080 -1100 +0030 +1E10 +0010 +3F90 +1A10 +1110 +1E10 +01F0 +FE10 +0590 +0480 +0180 +0240 +0438 +0808 1000 -3C00 -4000 -8F00 -9080 -8100 -7E00 ENDCHAR -STARTCHAR 0x2131 -ENCODING 8497 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 9 11 1 0 +STARTCHAR D72D +ENCODING 55085 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 11 15 3 -2 BITMAP -1880 -2700 -3100 -0200 -7F80 -0400 -0400 -7C00 -8C00 -9200 -6200 +0060 +3C20 +0F20 +7C20 +2220 +2220 +3C20 +1FE0 +E820 +0920 +06C0 +0820 +0820 +0C60 +0380 ENDCHAR -STARTCHAR 0x2132 -ENCODING 8498 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 9 11 1 0 +STARTCHAR D734 +ENCODING 55092 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -3 BITMAP -0F80 -0200 +0780 +7FF0 0200 -2200 -2200 -3E00 -2200 -A200 -8200 -8200 -FF80 +0D80 +1080 +1080 +0F00 +0000 +FFF8 +0880 +0880 +0880 +0880 +0880 +0080 ENDCHAR -STARTCHAR 0x2133 -ENCODING 8499 -SWIDTH 1080 0 -DWIDTH 18 0 -BBX 16 11 1 0 +STARTCHAR D735 +ENCODING 55093 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 2 -2 BITMAP -00C6 -00C6 -014A -014A -0294 -0294 -04A4 -64A4 -8948 -8949 -7086 +0700 +3FE0 +0700 +0880 +0880 +0880 +FFC0 +087C +0880 +3FC0 +0040 +0040 +0040 +0040 ENDCHAR -STARTCHAR 0x2134 -ENCODING 8500 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 5 7 1 0 +STARTCHAR D738 +ENCODING 55096 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 13 1 -1 BITMAP -30 -48 -88 -88 -88 -90 -60 +03C0 +0010 +1FE0 +06C0 +0440 +0640 +0380 +FFFC +0440 +0C40 +0840 +0840 +07F8 ENDCHAR -STARTCHAR 0x2135 -ENCODING 8501 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 10 11 1 0 +STARTCHAR D73C +ENCODING 55100 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 2 -2 BITMAP -4100 -4100 -6180 -30C0 -1940 -2E40 -4600 -4300 -4180 -6080 -C080 +0700 +3FF0 +0700 +0880 +08C0 +0780 +FFFC +0880 +0880 +3FC0 +0040 +3FC0 +1000 +1FE0 ENDCHAR -STARTCHAR 0x2136 -ENCODING 8502 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 9 11 1 0 +STARTCHAR D744 +ENCODING 55108 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 2 -2 BITMAP -4000 -FC00 -7E00 -0600 -0200 -0200 -0200 -0200 +0780 +3FF0 0200 -7F80 -FF00 +0D80 +0840 +0880 +0788 +FFFC +0880 +3F80 +1040 +1040 +1080 +1FC0 ENDCHAR -STARTCHAR 0x2137 -ENCODING 8503 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 6 11 1 0 +STARTCHAR D747 +ENCODING 55111 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 2 -2 BITMAP -40 -F0 -78 -08 -08 -08 -08 -78 -C8 -8C -88 +0780 +3FF0 +0780 +08C0 +0880 +0780 +FFFC +0840 +0840 +0A40 +0200 +0500 +08E0 +3030 ENDCHAR -STARTCHAR 0x2138 -ENCODING 8504 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 8 11 1 0 +STARTCHAR D749 +ENCODING 55113 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -2 BITMAP -40 -FE -7F -04 -04 -04 -04 -04 -04 -04 -04 +03C0 +0000 +1FF8 +0080 +0760 +0420 +0460 +03C0 +FFFE +0420 +07A0 +0460 +0420 +0620 +03C0 ENDCHAR -STARTCHAR 0x0069 -ENCODING 8505 -SWIDTH 360 0 -DWIDTH 6 0 -BBX 4 12 1 0 +STARTCHAR D750 +ENCODING 55120 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 11 1 0 BITMAP -40 -E0 -40 -00 -E0 -E0 -60 -60 -60 -60 -F0 -F0 +03C0 +0000 +3FF8 +07C0 +0C60 +0820 +0820 +0C60 +03C0 +0004 +FFFE ENDCHAR -STARTCHAR C081 -ENCODING 8506 -SWIDTH 900 0 -DWIDTH 15 0 -BBX 14 10 1 0 +STARTCHAR D751 +ENCODING 55121 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -2 BITMAP -1F08 -2084 -4044 -8078 -80A0 -80A0 -80E0 -4040 -2080 -1F00 +03C0 +0000 +1FF8 +03C0 +0420 +0420 +0420 +03C0 +FFFE +0000 +3FE0 +0020 +0020 +0020 +0020 ENDCHAR -STARTCHAR 0x2153 -ENCODING 8531 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 11 12 1 0 +STARTCHAR D754 +ENCODING 55124 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 2 -2 BITMAP -4200 -C200 -4200 -4400 -4400 -44C0 -E920 -0820 +0780 +00F0 +3F00 +0780 0840 -1020 -1120 -10C0 +0840 +0840 +0788 +FFFC +0000 +3000 +1000 +1000 +1FF0 ENDCHAR -STARTCHAR 0x2154 -ENCODING 8532 -SWIDTH 780 0 -DWIDTH 13 0 -BBX 12 12 1 0 +STARTCHAR D756 +ENCODING 55126 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 2 -2 BITMAP -6100 -9100 -1100 -1200 -2200 -4260 -F490 -0410 -0420 -0810 -0890 -0860 +0700 +39F0 +0780 +0C40 +0840 +0440 +0780 +FFFC +01C0 +6078 +23C0 +21A0 +2520 +39E0 ENDCHAR -STARTCHAR 0x2155 -ENCODING 8533 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 11 12 1 0 +STARTCHAR D757 +ENCODING 55127 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -3 BITMAP -4200 -C200 -4200 -4400 -4400 -45E0 -E900 -0940 -09A0 -1020 -1120 -10C0 +0790 +3F60 +07C0 +0440 +0820 +0440 +0380 +01FE +FF00 +0000 +0FF0 +0800 +0800 +0810 +07F8 ENDCHAR -STARTCHAR 0x2156 -ENCODING 8534 -SWIDTH 780 0 -DWIDTH 13 0 -BBX 12 12 1 0 +STARTCHAR D758 +ENCODING 55128 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 14 2 -2 BITMAP -6100 -9100 -1100 -1200 -2200 -42F0 -F480 -04A0 -04D0 -0810 -0890 -0860 +0780 +39F0 +0780 +0C40 +0840 +0C40 +0788 +FFFC +0000 +3FC0 +0040 +3FC0 +1000 +1FE0 ENDCHAR -STARTCHAR 0x2157 -ENCODING 8535 -SWIDTH 780 0 -DWIDTH 13 0 -BBX 12 12 1 0 +STARTCHAR D759 +ENCODING 55129 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -3 BITMAP -6100 -9100 -1100 -2200 -1200 -92F0 -6480 -04A0 -04D0 -0810 -0890 -0860 +03C0 +1BF8 +0500 +06E0 +0420 +0620 +01C4 +FFFE +0000 +3E78 +0208 +3608 +1808 +1608 +0800 ENDCHAR -STARTCHAR 0x2158 -ENCODING 8536 -SWIDTH 840 0 -DWIDTH 14 0 -BBX 13 12 1 0 +STARTCHAR D760 +ENCODING 55136 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 14 15 2 -3 BITMAP -1080 -3080 -5080 -9100 -F900 -1178 -3A40 -0250 -0268 -0408 -0448 -0430 +07A0 +7E40 +0F80 +0880 +1040 +0880 +0700 +01FC +FE00 +0000 +0FE0 +0820 +0840 +0FE0 +0800 ENDCHAR -STARTCHAR 0x2159 -ENCODING 8537 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 11 12 1 0 +STARTCHAR D761 +ENCODING 55137 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 16 1 -3 BITMAP -4200 -C200 -4200 -4400 -4400 -44C0 -E920 -0900 -09C0 -1120 -1120 -10C0 +03C0 +0000 +1FF8 +03C0 +0420 +0420 +0420 +03C4 +FFFE +0060 +0820 +0FE0 +0820 +0820 +0FE0 +0820 ENDCHAR -STARTCHAR 0x215A -ENCODING 8538 -SWIDTH 780 0 -DWIDTH 13 0 -BBX 12 12 1 0 +STARTCHAR D763 +ENCODING 55139 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -3 BITMAP -F100 -8100 -A100 -D200 -1200 -9260 -6490 -0480 -04E0 -0890 -0890 -0860 +0380 +2078 +1F80 +06C0 +0440 +0440 +0380 +0004 +FFFE +0300 +0100 +0280 +0470 +1810 +2000 ENDCHAR -STARTCHAR 0x215B -ENCODING 8539 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 11 12 1 0 +STARTCHAR D765 +ENCODING 55141 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -3 BITMAP -4200 -C200 -4200 -4400 -4400 -44C0 -E920 -0920 -08C0 -1120 -1120 +0700 +7FF0 +0300 +0C80 +1840 +1840 +0F80 +7C00 +83F8 +0200 +0F80 10C0 +1040 +18C0 +0F80 ENDCHAR -STARTCHAR 0x215C -ENCODING 8540 -SWIDTH 780 0 -DWIDTH 13 0 -BBX 12 12 1 0 +STARTCHAR D769 +ENCODING 55145 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 15 15 1 -2 BITMAP -6100 -9100 -1100 -2200 -1200 -9260 -6490 -0490 -0460 -0890 -0890 -0860 +0380 +0000 +3FF8 +0100 +06E0 +0420 +0660 +03C6 +FFFE +0000 +0FF0 +0800 +0FF0 +0800 +07F8 ENDCHAR -STARTCHAR 0x215D -ENCODING 8541 -SWIDTH 780 0 -DWIDTH 13 0 -BBX 12 12 1 0 +STARTCHAR D76C +ENCODING 55148 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 15 2 -2 BITMAP -F100 -8100 -A100 -D200 -1200 -9260 -6490 -0490 -0460 -0890 -0890 -0860 +0060 +0010 +1E10 +03D0 +7C10 +0E10 +3110 +2110 +2110 +1E10 +01F0 +FE10 +0010 +0010 +0010 ENDCHAR -STARTCHAR 0x215E -ENCODING 8542 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 11 12 1 0 +STARTCHAR D770 +ENCODING 55152 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 BITMAP -F200 -9200 -2200 -2400 -4400 -44C0 -4920 -0920 -08C0 -1120 -1120 -10C0 +0030 +0010 +1E10 +7F90 +1E10 +3210 +2110 +3210 +1EF0 +F910 +0010 +1810 +0800 +0800 +0FF8 ENDCHAR -STARTCHAR 0x215F -ENCODING 8543 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 12 1 0 +STARTCHAR D774 +ENCODING 55156 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 BITMAP -42 -C2 -42 -44 -44 -44 -E8 -08 -08 -10 -10 -10 +0030 +0E10 +0010 +3F90 +1B10 +2110 +1110 +0E30 +FFD0 +0000 +0FF0 +0FF0 +0400 +0400 +07F8 ENDCHAR -STARTCHAR 0x2160 -ENCODING 8544 -SWIDTH 360 0 -DWIDTH 6 0 -BBX 5 11 1 0 +STARTCHAR D77C +ENCODING 55164 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 BITMAP -F8 -20 -20 -20 -20 -20 -20 -20 -20 -20 -F8 +0030 +1E10 +0010 +FF10 +3C10 +2210 +2210 +3C30 +FFD0 +0010 +1FE0 +0820 +0820 +0840 +0FE0 +0800 ENDCHAR -STARTCHAR 0x2161 -ENCODING 8545 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 8 11 1 0 +STARTCHAR D77D +ENCODING 55165 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 11 15 2 -3 BITMAP -FF -24 -24 -24 -24 -24 -24 -24 -24 -24 -FF +1E60 +0020 +7F20 +1620 +2220 +3220 +1C20 +00E0 +FF60 +0820 +0FE0 +0820 +0820 +0FE0 +0820 ENDCHAR -STARTCHAR 0x2162 -ENCODING 8546 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 11 11 1 0 +STARTCHAR D781 +ENCODING 55169 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 1 -2 BITMAP -FFE0 -2480 -2480 -2480 -2480 -2480 -2480 -2480 -2480 -2480 -FFE0 +0018 +0708 +0008 +3F88 +0F08 +1108 +1108 +0F08 +83F8 +3C08 +01C0 +0230 +0210 +0330 +01E0 ENDCHAR -STARTCHAR 0x2163 -ENCODING 8547 +STARTCHAR D788 +ENCODING 55176 SWIDTH 1020 0 DWIDTH 17 0 -BBX 16 11 1 0 +BBX 12 15 2 -2 BITMAP -FF8F -2104 -2104 -2088 -2088 -2088 -2050 -2050 -2050 -2020 -F820 +0030 +0010 +1E10 +0010 +0090 +FF90 +3E10 +6310 +4110 +6310 +3E10 +0010 +0010 +0010 +0010 ENDCHAR -STARTCHAR 0x2164 -ENCODING 8548 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 11 11 1 0 +STARTCHAR D789 +ENCODING 55177 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 10 16 4 -3 BITMAP -F1E0 -2080 -2080 -1100 -1100 -1100 -0A00 -0A00 -0A00 +00C0 +7040 +0840 +0640 +F840 +8440 +8440 +C440 +7840 +0000 +7FC0 +0040 +0040 +0040 +0040 +0040 +ENDCHAR +STARTCHAR D78C +ENCODING 55180 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0060 +0010 +3C10 +0090 +FF90 +1810 +6610 +4210 +4210 +3C10 +0010 +0C10 0400 0400 +07F8 ENDCHAR -STARTCHAR 0x2165 -ENCODING 8549 +STARTCHAR D790 +ENCODING 55184 SWIDTH 1020 0 DWIDTH 17 0 -BBX 16 11 1 0 +BBX 12 15 2 -2 BITMAP -F1FF -2084 -2084 -1104 -1104 -1104 -0A04 -0A04 -0A04 -0404 -041F +0030 +1C10 +0010 +FF90 +1010 +6C10 +4210 +6210 +3C00 +1FF0 +0020 +1FF0 +0800 +0800 +0FF0 ENDCHAR -STARTCHAR 0x2166 -ENCODING 8550 -SWIDTH 1080 0 -DWIDTH 18 0 -BBX 17 11 1 0 +STARTCHAR D798 +ENCODING 55192 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 12 16 2 -3 BITMAP -F3FF80 -211200 -211200 -121200 -121200 -121200 -121200 -141200 -081200 -081200 -087F80 +0030 +1E10 +0010 +FF90 +1810 +6410 +4210 +6210 +3C10 +0000 +0FF0 +0420 +0420 +0420 +07F0 +0400 ENDCHAR -STARTCHAR 0x2167 -ENCODING 8551 -SWIDTH 1260 0 -DWIDTH 21 0 -BBX 20 11 1 0 +STARTCHAR D799 +ENCODING 55193 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 11 16 3 -3 BITMAP -F3FFF0 -211240 -211240 -121240 -121240 -121240 -121240 -141240 -081240 -081240 -087FF0 +00C0 +3C20 +0020 +FFA0 +1820 +6420 +4220 +6220 +3C20 +1840 +0840 +0FC0 +0840 +0840 +0FC0 +0840 ENDCHAR -STARTCHAR 0x2168 -ENCODING 8552 +STARTCHAR D79B +ENCODING 55195 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 13 15 2 -2 +BITMAP +0030 +0010 +1E10 +FF90 +0410 +1E10 +2110 +2110 +2110 +1E10 +0080 +0180 +0340 +0430 +1808 +ENDCHAR +STARTCHAR D79D +ENCODING 55197 SWIDTH 1020 0 DWIDTH 17 0 -BBX 16 11 1 0 -BITMAP -FF9E -2088 -2090 -2050 -2060 -2020 -2050 -20D0 -2088 -2104 -FF8F -ENDCHAR -STARTCHAR 0x2169 -ENCODING 8553 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 11 11 1 0 +BBX 11 15 3 -2 BITMAP -F3C0 -1100 -1200 -0A00 -0C00 -0400 -0A00 -1A00 -1100 -2080 -F1E0 +0060 +0020 +3C20 +FF20 +0820 +3C20 +4220 +4220 +6620 +1920 +0380 +0C60 +0820 +0C60 +07C0 ENDCHAR -STARTCHAR 0x216A -ENCODING 8554 -SWIDTH 960 0 -DWIDTH 16 0 -BBX 15 11 1 0 +STARTCHAR char8192 +ENCODING 57356 +SWIDTH 900 0 +DWIDTH 15 0 +BBX 15 15 0 0 BITMAP -F3FE -1108 -1208 -0A08 -0C08 -0408 -0A08 -1A08 -1108 -2088 -F1FE +B6D6 +8000 +3EAA +84A8 +08AA +90AA +BE50 +0002 +A20A +B208 +2A0A +A68A +A270 +0002 +DB6A ENDCHAR -STARTCHAR 0x216B -ENCODING 8555 -SWIDTH 1140 0 -DWIDTH 19 0 -BBX 18 11 1 0 +STARTCHAR char8192 +ENCODING 57357 +SWIDTH 900 0 +DWIDTH 15 0 +BBX 15 15 0 0 BITMAP -F3FFC0 -110900 -120900 -0A0900 -0C0900 -040900 -0A0900 -1A0900 -110900 -208900 -F1FFC0 +B6D6 +8000 +3EAA +84A8 +08AA +90AA +BE50 +0002 +8042 +8040 +0042 +8442 +8380 +0002 +DB6A ENDCHAR -STARTCHAR 0x216C -ENCODING 8556 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 8 11 1 0 +STARTCHAR C073 +ENCODING 57646 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 19 1 -3 BITMAP +10 +30 +20 +40 +00 F8 20 20 20 20 20 -21 -21 -21 -23 -FF -ENDCHAR -STARTCHAR 0x216D -ENCODING 8557 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 11 1 0 -BITMAP -1E80 -2180 -4080 -8080 -8000 -8000 -8000 -8080 -4080 -2100 -1E00 -ENDCHAR -STARTCHAR 0x216E -ENCODING 8558 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 10 11 1 0 -BITMAP -FE00 -2180 -2080 -2040 -2040 -2040 -2040 -2040 -2080 -2180 -FE00 -ENDCHAR -STARTCHAR 0x216F -ENCODING 8559 -SWIDTH 900 0 -DWIDTH 15 0 -BBX 14 11 1 0 -BITMAP -F03C -3030 -3030 -2850 -2850 -2890 -2490 -2490 -2310 -2310 -FB7C +20 +20 +20 +20 +F8 +20 +48 +30 ENDCHAR -STARTCHAR 0x2170 -ENCODING 8560 +STARTCHAR 0x012F +ENCODING 57647 SWIDTH 240 0 DWIDTH 4 0 -BBX 3 11 1 0 +BBX 4 15 1 -3 BITMAP -C0 -C0 -00 +10 +30 +20 +40 00 C0 40 @@ -48116,11547 +115084,13323 @@ 40 40 E0 +40 +90 +60 ENDCHAR -STARTCHAR 0x2171 -ENCODING 8561 +STARTCHAR 00EA +ENCODING 58842 SWIDTH 480 0 DWIDTH 8 0 -BBX 7 11 1 0 -BITMAP -CC -CC -00 -00 -CC -44 -44 -44 -44 -44 -EE -ENDCHAR -STARTCHAR 0x2172 -ENCODING 8562 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 11 11 1 0 +BBX 7 13 1 -4 BITMAP -CCC0 -CCC0 -0000 -0000 -CCC0 -4440 -4440 -4440 -4440 -4440 -EEE0 +40 +FE +04 +04 +74 +24 +04 +04 +04 +04 +04 +04 +04 ENDCHAR -STARTCHAR 0x2173 -ENCODING 8563 -SWIDTH 780 0 -DWIDTH 13 0 -BBX 12 11 1 0 +STARTCHAR 0x0000 +ENCODING 58880 +SWIDTH 300 0 +DWIDTH 5 0 +BBX 5 15 -1 0 BITMAP -C000 -C000 -0000 -0000 -CE70 -4240 -4240 -4240 -4180 -4180 -E180 +18 +20 +18 +E0 +00 +10 +18 +10 +10 +10 +10 +10 +10 +10 +10 ENDCHAR -STARTCHAR 0x2174 -ENCODING 8564 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 8 7 1 0 +STARTCHAR 0x0001 +ENCODING 58881 +SWIDTH 300 0 +DWIDTH 5 0 +BBX 6 16 -1 0 BITMAP -E7 -24 -24 -24 18 +20 18 +E0 +00 +00 +10 18 +10 +10 +10 +10 +10 +10 +10 +0C ENDCHAR -STARTCHAR 0x2175 -ENCODING 8565 -SWIDTH 780 0 -DWIDTH 13 0 -BBX 12 11 1 0 +STARTCHAR 0x0002 +ENCODING 58882 +SWIDTH 300 0 +DWIDTH 5 0 +BBX 5 15 -1 -5 BITMAP -0060 -0060 -0000 -0000 -E760 -2420 -2420 -2420 -1820 -1820 -1870 +10 +18 +10 +10 +10 +10 +10 +10 +10 +10 +00 +18 +20 +18 +E0 ENDCHAR -STARTCHAR 0x2176 -ENCODING 8566 -SWIDTH 1020 0 -DWIDTH 17 0 -BBX 16 11 1 0 +STARTCHAR 0x0003 +ENCODING 58883 +SWIDTH 300 0 +DWIDTH 5 0 +BBX 6 16 -1 -6 BITMAP -0066 -0066 -0000 -0000 -E766 -2422 -2422 -2422 -1822 -1822 -1877 +10 +18 +10 +10 +10 +10 +10 +10 +10 +0C +00 +00 +18 +20 +18 +E0 ENDCHAR -STARTCHAR 0x2177 -ENCODING 8567 -SWIDTH 1260 0 -DWIDTH 21 0 -BBX 20 11 1 0 +STARTCHAR 0x0004 +ENCODING 58884 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 6 13 2 0 BITMAP -006660 -006660 -000000 -000000 -E76660 -242220 -242220 -242220 -182220 -182220 -187770 +0C +10 +0C +90 +C0 +80 +80 +80 +80 +80 +80 +80 +80 ENDCHAR -STARTCHAR 0x2178 -ENCODING 8568 -SWIDTH 780 0 -DWIDTH 13 0 -BBX 12 11 1 0 +STARTCHAR 0x0005 +ENCODING 58885 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 6 13 2 0 BITMAP -C000 -C000 -0000 -0000 -CE70 -4240 -4180 -4180 -4180 -4240 -EE70 +0C +10 +8C +90 +C0 +80 +80 +80 +80 +80 +80 +80 +60 ENDCHAR -STARTCHAR 0x2179 -ENCODING 8569 +STARTCHAR 0xFE85 +ENCODING 58886 SWIDTH 540 0 DWIDTH 9 0 -BBX 8 7 1 0 -BITMAP -E7 -24 -18 -18 -18 -24 -E7 -ENDCHAR -STARTCHAR 0x217A -ENCODING 8570 -SWIDTH 780 0 -DWIDTH 13 0 -BBX 12 11 1 0 +BBX 9 14 0 -3 BITMAP -0060 -0060 +0180 +0200 +0180 +0200 0000 0000 -E760 -2420 -1820 -1820 -1820 -2420 -E770 +0400 +0A00 +0A00 +0E00 +0200 +0200 +8400 +7800 ENDCHAR -STARTCHAR 0x217B -ENCODING 8571 -SWIDTH 1020 0 -DWIDTH 17 0 -BBX 16 11 1 0 +STARTCHAR 0xFE86 +ENCODING 58887 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 14 1 -4 BITMAP -0066 -0066 +0180 +0200 +0180 +0200 0000 0000 -E766 -2422 -1822 -1822 -1822 -2422 -E777 +0400 +0A00 +0A00 +0780 +0200 +0200 +8400 +7800 ENDCHAR -STARTCHAR 0x217C -ENCODING 8572 -SWIDTH 240 0 -DWIDTH 4 0 -BBX 3 12 1 0 +STARTCHAR 00F0 +ENCODING 58888 +SWIDTH 840 0 +DWIDTH 14 0 +BBX 13 14 1 -2 BITMAP -C0 -40 -40 -40 -40 -40 -40 -40 -40 -40 -40 -E0 -ENDCHAR -STARTCHAR 0x217D -ENCODING 8573 -SWIDTH 360 0 -DWIDTH 6 0 -BBX 5 7 1 0 +0018 +0020 +0018 +0020 +0000 +0000 +01E0 +0200 +4200 +8180 +8040 +8040 +4180 +3E00 +ENDCHAR +STARTCHAR 00F0 +ENCODING 58889 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 13 12 1 -5 BITMAP -70 -88 -80 -80 -80 -88 -70 +0018 +0020 +0018 +0020 +0000 +0000 +41E0 +8200 +8180 +8040 +4180 +3E00 ENDCHAR -STARTCHAR 0x217E -ENCODING 8574 +STARTCHAR 00E4 +ENCODING 58890 SWIDTH 420 0 DWIDTH 7 0 -BBX 6 12 1 0 +BBX 7 11 0 0 BITMAP -18 +06 08 +06 08 +00 +00 +10 08 08 -78 -88 -88 -88 -88 -88 -7C +08 +F0 ENDCHAR -STARTCHAR 0x217F -ENCODING 8575 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 11 7 1 0 +STARTCHAR 00E5 +ENCODING 58891 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 7 10 0 0 BITMAP -FB80 -4440 -4440 -4440 -4440 -4440 -EEE0 +06 +08 +06 +08 +00 +00 +10 +10 +10 +EC ENDCHAR -STARTCHAR 0x2180 -ENCODING 8576 -SWIDTH 1020 0 -DWIDTH 17 0 -BBX 16 11 1 0 +STARTCHAR 0050 +ENCODING 58892 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 13 11 0 -4 BITMAP -1FF8 -2186 -4082 -8081 -8081 -8081 -8081 -8081 -4082 -2186 -1FF8 +0500 +0500 +0008 +4008 +8008 +8008 +C030 +7FC0 +0600 +0900 +0600 ENDCHAR -STARTCHAR 0x2181 -ENCODING 8577 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 10 11 1 0 +STARTCHAR 004F +ENCODING 58893 +SWIDTH 900 0 +DWIDTH 15 0 +BBX 15 11 1 -4 BITMAP -FE00 -2180 -3880 -2440 -2240 -2240 -2240 -2440 -3880 -2180 -FE00 +0500 +0500 +0000 +4000 +8010 +8010 +C06E +7F80 +0600 +0900 +0600 ENDCHAR -STARTCHAR 0x2182 -ENCODING 8578 -SWIDTH 1020 0 -DWIDTH 17 0 -BBX 16 11 1 0 +STARTCHAR 004D +ENCODING 58894 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 11 0 -3 BITMAP -1FF8 -2186 -43E2 -8491 -8889 -8889 -8889 -8491 -43E2 -2186 -1FF8 +28 +28 +00 +10 +08 +08 +08 +F0 +60 +90 +60 ENDCHAR -STARTCHAR 0x216D -ENCODING 8579 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 11 1 0 +STARTCHAR 004E +ENCODING 58895 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 6 10 0 -3 BITMAP -BC00 -C200 -8100 -8080 -0080 -0080 -0080 -8080 -8100 -4200 -3C00 +28 +28 +00 +10 +10 +10 +EC +60 +90 +60 ENDCHAR -STARTCHAR 0x2190 -ENCODING 8592 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 11 5 1 4 +STARTCHAR 0050 +ENCODING 58896 +SWIDTH 840 0 +DWIDTH 14 0 +BBX 13 10 1 -1 BITMAP -2000 -4000 -FFE0 +0500 +0500 +0200 +0200 +0008 +4008 +8008 +8008 +C030 +7FC0 +ENDCHAR +STARTCHAR 004F +ENCODING 58897 +SWIDTH 900 0 +DWIDTH 15 0 +BBX 15 10 1 -1 +BITMAP +0500 +0500 +0200 +0200 +0000 4000 -2000 +8010 +8010 +C06E +7F80 ENDCHAR -STARTCHAR 0x2191 -ENCODING 8593 +STARTCHAR 004D +ENCODING 58898 SWIDTH 360 0 DWIDTH 6 0 -BBX 5 11 1 1 -BITMAP -20 -70 -A8 -20 -20 -20 -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR 0x2192 -ENCODING 8594 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 11 5 1 4 +BBX 5 10 0 0 BITMAP -0080 -0040 -FFE0 -0040 -0080 +28 +28 +10 +10 +00 +10 +08 +08 +08 +F0 ENDCHAR -STARTCHAR 0x2193 -ENCODING 8595 +STARTCHAR 004E +ENCODING 58899 SWIDTH 360 0 DWIDTH 6 0 -BBX 5 11 1 1 +BBX 6 10 0 0 BITMAP -20 -20 -20 -20 -20 -20 -20 -20 -A8 -70 -20 +28 +28 +10 +10 +00 +00 +10 +10 +10 +EC ENDCHAR -STARTCHAR 0x2194 -ENCODING 8596 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 11 5 1 4 +STARTCHAR 0057 +ENCODING 58900 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 10 17 1 -6 BITMAP -2080 -4040 -FFE0 -4040 -2080 +0C00 +1000 +0C00 +1000 +0000 +0000 +7000 +8F00 +3800 +4000 +4000 +8000 +8000 +8000 +4000 +60C0 +1F00 ENDCHAR -STARTCHAR 0x2195 -ENCODING 8597 -SWIDTH 360 0 -DWIDTH 6 0 -BBX 5 11 1 1 +STARTCHAR 0057 +ENCODING 58901 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 10 17 1 -6 BITMAP -20 -70 -A8 -20 -20 -20 -20 -20 -A8 -70 -20 +0600 +0800 +0600 +0800 +0000 +0000 +7000 +8F00 +3A00 +4200 +41C0 +8000 +8000 +8000 +4000 +60C0 +1F00 ENDCHAR -STARTCHAR 0x2196 -ENCODING 8598 +STARTCHAR 0055 +ENCODING 58902 SWIDTH 600 0 DWIDTH 10 0 -BBX 9 9 1 1 +BBX 9 11 0 0 BITMAP -F000 -C000 -A000 -9000 -0800 +0300 0400 -0200 -0100 -0080 +0300 +0400 +0000 +0000 +3800 +4780 +0C00 +1000 +E000 ENDCHAR -STARTCHAR 0x2197 -ENCODING 8599 +STARTCHAR 0056 +ENCODING 58903 SWIDTH 600 0 DWIDTH 10 0 -BBX 9 9 1 1 +BBX 10 11 0 0 BITMAP -0780 -0180 -0280 -0480 +0300 +0400 +0300 +0400 +0000 +0000 +3800 +4780 +0D00 +1100 +E0C0 +ENDCHAR +STARTCHAR 0057 +ENCODING 58904 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 10 18 1 -6 +BITMAP 0800 -1000 -2000 +0800 +0000 +0800 +0800 +0000 +0000 +7000 +8F00 +3800 4000 +4000 +8000 8000 +8000 +4000 +60C0 +1F00 ENDCHAR -STARTCHAR 0x2198 -ENCODING 8600 +STARTCHAR 0057 +ENCODING 58905 SWIDTH 600 0 DWIDTH 10 0 -BBX 9 9 1 1 +BBX 10 18 1 -6 BITMAP +0800 +0800 +0000 +0800 +0800 +0000 +0000 +7000 +8F00 +3A00 +4200 +41C0 +8000 +8000 8000 4000 -2000 -1000 -0800 -0480 -0280 -0180 -0780 +60C0 +1F00 ENDCHAR -STARTCHAR 0x2199 -ENCODING 8601 +STARTCHAR 0055 +ENCODING 58906 SWIDTH 600 0 DWIDTH 10 0 -BBX 9 9 1 1 +BBX 9 12 0 0 BITMAP -0080 -0100 -0200 0400 -0800 -9000 -A000 -C000 -F000 +0400 +0000 +0400 +0400 +0000 +0000 +3800 +4780 +0C00 +1000 +E000 ENDCHAR -STARTCHAR 0x219A -ENCODING 8602 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 11 5 1 4 +STARTCHAR 0056 +ENCODING 58907 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 10 12 0 0 BITMAP -2080 -4100 -FFE0 -4200 -2400 +0400 +0400 +0000 +0400 +0400 +0000 +0000 +3800 +4780 +0D00 +1100 +E0C0 ENDCHAR -STARTCHAR 0x219B -ENCODING 8603 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 11 5 1 4 +STARTCHAR 0057 +ENCODING 58908 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 10 17 1 -6 BITMAP -0480 -0840 -FFE0 -1040 -2080 +0800 +0800 +1400 +1400 +0000 +0000 +7000 +8F00 +3800 +4000 +4000 +8000 +8000 +8000 +4000 +60C0 +1F00 ENDCHAR -STARTCHAR 0x219C -ENCODING 8604 -SWIDTH 780 0 -DWIDTH 13 0 -BBX 12 4 1 5 +STARTCHAR 0057 +ENCODING 58909 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 10 17 1 -6 BITMAP -F000 -C1C0 -A220 -9C10 -ENDCHAR -STARTCHAR 0x219D -ENCODING 8605 -SWIDTH 780 0 -DWIDTH 13 0 -BBX 12 4 1 5 +0800 +0800 +1400 +1400 +0000 +0000 +7000 +8F00 +3A00 +4200 +41C0 +8000 +8000 +8000 +4000 +60C0 +1F00 +ENDCHAR +STARTCHAR 0055 +ENCODING 58910 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 11 0 0 BITMAP -00F0 -3830 -4450 -8390 +0400 +0400 +0A00 +0A00 +0000 +0000 +3800 +4780 +0C00 +1000 +E000 ENDCHAR -STARTCHAR 0x219E -ENCODING 8606 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 11 5 1 4 +STARTCHAR 0056 +ENCODING 58911 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 10 11 0 0 BITMAP -2800 -5000 -FFE0 -5000 -2800 +0400 +0400 +0A00 +0A00 +0000 +0000 +3800 +4780 +0D00 +1100 +E0C0 ENDCHAR -STARTCHAR 0x219F -ENCODING 8607 +STARTCHAR 0065 +ENCODING 58912 SWIDTH 360 0 DWIDTH 6 0 -BBX 5 11 1 1 +BBX 5 9 1 -3 BITMAP -20 -70 -A8 -70 -A8 -20 20 -20 -20 +10 +08 +08 +08 +F0 20 +50 20 ENDCHAR -STARTCHAR 0x21A0 -ENCODING 8608 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 11 5 1 4 +STARTCHAR 0066 +ENCODING 58913 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 7 9 1 -2 BITMAP -0280 -0140 -FFE0 -0140 -0280 +10 +10 +08 +08 +08 +98 +66 +50 +20 ENDCHAR -STARTCHAR 0x21A1 -ENCODING 8609 +STARTCHAR 0065 +ENCODING 58914 SWIDTH 360 0 DWIDTH 6 0 -BBX 5 11 1 1 +BBX 5 10 1 -4 BITMAP -20 20 +10 +08 +08 +08 +F0 +00 +00 20 20 +ENDCHAR +STARTCHAR 0066 +ENCODING 58915 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 7 11 1 -4 +BITMAP +10 +10 +08 +08 +08 +98 +66 +00 +00 20 20 -A8 +ENDCHAR +STARTCHAR 0065 +ENCODING 58916 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 16 1 -4 +BITMAP +40 +40 70 -A8 70 +00 +00 20 -ENDCHAR -STARTCHAR 0x21A2 -ENCODING 8610 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 11 5 1 4 -BITMAP -2060 -4180 -FF00 -4180 -2060 +10 +08 +08 +08 +F0 +00 +00 +20 +20 ENDCHAR -STARTCHAR 0x21A3 -ENCODING 8611 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 11 5 1 4 +STARTCHAR 0066 +ENCODING 58917 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 7 17 1 -4 BITMAP -C080 -3040 -1FE0 -3040 -C080 +40 +40 +70 +70 +00 +00 +10 +10 +08 +08 +08 +98 +66 +00 +00 +20 +20 ENDCHAR -STARTCHAR 0x21A4 -ENCODING 8612 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 11 7 1 3 +STARTCHAR 0065 +ENCODING 58918 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 12 1 0 BITMAP -0020 -2020 -4020 -FFE0 -4020 -2020 -0020 +50 +50 +20 +20 +00 +00 +20 +10 +08 +08 +08 +F0 ENDCHAR -STARTCHAR 0x21A5 -ENCODING 8613 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 11 1 1 +STARTCHAR 0066 +ENCODING 58919 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 7 13 1 0 BITMAP -10 -38 -54 -10 -10 -10 -10 -10 +50 +50 +20 +20 +00 +00 10 10 -FE +08 +08 +08 +98 +66 ENDCHAR -STARTCHAR 0x21A6 -ENCODING 8614 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 11 7 1 3 +STARTCHAR 0065 +ENCODING 58920 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 13 1 0 BITMAP -8000 -8080 -8040 -FFE0 -8040 -8080 -8000 +50 +50 +00 +50 +50 +00 +00 +20 +10 +08 +08 +08 +F0 ENDCHAR -STARTCHAR 0x21A7 -ENCODING 8615 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 11 1 1 +STARTCHAR 0066 +ENCODING 58921 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 7 14 1 0 BITMAP -FE -10 -10 -10 -10 -10 -10 +50 +50 +00 +50 +50 +00 +00 10 -54 -38 10 +08 +08 +08 +98 +66 ENDCHAR -STARTCHAR 0x21A8 -ENCODING 8616 +STARTCHAR 0069 +ENCODING 58922 SWIDTH 480 0 DWIDTH 8 0 -BBX 7 11 1 1 -BITMAP -10 -38 -54 -10 -10 -10 -10 -10 -54 -38 -FE -ENDCHAR -STARTCHAR 0x21A9 -ENCODING 8617 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 11 7 1 4 -BITMAP -01C0 -0020 -2020 -4020 -FFC0 -4000 -2000 -ENDCHAR -STARTCHAR 0x21AA -ENCODING 8618 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 11 7 1 4 -BITMAP -7000 -8000 -8080 -8040 -7FE0 -0040 -0080 -ENDCHAR -STARTCHAR 0x21AB -ENCODING 8619 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 11 7 1 4 -BITMAP -01C0 -0220 -2220 -4220 -FFC0 -4200 -2200 -ENDCHAR -STARTCHAR 0x21AC -ENCODING 8620 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 11 7 1 4 +BBX 7 13 1 -4 BITMAP -7000 -8800 -8880 -8840 -7FE0 -0840 -0880 +22 +14 +08 +00 +00 +08 +08 +04 +04 +04 +0C +18 +F0 ENDCHAR -STARTCHAR 0x21AD -ENCODING 8621 -SWIDTH 780 0 -DWIDTH 13 0 -BBX 12 5 1 4 +STARTCHAR 0069 +ENCODING 58923 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 8 13 1 -5 BITMAP -2640 -4920 -E970 -50A0 -2040 +22 +14 +08 +00 +00 +08 +0C +07 +04 +04 +0C +18 +F0 ENDCHAR -STARTCHAR 0x21AE -ENCODING 8622 -SWIDTH 780 0 -DWIDTH 13 0 -BBX 12 5 1 4 +STARTCHAR 0069 +ENCODING 58924 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 6 9 1 -5 BITMAP -2140 -4220 -FFF0 -4420 -2840 +08 +08 +04 +04 +04 +0C +18 +F4 +0C ENDCHAR -STARTCHAR 0x21AF -ENCODING 8623 -SWIDTH 300 0 -DWIDTH 5 0 -BBX 4 11 1 1 +STARTCHAR 0069 +ENCODING 58925 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 8 9 1 -6 BITMAP -10 -10 -20 -40 -B0 -D0 -20 -A0 -A0 -C0 -F0 +08 +0C +07 +04 +04 +0C +18 +F4 +0C ENDCHAR -STARTCHAR 0x21B0 -ENCODING 8624 +STARTCHAR 0069 +ENCODING 58926 SWIDTH 420 0 DWIDTH 7 0 -BBX 6 11 1 1 +BBX 6 10 1 -6 BITMAP -20 -40 -FC -44 -24 +08 +08 +04 04 04 +0C +18 +F0 +04 +04 +ENDCHAR +STARTCHAR 0069 +ENCODING 58927 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 8 10 1 -7 +BITMAP +08 +0C +07 04 04 +0C +18 +F0 04 04 ENDCHAR -STARTCHAR 0x21B1 -ENCODING 8625 +STARTCHAR 0069 +ENCODING 58928 SWIDTH 420 0 DWIDTH 7 0 -BBX 6 11 1 1 +BBX 6 12 1 -8 BITMAP +08 +08 +04 +04 +04 +0C +18 +F0 +00 +44 +28 10 +ENDCHAR +STARTCHAR 0069 +ENCODING 58929 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 8 12 1 -9 +BITMAP 08 -FC -88 -90 -80 -80 -80 -80 -80 -80 +0C +07 +04 +04 +0C +18 +F0 +00 +44 +28 +10 ENDCHAR -STARTCHAR 0x21B2 -ENCODING 8626 +STARTCHAR 0069 +ENCODING 58930 SWIDTH 420 0 DWIDTH 7 0 -BBX 6 11 1 1 +BBX 6 10 1 -6 BITMAP -04 +08 +08 04 +44 +44 +0C +18 +F0 04 04 +ENDCHAR +STARTCHAR 0069 +ENCODING 58931 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 8 10 1 -7 +BITMAP +08 +0C +07 +44 +44 +0C +18 +F0 04 04 -24 -44 -FC -40 -20 ENDCHAR -STARTCHAR 0x21B3 -ENCODING 8627 +STARTCHAR 0069 +ENCODING 58932 SWIDTH 420 0 DWIDTH 7 0 -BBX 6 11 1 1 +BBX 6 12 1 -4 BITMAP -80 -80 -80 -80 -80 -80 -90 -88 -FC +14 +14 +00 +00 08 -10 +08 +04 +04 +04 +0C +18 +F0 ENDCHAR -STARTCHAR 0x21B4 -ENCODING 8628 +STARTCHAR 0069 +ENCODING 58933 SWIDTH 540 0 DWIDTH 9 0 -BBX 8 6 1 2 +BBX 8 12 1 -5 BITMAP -FC -04 +14 +14 +00 +00 +08 +0C +07 04 -15 -0E 04 +0C +18 +F0 ENDCHAR -STARTCHAR 0x21B5 -ENCODING 8629 +STARTCHAR 0069 +ENCODING 58934 SWIDTH 420 0 DWIDTH 7 0 -BBX 6 8 1 1 +BBX 6 15 1 -4 BITMAP +14 +14 +00 +14 +14 +00 +00 +08 +08 04 04 04 -24 -44 -FC -40 -20 +0C +18 +F0 ENDCHAR -STARTCHAR 0x21B6 -ENCODING 8630 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 11 8 1 1 +STARTCHAR 0069 +ENCODING 58935 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 8 15 1 -5 BITMAP -0F80 -1040 -2020 -2020 -2020 -A820 -7000 -2000 +14 +14 +00 +14 +14 +00 +00 +08 +0C +07 +04 +04 +0C +18 +F0 ENDCHAR -STARTCHAR 0x21B7 -ENCODING 8631 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 11 8 1 1 +STARTCHAR 0072 +ENCODING 58936 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 15 12 1 -5 BITMAP -3E00 -4100 -8080 +0010 +0010 +0002 +0002 +0012 +0112 +40EC 8080 8080 -82A0 -01C0 -0080 +8088 +4308 +3C00 ENDCHAR -STARTCHAR 0x21B8 -ENCODING 8632 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 11 1 1 +STARTCHAR 0071 +ENCODING 58937 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 17 11 1 -5 BITMAP -FF80 -0000 -F000 -C000 -A000 -9000 -0800 -0400 -0200 +001000 +001000 +000000 +000200 +011200 +40ED80 +808000 +808000 +808800 +430800 +3C0000 +ENDCHAR +STARTCHAR 006F +ENCODING 58938 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 11 11 0 -4 +BITMAP +0100 0100 +0000 +0020 +0120 +1120 +EEC0 +0000 +0000 +0080 0080 ENDCHAR -STARTCHAR 0x21B9 -ENCODING 8633 +STARTCHAR 0070 +ENCODING 58939 SWIDTH 780 0 DWIDTH 13 0 -BBX 12 13 1 0 +BBX 13 11 0 -4 BITMAP -8000 -9000 -A000 -FFF0 -A000 -9000 -8010 -0090 -0050 -FFF0 -0050 -0090 -0010 +0100 +0100 +0000 +0000 +0100 +1120 +EED8 +0000 +0000 +0080 +0080 ENDCHAR -STARTCHAR 0x21BA -ENCODING 8634 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 10 7 1 2 +STARTCHAR 0072 +ENCODING 58940 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 15 10 1 -6 BITMAP -03C0 -4300 -8280 -8280 +0002 +0012 +0112 +40EC 8080 -4100 -3E00 +8080 +8094 +4314 +3C08 +0008 ENDCHAR -STARTCHAR 0x21BB -ENCODING 8635 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 10 7 1 2 +STARTCHAR 0071 +ENCODING 58941 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 17 9 1 -6 BITMAP -F000 -3080 -5040 -5040 -4040 -2080 -1F00 +000200 +011200 +40ED80 +808000 +808000 +809400 +431400 +3C0800 +000800 ENDCHAR -STARTCHAR 0x21BC -ENCODING 8636 +STARTCHAR 006F +ENCODING 58942 SWIDTH 720 0 DWIDTH 12 0 -BBX 11 3 1 6 +BBX 11 10 0 -6 BITMAP -2000 -4000 -FFE0 +0020 +0120 +1120 +EEC0 +0000 +0000 +0280 +0280 +0100 +0100 ENDCHAR -STARTCHAR 0x21BD -ENCODING 8637 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 11 3 1 6 +STARTCHAR 0070 +ENCODING 58943 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 13 9 0 -6 BITMAP -FFE0 -4000 -2000 +0100 +1120 +EED8 +0000 +0000 +0280 +0280 +0100 +0100 ENDCHAR -STARTCHAR 0x21BE -ENCODING 8638 -SWIDTH 240 0 -DWIDTH 4 0 -BBX 3 11 1 1 +STARTCHAR 0072 +ENCODING 58944 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 15 15 1 -6 BITMAP -80 -C0 -A0 -80 -80 -80 -80 -80 -80 -80 -80 +0010 +0010 +0028 +0028 +0000 +0002 +0012 +0112 +40EC +8080 +8080 +8094 +4314 +3C08 +0008 ENDCHAR -STARTCHAR 0x21BF -ENCODING 8639 -SWIDTH 240 0 -DWIDTH 4 0 -BBX 3 11 1 1 +STARTCHAR 0071 +ENCODING 58945 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 17 14 1 -6 BITMAP -20 -60 -A0 -20 -20 -20 -20 -20 -20 -20 -20 +001000 +001000 +002800 +002800 +000000 +000200 +011200 +40ED80 +808000 +808000 +809400 +431400 +3C0800 +000800 ENDCHAR -STARTCHAR 0x21C0 -ENCODING 8640 +STARTCHAR 006F +ENCODING 58946 SWIDTH 720 0 DWIDTH 12 0 -BBX 11 3 1 6 +BBX 11 15 0 -6 BITMAP -0080 -0040 -FFE0 +0100 +0100 +0280 +0280 +0000 +0020 +0120 +1120 +EEC0 +0000 +0000 +0280 +0280 +0100 +0100 ENDCHAR -STARTCHAR 0x21C1 -ENCODING 8641 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 11 3 1 6 +STARTCHAR 0070 +ENCODING 58947 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 13 15 0 -6 BITMAP -FFE0 -0040 -0080 +0100 +0100 +0280 +0280 +0000 +0000 +0100 +1120 +EED8 +0000 +0000 +0280 +0280 +0100 +0100 ENDCHAR -STARTCHAR 0x21C2 -ENCODING 8642 -SWIDTH 240 0 -DWIDTH 4 0 -BBX 3 11 1 1 +STARTCHAR 0079 +ENCODING 58948 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 17 10 1 -5 BITMAP -80 -80 -80 -80 -80 -80 -80 -80 -A0 -C0 -80 +000700 +000880 +001080 +012700 +40F800 +80C000 +808000 +808A00 +430A00 +3C0000 ENDCHAR -STARTCHAR 0x21C3 -ENCODING 8643 -SWIDTH 240 0 -DWIDTH 4 0 -BBX 3 11 1 1 +STARTCHAR 0079 +ENCODING 58949 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 18 10 1 -5 BITMAP -20 -20 -20 -20 -20 -20 -20 -20 -A0 -60 -20 +000700 +000880 +001080 +012100 +40FFC0 +80C000 +808000 +808A00 +430A00 +3C0000 ENDCHAR -STARTCHAR 0x21C4 -ENCODING 8644 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 11 11 1 1 +STARTCHAR 0077 +ENCODING 58950 +SWIDTH 840 0 +DWIDTH 14 0 +BBX 13 9 0 -4 BITMAP -0080 -0040 -FFE0 -0040 -0080 +0070 +0088 +0108 +2270 +DF80 +0400 0000 -2000 -4000 -FFE0 -4000 -2000 -ENDCHAR -STARTCHAR 0x21C5 -ENCODING 8645 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 11 11 1 1 -BITMAP -2080 -7080 -A880 -2080 -2080 -2080 -2080 -2080 -22A0 -21C0 -2080 +0140 +0140 ENDCHAR -STARTCHAR 0x21C6 -ENCODING 8646 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 11 11 1 1 +STARTCHAR 0078 +ENCODING 58951 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 13 9 0 -4 BITMAP -2000 -4000 -FFE0 -4000 -2000 +00E0 +0110 +0210 +2420 +DFF8 +0800 0000 -0080 -0040 -FFE0 -0040 -0080 +0280 +0280 ENDCHAR -STARTCHAR 0x21C7 -ENCODING 8647 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 11 11 1 1 +STARTCHAR 0079 +ENCODING 58952 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 17 15 1 -5 BITMAP -2000 -4000 -FFE0 -4000 -2000 -0000 -2000 -4000 -FFE0 -4000 -2000 +001000 +001000 +002800 +002800 +000000 +000700 +000880 +001080 +012700 +40F800 +80C000 +808000 +808000 +430000 +3C0000 ENDCHAR -STARTCHAR 0x21C8 -ENCODING 8648 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 11 11 1 1 +STARTCHAR 0079 +ENCODING 58953 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 18 15 1 -5 BITMAP -2080 -71C0 -AAA0 -2080 -2080 -2080 -2080 -2080 -2080 -2080 -2080 +001000 +001000 +002800 +002800 +000000 +000700 +000880 +001080 +012100 +40FFC0 +80C000 +808000 +808000 +430000 +3C0000 ENDCHAR -STARTCHAR 0x21C9 -ENCODING 8649 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 11 11 1 1 +STARTCHAR 0077 +ENCODING 58954 +SWIDTH 840 0 +DWIDTH 14 0 +BBX 13 11 0 -1 BITMAP -0080 -0040 -FFE0 -0040 -0080 +0100 +0100 +0280 +0280 0000 -0080 -0040 -FFE0 -0040 -0080 -ENDCHAR -STARTCHAR 0x21CA -ENCODING 8650 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 11 11 1 1 -BITMAP -2080 -2080 -2080 -2080 -2080 -2080 -2080 -2080 -AAA0 -71C0 -2080 +0070 +0088 +0108 +2270 +DF80 +0400 ENDCHAR -STARTCHAR 0x21CB -ENCODING 8651 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 11 8 1 3 +STARTCHAR 0078 +ENCODING 58955 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 13 11 0 -1 BITMAP -2000 -4000 -FFE0 -0000 +0200 +0200 +0500 +0500 0000 -FFE0 -0040 -0080 +00E0 +0110 +0210 +2420 +DFF8 +0800 ENDCHAR -STARTCHAR 0x21CC -ENCODING 8652 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 11 8 1 3 +STARTCHAR 00BC +ENCODING 58956 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 8 10 1 0 BITMAP -0080 -0040 -FFE0 -0000 -0000 -FFE0 -4000 -2000 +22 +32 +25 +25 +20 +26 +29 +31 +26 +F8 ENDCHAR -STARTCHAR 0x21CD -ENCODING 8653 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 11 7 1 3 +STARTCHAR 00BD +ENCODING 58957 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 10 10 1 0 BITMAP -1080 -2080 -7FE0 -8100 -7FE0 2200 -1200 +3200 +2500 +2500 +2000 +2600 +2900 +3100 +2200 +FFC0 ENDCHAR -STARTCHAR 0x21CE -ENCODING 8654 -SWIDTH 840 0 -DWIDTH 14 0 -BBX 13 7 1 3 +STARTCHAR 00BC +ENCODING 58958 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 8 10 0 0 BITMAP -1140 -2120 -7FF0 -8208 -7FF0 -2420 -1440 +22 +32 +25 +25 +20 +26 +29 +31 +26 +F8 ENDCHAR -STARTCHAR 0x21CF -ENCODING 8655 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 11 7 1 3 +STARTCHAR 00BD +ENCODING 58959 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 10 10 0 0 BITMAP -0900 -0880 -FFC0 -1020 +2200 +3200 +2500 +2500 +2000 +2600 +2900 +3100 +2200 FFC0 -2080 -2100 ENDCHAR -STARTCHAR 0x21D0 -ENCODING 8656 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 11 7 1 3 +STARTCHAR 00CB +ENCODING 58960 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 18 1 -7 BITMAP 1000 -2000 -7FE0 +1000 +2800 +2800 +0000 +0000 +3800 +4000 8000 -7FE0 -2000 +4C00 +3000 +4000 +4000 +8000 +8000 +8000 +4180 +3E00 +ENDCHAR +STARTCHAR 00CA +ENCODING 58961 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 9 17 1 -6 +BITMAP +1000 +1000 +2800 +2800 +0000 +0000 +3800 +6C00 1000 +3800 +4780 +4000 +8000 +8000 +8000 +4180 +3E00 ENDCHAR -STARTCHAR 0x21D1 -ENCODING 8657 +STARTCHAR 00C8 +ENCODING 58962 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 7 11 0 0 +BITMAP +08 +08 +14 +14 +00 +00 +1C +20 +40 +26 +F8 +ENDCHAR +STARTCHAR 00C5 +ENCODING 58963 SWIDTH 480 0 DWIDTH 8 0 -BBX 7 11 1 1 +BBX 8 11 0 0 BITMAP -10 -28 -6C -AA -28 -28 -28 -28 -28 -28 -28 +08 +08 +14 +14 +00 +00 +1C +36 +08 +1C +E3 ENDCHAR -STARTCHAR 0x21D2 -ENCODING 8658 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 11 7 1 3 +STARTCHAR 00CF +ENCODING 58964 +SWIDTH 900 0 +DWIDTH 15 0 +BBX 14 8 1 0 BITMAP -0100 -0080 -FFC0 -0020 -FFC0 -0080 -0100 +0018 +002C +0024 +802C +8014 +8004 +4038 +3FC0 ENDCHAR -STARTCHAR 0x21D3 -ENCODING 8659 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 11 1 1 +STARTCHAR 00CF +ENCODING 58965 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 16 8 1 -1 BITMAP -28 -28 -28 -28 -28 -28 -28 -AA -6C -28 -10 +0018 +002C +0024 +802C +8014 +8004 +403B +3FC0 ENDCHAR -STARTCHAR 0x21D4 -ENCODING 8660 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 12 7 1 3 +STARTCHAR 00CC +ENCODING 58966 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 7 0 0 BITMAP -1080 -2040 -7FE0 -8010 -7FE0 -2040 -1080 +30 +58 +48 +58 +28 +08 +F0 ENDCHAR -STARTCHAR 0x21D5 -ENCODING 8661 +STARTCHAR 00CC +ENCODING 58967 SWIDTH 480 0 DWIDTH 8 0 -BBX 7 12 1 0 +BBX 8 6 0 0 BITMAP -10 -28 -6C -AA -28 -28 -28 -28 -AA -6C +18 +24 +24 28 10 +EF ENDCHAR -STARTCHAR 0x21D6 -ENCODING 8662 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 10 10 1 1 +STARTCHAR 00CF +ENCODING 58968 +SWIDTH 900 0 +DWIDTH 15 0 +BBX 14 12 1 -4 BITMAP -F800 -9000 -8800 -C400 -A200 -1100 -0880 -0440 -0200 +0018 +002C +0024 +802C +8014 +8004 +4038 +3FC0 +0000 +0000 0100 -ENDCHAR -STARTCHAR 0x21D7 -ENCODING 8663 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 10 10 1 1 -BITMAP -07C0 -0240 -0440 -08C0 -1140 -2200 -4400 -8800 -1000 -2000 +0100 ENDCHAR -STARTCHAR 0x21D8 -ENCODING 8664 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 10 10 1 1 +STARTCHAR 00CF +ENCODING 58969 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 16 12 1 -5 BITMAP -2000 -1000 -8800 -4400 -2200 -1140 -08C0 -0440 -0240 -07C0 +0018 +002C +0024 +802C +8014 +8004 +403B +3FC0 +0000 +0000 +0100 +0100 ENDCHAR -STARTCHAR 0x21D9 -ENCODING 8665 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 10 10 1 1 +STARTCHAR 00CC +ENCODING 58970 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 11 0 -4 BITMAP -0100 -0200 -0440 -0880 -1100 -A200 -C400 -8800 -9000 -F800 +30 +58 +48 +58 +28 +08 +F0 +00 +00 +80 +80 ENDCHAR -STARTCHAR 0x21DA -ENCODING 8666 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 11 7 1 3 +STARTCHAR 00CC +ENCODING 58971 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 8 10 0 -4 BITMAP -1000 -3FE0 -4000 -FFE0 -4000 -3FE0 -1000 +18 +24 +24 +28 +10 +EF +00 +00 +40 +40 ENDCHAR -STARTCHAR 0x21DB -ENCODING 8667 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 11 7 1 3 +STARTCHAR 00CF +ENCODING 58972 +SWIDTH 900 0 +DWIDTH 15 0 +BBX 14 16 1 -4 BITMAP +0010 +0010 +0000 +0000 +0018 +002C +0024 +802C +8014 +8004 +4038 +3FC0 +0000 +0000 0100 -FF80 -0040 -FFE0 -0040 -FF80 0100 -ENDCHAR -STARTCHAR 0x21DC -ENCODING 8668 -SWIDTH 780 0 -DWIDTH 13 0 -BBX 12 5 1 4 -BITMAP -2000 -4880 -F550 -4220 -2000 ENDCHAR -STARTCHAR 0x21DD -ENCODING 8669 -SWIDTH 780 0 -DWIDTH 13 0 -BBX 12 5 1 4 +STARTCHAR 00CF +ENCODING 58973 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 16 16 1 -5 BITMAP -0040 -1120 -AAF0 -4420 -0040 +0010 +0010 +0000 +0000 +0018 +002C +0024 +802C +8014 +8004 +403B +3FC0 +0000 +0000 +0100 +0100 ENDCHAR -STARTCHAR 0x21DE -ENCODING 8670 +STARTCHAR 00CC +ENCODING 58974 SWIDTH 360 0 DWIDTH 6 0 -BBX 5 11 1 1 +BBX 5 15 0 -4 BITMAP 20 -70 -A8 -20 -20 -F8 -20 -F8 -20 20 -20 +00 +00 +30 +58 +48 +58 +28 +08 +F0 +00 +00 +80 +80 ENDCHAR -STARTCHAR 0x21DF -ENCODING 8671 +STARTCHAR 00CC +ENCODING 58975 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 8 14 0 -4 +BITMAP +08 +08 +00 +00 +18 +24 +24 +28 +10 +EF +00 +00 +40 +40 +ENDCHAR +STARTCHAR 00CF +ENCODING 58976 +SWIDTH 900 0 +DWIDTH 15 0 +BBX 14 13 1 -5 +BITMAP +0018 +002C +0024 +802C +8014 +8004 +4038 +3FC0 +0000 +0028 +0028 +0010 +0010 +ENDCHAR +STARTCHAR 00CF +ENCODING 58977 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 16 13 1 -6 +BITMAP +0018 +002C +0024 +802C +8014 +8004 +403B +3FC0 +0000 +0028 +0028 +0010 +0010 +ENDCHAR +STARTCHAR 00CC +ENCODING 58978 SWIDTH 360 0 DWIDTH 6 0 -BBX 5 11 1 1 +BBX 5 13 0 -6 BITMAP +30 +58 +48 +58 +28 +08 +F0 +00 +00 +50 +50 20 20 -20 -F8 -20 -F8 -20 -20 -A8 -70 -20 ENDCHAR -STARTCHAR 0x21E0 -ENCODING 8672 +STARTCHAR 00CC +ENCODING 58979 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 8 12 0 -6 +BITMAP +18 +24 +24 +28 +10 +EF +00 +00 +28 +28 +10 +10 +ENDCHAR +STARTCHAR 00D2 +ENCODING 58980 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 14 1 -3 +BITMAP +0200 +0200 +0000 +0000 +0300 +0580 +0480 +0480 +4380 +8080 +8080 +8100 +4200 +3C00 +ENDCHAR +STARTCHAR 00D2 +ENCODING 58981 SWIDTH 720 0 DWIDTH 12 0 -BBX 11 5 1 4 +BBX 11 14 1 -5 BITMAP -2000 -4000 -EEE0 -4000 -2000 +0200 +0200 +0000 +0000 +0300 +0580 +0480 +0480 +43E0 +8080 +8080 +8100 +4200 +3C00 ENDCHAR -STARTCHAR 0x21E1 -ENCODING 8673 -SWIDTH 360 0 -DWIDTH 6 0 -BBX 5 11 1 1 +STARTCHAR 00CC +ENCODING 58982 +SWIDTH 240 0 +DWIDTH 4 0 +BBX 5 11 0 0 BITMAP 20 -70 -A8 -00 -20 20 -20 00 -20 -20 -20 +00 +30 +58 +48 +58 +28 +08 +F0 ENDCHAR -STARTCHAR 0x21E2 -ENCODING 8674 +STARTCHAR 00CC +ENCODING 58983 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 8 10 0 0 +BITMAP +10 +10 +00 +00 +18 +24 +24 +28 +10 +EF +ENDCHAR +STARTCHAR 00D2 +ENCODING 58984 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 16 1 -3 +BITMAP +0200 +0200 +0500 +0500 +0000 +0000 +0300 +0580 +0480 +0480 +4380 +8080 +8080 +8100 +4200 +3C00 +ENDCHAR +STARTCHAR 00D2 +ENCODING 58985 SWIDTH 720 0 DWIDTH 12 0 -BBX 11 5 1 4 +BBX 11 16 1 -5 BITMAP -0080 -0040 -EEE0 -0040 -0080 +0200 +0200 +0500 +0500 +0000 +0000 +0300 +0580 +0480 +0480 +43E0 +8080 +8080 +8100 +4200 +3C00 ENDCHAR -STARTCHAR 0x21E3 -ENCODING 8675 -SWIDTH 360 0 -DWIDTH 6 0 -BBX 5 11 1 1 +STARTCHAR 00CC +ENCODING 58986 +SWIDTH 240 0 +DWIDTH 4 0 +BBX 5 13 0 0 BITMAP 20 20 -20 +50 +50 00 -20 -20 -20 00 -A8 -70 -20 +30 +58 +48 +58 +28 +08 +F0 ENDCHAR -STARTCHAR 0x21E4 -ENCODING 8676 -SWIDTH 780 0 -DWIDTH 13 0 -BBX 12 7 1 3 +STARTCHAR 00CC +ENCODING 58987 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 8 12 0 0 BITMAP -8000 -9000 -A000 -FFF0 -A000 -9000 -8000 +10 +10 +28 +28 +00 +00 +18 +24 +24 +28 +10 +EF ENDCHAR -STARTCHAR 0x21E5 -ENCODING 8677 -SWIDTH 780 0 -DWIDTH 13 0 -BBX 12 7 1 3 +STARTCHAR 0x006C +ENCODING 58988 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 14 8 0 0 BITMAP -0010 -0090 -0050 -FFF0 -0050 -0090 -0010 +0600 +1800 +2000 +2000 +1FF8 +0004 +8004 +7FF8 ENDCHAR -STARTCHAR 0x21E6 -ENCODING 8678 +STARTCHAR 0x006D +ENCODING 58989 SWIDTH 1020 0 DWIDTH 17 0 -BBX 16 9 1 2 +BBX 16 9 1 0 BITMAP -0800 -1800 -2FFF -4001 -8001 -4001 -2FFF +0180 +0600 1800 -0800 -ENDCHAR -STARTCHAR 0x21E7 -ENCODING 8679 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 16 1 1 -BITMAP -0800 -1400 -2200 -4100 -E380 -2200 -2200 -2200 -2200 -2200 -2200 -2200 -2200 -2200 -2200 -3E00 +2000 +2000 +1FF8 +0004 +8004 +7FFB ENDCHAR -STARTCHAR 0x21E8 -ENCODING 8680 -SWIDTH 1020 0 -DWIDTH 17 0 -BBX 16 9 1 2 +STARTCHAR 0x006E +ENCODING 58990 +SWIDTH 900 0 +DWIDTH 15 0 +BBX 14 8 0 0 BITMAP -0010 -0018 -FFF4 -8002 -8001 -8002 -FFF4 -0018 -0010 +0600 +1800 +2000 +2000 +1FF8 +0004 +0004 +FFF8 ENDCHAR -STARTCHAR 0x21E9 -ENCODING 8681 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 16 1 1 +STARTCHAR 0x006F +ENCODING 58991 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 16 8 0 0 BITMAP -3E00 -2200 -2200 -2200 -2200 -2200 -2200 -2200 -2200 -2200 -2200 -E380 -4100 -2200 -1400 -0800 +0600 +1800 +2000 +2000 +1FF8 +0004 +0004 +FFFB ENDCHAR -STARTCHAR 0x21EA -ENCODING 8682 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 17 1 0 +STARTCHAR 00D7 +ENCODING 58992 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 15 14 1 -1 BITMAP -0800 -1400 -2200 -4100 -E380 -2200 -2200 -2200 -2200 -2200 -2200 -3E00 -0000 -3E00 -2200 -2200 -3E00 +0006 +0018 +0068 +01A8 +0210 +0200 +0100 +00C0 +0020 +4010 +8008 +8008 +C030 +7FC0 ENDCHAR -STARTCHAR 0x21E7 -ENCODING 8683 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 16 1 1 +STARTCHAR 00D7 +ENCODING 58993 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 16 14 1 -1 BITMAP -0800 -1400 -2200 -4100 -E380 -2200 -2200 -2200 -2200 -2200 -2200 -2200 -2200 -E380 -8080 -FF80 +0006 +0018 +0068 +01A8 +0210 +0200 +0100 +00C0 +0020 +4010 +8008 +8008 +C037 +7FC0 ENDCHAR -STARTCHAR 0x21E7 -ENCODING 8684 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 16 1 1 +STARTCHAR 00D4 +ENCODING 58994 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 10 11 0 0 BITMAP -0800 -1400 -3E00 -4100 -E380 -2200 -2200 -2200 -2200 -2200 -2200 -2200 -2200 -E380 -8080 -FF80 +00C0 +0300 +0D00 +3500 +4200 +4000 +2000 +1800 +0400 +0400 +F800 ENDCHAR -STARTCHAR 0x21E7 -ENCODING 8685 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 16 1 1 +STARTCHAR 00D5 +ENCODING 58995 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 11 11 0 0 BITMAP -0800 -1C00 -2A00 -4900 -EB80 -2A00 -2A00 -2A00 -2A00 -2A00 -2A00 -2A00 -2A00 -EB80 -8880 -FF80 +00C0 +0300 +0D00 +3500 +4200 +4000 +2000 +1800 +0400 +0700 +F8E0 ENDCHAR -STARTCHAR 0x21E7 -ENCODING 8686 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 16 1 1 +STARTCHAR 0xFED9 +ENCODING 58996 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 9 13 1 0 BITMAP 0800 -1400 -2200 -4900 -F780 -2200 -4100 -E380 -2200 -2200 -2200 -2200 -2200 -2200 -2200 -3E00 -ENDCHAR -STARTCHAR 0x21E7 -ENCODING 8687 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 16 1 1 -BITMAP 0800 -1400 -2200 -4900 -F780 -2200 -4100 -E380 -2200 -2200 -2200 -2200 -2200 -E380 -8080 -FF80 +0000 +0100 +0180 +0100 +0900 +1900 +0900 +1900 +0100 +0100 +FE00 ENDCHAR -STARTCHAR 0x21E8 -ENCODING 8688 -SWIDTH 1020 0 -DWIDTH 17 0 -BBX 16 9 1 2 +STARTCHAR 0xFEDA +ENCODING 58997 +SWIDTH 900 0 +DWIDTH 15 0 +BBX 14 14 1 -1 BITMAP -E010 -A018 -BFF4 -8002 -8001 -8002 -BFF4 -A018 -E010 +0200 +0200 +0000 +0010 +0018 +0010 +0210 +0610 +0210 +4610 +8010 +8010 +C06C +7F80 ENDCHAR -STARTCHAR 0x2196 -ENCODING 8689 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 11 11 1 1 -BITMAP -FFE0 -8000 -BC00 -B000 -A800 -A400 -8200 -8100 -8080 -8040 -8020 +STARTCHAR 00D4 +ENCODING 58998 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 10 13 0 0 +BITMAP +1000 +1000 +00C0 +0300 +0C00 +3000 +4000 +4000 +2000 +1800 +0400 +0400 +F800 ENDCHAR -STARTCHAR 0x2196 -ENCODING 8690 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 11 11 1 1 +STARTCHAR 00D5 +ENCODING 58999 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 11 13 0 0 BITMAP -8020 -4020 -2020 -1020 -0820 -04A0 -02A0 -01A0 -07A0 -0020 -FFE0 +1000 +1000 +00C0 +0300 +0C00 +3000 +4000 +4000 +2000 +1800 +0400 +0700 +F8E0 ENDCHAR -STARTCHAR 0x21E9 -ENCODING 8691 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 16 1 1 +STARTCHAR 0xFED9 +ENCODING 59000 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 9 16 1 -6 BITMAP -0800 -1400 -2200 -4100 -E380 -2200 -2200 -2200 -2200 -2200 -2200 -E380 -4100 -2200 -1400 -0800 +0100 +0180 +0100 +0900 +1900 +0900 +1900 +0100 +0100 +FE00 +0000 +0000 +2800 +2800 +1000 +1000 ENDCHAR -STARTCHAR 0x2200 -ENCODING 8704 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 11 11 1 0 +STARTCHAR 0xFEDA +ENCODING 59001 +SWIDTH 900 0 +DWIDTH 15 0 +BBX 14 20 1 -7 BITMAP -8020 -8020 -4040 -4040 -3F80 -2080 -1100 -1100 +0200 +0200 +0000 +0010 +0018 +0010 +0210 +0610 +0210 +4610 +8010 +8010 +C06C +7F80 +0000 +0000 0A00 0A00 0400 -ENDCHAR -STARTCHAR 0x2201 -ENCODING 8705 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 6 11 1 0 -BITMAP -78 -84 -84 -80 -80 -80 -80 -80 -84 -84 -78 +0400 ENDCHAR -STARTCHAR 0x2202 -ENCODING 8706 -SWIDTH 360 0 -DWIDTH 6 0 -BBX 5 11 1 0 +STARTCHAR 00D4 +ENCODING 59002 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 10 19 0 -6 BITMAP -60 -10 -10 -08 -38 -48 -88 -88 -88 -90 -60 +1000 +1000 +00C0 +0300 +0C00 +3000 +4000 +4000 +2000 +1800 +0400 +0400 +F800 +0000 +0000 +5000 +5000 +2000 +2000 ENDCHAR -STARTCHAR 0x2203 -ENCODING 8707 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 8 11 1 0 +STARTCHAR 00D5 +ENCODING 59003 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 11 19 0 -6 BITMAP -FF -01 -01 -01 -01 -FF -01 -01 -01 -01 -FF +1000 +1000 +00C0 +0300 +0C00 +3000 +4000 +4000 +2000 +1800 +0400 +0700 +F8E0 +0000 +0000 +5000 +5000 +2000 +2000 ENDCHAR -STARTCHAR 0x2204 -ENCODING 8708 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 8 15 1 -2 +STARTCHAR 00D7 +ENCODING 59004 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 15 17 1 -1 BITMAP -02 -02 -FF -05 -05 -05 -09 -FF -09 -09 -11 -11 -FF -20 -20 +0004 +0018 +0060 +0186 +0218 +0068 +01A8 +0210 +0200 +0100 +00C0 +0020 +4010 +8008 +8008 +C030 +7FC0 ENDCHAR -STARTCHAR 0x2205 -ENCODING 8709 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 11 11 1 0 +STARTCHAR 00D7 +ENCODING 59005 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 16 17 1 -1 BITMAP -1F20 -20C0 -40C0 -8120 -8220 -8420 -8820 -9020 -6040 -6080 -9F00 +0004 +0018 +0060 +0186 +0218 +0068 +01A8 +0210 +0200 +0100 +00C0 +0020 +4010 +8008 +8008 +C037 +7FC0 ENDCHAR -STARTCHAR 0x2206 -ENCODING 8710 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 11 11 1 0 +STARTCHAR 00D4 +ENCODING 59006 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 10 14 0 0 BITMAP +0080 +0300 +0C00 +30C0 +4300 +0D00 +3500 +4200 +4000 +2000 +1800 0400 -0E00 -0E00 -1300 -1300 -2180 -2180 -40C0 -40C0 -8060 -FFE0 -ENDCHAR -STARTCHAR 0x2207 -ENCODING 8711 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 11 11 1 0 -BITMAP -FFE0 -8060 -40C0 -40C0 -2180 -2180 -1300 -1300 -0E00 -0E00 0400 +F800 ENDCHAR -STARTCHAR 0x2208 -ENCODING 8712 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 8 11 1 0 +STARTCHAR 00D5 +ENCODING 59007 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 11 14 0 0 BITMAP -1F -20 -40 -80 -80 -FF -80 -80 -40 -20 -1F +0080 +0300 +0C00 +30C0 +4300 +0D00 +3500 +4200 +4000 +2000 +1800 +0400 +0700 +F8E0 ENDCHAR -STARTCHAR 0x2209 -ENCODING 8713 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 8 15 1 -2 +STARTCHAR 00D7 +ENCODING 59008 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 15 21 1 -5 BITMAP -02 -02 -1F -24 -44 -84 -88 -FF -88 -88 -50 -30 -1F -20 -20 +0004 +0018 +0060 +0186 +0218 +0060 +0180 +0200 +0200 +0100 +00C0 +0020 +4010 +8008 +8008 +C030 +7FC0 +0000 +0000 +0500 +0500 ENDCHAR -STARTCHAR 0x220A -ENCODING 8714 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 7 1 2 +STARTCHAR 00D7 +ENCODING 59009 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 16 21 1 -5 BITMAP -3E -40 -80 -FE -80 -40 -3E +0004 +0018 +0060 +0186 +0218 +0060 +0180 +0200 +0200 +0100 +00C0 +0020 +4010 +8008 +8008 +C037 +7FC0 +0000 +0000 +0500 +0500 ENDCHAR -STARTCHAR 0x220B -ENCODING 8715 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 8 11 1 0 +STARTCHAR 00D4 +ENCODING 59010 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 10 18 0 -4 BITMAP -F8 -04 -02 -01 -01 -FF -01 -01 -02 -04 -F8 +0080 +0300 +0C00 +30C0 +4300 +0C00 +3000 +4000 +4000 +2000 +1800 +0400 +0400 +F800 +0000 +0000 +5000 +5000 ENDCHAR -STARTCHAR 0x220C -ENCODING 8716 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 8 15 1 -2 +STARTCHAR 00D5 +ENCODING 59011 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 11 18 0 -4 BITMAP -40 -40 -F8 -24 -22 -21 -11 -FF -11 -11 -0A -0C -F8 -04 -04 +0080 +0300 +0C00 +30C0 +4300 +0C00 +3000 +4000 +4000 +2000 +1800 +0400 +0700 +F8E0 +0000 +0000 +5000 +5000 ENDCHAR -STARTCHAR 0x220D -ENCODING 8717 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 7 1 2 +STARTCHAR 00D7 +ENCODING 59012 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 15 20 1 -1 BITMAP -F8 -04 -02 -FE -02 -04 -F8 +0100 +0100 +0040 +0144 +0118 +0060 +0186 +0218 +0060 +0180 +0200 +0200 +0100 +00C0 +0020 +4010 +8008 +8008 +C030 +7FC0 ENDCHAR -STARTCHAR 0x220E -ENCODING 8718 -SWIDTH 360 0 -DWIDTH 6 0 -BBX 5 9 1 1 +STARTCHAR 00D7 +ENCODING 59013 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 16 20 1 -1 BITMAP -F8 -F8 -F8 -F8 -F8 -F8 -F8 -F8 -F8 +0100 +0100 +0040 +0144 +0118 +0060 +0186 +0218 +0060 +0180 +0200 +0200 +0100 +00C0 +0020 +4010 +8008 +8008 +C037 +7FC0 ENDCHAR -STARTCHAR 0x220F -ENCODING 8719 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 11 11 0 0 +STARTCHAR 00D4 +ENCODING 59014 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 10 17 0 0 BITMAP -FFE0 -2080 -2080 -2080 -2080 -2080 -2080 -2080 -2080 -2080 -FBE0 +2000 +2000 +0800 +2880 +2300 +0C00 +30C0 +4300 +0C00 +3000 +4000 +4000 +2000 +1800 +0400 +0400 +F800 ENDCHAR -STARTCHAR 0x2210 -ENCODING 8720 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 11 11 0 0 +STARTCHAR 00D5 +ENCODING 59015 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 11 17 0 0 BITMAP -FBE0 -2080 -2080 -2080 -2080 -2080 -2080 -2080 -2080 -2080 -FFE0 +2000 +2000 +0800 +2880 +2300 +0C00 +30C0 +4300 +0C00 +3000 +4000 +4000 +2000 +1800 +0400 +0700 +F8E0 ENDCHAR -STARTCHAR 0x2211 -ENCODING 8721 +STARTCHAR 00DE +ENCODING 59016 SWIDTH 600 0 DWIDTH 10 0 -BBX 9 11 1 0 +BBX 9 17 1 -2 BITMAP -FF80 -4180 -2080 -2080 -1000 -1800 -1000 -2080 -2080 -4180 -FF80 +0880 +0500 +0200 +0000 +0000 +0200 +0300 +0200 +0200 +0200 +0200 +0200 +4200 +8200 +8200 +8400 +7800 ENDCHAR -STARTCHAR 0x2212 -ENCODING 8722 +STARTCHAR 00DE +ENCODING 59017 SWIDTH 540 0 DWIDTH 9 0 -BBX 7 1 1 5 +BBX 9 19 1 -4 BITMAP -FE +0880 +0500 +0200 +0000 +0000 +0200 +0200 +0200 +0200 +0200 +0200 +0200 +0200 +0300 +4280 +8200 +8200 +8400 +7800 ENDCHAR -STARTCHAR 0x2213 -ENCODING 8723 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 7 9 1 1 +STARTCHAR 00DC +ENCODING 59018 +SWIDTH 300 0 +DWIDTH 5 0 +BBX 5 15 0 0 BITMAP -FE +88 +50 +20 00 -10 -10 -10 -FE -10 -10 -10 -ENDCHAR -STARTCHAR 0x2214 -ENCODING 8724 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 7 11 1 1 -BITMAP -10 -38 -10 00 -10 -10 -10 -FE -10 -10 -10 -ENDCHAR -STARTCHAR 0x2215 -ENCODING 8725 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 8 16 1 -4 -BITMAP -01 -01 -02 -02 -04 -04 -08 -08 -10 -10 20 +30 20 -40 -40 -80 -80 +20 +20 +20 +20 +20 +20 +C0 ENDCHAR -STARTCHAR 0x2216 -ENCODING 8726 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 6 12 1 0 +STARTCHAR 00DC +ENCODING 59019 +SWIDTH 300 0 +DWIDTH 5 0 +BBX 5 15 0 0 BITMAP -80 -80 -40 -40 +88 +50 +20 +00 +00 20 20 -10 -10 -08 -08 -04 -04 +20 +20 +20 +20 +20 +20 +20 +D0 ENDCHAR -STARTCHAR 0x2217 -ENCODING 8727 +STARTCHAR 00DE +ENCODING 59020 SWIDTH 540 0 DWIDTH 9 0 -BBX 7 7 1 2 -BITMAP -10 -92 -54 -38 -54 -92 -10 -ENDCHAR -STARTCHAR 0x2218 -ENCODING 8728 -SWIDTH 360 0 -DWIDTH 6 0 -BBX 4 4 1 4 -BITMAP -60 -90 -90 -60 -ENDCHAR -STARTCHAR 0x2219 -ENCODING 8729 -SWIDTH 360 0 -DWIDTH 6 0 -BBX 4 4 1 4 -BITMAP -60 -F0 -F0 -60 -ENDCHAR -STARTCHAR 0x221A -ENCODING 8730 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 11 11 1 0 -BITMAP -0020 -0020 -0040 -0040 -F080 -3080 -1900 -1900 -0E00 -0E00 -0400 -ENDCHAR -STARTCHAR 0x221B -ENCODING 8731 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 11 14 1 0 +BBX 8 16 1 -2 BITMAP -0600 -0900 -0100 -0220 -0120 -0940 -0640 -F080 -3080 -1900 -1900 -0E00 -0E00 -0400 +02 +02 +00 +00 +02 +03 +02 +02 +02 +02 +02 +42 +82 +82 +84 +78 ENDCHAR -STARTCHAR 0x221C -ENCODING 8732 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 11 14 1 0 +STARTCHAR 00DE +ENCODING 59021 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 9 18 1 -4 BITMAP 0200 -0600 -0A00 -1220 -1F20 -0240 -0740 -F080 -3080 -1900 -1900 -0E00 -0E00 -0400 -ENDCHAR -STARTCHAR 0x221D -ENCODING 8733 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 9 5 1 3 -BITMAP -7180 -8A00 +0200 +0000 +0000 +0200 +0200 +0200 +0200 +0200 +0200 +0200 +0200 +0300 +4280 +8200 +8200 8400 -8A00 -7180 +7800 ENDCHAR -STARTCHAR 0x221E -ENCODING 8734 -SWIDTH 780 0 -DWIDTH 13 0 -BBX 11 5 1 3 +STARTCHAR 00DC +ENCODING 59022 +SWIDTH 300 0 +DWIDTH 5 0 +BBX 4 14 0 0 BITMAP -71C0 -8A20 -8420 -8A20 -71C0 +20 +20 +00 +00 +20 +30 +20 +20 +20 +20 +20 +20 +20 +C0 ENDCHAR -STARTCHAR 0x221F -ENCODING 8735 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 7 7 1 2 +STARTCHAR 00DC +ENCODING 59023 +SWIDTH 240 0 +DWIDTH 4 0 +BBX 4 14 0 0 BITMAP -80 -80 -80 -80 -80 -80 -FE +20 +20 +00 +00 +20 +20 +20 +20 +20 +20 +20 +20 +20 +D0 ENDCHAR -STARTCHAR 0x2220 -ENCODING 8736 +STARTCHAR 00DE +ENCODING 59024 SWIDTH 540 0 DWIDTH 9 0 -BBX 7 7 1 2 -BITMAP -04 -08 -10 -20 -40 -80 -FE -ENDCHAR -STARTCHAR 0x2221 -ENCODING 8737 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 8 9 1 0 +BBX 8 18 1 -2 BITMAP -04 -68 -10 -28 -44 +02 +02 +05 +05 +00 +00 +02 +03 +02 +02 +02 +02 +02 +42 +82 +82 84 -FF -04 -04 +78 ENDCHAR -STARTCHAR 0x2222 -ENCODING 8738 +STARTCHAR 00DE +ENCODING 59025 SWIDTH 540 0 DWIDTH 9 0 -BBX 7 9 1 1 -BITMAP -20 -16 -18 -68 -88 -68 -18 -16 -20 -ENDCHAR -STARTCHAR 0x2223 -ENCODING 8739 -SWIDTH 180 0 -DWIDTH 3 0 -BBX 1 12 1 0 +BBX 9 20 1 -4 BITMAP -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 +0200 +0200 +0500 +0500 +0000 +0000 +0200 +0200 +0200 +0200 +0200 +0200 +0200 +0200 +0300 +4280 +8200 +8200 +8400 +7800 ENDCHAR -STARTCHAR 0x2224 -ENCODING 8740 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 5 12 1 0 +STARTCHAR 00DC +ENCODING 59026 +SWIDTH 300 0 +DWIDTH 5 0 +BBX 4 16 0 0 BITMAP 20 20 +50 +50 +00 +00 20 -28 30 20 -60 -A0 20 20 20 20 +20 +20 +C0 ENDCHAR -STARTCHAR 0x2225 -ENCODING 8741 -SWIDTH 300 0 -DWIDTH 5 0 -BBX 3 12 1 0 +STARTCHAR 00DC +ENCODING 59027 +SWIDTH 240 0 +DWIDTH 4 0 +BBX 4 16 0 0 BITMAP -A0 -A0 -A0 -A0 -A0 -A0 -A0 -A0 -A0 -A0 -A0 -A0 +20 +20 +50 +50 +00 +00 +20 +20 +20 +20 +20 +20 +20 +20 +20 +D0 ENDCHAR -STARTCHAR 0x2226 -ENCODING 8742 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 7 12 1 0 +STARTCHAR 00E7 +ENCODING 59028 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 11 1 -3 BITMAP -28 -28 -2A -2C -28 -38 -28 -68 -A8 -28 -28 -28 +1000 +1000 +0000 +0200 +0200 +4100 +8100 +8100 +8300 +7E80 +0380 ENDCHAR -STARTCHAR 0x2227 -ENCODING 8743 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 11 11 1 0 +STARTCHAR 00E7 +ENCODING 59029 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 9 11 1 -5 BITMAP -0400 -0A00 -0A00 -1100 -1100 -2080 -2080 -4040 -4040 -8020 -8020 +1000 +1000 +0000 +0200 +0200 +4180 +8100 +8100 +8300 +7E80 +0380 ENDCHAR -STARTCHAR 0x2228 -ENCODING 8744 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 11 11 1 0 +STARTCHAR 00E4 +ENCODING 59030 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 12 0 -3 BITMAP -8020 -8020 -4040 -4040 -2080 -2080 -1100 -1100 -0A00 -0A00 -0400 +20 +20 +00 +00 +10 +08 +08 +08 +F0 +60 +90 +60 ENDCHAR -STARTCHAR 0x2229 -ENCODING 8745 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 8 11 1 0 +STARTCHAR 00E5 +ENCODING 59031 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 6 11 0 -3 BITMAP -3C -42 -81 -81 -81 -81 -81 -81 -81 -81 -81 +10 +10 +00 +00 +10 +10 +10 +EC +60 +90 +60 ENDCHAR -STARTCHAR 0x222A -ENCODING 8746 +STARTCHAR 00E7 +ENCODING 59032 SWIDTH 600 0 DWIDTH 10 0 -BBX 8 11 1 0 +BBX 8 12 1 -2 BITMAP -81 -81 -81 -81 -81 -81 -81 +08 +08 +14 +14 +00 +02 +02 +41 81 81 -42 -3C +82 +7C ENDCHAR -STARTCHAR 0x222B -ENCODING 8747 +STARTCHAR 00E7 +ENCODING 59033 SWIDTH 540 0 DWIDTH 9 0 -BBX 7 19 1 -4 +BBX 9 12 1 -4 BITMAP -0E -12 -10 -10 -10 -10 -10 -10 +0800 +0800 +1400 +1400 +0000 +0200 +0200 +4180 +8100 +8100 +8200 +7C00 +ENDCHAR +STARTCHAR 00E4 +ENCODING 59034 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 11 0 -6 +BITMAP 10 +08 +08 +08 +F0 +00 +00 +28 +28 10 10 +ENDCHAR +STARTCHAR 00E5 +ENCODING 59035 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 6 10 0 -6 +BITMAP 10 10 10 +EC +00 +00 +28 +28 10 10 +ENDCHAR +STARTCHAR 0x009C +ENCODING 59036 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 4 11 1 0 +BITMAP +30 +40 +30 +40 +00 +20 +30 +50 +90 +90 +60 +ENDCHAR +STARTCHAR 0x009D +ENCODING 59037 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 6 12 1 0 +BITMAP +18 +20 +18 +20 +00 10 +30 +50 90 -E0 +90 +70 +0C ENDCHAR -STARTCHAR 0x222C -ENCODING 8748 -SWIDTH 840 0 -DWIDTH 14 0 -BBX 12 19 1 -4 +STARTCHAR 0x009E +ENCODING 59038 +SWIDTH 300 0 +DWIDTH 5 0 +BBX 4 11 1 0 BITMAP -0E70 -1290 -1080 -1080 -1080 -1080 -1080 -1080 -1080 -1080 -1080 -1080 -1080 -1080 -1080 -1080 -1080 -9480 -E700 +30 +40 +30 +40 +00 +20 +30 +50 +90 +90 +60 ENDCHAR -STARTCHAR 0x222D -ENCODING 8749 -SWIDTH 1140 0 -DWIDTH 19 0 -BBX 17 19 1 -4 +STARTCHAR 0x009F +ENCODING 59039 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 6 10 1 0 BITMAP -0E7380 -129480 -108400 -108400 -108400 -108400 -108400 -108400 -108400 -108400 -108400 -108400 -108400 -108400 -108400 -108400 -108400 -94A400 -E73800 +18 +20 +18 +20 +00 +00 +30 +78 +8C +04 ENDCHAR -STARTCHAR 0x222E -ENCODING 8750 +STARTCHAR 0x00A0 +ENCODING 59040 +SWIDTH 300 0 +DWIDTH 5 0 +BBX 4 10 1 0 +BITMAP +50 +50 +00 +00 +20 +30 +50 +90 +90 +60 +ENDCHAR +STARTCHAR 0x00A1 +ENCODING 59041 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 6 8 1 0 +BITMAP +28 +28 +00 +00 +30 +78 +8C +04 +ENDCHAR +STARTCHAR 0xFE85 +ENCODING 59042 SWIDTH 540 0 DWIDTH 9 0 -BBX 7 19 1 -4 +BBX 7 8 0 -3 BITMAP +04 +0A +0A 0E 12 -10 -10 -10 -10 -38 -54 -92 -92 -92 -54 -38 -10 -10 -10 -10 -90 -E0 +2A +94 +78 ENDCHAR -STARTCHAR 0x222F -ENCODING 8751 +STARTCHAR 0xFE86 +ENCODING 59043 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 8 1 -4 +BITMAP +0400 +0A00 +0A00 +0780 +1200 +2A00 +9400 +7800 +ENDCHAR +STARTCHAR 0xFE85 +ENCODING 59044 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 7 12 0 -3 +BITMAP +0A +0A +00 +00 +04 +0A +0A +0E +02 +02 +84 +78 +ENDCHAR +STARTCHAR 0xFE86 +ENCODING 59045 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 12 1 -4 +BITMAP +0A00 +0A00 +0000 +0000 +0400 +0A00 +0A00 +0780 +0200 +0200 +8400 +7800 +ENDCHAR +STARTCHAR 00F0 +ENCODING 59046 SWIDTH 780 0 DWIDTH 13 0 -BBX 12 19 1 -4 +BBX 13 8 0 -2 BITMAP -0E70 -1290 -1080 -1080 -1080 -1080 -3FC0 -50A0 -9090 -9090 -9090 -50A0 -3FC0 -1080 -1080 -1080 +0078 +0080 1080 -9480 -E700 +2060 +6010 +A010 +1060 +0F80 ENDCHAR -STARTCHAR 0x2230 -ENCODING 8752 -SWIDTH 1140 0 -DWIDTH 19 0 -BBX 17 19 1 -4 +STARTCHAR 00F0 +ENCODING 59047 +SWIDTH 840 0 +DWIDTH 14 0 +BBX 13 6 1 -5 BITMAP -0E7380 -129480 -108400 -108400 -108400 -108400 -3FFE00 -508500 -908480 -908480 -908480 -508500 -3FFE00 -108400 -108400 -108400 -108400 -94A400 -E73800 +1078 +2080 +6060 +A010 +1060 +0F80 +ENDCHAR +STARTCHAR 00F0 +ENCODING 59048 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 11 11 0 -2 +BITMAP +4400 +2800 +1000 +01E0 +0200 +4200 +8180 +8040 +8040 +4180 +3E00 ENDCHAR -STARTCHAR 0x2231 -ENCODING 8753 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 8 19 1 -4 +STARTCHAR 00F0 +ENCODING 59049 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 11 11 1 -5 BITMAP -0E -12 +2200 +1400 +0800 +0000 +0000 +41E0 +8200 +8180 +8040 +4180 +3E00 +ENDCHAR +STARTCHAR 00E4 +ENCODING 59050 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +44 +28 10 +00 +00 10 +08 +08 +08 +F0 +ENDCHAR +STARTCHAR 00E5 +ENCODING 59051 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +44 +28 10 +00 +00 10 10 -7D -93 -17 10 +EC +ENDCHAR +STARTCHAR 00F0 +ENCODING 59052 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 11 13 1 -7 +BITMAP +01E0 +0200 +4200 +8180 +8040 +8040 +4180 +3E00 +0000 +2800 +2800 +1000 +1000 +ENDCHAR +STARTCHAR 00F0 +ENCODING 59053 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 11 11 1 -10 +BITMAP +41E0 +8200 +8180 +8040 +4180 +3E00 +0000 +2800 +2800 +1000 +1000 +ENDCHAR +STARTCHAR 00E4 +ENCODING 59054 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 10 0 -5 +BITMAP 10 +08 +08 +08 +F0 +00 +50 +50 +20 +20 +ENDCHAR +STARTCHAR 00E5 +ENCODING 59055 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 6 9 0 -5 +BITMAP 10 10 10 +EC +00 +28 +28 10 10 -90 -E0 ENDCHAR -STARTCHAR 0x2232 -ENCODING 8754 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 9 19 1 -4 +STARTCHAR 00E4 +ENCODING 59056 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 5 0 0 BITMAP -0700 -0900 -0800 -0800 -0800 -0800 -3E80 -4980 -8B80 -8880 -8880 -4900 -3E00 -0800 -0800 -0800 -0800 -4800 -7000 +10 +08 +08 +08 +F0 ENDCHAR -STARTCHAR 0x2233 -ENCODING 8755 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 19 1 -4 +STARTCHAR 00E5 +ENCODING 59057 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 6 4 0 0 BITMAP -0700 -0900 -0800 -0800 -0800 -0800 -3F80 -4B00 -8A80 -8880 -8880 -4900 -3E00 -0800 -0800 -0800 -0800 -4800 -7000 +10 +10 +10 +EC ENDCHAR -STARTCHAR 0x2234 -ENCODING 8756 -SWIDTH 900 0 -DWIDTH 15 0 -BBX 13 11 1 0 +STARTCHAR 0xFE86 +ENCODING 59058 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 14 1 -4 BITMAP +1180 +2A00 +1180 +2A00 +4000 +0000 +0400 +0A00 +0A00 +0780 0200 -0700 0200 -0000 +8400 +7800 +ENDCHAR +STARTCHAR 0072 +ENCODING 59059 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 15 14 1 -5 +BITMAP +0010 +0010 +0028 +0028 0000 +0002 +0012 +0112 +40EC +8080 +8080 +8088 +4308 +3C00 +ENDCHAR +STARTCHAR 0071 +ENCODING 59060 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 17 13 1 -5 +BITMAP +001000 +001000 +002800 +002800 +000000 +000200 +011200 +40ED80 +808000 +808000 +808800 +430800 +3C0000 +ENDCHAR +STARTCHAR 006F +ENCODING 59061 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 11 13 0 -4 +BITMAP +0100 +0100 +0280 +0280 0000 +0020 +0120 +1120 +EEC0 0000 0000 -4010 -E038 -4010 +0080 +0080 ENDCHAR -STARTCHAR 0x2235 -ENCODING 8757 -SWIDTH 900 0 -DWIDTH 15 0 -BBX 13 11 1 0 +STARTCHAR 0070 +ENCODING 59062 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 13 13 0 -4 BITMAP -4010 -E038 -4010 -0000 +0100 +0100 +0280 +0280 0000 0000 +0100 +1120 +EED8 0000 0000 +0080 +0080 +ENDCHAR +STARTCHAR 0079 +ENCODING 59063 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 17 12 1 -5 +BITMAP +002000 +002000 +000700 +000880 +001080 +012700 +40F800 +80C000 +808000 +808400 +430400 +3C0000 +ENDCHAR +STARTCHAR 0079 +ENCODING 59064 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 18 12 1 -5 +BITMAP +002000 +002000 +000700 +000880 +001080 +012100 +40FFC0 +80C000 +808000 +808400 +430400 +3C0000 +ENDCHAR +STARTCHAR 0077 +ENCODING 59065 +SWIDTH 840 0 +DWIDTH 14 0 +BBX 13 11 0 -4 +BITMAP 0200 -0700 0200 +0070 +0088 +0108 +2270 +DF80 +0400 +0000 +0040 +0040 ENDCHAR -STARTCHAR 0x2236 -ENCODING 8758 -SWIDTH 300 0 -DWIDTH 5 0 -BBX 3 11 1 0 +STARTCHAR 0078 +ENCODING 59066 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 13 11 0 -4 BITMAP -40 -E0 +0400 +0400 +00E0 +0110 +0210 +2420 +DFF8 +0800 +0000 +0080 +0080 +ENDCHAR +STARTCHAR 00CB +ENCODING 59067 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 16 1 -7 +BITMAP +2000 +2000 +0000 +0000 +3800 +4000 +8000 +4C00 +3000 +4000 +4000 +8800 +8800 +8000 +4180 +3E00 +ENDCHAR +STARTCHAR 00CA +ENCODING 59068 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 9 15 1 -6 +BITMAP +1000 +1000 +0000 +0000 +3800 +6C00 +1000 +3800 +4780 +4000 +8800 +8800 +8000 +4180 +3E00 +ENDCHAR +STARTCHAR 00C8 +ENCODING 59069 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 7 13 0 -4 +BITMAP +10 +10 +00 +00 +1C +20 40 +26 +F8 +00 00 +10 +10 +ENDCHAR +STARTCHAR 00C5 +ENCODING 59070 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 8 13 0 -4 +BITMAP +08 +08 00 00 +1C +36 +08 +1C +E3 00 00 -40 -E0 -40 +08 +08 ENDCHAR -STARTCHAR 0x2237 -ENCODING 8759 -SWIDTH 900 0 -DWIDTH 15 0 -BBX 13 11 1 0 +STARTCHAR 00FA +ENCODING 59088 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 8 15 1 0 BITMAP -4010 -E038 -4010 -0000 -0000 -0000 +11 +0A +04 +00 +00 +C4 +E6 +24 +14 +14 +08 +0C +14 +24 +38 +ENDCHAR +STARTCHAR 00FB +ENCODING 59089 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 10 16 1 -1 +BITMAP +0880 +0500 +0200 0000 0000 -4010 -E038 -4010 +0200 +6300 +7200 +1200 +0A00 +0A00 +0A00 +0D00 +0900 +30C0 +E000 ENDCHAR -STARTCHAR 0x2238 -ENCODING 8760 +STARTCHAR 00FA +ENCODING 59090 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 7 14 1 0 +BITMAP +04 +04 +00 +00 +C4 +E6 +24 +14 +14 +08 +0C +14 +24 +38 +ENDCHAR +STARTCHAR 00FB +ENCODING 59091 SWIDTH 660 0 DWIDTH 11 0 -BBX 9 5 1 5 +BBX 10 15 1 -1 BITMAP -0800 -1C00 -0800 +0200 +0200 0000 -FF80 +0000 +0200 +6300 +7200 +1200 +0A00 +0A00 +0A00 +0D00 +0900 +30C0 +E000 ENDCHAR -STARTCHAR 0x2239 -ENCODING 8761 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 10 9 1 1 +STARTCHAR 00FA +ENCODING 59092 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 7 16 1 0 BITMAP -0080 -01C0 -0080 +04 +04 +0A +0A +00 +00 +C4 +E6 +24 +14 +14 +08 +0C +14 +24 +38 +ENDCHAR +STARTCHAR 00FB +ENCODING 59093 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 10 17 1 -1 +BITMAP +0200 +0200 +0500 +0500 0000 -FE00 0000 -0080 -01C0 -0080 +0200 +6300 +7200 +1200 +0A00 +0A00 +0A00 +0D00 +0900 +30C0 +E000 +ENDCHAR +STARTCHAR 0x00F0 +ENCODING 59120 +SWIDTH 1260 0 +DWIDTH 21 0 +BBX 19 14 1 -4 +BITMAP +028000 +028000 +02C000 +028000 +028000 +028000 +028840 +028460 +828420 +828420 +827820 +440040 +3858C0 +005780 +ENDCHAR +STARTCHAR 0032 +ENCODING 59124 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 8 10 2 0 +BITMAP +B9 +EE +E4 +60 +60 +20 +30 +10 +10 +10 ENDCHAR -STARTCHAR 0x223A -ENCODING 8762 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 10 9 1 1 +STARTCHAR 0078 +ENCODING 59648 +SWIDTH 900 0 +DWIDTH 15 0 +BBX 15 13 0 -2 BITMAP -4080 -E1C0 -4080 -0000 -FFC0 -0000 -4080 -E1C0 -4080 +31FE +6840 +4440 +4CC0 +29C0 +7E40 +C040 +8040 +8440 +8E40 +7E40 +0400 +0200 ENDCHAR -STARTCHAR 0x223B -ENCODING 8763 +STARTCHAR 0077 +ENCODING 59649 SWIDTH 780 0 DWIDTH 13 0 -BBX 10 10 1 1 +BBX 13 11 0 0 BITMAP -0400 -0E00 -0400 -0000 -7840 -8780 -0000 -0400 -0E00 -0400 +FFF8 +0100 +0100 +7F00 +3100 +0900 +0500 +6500 +7900 +1100 +0900 ENDCHAR -STARTCHAR 0x223C -ENCODING 8764 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 10 2 1 6 +STARTCHAR 00B6 +ENCODING 59650 +SWIDTH 900 0 +DWIDTH 15 0 +BBX 15 11 0 0 BITMAP -7840 -8780 +FFFE +0040 +0040 +0040 +FFC0 +1040 +2040 +2040 +2040 +1040 +0840 ENDCHAR -STARTCHAR 0x223D -ENCODING 8765 +STARTCHAR 002A +ENCODING 59651 SWIDTH 720 0 DWIDTH 12 0 -BBX 10 2 1 6 +BBX 12 11 0 0 BITMAP -8780 -7840 +FFF0 +0200 +0200 +3A00 +4600 +0600 +0A00 +1200 +2200 +0200 +0200 ENDCHAR -STARTCHAR 0x223E -ENCODING 8766 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 10 4 1 4 +STARTCHAR 00C1 +ENCODING 59652 +SWIDTH 900 0 +DWIDTH 15 0 +BBX 15 12 0 -1 BITMAP -7080 -8840 -8440 -4380 +FFFE +1840 +2440 +2440 +1840 +6740 +00C0 +7C40 +18C0 +10C0 +1140 +0E00 ENDCHAR -STARTCHAR 0x223F -ENCODING 8767 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 10 8 1 2 +STARTCHAR 00C2 +ENCODING 59653 +SWIDTH 900 0 +DWIDTH 15 0 +BBX 15 11 0 0 BITMAP -7000 -8800 -8800 -8800 -0440 -0440 +FFFE +1840 +2440 +2440 +1840 +6740 +00C0 +01C0 +0240 0440 -0380 +0040 ENDCHAR -STARTCHAR 0x2240 -ENCODING 8768 -SWIDTH 240 0 -DWIDTH 4 0 -BBX 2 10 1 2 +STARTCHAR 00C3 +ENCODING 59654 +SWIDTH 900 0 +DWIDTH 15 0 +BBX 15 11 0 0 BITMAP -80 -40 -40 -40 -40 -80 -80 -80 -80 -40 +FFFE +1840 +2440 +2440 +1840 +6740 +08C0 +08C0 +08C0 +0740 +0040 ENDCHAR -STARTCHAR 0x2241 -ENCODING 8769 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 10 6 1 4 +STARTCHAR 006B +ENCODING 59655 +SWIDTH 840 0 +DWIDTH 14 0 +BBX 14 11 0 0 BITMAP -0200 -0200 -7C40 -8780 -0800 -0800 +FFFC +0400 +0400 +7400 +8DC0 +8620 +8C20 +7420 +1420 +6440 +8400 ENDCHAR -STARTCHAR 0x2242 -ENCODING 8770 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 10 4 1 4 +STARTCHAR 0024 +ENCODING 59656 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 18 11 0 0 BITMAP -FFC0 -0000 -7840 -8780 +FFFFC0 +000800 +000800 +000800 +8FF800 +840800 +820800 +421800 +232800 +1E4800 +008800 ENDCHAR -STARTCHAR 0x2243 -ENCODING 8771 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 10 4 1 4 +STARTCHAR 0025 +ENCODING 59657 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 18 11 0 0 BITMAP -7840 -8780 -0000 -FFC0 +FFFFC0 +000800 +000800 +000800 +8FF800 +840800 +82C800 +429800 +232800 +1E4800 +008800 ENDCHAR -STARTCHAR 0x2244 -ENCODING 8772 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 10 8 1 2 +STARTCHAR 0027 +ENCODING 59658 +SWIDTH 900 0 +DWIDTH 15 0 +BBX 15 11 0 0 BITMAP -0200 -0200 -7C40 -8780 -0800 -FFC0 -1000 -1000 +FFFE +4200 +4200 +42C0 +4320 +4210 +3E10 +0A10 +1210 +2220 +4200 ENDCHAR -STARTCHAR 0x2245 -ENCODING 8773 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 10 6 1 3 +STARTCHAR 0027 +ENCODING 59659 +SWIDTH 900 0 +DWIDTH 15 0 +BBX 15 11 0 0 BITMAP -7840 -8780 -0000 -FFC0 -0000 -FFC0 +FFFE +4200 +4200 +42C0 +4320 +4210 +3E10 +8A10 +9210 +2220 +4200 ENDCHAR -STARTCHAR 0x2246 -ENCODING 8774 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 10 8 1 1 +STARTCHAR 0027 +ENCODING 59660 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 11 11 0 0 BITMAP -7840 -8780 -0400 -FFC0 -0800 -FFC0 -1000 -1000 +FFE0 +4200 +4200 +4200 +4200 +4200 +3E00 +0A00 +1200 +2200 +4200 ENDCHAR -STARTCHAR 0x2247 -ENCODING 8775 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 10 9 1 1 +STARTCHAR 002B +ENCODING 59661 +SWIDTH 840 0 +DWIDTH 14 0 +BBX 14 12 0 -1 BITMAP -0200 -7A40 -8780 -0400 +FFFC +1040 +1040 +1040 +B0C0 FFC0 +40C0 +4140 +2240 +2440 +1040 0800 -FFC0 -1000 -1000 ENDCHAR -STARTCHAR 0x2248 -ENCODING 8776 +STARTCHAR 002C +ENCODING 59662 SWIDTH 720 0 DWIDTH 12 0 -BBX 10 5 1 3 +BBX 12 12 0 -1 BITMAP -7840 -8780 -0000 -7840 -8780 +FFF0 +0200 +0200 +0200 +2700 +3C80 +1080 +1180 +0800 +0400 +0200 +0100 ENDCHAR -STARTCHAR 0x2249 -ENCODING 8777 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 10 8 1 1 +STARTCHAR 002D +ENCODING 59663 +SWIDTH 840 0 +DWIDTH 14 0 +BBX 14 11 0 0 BITMAP -0200 -7A40 -8780 +FFFC 0400 -7C40 -8F80 -0800 +0400 +0400 +2D80 +1F60 +1210 +11C8 0800 +0400 +0200 ENDCHAR -STARTCHAR 0x224A -ENCODING 8778 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 10 7 1 3 +STARTCHAR 006B +ENCODING 59669 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 10 11 0 0 BITMAP -7840 -8780 -0000 -7840 -8780 -0000 FFC0 -ENDCHAR -STARTCHAR 0x224B -ENCODING 8779 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 10 8 1 2 -BITMAP -7840 -8780 -0000 -7840 -8780 -0000 -7840 -8780 +0400 +0400 +7400 +8DC0 +8600 +8C00 +7400 +0400 +0400 +0400 ENDCHAR -STARTCHAR 0x224C -ENCODING 8780 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 10 8 1 2 +STARTCHAR 004B +ENCODING 59670 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 10 11 0 0 BITMAP -7080 -8840 -8440 -4380 -0000 -FFC0 -0000 FFC0 -ENDCHAR -STARTCHAR 0x224D -ENCODING 8781 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 10 5 1 3 -BITMAP -C0C0 -3F00 -0000 -3F00 -C0C0 +1000 +1000 +1380 +B640 +E440 +44C0 +4380 +2000 +1040 +0F80 ENDCHAR -STARTCHAR 0x224E -ENCODING 8782 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 10 7 1 2 +STARTCHAR 005E +ENCODING 59671 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 7 9 0 2 BITMAP -0C00 -1200 -F3C0 -0000 -F3C0 -1200 -0C00 +FE +20 +20 +20 +20 +20 +A0 +60 +20 ENDCHAR -STARTCHAR 0x224F -ENCODING 8783 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 10 5 1 4 +STARTCHAR 0047 +ENCODING 59672 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 8 8 0 3 BITMAP -0C00 -1200 -F3C0 -0000 -FFC0 +FF +40 +40 +3C +30 +20 +21 +1E ENDCHAR -STARTCHAR 0x2250 -ENCODING 8784 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 9 8 1 4 +STARTCHAR 007B +ENCODING 59673 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 13 10 0 1 BITMAP -0800 -1C00 -0800 -0000 -FF80 -0000 -0000 -FF80 +FFF8 +0200 +3E00 +2000 +2020 +1E20 +8100 +8100 +4100 +3E00 ENDCHAR -STARTCHAR 0x2251 -ENCODING 8785 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 9 12 1 0 +STARTCHAR 0063 +ENCODING 59674 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 8 9 0 2 BITMAP -0800 -1C00 -0800 -0000 -FF80 -0000 -0000 -FF80 -0000 -0800 -1C00 -0800 +FF +00 +00 +00 +7F +08 +10 +11 +0E ENDCHAR -STARTCHAR 0x2252 -ENCODING 8786 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 9 12 1 0 +STARTCHAR 0043 +ENCODING 59675 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 16 12 0 -1 BITMAP -4000 -E000 -4000 -0000 -FF80 -0000 -0000 -FF80 -0000 -0100 -0380 -0100 +FFFF +0020 +0020 +3870 +40C8 +4088 +3E48 +1838 +1018 +1018 +1864 +0F84 ENDCHAR -STARTCHAR 0x2253 -ENCODING 8787 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 9 12 1 0 +STARTCHAR 006A +ENCODING 59676 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 9 10 0 1 BITMAP -0100 -0380 -0100 -0000 FF80 0000 0000 -FF80 0000 -4000 -E000 -4000 +8F80 +8400 +4200 +4200 +2200 +1C00 ENDCHAR -STARTCHAR 0x2254 -ENCODING 8788 -SWIDTH 900 0 -DWIDTH 15 0 -BBX 13 7 1 2 +STARTCHAR 004A +ENCODING 59677 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 10 12 0 -1 BITMAP +FFC0 +0400 +7C00 4000 -EFF8 -4000 -0000 -4000 -EFF8 4000 -ENDCHAR -STARTCHAR 0x2255 -ENCODING 8789 -SWIDTH 900 0 -DWIDTH 15 0 -BBX 13 7 1 2 -BITMAP -0010 -FFB8 -0010 -0000 -0010 -FFB8 -0010 +3FC0 +0400 +0400 +3C00 +3C00 +0400 +0200 ENDCHAR -STARTCHAR 0x2256 -ENCODING 8790 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 9 4 1 4 +STARTCHAR 0057 +ENCODING 59678 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 8 8 0 3 BITMAP -FF80 -1400 -1400 -FF80 +FF +00 +18 +24 +07 +84 +4C +38 ENDCHAR -STARTCHAR 0x2257 -ENCODING 8791 +STARTCHAR 0058 +ENCODING 59679 SWIDTH 720 0 DWIDTH 12 0 -BBX 10 9 1 4 +BBX 12 11 0 0 BITMAP -0C00 -1200 -1200 -0C00 -0000 -FFC0 -0000 -0000 -FFC0 +FFF0 +0200 +0200 +3E00 +6000 +C000 +8000 +8000 +8100 +4300 +3E00 ENDCHAR -STARTCHAR 0x2258 -ENCODING 8792 +STARTCHAR 0059 +ENCODING 59680 SWIDTH 720 0 DWIDTH 12 0 -BBX 10 7 1 4 +BBX 12 11 0 0 BITMAP +FFF0 +0200 +0200 1E00 -2100 -0000 -FFC0 -0000 -0000 -FFC0 -ENDCHAR -STARTCHAR 0x2259 -ENCODING 8793 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 9 9 1 4 -BITMAP -0800 -1400 -2200 -4100 -0000 -FF80 -0000 -0000 -FF80 -ENDCHAR -STARTCHAR 0x225A -ENCODING 8794 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 9 9 1 4 -BITMAP -4100 -2200 -1400 -0800 -0000 -FF80 -0000 -0000 -FF80 +3100 +6080 +4080 +4080 +4080 +2180 +1F00 ENDCHAR -STARTCHAR 0x225B -ENCODING 8795 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 9 10 1 4 +STARTCHAR 0052 +ENCODING 59681 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 12 10 0 1 BITMAP -0800 -0800 +FFF0 +0200 3E00 -1C00 -3600 -0000 -FF80 -0000 -0000 -FF80 +2000 +1000 +0E00 +8100 +8080 +4080 +3F00 ENDCHAR -STARTCHAR 0x225C -ENCODING 8796 +STARTCHAR 005A +ENCODING 59682 SWIDTH 660 0 DWIDTH 11 0 -BBX 9 10 1 4 -BITMAP -0800 -1400 -2200 -4100 -7F00 -0000 -FF80 -0000 -0000 -FF80 -ENDCHAR -STARTCHAR 0x225D -ENCODING 8797 -SWIDTH 780 0 -DWIDTH 13 0 -BBX 11 12 1 4 +BBX 11 11 0 0 BITMAP -1040 -10A0 -1480 -7BC0 -9E80 -9880 -7680 -0000 FFE0 -0000 -0000 -FFE0 -ENDCHAR -STARTCHAR 0x225E -ENCODING 8798 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 9 10 1 4 -BITMAP -F600 -4900 -4900 -4900 +0200 +0200 +7E00 +C000 +8000 +8600 +8D00 4900 -0000 -FF80 -0000 -0000 -FF80 +2900 +1E00 ENDCHAR -STARTCHAR 0x225F -ENCODING 8799 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 9 12 1 4 +STARTCHAR 004E +ENCODING 59683 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 9 9 0 2 BITMAP -1800 -2400 -0C00 -1000 -1000 -0000 -1000 -0000 -FF80 -0000 -0000 FF80 +4400 +4400 +4400 +4400 +4400 +4400 +2400 +1800 ENDCHAR -STARTCHAR 0x2260 -ENCODING 8800 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 9 8 1 2 +STARTCHAR 0074 +ENCODING 59684 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 7 12 0 -1 BITMAP -0400 -0400 -FF80 -0800 -0800 -FF80 -1000 -1000 +FE +00 +00 +00 +7E +C0 +80 +80 +40 +40 +20 +10 ENDCHAR -STARTCHAR 0x2261 -ENCODING 8801 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 9 5 1 3 +STARTCHAR 0054 +ENCODING 59685 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 7 9 0 2 BITMAP -FF80 -0000 -FF80 -0000 -FF80 +66 +D0 +88 +78 +30 +E0 +40 +20 +1E ENDCHAR -STARTCHAR 0x2262 -ENCODING 8802 +STARTCHAR 0064 +ENCODING 59686 SWIDTH 660 0 DWIDTH 11 0 -BBX 9 9 1 1 +BBX 11 11 0 0 BITMAP +FFE0 0400 0400 -FF80 -0800 -FF80 -1000 -FF80 -2000 -2000 -ENDCHAR -STARTCHAR 0x2263 -ENCODING 8803 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 9 7 1 3 -BITMAP -FF80 -0000 -FF80 -0000 -FF80 -0000 -FF80 +7C00 +8000 +8000 +8600 +4600 +3E00 +0200 +0100 ENDCHAR -STARTCHAR 0x2264 -ENCODING 8804 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 7 9 1 2 +STARTCHAR 0044 +ENCODING 59687 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 7 8 0 3 BITMAP -06 -18 -60 +46 +80 80 +78 60 -18 -06 -00 -FE -ENDCHAR -STARTCHAR 0x2265 -ENCODING 8805 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 7 9 1 2 -BITMAP -C0 -30 -0C -02 -0C -30 -C0 -00 -FE +40 +42 +3C ENDCHAR -STARTCHAR 0x2266 -ENCODING 8806 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 7 9 1 2 +STARTCHAR 006E +ENCODING 59688 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 7 8 0 3 BITMAP -0E -70 -80 -70 -0E -00 FE 00 -FE -ENDCHAR -STARTCHAR 0x2267 -ENCODING 8807 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 7 9 1 2 -BITMAP -E0 -1C -02 -1C -E0 00 -FE 00 -FE -ENDCHAR -STARTCHAR 0x2268 -ENCODING 8808 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 7 10 1 1 -BITMAP -0E -70 -80 -70 -0E -10 -FE -20 FE +C0 40 +20 ENDCHAR -STARTCHAR 0x2269 -ENCODING 8809 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 7 10 1 1 +STARTCHAR 006E +ENCODING 59689 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 7 11 0 0 BITMAP -E0 -1C -02 -1C -E0 -08 FE -10 +00 +00 +00 FE -20 -ENDCHAR -STARTCHAR 0x226A -ENCODING 8810 -SWIDTH 840 0 -DWIDTH 14 0 -BBX 12 7 1 3 -BITMAP -0630 -18C0 -6300 -8400 -6300 -18C0 -0630 -ENDCHAR -STARTCHAR 0x226B -ENCODING 8811 -SWIDTH 840 0 -DWIDTH 14 0 -BBX 12 7 1 3 -BITMAP -C600 -3180 -0C60 -0210 -0C60 -3180 -C600 -ENDCHAR -STARTCHAR 0x226C -ENCODING 8812 -SWIDTH 300 0 -DWIDTH 5 0 -BBX 3 11 1 1 -BITMAP -A0 -40 -A0 -A0 -A0 -A0 -A0 -A0 -A0 -40 -A0 -ENDCHAR -STARTCHAR 0x226D -ENCODING 8813 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 10 7 1 2 -BITMAP -0200 -C2C0 -3F00 -0400 -3F00 -C8C0 -0800 -ENDCHAR -STARTCHAR 0x226E -ENCODING 8814 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 7 10 1 2 -BITMAP -08 -08 -0E -18 -70 -90 -60 -38 -26 -20 -ENDCHAR -STARTCHAR 0x226F -ENCODING 8815 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 7 9 1 2 -BITMAP -08 -C8 -38 -14 -12 -1C -30 -E0 +C0 +40 20 -ENDCHAR -STARTCHAR 0x2270 -ENCODING 8816 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 7 11 1 1 -BITMAP +00 08 08 -0E -18 -70 -90 -60 -B8 -66 -78 -46 ENDCHAR -STARTCHAR 0x2271 -ENCODING 8817 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 7 11 1 0 +STARTCHAR 0070 +ENCODING 59690 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 6 8 0 3 BITMAP -08 -C8 +FC +40 +40 +40 +40 +40 +44 38 -14 -12 -1C -32 -EC -30 -E0 -20 ENDCHAR -STARTCHAR 0x2272 -ENCODING 8818 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 8 10 1 1 +STARTCHAR 0050 +ENCODING 59691 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 11 11 0 0 BITMAP -06 -18 -60 -80 -60 -18 -06 -00 -71 -8E +FFE0 +4200 +4200 +42E0 +4300 +4600 +3A00 +0200 +0200 +0200 +0200 ENDCHAR -STARTCHAR 0x2273 -ENCODING 8819 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 8 10 1 1 +STARTCHAR 0062 +ENCODING 59692 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 6 8 0 3 BITMAP -60 -18 -06 -01 -06 -18 -60 +FC 00 -71 -8E +00 +78 +E4 +94 +8C +78 ENDCHAR -STARTCHAR 0x2274 -ENCODING 8820 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 8 13 1 0 +STARTCHAR 0042 +ENCODING 59693 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 7 8 0 3 BITMAP -04 -04 -06 -18 -68 -88 +C6 +A0 +90 70 -38 -16 +10 +FE +60 20 -71 -AE +ENDCHAR +STARTCHAR 006D +ENCODING 59694 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 7 8 0 3 +BITMAP +FE +20 +20 +20 +20 +FE +60 20 ENDCHAR -STARTCHAR 0x2275 -ENCODING 8821 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 8 13 1 0 +STARTCHAR 0079 +ENCODING 59695 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 7 8 0 3 BITMAP -02 -02 -62 -1C -06 -05 -0E -18 -68 +FE 10 -71 -9E +10 20 +C0 +80 +42 +3C ENDCHAR -STARTCHAR 0x2276 -ENCODING 8822 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 7 10 1 1 +STARTCHAR 0072 +ENCODING 59696 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 11 12 0 -1 BITMAP -0E -70 -80 -70 -0E -E0 -1C -02 -1C -E0 +FFE0 +0400 +0400 +0400 +2C00 +3800 +1000 +1000 +0800 +0800 +0400 +0200 ENDCHAR -STARTCHAR 0x2277 -ENCODING 8823 +STARTCHAR 0072 +ENCODING 59697 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 11 12 0 -1 +BITMAP +FFE0 +0400 +0400 +0400 +2C00 +3800 +1000 +1000 +0800 +2800 +2400 +0200 +ENDCHAR +STARTCHAR 006C +ENCODING 59698 SWIDTH 540 0 DWIDTH 9 0 -BBX 7 10 1 1 +BBX 10 11 0 0 BITMAP -E0 -1C -02 -1C -E0 -0E -70 -80 -70 -0E +FFC0 +0000 +0000 +0000 +78C0 +8500 +8200 +8000 +4000 +4000 +2000 ENDCHAR -STARTCHAR 0x2278 -ENCODING 8824 +STARTCHAR 004C +ENCODING 59699 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 13 11 0 0 +BITMAP +FFF8 +0000 +0000 +0000 +7860 +C490 +8108 +8208 +8308 +4498 +3870 +ENDCHAR +STARTCHAR 004C +ENCODING 59700 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 13 15 0 -4 +BITMAP +FFF8 +0000 +0000 +0000 +7860 +C490 +8108 +8208 +8308 +4498 +3870 +0000 +0000 +0200 +0200 +ENDCHAR +STARTCHAR 0076 +ENCODING 59701 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 6 8 0 3 +BITMAP +FC +00 +00 +78 +84 +84 +84 +78 +ENDCHAR +STARTCHAR 0053 +ENCODING 59702 SWIDTH 540 0 DWIDTH 9 0 -BBX 7 14 1 -1 +BBX 9 11 0 0 BITMAP -10 -10 -1E -70 -90 -70 -1E -F0 -1C -12 +FF80 +1400 +2200 +2200 +2200 +1E00 +2200 +5C00 +3800 +0400 +0400 +ENDCHAR +STARTCHAR 005C +ENCODING 59703 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 6 8 0 3 +BITMAP +FC +60 +50 +50 +48 +48 +24 1C -F0 -10 -10 ENDCHAR -STARTCHAR 0x2279 -ENCODING 8825 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 7 14 1 -1 +STARTCHAR 0073 +ENCODING 59704 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 8 12 0 -1 BITMAP +FF 10 10 -F0 -1C -12 -1C -F0 -1E -70 -90 -70 -1E 10 +B1 +FE +40 +40 +20 +20 10 +08 ENDCHAR -STARTCHAR 0x227A -ENCODING 8826 +STARTCHAR 0068 +ENCODING 59705 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 11 14 0 -3 +BITMAP +FFE0 +0200 +0200 +1E00 +2000 +1000 +1E00 +3100 +2100 +2200 +2000 +1000 +0800 +0600 +ENDCHAR +STARTCHAR 0056 +ENCODING 59712 SWIDTH 600 0 DWIDTH 10 0 -BBX 9 9 1 2 +BBX 10 11 0 0 BITMAP -0080 +FFC0 +0400 +7580 +8E40 +8C40 +7480 +8F80 +8C40 +7440 +0480 +0400 +ENDCHAR +STARTCHAR 00B6 +ENCODING 59713 +SWIDTH 900 0 +DWIDTH 15 0 +BBX 15 12 0 -1 +BITMAP +FFFE +0040 +0040 +0040 +FFDC +3062 +2042 +2042 +2042 +1044 +0840 +0400 +ENDCHAR +STARTCHAR 00A2 +ENCODING 59714 +SWIDTH 840 0 +DWIDTH 14 0 +BBX 14 16 0 -5 +BITMAP +FFFC 0100 -0600 -3800 -C000 -3800 -0600 +3F00 +2000 +2020 +1E20 +8100 +8100 +4100 +3E00 +0400 +3500 +4E80 +4C80 +3480 +0400 +ENDCHAR +STARTCHAR 00A3 +ENCODING 59715 +SWIDTH 840 0 +DWIDTH 14 0 +BBX 14 16 0 -5 +BITMAP +FFFC 0100 +3F00 +2000 +2020 +1E20 +8100 +8100 +4100 +3F00 +6100 +CD00 +9300 +5300 +4D00 +2100 +ENDCHAR +STARTCHAR 00A4 +ENCODING 59716 +SWIDTH 840 0 +DWIDTH 14 0 +BBX 14 16 0 -5 +BITMAP +FFFC +0100 +3F00 +2000 +2020 +1E20 +8100 +8100 +4100 +3F00 +1100 +1100 +3100 +3100 +1100 +0100 +ENDCHAR +STARTCHAR 00A5 +ENCODING 59717 +SWIDTH 840 0 +DWIDTH 14 0 +BBX 14 16 0 -5 +BITMAP +FFFC +0200 +3E00 +2000 +2020 +1E20 +8100 +8100 +4100 +7E00 +4200 +4200 +3A00 +2200 +1E00 +0200 +ENDCHAR +STARTCHAR 006A +ENCODING 59718 +SWIDTH 840 0 +DWIDTH 14 0 +BBX 14 11 0 0 +BITMAP +FFFC +0040 +1840 +47C0 +2440 +1840 +0040 +47C0 +4440 +2240 +1C40 +ENDCHAR +STARTCHAR 00B9 +ENCODING 59719 +SWIDTH 840 0 +DWIDTH 14 0 +BBX 14 13 0 -2 +BITMAP +FFFC +0080 0080 +0F80 +1000 +1000 +30C0 +50C0 +4FC0 +2040 +1840 +10C0 +0F40 ENDCHAR -STARTCHAR 0x227B -ENCODING 8827 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 9 1 2 +STARTCHAR 00B8 +ENCODING 59720 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 11 14 0 -3 BITMAP -8000 +FFE0 +0400 +0400 +3C00 4000 -3000 -0E00 -0180 -0E00 -3000 +2000 +3C00 +4000 4000 +4300 +3F00 +0300 +0100 +0080 +ENDCHAR +STARTCHAR 00B9 +ENCODING 59721 +SWIDTH 840 0 +DWIDTH 14 0 +BBX 14 13 0 -2 +BITMAP +FFFC +0080 +0080 +0F80 +1000 +1000 +10C0 +50C0 +4FC0 +4040 +3860 +1080 +0F00 +ENDCHAR +STARTCHAR 00BE +ENCODING 59722 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 11 14 0 -3 +BITMAP +FFE0 +0400 +0400 +7C00 8000 +8000 +8600 +8600 +7E00 +1E00 +3300 +2A80 +2600 +1C00 ENDCHAR -STARTCHAR 0x227C -ENCODING 8828 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 11 1 0 +STARTCHAR 00BB +ENCODING 59723 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 13 13 0 -2 BITMAP +FFF8 0080 -0100 -0600 -3800 -C000 -3800 -C600 -3900 -0480 -0200 -0100 +0080 +0F80 +1000 +1000 +1180 +9180 +4F80 +4080 +4080 +FF80 +C080 ENDCHAR -STARTCHAR 0x227D -ENCODING 8829 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 11 1 0 +STARTCHAR 00BC +ENCODING 59724 +SWIDTH 840 0 +DWIDTH 14 0 +BBX 14 12 0 -1 BITMAP -8000 -4000 -3000 -0E00 -0180 -0E00 -3180 -4E00 -9000 -2000 -4000 +FFFC +0440 +0440 +7C40 +8040 +8040 +8C40 +8C40 +7C40 +0440 +0FC0 +0C40 ENDCHAR -STARTCHAR 0x227E -ENCODING 8830 +STARTCHAR 00BD +ENCODING 59725 +SWIDTH 900 0 +DWIDTH 15 0 +BBX 15 12 0 -1 +BITMAP +FFFE +0220 +0220 +3E20 +4020 +4020 +4620 +4620 +3E20 +0420 +0260 +01C0 +ENDCHAR +STARTCHAR 00BE +ENCODING 59726 SWIDTH 660 0 DWIDTH 11 0 -BBX 10 12 1 1 +BBX 11 14 0 -3 BITMAP -0040 -0080 -0300 -1C00 -6000 +FFE0 +0400 +0400 +7C00 +8000 +8000 +8600 +8600 +7E00 +1E00 +2300 +2280 +2200 1C00 -0300 -0080 -0040 -0000 -7840 -8780 ENDCHAR -STARTCHAR 0x227F -ENCODING 8831 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 10 12 1 1 +STARTCHAR 00AC +ENCODING 59727 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 12 17 0 -6 BITMAP +FFF0 +0200 +0200 +7E00 +C000 8000 -4000 -3000 -0E00 -0180 -0E00 -3000 -4000 +8080 +C180 +7F00 +0200 +0200 +7E00 +C000 8000 -0000 -7840 -8780 +8080 +C180 +7F00 ENDCHAR -STARTCHAR 0x2280 -ENCODING 8832 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 10 1 2 +STARTCHAR 00AD +ENCODING 59728 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 12 17 0 -6 BITMAP -0400 -0480 -0500 -0E00 -3800 -C800 -3800 -1600 +FFF0 +0200 +0200 +7E00 +C000 +8000 +8100 +C300 +7E00 +0200 +3E00 +6200 +C100 +8100 +8100 +4300 +3E00 +ENDCHAR +STARTCHAR 00AD +ENCODING 59729 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 12 16 0 -5 +BITMAP +FFF0 +0200 +0200 +3E00 +6100 +C100 +8100 +8300 +7E00 +0200 +3E00 +6100 +C100 +8100 +8300 +7E00 +ENDCHAR +STARTCHAR 00A4 +ENCODING 59730 +SWIDTH 840 0 +DWIDTH 14 0 +BBX 14 16 0 -5 +BITMAP +FFFC +0100 +3F00 +2000 +2000 +1E00 +8100 +8100 +4100 +3F00 1100 -1080 +1100 +3100 +3100 +1100 +0100 ENDCHAR -STARTCHAR 0x2281 -ENCODING 8833 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 10 1 1 +STARTCHAR 00B2 +ENCODING 59731 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 12 18 0 -7 BITMAP +FFF0 +0100 +0100 +3F00 +2000 +3C00 +8600 8200 -4200 -3400 -0E00 -0980 -0E00 -3000 -5000 -A000 +4600 +3E00 +0200 +3E00 2000 +3C00 +8600 +8200 +4600 +3C00 ENDCHAR -STARTCHAR 0x2282 -ENCODING 8834 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 8 9 1 2 +STARTCHAR 00B2 +ENCODING 59732 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 12 18 0 -7 BITMAP -3F -40 -80 -80 -80 -80 -80 -40 -3F +FFF0 +0100 +0100 +3F00 +2000 +3C00 +8600 +8200 +4600 +3E00 +0200 +3E00 +4000 +8000 +9C00 +A200 +6200 +3C00 ENDCHAR -STARTCHAR 0x2283 -ENCODING 8835 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 8 9 1 2 +STARTCHAR 00C0 +ENCODING 59733 +SWIDTH 840 0 +DWIDTH 14 0 +BBX 14 11 0 0 BITMAP -FC -02 -01 -01 -01 -01 -01 -02 -FC +FFFC +0080 +0080 +7880 +6480 +2380 +0E80 +3880 +3080 +1080 +0080 ENDCHAR -STARTCHAR 0x2284 -ENCODING 8836 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 8 13 1 0 +STARTCHAR 0068 +ENCODING 59734 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 16 15 0 -4 BITMAP -02 -02 -3F -44 -84 -88 -88 -90 -90 -60 -3F -40 -40 +FFFF +0210 +0210 +3E10 +4010 +2010 +3C10 +6210 +4110 +43F0 +4310 +2010 +1000 +0C00 +0300 ENDCHAR -STARTCHAR 0x2285 -ENCODING 8837 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 8 13 1 0 +STARTCHAR 0068 +ENCODING 59735 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 16 15 0 -4 BITMAP -02 -02 -FC -06 -09 -09 -11 -11 -21 -22 -FC -40 -40 +FFFF +0210 +0210 +3E10 +4010 +2010 +3C10 +6210 +4110 +4130 +4250 +2190 +1000 +0C00 +0300 ENDCHAR -STARTCHAR 0x2286 -ENCODING 8838 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 8 11 1 0 +STARTCHAR 0068 +ENCODING 59736 +SWIDTH 1140 0 +DWIDTH 19 0 +BBX 19 15 0 -4 BITMAP -3F -40 -80 -80 -80 -80 -80 -40 -3F -00 -FF +FFFFE0 +000200 +000200 +003E00 +004000 +002000 +003C00 +006200 +004100 +3BC100 +464200 +422000 +401000 +200C00 +180300 ENDCHAR -STARTCHAR 0x2287 -ENCODING 8839 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 8 11 1 0 +STARTCHAR 0068 +ENCODING 59737 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 16 15 0 -4 BITMAP -FC -02 -01 -01 -01 -01 -01 -02 -FC -00 -FF +FFFF +0010 +0010 +01F0 +0200 +0100 +01E0 +0310 +0208 +0208 +3E10 +6300 +4280 +4660 +3C18 ENDCHAR -STARTCHAR 0x2288 -ENCODING 8840 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 8 14 1 -1 +STARTCHAR 004B +ENCODING 59738 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 18 11 0 0 BITMAP -02 -02 -3F -44 -84 -88 -88 -90 -90 -60 -3F -40 -FF -80 +FFFFC0 +100800 +100800 +10E800 +B01800 +FE1800 +402800 +404800 +208800 +100800 +080800 ENDCHAR -STARTCHAR 0x2289 -ENCODING 8841 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 8 14 1 -1 +STARTCHAR 0078 +ENCODING 59760 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 9 13 0 -2 BITMAP -02 -02 -FC -06 -09 -09 -11 -11 -21 -22 -FC -40 -FF -80 +3180 +6800 +4400 +4C80 +2980 +7E00 +C000 +8000 +8400 +8E00 +7E00 +0400 +0200 ENDCHAR -STARTCHAR 0x228A -ENCODING 8842 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 8 12 1 -1 +STARTCHAR 0077 +ENCODING 59761 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 13 11 0 0 BITMAP -3F -40 -80 -80 -80 -80 -80 -40 -3F -08 -FF -10 +FFF8 +0100 +0100 +7F00 +3100 +0900 +0500 +6500 +7900 +1100 +0900 ENDCHAR -STARTCHAR 0x228B -ENCODING 8843 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 8 12 1 -1 +STARTCHAR 00B6 +ENCODING 59762 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 9 11 0 0 +BITMAP +FF80 +0000 +0000 +0000 +FF80 +1000 +2000 +2000 +2000 +1000 +0800 +ENDCHAR +STARTCHAR 002A +ENCODING 59763 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 6 9 0 2 BITMAP -FC -02 -01 -01 -01 -01 -01 -02 FC +00 +00 +78 +84 +04 08 -FF -10 +30 +40 ENDCHAR -STARTCHAR 0x228C -ENCODING 8844 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 9 11 1 0 +STARTCHAR 00C1 +ENCODING 59764 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 9 12 0 -1 BITMAP -8080 -8080 -8080 -8080 -9080 -B080 FF80 -B080 -9080 -4100 -3E00 +1800 +2400 +2400 +1800 +6700 +0080 +7C00 +1880 +1080 +1100 +0E00 ENDCHAR -STARTCHAR 0x228D -ENCODING 8845 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 9 11 1 0 +STARTCHAR 00C2 +ENCODING 59765 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 9 10 0 1 BITMAP -8080 -8080 -8080 -8080 -8080 -9C80 -9C80 -9C80 -8080 -4100 -3E00 +FF80 +1800 +2400 +2400 +1800 +6700 +0080 +0180 +0200 +0400 ENDCHAR -STARTCHAR 0x228E -ENCODING 8846 +STARTCHAR 00C3 +ENCODING 59766 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 9 10 0 1 +BITMAP +FF80 +1800 +2400 +2400 +1800 +6700 +0880 +0880 +0880 +0700 +ENDCHAR +STARTCHAR 00FE +ENCODING 59771 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 4 7 0 10 +BITMAP +60 +90 +A0 +A0 +80 +40 +20 +ENDCHAR +STARTCHAR 0068 +ENCODING 59772 SWIDTH 660 0 DWIDTH 11 0 -BBX 9 11 1 0 +BBX 11 16 0 -5 BITMAP -8080 -8080 -8080 -8080 -8880 -8880 -BE80 -8880 -8880 -4100 +FFE0 +0200 +0200 3E00 +4000 +2000 +3C00 +6200 +4100 +4100 +4200 +2000 +1000 +2C00 +4300 +8000 ENDCHAR -STARTCHAR 0x228F -ENCODING 8847 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 8 10 1 2 +STARTCHAR 0022 +ENCODING 59773 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 8 7 0 4 BITMAP FF -80 -80 -80 -80 -80 +00 +00 +00 +00 +43 +3C +ENDCHAR +STARTCHAR 00FE +ENCODING 59774 +SWIDTH 240 0 +DWIDTH 4 0 +BBX 4 7 0 10 +BITMAP +60 +90 80 80 80 -FF +40 +20 ENDCHAR -STARTCHAR 0x2290 -ENCODING 8848 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 8 10 1 2 +STARTCHAR 00D5 +ENCODING 59775 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 5 5 0 -5 BITMAP -FF -01 -01 -01 -01 -01 -01 -01 -01 -FF +20 +30 +68 +C0 +80 ENDCHAR -STARTCHAR 0x2291 -ENCODING 8849 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 8 12 1 0 +STARTCHAR 0061 +ENCODING 59776 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 7 15 -1 0 BITMAP -FF -80 -80 -80 -80 -80 -80 -80 -80 -FF +B4 +44 +38 00 -FF +7E +20 +20 +20 +20 +20 +20 +20 +20 +20 +20 ENDCHAR -STARTCHAR 0x2292 -ENCODING 8850 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 8 12 1 0 +STARTCHAR 0061 +ENCODING 59777 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 6 14 0 0 BITMAP -FF -01 -01 -01 -01 -01 -01 -01 -01 -FF +60 00 -FF +00 +FC +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 ENDCHAR -STARTCHAR 0x2293 -ENCODING 8851 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 9 10 1 2 +STARTCHAR 0061 +ENCODING 59778 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 6 17 0 0 BITMAP -FF80 -8080 -8080 -8080 -8080 -8080 -8080 -8080 -8080 -8080 +60 +90 +80 +80 +80 +40 +FC +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 ENDCHAR -STARTCHAR 0x2294 -ENCODING 8852 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 9 10 1 2 +STARTCHAR 0061 +ENCODING 59779 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 6 17 0 0 BITMAP -8080 -8080 -8080 -8080 -8080 -8080 -8080 -8080 -8080 -FF80 +60 +90 +A0 +A0 +80 +40 +FC +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 ENDCHAR -STARTCHAR 0x2295 -ENCODING 8853 -SWIDTH 900 0 -DWIDTH 15 0 -BBX 13 13 1 0 +STARTCHAR 0065 +ENCODING 59780 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 9 18 0 0 BITMAP -0F80 -3260 -6230 -4210 -8208 -8208 -FFF8 -8208 -8208 -4210 -6230 -3260 -0F80 +0080 +0080 +3C00 +4300 +4080 +4000 +4000 +FC00 +4000 +4000 +4000 +4000 +4000 +4000 +4000 +4000 +4000 +4000 ENDCHAR -STARTCHAR 0x2296 -ENCODING 8854 -SWIDTH 900 0 -DWIDTH 15 0 -BBX 13 13 1 0 +STARTCHAR 0065 +ENCODING 59781 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 12 17 0 0 BITMAP -0F80 -3060 -6030 -4010 -8008 -8008 -FFF8 -8008 -8008 -4010 -6030 -3060 -0F80 +0070 +3C80 +4380 +4080 +4000 +4000 +FC00 +4000 +4000 +4000 +4000 +4000 +4000 +4000 +4000 +4000 +4000 ENDCHAR -STARTCHAR 0x2297 -ENCODING 8855 -SWIDTH 900 0 -DWIDTH 15 0 -BBX 13 13 1 0 +STARTCHAR 0065 +ENCODING 59782 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 12 17 0 0 BITMAP -0F80 -3060 -6030 -5050 -8888 -8508 -8208 -8508 -8888 -5050 -6030 -3060 -0F80 +0070 +3C80 +43A0 +40A0 +4000 +4000 +FC00 +4000 +4000 +4000 +4000 +4000 +4000 +4000 +4000 +4000 +4000 ENDCHAR -STARTCHAR 0x2298 -ENCODING 8856 -SWIDTH 900 0 -DWIDTH 15 0 -BBX 13 13 1 0 +STARTCHAR 0069 +ENCODING 59783 +SWIDTH 300 0 +DWIDTH 5 0 +BBX 12 16 -5 0 BITMAP -0F80 -3060 -6030 -4050 -8088 -8108 -8208 -8408 -8808 -5010 -6030 -3060 -0F80 +7800 +8440 +8240 +8100 +0100 +03F0 +0100 +0100 +0100 +0100 +0100 +0100 +0100 +0100 +0100 +0100 ENDCHAR -STARTCHAR 0x2299 -ENCODING 8857 -SWIDTH 900 0 -DWIDTH 15 0 -BBX 13 13 1 0 +STARTCHAR 0069 +ENCODING 59784 +SWIDTH 300 0 +DWIDTH 5 0 +BBX 12 16 -5 0 BITMAP -0F80 -3060 -6030 -4010 -8008 -8708 -8708 -8708 -8008 -4010 -6030 -3060 -0F80 +78C0 +8520 +8300 +8100 +0100 +03F0 +0100 +0100 +0100 +0100 +0100 +0100 +0100 +0100 +0100 +0100 ENDCHAR -STARTCHAR 0x229A -ENCODING 8858 -SWIDTH 900 0 -DWIDTH 15 0 -BBX 13 13 1 0 +STARTCHAR 0069 +ENCODING 59785 +SWIDTH 300 0 +DWIDTH 5 0 +BBX 12 16 -5 0 BITMAP -0F80 -3060 -6030 -4010 -8708 -8888 -8888 -8888 -8708 -4010 -6030 -3060 -0F80 +78C0 +8520 +8340 +8140 +0100 +03F0 +0100 +0100 +0100 +0100 +0100 +0100 +0100 +0100 +0100 +0100 ENDCHAR -STARTCHAR 0x229B -ENCODING 8859 -SWIDTH 900 0 -DWIDTH 15 0 -BBX 13 13 1 0 +STARTCHAR 00F1 +ENCODING 59786 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 7 6 0 11 BITMAP -0F80 -3060 -6030 -4210 -9248 -8A88 -8708 -8A88 -9248 -4210 -6030 -3060 -0F80 +02 +E2 +10 +08 +04 +02 ENDCHAR -STARTCHAR 0x229C -ENCODING 8860 -SWIDTH 900 0 -DWIDTH 15 0 -BBX 13 13 1 0 +STARTCHAR 00F1 +ENCODING 59787 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 10 5 0 11 BITMAP -0F80 -3060 -6030 -4010 -8008 -9FC8 -8008 -9FC8 -8008 -4010 -6030 -3060 -0F80 +E180 +1240 +0A00 +0600 +0200 ENDCHAR -STARTCHAR 0x229D -ENCODING 8861 -SWIDTH 900 0 -DWIDTH 15 0 -BBX 13 13 1 0 +STARTCHAR 00F1 +ENCODING 59788 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 10 5 0 11 BITMAP -0F80 -3060 -6030 -4010 -8008 -8008 -9FC8 -8008 -8008 -4010 -6030 -3060 -0F80 +E180 +1240 +0A80 +0680 +0200 ENDCHAR -STARTCHAR 0x229E -ENCODING 8862 -SWIDTH 780 0 -DWIDTH 13 0 -BBX 11 11 1 0 +STARTCHAR 00F2 +ENCODING 59789 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 8 6 0 11 BITMAP -FFE0 -8420 -8420 -8420 -8420 -FFE0 -8420 -8420 -8420 -8420 -FFE0 +31 +19 +E4 +7A +06 +01 ENDCHAR -STARTCHAR 0x229F -ENCODING 8863 +STARTCHAR 00F2 +ENCODING 59790 SWIDTH 780 0 DWIDTH 13 0 -BBX 11 11 1 0 +BBX 13 6 0 11 BITMAP -FFE0 -8020 -8020 -8020 -8020 -FFE0 -8020 -8020 -8020 -8020 -FFE0 +3000 +1830 +E448 +7A40 +0640 +0140 ENDCHAR -STARTCHAR 0x22A0 -ENCODING 8864 +STARTCHAR 00F2 +ENCODING 59791 SWIDTH 780 0 DWIDTH 13 0 -BBX 11 11 1 0 +BBX 13 6 0 11 BITMAP -FFE0 -C060 -A0A0 -9120 -8A20 -8420 -8A20 -9120 -A0A0 -C060 -FFE0 +3000 +1830 +E448 +7A50 +0650 +0140 ENDCHAR -STARTCHAR 0x22A1 -ENCODING 8865 -SWIDTH 780 0 -DWIDTH 13 0 -BBX 11 11 1 0 +STARTCHAR 0061 +ENCODING 59792 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 11 17 -5 0 BITMAP -FFE0 -8020 -8020 -8020 -8420 -8E20 -8420 -8020 -8020 -8020 -FFE0 +0200 +E200 +1000 +0800 +0400 +0200 +07E0 +0200 +0200 +0200 +0200 +0200 +0200 +0200 +0200 +0200 +0200 ENDCHAR -STARTCHAR 0x22A2 -ENCODING 8866 -SWIDTH 780 0 -DWIDTH 13 0 -BBX 11 11 1 0 +STARTCHAR 0061 +ENCODING 59793 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 11 16 -5 0 BITMAP -8000 -8000 -8000 -8000 -8000 -FFE0 -8000 -8000 -8000 -8000 -8000 +E180 +1240 +0A00 +0600 +0200 +07E0 +0200 +0200 +0200 +0200 +0200 +0200 +0200 +0200 +0200 +0200 ENDCHAR -STARTCHAR 0x22A3 -ENCODING 8867 -SWIDTH 780 0 -DWIDTH 13 0 -BBX 11 11 1 0 +STARTCHAR 0061 +ENCODING 59794 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 11 16 -5 0 BITMAP -0020 -0020 -0020 -0020 -0020 -FFE0 +E180 +1240 +0A80 +0680 +0200 +07E0 +0200 +0200 +0200 +0200 +0200 +0200 +0200 +0200 +0200 +0200 +ENDCHAR +STARTCHAR 0061 +ENCODING 59795 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 12 17 -6 0 +BITMAP +3100 +1900 +E400 +7A00 +0600 +0100 +03F0 +0100 +0100 +0100 +0100 +0100 +0100 +0100 +0100 +0100 +0100 +ENDCHAR +STARTCHAR 0061 +ENCODING 59796 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 12 18 -6 0 +BITMAP +0200 +3200 +18C0 +E520 +7B00 +0700 +0100 +03F0 +0100 +0100 +0100 +0100 +0100 +0100 +0100 +0100 +0100 +0100 +ENDCHAR +STARTCHAR C099 +ENCODING 60896 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 10 1 3 +BITMAP +3E00 +4100 +A280 +B680 +B680 +AA80 +A280 +A280 +4100 +3E00 +ENDCHAR +STARTCHAR 0065 +ENCODING 60909 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 12 19 -5 0 +BITMAP +4000 +A000 +4400 +FC00 +0000 +2000 +5000 +5000 +2000 +0000 +01E0 +0310 +0290 +0110 +0010 +0010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR 0065 +ENCODING 60910 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 11 18 -4 0 +BITMAP +4000 +4000 +4000 +0000 +4000 +A000 +A000 +4000 +0000 +03C0 +0620 +0520 +0220 0020 0020 0020 0020 0020 ENDCHAR -STARTCHAR 0x22A4 -ENCODING 8868 -SWIDTH 780 0 -DWIDTH 13 0 -BBX 11 11 1 0 +STARTCHAR C070 +ENCODING 60911 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 11 0 0 BITMAP -FFE0 -0400 -0400 -0400 -0400 -0400 -0400 -0400 -0400 -0400 -0400 +FF80 +2080 +2080 +2000 +7F00 +2000 +7F00 +2000 +2000 +2000 +F800 ENDCHAR -STARTCHAR 0x22A5 -ENCODING 8869 -SWIDTH 780 0 -DWIDTH 13 0 -BBX 11 11 1 0 +STARTCHAR GEORGIAN CAPITAL LETTER FI +ENCODING 61638 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 11 11 0 0 BITMAP -0400 -0400 -0400 -0400 -0400 -0400 +0E00 0400 0400 +3F80 +4440 +8420 +4440 +3F80 0400 0400 -FFE0 +0E00 ENDCHAR -STARTCHAR 0x22A6 -ENCODING 8870 +STARTCHAR char4343 +ENCODING 61687 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 11 1 -4 +BITMAP +70 +88 +C8 +08 +10 +20 +40 +80 +98 +88 +70 +ENDCHAR +STARTCHAR char4344 +ENCODING 61688 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 6 9 1 0 +BITMAP +30 +48 +40 +20 +18 +44 +84 +84 +78 +ENDCHAR +STARTCHAR space +ENCODING 61952 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 0 0 0 0 +BITMAP +ENDCHAR +STARTCHAR Ethspace +ENCODING 61953 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 2 6 2 2 +BITMAP +C0 +C0 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR comma +ENCODING 61954 SWIDTH 480 0 DWIDTH 8 0 -BBX 6 11 1 0 +BBX 6 7 1 2 BITMAP -80 -80 -80 -80 -80 FC -80 -80 -80 -80 -80 +00 +30 +30 +00 +30 +30 ENDCHAR -STARTCHAR 0x22A7 -ENCODING 8871 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 7 12 1 0 +STARTCHAR semicolon +ENCODING 61955 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 6 9 1 1 BITMAP -80 -80 -80 -80 -FE -80 -80 -FE -80 -80 -80 -80 +FC +00 +30 +30 +00 +30 +30 +00 +FC ENDCHAR -STARTCHAR 0x22A8 -ENCODING 8872 -SWIDTH 780 0 -DWIDTH 13 0 -BBX 11 12 1 0 +STARTCHAR preface-colon +ENCODING 61956 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 6 7 1 2 BITMAP -8000 -8000 -8000 -8000 -FFE0 -8000 -8000 -FFE0 -8000 -8000 -8000 -8000 +C0 +C0 +00 +7C +00 +C0 +C0 ENDCHAR -STARTCHAR 0x22A9 -ENCODING 8873 -SWIDTH 780 0 -DWIDTH 13 0 -BBX 11 11 1 0 +STARTCHAR colon +ENCODING 61957 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 6 7 1 2 BITMAP -9000 -9000 -9000 -9000 -9000 -9FE0 -9000 -9000 -9000 -9000 -9000 +30 +30 +00 +FC +00 +30 +30 +ENDCHAR +STARTCHAR period +ENCODING 61958 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 6 6 1 2 +BITMAP +CC +CC +00 +00 +CC +CC ENDCHAR -STARTCHAR 0x22AA -ENCODING 8874 -SWIDTH 780 0 -DWIDTH 13 0 -BBX 11 11 1 0 +STARTCHAR questionmark +ENCODING 61959 +SWIDTH 240 0 +DWIDTH 4 0 +BBX 2 10 1 1 BITMAP -9200 -9200 -9200 -9200 -9200 -93E0 -9200 -9200 -9200 -9200 -9200 +C0 +C0 +00 +00 +C0 +C0 +00 +00 +C0 +C0 ENDCHAR -STARTCHAR 0x22AB -ENCODING 8875 -SWIDTH 780 0 -DWIDTH 13 0 -BBX 11 12 1 0 +STARTCHAR paragraph +ENCODING 61960 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 8 9 1 1 BITMAP -9000 -9000 -9000 -9000 -9FE0 -9000 -9000 -9FE0 -9000 -9000 -9000 -9000 +18 +18 +C3 +DB +18 +C3 +C3 +18 +18 ENDCHAR -STARTCHAR 0x22AC -ENCODING 8876 -SWIDTH 780 0 -DWIDTH 13 0 -BBX 11 14 1 -2 +STARTCHAR gemination +ENCODING 61961 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 7 2 1 11 BITMAP -0080 -8080 -8100 -8100 -8200 -8200 -FFE0 -8400 -8800 -8800 -9000 -9000 -2000 -2000 +C6 +C6 ENDCHAR -STARTCHAR 0x22AD -ENCODING 8877 -SWIDTH 780 0 -DWIDTH 13 0 -BBX 11 16 1 -2 +STARTCHAR left-quote +ENCODING 61962 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 7 6 2 3 BITMAP -0080 -0080 -8100 -8100 -8200 -8200 -FFE0 -8400 -8400 -FFE0 -8800 -8800 -9000 -9000 -2000 -2000 +36 +6C +D8 +D8 +6C +36 ENDCHAR -STARTCHAR 0x22AE -ENCODING 8878 -SWIDTH 780 0 -DWIDTH 13 0 -BBX 11 14 1 -2 +STARTCHAR right-quote +ENCODING 61963 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 7 6 1 3 BITMAP -0040 -9040 -9080 -9080 -9100 -9100 -9FE0 -9200 -9400 -9400 -9800 -9800 -1000 -1000 +D8 +6C +36 +36 +6C +D8 ENDCHAR -STARTCHAR 0x22AF -ENCODING 8879 -SWIDTH 780 0 -DWIDTH 13 0 -BBX 11 16 1 -2 +STARTCHAR and +ENCODING 61964 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 9 13 0 -1 BITMAP -0040 -0040 -9080 -9080 -9100 -9100 -9FE0 -9200 -9200 -9FE0 -9400 -9400 -9800 -9800 -1000 -1000 +C180 +7F00 +0000 +0C00 +0C00 +1800 +3E00 +6300 +6300 +3E00 +0000 +7F00 +C180 ENDCHAR -STARTCHAR 0x22B0 -ENCODING 8880 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 8 11 1 1 +STARTCHAR hulet +ENCODING 61965 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 9 13 0 -1 BITMAP -02 -05 -01 -06 -38 -C0 -38 -06 -01 -05 -02 +C180 +7F00 +0000 +1C00 +3600 +6600 +7C00 +6000 +7C00 +3600 +1C00 +7F00 +C180 ENDCHAR -STARTCHAR 0x22B1 -ENCODING 8881 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 8 11 1 1 +STARTCHAR sost +ENCODING 61966 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 8 12 0 -1 BITMAP -40 -A0 -80 +C3 +7E +00 +7E +66 60 -1C -03 -1C 60 -80 -A0 -40 +60 +60 +00 +7E +C3 ENDCHAR -STARTCHAR 0x22B2 -ENCODING 8882 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 9 6 1 3 +STARTCHAR arat +ENCODING 61967 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 8 12 0 -1 BITMAP -0380 -1C80 -E080 -E080 -1C80 -0380 +C3 +7E +00 +3C +66 +66 +66 +66 +3C +00 +7E +C3 ENDCHAR -STARTCHAR 0x22B3 -ENCODING 8883 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 9 6 1 3 +STARTCHAR amst +ENCODING 61968 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 9 13 0 -1 BITMAP -E000 -9C00 -8380 -8380 -9C00 -E000 +C180 +7F00 +0000 +1800 +1800 +3F00 +7300 +6000 +6300 +3F00 +0000 +7F00 +C180 ENDCHAR -STARTCHAR 0x22B4 -ENCODING 8884 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 9 9 1 0 +STARTCHAR sadst +ENCODING 61969 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 9 14 0 -1 BITMAP -0380 -1C80 -E080 -E080 -1C80 -0380 +C180 +7F00 0000 +3C00 +7E00 +6600 +0600 +0C00 +0E00 +1B00 +1E00 0000 -FF80 +7F00 +C180 ENDCHAR -STARTCHAR 0x22B5 -ENCODING 8885 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 9 1 0 +STARTCHAR sabat +ENCODING 61970 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 9 14 0 -1 BITMAP -E000 -9C00 -8380 -8380 -9C00 -E000 +C180 +7F00 0000 +3C00 +7E00 +6600 +0600 +0C00 +0800 +1900 +1F00 0000 -FF80 +7F00 +C180 ENDCHAR -STARTCHAR 0x22B6 -ENCODING 8886 -SWIDTH 900 0 -DWIDTH 15 0 -BBX 14 5 1 3 +STARTCHAR smnt +ENCODING 61971 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 10 13 0 -1 BITMAP -6018 -903C -9FFC -903C -6018 +C0C0 +7F80 +0000 +7F80 +6D80 +0C00 +0C00 +0C00 +7F80 +6180 +0000 +7F80 +C0C0 ENDCHAR -STARTCHAR 0x22B7 -ENCODING 8887 -SWIDTH 900 0 -DWIDTH 15 0 -BBX 14 5 1 3 +STARTCHAR zeteN +ENCODING 61972 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 8 13 0 -1 BITMAP -6018 -F024 -FFE4 -F024 -6018 +C3 +7E +00 +00 +66 +66 +7E +66 +64 +38 +00 +7E +C3 ENDCHAR -STARTCHAR 0x22B8 -ENCODING 8888 -SWIDTH 780 0 -DWIDTH 13 0 -BBX 11 5 1 3 +STARTCHAR asr +ENCODING 61973 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 8 12 0 -1 BITMAP -00C0 -0120 -FF20 -0120 -00C0 +C3 +7E +00 +18 +18 +18 +18 +18 +18 +00 +7E +C3 ENDCHAR -STARTCHAR 0x22B9 -ENCODING 8889 -SWIDTH 900 0 -DWIDTH 15 0 -BBX 13 13 1 0 +STARTCHAR heya +ENCODING 61974 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 10 12 0 -1 BITMAP -0200 -0200 -0200 -0200 -0200 +C0C0 +7F80 0000 -F8F8 +3F00 +2D00 +0C00 +1E00 +3300 +3300 0000 -0200 -0200 -0200 -0200 -0200 -ENDCHAR -STARTCHAR 0x22BA -ENCODING 8890 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 7 11 1 0 -BITMAP -FE -10 -10 -10 -10 -10 -10 -10 -10 -10 -10 +7F80 +C0C0 ENDCHAR -STARTCHAR 0x22BB -ENCODING 8891 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 7 9 1 2 +STARTCHAR selasa +ENCODING 61975 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 10 12 0 -1 BITMAP -82 -82 -44 -44 -28 -28 -10 -00 -FE +C0C0 +7F80 +0000 +2F00 +6D80 +6D80 +6D80 +6D80 +3980 +0000 +7F80 +C0C0 ENDCHAR -STARTCHAR 0x22BC -ENCODING 8892 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 7 9 1 2 +STARTCHAR arba +ENCODING 61976 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 10 13 0 -1 BITMAP -FE -00 -10 -28 -28 -44 -44 -82 -82 +C0C0 +7F80 +0000 +6D80 +6D80 +6D80 +3F80 +0180 +0180 +0180 +0000 +7F80 +C0C0 ENDCHAR -STARTCHAR 0x22BD -ENCODING 8893 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 7 9 1 2 +STARTCHAR hemsa +ENCODING 61977 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 8 13 0 -1 BITMAP -FE +C3 +7E 00 -82 -82 -44 -44 -28 -28 -10 +3E +66 +3E +06 +0C +0C +0C +00 +7E +C3 ENDCHAR -STARTCHAR 0x22BE -ENCODING 8894 -SWIDTH 780 0 -DWIDTH 13 0 -BBX 11 11 1 0 +STARTCHAR slsa +ENCODING 61978 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 10 13 0 -1 BITMAP -8000 -8000 -8000 -E000 -9800 -8400 -8200 -8200 -8100 -8100 -FFE0 +C0C0 +7F80 +0000 +7F80 +6D80 +0C00 +0E00 +0600 +7F80 +6180 +0000 +7F80 +C0C0 ENDCHAR -STARTCHAR 0x22BF -ENCODING 8895 -SWIDTH 780 0 -DWIDTH 13 0 -BBX 11 11 1 0 +STARTCHAR seba +ENCODING 61979 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 8 12 0 -1 BITMAP -0020 -0060 -00A0 -0120 -0220 -0420 -0820 -1020 -2020 -4020 -FFE0 +C3 +7E +00 +3E +6B +6E +60 +66 +3E +00 +7E +C3 ENDCHAR -STARTCHAR 0x22C0 -ENCODING 8896 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 9 8 1 3 +STARTCHAR semanya +ENCODING 61980 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 11 12 0 -1 BITMAP -0800 -1C00 -3600 -3600 -6300 -6300 -C180 -C180 +C060 +7FC0 +0000 +7FC0 +5B40 +1B00 +1B00 +1B00 +1B00 +0000 +7FC0 +C060 ENDCHAR -STARTCHAR 0x22C1 -ENCODING 8897 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 9 8 1 3 +STARTCHAR zeTana +ENCODING 61981 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 9 14 0 -1 BITMAP -C180 C180 -6300 -6300 -3600 +7F00 +0000 +3E00 3600 -1C00 -0800 +0C00 +0E00 +0600 +0C00 +0C00 +0C00 +0000 +7F00 +C180 ENDCHAR -STARTCHAR 0x22C2 -ENCODING 8898 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 7 9 1 3 +STARTCHAR meto +ENCODING 61982 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 8 13 0 -1 BITMAP -38 +C3 +7E +00 +3C +66 7C -C6 +60 +30 +30 +30 +00 +7E +C3 +ENDCHAR +STARTCHAR asr-xi +ENCODING 61983 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 12 13 0 -1 +BITMAP +C030 +7FE0 +0000 +79E0 +CF30 +FBE0 +C300 +6180 +6180 +6180 +0000 +7FE0 +C030 +ENDCHAR +STARTCHAR he +ENCODING 61984 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 8 11 0 0 +BITMAP +07 +C3 +C3 +C3 +C3 +C3 +C3 C6 C6 +7C +38 +ENDCHAR +STARTCHAR hu +ENCODING 61985 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 12 11 0 0 +BITMAP +0700 +C300 +C300 +C300 +C3F0 +C330 +C300 +C600 +C600 +7C00 +3800 +ENDCHAR +STARTCHAR hi +ENCODING 61986 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 8 12 0 0 +BITMAP +66 C6 C6 C6 C6 +7C +3C +0C +18 +30 +33 +3F ENDCHAR -STARTCHAR 0x22C3 -ENCODING 8899 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 7 9 1 3 +STARTCHAR ha +ENCODING 61987 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 7 12 0 0 BITMAP +66 +C6 C6 C6 C6 +7C +3C +0C +18 +30 +30 +30 +ENDCHAR +STARTCHAR hE +ENCODING 61988 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 7 12 0 0 +BITMAP +66 C6 C6 C6 C6 7C -38 -ENDCHAR -STARTCHAR 0x22C4 -ENCODING 8900 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 5 10 1 2 -BITMAP -20 -20 -50 -50 -88 -88 -50 -50 -20 -20 -ENDCHAR -STARTCHAR 0x22C5 -ENCODING 8901 -SWIDTH 240 0 -DWIDTH 4 0 -BBX 2 2 1 5 -BITMAP -C0 -C0 -ENDCHAR -STARTCHAR 0x22C6 -ENCODING 8902 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 5 5 1 4 -BITMAP -20 -20 -F8 -70 -D8 +3C +0C +1C +34 +32 +3E ENDCHAR -STARTCHAR 0x22C7 -ENCODING 8903 -SWIDTH 780 0 -DWIDTH 13 0 -BBX 11 11 1 0 +STARTCHAR h +ENCODING 61989 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 9 11 0 0 BITMAP -8420 -4E40 -2480 -1100 -0A00 -FFE0 -0A00 -1100 -2480 -4E40 -8420 +C380 +C180 +E180 +7180 +3180 +6180 +6180 +6180 +6300 +3F00 +1E00 ENDCHAR -STARTCHAR 0x22C8 -ENCODING 8904 -SWIDTH 780 0 -DWIDTH 13 0 -BBX 11 11 1 0 +STARTCHAR ho +ENCODING 61990 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 11 11 0 0 BITMAP -8020 -C060 -A0A0 -9120 -8A20 -8420 -8A20 -9120 -A0A0 -C060 -8020 +03C0 +C320 +C360 +C380 +C300 +C300 +C300 +C600 +C600 +7C00 +3800 ENDCHAR -STARTCHAR 0x22C9 -ENCODING 8905 -SWIDTH 780 0 -DWIDTH 13 0 -BBX 11 11 1 0 +STARTCHAR le +ENCODING 61992 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 7 12 0 0 BITMAP -8020 -C040 -A080 -9100 -8A00 -8400 -8A00 -9100 -A080 -C040 -8020 +30 +30 +30 +78 +7C +CE +C6 +C6 +C6 +C6 +C6 +C6 ENDCHAR -STARTCHAR 0x22CA -ENCODING 8906 -SWIDTH 780 0 -DWIDTH 13 0 -BBX 11 11 1 0 +STARTCHAR lu +ENCODING 61993 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 11 12 0 0 BITMAP -8020 -4060 -20A0 -1120 -0A20 -0420 -0A20 -1120 -20A0 -4060 -8020 +3000 +3000 +3000 +7800 +7C00 +CE00 +C600 +C600 +C7E0 +C660 +C600 +C600 ENDCHAR -STARTCHAR 0x22CB -ENCODING 8907 -SWIDTH 780 0 -DWIDTH 13 0 -BBX 11 11 1 0 +STARTCHAR li +ENCODING 61994 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 11 12 0 0 BITMAP -8000 -4000 -2000 -1000 -0800 -0400 -0A00 -1100 -2080 -4040 -8020 +3000 +3000 +3000 +7800 +7C00 +CE00 +C600 +C600 +C600 +C600 +C660 +C7E0 ENDCHAR -STARTCHAR 0x22CC -ENCODING 8908 -SWIDTH 780 0 -DWIDTH 13 0 -BBX 11 11 1 0 +STARTCHAR la +ENCODING 61995 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 7 12 0 0 BITMAP -0020 -0040 -0080 -0100 -0200 -0400 -0A00 -1100 -2080 -4040 -8020 +30 +30 +30 +78 +7C +CE +C6 +C6 +C6 +06 +06 +06 ENDCHAR -STARTCHAR 0x22CD -ENCODING 8909 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 10 4 1 4 +STARTCHAR lE +ENCODING 61996 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 11 12 0 0 BITMAP -8780 -7840 -0000 -FFC0 +3000 +3000 +3000 +7800 +7C00 +CE00 +C600 +C600 +C600 +C7C0 +C660 +C7C0 ENDCHAR -STARTCHAR 0x22CE -ENCODING 8910 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 9 9 1 2 +STARTCHAR l +ENCODING 61997 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 8 12 0 0 BITMAP -8080 -4100 -2200 -2200 -1400 -1400 -1400 -0800 -0800 -ENDCHAR -STARTCHAR 0x22CF -ENCODING 8911 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 9 9 1 2 +18 +18 +18 +3C +3E +67 +63 +C3 +C3 +F3 +DB +F3 +ENDCHAR +STARTCHAR lo +ENCODING 61998 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 12 12 0 0 BITMAP -0800 -0800 -1400 -1400 -1400 -2200 -2200 -4100 -8080 +3000 +3000 +3000 +7800 +7C00 +CE00 +C600 +C7E0 +C6B0 +C6E0 +C600 +C600 ENDCHAR -STARTCHAR 0x22D0 -ENCODING 8912 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 8 9 1 2 +STARTCHAR lWa +ENCODING 61999 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 10 14 0 -2 BITMAP -3F -40 -9F -A0 -A0 -A0 -9F -40 -3F +3000 +3000 +3000 +7800 +7C00 +CE00 +C600 +C600 +C600 +0600 +0600 +0600 +1F80 +30C0 ENDCHAR -STARTCHAR 0x22D1 -ENCODING 8913 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 8 9 1 2 +STARTCHAR He +ENCODING 62000 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 10 12 0 0 BITMAP -FC -02 -F9 -05 -05 -05 -F9 -02 -FC +0C00 +0C00 +0C00 +0C00 +0C00 +3F00 +6D80 +6D80 +CCC0 +CCC0 +CCC0 +CCC0 ENDCHAR -STARTCHAR 0x22D2 -ENCODING 8914 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 8 11 1 0 +STARTCHAR Hu +ENCODING 62001 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 14 12 0 0 BITMAP -3C -42 -99 -A5 -A5 -A5 -A5 -A5 -A5 -A5 -A5 +0C00 +0C00 +0C00 +0C00 +0C00 +3F00 +6D80 +6D80 +CCFC +CCCC +CCC0 +CCC0 ENDCHAR -STARTCHAR 0x22D3 -ENCODING 8915 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 8 11 1 0 +STARTCHAR Hi +ENCODING 62002 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 14 12 0 0 BITMAP -A5 -A5 -A5 -A5 -A5 -A5 -A5 -A5 -99 -42 -3C +0C00 +0C00 +0C00 +0C00 +0C00 +3F00 +6D80 +6D80 +CCC0 +CCC0 +CCCC +CCFC ENDCHAR -STARTCHAR 0x22D4 -ENCODING 8916 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 7 13 1 0 +STARTCHAR Ha +ENCODING 62003 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 10 12 0 0 BITMAP -10 -10 -10 -38 -54 -92 -92 -92 -92 -92 -92 -92 -92 +0C00 +0C00 +0C00 +0C00 +0C00 +3F00 +6D80 +6D80 +CCC0 +00C0 +00C0 +00C0 ENDCHAR -STARTCHAR 0x22D5 -ENCODING 8917 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 9 12 1 0 +STARTCHAR HE +ENCODING 62004 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 13 12 0 0 BITMAP -1400 -1400 -1400 -1400 -FF80 -1400 -1400 -FF80 -1400 -1400 -1400 -1400 +0C00 +0C00 +0C00 +0C00 +0C00 +3F00 +6D80 +6D80 +CC80 +CCF0 +CC98 +CCF0 ENDCHAR -STARTCHAR 0x22D6 -ENCODING 8918 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 9 7 1 4 +STARTCHAR H +ENCODING 62005 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 10 12 0 0 BITMAP -0380 -1C00 -6200 -8700 -6200 -1C00 -0380 +3000 +3000 +3000 +3C00 +0C00 +3F00 +6D80 +6D80 +CCC0 +CCC0 +CCC0 +CCC0 ENDCHAR -STARTCHAR 0x22D7 -ENCODING 8919 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 9 7 1 4 +STARTCHAR Ho +ENCODING 62006 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 10 12 0 0 BITMAP -E000 -1C00 -2300 -7080 -2300 -1C00 -E000 +0C00 +0C00 +0C00 +0C00 +0C00 +3F00 +6D80 +6D80 +CCC0 +C000 +C000 +C000 ENDCHAR -STARTCHAR 0x22D8 -ENCODING 8920 -SWIDTH 1140 0 -DWIDTH 19 0 -BBX 17 7 1 3 +STARTCHAR me +ENCODING 62008 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 12 8 0 2 BITMAP -063180 -18C600 -631800 -842000 -631800 -18C600 -063180 +3FF0 +7FF0 +4490 +C590 +8D10 +9930 +F1E0 +F1C0 ENDCHAR -STARTCHAR 0x22D9 -ENCODING 8921 -SWIDTH 1140 0 -DWIDTH 19 0 -BBX 17 7 1 3 +STARTCHAR mu +ENCODING 62009 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 15 8 0 2 BITMAP -C63000 -318C00 -0C6300 -021080 -0C6300 -318C00 -C63000 +3FF0 +7FF0 +4490 +C59E +8D12 +9932 +F1E0 +F1C0 ENDCHAR -STARTCHAR 0x22DA -ENCODING 8922 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 7 13 1 1 +STARTCHAR mi +ENCODING 62010 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 14 12 0 0 BITMAP -0E -70 -80 -70 -0E -00 -FE -00 -E0 -1C -02 -1C -E0 +3FF0 +7FF0 +C510 +8510 +8A10 +FBF0 +71F0 +0020 +0020 +0040 +004C +007C ENDCHAR -STARTCHAR 0x22DB -ENCODING 8923 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 7 13 1 1 +STARTCHAR ma +ENCODING 62011 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 12 12 0 0 BITMAP -E0 -1C -02 -1C -E0 -00 -FE -00 -0E -70 -80 -70 -0E +3FF0 +7FF0 +C510 +8510 +8A10 +FBF0 +71F0 +0020 +0020 +0040 +0040 +0040 ENDCHAR -STARTCHAR 0x22DC -ENCODING 8924 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 7 9 1 2 +STARTCHAR mE +ENCODING 62012 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 14 12 0 0 BITMAP -FE -00 -06 -18 -60 -80 -60 -18 -06 +3FF0 +7FF0 +C510 +8510 +8A10 +FBF0 +71F0 +0020 +0020 +0078 +004C +0078 ENDCHAR -STARTCHAR 0x22DD -ENCODING 8925 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 7 9 1 2 +STARTCHAR m +ENCODING 62013 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 11 12 0 0 BITMAP -FE -00 -C0 -30 -0C -02 -0C -30 -C0 +7FC0 +7FE0 +CA20 +8A20 +8A20 +8BE0 +F9C0 +7800 +0800 +1800 +3000 +6000 ENDCHAR -STARTCHAR 0x22DE -ENCODING 8926 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 11 1 0 +STARTCHAR mo +ENCODING 62014 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 11 12 0 0 BITMAP -0100 -0200 -0480 -3900 -C600 -3800 -C000 -3800 -0600 -0100 -0080 +7FC0 +7FE0 +CA20 +8A20 +8A20 +8BE0 +F9C0 +7800 +0800 +1000 +1000 +1000 ENDCHAR -STARTCHAR 0x22DF -ENCODING 8927 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 11 1 0 +STARTCHAR mWa +ENCODING 62015 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 13 14 0 -2 BITMAP -4000 -2000 -9000 -4E00 -3180 -0E00 -0180 -0E00 -3000 -4000 -8000 +3FF0 +7FF0 +C510 +8510 +8A10 +FBF0 +71F0 +0020 +0020 +0060 +0040 +0040 +03F0 +0618 ENDCHAR -STARTCHAR 0x22E0 -ENCODING 8928 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 12 1 0 +STARTCHAR `se/s2e +ENCODING 62016 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 10 9 0 1 BITMAP -0400 -0480 -0500 -0E00 -3800 -C800 -3800 -D600 -3900 -1480 -1200 -0100 +4CC0 +CCC0 +CCC0 +CCC0 +CCC0 +CD80 +CF80 +6C00 +3C00 ENDCHAR -STARTCHAR 0x22E1 -ENCODING 8929 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 9 11 1 0 +STARTCHAR `su/s2u +ENCODING 62017 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 13 9 0 1 BITMAP -8200 -4200 -3400 -0E00 -0980 -0E00 -3180 -5E00 -9000 -2000 -6000 +4D80 +CD80 +CDF8 +CD98 +CD80 +CD80 +CF80 +6C00 +3C00 ENDCHAR -STARTCHAR 0x22E2 -ENCODING 8930 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 8 16 1 -2 +STARTCHAR `si/s2i +ENCODING 62018 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 14 12 0 0 BITMAP -02 -02 -FF -84 -84 -84 -88 -88 -88 -88 -90 -FF -10 -FF -20 -20 +CC80 +CCC0 +CCC0 +CCC0 +CCC0 +EDC0 +7FC0 +00C0 +00C0 +00C0 +00CC +00FC ENDCHAR -STARTCHAR 0x22E3 -ENCODING 8931 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 8 16 1 -2 +STARTCHAR `sa/s2a +ENCODING 62019 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 10 12 0 0 BITMAP -40 -40 -FF -21 -21 -21 -11 -11 -11 -11 -09 -FF -08 -FF -04 -04 +CC80 +CCC0 +CCC0 +CCC0 +CCC0 +EDC0 +7FC0 +00C0 +00C0 +00C0 +00C0 +00C0 ENDCHAR -STARTCHAR 0x22E4 -ENCODING 8932 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 8 13 1 -1 +STARTCHAR `sE/s2E +ENCODING 62020 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 12 12 0 0 BITMAP -FF -80 -80 -80 -80 -80 -80 -80 -80 -FF -08 -FF -20 +CC80 +CCC0 +CCC0 +CCC0 +CCC0 +EDC0 +7FC0 +00C0 +00C0 +00E0 +0190 +01E0 ENDCHAR -STARTCHAR 0x22E5 -ENCODING 8933 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 8 13 1 -1 +STARTCHAR `s/s2 +ENCODING 62021 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 10 12 0 0 BITMAP -FF -01 -01 -01 -01 -01 -01 -01 -01 -FF -08 -FF -10 +CC80 +CCC0 +CCC0 +CCC0 +CCC0 +EDC0 +FF80 +E000 +C000 +C000 +C000 +C000 ENDCHAR -STARTCHAR 0x22E6 -ENCODING 8934 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 8 11 1 0 +STARTCHAR `so/s2o +ENCODING 62022 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 10 12 0 0 BITMAP -06 -18 -60 -80 -60 -18 -06 -04 -79 -9E -20 +CCC0 +CCC0 +CCC0 +CCC0 +CCC0 +EDC0 +7F80 +1C00 +1800 +3800 +7000 +6000 ENDCHAR -STARTCHAR 0x22E7 -ENCODING 8935 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 8 11 1 0 +STARTCHAR re +ENCODING 62024 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 8 12 0 0 BITMAP -60 -18 -06 -01 -06 +0C +0C +0C 18 -60 -04 -79 -9E -20 +38 +70 +E0 +C0 +C0 +E3 +7F +3F ENDCHAR -STARTCHAR 0x22E8 -ENCODING 8936 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 10 13 0 0 +STARTCHAR ru +ENCODING 62025 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 10 12 0 0 BITMAP -0040 -0080 -0300 +0C00 +0C00 1C00 +3800 +7000 6000 -1C00 -0300 -0080 -0040 -0200 -7C40 -8F80 -1000 +C000 +E000 +7FC0 +3FC0 +0600 +0600 ENDCHAR -STARTCHAR 0x22E9 -ENCODING 8937 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 10 13 1 0 +STARTCHAR ri +ENCODING 62026 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 9 12 0 0 BITMAP -8000 -4000 -3000 -0E00 -0180 -0E00 -3000 -4000 -8000 -0200 -7C40 -8F80 -1000 +0C00 +0C00 +0C00 +1800 +3800 +7000 +E000 +C300 +C380 +E180 +7F00 +3E00 ENDCHAR -STARTCHAR 0x22EA -ENCODING 8938 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 9 10 1 1 +STARTCHAR ra +ENCODING 62027 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 11 12 0 0 BITMAP -0200 -0200 -0380 -1C80 -E480 -E480 -1C80 -0B80 -0800 -0800 +0C00 +0C00 +0C00 +1800 +3800 +7000 +E000 +C1E0 +C3E0 +E660 +7E00 +3C00 ENDCHAR -STARTCHAR 0x22EB -ENCODING 8939 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 9 9 1 1 +STARTCHAR rE +ENCODING 62028 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 10 12 0 0 BITMAP -0400 -E400 -9C00 -8B80 -8B80 -9C00 -F000 -1000 -1000 +0C00 +0C00 +0C00 +1800 +3800 +7000 +E000 +C000 +C000 +E780 +7CC0 +3F80 ENDCHAR -STARTCHAR 0x22EC -ENCODING 8940 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 10 13 1 -2 +STARTCHAR r +ENCODING 62029 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 8 11 0 0 BITMAP -0100 -0100 -01C0 -0E40 -7240 -7240 -0E40 -05C0 -0400 -0400 -FFC0 -0800 -0800 +3F +7F +C3 +C0 +C0 +C0 +C0 +C0 +C3 +FF +7E ENDCHAR -STARTCHAR 0x22ED -ENCODING 8941 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 10 12 1 -2 +STARTCHAR ro +ENCODING 62030 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 10 11 0 0 BITMAP -0400 -E400 -9C00 -8B80 -8B80 -9C00 -E800 -1000 -1000 -FFC0 -1000 -2000 +3F80 +7CC0 +C780 +C000 +C000 +C000 +C000 +C000 +C300 +FF00 +7E00 ENDCHAR -STARTCHAR 0x22EE -ENCODING 8942 -SWIDTH 300 0 -DWIDTH 5 0 -BBX 3 11 1 0 +STARTCHAR rWa +ENCODING 62031 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 11 13 0 -2 BITMAP -40 -E0 -40 -00 -40 -E0 -40 -00 -40 -E0 -40 +C0C0 +7380 +0C00 +0C00 +1800 +3800 +7000 +E000 +C1E0 +C3E0 +E660 +7E00 +3C00 ENDCHAR -STARTCHAR 0x22EF -ENCODING 8943 -SWIDTH 780 0 -DWIDTH 13 0 -BBX 11 3 1 5 +STARTCHAR se +ENCODING 62032 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 7 12 0 0 BITMAP -4440 -EEE0 -4440 +10 +10 +38 +7C +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 ENDCHAR -STARTCHAR 0x22F0 -ENCODING 8944 -SWIDTH 780 0 -DWIDTH 13 0 -BBX 11 13 1 0 +STARTCHAR su +ENCODING 62033 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 11 12 0 0 BITMAP -0040 -00E0 -0040 -0000 -0000 -0400 -0E00 -0400 -0000 -0000 -4000 -E000 -4000 +1000 +1000 +3800 +7C00 +C600 +C600 +C600 +C7E0 +C660 +C600 +C600 +C600 ENDCHAR -STARTCHAR 0x22F1 -ENCODING 8945 -SWIDTH 780 0 -DWIDTH 13 0 -BBX 11 13 1 0 +STARTCHAR si +ENCODING 62034 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 11 12 0 0 BITMAP -4000 -E000 -4000 -0000 -0000 -0400 -0E00 -0400 -0000 -0000 -0040 -00E0 -0040 +1000 +1000 +3800 +7C00 +C600 +C600 +C600 +C600 +C600 +C600 +C660 +C7E0 ENDCHAR -STARTCHAR 0x2300 -ENCODING 8960 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 8 8 1 2 +STARTCHAR sa +ENCODING 62035 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 7 12 0 0 BITMAP -3D -42 -85 -89 -91 -A1 -42 -BC +10 +10 +38 +7C +C6 +C6 +C6 +C6 +C6 +06 +06 +06 ENDCHAR -STARTCHAR 0x2302 -ENCODING 8962 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 11 12 1 0 +STARTCHAR sE +ENCODING 62036 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 10 12 0 0 BITMAP -0400 -0A00 -1100 -2080 -4040 -8020 -8020 -8020 -8020 -8020 -8020 -FFE0 +1000 +1000 +3800 +7C00 +C600 +C600 +C600 +C600 +C700 +C680 +C640 +C7C0 ENDCHAR -STARTCHAR 0x2303 -ENCODING 8963 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 7 1 5 +STARTCHAR s +ENCODING 62037 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 8 11 0 0 BITMAP -10 -28 -28 -44 -44 -82 -82 +30 +18 +1C +3E +63 +63 +63 +63 +63 +63 +63 ENDCHAR -STARTCHAR 0x2304 -ENCODING 8964 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 7 1 0 +STARTCHAR so +ENCODING 62038 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 7 12 0 0 BITMAP -82 -82 -44 -44 -28 -28 10 +10 +38 +7C +C6 +C6 +C6 +C6 +C6 +C0 +C0 +C0 ENDCHAR -STARTCHAR 0x2305 -ENCODING 8965 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 9 1 2 +STARTCHAR sWa +ENCODING 62039 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 10 14 0 -2 BITMAP -FE -00 -10 -28 -28 -44 -44 -82 -82 +1000 +1000 +3800 +7C00 +C600 +C600 +C600 +C600 +C600 +0600 +0600 +0600 +1F80 +30C0 ENDCHAR -STARTCHAR 0x2306 -ENCODING 8966 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 11 1 2 +STARTCHAR xe +ENCODING 62040 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 9 12 0 0 BITMAP -FE -00 -FE -00 -10 -28 -28 -44 -44 -82 -82 +C180 +7F00 +0800 +1C00 +3E00 +6300 +6300 +6300 +6300 +6300 +6300 +6300 ENDCHAR -STARTCHAR 0x2308 -ENCODING 8968 -SWIDTH 300 0 -DWIDTH 5 0 -BBX 4 12 1 0 +STARTCHAR xu +ENCODING 62041 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 12 12 0 0 BITMAP -F0 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 +C180 +7F00 +0800 +1C00 +3E00 +6300 +6300 +63F0 +6330 +6330 +6300 +6300 ENDCHAR -STARTCHAR 0x2309 -ENCODING 8969 -SWIDTH 300 0 -DWIDTH 5 0 -BBX 4 12 1 0 +STARTCHAR xi +ENCODING 62042 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 12 12 0 0 BITMAP -F0 -10 -10 -10 -10 -10 -10 -10 -10 -10 -10 -10 +C180 +7F00 +0800 +1C00 +3E00 +6300 +6300 +6300 +6300 +6300 +6330 +63F0 ENDCHAR -STARTCHAR 0x230A -ENCODING 8970 -SWIDTH 300 0 -DWIDTH 5 0 -BBX 4 12 1 0 +STARTCHAR xa +ENCODING 62043 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 9 12 0 0 BITMAP -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -F0 +C180 +7F00 +0800 +1C00 +3E00 +6300 +6300 +6300 +6300 +0300 +0300 +0300 ENDCHAR -STARTCHAR 0x230B -ENCODING 8971 -SWIDTH 300 0 -DWIDTH 5 0 -BBX 4 12 1 0 +STARTCHAR xE +ENCODING 62044 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 12 12 0 0 BITMAP -10 -10 -10 -10 -10 -10 -10 -10 -10 -10 -10 -F0 +C180 +7F00 +0800 +1C00 +3E00 +6300 +6300 +6300 +6300 +63E0 +6330 +63E0 ENDCHAR -STARTCHAR 0x230C -ENCODING 8972 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 6 6 1 0 +STARTCHAR x +ENCODING 62045 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 9 12 0 0 BITMAP -3C -80 -80 -80 -80 -80 +C300 +7E00 +0C00 +0E00 +1F00 +1980 +3180 +3180 +3180 +3180 +3180 +3180 ENDCHAR -STARTCHAR 0x230D -ENCODING 8973 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 6 6 1 0 +STARTCHAR xo +ENCODING 62046 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 9 12 0 0 BITMAP -F0 -04 -04 -04 -04 -04 +C180 +7F00 +0800 +1C00 +3E00 +6300 +6300 +6300 +6300 +6000 +6000 +6000 ENDCHAR -STARTCHAR 0x230E -ENCODING 8974 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 6 6 1 6 +STARTCHAR xWa +ENCODING 62047 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 11 14 0 -2 BITMAP -80 -80 -80 -80 -80 -3C +C180 +7F00 +0800 +1C00 +3E00 +6300 +6300 +6300 +6300 +6300 +0300 +0300 +0FC0 +1860 ENDCHAR -STARTCHAR 0x230F -ENCODING 8975 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 6 6 1 6 +STARTCHAR qe +ENCODING 62048 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 10 12 0 0 BITMAP -04 -04 -04 -04 -04 -F0 +0C00 +0C00 +0C00 +1F80 +6CC0 +CCC0 +CD80 +7E00 +0C00 +0C00 +0C00 +0C00 ENDCHAR -STARTCHAR 0x2310 -ENCODING 8976 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 6 4 1 2 +STARTCHAR qu +ENCODING 62049 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 10 12 0 0 BITMAP -FC -80 -80 -80 +0C00 +0C00 +0C00 +1F80 +6CC0 +CCC0 +CD80 +7E00 +0C00 +0FC0 +0CC0 +0C00 ENDCHAR -STARTCHAR 0x2400 -ENCODING 9216 -SWIDTH 1140 0 -DWIDTH 19 0 -BBX 17 7 1 3 +STARTCHAR qi +ENCODING 62050 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 10 12 0 0 BITMAP -8A2800 -8A2800 -CA2800 -AA2800 -9A2800 -8A2800 -89CF80 +0C00 +0C00 +0C00 +1F80 +6CC0 +CCC0 +CD80 +7E00 +0C00 +0C00 +0CC0 +0FC0 ENDCHAR -STARTCHAR 0x2401 -ENCODING 9217 -SWIDTH 1140 0 -DWIDTH 19 0 -BBX 17 7 1 3 +STARTCHAR qa +ENCODING 62051 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 10 12 0 0 BITMAP -71C880 -8A2880 -822880 -722F80 -0A2880 -8A2880 -71C880 +0C00 +0C00 +0C00 +1F80 +6CC0 +CCC0 +CD80 +7E00 +0C00 +1800 +3000 +6000 ENDCHAR -STARTCHAR 0x2402 -ENCODING 9218 -SWIDTH 1140 0 -DWIDTH 19 0 -BBX 17 7 1 3 +STARTCHAR qE +ENCODING 62052 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 10 12 0 0 BITMAP -73E880 -888880 -808500 -708200 -088500 -888880 -708880 +0C00 +0C00 +0C00 +1F80 +6CC0 +CCC0 +CD80 +7E00 +0C00 +0F80 +0CC0 +0F80 +ENDCHAR +STARTCHAR q +ENCODING 62053 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 10 12 0 0 +BITMAP +3000 +3000 +3C00 +0C00 +1F80 +6CC0 +CCC0 +CD80 +7E00 +0C00 +0C00 +0C00 ENDCHAR -STARTCHAR 0x2403 -ENCODING 9219 -SWIDTH 1140 0 -DWIDTH 19 0 -BBX 17 7 1 3 +STARTCHAR qo +ENCODING 62054 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 10 12 0 0 BITMAP -FBE880 -808880 -808500 -F08200 -808500 -808880 -F88880 +0700 +0980 +0B00 +0C00 +1F80 +6CC0 +CCC0 +CD80 +7E00 +0C00 +0C00 +0C00 ENDCHAR -STARTCHAR 0x2404 -ENCODING 9220 -SWIDTH 1140 0 -DWIDTH 19 0 -BBX 17 7 1 3 +STARTCHAR qWe +ENCODING 62056 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 11 12 0 0 BITMAP -F9CF80 -822200 -822200 -F22200 -822200 -822200 -F9C200 +0C00 +0C00 +0C00 +1F80 +6CC0 +CCC0 +CD80 +7E00 +0FC0 +0D60 +0DC0 +0C00 ENDCHAR -STARTCHAR 0x2405 -ENCODING 9221 -SWIDTH 1140 0 -DWIDTH 19 0 -BBX 17 8 1 2 +STARTCHAR qWu/qW +ENCODING 62057 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 14 12 0 0 BITMAP -FA2700 -822880 -832880 -F2A880 -826880 -822A80 -FA2700 -000080 +0C00 +0C30 +0C30 +1FFC +6CCC +CCC0 +CD80 +7E00 +0C00 +0C00 +0C00 +0C00 ENDCHAR -STARTCHAR 0x2406 -ENCODING 9222 -SWIDTH 1140 0 -DWIDTH 19 0 -BBX 17 7 1 3 +STARTCHAR qWi +ENCODING 62058 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 14 12 0 0 BITMAP -21C880 -522900 -8A0A00 -8A0C00 -FA0A00 -8A2900 -89C880 +0C00 +0C00 +0C00 +1F80 +6CD8 +CCD8 +CDF8 +7E0C +0C0C +0C00 +0C00 +0C00 ENDCHAR -STARTCHAR 0x2407 -ENCODING 9223 -SWIDTH 1140 0 -DWIDTH 19 0 -BBX 17 7 1 3 +STARTCHAR qWa +ENCODING 62059 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 10 14 0 -2 BITMAP -F3E800 -4A0800 -4A0800 -73C800 -4A0800 -4A0800 -F3EF80 +0C00 +0C00 +0C00 +1F80 +6CC0 +CCC0 +CD80 +7E00 +0C00 +0C00 +0C00 +0C00 +3F00 +6180 ENDCHAR -STARTCHAR 0x2408 -ENCODING 9224 -SWIDTH 780 0 -DWIDTH 13 0 -BBX 11 7 1 3 +STARTCHAR qWE +ENCODING 62060 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 10 14 0 -2 BITMAP -F1C0 -4A20 -4A00 -71C0 -4820 -4A20 -F1C0 +0C00 +0C00 +0C00 +1F80 +6CC0 +CCC0 +CD80 +7E00 +0C00 +0C00 +0F80 +0CC0 +3F80 +6000 ENDCHAR -STARTCHAR 0x2409 -ENCODING 9225 -SWIDTH 780 0 -DWIDTH 13 0 -BBX 11 7 1 3 +STARTCHAR Qe +ENCODING 62064 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 10 12 0 0 BITMAP -8BE0 -8880 -8880 -F880 -8880 -8880 -8880 +6180 +3F00 +0C00 +0C00 +1F80 +6CC0 +CCC0 +CD80 +7E00 +0C00 +0C00 +0C00 ENDCHAR -STARTCHAR 0x240A -ENCODING 9226 -SWIDTH 780 0 -DWIDTH 13 0 -BBX 11 7 1 3 +STARTCHAR Qu +ENCODING 62065 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 10 12 0 0 BITMAP -83E0 -8200 -8200 -83C0 -8200 -8200 -FA00 +6180 +3F00 +0C00 +0C00 +1F80 +6CC0 +CCC0 +CD80 +7E00 +0C00 +0FC0 +0CC0 ENDCHAR -STARTCHAR 0x240B -ENCODING 9227 -SWIDTH 780 0 -DWIDTH 13 0 -BBX 11 7 1 4 +STARTCHAR Qi +ENCODING 62066 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 10 12 0 0 BITMAP -8BE0 -8880 -8880 -5080 -5080 -5080 -2080 +6180 +3F00 +0C00 +0C00 +1F80 +6CC0 +CCC0 +CD80 +7E00 +0C00 +0CC0 +0FC0 ENDCHAR -STARTCHAR 0x240C -ENCODING 9228 -SWIDTH 780 0 -DWIDTH 13 0 -BBX 11 7 1 3 +STARTCHAR Qa +ENCODING 62067 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 10 12 0 0 BITMAP -FBE0 -8200 -8200 -F3C0 -8200 -8200 -8200 +6180 +3F00 +0C00 +0C00 +1F80 +6CC0 +CCC0 +CD80 +7E00 +0C00 +1800 +3000 ENDCHAR -STARTCHAR 0x240D -ENCODING 9229 -SWIDTH 780 0 -DWIDTH 13 0 -BBX 11 7 1 3 +STARTCHAR QE +ENCODING 62068 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 10 12 0 0 BITMAP -73C0 -8A20 -8220 -83C0 -8280 -8A40 -7220 +6180 +3F00 +0C00 +1F80 +6CC0 +CCC0 +CD80 +7E00 +0C00 +0F80 +0CC0 +0F80 ENDCHAR -STARTCHAR 0x240E -ENCODING 9230 -SWIDTH 780 0 -DWIDTH 13 0 -BBX 11 7 1 3 +STARTCHAR Q +ENCODING 62069 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 11 12 0 0 BITMAP -71C0 -8A20 -8220 -7220 -0A20 -8A20 -71C0 +C300 +7E00 +1800 +1E00 +0600 +0FC0 +3660 +6660 +66C0 +3F00 +0600 +0600 ENDCHAR -STARTCHAR 0x240F -ENCODING 9231 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 9 7 1 3 +STARTCHAR Qo +ENCODING 62070 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 10 12 0 0 BITMAP -7380 -8900 -8100 -7100 +60C0 +3F80 0900 -8900 -7380 +0B00 +0C00 +1F80 +6CC0 +CCC0 +CD80 +7E00 +0C00 +0C00 ENDCHAR -STARTCHAR 0x2410 -ENCODING 9232 -SWIDTH 1140 0 -DWIDTH 19 0 -BBX 17 7 1 3 +STARTCHAR QWe +ENCODING 62072 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 11 12 0 0 BITMAP -F20F80 -4A0800 -4A0800 -4A0F00 -4A0800 -4A0800 -F3EF80 +6180 +3F00 +0C00 +1F80 +6CC0 +CCC0 +CD80 +7E00 +0FC0 +0D60 +0DC0 +0C00 ENDCHAR -STARTCHAR 0x2411 -ENCODING 9233 -SWIDTH 1140 0 -DWIDTH 19 0 -BBX 17 7 1 3 +STARTCHAR QWu/QW +ENCODING 62073 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 14 12 0 0 BITMAP -F1C200 -4A2600 -4A0A00 -4A0200 -4A0200 -4A2200 -F1CF80 +6180 +3F00 +0C30 +0C30 +1FFC +6CCC +CCC0 +CD80 +7E00 +0C00 +0C00 +0C00 ENDCHAR -STARTCHAR 0x2412 -ENCODING 9234 -SWIDTH 1140 0 -DWIDTH 19 0 -BBX 17 7 1 3 +STARTCHAR QWi +ENCODING 62074 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 14 12 0 0 BITMAP -F1C700 -4A2880 -4A0080 -4A0300 -4A0400 -4A2800 -F1CF80 +6180 +3F00 +0C00 +0C00 +1F80 +6CD8 +CCD8 +CDF8 +7E0C +0C0C +0C00 +0C00 ENDCHAR -STARTCHAR 0x2413 -ENCODING 9235 -SWIDTH 1140 0 -DWIDTH 19 0 -BBX 17 7 1 3 +STARTCHAR QWa +ENCODING 62075 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 10 14 0 0 BITMAP -F1CF80 -4A2080 -4A0100 -4A0300 -4A0080 -4A2880 -F1C700 +6180 +3F00 +0C00 +0C00 +1F80 +6CC0 +CCC0 +CD80 +7E00 +0C00 +0C00 +0C00 +3F00 +6180 ENDCHAR -STARTCHAR 0x2414 -ENCODING 9236 -SWIDTH 1140 0 -DWIDTH 19 0 -BBX 17 7 1 3 +STARTCHAR QWE +ENCODING 62076 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 10 14 0 -2 BITMAP -F1C100 -4A2300 -4A0500 -4A0900 -4A0F80 -4A2100 -F1C100 +6180 +3F00 +0C00 +0C00 +1F80 +6CC0 +CCC0 +CD80 +7E00 +0C00 +0F80 +0CC0 +3F80 +6000 ENDCHAR -STARTCHAR 0x2415 -ENCODING 9237 -SWIDTH 1140 0 -DWIDTH 19 0 -BBX 17 7 1 3 +STARTCHAR be +ENCODING 62080 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 7 11 0 0 BITMAP -888880 -894900 -CA2A00 -AA2C00 -9BEA00 -8A2900 -8A2880 +38 +7C +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +ENDCHAR +STARTCHAR bu +ENCODING 62081 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 11 11 0 0 +BITMAP +3800 +7C00 +C600 +C600 +C600 +C7E0 +C660 +C660 +C600 +C600 +C600 ENDCHAR -STARTCHAR 0x2416 -ENCODING 9238 -SWIDTH 1140 0 -DWIDTH 19 0 -BBX 17 7 1 3 +STARTCHAR bi +ENCODING 62082 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 11 11 0 0 BITMAP -722880 -8A2880 -814C80 -708A80 -088980 -888880 -708880 +3800 +7C00 +C600 +C600 +C600 +C600 +C600 +C600 +C600 +C660 +C7E0 ENDCHAR -STARTCHAR 0x2417 -ENCODING 9239 -SWIDTH 1140 0 -DWIDTH 19 0 -BBX 17 7 1 3 +STARTCHAR ba +ENCODING 62083 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 7 11 0 0 BITMAP -FBEF00 -808480 -808480 -F08700 -808480 -808480 -F88F00 +38 +7C +C6 +C6 +C6 +C6 +C6 +06 +06 +06 +06 ENDCHAR -STARTCHAR 0x2418 -ENCODING 9240 -SWIDTH 1140 0 -DWIDTH 19 0 -BBX 17 7 1 3 +STARTCHAR bE +ENCODING 62084 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 11 11 0 0 BITMAP -708880 -894880 -822C80 -822A80 -83E980 -8A2880 -722880 +3800 +7C00 +C600 +C600 +C600 +C600 +C600 +C600 +C7C0 +C660 +C7C0 ENDCHAR -STARTCHAR 0x2419 -ENCODING 9241 -SWIDTH 780 0 -DWIDTH 13 0 -BBX 11 7 1 3 +STARTCHAR b +ENCODING 62085 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 11 11 0 0 BITMAP -FA20 -8220 -8360 -F2A0 -8220 -8220 -FA20 +0380 +07C0 +0C60 +0C60 +0C60 +FC60 +CC60 +CC60 +0C60 +0C60 +0C60 ENDCHAR -STARTCHAR 0x241A -ENCODING 9242 -SWIDTH 1140 0 -DWIDTH 19 0 -BBX 17 7 1 3 +STARTCHAR bo +ENCODING 62086 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 7 11 0 0 BITMAP -722F00 -8A2480 -822480 -722700 -0A2480 -8A2480 -71CF00 +38 +7C +C6 +C6 +C6 +C6 +C6 +C0 +C0 +C0 +C0 ENDCHAR -STARTCHAR 0x241B -ENCODING 9243 -SWIDTH 1140 0 -DWIDTH 19 0 -BBX 17 7 1 3 +STARTCHAR bWa +ENCODING 62087 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 10 13 0 -2 BITMAP -F9C700 -822880 -820800 -F1C800 -802800 -822880 -F9C700 +3800 +7C00 +C600 +C600 +C600 +C600 +C600 +0600 +0600 +0600 +0600 +1F80 +30C0 ENDCHAR -STARTCHAR 0x241C -ENCODING 9244 -SWIDTH 780 0 -DWIDTH 13 0 -BBX 11 7 1 3 +STARTCHAR ve +ENCODING 62088 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 9 12 0 0 BITMAP -F9C0 -8220 -8200 -F1C0 -8020 -8220 -81C0 +C180 +7F00 +0000 +1C00 +3E00 +6300 +6300 +6300 +6300 +6300 +6300 +6300 ENDCHAR -STARTCHAR 0x241D -ENCODING 9245 -SWIDTH 780 0 -DWIDTH 13 0 -BBX 11 7 1 3 +STARTCHAR vu +ENCODING 62089 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 12 12 0 0 BITMAP -71C0 -8A20 -8200 -81C0 -9820 -8A20 -71C0 +C180 +7F00 +0000 +1C00 +3E00 +6300 +6300 +63F0 +6330 +6330 +6300 +6300 ENDCHAR -STARTCHAR 0x241E -ENCODING 9246 -SWIDTH 780 0 -DWIDTH 13 0 -BBX 11 7 1 3 +STARTCHAR vi +ENCODING 62090 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 12 12 0 0 BITMAP -F1C0 -8A20 -8A00 -F1C0 -A020 -9220 -89C0 +C180 +7F00 +0000 +1C00 +3E00 +6300 +6300 +6300 +6300 +6300 +6330 +63F0 ENDCHAR -STARTCHAR 0x241F -ENCODING 9247 -SWIDTH 780 0 -DWIDTH 13 0 -BBX 11 7 1 3 +STARTCHAR va +ENCODING 62091 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 9 12 0 0 BITMAP -89C0 -8A20 -8A00 -89C0 -8820 -8A20 -71C0 +C180 +7F00 +0000 +1C00 +3E00 +6300 +6300 +6300 +6300 +6300 +0300 +0300 ENDCHAR -STARTCHAR 0x2420 -ENCODING 9248 -SWIDTH 780 0 -DWIDTH 13 0 -BBX 11 7 1 3 +STARTCHAR vE +ENCODING 62092 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 12 12 0 0 BITMAP -73C0 -8A20 -8220 -73C0 -0A00 -8A00 -7200 +C180 +7F00 +0000 +1C00 +3E00 +6300 +6300 +6300 +6300 +63E0 +6330 +63E0 ENDCHAR -STARTCHAR 0x2421 -ENCODING 9249 -SWIDTH 1140 0 -DWIDTH 19 0 -BBX 17 7 1 3 +STARTCHAR v +ENCODING 62093 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 12 12 0 0 BITMAP -F3E800 -4A0800 -4A0800 -4BC800 -4A0800 -4A0800 -F3EF80 +1830 +0FE0 +0000 +0380 +07C0 +0C60 +0C60 +FC60 +CC60 +CC60 +0C60 +0C60 ENDCHAR -STARTCHAR 0x2422 -ENCODING 9250 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 6 13 1 -3 +STARTCHAR vo +ENCODING 62094 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 9 12 0 0 BITMAP -C8 -48 -48 -78 -54 -54 -54 -64 -64 -78 -20 -40 -40 +C180 +7F00 +0000 +1C00 +3E00 +6300 +6300 +6300 +6300 +6300 +6000 +6000 ENDCHAR -STARTCHAR 0x2423 -ENCODING 9251 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 9 3 1 -2 +STARTCHAR vWa +ENCODING 62095 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 11 14 0 -2 BITMAP -8080 -8080 -FF80 +C180 +7F00 +0000 +1C00 +3E00 +6300 +6300 +6300 +6300 +6300 +0300 +0300 +0FC0 +1860 ENDCHAR -STARTCHAR 0x2424 -ENCODING 9252 -SWIDTH 780 0 -DWIDTH 13 0 -BBX 11 11 1 1 +STARTCHAR te +ENCODING 62096 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 12 12 0 0 BITMAP -8800 -8800 -C800 -A800 -9A00 -8A00 -8A00 -0200 -0200 -0200 -03E0 +0E00 +0600 +0600 +0600 +7FE0 +FFF0 +C630 +0600 +0600 +0600 +0600 +0600 ENDCHAR -STARTCHAR 0x002F -ENCODING 9253 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 11 11 1 0 +STARTCHAR tu +ENCODING 62097 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 12 12 0 0 BITMAP -0120 -0240 -0480 -0920 -1240 -2480 -4900 -9200 -2400 -4800 -9000 +0E00 +0600 +0600 +0600 +7FE0 +FFF0 +C630 +0600 +07E0 +0660 +0600 +0600 ENDCHAR -STARTCHAR 0x003F -ENCODING 9254 -SWIDTH 360 0 -DWIDTH 6 0 -BBX 5 12 1 0 +STARTCHAR ti +ENCODING 62098 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 12 12 0 0 BITMAP -70 -F8 -C8 -C0 -60 -30 -30 -30 -00 -00 -30 -30 +0E00 +0600 +0600 +0600 +7FE0 +FFF0 +C630 +0600 +0600 +0600 +0660 +07E0 ENDCHAR -STARTCHAR 0x2440 -ENCODING 9280 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 11 1 1 +STARTCHAR ta +ENCODING 62099 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 12 12 0 0 BITMAP -1E -12 -12 -12 -10 -10 -10 -90 -90 -90 -F0 +0E00 +0600 +0600 +0600 +7FE0 +FFF0 +C630 +0600 +0600 +0E00 +1C00 +3800 ENDCHAR -STARTCHAR 0x2441 -ENCODING 9281 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 11 1 1 +STARTCHAR tE +ENCODING 62100 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 12 12 0 0 BITMAP -02 -02 -02 -02 -02 -FE -82 -82 -82 -82 -82 +0E00 +0600 +0600 +0600 +7FE0 +FFF0 +C630 +0600 +0600 +07C0 +0660 +07C0 ENDCHAR -STARTCHAR 0x2442 -ENCODING 9282 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 11 1 1 +STARTCHAR t +ENCODING 62101 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 12 12 0 0 BITMAP -82 -82 -82 -82 -82 -FE -10 -10 -10 -10 -10 +1800 +1C00 +0E00 +0600 +0600 +7FE0 +FFF0 +C630 +0600 +0600 +0600 +0600 ENDCHAR -STARTCHAR 0x2443 -ENCODING 9283 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 11 1 1 +STARTCHAR to +ENCODING 62102 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 12 12 0 0 BITMAP -FE -92 -92 -92 -10 -10 -10 -92 -92 -92 -FE +0F80 +0C80 +0580 +0600 +7FE0 +FFF0 +C630 +0600 +0600 +0600 +0600 +0600 ENDCHAR -STARTCHAR 0x2444 -ENCODING 9284 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 5 1 7 +STARTCHAR tWa +ENCODING 62103 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 12 14 0 -2 BITMAP -C6 -AA -92 -AA -C6 +0E00 +0600 +0600 +0600 +7FE0 +FFF0 +C630 +0600 +0600 +0600 +0600 +0600 +1F80 +30C0 ENDCHAR -STARTCHAR 0x2445 -ENCODING 9285 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 9 1 2 +STARTCHAR ce +ENCODING 62104 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 12 12 0 0 BITMAP -0E -CE -CE -C0 -C0 -C0 -CE -CE -0E +6060 +7FE0 +FFF0 +C630 +0600 +7FE0 +FFF0 +C630 +0600 +0600 +0600 +0600 ENDCHAR -STARTCHAR 0x2446 -ENCODING 9286 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 11 1 1 +STARTCHAR cu +ENCODING 62105 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 12 12 0 0 BITMAP -06 -06 -06 -16 -16 -10 -D0 -D0 -C0 -C0 -C0 +6060 +7FE0 +FFF0 +C630 +0600 +7FE0 +FFF0 +C630 +0600 +07E0 +0660 +0600 ENDCHAR -STARTCHAR 0x2447 -ENCODING 9287 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 8 1 2 +STARTCHAR ci +ENCODING 62106 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 12 12 0 0 BITMAP -0E -0E -AE -AE -AE -A0 -A0 -A0 +6060 +7FE0 +FFF0 +C630 +0600 +7FE0 +FFF0 +C630 +0600 +0600 +0660 +07E0 ENDCHAR -STARTCHAR 0x2448 -ENCODING 9288 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 5 1 4 +STARTCHAR ca +ENCODING 62107 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 12 12 0 0 BITMAP -DA -DA -DA -DA -DA +6060 +7FE0 +FFF0 +C630 +0600 +7FE0 +FFF0 +C630 +0600 +0E00 +1C00 +3800 ENDCHAR -STARTCHAR 0x2449 -ENCODING 9289 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 12 1 0 +STARTCHAR cE +ENCODING 62108 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 12 12 0 0 BITMAP -90 -90 -48 -48 -48 -48 -24 -24 -24 -24 -12 -12 +6060 +7FE0 +FFF0 +C630 +0600 +7FE0 +FFF0 +C630 +0600 +07C0 +0660 +07C0 ENDCHAR -STARTCHAR 0x2460 -ENCODING 9312 -SWIDTH 1080 0 -DWIDTH 18 0 -BBX 17 17 1 -3 +STARTCHAR c +ENCODING 62109 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 13 12 0 0 BITMAP -07F000 -180C00 -200200 -408100 -438100 -808080 -808080 -808080 -808080 -808080 -808080 -808080 -408100 -43E100 -200200 -180C00 -07F000 +6180 +7F80 +FFC0 +CCC0 +0E00 +0300 +3FF0 +7FF8 +6318 +0300 +0300 +0300 ENDCHAR -STARTCHAR 0x2461 -ENCODING 9313 -SWIDTH 1080 0 -DWIDTH 18 0 -BBX 17 17 1 -3 +STARTCHAR co +ENCODING 62110 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 12 12 0 0 BITMAP -07F000 -180C00 -200200 -41C100 -422100 -822080 -822080 -802080 -804080 -804080 -808080 -812080 -412100 -43E100 -200200 -180C00 -07F000 +30C0 +7FE0 +6960 +0900 +0600 +7FE0 +FFF0 +C630 +0600 +0600 +0600 +0600 ENDCHAR -STARTCHAR 0x2462 -ENCODING 9314 -SWIDTH 1080 0 -DWIDTH 18 0 -BBX 17 17 1 -3 +STARTCHAR cWa +ENCODING 62111 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 12 14 0 -2 BITMAP -07F000 -180C00 -200200 -41C100 -422100 -822080 -802080 -802080 -80C080 -802080 -802080 -822080 -422100 -41C100 -200200 -180C00 -07F000 +6060 +7FE0 +FFF0 +C630 +0600 +7FE0 +FFF0 +C630 +0600 +0600 +0600 +0600 +1F80 +30C0 ENDCHAR -STARTCHAR 0x2463 -ENCODING 9315 -SWIDTH 1080 0 -DWIDTH 18 0 -BBX 17 17 1 -3 +STARTCHAR `he/h2e +ENCODING 62112 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 8 12 0 0 BITMAP -07F000 -180C00 -200200 -40C100 -40C100 -814080 -814080 -824080 -864080 -87F080 -804080 -804080 -404100 -41F100 -200200 -180C00 -07F000 +0C +0C +0C +FC +CF +03 +03 +03 +03 +03 +03 +03 ENDCHAR -STARTCHAR 0x2464 -ENCODING 9316 -SWIDTH 1080 0 -DWIDTH 18 0 -BBX 17 17 1 -3 +STARTCHAR `hu/h2u +ENCODING 62113 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 12 12 0 0 BITMAP -07F000 -180C00 -200200 -422100 -43C100 -820080 -820080 -83C080 -832080 -802080 -802080 -822080 -424100 -418100 -200200 -180C00 -07F000 +0C00 +0C00 +0C00 +FC00 +CF00 +0300 +0300 +03F0 +0330 +0300 +0300 +0300 ENDCHAR -STARTCHAR 0x2465 -ENCODING 9317 -SWIDTH 1080 0 -DWIDTH 18 0 -BBX 17 17 1 -3 +STARTCHAR `hi/h2i +ENCODING 62114 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 12 12 0 0 BITMAP -07F000 -180C00 -200200 -40C100 -412100 -810080 -820080 -83C080 -822080 -822080 -822080 -822080 -414100 -41C100 -200200 -180C00 -07F000 +0C00 +0C00 +0C00 +FC00 +CF00 +0300 +0300 +0300 +0300 +0300 +0330 +03F0 ENDCHAR -STARTCHAR 0x2466 -ENCODING 9318 -SWIDTH 1080 0 -DWIDTH 18 0 -BBX 17 17 1 -3 +STARTCHAR `ha/h2a +ENCODING 62115 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 8 12 0 0 BITMAP -07F000 -180C00 -220200 -43F100 -421100 -822080 -804080 -804080 -804080 -808080 -808080 -808080 -408100 -408100 -200200 -180C00 -07F000 +0C +0C +0C +FC +CF +03 +03 +03 +0E +18 +30 +30 ENDCHAR -STARTCHAR 0x2467 -ENCODING 9319 -SWIDTH 1080 0 -DWIDTH 18 0 -BBX 17 17 1 -3 -BITMAP -07F000 -180C00 -200200 -41C100 -422100 -822080 -822080 -814080 -81C080 -822080 -822080 -822080 -422100 -41C100 -200200 -180C00 -07F000 +STARTCHAR `hE/h2E +ENCODING 62116 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 12 12 0 0 +BITMAP +0C00 +0C00 +0C00 +FC00 +CF00 +0300 +0300 +0300 +0300 +03E0 +0330 +03E0 ENDCHAR -STARTCHAR 0x2468 -ENCODING 9320 -SWIDTH 1080 0 -DWIDTH 18 0 -BBX 17 17 1 -3 +STARTCHAR `h/h2 +ENCODING 62117 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 8 12 0 0 BITMAP -07F000 -180C00 -200200 -41C100 -414100 -822080 -822080 -822080 -822080 -81E080 -802080 -804080 -424100 -418100 -200200 -180C00 -07F000 +0C +0C +0C +3C +6F +C3 +C3 +03 +03 +03 +03 +03 ENDCHAR -STARTCHAR 0x2469 -ENCODING 9321 -SWIDTH 1080 0 -DWIDTH 18 0 -BBX 17 17 1 -3 +STARTCHAR `ho/h2o +ENCODING 62118 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 12 12 0 0 BITMAP -07F000 -180C00 -200200 -447100 -5C5100 -848880 -848880 -848880 -848880 -848880 -848880 -848880 -445100 -5F7100 -200200 -180C00 -07F000 +07E0 +0F90 +18E0 +F800 +D800 +1800 +1F80 +0F80 +0180 +0180 +0180 +0180 ENDCHAR -STARTCHAR 0x246A -ENCODING 9322 -SWIDTH 1080 0 -DWIDTH 18 0 -BBX 17 17 1 -3 +STARTCHAR hWe +ENCODING 62120 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 13 12 0 0 BITMAP -07F000 -180C00 -200200 -441100 -5C7100 -841080 -841080 -841080 -841080 -841080 -841080 -841080 -441100 -5F7D00 -200200 -180C00 -07F000 +0C00 +0C00 +0C00 +FC00 +CF00 +0300 +03F0 +0358 +0370 +0300 +0300 +0300 ENDCHAR -STARTCHAR 0x246B -ENCODING 9323 -SWIDTH 1080 0 -DWIDTH 18 0 -BBX 17 17 1 -3 +STARTCHAR hWu/hW +ENCODING 62121 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 13 12 0 0 BITMAP -07F000 -180C00 -200200 -447100 -5C8900 -848880 -848880 -840880 -841080 -841080 -842080 -844880 -444900 -5FF900 -200200 -180C00 -07F000 +0C00 +0C00 +0C00 +FC60 +CF60 +03F8 +0318 +0300 +0300 +0300 +0300 +0300 ENDCHAR -STARTCHAR 0x246C -ENCODING 9324 -SWIDTH 1080 0 -DWIDTH 18 0 -BBX 17 17 1 -3 +STARTCHAR hWi +ENCODING 62122 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 13 12 0 0 BITMAP -07F000 -180C00 -200200 -447100 -5C8900 -848880 -840880 -840880 -843080 -840880 -840880 -848880 -448900 -5F7100 -200200 -180C00 -07F000 +0C00 +0C00 +0C00 +FC00 +CF00 +0330 +0330 +03F0 +0318 +0318 +0300 +0300 ENDCHAR -STARTCHAR 0x246D -ENCODING 9325 -SWIDTH 1080 0 -DWIDTH 18 0 -BBX 17 17 1 -3 +STARTCHAR hWa +ENCODING 62123 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 11 14 0 -2 BITMAP -07F000 -180C00 -200200 -443100 -5C3100 -845080 -845080 -849080 -859080 -85FC80 -841080 -841080 -441100 -5F7D00 -200200 -180C00 -07F000 +0C00 +0C00 +0C00 +FC00 +CF00 +0300 +0300 +0300 +0300 +0300 +0300 +0300 +0FC0 +1860 ENDCHAR -STARTCHAR 0x246E -ENCODING 9326 -SWIDTH 1080 0 -DWIDTH 18 0 -BBX 17 17 1 -3 +STARTCHAR hWE +ENCODING 62124 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 12 14 0 -2 BITMAP -07F000 -180C00 -200200 -448900 -5CF100 -848080 -848080 -84F080 -84C880 -840880 -840880 -848880 -449100 -5F6100 -200200 -180C00 -07F000 +0C00 +0C00 +0C00 +FC00 +CF00 +0300 +0300 +0300 +0300 +0300 +03E0 +0330 +0FE0 +1800 ENDCHAR -STARTCHAR 0x246F -ENCODING 9327 -SWIDTH 1080 0 -DWIDTH 18 0 -BBX 17 17 1 -3 +STARTCHAR ne +ENCODING 62128 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 5 12 0 0 BITMAP -07F000 -180C00 -200200 -443100 -5C4900 -844080 -848080 -84F080 -848880 -848880 -848880 -848880 -445100 -5F7100 -200200 -180C00 -07F000 +C0 +C0 +C0 +F0 +38 +30 +30 +30 +60 +60 +60 +60 ENDCHAR -STARTCHAR 0x2470 -ENCODING 9328 -SWIDTH 1080 0 -DWIDTH 18 0 -BBX 17 17 1 -3 +STARTCHAR nu +ENCODING 62129 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 7 12 0 0 BITMAP -07F000 -180C00 -208200 -44FD00 -5C8500 -848880 -841080 -841080 -841080 -842080 -842080 -842080 -442100 -5F2100 -200200 -180C00 -07F000 +C0 +C0 +C0 +F0 +38 +30 +30 +3E +66 +60 +60 +60 ENDCHAR -STARTCHAR 0x2471 -ENCODING 9329 -SWIDTH 1080 0 -DWIDTH 18 0 -BBX 17 17 1 -3 +STARTCHAR ni +ENCODING 62130 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 7 12 0 0 BITMAP -07F000 -180C00 -200200 -447100 -5C8900 -848880 -848880 -845080 -847080 -848880 -848880 -848880 -448900 -5F7100 -200200 -180C00 -07F000 +C0 +C0 +C0 +F0 +38 +30 +30 +30 +60 +60 +66 +7E ENDCHAR -STARTCHAR 0x2472 -ENCODING 9330 -SWIDTH 1080 0 -DWIDTH 18 0 -BBX 17 17 1 -3 +STARTCHAR na +ENCODING 62131 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 9 12 0 0 BITMAP -07F000 -180C00 -200200 -447100 -5C5100 -848880 -848880 -848880 -848880 -847880 -840880 -841080 -449100 -5F6100 -200200 -180C00 -07F000 +1F00 +3F80 +6180 +C000 +E000 +7C00 +0E00 +0600 +0400 +0C00 +0C00 +0C00 ENDCHAR -STARTCHAR 0x2473 -ENCODING 9331 -SWIDTH 1080 0 -DWIDTH 18 0 -BBX 17 17 1 -3 +STARTCHAR nE +ENCODING 62132 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 6 12 0 0 BITMAP -07F000 -180C00 -200200 -4E3900 -512900 -914480 -914480 -814480 -824480 -824480 -844480 -894480 -492900 -5F3900 -200200 -180C00 -07F000 +C0 +C0 +C0 +F0 +38 +30 +30 +30 +78 +64 +6C +78 ENDCHAR -STARTCHAR 0x2474 -ENCODING 9332 -SWIDTH 1080 0 -DWIDTH 18 0 -BBX 17 15 1 -3 +STARTCHAR n +ENCODING 62133 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 8 12 0 0 BITMAP -100400 -208200 -438100 -408100 -808080 -808080 -808080 -808080 -808080 -808080 -808080 -43E100 -400100 -200200 -100400 +FF +FE +C6 +0C +1F +03 +06 +0C +0C +18 +18 +30 ENDCHAR -STARTCHAR 0x2475 -ENCODING 9333 -SWIDTH 1080 0 -DWIDTH 18 0 -BBX 17 15 1 -3 +STARTCHAR no +ENCODING 62134 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 11 12 0 0 BITMAP -100400 -21C200 -422100 -422100 -822080 -802080 -804080 -804080 -808080 -812080 -812080 -43E100 -400100 -200200 -100400 +1FC0 +3F20 +6160 +C0C0 +E000 +7C00 +0E00 +0600 +0400 +0C00 +0C00 +0C00 ENDCHAR -STARTCHAR 0x2476 -ENCODING 9334 -SWIDTH 1080 0 -DWIDTH 18 0 -BBX 17 15 1 -3 +STARTCHAR nWa +ENCODING 62135 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 9 13 0 -2 BITMAP -100400 -21C200 -422100 -422100 -802080 -802080 -80C080 -802080 -802080 -822080 -822080 -41C100 -400100 -200200 -100400 +1F00 +3F80 +6180 +C000 +E000 +7C00 +0E00 +0600 +0400 +0C00 +0C00 +3F00 +6180 ENDCHAR -STARTCHAR 0x2477 -ENCODING 9335 -SWIDTH 1080 0 -DWIDTH 18 0 -BBX 17 15 1 -3 +STARTCHAR Ne +ENCODING 62136 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 10 12 0 0 BITMAP -100400 -20C200 -40C100 -414100 -814080 -824080 -864080 -87F080 -804080 -804080 -804080 -41F100 -400100 -200200 -100400 +6180 +FFC0 +8C40 +0C00 +0F00 +0380 +0300 +0300 +0600 +0600 +0600 +0600 ENDCHAR -STARTCHAR 0x2478 -ENCODING 9336 -SWIDTH 1080 0 -DWIDTH 18 0 -BBX 17 15 1 -3 +STARTCHAR Nu +ENCODING 62137 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 11 12 0 0 BITMAP -100400 -222200 -43C100 -420100 -820080 -83C080 -832080 -802080 -802080 -822080 -824080 -418100 -400100 -200200 -100400 +6180 +FFC0 +8C40 +0C00 +0F00 +0380 +0300 +03E0 +0660 +0600 +0600 +0600 ENDCHAR -STARTCHAR 0x2479 -ENCODING 9337 -SWIDTH 1080 0 -DWIDTH 18 0 -BBX 17 15 1 -3 +STARTCHAR Ni +ENCODING 62138 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 11 12 0 0 BITMAP -100400 -20C200 -412100 -410100 -820080 -83C080 -822080 -822080 -822080 -822080 -814080 -41C100 -400100 -200200 -100400 +6180 +FFC0 +8C40 +0C00 +0F00 +0380 +0300 +0300 +0600 +0600 +0660 +07E0 ENDCHAR -STARTCHAR 0x247A -ENCODING 9338 -SWIDTH 1080 0 -DWIDTH 18 0 -BBX 17 15 1 -3 +STARTCHAR Na +ENCODING 62139 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 11 13 0 0 BITMAP -120400 -23F200 -421100 -422100 -804080 -804080 -804080 -808080 -808080 -808080 -808080 -408100 -400100 -200200 -100400 +30C0 +7FE0 +4620 +1F00 +3F80 +6180 +C000 +E000 +7C00 +0E00 +0600 +0C00 +0C00 ENDCHAR -STARTCHAR 0x247B -ENCODING 9339 -SWIDTH 1080 0 -DWIDTH 18 0 -BBX 17 15 1 -3 +STARTCHAR NE +ENCODING 62140 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 10 12 0 0 BITMAP -100400 -21C200 -422100 -422100 -822080 -814080 -81C080 -822080 -822080 -822080 -822080 -41C100 -400100 -200200 -100400 +6180 +FFC0 +8C40 +0C00 +0F00 +0380 +0300 +0300 +0780 +0640 +06C0 +0780 ENDCHAR -STARTCHAR 0x247C -ENCODING 9340 -SWIDTH 1080 0 -DWIDTH 18 0 -BBX 17 15 1 -3 +STARTCHAR N +ENCODING 62141 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 10 13 0 0 BITMAP -100400 -21C200 -414100 -422100 -822080 -822080 -822080 -81E080 -802080 -804080 -824080 -418100 -400100 -200200 -100400 +6180 +FFC0 +8C40 +3F80 +7F00 +6300 +0600 +0F80 +0180 +0300 +0600 +0600 +0600 ENDCHAR -STARTCHAR 0x247D -ENCODING 9341 -SWIDTH 1080 0 -DWIDTH 18 0 -BBX 17 15 1 -3 +STARTCHAR No +ENCODING 62142 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 11 13 0 0 BITMAP -100400 -247200 -5C5100 -448900 -848880 -848880 -848880 -848880 -848880 -848880 -845080 -5F7100 -400100 -200200 -100400 +3180 +7FC0 +4440 +1FC0 +3F20 +6160 +C0C0 +E000 +7C00 +0E00 +0600 +0C00 +0C00 ENDCHAR -STARTCHAR 0x247E -ENCODING 9342 -SWIDTH 1080 0 -DWIDTH 18 0 -BBX 17 15 1 -3 +STARTCHAR NWa +ENCODING 62143 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 11 15 0 -2 BITMAP -100400 -241200 -5C7100 -441100 -841080 -841080 -841080 -841080 -841080 -841080 -841080 -5F7D00 -400100 -200200 -100400 +30C0 +7FE0 +4620 +1F00 +3F80 +6180 +C000 +E000 +7C00 +0E00 +0600 +0C00 +0C00 +3F00 +6180 ENDCHAR -STARTCHAR 0x247F -ENCODING 9343 -SWIDTH 1080 0 -DWIDTH 18 0 -BBX 17 15 1 -3 +STARTCHAR e/a +ENCODING 62144 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 7 12 0 0 BITMAP -100400 -247200 -5C8900 -448900 -848880 -840880 -841080 -841080 -842080 -844880 -844880 -5FF900 -400100 -200200 -100400 +60 +60 +60 +78 +18 +38 +3C +6E +E6 +C6 +C6 +C6 ENDCHAR -STARTCHAR 0x2480 -ENCODING 9344 -SWIDTH 1080 0 -DWIDTH 18 0 -BBX 17 15 1 -3 +STARTCHAR u/U +ENCODING 62145 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 11 12 0 0 BITMAP -100400 -247200 -5C8900 -448900 -840880 -840880 -843080 -840880 -840880 -848880 -848880 -5F7100 -400100 -200200 -100400 +6000 +6000 +6000 +7800 +1800 +3800 +3C00 +6E00 +E7E0 +C660 +C600 +C600 ENDCHAR -STARTCHAR 0x2481 -ENCODING 9345 -SWIDTH 1080 0 -DWIDTH 18 0 -BBX 17 15 1 -3 +STARTCHAR i +ENCODING 62146 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 11 12 0 0 BITMAP -100400 -243200 -5C3100 -445100 -845080 -849080 -859080 -85F880 -841080 -841080 -841080 -5F7900 -400100 -200200 -100400 +6000 +6000 +6000 +7800 +1800 +3800 +3C00 +6E00 +E600 +C600 +C660 +C7E0 ENDCHAR -STARTCHAR 0x2482 -ENCODING 9346 -SWIDTH 1080 0 -DWIDTH 18 0 -BBX 17 15 1 -3 +STARTCHAR A +ENCODING 62147 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 7 12 0 0 BITMAP -100400 -248A00 -5CF100 -448100 -848080 -84F080 -84C880 -840880 -840880 -848880 -849080 -5F6100 -400100 -200200 -100400 +60 +60 +60 +78 +18 +3C +6E +C6 +C6 +C6 +06 +06 ENDCHAR -STARTCHAR 0x2483 -ENCODING 9347 -SWIDTH 1080 0 -DWIDTH 18 0 -BBX 17 15 1 -3 +STARTCHAR E +ENCODING 62148 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 11 12 0 0 BITMAP -100400 -243200 -5C4900 -444100 -848080 -84F080 -848880 -848880 -848880 -848880 -845080 -5F7100 -400100 -200200 -100400 +6000 +6000 +6000 +7800 +1800 +3800 +3C00 +6E00 +E600 +C7C0 +C660 +C7C0 ENDCHAR -STARTCHAR 0x2484 -ENCODING 9348 -SWIDTH 1080 0 -DWIDTH 18 0 -BBX 17 15 1 -3 +STARTCHAR I +ENCODING 62149 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 7 12 0 0 BITMAP -108400 -24FE00 -5C8500 -448900 -841080 -841080 -841080 -842080 -842080 -842080 -842080 -5F2100 -400100 -200200 -100400 +C0 +C0 +E0 +60 +30 +38 +7C +EE +C6 +C6 +C6 +C6 ENDCHAR -STARTCHAR 0x2485 -ENCODING 9349 -SWIDTH 1080 0 -DWIDTH 18 0 -BBX 17 15 1 -3 +STARTCHAR o/O +ENCODING 62150 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 7 12 0 0 BITMAP -100400 -247200 -5C8900 -448900 -848880 -845080 -847080 -848880 -848880 -848880 -848880 -5F7100 -400100 -200200 -100400 +60 +60 +60 +78 +18 +3C +6E +C6 +C6 +C6 +C0 +C0 ENDCHAR -STARTCHAR 0x2486 -ENCODING 9350 -SWIDTH 1080 0 -DWIDTH 18 0 -BBX 17 15 1 -3 +STARTCHAR e3 +ENCODING 62151 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 9 13 0 0 BITMAP -100400 -247200 -5C5100 -448900 -848880 -848880 -848880 -847880 -840880 -841080 -849080 -5F6100 -400100 -200200 -100400 +6300 +7F00 +D980 +1800 +1E00 +0600 +0E00 +0F00 +1B80 +3980 +3180 +3180 +3180 ENDCHAR -STARTCHAR 0x2487 -ENCODING 9351 -SWIDTH 1080 0 -DWIDTH 18 0 -BBX 17 15 1 -3 +STARTCHAR ke +ENCODING 62152 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 9 11 0 0 BITMAP -100400 -2E3A00 -512900 -514500 -914480 -814480 -824480 -824480 -844480 -894480 -892880 -5F3900 -400100 -200200 -100400 +C000 +CE00 +FF00 +F180 +3180 +3180 +3180 +3180 +3180 +3180 +3180 ENDCHAR -STARTCHAR 0x2488 -ENCODING 9352 -SWIDTH 840 0 -DWIDTH 14 0 -BBX 9 11 3 0 +STARTCHAR ku +ENCODING 62153 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 13 11 0 0 BITMAP -2000 -E000 -2000 -2000 -2000 -2000 -2000 -2000 -2000 -2180 -F980 +C000 +CE00 +FF00 +F180 +3180 +3180 +31F8 +3198 +3180 +3180 +3180 ENDCHAR -STARTCHAR 0x2489 -ENCODING 9353 -SWIDTH 840 0 -DWIDTH 14 0 -BBX 9 11 3 0 +STARTCHAR ki +ENCODING 62154 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 13 11 0 0 BITMAP -7000 -8800 -8800 -8800 -0800 -1000 -1000 -2000 -4800 -4980 -F980 +C000 +CE00 +FF00 +F180 +3180 +3180 +3180 +3180 +3180 +3198 +31F8 ENDCHAR -STARTCHAR 0x248A -ENCODING 9354 -SWIDTH 840 0 -DWIDTH 14 0 -BBX 9 11 3 0 +STARTCHAR ka +ENCODING 62155 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 9 11 0 0 BITMAP -7000 -8800 -8800 -0800 -0800 -3000 -0800 -0800 -8800 -8980 -7180 +C000 +CE00 +FF00 +F180 +3180 +3180 +3180 +3180 +0180 +0180 +0180 ENDCHAR -STARTCHAR 0x248B -ENCODING 9355 +STARTCHAR kE +ENCODING 62156 SWIDTH 960 0 DWIDTH 16 0 -BBX 11 11 3 0 +BBX 13 11 0 0 BITMAP -1800 -1800 -2800 -2800 -4800 -C800 -FE00 -0800 -0800 -0860 -3E60 +C000 +CE00 +FF00 +F180 +3180 +3180 +3180 +3180 +31F0 +3198 +31F0 ENDCHAR -STARTCHAR 0x248C -ENCODING 9356 -SWIDTH 840 0 -DWIDTH 14 0 -BBX 9 11 3 0 +STARTCHAR k +ENCODING 62157 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 9 11 0 0 BITMAP -8800 -F000 -8000 -8000 -F000 -C800 -0800 -0800 -8800 -9180 +C000 +CE00 +DF00 +F180 6180 +7180 +3180 +3180 +3180 +3180 +3180 ENDCHAR -STARTCHAR 0x248D -ENCODING 9357 -SWIDTH 840 0 -DWIDTH 14 0 -BBX 9 11 3 0 +STARTCHAR ko +ENCODING 62158 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 9 11 0 0 BITMAP +C000 +CE00 +FF00 +F180 +3180 +3180 +3180 +3180 3000 -4800 -4000 -8000 -F000 -8800 -8800 -8800 -8800 -5180 -7180 +3000 +3000 ENDCHAR -STARTCHAR 0x248E -ENCODING 9358 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 7 12 3 0 +STARTCHAR kWe +ENCODING 62160 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 13 11 0 0 BITMAP -80 -FC -84 -88 -10 -10 -10 -20 -20 -20 -26 -26 +C000 +CC00 +FE00 +F300 +3300 +33F0 +3358 +3370 +3300 +3300 +3300 ENDCHAR -STARTCHAR 0x248F -ENCODING 9359 -SWIDTH 840 0 -DWIDTH 14 0 -BBX 9 11 3 0 +STARTCHAR kWu/kW +ENCODING 62161 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 13 11 0 0 BITMAP -7000 -8800 -8800 -8800 -5000 -7000 -8800 -8800 -8800 -8980 -7180 +C000 +CC60 +FE60 +F3F8 +3318 +3300 +3300 +3300 +3300 +3300 +3300 ENDCHAR -STARTCHAR 0x2490 -ENCODING 9360 -SWIDTH 780 0 -DWIDTH 13 0 -BBX 8 11 3 0 +STARTCHAR kWi +ENCODING 62162 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 13 11 0 0 BITMAP -70 -50 -88 -88 -88 -88 -78 -08 -10 -93 -63 +C000 +CC00 +FE00 +F300 +3330 +3330 +33F0 +3318 +3318 +3300 +3300 ENDCHAR -STARTCHAR 0x2491 -ENCODING 9361 -SWIDTH 1080 0 -DWIDTH 18 0 -BBX 13 11 3 0 +STARTCHAR kWa +ENCODING 62163 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 12 13 0 -2 BITMAP -2380 -E280 -2440 -2440 -2440 -2440 -2440 -2440 -2440 -2298 -FB98 +C000 +CE00 +FF00 +F180 +3180 +3180 +3180 +3180 +0180 +0180 +0180 +07E0 +0C30 ENDCHAR -STARTCHAR 0x2492 -ENCODING 9362 -SWIDTH 1200 0 -DWIDTH 20 0 -BBX 15 11 3 0 +STARTCHAR kWE +ENCODING 62164 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 16 13 0 -2 BITMAP -2080 -E380 -2080 -2080 -2080 -2080 -2080 -2080 -2080 -2086 -FBE6 +C000 +CE00 +FF00 +F180 +3180 +3180 +3180 +3180 +0180 +01F0 +0198 +07F0 +0C00 ENDCHAR -STARTCHAR 0x2493 -ENCODING 9363 -SWIDTH 1140 0 -DWIDTH 19 0 -BBX 14 11 3 0 +STARTCHAR Ke +ENCODING 62168 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 11 12 0 0 BITMAP -2380 -E440 -2440 -2440 -2040 -2080 -2080 -2100 -2240 -224C -FFCC +C300 +7E00 +1800 +1B80 +1FC0 +0C60 +0C60 +0C60 +0C60 +0C60 +0C60 +0C60 ENDCHAR -STARTCHAR 0x2494 -ENCODING 9364 -SWIDTH 1140 0 -DWIDTH 19 0 -BBX 14 11 3 0 +STARTCHAR Ku +ENCODING 62169 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 15 12 0 0 BITMAP -2380 -E440 -2440 -2040 -2040 -2180 -2040 -2040 -2440 -244C -FB8C +C300 +7E00 +1800 +1B80 +1FC0 +0C60 +0C60 +0C7E +0C66 +0C60 +0C60 +0C60 ENDCHAR -STARTCHAR 0x2495 -ENCODING 9365 -SWIDTH 1140 0 -DWIDTH 19 0 -BBX 14 11 3 0 +STARTCHAR Ki +ENCODING 62170 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 15 12 0 0 BITMAP -2180 -E180 -2280 -2280 -2480 -2C80 -2FC0 -2080 -2080 -208C -FBCC +C300 +7E00 +1800 +1B80 +1FC0 +0C60 +0C60 +0C60 +0C60 +0C60 +0C66 +0C7E ENDCHAR -STARTCHAR 0x2496 -ENCODING 9366 -SWIDTH 1080 0 -DWIDTH 18 0 -BBX 13 11 3 0 +STARTCHAR Ka +ENCODING 62171 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 11 12 0 0 BITMAP -2440 -E780 -2400 -2400 -2780 -2640 -2040 -2040 -2440 -2498 -FB18 +C300 +7E00 +1800 +1B80 +1FC0 +0C60 +0C60 +0C60 +0C60 +0060 +0060 +0060 ENDCHAR -STARTCHAR 0x2497 -ENCODING 9367 -SWIDTH 1080 0 -DWIDTH 18 0 -BBX 13 11 3 0 +STARTCHAR KE +ENCODING 62172 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 15 12 0 0 BITMAP -2180 -E240 -2200 -2400 -2780 -2440 -2440 -2440 -2440 -2298 -FB98 +C300 +7E00 +1800 +1B80 +1FC0 +0C60 +0C60 +0C60 +0C60 +0C7C +0C66 +0C7C ENDCHAR -STARTCHAR 0x2498 -ENCODING 9368 -SWIDTH 1020 0 -DWIDTH 17 0 -BBX 12 12 3 0 +STARTCHAR K +ENCODING 62173 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 12 12 0 0 BITMAP -0400 -27E0 -E420 -2440 -2080 -2080 -2080 -2100 -2100 -2100 -2130 -F930 +C300 +7E00 +1800 +1DC0 +1FE0 +0630 +0730 +0330 +0330 +0330 +0330 +0330 ENDCHAR -STARTCHAR 0x2499 -ENCODING 9369 -SWIDTH 1140 0 -DWIDTH 19 0 -BBX 14 11 3 0 +STARTCHAR Ko +ENCODING 62174 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 11 12 0 0 BITMAP -2380 -E440 -2440 -2440 -2280 -2380 -2440 -2440 -2440 -244C -FB8C +C300 +7E00 +1800 +1B80 +1FC0 +0C60 +0C60 +0C60 +0C60 +0C00 +0C00 +0C00 ENDCHAR -STARTCHAR 0x249A -ENCODING 9370 -SWIDTH 1080 0 -DWIDTH 18 0 -BBX 13 11 3 0 +STARTCHAR KWe +ENCODING 62176 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 16 12 0 0 BITMAP -2380 -E280 -2440 -2440 -2440 -2440 -23C0 -2040 -2080 -2498 -FB18 +C300 +7E00 +1800 +1B80 +1FC0 +0C60 +0C7E +0C6B +0C6E +0C60 +0C60 +0C60 ENDCHAR -STARTCHAR 0x249B -ENCODING 9371 -SWIDTH 1140 0 -DWIDTH 19 0 -BBX 14 11 3 0 +STARTCHAR KWu/KW +ENCODING 62177 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 16 12 0 0 BITMAP -71C0 -8940 -8A20 -8A20 -0A20 -1220 -1220 -2220 -4A20 -494C -F9CC +C300 +7E00 +180C +1B8C +1FFF +0C63 +0C60 +0C60 +0C60 +0C60 +0C60 +0C60 ENDCHAR -STARTCHAR 0x249C -ENCODING 9372 -SWIDTH 1080 0 -DWIDTH 18 0 -BBX 17 15 1 -3 +STARTCHAR KWi +ENCODING 62178 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 16 12 0 0 BITMAP -100400 -200200 -400100 -400100 -800080 -838080 -844080 -804080 -83C080 -844080 -844080 -43E100 -400100 -200200 -100400 +C300 +7E00 +1800 +1B80 +1FC0 +0C66 +0C66 +0C7E +0C63 +0C63 +0C60 +0C60 ENDCHAR -STARTCHAR 0x249D -ENCODING 9373 -SWIDTH 1080 0 -DWIDTH 18 0 -BBX 17 15 1 -3 +STARTCHAR KWa +ENCODING 62179 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 14 14 0 -2 BITMAP -160400 -220200 -420100 -420100 -820080 -83C080 -822080 -822080 -822080 -822080 -822080 -43C100 -400100 -200200 -100400 +C300 +7E00 +1800 +1B80 +1FC0 +0CE0 +0C60 +0C60 +0C60 +0060 +0060 +0060 +01F8 +030C ENDCHAR -STARTCHAR 0x249E -ENCODING 9374 -SWIDTH 1080 0 -DWIDTH 18 0 -BBX 17 15 1 -3 +STARTCHAR KWE +ENCODING 62180 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 15 14 0 -2 BITMAP -100400 -200200 -400100 -400100 -800080 -81C080 -822080 -820080 -820080 -820080 -822080 -41C100 -400100 -200200 -100400 +C300 +7E00 +1800 +1B80 +1FC0 +0CE0 +0C60 +0C60 +0C60 +0060 +007C +0066 +01FC +0300 ENDCHAR -STARTCHAR 0x249F -ENCODING 9375 -SWIDTH 1080 0 -DWIDTH 18 0 -BBX 17 15 1 -3 +STARTCHAR we +ENCODING 62184 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 11 8 0 1 BITMAP -10C400 -204200 -404100 -404100 -804080 -83C080 -844080 -844080 -844080 -844080 -844080 -43E100 -400100 -200200 -100400 +3FC0 +76E0 +C660 +C660 +CC60 +CCC0 +EDC0 +7F00 ENDCHAR -STARTCHAR 0x24A0 -ENCODING 9376 -SWIDTH 1080 0 -DWIDTH 18 0 -BBX 17 15 1 -3 +STARTCHAR wu +ENCODING 62185 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 15 9 0 -1 BITMAP -100400 -200200 -400100 -400100 -800080 -81C080 -822080 -83E080 -820080 -820080 -822080 -41C100 -400100 -200200 -100400 +3FC0 +76E0 +C660 +C660 +CC60 +CCE0 +EDC6 +7FFC +000C ENDCHAR -STARTCHAR 0x24A1 -ENCODING 9377 -SWIDTH 1080 0 -DWIDTH 18 0 -BBX 17 15 1 -3 +STARTCHAR wi +ENCODING 62186 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 11 12 0 0 BITMAP -10E400 -212200 -410100 -410100 -810080 -83C080 -810080 -810080 -810080 -810080 -810080 -438100 -400100 -200200 -100400 +3FC0 +76E0 +C660 +C660 +CC60 +EEC0 +7F80 +0C00 +0C00 +1C00 +18C0 +1FC0 ENDCHAR -STARTCHAR 0x24A2 -ENCODING 9378 -SWIDTH 1080 0 -DWIDTH 18 0 -BBX 17 16 1 -4 +STARTCHAR wa +ENCODING 62187 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 11 12 0 0 BITMAP -100400 -200200 -400100 -400100 -800080 -81F080 -822080 -822080 -822080 -83C080 -820080 -43E100 -441100 -241200 -141400 -03E000 +3FC0 +76E0 +C660 +C660 +CC60 +EEC0 +7F80 +0C00 +0C00 +1C00 +1800 +1800 ENDCHAR -STARTCHAR 0x24A3 -ENCODING 9379 -SWIDTH 1080 0 -DWIDTH 18 0 -BBX 17 15 1 -3 +STARTCHAR wE +ENCODING 62188 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 11 12 0 0 BITMAP -160400 -220200 -420100 -420100 -820080 -83C080 -822080 -822080 -822080 -822080 -822080 -477100 -400100 -200200 -100400 +3FC0 +76E0 +C660 +C660 +CC60 +EEC0 +7F80 +0C00 +0C00 +1E00 +1980 +1F00 ENDCHAR -STARTCHAR 0x24A4 -ENCODING 9380 -SWIDTH 1080 0 -DWIDTH 18 0 -BBX 17 15 1 -3 +STARTCHAR w +ENCODING 62189 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 15 8 0 1 BITMAP -100400 -218200 -418100 -400100 -800080 -818080 -808080 -808080 -808080 -808080 -808080 -41C100 -400100 -200200 -100400 +3FC0 +76E0 +C660 +C67E +CC66 +CCC2 +EDC0 +7F00 ENDCHAR -STARTCHAR 0x24A5 -ENCODING 9381 -SWIDTH 1080 0 -DWIDTH 18 0 -BBX 17 15 1 -3 +STARTCHAR wo +ENCODING 62190 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 11 12 0 0 BITMAP -100400 -20C200 -40C100 -400100 -800080 -80C080 -804080 -804080 -804080 -804080 -804080 -404100 -404100 -224200 -138400 +3FC0 +76E0 +C660 +C660 +CC60 +EEC0 +7F80 +0C00 +1800 +3000 +6000 +6000 ENDCHAR -STARTCHAR 0x24A6 -ENCODING 9382 -SWIDTH 1080 0 -DWIDTH 18 0 -BBX 17 15 1 -3 +STARTCHAR `e/e2 +ENCODING 62192 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 8 11 0 0 BITMAP -160400 -220200 -420100 -420100 -820080 -82F080 -824080 -828080 -838080 -82C080 -824080 -477100 -400100 -200200 -100400 +1E +63 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +7F +60 ENDCHAR -STARTCHAR 0x24A7 -ENCODING 9383 -SWIDTH 1080 0 -DWIDTH 18 0 -BBX 17 15 1 -3 +STARTCHAR `u/u2 +ENCODING 62193 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 12 11 0 0 BITMAP -118400 -208200 -408100 -408100 -808080 -808080 -808080 -808080 -808080 -808080 -808080 -41C100 -400100 -200200 -100400 +1E00 +6300 +C300 +C300 +C300 +C300 +C3F0 +C330 +C300 +7F00 +6000 ENDCHAR -STARTCHAR 0x24A8 -ENCODING 9384 -SWIDTH 1080 0 -DWIDTH 18 0 -BBX 17 15 1 -3 +STARTCHAR `i/i2 +ENCODING 62194 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 12 11 0 0 BITMAP -100400 -200200 -400100 -400100 -800080 -9F7080 -888880 -888880 -888880 -888880 -888880 -5DDD00 -400100 -200200 -100400 +3E00 +6300 +C300 +C300 +C300 +7F80 +0180 +0180 +0300 +0330 +03F0 ENDCHAR -STARTCHAR 0x24A9 -ENCODING 9385 -SWIDTH 1080 0 -DWIDTH 18 0 -BBX 17 15 1 -3 +STARTCHAR `a/A2 +ENCODING 62195 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 9 11 0 0 BITMAP -100400 -200200 -400100 -400100 -800080 -87C080 -822080 -822080 -822080 -822080 -822080 -477100 -400100 -200200 -100400 +3E00 +6300 +C300 +C300 +C300 +7F80 +0180 +0180 +0180 +0300 +0300 ENDCHAR -STARTCHAR 0x24AA -ENCODING 9386 -SWIDTH 1080 0 -DWIDTH 18 0 -BBX 17 15 1 -3 +STARTCHAR `E/E2 +ENCODING 62196 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 12 11 0 0 BITMAP -100400 -200200 -400100 -400100 -800080 -81C080 -822080 -822080 -822080 -822080 -822080 -41C100 -400100 -200200 -100400 +3E00 +6300 +C300 +C300 +C300 +7F80 +0180 +0180 +03E0 +0330 +03E0 ENDCHAR -STARTCHAR 0x24AB -ENCODING 9387 -SWIDTH 1080 0 -DWIDTH 18 0 -BBX 17 15 1 -3 +STARTCHAR `I/I2 +ENCODING 62197 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 8 13 0 0 BITMAP -100400 -200200 -400100 -400100 -800080 -87C080 -822080 -822080 -822080 -822080 -822080 -43C100 -420100 -220200 -170400 +18 +18 +18 +7E +E3 +C3 +C3 +C3 +C3 +C3 +C3 +7F +60 ENDCHAR -STARTCHAR 0x24AC -ENCODING 9388 -SWIDTH 1080 0 -DWIDTH 18 0 -BBX 17 15 1 -3 +STARTCHAR `o/o2 +ENCODING 62198 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 8 12 0 0 BITMAP -100400 -200200 -400100 -400100 -800080 -83C080 -844080 -844080 -844080 -844080 -844080 -43C100 -404100 -204200 -10E400 +3C +66 +C3 +C3 +C3 +E7 +7E +3C +70 +C0 +C0 +C0 ENDCHAR -STARTCHAR 0x24AD -ENCODING 9389 -SWIDTH 1080 0 -DWIDTH 18 0 -BBX 17 15 1 -3 +STARTCHAR ze +ENCODING 62200 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 7 12 0 0 BITMAP -100400 -200200 -400100 -400100 -800080 -834080 -81A080 -810080 -810080 -810080 -810080 -43C100 -400100 -200200 -100400 +C6 +C6 +C6 +C6 +C6 +FE +FE +C6 +C6 +C6 +C6 +C6 ENDCHAR -STARTCHAR 0x24AE -ENCODING 9390 -SWIDTH 1080 0 -DWIDTH 18 0 -BBX 17 15 1 -3 +STARTCHAR zu +ENCODING 62201 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 11 12 0 0 BITMAP -100400 -200200 -400100 -400100 -800080 -81E080 -822080 -820080 -81C080 -802080 -822080 -43C100 -400100 -200200 -100400 +C600 +C600 +C600 +C600 +C600 +FE00 +FE00 +C7E0 +C660 +C660 +C600 +C600 ENDCHAR -STARTCHAR 0x24AF -ENCODING 9391 -SWIDTH 1080 0 -DWIDTH 18 0 -BBX 17 15 1 -3 +STARTCHAR zi +ENCODING 62202 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 11 12 0 0 BITMAP -100400 -200200 -410100 -410100 -830080 -87C080 -810080 -810080 -810080 -812080 -812080 -40C100 -400100 -200200 -100400 +C600 +C600 +C600 +C600 +C600 +FE00 +FE00 +C600 +C600 +C600 +C660 +C7E0 ENDCHAR -STARTCHAR 0x24B0 -ENCODING 9392 -SWIDTH 1080 0 -DWIDTH 18 0 -BBX 17 15 1 -3 +STARTCHAR za +ENCODING 62203 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 7 12 0 0 BITMAP -100400 -200200 -400100 -400100 -800080 -866080 -822080 -822080 -822080 -822080 -822080 -41F100 -400100 -200200 -100400 +C6 +C6 +C6 +C6 +FE +FE +C6 +C6 +C6 +06 +06 +06 ENDCHAR -STARTCHAR 0x24B1 -ENCODING 9393 -SWIDTH 1080 0 -DWIDTH 18 0 -BBX 17 15 1 -3 +STARTCHAR zE +ENCODING 62204 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 11 12 0 0 BITMAP -100400 -200200 -400100 -400100 -800080 -8E7080 -824080 -824080 -824080 -818080 -818080 -418100 -400100 -200200 -100400 +C600 +C600 +C600 +C600 +C600 +FE00 +FE00 +C600 +C600 +C7C0 +C660 +C7C0 ENDCHAR -STARTCHAR 0x24B2 -ENCODING 9394 -SWIDTH 1080 0 -DWIDTH 18 0 -BBX 17 15 1 -3 +STARTCHAR z +ENCODING 62205 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 10 12 0 0 BITMAP -100400 -200200 -400100 -400100 -800080 -9DDC80 -849080 -855080 -855080 -855080 -836080 -422100 -400100 -200200 -100400 +70C0 +D8C0 +D8C0 +18C0 +18C0 +1FC0 +1FC0 +18C0 +18C0 +18C0 +18C0 +18C0 ENDCHAR -STARTCHAR 0x24B3 -ENCODING 9395 -SWIDTH 1080 0 -DWIDTH 18 0 -BBX 17 15 1 -3 +STARTCHAR zo +ENCODING 62206 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 7 12 0 0 BITMAP -100400 -200200 -400100 -400100 -800080 -8E7080 -824080 -818080 -818080 -818080 -824080 -4E7100 -400100 -200200 -100400 +C6 +C6 +C6 +C6 +FE +FE +C6 +C6 +C6 +C0 +C0 +C0 ENDCHAR -STARTCHAR 0x24B4 -ENCODING 9396 -SWIDTH 1080 0 -DWIDTH 18 0 -BBX 17 15 1 -3 +STARTCHAR zWa +ENCODING 62207 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 10 14 0 -2 BITMAP -100400 -200200 -400100 -400100 -800080 -873880 -812080 -812080 -812080 -80C080 -80C080 -40C100 -408100 -248200 -170400 +C600 +C600 +C600 +C600 +FE00 +FE00 +C600 +C600 +C600 +0600 +0600 +0600 +1F80 +30C0 ENDCHAR -STARTCHAR 0x24B5 -ENCODING 9397 -SWIDTH 1080 0 -DWIDTH 18 0 -BBX 17 15 1 -3 +STARTCHAR Ze +ENCODING 62208 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 12 12 0 0 BITMAP -100400 -200200 -400100 -400100 -800080 -83E080 -824080 -824080 -808080 -812080 -812080 -43E100 -400100 -200200 -100400 +70E0 +D9B0 +D9B0 +1980 +1980 +1F80 +1F80 +1980 +1980 +1980 +1980 +1980 ENDCHAR -STARTCHAR 0x24B6 -ENCODING 9398 -SWIDTH 1080 0 -DWIDTH 18 0 -BBX 17 17 1 -3 +STARTCHAR Zu +ENCODING 62209 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 13 12 0 0 BITMAP -07F000 -180C00 -200200 -408100 -408100 -814080 -814080 -814080 -822080 -822080 -83E080 -841080 -441100 -5E3D00 -200200 -180C00 -07F000 +70E0 +D9B0 +D9B0 +1980 +1980 +1F80 +1F80 +19F8 +1998 +1998 +1980 +1980 ENDCHAR -STARTCHAR 0x24B7 -ENCODING 9399 -SWIDTH 1080 0 -DWIDTH 18 0 -BBX 17 17 1 -3 +STARTCHAR Zi +ENCODING 62210 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 13 12 0 0 BITMAP -07F000 -180C00 -200200 -5FE100 -441100 -840880 -840880 -841080 -87E080 -841080 -840880 -840880 -441100 -5FE100 -200200 -180C00 -07F000 +70E0 +D9B0 +D9B0 +1980 +1980 +1F80 +1F80 +1980 +1980 +1980 +1998 +19F8 ENDCHAR -STARTCHAR 0x24B8 -ENCODING 9400 -SWIDTH 1080 0 -DWIDTH 18 0 -BBX 17 17 1 -3 +STARTCHAR Za +ENCODING 62211 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 12 12 0 0 BITMAP -07F000 -180C00 -200200 -41E900 -421900 -840880 -880880 -880080 -880080 -880080 -880880 -840880 -421100 -41E100 -200200 -180C00 -07F000 +70E0 +D9B0 +D9B0 +1980 +1F80 +1F80 +1980 +1980 +1980 +0180 +0180 +0180 ENDCHAR -STARTCHAR 0x24B9 -ENCODING 9401 -SWIDTH 1080 0 -DWIDTH 18 0 -BBX 17 17 1 -3 +STARTCHAR ZE +ENCODING 62212 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 13 12 0 0 BITMAP -07F000 -180C00 -200200 -5FC100 -443100 -841080 -840880 -840880 -840880 -840880 -840880 -841080 -443100 -5FC100 -200200 -180C00 -07F000 +70E0 +D9B0 +D9B0 +1980 +1980 +1F80 +1F80 +1980 +1980 +19F0 +1998 +19F0 ENDCHAR -STARTCHAR 0x24BA -ENCODING 9402 -SWIDTH 1080 0 -DWIDTH 18 0 -BBX 17 17 1 -3 +STARTCHAR Z +ENCODING 62213 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 13 13 0 0 BITMAP -07F000 -180C00 -200200 -5FF100 -441100 -841080 -845080 -844080 -87C080 -844880 -844880 -841080 -441100 -5FF100 -200200 -180C00 -07F000 +C300 +7E00 +1800 +3870 +6CD8 +6CD8 +0CC0 +0FC0 +0FC0 +0CC0 +0CC0 +0CC0 +0CC0 ENDCHAR -STARTCHAR 0x24BB -ENCODING 9403 -SWIDTH 1080 0 -DWIDTH 18 0 -BBX 17 17 1 -3 +STARTCHAR Zo +ENCODING 62214 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 12 12 0 0 BITMAP -07F000 -180C00 -200200 -4FF900 -420900 -820880 -822880 -822080 -83E080 -822080 -822080 -820080 -420100 -4F8100 -200200 -180C00 -07F000 +70E0 +D9B0 +D9B0 +1980 +1F80 +1F80 +1980 +1980 +1980 +1800 +1800 +1800 ENDCHAR -STARTCHAR 0x24BC -ENCODING 9404 -SWIDTH 1080 0 -DWIDTH 18 0 -BBX 17 17 1 -3 +STARTCHAR ZWa +ENCODING 62215 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 12 14 0 -2 BITMAP -07F000 -180C00 -200200 -43D100 -443100 -881080 -901080 -900080 -900080 -907880 -901080 -881080 -441100 -43F100 -200200 -180C00 -07F000 +70E0 +D9B0 +D9B0 +1980 +1F80 +1F80 +1980 +1980 +1980 +0180 +0180 +0180 +07E0 +0C30 ENDCHAR -STARTCHAR 0x24BD -ENCODING 9405 -SWIDTH 1080 0 -DWIDTH 18 0 -BBX 17 17 1 -3 +STARTCHAR ye +ENCODING 62216 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 7 12 0 0 BITMAP -07F000 -180C00 -200200 -5F7D00 -441100 -841080 -841080 -841080 -87F080 -841080 -841080 -841080 -441100 -5F7D00 -200200 -180C00 -07F000 +38 +6C +C6 +C6 +C6 +C6 +EC +78 +30 +30 +30 +30 ENDCHAR -STARTCHAR 0x24BE -ENCODING 9406 -SWIDTH 1080 0 -DWIDTH 18 0 -BBX 17 17 1 -3 +STARTCHAR yu +ENCODING 62217 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 8 12 0 0 BITMAP -07F000 -180C00 -200200 -43E100 -408100 -808080 -808080 -808080 -808080 -808080 -808080 -808080 -408100 -43E100 -200200 -180C00 -07F000 +38 +6C +C6 +C6 +C6 +C6 +EC +78 +30 +3F +33 +30 ENDCHAR -STARTCHAR 0x24BF -ENCODING 9407 -SWIDTH 1080 0 -DWIDTH 18 0 -BBX 17 17 1 -3 +STARTCHAR yi +ENCODING 62218 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 10 12 0 0 BITMAP -07F000 -180C00 -200200 -41F100 -404100 -804080 -804080 -804080 -804080 -804080 -804080 -804080 -424100 -438100 -200200 -180C00 -07F000 +3800 +6C00 +C600 +C600 +C600 +C600 +EC00 +7800 +3300 +3FC0 +30C0 +3000 ENDCHAR -STARTCHAR 0x24C0 -ENCODING 9408 -SWIDTH 1080 0 -DWIDTH 18 0 -BBX 17 17 1 -3 +STARTCHAR ya +ENCODING 62219 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 7 12 0 0 BITMAP -07F000 -180C00 -200200 -5F3D00 -441100 -842080 -844080 -848080 -85C080 -864080 -842080 -842080 -441100 -5F3D00 -200200 -180C00 -07F000 +38 +6C +C6 +C6 +C6 +CC +F8 +70 +38 +0C +38 +70 ENDCHAR -STARTCHAR 0x24C1 -ENCODING 9409 -SWIDTH 1080 0 -DWIDTH 18 0 -BBX 17 17 1 -3 +STARTCHAR yE +ENCODING 62220 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 10 12 0 0 BITMAP -07F000 -180C00 -200200 -47C100 -410100 -810080 -810080 -810080 -810080 -810880 -810880 -810880 -411900 -47F900 -200200 -180C00 -07F000 +3800 +6C00 +C600 +C600 +C600 +C600 +EC00 +7800 +3780 +3CC0 +3780 +3000 ENDCHAR -STARTCHAR 0x24C2 -ENCODING 9410 -SWIDTH 1080 0 -DWIDTH 18 0 -BBX 17 17 1 -3 +STARTCHAR y +ENCODING 62221 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 11 12 0 0 BITMAP -07F000 -180C00 -200200 -5C1D00 -4C1900 -8C1880 -8A2880 -8A2880 -8A4880 -894880 -894880 -888880 -488900 -5C9D00 -200200 -180C00 -07F000 +0F00 +1980 +3180 +3180 +3180 +1B00 +1E60 +0E60 +07C0 +7C00 +E000 +C000 ENDCHAR -STARTCHAR 0x24C3 -ENCODING 9411 -SWIDTH 1080 0 -DWIDTH 18 0 -BBX 17 17 1 -3 +STARTCHAR yo +ENCODING 62222 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 11 12 0 0 BITMAP -07F000 -180C00 -200200 -5C7D00 -461100 -861080 -851080 -851080 -849080 -845080 -845080 -843080 -443100 -5F1100 -200200 -180C00 -07F000 +3800 +6C00 +C600 +C7E0 +C660 +C600 +EC00 +7800 +3000 +3000 +3000 +3000 ENDCHAR -STARTCHAR 0x24C4 -ENCODING 9412 -SWIDTH 2100 0 -DWIDTH 35 0 -BBX 17 17 1 -3 +STARTCHAR de +ENCODING 62224 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 10 12 0 0 BITMAP -07F000 -180C00 -200200 -43C100 -442100 -881080 -900880 -900880 -900880 -900880 -900880 -881080 -442100 -43C100 -200200 -180C00 -07F000 +1C00 +3E00 +6200 +6200 +6600 +7C00 +3000 +1800 +1800 +0C00 +FFC0 +C0C0 ENDCHAR -STARTCHAR 0x24C5 -ENCODING 9413 -SWIDTH 1080 0 -DWIDTH 18 0 -BBX 17 17 1 -3 +STARTCHAR du +ENCODING 62225 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 12 12 0 0 BITMAP -07F000 -180C00 -200200 -4FF100 -421900 -820880 -820880 -821880 -83F080 -820080 -820080 -820080 -420100 -4F8100 -200200 -180C00 -07F000 +1C00 +3E00 +6200 +6600 +7C00 +3000 +1800 +7F00 +C300 +C3F0 +0630 +0600 ENDCHAR -STARTCHAR 0x24C6 -ENCODING 9414 -SWIDTH 1080 0 -DWIDTH 18 0 -BBX 17 17 1 -3 +STARTCHAR di +ENCODING 62226 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 11 12 0 0 BITMAP -07F000 -180C00 -200200 -43C100 -442100 -881080 -900880 -900880 -900880 -900880 -900880 -8B9080 -466100 -43C100 -204A00 -183C00 -07F000 +1C00 +3E00 +6200 +6600 +7C00 +3000 +1800 +7F00 +C300 +C300 +0660 +07E0 ENDCHAR -STARTCHAR 0x24C7 -ENCODING 9415 -SWIDTH 1080 0 -DWIDTH 18 0 -BBX 17 17 1 -3 +STARTCHAR da +ENCODING 62227 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 8 12 0 0 BITMAP -07F000 -180C00 -200200 -4FE100 -421100 -820880 -820880 -821080 -83E080 -823080 -821080 -821080 -421100 -4F8F00 -200200 -180C00 -07F000 +1C +3E +62 +66 +7C +30 +18 +FF +C3 +C3 +03 +03 ENDCHAR -STARTCHAR 0x24C8 -ENCODING 9416 -SWIDTH 1080 0 -DWIDTH 18 0 -BBX 17 17 1 -3 +STARTCHAR dE +ENCODING 62228 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 11 12 0 0 BITMAP -07F000 -180C00 -200200 -43E100 -442100 -842080 -840080 -820080 -818080 -804080 -802080 -842080 -442100 -47C100 -200200 -180C00 -07F000 +1C00 +3E00 +6200 +6200 +6600 +7C00 +3000 +1800 +1800 +0FC0 +FE60 +C3C0 ENDCHAR -STARTCHAR 0x24C9 -ENCODING 9417 -SWIDTH 1080 0 -DWIDTH 18 0 -BBX 17 17 1 -3 +STARTCHAR d +ENCODING 62229 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 11 12 0 0 BITMAP -07F000 -180C00 -200200 -4FF900 -488900 -888880 -888880 -808080 -808080 -808080 -808080 -808080 -408100 -43E100 -200200 -180C00 -07F000 +1C00 +3E00 +63E0 +6260 +6600 +7C00 +3000 +1800 +1800 +0C00 +FFC0 +C0C0 ENDCHAR -STARTCHAR 0x24CA -ENCODING 9418 -SWIDTH 1080 0 -DWIDTH 18 0 -BBX 17 17 1 -3 +STARTCHAR do +ENCODING 62230 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 9 12 0 0 BITMAP -07F000 -180C00 -200200 -5F7D00 -441100 -841080 -841080 -841080 -841080 -841080 -841080 -841080 -422100 -41C100 -200200 -180C00 -07F000 +0E00 +1F00 +3100 +3300 +3E00 +1C00 +3F80 +6180 +C000 +C000 +C000 +C000 ENDCHAR -STARTCHAR 0x24CB -ENCODING 9419 -SWIDTH 1080 0 -DWIDTH 18 0 -BBX 17 17 1 -3 +STARTCHAR dWa +ENCODING 62231 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 11 14 0 -2 BITMAP -07F000 -180C00 -200200 -5E3D00 -441100 -841080 -822080 -822080 -822080 -814080 -814080 -814080 -408100 -408100 -200200 -180C00 -07F000 +1C00 +3E00 +6200 +6600 +7C00 +3000 +1800 +FF00 +C300 +C300 +0300 +0300 +0FC0 +1860 ENDCHAR -STARTCHAR 0x24CC -ENCODING 9420 -SWIDTH 1080 0 -DWIDTH 18 0 -BBX 17 17 1 -3 +STARTCHAR De +ENCODING 62232 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 8 12 0 0 BITMAP -07F000 -180C00 -200200 -400100 -788F00 -908480 -908480 -914480 -894880 -894880 -894880 -8A2880 -463100 -463100 -241200 -180C00 -07F000 +10 +10 +38 +7C +C4 +CC +F8 +60 +30 +18 +FF +C3 ENDCHAR -STARTCHAR 0x24CD -ENCODING 9421 -SWIDTH 1080 0 -DWIDTH 18 0 -BBX 17 17 1 -3 +STARTCHAR Du +ENCODING 62233 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 12 12 0 0 BITMAP -07F000 -180C00 -200200 -5E7900 -422100 -824080 -814080 -818080 -808080 -814080 -834080 -822080 -441100 -5E3D00 -200200 -180C00 -07F000 +0800 +0800 +1C00 +3E00 +6200 +6600 +7C00 +3000 +7F00 +C3F0 +C630 +0600 ENDCHAR -STARTCHAR 0x24CE -ENCODING 9422 -SWIDTH 1080 0 -DWIDTH 18 0 -BBX 17 17 1 -3 +STARTCHAR Di +ENCODING 62234 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 11 12 0 0 BITMAP -07F000 -180C00 -200200 -5E3D00 -441100 -822080 -822080 -814080 -81C080 -808080 -808080 -808080 -408100 -43E100 -200200 -180C00 -07F000 +0800 +0800 +1C00 +3E00 +6200 +6600 +7C00 +3000 +7F00 +C300 +C660 +07E0 ENDCHAR -STARTCHAR 0x24CF -ENCODING 9423 -SWIDTH 2100 0 -DWIDTH 35 0 -BBX 17 17 1 -3 +STARTCHAR Da +ENCODING 62235 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 8 12 0 0 BITMAP -07F000 -180C00 -200200 -47F100 -462100 -842080 -844080 -804080 -808080 -811080 -811080 -821080 -423100 -47F100 -200200 -180C00 -07F000 +08 +08 +1C +3E +62 +66 +7C +30 +FF +C3 +03 +03 ENDCHAR -STARTCHAR 0x24D0 -ENCODING 9424 -SWIDTH 1080 0 -DWIDTH 18 0 -BBX 17 17 1 -3 +STARTCHAR DE +ENCODING 62236 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 11 12 0 0 BITMAP -07F000 -180C00 -200200 -400100 -400100 -838080 -844080 -804080 -83C080 -844080 -844080 -83E080 -400100 -400100 -200200 -180C00 -07F000 +1000 +1000 +3800 +7C00 +C400 +CC00 +F800 +6000 +3000 +1BC0 +FE60 +C3C0 +ENDCHAR +STARTCHAR D +ENCODING 62237 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 10 12 0 0 +BITMAP +1000 +1000 +3800 +7C00 +C7C0 +CCC0 +F800 +6000 +3000 +1800 +FF00 +C300 ENDCHAR -STARTCHAR 0x24D1 -ENCODING 9425 -SWIDTH 1080 0 -DWIDTH 18 0 -BBX 17 17 1 -3 +STARTCHAR Do +ENCODING 62238 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 10 12 0 0 BITMAP -07F000 -180C00 -230200 -410100 -410100 -810080 -810080 -81E080 -811080 -811080 -811080 -811080 -411100 -41E100 -200200 -180C00 -07F000 +0400 +0400 +0E00 +1F00 +3100 +3300 +3E00 +1FC0 +30C0 +6000 +6000 +6000 ENDCHAR -STARTCHAR 0x24D2 -ENCODING 9426 -SWIDTH 1080 0 -DWIDTH 18 0 -BBX 17 17 1 -3 +STARTCHAR je +ENCODING 62240 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 10 13 0 0 BITMAP -07F000 -180C00 -200200 -400100 -400100 -81C080 -822080 -820080 -820080 -820080 -822080 -81C080 -400100 -400100 -200200 -180C00 -07F000 +C0C0 +7F80 +0C00 +1E00 +3300 +3100 +3300 +1E00 +1800 +1C00 +0C00 +7F80 +6180 ENDCHAR -STARTCHAR 0x24D3 -ENCODING 9427 -SWIDTH 1080 0 -DWIDTH 18 0 -BBX 17 17 1 -3 +STARTCHAR ju +ENCODING 62241 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 13 13 0 0 BITMAP -07F000 -180C00 -20C200 -404100 -404100 -804080 -804080 -83C080 -844080 -844080 -844080 -844080 -444100 -43E100 -200200 -180C00 -07F000 +C0C0 +7F80 +0C00 +1E00 +3300 +3300 +1E00 +0C00 +3F80 +6180 +61F8 +0318 +0300 ENDCHAR -STARTCHAR 0x24D4 -ENCODING 9428 -SWIDTH 1080 0 -DWIDTH 18 0 -BBX 17 17 1 -3 +STARTCHAR ji +ENCODING 62242 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 12 13 0 0 BITMAP -07F000 -180C00 -200200 -400100 -400100 -81C080 -822080 -83E080 -820080 -820080 -822080 -81C080 -400100 -400100 -200200 -180C00 -07F000 +C0C0 +7F80 +0C00 +1E00 +3300 +3300 +1E00 +0C00 +3F80 +6180 +6180 +0330 +03F0 ENDCHAR -STARTCHAR 0x24D5 -ENCODING 9429 -SWIDTH 1080 0 -DWIDTH 18 0 -BBX 17 17 1 -3 +STARTCHAR ja +ENCODING 62243 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 10 13 0 0 BITMAP -07F000 -180C00 -20E200 -412100 -410100 -810080 -810080 -83C080 -810080 -810080 -810080 -810080 -410100 -438100 -200200 -180C00 -07F000 +C0C0 +7F80 +0C00 +1E00 +3300 +3300 +1E00 +0C00 +7F80 +6180 +6180 +0180 +0180 ENDCHAR -STARTCHAR 0x24D6 -ENCODING 9430 -SWIDTH 1080 0 -DWIDTH 18 0 -BBX 17 17 1 -3 +STARTCHAR jE +ENCODING 62244 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 12 13 0 0 BITMAP -07F000 -180C00 -200200 -41F100 -422100 -822080 -822080 -83C080 -820080 -83E080 -841080 -841080 -441100 -43E100 -200200 -180C00 -07F000 +C0C0 +7F80 +0C00 +1E00 +3300 +3100 +3300 +1E00 +1800 +1C00 +0FE0 +7F30 +61E0 ENDCHAR -STARTCHAR 0x24D7 -ENCODING 9431 -SWIDTH 1080 0 -DWIDTH 18 0 -BBX 17 17 1 -3 +STARTCHAR j +ENCODING 62245 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 12 13 0 0 BITMAP -07F000 -180C00 -260200 -420100 -420100 -820080 -820080 -83C080 -822080 -822080 -822080 -822080 -422100 -477100 -200200 -180C00 -07F000 +C0C0 +7F80 +0C00 +1E00 +3300 +31F0 +3330 +1E00 +1800 +1C00 +0C00 +7F80 +6180 ENDCHAR -STARTCHAR 0x24D8 -ENCODING 9432 -SWIDTH 1080 0 -DWIDTH 18 0 -BBX 17 17 1 -3 +STARTCHAR jo +ENCODING 62246 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 10 13 0 0 BITMAP -07F000 -180C00 -200200 -418100 -418100 -800080 -800080 -818080 -808080 -808080 -808080 -808080 -408100 -41C100 -200200 -180C00 -07F000 +C0C0 +7F80 +0C00 +1E00 +3300 +3300 +1E00 +1FC0 +30C0 +6000 +6000 +6000 +6000 ENDCHAR -STARTCHAR 0x24D9 -ENCODING 9433 -SWIDTH 1080 0 -DWIDTH 18 0 -BBX 17 17 1 -3 +STARTCHAR ge +ENCODING 62248 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 7 11 0 0 BITMAP -07F000 -180C00 -20C200 -40C100 -400100 -800080 -80C080 -804080 -804080 -804080 -804080 -804080 -404100 -424100 -238200 -180C00 -07F000 +7C +C6 +C6 +06 +06 +06 +0C +0C +0C +0C +0C ENDCHAR -STARTCHAR 0x24DA -ENCODING 9434 -SWIDTH 1080 0 -DWIDTH 18 0 -BBX 17 17 1 -3 +STARTCHAR gu +ENCODING 62249 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 11 11 0 0 BITMAP -07F000 -180C00 -260200 -420100 -420100 -820080 -820080 -82F080 -824080 -828080 -838080 -82C080 -424100 -477100 -200200 -180C00 -07F000 +7C00 +C600 +C600 +0600 +0600 +0600 +0FE0 +0C60 +0C00 +0C00 +0C00 ENDCHAR -STARTCHAR 0x24DB -ENCODING 9435 -SWIDTH 1080 0 -DWIDTH 18 0 -BBX 17 17 1 -3 +STARTCHAR gi +ENCODING 62250 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 10 11 0 0 BITMAP -07F000 -180C00 -218200 -408100 -408100 -808080 -808080 -808080 -808080 -808080 -808080 -808080 -408100 -41C100 -200200 -180C00 -07F000 +7C00 +C600 +C600 +0600 +0600 +0600 +0C00 +0C00 +0C00 +0CC0 +0FC0 ENDCHAR -STARTCHAR 0x24DC -ENCODING 9436 -SWIDTH 1080 0 -DWIDTH 18 0 -BBX 17 17 1 -3 +STARTCHAR ga +ENCODING 62251 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 7 11 0 0 BITMAP -07F000 -180C00 -200200 -400100 -400100 -9F7080 -888880 -888880 -888880 -888880 -888880 -9DDC80 -400100 -400100 -200200 -180C00 -07F000 +78 +FE +C6 +06 +06 +06 +0C +1C +78 +E0 +C0 ENDCHAR -STARTCHAR 0x24DD -ENCODING 9437 -SWIDTH 1080 0 -DWIDTH 18 0 -BBX 17 17 1 -3 +STARTCHAR gE +ENCODING 62252 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 10 11 0 0 BITMAP -07F000 -180C00 -200200 -400100 -400100 -87C080 -822080 -822080 -822080 -822080 -822080 -877080 -400100 -400100 -200200 -180C00 -07F000 +7C00 +C600 +C600 +0600 +0600 +0600 +0C00 +0C00 +0F80 +0CC0 +0F80 ENDCHAR -STARTCHAR 0x24DE -ENCODING 9438 -SWIDTH 1080 0 -DWIDTH 18 0 -BBX 17 17 1 -3 +STARTCHAR g +ENCODING 62253 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 9 11 0 0 BITMAP -07F000 -180C00 -200200 -400100 -400100 -81C080 -822080 -822080 -822080 -822080 -822080 -81C080 -400100 -400100 -200200 -180C00 -07F000 +7F00 +CD80 +7980 +0180 +0180 +0300 +0300 +0300 +0300 +0300 +0300 ENDCHAR -STARTCHAR 0x24DF -ENCODING 9439 -SWIDTH 1080 0 -DWIDTH 18 0 -BBX 17 17 1 -3 +STARTCHAR go +ENCODING 62254 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 7 12 0 0 BITMAP -07F000 -180C00 -200200 -400100 -47C100 -822080 -822080 -822080 -822080 -822080 -83C080 -820080 -420100 -470100 -200200 -180C00 -07F000 +10 +10 +10 +7C +C6 +C6 +06 +04 +0C +0C +0C +0C ENDCHAR -STARTCHAR 0x24E0 -ENCODING 9440 -SWIDTH 1080 0 -DWIDTH 18 0 -BBX 17 17 1 -3 +STARTCHAR gWe +ENCODING 62256 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 12 11 0 0 BITMAP -07F000 -180C00 -200200 -400100 -43C100 -844080 -844080 -844080 -844080 -844080 -83C080 -804080 -404100 -40E100 -200200 -180C00 -07F000 +7C00 +C600 +C600 +0600 +0600 +07E0 +0EB0 +0CE0 +0C00 +0C00 +0C00 ENDCHAR -STARTCHAR 0x24E1 -ENCODING 9441 -SWIDTH 1080 0 -DWIDTH 18 0 -BBX 17 17 1 -3 +STARTCHAR gWu/gW +ENCODING 62257 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 12 11 0 0 BITMAP -07F000 -180C00 -200200 -400100 -400100 -834080 -81A080 -810080 -810080 -810080 -810080 -83C080 -400100 -400100 -200200 -180C00 -07F000 +7C00 +C6C0 +C6C0 +07F0 +0630 +0600 +0E00 +0C00 +0C00 +0C00 +0C00 ENDCHAR -STARTCHAR 0x24E2 -ENCODING 9442 -SWIDTH 1080 0 -DWIDTH 18 0 -BBX 17 17 1 -3 +STARTCHAR gWi +ENCODING 62258 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 11 11 0 0 BITMAP -07F000 -180C00 -200200 -400100 -400100 -81E080 -822080 -820080 -81C080 -802080 -822080 -83C080 -400100 -400100 -200200 -180C00 -07F000 +7C00 +C600 +C600 +0600 +06C0 +06C0 +0FC0 +0C60 +0C60 +0C00 +0C00 ENDCHAR -STARTCHAR 0x24E3 -ENCODING 9443 -SWIDTH 1080 0 -DWIDTH 18 0 -BBX 17 17 1 -3 +STARTCHAR gWa +ENCODING 62259 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 7 11 0 0 BITMAP -07F000 -180C00 -200200 -410100 -410100 -830080 -87C080 -810080 -810080 -810080 -812080 -812080 -40C100 -400100 -200200 -180C00 -07F000 +78 +CC +CC +0C +7E +66 +06 +06 +06 +06 +06 ENDCHAR -STARTCHAR 0x24E4 -ENCODING 9444 -SWIDTH 1080 0 -DWIDTH 18 0 -BBX 17 17 1 -3 +STARTCHAR gWE +ENCODING 62260 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 10 13 0 -2 BITMAP -07F000 -180C00 -200200 -400100 -400100 -866080 -822080 -822080 -822080 -822080 -822080 -81F080 -400100 -400100 -200200 -180C00 -07F000 +7C00 +C600 +C600 +0600 +0600 +0600 +0C00 +0C00 +0C00 +0F80 +0CC0 +3F80 +6000 ENDCHAR -STARTCHAR 0x24E5 -ENCODING 9445 -SWIDTH 1080 0 -DWIDTH 18 0 -BBX 17 17 1 -3 +STARTCHAR Ge +ENCODING 62264 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 8 12 0 0 BITMAP -07F000 -180C00 -200200 -400100 -400100 -873880 -812080 -812080 -812080 -80C080 -80C080 -80C080 -400100 -400100 -200200 -180C00 -07F000 +C3 +7E +00 +7C +C6 +C6 +06 +04 +0C +0C +0C +0C ENDCHAR -STARTCHAR 0x24E6 -ENCODING 9446 -SWIDTH 1080 0 -DWIDTH 18 0 -BBX 17 17 1 -3 +STARTCHAR Gu +ENCODING 62265 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 11 12 0 0 BITMAP -07F000 -180C00 -200200 -400100 -400100 -9DDC80 -849080 -855080 -855080 -855080 -836080 -822080 -400100 -400100 -200200 -180C00 -07F000 +C300 +7E00 +0000 +7C00 +C600 +C600 +0600 +0600 +0FE0 +0C60 +0C00 +0C00 ENDCHAR -STARTCHAR 0x24E7 -ENCODING 9447 -SWIDTH 1080 0 -DWIDTH 18 0 -BBX 17 17 1 -3 +STARTCHAR Gi +ENCODING 62266 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 10 12 0 0 BITMAP -07F000 -180C00 -200200 -400100 -400100 -8E7080 -824080 -818080 -818080 -818080 -824080 -8E7080 -400100 -400100 -200200 -180C00 -07F000 +C300 +7E00 +0000 +7C00 +C600 +C600 +0600 +0400 +0C00 +0C00 +0CC0 +0FC0 ENDCHAR -STARTCHAR 0x24E8 -ENCODING 9448 -SWIDTH 1080 0 -DWIDTH 18 0 -BBX 17 17 1 -3 +STARTCHAR Ga +ENCODING 62267 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 8 12 0 0 BITMAP -07F000 -180C00 -200200 -400100 -473900 -812080 -812080 -812080 -80C080 -80C080 -80C080 -808080 -448100 -470100 -200200 -180C00 -07F000 +C3 +7E +00 +3C +7F +43 +03 +03 +0E +3C +70 +E0 ENDCHAR -STARTCHAR 0x24E9 -ENCODING 9449 -SWIDTH 1080 0 -DWIDTH 18 0 -BBX 17 17 1 -3 +STARTCHAR GE +ENCODING 62268 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 10 12 0 0 BITMAP -07F000 -180C00 -200200 -400100 -400100 -83E080 -824080 -824080 -808080 -812080 -812080 -83E080 -400100 -400100 -200200 -180C00 -07F000 +C300 +7E00 +0000 +7C00 +C600 +C600 +0600 +0400 +0C00 +0F80 +0CC0 +0F80 ENDCHAR -STARTCHAR 0x24EA -ENCODING 9450 -SWIDTH 1080 0 -DWIDTH 18 0 -BBX 17 17 1 -3 +STARTCHAR G +ENCODING 62269 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 9 12 0 0 BITMAP -07F000 -180C00 -200200 -41C100 -414100 -822080 -822080 -822080 -822080 -822080 -822080 -822080 -414100 -41C100 -200200 -180C00 -07F000 +C300 +7E00 +0000 +7F00 +CD80 +7980 +0180 +0100 +0300 +0300 +0300 +0300 ENDCHAR -STARTCHAR 0x25A0 -ENCODING 9632 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 9 1 1 +STARTCHAR Go +ENCODING 62270 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 7 12 0 0 BITMAP -FF80 -FF80 -FF80 -FF80 -FF80 -FF80 -FF80 -FF80 -FF80 +C6 +7C +10 +7C +C6 +C6 +06 +04 +0C +0C +0C +0C ENDCHAR -STARTCHAR 0x25A1 -ENCODING 9633 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 9 1 1 +STARTCHAR Te +ENCODING 62272 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 9 10 0 0 BITMAP -FF80 -8080 -8080 -8080 -8080 -8080 -8080 -8080 -FF80 +3E00 +6B00 +6B00 +C980 +C980 +C980 +C980 +C980 +C980 +C980 ENDCHAR -STARTCHAR 0x25A2 -ENCODING 9634 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 9 1 1 +STARTCHAR Tu +ENCODING 62273 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 13 10 0 0 BITMAP -7F00 -8080 -8080 -8080 -8080 -8080 -8080 -8080 -7F00 +3E00 +6B00 +6B00 +C980 +C980 +C9F8 +C998 +C980 +C980 +C980 ENDCHAR -STARTCHAR 0x25A3 -ENCODING 9635 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 9 1 1 +STARTCHAR Ti +ENCODING 62274 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 13 10 0 0 BITMAP -FF80 -8080 -BE80 -BE80 -BE80 -BE80 -BE80 -8080 -FF80 +3E00 +6B00 +6B00 +C980 +C980 +C980 +C980 +C980 +C998 +C9F8 ENDCHAR -STARTCHAR 0x25A4 -ENCODING 9636 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 9 1 1 +STARTCHAR Ta +ENCODING 62275 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 9 11 0 0 BITMAP -FF80 -8080 -FF80 -8080 -FF80 -8080 -FF80 -8080 -FF80 +3E00 +6B00 +6B00 +C980 +C980 +C980 +C980 +0180 +0180 +0180 +0180 ENDCHAR -STARTCHAR 0x25A5 -ENCODING 9637 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 9 1 1 +STARTCHAR TE +ENCODING 62276 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 13 11 0 0 BITMAP -FF80 -AA80 -AA80 -AA80 -AA80 -AA80 -AA80 -AA80 -FF80 +3E00 +6B00 +6B00 +C980 +C980 +C980 +C980 +C980 +C9F0 +C998 +C9F0 ENDCHAR -STARTCHAR 0x25A6 -ENCODING 9638 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 9 1 1 +STARTCHAR T +ENCODING 62277 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 11 11 0 0 BITMAP -FF80 -AA80 -FF80 -AA80 -FF80 -AA80 -FF80 -AA80 -FF80 +3F80 +7FC0 +4CC0 +CC60 +CE60 +C660 +0600 +0600 +0600 +0600 +0600 ENDCHAR -STARTCHAR 0x25A7 -ENCODING 9639 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 9 1 1 +STARTCHAR To +ENCODING 62278 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 9 11 0 0 BITMAP -FF80 -9280 +3E00 +6B00 +6B00 C980 -A480 -9280 C980 -A480 -9280 -FF80 +C980 +C980 +C000 +C000 +C000 +C000 ENDCHAR -STARTCHAR 0x25A8 -ENCODING 9640 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 9 1 1 +STARTCHAR TWa +ENCODING 62279 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 12 13 0 -2 BITMAP -FF80 -A480 +3E00 +6B00 +6B00 C980 -9280 -A480 C980 -9280 -A480 -FF80 +C980 +C980 +0180 +0180 +0180 +0180 +07E0 +0C30 ENDCHAR -STARTCHAR 0x25A9 -ENCODING 9641 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 9 1 1 +STARTCHAR Ce +ENCODING 62280 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 15 10 0 0 BITMAP -FF80 -D580 -AA80 -D580 -AA80 -D580 -AA80 -D580 -FF80 +1F80 +3FC0 +6260 +C230 +C230 +C230 +F338 +DAB6 +CAB2 +FBBE ENDCHAR -STARTCHAR 0x25AA -ENCODING 9642 -SWIDTH 360 0 -DWIDTH 6 0 -BBX 5 5 3 3 +STARTCHAR Cu +ENCODING 62281 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 16 10 0 0 BITMAP -F8 -F8 -F8 -F8 -F8 +1F80 +3FC0 +6260 +C230 +C23F +C233 +F338 +DAB4 +CAB2 +FBBE ENDCHAR -STARTCHAR 0x25AB -ENCODING 9643 -SWIDTH 360 0 -DWIDTH 6 0 -BBX 5 5 3 3 +STARTCHAR Ci +ENCODING 62282 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 16 10 0 0 BITMAP -F8 -88 -88 -88 -F8 +1F80 +3FC0 +6260 +C230 +C230 +C230 +F330 +DAB0 +CAB3 +FBBF ENDCHAR -STARTCHAR 0x25AC -ENCODING 9644 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 10 5 1 3 +STARTCHAR Ca +ENCODING 62283 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 14 12 0 0 BITMAP -FFC0 -FFC0 -FFC0 -FFC0 -FFC0 +1FC0 +3FE0 +6230 +C230 +E330 +D2B0 +CAB0 +FBB0 +0030 +0068 +0064 +007C ENDCHAR -STARTCHAR 0x25AD -ENCODING 9645 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 10 5 1 3 +STARTCHAR CE +ENCODING 62284 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 16 10 0 0 BITMAP -FFC0 -8040 -8040 -8040 -FFC0 +1F80 +3FC0 +6260 +C23F +C239 +C237 +F330 +DABC +CAB2 +FBBE ENDCHAR -STARTCHAR 0x25AE -ENCODING 9646 -SWIDTH 360 0 -DWIDTH 6 0 -BBX 5 10 1 0 +STARTCHAR C +ENCODING 62285 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 14 11 0 0 BITMAP -F8 -F8 -F8 -F8 -F8 -F8 -F8 -F8 -F8 -F8 +1FC0 +7FE0 +C630 +E638 +9724 +F33C +0300 +0380 +0340 +0320 +03E0 ENDCHAR -STARTCHAR 0x25AF -ENCODING 9647 -SWIDTH 360 0 -DWIDTH 6 0 -BBX 5 10 1 0 +STARTCHAR Co +ENCODING 62286 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 14 12 0 0 BITMAP -F8 -88 -88 -88 -88 -88 -88 -88 -88 -F8 +1FC0 +3FE0 +3430 +6430 +4630 +C528 +C4A4 +C738 +E000 +D000 +C800 +F800 ENDCHAR -STARTCHAR 0x25B0 -ENCODING 9648 -SWIDTH 780 0 -DWIDTH 13 0 -BBX 12 5 1 3 +STARTCHAR CWa +ENCODING 62287 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 14 13 0 -2 BITMAP -1FF0 +1FC0 3FE0 -7FE0 -7FC0 -FF80 +6230 +C230 +E330 +D2B0 +CAB0 +FBB0 +0030 +0060 +0060 +01F8 +030C ENDCHAR -STARTCHAR 0x25B1 -ENCODING 9649 -SWIDTH 780 0 -DWIDTH 13 0 -BBX 12 5 1 3 +STARTCHAR Pe +ENCODING 62288 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 8 12 0 0 BITMAP -1FF0 -2010 -4020 -8040 -FF80 +18 +18 +18 +3C +66 +66 +3C +7E +E7 +C3 +C3 +C3 ENDCHAR -STARTCHAR 0x25B2 -ENCODING 9650 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 10 1 1 +STARTCHAR Pu +ENCODING 62289 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 12 12 0 0 BITMAP -0800 -0800 -1C00 -1C00 -3E00 -3E00 -7F00 -7F00 -FF80 -FF80 +1800 +1800 +1800 +3C00 +6600 +6600 +3C00 +7E00 +E700 +C3F0 +C330 +C300 ENDCHAR -STARTCHAR 0x25B3 -ENCODING 9651 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 10 1 1 +STARTCHAR Pi +ENCODING 62290 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 12 12 0 0 BITMAP -0800 -0800 -1400 -1400 -2200 -2200 -4100 -4100 -8080 -FF80 +1800 +1800 +1800 +3C00 +6600 +6600 +3C00 +7E00 +E700 +C300 +C330 +C3F0 +ENDCHAR +STARTCHAR Pa +ENCODING 62291 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 8 12 0 0 +BITMAP +18 +18 +18 +3C +66 +3C +7E +E7 +C7 +C3 +03 +03 +ENDCHAR +STARTCHAR PE +ENCODING 62292 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 12 12 0 0 +BITMAP +1800 +1800 +1800 +3C00 +6600 +6600 +3C00 +7E00 +E700 +C3E0 +C330 +C3E0 +ENDCHAR +STARTCHAR P +ENCODING 62293 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 11 12 0 0 +BITMAP +1800 +1800 +1800 +3C00 +67E0 +6660 +3C00 +7E00 +E700 +C300 +C300 +C300 +ENDCHAR +STARTCHAR Po +ENCODING 62294 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 8 12 0 0 +BITMAP +18 +18 +18 +3C +66 +3C +7E +E7 +C3 +C3 +C0 +C0 +ENDCHAR +STARTCHAR Se +ENCODING 62296 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 8 10 0 0 +BITMAP +18 +3C +66 +66 +3C +7E +E7 +C3 +C3 +C3 ENDCHAR -STARTCHAR 0x25B4 -ENCODING 9652 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 7 1 2 +STARTCHAR Su +ENCODING 62297 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 12 10 0 0 BITMAP -10 -38 -38 -7C -7C -FE -FE +1800 +3C00 +6600 +6600 +3C00 +7E00 +E700 +C3F0 +C330 +C300 ENDCHAR -STARTCHAR 0x25B5 -ENCODING 9653 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 7 1 2 +STARTCHAR Si +ENCODING 62298 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 12 10 0 0 BITMAP -10 -28 -28 -44 -44 -82 -FE +1800 +3C00 +6600 +6600 +3C00 +7E00 +E700 +C300 +C330 +C3F0 ENDCHAR -STARTCHAR 0x25B6 -ENCODING 9654 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 10 9 1 1 +STARTCHAR Sa +ENCODING 62299 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 8 11 0 0 BITMAP -C000 -F000 -FC00 -FF00 -FFC0 -FF00 -FC00 -F000 -C000 +18 +3C +66 +66 +3C +7E +E6 +C7 +C3 +03 +03 ENDCHAR -STARTCHAR 0x25B7 -ENCODING 9655 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 10 9 1 1 +STARTCHAR SE +ENCODING 62300 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 11 10 0 0 BITMAP -C000 -B000 -8C00 -8300 -80C0 -8300 -8C00 -B000 -C000 +1800 +3C00 +6600 +6600 +3C00 +7E00 +E700 +C3C0 +C360 +C3C0 ENDCHAR -STARTCHAR 0x25B8 -ENCODING 9656 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 7 1 2 +STARTCHAR S +ENCODING 62301 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 11 10 0 0 BITMAP -C0 -F0 -FC -FE -FC -F0 -C0 +1800 +3C00 +67E0 +6660 +3C00 +7E00 +E700 +C300 +C300 +C300 ENDCHAR -STARTCHAR 0x25B9 -ENCODING 9657 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 7 1 2 +STARTCHAR So +ENCODING 62302 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 8 11 0 0 BITMAP +18 +3C +66 +66 +3C +7E +E7 +C3 +C3 C0 -B0 -8C -82 -8C -B0 C0 ENDCHAR -STARTCHAR 0x25BA -ENCODING 9658 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 10 5 1 3 +STARTCHAR SWa +ENCODING 62303 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 11 13 0 -2 BITMAP -F000 -FF00 -FFC0 -FF00 -F000 +1800 +3C00 +6600 +6600 +3C00 +7E00 +E600 +C700 +C300 +0300 +0300 +0FC0 +1860 ENDCHAR -STARTCHAR 0x25BB -ENCODING 9659 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 10 5 1 3 +STARTCHAR `Se/S2e +ENCODING 62304 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 8 11 0 0 BITMAP -F000 -8F00 -80C0 -8F00 -F000 +1E +63 +C3 +C3 +C3 +FF +C3 +C3 +C3 +7F +60 ENDCHAR -STARTCHAR 0x25BC -ENCODING 9660 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 10 1 1 +STARTCHAR `Su/S2u +ENCODING 62305 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 12 11 0 0 BITMAP -FF80 -FF80 -7F00 +1E00 +6300 +C300 +C300 +C300 +FF00 +C3F0 +C330 +C300 7F00 +6000 +ENDCHAR +STARTCHAR `Si/S2i +ENCODING 62306 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 12 12 0 0 +BITMAP 3E00 +6300 +C300 +FF00 +C300 +C300 +7F80 +0180 +0180 +0300 +0330 +03F0 +ENDCHAR +STARTCHAR `Sa/S2a +ENCODING 62307 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 9 12 0 0 +BITMAP 3E00 -1C00 -1C00 -0800 -0800 +6300 +C300 +FF00 +C300 +C300 +7F80 +0180 +0180 +0180 +0300 +0300 ENDCHAR -STARTCHAR 0x25BD -ENCODING 9661 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 10 1 1 +STARTCHAR `SE/S2E +ENCODING 62308 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 12 12 0 0 BITMAP -FF80 -8080 -4100 -4100 -2200 -2200 -1400 -1400 -0800 -0800 +3E00 +6300 +C300 +FF00 +C300 +C300 +7F80 +0180 +0180 +03E0 +0330 +03E0 ENDCHAR -STARTCHAR 0x25BE -ENCODING 9662 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 7 1 2 +STARTCHAR `S/S2 +ENCODING 62309 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 8 13 0 0 BITMAP -FE -FE -7C -7C -38 -38 -10 +18 +18 +18 +7E +E3 +C3 +C3 +FF +C3 +C3 +C3 +7F +60 ENDCHAR -STARTCHAR 0x25BF -ENCODING 9663 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 7 1 2 +STARTCHAR `So/S2o +ENCODING 62310 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 8 12 0 0 BITMAP -FE -82 -44 -44 -28 -28 -10 +3C +66 +C3 +FF +C3 +E7 +7E +3C +70 +C0 +C0 +C0 ENDCHAR -STARTCHAR 0x25C0 -ENCODING 9664 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 10 9 1 1 +STARTCHAR `SWa +ENCODING 62311 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 11 14 0 -2 BITMAP -00C0 -03C0 -0FC0 -3FC0 -FFC0 -3FC0 +3E00 +6300 +C300 +FF00 +C300 +C300 +7F80 +0180 +0180 +0180 +0300 +0300 0FC0 -03C0 -00C0 +1860 ENDCHAR -STARTCHAR 0x25C1 -ENCODING 9665 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 10 9 1 1 +STARTCHAR fe +ENCODING 62312 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 10 11 0 0 BITMAP -00C0 -0340 -0C40 -3040 -C040 -3040 -0C40 -0340 -00C0 +0600 +0200 +0600 +0C00 +1800 +3000 +7800 +CC00 +C440 +7FC0 +1F40 ENDCHAR -STARTCHAR 0x25C2 -ENCODING 9666 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 7 1 2 +STARTCHAR fu +ENCODING 62313 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 9 12 0 0 BITMAP -06 -1E -7E -FE -7E -1E -06 +0400 +0C00 +1800 +3000 +6000 +F800 +C880 +CF80 +FE00 +1800 +3000 +3000 ENDCHAR -STARTCHAR 0x25C3 -ENCODING 9667 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 7 1 2 +STARTCHAR fi +ENCODING 62314 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 10 11 0 0 BITMAP -06 -1A -62 -82 -62 -1A -06 +0600 +0200 +0600 +0C00 +1800 +3000 +78C0 +CC40 +C4C0 +7F80 +3E00 ENDCHAR -STARTCHAR 0x25C4 -ENCODING 9668 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 10 5 1 3 +STARTCHAR fa +ENCODING 62315 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 10 12 0 0 BITMAP -03C0 -3FC0 -FFC0 -3FC0 -03C0 +0800 +0C00 +1800 +1000 +3000 +7000 +D800 +CC80 +7FC0 +0C40 +0C00 +0C00 ENDCHAR -STARTCHAR 0x25C5 -ENCODING 9669 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 10 5 1 3 +STARTCHAR fE +ENCODING 62316 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 11 12 0 0 BITMAP -03C0 -3C40 -C040 -3C40 -03C0 +0600 +0200 +0600 +0C00 +1800 +3000 +7800 +CC00 +C4C0 +7FA0 +1F20 +01C0 ENDCHAR -STARTCHAR 0x25C6 -ENCODING 9670 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 9 1 1 +STARTCHAR f +ENCODING 62317 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 8 12 0 0 BITMAP -0800 -1C00 -3E00 -7F00 -FF80 -7F00 -3E00 -1C00 -0800 +3E +67 +43 +C0 +C0 +F8 +CF +DD +6C +0C +0C +0C ENDCHAR -STARTCHAR 0x25C7 -ENCODING 9671 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 9 1 1 +STARTCHAR fo +ENCODING 62318 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 10 11 0 0 BITMAP -0800 -1400 -2200 -4100 -8080 -4100 -2200 -1400 -0800 +1F80 +3E40 +63C0 +C000 +C000 +C000 +F000 +E800 +C4C0 +6D80 +3F80 ENDCHAR -STARTCHAR 0x25C8 -ENCODING 9672 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 9 1 1 +STARTCHAR fWa +ENCODING 62319 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 10 13 0 -2 BITMAP -0800 -1400 -2A00 -5D00 -BE80 -5D00 -2A00 -1400 0800 +0C00 +1800 +1000 +3000 +7000 +D800 +CC80 +7FC0 +0C40 +0C00 +3F00 +6180 ENDCHAR -STARTCHAR 0x25C9 -ENCODING 9673 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 9 1 1 +STARTCHAR pe +ENCODING 62320 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 10 12 0 0 BITMAP -3E00 -4100 -9C80 -BE80 -BE80 -BE80 -9C80 -4100 -3E00 +6180 +7F80 +FFC0 +CCC0 +0C00 +0C00 +0C00 +0C00 +0C00 +0C00 +0C00 +0C00 ENDCHAR -STARTCHAR 0x25CA -ENCODING 9674 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 12 1 0 +STARTCHAR pu +ENCODING 62321 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 10 12 0 0 BITMAP -10 -28 -28 -44 -44 -82 -82 -44 -44 -28 -28 -10 +6180 +7F80 +FFC0 +CCC0 +0C00 +0C00 +0C00 +0FC0 +0CC0 +0C00 +0C00 +0C00 ENDCHAR -STARTCHAR 0x25CB -ENCODING 9675 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 9 1 1 +STARTCHAR pi +ENCODING 62322 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 10 12 0 0 BITMAP -3E00 -4100 -8080 -8080 -8080 -8080 -8080 -4100 -3E00 +6180 +7F80 +FFC0 +CCC0 +0C00 +0C00 +0C00 +0C00 +0C00 +0C00 +0CC0 +0FC0 ENDCHAR -STARTCHAR 0x25CC -ENCODING 9676 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 9 1 1 +STARTCHAR pa +ENCODING 62323 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 10 12 0 0 BITMAP -3600 -0000 -8080 -8080 -0000 -8080 -8080 -0000 -3600 +6180 +7F80 +FFC0 +CCC0 +0C00 +0C00 +0C00 +0C00 +1800 +3000 +6000 +4000 ENDCHAR -STARTCHAR 0x25CD -ENCODING 9677 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 9 1 1 +STARTCHAR pE +ENCODING 62324 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 10 12 0 0 BITMAP -3E00 -6B00 -AA80 -AA80 -AA80 -AA80 -AA80 -6B00 -3E00 +6180 +7F80 +FFC0 +CCC0 +0C00 +0C00 +0C00 +0C00 +0C00 +0F80 +0CC0 +0F80 ENDCHAR -STARTCHAR 0x25CE -ENCODING 9678 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 9 1 1 +STARTCHAR p +ENCODING 62325 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 10 12 0 0 BITMAP -3E00 -4100 -9C80 -A280 -A280 -A280 -9C80 -4100 -3E00 +6180 +7F80 +FFC0 +CCC0 +0C00 +0F00 +0300 +0300 +0300 +0300 +0300 +0300 ENDCHAR -STARTCHAR 0x25CF -ENCODING 9679 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 9 1 1 +STARTCHAR po +ENCODING 62326 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 10 12 0 0 BITMAP -3E00 -7F00 -FF80 -FF80 -FF80 -FF80 -FF80 -7F00 -3E00 +6180 +7F80 +FFC0 +CCC0 +0C00 +0C00 +1800 +1800 +3000 +3000 +3000 +3000 ENDCHAR -STARTCHAR 0x25D0 -ENCODING 9680 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 9 1 1 +STARTCHAR char63696 +ENCODING 63696 +SWIDTH 900 0 +DWIDTH 15 0 +BBX 14 14 1 -1 BITMAP -3E00 -7100 -F080 -F080 -F080 -F080 -F080 -7100 -3E00 +00FC +01E0 +0180 +0380 +0780 +0780 +0FF0 +1F00 +3FE0 +7FF0 +FFF8 +0018 +000C +0004 ENDCHAR -STARTCHAR 0x25D1 -ENCODING 9681 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 9 1 1 +STARTCHAR char63697 +ENCODING 63697 +SWIDTH 840 0 +DWIDTH 14 0 +BBX 13 14 1 -1 BITMAP -3E00 -4700 -8780 -8780 -8780 -8780 -8780 -4700 -3E00 +1878 +38C0 +7F80 +FF00 +7F00 +3300 +3300 +0100 +0100 +0180 +0080 +00C0 +0060 +0020 ENDCHAR -STARTCHAR 0x25D2 -ENCODING 9682 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 9 1 1 +STARTCHAR char63698 +ENCODING 63698 +SWIDTH 900 0 +DWIDTH 15 0 +BBX 14 13 1 -1 BITMAP -3E00 -7F00 -FF80 -FF80 -8080 -8080 -8080 -4100 -3E00 +1804 +1808 +3C08 +3E08 +7E08 +7F18 +63F8 +C3F8 +8038 +0038 +0878 +0FF0 +03E0 ENDCHAR -STARTCHAR 0x25D3 -ENCODING 9683 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 9 1 1 +STARTCHAR char63699 +ENCODING 63699 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 11 13 1 0 BITMAP -3E00 -4100 -8080 -8080 -8080 -FF80 +2000 +3000 +3800 +3800 +1C00 +0E00 +1300 +3180 +60C0 +40E0 +F0E0 FF80 -7F00 -3E00 +7E00 ENDCHAR -STARTCHAR 0x25D4 -ENCODING 9684 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 9 1 1 +STARTCHAR char63700 +ENCODING 63700 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 10 13 1 0 BITMAP -3E00 -4F00 -8F80 -8F80 -8F80 -8080 -8080 -4100 -3E00 +FFC0 +FFC0 +FFC0 +F000 +E000 +E000 +E000 +E000 +E000 +E000 +7000 +6000 +6000 ENDCHAR -STARTCHAR 0x25D5 -ENCODING 9685 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 9 1 1 +STARTCHAR char63701 +ENCODING 63701 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 15 13 1 0 BITMAP -3E00 -4700 -8780 -8780 -8780 -FF80 -FF80 -7F00 -3E00 +0FFC +07FE +01F0 +01E0 +01C0 +01C0 +01C0 +03C0 +03C0 +07F8 +1FFC +7C02 +E000 ENDCHAR -STARTCHAR 0x25D6 -ENCODING 9686 -SWIDTH 300 0 -DWIDTH 5 0 -BBX 4 9 1 1 +STARTCHAR char63702 +ENCODING 63702 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 7 13 1 0 BITMAP -30 +10 +38 +7C +E6 +C4 +CC +C8 +F8 70 -F0 -F0 -F0 -F0 -F0 70 30 -ENDCHAR -STARTCHAR 0x25D7 -ENCODING 9687 -SWIDTH 300 0 -DWIDTH 5 0 -BBX 4 9 1 1 -BITMAP -C0 -E0 -F0 -F0 -F0 -F0 -F0 -E0 -C0 -ENDCHAR -STARTCHAR 0x25D8 -ENCODING 9688 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 9 1 1 -BITMAP -FF80 -FF80 -E380 -C180 -C180 -C180 -E380 -FF80 -FF80 +18 +08 ENDCHAR -STARTCHAR 0x25D9 -ENCODING 9689 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 9 1 1 +STARTCHAR char63703 +ENCODING 63703 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 12 13 1 0 BITMAP -FF80 -E380 -DD80 -BE80 -BE80 -BE80 -DD80 -E380 -FF80 +39E0 +70F0 +60F0 +E0F0 +F0E0 +7FC0 +3F80 +3E00 +1E00 +0F00 +0700 +0380 +01C0 ENDCHAR -STARTCHAR 0x25DA -ENCODING 9690 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 5 1 0 +STARTCHAR char63704 +ENCODING 63704 +SWIDTH 840 0 +DWIDTH 14 0 +BBX 13 12 1 0 BITMAP -FF80 -E380 -DD80 -BE80 -BE80 +3FF8 +7FF8 +1FF8 +0CF0 +0CF0 +08E0 +08E0 +10C0 +10C0 +2080 +4000 +8000 ENDCHAR -STARTCHAR 0x25DB -ENCODING 9691 +STARTCHAR char63705 +ENCODING 63705 SWIDTH 600 0 DWIDTH 10 0 -BBX 9 5 1 0 +BBX 9 12 1 0 BITMAP -BE80 -BE80 -DD80 -E380 +0600 +0700 +0F80 +1F00 +1C00 +3C00 +3800 +7800 +7E00 +FF00 FF80 +0180 ENDCHAR -STARTCHAR 0x25DC -ENCODING 9692 -SWIDTH 300 0 -DWIDTH 5 0 -BBX 5 5 0 0 +STARTCHAR char63706 +ENCODING 63706 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 10 13 1 0 BITMAP -38 -40 -80 -80 -80 +0600 +0F00 +3F80 +FFC0 +F3C0 +F3C0 +F380 +7380 +7300 +7A00 +3800 +1C00 +0C00 ENDCHAR -STARTCHAR 0x25DD -ENCODING 9693 -SWIDTH 360 0 -DWIDTH 6 0 -BBX 5 5 0 0 +STARTCHAR char63707 +ENCODING 63707 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 12 14 1 -1 BITMAP -E0 -10 -08 -08 -08 +0600 +1F00 +3F80 +7F80 +F800 +FFC0 +7FC0 +3E00 +3E00 +1F00 +0F80 +07C0 +03F0 +01F0 ENDCHAR -STARTCHAR 0x25DE -ENCODING 9694 -SWIDTH 360 0 -DWIDTH 6 0 -BBX 5 5 0 0 +STARTCHAR char63708 +ENCODING 63708 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 15 13 1 0 BITMAP -08 -08 -08 -10 -E0 +F01C +FFFE +1FFE +0F8C +0F8C +1FC8 +7C00 +7C00 +3C00 +1E00 +0E00 +0300 +00C0 ENDCHAR -STARTCHAR 0x25DF -ENCODING 9695 -SWIDTH 300 0 -DWIDTH 5 0 -BBX 5 5 0 0 +STARTCHAR char63709 +ENCODING 63709 +SWIDTH 840 0 +DWIDTH 14 0 +BBX 13 14 1 -1 BITMAP -80 -80 -80 -40 -38 +E000 +7FF8 +1FF8 +00F8 +00F0 +00F0 +01F8 +03E0 +03C0 +03C0 +03E0 +01E0 +00F0 +0038 ENDCHAR -STARTCHAR 0x25E0 -ENCODING 9696 +STARTCHAR char63710 +ENCODING 63710 SWIDTH 600 0 DWIDTH 10 0 -BBX 9 5 1 -1 +BBX 9 12 1 0 BITMAP -3E00 -4100 -8080 -8080 -8080 +1800 +3800 +3F00 +7F80 +4380 +8380 +0380 +0780 +0F00 +1E00 +3C00 +F000 ENDCHAR -STARTCHAR 0x25E1 -ENCODING 9697 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 5 1 0 +STARTCHAR char63711 +ENCODING 63711 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 6 12 1 0 BITMAP -8080 -8080 -8080 -4100 -3E00 +18 +3C +7C +F8 +F8 +3C +3C +1C +1C +1C +18 +10 ENDCHAR -STARTCHAR 0x25E2 -ENCODING 9698 +STARTCHAR char63712 +ENCODING 63712 SWIDTH 600 0 DWIDTH 10 0 -BBX 9 9 1 1 +BBX 9 13 1 0 BITMAP 0080 -0180 -0380 -0780 0F80 -1F80 -3F80 -7F80 -FF80 -ENDCHAR -STARTCHAR 0x25E3 -ENCODING 9699 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 9 1 1 -BITMAP -8000 -C000 -E000 -F000 +1F00 +3E00 +7C00 F800 -FC00 -FE00 -FF00 -FF80 -ENDCHAR -STARTCHAR 0x25E4 -ENCODING 9700 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 9 1 1 -BITMAP -FF80 -FF00 -FE00 -FC00 F800 -F000 +3800 +3800 +3800 +3800 +7000 E000 -C000 -8000 ENDCHAR -STARTCHAR 0x25E5 -ENCODING 9701 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 9 1 1 +STARTCHAR char63713 +ENCODING 63713 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 12 12 1 1 BITMAP -FF80 -7F80 -3F80 -1F80 -0F80 +FFF0 +3FF0 +0FC0 +07C0 +03F0 +07E0 0780 -0380 -0180 -0080 +0F00 +1E00 +1800 +3000 +4000 ENDCHAR -STARTCHAR 0x25E6 -ENCODING 9702 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 7 1 2 +STARTCHAR char63714 +ENCODING 63714 +SWIDTH 840 0 +DWIDTH 14 0 +BBX 13 12 1 0 BITMAP -38 -44 -82 -82 -82 -44 -38 +1FE0 +1F80 +0F00 +0F00 +0E00 +0E00 +0E00 +1E00 +1F00 +3FC0 +7FF0 +E038 ENDCHAR -STARTCHAR 0x25E7 -ENCODING 9703 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 9 1 1 +STARTCHAR char63715 +ENCODING 63715 +SWIDTH 840 0 +DWIDTH 14 0 +BBX 13 13 1 0 BITMAP -FF80 -F080 -F080 -F080 -F080 -F080 -F080 -F080 -FF80 +0038 +0070 +00F0 +00F0 +00F0 +21F0 +61F0 +63F0 +7FF0 +FE00 +F800 +E000 +C000 ENDCHAR -STARTCHAR 0x25E8 -ENCODING 9704 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 9 1 1 +STARTCHAR char63716 +ENCODING 63716 +SWIDTH 900 0 +DWIDTH 15 0 +BBX 14 14 1 -1 BITMAP -FF80 -8780 -8780 -8780 -8780 -8780 -8780 -8780 -FF80 +0EFC +3C7C +FC78 +DC70 +1CE0 +1F80 +3F00 +3E00 +3E00 +1E00 +1F00 +0F80 +07C0 +01E0 ENDCHAR -STARTCHAR 0x25E9 -ENCODING 9705 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 9 1 1 +STARTCHAR char63717 +ENCODING 63717 +SWIDTH 840 0 +DWIDTH 14 0 +BBX 13 12 1 0 BITMAP -FF80 -FF80 -FE80 -FC80 -F880 -F080 -E080 -C080 -FF80 +0080 +0180 +03C0 +0380 +0620 +0C70 +1FF8 +1FE0 +3F00 +7800 +E000 +8000 ENDCHAR -STARTCHAR 0x25EA -ENCODING 9706 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 9 1 1 +STARTCHAR char63718 +ENCODING 63718 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 15 13 1 -1 BITMAP -FF80 -8180 -8380 -8780 -8F80 -9F80 -BF80 -FF80 -FF80 +0006 +000C +001C +0038 +2038 +6078 +7078 +7FF8 +7FF8 +7FFC +703C +E00E +C000 ENDCHAR -STARTCHAR 0x25EB -ENCODING 9707 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 9 1 1 +STARTCHAR char63719 +ENCODING 63719 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 12 13 1 0 BITMAP -FF80 -8880 -8880 -8880 -8880 -8880 -8880 -8880 -FF80 +7FF0 +FFE0 +FC00 +E000 +E000 +6000 +6000 +6000 +3000 +3000 +1000 +1800 +0800 ENDCHAR -STARTCHAR 0x25EC -ENCODING 9708 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 10 1 1 +STARTCHAR char63720 +ENCODING 63720 +SWIDTH 840 0 +DWIDTH 14 0 +BBX 13 15 1 -1 BITMAP -0800 -0800 -1400 -1400 -2200 -2A00 -5D00 -4900 -8080 -FF80 +1FF8 +3FF0 +7FF0 +79F0 +F1E0 +F1E0 +F1E0 +79C0 +3FC0 +1FC0 +0FC0 +03C0 +01E0 +0070 +0030 ENDCHAR -STARTCHAR 0x25ED -ENCODING 9709 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 10 1 1 +STARTCHAR char63721 +ENCODING 63721 +SWIDTH 300 0 +DWIDTH 5 0 +BBX 4 8 1 5 BITMAP -0800 -0800 -1C00 -1C00 -3A00 -3A00 -7900 -7900 -F880 -FF80 +E0 +70 +70 +70 +E0 +C0 +C0 +60 ENDCHAR -STARTCHAR 0x25EE -ENCODING 9710 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 10 1 1 +STARTCHAR char63728 +ENCODING 63728 +SWIDTH 840 0 +DWIDTH 14 0 +BBX 13 4 1 4 BITMAP -0800 -0800 -1C00 -1C00 -2E00 -2E00 -4F00 -4F00 -8F80 -FF80 +3FE0 +FFF8 +FFF8 +3FE0 ENDCHAR -STARTCHAR 0x25EF -ENCODING 9711 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 10 10 1 0 +STARTCHAR char63729 +ENCODING 63729 +SWIDTH 900 0 +DWIDTH 15 0 +BBX 14 13 1 0 BITMAP -1E00 -6180 -4080 -8040 -8040 -8040 -8040 -4080 -6180 +00FC +0FF0 +1FC0 1E00 +3800 +3000 +3000 +6000 +6000 +4000 +C000 +8000 +8000 ENDCHAR -STARTCHAR 0x25A1 -ENCODING 9712 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 9 1 1 +STARTCHAR char63730 +ENCODING 63730 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 12 1 0 BITMAP -FF80 -8880 -8880 -8880 -F880 -8080 -8080 -8080 -FF80 +18 +30 +60 +E0 +C0 +C0 +C0 +40 +60 +20 +30 +18 ENDCHAR -STARTCHAR 0x25A1 -ENCODING 9713 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 9 1 1 +STARTCHAR char63731 +ENCODING 63731 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 10 12 1 0 BITMAP -FF80 -8080 -8080 -8080 -F880 -8880 -8880 -8880 -FF80 +3800 +7000 +F000 +F180 +FE00 +FC00 +F800 +7800 +3800 +1C00 +0700 +01C0 ENDCHAR -STARTCHAR 0x25A1 -ENCODING 9714 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 9 1 1 +STARTCHAR char63732 +ENCODING 63732 +SWIDTH 900 0 +DWIDTH 15 0 +BBX 14 13 1 0 BITMAP -FF80 -8080 -8080 -8080 -8F80 -8880 -8880 -8880 -FF80 +20FC +17F0 +1FC0 +0F80 +0F00 +0700 +0780 +0380 +83C0 +E1E0 +7FF0 +7FF8 +3FFC ENDCHAR -STARTCHAR 0x25A1 -ENCODING 9715 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 9 1 1 +STARTCHAR char63733 +ENCODING 63733 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 7 14 1 -1 BITMAP -FF80 -8880 -8880 -8880 -8F80 -8080 -8080 -8080 -FF80 +7C +F0 +E0 +E0 +E0 +7E +78 +7E +38 +30 +30 +10 +18 +08 ENDCHAR -STARTCHAR 0x25CB -ENCODING 9716 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 9 1 1 +STARTCHAR char63734 +ENCODING 63734 +SWIDTH 900 0 +DWIDTH 15 0 +BBX 14 12 1 0 BITMAP -3E00 -4900 -8880 -8880 -F880 -8080 -8080 -4100 -3E00 +C000 +6000 +781C +7FFC +3FFC +3FF8 +3838 +3030 +3010 +2010 +2010 +0010 ENDCHAR -STARTCHAR 0x25CB -ENCODING 9717 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 9 1 1 +STARTCHAR char63735 +ENCODING 63735 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 10 12 1 0 BITMAP -3E00 -4100 -8080 -8080 -F880 -8880 -8880 -4900 -3E00 +00C0 +3180 +7F80 +FF00 +1F00 +1F00 +3700 +0300 +0300 +0180 +0080 +0040 ENDCHAR -STARTCHAR 0x25CB -ENCODING 9718 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 9 1 1 +STARTCHAR char63736 +ENCODING 63736 +SWIDTH 900 0 +DWIDTH 15 0 +BBX 14 13 1 0 BITMAP -3E00 -4100 -8080 -8080 -8F80 -8880 -8880 -4900 -3E00 +C00C +6FD8 +37B0 +37B0 +1FE0 +1FE0 +1FE0 +1FE0 +1FE0 +3FF0 +3FF0 +6798 +CFCC ENDCHAR -STARTCHAR 0x25CB -ENCODING 9719 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 9 1 1 +STARTCHAR char63737 +ENCODING 63737 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 10 13 1 -1 BITMAP -3E00 -4900 -8880 -8880 -8F80 -8080 -8080 -4100 -3E00 +0C00 +1E00 +7F80 +FFC0 +0C00 +0C00 +0C00 +0C00 +0C00 +1E00 +1E00 +1E00 +3300 ENDCHAR -STARTCHAR 0xFB00 +STARTCHAR C011 ENCODING 64256 SWIDTH 540 0 DWIDTH 9 0 @@ -59675,7 +128419,7 @@ 2400 7E00 ENDCHAR -STARTCHAR 0xFB01 +STARTCHAR C012 ENCODING 64257 SWIDTH 480 0 DWIDTH 8 0 @@ -59694,7 +128438,7 @@ 24 7E ENDCHAR -STARTCHAR 0xFB02 +STARTCHAR C013 ENCODING 64258 SWIDTH 420 0 DWIDTH 7 0 @@ -59713,7 +128457,7 @@ 24 7E ENDCHAR -STARTCHAR 0xFB03 +STARTCHAR C014 ENCODING 64259 SWIDTH 780 0 DWIDTH 13 0 @@ -59732,7 +128476,7 @@ 2220 7770 ENDCHAR -STARTCHAR 0xFB04 +STARTCHAR C015 ENCODING 64260 SWIDTH 720 0 DWIDTH 12 0 @@ -59751,7 +128495,7 @@ 2220 7770 ENDCHAR -STARTCHAR 0xFB05 +STARTCHAR C102 ENCODING 64261 SWIDTH 540 0 DWIDTH 9 0 @@ -59770,7 +128514,7 @@ 49 E6 ENDCHAR -STARTCHAR 0xFB06 +STARTCHAR LATIN SMALL LIGATURE ST ENCODING 64262 SWIDTH 780 0 DWIDTH 13 0 @@ -59789,7 +128533,7 @@ 8890 F060 ENDCHAR -STARTCHAR 0xFB13 +STARTCHAR ARMENIAN LIGATURE MEN NOW ENCODING 64275 SWIDTH 900 0 DWIDTH 15 0 @@ -59807,7 +128551,7 @@ 4C98 346C ENDCHAR -STARTCHAR 0xFB14 +STARTCHAR ARMENIAN LIGATURE MEN ECH ENCODING 64276 SWIDTH 900 0 DWIDTH 15 0 @@ -59825,7 +128569,7 @@ 4C98 366C ENDCHAR -STARTCHAR 0xFB15 +STARTCHAR ARMENIAN LIGATURE MEN INI ENCODING 64277 SWIDTH 900 0 DWIDTH 15 0 @@ -59846,7 +128590,7 @@ 0080 01C0 ENDCHAR -STARTCHAR 0xFB16 +STARTCHAR ARMENIAN LIGATURE VEW NOW ENCODING 64278 SWIDTH 900 0 DWIDTH 15 0 @@ -59867,7 +128611,7 @@ 0400 0600 ENDCHAR -STARTCHAR 0xFB17 +STARTCHAR ARMENIAN LIGATURE MEN XEH ENCODING 64279 SWIDTH 1080 0 DWIDTH 18 0 @@ -59888,6 +128632,21 @@ 008000 01C000 ENDCHAR +STARTCHAR 0x05F2 +ENCODING 64285 +SWIDTH 240 0 +DWIDTH 4 0 +BBX 3 8 1 1 +BITMAP +80 +E0 +20 +20 +40 +00 +40 +40 +ENDCHAR STARTCHAR 0xFB1E ENCODING 64286 SWIDTH 0 0 @@ -59897,21 +128656,19 @@ 84 78 ENDCHAR -STARTCHAR 0xFB1F +STARTCHAR 0x05F2 ENCODING 64287 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 8 9 1 0 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 7 7 1 2 BITMAP -44 +88 EE -33 -11 -11 -11 22 +22 +44 00 -7F +7E ENDCHAR STARTCHAR 0xFB20 ENCODING 64288 @@ -59932,131 +128689,133 @@ ENDCHAR STARTCHAR 0xFB21 ENCODING 64289 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 11 9 1 0 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 12 9 1 0 BITMAP -8020 -8020 +8040 +8070 6020 3820 -4E40 +4640 4180 -4040 -4020 -E020 +4060 +2010 +E010 ENDCHAR STARTCHAR 0xFB22 ENCODING 64290 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 10 9 1 0 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 12 9 1 0 BITMAP -4000 -FFC0 -0100 -0100 -0100 -0100 -0100 -0100 -0100 +8000 +FFF0 +0020 +0020 +0020 +0020 +0020 +0020 +0020 ENDCHAR -STARTCHAR 0xFB23 +STARTCHAR 0x05D4 ENCODING 64291 SWIDTH 720 0 DWIDTH 12 0 BBX 11 9 1 0 BITMAP -4000 -FFC0 -0060 -0020 -4020 -4020 -4020 -4020 -4020 +8000 +FFE0 +0040 +8040 +8040 +8040 +8040 +8040 +8040 ENDCHAR -STARTCHAR 0xFB24 +STARTCHAR 0x05DB ENCODING 64292 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 9 1 0 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 10 9 1 0 BITMAP -4000 -FF00 -0180 -0080 -0080 -0080 -0080 -0180 -FF00 +8000 +FF80 +0040 +0040 +0040 +0040 +0040 +0040 +FF80 ENDCHAR -STARTCHAR 0xFB25 +STARTCHAR 0x05DC ENCODING 64293 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 11 1 0 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 11 13 0 0 BITMAP -8000 8000 -8000 -FF00 -0180 -0080 -0080 +C000 +4000 +4000 +4000 +7FE0 +0020 +0020 +0020 +0020 +0040 0080 -0100 -0200 -0C00 +0300 ENDCHAR -STARTCHAR 0xFB26 +STARTCHAR 0x05DD ENCODING 64294 -SWIDTH 780 0 -DWIDTH 13 0 -BBX 12 9 1 0 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 10 9 1 0 BITMAP -4000 -FFE0 -4030 -4010 -4010 -4010 -4010 -4030 -7FE0 +8000 +FF80 +4040 +8040 +8040 +8040 +8040 +8040 +FFC0 ENDCHAR -STARTCHAR 0xFB27 +STARTCHAR 0x05D3 ENCODING 64295 SWIDTH 660 0 DWIDTH 11 0 BBX 10 9 1 0 BITMAP -4000 -FF80 -00C0 +8000 +FFC0 0040 0040 0040 0040 0040 0040 +0040 ENDCHAR -STARTCHAR 0xFB28 +STARTCHAR 0x05D4 ENCODING 64296 SWIDTH 720 0 DWIDTH 12 0 BBX 11 9 1 0 BITMAP 4000 -FFC0 -2060 -2020 -2020 -2020 +7FE0 2020 +4020 +4020 +4020 +4020 2020 E020 ENDCHAR @@ -60073,585 +128832,582 @@ 0800 FF80 ENDCHAR -STARTCHAR 0xFB2A +STARTCHAR 0x05E9 ENCODING 64298 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 8 13 1 0 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 10 12 1 0 BITMAP -01 -01 -00 -00 -89 -8B -89 -49 -49 -51 -62 -24 -38 +0080 +0080 +0000 +9100 +DDC0 +4880 +8880 +9100 +9100 +A200 +A400 +F800 ENDCHAR -STARTCHAR 0xFB2B +STARTCHAR 0x05E9 ENCODING 64299 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 8 13 1 0 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 10 12 1 0 BITMAP -80 -80 -00 -00 -89 -8B -89 -49 -49 -51 -62 -24 -38 +4000 +4000 +0000 +9100 +DDC0 +4880 +8880 +9100 +9100 +A200 +A400 +F800 ENDCHAR -STARTCHAR 0xFB2C +STARTCHAR 0x05E9 ENCODING 64300 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 8 13 1 0 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 10 12 1 0 BITMAP -01 -01 -00 -00 -91 -93 -91 -55 -55 -61 -62 -24 -38 +0080 +0080 +0000 +9100 +DDC0 +4880 +8880 +9500 +9500 +A200 +A400 +F800 ENDCHAR -STARTCHAR 0xFB2D +STARTCHAR 0x05E9 ENCODING 64301 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 8 12 1 0 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 10 12 1 0 BITMAP -80 -00 -00 -91 -93 -91 -55 -55 -61 -62 -24 -38 +4000 +4000 +0000 +9100 +DDC0 +4880 +8880 +9500 +9500 +A200 +A400 +F800 ENDCHAR -STARTCHAR 0xFB2E +STARTCHAR 0x05D0 ENCODING 64302 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 8 12 1 -3 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 7 11 1 -2 BITMAP -81 -81 -61 -39 -4A -44 +84 +84 +46 +28 +50 +88 +84 42 -41 -E1 -00 +C2 00 -3E +7C ENDCHAR -STARTCHAR 0xFB2F +STARTCHAR 0x05D0 ENCODING 64303 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 8 14 1 -5 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 7 13 1 -4 BITMAP -81 -81 -61 -39 -4A -44 +84 +84 +46 +28 +50 +88 +84 42 -41 -E1 -00 +C2 00 -3E -08 -08 +7C +10 +10 ENDCHAR -STARTCHAR 0xFB30 +STARTCHAR 0x05D0 ENCODING 64304 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 8 9 1 0 -BITMAP -81 -81 -61 -39 -4A -44 -42 -49 -E9 -ENDCHAR -STARTCHAR 0xFB31 -ENCODING 64305 SWIDTH 480 0 DWIDTH 8 0 BBX 7 9 1 0 BITMAP +84 +84 +46 +28 +50 +88 +84 +52 +D2 +ENDCHAR +STARTCHAR 0x05D3 +ENCODING 64305 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 8 9 1 0 +BITMAP 80 -F8 -04 -04 -24 -24 -04 -04 FE +02 +02 +22 +22 +02 +02 +FF ENDCHAR -STARTCHAR 0xFB32 +STARTCHAR 0x05D2 ENCODING 64306 SWIDTH 360 0 DWIDTH 6 0 BBX 5 9 1 0 BITMAP -40 +80 F0 10 -50 -50 -18 +10 +90 +90 +10 28 -48 -88 +C8 ENDCHAR -STARTCHAR 0xFB33 +STARTCHAR 0x05D3 ENCODING 64307 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 9 1 0 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 8 9 1 0 BITMAP -40 -FE -08 -08 -48 -48 -08 -08 -08 +80 +FF +02 +02 +22 +22 +02 +02 +02 ENDCHAR -STARTCHAR 0xFB34 +STARTCHAR 0x05D4 ENCODING 64308 SWIDTH 540 0 DWIDTH 9 0 BBX 8 9 1 0 BITMAP -40 -FE -03 -01 -49 -49 -41 -41 -41 +80 +FF +02 +82 +92 +92 +82 +82 +82 ENDCHAR -STARTCHAR 0xFB35 +STARTCHAR 0x05D5 ENCODING 64309 -SWIDTH 240 0 -DWIDTH 4 0 -BBX 3 9 1 0 +SWIDTH 300 0 +DWIDTH 5 0 +BBX 4 9 1 0 BITMAP -40 -E0 -20 -20 -A0 -A0 -20 -20 -20 +80 +F0 +10 +10 +90 +90 +10 +10 +10 ENDCHAR -STARTCHAR 0xFB36 +STARTCHAR 0x05D5 ENCODING 64310 -SWIDTH 300 0 -DWIDTH 5 0 -BBX 5 10 1 0 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 9 1 0 BITMAP -40 -60 -30 -28 -A0 -A0 -20 -30 +80 +F8 +10 10 +90 +90 +10 +10 10 ENDCHAR -STARTCHAR 0xFB38 +STARTCHAR 0x05D8 ENCODING 64312 SWIDTH 600 0 DWIDTH 10 0 -BBX 9 9 1 0 +BBX 8 9 2 0 BITMAP -0700 -C980 -4080 -4880 -4880 -2080 -2100 -3600 -1C00 +8E +D1 +41 +81 +91 +91 +82 +84 +F8 ENDCHAR -STARTCHAR 0xFB39 +STARTCHAR 0x05F2 ENCODING 64313 -SWIDTH 300 0 -DWIDTH 5 0 -BBX 4 7 1 2 +SWIDTH 240 0 +DWIDTH 4 0 +BBX 3 6 1 3 BITMAP -40 +80 E0 -30 -90 -90 -10 20 +20 +C0 +80 ENDCHAR -STARTCHAR 0xFB3A +STARTCHAR 0x05DA ENCODING 64314 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 13 1 -4 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 8 13 1 -4 BITMAP -40 -FE -04 -04 -24 -24 -04 -04 -04 -04 -04 -04 -04 +80 +FF +02 +02 +22 +22 +02 +02 +02 +02 +02 +02 +02 ENDCHAR -STARTCHAR 0xFB3B +STARTCHAR 0x05DB ENCODING 64315 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 6 9 1 0 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 7 9 1 0 BITMAP 80 -F8 -0C -04 -24 -24 -04 -0C -F8 +FC +02 +02 +22 +22 +02 +02 +FC ENDCHAR -STARTCHAR 0xFB3C +STARTCHAR 0x05DC ENCODING 64316 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 6 11 1 0 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 8 13 0 0 BITMAP 80 -80 -80 -F8 -0C +C0 +40 +40 +40 +7F +01 +01 +11 +11 +02 04 -24 -24 -08 -10 -60 +18 ENDCHAR -STARTCHAR 0xFB3E +STARTCHAR 0x05DE ENCODING 64318 SWIDTH 540 0 DWIDTH 9 0 -BBX 8 9 1 0 +BBX 7 9 2 0 BITMAP -4E -D3 -71 -21 -49 -49 -41 -43 -1E +98 +E4 +42 +82 +92 +92 +82 +84 +B8 ENDCHAR -STARTCHAR 0xFB40 +STARTCHAR 0x05D2 ENCODING 64320 SWIDTH 300 0 DWIDTH 5 0 BBX 4 9 1 0 BITMAP -40 -60 -30 +80 +F0 10 +10 90 90 10 -30 -E0 +10 +F0 ENDCHAR -STARTCHAR 0xFB41 +STARTCHAR 0x05E1 ENCODING 64321 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 8 9 1 0 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 7 9 1 0 BITMAP 80 -FF -81 -81 -49 -49 +FC 42 -64 +82 +92 +92 +82 +44 38 ENDCHAR -STARTCHAR 0xFB43 +STARTCHAR 0x05DA ENCODING 64323 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 12 1 -3 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 8 13 1 -4 BITMAP -70 -CC -84 -92 -92 -C2 +80 +FF 42 +82 +92 +D2 02 02 02 02 02 +02 +02 ENDCHAR -STARTCHAR 0xFB44 +STARTCHAR 0x05DB ENCODING 64324 SWIDTH 480 0 DWIDTH 8 0 BBX 7 9 1 0 BITMAP -30 -6C -44 -52 -52 +80 +FC +42 +82 +92 +D2 02 02 -06 FC ENDCHAR -STARTCHAR 0xFB46 +STARTCHAR 0x05E6 ENCODING 64326 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 7 9 1 0 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 8 9 1 0 BITMAP -44 -C2 -22 -14 -48 -44 -04 -04 +84 +E7 +42 +24 +A8 +90 +10 +08 FC ENDCHAR -STARTCHAR 0xFB47 +STARTCHAR 0x05DB ENCODING 64327 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 8 12 1 -3 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 7 13 1 -4 BITMAP -40 -FE -03 -01 -51 -52 -42 -44 -58 -40 -40 -40 +80 +FC +02 +82 +92 +92 +82 +82 +BC +80 +80 +80 +80 ENDCHAR -STARTCHAR 0xFB48 +STARTCHAR 0x05D3 ENCODING 64328 SWIDTH 480 0 DWIDTH 8 0 BBX 7 9 1 0 BITMAP -40 -FC -06 +80 +FE 02 +02 22 22 02 02 02 ENDCHAR -STARTCHAR 0xFB49 +STARTCHAR 0x05E9 ENCODING 64329 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 8 9 1 0 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 10 9 1 0 BITMAP -91 -93 -91 -55 -55 -51 -62 -24 -38 +9100 +DDC0 +4880 +8880 +9500 +9500 +A200 +A400 +F800 ENDCHAR -STARTCHAR 0xFB4A +STARTCHAR 0x05D4 ENCODING 64330 SWIDTH 540 0 DWIDTH 9 0 BBX 8 9 1 0 BITMAP 40 -FE -23 -21 -29 -29 +7F 21 +41 +49 +49 +41 21 E1 ENDCHAR -STARTCHAR 0xFB4B +STARTCHAR 0x05D5 ENCODING 64331 -SWIDTH 240 0 -DWIDTH 4 0 -BBX 3 12 1 0 +SWIDTH 300 0 +DWIDTH 5 0 +BBX 4 12 1 0 BITMAP -80 -80 -00 40 -E0 -20 -20 -20 -20 -20 -20 -20 +40 +00 +80 +F0 +10 +10 +10 +10 +10 +10 +10 ENDCHAR -STARTCHAR 0xFB4C +STARTCHAR 0x05D3 ENCODING 64332 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 11 1 0 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 8 11 1 0 BITMAP -78 +3C 00 80 -FC -04 -04 -04 -04 -04 -04 FE +02 +02 +02 +02 +02 +02 +FF ENDCHAR -STARTCHAR 0xFB4D +STARTCHAR 0x05DB ENCODING 64333 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 6 11 1 0 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 7 11 1 0 BITMAP -78 +3C 00 80 -F8 -0C -04 -04 -04 -04 -0C -F8 +FC +02 +02 +02 +02 +02 +02 +FC ENDCHAR -STARTCHAR 0xFB4E +STARTCHAR 0x05DB ENCODING 64334 SWIDTH 480 0 DWIDTH 8 0 BBX 7 11 1 0 BITMAP -78 +3C 00 -30 -6C -44 +80 +FC 42 -62 +82 +82 +C2 02 02 -06 FC ENDCHAR -STARTCHAR 0xFB4F +STARTCHAR 0x05D0 ENCODING 64335 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 12 0 0 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 8 12 0 0 BITMAP -4000 -C000 -4000 -4080 -4080 -3080 -1C80 -2500 -2200 -2100 -2080 -7080 +80 +C0 +40 +42 +42 +23 +14 +28 +44 +42 +21 +61 ENDCHAR STARTCHAR 0xFB50 ENCODING 64336 SWIDTH 300 0 DWIDTH 5 0 -BBX 5 16 0 0 +BBX 5 15 0 0 BITMAP 10 28 @@ -60659,7 +129415,6 @@ 80 00 20 -20 30 20 20 @@ -60672,9 +129427,9 @@ ENDCHAR STARTCHAR 0xFB51 ENCODING 64337 -SWIDTH 360 0 -DWIDTH 6 0 -BBX 6 17 0 -1 +SWIDTH 300 0 +DWIDTH 5 0 +BBX 5 15 0 0 BITMAP 10 28 @@ -60682,7 +129437,6 @@ 80 00 20 -20 30 20 20 @@ -60691,256 +129445,261 @@ 20 20 20 -20 -1C +18 ENDCHAR -STARTCHAR 0xFB52 +STARTCHAR 0048 ENCODING 64338 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 12 10 0 -5 +SWIDTH 840 0 +DWIDTH 14 0 +BBX 13 12 1 -7 BITMAP -0020 -8010 -8010 -8010 -4060 -3F80 +0008 +4008 +8008 +8008 +C030 +7FC0 0000 -0600 +0200 +0200 0000 -0600 +0200 +0200 ENDCHAR -STARTCHAR 0xFB53 +STARTCHAR 0047 ENCODING 64339 -SWIDTH 900 0 -DWIDTH 15 0 -BBX 14 10 1 -5 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 15 11 1 -7 BITMAP -0020 -8020 +4000 8010 8010 -4070 -3F8C +C06E +7F80 0000 -0600 +0400 +0400 0000 -0600 +0400 +0400 ENDCHAR -STARTCHAR 0xFB54 +STARTCHAR 0049 ENCODING 64340 SWIDTH 360 0 DWIDTH 6 0 -BBX 5 10 0 -5 +BBX 5 11 0 -6 BITMAP 10 08 08 08 -08 F0 00 -30 +40 +40 00 -30 +40 +40 ENDCHAR -STARTCHAR 0xFB55 +STARTCHAR 004A ENCODING 64341 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 7 10 0 -5 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 6 10 0 -6 BITMAP -20 -20 10 10 10 -EE +EC 00 -30 +10 +10 00 -30 +10 +10 ENDCHAR -STARTCHAR 0xFB56 +STARTCHAR 004C ENCODING 64342 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 12 10 0 -5 +SWIDTH 840 0 +DWIDTH 14 0 +BBX 13 11 1 -6 BITMAP -0020 -8010 -8010 -8010 -4060 -3F80 -0000 -0D80 +0008 +4008 +8008 +8008 +C030 +7FC0 0000 -0300 +0A00 +0A00 +0400 +0400 ENDCHAR -STARTCHAR 0xFB57 +STARTCHAR 004B ENCODING 64343 SWIDTH 900 0 DWIDTH 15 0 -BBX 14 10 1 -5 +BBX 15 10 1 -6 BITMAP -0020 -8020 +4000 8010 8010 -4070 -3F8C -0000 -0D80 +C06E +7F80 0000 -0300 +0A00 +0A00 +0400 +0400 ENDCHAR -STARTCHAR 0xFB58 +STARTCHAR 0049 ENCODING 64344 SWIDTH 360 0 DWIDTH 6 0 -BBX 6 10 0 -5 +BBX 5 10 0 -5 BITMAP 10 08 08 08 -08 F0 -00 -6C 00 -18 +50 +50 +20 +20 ENDCHAR -STARTCHAR 0xFB59 +STARTCHAR 004A ENCODING 64345 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 7 10 0 -5 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 6 9 0 -5 BITMAP -20 -20 10 10 10 -EE -00 -6C +EC 00 -18 +28 +28 +10 +10 ENDCHAR -STARTCHAR 0xFB5A +STARTCHAR 0048 ENCODING 64346 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 12 10 0 -5 +SWIDTH 840 0 +DWIDTH 14 0 +BBX 13 12 1 -7 BITMAP -0020 -8010 -8010 -8010 -4060 -3F80 +0008 +4008 +8008 +8008 +C030 +7FC0 0000 -0D80 +0500 +0500 0000 -0D80 +0500 +0500 ENDCHAR -STARTCHAR 0xFB5B +STARTCHAR 0047 ENCODING 64347 -SWIDTH 900 0 -DWIDTH 15 0 -BBX 14 10 1 -5 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 15 11 1 -7 BITMAP -0020 -8020 +4000 8010 8010 -4070 -3F8C +C06E +7F80 0000 -0D80 +0500 +0500 0000 -0D80 +0500 +0500 ENDCHAR -STARTCHAR 0xFB5C +STARTCHAR 0049 ENCODING 64348 SWIDTH 360 0 DWIDTH 6 0 -BBX 6 10 0 -5 +BBX 5 11 0 -6 BITMAP 10 08 08 08 -08 F0 00 -6C +50 +50 00 -6C +50 +50 ENDCHAR -STARTCHAR 0xFB5D +STARTCHAR 004A ENCODING 64349 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 7 10 0 -5 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 6 10 0 -6 BITMAP -20 -20 10 10 10 -EE +EC 00 -6C +28 +28 00 -6C +28 +28 ENDCHAR -STARTCHAR 0xFB5E +STARTCHAR 0050 ENCODING 64350 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 12 12 0 -1 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 13 11 0 -1 BITMAP -0400 -0400 -0000 -0400 -0400 +0200 +0200 0000 -0020 -8010 -8010 -8010 -4060 -3F80 +0200 +0200 +0008 +4008 +8008 +8008 +C030 +7FC0 ENDCHAR -STARTCHAR 0xFB5F +STARTCHAR 004F ENCODING 64351 SWIDTH 900 0 DWIDTH 15 0 -BBX 14 12 1 -1 +BBX 15 11 1 -1 BITMAP -0400 -0400 +0100 +0100 0000 -0400 -0400 +0100 +0100 0000 -0020 -8020 +4000 8010 8010 -4070 -3F8C +C06E +7F80 ENDCHAR -STARTCHAR 0xFB60 +STARTCHAR 004D ENCODING 64352 SWIDTH 360 0 DWIDTH 6 0 -BBX 5 13 0 -1 +BBX 5 11 0 0 BITMAP 20 20 @@ -60948,71 +129707,71 @@ 20 20 00 -00 10 08 08 08 -08 F0 ENDCHAR -STARTCHAR 0xFB61 +STARTCHAR 004E ENCODING 64353 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 7 13 0 -1 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 6 11 0 0 BITMAP -20 -20 +10 +10 00 -20 -20 +10 +10 00 00 -20 -20 10 10 10 -FE +EC ENDCHAR -STARTCHAR 0xFB62 +STARTCHAR 0050 ENCODING 64354 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 12 9 0 -1 +SWIDTH 840 0 +DWIDTH 14 0 +BBX 13 11 1 -1 BITMAP -0A00 -0A00 +0500 +0500 0000 -0A20 -8A10 -8010 -8010 -4060 -3F80 +0500 +0500 +0008 +4008 +8008 +8008 +C030 +7FC0 ENDCHAR -STARTCHAR 0xFB63 +STARTCHAR 004F ENCODING 64355 SWIDTH 900 0 DWIDTH 15 0 -BBX 14 9 1 -1 +BBX 15 11 1 -1 BITMAP -0A00 -0A00 +0500 +0500 0000 -0A20 -8A20 +0500 +0500 +0000 +4000 8010 8010 -4070 -3F8C +C06E +7F80 ENDCHAR -STARTCHAR 0xFB64 +STARTCHAR 004D ENCODING 64356 SWIDTH 360 0 DWIDTH 6 0 -BBX 5 13 0 -1 +BBX 5 11 0 0 BITMAP 28 28 @@ -61020,606 +129779,592 @@ 28 28 00 -00 10 08 08 08 -08 F0 ENDCHAR -STARTCHAR 0xFB65 +STARTCHAR 004E ENCODING 64357 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 7 13 0 -1 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 6 11 0 0 BITMAP -50 -50 +28 +28 00 -50 -50 +28 +28 00 00 -20 -20 10 10 10 -EE +EC ENDCHAR -STARTCHAR 0xFB66 +STARTCHAR 0050 ENCODING 64358 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 12 11 0 -1 +SWIDTH 840 0 +DWIDTH 14 0 +BBX 13 9 1 -1 BITMAP -0800 -0800 -0E00 -0E00 -0000 -0020 -8010 -8010 -8010 -4060 -3F80 +0400 +0400 +0700 +0708 +4008 +8008 +8008 +C030 +7FC0 ENDCHAR -STARTCHAR 0xFB67 +STARTCHAR 004F ENCODING 64359 SWIDTH 900 0 DWIDTH 15 0 -BBX 14 11 1 -1 +BBX 15 9 1 -1 BITMAP -0800 -0800 -0E00 -0E00 -0000 -0020 -8020 +0400 +0400 +0700 +0700 +4000 8010 8010 -4070 -3F8C +C06E +7F80 ENDCHAR -STARTCHAR 0xFB68 +STARTCHAR 004D ENCODING 64360 SWIDTH 360 0 DWIDTH 6 0 -BBX 5 11 0 -1 +BBX 5 11 0 0 BITMAP 20 20 38 38 00 +00 10 08 08 08 -08 F0 ENDCHAR -STARTCHAR 0xFB69 +STARTCHAR 004E ENCODING 64361 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 7 11 0 -1 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 6 11 0 0 BITMAP -40 -40 -70 -70 -00 20 20 +38 +38 +00 +00 +00 10 10 10 -FE +EC ENDCHAR -STARTCHAR 0xFB6A +STARTCHAR 00CF ENCODING 64362 -SWIDTH 780 0 -DWIDTH 13 0 -BBX 13 14 0 -1 +SWIDTH 900 0 +DWIDTH 15 0 +BBX 14 14 1 0 BITMAP -0020 -0020 -0000 -0050 -0050 +0010 +0010 +0028 +0028 0000 0000 -0030 -0058 -8048 -8058 -8028 -4008 -3FF0 +0018 +002C +0024 +802C +8014 +8004 +4038 +3FC0 ENDCHAR -STARTCHAR 0xFB6B +STARTCHAR 00CF ENCODING 64363 SWIDTH 960 0 DWIDTH 16 0 -BBX 15 14 1 -1 +BBX 16 14 1 -1 BITMAP -0020 -0020 -0000 -0050 -0050 +0010 +0010 +0028 +0028 0000 0000 -0030 -0058 -8048 -8058 -8028 -4008 -3FFE +0018 +002C +0024 +802C +8014 +8004 +403B +3FC0 ENDCHAR -STARTCHAR 0xFB6C +STARTCHAR 00CC ENCODING 64364 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 14 0 -1 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 13 0 0 BITMAP -08 -08 -00 -14 -14 +20 +20 +50 +50 00 00 -0C -16 -12 -16 -0A -02 -FC +30 +58 +48 +58 +28 +08 +F0 ENDCHAR -STARTCHAR 0xFB6D +STARTCHAR 00CC ENCODING 64365 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 9 14 0 -1 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 8 12 0 0 BITMAP -0800 -0800 -0000 -1400 -1400 -0000 -0000 -0C00 -1600 -1200 -1600 -0A00 -0200 -FF80 +10 +10 +28 +28 +00 +00 +18 +24 +24 +28 +10 +EF ENDCHAR -STARTCHAR 0xFB6E +STARTCHAR 00CF ENCODING 64366 -SWIDTH 780 0 -DWIDTH 13 0 -BBX 13 14 0 -1 +SWIDTH 900 0 +DWIDTH 15 0 +BBX 14 15 1 0 BITMAP -0050 -0050 +0028 +0028 0000 -0050 -0050 +0028 +0028 0000 0000 -0030 -0058 -8048 -8058 -8028 -4008 -3FF0 +0018 +002C +0024 +802C +8014 +8004 +4038 +3FC0 ENDCHAR -STARTCHAR 0xFB6F +STARTCHAR 00CF ENCODING 64367 SWIDTH 960 0 DWIDTH 16 0 -BBX 15 14 1 -1 +BBX 16 15 1 -1 BITMAP -0050 -0050 +0028 +0028 0000 -0050 -0050 +0028 +0028 0000 0000 -0030 -0058 -8048 -8058 -8028 -4008 -3FFE +0018 +002C +0024 +802C +8014 +8004 +403B +3FC0 ENDCHAR -STARTCHAR 0xFB70 +STARTCHAR 00CC ENCODING 64368 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 14 0 -1 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 14 0 0 BITMAP -14 -14 +50 +50 00 -14 -14 +50 +50 00 00 -0C -16 -12 -16 -0A -02 -FC +30 +58 +48 +58 +28 +08 +F0 ENDCHAR -STARTCHAR 0xFB71 +STARTCHAR 00CC ENCODING 64369 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 9 14 0 -1 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 8 14 0 0 BITMAP -1400 -1400 -0000 -1400 -1400 -0000 -0000 -0C00 -1600 -1200 -1600 -0A00 -0200 -FF80 +28 +28 +00 +00 +28 +28 +00 +00 +18 +24 +24 +28 +10 +EF ENDCHAR -STARTCHAR 0xFB72 +STARTCHAR 0057 ENCODING 64370 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 8 11 0 -6 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 10 11 1 -6 BITMAP -7E -B0 -40 -C0 -98 -80 -98 -80 -C0 -61 -3E +7000 +8F00 +3800 +4000 +4800 +8800 +8000 +8800 +4800 +60C0 +1F00 ENDCHAR -STARTCHAR 0xFB73 +STARTCHAR 0057 ENCODING 64371 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 10 10 1 -6 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 10 11 1 -6 BITMAP -7F00 -B200 +7000 +8F00 +3A00 4200 -C200 -99C0 +49C0 +8800 8000 -9800 -C000 -6100 -3E00 +8800 +4800 +60C0 +1F00 ENDCHAR -STARTCHAR 0xFB74 +STARTCHAR 0055 ENCODING 64372 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 10 10 0 -5 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 10 0 -5 BITMAP -1800 -2400 -4200 -0100 -0080 -FFC0 -0000 +3800 +4780 0C00 +1000 +E000 +0400 +0400 0000 -0C00 +0400 +0400 ENDCHAR -STARTCHAR 0xFB75 +STARTCHAR 0056 ENCODING 64373 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 11 10 0 -5 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 10 10 0 -5 BITMAP -1800 -2400 -4200 -0100 -0180 -FFE0 -0000 -0C00 +3800 +4780 +0D00 +1100 +E0C0 +0400 +0400 0000 -0C00 +0400 +0400 ENDCHAR -STARTCHAR 0xFB76 +STARTCHAR 0057 ENCODING 64374 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 8 11 0 -6 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 10 11 1 -6 BITMAP -7E -B0 -40 -C0 -80 -94 -94 -80 -C0 -61 -3E +7000 +8F00 +3800 +4000 +4000 +8A00 +8A00 +8000 +4000 +60C0 +1F00 ENDCHAR -STARTCHAR 0xFB77 +STARTCHAR 0057 ENCODING 64375 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 10 10 1 -6 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 10 11 1 -6 BITMAP -7F00 -B200 +7000 +8F00 +3A00 4200 -C200 -81C0 -9400 -9400 -C000 -6100 -3E00 +41C0 +8A00 +8A00 +8000 +4000 +60C0 +1F00 ENDCHAR -STARTCHAR 0xFB78 +STARTCHAR 0055 ENCODING 64376 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 10 9 0 -4 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 7 0 -2 BITMAP -1800 -2400 -4200 -0100 -0080 -FFC0 -0000 -1400 -1400 +3800 +4780 +0C00 +1000 +E000 +0A00 +0A00 ENDCHAR -STARTCHAR 0xFB79 +STARTCHAR 0056 ENCODING 64377 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 11 9 0 -4 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 10 7 0 -2 BITMAP -1800 -2400 -4200 -0100 -0080 -FFE0 -0000 -1400 -1400 +3800 +4780 +0D00 +1100 +E0C0 +0A00 +0A00 ENDCHAR -STARTCHAR 0xFB7A +STARTCHAR 0057 ENCODING 64378 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 8 11 0 -6 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 10 11 1 -6 BITMAP -7E -B0 -40 -CA -8A -80 -84 -84 -C0 -61 -3E +7000 +8F00 +3800 +4000 +4000 +9400 +9400 +8800 +4800 +60C0 +1F00 ENDCHAR -STARTCHAR 0xFB7B +STARTCHAR 0057 ENCODING 64379 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 10 10 1 -6 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 10 11 1 -6 BITMAP -7F00 -B200 +7000 +8F00 +3A00 4200 -C200 -95C0 +41C0 +9400 9400 8800 -C800 -6100 -3E00 +4800 +60C0 +1F00 ENDCHAR -STARTCHAR 0xFB7C +STARTCHAR 0055 ENCODING 64380 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 10 12 0 -7 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 9 0 -4 BITMAP -1800 -2400 -4200 -0100 -0080 -FFC0 -0000 -1400 -1400 -0000 -0800 -0800 +3800 +4780 +0C00 +1000 +E000 +0A00 +0A00 +0400 +0400 ENDCHAR -STARTCHAR 0xFB7D +STARTCHAR 0056 ENCODING 64381 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 11 12 0 -7 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 10 9 0 -4 BITMAP -1800 -2400 -4200 -0100 -0080 -FFE0 -0000 -1400 -1400 -0000 -0800 -0800 +3800 +4780 +0D00 +1100 +E0C0 +0A00 +0A00 +0400 +0400 ENDCHAR -STARTCHAR 0xFB7E +STARTCHAR 0057 ENCODING 64382 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 8 11 0 -6 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 10 11 1 -6 BITMAP -7E -B0 -40 -D4 -94 -80 -94 -94 -C0 -61 -3E +7000 +8F00 +3800 +4000 +4A00 +8A00 +8000 +8A00 +4A00 +60C0 +1F00 ENDCHAR -STARTCHAR 0xFB7F +STARTCHAR 0057 ENCODING 64383 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 10 10 1 -6 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 10 11 1 -6 BITMAP -7F00 -B200 +7000 +8F00 +3A00 4200 -D600 -95C0 +55C0 +9400 8000 9400 -D400 -6100 -3E00 +5400 +60C0 +1F00 ENDCHAR -STARTCHAR 0xFB80 +STARTCHAR 0055 ENCODING 64384 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 10 10 0 -5 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 10 0 -5 BITMAP -1800 -2400 -4200 -0100 -0080 -FFC0 -0000 -3600 +3800 +4780 +0C00 +1000 +E000 +0A00 +0A00 0000 -3600 +0A00 +0A00 ENDCHAR -STARTCHAR 0xFB81 +STARTCHAR 0056 ENCODING 64385 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 11 10 0 -5 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 10 10 0 -5 BITMAP -1800 -2400 -4200 -0100 -0080 -FFE0 -0000 -3600 +3800 +4780 +0D00 +1100 +E0C0 +0A00 +0A00 0000 -3600 +0A00 +0A00 ENDCHAR -STARTCHAR 0xFB82 +STARTCHAR 0065 ENCODING 64386 -SWIDTH 300 0 -DWIDTH 5 0 -BBX 5 9 0 -4 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 9 1 -3 BITMAP -10 +20 10 08 08 -88 -78 +08 +F0 00 50 50 ENDCHAR -STARTCHAR 0xFB83 -ENCODING 64387 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 9 1 -4 +STARTCHAR 0066 +ENCODING 64387 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 7 10 1 -3 BITMAP 10 10 08 08 -8C -7A +08 +98 +66 00 -50 -50 +14 +14 ENDCHAR -STARTCHAR 0xFB84 +STARTCHAR 0065 ENCODING 64388 -SWIDTH 300 0 -DWIDTH 5 0 -BBX 5 10 0 -1 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 10 1 0 BITMAP 50 50 00 00 -10 +20 10 08 08 -88 -78 +08 +F0 ENDCHAR -STARTCHAR 0xFB85 +STARTCHAR 0066 ENCODING 64389 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 10 1 -1 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 7 11 1 0 BITMAP 50 50 @@ -61629,38 +130374,37 @@ 10 08 08 -8C -7A +08 +98 +66 ENDCHAR -STARTCHAR 0xFB86 +STARTCHAR 0065 ENCODING 64390 -SWIDTH 300 0 -DWIDTH 5 0 -BBX 5 13 0 -1 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 12 1 0 BITMAP 20 20 -00 50 50 00 00 -10 +20 10 08 08 -88 -78 +08 +F0 ENDCHAR -STARTCHAR 0xFB87 +STARTCHAR 0066 ENCODING 64391 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 13 1 -1 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 7 13 1 0 BITMAP 20 20 -00 50 50 00 @@ -61669,33 +130413,34 @@ 10 08 08 -8C -7A +08 +98 +66 ENDCHAR -STARTCHAR 0xFB88 +STARTCHAR 0065 ENCODING 64392 -SWIDTH 300 0 -DWIDTH 5 0 -BBX 5 12 0 -1 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 12 1 0 BITMAP -20 -20 -38 -38 +80 +80 +E0 +E0 00 00 -10 +20 10 08 08 -88 -78 +08 +F0 ENDCHAR -STARTCHAR 0xFB89 +STARTCHAR 0066 ENCODING 64393 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 12 1 -1 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 7 13 1 0 BITMAP 20 20 @@ -61707,452 +130452,475 @@ 10 08 08 -8C -7A +08 +98 +66 ENDCHAR -STARTCHAR 0xFB8A +STARTCHAR 0069 ENCODING 64394 SWIDTH 420 0 DWIDTH 7 0 -BBX 7 15 0 -4 +BBX 6 14 1 -4 BITMAP -04 -04 -00 -0A -0A +08 +08 +14 +14 00 00 +08 +08 04 -06 -02 -02 -02 04 -8C -78 +04 +0C +18 +F0 ENDCHAR -STARTCHAR 0xFB8B +STARTCHAR 0069 ENCODING 64395 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 15 1 -4 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 8 14 1 -5 BITMAP -0400 -0400 -0000 -0A00 -0A00 -0000 -0000 -0400 -0600 -0200 -0300 -0280 -0400 -8C00 -7800 +08 +08 +14 +14 +00 +00 +08 +0C +07 +04 +04 +0C +18 +F0 ENDCHAR -STARTCHAR 0xFB8C +STARTCHAR 0069 ENCODING 64396 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 14 0 -4 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 6 14 1 -4 BITMAP -08 -08 -0E -0E +20 +20 +38 +38 00 00 +08 +08 04 -06 -02 -02 -02 04 -8C -78 +04 +0C +18 +F0 ENDCHAR -STARTCHAR 0xFB8D +STARTCHAR 0069 ENCODING 64397 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 14 1 -4 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 8 14 1 -5 BITMAP -0800 -0800 -0E00 -0E00 -0000 -0000 -0400 -0600 -0200 -0300 -0280 -0400 -8C00 -7800 +20 +20 +38 +38 +00 +00 +08 +0C +07 +04 +04 +0C +18 +F0 ENDCHAR -STARTCHAR 0xFB8E +STARTCHAR 00D7 ENCODING 64398 -SWIDTH 900 0 -DWIDTH 15 0 -BBX 15 12 0 -1 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 15 14 1 -1 BITMAP 0006 0018 -0060 -0080 -0080 0060 +0180 +0200 +0200 +0100 +00C0 +0020 4010 -8010 -8010 -8010 -4060 -3F80 +8008 +8008 +C030 +7FC0 ENDCHAR -STARTCHAR 0xFB8F +STARTCHAR 00D7 ENCODING 64399 SWIDTH 1020 0 DWIDTH 17 0 -BBX 16 12 1 -1 +BBX 16 14 1 -1 BITMAP 0006 0018 -0060 -0080 -0080 0060 +0180 +0200 +0200 +0100 +00C0 +0020 4010 -8010 -8010 -8010 -4068 -3F87 +8008 +8008 +C037 +7FC0 ENDCHAR -STARTCHAR 0xFB90 +STARTCHAR 00D4 ENCODING 64400 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 9 12 0 -1 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 10 11 0 0 BITMAP -0180 -0600 -1800 -2000 +00C0 +0300 +0C00 +3000 +4000 +4000 2000 1800 0400 0400 -0400 -0400 -1800 -E000 +F800 ENDCHAR -STARTCHAR 0xFB91 +STARTCHAR 00D5 ENCODING 64401 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 10 12 0 -1 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 11 11 0 0 BITMAP -0180 -0600 -1800 -2000 +00C0 +0300 +0C00 +3000 +4000 +4000 2000 1800 -0400 -0400 -0400 0400 -1A00 -E1C0 +0700 +F8E0 ENDCHAR -STARTCHAR 0xFB92 +STARTCHAR 00D7 ENCODING 64402 -SWIDTH 900 0 -DWIDTH 15 0 -BBX 15 14 0 -1 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 15 17 1 -1 BITMAP -0006 +0004 0018 -0066 -0098 0060 -0080 -0080 +0186 +0218 0060 +0180 +0200 +0200 +0100 +00C0 +0020 4010 -8010 -8010 -8010 -4060 -3F80 +8008 +8008 +C030 +7FC0 ENDCHAR -STARTCHAR 0xFB93 +STARTCHAR 00D7 ENCODING 64403 SWIDTH 1020 0 DWIDTH 17 0 -BBX 16 14 1 -1 +BBX 16 17 1 -1 BITMAP -0006 +0004 0018 -0066 -0098 0060 -0080 -0080 +0186 +0218 0060 +0180 +0200 +0200 +0100 +00C0 +0020 4010 -8010 -8010 -8010 -4068 -3F87 +8008 +8008 +C037 +7FC0 ENDCHAR -STARTCHAR 0xFB94 +STARTCHAR 00D4 ENCODING 64404 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 9 14 0 -1 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 10 14 0 0 BITMAP -0180 -0600 -1980 -2600 -1800 -2000 +0080 +0300 +0C00 +30C0 +4300 +0C00 +3000 +4000 +4000 2000 1800 0400 -0400 0400 -0400 -1800 -E000 +F800 ENDCHAR -STARTCHAR 0xFB95 +STARTCHAR 00D5 ENCODING 64405 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 10 14 0 -1 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 11 14 0 0 BITMAP -0180 -0600 -1980 -2600 -1800 -2000 +0080 +0300 +0C00 +30C0 +4300 +0C00 +3000 +4000 +4000 2000 1800 -0400 -0400 0400 -0400 -1A00 -E1C0 +0700 +F8E0 ENDCHAR -STARTCHAR 0xFB96 +STARTCHAR 00D7 ENCODING 64406 -SWIDTH 900 0 -DWIDTH 15 0 -BBX 15 18 0 -5 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 15 23 1 -7 BITMAP -0006 +0004 0018 -0066 -0098 0060 -0080 -0080 +0186 +0218 0060 +0180 +0200 +0200 +0100 +00C0 +0020 4010 -8010 -8010 -8010 -4060 -3F80 +8008 +8008 +C030 +7FC0 0000 -0C00 +0400 +0400 0000 -0C00 +0400 +0400 ENDCHAR -STARTCHAR 0xFB97 +STARTCHAR 00D7 ENCODING 64407 SWIDTH 1020 0 DWIDTH 17 0 -BBX 16 18 1 -5 +BBX 16 23 1 -7 BITMAP -0006 +0004 0018 -0066 -0098 0060 -0080 -0080 +0186 +0218 0060 +0180 +0200 +0200 +0100 +00C0 +0020 4010 -8010 -8010 -8010 -4068 -3F87 +8008 +8008 +C037 +7FC0 0000 -0600 +0400 +0400 0000 -0600 +0400 +0400 ENDCHAR -STARTCHAR 0xFB98 +STARTCHAR 00D4 ENCODING 64408 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 9 18 0 -5 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 10 20 0 -6 BITMAP -0180 -0600 -1980 -2600 -1800 -2000 +0080 +0300 +0C00 +30C0 +4300 +0C00 +3000 +4000 +4000 2000 1800 0400 -0400 0400 -0400 -1800 -E000 +F800 0000 -0C00 +2000 +2000 0000 -0C00 +2000 +2000 ENDCHAR -STARTCHAR 0xFB99 +STARTCHAR 00D5 ENCODING 64409 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 10 18 0 -5 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 11 20 0 -6 BITMAP -0180 -0600 -1980 -2600 -1800 -2000 +0080 +0300 +0C00 +30C0 +4300 +0C00 +3000 +4000 +4000 2000 1800 -0400 -0400 -0400 0400 -1A00 -E1C0 +0700 +F8E0 0000 -0C00 +2000 +2000 0000 -0C00 +2000 +2000 ENDCHAR -STARTCHAR 0xFB9A +STARTCHAR 00D7 ENCODING 64410 -SWIDTH 900 0 -DWIDTH 15 0 -BBX 15 16 0 -1 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 15 18 1 -1 BITMAP -0010 -0050 -0046 -0018 -0066 -0098 +0040 +0144 +0118 0060 -0080 -0080 +0186 +0218 0060 +0180 +0200 +0200 +0100 +00C0 +0020 4010 -8010 -8010 -8010 -4060 -3F80 +8008 +8008 +C030 +7FC0 ENDCHAR -STARTCHAR 0xFB9B +STARTCHAR 00D7 ENCODING 64411 SWIDTH 1020 0 DWIDTH 17 0 -BBX 16 16 1 -1 +BBX 16 18 1 -1 BITMAP -0010 -0050 -0046 -0018 -0066 -0098 +0040 +0144 +0118 0060 -0080 -0080 +0186 +0218 0060 +0180 +0200 +0200 +0100 +00C0 +0020 4010 -8010 -8010 -8010 -4068 -3F87 +8008 +8008 +C037 +7FC0 ENDCHAR -STARTCHAR 0xFB9C +STARTCHAR 00D4 ENCODING 64412 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 9 16 0 -1 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 10 15 0 0 BITMAP -0400 -1400 -1180 -0600 -1980 -2600 -1800 -2000 +0800 +2880 +2300 +0C00 +30C0 +4300 +0C00 +3000 +4000 +4000 2000 1800 0400 -0400 0400 -0400 -1800 -E000 +F800 ENDCHAR -STARTCHAR 0xFB9D +STARTCHAR 00D5 ENCODING 64413 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 10 16 0 -1 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 11 15 0 0 BITMAP -0400 -1400 -1180 -0600 -1980 -2600 -1800 -2000 +0800 +2880 +2300 +0C00 +30C0 +4300 +0C00 +3000 +4000 +4000 2000 1800 -0400 -0400 -0400 0400 -1A00 -E1C0 +0700 +F8E0 ENDCHAR -STARTCHAR 0xFB9E +STARTCHAR 00E7 ENCODING 64414 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 8 8 1 -4 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 8 7 1 -2 BITMAP 02 02 @@ -62160,113 +130928,149 @@ 81 81 82 -86 -78 +7C ENDCHAR -STARTCHAR 0xFB9F +STARTCHAR 00E7 ENCODING 64415 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 10 8 1 -4 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 9 7 1 -4 BITMAP 0200 0200 -4100 -8180 -8140 +4180 +8100 +8100 8200 -8600 -7800 +7C00 ENDCHAR -STARTCHAR 0xFBA0 +STARTCHAR 00E7 ENCODING 64416 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 8 13 1 -4 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 8 13 1 -2 BITMAP 20 20 38 38 00 +00 02 02 41 81 81 82 -86 -78 +7C ENDCHAR -STARTCHAR 0xFBA1 +STARTCHAR 00E7 ENCODING 64417 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 10 13 1 -4 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 9 14 1 -4 BITMAP 2000 2000 3800 3800 0000 +0000 +0000 0200 0200 -4100 -8180 -8140 +4180 +8100 +8100 8200 -8600 -7800 +7C00 ENDCHAR -STARTCHAR 0xFBA2 +STARTCHAR 00E4 ENCODING 64418 -SWIDTH 360 0 -DWIDTH 6 0 -BBX 5 11 0 -1 +SWIDTH 300 0 +DWIDTH 5 0 +BBX 5 11 0 0 BITMAP 20 20 38 38 00 +00 10 08 08 08 -08 F0 ENDCHAR -STARTCHAR 0xFBA3 +STARTCHAR 00E5 ENCODING 64419 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 6 11 0 0 +BITMAP +20 +20 +38 +38 +00 +00 +00 +10 +10 +10 +EC +ENDCHAR +STARTCHAR 0xFEE9 +ENCODING 64420 SWIDTH 420 0 DWIDTH 7 0 -BBX 7 11 0 -1 +BBX 5 12 1 0 BITMAP +30 40 +30 40 -70 -70 00 -20 +00 20 -10 -10 +30 +50 +88 +88 +70 +ENDCHAR +STARTCHAR 0xFEEA +ENCODING 64421 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 6 12 1 0 +BITMAP +30 +40 +30 +40 +00 10 -FE +30 +50 +90 +90 +70 +0C ENDCHAR -STARTCHAR 0xFBA6 +STARTCHAR 0xFEE9 ENCODING 64422 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 7 0 -1 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 5 6 1 0 BITMAP -18 -04 -1A -2A -2A -32 -CC +20 +30 +50 +88 +88 +70 ENDCHAR STARTCHAR 0xFBA7 ENCODING 64423 @@ -62281,86 +131085,89 @@ ENDCHAR STARTCHAR 0xFBA8 ENCODING 64424 -SWIDTH 360 0 -DWIDTH 6 0 -BBX 5 10 0 -5 +SWIDTH 180 0 +DWIDTH 3 0 +BBX 3 10 0 -4 BITMAP 20 20 20 20 20 -D8 +C0 00 -10 20 -30 +40 +60 ENDCHAR STARTCHAR 0xFBA9 ENCODING 64425 SWIDTH 360 0 DWIDTH 6 0 -BBX 6 8 0 -7 +BBX 6 7 0 -5 BITMAP 40 CC 30 20 20 -24 -28 -0C +20 +20 ENDCHAR -STARTCHAR 0xFBAA +STARTCHAR 00EA ENCODING 64426 SWIDTH 600 0 DWIDTH 10 0 -BBX 9 5 0 -2 +BBX 8 6 1 -1 BITMAP -1B00 -2480 -2480 -9F00 -6000 +38 +4E +49 +59 +26 +C0 ENDCHAR -STARTCHAR 0xFBAB +STARTCHAR 00EA ENCODING 64427 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 11 5 1 -2 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 10 6 1 -1 BITMAP -1B00 -2480 -2480 -9F60 -6000 +3800 +4E00 +4900 +5900 +27C0 +C000 ENDCHAR -STARTCHAR 0xFBAC +STARTCHAR 00EA ENCODING 64428 SWIDTH 600 0 DWIDTH 10 0 -BBX 9 4 0 -1 +BBX 9 5 0 0 BITMAP -1B00 -2480 +1C00 +2700 2480 -FF00 +2C80 +D300 ENDCHAR -STARTCHAR 0xFBAD +STARTCHAR 00EA ENCODING 64429 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 11 4 0 -1 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 10 5 0 0 BITMAP -1B00 -2480 +1C00 +2700 2480 -FF60 +2C80 +D3C0 ENDCHAR STARTCHAR 0xFBAE ENCODING 64430 -SWIDTH 840 0 -DWIDTH 14 0 +SWIDTH 900 0 +DWIDTH 15 0 BBX 13 8 1 -4 BITMAP 0200 @@ -62376,21 +131183,21 @@ ENCODING 64431 SWIDTH 720 0 DWIDTH 12 0 -BBX 11 8 1 -4 +BBX 11 8 1 -7 BITMAP -0200 -0500 -0500 -1900 -60E0 +0300 +0400 +0400 +1800 +6000 8000 8000 7FE0 ENDCHAR -STARTCHAR 0xFBB0 +STARTCHAR 0xFBAE ENCODING 64432 -SWIDTH 840 0 -DWIDTH 14 0 +SWIDTH 900 0 +DWIDTH 15 0 BBX 13 11 1 -4 BITMAP 3000 @@ -62405,119 +131212,108 @@ 8000 7FF8 ENDCHAR -STARTCHAR 0xFBB1 +STARTCHAR 0xFBAF ENCODING 64433 SWIDTH 720 0 DWIDTH 12 0 -BBX 11 11 1 -4 +BBX 11 11 1 -7 BITMAP 3000 4000 3000 -4200 -0500 -0500 -1900 -60E0 +4300 +0400 +0400 +1800 +6000 8000 8000 7FE0 ENDCHAR -STARTCHAR 0xFBD3 +STARTCHAR 0xFED9 ENCODING 64467 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 10 16 0 -1 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 9 12 1 0 BITMAP -0800 -0800 -0000 -1400 -1480 -0080 -00C0 -0080 -0480 -0C80 -0480 -0C80 -8080 -8080 -4080 -3F00 +1000 +1000 +2900 +2980 +0100 +0900 +1900 +0900 +1900 +0100 +0100 +FE00 ENDCHAR -STARTCHAR 0xFBD4 +STARTCHAR 0xFEDA ENCODING 64468 -SWIDTH 780 0 -DWIDTH 13 0 -BBX 12 16 1 -1 +SWIDTH 900 0 +DWIDTH 15 0 +BBX 14 13 1 -1 BITMAP -0800 -0800 -0000 -1400 -1480 -0080 -00C0 -0080 -0480 -0C80 -0480 -0C80 -8080 -8080 -40E0 -3F30 +0400 +0400 +0A10 +0A18 +0010 +0210 +0610 +0210 +4610 +8010 +8010 +C06C +7F80 ENDCHAR -STARTCHAR 0xFBD5 +STARTCHAR 00D4 ENCODING 64469 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 9 17 0 -1 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 10 15 0 0 BITMAP -1000 -1000 -0400 -1400 -1000 -0180 -0600 -1800 -2000 +0800 +0800 +0200 +0A00 +08C0 +0300 +0C00 +3000 +4000 +4000 2000 1800 0400 -0400 0400 -0400 -1800 -E000 +F800 ENDCHAR -STARTCHAR 0xFBD6 +STARTCHAR 00D5 ENCODING 64470 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 10 17 0 -1 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 11 15 0 0 BITMAP -1000 -1000 -0400 -1400 -1000 -0180 -0600 -1800 -2000 +0800 +0800 +0200 +0A00 +08C0 +0300 +0C00 +3000 +4000 +4000 2000 1800 -0400 -0400 0400 -0400 -1A00 -E1C0 +0700 +F8E0 ENDCHAR -STARTCHAR 0xFBD7 +STARTCHAR 0xFE85 ENCODING 64471 SWIDTH 540 0 DWIDTH 9 0 @@ -62538,11 +131334,11 @@ 84 78 ENDCHAR -STARTCHAR 0xFBD8 +STARTCHAR 0xFE86 ENCODING 64472 SWIDTH 600 0 DWIDTH 10 0 -BBX 9 14 1 -3 +BBX 9 14 1 -4 BITMAP 0400 0A00 @@ -62553,20 +131349,21 @@ 0400 0A00 0A00 -0E00 -0300 -0280 +0780 +0200 +0200 8400 7800 ENDCHAR -STARTCHAR 0xFBD9 +STARTCHAR 0xFE85 ENCODING 64473 -SWIDTH 360 0 -DWIDTH 6 0 -BBX 7 12 0 -3 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 8 13 0 -3 BITMAP -12 -0C +11 +0A +04 00 00 04 @@ -62578,26 +131375,27 @@ 84 78 ENDCHAR -STARTCHAR 0xFBDA +STARTCHAR 0xFE86 ENCODING 64474 SWIDTH 600 0 DWIDTH 10 0 -BBX 9 12 1 -3 +BBX 9 13 1 -4 BITMAP -1200 -0C00 +1100 +0A00 +0400 0000 0000 0400 0A00 0A00 -0E00 -0300 -0280 +0780 +0200 +0200 8400 7800 ENDCHAR -STARTCHAR 0xFBDB +STARTCHAR 0xFE85 ENCODING 64475 SWIDTH 540 0 DWIDTH 9 0 @@ -62618,11 +131416,11 @@ 84 78 ENDCHAR -STARTCHAR 0xFBDC +STARTCHAR 0xFE86 ENCODING 64476 SWIDTH 600 0 DWIDTH 10 0 -BBX 9 14 1 -3 +BBX 9 14 1 -4 BITMAP 0400 0400 @@ -62633,23 +131431,24 @@ 0400 0A00 0A00 -0E00 -0300 -0280 +0780 +0200 +0200 8400 7800 ENDCHAR -STARTCHAR 0xFBDD +STARTCHAR 0xFE85 ENCODING 64477 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 10 13 0 -3 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 9 14 0 -3 BITMAP -1000 -28C0 -1100 -28C0 -4100 +1180 +2A00 +1180 +2A00 +4000 +0000 0400 0A00 0A00 @@ -62659,15 +131458,14 @@ 8400 7800 ENDCHAR -STARTCHAR 0xFBDE +STARTCHAR 0xFE85 ENCODING 64478 -SWIDTH 360 0 -DWIDTH 6 0 -BBX 7 15 0 -3 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 7 14 0 -3 BITMAP 04 04 -00 0A 0A 00 @@ -62681,15 +131479,14 @@ 84 78 ENDCHAR -STARTCHAR 0xFBDF +STARTCHAR 0xFE86 ENCODING 64479 SWIDTH 600 0 DWIDTH 10 0 -BBX 9 15 1 -3 +BBX 9 14 1 -4 BITMAP 0400 0400 -0000 0A00 0A00 0000 @@ -62697,13 +131494,13 @@ 0400 0A00 0A00 -0E00 -0300 -0280 +0780 +0200 +0200 8400 7800 ENDCHAR -STARTCHAR 0xFBE0 +STARTCHAR 0xFE85 ENCODING 64480 SWIDTH 540 0 DWIDTH 9 0 @@ -62718,29 +131515,30 @@ 84 78 ENDCHAR -STARTCHAR 0xFBE1 +STARTCHAR 0xFE86 ENCODING 64481 SWIDTH 600 0 DWIDTH 10 0 -BBX 9 8 1 -3 +BBX 9 8 1 -4 BITMAP 0400 0A00 0A00 -0E00 -0300 -3E80 +0780 +0200 +3E00 8400 7800 ENDCHAR -STARTCHAR 0xFBE2 +STARTCHAR 0xFE85 ENCODING 64482 -SWIDTH 360 0 -DWIDTH 6 0 -BBX 7 12 0 -3 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 8 13 0 -3 BITMAP -0C -12 +04 +0A +11 00 00 04 @@ -62752,180 +131550,180 @@ 84 78 ENDCHAR -STARTCHAR 0xFBE3 +STARTCHAR 0xFE86 ENCODING 64483 SWIDTH 600 0 DWIDTH 10 0 -BBX 9 12 1 -3 +BBX 9 13 1 -4 BITMAP -0C00 -1200 +0400 +0A00 +1100 0000 0000 0400 0A00 0A00 -0E00 -0300 -0280 +0780 +0200 +0200 8400 7800 ENDCHAR -STARTCHAR 0xFBE4 +STARTCHAR 00F0 ENCODING 64484 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 10 12 0 -7 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 11 14 1 -8 BITMAP -01C0 +01E0 +0200 4200 -4400 -8700 -8080 -8080 -8300 -7C00 +8180 +8040 +8040 +4180 +3E00 0000 -3000 +0800 +0800 0000 -3000 +0800 +0800 ENDCHAR -STARTCHAR 0xFBE5 +STARTCHAR 00F0 ENCODING 64485 SWIDTH 660 0 DWIDTH 11 0 -BBX 10 9 1 -9 +BBX 11 10 1 -9 BITMAP -41C0 -8300 -8080 -8300 -7C00 +41E0 +8200 +8180 +8040 +4180 +3E00 0000 -3000 +0C00 0000 -3000 +0C00 ENDCHAR -STARTCHAR 0xFBE6 +STARTCHAR 00E4 ENCODING 64486 SWIDTH 360 0 DWIDTH 6 0 -BBX 5 10 0 -5 +BBX 5 11 0 -6 BITMAP 10 08 08 08 -08 F0 00 -30 +10 +10 00 -30 +10 +10 ENDCHAR -STARTCHAR 0xFBE7 +STARTCHAR 00E5 ENCODING 64487 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 7 10 0 -5 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 6 10 0 -6 BITMAP -20 -20 10 10 10 -FE +EC 00 -30 +10 +10 00 -30 +10 +10 ENDCHAR -STARTCHAR 0xFBE8 +STARTCHAR 00E4 ENCODING 64488 SWIDTH 360 0 DWIDTH 6 0 -BBX 5 6 0 -1 +BBX 5 5 0 0 BITMAP 10 08 08 08 -08 F0 ENDCHAR -STARTCHAR 0xFBE9 +STARTCHAR 00E5 ENCODING 64489 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 7 6 0 -1 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 6 4 0 0 BITMAP -20 -20 10 10 10 -FE +EC ENDCHAR -STARTCHAR 0xFBFC +STARTCHAR 00F0 ENCODING 64508 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 10 8 0 -3 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 11 8 1 -2 BITMAP -01C0 +01E0 +0200 4200 -4400 -8700 -8080 -8080 -8300 -7C00 +8180 +8040 +8040 +4180 +3E00 ENDCHAR -STARTCHAR 0xFBFD +STARTCHAR 00F0 ENCODING 64509 SWIDTH 660 0 DWIDTH 11 0 -BBX 10 5 1 -5 +BBX 11 6 1 -5 BITMAP -41C0 -8300 -8080 -8300 -7C00 +41E0 +8200 +8180 +8040 +4180 +3E00 ENDCHAR -STARTCHAR 0xFBFE +STARTCHAR 00E4 ENCODING 64510 SWIDTH 360 0 DWIDTH 6 0 -BBX 5 9 0 -4 +BBX 5 8 0 -3 BITMAP 10 08 08 08 -08 F0 00 50 50 ENDCHAR -STARTCHAR 0xFBFF +STARTCHAR 00E5 ENCODING 64511 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 7 9 0 -4 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 6 7 0 -3 BITMAP -20 -20 10 10 10 -FE +EC 00 28 28 ENDCHAR -STARTCHAR 0xFD3E +STARTCHAR char123 ENCODING 64830 SWIDTH 660 0 DWIDTH 11 0 @@ -62952,7 +131750,7 @@ 0300 0080 ENDCHAR -STARTCHAR 0xFD3F +STARTCHAR char123 ENCODING 64831 SWIDTH 660 0 DWIDTH 11 0 @@ -62979,7 +131777,7 @@ 6000 8000 ENDCHAR -STARTCHAR 0xFDF2 +STARTCHAR char203 ENCODING 65010 SWIDTH 660 0 DWIDTH 11 0 @@ -63002,7 +131800,7 @@ 64A0 1B20 ENDCHAR -STARTCHAR 0xFE20 +STARTCHAR char65056 ENCODING 65056 SWIDTH 0 0 DWIDTH 0 0 @@ -63012,7 +131810,7 @@ 40 80 ENDCHAR -STARTCHAR 0xFE21 +STARTCHAR char65056 ENCODING 65057 SWIDTH 0 0 DWIDTH 0 0 @@ -63022,7 +131820,7 @@ 08 04 ENDCHAR -STARTCHAR 0xFE22 +STARTCHAR char65056 ENCODING 65058 SWIDTH 0 0 DWIDTH 0 0 @@ -63032,7 +131830,7 @@ 42 80 ENDCHAR -STARTCHAR 0xFE23 +STARTCHAR char65056 ENCODING 65059 SWIDTH 0 0 DWIDTH 0 0 @@ -63042,7 +131840,7 @@ 84 78 ENDCHAR -STARTCHAR 0xFE50 +STARTCHAR C044 ENCODING 65104 SWIDTH 300 0 DWIDTH 5 0 @@ -63052,7 +131850,7 @@ 40 80 ENDCHAR -STARTCHAR 0xFE51 +STARTCHAR 3001 ENCODING 65105 SWIDTH 360 0 DWIDTH 6 0 @@ -63062,7 +131860,7 @@ 40 20 ENDCHAR -STARTCHAR 0xFE52 +STARTCHAR C046 ENCODING 65106 SWIDTH 240 0 DWIDTH 4 0 @@ -63071,7 +131869,7 @@ 80 80 ENDCHAR -STARTCHAR 0xFE54 +STARTCHAR C059 ENCODING 65108 SWIDTH 300 0 DWIDTH 5 0 @@ -63085,7 +131883,7 @@ 40 80 ENDCHAR -STARTCHAR 0xFE55 +STARTCHAR C058 ENCODING 65109 SWIDTH 240 0 DWIDTH 4 0 @@ -63098,7 +131896,7 @@ 80 80 ENDCHAR -STARTCHAR 0xFE56 +STARTCHAR C063 ENCODING 65110 SWIDTH 420 0 DWIDTH 7 0 @@ -63114,7 +131912,7 @@ 40 40 ENDCHAR -STARTCHAR 0xFE57 +STARTCHAR C063 ENCODING 65111 SWIDTH 300 0 DWIDTH 5 0 @@ -63130,7 +131928,7 @@ 80 80 ENDCHAR -STARTCHAR 0xFE58 +STARTCHAR char8314 ENCODING 65112 SWIDTH 480 0 DWIDTH 8 0 @@ -63138,7 +131936,7 @@ BITMAP F8 ENDCHAR -STARTCHAR 0xFE59 +STARTCHAR C040 ENCODING 65113 SWIDTH 300 0 DWIDTH 5 0 @@ -63155,7 +131953,7 @@ 40 20 ENDCHAR -STARTCHAR 0xFE5A +STARTCHAR C040 ENCODING 65114 SWIDTH 360 0 DWIDTH 6 0 @@ -63172,7 +131970,7 @@ 40 80 ENDCHAR -STARTCHAR 0xFE5B +STARTCHAR C040 ENCODING 65115 SWIDTH 360 0 DWIDTH 6 0 @@ -63189,7 +131987,7 @@ 40 30 ENDCHAR -STARTCHAR 0xFE5C +STARTCHAR C040 ENCODING 65116 SWIDTH 420 0 DWIDTH 7 0 @@ -63206,7 +132004,7 @@ 20 C0 ENDCHAR -STARTCHAR 0xFE5D +STARTCHAR C040 ENCODING 65117 SWIDTH 300 0 DWIDTH 5 0 @@ -63222,7 +132020,7 @@ 80 E0 ENDCHAR -STARTCHAR 0xFE5E +STARTCHAR C040 ENCODING 65118 SWIDTH 360 0 DWIDTH 6 0 @@ -63238,7 +132036,7 @@ 20 E0 ENDCHAR -STARTCHAR 0xFE5F +STARTCHAR char65119 ENCODING 65119 SWIDTH 540 0 DWIDTH 9 0 @@ -63252,7 +132050,7 @@ 50 A0 ENDCHAR -STARTCHAR 0xFE62 +STARTCHAR char8314 ENCODING 65122 SWIDTH 480 0 DWIDTH 8 0 @@ -63264,7 +132062,7 @@ 20 20 ENDCHAR -STARTCHAR 0xFE63 +STARTCHAR char8314 ENCODING 65123 SWIDTH 420 0 DWIDTH 7 0 @@ -63272,7 +132070,7 @@ BITMAP F0 ENDCHAR -STARTCHAR 0xFE66 +STARTCHAR char8314 ENCODING 65126 SWIDTH 480 0 DWIDTH 8 0 @@ -63310,17 +132108,15 @@ 0000 FF80 ENDCHAR -STARTCHAR 0xFE72 +STARTCHAR 0x064C ENCODING 65138 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 6 6 1 10 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 4 1 11 BITMAP -0C -14 -5C -C8 -50 +18 +58 +D0 60 ENDCHAR STARTCHAR 0xFE74 @@ -63360,36 +132156,33 @@ ENDCHAR STARTCHAR 0xFE78 ENCODING 65144 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 5 7 1 10 +SWIDTH 300 0 +DWIDTH 5 0 +BBX 4 5 1 11 BITMAP 20 50 -50 -38 20 -40 +50 80 ENDCHAR STARTCHAR 0xFE79 ENCODING 65145 SWIDTH 540 0 DWIDTH 9 0 -BBX 9 13 0 4 +BBX 9 12 0 4 BITMAP 0800 1400 -1400 -0E00 0800 -1000 +1400 2000 0000 0000 0000 0000 0000 +0000 FF80 ENDCHAR STARTCHAR 0xFE7A @@ -63418,17 +132211,15 @@ 3000 4000 ENDCHAR -STARTCHAR 0xFE7C +STARTCHAR 0x0651 ENCODING 65148 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 5 5 1 10 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 5 3 1 12 BITMAP 08 A8 -A8 -B0 -40 +D0 ENDCHAR STARTCHAR 0xFE7D ENCODING 65149 @@ -63438,9 +132229,9 @@ BITMAP 0200 2A00 -2A00 -2C00 -1000 +3400 +0000 +0000 0000 0000 0000 @@ -63450,27 +132241,25 @@ ENDCHAR STARTCHAR 0xFE7E ENCODING 65150 -SWIDTH 360 0 -DWIDTH 6 0 -BBX 4 5 1 10 +SWIDTH 240 0 +DWIDTH 4 0 +BBX 3 4 1 10 BITMAP -60 -90 -90 -90 -60 +40 +A0 +A0 +C0 ENDCHAR STARTCHAR 0xFE7F ENCODING 65151 SWIDTH 540 0 DWIDTH 9 0 -BBX 9 11 0 4 +BBX 9 10 0 4 BITMAP -1800 -2400 -2400 -2400 -1800 +1000 +2800 +2800 +3000 0000 0000 0000 @@ -63500,7 +132289,7 @@ 04 78 80 -20 +00 20 30 20 @@ -63516,12 +132305,12 @@ ENCODING 65154 SWIDTH 360 0 DWIDTH 6 0 -BBX 6 15 0 -1 +BBX 6 14 0 0 BITMAP 04 78 80 -20 +00 20 30 20 @@ -63530,15 +132319,14 @@ 20 20 20 -20 20 -1C +18 ENDCHAR STARTCHAR 0xFE83 ENCODING 65155 SWIDTH 240 0 DWIDTH 4 0 -BBX 3 17 1 0 +BBX 3 16 1 0 BITMAP 60 80 @@ -63547,7 +132335,6 @@ 00 00 40 -40 60 40 40 @@ -63560,9 +132347,9 @@ ENDCHAR STARTCHAR 0xFE84 ENCODING 65156 -SWIDTH 360 0 -DWIDTH 6 0 -BBX 5 18 1 -1 +SWIDTH 300 0 +DWIDTH 5 0 +BBX 4 16 1 0 BITMAP 60 80 @@ -63571,7 +132358,6 @@ 00 00 40 -40 60 40 40 @@ -63579,9 +132365,8 @@ 40 40 40 -40 40 -38 +30 ENDCHAR STARTCHAR 0xFE85 ENCODING 65157 @@ -63608,7 +132393,7 @@ ENCODING 65158 SWIDTH 600 0 DWIDTH 10 0 -BBX 9 14 1 -3 +BBX 9 14 1 -4 BITMAP 0600 0800 @@ -63619,9 +132404,9 @@ 0400 0A00 0A00 -0E00 -0300 -0280 +0780 +0200 +0200 8400 7800 ENDCHAR @@ -63629,10 +132414,9 @@ ENCODING 65159 SWIDTH 300 0 DWIDTH 5 0 -BBX 3 17 1 -6 +BBX 3 16 1 -6 BITMAP 40 -40 60 40 40 @@ -63651,12 +132435,11 @@ ENDCHAR STARTCHAR 0xFE88 ENCODING 65160 -SWIDTH 360 0 -DWIDTH 6 0 -BBX 5 17 1 -6 +SWIDTH 300 0 +DWIDTH 5 0 +BBX 4 16 1 -6 BITMAP 40 -40 60 40 40 @@ -63665,98 +132448,95 @@ 40 40 40 -40 -38 +30 +00 00 60 80 60 80 ENDCHAR -STARTCHAR 0xFE89 +STARTCHAR 00F0 ENCODING 65161 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 10 13 0 -3 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 11 13 0 -2 BITMAP 1800 2000 1800 2000 0000 -01C0 +01E0 +0200 4200 -4400 -8700 -8080 -8080 -8300 -7C00 +8180 +8040 +8040 +4180 +3E00 ENDCHAR -STARTCHAR 0xFE8A +STARTCHAR 00F0 ENCODING 65162 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 10 11 1 -5 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 11 12 1 -5 BITMAP -1800 -2000 -1800 -2000 +0C00 +1000 +0C00 +1000 0000 0000 -41C0 -8300 -8080 -8300 -7C00 +41E0 +8200 +8180 +8040 +4180 +3E00 ENDCHAR STARTCHAR 0xFE8B ENCODING 65163 -SWIDTH 360 0 -DWIDTH 6 0 -BBX 5 12 0 -1 +SWIDTH 300 0 +DWIDTH 5 0 +BBX 4 11 0 0 BITMAP -18 -20 -18 -20 +30 +40 +30 +40 00 00 +20 10 -08 -08 -08 -08 -F0 +10 +10 +E0 ENDCHAR STARTCHAR 0xFE8C ENCODING 65164 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 7 12 0 -1 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 6 10 0 0 BITMAP -30 -40 -30 -40 -00 -00 +18 20 +18 20 +00 +00 10 10 10 -FE +EC ENDCHAR STARTCHAR 0xFE8D ENCODING 65165 SWIDTH 300 0 DWIDTH 5 0 -BBX 2 11 2 0 +BBX 2 10 2 0 BITMAP 80 -80 C0 80 80 @@ -63769,12 +132549,11 @@ ENDCHAR STARTCHAR 0xFE8E ENCODING 65166 -SWIDTH 360 0 -DWIDTH 6 0 -BBX 4 12 2 -1 +SWIDTH 300 0 +DWIDTH 5 0 +BBX 3 10 2 0 BITMAP 80 -80 C0 80 80 @@ -63783,69 +132562,64 @@ 80 80 80 -80 -70 +60 ENDCHAR -STARTCHAR 0xFE8F +STARTCHAR 0048 ENCODING 65167 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 12 9 0 -4 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 13 9 0 -4 BITMAP -0020 -8010 -8010 -8010 -4060 -3F80 +0008 +4008 +8008 +8008 +C030 +7FC0 0000 -0400 -0400 +0200 +0200 ENDCHAR -STARTCHAR 0xFE90 +STARTCHAR 0047 ENCODING 65168 -SWIDTH 900 0 -DWIDTH 15 0 -BBX 14 9 1 -4 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 15 8 1 -4 BITMAP -0020 -8020 +4000 8010 8010 -4070 -3F8C +C06E +7F80 0000 -0200 -0200 +0400 +0400 ENDCHAR -STARTCHAR 0xFE91 +STARTCHAR 0045 ENCODING 65169 SWIDTH 360 0 DWIDTH 6 0 -BBX 5 9 0 -4 +BBX 5 8 0 -3 BITMAP 10 08 08 08 -08 F0 00 -10 -10 +20 +20 ENDCHAR -STARTCHAR 0xFE92 +STARTCHAR 0046 ENCODING 65170 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 7 9 0 -4 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 6 7 0 -3 BITMAP -20 -20 10 10 10 -EE +EC 00 10 10 @@ -63871,418 +132645,393 @@ ENCODING 65172 SWIDTH 420 0 DWIDTH 7 0 -BBX 6 12 1 -1 +BBX 6 11 1 0 BITMAP 28 28 00 00 10 -30 -50 -90 +70 90 +D0 70 10 0C ENDCHAR -STARTCHAR 0xFE95 +STARTCHAR 0050 ENCODING 65173 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 12 9 0 -1 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 13 8 0 -1 BITMAP -0A00 -0A00 -0000 -0020 -8010 -8010 -8010 -4060 -3F80 +0500 +0500 +0008 +4008 +8008 +8008 +C030 +7FC0 ENDCHAR -STARTCHAR 0xFE96 +STARTCHAR 004F ENCODING 65174 SWIDTH 900 0 DWIDTH 15 0 -BBX 14 9 1 -1 +BBX 15 8 1 -1 BITMAP -0A00 -0A00 +0500 +0500 0000 -0020 -8020 +4000 8010 8010 -4070 -3F8C +C06E +7F80 ENDCHAR -STARTCHAR 0xFE97 +STARTCHAR 004D ENCODING 65175 SWIDTH 360 0 DWIDTH 6 0 -BBX 5 10 0 -1 +BBX 5 8 0 0 BITMAP 28 28 00 -00 10 08 08 08 -08 F0 ENDCHAR -STARTCHAR 0xFE98 +STARTCHAR 004E ENCODING 65176 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 7 10 0 -1 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 6 8 0 0 BITMAP -50 -50 +28 +28 00 00 -20 -20 10 10 10 -EE +EC ENDCHAR -STARTCHAR 0xFE99 +STARTCHAR 0050 ENCODING 65177 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 12 12 0 -1 +SWIDTH 840 0 +DWIDTH 14 0 +BBX 13 10 1 -1 BITMAP -0400 -0400 -0000 -0A00 -0A00 -0000 -0020 -8010 -8010 -8010 -4060 -3F80 +0200 +0200 +0500 +0500 +0008 +4008 +8008 +8008 +C030 +7FC0 ENDCHAR -STARTCHAR 0xFE9A +STARTCHAR 004F ENCODING 65178 SWIDTH 900 0 DWIDTH 15 0 -BBX 14 12 1 -1 +BBX 15 10 1 -1 BITMAP -0400 -0400 -0000 -0A00 -0A00 +0200 +0200 +0500 +0500 0000 -0020 -8020 +4000 8010 8010 -4070 -3F8C +C06E +7F80 ENDCHAR -STARTCHAR 0xFE9B +STARTCHAR 004D ENCODING 65179 SWIDTH 360 0 DWIDTH 6 0 -BBX 5 13 0 -1 +BBX 5 10 0 0 BITMAP 10 10 -00 28 28 00 -00 10 08 08 08 -08 F0 ENDCHAR -STARTCHAR 0xFE9C +STARTCHAR 004E ENCODING 65180 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 7 13 0 -1 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 6 10 0 0 BITMAP -20 -20 -00 -50 -50 +10 +10 +28 +28 00 00 -20 -20 10 10 10 -EE +EC ENDCHAR -STARTCHAR 0xFE9D +STARTCHAR 0057 ENCODING 65181 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 8 11 0 -6 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 10 11 1 -6 BITMAP -7E -B0 -40 -C0 -80 -88 -88 -80 -C0 -61 -3E +7000 +8F00 +3800 +4000 +4000 +8800 +8800 +8000 +4000 +60C0 +1F00 ENDCHAR -STARTCHAR 0xFE9E +STARTCHAR 0057 ENCODING 65182 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 10 10 1 -6 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 10 11 1 -6 BITMAP -7F00 -B200 +7000 +8F00 +3A00 4200 -C200 -81C0 +41C0 8800 8800 -C000 -6100 -3E00 +8000 +4000 +60C0 +1F00 ENDCHAR -STARTCHAR 0xFE9F +STARTCHAR 0055 ENCODING 65183 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 10 9 0 -4 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 7 0 -2 BITMAP -1800 -2400 -4200 -0100 -0080 -FFC0 -0000 -0800 -0800 +3800 +4780 +0C00 +1000 +E000 +0400 +0400 ENDCHAR -STARTCHAR 0xFEA0 +STARTCHAR 0056 ENCODING 65184 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 11 9 0 -4 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 10 7 0 -2 BITMAP -1800 -2400 -4200 -0100 -0080 -FFE0 -0000 -0800 -0800 +3800 +4780 +0D00 +1100 +E0C0 +0400 +0400 ENDCHAR -STARTCHAR 0xFEA1 +STARTCHAR 0057 ENCODING 65185 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 8 11 0 -6 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 10 11 1 -6 BITMAP -7E -B0 -40 -C0 -80 -80 -80 -80 -C0 -61 -3E +7000 +8F00 +3800 +4000 +4000 +8000 +8000 +8000 +4000 +60C0 +1F00 ENDCHAR -STARTCHAR 0xFEA2 +STARTCHAR 0057 ENCODING 65186 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 10 10 1 -6 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 10 11 1 -6 BITMAP -7F00 -B200 +7000 +8F00 +3A00 4200 -C200 -81C0 +41C0 8000 8000 -C000 -6100 -3E00 +8000 +4000 +60C0 +1F00 ENDCHAR -STARTCHAR 0xFEA3 +STARTCHAR 0055 ENCODING 65187 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 10 6 0 -1 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 5 0 0 BITMAP -1800 -2400 -4200 -0100 -0080 -FFC0 +3800 +4780 +0C00 +1000 +E000 ENDCHAR -STARTCHAR 0xFEA4 +STARTCHAR 0056 ENCODING 65188 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 11 6 0 -1 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 10 5 0 0 BITMAP -1800 -2400 -4200 -0100 -0080 -FFE0 +3800 +4780 +0D00 +1100 +E0C0 ENDCHAR -STARTCHAR 0xFEA5 +STARTCHAR 0057 ENCODING 65189 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 8 15 0 -6 -BITMAP -10 -10 -00 -00 -7E -B0 -40 -C0 -80 -80 -80 -80 -C0 -61 -3E -ENDCHAR -STARTCHAR 0xFEA6 -ENCODING 65190 SWIDTH 660 0 DWIDTH 11 0 BBX 10 14 1 -6 BITMAP -1000 -1000 +0800 +0800 0000 +7000 +8F00 +3800 +4000 +4000 +8000 +8000 +8000 +4000 +60C0 +1F00 +ENDCHAR +STARTCHAR 0057 +ENCODING 65190 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 10 14 1 -6 +BITMAP +0800 +0800 0000 -7F00 -B200 +7000 +8F00 +3A00 4200 -C200 -81C0 +41C0 8000 8000 -C000 -6100 -3E00 +8000 +4000 +60C0 +1F00 ENDCHAR -STARTCHAR 0xFEA7 +STARTCHAR 0055 ENCODING 65191 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 10 10 0 -1 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 8 0 0 BITMAP -1000 -1000 -0000 +0400 +0400 0000 -1800 -2400 -4200 -0100 -0080 -FFC0 +3800 +4780 +0C00 +1000 +E000 ENDCHAR -STARTCHAR 0xFEA8 +STARTCHAR 0056 ENCODING 65192 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 11 10 0 -1 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 10 8 0 0 BITMAP -1000 -1000 -0000 +0400 +0400 0000 -1800 -2400 -4200 -0100 -0080 -FFE0 +3800 +4780 +0D00 +1100 +E0C0 ENDCHAR -STARTCHAR 0xFEA9 +STARTCHAR 0065 ENCODING 65193 -SWIDTH 300 0 -DWIDTH 5 0 -BBX 5 6 0 -1 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 6 1 0 BITMAP -10 +20 10 08 08 -88 -78 +08 +F0 ENDCHAR -STARTCHAR 0xFEAA +STARTCHAR 0066 ENCODING 65194 SWIDTH 420 0 DWIDTH 7 0 -BBX 7 6 0 -1 +BBX 7 7 1 0 BITMAP 10 10 08 08 -8C -7A +08 +98 +66 ENDCHAR -STARTCHAR 0xFEAB +STARTCHAR 0065 ENCODING 65195 -SWIDTH 300 0 -DWIDTH 5 0 -BBX 5 10 0 -1 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 5 10 1 0 BITMAP 20 20 00 00 -10 +20 10 08 08 -88 -78 +08 +F0 ENDCHAR -STARTCHAR 0xFEAC +STARTCHAR 0066 ENCODING 65196 SWIDTH 420 0 DWIDTH 7 0 -BBX 7 10 0 -1 +BBX 7 11 1 0 BITMAP 20 20 @@ -64292,645 +133041,652 @@ 10 08 08 -8C -7A +08 +98 +66 ENDCHAR -STARTCHAR 0xFEAD +STARTCHAR 0069 ENCODING 65197 SWIDTH 420 0 DWIDTH 7 0 -BBX 7 8 0 -4 +BBX 6 8 1 -4 BITMAP +08 +08 04 -06 -02 -02 -02 04 -8C -78 +04 +0C +18 +F0 ENDCHAR -STARTCHAR 0xFEAE +STARTCHAR 0069 ENCODING 65198 SWIDTH 540 0 DWIDTH 9 0 -BBX 9 8 0 -4 +BBX 8 8 1 -5 BITMAP -0400 -0600 -0200 -0300 -0280 -0400 -8C00 -7800 +08 +0C +07 +04 +04 +0C +18 +F0 ENDCHAR -STARTCHAR 0xFEAF +STARTCHAR 0069 ENCODING 65199 SWIDTH 420 0 DWIDTH 7 0 -BBX 7 12 0 -4 +BBX 6 12 1 -4 BITMAP 08 08 00 00 +08 +08 04 -06 -02 -02 -02 04 -8C -78 +04 +0C +18 +F0 ENDCHAR -STARTCHAR 0xFEB0 +STARTCHAR 0069 ENCODING 65200 SWIDTH 540 0 DWIDTH 9 0 -BBX 9 12 0 -4 +BBX 8 12 1 -5 BITMAP -0800 -0800 -0000 -0000 -0400 -0600 -0200 -0300 -0280 -0400 -8C00 -7800 +08 +08 +00 +00 +08 +0C +07 +04 +04 +0C +18 +F0 ENDCHAR -STARTCHAR 0xFEB1 +STARTCHAR 0072 ENCODING 65201 SWIDTH 960 0 DWIDTH 16 0 -BBX 14 7 0 -4 +BBX 15 10 1 -5 BITMAP -0004 -4124 -8124 -81FC -8100 -4200 +0002 +0002 +0012 +0112 +40EC +8080 +8080 +8080 +4300 3C00 ENDCHAR -STARTCHAR 0xFEB2 +STARTCHAR 0071 ENCODING 65202 -SWIDTH 960 0 -DWIDTH 16 0 -BBX 15 7 1 -4 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 17 8 1 -5 BITMAP -0004 -4124 -8124 -81FE -8100 -4200 -3C00 +000200 +011200 +40ED80 +808000 +808000 +808000 +430000 +3C0000 ENDCHAR -STARTCHAR 0xFEB3 +STARTCHAR 006F ENCODING 65203 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 4 0 -1 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 11 4 0 0 BITMAP -0080 -2480 -2480 -FF80 +0020 +0120 +1120 +EEC0 ENDCHAR -STARTCHAR 0xFEB4 +STARTCHAR 0070 ENCODING 65204 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 10 4 0 -1 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 13 3 0 0 BITMAP -0080 -2480 -2480 -FFC0 +0100 +1120 +EED8 ENDCHAR -STARTCHAR 0xFEB5 +STARTCHAR 0072 ENCODING 65205 SWIDTH 960 0 DWIDTH 16 0 -BBX 14 13 0 -4 +BBX 15 14 1 -5 BITMAP -0020 -0020 -0000 -0050 -0050 +0010 +0010 +0028 +0028 0000 -0004 -4124 -8124 -81FC -8100 -4200 +0002 +0012 +0112 +40EC +8080 +8080 +8080 +4300 3C00 ENDCHAR -STARTCHAR 0xFEB6 +STARTCHAR 0071 ENCODING 65206 -SWIDTH 960 0 -DWIDTH 16 0 -BBX 15 13 1 -4 +SWIDTH 1020 0 +DWIDTH 17 0 +BBX 17 13 1 -5 BITMAP -0020 -0020 -0000 -0050 -0050 -0000 -0004 -4124 -8124 -81FE -8100 -4200 -3C00 +001000 +001000 +002800 +002800 +000000 +000200 +011200 +40ED80 +808000 +808000 +808000 +430000 +3C0000 ENDCHAR -STARTCHAR 0xFEB7 +STARTCHAR 006F ENCODING 65207 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 10 0 -1 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 11 9 0 0 BITMAP -0400 -0400 -0000 -0A00 -0A00 +0100 +0100 +0280 +0280 0000 -0080 -2480 -2480 -FF80 +0020 +0120 +1120 +EEC0 ENDCHAR -STARTCHAR 0xFEB8 +STARTCHAR 0070 ENCODING 65208 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 10 10 0 -1 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 13 9 0 0 BITMAP -0400 -0400 +0100 +0100 +0280 +0280 0000 -0A00 -0A00 0000 -0080 -2480 -2480 -FFC0 +0100 +1120 +EED8 ENDCHAR -STARTCHAR 0xFEB9 +STARTCHAR 0079 ENCODING 65209 -SWIDTH 1140 0 -DWIDTH 19 0 -BBX 19 7 0 -4 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 17 10 1 -5 BITMAP -000380 -410C40 -811020 -81FFE0 -810000 -420000 +000700 +000880 +001080 +012700 +40F800 +80C000 +808000 +808000 +430000 3C0000 ENDCHAR -STARTCHAR 0xFEBA +STARTCHAR 0079 ENCODING 65210 -SWIDTH 1260 0 -DWIDTH 21 0 -BBX 20 7 1 -4 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 18 10 1 -5 BITMAP -000380 -410C40 -811020 -81FFF0 -810000 -420000 +000700 +000880 +001080 +012100 +40FFC0 +80C000 +808000 +808000 +430000 3C0000 ENDCHAR -STARTCHAR 0xFEBB +STARTCHAR 0077 ENCODING 65211 -SWIDTH 960 0 -DWIDTH 16 0 -BBX 15 4 0 -1 +SWIDTH 840 0 +DWIDTH 14 0 +BBX 13 6 0 -1 BITMAP -0038 -10C4 -1102 -EFFE +0070 +0088 +0108 +2270 +DF80 +0400 ENDCHAR -STARTCHAR 0xFEBC +STARTCHAR 0078 ENCODING 65212 -SWIDTH 960 0 -DWIDTH 16 0 -BBX 16 4 0 -1 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 13 6 0 -1 BITMAP -0038 -10C4 -1102 -EFFF +00E0 +0110 +0210 +2420 +DFF8 +0800 ENDCHAR -STARTCHAR 0xFEBD +STARTCHAR 0079 ENCODING 65213 -SWIDTH 1140 0 -DWIDTH 19 0 -BBX 19 11 0 -4 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 17 12 1 -5 BITMAP -000800 -000800 -000000 -000000 -000380 -410C40 -811020 -81FFE0 -810000 -420000 +002000 +002000 +000700 +000880 +001080 +012700 +40F800 +80C000 +808000 +808000 +430000 3C0000 ENDCHAR -STARTCHAR 0xFEBE -ENCODING 65214 -SWIDTH 1260 0 -DWIDTH 21 0 -BBX 20 11 1 -4 -BITMAP -000800 -000800 -000000 -000000 -000380 -410C40 -811020 -81FFF0 -810000 -420000 +STARTCHAR 0079 +ENCODING 65214 +SWIDTH 1080 0 +DWIDTH 18 0 +BBX 18 12 1 -5 +BITMAP +002000 +002000 +000700 +000880 +001080 +012100 +40FFC0 +80C000 +808000 +808000 +430000 3C0000 ENDCHAR -STARTCHAR 0xFEBF +STARTCHAR 0077 ENCODING 65215 -SWIDTH 960 0 -DWIDTH 16 0 -BBX 15 8 0 -1 +SWIDTH 840 0 +DWIDTH 14 0 +BBX 13 8 0 -1 BITMAP -0080 -0080 -0000 -0000 -0038 -10C4 -1102 -EFFE +0200 +0200 +0070 +0088 +0108 +2270 +DF80 +0400 ENDCHAR -STARTCHAR 0xFEC0 +STARTCHAR 0078 ENCODING 65216 -SWIDTH 960 0 -DWIDTH 16 0 -BBX 16 8 0 -1 +SWIDTH 780 0 +DWIDTH 13 0 +BBX 13 8 0 -1 BITMAP -0080 -0080 -0000 -0000 -0038 -10C4 -1102 -EFFF +0400 +0400 +00E0 +0110 +0210 +2420 +DFF8 +0800 ENDCHAR -STARTCHAR 0xFEC1 +STARTCHAR 00BC ENCODING 65217 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 10 12 0 -1 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 8 10 1 0 BITMAP -1000 -1000 -1800 -1000 -1000 -1000 -1000 -1380 -1440 -1840 -1040 -FF80 +20 +30 +20 +20 +20 +26 +29 +31 +26 +F8 ENDCHAR -STARTCHAR 0xFEC2 +STARTCHAR 00BD ENCODING 65218 -SWIDTH 780 0 -DWIDTH 13 0 -BBX 12 12 1 -1 -BITMAP -1000 -1000 -1800 -1000 -1000 -1000 -1000 -1380 -1440 -1840 -1040 -FFF0 -ENDCHAR -STARTCHAR 0xFEC3 -ENCODING 65219 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 9 12 0 -1 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 9 10 1 0 BITMAP 2000 -2000 3000 2000 2000 -2000 2000 -2700 -2880 -3080 -2080 -FF00 +2600 +2900 +3100 +2200 +FF80 +ENDCHAR +STARTCHAR 00BC +ENCODING 65219 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 7 10 0 0 +BITMAP +40 +60 +40 +40 +40 +4C +52 +62 +4C +F0 ENDCHAR -STARTCHAR 0xFEC4 +STARTCHAR 00BD ENCODING 65220 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 11 12 0 -1 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 10 10 0 0 BITMAP 2000 -2000 3000 2000 2000 2000 -2000 -2700 -2880 -3080 -2080 -FFE0 +2600 +2900 +3100 +2200 +FFC0 ENDCHAR -STARTCHAR 0xFEC5 +STARTCHAR 00BC ENCODING 65221 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 10 12 0 -1 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 8 10 1 0 BITMAP -1000 -1000 -1800 -1100 -1100 -1000 -1000 -1380 -1440 -1840 -1040 -FF80 +20 +30 +26 +20 +20 +26 +29 +31 +26 +F8 ENDCHAR -STARTCHAR 0xFEC6 +STARTCHAR 00BD ENCODING 65222 -SWIDTH 780 0 -DWIDTH 13 0 -BBX 12 12 1 -1 -BITMAP -1000 -1000 -1800 -1100 -1100 -1000 -1000 -1380 -1440 -1840 -1040 -FFF0 -ENDCHAR -STARTCHAR 0xFEC7 -ENCODING 65223 SWIDTH 600 0 DWIDTH 10 0 -BBX 9 12 0 -1 +BBX 10 10 1 0 BITMAP 2000 -2000 3000 -2200 -2200 +2600 2000 2000 -2700 -2880 -3080 -2080 -FF00 +2600 +2900 +3100 +2200 +FFC0 +ENDCHAR +STARTCHAR 00BC +ENCODING 65223 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 8 10 0 0 +BITMAP +20 +30 +26 +20 +20 +26 +29 +31 +26 +F8 ENDCHAR -STARTCHAR 0xFEC8 +STARTCHAR 00BD ENCODING 65224 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 11 12 0 -1 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 10 10 0 0 BITMAP 2000 -2000 3000 -2200 -2200 +2600 2000 2000 -2700 -2880 -3080 -2080 -FFE0 +2600 +2900 +3100 +2200 +FFC0 ENDCHAR -STARTCHAR 0xFEC9 +STARTCHAR 00CB ENCODING 65225 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 11 0 -5 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 12 1 -7 BITMAP -38 -40 -40 -38 -60 -40 -80 -80 -80 -82 -7C +3800 +4000 +8000 +4C00 +3000 +4000 +4000 +8000 +8000 +8000 +4180 +3E00 ENDCHAR -STARTCHAR 0xFECA +STARTCHAR 00CA ENCODING 65226 SWIDTH 540 0 DWIDTH 9 0 -BBX 8 9 1 -5 +BBX 9 11 1 -6 BITMAP -70 -78 -38 -70 -8F -80 -80 -82 -7C +3800 +6C00 +1000 +3800 +4780 +4000 +8000 +8000 +8000 +4180 +3E00 ENDCHAR -STARTCHAR 0xFECB +STARTCHAR 00C8 ENCODING 65227 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 8 5 0 -1 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 7 5 0 0 BITMAP 1C -22 20 -10 -FF +40 +26 +F8 ENDCHAR -STARTCHAR 0xFECC +STARTCHAR 00C5 ENCODING 65228 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 8 5 0 -1 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 7 5 0 0 BITMAP 38 -3C -1C -18 -E7 +6C +10 +38 +C6 ENDCHAR -STARTCHAR 0xFECD +STARTCHAR 00CB ENCODING 65229 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 15 0 -5 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 16 1 -7 BITMAP -10 -10 -00 -00 -38 -40 -40 -38 -60 -40 -80 -80 -80 -82 -7C +2000 +2000 +0000 +0000 +3800 +4000 +8000 +4C00 +3000 +4000 +4000 +8000 +8000 +8000 +4180 +3E00 ENDCHAR -STARTCHAR 0xFECE +STARTCHAR 00CA ENCODING 65230 SWIDTH 540 0 DWIDTH 9 0 -BBX 8 13 1 -5 +BBX 9 15 1 -6 BITMAP -20 -20 -00 -00 -70 -78 -38 -70 -8F -80 -80 -82 -7C +1000 +1000 +0000 +0000 +3800 +6C00 +1000 +3800 +4780 +4000 +8000 +8000 +8000 +4180 +3E00 ENDCHAR -STARTCHAR 0xFECF +STARTCHAR 00C8 ENCODING 65231 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 8 9 0 -1 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 7 9 0 0 BITMAP -08 -08 +10 +10 00 00 1C -22 20 -10 -FF +40 +26 +F8 ENDCHAR -STARTCHAR 0xFED0 +STARTCHAR 00C5 ENCODING 65232 SWIDTH 480 0 DWIDTH 8 0 -BBX 8 9 0 -1 +BBX 8 9 0 0 BITMAP -10 -10 +08 +08 00 00 -38 -3C 1C -18 -E7 +36 +08 +1C +E3 ENDCHAR -STARTCHAR 0xFED1 +STARTCHAR 00CF ENCODING 65233 -SWIDTH 840 0 -DWIDTH 14 0 -BBX 13 11 0 -1 +SWIDTH 900 0 +DWIDTH 15 0 +BBX 14 12 1 0 BITMAP -0040 -0040 +0010 +0010 0000 0000 -0030 -0058 -8048 -8058 -8028 -4008 -3FF0 +0018 +002C +0024 +802C +8014 +8004 +4038 +3FC0 ENDCHAR -STARTCHAR 0xFED2 +STARTCHAR 00CF ENCODING 65234 -SWIDTH 900 0 -DWIDTH 15 0 -BBX 14 11 1 -1 +SWIDTH 960 0 +DWIDTH 16 0 +BBX 16 12 1 -1 BITMAP -0040 -0040 +0010 +0010 0000 0000 -0030 -0058 -8048 -8058 -8028 -4008 -3FFC +0018 +002C +0024 +802C +8014 +8004 +403B +3FC0 ENDCHAR -STARTCHAR 0xFED3 +STARTCHAR 00CC ENCODING 65235 SWIDTH 360 0 DWIDTH 6 0 -BBX 5 11 0 -1 +BBX 5 11 0 0 BITMAP -40 -40 +20 +20 00 00 30 @@ -64941,69 +133697,70 @@ 08 F0 ENDCHAR -STARTCHAR 0xFED4 +STARTCHAR 00CC ENCODING 65236 -SWIDTH 360 0 -DWIDTH 6 0 -BBX 6 11 0 -1 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 8 10 0 0 BITMAP -40 -40 +08 +08 00 00 -30 -58 -48 -58 +18 +24 +24 28 -08 -FC +10 +EF ENDCHAR -STARTCHAR 0xFED5 +STARTCHAR 00D2 ENCODING 65237 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 8 13 0 -4 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 14 1 -3 BITMAP -0A -0A -00 -00 -06 -0B -09 -0B -85 -81 -81 -42 -3C +0500 +0500 +0000 +0000 +0300 +0580 +0480 +0480 +4380 +8080 +8080 +8100 +4200 +3C00 ENDCHAR -STARTCHAR 0xFED6 +STARTCHAR 00D2 ENCODING 65238 SWIDTH 720 0 DWIDTH 12 0 -BBX 11 13 1 -4 +BBX 11 14 1 -5 BITMAP -0A00 -0A00 +0500 +0500 0000 0000 -0600 -0B00 -0900 -0B00 -85C0 -8160 +0300 +0580 +0480 +0480 +43E0 +8080 +8080 8100 4200 3C00 ENDCHAR -STARTCHAR 0xFED7 +STARTCHAR 00CC ENCODING 65239 -SWIDTH 360 0 -DWIDTH 6 0 -BBX 5 10 0 -1 +SWIDTH 240 0 +DWIDTH 4 0 +BBX 5 11 0 0 BITMAP 50 50 @@ -65014,149 +133771,144 @@ 48 58 28 +08 F0 ENDCHAR -STARTCHAR 0xFED8 +STARTCHAR 00CC ENCODING 65240 -SWIDTH 360 0 -DWIDTH 6 0 -BBX 6 10 0 -1 +SWIDTH 480 0 +DWIDTH 8 0 +BBX 8 10 0 0 BITMAP -50 -50 +28 +28 00 00 -30 -58 -48 -58 +18 +24 +24 28 -FC +10 +EF ENDCHAR STARTCHAR 0xFED9 ENCODING 65241 SWIDTH 660 0 DWIDTH 11 0 -BBX 10 12 0 -1 +BBX 9 10 1 0 BITMAP -0080 -0080 -00C0 -0080 -0480 -0C80 -0480 -0C80 -8080 -8080 -4080 -3F00 +0100 +0180 +0100 +0900 +1900 +0900 +1900 +0100 +0100 +FE00 ENDCHAR STARTCHAR 0xFEDA ENCODING 65242 -SWIDTH 780 0 -DWIDTH 13 0 -BBX 12 12 1 -1 +SWIDTH 900 0 +DWIDTH 15 0 +BBX 14 11 1 -1 BITMAP -0080 -0080 -00C0 -0080 -0480 -0C80 -0480 -0C80 -8080 -8080 -40E0 -3F30 +0010 +0018 +0010 +0210 +0610 +0210 +4610 +8010 +8010 +C06C +7F80 ENDCHAR -STARTCHAR 0xFEDB +STARTCHAR 00D4 ENCODING 65243 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 9 12 0 -1 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 10 11 0 0 BITMAP -0180 -0600 -1800 -2000 +00C0 +0300 +0C00 +3000 +4000 +4000 2000 1800 0400 -0400 0400 -0400 -1800 -E000 +F800 ENDCHAR -STARTCHAR 0xFEDC +STARTCHAR 00D5 ENCODING 65244 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 10 12 0 -1 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 11 11 0 0 BITMAP -0180 -0600 -1800 -2000 +00C0 +0300 +0C00 +3000 +4000 +4000 2000 1800 0400 -0400 -0400 -0400 -1A00 -E1C0 +0700 +F8E0 ENDCHAR -STARTCHAR 0xFEDD +STARTCHAR 00DE ENCODING 65245 SWIDTH 540 0 DWIDTH 9 0 -BBX 8 13 0 -3 +BBX 8 12 1 -2 BITMAP 02 -02 03 02 02 02 02 02 -82 +42 82 82 -44 -38 +84 +78 ENDCHAR -STARTCHAR 0xFEDE +STARTCHAR 00DE ENCODING 65246 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 10 13 1 -3 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 9 14 1 -4 BITMAP 0200 0200 -0300 0200 0200 0200 0200 0200 +0200 +0300 +4280 8200 -8380 -82C0 -4400 -3800 +8200 +8400 +7800 ENDCHAR -STARTCHAR 0xFEDF +STARTCHAR 00DC ENCODING 65247 SWIDTH 300 0 DWIDTH 5 0 -BBX 4 11 0 -1 +BBX 4 10 0 0 BITMAP 20 -20 30 20 20 @@ -65167,15 +133919,14 @@ 20 C0 ENDCHAR -STARTCHAR 0xFEE0 +STARTCHAR 00DC ENCODING 65248 -SWIDTH 300 0 -DWIDTH 5 0 -BBX 5 11 0 -1 +SWIDTH 240 0 +DWIDTH 4 0 +BBX 4 10 0 0 BITMAP 20 20 -30 20 20 20 @@ -65183,18 +133934,20 @@ 20 20 20 -D8 +D0 ENDCHAR -STARTCHAR 0xFEE1 +STARTCHAR 00E3 ENCODING 65249 SWIDTH 420 0 DWIDTH 7 0 -BBX 6 11 1 -8 +BBX 6 13 1 -9 BITMAP -20 -70 -18 -FC +40 +B0 +08 +7C +80 +80 80 80 80 @@ -65203,16 +133956,16 @@ 80 80 ENDCHAR -STARTCHAR 0xFEE2 +STARTCHAR 00E3 ENCODING 65250 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 11 1 -8 +SWIDTH 420 0 +DWIDTH 7 0 +BBX 7 13 1 -9 BITMAP -20 -70 -18 -FE +40 +B0 +08 +7E 80 80 80 @@ -65220,36 +133973,36 @@ 80 80 80 +80 +80 ENDCHAR -STARTCHAR 0xFEE3 +STARTCHAR 00E0 ENCODING 65251 SWIDTH 480 0 DWIDTH 8 0 -BBX 7 5 0 -1 +BBX 7 4 0 0 BITMAP 0C -0A -12 12 -EE +32 +EC ENDCHAR -STARTCHAR 0xFEE4 +STARTCHAR 00E0 ENCODING 65252 SWIDTH 540 0 DWIDTH 9 0 -BBX 9 5 0 -1 +BBX 9 4 0 0 BITMAP 0C00 -0A00 1200 -1200 -EF80 +3300 +ED80 ENDCHAR -STARTCHAR 0xFEE5 +STARTCHAR 00E7 ENCODING 65253 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 8 11 1 -4 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 8 10 1 -2 BITMAP 10 10 @@ -65260,77 +134013,74 @@ 81 81 82 -86 -78 +7C ENDCHAR -STARTCHAR 0xFEE6 +STARTCHAR 00E7 ENCODING 65254 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 10 11 1 -4 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 9 10 1 -4 BITMAP 1000 1000 0000 0200 0200 -4100 -8180 -8140 +4180 +8100 +8100 8200 -8600 -7800 +7C00 ENDCHAR -STARTCHAR 0xFEE7 +STARTCHAR 00E4 ENCODING 65255 SWIDTH 360 0 DWIDTH 6 0 -BBX 5 9 0 -1 +BBX 5 9 0 0 BITMAP -10 -10 +20 +20 00 +00 10 08 08 08 -08 F0 ENDCHAR -STARTCHAR 0xFEE8 +STARTCHAR 00E5 ENCODING 65256 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 7 9 0 -1 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 6 8 0 0 BITMAP -20 -20 +10 +10 00 -20 -20 +00 10 10 10 -FE +EC ENDCHAR STARTCHAR 0xFEE9 ENCODING 65257 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 5 6 1 0 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 4 6 1 0 BITMAP 20 30 50 -98 -88 -78 +90 +90 +60 ENDCHAR STARTCHAR 0xFEEA ENCODING 65258 SWIDTH 420 0 DWIDTH 7 0 -BBX 6 8 1 -1 +BBX 6 7 1 0 BITMAP 10 30 @@ -65338,28 +134088,27 @@ 90 90 70 -10 0C ENDCHAR -STARTCHAR 0xFEEB +STARTCHAR 00EA ENCODING 65259 SWIDTH 480 0 DWIDTH 8 0 -BBX 7 7 0 -1 +BBX 8 7 0 0 BITMAP +10 18 -04 -1A -2A -2A -32 -CC +2C +56 +52 +31 +CE ENDCHAR -STARTCHAR 0xFEEC +STARTCHAR 00EB ENCODING 65260 SWIDTH 360 0 DWIDTH 6 0 -BBX 6 11 0 -6 +BBX 6 11 0 -5 BITMAP 18 28 @@ -65371,12 +134120,12 @@ 28 28 28 -10 +18 ENDCHAR STARTCHAR 0xFEED ENCODING 65261 -SWIDTH 480 0 -DWIDTH 8 0 +SWIDTH 540 0 +DWIDTH 9 0 BBX 7 8 0 -3 BITMAP 04 @@ -65390,284 +134139,303 @@ ENDCHAR STARTCHAR 0xFEEE ENCODING 65262 -SWIDTH 540 0 -DWIDTH 9 0 -BBX 9 8 0 -3 +SWIDTH 600 0 +DWIDTH 10 0 +BBX 9 8 1 -4 BITMAP 0400 0A00 0A00 -0E00 -0300 -0280 +0780 +0200 +0200 8400 7800 ENDCHAR -STARTCHAR 0xFEEF +STARTCHAR 00F0 ENCODING 65263 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 10 8 0 -3 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 11 8 0 -2 BITMAP -01C0 +01E0 +0200 4200 -4400 -8700 -8080 -8080 -8300 -7C00 +8180 +8040 +8040 +4180 +3E00 ENDCHAR -STARTCHAR 0xFEF0 +STARTCHAR 00F0 ENCODING 65264 -SWIDTH 660 0 -DWIDTH 11 0 -BBX 10 5 1 -5 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 11 6 1 -5 BITMAP -41C0 -8300 -8080 -8300 -7C00 +41E0 +8200 +8180 +8040 +4180 +3E00 ENDCHAR -STARTCHAR 0xFEF1 +STARTCHAR 00F0 ENCODING 65265 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 10 11 0 -6 +SWIDTH 720 0 +DWIDTH 12 0 +BBX 11 11 1 -5 BITMAP -01C0 +01E0 +0200 4200 -4400 -8700 -8080 -8080 -8300 -7C00 +8180 +8040 +8040 +4180 +3E00 0000 2800 2800 ENDCHAR -STARTCHAR 0xFEF2 +STARTCHAR 00F0 ENCODING 65266 SWIDTH 660 0 DWIDTH 11 0 -BBX 10 8 1 -8 +BBX 11 9 1 -8 BITMAP -41C0 -8300 -8080 -8300 -7C00 +41E0 +8200 +8180 +8040 +4180 +3E00 0000 2800 2800 ENDCHAR -STARTCHAR 0xFEF3 +STARTCHAR 00E4 ENCODING 65267 SWIDTH 360 0 DWIDTH 6 0 -BBX 5 9 0 -4 +BBX 5 8 0 -3 BITMAP 10 08 08 08 -08 F0 00 50 50 ENDCHAR -STARTCHAR 0xFEF4 +STARTCHAR 00E5 ENCODING 65268 -SWIDTH 420 0 -DWIDTH 7 0 -BBX 7 9 0 -4 +SWIDTH 360 0 +DWIDTH 6 0 +BBX 6 7 0 -3 BITMAP -20 -20 10 10 10 -FE +EC 00 28 28 ENDCHAR -STARTCHAR 0xFEF5 +STARTCHAR 00FA ENCODING 65269 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 8 12 0 -1 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 7 14 1 0 BITMAP -52 -A3 -02 -62 -72 +04 +78 +80 +00 +C4 +E6 +24 14 -0C -0C +14 +08 0C 14 24 38 ENDCHAR -STARTCHAR 0xFEF6 +STARTCHAR 00FB ENCODING 65270 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 11 13 1 -2 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 10 15 1 -1 BITMAP -5200 -A200 -0300 -6200 +0400 +7800 +8000 +0000 +0200 +6300 7200 1200 -1200 +0A00 0A00 0A00 0D00 -1900 -70E0 -C000 +0900 +30C0 +E000 ENDCHAR -STARTCHAR 0xFEF7 +STARTCHAR 00FA ENCODING 65271 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 8 15 0 -1 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 7 15 1 0 BITMAP 60 80 60 -82 -03 -02 -62 -72 +80 +00 +C4 +E6 +24 14 -0C -0C +14 +08 0C 14 24 38 ENDCHAR -STARTCHAR 0xFEF8 +STARTCHAR 00FB ENCODING 65272 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 11 16 1 -2 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 10 16 1 -1 BITMAP 6000 8000 6000 -8200 +8000 +0000 0200 -0300 -6200 +6300 7200 1200 -1200 0A00 0A00 +0A00 0D00 -1900 -70E0 -C000 +0900 +30C0 +E000 ENDCHAR -STARTCHAR 0xFEF9 +STARTCHAR 00FA ENCODING 65273 SWIDTH 540 0 DWIDTH 9 0 -BBX 7 17 1 -6 +BBX 7 16 1 -6 BITMAP -04 -06 -04 C4 -E4 -28 -18 -18 -18 -28 -48 -70 +E6 +24 +14 +14 +08 +0C +14 +24 +38 +00 00 60 80 60 80 ENDCHAR -STARTCHAR 0xFEFA +STARTCHAR 00FB ENCODING 65274 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 11 18 1 -7 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 10 17 1 -7 BITMAP 0200 -0200 -0300 -6200 +6300 7200 1200 -1200 +0A00 0A00 0A00 0D00 -1900 -70E0 -C000 +0900 +30C0 +E000 0000 -1800 -2000 -1800 -2000 +0000 +6000 +8000 +6000 +8000 ENDCHAR -STARTCHAR 0xFEFB +STARTCHAR 00FA ENCODING 65275 -SWIDTH 480 0 -DWIDTH 8 0 -BBX 7 12 1 -1 +SWIDTH 540 0 +DWIDTH 9 0 +BBX 7 10 1 0 BITMAP -04 -06 -04 C4 -E4 -28 -18 -18 -18 -28 -48 -70 +E6 +24 +14 +14 +08 +0C +14 +24 +38 ENDCHAR -STARTCHAR 0xFEFC +STARTCHAR 00FB ENCODING 65276 -SWIDTH 720 0 -DWIDTH 12 0 -BBX 11 13 1 -2 +SWIDTH 660 0 +DWIDTH 11 0 +BBX 10 11 1 -1 BITMAP 0200 -0200 -0300 -6200 +6300 7200 1200 -1200 +0A00 0A00 0A00 0D00 -1900 -70E0 -C000 +0900 +30C0 +E000 ENDCHAR -STARTCHAR 0xFF01 +STARTCHAR char8192 +ENCODING 65279 +SWIDTH 900 0 +DWIDTH 15 0 +BBX 15 15 0 0 +BITMAP +B6D6 +8000 +3EAA +84A8 +08AA +90AA +BE50 +0002 +A59A +A560 +3592 +AD4A +A5B0 +0002 +DB6A +ENDCHAR +STARTCHAR FF01 ENCODING 65281 SWIDTH 1020 0 DWIDTH 17 0 @@ -65686,7 +134454,7 @@ C0 C0 ENDCHAR -STARTCHAR 0xFF02 +STARTCHAR FF02 ENCODING 65282 SWIDTH 1020 0 DWIDTH 17 0 @@ -65697,7 +134465,7 @@ 90 90 ENDCHAR -STARTCHAR 0xFF03 +STARTCHAR FF03 ENCODING 65283 SWIDTH 1020 0 DWIDTH 17 0 @@ -65717,7 +134485,7 @@ 2200 2200 ENDCHAR -STARTCHAR 0xFF04 +STARTCHAR FF04 ENCODING 65284 SWIDTH 1020 0 DWIDTH 17 0 @@ -65739,7 +134507,7 @@ 78 10 ENDCHAR -STARTCHAR 0xFF05 +STARTCHAR FF05 ENCODING 65285 SWIDTH 1020 0 DWIDTH 17 0 @@ -65759,7 +134527,7 @@ 8110 00E0 ENDCHAR -STARTCHAR 0xFF06 +STARTCHAR FF06 ENCODING 65286 SWIDTH 1020 0 DWIDTH 17 0 @@ -65779,7 +134547,7 @@ 6190 1E60 ENDCHAR -STARTCHAR 0xFF07 +STARTCHAR FF07 ENCODING 65287 SWIDTH 1020 0 DWIDTH 17 0 @@ -65790,7 +134558,7 @@ 80 80 ENDCHAR -STARTCHAR 0xFF08 +STARTCHAR FF08 ENCODING 65288 SWIDTH 1020 0 DWIDTH 17 0 @@ -65811,7 +134579,7 @@ 20 10 ENDCHAR -STARTCHAR 0xFF09 +STARTCHAR FF09 ENCODING 65289 SWIDTH 1020 0 DWIDTH 17 0 @@ -65832,7 +134600,7 @@ 40 80 ENDCHAR -STARTCHAR 0xFF0A +STARTCHAR FF0A ENCODING 65290 SWIDTH 1020 0 DWIDTH 17 0 @@ -65849,7 +134617,7 @@ 0C00 0C00 ENDCHAR -STARTCHAR 0xFF0B +STARTCHAR FF0B ENCODING 65291 SWIDTH 1020 0 DWIDTH 17 0 @@ -65865,7 +134633,7 @@ 0800 0800 ENDCHAR -STARTCHAR 0xFF0C +STARTCHAR FF0C ENCODING 65292 SWIDTH 1020 0 DWIDTH 17 0 @@ -65876,7 +134644,7 @@ 40 80 ENDCHAR -STARTCHAR 0xFF0D +STARTCHAR FF0D ENCODING 65293 SWIDTH 1020 0 DWIDTH 17 0 @@ -65884,7 +134652,7 @@ BITMAP FFF0 ENDCHAR -STARTCHAR 0xFF0E +STARTCHAR FF0E ENCODING 65294 SWIDTH 1020 0 DWIDTH 17 0 @@ -65893,7 +134661,7 @@ C0 C0 ENDCHAR -STARTCHAR 0xFF0F +STARTCHAR FF0F ENCODING 65295 SWIDTH 1020 0 DWIDTH 17 0 @@ -65914,7 +134682,7 @@ 4000 8000 ENDCHAR -STARTCHAR 0xFF10 +STARTCHAR FF10 ENCODING 65296 SWIDTH 1020 0 DWIDTH 17 0 @@ -65934,7 +134702,7 @@ 44 38 ENDCHAR -STARTCHAR 0xFF11 +STARTCHAR FF11 ENCODING 65297 SWIDTH 1020 0 DWIDTH 17 0 @@ -65954,7 +134722,7 @@ 10 FE ENDCHAR -STARTCHAR 0xFF12 +STARTCHAR FF12 ENCODING 65298 SWIDTH 1020 0 DWIDTH 17 0 @@ -65974,7 +134742,7 @@ 81 FF ENDCHAR -STARTCHAR 0xFF13 +STARTCHAR FF13 ENCODING 65299 SWIDTH 1020 0 DWIDTH 17 0 @@ -65994,7 +134762,7 @@ 42 3C ENDCHAR -STARTCHAR 0xFF14 +STARTCHAR FF14 ENCODING 65300 SWIDTH 1020 0 DWIDTH 17 0 @@ -66014,7 +134782,7 @@ 0100 0780 ENDCHAR -STARTCHAR 0xFF15 +STARTCHAR FF15 ENCODING 65301 SWIDTH 1020 0 DWIDTH 17 0 @@ -66034,7 +134802,7 @@ 82 7C ENDCHAR -STARTCHAR 0xFF16 +STARTCHAR FF16 ENCODING 65302 SWIDTH 1020 0 DWIDTH 17 0 @@ -66054,7 +134822,7 @@ 82 7C ENDCHAR -STARTCHAR 0xFF17 +STARTCHAR FF17 ENCODING 65303 SWIDTH 1020 0 DWIDTH 17 0 @@ -66074,7 +134842,7 @@ 0800 0800 ENDCHAR -STARTCHAR 0xFF18 +STARTCHAR FF18 ENCODING 65304 SWIDTH 1020 0 DWIDTH 17 0 @@ -66094,7 +134862,7 @@ 42 3C ENDCHAR -STARTCHAR 0xFF19 +STARTCHAR FF19 ENCODING 65305 SWIDTH 1020 0 DWIDTH 17 0 @@ -66114,7 +134882,7 @@ 42 3C ENDCHAR -STARTCHAR 0xFF1A +STARTCHAR FF1A ENCODING 65306 SWIDTH 1020 0 DWIDTH 17 0 @@ -66129,7 +134897,7 @@ C0 C0 ENDCHAR -STARTCHAR 0xFF1B +STARTCHAR FF1B ENCODING 65307 SWIDTH 1020 0 DWIDTH 17 0 @@ -66146,7 +134914,7 @@ 40 80 ENDCHAR -STARTCHAR 0xFF1C +STARTCHAR FF1C ENCODING 65308 SWIDTH 1020 0 DWIDTH 17 0 @@ -66164,7 +134932,7 @@ 0300 0080 ENDCHAR -STARTCHAR 0xFF1D +STARTCHAR FF1D ENCODING 65309 SWIDTH 1020 0 DWIDTH 17 0 @@ -66175,7 +134943,7 @@ 0000 FFF0 ENDCHAR -STARTCHAR 0xFF1E +STARTCHAR FF1E ENCODING 65310 SWIDTH 1020 0 DWIDTH 17 0 @@ -66193,7 +134961,7 @@ 6000 8000 ENDCHAR -STARTCHAR 0xFF1F +STARTCHAR FF1F ENCODING 65311 SWIDTH 1020 0 DWIDTH 17 0 @@ -66213,7 +134981,7 @@ 18 18 ENDCHAR -STARTCHAR 0xFF20 +STARTCHAR FF20 ENCODING 65312 SWIDTH 1020 0 DWIDTH 17 0 @@ -66235,7 +135003,7 @@ 0C60 0380 ENDCHAR -STARTCHAR 0xFF21 +STARTCHAR FF21 ENCODING 65313 SWIDTH 1020 0 DWIDTH 17 0 @@ -66254,7 +135022,7 @@ 2040 F0F0 ENDCHAR -STARTCHAR 0xFF22 +STARTCHAR FF22 ENCODING 65314 SWIDTH 1020 0 DWIDTH 17 0 @@ -66273,7 +135041,7 @@ 2080 FF00 ENDCHAR -STARTCHAR 0xFF23 +STARTCHAR FF23 ENCODING 65315 SWIDTH 1020 0 DWIDTH 17 0 @@ -66292,7 +135060,7 @@ 2100 1E00 ENDCHAR -STARTCHAR 0xFF24 +STARTCHAR FF24 ENCODING 65316 SWIDTH 1020 0 DWIDTH 17 0 @@ -66311,7 +135079,7 @@ 20C0 FF00 ENDCHAR -STARTCHAR 0xFF25 +STARTCHAR FF25 ENCODING 65317 SWIDTH 1020 0 DWIDTH 17 0 @@ -66330,7 +135098,7 @@ 2040 FFC0 ENDCHAR -STARTCHAR 0xFF26 +STARTCHAR FF26 ENCODING 65318 SWIDTH 1020 0 DWIDTH 17 0 @@ -66349,7 +135117,7 @@ 2000 F800 ENDCHAR -STARTCHAR 0xFF27 +STARTCHAR FF27 ENCODING 65319 SWIDTH 1020 0 DWIDTH 17 0 @@ -66368,7 +135136,7 @@ 2080 1F00 ENDCHAR -STARTCHAR 0xFF28 +STARTCHAR FF28 ENCODING 65320 SWIDTH 1020 0 DWIDTH 17 0 @@ -66387,7 +135155,7 @@ 2020 F8F8 ENDCHAR -STARTCHAR 0xFF29 +STARTCHAR FF29 ENCODING 65321 SWIDTH 1020 0 DWIDTH 17 0 @@ -66406,7 +135174,7 @@ 20 F8 ENDCHAR -STARTCHAR 0xFF2A +STARTCHAR FF2A ENCODING 65322 SWIDTH 1020 0 DWIDTH 17 0 @@ -66425,7 +135193,7 @@ 90 E0 ENDCHAR -STARTCHAR 0xFF2B +STARTCHAR FF2B ENCODING 65323 SWIDTH 1020 0 DWIDTH 17 0 @@ -66444,7 +135212,7 @@ 2040 F9F0 ENDCHAR -STARTCHAR 0xFF2C +STARTCHAR FF2C ENCODING 65324 SWIDTH 1020 0 DWIDTH 17 0 @@ -66463,7 +135231,7 @@ 2040 FFC0 ENDCHAR -STARTCHAR 0xFF2D +STARTCHAR FF2D ENCODING 65325 SWIDTH 1020 0 DWIDTH 17 0 @@ -66482,7 +135250,7 @@ 2108 F93E ENDCHAR -STARTCHAR 0xFF2E +STARTCHAR FF2E ENCODING 65326 SWIDTH 1020 0 DWIDTH 17 0 @@ -66501,7 +135269,7 @@ 2020 F820 ENDCHAR -STARTCHAR 0xFF2F +STARTCHAR FF2F ENCODING 65327 SWIDTH 1020 0 DWIDTH 17 0 @@ -66520,7 +135288,7 @@ 6180 1E00 ENDCHAR -STARTCHAR 0xFF30 +STARTCHAR FF30 ENCODING 65328 SWIDTH 1020 0 DWIDTH 17 0 @@ -66539,7 +135307,7 @@ 2000 F800 ENDCHAR -STARTCHAR 0xFF31 +STARTCHAR FF31 ENCODING 65329 SWIDTH 1020 0 DWIDTH 17 0 @@ -66560,7 +135328,7 @@ 0100 0080 ENDCHAR -STARTCHAR 0xFF32 +STARTCHAR FF32 ENCODING 65330 SWIDTH 1020 0 DWIDTH 17 0 @@ -66579,7 +135347,7 @@ 2040 F8F0 ENDCHAR -STARTCHAR 0xFF33 +STARTCHAR FF33 ENCODING 65331 SWIDTH 1020 0 DWIDTH 17 0 @@ -66598,7 +135366,7 @@ 41 3E ENDCHAR -STARTCHAR 0xFF34 +STARTCHAR FF34 ENCODING 65332 SWIDTH 1020 0 DWIDTH 17 0 @@ -66617,7 +135385,7 @@ 0200 0F80 ENDCHAR -STARTCHAR 0xFF35 +STARTCHAR FF35 ENCODING 65333 SWIDTH 1020 0 DWIDTH 17 0 @@ -66636,7 +135404,7 @@ 2080 1F00 ENDCHAR -STARTCHAR 0xFF36 +STARTCHAR FF36 ENCODING 65334 SWIDTH 1020 0 DWIDTH 17 0 @@ -66654,7 +135422,7 @@ 0600 0600 ENDCHAR -STARTCHAR 0xFF37 +STARTCHAR FF37 ENCODING 65335 SWIDTH 1020 0 DWIDTH 17 0 @@ -66673,7 +135441,7 @@ 0840 0840 ENDCHAR -STARTCHAR 0xFF38 +STARTCHAR FF38 ENCODING 65336 SWIDTH 1020 0 DWIDTH 17 0 @@ -66692,7 +135460,7 @@ 2040 F9F0 ENDCHAR -STARTCHAR 0xFF39 +STARTCHAR FF39 ENCODING 65337 SWIDTH 1020 0 DWIDTH 17 0 @@ -66711,7 +135479,7 @@ 0600 1F80 ENDCHAR -STARTCHAR 0xFF3A +STARTCHAR FF3A ENCODING 65338 SWIDTH 1020 0 DWIDTH 17 0 @@ -66730,7 +135498,7 @@ 81 FF ENDCHAR -STARTCHAR 0xFF3B +STARTCHAR FF3B ENCODING 65339 SWIDTH 1020 0 DWIDTH 17 0 @@ -66752,7 +135520,7 @@ 80 F0 ENDCHAR -STARTCHAR 0xFF3C +STARTCHAR FF3C ENCODING 65340 SWIDTH 1020 0 DWIDTH 17 0 @@ -66773,7 +135541,7 @@ 0008 0004 ENDCHAR -STARTCHAR 0xFF3D +STARTCHAR FF3D ENCODING 65341 SWIDTH 1020 0 DWIDTH 17 0 @@ -66795,7 +135563,7 @@ 10 F0 ENDCHAR -STARTCHAR 0xFF3E +STARTCHAR FF3E ENCODING 65342 SWIDTH 1020 0 DWIDTH 17 0 @@ -66806,7 +135574,7 @@ 44 82 ENDCHAR -STARTCHAR 0xFF3F +STARTCHAR FF3F ENCODING 65343 SWIDTH 1020 0 DWIDTH 17 0 @@ -66814,7 +135582,7 @@ BITMAP FFFC ENDCHAR -STARTCHAR 0xFF40 +STARTCHAR FF3E ENCODING 65344 SWIDTH 1020 0 DWIDTH 17 0 @@ -66825,7 +135593,7 @@ 20 10 ENDCHAR -STARTCHAR 0xFF41 +STARTCHAR FF41 ENCODING 65345 SWIDTH 1020 0 DWIDTH 17 0 @@ -66841,7 +135609,7 @@ 8E 72 ENDCHAR -STARTCHAR 0xFF42 +STARTCHAR FF42 ENCODING 65346 SWIDTH 1020 0 DWIDTH 17 0 @@ -66860,7 +135628,7 @@ 42 3C ENDCHAR -STARTCHAR 0xFF43 +STARTCHAR FF43 ENCODING 65347 SWIDTH 1020 0 DWIDTH 17 0 @@ -66876,7 +135644,7 @@ 44 38 ENDCHAR -STARTCHAR 0xFF44 +STARTCHAR FF44 ENCODING 65348 SWIDTH 1020 0 DWIDTH 17 0 @@ -66895,7 +135663,7 @@ 4200 3D80 ENDCHAR -STARTCHAR 0xFF45 +STARTCHAR FF45 ENCODING 65349 SWIDTH 1020 0 DWIDTH 17 0 @@ -66911,7 +135679,7 @@ 44 38 ENDCHAR -STARTCHAR 0xFF46 +STARTCHAR FF46 ENCODING 65350 SWIDTH 1020 0 DWIDTH 17 0 @@ -66931,7 +135699,7 @@ 40 E0 ENDCHAR -STARTCHAR 0xFF47 +STARTCHAR FF47 ENCODING 65351 SWIDTH 1020 0 DWIDTH 17 0 @@ -66950,7 +135718,7 @@ 8200 7C00 ENDCHAR -STARTCHAR 0xFF48 +STARTCHAR FF48 ENCODING 65352 SWIDTH 1020 0 DWIDTH 17 0 @@ -66969,7 +135737,7 @@ 42 E7 ENDCHAR -STARTCHAR 0xFF49 +STARTCHAR FF49 ENCODING 65353 SWIDTH 1020 0 DWIDTH 17 0 @@ -66988,7 +135756,7 @@ 20 F8 ENDCHAR -STARTCHAR 0xFF4A +STARTCHAR FF4A ENCODING 65354 SWIDTH 1020 0 DWIDTH 17 0 @@ -67010,7 +135778,7 @@ 88 70 ENDCHAR -STARTCHAR 0xFF4B +STARTCHAR FF4B ENCODING 65355 SWIDTH 1020 0 DWIDTH 17 0 @@ -67029,7 +135797,7 @@ 4200 E780 ENDCHAR -STARTCHAR 0xFF4C +STARTCHAR FF4C ENCODING 65356 SWIDTH 1020 0 DWIDTH 17 0 @@ -67048,7 +135816,7 @@ 20 F8 ENDCHAR -STARTCHAR 0xFF4D +STARTCHAR FF4D ENCODING 65357 SWIDTH 1020 0 DWIDTH 17 0 @@ -67064,7 +135832,7 @@ 4210 E738 ENDCHAR -STARTCHAR 0xFF4E +STARTCHAR FF4E ENCODING 65358 SWIDTH 1020 0 DWIDTH 17 0 @@ -67080,7 +135848,7 @@ 4100 E380 ENDCHAR -STARTCHAR 0xFF4F +STARTCHAR FF4F ENCODING 65359 SWIDTH 1020 0 DWIDTH 17 0 @@ -67096,7 +135864,7 @@ 42 3C ENDCHAR -STARTCHAR 0xFF50 +STARTCHAR FF50 ENCODING 65360 SWIDTH 1020 0 DWIDTH 17 0 @@ -67114,7 +135882,7 @@ 40 E0 ENDCHAR -STARTCHAR 0xFF51 +STARTCHAR FF51 ENCODING 65361 SWIDTH 1020 0 DWIDTH 17 0 @@ -67132,7 +135900,7 @@ 02 07 ENDCHAR -STARTCHAR 0xFF52 +STARTCHAR FF52 ENCODING 65362 SWIDTH 1020 0 DWIDTH 17 0 @@ -67147,7 +135915,7 @@ 40 E0 ENDCHAR -STARTCHAR 0xFF53 +STARTCHAR FF53 ENCODING 65363 SWIDTH 1020 0 DWIDTH 17 0 @@ -67163,7 +135931,7 @@ 84 78 ENDCHAR -STARTCHAR 0xFF54 +STARTCHAR FF54 ENCODING 65364 SWIDTH 1020 0 DWIDTH 17 0 @@ -67181,7 +135949,7 @@ 48 30 ENDCHAR -STARTCHAR 0xFF55 +STARTCHAR FF55 ENCODING 65365 SWIDTH 1020 0 DWIDTH 17 0 @@ -67196,7 +135964,7 @@ 84 7E ENDCHAR -STARTCHAR 0xFF56 +STARTCHAR FF56 ENCODING 65366 SWIDTH 1020 0 DWIDTH 17 0 @@ -67210,7 +135978,7 @@ 18 18 ENDCHAR -STARTCHAR 0xFF57 +STARTCHAR FF57 ENCODING 65367 SWIDTH 1020 0 DWIDTH 17 0 @@ -67224,7 +135992,7 @@ 3180 1100 ENDCHAR -STARTCHAR 0xFF58 +STARTCHAR FF58 ENCODING 65368 SWIDTH 1020 0 DWIDTH 17 0 @@ -67239,7 +136007,7 @@ 42 E7 ENDCHAR -STARTCHAR 0xFF59 +STARTCHAR FF59 ENCODING 65369 SWIDTH 1020 0 DWIDTH 17 0 @@ -67256,7 +136024,7 @@ 90 60 ENDCHAR -STARTCHAR 0xFF5A +STARTCHAR FF5A ENCODING 65370 SWIDTH 1020 0 DWIDTH 17 0 @@ -67271,7 +136039,7 @@ 84 FC ENDCHAR -STARTCHAR 0xFF5B +STARTCHAR FF5B ENCODING 65371 SWIDTH 1020 0 DWIDTH 17 0 @@ -67294,7 +136062,7 @@ 40 30 ENDCHAR -STARTCHAR 0xFF5C +STARTCHAR FF5C ENCODING 65372 SWIDTH 1020 0 DWIDTH 17 0 @@ -67314,7 +136082,7 @@ 80 80 ENDCHAR -STARTCHAR 0xFF5D +STARTCHAR FF5D ENCODING 65373 SWIDTH 1020 0 DWIDTH 17 0 @@ -67337,7 +136105,7 @@ 20 C0 ENDCHAR -STARTCHAR 0xFF5E +STARTCHAR FF5E ENCODING 65374 SWIDTH 1020 0 DWIDTH 17 0 @@ -67348,7 +136116,7 @@ 8220 01C0 ENDCHAR -STARTCHAR 0xFF66 +STARTCHAR FF66 ENCODING 65382 SWIDTH 480 0 DWIDTH 8 0 @@ -67368,7 +136136,7 @@ 40 80 ENDCHAR -STARTCHAR 0xFF67 +STARTCHAR FF67 ENCODING 65383 SWIDTH 480 0 DWIDTH 8 0 @@ -67385,7 +136153,7 @@ 80 80 ENDCHAR -STARTCHAR 0xFF68 +STARTCHAR FF68 ENCODING 65384 SWIDTH 480 0 DWIDTH 8 0 @@ -67403,7 +136171,7 @@ 20 20 ENDCHAR -STARTCHAR 0xFF69 +STARTCHAR FF69 ENCODING 65385 SWIDTH 480 0 DWIDTH 8 0 @@ -67419,7 +136187,7 @@ 20 40 ENDCHAR -STARTCHAR 0xFF6A +STARTCHAR FF6A ENCODING 65386 SWIDTH 480 0 DWIDTH 8 0 @@ -67434,7 +136202,7 @@ 78 80 ENDCHAR -STARTCHAR 0xFF6B +STARTCHAR FF6B ENCODING 65387 SWIDTH 480 0 DWIDTH 8 0 @@ -67452,7 +136220,7 @@ 20 20 ENDCHAR -STARTCHAR 0xFF6C +STARTCHAR FF6C ENCODING 65388 SWIDTH 480 0 DWIDTH 8 0 @@ -67470,7 +136238,7 @@ 10 10 ENDCHAR -STARTCHAR 0xFF6D +STARTCHAR FF6D ENCODING 65389 SWIDTH 480 0 DWIDTH 8 0 @@ -67484,7 +136252,7 @@ 38 C0 ENDCHAR -STARTCHAR 0xFF6E +STARTCHAR FF6E ENCODING 65390 SWIDTH 480 0 DWIDTH 8 0 @@ -67500,7 +136268,7 @@ 20 C0 ENDCHAR -STARTCHAR 0xFF6F +STARTCHAR FF6F ENCODING 65391 SWIDTH 480 0 DWIDTH 8 0 @@ -67516,7 +136284,7 @@ 40 40 ENDCHAR -STARTCHAR 0xFF70 +STARTCHAR FF70 ENCODING 65392 SWIDTH 480 0 DWIDTH 8 0 @@ -67524,7 +136292,7 @@ BITMAP F8 ENDCHAR -STARTCHAR 0xFF71 +STARTCHAR FF71 ENCODING 65393 SWIDTH 480 0 DWIDTH 8 0 @@ -67542,7 +136310,7 @@ 80 80 ENDCHAR -STARTCHAR 0xFF72 +STARTCHAR FF72 ENCODING 65394 SWIDTH 480 0 DWIDTH 8 0 @@ -67562,7 +136330,7 @@ 20 20 ENDCHAR -STARTCHAR 0xFF73 +STARTCHAR FF73 ENCODING 65395 SWIDTH 480 0 DWIDTH 8 0 @@ -67582,7 +136350,7 @@ 10 20 ENDCHAR -STARTCHAR 0xFF74 +STARTCHAR FF74 ENCODING 65396 SWIDTH 480 0 DWIDTH 8 0 @@ -67598,7 +136366,7 @@ 2C D0 ENDCHAR -STARTCHAR 0xFF75 +STARTCHAR FF75 ENCODING 65397 SWIDTH 480 0 DWIDTH 8 0 @@ -67618,7 +136386,7 @@ 30 10 ENDCHAR -STARTCHAR 0xFF76 +STARTCHAR FF76 ENCODING 65398 SWIDTH 480 0 DWIDTH 8 0 @@ -67638,7 +136406,7 @@ 98 08 ENDCHAR -STARTCHAR 0xFF77 +STARTCHAR FF77 ENCODING 65399 SWIDTH 480 0 DWIDTH 8 0 @@ -67659,7 +136427,7 @@ 10 10 ENDCHAR -STARTCHAR 0xFF78 +STARTCHAR FF78 ENCODING 65400 SWIDTH 480 0 DWIDTH 8 0 @@ -67679,7 +136447,7 @@ 40 40 ENDCHAR -STARTCHAR 0xFF79 +STARTCHAR FF79 ENCODING 65401 SWIDTH 480 0 DWIDTH 8 0 @@ -67698,7 +136466,7 @@ 20 20 ENDCHAR -STARTCHAR 0xFF7A +STARTCHAR FF7A ENCODING 65402 SWIDTH 480 0 DWIDTH 8 0 @@ -67714,7 +136482,7 @@ 08 F0 ENDCHAR -STARTCHAR 0xFF7B +STARTCHAR FF7B ENCODING 65403 SWIDTH 480 0 DWIDTH 8 0 @@ -67734,7 +136502,7 @@ 10 20 ENDCHAR -STARTCHAR 0xFF7C +STARTCHAR FF7C ENCODING 65404 SWIDTH 480 0 DWIDTH 8 0 @@ -67752,7 +136520,7 @@ A0 40 ENDCHAR -STARTCHAR 0xFF7D +STARTCHAR FF7D ENCODING 65405 SWIDTH 480 0 DWIDTH 8 0 @@ -67771,7 +136539,7 @@ 84 80 ENDCHAR -STARTCHAR 0xFF7E +STARTCHAR FF7E ENCODING 65406 SWIDTH 480 0 DWIDTH 8 0 @@ -67789,7 +136557,7 @@ 20 1C ENDCHAR -STARTCHAR 0xFF7F +STARTCHAR FF7F ENCODING 65407 SWIDTH 480 0 DWIDTH 8 0 @@ -67808,7 +136576,7 @@ 80 80 ENDCHAR -STARTCHAR 0xFF80 +STARTCHAR FF66 ENCODING 65408 SWIDTH 480 0 DWIDTH 8 0 @@ -67828,7 +136596,7 @@ 40 80 ENDCHAR -STARTCHAR 0xFF81 +STARTCHAR FF67 ENCODING 65409 SWIDTH 480 0 DWIDTH 8 0 @@ -67845,7 +136613,7 @@ 80 80 ENDCHAR -STARTCHAR 0xFF82 +STARTCHAR FF68 ENCODING 65410 SWIDTH 480 0 DWIDTH 8 0 @@ -67863,7 +136631,7 @@ 20 20 ENDCHAR -STARTCHAR 0xFF83 +STARTCHAR FF69 ENCODING 65411 SWIDTH 480 0 DWIDTH 8 0 @@ -67879,7 +136647,7 @@ 20 40 ENDCHAR -STARTCHAR 0xFF84 +STARTCHAR FF6A ENCODING 65412 SWIDTH 480 0 DWIDTH 8 0 @@ -67894,7 +136662,7 @@ 78 80 ENDCHAR -STARTCHAR 0xFF85 +STARTCHAR FF6B ENCODING 65413 SWIDTH 480 0 DWIDTH 8 0 @@ -67912,7 +136680,7 @@ 20 20 ENDCHAR -STARTCHAR 0xFF86 +STARTCHAR FF6C ENCODING 65414 SWIDTH 480 0 DWIDTH 8 0 @@ -67930,7 +136698,7 @@ 10 10 ENDCHAR -STARTCHAR 0xFF87 +STARTCHAR FF6D ENCODING 65415 SWIDTH 480 0 DWIDTH 8 0 @@ -67944,7 +136712,7 @@ 38 C0 ENDCHAR -STARTCHAR 0xFF88 +STARTCHAR FF6E ENCODING 65416 SWIDTH 480 0 DWIDTH 8 0 @@ -67960,7 +136728,7 @@ 20 C0 ENDCHAR -STARTCHAR 0xFF89 +STARTCHAR FF6F ENCODING 65417 SWIDTH 480 0 DWIDTH 8 0 @@ -67976,7 +136744,7 @@ 40 40 ENDCHAR -STARTCHAR 0xFF8A +STARTCHAR FF70 ENCODING 65418 SWIDTH 480 0 DWIDTH 8 0 @@ -67984,7 +136752,7 @@ BITMAP F8 ENDCHAR -STARTCHAR 0xFF8B +STARTCHAR FF71 ENCODING 65419 SWIDTH 480 0 DWIDTH 8 0 @@ -68002,7 +136770,7 @@ 80 80 ENDCHAR -STARTCHAR 0xFF8C +STARTCHAR FF72 ENCODING 65420 SWIDTH 480 0 DWIDTH 8 0 @@ -68022,7 +136790,7 @@ 20 20 ENDCHAR -STARTCHAR 0xFF8D +STARTCHAR FF73 ENCODING 65421 SWIDTH 480 0 DWIDTH 8 0 @@ -68042,7 +136810,7 @@ 10 20 ENDCHAR -STARTCHAR 0xFF8E +STARTCHAR FF74 ENCODING 65422 SWIDTH 480 0 DWIDTH 8 0 @@ -68058,7 +136826,7 @@ 2C D0 ENDCHAR -STARTCHAR 0xFF8F +STARTCHAR FF75 ENCODING 65423 SWIDTH 480 0 DWIDTH 8 0 @@ -68078,7 +136846,7 @@ 30 10 ENDCHAR -STARTCHAR 0xFF90 +STARTCHAR FF76 ENCODING 65424 SWIDTH 480 0 DWIDTH 8 0 @@ -68098,7 +136866,7 @@ 98 08 ENDCHAR -STARTCHAR 0xFF91 +STARTCHAR FF77 ENCODING 65425 SWIDTH 480 0 DWIDTH 8 0 @@ -68119,7 +136887,7 @@ 10 10 ENDCHAR -STARTCHAR 0xFF92 +STARTCHAR FF78 ENCODING 65426 SWIDTH 480 0 DWIDTH 8 0 @@ -68139,7 +136907,7 @@ 40 40 ENDCHAR -STARTCHAR 0xFF93 +STARTCHAR FF79 ENCODING 65427 SWIDTH 480 0 DWIDTH 8 0 @@ -68158,7 +136926,7 @@ 20 20 ENDCHAR -STARTCHAR 0xFF94 +STARTCHAR FF7A ENCODING 65428 SWIDTH 480 0 DWIDTH 8 0 @@ -68174,7 +136942,7 @@ 08 F0 ENDCHAR -STARTCHAR 0xFF95 +STARTCHAR FF7B ENCODING 65429 SWIDTH 480 0 DWIDTH 8 0 @@ -68194,7 +136962,7 @@ 10 20 ENDCHAR -STARTCHAR 0xFF96 +STARTCHAR FF7C ENCODING 65430 SWIDTH 480 0 DWIDTH 8 0 @@ -68212,7 +136980,7 @@ A0 40 ENDCHAR -STARTCHAR 0xFF97 +STARTCHAR FF7D ENCODING 65431 SWIDTH 480 0 DWIDTH 8 0 @@ -68231,7 +136999,7 @@ 84 80 ENDCHAR -STARTCHAR 0xFF98 +STARTCHAR FF7E ENCODING 65432 SWIDTH 480 0 DWIDTH 8 0 @@ -68249,7 +137017,7 @@ 20 1C ENDCHAR -STARTCHAR 0xFF99 +STARTCHAR FF7F ENCODING 65433 SWIDTH 480 0 DWIDTH 8 0 @@ -68268,7 +137036,7 @@ 80 80 ENDCHAR -STARTCHAR 0xFFE0 +STARTCHAR FFE1 ENCODING 65504 SWIDTH 1020 0 DWIDTH 17 0 @@ -68288,7 +137056,7 @@ 9480 6300 ENDCHAR -STARTCHAR 0xFFE1 +STARTCHAR FFE2 ENCODING 65505 SWIDTH 1020 0 DWIDTH 17 0 @@ -68304,7 +137072,7 @@ 0010 0010 ENDCHAR -STARTCHAR 0xFFE2 +STARTCHAR FFE3 ENCODING 65506 SWIDTH 1020 0 DWIDTH 17 0 @@ -68312,7 +137080,7 @@ BITMAP FFFF ENDCHAR -STARTCHAR 0xFFE3 +STARTCHAR FFE4 ENCODING 65507 SWIDTH 1020 0 DWIDTH 17 0 @@ -68333,7 +137101,7 @@ 80 80 ENDCHAR -STARTCHAR 0xFFE4 +STARTCHAR C089 ENCODING 65508 SWIDTH 1020 0 DWIDTH 17 0 @@ -68352,7 +137120,7 @@ 0400 1F00 ENDCHAR -STARTCHAR 0xFFE5 +STARTCHAR FFE6 ENCODING 65509 SWIDTH 1020 0 DWIDTH 17 0 @@ -68371,7 +137139,7 @@ 0840 0840 ENDCHAR -STARTCHAR 0xFFFD +STARTCHAR char65533 ENCODING 65533 SWIDTH 1080 0 DWIDTH 18 0 @@ -68392,23 +137160,5 @@ 06C0 0380 0100 -ENDCHAR -STARTCHAR C072 -ENCODING 65534 -SWIDTH 600 0 -DWIDTH 10 0 -BBX 7 11 2 0 -BITMAP -AA -00 -82 -00 -82 -00 -82 -00 -82 -00 -AA ENDCHAR ENDFONT Index: xc/extras/freetype2/.cvsignore diff -u /dev/null xc/extras/freetype2/.cvsignore:1.1.1.1 --- /dev/null Mon Dec 18 14:22:16 2000 +++ xc/extras/freetype2/.cvsignore Fri Dec 8 16:26:05 2000 @@ -0,0 +1 @@ +config.mk Index: xc/extras/freetype2/CHANGES diff -u /dev/null xc/extras/freetype2/CHANGES:1.1.1.1 --- /dev/null Mon Dec 18 14:22:16 2000 +++ xc/extras/freetype2/CHANGES Fri Dec 8 16:26:05 2000 @@ -0,0 +1,1002 @@ +LATEST 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" to use it. 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 linerVertAdvance 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's 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 + + o FT_Get_Kerning has a new parameter that allows you to select + the coordinates of the kerning vector ( font units, scaled, + scaled + grid-fitted ). + + o the outline functions are now in and not + part of anymore + + o now contains declarations for + FT_New_Library, FT_Done_Library, FT_Add_Default_Modules + + o 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.. + + o 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. + + o now include , + solving a few headaches :-) + + o 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 initialisation, 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. + + The 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 had 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 WHEN 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 WHEN 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. + + + + + - reformated 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.. my god.. + + - 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 + 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 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, grumpf.. :-( + +================================================================================ +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 synthetize + 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 embbed 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 ligthen the + font driver's code). + + +============================================================================= +OLD MESSAGE + +This file summarizes the changes that occured 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, it's "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 wathever 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); + } + Index: xc/extras/freetype2/ChangeLog diff -u /dev/null xc/extras/freetype2/ChangeLog:1.1.1.1 --- /dev/null Mon Dec 18 14:22:16 2000 +++ xc/extras/freetype2/ChangeLog Fri Dec 8 16:26:05 2000 @@ -0,0 +1,215 @@ +2000-12-01 David Turner + + * builds/unix/configure.in, builds/unix/configure, + builds/cygwin/configure.in, builds/cygwin/configure: setting + "version_info" to 6:1:0 for the 2.0.1 release + + * CHANGES: added a summary of changes between 2.0.1 and 2.0 + + * builds/unix/ftconfig.in, builds/cygwin/ftconfig.in: changes + to allow compilation under Unix with the Unix-specific config + files.. + +2000-12-01 Werner Lemberg + + * INSTALL: Revised. + * builds/compiler/bcc-dev.mk, builds/compiler/visualage.mk, + builds/compiler/bcc.mk, builds/win32/w32-bcc.mk, + builds/win32/w32-bccd.mk: Revised. + * include/freetype/config/ftbuild.h, + include/freetype/internal/internal.h: Revised. + * include/freetype/ftimage.h: Updated to new header inclusion scheme. + +2000-11-30 Werner Lemberg + + * builds/toplevel.mk (.PHONY): Adding `distclean'. + * builds/unix/detect.mk (.PHONY): Adding `devel', `unix', `lcc', + `setup'. + +2000-11-30 David Turner + + * INSTALL: Slightly updated the quick starter documentation to + include IDE compilation, prevent against BSD Make, and specify "make + setup" instead of a single "make" for build configuration. + + * include/config/ftbuild.h, include/internal/internal.h: Added new + configuration files used to determine the location of all public, + configuration, and internal header files for FreeType 2. Modified + all headers under "include/freetype" to reflect this change. Note + that we still need to change the library source files themselves + though. + + * builds/compiler/bcc.mk, builds/compiler/bcc-dev.mk, + builds/win32/w32-bcc.mk, builds/win32/w32-bccd.mk, + builds/win32/detect.mk: Added new files to support compilation with + the free Borland C++ command-line compiler. Modified the detection + rules to recognize the new "bcc32" target in "make setup bcc32". + + * src/sfnt/ttcmap.c, src/sfnt/ttpost.c, src/sfnt/ttsbit.c, + src/truetype/ttobjs.c, src/truetype/ttgload.c, + src/truetype/ttinterp.c: Fixed a few comparisons that Borland C++ + didn't really like. Basically, this compiler complains when FT_UInt + is compared to FT_UShort (apparently, it promotes `UShort' to `Int' + in these cases). + +2000-11-30 Tom Kacvinsky + + * t2objs.c (T2_Init_Face): Added calculation of `face->height' for + pure CFF fonts. + + * t1objs.c (T1_Init_Face): Fixed computation of `face->height'. + +2000-11-29 David Turner + + * src/base/ftbbox.c (BBox_Conic_Check): Fixed a really stupid + bug in the formula used to compute the conic Bézier extrema + of non-monotonous arcs. + +2000-11-29 Werner Lemberg + + * src/base/ftcalc.c (FT_SqrtFixed), src/base/ftobjs.c + (FT_Set_Renderer): Use FT_EXPORT_DEF. + * src/cache/ftcimage.c (FTC_Image_Cache_Lookup), + src/cache/ftcmanag.c (FTC_Manager_Done, FTC_Manager_Reset, + FTC_Manager_Lookup_Face, FTC_Manager_Lookup_Size, + FTC_Manager_Register_Cache), src/cache/ftcsbits.c + (FTC_SBit_Cache_Lookup): Ditto. + + * src/include/freetype/cache/ftcglyph.h (FTC_GlyphNode_Init), + src/include/freetype/ftmac.h (FT_New_Face_From_FOND): Use FT_EXPORT. + +2000-11-29 Werner Lemberg + + * src/sfnt/sfdriver.c: Include ttsbit.h and ttpost.h only + conditionally. + + * src/truetype/ttdriver.c (Set_Char_Sizes, Set_Pixel_Sizes): Set + `size->strike_index' only conditionally. + + * src/type1/t1driver.c, src/type1/t1objs.c: Include t1afm.h only + conditionally. + + * src/winfonts/winfnt.h: Move all type definitions to... + * src/include/freetype/internal/fnttypes.h: New file. + * src/winfonts/winfnt.c: Use it. + +2000-11-29 ??? ??? + + * include/freetype/internal/ftdebug.h: Replaced FT_CAT and FT_XCAT + with a direct solution (which also satifies picky compilers). + +2000-11-28 YAMANO-UCHI Hidetoshi + + * src/truetype/ttobjs.c (TT_Init_Size): Fix #ifdef's to work with + disabled interpreter also. + + * src/base/ftnames.c (FT_Get_Sfnt_Name_Count): Fix incorrect + parentheses. + +2000-11-26 Tom Kacvinsky + + * src/cff/t2gload.c (T2_Parse_CharStrings): Added logic to glyph + width setting code to take into account even/odd argument counts + and glyph width operand before endchar/hmoveto/vmoveto. + +2000-11-26 Werner Lemberg + + * builds/ansi/ansi.mk: Fix inclusion order of files. + +2000-11-26 Keith Packard + + * src/type1/t1objs.c (T1_Init_Face): Compute style flags. + +2000-11-26 Werner Lemberg + + * builds/compiler/ansi-cc.mk (CLEAN_LIBRARY): Fix rule and + conditional. + +2000-11-23 Werner Lemberg + + * src/type1/t1load.c (parse_subrs, parse_charstrings): Use decrypt + function from PSAux module. + + * src/type1/t1parse.c (T1_Done_Parse): Renamed to... + (T1_Finalize_Parser): New function (to avoid name clash with a + function in the PSAux module). + (T1_Decrypt): Removed since it is duplicated in the PSAux module. + (T1_Get_Private_Dict): Added `psaux' as new parameter; use decrypt + function from PSAux module. + + * src/type1/t1parse.h: Adapted. + +2000-11-22 Tom Kacvinsky + + * src/cff/t2objs.c (T2_Init_Face): For pure CFF fonts, set + `root->num_faces' to `cff->num_faces' and set `units_per_EM' + to 1000. + + * src/cff/t2parse.c (parse_t2_real): Fixed real number parsing + loop. + + * src/cff/t2load.c (T2_Get_String): Called T2_Get_Name with a + sid that was off by one. + +2000-11-16 David Turner + + * src/autohint/ahtypes.h (AH_Hinter): Added new fields to control + auto-hinting of synthetic Type 1 fonts. + + * src/autohint/ahhint.c (ah_hinter_load, ah_hinter_load_glyph): + Added auto-hinting support of synthetic Type 1 fonts. + +2000-11-12 Tom Kacvinsky + + * src/sfnt/ttload.c (TT_LookUp_Table, TT_Load_Generic_Table): Change + tracing output. + + * src/sfnt/sfobjs.c (SFNT_Load_Face): Set boolean variable + `has-outline' to true only if the font has a `glyf' or `CFF ' table. + +2000-11-11 Werner Lemberg + + * builds/win32/visualc/freetype.dsp: Fix raster1->raster and + type1z->type1. + +2000-11-11 Tom Kacvinsky + + * builds/unix/freetype-config.in, builds/cygwin/freetype-config.in: + Added a --libtool option. When freetype-config --libtool is + invoked, the absolute path to the libtool convenience library + is returned. + +2000-11-11 Werner Lemberg + + * builds/cygwin/cygwin-def.in: Same fix as previous. + +2000-11-10 Tom Kacvinsky + + * builds/unix/unix-def.in: Add + + INSTALL_PROGRAM := @INSTALL_PROGRAM@ + INSTALL_SCRIPT := @INSTALL_SCRIPT@ + + so that installation of freetype-config does not fail. + +2000-11-10 Werner Lemberg + + * builds/cygwin/freetype-config.in, builds/unix/freetype-config.in: + Move test down for empty --exec-prefix. + Fix --version. + + * builds/cygwin/install.mk, builds/unix/install.mk: Use + $(INSTALL_SCRIPT) for installation of freetype-config. + + * builds/cygwin/install.mk: Fix clean target names. + +2000-11-09 David Turner + + * Version 2.0 released. + ======================= + + +Local Variables: +version-control: never +coding: latin-1 +End: Index: xc/extras/freetype2/INSTALL diff -u /dev/null xc/extras/freetype2/INSTALL:1.1.1.1 --- /dev/null Mon Dec 18 14:22:16 2000 +++ xc/extras/freetype2/INSTALL Fri Dec 8 16:26:05 2000 @@ -0,0 +1,93 @@ +In order to build the library, read the `BUILD' document in the `docs' +directory. This is only a quick starter: + +I. From the command line: + + You need to have GNU Make installed on your system to compile the + library from the command line. This will _not_ work with other + make tools (including BSD make)! + + - Go to the `freetype2' directory. + + - On Unix (any C compiler should work): + + - make setup (don't worry, this will invoke a configure script) + - make + - make install + + Alternatively, you can pass parameters to the configure script + within the CFG variable, as in: + + - make setup CFG="--prefix=/usr" + - make + - make install + + - On Windows: + + We provide a version of GNU Make for Win32 on the FreeType site. + See http://www.freetype.org/download.html for details. + + If you are using gcc: + + - make setup + - make + + If you are using Visual C++: + + - make setup visualc + - make + + If you are using Win32-lCC: + + - make setup lcc + - make + + If you are using the Borland C++ Builder compiler: + + - make setup bcc32 + - make + + +II. In your own environment (IDE): + + You need to add the directories "freetype2/include" and "freetype2/src" + to your include path when compiling the library. + + Compile each library component through the following files: + + -- base components (required) + + src/base/ftsystem.c + src/base/ftinit.c + src/base/ftdebug.c + src/base/ftbase.c + src/base/ftglyph.c + src/base/ftbbox.c + src/base/ftmm.c + + src/base/ftmac.c -- only on the Macintosh + + -- other components are optional + + src/autohint/autohint.c -- auto hinting module + src/cache/ftcache.c -- cache sub-system (in beta) + src/sfnt/sfnt.c -- SFNT files support (TrueType & OpenType) + src/cff/cff.c -- CFF/OpenType font driver + src/psnames/psnames.c -- Postscript glyph names support + src/psaux/psaux.c -- Postscript Type 1 parsing + src/truetype/truetype.c -- TrueType font driver + src/type1/type1.c -- Type 1 font driver + src/cid/type1cid.c -- Type 1 CID-keyed font driver + src/winfonts/winfonts.c -- Windows FONT / FNT font driver + + Note: + + `truetype.c' needs `sfnt.c' and `psnames.c' + `type1.c' needs `psaux.c' and `psnames.c' + `type1cid.c' needs `psaux.c' and `psnames.c' + `cff.c' needs `sfnt.c', `psaux.c', and `psnames.c' + + etc. + + +--- end of INSTALL -- Index: xc/extras/freetype2/LICENSE.TXT diff -u /dev/null xc/extras/freetype2/LICENSE.TXT:1.1.1.1 --- /dev/null Mon Dec 18 14:22:16 2000 +++ xc/extras/freetype2/LICENSE.TXT Fri Dec 8 16:26:05 2000 @@ -0,0 +1,7 @@ + +FreeType comes with two licenses from which you can choose the one which +fits your needs best: + + . The FreeType License, in file `docs/FTL.txt'. + + . The GNU General Public License, in file `docs/GPL.txt'. Index: xc/extras/freetype2/Makefile diff -u /dev/null xc/extras/freetype2/Makefile:1.1.1.1 --- /dev/null Mon Dec 18 14:22:16 2000 +++ xc/extras/freetype2/Makefile Fri Dec 8 16:26:05 2000 @@ -0,0 +1,32 @@ +# +# FreeType 2 build system -- top-level Makefile +# + + +# 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. + + +# Project names +# +PROJECT := freetype +PROJECT_TITLE := FreeType + +USE_MODULES := 1 + +# The variable TOP holds the path to the topmost directory in the project +# engine source hierarchy. If it is not defined, default it to `.'. +# +ifndef TOP + TOP := . +endif + +include $(TOP)/builds/toplevel.mk + +# EOF Index: xc/extras/freetype2/builds/detect.mk diff -u /dev/null xc/extras/freetype2/builds/detect.mk:1.1.1.1 --- /dev/null Mon Dec 18 14:22:17 2000 +++ xc/extras/freetype2/builds/detect.mk Fri Dec 8 16:26:05 2000 @@ -0,0 +1,130 @@ +# +# FreeType 2 host platform detection rules +# + + +# 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. + + +# This sub-Makefile is in charge of detecting the current platform. It sets +# the following variables: +# +# BUILD The configuration and system-specific directory. Usually +# `freetype/builds/$(PLATFORM)' but can be different for +# custom builds of the library. +# +# The following variables must be defined in system specific `detect.mk' +# files: +# +# PLATFORM The detected platform. This will default to `ansi' if +# auto-detection fails. +# CONFIG_FILE The configuration sub-makefile to use. This usually depends +# on the compiler defined in the `CC' environment variable. +# DELETE The shell command used to remove a given file. +# COPY The shell command used to copy one file. +# SEP The platform-specific directory separator. +# CC The compiler to use. +# +# You need to set the following variable(s) before calling it: +# +# TOP The top-most directory in the FreeType library source +# hierarchy. If not defined, it will default to `.'. + +# If TOP is not defined, default it to `.' +# +ifndef TOP + TOP := . +endif + +# Set auto-detection default to `ansi' resp. UNIX-like operating systems. +# Note that we delay evaluation of $(BUILD_CONFIG_), $(BUILD), and +# $(CONFIG_RULES). +# +PLATFORM := ansi +DELETE := $(RM) +COPY := cp +SEP := / + +BUILD_CONFIG_ = $(TOP)$(SEP)builds$(SEP) +BUILD = $(BUILD_CONFIG_)$(PLATFORM) +CONFIG_RULES = $(BUILD)$(SEP)$(CONFIG_FILE) + +# We define the BACKSLASH variable to hold a single back-slash character. +# This is needed because a line like +# +# SEP := \ +# +# does not work with GNU Make (the backslash is interpreted as a line +# continuation). While a line like +# +# SEP := \\ +# +# really defines $(SEP) as `\' on Unix, and `\\' on Dos and Windows! +# +BACKSLASH := $(strip \ ) + +# Now, include all detection rule files found in the `builds/' +# directories. Note that the calling order of the various `detect.mk' files +# isn't predictable. +# +include $(wildcard $(BUILD_CONFIG_)*/detect.mk) + +# In case no detection rule file was successful, use the default. +# +ifndef CONFIG_FILE + CONFIG_FILE := ansi.mk + setup: std_setup +endif + +# The following targets are equivalent, with the exception that they use +# a slightly different syntax for the `echo' command. +# +# std_setup: defined for most (i.e. Unix-like) platforms +# dos_setup: defined for Dos-ish platforms like Dos, Windows & OS/2 +# +.PHONY: std_setup dos_setup + +std_setup: + @echo "" + @echo "$(PROJECT_TITLE) build system -- automatic system detection" + @echo "" + @echo "The following settings are used:" + @echo "" + @echo " platform $(PLATFORM)" + @echo " compiler $(CC)" + @echo " configuration directory $(BUILD)" + @echo " configuration rules $(CONFIG_RULES)" + @echo "" + @echo "If this does not correspond to your system or settings please remove the file" + @echo "\`$(CONFIG_MK)' from this directory then read the INSTALL file for help." + @echo "" + @echo "Otherwise, simply type \`make' again to build the library." + @echo "" + @$(COPY) $(CONFIG_RULES) $(CONFIG_MK) + +dos_setup: + @echo ÿ + @echo $(PROJECT_TITLE) build system -- automatic system detection + @echo ÿ + @echo The following settings are used: + @echo ÿ + @echo ÿÿplatformÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ$(PLATFORM) + @echo ÿÿcompilerÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ$(CC) + @echo ÿÿconfiguration directoryÿÿÿÿÿÿ$(BUILD) + @echo ÿÿconfiguration rulesÿÿÿÿÿÿÿÿÿÿ$(CONFIG_RULES) + @echo ÿ + @echo If this does not correspond to your system or settings please remove the file + @echo '$(CONFIG_MK)' from this directory then read the INSTALL file for help. + @echo ÿ + @echo Otherwise, simply type 'make' again to build the library. + @echo ÿ + @$(COPY) $(subst /,\,$(CONFIG_RULES) $(CONFIG_MK)) > nul + +# EOF Index: xc/extras/freetype2/builds/freetype.mk diff -u /dev/null xc/extras/freetype2/builds/freetype.mk:1.1.1.1 --- /dev/null Mon Dec 18 14:22:17 2000 +++ xc/extras/freetype2/builds/freetype.mk Fri Dec 8 16:26:05 2000 @@ -0,0 +1,284 @@ +# +# FreeType 2 library sub-Makefile +# + + +# 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. + + +# DO NOT INVOKE THIS MAKEFILE DIRECTLY! IT IS MEANT TO BE INCLUDED BY +# OTHER MAKEFILES. + + +# The following variables (set by other Makefile components, in the +# environment, or on the command line) are used: +# +# BUILD The architecture dependent directory, +# e.g. `$(TOP)/builds/unix'. +# +# OBJ_DIR The directory in which object files are created. +# +# LIB_DIR The directory in which the library is created. +# +# INCLUDES A list of directories to be included additionally. +# Usually empty. +# +# CFLAGS Compilation flags. This overrides the default settings +# in the platform-specific configuration files. +# +# FTSYS_SRC If set, its value is used as the name of a replacement +# file for `src/base/ftsystem.c'. +# +# FTDEBUG_SRC If set, its value is used as the name of a replacement +# file for `src/base/ftdebug.c'. [For a normal build, this +# file does nothing.] +# +# FT_MODULE_LIST The file which contains the list of modules for the +# current build. Usually, this is automatically created by +# `modules.mk'. +# +# BASE_OBJ_S +# BASE_OBJ_M A list of base objects (for single object and multiple +# object builds, respectively). Set up in +# `src/base/rules.mk'. +# +# BASE_EXT_OBJ A list of base extension objects. Set up in +# `src/base/rules.mk'. +# +# DRV_OBJ_S +# DRV_OBJ_M A list of driver objects (for single object and multiple +# object builds, respectively). Set up cumulatively in +# `src//rules.mk'. +# +# CLEAN +# DISTCLEAN The sub-makefiles can append additional stuff to these two +# variables which is to be removed for the `clean' resp. +# `distclean' target. +# +# TOP, SEP, +# LIBRARY, CC, +# A, I, O, T Check `config.mk' for details. + + +# The targets `objects' and `library' are defined at the end of this +# Makefile after all other rules have been included. +# +.PHONY: single objects library + +# default target -- build single objects and library +# +single: objects library + +# `multi' target -- build multiple objects and library +# +multi: objects library + + +# The FreeType source directory, usually `./src'. +# +SRC := $(TOP)$(SEP)src + + +# The directory where the base layer components are placed, usually +# `./src/base'. +# +BASE_DIR := $(SRC)$(SEP)base + + +# A few short-cuts in order to avoid typing $(SEP) all the time for the +# directory separator. +# +# For example: $(SRC_) equals to `./src/' where `.' is $(TOP). +# +# +SRC_ := $(SRC)$(SEP) +BASE_ := $(BASE_DIR)$(SEP) +OBJ_ := $(OBJ_DIR)$(SEP) +LIB_ := $(LIB_DIR)$(SEP) +PUBLIC_ := $(TOP)$(SEP)include$(SEP)freetype$(SEP) +INTERNAL_ := $(PUBLIC_)internal$(SEP) +CONFIG_ := $(PUBLIC_)config$(SEP) +CACHE_ := $(PUBLIC_)cache$(SEP) + + +# The final name of the library file. +# +PROJECT_LIBRARY := $(LIB_)$(LIBRARY).$A + + +# include paths +# +# IMPORTANT NOTE: The architecture-dependent directory must ALWAYS be placed +# in front of the include list. Porters are then able to +# put their own version of some of the FreeType components +# in the `freetype/builds/' directory, as these +# files will override the default sources. +# +INCLUDES := $(BUILD) $(TOP)$(SEP)include $(SRC) + +INCLUDE_FLAGS = $(INCLUDES:%=$I%) + + +# C flags used for the compilation of an object file. This must include at +# least the paths for the `base' and `builds/' directories; +# debug/optimization/warning flags + ansi compliance if needed. +# +FT_CFLAGS = $(CFLAGS) $(INCLUDE_FLAGS) +FT_CC = $(CC) $(FT_CFLAGS) +FT_COMPILE = $(CC) $(ANSIFLAGS) $(FT_CFLAGS) + + +# Include the `modules' rules file. +# +include $(TOP)/builds/modules.mk + + +# Initialize the list of objects. +# +OBJECTS_LIST := + + +# Define $(PUBLIC_H) as the list of all public header files located in +# `$(TOP)/include/freetype'. $(BASE_H), $(CACHE_H), and $(CONFIG_H) are +# defined similarly. +# +# This is used to simplify the dependency rules -- if one of these files +# changes, the whole library is recompiled. +# +PUBLIC_H := $(wildcard $(PUBLIC_)*.h) +BASE_H := $(wildcard $(INTERNAL_)*.h) +CONFIG_H := $(wildcard $(CONFIG_)*.h) \ + $(wildcard $(BUILD)$(SEP)freetype$(SEP)config$(SEP)*.h) +CACHE_H := $(wildcard $(CACHE_)*.h) + +FREETYPE_H := $(PUBLIC_H) $(BASE_H) $(CONFIG_H) $(CACHE_H) + + +# ftsystem component +# +ifndef FTSYS_SRC + FTSYS_SRC = $(BASE_)ftsystem.c +endif + +FTSYS_OBJ = $(OBJ_)ftsystem.$O + +OBJECTS_LIST += $(FTSYS_OBJ) + +$(FTSYS_OBJ): $(FTSYS_SRC) $(FREETYPE_H) + $(FT_COMPILE) $T$@ $< + + +# ftdebug component +# +ifndef FTDEBUG_SRC + FTDEBUG_SRC = $(BASE_)ftdebug.c +endif + +FTDEBUG_OBJ = $(OBJ_)ftdebug.$O + +OBJECTS_LIST += $(FTDEBUG_OBJ) + +$(FTDEBUG_OBJ): $(FTDEBUG_SRC) $(FREETYPE_H) + $(FT_COMPILE) $T$@ $< + + +# Include all rule files from FreeType components. +# +include $(wildcard $(SRC)/*/rules.mk) + + +# ftinit component +# +# The C source `ftinit.c' contains the FreeType initialization routines. +# It is able to automatically register one or more drivers when the API +# function FT_Init_FreeType() is called. +# +# The set of initial drivers is determined by the driver Makefiles +# includes above. Each driver Makefile updates the FTINIT_xxx lists +# which contain additional include paths and macros used to compile the +# single `ftinit.c' source. +# +FTINIT_SRC := $(BASE_)ftinit.c +FTINIT_OBJ := $(OBJ_)ftinit.$O + +OBJECTS_LIST += $(FTINIT_OBJ) + +$(FTINIT_OBJ): $(FTINIT_SRC) $(FREETYPE_H) $(FT_MODULE_LIST) + $(FT_COMPILE) $T$@ $< + + +# All FreeType library objects +# +# By default, we include the base layer extensions. These could be +# omitted on builds which do not want them. +# +OBJ_M = $(BASE_OBJ_M) $(BASE_EXT_OBJ) $(DRV_OBJS_M) +OBJ_S = $(BASE_OBJ_S) $(BASE_EXT_OBJ) $(DRV_OBJS_S) + + +# The target `multi' on the Make command line indicates that we want to +# compile each source file independently. +# +# Otherwise, each module/driver is compiled in a single object file through +# source file inclusion (see `src/base/ftbase.c' or +# `src/truetype/truetype.c' for examples). +# +BASE_OBJECTS := $(OBJECTS_LIST) + +ifneq ($(findstring multi,$(MAKECMDGOALS)),) + OBJECTS_LIST += $(OBJ_M) +else + OBJECTS_LIST += $(OBJ_S) +endif + +objects: $(OBJECTS_LIST) + +library: $(PROJECT_LIBRARY) + +.c.$O: + $(FT_COMPILE) $T$@ $< + + +# Standard cleaning and distclean rules. These are not accepted +# on all systems though. +# +clean_project_std: + -$(DELETE) $(BASE_OBJECTS) $(OBJ_M) $(OBJ_S) $(CLEAN) + +distclean_project_std: clean_project_std + -$(DELETE) $(PROJECT_LIBRARY) + -$(DELETE) *.orig *~ core *.core $(DISTCLEAN) + +# The Dos command shell does not support very long list of arguments, so +# we are stuck with wildcards. +# +clean_project_dos: + -$(DELETE) $(subst $(SEP),$(HOSTSEP),$(OBJ_))*.$O \ + $(CLEAN) $(NO_OUTPUT) + +distclean_project_dos: clean_project_dos + -$(DELETE) $(subst $(SEP),$(HOSTSEP),$(PROJECT_LIBRARY)) \ + $(DISTCLEAN) $(NO_OUTPUT) + +# Remove configuration file (used for distclean). +# +remove_config_mk: + -$(DELETE) $(subst $(SEP),$(HOSTSEP),$(CONFIG_MK)) $(NO_OUTPUT) + + +# The `config.mk' file must define `clean_freetype' and +# `distclean_freetype'. Implementations may use to relay these to either +# the `std' or `dos' versions from above, or simply provide their own +# implementation. +# +clean: clean_project +distclean: distclean_project remove_config_mk + +# EOF Index: xc/extras/freetype2/builds/link_dos.mk diff -u /dev/null xc/extras/freetype2/builds/link_dos.mk:1.1.1.1 --- /dev/null Mon Dec 18 14:22:17 2000 +++ xc/extras/freetype2/builds/link_dos.mk Fri Dec 8 16:26:05 2000 @@ -0,0 +1,39 @@ +# +# Link instructions for Dos-like systems (Dos, Win32, OS/2) +# + + +# Copyright 1996-2000 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +ifdef BUILD_PROJECT + + # Now include the main sub-makefile. It contains all the rules used to + # build the library with the previous variables defined. + # + include $(TOP)/builds/$(PROJECT).mk + + # The cleanup targets. + # + clean_project: clean_project_dos + distclean_project: distclean_project_dos + + # This final rule is used to link all object files into a single library. + # this is compiler-specific + # + $(PROJECT_LIBRARY): $(OBJECTS_LIST) + ifdef CLEAN_LIBRARY + -$(CLEAN_LIBRARY) $(NO_OUTPUT) + endif + $(LINK_LIBRARY) + +endif + +# EOF Index: xc/extras/freetype2/builds/link_std.mk diff -u /dev/null xc/extras/freetype2/builds/link_std.mk:1.1.1.1 --- /dev/null Mon Dec 18 14:22:17 2000 +++ xc/extras/freetype2/builds/link_std.mk Fri Dec 8 16:26:05 2000 @@ -0,0 +1,39 @@ +# +# Link instructions for standard systems +# + + +# Copyright 1996-2000 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +ifdef BUILD_PROJECT + + # Now include the main sub-makefile. It contains all the rules used to + # build the library with the previous variables defined. + # + include $(TOP)/builds/$(PROJECT).mk + + # The cleanup targets. + # + clean_project: clean_project_std + distclean_project: distclean_project_std + + # This final rule is used to link all object files into a single library. + # this is compiler-specific + # + $(PROJECT_LIBRARY): $(OBJECTS_LIST) + ifdef CLEAN_LIBRARY + -$(CLEAN_LIBRARY) $(NO_OUTPUT) + endif + $(LINK_LIBRARY) + +endif + +# EOF Index: xc/extras/freetype2/builds/modules.mk diff -u /dev/null xc/extras/freetype2/builds/modules.mk:1.1.1.1 --- /dev/null Mon Dec 18 14:22:17 2000 +++ xc/extras/freetype2/builds/modules.mk Fri Dec 8 16:26:05 2000 @@ -0,0 +1,76 @@ +# +# FreeType 2 modules sub-Makefile +# + + +# 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. + + +# 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. + +.PHONY: make_module_list clean_module_list remake_module_list + +# MODULE_LIST, as its name suggests, indicates where the modules list +# resides. For now, it is in `include/freetype/config/ftmodule.h'. +# +ifndef MODULE_LIST + MODULE_LIST := $(TOP)$(SEP)include$(SEP)$(PROJECT)$(SEP)config$(SEP)ftmodule.h +endif + +# To build the modules list, we invoke the `make_module_list' target. +# +# This rule is commented out by default since FreeType comes already with +# a ftmodule.h file. +# +#$(MODULE_LIST): make_module_list + +# Before the modules list file can be generated, we must remove the file in +# order to `clean' the list. +# +clean_module_list: + @-$(DELETE) $(subst $(SEP),$(HOSTSEP),$(MODULE_LIST)) + @-echo Regenerating the modules list in $(MODULE_LIST)... + +make_module_list: clean_module_list + @echo done. + + +# Trailing spaces are protected with a `#' sign to avoid accidental +# removing. +# +ifneq ($(findstring $(PLATFORM),dos win32 win16 os2),) + OPEN_MODULE := @echo # + CLOSE_MODULE := >> $(subst $(SEP),$(HOSTSEP),$(MODULE_LIST)) +else + OPEN_MODULE := @echo " + CLOSE_MODULE := " >> $(MODULE_LIST) +endif + +# $(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: # +ECHO_DRIVER_DESC := ( +ECHO_DRIVER_DONE := )" + +# Each `module.mk' in the `src' sub-dirs is used to add one rule to the +# target `make_module_list'. +# +include $(wildcard $(TOP)/src/*/module.mk) + +# EOF Index: xc/extras/freetype2/builds/toplevel.mk diff -u /dev/null xc/extras/freetype2/builds/toplevel.mk:1.1.1.1 --- /dev/null Mon Dec 18 14:22:17 2000 +++ xc/extras/freetype2/builds/toplevel.mk Fri Dec 8 16:26:05 2000 @@ -0,0 +1,124 @@ +# +# FreeType build system -- top-level sub-Makefile +# + + +# 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. + + +# 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 will include the rules +# found in `PROJECT/builds/detect.mk'. They are in charge of detecting +# the current platform. +# +# A summary of the detection will be displayed, and the file `config.mk' +# will be created in the current directory. +# +# - When invoked later, this Makefile will include the rules found in +# `config.mk'. This sub-Makefile will define some system-specific +# variables (like compiler, compilation flags, object suffix, etc.), then +# include 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: setup distclean + +# The `space' variable is used to avoid trailing spaces in defining the +# `T' variable later. +# +empty := +space := $(empty) $(empty) + + +ifndef CONFIG_MK + CONFIG_MK := config.mk +endif + +# 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). + +# 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: setup + + ifdef USE_MODULES + # If the module list $(MODULE_LIST) file is not present, generate it. + # + #modules: make_module_list setup + endif + + include $(TOP)/builds/detect.mk + + ifdef USE_MODULES + include $(TOP)/builds/modules.mk + + ifeq ($(wildcard $(MODULE_LIST)),) + setup: make_module_list + endif + endif + + # 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. + # + 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 + + # 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 + + ifdef USE_MODULES + modules: make_module_list + endif + + BUILD_PROJECT := yes + include $(CONFIG_MK) + +endif # test check_platform + +# EOF Index: xc/extras/freetype2/builds/ansi/ansi-def.mk diff -u /dev/null xc/extras/freetype2/builds/ansi/ansi-def.mk:1.1.1.1 --- /dev/null Mon Dec 18 14:22:17 2000 +++ xc/extras/freetype2/builds/ansi/ansi-def.mk Fri Dec 8 16:26:05 2000 @@ -0,0 +1,118 @@ +# +# FreeType 2 configuration rules for a `normal' ANSI system +# + + +# Copyright 1996-2000 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +ifndef TOP + TOP := . +endif + +DELETE := rm -f +SEP := / +HOSTSEP := $(SEP) +BUILD := $(TOP)/builds/ansi +PLATFORM := ansi + + +# The directory where all object files are placed. +# +# This lets you build the library in your own directory with something like +# +# set TOP=.../path/to/freetype2/top/dir... +# set OBJ_DIR=.../path/to/obj/dir +# make -f $TOP/Makefile setup [options] +# make -f $TOP/Makefile +# +ifndef OBJ_DIR + OBJ_DIR := $(TOP)$(SEP)obj +endif + + +# The directory where all library files are placed. +# +# By default, this is the same as $(OBJ_DIR); however, this can be changed +# to suit particular needs. +# +LIB_DIR := $(OBJ_DIR) + + +# The name of the final library file. Note that the DOS-specific Makefile +# uses a shorter (8.3) name. +# +LIBRARY := lib$(PROJECT) + + +# Path inclusion flag. Some compilers use a different flag than `-I' to +# specify an additional include path. Examples are `/i=' or `-J'. +# +I := -I + + +# C flag used to define a macro before the compilation of a given source +# object. Usually it is `-D' like in `-DDEBUG'. +# +D := -D + + +# The link flag used to specify a given library file on link. Note that +# this is only used to compile the demo programs, not the library itself. +# +L := -l + + +# Target flag. +# +T := -o$(space) + + +# C flags +# +# These should concern: debug output, optimization & warnings. +# +# Use the ANSIFLAGS variable to define the compiler flags used to enfore +# ANSI compliance. +# +ifndef CFLAGS + CFLAGS := -c +endif + +# ANSIFLAGS: Put there the flags used to make your compiler ANSI-compliant. +# +ANSIFLAGS := + + +ifdef BUILD_PROJECT + + # Now include the main sub-makefile. It contains all the rules used to + # build the library with the previous variables defined. + # + include $(TOP)/builds/$(PROJECT).mk + + # The cleanup targets. + # + clean_project: clean_project_std + distclean_project: distclean_project_std + + # This final rule is used to link all object files into a single library. + # 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) + -$(CLEAN_LIBRARY) $(NO_OUTPUT) + $(LINK_LIBRARY) + +endif + +# EOF Index: xc/extras/freetype2/builds/ansi/ansi.mk diff -u /dev/null xc/extras/freetype2/builds/ansi/ansi.mk:1.1.1.1 --- /dev/null Mon Dec 18 14:22:17 2000 +++ xc/extras/freetype2/builds/ansi/ansi.mk Fri Dec 8 16:26:05 2000 @@ -0,0 +1,19 @@ +# +# FreeType 2 configuration rules for a `normal' pseudo ANSI compiler/system +# + + +# Copyright 1996-2000 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +include $(TOP)/builds/compiler/ansi-cc.mk +include $(TOP)/builds/ansi/ansi-def.mk + +# EOF Index: xc/extras/freetype2/builds/compiler/ansi-cc.mk diff -u /dev/null xc/extras/freetype2/builds/compiler/ansi-cc.mk:1.1.1.1 --- /dev/null Mon Dec 18 14:22:17 2000 +++ xc/extras/freetype2/builds/compiler/ansi-cc.mk Fri Dec 8 16:26:05 2000 @@ -0,0 +1,82 @@ +# +# FreeType 2 generic pseudo ANSI compiler +# + + +# 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. + + +# Compiler command line name +# +CC := cc + +# The object file extension (for standard and static libraries). This can be +# .o, .tco, .obj, etc., depending on the platform. +# +O := o +SO := o + +# The library file extension (for standard and static libraries). This can +# be .a, .lib, etc., depending on the platform. +# +A := a +SA := a + + +# Path inclusion flag. Some compilers use a different flag than `-I' to +# specify an additional include path. Examples are `/i=' or `-J'. +# +I := -I + + +# C flag used to define a macro before the compilation of a given source +# object. Usually it is `-D' like in `-DDEBUG'. +# +D := -D + + +# The link flag used to specify a given library file on link. Note that +# this is only used to compile the demo programs, not the library itself. +# +L := -l + + +# Target flag. +# +T := -o$(space) + + +# C flags +# +# These should concern: debug output, optimization & warnings. +# +# Use the ANSIFLAGS variable to define the compiler flags used to enfore +# ANSI compliance. +# +ifndef CFLAGS + CFLAGS := -c +endif + +# ANSIFLAGS: Put there the flags used to make your compiler ANSI-compliant. +# +# we assume the compiler is already strictly ANSI +# +ANSIFLAGS := + + +# Library linking +# +ifndef CLEAN_LIBRARY + CLEAN_LIBRARY = $(DELETE) $(subst $(SEP),$(HOSTSEP),$(PROJECT_LIBRARY)) \ + $(NO_OUTPUT) +endif +LINK_LIBRARY = $(AR) -r $@ $(OBJECTS_LIST) + +# EOF Index: xc/extras/freetype2/builds/compiler/bcc-dev.mk diff -u /dev/null xc/extras/freetype2/builds/compiler/bcc-dev.mk:1.1.1.1 --- /dev/null Mon Dec 18 14:22:17 2000 +++ xc/extras/freetype2/builds/compiler/bcc-dev.mk Fri Dec 8 16:26:05 2000 @@ -0,0 +1,81 @@ +# +# FreeType 2 Borland C++-specific with NO OPTIMIZATIONS + DEBUGGING +# + + +# 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. + + +# Compiler command line name +# +CC := bcc32 + +# The object file extension (for standard and static libraries). This can be +# .o, .tco, .obj, etc., depending on the platform. +# +O := obj +SO := obj + +# The library file extension (for standard and static libraries). This can +# be .a, .lib, etc., depending on the platform. +# +A := lib +SA := lib + + +# Path inclusion flag. Some compilers use a different flag than `-I' to +# specify an additional include path. Examples are `/i=' or `-J'. +# +I := -I + + +# C flag used to define a macro before the compilation of a given source +# object. Usually it is `-D' like in `-DDEBUG'. +# +D := -D + + +# The link flag used to specify a given library file on link. Note that +# this is only used to compile the demo programs, not the library itself. +# +L := + + +# Target flag -- no trailing space. +# +T := -o + + +# C flags +# +# These should concern: debug output, optimization & warnings. +# +# Use the ANSIFLAGS variable to define the compiler flags used to enfore +# ANSI compliance. +# +ifndef CFLAGS + CFLAGS := -c -y -d -v -Od -w-par -w-ccc -w-rch -w-pro -w-aus +endif + +# ANSIFLAGS: Put there the flags used to make your compiler ANSI-compliant. +# +ANSIFLAGS := -A + + +# Library linking +# +ifndef CLEAN_LIBRARY + CLEAN_LIBRARY = $(DELETE) $(subst $(SEP),$(HOSTSEP),$(PROJECT_LIBRARY)) \ + $(NO_OUTPUT) +endif +TARGET_OBJECTS = $(subst $(SEP),\\,$(OBJECTS_LIST)) +LINK_LIBRARY = tlib /u $(subst $(SEP),\\,$@) $(TARGET_OBJECTS:%=+%) + +# EOF Index: xc/extras/freetype2/builds/compiler/bcc.mk diff -u /dev/null xc/extras/freetype2/builds/compiler/bcc.mk:1.1.1.1 --- /dev/null Mon Dec 18 14:22:17 2000 +++ xc/extras/freetype2/builds/compiler/bcc.mk Fri Dec 8 16:26:05 2000 @@ -0,0 +1,81 @@ +# +# FreeType 2 Borland C++-specific rules +# + + +# 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. + + +# Compiler command line name +# +CC := bcc32 + +# The object file extension (for standard and static libraries). This can be +# .o, .tco, .obj, etc., depending on the platform. +# +O := obj +SO := obj + +# The library file extension (for standard and static libraries). This can +# be .a, .lib, etc., depending on the platform. +# +A := lib +SA := lib + + +# Path inclusion flag. Some compilers use a different flag than `-I' to +# specify an additional include path. Examples are `/i=' or `-J'. +# +I := -I + + +# C flag used to define a macro before the compilation of a given source +# object. Usually it is `-D' like in `-DDEBUG'. +# +D := -D + + +# The link flag used to specify a given library file on link. Note that +# this is only used to compile the demo programs, not the library itself. +# +L := + + +# Target flag -- no trailing space. +# +T := -o + + +# C flags +# +# These should concern: debug output, optimization & warnings. +# +# Use the ANSIFLAGS variable to define the compiler flags used to enfore +# ANSI compliance. +# +ifndef CFLAGS + CFLAGS := -c -q -y -d -v -Od -w-par -w-ccc -w-rch -w-pro -w-aus +endif + +# ANSIFLAGS: Put there the flags used to make your compiler ANSI-compliant. +# +ANSIFLAGS := -A + + +# Library linking +# +ifndef CLEAN_LIBRARY + CLEAN_LIBRARY = $(DELETE) $(subst $(SEP),$(HOSTSEP),$(PROJECT_LIBRARY)) \ + $(NO_OUTPUT) +endif +TARGET_OBJECTS = $(subst $(SEP),\\,$(OBJECTS_LIST)) +LINK_LIBRARY = tlib /u $(subst $(SEP),\\,$@) $(TARGET_OBJECTS:%=+%) + +# EOF Index: xc/extras/freetype2/builds/compiler/gcc-dev.mk diff -u /dev/null xc/extras/freetype2/builds/compiler/gcc-dev.mk:1.1.1.1 --- /dev/null Mon Dec 18 14:22:17 2000 +++ xc/extras/freetype2/builds/compiler/gcc-dev.mk Fri Dec 8 16:26:06 2000 @@ -0,0 +1,89 @@ +# +# FreeType 2 gcc-specific with NO OPTIMIZATIONS + DEBUGGING +# + + +# 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. + + +# Compiler command line name +# +CC := gcc + +# The object file extension (for standard and static libraries). This can be +# .o, .tco, .obj, etc., depending on the platform. +# +O := o +SO := o + +# The library file extension (for standard and static libraries). This can +# be .a, .lib, etc., depending on the platform. +# +A := a +SA := a + + +# Path inclusion flag. Some compilers use a different flag than `-I' to +# specify an additional include path. Examples are `/i=' or `-J'. +# +I := -I + + +# C flag used to define a macro before the compilation of a given source +# object. Usually it is `-D' like in `-DDEBUG'. +# +D := -D + + +# The link flag used to specify a given library file on link. Note that +# this is only used to compile the demo programs, not the library itself. +# +L := -l + + +# Target flag. +# +T := -o$(space) + + +# C flags +# +# These should concern: debug output, optimization & warnings. +# +# Use the ANSIFLAGS variable to define the compiler flags used to enfore +# ANSI compliance. +# +ifndef CFLAGS + CFLAGS := -c -g -O0 \ + -Wall \ + -W \ + -Wundef \ + -Wshadow \ + -Wpointer-arith \ + -Wwrite-strings \ + -Wstrict-prototypes \ + -Wredundant-decls \ + -Wnested-externs +endif + +# ANSIFLAGS: Put there the flags used to make your compiler ANSI-compliant. +# +ANSIFLAGS := -ansi -pedantic + + +# Library linking +# +ifndef CLEAN_LIBRARY + CLEAN_LIBRARY = $(DELETE) $(subst $(SEP),$(HOSTSEP),$(PROJECT_LIBRARY)) \ + $(NO_OUTPUT) +endif +LINK_LIBRARY = $(AR) -r $@ $(OBJECTS_LIST) + +# EOF Index: xc/extras/freetype2/builds/compiler/gcc.mk diff -u /dev/null xc/extras/freetype2/builds/compiler/gcc.mk:1.1.1.1 --- /dev/null Mon Dec 18 14:22:17 2000 +++ xc/extras/freetype2/builds/compiler/gcc.mk Fri Dec 8 16:26:06 2000 @@ -0,0 +1,80 @@ +# +# FreeType 2 gcc-specific definitions +# + + +# 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. + + +# Compiler command line name +# +CC := gcc + +# The object file extension (for standard and static libraries). This can be +# .o, .tco, .obj, etc., depending on the platform. +# +O := o +SO := o + +# The library file extension (for standard and static libraries). This can +# be .a, .lib, etc., depending on the platform. +# +A := a +SA := a + + +# Path inclusion flag. Some compilers use a different flag than `-I' to +# specify an additional include path. Examples are `/i=' or `-J'. +# +I := -I + + +# C flag used to define a macro before the compilation of a given source +# object. Usually it is `-D' like in `-DDEBUG'. +# +D := -D + + +# The link flag used to specify a given library file on link. Note that +# this is only used to compile the demo programs, not the library itself. +# +L := -l + + +# Target flag. +# +T := -o$(space) + + +# C flags +# +# These should concern: debug output, optimization & warnings. +# +# Use the ANSIFLAGS variable to define the compiler flags used to enfore +# ANSI compliance. +# +ifndef CFLAGS + CFLAGS := -c -g -O6 -Wall +endif + +# ANSIFLAGS: Put there the flags used to make your compiler ANSI-compliant. +# +ANSIFLAGS := -ansi -pedantic + + +# Library linking +# +ifndef CLEAN_LIBRARY + CLEAN_LIBRARY = $(DELETE) $(subst $(SEP),$(HOSTSEP),$(PROJECT_LIBRARY)) \ + $(NO_OUTPUT) +endif +LINK_LIBRARY = $(AR) -r $@ $(OBJECTS_LIST) + +# EOF Index: xc/extras/freetype2/builds/compiler/unix-lcc.mk diff -u /dev/null xc/extras/freetype2/builds/compiler/unix-lcc.mk:1.1.1.1 --- /dev/null Mon Dec 18 14:22:17 2000 +++ xc/extras/freetype2/builds/compiler/unix-lcc.mk Fri Dec 8 16:26:06 2000 @@ -0,0 +1,86 @@ +# +# FreeType 2 Unix LCC specific definitions +# + + +# 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. + + +# Command line name +# +CC := lcc + + +# The object file extension (for standard and static libraries). This can be +# .o, .tco, .obj, etc., depending on the platform. +# +O := o +SO := o + + +# The library file extension (for standard and static libraries). This can +# be .a, .lib, etc., depending on the platform. +# +A := a +SA := a + + +# Path inclusion flag. Some compilers use a different flag than `-I' to +# specify an additional include path. Examples are `/i=' or `-J'. +# +I := -I + + +# C flag used to define a macro before the compilation of a given source +# object. Usually it is `-D' like in `-DDEBUG'. +# +D := -D + + +# The link flag used to specify a given library file on link. Note that +# this is only used to compile the demo programs, not the library itself. +# +L := -l + + +# Target flag. +# +T := -o$(space) + + +# C flags +# +# These should concern: debug output, optimization & warnings. +# +# Use the ANSIFLAGS variable to define the compiler flags used to enfore +# ANSI compliance. +# +ifndef CFLAGS + CFLAGS := -c -g +endif + +# ANSIFLAGS: Put there the flags used to make your compiler ANSI-compliant. +# +# LCC is pure ANSI anyway! +# +# the "-A" flag simply increments verbosity about non ANSI code +# +ANSIFLAGS := -A + + +# library linking +# +ifndef CLEAN_LIBRARY + CLEAN_LIBRARY = $(DELETE) $(subst $(SEP),$(HOSTSEP),$(PROJECT_LIBRARY)) \ + $(NO_OUTPUT) +endif +LINK_LIBRARY = $(AR) -r $@ $(OBJECTS_LIST) + +# EOF Index: xc/extras/freetype2/builds/compiler/visualage.mk diff -u /dev/null xc/extras/freetype2/builds/compiler/visualage.mk:1.1.1.1 --- /dev/null Mon Dec 18 14:22:17 2000 +++ xc/extras/freetype2/builds/compiler/visualage.mk Fri Dec 8 16:26:06 2000 @@ -0,0 +1,76 @@ +# +# FreeType 2 Visual Age C++ specific definitions +# + + +# 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. + + +# command line compiler name +# +CC := icc + + +# The object file extension (for standard and static libraries). This can be +# .o, .tco, .obj, etc., depending on the platform. +# +O := obj +SO := obj + + +# The library file extension (for standard and static libraries). This can +# be .a, .lib, etc., depending on the platform. +# +A := lib +SA := lib + + +# Path inclusion flag. Some compilers use a different flag than `-I' to +# specify an additional include path. Examples are `/i=' or `-J'. +# +I := /I + + +# C flag used to define a macro before the compilation of a given source +# object. Usually it is `-D' like in `-DDEBUG'. +# +D := /D + + +# The link flag used to specify a given library file on link. Note that +# this is only used to compile the demo programs, not the library itself. +# +L := /Fl + + +# Target flag. +# +T := /Fo + + +# C flags +# +# These should concern: debug output, optimization & warnings. +# +ifndef CFLAGS + CFLAGS := /Q- /Gd+ /O2 /G5 /W3 /C +endif + +# ANSIFLAGS: Put there the flags used to make your compiler ANSI-compliant. +# +ANSI_FLAGS := /Sa + + +# Library linking +# +#CLEAN_LIBRARY := +LINK_LIBRARY = lib /nologo /out:$@ $(OBJECTS_LIST) + +# EOF Index: xc/extras/freetype2/builds/compiler/visualc.mk diff -u /dev/null xc/extras/freetype2/builds/compiler/visualc.mk:1.1.1.1 --- /dev/null Mon Dec 18 14:22:17 2000 +++ xc/extras/freetype2/builds/compiler/visualc.mk Fri Dec 8 16:26:06 2000 @@ -0,0 +1,78 @@ +# +# FreeType 2 Visual C++ definitions +# + + +# 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. + + +# compiler command line name +# +CC := cl + + +# The object file extension (for standard and static libraries). This can be +# .o, .tco, .obj, etc., depending on the platform. +# +O := obj +SO := obj + + +# The library file extension (for standard and static libraries). This can +# be .a, .lib, etc., depending on the platform. +# +A := lib +SA := lib + + +# Path inclusion flag. Some compilers use a different flag than `-I' to +# specify an additional include path. Examples are `/i=' or `-J'. +# +I := /I + + +# C flag used to define a macro before the compilation of a given source +# object. Usually it is `-D' like in `-DDEBUG'. +# +D := /D + + +# The link flag used to specify a given library file on link. Note that +# this is only used to compile the demo programs, not the library itself. +# +L := /Fl + + +# Target flag. +# +T := /Fo + + +# C flags +# +# These should concern: debug output, optimization & warnings. +# +# Use the ANSIFLAGS variable to define the compiler flags used to enfore +# ANSI compliance. +# +ifndef CFLAGS + CFLAGS := /nologo /c /Ox /G5 /W3 /WX +endif + +# ANSIFLAGS: Put there the flags used to make your compiler ANSI-compliant. +# +ANSIFLAGS := /Za + +# Library linking +# +#CLEAN_LIBRARY = +LINK_LIBRARY = lib /nologo /out:$@ $(OBJECTS_LIST) + +# EOF Index: xc/extras/freetype2/builds/compiler/win-lcc.mk diff -u /dev/null xc/extras/freetype2/builds/compiler/win-lcc.mk:1.1.1.1 --- /dev/null Mon Dec 18 14:22:17 2000 +++ xc/extras/freetype2/builds/compiler/win-lcc.mk Fri Dec 8 16:26:06 2000 @@ -0,0 +1,81 @@ +# +# FreeType 2 Win32-LCC specific definitions +# + + +# 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. + + +# Command line name +# +CC := lcc + + +# The object file extension (for standard and static libraries). This can be +# .o, .tco, .obj, etc., depending on the platform. +# +O := obj +SO := obj + + +# The library file extension (for standard and static libraries). This can +# be .a, .lib, etc., depending on the platform. +# +A := lib +SA := lib + + +# Path inclusion flag. Some compilers use a different flag than `-I' to +# specify an additional include path. Examples are `/i=' or `-J'. +# +I := -I + + +# C flag used to define a macro before the compilation of a given source +# object. Usually it is `-D' like in `-DDEBUG'. +# +D := -D + + +# The link flag used to specify a given library file on link. Note that +# this is only used to compile the demo programs, not the library itself. +# +L := -Fl + + +# Target flag. +# +T := -Fo + + +# C flags +# +# These should concern: debug output, optimization & warnings. +# +# Use the ANSIFLAGS variable to define the compiler flags used to enfore +# ANSI compliance. +# +ifndef CFLAGS + CFLAGS := -c -g2 -O +endif + +# ANSIFLAGS: Put there the flags used to make your compiler ANSI-compliant. +# +# LCC is pure ANSI anyway! +# +ANSIFLAGS := + + +# library linking +# +#CLEAN_LIBRARY := +LINK_LIBRARY = lcclib /out:$(subst $(SEP),\\,$@) $(subst $(SEP),\\,$(OBJECTS_LIST)) + +# EOF Index: xc/extras/freetype2/builds/cygwin/aclocal.m4 diff -u /dev/null xc/extras/freetype2/builds/cygwin/aclocal.m4:1.1.1.1 --- /dev/null Mon Dec 18 14:22:17 2000 +++ xc/extras/freetype2/builds/cygwin/aclocal.m4 Fri Dec 8 16:26:06 2000 @@ -0,0 +1,458 @@ +## FreeType specific autoconf tests + +AC_DEFUN(FT_MUNMAP_DECL, +[AC_MSG_CHECKING([whether munmap must be declared]) +AC_CACHE_VAL(ft_cv_munmap_decl, +[AC_TRY_COMPILE([ +#ifdef HAVE_UNISTD_H +#include +#endif +#include ], +[char *(*pfn) = (char *(*))munmap], +ft_cv_munmap_decl=no, +ft_cv_munmap_decl=yes)]) +AC_MSG_RESULT($ft_cv_munmap_decl) +if test $ft_cv_munmap_decl = yes; then + AC_DEFINE(NEED_MUNMAP_DECL) +fi]) + +AC_DEFUN(FT_MUNMAP_PARAM, +[AC_MSG_CHECKING([for munmap's first parameter type]) +AC_TRY_COMPILE([ +#include +#include +int munmap(void *, size_t);],, + AC_MSG_RESULT([void *]);AC_DEFINE(MUNMAP_USES_VOIDP), + AC_MSG_RESULT([char *])) +]) + +## libtool.m4 - Configure libtool for the target system. -*-Shell-script-*- +## Copyright (C) 1996-1999 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. + +# serial 40 AC_PROG_LIBTOOL +AC_DEFUN(AC_PROG_LIBTOOL, +[AC_REQUIRE([AC_LIBTOOL_SETUP])dnl + +# Save cache, so that ltconfig can load it +AC_CACHE_SAVE + +# Actually configure libtool. ac_aux_dir is where install-sh is found. +CC="$CC" CFLAGS="$CFLAGS" CPPFLAGS="$CPPFLAGS" \ +LD="$LD" LDFLAGS="$LDFLAGS" LIBS="$LIBS" \ +LN_S="$LN_S" NM="$NM" RANLIB="$RANLIB" \ +DLLTOOL="$DLLTOOL" AS="$AS" OBJDUMP="$OBJDUMP" \ +${CONFIG_SHELL-/bin/sh} $ac_aux_dir/ltconfig --no-reexec \ +$libtool_flags --no-verify $ac_aux_dir/ltmain.sh $lt_target \ +|| AC_MSG_ERROR([libtool configure failed]) + +# Reload cache, that may have been modified by ltconfig +AC_CACHE_LOAD + +# This can be used to rebuild libtool when needed +LIBTOOL_DEPS="$ac_aux_dir/ltconfig $ac_aux_dir/ltmain.sh" + +# Always use our own libtool. +LIBTOOL='$(SHELL) $(top_builddir)/libtool' +AC_SUBST(LIBTOOL)dnl + +# Redirect the config.log output again, so that the ltconfig log is not +# clobbered by the next message. +exec 5>>./config.log +]) + +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_RANLIB])dnl +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_PROG_LD])dnl +AC_REQUIRE([AC_PROG_NM])dnl +AC_REQUIRE([AC_PROG_LN_S])dnl +dnl + +case "$target" in +NONE) lt_target="$host" ;; +*) lt_target="$target" ;; +esac + +# Check for any special flags to pass to ltconfig. +libtool_flags="--cache-file=$cache_file" +test "$enable_shared" = no && libtool_flags="$libtool_flags --disable-shared" +test "$enable_static" = no && libtool_flags="$libtool_flags --disable-static" +test "$enable_fast_install" = no && libtool_flags="$libtool_flags --disable-fast-install" +test "$ac_cv_prog_gcc" = yes && libtool_flags="$libtool_flags --with-gcc" +test "$ac_cv_prog_gnu_ld" = yes && libtool_flags="$libtool_flags --with-gnu-ld" +ifdef([AC_PROVIDE_AC_LIBTOOL_DLOPEN], +[libtool_flags="$libtool_flags --enable-dlopen"]) +ifdef([AC_PROVIDE_AC_LIBTOOL_WIN32_DLL], +[libtool_flags="$libtool_flags --enable-win32-dll"]) +AC_ARG_ENABLE(libtool-lock, + [ --disable-libtool-lock avoid locking (might break parallel builds)]) +test "x$enable_libtool_lock" = xno && libtool_flags="$libtool_flags --disable-lock" +test x"$silent" = xyes && libtool_flags="$libtool_flags --silent" + +# Some flags need to be propagated to the compiler or linker for good +# libtool support. +case "$lt_target" in +*-*-irix6*) + # Find out which ABI we are using. + echo '[#]line __oline__ "configure"' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case "`/usr/bin/file conftest.o`" in + *32-bit*) + LD="${LD-ld} -32" + ;; + *N32*) + LD="${LD-ld} -n32" + ;; + *64-bit*) + LD="${LD-ld} -64" + ;; + esac + fi + rm -rf conftest* + ;; + +*-*-sco3.2v5*) + # On SCO OpenServer 5, we need -belf to get full-featured binaries. + SAVE_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -belf" + AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, + [AC_TRY_LINK([],[],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no])]) + 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*) + AC_CHECK_TOOL(DLLTOOL, dlltool, false) + AC_CHECK_TOOL(AS, as, false) + AC_CHECK_TOOL(OBJDUMP, objdump, false) + ;; +]) +esac +]) + +# 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, [dnl +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, [dnl +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, [dnl +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_ENABLE_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_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_prog=ld +if test "$ac_cv_prog_gcc" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + AC_MSG_CHECKING([for ld used by GCC]) + ac_prog=`($CC -print-prog-name=ld) 2>&5` + case "$ac_prog" in + # Accept absolute paths. +changequote(,)dnl + [\\/]* | [A-Za-z]:[\\/]*) + re_direlt='/[^/][^/]*/\.\./' +changequote([,])dnl + # 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(ac_cv_path_LD, +[if test -z "$LD"; then + IFS="${IFS= }"; ac_save_ifs="$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 + ac_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some GNU ld's only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + if "$ac_cv_path_LD" -v 2>&1 < /dev/null | egrep '(GNU|with BFD)' > /dev/null; then + test "$with_gnu_ld" != no && break + else + test "$with_gnu_ld" != yes && break + fi + fi + done + IFS="$ac_save_ifs" +else + ac_cv_path_LD="$LD" # Let the user override the test with a path. +fi]) +LD="$ac_cv_path_LD" +if test -n "$LD"; then + AC_MSG_RESULT($LD) +else + AC_MSG_RESULT(no) +fi +test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH]) +AC_PROG_LD_GNU +]) + +AC_DEFUN(AC_PROG_LD_GNU, +[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], ac_cv_prog_gnu_ld, +[# I'd rather use --version here, but apparently some GNU ld's only accept -v. +if $LD -v 2>&1 &5; then + ac_cv_prog_gnu_ld=yes +else + ac_cv_prog_gnu_ld=no +fi]) +]) + +# AC_PROG_NM - find the path to a BSD-compatible name lister +AC_DEFUN(AC_PROG_NM, +[AC_MSG_CHECKING([for BSD-compatible nm]) +AC_CACHE_VAL(ac_cv_path_NM, +[if test -n "$NM"; then + # Let the user override the test. + ac_cv_path_NM="$NM" +else + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}" + for ac_dir in $PATH /usr/ccs/bin /usr/ucb /bin; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/nm || test -f $ac_dir/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 + if ($ac_dir/nm -B /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then + ac_cv_path_NM="$ac_dir/nm -B" + break + elif ($ac_dir/nm -p /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then + ac_cv_path_NM="$ac_dir/nm -p" + break + else + ac_cv_path_NM=${ac_cv_path_NM="$ac_dir/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 "$ac_cv_path_NM" && ac_cv_path_NM=nm +fi]) +NM="$ac_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 "$lt_target" in +*-*-beos* | *-*-cygwin*) + # 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, adds --enable-ltdl-convenience to +# the configure arguments. Note that LIBLTDL is not AC_SUBSTed, nor +# is AC_CONFIG_SUBDIRS called. If DIR is not provided, it is assumed +# to be `${top_builddir}/libltdl'. Make sure you start DIR with +# '${top_builddir}/' (note the single quotes!) if your package is not +# flat, and, if you're not using automake, define top_builddir as +# appropriate 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=ifelse($#,1,$1,['${top_builddir}/libltdl'])/libltdlc.la + INCLTDL=ifelse($#,1,-I$1,['-I${top_builddir}/libltdl']) +]) + +# AC_LIBLTDL_INSTALLABLE[(dir)] - sets LIBLTDL to the link flags for +# the libltdl installable library, and adds --enable-ltdl-install to +# the configure arguments. Note that LIBLTDL is not AC_SUBSTed, nor +# is AC_CONFIG_SUBDIRS called. If DIR is not provided, it is assumed +# to be `${top_builddir}/libltdl'. Make sure you start DIR with +# '${top_builddir}/' (note the single quotes!) if your package is not +# flat, and, if you're not using automake, define top_builddir as +# appropriate 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=ifelse($#,1,$1,['${top_builddir}/libltdl'])/libltdl.la + INCLTDL=ifelse($#,1,-I$1,['-I${top_builddir}/libltdl']) + else + ac_configure_args="$ac_configure_args --enable-ltdl-install=no" + LIBLTDL="-lltdl" + INCLTDL= + fi +]) + +dnl old names +AC_DEFUN(AM_PROG_LIBTOOL, [indir([AC_PROG_LIBTOOL])])dnl +AC_DEFUN(AM_ENABLE_SHARED, [indir([AC_ENABLE_SHARED], $@)])dnl +AC_DEFUN(AM_ENABLE_STATIC, [indir([AC_ENABLE_STATIC], $@)])dnl +AC_DEFUN(AM_DISABLE_SHARED, [indir([AC_DISABLE_SHARED], $@)])dnl +AC_DEFUN(AM_DISABLE_STATIC, [indir([AC_DISABLE_STATIC], $@)])dnl +AC_DEFUN(AM_PROG_LD, [indir([AC_PROG_LD])])dnl +AC_DEFUN(AM_PROG_NM, [indir([AC_PROG_NM])])dnl + +dnl This is just to silence aclocal about the macro not being used +ifelse([AC_DISABLE_FAST_INSTALL])dnl Index: xc/extras/freetype2/builds/cygwin/config.guess diff -u /dev/null xc/extras/freetype2/builds/cygwin/config.guess:1.1.1.1 --- /dev/null Mon Dec 18 14:22:18 2000 +++ xc/extras/freetype2/builds/cygwin/config.guess Fri Dec 8 16:26:06 2000 @@ -0,0 +1,1284 @@ +#! /bin/sh +# Attempt to guess a canonical system name. +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000 +# Free Software Foundation, Inc. + +version='2000-07-27' + +# This file is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# Written by Per Bothner . +# Please send patches to . +# +# This script attempts to guess a canonical system name similar to +# config.sub. If it succeeds, it prints the system name on stdout, and +# exits with 0. Otherwise, it exits with 1. +# +# The plan is that this can be called by configure scripts if you +# don't specify an explicit system type (host/target name). +# +# Only a few systems have been added to this list; please add others +# (but try to keep the structure clean). +# + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] + +Output the configuration name of this system. + +Operation modes: + -h, --help print this help, then exit + -V, --version print version number, then exit" + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case "$1" in + --version | --vers* | -V ) + echo "$version" ; exit 0 ;; + --help | --h* | -h ) + echo "$usage"; exit 0 ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + exec >&2 + echo "$me: invalid option $1" + echo "$help" + exit 1 ;; + * ) + break ;; + esac +done + +if test $# != 0; then + echo "$me: too many arguments$help" >&2 + exit 1 +fi + +# Use $HOST_CC if defined. $CC may point to a cross-compiler +if test x"$CC_FOR_BUILD" = x; then + if test x"$HOST_CC" != x; then + CC_FOR_BUILD="$HOST_CC" + else + if test x"$CC" != x; then + CC_FOR_BUILD="$CC" + else + CC_FOR_BUILD=cc + fi + fi +fi + + +# This is needed to find uname on a Pyramid OSx when run in the BSD universe. +# (ghazi@noc.rutgers.edu 8/24/94.) +if (test -f /.attbin/uname) >/dev/null 2>&1 ; then + PATH=$PATH:/.attbin ; export PATH +fi + +UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown +UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown +UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown +UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown + +dummy=dummy-$$ +trap 'rm -f $dummy.c $dummy.o $dummy; exit 1' 1 2 15 + +# Note: order is significant - the case branches are not exclusive. + +case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in + *: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. + # Determine the machine/vendor (is the vendor relevant). + case "${UNAME_MACHINE}" in + amiga) machine=m68k-unknown ;; + arm32) machine=arm-unknown ;; + atari*) machine=m68k-atari ;; + sun3*) machine=m68k-sun ;; + mac68k) machine=m68k-apple ;; + macppc) machine=powerpc-apple ;; + hp3[0-9][05]) machine=m68k-hp ;; + ibmrt|romp-ibm) machine=romp-ibm ;; + *) machine=${UNAME_MACHINE}-unknown ;; + esac + # The Operating System including object format. + 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 + # The OS release + release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` + # 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 ;; + alpha:OSF1:*:*) + if test $UNAME_RELEASE = "V4.0"; then + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` + fi + # A Vn.n version is a released version. + # A Tn.n version is a released field test version. + # A Xn.n version is an unreleased experimental baselevel. + # 1.2 uses "1.2" for uname -r. + cat <$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 $dummy.s -o $dummy 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" + ;; + esac + fi + rm -f $dummy.s $dummy + 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;; + amiga:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + *:[Aa]miga[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-amigaos + exit 0 ;; + arc64:OpenBSD:*:*) + echo mips64el-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + arc:OpenBSD:*:*) + echo mipsel-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + hkmips:OpenBSD:*:*) + echo mips-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + pmax:OpenBSD:*:*) + echo mipsel-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + sgi:OpenBSD:*:*) + echo mips-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + wgrisc:OpenBSD:*:*) + echo mipsel-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + *: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:*:*) + 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 ;; + sun4H:SunOS:5.*:*) + echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit 0 ;; + sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) + echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit 0 ;; + i86pc:SunOS:5.*:*) + echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit 0 ;; + sun4*:SunOS:6*:*) + # According to config.sub, this is the proper way to canonicalize + # SunOS6. Hard to guess exactly what SunOS6 will be like, but + # it's likely to be more like Solaris than SunOS4. + echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit 0 ;; + sun4*:SunOS:*:*) + case "`/usr/bin/arch -k`" in + Series*|S4*) + UNAME_RELEASE=`uname -v` + ;; + esac + # Japanese Language versions have a version number like `4.1.3-JL'. + echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` + exit 0 ;; + sun3*:SunOS:*:*) + echo m68k-sun-sunos${UNAME_RELEASE} + exit 0 ;; + sun*:*:4.2BSD:*) + UNAME_RELEASE=`(head -1 /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` + test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 + case "`/bin/arch`" in + sun3) + echo m68k-sun-sunos${UNAME_RELEASE} + ;; + sun4) + echo sparc-sun-sunos${UNAME_RELEASE} + ;; + esac + exit 0 ;; + aushp:SunOS:*:*) + echo sparc-auspex-sunos${UNAME_RELEASE} + exit 0 ;; + atari*:OpenBSD:*:*) + echo m68k-unknown-openbsd${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 ;; + sun3*:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + mac68k:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + mvme68k:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + mvme88k:OpenBSD:*:*) + echo m88k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + powerpc:machten:*:*) + echo powerpc-apple-machten${UNAME_RELEASE} + exit 0 ;; + 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) + 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 $dummy.c -o $dummy \ + && ./$dummy `echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` \ + && rm $dummy.c $dummy && exit 0 + rm -f $dummy.c $dummy + echo mips-mips-riscos${UNAME_RELEASE} + exit 0 ;; + Night_Hawk:Power_UNIX:*:*) + echo powerpc-harris-powerunix + exit 0 ;; + m88k:CX/UX:7*:*) + echo m88k-harris-cxux7 + exit 0 ;; + m88k:*:4*:R4*) + echo m88k-motorola-sysv4 + exit 0 ;; + m88k:*:3*:R3*) + echo m88k-motorola-sysv3 + exit 0 ;; + AViiON:dgux:*:*) + # DG/UX returns AViiON for all architectures + UNAME_PROCESSOR=`/usr/bin/uname -p` + if [ $UNAME_PROCESSOR = mc88100 ] || [ $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 ;; + *:AIX:2:3) + if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then + sed 's/^ //' << EOF >$dummy.c + #include + + main() + { + if (!__power_pc()) + exit(1); + puts("powerpc-ibm-aix3.2.5"); + exit(0); + } +EOF + $CC_FOR_BUILD $dummy.c -o $dummy && ./$dummy && rm $dummy.c $dummy && exit 0 + rm -f $dummy.c $dummy + echo rs6000-ibm-aix3.2.5 + elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then + echo rs6000-ibm-aix3.2.4 + else + echo rs6000-ibm-aix3.2 + fi + exit 0 ;; + *:AIX:*:4) + IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | head -1 | awk '{ print $1 }'` + if /usr/sbin/lsattr -EHl ${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=4.${UNAME_RELEASE} + fi + echo ${IBM_ARCH}-ibm-aix${IBM_REV} + exit 0 ;; + *:AIX:*:*) + echo rs6000-ibm-aix + exit 0 ;; + ibmrt:4.4BSD:*|romp-ibm:BSD:*) + echo romp-ibm-bsd4.4 + exit 0 ;; + ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC 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:*:*) + case "${UNAME_MACHINE}" in + 9000/31? ) HP_ARCH=m68000 ;; + 9000/[34]?? ) HP_ARCH=m68k ;; + 9000/[678][0-9][0-9]) + 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 $dummy.c -o $dummy 2>/dev/null ) && HP_ARCH=`./$dummy` + rm -f $dummy.c $dummy + esac + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + echo ${HP_ARCH}-hp-hpux${HPUX_REV} + exit 0 ;; + 3050*:HI-UX:*:*) + sed 's/^ //' << EOF >$dummy.c + #include + 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 $dummy.c -o $dummy && ./$dummy && rm $dummy.c $dummy && exit 0 + rm -f $dummy.c $dummy + echo unknown-hitachi-hiuxwe2 + exit 0 ;; + 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) + echo hppa1.1-hp-bsd + exit 0 ;; + 9000/8??:4.3bsd:*:*) + echo hppa1.0-hp-bsd + exit 0 ;; + *9??*: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 ;; + hppa*:OpenBSD:*:*) + echo hppa-unknown-openbsd + exit 0 ;; + C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) + echo c1-convex-bsd + exit 0 ;; + C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit 0 ;; + C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) + echo c34-convex-bsd + exit 0 ;; + C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) + echo c38-convex-bsd + exit 0 ;; + C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) + echo c4-convex-bsd + exit 0 ;; + CRAY*X-MP:*:*:*) + echo xmp-cray-unicos + exit 0 ;; + CRAY*Y-MP:*:*:*) + echo ymp-cray-unicos${UNAME_RELEASE} + exit 0 ;; + CRAY*[A-Z]90:*:*:*) + echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ + | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ + -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ + exit 0 ;; + CRAY*TS:*:*:*) + echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit 0 ;; + CRAY*T3E:*:*:*) + echo alpha-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit 0 ;; + CRAY*SV1:*:*:*) + echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit 0 ;; + CRAY-2:*:*:*) + echo cray2-cray-unicos + exit 0 ;; + F300:UNIX_System_V:*:*) + FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` + echo "f300-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit 0 ;; + F301:UNIX_System_V:*:*) + echo f301-fujitsu-uxpv`echo $UNAME_RELEASE | sed 's/ .*//'` + exit 0 ;; + hp300:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + 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:*:*) + echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` + exit 0 ;; + *:OpenBSD:*:*) + echo ${UNAME_MACHINE}-unknown-openbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` + exit 0 ;; + i*:CYGWIN*:*) + echo ${UNAME_MACHINE}-pc-cygwin + exit 0 ;; + i*:MINGW*:*) + echo ${UNAME_MACHINE}-pc-mingw32 + 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 i386-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 ;; + *: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. + ld_help_string=`cd /; ld --help 2>&1` + ld_supported_emulations=`echo $ld_help_string \ + | sed -ne '/supported emulations:/!d + s/[ ][ ]*/ /g + s/.*supported emulations: *// + s/ .*// + p'` + case "$ld_supported_emulations" in + *ia64) + echo "${UNAME_MACHINE}-unknown-linux" + exit 0 + ;; + i?86linux) + echo "${UNAME_MACHINE}-pc-linux-gnuaout" + exit 0 + ;; + elf_i?86) + echo "${UNAME_MACHINE}-pc-linux" + exit 0 + ;; + i?86coff) + echo "${UNAME_MACHINE}-pc-linux-gnucoff" + exit 0 + ;; + sparclinux) + echo "${UNAME_MACHINE}-unknown-linux-gnuaout" + exit 0 + ;; + armlinux) + echo "${UNAME_MACHINE}-unknown-linux-gnuaout" + exit 0 + ;; + elf32arm*) + echo "${UNAME_MACHINE}-unknown-linux-gnuoldld" + exit 0 + ;; + armelf_linux*) + echo "${UNAME_MACHINE}-unknown-linux-gnu" + exit 0 + ;; + m68klinux) + echo "${UNAME_MACHINE}-unknown-linux-gnuaout" + exit 0 + ;; + elf32ppc | elf32ppclinux) + # Determine Lib Version + cat >$dummy.c < +#if defined(__GLIBC__) +extern char __libc_version[]; +extern char __libc_release[]; +#endif +main(argc, argv) + int argc; + char *argv[]; +{ +#if defined(__GLIBC__) + printf("%s %s\n", __libc_version, __libc_release); +#else + printf("unkown\n"); +#endif + return 0; +} +EOF + LIBC="" + $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null + if test "$?" = 0 ; then + ./$dummy | grep 1\.99 > /dev/null + if test "$?" = 0 ; then + LIBC="libc1" + fi + fi + rm -f $dummy.c $dummy + echo powerpc-unknown-linux-gnu${LIBC} + exit 0 + ;; + shelf_linux) + echo "${UNAME_MACHINE}-unknown-linux-gnu" + exit 0 + ;; + esac + + if test "${UNAME_MACHINE}" = "alpha" ; then + 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 + LIBC="" + $CC_FOR_BUILD $dummy.s -o $dummy 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" + ;; + esac + + objdump --private-headers $dummy | \ + grep ld.so.1 > /dev/null + if test "$?" = 0 ; then + LIBC="libc1" + fi + fi + rm -f $dummy.s $dummy + echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} ; exit 0 + elif test "${UNAME_MACHINE}" = "mips" ; then + cat >$dummy.c < /* for printf() prototype */ + int main (int argc, char *argv[]) { +#else + int main (argc, argv) int argc; char *argv[]; { +#endif +#ifdef __MIPSEB__ + printf ("%s-unknown-linux-gnu\n", argv[1]); +#endif +#ifdef __MIPSEL__ + printf ("%sel-unknown-linux-gnu\n", argv[1]); +#endif + return 0; +} +EOF + $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy "${UNAME_MACHINE}" && rm $dummy.c $dummy && exit 0 + rm -f $dummy.c $dummy + elif test "${UNAME_MACHINE}" = "s390"; then + echo s390-ibm-linux && exit 0 + else + # Either a pre-BFD a.out linker (linux-gnuoldld) + # or one that does not give us useful --help. + # GCC wants to distinguish between linux-gnuoldld and linux-gnuaout. + # If ld does not provide *any* "supported emulations:" + # that means it is gnuoldld. + echo "$ld_help_string" | grep >/dev/null 2>&1 "supported emulations:" + test $? != 0 && echo "${UNAME_MACHINE}-pc-linux-gnuoldld" && exit 0 + + case "${UNAME_MACHINE}" in + i?86) + VENDOR=pc; + ;; + *) + VENDOR=unknown; + ;; + esac + # Determine whether the default compiler is a.out or elf + cat >$dummy.c < +#ifdef __cplusplus +#include /* for printf() prototype */ + int main (int argc, char *argv[]) { +#else + int main (argc, argv) int argc; char *argv[]; { +#endif +#ifdef __ELF__ +# ifdef __GLIBC__ +# if __GLIBC__ >= 2 + printf ("%s-${VENDOR}-linux-gnu\n", argv[1]); +# else + printf ("%s-${VENDOR}-linux-gnulibc1\n", argv[1]); +# endif +# else + printf ("%s-${VENDOR}-linux-gnulibc1\n", argv[1]); +# endif +#else + printf ("%s-${VENDOR}-linux-gnuaout\n", argv[1]); +#endif + return 0; +} +EOF + $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy "${UNAME_MACHINE}" && rm $dummy.c $dummy && exit 0 + rm -f $dummy.c $dummy + fi ;; +# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. earlier versions +# are messed up and put the nodename in both sysname and nodename. + i?86:DYNIX/ptx:4*:*) + echo i386-sequent-sysv4 + exit 0 ;; + i?86:UNIX_SV:4.2MP:2.*) + # Unixware is an offshoot of SVR4, but it has its own version + # number series starting with 2... + # I am not positive that other SVR4 systems won't match this, + # I just have to hope. -- rms. + # Use sysv4.2uw... so that sysv4* matches it. + echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} + exit 0 ;; + i?86:*:4.*:* | i?86:SYSTEM_V:4.*:*) + 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:7*) + # Fixed at (any) Pentium or better + UNAME_MACHINE=i586 + if [ ${UNAME_SYSTEM} = "UnixWare" ] ; then + echo ${UNAME_MACHINE}-sco-sysv${UNAME_RELEASE}uw${UNAME_VERSION} + else + echo ${UNAME_MACHINE}-pc-sysv${UNAME_RELEASE} + fi + exit 0 ;; + i?86:*:3.2:*) + if test -f /usr/options/cb.name; then + UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then + UNAME_REL=`(/bin/uname -X|egrep Release|sed -e 's/.*= //')` + (/bin/uname -X|egrep i80486 >/dev/null) && UNAME_MACHINE=i486 + (/bin/uname -X|egrep '^Machine.*Pentium' >/dev/null) \ + && UNAME_MACHINE=i586 + (/bin/uname -X|egrep '^Machine.*Pent ?II' >/dev/null) \ + && UNAME_MACHINE=i686 + (/bin/uname -X|egrep '^Machine.*Pentium Pro' >/dev/null) \ + && UNAME_MACHINE=i686 + echo ${UNAME_MACHINE}-pc-sco$UNAME_REL + else + echo ${UNAME_MACHINE}-pc-sysv32 + fi + exit 0 ;; + i?86:*DOS:*:*) + echo ${UNAME_MACHINE}-pc-msdosdjgpp + 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 ;; + M68*:*:R3V[567]*:*) + test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;; + 3[34]??:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 4850:*:4.0:3.0) + OS_REL='' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && echo i486-ncr-sysv4.3${OS_REL} && exit 0 + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && echo i586-ncr-sysv4.3${OS_REL} && exit 0 ;; + 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && echo i486-ncr-sysv4 && exit 0 ;; + m68*:LynxOS:2.*:*) + echo m68k-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + mc68030:UNIX_System_V:4.*:*) + echo m68k-atari-sysv4 + exit 0 ;; + i?86:LynxOS:2.*:* | i?86:LynxOS:3.[01]*:*) + echo i386-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + TSUNAMI:LynxOS:2.*:*) + echo sparc-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + rs6000:LynxOS:2.*:* | PowerPC:LynxOS:2.*:*) + echo rs6000-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + SM[BE]S:UNIX_SV:*:*) + echo mips-dde-sysv${UNAME_RELEASE} + exit 0 ;; + RM*: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:CPunix: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 ;; + 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 ;; + Power*:Rhapsody:*:*) + echo powerpc-apple-rhapsody${UNAME_RELEASE} + exit 0 ;; + *:Rhapsody:*:*) + echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} + exit 0 ;; + *:Darwin:*:*) + echo `uname -p`-apple-darwin${UNAME_RELEASE} + exit 0 ;; + *:procnto*:*:* | *:QNX:[0123456789]*:*) + if test "${UNAME_MACHINE}" = "x86pc"; then + UNAME_MACHINE=pc + fi + echo `uname -p`-${UNAME_MACHINE}-nto-qnx + exit 0 ;; + *:QNX:*:4*) + echo i386-pc-qnx + exit 0 ;; + NSR-W:NONSTOP_KERNEL:*:*) + echo nsr-tandem-nsk${UNAME_RELEASE} + 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 ;; +esac + +#echo '(No uname command or uname output not recognized.)' 1>&2 +#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 + +cat >$dummy.c < +# 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) + printf ("vax-dec-bsd\n"); exit (0); +#else + printf ("vax-dec-ultrix\n"); exit (0); +#endif +#endif + +#if defined (alliant) && defined (i860) + printf ("i860-alliant-bsd\n"); exit (0); +#endif + + exit (1); +} +EOF + +$CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy && rm $dummy.c $dummy && exit 0 +rm -f $dummy.c $dummy + +# Apollos put the system type in the environment. + +test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit 0; } + +# Convex versions that predate uname can use getsysinfo(1) + +if [ -x /usr/convex/getsysinfo ] +then + case `getsysinfo -f cpu_type` in + c1*) + echo c1-convex-bsd + exit 0 ;; + c2*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit 0 ;; + c34*) + echo c34-convex-bsd + exit 0 ;; + c38*) + echo c38-convex-bsd + exit 0 ;; + c4*) + echo c4-convex-bsd + exit 0 ;; + esac +fi + +cat >&2 < in order to provide the needed +information to handle your system. + +config.guess version = $version + +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: "version='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: Index: xc/extras/freetype2/builds/cygwin/config.sub diff -u /dev/null xc/extras/freetype2/builds/cygwin/config.sub:1.1.1.1 --- /dev/null Mon Dec 18 14:22:18 2000 +++ xc/extras/freetype2/builds/cygwin/config.sub Fri Dec 8 16:26:06 2000 @@ -0,0 +1,1324 @@ +#! /bin/sh +# Configuration validation subroutine script, version 1.1. +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000 +# Free Software Foundation, Inc. + +version='2000-07-27' + +# 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 . +# +# 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 + -V, --version print version number, then exit" + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case "$1" in + --version | --vers* | -V ) + echo "$version" ; exit 0 ;; + --help | --h* | -h ) + echo "$usage"; exit 0 ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + exec >&2 + echo "$me: invalid option $1" + echo "$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*) + 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 + ;; + -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. + tahoe | i860 | ia64 | m32r | m68k | m68000 | m88k | ns32k | arc | arm \ + | arme[lb] | pyramid | mn10200 | mn10300 | tron | a29k \ + | 580 | i960 | h8300 \ + | x86 | ppcbe | mipsbe | mipsle | shbe | shle | armbe | armle \ + | hppa | hppa1.0 | hppa1.1 | hppa2.0 | hppa2.0w | hppa2.0n \ + | hppa64 \ + | alpha | alphaev[4-8] | alphaev56 | alphapca5[67] \ + | alphaev6[78] \ + | we32k | ns16k | clipper | i370 | sh | sh[34] \ + | powerpc | powerpcle \ + | 1750a | dsp16xx | pdp11 | mips16 | mips64 | mipsel | mips64el \ + | mips64orion | mips64orionel | mipstx39 | mipstx39el \ + | mips64vr4300 | mips64vr4300el | mips64vr4100 | mips64vr4100el \ + | mips64vr5000 | miprs64vr5000el | mcore \ + | sparc | sparclet | sparclite | sparc64 | sparcv9 | v850 | c4x \ + | thumb | d10v | d30v | fr30 | avr) + 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 | z8k | v70 | h8500 | w65 | pj | pjl) + ;; + + # 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[234567]86) + basic_machine=$basic_machine-pc + ;; + # Object if more than one company name word. + *-*-*) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; + # Recognize the basic CPU types with company name. + # FIXME: clean up the formatting here. + vax-* | tahoe-* | i[234567]86-* | i860-* | ia64-* | m32r-* | m68k-* | m68000-* \ + | m88k-* | sparc-* | ns32k-* | fx80-* | arc-* | arm-* | c[123]* \ + | mips-* | pyramid-* | tron-* | a29k-* | romp-* | rs6000-* \ + | power-* | none-* | 580-* | cray2-* | h8300-* | h8500-* | i960-* \ + | xmp-* | ymp-* \ + | x86-* | ppcbe-* | mipsbe-* | mipsle-* | shbe-* | shle-* | armbe-* | armle-* \ + | hppa-* | hppa1.0-* | hppa1.1-* | hppa2.0-* | hppa2.0w-* \ + | hppa2.0n-* | hppa64-* \ + | alpha-* | alphaev[4-8]-* | alphaev56-* | alphapca5[67]-* \ + | alphaev6[78]-* \ + | we32k-* | cydra-* | ns16k-* | pn-* | np1-* | xps100-* \ + | clipper-* | orion-* \ + | sparclite-* | pdp11-* | sh-* | powerpc-* | powerpcle-* \ + | sparc64-* | sparcv9-* | sparc86x-* | mips16-* | mips64-* | mipsel-* \ + | mips64el-* | mips64orion-* | mips64orionel-* \ + | mips64vr4100-* | mips64vr4100el-* | mips64vr4300-* | mips64vr4300el-* \ + | mipstx39-* | mipstx39el-* | mcore-* \ + | f301-* | armv*-* | s390-* | sv1-* | t3e-* \ + | m88110-* | m680[01234]0-* | m683?2-* | m68360-* | z8k-* | d10v-* \ + | thumb-* | v850-* | d30v-* | tic30-* | c30-* | fr30-* \ + | bs2000-* | tic54x-* | c54x-*) + ;; + # 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 + ;; + convex-c1) + basic_machine=c1-convex + os=-bsd + ;; + convex-c2) + basic_machine=c2-convex + os=-bsd + ;; + convex-c32) + basic_machine=c32-convex + os=-bsd + ;; + convex-c34) + basic_machine=c34-convex + os=-bsd + ;; + convex-c38) + basic_machine=c38-convex + os=-bsd + ;; + cray | ymp) + basic_machine=ymp-cray + os=-unicos + ;; + cray2) + basic_machine=cray2-cray + os=-unicos + ;; + [ctj]90-cray) + basic_machine=c90-cray + os=-unicos + ;; + crds | unos) + basic_machine=m68k-crds + ;; + 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 + ;; + 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 + ;; + 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[34567]86v32) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv32 + ;; + i[34567]86v4*) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv4 + ;; + i[34567]86v) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv + ;; + i[34567]86sol2) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-solaris2 + ;; + i386mach) + basic_machine=i386-mach + os=-mach + ;; + i386-vsta | vsta) + basic_machine=i386-unknown + os=-vsta + ;; + i386-go32 | go32) + basic_machine=i386-unknown + os=-go32 + ;; + i386-mingw32 | mingw32) + basic_machine=i386-unknown + os=-mingw32 + ;; + iris | iris4d) + basic_machine=mips-sgi + case $os in + -irix*) + ;; + *) + os=-irix4 + ;; + esac + ;; + isi68 | isi) + basic_machine=m68k-isi + os=-sysv + ;; + m88k-omron*) + basic_machine=m88k-omron + ;; + magnum | m3230) + basic_machine=mips-mips + os=-sysv + ;; + merlin) + basic_machine=ns32k-utek + os=-sysv + ;; + miniframe) + basic_machine=m68000-convergent + ;; + *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; + mipsel*-linux*) + basic_machine=mipsel-unknown + os=-linux-gnu + ;; + mips*-linux*) + basic_machine=mips-unknown + os=-linux-gnu + ;; + mips3*-*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` + ;; + mips3*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown + ;; + mmix*) + basic_machine=mmix-knuth + os=-mmixware + ;; + monitor) + basic_machine=m68k-rom68k + os=-coff + ;; + msdos) + basic_machine=i386-unknown + 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 + ;; + np1) + basic_machine=np1-gould + ;; + nsr-tandem) + basic_machine=nsr-tandem + ;; + op50n-* | op60c-*) + basic_machine=hppa1.1-oki + os=-proelf + ;; + 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 | nexen) + basic_machine=i586-pc + ;; + pentiumpro | p6 | 6x86 | athlon) + basic_machine=i686-pc + ;; + pentiumii | pentium2) + basic_machine=i786-pc + ;; + pentium-* | p5-* | k5-* | k6-* | nexen-*) + basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumpro-* | p6-* | 6x86-* | athlon-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumii-* | pentium2-*) + basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pn) + basic_machine=pn-gould + ;; + power) basic_machine=rs6000-ibm + ;; + ppc) basic_machine=powerpc-unknown + ;; + ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppcle | powerpclittle | ppc-le | powerpc-little) + basic_machine=powerpcle-unknown + ;; + ppcle-* | powerpclittle-*) + basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ps2) + basic_machine=i386-ibm + ;; + rom68k) + basic_machine=m68k-rom68k + os=-coff + ;; + rm[46]00) + basic_machine=mips-siemens + ;; + rtpc | rtpc-*) + basic_machine=romp-ibm + ;; + sa29200) + basic_machine=a29k-amd + os=-udi + ;; + sequent) + basic_machine=i386-sequent + ;; + sh) + basic_machine=sh-hitachi + os=-hms + ;; + sparclite-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=t3e-cray + os=-unicos + ;; + tic54x | c54x*) + basic_machine=tic54x-unknown + os=-coff + ;; + tx39) + basic_machine=mipstx39-unknown + ;; + tx39el) + basic_machine=mipstx39el-unknown + ;; + tower | tower-32) + basic_machine=m68k-ncr + ;; + udi29k) + basic_machine=a29k-amd + os=-udi + ;; + ultra3) + basic_machine=a29k-nyu + os=-sym1 + ;; + 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 + ;; + xmp) + basic_machine=xmp-cray + os=-unicos + ;; + xps | xps100) + basic_machine=xps100-honeywell + ;; + 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 + ;; + mips) + if [ x$os = x-linux-gnu ]; then + basic_machine=mips-unknown + else + basic_machine=mips-mips + fi + ;; + romp) + basic_machine=romp-ibm + ;; + rs6000) + basic_machine=rs6000-ibm + ;; + vax) + basic_machine=vax-dec + ;; + pdp11) + basic_machine=pdp11-dec + ;; + we32k) + basic_machine=we32k-att + ;; + sh3 | sh4) + base_machine=sh-unknown + ;; + sparc | sparcv9) + 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 + ;; + c4x*) + basic_machine=c4x-none + os=-coff + ;; + *) + 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* \ + | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ + | -mingw32* | -linux-gnu* | -uxpv* | -beos* | -mpeix* | -udk* \ + | -interix* | -uwin* | -rhapsody* | -darwin* | -opened* \ + | -openstep* | -oskit*) + # Remember, each alternative MUST END IN *, to match a version number. + ;; + -qnx*) + case $basic_machine in + x86-* | i[34567]86-*) + ;; + *) + os=-nto$os + ;; + esac + ;; + -nto*) + os=-nto-qnx + ;; + -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ + | -windows* | -osx | -abug | -netware* | -os9* | -beos* \ + | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) + ;; + -mac*) + os=`echo $os | sed -e 's|mac|macos|'` + ;; + -linux*) + os=`echo $os | sed -e 's|linux|linux-gnu|'` + ;; + -sunos5*) + os=`echo $os | sed -e 's|sunos5|solaris2|'` + ;; + -sunos6*) + os=`echo $os | sed -e 's|sunos6|solaris3|'` + ;; + -opened*) + os=-openedition + ;; + -wince*) + os=-wince + ;; + -osfrose*) + os=-osfrose + ;; + -osf*) + os=-osf + ;; + -utek*) + os=-bsd + ;; + -dynix*) + os=-bsd + ;; + -acis*) + os=-aos + ;; + -386bsd) + os=-bsd + ;; + -ctix* | -uts*) + os=-sysv + ;; + -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) + 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 + ;; + 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 + ;; + *-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 + ;; + f301-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*) + vendor=wrs + ;; + -aux*) + vendor=apple + ;; + -hms*) + vendor=hitachi + ;; + -mpw* | -macos*) + vendor=apple + ;; + -*mint | -*MiNT) + vendor=atari + ;; + 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: "version='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: Index: xc/extras/freetype2/builds/cygwin/configure diff -u /dev/null xc/extras/freetype2/builds/cygwin/configure:1.1.1.1 --- /dev/null Mon Dec 18 14:22:18 2000 +++ xc/extras/freetype2/builds/cygwin/configure Fri Dec 8 16:26:06 2000 @@ -0,0 +1,2585 @@ +#! /bin/sh + +# Guess values for system-dependent variables and create Makefiles. +# Generated automatically using autoconf version 2.13 +# Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc. +# +# This configure script is free software; the Free Software Foundation +# gives unlimited permission to copy, distribute and modify it. + +# Defaults: +ac_help= +ac_default_prefix=/usr/local +# Any additions from configure.in: +ac_help="$ac_help + --enable-shared[=PKGS] build shared libraries [default=yes]" +ac_help="$ac_help + --enable-static[=PKGS] build static libraries [default=yes]" +ac_help="$ac_help + --enable-fast-install[=PKGS] optimize for fast installation [default=yes]" +ac_help="$ac_help + --with-gnu-ld assume the C compiler uses GNU ld [default=no]" +ac_help="$ac_help + --disable-libtool-lock avoid locking (might break parallel builds)" + +# Initialize some variables set by options. +# The variables have the same names as the options, with +# dashes changed to underlines. +build=NONE +cache_file=./config.cache +exec_prefix=NONE +host=NONE +no_create= +nonopt=NONE +no_recursion= +prefix=NONE +program_prefix=NONE +program_suffix=NONE +program_transform_name=s,x,x, +silent= +site= +srcdir= +target=NONE +verbose= +x_includes=NONE +x_libraries=NONE +bindir='${exec_prefix}/bin' +sbindir='${exec_prefix}/sbin' +libexecdir='${exec_prefix}/libexec' +datadir='${prefix}/share' +sysconfdir='${prefix}/etc' +sharedstatedir='${prefix}/com' +localstatedir='${prefix}/var' +libdir='${exec_prefix}/lib' +includedir='${prefix}/include' +oldincludedir='/usr/include' +infodir='${prefix}/info' +mandir='${prefix}/man' + +# Initialize some other variables. +subdirs= +MFLAGS= MAKEFLAGS= +SHELL=${CONFIG_SHELL-/bin/sh} +# Maximum number of lines to put in a shell here document. +ac_max_here_lines=12 + +ac_prev= +for ac_option +do + + # If the previous option needs an argument, assign it. + if test -n "$ac_prev"; then + eval "$ac_prev=\$ac_option" + ac_prev= + continue + fi + + case "$ac_option" in + -*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;; + *) ac_optarg= ;; + esac + + # Accept the important Cygnus configure options, so we can diagnose typos. + + case "$ac_option" in + + -bindir | --bindir | --bindi | --bind | --bin | --bi) + ac_prev=bindir ;; + -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) + bindir="$ac_optarg" ;; + + -build | --build | --buil | --bui | --bu) + ac_prev=build ;; + -build=* | --build=* | --buil=* | --bui=* | --bu=*) + build="$ac_optarg" ;; + + -cache-file | --cache-file | --cache-fil | --cache-fi \ + | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) + ac_prev=cache_file ;; + -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ + | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) + cache_file="$ac_optarg" ;; + + -datadir | --datadir | --datadi | --datad | --data | --dat | --da) + ac_prev=datadir ;; + -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \ + | --da=*) + datadir="$ac_optarg" ;; + + -disable-* | --disable-*) + ac_feature=`echo $ac_option|sed -e 's/-*disable-//'` + # Reject names that are not valid shell variable names. + if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then + { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; } + fi + ac_feature=`echo $ac_feature| sed 's/-/_/g'` + eval "enable_${ac_feature}=no" ;; + + -enable-* | --enable-*) + ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'` + # Reject names that are not valid shell variable names. + if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then + { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; } + fi + ac_feature=`echo $ac_feature| sed 's/-/_/g'` + case "$ac_option" in + *=*) ;; + *) ac_optarg=yes ;; + esac + eval "enable_${ac_feature}='$ac_optarg'" ;; + + -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ + | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ + | --exec | --exe | --ex) + ac_prev=exec_prefix ;; + -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ + | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ + | --exec=* | --exe=* | --ex=*) + exec_prefix="$ac_optarg" ;; + + -gas | --gas | --ga | --g) + # Obsolete; use --with-gas. + with_gas=yes ;; + + -help | --help | --hel | --he) + # Omit some internal or obsolete options to make the list less imposing. + # This message is too long to be a string in the A/UX 3.1 sh. + cat << EOF +Usage: configure [options] [host] +Options: [defaults in brackets after descriptions] +Configuration: + --cache-file=FILE cache test results in FILE + --help print this message + --no-create do not create output files + --quiet, --silent do not print \`checking...' messages + --version print the version of autoconf that created configure +Directory and file names: + --prefix=PREFIX install architecture-independent files in PREFIX + [$ac_default_prefix] + --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX + [same as prefix] + --bindir=DIR user executables in DIR [EPREFIX/bin] + --sbindir=DIR system admin executables in DIR [EPREFIX/sbin] + --libexecdir=DIR program executables in DIR [EPREFIX/libexec] + --datadir=DIR read-only architecture-independent data in DIR + [PREFIX/share] + --sysconfdir=DIR read-only single-machine data in DIR [PREFIX/etc] + --sharedstatedir=DIR modifiable architecture-independent data in DIR + [PREFIX/com] + --localstatedir=DIR modifiable single-machine data in DIR [PREFIX/var] + --libdir=DIR object code libraries in DIR [EPREFIX/lib] + --includedir=DIR C header files in DIR [PREFIX/include] + --oldincludedir=DIR C header files for non-gcc in DIR [/usr/include] + --infodir=DIR info documentation in DIR [PREFIX/info] + --mandir=DIR man documentation in DIR [PREFIX/man] + --srcdir=DIR find the sources in DIR [configure dir or ..] + --program-prefix=PREFIX prepend PREFIX to installed program names + --program-suffix=SUFFIX append SUFFIX to installed program names + --program-transform-name=PROGRAM + run sed PROGRAM on installed program names +EOF + cat << EOF +Host type: + --build=BUILD configure for building on BUILD [BUILD=HOST] + --host=HOST configure for HOST [guessed] + --target=TARGET configure for TARGET [TARGET=HOST] +Features and packages: + --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) + --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] + --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) + --x-includes=DIR X include files are in DIR + --x-libraries=DIR X library files are in DIR +EOF + if test -n "$ac_help"; then + echo "--enable and --with options recognized:$ac_help" + fi + exit 0 ;; + + -host | --host | --hos | --ho) + ac_prev=host ;; + -host=* | --host=* | --hos=* | --ho=*) + host="$ac_optarg" ;; + + -includedir | --includedir | --includedi | --included | --include \ + | --includ | --inclu | --incl | --inc) + ac_prev=includedir ;; + -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ + | --includ=* | --inclu=* | --incl=* | --inc=*) + includedir="$ac_optarg" ;; + + -infodir | --infodir | --infodi | --infod | --info | --inf) + ac_prev=infodir ;; + -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) + infodir="$ac_optarg" ;; + + -libdir | --libdir | --libdi | --libd) + ac_prev=libdir ;; + -libdir=* | --libdir=* | --libdi=* | --libd=*) + libdir="$ac_optarg" ;; + + -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ + | --libexe | --libex | --libe) + ac_prev=libexecdir ;; + -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ + | --libexe=* | --libex=* | --libe=*) + libexecdir="$ac_optarg" ;; + + -localstatedir | --localstatedir | --localstatedi | --localstated \ + | --localstate | --localstat | --localsta | --localst \ + | --locals | --local | --loca | --loc | --lo) + ac_prev=localstatedir ;; + -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ + | --localstate=* | --localstat=* | --localsta=* | --localst=* \ + | --locals=* | --local=* | --loca=* | --loc=* | --lo=*) + localstatedir="$ac_optarg" ;; + + -mandir | --mandir | --mandi | --mand | --man | --ma | --m) + ac_prev=mandir ;; + -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) + mandir="$ac_optarg" ;; + + -nfp | --nfp | --nf) + # Obsolete; use --without-fp. + with_fp=no ;; + + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c) + no_create=yes ;; + + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) + no_recursion=yes ;; + + -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ + | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ + | --oldin | --oldi | --old | --ol | --o) + ac_prev=oldincludedir ;; + -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ + | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ + | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) + oldincludedir="$ac_optarg" ;; + + -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) + ac_prev=prefix ;; + -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) + prefix="$ac_optarg" ;; + + -program-prefix | --program-prefix | --program-prefi | --program-pref \ + | --program-pre | --program-pr | --program-p) + ac_prev=program_prefix ;; + -program-prefix=* | --program-prefix=* | --program-prefi=* \ + | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) + program_prefix="$ac_optarg" ;; + + -program-suffix | --program-suffix | --program-suffi | --program-suff \ + | --program-suf | --program-su | --program-s) + ac_prev=program_suffix ;; + -program-suffix=* | --program-suffix=* | --program-suffi=* \ + | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) + program_suffix="$ac_optarg" ;; + + -program-transform-name | --program-transform-name \ + | --program-transform-nam | --program-transform-na \ + | --program-transform-n | --program-transform- \ + | --program-transform | --program-transfor \ + | --program-transfo | --program-transf \ + | --program-trans | --program-tran \ + | --progr-tra | --program-tr | --program-t) + ac_prev=program_transform_name ;; + -program-transform-name=* | --program-transform-name=* \ + | --program-transform-nam=* | --program-transform-na=* \ + | --program-transform-n=* | --program-transform-=* \ + | --program-transform=* | --program-transfor=* \ + | --program-transfo=* | --program-transf=* \ + | --program-trans=* | --program-tran=* \ + | --progr-tra=* | --program-tr=* | --program-t=*) + program_transform_name="$ac_optarg" ;; + + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + silent=yes ;; + + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) + ac_prev=sbindir ;; + -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ + | --sbi=* | --sb=*) + sbindir="$ac_optarg" ;; + + -sharedstatedir | --sharedstatedir | --sharedstatedi \ + | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ + | --sharedst | --shareds | --shared | --share | --shar \ + | --sha | --sh) + ac_prev=sharedstatedir ;; + -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ + | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ + | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ + | --sha=* | --sh=*) + sharedstatedir="$ac_optarg" ;; + + -site | --site | --sit) + ac_prev=site ;; + -site=* | --site=* | --sit=*) + site="$ac_optarg" ;; + + -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) + ac_prev=srcdir ;; + -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) + srcdir="$ac_optarg" ;; + + -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ + | --syscon | --sysco | --sysc | --sys | --sy) + ac_prev=sysconfdir ;; + -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ + | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) + sysconfdir="$ac_optarg" ;; + + -target | --target | --targe | --targ | --tar | --ta | --t) + ac_prev=target ;; + -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) + target="$ac_optarg" ;; + + -v | -verbose | --verbose | --verbos | --verbo | --verb) + verbose=yes ;; + + -version | --version | --versio | --versi | --vers) + echo "configure generated by autoconf version 2.13" + exit 0 ;; + + -with-* | --with-*) + ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'` + # Reject names that are not valid shell variable names. + if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then + { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; } + fi + ac_package=`echo $ac_package| sed 's/-/_/g'` + case "$ac_option" in + *=*) ;; + *) ac_optarg=yes ;; + esac + eval "with_${ac_package}='$ac_optarg'" ;; + + -without-* | --without-*) + ac_package=`echo $ac_option|sed -e 's/-*without-//'` + # Reject names that are not valid shell variable names. + if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then + { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; } + fi + ac_package=`echo $ac_package| sed 's/-/_/g'` + eval "with_${ac_package}=no" ;; + + --x) + # Obsolete; use --with-x. + with_x=yes ;; + + -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ + | --x-incl | --x-inc | --x-in | --x-i) + ac_prev=x_includes ;; + -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ + | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) + x_includes="$ac_optarg" ;; + + -x-libraries | --x-libraries | --x-librarie | --x-librari \ + | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) + ac_prev=x_libraries ;; + -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ + | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) + x_libraries="$ac_optarg" ;; + + -*) { echo "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; } + ;; + + *) + if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then + echo "configure: warning: $ac_option: invalid host type" 1>&2 + fi + if test "x$nonopt" != xNONE; then + { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; } + fi + nonopt="$ac_option" + ;; + + esac +done + +if test -n "$ac_prev"; then + { echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; } +fi + +trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15 + +# File descriptor usage: +# 0 standard input +# 1 file creation +# 2 errors and warnings +# 3 some systems may open it to /dev/tty +# 4 used on the Kubota Titan +# 6 checking for... messages and results +# 5 compiler messages saved in config.log +if test "$silent" = yes; then + exec 6>/dev/null +else + exec 6>&1 +fi +exec 5>./config.log + +echo "\ +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. +" 1>&5 + +# Strip out --no-create and --no-recursion so they do not pile up. +# Also quote any args containing shell metacharacters. +ac_configure_args= +for ac_arg +do + case "$ac_arg" in + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c) ;; + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;; + *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*) + ac_configure_args="$ac_configure_args '$ac_arg'" ;; + *) ac_configure_args="$ac_configure_args $ac_arg" ;; + esac +done + +# NLS nuisances. +# Only set these to C if already set. These must not be set unconditionally +# because not all systems understand e.g. LANG=C (notably SCO). +# Fixing LC_MESSAGES prevents Solaris sh from translating var values in `set'! +# Non-C LC_CTYPE values break the ctype check. +if test "${LANG+set}" = set; then LANG=C; export LANG; fi +if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi +if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi +if test "${LC_CTYPE+set}" = set; then LC_CTYPE=C; export LC_CTYPE; fi + +# confdefs.h avoids OS command line length limits that DEFS can exceed. +rm -rf conftest* confdefs.h +# AIX cpp loses on an empty file, so make sure it contains at least a newline. +echo > confdefs.h + +# A filename unique to this package, relative to the directory that +# configure is in, which we can look for to find out if srcdir is correct. +ac_unique_file=ftconfig.in + +# Find the source files, if location was not specified. +if test -z "$srcdir"; then + ac_srcdir_defaulted=yes + # Try the directory containing this script, then its parent. + ac_prog=$0 + ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'` + test "x$ac_confdir" = "x$ac_prog" && ac_confdir=. + srcdir=$ac_confdir + if test ! -r $srcdir/$ac_unique_file; then + srcdir=.. + fi +else + ac_srcdir_defaulted=no +fi +if test ! -r $srcdir/$ac_unique_file; then + if test "$ac_srcdir_defaulted" = yes; then + { echo "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; } + else + { echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; } + fi +fi +srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'` + +# Prefer explicitly selected file to automatically selected ones. +if test -z "$CONFIG_SITE"; then + if test "x$prefix" != xNONE; then + CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" + else + CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" + fi +fi +for ac_site_file in $CONFIG_SITE; do + if test -r "$ac_site_file"; then + echo "loading site script $ac_site_file" + . "$ac_site_file" + fi +done + +if test -r "$cache_file"; then + echo "loading cache $cache_file" + . $cache_file +else + echo "creating cache $cache_file" + > $cache_file +fi + +ac_ext=c +# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. +ac_cpp='$CPP $CPPFLAGS' +ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' +ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' +cross_compiling=$ac_cv_prog_cc_cross + +ac_exeext= +ac_objext=o +if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then + # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu. + if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then + ac_n= ac_c=' +' ac_t=' ' + else + ac_n=-n ac_c= ac_t= + fi +else + ac_n= ac_c='\c' ac_t= +fi + + + + + +version_info='6:1:0' + + +ac_aux_dir= +for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do + if test -f $ac_dir/install-sh; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install-sh -c" + break + elif test -f $ac_dir/install.sh; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install.sh -c" + break + fi +done +if test -z "$ac_aux_dir"; then + { echo "configure: error: can not find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." 1>&2; exit 1; } +fi +ac_config_guess=$ac_aux_dir/config.guess +ac_config_sub=$ac_aux_dir/config.sub +ac_configure=$ac_aux_dir/configure # This should be Cygnus configure. + + +# Do some error checking and defaulting for the host and target type. +# The inputs are: +# configure --host=HOST --target=TARGET --build=BUILD NONOPT +# +# The rules are: +# 1. You are not allowed to specify --host, --target, and nonopt at the +# same time. +# 2. Host defaults to nonopt. +# 3. If nonopt is not specified, then host defaults to the current host, +# as determined by config.guess. +# 4. Target and build default to nonopt. +# 5. If nonopt is not specified, then target and build default to host. + +# The aliases save the names the user supplied, while $host etc. +# will get canonicalized. +case $host---$target---$nonopt in +NONE---*---* | *---NONE---* | *---*---NONE) ;; +*) { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; } ;; +esac + + +# Make sure we can run config.sub. +if ${CONFIG_SHELL-/bin/sh} $ac_config_sub sun4 >/dev/null 2>&1; then : +else { echo "configure: error: can not run $ac_config_sub" 1>&2; exit 1; } +fi + +echo $ac_n "checking host system type""... $ac_c" 1>&6 +echo "configure:588: checking host system type" >&5 + +host_alias=$host +case "$host_alias" in +NONE) + case $nonopt in + NONE) + if host_alias=`${CONFIG_SHELL-/bin/sh} $ac_config_guess`; then : + else { echo "configure: error: can not guess host type; you must specify one" 1>&2; exit 1; } + fi ;; + *) host_alias=$nonopt ;; + esac ;; +esac + +host=`${CONFIG_SHELL-/bin/sh} $ac_config_sub $host_alias` +host_cpu=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` +host_vendor=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` +host_os=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` +echo "$ac_t""$host" 1>&6 + +echo $ac_n "checking target system type""... $ac_c" 1>&6 +echo "configure:609: checking target system type" >&5 + +target_alias=$target +case "$target_alias" in +NONE) + case $nonopt in + NONE) target_alias=$host_alias ;; + *) target_alias=$nonopt ;; + esac ;; +esac + +target=`${CONFIG_SHELL-/bin/sh} $ac_config_sub $target_alias` +target_cpu=`echo $target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` +target_vendor=`echo $target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` +target_os=`echo $target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` +echo "$ac_t""$target" 1>&6 + +echo $ac_n "checking build system type""... $ac_c" 1>&6 +echo "configure:627: checking build system type" >&5 + +build_alias=$build +case "$build_alias" in +NONE) + case $nonopt in + NONE) build_alias=$host_alias ;; + *) build_alias=$nonopt ;; + esac ;; +esac + +build=`${CONFIG_SHELL-/bin/sh} $ac_config_sub $build_alias` +build_cpu=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` +build_vendor=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` +build_os=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` +echo "$ac_t""$build" 1>&6 + +test "$host_alias" != "$target_alias" && + test "$program_prefix$program_suffix$program_transform_name" = \ + NONENONEs,x,x, && + program_prefix=${target_alias}- + + +# Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:653: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" + ac_dummy="$PATH" + for ac_dir in $ac_dummy; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + ac_cv_prog_CC="gcc" + break + fi + done + IFS="$ac_save_ifs" +fi +fi +CC="$ac_cv_prog_CC" +if test -n "$CC"; then + echo "$ac_t""$CC" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + +if test -z "$CC"; then + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:683: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" + ac_prog_rejected=no + ac_dummy="$PATH" + for ac_dir in $ac_dummy; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + if test "$ac_dir/$ac_word" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + break + fi + done + IFS="$ac_save_ifs" +if test $ac_prog_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $ac_cv_prog_CC + shift + if test $# -gt 0; then + # We chose a different compiler from the bogus one. + # However, it has the same basename, so the bogon will be chosen + # first if we set CC to just the basename; use the full file name. + shift + set dummy "$ac_dir/$ac_word" "$@" + shift + ac_cv_prog_CC="$@" + fi +fi +fi +fi +CC="$ac_cv_prog_CC" +if test -n "$CC"; then + echo "$ac_t""$CC" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + + if test -z "$CC"; then + case "`uname -s`" in + *win32* | *WIN32*) + # Extract the first word of "cl", so it can be a program name with args. +set dummy cl; ac_word=$2 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:734: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" + ac_dummy="$PATH" + for ac_dir in $ac_dummy; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + ac_cv_prog_CC="cl" + break + fi + done + IFS="$ac_save_ifs" +fi +fi +CC="$ac_cv_prog_CC" +if test -n "$CC"; then + echo "$ac_t""$CC" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + ;; + esac + fi + test -z "$CC" && { echo "configure: error: no acceptable cc found in \$PATH" 1>&2; exit 1; } +fi + +echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6 +echo "configure:766: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5 + +ac_ext=c +# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. +ac_cpp='$CPP $CPPFLAGS' +ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' +ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' +cross_compiling=$ac_cv_prog_cc_cross + +cat > conftest.$ac_ext << EOF + +#line 777 "configure" +#include "confdefs.h" + +main(){return(0);} +EOF +if { (eval echo configure:782: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + ac_cv_prog_cc_works=yes + # If we can't run a trivial program, we are probably using a cross compiler. + if (./conftest; exit) 2>/dev/null; then + ac_cv_prog_cc_cross=no + else + ac_cv_prog_cc_cross=yes + fi +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + ac_cv_prog_cc_works=no +fi +rm -fr conftest* +ac_ext=c +# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. +ac_cpp='$CPP $CPPFLAGS' +ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' +ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' +cross_compiling=$ac_cv_prog_cc_cross + +echo "$ac_t""$ac_cv_prog_cc_works" 1>&6 +if test $ac_cv_prog_cc_works = no; then + { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; } +fi +echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6 +echo "configure:808: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5 +echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6 +cross_compiling=$ac_cv_prog_cc_cross + +echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6 +echo "configure:813: checking whether we are using GNU C" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.c <&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then + ac_cv_prog_gcc=yes +else + ac_cv_prog_gcc=no +fi +fi + +echo "$ac_t""$ac_cv_prog_gcc" 1>&6 + +if test $ac_cv_prog_gcc = yes; then + GCC=yes +else + GCC= +fi + +ac_test_CFLAGS="${CFLAGS+set}" +ac_save_CFLAGS="$CFLAGS" +CFLAGS= +echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6 +echo "configure:841: checking whether ${CC-cc} accepts -g" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + echo 'void f(){}' > conftest.c +if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then + ac_cv_prog_cc_g=yes +else + ac_cv_prog_cc_g=no +fi +rm -f conftest* + +fi + +echo "$ac_t""$ac_cv_prog_cc_g" 1>&6 +if test "$ac_test_CFLAGS" = set; then + CFLAGS="$ac_save_CFLAGS" +elif test $ac_cv_prog_cc_g = yes; then + 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 $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6 +echo "configure:873: checking how to run the C preprocessor" >&5 +# On Suns, sometimes $CPP names a directory. +if test -n "$CPP" && test -d "$CPP"; then + CPP= +fi +if test -z "$CPP"; then +if eval "test \"`echo '$''{'ac_cv_prog_CPP'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + # This must be in double quotes, not single quotes, because CPP may get + # substituted into the Makefile and "${CC-cc}" will confuse make. + CPP="${CC-cc} -E" + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. + cat > conftest.$ac_ext < +Syntax Error +EOF +ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +{ (eval echo configure:894: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` +if test -z "$ac_err"; then + : +else + echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + CPP="${CC-cc} -E -traditional-cpp" + cat > conftest.$ac_ext < +Syntax Error +EOF +ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +{ (eval echo configure:911: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` +if test -z "$ac_err"; then + : +else + echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + CPP="${CC-cc} -nologo -E" + cat > conftest.$ac_ext < +Syntax Error +EOF +ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +{ (eval echo configure:928: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` +if test -z "$ac_err"; then + : +else + echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + CPP=/lib/cpp +fi +rm -f conftest* +fi +rm -f conftest* +fi +rm -f conftest* + ac_cv_prog_CPP="$CPP" +fi + CPP="$ac_cv_prog_CPP" +else + ac_cv_prog_CPP="$CPP" +fi +echo "$ac_t""$CPP" 1>&6 + + +if test "x$CC" = xgcc; then + XX_CFLAGS="-Wall" + XX_ANSIFLAGS="-pedantic -ansi" +else + case "$host" in + *-dec-osf*) + CFLAGS= + XX_CFLAGS="-std1 -g3" + XX_ANSIFLAGS= + ;; + *) + XX_CFLAGS= + XX_ANSIFLAGS= + ;; + esac +fi + + + +# Extract the first word of "rm", so it can be a program name with args. +set dummy rm; ac_word=$2 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:975: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_RMF'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + if test -n "$RMF"; then + ac_cv_prog_RMF="$RMF" # Let the user override the test. +else + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" + ac_dummy="$PATH" + for ac_dir in $ac_dummy; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + ac_cv_prog_RMF="rm -f" + break + fi + done + IFS="$ac_save_ifs" +fi +fi +RMF="$ac_cv_prog_RMF" +if test -n "$RMF"; then + echo "$ac_t""$RMF" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + +# Extract the first word of "rmdir", so it can be a program name with args. +set dummy rmdir; ac_word=$2 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:1004: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_RMDIR'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + if test -n "$RMDIR"; then + ac_cv_prog_RMDIR="$RMDIR" # Let the user override the test. +else + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" + ac_dummy="$PATH" + for ac_dir in $ac_dummy; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + ac_cv_prog_RMDIR="rmdir" + break + fi + done + IFS="$ac_save_ifs" +fi +fi +RMDIR="$ac_cv_prog_RMDIR" +if test -n "$RMDIR"; then + echo "$ac_t""$RMDIR" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + + +# Find a good install program. We prefer a C program (faster), +# so one script is as good as another. But avoid the broken or +# incompatible versions: +# SysV /etc/install, /usr/sbin/install +# SunOS /usr/etc/install +# IRIX /sbin/install +# AIX /bin/install +# 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 $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6 +echo "configure:1043: checking for a BSD compatible install" >&5 +if test -z "$INSTALL"; then +if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + IFS="${IFS= }"; ac_save_IFS="$IFS"; IFS=":" + for ac_dir in $PATH; do + # Account for people who put trailing slashes in PATH elements. + case "$ac_dir/" in + /|./|.//|/etc/*|/usr/sbin/*|/usr/etc/*|/sbin/*|/usr/afsws/bin/*|/usr/ucb/*) ;; + *) + # OSF1 and SCO ODT 3.0 have their own names for install. + # Don't use installbsd from OSF since it installs stuff as root + # by default. + for ac_prog in ginstall scoinst install; do + if test -f $ac_dir/$ac_prog; then + if test $ac_prog = install && + grep dspmsg $ac_dir/$ac_prog >/dev/null 2>&1; then + # AIX install. It has an incompatible calling convention. + : + else + ac_cv_path_install="$ac_dir/$ac_prog -c" + break 2 + fi + fi + done + ;; + esac + done + IFS="$ac_save_IFS" + +fi + if test "${ac_cv_path_install+set}" = set; then + INSTALL="$ac_cv_path_install" + else + # As a last resort, use the slow shell script. We don't cache a + # path for INSTALL within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the path is relative. + INSTALL="$ac_install_sh" + fi +fi +echo "$ac_t""$INSTALL" 1>&6 + +# Use test -z because SunOS4 sh mishandles braces in ${var-val}. +# It thinks the first close brace ends the variable substitution. +test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' + +test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL_PROGRAM}' + +test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' + +case "$INSTALL" in + /*) + ;; + */*) + INSTALL="`pwd`/$INSTALL" ;; +esac + +echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6 +echo "configure:1103: checking for ANSI C header files" >&5 +if eval "test \"`echo '$''{'ac_cv_header_stdc'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +#include +#include +#include +EOF +ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +{ (eval echo configure:1116: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` +if test -z "$ac_err"; then + rm -rf conftest* + ac_cv_header_stdc=yes +else + echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + ac_cv_header_stdc=no +fi +rm -f conftest* + +if test $ac_cv_header_stdc = yes; then + # SunOS 4.x string.h does not declare mem*, contrary to ANSI. +cat > conftest.$ac_ext < +EOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + egrep "memchr" >/dev/null 2>&1; then + : +else + rm -rf conftest* + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. +cat > conftest.$ac_ext < +EOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + egrep "free" >/dev/null 2>&1; then + : +else + rm -rf conftest* + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. +if test "$cross_compiling" = yes; then + : +else + cat > conftest.$ac_ext < +#define ISLOWER(c) ('a' <= (c) && (c) <= 'z') +#define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) +#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) +int main () { int i; for (i = 0; i < 256; i++) +if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) exit(2); +exit (0); } + +EOF +if { (eval echo configure:1183: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +then + : +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -fr conftest* + ac_cv_header_stdc=no +fi +rm -fr conftest* +fi + +fi +fi + +echo "$ac_t""$ac_cv_header_stdc" 1>&6 +if test $ac_cv_header_stdc = yes; then + cat >> confdefs.h <<\EOF +#define STDC_HEADERS 1 +EOF + +fi + +for ac_hdr in fcntl.h unistd.h +do +ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` +echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 +echo "configure:1210: checking for $ac_hdr" >&5 +if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +EOF +ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +{ (eval echo configure:1220: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` +if test -z "$ac_err"; then + rm -rf conftest* + eval "ac_cv_header_$ac_safe=yes" +else + echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_header_$ac_safe=no" +fi +rm -f conftest* +fi +if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then + echo "$ac_t""yes" 1>&6 + ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'` + cat >> confdefs.h <&6 +fi +done + + +echo $ac_n "checking for working const""... $ac_c" 1>&6 +echo "configure:1248: checking for working const" >&5 +if eval "test \"`echo '$''{'ac_cv_c_const'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext <j = 5; +} +{ /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ + const int foo = 10; +} + +; return 0; } +EOF +if { (eval echo configure:1302: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then + rm -rf conftest* + ac_cv_c_const=yes +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + ac_cv_c_const=no +fi +rm -f conftest* +fi + +echo "$ac_t""$ac_cv_c_const" 1>&6 +if test $ac_cv_c_const = no; then + cat >> confdefs.h <<\EOF +#define const +EOF + +fi + +echo $ac_n "checking size of int""... $ac_c" 1>&6 +echo "configure:1323: checking size of int" >&5 +if eval "test \"`echo '$''{'ac_cv_sizeof_int'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + if test "$cross_compiling" = yes; then + { echo "configure: error: can not run test program while cross compiling" 1>&2; exit 1; } +else + cat > conftest.$ac_ext < +main() +{ + FILE *f=fopen("conftestval", "w"); + if (!f) exit(1); + fprintf(f, "%d\n", sizeof(int)); + exit(0); +} +EOF +if { (eval echo configure:1342: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +then + ac_cv_sizeof_int=`cat conftestval` +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -fr conftest* + ac_cv_sizeof_int=0 +fi +rm -fr conftest* +fi + +fi +echo "$ac_t""$ac_cv_sizeof_int" 1>&6 +cat >> confdefs.h <&6 +echo "configure:1362: checking size of long" >&5 +if eval "test \"`echo '$''{'ac_cv_sizeof_long'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + if test "$cross_compiling" = yes; then + { echo "configure: error: can not run test program while cross compiling" 1>&2; exit 1; } +else + cat > conftest.$ac_ext < +main() +{ + FILE *f=fopen("conftestval", "w"); + if (!f) exit(1); + fprintf(f, "%d\n", sizeof(long)); + exit(0); +} +EOF +if { (eval echo configure:1381: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +then + ac_cv_sizeof_long=`cat conftestval` +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -fr conftest* + ac_cv_sizeof_long=0 +fi +rm -fr conftest* +fi + +fi +echo "$ac_t""$ac_cv_sizeof_long" 1>&6 +cat >> confdefs.h <&6 +echo "configure:1406: checking for $ac_hdr" >&5 +if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +EOF +ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +{ (eval echo configure:1416: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` +if test -z "$ac_err"; then + rm -rf conftest* + eval "ac_cv_header_$ac_safe=yes" +else + echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_header_$ac_safe=no" +fi +rm -f conftest* +fi +if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then + echo "$ac_t""yes" 1>&6 + ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'` + cat >> confdefs.h <&6 +fi +done + +for ac_func in getpagesize +do +echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 +echo "configure:1445: checking for $ac_func" >&5 +if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +/* Override any gcc2 internal prototype to avoid an error. */ +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char $ac_func(); + +int main() { + +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +choke me +#else +$ac_func(); +#endif + +; return 0; } +EOF +if { (eval echo configure:1473: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_func_$ac_func=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_func_$ac_func=no" +fi +rm -f conftest* +fi + +if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then + echo "$ac_t""yes" 1>&6 + ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` + cat >> confdefs.h <&6 +fi +done + +echo $ac_n "checking for working mmap""... $ac_c" 1>&6 +echo "configure:1498: checking for working mmap" >&5 +if eval "test \"`echo '$''{'ac_cv_func_mmap_fixed_mapped'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + if test "$cross_compiling" = yes; then + ac_cv_func_mmap_fixed_mapped=no +else + cat > conftest.$ac_ext < +#include +#include + +/* This mess was copied from the GNU getpagesize.h. */ +#ifndef HAVE_GETPAGESIZE +# ifdef HAVE_UNISTD_H +# include +# endif + +/* Assume that all systems that can run configure have sys/param.h. */ +# ifndef HAVE_SYS_PARAM_H +# define HAVE_SYS_PARAM_H 1 +# endif + +# ifdef _SC_PAGESIZE +# define getpagesize() sysconf(_SC_PAGESIZE) +# else /* no _SC_PAGESIZE */ +# ifdef HAVE_SYS_PARAM_H +# include +# ifdef EXEC_PAGESIZE +# define getpagesize() EXEC_PAGESIZE +# else /* no EXEC_PAGESIZE */ +# ifdef NBPG +# define getpagesize() NBPG * CLSIZE +# ifndef CLSIZE +# define CLSIZE 1 +# endif /* no CLSIZE */ +# else /* no NBPG */ +# ifdef NBPC +# define getpagesize() NBPC +# else /* no NBPC */ +# ifdef PAGESIZE +# define getpagesize() PAGESIZE +# endif /* PAGESIZE */ +# endif /* no NBPC */ +# endif /* no NBPG */ +# endif /* no EXEC_PAGESIZE */ +# else /* no HAVE_SYS_PARAM_H */ +# define getpagesize() 8192 /* punt totally */ +# endif /* no HAVE_SYS_PARAM_H */ +# endif /* no _SC_PAGESIZE */ + +#endif /* no HAVE_GETPAGESIZE */ + +#ifdef __cplusplus +extern "C" { void *malloc(unsigned); } +#else +char *malloc(); +#endif + +int +main() +{ + char *data, *data2, *data3; + int i, pagesize; + int fd; + + pagesize = getpagesize(); + + /* + * First, make a file with some known garbage in it. + */ + data = malloc(pagesize); + if (!data) + exit(1); + for (i = 0; i < pagesize; ++i) + *(data + i) = rand(); + umask(0); + fd = creat("conftestmmap", 0600); + if (fd < 0) + exit(1); + if (write(fd, data, pagesize) != pagesize) + exit(1); + close(fd); + + /* + * Next, try to mmap the file at a fixed address which + * already has something else allocated at it. If we can, + * also make sure that we see the same garbage. + */ + fd = open("conftestmmap", O_RDWR); + if (fd < 0) + exit(1); + data2 = malloc(2 * pagesize); + if (!data2) + exit(1); + data2 += (pagesize - ((int) data2 & (pagesize - 1))) & (pagesize - 1); + if (data2 != mmap(data2, pagesize, PROT_READ | PROT_WRITE, + MAP_PRIVATE | MAP_FIXED, fd, 0L)) + exit(1); + for (i = 0; i < pagesize; ++i) + if (*(data + i) != *(data2 + i)) + exit(1); + + /* + * Finally, make sure that changes to the mapped area + * do not percolate back to the file as seen by read(). + * (This is a bug on some variants of i386 svr4.0.) + */ + for (i = 0; i < pagesize; ++i) + *(data2 + i) = *(data2 + i) + 1; + data3 = malloc(pagesize); + if (!data3) + exit(1); + if (read(fd, data3, pagesize) != pagesize) + exit(1); + for (i = 0; i < pagesize; ++i) + if (*(data + i) != *(data3 + i)) + exit(1); + close(fd); + unlink("conftestmmap"); + exit(0); +} + +EOF +if { (eval echo configure:1646: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +then + ac_cv_func_mmap_fixed_mapped=yes +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -fr conftest* + ac_cv_func_mmap_fixed_mapped=no +fi +rm -fr conftest* +fi + +fi + +echo "$ac_t""$ac_cv_func_mmap_fixed_mapped" 1>&6 +if test $ac_cv_func_mmap_fixed_mapped = yes; then + cat >> confdefs.h <<\EOF +#define HAVE_MMAP 1 +EOF + +fi + +if test "$ac_cv_func_mmap_fixed_mapped" != yes; then + FTSYS_SRC='$(BASE_)ftsystem.c' +else + FTSYS_SRC='$(BUILD)/ftsystem.c' + + echo $ac_n "checking whether munmap must be declared""... $ac_c" 1>&6 +echo "configure:1674: checking whether munmap must be declared" >&5 +if eval "test \"`echo '$''{'ft_cv_munmap_decl'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +#endif +#include +int main() { +char *(*pfn) = (char *(*))munmap +; return 0; } +EOF +if { (eval echo configure:1690: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then + rm -rf conftest* + ft_cv_munmap_decl=no +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + ft_cv_munmap_decl=yes +fi +rm -f conftest* +fi + +echo "$ac_t""$ft_cv_munmap_decl" 1>&6 +if test $ft_cv_munmap_decl = yes; then + cat >> confdefs.h <<\EOF +#define NEED_MUNMAP_DECL 1 +EOF + +fi + echo $ac_n "checking for munmap's first parameter type""... $ac_c" 1>&6 +echo "configure:1710: checking for munmap's first parameter type" >&5 +cat > conftest.$ac_ext < +#include +int munmap(void *, size_t); +int main() { + +; return 0; } +EOF +if { (eval echo configure:1722: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then + rm -rf conftest* + echo "$ac_t""void *" 1>&6;cat >> confdefs.h <<\EOF +#define MUNMAP_USES_VOIDP 1 +EOF + +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + echo "$ac_t""char *" 1>&6 +fi +rm -f conftest* + +fi + + +for ac_func in memcpy memmove +do +echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 +echo "configure:1742: checking for $ac_func" >&5 +if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +/* Override any gcc2 internal prototype to avoid an error. */ +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char $ac_func(); + +int main() { + +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +choke me +#else +$ac_func(); +#endif + +; return 0; } +EOF +if { (eval echo configure:1770: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_func_$ac_func=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_func_$ac_func=no" +fi +rm -f conftest* +fi + +if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then + echo "$ac_t""yes" 1>&6 + ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` + cat >> confdefs.h <&6 +fi +done + + +# Check whether --enable-shared or --disable-shared was given. +if test "${enable_shared+set}" = set; then + enableval="$enable_shared" + p=${PACKAGE-default} +case "$enableval" in +yes) enable_shared=yes ;; +no) enable_shared=no ;; +*) + enable_shared=no + # Look at the argument we got. We use all the common list separators. + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:," + for pkg in $enableval; do + if test "X$pkg" = "X$p"; then + enable_shared=yes + fi + done + IFS="$ac_save_ifs" + ;; +esac +else + enable_shared=yes +fi + +# 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 + +# Extract the first word of "ranlib", so it can be a program name with args. +set dummy ranlib; ac_word=$2 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:1867: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + if test -n "$RANLIB"; then + ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. +else + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" + ac_dummy="$PATH" + for ac_dir in $ac_dummy; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + ac_cv_prog_RANLIB="ranlib" + break + fi + done + IFS="$ac_save_ifs" + test -z "$ac_cv_prog_RANLIB" && ac_cv_prog_RANLIB=":" +fi +fi +RANLIB="$ac_cv_prog_RANLIB" +if test -n "$RANLIB"; then + echo "$ac_t""$RANLIB" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + +# Check whether --with-gnu-ld or --without-gnu-ld was given. +if test "${with_gnu_ld+set}" = set; then + withval="$with_gnu_ld" + test "$withval" = no || with_gnu_ld=yes +else + with_gnu_ld=no +fi + +ac_prog=ld +if test "$ac_cv_prog_gcc" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + echo $ac_n "checking for ld used by GCC""... $ac_c" 1>&6 +echo "configure:1906: checking for ld used by GCC" >&5 + ac_prog=`($CC -print-prog-name=ld) 2>&5` + case "$ac_prog" in + # Accept absolute paths. + [\\/]* | [A-Za-z]:[\\/]*) + 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 $ac_n "checking for GNU ld""... $ac_c" 1>&6 +echo "configure:1930: checking for GNU ld" >&5 +else + echo $ac_n "checking for non-GNU ld""... $ac_c" 1>&6 +echo "configure:1933: checking for non-GNU ld" >&5 +fi +if eval "test \"`echo '$''{'ac_cv_path_LD'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + if test -z "$LD"; then + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${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 + ac_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some GNU ld's only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + if "$ac_cv_path_LD" -v 2>&1 < /dev/null | egrep '(GNU|with BFD)' > /dev/null; then + test "$with_gnu_ld" != no && break + else + test "$with_gnu_ld" != yes && break + fi + fi + done + IFS="$ac_save_ifs" +else + ac_cv_path_LD="$LD" # Let the user override the test with a path. +fi +fi + +LD="$ac_cv_path_LD" +if test -n "$LD"; then + echo "$ac_t""$LD" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi +test -z "$LD" && { echo "configure: error: no acceptable ld found in \$PATH" 1>&2; exit 1; } +echo $ac_n "checking if the linker ($LD) is GNU ld""... $ac_c" 1>&6 +echo "configure:1968: checking if the linker ($LD) is GNU ld" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_gnu_ld'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + # I'd rather use --version here, but apparently some GNU ld's only accept -v. +if $LD -v 2>&1 &5; then + ac_cv_prog_gnu_ld=yes +else + ac_cv_prog_gnu_ld=no +fi +fi + +echo "$ac_t""$ac_cv_prog_gnu_ld" 1>&6 + + +echo $ac_n "checking for BSD-compatible nm""... $ac_c" 1>&6 +echo "configure:1984: checking for BSD-compatible nm" >&5 +if eval "test \"`echo '$''{'ac_cv_path_NM'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + if test -n "$NM"; then + # Let the user override the test. + ac_cv_path_NM="$NM" +else + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}" + for ac_dir in $PATH /usr/ccs/bin /usr/ucb /bin; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/nm || test -f $ac_dir/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 + if ($ac_dir/nm -B /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then + ac_cv_path_NM="$ac_dir/nm -B" + break + elif ($ac_dir/nm -p /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then + ac_cv_path_NM="$ac_dir/nm -p" + break + else + ac_cv_path_NM=${ac_cv_path_NM="$ac_dir/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 "$ac_cv_path_NM" && ac_cv_path_NM=nm +fi +fi + +NM="$ac_cv_path_NM" +echo "$ac_t""$NM" 1>&6 + +echo $ac_n "checking whether ln -s works""... $ac_c" 1>&6 +echo "configure:2020: checking whether ln -s works" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_LN_S'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + rm -f conftestdata +if ln -s X conftestdata 2>/dev/null +then + rm -f conftestdata + ac_cv_prog_LN_S="ln -s" +else + ac_cv_prog_LN_S=ln +fi +fi +LN_S="$ac_cv_prog_LN_S" +if test "$ac_cv_prog_LN_S" = "ln -s"; then + echo "$ac_t""yes" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + + +case "$target" in +NONE) lt_target="$host" ;; +*) lt_target="$target" ;; +esac + +# Check for any special flags to pass to ltconfig. +libtool_flags="--cache-file=$cache_file" +test "$enable_shared" = no && libtool_flags="$libtool_flags --disable-shared" +test "$enable_static" = no && libtool_flags="$libtool_flags --disable-static" +test "$enable_fast_install" = no && libtool_flags="$libtool_flags --disable-fast-install" +test "$ac_cv_prog_gcc" = yes && libtool_flags="$libtool_flags --with-gcc" +test "$ac_cv_prog_gnu_ld" = yes && libtool_flags="$libtool_flags --with-gnu-ld" + + +# 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 && libtool_flags="$libtool_flags --disable-lock" +test x"$silent" = xyes && libtool_flags="$libtool_flags --silent" + +# Some flags need to be propagated to the compiler or linker for good +# libtool support. +case "$lt_target" in +*-*-irix6*) + # Find out which ABI we are using. + echo '#line 2069 "configure"' > conftest.$ac_ext + if { (eval echo configure:2070: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then + case "`/usr/bin/file conftest.o`" in + *32-bit*) + LD="${LD-ld} -32" + ;; + *N32*) + LD="${LD-ld} -n32" + ;; + *64-bit*) + LD="${LD-ld} -64" + ;; + esac + fi + rm -rf conftest* + ;; + +*-*-sco3.2v5*) + # On SCO OpenServer 5, we need -belf to get full-featured binaries. + SAVE_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -belf" + echo $ac_n "checking whether the C compiler needs -belf""... $ac_c" 1>&6 +echo "configure:2091: checking whether the C compiler needs -belf" >&5 +if eval "test \"`echo '$''{'lt_cv_cc_needs_belf'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + lt_cv_cc_needs_belf=yes +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + lt_cv_cc_needs_belf=no +fi +rm -f conftest* +fi + +echo "$ac_t""$lt_cv_cc_needs_belf" 1>&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 + + +# Save cache, so that ltconfig can load it +cat > confcache <<\EOF +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs. It is not useful on other systems. +# If it contains results you don't want to keep, you may remove or edit it. +# +# By default, configure uses ./config.cache as the cache file, +# creating it if it does not exist already. You can give configure +# the --cache-file=FILE option to use a different cache file; that is +# what configure does when it calls configure scripts in +# subdirectories, so they share the cache. +# Giving --cache-file=/dev/null disables caching, for debugging configure. +# config.status only pays attention to the cache file if you give it the +# --recheck option to rerun configure. +# +EOF +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, don't put newlines in cache variables' values. +# Ultrix sh set writes to stderr and can't be redirected directly, +# and sets the high bit in the cache file unless we assign to the vars. +(set) 2>&1 | + case `(ac_space=' '; set | 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 \ + -e "s/'/'\\\\''/g" \ + -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p" + ;; + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p' + ;; + esac >> confcache +if cmp -s $cache_file confcache; then + : +else + if test -w $cache_file; then + echo "updating cache $cache_file" + cat confcache > $cache_file + else + echo "not updating unwritable cache $cache_file" + fi +fi +rm -f confcache + + +# Actually configure libtool. ac_aux_dir is where install-sh is found. +CC="$CC" CFLAGS="$CFLAGS" CPPFLAGS="$CPPFLAGS" \ +LD="$LD" LDFLAGS="$LDFLAGS" LIBS="$LIBS" \ +LN_S="$LN_S" NM="$NM" RANLIB="$RANLIB" \ +DLLTOOL="$DLLTOOL" AS="$AS" OBJDUMP="$OBJDUMP" \ +${CONFIG_SHELL-/bin/sh} $ac_aux_dir/ltconfig --no-reexec \ +$libtool_flags --no-verify $ac_aux_dir/ltmain.sh $lt_target \ +|| { echo "configure: error: libtool configure failed" 1>&2; exit 1; } + +# Reload cache, that may have been modified by ltconfig +if test -r "$cache_file"; then + echo "loading cache $cache_file" + . $cache_file +else + echo "creating cache $cache_file" + > $cache_file +fi + + +# This can be used to rebuild libtool when needed +LIBTOOL_DEPS="$ac_aux_dir/ltconfig $ac_aux_dir/ltmain.sh" + +# Always use our own libtool. +LIBTOOL='$(SHELL) $(top_builddir)/libtool' + +# Redirect the config.log output again, so that the ltconfig log is not +# clobbered by the next message. +exec 5>>./config.log + + +trap '' 1 2 15 +cat > confcache <<\EOF +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs. It is not useful on other systems. +# If it contains results you don't want to keep, you may remove or edit it. +# +# By default, configure uses ./config.cache as the cache file, +# creating it if it does not exist already. You can give configure +# the --cache-file=FILE option to use a different cache file; that is +# what configure does when it calls configure scripts in +# subdirectories, so they share the cache. +# Giving --cache-file=/dev/null disables caching, for debugging configure. +# config.status only pays attention to the cache file if you give it the +# --recheck option to rerun configure. +# +EOF +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, don't put newlines in cache variables' values. +# Ultrix sh set writes to stderr and can't be redirected directly, +# and sets the high bit in the cache file unless we assign to the vars. +(set) 2>&1 | + case `(ac_space=' '; set | 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 \ + -e "s/'/'\\\\''/g" \ + -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p" + ;; + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p' + ;; + esac >> confcache +if cmp -s $cache_file confcache; then + : +else + if test -w $cache_file; then + echo "updating cache $cache_file" + cat confcache > $cache_file + else + echo "not updating unwritable cache $cache_file" + fi +fi +rm -f confcache + +trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15 + +test "x$prefix" = xNONE && prefix=$ac_default_prefix +# Let make expand exec_prefix. +test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' + +# Any assignment to VPATH causes Sun make to only execute +# the first set of double-colon rules, so remove it if not needed. +# If there is a colon in the path, we need to keep it. +if test "x$srcdir" = x.; then + ac_vpsub='/^[ ]*VPATH[ ]*=[^:]*$/d' +fi + +trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15 + +DEFS=-DHAVE_CONFIG_H + +# Without the "./", some shells look in PATH for config.status. +: ${CONFIG_STATUS=./config.status} + +echo creating $CONFIG_STATUS +rm -f $CONFIG_STATUS +cat > $CONFIG_STATUS </dev/null | sed 1q`: +# +# $0 $ac_configure_args +# +# Compiler output produced by configure, useful for debugging +# configure, is in ./config.log if it exists. + +ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]" +for ac_option +do + case "\$ac_option" in + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion" + exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;; + -version | --version | --versio | --versi | --vers | --ver | --ve | --v) + echo "$CONFIG_STATUS generated by autoconf version 2.13" + exit 0 ;; + -help | --help | --hel | --he | --h) + echo "\$ac_cs_usage"; exit 0 ;; + *) echo "\$ac_cs_usage"; exit 1 ;; + esac +done + +ac_given_srcdir=$srcdir +ac_given_INSTALL="$INSTALL" + +trap 'rm -fr `echo "cygwin-cc.mk:cygwin-cc.in cygwin-def.mk:cygwin-def.in freetype-config ftconfig.h:ftconfig.in" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15 +EOF +cat >> $CONFIG_STATUS < conftest.subs <<\\CEOF +$ac_vpsub +$extrasub +s%@SHELL@%$SHELL%g +s%@CFLAGS@%$CFLAGS%g +s%@CPPFLAGS@%$CPPFLAGS%g +s%@CXXFLAGS@%$CXXFLAGS%g +s%@FFLAGS@%$FFLAGS%g +s%@DEFS@%$DEFS%g +s%@LDFLAGS@%$LDFLAGS%g +s%@LIBS@%$LIBS%g +s%@exec_prefix@%$exec_prefix%g +s%@prefix@%$prefix%g +s%@program_transform_name@%$program_transform_name%g +s%@bindir@%$bindir%g +s%@sbindir@%$sbindir%g +s%@libexecdir@%$libexecdir%g +s%@datadir@%$datadir%g +s%@sysconfdir@%$sysconfdir%g +s%@sharedstatedir@%$sharedstatedir%g +s%@localstatedir@%$localstatedir%g +s%@libdir@%$libdir%g +s%@includedir@%$includedir%g +s%@oldincludedir@%$oldincludedir%g +s%@infodir@%$infodir%g +s%@mandir@%$mandir%g +s%@version_info@%$version_info%g +s%@host@%$host%g +s%@host_alias@%$host_alias%g +s%@host_cpu@%$host_cpu%g +s%@host_vendor@%$host_vendor%g +s%@host_os@%$host_os%g +s%@target@%$target%g +s%@target_alias@%$target_alias%g +s%@target_cpu@%$target_cpu%g +s%@target_vendor@%$target_vendor%g +s%@target_os@%$target_os%g +s%@build@%$build%g +s%@build_alias@%$build_alias%g +s%@build_cpu@%$build_cpu%g +s%@build_vendor@%$build_vendor%g +s%@build_os@%$build_os%g +s%@CC@%$CC%g +s%@CPP@%$CPP%g +s%@XX_CFLAGS@%$XX_CFLAGS%g +s%@XX_ANSIFLAGS@%$XX_ANSIFLAGS%g +s%@RMF@%$RMF%g +s%@RMDIR@%$RMDIR%g +s%@INSTALL_PROGRAM@%$INSTALL_PROGRAM%g +s%@INSTALL_SCRIPT@%$INSTALL_SCRIPT%g +s%@INSTALL_DATA@%$INSTALL_DATA%g +s%@FTSYS_SRC@%$FTSYS_SRC%g +s%@RANLIB@%$RANLIB%g +s%@LN_S@%$LN_S%g +s%@LIBTOOL@%$LIBTOOL%g + +CEOF +EOF + +cat >> $CONFIG_STATUS <<\EOF + +# Split the substitutions into bite-sized pieces for seds with +# small command number limits, like on Digital OSF/1 and HP-UX. +ac_max_sed_cmds=90 # Maximum number of lines to put in a sed script. +ac_file=1 # Number of current file. +ac_beg=1 # First line for current file. +ac_end=$ac_max_sed_cmds # Line after last line for current file. +ac_more_lines=: +ac_sed_cmds="" +while $ac_more_lines; do + if test $ac_beg -gt 1; then + sed "1,${ac_beg}d; ${ac_end}q" conftest.subs > conftest.s$ac_file + else + sed "${ac_end}q" conftest.subs > conftest.s$ac_file + fi + if test ! -s conftest.s$ac_file; then + ac_more_lines=false + rm -f conftest.s$ac_file + else + if test -z "$ac_sed_cmds"; then + ac_sed_cmds="sed -f conftest.s$ac_file" + else + ac_sed_cmds="$ac_sed_cmds | sed -f conftest.s$ac_file" + fi + ac_file=`expr $ac_file + 1` + ac_beg=$ac_end + ac_end=`expr $ac_end + $ac_max_sed_cmds` + fi +done +if test -z "$ac_sed_cmds"; then + ac_sed_cmds=cat +fi +EOF + +cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF +for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then + # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". + case "$ac_file" in + *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'` + ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; + *) ac_file_in="${ac_file}.in" ;; + esac + + # Adjust a relative srcdir, top_srcdir, and INSTALL for subdirectories. + + # Remove last slash and all that follows it. Not all systems have dirname. + ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'` + if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then + # The file is in a subdirectory. + test ! -d "$ac_dir" && mkdir "$ac_dir" + ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`" + # A "../" for each directory in $ac_dir_suffix. + ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'` + else + ac_dir_suffix= ac_dots= + fi + + case "$ac_given_srcdir" in + .) srcdir=. + if test -z "$ac_dots"; then top_srcdir=. + else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;; + /*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;; + *) # Relative path. + srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix" + top_srcdir="$ac_dots$ac_given_srcdir" ;; + esac + + case "$ac_given_INSTALL" in + [/$]*) INSTALL="$ac_given_INSTALL" ;; + *) INSTALL="$ac_dots$ac_given_INSTALL" ;; + esac + + echo creating "$ac_file" + rm -f "$ac_file" + configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure." + case "$ac_file" in + *Makefile*) ac_comsub="1i\\ +# $configure_input" ;; + *) ac_comsub= ;; + esac + + ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"` + sed -e "$ac_comsub +s%@configure_input@%$configure_input%g +s%@srcdir@%$srcdir%g +s%@top_srcdir@%$top_srcdir%g +s%@INSTALL@%$INSTALL%g +" $ac_file_inputs | (eval "$ac_sed_cmds") > $ac_file +fi; done +rm -f conftest.s* + +# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where +# NAME is the cpp macro being defined and VALUE is the value it is being given. +# +# ac_d sets the value in "#define NAME VALUE" lines. +ac_dA='s%^\([ ]*\)#\([ ]*define[ ][ ]*\)' +ac_dB='\([ ][ ]*\)[^ ]*%\1#\2' +ac_dC='\3' +ac_dD='%g' +# ac_u turns "#undef NAME" with trailing blanks into "#define NAME VALUE". +ac_uA='s%^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)' +ac_uB='\([ ]\)%\1#\2define\3' +ac_uC=' ' +ac_uD='\4%g' +# ac_e turns "#undef NAME" without trailing blanks into "#define NAME VALUE". +ac_eA='s%^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)' +ac_eB='$%\1#\2define\3' +ac_eC=' ' +ac_eD='%g' + +if test "${CONFIG_HEADERS+set}" != set; then +EOF +cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF +fi +for ac_file in .. $CONFIG_HEADERS; do if test "x$ac_file" != x..; then + # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". + case "$ac_file" in + *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'` + ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; + *) ac_file_in="${ac_file}.in" ;; + esac + + echo creating $ac_file + + rm -f conftest.frag conftest.in conftest.out + ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"` + cat $ac_file_inputs > conftest.in + +EOF + +# Transform confdefs.h into a sed script conftest.vals that substitutes +# the proper values into config.h.in to produce config.h. And first: +# Protect against being on the right side of a sed subst in config.status. +# Protect against being in an unquoted here document in config.status. +rm -f conftest.vals +cat > conftest.hdr <<\EOF +s/[\\&%]/\\&/g +s%[\\$`]%\\&%g +s%#define \([A-Za-z_][A-Za-z0-9_]*\) *\(.*\)%${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD}%gp +s%ac_d%ac_u%gp +s%ac_u%ac_e%gp +EOF +sed -n -f conftest.hdr confdefs.h > conftest.vals +rm -f conftest.hdr + +# This sed command replaces #undef with comments. This is necessary, for +# example, in the case of _POSIX_SOURCE, which is predefined and required +# on some systems where configure will not decide to define it. +cat >> conftest.vals <<\EOF +s%^[ ]*#[ ]*undef[ ][ ]*[a-zA-Z_][a-zA-Z_0-9]*%/* & */% +EOF + +# Break up conftest.vals because some shells have a limit on +# the size of here documents, and old seds have small limits too. + +rm -f conftest.tail +while : +do + ac_lines=`grep -c . conftest.vals` + # grep -c gives empty output for an empty file on some AIX systems. + if test -z "$ac_lines" || test "$ac_lines" -eq 0; then break; fi + # Write a limited-size here document to conftest.frag. + echo ' cat > conftest.frag <> $CONFIG_STATUS + sed ${ac_max_here_lines}q conftest.vals >> $CONFIG_STATUS + echo 'CEOF + sed -f conftest.frag conftest.in > conftest.out + rm -f conftest.in + mv conftest.out conftest.in +' >> $CONFIG_STATUS + sed 1,${ac_max_here_lines}d conftest.vals > conftest.tail + rm -f conftest.vals + mv conftest.tail conftest.vals +done +rm -f conftest.vals + +cat >> $CONFIG_STATUS <<\EOF + rm -f conftest.frag conftest.h + echo "/* $ac_file. Generated automatically by configure. */" > conftest.h + cat conftest.in >> conftest.h + rm -f conftest.in + if cmp -s $ac_file conftest.h 2>/dev/null; then + echo "$ac_file is unchanged" + rm -f conftest.h + else + # Remove last slash and all that follows it. Not all systems have dirname. + ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'` + if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then + # The file is in a subdirectory. + test ! -d "$ac_dir" && mkdir "$ac_dir" + fi + rm -f $ac_file + mv conftest.h $ac_file + fi +fi; done + +EOF +cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF + +exit 0 +EOF +chmod +x $CONFIG_STATUS +rm -fr confdefs* $ac_clean_files +test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1 + + Index: xc/extras/freetype2/builds/cygwin/configure.in diff -u /dev/null xc/extras/freetype2/builds/cygwin/configure.in:1.1.1.1 --- /dev/null Mon Dec 18 14:22:18 2000 +++ xc/extras/freetype2/builds/cygwin/configure.in Fri Dec 8 16:26:06 2000 @@ -0,0 +1,87 @@ +dnl This file is part of the FreeType project. +dnl +dnl Process this file with autoconf to produce a configure script. +dnl + +AC_INIT(ftconfig.in) + +dnl configuration file -- stay in 8.3 limit +AC_CONFIG_HEADER(ftconfig.h:ftconfig.in) + +version_info='6:1:0' +AC_SUBST(version_info) + +dnl checks for system type +AC_CANONICAL_SYSTEM + +dnl checks for programs +AC_PROG_CC +AC_PROG_CPP + +dnl get Compiler flags right. +if test "x$CC" = xgcc; then + XX_CFLAGS="-Wall" + 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) + +AC_CHECK_PROG(RMF, rm, rm -f) +AC_CHECK_PROG(RMDIR, rmdir, rmdir) + +dnl Since this file will be finally moved to another directory we make +dnl the path of the install script absolute. This small code snippet has +dnl been taken from automake's `ylwrap' script. +AC_PROG_INSTALL +case "$INSTALL" in + /*) + ;; + */*) + INSTALL="`pwd`/$INSTALL" ;; +esac + +dnl checks for header files +AC_HEADER_STDC +AC_CHECK_HEADERS(fcntl.h unistd.h) + +dnl checks for typedefs, structures, and compiler characteristics +AC_C_CONST +AC_CHECK_SIZEOF(int) +AC_CHECK_SIZEOF(long) + +dnl checks for library functions + +dnl Here we check whether we can use our mmap file component. +AC_FUNC_MMAP +if test "$ac_cv_func_mmap_fixed_mapped" != yes; then + FTSYS_SRC='$(BASE_)ftsystem.c' +else + FTSYS_SRC='$(BUILD)/ftsystem.c' + + FT_MUNMAP_DECL + FT_MUNMAP_PARAM +fi +AC_SUBST(FTSYS_SRC) + +AC_CHECK_FUNCS(memcpy memmove) + +AM_PROG_LIBTOOL + +dnl create the CygWin-specific sub-Makefile `builds/cygwin/cygwin-def.mk' +dnl and 'builds/cygwin/cygwin-cc.mk' that will be used by the build system +dnl +AC_OUTPUT(cygwin-cc.mk:cygwin-cc.in cygwin-def.mk:cygwin-def.in freetype-config) + +dnl end of configure.in Index: xc/extras/freetype2/builds/cygwin/cygwin-cc.in diff -u /dev/null xc/extras/freetype2/builds/cygwin/cygwin-cc.in:1.1.1.1 --- /dev/null Mon Dec 18 14:22:18 2000 +++ xc/extras/freetype2/builds/cygwin/cygwin-cc.in Fri Dec 8 16:26:06 2000 @@ -0,0 +1,79 @@ +# template for Unix-specific compiler definitions +# + +CC := @CC@ + +LIBTOOL := $(BUILD)/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 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 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 # Don't remove this comment line! We need the space after `-o'. + + +# C flags +# +# These should concern: debug output, optimization & warnings. +# +# Use the ANSIFLAGS variable to define the compiler flags used to enfore +# ANSI compliance. +# +CFLAGS := -c @XX_CFLAGS@ @CFLAGS@ + +# 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@ + + +# Library linking +# +LINK_LIBRARY = $(LIBTOOL) --mode=link $(CCraw) -o $@ $(OBJECTS_LIST) \ + -rpath $(libdir) -version-info $(version_info) + +# EOF Index: xc/extras/freetype2/builds/cygwin/cygwin-def.in diff -u /dev/null xc/extras/freetype2/builds/cygwin/cygwin-def.in:1.1.1.1 --- /dev/null Mon Dec 18 14:22:18 2000 +++ xc/extras/freetype2/builds/cygwin/cygwin-def.in Fri Dec 8 16:26:06 2000 @@ -0,0 +1,86 @@ +# +# FreeType 2 configuration rules templates for Unix + configure +# + + +# 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. + + +ifndef TOP + TOP := . +endif +TOP := $(shell cd $(TOP); pwd) + +DELETE := @RMF@ +DELDIR := @RMDIR@ +SEP := / +HOSTSEP := $(SEP) +BUILD := $(TOP)/builds/cygwin +PLATFORM := cygwin + +# 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)/mkinstalldirs + +DISTCLEAN += $(BUILD)/config.cache \ + $(BUILD)/config.log \ + $(BUILD)/config.status \ + $(BUILD)/cygwin-def.mk \ + $(BUILD)/cygwin-cc.mk \ + $(BUILD)/ftconfig.h \ + $(BUILD)/freetype-config \ + $(LIBTOOL) + + +# Standard installation variables. +# +prefix := @prefix@ +exec_prefix := @exec_prefix@ +libdir := @libdir@ +bindir := @bindir@ +includedir := @includedir@ + +version_info := @version_info@ + + +# The directory where all object files are placed. +# +# This lets you build the library in your own directory with something like +# +# set TOP=.../path/to/freetype2/top/dir... +# set OBJ_DIR=.../path/to/obj/dir +# make -f $TOP/Makefile setup [options] +# make -f $TOP/Makefile +# +ifndef OBJ_DIR + OBJ_DIR := $(shell cd $(TOP)/obj; pwd) +endif + + +# 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 NO_OUTPUT macro is appended to command lines in order to ignore +# the output of some programs. +# +NO_OUTPUT := 2> /dev/null + +# EOF Index: xc/extras/freetype2/builds/cygwin/cygwin-dev.mk diff -u /dev/null xc/extras/freetype2/builds/cygwin/cygwin-dev.mk:1.1.1.1 --- /dev/null Mon Dec 18 14:22:18 2000 +++ xc/extras/freetype2/builds/cygwin/cygwin-dev.mk Fri Dec 8 16:26:06 2000 @@ -0,0 +1,23 @@ +# +# FreeType 2 Configuration rules for CygWin + GCC +# +# 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)/builds/cygwin/cygwinddef.mk +include $(TOP)/builds/compiler/gcc-dev.mk +include $(TOP)/builds/link_std.mk + +# EOF Index: xc/extras/freetype2/builds/cygwin/cygwin.mk diff -u /dev/null xc/extras/freetype2/builds/cygwin/cygwin.mk:1.1.1.1 --- /dev/null Mon Dec 18 14:22:18 2000 +++ xc/extras/freetype2/builds/cygwin/cygwin.mk Fri Dec 8 16:26:06 2000 @@ -0,0 +1,46 @@ +# +# FreeType 2 configuration file for CygWin host platform. +# + + +# 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)/builds/cygwin/cygwin-def.mk +include $(TOP)/builds/cygwin/cygwin-cc.mk + +ifdef BUILD_PROJECT + + # Now include the main sub-makefile. It contains all the rules used to + # build the library with the previous variables defined. + # + include $(TOP)/builds/$(PROJECT).mk + + + # The cleanup targets. + # + clean_project: clean_project_cygwin + distclean_project: distclean_project_cygwin + + + # This final rule is used to link all object files into a single library. + # this is compiler-specific + # + $(PROJECT_LIBRARY): $(OBJECTS_LIST) + ifdef CLEAN_LIBRARY + -$(CLEAN_LIBRARY) $(NO_OUTPUT) + endif + $(LINK_LIBRARY) + +endif + +include $(TOP)/builds/cygwin/install.mk + +# EOF Index: xc/extras/freetype2/builds/cygwin/cygwinddef.mk diff -u /dev/null xc/extras/freetype2/builds/cygwin/cygwinddef.mk:1.1.1.1 --- /dev/null Mon Dec 18 14:22:18 2000 +++ xc/extras/freetype2/builds/cygwin/cygwinddef.mk Fri Dec 8 16:26:06 2000 @@ -0,0 +1,50 @@ +# +# FreeType 2 configuration rules templates for +# development under Unix-like platforms with no configure script (gcc only) +# + + +# 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. + + +ifndef TOP + TOP := . +endif +TOP := $(shell cd $(TOP); pwd) + +DELETE := rm -f +SEP := / +HOSTSEP := $(SEP) +# we use a special devel ftoption.h +BUILD := $(TOP)/builds/cygwin/devel +# do not set it to 'cygwin', or libtool will trick you +PLATFORM := cygwindev + +# The directory where all object files are placed. +# +ifndef OBJ_DIR + OBJ_DIR := $(shell cd $(TOP)/obj; pwd) +endif + +# 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 Index: xc/extras/freetype2/builds/cygwin/detect.mk diff -u /dev/null xc/extras/freetype2/builds/cygwin/detect.mk:1.1.1.1 --- /dev/null Mon Dec 18 14:22:18 2000 +++ xc/extras/freetype2/builds/cygwin/detect.mk Fri Dec 8 16:26:06 2000 @@ -0,0 +1,80 @@ +# +# FreeType 2 configuration file to detect a CygWin host platform. +# + + +# 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. + + +ifeq ($(PLATFORM),ansi) + + # Detecting Windows NT is easy, as the OS variable must be defined and + # contains `Windows_NT'. Untested with Windows 2K, but I guess it should + # work... + # + ifeq ($(OS),Windows_NT) + + # Check if we are running on a CygWin system by checking the OSTYPE + # variable. + ifeq ($(OSTYPE),cygwin) + is_cygwin := 1 + endif + + # We test for the COMSPEC environment variable, then run the `ver' + # command-line program to see if its output contains the word `Windows'. + # + # If this is true, we are running a win32 platform (or an emulation). + # + else + ifeq ($(OSTYPE),cygwin) + ifdef COMSPEC + is_cygwin := $(findstring Windows,$(strip $(shell ver))) + endif + endif # test CygWin + endif # test NT + + ifdef is_cygwin + + PLATFORM := cygwin + COPY := cp + DELETE := rm -f + + # If `devel' is the requested target, we use a special configuration + # file named `cygwin-dev.mk'. It disables optimization and libtool. + # + ifneq ($(findstring devel,$(MAKECMDGOALS)),) + CONFIG_FILE := cygwin-dev.mk + CC := gcc + devel: setup + else + # If a CygWin platform is detected, the configure script is called and + # `cygwin.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. + # + CONFIG_FILE := cygwin.mk + setup: cygwin-def.mk + cygwin: setup + endif + + setup: std_setup + + cygwin-def.mk: builds/cygwin/cygwin-def.in + cd builds/cygwin; \ + $(USE_CFLAGS) CONFIG_SHELL=/bin/bash ./configure $(CFG) + + endif # test CygWin +endif # test PLATFORM + +# EOF Index: xc/extras/freetype2/builds/cygwin/freetype-config.in diff -u /dev/null xc/extras/freetype2/builds/cygwin/freetype-config.in:1.1.1.1 --- /dev/null Mon Dec 18 14:22:18 2000 +++ xc/extras/freetype2/builds/cygwin/freetype-config.in Fri Dec 8 16:26:06 2000 @@ -0,0 +1,90 @@ +#!/bin/sh + +prefix=@prefix@ +exec_prefix=@exec_prefix@ +exec_prefix_set=no + +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 + ;; + --prefix) + echo_prefix=yes + ;; + --exec-prefix=*) + exec_prefix=$optarg + exec_prefix_set=yes + ;; + --exec-prefix) + echo_exec_prefix=yes + ;; + --version) + echo @version_info@ + exit 0 + ;; + --cflags) + echo_cflags=yes + ;; + --libs) + echo_libs=yes + ;; + --libtool) + echo_libtool=yes + ;; + *) + usage 1 1>&2 + ;; + esac + shift +done + +if test "$exec_prefix_set" = "no"; then + exec_prefix=$prefix +fi + +if test "$echo_prefix" = "yes"; then + echo $prefix +fi +if test "$echo_exec_prefix" = "yes"; then + echo $exec_prefix +fi +if test "$echo_cflags" = "yes"; then + cflags="-I@includedir@/freetype2" + echo $cflags $includes +fi +if test "$echo_libs" = "yes"; then + libs="-lfreetype" + echo -L@libdir@ $libs +fi +if test "$echo_libtool" = "yes"; then + convlib="libfreetype.la" + echo @libdir@/$convlib +fi + +# EOF Index: xc/extras/freetype2/builds/cygwin/ftconfig.in diff -u /dev/null xc/extras/freetype2/builds/cygwin/ftconfig.in:1.1.1.1 --- /dev/null Mon Dec 18 14:22:18 2000 +++ xc/extras/freetype2/builds/cygwin/ftconfig.in Fri Dec 8 16:26:06 2000 @@ -0,0 +1,261 @@ +/***************************************************************************/ +/* */ +/* ftconfig.in */ +/* */ +/* UNIX-specific configuration file (specification only). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* 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__ + +#ifndef FT_BUILD_H +# define FT_BUILD_H +#endif + + + /* Include the header file containing all developer build options */ +#include FT_BUILD_H +#include FT_CONFIG_OPTIONS_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 0 +#define HAVE_FCNTL_H 0 + +#define SIZEOF_INT 2 +#define SIZEOF_LONG 2 + + +#define FT_SIZEOF_INT SIZEOF_INT +#define FT_SIZEOF_LONG SIZEOF_LONG + + + /* Preferred alignment of data */ +#define FT_ALIGNMENT 8 + + + /* 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. */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* 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 + +#if FT_SIZEOF_LONG == 8 + + /* FT_LONG64 must be defined if a 64-bit type is available */ +#define FT_LONG64 +#define FT_INT64 long + +#else + + + /*************************************************************************/ + /* */ + /* Many compilers provide the non-ANSI `long long' 64-bit type. You can */ + /* activate it by defining the FTCALC_USE_LONG_LONG macro in */ + /* `ftoption.h'. */ + /* */ + /* Note that this will produce many -ansi warnings during library */ + /* compilation, and that in many cases, the generated code will be */ + /* neither smaller nor faster! */ + /* */ +#ifdef FTCALC_USE_LONG_LONG + +#define FT_LONG64 +#define FT_INT64 long long + +#endif /* FTCALC_USE_LONG_LONG */ +#endif /* FT_SIZEOF_LONG == 8 */ + + +#ifdef FT_MAKE_OPTION_SINGLE_OBJECT + +#define FT_LOCAL static +#define FT_LOCAL_DEF static + +#else + +#ifdef __cplusplus +#define FT_LOCAL extern "C" +#define FT_LOCAL_DEF extern "C" +#else +#define FT_LOCAL extern +#define FT_LOCAL_DEF extern +#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. Note that we do this for convenience -- please */ + /* don't ask for more C++ features. */ + /* */ + + /* 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. */ + /* */ +#ifdef __cplusplus + +#define FT_CALLBACK_DEF extern "C" +#define FT_CALLBACK_TABLE extern "C" +#define FT_CALLBACK_TABLE_DEF extern "C" + +#else + +#define FT_CALLBACK_DEF static +#define FT_CALLBACK_TABLE extern +#define FT_CALLBACK_TABLE_DEF + +#endif /* __cplusplus */ + + +FT_END_HEADER + +#endif /* __FTCONFIG_H__ */ + + +/* END */ Index: xc/extras/freetype2/builds/cygwin/ftsystem.c diff -u /dev/null xc/extras/freetype2/builds/cygwin/ftsystem.c:1.1.1.1 --- /dev/null Mon Dec 18 14:22:18 2000 +++ xc/extras/freetype2/builds/cygwin/ftsystem.c Fri Dec 8 16:26:06 2000 @@ -0,0 +1,334 @@ +/***************************************************************************/ +/* */ +/* ftsystem.c */ +/* */ +/* Unix-specific FreeType low-level system interface (body). */ +/* */ +/* 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 +#include +#include +#include +#include +#include + +#include +#include +#include + + + /* 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 + +#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. */ + /* */ + /* */ + /* block :: 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; + } + + + /*************************************************************************/ + /* */ + /* */ + /* FT_New_Stream */ + /* */ + /* */ + /* Creates a new stream object. */ + /* */ + /* */ + /* filepathname :: The name of the stream (usually a file) to be */ + /* opened. */ + /* */ + /* stream :: A pointer to the stream object. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + FT_EXPORT_DEF( FT_Error ) FT_New_Stream( const char* filepathname, + FT_Stream stream ) + { + 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_New_Stream:" )); + FT_ERROR(( " could not open `%s'\n", filepathname )); + return FT_Err_Cannot_Open_Resource; + } + + if ( fstat( file, &stat_buf ) < 0 ) + { + FT_ERROR(( "FT_New_Stream:" )); + 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_New_Stream:" )); + 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_New_Stream:" )); + 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; + } + + + /*************************************************************************/ + /* */ + /* */ + /* FT_New_Memory */ + /* */ + /* */ + /* Creates a new memory object. */ + /* */ + /* */ + /* A pointer to the new memory object. 0 in case of error. */ + /* */ + FT_EXPORT_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; + } + + return memory; + } + + + /*************************************************************************/ + /* */ + /* */ + /* FT_Done_Memory */ + /* */ + /* */ + /* Discards memory manager. */ + /* */ + /* */ + /* memory :: A handle to the memory manager. */ + /* */ + FT_EXPORT_DEF( void ) FT_Done_Memory( FT_Memory memory ) + { + free( memory ); + } + + +/* END */ Index: xc/extras/freetype2/builds/cygwin/install-sh diff -u /dev/null xc/extras/freetype2/builds/cygwin/install-sh:1.1.1.1 --- /dev/null Mon Dec 18 14:22:18 2000 +++ xc/extras/freetype2/builds/cygwin/install-sh Fri Dec 8 16:26:06 2000 @@ -0,0 +1,250 @@ +#! /bin/sh +# +# install - install a program, script, or datafile +# This comes from X11R5 (mit/util/scripts/install.sh). +# +# Copyright 1991 by the Massachusetts Institute of Technology +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of M.I.T. not be used in advertising or +# publicity pertaining to distribution of the software without specific, +# written prior permission. M.I.T. makes no representations about the +# suitability of this software for any purpose. It is provided "as is" +# without express or implied warranty. +# +# Calling this script install-sh is preferred over install.sh, to prevent +# `make' implicit rules from creating a file called install from it +# when there is no Makefile. +# +# This script is compatible with the BSD install script, but was written +# from scratch. It can only install one file at a time, a restriction +# shared with many OS's install programs. + + +# set DOITPROG to echo to test this script + +# Don't use :- since 4.3BSD and earlier shells don't like it. +doit="${DOITPROG-}" + + +# put in absolute paths if you don't have them in your path; or use env. vars. + +mvprog="${MVPROG-mv}" +cpprog="${CPPROG-cp}" +chmodprog="${CHMODPROG-chmod}" +chownprog="${CHOWNPROG-chown}" +chgrpprog="${CHGRPPROG-chgrp}" +stripprog="${STRIPPROG-strip}" +rmprog="${RMPROG-rm}" +mkdirprog="${MKDIRPROG-mkdir}" + +transformbasename="" +transform_arg="" +instcmd="$mvprog" +chmodcmd="$chmodprog 0755" +chowncmd="" +chgrpcmd="" +stripcmd="" +rmcmd="$rmprog -f" +mvcmd="$mvprog" +src="" +dst="" +dir_arg="" + +while [ x"$1" != x ]; do + case $1 in + -c) instcmd="$cpprog" + shift + continue;; + + -d) dir_arg=true + shift + continue;; + + -m) chmodcmd="$chmodprog $2" + shift + shift + continue;; + + -o) chowncmd="$chownprog $2" + shift + shift + continue;; + + -g) chgrpcmd="$chgrpprog $2" + shift + shift + continue;; + + -s) stripcmd="$stripprog" + shift + continue;; + + -t=*) transformarg=`echo $1 | sed 's/-t=//'` + shift + continue;; + + -b=*) transformbasename=`echo $1 | sed 's/-b=//'` + shift + continue;; + + *) if [ x"$src" = x ] + then + src=$1 + else + # this colon is to work around a 386BSD /bin/sh bug + : + dst=$1 + fi + shift + continue;; + esac +done + +if [ x"$src" = x ] +then + echo "install: no input file specified" + exit 1 +else + true +fi + +if [ x"$dir_arg" != x ]; then + dst=$src + src="" + + if [ -d $dst ]; then + instcmd=: + else + instcmd=mkdir + fi +else + +# Waiting for this to be detected by the "$instcmd $src $dsttmp" command +# might cause directories to be created, which would be especially bad +# if $src (and thus $dsttmp) contains '*'. + + if [ -f $src -o -d $src ] + then + true + else + echo "install: $src does not exist" + exit 1 + fi + + if [ x"$dst" = x ] + then + echo "install: no destination specified" + exit 1 + else + true + fi + +# If destination is a directory, append the input filename; if your system +# does not like double slashes in filenames, you may need to add some logic + + if [ -d $dst ] + then + dst="$dst"/`basename $src` + else + true + fi +fi + +## this sed command emulates the dirname command +dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` + +# Make sure that the destination directory exists. +# this part is taken from Noah Friedman's mkinstalldirs script + +# Skip lots of stat calls in the usual case. +if [ ! -d "$dstdir" ]; then +defaultIFS=' +' +IFS="${IFS-${defaultIFS}}" + +oIFS="${IFS}" +# Some sh's can't handle IFS=/ for some reason. +IFS='%' +set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'` +IFS="${oIFS}" + +pathcomp='' + +while [ $# -ne 0 ] ; do + pathcomp="${pathcomp}${1}" + shift + + if [ ! -d "${pathcomp}" ] ; + then + $mkdirprog "${pathcomp}" + else + true + fi + + pathcomp="${pathcomp}/" +done +fi + +if [ x"$dir_arg" != x ] +then + $doit $instcmd $dst && + + if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi && + if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi && + if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi && + if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi +else + +# If we're going to rename the final executable, determine the name now. + + if [ x"$transformarg" = x ] + then + dstfile=`basename $dst` + else + dstfile=`basename $dst $transformbasename | + sed $transformarg`$transformbasename + fi + +# don't allow the sed command to completely eliminate the filename + + if [ x"$dstfile" = x ] + then + dstfile=`basename $dst` + else + true + fi + +# Make a temp file name in the proper directory. + + dsttmp=$dstdir/#inst.$$# + +# Move or copy the file name to the temp name + + $doit $instcmd $src $dsttmp && + + trap "rm -f ${dsttmp}" 0 && + +# and set any options; do chmod last to preserve setuid bits + +# If any of these fail, we abort the whole thing. If we want to +# ignore errors from any of these, just make sure not to ignore +# errors from the above "$doit $instcmd $src $dsttmp" command. + + if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi && + if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi && + if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi && + if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi && + +# Now rename the file to the real destination. + + $doit $rmcmd -f $dstdir/$dstfile && + $doit $mvcmd $dsttmp $dstdir/$dstfile + +fi && + + +exit 0 Index: xc/extras/freetype2/builds/cygwin/install.mk diff -u /dev/null xc/extras/freetype2/builds/cygwin/install.mk:1.1.1.1 --- /dev/null Mon Dec 18 14:22:18 2000 +++ xc/extras/freetype2/builds/cygwin/install.mk Fri Dec 8 16:26:06 2000 @@ -0,0 +1,67 @@ +# +# FreeType 2 installation instructions for Unix systems +# + + +# Copyright 1996-2000 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +# Unix installation and deinstallation targets. +install: $(PROJECT_LIBRARY) + $(MKINSTALLDIRS) $(libdir) \ + $(includedir)/freetype2/freetype/config \ + $(includedir)/freetype2/freetype/internal \ + $(includedir)/freetype2/freetype/cache \ + $(bindir) + $(LIBTOOL) --mode=install $(INSTALL) $(PROJECT_LIBRARY) $(libdir) + -for P in $(PUBLIC_H) ; do \ + $(INSTALL_DATA) $$P $(includedir)/freetype2/freetype ; \ + done + -for P in $(BASE_H) ; do \ + $(INSTALL_DATA) $$P $(includedir)/freetype2/freetype/internal ; \ + done + -for P in $(CONFIG_H) ; do \ + $(INSTALL_DATA) $$P $(includedir)/freetype2/freetype/config ; \ + done + -for P in $(CACHE_H) ; do \ + $(INSTALL_DATA) $$P $(includedir)/freetype2/freetype/cache ; \ + done + $(INSTALL_SCRIPT) -m 755 $(BUILD)/freetype-config \ + $(bindir)/freetype-config + + +uninstall: + -$(LIBTOOL) --mode=uninstall $(RM) $(libdir)/$(PROJECT_LIBRARY) + -$(DELETE) $(includedir)/freetype2/freetype/cache/* + -$(DELDIR) $(includedir)/freetype2/freetype/cache + -$(DELETE) $(includedir)/freetype2/freetype/config/* + -$(DELDIR) $(includedir)/freetype2/freetype/config + -$(DELETE) $(includedir)/freetype2/freetype/internal/* + -$(DELDIR) $(includedir)/freetype2/freetype/internal + -$(DELETE) $(includedir)/freetype2/freetype/* + -$(DELDIR) $(includedir)/freetype2/freetype + -$(DELDIR) $(includedir)/freetype2 + -$(DELETE) $(bindir)/freetype-config + + +# Unix cleaning and distclean rules. +# +clean_project_cygwin: + -$(DELETE) $(BASE_OBJECTS) $(OBJ_M) $(OBJ_S) + -$(DELETE) $(patsubst %.$O,%.$(SO),$(BASE_OBJECTS) $(OBJ_M) $(OBJ_S)) \ + $(CLEAN) + +distclean_project_cygwin: clean_project_cygwin + -$(DELETE) $(PROJECT_LIBRARY) + -$(DELETE) $(OBJ_DIR)/.libs/* + -$(DELDIR) $(OBJ_DIR)/.libs + -$(DELETE) *.orig *~ core *.core $(DISTCLEAN) + +# EOF Index: xc/extras/freetype2/builds/cygwin/libtool diff -u /dev/null xc/extras/freetype2/builds/cygwin/libtool:1.1.1.1 --- /dev/null Mon Dec 18 14:22:18 2000 +++ xc/extras/freetype2/builds/cygwin/libtool Fri Dec 8 16:26:06 2000 @@ -0,0 +1,4303 @@ +#! /bin/bash + +# libtool - Provide generalized library-building support services. +# Generated automatically by ltconfig (GNU libtool 1.3.5 (1.385.2.206 2000/05/27 11:12:27)) +# NOTE: Changes made to this file will be lost: look at ltconfig or ltmain.sh. +# +# Copyright (C) 1996-1999 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. + +# 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 as follows, on host MKPC5090: +# +# CC="gcc" CFLAGS="-g -O2" CPPFLAGS="" \ +# LD="/usr/bin/ld" LDFLAGS="" LIBS="" \ +# NM="/usr/bin/nm -B" RANLIB="ranlib" LN_S="ln -s" \ +# DLLTOOL="" OBJDUMP="" AS="" \ +# ./ltconfig --cache-file=./config.cache --with-gcc --with-gnu-ld --no-verify ./ltmain.sh i686-pc-cygwin +# +# Compiler and other test output produced by ltconfig, useful for +# debugging ltconfig, is in ./config.log if it exists. + +# The version of ltconfig that generated this script. +LTCONFIG_VERSION="1.3.5" + +# Shell to use when invoking shell scripts. +SHELL="/bin/bash" + +# Whether or not to build shared libraries. +build_libtool_libs=no + +# Whether or not to build static libraries. +build_old_libs=yes + +# Whether or not to optimize for fast installation. +fast_install=needless + +# The host system. +host_alias=i686-pc-cygwin +host=i686-pc-cygwin + +# An echo program that does not interpret backslashes. +echo="echo" + +# The archiver. +AR="ar" + +# The default C compiler. +CC="gcc" + +# The linker used to build libraries. +LD="/usr/bin/ld" + +# Whether we need hard or soft links. +LN_S="ln -s" + +# A BSD-compatible nm program. +NM="/usr/bin/nm -B" + +# 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=.libs + +# How to create reloadable object files. +reload_flag=" -r" +reload_cmds="\$LD\$reload_flag -o \$output\$reload_objs" + +# How to pass a linker flag through the compiler. +wl="-Wl," + +# Object file suffix (normally "o"). +objext="o" + +# Old archive suffix (normally "a"). +libext="a" + +# Executable file suffix (normally ""). +exeext=".exe" + +# Additional compiler flags for building library objects. +pic_flag="" + +# Does compiler simultaneously support -c and -o options? +compiler_c_o="yes" + +# Can we write directly to a .lo ? +compiler_o_lo="yes" + +# Must we lock files when doing compilation ? +need_locks="no" + +# Do we need the lib prefix for modules? +need_lib_prefix=no + +# Do we need a version for libraries? +need_version=no + +# Whether dlopen is supported. +dlopen=unknown + +# Whether dlopen of programs is supported. +dlopen_self=unknown + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=unknown + +# Compiler flag to prevent dynamic linking. +link_static_flag="-static" + +# Compiler flag to turn off builtin functions. +no_builtin_flag=" -fno-builtin -fno-rtti -fno-exceptions" + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec="\${wl}--export-dynamic" + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec="" + +# Compiler flag to generate thread-safe objects. +thread_safe_flag_spec="" + +# Library versioning type. +version_type=windows + +# Format of library name prefix. +libname_spec="lib\$name" + +# 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="\${libname}\`echo \${release} | sed -e s/[.]/-/g\`\${versuffix}.dll \$libname.a" + +# The coded name of the library, if different from the real name. +soname_spec="" + +# Commands used to build and install an old-style archive. +RANLIB="ranlib" +old_archive_cmds="\$AR cru \$oldlib\$oldobjs~\$RANLIB \$oldlib" +old_postinstall_cmds="\$RANLIB \$oldlib~chmod 644 \$oldlib" +old_postuninstall_cmds="" + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds="\$DLLTOOL --as=\$AS --dllname \$soname --def \$objdir/\$soname-def --output-lib \$objdir/\$libname.a" + +# Commands used to build and install a shared archive. +archive_cmds="" +archive_expsym_cmds="echo EXPORTS > \$objdir/\$soname-def~ + _lt_hint=1; + cat \$export_symbols | while read symbol; do + set dummy \\\$symbol; + case \\\$# in + 2) echo \\\" \\\$2 @ \\\$_lt_hint ; \\\" >> \$objdir/\$soname-def;; + *) echo \\\" \\\$2 @ \\\$_lt_hint \\\$3 ; \\\" >> \$objdir/\$soname-def;; + esac; + _lt_hint=\\\`expr 1 + \\\$_lt_hint\\\`; + done~ + test -f \$objdir/\$soname-ltdll.c || sed -e \\\"/^# \\\\/\\\\* ltdll\\\\.c starts here \\\\*\\\\//,/^# \\\\/\\\\* ltdll.c ends here \\\\*\\\\// { s/^# //; p; }\\\" -e d < \$0 > \$objdir/\$soname-ltdll.c~ + test -f \$objdir/\$soname-ltdll.\$objext || (cd \$objdir && \$CC -c \$soname-ltdll.c)~ + \$CC -Wl,--base-file,\$objdir/\$soname-base -Wl,--dll -nostartfiles -Wl,-e,__cygwin_dll_entry@12 -o \$lib \$objdir/\$soname-ltdll.\$objext \$libobjs \$deplibs \$linkopts~ + \$DLLTOOL --as=\$AS --dllname \$soname --exclude-symbols DllMain@12,_cygwin_dll_entry@12,_cygwin_noncygwin_dll_entry@12 --def \$objdir/\$soname-def --base-file \$objdir/\$soname-base --output-exp \$objdir/\$soname-exp~ + \$CC -Wl,--base-file,\$objdir/\$soname-base \$objdir/\$soname-exp -Wl,--dll -nostartfiles -Wl,-e,__cygwin_dll_entry@12 -o \$lib \$objdir/\$soname-ltdll.\$objext \$libobjs \$deplibs \$linkopts~ + \$DLLTOOL --as=\$AS --dllname \$soname --exclude-symbols DllMain@12,_cygwin_dll_entry@12,_cygwin_noncygwin_dll_entry@12 --def \$objdir/\$soname-def --base-file \$objdir/\$soname-base --output-exp \$objdir/\$soname-exp~ + \$CC \$objdir/\$soname-exp -Wl,--dll -nostartfiles -Wl,-e,__cygwin_dll_entry@12 -o \$lib \$objdir/\$soname-ltdll.\$objext \$libobjs \$deplibs \$linkopts" +postinstall_cmds="" +postuninstall_cmds="" + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method="file_magic file format pei*-i386(.*architecture: i386)?" + +# Command to use when deplibs_check_method == file_magic. +file_magic_cmd="\${OBJDUMP} -f" + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag="unsupported" + +# Flag that forces no undefined symbols. +no_undefined_flag="" + +# Commands used to finish a libtool library installation in a directory. +finish_cmds="" + +# Same as above, but a single script fragment to be evaled but not shown. +finish_eval="" + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe="sed -n -e 's/^.*[ ]\\([ABCDGISTW]\\)[ ][ ]*\\(_\\)\\([_A-Za-z][_A-Za-z0-9]*\\)\$/\\1 \\2\\3 \\3/p'" + +# Transform the output of nm in a proper C declaration +global_symbol_to_cdecl="sed -n -e 's/^. .* \\(.*\\)\$/extern char \\1;/p'" + +# This is the shared library runtime path variable. +runpath_var=LD_RUN_PATH + +# This is the shared library path variable. +shlibpath_var=PATH + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=unknown + +# How to hardcode a shared library path into an executable. +hardcode_action=immediate + +# Flag to hardcode $libdir into a binary during linking. +# This must work even if $libdir does not exist. +hardcode_libdir_flag_spec="\${wl}--rpath \${wl}\$libdir" + +# Whether we need a single -rpath flag with a separated argument. +hardcode_libdir_separator="" + +# Set to yes if using DIR/libNAME.so during linking hardcodes DIR into the +# resulting binary. +hardcode_direct=no + +# Set to yes if using the -LDIR flag during linking hardcodes DIR into the +# resulting binary. +hardcode_minus_L=no + +# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into +# the resulting binary. +hardcode_shlibpath_var=unsupported + +# Compile-time system search path for libraries +sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" + +# Run-time system search path for libraries +sys_lib_dlsearch_path_spec="/lib /usr/lib" + +# Fix the shell variable $srcfile for the compiler. +fix_srcfile_path="" + +# Set to yes if exported symbols are required. +always_export_symbols=yes + +# The commands to list exported symbols. +export_symbols_cmds="test -f \$objdir/\$soname-ltdll.c || sed -e \\\"/^# \\\\/\\\\* ltdll\\\\.c starts here \\\\*\\\\//,/^# \\\\/\\\\* ltdll.c ends here \\\\*\\\\// { s/^# //; p; }\\\" -e d < \$0 > \$objdir/\$soname-ltdll.c~ + test -f \$objdir/\$soname-ltdll.\$objext || (cd \$objdir && \$CC -c \$soname-ltdll.c)~ + \$DLLTOOL --export-all --exclude-symbols DllMain@12,_cygwin_dll_entry@12,_cygwin_noncygwin_dll_entry@12 --output-def \$objdir/\$soname-def \$objdir/\$soname-ltdll.\$objext \$libobjs \$convenience~ + sed -e \\\"1,/EXPORTS/d\\\" -e \\\"s/ @ [0-9]*//\\\" -e \\\"s/ *;.*\$//\\\" < \$objdir/\$soname-def > \$export_symbols" + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms="_GLOBAL_OFFSET_TABLE_" + +# Symbols that must always be exported. +include_expsyms="" + +### END LIBTOOL CONFIG + +# ltmain.sh - Provide generalized library-building support services. +# NOTE: Changing this file will not affect anything until you rerun ltconfig. +# +# Copyright (C) 1996-1999 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 + +if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then + echo "$modename: not configured to build any kind of library" 1>&2 + echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2 + exit 1 +fi + +# Global variables. +mode=$default_mode +nonopt= +prev= +prevopt= +run= +show="$echo" +show_help= +execute_dlfiles= +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) + eval "$prev=\"\$$prev \$arg\"" + ;; + *) + eval "$prev=\$arg" + ;; + esac + + prev= + prevopt= + continue + fi + + # Have we seen a non-optional argument yet? + case "$arg" in + --help) + show_help=yes + ;; + + --version) + echo "$PROGRAM (GNU $PACKAGE) $VERSION$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" ;; + + --quiet | --silent) + show=: + ;; + + -dlopen) + prevopt="-dlopen" + prev=execute_dlfiles + ;; + + -*) + $echo "$modename: unrecognized option \`$arg'" 1>&2 + $echo "$help" 1>&2 + exit 1 + ;; + + *) + nonopt="$arg" + break + ;; + esac +done + +if test -n "$prevopt"; then + $echo "$modename: option \`$prevopt' requires an argument" 1>&2 + $echo "$help" 1>&2 + exit 1 +fi + +if test -z "$show_help"; then + + # Infer the operation mode. + if test -z "$mode"; then + case "$nonopt" in + *cc | *++ | gcc* | *-gcc*) + mode=link + for arg + do + case "$arg" in + -c) + mode=compile + break + ;; + esac + done + ;; + *db | *dbx | *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= + lastarg= + srcfile="$nonopt" + suppress_output= + + user_target=no + for arg + do + # 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 + ;; + 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 + + # 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 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 + + # All platforms use -DPIC, to notify preprocessed assembler code. + command="$base_compile $srcfile $pic_flag -DPIC" + 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 "$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 + 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 + command="$base_compile $srcfile" + 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 + $rm "$lockfile" + fi + + exit 0 + ;; + + # libtool link mode + link) + modename="$modename: link" + case "$host" in + *-*-cygwin* | *-*-mingw* | *-*-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 + + # 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 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() */ +# +# 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) +# 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&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 + + # 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= + ;; + 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 + ;; + 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 + ;; + *) + eval "$prev=\"\$arg\"" + prev= + continue + ;; + esac + fi + + prevarg="$arg" + + case "$arg" in + -all-static) + if test -n "$link_static_flag"; then + compile_command="$compile_command $link_static_flag" + finalize_command="$finalize_command $link_static_flag" + fi + continue + ;; + + -allow-undefined) + # FIXME: remove this flag sometime in the future. + $echo "$modename: \`-allow-undefined' is deprecated because it is the default" 1>&2 + continue + ;; + + -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: not more than one -exported-symbols argument allowed" + exit 1 + fi + if test "X$arg" = "X-export-symbols"; then + prev=expsyms + else + prev=expsyms_regex + fi + 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: warning: cannot determine absolute directory name of \`$dir'" 1>&2 + $echo "$modename: passing it literally to the linker, although it might fail" 1>&2 + absdir="$dir" + fi + dir="$absdir" + ;; + esac + case " $deplibs " in + *" $arg "*) ;; + *) deplibs="$deplibs $arg";; + esac + case " $lib_search_path " in + *" $dir "*) ;; + *) lib_search_path="$lib_search_path $dir";; + esac + case "$host" in + *-*-cygwin* | *-*-mingw* | *-*-os2*) + dllsearchdir=`cd "$dir" && pwd || echo "$dir"` + case ":$dllsearchpath:" in + ::) dllsearchpath="$dllsearchdir";; + *":$dllsearchdir:"*) ;; + *) dllsearchpath="$dllsearchpath:$dllsearchdir";; + esac + ;; + esac + ;; + + -l*) + if test "$arg" = "-lc"; then + case "$host" in + *-*-cygwin* | *-*-mingw* | *-*-os2* | *-*-beos*) + # These systems don't actually have c library (as such) + continue + ;; + esac + elif test "$arg" = "-lm"; then + case "$host" in + *-*-cygwin* | *-*-beos*) + # These systems don't actually have math library (as such) + continue + ;; + esac + fi + deplibs="$deplibs $arg" + ;; + + -module) + module=yes + 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) + # If we have no pic_flag, then this is the same as -all-static. + if test -z "$pic_flag" && test -n "$link_static_flag"; then + compile_command="$compile_command $link_static_flag" + finalize_command="$finalize_command $link_static_flag" + fi + continue + ;; + + -thread-safe) + thread_safe=yes + continue + ;; + + -version-info) + prev=vinfo + continue + ;; + + # Some other compiler flag. + -* | +*) + # Unknown arguments in both finalize_command and compile_command need + # to be aesthetically quoted because they are evaled later. + arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` + case "$arg" in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*) + arg="\"$arg\"" + ;; + esac + ;; + + *.o | *.obj | *.a | *.lib) + # A standard object. + objs="$objs $arg" + ;; + + *.lo) + # A library object. + if test "$prev" = dlfiles; then + dlfiles="$dlfiles $arg" + if test "$build_libtool_libs" = yes && test "$dlopen" = yes; then + prev= + continue + else + # If libtool objects are unsupported, then we need to preload. + prev=dlprefiles + fi + fi + + if test "$prev" = dlprefiles; then + # Preload the old-style object. + dlprefiles="$dlprefiles "`$echo "X$arg" | $Xsed -e "$lo2o"` + prev= + fi + libobjs="$libobjs $arg" + ;; + + *.la) + # A libtool-controlled library. + + dlname= + libdir= + library_names= + old_library= + + # Check to see that this really is a libtool archive. + if (sed -e '2q' $arg | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : + else + $echo "$modename: \`$arg' is not a valid libtool archive" 1>&2 + exit 1 + fi + + # If the library was installed with an old release of libtool, + # it will not redefine variable installed. + installed=yes + + # Read the .la file + # If there is no directory component, then add one. + case "$arg" in + */* | *\\*) . $arg ;; + *) . ./$arg ;; + esac + + # Get the name of the library we link against. + linklib= + for l in $old_library $library_names; do + linklib="$l" + done + + if test -z "$linklib"; then + $echo "$modename: cannot find name of link library for \`$arg'" 1>&2 + exit 1 + fi + + # Find the relevant object directory and library name. + name=`$echo "X$arg" | $Xsed -e 's%^.*/%%' -e 's/\.la$//' -e 's/^lib//'` + + if test "X$installed" = Xyes; then + dir="$libdir" + else + dir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` + if test "X$dir" = "X$arg"; then + dir="$objdir" + else + dir="$dir/$objdir" + fi + fi + + if test -n "$dependency_libs"; then + # Extract -R and -L from dependency_libs + temp_deplibs= + for deplib in $dependency_libs; do + case "$deplib" in + -R*) temp_xrpath=`$echo "X$deplib" | $Xsed -e 's/^-R//'` + case " $rpath $xrpath " in + *" $temp_xrpath "*) ;; + *) xrpath="$xrpath $temp_xrpath";; + esac;; + -L*) case "$compile_command $temp_deplibs " in + *" $deplib "*) ;; + *) temp_deplibs="$temp_deplibs $deplib";; + esac + temp_dir=`$echo "X$deplib" | $Xsed -e 's/^-L//'` + case " $lib_search_path " in + *" $temp_dir "*) ;; + *) lib_search_path="$lib_search_path $temp_dir";; + esac + ;; + *) temp_deplibs="$temp_deplibs $deplib";; + esac + done + dependency_libs="$temp_deplibs" + fi + + if test -z "$libdir"; then + # It is a libtool convenience library, so add in its objects. + convenience="$convenience $dir/$old_library" + old_convenience="$old_convenience $dir/$old_library" + deplibs="$deplibs$dependency_libs" + compile_command="$compile_command $dir/$old_library$dependency_libs" + finalize_command="$finalize_command $dir/$old_library$dependency_libs" + continue + fi + + # This library was specified with -dlopen. + if test "$prev" = dlfiles; then + dlfiles="$dlfiles $arg" + if test -z "$dlname" || test "$dlopen" != yes || test "$build_libtool_libs" = no; then + # If there is no dlname, no dlopen support or we're linking statically, + # we need to preload. + prev=dlprefiles + else + # We should not create a dependency on this library, but we + # may need any libraries it requires. + compile_command="$compile_command$dependency_libs" + finalize_command="$finalize_command$dependency_libs" + prev= + continue + fi + fi + + # The library was specified with -dlpreopen. + if test "$prev" = dlprefiles; then + # Prefer using a static library (so that no silly _DYNAMIC symbols + # are required to link). + if test -n "$old_library"; then + dlprefiles="$dlprefiles $dir/$old_library" + else + dlprefiles="$dlprefiles $dir/$linklib" + fi + prev= + fi + + if test -n "$library_names" && + { test "$prefer_static_libs" = no || test -z "$old_library"; }; then + link_against_libtool_libs="$link_against_libtool_libs $arg" + if test -n "$shlibpath_var"; then + # Make sure the rpath contains only unique directories. + case "$temp_rpath " in + *" $dir "*) ;; + *) temp_rpath="$temp_rpath $dir" ;; + esac + fi + + # 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 + $echo "$modename: passing it literally to the linker, although it might fail" 1>&2 + absdir="$dir" + fi + ;; + esac + + # This is the magic to use -rpath. + # Skip directories that are in the system default run-time + # search path, unless they have been requested with -R. + 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 + + lib_linked=yes + case "$hardcode_action" in + immediate | unsupported) + if test "$hardcode_direct" = no; then + compile_command="$compile_command $dir/$linklib" + deplibs="$deplibs $dir/$linklib" + case "$host" in + *-*-cygwin* | *-*-mingw* | *-*-os2*) + dllsearchdir=`cd "$dir" && pwd || echo "$dir"` + if test -n "$dllsearchpath"; then + dllsearchpath="$dllsearchpath:$dllsearchdir" + else + dllsearchpath="$dllsearchdir" + fi + ;; + esac + elif test "$hardcode_minus_L" = no; then + case "$host" in + *-*-sunos*) + compile_shlibpath="$compile_shlibpath$dir:" + ;; + esac + case "$compile_command " in + *" -L$dir "*) ;; + *) compile_command="$compile_command -L$dir";; + esac + compile_command="$compile_command -l$name" + deplibs="$deplibs -L$dir -l$name" + elif test "$hardcode_shlibpath_var" = no; then + case ":$compile_shlibpath:" in + *":$dir:"*) ;; + *) compile_shlibpath="$compile_shlibpath$dir:";; + esac + compile_command="$compile_command -l$name" + deplibs="$deplibs -l$name" + else + lib_linked=no + fi + ;; + + relink) + if test "$hardcode_direct" = yes; then + compile_command="$compile_command $absdir/$linklib" + deplibs="$deplibs $absdir/$linklib" + elif test "$hardcode_minus_L" = yes; then + case "$compile_command " in + *" -L$absdir "*) ;; + *) compile_command="$compile_command -L$absdir";; + esac + compile_command="$compile_command -l$name" + deplibs="$deplibs -L$absdir -l$name" + elif test "$hardcode_shlibpath_var" = yes; then + case ":$compile_shlibpath:" in + *":$absdir:"*) ;; + *) compile_shlibpath="$compile_shlibpath$absdir:";; + esac + compile_command="$compile_command -l$name" + deplibs="$deplibs -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 + + # Finalize command for both is simple: just hardcode it. + if test "$hardcode_direct" = yes; then + finalize_command="$finalize_command $libdir/$linklib" + elif test "$hardcode_minus_L" = yes; then + case "$finalize_command " in + *" -L$libdir "*) ;; + *) finalize_command="$finalize_command -L$libdir";; + esac + finalize_command="$finalize_command -l$name" + elif test "$hardcode_shlibpath_var" = yes; then + case ":$finalize_shlibpath:" in + *":$libdir:"*) ;; + *) finalize_shlibpath="$finalize_shlibpath$libdir:";; + esac + finalize_command="$finalize_command -l$name" + else + # We cannot seem to hardcode it, guess we'll fake it. + case "$finalize_command " in + *" -L$dir "*) ;; + *) finalize_command="$finalize_command -L$libdir";; + esac + finalize_command="$finalize_command -l$name" + fi + else + # Transform directly to old archives if we don't build new libraries. + if test -n "$pic_flag" && test -z "$old_library"; then + $echo "$modename: cannot find static library for \`$arg'" 1>&2 + exit 1 + fi + + # Here we assume that one of hardcode_direct or hardcode_minus_L + # is not unsupported. This is valid on all known static and + # shared platforms. + if test "$hardcode_direct" != unsupported; then + test -n "$old_library" && linklib="$old_library" + compile_command="$compile_command $dir/$linklib" + finalize_command="$finalize_command $dir/$linklib" + else + case "$compile_command " in + *" -L$dir "*) ;; + *) compile_command="$compile_command -L$dir";; + esac + compile_command="$compile_command -l$name" + case "$finalize_command " in + *" -L$dir "*) ;; + *) finalize_command="$finalize_command -L$dir";; + esac + finalize_command="$finalize_command -l$name" + fi + fi + + # Add in any libraries that this one depends upon. + compile_command="$compile_command$dependency_libs" + finalize_command="$finalize_command$dependency_libs" + continue + ;; + + # Some other compiler argument. + *) + # Unknown arguments in both finalize_command and compile_command need + # to be aesthetically quoted because they are evaled later. + arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` + case "$arg" in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*) + arg="\"$arg\"" + ;; + esac + ;; + esac + + # Now actually substitute the argument into the commands. + if test -n "$arg"; then + compile_command="$compile_command $arg" + finalize_command="$finalize_command $arg" + fi + done + + if test -n "$prev"; then + $echo "$modename: the \`$prevarg' option requires an argument" 1>&2 + $echo "$help" 1>&2 + exit 1 + fi + + if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then + eval arg=\"$export_dynamic_flag_spec\" + compile_command="$compile_command $arg" + finalize_command="$finalize_command $arg" + fi + + oldlibs= + # calculate the name of the file, without its directory + outputname=`$echo "X$output" | $Xsed -e 's%^.*/%%'` + libobjs_save="$libobjs" + + case "$output" in + "") + $echo "$modename: you must specify an output file" 1>&2 + $echo "$help" 1>&2 + exit 1 + ;; + + *.a | *.lib) + if test -n "$link_against_libtool_libs"; then + $echo "$modename: error: cannot link libtool libraries into archives" 1>&2 + exit 1 + fi + + if test -n "$deplibs"; then + $echo "$modename: warning: \`-l' and \`-L' are ignored for archives" 1>&2 + fi + + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + $echo "$modename: warning: \`-dlopen' is ignored for archives" 1>&2 + fi + + if test -n "$rpath"; then + $echo "$modename: warning: \`-rpath' is ignored for archives" 1>&2 + fi + + if test -n "$xrpath"; then + $echo "$modename: warning: \`-R' is ignored for archives" 1>&2 + fi + + if test -n "$vinfo"; then + $echo "$modename: warning: \`-version-info' 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" + ;; + + *.la) + # 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 + + 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 + + if test -n "$objs"; then + $echo "$modename: cannot build libtool library \`$output' from non-libtool objects:$objs" 2>&1 + exit 1 + fi + + # How the heck are we supposed to write a wrapper for a shared library? + if test -n "$link_against_libtool_libs"; then + $echo "$modename: error: cannot link shared libraries into libtool libraries" 1>&2 + exit 1 + fi + + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + $echo "$modename: warning: \`-dlopen' 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 + dependency_libs="$deplibs" + + 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. + IFS="${IFS= }"; 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]*) ;; + *) + $echo "$modename: CURRENT \`$current' is not a nonnegative integer" 1>&2 + $echo "$modename: \`$vinfo' is not valid version information" 1>&2 + exit 1 + ;; + esac + + case "$revision" in + 0 | [1-9] | [1-9][0-9]*) ;; + *) + $echo "$modename: REVISION \`$revision' is not a nonnegative integer" 1>&2 + $echo "$modename: \`$vinfo' is not valid version information" 1>&2 + exit 1 + ;; + esac + + case "$age" in + 0 | [1-9] | [1-9][0-9]*) ;; + *) + $echo "$modename: AGE \`$age' is not a nonnegative integer" 1>&2 + $echo "$modename: \`$vinfo' is not valid version information" 1>&2 + exit 1 + ;; + esac + + if test $age -gt $current; then + $echo "$modename: AGE \`$age' is greater than the current interface number \`$current'" 1>&2 + $echo "$modename: \`$vinfo' is not valid version information" 1>&2 + exit 1 + fi + + # Calculate the version variables. + major= + versuffix= + verstring= + case "$version_type" in + none) ;; + + irix) + major=`expr $current - $age + 1` + versuffix="$major.$revision" + verstring="sgi$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="sgi$major.$iface:$verstring" + done + ;; + + 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" + ;; + + freebsd-aout) + major=".$current" + versuffix=".$current.$revision"; + ;; + + freebsd-elf) + major=".$current" + versuffix=".$current"; + ;; + + windows) + # Like Linux, but with '-' rather than '.', since we only + # want one extension on Windows 95. + major=`expr $current - $age` + versuffix="-$major-$age-$revision" + ;; + + *) + $echo "$modename: unknown library version type \`$version_type'" 1>&2 + echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2 + exit 1 + ;; + esac + + # Clear the version info if we defaulted, and they specified a release. + if test -z "$vinfo" && test -n "$release"; then + major= + verstring="0.0" + 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 + + dependency_libs="$deplibs" + case "$host" in + *-*-cygwin* | *-*-mingw* | *-*-os2* | *-*-beos*) + # these systems don't actually have a c library (as such)! + ;; + *-*-rhapsody*) + # rhapsody is a little odd... + deplibs="$deplibs -framework System" + ;; + *) + # Add libc to deplibs on all other systems. + deplibs="$deplibs -lc" + ;; + esac + fi + + # Create the output directory, or remove our outputs if we need to. + if test -d $output_objdir; then + $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}.* + else + $show "$mkdir $output_objdir" + $run $mkdir $output_objdir + status=$? + if test $status -ne 0 && test ! -d $output_objdir; then + exit $status + fi + fi + + # Now set the variables for building old libraries. + if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then + oldlibs="$oldlibs $output_objdir/$libname.$libext" + + # Transform .lo files to .o files. + oldobjs="$objs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}'$/d' -e "$lo2o" | $NL2SP` + fi + + if test "$build_libtool_libs" = yes; then + # 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: This library needs some functionality provided by $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." + 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 + + 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." + 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 + # Get the real and link names of the library. + eval library_names=\"$library_names_spec\" + set dummy $library_names + realname="$2" + shift; shift + + if test -n "$soname_spec"; then + eval soname=\"$soname_spec\" + else + soname="$realname" + fi + + lib="$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\" + IFS="${IFS= }"; 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\" + linkopts="$linkopts $flag" + fi + + # Do each of the archive commands. + if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then + eval cmds=\"$archive_expsym_cmds\" + else + eval cmds=\"$archive_cmds\" + fi + IFS="${IFS= }"; save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + + # 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 + ;; + + *.lo | *.o | *.obj) + if test -n "$link_against_libtool_libs"; then + $echo "$modename: error: cannot link libtool libraries into objects" 1>&2 + exit 1 + fi + + 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"; 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 "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}$'/d' -e '/\.lib$/d' -e "$lo2o" | $NL2SP`" $reload_conv_objs" + + output="$obj" + eval cmds=\"$reload_cmds\" + IFS="${IFS= }"; save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + + # Exit if we aren't doing a library object file. + 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"; then + # Only do commands if we really have different PIC objects. + reload_objs="$libobjs $reload_conv_objs" + output="$libobj" + eval cmds=\"$reload_cmds\" + IFS="${IFS= }"; save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + else + # Just create a symlink. + $show $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 + ;; + + # Anything else should be a program. + *) + 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" = 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 + + 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 "$compile_rpath " in + *" $libdir "*) ;; + *) compile_rpath="$compile_rpath $libdir" ;; + esac + 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 + 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" + + 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 binary in the object directory, then wrap it. + 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 + + 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" | $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" | sort +2 | 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_t void * +#else +# define lt_ptr_t char * +# define const +#endif + +/* The mapping between symbol names and symbols. */ +const struct { + const char *name; + lt_ptr_t address; +} +lt_preloaded_symbols[] = +{\ +" + + sed -n -e 's/^: \([^ ]*\) $/ {\"\1\", (lt_ptr_t) 0},/p' \ + -e 's/^. \([^ ]*\) \([^ ]*\)$/ {"\2", (lt_ptr_t) \&\2},/p' \ + < "$nlist" >> "$output_objdir/$dlsyms" + + $echo >> "$output_objdir/$dlsyms" "\ + {0, (lt_ptr_t) 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 -z "$link_against_libtool_libs" || test "$build_libtool_libs" != yes; then + # Replace the output file specification. + compile_command=`$echo "X$compile_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'` + 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 "$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 + 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 + $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: + link_against_libtool_libs='$link_against_libtool_libs' +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' + 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 (cd \"\$thisdir\" && eval \$relink_command); then : + else + $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*) + $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 "`$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 + IFS="${IFS= }"; save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + done + + if test -n "$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" + + if test -n "$xrpath"; then + temp_xrpath= + for libdir in $xrpath; do + temp_xrpath="$temp_xrpath -R$libdir" + done + dependency_libs="$temp_xrpath $dependency_libs" + fi + + # Only create the output if not a dry run. + if test -z "$run"; then + for installed in no yes; do + if test "$installed" = yes; then + if test -z "$install_libdir"; then + break + fi + output="$output_objdir/$outputname"i + fi + $rm $output + $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='$dlname' + +# Names of this library. +library_names='$library_names' + +# The name of the static archive. +old_library='$old_library' + +# Libraries that this one depends upon. +dependency_libs='$dependency_libs' + +# Version information for $libname. +current=$current +age=$age +revision=$revision + +# Is this an already installed library? +installed=$installed + +# Directory that this library needs to be installed in: +libdir='$install_libdir'\ +" + 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; 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 + *.a | *.lib) + # 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= + # If there is no directory component, then add one. + case "$file" in + */* | *\\*) . $file ;; + *) . ./$file ;; + esac + + # Add the libdir to current_libdirs if it is the destination. + if test "X$destdir" = "X$libdir"; then + case "$current_libdirs " in + *" $libdir "*) ;; + *) current_libdirs="$current_libdirs $libdir" ;; + esac + else + # Note the libdir as a future libdir. + case "$future_libdirs " in + *" $libdir "*) ;; + *) future_libdirs="$future_libdirs $libdir" ;; + esac + fi + + dir="`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`/" + test "X$dir" = "X$file/" && dir= + dir="$dir$objdir" + + # See the names of the shared library. + set dummy $library_names + if test -n "$2"; then + realname="$2" + shift + shift + + # Install the shared library and build the symlinks. + $show "$install_prog $dir/$realname $destdir/$realname" + $run eval "$install_prog $dir/$realname $destdir/$realname" || exit $? + + 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\" + IFS="${IFS= }"; save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + fi + + # Install the pseudo-library for information purposes. + name=`$echo "X$file" | $Xsed -e 's%^.*/%%'` + 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"` + ;; + *.o | *.obj) + 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. + if (sed -e '4q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + link_against_libtool_libs= + relink_command= + + # If there is no directory component, then add one. + case "$file" in + */* | *\\*) . $file ;; + *) . ./$file ;; + esac + + # Check the variables that should have been set. + if test -z "$link_against_libtool_libs"; then + $echo "$modename: invalid libtool wrapper script \`$file'" 1>&2 + exit 1 + fi + + finalize=yes + for lib in $link_against_libtool_libs; do + # Check to see that each library is installed. + libdir= + if test -f "$lib"; then + # If there is no directory component, then add one. + case "$lib" in + */* | *\\*) . $lib ;; + *) . ./$lib ;; + esac + fi + libfile="$libdir/`$echo "X$lib" | $Xsed -e 's%^.*/%%g'`" + if test -n "$libdir" && test ! -f "$libfile"; then + $echo "$modename: warning: \`$lib' has not been installed in \`$libdir'" 1>&2 + finalize=no + fi + done + + 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 + 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 + + $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 $? + + # Do each command in the postinstall commands. + eval cmds=\"$old_postinstall_cmds\" + IFS="${IFS= }"; save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + done + + if test -n "$future_libdirs"; then + $echo "$modename: warning: remember to run \`$progname --finish$future_libdirs'" 1>&2 + fi + + if test -n "$current_libdirs"; then + # Maybe just do a dry run. + test -n "$run" && current_libdirs=" -n$current_libdirs" + exec $SHELL $0 --finish$current_libdirs + exit 1 + fi + + exit 0 + ;; + + # libtool finish mode + finish) + modename="$modename: finish" + libdirs="$nonopt" + 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\" + IFS="${IFS= }"; 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 \`-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 actually exec the command. + eval "exec \$cmd$args" + + $echo "$modename: cannot exec \$cmd$args" + exit 1 + 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 uninstall mode + uninstall) + modename="$modename: uninstall" + rm="$nonopt" + files= + + for arg + do + case "$arg" in + -*) rm="$rm $arg" ;; + *) files="$files $arg" ;; + esac + done + + if test -z "$rm"; then + $echo "$modename: you must specify an RM program" 1>&2 + $echo "$help" 1>&2 + exit 1 + fi + + for file in $files; do + dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` + test "X$dir" = "X$file" && dir=. + name=`$echo "X$file" | $Xsed -e 's%^.*/%%'` + + rmfiles="$file" + + case "$name" in + *.la) + # Possibly a libtool archive, so verify it. + if (sed -e '2q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + . $dir/$name + + # Delete the libtool libraries and symlinks. + for n in $library_names; do + rmfiles="$rmfiles $dir/$n" + done + test -n "$old_library" && rmfiles="$rmfiles $dir/$old_library" + + $show "$rm $rmfiles" + $run $rm $rmfiles + + if test -n "$library_names"; then + # Do each command in the postuninstall commands. + eval cmds=\"$postuninstall_cmds\" + IFS="${IFS= }"; save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" + done + IFS="$save_ifs" + fi + + if test -n "$old_library"; then + # Do each command in the old_postuninstall commands. + eval cmds=\"$old_postuninstall_cmds\" + IFS="${IFS= }"; save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" + done + IFS="$save_ifs" + fi + + # FIXME: should reinstall the best remaining shared library. + fi + ;; + + *.lo) + if test "$build_old_libs" = yes; then + oldobj=`$echo "X$name" | $Xsed -e "$lo2o"` + rmfiles="$rmfiles $dir/$oldobj" + fi + $show "$rm $rmfiles" + $run $rm $rmfiles + ;; + + *) + $show "$rm $rmfiles" + $run $rm $rmfiles + ;; + esac + done + exit 0 + ;; + + "") + $echo "$modename: you must specify a MODE" 1>&2 + $echo "$generic_help" 1>&2 + exit 1 + ;; + esac + + $echo "$modename: invalid operation mode \`$mode'" 1>&2 + $echo "$generic_help" 1>&2 + exit 1 +fi # test -z "$show_help" + +# We need to display help for each of the modes. +case "$mode" in +"") $echo \ +"Usage: $modename [OPTION]... [MODE-ARG]... + +Provide generalized library-building support services. + + --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: + + compile compile a source file into a libtool object + execute automatically set library path, then run a program + finish complete the installation of libtool libraries + install install libraries or executables + link create a library or an executable + uninstall remove libraries from an installed directory + +MODE-ARGS vary depending on the MODE. Try \`$modename --help --mode=MODE' for +a more detailed description of MODE." + exit 0 + ;; + +compile) + $echo \ +"Usage: $modename [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE + +Compile a source file into a libtool library object. + +This mode accepts the following additional options: + + -o OUTPUT-FILE set the output file name to OUTPUT-FILE + -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-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: Index: xc/extras/freetype2/builds/cygwin/ltconfig diff -u /dev/null xc/extras/freetype2/builds/cygwin/ltconfig:1.1.1.1 --- /dev/null Mon Dec 18 14:22:19 2000 +++ xc/extras/freetype2/builds/cygwin/ltconfig Fri Dec 8 16:26:07 2000 @@ -0,0 +1,3114 @@ +#! /bin/sh + +# ltconfig - Create a system-specific libtool. +# Copyright (C) 1996-1999 Free Software Foundation, Inc. +# Originally by Gordon Matzigkeit , 1996 +# +# This file is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# A lot of this script is taken from autoconf-2.10. + +# Check that we are running under the correct shell. +SHELL=${CONFIG_SHELL-/bin/sh} +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`} + case X$UNAME in + *-DOS) PATH_SEPARATOR=';' ;; + *) PATH_SEPARATOR=':' ;; + esac +fi + +# 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 + +if test "X${echo_test_string+set}" != Xset; then + # find a string as large as possible, as long as the shell can cope with it + for cmd in 'sed 50q "$0"' 'sed 20q "$0"' 'sed 10q "$0"' 'sed 2q "$0"' 'echo test'; do + # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ... + if (echo_test_string="`eval $cmd`") 2>/dev/null && + echo_test_string="`eval $cmd`" && + (test "X$echo_test_string" = "X$echo_test_string") 2>/dev/null; then + break + fi + done +fi + +if test "X`($echo '\t') 2>/dev/null`" != 'X\t' || + test "X`($echo "$echo_test_string") 2>/dev/null`" != X"$echo_test_string"; then + # 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="${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' && + test "X`($dir/echo "$echo_test_string") 2>/dev/null`" = 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' && + test "X`(print -r "$echo_test_string") 2>/dev/null`" = 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 ltconfig 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' && + test "X`($echo "$echo_test_string") 2>/dev/null`" = X"$echo_test_string"; then + # Cool, printf works + : + elif test "X`("$ORIGINAL_CONFIG_SHELL" "$0" --fallback-echo '\t') 2>/dev/null`" = 'X\t' && + test "X`("$ORIGINAL_CONFIG_SHELL" "$0" --fallback-echo "$echo_test_string") 2>/dev/null`" = 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 test "X`("$CONFIG_SHELL" "$0" --fallback-echo '\t') 2>/dev/null`" = 'X\t' && + test "X`("$CONFIG_SHELL" "$0" --fallback-echo "$echo_test_string") 2>/dev/null`" = 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}" "$0" ${1+"$@"} + else + # Oops. We lost completely, so just stick with echo. + echo=echo + fi + fi + fi + fi +fi + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +Xsed='sed -e s/^X//' +sed_quote_subst='s/\([\\"\\`$\\\\]\)/\\\1/g' + +# Same as above, but do not quote variable references. +double_quote_subst='s/\([\\"\\`\\\\]\)/\\\1/g' + +# Sed substitution to delay expansion of an escaped shell variable in a +# double_quote_subst'ed string. +delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' + +# The name of this program. +progname=`$echo "X$0" | $Xsed -e 's%^.*/%%'` + +# Constants: +PROGRAM=ltconfig +PACKAGE=libtool +VERSION=1.3.5 +TIMESTAMP=" (1.385.2.206 2000/05/27 11:12:27)" +ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' +ac_link='${CC-cc} -o conftest $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' +rm="rm -f" + +help="Try \`$progname --help' for more information." + +# Global variables: +default_ofile=libtool +can_build_shared=yes +enable_shared=yes +# All known linkers require a `.a' archive for static linking (except M$VC, +# which needs '.lib'). +enable_static=yes +enable_fast_install=yes +enable_dlopen=unknown +enable_win32_dll=no +ltmain= +silent= +srcdir= +ac_config_guess= +ac_config_sub= +host= +nonopt= +ofile="$default_ofile" +verify_host=yes +with_gcc=no +with_gnu_ld=no +need_locks=yes +ac_ext=c +objext=o +libext=a +exeext= +cache_file= + +old_AR="$AR" +old_CC="$CC" +old_CFLAGS="$CFLAGS" +old_CPPFLAGS="$CPPFLAGS" +old_LDFLAGS="$LDFLAGS" +old_LD="$LD" +old_LN_S="$LN_S" +old_LIBS="$LIBS" +old_NM="$NM" +old_RANLIB="$RANLIB" +old_DLLTOOL="$DLLTOOL" +old_OBJDUMP="$OBJDUMP" +old_AS="$AS" + +# Parse the command line options. +args= +prev= +for option +do + case "$option" in + -*=*) optarg=`echo "$option" | sed 's/[-_a-zA-Z0-9]*=//'` ;; + *) optarg= ;; + esac + + # If the previous option needs an argument, assign it. + if test -n "$prev"; then + eval "$prev=\$option" + prev= + continue + fi + + case "$option" in + --help) cat <&2 + echo "$help" 1>&2 + exit 1 + ;; + + *) + if test -z "$ltmain"; then + ltmain="$option" + elif test -z "$host"; then +# This generates an unnecessary warning for sparc-sun-solaris4.1.3_U1 +# if test -n "`echo $option| sed 's/[-a-z0-9.]//g'`"; then +# echo "$progname: warning \`$option' is not a valid host type" 1>&2 +# fi + host="$option" + else + echo "$progname: too many arguments" 1>&2 + echo "$help" 1>&2 + exit 1 + fi ;; + esac +done + +if test -z "$ltmain"; then + echo "$progname: you must specify a LTMAIN file" 1>&2 + echo "$help" 1>&2 + exit 1 +fi + +if test ! -f "$ltmain"; then + echo "$progname: \`$ltmain' does not exist" 1>&2 + echo "$help" 1>&2 + exit 1 +fi + +# Quote any args containing shell metacharacters. +ltconfig_args= +for arg +do + case "$arg" in + *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*) + ltconfig_args="$ltconfig_args '$arg'" ;; + *) ltconfig_args="$ltconfig_args $arg" ;; + esac +done + +# A relevant subset of AC_INIT. + +# File descriptor usage: +# 0 standard input +# 1 file creation +# 2 errors and warnings +# 3 some systems may open it to /dev/tty +# 4 used on the Kubota Titan +# 5 compiler messages saved in config.log +# 6 checking for... messages and results +if test "$silent" = yes; then + exec 6>/dev/null +else + exec 6>&1 +fi +exec 5>>./config.log + +# NLS nuisances. +# Only set LANG and LC_ALL to C if already set. +# These must not be set unconditionally because not all systems understand +# e.g. LANG=C (notably SCO). +if test "X${LC_ALL+set}" = Xset; then LC_ALL=C; export LC_ALL; fi +if test "X${LANG+set}" = Xset; then LANG=C; export LANG; fi + +if test -n "$cache_file" && test -r "$cache_file"; then + echo "loading cache $cache_file within ltconfig" + . $cache_file +fi + +if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then + # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu. + if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then + ac_n= ac_c=' +' ac_t=' ' + else + ac_n=-n ac_c= ac_t= + fi +else + ac_n= ac_c='\c' ac_t= +fi + +if test -z "$srcdir"; then + # Assume the source directory is the same one as the path to LTMAIN. + srcdir=`$echo "X$ltmain" | $Xsed -e 's%/[^/]*$%%'` + test "$srcdir" = "$ltmain" && srcdir=. +fi + +trap "$rm conftest*; exit 1" 1 2 15 +if test "$verify_host" = yes; then + # Check for config.guess and config.sub. + ac_aux_dir= + for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do + if test -f $ac_dir/config.guess; then + ac_aux_dir=$ac_dir + break + fi + done + if test -z "$ac_aux_dir"; then + echo "$progname: cannot find config.guess in $srcdir $srcdir/.. $srcdir/../.." 1>&2 + echo "$help" 1>&2 + exit 1 + fi + ac_config_guess=$ac_aux_dir/config.guess + ac_config_sub=$ac_aux_dir/config.sub + + # Make sure we can run config.sub. + if $SHELL $ac_config_sub sun4 >/dev/null 2>&1; then : + else + echo "$progname: cannot run $ac_config_sub" 1>&2 + echo "$help" 1>&2 + exit 1 + fi + + echo $ac_n "checking host system type""... $ac_c" 1>&6 + + host_alias=$host + case "$host_alias" in + "") + if host_alias=`$SHELL $ac_config_guess`; then : + else + echo "$progname: cannot guess host type; you must specify one" 1>&2 + echo "$help" 1>&2 + exit 1 + fi ;; + esac + host=`$SHELL $ac_config_sub $host_alias` + echo "$ac_t$host" 1>&6 + + # Make sure the host verified. + test -z "$host" && exit 1 + +elif test -z "$host"; then + echo "$progname: you must specify a host type if you use \`--no-verify'" 1>&2 + echo "$help" 1>&2 + exit 1 +else + host_alias=$host +fi + +# Transform linux* to *-*-linux-gnu*, to support old configure scripts. +case "$host_os" in +linux-gnu*) ;; +linux*) host=`echo $host | sed 's/^\(.*-.*-linux\)\(.*\)$/\1-gnu\2/'` +esac + +host_cpu=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` +host_vendor=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` +host_os=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` + +case "$host_os" in +aix3*) + # AIX sometimes has problems with the GCC collect2 program. For some + # reason, if we set the COLLECT_NAMES environment variable, the problems + # vanish in a puff of smoke. + if test "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 cru $oldlib$oldobjs' +old_postinstall_cmds='chmod 644 $oldlib' +old_postuninstall_cmds= + +# Set a sane default for `AR'. +test -z "$AR" && AR=ar + +# Set a sane default for `OBJDUMP'. +test -z "$OBJDUMP" && OBJDUMP=objdump + +# If RANLIB is not set, then run the test. +if test "${RANLIB+set}" != "set"; then + result=no + + echo $ac_n "checking for ranlib... $ac_c" 1>&6 + IFS="${IFS= }"; save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR}" + for dir in $PATH; do + test -z "$dir" && dir=. + if test -f $dir/ranlib || test -f $dir/ranlib$ac_exeext; then + RANLIB="ranlib" + result="ranlib" + break + fi + done + IFS="$save_ifs" + + echo "$ac_t$result" 1>&6 +fi + +if test -n "$RANLIB"; then + old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" + old_postinstall_cmds="\$RANLIB \$oldlib~$old_postinstall_cmds" +fi + +# Set sane defaults for `DLLTOOL', `OBJDUMP', and `AS', used on cygwin. +test -z "$DLLTOOL" && DLLTOOL=dlltool +test -z "$OBJDUMP" && OBJDUMP=objdump +test -z "$AS" && AS=as + +# Check to see if we are using GCC. +if test "$with_gcc" != yes || test -z "$CC"; then + # If CC is not set, then try to find GCC or a usable CC. + if test -z "$CC"; then + echo $ac_n "checking for gcc... $ac_c" 1>&6 + IFS="${IFS= }"; save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR}" + for dir in $PATH; do + test -z "$dir" && dir=. + if test -f $dir/gcc || test -f $dir/gcc$ac_exeext; then + CC="gcc" + break + fi + done + IFS="$save_ifs" + + if test -n "$CC"; then + echo "$ac_t$CC" 1>&6 + else + echo "$ac_t"no 1>&6 + fi + fi + + # Not "gcc", so try "cc", rejecting "/usr/ucb/cc". + if test -z "$CC"; then + echo $ac_n "checking for cc... $ac_c" 1>&6 + IFS="${IFS= }"; save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR}" + cc_rejected=no + for dir in $PATH; do + test -z "$dir" && dir=. + if test -f $dir/cc || test -f $dir/cc$ac_exeext; then + if test "$dir/cc" = "/usr/ucb/cc"; then + cc_rejected=yes + continue + fi + CC="cc" + break + fi + done + IFS="$save_ifs" + if test $cc_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $CC + shift + if test $# -gt 0; then + # We chose a different compiler from the bogus one. + # However, it has the same name, so the bogon will be chosen + # first if we set CC to just the name; use the full file name. + shift + set dummy "$dir/cc" "$@" + shift + CC="$@" + fi + fi + + if test -n "$CC"; then + echo "$ac_t$CC" 1>&6 + else + echo "$ac_t"no 1>&6 + fi + + if test -z "$CC"; then + echo "$progname: error: no acceptable cc found in \$PATH" 1>&2 + exit 1 + fi + fi + + # Now see if the compiler is really GCC. + with_gcc=no + echo $ac_n "checking whether we are using GNU C... $ac_c" 1>&6 + echo "$progname:581: checking whether we are using GNU C" >&5 + + $rm conftest.c + cat > conftest.c <&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then + with_gcc=yes + fi + $rm conftest.c + echo "$ac_t$with_gcc" 1>&6 +fi + +# Allow CC to be a program name with arguments. +set dummy $CC +compiler="$2" + +echo $ac_n "checking for object suffix... $ac_c" 1>&6 +$rm conftest* +echo 'int i = 1;' > conftest.c +echo "$progname:603: checking for object suffix" >& 5 +if { (eval echo $progname:604: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>conftest.err; }; then + # Append any warnings to the config.log. + cat conftest.err 1>&5 + + for ac_file in conftest.*; do + case $ac_file in + *.c) ;; + *) objext=`echo $ac_file | sed -e s/conftest.//` ;; + esac + done +else + cat conftest.err 1>&5 + echo "$progname: failed program was:" >&5 + cat conftest.c >&5 +fi +$rm conftest* +echo "$ac_t$objext" 1>&6 + +echo $ac_n "checking for executable suffix... $ac_c" 1>&6 +if eval "test \"`echo '$''{'ac_cv_exeext'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + ac_cv_exeext="no" + $rm conftest* + echo 'main () { return 0; }' > conftest.c + echo "$progname:629: checking for executable suffix" >& 5 + if { (eval echo $progname:630: \"$ac_link\") 1>&5; (eval $ac_link) 2>conftest.err; }; then + # Append any warnings to the config.log. + cat conftest.err 1>&5 + + for ac_file in conftest.*; do + case $ac_file in + *.c | *.err | *.$objext ) ;; + *) ac_cv_exeext=.`echo $ac_file | sed -e s/conftest.//` ;; + esac + done + else + cat conftest.err 1>&5 + echo "$progname: failed program was:" >&5 + cat conftest.c >&5 + fi + $rm conftest* +fi +if test "X$ac_cv_exeext" = Xno; then + exeext="" +else + exeext="$ac_cv_exeext" +fi +echo "$ac_t$ac_cv_exeext" 1>&6 + +echo $ac_n "checking for $compiler option to produce PIC... $ac_c" 1>&6 +pic_flag= +special_shlib_compile_flags= +wl= +link_static_flag= +no_builtin_flag= + +if test "$with_gcc" = yes; then + wl='-Wl,' + link_static_flag='-static' + + case "$host_os" in + beos* | irix5* | irix6* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + 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 + # we not sure about C++ programs. + link_static_flag="$link_static_flag ${wl}-lC" + ;; + cygwin* | mingw* | os2*) + # We can build DLLs from non-PIC. + ;; + amigaos*) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + pic_flag='-m68020 -resident32 -malways-restore-a4' + ;; + sysv4*MP*) + if test -d /usr/nec; then + pic_flag=-Kconform_pic + fi + ;; + *) + pic_flag='-fPIC' + ;; + esac +else + # PORTME Check for PIC flags for the system compiler. + case "$host_os" in + aix3* | aix4*) + # All AIX code is PIC. + link_static_flag='-bnso -bI:/lib/syscalls.exp' + ;; + + hpux9* | hpux10* | hpux11*) + # Is there a better link_static_flag that works with the bundled CC? + wl='-Wl,' + link_static_flag="${wl}-a ${wl}archive" + pic_flag='+Z' + ;; + + irix5* | irix6*) + wl='-Wl,' + link_static_flag='-non_shared' + # PIC (with -KPIC) is the default. + ;; + + cygwin* | mingw* | os2*) + # We can build DLLs from non-PIC. + ;; + + osf3* | osf4* | osf5*) + # All OSF/1 code is PIC. + wl='-Wl,' + link_static_flag='-non_shared' + ;; + + sco3.2v5*) + pic_flag='-Kpic' + link_static_flag='-dn' + special_shlib_compile_flags='-belf' + ;; + + solaris*) + pic_flag='-KPIC' + link_static_flag='-Bstatic' + wl='-Wl,' + ;; + + sunos4*) + pic_flag='-PIC' + link_static_flag='-Bstatic' + wl='-Qoption ld ' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + pic_flag='-KPIC' + link_static_flag='-Bstatic' + wl='-Wl,' + ;; + + uts4*) + pic_flag='-pic' + link_static_flag='-Bstatic' + ;; + sysv4*MP*) + if test -d /usr/nec ;then + pic_flag='-Kconform_pic' + link_static_flag='-Bstatic' + fi + ;; + *) + can_build_shared=no + ;; + esac +fi + +if test -n "$pic_flag"; then + echo "$ac_t$pic_flag" 1>&6 + + # Check to make sure the pic_flag actually works. + echo $ac_n "checking if $compiler PIC flag $pic_flag works... $ac_c" 1>&6 + $rm conftest* + echo "int some_variable = 0;" > conftest.c + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $pic_flag -DPIC" + echo "$progname:776: checking if $compiler PIC flag $pic_flag works" >&5 + if { (eval echo $progname:777: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>conftest.err; } && test -s conftest.$objext; then + # Append any warnings to the config.log. + cat conftest.err 1>&5 + + 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 + echo "$ac_t"no 1>&6 + can_build_shared=no + pic_flag= + else + echo "$ac_t"yes 1>&6 + pic_flag=" $pic_flag" + fi + ;; + *) + echo "$ac_t"yes 1>&6 + pic_flag=" $pic_flag" + ;; + esac + else + # Append any errors to the config.log. + cat conftest.err 1>&5 + can_build_shared=no + pic_flag= + echo "$ac_t"no 1>&6 + fi + CFLAGS="$save_CFLAGS" + $rm conftest* +else + echo "$ac_t"none 1>&6 +fi + +# Check to see if options -o and -c are simultaneously supported by compiler +echo $ac_n "checking if $compiler supports -c -o file.o... $ac_c" 1>&6 +$rm -r conftest 2>/dev/null +mkdir conftest +cd conftest +$rm conftest* +echo "int some_variable = 0;" > conftest.c +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.o" +echo "$progname:829: checking if $compiler supports -c -o file.o" >&5 +if { (eval echo $progname:830: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>out/conftest.err; } && test -s out/conftest2.o; 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 + echo "$ac_t"no 1>&6 + compiler_c_o=no + else + echo "$ac_t"yes 1>&6 + compiler_c_o=yes + fi +else + # Append any errors to the config.log. + cat out/conftest.err 1>&5 + compiler_c_o=no + echo "$ac_t"no 1>&6 +fi +CFLAGS="$save_CFLAGS" +chmod u+w . +$rm conftest* out/* +rmdir out +cd .. +rmdir conftest +$rm -r conftest 2>/dev/null + +if test x"$compiler_c_o" = x"yes"; then + # Check to see if we can write to a .lo + echo $ac_n "checking if $compiler supports -c -o file.lo... $ac_c" 1>&6 + $rm conftest* + echo "int some_variable = 0;" > conftest.c + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -c -o conftest.lo" + echo "$progname:862: checking if $compiler supports -c -o file.lo" >&5 +if { (eval echo $progname:863: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>conftest.err; } && test -s conftest.lo; 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 + echo "$ac_t"no 1>&6 + compiler_o_lo=no + else + echo "$ac_t"yes 1>&6 + compiler_o_lo=yes + fi + else + # Append any errors to the config.log. + cat conftest.err 1>&5 + compiler_o_lo=no + echo "$ac_t"no 1>&6 + fi + CFLAGS="$save_CFLAGS" + $rm conftest* +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 $ac_n "checking if we can lock with hard links... $ac_c" 1>&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 "$ac_t$hard_links" 1>&6 + $rm conftest* + if test "$hard_links" = no; then + echo "*** 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 "$with_gcc" = yes; then + # Check to see if options -fno-rtti -fno-exceptions are supported by compiler + echo $ac_n "checking if $compiler supports -fno-rtti -fno-exceptions ... $ac_c" 1>&6 + $rm conftest* + echo "int some_variable = 0;" > conftest.c + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -fno-rtti -fno-exceptions -c conftest.c" + echo "$progname:914: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 + if { (eval echo $progname:915: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>conftest.err; } && test -s conftest.o; 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 + echo "$ac_t"no 1>&6 + compiler_rtti_exceptions=no + else + echo "$ac_t"yes 1>&6 + compiler_rtti_exceptions=yes + fi + else + # Append any errors to the config.log. + cat conftest.err 1>&5 + compiler_rtti_exceptions=no + echo "$ac_t"no 1>&6 + fi + CFLAGS="$save_CFLAGS" + $rm conftest* + + if test "$compiler_rtti_exceptions" = "yes"; then + no_builtin_flag=' -fno-builtin -fno-rtti -fno-exceptions' + else + no_builtin_flag=' -fno-builtin' + fi + +fi + +# Check for any special shared library compilation flags. +if test -n "$special_shlib_compile_flags"; then + echo "$progname: warning: \`$CC' requires \`$special_shlib_compile_flags' to build shared libraries" 1>&2 + if echo "$old_CC $old_CFLAGS " | egrep -e "[ ]$special_shlib_compile_flags[ ]" >/dev/null; then : + else + echo "$progname: add \`$special_shlib_compile_flags' to the CC or CFLAGS env variable and reconfigure" 1>&2 + can_build_shared=no + fi +fi + +echo $ac_n "checking if $compiler static flag $link_static_flag works... $ac_c" 1>&6 +$rm conftest* +echo 'main(){return(0);}' > conftest.c +save_LDFLAGS="$LDFLAGS" +LDFLAGS="$LDFLAGS $link_static_flag" +echo "$progname:958: checking if $compiler static flag $link_static_flag works" >&5 +if { (eval echo $progname:959: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then + echo "$ac_t$link_static_flag" 1>&6 +else + echo "$ac_t"none 1>&6 + link_static_flag= +fi +LDFLAGS="$save_LDFLAGS" +$rm conftest* + +if test -z "$LN_S"; then + # Check to see if we can use ln -s, or we need hard links. + echo $ac_n "checking whether ln -s works... $ac_c" 1>&6 + $rm conftest.dat + if ln -s X conftest.dat 2>/dev/null; then + $rm conftest.dat + LN_S="ln -s" + else + LN_S=ln + fi + if test "$LN_S" = "ln -s"; then + echo "$ac_t"yes 1>&6 + else + echo "$ac_t"no 1>&6 + fi +fi + +# Make sure LD is an absolute path. +if test -z "$LD"; then + ac_prog=ld + if test "$with_gcc" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + echo $ac_n "checking for ld used by GCC... $ac_c" 1>&6 + echo "$progname:991: checking for ld used by GCC" >&5 + ac_prog=`($CC -print-prog-name=ld) 2>&5` + case "$ac_prog" in + # Accept absolute paths. + [\\/]* | [A-Za-z]:[\\/]*) + 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 are not using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac + elif test "$with_gnu_ld" = yes; then + echo $ac_n "checking for GNU ld... $ac_c" 1>&6 + echo "$progname:1015: checking for GNU ld" >&5 + else + echo $ac_n "checking for non-GNU ld""... $ac_c" 1>&6 + echo "$progname:1018: checking for non-GNU ld" >&5 + fi + + if test -z "$LD"; then + IFS="${IFS= }"; ac_save_ifs="$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 + LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some GNU ld's only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + if "$LD" -v 2>&1 < /dev/null | egrep '(GNU|with BFD)' > /dev/null; then + test "$with_gnu_ld" != no && break + else + test "$with_gnu_ld" != yes && break + fi + fi + done + IFS="$ac_save_ifs" + fi + + if test -n "$LD"; then + echo "$ac_t$LD" 1>&6 + else + echo "$ac_t"no 1>&6 + fi + + if test -z "$LD"; then + echo "$progname: error: no acceptable ld found in \$PATH" 1>&2 + exit 1 + fi +fi + +# Check to see if it really is or is not GNU ld. +echo $ac_n "checking if the linker ($LD) is GNU ld... $ac_c" 1>&6 +# I'd rather use --version here, but apparently some GNU ld's only accept -v. +if $LD -v 2>&1 &5; then + with_gnu_ld=yes +else + with_gnu_ld=no +fi +echo "$ac_t$with_gnu_ld" 1>&6 + +# See if the linker supports building shared libraries. +echo $ac_n "checking whether the linker ($LD) supports shared libraries... $ac_c" 1>&6 + +allow_undefined_flag= +no_undefined_flag= +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= +export_dynamic_flag_spec= +whole_archive_flag_spec= +thread_safe_flag_spec= +hardcode_libdir_flag_spec= +hardcode_libdir_separator= +hardcode_direct=no +hardcode_minus_L=no +hardcode_shlibpath_var=unsupported +runpath_var= +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. + +case "$host_os" in +cygwin* | mingw*) + # 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 "$with_gcc" != yes; then + with_gnu_ld=no + fi + ;; + +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*) + # On AIX, the GNU linker is very broken + 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 $objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $objdir/a2ixlibrary.data~$AR cru $lib $libobjs~$RANLIB $lib~(cd $objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + + # 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 $linkopts ${wl}-soname $wl$soname -o $lib' + else + ld_shlibs=no + fi + ;; + + cygwin* | mingw*) + # 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 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 by newer dlltools. + export_symbols_cmds='test -f $objdir/$soname-ltdll.c || sed -e "/^# \/\* ltdll\.c starts here \*\//,/^# \/\* ltdll.c ends here \*\// { s/^# //; p; }" -e d < $0 > $objdir/$soname-ltdll.c~ + test -f $objdir/$soname-ltdll.$objext || (cd $objdir && $CC -c $soname-ltdll.c)~ + $DLLTOOL --export-all --exclude-symbols DllMain@12,_cygwin_dll_entry@12,_cygwin_noncygwin_dll_entry@12 --output-def $objdir/$soname-def $objdir/$soname-ltdll.$objext $libobjs $convenience~ + sed -e "1,/EXPORTS/d" -e "s/ @ [0-9]*//" -e "s/ *;.*$//" < $objdir/$soname-def > $export_symbols' + + # If DATA tags from a recent dlltool are present, honour them! + archive_expsym_cmds='echo EXPORTS > $objdir/$soname-def~ + _lt_hint=1; + cat $export_symbols | while read symbol; do + set dummy \$symbol; + case \$# in + 2) echo " \$2 @ \$_lt_hint ; " >> $objdir/$soname-def;; + *) echo " \$2 @ \$_lt_hint \$3 ; " >> $objdir/$soname-def;; + esac; + _lt_hint=`expr 1 + \$_lt_hint`; + done~ + test -f $objdir/$soname-ltdll.c || sed -e "/^# \/\* ltdll\.c starts here \*\//,/^# \/\* ltdll.c ends here \*\// { s/^# //; p; }" -e d < $0 > $objdir/$soname-ltdll.c~ + test -f $objdir/$soname-ltdll.$objext || (cd $objdir && $CC -c $soname-ltdll.c)~ + $CC -Wl,--base-file,$objdir/$soname-base -Wl,--dll -nostartfiles -Wl,-e,__cygwin_dll_entry@12 -o $lib $objdir/$soname-ltdll.$objext $libobjs $deplibs $linkopts~ + $DLLTOOL --as=$AS --dllname $soname --exclude-symbols DllMain@12,_cygwin_dll_entry@12,_cygwin_noncygwin_dll_entry@12 --def $objdir/$soname-def --base-file $objdir/$soname-base --output-exp $objdir/$soname-exp~ + $CC -Wl,--base-file,$objdir/$soname-base $objdir/$soname-exp -Wl,--dll -nostartfiles -Wl,-e,__cygwin_dll_entry@12 -o $lib $objdir/$soname-ltdll.$objext $libobjs $deplibs $linkopts~ + $DLLTOOL --as=$AS --dllname $soname --exclude-symbols DllMain@12,_cygwin_dll_entry@12,_cygwin_noncygwin_dll_entry@12 --def $objdir/$soname-def --base-file $objdir/$soname-base --output-exp $objdir/$soname-exp~ + $CC $objdir/$soname-exp -Wl,--dll -nostartfiles -Wl,-e,__cygwin_dll_entry@12 -o $lib $objdir/$soname-ltdll.$objext $libobjs $deplibs $linkopts' + + old_archive_from_new_cmds='$DLLTOOL --as=$AS --dllname $soname --def $objdir/$soname-def --output-lib $objdir/$libname.a' + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + archive_cmds='$CC -shared $libobjs $deplibs $linkopts ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $linkopts ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + archive_cmds='$LD -Bshareable $libobjs $deplibs $linkopts -o $lib' + # can we support soname and/or expsyms with a.out? -oliva + 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 $linkopts ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $linkopts ${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 $linkopts' + 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 $linkopts ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $linkopts ${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*) + # 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 $objdir/$soname $libobjs $deplibs $linkopts -bE:$export_symbols -T512 -H512 -bM:SRE~$AR cru $lib $objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + hardcode_minus_L=yes + if test "$with_gcc" = yes && test -z "$link_static_flag"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + hardcode_direct=unsupported + fi + ;; + + aix4*) + hardcode_libdir_flag_spec='${wl}-b ${wl}nolibpath ${wl}-b ${wl}libpath:$libdir:/usr/lib:/lib' + hardcode_libdir_separator=':' + if test "$with_gcc" = yes; then + 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 + shared_flag='-shared' + else + shared_flag='${wl}-bM:SRE' + hardcode_direct=yes + fi + allow_undefined_flag=' ${wl}-berok' + archive_cmds="\$CC $shared_flag"' -o $objdir/$soname $libobjs $deplibs $linkopts ${wl}-bexpall ${wl}-bnoentry${allow_undefined_flag}' + archive_expsym_cmds="\$CC $shared_flag"' -o $objdir/$soname $libobjs $deplibs $linkopts ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}' + case "$host_os" in aix4.[01]|aix4.[01].*) + # According to Greg Wooledge, -bexpall is only supported from AIX 4.2 on + always_export_symbols=yes ;; + esac + ;; + + amigaos*) + archive_cmds='$rm $objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $objdir/a2ixlibrary.data~$AR cru $lib $libobjs~$RANLIB $lib~(cd $objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + # see comment about different semantics on the GNU ld section + ld_shlibs=no + ;; + + cygwin* | mingw*) + # 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 $linkopts `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' + fix_srcfile_path='`cygpath -w $srcfile`' + ;; + + 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 $linkopts /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 $linkopts' + 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 $linkopts' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + hpux9* | hpux10* | hpux11*) + case "$host_os" in + hpux9*) archive_cmds='$rm $objdir/$soname~$LD -b +b $install_libdir -o $objdir/$soname $libobjs $deplibs $linkopts~test $objdir/$soname = $lib || mv $objdir/$soname $lib' ;; + *) archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linkopts' ;; + 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*) + if test "$with_gcc" = yes; then + archive_cmds='$CC -shared $libobjs $deplibs $linkopts ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + archive_cmds='$LD -shared $libobjs $deplibs $linkopts -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=: + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linkopts' # a.out + else + archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linkopts' # ELF + fi + hardcode_libdir_flag_spec='${wl}-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + openbsd*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linkopts' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + os2*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + allow_undefined_flag=unsupported + archive_cmds='$echo "LIBRARY $libname INITINSTANCE" > $objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $objdir/$libname.def~$echo DATA >> $objdir/$libname.def~$echo " SINGLE NONSHARED" >> $objdir/$libname.def~$echo EXPORTS >> $objdir/$libname.def~emxexp $libobjs >> $objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $linkopts $objdir/$libname.def' + old_archive_from_new_cmds='emximp -o $objdir/$libname.a $objdir/$libname.def' + ;; + + osf3*) + if test "$with_gcc" = yes; then + allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $linkopts ${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 $linkopts -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 the -msym flag + if test "$with_gcc" = yes; then + allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $linkopts ${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' + else + allow_undefined_flag=' -expect_unresolved \*' + archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linkopts -msym -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=: + ;; + rhapsody*) + archive_cmds='$CC -bundle -undefined suppress -o $lib $libobjs $deplibs $linkopts' + hardcode_libdir_flags_spec='-L$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + sco3.2v5*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linkopts' + hardcode_shlibpath_var=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + ;; + + solaris*) + 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 $linkopts' + 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 $linkopts~$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 + ;; + + sunos4*) + archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linkopts' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_direct=yes + hardcode_minus_L=yes + hardcode_shlibpath_var=no + ;; + + sysv4) + 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 $linkopts' + else + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linkopts' + fi + runpath_var='LD_RUN_PATH' + hardcode_shlibpath_var=no + hardcode_direct=no #Motorola manual says yes, but my tests say they lie + ;; + + sysv4.3*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linkopts' + 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 $linkopts' + 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 $linkopts~$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 $linkopts' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_shlibpath_var=no + ;; + + dgux*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linkopts' + 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 $linkopts' + 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 $linkopts' + hardcode_direct=yes + hardcode_minus_L=no + hardcode_shlibpath_var=no + hardcode_runpath_var=yes + runpath_var=LD_RUN_PATH + ;; + + unixware7*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linkopts' + runpath_var='LD_RUN_PATH' + hardcode_shlibpath_var=no + ;; + + *) + ld_shlibs=no + ;; + esac +fi +echo "$ac_t$ld_shlibs" 1>&6 +test "$ld_shlibs" = no && can_build_shared=no + +if test -z "$NM"; then + echo $ac_n "checking for BSD-compatible nm... $ac_c" 1>&6 + case "$NM" in + [\\/]* | [A-Za-z]:[\\/]*) ;; # Let the user override the test with a path. + *) + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR}" + for ac_dir in $PATH /usr/ucb /usr/ccs/bin /bin; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/nm || test -f $ac_dir/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 + if ($ac_dir/nm -B /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then + NM="$ac_dir/nm -B" + break + elif ($ac_dir/nm -p /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then + NM="$ac_dir/nm -p" + break + else + NM=${NM="$ac_dir/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 "$NM" && NM=nm + ;; + esac + echo "$ac_t$NM" 1>&6 +fi + +# Check for command to grab the raw symbol name followed by C symbol from nm. +echo $ac_n "checking command to parse $NM output... $ac_c" 1>&6 + +# These are sane defaults that work on at least a few old systems. +# [They come from Ultrix. What could be older than Ultrix?!! ;)] + +# Character class describing NM global symbol codes. +symcode='[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 +global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern char \1;/p'" + +# Define system-specific variables. +case "$host_os" in +aix*) + symcode='[BCDT]' + ;; +cygwin* | mingw*) + symcode='[ABCDGISTW]' + ;; +hpux*) # Its linker distinguishes data from code symbols + global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern char \1();/p' -e 's/^. .* \(.*\)$/extern char \1;/p'" + ;; +irix*) + symcode='[BCDEGRST]' + ;; +solaris*) + symcode='[BDT]' + ;; +sysv4) + symcode='[DFNSTU]' + ;; +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. + global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode\)[ ][ ]*\($ac_symprfx\)$sympat$/$symxfrm/p'" + + # Check to see that the pipe works correctly. + pipe_works=no + $rm conftest* + cat > conftest.c <&5 + if { (eval echo $progname:1654: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; } && test -s conftest.$objext; then + # Now try to grab the symbols. + nlist=conftest.nm + if { echo "$progname:1657: eval \"$NM conftest.$objext | $global_symbol_pipe > $nlist\"" >&5; eval "$NM conftest.$objext | $global_symbol_pipe > $nlist 2>&5"; } && test -s "$nlist"; then + + # Try sorting and uniquifying the output. + if sort "$nlist" | uniq > "$nlist"T; then + mv -f "$nlist"T "$nlist" + 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.c +#ifdef __cplusplus +extern "C" { +#endif + +EOF + # Now generate the symbol file. + eval "$global_symbol_to_cdecl"' < "$nlist" >> conftest.c' + + cat <> conftest.c +#if defined (__STDC__) && __STDC__ +# define lt_ptr_t void * +#else +# define lt_ptr_t char * +# define const +#endif + +/* The mapping between symbol names and symbols. */ +const struct { + const char *name; + lt_ptr_t address; +} +lt_preloaded_symbols[] = +{ +EOF + sed 's/^. \(.*\) \(.*\)$/ {"\2", (lt_ptr_t) \&\2},/' < "$nlist" >> conftest.c + cat <<\EOF >> conftest.c + {0, (lt_ptr_t) 0} +}; + +#ifdef __cplusplus +} +#endif +EOF + # Now try linking the two files. + mv conftest.$objext conftstm.$objext + save_LIBS="$LIBS" + save_CFLAGS="$CFLAGS" + LIBS="conftstm.$objext" + CFLAGS="$CFLAGS$no_builtin_flag" + if { (eval echo $progname:1709: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then + pipe_works=yes + else + echo "$progname: failed program was:" >&5 + cat conftest.c >&5 + fi + LIBS="$save_LIBS" + else + echo "cannot find nm_test_func in $nlist" >&5 + fi + else + echo "cannot find nm_test_var in $nlist" >&5 + fi + else + echo "cannot run $global_symbol_pipe" >&5 + fi + else + echo "$progname: failed program was:" >&5 + cat conftest.c >&5 + fi + $rm conftest* conftst* + + # Do not use the global_symbol_pipe unless it works. + if test "$pipe_works" = yes; then + break + else + global_symbol_pipe= + fi +done +if test "$pipe_works" = yes; then + echo "${ac_t}ok" 1>&6 +else + echo "${ac_t}failed" 1>&6 +fi + +if test -z "$global_symbol_pipe"; then + global_symbol_to_cdecl= +fi + +# Check hardcoding attributes. +echo $ac_n "checking how to hardcode library paths into programs... $ac_c" 1>&6 +hardcode_action= +if test -n "$hardcode_libdir_flag_spec" || \ + test -n "$runpath_var"; then + + # We can hardcode non-existant directories. + if test "$hardcode_direct" != no && + # 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 "$ac_t$hardcode_action" 1>&6 + + +reload_flag= +reload_cmds='$LD$reload_flag -o $output$reload_objs' +echo $ac_n "checking for $LD option to reload object files... $ac_c" 1>&6 +# PORTME Some linkers may need a different reload flag. +reload_flag='-r' +echo "$ac_t$reload_flag" 1>&6 +test -n "$reload_flag" && reload_flag=" $reload_flag" + +# PORTME Fill in your ld.so characteristics +library_names_spec= +libname_spec='lib$name' +soname_spec= +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +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" +file_magic_cmd= +file_magic_test_file= +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. +echo $ac_n "checking dynamic linker characteristics... $ac_c" 1>&6 +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*) + version_type=linux + # AIX 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. + # We preserve .a as extension for shared libraries though AIX4.2 + # and later linker supports .so + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.a' + shlibpath_var=LIBPATH + deplibs_check_method=pass_all + ;; + +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 + deplibs_check_method=pass_all + lt_cv_dlopen="load_add_on" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ;; + +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 + deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)' + file_magic_cmd=/usr/bin/file + file_magic_test_file=/shlib/libc.so + 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*) + version_type=windows + need_version=no + need_lib_prefix=no + if test "$with_gcc" = yes; then + library_names_spec='${libname}`echo ${release} | sed -e 's/[.]/-/g'`${versuffix}.dll $libname.a' + else + library_names_spec='${libname}`echo ${release} | sed -e 's/[.]/-/g'`${versuffix}.dll $libname.lib' + fi + dynamic_linker='Win32 ld.exe' + deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?' + file_magic_cmd='${OBJDUMP} -f' + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + lt_cv_dlopen="LoadLibrary" + lt_cv_dlopen_libs= + ;; + +freebsd1*) + dynamic_linker=no + ;; + +freebsd*) + objformat=`test -x /usr/bin/objformat && /usr/bin/objformat || echo aout` + version_type=freebsd-$objformat + case "$version_type" in + freebsd-elf*) + deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB shared object' + file_magic_cmd=/usr/bin/file + file_magic_test_file=`echo /usr/lib/libc.so*` + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so $libname.so' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + deplibs_check_method=unknown + library_names_spec='${libname}${release}.so$versuffix $libname.so$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case "$host_os" in + freebsd2* | freebsd3.[01]* | freebsdelf3.[01]*) + shlibpath_overrides_runpath=yes + ;; + *) # from 3.2 on + shlibpath_overrides_runpath=no + ;; + 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 + ;; + +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' + case "$host_os" in + hpux10.20*) + # TODO: Does this work for hpux-11 too? + deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9].[0-9]) shared library' + file_magic_cmd=/usr/bin/file + file_magic_test_file=/usr/lib/libc.sl + ;; + esac + ;; + +irix5* | irix6*) + version_type=irix + 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*) + libsuff= shlibsuff= + # this will be overridden with pass_all, but let us keep it just in case + deplibs_check_method="file_magic ELF 32-bit MSB dynamic lib MIPS - version 1" + ;; + *) + 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}" + file_magic_cmd=/usr/bin/file + file_magic_test_file=`echo /lib${libsuff}/libc.so*` + deplibs_check_method='pass_all' + ;; + +# 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 + deplibs_check_method=pass_all + + if test -f /lib/ld.so.1; then + dynamic_linker='GNU ld.so' + else + # Only the GNU ld.so supports shared libraries on MkLinux. + case "$host_cpu" in + powerpc*) dynamic_linker=no ;; + *) dynamic_linker='Linux ld.so' ;; + esac + fi + ;; + +netbsd*) + version_type=sunos + 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 + ;; + +openbsd*) + version_type=sunos + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + need_version=no + 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 + soname_spec='${libname}${release}.so' + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so $libname.so' + shlibpath_var=LD_LIBRARY_PATH + # this will be overridden with pass_all, but let us keep it just in case + deplibs_check_method='file_magic COFF format alpha shared library' + file_magic_cmd=/usr/bin/file + file_magic_test_file=/shlib/libc.so + deplibs_check_method='pass_all' + 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" + ;; + +rhapsody*) + version_type=sunos + library_names_spec='${libname}.so' + soname_spec='${libname}.so' + shlibpath_var=DYLD_LIBRARY_PATH + deplibs_check_method=pass_all + ;; + +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 + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + deplibs_check_method="file_magic ELF [0-9][0-9]-bit [LM]SB dynamic lib" + file_magic_cmd=/usr/bin/file + file_magic_test_file=/lib/libc.so + ;; + +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 + sequent) + file_magic_cmd='/bin/file' + deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' + ;; + ncr) + deplibs_check_method='pass_all' + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + 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]' + file_magic_cmd=/usr/bin/file + file_magic_test_file=`echo /usr/lib/libc.so*` + ;; + 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 "$ac_t$dynamic_linker" 1>&6 +test "$dynamic_linker" = no && can_build_shared=no + +# Report the final consequences. +echo "checking if libtool supports shared libraries... $can_build_shared" 1>&6 + +# Only try to build win32 dlls if AC_LIBTOOL_WIN32_DLL was used in +# configure.in, otherwise build static only libraries. +case "$host_os" in +cygwin* | mingw* | os2*) + if test x$can_build_shared = xyes; then + test x$enable_win32_dll = xno && can_build_shared=no + echo "checking if package supports dlls... $can_build_shared" 1>&6 + fi +;; +esac + +if test -n "$file_magic_test_file" && test -n "$file_magic_cmd"; then + case "$deplibs_check_method" in + "file_magic "*) + file_magic_regex="`expr \"$deplibs_check_method\" : \"file_magic \(.*\)\"`" + 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 + +echo $ac_n "checking whether to build shared libraries... $ac_c" 1>&6 +test "$can_build_shared" = "no" && enable_shared=no + +# On AIX, shared libraries and static libraries use the same namespace, and +# are all built from PIC. +case "$host_os" in +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*) + test "$enable_shared" = yes && enable_static=no + ;; +esac + +echo "$ac_t$enable_shared" 1>&6 + +# Make sure either enable_shared or enable_static is yes. +test "$enable_shared" = yes || enable_static=yes + +echo "checking whether to build static libraries... $enable_static" 1>&6 + +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 + +echo $ac_n "checking for objdir... $ac_c" 1>&6 +rm -f .libs 2>/dev/null +mkdir .libs 2>/dev/null +if test -d .libs; then + objdir=.libs +else + # MS-DOS does not allow filenames that begin with a dot. + objdir=_libs +fi +rmdir .libs 2>/dev/null +echo "$ac_t$objdir" 1>&6 + +if test "x$enable_dlopen" != xyes; then + enable_dlopen=unknown + enable_dlopen_self=unknown + enable_dlopen_self_static=unknown +else +if eval "test \"`echo '$''{'lt_cv_dlopen'+set}'`\" != set"; then + lt_cv_dlopen=no lt_cv_dlopen_libs= +echo $ac_n "checking for dlopen in -ldl""... $ac_c" 1>&6 +echo "$progname:2248: checking for dlopen in -ldl" >&5 +ac_lib_var=`echo dl'_'dlopen | sed 'y%./+-%__p_%'` +if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + ac_save_LIBS="$LIBS" +LIBS="-ldl $LIBS" +cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=yes" +else + echo "$progname: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=no" +fi +rm -f conftest* +LIBS="$ac_save_LIBS" + +fi +if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then + echo "$ac_t""yes" 1>&6 + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" +else + echo "$ac_t""no" 1>&6 +echo $ac_n "checking for dlopen""... $ac_c" 1>&6 +echo "$progname:2288: checking for dlopen" >&5 +if eval "test \"`echo '$''{'ac_cv_func_dlopen'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +/* Override any gcc2 internal prototype to avoid an error. */ +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen(); + +int main() { + +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_dlopen) || defined (__stub___dlopen) +choke me +#else +dlopen(); +#endif + +; return 0; } +EOF +if { (eval echo $progname:2318: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_func_dlopen=yes" +else + echo "$progname: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_func_dlopen=no" +fi +rm -f conftest* +fi +if eval "test \"`echo '$ac_cv_func_'dlopen`\" = yes"; then + echo "$ac_t""yes" 1>&6 + lt_cv_dlopen="dlopen" +else + echo "$ac_t""no" 1>&6 +echo $ac_n "checking for dld_link in -ldld""... $ac_c" 1>&6 +echo "$progname:2335: checking for dld_link in -ldld" >&5 +ac_lib_var=`echo dld'_'dld_link | sed 'y%./+-%__p_%'` +if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + ac_save_LIBS="$LIBS" +LIBS="-ldld $LIBS" +cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=yes" +else + echo "$progname: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=no" +fi +rm -f conftest* +LIBS="$ac_save_LIBS" + +fi +if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then + echo "$ac_t""yes" 1>&6 + lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld" +else + echo "$ac_t""no" 1>&6 +echo $ac_n "checking for shl_load""... $ac_c" 1>&6 +echo "$progname:2375: checking for shl_load" >&5 +if eval "test \"`echo '$''{'ac_cv_func_shl_load'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +/* Override any gcc2 internal prototype to avoid an error. */ +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char shl_load(); + +int main() { + +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_shl_load) || defined (__stub___shl_load) +choke me +#else +shl_load(); +#endif + +; return 0; } +EOF +if { (eval echo $progname:2405: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_func_shl_load=yes" +else + echo "$progname: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_func_shl_load=no" +fi +rm -f conftest* +fi + +if eval "test \"`echo '$ac_cv_func_'shl_load`\" = yes"; then + echo "$ac_t""yes" 1>&6 + lt_cv_dlopen="shl_load" +else + echo "$ac_t""no" 1>&6 +echo $ac_n "checking for shl_load in -ldld""... $ac_c" 1>&6 +echo "$progname:2423: checking for shl_load in -ldld" >&5 +ac_lib_var=`echo dld'_'shl_load | sed 'y%./+-%__p_%'` +if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + ac_save_LIBS="$LIBS" +LIBS="-ldld $LIBS" +cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=yes" +else + echo "$progname: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=no" +fi +rm -f conftest* +LIBS="$ac_save_LIBS" + +fi +if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then + echo "$ac_t""yes" 1>&6 + lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld" +else + echo "$ac_t""no" 1>&6 +fi + + +fi + + +fi + + +fi + + +fi + +fi + + if test "x$lt_cv_dlopen" != xno; then + enable_dlopen=yes + fi + + case "$lt_cv_dlopen" in + dlopen) +for ac_hdr in dlfcn.h; do +ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` +echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 +echo "$progname:2488: checking for $ac_hdr" >&5 +if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +int fnord = 0; +EOF +ac_try="$ac_compile >/dev/null 2>conftest.out" +{ (eval echo $progname:2498: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` +if test -z "$ac_err"; then + rm -rf conftest* + eval "ac_cv_header_$ac_safe=yes" +else + echo "$ac_err" >&5 + echo "$progname: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_header_$ac_safe=no" +fi +rm -f conftest* +fi +if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then + echo "$ac_t""yes" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi +done + + if test "x$ac_cv_header_dlfcn_h" = xyes; then + CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" + fi + eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" + LIBS="$lt_cv_dlopen_libs $LIBS" + + echo $ac_n "checking whether a program can dlopen itself""... $ac_c" 1>&6 +echo "$progname:2526: checking whether a program can dlopen itself" >&5 +if test "${lt_cv_dlopen_self+set}" = set; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + if test "$cross_compiling" = yes; then + lt_cv_dlopen_self=cross + else + cat > conftest.c < +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LTDL_GLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LTDL_GLOBAL DL_GLOBAL +# else +# define LTDL_GLOBAL 0 +# endif +#endif + +/* We may have to define LTDL_LAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LTDL_LAZY_OR_NOW +# ifdef RTLD_LAZY +# define LTDL_LAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LTDL_LAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LTDL_LAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LTDL_LAZY_OR_NOW DL_NOW +# else +# define LTDL_LAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +fnord() { int i=42;} +main() { void *self, *ptr1, *ptr2; self=dlopen(0,LTDL_GLOBAL|LTDL_LAZY_OR_NOW); + if(self) { ptr1=dlsym(self,"fnord"); ptr2=dlsym(self,"_fnord"); + if(ptr1 || ptr2) { dlclose(self); exit(0); } } exit(1); } + +EOF +if { (eval echo $progname:2580: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null +then + lt_cv_dlopen_self=yes +else + echo "$progname: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -fr conftest* + lt_cv_dlopen_self=no +fi +rm -fr conftest* +fi + +fi + +echo "$ac_t""$lt_cv_dlopen_self" 1>&6 + + if test "$lt_cv_dlopen_self" = yes; then + LDFLAGS="$LDFLAGS $link_static_flag" + echo $ac_n "checking whether a statically linked program can dlopen itself""... $ac_c" 1>&6 +echo "$progname:2599: checking whether a statically linked program can dlopen itself" >&5 +if test "${lt_cv_dlopen_self_static+set}" = set; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + if test "$cross_compiling" = yes; then + lt_cv_dlopen_self_static=cross + else + cat > conftest.c < +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LTDL_GLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LTDL_GLOBAL DL_GLOBAL +# else +# define LTDL_GLOBAL 0 +# endif +#endif + +/* We may have to define LTDL_LAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LTDL_LAZY_OR_NOW +# ifdef RTLD_LAZY +# define LTDL_LAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LTDL_LAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LTDL_LAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LTDL_LAZY_OR_NOW DL_NOW +# else +# define LTDL_LAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +fnord() { int i=42;} +main() { void *self, *ptr1, *ptr2; self=dlopen(0,LTDL_GLOBAL|LTDL_LAZY_OR_NOW); + if(self) { ptr1=dlsym(self,"fnord"); ptr2=dlsym(self,"_fnord"); + if(ptr1 || ptr2) { dlclose(self); exit(0); } } exit(1); } + +EOF +if { (eval echo $progname:2653: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null +then + lt_cv_dlopen_self_static=yes +else + echo "$progname: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -fr conftest* + lt_cv_dlopen_self_static=no +fi +rm -fr conftest* +fi + +fi + +echo "$ac_t""$lt_cv_dlopen_self_static" 1>&6 +fi + ;; + 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 + +# Copy echo and quote the copy, instead of the original, because it is +# used later. +ltecho="$echo" +if test "X$ltecho" = "X$CONFIG_SHELL $0 --fallback-echo"; then + ltecho="$CONFIG_SHELL \$0 --fallback-echo" +fi +LTSHELL="$SHELL" + +LTCONFIG_VERSION="$VERSION" + +# Only quote variables if we're using ltmain.sh. +case "$ltmain" in +*.sh) + # Now quote all the things that may contain metacharacters. + for var in ltecho old_CC old_CFLAGS old_CPPFLAGS \ + old_LD old_LDFLAGS old_LIBS \ + old_NM old_RANLIB old_LN_S old_DLLTOOL old_OBJDUMP old_AS \ + AR CC LD LN_S NM LTSHELL LTCONFIG_VERSION \ + 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 \ + 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 \ + 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 | \ + postinstall_cmds | postuninstall_cmds | \ + finish_cmds | sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) + # Double-quote double-evaled strings. + eval "$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" + ;; + *) + eval "$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" + ;; + esac + done + + case "$ltecho" in + *'\$0 --fallback-echo"') + ltecho=`$echo "X$ltecho" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` + ;; + esac + + trap "$rm \"$ofile\"; exit 1" 1 2 15 + echo "creating $ofile" + $rm "$ofile" + cat < "$ofile" +#! $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 ltconfig or ltmain.sh. +# +# Copyright (C) 1996-1999 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. + +# 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 +EOF + cfgfile="$ofile" + ;; + +*) + # Double-quote the variables that need it (for aesthetics). + for var in old_CC old_CFLAGS old_CPPFLAGS \ + old_LD old_LDFLAGS old_LIBS \ + old_NM old_RANLIB old_LN_S old_DLLTOOL old_OBJDUMP old_AS; do + eval "$var=\\\"\$var\\\"" + done + + # Just create a config file. + cfgfile="$ofile.cfg" + trap "$rm \"$cfgfile\"; exit 1" 1 2 15 + echo "creating $cfgfile" + $rm "$cfgfile" + cat < "$cfgfile" +# `$echo "$cfgfile" | sed 's%^.*/%%'` - Libtool configuration file. +# Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP) +EOF + ;; +esac + +cat <> "$cfgfile" +# Libtool was configured as follows, on host `(hostname || uname -n) 2>/dev/null | sed 1q`: +# +# CC=$old_CC CFLAGS=$old_CFLAGS CPPFLAGS=$old_CPPFLAGS \\ +# LD=$old_LD LDFLAGS=$old_LDFLAGS LIBS=$old_LIBS \\ +# NM=$old_NM RANLIB=$old_RANLIB LN_S=$old_LN_S \\ +# DLLTOOL=$old_DLLTOOL OBJDUMP=$old_OBJDUMP AS=$old_AS \\ +# $0$ltconfig_args +# +# Compiler and other test output produced by $progname, useful for +# debugging $progname, is in ./config.log if it exists. + +# The version of $progname that generated this script. +LTCONFIG_VERSION=$LTCONFIG_VERSION + +# Shell to use when invoking shell scripts. +SHELL=$LTSHELL + +# 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 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=$ltecho + +# The archiver. +AR=$AR + +# The default C compiler. +CC=$CC + +# The linker used to build libraries. +LD=$LD + +# Whether we need hard or soft links. +LN_S=$LN_S + +# A BSD-compatible nm program. +NM=$NM + +# 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=$reload_flag +reload_cmds=$reload_cmds + +# How to pass a linker flag through the compiler. +wl=$wl + +# Object file suffix (normally "o"). +objext="$objext" + +# Old archive suffix (normally "a"). +libext="$libext" + +# Executable file suffix (normally ""). +exeext="$exeext" + +# Additional compiler flags for building library objects. +pic_flag=$pic_flag + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$compiler_c_o + +# Can we write directly to a .lo ? +compiler_o_lo=$compiler_o_lo + +# Must we lock files when doing compilation ? +need_locks=$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=$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=$link_static_flag + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$no_builtin_flag + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$export_dynamic_flag_spec + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$whole_archive_flag_spec + +# Compiler flag to generate thread-safe objects. +thread_safe_flag_spec=$thread_safe_flag_spec + +# Library versioning type. +version_type=$version_type + +# Format of library name prefix. +libname_spec=$libname_spec + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME. +library_names_spec=$library_names_spec + +# The coded name of the library, if different from the real name. +soname_spec=$soname_spec + +# Commands used to build and install an old-style archive. +RANLIB=$RANLIB +old_archive_cmds=$old_archive_cmds +old_postinstall_cmds=$old_postinstall_cmds +old_postuninstall_cmds=$old_postuninstall_cmds + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$old_archive_from_new_cmds + +# Commands used to build and install a shared archive. +archive_cmds=$archive_cmds +archive_expsym_cmds=$archive_expsym_cmds +postinstall_cmds=$postinstall_cmds +postuninstall_cmds=$postuninstall_cmds + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method=$deplibs_check_method + +# Command to use when deplibs_check_method == file_magic. +file_magic_cmd=$file_magic_cmd + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$allow_undefined_flag + +# Flag that forces no undefined symbols. +no_undefined_flag=$no_undefined_flag + +# Commands used to finish a libtool library installation in a directory. +finish_cmds=$finish_cmds + +# Same as above, but a single script fragment to be evaled but not shown. +finish_eval=$finish_eval + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe=$global_symbol_pipe + +# Transform the output of nm in a proper C declaration +global_symbol_to_cdecl=$global_symbol_to_cdecl + +# 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 + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist. +hardcode_libdir_flag_spec=$hardcode_libdir_flag_spec + +# Whether we need a single -rpath flag with a separated argument. +hardcode_libdir_separator=$hardcode_libdir_separator + +# Set to yes if using DIR/libNAME.so during linking hardcodes DIR into the +# resulting binary. +hardcode_direct=$hardcode_direct + +# Set to yes if using the -LDIR flag during linking hardcodes DIR into the +# resulting binary. +hardcode_minus_L=$hardcode_minus_L + +# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into +# the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var + +# Compile-time system search path for libraries +sys_lib_search_path_spec=$sys_lib_search_path_spec + +# Run-time system search path for libraries +sys_lib_dlsearch_path_spec=$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=$export_symbols_cmds + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$exclude_expsyms + +# Symbols that must always be exported. +include_expsyms=$include_expsyms + +EOF + +case "$ltmain" in +*.sh) + echo '### END LIBTOOL CONFIG' >> "$ofile" + echo >> "$ofile" + case "$host_os" in + aix3*) + cat <<\EOF >> "$ofile" + +# AIX sometimes has problems with the GCC collect2 program. For some +# reason, if we set the COLLECT_NAMES environment variable, the problems +# vanish in a puff of smoke. +if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES +fi +EOF + ;; + esac + + # Append the ltmain.sh script. + sed '$q' "$ltmain" >> "$ofile" || (rm -f "$ofile"; exit 1) + # We use sed instead of cat because bash on DJGPP gets confused if + # if finds mixed CR/LF and LF-only lines. Since sed operates in + # text mode, it properly converts lines to CR/LF. This bash problem + # is reportedly fixed, but why not run on old versions too? + + chmod +x "$ofile" + ;; + +*) + # Compile the libtool program. + echo "FIXME: would compile $ltmain" + ;; +esac + +test -n "$cache_file" || exit 0 + +# AC_CACHE_SAVE +trap '' 1 2 15 +cat > confcache <<\EOF +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs. It is not useful on other systems. +# If it contains results you don't want to keep, you may remove or edit it. +# +# By default, configure uses ./config.cache as the cache file, +# creating it if it does not exist already. You can give configure +# the --cache-file=FILE option to use a different cache file; that is +# what configure does when it calls configure scripts in +# subdirectories, so they share the cache. +# Giving --cache-file=/dev/null disables caching, for debugging configure. +# config.status only pays attention to the cache file if you give it the +# --recheck option to rerun configure. +# +EOF +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, don't put newlines in cache variables' values. +# Ultrix sh set writes to stderr and can't be redirected directly, +# and sets the high bit in the cache file unless we assign to the vars. +(set) 2>&1 | + case `(ac_space=' '; set | 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 \ + -e "s/'/'\\\\''/g" \ + -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p" + ;; + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p' + ;; + esac >> confcache +if cmp -s $cache_file confcache; then + : +else + if test -w $cache_file; then + echo "updating cache $cache_file" + cat confcache > $cache_file + else + echo "not updating unwritable cache $cache_file" + fi +fi +rm -f confcache + +exit 0 + +# Local Variables: +# mode:shell-script +# sh-indentation:2 +# End: Index: xc/extras/freetype2/builds/cygwin/ltmain.sh diff -u /dev/null xc/extras/freetype2/builds/cygwin/ltmain.sh:1.1.1.1 --- /dev/null Mon Dec 18 14:22:19 2000 +++ xc/extras/freetype2/builds/cygwin/ltmain.sh Fri Dec 8 16:26:07 2000 @@ -0,0 +1,4024 @@ +# ltmain.sh - Provide generalized library-building support services. +# NOTE: Changing this file will not affect anything until you rerun ltconfig. +# +# Copyright (C) 1996-1999 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 + +if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then + echo "$modename: not configured to build any kind of library" 1>&2 + echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2 + exit 1 +fi + +# Global variables. +mode=$default_mode +nonopt= +prev= +prevopt= +run= +show="$echo" +show_help= +execute_dlfiles= +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) + eval "$prev=\"\$$prev \$arg\"" + ;; + *) + eval "$prev=\$arg" + ;; + esac + + prev= + prevopt= + continue + fi + + # Have we seen a non-optional argument yet? + case "$arg" in + --help) + show_help=yes + ;; + + --version) + echo "$PROGRAM (GNU $PACKAGE) $VERSION$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" ;; + + --quiet | --silent) + show=: + ;; + + -dlopen) + prevopt="-dlopen" + prev=execute_dlfiles + ;; + + -*) + $echo "$modename: unrecognized option \`$arg'" 1>&2 + $echo "$help" 1>&2 + exit 1 + ;; + + *) + nonopt="$arg" + break + ;; + esac +done + +if test -n "$prevopt"; then + $echo "$modename: option \`$prevopt' requires an argument" 1>&2 + $echo "$help" 1>&2 + exit 1 +fi + +if test -z "$show_help"; then + + # Infer the operation mode. + if test -z "$mode"; then + case "$nonopt" in + *cc | *++ | gcc* | *-gcc*) + mode=link + for arg + do + case "$arg" in + -c) + mode=compile + break + ;; + esac + done + ;; + *db | *dbx | *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= + lastarg= + srcfile="$nonopt" + suppress_output= + + user_target=no + for arg + do + # 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 + ;; + 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 + + # 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 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 + + # All platforms use -DPIC, to notify preprocessed assembler code. + command="$base_compile $srcfile $pic_flag -DPIC" + 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 "$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 + 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 + command="$base_compile $srcfile" + 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 + $rm "$lockfile" + fi + + exit 0 + ;; + + # libtool link mode + link) + modename="$modename: link" + case "$host" in + *-*-cygwin* | *-*-mingw* | *-*-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 + + # 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 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() */ +# +# 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) +# 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&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 + + # 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= + ;; + 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 + ;; + 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 + ;; + *) + eval "$prev=\"\$arg\"" + prev= + continue + ;; + esac + fi + + prevarg="$arg" + + case "$arg" in + -all-static) + if test -n "$link_static_flag"; then + compile_command="$compile_command $link_static_flag" + finalize_command="$finalize_command $link_static_flag" + fi + continue + ;; + + -allow-undefined) + # FIXME: remove this flag sometime in the future. + $echo "$modename: \`-allow-undefined' is deprecated because it is the default" 1>&2 + continue + ;; + + -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: not more than one -exported-symbols argument allowed" + exit 1 + fi + if test "X$arg" = "X-export-symbols"; then + prev=expsyms + else + prev=expsyms_regex + fi + 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: warning: cannot determine absolute directory name of \`$dir'" 1>&2 + $echo "$modename: passing it literally to the linker, although it might fail" 1>&2 + absdir="$dir" + fi + dir="$absdir" + ;; + esac + case " $deplibs " in + *" $arg "*) ;; + *) deplibs="$deplibs $arg";; + esac + case " $lib_search_path " in + *" $dir "*) ;; + *) lib_search_path="$lib_search_path $dir";; + esac + case "$host" in + *-*-cygwin* | *-*-mingw* | *-*-os2*) + dllsearchdir=`cd "$dir" && pwd || echo "$dir"` + case ":$dllsearchpath:" in + ::) dllsearchpath="$dllsearchdir";; + *":$dllsearchdir:"*) ;; + *) dllsearchpath="$dllsearchpath:$dllsearchdir";; + esac + ;; + esac + ;; + + -l*) + if test "$arg" = "-lc"; then + case "$host" in + *-*-cygwin* | *-*-mingw* | *-*-os2* | *-*-beos*) + # These systems don't actually have c library (as such) + continue + ;; + esac + elif test "$arg" = "-lm"; then + case "$host" in + *-*-cygwin* | *-*-beos*) + # These systems don't actually have math library (as such) + continue + ;; + esac + fi + deplibs="$deplibs $arg" + ;; + + -module) + module=yes + 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) + # If we have no pic_flag, then this is the same as -all-static. + if test -z "$pic_flag" && test -n "$link_static_flag"; then + compile_command="$compile_command $link_static_flag" + finalize_command="$finalize_command $link_static_flag" + fi + continue + ;; + + -thread-safe) + thread_safe=yes + continue + ;; + + -version-info) + prev=vinfo + continue + ;; + + # Some other compiler flag. + -* | +*) + # Unknown arguments in both finalize_command and compile_command need + # to be aesthetically quoted because they are evaled later. + arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` + case "$arg" in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*) + arg="\"$arg\"" + ;; + esac + ;; + + *.o | *.obj | *.a | *.lib) + # A standard object. + objs="$objs $arg" + ;; + + *.lo) + # A library object. + if test "$prev" = dlfiles; then + dlfiles="$dlfiles $arg" + if test "$build_libtool_libs" = yes && test "$dlopen" = yes; then + prev= + continue + else + # If libtool objects are unsupported, then we need to preload. + prev=dlprefiles + fi + fi + + if test "$prev" = dlprefiles; then + # Preload the old-style object. + dlprefiles="$dlprefiles "`$echo "X$arg" | $Xsed -e "$lo2o"` + prev= + fi + libobjs="$libobjs $arg" + ;; + + *.la) + # A libtool-controlled library. + + dlname= + libdir= + library_names= + old_library= + + # Check to see that this really is a libtool archive. + if (sed -e '2q' $arg | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : + else + $echo "$modename: \`$arg' is not a valid libtool archive" 1>&2 + exit 1 + fi + + # If the library was installed with an old release of libtool, + # it will not redefine variable installed. + installed=yes + + # Read the .la file + # If there is no directory component, then add one. + case "$arg" in + */* | *\\*) . $arg ;; + *) . ./$arg ;; + esac + + # Get the name of the library we link against. + linklib= + for l in $old_library $library_names; do + linklib="$l" + done + + if test -z "$linklib"; then + $echo "$modename: cannot find name of link library for \`$arg'" 1>&2 + exit 1 + fi + + # Find the relevant object directory and library name. + name=`$echo "X$arg" | $Xsed -e 's%^.*/%%' -e 's/\.la$//' -e 's/^lib//'` + + if test "X$installed" = Xyes; then + dir="$libdir" + else + dir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` + if test "X$dir" = "X$arg"; then + dir="$objdir" + else + dir="$dir/$objdir" + fi + fi + + if test -n "$dependency_libs"; then + # Extract -R and -L from dependency_libs + temp_deplibs= + for deplib in $dependency_libs; do + case "$deplib" in + -R*) temp_xrpath=`$echo "X$deplib" | $Xsed -e 's/^-R//'` + case " $rpath $xrpath " in + *" $temp_xrpath "*) ;; + *) xrpath="$xrpath $temp_xrpath";; + esac;; + -L*) case "$compile_command $temp_deplibs " in + *" $deplib "*) ;; + *) temp_deplibs="$temp_deplibs $deplib";; + esac + temp_dir=`$echo "X$deplib" | $Xsed -e 's/^-L//'` + case " $lib_search_path " in + *" $temp_dir "*) ;; + *) lib_search_path="$lib_search_path $temp_dir";; + esac + ;; + *) temp_deplibs="$temp_deplibs $deplib";; + esac + done + dependency_libs="$temp_deplibs" + fi + + if test -z "$libdir"; then + # It is a libtool convenience library, so add in its objects. + convenience="$convenience $dir/$old_library" + old_convenience="$old_convenience $dir/$old_library" + deplibs="$deplibs$dependency_libs" + compile_command="$compile_command $dir/$old_library$dependency_libs" + finalize_command="$finalize_command $dir/$old_library$dependency_libs" + continue + fi + + # This library was specified with -dlopen. + if test "$prev" = dlfiles; then + dlfiles="$dlfiles $arg" + if test -z "$dlname" || test "$dlopen" != yes || test "$build_libtool_libs" = no; then + # If there is no dlname, no dlopen support or we're linking statically, + # we need to preload. + prev=dlprefiles + else + # We should not create a dependency on this library, but we + # may need any libraries it requires. + compile_command="$compile_command$dependency_libs" + finalize_command="$finalize_command$dependency_libs" + prev= + continue + fi + fi + + # The library was specified with -dlpreopen. + if test "$prev" = dlprefiles; then + # Prefer using a static library (so that no silly _DYNAMIC symbols + # are required to link). + if test -n "$old_library"; then + dlprefiles="$dlprefiles $dir/$old_library" + else + dlprefiles="$dlprefiles $dir/$linklib" + fi + prev= + fi + + if test -n "$library_names" && + { test "$prefer_static_libs" = no || test -z "$old_library"; }; then + link_against_libtool_libs="$link_against_libtool_libs $arg" + if test -n "$shlibpath_var"; then + # Make sure the rpath contains only unique directories. + case "$temp_rpath " in + *" $dir "*) ;; + *) temp_rpath="$temp_rpath $dir" ;; + esac + fi + + # 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 + $echo "$modename: passing it literally to the linker, although it might fail" 1>&2 + absdir="$dir" + fi + ;; + esac + + # This is the magic to use -rpath. + # Skip directories that are in the system default run-time + # search path, unless they have been requested with -R. + 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 + + lib_linked=yes + case "$hardcode_action" in + immediate | unsupported) + if test "$hardcode_direct" = no; then + compile_command="$compile_command $dir/$linklib" + deplibs="$deplibs $dir/$linklib" + case "$host" in + *-*-cygwin* | *-*-mingw* | *-*-os2*) + dllsearchdir=`cd "$dir" && pwd || echo "$dir"` + if test -n "$dllsearchpath"; then + dllsearchpath="$dllsearchpath:$dllsearchdir" + else + dllsearchpath="$dllsearchdir" + fi + ;; + esac + elif test "$hardcode_minus_L" = no; then + case "$host" in + *-*-sunos*) + compile_shlibpath="$compile_shlibpath$dir:" + ;; + esac + case "$compile_command " in + *" -L$dir "*) ;; + *) compile_command="$compile_command -L$dir";; + esac + compile_command="$compile_command -l$name" + deplibs="$deplibs -L$dir -l$name" + elif test "$hardcode_shlibpath_var" = no; then + case ":$compile_shlibpath:" in + *":$dir:"*) ;; + *) compile_shlibpath="$compile_shlibpath$dir:";; + esac + compile_command="$compile_command -l$name" + deplibs="$deplibs -l$name" + else + lib_linked=no + fi + ;; + + relink) + if test "$hardcode_direct" = yes; then + compile_command="$compile_command $absdir/$linklib" + deplibs="$deplibs $absdir/$linklib" + elif test "$hardcode_minus_L" = yes; then + case "$compile_command " in + *" -L$absdir "*) ;; + *) compile_command="$compile_command -L$absdir";; + esac + compile_command="$compile_command -l$name" + deplibs="$deplibs -L$absdir -l$name" + elif test "$hardcode_shlibpath_var" = yes; then + case ":$compile_shlibpath:" in + *":$absdir:"*) ;; + *) compile_shlibpath="$compile_shlibpath$absdir:";; + esac + compile_command="$compile_command -l$name" + deplibs="$deplibs -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 + + # Finalize command for both is simple: just hardcode it. + if test "$hardcode_direct" = yes; then + finalize_command="$finalize_command $libdir/$linklib" + elif test "$hardcode_minus_L" = yes; then + case "$finalize_command " in + *" -L$libdir "*) ;; + *) finalize_command="$finalize_command -L$libdir";; + esac + finalize_command="$finalize_command -l$name" + elif test "$hardcode_shlibpath_var" = yes; then + case ":$finalize_shlibpath:" in + *":$libdir:"*) ;; + *) finalize_shlibpath="$finalize_shlibpath$libdir:";; + esac + finalize_command="$finalize_command -l$name" + else + # We cannot seem to hardcode it, guess we'll fake it. + case "$finalize_command " in + *" -L$dir "*) ;; + *) finalize_command="$finalize_command -L$libdir";; + esac + finalize_command="$finalize_command -l$name" + fi + else + # Transform directly to old archives if we don't build new libraries. + if test -n "$pic_flag" && test -z "$old_library"; then + $echo "$modename: cannot find static library for \`$arg'" 1>&2 + exit 1 + fi + + # Here we assume that one of hardcode_direct or hardcode_minus_L + # is not unsupported. This is valid on all known static and + # shared platforms. + if test "$hardcode_direct" != unsupported; then + test -n "$old_library" && linklib="$old_library" + compile_command="$compile_command $dir/$linklib" + finalize_command="$finalize_command $dir/$linklib" + else + case "$compile_command " in + *" -L$dir "*) ;; + *) compile_command="$compile_command -L$dir";; + esac + compile_command="$compile_command -l$name" + case "$finalize_command " in + *" -L$dir "*) ;; + *) finalize_command="$finalize_command -L$dir";; + esac + finalize_command="$finalize_command -l$name" + fi + fi + + # Add in any libraries that this one depends upon. + compile_command="$compile_command$dependency_libs" + finalize_command="$finalize_command$dependency_libs" + continue + ;; + + # Some other compiler argument. + *) + # Unknown arguments in both finalize_command and compile_command need + # to be aesthetically quoted because they are evaled later. + arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` + case "$arg" in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*) + arg="\"$arg\"" + ;; + esac + ;; + esac + + # Now actually substitute the argument into the commands. + if test -n "$arg"; then + compile_command="$compile_command $arg" + finalize_command="$finalize_command $arg" + fi + done + + if test -n "$prev"; then + $echo "$modename: the \`$prevarg' option requires an argument" 1>&2 + $echo "$help" 1>&2 + exit 1 + fi + + if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then + eval arg=\"$export_dynamic_flag_spec\" + compile_command="$compile_command $arg" + finalize_command="$finalize_command $arg" + fi + + oldlibs= + # calculate the name of the file, without its directory + outputname=`$echo "X$output" | $Xsed -e 's%^.*/%%'` + libobjs_save="$libobjs" + + case "$output" in + "") + $echo "$modename: you must specify an output file" 1>&2 + $echo "$help" 1>&2 + exit 1 + ;; + + *.a | *.lib) + if test -n "$link_against_libtool_libs"; then + $echo "$modename: error: cannot link libtool libraries into archives" 1>&2 + exit 1 + fi + + if test -n "$deplibs"; then + $echo "$modename: warning: \`-l' and \`-L' are ignored for archives" 1>&2 + fi + + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + $echo "$modename: warning: \`-dlopen' is ignored for archives" 1>&2 + fi + + if test -n "$rpath"; then + $echo "$modename: warning: \`-rpath' is ignored for archives" 1>&2 + fi + + if test -n "$xrpath"; then + $echo "$modename: warning: \`-R' is ignored for archives" 1>&2 + fi + + if test -n "$vinfo"; then + $echo "$modename: warning: \`-version-info' 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" + ;; + + *.la) + # 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 + + 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 + + if test -n "$objs"; then + $echo "$modename: cannot build libtool library \`$output' from non-libtool objects:$objs" 2>&1 + exit 1 + fi + + # How the heck are we supposed to write a wrapper for a shared library? + if test -n "$link_against_libtool_libs"; then + $echo "$modename: error: cannot link shared libraries into libtool libraries" 1>&2 + exit 1 + fi + + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + $echo "$modename: warning: \`-dlopen' 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 + dependency_libs="$deplibs" + + 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. + IFS="${IFS= }"; 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]*) ;; + *) + $echo "$modename: CURRENT \`$current' is not a nonnegative integer" 1>&2 + $echo "$modename: \`$vinfo' is not valid version information" 1>&2 + exit 1 + ;; + esac + + case "$revision" in + 0 | [1-9] | [1-9][0-9]*) ;; + *) + $echo "$modename: REVISION \`$revision' is not a nonnegative integer" 1>&2 + $echo "$modename: \`$vinfo' is not valid version information" 1>&2 + exit 1 + ;; + esac + + case "$age" in + 0 | [1-9] | [1-9][0-9]*) ;; + *) + $echo "$modename: AGE \`$age' is not a nonnegative integer" 1>&2 + $echo "$modename: \`$vinfo' is not valid version information" 1>&2 + exit 1 + ;; + esac + + if test $age -gt $current; then + $echo "$modename: AGE \`$age' is greater than the current interface number \`$current'" 1>&2 + $echo "$modename: \`$vinfo' is not valid version information" 1>&2 + exit 1 + fi + + # Calculate the version variables. + major= + versuffix= + verstring= + case "$version_type" in + none) ;; + + irix) + major=`expr $current - $age + 1` + versuffix="$major.$revision" + verstring="sgi$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="sgi$major.$iface:$verstring" + done + ;; + + 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" + ;; + + freebsd-aout) + major=".$current" + versuffix=".$current.$revision"; + ;; + + freebsd-elf) + major=".$current" + versuffix=".$current"; + ;; + + windows) + # Like Linux, but with '-' rather than '.', since we only + # want one extension on Windows 95. + major=`expr $current - $age` + versuffix="-$major-$age-$revision" + ;; + + *) + $echo "$modename: unknown library version type \`$version_type'" 1>&2 + echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2 + exit 1 + ;; + esac + + # Clear the version info if we defaulted, and they specified a release. + if test -z "$vinfo" && test -n "$release"; then + major= + verstring="0.0" + 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 + + dependency_libs="$deplibs" + case "$host" in + *-*-cygwin* | *-*-mingw* | *-*-os2* | *-*-beos*) + # these systems don't actually have a c library (as such)! + ;; + *-*-rhapsody*) + # rhapsody is a little odd... + deplibs="$deplibs -framework System" + ;; + *) + # Add libc to deplibs on all other systems. + deplibs="$deplibs -lc" + ;; + esac + fi + + # Create the output directory, or remove our outputs if we need to. + if test -d $output_objdir; then + $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}.* + else + $show "$mkdir $output_objdir" + $run $mkdir $output_objdir + status=$? + if test $status -ne 0 && test ! -d $output_objdir; then + exit $status + fi + fi + + # Now set the variables for building old libraries. + if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then + oldlibs="$oldlibs $output_objdir/$libname.$libext" + + # Transform .lo files to .o files. + oldobjs="$objs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}'$/d' -e "$lo2o" | $NL2SP` + fi + + if test "$build_libtool_libs" = yes; then + # 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: This library needs some functionality provided by $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." + 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 + + 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." + 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 + # Get the real and link names of the library. + eval library_names=\"$library_names_spec\" + set dummy $library_names + realname="$2" + shift; shift + + if test -n "$soname_spec"; then + eval soname=\"$soname_spec\" + else + soname="$realname" + fi + + lib="$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\" + IFS="${IFS= }"; 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\" + linkopts="$linkopts $flag" + fi + + # Do each of the archive commands. + if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then + eval cmds=\"$archive_expsym_cmds\" + else + eval cmds=\"$archive_cmds\" + fi + IFS="${IFS= }"; save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + + # 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 + ;; + + *.lo | *.o | *.obj) + if test -n "$link_against_libtool_libs"; then + $echo "$modename: error: cannot link libtool libraries into objects" 1>&2 + exit 1 + fi + + 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"; 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 "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}$'/d' -e '/\.lib$/d' -e "$lo2o" | $NL2SP`" $reload_conv_objs" + + output="$obj" + eval cmds=\"$reload_cmds\" + IFS="${IFS= }"; save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + + # Exit if we aren't doing a library object file. + 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"; then + # Only do commands if we really have different PIC objects. + reload_objs="$libobjs $reload_conv_objs" + output="$libobj" + eval cmds=\"$reload_cmds\" + IFS="${IFS= }"; save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + else + # Just create a symlink. + $show $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 + ;; + + # Anything else should be a program. + *) + 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" = 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 + + 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 "$compile_rpath " in + *" $libdir "*) ;; + *) compile_rpath="$compile_rpath $libdir" ;; + esac + 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 + 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" + + 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 binary in the object directory, then wrap it. + 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 + + 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" | $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" | sort +2 | 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_t void * +#else +# define lt_ptr_t char * +# define const +#endif + +/* The mapping between symbol names and symbols. */ +const struct { + const char *name; + lt_ptr_t address; +} +lt_preloaded_symbols[] = +{\ +" + + sed -n -e 's/^: \([^ ]*\) $/ {\"\1\", (lt_ptr_t) 0},/p' \ + -e 's/^. \([^ ]*\) \([^ ]*\)$/ {"\2", (lt_ptr_t) \&\2},/p' \ + < "$nlist" >> "$output_objdir/$dlsyms" + + $echo >> "$output_objdir/$dlsyms" "\ + {0, (lt_ptr_t) 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 -z "$link_against_libtool_libs" || test "$build_libtool_libs" != yes; then + # Replace the output file specification. + compile_command=`$echo "X$compile_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'` + 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 "$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 + 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 + $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: + link_against_libtool_libs='$link_against_libtool_libs' +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' + 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 (cd \"\$thisdir\" && eval \$relink_command); then : + else + $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*) + $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 "`$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 + IFS="${IFS= }"; save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + done + + if test -n "$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" + + if test -n "$xrpath"; then + temp_xrpath= + for libdir in $xrpath; do + temp_xrpath="$temp_xrpath -R$libdir" + done + dependency_libs="$temp_xrpath $dependency_libs" + fi + + # Only create the output if not a dry run. + if test -z "$run"; then + for installed in no yes; do + if test "$installed" = yes; then + if test -z "$install_libdir"; then + break + fi + output="$output_objdir/$outputname"i + fi + $rm $output + $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='$dlname' + +# Names of this library. +library_names='$library_names' + +# The name of the static archive. +old_library='$old_library' + +# Libraries that this one depends upon. +dependency_libs='$dependency_libs' + +# Version information for $libname. +current=$current +age=$age +revision=$revision + +# Is this an already installed library? +installed=$installed + +# Directory that this library needs to be installed in: +libdir='$install_libdir'\ +" + 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; 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 + *.a | *.lib) + # 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= + # If there is no directory component, then add one. + case "$file" in + */* | *\\*) . $file ;; + *) . ./$file ;; + esac + + # Add the libdir to current_libdirs if it is the destination. + if test "X$destdir" = "X$libdir"; then + case "$current_libdirs " in + *" $libdir "*) ;; + *) current_libdirs="$current_libdirs $libdir" ;; + esac + else + # Note the libdir as a future libdir. + case "$future_libdirs " in + *" $libdir "*) ;; + *) future_libdirs="$future_libdirs $libdir" ;; + esac + fi + + dir="`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`/" + test "X$dir" = "X$file/" && dir= + dir="$dir$objdir" + + # See the names of the shared library. + set dummy $library_names + if test -n "$2"; then + realname="$2" + shift + shift + + # Install the shared library and build the symlinks. + $show "$install_prog $dir/$realname $destdir/$realname" + $run eval "$install_prog $dir/$realname $destdir/$realname" || exit $? + + 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\" + IFS="${IFS= }"; save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + fi + + # Install the pseudo-library for information purposes. + name=`$echo "X$file" | $Xsed -e 's%^.*/%%'` + 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"` + ;; + *.o | *.obj) + 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. + if (sed -e '4q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + link_against_libtool_libs= + relink_command= + + # If there is no directory component, then add one. + case "$file" in + */* | *\\*) . $file ;; + *) . ./$file ;; + esac + + # Check the variables that should have been set. + if test -z "$link_against_libtool_libs"; then + $echo "$modename: invalid libtool wrapper script \`$file'" 1>&2 + exit 1 + fi + + finalize=yes + for lib in $link_against_libtool_libs; do + # Check to see that each library is installed. + libdir= + if test -f "$lib"; then + # If there is no directory component, then add one. + case "$lib" in + */* | *\\*) . $lib ;; + *) . ./$lib ;; + esac + fi + libfile="$libdir/`$echo "X$lib" | $Xsed -e 's%^.*/%%g'`" + if test -n "$libdir" && test ! -f "$libfile"; then + $echo "$modename: warning: \`$lib' has not been installed in \`$libdir'" 1>&2 + finalize=no + fi + done + + 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 + 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 + + $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 $? + + # Do each command in the postinstall commands. + eval cmds=\"$old_postinstall_cmds\" + IFS="${IFS= }"; save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + done + + if test -n "$future_libdirs"; then + $echo "$modename: warning: remember to run \`$progname --finish$future_libdirs'" 1>&2 + fi + + if test -n "$current_libdirs"; then + # Maybe just do a dry run. + test -n "$run" && current_libdirs=" -n$current_libdirs" + exec $SHELL $0 --finish$current_libdirs + exit 1 + fi + + exit 0 + ;; + + # libtool finish mode + finish) + modename="$modename: finish" + libdirs="$nonopt" + 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\" + IFS="${IFS= }"; 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 \`-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 actually exec the command. + eval "exec \$cmd$args" + + $echo "$modename: cannot exec \$cmd$args" + exit 1 + 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 uninstall mode + uninstall) + modename="$modename: uninstall" + rm="$nonopt" + files= + + for arg + do + case "$arg" in + -*) rm="$rm $arg" ;; + *) files="$files $arg" ;; + esac + done + + if test -z "$rm"; then + $echo "$modename: you must specify an RM program" 1>&2 + $echo "$help" 1>&2 + exit 1 + fi + + for file in $files; do + dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` + test "X$dir" = "X$file" && dir=. + name=`$echo "X$file" | $Xsed -e 's%^.*/%%'` + + rmfiles="$file" + + case "$name" in + *.la) + # Possibly a libtool archive, so verify it. + if (sed -e '2q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + . $dir/$name + + # Delete the libtool libraries and symlinks. + for n in $library_names; do + rmfiles="$rmfiles $dir/$n" + done + test -n "$old_library" && rmfiles="$rmfiles $dir/$old_library" + + $show "$rm $rmfiles" + $run $rm $rmfiles + + if test -n "$library_names"; then + # Do each command in the postuninstall commands. + eval cmds=\"$postuninstall_cmds\" + IFS="${IFS= }"; save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" + done + IFS="$save_ifs" + fi + + if test -n "$old_library"; then + # Do each command in the old_postuninstall commands. + eval cmds=\"$old_postuninstall_cmds\" + IFS="${IFS= }"; save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" + done + IFS="$save_ifs" + fi + + # FIXME: should reinstall the best remaining shared library. + fi + ;; + + *.lo) + if test "$build_old_libs" = yes; then + oldobj=`$echo "X$name" | $Xsed -e "$lo2o"` + rmfiles="$rmfiles $dir/$oldobj" + fi + $show "$rm $rmfiles" + $run $rm $rmfiles + ;; + + *) + $show "$rm $rmfiles" + $run $rm $rmfiles + ;; + esac + done + exit 0 + ;; + + "") + $echo "$modename: you must specify a MODE" 1>&2 + $echo "$generic_help" 1>&2 + exit 1 + ;; + esac + + $echo "$modename: invalid operation mode \`$mode'" 1>&2 + $echo "$generic_help" 1>&2 + exit 1 +fi # test -z "$show_help" + +# We need to display help for each of the modes. +case "$mode" in +"") $echo \ +"Usage: $modename [OPTION]... [MODE-ARG]... + +Provide generalized library-building support services. + + --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: + + compile compile a source file into a libtool object + execute automatically set library path, then run a program + finish complete the installation of libtool libraries + install install libraries or executables + link create a library or an executable + uninstall remove libraries from an installed directory + +MODE-ARGS vary depending on the MODE. Try \`$modename --help --mode=MODE' for +a more detailed description of MODE." + exit 0 + ;; + +compile) + $echo \ +"Usage: $modename [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE + +Compile a source file into a libtool library object. + +This mode accepts the following additional options: + + -o OUTPUT-FILE set the output file name to OUTPUT-FILE + -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-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: Index: xc/extras/freetype2/builds/cygwin/mkinstalldirs diff -u /dev/null xc/extras/freetype2/builds/cygwin/mkinstalldirs:1.1.1.1 --- /dev/null Mon Dec 18 14:22:19 2000 +++ xc/extras/freetype2/builds/cygwin/mkinstalldirs Fri Dec 8 16:26:07 2000 @@ -0,0 +1,40 @@ +#! /bin/sh +# mkinstalldirs --- make directory hierarchy +# Author: Noah Friedman +# Created: 1993-05-16 +# Public domain + +# $Id: mkinstalldirs,v 1.1 2000/10/03 17:51:29 davidT Exp $ + +errstatus=0 + +for file +do + set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'` + shift + + pathcomp= + for d + do + pathcomp="$pathcomp$d" + case "$pathcomp" in + -* ) pathcomp=./$pathcomp ;; + esac + + if test ! -d "$pathcomp"; then + echo "mkdir $pathcomp" 1>&2 + + mkdir "$pathcomp" || lasterr=$? + + if test ! -d "$pathcomp"; then + errstatus=$lasterr + fi + fi + + pathcomp="$pathcomp/" + done +done + +exit $errstatus + +# mkinstalldirs ends here Index: xc/extras/freetype2/builds/cygwin/devel/freetype/config/ftoption.h diff -u /dev/null xc/extras/freetype2/builds/cygwin/devel/freetype/config/ftoption.h:1.1.1.1 --- /dev/null Mon Dec 18 14:22:19 2000 +++ xc/extras/freetype2/builds/cygwin/devel/freetype/config/ftoption.h Fri Dec 8 16:26:07 2000 @@ -0,0 +1,400 @@ +/***************************************************************************/ +/* */ +/* ftoption.h */ +/* */ +/* User-selectable configuration macros (specification only). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTOPTION_H__ +#define __FTOPTION_H__ + + +#ifdef __cplusplus + extern "C" { +#endif + + + /*************************************************************************/ + /* */ + /* USER-SELECTABLE CONFIGURATION MACROS */ + /* */ + /* These macros can be toggled by developers to enable or disable */ + /* certain aspects of FreeType. This is a default file, where all major */ + /* options are enabled. */ + /* */ + /* Note that if some modifications are required for your build, we */ + /* advise you to put a modified copy of this file in your build */ + /* directory, rather than modifying it in-place. */ + /* */ + /* The build directory is normally `freetype/builds/' and */ + /* contains build or system-specific files that are included in */ + /* priority when building the library. */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** 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 ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* Convenience functions support */ + /* */ + /* Some functions of the FreeType 2 API are provided as a convenience */ + /* for client applications and developers. However, they are not */ + /* required to build and run the library itself. */ + /* */ + /* By defining this configuration macro, you'll disable the */ + /* compilation of these functions at build time. This can be useful */ + /* to reduce the library's code size when you don't need any of */ + /* these functions. */ + /* */ + /* All convenience functions are declared as such in their */ + /* documentation. */ + /* */ +#undef FT_CONFIG_OPTION_NO_CONVENIENCE_FUNCS + + + /*************************************************************************/ + /* */ + /* Alternate Glyph Image Format support */ + /* */ + /* By default, the glyph images returned by the FreeType glyph loader */ + /* can either be a pixmap or a vectorial outline defined through */ + /* Bezier control points. When defining the following configuration */ + /* macro, some font drivers will be able to register alternate */ + /* glyph image formats. */ + /* */ + /* Unset this macro if you are sure that you will never use a font */ + /* driver with an alternate glyph format; this will reduce the size of */ + /* the base layer code. */ + /* */ + /* Note that a few Type 1 fonts, as well as Windows `vector' fonts */ + /* use a vector `plotter' format that isn't supported when this */ + /* macro is undefined. */ + /* */ +#define FT_CONFIG_OPTION_ALTERNATE_GLYPH_FORMATS + + + /*************************************************************************/ + /* */ + /* Glyph Postscript Names handling */ + /* */ + /* By default, FreeType 2 is compiled with the `PSNames' module. This */ + /* 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 + + + /*************************************************************************/ + /* */ + /* Many compilers provide the non-ANSI `long long' 64-bit type. You can */ + /* activate it by defining the FTCALC_USE_LONG_LONG macro. Note that */ + /* this will produce many -ansi warnings during library compilation, and */ + /* that in many cases the generated code will not be smaller or faster! */ + /* */ +#undef FTCALC_USE_LONG_LONG + + + /*************************************************************************/ + /* */ + /* 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. */ + /* */ +#undef FT_EXPORT +#undef FT_EXPORT_DEF + + + /*************************************************************************/ + /* */ + /* 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! */ + /* */ +#define FT_DEBUG_LEVEL_ERROR +#define FT_DEBUG_LEVEL_TRACE + + + /*************************************************************************/ + /* */ + /* Computation Algorithms */ + /* */ + /* Used for debugging, this configuration macro should disappear */ + /* soon. */ + /* */ +#define FT_CONFIG_OPTION_OLD_CALCS + + + /*************************************************************************/ + /* */ + /* 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. */ + /* */ +#define FT_RENDER_POOL_SIZE 16384 + + + /*************************************************************************/ + /* */ + /* FT_MAX_MODULES */ + /* */ + /* The maximum number of modules that can be registered in a single */ + /* FreeType library object. 16 is the default. */ + /* */ +#define FT_MAX_MODULES 16 + + + /*************************************************************************/ + /* */ + /* FT_MAX_EXTENSIONS */ + /* */ + /* The maximum number of extensions that can be registered in a single */ + /* font driver. 8 is the default. */ + /* */ + /* If you don't know what this means, you certainly do not need to */ + /* change this value. */ + /* */ +#define FT_MAX_EXTENSIONS 8 + + + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** 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 + + + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** 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. */ + /* */ +#define TT_CONFIG_OPTION_BYTECODE_INTERPRETER + + + /*************************************************************************/ + /* */ + /* 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 + + + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** 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 T1_CONFIG_OPTION_DISABLE_HINTER if you want to generate a */ + /* driver with no hinter. This can be useful to debug the parser. */ + /* */ +#undef T1_CONFIG_OPTION_DISABLE_HINTER + + + /*************************************************************************/ + /* */ + /* 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 + + +#ifdef __cplusplus + } +#endif + + +#endif /* __FTOPTION_H__ */ + + +/* END */ Index: xc/extras/freetype2/builds/dos/detect.mk diff -u /dev/null xc/extras/freetype2/builds/dos/detect.mk:1.1.1.1 --- /dev/null Mon Dec 18 14:22:19 2000 +++ xc/extras/freetype2/builds/dos/detect.mk Fri Dec 8 16:26:07 2000 @@ -0,0 +1,116 @@ +# +# FreeType 2 configuration file to detect a DOS host platform. +# + + +# 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. + + +# Test for DJGPP by checking the DJGPP environment variable, which must be +# set in order to use the system (ie. it will always be present when the +# `make' utility is run). +# +ifeq ($(PLATFORM),ansi) + + ifdef DJGPP + # We are definitely using DJGPP + PLATFORM := dos + DELETE := del + COPY := copy + CONFIG_FILE := dos-gcc.mk + SEP := / + ifndef CC + CC := gcc + endif # test CC + + setup : dos_setup + + endif # test DJGPP +endif # test PLATFORM + + + +# We test for the COMSPEC environment variable, then run the `ver' +# command-line program to see if its output contains the word `Dos'. +# +# If this is true, we are running a Dos-ish platform (or an emulation). +# +ifeq ($(PLATFORM),ansi) + + ifdef COMSPEC + # + # We try to recognize a Cygwin session, in which case we're + # certainly not running on DOS! + # + ifneq ($(OSTYPE),cygwin) + is_dos := $(findstring Dos,$(shell ver)) + + # We try to recognize a Dos session under OS/2. The `ver' command + # returns `Operating System/2 ...' there, so `is_dos' should be empty. + # + # To recognize a Dos session under OS/2, we check COMSPEC for the + # substring `MDOS\COMMAND' + # + ifeq ($(is_dos),) + is_dos := $(findstring MDOS\COMMAND,$(COMSPEC)) + endif + endif # test Cygwin + endif # test COMSPEC + + ifneq ($(is_dos),) + + PLATFORM := dos + DELETE := del + COPY := copy + + # Use DJGPP (i.e. gcc) by default. + # + CONFIG_FILE := dos-gcc.mk + SEP := / + ifndef CC + CC := gcc + endif + + # additionally, we provide hooks for various other compilers + # + ifneq ($(findstring turboc,$(MAKECMDGOALS)),) # Turbo C + CONFIG_FILE := dos-tcc.mk + SEP := $(BACKSLASH) + CC := tcc + .PHONY: turboc + endif + + ifneq ($(findstring watcom,$(MAKECMDGOALS)),) # Watcom C/C++ + CONFIG_FILE := dos-wat.mk + SEP := $(BACKSLASH) + CC := wcc386 + .PHONY: watcom + endif + + ifneq ($(findstring borlandc16,$(MAKECMDGOALS)),) # Borland C/C++ 16-bit + CONFIG_FILE := dos-bcc.mk + SEP := $(BACKSLASH) + CC := bcc + .PHONY: borlandc16 + endif + + ifneq ($(findstring borlandc,$(MAKECMDGOALS)),) # Borland C/C++ 32-bit + CONFIG_FILE := dos-bcc.mk + SEP := $(BACKSLASH) + CC := bcc32 + .PHONY: borlandc + endif + + setup: dos_setup + + endif # test Dos +endif # test PLATFORM + +# EOF Index: xc/extras/freetype2/builds/dos/dos-def.mk diff -u /dev/null xc/extras/freetype2/builds/dos/dos-def.mk:1.1.1.1 --- /dev/null Mon Dec 18 14:22:19 2000 +++ xc/extras/freetype2/builds/dos/dos-def.mk Fri Dec 8 16:26:07 2000 @@ -0,0 +1,83 @@ +# +# FreeType 2 DOS specific definitions +# + + +# 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. + + +DELETE := del +HOSTSEP := $(strip \ ) +BUILD := $(TOP)$(SEP)builds$(SEP)dos +PLATFORM := dos + +# except for DJGPP/GCC on Dos +ifndef SEP +SEP := $(HOSTSEP) +endif + + +# The directory where all object files are placed. +# +# This lets you build the library in your own directory with something like +# +# set TOP=.../path/to/freetype2/top/dir... +# set OBJ_DIR=.../path/to/obj/dir +# make -f %TOP%/Makefile setup [options] +# make -f %TOP%/Makefile +# +ifndef OBJ_DIR + OBJ_DIR := $(TOP)$(SEP)obj +endif + + +# The directory where all library files are placed. +# +# By default, this is the same as $(OBJ_DIR); however, this can be changed +# to suit particular needs. +# +LIB_DIR := $(OBJ_DIR) + +# The name of the final library file. Note that the DOS-specific Makefile +# uses a shorter (8.3) name. +# +LIBRARY := $(PROJECT) + + +# The NO_OUTPUT macro is used to ignore the output of commands. +# +NO_OUTPUT = &> nul + + +ifdef BUILD_PROJECT + + # Now include the main sub-makefile. It contains all the rules used to + # build the library with the previous variables defined. + # + include $(TOP)/builds/$(PROJECT).mk + + # The cleanup targets. + # + clean_project: clean_project_dos + distclean_project: distclean_project_dos + + # This final rule is used to link all object files into a single library. + # 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) + -$(CLEAN_LIBRARY) $(NO_OUTPUT) + $(LINK_LIBRARY) + +endif + +# EOF Index: xc/extras/freetype2/builds/dos/dos-gcc.mk diff -u /dev/null xc/extras/freetype2/builds/dos/dos-gcc.mk:1.1.1.1 --- /dev/null Mon Dec 18 14:22:19 2000 +++ xc/extras/freetype2/builds/dos/dos-gcc.mk Fri Dec 8 16:26:07 2000 @@ -0,0 +1,22 @@ +# +# FreeType 2 configuration rules for the DJGPP compiler +# + + +# 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 := / +CLEAN_LIBRARY := $(DELETE) $@ + +include $(TOP)/builds/compiler/gcc.mk +include $(TOP)/builds/dos/dos-def.mk + +# EOF Index: xc/extras/freetype2/builds/mac/README diff -u /dev/null xc/extras/freetype2/builds/mac/README:1.1.1.1 --- /dev/null Mon Dec 18 14:22:19 2000 +++ xc/extras/freetype2/builds/mac/README Fri Dec 8 16:26:07 2000 @@ -0,0 +1,11 @@ +This folder contains supporting code and CodeWarrior Pro 4 project +files to build the FreeType library. + +Notes: +The library will be built as a static lib in the obj/ folder. + +Just van Rossum, + +DISCLAIMER: this subdirectory is *not* being maintained by the +FreeType team, but by Just van Rossum. It's being released under +the same terms as FreeType (see LICENSE.TXT). Index: xc/extras/freetype2/builds/mac/ftlib.prj Index: xc/extras/freetype2/builds/os2/detect.mk diff -u /dev/null xc/extras/freetype2/builds/os2/detect.mk:1.1.1.1 --- /dev/null Mon Dec 18 14:22:20 2000 +++ xc/extras/freetype2/builds/os2/detect.mk Fri Dec 8 16:26:08 2000 @@ -0,0 +1,62 @@ +# +# FreeType 2 configuration file to detect an OS/2 host platform. +# + + +# 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. + + +ifeq ($(PLATFORM),ansi) + + ifdef OS2_SHELL + + PLATFORM := os2 + COPY := copy + DELETE := del + + CONFIG_FILE := os2-gcc.mk # gcc-emx by default + SEP := / + + # additionally, we provide hooks for various other compilers + # + ifneq ($(findstring visualage,$(MAKECMDGOALS)),) # Visual Age C++ + CONFIG_FILE := os2-icc.mk + SEP := $(BACKSLASH) + CC := icc + .PHONY: visualage + endif + + ifneq ($(findstring watcom,$(MAKECMDGOALS)),) # Watcom C/C++ + CONFIG_FILE := os2-wat.mk + SEP := $(BACKSLASH) + CC := wcc386 + .PHONY: watcom + endif + + ifneq ($(findstring borlandc,$(MAKECMDGOALS)),) # Borland C++ 32-bit + CONFIG_FILE := os2-bcc.mk + SEP := $(BACKSLASH) + CC := bcc32 + .PHONY: borlandc + endif + + ifneq ($(findstring devel,$(MAKECMDGOALS)),) # development target + CONFIG_FILE := os2-dev.mk + CC := gcc + SEP := / + devel: setup + endif + + setup: dos_setup + + endif # test OS2_SHELL +endif # test PLATFORM + +# EOF Index: xc/extras/freetype2/builds/os2/os2-def.mk diff -u /dev/null xc/extras/freetype2/builds/os2/os2-def.mk:1.1.1.1 --- /dev/null Mon Dec 18 14:22:20 2000 +++ xc/extras/freetype2/builds/os2/os2-def.mk Fri Dec 8 16:26:08 2000 @@ -0,0 +1,83 @@ +# +# FreeType 2 OS/2 specific definitions +# + + +# 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. + + +DELETE := del +HOSTSEP := $(strip \ ) +BUILD := $(TOP)$(SEP)builds$(SEP)os2 +PLATFORM := os2 + +# except for GCC+emx on OS/2 +ifndef SEP + SEP := $(HOSTSEP) +endif + + +# The directory where all object files are placed. +# +# This lets you build the library in your own directory with something like +# +# set TOP=.../path/to/freetype2/top/dir... +# set OBJ_DIR=.../path/to/obj/dir +# make -f %TOP%/Makefile setup [options] +# make -f %TOP%/Makefile +# +ifndef OBJ_DIR + OBJ_DIR := $(TOP)$(SEP)obj +endif + + +# 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 + + +ifdef BUILD_LIBRARY + + # Now include the main sub-makefile. It contains all the rules used to + # build the library with the previous variables defined. + # + include $(TOP)/builds/$(PROJECT).mk + + # The cleanup targets. + # + clean_project: clean_project_dos + distclean_project: distclean_project_dos + + # This final rule is used to link all object files into a single library. + # 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) + -$(CLEAN_LIBRARY) $(NO_OUTPUT) + $(LINK_LIBRARY) + +endif + +# EOF Index: xc/extras/freetype2/builds/os2/os2-dev.mk diff -u /dev/null xc/extras/freetype2/builds/os2/os2-dev.mk:1.1.1.1 --- /dev/null Mon Dec 18 14:22:20 2000 +++ xc/extras/freetype2/builds/os2/os2-dev.mk Fri Dec 8 16:26:08 2000 @@ -0,0 +1,139 @@ +# +# FreeType 2 configuration rules for OS/2 + gcc +# +# Development version without optimizations. +# + + +# 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. + + +ifndef TOP + TOP := . +endif + +DELETE := del +SEP := / +HOSTSEP := $(strip \ ) +BUILD := $(TOP)/builds/os2 +PLATFORM := os2 +CC := gcc + + +# The directory where all object files are placed. +# +# This lets you build the library in your own directory with something like +# +# set TOP=.../path/to/freetype2/top/dir... +# set OBJ_DIR=.../path/to/obj/dir +# make -f %TOP%/Makefile setup [options] +# make -f %TOP%/Makefile +# +ifndef OBJ_DIR + OBJ_DIR := $(TOP)$(SEP)obj +endif + + +# 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 object file extension (for standard and static libraries). This can be +# .o, .tco, .obj, etc., depending on the platform. +# +O := o +SO := o + +# The library file extension (for standard and static libraries). This can +# be .a, .lib, etc., depending on the platform. +# +A := a +SA := a + + +# 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. +# +ifndef CFLAGS + CFLAGS := -c -g -O0 -Wall +endif + +# ANSIFLAGS: Put there the flags used to make your compiler ANSI-compliant. +# +ANSIFLAGS := -ansi -pedantic + + +ifdef BUILD_FREETYPE + + # Now include the main sub-makefile. It contains all the rules used to + # build the library with the previous variables defined. + # + include $(TOP)/builds/freetype.mk + + # The cleanup targets. + # + clean_freetype: clean_freetype_dos + distclean_freetype: distclean_freetype_dos + + # Librarian to use to build the static library + # + FT_LIBRARIAN := $(AR) -r + + + # 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} + # + $(FT_LIBRARY): $(OBJECTS_LIST) + -$(DELETE) $(subst $(SEP),$(HOSTSEP),$(FT_LIBRARY)) 2> nul + $(FT_LIBRARIAN) $@ $(OBJECTS_LIST) + +endif + +# EOF Index: xc/extras/freetype2/builds/os2/os2-gcc.mk diff -u /dev/null xc/extras/freetype2/builds/os2/os2-gcc.mk:1.1.1.1 --- /dev/null Mon Dec 18 14:22:20 2000 +++ xc/extras/freetype2/builds/os2/os2-gcc.mk Fri Dec 8 16:26:08 2000 @@ -0,0 +1,138 @@ +# +# FreeType 2 configuration rules for 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. + + +ifndef TOP + TOP := . +endif + +DELETE := del +SEP := / +HOSTSEP := $(strip \ ) +BUILD := $(TOP)/builds/os2 +PLATFORM := os2 +CC := gcc + + +# The directory where all object files are placed. +# +# This lets you build the library in your own directory with something like +# +# set TOP=.../path/to/freetype2/top/dir... +# set OBJ_DIR=.../path/to/obj/dir +# make -f %TOP%Makefile setup [options] +# make -f %TOP%Makefile +# +ifndef OBJ_DIR + OBJ_DIR := $(TOP)$(SEP)obj +endif + + +# 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 object file extension (for standard and static libraries). This can be +# .o, .tco, .obj, etc., depending on the platform. +# +O := o +SO := o + + +# The library file extension (for standard and static libraries). This can +# be .a, .lib, etc., depending on the platform. +# +A := a +SA := a + + +# 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. +# +ifndef CFLAGS + CFLAGS := -c -g -O6 -Wall +endif + +# ANSIFLAGS: Put there the flags used to make your compiler ANSI-compliant. +# +ANSIFLAGS := -ansi -pedantic + + +ifdef BUILD_FREETYPE + + # Now include the main sub-makefile. It contains all the rules used to + # build the library with the previous variables defined. + # + include $(TOP)/builds/freetype.mk + + # The cleanup targets. + # + clean_freetype: clean_freetype_dos + distclean_freetype: distclean_freetype_dos + + # Librarian to use to build the static library + # + FT_LIBRARIAN := $(AR) -r + + + # 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} + # + $(FT_LIBRARY): $(OBJECTS_LIST) + -$(DELETE) $(subst $(SEP),$(HOSTSEP),$(FT_LIBRARY)) 2> nul + $(FT_LIBRARIAN) $@ $(OBJECTS_LIST) + +endif + +# EOF Index: xc/extras/freetype2/builds/unix/.cvsignore diff -u /dev/null xc/extras/freetype2/builds/unix/.cvsignore:1.1.1.1 --- /dev/null Mon Dec 18 14:22:20 2000 +++ xc/extras/freetype2/builds/unix/.cvsignore Fri Dec 8 16:26:08 2000 @@ -0,0 +1,8 @@ +unix-def.mk +unix-cc.mk +config.status +config.cache +config.log +libtool +ftconfig.h +freetype-config Index: xc/extras/freetype2/builds/unix/aclocal.m4 diff -u /dev/null xc/extras/freetype2/builds/unix/aclocal.m4:1.1.1.1 --- /dev/null Mon Dec 18 14:22:20 2000 +++ xc/extras/freetype2/builds/unix/aclocal.m4 Fri Dec 8 16:26:08 2000 @@ -0,0 +1,458 @@ +## FreeType specific autoconf tests + +AC_DEFUN(FT_MUNMAP_DECL, +[AC_MSG_CHECKING([whether munmap must be declared]) +AC_CACHE_VAL(ft_cv_munmap_decl, +[AC_TRY_COMPILE([ +#ifdef HAVE_UNISTD_H +#include +#endif +#include ], +[char *(*pfn) = (char *(*))munmap], +ft_cv_munmap_decl=no, +ft_cv_munmap_decl=yes)]) +AC_MSG_RESULT($ft_cv_munmap_decl) +if test $ft_cv_munmap_decl = yes; then + AC_DEFINE(NEED_MUNMAP_DECL) +fi]) + +AC_DEFUN(FT_MUNMAP_PARAM, +[AC_MSG_CHECKING([for munmap's first parameter type]) +AC_TRY_COMPILE([ +#include +#include +int munmap(void *, size_t);],, + AC_MSG_RESULT([void *]);AC_DEFINE(MUNMAP_USES_VOIDP), + AC_MSG_RESULT([char *])) +]) + +## libtool.m4 - Configure libtool for the target system. -*-Shell-script-*- +## Copyright (C) 1996-1999 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. + +# serial 40 AC_PROG_LIBTOOL +AC_DEFUN(AC_PROG_LIBTOOL, +[AC_REQUIRE([AC_LIBTOOL_SETUP])dnl + +# Save cache, so that ltconfig can load it +AC_CACHE_SAVE + +# Actually configure libtool. ac_aux_dir is where install-sh is found. +CC="$CC" CFLAGS="$CFLAGS" CPPFLAGS="$CPPFLAGS" \ +LD="$LD" LDFLAGS="$LDFLAGS" LIBS="$LIBS" \ +LN_S="$LN_S" NM="$NM" RANLIB="$RANLIB" \ +DLLTOOL="$DLLTOOL" AS="$AS" OBJDUMP="$OBJDUMP" \ +${CONFIG_SHELL-/bin/sh} $ac_aux_dir/ltconfig --no-reexec \ +$libtool_flags --no-verify $ac_aux_dir/ltmain.sh $lt_target \ +|| AC_MSG_ERROR([libtool configure failed]) + +# Reload cache, that may have been modified by ltconfig +AC_CACHE_LOAD + +# This can be used to rebuild libtool when needed +LIBTOOL_DEPS="$ac_aux_dir/ltconfig $ac_aux_dir/ltmain.sh" + +# Always use our own libtool. +LIBTOOL='$(SHELL) $(top_builddir)/libtool' +AC_SUBST(LIBTOOL)dnl + +# Redirect the config.log output again, so that the ltconfig log is not +# clobbered by the next message. +exec 5>>./config.log +]) + +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_RANLIB])dnl +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_PROG_LD])dnl +AC_REQUIRE([AC_PROG_NM])dnl +AC_REQUIRE([AC_PROG_LN_S])dnl +dnl + +case "$target" in +NONE) lt_target="$host" ;; +*) lt_target="$target" ;; +esac + +# Check for any special flags to pass to ltconfig. +libtool_flags="--cache-file=$cache_file" +test "$enable_shared" = no && libtool_flags="$libtool_flags --disable-shared" +test "$enable_static" = no && libtool_flags="$libtool_flags --disable-static" +test "$enable_fast_install" = no && libtool_flags="$libtool_flags --disable-fast-install" +test "$ac_cv_prog_gcc" = yes && libtool_flags="$libtool_flags --with-gcc" +test "$ac_cv_prog_gnu_ld" = yes && libtool_flags="$libtool_flags --with-gnu-ld" +ifdef([AC_PROVIDE_AC_LIBTOOL_DLOPEN], +[libtool_flags="$libtool_flags --enable-dlopen"]) +ifdef([AC_PROVIDE_AC_LIBTOOL_WIN32_DLL], +[libtool_flags="$libtool_flags --enable-win32-dll"]) +AC_ARG_ENABLE(libtool-lock, + [ --disable-libtool-lock avoid locking (might break parallel builds)]) +test "x$enable_libtool_lock" = xno && libtool_flags="$libtool_flags --disable-lock" +test x"$silent" = xyes && libtool_flags="$libtool_flags --silent" + +# Some flags need to be propagated to the compiler or linker for good +# libtool support. +case "$lt_target" in +*-*-irix6*) + # Find out which ABI we are using. + echo '[#]line __oline__ "configure"' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case "`/usr/bin/file conftest.o`" in + *32-bit*) + LD="${LD-ld} -32" + ;; + *N32*) + LD="${LD-ld} -n32" + ;; + *64-bit*) + LD="${LD-ld} -64" + ;; + esac + fi + rm -rf conftest* + ;; + +*-*-sco3.2v5*) + # On SCO OpenServer 5, we need -belf to get full-featured binaries. + SAVE_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -belf" + AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, + [AC_TRY_LINK([],[],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no])]) + 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*) + AC_CHECK_TOOL(DLLTOOL, dlltool, false) + AC_CHECK_TOOL(AS, as, false) + AC_CHECK_TOOL(OBJDUMP, objdump, false) + ;; +]) +esac +]) + +# 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, [dnl +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, [dnl +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, [dnl +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_ENABLE_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_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_prog=ld +if test "$ac_cv_prog_gcc" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + AC_MSG_CHECKING([for ld used by GCC]) + ac_prog=`($CC -print-prog-name=ld) 2>&5` + case "$ac_prog" in + # Accept absolute paths. +changequote(,)dnl + [\\/]* | [A-Za-z]:[\\/]*) + re_direlt='/[^/][^/]*/\.\./' +changequote([,])dnl + # 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(ac_cv_path_LD, +[if test -z "$LD"; then + IFS="${IFS= }"; ac_save_ifs="$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 + ac_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some GNU ld's only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + if "$ac_cv_path_LD" -v 2>&1 < /dev/null | egrep '(GNU|with BFD)' > /dev/null; then + test "$with_gnu_ld" != no && break + else + test "$with_gnu_ld" != yes && break + fi + fi + done + IFS="$ac_save_ifs" +else + ac_cv_path_LD="$LD" # Let the user override the test with a path. +fi]) +LD="$ac_cv_path_LD" +if test -n "$LD"; then + AC_MSG_RESULT($LD) +else + AC_MSG_RESULT(no) +fi +test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH]) +AC_PROG_LD_GNU +]) + +AC_DEFUN(AC_PROG_LD_GNU, +[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], ac_cv_prog_gnu_ld, +[# I'd rather use --version here, but apparently some GNU ld's only accept -v. +if $LD -v 2>&1 &5; then + ac_cv_prog_gnu_ld=yes +else + ac_cv_prog_gnu_ld=no +fi]) +]) + +# AC_PROG_NM - find the path to a BSD-compatible name lister +AC_DEFUN(AC_PROG_NM, +[AC_MSG_CHECKING([for BSD-compatible nm]) +AC_CACHE_VAL(ac_cv_path_NM, +[if test -n "$NM"; then + # Let the user override the test. + ac_cv_path_NM="$NM" +else + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}" + for ac_dir in $PATH /usr/ccs/bin /usr/ucb /bin; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/nm || test -f $ac_dir/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 + if ($ac_dir/nm -B /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then + ac_cv_path_NM="$ac_dir/nm -B" + break + elif ($ac_dir/nm -p /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then + ac_cv_path_NM="$ac_dir/nm -p" + break + else + ac_cv_path_NM=${ac_cv_path_NM="$ac_dir/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 "$ac_cv_path_NM" && ac_cv_path_NM=nm +fi]) +NM="$ac_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 "$lt_target" in +*-*-beos* | *-*-cygwin*) + # 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, adds --enable-ltdl-convenience to +# the configure arguments. Note that LIBLTDL is not AC_SUBSTed, nor +# is AC_CONFIG_SUBDIRS called. If DIR is not provided, it is assumed +# to be `${top_builddir}/libltdl'. Make sure you start DIR with +# '${top_builddir}/' (note the single quotes!) if your package is not +# flat, and, if you're not using automake, define top_builddir as +# appropriate 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=ifelse($#,1,$1,['${top_builddir}/libltdl'])/libltdlc.la + INCLTDL=ifelse($#,1,-I$1,['-I${top_builddir}/libltdl']) +]) + +# AC_LIBLTDL_INSTALLABLE[(dir)] - sets LIBLTDL to the link flags for +# the libltdl installable library, and adds --enable-ltdl-install to +# the configure arguments. Note that LIBLTDL is not AC_SUBSTed, nor +# is AC_CONFIG_SUBDIRS called. If DIR is not provided, it is assumed +# to be `${top_builddir}/libltdl'. Make sure you start DIR with +# '${top_builddir}/' (note the single quotes!) if your package is not +# flat, and, if you're not using automake, define top_builddir as +# appropriate 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=ifelse($#,1,$1,['${top_builddir}/libltdl'])/libltdl.la + INCLTDL=ifelse($#,1,-I$1,['-I${top_builddir}/libltdl']) + else + ac_configure_args="$ac_configure_args --enable-ltdl-install=no" + LIBLTDL="-lltdl" + INCLTDL= + fi +]) + +dnl old names +AC_DEFUN(AM_PROG_LIBTOOL, [indir([AC_PROG_LIBTOOL])])dnl +AC_DEFUN(AM_ENABLE_SHARED, [indir([AC_ENABLE_SHARED], $@)])dnl +AC_DEFUN(AM_ENABLE_STATIC, [indir([AC_ENABLE_STATIC], $@)])dnl +AC_DEFUN(AM_DISABLE_SHARED, [indir([AC_DISABLE_SHARED], $@)])dnl +AC_DEFUN(AM_DISABLE_STATIC, [indir([AC_DISABLE_STATIC], $@)])dnl +AC_DEFUN(AM_PROG_LD, [indir([AC_PROG_LD])])dnl +AC_DEFUN(AM_PROG_NM, [indir([AC_PROG_NM])])dnl + +dnl This is just to silence aclocal about the macro not being used +ifelse([AC_DISABLE_FAST_INSTALL])dnl Index: xc/extras/freetype2/builds/unix/config.guess diff -u /dev/null xc/extras/freetype2/builds/unix/config.guess:1.1.1.1 --- /dev/null Mon Dec 18 14:22:20 2000 +++ xc/extras/freetype2/builds/unix/config.guess Fri Dec 8 16:26:08 2000 @@ -0,0 +1,1284 @@ +#! /bin/sh +# Attempt to guess a canonical system name. +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000 +# Free Software Foundation, Inc. + +version='2000-07-27' + +# This file is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# Written by Per Bothner . +# Please send patches to . +# +# This script attempts to guess a canonical system name similar to +# config.sub. If it succeeds, it prints the system name on stdout, and +# exits with 0. Otherwise, it exits with 1. +# +# The plan is that this can be called by configure scripts if you +# don't specify an explicit system type (host/target name). +# +# Only a few systems have been added to this list; please add others +# (but try to keep the structure clean). +# + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] + +Output the configuration name of this system. + +Operation modes: + -h, --help print this help, then exit + -V, --version print version number, then exit" + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case "$1" in + --version | --vers* | -V ) + echo "$version" ; exit 0 ;; + --help | --h* | -h ) + echo "$usage"; exit 0 ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + exec >&2 + echo "$me: invalid option $1" + echo "$help" + exit 1 ;; + * ) + break ;; + esac +done + +if test $# != 0; then + echo "$me: too many arguments$help" >&2 + exit 1 +fi + +# Use $HOST_CC if defined. $CC may point to a cross-compiler +if test x"$CC_FOR_BUILD" = x; then + if test x"$HOST_CC" != x; then + CC_FOR_BUILD="$HOST_CC" + else + if test x"$CC" != x; then + CC_FOR_BUILD="$CC" + else + CC_FOR_BUILD=cc + fi + fi +fi + + +# This is needed to find uname on a Pyramid OSx when run in the BSD universe. +# (ghazi@noc.rutgers.edu 8/24/94.) +if (test -f /.attbin/uname) >/dev/null 2>&1 ; then + PATH=$PATH:/.attbin ; export PATH +fi + +UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown +UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown +UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown +UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown + +dummy=dummy-$$ +trap 'rm -f $dummy.c $dummy.o $dummy; exit 1' 1 2 15 + +# Note: order is significant - the case branches are not exclusive. + +case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in + *: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. + # Determine the machine/vendor (is the vendor relevant). + case "${UNAME_MACHINE}" in + amiga) machine=m68k-unknown ;; + arm32) machine=arm-unknown ;; + atari*) machine=m68k-atari ;; + sun3*) machine=m68k-sun ;; + mac68k) machine=m68k-apple ;; + macppc) machine=powerpc-apple ;; + hp3[0-9][05]) machine=m68k-hp ;; + ibmrt|romp-ibm) machine=romp-ibm ;; + *) machine=${UNAME_MACHINE}-unknown ;; + esac + # The Operating System including object format. + 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 + # The OS release + release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` + # 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 ;; + alpha:OSF1:*:*) + if test $UNAME_RELEASE = "V4.0"; then + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` + fi + # A Vn.n version is a released version. + # A Tn.n version is a released field test version. + # A Xn.n version is an unreleased experimental baselevel. + # 1.2 uses "1.2" for uname -r. + cat <$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 $dummy.s -o $dummy 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" + ;; + esac + fi + rm -f $dummy.s $dummy + 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;; + amiga:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + *:[Aa]miga[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-amigaos + exit 0 ;; + arc64:OpenBSD:*:*) + echo mips64el-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + arc:OpenBSD:*:*) + echo mipsel-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + hkmips:OpenBSD:*:*) + echo mips-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + pmax:OpenBSD:*:*) + echo mipsel-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + sgi:OpenBSD:*:*) + echo mips-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + wgrisc:OpenBSD:*:*) + echo mipsel-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + *: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:*:*) + 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 ;; + sun4H:SunOS:5.*:*) + echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit 0 ;; + sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) + echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit 0 ;; + i86pc:SunOS:5.*:*) + echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit 0 ;; + sun4*:SunOS:6*:*) + # According to config.sub, this is the proper way to canonicalize + # SunOS6. Hard to guess exactly what SunOS6 will be like, but + # it's likely to be more like Solaris than SunOS4. + echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit 0 ;; + sun4*:SunOS:*:*) + case "`/usr/bin/arch -k`" in + Series*|S4*) + UNAME_RELEASE=`uname -v` + ;; + esac + # Japanese Language versions have a version number like `4.1.3-JL'. + echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` + exit 0 ;; + sun3*:SunOS:*:*) + echo m68k-sun-sunos${UNAME_RELEASE} + exit 0 ;; + sun*:*:4.2BSD:*) + UNAME_RELEASE=`(head -1 /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` + test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 + case "`/bin/arch`" in + sun3) + echo m68k-sun-sunos${UNAME_RELEASE} + ;; + sun4) + echo sparc-sun-sunos${UNAME_RELEASE} + ;; + esac + exit 0 ;; + aushp:SunOS:*:*) + echo sparc-auspex-sunos${UNAME_RELEASE} + exit 0 ;; + atari*:OpenBSD:*:*) + echo m68k-unknown-openbsd${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 ;; + sun3*:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + mac68k:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + mvme68k:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + mvme88k:OpenBSD:*:*) + echo m88k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + powerpc:machten:*:*) + echo powerpc-apple-machten${UNAME_RELEASE} + exit 0 ;; + 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) + 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 $dummy.c -o $dummy \ + && ./$dummy `echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` \ + && rm $dummy.c $dummy && exit 0 + rm -f $dummy.c $dummy + echo mips-mips-riscos${UNAME_RELEASE} + exit 0 ;; + Night_Hawk:Power_UNIX:*:*) + echo powerpc-harris-powerunix + exit 0 ;; + m88k:CX/UX:7*:*) + echo m88k-harris-cxux7 + exit 0 ;; + m88k:*:4*:R4*) + echo m88k-motorola-sysv4 + exit 0 ;; + m88k:*:3*:R3*) + echo m88k-motorola-sysv3 + exit 0 ;; + AViiON:dgux:*:*) + # DG/UX returns AViiON for all architectures + UNAME_PROCESSOR=`/usr/bin/uname -p` + if [ $UNAME_PROCESSOR = mc88100 ] || [ $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 ;; + *:AIX:2:3) + if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then + sed 's/^ //' << EOF >$dummy.c + #include + + main() + { + if (!__power_pc()) + exit(1); + puts("powerpc-ibm-aix3.2.5"); + exit(0); + } +EOF + $CC_FOR_BUILD $dummy.c -o $dummy && ./$dummy && rm $dummy.c $dummy && exit 0 + rm -f $dummy.c $dummy + echo rs6000-ibm-aix3.2.5 + elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then + echo rs6000-ibm-aix3.2.4 + else + echo rs6000-ibm-aix3.2 + fi + exit 0 ;; + *:AIX:*:4) + IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | head -1 | awk '{ print $1 }'` + if /usr/sbin/lsattr -EHl ${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=4.${UNAME_RELEASE} + fi + echo ${IBM_ARCH}-ibm-aix${IBM_REV} + exit 0 ;; + *:AIX:*:*) + echo rs6000-ibm-aix + exit 0 ;; + ibmrt:4.4BSD:*|romp-ibm:BSD:*) + echo romp-ibm-bsd4.4 + exit 0 ;; + ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC 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:*:*) + case "${UNAME_MACHINE}" in + 9000/31? ) HP_ARCH=m68000 ;; + 9000/[34]?? ) HP_ARCH=m68k ;; + 9000/[678][0-9][0-9]) + 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 $dummy.c -o $dummy 2>/dev/null ) && HP_ARCH=`./$dummy` + rm -f $dummy.c $dummy + esac + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + echo ${HP_ARCH}-hp-hpux${HPUX_REV} + exit 0 ;; + 3050*:HI-UX:*:*) + sed 's/^ //' << EOF >$dummy.c + #include + 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 $dummy.c -o $dummy && ./$dummy && rm $dummy.c $dummy && exit 0 + rm -f $dummy.c $dummy + echo unknown-hitachi-hiuxwe2 + exit 0 ;; + 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) + echo hppa1.1-hp-bsd + exit 0 ;; + 9000/8??:4.3bsd:*:*) + echo hppa1.0-hp-bsd + exit 0 ;; + *9??*: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 ;; + hppa*:OpenBSD:*:*) + echo hppa-unknown-openbsd + exit 0 ;; + C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) + echo c1-convex-bsd + exit 0 ;; + C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit 0 ;; + C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) + echo c34-convex-bsd + exit 0 ;; + C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) + echo c38-convex-bsd + exit 0 ;; + C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) + echo c4-convex-bsd + exit 0 ;; + CRAY*X-MP:*:*:*) + echo xmp-cray-unicos + exit 0 ;; + CRAY*Y-MP:*:*:*) + echo ymp-cray-unicos${UNAME_RELEASE} + exit 0 ;; + CRAY*[A-Z]90:*:*:*) + echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ + | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ + -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ + exit 0 ;; + CRAY*TS:*:*:*) + echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit 0 ;; + CRAY*T3E:*:*:*) + echo alpha-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit 0 ;; + CRAY*SV1:*:*:*) + echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit 0 ;; + CRAY-2:*:*:*) + echo cray2-cray-unicos + exit 0 ;; + F300:UNIX_System_V:*:*) + FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` + echo "f300-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit 0 ;; + F301:UNIX_System_V:*:*) + echo f301-fujitsu-uxpv`echo $UNAME_RELEASE | sed 's/ .*//'` + exit 0 ;; + hp300:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + 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:*:*) + echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` + exit 0 ;; + *:OpenBSD:*:*) + echo ${UNAME_MACHINE}-unknown-openbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` + exit 0 ;; + i*:CYGWIN*:*) + echo ${UNAME_MACHINE}-pc-cygwin + exit 0 ;; + i*:MINGW*:*) + echo ${UNAME_MACHINE}-pc-mingw32 + 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 i386-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 ;; + *: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. + ld_help_string=`cd /; ld --help 2>&1` + ld_supported_emulations=`echo $ld_help_string \ + | sed -ne '/supported emulations:/!d + s/[ ][ ]*/ /g + s/.*supported emulations: *// + s/ .*// + p'` + case "$ld_supported_emulations" in + *ia64) + echo "${UNAME_MACHINE}-unknown-linux" + exit 0 + ;; + i?86linux) + echo "${UNAME_MACHINE}-pc-linux-gnuaout" + exit 0 + ;; + elf_i?86) + echo "${UNAME_MACHINE}-pc-linux" + exit 0 + ;; + i?86coff) + echo "${UNAME_MACHINE}-pc-linux-gnucoff" + exit 0 + ;; + sparclinux) + echo "${UNAME_MACHINE}-unknown-linux-gnuaout" + exit 0 + ;; + armlinux) + echo "${UNAME_MACHINE}-unknown-linux-gnuaout" + exit 0 + ;; + elf32arm*) + echo "${UNAME_MACHINE}-unknown-linux-gnuoldld" + exit 0 + ;; + armelf_linux*) + echo "${UNAME_MACHINE}-unknown-linux-gnu" + exit 0 + ;; + m68klinux) + echo "${UNAME_MACHINE}-unknown-linux-gnuaout" + exit 0 + ;; + elf32ppc | elf32ppclinux) + # Determine Lib Version + cat >$dummy.c < +#if defined(__GLIBC__) +extern char __libc_version[]; +extern char __libc_release[]; +#endif +main(argc, argv) + int argc; + char *argv[]; +{ +#if defined(__GLIBC__) + printf("%s %s\n", __libc_version, __libc_release); +#else + printf("unkown\n"); +#endif + return 0; +} +EOF + LIBC="" + $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null + if test "$?" = 0 ; then + ./$dummy | grep 1\.99 > /dev/null + if test "$?" = 0 ; then + LIBC="libc1" + fi + fi + rm -f $dummy.c $dummy + echo powerpc-unknown-linux-gnu${LIBC} + exit 0 + ;; + shelf_linux) + echo "${UNAME_MACHINE}-unknown-linux-gnu" + exit 0 + ;; + esac + + if test "${UNAME_MACHINE}" = "alpha" ; then + 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 + LIBC="" + $CC_FOR_BUILD $dummy.s -o $dummy 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" + ;; + esac + + objdump --private-headers $dummy | \ + grep ld.so.1 > /dev/null + if test "$?" = 0 ; then + LIBC="libc1" + fi + fi + rm -f $dummy.s $dummy + echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} ; exit 0 + elif test "${UNAME_MACHINE}" = "mips" ; then + cat >$dummy.c < /* for printf() prototype */ + int main (int argc, char *argv[]) { +#else + int main (argc, argv) int argc; char *argv[]; { +#endif +#ifdef __MIPSEB__ + printf ("%s-unknown-linux-gnu\n", argv[1]); +#endif +#ifdef __MIPSEL__ + printf ("%sel-unknown-linux-gnu\n", argv[1]); +#endif + return 0; +} +EOF + $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy "${UNAME_MACHINE}" && rm $dummy.c $dummy && exit 0 + rm -f $dummy.c $dummy + elif test "${UNAME_MACHINE}" = "s390"; then + echo s390-ibm-linux && exit 0 + else + # Either a pre-BFD a.out linker (linux-gnuoldld) + # or one that does not give us useful --help. + # GCC wants to distinguish between linux-gnuoldld and linux-gnuaout. + # If ld does not provide *any* "supported emulations:" + # that means it is gnuoldld. + echo "$ld_help_string" | grep >/dev/null 2>&1 "supported emulations:" + test $? != 0 && echo "${UNAME_MACHINE}-pc-linux-gnuoldld" && exit 0 + + case "${UNAME_MACHINE}" in + i?86) + VENDOR=pc; + ;; + *) + VENDOR=unknown; + ;; + esac + # Determine whether the default compiler is a.out or elf + cat >$dummy.c < +#ifdef __cplusplus +#include /* for printf() prototype */ + int main (int argc, char *argv[]) { +#else + int main (argc, argv) int argc; char *argv[]; { +#endif +#ifdef __ELF__ +# ifdef __GLIBC__ +# if __GLIBC__ >= 2 + printf ("%s-${VENDOR}-linux-gnu\n", argv[1]); +# else + printf ("%s-${VENDOR}-linux-gnulibc1\n", argv[1]); +# endif +# else + printf ("%s-${VENDOR}-linux-gnulibc1\n", argv[1]); +# endif +#else + printf ("%s-${VENDOR}-linux-gnuaout\n", argv[1]); +#endif + return 0; +} +EOF + $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy "${UNAME_MACHINE}" && rm $dummy.c $dummy && exit 0 + rm -f $dummy.c $dummy + fi ;; +# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. earlier versions +# are messed up and put the nodename in both sysname and nodename. + i?86:DYNIX/ptx:4*:*) + echo i386-sequent-sysv4 + exit 0 ;; + i?86:UNIX_SV:4.2MP:2.*) + # Unixware is an offshoot of SVR4, but it has its own version + # number series starting with 2... + # I am not positive that other SVR4 systems won't match this, + # I just have to hope. -- rms. + # Use sysv4.2uw... so that sysv4* matches it. + echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} + exit 0 ;; + i?86:*:4.*:* | i?86:SYSTEM_V:4.*:*) + 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:7*) + # Fixed at (any) Pentium or better + UNAME_MACHINE=i586 + if [ ${UNAME_SYSTEM} = "UnixWare" ] ; then + echo ${UNAME_MACHINE}-sco-sysv${UNAME_RELEASE}uw${UNAME_VERSION} + else + echo ${UNAME_MACHINE}-pc-sysv${UNAME_RELEASE} + fi + exit 0 ;; + i?86:*:3.2:*) + if test -f /usr/options/cb.name; then + UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then + UNAME_REL=`(/bin/uname -X|egrep Release|sed -e 's/.*= //')` + (/bin/uname -X|egrep i80486 >/dev/null) && UNAME_MACHINE=i486 + (/bin/uname -X|egrep '^Machine.*Pentium' >/dev/null) \ + && UNAME_MACHINE=i586 + (/bin/uname -X|egrep '^Machine.*Pent ?II' >/dev/null) \ + && UNAME_MACHINE=i686 + (/bin/uname -X|egrep '^Machine.*Pentium Pro' >/dev/null) \ + && UNAME_MACHINE=i686 + echo ${UNAME_MACHINE}-pc-sco$UNAME_REL + else + echo ${UNAME_MACHINE}-pc-sysv32 + fi + exit 0 ;; + i?86:*DOS:*:*) + echo ${UNAME_MACHINE}-pc-msdosdjgpp + 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 ;; + M68*:*:R3V[567]*:*) + test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;; + 3[34]??:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 4850:*:4.0:3.0) + OS_REL='' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && echo i486-ncr-sysv4.3${OS_REL} && exit 0 + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && echo i586-ncr-sysv4.3${OS_REL} && exit 0 ;; + 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && echo i486-ncr-sysv4 && exit 0 ;; + m68*:LynxOS:2.*:*) + echo m68k-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + mc68030:UNIX_System_V:4.*:*) + echo m68k-atari-sysv4 + exit 0 ;; + i?86:LynxOS:2.*:* | i?86:LynxOS:3.[01]*:*) + echo i386-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + TSUNAMI:LynxOS:2.*:*) + echo sparc-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + rs6000:LynxOS:2.*:* | PowerPC:LynxOS:2.*:*) + echo rs6000-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + SM[BE]S:UNIX_SV:*:*) + echo mips-dde-sysv${UNAME_RELEASE} + exit 0 ;; + RM*: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:CPunix: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 ;; + 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 ;; + Power*:Rhapsody:*:*) + echo powerpc-apple-rhapsody${UNAME_RELEASE} + exit 0 ;; + *:Rhapsody:*:*) + echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} + exit 0 ;; + *:Darwin:*:*) + echo `uname -p`-apple-darwin${UNAME_RELEASE} + exit 0 ;; + *:procnto*:*:* | *:QNX:[0123456789]*:*) + if test "${UNAME_MACHINE}" = "x86pc"; then + UNAME_MACHINE=pc + fi + echo `uname -p`-${UNAME_MACHINE}-nto-qnx + exit 0 ;; + *:QNX:*:4*) + echo i386-pc-qnx + exit 0 ;; + NSR-W:NONSTOP_KERNEL:*:*) + echo nsr-tandem-nsk${UNAME_RELEASE} + 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 ;; +esac + +#echo '(No uname command or uname output not recognized.)' 1>&2 +#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 + +cat >$dummy.c < +# 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) + printf ("vax-dec-bsd\n"); exit (0); +#else + printf ("vax-dec-ultrix\n"); exit (0); +#endif +#endif + +#if defined (alliant) && defined (i860) + printf ("i860-alliant-bsd\n"); exit (0); +#endif + + exit (1); +} +EOF + +$CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy && rm $dummy.c $dummy && exit 0 +rm -f $dummy.c $dummy + +# Apollos put the system type in the environment. + +test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit 0; } + +# Convex versions that predate uname can use getsysinfo(1) + +if [ -x /usr/convex/getsysinfo ] +then + case `getsysinfo -f cpu_type` in + c1*) + echo c1-convex-bsd + exit 0 ;; + c2*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit 0 ;; + c34*) + echo c34-convex-bsd + exit 0 ;; + c38*) + echo c38-convex-bsd + exit 0 ;; + c4*) + echo c4-convex-bsd + exit 0 ;; + esac +fi + +cat >&2 < in order to provide the needed +information to handle your system. + +config.guess version = $version + +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: "version='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: Index: xc/extras/freetype2/builds/unix/config.sub diff -u /dev/null xc/extras/freetype2/builds/unix/config.sub:1.1.1.1 --- /dev/null Mon Dec 18 14:22:20 2000 +++ xc/extras/freetype2/builds/unix/config.sub Fri Dec 8 16:26:08 2000 @@ -0,0 +1,1324 @@ +#! /bin/sh +# Configuration validation subroutine script, version 1.1. +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000 +# Free Software Foundation, Inc. + +version='2000-07-27' + +# 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 . +# +# 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 + -V, --version print version number, then exit" + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case "$1" in + --version | --vers* | -V ) + echo "$version" ; exit 0 ;; + --help | --h* | -h ) + echo "$usage"; exit 0 ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + exec >&2 + echo "$me: invalid option $1" + echo "$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*) + 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 + ;; + -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. + tahoe | i860 | ia64 | m32r | m68k | m68000 | m88k | ns32k | arc | arm \ + | arme[lb] | pyramid | mn10200 | mn10300 | tron | a29k \ + | 580 | i960 | h8300 \ + | x86 | ppcbe | mipsbe | mipsle | shbe | shle | armbe | armle \ + | hppa | hppa1.0 | hppa1.1 | hppa2.0 | hppa2.0w | hppa2.0n \ + | hppa64 \ + | alpha | alphaev[4-8] | alphaev56 | alphapca5[67] \ + | alphaev6[78] \ + | we32k | ns16k | clipper | i370 | sh | sh[34] \ + | powerpc | powerpcle \ + | 1750a | dsp16xx | pdp11 | mips16 | mips64 | mipsel | mips64el \ + | mips64orion | mips64orionel | mipstx39 | mipstx39el \ + | mips64vr4300 | mips64vr4300el | mips64vr4100 | mips64vr4100el \ + | mips64vr5000 | miprs64vr5000el | mcore \ + | sparc | sparclet | sparclite | sparc64 | sparcv9 | v850 | c4x \ + | thumb | d10v | d30v | fr30 | avr) + 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 | z8k | v70 | h8500 | w65 | pj | pjl) + ;; + + # 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[234567]86) + basic_machine=$basic_machine-pc + ;; + # Object if more than one company name word. + *-*-*) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; + # Recognize the basic CPU types with company name. + # FIXME: clean up the formatting here. + vax-* | tahoe-* | i[234567]86-* | i860-* | ia64-* | m32r-* | m68k-* | m68000-* \ + | m88k-* | sparc-* | ns32k-* | fx80-* | arc-* | arm-* | c[123]* \ + | mips-* | pyramid-* | tron-* | a29k-* | romp-* | rs6000-* \ + | power-* | none-* | 580-* | cray2-* | h8300-* | h8500-* | i960-* \ + | xmp-* | ymp-* \ + | x86-* | ppcbe-* | mipsbe-* | mipsle-* | shbe-* | shle-* | armbe-* | armle-* \ + | hppa-* | hppa1.0-* | hppa1.1-* | hppa2.0-* | hppa2.0w-* \ + | hppa2.0n-* | hppa64-* \ + | alpha-* | alphaev[4-8]-* | alphaev56-* | alphapca5[67]-* \ + | alphaev6[78]-* \ + | we32k-* | cydra-* | ns16k-* | pn-* | np1-* | xps100-* \ + | clipper-* | orion-* \ + | sparclite-* | pdp11-* | sh-* | powerpc-* | powerpcle-* \ + | sparc64-* | sparcv9-* | sparc86x-* | mips16-* | mips64-* | mipsel-* \ + | mips64el-* | mips64orion-* | mips64orionel-* \ + | mips64vr4100-* | mips64vr4100el-* | mips64vr4300-* | mips64vr4300el-* \ + | mipstx39-* | mipstx39el-* | mcore-* \ + | f301-* | armv*-* | s390-* | sv1-* | t3e-* \ + | m88110-* | m680[01234]0-* | m683?2-* | m68360-* | z8k-* | d10v-* \ + | thumb-* | v850-* | d30v-* | tic30-* | c30-* | fr30-* \ + | bs2000-* | tic54x-* | c54x-*) + ;; + # 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 + ;; + convex-c1) + basic_machine=c1-convex + os=-bsd + ;; + convex-c2) + basic_machine=c2-convex + os=-bsd + ;; + convex-c32) + basic_machine=c32-convex + os=-bsd + ;; + convex-c34) + basic_machine=c34-convex + os=-bsd + ;; + convex-c38) + basic_machine=c38-convex + os=-bsd + ;; + cray | ymp) + basic_machine=ymp-cray + os=-unicos + ;; + cray2) + basic_machine=cray2-cray + os=-unicos + ;; + [ctj]90-cray) + basic_machine=c90-cray + os=-unicos + ;; + crds | unos) + basic_machine=m68k-crds + ;; + 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 + ;; + 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 + ;; + 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[34567]86v32) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv32 + ;; + i[34567]86v4*) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv4 + ;; + i[34567]86v) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv + ;; + i[34567]86sol2) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-solaris2 + ;; + i386mach) + basic_machine=i386-mach + os=-mach + ;; + i386-vsta | vsta) + basic_machine=i386-unknown + os=-vsta + ;; + i386-go32 | go32) + basic_machine=i386-unknown + os=-go32 + ;; + i386-mingw32 | mingw32) + basic_machine=i386-unknown + os=-mingw32 + ;; + iris | iris4d) + basic_machine=mips-sgi + case $os in + -irix*) + ;; + *) + os=-irix4 + ;; + esac + ;; + isi68 | isi) + basic_machine=m68k-isi + os=-sysv + ;; + m88k-omron*) + basic_machine=m88k-omron + ;; + magnum | m3230) + basic_machine=mips-mips + os=-sysv + ;; + merlin) + basic_machine=ns32k-utek + os=-sysv + ;; + miniframe) + basic_machine=m68000-convergent + ;; + *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; + mipsel*-linux*) + basic_machine=mipsel-unknown + os=-linux-gnu + ;; + mips*-linux*) + basic_machine=mips-unknown + os=-linux-gnu + ;; + mips3*-*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` + ;; + mips3*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown + ;; + mmix*) + basic_machine=mmix-knuth + os=-mmixware + ;; + monitor) + basic_machine=m68k-rom68k + os=-coff + ;; + msdos) + basic_machine=i386-unknown + 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 + ;; + np1) + basic_machine=np1-gould + ;; + nsr-tandem) + basic_machine=nsr-tandem + ;; + op50n-* | op60c-*) + basic_machine=hppa1.1-oki + os=-proelf + ;; + 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 | nexen) + basic_machine=i586-pc + ;; + pentiumpro | p6 | 6x86 | athlon) + basic_machine=i686-pc + ;; + pentiumii | pentium2) + basic_machine=i786-pc + ;; + pentium-* | p5-* | k5-* | k6-* | nexen-*) + basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumpro-* | p6-* | 6x86-* | athlon-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumii-* | pentium2-*) + basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pn) + basic_machine=pn-gould + ;; + power) basic_machine=rs6000-ibm + ;; + ppc) basic_machine=powerpc-unknown + ;; + ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppcle | powerpclittle | ppc-le | powerpc-little) + basic_machine=powerpcle-unknown + ;; + ppcle-* | powerpclittle-*) + basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ps2) + basic_machine=i386-ibm + ;; + rom68k) + basic_machine=m68k-rom68k + os=-coff + ;; + rm[46]00) + basic_machine=mips-siemens + ;; + rtpc | rtpc-*) + basic_machine=romp-ibm + ;; + sa29200) + basic_machine=a29k-amd + os=-udi + ;; + sequent) + basic_machine=i386-sequent + ;; + sh) + basic_machine=sh-hitachi + os=-hms + ;; + sparclite-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=t3e-cray + os=-unicos + ;; + tic54x | c54x*) + basic_machine=tic54x-unknown + os=-coff + ;; + tx39) + basic_machine=mipstx39-unknown + ;; + tx39el) + basic_machine=mipstx39el-unknown + ;; + tower | tower-32) + basic_machine=m68k-ncr + ;; + udi29k) + basic_machine=a29k-amd + os=-udi + ;; + ultra3) + basic_machine=a29k-nyu + os=-sym1 + ;; + 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 + ;; + xmp) + basic_machine=xmp-cray + os=-unicos + ;; + xps | xps100) + basic_machine=xps100-honeywell + ;; + 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 + ;; + mips) + if [ x$os = x-linux-gnu ]; then + basic_machine=mips-unknown + else + basic_machine=mips-mips + fi + ;; + romp) + basic_machine=romp-ibm + ;; + rs6000) + basic_machine=rs6000-ibm + ;; + vax) + basic_machine=vax-dec + ;; + pdp11) + basic_machine=pdp11-dec + ;; + we32k) + basic_machine=we32k-att + ;; + sh3 | sh4) + base_machine=sh-unknown + ;; + sparc | sparcv9) + 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 + ;; + c4x*) + basic_machine=c4x-none + os=-coff + ;; + *) + 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* \ + | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ + | -mingw32* | -linux-gnu* | -uxpv* | -beos* | -mpeix* | -udk* \ + | -interix* | -uwin* | -rhapsody* | -darwin* | -opened* \ + | -openstep* | -oskit*) + # Remember, each alternative MUST END IN *, to match a version number. + ;; + -qnx*) + case $basic_machine in + x86-* | i[34567]86-*) + ;; + *) + os=-nto$os + ;; + esac + ;; + -nto*) + os=-nto-qnx + ;; + -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ + | -windows* | -osx | -abug | -netware* | -os9* | -beos* \ + | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) + ;; + -mac*) + os=`echo $os | sed -e 's|mac|macos|'` + ;; + -linux*) + os=`echo $os | sed -e 's|linux|linux-gnu|'` + ;; + -sunos5*) + os=`echo $os | sed -e 's|sunos5|solaris2|'` + ;; + -sunos6*) + os=`echo $os | sed -e 's|sunos6|solaris3|'` + ;; + -opened*) + os=-openedition + ;; + -wince*) + os=-wince + ;; + -osfrose*) + os=-osfrose + ;; + -osf*) + os=-osf + ;; + -utek*) + os=-bsd + ;; + -dynix*) + os=-bsd + ;; + -acis*) + os=-aos + ;; + -386bsd) + os=-bsd + ;; + -ctix* | -uts*) + os=-sysv + ;; + -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) + 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 + ;; + 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 + ;; + *-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 + ;; + f301-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*) + vendor=wrs + ;; + -aux*) + vendor=apple + ;; + -hms*) + vendor=hitachi + ;; + -mpw* | -macos*) + vendor=apple + ;; + -*mint | -*MiNT) + vendor=atari + ;; + 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: "version='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: Index: xc/extras/freetype2/builds/unix/configure diff -u /dev/null xc/extras/freetype2/builds/unix/configure:1.1.1.1 --- /dev/null Mon Dec 18 14:22:20 2000 +++ xc/extras/freetype2/builds/unix/configure Fri Dec 8 16:26:08 2000 @@ -0,0 +1,2585 @@ +#! /bin/sh + +# Guess values for system-dependent variables and create Makefiles. +# Generated automatically using autoconf version 2.13 +# Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc. +# +# This configure script is free software; the Free Software Foundation +# gives unlimited permission to copy, distribute and modify it. + +# Defaults: +ac_help= +ac_default_prefix=/usr/local +# Any additions from configure.in: +ac_help="$ac_help + --enable-shared[=PKGS] build shared libraries [default=yes]" +ac_help="$ac_help + --enable-static[=PKGS] build static libraries [default=yes]" +ac_help="$ac_help + --enable-fast-install[=PKGS] optimize for fast installation [default=yes]" +ac_help="$ac_help + --with-gnu-ld assume the C compiler uses GNU ld [default=no]" +ac_help="$ac_help + --disable-libtool-lock avoid locking (might break parallel builds)" + +# Initialize some variables set by options. +# The variables have the same names as the options, with +# dashes changed to underlines. +build=NONE +cache_file=./config.cache +exec_prefix=NONE +host=NONE +no_create= +nonopt=NONE +no_recursion= +prefix=NONE +program_prefix=NONE +program_suffix=NONE +program_transform_name=s,x,x, +silent= +site= +srcdir= +target=NONE +verbose= +x_includes=NONE +x_libraries=NONE +bindir='${exec_prefix}/bin' +sbindir='${exec_prefix}/sbin' +libexecdir='${exec_prefix}/libexec' +datadir='${prefix}/share' +sysconfdir='${prefix}/etc' +sharedstatedir='${prefix}/com' +localstatedir='${prefix}/var' +libdir='${exec_prefix}/lib' +includedir='${prefix}/include' +oldincludedir='/usr/include' +infodir='${prefix}/info' +mandir='${prefix}/man' + +# Initialize some other variables. +subdirs= +MFLAGS= MAKEFLAGS= +SHELL=${CONFIG_SHELL-/bin/sh} +# Maximum number of lines to put in a shell here document. +ac_max_here_lines=12 + +ac_prev= +for ac_option +do + + # If the previous option needs an argument, assign it. + if test -n "$ac_prev"; then + eval "$ac_prev=\$ac_option" + ac_prev= + continue + fi + + case "$ac_option" in + -*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;; + *) ac_optarg= ;; + esac + + # Accept the important Cygnus configure options, so we can diagnose typos. + + case "$ac_option" in + + -bindir | --bindir | --bindi | --bind | --bin | --bi) + ac_prev=bindir ;; + -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) + bindir="$ac_optarg" ;; + + -build | --build | --buil | --bui | --bu) + ac_prev=build ;; + -build=* | --build=* | --buil=* | --bui=* | --bu=*) + build="$ac_optarg" ;; + + -cache-file | --cache-file | --cache-fil | --cache-fi \ + | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) + ac_prev=cache_file ;; + -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ + | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) + cache_file="$ac_optarg" ;; + + -datadir | --datadir | --datadi | --datad | --data | --dat | --da) + ac_prev=datadir ;; + -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \ + | --da=*) + datadir="$ac_optarg" ;; + + -disable-* | --disable-*) + ac_feature=`echo $ac_option|sed -e 's/-*disable-//'` + # Reject names that are not valid shell variable names. + if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then + { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; } + fi + ac_feature=`echo $ac_feature| sed 's/-/_/g'` + eval "enable_${ac_feature}=no" ;; + + -enable-* | --enable-*) + ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'` + # Reject names that are not valid shell variable names. + if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then + { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; } + fi + ac_feature=`echo $ac_feature| sed 's/-/_/g'` + case "$ac_option" in + *=*) ;; + *) ac_optarg=yes ;; + esac + eval "enable_${ac_feature}='$ac_optarg'" ;; + + -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ + | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ + | --exec | --exe | --ex) + ac_prev=exec_prefix ;; + -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ + | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ + | --exec=* | --exe=* | --ex=*) + exec_prefix="$ac_optarg" ;; + + -gas | --gas | --ga | --g) + # Obsolete; use --with-gas. + with_gas=yes ;; + + -help | --help | --hel | --he) + # Omit some internal or obsolete options to make the list less imposing. + # This message is too long to be a string in the A/UX 3.1 sh. + cat << EOF +Usage: configure [options] [host] +Options: [defaults in brackets after descriptions] +Configuration: + --cache-file=FILE cache test results in FILE + --help print this message + --no-create do not create output files + --quiet, --silent do not print \`checking...' messages + --version print the version of autoconf that created configure +Directory and file names: + --prefix=PREFIX install architecture-independent files in PREFIX + [$ac_default_prefix] + --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX + [same as prefix] + --bindir=DIR user executables in DIR [EPREFIX/bin] + --sbindir=DIR system admin executables in DIR [EPREFIX/sbin] + --libexecdir=DIR program executables in DIR [EPREFIX/libexec] + --datadir=DIR read-only architecture-independent data in DIR + [PREFIX/share] + --sysconfdir=DIR read-only single-machine data in DIR [PREFIX/etc] + --sharedstatedir=DIR modifiable architecture-independent data in DIR + [PREFIX/com] + --localstatedir=DIR modifiable single-machine data in DIR [PREFIX/var] + --libdir=DIR object code libraries in DIR [EPREFIX/lib] + --includedir=DIR C header files in DIR [PREFIX/include] + --oldincludedir=DIR C header files for non-gcc in DIR [/usr/include] + --infodir=DIR info documentation in DIR [PREFIX/info] + --mandir=DIR man documentation in DIR [PREFIX/man] + --srcdir=DIR find the sources in DIR [configure dir or ..] + --program-prefix=PREFIX prepend PREFIX to installed program names + --program-suffix=SUFFIX append SUFFIX to installed program names + --program-transform-name=PROGRAM + run sed PROGRAM on installed program names +EOF + cat << EOF +Host type: + --build=BUILD configure for building on BUILD [BUILD=HOST] + --host=HOST configure for HOST [guessed] + --target=TARGET configure for TARGET [TARGET=HOST] +Features and packages: + --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) + --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] + --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) + --x-includes=DIR X include files are in DIR + --x-libraries=DIR X library files are in DIR +EOF + if test -n "$ac_help"; then + echo "--enable and --with options recognized:$ac_help" + fi + exit 0 ;; + + -host | --host | --hos | --ho) + ac_prev=host ;; + -host=* | --host=* | --hos=* | --ho=*) + host="$ac_optarg" ;; + + -includedir | --includedir | --includedi | --included | --include \ + | --includ | --inclu | --incl | --inc) + ac_prev=includedir ;; + -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ + | --includ=* | --inclu=* | --incl=* | --inc=*) + includedir="$ac_optarg" ;; + + -infodir | --infodir | --infodi | --infod | --info | --inf) + ac_prev=infodir ;; + -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) + infodir="$ac_optarg" ;; + + -libdir | --libdir | --libdi | --libd) + ac_prev=libdir ;; + -libdir=* | --libdir=* | --libdi=* | --libd=*) + libdir="$ac_optarg" ;; + + -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ + | --libexe | --libex | --libe) + ac_prev=libexecdir ;; + -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ + | --libexe=* | --libex=* | --libe=*) + libexecdir="$ac_optarg" ;; + + -localstatedir | --localstatedir | --localstatedi | --localstated \ + | --localstate | --localstat | --localsta | --localst \ + | --locals | --local | --loca | --loc | --lo) + ac_prev=localstatedir ;; + -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ + | --localstate=* | --localstat=* | --localsta=* | --localst=* \ + | --locals=* | --local=* | --loca=* | --loc=* | --lo=*) + localstatedir="$ac_optarg" ;; + + -mandir | --mandir | --mandi | --mand | --man | --ma | --m) + ac_prev=mandir ;; + -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) + mandir="$ac_optarg" ;; + + -nfp | --nfp | --nf) + # Obsolete; use --without-fp. + with_fp=no ;; + + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c) + no_create=yes ;; + + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) + no_recursion=yes ;; + + -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ + | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ + | --oldin | --oldi | --old | --ol | --o) + ac_prev=oldincludedir ;; + -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ + | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ + | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) + oldincludedir="$ac_optarg" ;; + + -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) + ac_prev=prefix ;; + -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) + prefix="$ac_optarg" ;; + + -program-prefix | --program-prefix | --program-prefi | --program-pref \ + | --program-pre | --program-pr | --program-p) + ac_prev=program_prefix ;; + -program-prefix=* | --program-prefix=* | --program-prefi=* \ + | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) + program_prefix="$ac_optarg" ;; + + -program-suffix | --program-suffix | --program-suffi | --program-suff \ + | --program-suf | --program-su | --program-s) + ac_prev=program_suffix ;; + -program-suffix=* | --program-suffix=* | --program-suffi=* \ + | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) + program_suffix="$ac_optarg" ;; + + -program-transform-name | --program-transform-name \ + | --program-transform-nam | --program-transform-na \ + | --program-transform-n | --program-transform- \ + | --program-transform | --program-transfor \ + | --program-transfo | --program-transf \ + | --program-trans | --program-tran \ + | --progr-tra | --program-tr | --program-t) + ac_prev=program_transform_name ;; + -program-transform-name=* | --program-transform-name=* \ + | --program-transform-nam=* | --program-transform-na=* \ + | --program-transform-n=* | --program-transform-=* \ + | --program-transform=* | --program-transfor=* \ + | --program-transfo=* | --program-transf=* \ + | --program-trans=* | --program-tran=* \ + | --progr-tra=* | --program-tr=* | --program-t=*) + program_transform_name="$ac_optarg" ;; + + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + silent=yes ;; + + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) + ac_prev=sbindir ;; + -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ + | --sbi=* | --sb=*) + sbindir="$ac_optarg" ;; + + -sharedstatedir | --sharedstatedir | --sharedstatedi \ + | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ + | --sharedst | --shareds | --shared | --share | --shar \ + | --sha | --sh) + ac_prev=sharedstatedir ;; + -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ + | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ + | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ + | --sha=* | --sh=*) + sharedstatedir="$ac_optarg" ;; + + -site | --site | --sit) + ac_prev=site ;; + -site=* | --site=* | --sit=*) + site="$ac_optarg" ;; + + -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) + ac_prev=srcdir ;; + -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) + srcdir="$ac_optarg" ;; + + -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ + | --syscon | --sysco | --sysc | --sys | --sy) + ac_prev=sysconfdir ;; + -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ + | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) + sysconfdir="$ac_optarg" ;; + + -target | --target | --targe | --targ | --tar | --ta | --t) + ac_prev=target ;; + -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) + target="$ac_optarg" ;; + + -v | -verbose | --verbose | --verbos | --verbo | --verb) + verbose=yes ;; + + -version | --version | --versio | --versi | --vers) + echo "configure generated by autoconf version 2.13" + exit 0 ;; + + -with-* | --with-*) + ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'` + # Reject names that are not valid shell variable names. + if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then + { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; } + fi + ac_package=`echo $ac_package| sed 's/-/_/g'` + case "$ac_option" in + *=*) ;; + *) ac_optarg=yes ;; + esac + eval "with_${ac_package}='$ac_optarg'" ;; + + -without-* | --without-*) + ac_package=`echo $ac_option|sed -e 's/-*without-//'` + # Reject names that are not valid shell variable names. + if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then + { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; } + fi + ac_package=`echo $ac_package| sed 's/-/_/g'` + eval "with_${ac_package}=no" ;; + + --x) + # Obsolete; use --with-x. + with_x=yes ;; + + -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ + | --x-incl | --x-inc | --x-in | --x-i) + ac_prev=x_includes ;; + -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ + | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) + x_includes="$ac_optarg" ;; + + -x-libraries | --x-libraries | --x-librarie | --x-librari \ + | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) + ac_prev=x_libraries ;; + -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ + | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) + x_libraries="$ac_optarg" ;; + + -*) { echo "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; } + ;; + + *) + if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then + echo "configure: warning: $ac_option: invalid host type" 1>&2 + fi + if test "x$nonopt" != xNONE; then + { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; } + fi + nonopt="$ac_option" + ;; + + esac +done + +if test -n "$ac_prev"; then + { echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; } +fi + +trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15 + +# File descriptor usage: +# 0 standard input +# 1 file creation +# 2 errors and warnings +# 3 some systems may open it to /dev/tty +# 4 used on the Kubota Titan +# 6 checking for... messages and results +# 5 compiler messages saved in config.log +if test "$silent" = yes; then + exec 6>/dev/null +else + exec 6>&1 +fi +exec 5>./config.log + +echo "\ +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. +" 1>&5 + +# Strip out --no-create and --no-recursion so they do not pile up. +# Also quote any args containing shell metacharacters. +ac_configure_args= +for ac_arg +do + case "$ac_arg" in + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c) ;; + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;; + *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*) + ac_configure_args="$ac_configure_args '$ac_arg'" ;; + *) ac_configure_args="$ac_configure_args $ac_arg" ;; + esac +done + +# NLS nuisances. +# Only set these to C if already set. These must not be set unconditionally +# because not all systems understand e.g. LANG=C (notably SCO). +# Fixing LC_MESSAGES prevents Solaris sh from translating var values in `set'! +# Non-C LC_CTYPE values break the ctype check. +if test "${LANG+set}" = set; then LANG=C; export LANG; fi +if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi +if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi +if test "${LC_CTYPE+set}" = set; then LC_CTYPE=C; export LC_CTYPE; fi + +# confdefs.h avoids OS command line length limits that DEFS can exceed. +rm -rf conftest* confdefs.h +# AIX cpp loses on an empty file, so make sure it contains at least a newline. +echo > confdefs.h + +# A filename unique to this package, relative to the directory that +# configure is in, which we can look for to find out if srcdir is correct. +ac_unique_file=ftconfig.in + +# Find the source files, if location was not specified. +if test -z "$srcdir"; then + ac_srcdir_defaulted=yes + # Try the directory containing this script, then its parent. + ac_prog=$0 + ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'` + test "x$ac_confdir" = "x$ac_prog" && ac_confdir=. + srcdir=$ac_confdir + if test ! -r $srcdir/$ac_unique_file; then + srcdir=.. + fi +else + ac_srcdir_defaulted=no +fi +if test ! -r $srcdir/$ac_unique_file; then + if test "$ac_srcdir_defaulted" = yes; then + { echo "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; } + else + { echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; } + fi +fi +srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'` + +# Prefer explicitly selected file to automatically selected ones. +if test -z "$CONFIG_SITE"; then + if test "x$prefix" != xNONE; then + CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" + else + CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" + fi +fi +for ac_site_file in $CONFIG_SITE; do + if test -r "$ac_site_file"; then + echo "loading site script $ac_site_file" + . "$ac_site_file" + fi +done + +if test -r "$cache_file"; then + echo "loading cache $cache_file" + . $cache_file +else + echo "creating cache $cache_file" + > $cache_file +fi + +ac_ext=c +# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. +ac_cpp='$CPP $CPPFLAGS' +ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' +ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' +cross_compiling=$ac_cv_prog_cc_cross + +ac_exeext= +ac_objext=o +if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then + # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu. + if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then + ac_n= ac_c=' +' ac_t=' ' + else + ac_n=-n ac_c= ac_t= + fi +else + ac_n= ac_c='\c' ac_t= +fi + + + + + +version_info='6:1:0' + + +ac_aux_dir= +for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do + if test -f $ac_dir/install-sh; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install-sh -c" + break + elif test -f $ac_dir/install.sh; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install.sh -c" + break + fi +done +if test -z "$ac_aux_dir"; then + { echo "configure: error: can not find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." 1>&2; exit 1; } +fi +ac_config_guess=$ac_aux_dir/config.guess +ac_config_sub=$ac_aux_dir/config.sub +ac_configure=$ac_aux_dir/configure # This should be Cygnus configure. + + +# Do some error checking and defaulting for the host and target type. +# The inputs are: +# configure --host=HOST --target=TARGET --build=BUILD NONOPT +# +# The rules are: +# 1. You are not allowed to specify --host, --target, and nonopt at the +# same time. +# 2. Host defaults to nonopt. +# 3. If nonopt is not specified, then host defaults to the current host, +# as determined by config.guess. +# 4. Target and build default to nonopt. +# 5. If nonopt is not specified, then target and build default to host. + +# The aliases save the names the user supplied, while $host etc. +# will get canonicalized. +case $host---$target---$nonopt in +NONE---*---* | *---NONE---* | *---*---NONE) ;; +*) { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; } ;; +esac + + +# Make sure we can run config.sub. +if ${CONFIG_SHELL-/bin/sh} $ac_config_sub sun4 >/dev/null 2>&1; then : +else { echo "configure: error: can not run $ac_config_sub" 1>&2; exit 1; } +fi + +echo $ac_n "checking host system type""... $ac_c" 1>&6 +echo "configure:588: checking host system type" >&5 + +host_alias=$host +case "$host_alias" in +NONE) + case $nonopt in + NONE) + if host_alias=`${CONFIG_SHELL-/bin/sh} $ac_config_guess`; then : + else { echo "configure: error: can not guess host type; you must specify one" 1>&2; exit 1; } + fi ;; + *) host_alias=$nonopt ;; + esac ;; +esac + +host=`${CONFIG_SHELL-/bin/sh} $ac_config_sub $host_alias` +host_cpu=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` +host_vendor=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` +host_os=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` +echo "$ac_t""$host" 1>&6 + +echo $ac_n "checking target system type""... $ac_c" 1>&6 +echo "configure:609: checking target system type" >&5 + +target_alias=$target +case "$target_alias" in +NONE) + case $nonopt in + NONE) target_alias=$host_alias ;; + *) target_alias=$nonopt ;; + esac ;; +esac + +target=`${CONFIG_SHELL-/bin/sh} $ac_config_sub $target_alias` +target_cpu=`echo $target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` +target_vendor=`echo $target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` +target_os=`echo $target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` +echo "$ac_t""$target" 1>&6 + +echo $ac_n "checking build system type""... $ac_c" 1>&6 +echo "configure:627: checking build system type" >&5 + +build_alias=$build +case "$build_alias" in +NONE) + case $nonopt in + NONE) build_alias=$host_alias ;; + *) build_alias=$nonopt ;; + esac ;; +esac + +build=`${CONFIG_SHELL-/bin/sh} $ac_config_sub $build_alias` +build_cpu=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` +build_vendor=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` +build_os=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` +echo "$ac_t""$build" 1>&6 + +test "$host_alias" != "$target_alias" && + test "$program_prefix$program_suffix$program_transform_name" = \ + NONENONEs,x,x, && + program_prefix=${target_alias}- + + +# Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:653: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" + ac_dummy="$PATH" + for ac_dir in $ac_dummy; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + ac_cv_prog_CC="gcc" + break + fi + done + IFS="$ac_save_ifs" +fi +fi +CC="$ac_cv_prog_CC" +if test -n "$CC"; then + echo "$ac_t""$CC" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + +if test -z "$CC"; then + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:683: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" + ac_prog_rejected=no + ac_dummy="$PATH" + for ac_dir in $ac_dummy; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + if test "$ac_dir/$ac_word" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + break + fi + done + IFS="$ac_save_ifs" +if test $ac_prog_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $ac_cv_prog_CC + shift + if test $# -gt 0; then + # We chose a different compiler from the bogus one. + # However, it has the same basename, so the bogon will be chosen + # first if we set CC to just the basename; use the full file name. + shift + set dummy "$ac_dir/$ac_word" "$@" + shift + ac_cv_prog_CC="$@" + fi +fi +fi +fi +CC="$ac_cv_prog_CC" +if test -n "$CC"; then + echo "$ac_t""$CC" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + + if test -z "$CC"; then + case "`uname -s`" in + *win32* | *WIN32*) + # Extract the first word of "cl", so it can be a program name with args. +set dummy cl; ac_word=$2 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:734: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" + ac_dummy="$PATH" + for ac_dir in $ac_dummy; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + ac_cv_prog_CC="cl" + break + fi + done + IFS="$ac_save_ifs" +fi +fi +CC="$ac_cv_prog_CC" +if test -n "$CC"; then + echo "$ac_t""$CC" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + ;; + esac + fi + test -z "$CC" && { echo "configure: error: no acceptable cc found in \$PATH" 1>&2; exit 1; } +fi + +echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6 +echo "configure:766: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5 + +ac_ext=c +# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. +ac_cpp='$CPP $CPPFLAGS' +ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' +ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' +cross_compiling=$ac_cv_prog_cc_cross + +cat > conftest.$ac_ext << EOF + +#line 777 "configure" +#include "confdefs.h" + +main(){return(0);} +EOF +if { (eval echo configure:782: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + ac_cv_prog_cc_works=yes + # If we can't run a trivial program, we are probably using a cross compiler. + if (./conftest; exit) 2>/dev/null; then + ac_cv_prog_cc_cross=no + else + ac_cv_prog_cc_cross=yes + fi +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + ac_cv_prog_cc_works=no +fi +rm -fr conftest* +ac_ext=c +# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. +ac_cpp='$CPP $CPPFLAGS' +ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' +ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' +cross_compiling=$ac_cv_prog_cc_cross + +echo "$ac_t""$ac_cv_prog_cc_works" 1>&6 +if test $ac_cv_prog_cc_works = no; then + { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; } +fi +echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6 +echo "configure:808: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5 +echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6 +cross_compiling=$ac_cv_prog_cc_cross + +echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6 +echo "configure:813: checking whether we are using GNU C" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.c <&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then + ac_cv_prog_gcc=yes +else + ac_cv_prog_gcc=no +fi +fi + +echo "$ac_t""$ac_cv_prog_gcc" 1>&6 + +if test $ac_cv_prog_gcc = yes; then + GCC=yes +else + GCC= +fi + +ac_test_CFLAGS="${CFLAGS+set}" +ac_save_CFLAGS="$CFLAGS" +CFLAGS= +echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6 +echo "configure:841: checking whether ${CC-cc} accepts -g" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + echo 'void f(){}' > conftest.c +if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then + ac_cv_prog_cc_g=yes +else + ac_cv_prog_cc_g=no +fi +rm -f conftest* + +fi + +echo "$ac_t""$ac_cv_prog_cc_g" 1>&6 +if test "$ac_test_CFLAGS" = set; then + CFLAGS="$ac_save_CFLAGS" +elif test $ac_cv_prog_cc_g = yes; then + 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 $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6 +echo "configure:873: checking how to run the C preprocessor" >&5 +# On Suns, sometimes $CPP names a directory. +if test -n "$CPP" && test -d "$CPP"; then + CPP= +fi +if test -z "$CPP"; then +if eval "test \"`echo '$''{'ac_cv_prog_CPP'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + # This must be in double quotes, not single quotes, because CPP may get + # substituted into the Makefile and "${CC-cc}" will confuse make. + CPP="${CC-cc} -E" + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. + cat > conftest.$ac_ext < +Syntax Error +EOF +ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +{ (eval echo configure:894: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` +if test -z "$ac_err"; then + : +else + echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + CPP="${CC-cc} -E -traditional-cpp" + cat > conftest.$ac_ext < +Syntax Error +EOF +ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +{ (eval echo configure:911: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` +if test -z "$ac_err"; then + : +else + echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + CPP="${CC-cc} -nologo -E" + cat > conftest.$ac_ext < +Syntax Error +EOF +ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +{ (eval echo configure:928: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` +if test -z "$ac_err"; then + : +else + echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + CPP=/lib/cpp +fi +rm -f conftest* +fi +rm -f conftest* +fi +rm -f conftest* + ac_cv_prog_CPP="$CPP" +fi + CPP="$ac_cv_prog_CPP" +else + ac_cv_prog_CPP="$CPP" +fi +echo "$ac_t""$CPP" 1>&6 + + +if test "x$CC" = xgcc; then + XX_CFLAGS="-Wall" + XX_ANSIFLAGS="-pedantic -ansi" +else + case "$host" in + *-dec-osf*) + CFLAGS= + XX_CFLAGS="-std1 -g3" + XX_ANSIFLAGS= + ;; + *) + XX_CFLAGS= + XX_ANSIFLAGS= + ;; + esac +fi + + + +# Extract the first word of "rm", so it can be a program name with args. +set dummy rm; ac_word=$2 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:975: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_RMF'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + if test -n "$RMF"; then + ac_cv_prog_RMF="$RMF" # Let the user override the test. +else + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" + ac_dummy="$PATH" + for ac_dir in $ac_dummy; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + ac_cv_prog_RMF="rm -f" + break + fi + done + IFS="$ac_save_ifs" +fi +fi +RMF="$ac_cv_prog_RMF" +if test -n "$RMF"; then + echo "$ac_t""$RMF" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + +# Extract the first word of "rmdir", so it can be a program name with args. +set dummy rmdir; ac_word=$2 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:1004: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_RMDIR'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + if test -n "$RMDIR"; then + ac_cv_prog_RMDIR="$RMDIR" # Let the user override the test. +else + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" + ac_dummy="$PATH" + for ac_dir in $ac_dummy; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + ac_cv_prog_RMDIR="rmdir" + break + fi + done + IFS="$ac_save_ifs" +fi +fi +RMDIR="$ac_cv_prog_RMDIR" +if test -n "$RMDIR"; then + echo "$ac_t""$RMDIR" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + + +# Find a good install program. We prefer a C program (faster), +# so one script is as good as another. But avoid the broken or +# incompatible versions: +# SysV /etc/install, /usr/sbin/install +# SunOS /usr/etc/install +# IRIX /sbin/install +# AIX /bin/install +# 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 $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6 +echo "configure:1043: checking for a BSD compatible install" >&5 +if test -z "$INSTALL"; then +if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + IFS="${IFS= }"; ac_save_IFS="$IFS"; IFS=":" + for ac_dir in $PATH; do + # Account for people who put trailing slashes in PATH elements. + case "$ac_dir/" in + /|./|.//|/etc/*|/usr/sbin/*|/usr/etc/*|/sbin/*|/usr/afsws/bin/*|/usr/ucb/*) ;; + *) + # OSF1 and SCO ODT 3.0 have their own names for install. + # Don't use installbsd from OSF since it installs stuff as root + # by default. + for ac_prog in ginstall scoinst install; do + if test -f $ac_dir/$ac_prog; then + if test $ac_prog = install && + grep dspmsg $ac_dir/$ac_prog >/dev/null 2>&1; then + # AIX install. It has an incompatible calling convention. + : + else + ac_cv_path_install="$ac_dir/$ac_prog -c" + break 2 + fi + fi + done + ;; + esac + done + IFS="$ac_save_IFS" + +fi + if test "${ac_cv_path_install+set}" = set; then + INSTALL="$ac_cv_path_install" + else + # As a last resort, use the slow shell script. We don't cache a + # path for INSTALL within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the path is relative. + INSTALL="$ac_install_sh" + fi +fi +echo "$ac_t""$INSTALL" 1>&6 + +# Use test -z because SunOS4 sh mishandles braces in ${var-val}. +# It thinks the first close brace ends the variable substitution. +test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' + +test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL_PROGRAM}' + +test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' + +case "$INSTALL" in + /*) + ;; + */*) + INSTALL="`pwd`/$INSTALL" ;; +esac + +echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6 +echo "configure:1103: checking for ANSI C header files" >&5 +if eval "test \"`echo '$''{'ac_cv_header_stdc'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +#include +#include +#include +EOF +ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +{ (eval echo configure:1116: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` +if test -z "$ac_err"; then + rm -rf conftest* + ac_cv_header_stdc=yes +else + echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + ac_cv_header_stdc=no +fi +rm -f conftest* + +if test $ac_cv_header_stdc = yes; then + # SunOS 4.x string.h does not declare mem*, contrary to ANSI. +cat > conftest.$ac_ext < +EOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + egrep "memchr" >/dev/null 2>&1; then + : +else + rm -rf conftest* + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. +cat > conftest.$ac_ext < +EOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + egrep "free" >/dev/null 2>&1; then + : +else + rm -rf conftest* + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. +if test "$cross_compiling" = yes; then + : +else + cat > conftest.$ac_ext < +#define ISLOWER(c) ('a' <= (c) && (c) <= 'z') +#define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) +#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) +int main () { int i; for (i = 0; i < 256; i++) +if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) exit(2); +exit (0); } + +EOF +if { (eval echo configure:1183: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +then + : +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -fr conftest* + ac_cv_header_stdc=no +fi +rm -fr conftest* +fi + +fi +fi + +echo "$ac_t""$ac_cv_header_stdc" 1>&6 +if test $ac_cv_header_stdc = yes; then + cat >> confdefs.h <<\EOF +#define STDC_HEADERS 1 +EOF + +fi + +for ac_hdr in fcntl.h unistd.h +do +ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` +echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 +echo "configure:1210: checking for $ac_hdr" >&5 +if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +EOF +ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +{ (eval echo configure:1220: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` +if test -z "$ac_err"; then + rm -rf conftest* + eval "ac_cv_header_$ac_safe=yes" +else + echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_header_$ac_safe=no" +fi +rm -f conftest* +fi +if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then + echo "$ac_t""yes" 1>&6 + ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'` + cat >> confdefs.h <&6 +fi +done + + +echo $ac_n "checking for working const""... $ac_c" 1>&6 +echo "configure:1248: checking for working const" >&5 +if eval "test \"`echo '$''{'ac_cv_c_const'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext <j = 5; +} +{ /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ + const int foo = 10; +} + +; return 0; } +EOF +if { (eval echo configure:1302: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then + rm -rf conftest* + ac_cv_c_const=yes +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + ac_cv_c_const=no +fi +rm -f conftest* +fi + +echo "$ac_t""$ac_cv_c_const" 1>&6 +if test $ac_cv_c_const = no; then + cat >> confdefs.h <<\EOF +#define const +EOF + +fi + +echo $ac_n "checking size of int""... $ac_c" 1>&6 +echo "configure:1323: checking size of int" >&5 +if eval "test \"`echo '$''{'ac_cv_sizeof_int'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + if test "$cross_compiling" = yes; then + { echo "configure: error: can not run test program while cross compiling" 1>&2; exit 1; } +else + cat > conftest.$ac_ext < +main() +{ + FILE *f=fopen("conftestval", "w"); + if (!f) exit(1); + fprintf(f, "%d\n", sizeof(int)); + exit(0); +} +EOF +if { (eval echo configure:1342: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +then + ac_cv_sizeof_int=`cat conftestval` +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -fr conftest* + ac_cv_sizeof_int=0 +fi +rm -fr conftest* +fi + +fi +echo "$ac_t""$ac_cv_sizeof_int" 1>&6 +cat >> confdefs.h <&6 +echo "configure:1362: checking size of long" >&5 +if eval "test \"`echo '$''{'ac_cv_sizeof_long'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + if test "$cross_compiling" = yes; then + { echo "configure: error: can not run test program while cross compiling" 1>&2; exit 1; } +else + cat > conftest.$ac_ext < +main() +{ + FILE *f=fopen("conftestval", "w"); + if (!f) exit(1); + fprintf(f, "%d\n", sizeof(long)); + exit(0); +} +EOF +if { (eval echo configure:1381: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +then + ac_cv_sizeof_long=`cat conftestval` +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -fr conftest* + ac_cv_sizeof_long=0 +fi +rm -fr conftest* +fi + +fi +echo "$ac_t""$ac_cv_sizeof_long" 1>&6 +cat >> confdefs.h <&6 +echo "configure:1406: checking for $ac_hdr" >&5 +if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +EOF +ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +{ (eval echo configure:1416: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` +if test -z "$ac_err"; then + rm -rf conftest* + eval "ac_cv_header_$ac_safe=yes" +else + echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_header_$ac_safe=no" +fi +rm -f conftest* +fi +if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then + echo "$ac_t""yes" 1>&6 + ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'` + cat >> confdefs.h <&6 +fi +done + +for ac_func in getpagesize +do +echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 +echo "configure:1445: checking for $ac_func" >&5 +if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +/* Override any gcc2 internal prototype to avoid an error. */ +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char $ac_func(); + +int main() { + +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +choke me +#else +$ac_func(); +#endif + +; return 0; } +EOF +if { (eval echo configure:1473: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_func_$ac_func=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_func_$ac_func=no" +fi +rm -f conftest* +fi + +if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then + echo "$ac_t""yes" 1>&6 + ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` + cat >> confdefs.h <&6 +fi +done + +echo $ac_n "checking for working mmap""... $ac_c" 1>&6 +echo "configure:1498: checking for working mmap" >&5 +if eval "test \"`echo '$''{'ac_cv_func_mmap_fixed_mapped'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + if test "$cross_compiling" = yes; then + ac_cv_func_mmap_fixed_mapped=no +else + cat > conftest.$ac_ext < +#include +#include + +/* This mess was copied from the GNU getpagesize.h. */ +#ifndef HAVE_GETPAGESIZE +# ifdef HAVE_UNISTD_H +# include +# endif + +/* Assume that all systems that can run configure have sys/param.h. */ +# ifndef HAVE_SYS_PARAM_H +# define HAVE_SYS_PARAM_H 1 +# endif + +# ifdef _SC_PAGESIZE +# define getpagesize() sysconf(_SC_PAGESIZE) +# else /* no _SC_PAGESIZE */ +# ifdef HAVE_SYS_PARAM_H +# include +# ifdef EXEC_PAGESIZE +# define getpagesize() EXEC_PAGESIZE +# else /* no EXEC_PAGESIZE */ +# ifdef NBPG +# define getpagesize() NBPG * CLSIZE +# ifndef CLSIZE +# define CLSIZE 1 +# endif /* no CLSIZE */ +# else /* no NBPG */ +# ifdef NBPC +# define getpagesize() NBPC +# else /* no NBPC */ +# ifdef PAGESIZE +# define getpagesize() PAGESIZE +# endif /* PAGESIZE */ +# endif /* no NBPC */ +# endif /* no NBPG */ +# endif /* no EXEC_PAGESIZE */ +# else /* no HAVE_SYS_PARAM_H */ +# define getpagesize() 8192 /* punt totally */ +# endif /* no HAVE_SYS_PARAM_H */ +# endif /* no _SC_PAGESIZE */ + +#endif /* no HAVE_GETPAGESIZE */ + +#ifdef __cplusplus +extern "C" { void *malloc(unsigned); } +#else +char *malloc(); +#endif + +int +main() +{ + char *data, *data2, *data3; + int i, pagesize; + int fd; + + pagesize = getpagesize(); + + /* + * First, make a file with some known garbage in it. + */ + data = malloc(pagesize); + if (!data) + exit(1); + for (i = 0; i < pagesize; ++i) + *(data + i) = rand(); + umask(0); + fd = creat("conftestmmap", 0600); + if (fd < 0) + exit(1); + if (write(fd, data, pagesize) != pagesize) + exit(1); + close(fd); + + /* + * Next, try to mmap the file at a fixed address which + * already has something else allocated at it. If we can, + * also make sure that we see the same garbage. + */ + fd = open("conftestmmap", O_RDWR); + if (fd < 0) + exit(1); + data2 = malloc(2 * pagesize); + if (!data2) + exit(1); + data2 += (pagesize - ((int) data2 & (pagesize - 1))) & (pagesize - 1); + if (data2 != mmap(data2, pagesize, PROT_READ | PROT_WRITE, + MAP_PRIVATE | MAP_FIXED, fd, 0L)) + exit(1); + for (i = 0; i < pagesize; ++i) + if (*(data + i) != *(data2 + i)) + exit(1); + + /* + * Finally, make sure that changes to the mapped area + * do not percolate back to the file as seen by read(). + * (This is a bug on some variants of i386 svr4.0.) + */ + for (i = 0; i < pagesize; ++i) + *(data2 + i) = *(data2 + i) + 1; + data3 = malloc(pagesize); + if (!data3) + exit(1); + if (read(fd, data3, pagesize) != pagesize) + exit(1); + for (i = 0; i < pagesize; ++i) + if (*(data + i) != *(data3 + i)) + exit(1); + close(fd); + unlink("conftestmmap"); + exit(0); +} + +EOF +if { (eval echo configure:1646: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +then + ac_cv_func_mmap_fixed_mapped=yes +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -fr conftest* + ac_cv_func_mmap_fixed_mapped=no +fi +rm -fr conftest* +fi + +fi + +echo "$ac_t""$ac_cv_func_mmap_fixed_mapped" 1>&6 +if test $ac_cv_func_mmap_fixed_mapped = yes; then + cat >> confdefs.h <<\EOF +#define HAVE_MMAP 1 +EOF + +fi + +if test "$ac_cv_func_mmap_fixed_mapped" != yes; then + FTSYS_SRC='$(BASE_)ftsystem.c' +else + FTSYS_SRC='$(BUILD)/ftsystem.c' + + echo $ac_n "checking whether munmap must be declared""... $ac_c" 1>&6 +echo "configure:1674: checking whether munmap must be declared" >&5 +if eval "test \"`echo '$''{'ft_cv_munmap_decl'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +#endif +#include +int main() { +char *(*pfn) = (char *(*))munmap +; return 0; } +EOF +if { (eval echo configure:1690: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then + rm -rf conftest* + ft_cv_munmap_decl=no +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + ft_cv_munmap_decl=yes +fi +rm -f conftest* +fi + +echo "$ac_t""$ft_cv_munmap_decl" 1>&6 +if test $ft_cv_munmap_decl = yes; then + cat >> confdefs.h <<\EOF +#define NEED_MUNMAP_DECL 1 +EOF + +fi + echo $ac_n "checking for munmap's first parameter type""... $ac_c" 1>&6 +echo "configure:1710: checking for munmap's first parameter type" >&5 +cat > conftest.$ac_ext < +#include +int munmap(void *, size_t); +int main() { + +; return 0; } +EOF +if { (eval echo configure:1722: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then + rm -rf conftest* + echo "$ac_t""void *" 1>&6;cat >> confdefs.h <<\EOF +#define MUNMAP_USES_VOIDP 1 +EOF + +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + echo "$ac_t""char *" 1>&6 +fi +rm -f conftest* + +fi + + +for ac_func in memcpy memmove +do +echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 +echo "configure:1742: checking for $ac_func" >&5 +if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +/* Override any gcc2 internal prototype to avoid an error. */ +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char $ac_func(); + +int main() { + +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +choke me +#else +$ac_func(); +#endif + +; return 0; } +EOF +if { (eval echo configure:1770: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_func_$ac_func=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_func_$ac_func=no" +fi +rm -f conftest* +fi + +if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then + echo "$ac_t""yes" 1>&6 + ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` + cat >> confdefs.h <&6 +fi +done + + +# Check whether --enable-shared or --disable-shared was given. +if test "${enable_shared+set}" = set; then + enableval="$enable_shared" + p=${PACKAGE-default} +case "$enableval" in +yes) enable_shared=yes ;; +no) enable_shared=no ;; +*) + enable_shared=no + # Look at the argument we got. We use all the common list separators. + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:," + for pkg in $enableval; do + if test "X$pkg" = "X$p"; then + enable_shared=yes + fi + done + IFS="$ac_save_ifs" + ;; +esac +else + enable_shared=yes +fi + +# 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 + +# Extract the first word of "ranlib", so it can be a program name with args. +set dummy ranlib; ac_word=$2 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:1867: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + if test -n "$RANLIB"; then + ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. +else + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" + ac_dummy="$PATH" + for ac_dir in $ac_dummy; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + ac_cv_prog_RANLIB="ranlib" + break + fi + done + IFS="$ac_save_ifs" + test -z "$ac_cv_prog_RANLIB" && ac_cv_prog_RANLIB=":" +fi +fi +RANLIB="$ac_cv_prog_RANLIB" +if test -n "$RANLIB"; then + echo "$ac_t""$RANLIB" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + +# Check whether --with-gnu-ld or --without-gnu-ld was given. +if test "${with_gnu_ld+set}" = set; then + withval="$with_gnu_ld" + test "$withval" = no || with_gnu_ld=yes +else + with_gnu_ld=no +fi + +ac_prog=ld +if test "$ac_cv_prog_gcc" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + echo $ac_n "checking for ld used by GCC""... $ac_c" 1>&6 +echo "configure:1906: checking for ld used by GCC" >&5 + ac_prog=`($CC -print-prog-name=ld) 2>&5` + case "$ac_prog" in + # Accept absolute paths. + [\\/]* | [A-Za-z]:[\\/]*) + 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 $ac_n "checking for GNU ld""... $ac_c" 1>&6 +echo "configure:1930: checking for GNU ld" >&5 +else + echo $ac_n "checking for non-GNU ld""... $ac_c" 1>&6 +echo "configure:1933: checking for non-GNU ld" >&5 +fi +if eval "test \"`echo '$''{'ac_cv_path_LD'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + if test -z "$LD"; then + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${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 + ac_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some GNU ld's only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + if "$ac_cv_path_LD" -v 2>&1 < /dev/null | egrep '(GNU|with BFD)' > /dev/null; then + test "$with_gnu_ld" != no && break + else + test "$with_gnu_ld" != yes && break + fi + fi + done + IFS="$ac_save_ifs" +else + ac_cv_path_LD="$LD" # Let the user override the test with a path. +fi +fi + +LD="$ac_cv_path_LD" +if test -n "$LD"; then + echo "$ac_t""$LD" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi +test -z "$LD" && { echo "configure: error: no acceptable ld found in \$PATH" 1>&2; exit 1; } +echo $ac_n "checking if the linker ($LD) is GNU ld""... $ac_c" 1>&6 +echo "configure:1968: checking if the linker ($LD) is GNU ld" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_gnu_ld'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + # I'd rather use --version here, but apparently some GNU ld's only accept -v. +if $LD -v 2>&1 &5; then + ac_cv_prog_gnu_ld=yes +else + ac_cv_prog_gnu_ld=no +fi +fi + +echo "$ac_t""$ac_cv_prog_gnu_ld" 1>&6 + + +echo $ac_n "checking for BSD-compatible nm""... $ac_c" 1>&6 +echo "configure:1984: checking for BSD-compatible nm" >&5 +if eval "test \"`echo '$''{'ac_cv_path_NM'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + if test -n "$NM"; then + # Let the user override the test. + ac_cv_path_NM="$NM" +else + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}" + for ac_dir in $PATH /usr/ccs/bin /usr/ucb /bin; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/nm || test -f $ac_dir/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 + if ($ac_dir/nm -B /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then + ac_cv_path_NM="$ac_dir/nm -B" + break + elif ($ac_dir/nm -p /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then + ac_cv_path_NM="$ac_dir/nm -p" + break + else + ac_cv_path_NM=${ac_cv_path_NM="$ac_dir/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 "$ac_cv_path_NM" && ac_cv_path_NM=nm +fi +fi + +NM="$ac_cv_path_NM" +echo "$ac_t""$NM" 1>&6 + +echo $ac_n "checking whether ln -s works""... $ac_c" 1>&6 +echo "configure:2020: checking whether ln -s works" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_LN_S'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + rm -f conftestdata +if ln -s X conftestdata 2>/dev/null +then + rm -f conftestdata + ac_cv_prog_LN_S="ln -s" +else + ac_cv_prog_LN_S=ln +fi +fi +LN_S="$ac_cv_prog_LN_S" +if test "$ac_cv_prog_LN_S" = "ln -s"; then + echo "$ac_t""yes" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + + +case "$target" in +NONE) lt_target="$host" ;; +*) lt_target="$target" ;; +esac + +# Check for any special flags to pass to ltconfig. +libtool_flags="--cache-file=$cache_file" +test "$enable_shared" = no && libtool_flags="$libtool_flags --disable-shared" +test "$enable_static" = no && libtool_flags="$libtool_flags --disable-static" +test "$enable_fast_install" = no && libtool_flags="$libtool_flags --disable-fast-install" +test "$ac_cv_prog_gcc" = yes && libtool_flags="$libtool_flags --with-gcc" +test "$ac_cv_prog_gnu_ld" = yes && libtool_flags="$libtool_flags --with-gnu-ld" + + +# 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 && libtool_flags="$libtool_flags --disable-lock" +test x"$silent" = xyes && libtool_flags="$libtool_flags --silent" + +# Some flags need to be propagated to the compiler or linker for good +# libtool support. +case "$lt_target" in +*-*-irix6*) + # Find out which ABI we are using. + echo '#line 2069 "configure"' > conftest.$ac_ext + if { (eval echo configure:2070: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then + case "`/usr/bin/file conftest.o`" in + *32-bit*) + LD="${LD-ld} -32" + ;; + *N32*) + LD="${LD-ld} -n32" + ;; + *64-bit*) + LD="${LD-ld} -64" + ;; + esac + fi + rm -rf conftest* + ;; + +*-*-sco3.2v5*) + # On SCO OpenServer 5, we need -belf to get full-featured binaries. + SAVE_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -belf" + echo $ac_n "checking whether the C compiler needs -belf""... $ac_c" 1>&6 +echo "configure:2091: checking whether the C compiler needs -belf" >&5 +if eval "test \"`echo '$''{'lt_cv_cc_needs_belf'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + lt_cv_cc_needs_belf=yes +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + lt_cv_cc_needs_belf=no +fi +rm -f conftest* +fi + +echo "$ac_t""$lt_cv_cc_needs_belf" 1>&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 + + +# Save cache, so that ltconfig can load it +cat > confcache <<\EOF +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs. It is not useful on other systems. +# If it contains results you don't want to keep, you may remove or edit it. +# +# By default, configure uses ./config.cache as the cache file, +# creating it if it does not exist already. You can give configure +# the --cache-file=FILE option to use a different cache file; that is +# what configure does when it calls configure scripts in +# subdirectories, so they share the cache. +# Giving --cache-file=/dev/null disables caching, for debugging configure. +# config.status only pays attention to the cache file if you give it the +# --recheck option to rerun configure. +# +EOF +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, don't put newlines in cache variables' values. +# Ultrix sh set writes to stderr and can't be redirected directly, +# and sets the high bit in the cache file unless we assign to the vars. +(set) 2>&1 | + case `(ac_space=' '; set | 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 \ + -e "s/'/'\\\\''/g" \ + -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p" + ;; + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p' + ;; + esac >> confcache +if cmp -s $cache_file confcache; then + : +else + if test -w $cache_file; then + echo "updating cache $cache_file" + cat confcache > $cache_file + else + echo "not updating unwritable cache $cache_file" + fi +fi +rm -f confcache + + +# Actually configure libtool. ac_aux_dir is where install-sh is found. +CC="$CC" CFLAGS="$CFLAGS" CPPFLAGS="$CPPFLAGS" \ +LD="$LD" LDFLAGS="$LDFLAGS" LIBS="$LIBS" \ +LN_S="$LN_S" NM="$NM" RANLIB="$RANLIB" \ +DLLTOOL="$DLLTOOL" AS="$AS" OBJDUMP="$OBJDUMP" \ +${CONFIG_SHELL-/bin/sh} $ac_aux_dir/ltconfig --no-reexec \ +$libtool_flags --no-verify $ac_aux_dir/ltmain.sh $lt_target \ +|| { echo "configure: error: libtool configure failed" 1>&2; exit 1; } + +# Reload cache, that may have been modified by ltconfig +if test -r "$cache_file"; then + echo "loading cache $cache_file" + . $cache_file +else + echo "creating cache $cache_file" + > $cache_file +fi + + +# This can be used to rebuild libtool when needed +LIBTOOL_DEPS="$ac_aux_dir/ltconfig $ac_aux_dir/ltmain.sh" + +# Always use our own libtool. +LIBTOOL='$(SHELL) $(top_builddir)/libtool' + +# Redirect the config.log output again, so that the ltconfig log is not +# clobbered by the next message. +exec 5>>./config.log + + +trap '' 1 2 15 +cat > confcache <<\EOF +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs. It is not useful on other systems. +# If it contains results you don't want to keep, you may remove or edit it. +# +# By default, configure uses ./config.cache as the cache file, +# creating it if it does not exist already. You can give configure +# the --cache-file=FILE option to use a different cache file; that is +# what configure does when it calls configure scripts in +# subdirectories, so they share the cache. +# Giving --cache-file=/dev/null disables caching, for debugging configure. +# config.status only pays attention to the cache file if you give it the +# --recheck option to rerun configure. +# +EOF +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, don't put newlines in cache variables' values. +# Ultrix sh set writes to stderr and can't be redirected directly, +# and sets the high bit in the cache file unless we assign to the vars. +(set) 2>&1 | + case `(ac_space=' '; set | 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 \ + -e "s/'/'\\\\''/g" \ + -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p" + ;; + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p' + ;; + esac >> confcache +if cmp -s $cache_file confcache; then + : +else + if test -w $cache_file; then + echo "updating cache $cache_file" + cat confcache > $cache_file + else + echo "not updating unwritable cache $cache_file" + fi +fi +rm -f confcache + +trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15 + +test "x$prefix" = xNONE && prefix=$ac_default_prefix +# Let make expand exec_prefix. +test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' + +# Any assignment to VPATH causes Sun make to only execute +# the first set of double-colon rules, so remove it if not needed. +# If there is a colon in the path, we need to keep it. +if test "x$srcdir" = x.; then + ac_vpsub='/^[ ]*VPATH[ ]*=[^:]*$/d' +fi + +trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15 + +DEFS=-DHAVE_CONFIG_H + +# Without the "./", some shells look in PATH for config.status. +: ${CONFIG_STATUS=./config.status} + +echo creating $CONFIG_STATUS +rm -f $CONFIG_STATUS +cat > $CONFIG_STATUS </dev/null | sed 1q`: +# +# $0 $ac_configure_args +# +# Compiler output produced by configure, useful for debugging +# configure, is in ./config.log if it exists. + +ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]" +for ac_option +do + case "\$ac_option" in + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion" + exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;; + -version | --version | --versio | --versi | --vers | --ver | --ve | --v) + echo "$CONFIG_STATUS generated by autoconf version 2.13" + exit 0 ;; + -help | --help | --hel | --he | --h) + echo "\$ac_cs_usage"; exit 0 ;; + *) echo "\$ac_cs_usage"; exit 1 ;; + esac +done + +ac_given_srcdir=$srcdir +ac_given_INSTALL="$INSTALL" + +trap 'rm -fr `echo "unix-cc.mk:unix-cc.in unix-def.mk:unix-def.in freetype-config ftconfig.h:ftconfig.in" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15 +EOF +cat >> $CONFIG_STATUS < conftest.subs <<\\CEOF +$ac_vpsub +$extrasub +s%@SHELL@%$SHELL%g +s%@CFLAGS@%$CFLAGS%g +s%@CPPFLAGS@%$CPPFLAGS%g +s%@CXXFLAGS@%$CXXFLAGS%g +s%@FFLAGS@%$FFLAGS%g +s%@DEFS@%$DEFS%g +s%@LDFLAGS@%$LDFLAGS%g +s%@LIBS@%$LIBS%g +s%@exec_prefix@%$exec_prefix%g +s%@prefix@%$prefix%g +s%@program_transform_name@%$program_transform_name%g +s%@bindir@%$bindir%g +s%@sbindir@%$sbindir%g +s%@libexecdir@%$libexecdir%g +s%@datadir@%$datadir%g +s%@sysconfdir@%$sysconfdir%g +s%@sharedstatedir@%$sharedstatedir%g +s%@localstatedir@%$localstatedir%g +s%@libdir@%$libdir%g +s%@includedir@%$includedir%g +s%@oldincludedir@%$oldincludedir%g +s%@infodir@%$infodir%g +s%@mandir@%$mandir%g +s%@version_info@%$version_info%g +s%@host@%$host%g +s%@host_alias@%$host_alias%g +s%@host_cpu@%$host_cpu%g +s%@host_vendor@%$host_vendor%g +s%@host_os@%$host_os%g +s%@target@%$target%g +s%@target_alias@%$target_alias%g +s%@target_cpu@%$target_cpu%g +s%@target_vendor@%$target_vendor%g +s%@target_os@%$target_os%g +s%@build@%$build%g +s%@build_alias@%$build_alias%g +s%@build_cpu@%$build_cpu%g +s%@build_vendor@%$build_vendor%g +s%@build_os@%$build_os%g +s%@CC@%$CC%g +s%@CPP@%$CPP%g +s%@XX_CFLAGS@%$XX_CFLAGS%g +s%@XX_ANSIFLAGS@%$XX_ANSIFLAGS%g +s%@RMF@%$RMF%g +s%@RMDIR@%$RMDIR%g +s%@INSTALL_PROGRAM@%$INSTALL_PROGRAM%g +s%@INSTALL_SCRIPT@%$INSTALL_SCRIPT%g +s%@INSTALL_DATA@%$INSTALL_DATA%g +s%@FTSYS_SRC@%$FTSYS_SRC%g +s%@RANLIB@%$RANLIB%g +s%@LN_S@%$LN_S%g +s%@LIBTOOL@%$LIBTOOL%g + +CEOF +EOF + +cat >> $CONFIG_STATUS <<\EOF + +# Split the substitutions into bite-sized pieces for seds with +# small command number limits, like on Digital OSF/1 and HP-UX. +ac_max_sed_cmds=90 # Maximum number of lines to put in a sed script. +ac_file=1 # Number of current file. +ac_beg=1 # First line for current file. +ac_end=$ac_max_sed_cmds # Line after last line for current file. +ac_more_lines=: +ac_sed_cmds="" +while $ac_more_lines; do + if test $ac_beg -gt 1; then + sed "1,${ac_beg}d; ${ac_end}q" conftest.subs > conftest.s$ac_file + else + sed "${ac_end}q" conftest.subs > conftest.s$ac_file + fi + if test ! -s conftest.s$ac_file; then + ac_more_lines=false + rm -f conftest.s$ac_file + else + if test -z "$ac_sed_cmds"; then + ac_sed_cmds="sed -f conftest.s$ac_file" + else + ac_sed_cmds="$ac_sed_cmds | sed -f conftest.s$ac_file" + fi + ac_file=`expr $ac_file + 1` + ac_beg=$ac_end + ac_end=`expr $ac_end + $ac_max_sed_cmds` + fi +done +if test -z "$ac_sed_cmds"; then + ac_sed_cmds=cat +fi +EOF + +cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF +for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then + # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". + case "$ac_file" in + *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'` + ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; + *) ac_file_in="${ac_file}.in" ;; + esac + + # Adjust a relative srcdir, top_srcdir, and INSTALL for subdirectories. + + # Remove last slash and all that follows it. Not all systems have dirname. + ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'` + if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then + # The file is in a subdirectory. + test ! -d "$ac_dir" && mkdir "$ac_dir" + ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`" + # A "../" for each directory in $ac_dir_suffix. + ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'` + else + ac_dir_suffix= ac_dots= + fi + + case "$ac_given_srcdir" in + .) srcdir=. + if test -z "$ac_dots"; then top_srcdir=. + else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;; + /*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;; + *) # Relative path. + srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix" + top_srcdir="$ac_dots$ac_given_srcdir" ;; + esac + + case "$ac_given_INSTALL" in + [/$]*) INSTALL="$ac_given_INSTALL" ;; + *) INSTALL="$ac_dots$ac_given_INSTALL" ;; + esac + + echo creating "$ac_file" + rm -f "$ac_file" + configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure." + case "$ac_file" in + *Makefile*) ac_comsub="1i\\ +# $configure_input" ;; + *) ac_comsub= ;; + esac + + ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"` + sed -e "$ac_comsub +s%@configure_input@%$configure_input%g +s%@srcdir@%$srcdir%g +s%@top_srcdir@%$top_srcdir%g +s%@INSTALL@%$INSTALL%g +" $ac_file_inputs | (eval "$ac_sed_cmds") > $ac_file +fi; done +rm -f conftest.s* + +# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where +# NAME is the cpp macro being defined and VALUE is the value it is being given. +# +# ac_d sets the value in "#define NAME VALUE" lines. +ac_dA='s%^\([ ]*\)#\([ ]*define[ ][ ]*\)' +ac_dB='\([ ][ ]*\)[^ ]*%\1#\2' +ac_dC='\3' +ac_dD='%g' +# ac_u turns "#undef NAME" with trailing blanks into "#define NAME VALUE". +ac_uA='s%^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)' +ac_uB='\([ ]\)%\1#\2define\3' +ac_uC=' ' +ac_uD='\4%g' +# ac_e turns "#undef NAME" without trailing blanks into "#define NAME VALUE". +ac_eA='s%^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)' +ac_eB='$%\1#\2define\3' +ac_eC=' ' +ac_eD='%g' + +if test "${CONFIG_HEADERS+set}" != set; then +EOF +cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF +fi +for ac_file in .. $CONFIG_HEADERS; do if test "x$ac_file" != x..; then + # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". + case "$ac_file" in + *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'` + ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; + *) ac_file_in="${ac_file}.in" ;; + esac + + echo creating $ac_file + + rm -f conftest.frag conftest.in conftest.out + ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"` + cat $ac_file_inputs > conftest.in + +EOF + +# Transform confdefs.h into a sed script conftest.vals that substitutes +# the proper values into config.h.in to produce config.h. And first: +# Protect against being on the right side of a sed subst in config.status. +# Protect against being in an unquoted here document in config.status. +rm -f conftest.vals +cat > conftest.hdr <<\EOF +s/[\\&%]/\\&/g +s%[\\$`]%\\&%g +s%#define \([A-Za-z_][A-Za-z0-9_]*\) *\(.*\)%${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD}%gp +s%ac_d%ac_u%gp +s%ac_u%ac_e%gp +EOF +sed -n -f conftest.hdr confdefs.h > conftest.vals +rm -f conftest.hdr + +# This sed command replaces #undef with comments. This is necessary, for +# example, in the case of _POSIX_SOURCE, which is predefined and required +# on some systems where configure will not decide to define it. +cat >> conftest.vals <<\EOF +s%^[ ]*#[ ]*undef[ ][ ]*[a-zA-Z_][a-zA-Z_0-9]*%/* & */% +EOF + +# Break up conftest.vals because some shells have a limit on +# the size of here documents, and old seds have small limits too. + +rm -f conftest.tail +while : +do + ac_lines=`grep -c . conftest.vals` + # grep -c gives empty output for an empty file on some AIX systems. + if test -z "$ac_lines" || test "$ac_lines" -eq 0; then break; fi + # Write a limited-size here document to conftest.frag. + echo ' cat > conftest.frag <> $CONFIG_STATUS + sed ${ac_max_here_lines}q conftest.vals >> $CONFIG_STATUS + echo 'CEOF + sed -f conftest.frag conftest.in > conftest.out + rm -f conftest.in + mv conftest.out conftest.in +' >> $CONFIG_STATUS + sed 1,${ac_max_here_lines}d conftest.vals > conftest.tail + rm -f conftest.vals + mv conftest.tail conftest.vals +done +rm -f conftest.vals + +cat >> $CONFIG_STATUS <<\EOF + rm -f conftest.frag conftest.h + echo "/* $ac_file. Generated automatically by configure. */" > conftest.h + cat conftest.in >> conftest.h + rm -f conftest.in + if cmp -s $ac_file conftest.h 2>/dev/null; then + echo "$ac_file is unchanged" + rm -f conftest.h + else + # Remove last slash and all that follows it. Not all systems have dirname. + ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'` + if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then + # The file is in a subdirectory. + test ! -d "$ac_dir" && mkdir "$ac_dir" + fi + rm -f $ac_file + mv conftest.h $ac_file + fi +fi; done + +EOF +cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF + +exit 0 +EOF +chmod +x $CONFIG_STATUS +rm -fr confdefs* $ac_clean_files +test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1 + + Index: xc/extras/freetype2/builds/unix/configure.in diff -u /dev/null xc/extras/freetype2/builds/unix/configure.in:1.1.1.1 --- /dev/null Mon Dec 18 14:22:20 2000 +++ xc/extras/freetype2/builds/unix/configure.in Fri Dec 8 16:26:08 2000 @@ -0,0 +1,87 @@ +dnl This file is part of the FreeType project. +dnl +dnl Process this file with autoconf to produce a configure script. +dnl + +AC_INIT(ftconfig.in) + +dnl configuration file -- stay in 8.3 limit +AC_CONFIG_HEADER(ftconfig.h:ftconfig.in) + +version_info='6:1:0' +AC_SUBST(version_info) + +dnl checks for system type +AC_CANONICAL_SYSTEM + +dnl checks for programs +AC_PROG_CC +AC_PROG_CPP + +dnl get Compiler flags right. +if test "x$CC" = xgcc; then + XX_CFLAGS="-Wall" + 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) + +AC_CHECK_PROG(RMF, rm, rm -f) +AC_CHECK_PROG(RMDIR, rmdir, rmdir) + +dnl Since this file will be finally moved to another directory we make +dnl the path of the install script absolute. This small code snippet has +dnl been taken from automake's `ylwrap' script. +AC_PROG_INSTALL +case "$INSTALL" in + /*) + ;; + */*) + INSTALL="`pwd`/$INSTALL" ;; +esac + +dnl checks for header files +AC_HEADER_STDC +AC_CHECK_HEADERS(fcntl.h unistd.h) + +dnl checks for typedefs, structures, and compiler characteristics +AC_C_CONST +AC_CHECK_SIZEOF(int) +AC_CHECK_SIZEOF(long) + +dnl checks for library functions + +dnl Here we check whether we can use our mmap file component. +AC_FUNC_MMAP +if test "$ac_cv_func_mmap_fixed_mapped" != yes; then + FTSYS_SRC='$(BASE_)ftsystem.c' +else + FTSYS_SRC='$(BUILD)/ftsystem.c' + + FT_MUNMAP_DECL + FT_MUNMAP_PARAM +fi +AC_SUBST(FTSYS_SRC) + +AC_CHECK_FUNCS(memcpy memmove) + +AM_PROG_LIBTOOL + +dnl create the Unix-specific sub-Makefiles `builds/unix/unix-def.mk' +dnl and 'builds/unix/unix-cc.mk' that will be used by the build system +dnl +AC_OUTPUT(unix-cc.mk:unix-cc.in unix-def.mk:unix-def.in freetype-config) + +dnl end of configure.in Index: xc/extras/freetype2/builds/unix/detect.mk diff -u /dev/null xc/extras/freetype2/builds/unix/detect.mk:1.1.1.1 --- /dev/null Mon Dec 18 14:22:20 2000 +++ xc/extras/freetype2/builds/unix/detect.mk Fri Dec 8 16:26:08 2000 @@ -0,0 +1,71 @@ +# +# FreeType 2 configuration file to detect a UNIX host platform. +# + + +# 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. + +.PHONY: devel lcc setup unix + +ifeq ($(PLATFORM),ansi) + + has_init := $(strip $(wildcard /sbin/init)) + ifneq ($(has_init),) + + PLATFORM := unix + COPY := cp + DELETE := rm -f + + + # 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 + else + + # If `lccl' 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 + 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 + setup: unix-def.mk + unix: setup + endif + endif + + setup: std_setup + + unix-def.mk: $(TOP)/builds/unix/unix-def.in + cd builds/unix; $(USE_CFLAGS) ./configure $(CFG) + + endif # test Unix +endif # test PLATFORM + +# EOF Index: xc/extras/freetype2/builds/unix/freetype-config.in diff -u /dev/null xc/extras/freetype2/builds/unix/freetype-config.in:1.1.1.1 --- /dev/null Mon Dec 18 14:22:20 2000 +++ xc/extras/freetype2/builds/unix/freetype-config.in Fri Dec 8 16:26:08 2000 @@ -0,0 +1,90 @@ +#!/bin/sh + +prefix=@prefix@ +exec_prefix=@exec_prefix@ +exec_prefix_set=no + +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 + ;; + --prefix) + echo_prefix=yes + ;; + --exec-prefix=*) + exec_prefix=$optarg + exec_prefix_set=yes + ;; + --exec-prefix) + echo_exec_prefix=yes + ;; + --version) + echo @version_info@ + exit 0 + ;; + --cflags) + echo_cflags=yes + ;; + --libs) + echo_libs=yes + ;; + --libtool) + echo_libtool=yes + ;; + *) + usage 1 1>&2 + ;; + esac + shift +done + +if test "$exec_prefix_set" = "no"; then + exec_prefix=$prefix +fi + +if test "$echo_prefix" = "yes"; then + echo $prefix +fi +if test "$echo_exec_prefix" = "yes"; then + echo $exec_prefix +fi +if test "$echo_cflags" = "yes"; then + cflags="-I@includedir@/freetype2" + echo $cflags $includes +fi +if test "$echo_libs" = "yes"; then + libs="-lfreetype" + echo -L@libdir@ $libs +fi +if test "$echo_libtool" = "yes"; then + convlib="libfreetype.la" + echo @libdir@/$convlib +fi + +# EOF Index: xc/extras/freetype2/builds/unix/ftconfig.in diff -u /dev/null xc/extras/freetype2/builds/unix/ftconfig.in:1.1.1.1 --- /dev/null Mon Dec 18 14:22:22 2000 +++ xc/extras/freetype2/builds/unix/ftconfig.in Fri Dec 8 16:26:08 2000 @@ -0,0 +1,261 @@ +/***************************************************************************/ +/* */ +/* ftconfig.in */ +/* */ +/* UNIX-specific configuration file (specification only). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* 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__ + +#ifndef FT_BUILD_H +# define FT_BUILD_H +#endif + + + /* Include the header file containing all developer build options */ +#include FT_BUILD_H +#include FT_CONFIG_OPTIONS_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 0 +#define HAVE_FCNTL_H 0 + +#define SIZEOF_INT 2 +#define SIZEOF_LONG 2 + + +#define FT_SIZEOF_INT SIZEOF_INT +#define FT_SIZEOF_LONG SIZEOF_LONG + + + /* Preferred alignment of data */ +#define FT_ALIGNMENT 8 + + + /* 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. */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* 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 + +#if FT_SIZEOF_LONG == 8 + + /* FT_LONG64 must be defined if a 64-bit type is available */ +#define FT_LONG64 +#define FT_INT64 long + +#else + + + /*************************************************************************/ + /* */ + /* Many compilers provide the non-ANSI `long long' 64-bit type. You can */ + /* activate it by defining the FTCALC_USE_LONG_LONG macro in */ + /* `ftoption.h'. */ + /* */ + /* Note that this will produce many -ansi warnings during library */ + /* compilation, and that in many cases, the generated code will be */ + /* neither smaller nor faster! */ + /* */ +#ifdef FTCALC_USE_LONG_LONG + +#define FT_LONG64 +#define FT_INT64 long long + +#endif /* FTCALC_USE_LONG_LONG */ +#endif /* FT_SIZEOF_LONG == 8 */ + + +#ifdef FT_MAKE_OPTION_SINGLE_OBJECT + +#define FT_LOCAL static +#define FT_LOCAL_DEF static + +#else + +#ifdef __cplusplus +#define FT_LOCAL extern "C" +#define FT_LOCAL_DEF extern "C" +#else +#define FT_LOCAL extern +#define FT_LOCAL_DEF extern +#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. Note that we do this for convenience -- please */ + /* don't ask for more C++ features. */ + /* */ + + /* 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. */ + /* */ +#ifdef __cplusplus + +#define FT_CALLBACK_DEF extern "C" +#define FT_CALLBACK_TABLE extern "C" +#define FT_CALLBACK_TABLE_DEF extern "C" + +#else + +#define FT_CALLBACK_DEF static +#define FT_CALLBACK_TABLE extern +#define FT_CALLBACK_TABLE_DEF + +#endif /* __cplusplus */ + + +FT_END_HEADER + +#endif /* __FTCONFIG_H__ */ + + +/* END */ Index: xc/extras/freetype2/builds/unix/ftsystem.c diff -u /dev/null xc/extras/freetype2/builds/unix/ftsystem.c:1.1.1.1 --- /dev/null Mon Dec 18 14:22:22 2000 +++ xc/extras/freetype2/builds/unix/ftsystem.c Fri Dec 8 16:26:08 2000 @@ -0,0 +1,334 @@ +/***************************************************************************/ +/* */ +/* ftsystem.c */ +/* */ +/* Unix-specific FreeType low-level system interface (body). */ +/* */ +/* 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 +#include +#include +#include +#include +#include + +#include +#include +#include + + + /* 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 + +#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. */ + /* */ + /* */ + /* block :: 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; + } + + + /*************************************************************************/ + /* */ + /* */ + /* FT_New_Stream */ + /* */ + /* */ + /* Creates a new stream object. */ + /* */ + /* */ + /* filepathname :: The name of the stream (usually a file) to be */ + /* opened. */ + /* */ + /* stream :: A pointer to the stream object. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + FT_EXPORT_DEF( FT_Error ) FT_New_Stream( const char* filepathname, + FT_Stream stream ) + { + 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_New_Stream:" )); + FT_ERROR(( " could not open `%s'\n", filepathname )); + return FT_Err_Cannot_Open_Resource; + } + + if ( fstat( file, &stat_buf ) < 0 ) + { + FT_ERROR(( "FT_New_Stream:" )); + 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_New_Stream:" )); + 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_New_Stream:" )); + 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; + } + + + /*************************************************************************/ + /* */ + /* */ + /* FT_New_Memory */ + /* */ + /* */ + /* Creates a new memory object. */ + /* */ + /* */ + /* A pointer to the new memory object. 0 in case of error. */ + /* */ + FT_EXPORT_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; + } + + return memory; + } + + + /*************************************************************************/ + /* */ + /* */ + /* FT_Done_Memory */ + /* */ + /* */ + /* Discards memory manager. */ + /* */ + /* */ + /* memory :: A handle to the memory manager. */ + /* */ + FT_EXPORT_DEF( void ) FT_Done_Memory( FT_Memory memory ) + { + free( memory ); + } + + +/* END */ Index: xc/extras/freetype2/builds/unix/install-sh diff -u /dev/null xc/extras/freetype2/builds/unix/install-sh:1.1.1.1 --- /dev/null Mon Dec 18 14:22:23 2000 +++ xc/extras/freetype2/builds/unix/install-sh Fri Dec 8 16:26:08 2000 @@ -0,0 +1,250 @@ +#! /bin/sh +# +# install - install a program, script, or datafile +# This comes from X11R5 (mit/util/scripts/install.sh). +# +# Copyright 1991 by the Massachusetts Institute of Technology +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of M.I.T. not be used in advertising or +# publicity pertaining to distribution of the software without specific, +# written prior permission. M.I.T. makes no representations about the +# suitability of this software for any purpose. It is provided "as is" +# without express or implied warranty. +# +# Calling this script install-sh is preferred over install.sh, to prevent +# `make' implicit rules from creating a file called install from it +# when there is no Makefile. +# +# This script is compatible with the BSD install script, but was written +# from scratch. It can only install one file at a time, a restriction +# shared with many OS's install programs. + + +# set DOITPROG to echo to test this script + +# Don't use :- since 4.3BSD and earlier shells don't like it. +doit="${DOITPROG-}" + + +# put in absolute paths if you don't have them in your path; or use env. vars. + +mvprog="${MVPROG-mv}" +cpprog="${CPPROG-cp}" +chmodprog="${CHMODPROG-chmod}" +chownprog="${CHOWNPROG-chown}" +chgrpprog="${CHGRPPROG-chgrp}" +stripprog="${STRIPPROG-strip}" +rmprog="${RMPROG-rm}" +mkdirprog="${MKDIRPROG-mkdir}" + +transformbasename="" +transform_arg="" +instcmd="$mvprog" +chmodcmd="$chmodprog 0755" +chowncmd="" +chgrpcmd="" +stripcmd="" +rmcmd="$rmprog -f" +mvcmd="$mvprog" +src="" +dst="" +dir_arg="" + +while [ x"$1" != x ]; do + case $1 in + -c) instcmd="$cpprog" + shift + continue;; + + -d) dir_arg=true + shift + continue;; + + -m) chmodcmd="$chmodprog $2" + shift + shift + continue;; + + -o) chowncmd="$chownprog $2" + shift + shift + continue;; + + -g) chgrpcmd="$chgrpprog $2" + shift + shift + continue;; + + -s) stripcmd="$stripprog" + shift + continue;; + + -t=*) transformarg=`echo $1 | sed 's/-t=//'` + shift + continue;; + + -b=*) transformbasename=`echo $1 | sed 's/-b=//'` + shift + continue;; + + *) if [ x"$src" = x ] + then + src=$1 + else + # this colon is to work around a 386BSD /bin/sh bug + : + dst=$1 + fi + shift + continue;; + esac +done + +if [ x"$src" = x ] +then + echo "install: no input file specified" + exit 1 +else + true +fi + +if [ x"$dir_arg" != x ]; then + dst=$src + src="" + + if [ -d $dst ]; then + instcmd=: + else + instcmd=mkdir + fi +else + +# Waiting for this to be detected by the "$instcmd $src $dsttmp" command +# might cause directories to be created, which would be especially bad +# if $src (and thus $dsttmp) contains '*'. + + if [ -f $src -o -d $src ] + then + true + else + echo "install: $src does not exist" + exit 1 + fi + + if [ x"$dst" = x ] + then + echo "install: no destination specified" + exit 1 + else + true + fi + +# If destination is a directory, append the input filename; if your system +# does not like double slashes in filenames, you may need to add some logic + + if [ -d $dst ] + then + dst="$dst"/`basename $src` + else + true + fi +fi + +## this sed command emulates the dirname command +dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` + +# Make sure that the destination directory exists. +# this part is taken from Noah Friedman's mkinstalldirs script + +# Skip lots of stat calls in the usual case. +if [ ! -d "$dstdir" ]; then +defaultIFS=' +' +IFS="${IFS-${defaultIFS}}" + +oIFS="${IFS}" +# Some sh's can't handle IFS=/ for some reason. +IFS='%' +set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'` +IFS="${oIFS}" + +pathcomp='' + +while [ $# -ne 0 ] ; do + pathcomp="${pathcomp}${1}" + shift + + if [ ! -d "${pathcomp}" ] ; + then + $mkdirprog "${pathcomp}" + else + true + fi + + pathcomp="${pathcomp}/" +done +fi + +if [ x"$dir_arg" != x ] +then + $doit $instcmd $dst && + + if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi && + if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi && + if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi && + if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi +else + +# If we're going to rename the final executable, determine the name now. + + if [ x"$transformarg" = x ] + then + dstfile=`basename $dst` + else + dstfile=`basename $dst $transformbasename | + sed $transformarg`$transformbasename + fi + +# don't allow the sed command to completely eliminate the filename + + if [ x"$dstfile" = x ] + then + dstfile=`basename $dst` + else + true + fi + +# Make a temp file name in the proper directory. + + dsttmp=$dstdir/#inst.$$# + +# Move or copy the file name to the temp name + + $doit $instcmd $src $dsttmp && + + trap "rm -f ${dsttmp}" 0 && + +# and set any options; do chmod last to preserve setuid bits + +# If any of these fail, we abort the whole thing. If we want to +# ignore errors from any of these, just make sure not to ignore +# errors from the above "$doit $instcmd $src $dsttmp" command. + + if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi && + if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi && + if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi && + if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi && + +# Now rename the file to the real destination. + + $doit $rmcmd -f $dstdir/$dstfile && + $doit $mvcmd $dsttmp $dstdir/$dstfile + +fi && + + +exit 0 Index: xc/extras/freetype2/builds/unix/install.mk diff -u /dev/null xc/extras/freetype2/builds/unix/install.mk:1.1.1.1 --- /dev/null Mon Dec 18 14:22:23 2000 +++ xc/extras/freetype2/builds/unix/install.mk Fri Dec 8 16:26:08 2000 @@ -0,0 +1,67 @@ +# +# FreeType 2 installation instructions for Unix systems +# + + +# Copyright 1996-2000 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +# Unix installation and deinstallation targets. +install: $(PROJECT_LIBRARY) + $(MKINSTALLDIRS) $(libdir) \ + $(includedir)/freetype2/freetype/config \ + $(includedir)/freetype2/freetype/internal \ + $(includedir)/freetype2/freetype/cache \ + $(bindir) + $(LIBTOOL) --mode=install $(INSTALL) $(PROJECT_LIBRARY) $(libdir) + -for P in $(PUBLIC_H) ; do \ + $(INSTALL_DATA) $$P $(includedir)/freetype2/freetype ; \ + done + -for P in $(BASE_H) ; do \ + $(INSTALL_DATA) $$P $(includedir)/freetype2/freetype/internal ; \ + done + -for P in $(CONFIG_H) ; do \ + $(INSTALL_DATA) $$P $(includedir)/freetype2/freetype/config ; \ + done + -for P in $(CACHE_H) ; do \ + $(INSTALL_DATA) $$P $(includedir)/freetype2/freetype/cache ; \ + done + $(INSTALL_SCRIPT) -m 755 $(BUILD)/freetype-config \ + $(bindir)/freetype-config + + +uninstall: + -$(LIBTOOL) --mode=uninstall $(RM) $(libdir)/$(PROJECT_LIBRARY) + -$(DELETE) $(includedir)/freetype2/freetype/cache/* + -$(DELDIR) $(includedir)/freetype2/freetype/cache + -$(DELETE) $(includedir)/freetype2/freetype/config/* + -$(DELDIR) $(includedir)/freetype2/freetype/config + -$(DELETE) $(includedir)/freetype2/freetype/internal/* + -$(DELDIR) $(includedir)/freetype2/freetype/internal + -$(DELETE) $(includedir)/freetype2/freetype/* + -$(DELDIR) $(includedir)/freetype2/freetype + -$(DELDIR) $(includedir)/freetype2 + -$(DELETE) $(bindir)/freetype-config + + +# 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 Index: xc/extras/freetype2/builds/unix/ltconfig diff -u /dev/null xc/extras/freetype2/builds/unix/ltconfig:1.1.1.1 --- /dev/null Mon Dec 18 14:22:23 2000 +++ xc/extras/freetype2/builds/unix/ltconfig Fri Dec 8 16:26:08 2000 @@ -0,0 +1,3114 @@ +#! /bin/sh + +# ltconfig - Create a system-specific libtool. +# Copyright (C) 1996-1999 Free Software Foundation, Inc. +# Originally by Gordon Matzigkeit , 1996 +# +# This file is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# A lot of this script is taken from autoconf-2.10. + +# Check that we are running under the correct shell. +SHELL=${CONFIG_SHELL-/bin/sh} +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`} + case X$UNAME in + *-DOS) PATH_SEPARATOR=';' ;; + *) PATH_SEPARATOR=':' ;; + esac +fi + +# 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 + +if test "X${echo_test_string+set}" != Xset; then + # find a string as large as possible, as long as the shell can cope with it + for cmd in 'sed 50q "$0"' 'sed 20q "$0"' 'sed 10q "$0"' 'sed 2q "$0"' 'echo test'; do + # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ... + if (echo_test_string="`eval $cmd`") 2>/dev/null && + echo_test_string="`eval $cmd`" && + (test "X$echo_test_string" = "X$echo_test_string") 2>/dev/null; then + break + fi + done +fi + +if test "X`($echo '\t') 2>/dev/null`" != 'X\t' || + test "X`($echo "$echo_test_string") 2>/dev/null`" != X"$echo_test_string"; then + # 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="${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' && + test "X`($dir/echo "$echo_test_string") 2>/dev/null`" = 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' && + test "X`(print -r "$echo_test_string") 2>/dev/null`" = 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 ltconfig 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' && + test "X`($echo "$echo_test_string") 2>/dev/null`" = X"$echo_test_string"; then + # Cool, printf works + : + elif test "X`("$ORIGINAL_CONFIG_SHELL" "$0" --fallback-echo '\t') 2>/dev/null`" = 'X\t' && + test "X`("$ORIGINAL_CONFIG_SHELL" "$0" --fallback-echo "$echo_test_string") 2>/dev/null`" = 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 test "X`("$CONFIG_SHELL" "$0" --fallback-echo '\t') 2>/dev/null`" = 'X\t' && + test "X`("$CONFIG_SHELL" "$0" --fallback-echo "$echo_test_string") 2>/dev/null`" = 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}" "$0" ${1+"$@"} + else + # Oops. We lost completely, so just stick with echo. + echo=echo + fi + fi + fi + fi +fi + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +Xsed='sed -e s/^X//' +sed_quote_subst='s/\([\\"\\`$\\\\]\)/\\\1/g' + +# Same as above, but do not quote variable references. +double_quote_subst='s/\([\\"\\`\\\\]\)/\\\1/g' + +# Sed substitution to delay expansion of an escaped shell variable in a +# double_quote_subst'ed string. +delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' + +# The name of this program. +progname=`$echo "X$0" | $Xsed -e 's%^.*/%%'` + +# Constants: +PROGRAM=ltconfig +PACKAGE=libtool +VERSION=1.3.5 +TIMESTAMP=" (1.385.2.206 2000/05/27 11:12:27)" +ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' +ac_link='${CC-cc} -o conftest $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' +rm="rm -f" + +help="Try \`$progname --help' for more information." + +# Global variables: +default_ofile=libtool +can_build_shared=yes +enable_shared=yes +# All known linkers require a `.a' archive for static linking (except M$VC, +# which needs '.lib'). +enable_static=yes +enable_fast_install=yes +enable_dlopen=unknown +enable_win32_dll=no +ltmain= +silent= +srcdir= +ac_config_guess= +ac_config_sub= +host= +nonopt= +ofile="$default_ofile" +verify_host=yes +with_gcc=no +with_gnu_ld=no +need_locks=yes +ac_ext=c +objext=o +libext=a +exeext= +cache_file= + +old_AR="$AR" +old_CC="$CC" +old_CFLAGS="$CFLAGS" +old_CPPFLAGS="$CPPFLAGS" +old_LDFLAGS="$LDFLAGS" +old_LD="$LD" +old_LN_S="$LN_S" +old_LIBS="$LIBS" +old_NM="$NM" +old_RANLIB="$RANLIB" +old_DLLTOOL="$DLLTOOL" +old_OBJDUMP="$OBJDUMP" +old_AS="$AS" + +# Parse the command line options. +args= +prev= +for option +do + case "$option" in + -*=*) optarg=`echo "$option" | sed 's/[-_a-zA-Z0-9]*=//'` ;; + *) optarg= ;; + esac + + # If the previous option needs an argument, assign it. + if test -n "$prev"; then + eval "$prev=\$option" + prev= + continue + fi + + case "$option" in + --help) cat <&2 + echo "$help" 1>&2 + exit 1 + ;; + + *) + if test -z "$ltmain"; then + ltmain="$option" + elif test -z "$host"; then +# This generates an unnecessary warning for sparc-sun-solaris4.1.3_U1 +# if test -n "`echo $option| sed 's/[-a-z0-9.]//g'`"; then +# echo "$progname: warning \`$option' is not a valid host type" 1>&2 +# fi + host="$option" + else + echo "$progname: too many arguments" 1>&2 + echo "$help" 1>&2 + exit 1 + fi ;; + esac +done + +if test -z "$ltmain"; then + echo "$progname: you must specify a LTMAIN file" 1>&2 + echo "$help" 1>&2 + exit 1 +fi + +if test ! -f "$ltmain"; then + echo "$progname: \`$ltmain' does not exist" 1>&2 + echo "$help" 1>&2 + exit 1 +fi + +# Quote any args containing shell metacharacters. +ltconfig_args= +for arg +do + case "$arg" in + *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*) + ltconfig_args="$ltconfig_args '$arg'" ;; + *) ltconfig_args="$ltconfig_args $arg" ;; + esac +done + +# A relevant subset of AC_INIT. + +# File descriptor usage: +# 0 standard input +# 1 file creation +# 2 errors and warnings +# 3 some systems may open it to /dev/tty +# 4 used on the Kubota Titan +# 5 compiler messages saved in config.log +# 6 checking for... messages and results +if test "$silent" = yes; then + exec 6>/dev/null +else + exec 6>&1 +fi +exec 5>>./config.log + +# NLS nuisances. +# Only set LANG and LC_ALL to C if already set. +# These must not be set unconditionally because not all systems understand +# e.g. LANG=C (notably SCO). +if test "X${LC_ALL+set}" = Xset; then LC_ALL=C; export LC_ALL; fi +if test "X${LANG+set}" = Xset; then LANG=C; export LANG; fi + +if test -n "$cache_file" && test -r "$cache_file"; then + echo "loading cache $cache_file within ltconfig" + . $cache_file +fi + +if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then + # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu. + if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then + ac_n= ac_c=' +' ac_t=' ' + else + ac_n=-n ac_c= ac_t= + fi +else + ac_n= ac_c='\c' ac_t= +fi + +if test -z "$srcdir"; then + # Assume the source directory is the same one as the path to LTMAIN. + srcdir=`$echo "X$ltmain" | $Xsed -e 's%/[^/]*$%%'` + test "$srcdir" = "$ltmain" && srcdir=. +fi + +trap "$rm conftest*; exit 1" 1 2 15 +if test "$verify_host" = yes; then + # Check for config.guess and config.sub. + ac_aux_dir= + for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do + if test -f $ac_dir/config.guess; then + ac_aux_dir=$ac_dir + break + fi + done + if test -z "$ac_aux_dir"; then + echo "$progname: cannot find config.guess in $srcdir $srcdir/.. $srcdir/../.." 1>&2 + echo "$help" 1>&2 + exit 1 + fi + ac_config_guess=$ac_aux_dir/config.guess + ac_config_sub=$ac_aux_dir/config.sub + + # Make sure we can run config.sub. + if $SHELL $ac_config_sub sun4 >/dev/null 2>&1; then : + else + echo "$progname: cannot run $ac_config_sub" 1>&2 + echo "$help" 1>&2 + exit 1 + fi + + echo $ac_n "checking host system type""... $ac_c" 1>&6 + + host_alias=$host + case "$host_alias" in + "") + if host_alias=`$SHELL $ac_config_guess`; then : + else + echo "$progname: cannot guess host type; you must specify one" 1>&2 + echo "$help" 1>&2 + exit 1 + fi ;; + esac + host=`$SHELL $ac_config_sub $host_alias` + echo "$ac_t$host" 1>&6 + + # Make sure the host verified. + test -z "$host" && exit 1 + +elif test -z "$host"; then + echo "$progname: you must specify a host type if you use \`--no-verify'" 1>&2 + echo "$help" 1>&2 + exit 1 +else + host_alias=$host +fi + +# Transform linux* to *-*-linux-gnu*, to support old configure scripts. +case "$host_os" in +linux-gnu*) ;; +linux*) host=`echo $host | sed 's/^\(.*-.*-linux\)\(.*\)$/\1-gnu\2/'` +esac + +host_cpu=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` +host_vendor=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` +host_os=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` + +case "$host_os" in +aix3*) + # AIX sometimes has problems with the GCC collect2 program. For some + # reason, if we set the COLLECT_NAMES environment variable, the problems + # vanish in a puff of smoke. + if test "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 cru $oldlib$oldobjs' +old_postinstall_cmds='chmod 644 $oldlib' +old_postuninstall_cmds= + +# Set a sane default for `AR'. +test -z "$AR" && AR=ar + +# Set a sane default for `OBJDUMP'. +test -z "$OBJDUMP" && OBJDUMP=objdump + +# If RANLIB is not set, then run the test. +if test "${RANLIB+set}" != "set"; then + result=no + + echo $ac_n "checking for ranlib... $ac_c" 1>&6 + IFS="${IFS= }"; save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR}" + for dir in $PATH; do + test -z "$dir" && dir=. + if test -f $dir/ranlib || test -f $dir/ranlib$ac_exeext; then + RANLIB="ranlib" + result="ranlib" + break + fi + done + IFS="$save_ifs" + + echo "$ac_t$result" 1>&6 +fi + +if test -n "$RANLIB"; then + old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" + old_postinstall_cmds="\$RANLIB \$oldlib~$old_postinstall_cmds" +fi + +# Set sane defaults for `DLLTOOL', `OBJDUMP', and `AS', used on cygwin. +test -z "$DLLTOOL" && DLLTOOL=dlltool +test -z "$OBJDUMP" && OBJDUMP=objdump +test -z "$AS" && AS=as + +# Check to see if we are using GCC. +if test "$with_gcc" != yes || test -z "$CC"; then + # If CC is not set, then try to find GCC or a usable CC. + if test -z "$CC"; then + echo $ac_n "checking for gcc... $ac_c" 1>&6 + IFS="${IFS= }"; save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR}" + for dir in $PATH; do + test -z "$dir" && dir=. + if test -f $dir/gcc || test -f $dir/gcc$ac_exeext; then + CC="gcc" + break + fi + done + IFS="$save_ifs" + + if test -n "$CC"; then + echo "$ac_t$CC" 1>&6 + else + echo "$ac_t"no 1>&6 + fi + fi + + # Not "gcc", so try "cc", rejecting "/usr/ucb/cc". + if test -z "$CC"; then + echo $ac_n "checking for cc... $ac_c" 1>&6 + IFS="${IFS= }"; save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR}" + cc_rejected=no + for dir in $PATH; do + test -z "$dir" && dir=. + if test -f $dir/cc || test -f $dir/cc$ac_exeext; then + if test "$dir/cc" = "/usr/ucb/cc"; then + cc_rejected=yes + continue + fi + CC="cc" + break + fi + done + IFS="$save_ifs" + if test $cc_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $CC + shift + if test $# -gt 0; then + # We chose a different compiler from the bogus one. + # However, it has the same name, so the bogon will be chosen + # first if we set CC to just the name; use the full file name. + shift + set dummy "$dir/cc" "$@" + shift + CC="$@" + fi + fi + + if test -n "$CC"; then + echo "$ac_t$CC" 1>&6 + else + echo "$ac_t"no 1>&6 + fi + + if test -z "$CC"; then + echo "$progname: error: no acceptable cc found in \$PATH" 1>&2 + exit 1 + fi + fi + + # Now see if the compiler is really GCC. + with_gcc=no + echo $ac_n "checking whether we are using GNU C... $ac_c" 1>&6 + echo "$progname:581: checking whether we are using GNU C" >&5 + + $rm conftest.c + cat > conftest.c <&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then + with_gcc=yes + fi + $rm conftest.c + echo "$ac_t$with_gcc" 1>&6 +fi + +# Allow CC to be a program name with arguments. +set dummy $CC +compiler="$2" + +echo $ac_n "checking for object suffix... $ac_c" 1>&6 +$rm conftest* +echo 'int i = 1;' > conftest.c +echo "$progname:603: checking for object suffix" >& 5 +if { (eval echo $progname:604: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>conftest.err; }; then + # Append any warnings to the config.log. + cat conftest.err 1>&5 + + for ac_file in conftest.*; do + case $ac_file in + *.c) ;; + *) objext=`echo $ac_file | sed -e s/conftest.//` ;; + esac + done +else + cat conftest.err 1>&5 + echo "$progname: failed program was:" >&5 + cat conftest.c >&5 +fi +$rm conftest* +echo "$ac_t$objext" 1>&6 + +echo $ac_n "checking for executable suffix... $ac_c" 1>&6 +if eval "test \"`echo '$''{'ac_cv_exeext'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + ac_cv_exeext="no" + $rm conftest* + echo 'main () { return 0; }' > conftest.c + echo "$progname:629: checking for executable suffix" >& 5 + if { (eval echo $progname:630: \"$ac_link\") 1>&5; (eval $ac_link) 2>conftest.err; }; then + # Append any warnings to the config.log. + cat conftest.err 1>&5 + + for ac_file in conftest.*; do + case $ac_file in + *.c | *.err | *.$objext ) ;; + *) ac_cv_exeext=.`echo $ac_file | sed -e s/conftest.//` ;; + esac + done + else + cat conftest.err 1>&5 + echo "$progname: failed program was:" >&5 + cat conftest.c >&5 + fi + $rm conftest* +fi +if test "X$ac_cv_exeext" = Xno; then + exeext="" +else + exeext="$ac_cv_exeext" +fi +echo "$ac_t$ac_cv_exeext" 1>&6 + +echo $ac_n "checking for $compiler option to produce PIC... $ac_c" 1>&6 +pic_flag= +special_shlib_compile_flags= +wl= +link_static_flag= +no_builtin_flag= + +if test "$with_gcc" = yes; then + wl='-Wl,' + link_static_flag='-static' + + case "$host_os" in + beos* | irix5* | irix6* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + 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 + # we not sure about C++ programs. + link_static_flag="$link_static_flag ${wl}-lC" + ;; + cygwin* | mingw* | os2*) + # We can build DLLs from non-PIC. + ;; + amigaos*) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + pic_flag='-m68020 -resident32 -malways-restore-a4' + ;; + sysv4*MP*) + if test -d /usr/nec; then + pic_flag=-Kconform_pic + fi + ;; + *) + pic_flag='-fPIC' + ;; + esac +else + # PORTME Check for PIC flags for the system compiler. + case "$host_os" in + aix3* | aix4*) + # All AIX code is PIC. + link_static_flag='-bnso -bI:/lib/syscalls.exp' + ;; + + hpux9* | hpux10* | hpux11*) + # Is there a better link_static_flag that works with the bundled CC? + wl='-Wl,' + link_static_flag="${wl}-a ${wl}archive" + pic_flag='+Z' + ;; + + irix5* | irix6*) + wl='-Wl,' + link_static_flag='-non_shared' + # PIC (with -KPIC) is the default. + ;; + + cygwin* | mingw* | os2*) + # We can build DLLs from non-PIC. + ;; + + osf3* | osf4* | osf5*) + # All OSF/1 code is PIC. + wl='-Wl,' + link_static_flag='-non_shared' + ;; + + sco3.2v5*) + pic_flag='-Kpic' + link_static_flag='-dn' + special_shlib_compile_flags='-belf' + ;; + + solaris*) + pic_flag='-KPIC' + link_static_flag='-Bstatic' + wl='-Wl,' + ;; + + sunos4*) + pic_flag='-PIC' + link_static_flag='-Bstatic' + wl='-Qoption ld ' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + pic_flag='-KPIC' + link_static_flag='-Bstatic' + wl='-Wl,' + ;; + + uts4*) + pic_flag='-pic' + link_static_flag='-Bstatic' + ;; + sysv4*MP*) + if test -d /usr/nec ;then + pic_flag='-Kconform_pic' + link_static_flag='-Bstatic' + fi + ;; + *) + can_build_shared=no + ;; + esac +fi + +if test -n "$pic_flag"; then + echo "$ac_t$pic_flag" 1>&6 + + # Check to make sure the pic_flag actually works. + echo $ac_n "checking if $compiler PIC flag $pic_flag works... $ac_c" 1>&6 + $rm conftest* + echo "int some_variable = 0;" > conftest.c + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $pic_flag -DPIC" + echo "$progname:776: checking if $compiler PIC flag $pic_flag works" >&5 + if { (eval echo $progname:777: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>conftest.err; } && test -s conftest.$objext; then + # Append any warnings to the config.log. + cat conftest.err 1>&5 + + 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 + echo "$ac_t"no 1>&6 + can_build_shared=no + pic_flag= + else + echo "$ac_t"yes 1>&6 + pic_flag=" $pic_flag" + fi + ;; + *) + echo "$ac_t"yes 1>&6 + pic_flag=" $pic_flag" + ;; + esac + else + # Append any errors to the config.log. + cat conftest.err 1>&5 + can_build_shared=no + pic_flag= + echo "$ac_t"no 1>&6 + fi + CFLAGS="$save_CFLAGS" + $rm conftest* +else + echo "$ac_t"none 1>&6 +fi + +# Check to see if options -o and -c are simultaneously supported by compiler +echo $ac_n "checking if $compiler supports -c -o file.o... $ac_c" 1>&6 +$rm -r conftest 2>/dev/null +mkdir conftest +cd conftest +$rm conftest* +echo "int some_variable = 0;" > conftest.c +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.o" +echo "$progname:829: checking if $compiler supports -c -o file.o" >&5 +if { (eval echo $progname:830: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>out/conftest.err; } && test -s out/conftest2.o; 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 + echo "$ac_t"no 1>&6 + compiler_c_o=no + else + echo "$ac_t"yes 1>&6 + compiler_c_o=yes + fi +else + # Append any errors to the config.log. + cat out/conftest.err 1>&5 + compiler_c_o=no + echo "$ac_t"no 1>&6 +fi +CFLAGS="$save_CFLAGS" +chmod u+w . +$rm conftest* out/* +rmdir out +cd .. +rmdir conftest +$rm -r conftest 2>/dev/null + +if test x"$compiler_c_o" = x"yes"; then + # Check to see if we can write to a .lo + echo $ac_n "checking if $compiler supports -c -o file.lo... $ac_c" 1>&6 + $rm conftest* + echo "int some_variable = 0;" > conftest.c + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -c -o conftest.lo" + echo "$progname:862: checking if $compiler supports -c -o file.lo" >&5 +if { (eval echo $progname:863: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>conftest.err; } && test -s conftest.lo; 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 + echo "$ac_t"no 1>&6 + compiler_o_lo=no + else + echo "$ac_t"yes 1>&6 + compiler_o_lo=yes + fi + else + # Append any errors to the config.log. + cat conftest.err 1>&5 + compiler_o_lo=no + echo "$ac_t"no 1>&6 + fi + CFLAGS="$save_CFLAGS" + $rm conftest* +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 $ac_n "checking if we can lock with hard links... $ac_c" 1>&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 "$ac_t$hard_links" 1>&6 + $rm conftest* + if test "$hard_links" = no; then + echo "*** 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 "$with_gcc" = yes; then + # Check to see if options -fno-rtti -fno-exceptions are supported by compiler + echo $ac_n "checking if $compiler supports -fno-rtti -fno-exceptions ... $ac_c" 1>&6 + $rm conftest* + echo "int some_variable = 0;" > conftest.c + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -fno-rtti -fno-exceptions -c conftest.c" + echo "$progname:914: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 + if { (eval echo $progname:915: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>conftest.err; } && test -s conftest.o; 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 + echo "$ac_t"no 1>&6 + compiler_rtti_exceptions=no + else + echo "$ac_t"yes 1>&6 + compiler_rtti_exceptions=yes + fi + else + # Append any errors to the config.log. + cat conftest.err 1>&5 + compiler_rtti_exceptions=no + echo "$ac_t"no 1>&6 + fi + CFLAGS="$save_CFLAGS" + $rm conftest* + + if test "$compiler_rtti_exceptions" = "yes"; then + no_builtin_flag=' -fno-builtin -fno-rtti -fno-exceptions' + else + no_builtin_flag=' -fno-builtin' + fi + +fi + +# Check for any special shared library compilation flags. +if test -n "$special_shlib_compile_flags"; then + echo "$progname: warning: \`$CC' requires \`$special_shlib_compile_flags' to build shared libraries" 1>&2 + if echo "$old_CC $old_CFLAGS " | egrep -e "[ ]$special_shlib_compile_flags[ ]" >/dev/null; then : + else + echo "$progname: add \`$special_shlib_compile_flags' to the CC or CFLAGS env variable and reconfigure" 1>&2 + can_build_shared=no + fi +fi + +echo $ac_n "checking if $compiler static flag $link_static_flag works... $ac_c" 1>&6 +$rm conftest* +echo 'main(){return(0);}' > conftest.c +save_LDFLAGS="$LDFLAGS" +LDFLAGS="$LDFLAGS $link_static_flag" +echo "$progname:958: checking if $compiler static flag $link_static_flag works" >&5 +if { (eval echo $progname:959: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then + echo "$ac_t$link_static_flag" 1>&6 +else + echo "$ac_t"none 1>&6 + link_static_flag= +fi +LDFLAGS="$save_LDFLAGS" +$rm conftest* + +if test -z "$LN_S"; then + # Check to see if we can use ln -s, or we need hard links. + echo $ac_n "checking whether ln -s works... $ac_c" 1>&6 + $rm conftest.dat + if ln -s X conftest.dat 2>/dev/null; then + $rm conftest.dat + LN_S="ln -s" + else + LN_S=ln + fi + if test "$LN_S" = "ln -s"; then + echo "$ac_t"yes 1>&6 + else + echo "$ac_t"no 1>&6 + fi +fi + +# Make sure LD is an absolute path. +if test -z "$LD"; then + ac_prog=ld + if test "$with_gcc" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + echo $ac_n "checking for ld used by GCC... $ac_c" 1>&6 + echo "$progname:991: checking for ld used by GCC" >&5 + ac_prog=`($CC -print-prog-name=ld) 2>&5` + case "$ac_prog" in + # Accept absolute paths. + [\\/]* | [A-Za-z]:[\\/]*) + 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 are not using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac + elif test "$with_gnu_ld" = yes; then + echo $ac_n "checking for GNU ld... $ac_c" 1>&6 + echo "$progname:1015: checking for GNU ld" >&5 + else + echo $ac_n "checking for non-GNU ld""... $ac_c" 1>&6 + echo "$progname:1018: checking for non-GNU ld" >&5 + fi + + if test -z "$LD"; then + IFS="${IFS= }"; ac_save_ifs="$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 + LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some GNU ld's only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + if "$LD" -v 2>&1 < /dev/null | egrep '(GNU|with BFD)' > /dev/null; then + test "$with_gnu_ld" != no && break + else + test "$with_gnu_ld" != yes && break + fi + fi + done + IFS="$ac_save_ifs" + fi + + if test -n "$LD"; then + echo "$ac_t$LD" 1>&6 + else + echo "$ac_t"no 1>&6 + fi + + if test -z "$LD"; then + echo "$progname: error: no acceptable ld found in \$PATH" 1>&2 + exit 1 + fi +fi + +# Check to see if it really is or is not GNU ld. +echo $ac_n "checking if the linker ($LD) is GNU ld... $ac_c" 1>&6 +# I'd rather use --version here, but apparently some GNU ld's only accept -v. +if $LD -v 2>&1 &5; then + with_gnu_ld=yes +else + with_gnu_ld=no +fi +echo "$ac_t$with_gnu_ld" 1>&6 + +# See if the linker supports building shared libraries. +echo $ac_n "checking whether the linker ($LD) supports shared libraries... $ac_c" 1>&6 + +allow_undefined_flag= +no_undefined_flag= +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= +export_dynamic_flag_spec= +whole_archive_flag_spec= +thread_safe_flag_spec= +hardcode_libdir_flag_spec= +hardcode_libdir_separator= +hardcode_direct=no +hardcode_minus_L=no +hardcode_shlibpath_var=unsupported +runpath_var= +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. + +case "$host_os" in +cygwin* | mingw*) + # 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 "$with_gcc" != yes; then + with_gnu_ld=no + fi + ;; + +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*) + # On AIX, the GNU linker is very broken + 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 $objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $objdir/a2ixlibrary.data~$AR cru $lib $libobjs~$RANLIB $lib~(cd $objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + + # 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 $linkopts ${wl}-soname $wl$soname -o $lib' + else + ld_shlibs=no + fi + ;; + + cygwin* | mingw*) + # 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 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 by newer dlltools. + export_symbols_cmds='test -f $objdir/$soname-ltdll.c || sed -e "/^# \/\* ltdll\.c starts here \*\//,/^# \/\* ltdll.c ends here \*\// { s/^# //; p; }" -e d < $0 > $objdir/$soname-ltdll.c~ + test -f $objdir/$soname-ltdll.$objext || (cd $objdir && $CC -c $soname-ltdll.c)~ + $DLLTOOL --export-all --exclude-symbols DllMain@12,_cygwin_dll_entry@12,_cygwin_noncygwin_dll_entry@12 --output-def $objdir/$soname-def $objdir/$soname-ltdll.$objext $libobjs $convenience~ + sed -e "1,/EXPORTS/d" -e "s/ @ [0-9]*//" -e "s/ *;.*$//" < $objdir/$soname-def > $export_symbols' + + # If DATA tags from a recent dlltool are present, honour them! + archive_expsym_cmds='echo EXPORTS > $objdir/$soname-def~ + _lt_hint=1; + cat $export_symbols | while read symbol; do + set dummy \$symbol; + case \$# in + 2) echo " \$2 @ \$_lt_hint ; " >> $objdir/$soname-def;; + *) echo " \$2 @ \$_lt_hint \$3 ; " >> $objdir/$soname-def;; + esac; + _lt_hint=`expr 1 + \$_lt_hint`; + done~ + test -f $objdir/$soname-ltdll.c || sed -e "/^# \/\* ltdll\.c starts here \*\//,/^# \/\* ltdll.c ends here \*\// { s/^# //; p; }" -e d < $0 > $objdir/$soname-ltdll.c~ + test -f $objdir/$soname-ltdll.$objext || (cd $objdir && $CC -c $soname-ltdll.c)~ + $CC -Wl,--base-file,$objdir/$soname-base -Wl,--dll -nostartfiles -Wl,-e,__cygwin_dll_entry@12 -o $lib $objdir/$soname-ltdll.$objext $libobjs $deplibs $linkopts~ + $DLLTOOL --as=$AS --dllname $soname --exclude-symbols DllMain@12,_cygwin_dll_entry@12,_cygwin_noncygwin_dll_entry@12 --def $objdir/$soname-def --base-file $objdir/$soname-base --output-exp $objdir/$soname-exp~ + $CC -Wl,--base-file,$objdir/$soname-base $objdir/$soname-exp -Wl,--dll -nostartfiles -Wl,-e,__cygwin_dll_entry@12 -o $lib $objdir/$soname-ltdll.$objext $libobjs $deplibs $linkopts~ + $DLLTOOL --as=$AS --dllname $soname --exclude-symbols DllMain@12,_cygwin_dll_entry@12,_cygwin_noncygwin_dll_entry@12 --def $objdir/$soname-def --base-file $objdir/$soname-base --output-exp $objdir/$soname-exp~ + $CC $objdir/$soname-exp -Wl,--dll -nostartfiles -Wl,-e,__cygwin_dll_entry@12 -o $lib $objdir/$soname-ltdll.$objext $libobjs $deplibs $linkopts' + + old_archive_from_new_cmds='$DLLTOOL --as=$AS --dllname $soname --def $objdir/$soname-def --output-lib $objdir/$libname.a' + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + archive_cmds='$CC -shared $libobjs $deplibs $linkopts ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $linkopts ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + archive_cmds='$LD -Bshareable $libobjs $deplibs $linkopts -o $lib' + # can we support soname and/or expsyms with a.out? -oliva + 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 $linkopts ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $linkopts ${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 $linkopts' + 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 $linkopts ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $linkopts ${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*) + # 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 $objdir/$soname $libobjs $deplibs $linkopts -bE:$export_symbols -T512 -H512 -bM:SRE~$AR cru $lib $objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + hardcode_minus_L=yes + if test "$with_gcc" = yes && test -z "$link_static_flag"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + hardcode_direct=unsupported + fi + ;; + + aix4*) + hardcode_libdir_flag_spec='${wl}-b ${wl}nolibpath ${wl}-b ${wl}libpath:$libdir:/usr/lib:/lib' + hardcode_libdir_separator=':' + if test "$with_gcc" = yes; then + 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 + shared_flag='-shared' + else + shared_flag='${wl}-bM:SRE' + hardcode_direct=yes + fi + allow_undefined_flag=' ${wl}-berok' + archive_cmds="\$CC $shared_flag"' -o $objdir/$soname $libobjs $deplibs $linkopts ${wl}-bexpall ${wl}-bnoentry${allow_undefined_flag}' + archive_expsym_cmds="\$CC $shared_flag"' -o $objdir/$soname $libobjs $deplibs $linkopts ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}' + case "$host_os" in aix4.[01]|aix4.[01].*) + # According to Greg Wooledge, -bexpall is only supported from AIX 4.2 on + always_export_symbols=yes ;; + esac + ;; + + amigaos*) + archive_cmds='$rm $objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $objdir/a2ixlibrary.data~$AR cru $lib $libobjs~$RANLIB $lib~(cd $objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + # see comment about different semantics on the GNU ld section + ld_shlibs=no + ;; + + cygwin* | mingw*) + # 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 $linkopts `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' + fix_srcfile_path='`cygpath -w $srcfile`' + ;; + + 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 $linkopts /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 $linkopts' + 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 $linkopts' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + hpux9* | hpux10* | hpux11*) + case "$host_os" in + hpux9*) archive_cmds='$rm $objdir/$soname~$LD -b +b $install_libdir -o $objdir/$soname $libobjs $deplibs $linkopts~test $objdir/$soname = $lib || mv $objdir/$soname $lib' ;; + *) archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linkopts' ;; + 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*) + if test "$with_gcc" = yes; then + archive_cmds='$CC -shared $libobjs $deplibs $linkopts ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + archive_cmds='$LD -shared $libobjs $deplibs $linkopts -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=: + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linkopts' # a.out + else + archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linkopts' # ELF + fi + hardcode_libdir_flag_spec='${wl}-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + openbsd*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linkopts' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + os2*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + allow_undefined_flag=unsupported + archive_cmds='$echo "LIBRARY $libname INITINSTANCE" > $objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $objdir/$libname.def~$echo DATA >> $objdir/$libname.def~$echo " SINGLE NONSHARED" >> $objdir/$libname.def~$echo EXPORTS >> $objdir/$libname.def~emxexp $libobjs >> $objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $linkopts $objdir/$libname.def' + old_archive_from_new_cmds='emximp -o $objdir/$libname.a $objdir/$libname.def' + ;; + + osf3*) + if test "$with_gcc" = yes; then + allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $linkopts ${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 $linkopts -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 the -msym flag + if test "$with_gcc" = yes; then + allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $linkopts ${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' + else + allow_undefined_flag=' -expect_unresolved \*' + archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linkopts -msym -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=: + ;; + rhapsody*) + archive_cmds='$CC -bundle -undefined suppress -o $lib $libobjs $deplibs $linkopts' + hardcode_libdir_flags_spec='-L$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + sco3.2v5*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linkopts' + hardcode_shlibpath_var=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + ;; + + solaris*) + 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 $linkopts' + 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 $linkopts~$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 + ;; + + sunos4*) + archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linkopts' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_direct=yes + hardcode_minus_L=yes + hardcode_shlibpath_var=no + ;; + + sysv4) + 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 $linkopts' + else + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linkopts' + fi + runpath_var='LD_RUN_PATH' + hardcode_shlibpath_var=no + hardcode_direct=no #Motorola manual says yes, but my tests say they lie + ;; + + sysv4.3*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linkopts' + 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 $linkopts' + 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 $linkopts~$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 $linkopts' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_shlibpath_var=no + ;; + + dgux*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linkopts' + 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 $linkopts' + 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 $linkopts' + hardcode_direct=yes + hardcode_minus_L=no + hardcode_shlibpath_var=no + hardcode_runpath_var=yes + runpath_var=LD_RUN_PATH + ;; + + unixware7*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linkopts' + runpath_var='LD_RUN_PATH' + hardcode_shlibpath_var=no + ;; + + *) + ld_shlibs=no + ;; + esac +fi +echo "$ac_t$ld_shlibs" 1>&6 +test "$ld_shlibs" = no && can_build_shared=no + +if test -z "$NM"; then + echo $ac_n "checking for BSD-compatible nm... $ac_c" 1>&6 + case "$NM" in + [\\/]* | [A-Za-z]:[\\/]*) ;; # Let the user override the test with a path. + *) + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR}" + for ac_dir in $PATH /usr/ucb /usr/ccs/bin /bin; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/nm || test -f $ac_dir/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 + if ($ac_dir/nm -B /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then + NM="$ac_dir/nm -B" + break + elif ($ac_dir/nm -p /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then + NM="$ac_dir/nm -p" + break + else + NM=${NM="$ac_dir/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 "$NM" && NM=nm + ;; + esac + echo "$ac_t$NM" 1>&6 +fi + +# Check for command to grab the raw symbol name followed by C symbol from nm. +echo $ac_n "checking command to parse $NM output... $ac_c" 1>&6 + +# These are sane defaults that work on at least a few old systems. +# [They come from Ultrix. What could be older than Ultrix?!! ;)] + +# Character class describing NM global symbol codes. +symcode='[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 +global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern char \1;/p'" + +# Define system-specific variables. +case "$host_os" in +aix*) + symcode='[BCDT]' + ;; +cygwin* | mingw*) + symcode='[ABCDGISTW]' + ;; +hpux*) # Its linker distinguishes data from code symbols + global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern char \1();/p' -e 's/^. .* \(.*\)$/extern char \1;/p'" + ;; +irix*) + symcode='[BCDEGRST]' + ;; +solaris*) + symcode='[BDT]' + ;; +sysv4) + symcode='[DFNSTU]' + ;; +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. + global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode\)[ ][ ]*\($ac_symprfx\)$sympat$/$symxfrm/p'" + + # Check to see that the pipe works correctly. + pipe_works=no + $rm conftest* + cat > conftest.c <&5 + if { (eval echo $progname:1654: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; } && test -s conftest.$objext; then + # Now try to grab the symbols. + nlist=conftest.nm + if { echo "$progname:1657: eval \"$NM conftest.$objext | $global_symbol_pipe > $nlist\"" >&5; eval "$NM conftest.$objext | $global_symbol_pipe > $nlist 2>&5"; } && test -s "$nlist"; then + + # Try sorting and uniquifying the output. + if sort "$nlist" | uniq > "$nlist"T; then + mv -f "$nlist"T "$nlist" + 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.c +#ifdef __cplusplus +extern "C" { +#endif + +EOF + # Now generate the symbol file. + eval "$global_symbol_to_cdecl"' < "$nlist" >> conftest.c' + + cat <> conftest.c +#if defined (__STDC__) && __STDC__ +# define lt_ptr_t void * +#else +# define lt_ptr_t char * +# define const +#endif + +/* The mapping between symbol names and symbols. */ +const struct { + const char *name; + lt_ptr_t address; +} +lt_preloaded_symbols[] = +{ +EOF + sed 's/^. \(.*\) \(.*\)$/ {"\2", (lt_ptr_t) \&\2},/' < "$nlist" >> conftest.c + cat <<\EOF >> conftest.c + {0, (lt_ptr_t) 0} +}; + +#ifdef __cplusplus +} +#endif +EOF + # Now try linking the two files. + mv conftest.$objext conftstm.$objext + save_LIBS="$LIBS" + save_CFLAGS="$CFLAGS" + LIBS="conftstm.$objext" + CFLAGS="$CFLAGS$no_builtin_flag" + if { (eval echo $progname:1709: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then + pipe_works=yes + else + echo "$progname: failed program was:" >&5 + cat conftest.c >&5 + fi + LIBS="$save_LIBS" + else + echo "cannot find nm_test_func in $nlist" >&5 + fi + else + echo "cannot find nm_test_var in $nlist" >&5 + fi + else + echo "cannot run $global_symbol_pipe" >&5 + fi + else + echo "$progname: failed program was:" >&5 + cat conftest.c >&5 + fi + $rm conftest* conftst* + + # Do not use the global_symbol_pipe unless it works. + if test "$pipe_works" = yes; then + break + else + global_symbol_pipe= + fi +done +if test "$pipe_works" = yes; then + echo "${ac_t}ok" 1>&6 +else + echo "${ac_t}failed" 1>&6 +fi + +if test -z "$global_symbol_pipe"; then + global_symbol_to_cdecl= +fi + +# Check hardcoding attributes. +echo $ac_n "checking how to hardcode library paths into programs... $ac_c" 1>&6 +hardcode_action= +if test -n "$hardcode_libdir_flag_spec" || \ + test -n "$runpath_var"; then + + # We can hardcode non-existant directories. + if test "$hardcode_direct" != no && + # 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 "$ac_t$hardcode_action" 1>&6 + + +reload_flag= +reload_cmds='$LD$reload_flag -o $output$reload_objs' +echo $ac_n "checking for $LD option to reload object files... $ac_c" 1>&6 +# PORTME Some linkers may need a different reload flag. +reload_flag='-r' +echo "$ac_t$reload_flag" 1>&6 +test -n "$reload_flag" && reload_flag=" $reload_flag" + +# PORTME Fill in your ld.so characteristics +library_names_spec= +libname_spec='lib$name' +soname_spec= +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +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" +file_magic_cmd= +file_magic_test_file= +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. +echo $ac_n "checking dynamic linker characteristics... $ac_c" 1>&6 +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*) + version_type=linux + # AIX 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. + # We preserve .a as extension for shared libraries though AIX4.2 + # and later linker supports .so + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.a' + shlibpath_var=LIBPATH + deplibs_check_method=pass_all + ;; + +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 + deplibs_check_method=pass_all + lt_cv_dlopen="load_add_on" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ;; + +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 + deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)' + file_magic_cmd=/usr/bin/file + file_magic_test_file=/shlib/libc.so + 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*) + version_type=windows + need_version=no + need_lib_prefix=no + if test "$with_gcc" = yes; then + library_names_spec='${libname}`echo ${release} | sed -e 's/[.]/-/g'`${versuffix}.dll $libname.a' + else + library_names_spec='${libname}`echo ${release} | sed -e 's/[.]/-/g'`${versuffix}.dll $libname.lib' + fi + dynamic_linker='Win32 ld.exe' + deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?' + file_magic_cmd='${OBJDUMP} -f' + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + lt_cv_dlopen="LoadLibrary" + lt_cv_dlopen_libs= + ;; + +freebsd1*) + dynamic_linker=no + ;; + +freebsd*) + objformat=`test -x /usr/bin/objformat && /usr/bin/objformat || echo aout` + version_type=freebsd-$objformat + case "$version_type" in + freebsd-elf*) + deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB shared object' + file_magic_cmd=/usr/bin/file + file_magic_test_file=`echo /usr/lib/libc.so*` + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so $libname.so' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + deplibs_check_method=unknown + library_names_spec='${libname}${release}.so$versuffix $libname.so$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case "$host_os" in + freebsd2* | freebsd3.[01]* | freebsdelf3.[01]*) + shlibpath_overrides_runpath=yes + ;; + *) # from 3.2 on + shlibpath_overrides_runpath=no + ;; + 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 + ;; + +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' + case "$host_os" in + hpux10.20*) + # TODO: Does this work for hpux-11 too? + deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9].[0-9]) shared library' + file_magic_cmd=/usr/bin/file + file_magic_test_file=/usr/lib/libc.sl + ;; + esac + ;; + +irix5* | irix6*) + version_type=irix + 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*) + libsuff= shlibsuff= + # this will be overridden with pass_all, but let us keep it just in case + deplibs_check_method="file_magic ELF 32-bit MSB dynamic lib MIPS - version 1" + ;; + *) + 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}" + file_magic_cmd=/usr/bin/file + file_magic_test_file=`echo /lib${libsuff}/libc.so*` + deplibs_check_method='pass_all' + ;; + +# 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 + deplibs_check_method=pass_all + + if test -f /lib/ld.so.1; then + dynamic_linker='GNU ld.so' + else + # Only the GNU ld.so supports shared libraries on MkLinux. + case "$host_cpu" in + powerpc*) dynamic_linker=no ;; + *) dynamic_linker='Linux ld.so' ;; + esac + fi + ;; + +netbsd*) + version_type=sunos + 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 + ;; + +openbsd*) + version_type=sunos + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + need_version=no + 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 + soname_spec='${libname}${release}.so' + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so $libname.so' + shlibpath_var=LD_LIBRARY_PATH + # this will be overridden with pass_all, but let us keep it just in case + deplibs_check_method='file_magic COFF format alpha shared library' + file_magic_cmd=/usr/bin/file + file_magic_test_file=/shlib/libc.so + deplibs_check_method='pass_all' + 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" + ;; + +rhapsody*) + version_type=sunos + library_names_spec='${libname}.so' + soname_spec='${libname}.so' + shlibpath_var=DYLD_LIBRARY_PATH + deplibs_check_method=pass_all + ;; + +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 + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + deplibs_check_method="file_magic ELF [0-9][0-9]-bit [LM]SB dynamic lib" + file_magic_cmd=/usr/bin/file + file_magic_test_file=/lib/libc.so + ;; + +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 + sequent) + file_magic_cmd='/bin/file' + deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' + ;; + ncr) + deplibs_check_method='pass_all' + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + 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]' + file_magic_cmd=/usr/bin/file + file_magic_test_file=`echo /usr/lib/libc.so*` + ;; + 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 "$ac_t$dynamic_linker" 1>&6 +test "$dynamic_linker" = no && can_build_shared=no + +# Report the final consequences. +echo "checking if libtool supports shared libraries... $can_build_shared" 1>&6 + +# Only try to build win32 dlls if AC_LIBTOOL_WIN32_DLL was used in +# configure.in, otherwise build static only libraries. +case "$host_os" in +cygwin* | mingw* | os2*) + if test x$can_build_shared = xyes; then + test x$enable_win32_dll = xno && can_build_shared=no + echo "checking if package supports dlls... $can_build_shared" 1>&6 + fi +;; +esac + +if test -n "$file_magic_test_file" && test -n "$file_magic_cmd"; then + case "$deplibs_check_method" in + "file_magic "*) + file_magic_regex="`expr \"$deplibs_check_method\" : \"file_magic \(.*\)\"`" + 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 + +echo $ac_n "checking whether to build shared libraries... $ac_c" 1>&6 +test "$can_build_shared" = "no" && enable_shared=no + +# On AIX, shared libraries and static libraries use the same namespace, and +# are all built from PIC. +case "$host_os" in +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*) + test "$enable_shared" = yes && enable_static=no + ;; +esac + +echo "$ac_t$enable_shared" 1>&6 + +# Make sure either enable_shared or enable_static is yes. +test "$enable_shared" = yes || enable_static=yes + +echo "checking whether to build static libraries... $enable_static" 1>&6 + +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 + +echo $ac_n "checking for objdir... $ac_c" 1>&6 +rm -f .libs 2>/dev/null +mkdir .libs 2>/dev/null +if test -d .libs; then + objdir=.libs +else + # MS-DOS does not allow filenames that begin with a dot. + objdir=_libs +fi +rmdir .libs 2>/dev/null +echo "$ac_t$objdir" 1>&6 + +if test "x$enable_dlopen" != xyes; then + enable_dlopen=unknown + enable_dlopen_self=unknown + enable_dlopen_self_static=unknown +else +if eval "test \"`echo '$''{'lt_cv_dlopen'+set}'`\" != set"; then + lt_cv_dlopen=no lt_cv_dlopen_libs= +echo $ac_n "checking for dlopen in -ldl""... $ac_c" 1>&6 +echo "$progname:2248: checking for dlopen in -ldl" >&5 +ac_lib_var=`echo dl'_'dlopen | sed 'y%./+-%__p_%'` +if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + ac_save_LIBS="$LIBS" +LIBS="-ldl $LIBS" +cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=yes" +else + echo "$progname: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=no" +fi +rm -f conftest* +LIBS="$ac_save_LIBS" + +fi +if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then + echo "$ac_t""yes" 1>&6 + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" +else + echo "$ac_t""no" 1>&6 +echo $ac_n "checking for dlopen""... $ac_c" 1>&6 +echo "$progname:2288: checking for dlopen" >&5 +if eval "test \"`echo '$''{'ac_cv_func_dlopen'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +/* Override any gcc2 internal prototype to avoid an error. */ +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen(); + +int main() { + +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_dlopen) || defined (__stub___dlopen) +choke me +#else +dlopen(); +#endif + +; return 0; } +EOF +if { (eval echo $progname:2318: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_func_dlopen=yes" +else + echo "$progname: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_func_dlopen=no" +fi +rm -f conftest* +fi +if eval "test \"`echo '$ac_cv_func_'dlopen`\" = yes"; then + echo "$ac_t""yes" 1>&6 + lt_cv_dlopen="dlopen" +else + echo "$ac_t""no" 1>&6 +echo $ac_n "checking for dld_link in -ldld""... $ac_c" 1>&6 +echo "$progname:2335: checking for dld_link in -ldld" >&5 +ac_lib_var=`echo dld'_'dld_link | sed 'y%./+-%__p_%'` +if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + ac_save_LIBS="$LIBS" +LIBS="-ldld $LIBS" +cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=yes" +else + echo "$progname: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=no" +fi +rm -f conftest* +LIBS="$ac_save_LIBS" + +fi +if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then + echo "$ac_t""yes" 1>&6 + lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld" +else + echo "$ac_t""no" 1>&6 +echo $ac_n "checking for shl_load""... $ac_c" 1>&6 +echo "$progname:2375: checking for shl_load" >&5 +if eval "test \"`echo '$''{'ac_cv_func_shl_load'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +/* Override any gcc2 internal prototype to avoid an error. */ +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char shl_load(); + +int main() { + +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_shl_load) || defined (__stub___shl_load) +choke me +#else +shl_load(); +#endif + +; return 0; } +EOF +if { (eval echo $progname:2405: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_func_shl_load=yes" +else + echo "$progname: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_func_shl_load=no" +fi +rm -f conftest* +fi + +if eval "test \"`echo '$ac_cv_func_'shl_load`\" = yes"; then + echo "$ac_t""yes" 1>&6 + lt_cv_dlopen="shl_load" +else + echo "$ac_t""no" 1>&6 +echo $ac_n "checking for shl_load in -ldld""... $ac_c" 1>&6 +echo "$progname:2423: checking for shl_load in -ldld" >&5 +ac_lib_var=`echo dld'_'shl_load | sed 'y%./+-%__p_%'` +if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + ac_save_LIBS="$LIBS" +LIBS="-ldld $LIBS" +cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=yes" +else + echo "$progname: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=no" +fi +rm -f conftest* +LIBS="$ac_save_LIBS" + +fi +if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then + echo "$ac_t""yes" 1>&6 + lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld" +else + echo "$ac_t""no" 1>&6 +fi + + +fi + + +fi + + +fi + + +fi + +fi + + if test "x$lt_cv_dlopen" != xno; then + enable_dlopen=yes + fi + + case "$lt_cv_dlopen" in + dlopen) +for ac_hdr in dlfcn.h; do +ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` +echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 +echo "$progname:2488: checking for $ac_hdr" >&5 +if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +int fnord = 0; +EOF +ac_try="$ac_compile >/dev/null 2>conftest.out" +{ (eval echo $progname:2498: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` +if test -z "$ac_err"; then + rm -rf conftest* + eval "ac_cv_header_$ac_safe=yes" +else + echo "$ac_err" >&5 + echo "$progname: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_header_$ac_safe=no" +fi +rm -f conftest* +fi +if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then + echo "$ac_t""yes" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi +done + + if test "x$ac_cv_header_dlfcn_h" = xyes; then + CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" + fi + eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" + LIBS="$lt_cv_dlopen_libs $LIBS" + + echo $ac_n "checking whether a program can dlopen itself""... $ac_c" 1>&6 +echo "$progname:2526: checking whether a program can dlopen itself" >&5 +if test "${lt_cv_dlopen_self+set}" = set; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + if test "$cross_compiling" = yes; then + lt_cv_dlopen_self=cross + else + cat > conftest.c < +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LTDL_GLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LTDL_GLOBAL DL_GLOBAL +# else +# define LTDL_GLOBAL 0 +# endif +#endif + +/* We may have to define LTDL_LAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LTDL_LAZY_OR_NOW +# ifdef RTLD_LAZY +# define LTDL_LAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LTDL_LAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LTDL_LAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LTDL_LAZY_OR_NOW DL_NOW +# else +# define LTDL_LAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +fnord() { int i=42;} +main() { void *self, *ptr1, *ptr2; self=dlopen(0,LTDL_GLOBAL|LTDL_LAZY_OR_NOW); + if(self) { ptr1=dlsym(self,"fnord"); ptr2=dlsym(self,"_fnord"); + if(ptr1 || ptr2) { dlclose(self); exit(0); } } exit(1); } + +EOF +if { (eval echo $progname:2580: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null +then + lt_cv_dlopen_self=yes +else + echo "$progname: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -fr conftest* + lt_cv_dlopen_self=no +fi +rm -fr conftest* +fi + +fi + +echo "$ac_t""$lt_cv_dlopen_self" 1>&6 + + if test "$lt_cv_dlopen_self" = yes; then + LDFLAGS="$LDFLAGS $link_static_flag" + echo $ac_n "checking whether a statically linked program can dlopen itself""... $ac_c" 1>&6 +echo "$progname:2599: checking whether a statically linked program can dlopen itself" >&5 +if test "${lt_cv_dlopen_self_static+set}" = set; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + if test "$cross_compiling" = yes; then + lt_cv_dlopen_self_static=cross + else + cat > conftest.c < +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LTDL_GLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LTDL_GLOBAL DL_GLOBAL +# else +# define LTDL_GLOBAL 0 +# endif +#endif + +/* We may have to define LTDL_LAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LTDL_LAZY_OR_NOW +# ifdef RTLD_LAZY +# define LTDL_LAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LTDL_LAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LTDL_LAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LTDL_LAZY_OR_NOW DL_NOW +# else +# define LTDL_LAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +fnord() { int i=42;} +main() { void *self, *ptr1, *ptr2; self=dlopen(0,LTDL_GLOBAL|LTDL_LAZY_OR_NOW); + if(self) { ptr1=dlsym(self,"fnord"); ptr2=dlsym(self,"_fnord"); + if(ptr1 || ptr2) { dlclose(self); exit(0); } } exit(1); } + +EOF +if { (eval echo $progname:2653: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null +then + lt_cv_dlopen_self_static=yes +else + echo "$progname: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -fr conftest* + lt_cv_dlopen_self_static=no +fi +rm -fr conftest* +fi + +fi + +echo "$ac_t""$lt_cv_dlopen_self_static" 1>&6 +fi + ;; + 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 + +# Copy echo and quote the copy, instead of the original, because it is +# used later. +ltecho="$echo" +if test "X$ltecho" = "X$CONFIG_SHELL $0 --fallback-echo"; then + ltecho="$CONFIG_SHELL \$0 --fallback-echo" +fi +LTSHELL="$SHELL" + +LTCONFIG_VERSION="$VERSION" + +# Only quote variables if we're using ltmain.sh. +case "$ltmain" in +*.sh) + # Now quote all the things that may contain metacharacters. + for var in ltecho old_CC old_CFLAGS old_CPPFLAGS \ + old_LD old_LDFLAGS old_LIBS \ + old_NM old_RANLIB old_LN_S old_DLLTOOL old_OBJDUMP old_AS \ + AR CC LD LN_S NM LTSHELL LTCONFIG_VERSION \ + 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 \ + 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 \ + 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 | \ + postinstall_cmds | postuninstall_cmds | \ + finish_cmds | sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) + # Double-quote double-evaled strings. + eval "$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" + ;; + *) + eval "$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" + ;; + esac + done + + case "$ltecho" in + *'\$0 --fallback-echo"') + ltecho=`$echo "X$ltecho" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` + ;; + esac + + trap "$rm \"$ofile\"; exit 1" 1 2 15 + echo "creating $ofile" + $rm "$ofile" + cat < "$ofile" +#! $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 ltconfig or ltmain.sh. +# +# Copyright (C) 1996-1999 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. + +# 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 +EOF + cfgfile="$ofile" + ;; + +*) + # Double-quote the variables that need it (for aesthetics). + for var in old_CC old_CFLAGS old_CPPFLAGS \ + old_LD old_LDFLAGS old_LIBS \ + old_NM old_RANLIB old_LN_S old_DLLTOOL old_OBJDUMP old_AS; do + eval "$var=\\\"\$var\\\"" + done + + # Just create a config file. + cfgfile="$ofile.cfg" + trap "$rm \"$cfgfile\"; exit 1" 1 2 15 + echo "creating $cfgfile" + $rm "$cfgfile" + cat < "$cfgfile" +# `$echo "$cfgfile" | sed 's%^.*/%%'` - Libtool configuration file. +# Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP) +EOF + ;; +esac + +cat <> "$cfgfile" +# Libtool was configured as follows, on host `(hostname || uname -n) 2>/dev/null | sed 1q`: +# +# CC=$old_CC CFLAGS=$old_CFLAGS CPPFLAGS=$old_CPPFLAGS \\ +# LD=$old_LD LDFLAGS=$old_LDFLAGS LIBS=$old_LIBS \\ +# NM=$old_NM RANLIB=$old_RANLIB LN_S=$old_LN_S \\ +# DLLTOOL=$old_DLLTOOL OBJDUMP=$old_OBJDUMP AS=$old_AS \\ +# $0$ltconfig_args +# +# Compiler and other test output produced by $progname, useful for +# debugging $progname, is in ./config.log if it exists. + +# The version of $progname that generated this script. +LTCONFIG_VERSION=$LTCONFIG_VERSION + +# Shell to use when invoking shell scripts. +SHELL=$LTSHELL + +# 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 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=$ltecho + +# The archiver. +AR=$AR + +# The default C compiler. +CC=$CC + +# The linker used to build libraries. +LD=$LD + +# Whether we need hard or soft links. +LN_S=$LN_S + +# A BSD-compatible nm program. +NM=$NM + +# 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=$reload_flag +reload_cmds=$reload_cmds + +# How to pass a linker flag through the compiler. +wl=$wl + +# Object file suffix (normally "o"). +objext="$objext" + +# Old archive suffix (normally "a"). +libext="$libext" + +# Executable file suffix (normally ""). +exeext="$exeext" + +# Additional compiler flags for building library objects. +pic_flag=$pic_flag + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$compiler_c_o + +# Can we write directly to a .lo ? +compiler_o_lo=$compiler_o_lo + +# Must we lock files when doing compilation ? +need_locks=$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=$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=$link_static_flag + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$no_builtin_flag + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$export_dynamic_flag_spec + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$whole_archive_flag_spec + +# Compiler flag to generate thread-safe objects. +thread_safe_flag_spec=$thread_safe_flag_spec + +# Library versioning type. +version_type=$version_type + +# Format of library name prefix. +libname_spec=$libname_spec + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME. +library_names_spec=$library_names_spec + +# The coded name of the library, if different from the real name. +soname_spec=$soname_spec + +# Commands used to build and install an old-style archive. +RANLIB=$RANLIB +old_archive_cmds=$old_archive_cmds +old_postinstall_cmds=$old_postinstall_cmds +old_postuninstall_cmds=$old_postuninstall_cmds + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$old_archive_from_new_cmds + +# Commands used to build and install a shared archive. +archive_cmds=$archive_cmds +archive_expsym_cmds=$archive_expsym_cmds +postinstall_cmds=$postinstall_cmds +postuninstall_cmds=$postuninstall_cmds + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method=$deplibs_check_method + +# Command to use when deplibs_check_method == file_magic. +file_magic_cmd=$file_magic_cmd + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$allow_undefined_flag + +# Flag that forces no undefined symbols. +no_undefined_flag=$no_undefined_flag + +# Commands used to finish a libtool library installation in a directory. +finish_cmds=$finish_cmds + +# Same as above, but a single script fragment to be evaled but not shown. +finish_eval=$finish_eval + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe=$global_symbol_pipe + +# Transform the output of nm in a proper C declaration +global_symbol_to_cdecl=$global_symbol_to_cdecl + +# 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 + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist. +hardcode_libdir_flag_spec=$hardcode_libdir_flag_spec + +# Whether we need a single -rpath flag with a separated argument. +hardcode_libdir_separator=$hardcode_libdir_separator + +# Set to yes if using DIR/libNAME.so during linking hardcodes DIR into the +# resulting binary. +hardcode_direct=$hardcode_direct + +# Set to yes if using the -LDIR flag during linking hardcodes DIR into the +# resulting binary. +hardcode_minus_L=$hardcode_minus_L + +# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into +# the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var + +# Compile-time system search path for libraries +sys_lib_search_path_spec=$sys_lib_search_path_spec + +# Run-time system search path for libraries +sys_lib_dlsearch_path_spec=$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=$export_symbols_cmds + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$exclude_expsyms + +# Symbols that must always be exported. +include_expsyms=$include_expsyms + +EOF + +case "$ltmain" in +*.sh) + echo '### END LIBTOOL CONFIG' >> "$ofile" + echo >> "$ofile" + case "$host_os" in + aix3*) + cat <<\EOF >> "$ofile" + +# AIX sometimes has problems with the GCC collect2 program. For some +# reason, if we set the COLLECT_NAMES environment variable, the problems +# vanish in a puff of smoke. +if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES +fi +EOF + ;; + esac + + # Append the ltmain.sh script. + sed '$q' "$ltmain" >> "$ofile" || (rm -f "$ofile"; exit 1) + # We use sed instead of cat because bash on DJGPP gets confused if + # if finds mixed CR/LF and LF-only lines. Since sed operates in + # text mode, it properly converts lines to CR/LF. This bash problem + # is reportedly fixed, but why not run on old versions too? + + chmod +x "$ofile" + ;; + +*) + # Compile the libtool program. + echo "FIXME: would compile $ltmain" + ;; +esac + +test -n "$cache_file" || exit 0 + +# AC_CACHE_SAVE +trap '' 1 2 15 +cat > confcache <<\EOF +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs. It is not useful on other systems. +# If it contains results you don't want to keep, you may remove or edit it. +# +# By default, configure uses ./config.cache as the cache file, +# creating it if it does not exist already. You can give configure +# the --cache-file=FILE option to use a different cache file; that is +# what configure does when it calls configure scripts in +# subdirectories, so they share the cache. +# Giving --cache-file=/dev/null disables caching, for debugging configure. +# config.status only pays attention to the cache file if you give it the +# --recheck option to rerun configure. +# +EOF +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, don't put newlines in cache variables' values. +# Ultrix sh set writes to stderr and can't be redirected directly, +# and sets the high bit in the cache file unless we assign to the vars. +(set) 2>&1 | + case `(ac_space=' '; set | 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 \ + -e "s/'/'\\\\''/g" \ + -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p" + ;; + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p' + ;; + esac >> confcache +if cmp -s $cache_file confcache; then + : +else + if test -w $cache_file; then + echo "updating cache $cache_file" + cat confcache > $cache_file + else + echo "not updating unwritable cache $cache_file" + fi +fi +rm -f confcache + +exit 0 + +# Local Variables: +# mode:shell-script +# sh-indentation:2 +# End: Index: xc/extras/freetype2/builds/unix/ltmain.sh diff -u /dev/null xc/extras/freetype2/builds/unix/ltmain.sh:1.1.1.1 --- /dev/null Mon Dec 18 14:22:23 2000 +++ xc/extras/freetype2/builds/unix/ltmain.sh Fri Dec 8 16:26:09 2000 @@ -0,0 +1,4024 @@ +# ltmain.sh - Provide generalized library-building support services. +# NOTE: Changing this file will not affect anything until you rerun ltconfig. +# +# Copyright (C) 1996-1999 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 + +if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then + echo "$modename: not configured to build any kind of library" 1>&2 + echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2 + exit 1 +fi + +# Global variables. +mode=$default_mode +nonopt= +prev= +prevopt= +run= +show="$echo" +show_help= +execute_dlfiles= +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) + eval "$prev=\"\$$prev \$arg\"" + ;; + *) + eval "$prev=\$arg" + ;; + esac + + prev= + prevopt= + continue + fi + + # Have we seen a non-optional argument yet? + case "$arg" in + --help) + show_help=yes + ;; + + --version) + echo "$PROGRAM (GNU $PACKAGE) $VERSION$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" ;; + + --quiet | --silent) + show=: + ;; + + -dlopen) + prevopt="-dlopen" + prev=execute_dlfiles + ;; + + -*) + $echo "$modename: unrecognized option \`$arg'" 1>&2 + $echo "$help" 1>&2 + exit 1 + ;; + + *) + nonopt="$arg" + break + ;; + esac +done + +if test -n "$prevopt"; then + $echo "$modename: option \`$prevopt' requires an argument" 1>&2 + $echo "$help" 1>&2 + exit 1 +fi + +if test -z "$show_help"; then + + # Infer the operation mode. + if test -z "$mode"; then + case "$nonopt" in + *cc | *++ | gcc* | *-gcc*) + mode=link + for arg + do + case "$arg" in + -c) + mode=compile + break + ;; + esac + done + ;; + *db | *dbx | *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= + lastarg= + srcfile="$nonopt" + suppress_output= + + user_target=no + for arg + do + # 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 + ;; + 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 + + # 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 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 + + # All platforms use -DPIC, to notify preprocessed assembler code. + command="$base_compile $srcfile $pic_flag -DPIC" + 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 "$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 + 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 + command="$base_compile $srcfile" + 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 + $rm "$lockfile" + fi + + exit 0 + ;; + + # libtool link mode + link) + modename="$modename: link" + case "$host" in + *-*-cygwin* | *-*-mingw* | *-*-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 + + # 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 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() */ +# +# 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) +# 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&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 + + # 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= + ;; + 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 + ;; + 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 + ;; + *) + eval "$prev=\"\$arg\"" + prev= + continue + ;; + esac + fi + + prevarg="$arg" + + case "$arg" in + -all-static) + if test -n "$link_static_flag"; then + compile_command="$compile_command $link_static_flag" + finalize_command="$finalize_command $link_static_flag" + fi + continue + ;; + + -allow-undefined) + # FIXME: remove this flag sometime in the future. + $echo "$modename: \`-allow-undefined' is deprecated because it is the default" 1>&2 + continue + ;; + + -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: not more than one -exported-symbols argument allowed" + exit 1 + fi + if test "X$arg" = "X-export-symbols"; then + prev=expsyms + else + prev=expsyms_regex + fi + 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: warning: cannot determine absolute directory name of \`$dir'" 1>&2 + $echo "$modename: passing it literally to the linker, although it might fail" 1>&2 + absdir="$dir" + fi + dir="$absdir" + ;; + esac + case " $deplibs " in + *" $arg "*) ;; + *) deplibs="$deplibs $arg";; + esac + case " $lib_search_path " in + *" $dir "*) ;; + *) lib_search_path="$lib_search_path $dir";; + esac + case "$host" in + *-*-cygwin* | *-*-mingw* | *-*-os2*) + dllsearchdir=`cd "$dir" && pwd || echo "$dir"` + case ":$dllsearchpath:" in + ::) dllsearchpath="$dllsearchdir";; + *":$dllsearchdir:"*) ;; + *) dllsearchpath="$dllsearchpath:$dllsearchdir";; + esac + ;; + esac + ;; + + -l*) + if test "$arg" = "-lc"; then + case "$host" in + *-*-cygwin* | *-*-mingw* | *-*-os2* | *-*-beos*) + # These systems don't actually have c library (as such) + continue + ;; + esac + elif test "$arg" = "-lm"; then + case "$host" in + *-*-cygwin* | *-*-beos*) + # These systems don't actually have math library (as such) + continue + ;; + esac + fi + deplibs="$deplibs $arg" + ;; + + -module) + module=yes + 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) + # If we have no pic_flag, then this is the same as -all-static. + if test -z "$pic_flag" && test -n "$link_static_flag"; then + compile_command="$compile_command $link_static_flag" + finalize_command="$finalize_command $link_static_flag" + fi + continue + ;; + + -thread-safe) + thread_safe=yes + continue + ;; + + -version-info) + prev=vinfo + continue + ;; + + # Some other compiler flag. + -* | +*) + # Unknown arguments in both finalize_command and compile_command need + # to be aesthetically quoted because they are evaled later. + arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` + case "$arg" in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*) + arg="\"$arg\"" + ;; + esac + ;; + + *.o | *.obj | *.a | *.lib) + # A standard object. + objs="$objs $arg" + ;; + + *.lo) + # A library object. + if test "$prev" = dlfiles; then + dlfiles="$dlfiles $arg" + if test "$build_libtool_libs" = yes && test "$dlopen" = yes; then + prev= + continue + else + # If libtool objects are unsupported, then we need to preload. + prev=dlprefiles + fi + fi + + if test "$prev" = dlprefiles; then + # Preload the old-style object. + dlprefiles="$dlprefiles "`$echo "X$arg" | $Xsed -e "$lo2o"` + prev= + fi + libobjs="$libobjs $arg" + ;; + + *.la) + # A libtool-controlled library. + + dlname= + libdir= + library_names= + old_library= + + # Check to see that this really is a libtool archive. + if (sed -e '2q' $arg | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : + else + $echo "$modename: \`$arg' is not a valid libtool archive" 1>&2 + exit 1 + fi + + # If the library was installed with an old release of libtool, + # it will not redefine variable installed. + installed=yes + + # Read the .la file + # If there is no directory component, then add one. + case "$arg" in + */* | *\\*) . $arg ;; + *) . ./$arg ;; + esac + + # Get the name of the library we link against. + linklib= + for l in $old_library $library_names; do + linklib="$l" + done + + if test -z "$linklib"; then + $echo "$modename: cannot find name of link library for \`$arg'" 1>&2 + exit 1 + fi + + # Find the relevant object directory and library name. + name=`$echo "X$arg" | $Xsed -e 's%^.*/%%' -e 's/\.la$//' -e 's/^lib//'` + + if test "X$installed" = Xyes; then + dir="$libdir" + else + dir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` + if test "X$dir" = "X$arg"; then + dir="$objdir" + else + dir="$dir/$objdir" + fi + fi + + if test -n "$dependency_libs"; then + # Extract -R and -L from dependency_libs + temp_deplibs= + for deplib in $dependency_libs; do + case "$deplib" in + -R*) temp_xrpath=`$echo "X$deplib" | $Xsed -e 's/^-R//'` + case " $rpath $xrpath " in + *" $temp_xrpath "*) ;; + *) xrpath="$xrpath $temp_xrpath";; + esac;; + -L*) case "$compile_command $temp_deplibs " in + *" $deplib "*) ;; + *) temp_deplibs="$temp_deplibs $deplib";; + esac + temp_dir=`$echo "X$deplib" | $Xsed -e 's/^-L//'` + case " $lib_search_path " in + *" $temp_dir "*) ;; + *) lib_search_path="$lib_search_path $temp_dir";; + esac + ;; + *) temp_deplibs="$temp_deplibs $deplib";; + esac + done + dependency_libs="$temp_deplibs" + fi + + if test -z "$libdir"; then + # It is a libtool convenience library, so add in its objects. + convenience="$convenience $dir/$old_library" + old_convenience="$old_convenience $dir/$old_library" + deplibs="$deplibs$dependency_libs" + compile_command="$compile_command $dir/$old_library$dependency_libs" + finalize_command="$finalize_command $dir/$old_library$dependency_libs" + continue + fi + + # This library was specified with -dlopen. + if test "$prev" = dlfiles; then + dlfiles="$dlfiles $arg" + if test -z "$dlname" || test "$dlopen" != yes || test "$build_libtool_libs" = no; then + # If there is no dlname, no dlopen support or we're linking statically, + # we need to preload. + prev=dlprefiles + else + # We should not create a dependency on this library, but we + # may need any libraries it requires. + compile_command="$compile_command$dependency_libs" + finalize_command="$finalize_command$dependency_libs" + prev= + continue + fi + fi + + # The library was specified with -dlpreopen. + if test "$prev" = dlprefiles; then + # Prefer using a static library (so that no silly _DYNAMIC symbols + # are required to link). + if test -n "$old_library"; then + dlprefiles="$dlprefiles $dir/$old_library" + else + dlprefiles="$dlprefiles $dir/$linklib" + fi + prev= + fi + + if test -n "$library_names" && + { test "$prefer_static_libs" = no || test -z "$old_library"; }; then + link_against_libtool_libs="$link_against_libtool_libs $arg" + if test -n "$shlibpath_var"; then + # Make sure the rpath contains only unique directories. + case "$temp_rpath " in + *" $dir "*) ;; + *) temp_rpath="$temp_rpath $dir" ;; + esac + fi + + # 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 + $echo "$modename: passing it literally to the linker, although it might fail" 1>&2 + absdir="$dir" + fi + ;; + esac + + # This is the magic to use -rpath. + # Skip directories that are in the system default run-time + # search path, unless they have been requested with -R. + 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 + + lib_linked=yes + case "$hardcode_action" in + immediate | unsupported) + if test "$hardcode_direct" = no; then + compile_command="$compile_command $dir/$linklib" + deplibs="$deplibs $dir/$linklib" + case "$host" in + *-*-cygwin* | *-*-mingw* | *-*-os2*) + dllsearchdir=`cd "$dir" && pwd || echo "$dir"` + if test -n "$dllsearchpath"; then + dllsearchpath="$dllsearchpath:$dllsearchdir" + else + dllsearchpath="$dllsearchdir" + fi + ;; + esac + elif test "$hardcode_minus_L" = no; then + case "$host" in + *-*-sunos*) + compile_shlibpath="$compile_shlibpath$dir:" + ;; + esac + case "$compile_command " in + *" -L$dir "*) ;; + *) compile_command="$compile_command -L$dir";; + esac + compile_command="$compile_command -l$name" + deplibs="$deplibs -L$dir -l$name" + elif test "$hardcode_shlibpath_var" = no; then + case ":$compile_shlibpath:" in + *":$dir:"*) ;; + *) compile_shlibpath="$compile_shlibpath$dir:";; + esac + compile_command="$compile_command -l$name" + deplibs="$deplibs -l$name" + else + lib_linked=no + fi + ;; + + relink) + if test "$hardcode_direct" = yes; then + compile_command="$compile_command $absdir/$linklib" + deplibs="$deplibs $absdir/$linklib" + elif test "$hardcode_minus_L" = yes; then + case "$compile_command " in + *" -L$absdir "*) ;; + *) compile_command="$compile_command -L$absdir";; + esac + compile_command="$compile_command -l$name" + deplibs="$deplibs -L$absdir -l$name" + elif test "$hardcode_shlibpath_var" = yes; then + case ":$compile_shlibpath:" in + *":$absdir:"*) ;; + *) compile_shlibpath="$compile_shlibpath$absdir:";; + esac + compile_command="$compile_command -l$name" + deplibs="$deplibs -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 + + # Finalize command for both is simple: just hardcode it. + if test "$hardcode_direct" = yes; then + finalize_command="$finalize_command $libdir/$linklib" + elif test "$hardcode_minus_L" = yes; then + case "$finalize_command " in + *" -L$libdir "*) ;; + *) finalize_command="$finalize_command -L$libdir";; + esac + finalize_command="$finalize_command -l$name" + elif test "$hardcode_shlibpath_var" = yes; then + case ":$finalize_shlibpath:" in + *":$libdir:"*) ;; + *) finalize_shlibpath="$finalize_shlibpath$libdir:";; + esac + finalize_command="$finalize_command -l$name" + else + # We cannot seem to hardcode it, guess we'll fake it. + case "$finalize_command " in + *" -L$dir "*) ;; + *) finalize_command="$finalize_command -L$libdir";; + esac + finalize_command="$finalize_command -l$name" + fi + else + # Transform directly to old archives if we don't build new libraries. + if test -n "$pic_flag" && test -z "$old_library"; then + $echo "$modename: cannot find static library for \`$arg'" 1>&2 + exit 1 + fi + + # Here we assume that one of hardcode_direct or hardcode_minus_L + # is not unsupported. This is valid on all known static and + # shared platforms. + if test "$hardcode_direct" != unsupported; then + test -n "$old_library" && linklib="$old_library" + compile_command="$compile_command $dir/$linklib" + finalize_command="$finalize_command $dir/$linklib" + else + case "$compile_command " in + *" -L$dir "*) ;; + *) compile_command="$compile_command -L$dir";; + esac + compile_command="$compile_command -l$name" + case "$finalize_command " in + *" -L$dir "*) ;; + *) finalize_command="$finalize_command -L$dir";; + esac + finalize_command="$finalize_command -l$name" + fi + fi + + # Add in any libraries that this one depends upon. + compile_command="$compile_command$dependency_libs" + finalize_command="$finalize_command$dependency_libs" + continue + ;; + + # Some other compiler argument. + *) + # Unknown arguments in both finalize_command and compile_command need + # to be aesthetically quoted because they are evaled later. + arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` + case "$arg" in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*) + arg="\"$arg\"" + ;; + esac + ;; + esac + + # Now actually substitute the argument into the commands. + if test -n "$arg"; then + compile_command="$compile_command $arg" + finalize_command="$finalize_command $arg" + fi + done + + if test -n "$prev"; then + $echo "$modename: the \`$prevarg' option requires an argument" 1>&2 + $echo "$help" 1>&2 + exit 1 + fi + + if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then + eval arg=\"$export_dynamic_flag_spec\" + compile_command="$compile_command $arg" + finalize_command="$finalize_command $arg" + fi + + oldlibs= + # calculate the name of the file, without its directory + outputname=`$echo "X$output" | $Xsed -e 's%^.*/%%'` + libobjs_save="$libobjs" + + case "$output" in + "") + $echo "$modename: you must specify an output file" 1>&2 + $echo "$help" 1>&2 + exit 1 + ;; + + *.a | *.lib) + if test -n "$link_against_libtool_libs"; then + $echo "$modename: error: cannot link libtool libraries into archives" 1>&2 + exit 1 + fi + + if test -n "$deplibs"; then + $echo "$modename: warning: \`-l' and \`-L' are ignored for archives" 1>&2 + fi + + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + $echo "$modename: warning: \`-dlopen' is ignored for archives" 1>&2 + fi + + if test -n "$rpath"; then + $echo "$modename: warning: \`-rpath' is ignored for archives" 1>&2 + fi + + if test -n "$xrpath"; then + $echo "$modename: warning: \`-R' is ignored for archives" 1>&2 + fi + + if test -n "$vinfo"; then + $echo "$modename: warning: \`-version-info' 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" + ;; + + *.la) + # 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 + + 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 + + if test -n "$objs"; then + $echo "$modename: cannot build libtool library \`$output' from non-libtool objects:$objs" 2>&1 + exit 1 + fi + + # How the heck are we supposed to write a wrapper for a shared library? + if test -n "$link_against_libtool_libs"; then + $echo "$modename: error: cannot link shared libraries into libtool libraries" 1>&2 + exit 1 + fi + + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + $echo "$modename: warning: \`-dlopen' 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 + dependency_libs="$deplibs" + + 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. + IFS="${IFS= }"; 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]*) ;; + *) + $echo "$modename: CURRENT \`$current' is not a nonnegative integer" 1>&2 + $echo "$modename: \`$vinfo' is not valid version information" 1>&2 + exit 1 + ;; + esac + + case "$revision" in + 0 | [1-9] | [1-9][0-9]*) ;; + *) + $echo "$modename: REVISION \`$revision' is not a nonnegative integer" 1>&2 + $echo "$modename: \`$vinfo' is not valid version information" 1>&2 + exit 1 + ;; + esac + + case "$age" in + 0 | [1-9] | [1-9][0-9]*) ;; + *) + $echo "$modename: AGE \`$age' is not a nonnegative integer" 1>&2 + $echo "$modename: \`$vinfo' is not valid version information" 1>&2 + exit 1 + ;; + esac + + if test $age -gt $current; then + $echo "$modename: AGE \`$age' is greater than the current interface number \`$current'" 1>&2 + $echo "$modename: \`$vinfo' is not valid version information" 1>&2 + exit 1 + fi + + # Calculate the version variables. + major= + versuffix= + verstring= + case "$version_type" in + none) ;; + + irix) + major=`expr $current - $age + 1` + versuffix="$major.$revision" + verstring="sgi$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="sgi$major.$iface:$verstring" + done + ;; + + 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" + ;; + + freebsd-aout) + major=".$current" + versuffix=".$current.$revision"; + ;; + + freebsd-elf) + major=".$current" + versuffix=".$current"; + ;; + + windows) + # Like Linux, but with '-' rather than '.', since we only + # want one extension on Windows 95. + major=`expr $current - $age` + versuffix="-$major-$age-$revision" + ;; + + *) + $echo "$modename: unknown library version type \`$version_type'" 1>&2 + echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2 + exit 1 + ;; + esac + + # Clear the version info if we defaulted, and they specified a release. + if test -z "$vinfo" && test -n "$release"; then + major= + verstring="0.0" + 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 + + dependency_libs="$deplibs" + case "$host" in + *-*-cygwin* | *-*-mingw* | *-*-os2* | *-*-beos*) + # these systems don't actually have a c library (as such)! + ;; + *-*-rhapsody*) + # rhapsody is a little odd... + deplibs="$deplibs -framework System" + ;; + *) + # Add libc to deplibs on all other systems. + deplibs="$deplibs -lc" + ;; + esac + fi + + # Create the output directory, or remove our outputs if we need to. + if test -d $output_objdir; then + $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}.* + else + $show "$mkdir $output_objdir" + $run $mkdir $output_objdir + status=$? + if test $status -ne 0 && test ! -d $output_objdir; then + exit $status + fi + fi + + # Now set the variables for building old libraries. + if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then + oldlibs="$oldlibs $output_objdir/$libname.$libext" + + # Transform .lo files to .o files. + oldobjs="$objs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}'$/d' -e "$lo2o" | $NL2SP` + fi + + if test "$build_libtool_libs" = yes; then + # 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: This library needs some functionality provided by $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." + 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 + + 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." + 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 + # Get the real and link names of the library. + eval library_names=\"$library_names_spec\" + set dummy $library_names + realname="$2" + shift; shift + + if test -n "$soname_spec"; then + eval soname=\"$soname_spec\" + else + soname="$realname" + fi + + lib="$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\" + IFS="${IFS= }"; 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\" + linkopts="$linkopts $flag" + fi + + # Do each of the archive commands. + if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then + eval cmds=\"$archive_expsym_cmds\" + else + eval cmds=\"$archive_cmds\" + fi + IFS="${IFS= }"; save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + + # 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 + ;; + + *.lo | *.o | *.obj) + if test -n "$link_against_libtool_libs"; then + $echo "$modename: error: cannot link libtool libraries into objects" 1>&2 + exit 1 + fi + + 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"; 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 "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}$'/d' -e '/\.lib$/d' -e "$lo2o" | $NL2SP`" $reload_conv_objs" + + output="$obj" + eval cmds=\"$reload_cmds\" + IFS="${IFS= }"; save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + + # Exit if we aren't doing a library object file. + 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"; then + # Only do commands if we really have different PIC objects. + reload_objs="$libobjs $reload_conv_objs" + output="$libobj" + eval cmds=\"$reload_cmds\" + IFS="${IFS= }"; save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + else + # Just create a symlink. + $show $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 + ;; + + # Anything else should be a program. + *) + 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" = 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 + + 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 "$compile_rpath " in + *" $libdir "*) ;; + *) compile_rpath="$compile_rpath $libdir" ;; + esac + 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 + 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" + + 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 binary in the object directory, then wrap it. + 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 + + 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" | $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" | sort +2 | 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_t void * +#else +# define lt_ptr_t char * +# define const +#endif + +/* The mapping between symbol names and symbols. */ +const struct { + const char *name; + lt_ptr_t address; +} +lt_preloaded_symbols[] = +{\ +" + + sed -n -e 's/^: \([^ ]*\) $/ {\"\1\", (lt_ptr_t) 0},/p' \ + -e 's/^. \([^ ]*\) \([^ ]*\)$/ {"\2", (lt_ptr_t) \&\2},/p' \ + < "$nlist" >> "$output_objdir/$dlsyms" + + $echo >> "$output_objdir/$dlsyms" "\ + {0, (lt_ptr_t) 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 -z "$link_against_libtool_libs" || test "$build_libtool_libs" != yes; then + # Replace the output file specification. + compile_command=`$echo "X$compile_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'` + 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 "$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 + 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 + $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: + link_against_libtool_libs='$link_against_libtool_libs' +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' + 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 (cd \"\$thisdir\" && eval \$relink_command); then : + else + $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*) + $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 "`$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 + IFS="${IFS= }"; save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + done + + if test -n "$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" + + if test -n "$xrpath"; then + temp_xrpath= + for libdir in $xrpath; do + temp_xrpath="$temp_xrpath -R$libdir" + done + dependency_libs="$temp_xrpath $dependency_libs" + fi + + # Only create the output if not a dry run. + if test -z "$run"; then + for installed in no yes; do + if test "$installed" = yes; then + if test -z "$install_libdir"; then + break + fi + output="$output_objdir/$outputname"i + fi + $rm $output + $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='$dlname' + +# Names of this library. +library_names='$library_names' + +# The name of the static archive. +old_library='$old_library' + +# Libraries that this one depends upon. +dependency_libs='$dependency_libs' + +# Version information for $libname. +current=$current +age=$age +revision=$revision + +# Is this an already installed library? +installed=$installed + +# Directory that this library needs to be installed in: +libdir='$install_libdir'\ +" + 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; 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 + *.a | *.lib) + # 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= + # If there is no directory component, then add one. + case "$file" in + */* | *\\*) . $file ;; + *) . ./$file ;; + esac + + # Add the libdir to current_libdirs if it is the destination. + if test "X$destdir" = "X$libdir"; then + case "$current_libdirs " in + *" $libdir "*) ;; + *) current_libdirs="$current_libdirs $libdir" ;; + esac + else + # Note the libdir as a future libdir. + case "$future_libdirs " in + *" $libdir "*) ;; + *) future_libdirs="$future_libdirs $libdir" ;; + esac + fi + + dir="`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`/" + test "X$dir" = "X$file/" && dir= + dir="$dir$objdir" + + # See the names of the shared library. + set dummy $library_names + if test -n "$2"; then + realname="$2" + shift + shift + + # Install the shared library and build the symlinks. + $show "$install_prog $dir/$realname $destdir/$realname" + $run eval "$install_prog $dir/$realname $destdir/$realname" || exit $? + + 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\" + IFS="${IFS= }"; save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + fi + + # Install the pseudo-library for information purposes. + name=`$echo "X$file" | $Xsed -e 's%^.*/%%'` + 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"` + ;; + *.o | *.obj) + 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. + if (sed -e '4q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + link_against_libtool_libs= + relink_command= + + # If there is no directory component, then add one. + case "$file" in + */* | *\\*) . $file ;; + *) . ./$file ;; + esac + + # Check the variables that should have been set. + if test -z "$link_against_libtool_libs"; then + $echo "$modename: invalid libtool wrapper script \`$file'" 1>&2 + exit 1 + fi + + finalize=yes + for lib in $link_against_libtool_libs; do + # Check to see that each library is installed. + libdir= + if test -f "$lib"; then + # If there is no directory component, then add one. + case "$lib" in + */* | *\\*) . $lib ;; + *) . ./$lib ;; + esac + fi + libfile="$libdir/`$echo "X$lib" | $Xsed -e 's%^.*/%%g'`" + if test -n "$libdir" && test ! -f "$libfile"; then + $echo "$modename: warning: \`$lib' has not been installed in \`$libdir'" 1>&2 + finalize=no + fi + done + + 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 + 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 + + $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 $? + + # Do each command in the postinstall commands. + eval cmds=\"$old_postinstall_cmds\" + IFS="${IFS= }"; save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + done + + if test -n "$future_libdirs"; then + $echo "$modename: warning: remember to run \`$progname --finish$future_libdirs'" 1>&2 + fi + + if test -n "$current_libdirs"; then + # Maybe just do a dry run. + test -n "$run" && current_libdirs=" -n$current_libdirs" + exec $SHELL $0 --finish$current_libdirs + exit 1 + fi + + exit 0 + ;; + + # libtool finish mode + finish) + modename="$modename: finish" + libdirs="$nonopt" + 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\" + IFS="${IFS= }"; 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 \`-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 actually exec the command. + eval "exec \$cmd$args" + + $echo "$modename: cannot exec \$cmd$args" + exit 1 + 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 uninstall mode + uninstall) + modename="$modename: uninstall" + rm="$nonopt" + files= + + for arg + do + case "$arg" in + -*) rm="$rm $arg" ;; + *) files="$files $arg" ;; + esac + done + + if test -z "$rm"; then + $echo "$modename: you must specify an RM program" 1>&2 + $echo "$help" 1>&2 + exit 1 + fi + + for file in $files; do + dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` + test "X$dir" = "X$file" && dir=. + name=`$echo "X$file" | $Xsed -e 's%^.*/%%'` + + rmfiles="$file" + + case "$name" in + *.la) + # Possibly a libtool archive, so verify it. + if (sed -e '2q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + . $dir/$name + + # Delete the libtool libraries and symlinks. + for n in $library_names; do + rmfiles="$rmfiles $dir/$n" + done + test -n "$old_library" && rmfiles="$rmfiles $dir/$old_library" + + $show "$rm $rmfiles" + $run $rm $rmfiles + + if test -n "$library_names"; then + # Do each command in the postuninstall commands. + eval cmds=\"$postuninstall_cmds\" + IFS="${IFS= }"; save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" + done + IFS="$save_ifs" + fi + + if test -n "$old_library"; then + # Do each command in the old_postuninstall commands. + eval cmds=\"$old_postuninstall_cmds\" + IFS="${IFS= }"; save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" + done + IFS="$save_ifs" + fi + + # FIXME: should reinstall the best remaining shared library. + fi + ;; + + *.lo) + if test "$build_old_libs" = yes; then + oldobj=`$echo "X$name" | $Xsed -e "$lo2o"` + rmfiles="$rmfiles $dir/$oldobj" + fi + $show "$rm $rmfiles" + $run $rm $rmfiles + ;; + + *) + $show "$rm $rmfiles" + $run $rm $rmfiles + ;; + esac + done + exit 0 + ;; + + "") + $echo "$modename: you must specify a MODE" 1>&2 + $echo "$generic_help" 1>&2 + exit 1 + ;; + esac + + $echo "$modename: invalid operation mode \`$mode'" 1>&2 + $echo "$generic_help" 1>&2 + exit 1 +fi # test -z "$show_help" + +# We need to display help for each of the modes. +case "$mode" in +"") $echo \ +"Usage: $modename [OPTION]... [MODE-ARG]... + +Provide generalized library-building support services. + + --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: + + compile compile a source file into a libtool object + execute automatically set library path, then run a program + finish complete the installation of libtool libraries + install install libraries or executables + link create a library or an executable + uninstall remove libraries from an installed directory + +MODE-ARGS vary depending on the MODE. Try \`$modename --help --mode=MODE' for +a more detailed description of MODE." + exit 0 + ;; + +compile) + $echo \ +"Usage: $modename [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE + +Compile a source file into a libtool library object. + +This mode accepts the following additional options: + + -o OUTPUT-FILE set the output file name to OUTPUT-FILE + -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-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: Index: xc/extras/freetype2/builds/unix/mkinstalldirs diff -u /dev/null xc/extras/freetype2/builds/unix/mkinstalldirs:1.1.1.1 --- /dev/null Mon Dec 18 14:22:23 2000 +++ xc/extras/freetype2/builds/unix/mkinstalldirs Fri Dec 8 16:26:09 2000 @@ -0,0 +1,40 @@ +#! /bin/sh +# mkinstalldirs --- make directory hierarchy +# Author: Noah Friedman +# Created: 1993-05-16 +# Public domain + +# $Id: mkinstalldirs,v 1.3 2000/07/24 06:03:58 werner Exp $ + +errstatus=0 + +for file +do + set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'` + shift + + pathcomp= + for d + do + pathcomp="$pathcomp$d" + case "$pathcomp" in + -* ) pathcomp=./$pathcomp ;; + esac + + if test ! -d "$pathcomp"; then + echo "mkdir $pathcomp" 1>&2 + + mkdir "$pathcomp" || lasterr=$? + + if test ! -d "$pathcomp"; then + errstatus=$lasterr + fi + fi + + pathcomp="$pathcomp/" + done +done + +exit $errstatus + +# mkinstalldirs ends here Index: xc/extras/freetype2/builds/unix/unix-cc.in diff -u /dev/null xc/extras/freetype2/builds/unix/unix-cc.in:1.1.1.1 --- /dev/null Mon Dec 18 14:22:23 2000 +++ xc/extras/freetype2/builds/unix/unix-cc.in Fri Dec 8 16:26:09 2000 @@ -0,0 +1,81 @@ +# template for Unix-specific compiler definitions +# + +CC := @CC@ + +LIBTOOL := $(BUILD)/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 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 # Don't remove this comment line! We need the space after `-o'. + + +# C flags +# +# These should concern: debug output, optimization & warnings. +# +# Use the ANSIFLAGS variable to define the compiler flags used to enfore +# ANSI compliance. +# +CFLAGS := -c @XX_CFLAGS@ @CFLAGS@ + +# 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@ + + +# Library linking +# +LINK_LIBRARY = $(LIBTOOL) --mode=link $(CCraw) -o $@ $(OBJECTS_LIST) \ + -rpath $(libdir) -version-info $(version_info) + +# EOF Index: xc/extras/freetype2/builds/unix/unix-def.in diff -u /dev/null xc/extras/freetype2/builds/unix/unix-def.in:1.1.1.1 --- /dev/null Mon Dec 18 14:22:23 2000 +++ xc/extras/freetype2/builds/unix/unix-def.in Fri Dec 8 16:26:09 2000 @@ -0,0 +1,86 @@ +# +# FreeType 2 configuration rules templates for Unix + configure +# + + +# 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. + + +ifndef TOP + TOP := . +endif +TOP := $(shell cd $(TOP); pwd) + +DELETE := @RMF@ +DELDIR := @RMDIR@ +SEP := / +HOSTSEP := $(SEP) +BUILD := $(TOP)/builds/unix +PLATFORM := unix + +# 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)/mkinstalldirs + +DISTCLEAN += $(BUILD)/config.cache \ + $(BUILD)/config.log \ + $(BUILD)/config.status \ + $(BUILD)/unix-def.mk \ + $(BUILD)/unix-cc.mk \ + $(BUILD)/ftconfig.h \ + $(BUILD)/freetype-config \ + $(LIBTOOL) + + +# Standard installation variables. +# +prefix := @prefix@ +exec_prefix := @exec_prefix@ +libdir := @libdir@ +bindir := @bindir@ +includedir := @includedir@ + +version_info := @version_info@ + + +# The directory where all object files are placed. +# +# This lets you build the library in your own directory with something like +# +# set TOP=.../path/to/freetype2/top/dir... +# set OBJ_DIR=.../path/to/obj/dir +# make -f $TOP/Makefile setup [options] +# make -f $TOP/Makefile +# +ifndef OBJ_DIR + OBJ_DIR := $(shell cd $(TOP)/obj; pwd) +endif + + +# 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 NO_OUTPUT macro is appended to command lines in order to ignore +# the output of some programs. +# +NO_OUTPUT := 2> /dev/null + +# EOF Index: xc/extras/freetype2/builds/unix/unix-dev.mk diff -u /dev/null xc/extras/freetype2/builds/unix/unix-dev.mk:1.1.1.1 --- /dev/null Mon Dec 18 14:22:23 2000 +++ xc/extras/freetype2/builds/unix/unix-dev.mk Fri Dec 8 16:26:09 2000 @@ -0,0 +1,23 @@ +# +# FreeType 2 Configuration rules for Unix + GCC +# +# 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)/builds/unix/unixddef.mk +include $(TOP)/builds/compiler/gcc-dev.mk +include $(TOP)/builds/link_std.mk + +# EOF Index: xc/extras/freetype2/builds/unix/unix-lcc.mk diff -u /dev/null xc/extras/freetype2/builds/unix/unix-lcc.mk:1.1.1.1 --- /dev/null Mon Dec 18 14:22:24 2000 +++ xc/extras/freetype2/builds/unix/unix-lcc.mk Fri Dec 8 16:26:09 2000 @@ -0,0 +1,23 @@ +# +# 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)/builds/unix/unixddef.mk +include $(TOP)/builds/compiler/unix-lcc.mk +include $(TOP)/builds/link_std.mk + +# EOF Index: xc/extras/freetype2/builds/unix/unix.mk diff -u /dev/null xc/extras/freetype2/builds/unix/unix.mk:1.1.1.1 --- /dev/null Mon Dec 18 14:22:24 2000 +++ xc/extras/freetype2/builds/unix/unix.mk Fri Dec 8 16:26:09 2000 @@ -0,0 +1,49 @@ +# +# FreeType 2 configuration rules for UNIX platforms +# + + +# 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)/builds/unix/unix-def.mk +include $(TOP)/builds/unix/unix-cc.mk + +ifdef BUILD_PROJECT + + # Now include the main sub-makefile. It contains all the rules used to + # build the library with the previous variables defined. + # + include $(TOP)/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) + +endif + +include $(TOP)/builds/unix/install.mk + +# EOF Index: xc/extras/freetype2/builds/unix/unixddef.mk diff -u /dev/null xc/extras/freetype2/builds/unix/unixddef.mk:1.1.1.1 --- /dev/null Mon Dec 18 14:22:24 2000 +++ xc/extras/freetype2/builds/unix/unixddef.mk Fri Dec 8 16:26:09 2000 @@ -0,0 +1,54 @@ +# +# FreeType 2 configuration rules templates for +# development under Unix with no configure script (gcc only) +# + + +# 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. + + +ifndef TOP + TOP := . +endif +TOP := $(shell cd $(TOP); pwd) + +DELETE := rm -f +SEP := / +HOSTSEP := $(SEP) +# we use a special devel ftoption.h +BUILD := $(TOP)/builds/unix/devel +# do not set the platform to `unix', or libtool will trick you +PLATFORM := unixdev + + +# The directory where all object files are placed. +# +ifndef OBJ_DIR + OBJ_DIR := $(shell cd $(TOP)/obj; pwd) +endif + + +# 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 Index: xc/extras/freetype2/builds/unix/devel/freetype/config/ftoption.h diff -u /dev/null xc/extras/freetype2/builds/unix/devel/freetype/config/ftoption.h:1.1.1.1 --- /dev/null Mon Dec 18 14:22:24 2000 +++ xc/extras/freetype2/builds/unix/devel/freetype/config/ftoption.h Fri Dec 8 16:26:09 2000 @@ -0,0 +1,400 @@ +/***************************************************************************/ +/* */ +/* ftoption.h */ +/* */ +/* User-selectable configuration macros (specification only). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTOPTION_H__ +#define __FTOPTION_H__ + + +#ifdef __cplusplus + extern "C" { +#endif + + + /*************************************************************************/ + /* */ + /* USER-SELECTABLE CONFIGURATION MACROS */ + /* */ + /* These macros can be toggled by developers to enable or disable */ + /* certain aspects of FreeType. This is a default file, where all major */ + /* options are enabled. */ + /* */ + /* Note that if some modifications are required for your build, we */ + /* advise you to put a modified copy of this file in your build */ + /* directory, rather than modifying it in-place. */ + /* */ + /* The build directory is normally `freetype/builds/' and */ + /* contains build or system-specific files that are included in */ + /* priority when building the library. */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** 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 ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* Convenience functions support */ + /* */ + /* Some functions of the FreeType 2 API are provided as a convenience */ + /* for client applications and developers. However, they are not */ + /* required to build and run the library itself. */ + /* */ + /* By defining this configuration macro, you'll disable the */ + /* compilation of these functions at build time. This can be useful */ + /* to reduce the library's code size when you don't need any of */ + /* these functions. */ + /* */ + /* All convenience functions are declared as such in their */ + /* documentation. */ + /* */ +#undef FT_CONFIG_OPTION_NO_CONVENIENCE_FUNCS + + + /*************************************************************************/ + /* */ + /* Alternate Glyph Image Format support */ + /* */ + /* By default, the glyph images returned by the FreeType glyph loader */ + /* can either be a pixmap or a vectorial outline defined through */ + /* Bezier control points. When defining the following configuration */ + /* macro, some font drivers will be able to register alternate */ + /* glyph image formats. */ + /* */ + /* Unset this macro if you are sure that you will never use a font */ + /* driver with an alternate glyph format; this will reduce the size of */ + /* the base layer code. */ + /* */ + /* Note that a few Type 1 fonts, as well as Windows `vector' fonts */ + /* use a vector `plotter' format that isn't supported when this */ + /* macro is undefined. */ + /* */ +#define FT_CONFIG_OPTION_ALTERNATE_GLYPH_FORMATS + + + /*************************************************************************/ + /* */ + /* Glyph Postscript Names handling */ + /* */ + /* By default, FreeType 2 is compiled with the `PSNames' module. This */ + /* 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 + + + /*************************************************************************/ + /* */ + /* Many compilers provide the non-ANSI `long long' 64-bit type. You can */ + /* activate it by defining the FTCALC_USE_LONG_LONG macro. Note that */ + /* this will produce many -ansi warnings during library compilation, and */ + /* that in many cases the generated code will not be smaller or faster! */ + /* */ +#undef FTCALC_USE_LONG_LONG + + + /*************************************************************************/ + /* */ + /* 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. */ + /* */ +#undef FT_EXPORT +#undef FT_EXPORT_DEF + + + /*************************************************************************/ + /* */ + /* 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! */ + /* */ +#define FT_DEBUG_LEVEL_ERROR +#define FT_DEBUG_LEVEL_TRACE + + + /*************************************************************************/ + /* */ + /* Computation Algorithms */ + /* */ + /* Used for debugging, this configuration macro should disappear */ + /* soon. */ + /* */ +#define FT_CONFIG_OPTION_OLD_CALCS + + + /*************************************************************************/ + /* */ + /* 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. */ + /* */ +#define FT_RENDER_POOL_SIZE 16384 + + + /*************************************************************************/ + /* */ + /* FT_MAX_MODULES */ + /* */ + /* The maximum number of modules that can be registered in a single */ + /* FreeType library object. 16 is the default. */ + /* */ +#define FT_MAX_MODULES 16 + + + /*************************************************************************/ + /* */ + /* FT_MAX_EXTENSIONS */ + /* */ + /* The maximum number of extensions that can be registered in a single */ + /* font driver. 8 is the default. */ + /* */ + /* If you don't know what this means, you certainly do not need to */ + /* change this value. */ + /* */ +#define FT_MAX_EXTENSIONS 8 + + + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** 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 + + + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** 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. */ + /* */ +#define TT_CONFIG_OPTION_BYTECODE_INTERPRETER + + + /*************************************************************************/ + /* */ + /* 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 + + + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** 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 T1_CONFIG_OPTION_DISABLE_HINTER if you want to generate a */ + /* driver with no hinter. This can be useful to debug the parser. */ + /* */ +#undef T1_CONFIG_OPTION_DISABLE_HINTER + + + /*************************************************************************/ + /* */ + /* 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 + + +#ifdef __cplusplus + } +#endif + + +#endif /* __FTOPTION_H__ */ + + +/* END */ Index: xc/extras/freetype2/builds/win32/detect.mk diff -u /dev/null xc/extras/freetype2/builds/win32/detect.mk:1.1.1.1 --- /dev/null Mon Dec 18 14:22:24 2000 +++ xc/extras/freetype2/builds/win32/detect.mk Fri Dec 8 16:26:10 2000 @@ -0,0 +1,111 @@ +# +# FreeType 2 configuration file to detect a Win32 host platform. +# + + +# 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. + + +ifeq ($(PLATFORM),ansi) + + # Detecting Windows NT is easy, as the OS variable must be defined and + # contains `Windows_NT'. Untested with Windows 2K, but I guess it should + # work... + # + ifeq ($(OS),Windows_NT) + + # Check if we are running on a CygWin system by checking the OSTYPE + # variable. + ifneq ($(OSTYPE),cygwin) + is_windows := 1 + endif + + # We test for the COMSPEC environment variable, then run the `ver' + # command-line program to see if its output contains the word `Windows'. + # + # If this is true, we are running a win32 platform (or an emulation). + # + else + ifneq ($(OSTYPE),cygwin) + ifdef COMSPEC + is_windows := $(findstring Windows,$(strip $(shell ver))) + endif + endif # test CygWin + endif # test NT + + ifdef is_windows + + PLATFORM := win32 + DELETE := del + COPY := copy + + CONFIG_FILE := w32-gcc.mk # gcc Makefile by default + SEP := / + ifeq ($(firstword $(CC)),cc) + CC := gcc + endif + + # additionally, we provide hooks for various other compilers + # + ifneq ($(findstring visualc,$(MAKECMDGOALS)),) # Visual C/C++ + CONFIG_FILE := w32-vcc.mk + SEP := $(BACKSLASH) + CC := cl + visualc: setup + endif + + ifneq ($(findstring watcom,$(MAKECMDGOALS)),) # Watcom C/C++ + CONFIG_FILE := w32-wat.mk + SEP := $(BACKSLASH) + CC := wcc386 + watcom: setup + endif + + ifneq ($(findstring visualage,$(MAKECMDGOALS)),) # Visual Age C++ + CONFIG_FILE := w32-icc.mk + SEP := $(BACKSLASH) + CC := icc + visualage: setup + endif + + ifneq ($(findstring lcc,$(MAKECMDGOALS)),) # LCC-Win32 + CONFIG_FILE := w32-lcc.mk + SEP := $(BACKSLASH) + CC := lcc + lcc: setup + endif + + ifneq ($(findstring mingw32,$(MAKECMDGOALS)),) # mingw32 + CONFIG_FILE := w32-mingw32.mk + SEP := $(BACKSLASH) + CC := gcc + mingw32: setup + endif + + ifneq ($(findstring bcc32,$(MAKECMDGOALS)),) # Borland C++ + CONFIG_FILE := w32-bcc.mk + SEP := $(BACKSLASH) + CC := bcc32 + bcc32: setup + endif + + ifneq ($(findstring devel,$(MAKECMDGOALS)),) # development target + CONFIG_FILE := w32-dev.mk + CC := gcc + SEP := / + devel: setup + endif + + setup: dos_setup + + endif # test is_windows +endif # test PLATFORM + +# EOF Index: xc/extras/freetype2/builds/win32/w32-bcc.mk diff -u /dev/null xc/extras/freetype2/builds/win32/w32-bcc.mk:1.1.1.1 --- /dev/null Mon Dec 18 14:22:24 2000 +++ xc/extras/freetype2/builds/win32/w32-bcc.mk Fri Dec 8 16:26:10 2000 @@ -0,0 +1,23 @@ +# +# FreeType 2 Borland C++ on Win32 +# + + +# 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)/builds/win32/win32-def.mk +include $(TOP)/builds/compiler/bcc.mk + +# include linking instructions +include $(TOP)/builds/link_dos.mk + +# EOF Index: xc/extras/freetype2/builds/win32/w32-bccd.mk diff -u /dev/null xc/extras/freetype2/builds/win32/w32-bccd.mk:1.1.1.1 --- /dev/null Mon Dec 18 14:22:24 2000 +++ xc/extras/freetype2/builds/win32/w32-bccd.mk Fri Dec 8 16:26:10 2000 @@ -0,0 +1,23 @@ +# +# FreeType 2 Borland C++ on Win32 + debugging +# + + +# 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)/builds/win32/win32-def.mk +include $(TOP)/builds/compiler/bcc-dev.mk + +# include linking instructions +include $(TOP)/builds/link_dos.mk + +# EOF Index: xc/extras/freetype2/builds/win32/w32-dev.mk diff -u /dev/null xc/extras/freetype2/builds/win32/w32-dev.mk:1.1.1.1 --- /dev/null Mon Dec 18 14:22:24 2000 +++ xc/extras/freetype2/builds/win32/w32-dev.mk Fri Dec 8 16:26:10 2000 @@ -0,0 +1,35 @@ +# +# FreeType 2 configuration rules for Win32 + GCC +# +# Development version without optimizations. +# + + +# 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. + + +# NOTE: This version requires that GNU Make is invoked from the Windows +# Shell (_not_ Cygwin BASH)! +# + +ifndef TOP + TOP := . +endif + +SEP := / +BUILD := $(TOP)/builds/win32/devel + +include $(TOP)/builds/win32/win32-def.mk +include $(TOP)/builds/compiler/gcc-dev.mk + +# include linking instructions +include $(TOP)/builds/link_dos.mk + +# EOF Index: xc/extras/freetype2/builds/win32/w32-gcc.mk diff -u /dev/null xc/extras/freetype2/builds/win32/w32-gcc.mk:1.1.1.1 --- /dev/null Mon Dec 18 14:22:24 2000 +++ xc/extras/freetype2/builds/win32/w32-gcc.mk Fri Dec 8 16:26:10 2000 @@ -0,0 +1,29 @@ +# +# FreeType 2 configuration rules for Win32 + 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. + + +# the separator must be set before including win32-def +# as it defaults to "\" on Win32 +SEP := / + +# include Win32-specific definitions +include $(TOP)/builds/win32/win32-def.mk + +# include gcc-specific definitions +include $(TOP)/builds/compiler/gcc.mk + +# include linking instructions +include $(TOP)/builds/link_dos.mk + +# EOF Index: xc/extras/freetype2/builds/win32/w32-icc.mk diff -u /dev/null xc/extras/freetype2/builds/win32/w32-icc.mk:1.1.1.1 --- /dev/null Mon Dec 18 14:22:24 2000 +++ xc/extras/freetype2/builds/win32/w32-icc.mk Fri Dec 8 16:26:10 2000 @@ -0,0 +1,22 @@ +# +# FreeType 2 configuration rules for Win32 + IBM Visual Age C++ +# + + +# 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)/builds/win32/win32-def.mk +include $(TOP)/builds/compiler/visualage.mk + +# include linking instructions +include $(TOP)/builds/link_dos.mk + +# EOF Index: xc/extras/freetype2/builds/win32/w32-lcc.mk diff -u /dev/null xc/extras/freetype2/builds/win32/w32-lcc.mk:1.1.1.1 --- /dev/null Mon Dec 18 14:22:24 2000 +++ xc/extras/freetype2/builds/win32/w32-lcc.mk Fri Dec 8 16:26:10 2000 @@ -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)/builds/win32/win32-def.mk +include $(TOP)/builds/compiler/win-lcc.mk + +# include linking instructions +include $(TOP)/builds/link_dos.mk + +# EOF + Index: xc/extras/freetype2/builds/win32/w32-mingw32.mk diff -u /dev/null xc/extras/freetype2/builds/win32/w32-mingw32.mk:1.1.1.1 --- /dev/null Mon Dec 18 14:22:24 2000 +++ xc/extras/freetype2/builds/win32/w32-mingw32.mk Fri Dec 8 16:26:10 2000 @@ -0,0 +1,31 @@ +# +# FreeType 2 configuration rules for mingw32 +# + + +# 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. + + +# the separator must be set before including win32-def +# as it defaults to "\" on Win32 +SEP := / + +# include Win32-specific definitions +include $(TOP)/builds/win32/win32-def.mk + +LIBRARY := lib$(PROJECT) + +# include gcc-specific definitions +include $(TOP)/builds/compiler/gcc.mk + +# include linking instructions +include $(TOP)/builds/link_dos.mk + +# EOF Index: xc/extras/freetype2/builds/win32/w32-vcc.mk diff -u /dev/null xc/extras/freetype2/builds/win32/w32-vcc.mk:1.1.1.1 --- /dev/null Mon Dec 18 14:22:24 2000 +++ xc/extras/freetype2/builds/win32/w32-vcc.mk Fri Dec 8 16:26:10 2000 @@ -0,0 +1,23 @@ +# +# FreeType 2 Visual C++ on Win32 +# + + +# 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)/builds/win32/win32-def.mk +include $(TOP)/builds/compiler/visualc.mk + +# include linking instructions +include $(TOP)/builds/link_dos.mk + +# EOF Index: xc/extras/freetype2/builds/win32/win32-def.mk diff -u /dev/null xc/extras/freetype2/builds/win32/win32-def.mk:1.1.1.1 --- /dev/null Mon Dec 18 14:22:25 2000 +++ xc/extras/freetype2/builds/win32/win32-def.mk Fri Dec 8 16:26:10 2000 @@ -0,0 +1,61 @@ +# +# FreeType 2 Win32 specific definitions +# + + +# 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. + + +DELETE := del +HOSTSEP := $(strip \ ) +BUILD := $(TOP)$(SEP)config$(SEP)win32 +PLATFORM := win32 + +# by default, we use "\" as a separator on Win32 +# but certain compilers accept "/" as well +# +ifndef SEP + SEP := $(HOSTSEP) +endif + + +# The directory where all object files are placed. +# +# This lets you build the library in your own directory with something like +# +# set TOP=.../path/to/freetype2/top/dir... +# set OBJ_DIR=.../path/to/obj/dir +# make -f %TOP%/Makefile setup [options] +# make -f %TOP%/Makefile +# +ifndef OBJ_DIR + OBJ_DIR := $(TOP)$(SEP)obj +endif + + +# 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 Index: xc/extras/freetype2/builds/win32/devel/freetype/config/ftoption.h diff -u /dev/null xc/extras/freetype2/builds/win32/devel/freetype/config/ftoption.h:1.1.1.1 --- /dev/null Mon Dec 18 14:22:25 2000 +++ xc/extras/freetype2/builds/win32/devel/freetype/config/ftoption.h Fri Dec 8 16:26:10 2000 @@ -0,0 +1,400 @@ +/***************************************************************************/ +/* */ +/* ftoption.h */ +/* */ +/* User-selectable configuration macros (specification only). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTOPTION_H__ +#define __FTOPTION_H__ + + +#ifdef __cplusplus + extern "C" { +#endif + + + /*************************************************************************/ + /* */ + /* USER-SELECTABLE CONFIGURATION MACROS */ + /* */ + /* These macros can be toggled by developers to enable or disable */ + /* certain aspects of FreeType. This is a default file, where all major */ + /* options are enabled. */ + /* */ + /* Note that if some modifications are required for your build, we */ + /* advise you to put a modified copy of this file in your build */ + /* directory, rather than modifying it in-place. */ + /* */ + /* The build directory is normally `freetype/builds/' and */ + /* contains build or system-specific files that are included in */ + /* priority when building the library. */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** 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 ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* Convenience functions support */ + /* */ + /* Some functions of the FreeType 2 API are provided as a convenience */ + /* for client applications and developers. However, they are not */ + /* required to build and run the library itself. */ + /* */ + /* By defining this configuration macro, you'll disable the */ + /* compilation of these functions at build time. This can be useful */ + /* to reduce the library's code size when you don't need any of */ + /* these functions. */ + /* */ + /* All convenience functions are declared as such in their */ + /* documentation. */ + /* */ +#undef FT_CONFIG_OPTION_NO_CONVENIENCE_FUNCS + + + /*************************************************************************/ + /* */ + /* Alternate Glyph Image Format support */ + /* */ + /* By default, the glyph images returned by the FreeType glyph loader */ + /* can either be a pixmap or a vectorial outline defined through */ + /* Bezier control points. When defining the following configuration */ + /* macro, some font drivers will be able to register alternate */ + /* glyph image formats. */ + /* */ + /* Unset this macro if you are sure that you will never use a font */ + /* driver with an alternate glyph format; this will reduce the size of */ + /* the base layer code. */ + /* */ + /* Note that a few Type 1 fonts, as well as Windows `vector' fonts */ + /* use a vector `plotter' format that isn't supported when this */ + /* macro is undefined. */ + /* */ +#define FT_CONFIG_OPTION_ALTERNATE_GLYPH_FORMATS + + + /*************************************************************************/ + /* */ + /* Glyph Postscript Names handling */ + /* */ + /* By default, FreeType 2 is compiled with the `PSNames' module. This */ + /* 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 + + + /*************************************************************************/ + /* */ + /* Many compilers provide the non-ANSI `long long' 64-bit type. You can */ + /* activate it by defining the FTCALC_USE_LONG_LONG macro. Note that */ + /* this will produce many -ansi warnings during library compilation, and */ + /* that in many cases the generated code will not be smaller or faster! */ + /* */ +#undef FTCALC_USE_LONG_LONG + + + /*************************************************************************/ + /* */ + /* 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. */ + /* */ +#undef FT_EXPORT +#undef FT_EXPORT_DEF + + + /*************************************************************************/ + /* */ + /* 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! */ + /* */ +#define FT_DEBUG_LEVEL_ERROR +#define FT_DEBUG_LEVEL_TRACE + + + /*************************************************************************/ + /* */ + /* Computation Algorithms */ + /* */ + /* Used for debugging, this configuration macro should disappear */ + /* soon. */ + /* */ +#define FT_CONFIG_OPTION_OLD_CALCS + + + /*************************************************************************/ + /* */ + /* 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. */ + /* */ +#define FT_RENDER_POOL_SIZE 16384 + + + /*************************************************************************/ + /* */ + /* FT_MAX_MODULES */ + /* */ + /* The maximum number of modules that can be registered in a single */ + /* FreeType library object. 16 is the default. */ + /* */ +#define FT_MAX_MODULES 16 + + + /*************************************************************************/ + /* */ + /* FT_MAX_EXTENSIONS */ + /* */ + /* The maximum number of extensions that can be registered in a single */ + /* font driver. 8 is the default. */ + /* */ + /* If you don't know what this means, you certainly do not need to */ + /* change this value. */ + /* */ +#define FT_MAX_EXTENSIONS 8 + + + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** 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 + + + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** 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. */ + /* */ +#define TT_CONFIG_OPTION_BYTECODE_INTERPRETER + + + /*************************************************************************/ + /* */ + /* 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 + + + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** 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 T1_CONFIG_OPTION_DISABLE_HINTER if you want to generate a */ + /* driver with no hinter. This can be useful to debug the parser. */ + /* */ +#undef T1_CONFIG_OPTION_DISABLE_HINTER + + + /*************************************************************************/ + /* */ + /* 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 + + +#ifdef __cplusplus + } +#endif + + +#endif /* __FTOPTION_H__ */ + + +/* END */ Index: xc/extras/freetype2/builds/win32/visualc/freetype.dsp diff -u /dev/null xc/extras/freetype2/builds/win32/visualc/freetype.dsp:1.1.1.1 --- /dev/null Mon Dec 18 14:22:25 2000 +++ xc/extras/freetype2/builds/win32/visualc/freetype.dsp Fri Dec 8 16:26:10 2000 @@ -0,0 +1,229 @@ +# 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 Multithreaded +!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 Multithreaded" +!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 + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName ""$/DEV/freetype", KAOAAAAA" +# 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 "obj/release" +# PROP Intermediate_Dir "obj/release" +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c +# ADD 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 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:"lib\freetype200b8.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 "obj/debug" +# PROP Intermediate_Dir "obj/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 /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 CPP /X +# 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:"lib\freetype200b8_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 "obj/debug_mt" +# PROP Intermediate_Dir "obj/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 /nologo /MTd /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 CPP /X +# 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\freetype200b8_D.lib" +# ADD LIB32 /nologo /out:"lib\freetype200b8MT_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 "obj/release_mt" +# PROP Intermediate_Dir "obj/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 /nologo /MT /Za /W3 /GX /O2 /I "..\freetype\include\\" /D "NDEBUG" /D "WIN32" /D "_MBCS" /D "_LIB" /D "FT_FLAT_COMPILE" /YX /FD /c +# 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\freetype200b8.lib" +# ADD LIB32 /nologo /out:"lib\freetype200b8MT.lib" + +!ENDIF + +# Begin Target + +# Name "freetype - Win32 Release" +# Name "freetype - Win32 Debug" +# Name "freetype - Win32 Debug Multithreaded" +# Name "freetype - Win32 Release Multithreaded" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=.\src\autohint\autohint.c +# End Source File +# Begin Source File + +SOURCE=.\src\cff\cff.c +# End Source File +# Begin Source File + +SOURCE=.\src\base\ftbase.c +# End Source File +# Begin Source File + +SOURCE=.\src\base\ftdebug.c +# End Source File +# Begin Source File + +SOURCE=.\src\base\ftglyph.c +# End Source File +# Begin Source File + +SOURCE=.\src\base\ftinit.c +# End Source File +# Begin Source File + +SOURCE=.\src\base\ftmm.c +# End Source File +# Begin Source File + +SOURCE=.\src\base\ftsystem.c +# End Source File +# Begin Source File + +SOURCE=.\src\psnames\psmodule.c +# End Source File +# Begin Source File + +SOURCE=.\src\raster\raster.c +# End Source File +# Begin Source File + +SOURCE=.\src\sfnt\sfnt.c +# End Source File +# Begin Source File + +SOURCE=.\src\smooth\smooth.c +# End Source File +# Begin Source File + +SOURCE=.\src\truetype\truetype.c +# End Source File +# Begin Source File + +SOURCE=.\src\cid\type1cid.c +# End Source File +# Begin Source File + +SOURCE=.\src\type1\type1.c +# End Source File +# Begin Source File + +SOURCE=.\src\winfonts\winfnt.c +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# Begin Source File + +SOURCE=.\include\freetype\freetype.h +# End Source File +# Begin Source File + +SOURCE=.\include\freetype\config\ftconfig.h +# End Source File +# Begin Source File + +SOURCE=.\include\freetype\fterrors.h +# End Source File +# Begin Source File + +SOURCE=.\include\freetype\config\ftoption.h +# End Source File +# Begin Source File + +SOURCE=.\include\freetype\fttypes.h +# End Source File +# End Group +# End Target +# End Project Index: xc/extras/freetype2/builds/win32/visualc/freetype.dsw diff -u /dev/null xc/extras/freetype2/builds/win32/visualc/freetype.dsw:1.1.1.1 --- /dev/null Mon Dec 18 14:22:25 2000 +++ xc/extras/freetype2/builds/win32/visualc/freetype.dsw Fri Dec 8 16:26:10 2000 @@ -0,0 +1,94 @@ +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> +{{{ + begin source code control + "$/DEV/freetype", KAOAAAAA + . + end source code control +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "ftdump"=.\ftdump.dsp - Package Owner=<4> + +Package=<5> +{{{ + begin source code control + "$/DEV/freetype", KAOAAAAA + . + end source code control +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name freetype + End Project Dependency +}}} + +############################################################################### + +Project: "ftstring"=.\ftstring.dsp - Package Owner=<4> + +Package=<5> +{{{ + begin source code control + "$/DEV/freetype", KAOAAAAA + . + end source code control +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name freetype + End Project Dependency +}}} + +############################################################################### + +Project: "ftview"=.\ftview.dsp - Package Owner=<4> + +Package=<5> +{{{ + begin source code control + "$/DEV/freetype", KAOAAAAA + . + end source code control +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name freetype + End Project Dependency +}}} + +############################################################################### + +Global: + +Package=<5> +{{{ + begin source code control + "$/DEV/freetype", KAOAAAAA + . + end source code control +}}} + +Package=<3> +{{{ +}}} + +############################################################################### + Index: xc/extras/freetype2/builds/win32/visualc/ftdump.dsp diff -u /dev/null xc/extras/freetype2/builds/win32/visualc/ftdump.dsp:1.1.1.1 --- /dev/null Mon Dec 18 14:22:25 2000 +++ xc/extras/freetype2/builds/win32/visualc/ftdump.dsp Fri Dec 8 16:26:10 2000 @@ -0,0 +1,118 @@ +# Microsoft Developer Studio Project File - Name="ftdump" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Console Application" 0x0103 + +CFG=ftdump - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "ftdump.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 "ftdump.mak" CFG="ftdump - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "ftdump - Win32 Release" (based on "Win32 (x86) Console Application") +!MESSAGE "ftdump - Win32 Debug" (based on "Win32 (x86) Console Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName ""$/DEV/freetype", KAOAAAAA" +# PROP Scc_LocalPath "." +CPP=cl.exe +RSC=rc.exe + +!IF "$(CFG)" == "ftdump - 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 "demos/obj/ftdump/release" +# PROP Intermediate_Dir "demos/obj/ftdump/release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c +# ADD CPP /nologo /W3 /GX /O2 /I "..\freetype\include\\" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib lib\freetype200b8.lib /nologo /subsystem:console /machine:I386 +# Begin Special Build Tool +TargetPath=.\demos\obj\ftdump\release\ftdump.exe +TargetName=ftdump +SOURCE="$(InputPath)" +PostBuild_Cmds=echo copy $(TargetPath) .\demos\bin\$(TargetName).exe copy $(TargetPath) .\demos\bin\$(TargetName).exe +# End Special Build Tool + +!ELSEIF "$(CFG)" == "ftdump - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "ftdump___Win32_Debug" +# PROP BASE Intermediate_Dir "ftdump___Win32_Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "demos/obj/ftdump/debug" +# PROP Intermediate_Dir "demos/obj/ftdump/debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c +# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "..\freetype\include\\" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib lib\freetype200b8_D.lib /nologo /subsystem:console /debug /machine:I386 /out:"demos/obj/ftdump/debug/ftdump_D.exe" /pdbtype:sept +# Begin Special Build Tool +TargetPath=.\demos\obj\ftdump\debug\ftdump_D.exe +TargetName=ftdump_D +SOURCE="$(InputPath)" +PostBuild_Cmds=echo copy $(TargetPath) .\demos\bin\$(TargetName).exe copy $(TargetPath) .\demos\bin\$(TargetName).exe +# End Special Build Tool + +!ENDIF + +# Begin Target + +# Name "ftdump - Win32 Release" +# Name "ftdump - Win32 Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=.\demos\src\common.c +# End Source File +# Begin Source File + +SOURCE=.\demos\src\ftdump.c +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# End Group +# Begin Group "Resource Files" + +# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" +# End Group +# End Target +# End Project Index: xc/extras/freetype2/builds/win32/visualc/ftstring.dsp diff -u /dev/null xc/extras/freetype2/builds/win32/visualc/ftstring.dsp:1.1.1.1 --- /dev/null Mon Dec 18 14:22:25 2000 +++ xc/extras/freetype2/builds/win32/visualc/ftstring.dsp Fri Dec 8 16:26:10 2000 @@ -0,0 +1,142 @@ +# Microsoft Developer Studio Project File - Name="ftstring" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Console Application" 0x0103 + +CFG=ftstring - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "ftstring.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 "ftstring.mak" CFG="ftstring - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "ftstring - Win32 Release" (based on "Win32 (x86) Console Application") +!MESSAGE "ftstring - Win32 Debug" (based on "Win32 (x86) Console Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName ""$/DEV/freetype", KAOAAAAA" +# PROP Scc_LocalPath "." +CPP=cl.exe +RSC=rc.exe + +!IF "$(CFG)" == "ftstring - 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 "demos/obj/ftstring/release" +# PROP Intermediate_Dir "demos/obj/ftstring/release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c +# ADD CPP /nologo /W3 /GX /O2 /I "..\freetype\include\\" /I "demos\graph" /I "demos\graph\win32" /D "NDEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /D "FT_FLAT_COMPILE" /D "DEVICE_WIN32" /YX /FD /c +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib lib\freetype200b8.lib /nologo /subsystem:console /machine:I386 +# Begin Special Build Tool +TargetPath=.\demos\obj\ftstring\release\ftstring.exe +TargetName=ftstring +SOURCE="$(InputPath)" +PostBuild_Cmds=echo copy $(TargetPath) .\demos\bin\$(TargetName).exe copy $(TargetPath) .\demos\bin\$(TargetName).exe +# End Special Build Tool + +!ELSEIF "$(CFG)" == "ftstring - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "ftstring___Win32_Debug" +# PROP BASE Intermediate_Dir "ftstring___Win32_Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "demos/obj/ftstring/debug" +# PROP Intermediate_Dir "demos/obj/ftstring/debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c +# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "..\freetype\include\\" /I "demos\graph" /I "demos\graph\win32" /D "_DEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /D "FT_FLAT_COMPILE" /D "DEVICE_WIN32" /YX /FD /GZ /c +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib lib\freetype200b8_D.lib /nologo /subsystem:console /debug /machine:I386 /out:"demos/obj/ftstring/debug/ftstring_D.exe" /pdbtype:sept +# Begin Special Build Tool +TargetPath=.\demos\obj\ftstring\debug\ftstring_D.exe +TargetName=ftstring_D +SOURCE="$(InputPath)" +PostBuild_Cmds=echo copy $(TargetPath) .\demos\bin\$(TargetName).exe copy $(TargetPath) .\demos\bin\$(TargetName).exe +# End Special Build Tool + +!ENDIF + +# Begin Target + +# Name "ftstring - Win32 Release" +# Name "ftstring - Win32 Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=.\demos\src\common.c +# End Source File +# Begin Source File + +SOURCE=.\demos\src\ftstring.c +# End Source File +# Begin Source File + +SOURCE=.\demos\graph\grblit.c +# End Source File +# Begin Source File + +SOURCE=.\demos\graph\grdevice.c +# End Source File +# Begin Source File + +SOURCE=.\demos\graph\grfont.c +# End Source File +# Begin Source File + +SOURCE=.\demos\graph\grinit.c +# End Source File +# Begin Source File + +SOURCE=.\demos\graph\grobjs.c +# End Source File +# Begin Source File + +SOURCE=.\demos\graph\win32\grwin32.c +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# End Group +# Begin Group "Resource Files" + +# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" +# End Group +# End Target +# End Project Index: xc/extras/freetype2/builds/win32/visualc/ftview.dsp diff -u /dev/null xc/extras/freetype2/builds/win32/visualc/ftview.dsp:1.1.1.1 --- /dev/null Mon Dec 18 14:22:25 2000 +++ xc/extras/freetype2/builds/win32/visualc/ftview.dsp Fri Dec 8 16:26:11 2000 @@ -0,0 +1,142 @@ +# Microsoft Developer Studio Project File - Name="ftview" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Console Application" 0x0103 + +CFG=ftview - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "ftview.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 "ftview.mak" CFG="ftview - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "ftview - Win32 Release" (based on "Win32 (x86) Console Application") +!MESSAGE "ftview - Win32 Debug" (based on "Win32 (x86) Console Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName ""$/DEV/freetype", KAOAAAAA" +# PROP Scc_LocalPath "." +CPP=cl.exe +RSC=rc.exe + +!IF "$(CFG)" == "ftview - 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 "demos/obj/ftview/release" +# PROP Intermediate_Dir "demos/obj/ftview/release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c +# ADD CPP /nologo /W3 /GX /O2 /I "..\freetype\include\\" /I "demos\graph" /I "demos\graph\win32" /D "NDEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /D "FT_FLAT_COMPILE" /D "DEVICE_WIN32" /YX /FD /c +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib lib\freetype200b8.lib /nologo /subsystem:console /machine:I386 +# Begin Special Build Tool +TargetPath=.\demos\obj\ftview\release\ftview.exe +TargetName=ftview +SOURCE="$(InputPath)" +PostBuild_Cmds=echo copy $(TargetPath) .\demos\bin\$(TargetName).exe copy $(TargetPath) .\demos\bin\$(TargetName).exe +# End Special Build Tool + +!ELSEIF "$(CFG)" == "ftview - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "ftview___Win32_Debug" +# PROP BASE Intermediate_Dir "ftview___Win32_Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "demos/obj/ftview/debug" +# PROP Intermediate_Dir "demos/obj/ftview/debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c +# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "..\freetype\include\\" /I "demos\graph" /I "demos\graph\win32" /D "_DEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /D "FT_FLAT_COMPILE" /D "DEVICE_WIN32" /YX /FD /GZ /c +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib lib\freetype200b8_D.lib /nologo /subsystem:console /debug /machine:I386 /out:"demos/obj/ftview/debug/ftview_D.exe" /pdbtype:sept +# Begin Special Build Tool +TargetPath=.\demos\obj\ftview\debug\ftview_D.exe +TargetName=ftview_D +SOURCE="$(InputPath)" +PostBuild_Cmds=echo copy $(TargetPath) .\demos\bin\$(TargetName).exe copy $(TargetPath) .\demos\bin\$(TargetName).exe +# End Special Build Tool + +!ENDIF + +# Begin Target + +# Name "ftview - Win32 Release" +# Name "ftview - Win32 Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=.\demos\src\common.c +# End Source File +# Begin Source File + +SOURCE=.\demos\src\ftview.c +# End Source File +# Begin Source File + +SOURCE=.\demos\graph\grblit.c +# End Source File +# Begin Source File + +SOURCE=.\demos\graph\grdevice.c +# End Source File +# Begin Source File + +SOURCE=.\demos\graph\grfont.c +# End Source File +# Begin Source File + +SOURCE=.\demos\graph\grinit.c +# End Source File +# Begin Source File + +SOURCE=.\demos\graph\grobjs.c +# End Source File +# Begin Source File + +SOURCE=.\demos\graph\win32\grwin32.c +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# End Group +# Begin Group "Resource Files" + +# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" +# End Group +# End Target +# End Project Index: xc/extras/freetype2/builds/win32/visualc/index.html diff -u /dev/null xc/extras/freetype2/builds/win32/visualc/index.html:1.1.1.1 --- /dev/null Mon Dec 18 14:22:25 2000 +++ xc/extras/freetype2/builds/win32/visualc/index.html Fri Dec 8 16:26:11 2000 @@ -0,0 +1,91 @@ + + +Freetype2 (for Windows) + + + + + + + + + +
welcomepersonalzeberdeefreetype
+ + + + + + +
welcomepersonalzeberdeefor + Windows

+
+ +

Freetype (for Windows)

+
+ +

Information

+

To learn all about Freetype, visit here.

+
+ +

Freetype for Windows

+

One of the problems with The Freetype Project is that it doesn’t come with +any nice workspace and project files for use with MS Visual C++.

+

So, as I’ve been using Freetype within some of my own software, I’ve had to +create these file for myself, and I herewith provide them back to the open +source community.

+

The usual rules apply:

+
    +
  • These files should be considered to be under the same licence agreement as + The FreeType Project itself. +
  • Don’t blame me if they don’t work on your system... but please do contact me and I’ll + try to sort things out. +
  • YMMV
+
+ +

Download

+

You can download: +

+

+
+ +

How to use the Workspace and Project Files

+

These are some quick note that I’ve put together to help you get started. I +hope they make sense ;-)

+

The project files have been set up in such a manner than no changes are +necessary to either the Freetype2 source code, or any environment or VC settings +for things like include folders, etc... in other words, this is a very clean +implementation.

+

Note the following:

+
    +
  • The workspace and project files should be put in your ‘freetype’ + directory. +
  • It is assumed that the sample applications are in a directory called + ‘demos’ in your ‘freetype’ directory.
+

When you open up the workspace, and perhaps also the project files within, +you might get some error message to do with Visual Source Safe... do not panic, +and simply ignore these warnings, choose not to use VSS in future, save the +workspace/project files, and all should be well.

+

The ‘freetype’ project build a static library. There are four build +options, which will result in the following being generated into the ‘lib’ +directory in your ‘freetype’ directory):

+
    +
  • freetype200b8.lib - release build; single-threaded +
  • freetype200b8_D.lib - debug build; single-threaded +
  • freetype200b8MT.lib - release build; multi-threaded +
  • freetype200b8MT_D.lib - debug build; multi-threaded
+

The ‘ftdump’, ‘ftstring’, and ‘ftview’ projects build the respective sample +applications. The binaries are placed into the ‘bin’ directory in the ‘demos’ +directory. Note that if you build the debug versions, the filenames have a ‘_D’ +suffix.

+
+
+ Index: xc/extras/freetype2/docs/BUILD diff -u /dev/null xc/extras/freetype2/docs/BUILD:1.1.1.1 --- /dev/null Mon Dec 18 14:22:25 2000 +++ xc/extras/freetype2/docs/BUILD Fri Dec 8 16:26:11 2000 @@ -0,0 +1,268 @@ + + FreeType 2 compilation how-to + ============================= + + +Introduction +------------ + +Welcome to the FreeType 2 library. You'll find in this document +instructions on how to compile the library on your favorite platform. + + +I. QUICK COMMAND-LINE GUIDE +--------------------------- + + Install GNU Make, then try the following on Unix or any system with + gcc: + + make // this will setup the build + make // this will build the library + + On Win32 + Visual C++: + + make setup visualc // setup the build for VisualC++ on Win32 + make // build the library + + Then, go to the `demos' directory and type + + make + + + Note that on Unix, the first `make' invocation will run a configure + script (which is located in `freetype2/builds/unix/'. You can also + pass parameters to this script with the CFG variable, as in: + + make CFG="--prefix=/usr/local" + make + + + If this doesn't work, read the following. + + +II. COMMAND-LINE COMPILATION +---------------------------- + + Note that if you do not want to compile FreeType 2 from a command + line shell, please skip to section III below (DETAILED COMPILATION). + + 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: + + a. 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 -- trying to build the library with any other Make tool will + *fail*. + + Make sure that you are invoking GNU Make from the command line, by + typing something like: + + make -v + + to display its version number. + + b. 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. + ============================================================= + + + If the detected settings correspond to your platform and compiler, + skip to step e. Note that if your platform is completely alien to + the build system, the detected platform will be `ansi'. + + c. 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 defaut compiler), invoke GNU Make + with + + make setup + + For example: + + to use Visual C++ on Win32, type: "make setup visualc" + to use LCC-Win32 on Win32, type: "make setup lcc" + + The name to use is platform-dependent. The list of + available compilers for your system is available in the file + `builds//detect.mk' (note that we hope to make the list + displayed at user demand in the final release). + + If you are satisfied by the new configuration summary, skip to + step e. + + d. 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 e. + + 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'. + + e. 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. + + To launch the build, simply invoke GNU Make again: The top + Makefile will detect the configuration file and run the build with + it. + + f. Build the demonstration programs + + +III. DETAILED COMPILATION PROCEDURE +----------------------------------- + + If you don't want to compile FreeType 2 from the command-line (for + example if you use a graphical IDE on a Mac or Windows), you will + need to understand how the FreeType files are organized. + + FreeType 2 has a very modular design, and it is made of several + components. Each component must be compiled as a stand-alone object + file, even if it is really made of several C source files. For + example, the `base layer' component is made of the following C + files: + + src/ + base/ + ftcalc.c - computations + ftextend.c - extensions support + ftlist.c - simple list management + ftobjs.c - object management + ftoutln.c - simple outline processing + ftstream.c - stream input + + However, you can create a single object file by compiling the file + `src/base/ftbase.c', which basically contains + + #include + #include + #include + #include + #include + #include + + Similarly, each component has a single `englobing' C file to compile + it as a stand-alone object: + + src/autohint/autohint.c - the autohinting module + src/base/ftbase.c - the base layer, high-level interface + src/cache/ftcache.c - a glyph and image caching system + (still experimental) + src/cff/cff.c - the OpenType font driver + src/cid/type1cid.c - the CID-keyed font driver + src/psaux/psaux.c - the PS support module + src/psnames/psnames.c - a support module to handle PS glyph + names + src/raster1/raster1.c - the monochrome raster module + src/sfnt/sfnt.c - the `sfnt' module + src/smooth/smooth.c - the anti-aliasing raster module + src/truetype/truetype.c - the TrueType font driver + src/type1/type1.c - the Type 1 font driver + + The last module of FreeType 2, winfonts (implementing support for + Windows FNT format), is a single file. + + To compile one component, do the following: + + - Add the top-level `include' directory to your compilation + include path + + - Add the `src' directory to your compilation include path. + + - Compile the component `source' file (see list below); you don't + need to be in the component's directory. + + For example, the following line can be used to compile the truetype + driver on Unix: + + cd freetype2/ + cc -c -Iinclude -Isrc src/truetype/truetype.c + + Alternatively: + + cd freetype2/src/truetype + cc -c -I../../include -I.. truetype.c + + Finally, FreeType 2 contains some other components: + + src/base/ftsystem.c - system-specific memory and i/o support + src/base/ftinit.c - initialization layer + src/base/ftdebug.c - debugging component (empty in release + build) + src/base/ftglyph.c - optional convenience functions + + All font drivers are optional. The `sfnt', `psaux', and `psnames' + modules are mandatory for certain drivers. However, you may need to + update the list of drivers that are statically linked to the + library, which is located in the configuration file + `include/freetype/config/ftmodule.h'. + + +IV. Support for flat-directory compilation +------------------------------------------ + + It is now possible to put all FreeType 2 source files into a single + directory, with the exception of the `include' hierarchy. + + Note that you still need to only compile the `wrapper' sources + described above. Define the `FT_FLAT_COMPILE' macro when + compiling. Here an example: + + 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 -DFT_FLAT_COMPILE -Ifreetype2/include ftsystem.c + cc -c -DFT_FLAT_COMPILE -Ifreetype2/include ftinit.c + cc -c -DFT_FLAT_COMPILE -Ifreetype2/include ftdebug.c + cc -c -DFT_FLAT_COMPILE -Ifreetype2/include ftbase.c + etc. + + +End of file Index: xc/extras/freetype2/docs/FTL.txt diff -u /dev/null xc/extras/freetype2/docs/FTL.txt:1.1.1.1 --- /dev/null Mon Dec 18 14:22:25 2000 +++ xc/extras/freetype2/docs/FTL.txt Fri Dec 8 16:26:11 2000 @@ -0,0 +1,164 @@ + The FreeType Project LICENSE + ---------------------------- + + 2000-Feb-08 + + Copyright 1996-2000 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. + + +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 + (`LICENSE.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@freetype.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 devel@freetype.org + + Discusses bugs, as well as engine internals, design issues, + specific licenses, porting, etc. + + o http://www.freetype.org + + Holds the current FreeType web page, which will allow you to + download our latest development version and read online + documentation. + + You can also contact us individually at: + + David Turner + Robert Wilhelm + Werner Lemberg + + +--- end of LICENSE.TXT --- Index: xc/extras/freetype2/docs/GPL.txt diff -u /dev/null xc/extras/freetype2/docs/GPL.txt:1.1.1.1 --- /dev/null Mon Dec 18 14:22:25 2000 +++ xc/extras/freetype2/docs/GPL.txt Fri Dec 8 16:26:11 2000 @@ -0,0 +1,339 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1990, 1991, 1992 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. + + 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 + + Appendix: 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) 19yy + + 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., 675 Mass Ave, Cambridge, MA 02139, 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) 19yy 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. Index: xc/extras/freetype2/docs/convntns.txt diff -u /dev/null xc/extras/freetype2/docs/convntns.txt:1.1.1.1 --- /dev/null Mon Dec 18 14:22:25 2000 +++ xc/extras/freetype2/docs/convntns.txt Fri Dec 8 16:26:11 2000 @@ -0,0 +1,710 @@ + + Conventions and Design in the FreeType 2 library + ------------------------------------------------ + + +Table of Contents + +Introduction + +I. Style and Formatting + + 1. Naming + 2. Declarations & Statements + 3. Blocks + 4. Macros + 5. Conventions + +II. Design conventions + + 1. Modularity and Components Layout + 2. Configuration and Debugging + +III. Usage conventions + + 1. Error handling + 2. Font File I/O + 3. Memory management + 4. Support for threaded environments + 5. Object Management + + + +Introduction +============ + +This text introduces the many conventions used within the FreeType 2 +library code. Please read it before trying any modifications or +extensions of the source code. + + + +I. Style and Formatting +======================= + +The following coding rules are extremely important to keep the +library's source code homogeneously. Keep in mind the following +points: + + - `Humans read source code, not machines' (Donald Knuth) + + The library source code should be as readable as possible, even + by non-C experts. With `readable', two things are meant: First, + the source code should be pleasant to the eye, with sufficient + whitespace and newlines, to not look like a boring stack of + characters stuck to each other. Second, the source should be + _expressive_ enough about its goals. This convention contains + rules that can help the source focus on its purpose, not on a + particular implementation. + + - `Paper is the _ultimate_ debugger' (David Turner :-) + + There is nothing like sheets of paper (and a large floor) to + help you understand the design of a library you're new to, or to + debug it. The formatting style presented here is targeted at + printing. For example, it is more than highly recommended to + never produce a source line that is wider than 78 columns. More + on this below. + + +1. Naming +--------- + + a. Long and expressive labels + + Never hesitate to use long labels for your types, variables, + etc.! Except maybe for things like very trivial types, the + longest is the best, as it increases the source's + _expressiveness_. Never forget that the role of a label is to + express the `function' of the entity it represents, not its + implementation! + + NOTE: Hungarian notation is NOT expressive, as it sticks the + `type' of a variable to its name. A label like `usFoo' + rarely tells the use of the variable it represents. + + And the state of a variable (global, static, dynamic) + isn't helpful anymore. + + Conclusion: Avoid Hungarian Notation in FreeType 2. + + + When forging a name with several nouns + (e.g. `number-of-points'), use an uppercase letter for the first + letter of each word (except the first), like: + + numberOfPoints + + You are also welcome to introduce underscores `_' in your + labels, especially when sticking large nouns together, as it + `airs' the code greatly. E.g.: + + `numberOfPoints' or `number_Of_Points' + + `IncredibleFunction' or `Incredible_Function' + + And finally, always put a capital letter after an underscore, + except in variable labels that are all lowercase: + + `number_of_points' is OK for a variable (_all_ lowercase label) + + `incredible_function' is NOT for a function! + ^ ^ + + `Microsoft_windows' is a *shame*! + ^ ^ + + `Microsoft_Windows' isn't really better, but at least its a + ^ ^ correct function label within this + convention ;-) + + b. Data types + + Try to use C types to the very least! Rely on internally + defined equivalent types instead. For example, not all + compilers agree on the sign of `char'; the size of `int' is + platform-specific, etc. + + There are equivalents to the most common types in the + `fttypes.h' public header file, like `FT_Short', `FT_UShort', + etc. Using the internal types will guarantee that you won't + need to replace every occurence of `short' or whatever when + compiling on a weird platform or with a weird compiler, and + there are many more than you could think of... + + c. Functions + + The name of a function should always begin with a capital + letter, as lowercase first letters are reserved for variables. + The name of a function should be, again, _expressive_! Never + hesitate to put long function names in your code: It will make + the code much more readable. + + Expressiveness doesn't necessarily imply lengthiness though; for + instance, reading various data types from a file stream is + performed using the following functions defined in the + `ftstream.c' file of the `base' module: + + FT_Get_Char(), FT_Get_Short(), FT_Get_Long(), etc. + + Which is somewhat more readable than: + + cget, sget, usget, lget, etc. + + d. Variables + + Variable names (at least meant for the public interface) should + always begin with a lowercase letter. Lowercase first letters + are reserved for variables in this convention, as it has been + already explained above. You are still welcome to use long and + expressive variable names. + + Something like `numP' can express a number of pixels, porks, + pancakes, and much more... Something like `num_points' won't. + + Unfortunately (mostly due to the lazyness of the developers), + short variable names are still used in many parts of the + library. Volunteers are highly welcome to improve this... + + As a side note, a field name of a structure counts as a variable + name too. + + +2. Declarations & Statements +---------------------------- + + Try to align declarations and assignments in columns, if it proves + logically. For example (taken from `ttraster.c'): + + 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 */ + + UShort countL; /* number of lines to step before this */ + /* profile becomes drawable */ + + PProfile next; /* next profile in same contour, used */ + /* during drop-out control */ + }; + + instead of + + 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 */ + UShort countL; /* number of lines to step before this */ + /* profile becomes drawable */ + PProfile next; /* next profile in same contour, used */ + /* during drop-out control */ + }; + + This comes from the fact that you are more interested in the field + and its function than in its type. + + Or: + + x = i + 1; + y += j; + min = 100; + + instead of + + x=i+1; + y+=j; + min=100; + + And don't hesitate to separate blocks of declarations with + newlines to `distinguish' logical sections. + + E.g., taken from an old source file, in the declarations of the + CMap loader: + + long n, num_SH; + unsigned short u; + long off; + unsigned short l; + long num_Seg; + unsigned short* glArray; + long table_start; + int limit, i; + + TCMapDir cmap_dir; + TCMapDirEntry entry_; + PCMapTable Plcmt; + PCMap2SubHeader Plcmsub; + PCMap4 Plcm4; + PCMap4Segment segments; + + instead of + + long n, num_SH; + unsigned short u; + long off; + unsigned short l; + long num_Seg; + unsigned short *glArray; + long table_start; + int limit, i; + TCMapDir cmap_dir; + TCMapDirEntry entry_; + PCMapTable Plcmt; + PCMap2SubHeader Plcmsub; + PCMap4 Plcm4; + PCMap4Segment segments; + + +3. Blocks +--------- + + Block separation is done with `{' and `}'. We do not use the K&R + convention which becomes only useful with an extensive use of + tabs. The `{' and its corresponding `}' should always be on the + same column. It makes it easier to separate a block from the rest + of the source, and it helps your _brain_ associate the accolades + easily (ask any Lisp programmer on the topic!). + + Use two spaces for the next indentation level. + + Never use tabs in FreeType 2 code; their widths may vary with + editors and systems. + + Example: + + if (condition_test) { + waow mamma; + I'm doing K&R format; + just like the Linux kernel; + } else { + This test failed poorly; + } + + should be rather formatted as + + if ( condition_test ) + { + This code isn't stuck to the condition; + read it on paper, you will find it more; + pleasant to the eye; + } + else + { + Of course, this is a matter of taste; + This is just the way it is in this convention; + and you should follow it to be homogenuous with; + the rest of the FreeType code; + } + + +4. Macros +--------- + + Macros should be made of uppercase letters. If a macro label is + forged from several words, it is possible to only uppercasify the + first word, using an underscore to separate the nouns. This is + used in in some files for macros like + + GET_UShort(), USE_Stream(), etc. + + The role of macros used throughout the engine is explained later + in this document. + + +5. Conventions +-------------- + + Currently, FreeType 2 source code uses the following formatting + rules: + + . The data type is separated with two spaces from the variable, + structure, or function name: + + const char foo; + + Usually, the `*' operator is concatenated to the data type: + + FT_Int* pointer; + + However, when declaring resp. defining an `output' parameter + (i.e. a pointer which will be assigned by the function), the + last `*' must be placed on the right in order to denote this, as + in: + + FT_New_Face( FT_Library library, + FT_Face *aface ); + + where the `*' is used to indicate that `aface' is returned. In + most cases, the name of such an output variable starts with `a' + or `an' (`aface' instead of `face', `anlru' instead of `lru', + etc.), following the English rules of the indefinite article. + + . As mentioned above, multiple declarations are vertically + aligned: + + FT_Short foo; + FT_Long bar; + FT_GlyphSlot slot; + + . Declarations are separated with two blank lines from the + following code. This intentionally disturbs the code flow to + make variable definitions more visible. + + { + char x, y; + + + x = 3; + y = 5; + } + + . An opening parenthesis follows a function directly without + space; after a built-in C keyword, one space is used: + + x = sin( y ); + y = sizeof ( long ); + + Except for casts, empty parameters, and the closing semicolon, + parentheses are surrounded with space: + + x = (char*)( foo + bar ); + y = rand(); + + . Binary operators are surrounded by spaces; unary operators have + no space after it: + + x = ( 3 + 4 ) / ( 7 - 2 ); + y = -( 3 + 4 ) * 7; + + . Array arguments are not surrounded by spaces: + + array[3] = array[1] + array[2]; + array[4] = array[1 + 3]; + + . Comma and semicolon have only space at the right side: + + if ( x = 0; x < y; x++, y-- ) + do_something(); + + Exception: + + for (;;) + { + ... + + . Don't use + + if ( x == y ) a = b; + + but + + if ( x == y ) + a = b; + + in general. + + . Preprocessor directives are never indented and always start in + the first column. + + . All function/structure/variable definitions start at column + three. + + . All full-line comments (except the header of a file) start at + column three (even comments for preprocessor directives). + + . Labels are sticking out two positions to the left: + + switch ( x ) + { + case 1: + do_something(); + break; + default: + do_nothing(); + break; + } + + + +II. Design Conventions +====================== + + +1. Modularity and Components Layout +----------------------------------- + + The FreeType 2 engine has been designed with portability in mind. + This implies the ability to compile and run it on a great variety + of systems and weird environments, unlike many packages where the + word strictly means `runs on a bunch of Unix-like systems'. We + have thus decided to stick to the following restrictions: + + - The C version is written entirely in ANSI C. + + - The library, if compiled with gcc, doesn't produce any warning + with the `-ansi -pedantic' flags. Other compilers with better + checks may produce ANSI warnings -- please report. + + (NOTE: It can of course be compiled by an `average' C compiler, + and even by a C++ one.) + + - It only requires in its simplest form an ANSI libc to compile, + and no utilities other than a C preprocessor, compiler, and + linker. + + - It consists of modules, starting with a `base' module which + provides the API, some auxiliary modules used by the font + drivers, the font driver modules itself, and the rasterizer + modules. + + - The very low-level components can be easily replaced by + system-specific ones that do not rely on the standard libc. + These components deal mainly with i/o, memory, and mutex + operations. + + - A client application only needs to include one header file named + `freetype.h' to use the engine. Other public header files like + `ftglyph.h' or `ftimage.h' provide functional extensions. + + - All configuration options are gathered in two files, + `ftconfig.h' and `ftoption.h'. The former contains the + processor and OS specific configuration options, while the + latter treats options that may be enabled or disabled by the + user to enable and disable various features. + + +2. Configuration and Debugging +------------------------------ + + Configuration is covered by the `BUILD' documentation file. + + Debugging is controlled by two macros in `ftoption.h', + FT_DEBUG_LEVEL_ERROR and FT_DEBUG_LEVEL_TRACE; don't use them in + code to be released. Check the source code of the `ftview.c' + demonstration program (in the `ft2demos' package) how tracing can + be used and activated. + + + +III. Usage conventions +====================== + + +1. Error Handling +----------------- + + Most functions directly return an error code. A return value of 0 + (FT_Err_Ok) means that no error occured, while a non-zero other + value indicates a failure of any kind. + + We use code like this in FreeType 2: + + if ( ( rc = Perform_Action_1( parms_of_1 ) ) || + ( rc = Perform_Action_2( parms_of_2 ) ) || + ( rc = Perform_Action_3( parms_of_3 ) ) ) + goto Fail; + + which is better but uses assignments within expressions, which are + always delicate to manipulate in C (the risk of writing `==' + exists, and would go unnoticed by a compiler). Moreover, the + assignments are a bit redundant and don't express much things + about the actions performed (they only speak of the error + management issue). + + That is why some macros have been defined for the most frequently + used functions. They relate to low-level routines that are called + very often (mainly i/o and memory handling functions). Each macro + produces an implicit assignment to a variable called `error' and + can be used instead as a simple function call. Example: + + if ( PERFORM_Action_1( parms_of_1 ) || + PERFORM_Action_2( parms_of_2 ) || + PERFORM_Action_3( parms_of_3 ) ) + goto Fail; + + with + + #define PERFORM_Action_1( parms_1 ) \ + ( error = Perform_Action_1( parms_1 ) ) + #define PERFORM_Action_2( parms_1 ) \ + ( error = Perform_Action_2( parms_1 ) ) + #define PERFORM_Action_3( parms_1 ) \ + ( error = Perform_Action_3( parms_1 ) ) + + defined in some header file. + + There, the developer only needs to define a local `error' variable + and use the macros directly in the code, without caring about the + actual error handling performed. Another advantage is that the + structure of source files remain very similar, even though the + error handling may be different. + + This convention is very close to the use of exceptions in + languages like C++, Pascal, Java, etc. where the developer + focuses on the actions to perform, and not on every little error + checking. + + +2. Font File I/O +---------------- + + a. Streams + + The engine uses `streams' to access the font files. A stream is + a structure containing information used to access files through + a system-specific i/o library. + + The default implementation of streams uses the ANSI libc i/o + functions. However, for the sake of embedding in light systems + and independence of a complete C library, it is possible to + re-implement the component for a specific system or OS, letting + it use system calls. + + b. Frames + + TrueType is tied to the big-endian format, which implies that + reading shorts or longs from the font file may need conversions + depending on the target processor. To be able to easily detect + read errors and allow simple conversion calls or macros, the + engine is able to access a font file using `frames'. + + A frame is simply a sequence of successive bytes taken from the + input file at the current position. A frame is pre-loaded into + memory by a call to the `ACCESS_Frame()' macro. + + It is then possible to read all sizes of data through the + `GET_xxx()' macros described above. + + When all important data is read, the frame can be released by a + call to `FORGET_Frame()'. + + The benefits of frames are various. Consider these two + approaches at extracting values: + + if ( ( error = Read_Short( &var1 ) ) || + ( error = Read_Long ( &var2 ) ) || + ( error = Read_Long ( &var3 ) ) || + ( error = Read_Short( &var4 ) ) ) + + return FAILURE; + + and + + /* Read the next 16 bytes */ + if ( ACCESS_Frame( 16L ) ) + return error; /* The Frame could not be read */ + + var1 = GET_Short(); /* extract values from the frame */ + var2 = GET_Long(); + var3 = GET_Long(); + var4 = GET_Short(); + + FORGET_Frame(); /* release the frame */ + + In the first case, there are four error assignments with four + checks of the file read. This unnecessarily increases the size + of the generated code. Moreover, you must be sure that `var1' + and `var4' are short variables, `var2' and `var3' long ones, if + you want to avoid bugs and/or compiler warnings. + + In the second case, you perform only one check for the read, and + exit immediately on failure. Then the values are extracted from + the frame, as the result of function calls. This means that you + can use automatic type conversion; there is no problem if + e.g. `var1' and `var4' are longs, unlike previously. + + Finally, frames are ideal when you are using memory-mapped + files, as the frame is not really `pre-loaded' and never uses + any `heap' space. + + IMPORTANT: You CANNOT nest several frame accesses. There is + only one frame available at a time for a specific + instance. + + It is also the programmer's responsibility to never + extract more data than was pre-loaded in the frame! + (But you usually know how many values you want to + extract from the file before doing so). + + +3. Memory Management +-------------------- + + The library now has a component which uses an interface similar to + malloc()/free(). + + * FT_Alloc() + + To be used like malloc(), except that it returns an error code, + not an address. Its arguments are the size of the requested + block and the address of the target pointer to the `fresh' + block. An error code is returned in case of failure (and this + will also set the target pointer to NULL), 0 in case of success. + + FT_Alloc() internally calls the ft_alloc() function defined in + an FT_Memory object. All error checking is done by FT_Alloc() + itself so that ft_alloc() directly calls malloc(). + + * FT_Realloc() + + Similar to FT_Alloc(); it calls realloc() by default. + + * FT_Free() + + As you may have already guessed, FT_Free() is FT_Alloc()'s + counterpart. It takes as argument the _target pointer's + address_! You should _never_ pass the block's address directly, + i.e. the pointer, to FT_Free(). + + Similar to FT_Alloc(), FT_Free() does the necessary error + checking and calls free() by default. + + As the pointers addresses needed as arguments are typed `void**', + ftmemory.h provides some macros to help use the above functions + more easily, these are: + + MEM_Alloc() A version of FT_Alloc() that casts the argument + pointer to (void**). Similar functions are + MEM_Alloc_Array(), MEM_Realloc(), and + MEM_Realloc_Array() + + ALLOC() Same as MEM_Alloc(), but with an assignment to a + variable called `error'. See the section `error + handling' above for more info on this. Similar + functions are REALLOC(), ALLOC_ARRAY(), and + REALLOC_ARRAY(). + + FREE() A version of FT_Free() that casts the argument + pointer to (void**). + + MEM_Set() An alias for `memset()', which can be easily + changed to anything else if you wish to use a + different memory manager than the functions + provided by the ANSI libc. + + MEM_Copy() An alias of `memcpy()' or `bcopy()' used to move + blocks of memory. You may change it to something + different if necessary (e.g. not using libc). + + MEM_Move() An alias of `memmove().' Change its definition if + necessary. + + +4. Support for threaded environments +------------------------------------ + + Thread synchronisation has been dropped in FreeType 2. The + library is already re-entrant, and if you really need two threads + accessing the same FT_Library object, you should synchronize + access to it yourself with a simple mutex. + + +--- end of convntns.txt --- Index: xc/extras/freetype2/docs/docmaker.py diff -u /dev/null xc/extras/freetype2/docs/docmaker.py:1.1.1.1 --- /dev/null Mon Dec 18 14:22:25 2000 +++ xc/extras/freetype2/docs/docmaker.py Fri Dec 8 16:26:11 2000 @@ -0,0 +1,825 @@ +#!/usr/bin/env python +# +# DocMaker is a very simple program used to generate HTML documentation +# from the source files of the FreeType packages. +# +# I should really be using regular expressions to do this, but hey, +# i'm too lazy right now, and the damn thing seems to work :-) +# - David +# + +import fileinput, sys, string + +html_header = """ + +
+FreeType 2 API Reference + + +
+ +

FreeType 2 API Reference

+""" + +html_footer = """ + + +""" + +code_header = """ +
+"""
+
+code_footer = """
+
+""" + +para_header = "

" +para_footer = "

" + +block_header = """

""" +block_footer = "
" + +source_header = """
+"""
+source_footer = """
+

+""" + +# The FreeType 2 reference is extracted from the source files. These contain +# various comment blocks that follow one of the following formats: +# +# /************************** +# * +# * FORMAT1 +# * +# * +# * +# * +# *************************/ +# +# /**************************/ +# /* */ +# /* FORMAT2 */ +# /* */ +# /* */ +# /* */ +# /* */ +# +# /**************************/ +# /* */ +# /* FORMAT3 */ +# /* */ +# /* */ +# /* */ +# /* */ +# /**************************/ +# +# Each block contains a list of markers, each one can be followed by +# some arbitrary text or a list of fields. Here's an example: +# +# +# MyStruct +# +# +# this structure holds some data +# +# +# x :: horizontal coordinate +# y :: vertical coordinate +# +# +# This example defines three markers: 'Struct', 'Description' & 'Fields' +# The first two markers contain arbitrary text, while the last one contains +# a list of field +# +# each field is simple of the format: WORD :: TEXT.... +# +# Note that typically, each comment block is followed by some source +# code declaration that may need to be kept in the reference.. +# +# Note that markers can alternatively be written as "@MARKER:" +# instead of "". All marker identifiers are converted to +# lower case during parsing, in order to simply sorting.. +# +# We associate with each block the following source lines that do not +# begin with a comment. For example, the following: +# +# /********************************** +# * +# * blabla +# * +# */ +# +# bla_bla_bla +# bilip_bilip +# +# /* - this comment acts as a separator - */ +# +# blo_blo_blo +# +# +# will only keep the first two lines of sources with +# the "blabla" block +# +# However, the comment will be kept, with following source lines +# if it contains a starting '#' or '@' as in: +# +# /*@.....*/ +# /*#.....*/ +# /* @.....*/ +# /* #.....*/ +# + + + +############################################################################## +# +# 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
 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 = 0 ):
+        self.lines  = []
+        self.margin = margin
+
+    def add( self, line ):
+        # remove margin whitespace
+        if string.strip( line[: self.margin] ) == "":
+            line = line[self.margin :]
+        self.lines.append( line )
+
+
+    def dump( self ):
+        for line in self.lines:
+            print "--" + line
+        print ""
+
+    def get_identifier( self ):
+        # this function should never be called
+        return "UNKNOWN_CODE_IDENTIFIER!!"
+
+    def dump_html( self ):
+
+        # clean the last empty lines
+        l = len( self.lines ) - 1
+        while l > 0 and string.strip( self.lines[l - 1] ) == "":
+            l = l - 1
+
+        print code_header
+        for line in self.lines[0 : l]:
+            print line
+        print code_footer
+
+
+##############################################################################
+#
+# The DocParagraph is used to store text paragraphs
+# self.words is simply a list of words for the paragraph
+#
+# the paragraph is filled line by line by the parser..
+#
+class DocParagraph:
+
+    def __init__( self ):
+        self.words = []
+
+    def add( self, line ):
+        # get rid of unwanted spaces in the paragraph
+        #
+        # the following line is the same as
+        #
+        #   self.words.extend( string.split( line ) )
+        #
+        # but older Python versions don't have the `extend' attribute
+        #
+        last = len(self.words)
+        self.words[last:last] = string.split( line )
+
+    # this function is used to retrieve the first word of a given
+    # paragraph..
+    def get_identifier( self ):
+        if self.words:
+            return self.words[0]
+
+        # should never happen
+        return "UNKNOWN_PARA_IDENTIFIER!!"
+
+
+    def dump( self ):
+
+        max_width = 50
+        cursor    = 0
+        line      = ""
+
+        for word in self.words:
+
+            if cursor + len( word ) + 1 > max_width:
+                print line
+                cursor = 0
+                line = ""
+
+            line   = line + word + " "
+            cursor = cursor + len( word ) + 1
+
+        if cursor > 0:
+            print line
+
+        #print "§" #for debugging only
+
+
+    def dump_html( self ):
+
+        print para_header
+        self.dump()
+        print para_footer
+
+
+###########################################################################
+#
+# DocContent is used to store the content of a given marker.
+#
+# the "self.items" list contains (field,elements) record, where
+# "field" corresponds to a given structure fields or function
+# parameter (indicated by a "::"), or NULL for a normal section
+# of text/code
+#
+# hence, the following example:
+#
+#   
+#      this is an example of what can be put in a content section,
+#
+#      a second line of example text
+#
+#      x :: a simple test field, with some content
+#      y :: even before, this field has some code content
+#           {
+#             y = x+2;
+#           }
+#
+# should be stored as
+#     [ ( None, [ DocParagraph, DocParagraph] ),
+#       ( "x",  [ DocParagraph ] ),
+#       ( "y",  [ DocParagraph, DocCode ] ) ]
+#
+# in self.items
+#
+# the DocContent object is entirely built at creation time, you must
+# pass a list of input text lines lin the "lines_list" parameter..
+#
+#
+class DocContent:
+
+    def __init__( self, lines_list ):
+        self.items  = []
+        code_mode   = 0
+        code_margin = 0
+        text        = []
+        paragraph   = None   # represents the current DocParagraph
+        code        = None   # represents the current DocCode
+
+        elements    = []     # the list of elements for the current field,
+                             # contains DocParagraph or DocCode objects
+
+        field       = None   # the current field
+
+        for aline in lines_list:
+
+            if code_mode == 0:
+                line   = string.lstrip( aline )
+                l      = len( line )
+                margin = len( aline ) - l
+
+                # if the line is empty, this is the end of the current
+                # paragraph
+                if l == 0 or line == '{':
+
+                    if paragraph:
+                        elements.append( paragraph )
+                        paragraph = None
+
+                    if line == "":
+                        continue
+
+                    code_mode   = 1
+                    code_margin = margin
+                    code        = None
+                    continue
+
+                words = string.split( line )
+
+                # test for a field delimiter on the start of the line, i.e.
+                # the token `::'
+                #
+                if len( words ) >= 2 and words[1] == "::":
+
+                    # start a new field - complete current paragraph if any
+                    if paragraph:
+                        elements.append( paragraph )
+                        paragraph = None
+
+                    # append previous "field" to self.items
+                    self.items.append( ( field, elements ) )
+
+                    # start new field and elements list
+                    field    = words[0]
+                    elements = []
+                    words    = words[2 :]
+
+                # append remaining words to current paragraph
+                if len( words ) > 0:
+                    line = string.join( words )
+                    if not paragraph:
+                        paragraph = DocParagraph()
+                    paragraph.add( line )
+
+            else:
+                # we're in code mode..
+                line = aline
+
+                # the code block ends with a line that has a single '}' on it
+                # that is located at the same column that the opening
+                # accolade..
+                if line == " " * code_margin + '}':
+
+                    if code:
+                        elements.append( code )
+                        code = None
+
+                    code_mode   = 0
+                    code_margin = 0
+
+                # otherwise, add the line to the current paragraph
+                else:
+                    if not code:
+                        code = DocCode()
+                    code.add( line )
+
+        if paragraph:
+            elements.append( paragraph )
+
+        if code:
+            elements.append( code )
+
+        self.items.append( ( field, elements ) )
+
+
+    def get_identifier( self ):
+        if self.items:
+            item = self.items[0]
+            for element in item[1]:
+                return element.get_identifier()
+
+        # should never happen
+        return "UNKNOWN_CONTENT_IDENTIFIER!!"
+
+
+    def dump( self ):
+        for item in self.items:
+            field = item[0]
+            if field:
+                print ""
+
+            for element in item[1]:
+                element.dump()
+
+            if field:
+                print "        "
+
+    def dump_html( self ):
+
+        n        = len( self.items )
+        in_table = 0
+
+        for i in range( n ):
+            item  = self.items[i]
+            field = item[0]
+
+            if not field:
+
+                if in_table:
+                    print ""
+                    in_table = 0
+
+                for element in item[1]:
+                    element.dump_html()
+            else:
+                if not in_table:
+                    print "
" + in_table = 1 + else: + print "
" + + print "" + field + "" + + for element in item[1]: + element.dump_html() + + if in_table: + print "
" + + +###################################################################################### +# +# +# The DocBlock class is used to store a given comment block. It contains +# a list of markers, as well as a list of contents for each marker. +# +# "self.items" is a list of ( marker, contents ) elements, where +# 'marker' is a lowercase marker string, and 'contents' is a DocContent +# object +# +# "self.source" is simply a list of text lines taken from the +# uncommented source itself.. +# +# finally, "self.identifier" is a simple identifier used to +# uniquely identify the block +# +class DocBlock: + + def __init__( self, block_line_list = [], source_line_list = [] ): + self.items = [] # current ( marker, contents ) list + self.identifier = None + marker = None # current marker + content = [] # current content lines list + alphanum = string.letters + string.digits + "_" + + for line in block_line_list: + line2 = string.lstrip( line ) + l = len( line2 ) + margin = len( line ) - l + + if l > 3: + ender = None + if line2[0] == '<': + ender = '>' + elif line2[0] == '@': + ender = ':' + + if ender: + i = 1 + while i < l and line2[i] in alphanum: + i = i + 1 + if i < l and line2[i] == ender: + if marker and content: + self.add( marker, content ) + marker = line2[1 : i] + content = [] + line2 = string.lstrip( line2[i + 1 :] ) + l = len( line2 ) + line = " " * margin + line2 + + content.append( line ) + + if marker and content: + self.add( marker, content ) + + self.source = [] + if self.items: + self.source = source_line_list + + + # this function is used to add a new element to self.items + # 'marker' is a marker string, or None + # 'lines' is a list of text lines used to compute a list of + # DocContent objects + # + def add( self, marker, lines ): + + # remove the first and last empty lines from the content list + l = len( lines ) + if l > 0: + i = 0 + while l > 0 and string.strip( lines[l - 1] ) == "": + l = l - 1 + while i < l and string.strip( lines[i] ) == "": + i = i + 1 + lines = lines[i : l] + l = len( lines ) + + # add a new marker only if its marker and its content list aren't empty + if l > 0 and marker: + content = DocContent(lines) + self.items.append( ( string.lower(marker), content ) ) + if not self.identifier: + self.identifier = content.get_identifier() + + + + def dump( self ): + for i in range( len( self.items ) ): + print "[" + self.items[i][0] + "]" + content = self.items[i][1] + content.dump() + + def dump_html( self ): + + types = [ 'type', 'struct', 'functype', 'function', 'constant', + 'enum', 'macro' ] + + if not self.items: + return + + # start of a block + print block_header + + print "

" + self.identifier + "

" + + # print source code + if not self.source: + return + + lines = self.source + l = len( lines ) - 1 + while l >= 0 and string.strip( lines[l] ) == "": + l = l - 1 + print source_header + for line in lines[0 : l + 1]: + print line + print source_footer + + # dump each (marker,content) element + for element in self.items: + + marker = element[0] + content = element[1] + + if marker == "description": + print "
    " + content.dump_html() + print "
" + + elif not (marker in types): + print "

" + marker + "

" + print "
    " + content.dump_html() + print "
" + + print "" + + print block_footer + + +# filter a given list of DocBlocks. Returns a new list +# of DocBlock objects that only contains element whose +# "type" (i.e. first marker) is in the "types" parameter +# +def filter_blocks( block_list, types ): + + new_list = [] + for block in block_list: + if block.items: + element = block.items[0] + marker = element[0] + if marker in types: + new_list.append( block ) + + return new_list + + +# perform a lexicographical comparison of two DocBlock +# objects. Returns -1, 0 or 1 +# +def block_lexicographical_compare( b1, b2 ): + if not b1.identifier: + return -1 + if not b2.identifier: + return 1 + + id1 = string.lower(b1.identifier) + id2 = string.lower(b2.identifier) + if id1 < id2: + return -1 + elif id1 == id2: + return 0 + else: + return 1 + + +def block_make_list( source_block_list ): + list = [] + + for block in source_block_list: + docblock = DocBlock( block[0], block[1] ) + list.append( docblock ) + + return list + + +# dump a list block as a single HTML page +# +def dump_html_1( block_list ): + + print html_header + + for block in block_list: + block.dump_html() + + print html_footer + + + + +def make_block_list(): + """parse a file and extract comments blocks from it""" + + list = [] + block = [] + format = 0 + + # we use "format" to store the state of our parser: + # + # 0 - wait for beginning of comment + # 1 - parse comment format 1 + # 2 - parse comment format 2 + # + # 4 - wait for beginning of source (or comment ??) + # 5 - process source + # + + comment = [] + source = [] + state = 0 + + for line in fileinput.input(): + + l = len( line ) + if l > 0 and line[l - 1] == '\012': + line = line[0 : l - 1] + + # stripped version of the line + line2 = string.strip( line ) + l = len( line2 ) + + # if this line begins with a comment and we are processing some + # source, exit to state 0 + # + # unless we encounter something like: + # + # /*@..... + # /*#..... + # + # /* @..... + # /* #..... + # + if format >= 4 and l > 2 and line2[0 : 2] == '/*': + if l < 4 or ( line2[3] != '@' and line2[3:4] != ' @' and + line2[3] != '#' and line2[3:4] != ' #'): + list.append( ( block, source ) ) + format = 0 + + if format == 0: #### wait for beginning of comment #### + + if l > 3 and line2[0 : 3] == '/**': + i = 3 + while i < l and line2[i] == '*': + i = i + 1 + + if i == l: + # this is '/**' followed by any number of '*', the + # beginning of a Format 1 block + # + block = [] + source = [] + format = 1 + + elif i == l - 1 and line2[i] == '/': + # this is '/**' followed by any number of '*', followed + # by a '/', i.e. the beginning of a Format 2 or 3 block + # + block = [] + source = [] + format = 2 + + ############################################################## + # + # FORMAT 1 + # + elif format == 1: + + # if the line doesn't begin with a "*", something went + # wrong, and we must exit, and forget the current block.. + if l == 0 or line2[0] != '*': + block = [] + format = 0 + + # otherwise, we test for an end of block, which is an + # arbitrary number of '*', followed by '/' + else: + i = 1 + while i < l and line2[i] == '*': + i = i + 1 + + # test for the end of the block + if i < l and line2[i] == '/': + if block != []: + format = 4 + else: + format = 0 + else: + # otherwise simply append line to current block + block.append( line2[i:] ) + + continue + + ############################################################## + # + # FORMAT 2 + # + elif format == 2: + + # if the line doesn't begin with '/*' and end with '*/', + # this is the end of the format 2 format + if l < 4 or line2[: 2] != '/*' or line2[-2 :] != '*/': + if block != []: + format = 4 + else: + format = 0 + else: + # remove the start and end comment delimiters, then + # right-strip the line + line2 = string.rstrip( line2[2 : -2] ) + + # check for end of a format2 block, i.e. a run of '*' + if string.count( line2, '*' ) == l - 4: + if block != []: + format = 4 + else: + format = 0 + else: + # otherwise, add the line to the current block + block.append( line2 ) + + continue + + + + if format >= 4: #### source processing #### + + if l > 0: + format = 5 + + if format == 5: + source.append( line ) + + + if format >= 4: + list.append( [block, source] ) + + return list + + + +# This function is only used for debugging +# +def dump_block_list( list ): + """dump a comment block list""" + for block in list: + print "----------------------------------------" + for line in block[0]: + print line + for line in block[1]: + print line + + print "---------the end-----------------------" + + + +def main( argv ): + """main program loop""" + sys.stderr.write( "extracting comment blocks from sources...\n" ) + list = make_block_list() + list = block_make_list(list) + + list2 = filter_blocks( list, ['type','macro','enum','constant', 'functype'] ) + #list2 = list + list2.sort( block_lexicographical_compare ) + + dump_html_1( list2 ) + #dump_doc_blocks( list ) + #dump_block_lists( list ) + #dump_html_1( list ) + + +# If called from the command line +if __name__ == '__main__': + main( sys.argv ) + + +# eof Index: xc/extras/freetype2/docs/freetype2.html diff -u /dev/null xc/extras/freetype2/docs/freetype2.html:1.1.1.1 --- /dev/null Mon Dec 18 14:22:25 2000 +++ xc/extras/freetype2/docs/freetype2.html Fri Dec 8 16:26:11 2000 @@ -0,0 +1,352 @@ + + +FreeType 2 Introduction + + + + + + + +http://www.freetype.org

+ +

+ + The FreeType Project +

An Introduction to FreeType 2

+
+ +
+

+ +DOCUMENT INDEX:
+

+ + +


+ +
+

What is FreeType 2 ?

+
+ +

The FreeType project is a team of volunteers who develop free, portable +and high-quality software solutions for digital typography. We specifically +target embedded systems and focus on bringing small, efficient and +ubiquitous products.

+ +

the FreeType 2 library is our new software font engine. It has been + designed to provide the following important features:

+ +
    +
  • + A universal and simple API to manage font files:
    +

      +

      The FreeType 2 API is simple and easy to use. It supports both + bitmapped and scalable fonts and is well-suited to manage font + files of all formats. Unlike other font libraries, FreeType 2 + returns and manages outline font data (images & metrics).

      +
    +

  • + +
  • + Support for several font formats through loadable modules:
    +

      +

      FreeType 2 uses "font drivers". Each driver is a loadable + module used to support one specific font format. Each driver can also + provide specific extensions used to access format-specific features of + the font.

      +
    +

  • + + +
  • + High-quality anti-aliasing:
    +

      +

      FreeType 2 produces etremely smooth outlines at small sizes, with its new + anti-aliasing renderer, which produces bitmaps with 256-levels of gray. + It uses a new algorithm that has been specifically designed to render + small complex shapes (like glyphs) at high speed. Indeed, it's even + faster than the monochrome renderer for small character sizes (under + 20 pixels) !! +

      +
    + + +
  • High portability & performance:
    +
      +

      The FreeType 2 source code is written in ANSI C and runs on any + platform with a compliant compiler. Client applications can + provide their own memory manager or input stream to the library + (which means that font files can come from any place: disk, + memory, compressed file, network, etc..). +

      +
    + +
+ +

Note that the beta of FreeType 2 is available now. For more + info, check our Download page or see the source + and its diffs through our CVS Web interface. +

+ + +
+ +
+

Features

+
+ +

Supported font formats

+ +

FreeType 2 readily supports the following font formats:

+ +
    +
  • TrueType files (.ttf) and collections (.ttc)
  • +
  • Type 1 font files both in ASCII (.pfa) or binary (.pfb) format
  • +
  • Type 1 Multiple Master fonts. The FreeType 2 API also provides + routines to manage design instances easily
  • +
  • Type 1 CID-keyed fonts
  • +
  • OpenType/CFF (.otf) fonts
  • +
  • CFF/Type 2 fonts
  • +
  • Adobe CEF fonts (.cef), used to embed fonts in SVG documents + with the Adobe SVG viewer plugin.
  • +
  • Windows FNT/FON bitmap fonts
  • +
+ +

Note that Apple's TrueType GX fonts are supported as normal TTFs, + (the advanced tables are ignored).

+ +

Besides, it's possible to add support for new font formats by providing + a specific font driver module. Modules can be added either at + build time (when recompiling the library), or at run-time; + this allows, for example, applications to register their own + font driver to support program-specific formats.

+ + +

Patent-free automatic hinter

+ +

TrueType fonts are normally renderered (hinted) with the help of a + specific bytecode where the behaviour of a few opcodes is patented by + Apple. We're currently in contact with Apple to discuss the importance + of such patents and their use in open source projects like FreeType. +

+ +

In the meantime, we have developped our own alternative technology that + is capable of automatically hinting scalable glyph images. It is + now part of the FreeType 2 source tree as the "autohint" module, + and is used to hint glyphs when the bytecode interpreter is disabled + (through a configuration macro when building the engine). Note that + the auto-hinter is also used to handle glyphs in other formats like + CFF and Type 1.

+ +

The auto-hinter provides pretty good results (in some cases, it even + significantly improves the output of poorly hinted fonts) but we'll + continue to improve it with each new release of FreeType to achieve + the highest possible quality.

+ + +

Modular design:

+ +

The design of FreeType 2 is extremely modular as most features are + supported through optional modules. This means it's easily possible to + only compile the features you need. As each module is between + 10 and 20 Kb in size, it's possible to build a bare-bones + font engine that supports anti-aliasing in about 30 Kb !!

+ +

Configuration is performed by modifications of only two header + files (one to select global features, another one to select modules) + and don't need tweaking of source code. Note that it is however + possible to provide your own implementation of certain components.

+ +

For example, when building on Unix, the engine will automatically + use memory-mapped files when available on the target platform, + thus significantly increasing font file i/o.

+ + +

Due to its very flexible design, it is possible to add, remove and + upgrade modules at run-time.

+ + + +

Advanced glyph management

+ +

The API comes with a standard extension used to extract individual + glyph images from font files. These images can be bitmaps, scalable + bezier outlines or even anything else. (e.g. bi-color or metafont + glyphs, as long as they're supported by a module).

+ +

Each scalable glyph image can be transformed, measured and + rendered into a monochrome or anti-aliased bitmaps easily + through a uniform interface. + + This allows client applications to easily cache glyphs or + perform text rendering effects with minimal difficulty + (look at the FreeType 2 Tutorial to see how to render + rotated text with very few lines of code). +

+ + + +

Advanced font access

+ +

The FreeType 2 API is useful to retrieve advanced information from + various fonts:

+ +
    +
  • vertical metrics are available whenever found in the font file
  • + +
  • kerning distances are available when found in the font file. It + is also possible to "attach" a given additional file to a given + font face. This is useful to load kerning distances from an + .afm file into a Type 1 face for example.
  • + +
  • provides ASCII glyph names whenever available in the font + (TrueType, OpenType, Type1, etc..)
  • + +
  • provides access to important tables for SFNT-based font formats + (i.e. TrueType, OpenType, CEF, etc..), like the name table, + font header, maximum profile, etc...
  • + +
  • automatic synthesis of Unicode-based character maps for + those fonts or formats that do not provide one. This is + extremely useful with Type 1 fonts which are normally + limited to a stupid 256-characters encoding.
  • +
+ + +

Simple & clean API

+ +

The FreeType 2 high-level API is simple and straightforward, as it + has been specifically designed to make the most commmon font operations + easy

+ +

As a comparison, the number of function calls needed to perform a + the tasks of font face creation/opening and glyph loading/rendering + has been reduced by a factor of 4 !!

+ +

The API is also independent of any font-format specific issue, though + it provides standard extensions to access format-specific tables and + information. More extensions can also be easily added through new + modules

+ + +

Robust & Portable code

+ +

Because it is written in industry-standard ANSI C, FreeType 2 compiles + on all platforms with a compliant compiler. Because the default build + only relies on the C library, it is free of any system-specific + dependencies, even if it is possible to "enhance" certain components + by providing a specific implementation.

+ +

The code doesn't use global or static variables. Client applications + can provide their own memory manager. Font files can be read from + a disk file, memory, or through a client-provided input stream. This + allows to support compressed font files, remote fonts, fonts embedded + in other streams (e.g. Type42 fonts), etc..

+ +

An advanced i/o sub-system is used to optimise file access, as well + as reduce memory usage of the library when the file is memory-based + ( ROM, RAM, memory-mapped ).

+ + +

Open Source & Vendor Independence

+ +

Finally, FreeType 2 is released under its own BSD-like open source + license, one of the less restricting licenses available, and this + means that:

+ +
    +
  • + It can be included in all kinds of products, be they proprietary + or not. +

  • + +
  • + As any module can be added or replaced anytime, any third party + vendor has the ability to provide its own set of modules (under + its own license) in order to support proprietary font formats or + more advanced features (e.g. a new auto-hinter, or a new + anti-aliasing renderer for LCDs or TV screens). +

  • +
+ +

One could even imagine an application using the FreeType 2 API with + a "wrapper" module used to access system-specific fonts (like through + the Windows GDI). This would mean native font support with more portable + application code (as simply changing the wrapper module would be required + to port the application to another system).

+ +
+ +
+

Requirements

+
+ +

FreeType 2 is written in ANSI C and should compile with no problems + on a great variety of platforms. We have taken care of removing all + compilation warnings from major compliant compilers. Detailed compilation + instructions are provided in the software archive.

+ +

This version of the library has been succesfully compiled and run + under the following systems: Dos, OS/2, Windows, Macintosh, Unix + (including the 64-bits DEC Unix, a.k.a. "True64"). You should not + encounter major problems compiling it on any other kind of platform. + In all cases, contact us if you do.

+ +

Note that a small set of demonstration programs is also separately + available. They include a tiny graphics sub-system that is used to + display and show-off the library's capabilities on the following + platforms: X11, MacOS, OS/2 & Windows.

+ +

Please visit our + Download section to access the software archives.

+ + + +
+ +
+

Patents issues

+
+ +

The FreeType 2 source code includes a TrueType bytecode interpreter that + is covered by the Apple patents. However, this piece of code is never + compiled by default in this release (unlike in previous betas) making + a default build of the library entirely patent-free !!

+ +

Note that in order to compile the interpreter, one needs to define + the configuration macro TT_CONFIG_OPTION_BYTECODE_INTERPRETER configuration + macro in the file "ftoption.h". More details are available in + the software archive. Note that the use of the interpreter is normally + protected by US, UK and French patents. In the event you'd absolutely + need it, you may have to contact + Apple legal department for licensing conditions, depending on your + location and the places you distribute/sell your products.

+ +

Please do not ask us any detailed information regarding licensing, as + we're still discussing with Apple this issue, we're unable to inform + the public of what's currently going on..

+ +
+ +


+

+Back to FreeType homepage

+ +

+ + Index: xc/extras/freetype2/docs/ft2faq.html diff -u /dev/null xc/extras/freetype2/docs/ft2faq.html:1.1.1.1 --- /dev/null Mon Dec 18 14:22:25 2000 +++ xc/extras/freetype2/docs/ft2faq.html Fri Dec 8 16:26:11 2000 @@ -0,0 +1,729 @@ + + + + + + FreeType 2 FAQ + + + + + +http://www.freetype.org

+ +

+ + The FreeType Project +

The FreeType 2 FAQ

+ + +
+ + +
+ +

+ + Document index + +

+ +


+ + + + +
+

+ General questions & answers +

+
+ + +

+ I.1 I though the FreeType project was dead. Is this true? +

+ +

Well, not exactly :-) It's true that the TrueType patents + issues have been less than a graceful event to handle but it didn't not + really killed the project per se, as Apple hasn't made an official + statement yet regarding the use of the patented "technology" in open + source projects (or other products).

+ +

We have thus continued updating FreeType 1.x, and started + developing FreeType 2 with the idea of providing this time a + completely patent free font engine. However, we largely preferred not + to broadly communicate about it until we've got a satisfying + implementation to show.

+ +
+
+

+ I.2 Why did it take so long to release FreeType 2? +

+ +

Several factors come to mind. The first one is that FreeType 2 + is a much more complex and dense project that was mostly developed + during non-working hours. And surely some important changes in the life + (like marriage, new jobs and kids) of some the FreeType developers + cannot be ignored :-)

+ +

A second one is that a first version of the library was designed one + year ago (and already worked with a multitude of font drivers), though + with a design that was judged by its authors as well as beta testers as + not enough flexible or consistent. In short, it worked well but we were + not exactly proud of it (call us perfectionists). It has then be + significantly reworked to become what we are now distributing as + FreeType 2

+ +

Finally, it would have been hard to distribute such a library without + an alternative technology to replace the patented bytecode interpreter. + This involved significant research work that could only be performed + correctly full-time, and we had to found a company to fund such a + development and still make it available under a BSD-like license. Huge + thanks to Catharon Productions, + Inc. for their commitment to this project.

+ +

And of course, we added support for more font files, and we will + continue to as long as the specifications are available and that we find + an interest in it. For example, FreeType 2 is to date the only + software library available on the market that supports the new Adobe + "CEF" font format.

+ +
+ +

+ I.3 Is FreeType 2 a Unix-only project? +

+ +

Absolutely not, even though many people still seem to think + so :-) FreeType 2, just like version 1.x, can be compiled + on any platform with an ANSI compiler. Some beta versions of the + library are even heavily used in brand new OSes (see the AtheOS screenshots for examples).

+ +

The library is itself mainly developed on several platforms (Windows + & Linux, though a great deal has also been achieved on OS/2) and the + code is highly generic and modular to adapt even the most strict + environments like low-memory embedded systems.

+ +
+ +

+ I.4 When will X11/XFree support anti-aliased text? +

+ +

This question isn't exactly related to FreeType as we have no direct + connection to the XFree people, but we have been asked so frequently + about it that it deserves a prominent place in this FAQ :-)

+ +

FreeType has been capable of anti-aliasing since version 1.0. + The reason why XFree doesn't support it is directly related to the + limitations of the design and specification of X11. More + specifically:

+ +
    +
  • + X11 assumes that all glyph images are monochrome bitmaps, hence the + X font library and server are unable to send anything else to + the X server. +
  • +
  • + Even if the X font library/server was able to generate + anti-aliased bitmaps (and this has been already done through + extensions), the X rendering model doesn't allow translucent + composition of "gray" pixmaps onto an arbitrary drawable. +
  • +
+ +

As both the font and rendering models of X11 are limited, it is + basically impossible to draw anti-aliased glyphs without performing + huge hacks within the server.

+ +

Note that Keith Packard, from XFree86 fame, has recently started + working on a new rendering model for X11 in order to support new + features (mainly transparency and anti-aliased fonts). This will be + provided through protocol extensions. The question of knowing whether + legacy X applications will be able to display anti-aliased text is still + very uncertain.

+ +
+
+

+ I.5 Is FreeType 2 backwards compatible with FreeType 1.x? +

+ +

Not directly, though we had the project to provide an optional binary + compatibility layer on top of it in order to easily re-link applications + with the new version. However, this idea has been dropped as it is + possible to install and use the two versions independently on any system + (read: no namespace conflicts).

+ +

The FreeType 2 API is a lot simpler than the one in 1.x + while being much more powerful. We thus encourage you to adapt your + source code to it as this should not involve much work.

+ +
+
+

+ I.6 Can I use FreeType 2 to edit fonts or create new ones? +

+ +

The answer is a definitive no, because the library was + specifically designed to read font files with small code size + and very low memory usage.

+ +

We thus do not plan to support editing or creation in the font engine + in any way, as this would imply a complete rewrite. This doesn't mean + that we won't introduce a font editing/creation library in the future, + as this really depends on how many people are asking for it (or how much + they would be willing to pay for it), as well as the time of the + FreeType developers.

+ +

Do not expect anything in this direction until we officially announce + something though. There are other axes of development for this project + (like text-layout capabilities, glyph caching, etc.) that may be more + important to us at the moment.

+
+ +
+ + + + +
+

+ Compilation & Configuration +

+
+ + +

+ II.1 How do I compile the FreeType 2 library? +

+ +

The library can be compiled in various ways, and a detailed + documentation is available in the file freetype2/docs/BUILD. + However, we will summarize the process to a few cases:

+ +

+ a. Using the command-line 2 build system +

+ +

The engine comes with a sophisticated build system that is used to + configure and compile a build of the library. You will need GNU + Make installed on your platform (Note: It will + not work with other Make tools).

+ +

Basically, you will need to invoke make a first time in + the top-level FreeType 2 directory in order to set up the build. + This will detect your current platform and choose a configuration + sub-makefile to drive the build. A specific compiler can be selected + on some platforms by providing an additional target. For example, on + Win32:

+ +
    +
  • + make visualc will select the Visual  C++ + compiler +
  • +
  • + make lcc will select the Win32-lcc compiler +
  • +
+ +

Note that on Unix, when the first time make is called, a configure + script located in freetype2/builds/unix will be run in order + to automatically detect the platform & compiler.

+ +

A summary will be displayed showing the detected platform and + compiler selected. You will then be able to start the build by + invoking make a second time. In case of problem, consult the + BUILD document.

+ +

+ b. Direct compilation +

+ +

You can also directly compile the library from the command line by + using these simple rules:

+ +
    +
  • + You should place the directories freetype2/include and + freetype2/src in your include path in order to compile + any component of the library. You can also add the + system-specific build directory (i.e. + builds/system/) in the case where an alternate + implementation of some of the components is available there (e.g. + the memory-mapped i/o implementation on some Unix systems). +
  • +
  • + The components of the library are located in sub-directories of + src, for example: src/base, + src/truetype, etc. +
  • +
  • + Each component is normally compiled through a single C file that + wraps other sources in the component's directory. For + example, you should build the TrueType font driver by compiling + the file src/truetype/truetype.c. The list of + C files to compile for a feature-complete build of the + library is given in the BUILD document. +
  • +
+ +

+ c. Using a graphical IDE +

+ +

Well, the process is vastly similar to the one described in b., + except that you need to set the include paths, source code paths, etc. + in dialog boxes before running the compilation.

+ +
+
+

+ II.2 How do I configure my build of the library? +

+ +

Each build of the library is configured through two header files + located in include/freetype/config:

+ +
    +
  • + ftoption.h +
    + This file contains various configuration macros whose definition can + be toggled on a per-build basis. Each macro is heavily commented in + this file's comment, and we invite you to refer to it directly. +
  • +
  • + ftmodule.h +
    + This file contains the list of all the modules that are initially + registered (added) when the function FT_Init_FreeType() is + called. See the next answer to know how to change it and why it may + be important. +
  • +
+ +

Alternatively, some specific implementations of some FreeType 2 + components can be provided in a builds/system/ + directory (e.g. the Unix-specific ftsystem.c that uses + memory-mapped file for i/o).

+ +
+
+

+ II.3 How do I select the modules I need in my build? +

+ +

The function FT_Init_FreeType() creates a new instance of + the FreeType 2 library and registers a set of "default" modules + before returning to the calling application. Its default implementation + is in the file src/base/ftinit.c.

+ +

The list of default modules used by ftinit.c is located in + the configuration file include/freetype/config/ftmodule.h. + Normally, it is automatically generated by the build system by invoking + the "make modules" command in the top level + FreeType 2 directory (Note: this only works with GNU Make; you can + edit the file by hand otherwise). It does so by parsing all + sub-directories of src that contain a file named + module.mk.

+ +

Note that a specific port or project is free to provide its own + implementation of ftinit.c in order to ensure a different + initialization sequence. For example, one could do something like:

+ +
    +
  • + Compile each module as a shared library (DLL or .so) with a + common "entry point" to retrieve a pointer to its module class + (there is already some code that allows this when compiling each + module). +
  • +
  • + Place these modules in a directory like + /usr/lib/freetype2/modules/. +
  • +
  • + Provide an implementation of ftinit.c that would scan the + directory for valid modules. +
  • +
+ +

This example only emphasizes the flexibility that is left to + developers when building the library.

+ +
+
+

+ II.4 How do I compile all FreeType 2 files in a single + directory? +

+ +

Some projects may need, for the sake of simplicity or ease of + building, to compile the FreeType 2 library with all source files + copied to a single directory. This is possible.

+ +

To do so, you have to copy all source files located under + src to your own directory (you must retain the include files in + a distinct hierarchy though), then compile each of the FreeType 2 + component with the macro FT_FLAT_COMPILE. This will change the + way #include works during the build.

+ +
+ +
+ + + + +
+

+ The FreeType 2 auto-hinter +

+
+ + +

+ III.1 Under which license is the FreeType 2 auto-hinter released? +

+ +

The auto-hinter was initially designed and implemented under contract + for Catharon Productions, Inc + which gladly accepted to released it under an open-source license + compatible with the FreeType one.

+ +

This license can be found in + src/autohint/CatharonLicense.txt and requires that you cite + Catharon Productions in your documentation (just like you do with + FreeType) when using the auto-hinting module.

+ +

Other than that, you still have the same freedom than with the good + old FreeType license. Enjoy!

+ +
+ +

+ III.2 How does the auto-hinter work? +

+ +

Well, a complete description would be difficult. Have a look at the + dedicated auto-hinter pages on the + FreeType site, as they describe most of its details with graphics and + explanations. You could also look at the source code if you want + to :-)

+ +

To give a few details, the auto-hinter is used to perform + grid-fitting on scalable font formats that use Bézier outlines as + their primary glyph image format (this means nearly all scalable font + formats today). If a given font driver doesn't provide its own hinter, + the auto-hinter is used by default. If a format-specific hinter is + provided, it is still possible to use the auto-hinter using the + FT_LOAD_FORCE_AUTOHINT bit flag when calling + FT_Load_Glyph().

+ +

The auto-hinter currently doesn't use external hints to do its job, + as it automatically computes global metrics (when it "opens" a font for + the first time) and glyph "hints" from their outline. Note that we plan + the ability to specify external hints, given that it is based on a + constraint system. That could be used to support native hints in + Type 1/Type 2 fonts, for example.

+ +
+ +

+ III.3 Why does the auto-hinter doesn't work correctly with CJK + fonts? +

+ +

The auto-hinter was first designed to manage and hint Latin-based + fonts, as they consist of most of the fonts available today. It doesn't + hint Asian fonts, as well as a few other complex scripts, because we + didn't put enough research on the topic yet. Hinting CJK isn't really + more difficult than Latin, just different, with a set of different + constraints (basically, more distortion of glyphs is acceptable as long + as certain features like triple-stem positions are respected more + strictly).

+ +

We thus plan to handle such a case in the near future. Please be + patient.

+
+ +
+ + + + +
+

+ Other questions +

+
+ + +

+ IV.1 Can I use FreeType to draw text on a pixmap with arbitratry depth? +

+ +

Not directly, as FreeType is a font library, not a general purpose + graphics library or text rendering service. However, note that the + anti-aliased renderer allows you to convert a vectorial glyph outline + into a list of "spans" (i.e. horizontal pixel segments with same + coverage) that can be rendered through user-provided callbacks.

+ +

By providing the appropriate span callback, you can render + anti-aliased text to any kind of surface. You can also use any color or + fill pattern/image if you want to. This process is called direct + rendering. For more information, please read the documentation + contained in the following files:

+ +
    +
  • +

    <freetype/ftimage.h> contains the definition of + the FT_Raster_Params type used with direct rendering.

    +
  • +
  • +

    <freetype/ftoutln.h> contains the definition of + the FT_Outline_Render() function that can be used to + convert vectorial outlines to span lists.

    +
  • +
+ +

Here's some code that uses them:

+ +
+    FT_Raster_Params  params;
+    FT_Outline        outline;
+       
+
+    ... load vectorial glyph in "outline" ...
+       
+    params.flags      = ft_raster_flag_aa | ft_raster_flag_direct;
+    params.gray_spans = (FT_Raster_Span_Func)your_own_span_function_here;
+    params.user       = your_own_data_pointer;
+       
+    error = FT_Outline_Render( library, &outline, &params );
+
+ +

Note that direct rendering is not available with monochrome + output, as the current renderer uses a two-pass algorithm to generate + glyphs with correct drop-out control.

+ +
+
+

+ IV.2 How can I set the color of text rendered by FreeType? +

+ +

Basically, you can't do that, because FreeType is simply a font + library. In general, you will need to use your favorite graphics + library to draw the FreeType glyphs with the appropriate color.

+ +

Note that for anti-aliased glyphs, you can "set the color" by using + direct rendering as described in this + answer.

+ +
+ +

+ IV.3 I set the pixel size to 8x8, but the resulting glyphs are larger + (or smaller) than that. Why? +

+ +

A lot of people have difficulties to understand this topic, because + they think of glyphs as fixed-width resp. fixed-height "cells", like + those of fonts used in terminals/consoles. This assumption is simply + not valid with most "modern" font formats, even bitmapped-based ones + like PCF or BDF.

+ +

Be aware that the character size that is set either through + FT_Set_Char_Size() or FT_Set_Pixel_Sizes() isn't + directly related to the dimension of the glyph bitmaps generated.

+ +

Rather, the character size is indeed the size of an abstract + square, called the EM, used by typographers to design + fonts. Scaling two distinct fonts to the same character size, be it + expressed in points or pixels, will generally result in bitmaps with + distinct dimensions!

+ +

Note that historically, the EM corresponded to the width of a capital + "M" in Latin typefaces. However, later improvements in typography led + to designs that greatly detract from this rule. Today, it is not + possible to connect the EM size to a specific font "feature" in a + reliable way.

+ +
+
+

+ IV.4 How can I compute the bounding box of a given string of text + without loading its glyphs before? +

+ +

A lot of people want to be able to compute the size in pixels of a + simple string of text with minimal overhead. For example, that can be + useful to draw centered text within a button. (to be continued...)

+ +
+
+

+ IV.5 Which anti-aliasing algorithm is used by FreeType 2?

+ +

The algorithm has been specifically designed for FreeType. It is + based on ideas that were originally found in the implementation of the + libArt graphics library to + compute the exact pixel coverage of a vector image with + absolutely no sub-sampling/filtering.

+ +

However, these two implementations are radically distinct and use + vastly different models. The FreeType 2 renderer is optimized + specifically for rendering small complex shapes, like glyphs, at very + high speed while using very few memory; while libArt shines at general + shape/polygon processing, especially large ones.

+ +

The FreeType 2 anti-aliasing renderer is indeed faster + than the monochrome renderer for small character sizes (typically + <20 pixels). The reason is that the monochrome renderer must + perform two passes on the outline in order to perform drop-out control + according to the TrueType specification (we could drop this requirement + later though).

+ +

We will try to document its design in a later document, though this + is not a priority for now.

+ +
+ +

+ IV.6 When will FreeType 2 support OpenType? +

+ +

Well, the engine already reads OpenType/CFF files perfectly. What it + doesn't do is handle "OpenType Layout" tables yet.

+ +

FreeType 1 comes with a set of extensions that are used to load + and manage OpenType Layout tables. It even has a demonstration program + named ftstrtto to show its capabilities.

+ +

For FreeType 2, we have decided that the layout operations + provided through these tables are better placed in a specific + text-layout library, (many people having asked for such a thing). This + new engine will not depend on FreeType2 explicitly and will be developed + as a separate project. We plan to announce it in a few weeks with all + gory details, once the definitive 2.0 release of FreeType has been + made.

+ +
+ +


+ + Back to FreeType homepage

+ +

+ + Index: xc/extras/freetype2/docs/glnames.py diff -u /dev/null xc/extras/freetype2/docs/glnames.py:1.1.1.1 --- /dev/null Mon Dec 18 14:22:26 2000 +++ xc/extras/freetype2/docs/glnames.py Fri Dec 8 16:26:11 2000 @@ -0,0 +1,1706 @@ +#!/usr/bin/env python +# + +# +# FreeType 2 glyph name builder +# + + +# 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. + + +"""\ + +usage: %s + + This very simple python script is used to generate 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 + + +# This table is used to name the glyph according to the Macintosh +# specification. It is used by the TrueType Postscript names table +# +mac_standard_names = \ +[ + # 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" +] + + +t1_standard_strings = \ +[ + # 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", "periodcenter", + "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", "Islash", "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", "Uacautesmall", + "Ucircumflexsmall", + "Udieresissmall", "Yacutesmall", "Thornsmall", "Ydieresissmall", + "001.000", + + # 380 + "001.001", "001.002", "001.003", "Black", "Bold", + "Book", "Light", "Medium", "Regular", "Roman", + + # 390 + "Semibold" +] + + +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 +] + + +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, 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 +] + + +# This data has been taken literally from the file `glyphlist.txt', +# version 1.2, 22 Oct 1998. It is available from +# +# http://partners.adobe.com/asn/developer/typeforum/unicodegn.html +# +adobe_glyph_list = """\ +0041;A;LATIN CAPITAL LETTER A +00C6;AE;LATIN CAPITAL LETTER AE +01FC;AEacute;LATIN CAPITAL LETTER AE WITH ACUTE +F7E6;AEsmall;LATIN SMALL CAPITAL LETTER AE +00C1;Aacute;LATIN CAPITAL LETTER A WITH ACUTE +F7E1;Aacutesmall;LATIN SMALL CAPITAL LETTER A WITH ACUTE +0102;Abreve;LATIN CAPITAL LETTER A WITH BREVE +00C2;Acircumflex;LATIN CAPITAL LETTER A WITH CIRCUMFLEX +F7E2;Acircumflexsmall;LATIN SMALL CAPITAL LETTER A WITH CIRCUMFLEX +F6C9;Acute;CAPITAL ACUTE ACCENT +F7B4;Acutesmall;SMALL CAPITAL ACUTE ACCENT +00C4;Adieresis;LATIN CAPITAL LETTER A WITH DIAERESIS +F7E4;Adieresissmall;LATIN SMALL CAPITAL LETTER A WITH DIAERESIS +00C0;Agrave;LATIN CAPITAL LETTER A WITH GRAVE +F7E0;Agravesmall;LATIN SMALL CAPITAL LETTER A WITH GRAVE +0391;Alpha;GREEK CAPITAL LETTER ALPHA +0386;Alphatonos;GREEK CAPITAL LETTER ALPHA WITH TONOS +0100;Amacron;LATIN CAPITAL LETTER A WITH MACRON +0104;Aogonek;LATIN CAPITAL LETTER A WITH OGONEK +00C5;Aring;LATIN CAPITAL LETTER A WITH RING ABOVE +01FA;Aringacute;LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE +F7E5;Aringsmall;LATIN SMALL CAPITAL LETTER A WITH RING ABOVE +F761;Asmall;LATIN SMALL CAPITAL LETTER A +00C3;Atilde;LATIN CAPITAL LETTER A WITH TILDE +F7E3;Atildesmall;LATIN SMALL CAPITAL LETTER A WITH TILDE +0042;B;LATIN CAPITAL LETTER B +0392;Beta;GREEK CAPITAL LETTER BETA +F6F4;Brevesmall;SMALL CAPITAL BREVE +F762;Bsmall;LATIN SMALL CAPITAL LETTER B +0043;C;LATIN CAPITAL LETTER C +0106;Cacute;LATIN CAPITAL LETTER C WITH ACUTE +F6CA;Caron;CAPITAL CARON +F6F5;Caronsmall;SMALL CAPITAL CARON +010C;Ccaron;LATIN CAPITAL LETTER C WITH CARON +00C7;Ccedilla;LATIN CAPITAL LETTER C WITH CEDILLA +F7E7;Ccedillasmall;LATIN SMALL CAPITAL LETTER C WITH CEDILLA +0108;Ccircumflex;LATIN CAPITAL LETTER C WITH CIRCUMFLEX +010A;Cdotaccent;LATIN CAPITAL LETTER C WITH DOT ABOVE +F7B8;Cedillasmall;SMALL CAPITAL CEDILLA +03A7;Chi;GREEK CAPITAL LETTER CHI +F6F6;Circumflexsmall;SMALL CAPITAL MODIFIER LETTER CIRCUMFLEX ACCENT +F763;Csmall;LATIN SMALL CAPITAL LETTER C +0044;D;LATIN CAPITAL LETTER D +010E;Dcaron;LATIN CAPITAL LETTER D WITH CARON +0110;Dcroat;LATIN CAPITAL LETTER D WITH STROKE +2206;Delta;INCREMENT +0394;Delta;GREEK CAPITAL LETTER DELTA;Duplicate +F6CB;Dieresis;CAPITAL DIAERESIS +F6CC;DieresisAcute;CAPITAL DIAERESIS ACUTE ACCENT +F6CD;DieresisGrave;CAPITAL DIAERESIS GRAVE ACCENT +F7A8;Dieresissmall;SMALL CAPITAL DIAERESIS +F6F7;Dotaccentsmall;SMALL CAPITAL DOT ABOVE +F764;Dsmall;LATIN SMALL CAPITAL LETTER D +0045;E;LATIN CAPITAL LETTER E +00C9;Eacute;LATIN CAPITAL LETTER E WITH ACUTE +F7E9;Eacutesmall;LATIN SMALL CAPITAL LETTER E WITH ACUTE +0114;Ebreve;LATIN CAPITAL LETTER E WITH BREVE +011A;Ecaron;LATIN CAPITAL LETTER E WITH CARON +00CA;Ecircumflex;LATIN CAPITAL LETTER E WITH CIRCUMFLEX +F7EA;Ecircumflexsmall;LATIN SMALL CAPITAL LETTER E WITH CIRCUMFLEX +00CB;Edieresis;LATIN CAPITAL LETTER E WITH DIAERESIS +F7EB;Edieresissmall;LATIN SMALL CAPITAL LETTER E WITH DIAERESIS +0116;Edotaccent;LATIN CAPITAL LETTER E WITH DOT ABOVE +00C8;Egrave;LATIN CAPITAL LETTER E WITH GRAVE +F7E8;Egravesmall;LATIN SMALL CAPITAL LETTER E WITH GRAVE +0112;Emacron;LATIN CAPITAL LETTER E WITH MACRON +014A;Eng;LATIN CAPITAL LETTER ENG +0118;Eogonek;LATIN CAPITAL LETTER E WITH OGONEK +0395;Epsilon;GREEK CAPITAL LETTER EPSILON +0388;Epsilontonos;GREEK CAPITAL LETTER EPSILON WITH TONOS +F765;Esmall;LATIN SMALL CAPITAL LETTER E +0397;Eta;GREEK CAPITAL LETTER ETA +0389;Etatonos;GREEK CAPITAL LETTER ETA WITH TONOS +00D0;Eth;LATIN CAPITAL LETTER ETH +F7F0;Ethsmall;LATIN SMALL CAPITAL LETTER ETH +20AC;Euro;EURO SIGN +0046;F;LATIN CAPITAL LETTER F +F766;Fsmall;LATIN SMALL CAPITAL LETTER F +0047;G;LATIN CAPITAL LETTER G +0393;Gamma;GREEK CAPITAL LETTER GAMMA +011E;Gbreve;LATIN CAPITAL LETTER G WITH BREVE +01E6;Gcaron;LATIN CAPITAL LETTER G WITH CARON +011C;Gcircumflex;LATIN CAPITAL LETTER G WITH CIRCUMFLEX +0122;Gcommaaccent;LATIN CAPITAL LETTER G WITH CEDILLA +0120;Gdotaccent;LATIN CAPITAL LETTER G WITH DOT ABOVE +F6CE;Grave;CAPITAL GRAVE ACCENT +F760;Gravesmall;SMALL CAPITAL GRAVE ACCENT +F767;Gsmall;LATIN SMALL CAPITAL LETTER G +0048;H;LATIN CAPITAL LETTER H +25CF;H18533;BLACK CIRCLE +25AA;H18543;BLACK SMALL SQUARE +25AB;H18551;WHITE SMALL SQUARE +25A1;H22073;WHITE SQUARE +0126;Hbar;LATIN CAPITAL LETTER H WITH STROKE +0124;Hcircumflex;LATIN CAPITAL LETTER H WITH CIRCUMFLEX +F768;Hsmall;LATIN SMALL CAPITAL LETTER H +F6CF;Hungarumlaut;CAPITAL DOUBLE ACUTE ACCENT +F6F8;Hungarumlautsmall;SMALL CAPITAL DOUBLE ACUTE ACCENT +0049;I;LATIN CAPITAL LETTER I +0132;IJ;LATIN CAPITAL LIGATURE IJ +00CD;Iacute;LATIN CAPITAL LETTER I WITH ACUTE +F7ED;Iacutesmall;LATIN SMALL CAPITAL LETTER I WITH ACUTE +012C;Ibreve;LATIN CAPITAL LETTER I WITH BREVE +00CE;Icircumflex;LATIN CAPITAL LETTER I WITH CIRCUMFLEX +F7EE;Icircumflexsmall;LATIN SMALL CAPITAL LETTER I WITH CIRCUMFLEX +00CF;Idieresis;LATIN CAPITAL LETTER I WITH DIAERESIS +F7EF;Idieresissmall;LATIN SMALL CAPITAL LETTER I WITH DIAERESIS +0130;Idotaccent;LATIN CAPITAL LETTER I WITH DOT ABOVE +2111;Ifraktur;BLACK-LETTER CAPITAL I +00CC;Igrave;LATIN CAPITAL LETTER I WITH GRAVE +F7EC;Igravesmall;LATIN SMALL CAPITAL LETTER I WITH GRAVE +012A;Imacron;LATIN CAPITAL LETTER I WITH MACRON +012E;Iogonek;LATIN CAPITAL LETTER I WITH OGONEK +0399;Iota;GREEK CAPITAL LETTER IOTA +03AA;Iotadieresis;GREEK CAPITAL LETTER IOTA WITH DIALYTIKA +038A;Iotatonos;GREEK CAPITAL LETTER IOTA WITH TONOS +F769;Ismall;LATIN SMALL CAPITAL LETTER I +0128;Itilde;LATIN CAPITAL LETTER I WITH TILDE +004A;J;LATIN CAPITAL LETTER J +0134;Jcircumflex;LATIN CAPITAL LETTER J WITH CIRCUMFLEX +F76A;Jsmall;LATIN SMALL CAPITAL LETTER J +004B;K;LATIN CAPITAL LETTER K +039A;Kappa;GREEK CAPITAL LETTER KAPPA +0136;Kcommaaccent;LATIN CAPITAL LETTER K WITH CEDILLA +F76B;Ksmall;LATIN SMALL CAPITAL LETTER K +004C;L;LATIN CAPITAL LETTER L +F6BF;LL;LATIN CAPITAL LETTER LL +0139;Lacute;LATIN CAPITAL LETTER L WITH ACUTE +039B;Lambda;GREEK CAPITAL LETTER LAMDA +013D;Lcaron;LATIN CAPITAL LETTER L WITH CARON +013B;Lcommaaccent;LATIN CAPITAL LETTER L WITH CEDILLA +013F;Ldot;LATIN CAPITAL LETTER L WITH MIDDLE DOT +0141;Lslash;LATIN CAPITAL LETTER L WITH STROKE +F6F9;Lslashsmall;LATIN SMALL CAPITAL LETTER L WITH STROKE +F76C;Lsmall;LATIN SMALL CAPITAL LETTER L +004D;M;LATIN CAPITAL LETTER M +F6D0;Macron;CAPITAL MACRON +F7AF;Macronsmall;SMALL CAPITAL MACRON +F76D;Msmall;LATIN SMALL CAPITAL LETTER M +039C;Mu;GREEK CAPITAL LETTER MU +004E;N;LATIN CAPITAL LETTER N +0143;Nacute;LATIN CAPITAL LETTER N WITH ACUTE +0147;Ncaron;LATIN CAPITAL LETTER N WITH CARON +0145;Ncommaaccent;LATIN CAPITAL LETTER N WITH CEDILLA +F76E;Nsmall;LATIN SMALL CAPITAL LETTER N +00D1;Ntilde;LATIN CAPITAL LETTER N WITH TILDE +F7F1;Ntildesmall;LATIN SMALL CAPITAL LETTER N WITH TILDE +039D;Nu;GREEK CAPITAL LETTER NU +004F;O;LATIN CAPITAL LETTER O +0152;OE;LATIN CAPITAL LIGATURE OE +F6FA;OEsmall;LATIN SMALL CAPITAL LIGATURE OE +00D3;Oacute;LATIN CAPITAL LETTER O WITH ACUTE +F7F3;Oacutesmall;LATIN SMALL CAPITAL LETTER O WITH ACUTE +014E;Obreve;LATIN CAPITAL LETTER O WITH BREVE +00D4;Ocircumflex;LATIN CAPITAL LETTER O WITH CIRCUMFLEX +F7F4;Ocircumflexsmall;LATIN SMALL CAPITAL LETTER O WITH CIRCUMFLEX +00D6;Odieresis;LATIN CAPITAL LETTER O WITH DIAERESIS +F7F6;Odieresissmall;LATIN SMALL CAPITAL LETTER O WITH DIAERESIS +F6FB;Ogoneksmall;SMALL CAPITAL OGONEK +00D2;Ograve;LATIN CAPITAL LETTER O WITH GRAVE +F7F2;Ogravesmall;LATIN SMALL CAPITAL LETTER O WITH GRAVE +01A0;Ohorn;LATIN CAPITAL LETTER O WITH HORN +0150;Ohungarumlaut;LATIN CAPITAL LETTER O WITH DOUBLE ACUTE +014C;Omacron;LATIN CAPITAL LETTER O WITH MACRON +2126;Omega;OHM SIGN +03A9;Omega;GREEK CAPITAL LETTER OMEGA;Duplicate +038F;Omegatonos;GREEK CAPITAL LETTER OMEGA WITH TONOS +039F;Omicron;GREEK CAPITAL LETTER OMICRON +038C;Omicrontonos;GREEK CAPITAL LETTER OMICRON WITH TONOS +00D8;Oslash;LATIN CAPITAL LETTER O WITH STROKE +01FE;Oslashacute;LATIN CAPITAL LETTER O WITH STROKE AND ACUTE +F7F8;Oslashsmall;LATIN SMALL CAPITAL LETTER O WITH STROKE +F76F;Osmall;LATIN SMALL CAPITAL LETTER O +00D5;Otilde;LATIN CAPITAL LETTER O WITH TILDE +F7F5;Otildesmall;LATIN SMALL CAPITAL LETTER O WITH TILDE +0050;P;LATIN CAPITAL LETTER P +03A6;Phi;GREEK CAPITAL LETTER PHI +03A0;Pi;GREEK CAPITAL LETTER PI +03A8;Psi;GREEK CAPITAL LETTER PSI +F770;Psmall;LATIN SMALL CAPITAL LETTER P +0051;Q;LATIN CAPITAL LETTER Q +F771;Qsmall;LATIN SMALL CAPITAL LETTER Q +0052;R;LATIN CAPITAL LETTER R +0154;Racute;LATIN CAPITAL LETTER R WITH ACUTE +0158;Rcaron;LATIN CAPITAL LETTER R WITH CARON +0156;Rcommaaccent;LATIN CAPITAL LETTER R WITH CEDILLA +211C;Rfraktur;BLACK-LETTER CAPITAL R +03A1;Rho;GREEK CAPITAL LETTER RHO +F6FC;Ringsmall;SMALL CAPITAL RING ABOVE +F772;Rsmall;LATIN SMALL CAPITAL LETTER R +0053;S;LATIN CAPITAL LETTER S +250C;SF010000;BOX DRAWINGS LIGHT DOWN AND RIGHT +2514;SF020000;BOX DRAWINGS LIGHT UP AND RIGHT +2510;SF030000;BOX DRAWINGS LIGHT DOWN AND LEFT +2518;SF040000;BOX DRAWINGS LIGHT UP AND LEFT +253C;SF050000;BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL +252C;SF060000;BOX DRAWINGS LIGHT DOWN AND HORIZONTAL +2534;SF070000;BOX DRAWINGS LIGHT UP AND HORIZONTAL +251C;SF080000;BOX DRAWINGS LIGHT VERTICAL AND RIGHT +2524;SF090000;BOX DRAWINGS LIGHT VERTICAL AND LEFT +2500;SF100000;BOX DRAWINGS LIGHT HORIZONTAL +2502;SF110000;BOX DRAWINGS LIGHT VERTICAL +2561;SF190000;BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE +2562;SF200000;BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE +2556;SF210000;BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE +2555;SF220000;BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE +2563;SF230000;BOX DRAWINGS DOUBLE VERTICAL AND LEFT +2551;SF240000;BOX DRAWINGS DOUBLE VERTICAL +2557;SF250000;BOX DRAWINGS DOUBLE DOWN AND LEFT +255D;SF260000;BOX DRAWINGS DOUBLE UP AND LEFT +255C;SF270000;BOX DRAWINGS UP DOUBLE AND LEFT SINGLE +255B;SF280000;BOX DRAWINGS UP SINGLE AND LEFT DOUBLE +255E;SF360000;BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE +255F;SF370000;BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE +255A;SF380000;BOX DRAWINGS DOUBLE UP AND RIGHT +2554;SF390000;BOX DRAWINGS DOUBLE DOWN AND RIGHT +2569;SF400000;BOX DRAWINGS DOUBLE UP AND HORIZONTAL +2566;SF410000;BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL +2560;SF420000;BOX DRAWINGS DOUBLE VERTICAL AND RIGHT +2550;SF430000;BOX DRAWINGS DOUBLE HORIZONTAL +256C;SF440000;BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL +2567;SF450000;BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE +2568;SF460000;BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE +2564;SF470000;BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE +2565;SF480000;BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE +2559;SF490000;BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE +2558;SF500000;BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE +2552;SF510000;BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE +2553;SF520000;BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE +256B;SF530000;BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE +256A;SF540000;BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE +015A;Sacute;LATIN CAPITAL LETTER S WITH ACUTE +0160;Scaron;LATIN CAPITAL LETTER S WITH CARON +F6FD;Scaronsmall;LATIN SMALL CAPITAL LETTER S WITH CARON +015E;Scedilla;LATIN CAPITAL LETTER S WITH CEDILLA +F6C1;Scedilla;LATIN CAPITAL LETTER S WITH CEDILLA;Duplicate +015C;Scircumflex;LATIN CAPITAL LETTER S WITH CIRCUMFLEX +0218;Scommaaccent;LATIN CAPITAL LETTER S WITH COMMA BELOW +03A3;Sigma;GREEK CAPITAL LETTER SIGMA +F773;Ssmall;LATIN SMALL CAPITAL LETTER S +0054;T;LATIN CAPITAL LETTER T +03A4;Tau;GREEK CAPITAL LETTER TAU +0166;Tbar;LATIN CAPITAL LETTER T WITH STROKE +0164;Tcaron;LATIN CAPITAL LETTER T WITH CARON +0162;Tcommaaccent;LATIN CAPITAL LETTER T WITH CEDILLA +021A;Tcommaaccent;LATIN CAPITAL LETTER T WITH COMMA BELOW;Duplicate +0398;Theta;GREEK CAPITAL LETTER THETA +00DE;Thorn;LATIN CAPITAL LETTER THORN +F7FE;Thornsmall;LATIN SMALL CAPITAL LETTER THORN +F6FE;Tildesmall;SMALL CAPITAL SMALL TILDE +F774;Tsmall;LATIN SMALL CAPITAL LETTER T +0055;U;LATIN CAPITAL LETTER U +00DA;Uacute;LATIN CAPITAL LETTER U WITH ACUTE +F7FA;Uacutesmall;LATIN SMALL CAPITAL LETTER U WITH ACUTE +016C;Ubreve;LATIN CAPITAL LETTER U WITH BREVE +00DB;Ucircumflex;LATIN CAPITAL LETTER U WITH CIRCUMFLEX +F7FB;Ucircumflexsmall;LATIN SMALL CAPITAL LETTER U WITH CIRCUMFLEX +00DC;Udieresis;LATIN CAPITAL LETTER U WITH DIAERESIS +F7FC;Udieresissmall;LATIN SMALL CAPITAL LETTER U WITH DIAERESIS +00D9;Ugrave;LATIN CAPITAL LETTER U WITH GRAVE +F7F9;Ugravesmall;LATIN SMALL CAPITAL LETTER U WITH GRAVE +01AF;Uhorn;LATIN CAPITAL LETTER U WITH HORN +0170;Uhungarumlaut;LATIN CAPITAL LETTER U WITH DOUBLE ACUTE +016A;Umacron;LATIN CAPITAL LETTER U WITH MACRON +0172;Uogonek;LATIN CAPITAL LETTER U WITH OGONEK +03A5;Upsilon;GREEK CAPITAL LETTER UPSILON +03D2;Upsilon1;GREEK UPSILON WITH HOOK SYMBOL +03AB;Upsilondieresis;GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA +038E;Upsilontonos;GREEK CAPITAL LETTER UPSILON WITH TONOS +016E;Uring;LATIN CAPITAL LETTER U WITH RING ABOVE +F775;Usmall;LATIN SMALL CAPITAL LETTER U +0168;Utilde;LATIN CAPITAL LETTER U WITH TILDE +0056;V;LATIN CAPITAL LETTER V +F776;Vsmall;LATIN SMALL CAPITAL LETTER V +0057;W;LATIN CAPITAL LETTER W +1E82;Wacute;LATIN CAPITAL LETTER W WITH ACUTE +0174;Wcircumflex;LATIN CAPITAL LETTER W WITH CIRCUMFLEX +1E84;Wdieresis;LATIN CAPITAL LETTER W WITH DIAERESIS +1E80;Wgrave;LATIN CAPITAL LETTER W WITH GRAVE +F777;Wsmall;LATIN SMALL CAPITAL LETTER W +0058;X;LATIN CAPITAL LETTER X +039E;Xi;GREEK CAPITAL LETTER XI +F778;Xsmall;LATIN SMALL CAPITAL LETTER X +0059;Y;LATIN CAPITAL LETTER Y +00DD;Yacute;LATIN CAPITAL LETTER Y WITH ACUTE +F7FD;Yacutesmall;LATIN SMALL CAPITAL LETTER Y WITH ACUTE +0176;Ycircumflex;LATIN CAPITAL LETTER Y WITH CIRCUMFLEX +0178;Ydieresis;LATIN CAPITAL LETTER Y WITH DIAERESIS +F7FF;Ydieresissmall;LATIN SMALL CAPITAL LETTER Y WITH DIAERESIS +1EF2;Ygrave;LATIN CAPITAL LETTER Y WITH GRAVE +F779;Ysmall;LATIN SMALL CAPITAL LETTER Y +005A;Z;LATIN CAPITAL LETTER Z +0179;Zacute;LATIN CAPITAL LETTER Z WITH ACUTE +017D;Zcaron;LATIN CAPITAL LETTER Z WITH CARON +F6FF;Zcaronsmall;LATIN SMALL CAPITAL LETTER Z WITH CARON +017B;Zdotaccent;LATIN CAPITAL LETTER Z WITH DOT ABOVE +0396;Zeta;GREEK CAPITAL LETTER ZETA +F77A;Zsmall;LATIN SMALL CAPITAL LETTER Z +0061;a;LATIN SMALL LETTER A +00E1;aacute;LATIN SMALL LETTER A WITH ACUTE +0103;abreve;LATIN SMALL LETTER A WITH BREVE +00E2;acircumflex;LATIN SMALL LETTER A WITH CIRCUMFLEX +00B4;acute;ACUTE ACCENT +0301;acutecomb;COMBINING ACUTE ACCENT +00E4;adieresis;LATIN SMALL LETTER A WITH DIAERESIS +00E6;ae;LATIN SMALL LETTER AE +01FD;aeacute;LATIN SMALL LETTER AE WITH ACUTE +2015;afii00208;HORIZONTAL BAR +0410;afii10017;CYRILLIC CAPITAL LETTER A +0411;afii10018;CYRILLIC CAPITAL LETTER BE +0412;afii10019;CYRILLIC CAPITAL LETTER VE +0413;afii10020;CYRILLIC CAPITAL LETTER GHE +0414;afii10021;CYRILLIC CAPITAL LETTER DE +0415;afii10022;CYRILLIC CAPITAL LETTER IE +0401;afii10023;CYRILLIC CAPITAL LETTER IO +0416;afii10024;CYRILLIC CAPITAL LETTER ZHE +0417;afii10025;CYRILLIC CAPITAL LETTER ZE +0418;afii10026;CYRILLIC CAPITAL LETTER I +0419;afii10027;CYRILLIC CAPITAL LETTER SHORT I +041A;afii10028;CYRILLIC CAPITAL LETTER KA +041B;afii10029;CYRILLIC CAPITAL LETTER EL +041C;afii10030;CYRILLIC CAPITAL LETTER EM +041D;afii10031;CYRILLIC CAPITAL LETTER EN +041E;afii10032;CYRILLIC CAPITAL LETTER O +041F;afii10033;CYRILLIC CAPITAL LETTER PE +0420;afii10034;CYRILLIC CAPITAL LETTER ER +0421;afii10035;CYRILLIC CAPITAL LETTER ES +0422;afii10036;CYRILLIC CAPITAL LETTER TE +0423;afii10037;CYRILLIC CAPITAL LETTER U +0424;afii10038;CYRILLIC CAPITAL LETTER EF +0425;afii10039;CYRILLIC CAPITAL LETTER HA +0426;afii10040;CYRILLIC CAPITAL LETTER TSE +0427;afii10041;CYRILLIC CAPITAL LETTER CHE +0428;afii10042;CYRILLIC CAPITAL LETTER SHA +0429;afii10043;CYRILLIC CAPITAL LETTER SHCHA +042A;afii10044;CYRILLIC CAPITAL LETTER HARD SIGN +042B;afii10045;CYRILLIC CAPITAL LETTER YERU +042C;afii10046;CYRILLIC CAPITAL LETTER SOFT SIGN +042D;afii10047;CYRILLIC CAPITAL LETTER E +042E;afii10048;CYRILLIC CAPITAL LETTER YU +042F;afii10049;CYRILLIC CAPITAL LETTER YA +0490;afii10050;CYRILLIC CAPITAL LETTER GHE WITH UPTURN +0402;afii10051;CYRILLIC CAPITAL LETTER DJE +0403;afii10052;CYRILLIC CAPITAL LETTER GJE +0404;afii10053;CYRILLIC CAPITAL LETTER UKRAINIAN IE +0405;afii10054;CYRILLIC CAPITAL LETTER DZE +0406;afii10055;CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I +0407;afii10056;CYRILLIC CAPITAL LETTER YI +0408;afii10057;CYRILLIC CAPITAL LETTER JE +0409;afii10058;CYRILLIC CAPITAL LETTER LJE +040A;afii10059;CYRILLIC CAPITAL LETTER NJE +040B;afii10060;CYRILLIC CAPITAL LETTER TSHE +040C;afii10061;CYRILLIC CAPITAL LETTER KJE +040E;afii10062;CYRILLIC CAPITAL LETTER SHORT U +F6C4;afii10063;CYRILLIC SMALL LETTER GHE VARIANT +F6C5;afii10064;CYRILLIC SMALL LETTER BE VARIANT +0430;afii10065;CYRILLIC SMALL LETTER A +0431;afii10066;CYRILLIC SMALL LETTER BE +0432;afii10067;CYRILLIC SMALL LETTER VE +0433;afii10068;CYRILLIC SMALL LETTER GHE +0434;afii10069;CYRILLIC SMALL LETTER DE +0435;afii10070;CYRILLIC SMALL LETTER IE +0451;afii10071;CYRILLIC SMALL LETTER IO +0436;afii10072;CYRILLIC SMALL LETTER ZHE +0437;afii10073;CYRILLIC SMALL LETTER ZE +0438;afii10074;CYRILLIC SMALL LETTER I +0439;afii10075;CYRILLIC SMALL LETTER SHORT I +043A;afii10076;CYRILLIC SMALL LETTER KA +043B;afii10077;CYRILLIC SMALL LETTER EL +043C;afii10078;CYRILLIC SMALL LETTER EM +043D;afii10079;CYRILLIC SMALL LETTER EN +043E;afii10080;CYRILLIC SMALL LETTER O +043F;afii10081;CYRILLIC SMALL LETTER PE +0440;afii10082;CYRILLIC SMALL LETTER ER +0441;afii10083;CYRILLIC SMALL LETTER ES +0442;afii10084;CYRILLIC SMALL LETTER TE +0443;afii10085;CYRILLIC SMALL LETTER U +0444;afii10086;CYRILLIC SMALL LETTER EF +0445;afii10087;CYRILLIC SMALL LETTER HA +0446;afii10088;CYRILLIC SMALL LETTER TSE +0447;afii10089;CYRILLIC SMALL LETTER CHE +0448;afii10090;CYRILLIC SMALL LETTER SHA +0449;afii10091;CYRILLIC SMALL LETTER SHCHA +044A;afii10092;CYRILLIC SMALL LETTER HARD SIGN +044B;afii10093;CYRILLIC SMALL LETTER YERU +044C;afii10094;CYRILLIC SMALL LETTER SOFT SIGN +044D;afii10095;CYRILLIC SMALL LETTER E +044E;afii10096;CYRILLIC SMALL LETTER YU +044F;afii10097;CYRILLIC SMALL LETTER YA +0491;afii10098;CYRILLIC SMALL LETTER GHE WITH UPTURN +0452;afii10099;CYRILLIC SMALL LETTER DJE +0453;afii10100;CYRILLIC SMALL LETTER GJE +0454;afii10101;CYRILLIC SMALL LETTER UKRAINIAN IE +0455;afii10102;CYRILLIC SMALL LETTER DZE +0456;afii10103;CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I +0457;afii10104;CYRILLIC SMALL LETTER YI +0458;afii10105;CYRILLIC SMALL LETTER JE +0459;afii10106;CYRILLIC SMALL LETTER LJE +045A;afii10107;CYRILLIC SMALL LETTER NJE +045B;afii10108;CYRILLIC SMALL LETTER TSHE +045C;afii10109;CYRILLIC SMALL LETTER KJE +045E;afii10110;CYRILLIC SMALL LETTER SHORT U +040F;afii10145;CYRILLIC CAPITAL LETTER DZHE +0462;afii10146;CYRILLIC CAPITAL LETTER YAT +0472;afii10147;CYRILLIC CAPITAL LETTER FITA +0474;afii10148;CYRILLIC CAPITAL LETTER IZHITSA +F6C6;afii10192;CYRILLIC SMALL LETTER DE VARIANT +045F;afii10193;CYRILLIC SMALL LETTER DZHE +0463;afii10194;CYRILLIC SMALL LETTER YAT +0473;afii10195;CYRILLIC SMALL LETTER FITA +0475;afii10196;CYRILLIC SMALL LETTER IZHITSA +F6C7;afii10831;CYRILLIC SMALL LETTER PE VARIANT +F6C8;afii10832;CYRILLIC SMALL LETTER TE VARIANT +04D9;afii10846;CYRILLIC SMALL LETTER SCHWA +200E;afii299;LEFT-TO-RIGHT MARK +200F;afii300;RIGHT-TO-LEFT MARK +200D;afii301;ZERO WIDTH JOINER +066A;afii57381;ARABIC PERCENT SIGN +060C;afii57388;ARABIC COMMA +0660;afii57392;ARABIC-INDIC DIGIT ZERO +0661;afii57393;ARABIC-INDIC DIGIT ONE +0662;afii57394;ARABIC-INDIC DIGIT TWO +0663;afii57395;ARABIC-INDIC DIGIT THREE +0664;afii57396;ARABIC-INDIC DIGIT FOUR +0665;afii57397;ARABIC-INDIC DIGIT FIVE +0666;afii57398;ARABIC-INDIC DIGIT SIX +0667;afii57399;ARABIC-INDIC DIGIT SEVEN +0668;afii57400;ARABIC-INDIC DIGIT EIGHT +0669;afii57401;ARABIC-INDIC DIGIT NINE +061B;afii57403;ARABIC SEMICOLON +061F;afii57407;ARABIC QUESTION MARK +0621;afii57409;ARABIC LETTER HAMZA +0622;afii57410;ARABIC LETTER ALEF WITH MADDA ABOVE +0623;afii57411;ARABIC LETTER ALEF WITH HAMZA ABOVE +0624;afii57412;ARABIC LETTER WAW WITH HAMZA ABOVE +0625;afii57413;ARABIC LETTER ALEF WITH HAMZA BELOW +0626;afii57414;ARABIC LETTER YEH WITH HAMZA ABOVE +0627;afii57415;ARABIC LETTER ALEF +0628;afii57416;ARABIC LETTER BEH +0629;afii57417;ARABIC LETTER TEH MARBUTA +062A;afii57418;ARABIC LETTER TEH +062B;afii57419;ARABIC LETTER THEH +062C;afii57420;ARABIC LETTER JEEM +062D;afii57421;ARABIC LETTER HAH +062E;afii57422;ARABIC LETTER KHAH +062F;afii57423;ARABIC LETTER DAL +0630;afii57424;ARABIC LETTER THAL +0631;afii57425;ARABIC LETTER REH +0632;afii57426;ARABIC LETTER ZAIN +0633;afii57427;ARABIC LETTER SEEN +0634;afii57428;ARABIC LETTER SHEEN +0635;afii57429;ARABIC LETTER SAD +0636;afii57430;ARABIC LETTER DAD +0637;afii57431;ARABIC LETTER TAH +0638;afii57432;ARABIC LETTER ZAH +0639;afii57433;ARABIC LETTER AIN +063A;afii57434;ARABIC LETTER GHAIN +0640;afii57440;ARABIC TATWEEL +0641;afii57441;ARABIC LETTER FEH +0642;afii57442;ARABIC LETTER QAF +0643;afii57443;ARABIC LETTER KAF +0644;afii57444;ARABIC LETTER LAM +0645;afii57445;ARABIC LETTER MEEM +0646;afii57446;ARABIC LETTER NOON +0648;afii57448;ARABIC LETTER WAW +0649;afii57449;ARABIC LETTER ALEF MAKSURA +064A;afii57450;ARABIC LETTER YEH +064B;afii57451;ARABIC FATHATAN +064C;afii57452;ARABIC DAMMATAN +064D;afii57453;ARABIC KASRATAN +064E;afii57454;ARABIC FATHA +064F;afii57455;ARABIC DAMMA +0650;afii57456;ARABIC KASRA +0651;afii57457;ARABIC SHADDA +0652;afii57458;ARABIC SUKUN +0647;afii57470;ARABIC LETTER HEH +06A4;afii57505;ARABIC LETTER VEH +067E;afii57506;ARABIC LETTER PEH +0686;afii57507;ARABIC LETTER TCHEH +0698;afii57508;ARABIC LETTER JEH +06AF;afii57509;ARABIC LETTER GAF +0679;afii57511;ARABIC LETTER TTEH +0688;afii57512;ARABIC LETTER DDAL +0691;afii57513;ARABIC LETTER RREH +06BA;afii57514;ARABIC LETTER NOON GHUNNA +06D2;afii57519;ARABIC LETTER YEH BARREE +06D5;afii57534;ARABIC LETTER AE +20AA;afii57636;NEW SHEQEL SIGN +05BE;afii57645;HEBREW PUNCTUATION MAQAF +05C3;afii57658;HEBREW PUNCTUATION SOF PASUQ +05D0;afii57664;HEBREW LETTER ALEF +05D1;afii57665;HEBREW LETTER BET +05D2;afii57666;HEBREW LETTER GIMEL +05D3;afii57667;HEBREW LETTER DALET +05D4;afii57668;HEBREW LETTER HE +05D5;afii57669;HEBREW LETTER VAV +05D6;afii57670;HEBREW LETTER ZAYIN +05D7;afii57671;HEBREW LETTER HET +05D8;afii57672;HEBREW LETTER TET +05D9;afii57673;HEBREW LETTER YOD +05DA;afii57674;HEBREW LETTER FINAL KAF +05DB;afii57675;HEBREW LETTER KAF +05DC;afii57676;HEBREW LETTER LAMED +05DD;afii57677;HEBREW LETTER FINAL MEM +05DE;afii57678;HEBREW LETTER MEM +05DF;afii57679;HEBREW LETTER FINAL NUN +05E0;afii57680;HEBREW LETTER NUN +05E1;afii57681;HEBREW LETTER SAMEKH +05E2;afii57682;HEBREW LETTER AYIN +05E3;afii57683;HEBREW LETTER FINAL PE +05E4;afii57684;HEBREW LETTER PE +05E5;afii57685;HEBREW LETTER FINAL TSADI +05E6;afii57686;HEBREW LETTER TSADI +05E7;afii57687;HEBREW LETTER QOF +05E8;afii57688;HEBREW LETTER RESH +05E9;afii57689;HEBREW LETTER SHIN +05EA;afii57690;HEBREW LETTER TAV +FB2A;afii57694;HEBREW LETTER SHIN WITH SHIN DOT +FB2B;afii57695;HEBREW LETTER SHIN WITH SIN DOT +FB4B;afii57700;HEBREW LETTER VAV WITH HOLAM +FB1F;afii57705;HEBREW LIGATURE YIDDISH YOD YOD PATAH +05F0;afii57716;HEBREW LIGATURE YIDDISH DOUBLE VAV +05F1;afii57717;HEBREW LIGATURE YIDDISH VAV YOD +05F2;afii57718;HEBREW LIGATURE YIDDISH DOUBLE YOD +FB35;afii57723;HEBREW LETTER VAV WITH DAGESH +05B4;afii57793;HEBREW POINT HIRIQ +05B5;afii57794;HEBREW POINT TSERE +05B6;afii57795;HEBREW POINT SEGOL +05BB;afii57796;HEBREW POINT QUBUTS +05B8;afii57797;HEBREW POINT QAMATS +05B7;afii57798;HEBREW POINT PATAH +05B0;afii57799;HEBREW POINT SHEVA +05B2;afii57800;HEBREW POINT HATAF PATAH +05B1;afii57801;HEBREW POINT HATAF SEGOL +05B3;afii57802;HEBREW POINT HATAF QAMATS +05C2;afii57803;HEBREW POINT SIN DOT +05C1;afii57804;HEBREW POINT SHIN DOT +05B9;afii57806;HEBREW POINT HOLAM +05BC;afii57807;HEBREW POINT DAGESH OR MAPIQ +05BD;afii57839;HEBREW POINT METEG +05BF;afii57841;HEBREW POINT RAFE +05C0;afii57842;HEBREW PUNCTUATION PASEQ +02BC;afii57929;MODIFIER LETTER APOSTROPHE +2105;afii61248;CARE OF +2113;afii61289;SCRIPT SMALL L +2116;afii61352;NUMERO SIGN +202C;afii61573;POP DIRECTIONAL FORMATTING +202D;afii61574;LEFT-TO-RIGHT OVERRIDE +202E;afii61575;RIGHT-TO-LEFT OVERRIDE +200C;afii61664;ZERO WIDTH NON-JOINER +066D;afii63167;ARABIC FIVE POINTED STAR +02BD;afii64937;MODIFIER LETTER REVERSED COMMA +00E0;agrave;LATIN SMALL LETTER A WITH GRAVE +2135;aleph;ALEF SYMBOL +03B1;alpha;GREEK SMALL LETTER ALPHA +03AC;alphatonos;GREEK SMALL LETTER ALPHA WITH TONOS +0101;amacron;LATIN SMALL LETTER A WITH MACRON +0026;ampersand;AMPERSAND +F726;ampersandsmall;SMALL CAPITAL AMPERSAND +2220;angle;ANGLE +2329;angleleft;LEFT-POINTING ANGLE BRACKET +232A;angleright;RIGHT-POINTING ANGLE BRACKET +0387;anoteleia;GREEK ANO TELEIA +0105;aogonek;LATIN SMALL LETTER A WITH OGONEK +2248;approxequal;ALMOST EQUAL TO +00E5;aring;LATIN SMALL LETTER A WITH RING ABOVE +01FB;aringacute;LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE +2194;arrowboth;LEFT RIGHT ARROW +21D4;arrowdblboth;LEFT RIGHT DOUBLE ARROW +21D3;arrowdbldown;DOWNWARDS DOUBLE ARROW +21D0;arrowdblleft;LEFTWARDS DOUBLE ARROW +21D2;arrowdblright;RIGHTWARDS DOUBLE ARROW +21D1;arrowdblup;UPWARDS DOUBLE ARROW +2193;arrowdown;DOWNWARDS ARROW +F8E7;arrowhorizex;HORIZONTAL ARROW EXTENDER +2190;arrowleft;LEFTWARDS ARROW +2192;arrowright;RIGHTWARDS ARROW +2191;arrowup;UPWARDS ARROW +2195;arrowupdn;UP DOWN ARROW +21A8;arrowupdnbse;UP DOWN ARROW WITH BASE +F8E6;arrowvertex;VERTICAL ARROW EXTENDER +005E;asciicircum;CIRCUMFLEX ACCENT +007E;asciitilde;TILDE +002A;asterisk;ASTERISK +2217;asteriskmath;ASTERISK OPERATOR +F6E9;asuperior;SUPERSCRIPT LATIN SMALL LETTER A +0040;at;COMMERCIAL AT +00E3;atilde;LATIN SMALL LETTER A WITH TILDE +0062;b;LATIN SMALL LETTER B +005C;backslash;REVERSE SOLIDUS +007C;bar;VERTICAL LINE +03B2;beta;GREEK SMALL LETTER BETA +2588;block;FULL BLOCK +F8F4;braceex;CURLY BRACKET EXTENDER +007B;braceleft;LEFT CURLY BRACKET +F8F3;braceleftbt;LEFT CURLY BRACKET BOTTOM +F8F2;braceleftmid;LEFT CURLY BRACKET MID +F8F1;bracelefttp;LEFT CURLY BRACKET TOP +007D;braceright;RIGHT CURLY BRACKET +F8FE;bracerightbt;RIGHT CURLY BRACKET BOTTOM +F8FD;bracerightmid;RIGHT CURLY BRACKET MID +F8FC;bracerighttp;RIGHT CURLY BRACKET TOP +005B;bracketleft;LEFT SQUARE BRACKET +F8F0;bracketleftbt;LEFT SQUARE BRACKET BOTTOM +F8EF;bracketleftex;LEFT SQUARE BRACKET EXTENDER +F8EE;bracketlefttp;LEFT SQUARE BRACKET TOP +005D;bracketright;RIGHT SQUARE BRACKET +F8FB;bracketrightbt;RIGHT SQUARE BRACKET BOTTOM +F8FA;bracketrightex;RIGHT SQUARE BRACKET EXTENDER +F8F9;bracketrighttp;RIGHT SQUARE BRACKET TOP +02D8;breve;BREVE +00A6;brokenbar;BROKEN BAR +F6EA;bsuperior;SUPERSCRIPT LATIN SMALL LETTER B +2022;bullet;BULLET +0063;c;LATIN SMALL LETTER C +0107;cacute;LATIN SMALL LETTER C WITH ACUTE +02C7;caron;CARON +21B5;carriagereturn;DOWNWARDS ARROW WITH CORNER LEFTWARDS +010D;ccaron;LATIN SMALL LETTER C WITH CARON +00E7;ccedilla;LATIN SMALL LETTER C WITH CEDILLA +0109;ccircumflex;LATIN SMALL LETTER C WITH CIRCUMFLEX +010B;cdotaccent;LATIN SMALL LETTER C WITH DOT ABOVE +00B8;cedilla;CEDILLA +00A2;cent;CENT SIGN +F6DF;centinferior;SUBSCRIPT CENT SIGN +F7A2;centoldstyle;OLDSTYLE CENT SIGN +F6E0;centsuperior;SUPERSCRIPT CENT SIGN +03C7;chi;GREEK SMALL LETTER CHI +25CB;circle;WHITE CIRCLE +2297;circlemultiply;CIRCLED TIMES +2295;circleplus;CIRCLED PLUS +02C6;circumflex;MODIFIER LETTER CIRCUMFLEX ACCENT +2663;club;BLACK CLUB SUIT +003A;colon;COLON +20A1;colonmonetary;COLON SIGN +002C;comma;COMMA +F6C3;commaaccent;COMMA BELOW +F6E1;commainferior;SUBSCRIPT COMMA +F6E2;commasuperior;SUPERSCRIPT COMMA +2245;congruent;APPROXIMATELY EQUAL TO +00A9;copyright;COPYRIGHT SIGN +F8E9;copyrightsans;COPYRIGHT SIGN SANS SERIF +F6D9;copyrightserif;COPYRIGHT SIGN SERIF +00A4;currency;CURRENCY SIGN +F6D1;cyrBreve;CAPITAL CYRILLIC BREVE +F6D2;cyrFlex;CAPITAL CYRILLIC CIRCUMFLEX +F6D4;cyrbreve;CYRILLIC BREVE +F6D5;cyrflex;CYRILLIC CIRCUMFLEX +0064;d;LATIN SMALL LETTER D +2020;dagger;DAGGER +2021;daggerdbl;DOUBLE DAGGER +F6D3;dblGrave;CAPITAL DOUBLE GRAVE ACCENT +F6D6;dblgrave;DOUBLE GRAVE ACCENT +010F;dcaron;LATIN SMALL LETTER D WITH CARON +0111;dcroat;LATIN SMALL LETTER D WITH STROKE +00B0;degree;DEGREE SIGN +03B4;delta;GREEK SMALL LETTER DELTA +2666;diamond;BLACK DIAMOND SUIT +00A8;dieresis;DIAERESIS +F6D7;dieresisacute;DIAERESIS ACUTE ACCENT +F6D8;dieresisgrave;DIAERESIS GRAVE ACCENT +0385;dieresistonos;GREEK DIALYTIKA TONOS +00F7;divide;DIVISION SIGN +2593;dkshade;DARK SHADE +2584;dnblock;LOWER HALF BLOCK +0024;dollar;DOLLAR SIGN +F6E3;dollarinferior;SUBSCRIPT DOLLAR SIGN +F724;dollaroldstyle;OLDSTYLE DOLLAR SIGN +F6E4;dollarsuperior;SUPERSCRIPT DOLLAR SIGN +20AB;dong;DONG SIGN +02D9;dotaccent;DOT ABOVE +0323;dotbelowcomb;COMBINING DOT BELOW +0131;dotlessi;LATIN SMALL LETTER DOTLESS I +F6BE;dotlessj;LATIN SMALL LETTER DOTLESS J +22C5;dotmath;DOT OPERATOR +F6EB;dsuperior;SUPERSCRIPT LATIN SMALL LETTER D +0065;e;LATIN SMALL LETTER E +00E9;eacute;LATIN SMALL LETTER E WITH ACUTE +0115;ebreve;LATIN SMALL LETTER E WITH BREVE +011B;ecaron;LATIN SMALL LETTER E WITH CARON +00EA;ecircumflex;LATIN SMALL LETTER E WITH CIRCUMFLEX +00EB;edieresis;LATIN SMALL LETTER E WITH DIAERESIS +0117;edotaccent;LATIN SMALL LETTER E WITH DOT ABOVE +00E8;egrave;LATIN SMALL LETTER E WITH GRAVE +0038;eight;DIGIT EIGHT +2088;eightinferior;SUBSCRIPT EIGHT +F738;eightoldstyle;OLDSTYLE DIGIT EIGHT +2078;eightsuperior;SUPERSCRIPT EIGHT +2208;element;ELEMENT OF +2026;ellipsis;HORIZONTAL ELLIPSIS +0113;emacron;LATIN SMALL LETTER E WITH MACRON +2014;emdash;EM DASH +2205;emptyset;EMPTY SET +2013;endash;EN DASH +014B;eng;LATIN SMALL LETTER ENG +0119;eogonek;LATIN SMALL LETTER E WITH OGONEK +03B5;epsilon;GREEK SMALL LETTER EPSILON +03AD;epsilontonos;GREEK SMALL LETTER EPSILON WITH TONOS +003D;equal;EQUALS SIGN +2261;equivalence;IDENTICAL TO +212E;estimated;ESTIMATED SYMBOL +F6EC;esuperior;SUPERSCRIPT LATIN SMALL LETTER E +03B7;eta;GREEK SMALL LETTER ETA +03AE;etatonos;GREEK SMALL LETTER ETA WITH TONOS +00F0;eth;LATIN SMALL LETTER ETH +0021;exclam;EXCLAMATION MARK +203C;exclamdbl;DOUBLE EXCLAMATION MARK +00A1;exclamdown;INVERTED EXCLAMATION MARK +F7A1;exclamdownsmall;SMALL CAPITAL INVERTED EXCLAMATION MARK +F721;exclamsmall;SMALL CAPITAL EXCLAMATION MARK +2203;existential;THERE EXISTS +0066;f;LATIN SMALL LETTER F +2640;female;FEMALE SIGN +FB00;ff;LATIN SMALL LIGATURE FF +FB03;ffi;LATIN SMALL LIGATURE FFI +FB04;ffl;LATIN SMALL LIGATURE FFL +FB01;fi;LATIN SMALL LIGATURE FI +2012;figuredash;FIGURE DASH +25A0;filledbox;BLACK SQUARE +25AC;filledrect;BLACK RECTANGLE +0035;five;DIGIT FIVE +215D;fiveeighths;VULGAR FRACTION FIVE EIGHTHS +2085;fiveinferior;SUBSCRIPT FIVE +F735;fiveoldstyle;OLDSTYLE DIGIT FIVE +2075;fivesuperior;SUPERSCRIPT FIVE +FB02;fl;LATIN SMALL LIGATURE FL +0192;florin;LATIN SMALL LETTER F WITH HOOK +0034;four;DIGIT FOUR +2084;fourinferior;SUBSCRIPT FOUR +F734;fouroldstyle;OLDSTYLE DIGIT FOUR +2074;foursuperior;SUPERSCRIPT FOUR +2044;fraction;FRACTION SLASH +2215;fraction;DIVISION SLASH;Duplicate +20A3;franc;FRENCH FRANC SIGN +0067;g;LATIN SMALL LETTER G +03B3;gamma;GREEK SMALL LETTER GAMMA +011F;gbreve;LATIN SMALL LETTER G WITH BREVE +01E7;gcaron;LATIN SMALL LETTER G WITH CARON +011D;gcircumflex;LATIN SMALL LETTER G WITH CIRCUMFLEX +0123;gcommaaccent;LATIN SMALL LETTER G WITH CEDILLA +0121;gdotaccent;LATIN SMALL LETTER G WITH DOT ABOVE +00DF;germandbls;LATIN SMALL LETTER SHARP S +2207;gradient;NABLA +0060;grave;GRAVE ACCENT +0300;gravecomb;COMBINING GRAVE ACCENT +003E;greater;GREATER-THAN SIGN +2265;greaterequal;GREATER-THAN OR EQUAL TO +00AB;guillemotleft;LEFT-POINTING DOUBLE ANGLE QUOTATION MARK +00BB;guillemotright;RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK +2039;guilsinglleft;SINGLE LEFT-POINTING ANGLE QUOTATION MARK +203A;guilsinglright;SINGLE RIGHT-POINTING ANGLE QUOTATION MARK +0068;h;LATIN SMALL LETTER H +0127;hbar;LATIN SMALL LETTER H WITH STROKE +0125;hcircumflex;LATIN SMALL LETTER H WITH CIRCUMFLEX +2665;heart;BLACK HEART SUIT +0309;hookabovecomb;COMBINING HOOK ABOVE +2302;house;HOUSE +02DD;hungarumlaut;DOUBLE ACUTE ACCENT +002D;hyphen;HYPHEN-MINUS +00AD;hyphen;SOFT HYPHEN;Duplicate +F6E5;hypheninferior;SUBSCRIPT HYPHEN-MINUS +F6E6;hyphensuperior;SUPERSCRIPT HYPHEN-MINUS +0069;i;LATIN SMALL LETTER I +00ED;iacute;LATIN SMALL LETTER I WITH ACUTE +012D;ibreve;LATIN SMALL LETTER I WITH BREVE +00EE;icircumflex;LATIN SMALL LETTER I WITH CIRCUMFLEX +00EF;idieresis;LATIN SMALL LETTER I WITH DIAERESIS +00EC;igrave;LATIN SMALL LETTER I WITH GRAVE +0133;ij;LATIN SMALL LIGATURE IJ +012B;imacron;LATIN SMALL LETTER I WITH MACRON +221E;infinity;INFINITY +222B;integral;INTEGRAL +2321;integralbt;BOTTOM HALF INTEGRAL +F8F5;integralex;INTEGRAL EXTENDER +2320;integraltp;TOP HALF INTEGRAL +2229;intersection;INTERSECTION +25D8;invbullet;INVERSE BULLET +25D9;invcircle;INVERSE WHITE CIRCLE +263B;invsmileface;BLACK SMILING FACE +012F;iogonek;LATIN SMALL LETTER I WITH OGONEK +03B9;iota;GREEK SMALL LETTER IOTA +03CA;iotadieresis;GREEK SMALL LETTER IOTA WITH DIALYTIKA +0390;iotadieresistonos;GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS +03AF;iotatonos;GREEK SMALL LETTER IOTA WITH TONOS +F6ED;isuperior;SUPERSCRIPT LATIN SMALL LETTER I +0129;itilde;LATIN SMALL LETTER I WITH TILDE +006A;j;LATIN SMALL LETTER J +0135;jcircumflex;LATIN SMALL LETTER J WITH CIRCUMFLEX +006B;k;LATIN SMALL LETTER K +03BA;kappa;GREEK SMALL LETTER KAPPA +0137;kcommaaccent;LATIN SMALL LETTER K WITH CEDILLA +0138;kgreenlandic;LATIN SMALL LETTER KRA +006C;l;LATIN SMALL LETTER L +013A;lacute;LATIN SMALL LETTER L WITH ACUTE +03BB;lambda;GREEK SMALL LETTER LAMDA +013E;lcaron;LATIN SMALL LETTER L WITH CARON +013C;lcommaaccent;LATIN SMALL LETTER L WITH CEDILLA +0140;ldot;LATIN SMALL LETTER L WITH MIDDLE DOT +003C;less;LESS-THAN SIGN +2264;lessequal;LESS-THAN OR EQUAL TO +258C;lfblock;LEFT HALF BLOCK +20A4;lira;LIRA SIGN +F6C0;ll;LATIN SMALL LETTER LL +2227;logicaland;LOGICAL AND +00AC;logicalnot;NOT SIGN +2228;logicalor;LOGICAL OR +017F;longs;LATIN SMALL LETTER LONG S +25CA;lozenge;LOZENGE +0142;lslash;LATIN SMALL LETTER L WITH STROKE +F6EE;lsuperior;SUPERSCRIPT LATIN SMALL LETTER L +2591;ltshade;LIGHT SHADE +006D;m;LATIN SMALL LETTER M +00AF;macron;MACRON +02C9;macron;MODIFIER LETTER MACRON;Duplicate +2642;male;MALE SIGN +2212;minus;MINUS SIGN +2032;minute;PRIME +F6EF;msuperior;SUPERSCRIPT LATIN SMALL LETTER M +00B5;mu;MICRO SIGN +03BC;mu;GREEK SMALL LETTER MU;Duplicate +00D7;multiply;MULTIPLICATION SIGN +266A;musicalnote;EIGHTH NOTE +266B;musicalnotedbl;BEAMED EIGHTH NOTES +006E;n;LATIN SMALL LETTER N +0144;nacute;LATIN SMALL LETTER N WITH ACUTE +0149;napostrophe;LATIN SMALL LETTER N PRECEDED BY APOSTROPHE +0148;ncaron;LATIN SMALL LETTER N WITH CARON +0146;ncommaaccent;LATIN SMALL LETTER N WITH CEDILLA +0039;nine;DIGIT NINE +2089;nineinferior;SUBSCRIPT NINE +F739;nineoldstyle;OLDSTYLE DIGIT NINE +2079;ninesuperior;SUPERSCRIPT NINE +2209;notelement;NOT AN ELEMENT OF +2260;notequal;NOT EQUAL TO +2284;notsubset;NOT A SUBSET OF +207F;nsuperior;SUPERSCRIPT LATIN SMALL LETTER N +00F1;ntilde;LATIN SMALL LETTER N WITH TILDE +03BD;nu;GREEK SMALL LETTER NU +0023;numbersign;NUMBER SIGN +006F;o;LATIN SMALL LETTER O +00F3;oacute;LATIN SMALL LETTER O WITH ACUTE +014F;obreve;LATIN SMALL LETTER O WITH BREVE +00F4;ocircumflex;LATIN SMALL LETTER O WITH CIRCUMFLEX +00F6;odieresis;LATIN SMALL LETTER O WITH DIAERESIS +0153;oe;LATIN SMALL LIGATURE OE +02DB;ogonek;OGONEK +00F2;ograve;LATIN SMALL LETTER O WITH GRAVE +01A1;ohorn;LATIN SMALL LETTER O WITH HORN +0151;ohungarumlaut;LATIN SMALL LETTER O WITH DOUBLE ACUTE +014D;omacron;LATIN SMALL LETTER O WITH MACRON +03C9;omega;GREEK SMALL LETTER OMEGA +03D6;omega1;GREEK PI SYMBOL +03CE;omegatonos;GREEK SMALL LETTER OMEGA WITH TONOS +03BF;omicron;GREEK SMALL LETTER OMICRON +03CC;omicrontonos;GREEK SMALL LETTER OMICRON WITH TONOS +0031;one;DIGIT ONE +2024;onedotenleader;ONE DOT LEADER +215B;oneeighth;VULGAR FRACTION ONE EIGHTH +F6DC;onefitted;PROPORTIONAL DIGIT ONE +00BD;onehalf;VULGAR FRACTION ONE HALF +2081;oneinferior;SUBSCRIPT ONE +F731;oneoldstyle;OLDSTYLE DIGIT ONE +00BC;onequarter;VULGAR FRACTION ONE QUARTER +00B9;onesuperior;SUPERSCRIPT ONE +2153;onethird;VULGAR FRACTION ONE THIRD +25E6;openbullet;WHITE BULLET +00AA;ordfeminine;FEMININE ORDINAL INDICATOR +00BA;ordmasculine;MASCULINE ORDINAL INDICATOR +221F;orthogonal;RIGHT ANGLE +00F8;oslash;LATIN SMALL LETTER O WITH STROKE +01FF;oslashacute;LATIN SMALL LETTER O WITH STROKE AND ACUTE +F6F0;osuperior;SUPERSCRIPT LATIN SMALL LETTER O +00F5;otilde;LATIN SMALL LETTER O WITH TILDE +0070;p;LATIN SMALL LETTER P +00B6;paragraph;PILCROW SIGN +0028;parenleft;LEFT PARENTHESIS +F8ED;parenleftbt;LEFT PAREN BOTTOM +F8EC;parenleftex;LEFT PAREN EXTENDER +208D;parenleftinferior;SUBSCRIPT LEFT PARENTHESIS +207D;parenleftsuperior;SUPERSCRIPT LEFT PARENTHESIS +F8EB;parenlefttp;LEFT PAREN TOP +0029;parenright;RIGHT PARENTHESIS +F8F8;parenrightbt;RIGHT PAREN BOTTOM +F8F7;parenrightex;RIGHT PAREN EXTENDER +208E;parenrightinferior;SUBSCRIPT RIGHT PARENTHESIS +207E;parenrightsuperior;SUPERSCRIPT RIGHT PARENTHESIS +F8F6;parenrighttp;RIGHT PAREN TOP +2202;partialdiff;PARTIAL DIFFERENTIAL +0025;percent;PERCENT SIGN +002E;period;FULL STOP +00B7;periodcentered;MIDDLE DOT +2219;periodcentered;BULLET OPERATOR;Duplicate +F6E7;periodinferior;SUBSCRIPT FULL STOP +F6E8;periodsuperior;SUPERSCRIPT FULL STOP +22A5;perpendicular;UP TACK +2030;perthousand;PER MILLE SIGN +20A7;peseta;PESETA SIGN +03C6;phi;GREEK SMALL LETTER PHI +03D5;phi1;GREEK PHI SYMBOL +03C0;pi;GREEK SMALL LETTER PI +002B;plus;PLUS SIGN +00B1;plusminus;PLUS-MINUS SIGN +211E;prescription;PRESCRIPTION TAKE +220F;product;N-ARY PRODUCT +2282;propersubset;SUBSET OF +2283;propersuperset;SUPERSET OF +221D;proportional;PROPORTIONAL TO +03C8;psi;GREEK SMALL LETTER PSI +0071;q;LATIN SMALL LETTER Q +003F;question;QUESTION MARK +00BF;questiondown;INVERTED QUESTION MARK +F7BF;questiondownsmall;SMALL CAPITAL INVERTED QUESTION MARK +F73F;questionsmall;SMALL CAPITAL QUESTION MARK +0022;quotedbl;QUOTATION MARK +201E;quotedblbase;DOUBLE LOW-9 QUOTATION MARK +201C;quotedblleft;LEFT DOUBLE QUOTATION MARK +201D;quotedblright;RIGHT DOUBLE QUOTATION MARK +2018;quoteleft;LEFT SINGLE QUOTATION MARK +201B;quotereversed;SINGLE HIGH-REVERSED-9 QUOTATION MARK +2019;quoteright;RIGHT SINGLE QUOTATION MARK +201A;quotesinglbase;SINGLE LOW-9 QUOTATION MARK +0027;quotesingle;APOSTROPHE +0072;r;LATIN SMALL LETTER R +0155;racute;LATIN SMALL LETTER R WITH ACUTE +221A;radical;SQUARE ROOT +F8E5;radicalex;RADICAL EXTENDER +0159;rcaron;LATIN SMALL LETTER R WITH CARON +0157;rcommaaccent;LATIN SMALL LETTER R WITH CEDILLA +2286;reflexsubset;SUBSET OF OR EQUAL TO +2287;reflexsuperset;SUPERSET OF OR EQUAL TO +00AE;registered;REGISTERED SIGN +F8E8;registersans;REGISTERED SIGN SANS SERIF +F6DA;registerserif;REGISTERED SIGN SERIF +2310;revlogicalnot;REVERSED NOT SIGN +03C1;rho;GREEK SMALL LETTER RHO +02DA;ring;RING ABOVE +F6F1;rsuperior;SUPERSCRIPT LATIN SMALL LETTER R +2590;rtblock;RIGHT HALF BLOCK +F6DD;rupiah;RUPIAH SIGN +0073;s;LATIN SMALL LETTER S +015B;sacute;LATIN SMALL LETTER S WITH ACUTE +0161;scaron;LATIN SMALL LETTER S WITH CARON +015F;scedilla;LATIN SMALL LETTER S WITH CEDILLA +F6C2;scedilla;LATIN SMALL LETTER S WITH CEDILLA;Duplicate +015D;scircumflex;LATIN SMALL LETTER S WITH CIRCUMFLEX +0219;scommaaccent;LATIN SMALL LETTER S WITH COMMA BELOW +2033;second;DOUBLE PRIME +00A7;section;SECTION SIGN +003B;semicolon;SEMICOLON +0037;seven;DIGIT SEVEN +215E;seveneighths;VULGAR FRACTION SEVEN EIGHTHS +2087;seveninferior;SUBSCRIPT SEVEN +F737;sevenoldstyle;OLDSTYLE DIGIT SEVEN +2077;sevensuperior;SUPERSCRIPT SEVEN +2592;shade;MEDIUM SHADE +03C3;sigma;GREEK SMALL LETTER SIGMA +03C2;sigma1;GREEK SMALL LETTER FINAL SIGMA +223C;similar;TILDE OPERATOR +0036;six;DIGIT SIX +2086;sixinferior;SUBSCRIPT SIX +F736;sixoldstyle;OLDSTYLE DIGIT SIX +2076;sixsuperior;SUPERSCRIPT SIX +002F;slash;SOLIDUS +263A;smileface;WHITE SMILING FACE +0020;space;SPACE +00A0;space;NO-BREAK SPACE;Duplicate +2660;spade;BLACK SPADE SUIT +F6F2;ssuperior;SUPERSCRIPT LATIN SMALL LETTER S +00A3;sterling;POUND SIGN +220B;suchthat;CONTAINS AS MEMBER +2211;summation;N-ARY SUMMATION +263C;sun;WHITE SUN WITH RAYS +0074;t;LATIN SMALL LETTER T +03C4;tau;GREEK SMALL LETTER TAU +0167;tbar;LATIN SMALL LETTER T WITH STROKE +0165;tcaron;LATIN SMALL LETTER T WITH CARON +0163;tcommaaccent;LATIN SMALL LETTER T WITH CEDILLA +021B;tcommaaccent;LATIN SMALL LETTER T WITH COMMA BELOW;Duplicate +2234;therefore;THEREFORE +03B8;theta;GREEK SMALL LETTER THETA +03D1;theta1;GREEK THETA SYMBOL +00FE;thorn;LATIN SMALL LETTER THORN +0033;three;DIGIT THREE +215C;threeeighths;VULGAR FRACTION THREE EIGHTHS +2083;threeinferior;SUBSCRIPT THREE +F733;threeoldstyle;OLDSTYLE DIGIT THREE +00BE;threequarters;VULGAR FRACTION THREE QUARTERS +F6DE;threequartersemdash;THREE QUARTERS EM DASH +00B3;threesuperior;SUPERSCRIPT THREE +02DC;tilde;SMALL TILDE +0303;tildecomb;COMBINING TILDE +0384;tonos;GREEK TONOS +2122;trademark;TRADE MARK SIGN +F8EA;trademarksans;TRADE MARK SIGN SANS SERIF +F6DB;trademarkserif;TRADE MARK SIGN SERIF +25BC;triagdn;BLACK DOWN-POINTING TRIANGLE +25C4;triaglf;BLACK LEFT-POINTING POINTER +25BA;triagrt;BLACK RIGHT-POINTING POINTER +25B2;triagup;BLACK UP-POINTING TRIANGLE +F6F3;tsuperior;SUPERSCRIPT LATIN SMALL LETTER T +0032;two;DIGIT TWO +2025;twodotenleader;TWO DOT LEADER +2082;twoinferior;SUBSCRIPT TWO +F732;twooldstyle;OLDSTYLE DIGIT TWO +00B2;twosuperior;SUPERSCRIPT TWO +2154;twothirds;VULGAR FRACTION TWO THIRDS +0075;u;LATIN SMALL LETTER U +00FA;uacute;LATIN SMALL LETTER U WITH ACUTE +016D;ubreve;LATIN SMALL LETTER U WITH BREVE +00FB;ucircumflex;LATIN SMALL LETTER U WITH CIRCUMFLEX +00FC;udieresis;LATIN SMALL LETTER U WITH DIAERESIS +00F9;ugrave;LATIN SMALL LETTER U WITH GRAVE +01B0;uhorn;LATIN SMALL LETTER U WITH HORN +0171;uhungarumlaut;LATIN SMALL LETTER U WITH DOUBLE ACUTE +016B;umacron;LATIN SMALL LETTER U WITH MACRON +005F;underscore;LOW LINE +2017;underscoredbl;DOUBLE LOW LINE +222A;union;UNION +2200;universal;FOR ALL +0173;uogonek;LATIN SMALL LETTER U WITH OGONEK +2580;upblock;UPPER HALF BLOCK +03C5;upsilon;GREEK SMALL LETTER UPSILON +03CB;upsilondieresis;GREEK SMALL LETTER UPSILON WITH DIALYTIKA +03B0;upsilondieresistonos;GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS +03CD;upsilontonos;GREEK SMALL LETTER UPSILON WITH TONOS +016F;uring;LATIN SMALL LETTER U WITH RING ABOVE +0169;utilde;LATIN SMALL LETTER U WITH TILDE +0076;v;LATIN SMALL LETTER V +0077;w;LATIN SMALL LETTER W +1E83;wacute;LATIN SMALL LETTER W WITH ACUTE +0175;wcircumflex;LATIN SMALL LETTER W WITH CIRCUMFLEX +1E85;wdieresis;LATIN SMALL LETTER W WITH DIAERESIS +2118;weierstrass;SCRIPT CAPITAL P +1E81;wgrave;LATIN SMALL LETTER W WITH GRAVE +0078;x;LATIN SMALL LETTER X +03BE;xi;GREEK SMALL LETTER XI +0079;y;LATIN SMALL LETTER Y +00FD;yacute;LATIN SMALL LETTER Y WITH ACUTE +0177;ycircumflex;LATIN SMALL LETTER Y WITH CIRCUMFLEX +00FF;ydieresis;LATIN SMALL LETTER Y WITH DIAERESIS +00A5;yen;YEN SIGN +1EF3;ygrave;LATIN SMALL LETTER Y WITH GRAVE +007A;z;LATIN SMALL LETTER Z +017A;zacute;LATIN SMALL LETTER Z WITH ACUTE +017E;zcaron;LATIN SMALL LETTER Z WITH CARON +017C;zdotaccent;LATIN SMALL LETTER Z WITH DOT ABOVE +0030;zero;DIGIT ZERO +2080;zeroinferior;SUBSCRIPT ZERO +F730;zerooldstyle;OLDSTYLE DIGIT ZERO +2070;zerosuperior;SUPERSCRIPT ZERO +03B6;zeta;GREEK SMALL LETTER ZETA +""" + + +t1_bias = 0 +glyph_list = [] + + +def the_adobe_glyph_list(): + """return the list of glyph names in the adobe list""" + + lines = string.split( adobe_glyph_list, '\n' ) + glyphs = [] + + for line in lines: + if line: + fields = string.split( line, ';' ) +# print fields[0] + ' - ' + fields[1] + glyphs.append( fields[1] ) + + return glyphs + + +def the_adobe_glyphs(): + """return the list of unicode values""" + + lines = string.split( adobe_glyph_list, '\n' ) + glyphs = [] + values = [] + + for line in lines: + if line: + fields = string.split( line, ';' ) +# print fields[0] + ' - ' + fields[1] + glyphs.append( fields[1] ) + values.append( fields[0] ) + + return glyphs, values + + +def count_extra_glyphs( alist, filter ): + """count the number of extra glyphs""" + + count = 0 + extras = [] + + for name in alist: + try: + filtered_index = filter.index( name ) + except: + extras.append( name ) + + return extras + + +def dump_mac_indices( file, t1_bias ): + write = file.write + + write( " static const unsigned short mac_standard_names[" + \ + repr( len( mac_standard_names ) + 1 ) + "] =\n" ) + write( " {\n" ) + + count = 0 + for name in mac_standard_names: + try: + t1_index = t1_standard_strings.index( name ) + write( " " + repr( t1_bias + t1_index ) + ",\n" ) + except: + write( " " + repr( count ) + ",\n" ) + count = count + 1 + + write( " 0\n" ) + write( " };\n" ) + write( "\n" ) + write( "\n" ) + + +def dump_glyph_list( file, glyph_list, adobe_extra ): + write = file.write + + name_list = [] + + write( " static const char* standard_glyph_names[] =\n" ) + write( " {\n" ) + + for name in glyph_list: + write( ' "' + name + '",\n' ) + name_list.append( name ) + + write( "\n" ) + write( "#ifdef FT_CONFIG_OPTION_ADOBE_GLYPH_LIST\n" ) + write( "\n" ) + + for name in adobe_extra: + write( ' "' + name + '",\n' ) + name_list.append( name ) + + write( "\n" ) + write( "#endif /* FT_CONFIG_OPTION_ADOBE_GLYPH_LIST */\n" ) + write( "\n" ) + write( " 0\n" ) + write( " };\n" ) + write( "\n" ) + write( "\n" ) + + return name_list + + +def dump_unicode_values( file, base_list, adobe_list ): + """build the glyph names to unicode values table""" + + write = file.write + + adobe_glyphs, uni_values = the_adobe_glyphs() + + write( "\n" ) + write( " static const unsigned short names_to_unicode[" + \ + repr( len( base_list ) + len( adobe_list ) + 1 ) + "] =\n" ) + write( " {\n" ) + + for name in base_list: + try: + index = adobe_glyphs.index( name ) + write( " 0x" + uni_values[index] + ",\n" ) + except: + write( " 0,\n" ) + + write( "\n" ) + write( "#ifdef FT_CONFIG_OPTION_ADOBE_GLYPH_LIST\n" ) + write( "\n" ) + + for name in adobe_list: + try: + index = adobe_glyphs.index( name ) + write( " 0x" + uni_values[index] + ",\n" ) + except: + write( " 0,\n" ) + + write( "\n" ) + write( "#endif /* FT_CONFIG_OPTION_ADOBE_GLYPH_LIST */\n" ) + write( " 0\n" ) + write( " };\n" ) + write( "\n" ) + write( "\n" ) + write( "\n" ) + + +def dump_encoding( file, encoding_name, encoding_list ): + """dumps a given encoding""" + + write = file.write + + write( " static const unsigned short " + encoding_name + "[" + \ + repr( len( encoding_list ) + 1 ) + "] =\n" ) + write( " {\n" ) + + for value in encoding_list: + write( " " + repr( value ) + ",\n" ) + write( " 0\n" ) + write( " };\n" ) + write( "\n" ) + write( "\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( t1_standard_strings ) + + # build mac index table & supplemental glyph names + mac_list = count_extra_glyphs( mac_standard_names, t1_standard_strings ) + count_mac = len( mac_list ) + t1_bias = count_mac + base_list = mac_list + t1_standard_strings + + # build adobe unicode index table & supplemental glyph names + adobe_list = the_adobe_glyph_list() + adobe_list = count_extra_glyphs( adobe_list, base_list ) + count_adobe = len( adobe_list ) + + write( "/***************************************************************************/\n" ) + write( "/* */\n" ) + + write( "/* %-71s*/\n" % sys.argv[1] ) + + write( "/* */\n" ) + write( "/* PostScript glyph names (specification only). */\n" ) + write( "/* */\n" ) + write( "/* Copyright 2000 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 glyph list + name_list = dump_glyph_list( file, base_list, adobe_list ) + + # dump t1_standard_list + write( " static const char** t1_standard_glyphs = " \ + + "standard_glyph_names + " + repr( t1_bias ) + ";\n" ) + write( "\n" ) + write( "\n" ) + + write( "#define NUM_STD_GLYPHS " + repr( len( t1_standard_strings ) ) + "\n" ) + write( "\n" ) + write( "#ifdef FT_CONFIG_OPTION_ADOBE_GLYPH_LIST\n" ) + write( "#define NUM_ADOBE_GLYPHS " + \ + repr( len( base_list ) + len( adobe_list ) - t1_bias ) + "\n" ) + write( "#else\n" ) + write( "#define NUM_ADOBE_GLYPHS " + \ + repr( len( base_list ) - t1_bias ) + "\n" ) + write( "#endif\n" ) + write( "\n" ) + write( "\n" ) + + # dump mac indices table + dump_mac_indices( file, t1_bias ) + + # discard mac names from base list + base_list = base_list[t1_bias:] + + # dump unicode values table + dump_unicode_values( file, base_list, adobe_list ) + + dump_encoding( file, "t1_standard_encoding", t1_standard_encoding ) + dump_encoding( file, "t1_expert_encoding", t1_expert_encoding ) + + write( "/* END */\n" ) + + +# Now run the main routine +# +main() + + +# END Index: xc/extras/freetype2/docs/cache/cache.txt diff -u /dev/null xc/extras/freetype2/docs/cache/cache.txt:1.1.1.1 --- /dev/null Mon Dec 18 14:22:26 2000 +++ xc/extras/freetype2/docs/cache/cache.txt Fri Dec 8 16:26:12 2000 @@ -0,0 +1,267 @@ + The FreeType 2 cache sub-system explained + (c) 2000 David Turner + + ----------------------------------------------- + +Introduction : +-------------- + + this document describes the caching sub-system that comes + with the FreeType library, version 2.0. Note that unlike + the rest of the library, this code is still in beta stage + and might still suffer slight changes in the future. + + Its basic design shouldn't evolve though and is explained + in this paper. + + +I. Requirements and Design Goals: +--------------------------------- + + The FT2 cache sub-system was designed to implement caching + of glyph images. However, it is extremely flexible and can + be easily extended to cache other kind of data like metrics, + character maps, coverage tables, etc.. + + +II. Base Concepts: +------------------ + + 1. The cache manager object: + + at the heart of the caching sub-system is a single object + called the "cache manager". It is used to deal with FT_Face + and FT_Size objects, as well as to manager a LRU list of + abstract "cache nodes". + + a. caching FT_Face and FT_Size objects: + + each FT_Face object created by FreeType 2 can take from + a few hundred bytes to several tens of kilobytes, depending + on the original font's file format as well as its content. + + there is no easy way to compute the size of a given FT_Face + object, so it's always a good idea to assume that it is + large and to want to limit the number of live face objects + as much as possible. + + similarly, each FT_Face can have one or more FT_Size childs, + whose byte size depends heavily on the font format. + + the first purpose of the cache manager is to provide a + small cache for FT_Face and FT_Size objects. Basically, + an application can use it as follows: + + - each font face is described to the cache manager + through a typeless pointer, called a FTC_FaceID. + + the cache manager itself doesn't interpret or use + the value of FTC_FaceIDs directly. Rather, it passes + them to a user-provided function called a + "face requester". see the defintion of the + FTC_Face_Requester type in + for details.. + + the face requester is in charge of translating a given + face into into a real new FT_Face object that is + returned to the cache manager. The latter will keep + the face object alive as long as it needs to. + + the face requester is unique and must be passed + to the function named FTC_Manager_New used to + create/initialise a new cache manager. + + + - to lookup a given FT_Face, call the function + FTC_Manager_Lookup_Face as in the following code: + + FTC_Manager_Lookup_Face( manager, + face_id, + &face ); + + if the corresponding FT_Face object is kept in + the cache manager's list, it will be returned + directly. Otherwise, this function will call + the user-provided face requester to create + a new FT_Face object, add it to the manager's + list to finally return it. + + FT_Face objects are always destroyed by the cache + manager. An application that uses the cache + sub-system should never call FT_Done_Face !! + + - to lookup a given FT_Size and FT_Face, call the + function FTC_Manager_Lookup_Size, as in: + + FTC_Manager_Lookup_Size( manager, + ftc_font, + &face, + &size ); + + where "ftc_font" is a pointer to a FTC_Font descriptor + (a structure containing a FTC_FaceIDs and character + dimensions corresponding to the desired FT_Size). + + note that the function returns both a FT_Face and + a FT_Size object. You don't need to call + FTC_Manager_Lookup_Face before it !! + + also note that returned FT_Size objects are always + destroyed by the cache manager. A client application + that uses it should never call FT_Done_Size !! + + + the big advantage of using FTC_FaceIDs is that is + makes the caching sub-system completely independent + of the way font files are installed / listed / managed + in your application. In most implementations, a FTC_FaceID + is really a pointer to an application-specific structure + that describe the source font file + face index. + + + b - manage a MRU list of abstract "cache nodes": + + the second role of the cache manager is to hold and manager + a list of abstract "cache nodes". The list is always sorted + in most-recently-used order. The manager always ensure that + the total size of nodes in memory doesn't over-reach a + certain threshold, by eliminating "old" nodes when + necessary. + + the cache manager doesn't know much about the cache nodes: + + - it knows how to move them in its list + - it knows how to destroy them when they're too old + - it knows how to "size" them (i.e. compute their byte + size in memory) + + + 2. Cache objects: + + the cache manager doesn't create new cache nodes however, this + is the charge of what are called "cache objects". + + Basically, each cache object is in charge of managing cache + nodes of a certain type. Its role is to: + + - provide a simple description of its cache nodes to the + manager (i.e. through a FTC_CacheNode_Class structure) + + - provide a high-level API that can be called by client + applications to lookup cache nodes of the corresponding + type. + + this function usually creates new nodes when they're not + available yet. + + - also, and even though this is completely transparent to + the applications and the cache manager, each cache object + manages "node sets", where each set contains cache nodes + usually correspond to the same font face + font size. + + + For example, the cache sub-system currently comes with two + distinct cache classes: + + - a FTC_Image_Cache, which is used to cache FT_Glyph images + (with one FT_Glyph per cache node). + + + - a FTC_SBit_Cache, which is used to cache small glyph bitmaps + ("sbit" means "embedded bitmaps" in digital typography). + + + the small bitmaps glyph is useful because storing one glyph + image per cache node isn't memory efficient when the data + associated to each node is very small. Indeed, each cache + node has a minimal size of 20 bytes, which is huge when + your data is an 8x8 monochrome bitmap :-) + + Hence, a FTC_SBit_Cache is capable of storing several + contiguous sbits in a single cache node, resulting in much + higher cached glyphs / total cache size. + + an application can lookup a FT_Glyph image with a FTC_Image_Cache + by calling: + + error = FTC_Image_Cache_Lookup( image_cache, + ftc_font, + glyph_index, + &ft_glyph ); + + or a FTC_SBit (small bitmap descriptor) by calling: + + error = FTC_SBit_Cache_Lookup( sbit_cache, + ftc_font, + glyph_index, + &ftc_sbit ); + +III. Extending the cache sub-system: + + It is possible to extend the current cache sub-system by + providing your own cache class and register it in the cache + manager. That might be useful to cache other kind of data + in the sub-system, like glyph metrics (without images), + + To do it, you'll need to read the cache sub-system public + header files rather heavily :-) Fortunately, they're pretty + well commented and should guide you to your goal. + + Note that the cache sub-system already provides two "abstract + cache" classes that can be re-used by your own implementation: + + + 1. The abstract "FTC_GlyphCache" class: + + this code is used to implement an abstract "glyph cache", + i.e. one that simply maps one glyph data per cache node. + + it is sub-classed by FTC_Image_Cache, whose implementation + only consists in simple code to store a FT_Glyph in each + cache node. + + you could sub-class it in your application to store glyph + images in a different format, for example. + + see the files and + "src/cache/ftcglyph.h" for details. + + + 2. The abstract "FTC_ChunkCache" class: + + this code is used to implement an abstract "glyph chunk cache". + it's very similar to a FTC_GlyphCache, except that it is capable + of storing several glyph-specific elements per cache node. + + it is sub-classed by FTC_SBit_Cache, whose implementation + only consists in code to store a FTC_SBitRec record in each + node element. + + you could sub-class it in your application to store small + glyph data, like metrics, glyph names, wathever. + + see the files and + "src/cache/ftcchunk.h" for details.. + + + Note that the two abstract caches are rather complex because + they use "glyph sets". Each glyph set corresponds to a single + font face + font size combination. both caches are also + glyph-specific, though it is perfectly possible to use + broader selection criterion, here are a few examples: + + - caching language coverage maps corresponding to + a given font face + language combination + + - caching charmaps, layout tables, and other global + data.. + + - caching (font_face + font_size) specific "latin1" + ascender + descender + + + as you can see, a lot is possible with this design :-) + + + + Index: xc/extras/freetype2/docs/design/design-1.html diff -u /dev/null xc/extras/freetype2/docs/design/design-1.html:1.1.1.1 --- /dev/null Mon Dec 18 14:22:26 2000 +++ xc/extras/freetype2/docs/design/design-1.html Fri Dec 8 16:26:12 2000 @@ -0,0 +1,160 @@ + + + + + + The design of FreeType 2 + + + + +

+ The design of FreeType 2 +

+ +

+ Copyright 1998-2000 David Turner (david@freetype.org)
+ Copyright 2000 The FreeType Development Team (devel@freetype.org) +

+ +
+ + +
+ +
+ + + + + + +
+   + + Contents + + Next +
+
+ +


+ + + +
+

+ Introduction +

+
+ +

This document provides details on the design and implementation of the + FreeType 2 library. Its goal is to allow developers to better + understand the way how FreeType 2 is organized, in order to let them + extend, customize, and debug it.

+ +

Before anything else, it is important to understand the + purpose of this library, i.e., why it has been written:

+ +
    +
  • +

    It allows client applications to access font files easily, + wherever they could be stored, and as independently of the font format + as possible.

    +
  • +
  • +

    Easy retrieval of global font data most commonly found in + normal font formats (i.e. global metrics, encoding/charmaps, + etc.).

    +
  • +
  • +

    It allows easy retrieval of individual glyph data + (metrics, images, name, anything else).

    +
  • +
  • +

    Access to font format-specific "features" whenever + possible (e.g. SFNT tables, Multiple Masters, OpenType Layout tables, + etc.).

    +
  • +
+ +

Its design has also severely been influenced by the following + requirements:

+ +
    +
  • +

    High portability. The library must be able to run on any + kind of environment. This requirement introduces a few drastic + choices that are part of FreeType 2's low-level system + interface.

    +
  • +
  • +

    Extendability. New features should be added with the + least modifications in the library's code base. This requirement + induces an extremely simple design where nearly all operations are + provided by modules.

    +
  • +
  • +

    Customization. It should be easy to build a version of the + library that only contains the features needed by a specific project. + This really is important when you need to integrate it in a font + server for embedded graphics libraries.

    +
  • +
  • +

    Compactness and efficiency. The primary target + for this library are embedded systems with low cpu and memory + resources.

    +
  • +
+ +

The rest of this document is divided in several sections. First, a few + chapters will present the library's basic design as well as the + objects/data managed internally by FreeType 2.

+ +

A later section is then dedicated to library customization, relating + such topics as system-specific interfaces, how to write your own module + and how to tailor library initialization & compilation to your needs.

+ +


+ +
+ + + + + + +
+   + + Contents + + Next +
+
+ +
+
+ + + Index: xc/extras/freetype2/docs/design/design-2.html diff -u /dev/null xc/extras/freetype2/docs/design/design-2.html:1.1.1.1 --- /dev/null Mon Dec 18 14:22:26 2000 +++ xc/extras/freetype2/docs/design/design-2.html Fri Dec 8 16:26:12 2000 @@ -0,0 +1,187 @@ + + + + + + The design of FreeType 2 + + + + +

+ The design of FreeType 2 +

+ +

+ Copyright 1998-2000 David Turner (david@freetype.org)
+ Copyright 2000 The FreeType Development Team (devel@freetype.org) +

+ +
+ + +
+ +
+ + + + + + +
+ Previous + + Contents + + Next +
+
+ +


+ + + +
+

+ I. Components and APIs +

+
+ +

It's better to describe FreeType 2 as a collection of + components. Each one of them is a more or less abstract part of + the library that is in charge of one specific task. We will now explicit + the connections and relationships between them.

+ +

A first brief description of this system of components could be:

+ +
    +
  • +

    Client applications typically call the FreeType 2 + high-level API, whose functions are implemented in a single + component called the Base Layer.

    +
  • +
  • +

    Depending on the context or the task, the base layer then calls one + or more module components to perform the work. In most + cases, the client application doesn't need to know which module was + called.

    +
  • +
  • +

    The base layer also contains a set of routines that are used for + generic things like memory allocation, list processing, i/o stream + parsing, fixed point computation, etc. these functions can also be + called by a module at any time, and they form what is called the + low-level base API.

    +
  • +
+ +

This is illustrated by the following graphics (note that component + entry points are represented as colored triangles):

+ +
+ Basic FreeType design +
+ +

Now, a few additional things must be added to complete this + picture:

+ +
    +
  • +

    Some parts of the base layer can be replaced for specific builds of + the library, and can thus be considered as components themselves. + This is the case for the ftsystem component, which is in + charge of implementing memory management & input stream access, as + well as ftinit, which is in charge of library initialization + (i.e. implementing the FT_Init_FreeType() function).

    +
  • +
  • +

    FreeType 2 comes also with a set of optional + components, which can be used either as a convenience for client + applications (e.g. the ftglyph component, used to provide a + simple API to manage glyph images independently of their internal + representation), or to access format-specific features (e.g. the + ftmm component used to access and manage Multiple Masters + data in Type 1 fonts).

    +
  • +
  • +

    Finally, a module is capable of calling functions provided by + another module. This is very useful to share code and tables between + several font driver modules (for example, the truetype and + cff modules both use the routines provided by the + sfnt module).

    +
  • +
+ +

Hence, a more complete picture would be:

+ +
+ Detailed FreeType design +
+ +

Please take note of the following important points:

+ +
    +
  • +

    An optional component can use either the high-level or base API. + This is the case of ftglyph in the above picture.

    +
  • +
  • +

    Some optional components can use module-specific interfaces ignored + by the base layer. In the above example, ftmm directly + accesses the Type 1 module to set/query data.

    +
  • +
  • +

    A replacable component can provide a function of the high-level + API. For example, ftinit provides + FT_Init_FreeType() to client applications.

    +
  • +
+ +


+ +
+ + + + + + +
+ Previous + + Contents + + Next +
+
+ +
+
+ + + Index: xc/extras/freetype2/docs/design/design-3.html diff -u /dev/null xc/extras/freetype2/docs/design/design-3.html:1.1.1.1 --- /dev/null Mon Dec 18 14:22:26 2000 +++ xc/extras/freetype2/docs/design/design-3.html Fri Dec 8 16:26:12 2000 @@ -0,0 +1,353 @@ + + + + + + The design of FreeType 2 + + + + +

+ The design of FreeType 2 +

+ +

+ Copyright 1998-2000 David Turner (david@freetype.org)
+ Copyright 2000 The FreeType Development Team (devel@freetype.org) +

+ +
+ + +
+ +
+ + + + + + +
+ Previous + + Contents + + Next +
+
+ +


+ + + +
+

+ II. Public Objects and Classes +

+
+ +

We will now explain the abstractions provided by FreeType 2 to + client applications to manage font files and data. As you would normally + expect, these are implemented through objects/classes.

+ +

+ 1. Object Orientation in FreeType 2 +

+ +

Though written in ANSI C, the library employs a few techniques, + inherited from object-oriented programming, to make it easy to extend. + Hence, the following conventions apply in the FreeType 2 source + code:

+ +
    +
  1. +

    Each object type/class has a corresponding structure + type and a corresponding structure pointer + type. The latter is called the handle type for the + type/class.

    + +

    Consider that we need to manage objects of type "foo" in + FreeType 2. We would define the following structure and handle + types as follows:

    + +
    +    typedef struct FT_FooRec_*  FT_Foo;
    +
    +    typedef struct  FT_FooRec_
    +    {
    +      // fields for the "foo" class
    +      ...
    +
    +    } FT_FooRec;
    +
    + +

    As a convention, handle types use simple but meaningful + identifiers beginning with FT_, as in FT_Foo, + while structures use the same name with a Rec suffix + appended to it ("Rec" is short for "record"). Note that each + class type has a corresponding handle type.

    +
  2. +
  3. +

    Class derivation is achieved internally by wrapping base class + structures into new ones. As an example, we define a "foobar" class + that is derived from "foo". We would do something like:

    + +
    +    typedef struct FT_FooBarRec_*  FT_FooBar;
    +
    +    typedef struct  FT_FooBarRec_
    +    {
    +      // the base "foo" class fields
    +      FT_FooRec  root;
    +
    +      // fields proper to the "foobar" class
    +      ...
    +    } FT_FooBarRec;
    +
    + +

    As you can see, we ensure that a "foobar" object is also a "foo" + object by placing a FT_FooRec at the start of the + FT_FooBarRec definition. It is called root by + convention.

    + +

    Note that a FT_FooBar handle also points to a "foo" + object and can be typecasted to FT_Foo. Similarly, when + the library returns a FT_Foo handle to client applications, + the object can be really implemented as a FT_FooBar or any + derived class from "foo".

    +
  4. +
+ +

In the following sections of this chapter, we will refer to "the + FT_Foo class" to indicate the type of objects handled through + FT_Foo pointers, be they implemented as "foo" or "foobar".

+ +
+ +

+ 2. The FT_Library class +

+ +

This type corresponds to a handle to a single instance of the + library. Note that the corresponding structure FT_LibraryRec + is not defined in public header files, making client applications unable + to access its internal fields.

+ +

The library object is the parent of all other objects in + FreeType 2. You need to create a new library instance before doing + anything else with the library. Similarly, destroying it will + automatically destroy all its children (i.e. faces and modules).

+ +

Typical client applications should call FT_Init_FreeType() + in order to create a new library object, ready to be used for further + actions.

+ +

Another alternative is to create a fresh new library instance by + calling the function FT_New_Library(), defined in the + <freetype/ftmodule.h> public header file. This function + will however return an "empty" library instance with no module + registered in it. You can "install" modules in the instance by calling + FT_Add_Module() manually.

+ +

Calling FT_Init_FreeType() is a lot more convenient, because + this function basically registers a set of default modules into each new + library instance. The way this list is accessed and/or computed is + determined at build time, and depends on the content of the + ftinit component. This process is explained in details later + in this document.

+ +

For now, one should consider that library objects are created with + FT_Init_FreeType(), and destroyed along with all children with + FT_Done_FreeType().

+ +
+ +

+ 3. The FT_Face class +

+ +

A face object corresponds to a single font face, i.e., a + specific typeface with a specific style. For example, "Arial" and + "Arial Italic" correspond to two distinct faces.

+ +

A face object is normally created through FT_New_Face(). + This function takes the following parameters: an FT_Library + handle, a C file pathname used to indicate which font file to open, an + index used to decide which face to load from the file (a single file may + contain several faces in certain cases), and the address of a + FT_Face handle. It returns an error code:

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

In case of success, the function will return 0, and the handle + pointed to by the face parameter will be set to a non-NULL + value.

+ +

Note that the face object contains several fields used to describe + global font data that can be accessed directly by client applications. + For example, the total number of glyphs in the face, the face's family + name, style name, the EM size for scalable formats, etc. For more + details, look at the FT_FaceRec definition in the + FreeType 2 API Reference.

+ +
+ +

+ 4. The FT_Size class +

+ +

Each FT_Face object has one or more + FT_Size objects. A size object is used to store data + specific to a given character width and height. Each newly created face + object has one size, which is directly accessible as + face->size.

+ +

The contents of a size object can be changed by calling either + FT_Set_Pixel_Sizes() or FT_Set_Char_Size().

+ +

A new size object can be created with FT_New_Size(), and + destroyed manually with FT_Done_Size(). Note that typical + applications don't need to do this normally: they tend to use the + default size object provided with each FT_Face.

+ +

The public fields of FT_Size objects are defined in a very + small structure named FT_SizeRec. However, it is important to + understand that some font drivers define their own derivatives of + FT_Size to store important internal data that is re-computed + each time the character size changes. Most of the time, these are + size-specific font hints./p> + +

For example, the TrueType driver stores the scaled CVT table that + results from the execution of the "cvt" program in a TT_Size + structure, while the Type 1 driver stores scaled global metrics + (like blue zones) in a T1_Size object. Don't worry if you + don't understand the current paragraph; most of this stuff is highly + font format specific and doesn't need to be explained to client + developers :-)

+ +
+ +

+ 5. The FT_GlyphSlot class +

+ +

The purpose of a glyph slot is to provide a place where glyph images + can be loaded one by one easily, independently of the glyph image format + (bitmap, vector outline, or anything else).

+ +

Ideally, once a glyph slot is created, any glyph image can be loaded + into it without additional memory allocation. In practice, this is only + possible with certain formats like TrueType which explicitly provide + data to compute a slot's maximum size.

+ +

Another reason for glyph slots is that they are also used to hold + format-specific hints for a given glyphs as well as all other data + necessary to correctly load the glyph.

+ +

The base FT_GlyphSlotRec structure only presents glyph + metrics and images to client applications, while actual implementation + may contain more sophisticated data.

+ +

As an example, the TrueType-specific TT_GlyphSlotRec + structure contains additional fields to hold glyph-specific bytecode, + transient outlines used during the hinting process, and a few other + things. + + The Type 1-specific T1_GlyphSlotRec structure holds glyph + hints during glyph loading, as well as additional logic used to properly + hint the glyphs when a native Type 1 hinter is used.

+ +

Finally, each face object has a single glyph slot that is directly + accessible as face->glyph.

+ +
+ +

+ 6. The FT_CharMap class +

+ +

The FT_CharMap type is used as a handle to character map + objects, or charmaps. A charmap is simply some sort of table + or dictionary which is used to translate character codes in a given + encoding into glyph indices for the font.

+ +

A single face may contain several charmaps. Each one of them + corresponds to a given character repertoire, like Unicode, Apple Roman, + Windows codepages, and other encodings.

+ +

Each FT_CharMap object contains a "platform" and an + "encoding" field used to identify precisely the character repertoire + corresponding to it.

+ +

Each font format provides its own derivative of + FT_CharMapRec and thus needs to implement these objects.

+ +
+ +

+ 7. Objects relationships +

+ +

The following diagram summarizes what we have just said regarding the + public objects managed by the library, as well as explicitely describes + their relationships

+ +
+ Simple library model +
+ +

Note that this picture will be updated at the end of the next + chapter, related to internal objects.

+ +


+ +
+ + + + + + +
+ Previous + + Contents + + Next +
+
+ +
+
+ + + Index: xc/extras/freetype2/docs/design/design-4.html diff -u /dev/null xc/extras/freetype2/docs/design/design-4.html:1.1.1.1 --- /dev/null Mon Dec 18 14:22:26 2000 +++ xc/extras/freetype2/docs/design/design-4.html Fri Dec 8 16:26:12 2000 @@ -0,0 +1,361 @@ + + + + + + The design of FreeType 2 + + + + +

+ The design of FreeType 2 +

+ +

+ Copyright 1998-2000 David Turner (david@freetype.org)
+ Copyright 2000 The FreeType Development Team (devel@freetype.org) +

+ +
+ + +
+ +
+ + + + + + +
+ Previous + + Contents + + Next +
+
+ +


+ + + +
+

+ III. Internal Objects and Classes +

+
+ +

Let us have a look now at the internal objects that + FreeType 2 uses, i.e., those not directly available to client + applications, and see how they fit into the picture.

+ +

+ 1. Memory management +

+ +

All memory management operations are performed through three specific + routines of the base layer, namely: FT_Alloc(), + FT_Realloc(), and FT_Free(). Each one of these + functions expects a FT_Memory handle as its first + parameter.

+ +

The latter is a pointer to a simple object used to describe the + current memory pool/manager. It contains a simple table of + alloc/realloc/free functions. A memory manager is created at library + initialization time by FT_Init_FreeType(), calling the function + FT_New_Memory() provided by the ftsystem + component.

+ +

By default, this manager uses the ANSI malloc(), + realloc(), and free() functions. However, as + ftsystem is a replaceable part of the base layer, a specific + build of the library could provide a different default memory + manager.

+ +

Even with a default build, client applications are still able to + provide their own memory manager by not calling + FT_Init_FreeType() but follow these simple steps:

+ +
    +
  1. +

    Create a new FT_Memory object by hand. The definition + of FT_MemoryRec is located in the public file + <freetype/ftsystem.h>.

    +
  2. +
  3. +

    Call FT_New_Library() to create a new library instance + using your custom memory manager. This new library doesn't yet + contain any registered modules.

    +
  4. +
  5. +

    Register the set of default modules by calling the function + FT_Add_Default_Modules() provided by the ftinit + component, or manually register your drivers by repeatedly + calling FT_Add_Module().

    +
  6. +
+ +
+ +

+ 2. Input streams +

+ +

Font files are always read through FT_Stream objects. The + definition of FT_StreamRec is located in the public file + <freetype/ftsystem.h>, which allows client developers to + provide their own implementation of streams if they wish so.

+ +

The function FT_New_Face() will always automatically create + a new stream object from the C pathname given as its second + argument. This is achieved by calling the function + FT_New_Stream() provided by the ftsystem component. + As the latter is replaceable, the implementation of streams may vary + greatly between platforms.

+ +

As an example, the default implementation of streams is located in + the file src/base/ftsystem.c and uses the ANSI + fopen(), fseek(), and fread() calls. + However, the Unix build of FreeType 2 provides an alternative + implementation that uses memory-mapped files, when available on the host + platform, resulting in a significant access speed-up.

+ +

FreeType distinguishes between memory-based and disk-based streams. + In the first case, all data is directly accessed in memory (e.g. + ROM-based, write-only static data and memory-mapped files), while in the + second, portions of the font files are read in chunks called + frames, and temporarily buffered similarly through typical + seek/read operations.

+ +

The FreeType stream sub-system also implements extremely efficient + algorithms to very quickly load structures from font files while + ensuring complete safety in the case of a "broken file".

+ +

The function FT_New_Memory_Face() can be used to directly + create/open a FT_Face object from data that is readily + available in memory (including ROM-based fonts).

+ +

Finally, in the case where a custom input stream is needed, client + applications can use the function FT_Open_Face(), which can + accept custom input streams. This may be useful in the case of + compressed or remote font files, or even embedded font files that need + to be extracted from certain documents.

+ +

Note that each face owns a single stream, which is also destroyed by + FT_Done_Face(). Generally speaking, it is certainly + not a good idea to keep numerous FT_Face objects + opened.

+ +
+ +

+ 3. Modules +

+ +

A FreeType 2 module is itself a piece of code. However, the + library creates a single FT_Module object for each module that + is registered when FT_Add_Module() is called.

+ +

The definition of FT_ModuleRec is not publicly available to + client applications. However, each module type is described by + a simple public structure named FT_Module_Class, defined in + <freetype/ftmodule.h>, and is described later in this + document:

+ +

You need a pointer to an FT_Module_Class structure when + calling FT_Add_Module(), whose declaration is:

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

Calling this function will do the following:

+ +
    +
  • +

    It will check whether the library already holds a module object + corresponding to the same module name as the one found in + FT_Module_Class.

    +
  • +
  • +

    If this is the case, it will compare the module version number to + see whether it is possible to upgrade the module to a new + version. If the module class's version number is smaller than the + already installed one, the function returns immediately. Similarly, + it checks that the version of FreeType 2 that is running is + correct compared to the one required by the module.

    +
  • +
  • +

    It creates a new FT_Module object, using data and flags + of the module class to determine its byte size and how to properly + initialize it.

    +
  • +
  • +

    If a module initializer is present in the module class, it will + be called to complete the module object's initialization.

    +
  • +
  • +

    The new module is added to the library's list of "registered" + modules. In case of an upgrade, the previous module object is + simply destroyed.

    +
  • +
+ +

Note that this function doesn't return an FT_Module handle, + given that module objects are completely internal to the library (and + client applications shouldn't normally mess with them :-)

+ +

Finally, it is important to understand that FreeType 2 + recognizes and manages several kinds of modules. These will be + explained in more details later in this document, but we will list for + now the following types:

+ +
    +
  • +

    Renderer modules are used to convert native glyph images + to bitmaps/pixmaps. FreeType 2 comes with two renderer modules + by default: one to generate monochrome bitmaps, the other to + generate high-quality anti-aliased pixmaps.

    +
  • +
  • +

    Font driver modules are used to support one or more font + formats. Typically, each font driver provides a specific + implementation/derivative of FT_Face, FT_Size, + FT_GlyphSlot, as well as FT_CharMap.

    +
  • +
  • +

    Helper modules are shared by several font drivers. For + example, the sfnt module parses and manages tables found in + SFNT-based font formats; it is then used by both the TrueType and + OpenType font drivers.

    +
  • +
  • +

    Finally, the auto-hinter module has a specific place in + the library's design, as its role is to process vectorial glyph + outlines, independently of their native font format, to produce + optimal results at small pixel sizes.

    +
  • +
+ +

Note that every FT_Face object is owned by the + corresponding font driver, depending on the original font file's format. + This means that all face objects are destroyed when a module is + removed/unregistered from a library instance (typically by calling the + FT_Remove_Module() function).

+ +

Because of this, you should always take care that no + FT_Face object is opened when you upgrade or remove a module + from a library, as this could cause unexpected object deletion!

+ +
+ +

+ 4. Libraries +

+ +

We now come back to our well-known FT_Library object. From + what have been said before, we already know that a library instance owns + at least the following:

+ +
    +
  • +

    A memory manager object (FT_Memory), used for all + allocation/releases within the instance.

    +
  • +
  • +

    A list of FT_Module objects, corresponding to the + "installed" or "registered" modules of the instance. This list can + be changed at any time through FT_Add_Module() and + FT_Remove_Module().

    +
  • +
  • +

    Remember that face objects are owner by font drivers that are + themselves modules owned by the library.

    +
  • +
+ +

There is however another object owned by the library instance that + hasn't been described yet: the raster pool.

+ +

The raster pool is simply a block of memory of fixed size + that is used internally as a "scratch area" for various memory-hungry + transient operations, avoiding memory allocation. For example, it is + used by each renderer when converting a vectorial glyph outline into a + bitmap (actually, that's where its name comes from :-).

+ +

The size of the raster pool is fixed at initialisation time (it + defaults to 16kByte) and cannot be changed at run-time (though we could + fix this if there is a real need for that).

+ +

When a transient operation needs more memory than the pool's size, it + can decide to either allocate a heap block as an exceptional condition, + or sub-divide recursively the task to perform in order to never exceed + the pool's threshold.

+ +

This extremely memory-conservative behaviour is certainly one of the + keys to FreeType's performance in certain areas (most importantly in + glyph rendering/scanline-conversion).

+ +
+ +

+ 5. Summary +

+ +

Finally, the following picture illustrates what has been said in this + section, as well as the previous, by presenting the complete object + graph of FreeType 2's base design:

+ +
+ Complete library model +
+ +


+ +
+ + + + + + +
+ Previous + + Contents + + Next +
+
+ +
+
+ + + Index: xc/extras/freetype2/docs/design/design-5.html diff -u /dev/null xc/extras/freetype2/docs/design/design-5.html:1.1.1.1 --- /dev/null Mon Dec 18 14:22:26 2000 +++ xc/extras/freetype2/docs/design/design-5.html Fri Dec 8 16:26:12 2000 @@ -0,0 +1,458 @@ + + + + + + The design of FreeType 2 + + + + +

+ The design of FreeType 2 +

+ +

+ Copyright 1998-2000 David Turner (david@freetype.org)
+ Copyright 2000 The FreeType Development Team (devel@freetype.org) +

+ +
+ + +
+ +
+ + + + + + +
+ Previous + + Contents + + Next +
+
+ +


+ + + +
+

+ IV. Module Classes +

+
+ +

We will now try to explain more precisely the types of modules + that FreeType 2 is capable of managing. Note that each one of them + is decribed with more details in the following chapters of this + document.

+ +
    +
  • +

    Renderer modules are used to manage scalable glyph images. + This means transforming them, computing their bounding + box, and converting them to either monochrome + or anti-aliased bitmaps.

    + +

    Note that FreeType 2 is capable of dealing with any + kind of glyph images, as long as a renderer module is provided for it. + The library comes by default with two renderers:

    + +

    + + + + + + + + +
    + raster + +

    Supports the conversion of vectorial outlines (described by a + FT_Outline object) to monochrome bitmaps. +

    + smooth + +

    Supports the conversion of the same outlines to high-quality + anti-aliased pixmaps (using 256 levels of gray). Note + that this renderer also supports direct span generation.

    +

    + +
  • +

    Font driver modules are used to support one or more + specific font format. By default, FreeType 2 comes with the + following font drivers:

    + +

    + + + + + + + + + + + + + + + + + + + + +
    + truetype + +

    supports TrueType font files

    +
    + type1 + +

    supports Postscript Type 1 fonts, both in binary + (.pfb) or ASCII (.pfa) formats, including + Multiple Master fonts.

    +
    + cid + +

    supports Postscript CID-keyed fonts

    +
    + cff + +

    supports OpenType, CFF as well as CEF fonts (CEF is a + derivative of CFF used by Adobe in its SVG viewer)

    +
    + winfonts + +

    supports Windows bitmap fonts (i.e. .fon and + .fnt)

    +

    + +

    Note that font drivers can support bitmapped or scalable glyph + images. A given font driver that supports Bézier outlines + through FT_Outline can also provide its own hinter, or rely + on FreeType's autohinter module.

    +
  • + +
  • +

    Helper modules are used to hold shared code that is often + used by several font drivers, or even other modules. Here are the + default helpers:

    + +

    + + + + + + + + + + + + +
    + sfnt + + used to support font formats based on the SFNT storage + scheme: TrueType & OpenType fonts as well as other variants (like + TrueType fonts that only contain embedded bitmaps) +
    + psnames + + used to provide various useful functions related to glyph names + ordering and Postscript encodings/charsets. For example, this + module is capable of automatically synthetizing a Unicode charmap + from a Type 1 glyph name dictionary. +
    + psaux + + used to provide various useful functions related to Type 1 + charstring decoding, as this "feature" is needed by the + type1, cid, and cff drivers. +

    +
  • + +
  • +

    Finally, the autohinter module has a specific role in + FreeType 2, as it can be used automatically during glyph loading + to process individual glyph outlines when a font driver doesn't + provide it's own hinting engine.

    + +

    This module's purpose and design is also heavily described on the + FreeType web site.

    +
  • +
+ +

We will now study how modules are described, then managed by the + library.

+ +

+ 1. The FT_Module_Class structure +

+ +

As described later in this document, library initialization is + performed by calling the FT_Init_FreeType() function. The + latter is in charge of creating a new "empty" FT_Library + object, then register each "default" module by repeatedly calling the + FT_Add_Module() function.

+ +

Similarly, client applications can call FT_Add_Module() any + time they wish in order to register a new module in the library. Let us + take a look at this function's declaration:

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

As one can see, this function expects a handle to a library object, + as well as a pointer to a FT_Module_Class structure. It + returns an error code. In case of success, a new module object is + created and added to the library. Note by the way that the module isn't + returned directly by the call!

+ +

Here the definition of FT_Module_Class, with some + explanation. The following code is taken from + <freetype/ftmodule.h>:

+ +
+    typedef struct  FT_Module_Class_
+    {
+      FT_ULong               module_flags;
+      FT_Int                 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;
+
+ +

A description of its fields:

+ +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ module_flags + +

A set of bit flags used to describe the module's category. Valid + values are:

+ +
    +
  • + ft_module_font_driver if the module is a font driver +
  • +
  • + ft_module_renderer if the module is a renderer +
  • +
  • + ft_module_hinter if the module is an auto-hinter +
  • +
  • + ft_module_driver_scalable if the module is a font + driver supporting scalable glyph formats +
  • +
  • + ft_module_driver_no_outlines if the module is a font + driver supporting scalable glyph formats that cannot be + described by an FT_Outline object +
  • +
  • + ft_module_driver_has_hinter if the module is a font + driver that provides its own hinting scheme/algorithm +
  • +
+
+ module_size + +

An integer that gives the size in bytes of a given + module object. This should never be less than + sizeof(FT_ModuleRec), but can be more if the module needs + to sub-class the base FT_ModuleRec class.

+
+ module_name + +

The module's internal name, coded as a simple ASCII + C string. There can't be two modules with the same name + registered in a given FT_Library object. However, + FT_Add_Module() uses the module_version field to + detect module upgrades and perform them cleanly, even at + run-time.

+
+ module_version + +

A 16.16 fixed float number giving the module's major and minor + version numbers. It is used to determine whether a module needs to + be upgraded when calling FT_Add_Module().

+
+ module_requires + +

A 16.16 fixed float number giving the version of FreeType 2 + that is required to install this module. The default value is + 0x20000 for FreeType version  2.0

+
+ module_requires + +

Most modules support one or more "interfaces", i.e. tables of + function pointers. This field is used to point to the module's main + interface, if there is one. It is a short-cut that prevents users + of the module to call "get_interface()" each time they need to + access one of the object's common entry points.

+ +

Note that is is optional, and can be set to NULL. Other + interfaces can also be accessed through the get_interface() + field.

+
+ module_init + +

A pointer to a function used to initialize the fields of a fresh + new FT_Module object. It is called after the + module's base fields have been set by the library, and is generally + used to initialize the fields of FT_ModuleRec + subclasses.

+ +

Most module classes set it to NULL to indicate that no extra + initialization is necessary.

+
+ module_done + +

A pointer to a function used to finalize the fields of a given + FT_Module object. Note that it is called before + the library unsets the module's base fields, and is generally used + to finalize the fields of FT_ModuleRec subclasses.

+ +

Most module classes set it to NULL to indicate that no extra + finalization is necessary

+
+ get_interface + +

A pointer to a function used to request the address of a given + module interface. Set it to NULL if you don't need to support + additional interfaces but the main one.

+

+ + +

+ 2. The FT_Module type +

+ +

The FT_Module type is a handle (i.e. a pointer) to a given + module object/instance, whose base structure is given by the internal + FT_ModuleRec type. We will intentionally not describe + this structure here, as there is no point to look so far into the + library's design.

+ +

When FT_Add_Module is called, it first allocates a new + module instance, using the module_size class field to determine + its byte size. The function initializes the root FT_ModuleRec + field, then calls the class-specific initializer module_init + when this field is not set to NULL.

+ +

Note that the library defines several sub-classes of + FT_ModuleRec, which are, as you could have guessed:

+ +
    +
  • FT_Renderer for renderer modules

    +
  • FT_Driver for font driver modules

    +
  • FT_AutoHinter for the auto-hinter

    +
+ +

Helper modules use the base FT_ModuleRec type. We will + describe these classes in the next chapters.

+ +


+ +
+ + + + + + +
+ Previous + + Contents + + Next +
+
+ +
+
+ + + Index: xc/extras/freetype2/docs/design/design-6.html diff -u /dev/null xc/extras/freetype2/docs/design/design-6.html:1.1.1.1 --- /dev/null Mon Dec 18 14:22:26 2000 +++ xc/extras/freetype2/docs/design/design-6.html Fri Dec 8 16:26:12 2000 @@ -0,0 +1,94 @@ + + + + + + The design of FreeType 2 + + + + +

+ The design of FreeType 2 +

+ +

+ Copyright 1998-2000 David Turner (david@freetype.org)
+ Copyright 2000 The FreeType Development Team (devel@freetype.org) +

+ +
+ + +
+ +
+ + + + + + +
+ Previous + + Contents + +   +
+
+ +


+ + + +
+

+ TO BE CONTINUED... +

+
+ + +


+ +
+ + + + + + +
+ Previous + + Contents + +   +
+
+ +
+
+ + + Index: xc/extras/freetype2/docs/design/index.html diff -u /dev/null xc/extras/freetype2/docs/design/index.html:1.1.1.1 --- /dev/null Mon Dec 18 14:22:26 2000 +++ xc/extras/freetype2/docs/design/index.html Fri Dec 8 16:26:12 2000 @@ -0,0 +1,81 @@ + + + + + + The design of FreeType 2 + + + + +

+ The design of FreeType 2 +

+ +

+ Copyright 1998-2000 David Turner (david@freetype.org)
+ Copyright 2000 The FreeType Development Team (devel@freetype.org) +

+ + +
+ + +
+ +

This document describes the details of FreeType 2's internals. + Read this carefully if you need to understand the innards of the library + in order to hack or extend it.

+ + + + + +
+

+ Table of Contents +

+
+ +
+ + +
+ +

+ Introduction +

+ +

+ I. Components and APIs +

+ +

+ II. Public Objects and Classes +

+ +

+ III. Internal Objects and Classes +

+ +

+ IV. Module Classes +

+ +
+
+ +
+
+ + Index: xc/extras/freetype2/docs/design/modules.html diff -u /dev/null xc/extras/freetype2/docs/design/modules.html:1.1.1.1 --- /dev/null Mon Dec 18 14:22:26 2000 +++ xc/extras/freetype2/docs/design/modules.html Fri Dec 8 16:26:12 2000 @@ -0,0 +1,639 @@ + +FreeType 2 - Modules + + + + + +
+ +

FreeType 2 Modules

+ +
+

Introduction

+
+ +

+The purpose of this document is to present in great details the way +FreeType 2 uses and manages modules. Among other things, it answers +the following questions:

+ +
    +
  • + what is a module, and what kind of modules are recognized + by the library? +

  • + +
  • + how are modules registered and managed by the library? +

  • + +
  • + how to write a new module, especially new font drivers? +

  • + +
  • + how to select specific modules for a given build of the + library ? +

  • + +
  • + how to compile modules as stand-alone DLLs / shared objects? +

  • + +
+ +
+

Overview

+
+ + +

1. Library design:

+ +

The design of the library is pretty basic:

+
    +
  • + client applications typically call the FreeType 2 high-level + API, whose functions are implemented in a single component + called the Base Layer. +

  • + +
  • + depending on the context or the task, the base + layer then calls one or more modules to perform the + work. In most cases, the client application doesn't + need to know what module was called. +

  • + +
  • + the base layer also contains a set of routines that are + used for generic things like memory allocation, list + processing, i/o stream parsing, fixed point computation, + etc.. these functions can also be called by a module + at any, and they form what is called the "low-level + base API". +

  • +
+ +

This is illustrated by the following graphics:

+ +
+ +

Note that, however, FT2 comes with a set of optional +components that can be ommited from certain builds, and whose +purpose vary between two situations:

+ +
    +
  • + some are located on top of the high-level API and provide + convenience functions that make certain things easier + for typical applications. They typically do not call + modules directly, though they can use the low level + base API for certain tasks.

    + +

    As an example, see the the ftglyph component + that is used to manipulate glyph images more conveniently + than the default API.

    +

  • + +
  • + some other components complement the base layer, by providing + additional routines. Most of them allow client applications + to access format-specific data.

    + +

    For example, the ftmm component provides high-level + functions to specify Multiple Master coordinates for MM Type 1 + fonts.

    +

  • +
+ +

This is illustrated by the following graphics:

+ +
+ +
+

Module Classes

+
+ +

+The library is capable of managing and using several kinds of +modules:

+ +
    +
  • + renderer modules are used to convert scalable glyph images + to bitmaps. FreeType 2 comes by default with two of them:

    + +
    +

    raster1

    +
    +

    supports the conversion of vectorial outlines (described by a + FT_Outline object) to monochrome bitmaps. +

    + +

    smooth

    +
    +

    supports the conversion of the same outlines to high-quality + anti-aliased pixmaps.

    +
    + + +

    The specification and interface of renderers is described in + details within this document.

    + +

    Note that most font formats use FT_Outline objects + to describe scalable glyph images. However, FT2 is flexible + and allows specific modules to register and support other + formats. As an example, it's (at least theorically :-) perfectly + possible to write a renderer module that is capable of directly + converting MetaFont glyph definitions to bitmaps or pixmaps ! + (of course, this assumes that you also write a MetaFont font + driver to load the definitions :-). +

  • + +
  • + font driver modules are used to support one or more specific + font format. By default, FT2 comes with the following modules:

    + +
    + +
    +

    truetype

    +
    +

    supports TrueType font files

    +
    + +

    type1

    +
    +

    supports Postscript Type 1 fonts, both in binary (.pfb) or ASCII + (.pfa) formats, including Multiple Master fonts.

    +
    + +

    cid

    +
    +

    supports Postscript CID-keyed fonts

    +
    + +

    cff

    +
    +

    supports OpenType, CFF as well as CEF fonts (CEF is a derivative + of CFF used by Adobe in its SVG viewer).

    +
    + +

    winfonts

    +
    +

    supports Windows bitmap fonts (i.e. ".FON" and ".FNT").

    +
    + +

    Note that font drivers can support bitmapped or scalable glyph + images. A given font driver that supports bezier outlines through + the FT_Outline can also provide its own hinter, or rely + on FreeType's autohinter module. +

  • + +
  • + helper modules are used to hold shared code that is + often used by several font drivers, or even other modules. + Here are a few examples of helper modules that come with + FreeType 2:

    + +
    + sfnt + + used to support font formats based on the "SFNT" + storage scheme. This means TrueType & OpenType fonts as + well as other variants (like TrueType fonts that only + contain embedded bitmaps). +
    + + psnames + + used to provide various useful function related to glyph + names ordering and Postscript encodings/charsets. For example, + this module is capable of automatically synthetizing a Unicode + charmap from a Type 1 glyph name dictionary. +
    +

  • + + +
  • + finally, the autohinter module has a specific role in + FreeType 2, as it can be used automatically during glyph loading + to process individual glyph outlines when a font driver doesn't + provide it's own hinting engine. +

  • +
+ +

We will now study how modules are described, then managed by + the library.

+ +

1. The FT_Module_Class structure:

+ +

As described later in this document, library initialisation is + performed by calling the FT_Init_FreeType function. The + latter is in charge of creating a new "empty" FT_Library + object, then register each "default" module by repeatedly calling + the FT_Add_Module function.

+ +

Similarly, client applications can call FT_Add_Module + any time they wish in order to register a new module in the library. + Let's take a look at this function's declaration:

+ +

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

As one can see, this function expects a handle to a library object, + as well as a pointer to a FT_Module_Class structure. It + returns an error code. In case of success, a new module object is + created and added to the library. Note by the way that the module + isn't returned directly by the call !.

+ +

Let's study the definition of FT_Module_Class, and explain it + a bit. The following code is taken from + <freetype/ftmodule.h>:

+ +

+  typedef struct  FT_Module_Class_
+  {
+    FT_ULong               module_flags;
+    FT_Int                 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;
+
+ +

here's a description of its fields:

+ +
+

module_flags

+
+

this is a set of bit flags used to describe the module's +category. Valid values are:

+
    +
  • + ft_module_font_driver if the module is a font driver +

  • + +
  • + ft_module_renderer if the module is a renderer +

  • + +
  • + ft_module_hinter if the module is an auto-hinter +

  • + +
  • + ft_module_driver_scalable if the module is a font + driver supporting scalable glyph formats. +

  • + +
  • + ft_module_driver_no_outlines if the module is a + font driver supporting scalable glyph formats that cannot + be described by a FT_Outline object +

  • + +
  • + ft_module_driver_has_hinter if the module is a font + driver that provides its own hinting scheme/algorithm +

  • +
+
+ +

module_size

+
+

an integer that gives the size in bytes of a given module +object. This should never be less than +sizeof(FT_ModuleRec), but can be more when the module +needs to sub-class the base FT_ModuleRec class.

+
+ +

module_name

+
+

this is the module's internal name, coded as a simple ASCII C +string. There can't be two modules with the same name registered +in a given FT_Library object. However, FT_Add_Module +uses the module_version field to detect module upgrades +and perform them cleanly, even at run-time.

+
+ +

module_version

+
+

a 16.16 fixed float number giving the module's major and minor + version numbers. It is used to determine wether a module needs + to be upgraded when calling FT_Add_Module.

+
+ +

module_requires

+
+

a 16.16 fixed float number giving the version of FreeType 2 that + is required to install this module. By default, should be 0x20000 + for FreeType 2.0

+
+ +

module_requires

+
+

most modules support one or more "interfaces", i.e. tables of function +pointers. This field is used to point to the module's main interface, +where there is one. It's a short-cut that prevents users of the module +to call "get_interface" each time they need to access one of the object's +common entry points.

+ +

Note that is is optional, and can be set to NULL. Other interfaces +can also be accessed through the get_interface field.

+
+ +

module_init

+
+

this is a pointer to a function used to initialise the fields of +a fresh new FT_Module object. It is called after the module's +base fields have been set by the library, and is generally used to +initialise the fields of FT_ModuleRec subclasses.

+ +

Most module classes set it to NULL to indicate that no extra +initialisation is necessary

+
+ +

module_done

+
+

this is a pointer to a function used to finalise the fields of +a given FT_Module object. Note that it is called before the +library unsets the module's base fields, and is generally used to +finalize the fields of FT_ModuleRec subclasses.

+ +

Most module classes set it to NULL to indicate that no extra +finalisation is necessary

+
+ +

get_interface

+
+

this is a pointer to a function used to request the address of +a given module interface. Set it to NULL if you don't need to support +additional interfaces but the main one.

+
+ +
+ + +

2. The FT_Module type:

+ +

the FT_Module type is a handle (i.e. a pointer) to a given + module object / instance, whose base structure is given by the + internal FT_ModuleRec type (we will not detail its + structure here).

+ +

When FT_Add_Module is called, it first allocate a new + module instance, using the module_size class + field to determine its byte size. The function initializes + a the root FT_ModuleRec fields, then calls + the class-specific initializer module_init + when this field is not set to NULL.

+ + + + +
+

Renderer Modules

+
+ +

As said previously, renderers are used to convert scalable + glyph images to bitmaps or pixmaps. Each renderer module is defined + through a renderer class, whose definition is found in the + file <freetype/ftrender.h>. However, a few concepts + need to be explained before having a detailed look at this structure. +

+ +

1. Glyph formats:

+ +

Each glyph image that is loaded by FreeType (either through + FT_Load_Glyph or FT_Load_Char), has a given + image format, described by the field + face->glyph->format. It is a 32-byte integer that + can take any value. However, the file <freetype/ftimage.h> + defines at least the following values:

+ +
+ + + + + + + + +
+ft_glyph_format_bitmap + +this value is used to indicate that the glyph image is a bitmap or pixmap. +Its content can then be accessed directly from +face->glyph->bitmap after the glyph was loaded. +
+ft_glyph_format_outline + +this value is used to indicate that the glyph image is a scalable vectorial +outline, that can be described by a FT_Outline object. Its content +can be accessed directly from +face->glyph->outline after the glyph was loaded. +this is the format that is commonly returned by TrueType, Type1 and +OpenType / CFF fonts. +
+ft_glyph_format_plotter + +this value is equivalent to ft_glyph_format_outline except +that the outline stored corresponds to path strokes, instead of filled +outlines. It can be returned from certain Type 1 fonts (notably the Hershey +collection of free fonts). +
+ft_glyph_format_composite + +this value is used to indicate that the glyph image is really a "compound" +of several other "sub-glyphs". This value is only returned when a glyph +is loaded with the FT_LOAD_NO_RECURSE flag. The list of +subglyphs that make up the composite can be accessed directly as +face->glyph->subglyphs after the glyph was loaded. +
+ +

Note that this is only a list of pre-defined formats supported by + FreeType. Nothing prevents an application to install a new font + driver that creates other kinds of glyph images. For example, one + could imagine a MetaFont font driver, that would be capable to + parse font definition files and create in-memory "glyph programs", + that could be returned in face->glyph->other.

+ +

2. The FT_Outline type:

+ +

This structure, which is also defined, and heavily commented, in + the file <freetype/ftimage.h>, is used to hold + a scalable glyph image that is made of one or more contours, each + contour being described by line segments or bezier arcs (either + quadratic or cubic). The outline itself is stored in a compact + way that makes processing it easy.

+ +

Points are placed in a 2D plane that uses the y-upwards convention, + and their coordinates are stored in 1/64th of pixels (also known + as the 26.6 fixed point format). Pixels correspond to single squares + whose borders are on integer coordinates (i.e. mutiples of 64). + In other words, pixel centers are located on half pixel coordinates.

+ +

Outlines can be very easily transformed (translated, rotated, etc..) + before being converted to bitmap, which allows for sophisticated + use of text. FreeType 2 comes by default with two "outline renderer" + modules:

+ +

    +
  • raster1, used to convert them to monochrome bitmaps
  • +
  • smooth, used to convert them to high-quality anti-aliased + pixmaps
  • +

+ +

3. Bitmaps and scan-conversion:

+ +

Bitmaps and pixmaps are described through a FT_Bitmap + structure, which is defined and heavily commented in + <freetype/ftimage.h> + + +


+  typedef struct  FT_Renderer_Class_
+  {
+    FT_Module_Class       root;
+
+    FT_Glyph_Format       glyph_format;
+
+    FTRenderer_render     render_glyph;
+    FTRenderer_transform  transform_glyph;
+    FTRenderer_getCBox    get_glyph_cbox;
+    FTRenderer_setMode    set_mode;
+
+    FT_Raster_Funcs*      raster_class;
+
+  } FT_Renderer_Class;
+
+ +
+

Font Driver Modules

+
+ +
+

Library Initialisation & Dynamic Builds

+
+ +

By default, all components of FreeType 2 are compiled independently, + then grouped into a single static library file that can be installed + or used directly to compile client applications

+ +

Such applications must normally call the FT_Init_FreeType + function before using the library. This function is in charge of + two things:

+ +
    +
  • + First, it creates a FT_Library object (by calling + the public function FT_New_Library). This new + object is "empty" and has no module registered in it. +

  • + +
  • + Then, it registers all "default modules" by repeatedly calling + FT_Add_Module. +

  • +
+ +

It is important to notice that the default implementation of + FT_Init_FreeType, which is located in the source + file "src/base/ftinit.c" always uses a static + list of modules that is generated at compile time from the + configuration file <freetype/config/ftmodule.h>. +

+ +

There are cases where this may be inadequate. For example, one + might want to compile modules as independent DLLs in a specific + location (like "/usr/lib/freetype/module/"), and have + the library initialisation function load the modules dynamically + by parsing the directory's content

+ +

This is possible, and we're going to explain how to do it.

+ + +

a. Building the library as a DLL (i.e. "shared object" on Unix)

+ +

But first of all, let's explain how to build FreeType 2 as a single + DLL or shared object, i.e. one that includes the base layer, all + default modules and optional components into a single file.

+ +

When building dynamic libraries, certain compilers require specific + directives to declare exported DLL entry points. For example, the + "__cdecl" directive is required by Win32 compilers, as it forces + the use of the "C" parameter passing convention (instead of "smarter" + schemes, which usually use registers and the stack to pass parameters).

+ +

To make matter worse, some of these compilers require the directive + before the function's return type, while some others want it between + the return type and the function's identifier.

+ +

To allow such compilations, the FT_EXPORT_DEF() macro is + used in all public header files in order to declare each high-level + API function of FreeType 2, as in the following example, taken from + <freetype/freetype.h>:

+ +

+   FT_EXPORT_DEF(FT_Error)  FT_Init_FreeType( void );
+
+ +

the definition of FT_EXPORT_DEF(x) defaults to "extern x", + except when a specific definition is given in the library's system-specific + configuration file <freetype/config/ftconfig.h>. This + allows project builders to specify the exact compilation directive + they need.

+ +

Similarly, the FT_EXPORT_FUNC(x) macro is defined and used to + define exported functions within the FreeType 2 source code. + However, it is only used at compilation time.

+ + +

Note that on Unix, there is no need for specific exportation directives. + However, the code must be compiled in a special way, named Position + Independent Code ("PIC"), which is normally selected through specific + compiler flags (like "-PIC" with gcc).

+ + +

b. Building modules as DLLs

+ +

In order to build modules as dynamic libraries, we first need to compile + the base layer (and optional components) as a single DLL. This is very + similar to the case we just described, except that we also need to + export all functions that are part of the "low level base API", + as these will get called by the modules in various cases.

+ +

Similarly to the high-level API, all functions of the low-level base + API are declared in the internal header files of FreeType 2 with the + BASE_DEF(x) macro. The latter is similar to + FT_EXPORT_DEF and defaults to "extern x" unless + you specify a specific definition in + <freetype/config/ftconfig.h>.

+

+ +


+ +
+

Conclusion

+
+ +
+ + Index: xc/extras/freetype2/docs/glyphs/glyphs-1.html diff -u /dev/null xc/extras/freetype2/docs/glyphs/glyphs-1.html:1.1.1.1 --- /dev/null Mon Dec 18 14:22:27 2000 +++ xc/extras/freetype2/docs/glyphs/glyphs-1.html Fri Dec 8 16:26:13 2000 @@ -0,0 +1,199 @@ + + + + + + FreeType Glyph Conventions + + + + +

+ FreeType Glyph Conventions +

+ +

+ Version 2.1 +

+ +

+ Copyright 1998-2000 David Turner (david@freetype.org)
+ Copyright 2000 The FreeType Development Team (devel@freetype.org) +

+ +
+ + +
+ +
+ + + + + + +
+   + + Contents + + Next +
+
+ +


+ + + +
+

+ I. Basic typographic concepts +

+
+ + +

+ 1. Font files, format and information +

+ +

A font is a collection of various character images that can be used + to display or print text. The images in a single font share some common + properties, including look, style, serifs, etc. Typographically + speaking, one has to distinguish between a font family and its + multiple font faces, which usually differ in style though come + from the same template.

+ + For example, "Palatino Regular" and "Palatino Italic" are two distinct + faces from the same famous family, called "Palatino" + itself.

+ +

The single term font is nearly always used in ambiguous ways + to refer to either a given family or given face, depending on the + context. For example, most users of word-processors use "font" to + describe a font family (e.g. "Courier", "Palatino", etc.); however most + of these families are implemented through several data files depending + on the file format: For TrueType, this is usually one per face (i.e. + arial.ttf for "Arial Regular", ariali.ttf for "Arial + Italic", etc.). The file is also called a "font" but really contains a + font face.

+ +

A digital font is thus a data file that may contain one + or more font faces. For each of these, it contains character + images, character metrics, as well as other kind of information + important to the layout of text and the processing of specific character + encodings. In some awkward formats, like Adobe's Type 1, a single + font face is described through several files (i.e. one contains the + character images, another one the character metrics). We will ignore + this implementation issue in most parts of this document and consider + digital fonts as single files, though FreeType 2.0 is able to + support multiple-files fonts correctly.

+ +

As a convenience, a font file containing more than one face is called + a font collection. This case is rather rare but can be seen in + many Asian fonts, which contain images for two or more representation + forms of a given scripts (usually for horizontal and vertical + layout.

+ + +
+

+ 2. Character images and mappings +

+ +

The character images are called glyphs. A single character + can have several distinct images, i.e. several glyphs, depending on + script, usage or context. Several characters can also take a single + glyph (good examples are Roman ligatures like "fi" and "fl" which can be + represented by a single glyph). The relationships between characters + and glyphs can be very complex, but won't be discussed in this document. + Moreover, some formats use more or less awkward schemes to store and + access glyphs. For the sake of clarity, we only retain the following + notions when working with FreeType:

+ +
    +
  • +

    A font file contains a set of glyphs; each one can be stored as a + bitmap, a vector representation or any other scheme (most scalable + formats use a combination of mathematical representation and control + data/programs). These glyphs can be stored in any order in the font + file, and is typically accessed through a simple glyph index.

    +
  • +
  • +

    The font file contains one or more tables, called a character + map (or charmap in short), which is used to convert character + codes for a given encoding (e.g. ASCII, Unicode, DBCS, Big5, etc..) + into glyph indices relative to the font file. A single font face + may contain several charmaps. For example, most TrueType fonts + contain an Apple-specific charmap as well as a Unicode charmap, + which makes them usable on both Mac and Windows platforms.

    +
  • +
+ + +
+

+ 3. Character and font metrics +

+ +

Each glyph image is associated to various metrics which are used to + describe how must be placed and managed when rendering text. Though + they are described in more details in section III, they relate to + glyph placement, cursor advances as well as text layout. They are + extremely important to compute the flow of text when rendering a string + of text.

+ +

Each scalable format also contains some global metrics, expressed in + notional units, to describe some properties of all glyphs in the same + face. Examples for global metrics are the maximum glyph bounding box, + the ascender, descender and text height for the font.

+ +

Though these metrics also exist for non-scalable formats, they only + apply for a set of given character dimensions and resolutions, and + they are usually expressed in pixels then.

+ + +


+ +
+ + + + + + +
+   + + Contents + + Next +
+
+ +
+
+ + + Index: xc/extras/freetype2/docs/glyphs/glyphs-2.html diff -u /dev/null xc/extras/freetype2/docs/glyphs/glyphs-2.html:1.1.1.1 --- /dev/null Mon Dec 18 14:22:27 2000 +++ xc/extras/freetype2/docs/glyphs/glyphs-2.html Fri Dec 8 16:26:13 2000 @@ -0,0 +1,395 @@ + + + + + + FreeType Glyph Conventions + + + + +

+ FreeType Glyph Conventions +

+ +

+ Version 2.1 +

+ +

+ Copyright 1998-2000 David Turner (david@freetype.org)
+ Copyright 2000 The FreeType Development Team (devel@freetype.org) +

+ +
+ + +
+ +
+ + + + + + +
+ Previous + + Contents + + Next +
+
+ +


+ + + +
+

+ II. Glyph mutlines +

+
+ +

This section describes the way scalable representation of glyph images, + called outlines, are used by FreeType as well as client applications.

+ + +

+ 1. Pixels, points and device resolutions +

+ +

Though it is a very common assumption when dealing with computer + graphics programs, the physical dimensions of a given pixel (be it for + screens or printers) are not squared. Often, the output device, be it a + screen or printer, exhibits varying resolutions in both horizontal and + vertical direction, and this must be taken care of when rendering + text.

+ +

It is thus common to define a device's characteristics through two + numbers expressed in dpi (dots per inch). For example, a + printer with a resolution of 300x600 dpi has 300 pixels per + inch in the horizontal direction, and 600 in the vertical one. The + resolution of a typical computer monitor varies with its size + (15" and 17" monitors don't have the same pixel sizes at + 640x480), and of course the graphics mode resolution.

+ +

As a consequence, the size of text is usually given in + points, rather than device-specific pixels. Points are a + simple physical unit, where 1 point = 1/72th of + an inch, in digital typography. As an example, most Roman books are + printed with a body text which size is chosen between 10 and + 14 points.

+ +

It is thus possible to compute the size of text in pixels from the + size in points with the following formula:

+ +
+ pixel_size = point_size * resolution / 72 +
+ +

The resolution is expressed in dpi. Since horizontal and + vertical resolutions may differ, a single point size usually defines a + different text width and height in pixels.

+ +

Unlike what is often thought, the "size of text in pixels" is not + directly related to the real dimensions of characters when they are + displayed or printed. The relationship between these two concepts is a + bit more complex and relate to some design choices made by the font + designer. This is described in more detail in the next sub-section (see + the explanations on the EM square).

+ + +
+

+ 2. Vectorial representation +

+ +

The source format of outlines is a collection of closed paths called + contours. Each contour delimits an outer or inner + region of the glyph, and can be made of either line + segments or Bézier arcs.

+ +

The arcs are defined through control points, and can be + either second-order (these are conic Béziers) or + third-order (cubic Béziers) polynomials, depending on + the font format. Note that conic Béziers are usually called + quadratic Béziers in the literature. Hence, each point + of the outline has an associated flag indicating its type (normal or + control point). And scaling the points will scale the whole + outline.

+ +

Each glyph's original outline points are located on a grid of + indivisible units. The points are usually stored in a font file as + 16-bit integer grid coordinates, with the grid origin's being at (0,0); + they thus range from -16384 to 16383. (Even though point + coordinates can be floats in other formats such as Type 1, we will + restrict our analysis to integer values for simplicity).

+ +

The grid is always oriented like the traditional mathematical + two-dimensional plane, i.e., the X axis from the left to the + right, and the Y axis from bottom to top.

+ +

In creating the glyph outlines, a type designer uses an imaginary + square called the EM square. Typically, the EM square can be + thought of as a tablet on which the character are drawn. The square's + size, i.e., the number of grid units on its sides, is very important for + two reasons:

+ +
    +
  • +

    It is the reference used to scale the outlines to a given text + dimension. For example, a size of 12pt at 300x300 dpi + corresponds to 12*300/72 = 50 pixels. This is the + size the EM square would appear on the output device if it was + rendered directly. In other words, scaling from grid units to + pixels uses the formula:

    + +

    + pixel_size = point_size * resolution / 72
    + pixel_coord = grid_coord * pixel_size / EM_size +

    +
  • +
  • +

    The greater the EM size is, the larger resolution the designer + can use when digitizing outlines. For example, in the extreme + example of an EM size of 4 units, there are only 25 point + positions available within the EM square which is clearly not + enough. Typical TrueType fonts use an EM size of 2048 units; + Type 1 PostScript fonts have a fixed EM size of 1000 grid + units but point coordinates can be expressed as floating values.

    +
  • +
+ +

Note that glyphs can freely extend beyond the EM square if the font + designer wants so. The EM is used as a convenience, and is a valuable + convenience from traditional typography.

+ +

Grid units are very often called font units or EM + units.

+ +

As said before, pixel_size computed in the above formula + does not relate directly to the size of characters on the screen. It + simply is the size of the EM square if it was to be displayed. Each + font designer is free to place its glyphs as it pleases him within the + square. This explains why the letters of the following text have not + the same height, even though they are displayed at the same point size + with distinct fonts: + +

+ Comparison of font heights +

+ +

As one can see, the glyphs of the Courier family are smaller than + those of Times New Roman, which themselves are slightly smaller than + those of Arial, even though everything is displayed or printed at a size + of 16 points. This only reflects design choices.

+ + +
+

+ 3. Hinting and Bitmap rendering +

+ +

The outline as stored in a font file is called the "master" outline, + as its points coordinates are expressed in font units. Before it can be + converted into a bitmap, it must be scaled to a given size/resolution. + This is done through a very simple transformation, but always creates + undesirable artifacts, e.g. stems of different widths or heights in + letters like "E" or "H".

+ +

As a consequence, proper glyph rendering needs the scaled points to + be aligned along the target device pixel grid, through an operation + called grid-fitting, and often hinting. One of its + main purposes is to ensure that important widths and heights are + respected throughout the whole font (for example, it is very often + desirable that the "I" and the "T" have their central vertical line of + the same pixel width), as well as to manage features like stems and + overshoots, which can cause problems at small pixel sizes.

+ +

There are several ways to perform grid-fitting properly; most + scalable formats associate some control data or programs with each glyph + outline. Here is an overview:

+ +
    +
  • +

    explicit grid-fitting

    + +

    The TrueType format defines a stack-based virtual machine, for + which programs can be written with the help of more than + 200 opcodes (most of these relating to geometrical operations). + Each glyph is thus made of both an outline and a control program to + perform the actual grid-fitting in the way defined by the font + designer.

    +
  • +
  • +

    implicit grid-fitting (also called hinting)

    + +

    The Type 1 format takes a much simpler approach: Each glyph + is made of an outline as well as several pieces called + hints which are used to describe some important features of + the glyph, like the presence of stems, some width regularities, and + the like. There aren't a lot of hint types, and it is up to the + final renderer to interpret the hints in order to produce a fitted + outline.

    +
  • +
  • +

    automatic grid-fitting

    + +

    Some formats simply include no control information with each + glyph outline, apart metrics like the advance width and height. It + is then up to the renderer to "guess" the more interesting features + of the outline in order to perform some decent grid-fitting.

    +
  • +
+ +

The following table summarises the pros and cons of each scheme.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ grid-fitting scheme +
+
+
+ advantages +
+
+
+ disadvantages +
+
+
+ explicit +
+
+

Quality. Excellent results at small sizes are possible. + This is very important for screen display.

+ +

Consistency. All renderers produce the same glyph + bitmaps.

+
+

Speed. Intepreting bytecode can be slow if the glyph + programs are complex.

+ +

Size. Glyph programs can be long.

+ +

Technicity. + It is extremely difficult to write good hinting + programs. Very few tools available.

+
+
+ implicit +
+
+

Size. Hints are usually much smaller than explicit glyph + programs.

+ +

Speed. + Grid-fitting is usually a fast process.

+
+

Quality. Often questionable at small sizes. Better with + anti-aliasing though.

+ +

Inconsistency. Results can vary between different + renderers, or even distinct versions of the same engine.

+
+
+ automatic +
+
+

Size. No need for control information, resulting in + smaller font files.

+ +

Speed. Depends on the grid-fitting algorithm. Usually + faster than explicit grid-fitting.

+
+

Quality. Often questionable at small sizes. Better with + anti-aliasing though.

+ +

Speed. Depends on the grid-fitting algorithm.

+ +

Inconsistency. Results can vary between different + renderers, or even distinct versions of the same engine.

+
+
+ +


+ +
+ + + + + + +
+ Previous + + Contents + + Next +
+
+ +
+
+ + + Index: xc/extras/freetype2/docs/glyphs/glyphs-3.html diff -u /dev/null xc/extras/freetype2/docs/glyphs/glyphs-3.html:1.1.1.1 --- /dev/null Mon Dec 18 14:22:27 2000 +++ xc/extras/freetype2/docs/glyphs/glyphs-3.html Fri Dec 8 16:26:13 2000 @@ -0,0 +1,430 @@ + + + + + + FreeType Glyph Conventions + + + + +

+ FreeType Glyph Conventions +

+ +

+ Version 2.1 +

+ +

+ Copyright 1998-2000 David Turner (david@freetype.org)
+ Copyright 2000 The FreeType Development Team (devel@freetype.org) +

+ +
+ + +
+ +
+ + + + + + +
+ Previous + + Contents + + Next +
+
+ +


+ + + +
+

+ III. Glyph metrics +

+
+ + +

+ 1. Baseline, pens and layouts +

+ +

The baseline is an imaginary line that is used to "guide" glyphs when + rendering text. It can be horizontal (e.g. Roman, Cyrillic, Arabic, + etc.) or vertical (e.g. Chinese, Japanese, Korean, etc). Moreover, to + render text, a virtual point, located on the baseline, called the pen + position or origin, is used to locate glyphs.

+ +

Each layout uses a different convention for glyph placement:

+ +
    +
  • +

    With horizontal layout, glyphs simply "rest" on the baseline. + Text is rendered by incrementing the pen position, either to the + right or to the left.

    + +

    The distance between two successive pen positions is + glyph-specific and is called the advance width. Note that + its value is always positive, even for right-to-left + oriented alphabets, like Arabic. This introduces some differences + in the way text is rendered.

    + +

    The pen position is always placed on the baseline.

    + +

    + horizontal layout +

    +
  • +
  • +

    With a vertical layout, glyphs are centered around the + baseline:

    + +

    + vertical layout +

    +
  • +
+ + +
+

+ 2. Typographic metrics and bounding boxes +

+ +

A various number of face metrics are defined for all glyphs in a + given font.

+ +
    +
  • +

    Ascent

    + +

    The distance from the baseline to the highest/upper grid + coordinate used to place an outline point. It is a positive value, + due to the grid's orientation with the Y axis + upwards.

    +
  • + +
  • +

    Descent

    + +

    The distance from the baseline to the lowest grid coordinate used + to place an outline point. This is a negative value, due to the + grid's orientation.

    +
  • + +
  • +

    Linegap

    + +

    The distance that must be placed between two lines of text. The + baseline-to-baseline distance should be computed as: + +

    + ascent - descent + linegap +

    + +

    if you use the typographic values.

    +
  • +
+ +

Other, simpler metrics are:

+ +
    +
  • +

    The glyph's bounding box, also called bbox

    + +

    This is an imaginary box that encloses all glyphs from the font, + usually as tightly as possible. It is represented by four fields, + namely xMin, yMin, xMax, and + yMax, that can be computed for any outline. Their values + can be in font units (if measured in the original outline) or in + fractional/integer pixel units (when measured on scaled + outlines).

    + +

    Note that if it wasn't for grid-fitting, you wouldn't need to + know a box's complete values, but only its dimensions to know how + big is a glyph outline/bitmap. However, correct rendering of hinted + glyphs needs the preservation of important grid alignment on each + glyph translation/placement on the baseline.

    +
  • + +
  • +

    Internal leading

    + +

    This concept comes directly from the world of traditional + typography. It represents the amount of space within the + leading which is reserved for glyph features that lay + outside of the EM square (like accentuation). It usually can be + computed as:

    + +

    + internal leading = ascent - descent - EM_size +

    +
  • + +
  • +

    External leading

    + +

    This is another name for the line gap.

    +
  • +
+ + +
+

+ 3. Bearings and Advances +

+ + Each glyph has also distances called bearings and + advances. Their definition is constant, but their values + depend on the layout, as the same glyph can be used to render text + either horizontally or vertically: + +
    +
  • +

    Left side bearing or bearingX

    + +

    The horizontal distance from the current pen position to the + glyph's left bbox edge. It is positive for horizontal layouts, and + in most cases negative for vertical one.

    +
  • + +
  • +

    Top side bearing or bearingY

    + +

    The vertical distance from the baseline to the top of the glyph's + bbox. It is usually positive for horizontal layouts, and negative + for vertical ones

    +
  • + +
  • +

    Advance width or advanceX

    + +

    The horizontal distance the pen position must be incremented (for + left-to-right writing) or decremented (for right-to-left writing) by + after each glyph is rendered when processing text. It is always + positive for horizontal layouts, and null for vertical ones.

    +
  • + +
  • +

    Advance height advanceY

    + +

    The vertical distance the pen position must be decremented by + after each glyph is rendered. It is always null for horizontal + layouts, and positive for vertical layouts.

    +
  • + +
  • +

    Glyph width

    + +

    The glyph's horizontal extent. For unscaled font coordinates, it + is bbox.xMax-bbox.xMin. For scaled glyphs, its computation + requests specific care, described in the grid-fitting chapter + below.

    +
  • + +
  • +

    Glyph height + +

    The glyph's vertical extent. For unscaled font coordinates, it is + bbox.yMax-bbox.yMin. For scaled glyphs, its computation + requests specific care, described in the grid-fitting chapter + below.

    +
  • + +
  • +

    Right side bearing

    + +

    Only used for horizontal layouts to describe the distance from + the bbox's right edge to the advance width. It is in most cases a + non-negative number:

    + +

    + advance_width - left_side_bearing - (xMax-xMin) +

    +
  • +
+ +

Here is a picture giving all the details for horizontal metrics: + +

+ horizontal glyph metrics +

+ +

And here is another one for the vertical metrics:

+ +

+ vertical glyph metrics +

+ + +
+

+ 4. The effects of grid-fitting +

+ +

Because hinting aligns the glyph's control points to the pixel grid, + this process slightly modifies the dimensions of character images in + ways that differ from simple scaling.

+ +

For example, the image of the lowercase "m" letter sometimes fits a + square in the master grid. However, to make it readable at small pixel + sizes, hinting tends to enlarge its scaled outline in order to keep its + three legs distinctly visible, resulting in a larger character + bitmap.

+ +

The glyph metrics are also influenced by the grid-fitting process: + +

    +
  • + The image's width and height are altered. Even if this is only by + one pixel, it can make a big difference at small pixel sizes. +
  • +
  • + The image's bounding box is modified, thus modifying the bearings. +
  • +
  • + The advances must be updated. For example, the advance width must + be incremented if the hinted bitmap is larger than the scaled one, + to reflect the augmented glyph width. +
  • +
+ +

This has some implications:

+ +
    +
  • + Because of hinting, simply scaling the font ascent or descent might + not give correct results. A possible solution is to keepthe ceiling + of the scaled ascent, and floor of the scaled descent. +
  • + +
  • + There is no easy way to get the hinted glyph and advance widths of a + range of glyphs, as hinting works differently on each outline. The + only solution is to hint each glyph separately and record the + returned values. Some formats, like TrueType, even include a table + of pre-computed values for a small set of common character pixel + sizes. +
  • +
  • + Hinting depends on the final character width and height in pixels, + which means that it is highly resolution-dependent. This property + makes correct WYSIWYG layouts difficult to implement. +
  • +
+ + + +

Performing 2D transformations on glyph outlines is very easy with + FreeType. However, when using translation on a hinted outlines, one + should aways take care of exclusively using integer pixel + distances (which means that the parameters to the + FT_Translate_Outline() API should all be multiples + of 64, as the point coordinates are in 26.6 fixed float + format).

+ +

Otherwise, the translation will simply ruin the hinter's + work, resulting in a very low quality bitmaps!

+
+ + +
+

+ 5. Text widths and bounding box +

+ +

As seen before, the "origin" of a given glyph corresponds to the + position of the pen on the baseline. It is not necessarily located on + one of the glyph's bounding box corners, unlike many typical bitmapped + font formats. In some cases, the origin can be out of the bounding box, + in others, it can be within it, depending on the shape of the given + glyph.

+ +

Likewise, the glyph's "advance width" is the increment to apply to + the pen position during layout, and is not related to the glyph's + "width", which really is the glyph's bounding width. + +

The same conventions apply to strings of text. This means that: + +

    +
  • + The bounding box of a given string of text doesn't necessarily + contain the text cursor, nor is the latter located on one of its + corners. +
  • + +
  • + The string's advance width isn't related to its bounding box + dimensions. Especially if it contains beginning and terminal spaces + or tabs. +
  • +
  • + Finally, additional processing like kerning creates strings of text + whose dimensions are not directly related to the simple + juxtaposition of individual glyph metrics. For example, the advance + width of "VA" isn't the sum of the advances of "V" and "A" taken + separately. +
  • +
+ +


+ +
+ + + + + + +
+ Previous + + Contents + + Next +
+
+ +
+
+ + + Index: xc/extras/freetype2/docs/glyphs/glyphs-4.html diff -u /dev/null xc/extras/freetype2/docs/glyphs/glyphs-4.html:1.1.1.1 --- /dev/null Mon Dec 18 14:22:27 2000 +++ xc/extras/freetype2/docs/glyphs/glyphs-4.html Fri Dec 8 16:26:13 2000 @@ -0,0 +1,231 @@ + + + + + + FreeType Glyph Conventions + + + + +

+ FreeType Glyph Conventions +

+ +

+ Version 2.1 +

+ +

+ Copyright 1998-2000 David Turner (david@freetype.org)
+ Copyright 2000 The FreeType Development Team (devel@freetype.org) +

+ +
+ + +
+ +
+ + + + + + +
+ Previous + + Contents + + Next +
+
+ +


+ + + +
+

+ IV. Kerning +

+
+ +

The term kerning refers to specific information used to + adjust the relative positions of coincident glyphs in a string of text. + This section describes several types of kerning information, as well as + the way to process them when performing text layout.

+ + + +

+ 1. Kerning pairs +

+ +

Kerning consists in modifying the spacing between two successive + glyphs according to their outlines. For example, a "T" and a "y" can be + easily moved closer, as the top of the "y" fits nicely under the upper + right bar of the "T".

+ +

When laying out text with only their standard widths, some + consecutive glyphs seem a bit too close or too distant. For example, + the space between the "A" and the "V" in the following word seems a + little wider than needed.

+ +

+ the word 'bravo' unkerned +

+ +

Compare this to the same word, where the distance between these two + letters has been slightly reduced:

+ +

+ the word 'bravo' with kerning +

+ +

As you can see, this adjustment can make a great difference. Some + font faces thus include a table containing kerning distances for a set + of given glyph pairs for text layout.

+ +
    +
  • +

    The pairs are ordered, i.e., the space for pair (A,V) isn't + necessarily the space for pair (V,A). They also index glyphs, and + not characters.

    +
  • +
  • +

    Kerning distances can be expressed in horizontal or vertical + directions, depending on layout and/or script. For example, some + horizontal layouts like Arabic can make use of vertical kerning + adjustments between successive glyphs. A vertical script can have + vertical kerning distances.

    +
  • +
  • +

    Kerning distances are expressed in grid units. They are usually + oriented in the X axis, which means that a negative + value indicates that two glyphs must be set closer in a horizontal + layout.

    +
  • +
+ + +
+

+ 2. Applying kerning +

+ +

Applying kerning when rendering text is a rather easy process. It + merely consists in adding the scaled kern distance to the pen position + before writing each next glyph. However, the typographically correct + renderer must take a few more details in consideration.

+ +

The "sliding dot" problem is a good example: Many font faces include + a kerning distance between capital letters like "T" or "F" and a + following dot ("."), in order to slide the latter glyph just right to + their main leg:

+ +

+ example for sliding dots +

+ +

This sometimes requires additional adjustments between the dot and + the letter following it, depending on the shapes of the enclosing + letters. When applying "standard" kerning adjustments, the previous + sentence would become:

+ +

+ example for too much kerning +

+ +

This is clearly too contracted. The solution here, as exhibited in + the first example, is to only slide the dots when possible. Of course, + this requires a certain knowledge of the text's meaning. The above + adjustments would not necessarily be welcome if we were rendering the + final dot of a given paragraph.This is only one example, and there are many others showing that a + real typographer is needed to layout text properly. If not available, + some kind of user interaction or tagging of the text could be used to + specify some adjustments, but in all cases, this requires some support + in applications and text libraries.

+ +

For more mundane and common uses, however, we can have a very simple + algorithm, which avoids the sliding dot problem, and others, though not + producing optimal results. It can be seen as

+ +
    +
  1. + Place the first glyph on the baseline. +
  2. +
  3. + Save the location of the pen position/origin in pen1. +
  4. +
  5. + Adjust the pen position with the kerning distance between the first + and second glyph. +
  6. +
  7. + Place the second glyph and compute the next pen position/origin in + pen2. +
  8. +
  9. + Use pen1 as the next pen position if it is beyond + pen2, use pen2 otherwise. +
  10. +
+ + +


+ +
+ + + + + + +
+ Previous + + Contents + + Next +
+
+ +
+
+ + + Index: xc/extras/freetype2/docs/glyphs/glyphs-5.html diff -u /dev/null xc/extras/freetype2/docs/glyphs/glyphs-5.html:1.1.1.1 --- /dev/null Mon Dec 18 14:22:28 2000 +++ xc/extras/freetype2/docs/glyphs/glyphs-5.html Fri Dec 8 16:26:13 2000 @@ -0,0 +1,484 @@ + + + + + + FreeType Glyph Conventions + + + + +

+ FreeType Glyph Conventions +

+ +

+ Version 2.1 +

+ +

+ Copyright 1998-2000 David Turner (david@freetype.org)
+ Copyright 2000 The FreeType Development Team (devel@freetype.org) +

+ +
+ + +
+ +
+ + + + + + +
+ Previous + + Contents + + Next +
+
+ +


+ + + +
+

+ V. Text processing +

+
+ +

This section demonstrates how to use the concepts previously defined + to render text, whatever the layout you use.

+ + + +

+ 1. Writing simple text strings +

+ +

In this first example, we will generate a simple string of Roman + text, i.e. with a horizontal left-to-right layout. Using exclusively + pixel metrics, the process looks like: + + +

    +
  1. + Convert the character string into a series of glyph + indices. +
  2. +
  3. + Place the pen to the cursor position. +
  4. +
  5. + Get or load the glyph image. +
  6. +
  7. + Translate the glyph so that its 'origin' matches the pen position. +
  8. +
  9. + Render the glyph to the target device. +
  10. +
  11. + Increment the pen position by the glyph's advance width in pixels. +
  12. +
  13. + Start over at step 3 for each of the remaining glyphs. +
  14. +
  15. + When all glyphs are done, set the text cursor to the new pen + position. +
  16. +
+ + +

Note that kerning isn't part of this algorithm.

+ + +
+

+ 2. Sub-pixel positioning +

+ +

It is somewhat useful to use sub-pixel positioning when rendering + text. This is crucial, for example, to provide semi-WYSIWYG text + layouts. Text rendering is very similar to the algorithm described in + subsection 1, with the following few differences:

+ +
+
+ + + Index: xc/extras/freetype2/docs/glyphs/glyphs-6.html diff -u /dev/null xc/extras/freetype2/docs/glyphs/glyphs-6.html:1.1.1.1 --- /dev/null Mon Dec 18 14:22:28 2000 +++ xc/extras/freetype2/docs/glyphs/glyphs-6.html Fri Dec 8 16:26:13 2000 @@ -0,0 +1,432 @@ + + + + + + FreeType Glyph Conventions + + + + +

+ FreeType Glyph Conventions +

+ +

+ Version 2.1 +

+ +

+ Copyright 1998-2000 David Turner (david@freetype.org)
+ Copyright 2000 The FreeType Development Team (devel@freetype.org) +

+ +
+ + +
+ +
+ + + + + + +
+ Previous + + Contents + + Next +
+
+ +


+ + + +
+

+ VI. FreeType outlines +

+
+ +

The purpose of this section is to present the way FreeType manages + vectorial outlines, as well as the most common operations that can be + applied on them.

+ + +

+ 1. FreeType outline description and structure +

+ +

+ a. Outline curve decomposition +

+ +

An outline is described as a series of closed contours in the 2D + plane. Each contour is made of a series of line segments and + Bézier arcs. Depending on the file format, these can be + second-order or third-order polynomials. The former are also called + quadratic or conic arcs, and they are used in the TrueType format. + The latter are called cubic arcs and are mostly used in the + Type 1 format.

+ +

Each arc is described through a series of start, end, and control + points. Each point of the outline has a specific tag which indicates + whether it is used to describe a line segment or an arc. The tags can + take the following values:

+ +
+ + + + + + + + + + + + + + + +
+ FT_Curve_Tag_On + +

Used when the point is "on" the curve. This corresponds to + start and end points of segments and arcs. The other tags specify + what is called an "off" point, i.e. a point which isn't located on + the contour itself, but serves as a control point for a + Bézier arc.

+
+ FT_Curve_Tag_Conic + +

Used for an "off" point used to control a conic Bézier + arc.

+
+ FT_Curve_Tag_Cubic + +

Used for an "off" point used to control a cubic Bézier + arc.

+
+
+ +

The following rules are applied to decompose the contour's points + into segments and arcs:

+ +
    +
  • + Two successive "on" points indicate a line segment joining them. +
  • +
  • + One conic "off" point amidst two "on" points indicates a conic + Bézier arc, the "off" point being the control point, and + the "on" ones the start and end points. +
  • +
  • + Two successive cubic "off" points amidst two "on" points indicate + a cubic Bézier arc. There must be exactly two cubic + control points and two "on" points for each cubic arc (using a + single cubic "off" point between two "on" points is forbidden, for + example). +
  • +
  • + Finally, two successive conic "off" points forces the rasterizer + to create (during the scan-line conversion process exclusively) a + virtual "on" point amidst them, at their exact middle. This + greatly facilitates the definition of successive conic + Bézier arcs. Moreover, it is the way outlines are + described in the TrueType specification. +
  • +
+ +

Note that it is possible to mix conic and cubic arcs in a single + contour, even though no current font driver produces such + outlines.

+ +
+ + + + + + + + + +
+ segment example + + conic arc example +
+ cubic arc example + + cubic arc with virtual 'on' point +
+
+ + +

+ b. Outline descriptor +

+ +

A FreeType outline is described through a simple structure:

+ +
+ + + + + + + + + + + + + + + + + + + + + + + +
+ FT_Outline +
+ n_points + + the number of points in the outline +
+ n_contours + + the number of contours in the outline +
+ points + + array of point coordinates +
+ contours + + array of contour end indices +
+ tags + + array of point flags +
+
+ +

Here, points is a pointer to an array of + FT_Vector records, used to store the vectorial coordinates of + each outline point. These are expressed in 1/64th of a pixel, which + is also known as the 26.6 fixed float format.

+ +

contours is an array of point indices used to delimit + contours in the outline. For example, the first contour always starts + at point 0, and ends at point contours[0]. The second + contour starts at point contours[0]+1 and ends at + contours[1], etc.

+ +

Note that each contour is closed, and that n_points should + be equal to contours[n_contours-1]+1 for a valid outline.

+ +

Finally, tags is an array of bytes, used to store each + outline point's tag.

+ + +
+

+ 2. Bounding and control box computations +

+ +

A bounding box (also called bbox) is simply a + rectangle that completely encloses the shape of a given outline. The + interesting case is the smallest bounding box possible, and in the + following we subsume this under the term "bounding box". Because of the + way arcs are defined, Bézier control points are not necessarily + contained within an outline's (smallest) bounding box.

+ +

This situation happens when one Bézier arc is, for example, + the upper edge of an outline and an "off" point happens to be above the + bbox. However, it is very rare in the case of character outlines + because most font designers and creation tools always place "on" points + at the extrema of each curved edges, as it makes hinting much + easier.

+ +

We thus define the control box (also called cbox) + as the smallest possible rectangle that encloses all points of a given + outline (including its "off" points). Clearly, it always includes the + bbox, and equates it in most cases.

+ +

Unlike the bbox, the cbox is much faster to compute.

+ +
+ + + + + +
+ a glyph with different bbox and cbox + + a glyph with identical bbox and cbox +
+
+ +

Control and bounding boxes can be computed automatically through the + functions FT_Get_Outline_CBox() and + FT_Get_Outline_BBox(). The former function is always very + fast, while the latter may be slow in the case of "outside" + control points (as it needs to find the extreme of conic and cubic arcs + for "perfect" computations). If this isn't the case, it is as fast as + computing the control box. + +

Note also that even though most glyph outlines have equal cbox and + bbox to ease hinting, this is not necessary the case anymore when a + transformation like rotation is applied to them.

+ + +
+

+ 3. Coordinates, scaling and grid-fitting +

+ +

An outline point's vectorial coordinates are expressed in the + 26.6 format, i.e. in 1/64th of a pixel, hence coordinates + (1.0,-2.5) is stored as the integer pair (x:64,y:-192).

+ +

After a master glyph outline is scaled from the EM grid to the + current character dimensions, the hinter or grid-fitter is in charge of + aligning important outline points (mainly edge delimiters) to the pixel + grid. Even though this process is much too complex to be described in a + few lines, its purpose is mainly to round point positions, while trying + to preserve important properties like widths, stems, etc.

+ +

The following operations can be used to round vectorial distances in + the 26.6 format to the grid:

+ +
+    round( x )   == ( x + 32 ) & -64
+    floor( x )   ==          x & -64
+    ceiling( x ) == ( x + 63 ) & -64
+ +

Once a glyph outline is grid-fitted or transformed, it often is + interesting to compute the glyph image's pixel dimensions before + rendering it. To do so, one has to consider the following:

+ +

The scan-line converter draws all the pixels whose centers + fall inside the glyph shape. It can also detect drop-outs, + i.e. discontinuities coming from extremely thin shape fragments, in + order to draw the "missing" pixels. These new pixels are always located + at a distance less than half of a pixel but it is not easy to predict + where they will appear before rendering.

+ +

This leads to the following computations:

+ +
    +
  • +

    compute the bbox

    +
  • +
  • +

    grid-fit the bounding box with the following:

    + +
    +    xmin = floor( bbox.xMin )
    +    xmax = ceiling( bbox.xMax )
    +    ymin = floor( bbox.yMin )
    +    ymax = ceiling( bbox.yMax )
    +
  • +
  • + return pixel dimensions, i.e. + +
    +    width = (xmax - xmin)/64
    + + and + +
    +    height = (ymax - ymin)/64
    +
  • +
+ +

By grid-fitting the bounding box, it is guaranteed that all the pixel + centers that are to be drawn, including those coming from drop-out + control, will be within the adjusted box. Then the box's + dimensions in pixels can be computed.

+ +

Note also that, when translating a grid-fitted outline, one should + always use integer distances to move an outline in the 2D + plane. Otherwise, glyph edges won't be aligned on the pixel grid + anymore, and the hinter's work will be lost, producing very low + quality bitmaps and pixmaps.

+ + +


+ +
+ + + + + + +
+ Previous + + Contents + + Next +
+
+ +
+
+ + + Index: xc/extras/freetype2/docs/glyphs/glyphs-7.html diff -u /dev/null xc/extras/freetype2/docs/glyphs/glyphs-7.html:1.1.1.1 --- /dev/null Mon Dec 18 14:22:28 2000 +++ xc/extras/freetype2/docs/glyphs/glyphs-7.html Fri Dec 8 16:26:13 2000 @@ -0,0 +1,356 @@ + + + + + + FreeType Glyph Conventions + + + + +

+ FreeType Glyph Conventions +

+ +

+ Version 2.1 +

+ +

+ Copyright 1998-2000 David Turner (david@freetype.org)
+ Copyright 2000 The FreeType Development Team (devel@freetype.org) +

+ +
+ + +
+ +
+ + + + + + +
+ Previous + + Contents + +   +
+
+ +


+ + + +
+

+ VII. FreeType bitmaps +

+
+ +

The purpose of this section is to present the way FreeType manages + bitmaps and pixmaps, and how they relate to the concepts previously + defined. The relationships between vectorial and pixel coordinates is + explained.

+ + + +

+ 1. Vectorial versus pixel coordinates +

+ +

This sub-section explains the differences between vectorial and pixel + coordinates. To make things clear, brackets will be used to describe + pixel coordinates, e.g. [3,5], while parentheses will be used for + vectorial ones, e.g. (-2,3.5).

+ +

In the pixel case, as we use the Y upwards convention; + the coordinate [0,0] always refers to the lower left pixel of a + bitmap, while coordinate [width-1, rows-1] to its upper right + pixel.

+ +

In the vectorial case, point coordinates are expressed in floating + units, like (1.25, -2.3). Such a position doesn't refer to a given + pixel, but simply to an immaterial point in the 2D plane.

+ +

The pixels themselves are indeed square boxes of the 2D + plane, whose centers lie in half pixel coordinates. For example, the + lower left pixel of a bitmap is delimited by the square (0,0)-(1,1), its + center being at location (0.5,0.5).

+ +

This introduces some differences when computing distances. For + example, the length in pixels of the line [0,0]-[10,0] is 11. + However, the vectorial distance between (0,0)-(10,0) covers exactly + 10 pixel centers, hence its length is 10.

+ +
+ bitmap and vector grid +
+ + +
+

+ 2. FreeType bitmap and pixmap descriptor +

+ +

A bitmap or pixmap is described through a single structure, called + FT_Bitmap, defined in the file + <freetype/ftimage.h>. It is a simple descriptor whose + fields are:

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ FT_Bitmap +
+ rows + + the number of rows, i.e. lines, in the bitmap +
+ width + + the number of horizontal pixels in the bitmap +
+ pitch + + its absolute value is the number of bytes per bitmap line; it can + be either positive or negative depending on the bitmap's vertical + orientation +
+ buffer + + a typeless pointer to the bitmap pixel bufer +
+ pixel_mode + + an enumeration used to describe the pixel format of the bitmap; + examples are ft_pixel_mode_mono for 1-bit monochrome + bitmaps and ft_pixel_mode_grays for 8-bit anti-aliased + "gray" values +
+ num_grays + + this is only used for "gray" pixel modes, it gives the number of + gray levels used to describe the anti-aliased gray levels -- + 256 by default with FreeType 2 +
+
+ + +

Note that the sign of the pitch fields determines whether + the rows in the pixel buffer are stored in ascending or descending + order.

+ +

Remember that FreeType uses the Y upwards convention in + the 2D plane, which means that a coordinate of (0,0) always refer to the + lower-left corner of a bitmap.

+ +

If the pitch is positive, the rows are stored in decreasing vertical + position; the first bytes of the pixel buffer are part of the + upper bitmap row.

+ +

On the opposite, if the pitch is negative, the first bytes of the + pixel buffer are part of the lower bitmap row.

+ +

In all cases, one can see the pitch as the byte increment needed to + skip to the next lower scanline in a given bitmap buffer.

+ +
+ + + + + +
+ negative 'pitch' + + positive 'pitch' +
+
+ +

The "positive pitch" convention is very often used, though + some systems might need the other.

+ + +
+

+ 3. Converting outlines into bitmaps and pixmaps +

+ +

Generating a bitmap or pixmap image from a vectorial image is easy + with FreeType. However, one must understand a few points regarding the + positioning of the outline in the 2D plane before converting it to a + bitmap:

+ +
    +
  • +

    The glyph loader and hinter always places the outline in the 2D + plane so that (0,0) matches its character origin. This means that + the glyph's outline, and corresponding bounding box, can be placed + anywhere in the 2D plane (see the graphics in section III).

    +
  • +
  • +

    The target bitmap's area is mapped to the 2D plane, with its + lower left corner at (0,0). This means that a bitmap or pixmap of + dimensions [w,h] will be mapped to a 2D rectangle window + delimited by (0,0)-(w,h).

    +
  • +
  • +

    When scan-converting the outline, everything that falls within + the bitmap window is rendered, the rest is ignored.

    +
  • + +

    A common mistake made by many developers when they begin using + FreeType is believing that a loaded outline can be directly rendered + in a bitmap of adequate dimensions. The following images illustrate + why this is a problem.

    + +
      +
    • + The first image shows a loaded outline in the 2D plane. +
    • +
    • + The second one shows the target window for a bitmap of arbitrary + dimensions [w,h]. +
    • +
    • + The third one shows the juxtaposition of the outline and window in + the 2D plane. +
    • +
    • + The last image shows what will really be rendered in the bitmap. +
    • +
    + +
    + clipping algorithm +
    +
+ +

Indeed, in nearly all cases, the loaded or transformed outline must + be translated before it is rendered into a target bitmap, in order to + adjust its position relative to the target window.

+ +

For example, the correct way of creating a standalone glyph + bitmap is as follows

+ +
    +
  • +

    Compute the size of the glyph bitmap. It can be computed + directly from the glyph metrics, or by computing its bounding box + (this is useful when a transformation has been applied to the + outline after the load, as the glyph metrics are not valid + anymore).

    +
  • +
  • +

    Create the bitmap with the computed dimensions. Don't forget to + fill the pixel buffer with the background color.

    +
  • +
  • +

    Translate the outline so that its lower left corner matches + (0,0). Don't forget that in order to preserve hinting, one should + use integer, i.e. rounded distances (of course, this isn't required + if preserving hinting information doesn't matter, like with rotated + text). Usually, this means translating with a vector + (-ROUND(xMin), -ROUND(yMin)).

    +
  • +
  • +

    Call the rendering function (it can be + FT_Outline_Render() for example).

    +
  • +
+ +

In the case where one wants to write glyph images directly into a + large bitmap, the outlines must be translated so that their vectorial + position correspond to the current text cursor/character origin.

+ +


+ +
+ + + + + + +
+ Previous + + Contents + +   +
+
+ +
+
+ + + Index: xc/extras/freetype2/docs/glyphs/index.html diff -u /dev/null xc/extras/freetype2/docs/glyphs/index.html:1.1.1.1 --- /dev/null Mon Dec 18 14:22:28 2000 +++ xc/extras/freetype2/docs/glyphs/index.html Fri Dec 8 16:26:13 2000 @@ -0,0 +1,200 @@ + + + + + + FreeType Glyph Conventions + + + + +

+ FreeType Glyph Conventions +

+ +

+ Version 2.1 +

+ +

+ Copyright 1998-2000 David Turner (david@freetype.org)
+ Copyright 2000 The FreeType Development Team (devel@freetype.org) +

+ + +
+ + +
+ +

This document presents the core conventions used within the FreeType + library to manage font and glyph data. It is a must-read for all + developers who need to understand digital typography, especially if you + want to use the FreeType 2 library in your projects.

+ + + + + +
+

+ Table of Contents +

+
+ +
+ + +
+ +

+ I. Basic Typographic Concepts +

+
+

+ 1. Font files, format and + information +
+ + 2. Character images and mappings +
+ + 3. Character and font metrics +
+

+
+ +

+ II. Glyph outlines +

+
+

+ 1. Pixels, points and device + resolutions +
+ + 2. Vectorial representation +
+ + 3. Hinting and bitmap rendering +
+

+
+ +

+ III. Glyph metrics +

+
+

+ 1. Baseline, pens and layouts +
+ + 2. Typographic metrics and + bounding boxes +
+ + 3. Bearings and advances +
+ + 4. The effects of grid-fitting +
+ + 5. Text widths and bounding box +
+

+
+ +

+ IV. Kerning +

+
+

+ 1. Kerning pairs +
+ + 2. Applying kerning +
+

+
+ +

+ V. Text processing +

+
+

+ 1. Writing simple text strings +
+ + 2. Sub-pixel positioning +
+ + 3. Simple kerning +
+ + 4. Right-to-left layouts +
+ + 5. Vertical layouts +
+ + 6. WYSIWYG text layouts +
+

+
+ +

+ VI. FreeType Outlines +

+
+

+ 1. FreeType outline description + and structure +
+ + 2. Bounding and control box + computations +
+ + 3. Coordinates, scaling, and + grid-fitting +
+

+
+ +

+ VII. FreeType bitmaps +

+
+

+ 1. Vectorial versus pixel + coordinates +
+ + 2. FreeType bitmap and pixmap + descriptor +
+ + 3. Converting outlines into + bitmaps and pixmaps +
+

+
+ +
+
+ +
+
+ + + Index: xc/extras/freetype2/docs/tutorial/step1.html diff -u /dev/null xc/extras/freetype2/docs/tutorial/step1.html:1.1.1.1 --- /dev/null Mon Dec 18 14:22:29 2000 +++ xc/extras/freetype2/docs/tutorial/step1.html Fri Dec 8 16:26:14 2000 @@ -0,0 +1,954 @@ + + + + + + FreeType 2 Tutorial + + + + +

+ FreeType 2.0 Tutorial
+ Step 1 -- simple glyph loading +

+ +

+ © 2000 David Turner + (david@freetype.org)
+ © 2000 The FreeType Development Team + (www.freetype.org) +

+ +
+ + +
+ +
+ +

+ Introduction +

+ +

This is the first part of the FreeType 2 tutorial. It will + teach you to do the following:

+ +
    +
  • initialize the library
  • +
  • open a font file by creating a new face object
  • +
  • select a character size in points or in pixels
  • +
  • load a single glyph image and convert it to a bitmap
  • +
  • render a very simple string of text
  • +
  • render a rotated string of text easily
  • +
+ +
+ +

+ 1. Header files +

+ +

To include the main FreeType header file, say

+ + +
+    #include <freetype/freetype.h>
+
+ +

in your application code. Note that other files are available in the + FreeType include directory, most of them being included by + freetype.h and other (internal) files. Some of them will be + described later in this tutorial.

+ +
+ +

+ 2. Initialize the library +

+ +

Simply create a variable of type FT_Library named, for + example, library, and call the function + FT_Init_FreeType() as in

+ + +
+    #include <freetype/freetype.h>
+
+    FT_Library  library;
+
+    ...
+
+    {
+      ...
+      error = FT_Init_FreeType( &library );
+      if ( error )
+      {
+        ... an error occurred during library initialization ...
+      }
+    }
+
+ +

This function is in charge of the following:

+ +
    +
  • + Creating a new instance of the FreeType 2 library, and set the + handle library to it. +
  • +
  • + Load each module that FreeType knows about in the library. This + means that by default, your new library object is able to + handle TrueType, Type 1, Windows FON, CID-keyed & OpenType/CFF + fonts gracefully. +
  • +
+ +

As you can see, the function returns an error code, like most others + in the FreeType API. An error code of 0 always means that + the operation was successful; otherwise, the value describes the error, + and library is set to NULL.

+ +
+ +

+ 3. Load a font face +

+ +

+ a. From a font file +

+ +

Create a new face object by calling + FT_New_Face(). A face describes a given typeface + and style. For example, "Times New Roman Regular" and "Times New + Roman Italic" correspond to two different faces.

+ + +
+    FT_Library  library;   /* handle to library     */
+    FT_Face     face;      /* handle to face object */
+
+
+    error = FT_Init_FreeType( &library );
+    if ( error ) { ... }
+
+    error = FT_New_Face( library,
+                         "/usr/share/fonts/truetype/arial.ttf",
+                         0,
+                         &face );
+    if ( error == FT_Err_Unknown_File_Format )
+    {
+      ... the font file could be opened and read, but it appears
+      ... that its font format is unsupported
+    }
+    else if ( error )
+    {
+      ... another error code means that the font file could not
+      ... be opened or read, or that it is broken
+    }
+
+ +

As you can certainly imagine, FT_New_Face() opens a font + file, then tries to extract one face from it. Its parameters are

+ + + + + + + + + + + + + + + + + + +
+ library + +

A handle to the FreeType library instance where the face + object is created

+
+ filepathname + +

The font file pathname (a standard C string).

+
+ face_index + +

Certain font formats allow several font faces to be embedded + in a single file.

+ +

This index tells which face you want to load. An error will + be returned if its value is too large.

+ +

Index 0 always work though.

+
+ face + +

A pointer to the handle that will be set to describe + the new face object.

+ +

It is set to NULL in case of error.

+
+ +

To know how many faces a given font file contains, load its first + face (use face_index=0), then check the value of + face->num_faces which indicates how many faces are embedded + in the font file.

+ +

+ b. From memory +

+ +

In the case where you have already loaded the font file in memory, + you can similarly create a new face object for it by calling + FT_New_Memory_Face() as in

+ + +
+    FT_Library  library;   /* handle to library     */
+    FT_Face     face;      /* handle to face object */
+
+
+    error = FT_Init_FreeType( &library );
+    if ( error ) { ... }
+
+    error = FT_New_Memory_Face( library,
+                                buffer,    /* first byte in memory */
+                                size,      /* size in bytes        */
+                                0,         /* face_index           */
+                                &face );
+    if ( error ) { ... }
+
+ +

As you can see, FT_New_Memory_Face() takes a pointer to + the font file buffer and its size in bytes instead of a file pathname. + Other than that, it has exactly the same semantics as + FT_New_Face().

+ +

+ c. From other sources (compressed files, network, etc.) +

+ +

There are cases where using a file pathname or preloading the file + in memory is not sufficient. With FreeType 2, it is possible to + provide your own implementation of I/O routines.

+ +

This is done through the FT_Open_Face() function, which + can be used to open a new font face with a custom input stream, select + a specific driver for opening, or even pass extra parameters to the + font driver when creating the object. We advise you to refer to the + FreeType 2 API reference in order to learn how to use it.

+ +

Note that providing a custom stream might also be used to access a + TrueType font embedded in a Postscript Type 42 wrapper.

+ +
+ +

+ 4. Accessing face contents +

+ +

A face object models all information that globally describes + the face. Usually, this data can be accessed directly by dereferencing + a handle, like

+ + + + + + + + + + + + + + + + + + + + + + +
+ face->num_glyphs + +

Gives the number of glyphs available in the font face. + A glyph is simply a character image. It doesn't necessarily + correspond to a character code though.

+
+ face->flags + +

A 32-bit integer containing bit flags used to describe some + face properties. For example, the flag + FT_FACE_FLAG_SCALABLE is used to indicate that the face's + font format is scalable and that glyph images can be rendered for + all character pixel sizes. For more information on face flags, + please read the FreeType 2 API Reference.

+
+ face->units_per_EM + +

This field is only valid for scalable formats (it is set + to 0 otherwise). It indicates the number of font units + covered by the EM.

+
+ face->num_fixed_sizes + +

This field gives the number of embedded bitmap strikes + in the current face. A strike is a series of glyph + images for a given character pixel size. For example, a font face + could include strikes for pixel sizes 10, 12 and 14. Note + that even scalable font formats can have embedded bitmap + strikes!

+
+ face->fixed_sizes + +

This is a pointer to an array of FT_Bitmap_Size + elements. Each FT_Bitmap_Size indicates the horizontal + and vertical pixel sizes for each of the strikes that are + present in the face.

+
+ +

For a complete listing of all face properties and fields, please read + the FreeType 2 API Reference.

+ +


+ +

+ 5. Setting the current pixel size +

+ +

FreeType 2 uses size objects to model all information + related to a given character size for a given face. For example, a size + object will hold the value of certain metrics like the ascender or text + height, expressed in 1/64th of a pixel, for a character size of + 12 points.

+ +

When the FT_New_Face() function is called (or one of its + cousins), it automatically creates a new size object for the + returned face. This size object is directly accessible as + face->size.

+ +

A single face object can deal with one or more size objects at a + time; however, this is something that few programmers really need to do. + We have thus have decided to simplify the API for the most common use + (i.e. one size per face), while keeping this feature available through + additional functions.

+ +

When a new face object is created, its size object defaults to the + character size of 10 pixels (both horizontally and vertically) for + scalable formats. For fixed-sizes formats, the size is more or less + undefined, which is why you must set it before trying to load a + glyph.

+ +

To do that, simply call FT_Set_Char_Size(). Here is an + example where the character size is set to 16pt for a 300x300 dpi + device:

+ + +
+    error = FT_Set_Char_Size(
+              face,    /* handle to face object           */
+              0,       /* char_width in 1/64th of points  */
+              16 * 64, /* char_height in 1/64th of points */
+              300,     /* horizontal device resolution    */
+              300 );   /* vertical device resolution      */
+
+ +

You will notice that

+ +
    +
  • + The character width and heights are specified in 1/64th of points. + A point is a physical distance, equaling 1/72th of an inch; + it is not a pixel. +
  • +
  • + Horizontal and vertical device resolutions are expressed in + dots-per-inch, or dpi. You can use 72 or + 96 dpi for display devices like the screen. The resolution is + used to compute the character pixel size from the character point + size. +
  • +
  • + A value of 0 for the character width means same as + character height, a value of 0 for the character height + means same as character width. Otherwise, it is possible + to specify different char widths and heights. +
  • +
  • + Using a value of 0 for the horizontal or vertical resolution + means 72 dpi, which is the default. +
  • +
  • + The first argument is a handle to a face object, not a size object. + This behaviour must be seen as a convenience. +
  • +
+ +

This function computes the character pixel size that corresponds to + the character width and height and device resolutions. However, if you + want to specify the pixel sizes yourself, you can simply call + FT_Set_Pixel_Sizes(), as in

+ + +
+    error = FT_Set_Pixel_Sizes(
+              face,   /* handle to face object */
+              0,      /* pixel_width           */
+              16 );   /* pixel_height          */
+
+ +

This example will set the character pixel sizes to 16x16 pixels. + As previously, a value of 0 for one of the dimensions means + same as the other.

+ +

Note that both functions return an error code. Usually, an error + occurs with a fixed-size font format (like FNT or PCF) when trying to + set the pixel size to a value that is not listed in the + face->fixed_sizes array.

+ +
+ +

+ 6. Loading a glyph image +

+ +

+ a. Converting a character code into a glyph index +

+ +

Usually, an application wants to load a glyph image based on its + character code, which is a unique value that defines the + character for a given encoding. For example, the character + code 65 in ASCII encoding represents letter `A'.

+ +

A face object contains one or more tables, called + charmaps, that are used to convert character codes to glyph + indices. For example, most TrueType fonts contain two charmaps. One + is used to convert Unicode character codes to glyph indices, the other + is used to convert Apple Roman encoding into glyph indices. Such + fonts can then be used either on Windows (which uses Unicode) and + Macintosh (which uses Apple Roman usually). Note also that a given + charmap might not map to all the glyphs present in the font.

+ +

By default, when a new face object is created, it 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.

+ +

We will describe later how to look for specific charmaps in a face. + For now, we will assume that the face contains at least a Unicode + charmap that was selected during FT_New_Face(). To convert a + Unicode character code to a font glyph index, we use + FT_Get_Char_Index() as in

+ + +
+    glyph_index = FT_Get_Char_Index( face, charcode );
+
+ +

This will look up the glyph index corresponding to the given + charcode in the charmap that is currently selected for the + face. + +

Note that this is one of the rare FreeType functions that do not + return an error code. If a given character code has no glyph image in + the face, the value 0 is returned. By convention, it always + corresponds to a special glyph image called the missing + glyph, which usually is represented as a box or a space.

+ +

+ b. Loading a glyph from the face +

+ +

Once you have a glyph index, you can load the corresponding glyph + image. The latter can be stored in various formats within the font + file. For fixed-size formats like FNT or PCF, each image is a bitmap. + Scalable formats like TrueType or Type 1 use vectorial shapes, + named outlines, to describe each glyph. Some formats may have + even more exotic ways of representing glyphs (e.g. MetaFont). + Fortunately, FreeType 2 is flexible enough to support any kind of + glyph format through a simple API.

+ +

The glyph image is always stored in a special object called a + glyph slot. As its name suggests, a glyph slot is a + container that is able to hold one glyph image at a time, be it a + bitmap, an outline, or something else. Each face object has a single + glyph slot object that can be accessed as face->glyph.

+ +

Loading a glyph image into the slot is performed by calling + FT_Load_Glyph() as in

+ + +
+    error = FT_Load_Glyph(
+              face,          /* handle to face object */
+              glyph_index,   /* glyph index           */
+              load_flags );  /* load flags, see below */
+
+ +

The load_flags value is a set of bit flags used to + indicate some special operations. The default value + FT_LOAD_DEFAULT is 0.

+ +

This function will try to load the corresponding glyph image from + the face. Basically, this means that

+ +
    +
  • +

    If a bitmap is found for the corresponding glyph and pixel + size, it will be loaded into the slot. Embedded bitmaps are + always favored over native image formats, because we assume that + they are higher-quality versions of the same glyph. This can be + changed by using the FT_LOAD_NO_BITMAP flag.

    +
  • +
  • +

    Otherwise, a native image for the glyph will be loaded. It + will also be scaled to the current pixel size as well as hinted + for certain formats like TrueType and Type 1.

    +
  • +
+ +

The field glyph->format describes the format used to store + the glyph image in the slot. If it is not + ft_glyph_format_bitmap, it is possible to immedialy convert + it to a bitmap through FT_Render_Glyph(), as in

+ + +
+   error = FT_Render_Glyph(
+             face->glyph,      /* glyph slot  */
+             render_mode );    /* render mode */
+
+ +

The parameter render_mode specifies how to render the + glyph image. Set it ft_render_mode_normal to render a + high-quality anti-aliased (256 gray levels) bitmap. You can + alternatively use ft_render_mode_mono if you want to generate + a 1-bit monochrome bitmap.

+ +

Once you have a bitmapped glyph image, you can access it directly + through glyph->bitmap (a simple bitmap descriptor), and + position it with glyph->bitmap_left and + glyph->bitmap_top.

+ +

Note that bitmap_left is the horizontal distance from the + current pen position to the left-most border of the glyph bitmap, + while bitmap_top is the vertical distance from the pen + position (on the baseline) to the top-most border of the glyph bitmap. + It is positive to indicate an upwards distance.

+ +

The second part of the tutorial describes the contents of a glyph + slot and how to access specific glyph information (including + metrics).

+ +

+ c. Using other charmaps +

+ +

As said before, when a new face object is created, it will look for + a Unicode, Latin-1, or ASCII charmap and select it. The currently + selected charmap is accessed via face->charmap. This field + is NULL if no charmap is selected, which typically happens + when you create a new FT_Face object from a font file that + doesn't contain an ASCII, Latin-1, or Unicode charmap (rare + stuff).

+ +

There are two ways to select a different charmap with + FreeType 2. The easiest is if the encoding you need already has + a corresponding enumeration defined in freetype/freetype.h, + as ft_encoding_big5. In this case, you can simply call + FT_Select_CharMap() as in

+ +
+    error = FT_Select_CharMap(
+              face,                 /* target face object */
+              ft_encoding_big5 );   /* encoding           */
+
+ +

Another way is to manually parse the list of charmaps for the face; + this is accessible through the fields num_charmaps and + charmaps (notice the final 's') of the face object. As + expected, the first is the number of charmaps in the face, while the + second is a table of pointers to the charmaps embedded in the + face.

+ +

Each charmap has a few visible fields used to describe it more + precisely. Mainly, one will look at charmap->platform_id and + charmap->encoding_id which define a pair of values that can + be used to describe the charmap in a rather generic way.

+ +

Each value pair corresponds to a given encoding. For example, the + pair (3,1) corresponds to Unicode (on the Windows platform). A list + of such pairs is defined in the TrueType specification, but you can + also use the file <freetype/ttnameid.h> which defines + several helpful constants to deal with them.

+ +

Note that some pid/eid pairs are artificial; such values + have been created by FreeType to identify platforms resp. encodings + not covered by the original TrueType specification.

+ +

To look up a specific encoding you need to find a corresponding + value pair in the specification, then look for it in the + charmaps list. Bear in mind that some encodings correspond + to several values pairs (yes, it's a real mess, but blame Apple and + Microsoft on such stupidity). Here some code to do it:

+ + +
+    FT_CharMap  found = 0;
+    FT_CharMap  charmap;
+    int         n;
+
+
+    for ( n = 0; n < face->num_charmaps; n++ )
+    {
+      charmap = face->charmaps[n];
+      if ( charmap->platform_id == my_platform_id &&
+           charmap->encoding_id == my_encoding_id )
+      {
+        found = charmap;
+        break;
+      }
+    }
+
+    if ( !found ) { ... }
+
+    /* now, select the charmap for the face object */
+    error = FT_Set_CharMap( face, found );
+    if ( error ) { ... }
+
+ +

Once a charmap has been selected, either through + FT_Select_CharMap() or FT_Set_CharMap(), it is used + by all subsequent calls to FT_Get_Char_Index().

+ +

+ d. Glyph transformations +

+ +

It is possible to specify an affine transformation to be applied to + glyph images when they are loaded. Of course, this will only work for + scalable (vectorial) font formats.

+ +

To do that, simply call FT_Set_Transform(), as in

+ + +
+    error = FT_Set_Transform(
+              face,       /* target face object    */
+              &matrix,    /* pointer to 2x2 matrix */
+              &delta );   /* pointer to 2d vector  */
+
+ +

This function will set the current transformation for a given face + object. Its second parameter is a pointer to an FT_Matrix + structure that describes a 2x2 affine matrix. The third + parameter is a pointer to an FT_Vector structure that + describes a simple 2d vector that is used to translate the glyph + image after the 2x2 transformation.

+ +

Note that the matrix pointer can be set to NULL, in which + case the identity transformation will be used. Coefficients of the + matrix are otherwise in 16.16 fixed float units.

+ +

The vector pointer can also be set to NULL in which case a + delta vector of (0,0) will be used. The vector coordinates are + expressed in 1/64th of a pixel (also known as 26.6 fixed floats).

+ +

The transformation is applied to every glyph that is loaded + through FT_Load_Glyph() and is completely independent of + any hinting process. This means that you won't get the same + results if you load a glyph at the size of 24 pixels, or a glyph + at the size at 12 pixels scaled by 2 through a + transformation, because hints will have been computed differently + (unless hints have been disabled, of course).

+ +

If you ever need to use a non-orthogonal transformation with + optimal hints, you first need to decompose your transformation into a + scaling part and a rotation/shearing part. Use the scaling part to + compute a new character pixel size, then the other one to call + FT_Set_Transform(). This is explained in details in a later + section of this tutorial.

+ +

Note also that loading a glyph bitmap with a non-identity + transformation will produce an error.

+ +
+ +

+ 7. Simple text rendering +

+ +

We will now present a very simple example used to render a string of + 8-bit Latin-1 text, assuming a face that contains a Unicode charmap

+ +

The idea is to create a loop that will, on each iteration, load one + glyph image, convert it to an anti-aliased bitmap, draw it on the target + surface, then increment the current pen position.

+ +

+ a. basic code +

+ +

The following code performs our simple text rendering with the + functions previously described.

+ + +
+    FT_GlyphSlot  slot = face->glyph;  /* a small shortcut */
+    int           pen_x, pen_y, n;
+
+
+    .. initialize library ..
+    .. create face object ..
+    .. set character size ..
+
+    pen_x = 300;
+    pen_y = 200;
+
+    for ( n = 0; n < num_chars; n++ )
+    {
+      FT_UInt  glyph_index;
+
+
+      /* retrieve glyph index from character code */
+      glyph_index = FT_Get_Char_Index( face, text[n] );
+
+      /* load glyph image into the slot (erase previous one) */
+      error = FT_Load_Glyph( face, glyph_index, FT_LOAD_DEFAULT );
+      if ( error ) continue;  /* ignore errors */
+
+      /* convert to an anti-aliased bitmap */
+      error = FT_Render_Glyph( face->glyph, ft_render_mode_normal );
+      if ( error ) continue;
+
+      /* now, draw to our target surface */
+      my_draw_bitmap( &slot->bitmap,
+                      pen_x + slot->bitmap_left,
+                      pen_y - slot->bitmap_top );
+
+      /* increment pen position */
+      pen_x += slot->advance.x >> 6;
+      pen_y += slot->advance.y >> 6;   /* not useful for now */
+    }
+
+ +

This code needs a few explanations:

+ +
    +
  • + We define a handle named slot that points to the face + object's glyph slot. (The type FT_GlyphSlot is a + pointer.) This is a convenience to avoid using + face->glyph->XXX every time. +
  • +
  • + We increment the pen position with the vector + slot->advance, which corresponds to the glyph's + advance width (also known as its escapement). + The advance vector is expressed in 1/64th of pixels, and is + truncated to integer pixels on each iteration. +
  • +
  • + The function my_draw_bitmap() is not part of FreeType but + must be provided by the application to draw the bitmap to the + target surface. In this example, it takes a pointer to an + FT_Bitmap descriptor and the position of its top-left + corner as arguments. +
  • +
  • + The value of slot->bitmap_top is positive for an + upwards vertical distance. Assuming that the coordinates + taken by my_draw_bitmap() use the opposite convention + (increasing Y corresponds to downwards scanlines), we substract it + to pen_y instead of adding it. +
  • +
+ +

b. refined code

+ +

The following code is a refined version of the example above. It + uses features and functions of FreeType 2 that have not yet been + introduced, and which will be explained below.

+ + +
+    FT_GlyphSlot  slot = face->glyph;  /* a small shortcut */
+    FT_UInt       glyph_index;
+    int           pen_x, pen_y, n;
+
+
+    .. initialize library ..
+    .. create face object ..
+    .. set character size ..
+
+    pen_x = 300;
+    pen_y = 200;
+
+    for ( n = 0; n < num_chars; n++ )
+    {
+      /* load glyph image into the slot (erase previous one) */
+      error = FT_Load_Char( face, text[n], FT_LOAD_RENDER );
+      if ( error ) continue;  /* ignore errors */
+
+      /* now, draw to our target surface */
+      my_draw_bitmap( &slot->bitmap,
+                      pen_x + slot->bitmap_left,
+                      pen_y - slot->bitmap_top );
+
+      /* increment pen position */
+      pen_x += slot->advance.x >> 6;
+    }
+
+ +

We have reduced the size of our code, but it does exactly the same + thing.

+ +
    +
  • +

    We use the function FT_Load_Char() instead of + FT_Load_Glyph(). As you probably imagine, it is + equivalent to calling FT_Get_Char_Index() followed by + FT_Get_Load_Glyph().

    +
  • +
  • +

    We do not use FT_LOAD_DEFAULT for the loading mode but + the bit flag FT_LOAD_RENDER. It indicates that the glyph + image must be immediately converted to an anti-aliased bitmap. + This is of course a shortcut that avoids calling + FT_Render_Glyph() explicitly but is strictly + equivalent.

    + +

    Note that you can also specify that you want a monochrome + bitmap by using the FT_LOAD_MONOCHROME load flag + instead.

    +
  • +
+ +

c. more advanced rendering

+ +

We now render transformed text (for example through a rotation). + To do that we use FT_Set_Transform():

+ + +
+    FT_GlyphSlot  slot = face->glyph;  /* a small shortcut */
+    FT_Matrix     matrix;              /* transformation matrix */
+    FT_UInt       glyph_index;
+    FT_Vector     pen;                 /* untransformed origin */
+    int           n;
+
+
+    .. initialize library ..
+    .. create face object ..
+    .. set character size ..
+
+    /* set up matrix */
+    matrix.xx = (FT_Fixed)( cos( angle ) * 0x10000L );
+    matrix.xy = (FT_Fixed)(-sin( angle ) * 0x10000L );
+    matrix.yx = (FT_Fixed)( sin( angle ) * 0x10000L );
+    matrix.yy = (FT_Fixed)( cos( angle ) * 0x10000L );
+
+    /* the pen position in 26.6 cartesian space coordinates */
+    pen.x = 300 * 64;
+    pen.y = ( my_target_height - 200 ) * 64;
+
+    for ( n = 0; n < num_chars; n++ )
+    {
+      /* set transformation */
+      FT_Set_Transform( face, &matrix, &pen );
+
+      /* load glyph image into the slot (erase previous one) */
+      error = FT_Load_Char( face, text[n], FT_LOAD_RENDER );
+      if ( error ) continue;  /* ignore errors */
+
+      /* now, draw to our target surface (convert position) */
+      my_draw_bitmap( &slot->bitmap,
+                      slot->bitmap_left,
+                      my_target_height - slot->bitmap_top );
+
+      /* increment pen position */
+      pen.x += slot->advance.x;
+      pen.y += slot->advance.y;
+    }
+
+ +

Notes:

+ +
    +
  • + We now use a vector of type FT_Vector to store the pen + position, with coordinates expressed as 1/64th of pixels, hence a + multiplication. The position is expressed in cartesian space. +
  • +
  • + In FreeType, glyph images are always loaded, transformed, and + described in the cartesian coordinate system (which means that + increasing Y corresponds to upper scanlines), unlike the + system typically used for bitmaps (where the top-most scanline has + coordinate 0). We must thus convert between the two systems + when we define the pen position, and when we compute the top-left + position of the bitmap. +
  • +
  • + We apply the transformation matrix on each glyph to indicate + rotation as well as a delta vector that will move the transformed + image to the current pen position (in cartesian space, not bitmap + space). +
  • +
  • + The advance width is always returned transformed, which is why it + can be directly added to the current pen position. Note that it + is not rounded this time. +
  • +
+ +

It is important to note that, while this example is a bit more + complex than the previous one, it is strictly equivalent for the case + where the transformation is the identity. Hence it can be used as a + replacement (but a more powerful one).

+ +

It has, however, a few shortcomings that we will explain, and + solve, in the next part of this tutorial.

+ +
+ +

+ Conclusion +

+ +

In this first section, you have learned the basics of FreeType 2 + as well as sufficient knowledge how to render rotated text.

+ +

The next part will dive into more details of the API in order to let + you access glyph metrics and images directly, how to deal with scaling, + hinting, kerning, etc.

+ +

The third part will discuss issues like modules, caching, and a few + other advanced topics like how to use multiple size objects with a + single face.

+ +
+
+ + + Index: xc/extras/freetype2/docs/tutorial/step2.html diff -u /dev/null xc/extras/freetype2/docs/tutorial/step2.html:1.1.1.1 --- /dev/null Mon Dec 18 14:22:29 2000 +++ xc/extras/freetype2/docs/tutorial/step2.html Fri Dec 8 16:26:14 2000 @@ -0,0 +1,1607 @@ + + + + + + FreeType 2 Tutorial + + + + +

+ FreeType 2.0 Tutorial
+ Step 2 -- managing glyphs +

+ +

+ © 2000 David Turner + (david@freetype.org)
+ © 2000 The FreeType Development Team + (www.freetype.org) +

+ +
+ + +
+ +
+ +

+ Introduction +

+ +

This is the second part of the FreeType 2 tutorial. It will teach + you the following:

+ +
    +
  • how to retrieve glyph metrics
  • +
  • how to easily manage glyph images
  • +
  • how to retrieve global metrics (including kerning)
  • +
  • how to render a simple string of text, with kerning
  • +
  • how to render a centered string of text (with kerning)
  • +
  • how to render a transformed string of text (with centering)
  • +
  • finally, how to access metrics in design font units if needed, + and how to scale them to device space
  • +
+ +
+ +

+ 1. Glyph metrics +

+ +

Glyph metrics are, as their name suggests, certain distances + associated to each glyph in order to describe how to use it to layout + text.

+ +

There are usually two sets of metrics for a single glyph: those used + to layout the glyph in horizontal text layouts (like Latin, Cyrillic, + Arabic, Hebrew, etc.), and those used to layout the glyph in vertical + text layouts (like some layouts of Chinese, Japanese, Korean, and + others).

+ +

Note that only a few font formats provide vertical metrics. You can + test wether a given face object contains them by using the macro + FT_HAS_VERTICAL(face), which is true if vertical metrics are + available.

+ +

Individual glyph metrics can be accessed by first loading the glyph + in a face's glyph slot, then using the face->glyph->metrics + structure. This will be described later; for now, we observe that it + contains the following fields:

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ width + + This is the width of the glyph image's bounding box. It is + independent of the layout direction. +
+ height + + This is the height of the glyph image's bounding box. It is + independent of the layout direction. +
+ horiBearingX + + For horizontal text layouts, this is the horizontal + distance from the current cursor position to the left-most border of + the glyph image's bounding box. +
+ horiBearingY + + For horizontal text layouts, this is the vertical distance + from the current cursor position (on the baseline) to the top-most + border of the glyph image's bounding box. +
+ horiAdvance + + For horizontal text layouts, this is the horizontal + distance used to increment the pen position when the glyph is drawn + as part of a string of text. +
+ vertBearingX + + For vertical text layouts, this is the horizontal distance + from the current cursor position to the left-most border of the + glyph image's bounding box. +
+ vertBearingY + + For vertical text layouts, this is the vertical distance + from the current cursor position (on the baseline) to the top-most + border of the glyph image's bounding box. +
+ vertAdvance + + For vertical text layouts, this is the vertical distance + used to increment the pen position when the glyph is drawn as part + of a string of text. +
+
+ +

As not all fonts do contain vertical metrics, the values of + vertBearingX, vertBearingY, and vertAdvance + should not be considered reliable if FT_HAS_VERTICAL(face) is + false.

+ +

The following graphics illustrate the metrics more clearly. First + horizontal metrics, where the baseline is the horizontal axis:

+ +
+ horizontal metrics layout +
+ +

For vertical text layouts, the baseline is vertical and is the + vertical axis:

+ +
+ vertical metrics layout +
+ +

The metrics found in face->glyph->metrics are normally + expressed in 26.6 pixel format (i.e 1/64th of pixels), unless you use + the FT_LOAD_NO_SCALE flag when calling FT_Load_Glyph() + or FT_Load_Char(). In that case, the metrics will be expressed + in original font units.

+ +

The glyph slot object has a few other interesting fields that will + ease a developer's work. You can access them through + face->glyph->???:

+ +
+ + + + + + + + + + + + + +
+ advance + + This field is an FT_Vector which holds the transformed + advance value for the glyph. This is useful if you are using a + transformation through FT_Set_Transform(), as shown in the + rotated text example of the previous part. Other than that, its + value is by default (metrics.horiAdvance,0), unless you specify + FT_LOAD_VERTICAL when loading the glyph image; it will then + be (0,metrics.vertAdvance). +
+ linearHoriAdvance + + This field contains the linearly-scaled value of the glyph's + horizontal advance width. Indeed, the value of + metrics.horiAdvance that is returned in the glyph slot is + normally rounded to integer pixel coordinates (i.e., it will be a + multiple of 64) by the font driver used to load the glyph + image. linearHoriAdvance is a 16.16 fixed float number + that gives the value of the original glyph advance width in + 1/65536th of pixels. It can be used to perform pseudo + device-independent text layouts. +
+ linearVertAdvance + + This is the same thing as linearHoriAdvance for the glyph's + vertical advance height. Its value is only reliable if the font + face contains vertical metrics. +
+
+ +
+ +

+ 2. Managing glyph images +

+ +

The glyph image that is loaded in a glyph slot can be converted into + a bitmap, either by using FT_LOAD_RENDER when loading it, or by + calling FT_Render_Glyph() afterwards. Each time you load a new + glyph image, the previous one is erased from the glyph slot.

+ +

There are times, however, where you may need to extract this image + from the glyph slot. For example, you want to cache images within your + application, or you want to apply additional transformations and + measures on it before converting it to a bitmap.

+ +

The FreeType 2 API has a specific extension which is capable of + dealing with glyph images in a flexible and generic way. To use it, you + first need to include the ftglyph.h header file:

+ + +
+    #include <freetype/ftglyph.h>
+
+ +

We will now explain how to use the functions defined in this + file.

+ +

+ a. Extracting the glyph image +

+ +

You can extract a single glyph image very easily. Here some code + that shows how to do it.

+ + +
+    FT_Glyph  glyph;    /* handle to glyph image */
+
+
+    ...
+    error = FT_Load_Glyph( face, glyph, FT_LOAD_NORMAL );
+    if ( error ) { .... }
+
+    error = FT_Get_Glyph( face->glyph, &glyph );
+    if ( error ) { .... }
+
+ +

As can be seen, we have

+ +
    +
  • + created a variable, named glyph, of type + FT_Glyph. This is a handle (pointer) to an individual + glyph image, +
  • +
  • + loaded the glyph image normally in the face's glyph slot. We did + not use FT_LOAD_RENDER because we want to grab a scalable + glyph image in order to transform it later, +
  • +
  • + copied the glyph image from the slot into a new FT_Glyph + object by calling FT_Get_Glyph(). This function returns + an error code and sets glyph. +
  • +
+ +

It is important to note that the extracted glyph is in the same + format as the original one that is still in the slot. For example, if + we are loading a glyph from a TrueType font file, the glyph image will + really be a scalable vector outline.

+ +

You can access the field glyph->format if you want to know + exactly how the glyph is modeled and stored. A new glyph object can + be destroyed with a call to FT_Done_Glyph().

+ +

The glyph object contains exactly one glyph image and a + 2d vector representing the glyph's advance in 16.16 fixed float + coordinates. The latter can be accessed directly as + glyph->advance.

+ +

Note that unlike other FreeType objects, the library doesn't + keep a list of all allocated glyph objects. This means you will need + to destroy them yourself, instead of relying on + FT_Done_FreeType() to do all the clean-up.

+ +

+ b. Transforming & copying the glyph image +

+ +

If the glyph image is scalable (i.e., if glyph->format is + not ft_glyph_format_bitmap), it is possible to transform the + image anytime by a call to FT_Glyph_Transform().

+ +

You can also copy a single glyph image with + FT_Glyph_Copy(). Here some example code:

+ + +
+    FT_Glyph   glyph, glyph2;
+    FT_Matrix  matrix;
+    FT_Vector  delta;
+
+
+    ...
+    .. load glyph image in "glyph" ..
+
+    /* copy glyph to glyph2 */
+    error = FT_Glyph_Copy( glyph, &glyph2 );
+    if ( error ) { ... could not copy (out of memory) }
+
+    /* translate "glyph" */
+    delta.x = -100 * 64;   /* coordinates are in 26.6 pixels */
+    delta.y =   50 * 64;
+
+    FT_Glyph_Transform( glyph, 0, &delta );
+
+    /* transform glyph2 (horizontal shear) */
+    matrix.xx = 0x10000L;
+    matrix.xy = 0;
+    matrix.yx = 0.12 * 0x10000L;
+    matrix.yy = 0x10000L;
+
+    FT_Glyph_Transform( glyph2, &matrix, 0 );
+
+ +

Note that the 2x2 transformation matrix is always applied to + the 16.16 advance vector in the glyph; you thus don't need to + recompute it.

+ +

+ c. Measuring the glyph image +

+ +

You can also retrieve the control (bounding) box of any glyph image + (scalable or not), using the FT_Glyph_Get_CBox() + function:

+ + +
+    FT_BBox  bbox;
+
+
+    ...
+    FT_Glyph_Get_CBox( glyph, bbox_mode, &bbox );
+
+ +

Coordinates are relative to the glyph origin, i.e. (0,0), using the + Y upwards convention. This function takes a special argument, + bbox_mode, to indicate how box coordinates are expressed. If + bbox_mode is set to ft_glyph_bbox_subpixels, the + coordinates are returned in 26.6 pixels (i.e. 1/64th of pixels). + +

Note that the box's maximum coordinates are exclusive, which means + that you can always compute the width and height of the glyph image, + be it in integer or 26.6 pixels with

+ + +
+    width  = bbox.xMax - bbox.xMin;
+    height = bbox.yMax - bbox.yMin;
+
+ +

Note also that for 26.6 coordinates, if + ft_glyph_bbox_gridfit is set in bbox_mode, 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)
+
+ +

The default value for bbox_mode is + ft_glyph_bbox_pixels (i.e. integer, grid-fitted pixel + coordinates). Please check the API reference of + FT_Glyph_Get_CBox() for other possible values.

+ +

+ d. Converting the glyph image to a bitmap +

+ +

You may need to convert the glyph object to a bitmap once you have + conveniently cached or transformed it. This can be done easily with + the FT_Glyph_To_Bitmap() function:

+ + +
+    FT_Vector  origin;
+
+
+    origin.x = 32;   /* 1/2 pixel in 26.6 format */
+    origin.y = 0;
+
+    error = FT_Glyph_To_Bitmap( &glyph,
+                                render_mode,
+                                &origin,
+                                1 );  /* destroy orig. image == true */
+
+ +

Some details on this function's parameters:

+ +
    +
  • + The first parameter is the address of the source glyph's + handle. When the function is called, it reads it to access + the source glyph object. After the call, the handle will point to + a new glyph object that contains the rendered bitmap. +
  • +
  • + The second parameter is a standard render mode that is used to + specify what kind of bitmap we want. It can be + ft_render_mode_default for an 8-bit anti-aliased pixmap, + or ft_render_mode_mono for a 1-bit monochrome bitmap. +
  • +
  • + The third parameter is a pointer to a 2d vector that is used + to translate the source glyph image before the conversion. Note + that the source image will be translated back to its original + position (and will thus be left unchanged) after the call. If you + do not need to translate the source glyph before rendering, set + this pointer to 0. +
  • +
  • + The last parameter is a Boolean to indicate whether the source + glyph object should be destroyed by the function. By default, the + original glyph object is never destroyed, even if its handle is + lost (it's up to client applications to keep it). +
  • +
+ +

The new glyph object always contains a bitmap (when no error is + returned), and you must typecast its handle to the + FT_BitmapGlyph type in order to access its contents. This + type is a sort of subclass of FT_Glyph that contains + additional fields:

+ +
+ + + + + + + + + + + + + +
+ left + + Just like the bitmap_left field of a glyph slot, this is + the horizontal distance from the glyph origin (0,0) to the + left-most pixel of the glyph bitmap. It is expressed in integer + pixels. +
+ top + + Just like the bitmap_top field of a glyph slot, this is + the vertical distance from the glyph origin (0,0) to the top-most + pixel of the glyph bitmap (more exactly, to the pixel just above + the bitmap). This distance is expressed in integer pixels, and is + positive for upwards Y. +
+ bitmap + + This is a bitmap descriptor for the glyph object, just like the + bitmap field in a glyph slot. +
+
+ +
+ +

+ 3. Global glyph metrics +

+ +

Unlike glyph metrics, global ones are used to describe distances and + features of a whole font face. They can be expressed either in 26.6 + pixel format or in design font units for scalable formats.

+ +

+ a. Design global metrics +

+ +

For scalable formats, all global metrics are expressed in font + units in order to be later scaled to device space, according to the + rules described in the last chapter of this part of the tutorial. You + can access them directly as fields of an FT_Face handle.

+ +

However, you need to check that the font face's format is scalable + before using them. This can be done with the macro + FT_IS_SCALABLE(face) which returns true if we have a scalable + format.

+ +

In this case, you can access the global design metrics as

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ units_per_EM + + This is the size of the EM square for the font face. It is used + by scalable formats to scale design coordinates to device pixels, + as described by the last chapter of this part. Its value usually + is 2048 (for TrueType) or 1000 (for Type 1), but + other values are possible too. It is set to 1 for fixed-size + formats like FNT/FON/PCF/BDF. +
+ global_bbox + + The global bounding box is defined as the largest rectangle that + can enclose all the glyphs in a font face. It is defined for + horizontal layouts only. This is not necessarily the smallest + bounding box which is possible. +
+ ascender + + The ascender is the vertical distance from the horizontal baseline + to the height of the highest character in a font face. + Unfortunately, font formats define the ascender + differently. For some, it represents the ascent of all + capital Latin characters, without accents, for others it is the + ascent of the highest accented character, and finally, other + formats define it as being equal to global_bbox.yMax. +
+ descender + + The descender is the vertical distance from the horizontal + baseline to the depth of the lowest character in a font face. + Unfortunately, font formats define the descender + differently. For some, it represents the descent of all + capital Latin characters, without accents, for others it is the + ascent of the lowest accented character, and finally, other + formats define it as being equal to global_bbox.yMin. + This field is usually negative. +
+ text_height + + This field is used to compute a default line spacing (i.e. the + baseline-to-baseline distance) when writing text with this font. + Note that it usually is larger than the sum of the ascender and + descender taken as absolute values. There is also no guarantee + that no glyphs can extend above or below subsequent baselines when + using this distance. +
+ max_advance_width + + This field gives the maximum horizontal cursor advance for all + glyphs in the font. It can be used to quickly compute the maximum + advance width of a string of text. It doesn't correspond to + the maximum glyph image width! +
+ max_advance_height + + Same as max_advance_width but for vertical text layout. + It is only available in fonts providing vertical glyph metrics. +
+ underline_position + + When displaying or rendering underlined text, this value + corresponds to the vertical position, relative to the baseline, of + the underline bar. It normally is negative (as it is below the + baseline). +
+ underline_thickness + + When displaying or rendering underlined text, this value + corresponds to the vertical thickness of the underline. +
+
+ +

Notice how, unfortunately, the values of the ascender and the + descender are not reliable (due to various discrepancies in font + formats).

+ +

+ b. Scaled global metrics +

+ +

Each size object also contains scaled versions of some of the + global metrics described above. They can be accessed directly through + the face->size->metrics structure.

+ +

Note that these values correspond to scaled versions of the design + global metrics, with no rounding/grid-fitting performed. They + are also completely independent of any hinting process. In other + words, don't rely on them to get exact metrics at the pixel level. + They are expressed in 26.6 pixel format.

+ +
+ + + + + + + + + + + + + + + + + +
+ ascender + + This is the scaled version of the original design ascender. +
+ descender + + This is the scaled version of the original design descender. +
+ height + + The scaled version of the original design text height. This is + probably the only field you should really use in this structure. +
+ max_advance + + This is the scaled version of the original design max advance. +
+
+ +

Note that the face->size->metrics structure contains other + fields that are used to scale design coordinates to device space. + They are described below.

+ +

+ c. Kerning +

+ +

Kerning is the process of adjusting the position of two subsequent + glyph images in a string of text, in order to improve the general + appearance of text. Basically, it means that when the glyph for an + "A" is followed by the glyph for a "V", the space between them can be + slightly reduced to avoid extra "diagonal whitespace".

+ +

Note that in theory, kerning can happen both in the horizontal and + vertical direction between two glyphs; however, it only happens in the + horizontal direction in nearly all cases except really extreme + ones.

+ +

Not all font formats contain kerning information. Instead, they + sometimes rely on an additional file that contains various glyph + metrics, including kerning, but no glyph images. A good example would + be the Type 1 format, where glyph images are stored in a file + with extension .pfa or .pfb, and where kerning + metrics can be found in an additional file with extension + .afm or .pfm.

+ +

FreeType 2 allows you to deal with this by providing the + FT_Attach_File() and FT_Attach_Stream() APIs. Both + functions are used to load additional metrics into a face object, by + reading them from an additional format-specific file. For example, + you could open a Type 1 font by doing the following:

+ + +
+    error = FT_New_Face( library,
+                         "/usr/shared/fonts/cour.pfb",
+                         0,
+                         &face );
+    if ( error ) { ... }
+
+    error = FT_Attach_File( face, "/usr/shared/fonts/cour.afm" );
+    if ( error )
+    {
+      .. could not read kerning and additional metrics ..
+    }
+
+ +

Note that FT_Attach_Stream() is similar to + FT_Attach_File() except that it doesn't take a C string + to name the extra file, but a FT_Stream handle. Also, + reading a metrics file is in no way mandatory.

+ +

Finally, the file attachment APIs are very generic and can be used + to load any kind of extra information for a given face. The nature of + the additional data is entirely font format specific.

+ +

FreeType 2 allows you to retrieve the kerning information + between two glyphs through the FT_Get_Kerning() function, + whose interface looks like

+ + +
+    FT_Vector  kerning;
+
+
+    ...
+    error = FT_Get_Kerning(
+              face,              /* handle to face object */
+              left,              /* left glyph index      */
+              right,             /* right glyph index     */
+              kerning_mode,      /* kerning mode          */
+              &kerning );        /* target vector         */
+
+ +

As can be seen, the function takes a handle to a face object, the + indices of the left and right glyphs for which the kerning value is + desired, as well as an integer, called the kerning mode, and + a pointer to a destination vector that receives the corresponding + distances.

+ +

The kerning mode is very similar to bbox_mode described in + a previous part. It is an enumeration value that indicates how the + kerning distances are expressed in the target vector.

+ +

The default value ft_kerning_mode_default (which has + value 0) corresponds to kerning distances expressed in 26.6 + grid-fitted pixels (which means that the values are multiples + of 64). For scalable formats, this means that the design kerning + distance is scaled, then rounded.

+ +

The value ft_kerning_mode_unfitted corresponds to kerning + distances expressed in 26.6 unfitted pixels (i.e. that do not + correspond to integer coordinates). It is the design kerning distance + that is scaled without rounding.

+ +

Finally, the value ft_kerning_mode_unscaled is used to + return the design kerning distance, expressed in font units. You can + later scale it to device space using the computations explained in the + last chapter of this part.

+ +

Note that the "left" and "right" positions correspond to the + visual order of the glyphs in the string of text. This is + important for bidirectional text, or when writing right-to-left + text.

+ +
+ +

+ 4. Simple text rendering: kerning + centering +

+ +

In order to show off what we have just learned, we will now modify + the example code that was provided in the first part to render a string + of text, and enhance it to support kerning and delayed rendering.

+ +

+ a. Kerning support +

+ +

Adding support for kerning to our code is trivial, as long as we + consider that we are still dealing with a left-to-right script like + Latin. We need to retrieve the kerning distance between two glyphs in + order to alter the pen position appropriately. The code looks + like

+ + +
+    FT_GlyphSlot  slot = face->glyph;  /* a small shortcut */
+    FT_UInt       glyph_index;
+    FT_Bool       use_kerning;
+    FT_UInt       previous;
+    int           pen_x, pen_y, n;
+
+
+    .. initialize library ..
+    .. create face object ..
+    .. set character size ..
+
+    pen_x = 300;
+    pen_y = 200;
+
+    use_kerning = FT_HAS_KERNING( face );
+    previous    = 0;
+
+    for ( n = 0; n < num_chars; n++ )
+    {
+      /* convert character code to glyph index */
+      glyph_index = FT_Get_Char_Index( face, text[n] );
+
+      /* retrieve kerning distance and move pen position */
+      if ( use_kerning && previous && glyph_index )
+      {
+        FT_Vector  delta;
+
+
+        FT_Get_Kerning( face, previous, glyph_index,
+                        ft_kerning_mode_default, &delta );
+
+        pen_x += delta.x >> 6;
+      }
+
+      /* load glyph image into the slot (erase previous one) */
+      error = FT_Load_Glyph( face, glyph_index, FT_LOAD_RENDER );
+      if ( error ) continue;  /* ignore errors */
+
+      /* now, draw to our target surface */
+      my_draw_bitmap( &slot->bitmap,
+                      pen_x + slot->bitmap_left,
+                      pen_y - slot->bitmap_top );
+
+      /* increment pen position */
+      pen_x += slot->advance.x >> 6;
+
+      /* record current glyph index */
+      previous = glyph_index;
+    }
+
+ +

We are done. Notice that

+ +
    +
  • + As kerning is determined from glyph indices, we need to + explicitly convert our character code into a glyph index, then + later call FT_Load_Glyph() instead of + FT_Load_Char(). +
  • +
  • + We use a Boolean named use_kerning which is set with the + result of the macro FT_HAS_KERNING(face). It is + certainly faster not to call FT_Get_Kerning() if we + know that the font face does not contain kerning information. +
  • +
  • + We move the position of the pen before a new glyph is + drawn. +
  • +
  • + We did initialize the variable previous with the + value 0, which always correspond to the missing + glyph (also called .notdef in the PostScript world). + There is never any kerning distance associated with this glyph. +
  • +
  • + We do not check the error code returned by + FT_Get_Kerning(). This is because the function always + set delta to (0,0) when an error occurs. +
  • +
+ +

+ b. Centering +

+ +

Our code becomes more interesting but it is still a bit too simple + for normal uses. For example, the position of the pen is determined + before we do the rendering if in a real-life situation; you would want + to layout the text and measure it before computing its final position + (e.g. centering) or perform things like word-wrapping.

+ +

As a consequence we are now going to decompose our text rendering + function into two distinct but successive parts: The first one will + position individual glyph images on the baseline, while the second one + will render the glyphs. As will be shown, this has many + advantages.

+ +

We start by storing individual glyph images, as well as their + position on the baseline. This can be done with code like

+ + +
+    FT_GlyphSlot  slot = face->glyph;  /* a small shortcut */
+    FT_UInt       glyph_index;
+    FT_Bool       use_kerning;
+    FT_UInt       previous;
+    int           pen_x, pen_y, n;
+
+    FT_Glyph      glyphs[MAX_GLYPHS];  /* glyph image    */
+    FT_Vector     pos   [MAX_GLYPHS];  /* glyph position */
+    FT_UInt       num_glyphs;
+
+
+    .. initialize library ..
+    .. create face object ..
+    .. set character size ..
+
+    pen_x = 0;   /* start at (0,0)! */
+    pen_y = 0;
+
+    num_glyphs  = 0;
+    use_kerning = FT_HAS_KERNING( face );
+    previous    = 0;
+
+    for ( n = 0; n < num_chars; n++ )
+    {
+      /* convert character code to glyph index */
+      glyph_index = FT_Get_Char_Index( face, text[n] );
+
+      /* retrieve kerning distance and move pen position */
+      if ( use_kerning && previous && glyph_index )
+      {
+        FT_Vector  delta;
+
+
+        FT_Get_Kerning( face, previous, glyph_index,
+                        ft_kerning_mode_default, &delta );
+
+        pen_x += delta.x >> 6;
+      }
+
+      /* store current pen position */
+      pos[num_glyphs].x = pen_x;
+      pos[num_glyphs].y = pen_y;
+
+      /* load glyph image into the slot.  DO NOT RENDER IT! */
+      error = FT_Load_Glyph( face, glyph_index, FT_LOAD_DEFAULT );
+      if ( error ) continue;  /* ignore errors, jump to next glyph */
+
+      /* extract glyph image and store it in our table */
+      error = FT_Get_Glyph( face->glyph, &glyphs[num_glyphs] );
+      if ( error ) continue;  /* ignore errors, jump to next glyph */
+
+      /* increment pen position */
+      pen_x += slot->advance.x >> 6;
+
+      /* record current glyph index */
+      previous = glyph_index;
+
+      /* increment number of glyphs */
+      num_glyphs++;
+    }
+
+ +

As you see, this is a very slight variation of our previous code + where we extract each glyph image from the slot, and store it, along + with the corresponding position, in our tables.

+ +

Note also that pen_x contains the total advance for the + string of text. We can now compute the bounding box of the text + string with a simple function like

+ + +
+    void  compute_string_bbox( FT_BBox*  abbox )
+    {
+      FT_BBox  bbox;
+
+
+      /* initialize string bbox to "empty" values */
+      bbox.xMin = bbox.yMin =  32000;
+      bbox.xMax = bbox.yMax = -32000;
+
+      /* for each glyph image, compute its bounding box, */
+      /* translate it, and grow the string bbox          */
+      for ( n = 0; n < num_glyphs; n++ )
+      {
+        FT_BBox  glyph_bbox;
+
+
+        FT_Glyph_Get_CBox( glyphs[n], &glyph_bbox );
+
+        glyph_bbox.xMin += pos[n].x;
+        glyph_bbox.xMax += pos[n].x;
+        glyph_bbox.yMin += pos[n].y;
+        glyph_bbox.yMax += pos[n].y;
+
+        if ( glyph_bbox.xMin < bbox.xMin )
+          bbox.xMin = glyph_bbox.xMin;
+
+        if ( glyph_bbox.yMin < bbox.yMin )
+          bbox.yMin = glyph_bbox.yMin;
+
+        if ( glyph_bbox.xMax > bbox.xMax )
+          bbox.xMax = glyph_bbox.xMax;
+
+        if ( glyph_bbox.yMax &gy; bbox.yMax )
+          bbox.yMax = glyph_bbox.yMax;
+      }
+
+      /* check that we really grew the string bbox */
+      if ( bbox.xMin > bbox.xMax )
+      {
+        bbox.xMin = 0;
+        bbox.yMin = 0;
+        bbox.xMax = 0;
+        bbox.yMax = 0;
+      }
+
+      /* return string bbox */
+      *abbox = bbox;
+    }
+
+ +

The resulting bounding box dimensions can then be used to compute + the final pen position before rendering the string as in:

+ + +
+    /* compute string dimensions in integer pixels */
+    string_width  = ( string_bbox.xMax - string_bbox.xMin ) / 64;
+    string_height = ( string_bbox.yMax - string_bbox.yMin ) / 64;
+
+    /* compute start pen position in 26.6 cartesian pixels */
+    start_x = ( ( my_target_width  - string_width  ) / 2 ) * 64;
+    start_y = ( ( my_target_height - string_height ) / 2 ) * 64;
+
+    for ( n = 0; n < num_glyphs; n++ )
+    {
+      FT_Glyph  image;
+      FT_Vector pen;
+
+
+      image = glyphs[n];
+
+      pen.x = start_x + pos[n].x;
+      pen.y = start_y + pos[n].y;
+
+      error = FT_Glyph_To_Bitmap( &image, ft_render_mode_normal,
+                                  &pen.x, 0 );
+      if ( !error )
+      {
+        FT_BitmapGlyph  bit = (FT_BitmapGlyph)image;
+
+
+        my_draw_bitmap( bitmap->bitmap,
+                        bitmap->left,
+                        my_target_height - bitmap->top );
+
+        FT_Done_Glyph( image );
+      }
+    }
+
+ +

Some remarks:

+ +
    +
  • + The pen position is expressed in the cartesian space (i.e. + Y upwards). +
  • +
  • + We call FT_Glyph_To_Bitmap() with the destroy + parameter set to 0 (false), in order to avoid destroying the + original glyph image. The new glyph bitmap is accessed through + image after the call and is typecast to an + FT_BitmapGlyph. +
  • +
  • + We use translation when calling FT_Glyph_To_Bitmap(). + This ensures that the left and top fields of the + bitmap glyph object are already set to the correct pixel + coordinates in the cartesian space. +
  • +
  • + Of course, we still need to convert pixel coordinates from + cartesian to device space before rendering, hence the + my_target_height - bitmap->top in the call to + my_draw_bitmap(). +
  • +
+ +

The same loop can be used to render the string anywhere on our + display surface, without the need to reload our glyph images each + time.

+ +
+ +

+ 5. Advanced text rendering: transformation + centering + kerning +

+ +

We are now going to modify our code in order to be able to easily + transform the rendered string, for example to rotate it. We will start + by performing a few minor improvements:

+ +

+ a. packing & translating glyphs +

+ +

We start by packing the information related to a single glyph image + into a single structure instead of parallel arrays. We thus define + the following structure type:

+ + +
+    typedef struct  TGlyph_
+    {
+      FT_UInt    index;    /* glyph index                  */
+      FT_Vector  pos;      /* glyph origin on the baseline */
+      FT_Glyph   image;    /* glyph image                  */
+
+     } TGlyph, *PGlyph;
+
+ +

We will also translate each glyph image directly after it is loaded + to its position on the baseline at load time, which has several + advantages. Our glyph sequence loader thus becomes:

+ + +
+    FT_GlyphSlot  slot = face->glyph;  /* a small shortcut */
+    FT_UInt       glyph_index;
+    FT_Bool       use_kerning;
+    FT_UInt       previous;
+    int           pen_x, pen_y, n;
+
+    TGlyph        glyphs[MAX_GLYPHS];  /* glyphs table           */
+    PGlyph        glyph;               /* current glyph in table */
+    FT_UInt       num_glyphs;
+
+
+    .. initialize library ..
+    .. create face object ..
+    .. set character size ..
+
+    pen_x = 0;   /* start at (0,0)! */
+    pen_y = 0;
+
+    num_glyphs  = 0;
+    use_kerning = FT_HAS_KERNING( face );
+    previous    = 0;
+
+    glyph = glyphs;
+    for ( n = 0; n < num_chars; n++ )
+    {
+      glyph->index = FT_Get_Char_Index( face, text[n] );
+
+      if ( use_kerning && previous && glyph->index )
+      {
+        FT_Vector  delta;
+
+
+        FT_Get_Kerning( face, previous, glyph->index,
+                        ft_kerning_mode_default, &delta );
+
+        pen_x += delta.x >> 6;
+      }
+
+      /* store current pen position */
+      glyph->pos.x = pen_x;
+      glyph->pos.y = pen_y;
+
+      error = FT_Load_Glyph( face, glyph_index, FT_LOAD_DEFAULT );
+      if ( error ) continue;
+
+      error = FT_Get_Glyph( face->glyph, &glyph->image );
+      if ( error ) continue;
+
+      /* translate the glyph image now */
+      FT_Glyph_Transform( glyph->image, 0, &glyph->pos );
+
+      pen_x   += slot->advance.x >> 6;
+      previous = glyph->index
+
+      /* increment number of glyphs */
+      glyph++;
+    }
+
+    /* count number of glyphs loaded */
+    num_glyphs = glyph - glyphs;
+
+ +

Translating glyphs now has several advantages, as mentioned + earlier. The first one is that we don't need to translate the glyph + bounding box when we compute the string's bounding box. The code + becomes:

+ + +
+    void  compute_string_bbox( FT_BBox*  abbox )
+    {
+      FT_BBox  bbox;
+
+
+      bbox.xMin = bbox.yMin =  32000;
+      bbox.xMax = bbox.yMax = -32000;
+
+      for ( n = 0; n < num_glyphs; n++ )
+      {
+        FT_BBox  glyph_bbox;
+
+
+        FT_Glyph_Get_CBox( glyphs[n], &glyph_bbox );
+
+        if ( glyph_bbox.xMin < bbox.xMin )
+          bbox.xMin = glyph_bbox.xMin;
+
+        if ( glyph_bbox.yMin < bbox.yMin )
+          bbox.yMin = glyph_bbox.yMin;
+
+        if ( glyph_bbox.xMax > bbox.xMax )
+          bbox.xMax = glyph_bbox.xMax;
+
+        if ( glyph_bbox.yMax &gy; bbox.yMax )
+          bbox.yMax = glyph_bbox.yMax;
+      }
+
+      if ( bbox.xMin > bbox.xMax )
+      {
+        bbox.xMin = 0;
+        bbox.yMin = 0;
+        bbox.xMax = 0;
+        bbox.yMax = 0;
+      }
+
+      *abbox = bbox;
+    }
+
+ +

compute_string_bbox() can now compute the bounding box of + a transformed glyph string. For example, we can do something + like

+ + +
+    FT_BBox    bbox;
+    FT_Matrix  matrix;
+    FT_Vector  delta;
+
+
+    ... load glyph sequence
+
+    ... setup "matrix" and "delta"
+
+    /* transform glyphs */
+    for ( n = 0; n < num_glyphs; n++ )
+      FT_Glyph_Transform( glyphs[n].image, &matrix, &delta );
+
+    /* compute bounding box of transformed glyphs */
+    compute_string_bbox( &bbox );
+
+ +

+ b. Rendering a transformed glyph sequence +

+ +

However, directly transforming the glyphs in our sequence is not a + useful idea if we want to reuse them in order to draw the text string + with various angles or transforms. It is better to perform the affine + transformation just before the glyph is rendered, as in the following + code:

+ + +
+    FT_Vector  start;
+    FT_Matrix  transform;
+
+
+    /* get bbox of original glyph sequence */
+    compute_string_bbox( &string_bbox );
+
+    /* compute string dimensions in integer pixels */
+    string_width  = ( string_bbox.xMax - string_bbox.xMin ) / 64;
+    string_height = ( string_bbox.yMax - string_bbox.yMin ) / 64;
+
+    /* set up start position in 26.6 cartesian space */
+    start.x = ( ( my_target_width  - string_width  ) / 2 ) * 64;
+    start.y = ( ( my_target_height - string_height ) / 2 ) * 64;
+
+    /* set up transformation (a rotation here) */
+    matrix.xx = (FT_Fixed)( cos( angle ) * 0x10000L );
+    matrix.xy = (FT_Fixed)(-sin( angle ) * 0x10000L );
+    matrix.yx = (FT_Fixed)( sin( angle ) * 0x10000L );
+    matrix.yy = (FT_Fixed)( cos( angle ) * 0x10000L );
+
+    for ( n = 0; n < num_glyphs; n++ )
+    {
+      FT_Glyph  image;
+      FT_Vector pen;
+      FT_BBox   bbox;
+
+
+      /* create a copy of the original glyph */
+      error = FT_Glyph_Copy( glyphs[n].image, &image );
+      if ( error ) continue;
+
+      /* transform copy (this will also translate it to the */
+      /* correct position                                   */
+      FT_Glyph_Transform( image, &matrix, &start );
+
+      /* check bounding box -- if the transformed glyph image */
+      /* is not in our target surface, we can avoid rendering */
+      FT_Glyph_Get_CBox( image, ft_glyph_bbox_pixels, &bbox );
+      if ( bbox.xMax <= 0 || bbox.xMin >= my_target_width  ||
+           bbox.yMax <= 0 || bbox.yMin >= my_target_height )
+        continue;
+
+      /* convert glyph image to bitmap (destroy the glyph */
+      /* copy!)                                           */
+      error = FT_Glyph_To_Bitmap(
+                &image,
+                ft_render_mode_normal,
+                0,                /* no additional translation */
+                1 );              /* destroy copy in "image"   */
+      if ( !error )
+      {
+        FT_BitmapGlyph  bit = (FT_BitmapGlyph)image;
+
+
+        my_draw_bitmap( bitmap->bitmap,
+                        bitmap->left,
+                        my_target_height - bitmap->top );
+
+        FT_Done_Glyph( image );
+      }
+    }
+
+ +

There are a few changes compared to the previous version of this + code:

+ +
    +
  • + We keep the original glyph images untouched, by transforming a + copy. +
  • +
  • + We perform clipping computations in order to avoid rendering & + drawing glyphs that are not within our target surface. +
  • +
  • + We always destroy the copy when calling + FT_Glyph_To_Bitmap() in order to get rid of the + transformed scalable image. Note that the image is destroyed even + when the function returns an error code (which is why + FT_Done_Glyph() is only called within the compound + statement). +
  • +
  • + The translation of the glyph sequence to the start pen position is + integrated in the call to FT_Glyph_Transform() intead of + FT_Glyph_To_Bitmap(). +
  • +
+ +

It is possible to call this function several times to render the + string with different angles, or even change the way start + is computed in order to move it to a different place.

+ +

This code is the basis of the FreeType 2 demonstration program + named ftstring.c. It could be easily extended to perform + advanced text layout or word-wrapping in the first part, without + changing the second one.

+ +

Note however that a normal implementation would use a glyph cache + in order to reduce memory consumption. For example, let us assume + that our text string to render is "FreeType". We would store three + identical glyph images in our table for the letter "e", which isn't + optimal (especially when you consider longer lines of text, or even + whole pages).

+ +
+ +

+ 6. Accessing metrics in design font units and scaling them +

+ +

Scalable font formats usually store a single vectorial image, called + an outline, for each glyph in a face. Each outline is defined + in an abstract grid called the design space, with coordinates + expressed in nominal font units. When a glyph image is loaded, + the font driver usually scales the outline to device space according to + the current character pixel size found in a FT_Size object. + The driver may also modify the scaled outline in order to significantly + improve its appearance on a pixel-based surface (a process known as + hinting or grid-fitting).

+ +

This section describes how design coordinates are scaled to device + space, and how to read glyph outlines and metrics in font units. This + is important for a number of things:

+ +
    +
  • +

    to perform "true" WYSIWYG text layout.

    +
  • +
  • +

    to access font data for conversion or analysis purposes

    +
  • +
+ +

+ a. Scaling distances to device space +

+ +

Design coordinates are scaled to device space using a simple + scaling transformation whose coefficients are computed with the help + of the character pixel size:

+ + +
+    device_x = design_x * x_scale
+    device_y = design_y * y_scale
+
+    x_scale  = pixel_size_x / EM_size
+    y_scale  = pixel_size_y / EM_size
+
+ +

Here, the value EM_size is font-specific and corresponds + to the size of an abstract square of the design space (called the + "EM"), which is used by font designers to create glyph images. It is + thus expressed in font units. It is also accessible directly for + scalable font formats as face->units_per_EM. You should + check that a font face contains scalable glyph images by using the + FT_IS_SCALABLE(face) macro, which returns true when the font + is scalable.

+ +

When you call the function FT_Set_Pixel_Sizes(), you are + specifying the value of pixel_size_x and + pixel_size_y; FreeType will then immediately compute the + values of x_scale and y_scale.

+ +

When you call the function FT_Set_Char_Size(), you are + specifying the character size in physical "points", which is used, + along with the device's resolutions, to compute the character pixel + size, then the scaling factors.

+ +

Note that after calling any of these two functions, you can access + the values of the character pixel size and scaling factors as fields + of the face->size->metrics structure. These fields are:

+ +
+ + + + + + + + + + + + + + + + + +
+ x_ppem + + This is the size in integer pixels of the EM square, which also is + the horizontal character pixel size, called + pixel_size_x in the above example. x_ppem means + "x pixels per EM". +
+ y_ppem + + This is the size in integer pixels of the EM square, which also is + the vertical character pixel size, called + pixel_size_y in the above example. y_ppem means + "y pixels per EM". +
+ x_scale + + This is a 16.16 fixed float scale that is used to directly scale + horizontal distances from design space to 1/64th of device pixels. +
+ y_scale + + This is a 16.16 fixed float scale that is used to directly scale + vertical distances from design space to 1/64th of device pixels. +
+
+ +

You can scale a distance expressed in font units to 26.6 pixels + directly with the help of the FT_MulFix() function, as + in:

+ + +
+    /* convert design distances to 1/64th of pixels */
+    pixels_x = FT_MulFix( design_x, face->size->metrics.x_scale );
+    pixels_y = FT_MulFix( design_y, face->size->metrics.y_scale );
+
+ +

However, you can also scale the value directly with more accuracy + by using doubles and the equations:

+ + +
+    FT_Size_Metrics*  metrics = &face->size->metrics;  /* shortcut */
+    double            pixels_x, pixels_y;
+    double            em_size, x_scale, y_scale;
+
+
+    /* compute floating point scale factors */
+    em_size = 1.0 * face->units_per_EM;
+    x_scale = metrics->x_ppem / em_size;
+    y_scale = metrics->y_ppem / em_size;
+
+    /* convert design distances to floating point pixels */
+    pixels_x = design_x * x_scale;
+    pixels_y = design_y * y_scale;
+
+ +

+ b. Accessing design metrics (glyph & global) +

+ +

You can access glyph metrics in font units by specifying the + FT_LOAD_NO_SCALE bit flag in FT_Load_Glyph() or + FT_Load_Char(). The metrics returned in + face->glyph->metrics will then all be in font units.

+ +

Unscaled kerning data can be retrieved using the + ft_kerning_mode_unscaled mode.

+ +

Finally, a few global metrics are available directly in font units + as fields of the FT_Face handle, as described in + section 3 of this tutorial part.

+ +
+ +

+ Conclusion +

+ +

This is the end of the second part of the FreeType 2 tutorial; + you are now able to access glyph metrics, manage glyph images, and + render text much more intelligently (kerning, measuring, transforming + & caching).

+ +

With this knowledge you can build a pretty decent text service on top + of FreeType 2, and you could possibly stop there if you want.

+ +

The next section will deal with FreeType 2 internals (like + modules, vector outlines, font drivers, renderers), as well as a few + font format specific issues (mainly, how to access certain TrueType or + Type 1 tables).

+
+
+ + + Index: xc/extras/freetype2/include/freetype/freetype.h diff -u /dev/null xc/extras/freetype2/include/freetype/freetype.h:1.1.1.1 --- /dev/null Mon Dec 18 14:22:29 2000 +++ xc/extras/freetype2/include/freetype/freetype.h Fri Dec 8 16:26:14 2000 @@ -0,0 +1,2296 @@ +/***************************************************************************/ +/* */ +/* freetype.h */ +/* */ +/* FreeType high-level API and common types (specification only). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#ifndef __FREETYPE_H__ +#define __FREETYPE_H__ + +/* include potentially build-specific directives and macros */ +#ifndef FT_BUILD_H +# define FT_BUILD_H +#endif +#include FT_BUILD_H + + /*************************************************************************/ + /* */ + /* The `raster' component duplicates some of the declarations in */ + /* freetype.h for stand-alone use if _FREETYPE_ isn't defined. */ + /* */ +#define _FREETYPE_ + + + /*************************************************************************/ + /* */ + /* The FREETYPE_MAJOR and FREETYPE_MINOR macros are used to version the */ + /* new FreeType design, which is able to host several kinds of font */ + /* drivers. It starts at 2.0. */ + /* */ +#define FREETYPE_MAJOR 2 +#define FREETYPE_MINOR 0 + + +#include FT_CONFIG_CONFIG_H +#include FT_ERRORS_H +#include FT_TYPES_H + +FT_BEGIN_HEADER + + /*************************************************************************/ + /*************************************************************************/ + /* */ + /* B A S I C T Y P E S */ + /* */ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* */ + /* FT_Glyph_Metrics */ + /* */ + /* */ + /* A structure used to model the metrics of a single glyph. Note */ + /* that values are expressed in 26.6 fractional pixel format or in */ + /* font units, depending on context. */ + /* */ + /* */ + /* width :: The glyph's width. */ + /* */ + /* height :: The glyph's height. */ + /* */ + /* horiBearingX :: Horizontal left side bearing. */ + /* */ + /* horiBearingY :: Horizontal top side bearing. */ + /* */ + /* horiAdvance :: Horizontal advance width. */ + /* */ + /* vertBearingX :: Vertical left side bearing. */ + /* */ + /* vertBearingY :: Vertical top side bearing. */ + /* */ + /* vertAdvance :: Vertical advance height. */ + /* */ + typedef struct FT_Glyph_Metrics_ + { + FT_Pos width; /* glyph width */ + FT_Pos height; /* glyph height */ + + FT_Pos horiBearingX; /* left side bearing in horizontal layouts */ + FT_Pos horiBearingY; /* top side bearing in horizontal layouts */ + FT_Pos horiAdvance; /* advance width for horizontal layout */ + + FT_Pos vertBearingX; /* left side bearing in vertical layouts */ + FT_Pos vertBearingY; /* top side bearing in vertical layouts */ + FT_Pos vertAdvance; /* advance height for vertical layout */ + + } FT_Glyph_Metrics; + + + /*************************************************************************/ + /* */ + /* */ + /* FT_Generic_Finalizer */ + /* */ + /* */ + /* 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. */ + /* */ + /* */ + /* 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); + + + /*************************************************************************/ + /* */ + /* */ + /* 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). */ + /* */ + /* */ + /* 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; + + + /*************************************************************************/ + /* */ + /* */ + /* FT_Bitmap_Size */ + /* */ + /* */ + /* An extremely simple structure used to model the size of a bitmap */ + /* strike (i.e., a bitmap instance of the font for a given */ + /* resolution) in a fixed-size font face. This is used for the */ + /* `available_sizes' field of the FT_Face_Properties structure. */ + /* */ + /* */ + /* height :: The character height in pixels. */ + /* */ + /* width :: The character width in pixels. */ + /* */ + typedef struct FT_Bitmap_Size_ + { + FT_Short height; + FT_Short width; + + } FT_Bitmap_Size; + + + /*************************************************************************/ + /*************************************************************************/ + /* */ + /* O B J E C T C L A S S E S */ + /* */ + /*************************************************************************/ + /*************************************************************************/ + + /*************************************************************************/ + /* */ + /* */ + /* 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 system object (see FT_System), as well as a */ + /* scan-line converter object (see FT_Raster). */ + /* */ + /* */ + /* Library objects are created through FT_Init_FreeType(). */ + /* */ + typedef struct FT_LibraryRec_ *FT_Library; + + + /*************************************************************************/ + /* */ + /* */ + /* 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. */ + /* */ + typedef struct FT_ModuleRec_* FT_Module; + + + /*************************************************************************/ + /* */ + /* */ + /* FT_Driver */ + /* */ + /* */ + /* A handle to a given FreeType font driver object. Each font driver */ + /* is able to create faces, sizes, glyph slots, and charmaps from the */ + /* resources whose format it supports. */ + /* */ + /* A driver can support either bitmap, graymap, or scalable font */ + /* formats. */ + /* */ + typedef struct FT_DriverRec_* FT_Driver; + + + /*************************************************************************/ + /* */ + /* */ + /* FT_Renderer */ + /* */ + /* */ + /* A handle to a given FreeType renderer. A renderer is in charge of */ + /* converting a glyph image to a bitmap, when necessary. Each */ + /* supports a given glyph image format, and one or more target */ + /* surface depths. */ + /* */ + typedef struct FT_RendererRec_* FT_Renderer; + + + /*************************************************************************/ + /* */ + /* */ + /* FT_Face */ + /* */ + /* */ + /* A handle to a given driver face object. A face object contains */ + /* all the instance and glyph independent data of a font file */ + /* typeface. */ + /* */ + /* A face object is created from a resource object through the */ + /* new_face() method of a given driver. */ + /* */ + typedef struct FT_FaceRec_* FT_Face; + + + /*************************************************************************/ + /* */ + /* */ + /* FT_Size */ + /* */ + /* */ + /* A handle to a given driver size object. Such an object models the */ + /* _resolution_ AND _size_ dependent state of a given driver face */ + /* size. */ + /* */ + /* A size object is always created from a given face object. It is */ + /* discarded automatically by its parent face. */ + /* */ + typedef struct FT_SizeRec_* FT_Size; + + + /*************************************************************************/ + /* */ + /* */ + /* FT_GlyphSlot */ + /* */ + /* */ + /* A handle to a given `glyph slot'. A slot is a container where it */ + /* is possible to load any of the glyphs contained within its parent */ + /* face. */ + /* */ + /* A glyph slot is created from a given face object. It is discarded */ + /* automatically by its parent face. */ + /* */ + typedef struct FT_GlyphSlotRec_* FT_GlyphSlot; + + + /*************************************************************************/ + /* */ + /* */ + /* 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. */ + /* */ + /* A charmap is created from a given face object. It is discarded */ + /* automatically by its parent face. */ + /* */ + typedef struct FT_CharMapRec_* FT_CharMap; + + + /*************************************************************************/ + /* */ + /* */ + /* FT_Encoding */ + /* */ + /* */ + /* An enumeration used to specify encodings supported by charmaps. */ + /* Used in the FT_Select_Charmap() API function. */ + /* */ + /* */ + /* 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. */ + /* */ + typedef enum FT_Encoding_ + { + ft_encoding_none = 0, + ft_encoding_symbol = FT_MAKE_TAG( 's', 'y', 'm', 'b' ), + ft_encoding_unicode = FT_MAKE_TAG( 'u', 'n', 'i', 'c' ), + ft_encoding_latin_2 = FT_MAKE_TAG( 'l', 'a', 't', '2' ), + ft_encoding_sjis = FT_MAKE_TAG( 's', 'j', 'i', 's' ), + ft_encoding_gb2312 = FT_MAKE_TAG( 'g', 'b', ' ', ' ' ), + ft_encoding_big5 = FT_MAKE_TAG( 'b', 'i', 'g', '5' ), + ft_encoding_wansung = FT_MAKE_TAG( 'w', 'a', 'n', 's' ), + ft_encoding_johab = FT_MAKE_TAG( 'j', 'o', 'h', 'a' ), + + ft_encoding_adobe_standard = FT_MAKE_TAG( 'A', 'D', 'O', 'B' ), + ft_encoding_adobe_expert = FT_MAKE_TAG( 'A', 'D', 'B', 'E' ), + ft_encoding_adobe_custom = FT_MAKE_TAG( 'A', 'D', 'B', 'C' ), + + ft_encoding_apple_roman = FT_MAKE_TAG( 'a', 'r', 'm', 'n' ) + + } FT_Encoding; + + + /*************************************************************************/ + /* */ + /* */ + /* FT_CharMapRec */ + /* */ + /* */ + /* The base charmap class. */ + /* */ + /* */ + /* face :: A handle to the parent face object. */ + /* */ + /* encoding :: A tag which identifies 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. */ + /* */ + /* */ + /* We STRONGLY recommmend emulating a Unicode charmap for drivers */ + /* that do not support TrueType or OpenType. */ + /* */ + 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 */ + /* */ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* */ + /* FT_Face_Internal */ + /* */ + /* */ + /* An opaque handle to an FT_Face_InternalRec structure, used to */ + /* model private data of a given FT_Face object. */ + /* */ + /* This field might change between releases of FreeType 2 and are */ + /* not generally available to client applications. */ + /* */ + typedef struct FT_Face_InternalRec_* FT_Face_Internal; + + + /*************************************************************************/ + /* */ + /* FreeType base face class */ + /* */ + /* */ + /* FT_FaceRec */ + /* */ + /* */ + /* FreeType root face class structure. A face object models the */ + /* resolution and point-size independent data found in a font file. */ + /* */ + /* */ + /* num_faces :: In the case where the face is located in a */ + /* collection (i.e., a resource which embeds */ + /* several faces), this is the total number of */ + /* faces found in the resource. 1 by default. */ + /* */ + /* face_index :: The index of the face in its resource. */ + /* Usually, this is 0 for all normal font */ + /* formats. It can be more in the case of */ + /* collections (which embed several fonts in a */ + /* single resource/file). */ + /* */ + /* face_flags :: A set of bit flags that give important */ + /* information about the face; see the */ + /* FT_FACE_FLAG_XXX macros for details. */ + /* */ + /* style_flags :: A set of bit flags indicating the style of */ + /* the face (i.e., italic, bold, underline, */ + /* etc). */ + /* */ + /* num_glyphs :: The total number of glyphs in the face. */ + /* */ + /* 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/Unicode versions of this string. */ + /* Applications should use the format specific */ + /* interface to access them. */ + /* */ + /* num_fixed_sizes :: The number of fixed sizes available in this */ + /* face. This should be set to 0 for scalable */ + /* fonts, unless its resource includes a */ + /* complete set of glyphs (called a `strike') */ + /* for the specified size. */ + /* */ + /* available_sizes :: An array of sizes specifying the available */ + /* bitmap/graymap sizes that are contained in */ + /* in the font resource. Should be set to */ + /* NULL if the field `num_fixed_sizes' is set */ + /* to 0. */ + /* */ + /* num_charmaps :: The total number of character maps in the */ + /* face. */ + /* */ + /* charmaps :: A table of pointers to the face's charmaps */ + /* Used to scan the list of available charmaps */ + /* this table might change after a call to */ + /* FT_Attach_File/Stream (e.g. when it used */ + /* to hook and additional encoding/CMap to */ + /* the face object). */ + /* */ + /* 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', */ + /* bbox.yMin as the `minimal descender', and */ + /* the maximal glyph width is given by */ + /* `bbox.xMax-bbox.xMin' (not to be confused */ + /* with the maximal _advance_width_). 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, 1000 for Type1 fonts, and */ + /* should be set to the (unrealistic) value 1 */ + /* for fixed-sizes fonts. Only relevant for */ + /* scalable formats. */ + /* */ + /* ascender :: The face's ascender is the vertical */ + /* distance from the baseline to the topmost */ + /* point of any glyph in the face. This */ + /* field's value is positive, expressed in */ + /* font units. Some font designs use a value */ + /* different from `bbox.yMax'. Only relevant */ + /* for scalable formats. */ + /* */ + /* descender :: The face's descender is the vertical */ + /* distance from the baseline to the */ + /* bottommost point of any glyph in the face. */ + /* This field's value is positive, expressed */ + /* in font units. Some font designs use a */ + /* value different from `-bbox.yMin'. Only */ + /* relevant for scalable formats. */ + /* */ + /* height :: The face's height is the vertical distance */ + /* from one baseline to the next when writing */ + /* several lines of text. Its value is always */ + /* positive, expressed in font units. The */ + /* value can be computed as */ + /* `ascender+descender+line_gap' where the */ + /* value of `line_gap' is also called */ + /* `external leading'. 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 should */ + /* be set to the `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. */ + /* */ + /* driver :: A handle to the face's parent driver */ + /* object. */ + /* */ + /* memory :: A handle to the face's parent memory */ + /* object. Used for the allocation of */ + /* subsequent objects. */ + /* */ + /* stream :: A handle to the face's stream. */ + /* */ + /* glyph :: The face's associated glyph slot(s). This */ + /* object is created automatically with a new */ + /* face object. However, certain kinds of */ + /* applications (mainly tools like converters) */ + /* can need more than one slot to ease their */ + /* task. */ + /* */ + /* sizes_list :: The list of child sizes for this face. */ + /* */ + /* internal :: A pointer to internal fields of the face */ + /* object. These fields can change freely */ + /* between releases of FreeType and are not */ + /* publicly available. */ + /* */ + 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 are only relevant to scalable outlines */ + 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; + + + /*************************************************************************/ + /* */ + /* */ + /* FT_FACE_FLAG_SCALABLE */ + /* */ + /* */ + /* A bit-field constant, used to indicate that a given face provides */ + /* vectorial outlines (i.e., TrueType or Type1). This doesn't */ + /* prevent embedding of bitmap strikes though, i.e., a given face can */ + /* have both this bit set, and a `num_fixed_sizes' property > 0. */ + /* */ +#define FT_FACE_FLAG_SCALABLE 1 + + + /*************************************************************************/ + /* */ + /* */ + /* FT_FACE_FLAG_FIXED_SIZES */ + /* */ + /* */ + /* A bit-field constant, used to indicate that a given face contains */ + /* `fixed sizes', i.e., bitmap strikes for some given pixel sizes. */ + /* See the `num_fixed_sizes' and `available_sizes' face properties */ + /* for more information. */ + /* */ +#define FT_FACE_FLAG_FIXED_SIZES 2 + + + /*************************************************************************/ + /* */ + /* */ + /* FT_FACE_FLAG_FIXED_WIDTH */ + /* */ + /* */ + /* A bit-field constant, used to indicate that a given face contains */ + /* fixed-width characters (like Courier, Lucida, MonoType, etc.). */ + /* */ +#define FT_FACE_FLAG_FIXED_WIDTH 4 + + + /*************************************************************************/ + /* */ + /* */ + /* FT_FACE_FLAG_SFNT */ + /* */ + /* */ + /* A bit-field constant, used to indicate that a given face uses the */ + /* `sfnt' storage fomat. For now, this means TrueType or OpenType. */ + /* */ +#define FT_FACE_FLAG_SFNT 8 + + + /*************************************************************************/ + /* */ + /* */ + /* FT_FACE_FLAG_HORIZONTAL */ + /* */ + /* */ + /* A bit-field constant, used to indicate that a given face contains */ + /* horizontal glyph metrics. This should be set for all common */ + /* formats, but who knows. */ + /* */ +#define FT_FACE_FLAG_HORIZONTAL 0x10 + + + /*************************************************************************/ + /* */ + /* */ + /* FT_FACE_FLAG_VERTICAL */ + /* */ + /* */ + /* A bit-field constant, used to indicate that a given face contains */ + /* vertical glyph metrics. If not set, the glyph loader will */ + /* synthetize vertical metrics itself to help display vertical text */ + /* correctly. */ + /* */ +#define FT_FACE_FLAG_VERTICAL 0x20 + + + /*************************************************************************/ + /* */ + /* */ + /* FT_FACE_FLAG_KERNING */ + /* */ + /* */ + /* A bit-field constant, used to indicate that a given face contains */ + /* kerning information. When set, this information can be retrieved */ + /* through the function FT_Get_Kerning(). Note that when unset, this */ + /* function will always return the kerning vector (0,0). */ + /* */ +#define FT_FACE_FLAG_KERNING 0x40 + + + /*************************************************************************/ + /* */ + /* */ + /* FT_FACE_FLAG_FAST_GLYPHS */ + /* */ + /* */ + /* A bit-field constant, used to indicate that the glyphs in a given */ + /* font can be retrieved very quickly, and that a glyph cache is thus */ + /* not necessary for any of its child size objects. */ + /* */ + /* This flag should really be set for fixed-size formats like FNT, */ + /* where each glyph bitmap is available directly in binary form */ + /* without any kind of compression. */ + /* */ +#define FT_FACE_FLAG_FAST_GLYPHS 0x80 + + + /*************************************************************************/ + /* */ + /* */ + /* FT_FACE_FLAG_MULTIPLE_MASTERS */ + /* */ + /* */ + /* A bit-field constant, used to indicate that the font contains */ + /* multiple masters and is capable of interpolating between them. */ + /* */ +#define FT_FACE_FLAG_MULTIPLE_MASTERS 0x100 + + + /*************************************************************************/ + /* */ + /* */ + /* FT_FACE_FLAG_GLYPH_NAMES */ + /* */ + /* */ + /* A bit-field constant, used to indicate that the font contains */ + /* glyph names that can be retrieved through FT_Get_Glyph_Name(). */ + /* */ +#define FT_FACE_FLAG_GLYPH_NAMES 0x200 + + + /*************************************************************************/ + /* */ + /* */ + /* FT_FACE_FLAG_EXTERNAL_STREAM */ + /* */ + /* */ + /* This bit field is used internally by FreeType to indicate that */ + /* a face's stream was provided by the client application and should */ + /* not be destroyed by FT_Done_Face(). */ + /* */ +#define FT_FACE_FLAG_EXTERNAL_STREAM 0x4000 + + /* */ + +#define FT_HAS_HORIZONTAL( face ) \ + ( face->face_flags & FT_FACE_FLAG_HORIZONTAL ) + +#define FT_HAS_VERTICAL( face ) \ + ( face->face_flags & FT_FACE_FLAG_VERTICAL ) + +#define FT_HAS_KERNING( face ) \ + ( face->face_flags & FT_FACE_FLAG_KERNING ) + +#define FT_IS_SCALABLE( face ) \ + ( face->face_flags & FT_FACE_FLAG_SCALABLE ) + +#define FT_IS_SFNT( face ) \ + ( face->face_flags & FT_FACE_FLAG_SFNT ) + +#define FT_IS_FIXED_WIDTH( face ) \ + ( face->face_flags & FT_FACE_FLAG_FIXED_WIDTH ) + +#define FT_HAS_FIXED_SIZES( face ) \ + ( face->face_flags & FT_FACE_FLAG_FIXED_SIZES ) + +#define FT_HAS_FAST_GLYPHS( face ) \ + ( face->face_flags & FT_FACE_FLAG_FAST_GLYPHS ) + +#define FT_HAS_GLYPH_NAMES( face ) \ + ( face->face_flags & FT_FACE_FLAG_GLYPH_NAMES ) + +#define FT_HAS_MULTIPLE_MASTERS( face ) \ + ( face->face_flags & FT_FACE_FLAG_MULTIPLE_MASTERS ) + + + /*************************************************************************/ + /* */ + /* */ + /* FT_STYLE_FLAG_ITALIC */ + /* */ + /* */ + /* A bit-field constant, used to indicate that a given face is */ + /* italicized. */ + /* */ +#define FT_STYLE_FLAG_ITALIC 1 + + + /*************************************************************************/ + /* */ + /* */ + /* FT_STYLE_FLAG_BOLD */ + /* */ + /* */ + /* A bit-field constant, used to indicate that a given face is */ + /* emboldened. */ + /* */ +#define FT_STYLE_FLAG_BOLD 2 + + + /*************************************************************************/ + /* */ + /* */ + /* FT_Size_Internal */ + /* */ + /* */ + /* 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; + + + /*************************************************************************/ + /* */ + /* FreeType base size metrics */ + /* */ + /* */ + /* FT_Size_Metrics */ + /* */ + /* */ + /* The size metrics structure returned scaled important distances for */ + /* a given size object. */ + /* */ + /* */ + /* x_ppem :: The character width, expressed in integer pixels. */ + /* This is the width of the EM square expressed in */ + /* pixels, hence the term `ppem' (pixels per EM). */ + /* */ + /* y_ppem :: The character height, expressed in integer pixels. */ + /* This is the height of the EM square expressed in */ + /* pixels, hence the term `ppem' (pixels per EM). */ + /* */ + /* x_scale :: A simple 16.16 fixed point format coefficient used */ + /* to scale horizontal distances expressed in font */ + /* units to fractional (26.6) pixel coordinates. */ + /* */ + /* y_scale :: A simple 16.16 fixed point format coefficient used */ + /* to scale vertical distances expressed in font */ + /* units to fractional (26.6) pixel coordinates. */ + /* */ + /* ascender :: The ascender, expressed in 26.6 fixed point */ + /* pixels. Always positive. */ + /* */ + /* descender :: The descender, expressed in 26.6 fixed point */ + /* pixels. Always positive. */ + /* */ + /* height :: The text height, expressed in 26.6 fixed point */ + /* pixels. Always positive. */ + /* */ + /* max_advance :: Maximum horizontal advance, expressed in 26.6 */ + /* fixed point pixels. Always positive. */ + /* */ + /* */ + /* The values of `ascender', `descender', and `height' are only the */ + /* scaled versions of `face->ascender', `face->descender', and */ + /* `face->height'. */ + /* */ + /* Unfortunately, due to glyph hinting, these values might not be */ + /* exact for certain fonts, they thus must be treated as unreliable */ + /* with an error margin of at least one pixel! */ + /* */ + /* Indeed, the only way to get the exact pixel ascender and descender */ + /* is to render _all_ glyphs. As this would be a definite */ + /* performance hit, it is up to client applications to perform such */ + /* computations. */ + /* */ + 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; /* two scales used to convert font units */ + FT_Fixed y_scale; /* to 26.6 frac. pixel coordinates.. */ + + 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; + + + /*************************************************************************/ + /* */ + /* FreeType base size class */ + /* */ + /* */ + /* FT_SizeRec */ + /* */ + /* */ + /* FreeType root size class structure. A size object models the */ + /* resolution and pointsize dependent data of a given face. */ + /* */ + /* */ + /* 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; + + + /*************************************************************************/ + /* */ + /* */ + /* FT_SubGlyph */ + /* */ + /* */ + /* The subglyph structure is an internal object used to describe */ + /* subglyphs (for example, in the case of composites). */ + /* */ + /* */ + /* The subglyph implementation is not part of the high-level API, */ + /* hence the forward structure declaration. */ + /* */ + typedef struct FT_SubGlyph_ FT_SubGlyph; + + + /*************************************************************************/ + /* */ + /* */ + /* FT_Slot_Internal */ + /* */ + /* */ + /* 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; + + + /*************************************************************************/ + /* */ + /* FreeType Glyph Slot base class */ + /* */ + /* */ + /* FT_GlyphSlotRec */ + /* */ + /* */ + /* FreeType root glyph slot class structure. A glyph slot is a */ + /* container where individual glyphs can be loaded, be they */ + /* vectorial or bitmap/graymaps. */ + /* */ + /* */ + /* 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 size 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 :: For scalable formats only, this field holds */ + /* the linearly scaled horizontal advance width */ + /* for the glyph (i.e. the scaled and unhinted */ + /* value of the hori advance). This can be */ + /* important to perform correct WYSIWYG layout. */ + /* */ + /* Note that this value is expressed by default */ + /* in 16.16 pixels. However, when the glyph is */ + /* loaded with the FT_LOAD_LINEAR_DESIGN flag, */ + /* this field contains simply the value of the */ + /* advance in original font units. */ + /* */ + /* linearVertAdvance :: For scalable formats only, this field holds */ + /* the linearly scaled vertical advance height */ + /* for the glyph. See linearHoriAdvance for */ + /* comments. */ + /* */ + /* 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, and */ + /* 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_bitmap_outline. */ + /* */ + /* num_subglyphs :: The number of subglyphs in a composite glyph. */ + /* This format is only valid for the composite */ + /* glyph format, that should normally only be */ + /* loaded with the FT_LOAD_NO_RECURSE flag. */ + /* */ + /* subglyphs :: An array of subglyph descriptors for */ + /* composite glyphs. There are `num_subglyphs' */ + /* elements in there. */ + /* */ + /* 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 apps. */ + /* Note that the app will need to know about the */ + /* image format. */ + /* */ + /* */ + /* If FT_Load_Glyph() is called with default flags (FT_LOAD_DEFAULT), */ + /* the glyph image is loaded in the glyph slot in its native format */ + /* (e.g. a vectorial outline 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' . */ + /* */ + typedef struct FT_GlyphSlotRec_ + { + FT_Library library; + FT_Face face; + FT_GlyphSlot next; + FT_UInt flags; + 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; + + void* other; + + FT_Slot_Internal internal; + + } FT_GlyphSlotRec; + + + /*************************************************************************/ + /*************************************************************************/ + /* */ + /* F U N C T I O N S */ + /* */ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* */ + /* FT_Init_FreeType */ + /* */ + /* */ + /* Initializes a new FreeType library object. The set of drivers */ + /* that are registered by this function is determined at build time. */ + /* */ + /* */ + /* alibrary :: A handle to a new library object. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + FT_EXPORT( FT_Error ) FT_Init_FreeType( FT_Library *alibrary ); + + + /*************************************************************************/ + /* */ + /* */ + /* FT_Done_FreeType */ + /* */ + /* */ + /* Destroys a given FreeType library object and all of its childs, */ + /* including resources, drivers, faces, sizes, etc. */ + /* */ + /* */ + /* library :: A handle to the target library object. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + FT_EXPORT( FT_Error ) FT_Done_FreeType( FT_Library library ); + + + /*************************************************************************/ + /* */ + /* */ + /* FT_Open_Flags */ + /* */ + /* */ + /* An enumeration used to list the bit flags used within */ + /* FT_Open_Args(). */ + /* */ + /* */ + /* 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 pathname. */ + /* */ + /* ft_open_driver :: Use the `driver' field. */ + /* */ + /* ft_open_params :: Use the `num_params' & `params' field. */ + /* */ + typedef enum + { + ft_open_memory = 1, + ft_open_stream = 2, + ft_open_pathname = 4, + ft_open_driver = 8, + ft_open_params = 16 + + } FT_Open_Flags; + + + /*************************************************************************/ + /* */ + /* */ + /* FT_Parameter */ + /* */ + /* */ + /* A simple structure used to pass more or less generic parameters */ + /* to FT_Open_Face(). */ + /* */ + /* */ + /* tag :: A 4-byte identification tag. */ + /* */ + /* data :: A pointer to the parameter data. */ + /* */ + /* */ + /* The id and function of parameters are driver-specific. */ + /* */ + typedef struct FT_Parameter_ + { + FT_ULong tag; + FT_Pointer data; + + } FT_Parameter; + + + /*************************************************************************/ + /* */ + /* */ + /* FT_Open_Args */ + /* */ + /* */ + /* A structure used to indicate how to open a new font file/stream. */ + /* A pointer to such a structure can be used as a parameter for the */ + /* functions FT_Open_Face() & FT_Attach_Stream(). */ + /* */ + /* */ + /* 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 will try 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. */ + /* */ + /* */ + /* `stream_type' determines which fields are used to create a new */ + /* input stream. */ + /* */ + /* If it is `ft_stream_memory', a new memory-based stream will be */ + /* created using the memory block specified by `memory_base' and */ + /* `memory_size'. */ + /* */ + /* If it is `ft_stream_pathname', a new stream will be created with */ + /* the `pathname' field, calling the system-specific FT_New_Stream() */ + /* function. */ + /* */ + /* If is is `ft_stream_copy', then the content of `stream' will be */ + /* copied to a new input stream object. The object will be closed */ + /* and destroyed when the face is destroyed itself. Note that this */ + /* means that you should not close the stream before the library */ + /* does! */ + /* */ + typedef struct FT_Open_Args_ + { + FT_Open_Flags flags; + 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; + + + /*************************************************************************/ + /* */ + /* */ + /* FT_New_Face */ + /* */ + /* */ + /* Creates a new face object from a given resource and typeface index */ + /* using a pathname to the font file. */ + /* */ + /* */ + /* library :: A handle to the library resource. */ + /* */ + /* */ + /* pathname :: A path to the font file. */ + /* */ + /* face_index :: The index of the face within the resource. The */ + /* first face has index 0. */ + /* */ + /* aface :: A handle to a new face object. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + /* */ + /* Unlike FreeType 1.x, this function automatically creates a glyph */ + /* slot for the face object which can be accessed directly through */ + /* `face->glyph'. */ + /* */ + /* Note that additional slots can be added to each face with the */ + /* FT_New_GlyphSlot() API function. Slots are linked in a single */ + /* list through their `next' field. */ + /* */ + /* FT_New_Face() can be used to determine and/or check the font */ + /* format of a given font resource. If the `face_index' field is */ + /* negative, the function will _not_ return any face handle in */ + /* `aface'. Its return value should be 0 if the resource is */ + /* recognized, or non-zero if not. */ + /* */ + FT_EXPORT( FT_Error ) FT_New_Face( FT_Library library, + const char* filepathname, + FT_Long face_index, + FT_Face *aface ); + + + /*************************************************************************/ + /* */ + /* */ + /* FT_New_Memory_Face */ + /* */ + /* */ + /* Creates a new face object from a given resource and typeface index */ + /* using a font file already loaded into memory. */ + /* */ + /* */ + /* library :: A handle to the library resource. */ + /* */ + /* */ + /* 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 resource. The */ + /* first face has index 0. */ + /* */ + /* aface :: A handle to a new face object. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + /* */ + /* Unlike FreeType 1.x, this function automatically creates a glyph */ + /* slot for the face object which can be accessed directly through */ + /* `face->glyph'. */ + /* */ + /* Note that additional slots can be added to each face with the */ + /* FT_New_GlyphSlot() API function. Slots are linked in a single */ + /* list through their `next' field. */ + /* */ + /* FT_New_Memory_Face() can be used to determine and/or check the */ + /* font format of a given font resource. If the `face_index' field */ + /* is negative, the function will _not_ return any face handle in */ + /* `aface'. Its return value should be 0 if the resource is */ + /* recognized, or non-zero if not. */ + /* */ + FT_EXPORT( FT_Error ) FT_New_Memory_Face( FT_Library library, + FT_Byte* file_base, + FT_Long file_size, + FT_Long face_index, + FT_Face *aface ); + + + /*************************************************************************/ + /* */ + /* */ + /* FT_Open_Face */ + /* */ + /* */ + /* Opens a face object from a given resource and typeface index using */ + /* an `FT_Open_Args' structure. If the face object doesn't exist, it */ + /* will be created. */ + /* */ + /* */ + /* library :: A handle to the library resource. */ + /* */ + /* */ + /* 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 resource. The */ + /* first face has index 0. */ + /* */ + /* aface :: A handle to a new face object. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + /* */ + /* Unlike FreeType 1.x, this function automatically creates a glyph */ + /* slot for the face object which can be accessed directly through */ + /* `face->glyph'. */ + /* */ + /* Note that additional slots can be added to each face with the */ + /* FT_New_GlyphSlot() API function. Slots are linked in a single */ + /* list through their `next' field. */ + /* */ + /* FT_Open_Face() can be used to determine and/or check the font */ + /* format of a given font resource. If the `face_index' field is */ + /* negative, the function will _not_ return any face handle in */ + /* `*face'. Its return value should be 0 if the resource is */ + /* recognized, or non-zero if not. */ + /* */ + FT_EXPORT( FT_Error ) FT_Open_Face( FT_Library library, + FT_Open_Args* args, + FT_Long face_index, + FT_Face *aface ); + + + /*************************************************************************/ + /* */ + /* */ + /* FT_Attach_File */ + /* */ + /* */ + /* `Attaches' a given font file to an existing face. This is usually */ + /* to read additional information for a single face object. For */ + /* example, it is used to read the AFM files that come with Type 1 */ + /* fonts in order to add kerning data and other metrics. */ + /* */ + /* */ + /* face :: The target face object. */ + /* */ + /* */ + /* filepathname :: An 8-bit pathname naming the `metrics' file. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + /* */ + /* If your font file is in memory, or if you want to provide your */ + /* own input stream object, use FT_Attach_Stream(). */ + /* */ + /* The meaning of the `attach' action (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_File( FT_Face face, + const char* filepathname ); + + + /*************************************************************************/ + /* */ + /* */ + /* FT_Attach_Stream */ + /* */ + /* */ + /* This function is similar to FT_Attach_File() with the exception */ + /* that it reads the attachment from an arbitrary stream. */ + /* */ + /* */ + /* face :: The target face object. */ + /* */ + /* */ + /* parameters :: A pointer to an FT_Open_Args structure used to */ + /* describe the input stream to FreeType. */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + /* */ + /* 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 ); + + + /*************************************************************************/ + /* */ + /* */ + /* FT_Done_Face */ + /* */ + /* */ + /* Discards a given face object, as well as all of its child slots */ + /* and sizes. */ + /* */ + /* */ + /* face :: A handle to a target face object. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + FT_EXPORT( FT_Error ) FT_Done_Face( FT_Face face ); + + + /*************************************************************************/ + /* */ + /* */ + /* FT_Set_Char_Size */ + /* */ + /* */ + /* Sets the character dimensions of a given face object. The */ + /* `char_width' and `char_height' values are used for the width and */ + /* height, respectively, expressed in 26.6 fractional points. */ + /* */ + /* If the horizontal or vertical resolution values are zero, a */ + /* default value of 72dpi is used. Similarly, if one of the */ + /* character dimensions is zero, its value is set equal to the other. */ + /* */ + /* */ + /* size :: A handle to a target size object. */ + /* */ + /* */ + /* char_width :: The character width, in 26.6 fractional points. */ + /* */ + /* char_height :: The character height, in 26.6 fractional */ + /* points. */ + /* */ + /* horz_resolution :: The horizontal resolution. */ + /* */ + /* vert_resolution :: The vertical resolution. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + /* */ + /* When dealing with fixed-size faces (i.e., non-scalable formats), */ + /* use the function FT_Set_Pixel_Sizes(). */ + /* */ + 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 ); + + + /*************************************************************************/ + /* */ + /* */ + /* FT_Set_Pixel_Sizes */ + /* */ + /* */ + /* Sets the character dimensions of a given face object. The width */ + /* and height are expressed in integer pixels. */ + /* */ + /* If one of the character dimensions is zero, its value is set equal */ + /* to the other. */ + /* */ + /* */ + /* face :: A handle to the target face object. */ + /* */ + /* */ + /* pixel_width :: The character width, in integer pixels. */ + /* */ + /* pixel_height :: The character height, in integer pixels. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + /* */ + /* */ + /* The values of `pixel_width' and `pixel_height' correspond to the */ + /* pixel values of the _typographic_ character size, which are NOT */ + /* necessarily the same as the dimensions of the glyph `bitmap */ + /* cells'. */ + /* */ + /* The `character size' is really the size of an abstract square */ + /* called the `EM', used to design the font. However, depending */ + /* on the font design, glyphs will be smaller or greater than the */ + /* EM. */ + /* */ + /* This means that setting the pixel size to, say, 8x8 doesn't */ + /* guarantee in any way that you will get glyph bitmaps that all fit */ + /* within an 8x8 cell (sometimes even far from it). */ + /* */ + FT_EXPORT( FT_Error ) FT_Set_Pixel_Sizes( FT_Face face, + FT_UInt pixel_width, + FT_UInt pixel_height ); + + + /*************************************************************************/ + /* */ + /* */ + /* FT_Load_Glyph */ + /* */ + /* */ + /* A function used to load a single glyph within a given glyph slot, */ + /* for a given size. */ + /* */ + /* */ + /* face :: A handle to the target face object where the glyph */ + /* will be 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. */ + /* */ + /* */ + /* If the glyph image is not a bitmap, and if the bit flag */ + /* FT_LOAD_IGNORE_TRANSFORM is unset, the glyph image will be */ + /* transformed with the information passed to a previous call to */ + /* FT_Set_Transform(). */ + /* */ + /* Note that this also transforms the `face.glyph.advance' field, but */ + /* *not* the values in `face.glyph.metrics'. */ + /* */ + FT_EXPORT( FT_Error ) FT_Load_Glyph( FT_Face face, + FT_UInt glyph_index, + FT_Int load_flags ); + + + /*************************************************************************/ + /* */ + /* */ + /* FT_Load_Char */ + /* */ + /* */ + /* A function used to load a single glyph within a given glyph slot, */ + /* for a given size, according to its character code. */ + /* */ + /* */ + /* face :: A handle to a target face object where the glyph */ + /* will be loaded. */ + /* */ + /* */ + /* 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). */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + /* */ + /* If the face has no current charmap, or if the character code */ + /* is not defined in the charmap, this function will return an */ + /* error. */ + /* */ + /* If the glyph image is not a bitmap, and if the bit flag */ + /* FT_LOAD_IGNORE_TRANSFORM is unset, the glyph image will be */ + /* transformed with the information passed to a previous call to */ + /* FT_Set_Transform(). */ + /* */ + /* Note that this also transforms the `face.glyph.advance' field, but */ + /* *not* the values in `face.glyph.metrics'. */ + /* */ + FT_EXPORT( FT_Error ) FT_Load_Char( FT_Face face, + FT_ULong char_code, + FT_Int load_flags ); + + + /*************************************************************************/ + /* */ + /* */ + /* FT_LOAD_NO_SCALE */ + /* */ + /* */ + /* A bit field constant, used with FT_Load_Glyph() to indicate that */ + /* the vector outline being loaded should not be scaled to 26.6 */ + /* fractional pixels, but kept in notional units. */ + /* */ +#define FT_LOAD_NO_SCALE 1 + + + /*************************************************************************/ + /* */ + /* */ + /* FT_LOAD_NO_HINTING */ + /* */ + /* */ + /* A bit-field constant, used with FT_Load_Glyph() to indicate that */ + /* the vector outline being loaded should not be fitted to the pixel */ + /* grid but simply scaled to 26.6 fractional pixels. */ + /* */ + /* This flag is ignored if FT_LOAD_NO_SCALE is set. */ + /* */ +#define FT_LOAD_NO_HINTING 2 + + + /*************************************************************************/ + /* */ + /* */ + /* FT_LOAD_RENDER */ + /* */ + /* */ + /* A bit-field constant, used with FT_Load_Glyph() to indicate that */ + /* the function should load the glyph and immediately convert it into */ + /* a bitmap, if necessary, by calling FT_Render_Glyph(). */ + /* */ + /* Note that by default, FT_Load_Glyph() loads the glyph image in its */ + /* native format. */ + /* */ +#define FT_LOAD_RENDER 4 + + + /*************************************************************************/ + /* */ + /* */ + /* FT_LOAD_NO_BITMAP */ + /* */ + /* */ + /* A bit-field constant, used with FT_Load_Glyph() to indicate that */ + /* the function should not load the bitmap or pixmap of a given */ + /* glyph. This is useful when you do not want to load the embedded */ + /* bitmaps of scalable formats, as the native glyph image will be */ + /* loaded, and can then be rendered through FT_Render_Glyph(). */ + /* */ +#define FT_LOAD_NO_BITMAP 8 + + + /*************************************************************************/ + /* */ + /* */ + /* FT_LOAD_VERTICAL_LAYOUT */ + /* */ + /* */ + /* A bit-field constant, used with FT_Load_Glyph() to indicate that */ + /* the glyph image should be prepared for vertical layout. This */ + /* basically means that `face.glyph.advance' will correspond to the */ + /* vertical advance height (instead of the default horizontal */ + /* advance width), and that the glyph image will translated to match */ + /* the vertical bearings positions. */ + /* */ +#define FT_LOAD_VERTICAL_LAYOUT 16 + + + /*************************************************************************/ + /* */ + /* */ + /* FT_LOAD_FORCE_AUTOHINT */ + /* */ + /* */ + /* A bit-field constant, used with FT_Load_Glyph() to indicate that */ + /* the function should try to auto-hint the glyphs, even if a driver */ + /* specific hinter is available. */ + /* */ +#define FT_LOAD_FORCE_AUTOHINT 32 + + + /*************************************************************************/ + /* */ + /* */ + /* FT_LOAD_CROP_BITMAP */ + /* */ + /* */ + /* A bit-field constant, used with FT_Load_Glyph() to indicate that */ + /* the font driver should try to crop the bitmap (i.e. remove all */ + /* space around its black bits) when loading it. For now, this */ + /* really only works with embedded bitmaps in TrueType fonts. */ + /* */ +#define FT_LOAD_CROP_BITMAP 64 + + + /*************************************************************************/ + /* */ + /* */ + /* FT_LOAD_PEDANTIC */ + /* */ + /* */ + /* A bit-field constant, used with FT_Load_Glyph() to indicate that */ + /* the glyph loader should perform a pedantic bytecode */ + /* interpretation. Many popular fonts come with broken glyph */ + /* programs. When this flag is set, loading them will return an */ + /* error. Otherwise, errors are ignored by the loader, sometimes */ + /* resulting in ugly glyphs. */ + /* */ +#define FT_LOAD_PEDANTIC 128 + + + /*************************************************************************/ + /* */ + /* */ + /* FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH */ + /* */ + /* */ + /* A bit-field constant, used with FT_Load_Glyph() to indicate that */ + /* the glyph loader should ignore the global advance width defined */ + /* in the font. As far as we know, this is only used by the */ + /* X-TrueType font server, in order to deal correctly with the */ + /* incorrect metrics contained in DynaLab's TrueType CJK fonts. */ + /* */ +#define FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH 512 + + + /*************************************************************************/ + /* */ + /* */ + /* FT_LOAD_NO_RECURSE */ + /* */ + /* */ + /* A bit-field constant, used with FT_Load_Glyph() to indicate that */ + /* the glyph loader should not load composite glyph recursively. */ + /* Rather, when a composite glyph is encountered, it should set */ + /* the values of `num_subglyphs' and `subglyphs', as well as set */ + /* `face->glyph.format' to ft_glyph_format_composite. */ + /* */ + /* This is for use by the auto-hinter and possibly other tools. */ + /* For nearly all applications, this flags should be left unset */ + /* when invoking FT_Load_Glyph(). */ + /* */ + /* Note that the flag forces the load of unscaled glyphs. */ + /* */ +#define FT_LOAD_NO_RECURSE 1024 + + + /*************************************************************************/ + /* */ + /* */ + /* FT_LOAD_IGNORE_TRANSFORM */ + /* */ + /* */ + /* A bit-field constant, used with FT_Load_Glyph() to indicate that */ + /* the glyph loader should not try to transform the loaded glyph */ + /* image. */ + /* */ +#define FT_LOAD_IGNORE_TRANSFORM 2048 + + + /*************************************************************************/ + /* */ + /* */ + /* FT_LOAD_MONOCHROME */ + /* */ + /* */ + /* Only used with FT_LOAD_RENDER set, it indicates that the returned */ + /* glyph image should be 1-bit monochrome. This really tells the */ + /* glyph loader to use `ft_render_mode_mono' when calling */ + /* FT_Render_Glyph(). */ + /* */ +#define FT_LOAD_MONOCHROME 4096 + + + /*************************************************************************/ + /* */ + /* */ + /* FT_LOAD_LINEAR_DESIGN */ + /* */ + /* */ + /* A bit-field constant, used with FT_Load_Glyph() to indicate that */ + /* the function should return the linearly scaled metrics expressed */ + /* in original font units, instead of the default 16.16 pixel values. */ + /* */ +#define FT_LOAD_LINEAR_DESIGN 8192 + + + /*************************************************************************/ + /* */ + /* */ + /* FT_LOAD_DEFAULT */ + /* */ + /* */ + /* A bit-field constant, used with FT_Load_Glyph() to indicate that */ + /* the function should try to load the glyph normally, i.e., */ + /* embedded bitmaps are favored over outlines, vectors are always */ + /* scaled and grid-fitted. */ + /* */ +#define FT_LOAD_DEFAULT 0 + + + /*************************************************************************/ + /* */ + /* */ + /* FT_Set_Transform */ + /* */ + /* */ + /* A function used to set the transformation that is applied to glyph */ + /* images just before they are converted to bitmaps in a glyph slot */ + /* when FT_Render_Glyph() is called. */ + /* */ + /* */ + /* face :: A handle to the source face object. */ + /* */ + /* */ + /* 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. */ + /* */ + /* */ + /* 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_Sizes() or FT_Set_Pixel_Sizes(). */ + /* */ + FT_EXPORT( void ) FT_Set_Transform( FT_Face face, + FT_Matrix* matrix, + FT_Vector* delta ); + + + /*************************************************************************/ + /* */ + /* */ + /* FT_Render_Mode */ + /* */ + /* */ + /* An enumeration type that lists the render modes supported by the */ + /* FreeType 2 renderer(s). A renderer is in charge of converting a */ + /* glyph image into a bitmap. */ + /* */ + /* */ + /* ft_render_mode_normal :: This is the default render mode; it */ + /* corresponds to 8-bit anti-aliased */ + /* bitmaps, using 256 levels of gray. */ + /* */ + /* ft_render_mode_mono :: This render mode is used to produce 1-bit */ + /* monochrome bitmaps. */ + /* */ + /* */ + /* There is no render mode to produce 8-bit `monochrome' bitmaps -- */ + /* you have to make the conversion yourself if you need such things */ + /* (besides, FreeType is not a graphics library). */ + /* */ + /* More modes might appear later for specific display modes (e.g. TV, */ + /* LCDs, etc.). They will be supported through the simple addition */ + /* of a renderer module, with no changes to the rest of the engine. */ + /* */ + typedef enum FT_Render_Mode_ + { + ft_render_mode_normal = 0, + ft_render_mode_mono = 1 + + } FT_Render_Mode; + + + /*************************************************************************/ + /* */ + /* */ + /* FT_Render_Glyph */ + /* */ + /* */ + /* Converts a given glyph image to a bitmap. It does so by */ + /* inspecting the glyph image format, find the relevant renderer, and */ + /* invoke it. */ + /* */ + /* */ + /* slot :: A handle to the glyph slot containing the image to */ + /* convert. */ + /* */ + /* */ + /* 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. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + FT_EXPORT( FT_Error ) FT_Render_Glyph( FT_GlyphSlot slot, + FT_UInt render_mode ); + + + /*************************************************************************/ + /* */ + /* */ + /* FT_Kerning_Mode */ + /* */ + /* */ + /* An enumeration used to specify which kerning values to return in */ + /* FT_Get_Kerning(). */ + /* */ + /* */ + /* 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; + + + /*************************************************************************/ + /* */ + /* */ + /* FT_Get_Kerning */ + /* */ + /* */ + /* Returns the kerning vector between two glyphs of a same face. */ + /* */ + /* */ + /* 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/dimension of the returned */ + /* kerning vector. */ + /* */ + /* */ + /* akerning :: 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 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 ); + + + /*************************************************************************/ + /* */ + /* */ + /* FT_Get_Glyph_Name */ + /* */ + /* */ + /* Retrieves the ASCII name of a given glyph in a face. This only */ + /* works for those faces where FT_HAS_GLYPH_NAME(face) returns true. */ + /* */ + /* */ + /* face :: A handle to a source face object. */ + /* */ + /* glyph_index :: The glyph index. */ + /* */ + /* buffer_max :: The maximal number of bytes available in the */ + /* buffer. */ + /* */ + /* */ + /* buffer :: A pointer to a target buffer where the name will be */ + /* copied to. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + /* */ + /* 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' will be 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 ); + + + /*************************************************************************/ + /* */ + /* */ + /* FT_Select_Charmap */ + /* */ + /* */ + /* Selects a given charmap by its encoding tag (as listed in */ + /* `freetype.h'). */ + /* */ + /* */ + /* face :: A handle to the source face object. */ + /* */ + /* */ + /* encoding :: A handle to the selected charmap. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + /* */ + /* This function will return an error if no charmap in the face */ + /* corresponds to the encoding queried here. */ + /* */ + FT_EXPORT( FT_Error ) FT_Select_Charmap( FT_Face face, + FT_Encoding encoding ); + + + /*************************************************************************/ + /* */ + /* */ + /* FT_Set_Charmap */ + /* */ + /* */ + /* Selects a given charmap for character code to glyph index */ + /* decoding. */ + /* */ + /* */ + /* face :: A handle to the source face object. */ + /* */ + /* */ + /* charmap :: A handle to the selected charmap. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + /* */ + /* This function will return 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 ); + + + /*************************************************************************/ + /* */ + /* */ + /* FT_Get_Char_Index */ + /* */ + /* */ + /* Returns the glyph index of a given character code. This function */ + /* uses a charmap object to do the translation. */ + /* */ + /* */ + /* face :: A handle to the source face object. */ + /* */ + /* charcode :: The character code. */ + /* */ + /* */ + /* The glyph index. 0 means `undefined character code'. */ + /* */ + FT_EXPORT( FT_UInt ) FT_Get_Char_Index( FT_Face face, + FT_ULong charcode ); + + + /*************************************************************************/ + /* */ + /* */ + /* FT_MulDiv */ + /* */ + /* */ + /* 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. */ + /* */ + /* */ + /* a :: The first multiplier. */ + /* b :: The second multiplier. */ + /* c :: The divisor. */ + /* */ + /* */ + /* 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 ); + + + /*************************************************************************/ + /* */ + /* */ + /* FT_MulFix */ + /* */ + /* */ + /* 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. */ + /* */ + /* */ + /* a :: The first multiplier. */ + /* b :: The second multiplier. Use a 16.16 factor here whenever */ + /* possible (see note below). */ + /* */ + /* */ + /* The result of `(a*b)/0x10000'. */ + /* */ + /* */ + /* 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 ); + + + /*************************************************************************/ + /* */ + /* */ + /* FT_DivFix */ + /* */ + /* */ + /* 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. */ + /* */ + /* */ + /* a :: The first multiplier. */ + /* b :: The second multiplier. Use a 16.16 factor here whenever */ + /* possible (see note below). */ + /* */ + /* */ + /* The result of `(a*0x10000)/b'. */ + /* */ + /* */ + /* 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 the old FT_MulDiv64(). */ + /* */ + FT_EXPORT( FT_Long ) FT_DivFix( FT_Long a, + FT_Long b ); + + + /*************************************************************************/ + /* */ + /* */ + /* FT_Vector_Transform */ + /* */ + /* */ + /* Transforms a single vector through a 2x2 matrix. */ + /* */ + /* */ + /* vector :: The target vector to transform. */ + /* */ + /* */ + /* matrix :: A pointer to the source 2x2 matrix. */ + /* */ + /* */ + /* The result is undefined if either `vector' or `matrix' is invalid. */ + /* */ + FT_EXPORT( void ) FT_Vector_Transform( FT_Vector* vec, + FT_Matrix* matrix ); + + /* */ + +FT_END_HEADER + +#endif /* __FREETYPE_H__ */ + + +/* END */ Index: xc/extras/freetype2/include/freetype/ftbbox.h diff -u /dev/null xc/extras/freetype2/include/freetype/ftbbox.h:1.1.1.1 --- /dev/null Mon Dec 18 14:22:29 2000 +++ xc/extras/freetype2/include/freetype/ftbbox.h Fri Dec 8 16:26:15 2000 @@ -0,0 +1,73 @@ +/***************************************************************************/ +/* */ +/* ftbbox.h */ +/* */ +/* FreeType exact bbox computation (specification). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* 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 + +#ifndef FT_BUILD_H +# define FT_BUILD_H +#endif +#include FT_BUILD_H +#include FT_FREETYPE_H + +FT_BEGIN_HEADER + + /*************************************************************************/ + /* */ + /* */ + /* FT_Outline_Get_BBox */ + /* */ + /* */ + /* 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 Bezier arcs are walked over to */ + /* extract their extrema. */ + /* */ + /* */ + /* outline :: A pointer to the source outline. */ + /* */ + /* */ + /* abbox :: The outline's exact bounding box. */ + /* */ + /* */ + /* 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 */ Index: xc/extras/freetype2/include/freetype/ftcache.h diff -u /dev/null xc/extras/freetype2/include/freetype/ftcache.h:1.1.1.1 --- /dev/null Mon Dec 18 14:22:29 2000 +++ xc/extras/freetype2/include/freetype/ftcache.h Fri Dec 8 16:26:15 2000 @@ -0,0 +1,340 @@ +/***************************************************************************/ +/* */ +/* ftcache.h */ +/* */ +/* FreeType Cache subsystem. */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /********* *********/ + /********* WARNING, THIS IS BETA CODE. *********/ + /********* *********/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + +#ifndef __FTCACHE_H__ +#define __FTCACHE_H__ + +#ifndef FT_BUILD_H +# define FT_BUILD_H +#endif +#include FT_BUILD_H +#include FT_GLYPH_H + +FT_BEGIN_HEADER + +#define FT_CACHE_MANAGER_H FT_PUBLIC_FILE(cache/ftcmanag.h) +#define FT_CACHE_IMAGE_H FT_PUBLIC_FILE(cache/ftcimage.h) +#define FT_CACHE_SMALL_BITMAPS_H FT_PUBLIC_FILE(cache/ftcsbits.h) + +#define FT_CACHE_INTERNAL_LRU_H FT_PUBLIC_FILE(cache/ftlru.h) +#define FT_CACHE_INTERNAL_GLYPH_H FT_PUBLIC_FILE(cache/ftcglyph.h) +#define FT_CACHE_INTERNAL_CHUNK_H FT_PUBLIC_FILE(cache/ftcchunk.h) + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** BASIC TYPE DEFINITIONS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* */ + /* FTC_FaceID */ + /* */ + /* */ + /* A generic pointer type that is used to identity face objects. The */ + /* contents of such objects is application-dependent. */ + /* */ + typedef FT_Pointer FTC_FaceID; + + + /*************************************************************************/ + /* */ + /* */ + /* FTC_Face_Requester */ + /* */ + /* */ + /* A callback function provided by client applications. It is used */ + /* to translate a given FTC_FaceID into a new valid FT_Face object. */ + /* */ + /* */ + /* face_id :: The face ID to resolve. */ + /* */ + /* library :: A handle to a FreeType library object. */ + /* */ + /* data :: Application-provided request data. */ + /* */ + /* */ + /* aface :: A new FT_Face handle. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + /* */ + /* 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 ); + + + /*************************************************************************/ + /* */ + /* */ + /* FTC_FontRec */ + /* */ + /* */ + /* 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. */ + /* */ + /* */ + /* 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; + + + /*************************************************************************/ + /* */ + /* */ + /* FTC_Font */ + /* */ + /* */ + /* A simple handle to a FTC_FontRec structure. */ + /* */ + typedef FTC_FontRec* FTC_Font; + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** CACHE MANAGER OBJECT *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* */ + /* FTC_Manager */ + /* */ + /* */ + /* This object is used to cache one or more FT_Face objects, along */ + /* with corresponding FT_Size objects. */ + /* */ + typedef struct FTC_ManagerRec_* FTC_Manager; + + + /*************************************************************************/ + /* */ + /* */ + /* FTC_Manager_New */ + /* */ + /* */ + /* Creates a new cache manager. */ + /* */ + /* */ + /* library :: The parent FreeType library handle to use. */ + /* */ + /* max_faces :: Maximum number of faces to keep alive in manager. */ + /* Use 0 for defaults. */ + /* */ + /* max_sizes :: Maximum number of sizes to keep alive in manager. */ + /* Use 0 for defaults. */ + /* */ + /* max_bytes :: Maximum number of bytes to use for cached data. */ + /* Use 0 for defaults. */ + /* */ + /* 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) */ + /* */ + /* */ + /* amanager :: A handle to a new manager object. 0 in case of */ + /* failure. */ + /* */ + /* */ + /* 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 ); + + + /*************************************************************************/ + /* */ + /* */ + /* FTC_Manager_Reset */ + /* */ + /* */ + /* Empties a given cache manager. This simply gets rid of all the */ + /* currently cached FT_Face & FT_Size objects within the manager. */ + /* */ + /* */ + /* manager :: A handle to the manager. */ + /* */ + FT_EXPORT( void ) FTC_Manager_Reset( FTC_Manager manager ); + + + /*************************************************************************/ + /* */ + /* */ + /* FTC_Manager_Done */ + /* */ + /* */ + /* Destroys a given manager after emptying it. */ + /* */ + /* */ + /* manager :: A handle to the target cache manager object. */ + /* */ + FT_EXPORT( void ) FTC_Manager_Done( FTC_Manager manager ); + + + /*************************************************************************/ + /* */ + /* */ + /* FTC_Manager_Lookup_Face */ + /* */ + /* */ + /* Retrieves the FT_Face object that corresponds to a given face ID */ + /* through a cache manager. */ + /* */ + /* */ + /* manager :: A handle to the cache manager. */ + /* */ + /* face_id :: The ID of the face object. */ + /* */ + /* */ + /* aface :: A handle to the face object. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + /* */ + /* 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_Lookup_Size() 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. */ + /* */ + FT_EXPORT( FT_Error ) FTC_Manager_Lookup_Face( FTC_Manager manager, + FTC_FaceID face_id, + FT_Face *aface ); + + + /*************************************************************************/ + /* */ + /* */ + /* FTC_Manager_Lookup_Size */ + /* */ + /* */ + /* Retrieves the FT_Face & FT_Size objects that correspond to a given */ + /* FTC_SizeID. */ + /* */ + /* */ + /* manager :: A handle to the cache manager. */ + /* */ + /* size_id :: The ID of the `font size' to use. */ + /* */ + /* */ + /* aface :: A pointer to the handle of the face object. Set it to */ + /* zero if you don't need it. */ + /* */ + /* asize :: A pointer to the handle of the size object. Set it to */ + /* zero if you don't need it. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + /* */ + /* The returned FT_Face object is always owned by the manager. You */ + /* should never try to discard it yourself. */ + /* */ + /* 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. */ + /* */ + /* Similarly, the returned FT_Size object is always owned by the */ + /* manager. You should never try to discard it, and never change its */ + /* settings with FT_Set_Pixel_Sizes() or FT_Set_Char_Size()! */ + /* */ + /* The returned size object is the face's current size, which means */ + /* that you can call FT_Load_Glyph() with the face if you need to. */ + /* */ + FT_EXPORT( FT_Error ) FTC_Manager_Lookup_Size( FTC_Manager manager, + FTC_Font font, + FT_Face *aface, + FT_Size *asize ); + + + /* a cache class is used to describe a unique cache type to the manager */ + typedef struct FTC_Cache_Class_ FTC_Cache_Class; + typedef struct FTC_CacheRec_* FTC_Cache; + + + /* this must be used internally for the moment */ + FT_EXPORT( FT_Error ) FTC_Manager_Register_Cache( + FTC_Manager manager, + FTC_Cache_Class* clazz, + FTC_Cache *acache ); + + +FT_END_HEADER + +#endif /* __FTCACHE_H__ */ + + +/* END */ Index: xc/extras/freetype2/include/freetype/fterrors.h diff -u /dev/null xc/extras/freetype2/include/freetype/fterrors.h:1.1.1.1 --- /dev/null Mon Dec 18 14:22:29 2000 +++ xc/extras/freetype2/include/freetype/fterrors.h Fri Dec 8 16:26:15 2000 @@ -0,0 +1,202 @@ +/***************************************************************************/ +/* */ +/* fterrors.h */ +/* */ +/* FreeType error codes (specification). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* This file is used to define the FreeType error enumeration constants. */ + /* It can also be used to create an error message table easily with */ + /* something like */ + /* */ + /* { */ + /* #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 */ + /* } */ + /* */ + /* For C++ it might be necessary to use `extern "C" {' and to define */ + /* FT_NEED_EXTERN_C also. */ + /* */ + /*************************************************************************/ + + +#ifndef __FTERRORS_H__ +#define __FTERRORS_H__ + + +#undef FT_NEED_EXTERN_C + + +#ifndef FT_ERRORDEF + +#define FT_ERRORDEF( e, v, s ) e = v, +#define FT_ERROR_START_LIST enum { +#define FT_ERROR_END_LIST FT_Err_Max }; + +#ifdef __cplusplus +#define FT_NEED_EXTERN_C + extern "C" { +#endif + +#endif /* !FT_ERRORDEF */ + + +#ifdef FT_ERROR_START_LIST + FT_ERROR_START_LIST +#endif + + /* generic errors */ + + FT_ERRORDEF( FT_Err_Ok, 0x0000, \ + "no error" ) + FT_ERRORDEF( FT_Err_Cannot_Open_Resource, 0x0001, \ + "cannot open resource" ) + FT_ERRORDEF( FT_Err_Unknown_File_Format, 0x0002, \ + "unknown file format" ) + FT_ERRORDEF( FT_Err_Invalid_File_Format, 0x0003, \ + "broken file" ) + FT_ERRORDEF( FT_Err_Invalid_Version, 0x0004, \ + "invalid FreeType version" ) + FT_ERRORDEF( FT_Err_Lower_Module_Version, 0x0005, \ + "module version is too low" ) + FT_ERRORDEF( FT_Err_Invalid_Argument, 0x0006, \ + "invalid argument" ) + FT_ERRORDEF( FT_Err_Unimplemented_Feature, 0x0007, \ + "unimplemented feature" ) + + /* glyph/character errors */ + + FT_ERRORDEF( FT_Err_Invalid_Glyph_Index, 0x0010, \ + "invalid glyph index" ) + FT_ERRORDEF( FT_Err_Invalid_Character_Code, 0x0011, \ + "invalid character code" ) + FT_ERRORDEF( FT_Err_Invalid_Glyph_Format, 0x0012, \ + "unsupported glyph image format" ) + FT_ERRORDEF( FT_Err_Cannot_Render_Glyph, 0x0013, \ + "cannot render this glyph format" ) + FT_ERRORDEF( FT_Err_Invalid_Outline, 0x0014, \ + "invalid outline" ) + FT_ERRORDEF( FT_Err_Invalid_Composite, 0x0015, \ + "invalid composite glyph" ) + FT_ERRORDEF( FT_Err_Too_Many_Hints, 0x0016, \ + "too many hints" ) + FT_ERRORDEF( FT_Err_Invalid_Pixel_Size, 0x0017, \ + "invalid pixel size" ) + + /* handle errors */ + + FT_ERRORDEF( FT_Err_Invalid_Handle, 0x0020, \ + "invalid object handle" ) + FT_ERRORDEF( FT_Err_Invalid_Library_Handle, 0x0021, \ + "invalid library handle" ) + FT_ERRORDEF( FT_Err_Invalid_Driver_Handle, 0x0022, \ + "invalid module handle" ) + FT_ERRORDEF( FT_Err_Invalid_Face_Handle, 0x0023, \ + "invalid face handle" ) + FT_ERRORDEF( FT_Err_Invalid_Size_Handle, 0x0024, \ + "invalid size handle" ) + FT_ERRORDEF( FT_Err_Invalid_Slot_Handle, 0x0025, \ + "invalid glyph slot handle" ) + FT_ERRORDEF( FT_Err_Invalid_CharMap_Handle, 0x0026, \ + "invalid charmap handle" ) + FT_ERRORDEF( FT_Err_Invalid_Cache_Handle, 0x0027, \ + "invalid cache manager handle" ) + FT_ERRORDEF( FT_Err_Invalid_Stream_Handle, 0x0028, \ + "invalid stream handle" ) + + /* driver errors */ + + FT_ERRORDEF( FT_Err_Too_Many_Drivers, 0x0030, \ + "too many modules" ) + FT_ERRORDEF( FT_Err_Too_Many_Extensions, 0x0031, \ + "too many extensions" ) + + /* memory errors */ + + FT_ERRORDEF( FT_Err_Out_Of_Memory, 0x0040, \ + "out of memory" ) + FT_ERRORDEF( FT_Err_Unlisted_Object, 0x0041, \ + "unlisted object" ) + + /* stream errors */ + + FT_ERRORDEF( FT_Err_Cannot_Open_Stream, 0x0051, \ + "cannot open stream" ) + FT_ERRORDEF( FT_Err_Invalid_Stream_Seek, 0x0052, \ + "invalid stream seek" ) + FT_ERRORDEF( FT_Err_Invalid_Stream_Skip, 0x0053, \ + "invalid stream skip" ) + FT_ERRORDEF( FT_Err_Invalid_Stream_Read, 0x0054, \ + "invalid stream read" ) + FT_ERRORDEF( FT_Err_Invalid_Stream_Operation, 0x0055, \ + "invalid stream operation" ) + FT_ERRORDEF( FT_Err_Invalid_Frame_Operation, 0x0056, \ + "invalid frame operation" ) + FT_ERRORDEF( FT_Err_Nested_Frame_Access, 0x0057, \ + "nested frame access" ) + FT_ERRORDEF( FT_Err_Invalid_Frame_Read, 0x0058, \ + "invalid frame read" ) + + /* raster errors */ + + FT_ERRORDEF( FT_Err_Raster_Uninitialized, 0x0060, \ + "raster uninitialized" ) + FT_ERRORDEF( FT_Err_Raster_Corrupted, 0x0061, \ + "raster corrupted" ) + FT_ERRORDEF( FT_Err_Raster_Overflow, 0x0062, \ + "raster overflow" ) + FT_ERRORDEF( FT_Err_Raster_Negative_Height, 0x0063, \ + "negative height while rastering" ) + + /* cache errors */ + + FT_ERRORDEF( FT_Err_Too_Many_Caches, 0x0070, \ + "too many registered caches" ) + + /* range 0x400 - 0x4FF is reserved for TrueType specific stuff */ + + /* range 0x500 - 0x5FF is reserved for CFF specific stuff */ + + /* range 0x600 - 0x6FF is reserved for Type1 specific stuff */ + +#ifdef FT_ERROR_END_LIST + FT_ERROR_END_LIST +#endif + + +#undef FT_ERROR_START_LIST +#undef FT_ERROR_END_LIST +#undef FT_ERRORDEF + + +#ifdef FT_NEED_EXTERN_C + } +#endif + +#endif /* __FTERRORS_H__ */ + + +/* END */ Index: xc/extras/freetype2/include/freetype/ftglyph.h diff -u /dev/null xc/extras/freetype2/include/freetype/ftglyph.h:1.1.1.1 --- /dev/null Mon Dec 18 14:22:29 2000 +++ xc/extras/freetype2/include/freetype/ftglyph.h Fri Dec 8 16:26:15 2000 @@ -0,0 +1,438 @@ +/***************************************************************************/ +/* */ +/* ftglyph.h */ +/* */ +/* FreeType convenience functions to handle glyphs (specification). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* 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__ + +#ifndef FT_BUILD_H +# define FT_BUILD_H +#endif +#include FT_BUILD_H +#include FT_FREETYPE_H + +FT_BEGIN_HEADER + + + /* forward declaration to a private type */ + typedef struct FT_Glyph_Class_ FT_Glyph_Class; + + + /*************************************************************************/ + /* */ + /* */ + /* FT_GlyphRec */ + /* */ + /* */ + /* The root glyph structure contains a given glyph image plus its */ + /* advance width in 16.16 fixed float format. */ + /* */ + /* */ + /* 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, *FT_Glyph; + + + /*************************************************************************/ + /* */ + /* */ + /* FT_BitmapGlyphRec */ + /* */ + /* */ + /* A structure used for bitmap glyph images. This really is a */ + /* `sub-class' of `FT_GlyphRec'. */ + /* */ + /* */ + /* 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. */ + /* */ + /* */ + /* You can typecast 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 the 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, *FT_BitmapGlyph; + + + /*************************************************************************/ + /* */ + /* */ + /* FT_OutlineGlyphRec */ + /* */ + /* */ + /* A structure used for outline (vectorial) glyph images. This */ + /* really is a `sub-class' of `FT_GlyphRec'. */ + /* */ + /* */ + /* root :: The root FT_Glyph fields. */ + /* */ + /* outline :: A descriptor for the outline. */ + /* */ + /* */ + /* You can typecast 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, *FT_OutlineGlyph; + + + /*************************************************************************/ + /* */ + /* */ + /* FT_Get_Glyph */ + /* */ + /* */ + /* A function used to extract a glyph image from a slot. */ + /* */ + /* */ + /* slot :: A handle to the source glyph slot. */ + /* */ + /* */ + /* aglyph :: A handle to the glyph object. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + FT_EXPORT( FT_Error ) FT_Get_Glyph( FT_GlyphSlot slot, + FT_Glyph *aglyph ); + + + /*************************************************************************/ + /* */ + /* */ + /* FT_Glyph_Copy */ + /* */ + /* */ + /* A function used to copy a glyph image. */ + /* */ + /* */ + /* source :: A handle to the source glyph object. */ + /* */ + /* */ + /* target :: A handle to the target glyph object. 0 in case of */ + /* error. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + FT_EXPORT( FT_Error ) FT_Glyph_Copy( FT_Glyph source, + FT_Glyph *target ); + + + /*************************************************************************/ + /* */ + /* */ + /* FT_Glyph_Transform */ + /* */ + /* */ + /* Transforms a glyph image if its format is scalable. */ + /* */ + /* */ + /* glyph :: A handle to the target glyph object. */ + /* */ + /* */ + /* 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. */ + /* */ + /* */ + /* FreeType error code (the glyph format is not scalable if it is */ + /* not zero). */ + /* */ + /* */ + /* 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_unscaled = 0, /* return unscaled font units */ + ft_glyph_bbox_subpixels = 0, /* return unfitted 26.6 coordinates */ + ft_glyph_bbox_gridfit = 1, /* return grid-fitted 26.6 coordinates */ + ft_glyph_bbox_truncate = 2, /* return coordinates in integer pixels */ + ft_glyph_bbox_pixels = 3 /* return grid-fitted pixel coordinates */ + }; + + + /*************************************************************************/ + /* */ + /* */ + /* FT_Glyph_Get_CBox */ + /* */ + /* */ + /* Returns a glyph's `control box'. The control box encloses all the */ + /* outline's points, including Bezier control points. Though it */ + /* coincides with the exact bounding box for most glyphs, it can be */ + /* slightly larger in some situations (like when rotating an outline */ + /* which contains Bezier outside arcs). */ + /* */ + /* Computing the control box is very fast, while getting the bounding */ + /* box can take much more time as it needs to walk over all segments */ + /* and arcs in the outline. To get the latter, you can use the */ + /* `ftbbox' component which is dedicated to this single task. */ + /* */ + /* */ + /* glyph :: A handle to the source glyph object. */ + /* */ + /* mode :: The mode which indicates how to interpret the returned */ + /* bounding box values. */ + /* */ + /* */ + /* acbox :: The glyph coordinate bounding box. Coordinates are */ + /* expressed in 1/64th of pixels if it is grid-fitted. */ + /* */ + /* */ + /* 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. */ + /* */ + /* If `bbox_mode' is set to `ft_glyph_bbox_subpixels' the bbox */ + /* coordinates are returned in 26.6 pixels (i.e. 1/64th of pixels). */ + /* */ + /* 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'. */ + /* */ + /* The default value for `bbox_mode' is `ft_glyph_bbox_pixels'. */ + /* */ + FT_EXPORT( void ) FT_Glyph_Get_CBox( FT_Glyph glyph, + FT_UInt bbox_mode, + FT_BBox *acbox ); + + + /*************************************************************************/ + /* */ + /* */ + /* FT_Glyph_To_Bitmap */ + /* */ + /* */ + /* Converts a given glyph object to a bitmap glyph object. */ + /* */ + /* */ + /* the_glyph :: A pointer to a handle to the target glyph. */ + /* */ + /* */ + /* render_mode :: A set of bit flags that describe how the data is */ + /* */ + /* */ + /* 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. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + /* */ + /* The glyph image is translated with the `origin' vector before */ + /* rendering. In case of error, it it translated back to its */ + /* original position and the glyph is left untouched. */ + /* */ + /* The first parameter is a pointer to a 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 will always fail if the glyph's format isn't */ + /* scalable. */ + /* */ + FT_EXPORT( FT_Error ) FT_Glyph_To_Bitmap( FT_Glyph* the_glyph, + FT_ULong render_mode, + FT_Vector* origin, + FT_Bool destroy ); + + + /*************************************************************************/ + /* */ + /* */ + /* FT_Done_Glyph */ + /* */ + /* */ + /* Destroys a given glyph. */ + /* */ + /* */ + /* glyph :: A handle to the target glyph object. */ + /* */ + FT_EXPORT( void ) FT_Done_Glyph( FT_Glyph glyph ); + + + /* other helpful functions */ + + + /*************************************************************************/ + /* */ + /* */ + /* FT_Matrix_Multiply */ + /* */ + /* */ + /* Performs the matrix operation `b = a*b'. */ + /* */ + /* */ + /* a :: A pointer to matrix `a'. */ + /* */ + /* */ + /* b :: A pointer to matrix `b'. */ + /* */ + /* */ + /* The result is undefined if either `a' or `b' is zero. */ + /* */ + FT_EXPORT( void ) FT_Matrix_Multiply( FT_Matrix* a, + FT_Matrix* b ); + + + /*************************************************************************/ + /* */ + /* */ + /* FT_Matrix_Invert */ + /* */ + /* */ + /* Inverts a 2x2 matrix. Returns an error if it can't be inverted. */ + /* */ + /* */ + /* matrix :: A pointer to the target matrix. Remains untouched in */ + /* case of error. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + FT_EXPORT( FT_Error ) FT_Matrix_Invert( FT_Matrix* matrix ); + + +FT_END_HEADER + +#endif /* __FTGLYPH_H__ */ + + +/* END */ Index: xc/extras/freetype2/include/freetype/ftimage.h diff -u /dev/null xc/extras/freetype2/include/freetype/ftimage.h:1.1.1.1 --- /dev/null Mon Dec 18 14:22:29 2000 +++ xc/extras/freetype2/include/freetype/ftimage.h Fri Dec 8 16:26:15 2000 @@ -0,0 +1,1004 @@ +/***************************************************************************/ +/* */ +/* ftimage.h */ +/* */ +/* FreeType glyph image formats and default raster interface */ +/* (specification). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + /*************************************************************************/ + /* */ + /* Note: A `raster' is simply a scan-line converter, used to render */ + /* FT_Outlines into FT_Bitmaps. */ + /* */ + /*************************************************************************/ + + +#ifndef __FTIMAGE_H__ +#define __FTIMAGE_H__ + + +#ifndef FT_BUILD_H +# define FT_BUILD_H +#endif +#include FT_BUILD_H + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* */ + /* 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 26.6 fixed float pixel */ + /* coordinates. */ + /* */ + typedef signed long FT_Pos; + + + /*************************************************************************/ + /* */ + /* */ + /* FT_Vector */ + /* */ + /* */ + /* A simple structure used to store a 2D vector; coordinates are of */ + /* the FT_Pos type. */ + /* */ + /* */ + /* x :: The horizontal coordinate. */ + /* y :: The vertical coordinate. */ + /* */ + typedef struct FT_Vector_ + { + FT_Pos x; + FT_Pos y; + + } FT_Vector; + + + /*************************************************************************/ + /* */ + /* */ + /* 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. */ + /* */ + /* */ + /* ft_pixel_mode_mono :: A monochrome bitmap (1 bit/pixel). */ + /* */ + /* ft_pixel_mode_grays :: An 8-bit gray-levels bitmap. Note that the */ + /* total number of gray levels is given in the */ + /* `num_grays' field of the FT_Bitmap */ + /* structure. */ + /* */ + /* ft_pixel_mode_pal2 :: A 2-bit paletted bitmap. */ + /* Currently unused by FreeType. */ + /* */ + /* ft_pixel_mode_pal4 :: A 4-bit paletted bitmap. */ + /* Currently unused by FreeType. */ + /* */ + /* ft_pixel_mode_pal8 :: An 8-bit paletted bitmap. */ + /* Currently unused by FreeType. */ + /* */ + /* ft_pixel_mode_rgb15 :: A 15-bit RGB bitmap. Uses 5:5:5 encoding. */ + /* Currently unused by FreeType. */ + /* */ + /* ft_pixel_mode_rgb16 :: A 16-bit RGB bitmap. Uses 5:6:5 encoding. */ + /* Currently unused by FreeType. */ + /* */ + /* ft_pixel_mode_rgb24 :: A 24-bit RGB bitmap. */ + /* Currently unused by FreeType. */ + /* */ + /* ft_pixel_mode_rgb32 :: A 32-bit RGB bitmap. */ + /* Currently unused by FreeType. */ + /* */ + /* */ + /* Some anti-aliased bitmaps might be embedded in TrueType fonts */ + /* using formats pal2 or pal4, though no fonts presenting those have */ + /* been found to date. */ + /* */ + typedef enum FT_Pixel_Mode_ + { + ft_pixel_mode_none = 0, + ft_pixel_mode_mono, + ft_pixel_mode_grays, + ft_pixel_mode_pal2, + ft_pixel_mode_pal4, + ft_pixel_mode_pal8, + ft_pixel_mode_rgb15, + ft_pixel_mode_rgb16, + ft_pixel_mode_rgb24, + ft_pixel_mode_rgb32, + + ft_pixel_mode_max /* do not remove */ + + } FT_Pixel_Mode; + + + /*************************************************************************/ + /* */ + /* */ + /* FT_Palette_Mode */ + /* */ + /* */ + /* An enumeration type used to describe the format of a bitmap */ + /* palette, used with ft_pixel_mode_pal4 and ft_pixel_mode_pal8. */ + /* */ + /* */ + /* 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. */ + /* */ + /* */ + /* 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; + + + /*************************************************************************/ + /* */ + /* */ + /* 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. */ + /* */ + /* */ + /* 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_grays'; it gives the number of gray */ + /* levels used in the bitmap. */ + /* */ + /* pixel_mode :: The pixel_mode, i.e., how pixel bits are stored. */ + /* */ + /* palette_mode :: This field is only used with paletted pixel modes; */ + /* it indicates how the palette is stored. */ + /* */ + /* palette :: A typeless pointer to the bitmap palette; only */ + /* used for paletted pixel modes. */ + /* */ + /* */ + /* For now, the only pixel mode supported by FreeType are mono and */ + /* grays. However, drivers might be added in the future to support */ + /* more `colorful' options. */ + /* */ + /* When using pixel modes pal2, pal4 and pal8 with a void `palette' */ + /* field, a gray pixmap with respectively 4, 16, and 256 levels of */ + /* gray is assumed. This, in order to be compatible with some */ + /* embedded bitmap formats defined in the TrueType specification. */ + /* */ + /* Note that no font was found presenting such embedded bitmaps, so */ + /* this is currently completely unhandled by the library. */ + /* */ + 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; + + + /*************************************************************************/ + /* */ + /* */ + /* FT_Outline */ + /* */ + /* */ + /* This structure is used to describe an outline to the scan-line */ + /* converter. */ + /* */ + /* */ + /* 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 */ + /* giving each outline point's type. If bit 0 is */ + /* unset, the point is 'off' the curve, i.e. a Bezier */ + /* control point, while it is `on' when set. */ + /* */ + /* Bit 1 is meaningful for `off' points only. If set, */ + /* it indicates a third-order Bezier 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; + + + /*************************************************************************/ + /* */ + /* */ + /* FT_Outline_Flags */ + /* */ + /* */ + /* A simple type used to enumerates the flags in an outline's */ + /* `outline_flags' field. */ + /* */ + /* */ + /* 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. However, it is very */ + /* important for the auto-hinter. */ + /* */ + /* 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. */ + /* */ + typedef enum FT_Outline_Flags_ + { + ft_outline_none = 0, + ft_outline_owner = 1, + ft_outline_even_odd_fill = 2, + ft_outline_reverse_fill = 4, + ft_outline_ignore_dropouts = 8, + ft_outline_high_precision = 256, + ft_outline_single_pass = 512 + + } FT_Outline_Flags; + + +#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 ) + + + /*************************************************************************/ + /* */ + /* */ + /* FT_Outline_MoveTo_Func */ + /* */ + /* */ + /* 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. */ + /* */ + /* */ + /* 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. */ + /* */ + /* */ + /* Error code. 0 means success. */ + /* */ + typedef int (*FT_Outline_MoveTo_Func)( FT_Vector* to, + void* user ); + + + /*************************************************************************/ + /* */ + /* */ + /* FT_Outline_LineTo_Func */ + /* */ + /* */ + /* 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. */ + /* */ + /* */ + /* 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. */ + /* */ + /* */ + /* Error code. 0 means success. */ + /* */ + typedef int (*FT_Outline_LineTo_Func)( FT_Vector* to, + void* user ); + + + /*************************************************************************/ + /* */ + /* */ + /* FT_Outline_ConicTo_Func */ + /* */ + /* */ + /* 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 Bezier arc in */ + /* the outline. */ + /* */ + /* */ + /* 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. */ + /* */ + /* */ + /* Error code. 0 means success. */ + /* */ + typedef int (*FT_Outline_ConicTo_Func)( FT_Vector* control, + FT_Vector* to, + void* user ); + + + /*************************************************************************/ + /* */ + /* */ + /* FT_Outline_CubicTo_Func */ + /* */ + /* */ + /* 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 Bezier arc. */ + /* */ + /* */ + /* control1 :: A pointer to the first Bezier control point. */ + /* */ + /* control2 :: A pointer to the second Bezier control point. */ + /* */ + /* to :: A pointer to the target end point. */ + /* */ + /* user :: A typeless pointer which is passed from the caller of */ + /* the decomposition function. */ + /* */ + /* */ + /* Error code. 0 means success. */ + /* */ + typedef int (*FT_Outline_CubicTo_Func)( FT_Vector* control1, + FT_Vector* control2, + FT_Vector* to, + void* user ); + + + /*************************************************************************/ + /* */ + /* */ + /* FT_Outline_Funcs */ + /* */ + /* */ + /* A structure to hold various function pointers used during outline */ + /* decomposition in order to emit segments, conic, and cubic Beziers, */ + /* as well as `move to' and `close to' operations. */ + /* */ + /* */ + /* move_to :: The `move to' emitter. */ + /* */ + /* line_to :: The segment emitter. */ + /* */ + /* conic_to :: The second-order Bezier arc emitter. */ + /* */ + /* cubic_to :: The third-order Bezier arc emitter. */ + /* */ + /* shift :: The shift that is applied to coordinates before they */ + /* are sent to the emitter. */ + /* */ + /* delta :: The delta that is applied to coordinates before they */ + /* are sent to the emitter, but after the shift. */ + /* */ + /* */ + /* 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_MoveTo_Func move_to; + FT_Outline_LineTo_Func line_to; + FT_Outline_ConicTo_Func conic_to; + FT_Outline_CubicTo_Func cubic_to; + + int shift; + FT_Pos delta; + + } FT_Outline_Funcs; + + + /*************************************************************************/ + /* */ + /* */ + /* FT_IMAGE_TAG */ + /* */ + /* */ + /* This macro converts four letter tags into an unsigned long. */ + /* */ +#define FT_IMAGE_TAG( _x1, _x2, _x3, _x4 ) \ + ( ( (unsigned long)_x1 << 24 ) | \ + ( (unsigned long)_x2 << 16 ) | \ + ( (unsigned long)_x3 << 8 ) | \ + (unsigned long)_x4 ) + + + /*************************************************************************/ + /* */ + /* */ + /* 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. */ + /* */ + /* */ + /* ft_glyph_format_composite :: The glyph image is a composite of */ + /* several other images. This glyph */ + /* format is _only_ used with the */ + /* FT_LOAD_FLAG_NO_RECURSE flag (XXX: */ + /* Which is currently unimplemented). */ + /* */ + /* ft_glyph_format_bitmap :: The glyph image is a bitmap, and can */ + /* be described as a FT_Bitmap. */ + /* */ + /* ft_glyph_format_outline :: The glyph image is a vectorial image */ + /* made of bezier control points, and */ + /* can be described as a FT_Outline. */ + /* */ + /* ft_glyph_format_plotter :: The glyph image is a vectorial image */ + /* made of plotter lines (some T1 fonts */ + /* like Hershey contain glyph in this */ + /* format). */ + /* */ + typedef enum FT_Glyph_Format_ + { + ft_glyph_format_none = 0, + ft_glyph_format_composite = FT_IMAGE_TAG( 'c', 'o', 'm', 'p' ), + ft_glyph_format_bitmap = FT_IMAGE_TAG( 'b', 'i', 't', 's' ), + ft_glyph_format_outline = FT_IMAGE_TAG( 'o', 'u', 't', 'l' ), + ft_glyph_format_plotter = FT_IMAGE_TAG( 'p', 'l', 'o', 't' ) + + } FT_Glyph_Format; + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** 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. */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* */ + /* FT_Raster */ + /* */ + /* */ + /* 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; + + + /*************************************************************************/ + /* */ + /* */ + /* FT_Span */ + /* */ + /* */ + /* A structure used to model a single span of gray (or black) pixels */ + /* when rendering a monochrome or anti-aliased bitmap. */ + /* */ + /* */ + /* 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. */ + /* */ + /* */ + /* This structure is used by the span drawing callback type named */ + /* FT_Raster_Span_Func(), which takes the y-coordinate of the span as */ + /* a parameter. */ + /* */ + /* The coverage value is always between 0 and 255, even if the number */ + /* of gray levels have been set through FT_Set_Gray_Levels(). */ + /* */ + typedef struct FT_Span_ + { + short x; + unsigned short len; + unsigned char coverage; + + } FT_Span; + + + /*************************************************************************/ + /* */ + /* */ + /* FT_Raster_Span_Func */ + /* */ + /* */ + /* 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. */ + /* */ + /* */ + /* 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. */ + /* */ + /* */ + /* 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 */ + /* will be 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_Raster_Span_Func)( int y, + int count, + FT_Span* spans, + void* user ); + + + /*************************************************************************/ + /* */ + /* */ + /* FT_Raster_BitTest_Func */ + /* */ + /* */ + /* 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. */ + /* */ + /* */ + /* y :: The pixel's y-coordinate. */ + /* */ + /* x :: The pixel's x-coordinate. */ + /* */ + /* user :: User-supplied data that is passed to the callback. */ + /* */ + /* */ + /* 1 if the pixel is `set', 0 otherwise. */ + /* */ + typedef int (*FT_Raster_BitTest_Func)( int y, + int x, + void* user ); + + + /*************************************************************************/ + /* */ + /* */ + /* FT_Raster_BitSet_Func */ + /* */ + /* */ + /* 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. */ + /* */ + /* */ + /* y :: The pixel's y-coordinate. */ + /* */ + /* x :: The pixel's x-coordinate. */ + /* */ + /* user :: User-supplied data that is passed to the callback. */ + /* */ + /* */ + /* 1 if the pixel is `set', 0 otherwise. */ + /* */ + typedef void (*FT_Raster_BitSet_Func)( int y, + int x, + void* user ); + + + /*************************************************************************/ + /* */ + /* */ + /* FT_Raster_Flag */ + /* */ + /* */ + /* An enumeration to list the bit flags as used in the `flags' field */ + /* of a FT_Raster_Params structure. */ + /* */ + /* */ + /* ft_raster_flag_default :: This value is 0. */ + /* */ + /* ft_raster_flag_aa :: Requests the rendering of an */ + /* anti-aliased glyph bitmap. If unset, a */ + /* monchrome bitmap will be rendered. */ + /* */ + /* ft_raster_flag_direct :: Requests direct rendering over the */ + /* target bitmap. Direct rendering uses */ + /* user-provided callbacks in order to */ + /* perform direct drawing or composition */ + /* over an existing bitmap. If this bit is */ + /* unset, the content of the target bitmap */ + /* *must be zeroed*! */ + /* */ + typedef enum + { + ft_raster_flag_default = 0, + ft_raster_flag_aa = 1, + ft_raster_flag_direct = 2 + + } FT_Raster_Flag; + + + /*************************************************************************/ + /* */ + /* */ + /* FT_Raster_Params */ + /* */ + /* */ + /* A structure to hold the arguments used by a raster's render */ + /* function. */ + /* */ + /* */ + /* 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. */ + /* */ + /* bit_set :: The bit set callback. */ + /* */ + /* user :: User-supplied data that is passed to each drawing */ + /* callback. */ + /* */ + /* */ + /* 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 */ + /* will be 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_ + { + FT_Bitmap* target; + void* source; + int flags; + FT_Raster_Span_Func gray_spans; + FT_Raster_Span_Func black_spans; + FT_Raster_BitTest_Func bit_test; + FT_Raster_BitSet_Func bit_set; + void* user; + + } FT_Raster_Params; + + + /*************************************************************************/ + /* */ + /* */ + /* FT_Raster_New_Func */ + /* */ + /* */ + /* A function used to create a new raster object. */ + /* */ + /* */ + /* memory :: A handle to the memory allocator. */ + /* */ + /* */ + /* raster :: A handle to the new raster object. */ + /* */ + /* */ + /* Error code. 0 means success. */ + /* */ + /* */ + /* 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 a FT_Memory, 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_New_Func)( void* memory, + FT_Raster* raster ); + + + /*************************************************************************/ + /* */ + /* */ + /* FT_Raster_Done_Func */ + /* */ + /* */ + /* A function used to destroy a given raster object. */ + /* */ + /* */ + /* raster :: A handle to the raster object. */ + /* */ + typedef void (*FT_Raster_Done_Func)( FT_Raster raster ); + + + /*************************************************************************/ + /* */ + /* */ + /* FT_Raster_Reset_Func */ + /* */ + /* */ + /* 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. */ + /* */ + /* */ + /* 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. */ + /* */ + /* */ + /* 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_Reset_Func)( FT_Raster raster, + unsigned char* pool_base, + unsigned long pool_size ); + + + /*************************************************************************/ + /* */ + /* */ + /* FT_Raster_Set_Mode_Func */ + /* */ + /* */ + /* 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. */ + /* */ + /* */ + /* 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_Set_Mode_Func)( FT_Raster raster, + unsigned long mode, + void* args ); + + + /*************************************************************************/ + /* */ + /* */ + /* FT_Raster_Render_Func */ + /* */ + /* */ + /* Invokes a given raster to scan-convert a given glyph image into a */ + /* target bitmap. */ + /* */ + /* */ + /* raster :: A handle to the raster object. */ + /* */ + /* params :: A pointer to a FT_Raster_Params structure used to store */ + /* the rendering parameters. */ + /* */ + /* */ + /* Error code. 0 means success. */ + /* */ + /* */ + /* 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_Render_Func)( FT_Raster raster, + FT_Raster_Params* params ); + + + /*************************************************************************/ + /* */ + /* */ + /* FT_Raster_Funcs */ + /* */ + /* */ + /* A structure used to describe a given raster class to the library. */ + /* */ + /* */ + /* 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_New_Func raster_new; + FT_Raster_Reset_Func raster_reset; + FT_Raster_Set_Mode_Func raster_set_mode; + FT_Raster_Render_Func raster_render; + FT_Raster_Done_Func raster_done; + + } FT_Raster_Funcs; + + +FT_END_HEADER + + +#endif /* __FTIMAGE_H__ */ + + +/* END */ Index: xc/extras/freetype2/include/freetype/ftlist.h diff -u /dev/null xc/extras/freetype2/include/freetype/ftlist.h:1.1.1.1 --- /dev/null Mon Dec 18 14:22:30 2000 +++ xc/extras/freetype2/include/freetype/ftlist.h Fri Dec 8 16:26:15 2000 @@ -0,0 +1,222 @@ +/***************************************************************************/ +/* */ +/* ftlist.c */ +/* */ +/* Generic list support for FreeType (specification). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* This file implements functions relative to list processing. Its */ + /* data structures are defined in `freetype.h'. */ + /* */ + /*************************************************************************/ + + +#ifndef __FTLIST_H__ +#define __FTLIST_H__ + +#ifndef FT_BUILD_H +# define FT_BUILD_H +#endif +#include FT_BUILD_H +#include FT_FREETYPE_H + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* */ + /* FT_List_Find */ + /* */ + /* */ + /* Finds the list node for a given listed object. */ + /* */ + /* */ + /* list :: A pointer to the parent list. */ + /* data :: The address of the listed object. */ + /* */ + /* */ + /* List node. NULL if it wasn't found. */ + /* */ + FT_EXPORT( FT_ListNode ) FT_List_Find( FT_List list, + void* data ); + + + /*************************************************************************/ + /* */ + /* */ + /* FT_List_Add */ + /* */ + /* */ + /* Appends an element to the end of a list. */ + /* */ + /* */ + /* list :: A pointer to the parent list. */ + /* node :: The node to append. */ + /* */ + FT_EXPORT( void ) FT_List_Add( FT_List list, + FT_ListNode node ); + + + /*************************************************************************/ + /* */ + /* */ + /* FT_List_Insert */ + /* */ + /* */ + /* Inserts an element at the head of a list. */ + /* */ + /* */ + /* list :: A pointer to parent list. */ + /* node :: The node to insert. */ + /* */ + FT_EXPORT( void ) FT_List_Insert( FT_List list, + FT_ListNode node ); + + + /*************************************************************************/ + /* */ + /* */ + /* FT_List_Remove */ + /* */ + /* */ + /* Removes a node from a list. This function doesn't check whether */ + /* the node is in the list! */ + /* */ + /* */ + /* node :: The node to remove. */ + /* */ + /* */ + /* list :: A pointer to the parent list. */ + /* */ + FT_EXPORT( void ) FT_List_Remove( FT_List list, + FT_ListNode node ); + + + /*************************************************************************/ + /* */ + /* */ + /* FT_List_Up */ + /* */ + /* */ + /* Moves a node to the head/top of a list. Used to maintain LRU */ + /* lists. */ + /* */ + /* */ + /* list :: A pointer to the parent list. */ + /* node :: The node to move. */ + /* */ + FT_EXPORT( void ) FT_List_Up( FT_List list, + FT_ListNode node ); + + + /*************************************************************************/ + /* */ + /* */ + /* FT_List_Iterator */ + /* */ + /* */ + /* An FT_List iterator function which is called during a list parse */ + /* by FT_List_Iterate(). */ + /* */ + /* */ + /* 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 ); + + + /*************************************************************************/ + /* */ + /* */ + /* FT_List_Iterate */ + /* */ + /* */ + /* 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. */ + /* */ + /* */ + /* list :: A handle to the list. */ + /* iterator :: An interator function, called on each node of the */ + /* list. */ + /* user :: A user-supplied field which is passed as the second */ + /* argument to the iterator. */ + /* */ + /* */ + /* 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 ); + + + /*************************************************************************/ + /* */ + /* */ + /* FT_List_Destructor */ + /* */ + /* */ + /* An FT_List iterator function which is called during a list */ + /* finalization by FT_List_Finalize() to destroy all elements in a */ + /* given list. */ + /* */ + /* */ + /* 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 ); + + + /*************************************************************************/ + /* */ + /* */ + /* FT_List_Finalize */ + /* */ + /* */ + /* Destroys all elements in the list as well as the list itself. */ + /* */ + /* */ + /* 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 */ Index: xc/extras/freetype2/include/freetype/ftmac.h diff -u /dev/null xc/extras/freetype2/include/freetype/ftmac.h:1.1.1.1 --- /dev/null Mon Dec 18 14:22:30 2000 +++ xc/extras/freetype2/include/freetype/ftmac.h Fri Dec 8 16:26:15 2000 @@ -0,0 +1,81 @@ +/***************************************************************************/ +/* */ +/* ftmac.h */ +/* */ +/* Additional Mac-specific API. */ +/* */ +/* Copyright 1996-2000 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 and after the */ +/* Mac-specific header (or any other Mac header that */ +/* includes ); we use Handle type. */ +/* */ +/***************************************************************************/ + + +#ifndef __FT_MAC_H__ +#define __FT_MAC_H__ + + +#ifdef __cplusplus + extern "C" { +#endif + + + /*************************************************************************/ + /* */ + /* */ + /* FT_New_Face_From_FOND */ + /* */ + /* */ + /* Creates a new face object from an FOND resource. */ + /* */ + /* */ + /* library :: A handle to the library resource. */ + /* */ + /* */ + /* fond :: An FOND resource. */ + /* */ + /* face_index :: Only supported for the -1 `sanity check' special */ + /* case. */ + /* */ + /* */ + /* aface :: A handle to a new face object. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + /* */ + /* This function can be used to create FT_Face abjects from fonts */ + /* that are installed in the system like so: */ + /* */ + /* 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 ); + + +#ifdef __cplusplus + } +#endif + + +#endif /* __FT_MAC_H__ */ + + +/* END */ Index: xc/extras/freetype2/include/freetype/ftmm.h diff -u /dev/null xc/extras/freetype2/include/freetype/ftmm.h:1.1.1.1 --- /dev/null Mon Dec 18 14:22:30 2000 +++ xc/extras/freetype2/include/freetype/ftmm.h Fri Dec 8 16:26:15 2000 @@ -0,0 +1,176 @@ +/***************************************************************************/ +/* */ +/* ftmm.h */ +/* */ +/* FreeType Multiple Master font interface (specification). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTMM_H__ +#define __FTMM_H__ + +#ifndef FT_BUILD_H +# define FT_BUILD_H +#endif +#include FT_BUILD_H +#include FT_TYPE1_TABLES_H + +FT_BEGIN_HEADER + + /*************************************************************************/ + /* */ + /* */ + /* FT_MM_Axis */ + /* */ + /* */ + /* A simple structure used to model a given axis in design space for */ + /* Multiple Masters fonts. */ + /* */ + /* */ + /* 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; + + + /*************************************************************************/ + /* */ + /* */ + /* FT_Multi_Master */ + /* */ + /* */ + /* A structure used to model the axes and space of a Multiple Masters */ + /* font. */ + /* */ + /* */ + /* num_axis :: Number of axes. Cannot exceed 4. */ + /* */ + /* num_designs :: Number of designs; should ne 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; + + + typedef FT_Error (*FT_Get_MM_Func)( FT_Face face, + FT_Multi_Master* master ); + + typedef FT_Error (*FT_Set_MM_Design_Func)( FT_Face face, + FT_UInt num_coords, + FT_Long* coords ); + + typedef FT_Error (*FT_Set_MM_Blend_Func)( FT_Face face, + FT_UInt num_coords, + FT_Long* coords ); + + + /*************************************************************************/ + /* */ + /* */ + /* FT_Get_Multi_Master */ + /* */ + /* */ + /* Retrieves the Multiple Master descriptor of a given font. */ + /* */ + /* */ + /* face :: A handle to the source face. */ + /* */ + /* */ + /* amaster :: The Multiple Masters descriptor. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + FT_EXPORT( FT_Error ) FT_Get_Multi_Master( FT_Face face, + FT_Multi_Master *amaster ); + + + /*************************************************************************/ + /* */ + /* */ + /* FT_Set_MM_Design_Coordinates */ + /* */ + /* */ + /* For Multiple Masters fonts, choose an interpolated font design */ + /* through design coordinates. */ + /* */ + /* */ + /* face :: A handle to the source face. */ + /* */ + /* */ + /* num_coords :: The number of design coordinates (must be equal to */ + /* the number of axes in the font). */ + /* */ + /* coords :: An array of design coordinates. */ + /* */ + /* */ + /* 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 ); + + + /*************************************************************************/ + /* */ + /* */ + /* FT_Set_MM_Blend_Coordinates */ + /* */ + /* */ + /* For Multiple Masters fonts, choose an interpolated font design */ + /* through normalized blend coordinates. */ + /* */ + /* */ + /* face :: A handle to the source face. */ + /* */ + /* */ + /* 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). */ + /* */ + /* */ + /* 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 ); + + +FT_END_HEADER + +#endif /* __FTMM_H__ */ + + +/* END */ Index: xc/extras/freetype2/include/freetype/ftmodule.h diff -u /dev/null xc/extras/freetype2/include/freetype/ftmodule.h:1.1.1.1 --- /dev/null Mon Dec 18 14:22:30 2000 +++ xc/extras/freetype2/include/freetype/ftmodule.h Fri Dec 8 16:26:15 2000 @@ -0,0 +1,274 @@ +/***************************************************************************/ +/* */ +/* ftmodule.h */ +/* */ +/* FreeType modules public interface (specification). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTMODULE_H__ +#define __FTMODULE_H__ + +#ifndef FT_BUILD_H +# define FT_BUILD_H +#endif +#include FT_BUILD_H +#include FT_FREETYPE_H + +FT_BEGIN_HEADER + + /* module bit flags */ + typedef enum FT_Module_Flags_ + { + ft_module_font_driver = 1, /* this module is a font driver */ + ft_module_renderer = 2, /* this module is a renderer */ + ft_module_hinter = 4, /* this module is a glyph hinter */ + ft_module_styler = 8, /* this module is a styler */ + + ft_module_driver_scalable = 0x100, /* the driver supports scalable */ + /* fonts */ + ft_module_driver_no_outlines = 0x200, /* the driver does not support */ + /* vector outlines */ + ft_module_driver_has_hinter = 0x400 /* the driver provides its own */ + /* hinter */ + + } FT_Module_Flags; + + + typedef void (*FT_Module_Interface)( void ); + + 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 ); + + + /*************************************************************************/ + /* */ + /* */ + /* FT_Module_Class */ + /* */ + /* */ + /* The module class descriptor. */ + /* */ + /* */ + /* 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 */ + /* (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_Int 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; + + + /*************************************************************************/ + /* */ + /* */ + /* FT_Add_Module */ + /* */ + /* */ + /* Adds a new module to a given library instance. */ + /* */ + /* */ + /* library :: A handle to the library object. */ + /* */ + /* */ + /* clazz :: A pointer to class descriptor for the module. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + /* */ + /* 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 ); + + + /*************************************************************************/ + /* */ + /* */ + /* FT_Get_Module */ + /* */ + /* */ + /* Finds a module by its name. */ + /* */ + /* */ + /* library :: A handle to the library object. */ + /* */ + /* module_name :: The module's name (as an ASCII string). */ + /* */ + /* */ + /* A module handle. 0 if none was found. */ + /* */ + /* */ + /* You should better be familiar with FreeType internals to know */ + /* which module to look for :-) */ + /* */ + FT_EXPORT( FT_Module ) FT_Get_Module( FT_Library library, + const char* module_name ); + + + /*************************************************************************/ + /* */ + /* */ + /* FT_Remove_Module */ + /* */ + /* */ + /* Removes a given module from a library instance. */ + /* */ + /* */ + /* library :: A handle to a library object. */ + /* */ + /* */ + /* module :: A handle to a module object. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + /* */ + /* 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 ); + + + /*************************************************************************/ + /* */ + /* */ + /* FT_New_Library */ + /* */ + /* */ + /* 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. */ + /* */ + /* */ + /* memory :: A handle to the original memory object. */ + /* */ + /* */ + /* alibrary :: A pointer to handle of a new library object. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + FT_EXPORT( FT_Error ) FT_New_Library( FT_Memory memory, + FT_Library *alibrary ); + + + /*************************************************************************/ + /* */ + /* */ + /* FT_Done_Library */ + /* */ + /* */ + /* Discards a given library object. This closes all drivers and */ + /* discards all resource objects. */ + /* */ + /* */ + /* library :: A handle to the target library. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + FT_EXPORT( FT_Error ) FT_Done_Library( FT_Library library ); + + + + typedef void (*FT_DebugHook_Func)( void* arg ); + + + /*************************************************************************/ + /* */ + /* */ + /* FT_Set_Debug_Hook */ + /* */ + /* */ + /* Sets a debug hook function for debugging the interpreter of a font */ + /* format. */ + /* */ + /* */ + /* library :: A handle to the library object. */ + /* */ + /* */ + /* 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. */ + /* */ + /* */ + /* Currently, four debug hook slots are available, but only two (for */ + /* the TrueType and the Type 1 interpreter) are defined. */ + /* */ + FT_EXPORT( void ) FT_Set_Debug_Hook( FT_Library library, + FT_UInt hook_index, + FT_DebugHook_Func debug_hook ); + + + + /*************************************************************************/ + /* */ + /* */ + /* FT_Add_Default_Modules */ + /* */ + /* */ + /* 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). */ + /* */ + /* */ + /* library :: A handle to a new library object. */ + /* */ + FT_EXPORT( void ) FT_Add_Default_Modules( FT_Library library ); + + +FT_END_HEADER + +#endif /* __FTMODULE_H__ */ + + +/* END */ Index: xc/extras/freetype2/include/freetype/ftnames.h diff -u /dev/null xc/extras/freetype2/include/freetype/ftnames.h:1.1.1.1 --- /dev/null Mon Dec 18 14:22:30 2000 +++ xc/extras/freetype2/include/freetype/ftnames.h Fri Dec 8 16:26:17 2000 @@ -0,0 +1,129 @@ +/***************************************************************************/ +/* */ +/* ftnames.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-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. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTNAMES_H__ +#define __FTNAMES_H__ + +#ifndef FT_BUILD_H +# define FT_BUILD_H +#endif +#include FT_BUILD_H +#include FT_FREETYPE_H + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* */ + /* FT_SfntName */ + /* */ + /* */ + /* A structure used to model an SFNT `name' table entry. */ + /* */ + /* */ + /* 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 this string is in */ + /* Pascal convention, i.e., the string hasn't a final */ + /* null byte. */ + /* */ + /* string_len :: The length of `string' in bytes. */ + /* */ + /* */ + /* 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. */ + /* */ + 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; + + + /*************************************************************************/ + /* */ + /* */ + /* FT_Get_Sfnt_Name_Count */ + /* */ + /* */ + /* Retrieves the number of name strings in the SFNT `name' table. */ + /* */ + /* */ + /* face :: A handle to the source face. */ + /* */ + /* */ + /* The number of strings in the `name' table. */ + /* */ + FT_EXPORT( FT_UInt ) FT_Get_Sfnt_Name_Count( FT_Face face ); + + + /*************************************************************************/ + /* */ + /* */ + /* FT_Get_Sfnt_Name */ + /* */ + /* */ + /* Retrieves a string of the SFNT `name' table for a given index. */ + /* */ + /* */ + /* face :: A handle to the source face. */ + /* */ + /* index :: The index of the `name' string. */ + /* */ + /* */ + /* aname :: The indexed FT_SfntName structure. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + /* */ + /* 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 index, + FT_SfntName *aname ); + + +FT_END_HEADER + +#endif /* __FTNAMES_H__ */ + + +/* END */ Index: xc/extras/freetype2/include/freetype/ftoutln.h diff -u /dev/null xc/extras/freetype2/include/freetype/ftoutln.h:1.1.1.1 --- /dev/null Mon Dec 18 14:22:30 2000 +++ xc/extras/freetype2/include/freetype/ftoutln.h Fri Dec 8 16:26:17 2000 @@ -0,0 +1,324 @@ +/***************************************************************************/ +/* */ +/* ftoutln.h */ +/* */ +/* Support for the FT_Outline type used to store glyph shapes of */ +/* most scalable font formats (specification). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTOUTLN_H__ +#define __FTOUTLN_H__ + +#ifndef FT_BUILD_H +# define FT_BUILD_H +#endif +#include FT_BUILD_H +#include FT_FREETYPE_H + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* */ + /* FT_Outline_Decompose */ + /* */ + /* */ + /* 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. */ + /* */ + /* */ + /* outline :: A pointer to the source target. */ + /* */ + /* 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. */ + /* */ + /* */ + /* FreeType error code. 0 means sucess. */ + /* */ + FT_EXPORT( FT_Error ) FT_Outline_Decompose( + FT_Outline* outline, + const FT_Outline_Funcs* interface, + void* user ); + + + /*************************************************************************/ + /* */ + /* */ + /* FT_Outline_New */ + /* */ + /* */ + /* Creates a new outline of a given size. */ + /* */ + /* */ + /* 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. */ + /* */ + /* */ + /* anoutline :: A handle to the new outline. NULL in case of */ + /* error. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + /* */ + /* 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 ); + + + /*************************************************************************/ + /* */ + /* */ + /* FT_Outline_Done */ + /* */ + /* */ + /* Destroys an outline created with FT_Outline_New(). */ + /* */ + /* */ + /* library :: A handle of the library object used to allocate the */ + /* outline. */ + /* */ + /* outline :: A pointer to the outline object to be discarded. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + /* */ + /* 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_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 ); + + + /*************************************************************************/ + /* */ + /* */ + /* FT_Outline_Get_CBox */ + /* */ + /* */ + /* Returns an outline's `control box'. The control box encloses all */ + /* the outline's points, including Bezier control points. Though it */ + /* coincides with the exact bounding box for most glyphs, it can be */ + /* slightly larger in some situations (like when rotating an outline */ + /* which contains Bezier outside arcs). */ + /* */ + /* Computing the control box is very fast, while getting the bounding */ + /* box can take much more time as it needs to walk over all segments */ + /* and arcs in the outline. To get the latter, you can use the */ + /* `ftbbox' component which is dedicated to this single task. */ + /* */ + /* */ + /* outline :: A pointer to the source outline descriptor. */ + /* */ + /* */ + /* acbox :: The outline's control box. */ + /* */ + FT_EXPORT( void ) FT_Outline_Get_CBox( FT_Outline* outline, + FT_BBox *acbox ); + + + /*************************************************************************/ + /* */ + /* */ + /* FT_Outline_Translate */ + /* */ + /* */ + /* Applies a simple translation to the points of an outline. */ + /* */ + /* */ + /* outline :: A pointer to the target outline descriptor. */ + /* */ + /* */ + /* xOffset :: The horizontal offset. */ + /* */ + /* yOffset :: The vertical offset. */ + /* */ + FT_EXPORT( void ) FT_Outline_Translate( FT_Outline* outline, + FT_Pos xOffset, + FT_Pos yOffset ); + + + /*************************************************************************/ + /* */ + /* */ + /* FT_Outline_Copy */ + /* */ + /* */ + /* Copies an outline into another one. Both objects must have the */ + /* same sizes (number of points & number of contours) when this */ + /* function is called. */ + /* */ + /* */ + /* source :: A handle to the source outline. */ + /* */ + /* */ + /* target :: A handle to the target outline. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + FT_EXPORT( FT_Error ) FT_Outline_Copy( FT_Outline* source, + FT_Outline *target ); + + + /*************************************************************************/ + /* */ + /* */ + /* FT_Outline_Transform */ + /* */ + /* */ + /* Applies a simple 2x2 matrix to all of an outline's points. Useful */ + /* for applying rotations, slanting, flipping, etc. */ + /* */ + /* */ + /* outline :: A pointer to the target outline descriptor. */ + /* */ + /* */ + /* matrix :: A pointer to the transformation matrix. */ + /* */ + /* */ + /* You can use FT_Outline_Translate() if you need to translate the */ + /* outline's points. */ + /* */ + FT_EXPORT( void ) FT_Outline_Transform( FT_Outline* outline, + FT_Matrix* matrix ); + + + /*************************************************************************/ + /* */ + /* */ + /* FT_Outline_Reverse */ + /* */ + /* */ + /* Reverses the drawing direction of an outline. This is used to */ + /* ensure consistent fill conventions for mirrored glyphs. */ + /* */ + /* */ + /* outline :: A pointer to the target outline descriptor. */ + /* */ + /* */ + /* 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 ); + + + /*************************************************************************/ + /* */ + /* */ + /* FT_Outline_Get_Bitmap */ + /* */ + /* */ + /* Renders an outline within a bitmap. The outline's image is simply */ + /* OR-ed to the target bitmap. */ + /* */ + /* */ + /* library :: A handle to a FreeType library object. */ + /* */ + /* outline :: A pointer to the source outline descriptor. */ + /* */ + /* */ + /* abitmap :: A pointer to the target bitmap descriptor. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + /* */ + /* 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 correponding to the default glyph format. */ + /* */ + FT_EXPORT( FT_Error ) FT_Outline_Get_Bitmap( FT_Library library, + FT_Outline* outline, + FT_Bitmap *abitmap ); + + + /*************************************************************************/ + /* */ + /* */ + /* FT_Outline_Render */ + /* */ + /* */ + /* 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. */ + /* */ + /* */ + /* library :: A handle to a FreeType library object. */ + /* */ + /* outline :: A pointer to the source outline descriptor. */ + /* */ + /* */ + /* params :: A pointer to a FT_Raster_Params structure used to */ + /* describe the rendering operation. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + /* */ + /* 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 ); + +FT_END_HEADER + +#endif /* __FTOUTLN_H__ */ + + +/* END */ Index: xc/extras/freetype2/include/freetype/ftrender.h diff -u /dev/null xc/extras/freetype2/include/freetype/ftrender.h:1.1.1.1 --- /dev/null Mon Dec 18 14:22:30 2000 +++ xc/extras/freetype2/include/freetype/ftrender.h Fri Dec 8 16:26:17 2000 @@ -0,0 +1,191 @@ +/***************************************************************************/ +/* */ +/* ftrender.h */ +/* */ +/* FreeType renderer modules public interface (specification). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTRENDER_H__ +#define __FTRENDER_H__ + +#ifndef FT_BUILD_H +# define FT_BUILD_H +#endif +#include FT_BUILD_H +#include FT_MODULE_H +#include FT_GLYPH_H + +FT_BEGIN_HEADER + + + /* create a new glyph object */ + typedef FT_Error (*FT_Glyph_Init_Func) ( FT_Glyph glyph, + FT_GlyphSlot slot ); + + /* destroys a given glyph object */ + typedef void (*FT_Glyph_Done_Func) ( FT_Glyph glyph ); + + typedef void (*FT_Glyph_Transform_Func)( FT_Glyph glyph, + FT_Matrix* matrix, + FT_Vector* delta ); + + typedef void (*FT_Glyph_BBox_Func) ( FT_Glyph glyph, + FT_BBox* abbox ); + + typedef FT_Error (*FT_Glyph_Copy_Func) ( FT_Glyph source, + FT_Glyph target ); + + typedef FT_Error (*FT_Glyph_Prepare_Func) ( FT_Glyph glyph, + FT_GlyphSlot slot ); + + struct FT_Glyph_Class_ + { + FT_UInt glyph_size; + FT_Glyph_Format glyph_format; + FT_Glyph_Init_Func glyph_init; + FT_Glyph_Done_Func glyph_done; + FT_Glyph_Copy_Func glyph_copy; + FT_Glyph_Transform_Func glyph_transform; + FT_Glyph_BBox_Func glyph_bbox; + FT_Glyph_Prepare_Func glyph_prepare; + }; + + + typedef FT_Error (*FTRenderer_render) ( FT_Renderer renderer, + FT_GlyphSlot slot, + FT_UInt mode, + FT_Vector* origin ); + + typedef FT_Error (*FTRenderer_transform)( FT_Renderer renderer, + FT_GlyphSlot slot, + FT_Matrix* matrix, + FT_Vector* delta ); + + typedef void (*FTRenderer_getCBox) ( FT_Renderer renderer, + FT_GlyphSlot slot, + FT_BBox* cbox ); + + typedef FT_Error (*FTRenderer_setMode) ( FT_Renderer renderer, + FT_ULong mode_tag, + FT_Pointer mode_ptr ); + + + /*************************************************************************/ + /* */ + /* */ + /* FT_Renderer_Class */ + /* */ + /* */ + /* The renderer module class descriptor. */ + /* */ + /* */ + /* 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; + + FTRenderer_render render_glyph; + FTRenderer_transform transform_glyph; + FTRenderer_getCBox get_glyph_cbox; + FTRenderer_setMode set_mode; + + FT_Raster_Funcs* raster_class; + + } FT_Renderer_Class; + + + /*************************************************************************/ + /* */ + /* */ + /* FT_Get_Renderer */ + /* */ + /* */ + /* Retrieves the current renderer for a given glyph format. */ + /* */ + /* */ + /* library :: A handle to the library object. */ + /* */ + /* format :: The glyph format. */ + /* */ + /* */ + /* A renderer handle. 0 if none found. */ + /* */ + /* */ + /* 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 ); + + + /*************************************************************************/ + /* */ + /* */ + /* FT_Set_Renderer */ + /* */ + /* */ + /* Sets the current renderer to use, and set additional mode. */ + /* */ + /* */ + /* library :: A handle to the library object. */ + /* */ + /* */ + /* renderer :: A handle to the renderer object. */ + /* */ + /* num_params :: The number of additional parameters. */ + /* */ + /* parameters :: Additional parameters. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + /* */ + /* 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 */ Index: xc/extras/freetype2/include/freetype/ftsynth.h diff -u /dev/null xc/extras/freetype2/include/freetype/ftsynth.h:1.1.1.1 --- /dev/null Mon Dec 18 14:22:30 2000 +++ xc/extras/freetype2/include/freetype/ftsynth.h Fri Dec 8 16:26:17 2000 @@ -0,0 +1,65 @@ +/***************************************************************************/ +/* */ +/* ftsynth.h */ +/* */ +/* FreeType synthesizing code for emboldening and slanting */ +/* (specification). */ +/* */ +/* Copyright 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. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /********* *********/ + /********* 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__ + +#ifndef FT_BUILD_H +# define FT_BUILD_H +#endif +#include FT_BUILD_H +#include FT_FREETYPE_H + +FT_BEGIN_HEADER + + /* This code is completely experimental -- use with care! */ + /* It will probably be completely rewritten in the future */ + /* or even integrated into the library. */ + FT_EXPORT( FT_Error ) FT_Outline_Embolden( FT_GlyphSlot original, + FT_Outline* outline, + FT_Pos* advance ); + + FT_EXPORT( FT_Error ) FT_Outline_Oblique( FT_GlyphSlot original, + FT_Outline* outline, + FT_Pos* advance ); + +FT_END_HEADER + + +#endif /* __FTSYNTH_H__ */ + + +/* END */ Index: xc/extras/freetype2/include/freetype/ftsystem.h diff -u /dev/null xc/extras/freetype2/include/freetype/ftsystem.h:1.1.1.1 --- /dev/null Mon Dec 18 14:22:30 2000 +++ xc/extras/freetype2/include/freetype/ftsystem.h Fri Dec 8 16:26:17 2000 @@ -0,0 +1,111 @@ +/***************************************************************************/ +/* */ +/* ftsystem.h */ +/* */ +/* FreeType low-level system interface definition (specification). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#ifndef FTSYSTEM_H +#define FTSYSTEM_H + + +#ifdef __cplusplus + extern "C" { +#endif + + + /*************************************************************************/ + /* */ + /* M E M O R Y M A N A G E M E N T */ + /* */ + /*************************************************************************/ + + + typedef struct FT_MemoryRec_* FT_Memory; + + + typedef void* (*FT_Alloc_Func)( FT_Memory memory, + long size ); + + typedef void (*FT_Free_Func)( FT_Memory memory, + void* block ); + + typedef void* (*FT_Realloc_Func)( FT_Memory memory, + long cur_size, + long new_size, + void* block ); + + + 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 */ + /* */ + /*************************************************************************/ + + + typedef union FT_StreamDesc_ + { + long value; + void* pointer; + + } FT_StreamDesc; + + + typedef struct FT_StreamRec_* FT_Stream; + + + typedef unsigned long (*FT_Stream_IO)( FT_Stream stream, + unsigned long offset, + unsigned char* buffer, + unsigned long count ); + + typedef void (*FT_Stream_Close)( FT_Stream stream ); + + + struct FT_StreamRec_ + { + unsigned char* base; + unsigned long size; + unsigned long pos; + + FT_StreamDesc descriptor; + FT_StreamDesc pathname; /* ignored by FreeType -- */ + /* useful for debugging */ + FT_Stream_IO read; + FT_Stream_Close close; + + FT_Memory memory; + unsigned char* cursor; + unsigned char* limit; + }; + + +#ifdef __cplusplus + } +#endif + + +#endif /* FTSYSTEM_H */ + + +/* END */ Index: xc/extras/freetype2/include/freetype/fttypes.h diff -u /dev/null xc/extras/freetype2/include/freetype/fttypes.h:1.1.1.1 --- /dev/null Mon Dec 18 14:22:30 2000 +++ xc/extras/freetype2/include/freetype/fttypes.h Fri Dec 8 16:26:17 2000 @@ -0,0 +1,408 @@ +/***************************************************************************/ +/* */ +/* fttypes.h */ +/* */ +/* FreeType simple types definitions (specification only). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTTYPES_H__ +#define __FTTYPES_H__ + +#ifndef FT_BUILD_H +# define FT_BUILD_H +#endif + +#include FT_BUILD_H +#include FT_SYSTEM_H +#include FT_IMAGE_H +#include + +FT_BEGIN_HEADER + + /*************************************************************************/ + /* */ + /* */ + /* FT_Bool */ + /* */ + /* */ + /* A typedef of unsigned char, used for simple booleans. */ + /* */ + typedef unsigned char FT_Bool; + + + /*************************************************************************/ + /* */ + /* */ + /* FT_FWord */ + /* */ + /* */ + /* A signed 16-bit integer used to store a distance in original font */ + /* units. */ + /* */ + typedef signed short FT_FWord; /* distance in FUnits */ + + + /*************************************************************************/ + /* */ + /* */ + /* FT_UFWord */ + /* */ + /* */ + /* An unsigned 16-bit integer used to store a distance in original */ + /* font units. */ + /* */ + typedef unsigned short FT_UFWord; /* unsigned distance */ + + + /*************************************************************************/ + /* */ + /* */ + /* FT_Char */ + /* */ + /* */ + /* A simple typedef for the _signed_ char type. */ + /* */ + typedef signed char FT_Char; + + + /*************************************************************************/ + /* */ + /* */ + /* FT_Byte */ + /* */ + /* */ + /* A simple typedef for the _unsigned_ char type. */ + /* */ + typedef unsigned char FT_Byte; + + + /*************************************************************************/ + /* */ + /* */ + /* FT_String */ + /* */ + /* */ + /* A simple typedef for the char type, usually used for strings. */ + /* */ + typedef char FT_String; + + + /*************************************************************************/ + /* */ + /* */ + /* FT_Short */ + /* */ + /* */ + /* A typedef for signed short. */ + /* */ + typedef signed short FT_Short; + + + /*************************************************************************/ + /* */ + /* */ + /* FT_UShort */ + /* */ + /* */ + /* A typedef for unsigned short. */ + /* */ + typedef unsigned short FT_UShort; + + + /*************************************************************************/ + /* */ + /* */ + /* FT_Int */ + /* */ + /* */ + /* A typedef for the int type. */ + /* */ + typedef int FT_Int; + + + /*************************************************************************/ + /* */ + /* */ + /* FT_UInt */ + /* */ + /* */ + /* A typedef for the unsigned int type. */ + /* */ + typedef unsigned int FT_UInt; + + + /*************************************************************************/ + /* */ + /* */ + /* FT_Long */ + /* */ + /* */ + /* A typedef for signed long. */ + /* */ + typedef signed long FT_Long; + + + /*************************************************************************/ + /* */ + /* */ + /* FT_ULong */ + /* */ + /* */ + /* A typedef for unsigned long. */ + /* */ + typedef unsigned long FT_ULong; + + + /*************************************************************************/ + /* */ + /* */ + /* FT_F2Dot14 */ + /* */ + /* */ + /* A signed 2.14 fixed float type used for unit vectors. */ + /* */ + typedef signed short FT_F2Dot14; + + + /*************************************************************************/ + /* */ + /* */ + /* FT_F26Dot6 */ + /* */ + /* */ + /* A signed 26.6 fixed float type used for vectorial pixel */ + /* coordinates. */ + /* */ + typedef signed long FT_F26Dot6; + + + /*************************************************************************/ + /* */ + /* */ + /* FT_Fixed */ + /* */ + /* */ + /* This type is used to store 16.16 fixed float values, like scales */ + /* or matrix coefficients. */ + /* */ + typedef signed long FT_Fixed; + + + /*************************************************************************/ + /* */ + /* */ + /* FT_Error */ + /* */ + /* */ + /* The FreeType error code type. A value of 0 is always interpreted */ + /* as a successful operation. */ + /* */ + typedef int FT_Error; + + + /*************************************************************************/ + /* */ + /* */ + /* FT_Pointer */ + /* */ + /* */ + /* A simple typedef for a typeless pointer. */ + /* */ + typedef void* FT_Pointer; + + + /*************************************************************************/ + /* */ + /* */ + /* FT_UnitVector */ + /* */ + /* */ + /* A simple structure used to store a 2D vector unit vector. Uses */ + /* FT_F2Dot14 types. */ + /* */ + /* */ + /* x :: Horizontal coordinate. */ + /* */ + /* y :: Vertical coordinate. */ + /* */ + typedef struct FT_UnitVector_ + { + FT_F2Dot14 x; + FT_F2Dot14 y; + + } FT_UnitVector; + + + /*************************************************************************/ + /* */ + /* */ + /* 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 */ + /* } */ + /* */ + /* */ + /* 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; + + + /*************************************************************************/ + /* */ + /* */ + /* 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. */ + /* */ + /* */ + /* 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; + + + /*************************************************************************/ + /* */ + /* */ + /* FT_MAKE_TAG */ + /* */ + /* */ + /* This macro converts four letter tags which are used to label */ + /* TrueType tables into an unsigned long to be used within FreeType. */ + /* */ +#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 */ + /* */ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* */ + /* FT_ListNode */ + /* */ + /* */ + /* Many elements and objects in FreeType are listed through a */ + /* FT_List record (see FT_ListRec). As its name suggests, a */ + /* FT_ListNode is a handle to a single list element. */ + /* */ + typedef struct FT_ListNodeRec_* FT_ListNode; + + + /*************************************************************************/ + /* */ + /* */ + /* FT_List */ + /* */ + /* */ + /* A handle to a list record (see FT_ListRec). */ + /* */ + typedef struct FT_ListRec_* FT_List; + + + /*************************************************************************/ + /* */ + /* */ + /* FT_ListNodeRec */ + /* */ + /* */ + /* A structure used to hold a single list element. */ + /* */ + /* */ + /* 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; + + + /*************************************************************************/ + /* */ + /* */ + /* FT_ListRec */ + /* */ + /* */ + /* A structure used to hold a simple doubly-linked list. These are */ + /* used in many parts of FreeType. */ + /* */ + /* */ + /* 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 ) + +FT_END_HEADER + +#endif /* __FTTYPES_H__ */ + + +/* END */ Index: xc/extras/freetype2/include/freetype/t1tables.h diff -u /dev/null xc/extras/freetype2/include/freetype/t1tables.h:1.1.1.1 --- /dev/null Mon Dec 18 14:22:30 2000 +++ xc/extras/freetype2/include/freetype/t1tables.h Fri Dec 8 16:26:17 2000 @@ -0,0 +1,243 @@ +/***************************************************************************/ +/* */ +/* t1tables.h */ +/* */ +/* Basic Type 1/Type 2 tables definitions and interface (specification */ +/* only). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#ifndef __T1TABLES_H__ +#define __T1TABLES_H__ + +#ifndef FT_BUILD_H +# define FT_BUILD_H +#endif + +#include FT_BUILD_H +#include FT_FREETYPE_H + +FT_BEGIN_HEADER + + /* Note that we separate font data in T1_FontInfo and T1_Private */ + /* structures in order to support Multiple Master fonts. */ + + + /*************************************************************************/ + /* */ + /* */ + /* T1_FontInfo */ + /* */ + /* */ + /* A structure used to model a Type1/Type2 FontInfo dictionary. Note */ + /* that for Multiple Master fonts, each instance has its own */ + /* FontInfo. */ + /* */ + typedef struct T1_FontInfo + { + 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; + + } T1_FontInfo; + + + /*************************************************************************/ + /* */ + /* */ + /* T1_Private */ + /* */ + /* */ + /* A structure used to model a Type1/Type2 FontInfo dictionary. Note */ + /* that for Multiple Master fonts, each instance has its own Private */ + /* dict. */ + /* */ + typedef struct T1_Private + { + 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]; /* reserve one place for the std */ + FT_Short snap_heights[13]; /* reserve one place for the std */ + + FT_Long language_group; + FT_Long password; + + FT_Short min_feature[2]; + + } T1_Private; + + + /*************************************************************************/ + /* */ + /* */ + /* T1_Blend_Flags */ + /* */ + /* */ + /* A set of flags used to indicate which fields are present in a */ + /* given blen 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; + + + /* 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 T1_DesignMap_ + { + FT_Byte num_points; + FT_Fixed* design_points; + FT_Fixed* blend_points; + + } T1_DesignMap; + + + typedef struct T1_Blend_ + { + FT_UInt num_designs; + FT_UInt num_axis; + + FT_String* axis_names[T1_MAX_MM_AXIS]; + FT_Fixed* design_pos[T1_MAX_MM_DESIGNS]; + T1_DesignMap design_map[T1_MAX_MM_AXIS]; + + FT_Fixed* weight_vector; + FT_Fixed* default_weight_vector; + + T1_FontInfo* font_infos[T1_MAX_MM_DESIGNS + 1]; + T1_Private* privates [T1_MAX_MM_DESIGNS + 1]; + + FT_ULong blend_bitflags; + + } T1_Blend; + + + typedef struct CID_FontDict_ + { + T1_Private 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_FontDict; + + + typedef struct CID_Info_ + { + FT_String* cid_font_name; + FT_Fixed cid_version; + FT_Int cid_font_type; + + FT_String* registry; + FT_String* ordering; + FT_Int supplement; + + T1_FontInfo 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_FontDict* font_dicts; + + FT_ULong data_offset; + + } CID_Info; + + +FT_END_HEADER + +#endif /* __T1TABLES_H__ */ + + +/* END */ Index: xc/extras/freetype2/include/freetype/ttnameid.h diff -u /dev/null xc/extras/freetype2/include/freetype/ttnameid.h:1.1.1.1 --- /dev/null Mon Dec 18 14:22:30 2000 +++ xc/extras/freetype2/include/freetype/ttnameid.h Fri Dec 8 16:26:17 2000 @@ -0,0 +1,724 @@ +/***************************************************************************/ +/* */ +/* ttnameid.h */ +/* */ +/* TrueType name ID definitions (specification only). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#ifndef __TTNAMEID_H__ +#define __TTNAMEID_H__ + + +#ifdef __cplusplus + extern "C" { +#endif + + + /*************************************************************************/ + /* */ + /* Possible values for the `platform' identifier code in the name */ + /* records of the TTF `name' table. */ + /* */ +#define TT_PLATFORM_APPLE_UNICODE 0 +#define TT_PLATFORM_MACINTOSH 1 +#define TT_PLATFORM_ISO 2 /* deprecated */ +#define TT_PLATFORM_MICROSOFT 3 + + /* artificial values defined ad-hoc by FreeType */ +#define TT_PLATFORM_ADOBE 7 + + + /*************************************************************************/ + /* */ + /* Possible values of the platform specific encoding identifier field in */ + /* the name records of the TTF `name' table if the `platform' identifier */ + /* code is TT_PLATFORM_APPLE_UNICODE. */ + /* */ +#define TT_APPLE_ID_DEFAULT 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 */ + + + /*************************************************************************/ + /* */ + /* Possible values of the platform specific encoding identifier field in */ + /* the name records of the TTF `name' table if the `platform' identifier */ + /* code is TT_PLATFORM_MACINTOSH. */ + /* */ +#define TT_MAC_ID_ROMAN 0 +#define TT_MAC_ID_JAPANESE 1 +#define TT_MAC_ID_TRADITIONAL_CHINESE 2 +#define TT_MAC_ID_KOREAN 3 +#define TT_MAC_ID_ARABIC 4 +#define TT_MAC_ID_HEBREW 5 +#define TT_MAC_ID_GREEK 6 +#define TT_MAC_ID_RUSSIAN 7 +#define TT_MAC_ID_RSYMBOL 8 +#define TT_MAC_ID_DEVANAGARI 9 +#define TT_MAC_ID_GURMUKHI 10 +#define TT_MAC_ID_GUJARATI 11 +#define TT_MAC_ID_ORIYA 12 +#define TT_MAC_ID_BENGALI 13 +#define TT_MAC_ID_TAMIL 14 +#define TT_MAC_ID_TELUGU 15 +#define TT_MAC_ID_KANNADA 16 +#define TT_MAC_ID_MALAYALAM 17 +#define TT_MAC_ID_SINHALESE 18 +#define TT_MAC_ID_BURMESE 19 +#define TT_MAC_ID_KHMER 20 +#define TT_MAC_ID_THAI 21 +#define TT_MAC_ID_LAOTIAN 22 +#define TT_MAC_ID_GEORGIAN 23 +#define TT_MAC_ID_ARMENIAN 24 +#define TT_MAC_ID_MALDIVIAN 25 +#define TT_MAC_ID_SIMPLIFIED_CHINESE 25 +#define TT_MAC_ID_TIBETAN 26 +#define TT_MAC_ID_MONGOLIAN 27 +#define TT_MAC_ID_GEEZ 28 +#define TT_MAC_ID_SLAVIC 29 +#define TT_MAC_ID_VIETNAMESE 30 +#define TT_MAC_ID_SINDHI 31 +#define TT_MAC_ID_UNINTERP 32 + + + /*************************************************************************/ + /* */ + /* Possible values of the platform specific encoding identifier field in */ + /* the name records of the TTF `name' table if the `platform' identifier */ + /* code is TT_PLATFORM_ISO. */ + /* */ + /* This use is now deprecated. */ + /* */ +#define TT_ISO_ID_7BIT_ASCII 0 +#define TT_ISO_ID_10646 1 +#define TT_ISO_ID_8859_1 2 + + + /*************************************************************************/ + /* */ + /* possible values of the platform specific encoding identifier field in */ + /* the name records of the TTF `name' table if the `platform' identifier */ + /* code is TT_PLATFORM_MICROSOFT. */ + /* */ +#define TT_MS_ID_SYMBOL_CS 0 +#define TT_MS_ID_UNICODE_CS 1 +#define TT_MS_ID_SJIS 2 +#define TT_MS_ID_GB2312 3 +#define TT_MS_ID_BIG_5 4 +#define TT_MS_ID_WANSUNG 5 +#define TT_MS_ID_JOHAB 6 + + + /*************************************************************************/ + /* */ + /* possible values of the platform specific encoding identifier field in */ + /* the name records of the TTF `name' table if the `platform' identifier */ + /* code is TT_PLATFORM_ADOBE. */ + /* */ + /* These are artificial values defined ad-hoc by FreeType. */ + /* */ +#define TT_ADOBE_ID_STANDARD 0 +#define TT_ADOBE_ID_EXPERT 1 +#define TT_ADOBE_ID_CUSTOM 2 + + + /*************************************************************************/ + /* */ + /* 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 is at */ + /* */ + /* http://www.microsoft.com/typography/OTSPEC/lcid-cp.txt */ + /* */ +#define TT_MS_LANGID_ARABIC_SAUDI_ARABIA 0x0401 +#define TT_MS_LANGID_ARABIC_IRAQ 0x0801 +#define TT_MS_LANGID_ARABIC_EGYPT 0x0c01 +#define TT_MS_LANGID_ARABIC_LIBYA 0x1001 +#define TT_MS_LANGID_ARABIC_ALGERIA 0x1401 +#define TT_MS_LANGID_ARABIC_MOROCCO 0x1801 +#define TT_MS_LANGID_ARABIC_TUNISIA 0x1c01 +#define TT_MS_LANGID_ARABIC_OMAN 0x2001 +#define TT_MS_LANGID_ARABIC_YEMEN 0x2401 +#define TT_MS_LANGID_ARABIC_SYRIA 0x2801 +#define TT_MS_LANGID_ARABIC_JORDAN 0x2c01 +#define TT_MS_LANGID_ARABIC_LEBANON 0x3001 +#define TT_MS_LANGID_ARABIC_KUWAIT 0x3401 +#define TT_MS_LANGID_ARABIC_UAE 0x3801 +#define TT_MS_LANGID_ARABIC_BAHRAIN 0x3c01 +#define TT_MS_LANGID_ARABIC_QATAR 0x4001 +#define TT_MS_LANGID_BULGARIAN_BULGARIA 0x0402 +#define TT_MS_LANGID_CATALAN_SPAIN 0x0403 +#define TT_MS_LANGID_CHINESE_TAIWAN 0x0404 +#define TT_MS_LANGID_CHINESE_PRC 0x0804 +#define TT_MS_LANGID_CHINESE_HONG_KONG 0x0c04 +#define TT_MS_LANGID_CHINESE_SINGAPORE 0x1004 +#define TT_MS_LANGID_CHINESE_MACAU 0x1404 +#define TT_MS_LANGID_CZECH_CZECH_REPUBLIC 0x0405 +#define TT_MS_LANGID_DANISH_DENMARK 0x0406 +#define TT_MS_LANGID_GERMAN_GERMANY 0x0407 +#define TT_MS_LANGID_GERMAN_SWITZERLAND 0x0807 +#define TT_MS_LANGID_GERMAN_AUSTRIA 0x0c07 +#define TT_MS_LANGID_GERMAN_LUXEMBOURG 0x1007 +#define TT_MS_LANGID_GERMAN_LIECHTENSTEI 0x1407 +#define TT_MS_LANGID_GREEK_GREECE 0x0408 +#define TT_MS_LANGID_ENGLISH_UNITED_STATES 0x0409 +#define TT_MS_LANGID_ENGLISH_UNITED_KINGDOM 0x0809 +#define TT_MS_LANGID_ENGLISH_AUSTRALIA 0x0c09 +#define TT_MS_LANGID_ENGLISH_CANADA 0x1009 +#define TT_MS_LANGID_ENGLISH_NEW_ZEALAND 0x1409 +#define TT_MS_LANGID_ENGLISH_IRELAND 0x1809 +#define TT_MS_LANGID_ENGLISH_SOUTH_AFRICA 0x1c09 +#define TT_MS_LANGID_ENGLISH_JAMAICA 0x2009 +#define TT_MS_LANGID_ENGLISH_CARIBBEAN 0x2409 +#define TT_MS_LANGID_ENGLISH_BELIZE 0x2809 +#define TT_MS_LANGID_ENGLISH_TRINIDAD 0x2c09 +#define TT_MS_LANGID_ENGLISH_ZIMBABWE 0x3009 +#define TT_MS_LANGID_ENGLISH_PHILIPPINES 0x3409 +#define TT_MS_LANGID_SPANISH_SPAIN_TRADITIONAL_SORT 0x040a +#define TT_MS_LANGID_SPANISH_MEXICO 0x080a +#define TT_MS_LANGID_SPANISH_SPAIN_INTERNATIONAL_SORT 0x0c0a +#define TT_MS_LANGID_SPANISH_GUATEMALA 0x100a +#define TT_MS_LANGID_SPANISH_COSTA_RICA 0x140a +#define TT_MS_LANGID_SPANISH_PANAMA 0x180a +#define TT_MS_LANGID_SPANISH_DOMINICAN_REPUBLIC 0x1c0a +#define TT_MS_LANGID_SPANISH_VENEZUELA 0x200a +#define TT_MS_LANGID_SPANISH_COLOMBIA 0x240a +#define TT_MS_LANGID_SPANISH_PERU 0x280a +#define TT_MS_LANGID_SPANISH_ARGENTINA 0x2c0a +#define TT_MS_LANGID_SPANISH_ECUADOR 0x300a +#define TT_MS_LANGID_SPANISH_CHILE 0x340a +#define TT_MS_LANGID_SPANISH_URUGUAY 0x380a +#define TT_MS_LANGID_SPANISH_PARAGUAY 0x3c0a +#define TT_MS_LANGID_SPANISH_BOLIVIA 0x400a +#define TT_MS_LANGID_SPANISH_EL_SALVADOR 0x440a +#define TT_MS_LANGID_SPANISH_HONDURAS 0x480a +#define TT_MS_LANGID_SPANISH_NICARAGUA 0x4c0a +#define TT_MS_LANGID_SPANISH_PUERTO_RICO 0x500a +#define TT_MS_LANGID_FINNISH_FINLAND 0x040b +#define TT_MS_LANGID_FRENCH_FRANCE 0x040c +#define TT_MS_LANGID_FRENCH_BELGIUM 0x080c +#define TT_MS_LANGID_FRENCH_CANADA 0x0c0c +#define TT_MS_LANGID_FRENCH_SWITZERLAND 0x100c +#define TT_MS_LANGID_FRENCH_LUXEMBOURG 0x140c +#define TT_MS_LANGID_FRENCH_MONACO 0x180c +#define TT_MS_LANGID_HEBREW_ISRAEL 0x040d +#define TT_MS_LANGID_HUNGARIAN_HUNGARY 0x040e +#define TT_MS_LANGID_ICELANDIC_ICELAND 0x040f +#define TT_MS_LANGID_ITALIAN_ITALY 0x0410 +#define TT_MS_LANGID_ITALIAN_SWITZERLAND 0x0810 +#define TT_MS_LANGID_JAPANESE_JAPAN 0x0411 +#define TT_MS_LANGID_KOREAN_EXTENDED_WANSUNG_KOREA 0x0412 +#define TT_MS_LANGID_KOREAN_JOHAB_KOREA 0x0812 +#define TT_MS_LANGID_DUTCH_NETHERLANDS 0x0413 +#define TT_MS_LANGID_DUTCH_BELGIUM 0x0813 +#define TT_MS_LANGID_NORWEGIAN_NORWAY_BOKMAL 0x0414 +#define TT_MS_LANGID_NORWEGIAN_NORWAY_NYNORSK 0x0814 +#define TT_MS_LANGID_POLISH_POLAND 0x0415 +#define TT_MS_LANGID_PORTUGUESE_BRAZIL 0x0416 +#define TT_MS_LANGID_PORTUGUESE_PORTUGAL 0x0816 +#define TT_MS_LANGID_RHAETO_ROMANIC_SWITZERLAND 0x0417 +#define TT_MS_LANGID_ROMANIAN_ROMANIA 0x0418 +#define TT_MS_LANGID_MOLDAVIAN_MOLDAVIA 0x0818 +#define TT_MS_LANGID_RUSSIAN_RUSSIA 0x0419 +#define TT_MS_LANGID_RUSSIAN_MOLDAVIA 0x0819 +#define TT_MS_LANGID_CROATIAN_CROATIA 0x041a +#define TT_MS_LANGID_SERBIAN_SERBIA_LATIN 0x081a +#define TT_MS_LANGID_SERBIAN_SERBIA_CYRILLIC 0x0c1a +#define TT_MS_LANGID_SLOVAK_SLOVAKIA 0x041b +#define TT_MS_LANGID_ALBANIAN_ALBANIA 0x041c +#define TT_MS_LANGID_SWEDISH_SWEDEN 0x041d +#define TT_MS_LANGID_SWEDISH_FINLAND 0x081d +#define TT_MS_LANGID_THAI_THAILAND 0x041e +#define TT_MS_LANGID_TURKISH_TURKEY 0x041f +#define TT_MS_LANGID_URDU_PAKISTAN 0x0420 +#define TT_MS_LANGID_INDONESIAN_INDONESIA 0x0421 +#define TT_MS_LANGID_UKRAINIAN_UKRAINE 0x0422 +#define TT_MS_LANGID_BELARUSIAN_BELARUS 0x0423 +#define TT_MS_LANGID_SLOVENE_SLOVENIA 0x0424 +#define TT_MS_LANGID_ESTONIAN_ESTONIA 0x0425 +#define TT_MS_LANGID_LATVIAN_LATVIA 0x0426 +#define TT_MS_LANGID_LITHUANIAN_LITHUANIA 0x0427 +#define TT_MS_LANGID_CLASSIC_LITHUANIAN_LITHUANIA 0x0827 +#define TT_MS_LANGID_MAORI_NEW_ZEALAND 0x0428 +#define TT_MS_LANGID_FARSI_IRAN 0x0429 +#define TT_MS_LANGID_VIETNAMESE_VIET_NAM 0x042a +#define TT_MS_LANGID_ARMENIAN_ARMENIA 0x042b +#define TT_MS_LANGID_AZERI_AZERBAIJAN_LATIN 0x042c +#define TT_MS_LANGID_AZERI_AZERBAIJAN_CYRILLIC 0x082c +#define TT_MS_LANGID_BASQUE_SPAIN 0x042d +#define TT_MS_LANGID_SORBIAN_GERMANY 0x042e +#define TT_MS_LANGID_MACEDONIAN_MACEDONIA 0x042f +#define TT_MS_LANGID_SUTU_SOUTH_AFRICA 0x0430 +#define TT_MS_LANGID_TSONGA_SOUTH_AFRICA 0x0431 +#define TT_MS_LANGID_TSWANA_SOUTH_AFRICA 0x0432 +#define TT_MS_LANGID_VENDA_SOUTH_AFRICA 0x0433 +#define TT_MS_LANGID_XHOSA_SOUTH_AFRICA 0x0434 +#define TT_MS_LANGID_ZULU_SOUTH_AFRICA 0x0435 +#define TT_MS_LANGID_AFRIKAANS_SOUTH_AFRICA 0x0436 +#define TT_MS_LANGID_GEORGIAN_GEORGIA 0x0437 +#define TT_MS_LANGID_FAEROESE_FAEROE_ISLANDS 0x0438 +#define TT_MS_LANGID_HINDI_INDIA 0x0439 +#define TT_MS_LANGID_MALTESE_MALTA 0x043a +#define TT_MS_LANGID_SAAMI_LAPONIA 0x043b +#define TT_MS_LANGID_IRISH_GAELIC_IRELAND 0x043c +#define TT_MS_LANGID_SCOTTISH_GAELIC_UNITED_KINGDOM 0x083c +#define TT_MS_LANGID_MALAY_MALAYSIA 0x043e +#define TT_MS_LANGID_MALAY_BRUNEI_DARUSSALAM 0x083e +#define TT_MS_LANGID_KAZAK_KAZAKSTAN 0x043f +#define TT_MS_LANGID_SWAHILI_KENYA 0x0441 +#define TT_MS_LANGID_UZBEK_UZBEKISTAN_LATIN 0x0443 +#define TT_MS_LANGID_UZBEK_UZBEKISTAN_CYRILLIC 0x0843 +#define TT_MS_LANGID_TATAR_TATARSTAN 0x0444 +#define TT_MS_LANGID_BENGALI_INDIA 0x0445 +#define TT_MS_LANGID_PUNJABI_INDIA 0x0446 +#define TT_MS_LANGID_GUJARATI_INDIA 0x0447 +#define TT_MS_LANGID_ORIYA_INDIA 0x0448 +#define TT_MS_LANGID_TAMIL_INDIA 0x0449 +#define TT_MS_LANGID_TELUGU_INDIA 0x044a +#define TT_MS_LANGID_KANNADA_INDIA 0x044b +#define TT_MS_LANGID_MALAYALAM_INDIA 0x044c +#define TT_MS_LANGID_ASSAMESE_INDIA 0x044d +#define TT_MS_LANGID_MARATHI_INDIA 0x044e +#define TT_MS_LANGID_SANSKRIT_INDIA 0x044f +#define TT_MS_LANGID_KONKANI_INDIA 0x0457 + + + /*************************************************************************/ + /* */ + /* Possible values of the `name' identifier field in the name records of */ + /* the TTF `name' table. These values are platform independent. */ + /* */ +#define TT_NAME_ID_COPYRIGHT 0 +#define TT_NAME_ID_FONT_FAMILY 1 +#define TT_NAME_ID_FONT_SUBFAMILY 2 +#define TT_NAME_ID_UNIQUE_ID 3 +#define TT_NAME_ID_FULL_NAME 4 +#define TT_NAME_ID_VERSION_STRING 5 +#define TT_NAME_ID_PS_NAME 6 +#define TT_NAME_ID_TRADEMARK 7 + +/* the following values are from the OpenType spec */ +#define TT_NAME_ID_MANUFACTURER 8 +#define TT_NAME_ID_DESIGNER 9 +#define TT_NAME_ID_DESCRIPTION 10 +#define TT_NAME_ID_VENDOR_URL 11 +#define TT_NAME_ID_DESIGNER_URL 12 +#define TT_NAME_ID_LICENSE 13 +#define TT_NAME_ID_LICENSE_URL 14 +/* number 15 is reserved */ +#define TT_NAME_ID_PREFERRED_FAMILY 16 +#define TT_NAME_ID_PREFERRED_SUBFAMILY 17 +#define TT_NAME_ID_MAC_FULL_NAME 18 + +/* The following code is new as of 2000-01-21 */ +#define TT_NAME_ID_SAMPLE_TEXT 19 + + + /*************************************************************************/ + /* */ + /* Bit mask values for the Unicode Ranges from the TTF `OS2 ' table. */ + /* */ + /* Updated 02-Jul-2000. */ + /* */ + + /* General Scripts Area */ + + /* Bit 0 C0 Controls and 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+00A0-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 */ +#define TT_UCR_GREEK (1L << 7) /* U+0370-U+03FF */ + /* Bit 8 is reserved (was: Greek Symbols and Coptic) */ + /* Bit 9 Cyrillic */ +#define TT_UCR_CYRILLIC (1L << 9) /* U+0400-U+04FF */ + /* 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 */ +#define TT_UCR_ARROWS (1L << 5) /* U+2190-U+21FF */ + /* Bit 38 Mathematical Operators */ +#define TT_UCR_MATHEMATICAL_OPERATORS (1L << 6) /* U+2200-U+22FF */ + /* 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 */ +#define TT_UCR_KATAKANA (1L << 18) /* U+30A0-U+30FF */ + /* Bit 51 Bopomofo + Extended Bopomofo */ +#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 CJK Miscellaneous */ +#define TT_UCR_CJK_MISC (1L << 21) /* U+3190-U+319F */ + /* 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 Surrogates */ +#define TT_UCR_SURROGATES (1L << 25) /* U+D800-U+DFFF */ + /* Bit 58 is reserved for Unicode SubRanges */ + + /* CJK Ideographs Area */ + + /* Bit 59 CJK Unified Ideographs + */ + /* CJK Radical Supplement + */ + /* Kangxi Radicals + */ + /* Ideographic Description + */ + /* CJK Unified Ideographs Extension A */ +#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+34E0-U+4DB5 */ + + /* 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 */ +#define TT_UCR_CJK_COMPATIBILITY_IDEOGRAPHS (1L << 29) /* U+F900-U+FAFF */ + /* 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+0FCF */ + /* 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+12BF */ + /* Bit 76 Cherokee */ +#define TT_UCR_CHEROKEE (1L << 12) /* U+13A0-U+13FF */ + /* Bit 77 Canadian Aboriginal Syllabics */ +#define TT_UCR_CANADIAN_ABORIGINAL_SYLLABICS (1L << 13) /* U+1400-U+14DF */ + /* 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 */ +#define TT_UCR_BRAILLE (1L << 18) /* U+2800-U+28FF */ + /* Bit 83 Yi + Yi Radicals */ +#define TT_UCR_YI (1L << 19) /* U+A000-U+A48C */ + /* U+A490-U+A4CF */ + + + /*************************************************************************/ + /* */ + /* 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 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 */ + + +#ifdef __cplusplus + } +#endif + + +#endif /* __TTNAMEID_H__ */ + + +/* END */ Index: xc/extras/freetype2/include/freetype/tttables.h diff -u /dev/null xc/extras/freetype2/include/freetype/tttables.h:1.1.1.1 --- /dev/null Mon Dec 18 14:22:30 2000 +++ xc/extras/freetype2/include/freetype/tttables.h Fri Dec 8 16:26:17 2000 @@ -0,0 +1,578 @@ +/***************************************************************************/ +/* */ +/* tttables.h */ +/* */ +/* Basic SFNT/TrueType tables definitions and interface */ +/* (specification only). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#ifndef __TTTABLES_H__ +#define __TTTABLES_H__ + +#ifndef FT_BUILD_H +# define FT_BUILD_H +#endif + +#include FT_BUILD_H +#include FT_FREETYPE_H + +FT_BEGIN_HEADER + + /*************************************************************************/ + /* */ + /* */ + /* TT_Header */ + /* */ + /* */ + /* 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; + + + /*************************************************************************/ + /* */ + /* */ + /* 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. */ + /* */ + /* */ + /* 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. */ + /* */ + /* */ + /* 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're used to connect the metrics header to the relevant */ + /* `HMTX' table. */ + + void* long_metrics; + void* short_metrics; + + } TT_HoriHeader; + + + /*************************************************************************/ + /* */ + /* */ + /* 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. */ + /* */ + /* */ + /* 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. */ + /* */ + /* Reserved :: 10 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. */ + /* */ + /* */ + /* 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; + + + /*************************************************************************/ + /* */ + /* */ + /* 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. */ + /* */ + 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; + + + /*************************************************************************/ + /* */ + /* */ + /* TT_Postscript */ + /* */ + /* */ + /* A structure used to model a TrueType Postscript table. All fields */ + /* comply to the TrueType table. 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; + + + /*************************************************************************/ + /* */ + /* */ + /* TT_PCLT */ + /* */ + /* */ + /* A structure used to model a TrueType PCLT table. All fields */ + /* comply to the TrueType table. */ + /* */ + 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; + + + /*************************************************************************/ + /* */ + /* */ + /* 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. */ + /* */ + /* */ + /* 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 :: An obscure value related to composite */ + /* glyphs definitions. */ + /* */ + /* maxComponentDepth :: An obscure value related to composite */ + /* glyphs definitions. Probably the maximum */ + /* number of simple glyphs in a composite. */ + /* */ + /* */ + /* 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; + + + 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 /* don't remove */ + + } FT_Sfnt_Tag; + + + /* internal use only */ + typedef void* (*FT_Get_Sfnt_Table_Func)( FT_Face face, + FT_Sfnt_Tag tag ); + + + /*************************************************************************/ + /* */ + /* */ + /* FT_Get_Sfnt_Table */ + /* */ + /* */ + /* Returns a pointer to a given SFNT table within a face. */ + /* */ + /* */ + /* face :: A handle to the source. */ + /* */ + /* tag :: The index of the SFNT table. */ + /* */ + /* */ + /* 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. */ + /* */ + /* */ + /* 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/opentype drivers. See FT_Sfnt_Tag for a */ + /* list. */ + /* */ + FT_EXPORT( void* ) FT_Get_Sfnt_Table( FT_Face face, + FT_Sfnt_Tag tag ); + + +FT_END_HEADER + +#endif /* __TTTABLES_H__ */ + + +/* END */ Index: xc/extras/freetype2/include/freetype/tttags.h diff -u /dev/null xc/extras/freetype2/include/freetype/tttags.h:1.1.1.1 --- /dev/null Mon Dec 18 14:22:31 2000 +++ xc/extras/freetype2/include/freetype/tttags.h Fri Dec 8 16:26:17 2000 @@ -0,0 +1,74 @@ +/***************************************************************************/ +/* */ +/* tttags.h */ +/* */ +/* Tags for TrueType tables (specification only). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#ifndef __TTAGS_H__ +#define __TTAGS_H__ + +#ifndef FT_BUILD_H +# define FT_BUILD_H +#endif + +#include FT_BUILD_H +#include FT_FREETYPE_H + +FT_BEGIN_HEADER + +#define TTAG_cmap FT_MAKE_TAG( 'c', 'm', 'a', 'p' ) +#define TTAG_cvt FT_MAKE_TAG( 'c', 'v', 't', ' ' ) +#define TTAG_CFF FT_MAKE_TAG( 'C', 'F', 'F', ' ' ) +#define TTAG_DSIG FT_MAKE_TAG( 'D', 'S', 'I', 'G' ) +#define TTAG_bhed FT_MAKE_TAG( 'b', 'h', 'e', 'd' ) +#define TTAG_bdat FT_MAKE_TAG( 'b', 'd', 'a', 't' ) +#define TTAG_bloc FT_MAKE_TAG( 'b', 'l', 'o', 'c' ) +#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_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_glyf FT_MAKE_TAG( 'g', 'l', 'y', 'f' ) +#define TTAG_GSUB FT_MAKE_TAG( 'G', 'S', 'U', 'B' ) +#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_kern FT_MAKE_TAG( 'k', 'e', 'r', 'n' ) +#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_MMSD FT_MAKE_TAG( 'M', 'M', 'S', 'D' ) +#define TTAG_MMFX FT_MAKE_TAG( 'M', 'M', 'F', 'X' ) +#define TTAG_name FT_MAKE_TAG( 'n', 'a', 'm', 'e' ) +#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_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 */ Index: xc/extras/freetype2/include/freetype/cache/ftcchunk.h diff -u /dev/null xc/extras/freetype2/include/freetype/cache/ftcchunk.h:1.1.1.1 --- /dev/null Mon Dec 18 14:22:31 2000 +++ xc/extras/freetype2/include/freetype/cache/ftcchunk.h Fri Dec 8 16:26:17 2000 @@ -0,0 +1,216 @@ +/***************************************************************************/ +/* */ +/* ftcchunk.h */ +/* */ +/* FreeType chunk cache (specification). */ +/* */ +/* Copyright 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. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* Important: The functions defined in this file are only used to */ + /* implement an abstract chunk cache class. You need to */ + /* provide additional logic to implement a complete cache. */ + /* For example, see `ftcmetrx.h' and `ftcmetrx.c' which */ + /* implement a glyph metrics cache based on this code. */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /********* *********/ + /********* WARNING, THIS IS BETA CODE. *********/ + /********* *********/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + +#ifndef __FTCCHUNK_H__ +#define __FTCCHUNK_H__ + +#ifndef FT_BUILD_H +# define FT_BUILD_H +#endif +#include FT_BUILD_H +#include FT_CACHE_H +#include FT_CACHE_MANAGER_H + +FT_BEGIN_HEADER + + + /* maximum number of chunk sets in a given chunk cache */ +#define FTC_MAX_CHUNK_SETS 16 + + + typedef struct FTC_ChunkNodeRec_* FTC_ChunkNode; + typedef struct FTC_ChunkSetRec_* FTC_ChunkSet; + typedef struct FTC_Chunk_CacheRec_* FTC_Chunk_Cache; + + typedef struct FTC_ChunkNodeRec_ + { + FTC_CacheNodeRec root; + FTC_ChunkSet cset; + FT_UShort cset_index; + FT_UShort num_elements; + FT_Byte* elements; + + } FTC_ChunkNodeRec; + + +#define FTC_CHUNKNODE_TO_LRUNODE( x ) ((FT_ListNode)( x )) +#define FTC_LRUNODE_TO_CHUNKNODE( x ) ((FTC_ChunkNode)( x )) + + + /*************************************************************************/ + /* */ + /* chunk set methods */ + /* */ + + /* used to set "element_max", "element_count" and "element_size" */ + typedef FT_Error (*FTC_ChunkSet_SizesFunc) ( FTC_ChunkSet cset, + FT_Pointer type ); + + typedef FT_Error (*FTC_ChunkSet_InitFunc) ( FTC_ChunkSet cset, + FT_Pointer type ); + + typedef void (*FTC_ChunkSet_DoneFunc) ( FTC_ChunkSet cset ); + + typedef FT_Bool (*FTC_ChunkSet_CompareFunc)( FTC_ChunkSet cset, + FT_Pointer type ); + + + typedef FT_Error (*FTC_ChunkSet_NewNodeFunc) ( FTC_ChunkSet cset, + FT_UInt index, + FTC_ChunkNode* anode ); + + typedef void (*FTC_ChunkSet_DestroyNodeFunc)( FTC_ChunkNode node ); + + typedef FT_ULong (*FTC_ChunkSet_SizeNodeFunc) ( FTC_ChunkNode node ); + + + typedef struct FTC_ChunkSet_Class_ + { + FT_UInt cset_byte_size; + + FTC_ChunkSet_InitFunc init; + FTC_ChunkSet_DoneFunc done; + FTC_ChunkSet_CompareFunc compare; + FTC_ChunkSet_SizesFunc sizes; + + FTC_ChunkSet_NewNodeFunc new_node; + FTC_ChunkSet_SizeNodeFunc size_node; + FTC_ChunkSet_DestroyNodeFunc destroy_node; + + } FTC_ChunkSet_Class; + + + typedef struct FTC_ChunkSetRec_ + { + FTC_Chunk_Cache cache; + FTC_Manager manager; + FT_Memory memory; + FTC_ChunkSet_Class* clazz; + FT_UInt cset_index; /* index in parent cache */ + + FT_UInt element_max; /* maximum number of elements */ + FT_UInt element_size; /* element size in bytes */ + FT_UInt element_count; /* number of elements per chunk */ + + FT_UInt num_chunks; + FTC_ChunkNode* chunks; + + } FTC_ChunkSetRec; + + + /* the abstract chunk cache class */ + typedef struct FTC_Chunk_Cache_Class_ + { + FTC_Cache_Class root; + FTC_ChunkSet_Class* cset_class; + + } FTC_Chunk_Cache_Class; + + + /* the abstract chunk cache object */ + typedef struct FTC_Chunk_CacheRec_ + { + FTC_CacheRec root; + FT_Lru csets_lru; /* static chunk set lru list */ + FTC_ChunkSet last_cset; /* small cache :-) */ + FTC_ChunkSet_CompareFunc compare; /* useful shortcut */ + + } FTC_Chunk_CacheRec; + + + /*************************************************************************/ + /* */ + /* 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. */ + /* */ + + FT_EXPORT( FT_Error ) FTC_ChunkNode_Init( FTC_ChunkNode node, + FTC_ChunkSet cset, + FT_UInt index, + FT_Bool alloc ); + +#define FTC_ChunkNode_Ref( n ) \ + FTC_CACHENODE_TO_DATA_P( &(n)->root )->ref_count++ + +#define FTC_ChunkNode_Unref( n ) \ + FTC_CACHENODE_TO_DATA_P( &(n)->root )->ref_count-- + + + /* chunk set objects */ + + FT_EXPORT( void ) FTC_ChunkNode_Destroy( FTC_ChunkNode node ); + + + FT_EXPORT( FT_Error ) FTC_ChunkSet_New ( FTC_Chunk_Cache cache, + FT_Pointer type, + FTC_ChunkSet *aset ); + + + FT_EXPORT( FT_Error ) FTC_ChunkSet_Lookup_Node( + FTC_ChunkSet cset, + FT_UInt glyph_index, + FTC_ChunkNode* anode, + FT_UInt *anindex ); + + + /* chunk cache objects */ + + FT_EXPORT( FT_Error ) FTC_Chunk_Cache_Init ( FTC_Chunk_Cache cache ); + + FT_EXPORT( void ) FTC_Chunk_Cache_Done ( FTC_Chunk_Cache cache ); + + FT_EXPORT( FT_Error ) FTC_Chunk_Cache_Lookup( FTC_Chunk_Cache cache, + FT_Pointer type, + FT_UInt gindex, + FTC_ChunkNode *anode, + FT_UInt *aindex ); + + +FT_END_HEADER + +#endif /* __FTCCHUNK_H__ */ + + +/* END */ Index: xc/extras/freetype2/include/freetype/cache/ftcglyph.h diff -u /dev/null xc/extras/freetype2/include/freetype/cache/ftcglyph.h:1.1.1.1 --- /dev/null Mon Dec 18 14:22:31 2000 +++ xc/extras/freetype2/include/freetype/cache/ftcglyph.h Fri Dec 8 16:26:17 2000 @@ -0,0 +1,209 @@ +/***************************************************************************/ +/* */ +/* ftcglyph.h */ +/* */ +/* FreeType abstract glyph cache (specification). */ +/* */ +/* Copyright 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. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* 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. */ + /* For example, see `ftcimage.h' and `ftcimage.c' which */ + /* implement a FT_Glyph cache based on this code. */ + /* */ + /* NOTE: For now, each glyph set is implemented as a static hash table. */ + /* It would be interesting to experiment with dynamic hashes to */ + /* see whether this improves performance or not (I don't know why */ + /* but something tells me it won't). */ + /* */ + /* In all cases, this change should not affect any derived glyph */ + /* cache class. */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /********* *********/ + /********* WARNING, THIS IS BETA CODE. *********/ + /********* *********/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + +#ifndef __FTCGLYPH_H__ +#define __FTCGLYPH_H__ + +#ifndef FT_BUILD_H +# define FT_BUILD_H +#endif +#include FT_BUILD_H +#include FT_CACHE_H +#include FT_CACHE_MANAGER_H +#include + +FT_BEGIN_HEADER + + + /* maximum number of glyph sets per glyph cache; must be < 256 */ +#define FTC_MAX_GLYPH_SETS 16 +#define FTC_GSET_HASH_SIZE_DEFAULT 64 + + + typedef struct FTC_GlyphSetRec_* FTC_GlyphSet; + typedef struct FTC_GlyphNodeRec_* FTC_GlyphNode; + typedef struct FTC_Glyph_CacheRec_* FTC_Glyph_Cache; + + typedef struct FTC_GlyphNodeRec_ + { + FTC_CacheNodeRec root; + FTC_GlyphNode gset_next; /* next in glyph set's bucket list */ + FT_UShort glyph_index; + FT_UShort gset_index; + + } FTC_GlyphNodeRec; + + +#define FTC_GLYPHNODE( x ) ( (FTC_GlyphNode)( x ) ) +#define FTC_GLYPHNODE_TO_LRUNODE( n ) ( (FT_ListNode)( n ) ) +#define FTC_LRUNODE_TO_GLYPHNODE( n ) ( (FTC_GlyphNode)( n ) ) + + + /*************************************************************************/ + /* */ + /* Glyph set methods. */ + /* */ + + typedef FT_Error (*FTC_GlyphSet_InitFunc) ( FTC_GlyphSet gset, + FT_Pointer type ); + + typedef void (*FTC_GlyphSet_DoneFunc) ( FTC_GlyphSet gset ); + + typedef FT_Bool (*FTC_GlyphSet_CompareFunc) ( FTC_GlyphSet gset, + FT_Pointer type ); + + + typedef FT_Error (*FTC_GlyphSet_NewNodeFunc) ( FTC_GlyphSet gset, + FT_UInt gindex, + FTC_GlyphNode* anode ); + + typedef void (*FTC_GlyphSet_DestroyNodeFunc)( FTC_GlyphNode node, + FTC_GlyphSet gset ); + + typedef FT_ULong (*FTC_GlyphSet_SizeNodeFunc) ( FTC_GlyphNode node, + FTC_GlyphSet gset ); + + + typedef struct FTC_GlyphSet_Class_ + { + FT_UInt gset_byte_size; + + FTC_GlyphSet_InitFunc init; + FTC_GlyphSet_DoneFunc done; + FTC_GlyphSet_CompareFunc compare; + + FTC_GlyphSet_NewNodeFunc new_node; + FTC_GlyphSet_SizeNodeFunc size_node; + FTC_GlyphSet_DestroyNodeFunc destroy_node; + + } FTC_GlyphSet_Class; + + + typedef struct FTC_GlyphSetRec_ + { + FTC_Glyph_Cache cache; + FTC_Manager manager; + FT_Memory memory; + FTC_GlyphSet_Class* clazz; + FT_UInt hash_size; + FTC_GlyphNode* buckets; + FT_UInt gset_index; /* index in parent cache */ + + } FTC_GlyphSetRec; + + + /* the abstract glyph cache class */ + typedef struct FTC_Glyph_Cache_Class_ + { + FTC_Cache_Class root; + FTC_GlyphSet_Class* gset_class; + + } FTC_Glyph_Cache_Class; + + + /* the abstract glyph cache object */ + typedef struct FTC_Glyph_CacheRec_ + { + FTC_CacheRec root; + FT_Lru gsets_lru; /* static sets lru list */ + FTC_GlyphSet last_gset; /* small cache :-) */ + FTC_GlyphSet_CompareFunc compare; /* useful shortcut */ + + } FTC_Glyph_CacheRec; + + + /*************************************************************************/ + /* */ + /* 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. */ + /* */ + + FT_EXPORT( void ) FTC_GlyphNode_Init( FTC_GlyphNode node, + FTC_GlyphSet gset, + FT_UInt gindex ); + +#define FTC_GlyphNode_Ref( n ) \ + FTC_CACHENODE_TO_DATA_P( &(n)->root )->ref_count++ + +#define FTC_GlyphNode_Unref( n ) \ + FTC_CACHENODE_TO_DATA_P( &(n)->root )->ref_count-- + + + FT_EXPORT( void ) FTC_GlyphNode_Destroy( FTC_GlyphNode node, + FTC_Glyph_Cache cache ); + + FT_EXPORT( FT_Error ) FTC_Glyph_Cache_Init( FTC_Glyph_Cache cache ); + + FT_EXPORT( void ) FTC_Glyph_Cache_Done( FTC_Glyph_Cache cache ); + + + FT_EXPORT( FT_Error ) FTC_GlyphSet_New( FTC_Glyph_Cache cache, + FT_Pointer type, + FTC_GlyphSet *aset ); + + FT_EXPORT( FT_Error ) FTC_GlyphSet_Lookup_Node( + FTC_GlyphSet gset, + FT_UInt glyph_index, + FTC_GlyphNode *anode ); + + FT_EXPORT( FT_Error ) FTC_Glyph_Cache_Lookup( FTC_Glyph_Cache cache, + FT_Pointer type, + FT_UInt gindex, + FTC_GlyphNode *anode ); + +FT_END_HEADER + +#endif /* __FTCGLYPH_H__ */ + + +/* END */ Index: xc/extras/freetype2/include/freetype/cache/ftcimage.h diff -u /dev/null xc/extras/freetype2/include/freetype/cache/ftcimage.h:1.1.1.1 --- /dev/null Mon Dec 18 14:22:31 2000 +++ xc/extras/freetype2/include/freetype/cache/ftcimage.h Fri Dec 8 16:26:17 2000 @@ -0,0 +1,169 @@ +/***************************************************************************/ +/* */ +/* ftcimage.c */ +/* */ +/* FreeType Image cache (body). */ +/* */ +/* Copyright 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. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* Each image cache really manages FT_Glyph objects. */ + /* */ + /*************************************************************************/ + + +#ifndef __FTCIMAGE_H__ +#define __FTCIMAGE_H__ + +#ifndef FT_BUILD_H +# define FT_BUILD_H +#endif +#include FT_BUILD_H +#include FT_CACHE_H +#include FT_CACHE_INTERNAL_GLYPH_H + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** IMAGE CACHE OBJECT *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + +#define FTC_IMAGE_FORMAT( x ) ( (x) & 7 ) + + +#define ftc_image_format_bitmap 0 +#define ftc_image_format_outline 1 + +#define ftc_image_flag_monochrome 16 +#define ftc_image_flag_unhinted 32 +#define ftc_image_flag_autohinted 64 +#define ftc_image_flag_unscaled 128 +#define ftc_image_flag_no_sbits 256 + + /* monochrome bitmap */ +#define ftc_image_mono ftc_image_format_bitmap | \ + ftc_image_flag_monochrome + /* anti-aliased bitmap */ +#define ftc_image_grays ftc_image_format_bitmap + /* scaled outline */ +#define ftc_image_outline ftc_image_format_outline + + + /*************************************************************************/ + /* */ + /* */ + /* FTC_Image_Desc */ + /* */ + /* */ + /* A simple structure used to describe a given glyph image category. */ + /* */ + /* */ + /* size :: An FTC_SizeRec used to describe the glyph's face & */ + /* size. */ + /* */ + /* image_type :: The glyph image's type. */ + /* */ + typedef struct FTC_Image_Desc_ + { + FTC_FontRec font; + FT_UInt image_type; + + } FTC_Image_Desc; + + + /*************************************************************************/ + /* */ + /* */ + /* FTC_Image_Cache */ + /* */ + /* */ + /* 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_Image_CacheRec_* FTC_Image_Cache; + + + /*************************************************************************/ + /* */ + /* */ + /* FTC_Image_Cache_New */ + /* */ + /* */ + /* Creates a new glyph image cache. */ + /* */ + /* */ + /* manager :: The parent manager for the image cache. */ + /* */ + /* */ + /* acache :: A handle to the new glyph image cache object. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + FT_EXPORT( FT_Error ) FTC_Image_Cache_New( FTC_Manager manager, + FTC_Image_Cache *acache ); + + + /*************************************************************************/ + /* */ + /* */ + /* FTC_Image_Cache_Lookup */ + /* */ + /* */ + /* Retrieves a given glyph image from a glyph image cache. */ + /* */ + /* */ + /* cache :: A handle to the source glyph image cache. */ + /* */ + /* desc :: A pointer to a glyph image descriptor. */ + /* */ + /* gindex :: The glyph index to retrieve. */ + /* */ + /* */ + /* aglyph :: The corresponding FT_Glyph object. 0 in case of */ + /* failure. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + /* */ + /* 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. */ + /* */ + /* Because the glyph image cache limits the total amount of memory */ + /* taken by the glyphs it holds, the returned glyph might disappear */ + /* on a later invocation of this function! It's a cache after all... */ + /* */ + FT_EXPORT( FT_Error ) FTC_Image_Cache_Lookup( FTC_Image_Cache cache, + FTC_Image_Desc* desc, + FT_UInt gindex, + FT_Glyph *aglyph ); + + +FT_END_HEADER + +#endif /* __FTCIMAGE_H__ */ + + +/* END */ Index: xc/extras/freetype2/include/freetype/cache/ftcmanag.h diff -u /dev/null xc/extras/freetype2/include/freetype/cache/ftcmanag.h:1.1.1.1 --- /dev/null Mon Dec 18 14:22:31 2000 +++ xc/extras/freetype2/include/freetype/cache/ftcmanag.h Fri Dec 8 16:26:17 2000 @@ -0,0 +1,370 @@ +/***************************************************************************/ +/* */ +/* ftcmanag.h */ +/* */ +/* FreeType Cache Manager (specification). */ +/* */ +/* Copyright 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. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* 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 */ + /* & 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__ + +#ifndef FT_BUILD_H +# define FT_BUILD_H +#endif +#include FT_BUILD_H +#include FT_CACHE_H +#include FT_CACHE_INTERNAL_LRU_H + +FT_BEGIN_HEADER + +#define FTC_MAX_FACES_DEFAULT 2 +#define FTC_MAX_SIZES_DEFAULT 4 +#define FTC_MAX_BYTES_DEFAULT 200000 /* 200kByte by default! */ + + /* maximum number of caches registered in a single manager */ +#define FTC_MAX_CACHES 16 + + + /*************************************************************************/ + /* */ + /* */ + /* FTC_ManagerRec */ + /* */ + /* */ + /* The cache manager structure. */ + /* */ + /* */ + /* library :: A handle to a FreeType library instance. */ + /* */ + /* faces_lru :: The lru list of FT_Face objects in the cache. */ + /* */ + /* sizes_lru :: The lru list of FT_Size objects in the cache. */ + /* */ + /* max_bytes :: The maximum number of bytes to be allocated in the */ + /* cache. This is only related to the byte size of */ + /* the nodes cached by the manager. */ + /* */ + /* num_bytes :: The current number of bytes allocated in the */ + /* cache. Only related to the byte size of cached */ + /* nodes. */ + /* */ + /* num_nodes :: The current number of nodes in the manager. */ + /* */ + /* global_lru :: The global lru list of all cache nodes. */ + /* */ + /* caches :: A table of installed/registered cache objects. */ + /* */ + /* request_data :: User-provided data passed to the requester. */ + /* */ + /* request_face :: User-provided function used to implement a mapping */ + /* between abstract FTC_FaceIDs and real FT_Face */ + /* objects. */ + /* */ + typedef struct FTC_ManagerRec_ + { + FT_Library library; + FT_Lru faces_lru; + FT_Lru sizes_lru; + + FT_ULong max_bytes; + FT_ULong num_bytes; + FT_UInt num_nodes; + FT_ListRec global_lru; + FTC_Cache caches[FTC_MAX_CACHES]; + + FT_Pointer request_data; + FTC_Face_Requester request_face; + + } FTC_ManagerRec; + + + /*************************************************************************/ + /* */ + /* */ + /* FTC_Manager_Compress */ + /* */ + /* */ + /* 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). */ + /* */ + /* */ + /* manager :: A handle to the cache manager. */ + /* */ + /* */ + /* 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_EXPORT( void ) FTC_Manager_Compress( FTC_Manager manager ); + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** 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. */ + /* */ + + typedef FT_ListNodeRec FTC_CacheNodeRec; + typedef FTC_CacheNodeRec* FTC_CacheNode; + + + /* the field `cachenode.data' is typecast to this type */ + typedef struct FTC_CacheNode_Data_ + { + FT_UShort cache_index; + FT_Short ref_count; + + } FTC_CacheNode_Data; + + + /* return a pointer to FTC_CacheNode_Data contained in a */ + /* CacheNode's `data' field */ +#define FTC_CACHENODE_TO_DATA_P( n ) \ + ( (FTC_CacheNode_Data*)&(n)->data ) + +#define FTC_LIST_TO_CACHENODE( n ) ( (FTC_CacheNode)(n) ) + + + /*************************************************************************/ + /* */ + /* */ + /* FTC_CacheNode_SizeFunc */ + /* */ + /* */ + /* A function used to compute the total size in bytes of a given */ + /* cache node. It is used by the cache manager to compute the number */ + /* of old nodes to flush when the cache is full. */ + /* */ + /* */ + /* node :: A handle to the target cache node. */ + /* */ + /* cache_data :: A generic pointer passed to the destructor. */ + /* */ + /* */ + /* The size of a given cache node in bytes. */ + /* */ + typedef FT_ULong (*FTC_CacheNode_SizeFunc)( FTC_CacheNode node, + FT_Pointer cache_data ); + + + /*************************************************************************/ + /* */ + /* */ + /* FTC_CacheNode_DestroyFunc */ + /* */ + /* */ + /* A function used to destroy a given cache node. It is called by */ + /* the manager when the cache is full and old nodes need to be */ + /* flushed out. */ + /* */ + /* */ + /* node :: A handle to the target cache node. */ + /* */ + /* cache_data :: A generic pointer passed to the destructor. */ + /* */ + typedef void (*FTC_CacheNode_DestroyFunc)( FTC_CacheNode node, + FT_Pointer cache_data ); + + + /*************************************************************************/ + /* */ + /* */ + /* FTC_CacheNode_Class */ + /* */ + /* */ + /* A very simple structure used to describe a cache node's class to */ + /* the cache manager. */ + /* */ + /* */ + /* size_node :: A function used to size the node. */ + /* */ + /* destroy_node :: A function used to destroy the node. */ + /* */ + /* */ + /* The cache node class doesn't include a `new_node' function because */ + /* the cache manager never allocates cache node directly; it */ + /* delegates this task to its cache objects. */ + /* */ + typedef struct FTC_CacheNode_Class_ + { + FTC_CacheNode_SizeFunc size_node; + FTC_CacheNode_DestroyFunc destroy_node; + + } FTC_CacheNode_Class; + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** CACHE DEFINITIONS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* */ + /* FTC_Cache_InitFunc */ + /* */ + /* */ + /* A function used to initialize a given cache object. */ + /* */ + /* */ + /* cache :: A handle to the new cache. */ + /* */ + typedef FT_Error (*FTC_Cache_InitFunc)( FTC_Cache cache ); + + + /*************************************************************************/ + /* */ + /* */ + /* FTC_Cache_DoneFunc */ + /* */ + /* */ + /* A function to finalize a given cache object. */ + /* */ + /* */ + /* cache :: A handle to the target cache. */ + /* */ + typedef void (*FTC_Cache_DoneFunc)( FTC_Cache cache ); + + + /*************************************************************************/ + /* */ + /* */ + /* FTC_Cache_Class */ + /* */ + /* */ + /* A structure used to describe a given cache object class to the */ + /* cache manager. */ + /* */ + /* */ + /* cache_byte_size :: The size of the cache object in bytes. */ + /* */ + /* init_cache :: The cache object initializer. */ + /* */ + /* done_cache :: The cache object finalizer. */ + /* */ + struct FTC_Cache_Class_ + { + FT_UInt cache_byte_size; + FTC_Cache_InitFunc init_cache; + FTC_Cache_DoneFunc done_cache; + }; + + + /*************************************************************************/ + /* */ + /* */ + /* FTC_CacheRec */ + /* */ + /* */ + /* A structure used to describe an abstract cache object. */ + /* */ + /* */ + /* manager :: A handle to the parent cache manager. */ + /* */ + /* memory :: A handle to the memory manager. */ + /* */ + /* clazz :: A pointer to the cache class. */ + /* */ + /* node_clazz :: A pointer to the cache's node class. */ + /* */ + /* cache_index :: An index of the cache in the manager's table. */ + /* */ + /* cache_data :: Data passed to the cache node */ + /* constructor/finalizer. */ + /* */ + typedef struct FTC_CacheRec_ + { + FTC_Manager manager; + FT_Memory memory; + FTC_Cache_Class* clazz; + FTC_CacheNode_Class* node_clazz; + + FT_UInt cache_index; /* in manager's table */ + FT_Pointer cache_data; /* passed to cache node methods */ + + } FTC_CacheRec; + + /* */ + +FT_END_HEADER + +#endif /* __FTCMANAG_H__ */ + + +/* END */ Index: xc/extras/freetype2/include/freetype/cache/ftcsbits.h diff -u /dev/null xc/extras/freetype2/include/freetype/cache/ftcsbits.h:1.1.1.1 --- /dev/null Mon Dec 18 14:22:31 2000 +++ xc/extras/freetype2/include/freetype/cache/ftcsbits.h Fri Dec 8 16:26:17 2000 @@ -0,0 +1,68 @@ +/***************************************************************************/ +/* */ +/* ftcsbits.h */ +/* */ +/* A small-bitmap cache (specification). */ +/* */ +/* Copyright 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. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTCSBITS_H__ +#define __FTCSBITS_H__ + +#ifndef FT_BUILD_H +# define FT_BUILD_H +#endif +#include FT_BUILD_H +#include FT_CACHE_H +#include FT_CACHE_INTERNAL_CHUNK_H +#include FT_CACHE_IMAGE_H + +FT_BEGIN_HEADER + + /* handle to small bitmap */ + typedef struct FTC_SBitRec_* FTC_SBit; + + /* handle to small bitmap cache */ + typedef struct FTC_SBit_CacheRec_* FTC_SBit_Cache; + + /* a compact structure used to hold a single small bitmap */ + typedef struct FTC_SBitRec_ + { + FT_Byte width; + FT_Byte height; + FT_Char left; + FT_Char top; + + FT_Byte format; + FT_Char pitch; + FT_Char xadvance; + FT_Char yadvance; + + FT_Byte* buffer; + + } FTC_SBitRec; + + + FT_EXPORT( FT_Error ) FTC_SBit_Cache_New( FTC_Manager manager, + FTC_SBit_Cache *acache ); + + FT_EXPORT( FT_Error ) FTC_SBit_Cache_Lookup( FTC_SBit_Cache cache, + FTC_Image_Desc* desc, + FT_UInt gindex, + FTC_SBit *sbit ); +FT_END_HEADER + +#endif /* __FTCSBITS_H__ */ + + +/* END */ Index: xc/extras/freetype2/include/freetype/cache/ftlru.h diff -u /dev/null xc/extras/freetype2/include/freetype/cache/ftlru.h:1.1.1.1 --- /dev/null Mon Dec 18 14:22:31 2000 +++ xc/extras/freetype2/include/freetype/cache/ftlru.h Fri Dec 8 16:26:17 2000 @@ -0,0 +1,173 @@ +/***************************************************************************/ +/* */ +/* ftlru.h */ +/* */ +/* Simple LRU list-cache (specification). */ +/* */ +/* Copyright 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. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* An LRU is a list that cannot hold more than a certain number of */ + /* elements (`max_elements'). All elements on 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. */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /********* *********/ + /********* WARNING, THIS IS BETA CODE. *********/ + /********* *********/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + +#ifndef __FTLRU_H__ +#define __FTLRU_H__ + +#ifndef FT_BUILD_H +# define FT_BUILD_H +#endif +#include FT_BUILD_H +#include FT_FREETYPE_H + +FT_BEGIN_HEADER + + + /* generic key type */ + typedef FT_Pointer FT_LruKey; + + + /* an lru node -- root.data points to the element */ + typedef struct FT_LruNodeRec_ + { + FT_ListNodeRec root; + FT_LruKey key; + + } FT_LruNodeRec, *FT_LruNode; + + + /* forward declaration */ + typedef struct FT_LruRec_* FT_Lru; + + + /* LRU class */ + typedef struct FT_Lru_Class_ + { + FT_UInt lru_size; /* object size in bytes */ + + /* this method is used to initialize a new list element node */ + FT_Error (*init_element)( FT_Lru lru, + FT_LruNode node ); + + /* this method is used to finalize a given list element node */ + void (*done_element)( FT_Lru lru, + FT_LruNode node ); + + /* If defined, this method is called when the list if full */ + /* during the lookup process -- it is used to change the contents */ + /* of a list element node, instead of calling `done_element()', */ + /* then `init_element'. Set it to 0 for default behaviour. */ + FT_Error (*flush_element)( FT_Lru lru, + FT_LruNode node, + FT_LruKey new_key ); + + /* If defined, this method is used to compare a list element node */ + /* with a given key during a lookup. If set to 0, the `key' */ + /* fields will be directly compared instead. */ + FT_Bool (*compare_element)( FT_LruNode node, + FT_LruKey key ); + + } FT_Lru_Class; + + + /* A selector is used to indicate whether a given list element node */ + /* is part of a selection for FT_Lru_Remove_Selection(). The function */ + /* must return true (i.e., non-null) to indicate that the node is part */ + /* of it. */ + typedef FT_Bool (*FT_Lru_Selector)( FT_Lru lru, + FT_LruNode node, + FT_Pointer data ); + + + typedef struct FT_LruRec_ + { + FT_Lru_Class* clazz; + FT_UInt max_elements; + FT_UInt num_elements; + FT_ListRec elements; + FT_Memory memory; + FT_Pointer user_data; + + /* the following fields are only meaningful for static lru containers */ + FT_ListRec free_nodes; + FT_LruNode nodes; + + } FT_LruRec; + + + FT_EXPORT( FT_Error ) FT_Lru_New( const FT_Lru_Class* clazz, + FT_UInt max_elements, + FT_Pointer user_data, + FT_Memory memory, + FT_Bool pre_alloc, + FT_Lru *anlru ); + + FT_EXPORT( void ) FT_Lru_Reset( FT_Lru lru ); + + FT_EXPORT( void ) FT_Lru_Done ( FT_Lru lru ); + + FT_EXPORT( FT_Error ) FT_Lru_Lookup_Node( FT_Lru lru, + FT_LruKey key, + FT_LruNode *anode ); + + FT_EXPORT( FT_Error ) FT_Lru_Lookup( FT_Lru lru, + FT_LruKey key, + FT_Pointer *anobject ); + + FT_EXPORT( void ) FT_Lru_Remove_Node( FT_Lru lru, + FT_LruNode node ); + + FT_EXPORT( void ) FT_Lru_Remove_Selection( FT_Lru lru, + FT_Lru_Selector selector, + FT_Pointer data ); + +FT_END_HEADER + +#endif /* __FTLRU_H__ */ + + +/* END */ Index: xc/extras/freetype2/include/freetype/config/ftbuild.h diff -u /dev/null xc/extras/freetype2/include/freetype/config/ftbuild.h:1.1.1.1 --- /dev/null Mon Dec 18 14:22:31 2000 +++ xc/extras/freetype2/include/freetype/config/ftbuild.h Fri Dec 8 16:26:17 2000 @@ -0,0 +1,210 @@ +/***************************************************************************/ +/* */ +/* ftbuild.h */ +/* */ +/* Build macros of the FreeType 2 library. */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#ifndef __FT_BUILD_H__ +#define __FT_BUILD_H__ + + + /*************************************************************************/ + /* */ + /* The macro FT_ROOT is used to define the root of all public header */ + /* files for FreeType 2. By default, it is set to "freetype", which */ + /* means that all public files should be included with a line like: */ + /* */ + /* #include */ + /* */ + /* Redefine it to something different if necessary, depending where the */ + /* library is installed on the particular system. */ + /* */ +#ifndef FT_ROOT +#define FT_ROOT freetype +#endif + + + /*************************************************************************/ + /* */ + /* The macro FT_CONFIG_ROOT is used to define the root of all */ + /* configuration header files for FreeType 2. By default, it is set to */ + /* "freetype/config", which means that all config files should be */ + /* include with a line like: */ + /* */ + /* #include */ + /* */ + /* Redefine it to something different, depending where the library is */ + /* installed on the particular system. */ + /* */ +#ifndef FT_CONFIG_ROOT +#define FT_CONFIG_ROOT FT_ROOT/config +#endif + + + /*************************************************************************/ + /* */ + /* The macro FT_PUBLIC_FILE is used to include a FreeType 2 public file. */ + /* Its parameter is the file pathname, relative to the public root of a */ + /* given header file. */ + /* */ +#define FT_PUBLIC_FILE( x ) + + + /*************************************************************************/ + /* */ + /* The macro FT_CONFIG_FILE is used to include a FreeType 2 config file. */ + /* Its parameter is the file pathname, relative to the configuration */ + /* root directory of a given header file. */ + /* */ +#define FT_CONFIG_FILE( x ) + + + /*************************************************************************/ + /* */ + /* The macro FT_INTERNAL_FILE is used to include a FreeType 2 internal */ + /* file. Its parameter is the file pathname, relative to the */ + /* configuration root directory of a given header file. */ + /* */ +#define FT_INTERNAL_FILE( x ) + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT_FILE is used to include a given FreeType 2 */ + /* component source file (be it a header, a C source file, or an */ + /* included file). */ + /* */ + /* Its first argument is the component/module's directory according to */ + /* the normal FreeType 2 source directory hierarchy, and the second one */ + /* the file name. */ + /* */ + /* Note that you can also put all library source files in a single */ + /* directory and compile them normally by defining the macro */ + /* FT_FLAT_COMPILATION. */ + /* */ +#define FT_COMPONENT_FILE( d, x ) + + + /*************************************************************************/ + /* */ + /* The macro FT_SOURCE_FILE is used to include a given FreeType 2 */ + /* component source file (be it a header, a C source file, or an */ + /* included file). */ + /* */ + /* Its first argument is the component/module's directory according to */ + /* the normal FreeType 2 source directory hierarchy, and the second one */ + /* the file name. */ + /* */ + /* Note that you can also put all library source files in a single */ + /* directory and compile them normally by defining the macro */ + /* FT_FLAT_COMPILATION. */ + /* */ +#ifdef FT_FLAT_COMPILATION +#define FT_SOURCE_FILE( d, x ) +#else +#define FT_SOURCE_FILE( d, x ) "x" +#endif + + + /*************************************************************************/ + /* */ + /* */ + /* 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. */ + /* */ + /*************************************************************************/ + + /* don't add spaces around arguments to FT_CONFIG_FILE! */ + + /* configuration files */ +#ifndef FT_CONFIG_CONFIG_H +# define FT_CONFIG_CONFIG_H FT_CONFIG_FILE(ftconfig.h) +#endif + +#ifndef FT_CONFIG_OPTIONS_H +# define FT_CONFIG_OPTIONS_H FT_CONFIG_FILE(ftoption.h) +#endif + +#ifndef FT_CONFIG_MODULES_H +# define FT_CONFIG_MODULES_H FT_CONFIG_FILE(ftmodule.h) +#endif + + /* public headers */ +#define FT_ERRORS_H FT_PUBLIC_FILE(fterrors.h) +#define FT_SYSTEM_H FT_PUBLIC_FILE(ftsystem.h) +#define FT_IMAGE_H FT_PUBLIC_FILE(ftimage.h) + +#define FT_TYPES_H FT_PUBLIC_FILE(fttypes.h) + +#define FT_FREETYPE_H FT_PUBLIC_FILE(freetype.h) +#define FT_GLYPH_H FT_PUBLIC_FILE(ftglyph.h) +#define FT_BBOX_H FT_PUBLIC_FILE(ftbbox.h) +#define FT_CACHE_H FT_PUBLIC_FILE(ftcache.h) +#define FT_LIST_H FT_PUBLIC_FILE(ftlist.h) +#define FT_MAC_H FT_PUBLIC_FILE(ftmac.h) +#define FT_MULTIPLE_MASTERS_H FT_PUBLIC_FILE(ftmm.h) +#define FT_MODULE_H FT_PUBLIC_FILE(ftmodule.h) +#define FT_NAMES_H FT_PUBLIC_FILE(ftnames.h) +#define FT_OUTLINE_H FT_PUBLIC_FILE(ftoutln.h) +#define FT_RENDER_H FT_PUBLIC_FILE(ftrender.h) +#define FT_SYNTHESIS_H FT_PUBLIC_FILE(ftsynth.h) +#define FT_TYPE1_TABLES_H FT_PUBLIC_FILE(t1tables.h) +#define FT_TRUETYPE_NAMES_H FT_PUBLIC_FILE(ttnameid.h) +#define FT_TRUETYPE_TABLES_H FT_PUBLIC_FILE(tttables.h) +#define FT_TRUETYPE_TAGS_H FT_PUBLIC_FILE(tttags.h) + + + /* now include internal headers definitions from */ +#include FT_PUBLIC_FILE(internal/internal.h) + + +#endif /* __FT_BUILD_H__ */ + + +/* END */ Index: xc/extras/freetype2/include/freetype/config/ftconfig.h diff -u /dev/null xc/extras/freetype2/include/freetype/config/ftconfig.h:1.1.1.1 --- /dev/null Mon Dec 18 14:22:31 2000 +++ xc/extras/freetype2/include/freetype/config/ftconfig.h Fri Dec 8 16:26:17 2000 @@ -0,0 +1,272 @@ +/***************************************************************************/ +/* */ +/* ftconfig.h */ +/* */ +/* ANSI-specific configuration file (specification only). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* 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 the header file containing all developer build options */ +#ifndef FT_BUILD_H +#define FT_BUILD_H +#endif + +#include FT_BUILD_H +#include FT_CONFIG_OPTIONS_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. */ + /* */ + /*************************************************************************/ + + + /* We use values to know the sizes of the types. */ +#include + + /* The number of bytes in an `int' type. */ +#if UINT_MAX == 0xFFFFFFFF +#define FT_SIZEOF_INT 4 +#elif UINT_MAX == 0xFFFF +#define FT_SIZEOF_INT 2 +#elif UINT_MAX > 0xFFFFFFFF && UINT_MAX == 0xFFFFFFFFFFFFFFFF +#define FT_SIZEOF_INT 8 +#else +#error "Unsupported number of bytes in `int' type!" +#endif + + /* The number of bytes in a `long' type. */ +#if ULONG_MAX == 0xFFFFFFFF +#define FT_SIZEOF_LONG 4 +#elif ULONG_MAX > 0xFFFFFFFF && ULONG_MAX == 0xFFFFFFFFFFFFFFFF +#define FT_SIZEOF_LONG 8 +#else +#error "Unsupported number of bytes in `long' type!" +#endif + + + /* Preferred alignment of data */ +#define FT_ALIGNMENT 8 + + + /* 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. */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* 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 + +#if FT_SIZEOF_LONG == 8 + + /* FT_LONG64 must be defined if a 64-bit type is available */ +#define FT_LONG64 +#define FT_INT64 long + +#else + + /*************************************************************************/ + /* */ + /* Many compilers provide the non-ANSI `long long' 64-bit type. You can */ + /* activate it by defining the FTCALC_USE_LONG_LONG macro in */ + /* `ftoption.h'. */ + /* */ + /* Note that this will produce many -ansi warnings during library */ + /* compilation, and that in many cases, the generated code will be */ + /* neither smaller nor faster! */ + /* */ +#ifdef FTCALC_USE_LONG_LONG + +#define FT_LONG64 +#define FT_INT64 long long + +#endif /* FTCALC_USE_LONG_LONG */ +#endif /* FT_SIZEOF_LONG == 8 */ + + +#ifdef FT_MAKE_OPTION_SINGLE_OBJECT + +#define FT_LOCAL static +#define FT_LOCAL_DEF static + +#else + +#ifdef __cplusplus +#define FT_LOCAL extern "C" +#define FT_LOCAL_DEF extern "C" +#else +#define FT_LOCAL extern +#define FT_LOCAL_DEF extern +#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. Note that we do this for convenience -- please */ + /* don't ask for more C++ features. */ + /* */ + + /* 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. */ + /* */ +#ifdef __cplusplus + +#define FT_CALLBACK_DEF extern "C" +#define FT_CALLBACK_TABLE extern "C" +#define FT_CALLBACK_TABLE_DEF extern "C" + +#else + +#define FT_CALLBACK_DEF static +#define FT_CALLBACK_TABLE extern +#define FT_CALLBACK_TABLE_DEF + +#endif /* __cplusplus */ + +FT_END_HEADER + + +#endif /* __FTCONFIG_H__ */ + + +/* END */ Index: xc/extras/freetype2/include/freetype/config/ftmodule.h diff -u /dev/null xc/extras/freetype2/include/freetype/config/ftmodule.h:1.1.1.1 --- /dev/null Mon Dec 18 14:22:31 2000 +++ xc/extras/freetype2/include/freetype/config/ftmodule.h Fri Dec 8 16:26:17 2000 @@ -0,0 +1,11 @@ +FT_USE_MODULE(autohint_module_class) +FT_USE_MODULE(cff_driver_class) +FT_USE_MODULE(t1cid_driver_class) +FT_USE_MODULE(psaux_module_class) +FT_USE_MODULE(psnames_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(tt_driver_class) +FT_USE_MODULE(t1_driver_class) +FT_USE_MODULE(winfnt_driver_class) Index: xc/extras/freetype2/include/freetype/config/ftoption.h diff -u /dev/null xc/extras/freetype2/include/freetype/config/ftoption.h:1.1.1.1 --- /dev/null Mon Dec 18 14:22:31 2000 +++ xc/extras/freetype2/include/freetype/config/ftoption.h Fri Dec 8 16:26:17 2000 @@ -0,0 +1,400 @@ +/***************************************************************************/ +/* */ +/* ftoption.h */ +/* */ +/* User-selectable configuration macros (specification only). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#ifndef FTOPTION_H +#define FTOPTION_H + + +#ifdef __cplusplus + extern "C" { +#endif + + + /*************************************************************************/ + /* */ + /* USER-SELECTABLE CONFIGURATION MACROS */ + /* */ + /* These macros can be toggled by developers to enable or disable */ + /* certain aspects of FreeType. This is a default file, where all major */ + /* options are enabled. */ + /* */ + /* Note that if some modifications are required for your build, we */ + /* advise you to put a modified copy of this file in your build */ + /* directory, rather than modifying it in-place. */ + /* */ + /* The build directory is normally `freetype/builds/' and */ + /* contains build or system-specific files that are included in */ + /* priority when building the library. */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** 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 ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* Convenience functions support */ + /* */ + /* Some functions of the FreeType 2 API are provided as a convenience */ + /* for client applications and developers. However, they are not */ + /* required to build and run the library itself. */ + /* */ + /* By defining this configuration macro, you'll disable the */ + /* compilation of these functions at build time. This can be useful */ + /* to reduce the library's code size when you don't need any of */ + /* these functions. */ + /* */ + /* All convenience functions are declared as such in their */ + /* documentation. */ + /* */ +#undef FT_CONFIG_OPTION_NO_CONVENIENCE_FUNCS + + + /*************************************************************************/ + /* */ + /* Alternate Glyph Image Format support */ + /* */ + /* By default, the glyph images returned by the FreeType glyph loader */ + /* can either be a pixmap or a vectorial outline defined through */ + /* Bezier control points. When defining the following configuration */ + /* macro, some font drivers will be able to register alternate */ + /* glyph image formats. */ + /* */ + /* Unset this macro if you are sure that you will never use a font */ + /* driver with an alternate glyph format; this will reduce the size of */ + /* the base layer code. */ + /* */ + /* Note that a few Type 1 fonts, as well as Windows `vector' fonts */ + /* use a vector `plotter' format that isn't supported when this */ + /* macro is undefined. */ + /* */ +#define FT_CONFIG_OPTION_ALTERNATE_GLYPH_FORMATS + + + /*************************************************************************/ + /* */ + /* Glyph Postscript Names handling */ + /* */ + /* By default, FreeType 2 is compiled with the `PSNames' module. This */ + /* 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 + + + /*************************************************************************/ + /* */ + /* Many compilers provide the non-ANSI `long long' 64-bit type. You can */ + /* activate it by defining the FTCALC_USE_LONG_LONG macro. Note that */ + /* this will produce many -ansi warnings during library compilation, and */ + /* that in many cases the generated code will not be smaller or faster! */ + /* */ +#undef FTCALC_USE_LONG_LONG + + + /*************************************************************************/ + /* */ + /* 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. */ + /* */ +#undef FT_EXPORT +#undef FT_EXPORT_DEF + + + /*************************************************************************/ + /* */ + /* 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! */ + /* */ +#undef FT_DEBUG_LEVEL_ERROR +#undef FT_DEBUG_LEVEL_TRACE + + + /*************************************************************************/ + /* */ + /* Computation Algorithms */ + /* */ + /* Used for debugging, this configuration macro should disappear */ + /* soon. */ + /* */ +#define FT_CONFIG_OPTION_OLD_CALCS + + + /*************************************************************************/ + /* */ + /* 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. */ + /* */ +#define FT_RENDER_POOL_SIZE 32768 + + + /*************************************************************************/ + /* */ + /* FT_MAX_MODULES */ + /* */ + /* The maximum number of modules that can be registered in a single */ + /* FreeType library object. 16 is the default. */ + /* */ +#define FT_MAX_MODULES 16 + + + /*************************************************************************/ + /* */ + /* FT_MAX_EXTENSIONS */ + /* */ + /* The maximum number of extensions that can be registered in a single */ + /* font driver. 8 is the default. */ + /* */ + /* If you don't know what this means, you certainly do not need to */ + /* change this value. */ + /* */ +#define FT_MAX_EXTENSIONS 8 + + + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** 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 + + + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** 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. */ + /* */ +#define TT_CONFIG_OPTION_BYTECODE_INTERPRETER + + + /*************************************************************************/ + /* */ + /* 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 + + + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** 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 T1_CONFIG_OPTION_DISABLE_HINTER if you want to generate a */ + /* driver with no hinter. This can be useful to debug the parser. */ + /* */ +#undef T1_CONFIG_OPTION_DISABLE_HINTER + + + /*************************************************************************/ + /* */ + /* 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 + + +#ifdef __cplusplus + } +#endif + + +#endif /* FTOPTION_H */ + + +/* END */ Index: xc/extras/freetype2/include/freetype/internal/autohint.h diff -u /dev/null xc/extras/freetype2/include/freetype/internal/autohint.h:1.1.1.1 --- /dev/null Mon Dec 18 14:22:31 2000 +++ xc/extras/freetype2/include/freetype/internal/autohint.h Fri Dec 8 16:26:17 2000 @@ -0,0 +1,201 @@ +/***************************************************************************/ +/* */ +/* autohint.h */ +/* */ +/* High-level `autohint' module-specific interface (specification). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* 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 */ + /* agressively 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. */ + /* */ + /*************************************************************************/ + +#ifndef FT_BUILD_H +# define FT_BUILD_H +#endif +#include FT_BUILD_H +#include FT_FREETYPE_H + +FT_BEGIN_HEADER + + typedef struct FT_AutoHinterRec_ *FT_AutoHinter; + + + /*************************************************************************/ + /* */ + /* */ + /* FT_AutoHinter_Get_Global_Func */ + /* */ + /* */ + /* 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_Done_Global_Func(). */ + /* */ + /* */ + /* hinter :: A handle to the source auto-hinter. */ + /* */ + /* face :: A handle to the source face object. */ + /* */ + /* */ + /* global_hints :: A typeless pointer to the global hints. */ + /* */ + /* global_len :: The size in bytes of the global hints. */ + /* */ + typedef void (*FT_AutoHinter_Get_Global_Func)( + FT_AutoHinter hinter, + FT_Face face, + void** global_hints, + long* global_len ); + + + /*************************************************************************/ + /* */ + /* */ + /* FT_AutoHinter_Done_Global_Func */ + /* */ + /* */ + /* Discards the global hints retrieved through */ + /* FT_AutoHinter_Get_Global_Func(). This is the only way these hints */ + /* are freed from memory. */ + /* */ + /* */ + /* hinter :: A handle to the auto-hinter module. */ + /* */ + /* global :: A pointer to retrieved global hints to discard. */ + /* */ + typedef void (*FT_AutoHinter_Done_Global_Func)( FT_AutoHinter hinter, + void* global ); + + + /*************************************************************************/ + /* */ + /* */ + /* FT_AutoHinter_Reset_Func */ + /* */ + /* */ + /* 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). */ + /* */ + /* */ + /* hinter :: A handle to the source auto-hinter. */ + /* */ + /* face :: A handle to the face. */ + /* */ + typedef void (*FT_AutoHinter_Reset_Func)( FT_AutoHinter hinter, + FT_Face face ); + + + /*************************************************************************/ + /* */ + /* */ + /* FT_AutoHinter_Load_Func */ + /* */ + /* */ + /* This function is used to load, scale, and automatically hint a */ + /* glyph from a given face. */ + /* */ + /* */ + /* face :: A handle to the face. */ + /* glyph_index :: The glyph index. */ + /* load_flags :: The load flags. */ + /* */ + /* */ + /* 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_Load_Func)( FT_AutoHinter hinter, + FT_GlyphSlot slot, + FT_Size size, + FT_UInt glyph_index, + FT_ULong load_flags ); + + + /*************************************************************************/ + /* */ + /* */ + /* FT_AutoHinter_Interface */ + /* */ + /* */ + /* The auto-hinter module's interface. */ + /* */ + typedef struct FT_AutoHinter_Interface + { + FT_AutoHinter_Reset_Func reset_face; + FT_AutoHinter_Load_Func load_glyph; + + FT_AutoHinter_Get_Global_Func get_global_hints; + FT_AutoHinter_Done_Global_Func done_global_hints; + + } FT_AutoHinter_Interface; + + +FT_END_HEADER + +#endif /* __AUTOHINT_H__ */ + + +/* END */ Index: xc/extras/freetype2/include/freetype/internal/fnttypes.h diff -u /dev/null xc/extras/freetype2/include/freetype/internal/fnttypes.h:1.1.1.1 --- /dev/null Mon Dec 18 14:22:32 2000 +++ xc/extras/freetype2/include/freetype/internal/fnttypes.h Fri Dec 8 16:26:18 2000 @@ -0,0 +1,156 @@ +/***************************************************************************/ +/* */ +/* fnttypes.h */ +/* */ +/* Basic Windows FNT/FON type definitions and interface (specification */ +/* only). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#ifndef __FNTTYPES_H__ +#define __FNTTYPES_H__ + +#ifndef FT_BUILD_H +# define FT_BUILD_H +#endif +#include FT_BUILD_H +#include FT_FREETYPE_H + +FT_BEGIN_HEADER + + + typedef struct WinMZ_Header_ + { + FT_UShort magic; + /* skipped content */ + FT_UShort lfanew; + + } WinMZ_Header; + + + typedef struct WinNE_Header_ + { + FT_UShort magic; + /* skipped content */ + FT_UShort resource_tab_offset; + FT_UShort rname_tab_offset; + + } WinNE_Header; + + + typedef struct WinNameInfo_ + { + FT_UShort offset; + FT_UShort length; + FT_UShort flags; + FT_UShort id; + FT_UShort handle; + FT_UShort usage; + + } WinNameInfo; + + + typedef struct WinResourceInfo_ + { + FT_UShort type_id; + FT_UShort count; + + } WinResourceInfo; + + +#define WINFNT_MZ_MAGIC 0x5A4D +#define WINFNT_NE_MAGIC 0x454E + + + typedef struct WinFNT_Header_ + { + 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_Byte reserved2[4]; + + } WinFNT_Header; + + + typedef struct FNT_Font_ + { + FT_ULong offset; + FT_Int size_shift; + + WinFNT_Header header; + + FT_Byte* fnt_frame; + FT_ULong fnt_size; + + } FNT_Font; + + + typedef struct FNT_SizeRec_ + { + FT_SizeRec root; + FNT_Font* font; + + } FNT_SizeRec, *FNT_Size; + + + typedef struct FNT_FaceRec_ + { + FT_FaceRec root; + + FT_UInt num_fonts; + FNT_Font* fonts; + + FT_CharMap charmap_handle; + FT_CharMapRec charmap; /* a single charmap per face */ + + } FNT_FaceRec, *FNT_Face; + + +FT_END_HEADER + +#endif /* __FNTTYPES_H__ */ + + +/* END */ Index: xc/extras/freetype2/include/freetype/internal/ftcalc.h diff -u /dev/null xc/extras/freetype2/include/freetype/internal/ftcalc.h:1.1.1.1 --- /dev/null Mon Dec 18 14:22:32 2000 +++ xc/extras/freetype2/include/freetype/internal/ftcalc.h Fri Dec 8 16:26:18 2000 @@ -0,0 +1,225 @@ +/***************************************************************************/ +/* */ +/* ftcalc.h */ +/* */ +/* Arithmetic computations (specification). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTCALC_H__ +#define __FTCALC_H__ + +#ifndef FT_BUILD_H +# define FT_BUILD_H +#endif +#include FT_BUILD_H +#include FT_FREETYPE_H + +FT_BEGIN_HEADER + + +#ifdef FT_LONG64 + + + typedef FT_INT64 FT_Int64; + +#define ADD_64( x, y, z ) z = (x) + (y) +#define MUL_64( x, y, z ) z = (FT_Int64)(x) * (y) +#define DIV_64( x, y ) ( (x) / (y) ) + +#ifdef FT_CONFIG_OPTION_OLD_CALCS + +#define SQRT_64( z ) FT_Sqrt64( z ) + + /*************************************************************************/ + /* */ + /* */ + /* FT_Sqrt64 */ + /* */ + /* */ + /* Computes the square root of a 64-bit value. That sounds stupid, */ + /* but it is needed to obtain maximal accuracy in the TrueType */ + /* bytecode interpreter. */ + /* */ + /* */ + /* l :: A 64-bit integer. */ + /* */ + /* */ + /* The 32-bit square-root. */ + /* */ + FT_EXPORT( FT_Int32 ) FT_Sqrt64( FT_Int64 l ); + +#endif /* FT_CONFIG_OPTION_OLD_CALCS */ + + +#else /* FT_LONG64 */ + + + typedef struct FT_Int64_ + { + FT_UInt32 lo; + FT_UInt32 hi; + + } FT_Int64; + + +#define ADD_64( x, y, z ) FT_Add64( &x, &y, &z ) +#define MUL_64( x, y, z ) FT_MulTo64( x, y, &z ) +#define DIV_64( x, y ) FT_Div64by32( &x, y ) + + + /*************************************************************************/ + /* */ + /* */ + /* FT_Add64 */ + /* */ + /* */ + /* Add two Int64 values. */ + /* */ + /* */ + /* x :: A pointer to the first value to be added. */ + /* y :: A pointer to the second value to be added. */ + /* */ + /* */ + /* z :: A pointer to the result of `x + y'. */ + /* */ + /* */ + /* Will be wrapped by the ADD_64() macro. */ + /* */ + FT_EXPORT( void ) FT_Add64( FT_Int64* x, + FT_Int64* y, + FT_Int64 *z ); + + + /*************************************************************************/ + /* */ + /* */ + /* FT_MulTo64 */ + /* */ + /* */ + /* Multiplies two Int32 integers. Returns an Int64 integer. */ + /* */ + /* */ + /* x :: The first multiplier. */ + /* y :: The second multiplier. */ + /* */ + /* */ + /* z :: A pointer to the result of `x * y'. */ + /* */ + /* */ + /* Will be wrapped by the MUL_64() macro. */ + /* */ + FT_EXPORT( void ) FT_MulTo64( FT_Int32 x, + FT_Int32 y, + FT_Int64 *z ); + + + /*************************************************************************/ + /* */ + /* */ + /* FT_Div64by32 */ + /* */ + /* */ + /* Divides an Int64 value by an Int32 value. Returns an Int32 */ + /* integer. */ + /* */ + /* */ + /* x :: A pointer to the dividend. */ + /* y :: The divisor. */ + /* */ + /* */ + /* The result of `x / y'. */ + /* */ + /* */ + /* Will be wrapped by the DIV_64() macro. */ + /* */ + FT_EXPORT( FT_Int32 ) FT_Div64by32( FT_Int64* x, + FT_Int32 y ); + + +#ifdef FT_CONFIG_OPTION_OLD_CALCS + + FT_EXPORT( FT_Int32 ) FT_SqrtFixed( FT_Int32 x ); + +#define SQRT_64( z ) FT_Sqrt64( &z ) + + /*************************************************************************/ + /* */ + /* */ + /* FT_Sqrt64 */ + /* */ + /* */ + /* Computes the square root of a 64-bits value. That sounds stupid, */ + /* but it is needed to obtain maximal accuracy in the TrueType */ + /* bytecode interpreter. */ + /* */ + /* */ + /* z :: A pointer to a 64-bit integer. */ + /* */ + /* */ + /* The 32-bit square-root. */ + /* */ + FT_EXPORT( FT_Int32 ) FT_Sqrt64( FT_Int64* x ); + +#endif /* FT_CONFIG_OPTION_OLD_CALCS */ + + +#endif /* FT_LONG64 */ + + +#ifndef FT_CONFIG_OPTION_OLD_CALCS + +#define SQRT_32( x ) FT_Sqrt32( x ) + + /*************************************************************************/ + /* */ + /* */ + /* FT_Sqrt32 */ + /* */ + /* */ + /* Computes the square root of an Int32 integer (which will be */ + /* handled as an unsigned long value). */ + /* */ + /* */ + /* x :: The value to compute the root for. */ + /* */ + /* */ + /* The result of `sqrt(x)'. */ + /* */ + FT_EXPORT( FT_Int32 ) FT_Sqrt32( FT_Int32 x ); + +#endif /* !FT_CONFIG_OPTION_OLD_CALCS */ + + + /*************************************************************************/ + /* */ + /* FT_MulDiv() and FT_MulFix() are declared in freetype.h. */ + /* */ + /*************************************************************************/ + + +#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 */ Index: xc/extras/freetype2/include/freetype/internal/ftdebug.h diff -u /dev/null xc/extras/freetype2/include/freetype/internal/ftdebug.h:1.1.1.1 --- /dev/null Mon Dec 18 14:22:32 2000 +++ xc/extras/freetype2/include/freetype/internal/ftdebug.h Fri Dec 8 16:26:18 2000 @@ -0,0 +1,226 @@ +/***************************************************************************/ +/* */ +/* ftdebug.h */ +/* */ +/* Debugging and logging component (specification). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTDEBUG_H__ +#define __FTDEBUG_H__ + +#ifndef FT_BUILD_H +# define FT_BUILD_H +#endif +#include FT_BUILD_H +#include FT_CONFIG_CONFIG_H + +FT_BEGIN_HEADER + +#ifdef FT_DEBUG_LEVEL_TRACE + + + /* note that not all levels are used currently */ + + typedef enum FT_Trace_ + { + /* the first level must always be `trace_any' */ + trace_any = 0, + + /* base components */ + trace_aaraster, /* anti-aliasing raster (ftgrays.c) */ + trace_calc, /* calculations (ftcalc.c) */ + trace_extend, /* extension manager (ftextend.c) */ + trace_glyph, /* glyph manager (ftglyph.c) */ + trace_io, /* i/o monitoring (ftsystem.c) */ + trace_init, /* initialization (ftinit.c) */ + trace_list, /* list manager (ftlist.c) */ + trace_memory, /* memory manager (ftobjs.c) */ + trace_mm, /* MM interface (ftmm.c) */ + trace_objs, /* base objects (ftobjs.c) */ + trace_outline, /* outline management (ftoutln.c) */ + trace_raster, /* rasterizer (ftraster.c) */ + trace_stream, /* stream manager (ftstream.c) */ + + /* Cache sub-system */ + trace_cache, + + /* SFNT driver components */ + trace_sfobjs, /* SFNT object handler (sfobjs.c) */ + trace_ttcmap, /* charmap handler (ttcmap.c) */ + trace_ttload, /* basic TrueType tables (ttload.c) */ + trace_ttpost, /* PS table processing (ttpost.c) */ + trace_ttsbit, /* TrueType sbit handling (ttsbit.c) */ + + /* TrueType driver components */ + trace_ttdriver, /* TT font driver (ttdriver.c) */ + trace_ttgload, /* TT glyph loader (ttgload.c) */ + trace_ttinterp, /* bytecode interpreter (ttinterp.c) */ + trace_ttobjs, /* TT objects manager (ttobjs.c) */ + trace_ttpload, /* TT data/program loader (ttpload.c) */ + + /* Type 1 driver components */ + trace_t1driver, + trace_t1gload, + trace_t1hint, + trace_t1load, + trace_t1objs, + trace_t1parse, + + /* PostScript helper module `psaux' */ + trace_t1decode, + trace_psobjs, + + /* Type 2 driver components */ + trace_t2driver, + trace_t2gload, + trace_t2load, + trace_t2objs, + trace_t2parse, + + /* CID driver components */ + trace_cidafm, + trace_ciddriver, + trace_cidgload, + trace_cidload, + trace_cidobjs, + trace_cidparse, + + /* Windows fonts component */ + trace_winfnt, + + /* the last level must always be `trace_max' */ + trace_max + + } FT_Trace; + + + /* declared in ftdebug.c */ + extern char ft_trace_levels[trace_max]; + + + /*************************************************************************/ + /* */ + /* IMPORTANT! */ + /* */ + /* Each component must define the macro FT_COMPONENT to a valid FT_Trace */ + /* value before using any TRACE macro. */ + /* */ + /*************************************************************************/ + + +#define FT_TRACE( level, varformat ) \ + do \ + { \ + if ( ft_trace_levels[FT_COMPONENT] >= level ) \ + FT_Message varformat; \ + } while ( 0 ) + + + /*************************************************************************/ + /* */ + /* */ + /* FT_SetTraceLevel */ + /* */ + /* */ + /* Sets the trace level for debugging. */ + /* */ + /* */ + /* component :: The component which should be traced. See above for */ + /* a complete list. If set to `trace_any', all */ + /* components will be traced. */ + /* */ + /* level :: The tracing level. */ + /* */ + FT_EXPORT( void ) FT_SetTraceLevel( FT_Trace component, + char level ); + + +#elif defined( FT_DEBUG_LEVEL_ERROR ) + + +#define FT_TRACE( level, varformat ) do ; while ( 0 ) /* nothing */ + + +#else /* release mode */ + + +#define FT_Assert( condition ) do ; while ( 0 ) /* nothing */ + +#define FT_TRACE( level, varformat ) do ; while ( 0 ) /* nothing */ +#define FT_ERROR( varformat ) do ; while ( 0 ) /* nothing */ + + +#endif /* FT_DEBUG_LEVEL_TRACE, FT_DEBUG_LEVEL_ERROR */ + + + /*************************************************************************/ + /* */ + /* Define macros and functions that are common to the debug and trace */ + /* modes. */ + /* */ + /* You need vprintf() to be able to compile ftdebug.c. */ + /* */ + /*************************************************************************/ + + +#if defined( FT_DEBUG_LEVEL_TRACE ) || defined( FT_DEBUG_LEVEL_ERROR ) + + +#include "stdio.h" /* for vprintf() */ + + +#define FT_Assert( condition ) \ + do \ + { \ + if ( !( condition ) ) \ + FT_Panic( "assertion failed on line %d of file %s\n", \ + __LINE__, __FILE__ ); \ + } while ( 0 ) + + /* print a message */ + FT_EXPORT( void ) FT_Message( const char* fmt, ... ); + + /* print a message and exit */ + FT_EXPORT( void ) FT_Panic( const char* fmt, ... ); + +#define FT_ERROR( varformat ) FT_Message varformat + + +#endif /* FT_DEBUG_LEVEL_TRACE || FT_DEBUG_LEVEL_ERROR */ + + + /*************************************************************************/ + /* */ + /* 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 ) + + +FT_END_HEADER + +#endif /* __FTDEBUG_H__ */ + + +/* END */ Index: xc/extras/freetype2/include/freetype/internal/ftdriver.h diff -u /dev/null xc/extras/freetype2/include/freetype/internal/ftdriver.h:1.1.1.1 --- /dev/null Mon Dec 18 14:22:32 2000 +++ xc/extras/freetype2/include/freetype/internal/ftdriver.h Fri Dec 8 16:26:18 2000 @@ -0,0 +1,188 @@ +/***************************************************************************/ +/* */ +/* ftdriver.h */ +/* */ +/* FreeType font driver interface (specification). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTDRIVER_H__ +#define __FTDRIVER_H__ + +#ifndef FT_BUILD_H +# define FT_BUILD_H +#endif +#include FT_BUILD_H +#include FT_MODULE_H + +FT_BEGIN_HEADER + + + typedef FT_Error (*FTDriver_initFace) ( FT_Stream stream, + FT_Face face, + FT_Int typeface_index, + FT_Int num_params, + FT_Parameter* parameters ); + + typedef void (*FTDriver_doneFace) ( FT_Face face ); + + + typedef FT_Error (*FTDriver_initSize) ( FT_Size size ); + + typedef void (*FTDriver_doneSize) ( FT_Size size ); + + + typedef FT_Error (*FTDriver_initGlyphSlot)( FT_GlyphSlot slot ); + + typedef void (*FTDriver_doneGlyphSlot)( FT_GlyphSlot slot ); + + + typedef FT_Error (*FTDriver_setCharSizes) ( FT_Size size, + FT_F26Dot6 char_width, + FT_F26Dot6 char_height, + FT_UInt horz_resolution, + FT_UInt vert_resolution ); + + typedef FT_Error (*FTDriver_setPixelSizes)( FT_Size size, + FT_UInt pixel_width, + FT_UInt pixel_height ); + + typedef FT_Error (*FTDriver_loadGlyph) ( FT_GlyphSlot slot, + FT_Size size, + FT_UInt glyph_index, + FT_Int load_flags ); + + + typedef FT_UInt (*FTDriver_getCharIndex) ( FT_CharMap charmap, + FT_Long charcode ); + + typedef FT_Error (*FTDriver_getKerning) ( FT_Face face, + FT_UInt left_glyph, + FT_UInt right_glyph, + FT_Vector* kerning ); + + + typedef FT_Error (*FTDriver_attachFile) ( FT_Face face, + FT_Stream stream ); + + + typedef FT_Error (*FTDriver_getAdvances) ( FT_Face face, + FT_UInt first, + FT_UInt count, + FT_Bool vertical, + FT_UShort* advances ); + + + /*************************************************************************/ + /* */ + /* */ + /* FT_Driver_Class */ + /* */ + /* */ + /* The font driver class. This structure mostly contains pointers to */ + /* driver methods. */ + /* */ + /* */ + /* 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. */ + /* */ + /* set_char_sizes :: A handle to a function used to set the new */ + /* character size in points + resolution. Can be */ + /* set to 0 to indicate default behaviour. */ + /* */ + /* set_pixel_sizes :: A handle to a function used to set the new */ + /* character size in pixels. Can be set to 0 to */ + /* indicate default behaviour. */ + /* */ + /* load_glyph :: A function handle to load a given glyph image */ + /* in 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 the advances */ + /* of 'count' glyphs, starting at `index'. the */ + /* `vertical' flags must be set when vertical */ + /* advances are queried. The advances buffer is */ + /* caller-allocated. */ + /* */ + /* */ + /* 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_Class_ + { + FT_Module_Class root; + + FT_Int face_object_size; + FT_Int size_object_size; + FT_Int slot_object_size; + + FTDriver_initFace init_face; + FTDriver_doneFace done_face; + + FTDriver_initSize init_size; + FTDriver_doneSize done_size; + + FTDriver_initGlyphSlot init_slot; + FTDriver_doneGlyphSlot done_slot; + + FTDriver_setCharSizes set_char_sizes; + FTDriver_setPixelSizes set_pixel_sizes; + + FTDriver_loadGlyph load_glyph; + FTDriver_getCharIndex get_char_index; + + FTDriver_getKerning get_kerning; + FTDriver_attachFile attach_file; + + FTDriver_getAdvances get_advances; + + } FT_Driver_Class; + + +FT_END_HEADER + +#endif /* __FTDRIVER_H__ */ + + +/* END */ Index: xc/extras/freetype2/include/freetype/internal/ftextend.h diff -u /dev/null xc/extras/freetype2/include/freetype/internal/ftextend.h:1.1.1.1 --- /dev/null Mon Dec 18 14:22:32 2000 +++ xc/extras/freetype2/include/freetype/internal/ftextend.h Fri Dec 8 16:26:18 2000 @@ -0,0 +1,207 @@ +/***************************************************************************/ +/* */ +/* ftextend.h */ +/* */ +/* FreeType extensions implementation (specification). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTEXTEND_H__ +#define __FTEXTEND_H__ + +#ifndef FT_BUILD_H +# define FT_BUILD_H +#endif +#include FT_BUILD_H +#include FT_INTERNAL_OBJECTS_H + +FT_BEGIN_HEADER + + /*************************************************************************/ + /* */ + /* The extensions don't need to be integrated at compile time into the */ + /* engine, only at link time. */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* */ + /* FT_Extension_Initializer */ + /* */ + /* */ + /* Each new face object can have several extensions associated with */ + /* it at creation time. This function is used to initialize given */ + /* extension data for a given face. */ + /* */ + /* */ + /* ext :: A typeless pointer to the extension data. */ + /* */ + /* face :: A handle to the source face object the extension is */ + /* associated with. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + /* */ + /* In case of error, the initializer should not destroy the extension */ + /* data, as the finalizer will get called later by the function's */ + /* caller. */ + /* */ + typedef FT_Error (*FT_Extension_Initializer)( void* ext, + FT_Face face ); + + + /*************************************************************************/ + /* */ + /* */ + /* FT_Extension_Finalizer */ + /* */ + /* */ + /* Each new face object can have several extensions associated with */ + /* it at creation time. This function is used to finalize given */ + /* extension data for a given face; it occurs before the face object */ + /* itself is finalized. */ + /* */ + /* */ + /* ext :: A typeless pointer to the extension data. */ + /* */ + /* face :: A handle to the source face object the extension is */ + /* associated with. */ + /* */ + typedef void (*FT_Extension_Finalizer)( void* ext, + FT_Face face ); + + + /*************************************************************************/ + /* */ + /* */ + /* FT_Extension_Class */ + /* */ + /* */ + /* A simple structure used to describe a given extension to the */ + /* FreeType base layer. An FT_Extension_Class is used as a parameter */ + /* for FT_Register_Extension(). */ + /* */ + /* */ + /* id :: The extension's ID. This is a normal C string that */ + /* is used to uniquely reference the extension's */ + /* interface. */ + /* */ + /* size :: The size in bytes of the extension data that must be */ + /* associated with each face object. */ + /* */ + /* init :: A pointer to the extension data's initializer. */ + /* */ + /* finalize :: A pointer to the extension data's finalizer. */ + /* */ + /* interface :: This pointer can be anything, but should usually */ + /* point to a table of function pointers which implement */ + /* the extension's interface. */ + /* */ + /* offset :: This field is set and used within the base layer and */ + /* should be set to 0 when registering an extension */ + /* through FT_Register_Extension(). It contains an */ + /* offset within the face's extension block for the */ + /* current extension's data. */ + /* */ + typedef struct FT_Extension_Class_ + { + const char* id; + FT_ULong size; + FT_Extension_Initializer init; + FT_Extension_Finalizer finalize; + void* interface; + + FT_ULong offset; + + } FT_Extension_Class; + + + /*************************************************************************/ + /* */ + /* */ + /* FT_Register_Extension */ + /* */ + /* */ + /* Registers a new extension. */ + /* */ + /* */ + /* driver :: A handle to the driver object. */ + /* */ + /* class :: A pointer to a class describing the extension. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + FT_EXPORT( FT_Error ) FT_Register_Extension( FT_Driver driver, + FT_Extension_Class* clazz ); + + +#ifdef FT_CONFIG_OPTION_EXTEND_ENGINE + + + /* Initialize the extension component */ + FT_LOCAL + FT_Error FT_Init_Extensions( FT_Library library ); + + /* Finalize the extension component */ + FT_LOCAL + FT_Error FT_Done_Extensions( FT_Library library ); + + /* Create an extension within a face object. Called by the */ + /* face object constructor. */ + FT_LOCAL + FT_Error FT_Create_Extensions( FT_Face face ); + + /* Destroy all extensions within a face object. Called by the */ + /* face object destructor. */ + FT_LOCAL + FT_Error FT_Destroy_Extensions( FT_Face face ); + + +#endif + + + /*************************************************************************/ + /* */ + /* */ + /* FT_Get_Extension */ + /* */ + /* */ + /* Queries an extension block by an extension ID string. */ + /* */ + /* */ + /* face :: A handle to the face object. */ + /* extension_id :: An ID string identifying the extension. */ + /* */ + /* */ + /* extension_interface :: A generic pointer, usually pointing to a */ + /* table of functions implementing the */ + /* extension interface. */ + /* */ + /* */ + /* A generic pointer to the extension block. */ + /* */ + FT_EXPORT( void* ) FT_Get_Extension( FT_Face face, + const char* extension_id, + void** extension_interface ); + + +FT_END_HEADER + +#endif /* __FTEXTEND_H__ */ + + +/* END */ Index: xc/extras/freetype2/include/freetype/internal/ftmemory.h diff -u /dev/null xc/extras/freetype2/include/freetype/internal/ftmemory.h:1.1.1.1 --- /dev/null Mon Dec 18 14:22:32 2000 +++ xc/extras/freetype2/include/freetype/internal/ftmemory.h Fri Dec 8 16:26:18 2000 @@ -0,0 +1,209 @@ +/***************************************************************************/ +/* */ +/* ftmemory.h */ +/* */ +/* The FreeType memory management macros (specification). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTMEMORY_H__ +#define __FTMEMORY_H__ + +#ifndef FT_BUILD_H +# define FT_BUILD_H +#endif +#include FT_BUILD_H +#include FT_CONFIG_CONFIG_H +#include FT_TYPES_H + +FT_BEGIN_HEADER + + /*************************************************************************/ + /* */ + /* */ + /* FT_SET_ERROR */ + /* */ + /* */ + /* 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 ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* */ + /* FT_Alloc */ + /* */ + /* */ + /* Allocates a new block of memory. The returned area is always */ + /* zero-filled; this is a strong convention in many FreeType parts. */ + /* */ + /* */ + /* memory :: A handle to a given `memory object' which handles */ + /* allocation. */ + /* */ + /* size :: The size in bytes of the block to allocate. */ + /* */ + /* */ + /* P :: A pointer to the fresh new block. It should be set to */ + /* NULL if `size' is 0, or in case of error. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + FT_BASE( FT_Error ) FT_Alloc( FT_Memory memory, + FT_Long size, + void* *P ); + + + /*************************************************************************/ + /* */ + /* */ + /* FT_Realloc */ + /* */ + /* */ + /* Reallocates a block of memory pointed to by `*P' to `Size' bytes */ + /* from the heap, possibly changing `*P'. */ + /* */ + /* */ + /* memory :: A handle to a given `memory object' which handles */ + /* reallocation. */ + /* */ + /* current :: The current block size in bytes. */ + /* */ + /* size :: The new block size in bytes. */ + /* */ + /* */ + /* P :: A pointer to the fresh new block. It should be set to */ + /* NULL if `size' is 0, or in case of error. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + /* */ + /* All callers of FT_Realloc() _must_ provide the current block size */ + /* as well as the new one. */ + /* */ + FT_BASE( FT_Error ) FT_Realloc( FT_Memory memory, + FT_Long current, + FT_Long size, + void** P ); + + + /*************************************************************************/ + /* */ + /* */ + /* FT_Free */ + /* */ + /* */ + /* Releases a given block of memory allocated through FT_Alloc(). */ + /* */ + /* */ + /* memory :: A handle to a given `memory object' which handles */ + /* memory deallocation */ + /* */ + /* P :: This is the _address_ of a _pointer_ which points to the */ + /* allocated block. It is always set to NULL on exit. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + /* */ + /* If P or *P are NULL, this function should return successfully. */ + /* This is a strong convention within all of FreeType and its */ + /* drivers. */ + /* */ + FT_BASE( void ) FT_Free( FT_Memory memory, + void** P ); + + + + /* This `#include' is needed by the MEM_xxx() macros; it should be */ + /* available on all platforms we know of. */ +#include + +#define MEM_Set( dest, byte, count ) memset( dest, byte, count ) + +#define MEM_Copy( dest, source, count ) memcpy( dest, source, count ) + +#define MEM_Move( dest, source, count ) memmove( dest, source, count ) + + + /*************************************************************************/ + /* */ + /* We now support closures to produce completely reentrant code. This */ + /* means the allocation functions now takes an additional argument */ + /* (`memory'). It is a handle to a given memory object, responsible for */ + /* all low-level operations, including memory management and */ + /* synchronisation. */ + /* */ + /* In order to keep our code readable and use the same macros in the */ + /* font drivers and the rest of the library, MEM_Alloc(), ALLOC(), and */ + /* ALLOC_ARRAY() now use an implicit variable, `memory'. It must be */ + /* defined at all locations where a memory operation is queried. */ + /* */ +#define MEM_Alloc( _pointer_, _size_ ) \ + FT_Alloc( memory, _size_, (void**)&(_pointer_) ) + +#define MEM_Alloc_Array( _pointer_, _count_, _type_ ) \ + FT_Alloc( memory, (_count_)*sizeof ( _type_ ), \ + (void**)&(_pointer_) ) + +#define MEM_Realloc( _pointer_, _current_, _size_ ) \ + FT_Realloc( memory, _current_, _size_, (void**)&(_pointer_) ) + +#define MEM_Realloc_Array( _pointer_, _current_, _new_, _type_ ) \ + FT_Realloc( memory, (_current_)*sizeof ( _type_ ), \ + (_new_)*sizeof ( _type_ ), (void**)&(_pointer_) ) + +#define ALLOC( _pointer_, _size_ ) \ + FT_SET_ERROR( MEM_Alloc( _pointer_, _size_ ) ) + +#define REALLOC( _pointer_, _current_, _size_ ) \ + FT_SET_ERROR( MEM_Realloc( _pointer_, _current_, _size_ ) ) + +#define ALLOC_ARRAY( _pointer_, _count_, _type_ ) \ + FT_SET_ERROR( MEM_Alloc( _pointer_, \ + (_count_)*sizeof ( _type_ ) ) ) + +#define REALLOC_ARRAY( _pointer_, _current_, _count_, _type_ ) \ + FT_SET_ERROR( MEM_Realloc( _pointer_, \ + (_current_)*sizeof ( _type_ ), \ + (_count_)*sizeof ( _type_ ) ) ) + +#define FREE( _pointer_ ) FT_Free( memory, (void**)&(_pointer_) ) + + +FT_END_HEADER + +#endif /* __FTMEMORY_H__ */ + + +/* END */ Index: xc/extras/freetype2/include/freetype/internal/ftobjs.h diff -u /dev/null xc/extras/freetype2/include/freetype/internal/ftobjs.h:1.1.1.1 --- /dev/null Mon Dec 18 14:22:32 2000 +++ xc/extras/freetype2/include/freetype/internal/ftobjs.h Fri Dec 8 16:26:18 2000 @@ -0,0 +1,748 @@ +/***************************************************************************/ +/* */ +/* ftobjs.h */ +/* */ +/* The FreeType private base classes (specification). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* This file contains the definition of all internal FreeType classes. */ + /* */ + /*************************************************************************/ + + +#ifndef __FTOBJS_H__ +#define __FTOBJS_H__ + +#ifndef FT_BUILD_H +# define FT_BUILD_H +#endif + +#include FT_BUILD_H +#include FT_RENDER_H +#include FT_INTERNAL_MEMORY_H +#include FT_INTERNAL_DRIVER_H +#include FT_INTERNAL_AUTOHINT_H + +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 + +#ifndef UNUSED +#define UNUSED( arg ) ( (arg)=(arg) ) +#endif + + + /*************************************************************************/ + /* */ + /* The min and max functions missing in C. As usual, be careful not to */ + /* write things like MIN( a++, b++ ) to avoid side effects. */ + /* */ +#ifndef MIN +#define MIN( a, b ) ( (a) < (b) ? (a) : (b) ) +#endif + +#ifndef MAX +#define MAX( a, b ) ( (a) > (b) ? (a) : (b) ) +#endif + +#ifndef ABS +#define ABS( a ) ( (a) < 0 ? -(a) : (a) ) +#endif + + + /*************************************************************************/ + /* */ + /* */ + /* FT_GlyphLoader */ + /* */ + /* */ + /* The glyph loader is an internal object used to load several glyphs */ + /* together (for example, in the case of composites). */ + /* */ + /* */ + /* The glyph loader implementation is not part of the high-level API, */ + /* hence the forward structure declaration. */ + /* */ + typedef struct FT_GlyphLoader_ FT_GlyphLoader; + + + /*************************************************************************/ + /* */ + /* */ + /* FT_Face_InternalRec */ + /* */ + /* */ + /* This structure contains the internal fields of each FT_Face */ + /* object. These fields may change between different releases of */ + /* FreeType. */ + /* */ + /* */ + /* 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. */ + /* */ + typedef struct FT_Face_InternalRec_ + { + FT_UShort max_points; + FT_Short max_contours; + + FT_Matrix transform_matrix; + FT_Vector transform_delta; + FT_Int transform_flags; + + } FT_Face_InternalRec; + + + /*************************************************************************/ + /* */ + /* */ + /* FT_Slot_InternalRec */ + /* */ + /* */ + /* This structure contains the internal fields of each FT_GlyphSlot */ + /* object. These fields may change between different releases of */ + /* FreeType. */ + /* */ + /* */ + /* loader :: The glyph loader object used to load outlines */ + /* into the glyph slot. */ + /* */ + /* 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. */ + /* */ + typedef struct FT_Slot_InternalRec_ + { + FT_GlyphLoader* loader; + FT_Bool glyph_transformed; + FT_Matrix glyph_matrix; + FT_Vector glyph_delta; + + } FT_GlyphSlot_InternalRec; + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** M O D U L E S ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* */ + /* FT_ModuleRec */ + /* */ + /* */ + /* A module object instance. */ + /* */ + /* */ + /* 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 ) + + + /*************************************************************************/ + /* */ + /* */ + /* FT_Get_Module_Interface */ + /* */ + /* */ + /* Finds a module and returns its specific interface as a typeless */ + /* pointer. */ + /* */ + /* */ + /* library :: A handle to the library object. */ + /* */ + /* module_name :: The module's name (as an ASCII string). */ + /* */ + /* */ + /* A module-specific interface if available, 0 otherwise. */ + /* */ + /* */ + /* 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 ); + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** 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_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 + + + /* this must be kept exported -- it is used by the cache manager */ + /* even though it shouldn't be considered public for now */ + + /*************************************************************************/ + /* */ + /* */ + /* FT_New_Size */ + /* */ + /* */ + /* Creates a new size object from a given face object. */ + /* */ + /* */ + /* face :: A handle to a parent face object. */ + /* */ + /* */ + /* asize :: A handle to a new size object. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + FT_EXPORT( FT_Error ) FT_New_Size( FT_Face face, + FT_Size* size ); + + + /*************************************************************************/ + /* */ + /* */ + /* FT_Done_Size */ + /* */ + /* */ + /* Discards a given size object. */ + /* */ + /* */ + /* size :: A handle to a target size object. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + FT_EXPORT( FT_Error ) FT_Done_Size( FT_Size size ); + + + /*************************************************************************/ + /* */ + /* */ + /* FT_New_GlyphSlot */ + /* */ + /* */ + /* 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. */ + /* */ + /* */ + /* face :: A handle to a parent face object. */ + /* */ + /* */ + /* aslot :: A handle to a new glyph slot object. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + FT_BASE( FT_Error ) FT_New_GlyphSlot( FT_Face face, + FT_GlyphSlot *aslot ); + + + /*************************************************************************/ + /* */ + /* */ + /* FT_Done_GlyphSlot */ + /* */ + /* */ + /* Destroys a given glyph slot. Remember however that all slots are */ + /* automatically destroyed with its parent. Using this function is */ + /* not always mandatory. */ + /* */ + /* */ + /* slot :: A handle to a target glyph slot. */ + /* */ + FT_BASE( void ) FT_Done_GlyphSlot( FT_GlyphSlot slot ); + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** G L Y P H L O A D E R ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + +#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 + + + enum + { + ft_glyph_own_bitmap = 1 + }; + + + struct FT_SubGlyph_ + { + FT_Int index; + FT_UShort flags; + FT_Int arg1; + FT_Int arg2; + FT_Matrix transform; + }; + + + typedef struct FT_GlyphLoad_ + { + FT_Outline outline; /* outline */ + FT_UInt num_subglyphs; /* number of subglyphs */ + FT_SubGlyph* subglyphs; /* subglyphs */ + FT_Vector* extra_points; /* extra points table */ + + } FT_GlyphLoad; + + + struct FT_GlyphLoader_ + { + FT_Memory memory; + FT_UInt max_points; + FT_UInt max_contours; + FT_UInt max_subglyphs; + FT_Bool use_extra; + + FT_GlyphLoad base; + FT_GlyphLoad current; + + void* other; /* for possible future extension? */ + + }; + + + FT_BASE( FT_Error ) FT_GlyphLoader_New( FT_Memory memory, + FT_GlyphLoader* *aloader ); + + FT_BASE( FT_Error ) FT_GlyphLoader_Create_Extra( + FT_GlyphLoader* loader ); + + FT_BASE( void ) FT_GlyphLoader_Done( FT_GlyphLoader* loader ); + + FT_BASE( void ) FT_GlyphLoader_Reset( FT_GlyphLoader* loader ); + + FT_BASE( void ) FT_GlyphLoader_Rewind( FT_GlyphLoader* loader ); + + FT_BASE( FT_Error ) FT_GlyphLoader_Check_Points( + FT_GlyphLoader* loader, + FT_UInt n_points, + FT_UInt n_contours ); + + FT_BASE( FT_Error ) FT_GlyphLoader_Check_Subglyphs( + FT_GlyphLoader* loader, + FT_UInt n_subs ); + + FT_BASE( void ) FT_GlyphLoader_Prepare( FT_GlyphLoader* loader ); + + FT_BASE( void ) FT_GlyphLoader_Add( FT_GlyphLoader* loader ); + + FT_BASE( FT_Error ) FT_GlyphLoader_Copy_Points( FT_GlyphLoader* target, + FT_GlyphLoader* source ); + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** 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; + FTRenderer_render 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 + + + /*************************************************************************/ + /* */ + /* */ + /* FT_DriverRec */ + /* */ + /* */ + /* The root font driver class. A font driver is responsible for */ + /* managing and loading font files of a given format. */ + /* */ + /* */ + /* 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 ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + +#define FT_DEBUG_HOOK_TRUETYPE 0 +#define FT_DEBUG_HOOK_TYPE1 1 + + + /*************************************************************************/ + /* */ + /* */ + /* FT_LibraryRec */ + /* */ + /* */ + /* 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. */ + /* */ + /* */ + /* memory :: The library's memory object. Manages memory */ + /* allocation. */ + /* */ + /* generic :: Client data variable. Used to extend the */ + /* Library class by higher levels and clients. */ + /* */ + /* 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_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]; + + } 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_UInt render_mode ); + + typedef FT_Error (*FT_Glyph_Name_Requester)( FT_Face face, + FT_UInt glyph_index, + FT_Pointer buffer, + FT_UInt buffer_max ); + + +#ifndef FT_CONFIG_OPTION_NO_DEFAULT_SYSTEM + + /*************************************************************************/ + /* */ + /* */ + /* FT_New_Stream */ + /* */ + /* */ + /* Creates a new stream object. */ + /* */ + /* */ + /* filepathname :: The name of the stream (usually a file) to be */ + /* opened. */ + /* */ + /* stream :: A pointer to the stream object. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + FT_EXPORT( FT_Error ) FT_New_Stream( const char* filepathname, + FT_Stream astream ); + + + /*************************************************************************/ + /* */ + /* */ + /* FT_Done_Stream */ + /* */ + /* */ + /* Closes and destroys a stream object. */ + /* */ + /* */ + /* stream :: The stream to be closed and destroyed. */ + /* */ + FT_EXPORT( void ) FT_Done_Stream( FT_Stream stream ); + + + /*************************************************************************/ + /* */ + /* */ + /* FT_New_Memory */ + /* */ + /* */ + /* Creates a new memory object. */ + /* */ + /* */ + /* A pointer to the new memory object. 0 in case of error. */ + /* */ + FT_EXPORT( FT_Memory ) FT_New_Memory( void ); + + + /*************************************************************************/ + /* */ + /* */ + /* FT_Done_Memory */ + /* */ + /* */ + /* Discards memory manager. */ + /* */ + /* */ + /* memory :: A handle to the memory manager. */ + /* */ + FT_EXPORT( 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 */ Index: xc/extras/freetype2/include/freetype/internal/ftstream.h diff -u /dev/null xc/extras/freetype2/include/freetype/internal/ftstream.h:1.1.1.1 --- /dev/null Mon Dec 18 14:22:32 2000 +++ xc/extras/freetype2/include/freetype/internal/ftstream.h Fri Dec 8 16:26:18 2000 @@ -0,0 +1,366 @@ +/***************************************************************************/ +/* */ +/* ftstream.h */ +/* */ +/* Stream handling(specification). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTSTREAM_H__ +#define __FTSTREAM_H__ + +#ifndef FT_BUILD_H +# define FT_BUILD_H +#endif +#include FT_BUILD_H +#include FT_INTERNAL_OBJECTS_H + +FT_BEGIN_HEADER + + + /* format of an 8-bit frame_op value = [ xxxxx | e | s ] */ + /* s is set to 1 if the value is signed, */ + /* e is set to 1 if the value is little-endian */ + /* xxxxx 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_ulong_le = FT_MAKE_FRAME_OP( FT_FRAME_OP_LONG, 0, 1 ), + ft_frame_long_be = 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_uoff3_le = FT_MAKE_FRAME_OP( FT_FRAME_OP_OFF3, 0, 1 ), + ft_frame_off3_be = 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_Frame_Op 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_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_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 NEXT_Char( buffer ) \ + ( (signed char)*buffer++ ) +#define NEXT_Byte( buffer ) \ + ( (unsigned char)*buffer++ ) + +#define NEXT_Short( buffer ) \ + ( buffer += 2, \ + ( (short)( (signed char)buffer[-2] << 8 ) | \ + (unsigned char)buffer[-1] ) ) + +#define NEXT_UShort( buffer ) \ + ( (unsigned short)NEXT_Short( buffer ) ) + +#define NEXT_Offset( buffer ) \ + ( buffer += 3, \ + ( ( (long)(signed char)buffer[-3] << 16 ) | \ + ( (long)(unsigned char)buffer[-2] << 8 ) | \ + (long)(unsigned char)buffer[-1] ) ) + +#define NEXT_UOffset( buffer ) \ + ( (unsigned long)NEXT_Offset( buffer ) ) + +#define NEXT_Long( buffer ) \ + ( buffer += 4, \ + ( ( (long)(signed char)buffer[-4] << 24 ) | \ + ( (long)(unsigned char)buffer[-3] << 16 ) | \ + ( (long)(unsigned char)buffer[-2] << 8 ) | \ + (long)(unsigned char)buffer[-1] ) ) + +#define NEXT_ULong( buffer ) \ + ( (unsigned long)NEXT_Long( buffer ) ) + + +#define NEXT_ShortLE( buffer ) \ + ( buffer += 2, \ + ( (short)( (signed char)buffer[-1] << 8 ) | \ + (unsigned char)buffer[-2] ) ) + +#define NEXT_UShortLE( buffer ) \ + ( (unsigned short)NEXT_ShortLE( buffer ) ) + +#define NEXT_OffsetLE( buffer ) \ + ( buffer += 3, \ + ( ( (long)(signed char)buffer[-1] << 16 ) | \ + ( (long)(unsigned char)buffer[-2] << 8 ) | \ + (long)(unsigned char)buffer[-3] ) ) + +#define NEXT_UOffsetLE( buffer ) \ + ( (unsigned long)NEXT_OffsetLE( buffer ) ) + + +#define NEXT_LongLE( buffer ) \ + ( buffer += 4, \ + ( ( (long)(signed char)buffer[-1] << 24 ) | \ + ( (long)(unsigned char)buffer[-2] << 16 ) | \ + ( (long)(unsigned char)buffer[-3] << 8 ) | \ + (long)(unsigned char)buffer[-4] ) ) + +#define NEXT_ULongLE( buffer ) \ + ( (unsigned long)NEXT_LongLE( buffer ) ) + + + /*************************************************************************/ + /* */ + /* Each GET_xxxx() macro uses an implicit `stream' variable. */ + /* */ +#define FT_GET_MACRO( func, type ) ( (type)func( stream ) ) + +#define GET_Char() FT_GET_MACRO( FT_Get_Char, FT_Char ) +#define GET_Byte() FT_GET_MACRO( FT_Get_Char, FT_Byte ) +#define GET_Short() FT_GET_MACRO( FT_Get_Short, FT_Short ) +#define GET_UShort() FT_GET_MACRO( FT_Get_Short, FT_UShort ) +#define GET_Offset() FT_GET_MACRO( FT_Get_Offset, FT_Long ) +#define GET_UOffset() FT_GET_MACRO( FT_Get_Offset, FT_ULong ) +#define GET_Long() FT_GET_MACRO( FT_Get_Long, FT_Long ) +#define GET_ULong() FT_GET_MACRO( FT_Get_Long, FT_ULong ) +#define GET_Tag4() FT_GET_MACRO( FT_Get_Long, FT_ULong ) + +#define GET_ShortLE() FT_GET_MACRO( FT_Get_ShortLE, FT_Short ) +#define GET_UShortLE() FT_GET_MACRO( FT_Get_ShortLE, FT_UShort ) +#define GET_LongLE() FT_GET_MACRO( FT_Get_LongLE, FT_Short ) +#define GET_ULongLE() FT_GET_MACRO( FT_Get_LongLE, FT_Short ) + +#define FT_READ_MACRO( func, type, var ) \ + ( var = (type)func( stream, &error ), \ + error != FT_Err_Ok ) + +#define READ_Byte( var ) FT_READ_MACRO( FT_Read_Char, FT_Byte, var ) +#define READ_Char( var ) FT_READ_MACRO( FT_Read_Char, FT_Char, var ) +#define READ_Short( var ) FT_READ_MACRO( FT_Read_Short, FT_Short, var ) +#define READ_UShort( var ) FT_READ_MACRO( FT_Read_Short, FT_UShort, var ) +#define READ_Offset( var ) FT_READ_MACRO( FT_Read_Offset, FT_Long, var ) +#define READ_UOffset( var ) FT_READ_MACRO( FT_Read_Offset, FT_ULong, var ) +#define READ_Long( var ) FT_READ_MACRO( FT_Read_Long, FT_Long, var ) +#define READ_ULong( var ) FT_READ_MACRO( FT_Read_Long, FT_ULong, var ) + +#define READ_ShortLE( var ) FT_READ_MACRO( FT_Read_ShortLE, FT_Short, var ) +#define READ_UShortLE( var ) FT_READ_MACRO( FT_Read_ShortLE, FT_UShort, var ) +#define READ_LongLE( var ) FT_READ_MACRO( FT_Read_LongLE, FT_Long, var ) +#define READ_ULongLE( var ) FT_READ_MACRO( FT_Read_LongLE, FT_ULong, var ) + + + FT_BASE( void ) FT_New_Memory_Stream( FT_Library library, + FT_Byte* base, + FT_ULong size, + FT_Stream stream ); + + FT_BASE( FT_Error ) FT_Seek_Stream( FT_Stream stream, + FT_ULong pos ); + + FT_BASE( FT_Error ) FT_Skip_Stream( FT_Stream stream, + FT_Long distance ); + + FT_BASE( FT_Long ) FT_Stream_Pos( FT_Stream stream ); + + + FT_BASE( FT_Error ) FT_Read_Stream( FT_Stream stream, + FT_Byte* buffer, + FT_ULong count ); + + FT_BASE( FT_Error ) FT_Read_Stream_At( FT_Stream stream, + FT_ULong pos, + FT_Byte* buffer, + FT_ULong count ); + + FT_BASE( FT_Error ) FT_Access_Frame( FT_Stream stream, + FT_ULong count ); + + FT_BASE( void ) FT_Forget_Frame( FT_Stream stream ); + + FT_BASE( FT_Error ) FT_Extract_Frame( FT_Stream stream, + FT_ULong count, + FT_Byte** pbytes ); + + FT_BASE( void ) FT_Release_Frame( FT_Stream stream, + FT_Byte** pbytes ); + + FT_BASE( FT_Char ) FT_Get_Char( FT_Stream stream ); + + FT_BASE( FT_Short ) FT_Get_Short( FT_Stream stream ); + + FT_BASE( FT_Long ) FT_Get_Offset( FT_Stream stream ); + + FT_BASE( FT_Long ) FT_Get_Long( FT_Stream stream ); + + FT_BASE( FT_Short ) FT_Get_ShortLE( FT_Stream stream ); + + FT_BASE( FT_Long ) FT_Get_LongLE( FT_Stream stream ); + + + FT_BASE( FT_Char ) FT_Read_Char( FT_Stream stream, + FT_Error* error ); + + FT_BASE( FT_Short ) FT_Read_Short( FT_Stream stream, + FT_Error* error ); + + FT_BASE( FT_Long ) FT_Read_Offset( FT_Stream stream, + FT_Error* error ); + + FT_BASE( FT_Long ) FT_Read_Long( FT_Stream stream, + FT_Error* error ); + + FT_BASE( FT_Short ) FT_Read_ShortLE( FT_Stream stream, + FT_Error* error ); + + FT_BASE( FT_Long ) FT_Read_LongLE( FT_Stream stream, + FT_Error* error ); + + FT_BASE( FT_Error ) FT_Read_Fields( FT_Stream stream, + const FT_Frame_Field* fields, + void* structure ); + + +#define USE_Stream( resource, stream ) \ + FT_SET_ERROR( FT_Open_Stream( resource, stream ) ) + +#define DONE_Stream( stream ) \ + FT_Done_Stream( stream ) + + +#define ACCESS_Frame( size ) \ + FT_SET_ERROR( FT_Access_Frame( stream, size ) ) + +#define FORGET_Frame() \ + FT_Forget_Frame( stream ) + +#define EXTRACT_Frame( size, bytes ) \ + FT_SET_ERROR( FT_Extract_Frame( stream, size, \ + (FT_Byte**)&(bytes) ) ) + +#define RELEASE_Frame( bytes ) \ + FT_Release_Frame( stream, (FT_Byte**)&(bytes) ) + +#define FILE_Seek( position ) \ + FT_SET_ERROR( FT_Seek_Stream( stream, position ) ) + +#define FILE_Skip( distance ) \ + FT_SET_ERROR( FT_Skip_Stream( stream, distance ) ) + +#define FILE_Pos() \ + FT_Stream_Pos( stream ) + +#define FILE_Read( buffer, count ) \ + FT_SET_ERROR( FT_Read_Stream( stream, \ + (FT_Byte*)buffer, \ + count ) ) + +#define FILE_Read_At( position, buffer, count ) \ + FT_SET_ERROR( FT_Read_Stream_At( stream, \ + position, \ + (FT_Byte*)buffer, \ + count ) ) + +#define READ_Fields( fields, object ) \ + ( ( error = FT_Read_Fields( stream, fields, object ) ) != FT_Err_Ok ) + + +FT_END_HEADER + +#endif /* __FTSTREAM_H__ */ + + +/* END */ Index: xc/extras/freetype2/include/freetype/internal/internal.h diff -u /dev/null xc/extras/freetype2/include/freetype/internal/internal.h:1.1.1.1 --- /dev/null Mon Dec 18 14:22:32 2000 +++ xc/extras/freetype2/include/freetype/internal/internal.h Fri Dec 8 16:26:18 2000 @@ -0,0 +1,55 @@ +/***************************************************************************/ +/* */ +/* internal.h */ +/* */ +/* Internal header files (specification only). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* This file is automatically included by `ftbuild.h'. */ + /* Do not include it manually! */ + /* */ + /*************************************************************************/ + + + /* don't add spaces around the argument of FT_INTERNAL_FILE! */ + +#define FT_INTERNAL_OBJECTS_H FT_INTERNAL_FILE(ftobjs.h) +#define FT_INTERNAL_STREAM_H FT_INTERNAL_FILE(ftstream.h) +#define FT_INTERNAL_MEMORY_H FT_INTERNAL_FILE(ftmemory.h) +#define FT_INTERNAL_EXTENSION_H FT_INTERNAL_FILE(ftextend.h) +#define FT_INTERNAL_DEBUG_H FT_INTERNAL_FILE(ftdebug.h) +#define FT_INTERNAL_CALC_H FT_INTERNAL_FILE(ftcalc.h) +#define FT_INTERNAL_DRIVER_H FT_INTERNAL_FILE(ftdriver.h) + +#define FT_INTERNAL_SFNT_H FT_INTERNAL_FILE(sfnt.h) + +#define FT_INTERNAL_TRUETYPE_TYPES_H FT_INTERNAL_FILE(tttypes.h) +#define FT_INTERNAL_TRUETYPE_ERRORS_H FT_INTERNAL_FILE(tterrors.h) + +#define FT_INTERNAL_TYPE1_ERRORS_H FT_INTERNAL_FILE(t1errors.h) +#define FT_INTERNAL_TYPE1_TYPES_H FT_INTERNAL_FILE(t1types.h) + +#define FT_INTERNAL_CFF_ERRORS_H FT_INTERNAL_FILE(t2errors.h) +#define FT_INTERNAL_CFF_TYPES_H FT_INTERNAL_FILE(t2types.h) + +#define FT_INTERNAL_POSTSCRIPT_NAMES_H FT_INTERNAL_FILE(psnames.h) +#define FT_INTERNAL_POSTSCRIPT_AUX_H FT_INTERNAL_FILE(psaux.h) + +#define FT_INTERNAL_AUTOHINT_H FT_INTERNAL_FILE(autohint.h) +#define FT_INTERNAL_FNT_TYPES_H FT_INTERNAL_FILE(fnttypes.h) + + +/* END */ Index: xc/extras/freetype2/include/freetype/internal/psaux.h diff -u /dev/null xc/extras/freetype2/include/freetype/internal/psaux.h:1.1.1.1 --- /dev/null Mon Dec 18 14:22:32 2000 +++ xc/extras/freetype2/include/freetype/internal/psaux.h Fri Dec 8 16:26:18 2000 @@ -0,0 +1,636 @@ +/***************************************************************************/ +/* */ +/* psaux.h */ +/* */ +/* Auxiliary functions and data structures related to PostScript fonts */ +/* (specification). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#ifndef __PSAUX_H__ +#define __PSAUX_H__ + +#ifndef FT_BUILD_H +# define FT_BUILD_H +#endif +#include FT_BUILD_H +#include FT_INTERNAL_OBJECTS_H +#include FT_INTERNAL_TYPE1_TYPES_H + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** T1_TABLE *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + typedef struct PS_Table_ PS_Table; + + + /*************************************************************************/ + /* */ + /* */ + /* PS_Table_Funcs */ + /* */ + /* */ + /* A set of function pointers to manage PS_Table objects. */ + /* */ + /* */ + /* 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_Funcs_ + { + 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 index, + void* object, + FT_Int length ); + + void (*release)( PS_Table* table ); + + } PS_Table_Funcs; + + + /*************************************************************************/ + /* */ + /* */ + /* PS_Table */ + /* */ + /* */ + /* A PS_Table is a simple object used to store an array of objects in */ + /* a single memory block. */ + /* */ + /* */ + /* 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. */ + /* */ + struct PS_Table_ + { + FT_Byte* block; /* current memory block */ + FT_Int cursor; /* current cursor in memory block */ + FT_Int 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_Int* lengths; /* lengths of table elements */ + + FT_Memory memory; + PS_Table_Funcs funcs; + + }; + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** T1 FIELDS & TOKENS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + typedef struct T1_Parser_ T1_Parser; + + /* simple enumeration type used to identify token types */ + typedef enum T1_Token_Type_ + { + t1_token_none = 0, + t1_token_any, + t1_token_string, + t1_token_array, + + /* do not remove */ + t1_token_max + + } T1_Token_Type; + + + /* a simple structure used to identify tokens */ + typedef struct T1_Token_ + { + FT_Byte* start; /* first character of token in input stream */ + FT_Byte* limit; /* first character after the token */ + T1_Token_Type type; /* type of token */ + + } T1_Token; + + + /* enumeration type used to identify object fields */ + typedef enum T1_Field_Type_ + { + t1_field_none = 0, + t1_field_bool, + t1_field_integer, + t1_field_fixed, + t1_field_string, + t1_field_integer_array, + t1_field_fixed_array, + t1_field_callback, + + /* do not remove */ + t1_field_max + + } T1_Field_Type; + + typedef enum T1_Field_Location_ + { + t1_field_cid_info, + t1_field_font_dict, + t1_field_font_info, + t1_field_private, + + /* do not remove */ + t1_field_location_max + + } T1_Field_Location; + + + typedef void (*T1_Field_Parser)( FT_Face face, + FT_Pointer parser ); + + + /* structure type used to model object fields */ + typedef struct T1_Field_ + { + const char* ident; /* field identifier */ + T1_Field_Location location; + T1_Field_Type type; /* type of field */ + T1_Field_Parser 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 */ + } T1_Field; + + +#define T1_NEW_SIMPLE_FIELD( _ident, _type, _fname ) \ + { \ + _ident, T1CODE, _type, \ + 0, \ + FT_FIELD_OFFSET( _fname ), \ + FT_FIELD_SIZE( _fname ), \ + 0, 0 \ + }, + +#define T1_NEW_CALLBACK_FIELD( _ident, _reader ) \ + { \ + _ident, T1CODE, t1_field_callback, \ + (T1_Field_Parser)_reader, \ + 0, 0, \ + 0, 0 \ + }, + +#define T1_NEW_TABLE_FIELD( _ident, _type, _fname, _max ) \ + { \ + _ident, T1CODE, _type, \ + 0, \ + FT_FIELD_OFFSET( _fname ), \ + FT_FIELD_SIZE_DELTA( _fname ), \ + _max, \ + FT_FIELD_OFFSET( num_ ## _fname ) \ + }, + +#define T1_NEW_TABLE_FIELD2( _ident, _type, _fname, _max ) \ + { \ + _ident, T1CODE, _type, \ + 0, \ + FT_FIELD_OFFSET( _fname ), \ + FT_FIELD_SIZE_DELTA( _fname ), \ + _max, 0 \ + }, + + +#define T1_FIELD_BOOL( _ident, _fname ) \ + T1_NEW_SIMPLE_FIELD( _ident, t1_field_bool, _fname ) + +#define T1_FIELD_NUM( _ident, _fname ) \ + T1_NEW_SIMPLE_FIELD( _ident, t1_field_integer, _fname ) + +#define T1_FIELD_FIXED( _ident, _fname ) \ + T1_NEW_SIMPLE_FIELD( _ident, t1_field_fixed, _fname ) + +#define T1_FIELD_STRING( _ident, _fname ) \ + T1_NEW_SIMPLE_FIELD( _ident, t1_field_string, _fname ) + +#define T1_FIELD_NUM_TABLE( _ident, _fname, _fmax ) \ + T1_NEW_TABLE_FIELD( _ident, t1_field_integer_array, \ + _fname, _fmax ) + +#define T1_FIELD_FIXED_TABLE( _ident, _fname, _fmax ) \ + T1_NEW_TABLE_FIELD( _ident, t1_field_fixed_array, \ + _fname, _fmax ) + +#define T1_FIELD_NUM_TABLE2( _ident, _fname, _fmax ) \ + T1_NEW_TABLE_FIELD2( _ident, t1_field_integer_array, \ + _fname, _fmax ) + +#define T1_FIELD_FIXED_TABLE2( _ident, _fname, _fmax ) \ + T1_NEW_TABLE_FIELD2( _ident, t1_field_fixed_array, \ + _fname, _fmax ) + +#define T1_FIELD_CALLBACK( _ident, _name ) \ + T1_NEW_CALLBACK_FIELD( _ident, _name ) + + + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** T1 PARSER *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + typedef struct T1_Parser_Funcs_ + { + void (*init) ( T1_Parser* parser, + FT_Byte* base, + FT_Byte* limit, + FT_Memory memory ); + + void (*done) ( T1_Parser* parser ); + + void (*skip_spaces) ( T1_Parser* parser ); + void (*skip_alpha) ( T1_Parser* parser ); + + FT_Long (*to_int) ( T1_Parser* parser ); + FT_Fixed (*to_fixed) ( T1_Parser* parser, + FT_Int power_ten ); + FT_Int (*to_coord_array)( T1_Parser* parser, + FT_Int max_coords, + FT_Short* coords ); + FT_Int (*to_fixed_array)( T1_Parser* parser, + FT_Int max_values, + FT_Fixed* values, + FT_Int power_ten ); + + void (*to_token) ( T1_Parser* parser, + T1_Token* token ); + void (*to_token_array)( T1_Parser* parser, + T1_Token* tokens, + FT_UInt max_tokens, + FT_Int* pnum_tokens ); + + FT_Error (*load_field) ( T1_Parser* parser, + const T1_Field* field, + void** objects, + FT_UInt max_objects, + FT_ULong* pflags ); + + FT_Error (*load_field_table)( T1_Parser* parser, + const T1_Field* field, + void** objects, + FT_UInt max_objects, + FT_ULong* pflags ); + + } T1_Parser_Funcs; + + + /*************************************************************************/ + /* */ + /* */ + /* T1_Parser */ + /* */ + /* */ + /* A T1_Parser is an object used to parse a Type 1 font very quickly. */ + /* */ + /* */ + /* 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. */ + /* */ + struct T1_Parser_ + { + FT_Byte* cursor; + FT_Byte* base; + FT_Byte* limit; + FT_Error error; + FT_Memory memory; + + T1_Parser_Funcs funcs; + }; + + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** T1 BUILDER *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + typedef struct T1_Builder_ 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 struct T1_Builder_Funcs_ + { + void (*init)( T1_Builder* builder, + FT_Face face, + FT_Size size, + FT_GlyphSlot slot ); + + 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_Funcs; + + + + /*************************************************************************/ + /* */ + /* */ + /* T1_Builder */ + /* */ + /* */ + /* A structure used during glyph loading to store its outline. */ + /* */ + /* */ + /* 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 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. */ + /* */ + /* error :: An error code that is only used to report memory */ + /* allocation problems. */ + /* */ + /* 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. */ + /* */ + struct T1_Builder_ + { + 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 */ + FT_Bool path_begun; + FT_Bool load_points; + FT_Bool no_recurse; + FT_Bool shift; + + FT_Error error; /* only used for memory errors */ + FT_Bool metrics_only; + + T1_Builder_Funcs funcs; + }; + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** 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_Zone_ + { + FT_Byte* cursor; + FT_Byte* base; + FT_Byte* limit; + + } T1_Decoder_Zone; + + + typedef struct T1_Decoder_ T1_Decoder; + typedef struct T1_Decoder_Funcs_ T1_Decoder_Funcs; + + + typedef FT_Error (*T1_Decoder_Callback)( T1_Decoder* decoder, + FT_UInt glyph_index ); + + + struct T1_Decoder_Funcs_ + { + FT_Error (*init) ( T1_Decoder* decoder, + FT_Face face, + FT_Size size, + FT_GlyphSlot slot, + FT_Byte** glyph_names, + T1_Blend* blend, + T1_Decoder_Callback callback ); + + void (*done) ( T1_Decoder* decoder ); + + FT_Error (*parse_charstrings)( T1_Decoder* decoder, + FT_Byte* base, + FT_UInt len ); + }; + + + struct T1_Decoder_ + { + T1_Builder builder; + + FT_Long stack[T1_MAX_CHARSTRINGS_OPERANDS]; + FT_Long* top; + + T1_Decoder_Zone zones[T1_MAX_SUBRS_CALLS + 1]; + T1_Decoder_Zone* zone; + + PSNames_Interface* psnames; /* for seac */ + FT_UInt num_glyphs; + FT_Byte** glyph_names; + + FT_UInt lenIV; /* internal for sub routine calls */ + FT_UInt num_subrs; + FT_Byte** subrs; + FT_Int* 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]; + + T1_Blend* blend; /* for multiple master support */ + + T1_Decoder_Callback parse_callback; + T1_Decoder_Funcs funcs; + }; + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** PSAux Module Interface *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + typedef struct PSAux_Interface_ + { + const PS_Table_Funcs* ps_table_funcs; + const T1_Parser_Funcs* t1_parser_funcs; + const T1_Builder_Funcs* t1_builder_funcs; + const T1_Decoder_Funcs* t1_decoder_funcs; + + void (*t1_decrypt)( FT_Byte* buffer, + FT_Int length, + FT_UShort seed ); + } PSAux_Interface; + + +FT_END_HEADER + +#endif /* __PSAUX_H__ */ + + +/* END */ Index: xc/extras/freetype2/include/freetype/internal/psnames.h diff -u /dev/null xc/extras/freetype2/include/freetype/internal/psnames.h:1.1.1.1 --- /dev/null Mon Dec 18 14:22:32 2000 +++ xc/extras/freetype2/include/freetype/internal/psnames.h Fri Dec 8 16:26:18 2000 @@ -0,0 +1,226 @@ +/***************************************************************************/ +/* */ +/* psnames.h */ +/* */ +/* High-level interface for the `PSNames' module (in charge of */ +/* various functions related to Postscript glyph names conversion). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#ifndef __PSNAMES_H__ +#define __PSNAMES_H__ + +#ifndef FT_BUILD_H +# define FT_BUILD_H +#endif +#include FT_BUILD_H +#include FT_FREETYPE_H + +FT_BEGIN_HEADER + + /*************************************************************************/ + /* */ + /* */ + /* PS_Unicode_Value_Func */ + /* */ + /* */ + /* A function used to return the Unicode index corresponding to a */ + /* given glyph name. */ + /* */ + /* */ + /* glyph_name :: The glyph name. */ + /* */ + /* */ + /* The Unicode character index resp. the non-Unicode value 0xFFFF if */ + /* the glyph name has no known Unicode meaning. */ + /* */ + /* */ + /* This function is able to map several different glyph names to the */ + /* same Unicode value, according to the rules defined in the Adobe */ + /* Glyph List table. */ + /* */ + /* This function will not be compiled if the configuration macro */ + /* FT_CONFIG_OPTION_ADOBE_GLYPH_LIST is undefined. */ + /* */ + typedef FT_ULong (*PS_Unicode_Value_Func)( const char* glyph_name ); + + + /*************************************************************************/ + /* */ + /* */ + /* PS_Unicode_Index_Func */ + /* */ + /* */ + /* A function used to return the glyph index corresponding to a given */ + /* Unicode value. */ + /* */ + /* */ + /* num_glyphs :: The number of glyphs in the face. */ + /* */ + /* glyph_names :: An array of glyph name pointers. */ + /* */ + /* unicode :: The Unicode value. */ + /* */ + /* */ + /* The glyph index resp. 0xFFFF if no glyph corresponds to this */ + /* Unicode value. */ + /* */ + /* */ + /* This function is able to recognize several glyph names per Unicode */ + /* value, according to the Adobe Glyph List. */ + /* */ + /* This function will not be compiled if the configuration macro */ + /* FT_CONFIG_OPTION_ADOBE_GLYPH_LIST is undefined. */ + /* */ + typedef FT_UInt (*PS_Unicode_Index_Func)( FT_UInt num_glyphs, + const char** glyph_names, + FT_ULong unicode ); + + + /*************************************************************************/ + /* */ + /* */ + /* PS_Macintosh_Name_Func */ + /* */ + /* */ + /* A function used to return the glyph name corresponding to an Apple */ + /* glyph name index. */ + /* */ + /* */ + /* name_index :: The index of the Mac name. */ + /* */ + /* */ + /* The glyph name, or 0 if the index is invalid. */ + /* */ + /* */ + /* This function will not be compiled if the configuration macro */ + /* FT_CONFIG_OPTION_POSTSCRIPT_NAMES is undefined. */ + /* */ + typedef const char* (*PS_Macintosh_Name_Func)( FT_UInt name_index ); + + + typedef const char* (*PS_Adobe_Std_Strings_Func)( FT_UInt string_index ); + + + typedef struct PS_UniMap_ + { + FT_UInt unicode; + FT_UInt glyph_index; + + } PS_UniMap; + + + /*************************************************************************/ + /* */ + /* */ + /* PS_Unicodes */ + /* */ + /* */ + /* A simple table used to map Unicode values to glyph indices. It is */ + /* built by the PS_Build_Unicodes table according to the glyphs */ + /* present in a font file. */ + /* */ + /* */ + /* num_codes :: The number of glyphs in the font that match a given */ + /* Unicode value. */ + /* */ + /* unicodes :: An array of unicode values, sorted in increasing */ + /* order. */ + /* */ + /* gindex :: An array of glyph indices, corresponding to each */ + /* Unicode value. */ + /* */ + /* */ + /* Use the function PS_Lookup_Unicode() to retrieve the glyph index */ + /* corresponding to a given Unicode character code. */ + /* */ + typedef struct PS_Unicodes_ + { + FT_UInt num_maps; + PS_UniMap* maps; + + } PS_Unicodes; + + + typedef FT_Error (*PS_Build_Unicodes_Func)( FT_Memory memory, + FT_UInt num_glyphs, + const char** glyph_names, + PS_Unicodes* unicodes ); + + typedef FT_UInt (*PS_Lookup_Unicode_Func)( PS_Unicodes* unicodes, + FT_UInt unicode ); + + + /*************************************************************************/ + /* */ + /* */ + /* PSNames_Interface */ + /* */ + /* */ + /* This structure defines the PSNames interface. */ + /* */ + /* */ + /* unicode_value :: A function used to convert a glyph name */ + /* into a Unicode character code. */ + /* */ + /* build_unicodes :: A function which builds up the Unicode */ + /* mapping table. */ + /* */ + /* lookup_unicode :: A function used to return the glyph index */ + /* corresponding to a given Unicode */ + /* character. */ + /* */ + /* macintosh_name :: A function used to return the standard */ + /* Apple glyph Postscript name corresponding */ + /* to a given string index (used by the */ + /* TrueType `post' table). */ + /* */ + /* adobe_std_strings :: A function that returns a pointer to a */ + /* Adobe Standard String for a given SID. */ + /* */ + /* adobe_std_encoding :: A table of 256 unsigned shorts that maps */ + /* character codes in the Adobe Standard */ + /* Encoding to SIDs. */ + /* */ + /* adobe_expert_encoding :: A table of 256 unsigned shorts that maps */ + /* character codes in the Adobe Expert */ + /* Encoding to SIDs. */ + /* */ + /* */ + /* `unicode_value' and `unicode_index' will be set to 0 if the */ + /* configuration macro FT_CONFIG_OPTION_ADOBE_GLYPH_LIST is */ + /* undefined. */ + /* */ + /* `macintosh_name' will be set to 0 if the configuration macro */ + /* FT_CONFIG_OPTION_POSTSCRIPT_NAMES is undefined. */ + /* */ + typedef struct PSNames_Interface_ + { + PS_Unicode_Value_Func unicode_value; + PS_Build_Unicodes_Func build_unicodes; + PS_Lookup_Unicode_Func lookup_unicode; + PS_Macintosh_Name_Func macintosh_name; + + PS_Adobe_Std_Strings_Func adobe_std_strings; + const unsigned short* adobe_std_encoding; + const unsigned short* adobe_expert_encoding; + + } PSNames_Interface; + + +FT_END_HEADER + +#endif /* __PSNAMES_H__ */ + + +/* END */ Index: xc/extras/freetype2/include/freetype/internal/sfnt.h diff -u /dev/null xc/extras/freetype2/include/freetype/internal/sfnt.h:1.1.1.1 --- /dev/null Mon Dec 18 14:22:33 2000 +++ xc/extras/freetype2/include/freetype/internal/sfnt.h Fri Dec 8 16:26:18 2000 @@ -0,0 +1,530 @@ +/***************************************************************************/ +/* */ +/* sfnt.h */ +/* */ +/* High-level `sfnt' driver interface (specification). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#ifndef __SFNT_H__ +#define __SFNT_H__ + +#ifndef FT_BUILD_H +# define FT_BUILD_H +#endif +#include FT_BUILD_H +#include FT_INTERNAL_DRIVER_H +#include FT_INTERNAL_TRUETYPE_TYPES_H + +FT_BEGIN_HEADER + + /*************************************************************************/ + /* */ + /* */ + /* TT_Init_Face_Func */ + /* */ + /* */ + /* First part of the SFNT face object initialization. This will find */ + /* the face in a SFNT file or collection, and load its format tag in */ + /* face->format_tag. */ + /* */ + /* */ + /* 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. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + /* */ + /* 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 ); + + + /*************************************************************************/ + /* */ + /* */ + /* TT_Load_Face_Func */ + /* */ + /* */ + /* Second part of the SFNT face object initialization. This will */ + /* load the common SFNT tables (head, OS/2, maxp, metrics, etc.) in */ + /* the face object. */ + /* */ + /* */ + /* 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. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + /* */ + /* 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 ); + + + /*************************************************************************/ + /* */ + /* */ + /* TT_Done_Face_Func */ + /* */ + /* */ + /* A callback used to delete the common SFNT data from a face. */ + /* */ + /* */ + /* face :: A handle to the target face object. */ + /* */ + /* */ + /* This function does NOT destroy the face object. */ + /* */ + typedef + void (*TT_Done_Face_Func)( TT_Face face ); + + + typedef + FT_Module_Interface (*SFNT_Get_Interface_Func)( FT_Module module, + const char* interface ); + + + /*************************************************************************/ + /* */ + /* */ + /* TT_Load_SFNT_Header_Func */ + /* */ + /* */ + /* Loads the header of a SFNT font file. Supports collections. */ + /* */ + /* */ + /* 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. */ + /* */ + /* */ + /* sfnt :: The SFNT header. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + /* */ + /* 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_Header_Func)( TT_Face face, + FT_Stream stream, + FT_Long face_index, + SFNT_Header* sfnt ); + + + /*************************************************************************/ + /* */ + /* */ + /* TT_Load_Directory_Func */ + /* */ + /* */ + /* Loads the table directory into a face object. */ + /* */ + /* */ + /* face :: A handle to the target face object. */ + /* */ + /* stream :: The input stream. */ + /* */ + /* sfnt :: The SFNT header. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + /* */ + /* 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 ); + + + /*************************************************************************/ + /* */ + /* */ + /* TT_Load_Any_Func */ + /* */ + /* */ + /* Loads any font table into client memory. */ + /* */ + /* */ + /* 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). */ + /* */ + /* */ + /* buffer :: The address of target buffer. */ + /* */ + /* */ + /* 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 ); + + + /*************************************************************************/ + /* */ + /* */ + /* TT_Load_SBit_Image_Func */ + /* */ + /* */ + /* Loads a given glyph sbit image from the font resource. This also */ + /* returns its metrics. */ + /* */ + /* */ + /* face :: The target face object. */ + /* */ + /* x_ppem :: The horizontal resolution in points per EM. */ + /* */ + /* y_ppem :: The vertical resolution in points per EM. */ + /* */ + /* glyph_index :: The current glyph index. */ + /* */ + /* stream :: The input stream. */ + /* */ + /* */ + /* amap :: The target pixmap. */ + /* */ + /* ametrics :: A big sbit metrics structure for the glyph image. */ + /* */ + /* */ + /* FreeType error code. 0 means success. Returns an error if no */ + /* glyph sbit exists for the index. */ + /* */ + /* */ + /* 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_Metrics *ametrics ); + + + /*************************************************************************/ + /* */ + /* */ + /* TT_Set_SBit_Strike_Func */ + /* */ + /* */ + /* Selects an sbit strike for given horizontal and vertical ppem */ + /* values. */ + /* */ + /* */ + /* face :: The target face object. */ + /* */ + /* x_ppem :: The horizontal resolution in points per EM. */ + /* */ + /* y_ppem :: The vertical resolution in points per EM. */ + /* */ + /* */ + /* astrike_index :: The index of the sbit strike. */ + /* */ + /* */ + /* 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_Int x_ppem, + FT_Int y_ppem, + FT_ULong *astrike_index ); + + + /*************************************************************************/ + /* */ + /* */ + /* TT_Get_PS_Name_Func */ + /* */ + /* */ + /* Gets the PostScript glyph name of a glyph. */ + /* */ + /* */ + /* index :: 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! */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + typedef + FT_Error (*TT_Get_PS_Name_Func)( TT_Face face, + FT_UInt index, + FT_String** PSname ); + + + /*************************************************************************/ + /* */ + /* */ + /* TT_Load_Metrics_Func */ + /* */ + /* */ + /* Loads the horizontal or vertical header in a face object. */ + /* */ + /* */ + /* face :: A handle to the target face object. */ + /* */ + /* stream :: The input stream. */ + /* */ + /* vertical :: A boolean flag. If set, load vertical metrics. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + typedef + FT_Error (*TT_Load_Metrics_Func)( TT_Face face, + FT_Stream stream, + FT_Bool vertical ); + + + /*************************************************************************/ + /* */ + /* */ + /* TT_CharMap_Load_Func */ + /* */ + /* */ + /* Loads a given TrueType character map into memory. */ + /* */ + /* */ + /* face :: A handle to the parent face object. */ + /* */ + /* stream :: A handle to the current stream object. */ + /* */ + /* */ + /* cmap :: A pointer to a cmap object. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + /* */ + /* 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, + TT_CMapTable* cmap, + FT_Stream input ); + + + /*************************************************************************/ + /* */ + /* */ + /* TT_CharMap_Free_Func */ + /* */ + /* */ + /* Destroys a character mapping table. */ + /* */ + /* */ + /* face :: A handle to the parent face object. */ + /* */ + /* cmap :: A handle to a cmap object. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + typedef + FT_Error (*TT_CharMap_Free_Func)( TT_Face face, + TT_CMapTable* cmap ); + + + /*************************************************************************/ + /* */ + /* */ + /* TT_Load_Table_Func */ + /* */ + /* */ + /* Loads a given TrueType table. */ + /* */ + /* */ + /* face :: A handle to the target face object. */ + /* */ + /* stream :: The input stream. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + /* */ + /* The function will use `face->goto_table' to seek the stream to */ + /* the start of the table. */ + /* */ + typedef + FT_Error (*TT_Load_Table_Func)( TT_Face face, + FT_Stream stream ); + + + /*************************************************************************/ + /* */ + /* */ + /* TT_Free_Table_Func */ + /* */ + /* */ + /* Frees a given TrueType table. */ + /* */ + /* */ + /* face :: A handle to the target face object. */ + /* */ + typedef + void (*TT_Free_Table_Func)( TT_Face face ); + + + /*************************************************************************/ + /* */ + /* */ + /* SFNT_Interface */ + /* */ + /* */ + /* This structure holds pointers to the functions used to load and */ + /* free the basic tables that are required in a `sfnt' font file. */ + /* */ + /* */ + /* Check the various xxx_Func() descriptions for details. */ + /* */ + typedef struct SFNT_Interface_ + { + TT_Goto_Table_Func goto_table; + + TT_Init_Face_Func init_face; + TT_Load_Face_Func load_face; + TT_Done_Face_Func done_face; + SFNT_Get_Interface_Func get_interface; + + TT_Load_Any_Func load_any; + TT_Load_SFNT_Header_Func load_sfnt_header; + TT_Load_Directory_Func load_directory; + + /* 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_header; + TT_Load_Metrics_Func load_metrics; + TT_Load_Table_Func load_charmaps; + TT_Load_Table_Func load_max_profile; + TT_Load_Table_Func load_os2; + TT_Load_Table_Func load_psnames; + + TT_Load_Table_Func load_names; + TT_Free_Table_Func free_names; + + /* optional tables */ + TT_Load_Table_Func load_hdmx; + TT_Free_Table_Func free_hdmx; + + TT_Load_Table_Func load_kerning; + TT_Load_Table_Func load_gasp; + TT_Load_Table_Func load_pclt; + + /* see `ttload.h' */ + TT_Load_Table_Func load_bitmap_header; + + /* see `ttsbit.h' */ + TT_Set_SBit_Strike_Func set_sbit_strike; + TT_Load_Table_Func load_sbits; + TT_Load_SBit_Image_Func load_sbit_image; + TT_Free_Table_Func free_sbits; + + /* see `ttpost.h' */ + TT_Get_PS_Name_Func get_psname; + TT_Free_Table_Func free_psnames; + + /* see `ttcmap.h' */ + TT_CharMap_Load_Func load_charmap; + TT_CharMap_Free_Func free_charmap; + + } SFNT_Interface; + + +FT_END_HEADER + +#endif /* __SFNT_H__ */ + + +/* END */ Index: xc/extras/freetype2/include/freetype/internal/t1errors.h diff -u /dev/null xc/extras/freetype2/include/freetype/internal/t1errors.h:1.1.1.1 --- /dev/null Mon Dec 18 14:22:33 2000 +++ xc/extras/freetype2/include/freetype/internal/t1errors.h Fri Dec 8 16:26:18 2000 @@ -0,0 +1,77 @@ +/***************************************************************************/ +/* */ +/* t1errors.h */ +/* */ +/* Type 1 error ID definitions (specification only). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#ifndef __T1ERRORS_H__ +#define __T1ERRORS_H__ + + +#ifdef __cplusplus + extern "C" { +#endif + + + /************************ error codes declaration **************/ + + /* The error codes are grouped into `classes' used to indicate the */ + /* `level' at which the error happened. */ + /* */ + /* The class is given by an error code's high byte. */ + + + /* ------------- Success is always 0 -------- */ + +#define T1_Err_Ok FT_Err_Ok + + /* ----------- high level API errors -------- */ + +#define T1_Err_Invalid_File_Format FT_Err_Invalid_File_Format +#define T1_Err_Invalid_Argument FT_Err_Invalid_Argument +#define T1_Err_Invalid_Driver_Handle FT_Err_Invalid_Driver_Handle +#define T1_Err_Invalid_Face_Handle FT_Err_Invalid_Face_Handle +#define T1_Err_Invalid_Size_Handle FT_Err_Invalid_Size_Handle +#define T1_Err_Invalid_Glyph_Handle FT_Err_Invalid_Slot_Handle +#define T1_Err_Invalid_CharMap_Handle FT_Err_Invalid_CharMap_Handle +#define T1_Err_Invalid_Glyph_Index FT_Err_Invalid_Glyph_Index + +#define T1_Err_Unimplemented_Feature FT_Err_Unimplemented_Feature + +#define T1_Err_Invalid_Engine FT_Err_Invalid_Driver_Handle + + /* ------------- internal errors ------------ */ + +#define T1_Err_Out_Of_Memory FT_Err_Out_Of_Memory +#define T1_Err_Unlisted_Object FT_Err_Unlisted_Object + + /* ------------ general glyph outline errors ------ */ + +#define T1_Err_Invalid_Composite FT_Err_Invalid_Composite + +#define T1_Err_Syntax_Error FT_Err_Invalid_File_Format +#define T1_Err_Stack_Underflow FT_Err_Invalid_File_Format +#define T1_Err_Stack_Overflow FT_Err_Invalid_File_Format + + +#ifdef __cplusplus + } +#endif + + +#endif /* __T1ERRORS_H__ */ + + +/* END */ Index: xc/extras/freetype2/include/freetype/internal/t1types.h diff -u /dev/null xc/extras/freetype2/include/freetype/internal/t1types.h:1.1.1.1 --- /dev/null Mon Dec 18 14:22:33 2000 +++ xc/extras/freetype2/include/freetype/internal/t1types.h Fri Dec 8 16:26:18 2000 @@ -0,0 +1,197 @@ +/***************************************************************************/ +/* */ +/* t1types.h */ +/* */ +/* Basic Type1/Type2 type definitions and interface (specification */ +/* only). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#ifndef __T1TYPES_H__ +#define __T1TYPES_H__ + +#ifndef FT_BUILD_H +# define FT_BUILD_H +#endif +#include FT_BUILD_H +#include FT_TYPE1_TABLES_H +#include FT_INTERNAL_POSTSCRIPT_NAMES_H + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*** ***/ + /*** ***/ + /*** REQUIRED TYPE1/TYPE2 TABLES DEFINITIONS ***/ + /*** ***/ + /*** ***/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* */ + /* T1_Encoding */ + /* */ + /* */ + /* A structure modeling a custom encoding. */ + /* */ + /* */ + /* 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_Encoding_ + { + FT_Int num_chars; + FT_Int code_first; + FT_Int code_last; + + FT_UShort* char_index; + FT_String** char_name; + + } T1_Encoding; + + + typedef enum T1_EncodingType_ + { + t1_encoding_none = 0, + t1_encoding_array, + t1_encoding_standard, + t1_encoding_expert + + } T1_EncodingType; + + + typedef struct T1_Font_ + { + /* font info dictionary */ + T1_FontInfo font_info; + + /* private dictionary */ + T1_Private private_dict; + + /* top-level dictionary */ + FT_String* font_name; + + T1_EncodingType encoding_type; + T1_Encoding encoding; + + FT_Byte* subrs_block; + FT_Byte* charstrings_block; + FT_Byte* glyph_names_block; + + FT_Int num_subrs; + FT_Byte** subrs; + FT_Int* subrs_len; + + FT_Int num_glyphs; + FT_String** glyph_names; /* array of glyph names */ + FT_Byte** charstrings; /* array of glyph charstrings */ + FT_Int* 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_Int stroke_width; + + } T1_Font; + + + typedef struct CID_Subrs_ + { + FT_UInt num_subrs; + FT_Byte** code; + + } CID_Subrs; + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*** ***/ + /*** ***/ + /*** ORIGINAL T1_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, TT_GlyphSlot, and TT_CharMap */ + /* are not shared between font drivers, and are thus defined normally in */ + /* `ttobjs.h'. */ + /* */ + /*************************************************************************/ + + typedef struct T1_FaceRec_* T1_Face; + typedef struct CID_FaceRec_* CID_Face; + + + typedef struct T1_FaceRec_ + { + FT_FaceRec root; + T1_Font type1; + void* psnames; + void* psaux; + void* afm_data; + FT_CharMapRec charmaprecs[2]; + FT_CharMap charmaps[2]; + PS_Unicodes unicode_map; + + /* support for Multiple Masters fonts */ + T1_Blend* blend; + + } T1_FaceRec; + + + typedef struct CID_FaceRec_ + { + FT_FaceRec root; + void* psnames; + void* psaux; + CID_Info cid; + void* afm_data; + CID_Subrs* subrs; + + } CID_FaceRec; + + +FT_END_HEADER + +#endif /* __T1TYPES_H__ */ + + +/* END */ Index: xc/extras/freetype2/include/freetype/internal/t2errors.h diff -u /dev/null xc/extras/freetype2/include/freetype/internal/t2errors.h:1.1.1.1 --- /dev/null Mon Dec 18 14:22:33 2000 +++ xc/extras/freetype2/include/freetype/internal/t2errors.h Fri Dec 8 16:26:18 2000 @@ -0,0 +1,131 @@ +/***************************************************************************/ +/* */ +/* t2errors.h */ +/* */ +/* OpenType error ID definitions (specification only). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#ifndef __T2ERRORS_H__ +#define __T2ERRORS_H__ + + +#ifdef __cplusplus + extern "C" { +#endif + + + /*************************************************************************/ + /* */ + /* Error codes declaration */ + /* */ + /* The error codes are grouped in `classes' used to indicate the `level' */ + /* at which the error happened. The class is given by an error code's */ + /* high byte. */ + /* */ + /*************************************************************************/ + + + /* Success is always 0. */ + +#define T2_Err_Ok FT_Err_Ok + + /* High level API errors. */ + +#define T2_Err_Invalid_File_Format FT_Err_Invalid_File_Format +#define T2_Err_Invalid_Argument FT_Err_Invalid_Argument +#define T2_Err_Invalid_Driver_Handle FT_Err_Invalid_Driver_Handle +#define T2_Err_Invalid_Face_Handle FT_Err_Invalid_Face_Handle +#define T2_Err_Invalid_Instance_Handle FT_Err_Invalid_Size_Handle +#define T2_Err_Invalid_Glyph_Handle FT_Err_Invalid_Slot_Handle +#define T2_Err_Invalid_CharMap_Handle FT_Err_Invalid_CharMap_Handle +#define T2_Err_Invalid_Glyph_Index FT_Err_Invalid_Glyph_Index + +#define T2_Err_Unimplemented_Feature FT_Err_Unimplemented_Feature + +#define T2_Err_Invalid_Engine FT_Err_Invalid_Driver_Handle + + /* Internal errors. */ + +#define T2_Err_Out_Of_Memory FT_Err_Out_Of_Memory +#define T2_Err_Unlisted_Object FT_Err_Unlisted_Object + + /* General glyph outline errors. */ + +#define T2_Err_Invalid_Composite FT_Err_Invalid_Composite + + /* Bytecode interpreter error codes. */ + + /* These error codes are produced by the TrueType */ + /* bytecode interpreter. They usually indicate a */ + /* broken font file, a broken glyph within a font */ + /* file, or a bug in the interpreter! */ + +#define T2_Err_Invalid_Opcode 0x500 +#define T2_Err_Too_Few_Arguments 0x501 +#define T2_Err_Stack_Overflow 0x502 +#define T2_Err_Code_Overflow 0x503 +#define T2_Err_Bad_Argument 0x504 +#define T2_Err_Divide_By_Zero 0x505 +#define T2_Err_Storage_Overflow 0x506 +#define T2_Err_Cvt_Overflow 0x507 +#define T2_Err_Invalid_Reference 0x508 +#define T2_Err_Invalid_Distance 0x509 +#define T2_Err_Interpolate_Twilight 0x50A +#define T2_Err_Debug_OpCode 0x50B +#define T2_Err_ENDF_In_Exec_Stream 0x50C +#define T2_Err_Out_Of_CodeRanges 0x50D +#define T2_Err_Nested_DEFS 0x50E +#define T2_Err_Invalid_CodeRange 0x50F +#define T2_Err_Invalid_Displacement 0x510 +#define T2_Err_Execution_Too_Long 0x511 + +#define T2_Err_Too_Many_Instruction_Defs 0x512 +#define T2_Err_Too_Many_Function_Defs 0x513 + + /* Other TrueType specific error codes. */ + +#define T2_Err_Table_Missing 0x520 +#define T2_Err_Too_Many_Extensions 0x521 +#define T2_Err_Extensions_Unsupported 0x522 +#define T2_Err_Invalid_Extension_Id 0x523 + +#define T2_Err_No_Vertical_Data 0x524 + +#define T2_Err_Max_Profile_Missing 0x530 +#define T2_Err_Header_Table_Missing 0x531 +#define T2_Err_Horiz_Header_Missing 0x532 +#define T2_Err_Locations_Missing 0x533 +#define T2_Err_Name_Table_Missing 0x534 +#define T2_Err_CMap_Table_Missing 0x535 +#define T2_Err_Hmtx_Table_Missing 0x536 +#define T2_Err_OS2_Table_Missing 0x537 +#define T2_Err_Post_Table_Missing 0x538 + +#define T2_Err_Invalid_Horiz_Metrics 0x540 +#define T2_Err_Invalid_CharMap_Format 0x541 +#define T2_Err_Invalid_PPem 0x542 +#define T2_Err_Invalid_Vert_Metrics 0x543 + +#define T2_Err_Could_Not_Find_Context 0x550 + + +#ifdef __cplusplus + } +#endif + + +#endif /* __T2ERRORS_H__ */ + + +/* END */ Index: xc/extras/freetype2/include/freetype/internal/t2types.h diff -u /dev/null xc/extras/freetype2/include/freetype/internal/t2types.h:1.1.1.1 --- /dev/null Mon Dec 18 14:22:33 2000 +++ xc/extras/freetype2/include/freetype/internal/t2types.h Fri Dec 8 16:26:18 2000 @@ -0,0 +1,226 @@ +/***************************************************************************/ +/* */ +/* t2types.h */ +/* */ +/* Basic OpenType/CFF type definitions and interface (specification */ +/* only). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#ifndef __T2TYPES_H__ +#define __T2TYPES_H__ + +#ifndef FT_BUILD_H +# define FT_BUILD_H +#endif +#include FT_BUILD_H +#include FT_FREETYPE_H + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* */ + /* CFF_Index */ + /* */ + /* */ + /* A structure used to model a CFF Index table. */ + /* */ + /* */ + /* stream :: The source 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. */ + /* */ + /* offsets :: A table of element offsets in the index. */ + /* */ + /* bytes :: If the index is loaded in memory, its bytes. */ + /* */ + typedef struct CFF_Index_ + { + FT_Stream stream; + FT_UInt count; + FT_Byte off_size; + FT_ULong data_offset; + + FT_ULong* offsets; + FT_Byte* bytes; + + } CFF_Index; + + + typedef struct CFF_Font_Dict_ + { + 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_Pos underline_position; + FT_Pos underline_thickness; + FT_Int paint_type; + FT_Int charstring_type; + FT_Matrix font_matrix; + 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; + FT_UInt base_font_name; + FT_UInt 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_Long 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_Font_Dict; + + + typedef struct CFF_Private_ + { + 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_Private; + + + typedef struct CFF_FD_Select_ + { + 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_FD_Select; + + + /* A SubFont packs a font dict and a private dict together. They are */ + /* needed to support CID-keyed CFF fonts. */ + typedef struct CFF_SubFont_ + { + CFF_Font_Dict font_dict; + CFF_Private private_dict; + + CFF_Index local_subrs_index; + FT_UInt num_local_subrs; + FT_Byte** local_subrs; + + } CFF_SubFont; + + + /* maximum number of sub-fonts in a CID-keyed file */ +#define CFF_MAX_CID_FONTS 16 + + + typedef struct CFF_Font_ + { + 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_Index name_index; + CFF_Index top_dict_index; + CFF_Index string_index; + CFF_Index global_subrs_index; + + /* we don't load the Encoding and CharSet tables */ + + CFF_Index charstrings_index; + CFF_Index font_dict_index; + CFF_Index private_index; + CFF_Index local_subrs_index; + + FT_String* font_name; + FT_UInt num_global_subrs; + FT_Byte** global_subrs; + + CFF_SubFont top_font; + FT_UInt num_subfonts; + CFF_SubFont* subfonts[CFF_MAX_CID_FONTS]; + + CFF_FD_Select fd_select; + + } CFF_Font; + + +FT_END_HEADER + +#endif /* __T2TYPES_H__ */ + + +/* END */ Index: xc/extras/freetype2/include/freetype/internal/tterrors.h diff -u /dev/null xc/extras/freetype2/include/freetype/internal/tterrors.h:1.1.1.1 --- /dev/null Mon Dec 18 14:22:33 2000 +++ xc/extras/freetype2/include/freetype/internal/tterrors.h Fri Dec 8 16:26:18 2000 @@ -0,0 +1,131 @@ +/***************************************************************************/ +/* */ +/* tterrors.h */ +/* */ +/* TrueType error ID definitions (specification only). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#ifndef __TTERRORS_H__ +#define __TTERRORS_H__ + + +#ifdef __cplusplus + extern "C" { +#endif + + + /*************************************************************************/ + /* */ + /* Error codes declaration */ + /* */ + /* The error codes are grouped in `classes' used to indicate the `level' */ + /* at which the error happened. The class is given by an error code's */ + /* high byte. */ + /* */ + /*************************************************************************/ + + + /* Success is always 0. */ + +#define TT_Err_Ok FT_Err_Ok + + /* High level API errors. */ + +#define TT_Err_Invalid_File_Format FT_Err_Invalid_File_Format +#define TT_Err_Invalid_Argument FT_Err_Invalid_Argument +#define TT_Err_Invalid_Driver_Handle FT_Err_Invalid_Driver_Handle +#define TT_Err_Invalid_Face_Handle FT_Err_Invalid_Face_Handle +#define TT_Err_Invalid_Instance_Handle FT_Err_Invalid_Size_Handle +#define TT_Err_Invalid_Glyph_Handle FT_Err_Invalid_Slot_Handle +#define TT_Err_Invalid_CharMap_Handle FT_Err_Invalid_CharMap_Handle +#define TT_Err_Invalid_Glyph_Index FT_Err_Invalid_Glyph_Index + +#define TT_Err_Unimplemented_Feature FT_Err_Unimplemented_Feature + +#define TT_Err_Invalid_Engine FT_Err_Invalid_Driver_Handle + + /* Internal errors. */ + +#define TT_Err_Out_Of_Memory FT_Err_Out_Of_Memory +#define TT_Err_Unlisted_Object FT_Err_Unlisted_Object + + /* General glyph outline errors. */ + +#define TT_Err_Too_Many_Ins FT_Err_Too_Many_Hints +#define TT_Err_Invalid_Composite FT_Err_Invalid_Composite + + /* Bytecode interpreter error codes. */ + + /* These error codes are produced by the TrueType */ + /* bytecode interpreter. They usually indicate a */ + /* broken font file, a broken glyph within a font */ + /* file, or a bug in the interpreter! */ + +#define TT_Err_Invalid_Opcode 0x400 +#define TT_Err_Too_Few_Arguments 0x401 +#define TT_Err_Stack_Overflow 0x402 +#define TT_Err_Code_Overflow 0x403 +#define TT_Err_Bad_Argument 0x404 +#define TT_Err_Divide_By_Zero 0x405 +#define TT_Err_Storage_Overflow 0x406 +#define TT_Err_Cvt_Overflow 0x407 +#define TT_Err_Invalid_Reference 0x408 +#define TT_Err_Invalid_Distance 0x409 +#define TT_Err_Interpolate_Twilight 0x40A +#define TT_Err_Debug_OpCode 0x40B +#define TT_Err_ENDF_In_Exec_Stream 0x40C +#define TT_Err_Out_Of_CodeRanges 0x40D +#define TT_Err_Nested_DEFS 0x40E +#define TT_Err_Invalid_CodeRange 0x40F +#define TT_Err_Invalid_Displacement 0x410 +#define TT_Err_Execution_Too_Long 0x411 +#define TT_Err_Too_Many_Function_Defs 0x412 +#define TT_Err_Too_Many_Instruction_Defs 0x413 + + /* Other TrueType specific error codes. */ + +#define TT_Err_Table_Missing 0x420 +#define TT_Err_Too_Many_Extensions 0x421 +#define TT_Err_Extensions_Unsupported 0x422 +#define TT_Err_Invalid_Extension_Id 0x423 + +#define TT_Err_No_Vertical_Data 0x424 + +#define TT_Err_Max_Profile_Missing 0x430 +#define TT_Err_Header_Table_Missing 0x431 +#define TT_Err_Horiz_Header_Missing 0x432 +#define TT_Err_Locations_Missing 0x433 +#define TT_Err_Name_Table_Missing 0x434 +#define TT_Err_CMap_Table_Missing 0x435 +#define TT_Err_Hmtx_Table_Missing 0x436 +#define TT_Err_OS2_Table_Missing 0x437 +#define TT_Err_Post_Table_Missing 0x438 + +#define TT_Err_Invalid_Horiz_Metrics 0x440 +#define TT_Err_Invalid_CharMap_Format 0x441 +#define TT_Err_Invalid_PPem 0x442 +#define TT_Err_Invalid_Vert_Metrics 0x443 + +#define TT_Err_Could_Not_Find_Context 0x450 + + +#ifdef __cplusplus + } +#endif + + +#endif /* __TTERRORS_H__ */ + + +/* END */ Index: xc/extras/freetype2/include/freetype/internal/tttypes.h diff -u /dev/null xc/extras/freetype2/include/freetype/internal/tttypes.h:1.1.1.1 --- /dev/null Mon Dec 18 14:22:33 2000 +++ xc/extras/freetype2/include/freetype/internal/tttypes.h Fri Dec 8 16:26:18 2000 @@ -0,0 +1,1599 @@ +/***************************************************************************/ +/* */ +/* tttypes.h */ +/* */ +/* Basic SFNT/TrueType type definitions and interface (specification */ +/* only). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#ifndef __TTTYPES_H__ +#define __TTTYPES_H__ + +#ifndef FT_BUILD_H +# define FT_BUILD_H +#endif +#include FT_BUILD_H +#include FT_TRUETYPE_TABLES_H +#include FT_INTERNAL_OBJECTS_H + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*** ***/ + /*** ***/ + /*** REQUIRED TRUETYPE/OPENTYPE TABLES DEFINITIONS ***/ + /*** ***/ + /*** ***/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* */ + /* TTC_Header */ + /* */ + /* */ + /* TrueType collection header. This table contains the offsets of */ + /* the font headers of each distinct TrueType face in the file. */ + /* */ + /* */ + /* 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_Header_ + { + FT_ULong tag; + FT_Fixed version; + FT_Long count; + FT_ULong* offsets; + + } TTC_Header; + + + /*************************************************************************/ + /* */ + /* */ + /* SFNT_Header */ + /* */ + /* */ + /* SFNT file format header. */ + /* */ + /* */ + /* 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_Header_ + { + FT_ULong format_tag; + FT_UShort num_tables; + FT_UShort search_range; + FT_UShort entry_selector; + FT_UShort range_shift; + + } SFNT_Header; + + + /*************************************************************************/ + /* */ + /* */ + /* TT_TableDir */ + /* */ + /* */ + /* This structure models a TrueType table directory. It is used to */ + /* access the various tables of the font face. */ + /* */ + /* */ + /* version :: The version number; starts with 0x00010000. */ + /* */ + /* numTables :: The number of tables. */ + /* */ + /* searchRange :: Unused. */ + /* */ + /* entrySelector :: Unused. */ + /* */ + /* rangeShift :: Unused. */ + /* */ + /* */ + /* This structure is only used during font opening. */ + /* */ + typedef struct TT_TableDir_ + { + FT_Fixed version; /* should be 0x10000 */ + FT_UShort numTables; /* number of tables */ + + FT_UShort searchRange; /* These parameters are only used */ + FT_UShort entrySelector; /* for a dichotomy search in the */ + FT_UShort rangeShift; /* directory. We ignore them. */ + + } TT_TableDir; + + + /*************************************************************************/ + /* */ + /* */ + /* TT_Table */ + /* */ + /* */ + /* This structure describes a given table of a TrueType font. */ + /* */ + /* */ + /* 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_Table_ + { + FT_ULong Tag; /* table type */ + FT_ULong CheckSum; /* table checksum */ + FT_ULong Offset; /* table file offset */ + FT_ULong Length; /* table length */ + + } TT_Table; + + + /*************************************************************************/ + /* */ + /* */ + /* TT_CMapDir */ + /* */ + /* */ + /* This structure describes the directory of the `cmap' table, */ + /* containing the font's character mappings table. */ + /* */ + /* */ + /* tableVersionNumber :: The version number. */ + /* */ + /* numCMaps :: The number of charmaps in the font. */ + /* */ + /* */ + /* This structure is only used during font loading. */ + /* */ + typedef struct TT_CMapDir_ + { + FT_UShort tableVersionNumber; + FT_UShort numCMaps; + + } TT_CMapDir; + + + /*************************************************************************/ + /* */ + /* */ + /* TT_CMapDirEntry */ + /* */ + /* */ + /* This structure describes a charmap in a TrueType font. */ + /* */ + /* */ + /* platformID :: An ID used to specify for which platform this */ + /* charmap is defined (FreeType manages all platforms). */ + /* */ + /* encodingID :: A platform-specific ID used to indicate which source */ + /* encoding is used in this charmap. */ + /* */ + /* offset :: The offset of the charmap relative to the start of */ + /* the `cmap' table. */ + /* */ + /* */ + /* This structure is only used during font loading. */ + /* */ + typedef struct TT_CMapDirEntry_ + { + FT_UShort platformID; + FT_UShort platformEncodingID; + FT_Long offset; + + } TT_CMapDirEntry; + + + /*************************************************************************/ + /* */ + /* */ + /* TT_LongMetrics */ + /* */ + /* */ + /* A structure modeling the long metrics of the `hmtx' and `vmtx' */ + /* TrueType tables. The values are expressed in font units. */ + /* */ + /* */ + /* advance :: The advance width or height for the glyph. */ + /* */ + /* bearing :: The left-side or top-side bearing for the glyph. */ + /* */ + typedef struct TT_LongMetrics_ + { + FT_UShort advance; + FT_Short bearing; + + } TT_LongMetrics; + + + /*************************************************************************/ + /* */ + /* TT_ShortMetrics */ + /* */ + /* */ + /* A simple type to model the short metrics of the `hmtx' and `vmtx' */ + /* tables. */ + /* */ + typedef FT_Short TT_ShortMetrics; + + + /*************************************************************************/ + /* */ + /* */ + /* TT_NameRec */ + /* */ + /* */ + /* 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). */ + /* */ + /* */ + /* 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_NameRec_ + { + FT_UShort platformID; + FT_UShort encodingID; + FT_UShort languageID; + FT_UShort nameID; + FT_UShort stringLength; + FT_UShort stringOffset; + + /* this last field is not defined in the spec */ + /* but used by the FreeType engine */ + + FT_Byte* string; + + } TT_NameRec; + + + /*************************************************************************/ + /* */ + /* */ + /* TT_NameTable */ + /* */ + /* */ + /* A structure modeling the TrueType name table. */ + /* */ + /* */ + /* 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. */ + /* */ + /* storage :: The names storage area. */ + /* */ + typedef struct TT_NameTable_ + { + FT_UShort format; + FT_UShort numNameRecords; + FT_UShort storageOffset; + TT_NameRec* names; + FT_Byte* storage; + + } TT_NameTable; + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*** ***/ + /*** ***/ + /*** OPTIONAL TRUETYPE/OPENTYPE TABLES DEFINITIONS ***/ + /*** ***/ + /*** ***/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* */ + /* TT_GaspRange */ + /* */ + /* */ + /* A tiny structure used to model a gasp range according to the */ + /* TrueType specification. */ + /* */ + /* */ + /* 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_GaspRange_ + { + FT_UShort maxPPEM; + FT_UShort gaspFlag; + + } TT_GaspRange; + + +#define TT_GASP_GRIDFIT 0x01 +#define TT_GASP_DOGRAY 0x02 + + + /*************************************************************************/ + /* */ + /* */ + /* TT_Gasp */ + /* */ + /* */ + /* A structure modeling the TrueType `gasp' table used to specify */ + /* grid-fitting and anti-aliasing behaviour. */ + /* */ + /* */ + /* 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_Gasp; + + + /*************************************************************************/ + /* */ + /* */ + /* TT_HdmxRec */ + /* */ + /* */ + /* A small structure used to model the pre-computed widths of a given */ + /* size. They are found in the `hdmx' table. */ + /* */ + /* */ + /* 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_HdmxRec_ + { + FT_Byte ppem; + FT_Byte max_width; + FT_Byte* widths; + + } TT_HdmxRec; + + + /*************************************************************************/ + /* */ + /* */ + /* TT_Hdmx */ + /* */ + /* */ + /* A structure used to model the `hdmx' table, which contains */ + /* pre-computed widths for a set of given sizes/dimensions. */ + /* */ + /* */ + /* version :: The version number. */ + /* */ + /* num_records :: The number of hdmx records. */ + /* */ + /* records :: An array of hdmx records. */ + /* */ + typedef struct TT_Hdmx_ + { + FT_UShort version; + FT_Short num_records; + TT_HdmxRec* records; + + } TT_Hdmx; + + + /*************************************************************************/ + /* */ + /* */ + /* TT_Kern_0_Pair */ + /* */ + /* */ + /* 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. */ + /* */ + /* */ + /* 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_Kern_0_Pair_ + { + FT_UShort left; /* index of left glyph in pair */ + FT_UShort right; /* index of right glyph in pair */ + FT_FWord value; /* kerning value */ + + } TT_Kern_0_Pair; + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*** ***/ + /*** ***/ + /*** EMBEDDED BITMAPS SUPPORT ***/ + /*** ***/ + /*** ***/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* */ + /* TT_SBit_Metrics */ + /* */ + /* */ + /* 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. */ + /* */ + /* */ + /* 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_Metrics_ + { + 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_Metrics; + + + /*************************************************************************/ + /* */ + /* */ + /* TT_SBit_Small_Metrics */ + /* */ + /* */ + /* 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. */ + /* */ + /* */ + /* 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_Small_Metrics; + + + /*************************************************************************/ + /* */ + /* */ + /* TT_SBit_Line_Metrics */ + /* */ + /* */ + /* A structure used to describe the text line metrics of a given */ + /* bitmap strike, for either a horizontal or vertical layout. */ + /* */ + /* */ + /* 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_Line_Metrics_ + { + 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_Line_Metrics; + + + /*************************************************************************/ + /* */ + /* */ + /* TT_SBit_Range */ + /* */ + /* */ + /* A TrueType/OpenType subIndexTable as defined in the `EBLC' */ + /* (Microsoft) or `bloc' (Apple) tables. */ + /* */ + /* */ + /* 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_Range + { + 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_Metrics metrics; + FT_ULong num_glyphs; + + FT_ULong* glyph_offsets; + FT_UShort* glyph_codes; + + FT_ULong table_offset; + + } TT_SBit_Range; + + + /*************************************************************************/ + /* */ + /* */ + /* TT_SBit_Strike */ + /* */ + /* */ + /* A structure used describe a given bitmap strike in the `EBLC' */ + /* (Microsoft) or `bloc' (Apple) tables. */ + /* */ + /* */ + /* 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_Strike_ + { + FT_Int num_ranges; + TT_SBit_Range* sbit_ranges; + FT_ULong ranges_offset; + + FT_ULong color_ref; + + TT_SBit_Line_Metrics hori; + TT_SBit_Line_Metrics 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_Strike; + + + /*************************************************************************/ + /* */ + /* */ + /* TT_SBit_Component */ + /* */ + /* */ + /* A simple structure to describe a compound sbit element. */ + /* */ + /* */ + /* 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_Component_ + { + FT_UShort glyph_code; + FT_Char x_offset; + FT_Char y_offset; + + } TT_SBit_Component; + + + /*************************************************************************/ + /* */ + /* */ + /* TT_SBit_Scale */ + /* */ + /* */ + /* A structure used describe a given bitmap scaling table, as defined */ + /* in the `EBSC' table. */ + /* */ + /* */ + /* 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_Scale_ + { + TT_SBit_Line_Metrics hori; + TT_SBit_Line_Metrics vert; + + FT_Byte x_ppem; + FT_Byte y_ppem; + + FT_Byte x_ppem_substitute; + FT_Byte y_ppem_substitute; + + } TT_SBit_Scale; + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*** ***/ + /*** ***/ + /*** POSTSCRIPT GLYPH NAMES SUPPORT ***/ + /*** ***/ + /*** ***/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* */ + /* TT_Post_20 */ + /* */ + /* */ + /* Postscript names sub-table, format 2.0. Stores the PS name of */ + /* each glyph in the font face. */ + /* */ + /* */ + /* 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_20_ + { + FT_UShort num_glyphs; + FT_UShort num_names; + FT_UShort* glyph_indices; + FT_Char** glyph_names; + + } TT_Post_20; + + + /*************************************************************************/ + /* */ + /* */ + /* TT_Post_25 */ + /* */ + /* */ + /* Postscript names sub-table, format 2.5. Stores the PS name of */ + /* each glyph in the font face. */ + /* */ + /* */ + /* 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_25; + + + /*************************************************************************/ + /* */ + /* */ + /* TT_Post_Names */ + /* */ + /* */ + /* Postscript names table, either format 2.0 or 2.5. */ + /* */ + /* */ + /* 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_Names_ + { + FT_Bool loaded; + + union + { + TT_Post_20 format_20; + TT_Post_25 format_25; + + } names; + + } TT_Post_Names; + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*** ***/ + /*** ***/ + /*** TRUETYPE CHARMAPS SUPPORT ***/ + /*** ***/ + /*** ***/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /* format 0 */ + + typedef struct TT_CMap0_ + { + FT_Byte* glyphIdArray; + + } TT_CMap0; + + + /* format 2 */ + + typedef struct TT_CMap2SubHeader_ + { + FT_UShort firstCode; /* first valid low byte */ + FT_UShort entryCount; /* number of valid low bytes */ + FT_Short idDelta; /* delta value to glyphIndex */ + FT_UShort idRangeOffset; /* offset from here to 1st code */ + + } TT_CMap2SubHeader; + + + typedef struct TT_CMap2_ + { + FT_UShort* subHeaderKeys; + /* high byte mapping table */ + /* value = subHeader index * 8 */ + + TT_CMap2SubHeader* subHeaders; + FT_UShort* glyphIdArray; + FT_UShort numGlyphId; /* control value */ + + } TT_CMap2; + + + /* format 4 */ + + typedef struct TT_CMap4Segment_ + { + FT_UShort endCount; + FT_UShort startCount; + FT_Short idDelta; + FT_UShort idRangeOffset; + + } TT_CMap4Segment; + + + typedef struct TT_CMap4_ + { + FT_UShort segCountX2; /* number of segments * 2 */ + FT_UShort searchRange; /* these parameters can be used */ + FT_UShort entrySelector; /* for a binary search */ + FT_UShort rangeShift; + + TT_CMap4Segment* segments; + FT_UShort* glyphIdArray; + FT_UShort numGlyphId; /* control value */ + + TT_CMap4Segment* last_segment; /* last used segment; this is a small */ + /* cache to potentially increase speed */ + } TT_CMap4; + + + /* format 6 */ + + typedef struct TT_CMap6_ + { + FT_UShort firstCode; /* first character code of subrange */ + FT_UShort entryCount; /* number of character codes in subrange */ + + FT_UShort* glyphIdArray; + + } TT_CMap6; + + + typedef struct TT_CMapTable_ TT_CMapTable; + + + typedef + FT_UInt (*TT_CharMap_Func)( TT_CMapTable* charmap, + FT_ULong char_code ); + + + /* charmap table */ + struct TT_CMapTable_ + { + FT_UShort platformID; + FT_UShort platformEncodingID; + FT_UShort format; + FT_UShort length; + FT_UShort version; + + FT_Bool loaded; + FT_ULong offset; + + union + { + TT_CMap0 cmap0; + TT_CMap2 cmap2; + TT_CMap4 cmap4; + TT_CMap6 cmap6; + } c; + + TT_CharMap_Func get_index; + }; + + + /*************************************************************************/ + /* */ + /* */ + /* TT_CharMapRec */ + /* */ + /* */ + /* The TrueType character map object type. */ + /* */ + /* */ + /* root :: The parent character map structure. */ + /* */ + /* cmap :: The used character map. */ + /* */ + typedef struct TT_CharMapRec_ + { + FT_CharMapRec root; + TT_CMapTable cmap; + + } TT_CharMapRec; + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*** ***/ + /*** ***/ + /*** 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, TT_GlyphSlot, and TT_CharMap */ + /* are not shared between font drivers, and are thus defined normally in */ + /* `ttobjs.h'. */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* */ + /* TT_Face */ + /* */ + /* */ + /* A handle to a TrueType face/font object. A TT_Face encapsulates */ + /* the resolution and scaling independent parts of a TrueType font */ + /* resource. */ + /* */ + /* */ + /* The TT_Face structure is also used as a `parent class' for the */ + /* OpenType-CFF class (T2_Face). */ + /* */ + typedef struct TT_FaceRec_* TT_Face; + + + /*************************************************************************/ + /* */ + /* */ + /* TT_CharMap */ + /* */ + /* */ + /* A handle to a TrueType character mapping object. */ + /* */ + typedef struct TT_CharMapRec_* TT_CharMap; + + + /* a function type used for the truetype bytecode interpreter hooks */ + typedef FT_Error (*TT_Interpreter)( void* exec_context ); + + /* forward declaration */ + typedef struct TT_Loader_ TT_Loader; + + + /*************************************************************************/ + /* */ + /* */ + /* TT_Goto_Table_Func */ + /* */ + /* */ + /* Seeks a stream to the start of a given TrueType table. */ + /* */ + /* */ + /* face :: A handle to the target face object. */ + /* */ + /* tag :: A 4-byte tag used to name the table. */ + /* */ + /* stream :: The input stream. */ + /* */ + /* */ + /* length :: The length of the table in bytes. Set to 0 if not */ + /* needed. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + /* */ + /* The stream cursor must be at the font file's origin. */ + /* */ + typedef + FT_Error (*TT_Goto_Table_Func)( TT_Face face, + FT_ULong tag, + FT_Stream stream, + FT_ULong* length ); + + + /*************************************************************************/ + /* */ + /* */ + /* TT_Access_Glyph_Frame_Func */ + /* */ + /* */ + /* Seeks a stream to the start of a given glyph element, and opens a */ + /* frame for it. */ + /* */ + /* */ + /* 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. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + /* */ + /* This function is normally equivalent to FILE_Seek(offset) */ + /* followed by ACCESS_Frame(byte_count) with the loader's stream, but */ + /* alternative formats (e.g. compressed ones) might use something */ + /* different. */ + /* */ + typedef + FT_Error (*TT_Access_Glyph_Frame_Func)( TT_Loader* loader, + FT_UInt glyph_index, + FT_ULong offset, + FT_UInt byte_count ); + + + /*************************************************************************/ + /* */ + /* */ + /* TT_Load_Glyph_Element_Func */ + /* */ + /* */ + /* Reads one glyph element (its header, a simple glyph, or a */ + /* composite) from the loader's current stream frame. */ + /* */ + /* */ + /* loader :: The current TrueType glyph loader object. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + typedef + FT_Error (*TT_Load_Glyph_Element_Func)( TT_Loader* loader ); + + + /*************************************************************************/ + /* */ + /* */ + /* TT_Forget_Glyph_Frame_Func */ + /* */ + /* */ + /* Closes the current loader stream frame for the glyph. */ + /* */ + /* */ + /* loader :: The current TrueType glyph loader object. */ + /* */ + typedef + void (*TT_Forget_Glyph_Frame_Func)( TT_Loader* loader ); + + + + /*************************************************************************/ + /* */ + /* TrueType Face Type */ + /* */ + /* */ + /* TT_Face */ + /* */ + /* */ + /* The TrueType face class. These objects model the resolution and */ + /* point-size independent data found in a TrueType font file. */ + /* */ + /* */ + /* 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. */ + /* */ + /* max_components :: The maximum number of glyph components */ + /* required to load any composite glyph from */ + /* this font. Used to size the load stack. */ + /* */ + /* 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. */ + /* */ + /* num_charmaps :: The number of character mappings in the */ + /* font. */ + /* */ + /* charmaps :: The array of charmap objects for this font */ + /* file. Note that this field is a typeless */ + /* pointer. The Reason is that the format of */ + /* charmaps varies with the underlying font */ + /* format and cannot be determined here. */ + /* */ + /* 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 :: XXX */ + /* */ + /* read_glyph_header :: XXX */ + /* */ + /* read_simple_glyph :: XXX */ + /* */ + /* read_composite_glyph :: XXX */ + /* */ + /* forget_glyph_frame :: XXX */ + /* */ + /* sfnt :: A pointer to the SFNT `driver' interface. */ + /* */ + /* psnames :: A pointer to the `PSNames' module */ + /* interface. */ + /* */ + /* 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 :: XXX */ + /* */ + /* 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. */ + /* */ + /* 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. You should use */ + /* the `ttxkern' structures if you want to */ + /* access other kerning tables. Ignored */ + /* for Type 2 fonts. */ + /* */ + /* kern_table_index :: The index of the kerning table in the font */ + /* kerning directory. Only used by the */ + /* ttxkern extension to avoid data */ + /* duplication. Ignored for Type 2 fonts. */ + /* */ + /* interpreter :: A pointer to the TrueType bytecode */ + /* interpreters field is also used to hook */ + /* the debugger in `ttdebug'. */ + /* */ + /* extra :: XXX */ + /* */ + typedef struct TT_FaceRec_ + { + FT_FaceRec root; + + TTC_Header 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; + FT_ULong max_components; + + FT_Bool vertical_info; + TT_VertHeader vertical; /* TT Vertical header, if present */ + + FT_UShort num_names; /* number of name records */ + TT_NameTable name_table; /* name table */ + + TT_OS2 os2; /* TrueType OS/2 table */ + TT_Postscript postscript; /* TrueType Postscript table */ + + FT_Int num_charmaps; + TT_CharMap charmaps; /* array of TT_CharMapRec */ + + TT_Goto_Table_Func goto_table; + + TT_Access_Glyph_Frame_Func access_glyph_frame; + TT_Load_Glyph_Element_Func read_glyph_header; + TT_Load_Glyph_Element_Func read_simple_glyph; + TT_Load_Glyph_Element_Func read_composite_glyph; + TT_Forget_Glyph_Frame_Func forget_glyph_frame; + + /* 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 PSNames_Interface table used to */ + /* handle glyph names <-> unicode & Mac values */ + void* psnames; + + /***********************************************************************/ + /* */ + /* Optional TrueType/OpenType tables */ + /* */ + /***********************************************************************/ + + /* horizontal device metrics */ + TT_Hdmx hdmx; + + /* grid-fitting and scaling table */ + TT_Gasp gasp; /* the `gasp' table */ + + /* PCL 5 table */ + TT_PCLT pclt; + + /* embedded bitmaps support */ + FT_Int num_sbit_strikes; + TT_SBit_Strike* sbit_strikes; + + FT_Int num_sbit_scales; + TT_SBit_Scale* sbit_scales; + + /* postscript names table */ + TT_Post_Names postscript_names; + + + /***********************************************************************/ + /* */ + /* TrueType-specific fields (ignored by the OTF-Type2 driver) */ + /* */ + /***********************************************************************/ + + /* the glyph locations */ + FT_UShort num_locations; + FT_Long* glyph_locations; + + /* 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; + + /* the format 0 kerning table, if any */ + FT_Int num_kern_pairs; + FT_Int kern_table_index; + TT_Kern_0_Pair* kern_pairs; + + /* A pointer to the bytecode interpreter to use. This is also */ + /* used to hook the debugger for the `ttdebug' utility. */ + TT_Interpreter interpreter; + + + /***********************************************************************/ + /* */ + /* Other tables or fields. This is used by derivative formats like */ + /* OpenType. */ + /* */ + /***********************************************************************/ + + FT_Generic extra; + + } TT_FaceRec; + + + /*************************************************************************/ + /* */ + /* */ + /* TT_GlyphZone */ + /* */ + /* */ + /* A glyph zone is used to load, scale and hint glyph outline */ + /* coordinates. */ + /* */ + /* */ + /* 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 thez one. */ + /* */ + /* 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. */ + /* */ + typedef struct TT_GlyphZone_ + { + 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_Byte* tags; /* current touch flags */ + FT_UShort* contours; /* contour end points */ + + } TT_GlyphZone; + + + /* handle to execution context */ + typedef struct TT_ExecContextRec_* TT_ExecContext; + + /* glyph loader structure */ + struct TT_Loader_ + { + 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_Bool preserve_pps; + FT_Vector pp1; + FT_Vector pp2; + + FT_ULong glyf_offset; + + /* the zone where we load our glyphs */ + TT_GlyphZone base; + TT_GlyphZone zone; + + TT_ExecContext exec; + FT_Byte* instructions; + FT_ULong ins_pos; + + /* for possible extensibility in other formats */ + void* other; + + }; + + +FT_END_HEADER + +#endif /* __TTTYPES_H__ */ + + +/* END */ Index: xc/extras/freetype2/obj/.cvsignore diff -u /dev/null xc/extras/freetype2/obj/.cvsignore:1.1.1.1 --- /dev/null Mon Dec 18 14:22:33 2000 +++ xc/extras/freetype2/obj/.cvsignore Fri Dec 8 16:26:18 2000 @@ -0,0 +1,3 @@ +*.lo +libfreetype.la +.libs Index: xc/extras/freetype2/obj/README diff -u /dev/null xc/extras/freetype2/obj/README:1.1.1.1 --- /dev/null Mon Dec 18 14:22:33 2000 +++ xc/extras/freetype2/obj/README Fri Dec 8 16:26:18 2000 @@ -0,0 +1 @@ +This directory contains all the object files created when building the library Index: xc/extras/freetype2/src/autohint/CatharonLicense.txt diff -u /dev/null xc/extras/freetype2/src/autohint/CatharonLicense.txt:1.1.1.1 --- /dev/null Mon Dec 18 14:22:33 2000 +++ xc/extras/freetype2/src/autohint/CatharonLicense.txt Fri Dec 8 16:26:18 2000 @@ -0,0 +1,123 @@ + The Catharon Open Source LICENSE + ---------------------------- + + 2000-Jul-04 + + Copyright (C) 2000 by Catharon Productions, Inc. + + + +Introduction +============ + + This license applies to source files distributed by Catharon + Productions, Inc. in several archive packages. This license + applies to all files found in such packages which do not fall + under their own explicit license. + + 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 are + 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 + Catharon 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 packages distributed by + Catharon Productions, Inc. and assume no liability related to + their use. + + +Legal Terms +=========== + +0. Definitions +-------------- + + Throughout this license, the terms `Catharon Package', `package', + and `Catharon Code' refer to the set of files originally + distributed by Catharon Productions, Inc. + + `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 one of the + Catharon Packages'. + + This license applies to all files distributed in the original + Catharon Package(s), 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 Catharon Packages are copyright (C) 2000 by Catharon + Productions, Inc. All rights reserved except as specified below. + +1. No Warranty +-------------- + + THE CATHARON PACKAGES ARE 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 OF OR THE INABILITY TO + USE THE CATHARON PACKAGE. + +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 Catharon Packages (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 + (`license.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 on the work of + Catharon Productions, Inc. in the distribution documentation. + + These conditions apply to any software derived from or based on + the Catharon Packages, 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 Catharon Productions, Inc. 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 the following phrase + to refer to this software in your documentation: 'this software is + based in part on the Catharon Typography Project'. + + As you have not signed this license, you are not required to + accept it. However, as the Catharon Packages are 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 Catharon + Packages, you indicate that you understand and accept all the + terms of this license. + +--- end of license.txt --- Index: xc/extras/freetype2/src/autohint/ahangles.c diff -u /dev/null xc/extras/freetype2/src/autohint/ahangles.c:1.1.1.1 --- /dev/null Mon Dec 18 14:22:33 2000 +++ xc/extras/freetype2/src/autohint/ahangles.c Fri Dec 8 16:26:18 2000 @@ -0,0 +1,137 @@ +/***************************************************************************/ +/* */ +/* ahangles.h */ +/* */ +/* A routine used to compute vector angles with limited accuracy */ +/* and very high speed (body). */ +/* */ +/* Copyright 2000 Catharon Productions Inc. */ +/* Author: David Turner */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#ifdef FT_FLAT_COMPILE + +#include "ahangles.h" + +#else + +#include + +#endif + + + /* the following table has been automatically generated with */ + /* the `mather.py' Python script */ + + const AH_Angle ah_arctan[1L << AH_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 + AH_Angle ah_angle( FT_Vector* v ) + { + FT_Pos dx, dy; + AH_Angle angle; + + + dx = v->x; + dy = v->y; + + /* check trivial cases */ + if ( dy == 0 ) + { + angle = 0; + if ( dx < 0 ) + angle = AH_PI; + return angle; + } + else if ( dx == 0 ) + { + angle = AH_HALF_PI; + if ( dy < 0 ) + angle = -AH_HALF_PI; + return angle; + } + + angle = 0; + if ( dx < 0 ) + { + dx = -v->x; + dy = -v->y; + angle = AH_PI; + } + + if ( dy < 0 ) + { + FT_Pos tmp; + + + tmp = dx; + dx = -dy; + dy = tmp; + angle -= AH_HALF_PI; + } + + if ( dx == 0 && dy == 0 ) + return 0; + + if ( dx == dy ) + angle += AH_PI / 4; + else if ( dx > dy ) + angle += ah_arctan[FT_DivFix( dy, dx ) >> ( 16 - AH_ATAN_BITS )]; + else + angle += AH_HALF_PI - + ah_arctan[FT_DivFix( dx, dy ) >> ( 16 - AH_ATAN_BITS )]; + + if ( angle > AH_PI ) + angle -= AH_2PI; + + return angle; + } + + +/* END */ Index: xc/extras/freetype2/src/autohint/ahangles.h diff -u /dev/null xc/extras/freetype2/src/autohint/ahangles.h:1.1.1.1 --- /dev/null Mon Dec 18 14:22:33 2000 +++ xc/extras/freetype2/src/autohint/ahangles.h Fri Dec 8 16:26:19 2000 @@ -0,0 +1,73 @@ +/***************************************************************************/ +/* */ +/* ahangles.h */ +/* */ +/* A routine used to compute vector angles with limited accuracy */ +/* and very high speed (specification). */ +/* */ +/* Copyright 2000 Catharon Productions Inc. */ +/* Author: David Turner */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#ifndef AHANGLES_H +#define AHANGLES_H + + +#ifdef FT_FLAT_COMPILE + +#include "ahtypes.h" + +#else + +#include + +#endif + + +#include + + +#ifdef __cplusplus + extern "C" { +#endif + + + /* PI expressed in ah_angles -- we don't really need an important */ + /* precision, so 256 should be enough */ +#define AH_PI 256 +#define AH_2PI ( AH_PI * 2 ) +#define AH_HALF_PI ( AH_PI / 2 ) +#define AH_2PIMASK ( AH_2PI - 1 ) + + /* the number of bits used to express an arc tangent; */ + /* see the structure of the lookup table */ +#define AH_ATAN_BITS 8 + + extern + const AH_Angle ah_arctan[1L << AH_ATAN_BITS]; + + + FT_LOCAL + AH_Angle ah_angle( FT_Vector* v ); + + +#ifdef __cplusplus + } +#endif + + +#endif /* AHANGLES_H */ + + +/* END */ Index: xc/extras/freetype2/src/autohint/ahglobal.c diff -u /dev/null xc/extras/freetype2/src/autohint/ahglobal.c:1.1.1.1 --- /dev/null Mon Dec 18 14:22:33 2000 +++ xc/extras/freetype2/src/autohint/ahglobal.c Fri Dec 8 16:26:19 2000 @@ -0,0 +1,402 @@ +/***************************************************************************/ +/* */ +/* ahglobal.c */ +/* */ +/* Routines used to compute global metrics automatically (body). */ +/* */ +/* Copyright 2000 Catharon Productions Inc. */ +/* Author: David Turner */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#ifdef FT_FLAT_COMPILE + +#include "ahglobal.h" +#include "ahglyph.h" + +#else + +#include +#include + +#endif + + +#define MAX_TEST_CHARACTERS 12 + + static + const char* blue_chars[ah_blue_max] = + { + "THEZOCQS", + "HEZLOCUS", + "xzroesc", + "xzroesc", + "pqgjy" + }; + + + /* simple insertion sort */ + static + void sort_values( FT_Int count, + FT_Pos* table ) + { + FT_Int i, j, swap; + + + for ( i = 1; i < count; i++ ) + { + for ( j = i; j > 1; j-- ) + { + if ( table[j] > table[j - 1] ) + break; + + swap = table[j]; + table[j] = table[j - 1]; + table[j - 1] = swap; + } + } + } + + + static + FT_Error ah_hinter_compute_blues( AH_Hinter* hinter ) + { + AH_Blue blue; + AH_Globals* globals = &hinter->globals->design; + FT_Pos flats [MAX_TEST_CHARACTERS]; + FT_Pos rounds[MAX_TEST_CHARACTERS]; + FT_Int num_flats; + FT_Int num_rounds; + + FT_Face face; + FT_GlyphSlot glyph; + FT_Error error; + FT_CharMap charmap; + + + face = hinter->face; + glyph = face->glyph; + + /* save current charmap */ + charmap = face->charmap; + + /* do we have a Unicode charmap in there? */ + error = FT_Select_Charmap( face, ft_encoding_unicode ); + if ( error ) + goto Exit; + + /* we compute the blues simply by loading each character from the */ + /* 'blue_chars[blues]' string, then compute its top-most and */ + /* bottom-most points */ + + AH_LOG(( "blue zones computation\n" )); + AH_LOG(( "------------------------------------------------\n" )); + + for ( blue = ah_blue_capital_top; blue < ah_blue_max; blue++ ) + { + const char* p = blue_chars[blue]; + const char* limit = p + MAX_TEST_CHARACTERS; + FT_Pos *blue_ref, *blue_shoot; + + + AH_LOG(( "blue %3d: ", blue )); + + num_flats = 0; + num_rounds = 0; + + for ( ; p < limit; p++ ) + { + FT_UInt glyph_index; + FT_Vector* extremum; + FT_Vector* points; + FT_Vector* point_limit; + FT_Vector* point; + FT_Bool round; + + + /* exit if we reach the end of the string */ + if ( !*p ) + break; + + AH_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; + point_limit = points + glyph->outline.n_points; + point = points; + extremum = point; + point++; + + if ( AH_IS_TOP_BLUE( blue ) ) + { + for ( ; point < point_limit; point++ ) + if ( point->y > extremum->y ) + extremum = point; + } + else + { + for ( ; point < point_limit; point++ ) + if ( point->y < extremum->y ) + extremum = point; + } + + AH_LOG(( "%5d", (int)extremum->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 see its previous and next points */ + { + FT_Int index = extremum - points; + FT_Int n; + FT_Int first, last, prev, next, end; + FT_Pos dist; + + + last = -1; + first = 0; + + for ( n = 0; n < glyph->outline.n_contours; n++ ) + { + end = glyph->outline.contours[n]; + if ( end >= index ) + { + last = end; + break; + } + first = end + 1; + } + + /* XXX: should never happen! */ + if ( last < 0 ) + continue; + + /* now look for the previous and next points that are not on the */ + /* same Y coordinate. Threshold the `closeness'... */ + + prev = index; + next = prev; + + do + { + if ( prev > first ) + prev--; + else + prev = last; + + dist = points[prev].y - extremum->y; + if ( dist < -5 || dist > 5 ) + break; + + } while ( prev != index ); + + do + { + if ( next < last ) + next++; + else + next = first; + + dist = points[next].y - extremum->y; + if ( dist < -5 || dist > 5 ) + break; + + } while ( next != index ); + + /* now, set the `round' flag depending on the segment's kind */ + round = + FT_CURVE_TAG( glyph->outline.tags[prev] ) != FT_Curve_Tag_On || + FT_CURVE_TAG( glyph->outline.tags[next] ) != FT_Curve_Tag_On ; + + AH_LOG(( "%c ", round ? 'r' : 'f' )); + } + + if ( round ) + rounds[num_rounds++] = extremum->y; + else + flats[num_flats++] = extremum->y; + } + + AH_LOG(( "\n" )); + + /* 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 short */ + sort_values( num_rounds, rounds ); + sort_values( num_flats, flats ); + + blue_ref = globals->blue_refs + blue; + blue_shoot = globals->blue_shoots + blue; + if ( num_flats == 0 && num_rounds == 0 ) + { + *blue_ref = -10000; + *blue_shoot = -10000; + } + else 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 = ( shoot > ref ); + + + if ( AH_IS_TOP_BLUE( blue ) ^ over_ref ) + *blue_shoot = *blue_ref = ( shoot + ref ) / 2; + } + + AH_LOG(( "-- ref = %ld, shoot = %ld\n", *blue_ref, *blue_shoot )); + } + + /* reset original face charmap */ + FT_Set_Charmap( face, charmap ); + error = 0; + + Exit: + return error; + } + + + static + FT_Error ah_hinter_compute_widths( AH_Hinter* hinter ) + { + /* scan the array of segments in each direction */ + AH_Outline* outline = hinter->glyph; + AH_Segment* segments; + AH_Segment* limit; + AH_Globals* globals = &hinter->globals->design; + FT_Pos* widths; + FT_Int dimension; + FT_Int* p_num_widths; + FT_Error error = 0; + FT_Pos edge_distance_threshold = 32000; + + + globals->num_widths = 0; + globals->num_heights = 0; + + /* For now, compute the standard width and height from the `o' */ + /* character. I started computing the stem width of the `i' and the */ + /* stem height of the "-", but it wasn't too good. Moreover, we now */ + /* have a single character that gives us standard width and height. */ + { + FT_UInt glyph_index; + + + glyph_index = FT_Get_Char_Index( hinter->face, 'o' ); + if ( glyph_index == 0 ) + return 0; + + error = FT_Load_Glyph( hinter->face, glyph_index, FT_LOAD_NO_SCALE ); + if ( error ) + goto Exit; + + error = ah_outline_load( hinter->glyph, hinter->face ); + if ( error ) + goto Exit; + + ah_outline_compute_segments( hinter->glyph ); + ah_outline_link_segments( hinter->glyph ); + } + + segments = outline->horz_segments; + limit = segments + outline->num_hsegments; + widths = globals->heights; + p_num_widths = &globals->num_heights; + + for ( dimension = 1; dimension >= 0; dimension-- ) + { + AH_Segment* seg = segments; + AH_Segment* link; + FT_Int num_widths = 0; + + + for ( ; seg < limit; seg++ ) + { + link = seg->link; + /* we only consider stem segments there! */ + if ( link && link->link == seg && link > seg ) + { + FT_Int dist; + + + dist = seg->pos - link->pos; + if ( dist < 0 ) + dist = -dist; + + if ( num_widths < 12 ) + widths[num_widths++] = dist; + } + } + + sort_values( num_widths, widths ); + *p_num_widths = num_widths; + + /* we will now try to find the smallest width */ + if ( num_widths > 0 && widths[0] < edge_distance_threshold ) + edge_distance_threshold = widths[0]; + + segments = outline->vert_segments; + limit = segments + outline->num_vsegments; + widths = globals->widths; + p_num_widths = &globals->num_widths; + + } + + /* Now, compute the edge distance threshold as a fraction of the */ + /* smallest width in the font. Set it in `hinter.glyph' too! */ + if ( edge_distance_threshold == 32000 ) + edge_distance_threshold = 50; + + /* let's try 20% */ + hinter->glyph->edge_distance_threshold = edge_distance_threshold / 5; + + Exit: + return error; + } + + + FT_LOCAL_DEF + FT_Error ah_hinter_compute_globals( AH_Hinter* hinter ) + { + return ah_hinter_compute_widths( hinter ) || + ah_hinter_compute_blues ( hinter ); + } + + +/* END */ Index: xc/extras/freetype2/src/autohint/ahglobal.h diff -u /dev/null xc/extras/freetype2/src/autohint/ahglobal.h:1.1.1.1 --- /dev/null Mon Dec 18 14:22:33 2000 +++ xc/extras/freetype2/src/autohint/ahglobal.h Fri Dec 8 16:26:19 2000 @@ -0,0 +1,62 @@ +/***************************************************************************/ +/* */ +/* ahglobal.h */ +/* */ +/* Routines used to compute global metrics automatically */ +/* (specification). */ +/* */ +/* Copyright 2000 Catharon Productions Inc. */ +/* Author: David Turner */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#ifndef AHGLOBAL_H +#define AHGLOBAL_H + +#ifdef FT_FLAT_COMPILE + +#include "ahtypes.h" + +#else + +#include + +#endif + + +#include /* for FT_LOCAL/FT_LOCAL_DEF */ + + +#ifdef __cplusplus + extern "C" { +#endif + + +#define AH_IS_TOP_BLUE( b ) ( (b) == ah_blue_capital_top || \ + (b) == ah_blue_small_top ) + + + /* compute global metrics automatically */ + FT_LOCAL + FT_Error ah_hinter_compute_globals( AH_Hinter* hinter ); + + +#ifdef __cplusplus + } +#endif + + +#endif /* AHGLOBAL_H */ + + +/* END */ Index: xc/extras/freetype2/src/autohint/ahglyph.c diff -u /dev/null xc/extras/freetype2/src/autohint/ahglyph.c:1.1.1.1 --- /dev/null Mon Dec 18 14:22:33 2000 +++ xc/extras/freetype2/src/autohint/ahglyph.c Fri Dec 8 16:26:19 2000 @@ -0,0 +1,1459 @@ +/***************************************************************************/ +/* */ +/* ahglyph.c */ +/* */ +/* Routines used to load and analyze a given glyph before hinting */ +/* (body). */ +/* */ +/* Copyright 2000 Catharon Productions Inc. */ +/* Author: David Turner */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#ifdef FT_FLAT_COMPILE + +#include "ahglyph.h" +#include "ahangles.h" +#include "ahglobal.h" + +#else + +#include +#include +#include + +#endif + + +#include + + +#define xxxAH_DEBUG_GLYPH + + + /* compute the direction value of a given vector.. */ + static + AH_Direction ah_compute_direction( FT_Pos dx, + FT_Pos dy ) + { + AH_Direction dir; + FT_Pos ax = ABS( dx ); + FT_Pos ay = ABS( dy ); + + + dir = ah_dir_none; + + /* test for vertical direction */ + if ( ax * 12 < ay ) + { + dir = dy > 0 ? ah_dir_up : ah_dir_down; + } + /* test for horizontal direction */ + else if ( ay * 12 < ax ) + { + dir = dx > 0 ? ah_dir_right : ah_dir_left; + } + + return dir; + } + + + /* this function is used by ah_get_orientation (see below) to test */ + /* the fill direction of a given bbox extrema */ + static + int ah_test_extrema( FT_Outline* outline, + int n ) + { + FT_Vector *prev, *cur, *next; + FT_Pos product; + FT_Int first, last, c; + + + /* we need to compute the `previous' and `next' point */ + /* for these extrema */ + cur = outline->points + n; + prev = cur - 1; + next = cur + 1; + + first = 0; + for ( c = 0; c < outline->n_contours; c++ ) + { + last = outline->contours[c]; + + if ( n == first ) + prev = outline->points + last; + + if ( n == last ) + next = outline->points + first; + + first = last + 1; + } + + product = FT_MulDiv( cur->x - prev->x, /* in.x */ + next->y - cur->y, /* out.y */ + 0x40 ) + - + FT_MulDiv( cur->y - prev->y, /* in.y */ + next->x - cur->x, /* out.x */ + 0x40 ); + + if ( product ) + product = product > 0 ? 2 : 1; + + return product; + } + + + /* Compute the orientation of path filling. It differs between TrueType */ + /* and Type1 formats. We could use the `ft_outline_reverse_fill' flag, */ + /* but it is better to re-compute it directly (it seems that this flag */ + /* isn't correctly set for some weird composite glyphs currently). */ + /* */ + /* We do this by computing bounding box points, and computing their */ + /* curvature. */ + /* */ + /* The function returns either 1 or -1. */ + /* */ + static + int ah_get_orientation( FT_Outline* outline ) + { + FT_BBox box; + FT_BBox indices; + int n, last; + + + indices.xMin = -1; + indices.yMin = -1; + indices.xMax = -1; + indices.yMax = -1; + + box.xMin = box.yMin = 32767; + box.xMax = box.yMax = -32768; + + /* is it empty? */ + if ( outline->n_contours < 1 ) + return 1; + + last = outline->contours[outline->n_contours - 1]; + + for ( n = 0; n <= last; n++ ) + { + FT_Pos x, y; + + + x = outline->points[n].x; + if ( x < box.xMin ) + { + box.xMin = x; + indices.xMin = n; + } + if ( x > box.xMax ) + { + box.xMax = x; + indices.xMax = n; + } + + y = outline->points[n].y; + if ( y < box.yMin ) + { + box.yMin = y; + indices.yMin = n; + } + if ( y > box.yMax ) + { + box.yMax = y; + indices.yMax = n; + } + } + + /* test orientation of the xmin */ + n = ah_test_extrema( outline, indices.xMin ); + if ( n ) + goto Exit; + + n = ah_test_extrema( outline, indices.yMin ); + if ( n ) + goto Exit; + + n = ah_test_extrema( outline, indices.xMax ); + if ( n ) + goto Exit; + + n = ah_test_extrema( outline, indices.yMax ); + if ( !n ) + n = 1; + + Exit: + return n; + } + + + /*************************************************************************/ + /* */ + /* */ + /* ah_outline_new */ + /* */ + /* */ + /* Creates a new and empty AH_Outline object. */ + /* */ + FT_LOCAL_DEF + FT_Error ah_outline_new( FT_Memory memory, + AH_Outline** aoutline ) + { + FT_Error error; + AH_Outline* outline; + + + if ( !ALLOC( outline, sizeof ( *outline ) ) ) + { + outline->memory = memory; + *aoutline = outline; + } + + return error; + } + + + /*************************************************************************/ + /* */ + /* */ + /* ah_outline_done */ + /* */ + /* */ + /* Destroys a given AH_Outline object. */ + /* */ + FT_LOCAL_DEF + void ah_outline_done( AH_Outline* outline ) + { + FT_Memory memory = outline->memory; + + + FREE( outline->horz_edges ); + FREE( outline->horz_segments ); + FREE( outline->contours ); + FREE( outline->points ); + + FREE( outline ); + } + + + /*************************************************************************/ + /* */ + /* */ + /* ah_outline_save */ + /* */ + /* */ + /* Saves the content of a given AH_Outline object into a face's glyph */ + /* slot. */ + /* */ + FT_LOCAL_DEF + void ah_outline_save( AH_Outline* outline, + AH_Loader* gloader ) + { + AH_Point* point = outline->points; + AH_Point* point_limit = point + outline->num_points; + FT_Vector* vec = gloader->current.outline.points; + char* tag = gloader->current.outline.tags; + + + /* we assume that the glyph loader has already been checked for storage */ + for ( ; point < point_limit; point++, vec++, tag++ ) + { + vec->x = point->x; + vec->y = point->y; + + if ( point->flags & ah_flah_conic ) + tag[0] = FT_Curve_Tag_Conic; + else if ( point->flags & ah_flah_cubic ) + tag[0] = FT_Curve_Tag_Cubic; + else + tag[0] = FT_Curve_Tag_On; + } + } + + + /*************************************************************************/ + /* */ + /* */ + /* ah_outline_load */ + /* */ + /* */ + /* Loads an unscaled outline from a glyph slot into an AH_Outline */ + /* object. */ + /* */ + FT_LOCAL_DEF + FT_Error ah_outline_load( AH_Outline* outline, + FT_Face face ) + { + FT_Memory memory = outline->memory; + FT_Error error = FT_Err_Ok; + FT_Outline* source = &face->glyph->outline; + FT_Int num_points = source->n_points; + FT_Int num_contours = source->n_contours; + AH_Point* points; + + + /* check arguments */ + if ( !face || + !face->size || + face->glyph->format != ft_glyph_format_outline ) + return FT_Err_Invalid_Argument; + + /* first of all, reallocate the contours array if necessary */ + if ( num_contours > outline->max_contours ) + { + FT_Int new_contours = ( num_contours + 3 ) & -4; + + + if ( REALLOC_ARRAY( outline->contours, outline->max_contours, + new_contours, AH_Point* ) ) + goto Exit; + + outline->max_contours = new_contours; + } + + /* then, reallocate the points, segments & edges arrays if needed -- */ + /* note that we reserved two additional point positions, used to */ + /* hint metrics appropriately */ + /* */ + if ( num_points + 2 > outline->max_points ) + { + FT_Int news = ( num_points + 2 + 7 ) & -8; + FT_Int max = outline->max_points; + + + if ( REALLOC_ARRAY( outline->points, + max, news, AH_Point ) || + REALLOC_ARRAY( outline->horz_edges, + max * 2, news * 2, AH_Edge ) || + REALLOC_ARRAY( outline->horz_segments, + max * 2, news * 2, AH_Segment ) ) + goto Exit; + + /* readjust some pointers */ + outline->vert_edges = outline->horz_edges + news; + outline->vert_segments = outline->horz_segments + news; + outline->max_points = news; + } + + outline->num_points = num_points; + outline->num_contours = num_contours; + + outline->num_hedges = 0; + outline->num_vedges = 0; + outline->num_hsegments = 0; + outline->num_vsegments = 0; + +#if 1 + + /* 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. */ + /* */ + outline->vert_major_dir = ah_dir_up; + outline->horz_major_dir = ah_dir_left; + + if ( ah_get_orientation( source ) > 1 ) + { + outline->vert_major_dir = ah_dir_down; + outline->horz_major_dir = ah_dir_right; + } + +#else + + /* Compute the vertical and horizontal major directions; this is */ + /* currently done by inspecting the `ft_outline_reverse_fill' flag. */ + /* However, some fonts have improper glyphs, and it'd be a good idea */ + /* to be able to re-compute these values on the fly. */ + outline->vert_major_dir = ah_dir_up; + outline->horz_major_dir = ah_dir_left; + + if ( source->flags & ft_outline_reverse_fill ) + { + outline->vert_major_dir = ah_dir_down; + outline->horz_major_dir = ah_dir_right; + } + +#endif /* 1 */ + + outline->x_scale = face->size->metrics.x_scale; + outline->y_scale = face->size->metrics.y_scale; + + points = outline->points; + if ( outline->num_points == 0 ) + goto Exit; + + { + /* do one thing at a time -- it is easier to understand, and */ + /* the code is clearer */ + AH_Point* point; + AH_Point* point_limit = points + outline->num_points; + + + /* compute coordinates */ + { + FT_Vector* vec = source->points; + FT_Fixed x_scale = outline->x_scale; + FT_Fixed y_scale = outline->y_scale; + + + for ( point = points; point < point_limit; vec++, point++ ) + { + point->fx = vec->x; + point->fy = vec->y; + point->ox = point->x = FT_MulFix( vec->x, x_scale ); + point->oy = point->y = FT_MulFix( vec->y, y_scale ); + + point->flags = 0; + } + } + + /* compute Bezier flags */ + { + char* tag = source->tags; + + + for ( point = points; point < point_limit; point++, tag++ ) + { + switch ( FT_CURVE_TAG( *tag ) ) + { + case FT_Curve_Tag_Conic: + point->flags = ah_flah_conic; break; + case FT_Curve_Tag_Cubic: + point->flags = ah_flah_cubic; break; + default: + ; + } + } + } + + /* compute `next' and `prev' */ + { + FT_Int contour_index; + AH_Point* prev; + AH_Point* first; + AH_Point* end; + + + contour_index = 0; + + first = points; + end = points + source->contours[0]; + prev = end; + + for ( point = points; point < point_limit; point++ ) + { + point->prev = prev; + if ( point < end ) + { + point->next = point + 1; + prev = point; + } + else + { + point->next = first; + contour_index++; + if ( point + 1 < point_limit ) + { + end = points + source->contours[contour_index]; + first = point + 1; + prev = end; + } + } + } + } + + /* set-up the contours array */ + { + AH_Point** contour = outline->contours; + AH_Point** contour_limit = contour + outline->num_contours; + short* end = source->contours; + short index = 0; + + + for ( ; contour < contour_limit; contour++, end++ ) + { + contour[0] = points + index; + index = end[0] + 1; + } + } + + /* compute directions of in & out vectors */ + { + for ( point = points; point < point_limit; point++ ) + { + AH_Point* prev; + AH_Point* next; + FT_Vector vec; + + + prev = point->prev; + vec.x = point->fx - prev->fx; + vec.y = point->fy - prev->fy; + + point->in_dir = ah_compute_direction( vec.x, vec.y ); + +#ifndef AH_OPTION_NO_WEAK_INTERPOLATION + point->in_angle = ah_angle( &vec ); +#endif + + next = point->next; + vec.x = next->fx - point->fx; + vec.y = next->fy - point->fy; + + point->out_dir = ah_compute_direction( vec.x, vec.y ); + +#ifndef AH_OPTION_NO_WEAK_INTERPOLATION + point->out_angle = ah_angle( &vec ); + + { + AH_Angle delta = point->in_angle - point->out_angle; + + + if ( delta < 0 ) + delta = -delta; + if ( delta < 2 ) + point->flags |= ah_flah_weak_interpolation; + } + +#if 0 + if ( point->flags & ( ah_flah_conic | ah_flah_cubic ) ) + point->flags |= ah_flah_weak_interpolation; +#endif + +#endif /* !AH_OPTION_NO_WEAK_INTERPOLATION */ + +#ifdef AH_OPTION_NO_STRONG_INTERPOLATION + point->flags |= ah_flah_weak_interpolation; +#endif + } + } + } + + Exit: + return error; + } + + + FT_LOCAL_DEF + void ah_setup_uv( AH_Outline* outline, + AH_UV source ) + { + AH_Point* point = outline->points; + AH_Point* point_limit = point + outline->num_points; + + + for ( ; point < point_limit; point++ ) + { + FT_Pos u, v; + + + switch ( source ) + { + case ah_uv_fxy: + u = point->fx; + v = point->fy; + break; + case ah_uv_fyx: + u = point->fy; + v = point->fx; + break; + case ah_uv_oxy: + u = point->ox; + v = point->oy; + break; + case ah_uv_oyx: + u = point->oy; + v = point->ox; + break; + case ah_uv_yx: + u = point->y; + v = point->x; + break; + case ah_uv_ox: + u = point->x; + v = point->ox; + break; + case ah_uv_oy: + u = point->y; + v = point->oy; + break; + default: + u = point->x; + v = point->y; + break; + } + point->u = u; + point->v = v; + } + } + + + FT_LOCAL_DEF + void ah_outline_compute_segments( AH_Outline* outline ) + { + int dimension; + AH_Segment* segments; + FT_Int* p_num_segments; + AH_Direction segment_dir; + AH_Direction major_dir; + + + segments = outline->horz_segments; + p_num_segments = &outline->num_hsegments; + major_dir = ah_dir_right; /* This value must be positive! */ + segment_dir = major_dir; + + /* set up (u,v) in each point */ + ah_setup_uv( outline, ah_uv_fyx ); + + for ( dimension = 1; dimension >= 0; dimension-- ) + { + AH_Point** contour = outline->contours; + AH_Point** contour_limit = contour + outline->num_contours; + AH_Segment* segment = segments; + FT_Int num_segments = 0; + +#ifdef AH_HINT_METRICS + AH_Point* min_point = 0; + AH_Point* max_point = 0; + FT_Pos min_coord = 32000; + FT_Pos max_coord = -32000; +#endif + + + /* do each contour separately */ + for ( ; contour < contour_limit; contour++ ) + { + AH_Point* point = contour[0]; + AH_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; + + +#ifdef AH_HINT_METRICS + if ( point->u < min_coord ) + { + min_coord = point->u; + min_point = point; + } + if ( point->u > max_coord ) + { + max_coord = point->u; + max_point = point; + } +#endif + + if ( point == last ) /* skip singletons -- just in case? */ + continue; + + if ( ABS( last->out_dir ) == major_dir && + ABS( point->out_dir ) == major_dir ) + { + /* we are already on an edge, try to locate its start */ + last = point; + + for (;;) + { + point = point->prev; + if ( 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 = ( 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 ) & + ah_flah_control ) + segment->flags |= ah_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 = min_pos; + segment->max_coord = max_pos; + + on_edge = 0; + num_segments++; + segment++; + /* fallthrough */ + } + } + + /* now exit if we are at the start/end point */ + if ( point == last ) + { + if ( passed ) + break; + passed = 1; + } + + if ( !on_edge && ABS( point->out_dir ) == major_dir ) + { + /* this is the start of a new segment! */ + segment_dir = point->out_dir; + + /* clear all segment fields */ + memset( segment, 0, sizeof ( *segment ) ); + + segment->dir = segment_dir; + segment->flags = ah_edge_normal; + min_pos = max_pos = point->u; + segment->first = point; + segment->last = point; + segment->contour = contour; + on_edge = 1; + +#ifdef AH_HINT_METRICS + if ( point == max_point ) + max_point = 0; + + if ( point == min_point ) + min_point = 0; +#endif + } + + point = point->next; + } + + } /* contours */ + +#ifdef AH_HINT_METRICS + /* we need to ensure that there are edges on the left-most and */ + /* right-most points of the glyph in order to hint the metrics; */ + /* we do this by inserting fake segments when needed */ + if ( dimension == 0 ) + { + AH_Point* point = outline->points; + AH_Point* point_limit = point + outline->num_points; + + FT_Pos min_pos = 32000; + FT_Pos max_pos = -32000; + + + min_point = 0; + max_point = 0; + + /* compute minimum and maximum points */ + for ( ; point < point_limit; point++ ) + { + FT_Pos x = point->fx; + + + if ( x < min_pos ) + { + min_pos = x; + min_point = point; + } + if ( x > max_pos ) + { + max_pos = x; + max_point = point; + } + } + + /* insert minimum segment */ + if ( min_point ) + { + /* clear all segment fields */ + memset( segment, 0, sizeof ( *segment ) ); + + segment->dir = segment_dir; + segment->flags = ah_edge_normal; + segment->first = min_point; + segment->last = min_point; + segment->pos = min_pos; + + num_segments++; + segment++; + } + + /* insert maximum segment */ + if ( max_point ) + { + /* clear all segment fields */ + memset( segment, 0, sizeof ( *segment ) ); + + segment->dir = segment_dir; + segment->flags = ah_edge_normal; + segment->first = max_point; + segment->last = max_point; + segment->pos = max_pos; + + num_segments++; + segment++; + } + } +#endif /* AH_HINT_METRICS */ + + *p_num_segments = num_segments; + + segments = outline->vert_segments; + major_dir = ah_dir_up; + p_num_segments = &outline->num_vsegments; + ah_setup_uv( outline, ah_uv_fxy ); + } + } + + + FT_LOCAL_DEF + void ah_outline_link_segments( AH_Outline* outline ) + { + AH_Segment* segments; + AH_Segment* segment_limit; + int dimension; + + + ah_setup_uv( outline, ah_uv_fyx ); + + segments = outline->horz_segments; + segment_limit = segments + outline->num_hsegments; + + for ( dimension = 1; dimension >= 0; dimension-- ) + { + AH_Segment* seg1; + AH_Segment* seg2; + + + /* now compare each segment to the others */ + for ( seg1 = segments; seg1 < segment_limit; seg1++ ) + { + FT_Pos best_score = 32000; + AH_Segment* best_segment = 0; + + + /* the fake segments are introduced to hint the metrics -- */ + /* we must never link them to anything */ + if ( seg1->first == seg1->last ) + continue; + + for ( seg2 = segments; seg2 < segment_limit; seg2++ ) + if ( seg1 != seg2 && seg1->dir + seg2->dir == 0 ) + { + FT_Pos pos1 = seg1->pos; + FT_Pos pos2 = seg2->pos; + FT_Bool is_dir; + FT_Bool is_pos; + + + /* check that the segments are correctly oriented and */ + /* positioned to form a black distance */ + + is_dir = ( seg1->dir == outline->horz_major_dir || + seg1->dir == outline->vert_major_dir ); + is_pos = pos1 > pos2; + + if ( pos1 == pos2 || !(is_dir ^ is_pos) ) + continue; + + /* Check the two segments. We now have a better algorithm */ + /* that doesn't rely on the segment points themselves but */ + /* on their relative position. This gets rids of many */ + /* unpleasant artefacts and incorrect stem/serifs */ + /* computations. */ + + /* first of all, compute the size of the `common' height */ + { + FT_Pos min = seg1->min_coord; + FT_Pos max = seg1->max_coord; + FT_Pos len, score; + FT_Pos size1, size2; + + + size1 = max - min; + size2 = seg2->max_coord - seg2->min_coord; + + if ( min < seg2->min_coord ) + min = seg2->min_coord; + + if ( max < seg2->max_coord ) + max = seg2->max_coord; + + len = max - min; + score = seg2->pos - seg1->pos; + if ( score < 0 ) + score = -score; + + /* before comparing the scores, take care that the segments */ + /* are really facing each other (often not for italics..) */ + if ( 4 * len >= size1 && 4 * len >= size2 ) + if ( score < best_score ) + { + best_score = score; + best_segment = seg2; + } + } + } + + if ( best_segment ) + { + seg1->link = best_segment; + seg1->score = best_score; + + best_segment->num_linked++; + } + + + } /* edges 1 */ + + /* now, compute the `serif' segments */ + for ( seg1 = segments; seg1 < segment_limit; seg1++ ) + { + seg2 = seg1->link; + + if ( seg2 && seg2->link != seg1 ) + { + seg1->link = 0; + seg1->serif = seg2->link; + } + } + + ah_setup_uv( outline, ah_uv_fxy ); + + segments = outline->vert_segments; + segment_limit = segments + outline->num_vsegments; + } + } + + +#ifdef AH_DEBUG_GLYPH + + /* A function used to dump the array of linked segments */ + void ah_dump_segments( AH_Outline* outline ) + { + AH_Segment* segments; + AH_Segment* segment_limit; + AH_Point* points; + FT_Int dimension; + + + points = outline->points; + segments = outline->horz_segments; + segment_limit = segments + outline->num_hsegments; + + for ( dimension = 1; dimension >= 0; dimension-- ) + { + AH_Segment* seg; + + + printf ( "Table of %s segments:\n", + !dimension ? "vertical" : "horizontal" ); + printf ( " [ index | pos | dir | link | serif |" + " numl | first | start ]\n" ); + + for ( seg = segments; seg < segment_limit; seg++ ) + { + printf ( " [ %5d | %4d | %5s | %4d | %5d | %4d | %5d | %5d ]\n", + seg - segments, + (int)seg->pos, + seg->dir == ah_dir_up + ? "up" + : ( seg->dir == ah_dir_down + ? "down" + : ( seg->dir == ah_dir_left + ? "left" + : ( seg->dir == ah_dir_right + ? "right" + : "none" ) ) ), + seg->link ? (seg->link-segments) : -1, + seg->serif ? (seg->serif-segments) : -1, + (int)seg->num_linked, + seg->first - points, + seg->last - points ); + } + + segments = outline->vert_segments; + segment_limit = segments + outline->num_vsegments; + } + } + +#endif /* AH_DEBUG_GLYPH */ + + + static + void ah_outline_compute_edges( AH_Outline* outline ) + { + AH_Edge* edges; + AH_Segment* segments; + AH_Segment* segment_limit; + AH_Direction up_dir; + FT_Int* p_num_edges; + FT_Int dimension; + FT_Fixed scale; + FT_Pos edge_distance_threshold; + + + edges = outline->horz_edges; + segments = outline->horz_segments; + segment_limit = segments + outline->num_hsegments; + p_num_edges = &outline->num_hedges; + up_dir = ah_dir_right; + scale = outline->y_scale; + + for ( dimension = 1; dimension >= 0; dimension-- ) + { + AH_Edge* edge; + AH_Edge* edge_limit; /* really == edge + num_edges */ + AH_Segment* seg; + + + /*********************************************************************/ + /* */ + /* 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( outline->edge_distance_threshold, + scale ); + if ( edge_distance_threshold > 64 / 4 ) + edge_distance_threshold = 64 / 4; + + edge_limit = edges; + for ( seg = segments; seg < segment_limit; seg++ ) + { + AH_Edge* found = 0; + + + /* look for an edge corresponding to the segment */ + for ( edge = edges; edge < edge_limit; edge++ ) + { + FT_Pos dist; + + + dist = seg->pos - edge->fpos; + if ( dist < 0 ) + dist = -dist; + + dist = FT_MulFix( dist, scale ); + if ( dist < edge_distance_threshold ) + { + found = edge; + break; + } + } + + if ( !found ) + { + /* insert a new edge in the list and */ + /* sort according to the position */ + while ( edge > edges && edge[-1].fpos > seg->pos ) + { + edge[0] = edge[-1]; + edge--; + } + edge_limit++; + + /* clear all edge fields */ + memset( edge, 0, sizeof ( *edge ) ); + + /* add the segment to the new edge's list */ + edge->first = seg; + edge->last = seg; + edge->fpos = seg->pos; + 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 = edge->first; + edge->last->edge_next = seg; + edge->last = seg; + } + } + + *p_num_edges = edge_limit - edges; + + + /*********************************************************************/ + /* */ + /* 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, straigth 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 */ + 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++ ) + { + int is_round = 0; /* does it contain round segments? */ + int is_straight = 0; /* does it contain straight segments? */ + int ups = 0; /* number of upwards segments */ + int downs = 0; /* number of downwards segments */ + + + seg = edge->first; + + do + { + FT_Bool is_serif; + + + /* check for roundness of segment */ + if ( seg->flags & ah_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 = seg->serif && seg->serif->edge != edge; + + if ( seg->link || is_serif ) + { + AH_Edge* edge2; + AH_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; + else + edge->link = edge2; + } + + seg = seg->edge_next; + + } while ( seg != edge->first ); + + /* set the round/straight flags */ + edge->flags = ah_edge_normal; + + if ( is_straight == 0 && is_round ) + edge->flags |= ah_edge_round; + + /* set the edge's main direction */ + edge->dir = ah_dir_none; + + if ( ups > downs ) + edge->dir = up_dir; + + else if ( ups < downs ) + edge->dir = - up_dir; + + else if ( ups == downs ) + edge->dir = 0; /* both up and down !! */ + + /* 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; + } + + edges = outline->vert_edges; + segments = outline->vert_segments; + segment_limit = segments + outline->num_vsegments; + p_num_edges = &outline->num_vedges; + up_dir = ah_dir_up; + scale = outline->x_scale; + } + } + + + /*************************************************************************/ + /* */ + /* */ + /* ah_outline_detect_features */ + /* */ + /* */ + /* Performs feature detection on a given AH_Outline object. */ + /* */ + FT_LOCAL_DEF + void ah_outline_detect_features( AH_Outline* outline ) + { + ah_outline_compute_segments( outline ); + ah_outline_link_segments ( outline ); + ah_outline_compute_edges ( outline ); + } + + + /*************************************************************************/ + /* */ + /* */ + /* ah_outline_compute_blue_edges */ + /* */ + /* */ + /* Computes the `blue edges' in a given outline (i.e. those that must */ + /* be snapped to a blue zone edge (top or bottom). */ + /* */ + FT_LOCAL_DEF + void ah_outline_compute_blue_edges( AH_Outline* outline, + AH_Face_Globals* face_globals ) + { + AH_Edge* edge = outline->horz_edges; + AH_Edge* edge_limit = edge + outline->num_hedges; + AH_Globals* globals = &face_globals->design; + FT_Fixed y_scale = outline->y_scale; + + + /* compute for each horizontal edge, which blue zone is closer */ + for ( ; edge < edge_limit; edge++ ) + { + AH_Blue blue; + FT_Pos* best_blue = 0; + FT_Pos best_dist; /* initial threshold */ + + + /* compute the initial threshold as a fraction of the EM size */ + best_dist = FT_MulFix( face_globals->face->units_per_EM / 40, y_scale ); + if ( best_dist > 64 / 4 ) + best_dist = 64 / 4; + + for ( blue = ah_blue_capital_top; blue < ah_blue_max; blue++ ) + { + /* 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 XXX */ + FT_Bool is_top_blue = AH_IS_TOP_BLUE( blue ); + FT_Bool is_major_dir = edge->dir == outline->horz_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; + FT_Pos* blue_pos = globals->blue_refs + blue; + + + /* first of all, compare it to the reference position */ + dist = edge->fpos - *blue_pos; + if ( dist < 0 ) + dist = -dist; + + dist = FT_MulFix( dist, y_scale ); + if ( dist < best_dist ) + { + best_dist = dist; + best_blue = blue_pos; + } + + /* 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 & ah_edge_round && dist != 0 ) + { + FT_Bool is_under_ref = edge->fpos < *blue_pos; + + + if ( is_top_blue ^ is_under_ref ) + { + blue_pos = globals->blue_shoots + blue; + dist = edge->fpos - *blue_pos; + if ( dist < 0 ) + dist = -dist; + + dist = FT_MulFix( dist, y_scale ); + if ( dist < best_dist ) + { + best_dist = dist; + best_blue = blue_pos; + } + } + } + } + } + + if ( best_blue ) + edge->blue_edge = best_blue; + } + } + + + /*************************************************************************/ + /* */ + /* */ + /* ah_outline_scale_blue_edges */ + /* */ + /* */ + /* This functions must be called before hinting in order to re-adjust */ + /* the contents of the detected edges (basically change the `blue */ + /* edge' pointer from `design units' to `scaled ones'). */ + /* */ + FT_LOCAL_DEF + void ah_outline_scale_blue_edges( AH_Outline* outline, + AH_Face_Globals* globals ) + { + AH_Edge* edge = outline->horz_edges; + AH_Edge* edge_limit = edge + outline->num_hedges; + FT_Int delta; + + + delta = globals->scaled.blue_refs - globals->design.blue_refs; + + for ( ; edge < edge_limit; edge++ ) + { + if ( edge->blue_edge ) + edge->blue_edge += delta; + } + } + + +#ifdef AH_DEBUG_GLYPH + + void ah_dump_edges( AH_Outline* outline ) + { + AH_Edge* edges; + AH_Edge* edge_limit; + AH_Segment* segments; + FT_Int dimension; + + + edges = outline->horz_edges; + edge_limit = edges + outline->num_hedges; + segments = outline->horz_segments; + + for ( dimension = 1; dimension >= 0; dimension-- ) + { + AH_Edge* edge; + + + printf ( "Table of %s edges:\n", + !dimension ? "vertical" : "horizontal" ); + printf ( " [ index | pos | dir | link |" + " serif | blue | opos | pos ]\n" ); + + for ( edge = edges; edge < edge_limit; edge++ ) + { + printf ( " [ %5d | %4d | %5s | %4d | %5d | %c | %5.2f | %5.2f ]\n", + edge - edges, + (int)edge->fpos, + edge->dir == ah_dir_up + ? "up" + : ( edge->dir == ah_dir_down + ? "down" + : ( edge->dir == ah_dir_left + ? "left" + : ( edge->dir == ah_dir_right + ? "right" + : "none" ) ) ), + edge->link ? ( edge->link - edges ) : -1, + edge->serif ? ( edge->serif - edges ) : -1, + edge->blue_edge ? 'y' : 'n', + edge->opos / 64.0, + edge->pos / 64.0 ); + } + + edges = outline->vert_edges; + edge_limit = edges + outline->num_vedges; + segments = outline->vert_segments; + } + } + +#endif /* AH_DEBUG_GLYPH */ + + +/* END */ Index: xc/extras/freetype2/src/autohint/ahglyph.h diff -u /dev/null xc/extras/freetype2/src/autohint/ahglyph.h:1.1.1.1 --- /dev/null Mon Dec 18 14:22:34 2000 +++ xc/extras/freetype2/src/autohint/ahglyph.h Fri Dec 8 16:26:19 2000 @@ -0,0 +1,103 @@ +/***************************************************************************/ +/* */ +/* ahglyph.h */ +/* */ +/* Routines used to load and analyze a given glyph before hinting */ +/* (specification). */ +/* */ +/* Copyright 2000 Catharon Productions Inc. */ +/* Author: David Turner */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#ifndef AHGLYPH_H +#define AHGLYPH_H + +#ifdef FT_FLAT_COMPILE + +#include "ahtypes.h" + +#else + +#include + +#endif + + +#ifdef __cplusplus + extern "C" { +#endif + + + typedef enum AH_UV_ + { + ah_uv_fxy, + ah_uv_fyx, + ah_uv_oxy, + ah_uv_oyx, + ah_uv_ox, + ah_uv_oy, + ah_uv_yx, + ah_uv_xy /* should always be last! */ + + } AH_UV; + + + FT_LOCAL + void ah_setup_uv( AH_Outline* outline, + AH_UV source ); + + + /* AH_Outline functions - they should be typically called in this order */ + + FT_LOCAL + FT_Error ah_outline_new( FT_Memory memory, + AH_Outline** aoutline ); + + FT_LOCAL + FT_Error ah_outline_load( AH_Outline* outline, + FT_Face face ); + + FT_LOCAL + void ah_outline_compute_segments( AH_Outline* outline ); + + FT_LOCAL + void ah_outline_link_segments( AH_Outline* outline ); + + FT_LOCAL + void ah_outline_detect_features( AH_Outline* outline ); + + FT_LOCAL + void ah_outline_compute_blue_edges( AH_Outline* outline, + AH_Face_Globals* globals ); + + FT_LOCAL + void ah_outline_scale_blue_edges( AH_Outline* outline, + AH_Face_Globals* globals ); + + FT_LOCAL + void ah_outline_save( AH_Outline* outline, AH_Loader* loader ); + + FT_LOCAL + void ah_outline_done( AH_Outline* outline ); + + +#ifdef __cplusplus + } +#endif + + +#endif /* AHGLYPH_H */ + + +/* END */ Index: xc/extras/freetype2/src/autohint/ahhint.c diff -u /dev/null xc/extras/freetype2/src/autohint/ahhint.c:1.1.1.1 --- /dev/null Mon Dec 18 14:22:34 2000 +++ xc/extras/freetype2/src/autohint/ahhint.c Fri Dec 8 16:26:19 2000 @@ -0,0 +1,1441 @@ +/***************************************************************************/ +/* */ +/* ahhint.c */ +/* */ +/* Glyph hinter (body). */ +/* */ +/* Copyright 2000 Catharon Productions Inc. */ +/* Author: David Turner */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#ifdef FT_FLAT_COMPILE + +#include "ahhint.h" +#include "ahglyph.h" +#include "ahangles.h" + +#else + +#include +#include +#include + +#endif + +#include + + +#define FACE_GLOBALS( face ) ((AH_Face_Globals*)(face)->autohint.data) + +#define AH_USE_IUP + + + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** Hinting routines ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + + + static int disable_horz_edges = 0; + static int disable_vert_edges = 0; + + + /* snap a given width in scaled coordinates to one of the */ + /* current standard widths */ + static + FT_Pos ah_snap_width( FT_Pos* widths, + FT_Int count, + FT_Pos width ) + { + int n; + FT_Pos best = 64 + 32 + 2; + FT_Pos reference = width; + + + for ( n = 0; n < count; n++ ) + { + FT_Pos w; + FT_Pos dist; + + + w = widths[n]; + 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; + } + + + /* align one stem edge relative to the previous stem edge */ + static + void ah_align_linked_edge( AH_Hinter* hinter, + AH_Edge* base_edge, + AH_Edge* stem_edge, + int vertical ) + { + FT_Pos dist = stem_edge->opos - base_edge->opos; + AH_Globals* globals = &hinter->globals->scaled; + FT_Pos sign = 1; + + + if ( dist < 0 ) + { + dist = -dist; + sign = -1; + } + + if ( vertical ) + { + dist = ah_snap_width( globals->heights, globals->num_heights, dist ); + + /* in the case of vertical hinting, always round */ + /* the stem heights to integer pixels */ + if ( dist >= 64 ) + dist = ( dist + 16 ) & -64; + else + dist = 64; + } + else + { + dist = ah_snap_width( globals->widths, globals->num_widths, dist ); + + if ( hinter->flags & ah_hinter_monochrome ) + { + /* monochrome horizontal hinting: snap widths to integer pixels */ + /* with a different threshold */ + if ( dist < 64 ) + dist = 64; + else + dist = ( dist + 32 ) & -64; + } + 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 + 42 ) & -64; + } + } + + stem_edge->pos = base_edge->pos + sign * dist; + } + + + static + void ah_align_serif_edge( AH_Hinter* hinter, + AH_Edge* base, + AH_Edge* serif ) + { + FT_Pos dist; + FT_Pos sign = 1; + + UNUSED( hinter ); + + + dist = serif->opos - base->opos; + if ( dist < 0 ) + { + dist = -dist; + sign = -1; + } + + /* do not strengthen serifs */ + if ( base->flags & ah_edge_done ) + { + if ( dist > 64 ) + dist = ( dist + 16 ) & -64; + + else if ( dist <= 32 ) + dist = ( dist + 33 ) >> 1; + } + + serif->pos = base->pos + sign * dist; + } + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** E D G E H I N T I N G ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /* Another alternative edge hinting algorithm */ + static + void ah_hint_edges_3( AH_Hinter* hinter ) + { + AH_Edge* edges; + AH_Edge* edge_limit; + AH_Outline* outline = hinter->glyph; + FT_Int dimension; + + + edges = outline->horz_edges; + edge_limit = edges + outline->num_hedges; + + for ( dimension = 1; dimension >= 0; dimension-- ) + { + AH_Edge* edge; + AH_Edge* before = 0; + AH_Edge* after = 0; + AH_Edge* anchor = 0; + int has_serifs = 0; + + + if ( disable_vert_edges && !dimension ) + goto Next_Dimension; + + if ( disable_horz_edges && dimension ) + goto Next_Dimension; + + /* we begin by aligning all stems relative to the blue zone */ + /* if needed -- that's only for horizontal edges */ + if ( dimension ) + { + for ( edge = edges; edge < edge_limit; edge++ ) + { + FT_Pos* blue; + AH_Edge *edge1, *edge2; + + + if ( edge->flags & ah_edge_done ) + continue; + + blue = edge->blue_edge; + edge1 = 0; + edge2 = edge->link; + + if ( blue ) + { + edge1 = edge; + } + else if (edge2 && edge2->blue_edge) + { + blue = edge2->blue_edge; + edge1 = edge2; + edge2 = edge; + } + + if ( !edge1 ) + continue; + + edge1->pos = blue[0]; + edge1->flags |= ah_edge_done; + + if ( edge2 && !edge2->blue_edge ) + { + ah_align_linked_edge( hinter, edge1, edge2, dimension ); + edge2->flags |= ah_edge_done; + } + + if ( !anchor ) + anchor = edge; + } + } + + /* now, we will align all stem edges, trying to maintain the */ + /* relative order of stems in the glyph.. */ + before = 0; + after = 0; + for ( edge = edges; edge < edge_limit; edge++ ) + { + AH_Edge *edge2; + + + if ( edge->flags & ah_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 || edge2 < edge ) + { + +#if 0 + printf( "strange blue alignement, edge %d to %d\n", + edge - edges, edge2 - edges ); +#endif + + ah_align_linked_edge( hinter, edge2, edge, dimension ); + edge->flags |= ah_edge_done; + continue; + } + + { + FT_Bool min = 0; + FT_Pos delta; + + if ( !anchor ) + { + edge->pos = ( edge->opos + 32 ) & -64; + anchor = edge; + } + else + edge->pos = anchor->pos + + ( ( edge->opos - anchor->opos + 32 ) & -64 ); + + edge->flags |= ah_edge_done; + + if ( edge > edges && edge->pos < edge[-1].pos ) + { + edge->pos = edge[-1].pos; + min = 1; + } + + ah_align_linked_edge( hinter, edge, edge2, dimension ); + delta = 0; + if ( edge2 + 1 < edge_limit && + edge2[1].flags & ah_edge_done ) + delta = edge2[1].pos - edge2->pos; + + if ( delta < 0 ) + { + edge2->pos += delta; + if ( !min ) + edge->pos += delta; + } + edge2->flags |= ah_edge_done; + } + } + + if ( !has_serifs ) + goto Next_Dimension; + + /* now, hint the remaining edges (serifs and single) in order */ + /* to complete our processing */ + for ( edge = edges; edge < edge_limit; edge++ ) + { + if ( edge->flags & ah_edge_done ) + continue; + + if ( edge->serif ) + { + ah_align_serif_edge( hinter, edge->serif, edge ); + } + else if ( !anchor ) + { + edge->pos = ( edge->opos + 32 ) & -64; + anchor = edge; + } + else + edge->pos = anchor->pos + + ( ( edge->opos-anchor->opos + 32 ) & -64 ); + + edge->flags |= ah_edge_done; + + if ( edge > edges && edge->pos < edge[-1].pos ) + edge->pos = edge[-1].pos; + + if ( edge + 1 < edge_limit && + edge[1].flags & ah_edge_done && + edge->pos > edge[1].pos ) + edge->pos = edge[1].pos; + } + + Next_Dimension: + edges = outline->vert_edges; + edge_limit = edges + outline->num_vedges; + } + } + + + FT_LOCAL_DEF + void ah_hinter_hint_edges( AH_Hinter* hinter, + int no_horz_edges, + int no_vert_edges ) + { + disable_horz_edges = no_horz_edges; + disable_vert_edges = no_vert_edges; + + /* AH_Interpolate_Blue_Edges( hinter ); -- doesn't seem to help */ + /* reduce the problem of the disappearing eye in the `e' of Times... */ + /* also, creates some artifacts near the blue zones? */ + { + ah_hint_edges_3( hinter ); + +#if 0 + /* outline optimizer removed temporarily */ + if ( hinter->flags & ah_hinter_optimize ) + { + AH_Optimizer opt; + + + if ( !AH_Optimizer_Init( &opt, hinter->glyph, hinter->memory ) ) + { + AH_Optimizer_Compute( &opt ); + AH_Optimizer_Done( &opt ); + } + } +#endif + + } + } + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** P O I N T H I N T I N G ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + static + void ah_hinter_align_edge_points( AH_Hinter* hinter ) + { + AH_Outline* outline = hinter->glyph; + AH_Edge* edges; + AH_Edge* edge_limit; + FT_Int dimension; + + + edges = outline->horz_edges; + edge_limit = edges + outline->num_hedges; + + for ( dimension = 1; dimension >= 0; dimension-- ) + { + AH_Edge* edge; + AH_Edge* before; + AH_Edge* after; + + + before = 0; + after = 0; + + edge = edges; + for ( ; edge < edge_limit; edge++ ) + { + /* move the points of each segment */ + /* in each edge to the edge's position */ + AH_Segment* seg = edge->first; + + + do + { + AH_Point* point = seg->first; + + + for (;;) + { + if ( dimension ) + { + point->y = edge->pos; + point->flags |= ah_flah_touch_y; + } + else + { + point->x = edge->pos; + point->flags |= ah_flah_touch_x; + } + + if ( point == seg->last ) + break; + + point = point->next; + } + + seg = seg->edge_next; + + } while ( seg != edge->first ); + } + + edges = outline->vert_edges; + edge_limit = edges + outline->num_vedges; + } + } + + + /* hint the strong points -- this is equivalent to the TrueType `IP' */ + static + void ah_hinter_align_strong_points( AH_Hinter* hinter ) + { + AH_Outline* outline = hinter->glyph; + FT_Int dimension; + AH_Edge* edges; + AH_Edge* edge_limit; + AH_Point* points; + AH_Point* point_limit; + AH_Flags touch_flag; + + + points = outline->points; + point_limit = points + outline->num_points; + + edges = outline->horz_edges; + edge_limit = edges + outline->num_hedges; + touch_flag = ah_flah_touch_y; + + for ( dimension = 1; dimension >= 0; dimension-- ) + { + AH_Point* point; + AH_Edge* edge; + + + if ( edges < edge_limit ) + for ( point = points; point < point_limit; point++ ) + { + FT_Pos u, ou, fu; /* point position */ + FT_Pos delta; + + + if ( point->flags & touch_flag ) + continue; + +#ifndef AH_OPTION_NO_WEAK_INTERPOLATION + /* if this point is candidate to weak interpolation, we will */ + /* interpolate it after all strong points have been processed */ + if ( point->flags & ah_flah_weak_interpolation ) + continue; +#endif + + if ( dimension ) + { + 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; + } + + /* otherwise, interpolate the point in between */ + { + AH_Edge* before = 0; + AH_Edge* after = 0; + + + for ( edge = edges; edge < edge_limit; edge++ ) + { + if ( u == edge->fpos ) + { + u = edge->pos; + goto Store_Point; + } + if ( u < edge->fpos ) + break; + before = edge; + } + + for ( edge = edge_limit - 1; edge >= edges; edge-- ) + { + if ( u == edge->fpos ) + { + u = edge->pos; + goto Store_Point; + } + if ( u > edge->fpos ) + break; + after = edge; + } + + /* assert( before && after && before != after ) */ + u = before->pos + FT_MulDiv( fu - before->fpos, + after->pos - before->pos, + after->fpos - before->fpos ); + } + + Store_Point: + + /* save the point position */ + if ( dimension ) + point->y = u; + else + point->x = u; + + point->flags |= touch_flag; + } + + edges = outline->vert_edges; + edge_limit = edges + outline->num_vedges; + touch_flag = ah_flah_touch_x; + } + } + + +#ifndef AH_OPTION_NO_WEAK_INTERPOLATION + + static + void ah_iup_shift( AH_Point* p1, + AH_Point* p2, + AH_Point* ref ) + { + AH_Point* p; + FT_Pos delta = ref->u - ref->v; + + + 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 ah_iup_interp( AH_Point* p1, + AH_Point* p2, + AH_Point* ref1, + AH_Point* ref2 ) + { + AH_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; + } + } + } + + + /* interpolate weak points -- this is equivalent to the TrueType `IUP' */ + static + void ah_hinter_align_weak_points( AH_Hinter* hinter ) + { + AH_Outline* outline = hinter->glyph; + FT_Int dimension; + AH_Edge* edges; + AH_Edge* edge_limit; + AH_Point* points; + AH_Point* point_limit; + AH_Point** contour_limit; + AH_Flags touch_flag; + + + points = outline->points; + point_limit = points + outline->num_points; + + /* PASS 1: Move segment points to edge positions */ + + edges = outline->horz_edges; + edge_limit = edges + outline->num_hedges; + touch_flag = ah_flah_touch_y; + + contour_limit = outline->contours + outline->num_contours; + + ah_setup_uv( outline, ah_uv_oy ); + + for ( dimension = 1; dimension >= 0; dimension-- ) + { + AH_Point* point; + AH_Point* end_point; + AH_Point* first_point; + AH_Point** contour; + + + point = points; + contour = outline->contours; + + for ( ; contour < contour_limit; contour++ ) + { + point = *contour; + end_point = point->prev; + first_point = point; + + while ( point <= end_point && !( point->flags & touch_flag ) ) + point++; + + if ( point <= end_point ) + { + AH_Point* first_touched = point; + AH_Point* cur_touched = point; + + + point++; + while ( point <= end_point ) + { + if ( point->flags & touch_flag ) + { + /* we found two successive touched points; we interpolate */ + /* all contour points between them */ + ah_iup_interp( cur_touched + 1, point - 1, + cur_touched, point ); + cur_touched = point; + } + point++; + } + + if ( cur_touched == first_touched ) + { + /* this is a special case: only one point was touched in the */ + /* contour; we thus simply shift the whole contour */ + ah_iup_shift( first_point, end_point, cur_touched ); + } + else + { + /* now interpolate after the last touched point to the end */ + /* of the contour */ + ah_iup_interp( cur_touched + 1, end_point, + cur_touched, first_touched ); + + /* if the first contour point isn't touched, interpolate */ + /* from the contour start to the first touched point */ + if ( first_touched > points ) + ah_iup_interp( first_point, first_touched - 1, + cur_touched, first_touched ); + } + } + } + + /* now save the interpolated values back to x/y */ + if ( dimension ) + { + for ( point = points; point < point_limit; point++ ) + point->y = point->u; + + touch_flag = ah_flah_touch_x; + ah_setup_uv( outline, ah_uv_ox ); + } + else + { + for ( point = points; point < point_limit; point++ ) + point->x = point->u; + + break; /* exit loop */ + } + } + } + +#endif /* !AH_OPTION_NO_WEAK_INTERPOLATION */ + + + FT_LOCAL_DEF + void ah_hinter_align_points( AH_Hinter* hinter ) + { + ah_hinter_align_edge_points( hinter ); + +#ifndef AH_OPTION_NO_STRONG_INTERPOLATION + ah_hinter_align_strong_points( hinter ); +#endif + +#ifndef AH_OPTION_NO_WEAK_INTERPOLATION + ah_hinter_align_weak_points( hinter ); +#endif + } + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** H I N T E R O B J E C T M E T H O D S ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /* scale and fit the global metrics */ + static + void ah_hinter_scale_globals( AH_Hinter* hinter, + FT_Fixed x_scale, + FT_Fixed y_scale ) + { + FT_Int n; + AH_Face_Globals* globals = hinter->globals; + AH_Globals* design = &globals->design; + AH_Globals* scaled = &globals->scaled; + + + /* copy content */ + *scaled = *design; + + /* scale the standard widths & heights */ + for ( n = 0; n < design->num_widths; n++ ) + scaled->widths[n] = FT_MulFix( design->widths[n], x_scale ); + + for ( n = 0; n < design->num_heights; n++ ) + scaled->heights[n] = FT_MulFix( design->heights[n], y_scale ); + + /* scale the blue zones */ + for ( n = 0; n < ah_blue_max; n++ ) + { + FT_Pos delta, delta2; + + + delta = design->blue_shoots[n] - design->blue_refs[n]; + delta2 = delta; + if ( delta < 0 ) + delta2 = -delta2; + delta2 = FT_MulFix( delta2, y_scale ); + + if ( delta2 < 32 ) + delta2 = 0; + else if ( delta2 < 64 ) + delta2 = 32 + ( ( ( delta2 - 32 ) + 16 ) & -32 ); + else + delta2 = ( delta2 + 32 ) & -64; + + if ( delta < 0 ) + delta2 = -delta2; + + scaled->blue_refs[n] = + ( FT_MulFix( design->blue_refs[n], y_scale ) + 32 ) & -64; + scaled->blue_shoots[n] = scaled->blue_refs[n] + delta2; + } + + globals->x_scale = x_scale; + globals->y_scale = y_scale; + } + + + static + void ah_hinter_align( AH_Hinter* hinter ) + { + ah_hinter_align_edge_points( hinter ); + ah_hinter_align_points( hinter ); + } + + + /* finalize a hinter object */ + FT_LOCAL_DEF + void ah_hinter_done( AH_Hinter* hinter ) + { + if ( hinter ) + { + FT_Memory memory = hinter->memory; + + + ah_loader_done( hinter->loader ); + ah_outline_done( hinter->glyph ); + + /* note: the `globals' pointer is _not_ owned by the hinter */ + /* but by the current face object, we don't need to */ + /* release it */ + hinter->globals = 0; + hinter->face = 0; + + FREE( hinter ); + } + } + + + /* create a new empty hinter object */ + FT_LOCAL_DEF + FT_Error ah_hinter_new( FT_Library library, + AH_Hinter** ahinter ) + { + AH_Hinter* hinter = 0; + FT_Memory memory = library->memory; + FT_Error error; + + + *ahinter = 0; + + /* allocate object */ + if ( ALLOC( hinter, sizeof ( *hinter ) ) ) + goto Exit; + + hinter->memory = memory; + hinter->flags = 0; + + /* allocate outline and loader */ + error = ah_outline_new( memory, &hinter->glyph ) || + ah_loader_new ( memory, &hinter->loader ) || + ah_loader_create_extra( hinter->loader ); + if ( error ) + goto Exit; + + *ahinter = hinter; + + Exit: + if ( error ) + ah_hinter_done( hinter ); + + return error; + } + + + /* create a face's autohint globals */ + FT_LOCAL_DEF + FT_Error ah_hinter_new_face_globals( AH_Hinter* hinter, + FT_Face face, + AH_Globals* globals ) + { + FT_Error error; + FT_Memory memory = hinter->memory; + AH_Face_Globals* face_globals; + + + if ( ALLOC( face_globals, sizeof ( *face_globals ) ) ) + goto Exit; + + hinter->face = face; + hinter->globals = face_globals; + + if ( globals ) + face_globals->design = *globals; + else + ah_hinter_compute_globals( hinter ); + + face->autohint.data = face_globals; + face->autohint.finalizer = (FT_Generic_Finalizer) + ah_hinter_done_face_globals; + face_globals->face = face; + + Exit: + return error; + } + + + /* discard a face's autohint globals */ + FT_LOCAL_DEF + void ah_hinter_done_face_globals( AH_Face_Globals* globals ) + { + FT_Face face = globals->face; + FT_Memory memory = face->memory; + + + FREE( globals ); + } + + + static + FT_Error ah_hinter_load( AH_Hinter* hinter, + FT_UInt glyph_index, + FT_UInt load_flags, + FT_UInt depth ) + { + FT_Face face = hinter->face; + FT_GlyphSlot slot = face->glyph; + FT_Fixed x_scale = face->size->metrics.x_scale; + FT_Fixed y_scale = face->size->metrics.y_scale; + FT_Glyph_Metrics metrics; /* temporary metrics */ + FT_Error error; + AH_Outline* outline = hinter->glyph; + AH_Loader* gloader = hinter->loader; + FT_Bool no_horz_hints = + ( load_flags & AH_HINT_NO_HORZ_EDGES ) != 0; + FT_Bool no_vert_hints = + ( load_flags & AH_HINT_NO_VERT_EDGES ) != 0; + + + /* load the glyph */ + error = FT_Load_Glyph( face, glyph_index, load_flags ); + if ( error ) + goto Exit; + + /* save current glyph metrics */ + metrics = slot->metrics; + + /* set linear horizontal metrics */ + slot->linearHoriAdvance = slot->metrics.horiAdvance; + slot->linearVertAdvance = slot->metrics.vertAdvance; + + switch ( slot->format ) + { + case ft_glyph_format_outline: + + /* translate glyph outline if we need to */ + if ( hinter->transformed ) + { + FT_UInt n = slot->outline.n_points; + FT_Vector* point = slot->outline.points; + + + for ( ; n > 0; point++, n-- ) + { + point->x += hinter->trans_delta.x; + point->y += hinter->trans_delta.y; + } + } + + /* copy the outline points in the loader's current */ + /* extra points, which is used to keep original glyph coordinates */ + error = ah_loader_check_points( gloader, slot->outline.n_points + 2, + slot->outline.n_contours ); + if ( error ) + goto Exit; + + MEM_Copy( gloader->current.extra_points, slot->outline.points, + slot->outline.n_points * sizeof ( FT_Vector ) ); + + MEM_Copy( gloader->current.outline.contours, slot->outline.contours, + slot->outline.n_contours * sizeof ( short ) ); + + MEM_Copy( gloader->current.outline.tags, slot->outline.tags, + slot->outline.n_points * sizeof ( char ) ); + + gloader->current.outline.n_points = slot->outline.n_points; + gloader->current.outline.n_contours = slot->outline.n_contours; + + /* compute original phantom points */ + hinter->pp1.x = 0; + hinter->pp1.y = 0; + hinter->pp2.x = FT_MulFix( slot->metrics.horiAdvance, x_scale ); + hinter->pp2.y = 0; + + /* 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 */ + error = ah_outline_load( outline, face ); /* XXX: change to slot */ + if ( error ) + goto Exit; + + /* perform feature detection */ + ah_outline_detect_features( outline ); + + if ( !no_horz_hints ) + { + ah_outline_compute_blue_edges( outline, hinter->globals ); + ah_outline_scale_blue_edges( outline, hinter->globals ); + } + + /* perform alignment control */ + ah_hinter_hint_edges( hinter, no_horz_hints, no_vert_hints ); + ah_hinter_align( hinter ); + + /* now save the current outline into the loader's current table */ + ah_outline_save( outline, gloader ); + + /* we now need to hint the metrics according to the change in */ + /* width/positioning that occured during the hinting process */ + { + FT_Pos old_width, new_width; + FT_Pos old_advance, new_advance; + FT_Pos old_lsb, new_lsb; + AH_Edge* edge1 = outline->vert_edges; /* leftmost edge */ + AH_Edge* edge2 = edge1 + + outline->num_vedges - 1; /* rightmost edge */ + + + old_width = edge2->opos - edge1->opos; + new_width = edge2->pos - edge1->pos; + + old_advance = hinter->pp2.x; + old_lsb = edge1->opos; + new_lsb = edge1->pos; + + new_advance = old_advance + + ( new_width + new_lsb - old_width - old_lsb ); + + hinter->pp1.x = ( ( new_lsb - old_lsb ) + 32 ) & -64; + hinter->pp2.x = ( ( edge2->pos + + ( old_advance - edge2->opos ) ) + 32 ) & -64; + } + + /* good, we simply add the glyph to our loader's base */ + ah_loader_add( gloader ); + break; + + case ft_glyph_format_composite: + { + FT_UInt nn, num_subglyphs = slot->num_subglyphs; + FT_UInt num_base_subgs, start_point, start_contour; + FT_SubGlyph* subglyph; + + + start_point = gloader->base.outline.n_points; + start_contour = gloader->base.outline.n_contours; + + /* first of all, copy the subglyph descriptors in the glyph loader */ + error = ah_loader_check_subglyphs( gloader, num_subglyphs ); + if ( error ) + goto Exit; + + MEM_Copy( gloader->current.subglyphs, slot->subglyphs, + num_subglyphs * sizeof ( FT_SubGlyph ) ); + + 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 = hinter->pp1; + pp2 = hinter->pp2; + + num_base_points = gloader->base.outline.n_points; + + error = ah_hinter_load( hinter, 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 = hinter->pp1; + pp2 = hinter->pp2; + } + else + { + hinter->pp1 = pp1; + hinter->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* org = gloader->base.extra_points + + num_base_points; + FT_Vector* limit = cur + num_new_points; + + + for ( ; cur < limit; cur++, org++ ) + { + FT_Vector_Transform( cur, &subglyph->transform ); + FT_Vector_Transform( org, &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 = FT_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, x_scale ); + y = FT_MulFix( subglyph->arg2, y_scale ); + + x = ( x + 32 ) & -64; + y = ( y + 32 ) & -64; + } + + { + FT_Outline dummy = gloader->base.outline; + + + dummy.points += num_base_points; + dummy.n_points = num_new_points; + + FT_Outline_Translate( &dummy, x, y ); + } + } + } + break; + + default: + /* we don't support other formats (yet?) */ + error = FT_Err_Unimplemented_Feature; + } + + Hint_Metrics: + if ( depth == 0 ) + { + FT_BBox bbox; + + + /* transform the hinted outline if needed */ + if ( hinter->transformed ) + FT_Outline_Transform( &gloader->base.outline, &hinter->trans_matrix ); + + /* we must translate our final outline by -pp1.x, and compute */ + /* the new metrics */ + if ( hinter->pp1.x ) + FT_Outline_Translate( &gloader->base.outline, -hinter->pp1.x, 0 ); + + FT_Outline_Get_CBox( &gloader->base.outline, &bbox ); + bbox.xMin &= -64; + bbox.yMin &= -64; + bbox.xMax = ( bbox.xMax + 63 ) & -64; + bbox.yMax = ( bbox.yMax + 63 ) & -64; + + 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.horiAdvance = hinter->pp2.x - hinter->pp1.x; + /* XXX: TO DO - slot->linearHoriAdvance */ + + /* now copy outline into glyph slot */ + ah_loader_rewind( slot->internal->loader ); + error = ah_loader_copy_points( slot->internal->loader, gloader ); + if ( error ) + goto Exit; + + slot->outline = slot->internal->loader->base.outline; + slot->format = ft_glyph_format_outline; + } + + Exit: + return error; + } + + + /* load and hint a given glyph */ + FT_LOCAL_DEF + FT_Error ah_hinter_load_glyph( AH_Hinter* hinter, + FT_GlyphSlot slot, + FT_Size size, + FT_UInt glyph_index, + FT_Int load_flags ) + { + FT_Face face = slot->face; + FT_Error error; + FT_Fixed x_scale = size->metrics.x_scale; + FT_Fixed y_scale = size->metrics.y_scale; + AH_Face_Globals* face_globals = FACE_GLOBALS( face ); + + + /* first of all, we need to check that we're using the correct face and */ + /* global hints to load the glyph */ + if ( hinter->face != face || hinter->globals != face_globals ) + { + hinter->face = face; + if ( !face_globals ) + { + error = ah_hinter_new_face_globals( hinter, face, 0 ); + if ( error ) + goto Exit; + } + hinter->globals = FACE_GLOBALS( face ); + face_globals = FACE_GLOBALS( face ); + } + + /* now, we must check the current character pixel size to see if we */ + /* need to rescale the global metrics */ + if ( face_globals->x_scale != x_scale || + face_globals->y_scale != y_scale ) + ah_hinter_scale_globals( hinter, x_scale, y_scale ); + + load_flags |= FT_LOAD_NO_SCALE | FT_LOAD_NO_RECURSE; + + ah_loader_rewind( hinter->loader ); + + { + FT_Slot_Internal internal = slot->internal; + + + hinter->transformed = internal->glyph_transformed; + if ( hinter->transformed ) + { + FT_Matrix imatrix; + + + imatrix = internal->glyph_matrix; + hinter->trans_delta = internal->glyph_delta; + hinter->trans_matrix = imatrix; + + FT_Matrix_Invert( &imatrix ); + FT_Vector_Transform( &hinter->trans_delta, &imatrix ); + } + } + + error = ah_hinter_load( hinter, glyph_index, load_flags, 0 ); + + Exit: + return error; + } + + + /* retrieve a face's autohint globals for client applications */ + FT_LOCAL_DEF + void ah_hinter_get_global_hints( AH_Hinter* hinter, + FT_Face face, + void** global_hints, + long* global_len ) + { + AH_Globals* globals = 0; + FT_Memory memory = hinter->memory; + FT_Error error; + + + /* allocate new master globals */ + if ( ALLOC( globals, sizeof ( *globals ) ) ) + goto Fail; + + /* compute face globals if needed */ + if ( !FACE_GLOBALS( face ) ) + { + error = ah_hinter_new_face_globals( hinter, face, 0 ); + if ( error ) + goto Fail; + } + + *globals = FACE_GLOBALS( face )->design; + *global_hints = globals; + *global_len = sizeof( *globals ); + + return; + + Fail: + FREE( globals ); + + *global_hints = 0; + *global_len = 0; + } + + + FT_LOCAL_DEF + void ah_hinter_done_global_hints( AH_Hinter* hinter, + void* global_hints ) + { + FT_Memory memory = hinter->memory; + + + FREE( global_hints ); + } + + +/* END */ Index: xc/extras/freetype2/src/autohint/ahhint.h diff -u /dev/null xc/extras/freetype2/src/autohint/ahhint.h:1.1.1.1 --- /dev/null Mon Dec 18 14:22:34 2000 +++ xc/extras/freetype2/src/autohint/ahhint.h Fri Dec 8 16:26:19 2000 @@ -0,0 +1,87 @@ +/***************************************************************************/ +/* */ +/* ahhint.h */ +/* */ +/* Glyph hinter (declaration). */ +/* */ +/* Copyright 2000 Catharon Productions Inc. */ +/* Author: David Turner */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#ifndef AHHINT_H +#define AHHINT_H + + +#ifdef FT_FLAT_COMPILE + +#include "ahglobal.h" + +#else + +#include + +#endif + + +#ifdef __cplusplus + extern "C" { +#endif + + +#define AH_HINT_DEFAULT 0 +#define AH_HINT_NO_ALIGNMENT 1 +#define AH_HINT_NO_HORZ_EDGES 0x20000L +#define AH_HINT_NO_VERT_EDGES 0x40000L + + + /* create a new empty hinter object */ + FT_LOCAL + FT_Error ah_hinter_new( FT_Library library, + AH_Hinter** ahinter ); + + /* Load a hinted glyph in the hinter */ + FT_LOCAL + FT_Error ah_hinter_load_glyph( AH_Hinter* hinter, + FT_GlyphSlot slot, + FT_Size size, + FT_UInt glyph_index, + FT_Int load_flags ); + + /* finalize a hinter object */ + FT_LOCAL + void ah_hinter_done( AH_Hinter* hinter ); + + FT_LOCAL + void ah_hinter_done_face_globals( AH_Face_Globals* globals ); + + FT_LOCAL + void ah_hinter_get_global_hints( AH_Hinter* hinter, + FT_Face face, + void** global_hints, + long* global_len ); + + FT_LOCAL + void ah_hinter_done_global_hints( AH_Hinter* hinter, + void* global_hints ); + + +#ifdef __cplusplus + } +#endif + + +#endif /* AHHINT_H */ + + +/* END */ Index: xc/extras/freetype2/src/autohint/ahloader.h diff -u /dev/null xc/extras/freetype2/src/autohint/ahloader.h:1.1.1.1 --- /dev/null Mon Dec 18 14:22:34 2000 +++ xc/extras/freetype2/src/autohint/ahloader.h Fri Dec 8 16:26:19 2000 @@ -0,0 +1,135 @@ +/***************************************************************************/ +/* */ +/* ahloader.h */ +/* */ +/* Glyph loader for the auto-hinting module (declaration only). */ +/* */ +/* Copyright 2000 Catharon Productions Inc. */ +/* Author: David Turner */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* This defines the AH_GlyphLoader type in two different ways: */ + /* */ + /* - If the module is compiled within FreeType 2, the type is simply a */ + /* typedef to FT_GlyphLoader. */ + /* */ + /* - If the module is compiled as a standalone object, AH_GlyphLoader */ + /* has its own implementation. */ + /* */ + /*************************************************************************/ + + +#ifndef AHLOADER_H +#define AHLOADER_H + + +#ifdef __cplusplus + extern "C" { +#endif + + +#ifdef _STANDALONE_ + + typedef struct AH_GlyphLoad_ + { + FT_Outline outline; /* outline */ + FT_UInt num_subglyphs; /* number of subglyphs */ + FT_SubGlyph* subglyphs; /* subglyphs */ + FT_Vector* extra_points; /* extra points table */ + + } AH_GlyphLoad; + + + struct AH_GlyphLoader_ + { + FT_Memory memory; + FT_UInt max_points; + FT_UInt max_contours; + FT_UInt max_subglyphs; + FT_Bool use_extra; + + AH_GlyphLoad base; + AH_GlyphLoad current; + + void* other; /* for possible future extensions */ + }; + + + FT_LOCAL + FT_Error AH_GlyphLoader_New( FT_Memory memory, + AH_GlyphLoader** aloader ); + + FT_LOCAL + FT_Error AH_GlyphLoader_Create_Extra( AH_GlyphLoader* loader ); + + FT_LOCAL + void AH_GlyphLoader_Done( AH_GlyphLoader* loader ); + + FT_LOCAL + void AH_GlyphLoader_Reset( AH_GlyphLoader* loader ); + + FT_LOCAL + void AH_GlyphLoader_Rewind( AH_GlyphLoader* loader ); + + FT_LOCAL + FT_Error AH_GlyphLoader_Check_Points( AH_GlyphLoader* loader, + FT_UInt n_points, + FT_UInt n_contours ); + + FT_LOCAL + FT_Error AH_GlyphLoader_Check_Subglyphs( AH_GlyphLoader* loader, + FT_UInt n_subs ); + + FT_LOCAL + void AH_GlyphLoader_Prepare( AH_GlyphLoader* loader ); + + FT_LOCAL + void AH_GlyphLoader_Add( AH_GlyphLoader* loader ); + + FT_LOCAL + FT_Error AH_GlyphLoader_Copy_Points( AH_GlyphLoader* target, + FT_GlyphLoader* source ); + +#else /* _STANDALONE */ + +#include + + #define AH_Load FT_GlyphLoad + #define AH_Loader FT_GlyphLoader + + #define ah_loader_new FT_GlyphLoader_New + #define ah_loader_done FT_GlyphLoader_Done + #define ah_loader_reset FT_GlyphLoader_Reset + #define ah_loader_rewind FT_GlyphLoader_Rewind + #define ah_loader_create_extra FT_GlyphLoader_Create_Extra + #define ah_loader_check_points FT_GlyphLoader_Check_Points + #define ah_loader_check_subglyphs FT_GlyphLoader_Check_Subglyphs + #define ah_loader_prepare FT_GlyphLoader_Prepare + #define ah_loader_add FT_GlyphLoader_Add + #define ah_loader_copy_points FT_GlyphLoader_Copy_Points + +#endif /* _STANDALONE_ */ + + +#ifdef __cplusplus + } +#endif + + +#endif /* AHLOADER_H */ + + +/* END */ Index: xc/extras/freetype2/src/autohint/ahmodule.c diff -u /dev/null xc/extras/freetype2/src/autohint/ahmodule.c:1.1.1.1 --- /dev/null Mon Dec 18 14:22:34 2000 +++ xc/extras/freetype2/src/autohint/ahmodule.c Fri Dec 8 16:26:19 2000 @@ -0,0 +1,128 @@ +/***************************************************************************/ +/* */ +/* ahmodule.c */ +/* */ +/* Auto-hinting module implementation (declaration). */ +/* */ +/* Copyright 2000 Catharon Productions Inc. */ +/* Author: David Turner */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#include + + +#ifdef FT_FLAT_COMPILE + +#include "ahhint.h" + +#else + +#include + +#endif + + + typedef struct FT_AutoHinterRec_ + { + FT_ModuleRec root; + AH_Hinter* hinter; + + } FT_AutoHinterRec; + + + FT_CALLBACK_DEF + FT_Error ft_autohinter_init( FT_AutoHinter module ) + { + return ah_hinter_new( module->root.library, &module->hinter ); + } + + + FT_CALLBACK_DEF + void ft_autohinter_done( FT_AutoHinter module ) + { + ah_hinter_done( module->hinter ); + } + + + FT_CALLBACK_DEF + FT_Error ft_autohinter_load( FT_AutoHinter module, + FT_GlyphSlot slot, + FT_Size size, + FT_UInt glyph_index, + FT_ULong load_flags ) + { + return ah_hinter_load_glyph( module->hinter, + slot, size, glyph_index, load_flags ); + } + + + FT_CALLBACK_DEF + void ft_autohinter_reset( FT_AutoHinter module, + FT_Face face ) + { + UNUSED( module ); + + if ( face->autohint.data ) + ah_hinter_done_face_globals( (AH_Face_Globals*)(face->autohint.data) ); + } + + + FT_CALLBACK_DEF + void ft_autohinter_get_globals( FT_AutoHinter module, + FT_Face face, + void** global_hints, + long* global_len ) + { + ah_hinter_get_global_hints( module->hinter, face, + global_hints, global_len ); + } + + + FT_CALLBACK_DEF + void ft_autohinter_done_globals( FT_AutoHinter module, + void* global_hints ) + { + ah_hinter_done_global_hints( module->hinter, global_hints ); + } + + + FT_CALLBACK_TABLE_DEF + const FT_AutoHinter_Interface autohinter_interface = + { + ft_autohinter_reset, + ft_autohinter_load, + ft_autohinter_get_globals, + ft_autohinter_done_globals + }; + + + FT_CALLBACK_TABLE_DEF + const FT_Module_Class autohint_module_class = + { + ft_module_hinter, + sizeof ( FT_AutoHinterRec ), + + "autohinter", + 0x10000L, /* version 1.0 of the autohinter */ + 0x20000L, /* requires FreeType 2.0 or above */ + + (const void*)&autohinter_interface, + + (FT_Module_Constructor)ft_autohinter_init, + (FT_Module_Destructor) ft_autohinter_done, + (FT_Module_Requester) 0 + }; + + +/* END */ Index: xc/extras/freetype2/src/autohint/ahmodule.h diff -u /dev/null xc/extras/freetype2/src/autohint/ahmodule.h:1.1.1.1 --- /dev/null Mon Dec 18 14:22:34 2000 +++ xc/extras/freetype2/src/autohint/ahmodule.h Fri Dec 8 16:26:19 2000 @@ -0,0 +1,43 @@ +/***************************************************************************/ +/* */ +/* ahmodule.h */ +/* */ +/* Auto-hinting module (declaration). */ +/* */ +/* Copyright 2000 Catharon Productions Inc. */ +/* Author: David Turner */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#ifndef AHMODULE_H +#define AHMODULE_H + +#include + + +#ifdef __cplusplus + extern "C" { +#endif + + FT_CALLBACK_TABLE + const FT_Module_Class autohint_module_class; + +#ifdef __cplusplus + } +#endif + + +#endif /* AHMODULE_H */ + + +/* END */ Index: xc/extras/freetype2/src/autohint/ahoptim.c diff -u /dev/null xc/extras/freetype2/src/autohint/ahoptim.c:1.1.1.1 --- /dev/null Mon Dec 18 14:22:34 2000 +++ xc/extras/freetype2/src/autohint/ahoptim.c Fri Dec 8 16:26:19 2000 @@ -0,0 +1,889 @@ +/***************************************************************************/ +/* */ +/* ahoptim.c */ +/* */ +/* FreeType auto hinting outline optimization (body). */ +/* */ +/* Copyright 2000 Catharon Productions Inc. */ +/* Author: David Turner */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* This module is in charge of optimising the outlines produced by the */ + /* auto-hinter in direct mode. This is required at small pixel sizes in */ + /* order to ensure coherent spacing, among other things.. */ + /* */ + /* The technique used in this module is a simplified simulated */ + /* annealing. */ + /* */ + /*************************************************************************/ + + +#include /* for ALLOC_ARRAY() and FREE() */ + + +#ifdef FT_FLAT_COMPILE + +#include "ahoptim.h" + +#else + +#include + +#endif + + + /* define this macro to use brute force optimisation -- this is slow, */ + /* but a good way to perfect the distortion function `by hand' through */ + /* tweaking */ +#define AH_BRUTE_FORCE + + +#define xxxAH_DEBUG_OPTIM + + +#undef LOG +#ifdef AH_DEBUG_OPTIM + +#define LOG( x ) optim_log##x + +#else + +#define LOG( x ) + +#endif /* AH_DEBUG_OPTIM */ + + +#ifdef AH_DEBUG_OPTIM + +#include +#include +#include + +#define FLOAT( x ) ( (float)( (x) / 64.0 ) ) + + static + void optim_log( const char* fmt, ... ) + { + va_list ap; + + + va_start( ap, fmt ); + vprintf( fmt, ap ); + va_end( ap ); + } + + + static + void AH_Dump_Stems( AH_Optimizer* optimizer ) + { + int n; + AH_Stem* stem; + + + stem = optimizer->stems; + for ( n = 0; n < optimizer->num_stems; n++, stem++ ) + { + LOG(( " %c%2d [%.1f:%.1f]={%.1f:%.1f}=" + "<%1.f..%1.f> force=%.1f speed=%.1f\n", + optimizer->vertical ? 'V' : 'H', n, + FLOAT( stem->edge1->opos ), FLOAT( stem->edge2->opos ), + FLOAT( stem->edge1->pos ), FLOAT( stem->edge2->pos ), + FLOAT( stem->min_pos ), FLOAT( stem->max_pos ), + FLOAT( stem->force ), FLOAT( stem->velocity ) )); + } + } + + + static + void AH_Dump_Stems2( AH_Optimizer* optimizer ) + { + int n; + AH_Stem* stem; + + + stem = optimizer->stems; + for ( n = 0; n < optimizer->num_stems; n++, stem++ ) + { + LOG(( " %c%2d [%.1f]=<%1.f..%1.f> force=%.1f speed=%.1f\n", + optimizer->vertical ? 'V' : 'H', n, + FLOAT( stem->pos ), + FLOAT( stem->min_pos ), FLOAT( stem->max_pos ), + FLOAT( stem->force ), FLOAT( stem->velocity ) )); + } + } + + + static + void AH_Dump_Springs( AH_Optimizer* optimizer ) + { + int n; + AH_Spring* spring; + AH_Stem* stems; + + + spring = optimizer->springs; + stems = optimizer->stems; + LOG(( "%cSprings ", optimizer->vertical ? 'V' : 'H' )); + + for ( n = 0; n < optimizer->num_springs; n++, spring++ ) + { + LOG(( " [%d-%d:%.1f:%1.f:%.1f]", + spring->stem1 - stems, spring->stem2 - stems, + FLOAT( spring->owidth ), + FLOAT( spring->stem2->pos - + ( spring->stem1->pos + spring->stem1->width ) ), + FLOAT( spring->tension ) )); + } + + LOG(( "\n" )); + } + +#endif /* AH_DEBUG_OPTIM */ + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** COMPUTE STEMS AND SPRINGS IN AN OUTLINE ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + static + int valid_stem_segments( AH_Segment* seg1, + AH_Segment* seg2 ) + { + return seg1->serif == 0 && + seg2 && + seg2->link == seg1 && + seg1->pos < seg2->pos && + seg1->min_coord <= seg2->max_coord && + seg2->min_coord <= seg1->max_coord; + } + + + /* compute all stems in an outline */ + static + int optim_compute_stems( AH_Optimizer* optimizer ) + { + AH_Outline* outline = optimizer->outline; + FT_Fixed scale; + FT_Memory memory = optimizer->memory; + FT_Error error = 0; + FT_Int dimension; + AH_Edge* edges; + AH_Edge* edge_limit; + AH_Stem** p_stems; + FT_Int* p_num_stems; + + + edges = outline->horz_edges; + edge_limit = edges + outline->num_hedges; + scale = outline->y_scale; + + p_stems = &optimizer->horz_stems; + p_num_stems = &optimizer->num_hstems; + + for ( dimension = 1; dimension >= 0; dimension-- ) + { + AH_Stem* stems = 0; + FT_Int num_stems = 0; + AH_Edge* edge; + + + /* first of all, count the number of stems in this direction */ + for ( edge = edges; edge < edge_limit; edge++ ) + { + AH_Segment* seg = edge->first; + + + do + { + if (valid_stem_segments( seg, seg->link ) ) + num_stems++; + + seg = seg->edge_next; + + } while ( seg != edge->first ); + } + + /* now allocate the stems and build their table */ + if ( num_stems > 0 ) + { + AH_Stem* stem; + + + if ( ALLOC_ARRAY( stems, num_stems, AH_Stem ) ) + goto Exit; + + stem = stems; + for ( edge = edges; edge < edge_limit; edge++ ) + { + AH_Segment* seg = edge->first; + AH_Segment* seg2; + + + do + { + seg2 = seg->link; + if ( valid_stem_segments( seg, seg2 ) ) + { + AH_Edge* edge1 = seg->edge; + AH_Edge* edge2 = seg2->edge; + + + stem->edge1 = edge1; + stem->edge2 = edge2; + stem->opos = edge1->opos; + stem->pos = edge1->pos; + stem->owidth = edge2->opos - edge1->opos; + stem->width = edge2->pos - edge1->pos; + + /* compute min_coord and max_coord */ + { + FT_Pos min_coord = seg->min_coord; + FT_Pos max_coord = seg->max_coord; + + + if ( seg2->min_coord > min_coord ) + min_coord = seg2->min_coord; + + if ( seg2->max_coord < max_coord ) + max_coord = seg2->max_coord; + + stem->min_coord = min_coord; + stem->max_coord = max_coord; + } + + /* compute minimum and maximum positions for stem -- */ + /* note that the left-most/bottom-most stem has always */ + /* a fixed position */ + if ( stem == stems || edge1->blue_edge || edge2->blue_edge ) + { + /* this stem cannot move; it is snapped to a blue edge */ + stem->min_pos = stem->pos; + stem->max_pos = stem->pos; + } + else + { + /* this edge can move; compute its min and max positions */ + FT_Pos pos1 = stem->opos; + FT_Pos pos2 = pos1 + stem->owidth - stem->width; + FT_Pos min1 = pos1 & -64; + FT_Pos min2 = pos2 & -64; + + + stem->min_pos = min1; + stem->max_pos = min1 + 64; + if ( min2 < min1 ) + stem->min_pos = min2; + else + stem->max_pos = min2 + 64; + + /* XXX: just to see what it does */ + stem->max_pos += 64; + + /* just for the case where direct hinting did some */ + /* incredible things (e.g. blue edge shifts) */ + if ( stem->min_pos > stem->pos ) + stem->min_pos = stem->pos; + + if ( stem->max_pos < stem->pos ) + stem->max_pos = stem->pos; + } + + stem->velocity = 0; + stem->force = 0; + + stem++; + } + seg = seg->edge_next; + + } while ( seg != edge->first ); + } + } + + *p_stems = stems; + *p_num_stems = num_stems; + + edges = outline->vert_edges; + edge_limit = edges + outline->num_vedges; + scale = outline->x_scale; + + p_stems = &optimizer->vert_stems; + p_num_stems = &optimizer->num_vstems; + } + + Exit: + +#ifdef AH_DEBUG_OPTIM + AH_Dump_Stems( optimizer ); +#endif + + return error; + } + + + /* returns the spring area between two stems, 0 if none */ + static + FT_Pos stem_spring_area( AH_Stem* stem1, + AH_Stem* stem2 ) + { + FT_Pos area1 = stem1->max_coord - stem1->min_coord; + FT_Pos area2 = stem2->max_coord - stem2->min_coord; + FT_Pos min = stem1->min_coord; + FT_Pos max = stem1->max_coord; + FT_Pos area; + + + /* order stems */ + if ( stem2->opos <= stem1->opos + stem1->owidth ) + return 0; + + if ( min < stem2->min_coord ) + min = stem2->min_coord; + + if ( max < stem2->max_coord ) + max = stem2->max_coord; + + area = ( max-min ); + if ( 2 * area < area1 && 2 * area < area2 ) + area = 0; + + return area; + } + + + /* compute all springs in an outline */ + static + int optim_compute_springs( AH_Optimizer* optimizer ) + { + /* basically, a spring exists between two stems if most of their */ + /* surface is aligned */ + FT_Memory memory = optimizer->memory; + + AH_Stem* stems; + AH_Stem* stem_limit; + AH_Stem* stem; + int dimension; + int error = 0; + + FT_Int* p_num_springs; + AH_Spring** p_springs; + + + stems = optimizer->horz_stems; + stem_limit = stems + optimizer->num_hstems; + + p_springs = &optimizer->horz_springs; + p_num_springs = &optimizer->num_hsprings; + + for ( dimension = 1; dimension >= 0; dimension-- ) + { + FT_Int num_springs = 0; + AH_Spring* springs = 0; + + + /* first of all, count stem springs */ + for ( stem = stems; stem + 1 < stem_limit; stem++ ) + { + AH_Stem* stem2; + + + for ( stem2 = stem+1; stem2 < stem_limit; stem2++ ) + if ( stem_spring_area( stem, stem2 ) ) + num_springs++; + } + + /* then allocate and build the springs table */ + if ( num_springs > 0 ) + { + AH_Spring* spring; + + + /* allocate table of springs */ + if ( ALLOC_ARRAY( springs, num_springs, AH_Spring ) ) + goto Exit; + + /* fill the springs table */ + spring = springs; + for ( stem = stems; stem+1 < stem_limit; stem++ ) + { + AH_Stem* stem2; + FT_Pos area; + + + for ( stem2 = stem + 1; stem2 < stem_limit; stem2++ ) + { + area = stem_spring_area( stem, stem2 ); + if ( area ) + { + /* add a new spring here */ + spring->stem1 = stem; + spring->stem2 = stem2; + spring->owidth = stem2->opos - ( stem->opos + stem->owidth ); + spring->tension = 0; + + spring++; + } + } + } + } + *p_num_springs = num_springs; + *p_springs = springs; + + stems = optimizer->vert_stems; + stem_limit = stems + optimizer->num_vstems; + + p_springs = &optimizer->vert_springs; + p_num_springs = &optimizer->num_vsprings; + } + + Exit: + +#ifdef AH_DEBUG_OPTIM + AH_Dump_Springs( optimizer ); +#endif + + return error; + } + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** OPTIMIZE THROUGH MY STRANGE SIMULATED ANNEALING ALGO ;-) ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + +#ifndef AH_BRUTE_FORCE + + /* compute all spring tensions */ + static + void optim_compute_tensions( AH_Optimizer* optimizer ) + { + AH_Spring* spring = optimizer->springs; + AH_Spring* limit = spring + optimizer->num_springs; + + + for ( ; spring < limit; spring++ ) + { + AH_Stem* stem1 = spring->stem1; + AH_Stem* stem2 = spring->stem2; + FT_Int status; + + FT_Pos width; + FT_Pos tension; + FT_Pos sign; + + + /* compute the tension; it simply is -K*(new_width-old_width) */ + width = stem2->pos - ( stem1->pos + stem1->width ); + tension = width - spring->owidth; + + sign = 1; + if ( tension < 0 ) + { + sign = -1; + tension = -tension; + } + + if ( width <= 0 ) + tension = 32000; + else + tension = ( tension << 10 ) / width; + + tension = -sign * FT_MulFix( tension, optimizer->tension_scale ); + spring->tension = tension; + + /* now, distribute tension among the englobing stems, if they */ + /* are able to move */ + status = 0; + if ( stem1->pos <= stem1->min_pos ) + status |= 1; + if ( stem2->pos >= stem2->max_pos ) + status |= 2; + + if ( !status ) + tension /= 2; + + if ( ( status & 1 ) == 0 ) + stem1->force -= tension; + + if ( ( status & 2 ) == 0 ) + stem2->force += tension; + } + } + + + /* compute all stem movements -- returns 0 if nothing moved */ + static + int optim_compute_stem_movements( AH_Optimizer* optimizer ) + { + AH_Stem* stems = optimizer->stems; + AH_Stem* limit = stems + optimizer->num_stems; + AH_Stem* stem = stems; + int moved = 0; + + + /* set initial forces to velocity */ + for ( stem = stems; stem < limit; stem++ ) + { + stem->force = stem->velocity; + stem->velocity /= 2; /* XXX: Heuristics */ + } + + /* compute the sum of forces applied on each stem */ + optim_compute_tensions( optimizer ); + +#ifdef AH_DEBUG_OPTIM + AH_Dump_Springs( optimizer ); + AH_Dump_Stems2( optimizer ); +#endif + + /* now, see whether something can move */ + for ( stem = stems; stem < limit; stem++ ) + { + if ( stem->force > optimizer->tension_threshold ) + { + /* there is enough tension to move the stem to the right */ + if ( stem->pos < stem->max_pos ) + { + stem->pos += 64; + stem->velocity = stem->force / 2; + moved = 1; + } + else + stem->velocity = 0; + } + else if ( stem->force < optimizer->tension_threshold ) + { + /* there is enough tension to move the stem to the left */ + if ( stem->pos > stem->min_pos ) + { + stem->pos -= 64; + stem->velocity = stem->force / 2; + moved = 1; + } + else + stem->velocity = 0; + } + } + + /* return 0 if nothing moved */ + return moved; + } + +#endif /* AH_BRUTE_FORCE */ + + + /* compute current global distortion from springs */ + static + FT_Pos optim_compute_distortion( AH_Optimizer* optimizer ) + { + AH_Spring* spring = optimizer->springs; + AH_Spring* limit = spring + optimizer->num_springs; + FT_Pos distortion = 0; + + + for ( ; spring < limit; spring++ ) + { + AH_Stem* stem1 = spring->stem1; + AH_Stem* stem2 = spring->stem2; + FT_Pos width; + + width = stem2->pos - ( stem1->pos + stem1->width ); + width -= spring->owidth; + if ( width < 0 ) + width = -width; + + distortion += width; + } + + return distortion; + } + + + /* record stems configuration in `best of' history */ + static + void optim_record_configuration( AH_Optimizer* optimizer ) + { + FT_Pos distortion; + AH_Configuration* configs = optimizer->configs; + AH_Configuration* limit = configs + optimizer->num_configs; + AH_Configuration* config; + + + distortion = optim_compute_distortion( optimizer ); + LOG(( "config distortion = %.1f ", FLOAT( distortion * 64 ) )); + + /* check that we really need to add this configuration to our */ + /* sorted history */ + if ( limit > configs && limit[-1].distortion < distortion ) + { + LOG(( "ejected\n" )); + return; + } + + /* add new configuration at the end of the table */ + { + int n; + + + config = limit; + if ( optimizer->num_configs < AH_MAX_CONFIGS ) + optimizer->num_configs++; + else + config--; + + config->distortion = distortion; + + for ( n = 0; n < optimizer->num_stems; n++ ) + config->positions[n] = optimizer->stems[n].pos; + } + + /* move the current configuration towards the front of the list */ + /* when necessary -- yes this is slow bubble sort ;-) */ + while ( config > configs && config[0].distortion < config[-1].distortion ) + { + AH_Configuration temp; + + + config--; + temp = config[0]; + config[0] = config[1]; + config[1] = temp; + } + LOG(( "recorded!\n" )); + } + + +#ifdef AH_BRUTE_FORCE + + /* optimize outline in a single direction */ + static + void optim_compute( AH_Optimizer* optimizer ) + { + int n; + FT_Bool moved; + + AH_Stem* stem = optimizer->stems; + AH_Stem* limit = stem + optimizer->num_stems; + + + /* empty, exit */ + if ( stem >= limit ) + return; + + optimizer->num_configs = 0; + + stem = optimizer->stems; + for ( ; stem < limit; stem++ ) + stem->pos = stem->min_pos; + + do + { + /* record current configuration */ + optim_record_configuration( optimizer ); + + /* now change configuration */ + moved = 0; + for ( stem = optimizer->stems; stem < limit; stem++ ) + { + if ( stem->pos < stem->max_pos ) + { + stem->pos += 64; + moved = 1; + break; + } + + stem->pos = stem->min_pos; + } + } while ( moved ); + + /* now, set the best stem positions */ + for ( n = 0; n < optimizer->num_stems; n++ ) + { + AH_Stem* stem = optimizer->stems + n; + FT_Pos pos = optimizer->configs[0].positions[n]; + + + stem->edge1->pos = pos; + stem->edge2->pos = pos + stem->width; + + stem->edge1->flags |= ah_edge_done; + stem->edge2->flags |= ah_edge_done; + } + } + +#else /* AH_BRUTE_FORCE */ + + /* optimize outline in a single direction */ + static + void optim_compute( AH_Optimizer* optimizer ) + { + int n, counter, counter2; + + + optimizer->num_configs = 0; + optimizer->tension_scale = 0x80000L; + optimizer->tension_threshold = 64; + + /* record initial configuration threshold */ + optim_record_configuration( optimizer ); + + counter = 0; + for ( counter2 = optimizer->num_stems*8; counter2 >= 0; counter2-- ) + { + if ( counter == 0 ) + counter = 2 * optimizer->num_stems; + + if ( !optim_compute_stem_movements( optimizer ) ) + break; + + optim_record_configuration( optimizer ); + + counter--; + if ( counter == 0 ) + optimizer->tension_scale /= 2; + } + + /* now, set the best stem positions */ + for ( n = 0; n < optimizer->num_stems; n++ ) + { + AH_Stem* stem = optimizer->stems + n; + FT_Pos pos = optimizer->configs[0].positions[n]; + + + stem->edge1->pos = pos; + stem->edge2->pos = pos + stem->width; + + stem->edge1->flags |= ah_edge_done; + stem->edge2->flags |= ah_edge_done; + } + } + +#endif /* AH_BRUTE_FORCE */ + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** HIGH-LEVEL OPTIMIZER API ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /* releases the optimization data */ + void AH_Optimizer_Done( AH_Optimizer* optimizer ) + { + if ( optimizer ) + { + FT_Memory memory = optimizer->memory; + + + FREE( optimizer->horz_stems ); + FREE( optimizer->vert_stems ); + FREE( optimizer->horz_springs ); + FREE( optimizer->vert_springs ); + FREE( optimizer->positions ); + } + } + + + /* loads the outline into the optimizer */ + int AH_Optimizer_Init( AH_Optimizer* optimizer, + AH_Outline* outline, + FT_Memory memory ) + { + FT_Error error; + + + MEM_Set( optimizer, 0, sizeof ( *optimizer ) ); + optimizer->outline = outline; + optimizer->memory = memory; + + LOG(( "initializing new optimizer\n" )); + /* compute stems and springs */ + error = optim_compute_stems ( optimizer ) || + optim_compute_springs( optimizer ); + if ( error ) + goto Fail; + + /* allocate stem positions history and configurations */ + { + int n, max_stems; + + + max_stems = optimizer->num_hstems; + if ( max_stems < optimizer->num_vstems ) + max_stems = optimizer->num_vstems; + + if ( ALLOC_ARRAY( optimizer->positions, + max_stems * AH_MAX_CONFIGS, FT_Pos ) ) + goto Fail; + + optimizer->num_configs = 0; + for ( n = 0; n < AH_MAX_CONFIGS; n++ ) + optimizer->configs[n].positions = optimizer->positions + + n * max_stems; + } + + return error; + + Fail: + AH_Optimizer_Done( optimizer ); + return error; + } + + + /* compute optimal outline */ + void AH_Optimizer_Compute( AH_Optimizer* optimizer ) + { + optimizer->num_stems = optimizer->num_hstems; + optimizer->stems = optimizer->horz_stems; + optimizer->num_springs = optimizer->num_hsprings; + optimizer->springs = optimizer->horz_springs; + + if ( optimizer->num_springs > 0 ) + { + LOG(( "horizontal optimization ------------------------\n" )); + optim_compute( optimizer ); + } + + optimizer->num_stems = optimizer->num_vstems; + optimizer->stems = optimizer->vert_stems; + optimizer->num_springs = optimizer->num_vsprings; + optimizer->springs = optimizer->vert_springs; + + if ( optimizer->num_springs ) + { + LOG(( "vertical optimization --------------------------\n" )); + optim_compute( optimizer ); + } + } + + +/* END */ Index: xc/extras/freetype2/src/autohint/ahoptim.h diff -u /dev/null xc/extras/freetype2/src/autohint/ahoptim.h:1.1.1.1 --- /dev/null Mon Dec 18 14:22:34 2000 +++ xc/extras/freetype2/src/autohint/ahoptim.h Fri Dec 8 16:26:19 2000 @@ -0,0 +1,146 @@ +/***************************************************************************/ +/* */ +/* ahoptim.h */ +/* */ +/* FreeType auto hinting outline optimization (declaration). */ +/* */ +/* Copyright 2000 Catharon Productions Inc. */ +/* Author: David Turner */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#ifndef AHOPTIM_H +#define AHOPTIM_H + + +#ifdef FT_FLAT_COMPILE + +#include "ahtypes.h" + +#else + +#include + +#endif + + +#ifdef __cplusplus + extern "C" { +#endif + + + /* the maximal number of stem configurations to record */ + /* during optimization */ +#define AH_MAX_CONFIGS 8 + + + typedef struct AH_Stem_ + { + FT_Pos pos; /* current position */ + FT_Pos velocity; /* current velocity */ + FT_Pos force; /* sum of current forces */ + FT_Pos width; /* normalized width */ + + FT_Pos min_pos; /* minimum grid position */ + FT_Pos max_pos; /* maximum grid position */ + + AH_Edge* edge1; /* left/bottom edge */ + AH_Edge* edge2; /* right/top edge */ + + FT_Pos opos; /* original position */ + FT_Pos owidth; /* original width */ + + FT_Pos min_coord; /* minimum coordinate */ + FT_Pos max_coord; /* maximum coordinate */ + + } AH_Stem; + + + /* A spring between two stems */ + typedef struct AH_Spring_ + { + AH_Stem* stem1; + AH_Stem* stem2; + FT_Pos owidth; /* original width */ + FT_Pos tension; /* current tension */ + + } AH_Spring; + + + /* A configuration records the position of each stem at a given time */ + /* as well as the associated distortion */ + typedef struct AH_Configuration_ + { + FT_Pos* positions; + FT_Long distortion; + + } AH_Configuration; + + + typedef struct AH_Optimizer_ + { + FT_Memory memory; + AH_Outline* outline; + + FT_Int num_hstems; + AH_Stem* horz_stems; + + FT_Int num_vstems; + AH_Stem* vert_stems; + + FT_Int num_hsprings; + FT_Int num_vsprings; + AH_Spring* horz_springs; + AH_Spring* vert_springs; + + FT_Int num_configs; + AH_Configuration configs[AH_MAX_CONFIGS]; + FT_Pos* positions; + + /* during each pass, use these instead */ + FT_Int num_stems; + AH_Stem* stems; + + FT_Int num_springs; + AH_Spring* springs; + FT_Bool vertical; + + FT_Fixed tension_scale; + FT_Pos tension_threshold; + + } AH_Optimizer; + + + /* loads the outline into the optimizer */ + int AH_Optimizer_Init( AH_Optimizer* optimizer, + AH_Outline* outline, + FT_Memory memory ); + + + /* compute optimal outline */ + void AH_Optimizer_Compute( AH_Optimizer* optimizer ); + + + /* release the optimization data */ + void AH_Optimizer_Done( AH_Optimizer* optimizer ); + + +#ifdef __cplusplus + } +#endif + + +#endif /* AHOPTIM_H */ + + +/* END */ Index: xc/extras/freetype2/src/autohint/ahtypes.h diff -u /dev/null xc/extras/freetype2/src/autohint/ahtypes.h:1.1.1.1 --- /dev/null Mon Dec 18 14:22:34 2000 +++ xc/extras/freetype2/src/autohint/ahtypes.h Fri Dec 8 16:26:19 2000 @@ -0,0 +1,506 @@ +/***************************************************************************/ +/* */ +/* ahtypes.h */ +/* */ +/* General types and definitions for the auto-hint module */ +/* (specification only). */ +/* */ +/* Copyright 2000 Catharon Productions Inc. */ +/* Author: David Turner */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#ifndef AHTYPES_H +#define AHTYPES_H + + +#include /* for freetype.h + FT_LOCAL etc. */ + + +#ifdef FT_FLAT_COMPILE + +#include "ahloader.h" + +#else + +#include + +#endif + + +#define xxAH_DEBUG + + +#ifdef AH_DEBUG + +#include + +#define AH_LOG( x ) printf##x + +#else + +#define AH_LOG( x ) do ; while ( 0 ) /* nothing */ + +#endif + + +#ifdef __cplusplus + extern "C" { +#endif + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** COMPILE-TIME BUILD OPTIONS ****/ + /**** ****/ + /**** Toggle these configuration macros to experiment with `features' ****/ + /**** of the auto-hinter. ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* If this option is defined, only strong interpolation will be used to */ + /* place the points between edges. Otherwise, `smooth' points are */ + /* detected and later hinted through weak interpolation to correct some */ + /* unpleasant artefacts. */ + /* */ +#undef AH_OPTION_NO_WEAK_INTERPOLATION + + + /*************************************************************************/ + /* */ + /* If this option is defined, only weak interpolation will be used to */ + /* place the points between edges. Otherwise, `strong' points are */ + /* detected and later hinted through strong interpolation to correct */ + /* some unpleasant artefacts. */ + /* */ +#undef AH_OPTION_NO_STRONG_INTERPOLATION + + + /*************************************************************************/ + /* */ + /* Undefine this macro if you don't want to hint the metrics. There is */ + /* no reason to do this (at least for non-CJK scripts), except for */ + /* experimentation. */ + /* */ +#define AH_HINT_METRICS + + + /*************************************************************************/ + /* */ + /* Define this macro if you do not want to insert extra edges at a */ + /* glyph's x and y extremum (if there isn't one already available). */ + /* This helps to reduce a number of artefacts and allows hinting of */ + /* metrics. */ + /* */ +#undef AH_OPTION_NO_EXTREMUM_EDGES + + + /* don't touch for now */ +#define AH_MAX_WIDTHS 12 +#define AH_MAX_HEIGHTS 12 + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** TYPE DEFINITIONS ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /* see agangles.h */ + typedef FT_Int AH_Angle; + + + /* hint flags */ +#define ah_flah_none 0 + + /* bezier control points flags */ +#define ah_flah_conic 1 +#define ah_flah_cubic 2 +#define ah_flah_control ( ah_flah_conic | ah_flah_cubic ) + + /* extrema flags */ +#define ah_flah_extrema_x 4 +#define ah_flah_extrema_y 8 + + /* roundness */ +#define ah_flah_round_x 16 +#define ah_flah_round_y 32 + + /* touched */ +#define ah_flah_touch_x 64 +#define ah_flah_touch_y 128 + + /* weak interpolation */ +#define ah_flah_weak_interpolation 256 + + typedef FT_Int AH_Flags; + + + /* edge hint flags */ +#define ah_edge_normal 0 +#define ah_edge_round 1 +#define ah_edge_serif 2 +#define ah_edge_done 4 + + typedef FT_Int AH_Edge_Flags; + + + /* hint directions -- the values are computed so that two vectors are */ + /* in opposite directions iff `dir1+dir2 == 0' */ +#define ah_dir_none 4 +#define ah_dir_right 1 +#define ah_dir_left -1 +#define ah_dir_up 2 +#define ah_dir_down -2 + + typedef FT_Int AH_Direction; + + + typedef struct AH_Point AH_Point; + typedef struct AH_Segment AH_Segment; + typedef struct AH_Edge AH_Edge; + + + /*************************************************************************/ + /* */ + /* */ + /* AH_Point */ + /* */ + /* */ + /* A structure used to model an outline point to the AH_Outline type. */ + /* */ + /* */ + /* flags :: The current point hint flags. */ + /* */ + /* ox, oy :: The current original scaled coordinates. */ + /* */ + /* fx, fy :: The current coordinates in font units. */ + /* */ + /* x, y :: The current hinter coordinates. */ + /* */ + /* u, v :: Point coordinates -- meaning varies with context. */ + /* */ + /* in_dir :: The direction of the inwards vector (prev->point). */ + /* */ + /* out_dir :: The direction of the outwards vector (point->next). */ + /* */ + /* in_angle :: The angle of the inwards vector. */ + /* */ + /* out_angle :: The angle of the outwards vector. */ + /* */ + /* next :: The next point in same contour. */ + /* */ + /* prev :: The previous point in same contour. */ + /* */ + struct AH_Point + { + AH_Flags flags; /* point flags used by hinter */ + FT_Pos ox, oy; + FT_Pos fx, fy; + FT_Pos x, y; + FT_Pos u, v; + + AH_Direction in_dir; /* direction of inwards vector */ + AH_Direction out_dir; /* direction of outwards vector */ + + AH_Angle in_angle; + AH_Angle out_angle; + + AH_Point* next; /* next point in contour */ + AH_Point* prev; /* previous point in contour */ + }; + + + /*************************************************************************/ + /* */ + /* */ + /* AH_Segment */ + /* */ + /* */ + /* A structure used to describe an edge segment to the auto-hinter. */ + /* A segment is simply a sequence of successive points located on the */ + /* same horizontal or vertical `position', in a given direction. */ + /* */ + /* */ + /* flags :: The segment edge flags (straight, rounded, etc.). */ + /* */ + /* dir :: The segment direction. */ + /* */ + /* first :: The first point in the segment. */ + /* */ + /* last :: The last point in the segment. */ + /* */ + /* contour :: A pointer to the first point of the segment's */ + /* contour. */ + /* */ + /* pos :: The segment position in font units. */ + /* */ + /* size :: The segment size. */ + /* */ + /* edge :: The edge of the current segment. */ + /* */ + /* edge_next :: The next segment on the same edge. */ + /* */ + /* link :: The pairing segment for this edge. */ + /* */ + /* serif :: The primary segment for serifs. */ + /* */ + /* num_linked :: The number of other segments that link to this one. */ + /* */ + /* score :: Used to score the segment when selecting them. */ + /* */ + struct AH_Segment + { + AH_Edge_Flags flags; + AH_Direction dir; + + AH_Point* first; /* first point in edge segment */ + AH_Point* last; /* last point in edge segment */ + AH_Point** contour; /* ptr to first point of segment's contour */ + + FT_Pos pos; /* position of segment */ + FT_Pos min_coord; /* minimum coordinate of segment */ + FT_Pos max_coord; /* maximum coordinate of segment */ + + AH_Edge* edge; + AH_Segment* edge_next; + + AH_Segment* link; /* link segment */ + AH_Segment* serif; /* primary segment for serifs */ + FT_Pos num_linked; /* number of linked segments */ + FT_Int score; + }; + + + /*************************************************************************/ + /* */ + /* */ + /* AH_Edge */ + /* */ + /* */ + /* A structure used to describe an edge, which really is a horizontal */ + /* or vertical coordinate to be hinted depending on the segments */ + /* located on it. */ + /* */ + /* */ + /* flags :: The segment edge flags (straight, rounded, etc.). */ + /* */ + /* dir :: The main segment direction on this edge. */ + /* */ + /* first :: The first edge segment. */ + /* */ + /* last :: The last edge segment. */ + /* */ + /* fpos :: The original edge position in font units. */ + /* */ + /* opos :: The original scaled edge position. */ + /* */ + /* pos :: The hinted edge position. */ + /* */ + /* link :: The linked edge. */ + /* */ + /* serif :: The serif edge. */ + /* */ + /* num_paired :: The number of other edges that pair to this one. */ + /* */ + /* score :: Used to score the edge when selecting them. */ + /* */ + /* blue_edge :: Indicate the blue zone edge this edge is related to. */ + /* Only set for some of the horizontal edges in a Latin */ + /* font. */ + /* */ + struct AH_Edge + { + AH_Edge_Flags flags; + AH_Direction dir; + + AH_Segment* first; + AH_Segment* last; + + FT_Pos fpos; + FT_Pos opos; + FT_Pos pos; + + AH_Edge* link; + AH_Edge* serif; + FT_Int num_linked; + + FT_Int score; + FT_Pos* blue_edge; + }; + + + /* an outline as seen by the hinter */ + typedef struct AH_Outline_ + { + FT_Memory memory; + + AH_Direction vert_major_dir; /* vertical major direction */ + AH_Direction horz_major_dir; /* horizontal major direction */ + + FT_Fixed x_scale; + FT_Fixed y_scale; + FT_Pos edge_distance_threshold; + + FT_Int max_points; + FT_Int num_points; + AH_Point* points; + + FT_Int max_contours; + FT_Int num_contours; + AH_Point** contours; + + FT_Int num_hedges; + AH_Edge* horz_edges; + + FT_Int num_vedges; + AH_Edge* vert_edges; + + FT_Int num_hsegments; + AH_Segment* horz_segments; + + FT_Int num_vsegments; + AH_Segment* vert_segments; + + } AH_Outline; + + +#define ah_blue_capital_top 0 /* THEZOCQS */ +#define ah_blue_capital_bottom ( ah_blue_capital_top + 1 ) /* HEZLOCUS */ +#define ah_blue_small_top ( ah_blue_capital_bottom + 1 ) /* xzroesc */ +#define ah_blue_small_bottom ( ah_blue_small_top + 1 ) /* xzroesc */ +#define ah_blue_small_minor ( ah_blue_small_bottom + 1 ) /* pqgjy */ +#define ah_blue_max ( ah_blue_small_minor + 1 ) + + typedef FT_Int AH_Blue; + + +#define ah_hinter_monochrome 1 +#define ah_hinter_optimize 2 + + typedef FT_Int AH_Hinter_Flags; + + + /*************************************************************************/ + /* */ + /* */ + /* AH_Globals */ + /* */ + /* */ + /* Holds the global metrics for a given font face (be it in design */ + /* units or scaled pixel values). */ + /* */ + /* */ + /* num_widths :: The number of widths. */ + /* */ + /* num_heights :: The number of heights. */ + /* */ + /* widths :: Snap widths, including standard one. */ + /* */ + /* heights :: Snap height, including standard one. */ + /* */ + /* blue_refs :: The reference positions of blue zones. */ + /* */ + /* blue_shoots :: The overshoot positions of blue zones. */ + /* */ + typedef struct AH_Globals_ + { + FT_Int num_widths; + FT_Int num_heights; + + FT_Pos widths [AH_MAX_WIDTHS]; + FT_Pos heights[AH_MAX_HEIGHTS]; + + FT_Pos blue_refs [ah_blue_max]; + FT_Pos blue_shoots[ah_blue_max]; + + } AH_Globals; + + + /*************************************************************************/ + /* */ + /* */ + /* AH_Face_Globals */ + /* */ + /* */ + /* Holds the complete global metrics for a given font face (i.e., the */ + /* design units version + a scaled version + the current scales */ + /* used). */ + /* */ + /* */ + /* face :: A handle to the source face object */ + /* */ + /* design :: The globals in font design units. */ + /* */ + /* scaled :: Scaled globals in sub-pixel values. */ + /* */ + /* x_scale :: The current horizontal scale. */ + /* */ + /* y_scale :: The current vertical scale. */ + /* */ + typedef struct AH_Face_Globals_ + { + FT_Face face; + AH_Globals design; + AH_Globals scaled; + FT_Fixed x_scale; + FT_Fixed y_scale; + FT_Bool control_overshoot; + + } AH_Face_Globals; + + + typedef struct AH_Hinter + { + FT_Memory memory; + AH_Hinter_Flags flags; + + FT_Int algorithm; + FT_Face face; + + AH_Face_Globals* globals; + + AH_Outline* glyph; + + AH_Loader* loader; + FT_Vector pp1; + FT_Vector pp2; + + FT_Bool transformed; + FT_Vector trans_delta; + FT_Matrix trans_matrix; + + } AH_Hinter; + + +#ifdef __cplusplus + } +#endif + + +#endif /* AHTYPES_H */ + + +/* END */ Index: xc/extras/freetype2/src/autohint/autohint.c diff -u /dev/null xc/extras/freetype2/src/autohint/autohint.c:1.1.1.1 --- /dev/null Mon Dec 18 14:22:34 2000 +++ xc/extras/freetype2/src/autohint/autohint.c Fri Dec 8 16:26:19 2000 @@ -0,0 +1,43 @@ +/***************************************************************************/ +/* */ +/* autohint.c */ +/* */ +/* Automatic Hinting wrapper (body only). */ +/* */ +/* Copyright 2000 Catharon Productions Inc. */ +/* Author: David Turner */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#define FT_MAKE_OPTION_SINGLE_OBJECT + +#ifdef FT_FLAT_COMPILE + +#include "ahangles.c" +#include "ahglyph.c" +#include "ahglobal.c" +#include "ahhint.c" +#include "ahmodule.c" + +#else + +#include +#include +#include +#include +#include + +#endif + + +/* END */ Index: xc/extras/freetype2/src/autohint/mather.py diff -u /dev/null xc/extras/freetype2/src/autohint/mather.py:1.1.1.1 --- /dev/null Mon Dec 18 14:22:34 2000 +++ xc/extras/freetype2/src/autohint/mather.py Fri Dec 8 16:26:19 2000 @@ -0,0 +1,78 @@ +#!/usr/bin/env python +# + +# +# autohint math table builder +# + + +# 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. + + +import math + +ag_pi = 256 + +def print_arctan( atan_bits ): + atan_base = 1 << atan_bits + + print " static AH_Angle ag_arctan[1L << AG_ATAN_BITS] =" + print " {" + + count = 0 + line = " " + + for n in range( atan_base ): + comma = "," + if ( n == atan_base - 1 ): + comma = "" + + angle = math.atan( n * 1.0 / atan_base ) / math.pi * ag_pi + line = line + " " + repr( int( angle + 0.5 ) ) + comma + count = count + 1; + if ( count == 8 ): + count = 0 + print line + line = " " + + if ( count > 0 ): + print line + print " };" + + +# This routine is not used currently. +# +def print_sines(): + print " static FT_Fixed ah_sines[AG_HALF_PI + 1] =" + print " {" + + count = 0 + line = " " + + for n in range( ag_pi / 2 ): + sinus = math.sin( n * math.pi / ag_pi ) + line = line + " " + repr( int( 65536.0 * sinus ) ) + "," + count = count + 1 + if ( count == 8 ): + count = 0 + print line + line = " " + + if ( count > 0 ): + print line + print " 65536" + print " };" + + +print_arctan( 8 ) +print + + +# END Index: xc/extras/freetype2/src/autohint/module.mk diff -u /dev/null xc/extras/freetype2/src/autohint/module.mk:1.1.1.1 --- /dev/null Mon Dec 18 14:22:34 2000 +++ xc/extras/freetype2/src/autohint/module.mk Fri Dec 8 16:26:19 2000 @@ -0,0 +1,25 @@ +# +# FreeType 2 auto-hinter module definition +# + + +# Copyright 2000 Catharon Productions Inc. +# Author: David Turner +# +# 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. + + +make_module_list: add_autohint_module + +add_autohint_module: + $(OPEN_DRIVER)autohint_module_class$(CLOSE_DRIVER) + $(ECHO_DRIVER)autohint $(ECHO_DRIVER_DESC)automatic hinting module$(ECHO_DRIVER_DONE) + +# EOF Index: xc/extras/freetype2/src/autohint/rules.mk diff -u /dev/null xc/extras/freetype2/src/autohint/rules.mk:1.1.1.1 --- /dev/null Mon Dec 18 14:22:34 2000 +++ xc/extras/freetype2/src/autohint/rules.mk Fri Dec 8 16:26:19 2000 @@ -0,0 +1,77 @@ +# +# FreeType 2 auto-hinter module configuration rules +# + + +# Copyright 2000 Catharon Productions Inc. +# Author: David Turner +# +# 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. + + +# AUTO driver directory +# +AUTO_DIR := $(SRC_)autohint +AUTO_DIR_ := $(AUTO_DIR)$(SEP) + + +# compilation flags for the driver +# +AUTO_COMPILE := $(FT_COMPILE) + + +# AUTO driver sources (i.e., C files) +# +AUTO_DRV_SRC := $(AUTO_DIR_)ahangles.c \ + $(AUTO_DIR_)ahglobal.c \ + $(AUTO_DIR_)ahglyph.c \ + $(AUTO_DIR_)ahhint.c \ + $(AUTO_DIR_)ahmodule.c + +# AUTO driver headers +# +AUTO_DRV_H := $(AUTO_DRV_SRC:%c=%h) \ + $(AUTO_DIR_)ahloader.h \ + $(AUTO_DIR_)ahtypes.h + + +# AUTO driver object(s) +# +# AUTO_DRV_OBJ_M is used during `multi' builds. +# AUTO_DRV_OBJ_S is used during `single' builds. +# +AUTO_DRV_OBJ_M := $(AUTO_DRV_SRC:$(AUTO_DIR_)%.c=$(OBJ_)%.$O) +AUTO_DRV_OBJ_S := $(OBJ_)autohint.$O + +# AUTO driver source file for single build +# +AUTO_DRV_SRC_S := $(AUTO_DIR_)autohint.c + + +# AUTO driver - single object +# +$(AUTO_DRV_OBJ_S): $(AUTO_DRV_SRC_S) $(AUTO_DRV_SRC) \ + $(FREETYPE_H) $(AUTO_DRV_H) + $(AUTO_COMPILE) $T$@ $(AUTO_DRV_SRC_S) + + +# AUTO driver - multiple objects +# +$(OBJ_)%.$O: $(AUTO_DIR_)%.c $(FREETYPE_H) $(AUTO_DRV_H) + $(AUTO_COMPILE) $T$@ $< + + +# update main driver object lists +# +DRV_OBJS_S += $(AUTO_DRV_OBJ_S) +DRV_OBJS_M += $(AUTO_DRV_OBJ_M) + + +# EOF Index: xc/extras/freetype2/src/base/ftbase.c diff -u /dev/null xc/extras/freetype2/src/base/ftbase.c:1.1.1.1 --- /dev/null Mon Dec 18 14:22:34 2000 +++ xc/extras/freetype2/src/base/ftbase.c Fri Dec 8 16:26:19 2000 @@ -0,0 +1,42 @@ +/***************************************************************************/ +/* */ +/* ftbase.c */ +/* */ +/* Single object library component (body only). */ +/* */ +/* Copyright 1996-2000 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifdef FT_FLAT_COMPILE + +#include "ftcalc.c" +#include "ftobjs.c" +#include "ftstream.c" +#include "ftlist.c" +#include "ftoutln.c" +#include "ftextend.c" +#include "ftnames.c" + +#else /* FT_FLAT_COMPILE */ + +#include +#include +#include +#include +#include +#include +#include + +#endif /* FT_FLAT_COMPILE */ + + +/* END */ Index: xc/extras/freetype2/src/base/ftbbox.c diff -u /dev/null xc/extras/freetype2/src/base/ftbbox.c:1.1.1.1 --- /dev/null Mon Dec 18 14:22:34 2000 +++ xc/extras/freetype2/src/base/ftbbox.c Fri Dec 8 16:26:19 2000 @@ -0,0 +1,432 @@ +/***************************************************************************/ +/* */ +/* ftbbox.c */ +/* */ +/* FreeType bbox computation (body). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* This component has a _single_ role: to compute exact outline bounding */ + /* boxes. */ + /* */ + /*************************************************************************/ + + +#include +#include +#include + + + typedef struct TBBox_Rec_ + { + FT_Vector last; + FT_BBox bbox; + + } TBBox_Rec; + + + /*************************************************************************/ + /* */ + /* */ + /* BBox_Move_To */ + /* */ + /* */ + /* 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 */ + /* the cbox as the starting bbox which must be refined. */ + /* */ + /* */ + /* to :: A pointer to the destination vector. */ + /* */ + /* */ + /* user :: A pointer to the current walk context. */ + /* */ + /* */ + /* 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 ) + + + /*************************************************************************/ + /* */ + /* */ + /* BBox_Conic_Check */ + /* */ + /* */ + /* 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. */ + /* */ + /* */ + /* y1 :: The start coordinate. */ + /* y2 :: The coordinate of the control point. */ + /* y3 :: The end coordinate. */ + /* */ + /* */ + /* 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 ) + { + if ( y2 == y1 ) /* Flat arc */ + goto Suite; + } + else 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; + } + + + /*************************************************************************/ + /* */ + /* */ + /* BBox_Conic_To */ + /* */ + /* */ + /* 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. */ + /* */ + /* */ + /* control :: A pointer to a control point. */ + /* to :: A pointer to the destination vector. */ + /* */ + /* */ + /* user :: The address of the current walk context. */ + /* */ + /* */ + /* Always 0. Needed for the interface only. */ + /* */ + /* */ + /* 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; + } + + + /*************************************************************************/ + /* */ + /* */ + /* BBox_Cubic_Check */ + /* */ + /* */ + /* 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 accuracies. */ + /* */ + /* */ + /* p1 :: The start coordinate. */ + /* p2 :: The coordinate of the first control point. */ + /* p3 :: The coordinate of the second control point. */ + /* p4 :: The end coordinate. */ + /* */ + /* */ + /* min :: The address of the current minimum. */ + /* max :: The address of the current maximum. */ + /* */ + 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[33], *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 ); + } + + + /*************************************************************************/ + /* */ + /* */ + /* BBox_Cubic_To */ + /* */ + /* */ + /* 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. */ + /* */ + /* */ + /* control1 :: A pointer to the first control point. */ + /* control2 :: A pointer to the second control point. */ + /* to :: A pointer to the destination vector. */ + /* */ + /* */ + /* user :: The address of the current walk context. */ + /* */ + /* */ + /* Always 0. Needed for the interface only. */ + /* */ + /* */ + /* In the case of a non-monotonous arc, we don't compute directly */ + /* extremum coordinates, we subdivise 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; + + 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 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, &interface, &user ); + if ( error ) + return error; + + *abbox = user.bbox; + } + else + *abbox = bbox; + + return FT_Err_Ok; + } + + +/* END */ Index: xc/extras/freetype2/src/base/ftcalc.c diff -u /dev/null xc/extras/freetype2/src/base/ftcalc.c:1.1.1.1 --- /dev/null Mon Dec 18 14:22:34 2000 +++ xc/extras/freetype2/src/base/ftcalc.c Fri Dec 8 16:26:19 2000 @@ -0,0 +1,541 @@ +/***************************************************************************/ +/* */ +/* ftcalc.c */ +/* */ +/* Arithmetic computations (body). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + /*************************************************************************/ + /* */ + /* 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(), and FT_DivFix() are declared in freetype.h. */ + /* */ + /*************************************************************************/ + + +#include +#include +#include /* for ABS() */ + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an 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 + + +#ifdef FT_CONFIG_OPTION_OLD_CALCS + + static const FT_Long ft_square_roots[63] = + { + 1L, 1L, 2L, 3L, 4L, 5L, 8L, 11L, + 16L, 22L, 32L, 45L, 64L, 90L, 128L, 181L, + 256L, 362L, 512L, 724L, 1024L, 1448L, 2048L, 2896L, + 4096L, 5892L, 8192L, 11585L, 16384L, 23170L, 32768L, 46340L, + + 65536L, 92681L, 131072L, 185363L, 262144L, 370727L, + 524288L, 741455L, 1048576L, 1482910L, 2097152L, 2965820L, + 4194304L, 5931641L, 8388608L, 11863283L, 16777216L, 23726566L, + + 33554432L, 47453132L, 67108864L, 94906265L, + 134217728L, 189812531L, 268435456L, 379625062L, + 536870912L, 759250125L, 1073741824L, 1518500250L, + 2147483647L + }; + +#else + + /* 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_CALCS */ + + +#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; + + + s = 1; + if ( a < 0 ) { a = -a; s = -s; } + if ( b < 0 ) { b = -b; s = -s; } + if ( c < 0 ) { c = -c; s = -s; } + + return s * ( c > 0 ? ( (FT_Int64)a * b + ( c >> 1 ) ) / c + : 0x7FFFFFFFL ); + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Long ) FT_MulFix( FT_Long a, + FT_Long b ) + { + FT_Int s; + + + s = 1; + if ( a < 0 ) { a = -a; s = -s; } + if ( b < 0 ) { b = -b; s = -s; } + + return s * (FT_Long)( ( (FT_Int64)a * b + 0x8000 ) >> 16 ); + } + + + /* 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 = ABS(a); + s ^= b; b = ABS(b); + + if ( b == 0 ) + /* check for division by 0 */ + q = 0x7FFFFFFFL; + else + /* compute result directly */ + q = ( (FT_Int64)a << 16 ) / b; + + return (FT_Int32)( s < 0 ? -q : q ); + } + + +#ifdef FT_CONFIG_OPTION_OLD_CALCS + + /* a helper function for FT_Sqrt64() */ + + static + int ft_order64( FT_Int64 z ) + { + int j = 0; + + + while ( z ) + { + z = (unsigned FT_INT64)z >> 1; + j++; + } + return j - 1; + } + + + /* documentation is in ftcalc.h */ + + FT_EXPORT_DEF( FT_Int32 ) FT_Sqrt64( FT_Int64 l ) + { + FT_Int64 r, s; + + + if ( l <= 0 ) return 0; + if ( l == 1 ) return 1; + + r = ft_square_roots[ft_order64( l )]; + + do + { + s = r; + r = ( r + l / r ) >> 1; + + } while ( r > s || r * r > l ); + + return r; + } + + + FT_EXPORT_DEF( FT_Int32 ) FT_SqrtFixed( FT_Int32 x ) + { + FT_Int64 z; + + + z = (FT_Int64)(x) << 16; + return FT_Sqrt64( z ); + } + +#endif /* FT_CONFIG_OPTION_OLD_CALCS */ + + +#else /* FT_LONG64 */ + + + /* documentation is in freetype.h */ + + 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 = ABS( a ); + s ^= b; b = ABS( b ); + s ^= c; c = ABS( c ); + + if ( a <= 46340 && b <= 46340 && 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 = (FT_Int32)( c >> 31 ); + temp2.lo = (FT_UInt32)( c / 2 ); + FT_Add64( &temp, &temp2, &temp ); + a = FT_Div64by32( &temp, c ); + } + else + a = 0x7FFFFFFFL; + + return ( s < 0 ? -a : a ); + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Long ) FT_MulFix( FT_Long a, + FT_Long b ) + { + FT_Long s; + FT_ULong ua, ub; + + + if ( a == 0 || b == 0x10000L ) + return a; + + s = a; a = ABS(a); + s ^= b; b = ABS(b); + + ua = (FT_ULong)a; + ub = (FT_ULong)b; + + if ( ua <= 2048 && ub <= 1048576L ) + { + ua = ( ua * ub + 0x8000 ) >> 16; + } + else + { + FT_ULong al = ua & 0xFFFF; + + + ua = ( ua >> 16 ) * ub + + al * ( ub >> 16 ) + + ( al * ( ub & 0xFFFF ) >> 16 ); + } + + return ( s < 0 ? -(FT_Long)ua : ua ); + } + + + /* 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 = ABS(a); + s ^= b; b = 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 ) / (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 = (FT_Int32)( b >> 31 ); + temp2.lo = (FT_UInt32)( b / 2 ); + FT_Add64( &temp, &temp2, &temp ); + q = FT_Div64by32( &temp, b ); + } + + return ( s < 0 ? -(FT_Int32)q : (FT_Int32)q ); + } + + + /* documentation is in ftcalc.h */ + + FT_EXPORT_DEF( 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 ftcalc.h */ + + FT_EXPORT_DEF( void ) FT_MulTo64( FT_Int32 x, + FT_Int32 y, + FT_Int64 *z ) + { + FT_Int32 s; + + + s = x; x = ABS( x ); + s ^= y; y = ABS( y ); + + { + FT_UInt32 lo1, hi1, lo2, hi2, lo, hi, i1, i2; + + + lo1 = x & 0x0000FFFF; hi1 = x >> 16; + lo2 = y & 0x0000FFFF; hi2 = y >> 16; + + lo = lo1 * lo2; + i1 = lo1 * hi2; + i2 = lo2 * hi1; + hi = hi1 * hi2; + + /* Check carry overflow of i1 + i2 */ + i1 += i2; + if ( i1 < i2 ) + hi += 1L << 16; + + hi += i1 >> 16; + i1 = i1 << 16; + + /* Check carry overflow of i1 + lo */ + lo += i1; + hi += ( lo < i1 ); + + z->lo = lo; + z->hi = hi; + } + + if ( s < 0 ) + { + z->lo = (FT_UInt32)-(FT_Int32)z->lo; + z->hi = ~z->hi + !( z->lo ); + } + } + + + /* documentation is in ftcalc.h */ + + 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 = 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 ); + } + + +#ifdef FT_CONFIG_OPTION_OLD_CALCS + + + /* two helper functions for FT_Sqrt64() */ + + static + void FT_Sub64( FT_Int64* x, + FT_Int64* y, + FT_Int64* z ) + { + register FT_UInt32 lo, hi; + + + lo = x->lo - y->lo; + hi = x->hi - y->hi - ( (FT_Int32)lo < 0 ); + + z->lo = lo; + z->hi = hi; + } + + + static + int ft_order64( FT_Int64* z ) + { + FT_UInt32 i; + int j; + + + i = z->lo; + j = 0; + if ( z->hi ) + { + i = z->hi; + j = 32; + } + + while ( i > 0 ) + { + i >>= 1; + j++; + } + return j - 1; + } + + + /* documentation is in ftcalc.h */ + + FT_EXPORT_DEF( FT_Int32 ) FT_Sqrt64( FT_Int64* l ) + { + FT_Int64 l2; + FT_Int32 r, s; + + + if ( (FT_Int32)l->hi < 0 || + ( l->hi == 0 && l->lo == 0 ) ) + return 0; + + s = ft_order64( l ); + if ( s == 0 ) + return 1; + + r = ft_square_roots[s]; + do + { + s = r; + r = ( r + FT_Div64by32( l, r ) ) >> 1; + FT_MulTo64( r, r, &l2 ); + FT_Sub64 ( l, &l2, &l2 ); + + } while ( r > s || (FT_Int32)l2.hi < 0 ); + + return r; + } + + + FT_EXPORT_DEF( FT_Int32 ) FT_SqrtFixed( FT_Int32 x ) + { + FT_Int64 z; + + + z.hi = (FT_UInt32)((FT_Int32)(x) >> 16); + z.lo = (FT_UInt32)( x << 16 ); + return FT_Sqrt64( &z ); + } + + +#endif /* FT_CONFIG_OPTION_OLD_CALCS */ + +#endif /* FT_LONG64 */ + + +/* END */ Index: xc/extras/freetype2/src/base/ftdebug.c diff -u /dev/null xc/extras/freetype2/src/base/ftdebug.c:1.1.1.1 --- /dev/null Mon Dec 18 14:22:34 2000 +++ xc/extras/freetype2/src/base/ftdebug.c Fri Dec 8 16:26:19 2000 @@ -0,0 +1,109 @@ +/***************************************************************************/ +/* */ +/* ftdebug.c */ +/* */ +/* Debugging and logging component (body). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* 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 + +#ifdef FT_DEBUG_LEVEL_TRACE + char ft_trace_levels[trace_max]; +#endif + + +#if defined( FT_DEBUG_LEVEL_ERROR ) || defined( FT_DEBUG_LEVEL_TRACE ) + + +#include +#include +#include + + + FT_EXPORT_DEF( void ) FT_Message( const char* fmt, ... ) + { + va_list ap; + + + va_start( ap, fmt ); + vprintf( fmt, ap ); + va_end( ap ); + } + + + FT_EXPORT_DEF( void ) FT_Panic( const char* fmt, ... ) + { + va_list ap; + + + va_start( ap, fmt ); + vprintf( fmt, ap ); + va_end( ap ); + + exit( EXIT_FAILURE ); + } + + +#ifdef FT_DEBUG_LEVEL_TRACE + + FT_EXPORT_DEF( void ) FT_SetTraceLevel( FT_Trace component, + char level ) + { + if ( component >= trace_max ) + return; + + /* if component is `trace_any', change _all_ levels at once */ + if ( component == trace_any ) + { + int n; + + + for ( n = trace_any; n < trace_max; n++ ) + ft_trace_levels[n] = level; + } + else /* otherwise, only change individual component */ + ft_trace_levels[component] = level; + } + +#endif /* FT_DEBUG_LEVEL_TRACE */ + +#endif /* FT_DEBUG_LEVEL_TRACE || FT_DEBUG_LEVEL_ERROR */ + + +/* END */ Index: xc/extras/freetype2/src/base/ftextend.c diff -u /dev/null xc/extras/freetype2/src/base/ftextend.c:1.1.1.1 --- /dev/null Mon Dec 18 14:22:35 2000 +++ xc/extras/freetype2/src/base/ftextend.c Fri Dec 8 16:26:19 2000 @@ -0,0 +1,301 @@ +/***************************************************************************/ +/* */ +/* ftextend.h */ +/* */ +/* FreeType extensions implementation (body). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + /*************************************************************************/ + /* */ + /* This is an updated version of the extension component, now located */ + /* in the main library's source directory. It allows the dynamic */ + /* registration/use of various face object extensions through a simple */ + /* API. */ + /* */ + /*************************************************************************/ + + +#include +#include + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_extend + + + typedef struct FT_Extension_Registry_ + { + FT_Int num_extensions; + FT_Long cur_offset; + FT_Extension_Class classes[FT_MAX_EXTENSIONS]; + + } FT_Extension_Registry; + + + /*************************************************************************/ + /* */ + /* */ + /* FT_Init_Extensions */ + /* */ + /* */ + /* Initializes the extension component. */ + /* */ + /* */ + /* driver :: A handle to the driver object. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF + FT_Error FT_Init_Extensions( FT_Driver driver ) + { + FT_Error error; + FT_Memory memory; + FT_Extension_Registry* registry; + + + memory = driver->root.library->memory; + if ( ALLOC( registry, sizeof ( *registry ) ) ) + return error; + + registry->num_extensions = 0; + registry->cur_offset = 0; + driver->extensions = registry; + + FT_TRACE2(( "FT_Init_Extensions: success\n" )); + + return FT_Err_Ok; + } + + + /*************************************************************************/ + /* */ + /* */ + /* FT_Done_Extensions */ + /* */ + /* */ + /* Finalizes the extension component. */ + /* */ + /* */ + /* driver :: A handle to the driver object. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF + FT_Error FT_Done_Extensions( FT_Driver driver ) + { + FT_Memory memory = driver->root.memory; + + + FREE( driver->extensions ); + return FT_Err_Ok; + } + + + /* documentation is in ftextend.h */ + + FT_EXPORT_DEF( FT_Error ) FT_Register_Extension( + FT_Driver driver, + FT_Extension_Class* clazz ) + { + FT_Extension_Registry* registry; + + + if ( !driver ) + return FT_Err_Invalid_Driver_Handle; + + if ( !clazz ) + return FT_Err_Invalid_Argument; + + registry = (FT_Extension_Registry*)driver->extensions; + if ( registry ) + { + FT_Int n = registry->num_extensions; + FT_Extension_Class* cur = registry->classes + n; + + + if ( n >= FT_MAX_EXTENSIONS ) + return FT_Err_Too_Many_Extensions; + + *cur = *clazz; + + cur->offset = registry->cur_offset; + + registry->num_extensions++; + registry->cur_offset += + ( cur->size + FT_ALIGNMENT - 1 ) & -FT_ALIGNMENT; + + FT_TRACE1(( "FT_Register_Extension: `%s' successfully registered\n", + cur->id )); + } + + return FT_Err_Ok; + } + + + /* documentation is in ftextend.h */ + + FT_EXPORT_DEF( void* ) FT_Get_Extension( + FT_Face face, + const char* extension_id, + void** extension_interface ) + { + FT_Extension_Registry* registry; + + + if ( !face || !extension_id || !extension_interface ) + return 0; + + registry = (FT_Extension_Registry*)face->driver->extensions; + if ( registry && face->extensions ) + { + FT_Extension_Class* cur = registry->classes; + FT_Extension_Class* limit = cur + registry->num_extensions; + + + for ( ; cur < limit; cur++ ) + if ( strcmp( cur->id, extension_id ) == 0 ) + { + *extension_interface = cur->interface; + + FT_TRACE1(( "FT_Get_Extension: got `%s'\n", extension_id )); + + return (void*)((char*)face->extensions + cur->offset); + } + } + + /* could not find the extension id */ + + FT_ERROR(( "FT_Get_Extension: couldn't find `%s'\n", extension_id )); + + *extension_interface = 0; + + return 0; + } + + + /*************************************************************************/ + /* */ + /* */ + /* FT_Destroy_Extensions */ + /* */ + /* */ + /* Destroys all extensions within a face object. */ + /* */ + /* */ + /* face :: A handle to the face object. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + /* */ + /* Called by the face object destructor. */ + /* */ + FT_LOCAL_DEF + FT_Error FT_Destroy_Extensions( FT_Face face ) + { + FT_Extension_Registry* registry; + FT_Memory memory; + + + registry = (FT_Extension_Registry*)face->driver->extensions; + if ( registry && face->extensions ) + { + FT_Extension_Class* cur = registry->classes; + FT_Extension_Class* limit = cur + registry->num_extensions; + + + for ( ; cur < limit; cur++ ) + { + char* ext = (char*)face->extensions + cur->offset; + + if ( cur->finalize ) + cur->finalize( ext, face ); + } + + memory = face->driver->root.memory; + FREE( face->extensions ); + } + + return FT_Err_Ok; + } + + + /*************************************************************************/ + /* */ + /* */ + /* FT_Create_Extensions */ + /* */ + /* */ + /* Creates an extension object within a face object for all */ + /* registered extensions. */ + /* */ + /* */ + /* face :: A handle to the face object. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + /* */ + /* Called by the face object constructor. */ + /* */ + FT_LOCAL_DEF + FT_Error FT_Create_Extensions( FT_Face face ) + { + FT_Extension_Registry* registry; + FT_Memory memory; + FT_Error error; + + + face->extensions = 0; + + /* load extensions registry; exit successfully if none is there */ + + registry = (FT_Extension_Registry*)face->driver->extensions; + if ( !registry ) + return FT_Err_Ok; + + memory = face->driver->root.memory; + if ( ALLOC( face->extensions, registry->cur_offset ) ) + return error; + + { + FT_Extension_Class* cur = registry->classes; + FT_Extension_Class* limit = cur + registry->num_extensions; + + + for ( ; cur < limit; cur++ ) + { + char* ext = (char*)face->extensions + cur->offset; + + if ( cur->init ) + { + error = cur->init( ext, face ); + if ( error ) + break; + } + } + } + + return error; + } + + +/* END */ Index: xc/extras/freetype2/src/base/ftglyph.c diff -u /dev/null xc/extras/freetype2/src/base/ftglyph.c:1.1.1.1 --- /dev/null Mon Dec 18 14:22:35 2000 +++ xc/extras/freetype2/src/base/ftglyph.c Fri Dec 8 16:26:19 2000 @@ -0,0 +1,658 @@ +/***************************************************************************/ +/* */ +/* ftglyph.c */ +/* */ +/* FreeType convenience functions to handle glyphs (body). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + /*************************************************************************/ + /* */ + /* 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 +#include +#include + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an 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( 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 ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + + static + FT_Error ft_bitmap_copy( FT_Memory memory, + FT_Bitmap* source, + FT_Bitmap* target ) + { + FT_Error error; + FT_Int pitch = source->pitch; + FT_ULong size; + + + *target = *source; + + if ( pitch < 0 ) + pitch = -pitch; + + size = (FT_ULong)( pitch * source->rows ); + + if ( !ALLOC( target->buffer, size ) ) + MEM_Copy( target->buffer, source->buffer, size ); + + return error; + } + + + static + FT_Error ft_bitmap_glyph_init( FT_BitmapGlyph glyph, + FT_GlyphSlot slot ) + { + FT_Error error = FT_Err_Ok; + FT_Library library = FT_GLYPH(glyph)->library; + FT_Memory memory = library->memory; + + + if ( slot->format != ft_glyph_format_bitmap ) + { + error = FT_Err_Invalid_Glyph_Format; + goto Exit; + } + + /* grab the bitmap in the slot - do lazy copying whenever possible */ + glyph->bitmap = slot->bitmap; + glyph->left = slot->bitmap_left; + glyph->top = slot->bitmap_top; + + if ( slot->flags & ft_glyph_own_bitmap ) + slot->flags &= ~ft_glyph_own_bitmap; + else + { + /* copy the bitmap into a new buffer */ + error = ft_bitmap_copy( memory, &slot->bitmap, &glyph->bitmap ); + } + + Exit: + return error; + } + + + static + FT_Error ft_bitmap_glyph_copy( FT_BitmapGlyph source, + FT_BitmapGlyph target ) + { + FT_Memory memory = source->root.library->memory; + + + target->left = source->left; + target->top = source->top; + + return ft_bitmap_copy( memory, &source->bitmap, &target->bitmap ); + } + + + static + void ft_bitmap_glyph_done( FT_BitmapGlyph glyph ) + { + FT_Memory memory = FT_GLYPH(glyph)->library->memory; + + + FREE( glyph->bitmap.buffer ); + } + + + static + void ft_bitmap_glyph_bbox( FT_BitmapGlyph glyph, + FT_BBox* cbox ) + { + 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 ); + } + + + const FT_Glyph_Class ft_bitmap_glyph_class = + { + sizeof( FT_BitmapGlyphRec ), + ft_glyph_format_bitmap, + + (FT_Glyph_Init_Func) ft_bitmap_glyph_init, + (FT_Glyph_Done_Func) ft_bitmap_glyph_done, + (FT_Glyph_Copy_Func) ft_bitmap_glyph_copy, + (FT_Glyph_Transform_Func)0, + (FT_Glyph_BBox_Func) ft_bitmap_glyph_bbox, + (FT_Glyph_Prepare_Func) 0 + }; + + + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** FT_OutlineGlyph support ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + + + static + FT_Error ft_outline_glyph_init( FT_OutlineGlyph glyph, + FT_GlyphSlot slot ) + { + 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; + + /* copy it */ + MEM_Copy( target->points, source->points, + source->n_points * sizeof ( FT_Vector ) ); + + MEM_Copy( target->tags, source->tags, + source->n_points * sizeof ( FT_Byte ) ); + + MEM_Copy( target->contours, source->contours, + source->n_contours * sizeof ( FT_Short ) ); + + /* copy all flags, except the `ft_outline_owner' one */ + target->flags = source->flags | ft_outline_owner; + + Exit: + return error; + } + + + static + void ft_outline_glyph_done( FT_OutlineGlyph glyph ) + { + FT_Outline_Done( FT_GLYPH( glyph )->library, &glyph->outline ); + } + + + static + FT_Error ft_outline_glyph_copy( FT_OutlineGlyph source, + FT_OutlineGlyph 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; + } + + + static + void ft_outline_glyph_transform( FT_OutlineGlyph glyph, + FT_Matrix* matrix, + FT_Vector* delta ) + { + if ( matrix ) + FT_Outline_Transform( &glyph->outline, matrix ); + + if ( delta ) + FT_Outline_Translate( &glyph->outline, delta->x, delta->y ); + } + + + static + void ft_outline_glyph_bbox( FT_OutlineGlyph glyph, + FT_BBox* bbox ) + { + FT_Outline_Get_CBox( &glyph->outline, bbox ); + } + + + static + FT_Error ft_outline_glyph_prepare( FT_OutlineGlyph glyph, + FT_GlyphSlot slot ) + { + slot->format = ft_glyph_format_outline; + slot->outline = glyph->outline; + slot->outline.flags &= ~ft_outline_owner; + + return FT_Err_Ok; + } + + + const FT_Glyph_Class ft_outline_glyph_class = + { + sizeof( FT_OutlineGlyphRec ), + ft_glyph_format_outline, + + (FT_Glyph_Init_Func) ft_outline_glyph_init, + (FT_Glyph_Done_Func) ft_outline_glyph_done, + (FT_Glyph_Copy_Func) ft_outline_glyph_copy, + (FT_Glyph_Transform_Func)ft_outline_glyph_transform, + (FT_Glyph_BBox_Func) ft_outline_glyph_bbox, + (FT_Glyph_Prepare_Func) 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 ( !ALLOC( glyph, clazz->glyph_size ) ) + { + glyph->library = library; + glyph->clazz = clazz; + glyph->format = clazz->glyph_format; + + *aglyph = glyph; + } + + return error; + } + + + /* documentation is in ftglyph.h */ + + FT_EXPORT_DEF( FT_Error ) FT_Glyph_Copy( FT_Glyph source, + FT_Glyph *target ) + { + FT_Glyph copy; + FT_Error error; + const FT_Glyph_Class* clazz; + + + /* check arguments */ + if ( !target || !source || !source->clazz ) + { + error = FT_Err_Invalid_Argument; + goto Exit; + } + + *target = 0; + + clazz = source->clazz; + error = ft_new_glyph( source->library, clazz, © ); + if ( error ) + goto Exit; + + 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 = slot->library; + FT_Error error; + FT_Glyph glyph; + + const FT_Glyph_Class* clazz = 0; + + + if ( !slot ) + return FT_Err_Invalid_Slot_Handle; + + 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; + FT_Error error = FT_Err_Ok; + + + if ( !acbox || !glyph || !glyph->clazz ) + error = FT_Err_Invalid_Argument; + else + { + clazz = glyph->clazz; + if ( !clazz->glyph_bbox ) + error = FT_Err_Invalid_Glyph_Format; + else + { + /* retrieve bbox in 26.6 coordinates */ + clazz->glyph_bbox( glyph, acbox ); + + /* perform grid fitting if needed */ + if ( bbox_mode & ft_glyph_bbox_gridfit ) + { + acbox->xMin &= -64; + acbox->yMin &= -64; + acbox->xMax = ( acbox->xMax + 63 ) & -64; + acbox->yMax = ( acbox->yMax + 63 ) & -64; + } + + /* convert to integer pixels if needed */ + if ( bbox_mode & ft_glyph_bbox_truncate ) + { + 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_ULong render_mode, + FT_Vector* origin, + FT_Bool destroy ) + { + FT_GlyphSlotRec dummy; + FT_Error error; + FT_Glyph glyph; + FT_BitmapGlyph bitmap; + + 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; + if ( !clazz || !clazz->glyph_prepare ) + goto Bad; + + MEM_Set( &dummy, 0, sizeof ( dummy ) ); + dummy.library = glyph->library; + dummy.format = clazz->glyph_format; + + /* if `origin' is set, translate the glyph image */ + if ( origin ) + FT_Glyph_Transform( glyph, 0, origin ); + + /* create result bitmap glyph */ + error = ft_new_glyph( glyph->library, &ft_bitmap_glyph_class, + (FT_Glyph*)&bitmap ); + if ( error ) + goto Exit; + + /* prepare dummy slot for rendering */ + error = clazz->glyph_prepare( glyph, &dummy ); + if ( !error ) + error = FT_Render_Glyph_Internal( glyph->library, &dummy, render_mode ); + + if ( !destroy && origin ) + { + FT_Vector v; + + + v.x = -origin->x; + v.y = -origin->y; + FT_Glyph_Transform( glyph, 0, &v ); + } + + /* in case of success, copy the bitmap to the glyph bitmap */ + if ( !error ) + { + error = ft_bitmap_glyph_init( bitmap, &dummy ); + if ( error ) + { + /* this should never happen, but let's be safe */ + FT_Done_Glyph( FT_GLYPH( bitmap ) ); + goto Exit; + } + + /* copy advance */ + bitmap->root.advance = glyph->advance; + + if ( destroy ) + FT_Done_Glyph( glyph ); + + *the_glyph = FT_GLYPH( bitmap ); + } + + Exit: + 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 ); + + FREE( glyph ); + } + } + + +/* END */ Index: xc/extras/freetype2/src/base/ftinit.c diff -u /dev/null xc/extras/freetype2/src/base/ftinit.c:1.1.1.1 --- /dev/null Mon Dec 18 14:22:35 2000 +++ xc/extras/freetype2/src/base/ftinit.c Fri Dec 8 16:26:19 2000 @@ -0,0 +1,149 @@ +/***************************************************************************/ +/* */ +/* ftinit.c */ +/* */ +/* FreeType initialization layer (body). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + /*************************************************************************/ + /* */ + /* 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 +#include +#include +#include + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an 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 + +#undef FT_USE_MODULE +#define FT_USE_MODULE( x ) (const FT_Module_Class*)&x, + +static +const FT_Module_Class* const ft_default_modules[] = + { +#include + 0 + }; + + + /* documentation is in ftmodule.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 = %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_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 */ Index: xc/extras/freetype2/src/base/ftlist.c diff -u /dev/null xc/extras/freetype2/src/base/ftlist.c:1.1.1.1 --- /dev/null Mon Dec 18 14:22:35 2000 +++ xc/extras/freetype2/src/base/ftlist.c Fri Dec 8 16:26:19 2000 @@ -0,0 +1,209 @@ +/***************************************************************************/ +/* */ +/* ftlist.c */ +/* */ +/* Generic list support for FreeType (body). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + /*************************************************************************/ + /* */ + /* This file implements functions relative to list processing. Its */ + /* data structures are defined in `freetype/internal/ftlist.h'. */ + /* */ + /*************************************************************************/ + + +#include +#include +#include + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#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 ); + + FREE( cur ); + cur = next; + } + + list->head = 0; + list->tail = 0; + } + + +/* END */ Index: xc/extras/freetype2/src/base/ftmac.c diff -u /dev/null xc/extras/freetype2/src/base/ftmac.c:1.1.1.1 --- /dev/null Mon Dec 18 14:22:35 2000 +++ xc/extras/freetype2/src/base/ftmac.c Fri Dec 8 16:26:19 2000 @@ -0,0 +1,707 @@ +/***************************************************************************/ +/* */ +/* ftmac.c */ +/* */ +/* Mac FOND support. Written by just@letterror.com. */ +/* */ +/* Copyright 1996-2000 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: although the FOND driver sets face->num_faces field to the + number of available fonts, but the Type 1 driver sets it to 1 anyway. + So this field is currently not reliable, and I don't see a clean way + to resolve that. The face_index argument translates to + Get1IndResource( 'FOND', face_index + 1 ); + so clients should figure out the resource index of the FOND. + (I'll try to provide some example code for this at some point.) + + + 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(). + */ + +#include +#include +#include +#include + +#include +#include +#include + +#include /* for isupper() and isalnum() */ + +#include + + + + /* 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 + + + + /* Quick'n'dirty Pascal string to C string converter. + Warning: this call is not thread safe! Use with caution. */ + static + char* p2c_str( unsigned char* pstr ) + { + static char cstr[256]; + + + strncpy( cstr, (char*)pstr + 1, pstr[0] ); + cstr[pstr[0]] = '\0'; + return cstr; + } + + + /* Given a pathname, fill in a file spec. */ + static + int file_spec_from_path( const char* pathname, + FSSpec* spec ) + { + Str255 p_path; + FT_ULong path_len; + + + /* convert path to a pascal string */ + path_len = strlen( pathname ); + if ( path_len > 255 ) + return -1; + p_path[0] = (unsigned char)path_len; + strncpy( (char*)p_path + 1, pathname, path_len ); + + if ( FSMakeFSSpec( 0, 0, p_path, spec ) != noErr ) + return -1; + else + return 0; + } + + + /* Return the file type of the file specified by spec. */ + static + OSType get_file_type( FSSpec* spec ) + { + FInfo finfo; + + + if ( FSpGetFInfo( spec, &finfo ) != noErr ) + return 0; /* file might not exist */ + + return finfo.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 ( isupper( *q ) ) + { + if ( count ) + max = 3; + count = 0; + } + if ( count < max && ( isalnum( *q ) || *q == '_' ) ) + { + *++p = *q; + lwfn_file_name[0]++; + count++; + } + q++; + } + } + + + /* Given a file reference, answer its location as a vRefNum + and a dirID. */ + static + FT_Error get_file_location( short ref_num, + short* v_ref_num, + long* dir_id, + unsigned char* file_name ) + { + FCBPBRec pb; + OSErr error; + + pb.ioNamePtr = file_name; + pb.ioVRefNum = 0; + pb.ioRefNum = ref_num; + pb.ioFCBIndx = 0; + + + error = PBGetFCBInfoSync( &pb ); + if ( error == noErr ) + { + *v_ref_num = pb.ioFCBVRefNum; + *dir_id = pb.ioFCBParID; + } + return error; + } + + + /* Make a file spec for an LWFN file from a FOND resource and + a file name. */ + static + FT_Error make_lwfn_spec( Handle fond, + unsigned char* file_name, + FSSpec* spec ) + { + FT_Error error; + short ref_num, v_ref_num; + long dir_id; + Str255 fond_file_name; + + + ref_num = HomeResFile( fond ); + + error = ResError(); + if ( !error ) + error = get_file_location( ref_num, &v_ref_num, + &dir_id, fond_file_name ); + if ( !error ) + error = FSMakeFSSpec( v_ref_num, dir_id, file_name, spec ); + + return error; + } + + + /* Look inside the FOND data, answer whether there should be an SFNT + resource, and answer the name of a possible LWFN Type 1 file. */ + static + void parse_fond( char* fond_data, + short* have_sfnt, + short* sfnt_id, + Str255 lwfn_file_name ) + { + AsscEntry* 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 ); + + if ( assoc->fontSize == 0 ) + { + *have_sfnt = 1; + *sfnt_id = assoc->fontID; + } + + if ( fond->ffStylOff ) + { + unsigned char* p = (unsigned char*)fond_data; + StyleTable* style; + unsigned short string_count; + unsigned char* name_table = 0; + char ps_name[256]; + unsigned char* names[64]; + int i; + + + p += fond->ffStylOff; + style = (StyleTable*)p; + p += sizeof ( StyleTable ); + string_count = *(unsigned short*)(p); + p += sizeof ( short ); + + for ( i = 0 ; i < string_count && i < 64; i++ ) + { + names[i] = p; + p += names[i][0]; + p++; + } + strcpy( ps_name, p2c_str( names[0] ) ); /* Family name */ + + if ( style->indexes[0] > 1 ) + { + unsigned char* suffixes = names[style->indexes[0] - 1]; + + + for ( i=1; i<=suffixes[0]; i++ ) + strcat( ps_name, p2c_str( names[suffixes[i] - 1 ] ) ); + } + create_lwfn_name( ps_name, lwfn_file_name ); + } + } + + + /* 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'll glue chunks + of the same type together. */ + static + FT_Error read_lwfn( FT_Memory memory, + FSSpec* lwfn_spec, + FT_Byte** pfb_data, + FT_ULong* size ) + { + FT_Error error = FT_Err_Ok; + short res_ref, res_id; + unsigned char *buffer, *p, *size_p; + FT_ULong total_size = 0; + FT_ULong post_size, pfb_chunk_size; + Handle post_data; + char code, last_code; + + + res_ref = FSpOpenResFile( lwfn_spec, fsRdPerm ); + if ( ResError() ) + return FT_Err_Out_Of_Memory; + UseResFile( res_ref ); + + /* 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're 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; + } + + if ( 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're done */ + + post_size = (FT_ULong)GetHandleSize( post_data ) - 2; + code = (*post_data)[0]; + + if ( code != last_code ) + { + + if ( last_code != -1 ) + { + /* we're done adding a chunk, fill in the size field */ + *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 */ + } + } + + 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_ref ); + 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; + + + 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_Close 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 ( ALLOC( stream, sizeof ( *stream ) ) ) + goto Exit; + + FT_New_Memory_Stream( library, + base, + size, + stream ); + + 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 ) + { + 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_Done_Stream( stream ); + FREE( stream ); + } + 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, + FSSpec* spec, + FT_Long face_index, + FT_Face* aface ) + { + FT_Byte* pfb_data; + FT_ULong pfb_size; + FT_Error error; + FT_Memory memory = library->memory; + + + error = read_lwfn( library->memory, spec, &pfb_data, &pfb_size ); + if ( error ) + return error; + +#if 0 + { + FILE* f; + char* path; + + + path = p2c_str( spec->name ); + strcat( path, ".PFB" ); + f = fopen( path, "wb" ); + if ( f ) + { + fwrite( pfb_data, 1, pfb_size, f ); + fclose( f ); + } + } +#endif + + 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_Stream stream = NULL; + FT_Error error = 0; + FT_Memory memory = library->memory; + + + sfnt = GetResource( 'sfnt', sfnt_id ); + if ( ResError() ) + return FT_Err_Invalid_Handle; + + sfnt_size = (FT_ULong)GetHandleSize( sfnt ); + if ( ALLOC( sfnt_data, (FT_Long)sfnt_size ) ) + { + ReleaseResource( sfnt ); + return error; + } + + HLock( sfnt ); + memcpy( sfnt_data, *sfnt, sfnt_size ); + HUnlock( sfnt ); + ReleaseResource( sfnt ); + + return open_face_from_buffer( library, + sfnt_data, + sfnt_size, + face_index, + "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, + FSSpec* spec, + FT_Long face_index, + FT_Face* aface ) + { + FT_Error error = FT_Err_Ok; + short res_ref, res_index; + Handle fond; + + + res_ref = FSpOpenResFile( spec, fsRdPerm ); + if ( ResError() ) + return FT_Err_Cannot_Open_Resource; + UseResFile( res_ref ); + + /* face_index may be -1, in which case we + just need to do a sanity check */ + if ( face_index < 0 ) + res_index = 1; + else + { + res_index = (short)( face_index + 1 ); + face_index = 0; + } + fond = Get1IndResource( 'FOND', res_index ); + if ( ResError() ) + { + error = FT_Err_Cannot_Open_Resource; + goto Error; + } + + error = FT_New_Face_From_FOND( library, fond, face_index, aface ); + + Error: + CloseResFile( res_ref ); + return error; + } + + + /* documentation 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; + Str255 lwfn_file_name; + short fond_id; + OSType fond_type; + Str255 fond_name; + FSSpec lwfn_spec; + FT_Error error = FT_Err_Unknown_File_Format; + + + 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 ); + HUnlock( fond ); + + if ( lwfn_file_name[0] ) + { + if ( make_lwfn_spec( fond, lwfn_file_name, &lwfn_spec ) == FT_Err_Ok ) + have_lwfn = 1; /* yeah, we got one! */ + else + have_lwfn = 0; /* no LWFN file found */ + } + + if ( have_lwfn && ( !have_sfnt || PREFER_LWFN ) ) + return FT_New_Face_From_LWFN( library, + &lwfn_spec, + face_index, + aface ); + else if ( have_sfnt ) + return FT_New_Face_From_SFNT( library, + sfnt_id, + face_index, + aface ); + + return FT_Err_Unknown_File_Format; + } + + + /*************************************************************************/ + /* */ + /* */ + /* 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; + FSSpec spec; + OSType file_type; + + + /* test for valid `library' and `aface' delayed to FT_Open_Face() */ + if ( !pathname ) + return FT_Err_Invalid_Argument; + + if ( file_spec_from_path( pathname, &spec ) ) + return FT_Err_Invalid_Argument; + + file_type = get_file_type( &spec ); + if ( file_type == 'FFIL' || file_type == 'tfil' ) + return FT_New_Face_From_Suitcase( library, &spec, face_index, aface ); + else if ( file_type == 'LWFN' ) + return FT_New_Face_From_LWFN( library, &spec, face_index, aface ); + else + { + args.flags = ft_open_pathname; + args.pathname = (char*)pathname; + + return FT_Open_Face( library, &args, face_index, aface ); + } + } + + +/* END */ Index: xc/extras/freetype2/src/base/ftmm.c diff -u /dev/null xc/extras/freetype2/src/base/ftmm.c:1.1.1.1 --- /dev/null Mon Dec 18 14:22:35 2000 +++ xc/extras/freetype2/src/base/ftmm.c Fri Dec 8 16:26:19 2000 @@ -0,0 +1,124 @@ +/***************************************************************************/ +/* */ +/* ftmm.c */ +/* */ +/* Multiple Master font support (body). */ +/* */ +/* 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 +#include + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an 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 + + + /* documentation is in ftmm.h */ + + FT_EXPORT_DEF( FT_Error ) FT_Get_Multi_Master( FT_Face face, + FT_Multi_Master *amaster ) + { + FT_Error error; + + + if ( !face ) + return FT_Err_Invalid_Face_Handle; + + error = FT_Err_Invalid_Argument; + + if ( FT_HAS_MULTIPLE_MASTERS( face ) ) + { + FT_Driver driver = face->driver; + FT_Get_MM_Func func; + + + func = (FT_Get_MM_Func)driver->root.clazz->get_interface( + FT_MODULE( driver ), "get_mm" ); + if ( func ) + error = func( 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; + + + if ( !face ) + return FT_Err_Invalid_Face_Handle; + + error = FT_Err_Invalid_Argument; + + if ( FT_HAS_MULTIPLE_MASTERS( face ) ) + { + FT_Driver driver = face->driver; + FT_Set_MM_Design_Func func; + + + func = (FT_Set_MM_Design_Func)driver->root.clazz->get_interface( + FT_MODULE( driver ), "set_mm_design" ); + if ( func ) + error = func( 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; + + + if ( !face ) + return FT_Err_Invalid_Face_Handle; + + error = FT_Err_Invalid_Argument; + + if ( FT_HAS_MULTIPLE_MASTERS( face ) ) + { + FT_Driver driver = face->driver; + FT_Set_MM_Blend_Func func; + + + func = (FT_Set_MM_Blend_Func)driver->root.clazz->get_interface( + FT_MODULE( driver ), "set_mm_blend" ); + if ( func ) + error = func( face, num_coords, coords ); + } + + return error; + } + + +/* END */ Index: xc/extras/freetype2/src/base/ftnames.c diff -u /dev/null xc/extras/freetype2/src/base/ftnames.c:1.1.1.1 --- /dev/null Mon Dec 18 14:22:35 2000 +++ xc/extras/freetype2/src/base/ftnames.c Fri Dec 8 16:26:19 2000 @@ -0,0 +1,74 @@ +/***************************************************************************/ +/* */ +/* 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-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 +#include + + +#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 index, + FT_SfntName *aname ) + { + FT_Error error = FT_Err_Invalid_Argument; + + + if ( aname && face && FT_IS_SFNT( face ) ) + { + TT_Face ttface = (TT_Face)face; + + + if ( index < ttface->num_names ) + { + TT_NameRec* name = ttface->name_table.names + index; + + + aname->platform_id = name->platformID; + aname->encoding_id = name->encodingID; + aname->language_id = name->languageID; + aname->name_id = name->nameID; + aname->string = (FT_Byte*)name->string; + aname->string_len = name->stringLength; + + error = FT_Err_Ok; + } + } + + return error; + } + + +#endif /* TT_CONFIG_OPTION_SFNT_NAMES */ + + +/* END */ Index: xc/extras/freetype2/src/base/ftobjs.c diff -u /dev/null xc/extras/freetype2/src/base/ftobjs.c:1.1.1.1 --- /dev/null Mon Dec 18 14:22:35 2000 +++ xc/extras/freetype2/src/base/ftobjs.c Fri Dec 8 16:26:19 2000 @@ -0,0 +1,2526 @@ +/***************************************************************************/ +/* */ +/* ftobjs.c */ +/* */ +/* The FreeType private base classes (body). */ +/* */ +/* 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 +#include +#include +#include + +#include + +#include /* for strcmp() */ + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** M E M O R Y ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an 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 + + + /* documentation is in ftmemory.h */ + + FT_BASE_DEF( FT_Error ) FT_Alloc( FT_Memory memory, + FT_Long size, + void* *P ) + { + FT_Assert( P != 0 ); + + if ( size > 0 ) + { + *P = memory->alloc( memory, size ); + if ( !*P ) + { + FT_ERROR(( "FT_Alloc:" )); + FT_ERROR(( " Out of memory? (%ld requested)\n", + size )); + + return FT_Err_Out_Of_Memory; + } + MEM_Set( *P, 0, size ); + } + else + *P = NULL; + + FT_TRACE7(( "FT_Alloc:" )); + FT_TRACE7(( " size = %ld, block = 0x%08p, ref = 0x%08p\n", + size, *P, P )); + + return FT_Err_Ok; + } + + + /* documentation is in ftmemory.h */ + + FT_BASE_DEF( FT_Error ) FT_Realloc( FT_Memory memory, + FT_Long current, + FT_Long size, + void** P ) + { + void* Q; + + + FT_Assert( P != 0 ); + + /* if the original pointer is NULL, call FT_Alloc() */ + if ( !*P ) + return FT_Alloc( memory, size, P ); + + /* if the new block if zero-sized, clear the current one */ + if ( size <= 0 ) + { + FT_Free( memory, P ); + return FT_Err_Ok; + } + + Q = memory->realloc( memory, current, size, *P ); + if ( !Q ) + goto Fail; + + *P = Q; + return FT_Err_Ok; + + Fail: + FT_ERROR(( "FT_Realloc:" )); + FT_ERROR(( " Failed (current %ld, requested %ld)\n", + current, size )); + return FT_Err_Out_Of_Memory; + } + + + /* documentation is in ftmemory.h */ + + FT_BASE_DEF( void ) FT_Free( FT_Memory memory, + void** P ) + { + FT_TRACE7(( "FT_Free:" )); + FT_TRACE7(( " Freeing block 0x%08p, ref 0x%08p\n", + P, P ? *P : (void*)0 )); + + if ( P && *P ) + { + memory->free( memory, *P ); + *P = 0; + } + } + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** S T R E A M ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* */ + /* ft_new_input_stream */ + /* */ + /* */ + /* Creates a new input stream object from an FT_Open_Args structure. */ + /* */ + /* */ + /* The function expects a valid `astream' parameter. */ + /* */ + static + FT_Error ft_new_input_stream( FT_Library library, + 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 ( ALLOC( stream, sizeof ( *stream ) ) ) + goto Exit; + + stream->memory = memory; + + /* now, look at the stream flags */ + if ( args->flags & ft_open_memory ) + { + error = 0; + FT_New_Memory_Stream( library, + args->memory_base, + args->memory_size, + stream ); + } + else if ( args->flags & ft_open_pathname ) + { + error = FT_New_Stream( args->pathname, stream ); + stream->pathname.pointer = args->pathname; + } + else if ( ( args->flags & ft_open_stream ) && args->stream ) + { + /* in this case, we do not need to allocate a new stream object */ + /* since the caller is responsible for closing it himself */ + FREE( stream ); + stream = args->stream; + } + else + error = FT_Err_Invalid_Argument; + + if ( error ) + FREE( stream ); + + *astream = stream; + + Exit: + return error; + } + + + /* documentation is in ftobjs.h */ + + FT_EXPORT_DEF( void ) FT_Done_Stream( FT_Stream stream ) + { + if ( stream && stream->close ) + { + stream->close( stream ); + stream->close = 0; + } + } + + + static + void ft_done_stream( FT_Stream* astream, + FT_Int external ) + { + FT_Stream stream = *astream; + + + if ( stream->close ) + stream->close( stream ); + + if ( !external ) + { + FT_Memory memory = stream->memory; + + + FREE( stream ); + } + *astream = 0; + } + + +#undef FT_COMPONENT +#define FT_COMPONENT trace_objs + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** 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 ( !ALLOC( loader, sizeof ( *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; + + + FREE( loader->base.outline.points ); + FREE( loader->base.outline.tags ); + FREE( loader->base.outline.contours ); + FREE( loader->base.extra_points ); + FREE( loader->base.subglyphs ); + + 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 ); + 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; + } + + + FT_BASE_DEF( FT_Error ) FT_GlyphLoader_Create_Extra( + FT_GlyphLoader* loader ) + { + FT_Error error; + FT_Memory memory = loader->memory; + + + if ( !ALLOC_ARRAY( loader->base.extra_points, + loader->max_points, FT_Vector ) ) + { + loader->use_extra = 1; + 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_Check_Points( + 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 = 1; + + FT_UInt new_max; + + + /* check points & tags */ + new_max = base->n_points + current->n_points + n_points; + if ( new_max > loader->max_points ) + { + new_max = ( new_max + 7 ) & -8; + if ( REALLOC_ARRAY( base->points, base->n_points, + new_max, FT_Vector ) || + REALLOC_ARRAY( base->tags, base->n_points, + new_max, FT_Byte ) ) + goto Exit; + + if ( loader->use_extra && + REALLOC_ARRAY( loader->base.extra_points, base->n_points, + new_max, FT_Vector ) ) + goto Exit; + + adjust = 1; + loader->max_points = new_max; + } + + /* check contours */ + new_max = base->n_contours + current->n_contours + + n_contours; + if ( new_max > loader->max_contours ) + { + new_max = ( new_max + 3 ) & -4; + if ( REALLOC_ARRAY( base->contours, base->n_contours, + new_max, FT_Short ) ) + 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_Check_Subglyphs( + FT_GlyphLoader* loader, + FT_UInt n_subs ) + { + FT_Memory memory = loader->memory; + FT_Error error = FT_Err_Ok; + FT_UInt new_max; + + FT_GlyphLoad* base = &loader->base; + FT_GlyphLoad* current = &loader->current; + + + new_max = base->num_subglyphs + current->num_subglyphs + n_subs; + if ( new_max > loader->max_subglyphs ) + { + new_max = ( new_max + 1 ) & -2; + if ( REALLOC_ARRAY( base->subglyphs, base->num_subglyphs, + new_max, FT_SubGlyph ) ) + 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 = &loader->base; + FT_GlyphLoad* current = &loader->current; + + FT_UInt n_curr_contours = current->outline.n_contours; + FT_UInt n_base_points = base->outline.n_points; + FT_UInt n; + + + base->outline.n_points += current->outline.n_points; + 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] += n_base_points; + + /* prepare for another new glyph image */ + FT_GlyphLoader_Prepare( loader ); + } + + + FT_BASE_DEF( FT_Error ) FT_GlyphLoader_Copy_Points( + 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_Check_Points( target, num_points, num_contours ); + if ( !error ) + { + FT_Outline* out = &target->base.outline; + FT_Outline* in = &source->base.outline; + + + MEM_Copy( out->points, in->points, + num_points * sizeof ( FT_Vector ) ); + MEM_Copy( out->tags, in->tags, + num_points * sizeof ( char ) ); + MEM_Copy( out->contours, in->contours, + num_contours * sizeof ( short ) ); + + /* do we need to copy the extra points? */ + if ( target->use_extra && source->use_extra ) + MEM_Copy( target->base.extra_points, source->base.extra_points, + num_points * sizeof ( FT_Vector ) ); + + out->n_points = num_points; + out->n_contours = num_contours; + + FT_GlyphLoader_Adjust_Points( target ); + } + + return error; + } + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** 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 ( ALLOC( internal, sizeof ( *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; + } + + + static + void ft_glyphslot_clear( FT_GlyphSlot slot ) + { + /* free bitmap if needed */ + if ( slot->flags & ft_glyph_own_bitmap ) + { + FT_Memory memory = FT_FACE_MEMORY( slot->face ); + + + FREE( slot->bitmap.buffer ); + slot->flags &= ~ft_glyph_own_bitmap; + } + + /* clear all public fields in the glyph slot */ + MEM_Set( &slot->metrics, 0, sizeof ( slot->metrics ) ); + MEM_Set( &slot->outline, 0, sizeof ( slot->outline ) ); + MEM_Set( &slot->bitmap, 0, sizeof ( 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; + } + + + 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 */ + if ( slot->flags & ft_glyph_own_bitmap ) + FREE( slot->bitmap.buffer ); + + /* free glyph loader */ + if ( FT_DRIVER_USES_OUTLINES( driver ) ) + { + FT_GlyphLoader_Done( slot->internal->loader ); + slot->internal->loader = 0; + } + + 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 || !aslot || !face->driver ) + return FT_Err_Invalid_Argument; + + *aslot = 0; + + driver = face->driver; + clazz = driver->clazz; + memory = driver->root.memory; + + FT_TRACE4(( "FT_New_GlyphSlot: Creating new slot object\n" )); + if ( !ALLOC( slot, clazz->slot_object_size ) ) + { + slot->face = face; + + error = ft_glyphslot_init( slot ); + if ( error ) + { + ft_glyphslot_done( slot ); + FREE( slot ); + goto Exit; + } + + *aslot = slot; + } + + 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* parent; + FT_GlyphSlot cur; + + + /* Remove slot from its parent face's list */ + parent = &slot->face->glyph; + cur = *parent; + + while ( cur ) + { + if ( cur == slot ) + { + *parent = cur->next; + ft_glyphslot_done( slot ); + FREE( slot ); + break; + } + 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 ); + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Error ) FT_Load_Glyph( FT_Face face, + FT_UInt glyph_index, + FT_Int load_flags ) + { + FT_Error error; + FT_Driver driver; + FT_GlyphSlot slot; + FT_Library library; + FT_Bool autohint; + FT_Module hinter; + + + if ( !face || !face->size || !face->glyph ) + return FT_Err_Invalid_Face_Handle; + + if ( glyph_index >= (FT_UInt)face->num_glyphs ) + return FT_Err_Invalid_Argument; + + slot = face->glyph; + ft_glyphslot_clear( slot ); + + driver = face->driver; + + /* when the flag NO_RECURSE is set, we disable hinting and scaling */ + if ( load_flags & FT_LOAD_NO_RECURSE ) + { + /* disable scaling, hinting, and transformation */ + load_flags |= FT_LOAD_NO_SCALE | + FT_LOAD_NO_HINTING | + FT_LOAD_IGNORE_TRANSFORM; + + /* disable bitmap rendering */ + load_flags &= ~FT_LOAD_RENDER; + } + + /* do we need to load the glyph through the auto-hinter? */ + library = driver->root.library; + hinter = library->auto_hinter; + autohint = hinter && + !( load_flags & ( FT_LOAD_NO_SCALE | FT_LOAD_NO_HINTING ) ) && + FT_DRIVER_IS_SCALABLE(driver) && + FT_DRIVER_USES_OUTLINES(driver); + if ( autohint ) + { + if ( FT_DRIVER_HAS_HINTER( driver ) && + !( load_flags & FT_LOAD_FORCE_AUTOHINT ) ) + autohint = 0; + } + + if ( autohint ) + { + FT_AutoHinter_Interface* hinting; + + + hinting = (FT_AutoHinter_Interface*)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; + + /* compute the advance */ + if ( load_flags & FT_LOAD_VERTICAL_LAYOUT ) + { + slot->advance.x = 0; + slot->advance.y = slot->metrics.vertAdvance; + } + else + { + slot->advance.x = slot->metrics.horiAdvance; + slot->advance.y = 0; + } + + /* compute the linear advance in 16.16 pixels */ + if ( ( load_flags & FT_LOAD_LINEAR_DESIGN ) == 0 ) + { + FT_UInt EM = face->units_per_EM; + FT_Size_Metrics* metrics = &face->size->metrics; + + slot->linearHoriAdvance = FT_MulDiv( slot->linearHoriAdvance, + (FT_Long)metrics->x_ppem << 16, EM ); + + slot->linearVertAdvance = FT_MulDiv( slot->linearVertAdvance, + (FT_Long)metrics->y_ppem << 16, EM ); + } + + 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 ) + { + error = FT_Render_Glyph( slot, + ( load_flags & FT_LOAD_MONOCHROME ) + ? ft_render_mode_mono + : ft_render_mode_normal ); + } + + Exit: + return error; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Error ) FT_Load_Char( FT_Face face, + FT_ULong char_code, + FT_Int 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 ); + + FREE( size->internal ); + FREE( size ); + } + + + /* 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->slot' */ + 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 ); + + /* finalize format-specific stuff */ + if ( clazz->done_face ) + clazz->done_face( face ); + + /* close the stream for this face if needed */ + ft_done_stream( + &face->stream, + ( face->face_flags & FT_FACE_FLAG_EXTERNAL_STREAM ) != 0 ); + + /* get rid of it */ + FREE( face->internal ); + 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 ); + } + + + /*************************************************************************/ + /* */ + /* */ + /* open_face */ + /* */ + /* */ + /* 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; + FT_Face_Internal internal; + + + clazz = driver->clazz; + memory = driver->root.memory; + + /* allocate the face object and perform basic initialization */ + if ( ALLOC( face, clazz->face_object_size ) ) + goto Fail; + + if ( ALLOC( internal, sizeof ( *internal ) ) ) + goto Fail; + + face->internal = internal; + + face->driver = driver; + face->memory = memory; + face->stream = stream; + + error = clazz->init_face( stream, + face, + face_index, + num_params, + params ); + if ( error ) + goto Fail; + + *aface = face; + + Fail: + if ( error ) + { + clazz->done_face( face ); + FREE( face->internal ); + FREE( face ); + *aface = 0; + } + + return error; + } + + + /* there's a Mac-specific extended implementation of FT_New_Face() */ + /* in src/mac/ftmac.c */ + +#ifndef 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 /* !macintosh */ + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Error ) FT_New_Memory_Face( FT_Library library, + 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 ); + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Error ) FT_Open_Face( FT_Library library, + 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_new_input_stream() */ + + if ( !aface || !args ) + return FT_Err_Invalid_Argument; + + *aface = 0; + + external_stream = ( ( args->flags & ft_open_stream ) && args->stream ); + + /* create input stream */ + error = ft_new_input_stream( 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_done_stream( &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 ( error != FT_Err_Unknown_File_Format ) + goto Fail; + } + } + + ft_done_stream( &stream, external_stream ); + + /* no driver is able to handle this format */ + error = FT_Err_Unknown_File_Format; + 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 ( ALLOC( node, sizeof ( *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_GlyphSlot slot; + + + FT_TRACE4(( "FT_Open_Face: Creating glyph slot\n" )); + + error = FT_New_GlyphSlot( face, &slot ); + if ( error ) + goto Fail; + + face->glyph = slot; + } + + /* 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; + } + + /* 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; + } + + *aface = 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.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_new_input_stream() */ + + if ( !face ) + return FT_Err_Invalid_Face_Handle; + + driver = face->driver; + if ( !driver ) + return FT_Err_Invalid_Driver_Handle; + + error = ft_new_input_stream( 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_done_stream( &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 ); + 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 ( ALLOC( size, clazz->size_object_size ) || + ALLOC( node, sizeof ( FT_ListNodeRec ) ) ) + 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 ) + { + FREE( node ); + 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 ); + 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 FT_Err_Ok; + } + + + static + void ft_recompute_scaled_metrics( FT_Face face, + FT_Size_Metrics* metrics ) + { + /* Compute root ascender, descender, test height, and max_advance */ + + metrics->ascender = ( FT_MulFix( face->ascender, + metrics->y_scale ) + 32 ) & -64; + + metrics->descender = ( FT_MulFix( face->descender, + metrics->y_scale ) + 32 ) & -64; + + metrics->height = ( FT_MulFix( face->height, + metrics->y_scale ) + 32 ) & -64; + + metrics->max_advance = ( FT_MulFix( face->max_advance_width, + metrics->x_scale ) + 32 ) & -64; + } + + + /* 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_Error error = FT_Err_Ok; + FT_Driver driver; + FT_Memory memory; + FT_Driver_Class* clazz; + FT_Size_Metrics* metrics; + FT_Long dim_x, dim_y; + + + if ( !face || !face->size || !face->driver ) + return FT_Err_Invalid_Face_Handle; + + driver = face->driver; + metrics = &face->size->metrics; + + if ( !char_width ) + char_width = char_height; + + else if ( !char_height ) + char_height = char_width; + + if ( !horz_resolution ) + horz_resolution = 72; + + if ( !vert_resolution ) + vert_resolution = 72; + + driver = face->driver; + clazz = driver->clazz; + memory = driver->root.memory; + + /* default processing -- this can be overridden by the driver */ + if ( char_width < 1 * 64 ) + char_width = 1 * 64; + if ( char_height < 1 * 64 ) + char_height = 1 * 64; + + /* Compute pixel sizes in 26.6 units */ + dim_x = ( ( ( char_width * horz_resolution ) / 72 ) + 32 ) & -64; + dim_y = ( ( ( char_height * vert_resolution ) / 72 ) + 32 ) & -64; + + metrics->x_ppem = (FT_UShort)( dim_x >> 6 ); + metrics->y_ppem = (FT_UShort)( dim_y >> 6 ); + + metrics->x_scale = 0x10000L; + metrics->y_scale = 0x10000L; + + if ( face->face_flags & FT_FACE_FLAG_SCALABLE ) + { + metrics->x_scale = FT_DivFix( dim_x, face->units_per_EM ); + metrics->y_scale = FT_DivFix( dim_y, face->units_per_EM ); + + ft_recompute_scaled_metrics( face, metrics ); + } + + if ( clazz->set_char_sizes ) + error = clazz->set_char_sizes( face->size, + char_width, + char_height, + horz_resolution, + vert_resolution ); + return error; + } + + + /* 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_Error error = FT_Err_Ok; + FT_Driver driver; + FT_Memory memory; + FT_Driver_Class* clazz; + FT_Size_Metrics* metrics = &face->size->metrics; + + + if ( !face || !face->size || !face->driver ) + return FT_Err_Invalid_Face_Handle; + + driver = face->driver; + clazz = driver->clazz; + memory = driver->root.memory; + + /* default processing -- this can be overridden by the driver */ + 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; + + metrics->x_ppem = pixel_width; + metrics->y_ppem = pixel_height; + + if ( face->face_flags & FT_FACE_FLAG_SCALABLE ) + { + metrics->x_scale = FT_DivFix( metrics->x_ppem << 6, + face->units_per_EM ); + + metrics->y_scale = FT_DivFix( metrics->y_ppem << 6, + face->units_per_EM ); + + ft_recompute_scaled_metrics( face, metrics ); + } + + if ( clazz->set_pixel_sizes ) + error = clazz->set_pixel_sizes( face->size, + pixel_width, + pixel_height ); + return error; + } + + + /* 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; + FT_Memory memory; + + + if ( !face ) + return FT_Err_Invalid_Face_Handle; + + if ( !akerning ) + return FT_Err_Invalid_Argument; + + driver = face->driver; + memory = driver->root.memory; + + 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 ) + { + akerning->x = ( akerning->x + 32 ) & -64; + akerning->y = ( akerning->y + 32 ) & -64; + } + } + } + } + + 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; + + 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_UInt ) FT_Get_Char_Index( FT_Face face, + FT_ULong charcode ) + { + FT_UInt result; + FT_Driver driver; + + + result = 0; + if ( face && face->charmap ) + { + driver = face->driver; + result = driver->clazz->get_char_index( face->charmap, charcode ); + } + 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 ) ) + { + /* now, lookup for glyph name */ + FT_Driver driver = face->driver; + FT_Module_Class* clazz = FT_MODULE_CLASS( driver ); + + + if ( clazz->get_interface ) + { + FT_Glyph_Name_Requester requester; + + + requester = (FT_Glyph_Name_Requester)clazz->get_interface( + FT_MODULE( driver ), "glyph_name" ); + if ( requester ) + error = requester( face, glyph_index, buffer, buffer_max ); + } + } + + return error; + } + + + /* documentation is in tttables.h */ + + FT_EXPORT_DEF( void* ) FT_Get_Sfnt_Table( FT_Face face, + FT_Sfnt_Tag tag ) + { + void* table = 0; + FT_Get_Sfnt_Table_Func func; + FT_Driver driver; + + + if ( !face || !FT_IS_SFNT( face ) ) + goto Exit; + + driver = face->driver; + func = (FT_Get_Sfnt_Table_Func)driver->root.clazz->get_interface( + FT_MODULE( driver ), "get_sfnt" ); + if ( func ) + table = func( face, tag ); + + Exit: + return table; + } + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** 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 ( ALLOC( node, sizeof ( *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 ) + 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 ); + 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 ) + { + FTRenderer_setMode 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_LOCAL_DEF + FT_Error FT_Render_Glyph_Internal( FT_Library library, + FT_GlyphSlot slot, + FT_UInt 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, 0 ); + if ( !error || 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_UInt 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 ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* */ + /* Destroy_Module */ + /* */ + /* */ + /* Destroys a given module object. For drivers, this also destroys */ + /* all child faces. */ + /* */ + /* */ + /* module :: A handle to the target driver object. */ + /* */ + /* */ + /* 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 */ + FREE( module ); + } + + + /* documentation is in ftmodule.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 ( 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 ( 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 ); + } + + FREE( module ); + goto Exit; + } + + + /* documentation is in ftmodule.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 ( 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; + } + + + /* documentation is in ftmodule.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 ftmodule.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; + + /* first of all, allocate the library object */ + if ( ALLOC( library, sizeof ( *library ) ) ) + return error; + + library->memory = memory; + + /* allocate the render pool */ + library->raster_pool_size = FT_RENDER_POOL_SIZE; + if ( ALLOC( library->raster_pool, FT_RENDER_POOL_SIZE ) ) + goto Fail; + + /* That's ok now */ + *alibrary = library; + + return FT_Err_Ok; + + Fail: + FREE( library ); + return error; + } + + + /* documentation is in ftmodule.h */ + + FT_EXPORT_DEF( FT_Error ) FT_Done_Library( FT_Library library ) + { + FT_Memory memory; + FT_UInt n; + + + if ( !library ) + return FT_Err_Invalid_Library_Handle; + + memory = library->memory; + + /* Discard client-data */ + if ( library->generic.finalizer ) + library->generic.finalizer( library ); + + /* Close all modules in the library */ + for ( n = 0; n < library->num_modules; n++ ) + { + FT_Module module = library->modules[n]; + + + if ( module ) + { + Destroy_Module( module ); + library->modules[n] = 0; + } + } + + /* Destroy raster objects */ + FREE( library->raster_pool ); + library->raster_pool_size = 0; + + FREE( library ); + return FT_Err_Ok; + } + + + /* documentation is in ftmodule.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; + } + + +/* END */ Index: xc/extras/freetype2/src/base/ftoutln.c diff -u /dev/null xc/extras/freetype2/src/base/ftoutln.c:1.1.1.1 --- /dev/null Mon Dec 18 14:22:35 2000 +++ xc/extras/freetype2/src/base/ftoutln.c Fri Dec 8 16:26:20 2000 @@ -0,0 +1,599 @@ +/***************************************************************************/ +/* */ +/* ftoutln.c */ +/* */ +/* FreeType outline management (body). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* All functions are declared in freetype.h. */ + /* */ + /*************************************************************************/ + + +#include +#include + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an 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* 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 */ + char tag; /* current point's state */ + + FT_Int shift; + FT_Pos delta; + + + if ( !outline || !interface ) + return FT_Err_Invalid_Argument; + + shift = interface->shift; + delta = 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]; + 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 = 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 = 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 = 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 = interface->conic_to( &v_control, &v_middle, user ); + if ( error ) + goto Exit; + + v_control = vec; + goto Do_Conic; + } + + error = 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 = interface->cubic_to( &vec1, &vec2, &vec, user ); + if ( error ) + goto Exit; + continue; + } + + error = interface->cubic_to( &vec1, &vec2, &v_start, user ); + goto Close; + } + } + } + + /* close the contour with a line segment */ + error = 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 ( ALLOC_ARRAY( anoutline->points, numPoints * 2L, FT_Pos ) || + ALLOC_ARRAY( anoutline->tags, numPoints, FT_Byte ) || + ALLOC_ARRAY( anoutline->contours, numContours, FT_UShort ) ) + 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_Copy( 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; + + MEM_Copy( target->points, source->points, + source->n_points * sizeof ( FT_Vector ) ); + + MEM_Copy( target->tags, source->tags, + source->n_points * sizeof ( FT_Byte ) ); + + MEM_Copy( target->contours, source->contours, + source->n_contours * sizeof ( FT_Short ) ); + + /* 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 ( outline ) + { + if ( outline->flags & ft_outline_owner ) + { + FREE( outline->points ); + FREE( outline->tags ); + 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( 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( FT_Outline* outline, + FT_Pos xOffset, + FT_Pos yOffset ) + { + FT_UShort n; + FT_Vector* vec = outline->points; + + + for ( n = 0; n < outline->n_points; n++ ) + { + vec->x += xOffset; + vec->y += yOffset; + vec++; + } + } + + + /* documentation is in ftoutln.h */ + + FT_EXPORT_DEF( void ) FT_Outline_Reverse( FT_Outline* outline ) + { + FT_UShort n; + FT_Int first, last; + + + 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 ( !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 || 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, + 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_grays ) + 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, + 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( FT_Outline* outline, + FT_Matrix* matrix ) + { + FT_Vector* vec = outline->points; + FT_Vector* limit = vec + outline->n_points; + + + for ( ; vec < limit; vec++ ) + FT_Vector_Transform( vec, matrix ); + } + + +/* END */ Index: xc/extras/freetype2/src/base/ftstream.c diff -u /dev/null xc/extras/freetype2/src/base/ftstream.c:1.1.1.1 --- /dev/null Mon Dec 18 14:22:35 2000 +++ xc/extras/freetype2/src/base/ftstream.c Fri Dec 8 16:26:20 2000 @@ -0,0 +1,780 @@ +/***************************************************************************/ +/* */ +/* ftstream.c */ +/* */ +/* I/O stream support (body). */ +/* */ +/* Copyright 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 +#include + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an 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_New_Memory_Stream( FT_Library library, + FT_Byte* base, + FT_ULong size, + FT_Stream stream ) + { + stream->memory = library->memory; + stream->base = base; + stream->size = size; + stream->pos = 0; + stream->cursor = 0; + stream->read = 0; + stream->close = 0; + } + + + FT_BASE_DEF( FT_Error ) FT_Seek_Stream( FT_Stream stream, + FT_ULong pos ) + { + FT_Error error; + + + stream->pos = pos; + + if ( stream->read ) + { + if ( stream->read( stream, pos, 0, 0 ) ) + { + FT_ERROR(( "FT_Seek_Stream:" )); + FT_ERROR(( " invalid i/o; pos = 0x%lx, size = 0x%lx\n", + pos, stream->size )); + + error = FT_Err_Invalid_Stream_Operation; + } + else + error = FT_Err_Ok; + } + /* note that seeking to the first position after the file is valid */ + else if ( pos > stream->size ) + { + FT_ERROR(( "FT_Seek_Stream:" )); + FT_ERROR(( " invalid i/o; pos = 0x%lx, size = 0x%lx\n", + pos, stream->size )); + + error = FT_Err_Invalid_Stream_Operation; + } + + else + error = FT_Err_Ok; + + return error; + } + + + FT_BASE_DEF( FT_Error ) FT_Skip_Stream( FT_Stream stream, + FT_Long distance ) + { + return FT_Seek_Stream( 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_Read_Stream( FT_Stream stream, + FT_Byte* buffer, + FT_ULong count ) + { + return FT_Read_Stream_At( stream, stream->pos, buffer, count ); + } + + + FT_BASE_DEF( FT_Error ) FT_Read_Stream_At( 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_Read_Stream_At:" )); + FT_ERROR(( " 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; + + MEM_Copy( buffer, stream->base + pos, read_bytes ); + } + + stream->pos = pos + read_bytes; + + if ( read_bytes < count ) + { + FT_ERROR(( "FT_Read_Stream_At:" )); + 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_Error ) FT_Extract_Frame( FT_Stream stream, + FT_ULong count, + FT_Byte** pbytes ) + { + FT_Error error; + + + error = FT_Access_Frame( stream, count ); + if ( !error ) + { + *pbytes = (FT_Byte*)stream->cursor; + + /* equivalent to FT_Forget_Frame(), with no memory block release */ + stream->cursor = 0; + stream->limit = 0; + } + + return error; + } + + + FT_BASE_DEF( void ) FT_Release_Frame( FT_Stream stream, + FT_Byte** pbytes ) + { + if ( stream->read ) + { + FT_Memory memory = stream->memory; + + + FREE( *pbytes ); + } + *pbytes = 0; + } + + + FT_BASE_DEF( FT_Error ) FT_Access_Frame( 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; + + + if ( ALLOC( stream->base, count ) ) + goto Exit; + + /* read it */ + read_bytes = stream->read( stream, stream->pos, + stream->base, count ); + if ( read_bytes < count ) + { + FT_ERROR(( "FT_Access_Frame:" )); + FT_ERROR(( " invalid read; expected %lu bytes, got %lu\n", + count, read_bytes )); + + 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_Access_Frame:" )); + 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_Forget_Frame( 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_Access_Frame() call, and this is not an error. */ + /* */ + FT_Assert( stream ); + + if ( stream->read ) + { + FT_Memory memory = stream->memory; + + + FREE( stream->base ); + } + stream->cursor = 0; + stream->limit = 0; + } + + + FT_BASE_DEF( FT_Char ) FT_Get_Char( 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_Get_Short( 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 = NEXT_Short( p ); + stream->cursor = p; + + return result; + } + + + FT_BASE_DEF( FT_Short ) FT_Get_ShortLE( 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 = NEXT_ShortLE( p ); + stream->cursor = p; + + return result; + } + + + FT_BASE_DEF( FT_Long ) FT_Get_Offset( 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 = NEXT_Offset( p ); + stream->cursor = p; + return result; + } + + + FT_BASE_DEF( FT_Long ) FT_Get_Long( 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 = NEXT_Long( p ); + stream->cursor = p; + return result; + } + + + FT_BASE_DEF( FT_Long ) FT_Get_LongLE( 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 = NEXT_LongLE( p ); + stream->cursor = p; + return result; + } + + + FT_BASE_DEF( FT_Char ) FT_Read_Char( 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_Read_Char:" )); + FT_ERROR(( " invalid i/o; pos = 0x%lx, size = 0x%lx\n", + stream->pos, stream->size )); + + return 0; + } + + + FT_BASE_DEF( FT_Short ) FT_Read_Short( 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 = NEXT_Short( p ); + } + else + goto Fail; + + stream->pos += 2; + + return result; + + Fail: + *error = FT_Err_Invalid_Stream_Operation; + FT_ERROR(( "FT_Read_Short:" )); + FT_ERROR(( " invalid i/o; pos = 0x%lx, size = 0x%lx\n", + stream->pos, stream->size )); + + return 0; + } + + + FT_BASE_DEF( FT_Short ) FT_Read_ShortLE( 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 = NEXT_ShortLE( p ); + } + else + goto Fail; + + stream->pos += 2; + + return result; + + Fail: + *error = FT_Err_Invalid_Stream_Operation; + FT_ERROR(( "FT_Read_Short:" )); + FT_ERROR(( " invalid i/o; pos = 0x%lx, size = 0x%lx\n", + stream->pos, stream->size )); + + return 0; + } + + + FT_BASE_DEF( FT_Long ) FT_Read_Offset( 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 = NEXT_Offset( p ); + } + else + goto Fail; + + stream->pos += 3; + + return result; + + Fail: + *error = FT_Err_Invalid_Stream_Operation; + FT_ERROR(( "FT_Read_Offset:" )); + FT_ERROR(( " invalid i/o; pos = 0x%lx, size = 0x%lx\n", + stream->pos, stream->size )); + + return 0; + } + + + FT_BASE_DEF( FT_Long ) FT_Read_Long( 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 = NEXT_Long( p ); + } + else + goto Fail; + + stream->pos += 4; + + return result; + + Fail: + FT_ERROR(( "FT_Read_Long:" )); + 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_Long ) FT_Read_LongLE( 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 = NEXT_LongLE( p ); + } + else + goto Fail; + + stream->pos += 4; + + return result; + + Fail: + FT_ERROR(( "FT_Read_Long:" )); + 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_Read_Fields( 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_Access_Frame( 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; + MEM_Copy( p, cursor, len ); + } + cursor += len; + fields++; + continue; + } + + case ft_frame_byte: + case ft_frame_schar: /* read a single byte */ + value = 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 = 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 = NEXT_UShortLE(cursor); + sign_shift = 16; + break; + + case ft_frame_long_be: + case ft_frame_ulong_be: /* read a 4-byte big-endian long */ + value = 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 = NEXT_ULongLE(cursor); + sign_shift = 0; + break; + + case ft_frame_off3_be: + case ft_frame_uoff3_be: /* read a 3-byte big-endian long */ + value = NEXT_UOffset(cursor); + sign_shift = 8; + break; + + case ft_frame_off3_le: + case ft_frame_uoff3_le: /* read a 3-byte little-endian long */ + value = NEXT_UOffsetLE(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 1: + *(FT_Byte*)p = (FT_Byte)value; + break; + + case 2: + *(FT_UShort*)p = (FT_UShort)value; + break; + + case 4: + *(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_Forget_Frame( stream ); + + return error; + } + + +/* END */ Index: xc/extras/freetype2/src/base/ftsynth.c diff -u /dev/null xc/extras/freetype2/src/base/ftsynth.c:1.1.1.1 --- /dev/null Mon Dec 18 14:22:35 2000 +++ xc/extras/freetype2/src/base/ftsynth.c Fri Dec 8 16:26:20 2000 @@ -0,0 +1,397 @@ +/***************************************************************************/ +/* */ +/* ftsynth.c */ +/* */ +/* FreeType synthesizing code for emboldening and slanting (body). */ +/* */ +/* Copyright 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 +#include +#include + + +#define FT_BOLD_THRESHOLD 0x0100 + + + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** EXPERIMENTAL OBLIQUING SUPPORT ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_EXPORT_DEF( FT_Error ) FT_Outline_Oblique( FT_GlyphSlot original, + FT_Outline* outline, + FT_Pos* advance ) + { + FT_Matrix transform; + + FT_UNUSED( original ); + /* we don't touch the advance width */ + FT_UNUSED( advance ); + + + + /* 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 ); + + return 0; + } + + + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** EXPERIMENTAL EMBOLDENING/OUTLINING SUPPORT ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + + + /* Compute the norm of a vector */ + +#ifdef FT_CONFIG_OPTION_OLD_CALCS + +#include + + static + FT_Pos ft_norm( FT_Vector* vec ) + { + FT_Int64 t1, t2; + + + MUL_64( vec->x, vec->x, t1 ); + MUL_64( vec->y, vec->y, t2 ); + ADD_64( t1, t2, t1 ); + + return (FT_Pos)SQRT_64( t1 ); + } + +#else /* FT_CONFIG_OPTION_OLD_CALCS */ + + static + FT_Pos ft_norm( FT_Vector* vec ) + { + FT_F26Dot6 u, v, d; + FT_Int shift; + FT_ULong H, L, L2, hi, lo, med; + + + u = vec->x; if ( u < 0 ) u = -u; + v = vec->y; if ( v < 0 ) v = -v; + + if ( u < v ) + { + d = u; + u = v; + v = d; + } + + /* check that we are not trying to normalize zero! */ + if ( u == 0 ) + return 0; + + /* compute (u*u + v*v) on 64 bits with two 32-bit registers [H:L] */ + hi = (FT_ULong)u >> 16; + lo = (FT_ULong)u & 0xFFFF; + med = hi * lo; + + H = hi * hi + ( med >> 15 ); + med <<= 17; + L = lo * lo + med; + if ( L < med ) + H++; + + hi = (FT_ULong)v >> 16; + lo = (FT_ULong)v & 0xFFFF; + med = hi * lo; + + H += hi * hi + ( med >> 15 ); + med <<= 17; + L2 = lo * lo + med; + if ( L2 < med ) + H++; + + L += L2; + if ( L < L2 ) + H++; + + /* if the value is smaller than 32 bits */ + shift = 0; + if ( H == 0 ) + { + while ( ( L & 0xC0000000UL ) == 0 ) + { + L <<= 2; + shift++; + } + return ( FT_Sqrt32( L ) >> shift ); + } + else + { + while ( H ) + { + L = ( L >> 2 ) | ( H << 30 ); + H >>= 2; + shift++; + } + return ( FT_Sqrt32( L ) << shift ); + } + } + +#endif /* FT_CONFIG_OPTION_OLD_CALCS */ + + + static + int ft_test_extrema( FT_Outline* outline, + int n ) + { + FT_Vector *prev, *cur, *next; + FT_Pos product; + FT_Int c, first, last; + + + /* we need to compute the `previous' and `next' point */ + /* for these extrema. */ + cur = outline->points + n; + prev = cur - 1; + next = cur + 1; + + first = 0; + for ( c = 0; c < outline->n_contours; c++ ) + { + last = outline->contours[c]; + + if ( n == first ) + prev = outline->points + last; + + if ( n == last ) + next = outline->points + first; + + first = last + 1; + } + + product = FT_MulDiv( cur->x - prev->x, /* in.x */ + next->y - cur->y, /* out.y */ + 0x40 ) + - + FT_MulDiv( cur->y - prev->y, /* in.y */ + next->x - cur->x, /* out.x */ + 0x40 ); + + if ( product ) + product = product > 0 ? 1 : -1; + + return product; + } + + + /* Compute the orientation of path filling. It differs between TrueType */ + /* and Type1 formats. We could use the `ft_outline_reverse_fill' flag, */ + /* but it is better to re-compute it directly (it seems that this flag */ + /* isn't correctly set for some weird composite glyphs currently). */ + /* */ + /* We do this by computing bounding box points, and computing their */ + /* curvature. */ + /* */ + /* The function returns either 1 or -1. */ + /* */ + static + int ft_get_orientation( FT_Outline* outline ) + { + FT_BBox box; + FT_BBox indices; + int n, last; + + + indices.xMin = -1; + indices.yMin = -1; + indices.xMax = -1; + indices.yMax = -1; + + box.xMin = box.yMin = 32767; + box.xMax = box.yMax = -32768; + + /* is it empty ? */ + if ( outline->n_contours < 1 ) + return 1; + + last = outline->contours[outline->n_contours - 1]; + + for ( n = 0; n <= last; n++ ) + { + FT_Pos x, y; + + + x = outline->points[n].x; + if ( x < box.xMin ) + { + box.xMin = x; + indices.xMin = n; + } + if ( x > box.xMax ) + { + box.xMax = x; + indices.xMax = n; + } + + y = outline->points[n].y; + if ( y < box.yMin ) + { + box.yMin = y; + indices.yMin = n; + } + if ( y > box.yMax ) + { + box.yMax = y; + indices.yMax = n; + } + } + + /* test orientation of the xmin */ + n = ft_test_extrema( outline, indices.xMin ); + if ( n ) + goto Exit; + + n = ft_test_extrema( outline, indices.yMin ); + if ( n ) + goto Exit; + + n = ft_test_extrema( outline, indices.xMax ); + if ( n ) + goto Exit; + + n = ft_test_extrema( outline, indices.yMax ); + if ( !n ) + n = 1; + + Exit: + return n; + } + + + FT_EXPORT_DEF( FT_Error ) FT_Outline_Embolden( FT_GlyphSlot original, + FT_Outline* outline, + FT_Pos* advance ) + { + FT_Vector u, v; + FT_Vector* points; + FT_Vector cur, prev, next; + FT_Pos distance; + FT_Face face = FT_SLOT_FACE( original ); + int c, n, first, orientation; + + FT_UNUSED( advance ); + + + /* compute control distance */ + distance = FT_MulFix( face->units_per_EM / 60, + face->size->metrics.y_scale ); + + orientation = ft_get_orientation( &original->outline ); + + points = original->outline.points; + + first = 0; + for ( c = 0; c < outline->n_contours; c++ ) + { + int last = outline->contours[c]; + + + prev = points[last]; + + for ( n = first; n <= last; n++ ) + { + FT_Pos norm, delta, d; + FT_Vector in, out; + + + cur = points[n]; + if ( n < last ) next = points[n + 1]; + else next = points[first]; + + /* compute the in and out vectors */ + in.x = cur.x - prev.x; + in.y = cur.y - prev.y; + + out.x = next.x - cur.x; + out.y = next.y - cur.y; + + /* compute U and V */ + norm = ft_norm( &in ); + u.x = orientation * FT_DivFix( in.y, norm ); + u.y = orientation * -FT_DivFix( in.x, norm ); + + norm = ft_norm( &out ); + v.x = orientation * FT_DivFix( out.y, norm ); + v.y = orientation * -FT_DivFix( out.x, norm ); + + d = distance; + + if ( ( outline->tags[n] & FT_Curve_Tag_On ) == 0 ) + d *= 2; + + /* Check discriminant for parallel vectors */ + delta = FT_MulFix( u.x, v.y ) - FT_MulFix( u.y, v.x ); + if ( delta > FT_BOLD_THRESHOLD || delta < -FT_BOLD_THRESHOLD ) + { + /* Move point -- compute A and B */ + FT_Pos x, y, A, B; + + + A = d + FT_MulFix( cur.x, u.x ) + FT_MulFix( cur.y, u.y ); + B = d + FT_MulFix( cur.x, v.x ) + FT_MulFix( cur.y, v.y ); + + x = FT_MulFix( A, v.y ) - FT_MulFix( B, u.y ); + y = FT_MulFix( B, u.x ) - FT_MulFix( A, v.x ); + + outline->points[n].x = distance + FT_DivFix( x, delta ); + outline->points[n].y = distance + FT_DivFix( y, delta ); + } + else + { + /* Vectors are nearly parallel */ + FT_Pos x, y; + + + x = distance + cur.x + FT_MulFix( d, u.x + v.x ) / 2; + y = distance + cur.y + FT_MulFix( d, u.y + v.y ) / 2; + + outline->points[n].x = x; + outline->points[n].y = y; + } + + prev = cur; + } + + first = last + 1; + } + + if ( advance ) + *advance = ( *advance + distance * 4 ) & -64; + + return 0; + } + + +/* END */ Index: xc/extras/freetype2/src/base/ftsystem.c diff -u /dev/null xc/extras/freetype2/src/base/ftsystem.c:1.1.1.1 --- /dev/null Mon Dec 18 14:22:35 2000 +++ xc/extras/freetype2/src/base/ftsystem.c Fri Dec 8 16:26:20 2000 @@ -0,0 +1,283 @@ +/***************************************************************************/ +/* */ +/* ftsystem.c */ +/* */ +/* ANSI-specific FreeType low-level system interface (body). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + /*************************************************************************/ + /* */ + /* 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 +#include +#include +#include +#include + +#include +#include +#include + + + /*************************************************************************/ + /* */ + /* 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_Alloc() or FT_Realloc(). */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* */ + /* ft_alloc */ + /* */ + /* */ + /* The memory allocation function. */ + /* */ + /* */ + /* memory :: A pointer to the memory object. */ + /* */ + /* size :: The requested size in bytes. */ + /* */ + /* */ + /* The address of newly allocated block. */ + /* */ + static + 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. */ + /* */ + static + 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. */ + /* */ + static + 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. */ + /* */ + static + void ft_close_stream( FT_Stream stream ) + { + fclose( STREAM_FILE( stream ) ); + + stream->descriptor.pointer = NULL; + stream->size = 0; + stream->base = 0; + } + + + /*************************************************************************/ + /* */ + /* */ + /* ft_io_stream */ + /* */ + /* */ + /* The function to open a stream. */ + /* */ + /* */ + /* stream :: A pointer to the stream object. */ + /* */ + /* offset :: The position in the data stream to start reading. */ + /* */ + /* buffer :: The address of buffer to store the read data. */ + /* */ + /* count :: The number of bytes to read from the stream. */ + /* */ + /* */ + /* The number of bytes actually read. */ + /* */ + static + unsigned long ft_io_stream( FT_Stream stream, + unsigned long offset, + unsigned char* buffer, + unsigned long count ) + { + FILE* file; + + + file = STREAM_FILE( stream ); + + fseek( file, offset, SEEK_SET ); + + return (unsigned long)fread( buffer, 1, count, file ); + } + + + /* documentation is in ftobjs.h */ + + FT_EXPORT_DEF( FT_Error ) FT_New_Stream( const char* filepathname, + FT_Stream astream ) + { + FILE* file; + + + if ( !astream ) + return FT_Err_Invalid_Stream_Handle; + + file = fopen( filepathname, "rb" ); + if ( !file ) + { + FT_ERROR(( "FT_New_Stream:" )); + FT_ERROR(( " could not open `%s'\n", filepathname )); + + return FT_Err_Cannot_Open_Resource; + } + + fseek( file, 0, SEEK_END ); + astream->size = ftell( file ); + fseek( file, 0, SEEK_SET ); + + astream->descriptor.pointer = file; + astream->pathname.pointer = (char*)filepathname; + astream->pos = 0; + + astream->read = ft_io_stream; + astream->close = ft_close_stream; + + FT_TRACE1(( "FT_New_Stream:" )); + FT_TRACE1(( " opened `%s' (%d bytes) successfully\n", + filepathname, astream->size )); + + return FT_Err_Ok; + } + + + /* documentation is in ftobjs.h */ + + FT_EXPORT_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; + } + + return memory; + } + + + /* documentation is in ftobjs.h */ + + FT_EXPORT_DEF( void ) FT_Done_Memory( FT_Memory memory ) + { + free( memory ); + } + + +/* END */ Index: xc/extras/freetype2/src/base/rules.mk diff -u /dev/null xc/extras/freetype2/src/base/rules.mk:1.1.1.1 --- /dev/null Mon Dec 18 14:22:35 2000 +++ xc/extras/freetype2/src/base/rules.mk Fri Dec 8 16:26:20 2000 @@ -0,0 +1,85 @@ +# +# FreeType 2 base layer configuration rules +# + + +# 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. + + +# 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$(SRC_)base + + +# Base layer sources +# +# ftsystem, ftinit, and ftdebug are handled by freetype.mk +# +BASE_SRC := $(BASE_)ftcalc.c \ + $(BASE_)ftextend.c \ + $(BASE_)ftlist.c \ + $(BASE_)ftobjs.c \ + $(BASE_)ftstream.c \ + $(BASE_)ftoutln.c \ + $(BASE_)ftnames.c + +# Base layer `extensions' sources +# +# An extension is added to the library file (.a or .lib) as a separate +# object. It will then be linked to the final executable only if one of its +# symbols is used by the application. +# +BASE_EXT_SRC := $(BASE_)ftglyph.c \ + $(BASE_)ftmm.c \ + $(BASE_)ftbbox.c + +# Default extensions objects +# +BASE_EXT_OBJ := $(BASE_EXT_SRC:$(BASE_)%.c=$(OBJ_)%.$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_)%.c=$(OBJ_)%.$O) +BASE_OBJ_S := $(OBJ_)ftbase.$O + +# Base layer root source file for single build +# +BASE_SRC_S := $(BASE_)ftbase.c + + +# Base layer - single object build +# +$(BASE_OBJ_S): $(BASE_SRC_S) $(BASE_SRC) $(FREETYPE_H) + $(BASE_COMPILE) $T$@ $(BASE_SRC_S) + + +# Multiple objects build + extensions +# +$(OBJ_)%.$O: $(BASE_)%.c $(FREETYPE_H) + $(BASE_COMPILE) $T$@ $< + +# EOF Index: xc/extras/freetype2/src/cache/ftcache.c diff -u /dev/null xc/extras/freetype2/src/cache/ftcache.c:1.1.1.1 --- /dev/null Mon Dec 18 14:22:36 2000 +++ xc/extras/freetype2/src/cache/ftcache.c Fri Dec 8 16:26:20 2000 @@ -0,0 +1,42 @@ +/***************************************************************************/ +/* */ +/* ftcache.c */ +/* */ +/* The FreeType Caching sub-system (body only). */ +/* */ +/* Copyright 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. */ +/* */ +/***************************************************************************/ + + +#define FT_MAKE_OPTION_SINGLE_OBJECT + +#ifdef FT_FLAT_COMPILE + +#include "ftlru.c" +#include "ftcmanag.c" +#include "ftcglyph.c" +#include "ftcchunk.c" +#include "ftcimage.c" +#include "ftcsbits.c" + +#else + +#include +#include +#include +#include +#include +#include + +#endif + + +/* END */ Index: xc/extras/freetype2/src/cache/ftcchunk.c diff -u /dev/null xc/extras/freetype2/src/cache/ftcchunk.c:1.1.1.1 --- /dev/null Mon Dec 18 14:22:36 2000 +++ xc/extras/freetype2/src/cache/ftcchunk.c Fri Dec 8 16:26:20 2000 @@ -0,0 +1,440 @@ +/***************************************************************************/ +/* */ +/* ftcchunk.c */ +/* */ +/* FreeType chunk cache cache (body). */ +/* */ +/* Copyright 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 +#include +#include +#include +#include + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** GLYPH NODES *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + /* create a new chunk node, setting its cache index and ref count */ + FT_EXPORT_DEF( FT_Error ) FTC_ChunkNode_Init( FTC_ChunkNode node, + FTC_ChunkSet cset, + FT_UInt index, + FT_Bool alloc ) + { + FTC_Chunk_Cache cache = cset->cache; + FTC_CacheNode_Data* data = FTC_CACHENODE_TO_DATA_P( &node->root ); + FT_Error error = 0; + + + data->cache_index = (FT_UShort)cache->root.cache_index; + data->ref_count = (FT_Short) 0; + node->cset = cset; + node->cset_index = (FT_UShort)index; + node->num_elements = ( index + 1 < cset->num_chunks ) + ? cset->element_count + : cset->element_max - cset->element_count*index; + if ( alloc ) + { + /* allocate elements array */ + FT_Memory memory; + + + memory = cache->root.memory; + error = MEM_Alloc( node->elements, + cset->element_size * cset->element_count ); + } + + return error; + } + + + FT_EXPORT_DEF( void ) FTC_ChunkNode_Destroy( FTC_ChunkNode node ) + { + FTC_ChunkSet cset = node->cset; + + + /* remove from parent set table */ + cset->chunks[node->cset_index] = 0; + + /* destroy the node */ + cset->clazz->destroy_node( node ); + } + + + FT_EXPORT_DEF( FT_ULong ) FTC_ChunkNode_Size( FTC_ChunkNode node ) + { + FTC_ChunkSet cset = node->cset; + + + return cset->clazz->size_node( node ); + } + + + FT_CALLBACK_TABLE_DEF + const FTC_CacheNode_Class ftc_chunk_cache_node_class = + { + (FTC_CacheNode_SizeFunc) FTC_ChunkNode_Size, + (FTC_CacheNode_DestroyFunc)FTC_ChunkNode_Destroy + }; + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** CHUNK SETS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + FT_EXPORT_DEF( FT_Error ) FTC_ChunkSet_New( FTC_Chunk_Cache cache, + FT_Pointer type, + FTC_ChunkSet *aset ) + { + FT_Error error; + FT_Memory memory = cache->root.memory; + FTC_Manager manager = cache->root.manager; + FTC_ChunkSet cset = 0; + + FTC_Chunk_Cache_Class* ccache_class; + FTC_ChunkSet_Class* clazz; + + + ccache_class = (FTC_Chunk_Cache_Class*)cache->root.clazz; + clazz = ccache_class->cset_class; + + *aset = 0; + + if ( ALLOC( cset, clazz->cset_byte_size ) ) + goto Exit; + + cset->cache = cache; + cset->manager = manager; + cset->memory = memory; + cset->clazz = clazz; + + /* now compute element_max, element_count and element_size */ + error = clazz->sizes( cset, type ); + if ( error ) + goto Exit; + + /* compute maximum number of nodes */ + cset->num_chunks = ( cset->element_max + cset->element_count - 1 ) / + cset->element_count; + + /* allocate chunk pointers table */ + if ( ALLOC_ARRAY( cset->chunks, cset->num_chunks, FTC_ChunkNode ) ) + goto Exit; + + /* initialize set by type if needed */ + if ( clazz->init ) + { + error = clazz->init( cset, type ); + if ( error ) + goto Exit; + } + + *aset = cset; + + Exit: + if ( error && cset ) + { + FREE( cset->chunks ); + FREE( cset ); + } + + return error; + } + + + FT_EXPORT_DEF( void ) FTC_ChunkSet_Destroy( FTC_ChunkSet cset ) + { + FTC_Chunk_Cache cache = cset->cache; + FTC_Manager manager = cache->root.manager; + FT_List glyphs_lru = &manager->global_lru; + FTC_ChunkNode* bucket = cset->chunks; + FTC_ChunkNode* bucket_limit = bucket + cset->num_chunks; + FT_Memory memory = cache->root.memory; + + FTC_ChunkSet_Class* clazz = cset->clazz; + + + /* for each bucket, free the list of glyph nodes */ + for ( ; bucket < bucket_limit; bucket++ ) + { + FTC_ChunkNode node = bucket[0]; + FT_ListNode lrunode; + + + if ( node ) + { + lrunode = FTC_CHUNKNODE_TO_LRUNODE( node ); + + manager->num_bytes -= clazz->size_node( node ); + manager->num_nodes--; + + FT_List_Remove( glyphs_lru, lrunode ); + + clazz->destroy_node( node ); + + bucket[0] = 0; + } + } + + if ( clazz->done ) + clazz->done( cset ); + + FREE( cset->chunks ); + FREE( cset ); + } + + + FT_EXPORT_DEF( FT_Error ) FTC_ChunkSet_Lookup_Node( + FTC_ChunkSet cset, + FT_UInt glyph_index, + FTC_ChunkNode *anode, + FT_UInt *anindex ) + { + FTC_Chunk_Cache cache = cset->cache; + FTC_Manager manager = cache->root.manager; + FT_Error error = 0; + + FTC_ChunkSet_Class* clazz = cset->clazz; + + + *anode = 0; + + if ( glyph_index >= cset->element_max ) + error = FT_Err_Invalid_Argument; + else + { + FT_UInt chunk_size = cset->element_count; + FT_UInt chunk_index = glyph_index / chunk_size; + FTC_ChunkNode* pnode = cset->chunks + chunk_index; + FTC_ChunkNode node = *pnode; + + + if ( !node ) + { + /* we didn't found the glyph image; we will now create a new one */ + error = clazz->new_node( cset, chunk_index, &node ); + if ( error ) + goto Exit; + + /* store the new chunk in the cset's table */ + *pnode = node; + + /* insert the node at the start the global LRU glyph list */ + FT_List_Insert( &manager->global_lru, + FTC_CHUNKNODE_TO_LRUNODE( node ) ); + + manager->num_bytes += clazz->size_node( node ); + manager->num_nodes++; + + if ( manager->num_bytes > manager->max_bytes ) + { + FTC_ChunkNode_Ref ( node ); + FTC_Manager_Compress( manager ); + FTC_ChunkNode_Unref ( node ); + } + } + + *anode = node; + *anindex = glyph_index - chunk_index * chunk_size; + } + + Exit: + return error; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** CHUNK SETS LRU CALLBACKS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + +#define FTC_CSET_LRU_GET_CACHE( lru ) \ + ( (FTC_Chunk_Cache)((lru)->user_data) ) + +#define FTC_CSET_LRU_GET_MANAGER( lru ) \ + FTC_CSET_LRU_GET_CACHE( lru )->manager + +#define FTC_LRUNODE_CSET( node ) \ + ( (FTC_ChunkSet)(node)->root.data ) + + + FT_CALLBACK_DEF + FT_Error ftc_chunk_set_lru_init( FT_Lru lru, + FT_LruNode node ) + { + FTC_Chunk_Cache cache = FTC_CSET_LRU_GET_CACHE( lru ); + FT_Error error; + FTC_ChunkSet cset; + + + error = FTC_ChunkSet_New( cache, + (FT_Pointer)node->key, + &cset ); + if ( !error ) + { + /* good, now set the set index within the set object */ + cset->cset_index = node - lru->nodes; + node->root.data = cset; + } + + return error; + } + + + FT_CALLBACK_DEF + void ftc_chunk_set_lru_done( FT_Lru lru, + FT_LruNode node ) + { + FTC_ChunkSet cset = FTC_LRUNODE_CSET( node ); + + FT_UNUSED( lru ); + + + FTC_ChunkSet_Destroy( cset ); + } + + + FT_CALLBACK_DEF + FT_Bool ftc_chunk_set_lru_compare( FT_LruNode node, + FT_LruKey key ) + { + FTC_ChunkSet cset = FTC_LRUNODE_CSET( node ); + + + return cset->clazz->compare( cset, (FT_Pointer)key ); + } + + + FT_CALLBACK_TABLE_DEF + const FT_Lru_Class ftc_chunk_set_lru_class = + { + sizeof( FT_LruRec ), + ftc_chunk_set_lru_init, + ftc_chunk_set_lru_done, + 0, /* no flush */ + ftc_chunk_set_lru_compare + }; + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** CHUNK CACHE OBJECTS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + FT_EXPORT_DEF( FT_Error ) FTC_Chunk_Cache_Init( FTC_Chunk_Cache cache ) + { + FT_Memory memory = cache->root.memory; + FT_Error error; + + FTC_Chunk_Cache_Class* ccache_clazz; + + + /* set up root node_class to be used by manager */ + cache->root.node_clazz = + (FTC_CacheNode_Class*)&ftc_chunk_cache_node_class; + + /* setup `compare' shortcut */ + ccache_clazz = (FTC_Chunk_Cache_Class*)cache->root.clazz; + cache->compare = ccache_clazz->cset_class->compare; + + error = FT_Lru_New( &ftc_chunk_set_lru_class, + FTC_MAX_CHUNK_SETS, + cache, + memory, + 1, /* pre_alloc == TRUE */ + &cache->csets_lru ); + return error; + } + + + FT_EXPORT_DEF( void ) FTC_Chunk_Cache_Done( FTC_Chunk_Cache cache ) + { + /* discard glyph sets */ + FT_Lru_Done( cache->csets_lru ); + } + + + FT_EXPORT_DEF( FT_Error ) FTC_Chunk_Cache_Lookup( FTC_Chunk_Cache cache, + FT_Pointer type, + FT_UInt gindex, + FTC_ChunkNode *anode, + FT_UInt *aindex ) + { + FT_Error error; + FTC_ChunkSet cset; + FTC_ChunkNode node; + FT_UInt cindex; + FTC_Manager manager; + + + /* check for valid `desc' delayed to FT_Lru_Lookup() */ + + if ( !cache || !anode || !aindex ) + return FT_Err_Invalid_Argument; + + *anode = 0; + *aindex = 0; + cset = cache->last_cset; + + if ( !cset || !cache->compare( cset, type ) ) + { + error = FT_Lru_Lookup( cache->csets_lru, + (FT_LruKey)type, + (FT_Pointer*)&cset ); + cache->last_cset = cset; + if ( error ) + goto Exit; + } + + error = FTC_ChunkSet_Lookup_Node( cset, gindex, &node, &cindex ); + if ( error ) + goto Exit; + + /* now compress the manager's cache pool if needed */ + manager = cache->root.manager; + if ( manager->num_bytes > manager->max_bytes ) + { + FTC_ChunkNode_Ref ( node ); + FTC_Manager_Compress( manager ); + FTC_ChunkNode_Unref ( node ); + } + + *anode = node; + *aindex = cindex; + + Exit: + return error; + } + + +/* END */ Index: xc/extras/freetype2/src/cache/ftcglyph.c diff -u /dev/null xc/extras/freetype2/src/cache/ftcglyph.c:1.1.1.1 --- /dev/null Mon Dec 18 14:22:36 2000 +++ xc/extras/freetype2/src/cache/ftcglyph.c Fri Dec 8 16:26:20 2000 @@ -0,0 +1,469 @@ +/***************************************************************************/ +/* */ +/* ftcglyph.c */ +/* */ +/* FreeType Glyph Image (FT_Glyph) cache (body). */ +/* */ +/* Copyright 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 +#include +#include +#include +#include + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** GLYPH NODES *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + /* create a new glyph node, setting its cache index and ref count */ + FT_EXPORT_DEF( void ) FTC_GlyphNode_Init( FTC_GlyphNode node, + FTC_GlyphSet gset, + FT_UInt gindex ) + { + FTC_Glyph_Cache cache = gset->cache; + FTC_CacheNode_Data* data = FTC_CACHENODE_TO_DATA_P( &node->root ); + + + data->cache_index = (FT_UShort)cache->root.cache_index; + data->ref_count = (FT_Short) 0; + node->gset_index = (FT_UShort)gset->gset_index; + node->glyph_index = (FT_UShort)gindex; + } + + + /* Important: This function is called from the cache manager to */ + /* destroy a given cache node during `cache compression'. The */ + /* second argument is always `cache.cache_data'. Thus be */ + /* certain that the function FTC_Glyph_Cache_New() does indeed */ + /* set its `cache_data' field correctly, otherwise bad things */ + /* will happen! */ + + FT_EXPORT_DEF( void ) FTC_GlyphNode_Destroy( FTC_GlyphNode node, + FTC_Glyph_Cache cache ) + { + FT_LruNode gset_lru = cache->gsets_lru->nodes + node->gset_index; + FTC_GlyphSet gset = (FTC_GlyphSet)gset_lru->root.data; + FT_UInt hash = node->glyph_index % gset->hash_size; + + + /* remove the node from its gset's bucket list */ + { + FTC_GlyphNode* pnode = gset->buckets + hash; + FTC_GlyphNode cur; + + + for (;;) + { + cur = *pnode; + if ( !cur ) + { + /* this should never happen */ + FT_ERROR(( "FTC_GlyphNode_Destroy:" + " trying to delete an unlisted node!" )); + return; + } + + if ( cur == node ) + { + *pnode = cur->gset_next; + break; + } + pnode = &cur->gset_next; + } + } + + /* destroy the node */ + gset->clazz->destroy_node( node, gset ); + } + + + /* Important: This function is called from the cache manager to */ + /* size a given cache node during `cache compression'. The */ + /* second argument is always `cache.user_data'. Thus be */ + /* certain that the function FTC_Glyph_Cache_New() does indeed */ + /* set its `user_data' field correctly, otherwise bad things */ + /* will happen! */ + + FT_EXPORT_DEF( FT_ULong ) FTC_GlyphNode_Size( FTC_GlyphNode node, + FTC_Glyph_Cache cache ) + { + FT_LruNode gset_lru = cache->gsets_lru->nodes + node->gset_index; + FTC_GlyphSet gset = (FTC_GlyphSet)gset_lru->root.data; + + + return gset->clazz->size_node( node, gset ); + } + + + FT_CALLBACK_TABLE_DEF + const FTC_CacheNode_Class ftc_glyph_cache_node_class = + { + (FTC_CacheNode_SizeFunc) FTC_GlyphNode_Size, + (FTC_CacheNode_DestroyFunc)FTC_GlyphNode_Destroy + }; + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** GLYPH SETS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + FT_EXPORT_DEF( FT_Error ) FTC_GlyphSet_New( FTC_Glyph_Cache cache, + FT_Pointer type, + FTC_GlyphSet *aset ) + { + FT_Error error; + FT_Memory memory = cache->root.memory; + FTC_Manager manager = cache->root.manager; + FTC_GlyphSet gset = 0; + + FTC_Glyph_Cache_Class* gcache_class; + FTC_GlyphSet_Class* clazz; + + + gcache_class = (FTC_Glyph_Cache_Class*)cache->root.clazz; + clazz = gcache_class->gset_class; + + *aset = 0; + + if ( ALLOC( gset, clazz->gset_byte_size ) ) + goto Exit; + + gset->cache = cache; + gset->manager = manager; + gset->memory = memory; + gset->hash_size = FTC_GSET_HASH_SIZE_DEFAULT; + gset->clazz = clazz; + + /* allocate buckets table */ + if ( ALLOC_ARRAY( gset->buckets, gset->hash_size, FTC_GlyphNode ) ) + goto Exit; + + /* initialize gset by type if needed */ + if ( clazz->init ) + { + error = clazz->init( gset, type ); + if ( error ) + goto Exit; + } + + *aset = gset; + + Exit: + if ( error && gset ) + { + FREE( gset->buckets ); + FREE( gset ); + } + + return error; + } + + + FT_EXPORT_DEF( void ) FTC_GlyphSet_Destroy( FTC_GlyphSet gset ) + { + FTC_Glyph_Cache cache = gset->cache; + FTC_Manager manager = cache->root.manager; + FT_List glyphs_lru = &manager->global_lru; + FTC_GlyphNode* bucket = gset->buckets; + FTC_GlyphNode* bucket_limit = bucket + gset->hash_size; + FT_Memory memory = cache->root.memory; + + FTC_GlyphSet_Class* clazz = gset->clazz; + + + /* for each bucket, free the list of glyph nodes */ + for ( ; bucket < bucket_limit; bucket++ ) + { + FTC_GlyphNode node = bucket[0]; + FTC_GlyphNode next = 0; + FT_ListNode lrunode; + + + for ( ; node; node = next ) + { + next = node->gset_next; + lrunode = FTC_GLYPHNODE_TO_LRUNODE( node ); + + manager->num_bytes -= clazz->size_node( node, gset ); + manager->num_nodes--; + + FT_List_Remove( glyphs_lru, lrunode ); + + clazz->destroy_node( node, gset ); + } + + bucket[0] = 0; + } + + if ( clazz->done ) + clazz->done( gset ); + + FREE( gset->buckets ); + FREE( gset ); + } + + + FT_EXPORT_DEF( FT_Error ) FTC_GlyphSet_Lookup_Node( + FTC_GlyphSet gset, + FT_UInt glyph_index, + FTC_GlyphNode *anode ) + { + FTC_Glyph_Cache cache = gset->cache; + FTC_Manager manager = cache->root.manager; + FT_UInt hash_index = glyph_index % gset->hash_size; + FTC_GlyphNode* bucket = gset->buckets + hash_index; + FTC_GlyphNode* pnode = bucket; + FTC_GlyphNode node; + FT_Error error; + + FTC_GlyphSet_Class* clazz = gset->clazz; + + + *anode = 0; + + for ( ;; ) + { + node = *pnode; + if ( !node ) + break; + + if ( (FT_UInt)node->glyph_index == glyph_index ) + { + /* we found it! -- move glyph to start of the lists */ + *pnode = node->gset_next; + node->gset_next = bucket[0]; + bucket[0] = node; + + FT_List_Up( &manager->global_lru, FTC_GLYPHNODE_TO_LRUNODE( node ) ); + *anode = node; + return 0; + } + /* go to next node in bucket */ + pnode = &node->gset_next; + } + + /* we didn't found the glyph image, we will now create a new one */ + error = clazz->new_node( gset, glyph_index, &node ); + if ( error ) + goto Exit; + + /* insert the node at the start of our bucket list */ + node->gset_next = bucket[0]; + bucket[0] = node; + + /* insert the node at the start the global LRU glyph list */ + FT_List_Insert( &manager->global_lru, FTC_GLYPHNODE_TO_LRUNODE( node ) ); + + manager->num_bytes += clazz->size_node( node, gset ); + manager->num_nodes++; + + if ( manager->num_bytes > manager->max_bytes ) + { + FTC_GlyphNode_Ref ( node ); + FTC_Manager_Compress( manager ); + FTC_GlyphNode_Unref ( node ); + } + + *anode = node; + + Exit: + return error; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** GLYPH SETS LRU CALLBACKS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + +#define FTC_GSET_LRU_GET_CACHE( lru ) \ + ( (FTC_Glyph_Cache)(lru)->user_data ) + +#define FTC_GSET_LRU_GET_MANAGER( lru ) \ + FTC_GSET_LRU_GET_CACHE( lru )->manager + +#define FTC_LRUNODE_GSET( node ) \ + ( (FTC_GlyphSet)(node)->root.data ) + + + FT_CALLBACK_DEF + FT_Error ftc_glyph_set_lru_init( FT_Lru lru, + FT_LruNode node ) + { + FTC_Glyph_Cache cache = FTC_GSET_LRU_GET_CACHE( lru ); + FT_Error error; + FTC_GlyphSet gset; + + + error = FTC_GlyphSet_New( cache, (FT_Pointer)node->key, &gset ); + if ( !error ) + { + /* good, now set the gset index within the gset object */ + gset->gset_index = node - lru->nodes; + node->root.data = gset; + } + + return error; + } + + + FT_CALLBACK_DEF + void ftc_glyph_set_lru_done( FT_Lru lru, + FT_LruNode node ) + { + FTC_GlyphSet gset = FTC_LRUNODE_GSET( node ); + + FT_UNUSED( lru ); + + + FTC_GlyphSet_Destroy( gset ); + } + + + FT_CALLBACK_DEF + FT_Bool ftc_glyph_set_lru_compare( FT_LruNode node, + FT_LruKey key ) + { + FTC_GlyphSet gset = FTC_LRUNODE_GSET( node ); + + + return gset->clazz->compare( gset, (FT_Pointer)key ); + } + + + FT_CALLBACK_TABLE_DEF + const FT_Lru_Class ftc_glyph_set_lru_class = + { + sizeof( FT_LruRec ), + ftc_glyph_set_lru_init, + ftc_glyph_set_lru_done, + 0, /* no flush */ + ftc_glyph_set_lru_compare + }; + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** GLYPH CACHE OBJECTS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + FT_EXPORT_DEF( FT_Error ) FTC_Glyph_Cache_Init( FTC_Glyph_Cache cache ) + { + FT_Memory memory = cache->root.memory; + FT_Error error; + + FTC_Glyph_Cache_Class* gcache_clazz; + + + /* set up root node_class to be used by manager */ + cache->root.node_clazz = + (FTC_CacheNode_Class*)&ftc_glyph_cache_node_class; + + /* setup the `compare' shortcut */ + gcache_clazz = (FTC_Glyph_Cache_Class*)cache->root.clazz; + cache->compare = gcache_clazz->gset_class->compare; + + /* The following is extremely important for ftc_destroy_glyph_image() */ + /* to work properly, as the second parameter that is sent to it */ + /* through the cache manager is `cache_data' and must be set to */ + /* `cache' here. */ + /* */ + cache->root.cache_data = cache; + + error = FT_Lru_New( &ftc_glyph_set_lru_class, + FTC_MAX_GLYPH_SETS, + cache, + memory, + 1, /* pre_alloc == TRUE */ + &cache->gsets_lru ); + return error; + } + + + FT_EXPORT_DEF( void ) FTC_Glyph_Cache_Done( FTC_Glyph_Cache cache ) + { + /* discard glyph sets */ + FT_Lru_Done( cache->gsets_lru ); + } + + + FT_EXPORT_DEF( FT_Error ) FTC_Glyph_Cache_Lookup( FTC_Glyph_Cache cache, + FT_Pointer type, + FT_UInt gindex, + FTC_GlyphNode *anode ) + { + FT_Error error; + FTC_GlyphSet gset; + FTC_GlyphNode node; + FTC_Manager manager; + + + /* check for valid `desc' delayed to FT_Lru_Lookup() */ + + if ( !cache || !anode ) + return FT_Err_Invalid_Argument; + + *anode = 0; + gset = cache->last_gset; + + if ( !gset || !cache->compare( gset, type ) ) + { + error = FT_Lru_Lookup( cache->gsets_lru, + (FT_LruKey)type, + (FT_Pointer*)&gset ); + cache->last_gset = gset; + if ( error ) + goto Exit; + } + + error = FTC_GlyphSet_Lookup_Node( gset, gindex, &node ); + if ( error ) + goto Exit; + + /* now compress the manager's cache pool if needed */ + manager = cache->root.manager; + if ( manager->num_bytes > manager->max_bytes ) + { + FTC_GlyphNode_Ref ( node ); + FTC_Manager_Compress( manager ); + FTC_GlyphNode_Unref ( node ); + } + + *anode = node; + + Exit: + return error; + } + + +/* END */ Index: xc/extras/freetype2/src/cache/ftcimage.c diff -u /dev/null xc/extras/freetype2/src/cache/ftcimage.c:1.1.1.1 --- /dev/null Mon Dec 18 14:22:36 2000 +++ xc/extras/freetype2/src/cache/ftcimage.c Fri Dec 8 16:26:20 2000 @@ -0,0 +1,297 @@ +/***************************************************************************/ +/* */ +/* ftcimage.c */ +/* */ +/* FreeType Image cache (body). */ +/* */ +/* Copyright 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 +#include + +#include /* memcmp() */ +#include /* labs() */ + + + /* the FT_Glyph image `glyph node' type */ + typedef struct FTC_GlyphImageRec_ + { + FTC_GlyphNodeRec root; + FT_Glyph ft_glyph; + + } FTC_GlyphImageRec, *FTC_GlyphImage; + + + /* the glyph image queue type */ + typedef struct FTC_ImageSetRec_ + { + FTC_GlyphSetRec root; + FTC_Image_Desc description; + + } FTC_ImageSetRec, *FTC_ImageSet; + + + typedef struct FTC_Image_CacheRec_ + { + FTC_Glyph_CacheRec root; + + } FTC_Image_CacheRec; + + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** GLYPH IMAGE NODES *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + FT_CALLBACK_DEF + void ftc_glyph_image_node_destroy( FTC_GlyphImage node, + FTC_GlyphSet gset ) + { + FT_Memory memory = gset->memory; + + + FT_Done_Glyph( node->ft_glyph ); + FREE( node ); + } + + + FT_CALLBACK_DEF + FT_Error ftc_glyph_image_node_new( FTC_GlyphSet gset, + FT_UInt glyph_index, + FTC_GlyphImage *anode ) + { + FT_Memory memory = gset->memory; + FTC_ImageSet imageset = (FTC_ImageSet)gset; + FT_Error error; + FTC_GlyphImage node = 0; + FT_Face face; + FT_Size size; + + + /* allocate node */ + if ( ALLOC( node, sizeof ( *node ) ) ) + goto Exit; + + /* initialize its inner fields */ + FTC_GlyphNode_Init( FTC_GLYPHNODE( node ), gset, glyph_index ); + + /* we will now load the glyph image */ + error = FTC_Manager_Lookup_Size( gset->manager, + &imageset->description.font, + &face, &size ); + if ( !error ) + { + FT_UInt gindex = node->root.glyph_index; + FT_UInt load_flags = FT_LOAD_DEFAULT; + FT_UInt image_type = imageset->description.image_type; + + + if ( FTC_IMAGE_FORMAT( image_type ) == ftc_image_format_bitmap ) + { + load_flags |= FT_LOAD_RENDER; + if ( image_type & ftc_image_flag_monochrome ) + load_flags |= FT_LOAD_MONOCHROME; + + /* disable embedded bitmaps loading if necessary */ + if ( image_type & ftc_image_flag_no_sbits ) + load_flags |= FT_LOAD_NO_BITMAP; + } + else if ( FTC_IMAGE_FORMAT( image_type ) == ftc_image_format_outline ) + { + /* disable embedded bitmaps loading */ + load_flags |= FT_LOAD_NO_BITMAP; + + if ( image_type & ftc_image_flag_unscaled ) + load_flags |= FT_LOAD_NO_SCALE; + } + + if ( image_type & ftc_image_flag_unhinted ) + load_flags |= FT_LOAD_NO_HINTING; + + if ( image_type & ftc_image_flag_autohinted ) + load_flags |= FT_LOAD_FORCE_AUTOHINT; + + error = FT_Load_Glyph( face, gindex, 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 ) + node->ft_glyph = glyph; + } + else + error = FT_Err_Invalid_Argument; + } + } + + Exit: + if ( error && node ) + FREE( node ); + + *anode = node; + return error; + } + + + /* this function is important because it is both part of */ + /* an FTC_GlyphSet_Class and an FTC_CacheNode_Class */ + /* */ + FT_CALLBACK_DEF + FT_ULong ftc_glyph_image_node_size( FTC_GlyphImage node ) + { + FT_ULong size = 0; + FT_Glyph glyph = node->ft_glyph; + + + switch ( glyph->format ) + { + case ft_glyph_format_bitmap: + { + FT_BitmapGlyph bitg; + + + bitg = (FT_BitmapGlyph)glyph; + size = bitg->bitmap.rows * 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 ( *node ); + return size; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** GLYPH IMAGE SETS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + FT_CALLBACK_DEF + FT_Error ftc_image_set_init( FTC_ImageSet iset, + FTC_Image_Desc* type ) + { + iset->description = *type; + return 0; + } + + + FT_CALLBACK_DEF + FT_Bool ftc_image_set_compare( FTC_ImageSet iset, + FTC_Image_Desc* type ) + { + return !memcmp( &iset->description, type, sizeof ( *type ) ); + } + + + FT_CALLBACK_TABLE_DEF + const FTC_GlyphSet_Class ftc_glyph_image_set_class = + { + sizeof( FTC_ImageSetRec ), + + (FTC_GlyphSet_InitFunc) ftc_image_set_init, + (FTC_GlyphSet_DoneFunc) 0, + (FTC_GlyphSet_CompareFunc) ftc_image_set_compare, + + (FTC_GlyphSet_NewNodeFunc) ftc_glyph_image_node_new, + (FTC_GlyphSet_SizeNodeFunc) ftc_glyph_image_node_size, + (FTC_GlyphSet_DestroyNodeFunc)ftc_glyph_image_node_destroy + }; + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** GLYPH IMAGE CACHE *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + FT_CALLBACK_TABLE_DEF + const FTC_Glyph_Cache_Class ftc_glyph_image_cache_class = + { + { + sizeof( FTC_Image_CacheRec ), + (FTC_Cache_InitFunc) FTC_Glyph_Cache_Init, + (FTC_Cache_DoneFunc) FTC_Glyph_Cache_Done + }, + (FTC_GlyphSet_Class*) &ftc_glyph_image_set_class + }; + + + FT_EXPORT_DEF( FT_Error ) FTC_Image_Cache_New( FTC_Manager manager, + FTC_Image_Cache *acache ) + { + return FTC_Manager_Register_Cache( + manager, + (FTC_Cache_Class*)&ftc_glyph_image_cache_class, + (FTC_Cache*)acache ); + } + + + FT_EXPORT_DEF( FT_Error ) FTC_Image_Cache_Lookup( FTC_Image_Cache cache, + FTC_Image_Desc* desc, + FT_UInt gindex, + FT_Glyph *aglyph ) + { + FT_Error error; + FTC_GlyphNode node; + + /* some argument checks are delayed to FTC_Glyph_Cache_Lookup */ + + if (!aglyph) + return FT_Err_Invalid_Argument; + + error = FTC_Glyph_Cache_Lookup( (FTC_Glyph_Cache)cache, + desc, gindex, &node ); + + if (!error) + *aglyph = ((FTC_GlyphImage)node)->ft_glyph; + + return error; + } + + +/* END */ Index: xc/extras/freetype2/src/cache/ftcmanag.c diff -u /dev/null xc/extras/freetype2/src/cache/ftcmanag.c:1.1.1.1 --- /dev/null Mon Dec 18 14:22:36 2000 +++ xc/extras/freetype2/src/cache/ftcmanag.c Fri Dec 8 16:26:20 2000 @@ -0,0 +1,487 @@ +/***************************************************************************/ +/* */ +/* ftcmanag.c */ +/* */ +/* FreeType Cache Manager (body). */ +/* */ +/* Copyright 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 +#include +#include +#include + + +#undef FT_COMPONENT +#define FT_COMPONENT trace_cache + +#define FTC_LRU_GET_MANAGER( lru ) (FTC_Manager)lru->user_data + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** FACE & SIZE LRU CALLBACKS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + FT_CALLBACK_DEF + FT_Error ftc_manager_init_face( FT_Lru lru, + FT_LruNode node ) + { + FTC_Manager manager = FTC_LRU_GET_MANAGER( lru ); + FT_Error error; + FT_Face face; + + + error = manager->request_face( (FTC_FaceID)node->key, + manager->library, + manager->request_data, + (FT_Face*)&node->root.data ); + if ( !error ) + { + /* destroy initial size object; it will be re-created later */ + face = (FT_Face)node->root.data; + if ( face->size ) + FT_Done_Size( face->size ); + } + + return error; + } + + + /* helper function for ftc_manager_done_face() */ + FT_CALLBACK_DEF + FT_Bool ftc_manager_size_selector( FT_Lru lru, + FT_LruNode node, + FT_Pointer data ) + { + FT_UNUSED( lru ); + + return ((FT_Size)node->root.data)->face == (FT_Face)data; + } + + + FT_CALLBACK_DEF + void ftc_manager_done_face( FT_Lru lru, + FT_LruNode node ) + { + FTC_Manager manager = FTC_LRU_GET_MANAGER( lru ); + FT_Face face = (FT_Face)node->root.data; + + + /* we must begin by removing all sizes for the target face */ + /* from the manager's list */ + FT_Lru_Remove_Selection( manager->sizes_lru, + ftc_manager_size_selector, + face ); + + /* all right, we can discard the face now */ + FT_Done_Face( face ); + node->root.data = 0; + } + + + typedef struct FTC_FontRequest_ + { + FT_Face face; + FT_UShort width; + FT_UShort height; + + } FTC_FontRequest; + + + FT_CALLBACK_DEF + FT_Error ftc_manager_init_size( FT_Lru lru, + FT_LruNode node ) + { + FTC_FontRequest* font_req = (FTC_FontRequest*)node->key; + FT_Size size; + FT_Error error; + FT_Face face = font_req->face; + + FT_UNUSED( lru ); + + + node->root.data = 0; + error = FT_New_Size( face, &size ); + if ( !error ) + { + face->size = size; + error = FT_Set_Pixel_Sizes( face, + font_req->width, + font_req->height ); + if ( error ) + FT_Done_Size( size ); + else + node->root.data = size; + } + return error; + } + + + FT_CALLBACK_DEF + void ftc_manager_done_size( FT_Lru lru, + FT_LruNode node ) + { + FT_UNUSED( lru ); + + FT_Done_Size( (FT_Size)node->root.data ); + } + + + FT_CALLBACK_DEF + FT_Error ftc_manager_flush_size( FT_Lru lru, + FT_LruNode node, + FT_LruKey key ) + { + FTC_FontRequest* req = (FTC_FontRequest*)key; + FT_Size size = (FT_Size)node->root.data; + FT_Error error; + + + if ( size->face == req->face ) + { + size->face->size = size; /* set current size */ + error = FT_Set_Pixel_Sizes( req->face, req->width, req->height ); + if ( error ) + FT_Done_Size( size ); + } + else + { + FT_Done_Size( size ); + node->key = key; + error = ftc_manager_init_size( lru, node ); + } + return error; + } + + + FT_CALLBACK_DEF + FT_Bool ftc_manager_compare_size( FT_LruNode node, + FT_LruKey key ) + { + FTC_FontRequest* req = (FTC_FontRequest*)key; + FT_Size size = (FT_Size)node->root.data; + + FT_UNUSED( node ); + + + return ( size->face == req->face && + size->metrics.x_ppem == req->width && + size->metrics.y_ppem == req->height ); + } + + + FT_CALLBACK_TABLE_DEF + const FT_Lru_Class ftc_face_lru_class = + { + sizeof ( FT_LruRec ), + ftc_manager_init_face, + ftc_manager_done_face, + 0, + 0 + }; + + + FT_CALLBACK_TABLE_DEF + const FT_Lru_Class ftc_size_lru_class = + { + sizeof ( FT_LruRec ), + ftc_manager_init_size, + ftc_manager_done_size, + ftc_manager_flush_size, + ftc_manager_compare_size + }; + + + 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 FT_Err_Invalid_Library_Handle; + + memory = library->memory; + + if ( ALLOC( manager, sizeof ( *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; + + error = FT_Lru_New( &ftc_face_lru_class, + max_faces, + manager, + memory, + 1, /* pre_alloc = TRUE */ + (FT_Lru*)&manager->faces_lru ); + if ( error ) + goto Exit; + + error = FT_Lru_New( &ftc_size_lru_class, + max_sizes, + manager, + memory, + 1, /* pre_alloc = TRUE */ + (FT_Lru*)&manager->sizes_lru ); + if ( error ) + goto Exit; + + manager->library = library; + manager->max_bytes = max_bytes; + manager->request_face = requester; + manager->request_data = req_data; + *amanager = manager; + + Exit: + if ( error && manager ) + { + FT_Lru_Done( manager->sizes_lru ); + FT_Lru_Done( manager->faces_lru ); + FREE( manager ); + } + + return error; + } + + + FT_EXPORT_DEF( void ) FTC_Manager_Done( FTC_Manager manager ) + { + FT_Memory memory; + FT_UInt index; + + + if ( !manager || !manager->library ) + return; + + memory = manager->library->memory; + + /* now discard all caches */ + for (index = 0; index < FTC_MAX_CACHES; index++ ) + { + FTC_Cache cache = manager->caches[index]; + + + if ( cache ) + { + cache->clazz->done_cache( cache ); + FREE( cache ); + manager->caches[index] = 0; + } + } + + /* discard faces and sizes */ + FT_Lru_Done( manager->sizes_lru ); + FT_Lru_Done( manager->faces_lru ); + + FREE( manager ); + } + + + FT_EXPORT_DEF( void ) FTC_Manager_Reset( FTC_Manager manager ) + { + if (manager ) + { + FT_Lru_Reset( manager->sizes_lru ); + FT_Lru_Reset( manager->faces_lru ); + } + /* XXX: FIXME: flush the caches? */ + } + + + FT_EXPORT_DEF( FT_Error ) FTC_Manager_Lookup_Face( FTC_Manager manager, + FTC_FaceID face_id, + FT_Face *aface ) + { + if ( !manager ) + return FT_Err_Invalid_Cache_Handle; + + return FT_Lru_Lookup( manager->faces_lru, + (FT_LruKey)face_id, + (FT_Pointer*)aface ); + } + + + FT_EXPORT_DEF( FT_Error ) FTC_Manager_Lookup_Size( FTC_Manager manager, + FTC_Font font, + FT_Face *aface, + FT_Size *asize ) + { + FTC_FontRequest req; + FT_Error error; + + + /* check for valid `manager' delayed to FTC_Manager_Lookup_Face() */ + + if ( aface ) + *aface = 0; + + if ( asize ) + *asize = 0; + + error = FTC_Manager_Lookup_Face( manager, font->face_id, aface ); + if ( !error ) + { + FT_Size size; + + + req.face = *aface; + req.width = font->pix_width; + req.height = font->pix_height; + + error = FT_Lru_Lookup( manager->sizes_lru, + (FT_LruKey)&req, + (FT_Pointer*)&size ); + if ( !error ) + { + /* select the size as the current one for this face */ + (*aface)->size = size; + + if ( asize ) + *asize = size; + } + } + + return 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. */ + FT_EXPORT_DEF( void ) FTC_Manager_Compress( FTC_Manager manager ) + { + FT_ListNode node; + + + node = manager->global_lru.tail; + while ( manager->num_bytes > manager->max_bytes && node ) + { + FTC_CacheNode cache_node = FTC_LIST_TO_CACHENODE( node ); + FTC_CacheNode_Data* data = FTC_CACHENODE_TO_DATA_P( cache_node ); + FTC_Cache cache; + FT_ListNode prev = node->prev; + + + if ( data->ref_count <= 0 ) + { + /* ok, we are going to remove this node */ + FT_List_Remove( &manager->global_lru, node ); + + /* finalize cache node */ + cache = manager->caches[data->cache_index]; + if ( cache ) + { + FTC_CacheNode_Class* clazz = cache->node_clazz; + + + manager->num_bytes -= clazz->size_node( cache_node, + cache->cache_data ); + + clazz->destroy_node( cache_node, cache->cache_data ); + } + else + { + /* this should never happen! */ + FT_ERROR(( "FTC_Manager_Compress: Cache Manager is corrupted!\n" )); + } + + /* check, just in case of general corruption :-) */ + if ( manager->num_nodes <= 0 ) + FT_ERROR(( "FTC_Manager_Compress: Invalid cache node count!\n" )); + else + manager->num_nodes--; + } + node = prev; + } + } + + + FT_EXPORT_DEF( FT_Error ) FTC_Manager_Register_Cache( + FTC_Manager manager, + FTC_Cache_Class* clazz, + FTC_Cache *acache ) + { + FT_Error error = FT_Err_Invalid_Argument; + + + if ( manager && clazz && acache ) + { + FT_Memory memory = manager->library->memory; + FTC_Cache cache; + FT_UInt index = 0; + + + /* by default, return 0 */ + *acache = 0; + + /* check for an empty cache slot in the manager's table */ + for ( index = 0; index < FTC_MAX_CACHES; index++ ) + { + if ( manager->caches[index] == 0 ) + break; + } + + /* return an error if there are too many registered caches */ + if ( index >= FTC_MAX_CACHES ) + { + error = FT_Err_Too_Many_Caches; + FT_ERROR(( "FTC_Manager_Register_Cache:" )); + FT_ERROR(( " too many registered caches\n" )); + goto Exit; + } + + if ( !ALLOC( cache, clazz->cache_byte_size ) ) + { + cache->manager = manager; + cache->memory = memory; + cache->clazz = clazz; + + /* THIS IS VERY IMPORTANT! IT WILL WRETCH THE MANAGER */ + /* IF IT IS NOT SET CORRECTLY */ + cache->cache_index = index; + + if ( clazz->init_cache ) + error = clazz->init_cache( cache ); + + if ( error ) + FREE( cache ); + else + manager->caches[index] = *acache = cache; + } + } + + Exit: + return error; + } + + +/* END */ Index: xc/extras/freetype2/src/cache/ftcsbits.c diff -u /dev/null xc/extras/freetype2/src/cache/ftcsbits.c:1.1.1.1 --- /dev/null Mon Dec 18 14:22:36 2000 +++ xc/extras/freetype2/src/cache/ftcsbits.c Fri Dec 8 16:26:20 2000 @@ -0,0 +1,391 @@ +/***************************************************************************/ +/* */ +/* ftcsbits.c */ +/* */ +/* FreeType sbits manager (body). */ +/* */ +/* Copyright 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 +#include +#include +#include + +#include /* memcmp() */ + + +#define FTC_SBITSET_ELEMENT_COUNT 16 + + + typedef struct FTC_SBitSetRec_ + { + FTC_ChunkSetRec root; + FTC_Image_Desc desc; + + } FTC_SBitSetRec, *FTC_SBitSet; + + + typedef struct FTC_SBit_CacheRec_ + { + FTC_Chunk_CacheRec root; + + } FTC_SBit_CacheRec; + + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** SBIT CACHE NODES *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + FT_CALLBACK_DEF + void ftc_sbit_chunk_node_destroy( FTC_ChunkNode node ) + { + FTC_ChunkSet cset = node->cset; + FT_Memory memory = cset->memory; + FT_UInt count = node->num_elements; + FTC_SBit sbit = (FTC_SBit)node->elements; + + + for ( ; count > 0; sbit++, count-- ) + FREE( sbit->buffer ); + + FREE( node->elements ); + FREE( node ); + } + + + FT_CALLBACK_DEF + FT_Error ftc_bitmap_copy( FT_Memory memory, + FT_Bitmap* source, + FTC_SBit target ) + { + FT_Error error; + FT_Int pitch = source->pitch; + FT_ULong size; + + + if ( pitch < 0 ) + pitch = -pitch; + + size = (FT_ULong)( pitch * source->rows ); + + if ( !ALLOC( target->buffer, size ) ) + MEM_Copy( target->buffer, source->buffer, size ); + + return error; + } + + + FT_CALLBACK_DEF + FT_Error ftc_sbit_chunk_node_new( FTC_ChunkSet cset, + FT_UInt index, + FTC_ChunkNode *anode ) + { + FT_Error error; + FT_Memory memory = cset->memory; + FTC_SBitSet sbitset = (FTC_SBitSet)cset; + FTC_ChunkNode node = 0; + FT_Face face; + FT_Size size; + + + /* allocate node */ + if ( ALLOC( node, sizeof ( *node ) ) ) + goto Exit; + + /* initialize its inner fields */ + error = FTC_ChunkNode_Init( node, cset, index, 1 ); + if ( error ) + goto Exit; + + /* we will now load all glyph images for this chunk */ + error = FTC_Manager_Lookup_Size( cset->manager, + &sbitset->desc.font, + &face, &size ); + if ( !error ) + { + FT_UInt glyph_index = index * cset->element_count; + FT_UInt load_flags = FT_LOAD_DEFAULT; + FT_UInt image_type = sbitset->desc.image_type; + FT_UInt count = node->num_elements; + FTC_SBit sbit = (FTC_SBit)node->elements; + + + /* determine load flags, depending on the font description's */ + /* image type */ + + if ( FTC_IMAGE_FORMAT( image_type ) == ftc_image_format_bitmap ) + { + if ( image_type & ftc_image_flag_monochrome ) + load_flags |= FT_LOAD_MONOCHROME; + + /* disable embedded bitmaps loading if necessary */ + if ( image_type & ftc_image_flag_no_sbits ) + load_flags |= FT_LOAD_NO_BITMAP; + } + else + { + FT_ERROR(( "FTC_SBit_Cache: cannot load scalable glyphs in an" + " sbit cache, please check your arguments!\n" )); + error = FT_Err_Invalid_Argument; + goto Exit; + } + + /* always render glyphs to bitmaps */ + load_flags |= FT_LOAD_RENDER; + + if ( image_type & ftc_image_flag_unhinted ) + load_flags |= FT_LOAD_NO_HINTING; + + if ( image_type & ftc_image_flag_autohinted ) + load_flags |= FT_LOAD_FORCE_AUTOHINT; + + /* load a chunk of small bitmaps in a row */ + for ( ; count > 0; count--, glyph_index++, sbit++ ) + { + /* by default, indicates a `missing' glyph */ + sbit->buffer = 0; + + error = FT_Load_Glyph( face, glyph_index, load_flags ); + if ( !error ) + { + FT_Int temp; + FT_GlyphSlot slot = face->glyph; + FT_Bitmap* bitmap = &slot->bitmap; + FT_Int xadvance, yadvance; + + + /* 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 ) + + /* XXX: FIXME: add support for vertical layouts maybe */ + + /* horizontal advance in pixels */ + xadvance = ( slot->metrics.horiAdvance + 32 ) >> 6; + yadvance = ( slot->metrics.vertAdvance + 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 ) ) + { + 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; + + /* grab the bitmap when possible */ + if ( slot->flags & ft_glyph_own_bitmap ) + { + slot->flags &= ~ft_glyph_own_bitmap; + sbit->buffer = bitmap->buffer; + } + else + { + /* copy the bitmap into a new buffer -- ignore error */ + ftc_bitmap_copy( memory, bitmap, sbit ); + } + } + } + } + + /* ignore the errors that might have occurred -- */ + /* we recognize unloaded glyphs with `sbit.buffer == 0' */ + error = 0; + } + + Exit: + if ( error && node ) + { + FREE( node->elements ); + FREE( node ); + } + + *anode = node; + + return error; + } + + + /* this function is important because it is both part of */ + /* an FTC_ChunkSet_Class and an FTC_CacheNode_Class */ + /* */ + FT_CALLBACK_DEF + FT_ULong ftc_sbit_chunk_node_size( FTC_ChunkNode node ) + { + FT_ULong size; + FTC_ChunkSet cset = node->cset; + FT_UInt count = node->num_elements; + FT_Int pitch; + FTC_SBit sbit = (FTC_SBit)node->elements; + + + /* the node itself */ + size = sizeof ( *node ); + + /* the sbit records */ + size += cset->element_count * sizeof ( FTC_SBitRec ); + + 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; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** SBIT CHUNK SETS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + FT_CALLBACK_DEF + FT_Error ftc_sbit_chunk_set_sizes( FTC_ChunkSet cset, + FTC_Image_Desc* desc ) + { + FT_Error error; + FT_Face face; + + + cset->element_count = FTC_SBITSET_ELEMENT_COUNT; + cset->element_size = sizeof ( FTC_SBitRec ); + + /* lookup the FT_Face to obtain the number of glyphs */ + error = FTC_Manager_Lookup_Face( cset->manager, + desc->font.face_id, &face ); + if ( !error ) + cset->element_max = face->num_glyphs; + + return error; + } + + + FT_CALLBACK_DEF + FT_Error ftc_sbit_chunk_set_init( FTC_SBitSet sset, + FTC_Image_Desc* type ) + { + sset->desc = *type; + + return 0; + } + + + FT_CALLBACK_DEF + FT_Bool ftc_sbit_chunk_set_compare( FTC_SBitSet sset, + FTC_Image_Desc* type ) + { + return !memcmp( &sset->desc, type, sizeof ( *type ) ); + } + + + FT_CALLBACK_TABLE_DEF + const FTC_ChunkSet_Class ftc_sbit_chunk_set_class = + { + sizeof( FTC_SBitSetRec ), + + (FTC_ChunkSet_InitFunc) ftc_sbit_chunk_set_init, + (FTC_ChunkSet_DoneFunc) 0, + (FTC_ChunkSet_CompareFunc) ftc_sbit_chunk_set_compare, + (FTC_ChunkSet_SizesFunc) ftc_sbit_chunk_set_sizes, + + (FTC_ChunkSet_NewNodeFunc) ftc_sbit_chunk_node_new, + (FTC_ChunkSet_SizeNodeFunc) ftc_sbit_chunk_node_size, + (FTC_ChunkSet_DestroyNodeFunc)ftc_sbit_chunk_node_destroy + }; + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** SBITS CACHE *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + FT_CALLBACK_TABLE_DEF + const FTC_Chunk_Cache_Class ftc_sbit_cache_class = + { + { + sizeof( FTC_SBit_CacheRec ), + (FTC_Cache_InitFunc)FTC_Chunk_Cache_Init, + (FTC_Cache_DoneFunc)FTC_Chunk_Cache_Done + }, + (FTC_ChunkSet_Class*)&ftc_sbit_chunk_set_class + }; + + + FT_EXPORT_DEF( FT_Error ) FTC_SBit_Cache_New( FTC_Manager manager, + FTC_SBit_Cache *acache ) + { + return FTC_Manager_Register_Cache( + manager, + (FTC_Cache_Class*)&ftc_sbit_cache_class, + (FTC_Cache*)acache ); + } + + + FT_EXPORT_DEF( FT_Error ) FTC_SBit_Cache_Lookup( FTC_SBit_Cache cache, + FTC_Image_Desc* desc, + FT_UInt gindex, + FTC_SBit *ansbit ) + { + FT_Error error; + FTC_ChunkNode node; + FT_UInt cindex; + + + /* argument checks delayed to FTC_Chunk_Cache_Lookup */ + if ( !ansbit ) + return FT_Err_Invalid_Argument; + + *ansbit = 0; + error = FTC_Chunk_Cache_Lookup( &cache->root, desc, gindex, + &node, &cindex ); + if ( !error ) + *ansbit = (FTC_SBit)node->elements + cindex; + + return error; + } + + +/* END */ Index: xc/extras/freetype2/src/cache/ftlru.c diff -u /dev/null xc/extras/freetype2/src/cache/ftlru.c:1.1.1.1 --- /dev/null Mon Dec 18 14:22:36 2000 +++ xc/extras/freetype2/src/cache/ftlru.c Fri Dec 8 16:26:20 2000 @@ -0,0 +1,334 @@ +/***************************************************************************/ +/* */ +/* ftlru.c */ +/* */ +/* Simple LRU list-cache (body). */ +/* */ +/* Copyright 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 +#include +#include + + + static + void lru_build_free_list( FT_LruNode nodes, + FT_UInt count, + FT_List free_list ) + { + FT_LruNode node = nodes; + FT_LruNode limit = node + count; + + + free_list->head = free_list->tail = 0; + for ( ; node < limit; node++ ) + FT_List_Add( free_list, (FT_ListNode)node ); + } + + + FT_EXPORT_DEF( FT_Error ) FT_Lru_New( const FT_Lru_Class* clazz, + FT_UInt max_elements, + FT_Pointer user_data, + FT_Memory memory, + FT_Bool pre_alloc, + FT_Lru *anlru ) + { + FT_Error error; + FT_Lru lru; + + + if ( !anlru ) + return FT_Err_Invalid_Argument; + + *anlru = 0; + if ( !ALLOC( lru, sizeof ( *lru ) ) ) + { + if ( pre_alloc ) + { + /* allocate static array of lru list nodes */ + if ( ALLOC_ARRAY( lru->nodes, max_elements, FT_LruNodeRec ) ) + { + FREE( lru ); + goto Exit; + } + + /* build the `free_nodes' list from the array */ + lru_build_free_list( lru->nodes, max_elements, &lru->free_nodes ); + } + + /* initialize common fields */ + lru->clazz = (FT_Lru_Class*)clazz; + lru->max_elements = max_elements; + lru->memory = memory; + lru->user_data = user_data; + + *anlru = lru; + } + + Exit: + return error; + } + + + FT_EXPORT_DEF( void ) FT_Lru_Reset( FT_Lru lru ) + { + FT_ListNode node; + FT_Lru_Class* clazz; + FT_Memory memory; + + + if ( !lru ) + return; + + node = lru->elements.head; + clazz = lru->clazz; + memory = lru->memory; + + while ( node ) + { + FT_ListNode next = node->next; + + + clazz->done_element( lru, (FT_LruNode)node ); + if ( !lru->nodes ) + FREE( node ); + + node = next; + } + + /* rebuild free list if necessary */ + if ( lru->nodes ) + lru_build_free_list( lru->nodes, lru->max_elements, &lru->free_nodes ); + + lru->elements.head = lru->elements.tail = 0; + lru->num_elements = 0; + } + + + FT_EXPORT_DEF( void ) FT_Lru_Done( FT_Lru lru ) + { + FT_Memory memory; + + + if ( !lru ) + return; + + memory = lru->memory; + + FT_Lru_Reset( lru ); + FREE( lru ); + } + + + FT_EXPORT_DEF( FT_Error ) FT_Lru_Lookup_Node( FT_Lru lru, + FT_LruKey key, + FT_LruNode *anode ) + { + FT_Error error = 0; + FT_ListNode node; + FT_Lru_Class* clazz; + FT_LruNode found = 0; + FT_Memory memory; + + + if ( !lru || !key || !anode ) + return FT_Err_Invalid_Argument; + + node = lru->elements.head; + clazz = lru->clazz; + memory = lru->memory; + + if ( clazz->compare_element ) + { + for ( ; node; node = node->next ) + if ( clazz->compare_element( (FT_LruNode)node, key ) ) + { + found = (FT_LruNode)node; + break; + } + } + else + { + for ( ; node; node = node->next ) + if ( ((FT_LruNode)node)->key == key ) + { + found = (FT_LruNode)node; + break; + } + } + + if ( !found ) + { + /* we haven't found the relevant element. We will now try */ + /* to create a new one. */ + if ( lru->num_elements >= lru->max_elements ) + { + /* this lru list is full; we will now flush */ + /* the oldest node */ + FT_LruNode lru_node; + + + node = lru->elements.tail; + lru_node = (FT_LruNode)node; + found = lru_node; + + if ( clazz->flush_element ) + error = clazz->flush_element( lru, lru_node, key ); + else + { + clazz->done_element( lru, lru_node ); + lru_node->key = key; + node->data = 0; + error = clazz->init_element( lru, lru_node ); + } + + if ( !error ) + { + /* now, move element to top of list */ + FT_List_Up( &lru->elements, node ); + } + else + { + /* in case of error, the node must be discarded */ + FT_List_Remove( &lru->elements, node ); + lru->num_elements--; + + if ( lru->nodes ) + FT_List_Insert( &lru->free_nodes, node ); + else + FREE( lru_node ); + + found = 0; + } + } + else + { + FT_LruNode lru_node; + + + /* create a new lru list node, then the element for it */ + if ( lru->nodes ) + { + node = lru->free_nodes.head; + lru_node = (FT_LruNode)node; + lru_node->key = key; + + error = clazz->init_element( lru, lru_node ); + if ( error ) + goto Exit; + + FT_List_Remove( &lru->free_nodes, node ); + } + else + { + if ( ALLOC( lru_node, sizeof ( *lru_node ) ) ) + goto Exit; + + lru_node->key = key; + error = clazz->init_element( lru, lru_node ); + if ( error ) + { + FREE( lru_node ); + goto Exit; + } + } + + found = lru_node; + node = (FT_ListNode)lru_node; + FT_List_Insert( &lru->elements, node ); + lru->num_elements++; + } + } + + Exit: + *anode = found; + return error; + } + + + FT_EXPORT_DEF( FT_Error ) FT_Lru_Lookup( FT_Lru lru, + FT_LruKey key, + FT_Pointer *anobject ) + { + FT_Error error; + FT_LruNode node; + + + /* check for valid `lru' and `key' delayed to FT_Lru_Lookup_Node() */ + + if ( !anobject ) + return FT_Err_Invalid_Argument; + + *anobject = 0; + error = FT_Lru_Lookup_Node( lru, key, &node ); + if ( !error ) + *anobject = node->root.data; + + return error; + } + + + FT_EXPORT_DEF( void ) FT_Lru_Remove_Node( FT_Lru lru, + FT_LruNode node ) + { + if ( !lru || !node ) + return; + + if ( lru->num_elements > 0 ) + { + FT_List_Remove( &lru->elements, (FT_ListNode)node ); + lru->clazz->done_element( lru, node ); + + if ( lru->nodes ) + FT_List_Insert( &lru->free_nodes, (FT_ListNode)node ); + else + { + FT_Memory memory = lru->memory; + + + FREE( node ); + } + + lru->num_elements--; + } + } + + + FT_EXPORT_DEF( void ) FT_Lru_Remove_Selection( FT_Lru lru, + FT_Lru_Selector selector, + FT_Pointer data ) + { + if ( !lru || !selector ) + return; + + if ( lru->num_elements > 0 ) + { + FT_ListNode node = lru->elements.head; + FT_ListNode next; + + + while ( node ) + { + next = node->next; + if ( selector( lru, (FT_LruNode)node, data ) ) + { + /* remove this element from the list, and destroy it */ + FT_Lru_Remove_Node( lru, (FT_LruNode)node ); + } + node = next; + } + } + } + + +/* END */ Index: xc/extras/freetype2/src/cache/rules.mk diff -u /dev/null xc/extras/freetype2/src/cache/rules.mk:1.1.1.1 --- /dev/null Mon Dec 18 14:22:36 2000 +++ xc/extras/freetype2/src/cache/rules.mk Fri Dec 8 16:26:20 2000 @@ -0,0 +1,78 @@ +# +# FreeType 2 Cache configuration rules +# + + +# Copyright 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. + + +# Cache driver directory +# +CACHE_DIR := $(SRC_)cache +CACHE_DIR_ := $(CACHE_DIR)$(SEP) + +CACHE_H_DIR := $(PUBLIC_)cache +CACHE_H_DIR_ := $(CACHE_H_DIR)$(SEP) + +# compilation flags for the driver +# +Cache_COMPILE := $(FT_COMPILE) + + +# Cache driver sources (i.e., C files) +# +Cache_DRV_SRC := $(CACHE_DIR_)ftlru.c \ + $(CACHE_DIR_)ftcmanag.c \ + $(CACHE_DIR_)ftcglyph.c \ + $(CACHE_DIR_)ftcchunk.c \ + $(CACHE_DIR_)ftcsbits.c \ + $(CACHE_DIR_)ftcimage.c + +# Cache driver headers +# +Cache_DRV_H := $(CACHE_H_DIR_)ftlru.h \ + $(CACHE_H_DIR_)ftcmanag.h \ + $(CACHE_H_DIR_)ftcglyph.h \ + $(CACHE_H_DIR_)ftcimage.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_)%.$O) +Cache_DRV_OBJ_S := $(OBJ_)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$@ $(Cache_DRV_SRC_S) + + +# Cache driver - multiple objects +# +$(OBJ_)%.$O: $(CACHE_DIR_)%.c $(FREETYPE_H) $(Cache_DRV_H) + $(Cache_COMPILE) $T$@ $< + + +# update main driver object lists +# +DRV_OBJS_S += $(Cache_DRV_OBJ_S) +DRV_OBJS_M += $(Cache_DRV_OBJ_M) + + +# EOF Index: xc/extras/freetype2/src/cff/cff.c diff -u /dev/null xc/extras/freetype2/src/cff/cff.c:1.1.1.1 --- /dev/null Mon Dec 18 14:22:36 2000 +++ xc/extras/freetype2/src/cff/cff.c Fri Dec 8 16:26:20 2000 @@ -0,0 +1,40 @@ +/***************************************************************************/ +/* */ +/* cff.c */ +/* */ +/* FreeType OpenType driver component (body only). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#define FT_MAKE_OPTION_SINGLE_OBJECT + +#ifdef FT_FLAT_COMPILE + +#include "t2driver.c" /* driver interface */ +#include "t2parse.c" /* token parser */ +#include "t2load.c" /* tables loader */ +#include "t2objs.c" /* object management */ +#include "t2gload.c" /* glyph loader */ + +#else + +#include /* driver interface */ +#include /* token parser */ +#include /* tables loader */ +#include /* object management */ +#include /* glyph loader */ + +#endif + + +/* END */ Index: xc/extras/freetype2/src/cff/module.mk diff -u /dev/null xc/extras/freetype2/src/cff/module.mk:1.1.1.1 --- /dev/null Mon Dec 18 14:22:36 2000 +++ xc/extras/freetype2/src/cff/module.mk Fri Dec 8 16:26:20 2000 @@ -0,0 +1,22 @@ +# +# FreeType 2 CFF module definition +# + + +# 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. + + +make_module_list: add_cff_driver + +add_cff_driver: + $(OPEN_DRIVER)cff_driver_class$(CLOSE_DRIVER) + $(ECHO_DRIVER)cff $(ECHO_DRIVER_DESC)OpenType fonts with extension *.otf$(ECHO_DRIVER_DONE) + +# EOF Index: xc/extras/freetype2/src/cff/rules.mk diff -u /dev/null xc/extras/freetype2/src/cff/rules.mk:1.1.1.1 --- /dev/null Mon Dec 18 14:22:36 2000 +++ xc/extras/freetype2/src/cff/rules.mk Fri Dec 8 16:26:20 2000 @@ -0,0 +1,69 @@ +# +# FreeType 2 OpenType/CFF driver configuration rules +# + + +# 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. + + +# OpenType driver directory +# +T2_DIR := $(SRC_)cff +T2_DIR_ := $(T2_DIR)$(SEP) + + +T2_COMPILE := $(FT_COMPILE) + + +# T2 driver sources (i.e., C files) +# +T2_DRV_SRC := $(T2_DIR_)t2objs.c \ + $(T2_DIR_)t2load.c \ + $(T2_DIR_)t2gload.c \ + $(T2_DIR_)t2parse.c \ + $(T2_DIR_)t2driver.c + +# T2 driver headers +# +T2_DRV_H := $(T2_DRV_SRC:%.c=%.h) \ + $(T2_DIR_)t2tokens.h + + +# T2 driver object(s) +# +# T2_DRV_OBJ_M is used during `multi' builds +# T2_DRV_OBJ_S is used during `single' builds +# +T2_DRV_OBJ_M := $(T2_DRV_SRC:$(T2_DIR_)%.c=$(OBJ_)%.$O) +T2_DRV_OBJ_S := $(OBJ_)cff.$O + +# T2 driver source file for single build +# +T2_DRV_SRC_S := $(T2_DIR_)cff.c + + +# T2 driver - single object +# +$(T2_DRV_OBJ_S): $(T2_DRV_SRC_S) $(T2_DRV_SRC) $(FREETYPE_H) $(T2_DRV_H) + $(T2_COMPILE) $T$@ $(T2_DRV_SRC_S) + + +# T2 driver - multiple objects +# +$(OBJ_)%.$O: $(T2_DIR_)%.c $(FREETYPE_H) $(T2_DRV_H) + $(T2_COMPILE) $T$@ $< + + +# update main driver object lists +# +DRV_OBJS_S += $(T2_DRV_OBJ_S) +DRV_OBJS_M += $(T2_DRV_OBJ_M) + +# EOF Index: xc/extras/freetype2/src/cff/t2driver.c diff -u /dev/null xc/extras/freetype2/src/cff/t2driver.c:1.1.1.1 --- /dev/null Mon Dec 18 14:22:36 2000 +++ xc/extras/freetype2/src/cff/t2driver.c Fri Dec 8 16:26:20 2000 @@ -0,0 +1,378 @@ +/***************************************************************************/ +/* */ +/* t2driver.c */ +/* */ +/* OpenType font driver implementation (body). */ +/* */ +/* 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 +#include +#include +#include +#include + +#include + + +#ifdef FT_FLAT_COMPILE + +#include "t2driver.h" +#include "t2gload.h" + +#else + +#include +#include + +#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_t2driver + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** F A C E S ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + +#undef PAIR_TAG +#define PAIR_TAG( left, right ) ( ( (FT_ULong)left << 16 ) | \ + (FT_ULong)right ) + + + /*************************************************************************/ + /* */ + /* */ + /* 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( TT_Face face, + FT_UInt left_glyph, + FT_UInt right_glyph, + FT_Vector* kerning ) + { + TT_Kern_0_Pair* pair; + + + if ( !face ) + return T2_Err_Invalid_Face_Handle; + + kerning->x = 0; + kerning->y = 0; + + if ( face->kern_pairs ) + { + /* there are some kerning pairs in this font file! */ + FT_ULong search_tag = PAIR_TAG( left_glyph, right_glyph ); + FT_Long left, right; + + + left = 0; + right = face->num_kern_pairs - 1; + + while ( left <= right ) + { + FT_Int middle = left + ( ( right - left ) >> 1 ); + FT_ULong cur_pair; + + + pair = face->kern_pairs + middle; + cur_pair = PAIR_TAG( pair->left, pair->right ); + + if ( cur_pair == search_tag ) + goto Found; + + if ( cur_pair < search_tag ) + left = middle + 1; + else + right = middle - 1; + } + } + + Exit: + return T2_Err_Ok; + + Found: + kerning->x = pair->value; + goto Exit; + } + + +#undef PAIR_TAG + + + /*************************************************************************/ + /* */ + /* */ + /* 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( T2_GlyphSlot slot, + T2_Size size, + FT_UShort glyph_index, + FT_UInt load_flags ) + { + FT_Error error; + + + if ( !slot ) + return T2_Err_Invalid_Glyph_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 object must have the same parent */ + if ( size->face != slot->root.face ) + return T2_Err_Invalid_Face_Handle; + } + + /* now load the glyph outline if necessary */ + error = T2_Load_Glyph( slot, size, glyph_index, load_flags ); + + /* force drop-out mode to 2 - irrelevant now */ + /* slot->outline.dropout_mode = 2; */ + + return error; + } + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** C H A R A C T E R M A P P I N G S ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + /*************************************************************************/ + /* */ + /* */ + /* Get_Char_Index */ + /* */ + /* */ + /* Uses a charmap to return a given character code's glyph index. */ + /* */ + /* */ + /* charmap :: A handle to the source charmap object. */ + /* charcode :: The character code. */ + /* */ + /* */ + /* Glyph index. 0 means `undefined character code'. */ + /* */ + static + FT_UInt t2_get_char_index( TT_CharMap charmap, + FT_Long charcode ) + { + FT_Error error; + T2_Face face; + TT_CMapTable* cmap; + + + cmap = &charmap->cmap; + face = (T2_Face)charmap->root.face; + + /* Load table if needed */ + if ( !cmap->loaded ) + { + SFNT_Interface* sfnt = (SFNT_Interface*)face->sfnt; + + + error = sfnt->load_charmap( face, cmap, face->root.stream ); + if ( error ) + return 0; + + cmap->loaded = TRUE; + } + + return ( cmap->get_index ? cmap->get_index( cmap, charcode ) : 0 ); + } + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** D R I V E R I N T E R F A C E ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + static + FT_Module_Interface t2_get_interface( T2_Driver driver, + const char* interface ) + { + FT_Module sfnt; + + + /* we simply pass our request to the `sfnt' module */ + sfnt = FT_Get_Module( driver->root.root.library, "sfnt" ); + + return sfnt ? sfnt->clazz->get_interface( sfnt, interface ) : 0; + } + + + /* The FT_DriverInterface structure is defined in ftdriver.h. */ + + FT_CALLBACK_TABLE_DEF + const FT_Driver_Class cff_driver_class = + { + /* begin with the FT_Module_Class fields */ + { + ft_module_font_driver | ft_module_driver_scalable, + sizeof( T2_DriverRec ), + "cff", + 0x10000L, + 0x20000L, + + 0, /* module-specific interface */ + + (FT_Module_Constructor)T2_Init_Driver, + (FT_Module_Destructor) T2_Done_Driver, + (FT_Module_Requester) t2_get_interface, + }, + + /* now the specific driver fields */ + sizeof( TT_FaceRec ), + sizeof( FT_SizeRec ), + sizeof( T2_GlyphSlotRec ), + + (FTDriver_initFace) T2_Init_Face, + (FTDriver_doneFace) T2_Done_Face, + (FTDriver_initSize) 0, + (FTDriver_doneSize) 0, + (FTDriver_initGlyphSlot)0, + (FTDriver_doneGlyphSlot)0, + + (FTDriver_setCharSizes) 0, + (FTDriver_setPixelSizes)0, + + (FTDriver_loadGlyph) Load_Glyph, + (FTDriver_getCharIndex) t2_get_char_index, + + (FTDriver_getKerning) Get_Kerning, + (FTDriver_attachFile) 0, + (FTDriver_getAdvances) 0 + }; + + +#ifdef FT_CONFIG_OPTION_DYNAMIC_DRIVERS + + + /*************************************************************************/ + /* */ + /* */ + /* getDriverClass */ + /* */ + /* */ + /* This function is used when compiling the TrueType driver as a */ + /* shared library (`.DLL' or `.so'). It will be used by the */ + /* high-level library of FreeType to retrieve the address of the */ + /* driver's generic interface. */ + /* */ + /* It shouldn't be implemented in a static build, as each driver must */ + /* have the same function as an exported entry point. */ + /* */ + /* */ + /* The address of the TrueType's driver generic interface. The */ + /* format-specific interface can then be retrieved through the method */ + /* interface->get_format_interface. */ + /* */ + FT_EXPORT_DEF( const FT_Driver_Class* ) getDriverClass( void ) + { + return &cff_driver_class; + } + + +#endif /* CONFIG_OPTION_DYNAMIC_DRIVERS */ + + +/* END */ Index: xc/extras/freetype2/src/cff/t2driver.h diff -u /dev/null xc/extras/freetype2/src/cff/t2driver.h:1.1.1.1 --- /dev/null Mon Dec 18 14:22:36 2000 +++ xc/extras/freetype2/src/cff/t2driver.h Fri Dec 8 16:26:20 2000 @@ -0,0 +1,41 @@ +/***************************************************************************/ +/* */ +/* t2driver.h */ +/* */ +/* High-level OpenType driver interface (specification). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#ifndef T2DRIVER_H +#define T2DRIVER_H + +#include + +#ifdef __cplusplus + extern "C" { +#endif + + + FT_CALLBACK_TABLE + const FT_Driver_Class cff_driver_class; + + +#ifdef __cplusplus + } +#endif + + +#endif /* T2DRIVER_H */ + + +/* END */ Index: xc/extras/freetype2/src/cff/t2gload.c diff -u /dev/null xc/extras/freetype2/src/cff/t2gload.c:1.1.1.1 --- /dev/null Mon Dec 18 14:22:36 2000 +++ xc/extras/freetype2/src/cff/t2gload.c Fri Dec 8 16:26:20 2000 @@ -0,0 +1,2089 @@ +/***************************************************************************/ +/* */ +/* t2gload.c */ +/* */ +/* OpenType Glyph Loader (body). */ +/* */ +/* 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 +#include +#include +#include +#include +#include + + +#ifdef FT_FLAT_COMPILE + +#include "t2load.h" +#include "t2gload.h" + +#else + +#include +#include + +#endif + + +#include + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_t2gload + + + typedef enum T2_Operator_ + { + t2_op_unknown = 0, + + t2_op_rmoveto, + t2_op_hmoveto, + t2_op_vmoveto, + + t2_op_rlineto, + t2_op_hlineto, + t2_op_vlineto, + + t2_op_rrcurveto, + t2_op_hhcurveto, + t2_op_hvcurveto, + t2_op_rcurveline, + t2_op_rlinecurve, + t2_op_vhcurveto, + t2_op_vvcurveto, + + t2_op_flex, + t2_op_hflex, + t2_op_hflex1, + t2_op_flex1, + + t2_op_endchar, + + t2_op_hstem, + t2_op_vstem, + t2_op_hstemhm, + t2_op_vstemhm, + + t2_op_hintmask, + t2_op_cntrmask, + + t2_op_abs, + t2_op_add, + t2_op_sub, + t2_op_div, + t2_op_neg, + t2_op_random, + t2_op_mul, + t2_op_sqrt, + + t2_op_blend, + + t2_op_drop, + t2_op_exch, + t2_op_index, + t2_op_roll, + t2_op_dup, + + t2_op_put, + t2_op_get, + t2_op_store, + t2_op_load, + + t2_op_and, + t2_op_or, + t2_op_not, + t2_op_eq, + t2_op_ifelse, + + t2_op_callsubr, + t2_op_callgsubr, + t2_op_return, + + /* do not remove */ + t2_op_max + + } T2_Operator; + + +#define T2_COUNT_CHECK_WIDTH 0x80 +#define T2_COUNT_EXACT 0x40 +#define T2_COUNT_CLEAR_STACK 0x20 + + + static const FT_Byte t2_argument_counts[] = + { + 0, /* unknown */ + + 2 | T2_COUNT_CHECK_WIDTH | T2_COUNT_EXACT, /* rmoveto */ + 1 | T2_COUNT_CHECK_WIDTH | T2_COUNT_EXACT, + 1 | T2_COUNT_CHECK_WIDTH | T2_COUNT_EXACT, + + 0 | T2_COUNT_CLEAR_STACK, /* rlineto */ + 0 | T2_COUNT_CLEAR_STACK, + 0 | T2_COUNT_CLEAR_STACK, + + 0 | T2_COUNT_CLEAR_STACK, /* rrcurveto */ + 0 | T2_COUNT_CLEAR_STACK, + 0 | T2_COUNT_CLEAR_STACK, + 0 | T2_COUNT_CLEAR_STACK, + 0 | T2_COUNT_CLEAR_STACK, + 0 | T2_COUNT_CLEAR_STACK, + 0 | T2_COUNT_CLEAR_STACK, + + 13, /* flex */ + 7, + 9, + 11, + + 0 | T2_COUNT_CHECK_WIDTH, /* endchar */ + + 2 | T2_COUNT_CHECK_WIDTH, /* hstem */ + 2 | T2_COUNT_CHECK_WIDTH, + 2 | T2_COUNT_CHECK_WIDTH, + 2 | T2_COUNT_CHECK_WIDTH, + + 0, /* hintmask */ + 0, /* cntrmask */ + + 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 *********/ + /********** *********/ + /********** *********/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* */ + /* T2_Init_Builder */ + /* */ + /* */ + /* Initializes a given glyph builder. */ + /* */ + /* */ + /* builder :: A pointer to the glyph builder to initialize. */ + /* */ + /* */ + /* face :: The current face object. */ + /* */ + /* size :: The current size object. */ + /* */ + /* glyph :: The current glyph object. */ + /* */ + static + void T2_Init_Builder( T2_Builder* builder, + TT_Face face, + T2_Size size, + T2_GlyphSlot glyph ) + { + 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 ); + } + + 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; + } + + + /*************************************************************************/ + /* */ + /* */ + /* T2_Done_Builder */ + /* */ + /* */ + /* 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. */ + /* */ + /* */ + /* builder :: A pointer to the glyph builder to finalize. */ + /* */ + static + void T2_Done_Builder( T2_Builder* builder ) + { + T2_GlyphSlot glyph = builder->glyph; + + + if ( glyph ) + glyph->root.outline = *builder->base; + } + + + /*************************************************************************/ + /* */ + /* */ + /* t2_compute_bias */ + /* */ + /* */ + /* Computes the bias value in dependence of the number of glyph */ + /* subroutines. */ + /* */ + /* */ + /* num_subrs :: The number of glyph subroutines. */ + /* */ + /* */ + /* The bias value. */ + static + FT_Int t2_compute_bias( FT_UInt num_subrs ) + { + FT_Int result; + + + if ( num_subrs < 1240 ) + result = 107; + else if ( num_subrs < 33900 ) + result = 1131; + else + result = 32768; + + return result; + } + + + /*************************************************************************/ + /* */ + /* */ + /* T2_Init_Decoder */ + /* */ + /* */ + /* Initializes a given glyph decoder. */ + /* */ + /* */ + /* decoder :: A pointer to the glyph builder to initialize. */ + /* */ + /* */ + /* face :: The current face object. */ + /* */ + /* size :: The current size object. */ + /* */ + /* slot :: The current glyph object. */ + /* */ + FT_LOCAL_DEF + void T2_Init_Decoder( T2_Decoder* decoder, + TT_Face face, + T2_Size size, + T2_GlyphSlot slot ) + { + CFF_Font* cff = (CFF_Font*)face->extra.data; + + + /* clear everything */ + MEM_Set( decoder, 0, sizeof ( *decoder ) ); + + /* initialize builder */ + T2_Init_Builder( &decoder->builder, face, size, slot ); + + /* initialize Type2 decoder */ + decoder->num_globals = cff->num_global_subrs; + decoder->globals = cff->global_subrs; + decoder->globals_bias = t2_compute_bias( decoder->num_globals ); + } + + + /* this function is used to select the locals subrs array */ + FT_LOCAL_DEF + void T2_Prepare_Decoder( T2_Decoder* decoder, + FT_UInt glyph_index ) + { + CFF_Font* cff = (CFF_Font*)decoder->builder.face->extra.data; + CFF_SubFont* sub = &cff->top_font; + + + /* manage CID fonts */ + if ( cff->num_subfonts >= 1 ) + { + FT_Byte fd_index = CFF_Get_FD( &cff->fd_select, glyph_index ); + + + sub = cff->subfonts[fd_index]; + } + + decoder->num_locals = sub->num_local_subrs; + decoder->locals = sub->local_subrs; + decoder->locals_bias = t2_compute_bias( decoder->num_locals ); + + decoder->glyph_width = sub->private_dict.default_width; + decoder->nominal_width = sub->private_dict.nominal_width; + } + + + /* check that there is enough room for `count' more points */ + static + FT_Error check_points( T2_Builder* builder, + FT_Int count ) + { + return FT_GlyphLoader_Check_Points( builder->loader, count, 0 ); + } + + + /* add a new point, do not check space */ + static + void add_point( T2_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 = 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 add_point1( T2_Builder* builder, + FT_Pos x, + FT_Pos y ) + { + FT_Error error; + + + error = check_points( builder, 1 ); + if ( !error ) + add_point( builder, x, y, 1 ); + + return error; + } + + + /* check room for a new contour, then add it */ + static + FT_Error add_contour( T2_Builder* builder ) + { + FT_Outline* outline = builder->current; + FT_Error error; + + + if ( !builder->load_points ) + { + outline->n_contours++; + return T2_Err_Ok; + } + + error = FT_GlyphLoader_Check_Points( builder->loader, 0, 1 ); + if ( !error ) + { + if ( outline->n_contours > 0 ) + outline->contours[outline->n_contours - 1] = outline->n_points - 1; + + outline->n_contours++; + } + + return error; + } + + + /* if a path was begun, add its first on-curve point */ + static + FT_Error start_point( T2_Builder* builder, + FT_Pos x, + FT_Pos y ) + { + FT_Error error = 0; + + + /* test whether we are building a new contour */ + if ( !builder->path_begun ) + { + builder->path_begun = 1; + error = add_contour( builder ); + if ( !error ) + error = add_point1( builder, x, y ); + } + return error; + } + + + /* close the current contour */ + static + void close_contour( T2_Builder* builder ) + { + FT_Outline* outline = builder->current; + + /* 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] = outline->n_points - 1; + } + + +#define USE_ARGS( n ) do \ + { \ + top -= n; \ + if ( top < decoder->stack ) \ + goto Stack_Underflow; \ + } while ( 0 ) + + + /*************************************************************************/ + /* */ + /* */ + /* T2_Parse_CharStrings */ + /* */ + /* */ + /* Parses a given Type 2 charstrings program. */ + /* */ + /* */ + /* decoder :: The current Type 1 decoder. */ + /* */ + /* */ + /* charstring_base :: The base of the charstring stream. */ + /* */ + /* charstring_len :: The length in bytes of the charstring stream. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF + FT_Error T2_Parse_CharStrings( T2_Decoder* decoder, + FT_Byte* charstring_base, + FT_Int charstring_len ) + { + FT_Error error; + T2_Decoder_Zone* zone; + FT_Byte* ip; + FT_Byte* limit; + T2_Builder* builder = &decoder->builder; + FT_Outline* outline; + FT_Pos x, y; + FT_Fixed seed; + FT_Fixed* stack; + + + /* 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 ) ) & 0xFFFF; + if ( seed == 0 ) + seed = 0x7384; + + /* initialize the decoder */ + decoder->top = decoder->stack; + decoder->zone = decoder->zones; + zone = decoder->zones; + stack = decoder->top; + + builder->path_begun = 0; + + zone->base = charstring_base; + limit = zone->limit = charstring_base + charstring_len; + ip = zone->cursor = zone->base; + + error = T2_Err_Ok; + outline = builder->current; + + x = builder->pos_x; + y = builder->pos_y; + + /* now, execute loop */ + while ( ip < limit ) + { + T2_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 >= T2_MAX_OPERANDS ) + goto Stack_Overflow; + + val <<= shift; + *decoder->top++ = val; + +#ifdef FT_DEBUG_LEVEL_TRACE + if ( !( val & 0xFFFF ) ) + FT_TRACE4(( " %d", (FT_Int32)( val >> 16 ) )); + else + FT_TRACE4(( " %.2f", val/65536.0 )); +#endif + + } + else + { + FT_Fixed* args = decoder->top; + FT_Int num_args = args - decoder->stack; + FT_Int req_args; + + + /* find operator */ + op = t2_op_unknown; + + switch ( v ) + { + case 1: + op = t2_op_hstem; + break; + case 3: + op = t2_op_vstem; + break; + case 4: + op = t2_op_vmoveto; + break; + case 5: + op = t2_op_rlineto; + break; + case 6: + op = t2_op_hlineto; + break; + case 7: + op = t2_op_vlineto; + break; + case 8: + op = t2_op_rrcurveto; + break; + case 10: + op = t2_op_callsubr; + break; + case 11: + op = t2_op_return; + break; + case 12: + { + if ( ip >= limit ) + goto Syntax_Error; + v = *ip++; + + switch ( v ) + { + case 3: + op = t2_op_and; + break; + case 4: + op = t2_op_or; + break; + case 5: + op = t2_op_not; + break; + case 8: + op = t2_op_store; + break; + case 9: + op = t2_op_abs; + break; + case 10: + op = t2_op_add; + break; + case 11: + op = t2_op_sub; + break; + case 12: + op = t2_op_div; + break; + case 13: + op = t2_op_load; + break; + case 14: + op = t2_op_neg; + break; + case 15: + op = t2_op_eq; + break; + case 18: + op = t2_op_drop; + break; + case 20: + op = t2_op_put; + break; + case 21: + op = t2_op_get; + break; + case 22: + op = t2_op_ifelse; + break; + case 23: + op = t2_op_random; + break; + case 24: + op = t2_op_mul; + break; + case 26: + op = t2_op_sqrt; + break; + case 27: + op = t2_op_dup; + break; + case 28: + op = t2_op_exch; + break; + case 29: + op = t2_op_index; + break; + case 30: + op = t2_op_roll; + break; + case 34: + op = t2_op_hflex; + break; + case 35: + op = t2_op_flex; + break; + case 36: + op = t2_op_hflex1; + break; + case 37: + op = t2_op_flex1; + break; + default: + /* decrement ip for syntax error message */ + ip--; + } + } + break; + case 14: + op = t2_op_endchar; + break; + case 16: + op = t2_op_blend; + break; + case 18: + op = t2_op_hstemhm; + break; + case 19: + op = t2_op_hintmask; + break; + case 20: + op = t2_op_cntrmask; + break; + case 21: + op = t2_op_rmoveto; + break; + case 22: + op = t2_op_hmoveto; + break; + case 23: + op = t2_op_vstemhm; + break; + case 24: + op = t2_op_rcurveline; + break; + case 25: + op = t2_op_rlinecurve; + break; + case 26: + op = t2_op_vvcurveto; + break; + case 27: + op = t2_op_hhcurveto; + break; + case 29: + op = t2_op_callgsubr; + break; + case 30: + op = t2_op_vhcurveto; + break; + case 31: + op = t2_op_hvcurveto; + break; + default: + ; + } + if ( op == t2_op_unknown ) + goto Syntax_Error; + + /* check arguments */ + req_args = t2_argument_counts[op]; + if ( req_args & T2_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 t2_op_hmoveto: + case t2_op_vmoveto: + set_width_ok = num_args & 2; + break; + + case t2_op_hstem: + case t2_op_vstem: + case t2_op_hstemhm: + case t2_op_vstemhm: + case t2_op_endchar: + case t2_op_rmoveto: + set_width_ok = num_args & 1; + break; + + default: + set_width_ok = 0; + break; + } + + if ( set_width_ok ) + { + decoder->glyph_width = decoder->nominal_width + + ( stack[0] >> 16 ); + 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 t2_op_hstem: + case t2_op_vstem: + case t2_op_hstemhm: + case t2_op_vstemhm: + /* if the number of arguments is not even, the first one */ + /* is simply the glyph width, encoded as the difference */ + /* to nominalWidthX */ + FT_TRACE4(( op == t2_op_hstem ? " hstem" : + op == t2_op_vstem ? " vstem" : + op == t2_op_hstemhm ? " hstemhm" : + " vstemhm" )); + decoder->num_hints += num_args / 2; + args = stack; + break; + + case t2_op_hintmask: + case t2_op_cntrmask: + FT_TRACE4(( op == t2_op_hintmask ? " hintmask" + : " cntrmask" )); + + decoder->num_hints += num_args / 2; + ip += ( decoder->num_hints + 7 ) >> 3; + if ( ip >= limit ) + goto Syntax_Error; + args = stack; + break; + + case t2_op_rmoveto: + FT_TRACE4(( " rmoveto" )); + + close_contour( builder ); + builder->path_begun = 0; + x += args[0]; + y += args[1]; + args = stack; + break; + + case t2_op_vmoveto: + FT_TRACE4(( " vmoveto" )); + + close_contour( builder ); + builder->path_begun = 0; + y += args[0]; + args = stack; + break; + + case t2_op_hmoveto: + FT_TRACE4(( " hmoveto" )); + + close_contour( builder ); + builder->path_begun = 0; + x += args[0]; + args = stack; + break; + + case t2_op_rlineto: + FT_TRACE4(( " rlineto" )); + + if ( start_point ( builder, x, y ) || + check_points( builder, num_args / 2 ) ) + goto Memory_Error; + + if ( num_args < 2 || num_args & 1 ) + goto Stack_Underflow; + + args = stack; + while ( args < decoder->top ) + { + x += args[0]; + y += args[1]; + add_point( builder, x, y, 1 ); + args += 2; + } + args = stack; + break; + + case t2_op_hlineto: + case t2_op_vlineto: + { + FT_Int phase = ( op == t2_op_hlineto ); + + + FT_TRACE4(( op == t2_op_hlineto ? " hlineto" + : " vlineto" )); + + if ( start_point ( builder, x, y ) || + check_points( builder, num_args ) ) + goto Memory_Error; + + args = stack; + while (args < decoder->top ) + { + if ( phase ) + x += args[0]; + else + y += args[0]; + + if ( add_point1( builder, x, y ) ) + goto Memory_Error; + + args++; + phase ^= 1; + } + args = stack; + } + break; + + case t2_op_rrcurveto: + FT_TRACE4(( " rrcurveto" )); + + /* check number of arguments; must be a multiple of 6 */ + if ( num_args % 6 != 0 ) + goto Stack_Underflow; + + if ( start_point ( builder, x, y ) || + check_points( builder, num_args / 2 ) ) + goto Memory_Error; + + args = stack; + while ( args < decoder->top ) + { + x += args[0]; + y += args[1]; + add_point( builder, x, y, 0 ); + x += args[2]; + y += args[3]; + add_point( builder, x, y, 0 ); + x += args[4]; + y += args[5]; + add_point( builder, x, y, 1 ); + args += 6; + } + args = stack; + break; + + case t2_op_vvcurveto: + FT_TRACE4(( " vvcurveto" )); + + if ( start_point ( builder, x, y ) ) + goto Memory_Error; + + 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 Memory_Error; + + while ( args < decoder->top ) + { + y += args[0]; + add_point( builder, x, y, 0 ); + x += args[1]; + y += args[2]; + add_point( builder, x, y, 0 ); + y += args[3]; + add_point( builder, x, y, 1 ); + args += 4; + } + args = stack; + break; + + case t2_op_hhcurveto: + FT_TRACE4(( " hhcurveto" )); + + if ( start_point ( builder, x, y ) ) + goto Memory_Error; + + 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 Memory_Error; + + while ( args < decoder->top ) + { + x += args[0]; + add_point( builder, x, y, 0 ); + x += args[1]; + y += args[2]; + add_point( builder, x, y, 0 ); + x += args[3]; + add_point( builder, x, y, 1 ); + args += 4; + } + args = stack; + break; + + case t2_op_vhcurveto: + case t2_op_hvcurveto: + { + FT_Int phase; + + + FT_TRACE4(( op == t2_op_vhcurveto ? " vhcurveto" + : " hvcurveto" )); + + if ( start_point ( builder, x, y ) ) + goto Memory_Error; + + 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 == t2_op_hvcurveto ); + + while ( num_args >= 4 ) + { + num_args -= 4; + if ( phase ) + { + x += args[0]; + add_point( builder, x, y, 0 ); + x += args[1]; + y += args[2]; + add_point( builder, x, y, 0 ); + y += args[3]; + if ( num_args == 1 ) + x += args[4]; + add_point( builder, x, y, 1 ); + } + else + { + y += args[0]; + add_point( builder, x, y, 0 ); + x += args[1]; + y += args[2]; + add_point( builder, x, y, 0 ); + x += args[3]; + if ( num_args == 1 ) + y += args[4]; + add_point( builder, x, y, 1 ); + } + args += 4; + phase ^= 1; + } + args = stack; + } + break; + + case t2_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 ( start_point( builder, x, y ) || + check_points( builder, num_lines + 3 ) ) + goto Memory_Error; + + args = stack; + + /* first, add the line segments */ + while ( num_lines > 0 ) + { + x += args[0]; + y += args[1]; + add_point( builder, x, y, 1 ); + args += 2; + num_lines--; + } + + /* then the curve */ + x += args[0]; + y += args[1]; + add_point( builder, x, y, 0 ); + x += args[2]; + y += args[3]; + add_point( builder, x, y, 0 ); + x += args[4]; + y += args[5]; + add_point( builder, x, y, 1 ); + args = stack; + } + break; + + case t2_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 ( start_point ( builder, x, y ) || + check_points( builder, num_curves*3 + 2 ) ) + goto Memory_Error; + + args = stack; + + /* first, add the curves */ + while ( num_curves > 0 ) + { + x += args[0]; + y += args[1]; + add_point( builder, x, y, 0 ); + x += args[2]; + y += args[3]; + add_point( builder, x, y, 0 ); + x += args[4]; + y += args[5]; + add_point( builder, x, y, 1 ); + args += 6; + num_curves--; + } + + /* then the final line */ + x += args[0]; + y += args[1]; + add_point( builder, x, y, 1 ); + args = stack; + } + break; + + case t2_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 ( start_point( builder, x, y ) || + check_points( builder, 6 ) ) + goto Memory_Error; + + /* Record the starting point's y postion for later use */ + start_y = y; + + /* first control point */ + x += args[0]; + y += args[1]; + add_point( builder, x, y, 0 ); + + /* second control point */ + x += args[2]; + y += args[3]; + 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]; + add_point( builder, x, y, 1 ); + + /* third control point, with y-value the same as the join */ + /* point's y-value */ + x += args[5]; + add_point( builder, x, y, 0 ); + + /* fourth control point */ + x += args[6]; + y += args[7]; + add_point( builder, x, y, 0 ); + + /* ending point, with y-value the same as the start */ + x += args[8]; + y = start_y; + add_point( builder, x, y, 1 ); + + args = stack; + break; + } + + case t2_op_hflex: + { + FT_Pos start_y; + + + FT_TRACE4(( " hflex" )); + + args = stack; + + /* adding six more points; 4 control points, 2 on-curve points */ + if ( start_point( builder, x, y ) || + check_points ( builder, 6 ) ) + goto Memory_Error; + + /* record the starting point's y-position for later use */ + start_y = y; + + /* first control point */ + x += args[0]; + add_point( builder, x, y, 0 ); + + /* second control point */ + x += args[1]; + y += args[2]; + 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]; + add_point( builder, x, y, 1 ); + + /* third control point, with y-value the same as the join */ + /* point's y-value */ + x += args[4]; + add_point( builder, x, y, 0 ); + + /* fourth control point */ + x += args[5]; + y = start_y; + 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]; + add_point( builder, x, y, 1 ); + + args = stack; + break; + } + + case t2_op_flex1: + { + FT_Pos start_x, start_y; /* record start x, y values for alter */ + /* use */ + FT_Int 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 ( start_point( builder, x, y ) || + check_points( builder, 6 ) ) + goto Memory_Error; + + /* record the starting point's x, y postion 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]; + 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]; + } + + add_point( builder, x, y, 1 ); + + args = stack; + break; + } + + case t2_op_flex: + { + FT_UInt count; + + + FT_TRACE4(( " flex" )); + + if ( start_point( builder, x, y ) || + check_points( builder, 6 ) ) + goto Memory_Error; + + args = stack; + for ( count = 6; count > 0; count-- ) + { + x += args[0]; + y += args[1]; + add_point( builder, x, y, + (FT_Bool)( count == 3 || count == 0 ) ); + args += 2; + } + + args = stack; + } + break; + + case t2_op_endchar: + FT_TRACE4(( " endchar" )); + + close_contour( builder ); + + /* add current outline to the glyph slot */ + FT_GlyphLoader_Add( builder->loader ); + + /* return now! */ + FT_TRACE4(( "\n\n" )); + return T2_Err_Ok; + + case t2_op_abs: + FT_TRACE4(( " abs" )); + + if ( args[0] < 0 ) + args[0] = -args[0]; + args++; + break; + + case t2_op_add: + FT_TRACE4(( " add" )); + + args[0] += args[1]; + args++; + break; + + case t2_op_sub: + FT_TRACE4(( " sub" )); + + args[0] -= args[1]; + args++; + break; + + case t2_op_div: + FT_TRACE4(( " div" )); + + args[0] = FT_DivFix( args[0], args[1] ); + args++; + break; + + case t2_op_neg: + FT_TRACE4(( " neg" )); + + args[0] = -args[0]; + args++; + break; + + case t2_op_random: + { + FT_Fixed rand; + + + FT_TRACE4(( " rand" )); + + rand = seed; + if ( rand >= 0x8000 ) + rand++; + + args[0] = rand; + seed = FT_MulFix( seed, 0x10000L - seed ); + if ( seed == 0 ) + seed += 0x2873; + args++; + } + break; + + case t2_op_mul: + FT_TRACE4(( " mul" )); + + args[0] = FT_MulFix( args[0], args[1] ); + args++; + break; + + case t2_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 t2_op_drop: + /* nothing */ + FT_TRACE4(( " drop" )); + + break; + + case t2_op_exch: + { + FT_Fixed tmp; + + + FT_TRACE4(( " exch" )); + + tmp = args[0]; + args[0] = args[1]; + args[1] = tmp; + args += 2; + } + break; + + case t2_op_index: + { + FT_Int index = args[0] >> 16; + + + FT_TRACE4(( " index" )); + + if ( index < 0 ) + index = 0; + else if ( index > num_args - 2 ) + index = num_args - 2; + args[0] = args[-( index + 1 )]; + args++; + } + break; + + case t2_op_roll: + { + FT_Int count = (FT_Int)( args[0] >> 16 ); + FT_Int index = (FT_Int)( args[1] >> 16 ); + + + FT_TRACE4(( " roll" )); + + if ( count <= 0 ) + count = 1; + + args -= count; + if ( args < stack ) + goto Stack_Underflow; + + if ( index >= 0 ) + { + while ( index > 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; + index--; + } + } + else + { + while ( index < 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; + index++; + } + } + args += count; + } + break; + + case t2_op_dup: + FT_TRACE4(( " dup" )); + + args[1] = args[0]; + args++; + break; + + case t2_op_put: + { + FT_Fixed val = args[0]; + FT_Int index = (FT_Int)( args[1] >> 16 ); + + + FT_TRACE4(( " put" )); + + if ( index >= 0 && index < decoder->len_buildchar ) + decoder->buildchar[index] = val; + } + break; + + case t2_op_get: + { + FT_Int index = (FT_Int)( args[0] >> 16 ); + FT_Fixed val = 0; + + + FT_TRACE4(( " get" )); + + if ( index >= 0 && index < decoder->len_buildchar ) + val = decoder->buildchar[index]; + + args[0] = val; + args++; + } + break; + + case t2_op_store: + FT_TRACE4(( " store ")); + + goto Unimplemented; + + case t2_op_load: + FT_TRACE4(( " load" )); + + goto Unimplemented; + + case t2_op_and: + { + FT_Fixed cond = args[0] && args[1]; + + + FT_TRACE4(( " and" )); + + args[0] = cond ? 0x10000L : 0; + args++; + } + break; + + case t2_op_or: + { + FT_Fixed cond = args[0] || args[1]; + + + FT_TRACE4(( " or" )); + + args[0] = cond ? 0x10000L : 0; + args++; + } + break; + + case t2_op_eq: + { + FT_Fixed cond = !args[0]; + + + FT_TRACE4(( " eq" )); + + args[0] = cond ? 0x10000L : 0; + args++; + } + break; + + case t2_op_ifelse: + { + FT_Fixed cond = (args[2] <= args[3]); + + + FT_TRACE4(( " ifelse" )); + + if ( !cond ) + args[0] = args[1]; + args++; + } + break; + + case t2_op_callsubr: + { + FT_UInt index = (FT_UInt)( ( args[0] >> 16 ) + + decoder->locals_bias ); + + + FT_TRACE4(( " callsubr(%d)", index )); + + if ( index >= decoder->num_locals ) + { + FT_ERROR(( "T2_Parse_CharStrings:" )); + FT_ERROR(( " invalid local subr index\n" )); + goto Syntax_Error; + } + + if ( zone - decoder->zones >= T2_MAX_SUBRS_CALLS ) + { + FT_ERROR(( "T2_Parse_CharStrings: too many nested subrs\n" )); + goto Syntax_Error; + } + + zone->cursor = ip; /* save current instruction pointer */ + + zone++; + zone->base = decoder->locals[index]; + zone->limit = decoder->locals[index+1]; + zone->cursor = zone->base; + + if ( !zone->base ) + { + FT_ERROR(( "T2_Parse_CharStrings: invoking empty subrs!\n" )); + goto Syntax_Error; + } + + decoder->zone = zone; + ip = zone->base; + limit = zone->limit; + } + break; + + case t2_op_callgsubr: + { + FT_UInt index = (FT_UInt)( ( args[0] >> 16 ) + + decoder->globals_bias ); + + + FT_TRACE4(( " callgsubr(%d)", index )); + + if ( index >= decoder->num_globals ) + { + FT_ERROR(( "T2_Parse_CharStrings:" )); + FT_ERROR(( " invalid global subr index\n" )); + goto Syntax_Error; + } + + if ( zone - decoder->zones >= T2_MAX_SUBRS_CALLS ) + { + FT_ERROR(( "T2_Parse_CharStrings: too many nested subrs\n" )); + goto Syntax_Error; + } + + zone->cursor = ip; /* save current instruction pointer */ + + zone++; + zone->base = decoder->globals[index]; + zone->limit = decoder->globals[index+1]; + zone->cursor = zone->base; + + if ( !zone->base ) + { + FT_ERROR(( "T2_Parse_CharStrings: invoking empty subrs!\n" )); + goto Syntax_Error; + } + + decoder->zone = zone; + ip = zone->base; + limit = zone->limit; + } + break; + + case t2_op_return: + FT_TRACE4(( " return" )); + + if ( decoder->zone <= decoder->zones ) + { + FT_ERROR(( "T2_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 T2_Err_Unimplemented_Feature; + } + + decoder->top = args; + + } /* general operator processing */ + + } /* while ip < limit */ + + FT_TRACE4(( "..end..\n\n" )); + + return error; + + Syntax_Error: + FT_TRACE4(( "T2_Parse_CharStrings: syntax error!" )); + return T2_Err_Invalid_File_Format; + + Stack_Underflow: + FT_TRACE4(( "T2_Parse_CharStrings: stack underflow!" )); + return T2_Err_Too_Few_Arguments; + + Stack_Overflow: + FT_TRACE4(( "T2_Parse_CharStrings: stack overflow!" )); + return T2_Err_Stack_Overflow; + + Memory_Error: + return builder->error; + } + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /********** *********/ + /********** *********/ + /********** 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 T2_Compute_Max_Advance( TT_Face face, + FT_Int* max_advance ) + { + FT_Error error = 0; + T2_Decoder decoder; + FT_Int glyph_index; + CFF_Font* cff = (CFF_Font*)face->other; + + + *max_advance = 0; + + /* Initialize load decoder */ + T2_Init_Decoder( &decoder, face, 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 = T2_Access_Element( &cff->charstrings_index, glyph_index, + &charstring, &charstring_len ); + if ( !error ) + { + T2_Prepare_Decoder( &decoder, glyph_index ); + error = T2_Parse_CharStrings( &decoder, charstring, charstring_len ); + + T2_Forget_Element( &cff->charstrings_index, &charstring ); + } + + /* ignore the error if one has occurred -- skip to next glyph */ + error = 0; + } + + *max_advance = decoder.builder.advance.x; + + return T2_Err_Ok; + } + + +#endif /* 0 */ + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /********** *********/ + /********** *********/ + /********** UNHINTED GLYPH LOADER *********/ + /********** *********/ + /********** The following code is in charge of loading a *********/ + /********** single outline. It completely ignores hinting *********/ + /********** and is used when FT_LOAD_NO_HINTING is set. *********/ + /********** *********/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + FT_LOCAL_DEF + FT_Error T2_Load_Glyph( T2_GlyphSlot glyph, + T2_Size size, + FT_Int glyph_index, + FT_Int load_flags ) + { + FT_Error error; + T2_Decoder decoder; + TT_Face face = (TT_Face)glyph->root.face; + FT_Bool hinting; + CFF_Font* cff = (CFF_Font*)face->extra.data; + + + 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->metrics.x_scale; + glyph->y_scale = size->metrics.y_scale; + } + + glyph->root.outline.n_points = 0; + glyph->root.outline.n_contours = 0; + + hinting = ( 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; + + + T2_Init_Decoder( &decoder, face, size, glyph ); + + decoder.builder.no_recurse = + (FT_Bool)( ( load_flags & FT_LOAD_NO_RECURSE ) != 0 ); + + /* now load the unscaled outline */ + error = T2_Access_Element( &cff->charstrings_index, glyph_index, + &charstring, &charstring_len ); + if ( !error ) + { + T2_Prepare_Decoder( &decoder, glyph_index ); + error = T2_Parse_CharStrings( &decoder, charstring, charstring_len ); + + T2_Forget_Element( &cff->charstrings_index, &charstring ); + } + + /* save new glyph tables */ + T2_Done_Builder( &decoder.builder ); + } + + /* 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 ) + { + /* for composite glyphs, return only left side bearing and */ + /* advance width */ + if ( glyph->root.format == ft_glyph_format_composite ) + { + glyph->root.metrics.horiBearingX = decoder.builder.left_bearing.x; + glyph->root.metrics.horiAdvance = decoder.glyph_width; + } + else + { + FT_BBox cbox; + FT_Glyph_Metrics* metrics = &glyph->root.metrics; + + + /* copy the _unscaled_ advance width */ + metrics->horiAdvance = decoder.glyph_width; + glyph->root.linearHoriAdvance = decoder.glyph_width; + + /* make up vertical metrics */ + metrics->vertBearingX = 0; + metrics->vertBearingY = 0; + metrics->vertAdvance = 0; + + glyph->root.linearVertAdvance = 0; + + glyph->root.format = ft_glyph_format_outline; + + glyph->root.outline.flags = 0; + if ( size && size->metrics.y_ppem < 24 ) + glyph->root.outline.flags |= ft_outline_high_precision; + + glyph->root.outline.flags |= ft_outline_reverse_fill; + + 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 */ + 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 ); + } + + FT_Outline_Get_CBox( &glyph->root.outline, &cbox ); + + /* Then scale the metrics */ + metrics->horiAdvance = FT_MulFix( metrics->horiAdvance, x_scale ); + metrics->vertAdvance = FT_MulFix( metrics->vertAdvance, y_scale ); + + metrics->vertBearingX = FT_MulFix( metrics->vertBearingX, x_scale ); + metrics->vertBearingY = FT_MulFix( metrics->vertBearingY, y_scale ); + } + +#if 0 + /* apply the font matrix */ + FT_Outline_Transform( &glyph->root.outline, cff->font_matrix ); +#endif + + /* compute the other metrics */ + FT_Outline_Get_CBox( &glyph->root.outline, &cbox ); + + /* grid fit the bounding box if necessary */ + if ( hinting ) + { + cbox.xMin &= -64; + cbox.yMin &= -64; + cbox.xMax = ( cbox.xMax + 63 ) & -64; + cbox.yMax = ( cbox.yMax + 63 ) & -64; + } + + metrics->width = cbox.xMax - cbox.xMin; + metrics->height = cbox.yMax - cbox.yMin; + + metrics->horiBearingX = cbox.xMin; + metrics->horiBearingY = cbox.yMax; + } + } + + return error; + } + + +/* END */ Index: xc/extras/freetype2/src/cff/t2gload.h diff -u /dev/null xc/extras/freetype2/src/cff/t2gload.h:1.1.1.1 --- /dev/null Mon Dec 18 14:22:37 2000 +++ xc/extras/freetype2/src/cff/t2gload.h Fri Dec 8 16:26:20 2000 @@ -0,0 +1,213 @@ +/***************************************************************************/ +/* */ +/* t2gload.h */ +/* */ +/* OpenType Glyph Loader (specification). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#ifndef T2GLOAD_H +#define T2GLOAD_H + +#include + + +#ifdef FT_FLAT_COMPILE + +#include "t2objs.h" + +#else + +#include + +#endif + + +#ifdef __cplusplus + extern "C" { +#endif + + +#define T2_MAX_OPERANDS 48 +#define T2_MAX_SUBRS_CALLS 32 + + + /*************************************************************************/ + /* */ + /* */ + /* T2_Builder */ + /* */ + /* */ + /* A structure used during glyph loading to store its outline. */ + /* */ + /* */ + /* memory :: The current memory object. */ + /* */ + /* face :: The current face object. */ + /* */ + /* glyph :: The current glyph slot. */ + /* */ + /* current :: The current glyph outline. */ + /* */ + /* base :: The base 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 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. */ + /* */ + /* error :: An error code that is only used to report memory */ + /* allocation problems. */ + /* */ + /* metrics_only :: A boolean indicating that we only want to compute */ + /* the metrics of a given glyph, not load all of its */ + /* points. */ + /* */ + typedef struct T2_Builder_ + { + FT_Memory memory; + TT_Face face; + T2_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_Error error; /* only used for memory errors */ + FT_Bool metrics_only; + + } T2_Builder; + + + /* execution context charstring zone */ + + typedef struct T2_Decoder_Zone_ + { + FT_Byte* base; + FT_Byte* limit; + FT_Byte* cursor; + + } T2_Decoder_Zone; + + + typedef struct T2_Decoder_ + { + T2_Builder builder; + CFF_Font* cff; + + FT_Fixed stack[T2_MAX_OPERANDS + 1]; + FT_Fixed* top; + + T2_Decoder_Zone zones[T2_MAX_SUBRS_CALLS + 1]; + T2_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; + + } T2_Decoder; + + + FT_LOCAL + void T2_Init_Decoder( T2_Decoder* decoder, + TT_Face face, + T2_Size size, + T2_GlyphSlot slot ); + + FT_LOCAL + void T2_Prepare_Decoder( T2_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 T2_Compute_Max_Advance( TT_Face face, + FT_Int* max_advance ); + +#endif /* 0 */ + + FT_LOCAL + FT_Error T2_Parse_CharStrings( T2_Decoder* decoder, + FT_Byte* charstring_base, + FT_Int charstring_len ); + + FT_LOCAL + FT_Error T2_Load_Glyph( T2_GlyphSlot glyph, + T2_Size size, + FT_Int glyph_index, + FT_Int load_flags ); + + +#ifdef __cplusplus + } +#endif + + +#endif /* T2GLOAD_H */ + + +/* END */ Index: xc/extras/freetype2/src/cff/t2load.c diff -u /dev/null xc/extras/freetype2/src/cff/t2load.c:1.1.1.1 --- /dev/null Mon Dec 18 14:22:37 2000 +++ xc/extras/freetype2/src/cff/t2load.c Fri Dec 8 16:26:20 2000 @@ -0,0 +1,762 @@ +/***************************************************************************/ +/* */ +/* t2load.c */ +/* */ +/* TrueType glyph data/program tables loader (body). */ +/* */ +/* 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 +#include +#include +#include + +#include +#include + + +#ifdef FT_FLAT_COMPILE + +#include "t2load.h" +#include "t2parse.h" + +#else + +#include +#include + +#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_t2load + + + /* read a CFF offset from memory */ + static + FT_ULong t2_get_offset( FT_Byte* p, + FT_Byte off_size ) + { + FT_ULong result; + + + for ( result = 0; off_size > 0; off_size-- ) + { + result <<= 8; + result |= *p++; + } + + return result; + } + + + static + FT_Error t2_new_cff_index( CFF_Index* index, + FT_Stream stream, + FT_Bool load ) + { + FT_Error error; + FT_Memory memory = stream->memory; + FT_UShort count; + + + MEM_Set( index, 0, sizeof ( *index ) ); + + index->stream = stream; + if ( !READ_UShort( count ) && + count > 0 ) + { + FT_Byte* p; + FT_Byte offsize; + FT_ULong data_size; + FT_ULong* poff; + + + /* there is at least one element; read the offset size, */ + /* then access the offset table to compute the index's total size */ + if ( READ_Byte( offsize ) ) + goto Exit; + + index->stream = stream; + index->count = count; + index->off_size = offsize; + data_size = (FT_ULong)( count + 1 ) * offsize; + + if ( ALLOC_ARRAY( index->offsets, count + 1, FT_ULong ) || + ACCESS_Frame( data_size ) ) + goto Exit; + + poff = index->offsets; + p = (FT_Byte*)stream->cursor; + + for ( ; (FT_Short)count >= 0; count-- ) + { + poff[0] = t2_get_offset( p, offsize ); + poff++; + p += offsize; + } + + FORGET_Frame(); + + index->data_offset = FILE_Pos(); + data_size = poff[-1] - 1; + + if ( load ) + { + /* load the data */ + if ( EXTRACT_Frame( data_size, index->bytes ) ) + goto Exit; + } + else + { + /* skip the data */ + if ( FILE_Skip( data_size ) ) + goto Exit; + } + } + + Exit: + if ( error ) + FREE( index->offsets ); + + return error; + } + + + static + void t2_done_cff_index( CFF_Index* index ) + { + if ( index->stream ) + { + FT_Stream stream = index->stream; + FT_Memory memory = stream->memory; + + + if ( index->bytes ) + RELEASE_Frame( index->bytes ); + + FREE( index->offsets ); + MEM_Set( index, 0, sizeof ( *index ) ); + } + } + + + static + FT_Error t2_explicit_cff_index( CFF_Index* index, + FT_Byte*** table ) + { + FT_Error error = 0; + FT_Memory memory = index->stream->memory; + FT_UInt n, offset, old_offset; + FT_Byte** t; + + + *table = 0; + + if ( index->count > 0 && !ALLOC_ARRAY( t, index->count + 1, FT_Byte* ) ) + { + old_offset = 1; + for ( n = 0; n <= index->count; n++ ) + { + offset = index->offsets[n]; + if ( !offset ) + offset = old_offset; + + t[n] = index->bytes + offset - 1; + + old_offset = offset; + } + *table = t; + } + + return error; + } + + + FT_LOCAL_DEF + FT_Error T2_Access_Element( CFF_Index* index, + FT_UInt element, + FT_Byte** pbytes, + FT_ULong* pbyte_len ) + { + FT_Error error = 0; + + + if ( index && index->count > element ) + { + /* compute start and end offsets */ + FT_ULong off1, off2 = 0; + + + off1 = index->offsets[element]; + if ( off1 ) + { + do + { + element++; + off2 = index->offsets[element]; + + } while ( off2 == 0 && element < index->count ); + + if ( !off2 ) + off1 = 0; + } + + /* access element */ + if ( off1 ) + { + *pbyte_len = off2 - off1; + + if ( index->bytes ) + { + /* this index was completely loaded in memory, that's easy */ + *pbytes = index->bytes + off1 - 1; + } + else + { + /* this index is still on disk/file, access it through a frame */ + FT_Stream stream = index->stream; + + + if ( FILE_Seek( index->data_offset + off1 - 1 ) || + EXTRACT_Frame( off2 - off1, *pbytes ) ) + goto Exit; + } + } + else + { + /* empty index element */ + *pbytes = 0; + *pbyte_len = 0; + } + } + else + error = T2_Err_Invalid_Argument; + + Exit: + return error; + } + + + FT_LOCAL_DEF + void T2_Forget_Element( CFF_Index* index, + FT_Byte** pbytes ) + { + if ( index->bytes == 0 ) + { + FT_Stream stream = index->stream; + + + RELEASE_Frame( *pbytes ); + } + } + + + FT_LOCAL_DEF + FT_String* T2_Get_Name( CFF_Index* index, + FT_UInt element ) + { + FT_Memory memory = index->stream->memory; + FT_Byte* bytes; + FT_ULong byte_len; + FT_Error error; + FT_String* name = 0; + + + error = T2_Access_Element( index, element, &bytes, &byte_len ); + if ( error ) + goto Exit; + + if ( !ALLOC( name, byte_len + 1 ) ) + { + MEM_Copy( name, bytes, byte_len ); + name[byte_len] = 0; + } + T2_Forget_Element( index, &bytes ); + + Exit: + return name; + } + + + FT_LOCAL_DEF + FT_String* T2_Get_String( CFF_Index* index, + FT_UInt sid, + PSNames_Interface* interface ) + { + /* if it is not a standard string, return it */ + if ( sid > 390 ) + return T2_Get_Name( index, sid - 391 ); + + /* that's a standard string, fetch a copy from the PSName module */ + { + FT_String* name = 0; + const char* adobe_name = interface->adobe_std_strings( sid ); + FT_UInt len; + + + if ( adobe_name ) + { + FT_Memory memory = index->stream->memory; + FT_Error error; + + + len = (FT_UInt)strlen( adobe_name ); + if ( !ALLOC( name, len + 1 ) ) + { + MEM_Copy( name, adobe_name, len ); + name[len] = 0; + } + } + + return name; + } + } + + + /*************************************************************************/ + /*************************************************************************/ + /*** ***/ + /*** FD Select table support ***/ + /*** ***/ + /*************************************************************************/ + /*************************************************************************/ + + + static + void CFF_Done_FD_Select( CFF_FD_Select* select, + FT_Stream stream ) + { + if ( select->data ) + RELEASE_Frame( select->data ); + + select->data_size = 0; + select->format = 0; + select->range_count = 0; + } + + + static + FT_Error CFF_Load_FD_Select( CFF_FD_Select* select, + FT_UInt num_glyphs, + FT_Stream stream, + FT_ULong offset ) + { + FT_Error error; + FT_Byte format; + FT_UInt num_ranges; + + + /* read format */ + if ( FILE_Seek( offset ) || READ_Byte( format ) ) + goto Exit; + + select->format = format; + select->cache_count = 0; /* clear cache */ + + switch ( format ) + { + case 0: /* format 0, that's simple */ + select->data_size = num_glyphs; + goto Load_Data; + + case 3: /* format 3, a tad more complex */ + if ( READ_UShort( num_ranges ) ) + goto Exit; + + select->data_size = num_ranges * 3 + 2; + + Load_Data: + if ( EXTRACT_Frame( select->data_size, select->data ) ) + goto Exit; + break; + + default: /* hmm... that's wrong */ + error = T2_Err_Invalid_File_Format; + } + + Exit: + return error; + } + + + FT_LOCAL_DEF + FT_Byte CFF_Get_FD( CFF_FD_Select* select, + FT_UInt glyph_index ) + { + FT_Byte fd = 0; + + + switch ( select->format ) + { + case 0: + fd = select->data[glyph_index]; + break; + + case 3: + /* first, compare to cache */ + if ( (FT_UInt)(glyph_index-select->cache_first) < select->cache_count ) + { + fd = select->cache_fd; + break; + } + + /* then, lookup the ranges array */ + { + FT_Byte* p = select->data; + FT_Byte* p_limit = p + select->data_size; + FT_Byte fd2; + FT_UInt first, limit; + + + first = NEXT_UShort( p ); + do + { + if ( glyph_index < first ) + break; + + fd2 = *p++; + limit = NEXT_UShort( p ); + + if ( glyph_index < limit ) + { + fd = fd2; + + /* update cache */ + select->cache_first = first; + select->cache_count = limit-first; + select->cache_fd = fd2; + break; + } + first = limit; + + } while ( p < p_limit ); + } + break; + + default: + ; + } + + return fd; + } + + + /*************************************************************************/ + /*************************************************************************/ + /*** ***/ + /*** CFF font support ***/ + /*** ***/ + /*************************************************************************/ + /*************************************************************************/ + + + static + FT_Error CFF_Load_SubFont( CFF_SubFont* font, + CFF_Index* index, + FT_UInt font_index, + FT_Stream stream, + FT_ULong base_offset ) + { + FT_Error error; + T2_Parser parser; + FT_Byte* dict; + FT_ULong dict_len; + CFF_Font_Dict* top = &font->font_dict; + CFF_Private* priv = &font->private_dict; + + + T2_Parser_Init( &parser, T2CODE_TOPDICT, &font->font_dict ); + + /* set defaults */ + MEM_Set( top, 0, sizeof ( *top ) ); + + top->underline_position = -100; + top->underline_thickness = 50; + top->charstring_type = 2; + top->font_matrix.xx = 0x10000L; + top->font_matrix.yy = 0x10000L; + top->cid_count = 8720; + + error = T2_Access_Element( index, font_index, &dict, &dict_len ) || + T2_Parser_Run( &parser, dict, dict + dict_len ); + + T2_Forget_Element( index, &dict ); + + if ( error ) + goto Exit; + + /* if it is a CID font, we stop there */ + if ( top->cid_registry ) + goto Exit; + + /* parse the private dictionary, if any */ + if ( top->private_offset && top->private_size ) + { + /* set defaults */ + MEM_Set( priv, 0, 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; + + T2_Parser_Init( &parser, T2CODE_PRIVATE, priv ); + + if ( FILE_Seek( base_offset + font->font_dict.private_offset ) || + ACCESS_Frame( font->font_dict.private_size ) ) + goto Exit; + + error = T2_Parser_Run( &parser, + (FT_Byte*)stream->cursor, + (FT_Byte*)stream->limit ); + FORGET_Frame(); + if ( error ) + goto Exit; + } + + /* read the local subrs, if any */ + if ( priv->local_subrs_offset ) + { + if ( FILE_Seek( base_offset + top->private_offset + + priv->local_subrs_offset ) ) + goto Exit; + + error = t2_new_cff_index( &font->local_subrs_index, stream, 1 ); + if ( error ) + goto Exit; + + font->num_local_subrs = font->local_subrs_index.count; + error = t2_explicit_cff_index( &font->local_subrs_index, + &font->local_subrs ); + } + + Exit: + return error; + } + + + static + void CFF_Done_SubFont( FT_Memory memory, + CFF_SubFont* subfont ) + { + if ( subfont ) + { + t2_done_cff_index( &subfont->local_subrs_index ); + FREE( subfont->local_subrs ); + } + } + + + FT_LOCAL_DEF + FT_Error T2_Load_CFF_Font( 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_Font + + 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_Font_Dict* dict; + + + MEM_Set( font, 0, sizeof ( *font ) ); + font->stream = stream; + font->memory = memory; + dict = &font->top_font.font_dict; + base_offset = FILE_Pos(); + + /* read CFF font header */ + if ( 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 = FT_Err_Unknown_File_Format; + goto Exit; + } + + /* skip the rest of the header */ + if ( FILE_Skip( font->header_size - 4 ) ) + goto Exit; + + /* read the name, top dict, string and global subrs index */ + error = t2_new_cff_index( &font->name_index, stream, 0 ) || + t2_new_cff_index( &font->font_dict_index, stream, 0 ) || + t2_new_cff_index( &font->string_index, stream, 0 ) || + t2_new_cff_index( &font->global_subrs_index, stream, 1 ); + if ( error ) + 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(( "T2_Load_CFF_Font: incorrect face index = %d\n", + face_index )); + error = T2_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_Load_SubFont( &font->top_font, + &font->font_dict_index, + face_index, + stream, + base_offset ); + if ( error ) + goto Exit; + + /* now, check for a CID font */ + if ( dict->cid_registry ) + { + CFF_Index fd_index; + CFF_SubFont* sub; + FT_UInt index; + + + /* this is a CID-keyed font, we must now allocate a table of */ + /* sub-fonts, then load each of them separately */ + if ( FILE_Seek( base_offset + dict->cid_fd_array_offset ) ) + goto Exit; + + error = t2_new_cff_index( &fd_index, stream, 0 ); + if ( error ) + goto Exit; + + if ( fd_index.count > CFF_MAX_CID_FONTS ) + { + FT_ERROR(( "T2_Load_CFF_Font: FD array too large in CID font\n" )); + goto Fail_CID; + } + + /* allocate & read each font dict independently */ + font->num_subfonts = fd_index.count; + if ( ALLOC_ARRAY( sub, fd_index.count, CFF_SubFont ) ) + goto Fail_CID; + + /* setup pointer table */ + for ( index = 0; index < fd_index.count; index++ ) + font->subfonts[index] = sub + index; + + /* now load each sub font independently */ + for ( index = 0; index < fd_index.count; index++ ) + { + sub = font->subfonts[index]; + error = CFF_Load_SubFont( sub, &fd_index, index, + stream, base_offset ); + if ( error ) + goto Fail_CID; + } + + /* now load the FD Select array */ + error = CFF_Load_FD_Select( &font->fd_select, + dict->cid_count, + stream, + base_offset + dict->cid_fd_select_offset ); + + Fail_CID: + t2_done_cff_index( &fd_index ); + + if ( error ) + goto Exit; + } + else + font->num_subfonts = 0; + + /* read the charstrings index now */ + if ( dict->charstrings_offset == 0 ) + { + FT_ERROR(( "T2_Load_CFF_Font: no charstrings offset!\n" )); + error = FT_Err_Unknown_File_Format; + goto Exit; + } + + if ( FILE_Seek( base_offset + dict->charstrings_offset ) ) + goto Exit; + + error = t2_new_cff_index( &font->charstrings_index, stream, 0 ); + if ( error ) + goto Exit; + + /* explicit the global subrs */ + font->num_global_subrs = font->global_subrs_index.count; + font->num_glyphs = font->charstrings_index.count; + + error = t2_explicit_cff_index( &font->global_subrs_index, + &font->global_subrs ) ; + + if ( error ) + goto Exit; + + /* get the font name */ + font->font_name = T2_Get_Name( &font->name_index, face_index ); + + Exit: + return error; + } + + + FT_LOCAL_DEF + void T2_Done_CFF_Font( CFF_Font* font ) + { + FT_Memory memory = font->memory; + FT_UInt index; + + + t2_done_cff_index( &font->global_subrs_index ); + t2_done_cff_index( &font->string_index ); + t2_done_cff_index( &font->font_dict_index ); + t2_done_cff_index( &font->name_index ); + t2_done_cff_index( &font->charstrings_index ); + + /* release font dictionaries */ + for ( index = 0; index < font->num_subfonts; index++ ) + CFF_Done_SubFont( memory, font->subfonts[index] ); + + CFF_Done_SubFont( memory, &font->top_font ); + + CFF_Done_FD_Select( &font->fd_select, font->stream ); + + FREE( font->global_subrs ); + FREE( font->font_name ); + } + + +/* END */ Index: xc/extras/freetype2/src/cff/t2load.h diff -u /dev/null xc/extras/freetype2/src/cff/t2load.h:1.1.1.1 --- /dev/null Mon Dec 18 14:22:37 2000 +++ xc/extras/freetype2/src/cff/t2load.h Fri Dec 8 16:26:20 2000 @@ -0,0 +1,69 @@ +/***************************************************************************/ +/* */ +/* t2load.h */ +/* */ +/* OpenType glyph data/program tables loader (specification). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#ifndef T2LOAD_H +#define T2LOAD_H + +#include +#include + +#ifdef __cplusplus + extern "C" { +#endif + + FT_LOCAL + FT_String* T2_Get_Name( CFF_Index* index, + FT_UInt element ); + + FT_LOCAL + FT_String* T2_Get_String( CFF_Index* index, + FT_UInt sid, + PSNames_Interface* interface ); + + FT_LOCAL + FT_Error T2_Access_Element( CFF_Index* index, + FT_UInt element, + FT_Byte** pbytes, + FT_ULong* pbyte_len ); + + FT_LOCAL + void T2_Forget_Element( CFF_Index* index, + FT_Byte** pbytes ); + + FT_LOCAL + FT_Error T2_Load_CFF_Font( FT_Stream stream, + FT_Int face_index, + CFF_Font* font ); + + FT_LOCAL + void T2_Done_CFF_Font( CFF_Font* font ); + + FT_LOCAL + FT_Byte CFF_Get_FD( CFF_FD_Select* select, + FT_UInt glyph_index ); + + +#ifdef __cplusplus + } +#endif + + +#endif /* T2LOAD_H */ + + +/* END */ Index: xc/extras/freetype2/src/cff/t2objs.c diff -u /dev/null xc/extras/freetype2/src/cff/t2objs.c:1.1.1.1 --- /dev/null Mon Dec 18 14:22:37 2000 +++ xc/extras/freetype2/src/cff/t2objs.c Fri Dec 8 16:26:21 2000 @@ -0,0 +1,604 @@ +/***************************************************************************/ +/* */ +/* t2objs.c */ +/* */ +/* OpenType objects manager (body). */ +/* */ +/* 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 +#include +#include +#include +#include +#include + +#include +#include + + +#ifdef FT_FLAT_COMPILE + +#include "t2objs.h" +#include "t2load.h" + +#else + +#include +#include + +#endif + + +#include + +#include /* for strlen() */ + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_t2objs + + + /*************************************************************************/ + /* */ + /* FACE FUNCTIONS */ + /* */ + /*************************************************************************/ + + static + FT_String* T2_StrCopy( FT_Memory memory, + const FT_String* source ) + { + FT_Error error; + FT_String* result = 0; + FT_Int len = (FT_Int)strlen( source ); + + + if ( !ALLOC( result, len + 1 ) ) + { + MEM_Copy( result, source, len ); + result[len] = 0; + } + return result; + } + + +#if 0 + + /* this function is used to build a Unicode charmap from the glyph names */ + /* in a file */ + static + FT_Error CFF_Build_Unicode_Charmap( T2_Face face, + FT_ULong base_offset, + PSNames_Interface* psnames ) + { + CFF_Font* font = (CFF_Font*)face->extra.data; + FT_Memory memory = FT_FACE_MEMORY(face); + FT_UInt n, num_glyphs = face->root.num_glyphs; + const char** glyph_names; + FT_Error error; + CFF_Font_Dict* dict = &font->top_font.font_dict; + FT_ULong charset_offset; + FT_Byte format; + FT_Stream stream = face->root.stream; + + + charset_offset = dict->charset_offset; + if ( !charset_offset ) + { + FT_ERROR(( "CFF.Build_Unicode_Charmap: charset table is missing\n" )); + error = T2_Err_Invalid_File_Format; + goto Exit; + } + + /* allocate the charmap */ + if ( ALLOC( face->charmap, ... + + /* seek to charset table and allocate glyph names table */ + if ( FILE_Seek( base_offset + charset_offset ) || + ALLOC_ARRAY( glyph_names, num_glyphs, const char* ) ) + goto Exit; + + /* now, read each glyph name and store it in the glyph name table */ + if ( READ_Byte( format ) ) + goto Fail; + + switch ( format ) + { + case 0: /* format 0 - one SID per glyph */ + { + const char** gname = glyph_names; + const char** limit = gname + num_glyphs; + + if ( ACCESS_Frame( num_glyphs*2 ) ) + goto Fail; + + for ( ; gname < limit; gname++ ) + gname[0] = T2_Get_String( &font->string_index, + GET_UShort(), + psnames ); + FORGET_Frame(); + break; + } + + case 1: /* format 1 - sequential ranges */ + case 2: /* format 2 - sequential ranges with 16-bit counts */ + { + const char** gname = glyph_names; + const char** limit = gname + num_glyphs; + FT_UInt len = 3; + + if (format == 2) + len++; + + while (gname < limit) + { + FT_UInt first; + FT_UInt count; + + if ( ACCESS_Frame( len ) ) + goto Fail; + + first = GET_UShort(); + if (format == 3) + count = GET_UShort(); + else + count = GET_Byte(); + + FORGET_Frame(); + + for ( ; count > 0; count-- ) + { + gname[0] = T2_Get_String( &font->string_index, + first, + psnames ); + gname++; + first++; + } + } + break; + } + + default: /* unknown charset format! */ + FT_ERROR(( "CFF: unknown charset format!\n" )); + error = T2_Err_Invalid_File_Format; + goto Fail; + } + + /* all right, the glyph names were loaded, we now need to create */ + /* the corresponding unicode charmap.. */ + + Fail: + for ( n = 0; n < num_glyphs; n++ ) + FREE( glyph_names[n] ); + + FREE( glyph_names ); + + Exit: + return error; + } + +#endif /* 0 */ + + + static + FT_Encoding 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_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; + } + + + /*************************************************************************/ + /* */ + /* */ + /* T2_Init_Face */ + /* */ + /* */ + /* Initializes a given OpenType 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 + FT_Error T2_Init_Face( FT_Stream stream, + T2_Face face, + FT_Int face_index, + FT_Int num_params, + FT_Parameter* params ) + { + FT_Error error; + SFNT_Interface* sfnt; + PSNames_Interface* psnames; + FT_Bool pure_cff = 1; + FT_Bool sfnt_format = 0; + + + sfnt = (SFNT_Interface*)FT_Get_Module_Interface( + face->root.driver->root.library, "sfnt" ); + if ( !sfnt ) + goto Bad_Format; + + psnames = (PSNames_Interface*)FT_Get_Module_Interface( + face->root.driver->root.library, "psnames" ); + + /* create input stream from resource */ + if ( FILE_Seek( 0 ) ) + goto Exit; + + /* check that 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 T2_Err_Ok; + + sfnt_format = 1; + + /* now, the font can be either an OpenType/CFF font, or a SVG CEF */ + /* font in the later 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 by hand */ + error = sfnt->load_charmaps( face, stream ); + if ( error ) + goto Exit; + + /* XXX: for now, we don't load the GPOS table, as OpenType Layout */ + /* support will be added later to FreeType 2 as a separate module */ + } + + /* 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 ( FILE_Seek( 0 ) ) + goto Exit; + error = FT_Err_Ok; + } + + /* now load and parse the CFF table in the file */ + { + CFF_Font* cff; + FT_Memory memory = face->root.memory; + FT_Face root; + FT_UInt flags; + FT_ULong base_offset; + + + if ( ALLOC( cff, sizeof ( *cff ) ) ) + goto Exit; + + base_offset = FILE_Pos(); + + face->extra.data = cff; + error = T2_Load_CFF_Font( stream, face_index, cff ); + if ( error ) + goto Exit; + + /* Complement the root flags with some interesting information. */ + /* Note that this is only necessary for pure CFF and CEF fonts */ + + root = &face->root; + if ( pure_cff ) + { + CFF_Font_Dict* dict = &cff->top_font.font_dict; + + + /* we need the `PSNames' module for pure-CFF and CEF formats */ + if ( !psnames ) + { + FT_ERROR(( "T2_Init_Face:" )); + FT_ERROR(( " cannot open CFF & CEF fonts\n" )); + FT_ERROR(( " " )); + FT_ERROR(( " without the `PSNames' module\n" )); + goto Bad_Format; + } + + /* Set up num_faces. */ + root->num_faces = cff->num_faces; + + /* compute number of glyphs */ + if ( dict->cid_registry ) + root->num_glyphs = dict->cid_count; + else + root->num_glyphs = cff->charstrings_index.count; + + /* set global bbox, as well as EM size */ + root->units_per_EM = 1000; + root->bbox = dict->font_bbox; + root->ascender = (FT_Short)root->bbox.yMax; + root->descender = (FT_Short)root->bbox.yMin; + root->height = ( ( root->ascender - root->descender ) * 12 ) / 10; + + /* retrieve font family & style name */ + root->family_name = T2_Get_Name( &cff->name_index, face_index ); + if ( dict->cid_registry ) + { + root->style_name = T2_StrCopy( memory, "Regular" ); /* XXXX */ + } + else + { + root->style_name = T2_Get_String( &cff->string_index, + dict->weight, + psnames ); + } + + /*******************************************************************/ + /* */ + /* Compute face flags. */ + /* */ + flags = FT_FACE_FLAG_SCALABLE | /* scalable outlines */ + FT_FACE_FLAG_HORIZONTAL; /* horizontal data */ + + if ( sfnt_format ) + flags |= FT_FACE_FLAG_SFNT; + + /* fixed width font? */ + if ( dict->is_fixed_pitch ) + flags |= FT_FACE_FLAG_FIXED_WIDTH; + +/* XXXX: 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 + + root->face_flags = flags; + + /*******************************************************************/ + /* */ + /* Compute style flags. */ + /* */ + flags = 0; + + if ( dict->italic_angle ) + flags |= FT_STYLE_FLAG_ITALIC; + + /* XXX: may not be correct */ + if ( cff->top_font.private_dict.force_bold ) + flags |= FT_STYLE_FLAG_BOLD; + + root->style_flags = flags; + + /* set the charmaps if any */ + if ( sfnt_format ) + { + /*****************************************************************/ + /* */ + /* Polish the charmaps. */ + /* */ + /* Try to set the charmap encoding according to the platform & */ + /* encoding ID of each charmap. */ + /* */ + TT_CharMap charmap; + FT_Int n; + + + charmap = face->charmaps; + root->num_charmaps = face->num_charmaps; + + /* allocate table of pointers */ + if ( ALLOC_ARRAY( root->charmaps, root->num_charmaps, FT_CharMap ) ) + goto Exit; + + for ( n = 0; n < root->num_charmaps; n++, charmap++ ) + { + FT_Int platform = charmap->cmap.platformID; + FT_Int encoding = charmap->cmap.platformEncodingID; + + + charmap->root.face = (FT_Face)face; + charmap->root.platform_id = platform; + charmap->root.encoding_id = encoding; + charmap->root.encoding = find_encoding( platform, encoding ); + + /* now, set root->charmap with a unicode charmap */ + /* wherever available */ + if ( !root->charmap && + charmap->root.encoding == ft_encoding_unicode ) + root->charmap = (FT_CharMap)charmap; + + root->charmaps[n] = (FT_CharMap)charmap; + } + } + } + } + + Exit: + return error; + + Bad_Format: + error = FT_Err_Unknown_File_Format; + goto Exit; + } + + + /*************************************************************************/ + /* */ + /* */ + /* T2_Done_Face */ + /* */ + /* */ + /* Finalizes a given face object. */ + /* */ + /* */ + /* face :: A pointer to the face object to destroy. */ + /* */ + FT_LOCAL + void T2_Done_Face( T2_Face face ) + { + FT_Memory memory = face->root.memory; + SFNT_Interface* sfnt = (SFNT_Interface*)face->sfnt; + + + if ( sfnt ) + sfnt->done_face( face ); + + { + CFF_Font* cff = (CFF_Font*)face->extra.data; + + + if ( cff ) + { + T2_Done_CFF_Font( cff ); + FREE( face->extra.data ); + } + } + } + + + /*************************************************************************/ + /* */ + /* */ + /* T2_Init_Driver */ + /* */ + /* */ + /* Initializes a given OpenType driver object. */ + /* */ + /* */ + /* driver :: A handle to the target driver object. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF + FT_Error T2_Init_Driver( T2_Driver driver ) + { + /* init extension registry if needed */ + +#ifdef TT_CONFIG_OPTION_EXTEND_ENGINE + + return TT_Init_Extensions( driver ); + +#else + + FT_UNUSED( driver ); + + return T2_Err_Ok; + +#endif + } + + + /*************************************************************************/ + /* */ + /* */ + /* T2_Done_Driver */ + /* */ + /* */ + /* Finalizes a given OpenType driver. */ + /* */ + /* */ + /* driver :: A handle to the target OpenType driver. */ + /* */ + FT_LOCAL_DEF + void T2_Done_Driver( T2_Driver driver ) + { + /* destroy extensions registry if needed */ + +#ifdef TT_CONFIG_OPTION_EXTEND_ENGINE + + TT_Done_Extensions( driver ); + +#else + + FT_UNUSED( driver ); + +#endif + } + + +/* END */ Index: xc/extras/freetype2/src/cff/t2objs.h diff -u /dev/null xc/extras/freetype2/src/cff/t2objs.h:1.1.1.1 --- /dev/null Mon Dec 18 14:22:37 2000 +++ xc/extras/freetype2/src/cff/t2objs.h Fri Dec 8 16:26:21 2000 @@ -0,0 +1,148 @@ +/***************************************************************************/ +/* */ +/* t2objs.h */ +/* */ +/* OpenType objects manager (specification). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#ifndef T2OBJS_H +#define T2OBJS_H + + +#include +#include +#include +#include + +#ifdef __cplusplus + extern "C" { +#endif + + + /*************************************************************************/ + /* */ + /* */ + /* T2_Driver */ + /* */ + /* */ + /* A handle to an OpenType driver object. */ + /* */ + typedef struct T2_DriverRec_* T2_Driver; + + typedef TT_Face T2_Face; + + + /*************************************************************************/ + /* */ + /* */ + /* T2_Size */ + /* */ + /* */ + /* A handle to an OpenType size object. */ + /* */ + typedef FT_Size T2_Size; + + + /*************************************************************************/ + /* */ + /* */ + /* T2_GlyphSlot */ + /* */ + /* */ + /* A handle to an OpenType glyph slot object. */ + /* */ + typedef struct T2_GlyphSlotRec_ + { + FT_GlyphSlotRec root; + + FT_Bool hint; + FT_Bool scaled; + + FT_Fixed x_scale; + FT_Fixed y_scale; + + } T2_GlyphSlotRec, *T2_GlyphSlot; + + + + /*************************************************************************/ + /* */ + /* Subglyph transformation record. */ + /* */ + typedef struct T2_Transform_ + { + FT_Fixed xx, xy; /* transformation matrix coefficients */ + FT_Fixed yx, yy; + FT_F26Dot6 ox, oy; /* offsets */ + + } T2_Transform; + + + /* this is only used in the case of a pure CFF font with no charmap */ + typedef struct T2_CharMapRec_ + { + TT_CharMapRec root; + PS_Unicodes unicodes; + + } T2_CharMapRec, *T2_CharMap; + + + /***********************************************************************/ + /* */ + /* TrueType driver class. */ + /* */ + typedef struct T2_DriverRec_ + { + FT_DriverRec root; + + void* extension_component; + + } T2_DriverRec; + + + /*************************************************************************/ + /* */ + /* Face functions */ + /* */ + FT_LOCAL + FT_Error T2_Init_Face( FT_Stream stream, + T2_Face face, + FT_Int face_index, + FT_Int num_params, + FT_Parameter* params ); + + FT_LOCAL + void T2_Done_Face( T2_Face face ); + + + /*************************************************************************/ + /* */ + /* Driver functions */ + /* */ + FT_LOCAL + FT_Error T2_Init_Driver( T2_Driver driver ); + + FT_LOCAL + void T2_Done_Driver( T2_Driver driver ); + + +#ifdef __cplusplus + } +#endif + + +#endif /* T2OBJS_H */ + + +/* END */ Index: xc/extras/freetype2/src/cff/t2parse.c diff -u /dev/null xc/extras/freetype2/src/cff/t2parse.c:1.1.1.1 --- /dev/null Mon Dec 18 14:22:37 2000 +++ xc/extras/freetype2/src/cff/t2parse.c Fri Dec 8 16:26:21 2000 @@ -0,0 +1,655 @@ +/***************************************************************************/ +/* */ +/* t2parse.c */ +/* */ +/* OpenType parser (body). */ +/* */ +/* Copyright 1996-2000 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifdef FT_FLAT_COMPILE + +#include "t2parse.h" + +#else + +#include + +#endif + + +#include +#include + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_t2parse + + +#define T2_Err_Stack_Underflow FT_Err_Invalid_Argument +#define T2_Err_Syntax_Error FT_Err_Invalid_Argument + + + enum + { + t2_kind_none = 0, + t2_kind_num, + t2_kind_fixed, + t2_kind_string, + t2_kind_bool, + t2_kind_delta, + t2_kind_callback, + + t2_kind_max /* do not remove */ + }; + + + /* now generate handlers for the most simple fields */ + typedef FT_Error (*T2_Field_Reader)( T2_Parser* parser ); + + typedef struct T2_Field_Handler_ + { + int kind; + int code; + FT_UInt offset; + FT_Byte size; + T2_Field_Reader reader; + FT_UInt array_max; + FT_UInt count_offset; + + } T2_Field_Handler; + + + FT_LOCAL_DEF + void T2_Parser_Init( T2_Parser* parser, + FT_UInt code, + void* object ) + { + MEM_Set( parser, 0, sizeof ( *parser ) ); + + parser->top = parser->stack; + parser->object_code = code; + parser->object = object; + } + + + /* reads an integer */ + static + FT_Long parse_t2_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 parse_t2_real( FT_Byte* start, + FT_Byte* limit, + FT_Int power_ten ) + { + FT_Byte* p = start; + FT_Long num, divider, result, exp; + FT_Int sign = 0, exp_sign = 0; + FT_Byte nib; + FT_Byte 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 intial 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 ) + { + exp_sign = 1; + nib = 11; + } + + if ( nib == 11 ) + { + exp = 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; + + exp = exp * 10 + nib; + } + + if ( exp_sign ) + exp = -exp; + + power_ten += exp; + } + + /* 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++; + } + + 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 t2_parse_num( FT_Byte** d ) + { + return ( **d == 30 ? ( parse_t2_real( d[0], d[1], 0 ) >> 16 ) + : parse_t2_integer( d[0], d[1] ) ); + } + + + /* reads a floating point number, either integer or real */ + static + FT_Fixed t2_parse_fixed( FT_Byte** d ) + { + return ( **d == 30 ? parse_t2_real( d[0], d[1], 0 ) + : parse_t2_integer( d[0], d[1] ) << 16 ); + } + + + static + FT_Error parse_font_matrix( T2_Parser* parser ) + { + CFF_Font_Dict* dict = (CFF_Font_Dict*)parser->object; + FT_Matrix* matrix = &dict->font_matrix; + FT_Byte** data = parser->stack; + FT_Error error; + + + error = T2_Err_Stack_Underflow; + + if ( parser->top >= parser->stack + 4 ) + { + matrix->xx = t2_parse_fixed( data++ ); + matrix->yx = t2_parse_fixed( data++ ); + matrix->xy = t2_parse_fixed( data++ ); + matrix->yy = t2_parse_fixed( data ); + error = T2_Err_Ok; + } + + return error; + } + + + static + FT_Error parse_font_bbox( T2_Parser* parser ) + { + CFF_Font_Dict* dict = (CFF_Font_Dict*)parser->object; + FT_BBox* bbox = &dict->font_bbox; + FT_Byte** data = parser->stack; + FT_Error error; + + + error = T2_Err_Stack_Underflow; + + if ( parser->top >= parser->stack + 4 ) + { + bbox->xMin = t2_parse_num( data++ ); + bbox->yMin = t2_parse_num( data++ ); + bbox->xMax = t2_parse_num( data++ ); + bbox->yMax = t2_parse_num( data ); + error = T2_Err_Ok; + } + + return error; + } + + + static + FT_Error parse_private_dict( T2_Parser* parser ) + { + CFF_Font_Dict* dict = (CFF_Font_Dict*)parser->object; + FT_Byte** data = parser->stack; + FT_Error error; + + + error = T2_Err_Stack_Underflow; + + if ( parser->top >= parser->stack + 2 ) + { + dict->private_size = t2_parse_num( data++ ); + dict->private_offset = t2_parse_num( data ); + error = T2_Err_Ok; + } + + return error; + } + + + static + FT_Error parse_cid_ros( T2_Parser* parser ) + { + CFF_Font_Dict* dict = (CFF_Font_Dict*)parser->object; + FT_Byte** data = parser->stack; + FT_Error error; + + + error = T2_Err_Stack_Underflow; + + if ( parser->top >= parser->stack + 3 ) + { + dict->cid_registry = (FT_UInt)t2_parse_num( data++ ); + dict->cid_ordering = (FT_UInt)t2_parse_num( data++ ); + dict->cid_supplement = (FT_ULong)t2_parse_num( data ); + error = T2_Err_Ok; + } + + return error; + } + + +#define T2_FIELD_NUM( code, name ) \ + T2_FIELD( code, name, t2_kind_num ) +#define T2_FIELD_FIXED( code, name ) \ + T2_FIELD( code, name, t2_kind_fixed ) +#define T2_FIELD_STRING( code, name ) \ + T2_FIELD( code, name, t2_kind_string ) +#define T2_FIELD_BOOL( code, name ) \ + T2_FIELD( code, name, t2_kind_bool ) +#define T2_FIELD_DELTA( code, name, max ) \ + T2_FIELD( code, name, t2_kind_delta ) + +#define T2_FIELD_CALLBACK( code, name ) \ + { \ + t2_kind_callback, \ + code | T2CODE, \ + 0, 0, \ + parse_ ## name, \ + 0, 0 \ + }, + +#undef T2_FIELD +#define T2_FIELD( code, name, kind ) \ + { \ + kind, \ + code | T2CODE, \ + FT_FIELD_OFFSET( name ), \ + FT_FIELD_SIZE( name ), \ + 0, 0, 0 \ + }, + +#undef T2_FIELD_DELTA +#define T2_FIELD_DELTA( code, name, max ) \ + { \ + t2_kind_delta, \ + code | T2CODE, \ + FT_FIELD_OFFSET( name ), \ + FT_FIELD_SIZE_DELTA( name ), \ + 0, \ + max, \ + FT_FIELD_OFFSET( num_ ## name ) \ + }, + +#define T2CODE_TOPDICT 0x1000 +#define T2CODE_PRIVATE 0x2000 + + static const T2_Field_Handler t2_field_handlers[] = + { + +#ifdef FT_FLAT_COMPILE + +#include "t2tokens.h" + +#else + +#include + +#endif + + { 0, 0, 0, 0, 0, 0, 0 } + }; + + + FT_LOCAL_DEF + FT_Error T2_Parser_Run( T2_Parser* parser, + FT_Byte* start, + FT_Byte* limit ) + { + FT_Byte* p = start; + FT_Error error = T2_Err_Ok; + + + parser->top = parser->stack; + parser->start = start; + parser->limit = limit; + parser->cursor = start; + + while ( p < limit ) + { + FT_Byte v = *p; + + + if ( v >= 27 && v != 31 ) + { + /* it's a number; we will push its position on the stack */ + if ( parser->top - parser->stack >= T2_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 T2_Field_Handler* field; + + + /* first of all, a trivial check */ + if ( num_args < 1 ) + goto Stack_Underflow; + + *parser->top = p; + code = v; + if ( v == 12 ) + { + /* two byte operator */ + p++; + code = 0x100 | p[0]; + } + code = code | parser->object_code; + + for ( field = t2_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; + + switch ( field->kind ) + { + case t2_kind_bool: + case t2_kind_string: + case t2_kind_num: + val = t2_parse_num( parser->stack ); + goto Store_Number; + + case t2_kind_fixed: + val = t2_parse_fixed( parser->stack ); + + Store_Number: + switch ( field->size ) + { + case 1: + *(FT_Byte*)q = (FT_Byte)val; + break; + + case 2: + *(FT_Short*)q = (FT_Short)val; + break; + + case 4: + *(FT_Int32*)q = (FT_Int)val; + break; + + default: /* for 64-bit systems where long is 8 bytes */ + *(FT_Long*)q = val; + } + break; + + case t2_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 += t2_parse_num( data++ ); + switch ( field->size ) + { + case 1: + *(FT_Byte*)q = (FT_Byte)val; + break; + + case 2: + *(FT_Short*)q = (FT_Short)val; + break; + + case 4: + *(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 = T2_Err_Invalid_Argument; + goto Exit; + + Stack_Underflow: + error = T2_Err_Invalid_Argument; + goto Exit; + + Syntax_Error: + error = T2_Err_Invalid_Argument; + goto Exit; + } + + +/* END */ Index: xc/extras/freetype2/src/cff/t2parse.h diff -u /dev/null xc/extras/freetype2/src/cff/t2parse.h:1.1.1.1 --- /dev/null Mon Dec 18 14:22:37 2000 +++ xc/extras/freetype2/src/cff/t2parse.h Fri Dec 8 16:26:21 2000 @@ -0,0 +1,70 @@ +/***************************************************************************/ +/* */ +/* t2parse.h */ +/* */ +/* OpenType parser (specification). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#ifndef T2PARSE_H +#define T2PARSE_H + +#include +#include + +#define T2_MAX_STACK_DEPTH 96 + +#define T2CODE_TOPDICT 0x1000 +#define T2CODE_PRIVATE 0x2000 + + +#ifdef __cplusplus + extern "C" { +#endif + + + typedef struct T2_Parser_ + { + FT_Byte* start; + FT_Byte* limit; + FT_Byte* cursor; + + FT_Byte* stack[T2_MAX_STACK_DEPTH + 1]; + FT_Byte** top; + + FT_UInt object_code; + void* object; + + } T2_Parser; + + + FT_LOCAL + void T2_Parser_Init( T2_Parser* parser, + FT_UInt code, + void* object ); + + FT_LOCAL + FT_Error T2_Parser_Run( T2_Parser* parser, + FT_Byte* start, + FT_Byte* limit ); + + +#ifdef __cplusplus + } +#endif + + +#endif /* T2PARSE_H */ + + +/* END */ Index: xc/extras/freetype2/src/cff/t2tokens.h diff -u /dev/null xc/extras/freetype2/src/cff/t2tokens.h:1.1.1.1 --- /dev/null Mon Dec 18 14:22:37 2000 +++ xc/extras/freetype2/src/cff/t2tokens.h Fri Dec 8 16:26:21 2000 @@ -0,0 +1,96 @@ +/***************************************************************************/ +/* */ +/* t2tokens.h */ +/* */ +/* OpenType token definitions (specification only). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#undef FT_STRUCTURE +#define FT_STRUCTURE CFF_Font_Dict +#undef T2CODE +#define T2CODE T2CODE_TOPDICT + + T2_FIELD_STRING ( 0, version ) + T2_FIELD_STRING ( 1, notice ) + T2_FIELD_STRING ( 0x100, copyright ) + T2_FIELD_STRING ( 2, full_name ) + T2_FIELD_STRING ( 3, family_name ) + T2_FIELD_STRING ( 4, weight ) + T2_FIELD_BOOL ( 0x101, is_fixed_pitch ) + T2_FIELD_FIXED ( 0x102, italic_angle ) + T2_FIELD_NUM ( 0x103, underline_position ) + T2_FIELD_NUM ( 0x104, underline_thickness ) + T2_FIELD_NUM ( 0x105, paint_type ) + T2_FIELD_NUM ( 0x106, charstring_type ) + T2_FIELD_CALLBACK( 0x107, font_matrix ) + T2_FIELD_NUM ( 13, unique_id ) + T2_FIELD_CALLBACK( 5, font_bbox ) + T2_FIELD_NUM ( 0x108, stroke_width ) + T2_FIELD_NUM ( 15, charset_offset ) + T2_FIELD_NUM ( 16, encoding_offset ) + T2_FIELD_NUM ( 17, charstrings_offset ) + T2_FIELD_CALLBACK( 18, private_dict ) + T2_FIELD_NUM ( 0x114, synthetic_base ) + T2_FIELD_STRING ( 0x115, postscript ) + T2_FIELD_STRING ( 0x116, base_font_name ) + +#if 0 + T2_FIELD_DELTA ( 0x117, base_font_blend, 16 ) + T2_FIELD_CALLBACK( 0x118, multiple_master ) + T2_FIELD_CALLBACK( 0x119, blend_axit_types ) +#endif + + T2_FIELD_CALLBACK( 0x11E, cid_ros ) + T2_FIELD_NUM ( 0x11F, cid_font_version ) + T2_FIELD_NUM ( 0x120, cid_font_revision ) + T2_FIELD_NUM ( 0x121, cid_font_type ) + T2_FIELD_NUM ( 0x122, cid_count ) + T2_FIELD_NUM ( 0x123, cid_uid_base ) + T2_FIELD_NUM ( 0x124, cid_fd_array_offset ) + T2_FIELD_NUM ( 0x125, cid_fd_select_offset ) + T2_FIELD_STRING ( 0x126, cid_font_name ) + +#if 0 + T2_FIELD_NUM ( 0x127, chameleon ) +#endif + + +#undef FT_STRUCTURE +#define FT_STRUCTURE CFF_Private +#undef T2CODE +#define T2CODE T2CODE_PRIVATE + + T2_FIELD_DELTA( 6, blue_values, 14 ) + T2_FIELD_DELTA( 7, other_blues, 10 ) + T2_FIELD_DELTA( 8, family_blues, 14 ) + T2_FIELD_DELTA( 9, family_other_blues, 10 ) + T2_FIELD_FIXED( 0x109, blue_scale ) + T2_FIELD_NUM ( 0x10A, blue_shift ) + T2_FIELD_NUM ( 0x10B, blue_fuzz ) + T2_FIELD_NUM ( 10, standard_width ) + T2_FIELD_NUM ( 11, standard_height ) + T2_FIELD_DELTA( 0x10C, snap_widths, 13 ) + T2_FIELD_DELTA( 0x10D, snap_heights, 13 ) + T2_FIELD_BOOL ( 0x10E, force_bold ) + T2_FIELD_FIXED( 0x10F, force_bold_threshold ) + T2_FIELD_NUM ( 0x110, lenIV ) + T2_FIELD_NUM ( 0x111, language_group ) + T2_FIELD_FIXED( 0x112, expansion_factor ) + T2_FIELD_NUM ( 0x113, initial_random_seed ) + T2_FIELD_NUM ( 19, local_subrs_offset ) + T2_FIELD_NUM ( 20, default_width ) + T2_FIELD_NUM ( 21, nominal_width ) + + +/* END */ Index: xc/extras/freetype2/src/cid/cidafm.c diff -u /dev/null xc/extras/freetype2/src/cid/cidafm.c:1.1.1.1 --- /dev/null Mon Dec 18 14:22:37 2000 +++ xc/extras/freetype2/src/cid/cidafm.c Fri Dec 8 16:26:21 2000 @@ -0,0 +1,293 @@ +/***************************************************************************/ +/* */ +/* cidafm.c */ +/* */ +/* AFM support for CID-keyed fonts (body). */ +/* */ +/* Copyright 1996-2000 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifdef FT_FLAT_COMPILE + +#include "cidafm.h" + +#else + +#include + +#endif + + +#include +#include +#include + +#include /* for qsort() */ +#include /* for strcmp() */ +#include /* for isalnum() */ + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_cidafm + + + FT_LOCAL_DEF + void CID_Done_AFM( FT_Memory memory, + CID_AFM* afm ) + { + FREE( afm->kern_pairs ); + afm->num_pairs = 0; + } + + +#undef IS_KERN_PAIR +#define IS_KERN_PAIR( p ) ( p[0] == 'K' && p[1] == 'P' ) + +#define IS_ALPHANUM( c ) ( isalnum( c ) || \ + c == '_' || \ + c == '.' ) + + + /* read a glyph name and return the equivalent glyph index */ + static + FT_UInt afm_atoindex( FT_Byte** start, + FT_Byte* limit, + T1_Font* type1 ) + { + FT_Byte* p = *start; + FT_Int len; + FT_UInt result = 0; + char temp[64]; + + + /* skip whitespace */ + while ( ( *p == ' ' || *p == '\t' || *p == ':' || *p == ';' ) && + p < limit ) + p++; + *start = p; + + /* now, read glyph name */ + while ( IS_ALPHANUM( *p ) && p < limit ) + p++; + + len = p - *start; + + if ( len > 0 && len < 64 ) + { + FT_Int n; + + + /* copy glyph name to intermediate array */ + MEM_Copy( temp, *start, len ); + temp[len] = 0; + + /* lookup glyph name in face array */ + for ( n = 0; n < type1->num_glyphs; n++ ) + { + char* gname = (char*)type1->glyph_names[n]; + + + if ( gname && gname[0] == temp[0] && strcmp( gname, temp ) == 0 ) + { + result = n; + break; + } + } + } + *start = p; + return result; + } + + + /* read an integer */ + static + int afm_atoi( FT_Byte** start, + FT_Byte* limit ) + { + FT_Byte* p = *start; + int sum = 0; + int sign = 1; + + + /* skip everything that is not a number */ + while ( p < limit && !isdigit( *p ) ) + { + sign = 1; + if ( *p == '-' ) + sign = -1; + + p++; + } + + while ( p < limit && isdigit( *p ) ) + { + sum = sum * 10 + ( *p - '0' ); + p++; + } + *start = p; + + return sum * sign; + } + + +#undef KERN_INDEX +#define KERN_INDEX( g1, g2 ) ( ( (FT_ULong)g1 << 16 ) | g2 ) + + + /* compare two kerning pairs */ + static + int compare_kern_pairs( const void* a, + const void* b ) + { + CID_Kern_Pair* pair1 = (CID_Kern_Pair*)a; + CID_Kern_Pair* pair2 = (CID_Kern_Pair*)b; + + FT_ULong index1 = KERN_INDEX( pair1->glyph1, pair1->glyph2 ); + FT_ULong index2 = KERN_INDEX( pair2->glyph1, pair2->glyph2 ); + + + return ( index1 - index2 ); + } + + + /* parse an AFM file -- for now, only read the kerning pairs */ + FT_LOCAL_DEF + FT_Error CID_Read_AFM( FT_Face cid_face, + FT_Stream stream ) + { + FT_Error error; + FT_Memory memory = stream->memory; + FT_Byte* start; + FT_Byte* limit; + FT_Byte* p; + FT_Int count = 0; + CID_Kern_Pair* pair; + T1_Font* type1 = &((T1_Face)t1_face)->type1; + CID_AFM* afm = 0; + + + if ( ACCESS_Frame( stream->size ) ) + return error; + + start = (FT_Byte*)stream->cursor; + limit = (FT_Byte*)stream->limit; + p = start; + + /* we are now going to count the occurrences of `KP' or `KPX' in */ + /* the AFM file. */ + count = 0; + for ( p = start; p < limit - 3; p++ ) + { + if ( IS_KERN_PAIR( p ) ) + count++; + } + + /* Actually, kerning pairs are simply optional! */ + if ( count == 0 ) + goto Exit; + + /* allocate the pairs */ + if ( ALLOC( afm, sizeof ( *afm ) ) || + ALLOC_ARRAY( afm->kern_pairs, count, CID_Kern_Pair ) ) + goto Exit; + + /* now, read each kern pair */ + pair = afm->kern_pairs; + afm->num_pairs = count; + + /* save in face object */ + ((T1_Face)t1_face)->afm_data = afm; + + for ( p = start; p < limit - 3; p++ ) + { + if ( IS_KERN_PAIR( p ) ) + { + FT_Byte* q; + + + /* skip keyword (`KP' or `KPX') */ + q = p + 2; + if ( *q == 'X' ) + q++; + + pair->glyph1 = afm_atoindex( &q, limit, type1 ); + pair->glyph2 = afm_atoindex( &q, limit, type1 ); + pair->kerning.x = afm_atoi( &q, limit ); + + pair->kerning.y = 0; + if ( p[2] != 'X' ) + pair->kerning.y = afm_atoi( &q, limit ); + + pair++; + } + } + + /* now, sort the kern pairs according to their glyph indices */ + qsort( afm->kern_pairs, count, sizeof ( CID_Kern_Pair ), + compare_kern_pairs ); + + Exit: + if ( error ) + FREE( afm ); + + FORGET_Frame(); + + return error; + } + + + /* find the kerning for a given glyph pair */ + FT_LOCAL_DEF + void CID_Get_Kerning( CID_AFM* afm, + FT_UInt glyph1, + FT_UInt glyph2, + FT_Vector* kerning ) + { + CID_Kern_Pair *min, *mid, *max; + FT_ULong index = KERN_INDEX( glyph1, glyph2 ); + + + /* simple binary search */ + min = afm->kern_pairs; + max = min + afm->num_pairs - 1; + + while ( min <= max ) + { + FT_ULong midi; + + + mid = min + ( max - min ) / 2; + midi = KERN_INDEX( mid->glyph1, mid->glyph2 ); + if ( midi == index ) + { + *kerning = mid->kerning; + return; + } + + if ( midi < index ) + min = mid + 1; + else + max = mid - 1; + } + + kerning->x = 0; + kerning->y = 0; + } + + +/* END */ Index: xc/extras/freetype2/src/cid/cidafm.h diff -u /dev/null xc/extras/freetype2/src/cid/cidafm.h:1.1.1.1 --- /dev/null Mon Dec 18 14:22:37 2000 +++ xc/extras/freetype2/src/cid/cidafm.h Fri Dec 8 16:26:21 2000 @@ -0,0 +1,78 @@ +/***************************************************************************/ +/* */ +/* cidafm.h */ +/* */ +/* AFM support for CID-keyed fonts (specification). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#ifndef CIDAFM_H +#define CIDAFM_H + + +#ifdef FT_FLAT_COMPILE + +#include "cidobjs.h" + +#else + +#include + +#endif + + +#ifdef __cplusplus + extern "C" { +#endif + + + typedef struct CID_Kern_Pair_ + { + FT_UInt glyph1; + FT_UInt glyph2; + FT_Vector kerning; + + } CID_Kern_Pair; + + typedef struct CID_AFM_ + { + FT_UInt num_pairs; + CID_Kern_Pair* kern_pairs; + + } CID_AFM; + + + FT_LOCAL + FT_Error CID_Read_AFM( FT_Face cid_face, + FT_Stream stream ); + + FT_LOCAL + void CID_Done_AFM( FT_Memory memory, + CID_AFM* afm ); + + FT_LOCAL + void CID_Get_Kerning( CID_AFM* afm, + FT_UInt glyph1, + FT_UInt glyph2, + FT_Vector* kerning ); + + +#ifdef __cplusplus + } +#endif + + +#endif /* CIDAFM_H */ + + +/* END */ Index: xc/extras/freetype2/src/cid/cidgload.c diff -u /dev/null xc/extras/freetype2/src/cid/cidgload.c:1.1.1.1 --- /dev/null Mon Dec 18 14:22:37 2000 +++ xc/extras/freetype2/src/cid/cidgload.c Fri Dec 8 16:26:21 2000 @@ -0,0 +1,356 @@ +/***************************************************************************/ +/* */ +/* cidgload.c */ +/* */ +/* CID-keyed Type1 Glyph Loader (body). */ +/* */ +/* Copyright 1996-2000 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifdef FT_FLAT_COMPILE + +#include "cidload.h" +#include "cidgload.h" + +#else + +#include +#include + +#endif + + +#include +#include +#include + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an 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_Info* cid = &face->cid; + FT_Byte* p; + FT_UInt entry_len = cid->fd_bytes + cid->gd_bytes; + FT_UInt fd_select; + FT_ULong off1, glyph_len; + FT_Stream stream = face->root.stream; + FT_Error error = 0; + + + /* read the CID font dict index and charstring offset from the CIDMap */ + if ( FILE_Seek( cid->data_offset + cid->cidmap_offset + + glyph_index * entry_len ) || + ACCESS_Frame( 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_len = cid_get_offset( &p, (FT_Byte)cid->gd_bytes ) - off1; + + FORGET_Frame(); + + /* now, if the glyph is not empty, set up the subrs array, and parse */ + /* the charstrings */ + if ( glyph_len > 0 ) + { + CID_FontDict* dict; + CID_Subrs* cid_subrs = face->subrs + fd_select; + FT_Byte* charstring; + FT_UInt lenIV; + FT_Memory memory = face->root.memory; + + + /* setup subrs */ + decoder->num_subrs = cid_subrs->num_subrs; + decoder->subrs = cid_subrs->code; + decoder->subrs_len = 0; + + /* setup font matrix */ + dict = cid->font_dicts + fd_select; + lenIV = dict->private_dict.lenIV; + + decoder->font_matrix = dict->font_matrix; + decoder->font_offset = dict->font_offset; + + /* the charstrings are encoded (stupid!) */ + /* load the charstrings, then execute it */ + + if ( ALLOC( charstring, glyph_len ) ) + goto Exit; + + if ( !FILE_Read_At( cid->data_offset + off1, charstring, glyph_len ) ) + { + cid_decrypt( charstring, glyph_len, 4330 ); + error = decoder->funcs.parse_charstrings( decoder, + charstring + lenIV, + glyph_len - lenIV ); + } + + FREE( charstring ); + } + + 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_Compute_Max_Advance( CID_Face face, + FT_Int* max_advance ) + { + FT_Error error; + T1_Decoder decoder; + FT_Int glyph_index; + + PSAux_Interface* psaux = (PSAux_Interface*)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 */ + cid_load_glyph ); + if ( error ) + return error; + + 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; + + return T1_Err_Ok; + } + + +#endif /* 0 */ + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /********** *********/ + /********** *********/ + /********** UNHINTED GLYPH LOADER *********/ + /********** *********/ + /********** The following code is in charge of loading a *********/ + /********** single outline. It completely ignores hinting *********/ + /********** and is used when FT_LOAD_NO_HINTING is set. *********/ + /********** *********/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + FT_LOCAL_DEF + FT_Error CID_Load_Glyph( CID_GlyphSlot glyph, + CID_Size size, + FT_Int glyph_index, + FT_Int load_flags ) + { + FT_Error error; + T1_Decoder decoder; + CID_Face face = (CID_Face)glyph->root.face; + FT_Bool hinting; + + PSAux_Interface* psaux = (PSAux_Interface*)face->psaux; + FT_Matrix font_matrix; + FT_Vector font_offset; + + + 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 = ( load_flags & FT_LOAD_NO_SCALE ) == 0 && + ( load_flags & FT_LOAD_NO_HINTING ) == 0; + + glyph->root.format = ft_glyph_format_outline; + + { + error = psaux->t1_decoder_funcs->init( &decoder, + (FT_Face)face, + (FT_Size)size, + (FT_GlyphSlot)glyph, + 0, /* glyph names -- XXX */ + 0, /* blend == 0 */ + cid_load_glyph ); + + /* set up the decoder */ + decoder.builder.no_recurse = + ( ( load_flags & FT_LOAD_NO_RECURSE ) != 0 ); + + error = cid_load_glyph( &decoder, glyph_index ); + + 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 */ + 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; + + + /* 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 metrics */ + metrics->vertBearingX = 0; + metrics->vertBearingY = 0; + metrics->vertAdvance = 0; + + glyph->root.linearVertAdvance = 0; + glyph->root.format = ft_glyph_format_outline; + + if ( size && size->root.metrics.y_ppem < 24 ) + glyph->root.outline.flags |= ft_outline_high_precision; + + /* apply the font matrix */ + FT_Outline_Transform( &glyph->root.outline, &font_matrix ); + + FT_Outline_Translate( &glyph->root.outline, + font_offset.x, + 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 */ + 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 ); + } + + FT_Outline_Get_CBox( &glyph->root.outline, &cbox ); + + /* Then scale the metrics */ + metrics->horiAdvance = FT_MulFix( metrics->horiAdvance, x_scale ); + metrics->vertAdvance = FT_MulFix( metrics->vertAdvance, y_scale ); + + metrics->vertBearingX = FT_MulFix( metrics->vertBearingX, x_scale ); + metrics->vertBearingY = FT_MulFix( metrics->vertBearingY, y_scale ); + } + + /* compute the other metrics */ + FT_Outline_Get_CBox( &glyph->root.outline, &cbox ); + + /* grid fit the bounding box if necessary */ + if ( hinting ) + { + cbox.xMin &= -64; + cbox.yMin &= -64; + cbox.xMax = ( cbox.xMax + 63 ) & -64; + cbox.yMax = ( cbox.yMax + 63 ) & -64; + } + + metrics->width = cbox.xMax - cbox.xMin; + metrics->height = cbox.yMax - cbox.yMin; + + metrics->horiBearingX = cbox.xMin; + metrics->horiBearingY = cbox.yMax; + } + } + return error; + } + + +/* END */ Index: xc/extras/freetype2/src/cid/cidgload.h diff -u /dev/null xc/extras/freetype2/src/cid/cidgload.h:1.1.1.1 --- /dev/null Mon Dec 18 14:22:37 2000 +++ xc/extras/freetype2/src/cid/cidgload.h Fri Dec 8 16:26:21 2000 @@ -0,0 +1,63 @@ +/***************************************************************************/ +/* */ +/* cidgload.h */ +/* */ +/* OpenType Glyph Loader (specification). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#ifndef CIDGLOAD_H +#define CIDGLOAD_H + + +#ifdef FT_FLAT_COMPILE + +#include "cidobjs.h" + +#else + +#include + +#endif + + +#ifdef __cplusplus + extern "C" { +#endif + + +#if 0 + + /* Compute the maximum advance width of a font through quick parsing */ + FT_LOCAL + FT_Error CID_Compute_Max_Advance( CID_Face face, + FT_Int* max_advance ); + +#endif /* 0 */ + + FT_LOCAL + FT_Error CID_Load_Glyph( CID_GlyphSlot glyph, + CID_Size size, + FT_Int glyph_index, + FT_Int load_flags ); + + +#ifdef __cplusplus + } +#endif + + +#endif /* CIDGLOAD_H */ + + +/* END */ Index: xc/extras/freetype2/src/cid/cidload.c diff -u /dev/null xc/extras/freetype2/src/cid/cidload.c:1.1.1.1 --- /dev/null Mon Dec 18 14:22:37 2000 +++ xc/extras/freetype2/src/cid/cidload.c Fri Dec 8 16:26:21 2000 @@ -0,0 +1,553 @@ +/***************************************************************************/ +/* */ +/* cidload.c */ +/* */ +/* CID-keyed Type1 font loader (body). */ +/* */ +/* 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 +#include +#include + +#include +#include + + +#ifdef FT_FLAT_COMPILE + +#include "cidload.h" + +#else + +#include + +#endif + + +#include +#include /* for isspace(), isalnum() */ + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an 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; + } + + + FT_LOCAL_DEF + void cid_decrypt( FT_Byte* buffer, + FT_Int length, + FT_UShort seed ) + { + while ( length > 0 ) + { + FT_Byte plain; + + + plain = ( *buffer ^ ( seed >> 8 ) ); + seed = ( *buffer + seed ) * 52845 + 22719; + *buffer++ = plain; + length--; + } + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** 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_Info* cid = &face->cid; + + + /* if the keyword has a dedicated callback, call it */ + if ( keyword->type == t1_field_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_cid_info: + object = (FT_Byte*)cid; + break; + + case t1_field_font_info: + object = (FT_Byte*)&cid->font_info; + break; + + default: + { + CID_FontDict* dict; + + + if ( parser->num_dict < 0 ) + { + FT_ERROR(( "cid_load_keyword: invalid use of `%s'!\n", + keyword->ident )); + error = T1_Err_Syntax_Error; + goto Exit; + } + + dict = cid->font_dicts + parser->num_dict; + switch ( keyword->location ) + { + case t1_field_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_integer_array || + keyword->type == t1_field_fixed_array ) + error = CID_Load_Field_Table( &loader->parser, keyword, + &dummy_object ); + else + error = CID_Load_Field( &loader->parser, keyword, &dummy_object ); + Exit: + return error; + } + + + FT_CALLBACK_DEF + FT_Error parse_font_bbox( CID_Face face, + CID_Parser* parser ) + { + FT_Short temp[4]; + FT_BBox* bbox = &face->cid.font_bbox; + + + (void)CID_ToCoordArray( parser, 4, temp ); + bbox->xMin = temp[0]; + bbox->yMin = temp[1]; + bbox->xMax = temp[2]; + bbox->yMax = temp[3]; + + return T1_Err_Ok; /* this is a callback function; */ + /* we must return an error code */ + } + + + FT_CALLBACK_DEF + FT_Error parse_font_matrix( CID_Face face, + CID_Parser* parser ) + { + FT_Matrix* matrix; + FT_Vector* offset; + CID_FontDict* dict; + FT_Fixed temp[6]; + + + if ( parser->num_dict >= 0 ) + { + dict = face->cid.font_dicts + parser->num_dict; + matrix = &dict->font_matrix; + offset = &dict->font_offset; + + (void)CID_ToFixedArray( parser, 6, temp, 3 ); + + /* we need to scale the values by 1.0/temp[3] */ + if ( temp[3] != 0x10000L ) + { + temp[0] = FT_DivFix( temp[0], temp[3] ); + temp[1] = FT_DivFix( temp[1], temp[3] ); + temp[2] = FT_DivFix( temp[2], temp[3] ); + temp[4] = FT_DivFix( temp[4], temp[3] ); + temp[5] = FT_DivFix( temp[5], temp[3] ); + 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 T1_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_Info* cid = &face->cid; + FT_Memory memory = face->root.memory; + FT_Error error = T1_Err_Ok; + FT_Long num_dicts; + + + num_dicts = CID_ToInt( parser ); + + if ( !cid->font_dicts ) + { + FT_Int n; + + + if ( ALLOC_ARRAY( cid->font_dicts, num_dicts, CID_FontDict ) ) + 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_FontDict* dict = cid->font_dicts + n; + + + /* default value for lenIV */ + dict->private_dict.lenIV = 4; + } + } + + Exit: + return error; + } + + + static + const T1_Field cid_field_records[] = + { + +#ifdef FT_FLAT_COMPILE + +#include "cidtokens.h" + +#else + +#include + +#endif + + T1_FIELD_CALLBACK( "FontBBox", parse_font_bbox ) + T1_FIELD_CALLBACK( "FDArray", parse_fd_array ) + T1_FIELD_CALLBACK( "FontMatrix", parse_font_matrix ) + { 0, t1_field_cid_info, t1_field_none, 0, 0, 0, 0, 0 } + }; + + + static + int is_alpha( char c ) + { + return ( isalnum( (int)c ) || + c == '.' || + c == '_' ); + } + + + + 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 = 0; + + { + FT_Byte* cur = base; + FT_Byte* limit = cur + size; + + + for ( ;cur < limit; cur++ ) + { + /* look for `%ADOBeginFontDict' */ + if ( *cur == '%' && cur + 20 < limit && + strncmp( (char*)cur, "%ADOBeginFontDict", 17 ) == 0 ) + { + cur += 17; + + /* 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++; + } + /* look for immediates */ + else if ( *cur == '/' && cur + 2 < limit ) + { + FT_Byte* cur2; + FT_Int len; + + + cur++; + + cur2 = cur; + while ( cur2 < limit && is_alpha( *cur2 ) ) + cur2++; + + len = cur2 - cur; + if ( len > 0 && len < 22 ) + { + /* now compare the immediate name to the keyword table */ + const T1_Field* keyword = cid_field_records; + + + for (;;) + { + FT_Byte* name; + + + name = (FT_Byte*)keyword->ident; + if ( !name ) + break; + + if ( cur[0] == name[0] && + len == (FT_Int)strlen( (const char*)name ) ) + { + FT_Int 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.cursor = cur2; + CID_Skip_Spaces( parser ); + parser->root.error = cid_load_keyword( face, + loader, + keyword ); + if ( parser->root.error ) + return parser->root.error; + + cur = parser->root.cursor; + break; + } + } + keyword++; + } + } + } + } + } + return parser->root.error; + } + + + /* read the subrmap and the subrs of each font dict */ + static + FT_Error cid_read_subrs( CID_Face face ) + { + CID_Info* cid = &face->cid; + FT_Memory memory = face->root.memory; + FT_Stream stream = face->root.stream; + FT_Error error; + FT_Int n; + CID_Subrs* subr; + FT_UInt max_offsets = 0; + FT_ULong* offsets = 0; + + + if ( ALLOC_ARRAY( face->subrs, cid->num_dicts, CID_Subrs ) ) + goto Exit; + + subr = face->subrs; + for ( n = 0; n < cid->num_dicts; n++, subr++ ) + { + CID_FontDict* dict = cid->font_dicts + n; + 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 = ( num_subrs + 1 + 3 ) & -4; + + + if ( REALLOC_ARRAY( offsets, max_offsets, new_max, FT_ULong ) ) + goto Fail; + + max_offsets = new_max; + } + + /* read the subrmap's offsets */ + if ( FILE_Seek( cid->data_offset + dict->subrmap_offset ) || + ACCESS_Frame( ( 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 ); + + FORGET_Frame(); + + /* now, compute the size of subrs charstrings, */ + /* allocate, and read them */ + data_len = offsets[num_subrs] - offsets[0]; + + if ( ALLOC_ARRAY( subr->code, num_subrs + 1, FT_Byte* ) || + ALLOC( subr->code[0], data_len ) ) + goto Fail; + + if ( FILE_Seek( cid->data_offset + offsets[0] ) || + FILE_Read( subr->code[0], data_len ) ) + goto Exit; + + /* set up pointers */ + for ( count = 1; count <= num_subrs; count++ ) + { + FT_UInt len; + + + len = offsets[count] - offsets[count - 1]; + subr->code[count] = subr->code[count - 1] + len; + } + + /* decrypt subroutines */ + for ( count = 0; count < num_subrs; count++ ) + { + FT_UInt len; + + + len = offsets[count + 1] - offsets[count]; + cid_decrypt( subr->code[count], len, 4330 ); + } + + subr->num_subrs = num_subrs; + } + + Exit: + FREE( offsets ); + return error; + + Fail: + if ( face->subrs ) + { + for ( n = 0; n < cid->num_dicts; n++ ) + { + if ( face->subrs[n].code ) + FREE( face->subrs[n].code[0] ); + + FREE( face->subrs[n].code ); + } + FREE( face->subrs ); + } + goto Exit; + } + + + static + void t1_init_loader( CID_Loader* loader, + CID_Face face ) + { + FT_UNUSED( face ); + + MEM_Set( loader, 0, sizeof ( *loader ) ); + } + + + static + void t1_done_loader( CID_Loader* loader ) + { + CID_Parser* parser = &loader->parser; + + + /* finalize parser */ + CID_Done_Parser( parser ); + } + + + FT_LOCAL_DEF + FT_Error CID_Open_Face( CID_Face face ) + { + CID_Loader loader; + CID_Parser* parser; + FT_Error error; + + + t1_init_loader( &loader, face ); + + parser = &loader.parser; + error = CID_New_Parser( parser, face->root.stream, face->root.memory, + (PSAux_Interface*)face->psaux ); + if ( error ) + goto Exit; + + error = cid_parse_dict( face, &loader, + parser->postscript, + parser->postscript_len ); + if ( error ) + goto Exit; + + face->cid.data_offset = loader.parser.data_offset; + error = cid_read_subrs( face ); + + Exit: + t1_done_loader( &loader ); + return error; + } + + +/* END */ Index: xc/extras/freetype2/src/cid/cidload.h diff -u /dev/null xc/extras/freetype2/src/cid/cidload.h:1.1.1.1 --- /dev/null Mon Dec 18 14:22:37 2000 +++ xc/extras/freetype2/src/cid/cidload.h Fri Dec 8 16:26:21 2000 @@ -0,0 +1,69 @@ +/***************************************************************************/ +/* */ +/* cidload.h */ +/* */ +/* CID-keyed Type1 font loader (specification). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#ifndef CIDLOAD_H +#define CIDLOAD_H + +#include + +#ifdef FT_FLAT_COMPILE + +#include "cidparse.h" + +#else + +#include + +#endif + + +#ifdef __cplusplus + extern "C" { +#endif + + + 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 + void cid_decrypt( FT_Byte* buffer, + FT_Int length, + FT_UShort seed ); + + FT_LOCAL + FT_Error CID_Open_Face( CID_Face face ); + + +#ifdef __cplusplus + } +#endif + + +#endif /* CIDLOAD_H */ + + +/* END */ Index: xc/extras/freetype2/src/cid/cidobjs.c diff -u /dev/null xc/extras/freetype2/src/cid/cidobjs.c:1.1.1.1 --- /dev/null Mon Dec 18 14:22:37 2000 +++ xc/extras/freetype2/src/cid/cidobjs.c Fri Dec 8 16:26:21 2000 @@ -0,0 +1,391 @@ +/***************************************************************************/ +/* */ +/* cidobjs.c */ +/* */ +/* CID objects manager (body). */ +/* */ +/* 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 +#include + + +#ifdef FT_FLAT_COMPILE + +#include "cidgload.h" +#include "cidload.h" + +#else + +#include +#include + +#endif + + +#include +#include + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an 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 + + + /*************************************************************************/ + /* */ + /* FACE FUNCTIONS */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* */ + /* CID_Done_Face */ + /* */ + /* */ + /* Finalizes a given face object. */ + /* */ + /* */ + /* face :: A pointer to the face object to destroy. */ + /* */ + FT_LOCAL_DEF + void CID_Done_Face( CID_Face face ) + { + FT_Memory memory; + + + if ( face ) + { + CID_Info* cid = &face->cid; + T1_FontInfo* info = &cid->font_info; + + + memory = face->root.memory; + + /* release FontInfo strings */ + FREE( info->version ); + FREE( info->notice ); + FREE( info->full_name ); + FREE( info->family_name ); + FREE( info->weight ); + + /* release font dictionaries */ + FREE( cid->font_dicts ); + cid->num_dicts = 0; + + /* release other strings */ + FREE( cid->cid_font_name ); + FREE( cid->registry ); + FREE( cid->ordering ); + + face->root.family_name = 0; + face->root.style_name = 0; + } + } + + + /*************************************************************************/ + /* */ + /* */ + /* CID_Init_Face */ + /* */ + /* */ + /* Initializes a given CID 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 CID_Init_Face( FT_Stream stream, + CID_Face face, + FT_Int face_index, + FT_Int num_params, + FT_Parameter* params ) + { + FT_Error error; + PSNames_Interface* psnames; + PSAux_Interface* psaux; + + FT_UNUSED( num_params ); + FT_UNUSED( params ); + FT_UNUSED( face_index ); + FT_UNUSED( stream ); + + + face->root.num_faces = 1; + + psnames = (PSNames_Interface*)face->psnames; + if ( !psnames ) + { + psnames = (PSNames_Interface*)FT_Get_Module_Interface( + FT_FACE_LIBRARY( face ), "psnames" ); + + face->psnames = psnames; + } + + psaux = (PSAux_Interface*)face->psaux; + if ( !psaux ) + { + psaux = (PSAux_Interface*)FT_Get_Module_Interface( + FT_FACE_LIBRARY( face ), "psaux" ); + + face->psaux = psaux; + } + + /* open the tokenizer; this will also check the font format */ + if ( FILE_Seek( 0 ) ) + goto Exit; + + error = CID_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(( "CID_Init_Face: invalid face index\n" )); + error = T1_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 */ + { + FT_Face root = (FT_Face)&face->root; + + + root->num_glyphs = face->cid.cid_count; + root->num_charmaps = 0; + + root->face_index = face_index; + root->face_flags = FT_FACE_FLAG_SCALABLE; + + root->face_flags |= FT_FACE_FLAG_HORIZONTAL; + + if ( face->cid.font_info.is_fixed_pitch ) + root->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! */ + root->family_name = face->cid.font_info.family_name; + if ( root->family_name ) + { + char* full = face->cid.font_info.full_name; + char* family = root->family_name; + + while ( *family && *full == *family ) + { + family++; + full++; + } + + root->style_name = ( *full == ' ' ) ? full + 1 + : (char *)"Regular"; + } + else + { + /* do we have a `/FontName'? */ + if ( face->cid.cid_font_name ) + { + root->family_name = face->cid.cid_font_name; + root->style_name = (char *)"Regular"; + } + } + + /* no embedded bitmap support */ + root->num_fixed_sizes = 0; + root->available_sizes = 0; + + root->bbox = face->cid.font_bbox; + root->units_per_EM = 1000; + root->ascender = (FT_Short)face->cid.font_bbox.yMax; + root->descender = (FT_Short)face->cid.font_bbox.yMin; + root->height = ( ( root->ascender + root->descender ) * 12 ) + / 10; + + +#if 0 + + /* now compute the maximum advance width */ + + root->max_advance_width = face->type1.private_dict.standard_width[0]; + + /* compute max advance width for proportional fonts */ + if ( !face->type1.font_info.is_fixed_pitch ) + { + FT_Int max_advance; + + + error = CID_Compute_Max_Advance( face, &max_advance ); + + /* in case of error, keep the standard width */ + if ( !error ) + root->max_advance_width = max_advance; + else + error = 0; /* clear error */ + } + + root->max_advance_height = root->height; + +#endif /* 0 */ + + root->underline_position = face->cid.font_info.underline_position; + root->underline_thickness = face->cid.font_info.underline_thickness; + + root->internal->max_points = 0; + root->internal->max_contours = 0; + } + } + +#if 0 + + /* charmap support - synthetize unicode charmap when possible */ + { + FT_Face root = &face->root; + FT_CharMap charmap = face->charmaprecs; + + + /* synthesize a Unicode charmap if there is support in the `psnames' */ + /* module */ + if ( face->psnames ) + { + PSNames_Interface* psnames = (PSNames_Interface*)face->psnames; + + + if ( psnames->unicode_value ) + { + error = psnames->build_unicodes( + root->memory, + face->type1.num_glyphs, + (const char**)face->type1.glyph_names, + &face->unicode_map ); + if ( !error ) + { + root->charmap = charmap; + charmap->face = (FT_Face)face; + charmap->encoding = ft_encoding_unicode; + charmap->platform_id = 3; + charmap->encoding_id = 1; + charmap++; + } + + /* simply clear the error in case of failure (which really */ + /* means that out of memory or no unicode glyph names) */ + error = 0; + } + } + + /* now, support either the standard, expert, or custom encodings */ + charmap->face = (FT_Face)face; + charmap->platform_id = 7; /* a new platform id for Adobe fonts? */ + + switch ( face->type1.encoding_type ) + { + case t1_encoding_standard: + charmap->encoding = ft_encoding_adobe_standard; + charmap->encoding_id = 0; + break; + + case t1_encoding_expert: + charmap->encoding = ft_encoding_adobe_expert; + charmap->encoding_id = 1; + break; + + default: + charmap->encoding = ft_encoding_adobe_custom; + charmap->encoding_id = 2; + break; + } + + root->charmaps = face->charmaps; + root->num_charmaps = charmap - face->charmaprecs + 1; + face->charmaps[0] = &face->charmaprecs[0]; + face->charmaps[1] = &face->charmaprecs[1]; + } + +#endif /* 0 */ + + Exit: + return error; + } + + + /*************************************************************************/ + /* */ + /* */ + /* CID_Init_Driver */ + /* */ + /* */ + /* Initializes a given CID driver object. */ + /* */ + /* */ + /* driver :: A handle to the target driver object. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF + FT_Error CID_Init_Driver( CID_Driver driver ) + { + FT_UNUSED( driver ); + + return T1_Err_Ok; + } + + + /*************************************************************************/ + /* */ + /* */ + /* CID_Done_Driver */ + /* */ + /* */ + /* Finalizes a given CID driver. */ + /* */ + /* */ + /* driver :: A handle to the target CID driver. */ + /* */ + FT_LOCAL + void CID_Done_Driver( CID_Driver driver ) + { + FT_UNUSED( driver ); + } + + +/* END */ Index: xc/extras/freetype2/src/cid/cidobjs.h diff -u /dev/null xc/extras/freetype2/src/cid/cidobjs.h:1.1.1.1 --- /dev/null Mon Dec 18 14:22:37 2000 +++ xc/extras/freetype2/src/cid/cidobjs.h Fri Dec 8 16:26:21 2000 @@ -0,0 +1,141 @@ +/***************************************************************************/ +/* */ +/* cidobjs.h */ +/* */ +/* CID objects manager (specification). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#ifndef CIDOBJS_H +#define CIDOBJS_H + +#include +#include +#include +#include + + +#ifdef __cplusplus + extern "C" { +#endif + + + /* 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; + + + /*************************************************************************/ + /* */ + /* */ + /* CID_Driver */ + /* */ + /* */ + /* A handle to a Type 1 driver object. */ + /* */ + typedef struct CID_DriverRec_* CID_Driver; + + + /*************************************************************************/ + /* */ + /* */ + /* CID_Size */ + /* */ + /* */ + /* A handle to a Type 1 size object. */ + /* */ + typedef struct CID_SizeRec_* CID_Size; + + + /*************************************************************************/ + /* */ + /* */ + /* CID_GlyphSlot */ + /* */ + /* */ + /* A handle to a Type 1 glyph slot object. */ + /* */ + typedef struct CID_GlyphSlotRec_* CID_GlyphSlot; + + + /*************************************************************************/ + /* */ + /* */ + /* CID_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 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 + FT_Error CID_Init_Face( FT_Stream stream, + CID_Face face, + FT_Int face_index, + FT_Int num_params, + FT_Parameter* params ); + + FT_LOCAL + void CID_Done_Face( CID_Face face ); + + + FT_LOCAL + FT_Error CID_Init_Driver( CID_Driver driver ); + + FT_LOCAL + void CID_Done_Driver( CID_Driver driver ); + + +#ifdef __cplusplus + } +#endif + + +#endif /* CIDOBJS_H */ + + +/* END */ Index: xc/extras/freetype2/src/cid/cidparse.c diff -u /dev/null xc/extras/freetype2/src/cid/cidparse.c:1.1.1.1 --- /dev/null Mon Dec 18 14:22:38 2000 +++ xc/extras/freetype2/src/cid/cidparse.c Fri Dec 8 16:26:21 2000 @@ -0,0 +1,165 @@ +/***************************************************************************/ +/* */ +/* cidparse.c */ +/* */ +/* CID-keyed Type1 parser (body). */ +/* */ +/* 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 +#include +#include +#include +#include + + +#ifdef FT_FLAT_COMPILE + +#include "cidparse.h" + +#else + +#include + +#endif + + +#include /* for strncmp() */ + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an 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_New_Parser( CID_Parser* parser, + FT_Stream stream, + FT_Memory memory, + PSAux_Interface* psaux ) + { + FT_Error error; + FT_ULong base_offset, offset, ps_len; + FT_Byte buffer[256 + 10]; + FT_Int buff_len; + + + MEM_Set( parser, 0, sizeof ( *parser ) ); + psaux->t1_parser_funcs->init( &parser->root, 0, 0, memory ); + + parser->stream = stream; + + base_offset = FILE_Pos(); + + /* first of all, check the font format in the header */ + if ( ACCESS_Frame( 31 ) ) + goto Exit; + + if ( strncmp( (char *)stream->cursor, + "%!PS-Adobe-3.0 Resource-CIDFont", 31 ) ) + { + FT_TRACE2(( "[not a valid CID-keyed font]\n" )); + error = FT_Err_Unknown_File_Format; + } + + FORGET_Frame(); + if ( error ) + goto Exit; + + /* now, read the rest of the file, until we find a `StartData' */ + buff_len = 256; + for (;;) + { + FT_Byte *p, *limit = buffer + 256; + FT_ULong top_position; + + + /* fill input buffer */ + buff_len -= 256; + if ( buff_len > 0 ) + MEM_Move( buffer, limit, buff_len ); + + p = buffer + buff_len; + + if ( FILE_Read( p, 256 + 10 - buff_len ) ) + goto Exit; + + top_position = FILE_Pos() - buff_len; + buff_len = 256 + 10; + + /* look for `StartData' */ + for ( p = buffer; p < limit; p++ ) + { + if ( p[0] == 'S' && strncmp( (char*)p, "StartData", 9 ) == 0 ) + { + /* save offset of binary data after `StartData' */ + offset = top_position - ( limit - p ) + 10; + goto Found; + } + } + } + + Found: + /* we have found the start of the binary data. We will now */ + /* rewind and extract the frame of corresponding to the Postscript */ + /* section */ + + ps_len = offset - base_offset; + if ( FILE_Seek( base_offset ) || + EXTRACT_Frame( 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; + + Exit: + return error; + } + + + FT_LOCAL_DEF + void CID_Done_Parser( CID_Parser* parser ) + { + /* always free the private dictionary */ + if ( parser->postscript ) + { + FT_Stream stream = parser->stream; + + + RELEASE_Frame( parser->postscript ); + } + parser->root.funcs.done( &parser->root ); + } + + +/* END */ Index: xc/extras/freetype2/src/cid/cidparse.h diff -u /dev/null xc/extras/freetype2/src/cid/cidparse.h:1.1.1.1 --- /dev/null Mon Dec 18 14:22:38 2000 +++ xc/extras/freetype2/src/cid/cidparse.h Fri Dec 8 16:26:21 2000 @@ -0,0 +1,118 @@ +/***************************************************************************/ +/* */ +/* cidparse.h */ +/* */ +/* CID-keyed Type1 parser (specification). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#ifndef CIDPARSE_H +#define CIDPARSE_H + +#include +#include +#include + +#ifdef __cplusplus + extern "C" { +#endif + + + /*************************************************************************/ + /* */ + /* */ + /* CID_Parser */ + /* */ + /* */ + /* A CID_Parser is an object used to parse a Type 1 fonts very */ + /* quickly. */ + /* */ + /* */ + /* root :: the root T1_Parser 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. */ + /* */ + /* cid :: A structure which holds the information about */ + /* the current font. */ + /* */ + /* num_dict :: The number of font dictionaries. */ + /* */ + typedef struct CID_Parser_ + { + T1_Parser root; + FT_Stream stream; + + FT_Byte* postscript; + FT_Int postscript_len; + + FT_ULong data_offset; + + CID_Info* cid; + FT_Int num_dict; + + } CID_Parser; + + + FT_LOCAL + FT_Error CID_New_Parser( CID_Parser* parser, + FT_Stream stream, + FT_Memory memory, + PSAux_Interface* psaux ); + + FT_LOCAL + void CID_Done_Parser( CID_Parser* parser ); + + + /*************************************************************************/ + /* */ + /* PARSING ROUTINES */ + /* */ + /*************************************************************************/ + +#define CID_Skip_Spaces( p ) (p)->root.funcs.skip_spaces( &(p)->root ) +#define CID_Skip_Alpha( p ) (p)->root.funcs.skip_alpha ( &(p)->root ) + +#define CID_ToInt( p ) (p)->root.funcs.to_int( &(p)->root ) +#define CID_ToFixed( p, t ) (p)->root.funcs.to_fixed( &(p)->root, t ) + +#define CID_ToCoordArray( p, m, c ) \ + (p)->root.funcs.to_coord_array( &(p)->root, m, c ) +#define CID_ToFixedArray( p, m, f, t ) \ + (p)->root.funcs.to_fixed_array( &(p)->root, m, f, t ) +#define CID_ToToken( p, t ) \ + (p)->root.funcs.to_token( &(p)->root, t ) +#define CID_ToTokenArray( p, t, m, c ) \ + (p)->root.funcs.to_token_array( &(p)->root, t, m, c ) + +#define CID_Load_Field( p, f, o ) \ + (p)->root.funcs.load_field( &(p)->root, f, o, 0, 0 ) +#define CID_Load_Field_Table( p, f, o ) \ + (p)->root.funcs.load_field_table( &(p)->root, f, o, 0, 0 ) + + +#ifdef __cplusplus + } +#endif + + +#endif /* CIDPARSE_H */ + + +/* END */ Index: xc/extras/freetype2/src/cid/cidriver.c diff -u /dev/null xc/extras/freetype2/src/cid/cidriver.c:1.1.1.1 --- /dev/null Mon Dec 18 14:22:38 2000 +++ xc/extras/freetype2/src/cid/cidriver.c Fri Dec 8 16:26:21 2000 @@ -0,0 +1,260 @@ +/***************************************************************************/ +/* */ +/* cidriver.c */ +/* */ +/* CID driver interface (body). */ +/* */ +/* Copyright 1996-2000 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifdef FT_FLAT_COMPILE + +#include "cidriver.h" +#include "cidgload.h" + +#else + +#include +#include + +#endif + + +#include +#include +#include + +#include /* for strcmp() */ + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an 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 + + + static + FT_Module_Interface CID_Get_Interface( FT_Driver driver, + const FT_String* interface ) + { + FT_UNUSED( driver ); + FT_UNUSED( interface ); + + return 0; + } + + +#if 0 /* unimplemented yet */ + + static + FT_Error cid_Get_Kerning( T1_Face face, + FT_UInt left_glyph, + FT_UInt right_glyph, + FT_Vector* kerning ) + { + CID_AFM* afm; + + + kerning->x = 0; + kerning->y = 0; + + afm = (CID_AFM*)face->afm_data; + if ( afm ) + CID_Get_Kerning( afm, left_glyph, right_glyph, kerning ); + + return T1_Err_Ok; + } + + +#endif /* 0 */ + + + /*************************************************************************/ + /* */ + /* */ + /* Cid_Get_Char_Index */ + /* */ + /* */ + /* Uses a charmap to return a given character code's glyph index. */ + /* */ + /* */ + /* charmap :: A handle to the source charmap object. */ + /* */ + /* charcode :: The character code. */ + /* */ + /* */ + /* Glyph index. 0 means `undefined character code'. */ + /* */ + static + FT_UInt CID_Get_Char_Index( FT_CharMap charmap, + FT_Long charcode ) + { + T1_Face face; + FT_UInt result = 0; + PSNames_Interface* psnames; + + + face = (T1_Face)charmap->face; + psnames = (PSNames_Interface*)face->psnames; + if ( psnames ) + switch ( charmap->encoding ) + { + /*******************************************************************/ + /* */ + /* Unicode encoding support */ + /* */ + case ft_encoding_unicode: + /* use the `PSNames' module to synthetize the Unicode charmap */ + result = psnames->lookup_unicode( &face->unicode_map, + (FT_ULong)charcode ); + + /* the function returns 0xFFFF if the Unicode charcode has */ + /* no corresponding glyph. */ + if ( result == 0xFFFF ) + result = 0; + goto Exit; + + /*******************************************************************/ + /* */ + /* Custom Type 1 encoding */ + /* */ + case ft_encoding_adobe_custom: + { + T1_Encoding* encoding = &face->type1.encoding; + + + if ( charcode >= encoding->code_first && + charcode <= encoding->code_last ) + result = encoding->char_index[charcode]; + goto Exit; + } + + /*******************************************************************/ + /* */ + /* Adobe Standard & Expert encoding support */ + /* */ + default: + if ( charcode < 256 ) + { + FT_UInt code; + FT_Int n; + const char* glyph_name; + + + code = psnames->adobe_std_encoding[charcode]; + if ( charmap->encoding == ft_encoding_adobe_expert ) + code = psnames->adobe_expert_encoding[charcode]; + + glyph_name = psnames->adobe_std_strings( code ); + if ( !glyph_name ) + break; + + for ( n = 0; n < face->type1.num_glyphs; n++ ) + { + const char* gname = face->type1.glyph_names[n]; + + + if ( gname && gname[0] == glyph_name[0] && + strcmp( gname, glyph_name ) == 0 ) + { + result = n; + break; + } + } + } + } + + Exit: + return result; + } + + + FT_CALLBACK_TABLE_DEF + const FT_Driver_Class t1cid_driver_class = + { + /* first of all, the FT_Module_Class fields */ + { + ft_module_font_driver | ft_module_driver_scalable, + sizeof( FT_DriverRec ), + "t1cid", /* module name */ + 0x10000L, /* version 1.0 of driver */ + 0x20000L, /* requires FreeType 2.0 */ + + 0, + + (FT_Module_Constructor)CID_Init_Driver, + (FT_Module_Destructor) CID_Done_Driver, + (FT_Module_Requester) CID_Get_Interface + }, + + /* then the other font drivers fields */ + sizeof( CID_FaceRec ), + sizeof( CID_SizeRec ), + sizeof( CID_GlyphSlotRec ), + + (FTDriver_initFace) CID_Init_Face, + (FTDriver_doneFace) CID_Done_Face, + + (FTDriver_initSize) 0, + (FTDriver_doneSize) 0, + (FTDriver_initGlyphSlot)0, + (FTDriver_doneGlyphSlot)0, + + (FTDriver_setCharSizes) 0, + (FTDriver_setPixelSizes)0, + + (FTDriver_loadGlyph) CID_Load_Glyph, + (FTDriver_getCharIndex) CID_Get_Char_Index, + + (FTDriver_getKerning) 0, + (FTDriver_attachFile) 0, + + (FTDriver_getAdvances) 0 + }; + + +#ifdef FT_CONFIG_OPTION_DYNAMIC_DRIVERS + + + /*************************************************************************/ + /* */ + /* */ + /* getDriverClass */ + /* */ + /* */ + /* This function is used when compiling the TrueType driver as a */ + /* shared library (`.DLL' or `.so'). It will be used by the */ + /* high-level library of FreeType to retrieve the address of the */ + /* driver's generic interface. */ + /* */ + /* It shouldn't be implemented in a static build, as each driver must */ + /* have the same function as an exported entry point. */ + /* */ + /* */ + /* The address of the TrueType's driver generic interface. The */ + /* format-specific interface can then be retrieved through the method */ + /* interface->get_format_interface. */ + /* */ + FT_EXPORT_DEF( const FT_Driver_Class* ) getDriverClass( void ) + { + return &t1cid_driver_class; + } + + +#endif /* CONFIG_OPTION_DYNAMIC_DRIVERS */ + + +/* END */ Index: xc/extras/freetype2/src/cid/cidriver.h diff -u /dev/null xc/extras/freetype2/src/cid/cidriver.h:1.1.1.1 --- /dev/null Mon Dec 18 14:22:38 2000 +++ xc/extras/freetype2/src/cid/cidriver.h Fri Dec 8 16:26:21 2000 @@ -0,0 +1,40 @@ +/***************************************************************************/ +/* */ +/* cidriver.h */ +/* */ +/* High-level CID driver interface (specification). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#ifndef CIDRIVER_H +#define CIDRIVER_H + +#include + +#ifdef __cplusplus + extern "C" { +#endif + + + FT_CALLBACK_TABLE + const FT_Driver_Class t1cid_driver_class; + +#ifdef __cplusplus + } +#endif + + +#endif /* CIDRIVER_H */ + + +/* END */ Index: xc/extras/freetype2/src/cid/cidtokens.h diff -u /dev/null xc/extras/freetype2/src/cid/cidtokens.h:1.1.1.1 --- /dev/null Mon Dec 18 14:22:38 2000 +++ xc/extras/freetype2/src/cid/cidtokens.h Fri Dec 8 16:26:21 2000 @@ -0,0 +1,96 @@ +/***************************************************************************/ +/* */ +/* cidtokens.h */ +/* */ +/* CID token definitions (specification only). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#undef FT_STRUCTURE +#define FT_STRUCTURE CID_Info +#undef T1CODE +#define T1CODE t1_field_cid_info + + T1_FIELD_STRING( "CIDFontName", cid_font_name ) + T1_FIELD_NUM ( "CIDFontVersion", cid_version ) + T1_FIELD_NUM ( "CIDFontType", cid_font_type ) + T1_FIELD_STRING( "Registry", registry ) + T1_FIELD_STRING( "Ordering", ordering ) + T1_FIELD_NUM ( "Supplement", supplement ) + T1_FIELD_NUM ( "UIDBase", uid_base ) + T1_FIELD_NUM ( "CIDMapOffset", cidmap_offset ) + T1_FIELD_NUM ( "FDBytes", fd_bytes ) + T1_FIELD_NUM ( "GDBytes", gd_bytes ) + T1_FIELD_NUM ( "CIDCount", cid_count ) + + +#undef FT_STRUCTURE +#define FT_STRUCTURE T1_FontInfo +#undef T1CODE +#define T1CODE t1_field_font_info + + T1_FIELD_STRING( "version", version ) + T1_FIELD_STRING( "Notice", notice ) + T1_FIELD_STRING( "FullName", full_name ) + T1_FIELD_STRING( "FamilyName", family_name ) + T1_FIELD_STRING( "Weight", weight ) + T1_FIELD_FIXED ( "ItalicAngle", italic_angle ) + T1_FIELD_BOOL ( "isFixedPitch", is_fixed_pitch ) + T1_FIELD_NUM ( "UnderlinePosition", underline_position ) + T1_FIELD_NUM ( "UnderlineThickness", underline_thickness ) + + +#undef FT_STRUCTURE +#define FT_STRUCTURE CID_FontDict +#undef T1CODE +#define T1CODE t1_field_font_dict + + T1_FIELD_NUM ( "PaintType", paint_type ) + T1_FIELD_NUM ( "FontType", font_type ) + T1_FIELD_NUM ( "SubrMapOffset", subrmap_offset ) + T1_FIELD_NUM ( "SDBytes", sd_bytes ) + T1_FIELD_NUM ( "SubrCount", num_subrs ) + T1_FIELD_NUM ( "lenBuildCharArray", len_buildchar ) + T1_FIELD_FIXED( "ForceBoldThreshold", forcebold_threshold ) + T1_FIELD_FIXED( "ExpansionFactor", expansion_factor ) + T1_FIELD_NUM ( "StrokeWidth", stroke_width ) + + +#undef FT_STRUCTURE +#define FT_STRUCTURE T1_Private +#undef T1CODE +#define T1CODE t1_field_private + + T1_FIELD_NUM ( "UniqueID", unique_id ) + T1_FIELD_NUM ( "lenIV", lenIV ) + T1_FIELD_NUM ( "LanguageGroup", language_group ) + T1_FIELD_NUM ( "password", password ) + + T1_FIELD_FIXED ( "BlueScale", blue_scale ) + T1_FIELD_NUM ( "BlueShift", blue_shift ) + T1_FIELD_NUM ( "BlueFuzz", blue_fuzz ) + + T1_FIELD_NUM_TABLE ( "BlueValues", blue_values, 14 ) + T1_FIELD_NUM_TABLE ( "OtherBlues", other_blues, 10 ) + T1_FIELD_NUM_TABLE ( "FamilyBlues", family_blues, 14 ) + T1_FIELD_NUM_TABLE ( "FamilyOtherBlues", family_other_blues, 10 ) + + T1_FIELD_NUM_TABLE2( "StdHW", standard_width, 1 ) + T1_FIELD_NUM_TABLE2( "StdVW", standard_height, 1 ) + T1_FIELD_NUM_TABLE2( "MinFeature", min_feature, 2 ) + + T1_FIELD_NUM_TABLE ( "StemSnapH", snap_widths, 12 ) + T1_FIELD_NUM_TABLE ( "StemSnapV", snap_heights, 12 ) + + +/* END */ Index: xc/extras/freetype2/src/cid/module.mk diff -u /dev/null xc/extras/freetype2/src/cid/module.mk:1.1.1.1 --- /dev/null Mon Dec 18 14:22:38 2000 +++ xc/extras/freetype2/src/cid/module.mk Fri Dec 8 16:26:21 2000 @@ -0,0 +1,21 @@ +# +# FreeType 2 CID module definition +# + + +# 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. + + +make_module_list: add_type1cid_driver + +add_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) +# EOF Index: xc/extras/freetype2/src/cid/rules.mk diff -u /dev/null xc/extras/freetype2/src/cid/rules.mk:1.1.1.1 --- /dev/null Mon Dec 18 14:22:38 2000 +++ xc/extras/freetype2/src/cid/rules.mk Fri Dec 8 16:26:21 2000 @@ -0,0 +1,69 @@ +# +# FreeType 2 CID driver configuration rules +# + + +# 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. + + +# CID driver directory +# +CID_DIR := $(SRC_)cid +CID_DIR_ := $(CID_DIR)$(SEP) + + +CID_COMPILE := $(FT_COMPILE) + + +# 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_)cidtokens.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_)%.$O) +CID_DRV_OBJ_S := $(OBJ_)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$@ $(CID_DRV_SRC_S) + + +# CID driver - multiple objects +# +$(OBJ_)%.$O: $(CID_DIR_)%.c $(FREETYPE_H) $(CID_DRV_H) + $(CID_COMPILE) $T$@ $< + + +# update main driver object lists +# +DRV_OBJS_S += $(CID_DRV_OBJ_S) +DRV_OBJS_M += $(CID_DRV_OBJ_M) + +# EOF Index: xc/extras/freetype2/src/cid/type1cid.c diff -u /dev/null xc/extras/freetype2/src/cid/type1cid.c:1.1.1.1 --- /dev/null Mon Dec 18 14:22:38 2000 +++ xc/extras/freetype2/src/cid/type1cid.c Fri Dec 8 16:26:21 2000 @@ -0,0 +1,40 @@ +/***************************************************************************/ +/* */ +/* cff.c */ +/* */ +/* FreeType OpenType driver component (body only). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#define FT_MAKE_OPTION_SINGLE_OBJECT + +#ifdef FT_FLAT_COMPILE + +#include "cidparse.c" +#include "cidload.c" +#include "cidobjs.c" +#include "cidriver.c" +#include "cidgload.c" + +#else + +#include +#include +#include +#include +#include + +#endif + + +/* END */ Index: xc/extras/freetype2/src/psaux/module.mk diff -u /dev/null xc/extras/freetype2/src/psaux/module.mk:1.1.1.1 --- /dev/null Mon Dec 18 14:22:38 2000 +++ xc/extras/freetype2/src/psaux/module.mk Fri Dec 8 16:26:22 2000 @@ -0,0 +1,22 @@ +# +# FreeType 2 PSaux module definition +# + + +# 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. + + +make_module_list: add_psaux_module + +add_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) + +# EOF Index: xc/extras/freetype2/src/psaux/psaux.c diff -u /dev/null xc/extras/freetype2/src/psaux/psaux.c:1.1.1.1 --- /dev/null Mon Dec 18 14:22:38 2000 +++ xc/extras/freetype2/src/psaux/psaux.c Fri Dec 8 16:26:22 2000 @@ -0,0 +1,36 @@ +/***************************************************************************/ +/* */ +/* psaux.c */ +/* */ +/* FreeType auxiliary PostScript driver component (body only). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#define FT_MAKE_OPTION_SINGLE_OBJECT + +#ifdef FT_FLAT_COMPILE + +#include "psobjs.c" +#include "psauxmod.c" +#include "t1decode.c" + +#else + +#include +#include +#include + +#endif + + +/* END */ Index: xc/extras/freetype2/src/psaux/psauxmod.c diff -u /dev/null xc/extras/freetype2/src/psaux/psauxmod.c:1.1.1.1 --- /dev/null Mon Dec 18 14:22:38 2000 +++ xc/extras/freetype2/src/psaux/psauxmod.c Fri Dec 8 16:26:22 2000 @@ -0,0 +1,104 @@ +/***************************************************************************/ +/* */ +/* psauxmod.c */ +/* */ +/* FreeType auxiliary PostScript module implementation (body). */ +/* */ +/* Copyright 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 +#include +#include + + + FT_CALLBACK_TABLE_DEF + const PS_Table_Funcs ps_table_funcs = + { + PS_Table_New, + PS_Table_Done, + PS_Table_Add, + PS_Table_Release + }; + + + FT_CALLBACK_TABLE_DEF + const T1_Parser_Funcs t1_parser_funcs = + { + T1_Init_Parser, + T1_Done_Parser, + T1_Skip_Spaces, + T1_Skip_Alpha, + T1_ToInt, + T1_ToFixed, + T1_ToCoordArray, + T1_ToFixedArray, + T1_ToToken, + T1_ToTokenArray, + T1_Load_Field, + T1_Load_Field_Table + }; + + + FT_CALLBACK_TABLE_DEF + const T1_Builder_Funcs 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_Funcs t1_decoder_funcs = + { + T1_Decoder_Init, + T1_Decoder_Done, + T1_Decoder_Parse_Charstrings + }; + + + static + const PSAux_Interface psaux_interface = + { + &ps_table_funcs, + &t1_parser_funcs, + &t1_builder_funcs, + &t1_decoder_funcs, + + T1_Decrypt + }; + + + FT_CALLBACK_TABLE_DEF + const FT_Module_Class psaux_module_class = + { + 0, + sizeof( FT_ModuleRec ), + "psaux", + 0x10000L, + 0x20000L, + + &psaux_interface, /* module-specific interface */ + + (FT_Module_Constructor)0, + (FT_Module_Destructor) 0, + (FT_Module_Requester) 0 + }; + + +/* END */ Index: xc/extras/freetype2/src/psaux/psauxmod.h diff -u /dev/null xc/extras/freetype2/src/psaux/psauxmod.h:1.1.1.1 --- /dev/null Mon Dec 18 14:22:38 2000 +++ xc/extras/freetype2/src/psaux/psauxmod.h Fri Dec 8 16:26:22 2000 @@ -0,0 +1,37 @@ +/***************************************************************************/ +/* */ +/* psauxmod.h */ +/* */ +/* FreeType auxiliary PostScript module implementation (specification). */ +/* */ +/* Copyright 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. */ +/* */ +/***************************************************************************/ + + +#ifndef PSAUXMOD_H +#define PSAUXMOD_H + +#include + +#ifdef __cplusplus + extern "C" { +#endif + + FT_EXPORT_VAR( const FT_Module_Class ) psaux_driver_class; + +#ifdef __cplusplus + } +#endif + +#endif /* PSAUXMOD_H */ + + +/* END */ Index: xc/extras/freetype2/src/psaux/psobjs.c diff -u /dev/null xc/extras/freetype2/src/psaux/psobjs.c:1.1.1.1 --- /dev/null Mon Dec 18 14:22:38 2000 +++ xc/extras/freetype2/src/psaux/psobjs.c Fri Dec 8 16:26:22 2000 @@ -0,0 +1,1296 @@ +/***************************************************************************/ +/* */ +/* psobjs.c */ +/* */ +/* Auxiliary functions for PostScript fonts (body). */ +/* */ +/* 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 +#include +#include + +#ifdef FT_FLAT_COMPILE + +#include "psobjs.h" + +#else + +#include + +#endif + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** PS_TABLE *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /*************************************************************************/ + /* */ + /* */ + /* PS_Table_New */ + /* */ + /* */ + /* Initializes a PS_Table. */ + /* */ + /* */ + /* table :: The address of the target table. */ + /* */ + /* */ + /* count :: The table size = the maximum number of elements. */ + /* */ + /* memory :: The memory object to use for all subsequent */ + /* reallocations. */ + /* */ + /* */ + /* 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 ( ALLOC_ARRAY( table->elements, count, FT_Byte* ) || + ALLOC_ARRAY( table->lengths, count, FT_Byte* ) ) + goto Exit; + + table->max_elems = count; + table->init = 0xDEADBEEFUL; + table->num_elems = 0; + table->block = 0; + table->capacity = 0; + table->cursor = 0; + table->funcs = ps_table_funcs; + + Exit: + if ( error ) + FREE( table->elements ); + + return error; + } + + + static + void shift_elements( PS_Table* table, + FT_Byte* old_base ) + { + FT_Long delta = table->block - old_base; + FT_Byte** offset = table->elements; + FT_Byte** limit = offset + table->max_elems; + + + if ( delta ) + for ( ; offset < limit; offset++ ) + { + if ( offset[0] ) + offset[0] += delta; + } + } + + + static + FT_Error reallocate_t1_table( PS_Table* table, + FT_Int new_size ) + { + FT_Memory memory = table->memory; + FT_Byte* old_base = table->block; + FT_Error error; + + + /* reallocate the base block */ + if ( REALLOC( table->block, table->capacity, new_size ) ) + return error; + + table->capacity = new_size; + + /* shift all offsets if necessary */ + if ( old_base ) + shift_elements( table, old_base ); + + return FT_Err_Ok; + } + + + /*************************************************************************/ + /* */ + /* */ + /* PS_Table_Add */ + /* */ + /* */ + /* Adds an object to a PS_Table, possibly growing its memory block. */ + /* */ + /* */ + /* table :: The target table. */ + /* */ + /* */ + /* index :: 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. */ + /* */ + /* */ + /* 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 index, + void* object, + FT_Int length ) + { + if ( index < 0 || index > table->max_elems ) + { + FT_ERROR(( "PS_Table_Add: invalid index\n" )); + return FT_Err_Invalid_Argument; + } + + /* grow the base block if needed */ + if ( table->cursor + length > table->capacity ) + { + FT_Error error; + FT_Int new_size = table->capacity; + + + while ( new_size < table->cursor + length ) + new_size += 1024; + + error = reallocate_t1_table( table, new_size ); + if ( error ) + return error; + } + + /* add the object to the base block and adjust offset */ + table->elements[index] = table->block + table->cursor; + table->lengths [index] = length; + MEM_Copy( table->block + table->cursor, object, length ); + + table->cursor += length; + return FT_Err_Ok; + } + + + /*************************************************************************/ + /* */ + /* */ + /* PS_Table_Done */ + /* */ + /* */ + /* Finalizes a PS_Table (i.e., reallocate it to its current cursor). */ + /* */ + /* */ + /* table :: The target table. */ + /* */ + /* */ + /* 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; + + + /* should never fail, because rec.cursor <= rec.size */ + old_base = table->block; + if ( !old_base ) + return; + + if ( REALLOC( table->block, table->capacity, table->cursor ) ) + return; + table->capacity = table->cursor; + + if ( old_base != table->block ) + shift_elements( table, old_base ); + } + + + FT_LOCAL_DEF + void PS_Table_Release( PS_Table* table ) + { + FT_Memory memory = table->memory; + + + if ( (FT_ULong)table->init == 0xDEADBEEFUL ) + { + FREE( table->block ); + FREE( table->elements ); + FREE( table->lengths ); + table->init = 0; + } + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** T1 PARSER *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + +#define IS_T1_WHITESPACE( c ) ( (c) == ' ' || (c) == '\t' ) +#define IS_T1_LINESPACE( c ) ( (c) == '\r' || (c) == '\n' ) + +#define IS_T1_SPACE( c ) ( IS_T1_WHITESPACE( c ) || IS_T1_LINESPACE( c ) ) + + + FT_LOCAL_DEF + void T1_Skip_Spaces( T1_Parser* parser ) + { + FT_Byte* cur = parser->cursor; + FT_Byte* limit = parser->limit; + + + while ( cur < limit ) + { + FT_Byte c = *cur; + + + if ( !IS_T1_SPACE( c ) ) + break; + cur++; + } + parser->cursor = cur; + } + + + FT_LOCAL_DEF + void T1_Skip_Alpha( T1_Parser* parser ) + { + FT_Byte* cur = parser->cursor; + FT_Byte* limit = parser->limit; + + + while ( cur < limit ) + { + FT_Byte c = *cur; + + + if ( IS_T1_SPACE( c ) ) + break; + cur++; + } + parser->cursor = cur; + } + + + FT_LOCAL_DEF + void T1_ToToken( T1_Parser* parser, + T1_Token* token ) + { + FT_Byte* cur; + FT_Byte* limit; + FT_Byte starter, ender; + FT_Int embed; + + + token->type = t1_token_none; + token->start = 0; + token->limit = 0; + + /* first of all, skip space */ + T1_Skip_Spaces( parser ); + + cur = parser->cursor; + limit = parser->limit; + + if ( cur < limit ) + { + switch ( *cur ) + { + /************* check for strings ***********************/ + case '(': + token->type = t1_token_string; + ender = ')'; + goto Lookup_Ender; + + /************* check for programs/array ****************/ + case '{': + token->type = t1_token_array; + ender = '}'; + goto Lookup_Ender; + + /************* check for table/array ******************/ + case '[': + token->type = t1_token_array; + ender = ']'; + + Lookup_Ender: + embed = 1; + starter = *cur++; + token->start = cur; + while ( cur < limit ) + { + if ( *cur == starter ) + embed++; + else if ( *cur == ender ) + { + embed--; + if ( embed <= 0 ) + { + token->limit = cur++; + break; + } + } + cur++; + } + break; + + /* **************** otherwise, it's any token **********/ + default: + token->start = cur++; + token->type = t1_token_any; + while ( cur < limit && !IS_T1_SPACE( *cur ) ) + cur++; + + token->limit = cur; + } + + if ( !token->limit ) + { + token->start = 0; + token->type = t1_token_none; + } + + parser->cursor = cur; + } + } + + + FT_LOCAL_DEF + void T1_ToTokenArray( T1_Parser* parser, + T1_Token* tokens, + FT_UInt max_tokens, + FT_Int* pnum_tokens ) + { + T1_Token master; + + + *pnum_tokens = -1; + + T1_ToToken( parser, &master ); + if ( master.type == t1_token_array ) + { + FT_Byte* old_cursor = parser->cursor; + FT_Byte* old_limit = parser->limit; + T1_Token* cur = tokens; + T1_Token* limit = cur + max_tokens; + + + parser->cursor = master.start; + parser->limit = master.limit; + + while ( parser->cursor < parser->limit ) + { + T1_Token token; + + + T1_ToToken( parser, &token ); + if ( !token.type ) + break; + + if ( cur < limit ) + *cur = token; + + cur++; + } + + *pnum_tokens = cur - tokens; + + parser->cursor = old_cursor; + parser->limit = old_limit; + } + } + + + static + FT_Long t1_toint( FT_Byte** cursor, + FT_Byte* limit ) + { + FT_Long result = 0; + FT_Byte* cur = *cursor; + FT_Byte c = '\0', d; + + + for ( ; cur < limit; cur++ ) + { + c = *cur; + d = (FT_Byte)( c - '0' ); + if ( d < 10 ) + break; + + if ( c == '-' ) + { + cur++; + break; + } + } + + if ( cur < limit ) + { + do + { + d = (FT_Byte)( cur[0] - '0' ); + if ( d >= 10 ) + break; + + result = result * 10 + d; + cur++; + + } while ( cur < limit ); + + if ( c == '-' ) + result = -result; + } + + *cursor = cur; + return result; + } + + + static + FT_Long t1_tofixed( FT_Byte** cursor, + FT_Byte* limit, + FT_Long power_ten ) + { + FT_Byte* cur = *cursor; + FT_Long num, divider, result; + FT_Int sign = 0; + FT_Byte d; + + + if ( cur >= limit ) + return 0; + + /* first of all, check the sign */ + if ( *cur == '-' ) + { + sign = 1; + cur++; + } + + /* then, read the integer part, if any */ + if ( *cur != '.' ) + result = t1_toint( &cur, limit ) << 16; + else + result = 0; + + num = 0; + divider = 1; + + if ( cur >= limit ) + goto Exit; + + /* read decimal part, if any */ + if ( *cur == '.' && cur + 1 < limit ) + { + cur++; + + for (;;) + { + d = (FT_Byte)( *cur - '0' ); + if ( d >= 10 ) + break; + + if ( divider < 10000000L ) + { + num = num * 10 + d; + divider *= 10; + } + + cur++; + if ( cur >= limit ) + break; + } + } + + /* read exponent, if any */ + if ( cur + 1 < limit && ( *cur == 'e' || *cur == 'E' ) ) + { + cur++; + power_ten += t1_toint( &cur, limit ); + } + + Exit: + /* 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++; + } + + if ( num ) + result += FT_DivFix( num, divider ); + + if ( sign ) + result = -result; + + *cursor = cur; + return result; + } + + + static + FT_Int t1_tocoordarray( FT_Byte** cursor, + FT_Byte* limit, + FT_Int max_coords, + FT_Short* coords ) + { + FT_Byte* cur = *cursor; + FT_Int count = 0; + FT_Byte c, ender; + + + if ( cur >= limit ) + goto Exit; + + /* check for the beginning of an array; if not, only one number will */ + /* be read */ + c = *cur; + ender = 0; + + if ( c == '[' ) + ender = ']'; + + if ( c == '{' ) + ender = '}'; + + if ( ender ) + cur++; + + /* now, read the coordinates */ + for ( ; cur < limit; ) + { + /* skip whitespace in front of data */ + for (;;) + { + c = *cur; + if ( c != ' ' && c != '\t' ) + break; + + cur++; + if ( cur >= limit ) + goto Exit; + } + + if ( count >= max_coords || c == ender ) + break; + + coords[count] = (FT_Short)( t1_tofixed( &cur, limit, 0 ) >> 16 ); + count++; + + if ( !ender ) + break; + } + + Exit: + *cursor = cur; + return count; + } + + + static + FT_Int t1_tofixedarray( FT_Byte** cursor, + FT_Byte* limit, + FT_Int max_values, + FT_Fixed* values, + FT_Int power_ten ) + { + FT_Byte* cur = *cursor; + FT_Int count = 0; + FT_Byte c, ender; + + + if ( cur >= limit ) goto Exit; + + /* check for the beginning of an array. If not, only one number will */ + /* be read */ + c = *cur; + ender = 0; + + if ( c == '[' ) + ender = ']'; + + if ( c == '{' ) + ender = '}'; + + if ( ender ) + cur++; + + /* now, read the values */ + for ( ; cur < limit; ) + { + /* skip whitespace in front of data */ + for (;;) + { + c = *cur; + if ( c != ' ' && c != '\t' ) + break; + + cur++; + if ( cur >= limit ) + goto Exit; + } + + if ( count >= max_values || c == ender ) + break; + + values[count] = t1_tofixed( &cur, limit, power_ten ); + count++; + + if ( !ender ) + break; + } + + Exit: + *cursor = cur; + return count; + } + + +#if 0 + + static + FT_String* t1_tostring( FT_Byte** cursor, + FT_Byte* limit, + FT_Memory memory ) + { + FT_Byte* cur = *cursor; + FT_Int 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 || ALLOC( result, len + 1 ) ) + return 0; + + /* now copy the string */ + MEM_Copy( result, *cursor, len ); + result[len] = '\0'; + *cursor = cur; + return result; + } + +#endif /* 0 */ + + + static + int t1_tobool( FT_Byte** cursor, + FT_Byte* limit ) + { + FT_Byte* cur = *cursor; + 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; + } + + *cursor = cur; + return result; + } + + + /* Load a simple field (i.e. non-table) into the current list of objects */ + FT_LOCAL_DEF + FT_Error T1_Load_Field( T1_Parser* parser, + const T1_Field* field, + void** objects, + FT_UInt max_objects, + FT_ULong* pflags ) + { + T1_Token token; + FT_Byte* cur; + FT_Byte* limit; + FT_UInt count; + FT_UInt index; + FT_Error error; + + + T1_ToToken( parser, &token ); + if ( !token.type ) + goto Fail; + + count = 1; + index = 0; + cur = token.start; + limit = token.limit; + + if ( token.type == t1_token_array ) + { + /* if this is an array, and we have no blend, an error occurs */ + if ( max_objects == 0 ) + goto Fail; + + count = max_objects; + index = 1; + } + + for ( ; count > 0; count--, index++ ) + { + FT_Byte* q = (FT_Byte*)objects[index] + field->offset; + FT_Long val; + FT_String* string; + + + switch ( field->type ) + { + case t1_field_bool: + val = t1_tobool( &cur, limit ); + goto Store_Integer; + + case t1_field_fixed: + val = t1_tofixed( &cur, limit, 3 ); + goto Store_Integer; + + case t1_field_integer: + val = t1_toint( &cur, limit ); + + Store_Integer: + switch ( field->size ) + { + case 1: + *(FT_Byte*)q = (FT_Byte)val; + break; + + case 2: + *(FT_UShort*)q = (FT_UShort)val; + break; + + case 4: + *(FT_UInt32*)q = (FT_UInt32)val; + break; + + default: /* for 64-bit systems */ + *(FT_Long*)q = val; + } + break; + + case t1_field_string: + { + FT_Memory memory = parser->memory; + FT_UInt len = limit-cur; + + + if ( *(FT_String**)q ) + /* with synthetic fonts, it's possible to find a field twice */ + break; + + if ( ALLOC( string, len + 1 ) ) + goto Exit; + + MEM_Copy( string, cur, len ); + string[len] = 0; + + *(FT_String**)q = string; + } + break; + + default: + /* an error occured */ + goto Fail; + } + } + +#if 0 /* obsolete - keep for reference */ + if ( pflags ) + *pflags |= 1L << field->flag_bit; +#else + FT_UNUSED( pflags ); +#endif + + error = FT_Err_Ok; + + Exit: + return error; + + Fail: + error = FT_Err_Invalid_File_Format; + goto Exit; + } + + +#define T1_MAX_TABLE_ELEMENTS 32 + + + FT_LOCAL_DEF + FT_Error T1_Load_Field_Table( T1_Parser* parser, + const T1_Field* field, + void** objects, + FT_UInt max_objects, + FT_ULong* pflags ) + { + T1_Token elements[T1_MAX_TABLE_ELEMENTS]; + T1_Token* token; + FT_Int num_elements; + FT_Error error = 0; + FT_Byte* old_cursor; + FT_Byte* old_limit; + T1_Field fieldrec = *(T1_Field*)field; + +#if 1 + fieldrec.type = t1_field_integer; + if ( field->type == t1_field_fixed_array ) + fieldrec.type = t1_field_fixed; +#endif + + T1_ToTokenArray( parser, elements, 32, &num_elements ); + if ( num_elements < 0 ) + goto Fail; + + if ( num_elements > T1_MAX_TABLE_ELEMENTS ) + num_elements = T1_MAX_TABLE_ELEMENTS; + + old_cursor = parser->cursor; + old_limit = parser->limit; + + /* we store the elements count */ + *(FT_Byte*)( (FT_Byte*)objects[0] + field->count_offset ) = 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; + T1_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; + + Fail: + error = FT_Err_Invalid_File_Format; + goto Exit; + } + + + FT_LOCAL_DEF + FT_Long T1_ToInt( T1_Parser* parser ) + { + return t1_toint( &parser->cursor, parser->limit ); + } + + + FT_LOCAL_DEF + FT_Fixed T1_ToFixed( T1_Parser* parser, + FT_Int power_ten ) + { + return t1_tofixed( &parser->cursor, parser->limit, power_ten ); + } + + + FT_LOCAL_DEF + FT_Int T1_ToCoordArray( T1_Parser* parser, + FT_Int max_coords, + FT_Short* coords ) + { + return t1_tocoordarray( &parser->cursor, parser->limit, + max_coords, coords ); + } + + + FT_LOCAL_DEF + FT_Int T1_ToFixedArray( T1_Parser* parser, + FT_Int max_values, + FT_Fixed* values, + FT_Int power_ten ) + { + return t1_tofixedarray( &parser->cursor, parser->limit, + max_values, values, power_ten ); + } + + +#if 0 + + FT_LOCAL_DEF + FT_String* T1_ToString( T1_Parser* parser ) + { + return t1_tostring( &parser->cursor, parser->limit, parser->memory ); + } + + + FT_LOCAL_DEF + FT_Bool T1_ToBool( T1_Parser* parser ) + { + return t1_tobool( &parser->cursor, parser->limit ); + } + +#endif /* 0 */ + + + FT_LOCAL_DEF + void T1_Init_Parser( T1_Parser* parser, + FT_Byte* base, + FT_Byte* limit, + FT_Memory memory ) + { + parser->error = 0; + parser->base = base; + parser->limit = limit; + parser->cursor = base; + parser->memory = memory; + parser->funcs = t1_parser_funcs; + } + + + FT_LOCAL_DEF + void T1_Done_Parser( T1_Parser* parser ) + { + FT_UNUSED( parser ); + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** T1 BUILDER *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /*************************************************************************/ + /* */ + /* */ + /* T1_Builder_Init */ + /* */ + /* */ + /* Initializes a given glyph builder. */ + /* */ + /* */ + /* builder :: A pointer to the glyph builder to initialize. */ + /* */ + /* */ + /* face :: The current face object. */ + /* */ + /* size :: The current size object. */ + /* */ + /* glyph :: The current glyph object. */ + /* */ + FT_LOCAL_DEF + void T1_Builder_Init( T1_Builder* builder, + FT_Face face, + FT_Size size, + FT_GlyphSlot glyph ) + { + builder->path_begun = 0; + 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 ); + } + + 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; + } + + + /*************************************************************************/ + /* */ + /* */ + /* T1_Builder_Done */ + /* */ + /* */ + /* 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. */ + /* */ + /* */ + /* 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 room 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 = 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 room 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 FT_Err_Ok; + } + + error = FT_GlyphLoader_Check_Points( builder->loader, 0, 1 ); + if ( !error ) + { + if ( outline->n_contours > 0 ) + outline->contours[outline->n_contours - 1] = 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 = 0; + + + /* test whether we are building a new contour */ + if ( !builder->path_begun ) + { + builder->path_begun = 1; + 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; + + + /* 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] = outline->n_points - 1; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** OTHER *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL_DEF + void T1_Decrypt( FT_Byte* buffer, + FT_Int length, + FT_UShort seed ) + { + while ( length > 0 ) + { + FT_Byte plain; + + + plain = ( *buffer ^ ( seed >> 8 ) ); + seed = ( *buffer + seed ) * 52845 + 22719; + *buffer++ = plain; + length--; + } + } + + +/* END */ Index: xc/extras/freetype2/src/psaux/psobjs.h diff -u /dev/null xc/extras/freetype2/src/psaux/psobjs.h:1.1.1.1 --- /dev/null Mon Dec 18 14:22:38 2000 +++ xc/extras/freetype2/src/psaux/psobjs.h Fri Dec 8 16:26:22 2000 @@ -0,0 +1,206 @@ +/***************************************************************************/ +/* */ +/* psobjs.h */ +/* */ +/* Auxiliary functions for PostScript fonts (specification). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#ifndef PSOBJS_H +#define PSOBJS_H + +#include + + +#ifdef __cplusplus + extern "C" { +#endif + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** T1_TABLE *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + FT_CALLBACK_TABLE + const PS_Table_Funcs ps_table_funcs; + + FT_CALLBACK_TABLE + const T1_Parser_Funcs t1_parser_funcs; + + FT_CALLBACK_TABLE + const T1_Builder_Funcs 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 index, + void* object, + FT_Int length ); + + FT_LOCAL + void PS_Table_Done( PS_Table* table ); + + + FT_LOCAL + void PS_Table_Release( PS_Table* table ); + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** T1 PARSER *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + FT_LOCAL + void T1_Skip_Spaces( T1_Parser* parser ); + + FT_LOCAL + void T1_Skip_Alpha( T1_Parser* parser ); + + FT_LOCAL + void T1_ToToken( T1_Parser* parser, + T1_Token* token ); + + FT_LOCAL + void T1_ToTokenArray( T1_Parser* parser, + T1_Token* tokens, + FT_UInt max_tokens, + FT_Int* pnum_tokens ); + + FT_LOCAL + FT_Error T1_Load_Field( T1_Parser* parser, + const T1_Field* field, + void** objects, + FT_UInt max_objects, + FT_ULong* pflags ); + + FT_LOCAL + FT_Error T1_Load_Field_Table( T1_Parser* parser, + const T1_Field* field, + void** objects, + FT_UInt max_objects, + FT_ULong* pflags ); + + FT_LOCAL + FT_Long T1_ToInt( T1_Parser* parser ); + + + FT_LOCAL + FT_Fixed T1_ToFixed( T1_Parser* parser, + FT_Int power_ten ); + + + FT_LOCAL + FT_Int T1_ToCoordArray( T1_Parser* parser, + FT_Int max_coords, + FT_Short* coords ); + + FT_LOCAL + FT_Int T1_ToFixedArray( T1_Parser* parser, + FT_Int max_values, + FT_Fixed* values, + FT_Int power_ten ); + + + FT_LOCAL + void T1_Init_Parser( T1_Parser* parser, + FT_Byte* base, + FT_Byte* limit, + FT_Memory memory ); + + FT_LOCAL + void T1_Done_Parser( T1_Parser* parser ); + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** T1 BUILDER *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL + void T1_Builder_Init( T1_Builder* builder, + FT_Face face, + FT_Size size, + FT_GlyphSlot glyph ); + + 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_Int length, + FT_UShort seed ); + + +#ifdef __cplusplus + } +#endif + + +#endif /* PSOBJS_H */ + + +/* END */ Index: xc/extras/freetype2/src/psaux/rules.mk diff -u /dev/null xc/extras/freetype2/src/psaux/rules.mk:1.1.1.1 --- /dev/null Mon Dec 18 14:22:38 2000 +++ xc/extras/freetype2/src/psaux/rules.mk Fri Dec 8 16:26:22 2000 @@ -0,0 +1,70 @@ +# +# FreeType 2 PSaux driver configuration rules +# + + +# 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. + + +# PSAUX driver directory +# +PSAUX_DIR := $(SRC_)psaux +PSAUX_DIR_ := $(PSAUX_DIR)$(SEP) + + +# compilation flags for the driver +# +PSAUX_COMPILE := $(FT_COMPILE) + + +# PSAUX driver sources (i.e., C files) +# +PSAUX_DRV_SRC := $(PSAUX_DIR_)psobjs.c \ + $(PSAUX_DIR_)t1decode.c \ + $(PSAUX_DIR_)psauxmod.c + +# PSAUX driver headers +# +PSAUX_DRV_H := $(PSAUX_DRV_SRC:%c=%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_)%.$O) +PSAUX_DRV_OBJ_S := $(OBJ_)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$@ $(PSAUX_DRV_SRC_S) + + +# PSAUX driver - multiple objects +# +$(OBJ_)%.$O: $(PSAUX_DIR_)%.c $(FREETYPE_H) $(PSAUX_DRV_H) + $(PSAUX_COMPILE) $T$@ $< + + +# update main driver object lists +# +DRV_OBJS_S += $(PSAUX_DRV_OBJ_S) +DRV_OBJS_M += $(PSAUX_DRV_OBJ_M) + + +# EOF Index: xc/extras/freetype2/src/psaux/t1decode.c diff -u /dev/null xc/extras/freetype2/src/psaux/t1decode.c:1.1.1.1 --- /dev/null Mon Dec 18 14:22:38 2000 +++ xc/extras/freetype2/src/psaux/t1decode.c Fri Dec 8 16:26:22 2000 @@ -0,0 +1,1076 @@ +/***************************************************************************/ +/* */ +/* t1decode.c */ +/* */ +/* PostScript Type 1 decoding routines (body). */ +/* */ +/* Copyright 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 /* for FT_ERROR() */ +#include +#include +#include + + +#ifdef FT_FLAT_COMPILE + +#include "t1decode.h" +#include "psobjs.h" + +#else + +#include +#include + +#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_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_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 */ + }; + + + /*************************************************************************/ + /* */ + /* */ + /* t1_lookup_glyph_by_stdcharcode */ + /* */ + /* */ + /* Looks up a given glyph by its StandardEncoding charcode. Used to */ + /* implement the SEAC Type 1 operator. */ + /* */ + /* */ + /* face :: The current face object. */ + /* */ + /* charcode :: The character code to look for. */ + /* */ + /* */ + /* 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; + PSNames_Interface* 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 && strcmp( name,glyph_name ) == 0 ) + return n; + } + + return -1; + } + + + /*************************************************************************/ + /* */ + /* */ + /* t1operator_seac */ + /* */ + /* */ + /* Implements the `seac' Type 1 operator for a Type 1 decoder. */ + /* */ + /* */ + /* 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. */ + /* */ + /* */ + /* 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, n_base_points; + FT_Outline* base = decoder->builder.base; + 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 T1_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 T1_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_Check_Subglyphs( 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 = adx - asb; + subg->arg2 = 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; + } + + /* 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; + + n_base_points = base->n_points; + + /* save the left bearing and width of the base character */ + /* as they will be erased by the next load. */ + + left_bearing = decoder->builder.left_bearing; + advance = decoder->builder.advance; + + decoder->builder.left_bearing.x = 0; + decoder->builder.left_bearing.y = 0; + + /* Now load `achar' on top of */ + /* the base outline */ + 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; + + /* Finally, move the accent */ + if ( decoder->builder.load_points ) + { + FT_Outline dummy; + + + dummy.n_points = base->n_points - n_base_points; + dummy.points = base->points + n_base_points; + + FT_Outline_Translate( &dummy, adx - asb, ady ); + } + + Exit: + return error; + } + + + /*************************************************************************/ + /* */ + /* */ + /* T1_Decoder_Parse_Charstrings */ + /* */ + /* */ + /* Parses a given Type 1 charstrings program. */ + /* */ + /* */ + /* 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. */ + /* */ + /* */ + /* 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_Outline* outline; + FT_Pos x, y; + + + /* 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->path_begun = 0; + + zone->base = charstring_base; + limit = zone->limit = charstring_base + charstring_len; + ip = zone->cursor = zone->base; + + error = FT_Err_Ok; + outline = builder->current; + + x = builder->pos_x; + y = builder->pos_y; + + /* now, execute loop */ + while ( ip < limit ) + { + FT_Long* top = decoder->top; + T1_Operator op = op_none; + FT_Long value = 0; + + + /*********************************************************************/ + /* */ + /* 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 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_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_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_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_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_Parse_CharStrings: invalid byte (%d)\n", + ip[-1] )); + goto Syntax_Error; + } + } + + /*********************************************************************/ + /* */ + /* Push value on stack, or process operator */ + /* */ + /* */ + if ( op == op_none ) + { + if ( top - decoder->stack >= T1_MAX_CHARSTRINGS_OPERANDS ) + { + FT_ERROR(( "T1_Parse_CharStrings: stack overflow!\n" )); + goto Syntax_Error; + } + + FT_TRACE4(( " %ld", value )); + + *top++ = value; + decoder->top = top; + } + else if ( op == op_callothersubr ) /* callothersubr */ + { + FT_TRACE4(( " callothersubr" )); + + if ( top - decoder->stack < 2 ) + goto Stack_Underflow; + + top -= 2; + switch ( top[1] ) + { + case 1: /* start flex feature */ + if ( top[0] != 0 ) + goto Unexpected_OtherSubr; + + decoder->flex_state = 1; + decoder->num_flex_vectors = 0; + if ( start_point( builder, x, y ) || + check_points( builder, 6 ) ) + goto Memory_Error; + break; + + case 2: /* add flex vectors */ + { + FT_Int index; + + if ( top[0] != 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 */ + index = decoder->num_flex_vectors++; + if ( index > 0 && index < 7 ) + add_point( builder, + x, + y, + (FT_Byte)( index == 3 || index == 6 ) ); + } + break; + + case 0: /* end flex feature */ + if ( top[0] != 3 ) + goto Unexpected_OtherSubr; + + if ( decoder->flex_state == 0 || + decoder->num_flex_vectors != 7 ) + { + FT_ERROR(( "T1_Parse_CharStrings: unexpected flex end\n" )); + goto Syntax_Error; + } + + /* now consume the remaining `pop pop setcurpoint' */ + if ( ip + 6 > limit || + ip[0] != 12 || ip[1] != 17 || /* pop */ + ip[2] != 12 || ip[3] != 17 || /* pop */ + ip[4] != 12 || ip[5] != 33 ) /* setcurpoint */ + { + FT_ERROR(( "T1_Parse_CharStrings: invalid flex charstring\n" )); + goto Syntax_Error; + } + + ip += 6; + decoder->flex_state = 0; + break; + + case 3: /* change hints */ + if ( top[0] != 1 ) + goto Unexpected_OtherSubr; + + /* eat the following `pop' */ + if ( ip + 2 > limit ) + { + FT_ERROR(( "T1_Parse_CharStrings: invalid escape (12+%d)\n", + ip[-1] )); + goto Syntax_Error; + } + + if ( ip[0] != 12 || ip[1] != 17 ) + { + FT_ERROR(( "T1_Parse_CharStrings:" )); + FT_ERROR(( " `pop' expected, found (%d %d)\n", + ip[0], ip[1] )); + goto Syntax_Error; + } + ip += 2; + 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 */ + { + T1_Blend* blend = decoder->blend; + FT_UInt num_points, nn, mm; + FT_Long* delta; + FT_Long* values; + + + if ( !blend ) + { + FT_ERROR(( "T1_Parse_CharStrings:" )); + FT_ERROR(( " unexpected multiple masters operator!\n" )); + goto Syntax_Error; + } + + num_points = top[1] - 13 + ( top[1] == 18 ); + if ( top[0] != (FT_Int)( num_points * blend->num_designs ) ) + { + FT_ERROR(( "T1_Parse_CharStrings:" )); + FT_ERROR(( " incorrect number of mm arguments\n" )); + goto Syntax_Error; + } + + top -= blend->num_designs*num_points; + if ( top < decoder->stack ) + goto Stack_Underflow; + + /* 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_Int tmp = values[0]; + + + for ( mm = 1; mm < blend->num_designs; mm++ ) + tmp += FT_MulFix( *delta++, blend->weight_vector[mm] ); + + *values++ = tmp; + } + /* note that `top' will be incremented later by calls to `pop' */ + break; + } + + default: + Unexpected_OtherSubr: + FT_ERROR(( "T1_Parse_CharStrings: invalid othersubr [%d %d]!\n", + top[0], top[1] )); + goto Syntax_Error; + } + decoder->top = top; + } + else /* general operator */ + { + FT_Int num_args = t1_args_count[op]; + + + if ( top - decoder->stack < num_args ) + goto Stack_Underflow; + + top -= num_args; + + switch ( op ) + { + case op_endchar: + FT_TRACE4(( " endchar" )); + + close_contour( builder ); + + /* add current outline to the glyph slot */ + FT_GlyphLoader_Add( builder->loader ); + + /* return now! */ + FT_TRACE4(( "\n\n" )); + return FT_Err_Ok; + + case op_hsbw: + FT_TRACE4(( " hsbw" )); + + builder->left_bearing.x += top[0]; + builder->advance.x = top[1]; + builder->advance.y = 0; + + builder->last.x = x = top[0]; + builder->last.y = y = 0; + + /* 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 FT_Err_Ok; + + break; + + case op_seac: + /* return immediately after the processing */ + return t1operator_seac( decoder, top[0], top[1], + top[2], top[3], top[4] ); + + case op_sbw: + FT_TRACE4(( " sbw" )); + + 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 = top[0]; + builder->last.y = 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 FT_Err_Ok; + + break; + + case op_closepath: + FT_TRACE4(( " closepath" )); + + close_contour( builder ); + builder->path_begun = 0; + break; + + case op_hlineto: + FT_TRACE4(( " hlineto" )); + + if ( start_point( builder, x, y ) ) + goto Memory_Error; + + x += top[0]; + goto Add_Line; + + case op_hmoveto: + FT_TRACE4(( " hmoveto" )); + + x += top[0]; + if ( !decoder->flex_state ) + builder->path_begun = 0; + break; + + case op_hvcurveto: + FT_TRACE4(( " hvcurveto" )); + + if ( start_point( builder, x, y ) || + check_points( builder, 3 ) ) + goto Memory_Error; + + 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 Memory_Error; + + x += top[0]; + y += top[1]; + + Add_Line: + if ( add_point1( builder, x, y ) ) + goto Memory_Error; + break; + + case op_rmoveto: + FT_TRACE4(( " rmoveto" )); + + x += top[0]; + y += top[1]; + if ( !decoder->flex_state ) + builder->path_begun = 0; + break; + + case op_rrcurveto: + FT_TRACE4(( " rcurveto" )); + + if ( start_point( builder, x, y ) || + check_points( builder, 3 ) ) + goto Memory_Error; + + 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 Memory_Error; + + 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 Memory_Error; + + y += top[0]; + goto Add_Line; + + case op_vmoveto: + FT_TRACE4(( " vmoveto" )); + + y += top[0]; + if ( !decoder->flex_state ) + builder->path_begun = 0; + break; + + case op_div: + FT_TRACE4(( " div" )); + + if ( top[1] ) + { + *top = top[0] / top[1]; + ++top; + } + else + { + FT_ERROR(( "T1_Parse_CharStrings: division by 0\n" )); + goto Syntax_Error; + } + break; + + case op_callsubr: + { + FT_Int index; + + + FT_TRACE4(( " callsubr" )); + + index = top[0]; + if ( index < 0 || index >= (FT_Int)decoder->num_subrs ) + { + FT_ERROR(( "T1_Parse_CharStrings: invalid subrs index\n" )); + goto Syntax_Error; + } + + if ( zone - decoder->zones >= T1_MAX_SUBRS_CALLS ) + { + FT_ERROR(( "T1_Parse_CharStrings: too many nested subrs\n" )); + goto Syntax_Error; + } + + zone->cursor = ip; /* save current instruction pointer */ + + zone++; + zone->base = decoder->subrs[index] + decoder->lenIV; + + if (decoder->subrs_len) + zone->limit = zone->base + decoder->subrs_len[index]; + else + zone->limit = decoder->subrs[index+1]; + + zone->cursor = zone->base; + + if ( !zone->base ) + { + FT_ERROR(( "T1_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" )); + + /* theoretically, the arguments are already on the stack */ + top++; + break; + + case op_return: + FT_TRACE4(( " return" )); + + if ( zone <= decoder->zones ) + { + FT_ERROR(( "T1_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" )); + + break; + + case op_hstem3: + FT_TRACE4(( " hstem3" )); + + break; + + case op_vstem: + FT_TRACE4(( " vstem" )); + + break; + + case op_vstem3: + FT_TRACE4(( " vstem3" )); + + break; + + case op_setcurrentpoint: + FT_TRACE4(( " setcurrentpoint" )); + + FT_ERROR(( "T1_Parse_CharStrings:" )); + FT_ERROR(( " unexpected `setcurrentpoint'\n" )); + goto Syntax_Error; + + default: + FT_ERROR(( "T1_Parse_CharStrings: unhandled opcode %d\n", op )); + goto Syntax_Error; + } + + decoder->top = top; + + } /* general operator processing */ + + } /* while ip < limit */ + + FT_TRACE4(( "..end..\n\n" )); + return error; + + Syntax_Error: + return T1_Err_Syntax_Error; + + Stack_Underflow: + return T1_Err_Stack_Underflow; + + Memory_Error: + return builder->error; + } + + + FT_LOCAL_DEF + FT_Error T1_Decoder_Parse_Glyph( T1_Decoder* decoder, + FT_UInt glyph ) + { + return decoder->parse_callback( decoder, glyph ); + } + + + FT_LOCAL_DEF + FT_Error T1_Decoder_Init( T1_Decoder* decoder, + FT_Face face, + FT_Size size, + FT_GlyphSlot slot, + FT_Byte** glyph_names, + T1_Blend* blend, + T1_Decoder_Callback parse_callback ) + { + MEM_Set( decoder, 0, sizeof ( *decoder ) ); + + /* retrieve PSNames interface from list of current modules */ + { + PSNames_Interface* psnames = 0; + + + psnames = (PSNames_Interface*)FT_Get_Module_Interface( + FT_FACE_LIBRARY(face), "psnames" ); + if ( !psnames ) + { + FT_ERROR(( "T1_Decoder_Init: " )); + FT_ERROR(( "the `psnames' module is not available\n" )); + return FT_Err_Unimplemented_Feature; + } + + decoder->psnames = psnames; + } + T1_Builder_Init( &decoder->builder, face, size, slot ); + + decoder->num_glyphs = face->num_glyphs; + decoder->glyph_names = glyph_names; + decoder->blend = blend; + decoder->parse_callback = parse_callback; + + decoder->funcs = t1_decoder_funcs; + + return 0; + } + + + FT_LOCAL_DEF + void T1_Decoder_Done( T1_Decoder* decoder ) + { + T1_Builder_Done( &decoder->builder ); + } + + +/* END */ Index: xc/extras/freetype2/src/psaux/t1decode.h diff -u /dev/null xc/extras/freetype2/src/psaux/t1decode.h:1.1.1.1 --- /dev/null Mon Dec 18 14:22:39 2000 +++ xc/extras/freetype2/src/psaux/t1decode.h Fri Dec 8 16:26:22 2000 @@ -0,0 +1,66 @@ +/***************************************************************************/ +/* */ +/* t1decode.h */ +/* */ +/* PostScript Type 1 decoding routines (specification). */ +/* */ +/* Copyright 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. */ +/* */ +/***************************************************************************/ + + +#ifndef T1DECODE_H +#define T1DECODE_H + +#include +#include +#include + + +#ifdef __cplusplus + extern "C" { +#endif + + + FT_CALLBACK_TABLE + const T1_Decoder_Funcs 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, + T1_Blend* blend, + T1_Decoder_Callback parse_glyph ); + + FT_LOCAL + void T1_Decoder_Done( T1_Decoder* decoder ); + + +#ifdef __cplusplus + } +#endif + + +#endif /* T1DECODE_H */ + + +/* END */ Index: xc/extras/freetype2/src/psnames/module.mk diff -u /dev/null xc/extras/freetype2/src/psnames/module.mk:1.1.1.1 --- /dev/null Mon Dec 18 14:22:39 2000 +++ xc/extras/freetype2/src/psnames/module.mk Fri Dec 8 16:26:22 2000 @@ -0,0 +1,22 @@ +# +# FreeType 2 PSnames module definition +# + + +# 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. + + +make_module_list: add_psnames_module + +add_psnames_module: + $(OPEN_DRIVER)psnames_module_class$(CLOSE_DRIVER) + $(ECHO_DRIVER)psnames $(ECHO_DRIVER_DESC)Postscript & Unicode Glyph name handling$(ECHO_DRIVER_DONE) + +# EOF Index: xc/extras/freetype2/src/psnames/psmodule.c diff -u /dev/null xc/extras/freetype2/src/psnames/psmodule.c:1.1.1.1 --- /dev/null Mon Dec 18 14:22:39 2000 +++ xc/extras/freetype2/src/psnames/psmodule.c Fri Dec 8 16:26:22 2000 @@ -0,0 +1,322 @@ +/***************************************************************************/ +/* */ +/* psmodule.c */ +/* */ +/* PSNames module implementation (body). */ +/* */ +/* 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 +#include + + +#ifdef FT_FLAT_COMPILE + +#include "psmodule.h" +#include "pstables.h" + +#else + +#include +#include + +#endif + + +#include /* for qsort() */ +#include /* for strcmp(), strncpy() */ + + +#ifndef FT_CONFIG_OPTION_NO_POSTSCRIPT_NAMES + + + + +#ifdef FT_CONFIG_OPTION_ADOBE_GLYPH_LIST + + + /* 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', etc. */ + /* */ + static + FT_ULong PS_Unicode_Value( const char* glyph_name ) + { + FT_Int n; + char first = glyph_name[0]; + char temp[64]; + + + /* 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 + 4; + + + for ( count = 4; count > 0; count--, p++ ) + { + char c = *p; + unsigned char 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 */ + if ( d >= 16 ) + break; + + value = ( value << 4 ) + d; + + if ( count == 0 ) + return value; + } + } + + /* look for a non-initial dot in the glyph name in order to */ + /* sort-out variants like `A.swash', `e.final', etc. */ + { + const char* p; + int len; + + + p = glyph_name; + + while ( *p && *p != '.' ) + p++; + + len = p - glyph_name; + + if ( *p && len < 64 ) + { + strncpy( temp, glyph_name, len ); + temp[len] = 0; + glyph_name = temp; + } + } + + /* now, look up the glyph in the Adobe Glyph List */ + for ( n = 0; n < NUM_ADOBE_GLYPHS; n++ ) + { + const char* name = t1_standard_glyphs[n]; + + + if ( first == name[0] && strcmp( glyph_name, name ) == 0 ) + return names_to_unicode[n]; + } + + /* not found, there is probably no Unicode value for this glyph name */ + return 0; + } + + + /* 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; + + + return ( map1->unicode - map2->unicode ); + } + + + /* Builds a table that maps Unicode values to glyph indices */ + static + FT_Error PS_Build_Unicode_Table( FT_Memory memory, + FT_UInt num_glyphs, + const char** glyph_names, + PS_Unicodes* table ) + { + FT_Error error; + + + /* we first allocate the table */ + table->num_maps = 0; + table->maps = 0; + + if ( !ALLOC_ARRAY( table->maps, num_glyphs, PS_UniMap ) ) + { + FT_UInt n; + FT_UInt count; + PS_UniMap* map; + FT_ULong uni_char; + + + map = table->maps; + + for ( n = 0; n < num_glyphs; n++ ) + { + const char* gname = glyph_names[n]; + + + if ( gname ) + { + uni_char = PS_Unicode_Value( gname ); + + if ( uni_char && uni_char != 0xFFFF ) + { + map->unicode = uni_char; + map->glyph_index = n; + map++; + } + } + } + + /* now, compress the table a bit */ + count = map - table->maps; + + if ( count > 0 && REALLOC( table->maps, + num_glyphs * sizeof ( PS_UniMap ), + count * sizeof ( PS_UniMap ) ) ) + count = 0; + + if ( count == 0 ) + { + FREE( table->maps ); + if ( !error ) + error = FT_Err_Invalid_Argument; /* no unicode chars here! */ + } + else + /* sort the table in increasing order of unicode values */ + qsort( table->maps, count, sizeof ( PS_UniMap ), compare_uni_maps ); + + table->num_maps = count; + } + + return error; + } + + + static + FT_UInt PS_Lookup_Unicode( PS_Unicodes* table, + FT_ULong unicode ) + { + PS_UniMap *min, *max, *mid; + + + /* perform a binary search on the table */ + + min = table->maps; + max = min + table->num_maps - 1; + + while ( min <= max ) + { + mid = min + ( max - min ) / 2; + if ( mid->unicode == unicode ) + return mid->glyph_index; + + if ( min == max ) + break; + + if ( mid->unicode < unicode ) + min = mid + 1; + else + max = mid - 1; + } + + return 0xFFFF; + } + + +#endif /* FT_CONFIG_OPTION_ADOBE_GLYPH_LIST */ + + + static + const char* PS_Macintosh_Name( FT_UInt name_index ) + { + if ( name_index >= 258 ) + name_index = 0; + + return standard_glyph_names[mac_standard_names[name_index]]; + } + + + static + const char* PS_Standard_Strings( FT_UInt sid ) + { + return ( sid < NUM_STD_GLYPHS ? t1_standard_glyphs[sid] : 0 ); + } + + + static + const PSNames_Interface psnames_interface = + { +#ifdef FT_CONFIG_OPTION_ADOBE_GLYPH_LIST + + (PS_Unicode_Value_Func) PS_Unicode_Value, + (PS_Build_Unicodes_Func) PS_Build_Unicode_Table, + (PS_Lookup_Unicode_Func) PS_Lookup_Unicode, + +#else + + 0, + 0, + 0, + +#endif /* FT_CONFIG_OPTION_ADOBE_GLYPH_LIST */ + + (PS_Macintosh_Name_Func) PS_Macintosh_Name, + (PS_Adobe_Std_Strings_Func)PS_Standard_Strings, + + t1_standard_encoding, + t1_expert_encoding + }; + + +#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, +#else + (void*)&psnames_interface, /* module specific interface */ +#endif + + (FT_Module_Constructor)0, + (FT_Module_Destructor) 0, + (FT_Module_Requester) 0 + }; + + +/* END */ Index: xc/extras/freetype2/src/psnames/psmodule.h diff -u /dev/null xc/extras/freetype2/src/psnames/psmodule.h:1.1.1.1 --- /dev/null Mon Dec 18 14:22:39 2000 +++ xc/extras/freetype2/src/psnames/psmodule.h Fri Dec 8 16:26:22 2000 @@ -0,0 +1,40 @@ +/***************************************************************************/ +/* */ +/* psmodule.h */ +/* */ +/* High-level PSNames module interface (specification). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#ifndef PSDRIVER_H +#define PSDRIVER_H + +#include + + +#ifdef __cplusplus + extern "C" { +#endif + + + FT_EXPORT_VAR( const FT_Module_Class ) psnames_module_class; + +#ifdef __cplusplus + } +#endif + + +#endif /* PSDRIVER_H */ + + +/* END */ Index: xc/extras/freetype2/src/psnames/psnames.c diff -u /dev/null xc/extras/freetype2/src/psnames/psnames.c:1.1.1.1 --- /dev/null Mon Dec 18 14:22:39 2000 +++ xc/extras/freetype2/src/psnames/psnames.c Fri Dec 8 16:26:22 2000 @@ -0,0 +1,33 @@ +/***************************************************************************/ +/* */ +/* psnames.c */ +/* */ +/* FreeType PSNames module component (body only). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#define FT_MAKE_OPTION_SINGLE_OBJECT + + +#ifdef FT_FLAT_COMPILE + +#include "psmodule.c" + +#else + +#include + +#endif + + +/* END */ Index: xc/extras/freetype2/src/psnames/pstables.h diff -u /dev/null xc/extras/freetype2/src/psnames/pstables.h:1.1.1.1 --- /dev/null Mon Dec 18 14:22:39 2000 +++ xc/extras/freetype2/src/psnames/pstables.h Fri Dec 8 16:26:22 2000 @@ -0,0 +1,2942 @@ +/***************************************************************************/ +/* */ +/* pstables.h */ +/* */ +/* PostScript glyph names (specification only). */ +/* */ +/* Copyright 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. */ +/* */ +/***************************************************************************/ + + + /* this file has been generated automatically -- do not edit! */ + + + static const char* standard_glyph_names[] = + { + ".null", + "CR", + "notequal", + "infinity", + "lessequal", + "greaterequal", + "partialdiff", + "summation", + "product", + "pi", + "integral", + "Omega", + "radical", + "approxequal", + "Delta", + "nbspace", + "lozenge", + "periodcentered", + "apple", + "lslash", + "franc", + "Gbreve", + "gbreve", + "Idot", + "Scedilla", + "scedilla", + "Cacute", + "cacute", + "Ccaron", + "ccaron", + "dmacron", + ".notdef", + "space", + "exclam", + "quotedbl", + "numbersign", + "dollar", + "percent", + "ampersand", + "quoteright", + "parenleft", + "parenright", + "asterisk", + "plus", + "comma", + "hyphen", + "period", + "slash", + "zero", + "one", + "two", + "three", + "four", + "five", + "six", + "seven", + "eight", + "nine", + "colon", + "semicolon", + "less", + "equal", + "greater", + "question", + "at", + "A", + "B", + "C", + "D", + "E", + "F", + "G", + "H", + "I", + "J", + "K", + "L", + "M", + "N", + "O", + "P", + "Q", + "R", + "S", + "T", + "U", + "V", + "W", + "X", + "Y", + "Z", + "bracketleft", + "backslash", + "bracketright", + "asciicircum", + "underscore", + "quoteleft", + "a", + "b", + "c", + "d", + "e", + "f", + "g", + "h", + "i", + "j", + "k", + "l", + "m", + "n", + "o", + "p", + "q", + "r", + "s", + "t", + "u", + "v", + "w", + "x", + "y", + "z", + "braceleft", + "bar", + "braceright", + "asciitilde", + "exclamdown", + "cent", + "sterling", + "fraction", + "yen", + "florin", + "section", + "currency", + "quotesingle", + "quotedblleft", + "guillemotleft", + "guilsinglleft", + "guilsinglright", + "fi", + "fl", + "endash", + "dagger", + "daggerdbl", + "periodcenter", + "paragraph", + "bullet", + "quotesinglbase", + "quotedblbase", + "quotedblright", + "guillemotright", + "ellipsis", + "perthousand", + "questiondown", + "grave", + "acute", + "circumflex", + "tilde", + "macron", + "breve", + "dotaccent", + "dieresis", + "ring", + "cedilla", + "hungarumlaut", + "ogonek", + "caron", + "emdash", + "AE", + "ordfeminine", + "Lslash", + "Oslash", + "OE", + "ordmasculine", + "ae", + "dotlessi", + "Islash", + "oslash", + "oe", + "germandbls", + "onesuperior", + "logicalnot", + "mu", + "trademark", + "Eth", + "onehalf", + "plusminus", + "Thorn", + "onequarter", + "divide", + "brokenbar", + "degree", + "thorn", + "threequarters", + "twosuperior", + "registered", + "minus", + "eth", + "multiply", + "threesuperior", + "copyright", + "Aacute", + "Acircumflex", + "Adieresis", + "Agrave", + "Aring", + "Atilde", + "Ccedilla", + "Eacute", + "Ecircumflex", + "Edieresis", + "Egrave", + "Iacute", + "Icircumflex", + "Idieresis", + "Igrave", + "Ntilde", + "Oacute", + "Ocircumflex", + "Odieresis", + "Ograve", + "Otilde", + "Scaron", + "Uacute", + "Ucircumflex", + "Udieresis", + "Ugrave", + "Yacute", + "Ydieresis", + "Zcaron", + "aacute", + "acircumflex", + "adieresis", + "agrave", + "aring", + "atilde", + "ccedilla", + "eacute", + "ecircumflex", + "edieresis", + "egrave", + "iacute", + "icircumflex", + "idieresis", + "igrave", + "ntilde", + "oacute", + "ocircumflex", + "odieresis", + "ograve", + "otilde", + "scaron", + "uacute", + "ucircumflex", + "udieresis", + "ugrave", + "yacute", + "ydieresis", + "zcaron", + "exclamsmall", + "Hungarumlautsmall", + "dollaroldstyle", + "dollarsuperior", + "ampersandsmall", + "Acutesmall", + "parenleftsuperior", + "parenrightsuperior", + "twodotenleader", + "onedotenleader", + "zerooldstyle", + "oneoldstyle", + "twooldstyle", + "threeoldstyle", + "fouroldstyle", + "fiveoldstyle", + "sixoldstyle", + "sevenoldstyle", + "eightoldstyle", + "nineoldstyle", + "commasuperior", + "threequartersemdash", + "periodsuperior", + "questionsmall", + "asuperior", + "bsuperior", + "centsuperior", + "dsuperior", + "esuperior", + "isuperior", + "lsuperior", + "msuperior", + "nsuperior", + "osuperior", + "rsuperior", + "ssuperior", + "tsuperior", + "ff", + "ffi", + "ffl", + "parenleftinferior", + "parenrightinferior", + "Circumflexsmall", + "hyphensuperior", + "Gravesmall", + "Asmall", + "Bsmall", + "Csmall", + "Dsmall", + "Esmall", + "Fsmall", + "Gsmall", + "Hsmall", + "Ismall", + "Jsmall", + "Ksmall", + "Lsmall", + "Msmall", + "Nsmall", + "Osmall", + "Psmall", + "Qsmall", + "Rsmall", + "Ssmall", + "Tsmall", + "Usmall", + "Vsmall", + "Wsmall", + "Xsmall", + "Ysmall", + "Zsmall", + "colonmonetary", + "onefitted", + "rupiah", + "Tildesmall", + "exclamdownsmall", + "centoldstyle", + "Lslashsmall", + "Scaronsmall", + "Zcaronsmall", + "Dieresissmall", + "Brevesmall", + "Caronsmall", + "Dotaccentsmall", + "Macronsmall", + "figuredash", + "hypheninferior", + "Ogoneksmall", + "Ringsmall", + "Cedillasmall", + "questiondownsmall", + "oneeighth", + "threeeighths", + "fiveeighths", + "seveneighths", + "onethird", + "twothirds", + "zerosuperior", + "foursuperior", + "fivesuperior", + "sixsuperior", + "sevensuperior", + "eightsuperior", + "ninesuperior", + "zeroinferior", + "oneinferior", + "twoinferior", + "threeinferior", + "fourinferior", + "fiveinferior", + "sixinferior", + "seveninferior", + "eightinferior", + "nineinferior", + "centinferior", + "dollarinferior", + "periodinferior", + "commainferior", + "Agravesmall", + "Aacutesmall", + "Acircumflexsmall", + "Atildesmall", + "Adieresissmall", + "Aringsmall", + "AEsmall", + "Ccedillasmall", + "Egravesmall", + "Eacutesmall", + "Ecircumflexsmall", + "Edieresissmall", + "Igravesmall", + "Iacutesmall", + "Icircumflexsmall", + "Idieresissmall", + "Ethsmall", + "Ntildesmall", + "Ogravesmall", + "Oacutesmall", + "Ocircumflexsmall", + "Otildesmall", + "Odieresissmall", + "OEsmall", + "Oslashsmall", + "Ugravesmall", + "Uacautesmall", + "Ucircumflexsmall", + "Udieresissmall", + "Yacutesmall", + "Thornsmall", + "Ydieresissmall", + "001.000", + "001.001", + "001.002", + "001.003", + "Black", + "Bold", + "Book", + "Light", + "Medium", + "Regular", + "Roman", + "Semibold", + +#ifdef FT_CONFIG_OPTION_ADOBE_GLYPH_LIST + + "AEacute", + "Abreve", + "Acute", + "Alpha", + "Alphatonos", + "Amacron", + "Aogonek", + "Aringacute", + "Beta", + "Caron", + "Ccircumflex", + "Cdotaccent", + "Chi", + "Dcaron", + "Dcroat", + "Dieresis", + "DieresisAcute", + "DieresisGrave", + "Ebreve", + "Ecaron", + "Edotaccent", + "Emacron", + "Eng", + "Eogonek", + "Epsilon", + "Epsilontonos", + "Eta", + "Etatonos", + "Euro", + "Gamma", + "Gcaron", + "Gcircumflex", + "Gcommaaccent", + "Gdotaccent", + "Grave", + "H18533", + "H18543", + "H18551", + "H22073", + "Hbar", + "Hcircumflex", + "Hungarumlaut", + "IJ", + "Ibreve", + "Idotaccent", + "Ifraktur", + "Imacron", + "Iogonek", + "Iota", + "Iotadieresis", + "Iotatonos", + "Itilde", + "Jcircumflex", + "Kappa", + "Kcommaaccent", + "LL", + "Lacute", + "Lambda", + "Lcaron", + "Lcommaaccent", + "Ldot", + "Macron", + "Mu", + "Nacute", + "Ncaron", + "Ncommaaccent", + "Nu", + "Obreve", + "Ohorn", + "Ohungarumlaut", + "Omacron", + "Omegatonos", + "Omicron", + "Omicrontonos", + "Oslashacute", + "Phi", + "Pi", + "Psi", + "Racute", + "Rcaron", + "Rcommaaccent", + "Rfraktur", + "Rho", + "SF010000", + "SF020000", + "SF030000", + "SF040000", + "SF050000", + "SF060000", + "SF070000", + "SF080000", + "SF090000", + "SF100000", + "SF110000", + "SF190000", + "SF200000", + "SF210000", + "SF220000", + "SF230000", + "SF240000", + "SF250000", + "SF260000", + "SF270000", + "SF280000", + "SF360000", + "SF370000", + "SF380000", + "SF390000", + "SF400000", + "SF410000", + "SF420000", + "SF430000", + "SF440000", + "SF450000", + "SF460000", + "SF470000", + "SF480000", + "SF490000", + "SF500000", + "SF510000", + "SF520000", + "SF530000", + "SF540000", + "Sacute", + "Scircumflex", + "Scommaaccent", + "Sigma", + "Tau", + "Tbar", + "Tcaron", + "Tcommaaccent", + "Tcommaaccent", + "Theta", + "Uacutesmall", + "Ubreve", + "Uhorn", + "Uhungarumlaut", + "Umacron", + "Uogonek", + "Upsilon", + "Upsilon1", + "Upsilondieresis", + "Upsilontonos", + "Uring", + "Utilde", + "Wacute", + "Wcircumflex", + "Wdieresis", + "Wgrave", + "Xi", + "Ycircumflex", + "Ygrave", + "Zacute", + "Zdotaccent", + "Zeta", + "abreve", + "acutecomb", + "aeacute", + "afii00208", + "afii10017", + "afii10018", + "afii10019", + "afii10020", + "afii10021", + "afii10022", + "afii10023", + "afii10024", + "afii10025", + "afii10026", + "afii10027", + "afii10028", + "afii10029", + "afii10030", + "afii10031", + "afii10032", + "afii10033", + "afii10034", + "afii10035", + "afii10036", + "afii10037", + "afii10038", + "afii10039", + "afii10040", + "afii10041", + "afii10042", + "afii10043", + "afii10044", + "afii10045", + "afii10046", + "afii10047", + "afii10048", + "afii10049", + "afii10050", + "afii10051", + "afii10052", + "afii10053", + "afii10054", + "afii10055", + "afii10056", + "afii10057", + "afii10058", + "afii10059", + "afii10060", + "afii10061", + "afii10062", + "afii10063", + "afii10064", + "afii10065", + "afii10066", + "afii10067", + "afii10068", + "afii10069", + "afii10070", + "afii10071", + "afii10072", + "afii10073", + "afii10074", + "afii10075", + "afii10076", + "afii10077", + "afii10078", + "afii10079", + "afii10080", + "afii10081", + "afii10082", + "afii10083", + "afii10084", + "afii10085", + "afii10086", + "afii10087", + "afii10088", + "afii10089", + "afii10090", + "afii10091", + "afii10092", + "afii10093", + "afii10094", + "afii10095", + "afii10096", + "afii10097", + "afii10098", + "afii10099", + "afii10100", + "afii10101", + "afii10102", + "afii10103", + "afii10104", + "afii10105", + "afii10106", + "afii10107", + "afii10108", + "afii10109", + "afii10110", + "afii10145", + "afii10146", + "afii10147", + "afii10148", + "afii10192", + "afii10193", + "afii10194", + "afii10195", + "afii10196", + "afii10831", + "afii10832", + "afii10846", + "afii299", + "afii300", + "afii301", + "afii57381", + "afii57388", + "afii57392", + "afii57393", + "afii57394", + "afii57395", + "afii57396", + "afii57397", + "afii57398", + "afii57399", + "afii57400", + "afii57401", + "afii57403", + "afii57407", + "afii57409", + "afii57410", + "afii57411", + "afii57412", + "afii57413", + "afii57414", + "afii57415", + "afii57416", + "afii57417", + "afii57418", + "afii57419", + "afii57420", + "afii57421", + "afii57422", + "afii57423", + "afii57424", + "afii57425", + "afii57426", + "afii57427", + "afii57428", + "afii57429", + "afii57430", + "afii57431", + "afii57432", + "afii57433", + "afii57434", + "afii57440", + "afii57441", + "afii57442", + "afii57443", + "afii57444", + "afii57445", + "afii57446", + "afii57448", + "afii57449", + "afii57450", + "afii57451", + "afii57452", + "afii57453", + "afii57454", + "afii57455", + "afii57456", + "afii57457", + "afii57458", + "afii57470", + "afii57505", + "afii57506", + "afii57507", + "afii57508", + "afii57509", + "afii57511", + "afii57512", + "afii57513", + "afii57514", + "afii57519", + "afii57534", + "afii57636", + "afii57645", + "afii57658", + "afii57664", + "afii57665", + "afii57666", + "afii57667", + "afii57668", + "afii57669", + "afii57670", + "afii57671", + "afii57672", + "afii57673", + "afii57674", + "afii57675", + "afii57676", + "afii57677", + "afii57678", + "afii57679", + "afii57680", + "afii57681", + "afii57682", + "afii57683", + "afii57684", + "afii57685", + "afii57686", + "afii57687", + "afii57688", + "afii57689", + "afii57690", + "afii57694", + "afii57695", + "afii57700", + "afii57705", + "afii57716", + "afii57717", + "afii57718", + "afii57723", + "afii57793", + "afii57794", + "afii57795", + "afii57796", + "afii57797", + "afii57798", + "afii57799", + "afii57800", + "afii57801", + "afii57802", + "afii57803", + "afii57804", + "afii57806", + "afii57807", + "afii57839", + "afii57841", + "afii57842", + "afii57929", + "afii61248", + "afii61289", + "afii61352", + "afii61573", + "afii61574", + "afii61575", + "afii61664", + "afii63167", + "afii64937", + "aleph", + "alpha", + "alphatonos", + "amacron", + "angle", + "angleleft", + "angleright", + "anoteleia", + "aogonek", + "aringacute", + "arrowboth", + "arrowdblboth", + "arrowdbldown", + "arrowdblleft", + "arrowdblright", + "arrowdblup", + "arrowdown", + "arrowhorizex", + "arrowleft", + "arrowright", + "arrowup", + "arrowupdn", + "arrowupdnbse", + "arrowvertex", + "asteriskmath", + "beta", + "block", + "braceex", + "braceleftbt", + "braceleftmid", + "bracelefttp", + "bracerightbt", + "bracerightmid", + "bracerighttp", + "bracketleftbt", + "bracketleftex", + "bracketlefttp", + "bracketrightbt", + "bracketrightex", + "bracketrighttp", + "carriagereturn", + "ccircumflex", + "cdotaccent", + "chi", + "circle", + "circlemultiply", + "circleplus", + "club", + "commaaccent", + "congruent", + "copyrightsans", + "copyrightserif", + "cyrBreve", + "cyrFlex", + "cyrbreve", + "cyrflex", + "dblGrave", + "dblgrave", + "dcaron", + "dcroat", + "delta", + "diamond", + "dieresisacute", + "dieresisgrave", + "dieresistonos", + "dkshade", + "dnblock", + "dong", + "dotbelowcomb", + "dotlessj", + "dotmath", + "ebreve", + "ecaron", + "edotaccent", + "element", + "emacron", + "emptyset", + "eng", + "eogonek", + "epsilon", + "epsilontonos", + "equivalence", + "estimated", + "eta", + "etatonos", + "exclamdbl", + "existential", + "female", + "filledbox", + "filledrect", + "gamma", + "gcaron", + "gcircumflex", + "gcommaaccent", + "gdotaccent", + "gradient", + "gravecomb", + "hbar", + "hcircumflex", + "heart", + "hookabovecomb", + "house", + "ibreve", + "ij", + "imacron", + "integralbt", + "integralex", + "integraltp", + "intersection", + "invbullet", + "invcircle", + "invsmileface", + "iogonek", + "iota", + "iotadieresis", + "iotadieresistonos", + "iotatonos", + "itilde", + "jcircumflex", + "kappa", + "kcommaaccent", + "kgreenlandic", + "lacute", + "lambda", + "lcaron", + "lcommaaccent", + "ldot", + "lfblock", + "lira", + "ll", + "logicaland", + "logicalor", + "longs", + "ltshade", + "male", + "minute", + "musicalnote", + "musicalnotedbl", + "nacute", + "napostrophe", + "ncaron", + "ncommaaccent", + "notelement", + "notsubset", + "nu", + "obreve", + "ohorn", + "ohungarumlaut", + "omacron", + "omega", + "omega1", + "omegatonos", + "omicron", + "omicrontonos", + "openbullet", + "orthogonal", + "oslashacute", + "parenleftbt", + "parenleftex", + "parenlefttp", + "parenrightbt", + "parenrightex", + "parenrighttp", + "perpendicular", + "peseta", + "phi", + "phi1", + "prescription", + "propersubset", + "propersuperset", + "proportional", + "psi", + "quotereversed", + "racute", + "radicalex", + "rcaron", + "rcommaaccent", + "reflexsubset", + "reflexsuperset", + "registersans", + "registerserif", + "revlogicalnot", + "rho", + "rtblock", + "sacute", + "scircumflex", + "scommaaccent", + "second", + "shade", + "sigma", + "sigma1", + "similar", + "smileface", + "spade", + "suchthat", + "sun", + "tau", + "tbar", + "tcaron", + "tcommaaccent", + "tcommaaccent", + "therefore", + "theta", + "theta1", + "tildecomb", + "tonos", + "trademarksans", + "trademarkserif", + "triagdn", + "triaglf", + "triagrt", + "triagup", + "ubreve", + "uhorn", + "uhungarumlaut", + "umacron", + "underscoredbl", + "union", + "universal", + "uogonek", + "upblock", + "upsilon", + "upsilondieresis", + "upsilondieresistonos", + "upsilontonos", + "uring", + "utilde", + "wacute", + "wcircumflex", + "wdieresis", + "weierstrass", + "wgrave", + "xi", + "ycircumflex", + "ygrave", + "zacute", + "zdotaccent", + "zeta", + +#endif /* FT_CONFIG_OPTION_ADOBE_GLYPH_LIST */ + + 0 + }; + + + static const char** t1_standard_glyphs = standard_glyph_names + 31; + + +#define NUM_STD_GLYPHS 391 + +#ifdef FT_CONFIG_OPTION_ADOBE_GLYPH_LIST +#define NUM_ADOBE_GLYPHS 1032 +#else +#define NUM_ADOBE_GLYPHS 391 +#endif + + + static const unsigned short mac_standard_names[259] = + { + 31, + 0, + 1, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 135, + 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, + 155, + 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, + 204, + 206, + 208, + 209, + 217, + 220, + 226, + 231, + 234, + 232, + 233, + 236, + 235, + 237, + 238, + 241, + 239, + 240, + 242, + 245, + 243, + 244, + 246, + 247, + 250, + 248, + 249, + 251, + 253, + 256, + 254, + 255, + 143, + 192, + 128, + 129, + 133, + 147, + 146, + 180, + 196, + 201, + 184, + 156, + 162, + 2, + 169, + 172, + 3, + 187, + 4, + 5, + 131, + 183, + 6, + 7, + 8, + 9, + 10, + 170, + 174, + 11, + 175, + 178, + 154, + 127, + 182, + 12, + 132, + 13, + 14, + 137, + 151, + 152, + 15, + 205, + 207, + 222, + 173, + 179, + 142, + 168, + 136, + 150, + 96, + 39, + 190, + 16, + 258, + 229, + 130, + 134, + 138, + 139, + 140, + 141, + 144, + 17, + 148, + 149, + 153, + 203, + 210, + 202, + 211, + 212, + 213, + 214, + 215, + 216, + 218, + 219, + 18, + 221, + 224, + 225, + 227, + 176, + 157, + 158, + 159, + 160, + 161, + 163, + 164, + 165, + 166, + 167, + 171, + 19, + 223, + 252, + 230, + 259, + 191, + 185, + 198, + 228, + 257, + 188, + 193, + 197, + 199, + 181, + 195, + 200, + 186, + 189, + 194, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 0 + }; + + + + static const unsigned short names_to_unicode[1033] = + { + 0, + 0x0020, + 0x0021, + 0x0022, + 0x0023, + 0x0024, + 0x0025, + 0x0026, + 0x2019, + 0x0028, + 0x0029, + 0x002A, + 0x002B, + 0x002C, + 0x002D, + 0x002E, + 0x002F, + 0x0030, + 0x0031, + 0x0032, + 0x0033, + 0x0034, + 0x0035, + 0x0036, + 0x0037, + 0x0038, + 0x0039, + 0x003A, + 0x003B, + 0x003C, + 0x003D, + 0x003E, + 0x003F, + 0x0040, + 0x0041, + 0x0042, + 0x0043, + 0x0044, + 0x0045, + 0x0046, + 0x0047, + 0x0048, + 0x0049, + 0x004A, + 0x004B, + 0x004C, + 0x004D, + 0x004E, + 0x004F, + 0x0050, + 0x0051, + 0x0052, + 0x0053, + 0x0054, + 0x0055, + 0x0056, + 0x0057, + 0x0058, + 0x0059, + 0x005A, + 0x005B, + 0x005C, + 0x005D, + 0x005E, + 0x005F, + 0x2018, + 0x0061, + 0x0062, + 0x0063, + 0x0064, + 0x0065, + 0x0066, + 0x0067, + 0x0068, + 0x0069, + 0x006A, + 0x006B, + 0x006C, + 0x006D, + 0x006E, + 0x006F, + 0x0070, + 0x0071, + 0x0072, + 0x0073, + 0x0074, + 0x0075, + 0x0076, + 0x0077, + 0x0078, + 0x0079, + 0x007A, + 0x007B, + 0x007C, + 0x007D, + 0x007E, + 0x00A1, + 0x00A2, + 0x00A3, + 0x2044, + 0x00A5, + 0x0192, + 0x00A7, + 0x00A4, + 0x0027, + 0x201C, + 0x00AB, + 0x2039, + 0x203A, + 0xFB01, + 0xFB02, + 0x2013, + 0x2020, + 0x2021, + 0, + 0x00B6, + 0x2022, + 0x201A, + 0x201E, + 0x201D, + 0x00BB, + 0x2026, + 0x2030, + 0x00BF, + 0x0060, + 0x00B4, + 0x02C6, + 0x02DC, + 0x00AF, + 0x02D8, + 0x02D9, + 0x00A8, + 0x02DA, + 0x00B8, + 0x02DD, + 0x02DB, + 0x02C7, + 0x2014, + 0x00C6, + 0x00AA, + 0x0141, + 0x00D8, + 0x0152, + 0x00BA, + 0x00E6, + 0x0131, + 0, + 0x00F8, + 0x0153, + 0x00DF, + 0x00B9, + 0x00AC, + 0x00B5, + 0x2122, + 0x00D0, + 0x00BD, + 0x00B1, + 0x00DE, + 0x00BC, + 0x00F7, + 0x00A6, + 0x00B0, + 0x00FE, + 0x00BE, + 0x00B2, + 0x00AE, + 0x2212, + 0x00F0, + 0x00D7, + 0x00B3, + 0x00A9, + 0x00C1, + 0x00C2, + 0x00C4, + 0x00C0, + 0x00C5, + 0x00C3, + 0x00C7, + 0x00C9, + 0x00CA, + 0x00CB, + 0x00C8, + 0x00CD, + 0x00CE, + 0x00CF, + 0x00CC, + 0x00D1, + 0x00D3, + 0x00D4, + 0x00D6, + 0x00D2, + 0x00D5, + 0x0160, + 0x00DA, + 0x00DB, + 0x00DC, + 0x00D9, + 0x00DD, + 0x0178, + 0x017D, + 0x00E1, + 0x00E2, + 0x00E4, + 0x00E0, + 0x00E5, + 0x00E3, + 0x00E7, + 0x00E9, + 0x00EA, + 0x00EB, + 0x00E8, + 0x00ED, + 0x00EE, + 0x00EF, + 0x00EC, + 0x00F1, + 0x00F3, + 0x00F4, + 0x00F6, + 0x00F2, + 0x00F5, + 0x0161, + 0x00FA, + 0x00FB, + 0x00FC, + 0x00F9, + 0x00FD, + 0x00FF, + 0x017E, + 0xF721, + 0xF6F8, + 0xF724, + 0xF6E4, + 0xF726, + 0xF7B4, + 0x207D, + 0x207E, + 0x2025, + 0x2024, + 0xF730, + 0xF731, + 0xF732, + 0xF733, + 0xF734, + 0xF735, + 0xF736, + 0xF737, + 0xF738, + 0xF739, + 0xF6E2, + 0xF6DE, + 0xF6E8, + 0xF73F, + 0xF6E9, + 0xF6EA, + 0xF6E0, + 0xF6EB, + 0xF6EC, + 0xF6ED, + 0xF6EE, + 0xF6EF, + 0x207F, + 0xF6F0, + 0xF6F1, + 0xF6F2, + 0xF6F3, + 0xFB00, + 0xFB03, + 0xFB04, + 0x208D, + 0x208E, + 0xF6F6, + 0xF6E6, + 0xF760, + 0xF761, + 0xF762, + 0xF763, + 0xF764, + 0xF765, + 0xF766, + 0xF767, + 0xF768, + 0xF769, + 0xF76A, + 0xF76B, + 0xF76C, + 0xF76D, + 0xF76E, + 0xF76F, + 0xF770, + 0xF771, + 0xF772, + 0xF773, + 0xF774, + 0xF775, + 0xF776, + 0xF777, + 0xF778, + 0xF779, + 0xF77A, + 0x20A1, + 0xF6DC, + 0xF6DD, + 0xF6FE, + 0xF7A1, + 0xF7A2, + 0xF6F9, + 0xF6FD, + 0xF6FF, + 0xF7A8, + 0xF6F4, + 0xF6F5, + 0xF6F7, + 0xF7AF, + 0x2012, + 0xF6E5, + 0xF6FB, + 0xF6FC, + 0xF7B8, + 0xF7BF, + 0x215B, + 0x215C, + 0x215D, + 0x215E, + 0x2153, + 0x2154, + 0x2070, + 0x2074, + 0x2075, + 0x2076, + 0x2077, + 0x2078, + 0x2079, + 0x2080, + 0x2081, + 0x2082, + 0x2083, + 0x2084, + 0x2085, + 0x2086, + 0x2087, + 0x2088, + 0x2089, + 0xF6DF, + 0xF6E3, + 0xF6E7, + 0xF6E1, + 0xF7E0, + 0xF7E1, + 0xF7E2, + 0xF7E3, + 0xF7E4, + 0xF7E5, + 0xF7E6, + 0xF7E7, + 0xF7E8, + 0xF7E9, + 0xF7EA, + 0xF7EB, + 0xF7EC, + 0xF7ED, + 0xF7EE, + 0xF7EF, + 0xF7F0, + 0xF7F1, + 0xF7F2, + 0xF7F3, + 0xF7F4, + 0xF7F5, + 0xF7F6, + 0xF6FA, + 0xF7F8, + 0xF7F9, + 0, + 0xF7FB, + 0xF7FC, + 0xF7FD, + 0xF7FE, + 0xF7FF, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + +#ifdef FT_CONFIG_OPTION_ADOBE_GLYPH_LIST + + 0x01FC, + 0x0102, + 0xF6C9, + 0x0391, + 0x0386, + 0x0100, + 0x0104, + 0x01FA, + 0x0392, + 0xF6CA, + 0x0108, + 0x010A, + 0x03A7, + 0x010E, + 0x0110, + 0xF6CB, + 0xF6CC, + 0xF6CD, + 0x0114, + 0x011A, + 0x0116, + 0x0112, + 0x014A, + 0x0118, + 0x0395, + 0x0388, + 0x0397, + 0x0389, + 0x20AC, + 0x0393, + 0x01E6, + 0x011C, + 0x0122, + 0x0120, + 0xF6CE, + 0x25CF, + 0x25AA, + 0x25AB, + 0x25A1, + 0x0126, + 0x0124, + 0xF6CF, + 0x0132, + 0x012C, + 0x0130, + 0x2111, + 0x012A, + 0x012E, + 0x0399, + 0x03AA, + 0x038A, + 0x0128, + 0x0134, + 0x039A, + 0x0136, + 0xF6BF, + 0x0139, + 0x039B, + 0x013D, + 0x013B, + 0x013F, + 0xF6D0, + 0x039C, + 0x0143, + 0x0147, + 0x0145, + 0x039D, + 0x014E, + 0x01A0, + 0x0150, + 0x014C, + 0x038F, + 0x039F, + 0x038C, + 0x01FE, + 0x03A6, + 0x03A0, + 0x03A8, + 0x0154, + 0x0158, + 0x0156, + 0x211C, + 0x03A1, + 0x250C, + 0x2514, + 0x2510, + 0x2518, + 0x253C, + 0x252C, + 0x2534, + 0x251C, + 0x2524, + 0x2500, + 0x2502, + 0x2561, + 0x2562, + 0x2556, + 0x2555, + 0x2563, + 0x2551, + 0x2557, + 0x255D, + 0x255C, + 0x255B, + 0x255E, + 0x255F, + 0x255A, + 0x2554, + 0x2569, + 0x2566, + 0x2560, + 0x2550, + 0x256C, + 0x2567, + 0x2568, + 0x2564, + 0x2565, + 0x2559, + 0x2558, + 0x2552, + 0x2553, + 0x256B, + 0x256A, + 0x015A, + 0x015C, + 0x0218, + 0x03A3, + 0x03A4, + 0x0166, + 0x0164, + 0x0162, + 0x0162, + 0x0398, + 0xF7FA, + 0x016C, + 0x01AF, + 0x0170, + 0x016A, + 0x0172, + 0x03A5, + 0x03D2, + 0x03AB, + 0x038E, + 0x016E, + 0x0168, + 0x1E82, + 0x0174, + 0x1E84, + 0x1E80, + 0x039E, + 0x0176, + 0x1EF2, + 0x0179, + 0x017B, + 0x0396, + 0x0103, + 0x0301, + 0x01FD, + 0x2015, + 0x0410, + 0x0411, + 0x0412, + 0x0413, + 0x0414, + 0x0415, + 0x0401, + 0x0416, + 0x0417, + 0x0418, + 0x0419, + 0x041A, + 0x041B, + 0x041C, + 0x041D, + 0x041E, + 0x041F, + 0x0420, + 0x0421, + 0x0422, + 0x0423, + 0x0424, + 0x0425, + 0x0426, + 0x0427, + 0x0428, + 0x0429, + 0x042A, + 0x042B, + 0x042C, + 0x042D, + 0x042E, + 0x042F, + 0x0490, + 0x0402, + 0x0403, + 0x0404, + 0x0405, + 0x0406, + 0x0407, + 0x0408, + 0x0409, + 0x040A, + 0x040B, + 0x040C, + 0x040E, + 0xF6C4, + 0xF6C5, + 0x0430, + 0x0431, + 0x0432, + 0x0433, + 0x0434, + 0x0435, + 0x0451, + 0x0436, + 0x0437, + 0x0438, + 0x0439, + 0x043A, + 0x043B, + 0x043C, + 0x043D, + 0x043E, + 0x043F, + 0x0440, + 0x0441, + 0x0442, + 0x0443, + 0x0444, + 0x0445, + 0x0446, + 0x0447, + 0x0448, + 0x0449, + 0x044A, + 0x044B, + 0x044C, + 0x044D, + 0x044E, + 0x044F, + 0x0491, + 0x0452, + 0x0453, + 0x0454, + 0x0455, + 0x0456, + 0x0457, + 0x0458, + 0x0459, + 0x045A, + 0x045B, + 0x045C, + 0x045E, + 0x040F, + 0x0462, + 0x0472, + 0x0474, + 0xF6C6, + 0x045F, + 0x0463, + 0x0473, + 0x0475, + 0xF6C7, + 0xF6C8, + 0x04D9, + 0x200E, + 0x200F, + 0x200D, + 0x066A, + 0x060C, + 0x0660, + 0x0661, + 0x0662, + 0x0663, + 0x0664, + 0x0665, + 0x0666, + 0x0667, + 0x0668, + 0x0669, + 0x061B, + 0x061F, + 0x0621, + 0x0622, + 0x0623, + 0x0624, + 0x0625, + 0x0626, + 0x0627, + 0x0628, + 0x0629, + 0x062A, + 0x062B, + 0x062C, + 0x062D, + 0x062E, + 0x062F, + 0x0630, + 0x0631, + 0x0632, + 0x0633, + 0x0634, + 0x0635, + 0x0636, + 0x0637, + 0x0638, + 0x0639, + 0x063A, + 0x0640, + 0x0641, + 0x0642, + 0x0643, + 0x0644, + 0x0645, + 0x0646, + 0x0648, + 0x0649, + 0x064A, + 0x064B, + 0x064C, + 0x064D, + 0x064E, + 0x064F, + 0x0650, + 0x0651, + 0x0652, + 0x0647, + 0x06A4, + 0x067E, + 0x0686, + 0x0698, + 0x06AF, + 0x0679, + 0x0688, + 0x0691, + 0x06BA, + 0x06D2, + 0x06D5, + 0x20AA, + 0x05BE, + 0x05C3, + 0x05D0, + 0x05D1, + 0x05D2, + 0x05D3, + 0x05D4, + 0x05D5, + 0x05D6, + 0x05D7, + 0x05D8, + 0x05D9, + 0x05DA, + 0x05DB, + 0x05DC, + 0x05DD, + 0x05DE, + 0x05DF, + 0x05E0, + 0x05E1, + 0x05E2, + 0x05E3, + 0x05E4, + 0x05E5, + 0x05E6, + 0x05E7, + 0x05E8, + 0x05E9, + 0x05EA, + 0xFB2A, + 0xFB2B, + 0xFB4B, + 0xFB1F, + 0x05F0, + 0x05F1, + 0x05F2, + 0xFB35, + 0x05B4, + 0x05B5, + 0x05B6, + 0x05BB, + 0x05B8, + 0x05B7, + 0x05B0, + 0x05B2, + 0x05B1, + 0x05B3, + 0x05C2, + 0x05C1, + 0x05B9, + 0x05BC, + 0x05BD, + 0x05BF, + 0x05C0, + 0x02BC, + 0x2105, + 0x2113, + 0x2116, + 0x202C, + 0x202D, + 0x202E, + 0x200C, + 0x066D, + 0x02BD, + 0x2135, + 0x03B1, + 0x03AC, + 0x0101, + 0x2220, + 0x2329, + 0x232A, + 0x0387, + 0x0105, + 0x01FB, + 0x2194, + 0x21D4, + 0x21D3, + 0x21D0, + 0x21D2, + 0x21D1, + 0x2193, + 0xF8E7, + 0x2190, + 0x2192, + 0x2191, + 0x2195, + 0x21A8, + 0xF8E6, + 0x2217, + 0x03B2, + 0x2588, + 0xF8F4, + 0xF8F3, + 0xF8F2, + 0xF8F1, + 0xF8FE, + 0xF8FD, + 0xF8FC, + 0xF8F0, + 0xF8EF, + 0xF8EE, + 0xF8FB, + 0xF8FA, + 0xF8F9, + 0x21B5, + 0x0109, + 0x010B, + 0x03C7, + 0x25CB, + 0x2297, + 0x2295, + 0x2663, + 0xF6C3, + 0x2245, + 0xF8E9, + 0xF6D9, + 0xF6D1, + 0xF6D2, + 0xF6D4, + 0xF6D5, + 0xF6D3, + 0xF6D6, + 0x010F, + 0x0111, + 0x03B4, + 0x2666, + 0xF6D7, + 0xF6D8, + 0x0385, + 0x2593, + 0x2584, + 0x20AB, + 0x0323, + 0xF6BE, + 0x22C5, + 0x0115, + 0x011B, + 0x0117, + 0x2208, + 0x0113, + 0x2205, + 0x014B, + 0x0119, + 0x03B5, + 0x03AD, + 0x2261, + 0x212E, + 0x03B7, + 0x03AE, + 0x203C, + 0x2203, + 0x2640, + 0x25A0, + 0x25AC, + 0x03B3, + 0x01E7, + 0x011D, + 0x0123, + 0x0121, + 0x2207, + 0x0300, + 0x0127, + 0x0125, + 0x2665, + 0x0309, + 0x2302, + 0x012D, + 0x0133, + 0x012B, + 0x2321, + 0xF8F5, + 0x2320, + 0x2229, + 0x25D8, + 0x25D9, + 0x263B, + 0x012F, + 0x03B9, + 0x03CA, + 0x0390, + 0x03AF, + 0x0129, + 0x0135, + 0x03BA, + 0x0137, + 0x0138, + 0x013A, + 0x03BB, + 0x013E, + 0x013C, + 0x0140, + 0x258C, + 0x20A4, + 0xF6C0, + 0x2227, + 0x2228, + 0x017F, + 0x2591, + 0x2642, + 0x2032, + 0x266A, + 0x266B, + 0x0144, + 0x0149, + 0x0148, + 0x0146, + 0x2209, + 0x2284, + 0x03BD, + 0x014F, + 0x01A1, + 0x0151, + 0x014D, + 0x03C9, + 0x03D6, + 0x03CE, + 0x03BF, + 0x03CC, + 0x25E6, + 0x221F, + 0x01FF, + 0xF8ED, + 0xF8EC, + 0xF8EB, + 0xF8F8, + 0xF8F7, + 0xF8F6, + 0x22A5, + 0x20A7, + 0x03C6, + 0x03D5, + 0x211E, + 0x2282, + 0x2283, + 0x221D, + 0x03C8, + 0x201B, + 0x0155, + 0xF8E5, + 0x0159, + 0x0157, + 0x2286, + 0x2287, + 0xF8E8, + 0xF6DA, + 0x2310, + 0x03C1, + 0x2590, + 0x015B, + 0x015D, + 0x0219, + 0x2033, + 0x2592, + 0x03C3, + 0x03C2, + 0x223C, + 0x263A, + 0x2660, + 0x220B, + 0x263C, + 0x03C4, + 0x0167, + 0x0165, + 0x0163, + 0x0163, + 0x2234, + 0x03B8, + 0x03D1, + 0x0303, + 0x0384, + 0xF8EA, + 0xF6DB, + 0x25BC, + 0x25C4, + 0x25BA, + 0x25B2, + 0x016D, + 0x01B0, + 0x0171, + 0x016B, + 0x2017, + 0x222A, + 0x2200, + 0x0173, + 0x2580, + 0x03C5, + 0x03CB, + 0x03B0, + 0x03CD, + 0x016F, + 0x0169, + 0x1E83, + 0x0175, + 0x1E85, + 0x2118, + 0x1E81, + 0x03BE, + 0x0177, + 0x1EF3, + 0x017A, + 0x017C, + 0x03B6, + +#endif /* FT_CONFIG_OPTION_ADOBE_GLYPH_LIST */ + 0 + }; + + + + static const unsigned short t1_standard_encoding[257] = + { + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 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, + 0 + }; + + + static const unsigned short t1_expert_encoding[257] = + { + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 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, + 0 + }; + + +/* END */ Index: xc/extras/freetype2/src/psnames/rules.mk diff -u /dev/null xc/extras/freetype2/src/psnames/rules.mk:1.1.1.1 --- /dev/null Mon Dec 18 14:22:39 2000 +++ xc/extras/freetype2/src/psnames/rules.mk Fri Dec 8 16:26:22 2000 @@ -0,0 +1,70 @@ +# +# FreeType 2 PSNames driver configuration rules +# + + +# 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. + + +# PSNames driver directory +# +PSNAMES_DIR := $(SRC_)psnames +PSNAMES_DIR_ := $(PSNAMES_DIR)$(SEP) + + +# compilation flags for the driver +# +PSNAMES_COMPILE := $(FT_COMPILE) + + +# 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 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_)%.$O) +PSNAMES_DRV_OBJ_S := $(OBJ_)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$@ $(PSNAMES_DRV_SRC_S) + + +# PSNames driver - multiple objects +# +$(OBJ_)%.$O: $(PSNAMES_DIR_)%.c $(FREETYPE_H) $(PSNAMES_DRV_H) + $(PSNAMES_COMPILE) $T$@ $< + + +# update main driver object lists +# +DRV_OBJS_S += $(PSNAMES_DRV_OBJ_S) +DRV_OBJS_M += $(PSNAMES_DRV_OBJ_M) + + +# EOF Index: xc/extras/freetype2/src/raster/ftraster.c diff -u /dev/null xc/extras/freetype2/src/raster/ftraster.c:1.1.1.1 --- /dev/null Mon Dec 18 14:22:39 2000 +++ xc/extras/freetype2/src/raster/ftraster.c Fri Dec 8 16:26:22 2000 @@ -0,0 +1,3293 @@ +/***************************************************************************/ +/* */ +/* ftraster.c */ +/* */ +/* The FreeType glyph rasterizer (body). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + /*************************************************************************/ + /* */ + /* This is a rewrite of the FreeType 1.x scan-line converter */ + /* */ + /*************************************************************************/ + + +#ifdef FT_FLAT_COMPILE +# include "ftraster.h" +#else +# include +#endif +#include /* for FT_MulDiv() only */ + + + /*************************************************************************/ + /* */ + /* 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 propertly. */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /*************************************************************************/ + /** **/ + /** CONFIGURATION MACROS **/ + /** **/ + /*************************************************************************/ + /*************************************************************************/ + + /* define DEBUG_RASTER if you want to compile a debugging version */ +#define xxxDEBUG_RASTER + + /* The default render pool size in bytes */ +#define RASTER_RENDER_POOL 8192 + + /* 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 */ +#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 + + +#else /* _STANDALONE_ */ + + +#include +#include /* for FT_TRACE() and FT_ERROR() */ + +#define Raster_Err_None FT_Err_Ok +#define Raster_Err_Not_Ini FT_Err_Raster_Uninitialized +#define Raster_Err_Overflow FT_Err_Raster_Overflow +#define Raster_Err_Neg_Height FT_Err_Raster_Negative_Height +#define Raster_Err_Invalid FT_Err_Invalid_Outline +#define Raster_Err_Unsupported FT_Err_Cannot_Render_Glyph + + +#endif /* _STANDALONE_ */ + + + /* 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 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, + Ascending, + Descending, + Flat + + } 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 */ + + UShort countL; /* number of lines to step before this */ + /* profile becomes drawable */ + + PProfile next; /* next profile in same contour, used */ + /* during drop-out control */ + }; + + typedef PProfile TProfileList; + typedef PProfile* PProfileList; + + + /* 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 ( long ) - 1 ) / sizeof ( long ) ) + + +#ifdef TT_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 /* TT_STATIC_RASTER */ + + +#define RAS_ARGS TRaster_Instance* raster, +#define RAS_ARG TRaster_Instance* raster + +#define RAS_VARS raster, +#define RAS_VAR raster + +#define FT_UNUSED_RASTER FT_UNUSED( raster ) + + +#endif /* TT_STATIC_RASTER */ + + + typedef struct TRaster_Instance_ TRaster_Instance; + + + /* 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 TRaster_Instance_ + { + Int precision_bits; /* precision related variables */ + Int precision; + Int precision_half; + Long precision_mask; + Int precision_shift; + Int precision_step; + Int precision_jitter; + + Int scale_shift; /* == precision_shift for bitmaps */ + /* == precision_shift+1 for pixmaps */ + + 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 wether a horizontal pass */ + /* should be performed to control */ + /* drop-out accurately when calling */ + /* Render_Glyph. Note that there is */ + /* no horizontal pass during gray */ + /* rendering. */ + + TPoint arcs[2 * MaxBezier + 1]; /* The Bezier stack */ + + TBand band_stack[16]; /* band stack used for sub-banding */ + Int band_top; /* band stack top */ + + Int count_table[256]; /* Look-up table used to quickly count */ + /* set bits in a gray 2x2 cell */ + + void* memory; + +#ifdef FT_RASTER_OPTION_ANTI_ALIASING + + Byte grays[5]; /* Palette of gray levels used for */ + /* render. */ + + 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 */ + +#if 0 + PByte flags; /* current flags table */ + PUShort outs; /* current outlines table */ + FT_Vector* coords; + + UShort nPoints; /* number of points in current glyph */ + Short nContours; /* number of contours in current glyph */ +#endif + + }; + + +#ifdef FT_CONFIG_OPTION_STATIC_RASTER + + static TRaster_Instance cur_ras; +#define ras cur_ras + +#else + +#define ras (*raster) + +#endif /* FT_CONFIG_OPTION_STATIC_RASTER */ + + + /*************************************************************************/ + /*************************************************************************/ + /** **/ + /** PROFILES COMPUTATION **/ + /** **/ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* */ + /* Set_High_Precision */ + /* */ + /* */ + /* Sets precision variables according to param flag. */ + /* */ + /* */ + /* 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 = 1L << ras.precision_bits; + ras.precision_half = ras.precision / 2; + ras.precision_shift = ras.precision_bits - Pixel_Bits; + ras.precision_mask = -ras.precision; + } + + + /*************************************************************************/ + /* */ + /* */ + /* New_Profile */ + /* */ + /* */ + /* Creates a new profile in the render pool. */ + /* */ + /* */ + /* aState :: The state/orientation of the new profile. */ + /* */ + /* */ + /* SUCCESS on success. FAILURE in case of overflow or of incoherent */ + /* profile. */ + /* */ + static + Bool New_Profile( RAS_ARGS TStates aState ) + { + if ( !ras.fProfile ) + { + ras.cProfile = (PProfile)ras.top; + ras.fProfile = ras.cProfile; + ras.top += AlignProfileSize; + } + + if ( ras.top >= ras.maxBuff ) + { + ras.error = Raster_Err_Overflow; + return FAILURE; + } + + switch ( aState ) + { + case Ascending: + ras.cProfile->flow = Flow_Up; + FT_TRACE6(( "New ascending profile = %lx\n", (long)ras.cProfile )); + break; + + case Descending: + 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; + } + + + /*************************************************************************/ + /* */ + /* */ + /* End_Profile */ + /* */ + /* */ + /* Finalizes the current profile. */ + /* */ + /* */ + /* SUCCESS on success. FAILURE in case of overflow or incoherency. */ + /* */ + static + Bool End_Profile( RAS_ARG ) + { + Long h; + PProfile oldProfile; + + + h = ras.top - ras.cProfile->offset; + + if ( h < 0 ) + { + 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; + } + + + /*************************************************************************/ + /* */ + /* */ + /* Insert_Y_Turn */ + /* */ + /* */ + /* Inserts a salient into the sorted list placed on top of the render */ + /* pool. */ + /* */ + /* */ + /* New y scanline position. */ + /* */ + /* */ + /* 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 = y_turns[n]; + y_turns[n] = y; + y = y2; + n--; + } + + if ( n < 0 ) + { + if ( ras.maxBuff <= ras.top ) + { + ras.error = Raster_Err_Overflow; + return FAILURE; + } + ras.maxBuff--; + ras.numTurns++; + ras.sizeBuff[-ras.numTurns] = y; + } + + return SUCCESS; + } + + + /*************************************************************************/ + /* */ + /* */ + /* Finalize_Profile_Table */ + /* */ + /* */ + /* Adjusts all links in the profiles list. */ + /* */ + /* */ + /* 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 = p->start - p->height+1; + top = p->start; + p->start = bottom; + p->offset += p->height - 1; + break; + + case Flow_Up: + default: + bottom = p->start; + top = p->start + p->height - 1; + } + + if ( Insert_Y_Turn( RAS_VARS bottom ) || + Insert_Y_Turn( RAS_VARS top + 1 ) ) + return FAILURE; + + p = p->link; + n--; + } + } + else + ras.fProfile = NULL; + + return SUCCESS; + } + + + /*************************************************************************/ + /* */ + /* */ + /* Split_Conic */ + /* */ + /* */ + /* Subdivides one conic Bezier into two joint sub-arcs in the Bezier */ + /* stack. */ + /* */ + /* */ + /* None (subdivided Bezier is taken from the top of the stack). */ + /* */ + /* */ + /* 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 ;-) */ + } + + + /*************************************************************************/ + /* */ + /* */ + /* Split_Cubic */ + /* */ + /* */ + /* Subdivides a third-order Bezier arc into two joint sub-arcs in the */ + /* Bezier stack. */ + /* */ + /* */ + /* 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; + } + + + /*************************************************************************/ + /* */ + /* */ + /* Line_Up */ + /* */ + /* */ + /* Computes the x-coordinates of an ascending line segment and stores */ + /* them in the render pool. */ + /* */ + /* */ + /* 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. */ + /* */ + /* */ + /* 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 = TRUNC( miny ); + f1 = 0; + } + else + { + e1 = TRUNC( y1 ); + f1 = FRAC( y1 ); + } + + if ( y2 > maxy ) + { + /* x2 += FMulDiv( Dx, maxy - y2, Dy ); UNNECESSARY */ + e2 = TRUNC( maxy ); + f2 = 0; + } + else + { + e2 = TRUNC( y2 ); + f2 = FRAC( y2 ); + } + + if ( f1 > 0 ) + { + if ( e1 == e2 ) + return SUCCESS; + else + { + x1 += FMulDiv( Dx, ras.precision - f1, Dy ); + e1 += 1; + } + } + else + if ( ras.joint ) + { + ras.top--; + ras.joint = FALSE; + } + + ras.joint = ( f2 == 0 ); + + if ( ras.fresh ) + { + ras.cProfile->start = e1; + ras.fresh = FALSE; + } + + size = e2 - e1 + 1; + if ( ras.top + size >= ras.maxBuff ) + { + ras.error = Raster_Err_Overflow; + return FAILURE; + } + + if ( Dx > 0 ) + { + Ix = ( ras.precision * Dx ) / Dy; + Rx = ( ras.precision * Dx ) % Dy; + Dx = 1; + } + else + { + Ix = -( ( ras.precision * -Dx ) / Dy ); + Rx = ( ras.precision * -Dx ) % Dy; + Dx = -1; + } + + Ax = -Dy; + top = ras.top; + + while ( size > 0 ) + { + *top++ = x1; + + x1 += Ix; + Ax += Rx; + if ( Ax >= 0 ) + { + Ax -= Dy; + x1 += Dx; + } + size--; + } + + ras.top = top; + return SUCCESS; + } + + + /*************************************************************************/ + /* */ + /* */ + /* Line_Down */ + /* */ + /* */ + /* Computes the x-coordinates of an descending line segment and */ + /* stores them in the render pool. */ + /* */ + /* */ + /* 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. */ + /* */ + /* */ + /* 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 ); + + + /*************************************************************************/ + /* */ + /* */ + /* Bezier_Up */ + /* */ + /* */ + /* Computes the x-coordinates of an ascending Bezier arc and stores */ + /* them in the render pool. */ + /* */ + /* */ + /* 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. */ + /* */ + /* */ + /* 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 = 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; + } + + + /*************************************************************************/ + /* */ + /* */ + /* Bezier_Down */ + /* */ + /* */ + /* Computes the x-coordinates of an descending Bezier arc and stores */ + /* them in the render pool. */ + /* */ + /* */ + /* 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. */ + /* */ + /* */ + /* 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; + } + + + /*************************************************************************/ + /* */ + /* */ + /* Line_To */ + /* */ + /* */ + /* Injects a new line segment and adjusts Profiles list. */ + /* */ + /* */ + /* 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'). */ + /* */ + /* */ + /* SUCCESS on success, FAILURE on render pool overflow or incorrect */ + /* profile. */ + /* */ + static + Bool Line_To( RAS_ARGS Long x, + Long y ) + { + /* First, detect a change of direction */ + + switch ( ras.state ) + { + case Unknown: + if ( y > ras.lastY ) + { + if ( New_Profile( RAS_VARS Ascending ) ) + return FAILURE; + } + else + { + if ( y < ras.lastY ) + if ( New_Profile( RAS_VARS Descending ) ) + return FAILURE; + } + break; + + case Ascending: + if ( y < ras.lastY ) + { + if ( End_Profile( RAS_VAR ) || + New_Profile( RAS_VARS Descending ) ) + return FAILURE; + } + break; + + case Descending: + if ( y > ras.lastY ) + { + if ( End_Profile( RAS_VAR ) || + New_Profile( RAS_VARS Ascending ) ) + return FAILURE; + } + break; + + default: + ; + } + + /* Then compute the lines */ + + switch ( ras.state ) + { + case Ascending: + if ( Line_Up( RAS_VARS ras.lastX, ras.lastY, + x, y, ras.minY, ras.maxY ) ) + return FAILURE; + break; + + case Descending: + if ( Line_Down( RAS_VARS ras.lastX, ras.lastY, + x, y, ras.minY, ras.maxY ) ) + return FAILURE; + break; + + default: + ; + } + + ras.lastX = x; + ras.lastY = y; + + return SUCCESS; + } + + + /*************************************************************************/ + /* */ + /* */ + /* Conic_To */ + /* */ + /* */ + /* Injects a new conic arc and adjusts the profile list. */ + /* */ + /* */ + /* 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'). */ + /* */ + /* */ + /* 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 : Descending; + if ( ras.state != state_bez ) + { + /* finalize current profile if any */ + if ( ras.state != Unknown && + 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 ) + { + 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; + } + + + /*************************************************************************/ + /* */ + /* */ + /* Cubic_To */ + /* */ + /* */ + /* Injects a new cubic arc and adjusts the profile list. */ + /* */ + /* */ + /* 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'). */ + /* */ + /* */ + /* 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 : Descending; + + /* detect a change of direction */ + if ( ras.state != state_bez ) + { + if ( ras.state != Unknown && + End_Profile( RAS_VAR ) ) + goto Fail; + + if ( New_Profile( RAS_VARS state_bez ) ) + goto Fail; + } + + /* compute intersections */ + if ( state_bez == Ascending ) + { + 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 ) + + + /*************************************************************************/ + /* */ + /* */ + /* Decompose_Curve */ + /* */ + /* */ + /* Scans the outline arays in order to emit individual segments and */ + /* Beziers by calling Line_To() and Bezier_To(). It handles all */ + /* weird cases, like when the first point is off the curve, or when */ + /* there are simply no `on' points in the contour! */ + /* */ + /* */ + /* 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. */ + /* */ + /* */ + /* 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; + + char 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; + } + + + /*************************************************************************/ + /* */ + /* */ + /* Convert_Glyph */ + /* */ + /* */ + /* Converts a glyph into a series of segments and arcs and makes a */ + /* profiles list with them. */ + /* */ + /* */ + /* flipped :: If set, flip the direction of curve. */ + /* */ + /* */ + /* SUCCESS on success, FAILURE if any error was encountered during */ + /* rendering. */ + /* */ + static + Bool Convert_Glyph( RAS_ARGS int flipped ) + { + Short i; + UShort start; + + PProfile lastProfile; + + + ras.fProfile = NULL; + ras.joint = FALSE; + ras.fresh = FALSE; + + ras.maxBuff = ras.sizeBuff - AlignProfileSize; + + ras.numTurns = 0; + + ras.cProfile = (PProfile)ras.top; + ras.cProfile->offset = ras.top; + ras.num_Profs = 0; + + start = 0; + + for ( i = 0; i < ras.outline.n_contours; i++ ) + { + ras.state = Unknown; + ras.gProfile = NULL; + + if ( Decompose_Curve( RAS_VARS 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 ( 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. */ + } + + + /*************************************************************************/ + /* */ + /* Update */ + /* */ + /* Update all X offsets of a drawing list. */ + /* */ + static + void Update( PProfile first ) + { + PProfile current = first; + + + while ( current ) + { + current->X = *current->offset; + current->offset += current->flow; + current->height--; + current = current->link; + } + } + + + /*************************************************************************/ + /* */ + /* Sort */ + /* */ + /* Sorts a trace list. In 95%, the list is already sorted. We need */ + /* an algorithm which is fast in this case. Bubble sort is enough */ + /* and simple. */ + /* */ + static + void Sort( PProfileList list ) + { + PProfile *old, current, next; + + + /* First, set the new X coordinate of each profile */ + Update( *list ); + + /* Then sort them */ + old = list; + current = *old; + + if ( !current ) + return; + + next = current->link; + + while ( next ) + { + if ( current->X <= next->X ) + { + old = ¤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; + Short 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 = (unsigned char)0xFF >> ( e1 & 7 ); + f2 = ~( (unsigned char)0x7F >> ( e2 & 7 ) ); + + if ( ras.gray_min_x > c1 ) ras.gray_min_x = c1; + if ( ras.gray_max_x < c2 ) ras.gray_max_x = c2; + + target = ras.bTarget + ras.traceOfs + c1; + 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 = 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 = 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; + Int* count = ras.count_table; + Byte* grays; + + + ras.traceOfs += ras.gray_width; + + if ( ras.traceOfs > ras.gray_width ) + { + pix = ras.gTarget + ras.traceG + ras.gray_min_x * 4; + grays = ras.grays; + + if ( ras.gray_max_x >= 0 ) + { + 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 wait; + TProfileList draw_left, draw_right; + + + /* Init empty linked lists */ + + Init_Linked( &wait ); + + Init_Linked( &draw_left ); + Init_Linked( &draw_right ); + + /* first, compute min and max Y */ + + P = ras.fProfile; + max_Y = (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( &wait, P ); + + P = Q; + } + + /* Check the Y-turns */ + if ( ras.numTurns == 0 ) + { + ras.error = Raster_Err_Invalid; + return FAILURE; + } + + /* Now inits the sweep */ + + ras.Proc_Sweep_Init( RAS_VARS &min_Y, &max_Y ); + + /* Then compute the distance of each profile from min_Y */ + + P = wait; + + while ( P ) + { + P->countL = P->start - min_Y; + P = P->link; + } + + /* Let's go */ + + y = min_Y; + y_height = 0; + + if ( ras.numTurns > 0 && + ras.sizeBuff[-ras.numTurns] == min_Y ) + ras.numTurns--; + + while ( ras.numTurns > 0 ) + { + /* look in the wait list for new activations */ + + P = wait; + + while ( P ) + { + Q = P->link; + P->countL -= y_height; + if ( P->countL == 0 ) + { + DelOld( &wait, P ); + + switch ( P->flow ) + { + case 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 = 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; + } + + + /*************************************************************************/ + /* */ + /* */ + /* Render_Single_Pass */ + /* */ + /* */ + /* Performs one sweep with sub-banding. */ + /* */ + /* */ + /* flipped :: If set, flip the direction of the outline. */ + /* */ + /* */ + /* 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 = ( i + j ) / 2; + + if ( ras.band_top >= 7 || k < i ) + { + ras.band_top = 0; + ras.error = Raster_Err_Invalid; + + return ras.error; + } + + ras.band_stack[ras.band_top + 1].y_min = k; + ras.band_stack[ras.band_top + 1].y_max = j; + + ras.band_stack[ras.band_top].y_max = k - 1; + + ras.band_top++; + } + else + { + if ( ras.fProfile ) + if ( Draw_Sweep( RAS_VAR ) ) + return ras.error; + ras.band_top--; + } + } + + return SUCCESS; + } + + + /*************************************************************************/ + /* */ + /* */ + /* Render_Glyph */ + /* */ + /* */ + /* Renders a glyph in a bitmap. Sub-banding if needed. */ + /* */ + /* */ + /* 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; + ras.dropOutControl = 2; + ras.second_pass = !( 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 = ras.target.rows - 1; + + ras.bWidth = 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 = ras.target.width - 1; + + if ( ( error = Render_Single_Pass( RAS_VARS 1 ) ) != 0 ) + return error; + } + + return FT_Err_Ok; + } + + +#ifdef FT_RASTER_OPTION_ANTI_ALIASING + + + /*************************************************************************/ + /* */ + /* */ + /* Render_Gray_Glyph */ + /* */ + /* */ + /* Renders a glyph with grayscaling. Sub-banding if needed. */ + /* */ + /* */ + /* 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; + 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 FT_Err_Ok; + } + +#else /* FT_RASTER_OPTION_ANTI_ALIASING */ + + FT_LOCAL_DEF + FT_Error Render_Gray_Glyph( RAS_ARG ) + { + FT_UNUSED_RASTER; + + return FT_Err_Cannot_Render_Glyph; + } + +#endif /* FT_RASTER_OPTION_ANTI_ALIASING */ + + + static + void ft_black_init( TRaster_Instance* raster ) + { + FT_UInt n; + FT_ULong c; + + + /* setup count table */ + for ( n = 0; n < 256; n++ ) + { + c = ( n & 0x55 ) + ( ( n & 0xAA ) >> 1 ); + + c = ( ( c << 6 ) & 0x3000 ) | + ( ( c << 4 ) & 0x0300 ) | + ( ( c << 2 ) & 0x0030 ) | + (c & 0x0003 ); + + raster->count_table[n] = c; + } + +#ifdef FT_RASTER_OPTION_ANTI_ALIASING + + /* 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 FT_RasterRec_ the_raster; + + + *araster = &the_raster; + memset( &the_raster, sizeof ( the_raster ), 0 ); + ft_black_init( &the_raster ); + + return 0; + } + + + static + void ft_black_done( FT_Raster raster ) + { + /* nothing */ + raster->init = 0; + } + + +#else /* _STANDALONE_ */ + + + static + int ft_black_new( FT_Memory memory, + TRaster_Instance** araster ) + { + FT_Error error; + TRaster_Instance* raster; + + + *araster = 0; + if ( !ALLOC( raster, sizeof ( *raster ) ) ) + { + raster->memory = memory; + ft_black_init( raster ); + + *araster = raster; + } + + return error; + } + + + static + void ft_black_done( TRaster_Instance* raster ) + { + FT_Memory memory = (FT_Memory)raster->memory; + FREE( raster ); + } + + +#endif /* _STANDALONE_ */ + + + static + void ft_black_reset( TRaster_Instance* raster, + const char* pool_base, + long pool_size ) + { + if ( raster && pool_base && pool_size >= 4096 ) + { + /* save the pool */ + raster->buff = (PLong)pool_base; + raster->sizeBuff = raster->buff + pool_size / sizeof ( Long ); + } + } + + + static + void ft_black_set_mode( TRaster_Instance* 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( TRaster_Instance* raster, + FT_Raster_Params* params ) + { + FT_Outline* outline = (FT_Outline*)params->source; + FT_Bitmap* target_map = params->target; + + + if ( !raster || !raster->buff || !raster->sizeBuff ) + 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; + + if ( !target_map || !target_map->buffer ) + return Raster_Err_Invalid; + + /* this version of the raster does not support direct rendering, sorry */ + if ( params->flags & ft_raster_flag_direct ) + return Raster_Err_Unsupported; + + ras.outline = *outline; + ras.target = *target_map; + + return ( ( params->flags & ft_raster_flag_aa ) + ? Render_Gray_Glyph( raster ) + : Render_Glyph( raster ) ); + } + + + 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 */ Index: xc/extras/freetype2/src/raster/ftraster.h diff -u /dev/null xc/extras/freetype2/src/raster/ftraster.h:1.1.1.1 --- /dev/null Mon Dec 18 14:22:39 2000 +++ xc/extras/freetype2/src/raster/ftraster.h Fri Dec 8 16:26:22 2000 @@ -0,0 +1,50 @@ +/***************************************************************************/ +/* */ +/* ftraster.h */ +/* */ +/* The FreeType glyph rasterizer (specification). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#ifndef FTRASTER_H +#define FTRASTER_H + +#ifdef __cplusplus + extern "C" { +#endif + +#include + + + /*************************************************************************/ + /* */ + /* Uncomment the following line if you are using ftraster.c as a */ + /* standalone module, fully independent of FreeType. */ + /* */ +/* #define _STANDALONE_ */ + +#ifndef FT_EXPORT_VAR +#define FT_EXPORT_VAR( x ) extern x +#endif + + FT_EXPORT_VAR( const FT_Raster_Funcs ) ft_standard_raster; + +#ifdef __cplusplus + } +#endif + + +#endif /* FTRASTER_H */ + + +/* END */ Index: xc/extras/freetype2/src/raster/ftrend1.c diff -u /dev/null xc/extras/freetype2/src/raster/ftrend1.c:1.1.1.1 --- /dev/null Mon Dec 18 14:22:39 2000 +++ xc/extras/freetype2/src/raster/ftrend1.c Fri Dec 8 16:26:22 2000 @@ -0,0 +1,278 @@ +/***************************************************************************/ +/* */ +/* ftrend1.c */ +/* */ +/* The FreeType glyph rasterizer interface (body). */ +/* */ +/* 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 +#include + + +#ifdef FT_FLAT_COMPILE + +#include "ftrend1.h" +#include "ftraster.h" + +#else + +#include +#include + +#endif + + + /* 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 FT_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, + FT_Matrix* matrix, + FT_Vector* delta ) + { + FT_Error error = FT_Err_Ok; + + + if ( slot->format != render->glyph_format ) + { + error = FT_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 ) + { + MEM_Set( cbox, 0, 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_UInt mode, + 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 = FT_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 FT_Err_Cannot_Render_Glyph; + } + else + { + /* raster5 is only capable of producing 5-gray-levels bitmaps */ + if ( render->clazz == &ft_raster5_renderer_class ) + return FT_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 &= -64; + cbox.yMin &= -64; + cbox.xMax = ( cbox.xMax + 63 ) & -64; + cbox.yMax = ( cbox.yMax + 63 ) & -64; + + width = ( cbox.xMax - cbox.xMin ) >> 6; + height = ( cbox.yMax - cbox.yMin ) >> 6; + bitmap = &slot->bitmap; + memory = render->root.memory; + + /* release old bitmap buffer */ + if ( slot->flags & ft_glyph_own_bitmap ) + { + FREE( bitmap->buffer ); + slot->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 = ( width + 3 ) & -4; + bitmap->pixel_mode = ft_pixel_mode_grays; + bitmap->num_grays = 256; + } + else + { + pitch = ( width + 7 ) >> 3; + bitmap->pixel_mode = ft_pixel_mode_mono; + } + + bitmap->width = width; + bitmap->rows = height; + bitmap->pitch = pitch; + + if ( ALLOC( bitmap->buffer, (FT_ULong)pitch * height ) ) + goto Exit; + + slot->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_grays ) + params.flags |= ft_raster_flag_aa; + + /* render outline into the bitmap */ + error = render->raster_render( render->raster, ¶ms ); + if ( error ) + goto Exit; + + slot->format = ft_glyph_format_bitmap; + slot->bitmap_left = cbox.xMin >> 6; + slot->bitmap_top = 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, + + (FTRenderer_render) ft_raster1_render, + (FTRenderer_transform)ft_raster1_transform, + (FTRenderer_getCBox) ft_raster1_get_cbox, + (FTRenderer_setMode) 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, + + (FTRenderer_render) ft_raster1_render, + (FTRenderer_transform)ft_raster1_transform, + (FTRenderer_getCBox) ft_raster1_get_cbox, + (FTRenderer_setMode) ft_raster1_set_mode, + + (FT_Raster_Funcs*) &ft_standard_raster + }; + + +/* END */ Index: xc/extras/freetype2/src/raster/ftrend1.h diff -u /dev/null xc/extras/freetype2/src/raster/ftrend1.h:1.1.1.1 --- /dev/null Mon Dec 18 14:22:39 2000 +++ xc/extras/freetype2/src/raster/ftrend1.h Fri Dec 8 16:26:22 2000 @@ -0,0 +1,48 @@ +/***************************************************************************/ +/* */ +/* ftrend1.h */ +/* */ +/* The FreeType glyph rasterizer interface (specification). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#ifndef FTREND1_H +#define FTREND1_H + + +#include + + +#ifdef __cplusplus + extern "C" { +#endif + + + 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; + + +#ifdef __cplusplus + } +#endif + + +#endif /* FTREND1_H */ + + +/* END */ Index: xc/extras/freetype2/src/raster/module.mk diff -u /dev/null xc/extras/freetype2/src/raster/module.mk:1.1.1.1 --- /dev/null Mon Dec 18 14:22:39 2000 +++ xc/extras/freetype2/src/raster/module.mk Fri Dec 8 16:26:23 2000 @@ -0,0 +1,22 @@ +# +# FreeType 2 renderer module definition +# + + +# 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. + + +make_module_list: add_raster_module + +add_raster_module: + $(OPEN_DRIVER)ft_raster1_renderer_class$(CLOSE_DRIVER) + $(ECHO_DRIVER)raster $(ECHO_DRIVER_DESC)monochrome bitmap renderer$(ECHO_DRIVER_DONE) + +# EOF Index: xc/extras/freetype2/src/raster/raster.c diff -u /dev/null xc/extras/freetype2/src/raster/raster.c:1.1.1.1 --- /dev/null Mon Dec 18 14:22:39 2000 +++ xc/extras/freetype2/src/raster/raster.c Fri Dec 8 16:26:23 2000 @@ -0,0 +1,35 @@ +/***************************************************************************/ +/* */ +/* raster1.c */ +/* */ +/* FreeType monochrome rasterer module component (body only). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#define FT_MAKE_OPTION_SINGLE_OBJECT + + +#ifdef FT_FLAT_COMPILE + +#include "ftraster.c" +#include "ftrend1.c" + +#else + +#include +#include + +#endif + + +/* END */ Index: xc/extras/freetype2/src/raster/rules.mk diff -u /dev/null xc/extras/freetype2/src/raster/rules.mk:1.1.1.1 --- /dev/null Mon Dec 18 14:22:39 2000 +++ xc/extras/freetype2/src/raster/rules.mk Fri Dec 8 16:26:23 2000 @@ -0,0 +1,69 @@ +# +# FreeType 2 renderer module build rules +# + + +# 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. + + +# raster1 driver directory +# +RAS1_DIR := $(SRC_)raster +RAS1_DIR_ := $(RAS1_DIR)$(SEP) + +# compilation flags for the driver +# +RAS1_COMPILE := $(FT_COMPILE) + + +# raster1 driver sources (i.e., C files) +# +RAS1_DRV_SRC := $(RAS1_DIR_)ftraster.c \ + $(RAS1_DIR_)ftrend1.c + + +# raster1 driver headers +# +RAS1_DRV_H := $(RAS1_DRV_SRC:%.c=%.h) + + +# raster1 driver object(s) +# +# RAS1_DRV_OBJ_M is used during `multi' builds. +# RAS1_DRV_OBJ_S is used during `single' builds. +# +RAS1_DRV_OBJ_M := $(RAS1_DRV_SRC:$(RAS1_DIR_)%.c=$(OBJ_)%.$O) +RAS1_DRV_OBJ_S := $(OBJ_)raster.$O + +# raster1 driver source file for single build +# +RAS1_DRV_SRC_S := $(RAS1_DIR_)raster.c + + +# raster1 driver - single object +# +$(RAS1_DRV_OBJ_S): $(RAS1_DRV_SRC_S) $(RAS1_DRV_SRC) \ + $(FREETYPE_H) $(RAS1_DRV_H) + $(RAS1_COMPILE) $T$@ $(RAS1_DRV_SRC_S) + + +# raster1 driver - multiple objects +# +$(OBJ_)%.$O: $(RAS1_DIR_)%.c $(FREETYPE_H) $(RAS1_DRV_H) + $(RAS1_COMPILE) $T$@ $< + + +# update main driver object lists +# +DRV_OBJS_S += $(RAS1_DRV_OBJ_S) +DRV_OBJS_M += $(RAS1_DRV_OBJ_M) + + +# EOF Index: xc/extras/freetype2/src/sfnt/module.mk diff -u /dev/null xc/extras/freetype2/src/sfnt/module.mk:1.1.1.1 --- /dev/null Mon Dec 18 14:22:39 2000 +++ xc/extras/freetype2/src/sfnt/module.mk Fri Dec 8 16:26:23 2000 @@ -0,0 +1,22 @@ +# +# FreeType 2 SFNT module definition +# + + +# 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. + + +make_module_list: add_sfnt_module + +add_sfnt_module: + $(OPEN_DRIVER)sfnt_module_class$(CLOSE_DRIVER) + $(ECHO_DRIVER)sfnt $(ECHO_DRIVER_DESC)helper module for TrueType & OpenType formats$(ECHO_DRIVER_DONE) + +# EOF Index: xc/extras/freetype2/src/sfnt/rules.mk diff -u /dev/null xc/extras/freetype2/src/sfnt/rules.mk:1.1.1.1 --- /dev/null Mon Dec 18 14:22:39 2000 +++ xc/extras/freetype2/src/sfnt/rules.mk Fri Dec 8 16:26:23 2000 @@ -0,0 +1,73 @@ +# +# FreeType 2 SFNT driver configuration rules +# + + +# 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. + + +# SFNT driver directory +# +SFNT_DIR := $(SRC_)sfnt +SFNT_DIR_ := $(SFNT_DIR)$(SEP) + + +# compilation flags for the driver +# +SFNT_COMPILE := $(FT_COMPILE) + + +# SFNT driver sources (i.e., C files) +# +SFNT_DRV_SRC := $(SFNT_DIR_)ttload.c \ + $(SFNT_DIR_)ttcmap.c \ + $(SFNT_DIR_)ttsbit.c \ + $(SFNT_DIR_)ttpost.c \ + $(SFNT_DIR_)sfobjs.c \ + $(SFNT_DIR_)sfdriver.c + +# SFNT driver headers +# +SFNT_DRV_H := $(SFNT_DRV_SRC:%c=%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_)%.$O) +SFNT_DRV_OBJ_S := $(OBJ_)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$@ $(SFNT_DRV_SRC_S) + + +# SFNT driver - multiple objects +# +$(OBJ_)%.$O: $(SFNT_DIR_)%.c $(FREETYPE_H) $(SFNT_DRV_H) + $(SFNT_COMPILE) $T$@ $< + + +# update main driver object lists +# +DRV_OBJS_S += $(SFNT_DRV_OBJ_S) +DRV_OBJS_M += $(SFNT_DRV_OBJ_M) + + +# EOF Index: xc/extras/freetype2/src/sfnt/sfdriver.c diff -u /dev/null xc/extras/freetype2/src/sfnt/sfdriver.c:1.1.1.1 --- /dev/null Mon Dec 18 14:22:39 2000 +++ xc/extras/freetype2/src/sfnt/sfdriver.c Fri Dec 8 16:26:23 2000 @@ -0,0 +1,243 @@ +/***************************************************************************/ +/* */ +/* sfdriver.c */ +/* */ +/* High-level SFNT driver interface (body). */ +/* */ +/* 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 +#include + + +#ifdef FT_FLAT_COMPILE + +#include "sfdriver.h" +#include "ttload.h" +#include "ttcmap.h" +#include "sfobjs.h" + +#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS +#include "ttsbit.h" +#endif + +#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES +#include "ttpost.h" +#endif + +#else + +#include +#include +#include +#include + +#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS +#include +#endif + +#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES +#include +#endif + +#endif + + +#include /* for strcmp() */ + + + 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 == 0xFFFF ? 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; + } + + +#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES + + + static + FT_Error get_sfnt_glyph_name( TT_Face face, + FT_UInt glyph_index, + FT_Pointer buffer, + FT_UInt buffer_max ) + { + FT_String* gname; + FT_Error error; + + + error = TT_Get_PS_Name( face, glyph_index, &gname ); + if ( !error && buffer_max > 0 ) + { + FT_UInt len = strlen( gname ); + + + if ( len >= buffer_max ) + len = buffer_max - 1; + + MEM_Copy( buffer, gname, len ); + ((FT_Byte*)buffer)[len] = 0; + } + + return error; + } + + +#endif /* TT_CONFIG_OPTION_POSTSCRIPT_NAMES */ + + + FT_CALLBACK_DEF + FT_Module_Interface SFNT_Get_Interface( FT_Module module, + const char* interface ) + { + FT_UNUSED( module ); + + if ( strcmp( interface, "get_sfnt" ) == 0 ) + return (FT_Module_Interface)get_sfnt_table; + +#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES + if ( strcmp( interface, "glyph_name" ) == 0 ) + return (FT_Module_Interface)get_sfnt_glyph_name; +#endif + return 0; + } + + + static + const SFNT_Interface sfnt_interface = + { + TT_Goto_Table, + + SFNT_Init_Face, + SFNT_Load_Face, + SFNT_Done_Face, + SFNT_Get_Interface, + + TT_Load_Any, + TT_Load_SFNT_Header, + TT_Load_Directory, + + TT_Load_Header, + TT_Load_Metrics_Header, + TT_Load_CMap, + TT_Load_MaxProfile, + TT_Load_OS2, + TT_Load_PostScript, + + TT_Load_Names, + TT_Free_Names, + + TT_Load_Hdmx, + TT_Free_Hdmx, + + TT_Load_Kern, + TT_Load_Gasp, + TT_Load_PCLT, + +#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS + + /* see `ttload.h' */ + TT_Load_Bitmap_Header, + + /* see `ttsbit.h' */ + TT_Set_SBit_Strike, + TT_Load_SBit_Strikes, + TT_Load_SBit_Image, + TT_Free_SBit_Strikes, + +#else /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */ + + 0, + 0, + 0, + 0, + 0, + +#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */ + +#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES + + /* see `ttpost.h' */ + TT_Get_PS_Name, + TT_Free_Post_Names, + +#else /* TT_CONFIG_OPTION_POSTSCRIPT_NAMES */ + + 0, + 0, + +#endif /* TT_CONFIG_OPTION_POSTSCRIPT_NAMES */ + + /* see `ttcmap.h' */ + TT_CharMap_Load, + TT_CharMap_Free, + }; + + + 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 */ Index: xc/extras/freetype2/src/sfnt/sfdriver.h diff -u /dev/null xc/extras/freetype2/src/sfnt/sfdriver.h:1.1.1.1 --- /dev/null Mon Dec 18 14:22:40 2000 +++ xc/extras/freetype2/src/sfnt/sfdriver.h Fri Dec 8 16:26:23 2000 @@ -0,0 +1,40 @@ +/***************************************************************************/ +/* */ +/* sfdriver.h */ +/* */ +/* High-level SFNT driver interface (specification). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#ifndef SFDRIVER_H +#define SFDRIVER_H + +#include + +#ifdef __cplusplus + extern "C" { +#endif + + + FT_EXPORT_VAR( const FT_Module_Class ) sfnt_module_class; + + +#ifdef __cplusplus + } +#endif + + +#endif /* SFDRIVER_H */ + + +/* END */ Index: xc/extras/freetype2/src/sfnt/sfnt.c diff -u /dev/null xc/extras/freetype2/src/sfnt/sfnt.c:1.1.1.1 --- /dev/null Mon Dec 18 14:22:40 2000 +++ xc/extras/freetype2/src/sfnt/sfnt.c Fri Dec 8 16:26:23 2000 @@ -0,0 +1,57 @@ +/***************************************************************************/ +/* */ +/* sfnt.c */ +/* */ +/* Single object library component. */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#define FT_MAKE_OPTION_SINGLE_OBJECT + + +#ifdef FT_FLAT_COMPILE + +#include "ttload.c" +#include "ttcmap.c" +#include "sfobjs.c" + +#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS +#include "ttsbit.c" +#endif + +#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES +#include "ttpost.c" +#endif + +#include "sfdriver.c" + +#else /* FT_FLAT_COMPILE */ + +#include +#include +#include + +#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS +#include +#endif + +#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES +#include +#endif + +#include + +#endif /* FT_FLAT_COMPILE */ + + +/* END */ Index: xc/extras/freetype2/src/sfnt/sfobjs.c diff -u /dev/null xc/extras/freetype2/src/sfnt/sfobjs.c:1.1.1.1 --- /dev/null Mon Dec 18 14:22:40 2000 +++ xc/extras/freetype2/src/sfnt/sfobjs.c Fri Dec 8 16:26:23 2000 @@ -0,0 +1,681 @@ +/***************************************************************************/ +/* */ +/* sfobjs.c */ +/* */ +/* SFNT object management (base). */ +/* */ +/* Copyright 1996-2000 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifdef FT_FLAT_COMPILE + +#include "sfobjs.h" +#include "ttload.h" + +#else + +#include +#include + +#endif + + +#include +#include +#include +#include +#include + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an 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 + + + /*************************************************************************/ + /* */ + /* */ + /* Get_Name */ + /* */ + /* */ + /* Returns a given ENGLISH name record in ASCII. */ + /* */ + /* */ + /* face :: A handle to the source face object. */ + /* */ + /* nameid :: The name id of the name record to return. */ + /* */ + /* */ + /* Character string. NULL if no name is present. */ + /* */ + static + FT_String* Get_Name( TT_Face face, + FT_UShort nameid ) + { + FT_Memory memory = face->root.memory; + FT_UShort n; + TT_NameRec* rec; + FT_Bool wide_chars = 1; + + + rec = face->name_table.names; + for ( n = 0; n < face->name_table.numNameRecords; n++, rec++ ) + { + if ( rec->nameID == nameid ) + { + /* found the name -- now create an ASCII string from it */ + FT_Bool found = 0; + + + /* test for Microsoft English language */ + if ( rec->platformID == TT_PLATFORM_MICROSOFT && + rec->encodingID <= TT_MS_ID_UNICODE_CS && + ( rec->languageID & 0x3FF ) == 0x009 ) + found = 1; + + /* test for Apple Unicode encoding */ + else if ( rec->platformID == TT_PLATFORM_APPLE_UNICODE ) + found = 1; + + /* test for Apple Roman */ + else if ( rec->platformID == TT_PLATFORM_MACINTOSH && + rec->languageID == TT_MAC_ID_ROMAN ) + { + found = 1; + wide_chars = 0; + } + + /* found a Unicode name */ + if ( found ) + { + FT_String* string; + FT_UInt len; + + + if ( wide_chars ) + { + FT_UInt m; + + + len = (FT_UInt)rec->stringLength / 2; + if ( MEM_Alloc( string, len + 1 ) ) + return NULL; + + for ( m = 0; m < len; m ++ ) + string[m] = rec->string[2 * m + 1]; + } + else + { + len = rec->stringLength; + if ( MEM_Alloc( string, len + 1 ) ) + return NULL; + + MEM_Copy( string, rec->string, len ); + } + + string[len] = '\0'; + return string; + } + } + } + + return NULL; + } + + + static + FT_Encoding 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_symbol }, + { 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; + } + + + 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_Interface* sfnt; + SFNT_Header sfnt_header; + + /* for now, parameters are unused */ + FT_UNUSED( num_params ); + FT_UNUSED( params ); + + sfnt = (SFNT_Interface*)face->sfnt; + if ( !sfnt ) + { + sfnt = (SFNT_Interface*)FT_Get_Module_Interface( library, "sfnt" ); + if ( !sfnt ) + { + error = FT_Err_Invalid_File_Format; + goto Exit; + } + + face->sfnt = sfnt; + face->goto_table = sfnt->goto_table; + } + + if ( !face->psnames ) + { + face->psnames = (PSNames_Interface*) + FT_Get_Module_Interface( library, "psnames" ); + } + + /* check that we have a valid TrueType file */ + error = sfnt->load_sfnt_header( face, stream, face_index, &sfnt_header ); + if ( error ) + goto Exit; + + face->format_tag = sfnt_header.format_tag; + face->num_tables = sfnt_header.num_tables; + + /* Load font directory */ + error = sfnt->load_directory( face, stream, &sfnt_header ); + if ( error ) + goto Exit; + + face->root.num_faces = face->ttc_header.count; + if ( face->root.num_faces < 1 ) + face->root.num_faces = 1; + + Exit: + return error; + } + + +#undef LOAD_ +#define LOAD_( x ) ( ( error = sfnt->load_##x( face, stream ) ) \ + != TT_Err_Ok ) + + + 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; + FT_Bool has_outline; + FT_Bool is_apple_sbit; + + SFNT_Interface* sfnt = (SFNT_Interface*)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. */ + /* */ + + /* do we have outlines in there? */ + has_outline = ( ( TT_LookUp_Table( face, TTAG_glyf ) != 0 ) || + ( TT_LookUp_Table( face, TTAG_CFF ) != 0 ) ); + is_apple_sbit = 0; + +#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS + + /* if this font doesn't contain outlines, we try to load */ + /* a `bhed' table */ + if ( !has_outline ) + is_apple_sbit = !LOAD_( bitmap_header ); + +#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */ + + /* load the font header (`head' table) if this isn't an Apple */ + /* sbit font file */ + if ( !is_apple_sbit && LOAD_( header ) ) + goto Exit; + + /* load other tables */ + if ( LOAD_( max_profile ) || + LOAD_( charmaps ) || + LOAD_( names ) || + LOAD_( psnames ) ) + goto Exit; + + /* 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 at once */ + error = sfnt->load_metrics( face, stream, 0 ); + if ( error ) + goto Exit; + + /* try to load the `vhea' and `vmtx' tables at once */ + error = sfnt->load_metrics( face, stream, 1 ); + if ( error ) + goto Exit; + + if ( LOAD_( os2 ) ) + goto Exit; + } + + /* the optional tables */ + +#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS + + /* embedded bitmap support. */ + if ( sfnt->load_sbits && LOAD_( sbits ) ) + { + /* return an error if this font file has no outlines */ + if ( error == TT_Err_Table_Missing && has_outline ) + error = FT_Err_Ok; + else + goto Exit; + } +#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */ + + if ( LOAD_( hdmx ) || + LOAD_( gasp ) || + LOAD_( kerning ) || + LOAD_( pclt ) ) + goto Exit; + +#ifdef TT_CONFIG_OPTION_EXTEND_ENGINE + if ( ( error = TT_Extension_Create( face ) ) != TT_Err_Ok ) + goto Exit; +#endif + + face->root.family_name = Get_Name( face, TT_NAME_ID_FONT_FAMILY ); + face->root.style_name = Get_Name( face, TT_NAME_ID_FONT_SUBFAMILY ); + + /* now set up root fields */ + { + FT_Face root = &face->root; + FT_Int flags = 0; + TT_CharMap charmap; + FT_Int n; + FT_Memory memory; + + + memory = root->memory; + + /*********************************************************************/ + /* */ + /* Compute face flags. */ + /* */ + if ( has_outline == TRUE ) + flags = FT_FACE_FLAG_SCALABLE; /* scalable outlines */ + + flags |= FT_FACE_FLAG_SFNT | /* SFNT file format */ + FT_FACE_FLAG_HORIZONTAL; /* horizontal data */ + +#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES + /* might need more polish to detect the presence of a Postscript */ + /* name table in the font */ + 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 ( face->kern_pairs ) + flags |= FT_FACE_FLAG_KERNING; + + root->face_flags = flags; + + /*********************************************************************/ + /* */ + /* Compute style flags. */ + /* */ + flags = 0; + if ( has_outline == TRUE && face->os2.version != 0xFFFF ) + { + /* 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. */ + /* */ + charmap = face->charmaps; + root->num_charmaps = face->num_charmaps; + + /* allocate table of pointers */ + if ( ALLOC_ARRAY( root->charmaps, root->num_charmaps, FT_CharMap ) ) + goto Exit; + + for ( n = 0; n < root->num_charmaps; n++, charmap++ ) + { + FT_Int platform = charmap->cmap.platformID; + FT_Int encoding = charmap->cmap.platformEncodingID; + + + charmap->root.face = (FT_Face)face; + charmap->root.platform_id = platform; + charmap->root.encoding_id = encoding; + charmap->root.encoding = find_encoding( platform, encoding ); + + /* now, set root->charmap with a unicode charmap */ + /* wherever available */ + if ( !root->charmap && + charmap->root.encoding == ft_encoding_unicode ) + root->charmap = (FT_CharMap)charmap; + + root->charmaps[n] = (FT_CharMap)charmap; + } + +#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS + + if ( face->num_sbit_strikes ) + { + root->face_flags |= FT_FACE_FLAG_FIXED_SIZES; + +#if 0 + /* I don't know criteria whether layout is horizontal or vertical */ + if ( has_outline.... ) + { + ... + root->face_flags |= FT_FACE_FLAG_VERTICAL; + } +#endif + root->num_fixed_sizes = face->num_sbit_strikes; + + if ( ALLOC_ARRAY( root->available_sizes, + face->num_sbit_strikes, + FT_Bitmap_Size ) ) + goto Exit; + + for ( n = 0 ; n < face->num_sbit_strikes ; n++ ) + { + root->available_sizes[n].width = + face->sbit_strikes[n].x_ppem; + + root->available_sizes[n].height = + face->sbit_strikes[n].y_ppem; + } + } + else + +#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */ + + { + root->num_fixed_sizes = 0; + root->available_sizes = 0; + } + + /*********************************************************************/ + /* */ + /* Set up metrics. */ + /* */ + if ( has_outline == TRUE ) + { + /* XXX What about if outline header is missing */ + /* (e.g. sfnt wrapped outline)? */ + 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, certains 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 = root->ascender - root->descender + + face->horizontal.Line_Gap; + + /* 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 = ( root->height * 115 + 50 ) / 100; + +#if 0 + + /* some fonts have the OS/2 "sTypoAscender", "sTypoDescender" & */ + /* "sTypoLineGap" fields set to 0, like ARIALNB.TTF */ + if ( face->os2.version != 0xFFFF && 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 = face->vertical_info + ? face->vertical.advance_Height_Max + : root->height; + + root->underline_position = face->postscript.underlinePosition; + root->underline_thickness = face->postscript.underlineThickness; + + /* root->max_points -- already set up */ + /* root->max_contours -- already set up */ + } + } + + Exit: + return error; + } + + +#undef LOAD_ + + + FT_LOCAL_DEF + void SFNT_Done_Face( TT_Face face ) + { + FT_Memory memory = face->root.memory; + SFNT_Interface* sfnt = (SFNT_Interface*)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_sbits ) + sfnt->free_sbits( face ); + } + + /* freeing the kerning table */ + FREE( face->kern_pairs ); + face->num_kern_pairs = 0; + + /* freeing the collection table */ + FREE( face->ttc_header.offsets ); + face->ttc_header.count = 0; + + /* freeing table directory */ + FREE( face->dir_tables ); + face->num_tables = 0; + + /* freeing the character mapping tables */ + if ( sfnt && sfnt->load_charmaps ) + { + FT_UShort n; + + + for ( n = 0; n < face->num_charmaps; n++ ) + sfnt->free_charmap( face, &face->charmaps[n].cmap ); + } + + FREE( face->charmaps ); + face->num_charmaps = 0; + + FREE( face->root.charmaps ); + face->root.num_charmaps = 0; + face->root.charmap = 0; + + /* freeing the horizontal metrics */ + FREE( face->horizontal.long_metrics ); + FREE( face->horizontal.short_metrics ); + + /* freeing the vertical ones, if any */ + if ( face->vertical_info ) + { + FREE( face->vertical.long_metrics ); + FREE( face->vertical.short_metrics ); + face->vertical_info = 0; + } + + /* freeing the gasp table */ + FREE( face->gasp.gaspRanges ); + face->gasp.numRanges = 0; + + /* freeing the name table */ + sfnt->free_names( face ); + + /* freeing the hdmx table */ + sfnt->free_hdmx( face ); + + /* freeing family and style name */ + FREE( face->root.family_name ); + FREE( face->root.style_name ); + + /* freeing sbit size table */ + face->root.num_fixed_sizes = 0; + if ( face->root.available_sizes ) + FREE( face->root.available_sizes ); + + face->sfnt = 0; + } + + +/* END */ Index: xc/extras/freetype2/src/sfnt/sfobjs.h diff -u /dev/null xc/extras/freetype2/src/sfnt/sfobjs.h:1.1.1.1 --- /dev/null Mon Dec 18 14:22:40 2000 +++ xc/extras/freetype2/src/sfnt/sfobjs.h Fri Dec 8 16:26:23 2000 @@ -0,0 +1,57 @@ +/***************************************************************************/ +/* */ +/* sfobjs.h */ +/* */ +/* SFNT object management (specification). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#ifndef SFOBJS_H +#define SFOBJS_H + +#include +#include + + +#ifdef __cplusplus + extern "C" { +#endif + + + 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 ); + + +#ifdef __cplusplus + } +#endif + + +#endif /* SFDRIVER_H */ + + +/* END */ Index: xc/extras/freetype2/src/sfnt/ttcmap.c diff -u /dev/null xc/extras/freetype2/src/sfnt/ttcmap.c:1.1.1.1 --- /dev/null Mon Dec 18 14:22:40 2000 +++ xc/extras/freetype2/src/sfnt/ttcmap.c Fri Dec 8 16:26:23 2000 @@ -0,0 +1,554 @@ +/***************************************************************************/ +/* */ +/* ttcmap.c */ +/* */ +/* TrueType character mapping table (cmap) support (body). */ +/* */ +/* 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 +#include + + +#ifdef FT_FLAT_COMPILE + +#include "ttload.h" +#include "ttcmap.h" + +#else + +#include +#include + +#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_ttcmap + + + FT_CALLBACK_DEF + FT_UInt code_to_index0( TT_CMapTable* charmap, + FT_ULong char_code ); + FT_CALLBACK_DEF + FT_UInt code_to_index2( TT_CMapTable* charmap, + FT_ULong char_code ); + FT_CALLBACK_DEF + FT_UInt code_to_index4( TT_CMapTable* charmap, + FT_ULong char_code ); + FT_CALLBACK_DEF + FT_UInt code_to_index6( TT_CMapTable* charmap, + FT_ULong char_code ); + + + /*************************************************************************/ + /* */ + /* */ + /* TT_CharMap_Load */ + /* */ + /* */ + /* Loads a given TrueType character map into memory. */ + /* */ + /* */ + /* face :: A handle to the parent face object. */ + /* stream :: A handle to the current stream object. */ + /* */ + /* */ + /* table :: A pointer to a cmap object. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + /* */ + /* The function assumes that the stream is already in use (i.e., */ + /* opened). In case of error, all partially allocated tables are */ + /* released. */ + /* */ + FT_LOCAL_DEF + FT_Error TT_CharMap_Load( TT_Face face, + TT_CMapTable* cmap, + FT_Stream stream ) + { + FT_Error error; + FT_Memory memory; + FT_UShort num_SH, num_Seg, i; + + FT_UShort u, l; + + TT_CMap0* cmap0; + TT_CMap2* cmap2; + TT_CMap4* cmap4; + TT_CMap6* cmap6; + + TT_CMap2SubHeader* cmap2sub; + TT_CMap4Segment* segments; + + + if ( cmap->loaded ) + return TT_Err_Ok; + + memory = stream->memory; + + if ( FILE_Seek( cmap->offset ) ) + return error; + + switch ( cmap->format ) + { + case 0: + cmap0 = &cmap->c.cmap0; + + if ( ALLOC( cmap0->glyphIdArray, 256L ) || + FILE_Read( cmap0->glyphIdArray, 256L ) ) + goto Fail; + + cmap->get_index = code_to_index0; + break; + + case 2: + num_SH = 0; + cmap2 = &cmap->c.cmap2; + + /* allocate subheader keys */ + + if ( ALLOC_ARRAY( cmap2->subHeaderKeys, 256, FT_UShort ) || + ACCESS_Frame( 512L ) ) + goto Fail; + + for ( i = 0; i < 256; i++ ) + { + u = GET_UShort() / 8; + cmap2->subHeaderKeys[i] = u; + + if ( num_SH < u ) + num_SH = u; + } + + FORGET_Frame(); + + /* load subheaders */ + + cmap2->numGlyphId = l = + ( ( cmap->length - 2L * ( 256 + 3 ) - num_SH * 8L ) & 0xFFFF ) / 2; + + if ( ALLOC_ARRAY( cmap2->subHeaders, + num_SH + 1, + TT_CMap2SubHeader ) || + ACCESS_Frame( ( num_SH + 1 ) * 8L ) ) + goto Fail; + + cmap2sub = cmap2->subHeaders; + + for ( i = 0; i <= num_SH; i++ ) + { + cmap2sub->firstCode = GET_UShort(); + cmap2sub->entryCount = GET_UShort(); + cmap2sub->idDelta = GET_Short(); + /* we apply the location offset immediately */ + cmap2sub->idRangeOffset = GET_UShort() - ( num_SH - i ) * 8 - 2; + + cmap2sub++; + } + + FORGET_Frame(); + + /* load glyph IDs */ + + if ( ALLOC_ARRAY( cmap2->glyphIdArray, l, FT_UShort ) || + ACCESS_Frame( l * 2L ) ) + goto Fail; + + for ( i = 0; i < l; i++ ) + cmap2->glyphIdArray[i] = GET_UShort(); + + FORGET_Frame(); + + cmap->get_index = code_to_index2; + break; + + case 4: + cmap4 = &cmap->c.cmap4; + + /* load header */ + + if ( ACCESS_Frame( 8L ) ) + goto Fail; + + cmap4->segCountX2 = GET_UShort(); + cmap4->searchRange = GET_UShort(); + cmap4->entrySelector = GET_UShort(); + cmap4->rangeShift = GET_UShort(); + + num_Seg = cmap4->segCountX2 / 2; + + FORGET_Frame(); + + /* load segments */ + + if ( ALLOC_ARRAY( cmap4->segments, + num_Seg, + TT_CMap4Segment ) || + ACCESS_Frame( ( num_Seg * 4 + 1 ) * 2L ) ) + goto Fail; + + segments = cmap4->segments; + + for ( i = 0; i < num_Seg; i++ ) + segments[i].endCount = GET_UShort(); + + (void)GET_UShort(); + + for ( i = 0; i < num_Seg; i++ ) + segments[i].startCount = GET_UShort(); + + for ( i = 0; i < num_Seg; i++ ) + segments[i].idDelta = GET_Short(); + + for ( i = 0; i < num_Seg; i++ ) + segments[i].idRangeOffset = GET_UShort(); + + FORGET_Frame(); + + cmap4->numGlyphId = l = + ( ( cmap->length - ( 16L + 8L * num_Seg ) ) & 0xFFFF ) / 2; + + /* load IDs */ + + if ( ALLOC_ARRAY( cmap4->glyphIdArray, l, FT_UShort ) || + ACCESS_Frame( l * 2L ) ) + goto Fail; + + for ( i = 0; i < l; i++ ) + cmap4->glyphIdArray[i] = GET_UShort(); + + FORGET_Frame(); + + cmap->get_index = code_to_index4; + + cmap4->last_segment = cmap4->segments; + break; + + case 6: + cmap6 = &cmap->c.cmap6; + + if ( ACCESS_Frame( 4L ) ) + goto Fail; + + cmap6->firstCode = GET_UShort(); + cmap6->entryCount = GET_UShort(); + + FORGET_Frame(); + + l = cmap6->entryCount; + + if ( ALLOC_ARRAY( cmap6->glyphIdArray, + cmap6->entryCount, + FT_Short ) || + ACCESS_Frame( l * 2L ) ) + goto Fail; + + for ( i = 0; i < l; i++ ) + cmap6->glyphIdArray[i] = GET_UShort(); + + FORGET_Frame(); + cmap->get_index = code_to_index6; + break; + + default: /* corrupt character mapping table */ + return TT_Err_Invalid_CharMap_Format; + + } + + return TT_Err_Ok; + + Fail: + TT_CharMap_Free( face, cmap ); + return error; + } + + + /*************************************************************************/ + /* */ + /* */ + /* TT_CharMap_Free */ + /* */ + /* */ + /* Destroys a character mapping table. */ + /* */ + /* */ + /* face :: A handle to the parent face object. */ + /* cmap :: A handle to a cmap object. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF + FT_Error TT_CharMap_Free( TT_Face face, + TT_CMapTable* cmap ) + { + FT_Memory memory; + + + if ( !cmap ) + return TT_Err_Ok; + + memory = face->root.driver->root.memory; + + switch ( cmap->format ) + { + case 0: + FREE( cmap->c.cmap0.glyphIdArray ); + break; + + case 2: + FREE( cmap->c.cmap2.subHeaderKeys ); + FREE( cmap->c.cmap2.subHeaders ); + FREE( cmap->c.cmap2.glyphIdArray ); + break; + + case 4: + FREE( cmap->c.cmap4.segments ); + FREE( cmap->c.cmap4.glyphIdArray ); + cmap->c.cmap4.segCountX2 = 0; + break; + + case 6: + FREE( cmap->c.cmap6.glyphIdArray ); + cmap->c.cmap6.entryCount = 0; + break; + + default: + /* invalid table format, do nothing */ + ; + } + + cmap->loaded = FALSE; + return TT_Err_Ok; + } + + + /*************************************************************************/ + /* */ + /* */ + /* code_to_index0 */ + /* */ + /* */ + /* Converts the character code into a glyph index. Uses format 0. */ + /* `charCode' must be in the range 0x00-0xFF (otherwise 0 is */ + /* returned). */ + /* */ + /* */ + /* charCode :: The wanted character code. */ + /* cmap0 :: A pointer to a cmap table in format 0. */ + /* */ + /* */ + /* Glyph index into the glyphs array. 0 if the glyph does not exist. */ + /* */ + FT_CALLBACK_DEF + FT_UInt code_to_index0( TT_CMapTable* cmap, + FT_ULong charCode ) + { + TT_CMap0* cmap0 = &cmap->c.cmap0; + + + return ( charCode <= 0xFF ? cmap0->glyphIdArray[charCode] : 0 ); + } + + + /*************************************************************************/ + /* */ + /* */ + /* code_to_index2 */ + /* */ + /* */ + /* Converts the character code into a glyph index. Uses format 2. */ + /* */ + /* */ + /* charCode :: The wanted character code. */ + /* cmap2 :: A pointer to a cmap table in format 2. */ + /* */ + /* */ + /* Glyph index into the glyphs array. 0 if the glyph does not exist. */ + /* */ + FT_CALLBACK_DEF + FT_UInt code_to_index2( TT_CMapTable* cmap, + FT_ULong charCode ) + { + FT_UInt result, index1, offset; + FT_UInt char_lo; + FT_ULong char_hi; + TT_CMap2SubHeader* sh2; + TT_CMap2* cmap2; + + + cmap2 = &cmap->c.cmap2; + result = 0; + char_lo = (FT_UInt)( charCode & 0xFF ); + char_hi = charCode >> 8; + + if ( char_hi == 0 ) + { + /* an 8-bit character code -- we use the subHeader 0 in this case */ + /* to test whether the character code is in the charmap */ + if ( cmap2->subHeaderKeys[char_lo] == 0 ) + result = cmap2->glyphIdArray[char_lo]; + } + else + { + /* a 16-bit character code */ + index1 = cmap2->subHeaderKeys[char_hi & 0xFF]; + if ( index1 ) + { + sh2 = cmap2->subHeaders + index1; + char_lo -= sh2->firstCode; + + if ( char_lo < (FT_UInt)sh2->entryCount ) + { + offset = sh2->idRangeOffset / 2 + char_lo; + if ( offset < (FT_UInt)cmap2->numGlyphId ) + { + result = cmap2->glyphIdArray[offset]; + if ( result ) + result = ( result + sh2->idDelta ) & 0xFFFF; + } + } + } + } + + return result; + } + + + /*************************************************************************/ + /* */ + /* */ + /* code_to_index4 */ + /* */ + /* */ + /* Converts the character code into a glyph index. Uses format 4. */ + /* */ + /* */ + /* charCode :: The wanted character code. */ + /* cmap4 :: A pointer to a cmap table in format 4. */ + /* */ + /* */ + /* Glyph index into the glyphs array. 0 if the glyph does not exist. */ + /* */ + FT_CALLBACK_DEF + FT_UInt code_to_index4( TT_CMapTable* cmap, + FT_ULong charCode ) + { + FT_UInt result, index1, segCount; + TT_CMap4* cmap4; + TT_CMap4Segment *seg4, *limit; + + + cmap4 = &cmap->c.cmap4; + result = 0; + segCount = cmap4->segCountX2 / 2; + seg4 = cmap4->segments; + limit = seg4 + segCount; + + /* check against the last segment */ + seg4 = cmap4->last_segment; + + /* the following is equivalent to performing two tests, as in */ + /* */ + /* if ( charCode >= seg4->startCount && charCode <= seg4->endCount ) */ + /* */ + /* Yes, that's a bit strange, but it's faster, and the idea behind */ + /* the cache is to significantly speed up charcode to glyph index */ + /* conversion. */ + + if ( (FT_ULong)(charCode - seg4->startCount) < + (FT_ULong)(seg4->endCount - seg4->startCount) ) + goto Found; + + for ( seg4 = cmap4->segments; seg4 < limit; seg4++ ) + { + /* the ranges are sorted in increasing order. If we are out of */ + /* the range here, the char code isn't in the charmap, so exit. */ + + if ( charCode > (FT_UInt)seg4->endCount ) + continue; + + if ( charCode >= (FT_UInt)seg4->startCount ) + goto Found; + } + return 0; + + Found: + cmap4->last_segment = seg4; + + /* if the idRangeOffset is 0, we can compute the glyph index */ + /* directly */ + + if ( seg4->idRangeOffset == 0 ) + result = ( charCode + seg4->idDelta ) & 0xFFFF; + else + { + /* otherwise, we must use the glyphIdArray to do it */ + index1 = seg4->idRangeOffset / 2 + + ( charCode - seg4->startCount ) + + ( seg4 - cmap4->segments ) + - segCount; + + if ( index1 < (FT_UInt)cmap4->numGlyphId && + cmap4->glyphIdArray[index1] != 0 ) + result = ( cmap4->glyphIdArray[index1] + seg4->idDelta ) & 0xFFFF; + } + + return result; + } + + + /*************************************************************************/ + /* */ + /* */ + /* code_to_index6 */ + /* */ + /* */ + /* Converts the character code into a glyph index. Uses format 6. */ + /* */ + /* */ + /* charCode :: The wanted character code. */ + /* cmap6 :: A pointer to a cmap table in format 6. */ + /* */ + /* */ + /* Glyph index into the glyphs array. 0 if the glyph does not exist. */ + /* */ + FT_CALLBACK_DEF + FT_UInt code_to_index6( TT_CMapTable* cmap, + FT_ULong charCode ) + { + TT_CMap6* cmap6; + FT_UInt result = 0; + + + cmap6 = &cmap->c.cmap6; + result = 0; + charCode -= cmap6->firstCode; + + if ( charCode < (FT_UInt)cmap6->entryCount ) + result = cmap6->glyphIdArray[charCode]; + + return result; + } + + +/* END */ Index: xc/extras/freetype2/src/sfnt/ttcmap.h diff -u /dev/null xc/extras/freetype2/src/sfnt/ttcmap.h:1.1.1.1 --- /dev/null Mon Dec 18 14:22:40 2000 +++ xc/extras/freetype2/src/sfnt/ttcmap.h Fri Dec 8 16:26:23 2000 @@ -0,0 +1,45 @@ +/***************************************************************************/ +/* */ +/* ttcmap.h */ +/* */ +/* TrueType character mapping table (cmap) support (specification). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#ifndef TTCMAP_H +#define TTCMAP_H + +#include + +#ifdef __cplusplus + extern "C" { +#endif + + + FT_LOCAL + FT_Error TT_CharMap_Load( TT_Face face, + TT_CMapTable* cmap, + FT_Stream input ); + + FT_LOCAL + FT_Error TT_CharMap_Free( TT_Face face, + TT_CMapTable* cmap ); + +#ifdef __cplusplus + } +#endif + +#endif /* TTCMAP_H */ + + +/* END */ Index: xc/extras/freetype2/src/sfnt/ttload.c diff -u /dev/null xc/extras/freetype2/src/sfnt/ttload.c:1.1.1.1 --- /dev/null Mon Dec 18 14:22:40 2000 +++ xc/extras/freetype2/src/sfnt/ttload.c Fri Dec 8 16:26:23 2000 @@ -0,0 +1,1748 @@ +/***************************************************************************/ +/* */ +/* ttload.c */ +/* */ +/* Load the basic TrueType tables, i.e., tables that can be either in */ +/* TTF or OTF fonts (body). */ +/* */ +/* 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 +#include +#include +#include + + +#ifdef FT_FLAT_COMPILE + +#include "ttload.h" +#include "ttcmap.h" + +#else + +#include +#include + +#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_ttload + + + /*************************************************************************/ + /* */ + /* */ + /* TT_LookUp_Table */ + /* */ + /* */ + /* Looks for a TrueType table by name. */ + /* */ + /* */ + /* face :: A face object handle. */ + /* tag :: The searched tag. */ + /* */ + /* */ + /* A pointer to the table directory entry. 0 if not found. */ + /* */ + FT_LOCAL_DEF + TT_Table* TT_LookUp_Table( TT_Face face, + FT_ULong tag ) + { + TT_Table* entry; + TT_Table* limit; + + + FT_TRACE3(( "TT_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++ ) + { + if ( entry->Tag == tag ) + { + FT_TRACE3(( "found table.\n" )); + return entry; + } + } + + FT_TRACE3(( "could not find table!\n" )); + return 0; + } + + + /*************************************************************************/ + /* */ + /* */ + /* TT_Goto_Table */ + /* */ + /* */ + /* Looks for a TrueType table by name, then seek a stream to it. */ + /* */ + /* */ + /* face :: A face object handle. */ + /* tag :: The searched tag. */ + /* stream :: The stream to seek when the table is found. */ + /* */ + /* */ + /* length :: The length of the table if found, undefined otherwise. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF + FT_Error TT_Goto_Table( TT_Face face, + FT_ULong tag, + FT_Stream stream, + FT_ULong* length ) + { + TT_Table* table; + FT_Error error; + + + table = TT_LookUp_Table( face, tag ); + if ( table ) + { + if ( length ) + *length = table->Length; + + if ( FILE_Seek( table->Offset ) ) + goto Exit; + } + else + error = TT_Err_Table_Missing; + + Exit: + return error; + } + + + /*************************************************************************/ + /* */ + /* */ + /* TT_Load_SFNT_Header */ + /* */ + /* */ + /* Loads the header of a SFNT font file. Supports collections. */ + /* */ + /* */ + /* face :: A handle to the target face object. */ + /* stream :: The input stream. */ + /* face_index :: If the font is a collection, the number of the font */ + /* in the collection, ignored otherwise. */ + /* */ + /* */ + /* sfnt :: The SFNT header. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + /* */ + /* The stream cursor must be at the font file's origin. */ + /* */ + /* This function recognizes fonts embedded in a `TrueType collection' */ + /* */ + /* The header will be checked whether it is valid by looking at the */ + /* values of `search_range', `entry_selector', and `range_shift'. */ + /* */ + FT_LOCAL_DEF + FT_Error TT_Load_SFNT_Header( TT_Face face, + FT_Stream stream, + FT_Long face_index, + SFNT_Header* sfnt ) + { + FT_Error error; + FT_ULong format_tag; + FT_Memory memory = stream->memory; + + const FT_Frame_Field sfnt_header_fields[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE SFNT_Header + + 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 + }; + + const FT_Frame_Field ttc_header_fields[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE TTC_Header + + FT_FRAME_START( 8 ), + FT_FRAME_LONG( version ), + FT_FRAME_LONG( count ), + FT_FRAME_END }; + + + FT_TRACE2(( "TT_Load_SFNT_Header: %08p, %ld\n", + face, face_index )); + + face->ttc_header.tag = 0; + face->ttc_header.version = 0; + face->ttc_header.count = 0; + + face->num_tables = 0; + + /* first of all, read the first 4 bytes. If it is `ttcf', then the */ + /* file is a TrueType collection, otherwise it can be any other */ + /* kind of font. */ + if ( READ_ULong( format_tag ) ) + goto Exit; + + if ( format_tag == TTAG_ttcf ) + { + FT_Int n; + + + FT_TRACE3(( "TT_Load_SFNT_Header: file is a collection\n" )); + + /* it's a TrueType collection, i.e. a file containing several */ + /* font files. Read the font directory now */ + if ( READ_Fields( ttc_header_fields, &face->ttc_header ) ) + goto Exit; + + /* now read the offsets of each font in the file */ + if ( ALLOC_ARRAY( face->ttc_header.offsets, + face->ttc_header.count, + FT_ULong ) || + ACCESS_Frame( face->ttc_header.count * 4L ) ) + goto Exit; + + for ( n = 0; n < face->ttc_header.count; n++ ) + face->ttc_header.offsets[n] = GET_ULong(); + + FORGET_Frame(); + + /* check face index */ + if ( face_index >= face->ttc_header.count ) + { + error = TT_Err_Bad_Argument; + goto Exit; + } + + /* seek to the appropriate TrueType file, then read tag */ + if ( FILE_Seek( face->ttc_header.offsets[face_index] ) || + READ_Long( format_tag ) ) + goto Exit; + } + + /* the format tag was read, now check the rest of the header */ + sfnt->format_tag = format_tag; + if ( READ_Fields( sfnt_header_fields, sfnt ) ) + goto Exit; + + /* now, check the values of `num_tables', `seach_range', etc. */ + { + FT_UInt num_tables = sfnt->num_tables; + FT_ULong entry_selector = 1L << sfnt->entry_selector; + + + /* IMPORTANT: Many fonts have an incorrect `search_range' value, so */ + /* we only check the `entry_selector' correctness here. */ + /* */ + if ( num_tables == 0 || + entry_selector > num_tables || + entry_selector * 2 <= num_tables ) + { + FT_TRACE2(( "TT_Load_SFNT_Header: file is not SFNT!\n" )); + error = FT_Err_Unknown_File_Format; + } + } + + Exit: + return error; + } + + + /*************************************************************************/ + /* */ + /* */ + /* TT_Load_Directory */ + /* */ + /* */ + /* Loads the table directory into a face object. */ + /* */ + /* */ + /* face :: A handle to the target face object. */ + /* */ + /* */ + /* stream :: The input stream. */ + /* sfnt :: The SFNT directory header. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + /* */ + /* The stream cursor must be at the font file's origin. */ + /* */ + FT_LOCAL_DEF + FT_Error TT_Load_Directory( TT_Face face, + FT_Stream stream, + SFNT_Header* sfnt ) + { + FT_Error error; + FT_Memory memory = stream->memory; + + TT_Table *entry, *limit; + + + FT_TRACE2(( "TT_Load_Directory: %08p\n", face )); + + FT_TRACE2(( "-- Tables count: %12u\n", sfnt->num_tables )); + FT_TRACE2(( "-- Format version: %08lx\n", sfnt->format_tag )); + + face->num_tables = sfnt->num_tables; + + if ( ALLOC_ARRAY( face->dir_tables, + face->num_tables, + TT_Table ) ) + goto Exit; + + if ( ACCESS_Frame( face->num_tables * 16L ) ) + goto Exit; + + entry = face->dir_tables; + limit = entry + face->num_tables; + + for ( ; entry < limit; entry++ ) + { /* loop through the tables and get all entries */ + entry->Tag = GET_Tag4(); + entry->CheckSum = GET_ULong(); + entry->Offset = GET_Long(); + entry->Length = 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 )); + } + + FORGET_Frame(); + + FT_TRACE2(( "Directory loaded\n\n" )); + + Exit: + return error; + } + + + /*************************************************************************/ + /* */ + /* */ + /* TT_Load_Any */ + /* */ + /* */ + /* Loads any font table into client memory. */ + /* */ + /* */ + /* 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). */ + /* */ + /* */ + /* buffer :: The address of target buffer. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF + FT_Error TT_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_LookUp_Table( face, tag ); + if ( !table ) + { + error = TT_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 TT_Err_Ok; + } + + if ( length ) + size = *length; + + stream = face->root.stream; + /* the `if' is syntactic sugar for picky compilers */ + if ( FILE_Read_At( offset, buffer, size ) ) + goto Exit; + + Exit: + return error; + } + + + /*************************************************************************/ + /* */ + /* */ + /* TT_Load_Generic_Header */ + /* */ + /* */ + /* Loads the TrueType table `head' or `bhed'. */ + /* */ + /* */ + /* face :: A handle to the target face object. */ + /* stream :: The input stream. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + static + FT_Error TT_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 + }; + + + FT_TRACE2(( "TT_Load_Generic_Header: " + "%08p, looking up font table `%c%c%c%c'.\n", + face, + (FT_Char)( tag >> 24 ), + (FT_Char)( tag >> 16 ), + (FT_Char)( tag >> 8 ), + (FT_Char)( tag ) )); + + error = face->goto_table( face, tag, stream, 0 ); + if ( error ) + { + FT_TRACE2(( "TT_Load_Generic_Table: Font table is missing!\n" )); + goto Exit; + } + + header = &face->header; + + if ( READ_Fields( header_fields, header ) ) + goto Exit; + + FT_TRACE2(( " Units per EM: %8u\n", header->Units_Per_EM )); + FT_TRACE2(( " IndexToLoc: %8d\n", header->Index_To_Loc_Format )); + FT_TRACE2(( "TT_Load_Generic_Table: Font table loaded.\n" )); + + Exit: + return error; + } + + + FT_LOCAL_DEF + FT_Error TT_Load_Header( TT_Face face, + FT_Stream stream ) + { + return TT_Load_Generic_Header( face, stream, TTAG_head ); + } + + +#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS + + FT_LOCAL_DEF + FT_Error TT_Load_Bitmap_Header( TT_Face face, + FT_Stream stream ) + { + return TT_Load_Generic_Header( face, stream, TTAG_bhed ); + } + +#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */ + + + /*************************************************************************/ + /* */ + /* */ + /* TT_Load_MaxProfile */ + /* */ + /* */ + /* Loads the maximum profile into a face object. */ + /* */ + /* */ + /* face :: A handle to the target face object. */ + /* stream :: The input stream. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF + FT_Error TT_Load_MaxProfile( 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( 32 ), + FT_FRAME_ULONG ( version ), + FT_FRAME_USHORT( numGlyphs ), + 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 }; + + + FT_TRACE2(( "Load_TT_MaxProfile: %08p\n", face )); + + error = face->goto_table( face, TTAG_maxp, stream, 0 ); + if ( error ) + goto Exit; + + if ( READ_Fields( maxp_fields, 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; + + face->root.num_glyphs = maxProfile->numGlyphs; + + face->root.internal->max_points = MAX( maxProfile->maxCompositePoints, + maxProfile->maxPoints ); + + face->root.internal->max_contours = MAX( maxProfile->maxCompositeContours, + maxProfile->maxContours ); + + face->max_components = (FT_ULong)maxProfile->maxComponentElements + + maxProfile->maxComponentDepth; + + /* XXX: some fonts have maxComponents set to 0; we will */ + /* then use 16 of them by default. */ + if ( face->max_components == 0 ) + face->max_components = 16; + + /* We also increase maxPoints and maxContours in order to support */ + /* some broken fonts. */ + face->root.internal->max_points += 8; + face->root.internal->max_contours += 4; + + FT_TRACE2(( "MAXP loaded.\n" )); + + Exit: + return error; + } + + + /*************************************************************************/ + /* */ + /* */ + /* TT_Load_Metrics */ + /* */ + /* */ + /* Loads the horizontal or vertical metrics table into a face object. */ + /* */ + /* */ + /* face :: A handle to the target face object. */ + /* stream :: The input stream. */ + /* vertical :: A boolean flag. If set, load vertical metrics. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + static + FT_Error TT_Load_Metrics( 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_TRACE2(( "TT_Load_%s_Metrics: %08p\n", vertical ? "Vertical" + : "Horizontal", + face )); + + if ( vertical ) + { + /* The table is optional, quit silently if it wasn't found */ + /* XXX: Some fonts have a valid vertical header with a non-null */ + /* `number_of_VMetrics' fields, but no corresponding `vmtx' */ + /* table to get the metrics from (e.g. mingliu). */ + /* */ + /* For safety, we set the field to 0! */ + /* */ + error = face->goto_table( face, TTAG_vmtx, stream, &table_len ); + if ( error ) + { + /* Set number_Of_VMetrics to 0! */ + FT_TRACE2(( " no vertical header in file.\n" )); + face->vertical.number_Of_VMetrics = 0; + error = TT_Err_Ok; + goto Exit; + } + + num_longs = face->vertical.number_Of_VMetrics; + longs = (TT_LongMetrics**)&face->vertical.long_metrics; + shorts = (TT_ShortMetrics**)&face->vertical.short_metrics; + } + else + { + error = face->goto_table( face, TTAG_hmtx, stream, &table_len ); + if ( error ) + { + FT_ERROR(( " no horizontal metrics in file!\n" )); + error = TT_Err_Hmtx_Table_Missing; + goto Exit; + } + + num_longs = face->horizontal.number_Of_HMetrics; + longs = (TT_LongMetrics**)&face->horizontal.long_metrics; + shorts = (TT_ShortMetrics**)&face->horizontal.short_metrics; + } + + /* 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(( "TT_Load_%s_Metrics: more metrics than glyphs!\n", + vertical ? "Vertical" + : "Horizontal" )); + + error = vertical ? TT_Err_Invalid_Vert_Metrics + : TT_Err_Invalid_Horiz_Metrics; + goto Exit; + } + + if ( ALLOC_ARRAY( *longs, num_longs, TT_LongMetrics ) || + ALLOC_ARRAY( *shorts, num_shorts, TT_ShortMetrics ) ) + goto Exit; + + if ( ACCESS_Frame( table_len ) ) + goto Exit; + + { + TT_LongMetrics* cur = *longs; + TT_LongMetrics* limit = cur + num_longs; + + + for ( ; cur < limit; cur++ ) + { + cur->advance = GET_UShort(); + cur->bearing = GET_Short(); + } + } + + /* do we have an inconsistent number of metric values? */ + { + TT_ShortMetrics* cur = *shorts; + TT_ShortMetrics* limit = cur + MIN( num_shorts, num_shorts_checked ); + + + for ( ; cur < limit; cur++ ) + *cur = GET_Short(); + + /* 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; + } + } + + FORGET_Frame(); + + FT_TRACE2(( "loaded\n" )); + + Exit: + return error; + } + + + /*************************************************************************/ + /* */ + /* */ + /* TT_Load_Metrics_Header */ + /* */ + /* */ + /* Loads the horizontal or vertical header in a face object. */ + /* */ + /* */ + /* face :: A handle to the target face object. */ + /* stream :: The input stream. */ + /* vertical :: A boolean flag. If set, load vertical metrics. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF + FT_Error TT_Load_Metrics_Header( 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 ( Reserved[0] ), + FT_FRAME_SHORT ( Reserved[1] ), + FT_FRAME_SHORT ( Reserved[2] ), + FT_FRAME_SHORT ( Reserved[3] ), + FT_FRAME_SHORT ( Reserved[4] ), + FT_FRAME_SHORT ( metric_Data_Format ), + FT_FRAME_USHORT( number_Of_HMetrics ), + FT_FRAME_END + }; + + + FT_TRACE2(( vertical ? "Vertical header " : "Horizontal header " )); + + if ( vertical ) + { + face->vertical_info = 0; + + /* The vertical header table is optional, so return quietly if */ + /* we don't find it. */ + error = face->goto_table( face, TTAG_vhea, stream, 0 ); + if ( error ) + { + error = TT_Err_Ok; + goto Exit; + } + + face->vertical_info = 1; + header = (TT_HoriHeader*)&face->vertical; + } + else + { + /* The horizontal header is mandatory; return an error if we */ + /* don't find it. */ + error = face->goto_table( face, TTAG_hhea, stream, 0 ); + if ( error ) + { + error = TT_Err_Horiz_Header_Missing; + goto Exit; + } + + header = &face->horizontal; + } + + if ( READ_Fields( metrics_header_fields, header ) ) + goto Exit; + + header->long_metrics = NULL; + header->short_metrics = NULL; + + FT_TRACE2(( "loaded\n" )); + + /* Now try to load the corresponding metrics */ + + error = TT_Load_Metrics( face, stream, vertical ); + + Exit: + return error; + } + + + /*************************************************************************/ + /* */ + /* */ + /* TT_Load_Names */ + /* */ + /* */ + /* Loads the name records. */ + /* */ + /* */ + /* face :: A handle to the target face object. */ + /* stream :: The input stream. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF + FT_Error TT_Load_Names( TT_Face face, + FT_Stream stream ) + { + FT_Error error; + FT_Memory memory = stream->memory; + + FT_ULong table_pos, table_len; + FT_ULong storageSize; + + TT_NameTable* names; + + const FT_Frame_Field name_table_fields[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE TT_NameTable + + FT_FRAME_START( 6 ), + FT_FRAME_USHORT( format ), + FT_FRAME_USHORT( numNameRecords ), + FT_FRAME_USHORT( storageOffset ), + FT_FRAME_END + }; + + const FT_Frame_Field name_record_fields[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE TT_NameRec + + /* 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 + }; + + + FT_TRACE2(( "Names " )); + + error = face->goto_table( face, TTAG_name, stream, &table_len ); + if ( error ) + { + /* The name table is required so indicate failure. */ + FT_TRACE2(( "is missing!\n" )); + error = TT_Err_Name_Table_Missing; + goto Exit; + } + + table_pos = FILE_Pos(); + + names = &face->name_table; + + if ( READ_Fields( name_table_fields, names ) ) + goto Exit; + + /* Allocate the array of name records. */ + if ( ALLOC_ARRAY( names->names, + names->numNameRecords, + TT_NameRec ) || + ACCESS_Frame( names->numNameRecords * 12L ) ) + goto Exit; + + /* Load the name records and determine how much storage is needed */ + /* to hold the strings themselves. */ + { + TT_NameRec* cur = names->names; + TT_NameRec* limit = cur + names->numNameRecords; + + + storageSize = 0; + + for ( ; cur < limit; cur ++ ) + { + FT_ULong upper; + + + if ( READ_Fields( name_record_fields, cur ) ) + break; + + upper = (FT_ULong)( cur->stringOffset + cur->stringLength ); + if ( upper > storageSize ) + storageSize = upper; + } + } + + FORGET_Frame(); + + if ( storageSize > 0 ) + { + /* allocate the name storage area in memory, then read it */ + if ( ALLOC( names->storage, storageSize ) || + FILE_Read_At( table_pos + names->storageOffset, + names->storage, storageSize ) ) + goto Exit; + + /* Go through and assign the string pointers to the name records. */ + { + TT_NameRec* cur = names->names; + TT_NameRec* limit = cur + names->numNameRecords; + + + for ( ; cur < limit; cur++ ) + cur->string = names->storage + cur->stringOffset; + } + +#ifdef FT_DEBUG_LEVEL_TRACE + + /* Print Name Record Table in case of debugging */ + { + TT_NameRec* cur = names->names; + TT_NameRec* limit = cur + names->numNameRecords; + + + for ( ; cur < limit; cur++ ) + { + FT_UInt j; + + + FT_TRACE3(( "%d %d %x %d\n ", + cur->platformID, + cur->encodingID, + cur->languageID, + cur->nameID )); + + /* I know that M$ encoded strings are Unicode, */ + /* but this works reasonable well for debugging purposes. */ + if ( cur->string ) + for ( j = 0; j < cur->stringLength; j++ ) + { + FT_Char c = *( cur->string + j ); + + + if ( (FT_Byte)c < 128 ) + FT_TRACE3(( "%c", c )); + } + } + } + FT_TRACE3(( "\n" )); + +#endif /* FT_DEBUG_LEVEL_TRACE */ + + } + FT_TRACE2(( "loaded\n" )); + + /* everything went well, update face->num_names */ + face->num_names = names->numNameRecords; + + Exit: + return error; + } + + + /*************************************************************************/ + /* */ + /* */ + /* TT_Free_Names */ + /* */ + /* */ + /* Frees the name records. */ + /* */ + /* */ + /* face :: A handle to the target face object. */ + /* */ + FT_LOCAL_DEF + void TT_Free_Names( TT_Face face ) + { + FT_Memory memory = face->root.driver->root.memory; + TT_NameTable* names = &face->name_table; + + + /* free strings table */ + FREE( names->names ); + + /* free strings storage */ + FREE( names->storage ); + + names->numNameRecords = 0; + names->format = 0; + names->storageOffset = 0; + } + + + /*************************************************************************/ + /* */ + /* */ + /* TT_Load_CMap */ + /* */ + /* */ + /* Loads the cmap directory in a face object. The cmaps itselves are */ + /* loaded on demand in the `ttcmap.c' module. */ + /* */ + /* */ + /* 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_Load_CMap( TT_Face face, + FT_Stream stream ) + { + FT_Error error; + FT_Memory memory = stream->memory; + FT_Long table_start; + TT_CMapDir cmap_dir; + + const FT_Frame_Field cmap_fields[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE TT_CMapDir + + FT_FRAME_START( 4 ), + FT_FRAME_USHORT( tableVersionNumber ), + FT_FRAME_USHORT( numCMaps ), + FT_FRAME_END + }; + + const FT_Frame_Field cmap_rec_fields[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE TT_CMapTable + + FT_FRAME_START( 6 ), + FT_FRAME_USHORT( format ), + FT_FRAME_USHORT( length ), + FT_FRAME_USHORT( version ), + FT_FRAME_END + }; + + + FT_TRACE2(( "CMaps " )); + + error = face->goto_table( face, TTAG_cmap, stream, 0 ); + if ( error ) + { + error = TT_Err_CMap_Table_Missing; + goto Exit; + } + + table_start = FILE_Pos(); + + if ( READ_Fields( cmap_fields, &cmap_dir ) ) + goto Exit; + + /* reserve space in face table for cmap tables */ + if ( ALLOC_ARRAY( face->charmaps, + cmap_dir.numCMaps, + TT_CharMapRec ) ) + goto Exit; + + face->num_charmaps = cmap_dir.numCMaps; + { + TT_CharMap charmap = face->charmaps; + TT_CharMap limit = charmap + face->num_charmaps; + + + /* read the header of each charmap first */ + if ( ACCESS_Frame( face->num_charmaps * 8L ) ) + goto Exit; + + for ( ; charmap < limit; charmap++ ) + { + TT_CMapTable* cmap; + + + charmap->root.face = (FT_Face)face; + cmap = &charmap->cmap; + + cmap->loaded = FALSE; + cmap->platformID = GET_UShort(); + cmap->platformEncodingID = GET_UShort(); + cmap->offset = (FT_ULong)GET_Long(); + } + + FORGET_Frame(); + + /* now read the rest of each table */ + for ( charmap = face->charmaps; charmap < limit; charmap++ ) + { + TT_CMapTable* cmap = &charmap->cmap; + + + if ( FILE_Seek( table_start + (FT_Long)cmap->offset ) || + READ_Fields( cmap_rec_fields, cmap ) ) + goto Exit; + + cmap->offset = FILE_Pos(); + } + } + + FT_TRACE2(( "loaded\n" )); + + Exit: + return error; + } + + + /*************************************************************************/ + /* */ + /* */ + /* TT_Load_OS2 */ + /* */ + /* */ + /* Loads the OS2 table. */ + /* */ + /* */ + /* 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_Load_OS2( TT_Face face, + FT_Stream stream ) + { + FT_Error error; + TT_OS2* os2; + +#undef FT_STRUCTURE +#define FT_STRUCTURE TT_OS2 + + const FT_Frame_Field os2_fields[] = + { + 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 + }; + + + FT_TRACE2(( "OS/2 Table " )); + + /* 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 ) + { + FT_TRACE2(( "is missing!\n" )); + face->os2.version = 0xFFFF; + error = TT_Err_Ok; + goto Exit; + } + + os2 = &face->os2; + + if ( READ_Fields( os2_fields, os2 ) ) + goto Exit; + + os2->ulCodePageRange1 = 0; + os2->ulCodePageRange2 = 0; + + if ( os2->version >= 0x0001 ) + { + /* only version 1 tables */ + if ( READ_Fields( os2_fields_extra, os2 ) ) + goto Exit; + + if ( os2->version >= 0x0002 ) + { + /* only version 2 tables */ + if ( READ_Fields( os2_fields_extra2, os2 ) ) + goto Exit; + } + } + + FT_TRACE2(( "loaded\n" )); + + Exit: + return error; + } + + + /*************************************************************************/ + /* */ + /* */ + /* TT_Load_Postscript */ + /* */ + /* */ + /* Loads the Postscript table. */ + /* */ + /* */ + /* 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_Load_PostScript( 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 + }; + + + FT_TRACE2(( "PostScript " )); + + error = face->goto_table( face, TTAG_post, stream, 0 ); + if ( error ) + return TT_Err_Post_Table_Missing; + + if ( READ_Fields( post_fields, post ) ) + return error; + + /* we don't load the glyph names, we do that in another */ + /* module (ttpost). */ + FT_TRACE2(( "loaded\n" )); + + return TT_Err_Ok; + } + + + /*************************************************************************/ + /* */ + /* */ + /* TT_Load_PCLT */ + /* */ + /* */ + /* Loads the PCL 5 Table. */ + /* */ + /* */ + /* 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_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; + + + FT_TRACE2(( "PCLT " )); + + /* optional table */ + error = face->goto_table( face, TTAG_PCLT, stream, 0 ); + if ( error ) + { + FT_TRACE2(( "missing (optional)\n" )); + pclt->Version = 0; + return TT_Err_Ok; + } + + if ( READ_Fields( pclt_fields, pclt ) ) + goto Exit; + + FT_TRACE2(( "loaded\n" )); + + Exit: + return error; + } + + + /*************************************************************************/ + /* */ + /* */ + /* TT_Load_Gasp */ + /* */ + /* */ + /* Loads the `gasp' table into a face object. */ + /* */ + /* */ + /* face :: A handle to the target face object. */ + /* stream :: The input stream. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF + FT_Error TT_Load_Gasp( TT_Face face, + FT_Stream stream ) + { + FT_Error error; + FT_Memory memory = stream->memory; + + FT_UInt j,num_ranges; + TT_GaspRange* gaspranges; + + + FT_TRACE2(( "TT_Load_Gasp: %08p\n", face )); + + /* the gasp table is optional */ + error = face->goto_table( face, TTAG_gasp, stream, 0 ); + if ( error ) + return TT_Err_Ok; + + if ( ACCESS_Frame( 4L ) ) + goto Exit; + + face->gasp.version = GET_UShort(); + face->gasp.numRanges = GET_UShort(); + + FORGET_Frame(); + + num_ranges = face->gasp.numRanges; + FT_TRACE3(( "number of ranges = %d\n", num_ranges )); + + if ( ALLOC_ARRAY( gaspranges, num_ranges, TT_GaspRange ) || + ACCESS_Frame( num_ranges * 4L ) ) + goto Exit; + + face->gasp.gaspRanges = gaspranges; + + for ( j = 0; j < num_ranges; j++ ) + { + gaspranges[j].maxPPEM = GET_UShort(); + gaspranges[j].gaspFlag = GET_UShort(); + + FT_TRACE3(( " [max:%d flag:%d]", + gaspranges[j].maxPPEM, + gaspranges[j].gaspFlag )); + } + FT_TRACE3(( "\n" )); + + FORGET_Frame(); + FT_TRACE2(( "GASP loaded\n" )); + + Exit: + return error; + } + + + /*************************************************************************/ + /* */ + /* */ + /* TT_Load_Kern */ + /* */ + /* */ + /* Loads the first kerning table with format 0 in the font. Only */ + /* accepts the first horizontal kerning table. Developers should use */ + /* the `ftxkern' extension to access other kerning tables in the font */ + /* file, if they really want to. */ + /* */ + /* */ + /* face :: A handle to the target face object. */ + /* stream :: The input stream. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF + FT_Error TT_Load_Kern( TT_Face face, + FT_Stream stream ) + { + FT_Error error; + FT_Memory memory = stream->memory; + + FT_UInt n, num_tables, version; + + + /* the kern table is optional; exit silently if it is missing */ + error = face->goto_table( face, TTAG_kern, stream, 0 ); + if ( error ) + return TT_Err_Ok; + + if ( ACCESS_Frame( 4L ) ) + goto Exit; + + version = GET_UShort(); + num_tables = GET_UShort(); + + FORGET_Frame(); + + for ( n = 0; n < num_tables; n++ ) + { + FT_UInt coverage; + FT_UInt length; + + + if ( ACCESS_Frame( 6L ) ) + goto Exit; + + version = GET_UShort(); /* version */ + length = GET_UShort() - 6; /* substract header length */ + coverage = GET_UShort(); + + FORGET_Frame(); + + if ( coverage == 0x0001 ) + { + FT_UInt num_pairs; + TT_Kern_0_Pair* pair; + TT_Kern_0_Pair* limit; + + + /* found a horizontal format 0 kerning table! */ + if ( ACCESS_Frame( 8L ) ) + goto Exit; + + num_pairs = GET_UShort(); + + /* skip the rest */ + + FORGET_Frame(); + + /* allocate array of kerning pairs */ + if ( ALLOC_ARRAY( face->kern_pairs, num_pairs, TT_Kern_0_Pair ) || + ACCESS_Frame( 6L * num_pairs ) ) + goto Exit; + + pair = face->kern_pairs; + limit = pair + num_pairs; + for ( ; pair < limit; pair++ ) + { + pair->left = GET_UShort(); + pair->right = GET_UShort(); + pair->value = GET_UShort(); + } + + FORGET_Frame(); + + face->num_kern_pairs = num_pairs; + face->kern_table_index = n; + goto Exit; + } + + if ( FILE_Skip( length ) ) + goto Exit; + } + + /* no kern table found -- doesn't matter */ + face->kern_table_index = -1; + face->num_kern_pairs = 0; + face->kern_pairs = NULL; + + Exit: + return error; + } + + + /*************************************************************************/ + /* */ + /* */ + /* TT_Load_Hdmx */ + /* */ + /* */ + /* Loads the horizontal device metrics table. */ + /* */ + /* */ + /* 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_Load_Hdmx( TT_Face face, + FT_Stream stream ) + { + FT_Error error; + FT_Memory memory = stream->memory; + + TT_Hdmx* hdmx = &face->hdmx; + FT_Long num_glyphs; + FT_Long record_size; + + + hdmx->version = 0; + hdmx->num_records = 0; + hdmx->records = 0; + + /* this table is optional */ + error = face->goto_table( face, TTAG_hdmx, stream, 0 ); + if ( error ) + return TT_Err_Ok; + + if ( ACCESS_Frame( 8L ) ) + goto Exit; + + hdmx->version = GET_UShort(); + hdmx->num_records = GET_Short(); + record_size = GET_Long(); + + FORGET_Frame(); + + /* Only recognize format 0 */ + if ( hdmx->version != 0 ) + goto Exit; + + if ( ALLOC_ARRAY( hdmx->records, hdmx->num_records, TT_HdmxRec ) ) + goto Exit; + + num_glyphs = face->root.num_glyphs; + record_size -= num_glyphs + 2; + + { + TT_HdmxRec* cur = hdmx->records; + TT_HdmxRec* limit = cur + hdmx->num_records; + + + for ( ; cur < limit; cur++ ) + { + /* read record */ + if ( READ_Byte( cur->ppem ) || + READ_Byte( cur->max_width ) ) + goto Exit; + + if ( ALLOC( cur->widths, num_glyphs ) || + FILE_Read( cur->widths, num_glyphs ) ) + goto Exit; + + /* skip padding bytes */ + if ( record_size > 0 && FILE_Skip( record_size ) ) + goto Exit; + } + } + + Exit: + return error; + } + + + /*************************************************************************/ + /* */ + /* */ + /* TT_Free_Hdmx */ + /* */ + /* */ + /* Frees the horizontal device metrics table. */ + /* */ + /* */ + /* face :: A handle to the target face object. */ + /* */ + FT_LOCAL_DEF + void TT_Free_Hdmx( TT_Face face ) + { + if ( face ) + { + FT_Int n; + FT_Memory memory = face->root.driver->root.memory; + + + for ( n = 0; n < face->hdmx.num_records; n++ ) + FREE( face->hdmx.records[n].widths ); + + FREE( face->hdmx.records ); + face->hdmx.num_records = 0; + } + } + + +/* END */ Index: xc/extras/freetype2/src/sfnt/ttload.h diff -u /dev/null xc/extras/freetype2/src/sfnt/ttload.h:1.1.1.1 --- /dev/null Mon Dec 18 14:22:40 2000 +++ xc/extras/freetype2/src/sfnt/ttload.h Fri Dec 8 16:26:24 2000 @@ -0,0 +1,140 @@ +/***************************************************************************/ +/* */ +/* ttload.h */ +/* */ +/* Load the basic TrueType tables, i.e., tables that can be either in */ +/* TTF or OTF fonts (specification). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#ifndef TTLOAD_H +#define TTLOAD_H + + +#include +#include + + +#ifdef __cplusplus + extern "C" { +#endif + + + FT_LOCAL + TT_Table* TT_LookUp_Table( TT_Face face, + FT_ULong tag ); + + FT_LOCAL + FT_Error TT_Goto_Table( TT_Face face, + FT_ULong tag, + FT_Stream stream, + FT_ULong* length ); + + + FT_LOCAL + FT_Error TT_Load_SFNT_Header( TT_Face face, + FT_Stream stream, + FT_Long face_index, + SFNT_Header* sfnt ); + FT_LOCAL + FT_Error TT_Load_Directory( TT_Face face, + FT_Stream stream, + SFNT_Header* sfnt ); + + FT_LOCAL + FT_Error TT_Load_Any( TT_Face face, + FT_ULong tag, + FT_Long offset, + FT_Byte* buffer, + FT_ULong* length ); + + + FT_LOCAL + FT_Error TT_Load_Header( TT_Face face, + FT_Stream stream ); + + + FT_LOCAL + FT_Error TT_Load_Metrics_Header( TT_Face face, + FT_Stream stream, + FT_Bool vertical ); + + + FT_LOCAL + FT_Error TT_Load_CMap( TT_Face face, + FT_Stream stream ); + + + FT_LOCAL + FT_Error TT_Load_MaxProfile( TT_Face face, + FT_Stream stream ); + + + FT_LOCAL + FT_Error TT_Load_Names( TT_Face face, + FT_Stream stream ); + + + FT_LOCAL + FT_Error TT_Load_OS2( TT_Face face, + FT_Stream stream ); + + + FT_LOCAL + FT_Error TT_Load_PostScript( TT_Face face, + FT_Stream stream ); + + + FT_LOCAL + FT_Error TT_Load_Hdmx( TT_Face face, + FT_Stream stream ); + + FT_LOCAL + FT_Error TT_Load_PCLT( TT_Face face, + FT_Stream stream ); + + FT_LOCAL + void TT_Free_Names( TT_Face face ); + + + FT_LOCAL + void TT_Free_Hdmx ( TT_Face face ); + + + FT_LOCAL + FT_Error TT_Load_Kern( TT_Face face, + FT_Stream stream ); + + + FT_LOCAL + FT_Error TT_Load_Gasp( TT_Face face, + FT_Stream stream ); + +#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS + + FT_LOCAL + FT_Error TT_Load_Bitmap_Header( TT_Face face, + FT_Stream stream ); + +#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */ + + +#ifdef __cplusplus + } +#endif + + +#endif /* TTLOAD_H */ + + +/* END */ Index: xc/extras/freetype2/src/sfnt/ttpost.c diff -u /dev/null xc/extras/freetype2/src/sfnt/ttpost.c:1.1.1.1 --- /dev/null Mon Dec 18 14:22:40 2000 +++ xc/extras/freetype2/src/sfnt/ttpost.c Fri Dec 8 16:26:24 2000 @@ -0,0 +1,544 @@ +/***************************************************************************/ +/* */ +/* ttpost.c */ +/* */ +/* Postcript name table processing for TrueType and OpenType fonts */ +/* (body). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + /*************************************************************************/ + /* */ + /* 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 +#include +#include + + +#ifdef FT_FLAT_COMPILE + +#include "ttpost.h" +#include "ttload.h" + +#else + +#include +#include + +#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_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 + +#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 */ + + 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 ( 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->root.num_glyphs ) + { + error = TT_Err_Invalid_File_Format; + goto Exit; + } + + /* load the indices */ + { + FT_Int n; + + + if ( ALLOC_ARRAY ( glyph_indices, num_glyphs, FT_UShort ) || + ACCESS_Frame( num_glyphs * 2L ) ) + goto Fail; + + for ( n = 0; n < num_glyphs; n++ ) + glyph_indices[n] = GET_UShort(); + + FORGET_Frame(); + } + + /* compute number of names stored in table */ + { + FT_Int n; + + + num_names = 0; + + for ( n = 0; n < num_glyphs; n++ ) + { + FT_Int index; + + + index = glyph_indices[n]; + if ( index >= 258 ) + { + index -= 257; + if ( index > num_names ) + num_names = index; + } + } + } + + /* now load the name strings */ + { + FT_UShort n; + + + if ( ALLOC_ARRAY( name_strings, num_names, FT_Char* ) ) + goto Fail; + + for ( n = 0; n < num_names; n++ ) + { + FT_UInt len; + + + if ( READ_Byte ( len ) || + ALLOC_ARRAY( name_strings[n], len + 1, FT_Char ) || + FILE_Read ( name_strings[n], len ) ) + goto Fail1; + + name_strings[n][len] = '\0'; + } + } + + /* all right, set table fields and exit successfuly */ + { + TT_Post_20* table = &face->postscript_names.names.format_20; + + + table->num_glyphs = num_glyphs; + table->num_names = num_names; + table->glyph_indices = glyph_indices; + table->glyph_names = name_strings; + } + return TT_Err_Ok; + + + Fail1: + { + FT_UShort n; + + + for ( n = 0; n < num_names; n++ ) + FREE( name_strings[n] ); + } + + Fail: + FREE( name_strings ); + 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 ( READ_UShort( num_glyphs ) ) + goto Exit; + + /* check the number of glyphs */ + if ( num_glyphs > face->root.num_glyphs || num_glyphs > 258 ) + { + error = TT_Err_Invalid_File_Format; + goto Exit; + } + + if ( ALLOC ( offset_table, num_glyphs ) || + FILE_Read( offset_table, num_glyphs ) ) + goto Fail; + + /* now check the offset table */ + { + FT_Int n; + + + for ( n = 0; n < num_glyphs; n++ ) + { + FT_Long index = (FT_Long)n + offset_table[n]; + + + if ( index < 0 || index > num_glyphs ) + { + error = TT_Err_Invalid_File_Format; + goto Fail; + } + } + } + + /* OK, set table fields and exit successfuly */ + { + TT_Post_25* table = &face->postscript_names.names.format_25; + + + table->num_glyphs = num_glyphs; + table->offsets = offset_table; + } + + return TT_Err_Ok; + + Fail: + 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 ( FILE_Skip( 32 ) ) + goto Exit; + + /* now read postscript table */ + switch ( format ) + { + case 0x00020000L: + error = Load_Format_20( face, stream ); + break; + + case 0x00028000L: + error = Load_Format_25( face, stream ); + break; + + default: + error = TT_Err_Invalid_File_Format; + } + + face->postscript_names.loaded = 1; + + Exit: + return error; + } + + + FT_LOCAL_DEF + void TT_Free_Post_Names( TT_Face face ) + { + FT_Memory memory = face->root.memory; + TT_Post_Names* names = &face->postscript_names; + + + if ( names->loaded ) + { + switch ( face->postscript.FormatType ) + { + case 0x00020000L: + { + TT_Post_20* table = &names->names.format_20; + FT_UShort n; + + + FREE( table->glyph_indices ); + table->num_glyphs = 0; + + for ( n = 0; n < table->num_names; n++ ) + FREE( table->glyph_names[n] ); + + FREE( table->glyph_names ); + table->num_names = 0; + } + break; + + case 0x00028000L: + { + TT_Post_25* table = &names->names.format_25; + + + FREE( table->offsets ); + table->num_glyphs = 0; + } + break; + } + } + names->loaded = 0; + } + + + /*************************************************************************/ + /* */ + /* */ + /* TT_Get_PS_Name */ + /* */ + /* */ + /* Gets the PostScript glyph name of a glyph. */ + /* */ + /* */ + /* face :: A handle to the parent face. */ + /* */ + /* index :: 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! */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF + FT_Error TT_Get_PS_Name( TT_Face face, + FT_UInt index, + FT_String** PSname ) + { + FT_Error error; + TT_Post_Names* names; + +#ifdef FT_CONFIG_OPTION_POSTSCRIPT_NAMES + PSNames_Interface* psnames; +#endif + + + if ( !face ) + return TT_Err_Invalid_Face_Handle; + + if ( index >= (FT_UInt)face->root.num_glyphs ) + return TT_Err_Invalid_Glyph_Index; + +#ifdef FT_CONFIG_OPTION_POSTSCRIPT_NAMES + psnames = (PSNames_Interface*)face->psnames; + if ( !psnames ) + return TT_Err_Unimplemented_Feature; +#endif + + names = &face->postscript_names; + + /* `.notdef' by default */ + *PSname = MAC_NAME( 0 ); + + switch ( face->postscript.FormatType ) + { + case 0x00010000L: + if ( index < 258 ) /* paranoid checking */ + *PSname = MAC_NAME( index ); + break; + + case 0x00020000L: + { + TT_Post_20* table = &names->names.format_20; + + + if ( !names->loaded ) + { + error = Load_Post_Names( face ); + if ( error ) + break; + } + + if ( index < (FT_UInt)table->num_glyphs ) + { + FT_UShort name_index = table->glyph_indices[index]; + + + if ( name_index < 258 ) + *PSname = MAC_NAME( name_index ); + else + *PSname = (FT_String*)table->glyph_names[name_index - 258]; + } + } + break; + + case 0x00028000L: + { + TT_Post_25* table = &names->names.format_25; + + + if ( !names->loaded ) + { + error = Load_Post_Names( face ); + if ( error ) + break; + } + + if ( index < (FT_UInt)table->num_glyphs ) /* paranoid checking */ + { + index += table->offsets[index]; + *PSname = MAC_NAME( index ); + } + } + break; + + case 0x00030000L: + break; /* nothing to do */ + } + + return TT_Err_Ok; + } + + +/* END */ Index: xc/extras/freetype2/src/sfnt/ttpost.h diff -u /dev/null xc/extras/freetype2/src/sfnt/ttpost.h:1.1.1.1 --- /dev/null Mon Dec 18 14:22:40 2000 +++ xc/extras/freetype2/src/sfnt/ttpost.h Fri Dec 8 16:26:24 2000 @@ -0,0 +1,52 @@ +/***************************************************************************/ +/* */ +/* ttpost.h */ +/* */ +/* Postcript name table processing for TrueType and OpenType fonts */ +/* (specification). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#ifndef TTPOST_H +#define TTPOST_H + +#include +#include + +#ifdef __cplusplus + extern "C" { +#endif + + +#define TT_Err_Invalid_Post_Table_Format 0x0B00 +#define TT_Err_Invalid_Post_Table 0x0B01 + + + FT_LOCAL + FT_Error TT_Get_PS_Name( TT_Face face, + FT_UInt index, + FT_String** PSname ); + + FT_LOCAL + void TT_Free_Post_Names( TT_Face face ); + + +#ifdef __cplusplus + } +#endif + + +#endif /* TTPOST_H */ + + +/* END */ Index: xc/extras/freetype2/src/sfnt/ttsbit.c diff -u /dev/null xc/extras/freetype2/src/sfnt/ttsbit.c:1.1.1.1 --- /dev/null Mon Dec 18 14:22:40 2000 +++ xc/extras/freetype2/src/sfnt/ttsbit.c Fri Dec 8 16:26:24 2000 @@ -0,0 +1,1476 @@ +/***************************************************************************/ +/* */ +/* ttsbit.c */ +/* */ +/* TrueType and OpenType embedded bitmap support (body). */ +/* */ +/* 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 +#include +#include +#include + + +#ifdef FT_FLAT_COMPILE + +#include "ttsbit.h" + +#else + +#include + +#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_ttsbit + + + /*************************************************************************/ + /* */ + /* */ + /* blit_sbit */ + /* */ + /* */ + /* Blits a bitmap from an input stream into a given target. Supports */ + /* x and y offsets as well as byte padded lines. */ + /* */ + /* */ + /* 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. */ + /* */ + /* */ + /* 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_Byte 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 = x_offset & 7; /* current write shift */ + FT_Byte space = 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)*source++ << ( 8 - loaded ); + loaded += 8; + } + + /* now write one byte */ + val = (FT_Byte)( acc >> 8 ); + if ( shift ) + { + cur[0] |= val >> shift; + cur[1] |= 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 ( loaded < count ) + { + acc |= (FT_UShort)*source++ << ( 8 - loaded ); + loaded += 8; + } + + /* now write remaining bits */ + val = ( (FT_Byte)( acc >> 8 ) ) & ~( 0xFF >> count ); + cur[0] |= val >> shift; + + if ( count > space ) + cur[1] |= val << space; + + acc <<= count; + loaded -= count; + } + + /* now, skip to next line */ + if ( byte_padded ) + acc = loaded = 0; /* clear accumulator on byte-padded lines */ + + line_buff += line_incr; + } + } + + + const FT_Frame_Field sbit_metrics_fields[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE TT_SBit_Metrics + + 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 + }; + + + /*************************************************************************/ + /* */ + /* */ + /* TT_Load_SBit_Const_Metrics */ + /* */ + /* */ + /* Loads the metrics for `EBLC' index tables format 2 and 5. */ + /* */ + /* */ + /* range :: The target range. */ + /* */ + /* stream :: The input stream. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + static + FT_Error Load_SBit_Const_Metrics( TT_SBit_Range* range, + FT_Stream stream ) + { + FT_Error error; + + + if ( READ_ULong( range->image_size ) ) + return error; + + return READ_Fields( sbit_metrics_fields, &range->metrics ); + } + + + /*************************************************************************/ + /* */ + /* */ + /* TT_Load_SBit_Range_Codes */ + /* */ + /* */ + /* Loads the range codes for `EBLC' index tables format 4 and 5. */ + /* */ + /* */ + /* range :: The target range. */ + /* */ + /* stream :: The input stream. */ + /* */ + /* load_offsets :: A flag whether to load the glyph offset table. */ + /* */ + /* */ + /* 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 ( READ_ULong( count ) ) + goto Exit; + + range->num_glyphs = count; + + /* Allocate glyph offsets table if needed */ + if ( load_offsets ) + { + if ( ALLOC_ARRAY( range->glyph_offsets, count, FT_ULong ) ) + goto Exit; + + size = count * 4L; + } + else + size = count * 2L; + + /* Allocate glyph codes table and access frame */ + if ( ALLOC_ARRAY ( range->glyph_codes, count, FT_UShort ) || + ACCESS_Frame( size ) ) + goto Exit; + + for ( n = 0; n < count; n++ ) + { + range->glyph_codes[n] = GET_UShort(); + + if ( load_offsets ) + range->glyph_offsets[n] = (FT_ULong)range->image_offset + + GET_UShort(); + } + + FORGET_Frame(); + + Exit: + return error; + } + + + /*************************************************************************/ + /* */ + /* */ + /* TT_Load_SBit_Range */ + /* */ + /* */ + /* Loads a given `EBLC' index/range table. */ + /* */ + /* */ + /* range :: The target range. */ + /* */ + /* stream :: The input stream. */ + /* */ + /* */ + /* 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 = ( range->index_format == 1 ); + + + 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 ( ALLOC_ARRAY( range->glyph_offsets, + num_glyphs, FT_ULong ) || + ACCESS_Frame( num_glyphs * size_elem ) ) + goto Exit; + + for ( n = 0; n < num_glyphs; n++ ) + range->glyph_offsets[n] = (FT_ULong)( range->image_offset + + ( large ? GET_ULong() + : GET_UShort() ) ); + FORGET_Frame(); + } + 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 = TT_Err_Invalid_File_Format; + } + + Exit: + return error; + } + + + /*************************************************************************/ + /* */ + /* */ + /* TT_Load_SBit_Strikes */ + /* */ + /* */ + /* Loads the table of embedded bitmap sizes for this face. */ + /* */ + /* */ + /* face :: The target face object. */ + /* */ + /* stream :: The input stream. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF + FT_Error TT_Load_SBit_Strikes( 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; + + const FT_Frame_Field sbit_line_metrics_fields[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE TT_SBit_Line_Metrics + + /* 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 + }; + + const FT_Frame_Field strike_start_fields[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE TT_SBit_Strike + + /* 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 + }; + + 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 = FILE_Pos(); + if ( ACCESS_Frame( 8L ) ) + goto Exit; + + version = GET_Long(); + num_strikes = GET_ULong(); + + FORGET_Frame(); + + /* check version number and strike count */ + if ( version != 0x00020000L || + num_strikes >= 0x10000L ) + { + FT_ERROR(( "TT_Load_SBit_Strikes: invalid table version!\n" )); + error = TT_Err_Invalid_File_Format; + + goto Exit; + } + + /* allocate the strikes table */ + if ( ALLOC_ARRAY( face->sbit_strikes, num_strikes, TT_SBit_Strike ) ) + 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 ( ACCESS_Frame( 48L * num_strikes ) ) + goto Exit; + + while ( count > 0 ) + { + if ( READ_Fields( strike_start_fields, strike ) || + READ_Fields( sbit_line_metrics_fields, &strike->hori ) || + READ_Fields( sbit_line_metrics_fields, &strike->vert ) || + READ_Fields( strike_end_fields, strike ) ) + break; + + count--; + strike++; + } + + FORGET_Frame(); + } + + /* 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; + + + if ( ALLOC_ARRAY( strike->sbit_ranges, + strike->num_ranges, + TT_SBit_Range ) ) + goto Exit; + + /* read each range */ + if ( FILE_Seek( table_base + strike->ranges_offset ) || + ACCESS_Frame( strike->num_ranges * 8L ) ) + goto Exit; + + range = strike->sbit_ranges; + while ( count2 > 0 ) + { + range->first_glyph = GET_UShort(); + range->last_glyph = GET_UShort(); + range->table_offset = table_base + strike->ranges_offset + + GET_ULong(); + count2--; + range++; + } + + FORGET_Frame(); + + /* Now, read each index table */ + count2 = strike->num_ranges; + range = strike->sbit_ranges; + while ( count2 > 0 ) + { + /* Read the header */ + if ( FILE_Seek( range->table_offset ) || + ACCESS_Frame( 8L ) ) + goto Exit; + + range->index_format = GET_UShort(); + range->image_format = GET_UShort(); + range->image_offset = GET_ULong(); + + FORGET_Frame(); + + error = Load_SBit_Range( range, stream ); + if ( error ) + goto Exit; + + count2--; + range++; + } + + count--; + strike++; + } + } + + Exit: + return error; + } + + + /*************************************************************************/ + /* */ + /* */ + /* TT_Free_SBit_Strikes */ + /* */ + /* */ + /* Releases the embedded bitmap tables. */ + /* */ + /* */ + /* face :: The target face object. */ + /* */ + FT_LOCAL_DEF + void TT_Free_SBit_Strikes( 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 */ + FREE( range->glyph_offsets ); + FREE( range->glyph_codes ); + } + } + FREE( strike->sbit_ranges ); + strike->num_ranges = 0; + } + FREE( face->sbit_strikes ); + } + face->num_sbit_strikes = 0; + } + + + FT_LOCAL_DEF + FT_Error TT_Set_SBit_Strike( TT_Face face, + FT_Int x_ppem, + FT_Int y_ppem, + FT_ULong *astrike_index ) + { + FT_Int i; + + + if ( x_ppem < 0 || x_ppem > 255 || + y_ppem < 1 || y_ppem > 255 ) + return TT_Err_Invalid_PPem; + + for ( i = 0; i < face->num_sbit_strikes; i++ ) + { + if ( ( face->sbit_strikes[i].y_ppem == y_ppem ) && + ( ( x_ppem == 0 ) || + ( face->sbit_strikes[i].x_ppem == x_ppem ) ) ) + { + *astrike_index = i; + return TT_Err_Ok; + } + } + + return TT_Err_Invalid_PPem; + } + + + /*************************************************************************/ + /* */ + /* */ + /* Find_SBit_Range */ + /* */ + /* */ + /* Scans a given strike's ranges and return, for a given glyph */ + /* index, the corresponding sbit range, and `EBDT' offset. */ + /* */ + /* */ + /* glyph_index :: The glyph index. */ + /* */ + /* strike :: The source/current sbit strike. */ + /* */ + /* */ + /* arange :: The sbit range containing the glyph index. */ + /* */ + /* aglyph_offset :: The offset of the glyph data in `EBDT' table. */ + /* */ + /* */ + /* 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_Range *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 = 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 TT_Err_Invalid_Argument; + } + + + /*************************************************************************/ + /* */ + /* */ + /* Find_SBit_Image */ + /* */ + /* */ + /* Checks whether an embedded bitmap (an `sbit') exists for a given */ + /* glyph, at a given strike. */ + /* */ + /* */ + /* face :: The target face object. */ + /* */ + /* glyph_index :: The glyph index. */ + /* */ + /* strike_index :: The current strike index. */ + /* */ + /* */ + /* 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. */ + /* */ + /* */ + /* FreeType error code. 0 means success. Returns */ + /* TT_Err_Invalid_Argument if no sbit exists for the requested glyph. */ + /* */ + static + FT_Error 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 <= (FT_Int)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 TT_Err_Ok; + + Fail: + /* no embedded bitmap for this glyph in face */ + *arange = 0; + *astrike = 0; + *aglyph_offset = 0; + + return TT_Err_Invalid_Argument; + } + + + /*************************************************************************/ + /* */ + /* */ + /* Load_SBit_Metrics */ + /* */ + /* */ + /* Gets the big metrics for a given SBit. */ + /* */ + /* */ + /* stream :: The input stream. */ + /* */ + /* range :: The SBit range containing the glyph. */ + /* */ + /* */ + /* big_metrics :: A big SBit metrics structure for the glyph. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + /* */ + /* 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. */ + /* */ + static + FT_Error Load_SBit_Metrics( FT_Stream stream, + TT_SBit_Range* range, + TT_SBit_Metrics* metrics ) + { + FT_Error error = TT_Err_Ok; + + + switch ( range->image_format ) + { + case 1: + case 2: + case 8: + /* variable small metrics */ + { + TT_SBit_Small_Metrics smetrics; + + const FT_Frame_Field sbit_small_metrics_fields[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE TT_SBit_Small_Metrics + + 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 ( 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 ( 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 TT_Err_Invalid_File_Format; + } + + Exit: + return error; + } + + + /*************************************************************************/ + /* */ + /* */ + /* Crop_Bitmap */ + /* */ + /* */ + /* Crops a bitmap to its tightest bounding box, and adjusts its */ + /* metrics. */ + /* */ + /* */ + /* 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; + + MEM_Move( line, line + count * line_len, + ( rows - count ) * line_len ); + + metrics->height -= count; + metrics->horiBearingY -= count; + 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 -= 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 = cur[0] << 1; + for ( n = 8; n < width; n += 8 ) + { + FT_Byte val; + + + val = cur[1]; + cur[0] = old | ( val >> 7 ); + old = 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 = 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 = TT_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 TT_Err_Invalid_File_Format; + } + + /* Now read data and draw glyph into target pixmap */ + if ( ACCESS_Frame( 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 ); + + FORGET_Frame(); + } + + 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_Bitmap* map, + FT_Int x_offset, + FT_Int y_offset, + FT_Stream stream, + TT_SBit_Metrics* metrics ) + { + FT_Memory memory = stream->memory; + FT_Error error; + + + /* place stream at beginning of glyph data and read metrics */ + if ( FILE_Seek( ebdt_pos + glyph_offset ) ) + goto Exit; + + error = Load_SBit_Metrics( stream, range, metrics ); + if ( error ) + goto Exit; + + /* this function is recursive. At the top-level call, the */ + /* field map.buffer is NULL. We thus begin by finding the */ + /* dimensions of the higher-level glyph to allocate the */ + /* final pixmap buffer */ + if ( map->buffer == 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_pal2; + map->pitch = ( map->width + 3 ) >> 2; + break; + + case 4: + map->pixel_mode = ft_pixel_mode_pal4; + map->pitch = ( map->width + 1 ) >> 1; + break; + + case 8: + map->pixel_mode = ft_pixel_mode_grays; + map->pitch = map->width; + break; + + default: + return TT_Err_Invalid_File_Format; + } + + size = map->rows * map->pitch; + + /* check that there is no empty image */ + if ( size == 0 ) + goto Exit; /* exit successfully! */ + + if ( ALLOC( map->buffer, size ) ) + 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_Skip_Stream( stream, 1L ); + /* fallthrough */ + + case 9: + break; + + default: /* invalid image format */ + return TT_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 ( READ_UShort( num_components ) || + ALLOC_ARRAY( components, num_components, TT_SBit_Component ) ) + goto Exit; + + count = num_components; + + if ( ACCESS_Frame( 4L * num_components ) ) + goto Fail_Memory; + + for ( comp = components; count > 0; count--, comp++ ) + { + comp->glyph_code = GET_UShort(); + comp->x_offset = GET_Char(); + comp->y_offset = GET_Char(); + } + + FORGET_Frame(); + + /* Now recursively load each element glyph */ + count = num_components; + comp = components; + for ( ; count > 0; count--, comp++ ) + { + TT_SBit_Range* elem_range; + TT_SBit_Metrics 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, + map, + x_offset + comp->x_offset, + y_offset + comp->y_offset, + stream, + &elem_metrics ); + if ( error ) + goto Fail_Memory; + } + + Fail_Memory: + FREE( components ); + } + + Exit: + return error; + } + + + /*************************************************************************/ + /* */ + /* */ + /* TT_Load_SBit_Image */ + /* */ + /* */ + /* Loads a given glyph sbit image from the font resource. This also */ + /* returns its metrics. */ + /* */ + /* */ + /* 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. */ + /* */ + /* */ + /* map :: The target pixmap. */ + /* */ + /* metrics :: A big sbit metrics structure for the glyph image. */ + /* */ + /* */ + /* FreeType error code. 0 means success. Returns an error if no */ + /* glyph sbit exists for the index. */ + /* */ + /* */ + /* The `map.buffer' field is always freed before the glyph is loaded. */ + /* */ + FT_LOCAL_DEF + FT_Error TT_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_Metrics *metrics ) + { + FT_Error error; + FT_Memory memory = stream->memory; + 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 = 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 = FILE_Pos(); + + /* clear the bitmap & load the bitmap */ + if ( face->root.glyph->flags & ft_glyph_own_bitmap ) + FREE( map->buffer ); + + map->rows = map->pitch = map->width = 0; + + error = Load_SBit_Image( strike, range, ebdt_pos, glyph_offset, + map, 0, 0, stream, metrics ); + if ( error ) + goto Exit; + + /* the glyph slot owns this bitmap buffer */ + face->root.glyph->flags |= ft_glyph_own_bitmap; + + /* setup vertical metrics if needed */ + if ( strike->flags & 1 ) + { + /* in case of a horizontal strike only */ + FT_Int advance; + FT_Int top; + + + advance = strike->hori.ascender - strike->hori.descender; + top = advance / 10; + + /* some heuristic values */ + + metrics->vertBearingX = -metrics->width / 2; + metrics->vertBearingY = advance / 10; + metrics->vertAdvance = advance * 12 / 10; + } + + /* Crop the bitmap now, unless specified otherwise */ + if ( load_flags & FT_LOAD_CROP_BITMAP ) + Crop_Bitmap( map, metrics ); + + Exit: + return error; + } + + +/* END */ Index: xc/extras/freetype2/src/sfnt/ttsbit.h diff -u /dev/null xc/extras/freetype2/src/sfnt/ttsbit.h:1.1.1.1 --- /dev/null Mon Dec 18 14:22:40 2000 +++ xc/extras/freetype2/src/sfnt/ttsbit.h Fri Dec 8 16:26:24 2000 @@ -0,0 +1,71 @@ +/***************************************************************************/ +/* */ +/* ttsbit.h */ +/* */ +/* TrueType and OpenType embedded bitmap support (specification). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#ifndef TTSBIT_H +#define TTSBIT_H + + +#ifdef FT_FLAT_COMPILE + +#include "ttload.h" + +#else + +#include + +#endif + + +#ifdef __cplusplus + extern "C" { +#endif + + + FT_LOCAL + FT_Error TT_Load_SBit_Strikes( TT_Face face, + FT_Stream stream ); + + FT_LOCAL + void TT_Free_SBit_Strikes( TT_Face face ); + + + FT_LOCAL + FT_Error TT_Set_SBit_Strike( TT_Face face, + FT_Int x_ppem, + FT_Int y_ppem, + FT_ULong *astrike_index ); + + FT_LOCAL + FT_Error TT_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_Metrics *metrics ); + + +#ifdef __cplusplus + } +#endif + + +#endif /* TTSBIT_H */ + + +/* END */ Index: xc/extras/freetype2/src/smooth/ftgrays.c diff -u /dev/null xc/extras/freetype2/src/smooth/ftgrays.c:1.1.1.1 --- /dev/null Mon Dec 18 14:22:40 2000 +++ xc/extras/freetype2/src/smooth/ftgrays.c Fri Dec 8 16:26:24 2000 @@ -0,0 +1,1973 @@ +/***************************************************************************/ +/* */ +/* ftgrays.c */ +/* */ +/* A new `perfect' anti-aliasing renderer (body). */ +/* */ +/* Copyright 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. */ +/* */ +/***************************************************************************/ + + /*************************************************************************/ + /* */ + /* 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/base/ftgrays.c' to your current directory */ + /* */ + /* - copy `include/freetype/ftimage.h' and */ + /* `include/freetype/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_grays_raster.grays_raster_new'; an anti-aliased bitmap can be */ + /* generated with a call to `ft_grays_raster.grays_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. */ + /* */ + /*************************************************************************/ + + +#include /* for memcpy() */ + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_aaraster + + +#ifdef _STANDALONE_ + + +#define ErrRaster_Invalid_Mode -2 +#define ErrRaster_Invalid_Outline -1 + +#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_ */ + + +#ifdef FT_FLAT_COMPILE + +#include "ftgrays.h" + +#else + +#include + +#endif + + +#include /* for FT_UNUSED() */ +#include /* for FT_TRACE() and FT_ERROR() */ +#include /* for FT_Outline_Decompose() */ + +#define ErrRaster_Invalid_Mode FT_Err_Cannot_Render_Glyph +#define ErrRaster_Invalid_Outline FT_Err_Invalid_Outline + + +#endif /* _STANDALONE_ */ + + + /* define this to dump debugging information */ +#define xxxDEBUG_GRAYS + + /* as usual, for the speed hungry :-) */ + +#ifndef FT_STATIC_RASTER + + +#define RAS_ARG PRaster raster +#define RAS_ARG_ PRaster raster, + +#define RAS_VAR raster +#define RAS_VAR_ raster, + +#define ras (*raster) + + +#else /* FT_STATIC_RASTER */ + + +#define RAS_ARG /* empty */ +#define RAS_ARG_ /* empty */ +#define RAS_VAR /* empty */ +#define RAS_VAR_ /* empty */ + + static TRaster 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 ) ( (x) >> PIXEL_BITS ) +#define SUBPIXELS( x ) ( (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 + + /* Define this if you want to use a more compact storage scheme. This */ + /* increases the number of cells available in the render pool but slows */ + /* down the rendering a bit. It is useful if you have a really tiny */ + /* render pool. */ +#define xxxGRAYS_COMPACT + + + /*************************************************************************/ + /* */ + /* TYPE DEFINITIONS */ + /* */ + typedef int TScan; /* integer scanline/pixel coordinate */ + typedef long TPos; /* sub-pixel coordinate */ + + /* maximal number of gray spans in a call to the span callback */ +#define FT_MAX_GRAY_SPANS 32 + + +#ifdef GRAYS_COMPACT + + typedef struct TCell_ + { + short x : 14; + short y : 14; + int cover : PIXEL_BITS + 2; + int area : PIXEL_BITS * 2 + 2; + + } TCell, *PCell; + +#else /* GRAYS_COMPACT */ + + typedef struct TCell_ + { + TScan x; + TScan y; + int cover; + int area; + + } TCell, *PCell; + +#endif /* GRAYS_COMPACT */ + + + typedef struct TRaster_ + { + PCell cells; + int max_cells; + int num_cells; + + TScan min_ex, max_ex; + TScan min_ey, max_ey; + + int area; + int cover; + int invalid; + + TScan ex, ey; + TScan cx, cy; + TPos x, y; + + TScan last_ey; + + FT_Vector bez_stack[32 * 3]; + int lev_stack[32]; + + FT_Outline outline; + FT_Bitmap target; + + 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; + + void* memory; + + } TRaster, *PRaster; + + + /*************************************************************************/ + /* */ + /* Initialize the cells table. */ + /* */ + static + void init_cells( RAS_ARG_ void* buffer, + long byte_size ) + { + ras.cells = (PCell)buffer; + ras.max_cells = byte_size / sizeof ( TCell ); + ras.num_cells = 0; + ras.area = 0; + ras.cover = 0; + ras.invalid = 1; + } + + + /*************************************************************************/ + /* */ + /* Compute the outline bounding box. */ + /* */ + static + void compute_cbox( RAS_ARG_ FT_Outline* 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 + int record_cell( RAS_ARG ) + { + PCell cell; + + + if ( !ras.invalid && ( ras.area | ras.cover ) ) + { + if ( ras.num_cells >= ras.max_cells ) + return 1; + + cell = ras.cells + ras.num_cells++; + cell->x = ras.ex - ras.min_ex; + cell->y = ras.ey - ras.min_ey; + cell->area = ras.area; + cell->cover = ras.cover; + } + + return 0; + } + + + /*************************************************************************/ + /* */ + /* Set the current cell to a new position. */ + /* */ + static + int set_cell( RAS_ARG_ TScan ex, + TScan ey ) + { + int invalid, record, clean; + + + /* 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. */ + + record = 0; + clean = 1; + + invalid = ( ey < ras.min_ey || ey >= ras.max_ey || ex >= ras.max_ex ); + if ( !invalid ) + { + /* All cells that are on the left of the clipping region go to the */ + /* min_ex - 1 horizontal position. */ + if ( ex < ras.min_ex ) + ex = ras.min_ex - 1; + + /* if our position is new, then record the previous cell */ + if ( ex != ras.ex || ey != ras.ey ) + record = 1; + else + clean = ras.invalid; /* do not clean if we didn't move from */ + /* a valid cell */ + } + + /* record the previous cell if needed (i.e., if we changed the cell */ + /* position, of changed the `invalid' flag) */ + if ( ( ras.invalid != invalid || record ) && record_cell( RAS_VAR ) ) + return 1; + + if ( clean ) + { + ras.area = 0; + ras.cover = 0; + } + + ras.invalid = invalid; + ras.ex = ex; + ras.ey = ey; + return 0; + } + + + /*************************************************************************/ + /* */ + /* Start a new contour at a given cell. */ + /* */ + static + void start_cell( RAS_ARG_ TScan ex, + TScan ey ) + { + if ( ex < ras.min_ex ) + ex = ras.min_ex - 1; + + ras.area = 0; + ras.cover = 0; + ras.ex = ex; + ras.ey = ey; + ras.last_ey = SUBPIXELS( ey ); + ras.invalid = 0; + + (void)set_cell( RAS_VAR_ ex, ey ); + } + + + /*************************************************************************/ + /* */ + /* Render a scanline as one or more cells. */ + /* */ + static + int render_scanline( RAS_ARG_ TScan ey, + TPos x1, + TScan y1, + TPos x2, + TScan y2 ) + { + TScan ex1, ex2, fx1, fx2, delta; + long p, first, dx; + int incr, lift, mod, rem; + + + dx = x2 - x1; + + ex1 = TRUNC( x1 ); /* if (ex1 >= ras.max_ex) ex1 = ras.max_ex-1; */ + ex2 = TRUNC( x2 ); /* if (ex2 >= ras.max_ex) ex2 = ras.max_ex-1; */ + fx1 = x1 - SUBPIXELS( ex1 ); + fx2 = x2 - SUBPIXELS( ex2 ); + + /* trivial case. Happens often */ + if ( y1 == y2 ) + return set_cell( RAS_VAR_ ex2, ey ); + + /* everything is located in a single cell. That is easy! */ + /* */ + if ( ex1 == ex2 ) + { + delta = y2 - y1; + ras.area += ( fx1 + fx2 ) * delta; + ras.cover += delta; + return 0; + } + + /* 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 = p / dx; + mod = p % dx; + if ( mod < 0 ) + { + delta--; + mod += dx; + } + + ras.area += ( fx1 + first ) * delta; + ras.cover += delta; + + ex1 += incr; + if ( set_cell( RAS_VAR_ ex1, ey ) ) + goto Error; + y1 += delta; + + if ( ex1 != ex2 ) + { + p = ONE_PIXEL * ( y2 - y1 ); + lift = p / dx; + rem = p % dx; + if ( rem < 0 ) + { + lift--; + rem += dx; + } + + mod -= dx; + + while ( ex1 != ex2 ) + { + delta = lift; + mod += rem; + if ( mod >= 0 ) + { + mod -= dx; + delta++; + } + + ras.area += ONE_PIXEL * delta; + ras.cover += delta; + y1 += delta; + ex1 += incr; + if ( set_cell( RAS_VAR_ ex1, ey ) ) + goto Error; + } + } + + delta = y2 - y1; + ras.area += ( fx2 + ONE_PIXEL - first ) * delta; + ras.cover += delta; + + return 0; + + Error: + return 1; + } + + + /*************************************************************************/ + /* */ + /* Render a given line as a series of scanlines. */ + /* */ + static + int render_line( RAS_ARG_ TPos to_x, + TPos to_y ) + { + TScan ey1, ey2, fy1, fy2; + TPos dx, dy, x, x2; + int p, rem, mod, lift, delta, first, incr; + + + ey1 = TRUNC( ras.last_ey ); + ey2 = TRUNC( to_y ); /* if (ey2 >= ras.max_ey) ey2 = ras.max_ey-1; */ + fy1 = ras.y - ras.last_ey; + fy2 = 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 */ + { + TScan 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 ) + { + if ( render_scanline( RAS_VAR_ ey1, ras.x, fy1, to_x, fy2 ) ) + goto Error; + 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 = p / dy; + mod = p % dy; + if ( mod < 0 ) + { + delta--; + mod += dy; + } + + x = ras.x + delta; + if ( render_scanline( RAS_VAR_ ey1, ras.x, fy1, x, first ) ) + goto Error; + + ey1 += incr; + if ( set_cell( RAS_VAR_ TRUNC( x ), ey1 ) ) + goto Error; + + if ( ey1 != ey2 ) + { + p = ONE_PIXEL * dx; + lift = p / dy; + rem = p % dy; + if ( rem < 0 ) + { + lift--; + rem += dy; + } + mod -= dy; + + while ( ey1 != ey2 ) + { + delta = lift; + mod += rem; + if ( mod >= 0 ) + { + mod -= dy; + delta++; + } + + x2 = x + delta; + if ( render_scanline( RAS_VAR_ ey1, + x, ONE_PIXEL - first, x2, first ) ) + goto Error; + x = x2; + ey1 += incr; + if ( set_cell( RAS_VAR_ TRUNC( x ), ey1 ) ) + goto Error; + } + } + + if ( render_scanline( RAS_VAR_ ey1, + x, ONE_PIXEL - first, to_x, fy2 ) ) + goto Error; + + End: + ras.x = to_x; + ras.y = to_y; + ras.last_ey = SUBPIXELS( ey2 ); + + return 0; + + Error: + return 1; + } + + + static + void 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 + int render_conic( RAS_ARG_ FT_Vector* control, + 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 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; + + return render_line( RAS_VAR_ mid_x, mid_y ) || + render_line( RAS_VAR_ to_x, to_y ); + } + + 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 ) < 0 ) + goto Draw; + + 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; + + if ( render_line( RAS_VAR_ mid_x, mid_y ) || + render_line( RAS_VAR_ to_x, to_y ) ) + return 1; + + top--; + arc -= 2; + } + } + return 0; + } + + + static + void 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 + int render_cubic( RAS_ARG_ FT_Vector* control1, + FT_Vector* control2, + 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; + + return render_line( RAS_VAR_ mid_x, mid_y ) || + render_line( RAS_VAR_ to_x, to_y ); + } + + arc = ras.bez_stack; + arc[0].x = UPSCALE( to->x ); + arc[0].y = UPSCALE( to->y ); + arc[1].x = UPSCALE( control2->x ); + arc[1].y = UPSCALE( control2->y ); + arc[2].x = UPSCALE( control1->x ); + arc[2].y = UPSCALE( control1->y ); + arc[3].x = ras.x; + arc[3].y = ras.y; + + 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; + 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; + + if ( render_line( RAS_VAR_ mid_x, mid_y ) || + render_line( RAS_VAR_ to_x, to_y ) ) + return 1; + top --; + arc -= 3; + } + } + return 0; + } + + + /* a macro comparing two cell pointers. Returns true if a <= b. */ +#if 1 + +#define PACK( a ) ( ( (long)(a)->y << 16 ) + (a)->x ) +#define LESS_THAN( a, b ) ( PACK( a ) < PACK( b ) ) + +#else /* 1 */ + +#define LESS_THAN( a, b ) ( (a)->y < (b)->y || \ + ( (a)->y == (b)->y && (a)->x < (b)->x ) ) + +#endif /* 1 */ + +#define SWAP_CELLS( a, b, temp ) do \ + { \ + temp = *(a); \ + *(a) = *(b); \ + *(b) = temp; \ + } while ( 0 ) +#define DEBUG_SORT +#define QUICK_SORT + +#ifdef SHELL_SORT + + /* a simple shell sort algorithm that works directly on our */ + /* cells table */ + static + void shell_sort ( PCell cells, + int count ) + { + PCell i, j, limit = cells + count; + TCell temp; + int gap; + + + /* compute initial gap */ + for ( gap = 0; ++gap < count; gap *= 3 ) + ; + + while ( gap /= 3 ) + { + for ( i = cells + gap; i < limit; i++ ) + { + for ( j = i - gap; ; j -= gap ) + { + PCell k = j + gap; + + + if ( LESS_THAN( j, k ) ) + break; + + SWAP_CELLS( j, k, temp ); + + if ( j < cells + gap ) + break; + } + } + } + } + +#endif /* SHELL_SORT */ + + +#ifdef QUICK_SORT + + /* This is a non-recursive quicksort that directly process our cells */ + /* array. It should be faster than calling the stdlib qsort(), and we */ + /* can even tailor our insertion threshold... */ + +#define QSORT_THRESHOLD 9 /* below this size, a sub-array will be sorted */ + /* through a normal insertion sort */ + + static + void quick_sort( PCell cells, + int count ) + { + PCell stack[40]; /* should be enough ;-) */ + PCell* top; /* top of stack */ + PCell base, limit; + TCell temp; + + + limit = cells + count; + base = cells; + top = stack; + + for (;;) + { + int len = limit - base; + PCell i, j, pivot; + + + if ( len > QSORT_THRESHOLD ) + { + /* we use base + len/2 as the pivot */ + pivot = base + len / 2; + SWAP_CELLS( base, pivot, temp ); + + i = base + 1; + j = limit - 1; + + /* now ensure that *i <= *base <= *j */ + if ( LESS_THAN( j, i ) ) + SWAP_CELLS( i, j, temp ); + + if ( LESS_THAN( base, i ) ) + SWAP_CELLS( base, i, temp ); + + if ( LESS_THAN( j, base ) ) + SWAP_CELLS( base, j, temp ); + + for (;;) + { + do i++; while ( LESS_THAN( i, base ) ); + do j--; while ( LESS_THAN( base, j ) ); + + if ( i > j ) + break; + + SWAP_CELLS( i, j, temp ); + } + + SWAP_CELLS( base, j, temp ); + + /* now, push the largest sub-array */ + if ( j - base > limit - i ) + { + top[0] = base; + top[1] = j; + base = i; + } + else + { + top[0] = i; + top[1] = limit; + limit = j; + } + top += 2; + } + else + { + /* the sub-array is small, perform insertion sort */ + j = base; + i = j + 1; + + for ( ; i < limit; j = i, i++ ) + { + for ( ; LESS_THAN( j + 1, j ); j-- ) + { + SWAP_CELLS( j + 1, j, temp ); + if ( j == base ) + break; + } + } + if ( top > stack ) + { + top -= 2; + base = top[0]; + limit = top[1]; + } + else + break; + } + } + } + +#endif /* QUICK_SORT */ + + +#ifdef DEBUG_GRAYS +#ifdef DEBUG_SORT + + static + int check_sort( PCell cells, + int count ) + { + PCell p, q; + + + for ( p = cells + count - 2; p >= cells; p-- ) + { + q = p + 1; + if ( !LESS_THAN( p, q ) ) + return 0; + } + return 1; + } + +#endif /* DEBUG_SORT */ +#endif /* DEBUG_GRAYS */ + + + static + int Move_To( FT_Vector* to, + FT_Raster raster ) + { + TPos x, y; + + + /* record current cell, if any */ + record_cell( (PRaster)raster ); + + /* start to a new position */ + x = UPSCALE( to->x ); + y = UPSCALE( to->y ); + start_cell( (PRaster)raster, TRUNC( x ), TRUNC( y ) ); + ((PRaster)raster)->x = x; + ((PRaster)raster)->y = y; + return 0; + } + + + static + int Line_To( FT_Vector* to, + FT_Raster raster ) + { + return render_line( (PRaster)raster, + UPSCALE( to->x ), UPSCALE( to->y ) ); + } + + + static + int Conic_To( FT_Vector* control, + FT_Vector* to, + FT_Raster raster ) + { + return render_conic( (PRaster)raster, control, to ); + } + + + static + int Cubic_To( FT_Vector* control1, + FT_Vector* control2, + FT_Vector* to, + FT_Raster raster ) + { + return render_cubic( (PRaster)raster, control1, control2, to ); + } + + + static + void grays_render_span( int y, + int count, + FT_Span* spans, + PRaster raster ) + { + unsigned char* p; + FT_Bitmap* map = &raster->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++ ) + { + if ( spans->coverage ) +#if 1 + memset( p + spans->x, (unsigned char)spans->coverage, spans->len ); +#else /* 1 */ + { + q = p + spans->x; + limit = q + spans->len; + for ( ; q < limit; q++ ) + q[0] = (unsigned char)spans->coverage; + } +#endif /* 1 */ + } + } + + +#ifdef DEBUG_GRAYS + +#include + + static + void dump_cells( RAS_ARG ) + { + PCell cell, limit; + int y = -1; + + + cell = ras.cells; + limit = cell + ras.num_cells; + + for ( ; cell < limit; cell++ ) + { + if ( cell->y != y ) + { + fprintf( stderr, "\n%2d: ", cell->y ); + y = cell->y; + } + fprintf( stderr, "[%d %d %d]", + cell->x, cell->area, cell->cover ); + } + fprintf(stderr, "\n" ); + } + +#endif /* DEBUG_GRAYS */ + + + static + void grays_hline( RAS_ARG_ TScan x, + TScan 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 = area >> ( PIXEL_BITS * 2 + 1 - 8); /* use range 0..256 */ + + if ( ras.outline.flags & ft_outline_even_odd_fill ) + { + if ( coverage < 0 ) + coverage = -coverage; + + while ( coverage >= 512 ) + coverage -= 512; + + if ( coverage > 256 ) + coverage = 512 - coverage; + else if ( coverage == 256 ) + coverage = 255; + } + else + { + /* normal non-zero winding rule */ + if ( coverage < 0 ) + coverage = -coverage; + + if ( coverage >= 256 ) + coverage = 255; + } + + y += ras.min_ey; + x += ras.min_ex; + + if ( coverage ) + { + /* see if 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 += 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++; + } + } + + + static + void grays_sweep( RAS_ARG_ FT_Bitmap* target ) + { + TScan x, y, cover, area; + PCell start, cur, limit; + + FT_UNUSED( target ); + + + cur = ras.cells; + limit = cur + ras.num_cells; + + cover = 0; + ras.span_y = -1; + ras.num_gray_spans = 0; + + for (;;) + { + start = cur; + y = start->y; + x = start->x; + + area = start->area; + cover += start->cover; + + /* accumulate all start cells */ + for (;;) + { + ++cur; + if ( cur >= limit || cur->y != start->y || cur->x != start->x ) + break; + + area += cur->area; + cover += cur->cover; + } + + /* if the start cell has a non-null area, we must draw an */ + /* individual gray pixel there */ + if ( area && x >= 0 ) + { + grays_hline( RAS_VAR_ x, y, cover * ( ONE_PIXEL * 2 ) - area, 1 ); + x++; + } + + if ( x < 0 ) + x = 0; + + if ( cur < limit && start->y == cur->y ) + { + /* draw a gray span between the start cell and the current one */ + if ( cur->x > x ) + grays_hline( RAS_VAR_ x, y, + cover * ( ONE_PIXEL * 2 ), cur->x - x ); + } + else + { + /* draw a gray span until the end of the clipping region */ + if ( cover && x < ras.max_ex - ras.min_ex ) + grays_hline( RAS_VAR_ x, y, + cover * ( ONE_PIXEL * 2 ), + ras.max_ex - x - ras.min_ex ); + cover = 0; + } + + if ( cur >= limit ) + break; + } + + 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 DEBUG_GRAYS + + { + int n; + FT_Span* span; + + + fprintf( stderr, "y=%3d ", ras.span_y ); + span = ras.gray_spans; + for ( n = 0; n < ras.num_gray_spans; n++, span++ ) + fprintf( stderr, "[%d..%d]:%02x ", + span->x, span->x + span->len - 1, span->coverage ); + fprintf( stderr, "\n" ); + } + +#endif /* DEBUG_GRAYS */ + + } + + +#ifdef _STANDALONE_ + + /*************************************************************************/ + /* */ + /* The following function should only compile in stand_alone mode, */ + /* i.e., when building this component without the rest of FreeType. */ + /* */ + /*************************************************************************/ + + /*************************************************************************/ + /* */ + /* */ + /* FT_Outline_Decompose */ + /* */ + /* */ + /* 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. */ + /* */ + /* */ + /* outline :: A pointer to the source target. */ + /* */ + /* 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. */ + /* */ + /* */ + /* Error code. 0 means sucess. */ + /* */ + static + int FT_Outline_Decompose( FT_Outline* outline, + const FT_Outline_Funcs* interface, + void* user ) + { +#undef SCALED +#define SCALED( x ) ( ( (x) << shift ) - delta ) + + FT_Vector v_last; + FT_Vector v_control; + FT_Vector v_start; + + FT_Vector* point; + FT_Vector* limit; + char* tags; + + int n; /* index of contour in outline */ + int first; /* index of first point in contour */ + int error; + char tag; /* current point's state */ + + int shift = interface->shift; + FT_Pos delta = interface->delta; + + + 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 = 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 = 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 = 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 = interface->conic_to( &v_control, &v_middle, user ); + if ( error ) + goto Exit; + + v_control = vec; + goto Do_Conic; + } + + error = 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 = interface->cubic_to( &vec1, &vec2, &vec, user ); + if ( error ) + goto Exit; + continue; + } + + error = interface->cubic_to( &vec1, &vec2, &v_start, user ); + goto Close; + } + } + } + + /* close the contour with a line segment */ + error = 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_ + { + FT_Pos min, max; + + } TBand; + + + static + int grays_convert_glyph( RAS_ARG_ FT_Outline* outline ) + { + static + const FT_Outline_Funcs interface = + { + (FT_Outline_MoveTo_Func) Move_To, + (FT_Outline_LineTo_Func) Line_To, + (FT_Outline_ConicTo_Func)Conic_To, + (FT_Outline_CubicTo_Func)Cubic_To, + 0, + 0 + }; + + TBand bands[40], *band; + int n, num_bands; + TPos min, max, max_y; + + + /* Set up state in the raster object */ + compute_cbox( RAS_VAR_ outline ); + + /* clip to target bitmap, exit if nothing to do */ + if ( ras.max_ex <= 0 || ras.min_ex >= ras.target.width || + ras.max_ey <= 0 || ras.min_ey >= ras.target.rows ) + return 0; + + if ( ras.min_ex < 0 ) ras.min_ex = 0; + if ( ras.min_ey < 0 ) ras.min_ey = 0; + + if ( ras.max_ex > ras.target.width ) ras.max_ex = ras.target.width; + if ( ras.max_ey > ras.target.rows ) ras.max_ey = ras.target.rows; + + /* simple heuristic used to speed-up the bezier decomposition -- see */ + /* the code in render_conic() and render_cubic() for more details */ + ras.conic_level = 32; + ras.cubic_level = 16; + + { + int level = 0; + + + if ( ras.max_ex > 24 || ras.max_ey > 24 ) + level++; + if ( ras.max_ex > 120 || ras.max_ey > 120 ) + level++; + + ras.conic_level <<= level; + ras.cubic_level <<= level; + } + + /* setup vertical bands */ + num_bands = ( 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 ) + { + FT_Pos bottom, top, middle; + int error; + + + ras.num_cells = 0; + ras.invalid = 1; + ras.min_ey = band->min; + ras.max_ey = band->max; + + error = FT_Outline_Decompose( outline, &interface, &ras ) || + record_cell( RAS_VAR ); + + if ( !error ) + { +#ifdef SHELL_SORT + shell_sort( ras.cells, ras.num_cells ); +#else + quick_sort( ras.cells, ras.num_cells ); +#endif + +#ifdef DEBUG_GRAYS + check_sort( ras.cells, ras.num_cells ); + dump_cells( RAS_VAR ); +#endif + + grays_sweep( RAS_VAR_ &ras.target ); + band--; + continue; + } + + /* render pool overflow, we will reduce the render band by half */ + bottom = band->min; + top = band->max; + middle = bottom + ( ( top - bottom ) >> 1 ); + + /* waoow! This is too complex for a single scanline, something */ + /* must be really rotten here! */ + 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; + } + + + extern + int grays_raster_render( PRaster raster, + FT_Raster_Params* params ) + { + FT_Outline* outline = (FT_Outline*)params->source; + FT_Bitmap* target_map = params->target; + + + if ( !raster || !raster->cells || !raster->max_cells ) + return -1; + + /* 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; + + /* if direct mode is not set, we must have a target bitmap */ + if ( ( params->flags & ft_raster_flag_direct ) == 0 && + ( !target_map || !target_map->buffer ) ) + return -1; + + /* this version does not support monochrome rendering */ + if ( !( params->flags & ft_raster_flag_aa ) ) + return ErrRaster_Invalid_Mode; + + ras.outline = *outline; + ras.num_cells = 0; + ras.invalid = 1; + + if ( target_map ) + ras.target = *target_map; + + ras.render_span = (FT_Raster_Span_Func)grays_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 grays_convert_glyph( (PRaster)raster, outline ); + } + + + /**** RASTER OBJECT CREATION: In standalone mode, we simply use *****/ + /**** a static object. *****/ + +#ifdef _STANDALONE_ + + static + int grays_raster_new( void* memory, + FT_Raster* araster ) + { + static TRaster the_raster; + + FT_UNUSED( memory ); + + + *araster = (FT_Raster)&the_raster; + memset( &the_raster, 0, sizeof ( the_raster ) ); + + return 0; + } + + + static + void grays_raster_done( FT_Raster raster ) + { + /* nothing */ + FT_UNUSED( raster ); + } + +#else /* _STANDALONE_ */ + + static + int grays_raster_new( FT_Memory memory, + FT_Raster* araster ) + { + FT_Error error; + PRaster raster; + + + *araster = 0; + if ( !ALLOC( raster, sizeof ( TRaster ) ) ) + { + raster->memory = memory; + *araster = (FT_Raster)raster; + } + + return error; + } + + + static + void grays_raster_done( FT_Raster raster ) + { + FT_Memory memory = (FT_Memory)((PRaster)raster)->memory; + + + FREE( raster ); + } + +#endif /* _STANDALONE_ */ + + + static + void grays_raster_reset( FT_Raster raster, + const char* pool_base, + long pool_size ) + { + PRaster rast = (PRaster)raster; + + + if ( raster && pool_base && pool_size >= 4096 ) + init_cells( rast, (char*)pool_base, pool_size ); + + rast->band_size = ( pool_size / sizeof ( TCell ) ) / 8; + } + + + const FT_Raster_Funcs ft_grays_raster = + { + ft_glyph_format_outline, + + (FT_Raster_New_Func) grays_raster_new, + (FT_Raster_Reset_Func) grays_raster_reset, + (FT_Raster_Set_Mode_Func)0, + (FT_Raster_Render_Func) grays_raster_render, + (FT_Raster_Done_Func) grays_raster_done + }; + + +/* END */ Index: xc/extras/freetype2/src/smooth/ftgrays.h diff -u /dev/null xc/extras/freetype2/src/smooth/ftgrays.h:1.1.1.1 --- /dev/null Mon Dec 18 14:22:40 2000 +++ xc/extras/freetype2/src/smooth/ftgrays.h Fri Dec 8 16:26:24 2000 @@ -0,0 +1,52 @@ +/***************************************************************************/ +/* */ +/* ftgrays.h */ +/* */ +/* FreeType smooth renderer declaration */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + +#ifndef FTGRAYS_H +#define FTGRAYS_H + +#ifdef __cplusplus + extern "C" { +#endif + +#ifdef _STANDALONE_ +#include "ftimage.h" +#else +#include +#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 */ Index: xc/extras/freetype2/src/smooth/ftsmooth.c diff -u /dev/null xc/extras/freetype2/src/smooth/ftsmooth.c:1.1.1.1 --- /dev/null Mon Dec 18 14:22:41 2000 +++ xc/extras/freetype2/src/smooth/ftsmooth.c Fri Dec 8 16:26:24 2000 @@ -0,0 +1,221 @@ +/***************************************************************************/ +/* */ +/* ftsmooth.c */ +/* */ +/* Anti-aliasing renderer interface (body). */ +/* */ +/* Copyright 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 +#include + + +#ifdef FT_FLAT_COMPILE + +#include "ftsmooth.h" +#include "ftgrays.h" + +#else + +#include +#include + +#endif + + + /* 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, + FT_Matrix* matrix, + FT_Vector* delta ) + { + FT_Error error = FT_Err_Ok; + + + if ( slot->format != render->glyph_format ) + { + error = FT_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 ) + { + MEM_Set( cbox, 0, 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( FT_Renderer render, + FT_GlyphSlot slot, + FT_UInt mode, + 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 = FT_Err_Invalid_Argument; + goto Exit; + } + + /* check mode */ + if ( mode != ft_render_mode_normal ) + return FT_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 &= -64; + cbox.yMin &= -64; + cbox.xMax = ( cbox.xMax + 63 ) & -64; + cbox.yMax = ( cbox.yMax + 63 ) & -64; + + width = ( cbox.xMax - cbox.xMin ) >> 6; + height = ( cbox.yMax - cbox.yMin ) >> 6; + bitmap = &slot->bitmap; + memory = render->root.memory; + + /* release old bitmap buffer */ + if ( slot->flags & ft_glyph_own_bitmap ) + { + FREE( bitmap->buffer ); + slot->flags &= ~ft_glyph_own_bitmap; + } + + /* allocate new one, depends on pixel format */ + pitch = width; + bitmap->pixel_mode = ft_pixel_mode_grays; + bitmap->num_grays = 256; + bitmap->width = width; + bitmap->rows = height; + bitmap->pitch = pitch; + + if ( ALLOC( bitmap->buffer, (FT_ULong)pitch * height ) ) + goto Exit; + + slot->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 = ft_raster_flag_aa; + + /* render outline into the bitmap */ + error = render->raster_render( render->raster, ¶ms ); + if ( error ) + goto Exit; + + slot->format = ft_glyph_format_bitmap; + slot->bitmap_left = cbox.xMin >> 6; + slot->bitmap_top = cbox.yMax >> 6; + + Exit: + 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, + + (FTRenderer_render) ft_smooth_render, + (FTRenderer_transform)ft_smooth_transform, + (FTRenderer_getCBox) ft_smooth_get_cbox, + (FTRenderer_setMode) ft_smooth_set_mode, + + (FT_Raster_Funcs*) &ft_grays_raster + }; + + +/* END */ Index: xc/extras/freetype2/src/smooth/ftsmooth.h diff -u /dev/null xc/extras/freetype2/src/smooth/ftsmooth.h:1.1.1.1 --- /dev/null Mon Dec 18 14:22:41 2000 +++ xc/extras/freetype2/src/smooth/ftsmooth.h Fri Dec 8 16:26:24 2000 @@ -0,0 +1,46 @@ +/***************************************************************************/ +/* */ +/* ftsmooth.h */ +/* */ +/* Anti-aliasing renderer interface (specification). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#ifndef FTSMOOTH_H +#define FTSMOOTH_H + +#include + + +#ifdef __cplusplus + extern "C" { +#endif + + +#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; +#endif + +#ifdef __cplusplus + } +#endif + + +#endif /* FTSMOOTH_H */ + + +/* END */ Index: xc/extras/freetype2/src/smooth/module.mk diff -u /dev/null xc/extras/freetype2/src/smooth/module.mk:1.1.1.1 --- /dev/null Mon Dec 18 14:22:41 2000 +++ xc/extras/freetype2/src/smooth/module.mk Fri Dec 8 16:26:24 2000 @@ -0,0 +1,22 @@ +# +# FreeType 2 smooth renderer module definition +# + + +# 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. + + +make_module_list: add_smooth_renderer + +add_smooth_renderer: + $(OPEN_DRIVER)ft_smooth_renderer_class$(CLOSE_DRIVER) + $(ECHO_DRIVER)smooth $(ECHO_DRIVER_DESC)anti-aliased bitmap renderer$(ECHO_DRIVER_DONE) + +# EOF Index: xc/extras/freetype2/src/smooth/rules.mk diff -u /dev/null xc/extras/freetype2/src/smooth/rules.mk:1.1.1.1 --- /dev/null Mon Dec 18 14:22:41 2000 +++ xc/extras/freetype2/src/smooth/rules.mk Fri Dec 8 16:26:25 2000 @@ -0,0 +1,69 @@ +# +# FreeType 2 smooth renderer module build rules +# + + +# 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. + + +# smooth driver directory +# +SMOOTH_DIR := $(SRC_)smooth +SMOOTH_DIR_ := $(SMOOTH_DIR)$(SEP) + +# compilation flags for the driver +# +SMOOTH_COMPILE := $(FT_COMPILE) + + +# 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 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_)%.$O) +SMOOTH_DRV_OBJ_S := $(OBJ_)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$@ $(SMOOTH_DRV_SRC_S) + + +# smooth driver - multiple objects +# +$(OBJ_)%.$O: $(SMOOTH_DIR_)%.c $(FREETYPE_H) $(SMOOTH_DRV_H) + $(SMOOTH_COMPILE) $T$@ $< + + +# update main driver object lists +# +DRV_OBJS_S += $(SMOOTH_DRV_OBJ_S) +DRV_OBJS_M += $(SMOOTH_DRV_OBJ_M) + + +# EOF Index: xc/extras/freetype2/src/smooth/smooth.c diff -u /dev/null xc/extras/freetype2/src/smooth/smooth.c:1.1.1.1 --- /dev/null Mon Dec 18 14:22:41 2000 +++ xc/extras/freetype2/src/smooth/smooth.c Fri Dec 8 16:26:25 2000 @@ -0,0 +1,35 @@ +/***************************************************************************/ +/* */ +/* smooth.c */ +/* */ +/* FreeType anti-aliasing rasterer module component (body only). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#define FT_MAKE_OPTION_SINGLE_OBJECT + + +#ifdef FT_FLAT_COMPILE + +#include "ftgrays.c" +#include "ftsmooth.c" + +#else + +#include +#include + +#endif + + +/* END */ Index: xc/extras/freetype2/src/truetype/module.mk diff -u /dev/null xc/extras/freetype2/src/truetype/module.mk:1.1.1.1 --- /dev/null Mon Dec 18 14:22:41 2000 +++ xc/extras/freetype2/src/truetype/module.mk Fri Dec 8 16:26:25 2000 @@ -0,0 +1,22 @@ +# +# FreeType 2 TrueType module definition +# + + +# 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. + + +make_module_list: add_truetype_driver + +add_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) + +# EOF Index: xc/extras/freetype2/src/truetype/rules.mk diff -u /dev/null xc/extras/freetype2/src/truetype/rules.mk:1.1.1.1 --- /dev/null Mon Dec 18 14:22:41 2000 +++ xc/extras/freetype2/src/truetype/rules.mk Fri Dec 8 16:26:25 2000 @@ -0,0 +1,70 @@ +# +# FreeType 2 TrueType driver configuration rules +# + + +# 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. + + +# TrueType driver directory +# +TT_DIR := $(SRC_)truetype +TT_DIR_ := $(TT_DIR)$(SEP) + + +# compilation flags for the driver +# +TT_COMPILE := $(FT_COMPILE) + + +# 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_)ttdriver.c + +# TrueType driver headers +# +TT_DRV_H := $(TT_DRV_SRC:%.c=%.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_)%.$O) +TT_DRV_OBJ_S := $(OBJ_)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$@ $(TT_DRV_SRC_S) + + +# driver - multiple objects +# +$(OBJ_)%.$O: $(TT_DIR_)%.c $(FREETYPE_H) $(TT_DRV_H) + $(TT_COMPILE) $T$@ $< + + +# update main driver object lists +# +DRV_OBJS_S += $(TT_DRV_OBJ_S) +DRV_OBJS_M += $(TT_DRV_OBJ_M) + +# EOF Index: xc/extras/freetype2/src/truetype/truetype.c diff -u /dev/null xc/extras/freetype2/src/truetype/truetype.c:1.1.1.1 --- /dev/null Mon Dec 18 14:22:41 2000 +++ xc/extras/freetype2/src/truetype/truetype.c Fri Dec 8 16:26:25 2000 @@ -0,0 +1,47 @@ +/***************************************************************************/ +/* */ +/* truetype.c */ +/* */ +/* FreeType TrueType driver component (body only). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#define FT_MAKE_OPTION_SINGLE_OBJECT + + +#ifdef FT_FLAT_COMPILE + +#include "ttdriver.c" /* driver interface */ +#include "ttpload.c" /* tables loader */ +#include "ttgload.c" /* glyph loader */ +#include "ttobjs.c" /* object manager */ + +#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER +#include "ttinterp.c" /* bytecode interpreter */ +#endif + +#else /* FT_FLAT_COMPILE */ + +#include /* driver interface */ +#include /* tables loader */ +#include /* glyph loader */ +#include /* object manager */ + +#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER +#include /* bytecode interpreter */ +#endif + +#endif /* FT_FLAT_COMPILE */ + + +/* END */ Index: xc/extras/freetype2/src/truetype/ttdriver.c diff -u /dev/null xc/extras/freetype2/src/truetype/ttdriver.c:1.1.1.1 --- /dev/null Mon Dec 18 14:22:41 2000 +++ xc/extras/freetype2/src/truetype/ttdriver.c Fri Dec 8 16:26:25 2000 @@ -0,0 +1,518 @@ +/***************************************************************************/ +/* */ +/* ttdriver.c */ +/* */ +/* TrueType font driver implementation (body). */ +/* */ +/* 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 +#include +#include +#include + + +#ifdef FT_FLAT_COMPILE + +#include "ttdriver.h" +#include "ttgload.h" + +#else + +#include +#include + +#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_ttdriver + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** F A C E S ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + +#undef PAIR_TAG +#define PAIR_TAG( left, right ) ( ( (FT_ULong)left << 16 ) | \ + (FT_ULong)right ) + + + /*************************************************************************/ + /* */ + /* */ + /* 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( TT_Face face, + FT_UInt left_glyph, + FT_UInt right_glyph, + FT_Vector* kerning ) + { + TT_Kern_0_Pair* pair; + + + if ( !face ) + return TT_Err_Invalid_Face_Handle; + + kerning->x = 0; + kerning->y = 0; + + if ( face->kern_pairs ) + { + /* there are some kerning pairs in this font file! */ + FT_ULong search_tag = PAIR_TAG( left_glyph, right_glyph ); + FT_Long left, right; + + + left = 0; + right = face->num_kern_pairs - 1; + + while ( left <= right ) + { + FT_Int middle = left + ( ( right - left ) >> 1 ); + FT_ULong cur_pair; + + + pair = face->kern_pairs + middle; + cur_pair = PAIR_TAG( pair->left, pair->right ); + + if ( cur_pair == search_tag ) + goto Found; + + if ( cur_pair < search_tag ) + left = middle + 1; + else + right = middle - 1; + } + } + + Exit: + return TT_Err_Ok; + + Found: + kerning->x = pair->value; + goto Exit; + } + + +#undef PAIR_TAG + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** S I Z E S ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* */ + /* Set_Char_Sizes */ + /* */ + /* */ + /* A driver method used to reset a size's character sizes (horizontal */ + /* and vertical) expressed in fractional points. */ + /* */ + /* */ + /* char_width :: The character width expressed in 26.6 */ + /* fractional points. */ + /* */ + /* char_height :: The character height expressed in 26.6 */ + /* fractional points. */ + /* */ + /* horz_resolution :: The horizontal resolution of the output device. */ + /* */ + /* vert_resolution :: The vertical resolution of the output device. */ + /* */ + /* */ + /* size :: A handle to the target size object. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + static + FT_Error Set_Char_Sizes( TT_Size size, + FT_F26Dot6 char_width, + FT_F26Dot6 char_height, + FT_UInt horz_resolution, + FT_UInt vert_resolution ) + { + FT_Size_Metrics* metrics = &size->root.metrics; + TT_Face face = (TT_Face)size->root.face; + FT_Long dim_x, dim_y; + + + /* This bit flag, when set, indicates that the pixel size must be */ + /* truncated to an integer. Nearly all TrueType fonts have this */ + /* bit set, as hinting won't work really well otherwise. */ + /* */ + /* However, for those rare fonts who do not set it, we override */ + /* the default computations performed by the base layer. I */ + /* really don't know whether this is useful, but hey, that's the */ + /* spec :-) */ + /* */ + if ( ( face->header.Flags & 8 ) == 0 ) + { + /* Compute pixel sizes in 26.6 units */ + dim_x = ( char_width * horz_resolution ) / 72; + dim_y = ( char_height * vert_resolution ) / 72; + + metrics->x_scale = FT_DivFix( dim_x, face->root.units_per_EM ); + metrics->y_scale = FT_DivFix( dim_y, face->root.units_per_EM ); + + metrics->x_ppem = (FT_UShort)( dim_x >> 6 ); + metrics->y_ppem = (FT_UShort)( dim_y >> 6 ); + } + + size->ttmetrics.valid = FALSE; +#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS + size->strike_index = 0xFFFF; +#endif + + return TT_Reset_Size( size ); + } + + + /*************************************************************************/ + /* */ + /* */ + /* Set_Pixel_Sizes */ + /* */ + /* */ + /* A driver method used to reset a size's character sizes (horizontal */ + /* and vertical) expressed in integer pixels. */ + /* */ + /* */ + /* pixel_width :: The character width expressed in integer pixels. */ + /* */ + /* pixel_height :: The character height expressed in integer pixels. */ + /* */ + /* */ + /* size :: A handle to the target size object. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + static + FT_Error Set_Pixel_Sizes( TT_Size size, + FT_UInt pixel_width, + FT_UInt pixel_height ) + { + FT_UNUSED( pixel_width ); + FT_UNUSED( pixel_height ); + + /* many things have been pre-computed by the base layer */ + + size->ttmetrics.valid = FALSE; +#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS + size->strike_index = 0xFFFF; +#endif + + return TT_Reset_Size( size ); + } + + + /*************************************************************************/ + /* */ + /* */ + /* 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( TT_GlyphSlot slot, + TT_Size size, + FT_UShort glyph_index, + FT_UInt load_flags ) + { + FT_Error error; + + + if ( !slot ) + return TT_Err_Invalid_Glyph_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 object must have the same parent */ + if ( size->root.face != slot->face ) + return TT_Err_Invalid_Face_Handle; + + if ( !size->ttmetrics.valid ) + { + if ( FT_SET_ERROR( TT_Reset_Size( size ) ) ) + return error; + } + } + + /* 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; + } + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** C H A R A C T E R M A P P I N G S ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + /*************************************************************************/ + /* */ + /* */ + /* Get_Char_Index */ + /* */ + /* */ + /* Uses a charmap to return a given character code's glyph index. */ + /* */ + /* */ + /* charmap :: A handle to the source charmap object. */ + /* charcode :: The character code. */ + /* */ + /* */ + /* Glyph index. 0 means `undefined character code'. */ + /* */ + static + FT_UInt Get_Char_Index( TT_CharMap charmap, + FT_Long charcode ) + { + FT_Error error; + TT_Face face; + TT_CMapTable* cmap; + + + cmap = &charmap->cmap; + face = (TT_Face)charmap->root.face; + + /* Load table if needed */ + if ( !cmap->loaded ) + { + SFNT_Interface* sfnt = (SFNT_Interface*)face->sfnt; + + + error = sfnt->load_charmap( face, cmap, face->root.stream ); + if ( error ) + return 0; + + cmap->loaded = TRUE; + } + + if ( cmap->get_index ) + return cmap->get_index( cmap, charcode ); + else + return 0; + } + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** D R I V E R I N T E R F A C E ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + static + FT_Module_Interface tt_get_interface( TT_Driver driver, + const char* interface ) + { + FT_Module sfntd = FT_Get_Module( driver->root.root.library, + "sfnt" ); + SFNT_Interface* sfnt; + + + /* only return the default interface from the SFNT module */ + if ( sfntd ) + { + sfnt = (SFNT_Interface*)( sfntd->clazz->module_interface ); + if ( sfnt ) + return sfnt->get_interface( FT_MODULE( driver ), interface ); + } + + return 0; + } + + + /* The FT_DriverInterface structure is defined in ftdriver.h. */ + + FT_CALLBACK_TABLE_DEF + const FT_Driver_Class tt_driver_class = + { + { + ft_module_font_driver | + ft_module_driver_scalable | +#ifdef TT_CONFIG_OPTION_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 */ + + (FT_Module_Constructor)TT_Init_Driver, + (FT_Module_Destructor) TT_Done_Driver, + (FT_Module_Requester) tt_get_interface, + }, + + sizeof ( TT_FaceRec ), + sizeof ( TT_SizeRec ), + sizeof ( FT_GlyphSlotRec ), + + + (FTDriver_initFace) TT_Init_Face, + (FTDriver_doneFace) TT_Done_Face, + (FTDriver_initSize) TT_Init_Size, + (FTDriver_doneSize) TT_Done_Size, + (FTDriver_initGlyphSlot)0, + (FTDriver_doneGlyphSlot)0, + + (FTDriver_setCharSizes) Set_Char_Sizes, + (FTDriver_setPixelSizes)Set_Pixel_Sizes, + (FTDriver_loadGlyph) Load_Glyph, + (FTDriver_getCharIndex) Get_Char_Index, + + (FTDriver_getKerning) Get_Kerning, + (FTDriver_attachFile) 0, + (FTDriver_getAdvances) 0 + }; + + +#ifdef FT_CONFIG_OPTION_DYNAMIC_DRIVERS + + + /*************************************************************************/ + /* */ + /* */ + /* getDriverClass */ + /* */ + /* */ + /* This function is used when compiling the TrueType driver as a */ + /* shared library (`.DLL' or `.so'). It will be used by the */ + /* high-level library of FreeType to retrieve the address of the */ + /* driver's generic interface. */ + /* */ + /* It shouldn't be implemented in a static build, as each driver must */ + /* have the same function as an exported entry point. */ + /* */ + /* */ + /* The address of the TrueType's driver generic interface. The */ + /* format-specific interface can then be retrieved through the method */ + /* interface->get_format_interface. */ + /* */ + FT_EXPORT_DEF( const FT_Driver_Class* ) getDriverClass( void ) + { + return &tt_driver_class; + } + + +#endif /* CONFIG_OPTION_DYNAMIC_DRIVERS */ + + +/* END */ Index: xc/extras/freetype2/src/truetype/ttdriver.h diff -u /dev/null xc/extras/freetype2/src/truetype/ttdriver.h:1.1.1.1 --- /dev/null Mon Dec 18 14:22:41 2000 +++ xc/extras/freetype2/src/truetype/ttdriver.h Fri Dec 8 16:26:25 2000 @@ -0,0 +1,41 @@ +/***************************************************************************/ +/* */ +/* ttdriver.h */ +/* */ +/* High-level TrueType driver interface (specification). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#ifndef TTDRIVER_H +#define TTDRIVER_H + +#include + + +#ifdef __cplusplus + extern "C" { +#endif + + + FT_EXPORT_VAR( const FT_Driver_Class ) tt_driver_class; + + +#ifdef __cplusplus + } +#endif + + +#endif /* TTDRIVER_H */ + + +/* END */ Index: xc/extras/freetype2/src/truetype/ttgload.c diff -u /dev/null xc/extras/freetype2/src/truetype/ttgload.c:1.1.1.1 --- /dev/null Mon Dec 18 14:22:41 2000 +++ xc/extras/freetype2/src/truetype/ttgload.c Fri Dec 8 16:26:25 2000 @@ -0,0 +1,1492 @@ +/***************************************************************************/ +/* */ +/* ttgload.c */ +/* */ +/* TrueType Glyph Loader (body). */ +/* */ +/* 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 +#include +#include +#include +#include +#include + + +#ifdef FT_FLAT_COMPILE + +#include "ttgload.h" + +#else + +#include + +#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_ttgload + + + /*************************************************************************/ + /* */ + /* Composite font flags. */ + /* */ +#define ARGS_ARE_WORDS 0x001 +#define ARGS_ARE_XY_VALUES 0x002 +#define ROUND_XY_TO_GRID 0x004 +#define WE_HAVE_A_SCALE 0x008 +/* reserved 0x010 */ +#define MORE_COMPONENTS 0x020 +#define WE_HAVE_AN_XY_SCALE 0x040 +#define WE_HAVE_A_2X2 0x080 +#define WE_HAVE_INSTR 0x100 +#define USE_MY_METRICS 0x200 + + + + /*************************************************************************/ + /* */ + /* */ + /* TT_Get_Metrics */ + /* */ + /* */ + /* 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). */ + /* */ + /* */ + /* header :: A pointer to either the horizontal or vertical metrics */ + /* structure. */ + /* */ + /* index :: The glyph index. */ + /* */ + /* */ + /* bearing :: The bearing, either left side or top side. */ + /* */ + /* advance :: The advance width resp. advance height. */ + /* */ + /* */ + /* This function will much probably move to another component in the */ + /* near future, but I haven't decided which yet. */ + /* */ + FT_LOCAL_DEF + void TT_Get_Metrics( TT_HoriHeader* header, + FT_UInt index, + FT_Short* bearing, + FT_UShort* advance ) + { + TT_LongMetrics* longs_m; + FT_UShort k = header->number_Of_HMetrics; + + + if ( index < (FT_UInt)k ) + { + longs_m = (TT_LongMetrics*)header->long_metrics + index; + *bearing = longs_m->bearing; + *advance = longs_m->advance; + } + else + { + *bearing = ((TT_ShortMetrics*)header->short_metrics)[index - k]; + *advance = ((TT_LongMetrics*)header->long_metrics)[k - 1].advance; + } + } + + + /*************************************************************************/ + /* */ + /* 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 index, + FT_Bool check, + FT_Short* lsb, + FT_UShort* aw ) + { + TT_Get_Metrics( &face->horizontal, index, lsb, aw ); + + if ( check && face->postscript.isFixedPitch ) + *aw = face->horizontal.advance_Width_Max; + } + + + /*************************************************************************/ + /* */ + /* Returns the advance width table for a given pixel size if it is */ + /* found in the font's `hdmx' table (if any). */ + /* */ + static + FT_Byte* Get_Advance_Widths( TT_Face face, + FT_UShort ppem ) + { + FT_UShort n; + + for ( n = 0; n < face->hdmx.num_records; n++ ) + if ( face->hdmx.records[n].ppem == ppem ) + return face->hdmx.records[n].widths; + + return NULL; + } + + +#define cur_to_org( n, zone ) \ + MEM_Copy( (zone)->org, (zone)->cur, n * sizeof ( FT_Vector ) ) + +#define org_to_cur( n, zone ) \ + MEM_Copy( (zone)->cur, (zone)->org, n * sizeof ( FT_Vector ) ) + + + /*************************************************************************/ + /* */ + /* 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; + } + + + static + void tt_prepare_zone( TT_GlyphZone* zone, + FT_GlyphLoad* load, + FT_UInt start_point, + FT_UInt start_contour ) + { + zone->n_points = load->outline.n_points - start_point; + zone->n_contours = load->outline.n_contours - start_contour; + zone->org = load->extra_points + start_point; + zone->cur = load->outline.points + start_point; + zone->tags = (FT_Byte*)load->outline.tags + start_point; + zone->contours = (FT_UShort*)load->outline.contours + start_contour; + } + + +#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 ( FILE_Seek( offset ) || ACCESS_Frame( byte_count ) ) + return error; + + return TT_Err_Ok; + } + + + FT_CALLBACK_DEF + void TT_Forget_Glyph_Frame( TT_Loader* loader ) + { + FT_Stream stream = loader->stream; + + + FORGET_Frame(); + } + + + FT_CALLBACK_DEF + FT_Error TT_Load_Glyph_Header( TT_Loader* loader ) + { + FT_Stream stream = loader->stream; + + + loader->n_contours = GET_Short(); + + loader->bbox.xMin = GET_Short(); + loader->bbox.yMin = GET_Short(); + loader->bbox.xMax = GET_Short(); + loader->bbox.yMax = GET_Short(); + + 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 )); + + return FT_Err_Ok; + } + + + FT_CALLBACK_DEF + FT_Error TT_Load_Simple_Glyph( TT_Loader* load ) + { + FT_Error error; + FT_Stream stream = load->stream; + FT_GlyphLoader* gloader = load->gloader; + FT_Int n_contours = load->n_contours; + FT_Outline* outline; + TT_Face face = (TT_Face)load->face; + TT_GlyphSlot slot = (TT_GlyphSlot)load->glyph; + FT_UShort n_ins; + FT_Int n, n_points; + + + /* reading the contours endpoints & number of points */ + { + short* cur = gloader->current.outline.contours; + short* limit = cur + n_contours; + + + for ( ; cur < limit; cur++ ) + cur[0] = GET_UShort(); + + n_points = 0; + if ( n_contours > 0 ) + n_points = cur[-1] + 1; + + error = FT_GlyphLoader_Check_Points( gloader, n_points + 2, 0 ); + if ( error ) + goto Fail; + + outline = &gloader->current.outline; + } + + /* reading the bytecode instructions */ + slot->control_len = 0; + slot->control_data = 0; + + n_ins = GET_UShort(); + + FT_TRACE5(( " Instructions size: %d\n", n_ins )); + + if ( n_ins > face->max_profile.maxSizeOfInstructions ) + { + FT_TRACE0(( "ERROR: Too many instructions!\n" )); + error = TT_Err_Too_Many_Ins; + goto Fail; + } + + if ( stream->cursor + n_ins > stream->limit ) + { + FT_TRACE0(( "ERROR: Instruction count mismatch!\n" )); + error = TT_Err_Too_Many_Ins; + goto Fail; + } + +#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER + + if ( ( load->load_flags & + ( FT_LOAD_NO_SCALE | FT_LOAD_NO_HINTING ) ) == 0 && + load->instructions ) + { + slot->control_len = n_ins; + slot->control_data = load->instructions; + + MEM_Copy( load->instructions, stream->cursor, n_ins ); + } + +#endif /* TT_CONFIG_OPTION_BYTECODE_INTERPRETER */ + + stream->cursor += n_ins; + + /* reading the point tags */ + + { + FT_Byte* flag = (FT_Byte*)outline->tags; + FT_Byte* limit = flag + n_points; + FT_Byte c, count; + + + for ( ; flag < limit; flag++ ) + { + *flag = c = GET_Byte(); + if ( c & 8 ) + { + for ( count = GET_Byte(); count > 0; count-- ) + *++flag = c; + } + } + } + + /* reading the X coordinates */ + + { + FT_Vector* vec = outline->points; + FT_Vector* limit = vec + n_points; + FT_Byte* flag = (FT_Byte*)outline->tags; + FT_Pos x = 0; + + + for ( ; vec < limit; vec++, flag++ ) + { + FT_Pos y = 0; + + + if ( *flag & 2 ) + { + y = GET_Byte(); + if ( ( *flag & 16 ) == 0 ) + y = -y; + } + else if ( ( *flag & 16 ) == 0 ) + y = GET_Short(); + + x += y; + vec->x = x; + } + } + + /* reading the Y coordinates */ + + { + FT_Vector* vec = gloader->current.outline.points; + FT_Vector* limit = vec + n_points; + FT_Byte* flag = (FT_Byte*)outline->tags; + FT_Pos x = 0; + + + for ( ; vec < limit; vec++, flag++ ) + { + FT_Pos y = 0; + + + if ( *flag & 4 ) + { + y = GET_Byte(); + if ( ( *flag & 32 ) == 0 ) + y = -y; + } + else if ( ( *flag & 32 ) == 0 ) + y = GET_Short(); + + x += y; + vec->y = x; + } + } + + /* clear the touch tags */ + for ( n = 0; n < n_points; n++ ) + outline->tags[n] &= FT_Curve_Tag_On; + + outline->n_points = n_points; + outline->n_contours = n_contours; + + Fail: + return error; + } + + + FT_CALLBACK_DEF + FT_Error TT_Load_Composite_Glyph( TT_Loader* loader ) + { + FT_Error error; + FT_Stream stream = loader->stream; + FT_GlyphLoader* gloader = loader->gloader; + FT_SubGlyph* subglyph; + FT_UInt num_subglyphs; + + + num_subglyphs = 0; + + do + { + FT_Fixed xx, xy, yy, yx; + + + /* check that we can load a new subglyph */ + error = FT_GlyphLoader_Check_Subglyphs( gloader, num_subglyphs + 1 ); + if ( error ) + goto Fail; + + subglyph = gloader->current.subglyphs + num_subglyphs; + + subglyph->arg1 = subglyph->arg2 = 0; + + subglyph->flags = GET_UShort(); + subglyph->index = GET_UShort(); + + /* read arguments */ + if ( subglyph->flags & ARGS_ARE_WORDS ) + { + subglyph->arg1 = GET_Short(); + subglyph->arg2 = GET_Short(); + } + else + { + subglyph->arg1 = GET_Char(); + subglyph->arg2 = GET_Char(); + } + + /* read transform */ + xx = yy = 0x10000L; + xy = yx = 0; + + if ( subglyph->flags & WE_HAVE_A_SCALE ) + { + xx = (FT_Fixed)GET_Short() << 2; + yy = xx; + } + else if ( subglyph->flags & WE_HAVE_AN_XY_SCALE ) + { + xx = (FT_Fixed)GET_Short() << 2; + yy = (FT_Fixed)GET_Short() << 2; + } + else if ( subglyph->flags & WE_HAVE_A_2X2 ) + { + xx = (FT_Fixed)GET_Short() << 2; + xy = (FT_Fixed)GET_Short() << 2; + yx = (FT_Fixed)GET_Short() << 2; + yy = (FT_Fixed)GET_Short() << 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_CONFIG_OPTION_BYTECODE_INTERPRETER + { + /* we must undo the ACCESS_Frame in order to point to the */ + /* composite instructions, if we find some. */ + /* we will process them later... */ + /* */ + loader->ins_pos = FILE_Pos() + stream->cursor - stream->limit; + } +#endif + + Fail: + return error; + } + + + 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; + } + + + /*************************************************************************/ + /* */ + /* */ + /* 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* load, + FT_Bool debug ) + { + FT_GlyphLoader* gloader = load->gloader; + FT_Outline* outline = &gloader->current.outline; + FT_UInt n_points = outline->n_points; + FT_UInt n_ins; + TT_GlyphZone* zone = &load->zone; + FT_Error error = FT_Err_Ok; + + FT_UNUSED( debug ); /* used by truetype interpreter only */ + + + n_ins = load->glyph->control_len; + + /* add shadow points */ + + /* Now add the two shadow points at n and n + 1. */ + /* We need the left side bearing and advance width. */ + + { + FT_Vector* pp1; + FT_Vector* pp2; + + + /* pp1 = xMin - lsb */ + pp1 = outline->points + n_points; + pp1->x = load->bbox.xMin - load->left_bearing; + pp1->y = 0; + + /* pp2 = pp1 + aw */ + pp2 = pp1 + 1; + pp2->x = pp1->x + load->advance; + pp2->y = 0; + + outline->tags[n_points ] = 0; + outline->tags[n_points + 1] = 0; + } + + /* Note that we return two more points that are not */ + /* part of the glyph outline. */ + + n_points += 2; + + /* set up zone for hinting */ + tt_prepare_zone( zone, &gloader->current, 0, 0 ); + + /* eventually scale the glyph */ + if ( !( load->load_flags & FT_LOAD_NO_SCALE ) ) + { + FT_Vector* vec = zone->cur; + FT_Vector* limit = vec + n_points; + FT_Fixed x_scale = load->size->metrics.x_scale; + FT_Fixed y_scale = load->size->metrics.y_scale; + + + /* first scale the glyph points */ + for ( ; vec < limit; vec++ ) + { + vec->x = FT_MulFix( vec->x, x_scale ); + vec->y = FT_MulFix( vec->y, y_scale ); + } + } + + cur_to_org( n_points, zone ); + + /* eventually hint the glyph */ + if ( IS_HINTED( load->load_flags ) ) + { + FT_Pos x = zone->org[n_points-2].x; + + + x = ( ( x + 32 ) & -64 ) - x; + translate_array( n_points, zone->org, x, 0 ); + + org_to_cur( n_points, zone ); + + zone->cur[n_points - 1].x = ( zone->cur[n_points - 1].x + 32 ) & -64; + +#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER + + /* now consider hinting */ + if ( n_ins > 0 ) + { + error = TT_Set_CodeRange( load->exec, tt_coderange_glyph, + load->exec->glyphIns, n_ins ); + if ( error ) + goto Exit; + + load->exec->is_composite = FALSE; + load->exec->pedantic_hinting = (FT_Bool)( load->load_flags & + FT_LOAD_PEDANTIC ); + load->exec->pts = *zone; + load->exec->pts.n_points += 2; + + error = TT_Run_Context( load->exec, debug ); + if ( error && load->exec->pedantic_hinting ) + goto Exit; + + error = FT_Err_Ok; /* ignore bytecode errors in non-pedantic mode */ + } + +#endif /* TT_CONFIG_OPTION_BYTECODE_INTERPRETER */ + + } + + /* save glyph phantom points */ + if ( !load->preserve_pps ) + { + load->pp1 = zone->cur[n_points - 2]; + load->pp2 = zone->cur[n_points - 1]; + } + +#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER + Exit: +#endif + return error; + } + + + /*************************************************************************/ + /* */ + /* */ + /* 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 ) + { + +#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER + FT_Stream stream = loader->stream; +#endif + + FT_Error error; + TT_Face face = (TT_Face)loader->face; + FT_ULong offset; + FT_Int contours_count; + FT_UInt index, num_points, num_contours, count; + FT_Fixed x_scale, y_scale; + FT_ULong ins_offset; + FT_GlyphLoader* gloader = loader->gloader; + FT_Bool opened_frame = 0; + + + /* check glyph index */ + index = glyph_index; + if ( index >= (FT_UInt)face->root.num_glyphs ) + { + error = TT_Err_Invalid_Glyph_Index; + goto Exit; + } + + loader->glyph_index = glyph_index; + num_contours = 0; + num_points = 0; + ins_offset = 0; + + x_scale = 0x10000L; + y_scale = 0x10000L; + if ( ( loader->load_flags & FT_LOAD_NO_SCALE ) == 0 ) + { + x_scale = loader->size->metrics.x_scale; + y_scale = loader->size->metrics.y_scale; + } + + /* get horizontal metrics */ + { + FT_Short left_bearing; + FT_UShort advance_width; + + + Get_HMetrics( face, index, + (FT_Bool)!(loader->load_flags & + FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH), + &left_bearing, + &advance_width ); + + loader->left_bearing = left_bearing; + loader->advance = advance_width; + } + + offset = face->glyph_locations[index]; + count = 0; + + if ( index < (FT_UInt)face->num_locations - 1 ) + count = face->glyph_locations[index + 1] - offset; + + if ( count == 0 ) + { + /* as described by Frederic Loyer, these are spaces, and */ + /* not the unknown glyph. */ + loader->bbox.xMin = 0; + loader->bbox.xMax = 0; + loader->bbox.yMin = 0; + loader->bbox.yMax = 0; + + loader->pp1.x = 0; + loader->pp2.x = loader->advance; + + if ( ( loader->load_flags & FT_LOAD_NO_SCALE ) == 0 ) + loader->pp2.x = FT_MulFix( loader->pp2.x, x_scale ); + +#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER + + if ( loader->exec ) + loader->exec->glyphSize = 0; + +#endif + + error = FT_Err_Ok; + goto Exit; + } + + offset = loader->glyf_offset + offset; + + /* access glyph frame */ + error = face->access_glyph_frame( loader, glyph_index, offset, count ); + if ( error ) + goto Exit; + + opened_frame = 1; + + /* read first glyph header */ + error = face->read_glyph_header( loader ); + if ( error ) + goto Fail; + + contours_count = loader->n_contours; + + count -= 10; + + 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; + + 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 ); + } + + /***********************************************************************/ + /***********************************************************************/ + /***********************************************************************/ + + /* if it is a simple glyph, load it */ + + if ( contours_count >= 0 ) + { + /* check that we can add the contours to the glyph */ + error = FT_GlyphLoader_Check_Points( gloader, 0, contours_count ); + if ( error ) + goto Fail; + + error = face->read_simple_glyph( loader ); + if ( error ) + goto Fail; + +#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER + + { + TT_Size size = (TT_Size)loader->size; + + + error = TT_Process_Simple_Glyph( loader, + (FT_Bool)( size && size->debug ) ); + } + +#else + + error = TT_Process_Simple_Glyph( loader, 0 ); + +#endif + + if ( error ) + goto Fail; + + FT_GlyphLoader_Add( gloader ); + + /* Note: We could have put the simple loader source there */ + /* but the code is fat enough already :-) */ + } + + /***********************************************************************/ + /***********************************************************************/ + /***********************************************************************/ + + /* otherwise, load a composite! */ + else + { + TT_GlyphSlot glyph = (TT_GlyphSlot)loader->glyph; + FT_UInt start_point, start_contour; + FT_ULong ins_pos; /* position of composite instructions, if any */ + + + /* for each subglyph, read composite header */ + start_point = gloader->base.outline.n_points; + start_contour = gloader->base.outline.n_contours; + + error = face->read_composite_glyph( loader ); + if ( error ) + goto Fail; + + ins_pos = loader->ins_pos; + face->forget_glyph_frame( loader ); + opened_frame = 0; + + /* 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 this data)... */ + /* */ + if ( loader->load_flags & FT_LOAD_NO_RECURSE ) + { + /* set up remaining glyph fields */ + FT_GlyphLoader_Add( gloader ); + + glyph->num_subglyphs = gloader->base.num_subglyphs; + glyph->format = ft_glyph_format_composite; + glyph->subglyphs = gloader->base.subglyphs; + + goto Exit; + } + + /*********************************************************************/ + /*********************************************************************/ + /*********************************************************************/ + + /* Now, read each subglyph independently. */ + { + FT_Int n, num_base_points, num_new_points; + FT_SubGlyph* subglyph = 0; + + FT_UInt num_subglyphs = gloader->current.num_subglyphs; + FT_UInt num_base_subgs = gloader->base.num_subglyphs; + + + FT_GlyphLoader_Add( gloader ); + + for ( n = 0; n < (FT_Int)num_subglyphs; n++ ) + { + FT_Vector pp1, pp2; + FT_Pos x, y; + + + /* 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; + + pp1 = loader->pp1; + pp2 = loader->pp2; + + num_base_points = gloader->base.outline.n_points; + + error = load_truetype_glyph( loader, subglyph->index ); + if ( error ) + goto Fail; + + subglyph = gloader->base.subglyphs + num_base_subgs + n; + + if ( subglyph->flags & 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 & ( WE_HAVE_A_SCALE | + WE_HAVE_AN_XY_SCALE | + WE_HAVE_A_2X2 ) ) + { + FT_Vector* cur = gloader->base.outline.points + + num_base_points; + FT_Vector* org = gloader->base.extra_points + + num_base_points; + FT_Vector* limit = cur + num_new_points; + + + for ( ; cur < limit; cur++, org++ ) + { + FT_Vector_Transform( cur, &subglyph->transform ); + FT_Vector_Transform( org, &subglyph->transform ); + } + } + + /* apply offset */ + + if ( !( subglyph->flags & ARGS_ARE_XY_VALUES ) ) + { + FT_UInt k = subglyph->arg1; + FT_UInt l = subglyph->arg2; + FT_Vector* p1; + FT_Vector* p2; + + + if ( start_point + k >= (FT_UInt)num_base_points || + l >= (FT_UInt)num_new_points ) + { + error = TT_Err_Invalid_Composite; + goto Fail; + } + + l += num_base_points; + + 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 = subglyph->arg1; + y = subglyph->arg2; + + if ( !( loader->load_flags & FT_LOAD_NO_SCALE ) ) + { + x = FT_MulFix( x, x_scale ); + y = FT_MulFix( y, y_scale ); + + if ( subglyph->flags & ROUND_XY_TO_GRID ) + { + x = ( x + 32 ) & -64; + y = ( y + 32 ) & -64; + } + } + } + + translate_array( num_new_points, loader->zone.cur, x, y ); + cur_to_org( num_new_points, &loader->zone ); + } + + /*******************************************************************/ + /*******************************************************************/ + /*******************************************************************/ + + /* we have finished loading all sub-glyphs; now, look for */ + /* instructions for this composite! */ + +#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER + + if ( num_subglyphs > 0 && + loader->exec && + ins_pos > 0 && + subglyph->flags & WE_HAVE_INSTR ) + { + FT_UShort n_ins; + TT_ExecContext exec = loader->exec; + TT_GlyphZone* pts; + FT_Vector* pp1; + + + /* read size of instructions */ + if ( FILE_Seek( ins_pos ) || + READ_UShort( n_ins ) ) + goto Fail; + FT_TRACE5(( " Instructions size = %d\n", n_ins )); + + /* in some fonts? */ + if ( n_ins == 0xFFFF ) + n_ins = 0; + + /* check it */ + if ( n_ins > face->max_profile.maxSizeOfInstructions ) + { + FT_TRACE0(( "Too many instructions (%d) in composite glyph %ld\n", + n_ins, subglyph->index )); + return TT_Err_Too_Many_Ins; + } + + /* read the instructions */ + if ( FILE_Read( exec->glyphIns, n_ins ) ) + goto Fail; + + glyph->control_data = exec->glyphIns; + glyph->control_len = n_ins; + + error = TT_Set_CodeRange( exec, + tt_coderange_glyph, + exec->glyphIns, + n_ins ); + if ( error ) + goto Fail; + + /* prepare the execution context */ + tt_prepare_zone( &exec->pts, &gloader->base, + start_point, start_contour ); + pts = &exec->pts; + + pts->n_points = num_points + 2; + pts->n_contours = gloader->base.outline.n_contours; + + /* add phantom points */ + pp1 = pts->cur + num_points; + pp1[0] = loader->pp1; + pp1[1] = loader->pp2; + + pts->tags[num_points ] = 0; + pts->tags[num_points + 1] = 0; + + /* if hinting, round the phantom points */ + if ( IS_HINTED( loader->load_flags ) ) + { + pp1[0].x = ( ( loader->pp1.x + 32 ) & -64 ); + pp1[1].x = ( ( loader->pp2.x + 32 ) & -64 ); + } + + { + FT_UInt k; + + + for ( k = 0; k < num_points; k++ ) + pts->tags[k] &= FT_Curve_Tag_On; + } + + cur_to_org( num_points + 2, pts ); + + /* now consider hinting */ + if ( IS_HINTED( loader->load_flags ) && n_ins > 0 ) + { + exec->is_composite = TRUE; + exec->pedantic_hinting = + (FT_Bool)( loader->load_flags & FT_LOAD_PEDANTIC ); + + error = TT_Run_Context( exec, ((TT_Size)loader->size)->debug ); + if ( error && exec->pedantic_hinting ) + goto Fail; + } + + /* save glyph origin and advance points */ + loader->pp1 = pp1[0]; + loader->pp2 = pp1[1]; + } + +#endif /* TT_CONFIG_OPTION_BYTECODE_INTERPRETER */ + + } + /* end of composite loading */ + } + + /***********************************************************************/ + /***********************************************************************/ + /***********************************************************************/ + + Fail: + if ( opened_frame ) + face->forget_glyph_frame( loader ); + + Exit: + return error; + } + + + static + void compute_glyph_metrics( TT_Loader* loader, + FT_UInt glyph_index ) + { + FT_BBox bbox; + TT_Face face = (TT_Face)loader->face; + FT_Fixed x_scale, y_scale; + TT_GlyphSlot glyph = loader->glyph; + TT_Size size = (TT_Size)loader->size; + + + x_scale = 0x10000L; + y_scale = 0x10000L; + if ( ( loader->load_flags & FT_LOAD_NO_SCALE ) == 0 ) + { + x_scale = size->root.metrics.x_scale; + y_scale = size->root.metrics.y_scale; + } + + if ( glyph->format != ft_glyph_format_composite ) + { + glyph->outline.flags &= ~ft_outline_single_pass; + + /* copy outline to our glyph slot */ + FT_GlyphLoader_Copy_Points( glyph->internal->loader, loader->gloader ); + glyph->outline = glyph->internal->loader->base.outline; + + /* translate array so that (0,0) is the glyph's origin */ + FT_Outline_Translate( &glyph->outline, -loader->pp1.x, 0 ); + + FT_Outline_Get_CBox( &glyph->outline, &bbox ); + + if ( IS_HINTED( loader->load_flags ) ) + { + /* grid-fit the bounding box */ + bbox.xMin &= -64; + bbox.yMin &= -64; + bbox.xMax = ( bbox.xMax + 63 ) & -64; + bbox.yMax = ( bbox.yMax + 63 ) & -64; + } + } + else + bbox = loader->bbox; + + /* get the device-independent horizontal advance. It is scaled later */ + /* by the base layer. */ + { + FT_Pos advance = loader->advance; + + + /* 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_Short top_bearing; /* vertical top side bearing (EM units) */ + FT_UShort advance_height; /* vertical advance height (EM units) */ + + FT_Pos left; /* scaled vertical left side bearing */ + FT_Pos Top; /* scaled original vertical top side bearing */ + FT_Pos top; /* scaled vertical top side bearing */ + FT_Pos advance; /* scaled vertical advance height */ + + + /* Get the unscaled `tsb' and `ah' */ + if ( face->vertical_info && + face->vertical.number_Of_VMetrics > 0 ) + { + /* Don't assume that both the vertical header and vertical */ + /* metrics are present in the same font :-) */ + + TT_Get_Metrics( (TT_HoriHeader*)&face->vertical, + glyph_index, + &top_bearing, + &advance_height ); + } + else + { + /* Make up the distances from the horizontal header. */ + + /* NOTE: The OS/2 values are the only `portable' ones, */ + /* which is why we use them, if there is an OS/2 */ + /* table in the font. Otherwise, we use the */ + /* values defined in the horizontal header. */ + /* */ + /* NOTE2: The sTypoDescender is negative, which is why */ + /* we compute the baseline-to-baseline distance */ + /* here with: */ + /* ascender - descender + linegap */ + /* */ + if ( face->os2.version != 0xFFFF ) + { + top_bearing = face->os2.sTypoLineGap / 2; + advance_height = (FT_UShort)( face->os2.sTypoAscender - + face->os2.sTypoDescender + + face->os2.sTypoLineGap ); + } + else + { + top_bearing = face->horizontal.Line_Gap / 2; + advance_height = (FT_UShort)( face->horizontal.Ascender + + face->horizontal.Descender + + face->horizontal.Line_Gap ); + } + } + + /* We must adjust the top_bearing value from the bounding box given */ + /* in the glyph header to te bounding box calculated with */ + /* FT_Get_Outline_CBox(). */ + + /* scale the metrics */ + if ( !( loader->load_flags & FT_LOAD_NO_SCALE ) ) + { + Top = FT_MulFix( top_bearing, y_scale ); + top = FT_MulFix( top_bearing + loader->bbox.yMax, y_scale ) + - bbox.yMax; + advance = FT_MulFix( advance_height, y_scale ); + } + else + { + Top = top_bearing; + top = top_bearing + loader->bbox.yMax - bbox.yMax; + advance = advance_height; + } + + /* set the advance height in design units. It is scaled later by */ + /* the base layer. */ + glyph->linearVertAdvance = advance_height; + + /* XXX: for now, we have no better algorithm for the lsb, but it */ + /* should work fine. */ + /* */ + left = ( bbox.xMin - bbox.xMax ) / 2; + + /* grid-fit them if necessary */ + if ( IS_HINTED( loader->load_flags ) ) + { + left &= -64; + top = ( top + 63 ) & -64; + advance = ( advance + 32 ) & -64; + } + + glyph->metrics.vertBearingX = left; + glyph->metrics.vertBearingY = top; + glyph->metrics.vertAdvance = advance; + } + + /* adjust advance width to the value contained in the hdmx table */ + if ( !face->postscript.isFixedPitch && size && + IS_HINTED( loader->load_flags ) ) + { + FT_Byte* widths = Get_Advance_Widths( face, + size->root.metrics.x_ppem ); + + + if ( widths ) + glyph->metrics.horiAdvance = widths[glyph_index] << 6; + } + + /* set glyph dimensions */ + glyph->metrics.width = bbox.xMax - bbox.xMin; + glyph->metrics.height = bbox.yMax - bbox.yMin; + } + + + /*************************************************************************/ + /* */ + /* */ + /* 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_UShort glyph_index, + FT_UInt load_flags ) + { + SFNT_Interface* sfnt; + TT_Face face; + FT_Stream stream; + FT_Memory memory; + FT_Error error; + TT_Loader loader; + + + face = (TT_Face)glyph->face; + sfnt = (SFNT_Interface*)face->sfnt; + stream = face->root.stream; + memory = face->root.memory; + error = 0; + + if ( !size || ( load_flags & FT_LOAD_NO_SCALE ) || + ( load_flags & FT_LOAD_NO_RECURSE ) ) + { + size = NULL; + load_flags |= FT_LOAD_NO_SCALE | + FT_LOAD_NO_HINTING | + FT_LOAD_NO_BITMAP; + } + + glyph->num_subglyphs = 0; + +#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 && + size->strike_index != 0xFFFF && + sfnt->load_sbits && + ( load_flags & FT_LOAD_NO_BITMAP ) == 0 ) + + { + TT_SBit_Metrics metrics; + + + error = sfnt->load_sbit_image( face, + size->strike_index, + glyph_index, + 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 */ + + /* seek to the beginning of the glyph table. For Type 42 fonts */ + /* the table might be accessed from a Postscript stream or something */ + /* else... */ + + error = face->goto_table( face, TTAG_glyf, stream, 0 ); + if ( error ) + { + FT_ERROR(( "TT_Load_Glyph: could not access glyph table\n" )); + goto Exit; + } + + MEM_Set( &loader, 0, sizeof ( loader ) ); + + /* update the glyph zone bounds */ + { + FT_GlyphLoader* gloader = FT_FACE_DRIVER(face)->glyph_loader; + + + loader.gloader = gloader; + + FT_GlyphLoader_Rewind( gloader ); + + tt_prepare_zone( &loader.zone, &gloader->base, 0, 0 ); + tt_prepare_zone( &loader.base, &gloader->base, 0, 0 ); + } + +#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER + + if ( size ) + { + /* query new execution context */ + loader.exec = size->debug ? size->context : TT_New_Context( face ); + if ( !loader.exec ) + return TT_Err_Could_Not_Find_Context; + + TT_Load_Context( loader.exec, face, size ); + loader.instructions = loader.exec->glyphIns; + + /* load default graphics state - if needed */ + if ( size->GS.instruct_control & 2 ) + loader.exec->GS = tt_default_graphics_state; + } + +#endif /* TT_CONFIG_OPTION_BYTECODE_INTERPRETER */ + + /* clear all outline flags, except the `owner' one */ + glyph->outline.flags = 0; + + if ( size && size->root.metrics.y_ppem < 24 ) + glyph->outline.flags |= ft_outline_high_precision; + + /* let's initialize the rest of our loader now */ + + loader.load_flags = load_flags; + + loader.face = (FT_Face)face; + loader.size = (FT_Size)size; + loader.glyph = (FT_GlyphSlot)glyph; + loader.stream = stream; + + loader.glyf_offset = FILE_Pos(); + +#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER + + /* if the cvt program has disabled hinting, the argument */ + /* is ignored. */ + if ( size && ( size->GS.instruct_control & 1 ) ) + loader.load_flags |= FT_LOAD_NO_HINTING; + +#endif /* TT_CONFIG_OPTION_BYTECODE_INTERPRETER */ + + /* Main loading loop */ + glyph->format = ft_glyph_format_outline; + glyph->num_subglyphs = 0; + error = load_truetype_glyph( &loader, glyph_index ); + if ( !error ) + compute_glyph_metrics( &loader, glyph_index ); + +#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER + + if ( !size || !size->debug ) + TT_Done_Context( loader.exec ); + +#endif /* TT_CONFIG_OPTION_BYTECODE_INTERPRETER */ + + Exit: + return error; + } + + +/* END */ Index: xc/extras/freetype2/src/truetype/ttgload.h diff -u /dev/null xc/extras/freetype2/src/truetype/ttgload.h:1.1.1.1 --- /dev/null Mon Dec 18 14:22:41 2000 +++ xc/extras/freetype2/src/truetype/ttgload.h Fri Dec 8 16:26:25 2000 @@ -0,0 +1,69 @@ +/***************************************************************************/ +/* */ +/* ttgload.h */ +/* */ +/* TrueType Glyph Loader (specification). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#ifndef TTGLOAD_H +#define TTGLOAD_H + + +#ifdef FT_FLAT_COMPILE + +#include "ttobjs.h" + +#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER +#include "ttinterp.h" +#endif + +#else /* FT_FLAT_COMPILE */ + +#include + +#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER +#include +#endif + +#endif /* FT_FLAT_COMPILE */ + + +#ifdef __cplusplus + extern "C" { +#endif + + + FT_LOCAL + void TT_Get_Metrics( TT_HoriHeader* header, + FT_UInt index, + FT_Short* bearing, + FT_UShort* advance ); + + FT_LOCAL + void TT_Init_Glyph_Loading( TT_Face face ); + + FT_LOCAL + FT_Error TT_Load_Glyph( TT_Size size, + TT_GlyphSlot glyph, + FT_UShort glyph_index, + FT_UInt load_flags ); + +#ifdef __cplusplus + } +#endif + +#endif /* TTGLOAD_H */ + + +/* END */ Index: xc/extras/freetype2/src/truetype/ttinterp.c diff -u /dev/null xc/extras/freetype2/src/truetype/ttinterp.c:1.1.1.1 --- /dev/null Mon Dec 18 14:22:41 2000 +++ xc/extras/freetype2/src/truetype/ttinterp.c Fri Dec 8 16:26:25 2000 @@ -0,0 +1,7508 @@ +/***************************************************************************/ +/* */ +/* ttinterp.c */ +/* */ +/* TrueType bytecode interpreter (body). */ +/* */ +/* 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 +#include +#include + + +#ifdef FT_FLAT_COMPILE + +#include "ttinterp.h" + +#else + +#include + +#endif + + +#include + + +#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER + + +#define TT_MULFIX FT_MulFix +#define TT_MULDIV FT_MulDiv + +#define TT_INT64 FT_Int64 + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an 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 + +#undef NO_APPLE_PATENT +#define APPLE_THRESHOLD 0x4000000L + + /*************************************************************************/ + /* */ + /* 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 */ + /* limitet 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 */ + +#else /* static implementation */ + +#define CUR cur + + 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 `exec' is unused in a function, to avoid */ + /* stupid warnings from pedantic compilers. */ + /* */ +#define FT_UNUSED_EXEC FT_UNUSED( CUR ) + + + /*************************************************************************/ + /* */ + /* 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 readabilty 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_project( x, y ) \ + CUR.func_project( EXEC_ARG_ x, y ) + +#define CUR_Func_move( z, p, d ) \ + CUR.func_move( EXEC_ARG_ z, p, d ) + +#define CUR_Func_dualproj( x, y ) \ + CUR.func_dualproj( EXEC_ARG_ x, y ) + +#define CUR_Func_freeProj( x, y ) \ + CUR.func_freeProj( EXEC_ARG_ x, y ) + +#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 CALC_Length() \ + Calc_Length( 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 ) + + + /*************************************************************************/ + /* */ + /* 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 + + + /*************************************************************************/ + /* */ + /* 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_Destroy_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_Destroy_Context( TT_ExecContext exec, + FT_Memory memory ) + { + /* free composite load stack */ + FREE( exec->loadStack ); + exec->loadSize = 0; + + /* points zone */ + exec->maxPoints = 0; + exec->maxContours = 0; + + /* free stack */ + FREE( exec->stack ); + exec->stackSize = 0; + + /* free call stack */ + FREE( exec->callStack ); + exec->callSize = 0; + exec->callTop = 0; + + /* free glyph code range */ + FREE( exec->glyphIns ); + exec->glyphSize = 0; + + exec->size = NULL; + exec->face = NULL; + + FREE( exec ); + return TT_Err_Ok; + } + + + /*************************************************************************/ + /* */ + /* */ + /* Init_Context */ + /* */ + /* */ + /* Initializes a context object. */ + /* */ + /* */ + /* memory :: A handle to the parent memory object. */ + /* */ + /* face :: A handle to the source TrueType face object. */ + /* */ + /* */ + /* exec :: A handle to the target execution context. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + static + FT_Error Init_Context( TT_ExecContext exec, + TT_Face face, + FT_Memory memory ) + { + FT_Error error; + + + FT_TRACE1(( "Init_Context: new object at 0x%08p, parent = 0x%08p\n", + exec, face )); + + exec->memory = memory; + exec->callSize = 32; + + if ( ALLOC_ARRAY( exec->callStack, exec->callSize, TT_CallRec ) ) + goto Fail_Memory; + + /* all values in the context are set to 0 already, but this is */ + /* here as a remainder */ + exec->maxPoints = 0; + exec->maxContours = 0; + + exec->stackSize = 0; + exec->loadSize = 0; + exec->glyphSize = 0; + + exec->stack = NULL; + exec->loadStack = NULL; + exec->glyphIns = NULL; + + exec->face = face; + exec->size = NULL; + + return TT_Err_Ok; + + Fail_Memory: + FT_ERROR(( "Init_Context: not enough memory for 0x%08lx\n", + (FT_Long)exec )); + TT_Destroy_Context( exec, memory ); + + 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** buff, + FT_ULong new_max ) + { + FT_Error error; + + + if ( *size < new_max ) + { + FREE( *buff ); + if ( ALLOC( *buff, 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->root.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; + } + + error = Update_Max( exec->memory, + &exec->loadSize, + sizeof ( TT_SubGlyphRec ), + (void**)&exec->loadStack, + exec->face->max_components + 1 ); + if ( error ) + return error; + + /* 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->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; + + 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 }, + 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_Face face ) + { + TT_Driver driver; + TT_ExecContext exec; + FT_Memory memory; + + + if ( !face ) + return 0; + + driver = (TT_Driver)face->root.driver; + + memory = driver->root.root.memory; + exec = driver->context; + + if ( !driver->context ) + { + FT_Error error; + + + /* allocate object */ + if ( ALLOC( exec, sizeof ( *exec ) ) ) + goto Exit; + + /* initialize it */ + error = Init_Context( exec, face, memory ); + if ( error ) + goto Fail; + + /* store it into the driver */ + driver->context = exec; + } + + Exit: + return driver->context; + + Fail: + FREE( exec ); + + return 0; + } + + + /*************************************************************************/ + /* */ + /* */ + /* TT_Done_Context */ + /* */ + /* */ + /* Discards an execution context. */ + /* */ + /* */ + /* 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_Done_Context( TT_ExecContext exec ) + { + /* Nothing at all for now */ + FT_UNUSED( exec ); + + return TT_Err_Ok; + } + + +#ifdef FT_CONFIG_OPTION_OLD_CALCS + + static FT_F26Dot6 Norm( FT_F26Dot6 X, + FT_F26Dot6 Y ) + { + TT_INT64 T1, T2; + + + MUL_64( X, X, T1 ); + MUL_64( Y, Y, T2 ); + + ADD_64( T1, T2, T1 ); + + return (FT_F26Dot6)SQRT_64( T1 ); + } + +#endif /* FT_CONFIG_OPTION_OLD_CALCS */ + + + /*************************************************************************/ + /* */ + /* Before an opcode is executed, the interpreter verifies that there are */ + /* enough arguments on the stack, with the help of the Pop_Push_Count */ + /* table. */ + /* */ + /* For each opcode, the first column gives the number of arguments that */ + /* are popped from the stack; the second one gives the number of those */ + /* that are pushed in result. */ + /* */ + /* Note that for opcodes with a varying number of parameters, either 0 */ + /* or 1 arg is verified before execution, depending on the nature of the */ + /* instruction: */ + /* */ + /* - if the number of arguments is given by the bytecode stream or the */ + /* loop variable, 0 is chosen. */ + /* */ + /* - if the first argument is a count n that is followed by arguments */ + /* a1 .. an, then 1 is chosen. */ + /* */ + /*************************************************************************/ + + +#undef PACK +#define PACK( x, y ) ( ( x << 4 ) | y ) + + + static + const 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,-1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 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 + }; + + static + const FT_Vector Null_Vector = {0,0}; + + +#undef PACK + + +#undef NULL_Vector +#define NULL_Vector (FT_Vector*)&Null_Vector + + + /*************************************************************************/ + /* */ + /* */ + /* 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 ) + return CUR.tt_metrics.ratio; + + 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; + + +#ifdef FT_CONFIG_OPTION_OLD_CALCS + + 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 = Norm( x, y ); + +#else + + x = TT_MULDIV( CUR.GS.projVector.x, CUR.tt_metrics.x_ratio, 0x8000 ); + y = TT_MULDIV( CUR.GS.projVector.y, CUR.tt_metrics.y_ratio, 0x8000 ); + CUR.tt_metrics.ratio = FT_Sqrt32( x * x + y * y ) << 1; + +#endif /* FT_CONFIG_OPTION_OLD_CALCS */ + + } + + 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 index ) + { + return CUR.cvt[index]; + } + + + FT_CALLBACK_DEF + FT_F26Dot6 Read_CVT_Stretched( EXEC_OP_ FT_ULong index ) + { + return TT_MULFIX( CUR.cvt[index], CURRENT_Ratio() ); + } + + + FT_CALLBACK_DEF + void Write_CVT( EXEC_OP_ FT_ULong index, + FT_F26Dot6 value ) + { + CUR.cvt[index] = value; + } + + + FT_CALLBACK_DEF + void Write_CVT_Stretched( EXEC_OP_ FT_ULong index, + FT_F26Dot6 value ) + { + CUR.cvt[index] = FT_DivFix( value, CURRENT_Ratio() ); + } + + + FT_CALLBACK_DEF + void Move_CVT( EXEC_OP_ FT_ULong index, + FT_F26Dot6 value ) + { + CUR.cvt[index] += value; + } + + + FT_CALLBACK_DEF + void Move_CVT_Stretched( EXEC_OP_ FT_ULong index, + FT_F26Dot6 value ) + { + CUR.cvt[index] += 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; + + + v = CUR.GS.freeVector.x; + + if ( v != 0 ) + { + +#ifdef NO_APPLE_PATENT + + if ( ABS( CUR.F_dot_P ) > APPLE_THRESHOLD ) + zone->cur[point].x += distance; + +#else + + zone->cur[point].x += TT_MULDIV( distance, + v * 0x10000L, + CUR.F_dot_P ); + +#endif + + zone->tags[point] |= FT_Curve_Tag_Touch_X; + } + + v = CUR.GS.freeVector.y; + + if ( v != 0 ) + { + +#ifdef NO_APPLE_PATENT + + if ( ABS( CUR.F_dot_P ) > APPLE_THRESHOLD ) + zone->cur[point].y += distance; + +#else + + zone->cur[point].y += TT_MULDIV( distance, + v * 0x10000L, + CUR.F_dot_P ); + +#endif + + zone->tags[point] |= FT_Curve_Tag_Touch_Y; + } + } + + + /*************************************************************************/ + /* */ + /* 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; + } + + + /*************************************************************************/ + /* */ + /* */ + /* 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 ( 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 ( val > 0 ) + val &= ~63; + else + val = 0; + } + else + { + val = -( ( compensation - distance + 32 ) & -64 ); + 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 = ( ( distance + compensation ) & -64 ) + 32; + if ( val < 0 ) + val = 0; + } + else + { + val = -( ( (compensation - distance) & -64 ) + 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 ( 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 ( val > 0 ) + val &= ~63; + else + val = 0; + } + else + { + val = -( ( compensation - distance + 63 ) & -64 ); + 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 ( val > 0 ) + val &= ~31; + else + val = 0; + } + else + { + val = -( ( compensation - distance + 16 ) & -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 ( 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 ( 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 = GridPeriod * 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_Vector* v1, + FT_Vector* v2 ) + { + return TT_MULDIV( v1->x - v2->x, CUR.GS.projVector.x, 0x4000 ) + + TT_MULDIV( v1->y - v2->y, CUR.GS.projVector.y, 0x4000 ); + } + + + /*************************************************************************/ + /* */ + /* */ + /* 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_Vector* v1, + FT_Vector* v2 ) + { + return TT_MULDIV( v1->x - v2->x, CUR.GS.dualVector.x, 0x4000 ) + + TT_MULDIV( v1->y - v2->y, CUR.GS.dualVector.y, 0x4000 ); + } + + + /*************************************************************************/ + /* */ + /* */ + /* Free_Project */ + /* */ + /* */ + /* Computes the projection of the vector given by (v2-v1) along the */ + /* current freedom vector. */ + /* */ + /* */ + /* v1 :: First input vector. */ + /* v2 :: Second input vector. */ + /* */ + /* */ + /* The distance in F26dot6 format. */ + /* */ + static + FT_F26Dot6 Free_Project( EXEC_OP_ FT_Vector* v1, + FT_Vector* v2 ) + { + return TT_MULDIV( v1->x - v2->x, CUR.GS.freeVector.x, 0x4000 ) + + TT_MULDIV( v1->y - v2->y, CUR.GS.freeVector.y, 0x4000 ); + } + + + /*************************************************************************/ + /* */ + /* */ + /* 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_Vector* v1, + FT_Vector* v2 ) + { + FT_UNUSED_EXEC; + + return ( v1->x - v2->x ); + } + + + /*************************************************************************/ + /* */ + /* */ + /* 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_Vector* v1, + FT_Vector* v2 ) + { + FT_UNUSED_EXEC; + + return ( v1->y - v2->y ); + } + + + /*************************************************************************/ + /* */ + /* */ + /* Compute_Funcs */ + /* */ + /* */ + /* Computes the projection and movement function pointers according */ + /* to the current graphics state. */ + /* */ + static + void Compute_Funcs( EXEC_OP ) + { + if ( CUR.GS.freeVector.x == 0x4000 ) + { + CUR.func_freeProj = (TT_Project_Func)Project_x; + CUR.F_dot_P = CUR.GS.projVector.x * 0x10000L; + } + else + { + if ( CUR.GS.freeVector.y == 0x4000 ) + { + CUR.func_freeProj = (TT_Project_Func)Project_y; + CUR.F_dot_P = CUR.GS.projVector.y * 0x10000L; + } + else + { + CUR.func_freeProj = (TT_Project_Func)Free_Project; + 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; + + if ( CUR.F_dot_P == 0x40000000L ) + { + if ( CUR.GS.freeVector.x == 0x4000 ) + CUR.func_move = (TT_Move_Func)Direct_Move_X; + else + { + if ( CUR.GS.freeVector.y == 0x4000 ) + CUR.func_move = (TT_Move_Func)Direct_Move_Y; + } + } + + /* at small sizes, F_dot_P can become too small, resulting */ + /* in overflows and `spikes' in a number of glyphs like `w'. */ + + if ( ABS( CUR.F_dot_P ) < 0x4000000L ) + CUR.F_dot_P = 0x40000000L; + + /* Disable cached aspect ratio */ + CUR.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. */ + /* */ + +#ifdef FT_CONFIG_OPTION_OLD_CALCS + + 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 ( ABS( Vx ) < 0x10000L && ABS( Vy ) < 0x10000L ) + { + Vx *= 0x100; + Vy *= 0x100; + + W = Norm( 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 = Norm( 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 0x1000000 <= W < 0x1004000 */ + + if ( Vx < 0 ) + { + Vx = -Vx; + S1 = TRUE; + } + else + S1 = FALSE; + + if ( Vy < 0 ) + { + Vy = -Vy; + S2 = TRUE; + } + else + S2 = FALSE; + + while ( W < 0x1000000L ) + { + /* We need to increase W by a minimal amount */ + if ( Vx < Vy ) + Vx++; + else + Vy++; + + W = Vx * Vx + Vy * Vy; + } + + while ( W >= 0x1004000L ) + { + /* We need to decrease W by a minimal amount */ + if ( Vx < Vy ) + Vx--; + else + Vy--; + + W = Vx * Vx + Vy * Vy; + } + + /* Note that in various cases, we can only */ + /* compute a Sqrt(W) of 0x3FFF, eg. Vx = Vy */ + + if ( S1 ) + Vx = -Vx; + + if ( S2 ) + Vy = -Vy; + + R->x = (FT_F2Dot14)Vx; /* Type conversion */ + R->y = (FT_F2Dot14)Vy; /* Type conversion */ + + return SUCCESS; + } + +#else + + static + FT_Bool Normalize( EXEC_OP_ FT_F26Dot6 Vx, + FT_F26Dot6 Vy, + FT_UnitVector* R ) + { + FT_F26Dot6 u, v, d; + FT_Int shift; + FT_ULong H, L, L2, hi, lo, med; + + + u = ABS( Vx ); + v = ABS( Vy ); + + if ( u < v ) + { + d = u; + u = v; + v = d; + } + + R->x = 0; + R->y = 0; + + /* check that we are not trying to normalise zero! */ + if ( u == 0 ) + return SUCCESS; + + /* compute (u*u + v*v) on 64 bits with two 32-bit registers [H:L] */ + hi = (FT_ULong)u >> 16; + lo = (FT_ULong)u & 0xFFFF; + med = hi * lo; + + H = hi * hi + ( med >> 15 ); + med <<= 17; + L = lo * lo + med; + if ( L < med ) + H++; + + hi = (FT_ULong)v >> 16; + lo = (FT_ULong)v & 0xFFFF; + med = hi * lo; + + H += hi * hi + ( med >> 15 ); + med <<= 17; + L2 = lo * lo + med; + if ( L2 < med ) + H++; + + L += L2; + if ( L < L2 ) + H++; + + /* if the value is smaller than 32-bits */ + if ( H == 0 ) + { + shift = 0; + while ( ( L & 0xC0000000L ) == 0 ) + { + L <<= 2; + shift++; + } + + d = FT_Sqrt32( L ); + R->x = (FT_F2Dot14)TT_MULDIV( Vx << shift, 0x4000, d ); + R->y = (FT_F2Dot14)TT_MULDIV( Vy << shift, 0x4000, d ); + } + /* if the value is greater than 64-bits */ + else + { + shift = 0; + while ( H ) + { + L = ( L >> 2 ) | ( H << 30 ); + H >>= 2; + shift++; + } + + d = FT_Sqrt32( L ); + R->x = (FT_F2Dot14)TT_MULDIV( Vx >> shift, 0x4000, d ); + R->y = (FT_F2Dot14)TT_MULDIV( Vy >> shift, 0x4000, d ); + } + + { + FT_ULong x, y, w; + FT_Int sx, sy; + + + sx = R->x >= 0 ? 1 : -1; + sy = R->y >= 0 ? 1 : -1; + x = (FT_ULong)sx * R->x; + y = (FT_ULong)sy * R->y; + + w = x * x + y * y; + + /* we now want to adjust (x,y) in order to have sqrt(w) == 0x4000 */ + /* which means 0x1000000 <= w < 0x1004000 */ + while ( w <= 0x10000000L ) + { + /* increment the smallest coordinate */ + if ( x < y ) + x++; + else + y++; + + w = x * x + y * y; + } + + while ( w >= 0x10040000L ) + { + /* decrement the smallest coordinate */ + if ( x < y ) + x--; + else + y--; + + w = x * x + y * y; + } + + R->x = sx * x; + R->y = sy * y; + } + + return SUCCESS; + } + +#endif /* FT_CONFIG_OPTION_OLD_CALCS */ + + + /*************************************************************************/ + /* */ + /* 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; \ + \ + 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; \ + \ + 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; \ + COMPUTE_Funcs(); \ + } + + +#define DO_SFVTL \ + if ( INS_SxVTL( (FT_UShort)args[1], \ + (FT_UShort)args[0], \ + CUR.opcode, \ + &CUR.GS.freeVector ) == SUCCESS ) \ + COMPUTE_Funcs(); + + +#define DO_SFVTPV \ + 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; \ + 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 ); \ + COMPUTE_Funcs(); \ + } + + +#define DO_GPV \ + args[0] = CUR.GS.projVector.x; \ + args[1] = CUR.GS.projVector.y; + + +#define DO_GFV \ + args[0] = CUR.GS.freeVector.x; \ + args[1] = CUR.GS.freeVector.y; + + +#define DO_SRP0 \ + CUR.GS.rp0 = (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( args[0], 64L, args[1] ); + + +#define DO_MUL \ + args[0] = TT_MULDIV( args[0], args[1], 64L ); + + +#define DO_ABS \ + args[0] = ABS( args[0] ); + + +#define DO_NEG \ + args[0] = -args[0]; + + +#define DO_FLOOR \ + args[0] &= -64; + + +#define DO_CEILING \ + args[0] = ( args[0] + 63 ) & -64; + + +#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]; + + MEM_Move( &CUR.stack[CUR.args - L ], + &CUR.stack[CUR.args - L + 1], + ( L - 1 ) * sizeof ( FT_Long ) ); + + 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 = CUR.code[CUR.IP + 1] + 2; + } + + 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 = ( nIfs == 1 ); + break; + + case 0x59: /* EIF */ + nIfs--; + Out = ( 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 intruction of a program is a */ + /* CALL or LOOPCALL, the return address is */ + /* always out of the code range. This is a */ + /* valid address, and it 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_Func_dualproj( CUR.zp2.org + L, NULL_Vector ); + else + R = CUR_Func_project( CUR.zp2.cur + L, NULL_Vector ); + } + + args[0] = R; + } + + + /*************************************************************************/ + /* */ + /* SCFS[]: Set Coordinate From Stack */ + /* 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_Func_project( CUR.zp2.cur + L, NULL_Vector ); + + CUR_Func_move( &CUR.zp2, L, args[1] - K ); + + /* not part of the specs, but here for safety */ + + if ( CUR.GS.gep2 == 0 ) + CUR.zp2.org[L] = CUR.zp2.cur[L]; + } + + + /*************************************************************************/ + /* */ + /* MD[a]: Measure Distance */ + /* 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 ); + + 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_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_GlyphZone 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; + return FAILURE; + } + + *zone = zp; + *refp = p; + + d = CUR_Func_project( zp.cur + p, zp.org + p ); + +#ifdef NO_APPLE_PATENT + + *x = TT_MULDIV( d, CUR.GS.freeVector.x, 0x4000 ); + *y = TT_MULDIV( d, CUR.GS.freeVector.y, 0x4000 ); + +#else + + *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 ); + +#endif /* NO_APPLE_PATENT */ + + return SUCCESS; + } + + + static + void Move_Zp2_Point( EXEC_OP_ FT_UShort point, + FT_F26Dot6 dx, + FT_F26Dot6 dy, + FT_Bool touch ) + { + 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_GlyphZone 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_GlyphZone 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 = CUR.pts.contours[contour - 1] + 1; + + last_point = CUR.pts.contours[contour]; + + /* XXX: this is probably wrong... at least it prevents memory */ + /* corruption when zp2 is the twilight zone */ + if ( last_point > CUR.zp2.n_points ) + { + if ( CUR.zp2.n_points > 0 ) + last_point = CUR.zp2.n_points - 1; + else + last_point = 0; + } + + /* XXX: UNDOCUMENTED! SHC doesn't touch the points */ + for ( i = first_point; i <= last_point; i++ ) + { + if ( zp.cur != CUR.zp2.cur || refp != i ) + MOVE_Zp2_Point( i, dx, dy, FALSE ); + } + } + + + /*************************************************************************/ + /* */ + /* SHZ[a]: SHift Zone */ + /* Opcode range: 0x36-37 */ + /* Stack: uint32 --> */ + /* */ + static + void Ins_SHZ( INS_ARG ) + { + TT_GlyphZone 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; + + if ( CUR.zp2.n_points > 0 ) + last_point = CUR.zp2.n_points - 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; + } + + dx = TT_MULDIV( args[0], + (FT_Long)CUR.GS.freeVector.x, + 0x4000 ); + dy = TT_MULDIV( args[0], + (FT_Long)CUR.GS.freeVector.y, + 0x4000 ); + + 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.gep0 == 0 ) /* if in twilight zone */ + { + CUR.zp1.org[point] = CUR.zp0.org[CUR.GS.rp0]; + CUR.zp1.cur[point] = CUR.zp1.org[point]; + } + + distance = CUR_Func_project( CUR.zp1.cur + point, + CUR.zp0.cur + CUR.GS.rp0 ); + + CUR_Func_move( &CUR.zp1, point, args[1] - distance ); + + CUR.GS.rp1 = CUR.GS.rp0; + CUR.GS.rp2 = point; + + if ( (CUR.opcode & 1) != 0 ) + CUR.GS.rp0 = point; + } + + + /*************************************************************************/ + /* */ + /* MDAP[a]: Move Direct Absolute Point */ + /* 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_Func_project( CUR.zp0.cur + point, NULL_Vector ); + 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; + } + + /* UNDOCUMENTED! */ + /* */ + /* The behaviour of an MIAP instruction is quite */ + /* different when used in the twilight zone. */ + /* */ + /* First, no control value cutin test is performed */ + /* as it would fail anyway. Second, the original */ + /* point, i.e. (org_x,org_y) of zp0.point, is set */ + /* to the absolute, unrounded distance found in */ + /* the CVT. */ + /* */ + /* This is used in the CVT programs of the Microsoft */ + /* fonts Arial, Times, etc., in order to re-adjust */ + /* some key font heights. It allows the use of the */ + /* IP instruction in the twilight zone, which */ + /* otherwise would be `illegal' according to the */ + /* 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_MULDIV( CUR.GS.freeVector.x, + distance, 0x4000 ); + CUR.zp0.org[point].y = TT_MULDIV( CUR.GS.freeVector.y, + distance, 0x4000 ); + CUR.zp0.cur[point] = CUR.zp0.org[point]; + } + + org_dist = CUR_Func_project( CUR.zp0.cur + point, NULL_Vector ); + + if ( ( CUR.opcode & 1 ) != 0 ) /* rounding and control cutin flag */ + { + if ( ABS( distance - org_dist ) > CUR.GS.control_value_cutin ) + distance = org_dist; + + distance = CUR_Func_round( distance, CUR.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? */ + + org_dist = CUR_Func_dualproj( CUR.zp1.org + point, + CUR.zp0.org + CUR.GS.rp0 ); + + /* single width cutin test */ + + if ( ABS( org_dist ) < CUR.GS.single_width_cutin ) + { + if ( org_dist >= 0 ) + org_dist = CUR.GS.single_width_value; + else + org_dist = -CUR.GS.single_width_value; + } + + /* round flag */ + + if ( ( CUR.opcode & 4 ) != 0 ) + distance = CUR_Func_round( + org_dist, + CUR.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 ( ABS( cvt_dist ) < CUR.GS.single_width_cutin ) + { + if ( cvt_dist >= 0 ) + cvt_dist = CUR.GS.single_width_value; + else + cvt_dist = -CUR.GS.single_width_value; + } + + /* XXX: UNDOCUMENTED! -- twilight zone */ + + if ( CUR.GS.gep1 == 0 ) + { + CUR.zp1.org[point].x = CUR.zp0.org[CUR.GS.rp0].x + + TT_MULDIV( cvt_dist, + CUR.GS.freeVector.x, + 0x4000 ); + + CUR.zp1.org[point].y = CUR.zp0.org[CUR.GS.rp0].y + + TT_MULDIV( cvt_dist, + CUR.GS.freeVector.y, + 0x4000 ); + + CUR.zp1.cur[point] = CUR.zp1.org[point]; + } + + org_dist = CUR_Func_dualproj( CUR.zp1.org + point, + CUR.zp0.org + CUR.GS.rp0 ); + + cur_dist = CUR_Func_project( CUR.zp1.cur + point, + CUR.zp0.cur + CUR.GS.rp0 ); + + /* auto-flip test */ + + if ( CUR.GS.auto_flip ) + { + if ( ( org_dist ^ cvt_dist ) < 0 ) + cvt_dist = -cvt_dist; + } + + /* control value cutin and round */ + + if ( ( CUR.opcode & 4 ) != 0 ) + { + /* XXX: UNDOCUMENTED! Only perform cut-in test when both points */ + /* refer to the same zone. */ + + if ( CUR.GS.gep0 == CUR.GS.gep1 ) + if ( ABS( cvt_dist - org_dist ) >= CUR.GS.control_value_cutin ) + cvt_dist = org_dist; + + distance = CUR_Func_round( + cvt_dist, + CUR.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 ( 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... --> */ + /* */ + static + void Ins_IP( INS_ARG ) + { + FT_F26Dot6 org_a, org_b, org_x, + cur_a, cur_b, cur_x, + distance; + FT_UShort point; + + FT_UNUSED_ARG; + + + if ( CUR.top < CUR.GS.loop ) + { + CUR.error = TT_Err_Invalid_Reference; + return; + } + + /* XXX: There are some glyphs in some braindead but popular */ + /* fonts out there (e.g. [aeu]grave in monotype.ttf) */ + /* calling IP[] with bad values of rp[12]. */ + /* Do something sane when this odd thing happens. */ + + if ( BOUNDS( CUR.GS.rp1, CUR.zp0.n_points ) || + BOUNDS( CUR.GS.rp2, CUR.zp1.n_points ) ) + { + org_a = cur_a = 0; + org_b = cur_b = 0; + } + else + { + org_a = CUR_Func_dualproj( CUR.zp0.org + CUR.GS.rp1, NULL_Vector ); + org_b = CUR_Func_dualproj( CUR.zp1.org + CUR.GS.rp2, NULL_Vector ); + + cur_a = CUR_Func_project( CUR.zp0.cur + CUR.GS.rp1, NULL_Vector ); + cur_b = CUR_Func_project( CUR.zp1.cur + CUR.GS.rp2, NULL_Vector ); + } + + while ( CUR.GS.loop > 0 ) + { + CUR.args--; + + point = (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 + { + org_x = CUR_Func_dualproj( CUR.zp2.org + point, NULL_Vector ); + cur_x = CUR_Func_project ( CUR.zp2.cur + point, NULL_Vector ); + + if ( ( org_a <= org_b && org_x <= org_a ) || + ( org_a > org_b && org_x >= org_a ) ) + + distance = ( cur_a - org_a ) + ( org_x - cur_x ); + + else if ( ( org_a <= org_b && org_x >= org_b ) || + ( org_a > org_b && org_x < org_b ) ) + + distance = ( cur_b - org_b ) + ( org_x - cur_x ); + + else + /* note: it seems that rounding this value isn't a good */ + /* idea (cf. width of capital `S' in Times) */ + + distance = TT_MULDIV( cur_b - cur_a, + org_x - org_a, + org_b - org_a ) + ( cur_a - cur_x ); + + CUR_Func_move( &CUR.zp2, point, distance ); + } + + CUR.GS.loop--; + } + + CUR.GS.loop = 1; + CUR.new_top = CUR.args; + } + + + /*************************************************************************/ + /* */ + /* UTP[a]: UnTouch Point */ + /* 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: */ + struct LOC_Ins_IUP + { + FT_Vector* orgs; /* original and current coordinate */ + FT_Vector* curs; /* arrays */ + }; + + + static + void Shift( FT_UInt p1, + FT_UInt p2, + FT_UInt p, + struct LOC_Ins_IUP* LINK ) + { + FT_UInt i; + FT_F26Dot6 x; + + + x = LINK->curs[p].x - LINK->orgs[p].x; + + for ( i = p1; i < p; i++ ) + LINK->curs[i].x += x; + + for ( i = p + 1; i <= p2; i++ ) + LINK->curs[i].x += x; + } + + + static + void Interp( FT_UInt p1, + FT_UInt p2, + FT_UInt ref1, + FT_UInt ref2, + struct LOC_Ins_IUP* LINK ) + { + FT_UInt i; + FT_F26Dot6 x, x1, x2, d1, d2; + + + if ( p1 > p2 ) + return; + + x1 = LINK->orgs[ref1].x; + d1 = LINK->curs[ref1].x - LINK->orgs[ref1].x; + x2 = LINK->orgs[ref2].x; + d2 = LINK->curs[ref2].x - LINK->orgs[ref2].x; + + if ( x1 == x2 ) + { + for ( i = p1; i <= p2; i++ ) + { + x = LINK->orgs[i].x; + + if ( x <= x1 ) + x += d1; + else + x += d2; + + LINK->curs[i].x = x; + } + return; + } + + if ( x1 < x2 ) + { + for ( i = p1; i <= p2; i++ ) + { + x = LINK->orgs[i].x; + + if ( x <= x1 ) + x += d1; + else + { + if ( x >= x2 ) + x += d2; + else + x = LINK->curs[ref1].x + + TT_MULDIV( x - x1, + LINK->curs[ref2].x - LINK->curs[ref1].x, + x2 - x1 ); + } + LINK->curs[i].x = x; + } + return; + } + + /* x2 < x1 */ + + for ( i = p1; i <= p2; i++ ) + { + x = LINK->orgs[i].x; + if ( x <= x2 ) + x += d2; + else + { + if ( x >= x1 ) + x += d1; + else + x = LINK->curs[ref1].x + + TT_MULDIV( x - x1, + LINK->curs[ref2].x - LINK->curs[ref1].x, + x2 - x1 ); + } + LINK->curs[i].x = x; + } + } + + + /*************************************************************************/ + /* */ + /* IUP[a]: Interpolate Untouched Points */ + /* Opcode range: 0x30-0x31 */ + /* Stack: --> */ + /* */ + static + void Ins_IUP( INS_ARG ) + { + struct LOC_Ins_IUP 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; + + + if ( CUR.opcode & 1 ) + { + mask = FT_Curve_Tag_Touch_X; + V.orgs = CUR.pts.org; + V.curs = CUR.pts.cur; + } + 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 ); + } + + contour = 0; + point = 0; + + do + { + end_point = CUR.pts.contours[contour]; + 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 ) + Interp( cur_touched + 1, + point - 1, + cur_touched, + point, + &V ); + cur_touched = point; + } + + point++; + } + + if ( cur_touched == first_touched ) + Shift( first_point, end_point, cur_touched, &V ); + else + { + Interp( (FT_UShort)( cur_touched + 1 ), + end_point, + cur_touched, + first_touched, + &V ); + + if ( first_touched > 0 ) + Interp( first_point, + first_touched - 1, + cur_touched, + first_touched, + &V ); + } + } + contour++; + } while ( contour < CUR.pts.n_contours ); + } + + + /*************************************************************************/ + /* */ + /* DELTAPn[]: DELTA exceptions P1, P2, P3 */ + /* 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; + + + 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; + + + 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 */ + /* */ + /* XXX: According to Apple specs, bits 1 & 2 of the argument ought to be */ + /* consulted before rotated/stretched info is returned. */ + static + void Ins_GETINFO( INS_ARG ) + { + FT_Long K; + + + K = 0; + + /* We return then Windows 3.1 version number */ + /* for the font scaler */ + if ( ( args[0] & 1 ) != 0 ) + K = 3; + + /* Has the glyph been rotated ? */ + if ( CUR.tt_metrics.rotated ) + K |= 0x80; + + /* Has the glyph been stretched ? */ + if ( CUR.tt_metrics.stretched ) + K |= 0x100; + + 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 whith TRUE, test IP < CodeSize to know wether 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 = CUR.code[CUR.IP + 1] + 2; + } + + 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 = AA ^ (FT_Short)0x4000; + + if ( opcode < 4 ) + { + CUR.GS.projVector.x = AA; + CUR.GS.projVector.y = BB; + + CUR.GS.dualVector.x = AA; + CUR.GS.dualVector.y = BB; + } + + if ( ( opcode & 2 ) == 0 ) + { + CUR.GS.freeVector.x = AA; + CUR.GS.freeVector.y = BB; + } + + 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_CONFIG_OPTION_BYTECODE_INTERPRETER */ + + +/* END */ Index: xc/extras/freetype2/src/truetype/ttinterp.h diff -u /dev/null xc/extras/freetype2/src/truetype/ttinterp.h:1.1.1.1 --- /dev/null Mon Dec 18 14:22:41 2000 +++ xc/extras/freetype2/src/truetype/ttinterp.h Fri Dec 8 16:26:26 2000 @@ -0,0 +1,321 @@ +/***************************************************************************/ +/* */ +/* ttinterp.h */ +/* */ +/* TrueType bytecode interpreter (specification). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#ifndef TTINTERP_H +#define TTINTERP_H + + +#ifdef FT_FLAT_COMPILE + +#include "ttobjs.h" + +#else + +#include + +#endif + + +#ifdef __cplusplus + extern "C" { +#endif + + +#ifndef TT_CONFIG_OPTION_STATIC_INTEPRETER /* 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_UInt point, + FT_F26Dot6 distance ); + + /* Distance projection along one of the projection vectors */ + typedef FT_F26Dot6 (*TT_Project_Func)( EXEC_OP_ FT_Vector* v1, + FT_Vector* v2 ); + + /* reading a cvt value. Take care of non-square pixels if necessary */ + typedef FT_F26Dot6 (*TT_Get_CVT_Func)( EXEC_OP_ FT_ULong index ); + + /* setting or moving a cvt value. Take care of non-square pixels */ + /* if necessary */ + typedef void (*TT_Set_CVT_Func)( EXEC_OP_ FT_ULong index, + 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_GlyphZone 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 for 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_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_ULong loadSize; + TT_SubGlyph_Stack loadStack; /* loading subglyph stack */ + + } 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_Face face ); + + + FT_LOCAL + FT_Error TT_Done_Context( TT_ExecContext exec ); + + FT_LOCAL + FT_Error TT_Destroy_Context( TT_ExecContext exec, + FT_Memory memory ); + + 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 ); + + +#ifdef __cplusplus + } +#endif + +#endif /* TTINTERP_H */ + + +/* END */ Index: xc/extras/freetype2/src/truetype/ttobjs.c diff -u /dev/null xc/extras/freetype2/src/truetype/ttobjs.c:1.1.1.1 --- /dev/null Mon Dec 18 14:22:41 2000 +++ xc/extras/freetype2/src/truetype/ttobjs.c Fri Dec 8 16:26:26 2000 @@ -0,0 +1,884 @@ +/***************************************************************************/ +/* */ +/* ttobjs.c */ +/* */ +/* Objects manager (body). */ +/* */ +/* 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 +#include +#include +#include +#include + +#include +#include + + +#ifdef FT_FLAT_COMPILE + +#include "ttgload.h" +#include "ttpload.h" + +#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER +#include "ttinterp.h" +#endif + +#else /* FT_FLAT_COMPILE */ + +#include +#include + +#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER +#include +#endif + +#endif /* FT_FLAT_COMPILE */ + + +#include + + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an 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_CONFIG_OPTION_BYTECODE_INTERPRETER + + /*************************************************************************/ + /* */ + /* GLYPH ZONE FUNCTIONS */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* */ + /* TT_Done_GlyphZone */ + /* */ + /* */ + /* Deallocates a glyph zone. */ + /* */ + /* */ + /* zone :: A pointer to the target glyph zone. */ + /* */ + FT_LOCAL_DEF + void TT_Done_GlyphZone( TT_GlyphZone* zone ) + { + FT_Memory memory = zone->memory; + + + FREE( zone->contours ); + FREE( zone->tags ); + FREE( zone->cur ); + FREE( zone->org ); + + zone->max_points = zone->n_points = 0; + zone->max_contours = zone->n_contours = 0; + } + + + /*************************************************************************/ + /* */ + /* */ + /* TT_New_GlyphZone */ + /* */ + /* */ + /* Allocates 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_New_GlyphZone( FT_Memory memory, + FT_UShort maxPoints, + FT_Short maxContours, + TT_GlyphZone* zone ) + { + FT_Error error; + + + if ( maxPoints > 0 ) + maxPoints += 2; + + MEM_Set( zone, 0, sizeof ( *zone ) ); + zone->memory = memory; + + if ( ALLOC_ARRAY( zone->org, maxPoints * 2, FT_F26Dot6 ) || + ALLOC_ARRAY( zone->cur, maxPoints * 2, FT_F26Dot6 ) || + ALLOC_ARRAY( zone->tags, maxPoints, FT_Byte ) || + ALLOC_ARRAY( zone->contours, maxContours, FT_UShort ) ) + { + TT_Done_GlyphZone( zone ); + } + + return error; + } +#endif /* TT_CONFIG_OPTION_BYTECODE_INTERPRETER */ + + + /*************************************************************************/ + /* */ + /* */ + /* TT_Init_Face */ + /* */ + /* */ + /* Initializes 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 + FT_Error TT_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; + SFNT_Interface* sfnt; + + + library = face->root.driver->root.library; + sfnt = (SFNT_Interface*)FT_Get_Module_Interface( library, "sfnt" ); + if ( !sfnt ) + goto Bad_Format; + + /* create input stream from resource */ + if ( FILE_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 */ + if ( face->format_tag != 0x00010000L && /* MS fonts */ + face->format_tag != TTAG_true ) /* Mac fonts */ + { + FT_TRACE2(( "[not a valid TTF font]\n" )); + goto Bad_Format; + } + + /* If we are performing a simple font format check, exit immediately */ + if ( face_index < 0 ) + return TT_Err_Ok; + + /* Load font directory */ + error = sfnt->load_face( stream, face, face_index, num_params, params ); + if ( error ) + goto Exit; + + if ( face->root.face_flags & FT_FACE_FLAG_SCALABLE ) + error = TT_Load_Locations( face, stream ) || + TT_Load_CVT ( face, stream ) || + TT_Load_Programs ( face, stream ); + + /* initialize standard glyph loading routines */ + TT_Init_Glyph_Loading( face ); + + Exit: + return error; + + Bad_Format: + error = FT_Err_Unknown_File_Format; + goto Exit; + } + + + /*************************************************************************/ + /* */ + /* */ + /* TT_Done_Face */ + /* */ + /* */ + /* Finalizes a given face object. */ + /* */ + /* */ + /* face :: A pointer to the face object to destroy. */ + /* */ + FT_LOCAL + void TT_Done_Face( TT_Face face ) + { + FT_Memory memory = face->root.memory; + FT_Stream stream = face->root.stream; + + SFNT_Interface* sfnt = (SFNT_Interface*)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 */ + FREE( face->glyph_locations ); + face->num_locations = 0; + + /* freeing the CVT */ + FREE( face->cvt ); + face->cvt_size = 0; + + /* freeing the programs */ + RELEASE_Frame( face->font_program ); + RELEASE_Frame( face->cvt_program ); + face->font_program_size = 0; + face->cvt_program_size = 0; + } + + + /*************************************************************************/ + /* */ + /* SIZE FUNCTIONS */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* */ + /* TT_Init_Size */ + /* */ + /* */ + /* Initializes a new TrueType size object. */ + /* */ + /* */ + /* size :: A handle to the size object. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL + FT_Error TT_Init_Size( TT_Size size ) + { + FT_Error error = TT_Err_Ok; + + +#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER + + TT_Face face = (TT_Face)size->root.face; + FT_Memory memory = face->root.memory; + FT_Int i; + + TT_ExecContext exec; + FT_UShort n_twilight; + TT_MaxProfile* maxp = &face->max_profile; + + + size->ttmetrics.valid = FALSE; + + 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->root.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 ( ALLOC_ARRAY( size->function_defs, + size->max_function_defs, + TT_DefRecord ) || + + ALLOC_ARRAY( size->instruction_defs, + size->max_instruction_defs, + TT_DefRecord ) || + + ALLOC_ARRAY( size->cvt, + size->cvt_size, FT_Long ) || + + ALLOC_ARRAY( size->storage, + size->storage_size, FT_Long ) ) + + goto Fail_Memory; + + /* reserve twilight zone */ + n_twilight = maxp->maxTwilightPoints; + error = TT_New_GlyphZone( memory, n_twilight, 0, &size->twilight ); + if ( error ) + goto Fail_Memory; + + size->twilight.n_points = n_twilight; + + /* 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 execute the font program! */ + exec = size->context; + /* size objects used during debugging have their own context */ + if ( !size->debug ) + exec = TT_New_Context( face ); + + if ( !exec ) + { + error = TT_Err_Could_Not_Find_Context; + goto Fail_Memory; + } + + size->GS = tt_default_graphics_state; + TT_Load_Context( exec, face, size ); + + exec->callTop = 0; + exec->top = 0; + + exec->period = 64; + exec->phase = 0; + exec->threshold = 0; + + { + 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; + } + + exec->instruction_trap = FALSE; + + exec->cvtSize = size->cvt_size; + exec->cvt = size->cvt; + + exec->F_dot_P = 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 ); + + if ( error ) + goto Fail_Exec; + } + else + error = TT_Err_Ok; + + TT_Save_Context( exec, size ); + + if ( !size->debug ) + TT_Done_Context( exec ); + +#endif /* TT_CONFIG_OPTION_BYTECODE_INTERPRETER */ + + size->ttmetrics.valid = FALSE; + return error; + +#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER + + Fail_Exec: + if ( !size->debug ) + TT_Done_Context( exec ); + + Fail_Memory: + + TT_Done_Size( size ); + return error; + +#endif /* TT_CONFIG_OPTION_BYTECODE_INTERPRETER */ + + } + + + /*************************************************************************/ + /* */ + /* */ + /* TT_Done_Size */ + /* */ + /* */ + /* The TrueType size object finalizer. */ + /* */ + /* */ + /* size :: A handle to the target size object. */ + /* */ + FT_LOCAL_DEF + void TT_Done_Size( TT_Size size ) + { + +#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER + + FT_Memory memory = size->root.face->memory; + + + if ( size->debug ) + { + /* the debug context must be deleted by the debugger itself */ + size->context = NULL; + size->debug = FALSE; + } + + FREE( size->cvt ); + size->cvt_size = 0; + + /* free storage area */ + FREE( size->storage ); + size->storage_size = 0; + + /* twilight zone */ + TT_Done_GlyphZone( &size->twilight ); + + FREE( size->function_defs ); + 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; + +#endif + + size->ttmetrics.valid = FALSE; + } + + + /*************************************************************************/ + /* */ + /* */ + /* Reset_Outline_Size */ + /* */ + /* */ + /* Resets a TrueType outline size when resolutions and character */ + /* dimensions have been changed. */ + /* */ + /* */ + /* size :: A handle to the target size object. */ + /* */ + static + FT_Error Reset_Outline_Size( TT_Size size ) + { + TT_Face face; + FT_Error error = TT_Err_Ok; + + FT_Size_Metrics* metrics; + + + if ( size->ttmetrics.valid ) + return TT_Err_Ok; + + face = (TT_Face)size->root.face; + + metrics = &size->root.metrics; + + if ( metrics->x_ppem < 1 || metrics->y_ppem < 1 ) + return TT_Err_Invalid_PPem; + + /* 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; + } + + /* Compute root ascender, descender, test height, and max_advance */ + metrics->ascender = ( FT_MulFix( face->root.ascender, + metrics->y_scale ) + 32 ) & -64; + metrics->descender = ( FT_MulFix( face->root.descender, + metrics->y_scale ) + 32 ) & -64; + metrics->height = ( FT_MulFix( face->root.height, + metrics->y_scale ) + 32 ) & -64; + metrics->max_advance = ( FT_MulFix( face->root.max_advance_width, + metrics->x_scale ) + 32 ) & -64; + +#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS + /* set to `invalid' by default */ + size->strike_index = 0xFFFF; +#endif + +#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER + + { + TT_ExecContext exec; + FT_UInt i, j; + + + /* 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 ( j = 0; j < (FT_UInt)size->twilight.n_points; j++ ) + { + size->twilight.org[j].x = 0; + size->twilight.org[j].y = 0; + size->twilight.cur[j].x = 0; + size->twilight.cur[j].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; + + /* get execution context and run prep program */ + if ( size->debug ) + exec = size->context; + else + exec = TT_New_Context( face ); + /* debugging instances have their own context */ + + if ( !exec ) + return TT_Err_Could_Not_Find_Context; + + TT_Load_Context( exec, face, size ); + + TT_Set_CodeRange( exec, + tt_coderange_cvt, + face->cvt_program, + face->cvt_program_size ); + + TT_Clear_CodeRange( exec, tt_coderange_glyph ); + + exec->instruction_trap = FALSE; + + exec->top = 0; + exec->callTop = 0; + + if ( face->cvt_program_size > 0 ) + { + error = TT_Goto_CodeRange( exec, tt_coderange_cvt, 0 ); + if ( error ) + goto End; + + if ( !size->debug ) + error = face->interpreter( exec ); + } + else + error = TT_Err_Ok; + + size->GS = exec->GS; + /* save default graphics state */ + + End: + TT_Save_Context( exec, size ); + + if ( !size->debug ) + TT_Done_Context( exec ); + /* debugging instances keep their context */ + } + +#endif /* TT_CONFIG_OPTION_BYTECODE_INTERPRETER */ + + if ( !error ) + size->ttmetrics.valid = TRUE; + + return error; + } + + +#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS + + /*************************************************************************/ + /* */ + /* */ + /* Reset_SBit_Size */ + /* */ + /* */ + /* Resets a TrueType sbit size when resolutions and character */ + /* dimensions have been changed. */ + /* */ + /* */ + /* size :: A handle to the target size object. */ + /* */ + static + FT_Error Reset_SBit_Size( TT_Size size ) + { + TT_Face face; + FT_Error error = TT_Err_Ok; + + FT_ULong strike_index; + FT_Size_Metrics* metrics; + FT_Size_Metrics* sbit_metrics; + SFNT_Interface* sfnt; + + + metrics = &size->root.metrics; + + if ( size->strike_index != 0xFFFF ) + return TT_Err_Ok; + + face = (TT_Face)size->root.face; + sfnt = (SFNT_Interface*)face->sfnt; + + sbit_metrics = &size->strike_metrics; + + error = sfnt->set_sbit_strike(face, + metrics->x_ppem, metrics->y_ppem, + &strike_index); + + if ( !error ) + { + TT_SBit_Strike* strike = face->sbit_strikes + strike_index; + + + sbit_metrics->x_ppem = metrics->x_ppem; + sbit_metrics->y_ppem = metrics->y_ppem; +#if 0 + /* + * sbit_metrics->?_scale + * are not used now. + */ + sbit_metrics->x_scale = 1 << 16; + sbit_metrics->y_scale = 1 << 16; +#endif + + sbit_metrics->ascender = strike->hori.ascender << 6; + sbit_metrics->descender = strike->hori.descender << 6; + + /* XXX: Is this correct? */ + sbit_metrics->height = sbit_metrics->ascender - + sbit_metrics->descender; + + /* XXX: Is this correct? */ + sbit_metrics->max_advance = ( strike->hori.min_origin_SB + + strike->hori.max_width + + strike->hori.min_advance_SB ) << 6; + + size->strike_index = strike_index; + } + else + { + size->strike_index = 0xFFFF; + + sbit_metrics->x_ppem = 0; + sbit_metrics->y_ppem = 0; + sbit_metrics->ascender = 0; + sbit_metrics->descender = 0; + sbit_metrics->height = 0; + sbit_metrics->max_advance = 0; + } + + return error; + } + +#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */ + + + /*************************************************************************/ + /* */ + /* */ + /* TT_Reset_Size */ + /* */ + /* */ + /* Resets 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_Reset_Size( TT_Size size ) + { + FT_Face face; + FT_Error error = TT_Err_Ok; + + + face = size->root.face; + + if ( face->face_flags & FT_FACE_FLAG_SCALABLE ) + { + if ( !size->ttmetrics.valid ) + error = Reset_Outline_Size( size ); + + if ( error ) + return error; + } + +#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS + + if ( face->face_flags & FT_FACE_FLAG_FIXED_SIZES ) + { + if ( size->strike_index == 0xFFFF ) + error = Reset_SBit_Size( size ); + + if ( !error && !( face->face_flags & FT_FACE_FLAG_SCALABLE ) ) + size->root.metrics = size->strike_metrics; + } + +#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */ + + if ( face->face_flags & FT_FACE_FLAG_SCALABLE ) + return TT_Err_Ok; + else + return error; + } + + + /*************************************************************************/ + /* */ + /* */ + /* TT_Init_Driver */ + /* */ + /* */ + /* Initializes 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_Init_Driver( TT_Driver driver ) + { + FT_Error error; + + + /* set `extra' in glyph loader */ + error = FT_GlyphLoader_Create_Extra( FT_DRIVER( driver )->glyph_loader ); + + /* init extension registry if needed */ + +#ifdef TT_CONFIG_OPTION_EXTEND_ENGINE + if ( !error ) + return TT_Init_Extensions( driver ); +#endif + + return error; + } + + + /*************************************************************************/ + /* */ + /* */ + /* TT_Done_Driver */ + /* */ + /* */ + /* Finalizes a given TrueType driver. */ + /* */ + /* */ + /* driver :: A handle to the target TrueType driver. */ + /* */ + FT_LOCAL_DEF + void TT_Done_Driver( TT_Driver driver ) + { + /* destroy extensions registry if needed */ + +#ifdef TT_CONFIG_OPTION_EXTEND_ENGINE + + TT_Done_Extensions( driver ); + +#endif + +#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER + + /* destroy the execution context */ + if ( driver->context ) + { + TT_Destroy_Context( driver->context, driver->root.root.memory ); + driver->context = NULL; + } +#else + FT_UNUSED( driver ); +#endif + + } + + +/* END */ Index: xc/extras/freetype2/src/truetype/ttobjs.h diff -u /dev/null xc/extras/freetype2/src/truetype/ttobjs.h:1.1.1.1 --- /dev/null Mon Dec 18 14:22:42 2000 +++ xc/extras/freetype2/src/truetype/ttobjs.h Fri Dec 8 16:26:26 2000 @@ -0,0 +1,426 @@ +/***************************************************************************/ +/* */ +/* ttobjs.h */ +/* */ +/* Objects manager (specification). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#ifndef TTOBJS_H +#define TTOBJS_H + + +#include +#include +#include + + +#ifdef __cplusplus + extern "C" { +#endif + + + /*************************************************************************/ + /* */ + /* */ + /* 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; + + 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_CONFIG_OPTION_BYTECODE_INTERPRETER + + FT_LOCAL + void TT_Done_GlyphZone( TT_GlyphZone* zone ); + + FT_LOCAL + FT_Error TT_New_GlyphZone( FT_Memory memory, + FT_UShort maxPoints, + FT_Short maxContours, + TT_GlyphZone* zone ); + +#endif /* TT_CONFIG_OPTION_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_GlyphZone 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 */ + + } 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; + + TT_Size_Metrics ttmetrics; + +#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS + + FT_UInt strike_index; /* 0xFFFF to indicate invalid */ + FT_Size_Metrics strike_metrics; /* current strike's metrics */ + +#endif + +#ifdef TT_CONFIG_OPTION_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_GlyphZone 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; + +#endif /* TT_CONFIG_OPTION_BYTECODE_INTERPRETER */ + + } TT_SizeRec; + + + /*************************************************************************/ + /* */ + /* TrueType driver class. */ + /* */ + typedef struct TT_DriverRec_ + { + FT_DriverRec root; + TT_ExecContext context; /* execution context */ + TT_GlyphZone zone; /* glyph loader points zone */ + + void* extension_component; + + } TT_DriverRec; + + + /*************************************************************************/ + /* */ + /* Face functions */ + /* */ + FT_LOCAL + FT_Error TT_Init_Face( FT_Stream stream, + TT_Face face, + FT_Int face_index, + FT_Int num_params, + FT_Parameter* params ); + + FT_LOCAL + void TT_Done_Face( TT_Face face ); + + + /*************************************************************************/ + /* */ + /* Size functions */ + /* */ + FT_LOCAL + FT_Error TT_Init_Size( TT_Size size ); + + FT_LOCAL + void TT_Done_Size( TT_Size size ); + + FT_LOCAL + FT_Error TT_Reset_Size( TT_Size size ); + + + /*************************************************************************/ + /* */ + /* Driver functions */ + /* */ + FT_LOCAL + FT_Error TT_Init_Driver( TT_Driver driver ); + + FT_LOCAL + void TT_Done_Driver( TT_Driver driver ); + + +#ifdef __cplusplus + } +#endif + +#endif /* TTOBJS_H */ + + +/* END */ Index: xc/extras/freetype2/src/truetype/ttpload.c diff -u /dev/null xc/extras/freetype2/src/truetype/ttpload.c:1.1.1.1 --- /dev/null Mon Dec 18 14:22:42 2000 +++ xc/extras/freetype2/src/truetype/ttpload.c Fri Dec 8 16:26:26 2000 @@ -0,0 +1,273 @@ +/***************************************************************************/ +/* */ +/* ttpload.h */ +/* */ +/* TrueType glyph data/program tables loader (body). */ +/* */ +/* 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 +#include +#include +#include + +#ifdef FT_FLAT_COMPILE +#include "ttpload.h" +#else +#include +#endif + +#include + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an 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_Load_Locations */ + /* */ + /* */ + /* Loads 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_Load_Locations( TT_Face face, + FT_Stream stream ) + { + FT_Error error; + FT_Memory memory = stream->memory; + FT_Short LongOffsets; + FT_ULong table_len; + + + FT_TRACE2(( "Locations " )); + LongOffsets = face->header.Index_To_Loc_Format; + + error = face->goto_table( face, TTAG_loca, stream, &table_len ); + if ( error ) + { + error = TT_Err_Locations_Missing; + goto Exit; + } + + if ( LongOffsets != 0 ) + { + face->num_locations = (FT_UShort)( table_len >> 2 ); + + FT_TRACE2(( "(32bit offsets): %12d ", face->num_locations )); + + if ( ALLOC_ARRAY( face->glyph_locations, + face->num_locations, + FT_Long ) ) + goto Exit; + + if ( ACCESS_Frame( face->num_locations * 4L ) ) + goto Exit; + + { + FT_Long* loc = face->glyph_locations; + FT_Long* limit = loc + face->num_locations; + + + for ( ; loc < limit; loc++ ) + *loc = GET_Long(); + } + + FORGET_Frame(); + } + else + { + face->num_locations = (FT_UShort)( table_len >> 1 ); + + FT_TRACE2(( "(16bit offsets): %12d ", face->num_locations )); + + if ( ALLOC_ARRAY( face->glyph_locations, + face->num_locations, + FT_Long ) ) + goto Exit; + + if ( ACCESS_Frame( face->num_locations * 2L ) ) + goto Exit; + { + FT_Long* loc = face->glyph_locations; + FT_Long* limit = loc + face->num_locations; + + + for ( ; loc < limit; loc++ ) + *loc = (FT_Long)( (FT_ULong)GET_UShort() * 2 ); + } + FORGET_Frame(); + } + + FT_TRACE2(( "loaded\n" )); + + Exit: + return error; + } + + + /*************************************************************************/ + /* */ + /* */ + /* TT_Load_CVT */ + /* */ + /* */ + /* Loads 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_Load_CVT( TT_Face face, + FT_Stream stream ) + { + 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 ( ALLOC_ARRAY( face->cvt, + face->cvt_size, + FT_Short ) ) + goto Exit; + + if ( ACCESS_Frame( face->cvt_size * 2L ) ) + goto Exit; + + { + FT_Short* cur = face->cvt; + FT_Short* limit = cur + face->cvt_size; + + + for ( ; cur < limit; cur++ ) + *cur = GET_Short(); + } + + FORGET_Frame(); + FT_TRACE2(( "loaded\n" )); + + Exit: + return error; + } + + + /*************************************************************************/ + /* */ + /* */ + /* TT_Load_Progams */ + /* */ + /* */ + /* Loads the font program and 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_Load_Programs( TT_Face face, + FT_Stream stream ) + { + 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; + + FT_TRACE2(( "is missing!\n" )); + } + else + { + face->font_program_size = table_len; + if ( EXTRACT_Frame( table_len, face->font_program ) ) + goto Exit; + + FT_TRACE2(( "loaded, %12d bytes\n", face->font_program_size )); + } + + 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 ( EXTRACT_Frame( table_len, face->cvt_program ) ) + goto Exit; + + FT_TRACE2(( "loaded, %12d bytes\n", face->cvt_program_size )); + } + + Exit: + return error; + } + + +/* END */ Index: xc/extras/freetype2/src/truetype/ttpload.h diff -u /dev/null xc/extras/freetype2/src/truetype/ttpload.h:1.1.1.1 --- /dev/null Mon Dec 18 14:22:42 2000 +++ xc/extras/freetype2/src/truetype/ttpload.h Fri Dec 8 16:26:26 2000 @@ -0,0 +1,51 @@ +/***************************************************************************/ +/* */ +/* ttpload.h */ +/* */ +/* TrueType glyph data/program tables loader (specification). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#ifndef TTPLOAD_H +#define TTPLOAD_H + +#include + + +#ifdef __cplusplus + extern "C" { +#endif + + + FT_LOCAL + FT_Error TT_Load_Locations( TT_Face face, + FT_Stream stream ); + + FT_LOCAL + FT_Error TT_Load_CVT( TT_Face face, + FT_Stream stream ); + + FT_LOCAL + FT_Error TT_Load_Programs( TT_Face face, + FT_Stream stream ); + + +#ifdef __cplusplus + } +#endif + + +#endif /* TTPLOAD_H */ + + +/* END */ Index: xc/extras/freetype2/src/type1/module.mk diff -u /dev/null xc/extras/freetype2/src/type1/module.mk:1.1.1.1 --- /dev/null Mon Dec 18 14:22:42 2000 +++ xc/extras/freetype2/src/type1/module.mk Fri Dec 8 16:26:26 2000 @@ -0,0 +1,22 @@ +# +# FreeType 2 Type1 module definition +# + + +# 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. + + +make_module_list: add_type1_driver + +add_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) + +# EOF Index: xc/extras/freetype2/src/type1/rules.mk diff -u /dev/null xc/extras/freetype2/src/type1/rules.mk:1.1.1.1 --- /dev/null Mon Dec 18 14:22:42 2000 +++ xc/extras/freetype2/src/type1/rules.mk Fri Dec 8 16:26:26 2000 @@ -0,0 +1,72 @@ +# +# FreeType 2 Type1 driver configuration rules +# + + +# 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. + + +# Type1 driver directory +# +T1_DIR := $(SRC_)type1 +T1_DIR_ := $(T1_DIR)$(SEP) + + +# compilation flags for the driver +# +T1_COMPILE := $(FT_COMPILE) + + +# 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 + + +# 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_)%.$O) +T1_DRV_OBJ_S := $(OBJ_)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$@ $(T1_DRV_SRC_S) + + +# Type1 driver - multiple objects +# +$(OBJ_)%.$O: $(T1_DIR_)%.c $(FREETYPE_H) $(T1_DRV_H) + $(T1_COMPILE) $T$@ $< + + +# update main driver object lists +# +DRV_OBJS_S += $(T1_DRV_OBJ_S) +DRV_OBJS_M += $(T1_DRV_OBJ_M) + +# EOF Index: xc/extras/freetype2/src/type1/t1afm.c diff -u /dev/null xc/extras/freetype2/src/type1/t1afm.c:1.1.1.1 --- /dev/null Mon Dec 18 14:22:42 2000 +++ xc/extras/freetype2/src/type1/t1afm.c Fri Dec 8 16:26:26 2000 @@ -0,0 +1,293 @@ +/***************************************************************************/ +/* */ +/* t1afm.c */ +/* */ +/* AFM support for Type 1 fonts (body). */ +/* */ +/* Copyright 1996-2000 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifdef FT_FLAT_COMPILE + +#include "t1afm.h" + +#else + +#include + +#endif + + +#include +#include + +#include /* for qsort() */ +#include /* for strcmp() */ +#include /* for isalnum() */ + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an 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_AFM( FT_Memory memory, + T1_AFM* afm ) + { + FREE( afm->kern_pairs ); + afm->num_pairs = 0; + } + + +#undef IS_KERN_PAIR +#define IS_KERN_PAIR( p ) ( p[0] == 'K' && p[1] == 'P' ) + +#define IS_ALPHANUM( c ) ( isalnum( c ) || \ + c == '_' || \ + c == '.' ) + + + /* read a glyph name and return the equivalent glyph index */ + static + FT_UInt afm_atoindex( FT_Byte** start, + FT_Byte* limit, + T1_Font* type1 ) + { + FT_Byte* p = *start; + FT_Int len; + FT_UInt result = 0; + char temp[64]; + + + /* skip whitespace */ + while ( ( *p == ' ' || *p == '\t' || *p == ':' || *p == ';' ) && + p < limit ) + p++; + *start = p; + + /* now, read glyph name */ + while ( IS_ALPHANUM( *p ) && p < limit ) + p++; + + len = p - *start; + + if ( len > 0 && len < 64 ) + { + FT_Int n; + + + /* copy glyph name to intermediate array */ + MEM_Copy( temp, *start, len ); + temp[len] = 0; + + /* lookup glyph name in face array */ + for ( n = 0; n < type1->num_glyphs; n++ ) + { + char* gname = (char*)type1->glyph_names[n]; + + + if ( gname && gname[0] == temp[0] && strcmp( gname, temp ) == 0 ) + { + result = n; + break; + } + } + } + *start = p; + return result; + } + + + /* read an integer */ + static + int afm_atoi( FT_Byte** start, + FT_Byte* limit ) + { + FT_Byte* p = *start; + int sum = 0; + int sign = 1; + + + /* skip everything that is not a number */ + while ( p < limit && !isdigit( *p ) ) + { + sign = 1; + if ( *p == '-' ) + sign = -1; + + p++; + } + + while ( p < limit && isdigit( *p ) ) + { + sum = sum * 10 + ( *p - '0' ); + p++; + } + *start = p; + + return sum * sign; + } + + +#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 ) + { + T1_Kern_Pair* pair1 = (T1_Kern_Pair*)a; + T1_Kern_Pair* pair2 = (T1_Kern_Pair*)b; + + FT_ULong index1 = KERN_INDEX( pair1->glyph1, pair1->glyph2 ); + FT_ULong index2 = KERN_INDEX( pair2->glyph1, pair2->glyph2 ); + + + return ( index1 - index2 ); + } + + + /* parse an AFM file -- for now, only read the kerning pairs */ + FT_LOCAL_DEF + FT_Error T1_Read_AFM( FT_Face t1_face, + FT_Stream stream ) + { + FT_Error error; + FT_Memory memory = stream->memory; + FT_Byte* start; + FT_Byte* limit; + FT_Byte* p; + FT_Int count = 0; + T1_Kern_Pair* pair; + T1_Font* type1 = &((T1_Face)t1_face)->type1; + T1_AFM* afm = 0; + + + if ( ACCESS_Frame( stream->size ) ) + return error; + + start = (FT_Byte*)stream->cursor; + limit = (FT_Byte*)stream->limit; + p = start; + + /* we are now going to count the occurences of `KP' or `KPX' in */ + /* the AFM file */ + count = 0; + for ( p = start; p < limit - 3; p++ ) + { + if ( IS_KERN_PAIR( p ) ) + count++; + } + + /* Actually, kerning pairs are simply optional! */ + if ( count == 0 ) + goto Exit; + + /* allocate the pairs */ + if ( ALLOC( afm, sizeof ( *afm ) ) || + ALLOC_ARRAY( afm->kern_pairs, count, T1_Kern_Pair ) ) + goto Exit; + + /* now, read each kern pair */ + pair = afm->kern_pairs; + afm->num_pairs = count; + + /* save in face object */ + ((T1_Face)t1_face)->afm_data = afm; + + for ( p = start; p < limit - 3; p++ ) + { + if ( IS_KERN_PAIR( p ) ) + { + FT_Byte* q; + + + /* skip keyword (KP or KPX) */ + q = p + 2; + if ( *q == 'X' ) + q++; + + pair->glyph1 = afm_atoindex( &q, limit, type1 ); + pair->glyph2 = afm_atoindex( &q, limit, type1 ); + pair->kerning.x = afm_atoi( &q, limit ); + + pair->kerning.y = 0; + if ( p[2] != 'X' ) + pair->kerning.y = afm_atoi( &q, limit ); + + pair++; + } + } + + /* now, sort the kern pairs according to their glyph indices */ + qsort( afm->kern_pairs, count, sizeof ( T1_Kern_Pair ), + compare_kern_pairs ); + + Exit: + if ( error ) + FREE( afm ); + + FORGET_Frame(); + + return error; + } + + + /* find the kerning for a given glyph pair */ + FT_LOCAL_DEF + void T1_Get_Kerning( T1_AFM* afm, + FT_UInt glyph1, + FT_UInt glyph2, + FT_Vector* kerning ) + { + T1_Kern_Pair *min, *mid, *max; + FT_ULong index = KERN_INDEX( glyph1, glyph2 ); + + + /* simple binary search */ + min = afm->kern_pairs; + max = min + afm->num_pairs - 1; + + while ( min <= max ) + { + FT_ULong midi; + + + mid = min + ( max - min ) / 2; + midi = KERN_INDEX( mid->glyph1, mid->glyph2 ); + + if ( midi == index ) + { + *kerning = mid->kerning; + return; + } + + if ( midi < index ) + min = mid + 1; + else + max = mid - 1; + } + + kerning->x = 0; + kerning->y = 0; + } + + +/* END */ Index: xc/extras/freetype2/src/type1/t1afm.h diff -u /dev/null xc/extras/freetype2/src/type1/t1afm.h:1.1.1.1 --- /dev/null Mon Dec 18 14:22:42 2000 +++ xc/extras/freetype2/src/type1/t1afm.h Fri Dec 8 16:26:26 2000 @@ -0,0 +1,79 @@ +/***************************************************************************/ +/* */ +/* t1afm.h */ +/* */ +/* AFM support for Type 1 fonts (specification). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#ifndef T1AFM_H +#define T1AFM_H + + +#ifdef FT_FLAT_COMPILE + +#include "t1objs.h" + +#else + +#include + +#endif + + +#ifdef __cplusplus + extern "C" { +#endif + + + typedef struct T1_Kern_Pair_ + { + FT_UInt glyph1; + FT_UInt glyph2; + FT_Vector kerning; + + } T1_Kern_Pair; + + + typedef struct T1_AFM_ + { + FT_Int num_pairs; + T1_Kern_Pair* kern_pairs; + + } T1_AFM; + + + FT_LOCAL + FT_Error T1_Read_AFM( FT_Face face, + FT_Stream stream ); + + FT_LOCAL + void T1_Done_AFM( FT_Memory memory, + T1_AFM* afm ); + + FT_LOCAL + void T1_Get_Kerning( T1_AFM* afm, + FT_UInt glyph1, + FT_UInt glyph2, + FT_Vector* kerning ); + + +#ifdef __cplusplus + } +#endif + + +#endif /* T1AFM_H */ + + +/* END */ Index: xc/extras/freetype2/src/type1/t1driver.c diff -u /dev/null xc/extras/freetype2/src/type1/t1driver.c:1.1.1.1 --- /dev/null Mon Dec 18 14:22:42 2000 +++ xc/extras/freetype2/src/type1/t1driver.c Fri Dec 8 16:26:26 2000 @@ -0,0 +1,368 @@ +/***************************************************************************/ +/* */ +/* t1driver.c */ +/* */ +/* Type 1 driver interface (body). */ +/* */ +/* Copyright 1996-2000 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifdef FT_FLAT_COMPILE + +#include "t1driver.h" +#include "t1gload.h" +#include "t1load.h" + +#ifndef T1_CONFIG_OPTION_NO_AFM +#include "t1afm.h" +#endif + +#else + +#include +#include +#include + +#ifndef T1_CONFIG_OPTION_NO_AFM +#include +#endif + +#endif + + +#include +#include +#include + +#include /* for strcmp() */ + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an 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 + + + static + FT_Error get_t1_glyph_name( T1_Face face, + FT_UInt glyph_index, + FT_Pointer buffer, + FT_UInt buffer_max ) + { + FT_String* gname; + + + gname = face->type1.glyph_names[glyph_index]; + + if ( buffer_max > 0 ) + { + FT_UInt len = strlen( gname ); + + + if (len >= buffer_max) + len = buffer_max - 1; + + MEM_Copy( buffer, gname, len ); + ((FT_Byte*)buffer)[len] = 0; + } + + return T1_Err_Ok; + } + + + /*************************************************************************/ + /* */ + /* */ + /* Get_Interface */ + /* */ + /* */ + /* Each driver can provide one or more extensions to the base */ + /* FreeType API. These can be used to access format specific */ + /* features (e.g., all TrueType/OpenType resources share a common */ + /* file structure and common tables which can be accessed through the */ + /* `sfnt' interface), or more simply generic ones (e.g., the */ + /* `postscript names' interface which can be used to retrieve the */ + /* PostScript name of a given glyph index). */ + /* */ + /* */ + /* driver :: A handle to a driver object. */ + /* */ + /* */ + /* interface :: A string designing the interface. Examples are */ + /* `sfnt', `post_names', `charmaps', etc. */ + /* */ + /* */ + /* A typeless pointer to the extension's interface (normally a table */ + /* of function pointers). Returns NULL if the requested extension */ + /* isn't available (i.e., wasn't compiled in the driver at build */ + /* time). */ + /* */ + static + FT_Module_Interface Get_Interface( FT_Driver driver, + const FT_String* interface ) + { + FT_UNUSED( driver ); + FT_UNUSED( interface ); + + if ( strcmp( (const char*)interface, "glyph_name" ) == 0 ) + return (FT_Module_Interface)get_t1_glyph_name; + +#ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT + if ( strcmp( (const char*)interface, "get_mm" ) == 0 ) + return (FT_Module_Interface)T1_Get_Multi_Master; + + if ( strcmp( (const char*)interface, "set_mm_design") == 0 ) + return (FT_Module_Interface)T1_Set_MM_Design; + + if ( strcmp( (const char*)interface, "set_mm_blend") == 0 ) + return (FT_Module_Interface)T1_Set_MM_Blend; +#endif + return 0; + } + + +#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 ) + { + T1_AFM* afm; + + + kerning->x = 0; + kerning->y = 0; + + afm = (T1_AFM*)face->afm_data; + if ( afm ) + T1_Get_Kerning( afm, left_glyph, right_glyph, kerning ); + + return T1_Err_Ok; + } + + +#endif /* T1_CONFIG_OPTION_NO_AFM */ + + + /*************************************************************************/ + /* */ + /* */ + /* Get_Char_Index */ + /* */ + /* */ + /* Uses a charmap to return a given character code's glyph index. */ + /* */ + /* */ + /* charmap :: A handle to the source charmap object. */ + /* charcode :: The character code. */ + /* */ + /* */ + /* Glyph index. 0 means `undefined character code'. */ + /* */ + static + FT_UInt Get_Char_Index( FT_CharMap charmap, + FT_Long charcode ) + { + T1_Face face; + FT_UInt result = 0; + PSNames_Interface* psnames; + + + face = (T1_Face)charmap->face; + psnames = (PSNames_Interface*)face->psnames; + if ( psnames ) + switch ( charmap->encoding ) + { + /*******************************************************************/ + /* */ + /* Unicode encoding support */ + /* */ + case ft_encoding_unicode: + /* use the `PSNames' module to synthetize the Unicode charmap */ + result = psnames->lookup_unicode( &face->unicode_map, + (FT_ULong)charcode ); + + /* the function returns 0xFFFF if the Unicode charcode has */ + /* no corresponding glyph */ + if ( result == 0xFFFF ) + result = 0; + goto Exit; + + /*******************************************************************/ + /* */ + /* Custom Type 1 encoding */ + /* */ + case ft_encoding_adobe_custom: + { + T1_Encoding* encoding = &face->type1.encoding; + + + if ( charcode >= encoding->code_first && + charcode <= encoding->code_last ) + result = encoding->char_index[charcode]; + goto Exit; + } + + /*******************************************************************/ + /* */ + /* Adobe Standard & Expert encoding support */ + /* */ + default: + if ( charcode < 256 ) + { + FT_UInt code; + FT_Int n; + const char* glyph_name; + + + code = psnames->adobe_std_encoding[charcode]; + if ( charmap->encoding == ft_encoding_adobe_expert ) + code = psnames->adobe_expert_encoding[charcode]; + + glyph_name = psnames->adobe_std_strings( code ); + if ( !glyph_name ) + break; + + for ( n = 0; n < face->type1.num_glyphs; n++ ) + { + const char* gname = face->type1.glyph_names[n]; + + + if ( gname && gname[0] == glyph_name[0] && + strcmp( gname, glyph_name ) == 0 ) + { + result = n; + break; + } + } + } + } + Exit: + return result; + } + + + FT_CALLBACK_TABLE_DEF + const FT_Driver_Class t1_driver_class = + { + { + ft_module_font_driver | ft_module_driver_scalable, + sizeof( FT_DriverRec ), + + "type1", + 0x10000L, + 0x20000L, + + 0, /* format interface */ + + (FT_Module_Constructor)T1_Init_Driver, + (FT_Module_Destructor) T1_Done_Driver, + (FT_Module_Requester) Get_Interface, + }, + + sizeof( T1_FaceRec ), + sizeof( T1_SizeRec ), + sizeof( T1_GlyphSlotRec ), + + (FTDriver_initFace) T1_Init_Face, + (FTDriver_doneFace) T1_Done_Face, + (FTDriver_initSize) 0, + (FTDriver_doneSize) 0, + (FTDriver_initGlyphSlot)0, + (FTDriver_doneGlyphSlot)0, + + (FTDriver_setCharSizes) 0, + (FTDriver_setPixelSizes)0, + (FTDriver_loadGlyph) T1_Load_Glyph, + (FTDriver_getCharIndex) Get_Char_Index, + +#ifdef T1_CONFIG_OPTION_NO_AFM + (FTDriver_getKerning) 0, + (FTDriver_attachFile) 0, +#else + (FTDriver_getKerning) Get_Kerning, + (FTDriver_attachFile) T1_Read_AFM, +#endif + (FTDriver_getAdvances) 0 + }; + + +#ifdef FT_CONFIG_OPTION_DYNAMIC_DRIVERS + + + /*************************************************************************/ + /* */ + /* */ + /* getDriverClass */ + /* */ + /* */ + /* This function is used when compiling the TrueType driver as a */ + /* shared library (`.DLL' or `.so'). It will be used by the */ + /* high-level library of FreeType to retrieve the address of the */ + /* driver's generic interface. */ + /* */ + /* It shouldn't be implemented in a static build, as each driver must */ + /* have the same function as an exported entry point. */ + /* */ + /* */ + /* The address of the TrueType's driver generic interface. The */ + /* format-specific interface can then be retrieved through the method */ + /* interface->get_format_interface. */ + /* */ + FT_EXPORT_DEF( const FT_Driver_Class* ) getDriverClass( void ) + { + return &t1_driver_class; + } + + +#endif /* FT_CONFIG_OPTION_DYNAMIC_DRIVERS */ + + +/* END */ Index: xc/extras/freetype2/src/type1/t1driver.h diff -u /dev/null xc/extras/freetype2/src/type1/t1driver.h:1.1.1.1 --- /dev/null Mon Dec 18 14:22:42 2000 +++ xc/extras/freetype2/src/type1/t1driver.h Fri Dec 8 16:26:27 2000 @@ -0,0 +1,39 @@ +/***************************************************************************/ +/* */ +/* t1driver.h */ +/* */ +/* High-level Type 1 driver interface (specification). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#ifndef T1DRIVER_H +#define T1DRIVER_H + +#include + +#ifdef __cplusplus + extern "C" { +#endif + + + FT_EXPORT_VAR( const FT_Driver_Class ) t1_driver_class; + +#ifdef __cplusplus + } +#endif + + +#endif /* T1DRIVER_H */ + + +/* END */ Index: xc/extras/freetype2/src/type1/t1gload.c diff -u /dev/null xc/extras/freetype2/src/type1/t1gload.c:1.1.1.1 --- /dev/null Mon Dec 18 14:22:42 2000 +++ xc/extras/freetype2/src/type1/t1gload.c Fri Dec 8 16:26:27 2000 @@ -0,0 +1,316 @@ +/***************************************************************************/ +/* */ +/* t1gload.c */ +/* */ +/* Type 1 Glyph Loader (body). */ +/* */ +/* Copyright 1996-2000 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifdef FT_FLAT_COMPILE + +#include "t1gload.h" + +#else + +#include + +#endif + + +#include +#include +#include +#include + + +#include /* for strcmp() */ + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an 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_CALLBACK_DEF + FT_Error T1_Parse_Glyph( T1_Decoder* decoder, + FT_UInt glyph_index ) + { + T1_Face face = (T1_Face)decoder->builder.face; + T1_Font* type1 = &face->type1; + + + decoder->font_matrix = type1->font_matrix; + decoder->font_offset = type1->font_offset; + + return decoder->funcs.parse_charstrings( + decoder, + type1->charstrings [glyph_index], + type1->charstrings_len[glyph_index] ); + } + + + FT_LOCAL_DEF + FT_Error T1_Compute_Max_Advance( T1_Face face, + FT_Int* max_advance ) + { + FT_Error error; + T1_Decoder decoder; + FT_Int glyph_index; + T1_Font* type1 = &face->type1; + PSAux_Interface* psaux = (PSAux_Interface*)face->psaux; + + + *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, + 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; + + /* 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 ); + /* ignore the error if one occured - skip to next glyph */ + } + + *max_advance = decoder.builder.advance.x; + return FT_Err_Ok; + } + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /********** *********/ + /********** UNHINTED GLYPH LOADER *********/ + /********** *********/ + /********** The following code is in charge of loading a *********/ + /********** single outline. It completely ignores hinting *********/ + /********** and is used when FT_LOAD_NO_HINTING is set. *********/ + /********** *********/ + /********** The Type 1 hinter is located in `t1hint.c' *********/ + /********** *********/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + FT_LOCAL_DEF + FT_Error T1_Load_Glyph( T1_GlyphSlot glyph, + T1_Size size, + FT_Int glyph_index, + FT_Int load_flags ) + { + FT_Error error; + T1_Decoder decoder; + T1_Face face = (T1_Face)glyph->root.face; + FT_Bool hinting; + T1_Font* type1 = &face->type1; + PSAux_Interface* psaux = (PSAux_Interface*)face->psaux; + const T1_Decoder_Funcs* decoder_funcs = psaux->t1_decoder_funcs; + + FT_Matrix font_matrix; + FT_Vector font_offset; + + 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 = ( 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, + T1_Parse_Glyph ); + if ( error ) + goto Exit; + + decoder.builder.no_recurse = ( ( load_flags & FT_LOAD_NO_RECURSE ) != 0 ); + + decoder.num_subrs = type1->num_subrs; + decoder.subrs = type1->subrs; + decoder.subrs_len = type1->subrs_len; + + + /* now load the unscaled outline */ + error = T1_Parse_Glyph( &decoder, glyph_index ); + if ( error ) + goto Exit; + + font_matrix = decoder.font_matrix; + font_offset = decoder.font_offset; + + /* save new glyph tables */ + 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 */ + 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; + + + /* 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 metrics */ + metrics->vertBearingX = 0; + metrics->vertBearingY = 0; + metrics->vertAdvance = 0; + + glyph->root.linearVertAdvance = 0; + + glyph->root.format = ft_glyph_format_outline; + + if ( size && size->root.metrics.y_ppem < 24 ) + glyph->root.outline.flags |= ft_outline_high_precision; + + /* apply the font matrix */ + FT_Outline_Transform( &glyph->root.outline, &font_matrix ); + + FT_Outline_Translate( &glyph->root.outline, + font_offset.x, + font_offset.y ); + +#if 0 + + glyph->root.outline.second_pass = TRUE; + glyph->root.outline.high_precision = size->root.metrics.y_ppem < 24; + glyph->root.outline.dropout_mode = 2; + +#endif /* 0 */ + + 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 */ + 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 ); + } + + FT_Outline_Get_CBox( &glyph->root.outline, &cbox ); + + /* Then scale the metrics */ + metrics->horiAdvance = FT_MulFix( metrics->horiAdvance, x_scale ); + metrics->vertAdvance = FT_MulFix( metrics->vertAdvance, y_scale ); + + metrics->vertBearingX = FT_MulFix( metrics->vertBearingX, x_scale ); + metrics->vertBearingY = FT_MulFix( metrics->vertBearingY, y_scale ); + } + + /* compute the other metrics */ + FT_Outline_Get_CBox( &glyph->root.outline, &cbox ); + + /* grid fit the bounding box if necessary */ + if ( hinting ) + { + cbox.xMin &= -64; + cbox.yMin &= -64; + cbox.xMax = ( cbox.xMax+63 ) & -64; + cbox.yMax = ( cbox.yMax+63 ) & -64; + } + + metrics->width = cbox.xMax - cbox.xMin; + metrics->height = cbox.yMax - cbox.yMin; + + metrics->horiBearingX = cbox.xMin; + metrics->horiBearingY = cbox.yMax; + } + } + + Exit: + return error; + } + + +/* END */ Index: xc/extras/freetype2/src/type1/t1gload.h diff -u /dev/null xc/extras/freetype2/src/type1/t1gload.h:1.1.1.1 --- /dev/null Mon Dec 18 14:22:42 2000 +++ xc/extras/freetype2/src/type1/t1gload.h Fri Dec 8 16:26:27 2000 @@ -0,0 +1,58 @@ +/***************************************************************************/ +/* */ +/* t1gload.h */ +/* */ +/* Type 1 Glyph Loader (specification). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#ifndef T1GLOAD_H +#define T1GLOAD_H + + +#ifdef FT_FLAT_COMPILE + +#include "t1objs.h" + +#else + +#include + +#endif + + +#ifdef __cplusplus + extern "C" { +#endif + + + FT_LOCAL + FT_Error T1_Compute_Max_Advance( T1_Face face, + FT_Int* max_advance ); + + FT_LOCAL + FT_Error T1_Load_Glyph( T1_GlyphSlot glyph, + T1_Size size, + FT_Int glyph_index, + FT_Int load_flags ); + + +#ifdef __cplusplus + } +#endif + + +#endif /* T1GLOAD_H */ + + +/* END */ Index: xc/extras/freetype2/src/type1/t1load.c diff -u /dev/null xc/extras/freetype2/src/type1/t1load.c:1.1.1.1 --- /dev/null Mon Dec 18 14:22:42 2000 +++ xc/extras/freetype2/src/type1/t1load.c Fri Dec 8 16:26:27 2000 @@ -0,0 +1,1702 @@ +/***************************************************************************/ +/* */ +/* t1load.c */ +/* */ +/* Type 1 font loader (body). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* 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 to generate a table of keywords (with */ + /* pointers to the associated callback). */ + /* */ + /* 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 +#include + +#include +#include + + +#ifdef FT_FLAT_COMPILE + +#include "t1load.h" + +#else + +#include + +#endif + + +#include /* for strncmp(), strcmp() */ +#include /* for isalnum() */ + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an 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 ) + { + T1_Blend* blend; + FT_Memory memory = face->root.memory; + FT_Error error = 0; + + + blend = face->blend; + if ( !blend ) + { + if ( ALLOC( blend, sizeof ( *blend ) ) ) + goto Exit; + + 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 ( ALLOC_ARRAY( blend->font_infos[1], num_designs, T1_FontInfo ) || + ALLOC_ARRAY( blend->privates[1], num_designs, T1_Private ) || + ALLOC_ARRAY( blend->weight_vector, num_designs * 2, FT_Fixed ) ) + 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; + + 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->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 ( ALLOC_ARRAY( blend->design_pos[0], + num_designs * num_axis, FT_Fixed ) ) + 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 = -1; + goto Exit; + } + + + FT_LOCAL_DEF + FT_Error T1_Get_Multi_Master( T1_Face face, + FT_Multi_Master* master ) + { + T1_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; + T1_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 = 0; + } + return error; + } + + + FT_LOCAL_DEF + FT_Error T1_Set_MM_Blend( T1_Face face, + FT_UInt num_coords, + FT_Fixed* coords ) + { + T1_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 = FT_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 = FT_Err_Ok; + } + return error; + } + + + FT_LOCAL_DEF + FT_Error T1_Set_MM_Design( T1_Face face, + FT_UInt num_coords, + FT_Long* coords ) + { + T1_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; + T1_DesignMap* map = blend->design_map + n; + FT_Fixed* 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_Fixed 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 needed */ + 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; + } + + + FT_LOCAL_DEF + void T1_Done_Blend( T1_Face face ) + { + FT_Memory memory = face->root.memory; + T1_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 */ + FREE( blend->design_pos[0] ); + for ( n = 1; n < num_designs; n++ ) + blend->design_pos[n] = 0; + + /* release blend `private' and `font info' dictionaries */ + FREE( blend->privates[1] ); + FREE( blend->font_infos[1] ); + + for ( n = 0; n < num_designs; n++ ) + { + blend->privates [n] = 0; + blend->font_infos[n] = 0; + } + + /* release weight vectors */ + FREE( blend->weight_vector ); + blend->default_weight_vector = 0; + + /* release axis names */ + for ( n = 0; n < num_axis; n++ ) + FREE( blend->axis_names[n] ); + + /* release design map */ + for ( n = 0; n < num_axis; n++ ) + { + T1_DesignMap* dmap = blend->design_map + n; + + + FREE( dmap->design_points ); + dmap->num_points = 0; + } + + FREE( face->blend ); + } + } + + + static + void parse_blend_axis_types( T1_Face face, + T1_Loader* loader ) + { + T1_Token axis_tokens[ T1_MAX_MM_AXIS ]; + FT_Int n, num_axis; + FT_Error error = 0; + T1_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 || 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_Int 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 ( ALLOC( blend->axis_names[n], len + 1 ) ) + goto Exit; + + name = (FT_Byte*)blend->axis_names[n]; + 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_Token design_tokens[ T1_MAX_MM_DESIGNS ]; + FT_Int num_designs; + FT_Int num_axis; + T1_ParserRec* parser = &loader->parser; + + FT_Error error = 0; + T1_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 || 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_UInt n; + + + blend = face->blend; + num_axis = 0; /* make compiler happy */ + + for ( n = 0; n < (FT_UInt)num_designs; n++ ) + { + T1_Token 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 - 1; + parser->root.limit = token->limit + 1; + 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 = 0; + T1_ParserRec* parser = &loader->parser; + T1_Blend* blend; + T1_Token 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 || 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++ ) + { + T1_DesignMap* map = blend->design_map + n; + T1_Token* token; + FT_Int p, num_points; + + + token = axis_tokens + n; + parser->root.cursor = token->start; + parser->root.limit = token->limit; + + /* count the number of map points */ + { + FT_Byte* ptr = token->start; + FT_Byte* limit = token->limit; + + + num_points = 0; + for ( ; ptr < limit; ptr++ ) + if ( ptr[0] == '[' ) + 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 ( ALLOC_ARRAY( map->design_points, num_points * 2, FT_Fixed ) ) + goto Exit; + map->blend_points = map->design_points + num_points; + map->num_points = (FT_Byte)num_points; + + for ( p = 0; p < num_points; p++ ) + { + 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 ) + { + FT_Error error = 0; + T1_ParserRec* parser = &loader->parser; + T1_Blend* blend = face->blend; + T1_Token master; + FT_UInt n; + FT_Byte* old_cursor; + FT_Byte* old_limit; + + + if ( !blend || blend->num_designs == 0 ) + { + FT_ERROR(( "parse_weight_vector: too early!\n" )); + error = T1_Err_Invalid_File_Format; + goto Exit; + } + + T1_ToToken( parser, &master ); + if ( master.type != t1_token_array ) + { + FT_ERROR(( "parse_weight_vector: incorrect format!\n" )); + error = T1_Err_Invalid_File_Format; + goto Exit; + } + + old_cursor = parser->root.cursor; + old_limit = parser->root.limit; + + parser->root.cursor = master.start; + parser->root.limit = master.limit; + + for ( n = 0; n < blend->num_designs; n++ ) + { + 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; + } + + + /* the keyword `/shareddict' appears in some multiple master fonts */ + /* with a lot of Postscript garbage behind it (that's completely out */ + /* of spec!); we detect it and terminate the parsing */ + /* */ + static + void parse_shared_dict( T1_Face face, + T1_Loader* loader ) + { + T1_ParserRec* parser = &loader->parser; + + FT_UNUSED( face ); + + + parser->root.cursor = parser->root.limit; + parser->root.error = 0; + } + +#endif /* T1_CONFIG_OPTION_NO_MM_SUPPORT */ + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** TYPE 1 SYMBOL PARSING *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* First of all, define the token field static variables. This is a set */ + /* of T1_Field variables used later. */ + /* */ + /*************************************************************************/ + + + static + FT_Error t1_load_keyword( T1_Face face, + T1_Loader* loader, + T1_Field* field ) + { + FT_Error error; + void* dummy_object; + void** objects; + FT_UInt max_objects; + T1_Blend* blend = face->blend; + + + /* if the keyword has a dedicated callback, call it */ + if ( field->type == t1_field_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_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_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; + + default: + dummy_object = &face->type1; + objects = &dummy_object; + max_objects = 0; + } + + if ( field->type == t1_field_integer_array || + field->type == t1_field_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 + int is_space( FT_Byte c ) + { + return ( c == ' ' || c == '\t' || c == '\r' || c == '\n' ); + } + + + static + int is_alpha( FT_Byte c ) + { + return ( isalnum( c ) || c == '.' || c == '_' ); + } + + + + static + int read_binary_data( T1_ParserRec* parser, + FT_Int* size, + FT_Byte** base ) + { + FT_Byte* cur; + FT_Byte* limit = parser->root.limit; + + + /* the binary data has the following format */ + /* */ + /* `size' [white*] RD white ....... ND */ + /* */ + + T1_Skip_Spaces( parser ); + cur = parser->root.cursor; + + if ( cur < limit && (FT_Byte)( *cur - '0' ) < 10 ) + { + *size = T1_ToInt( parser ); + + T1_Skip_Spaces( parser ); + T1_Skip_Alpha ( 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 1; + } + + FT_ERROR(( "read_binary_data: invalid size field\n" )); + parser->root.error = T1_Err_Invalid_File_Format; + return 0; + } + + + /* we will now define the routines used to handle */ + /* the `/Encoding', `/Subrs', and `/CharStrings' */ + /* dictionaries */ + + static + void parse_font_name( T1_Face face, + T1_Loader* loader ) + { + T1_ParserRec* parser = &loader->parser; + FT_Error error; + FT_Memory memory = parser->root.memory; + FT_Int len; + FT_Byte* cur; + FT_Byte* cur2; + FT_Byte* limit; + + + T1_Skip_Spaces( parser ); + + cur = parser->root.cursor; + limit = parser->root.limit; + + if ( cur >= limit - 1 || *cur != '/' ) + return; + + cur++; + cur2 = cur; + while ( cur2 < limit && is_alpha( *cur2 ) ) + cur2++; + + len = cur2 - cur; + if ( len > 0 ) + { + if ( ALLOC( face->type1.font_name, len + 1 ) ) + { + parser->root.error = error; + return; + } + + MEM_Copy( face->type1.font_name, cur, len ); + face->type1.font_name[len] = '\0'; + } + parser->root.cursor = cur2; + } + + + static + void parse_font_bbox( T1_Face face, + T1_Loader* loader ) + { + T1_ParserRec* parser = &loader->parser; + FT_Short temp[4]; + FT_BBox* bbox = &face->type1.font_bbox; + + + (void)T1_ToCoordArray( parser, 4, temp ); + bbox->xMin = temp[0]; + bbox->yMin = temp[1]; + bbox->xMax = temp[2]; + bbox->yMax = temp[3]; + } + + + static + void parse_font_matrix( T1_Face face, + T1_Loader* loader ) + { + T1_ParserRec* parser = &loader->parser; + FT_Matrix* matrix = &face->type1.font_matrix; + FT_Vector* offset = &face->type1.font_offset; + FT_Fixed temp[6]; + + + if ( matrix->xx || matrix->yx ) + /* with synthetic fonts, it's possible we get here twice */ + return; + + (void)T1_ToFixedArray( parser, 6, temp, 3 ); + + /* we need to scale the values by 1.0/temp[3] */ + if ( temp[3] != 0x10000L ) + { + temp[0] = FT_DivFix( temp[0], temp[3] ); + temp[1] = FT_DivFix( temp[1], temp[3] ); + temp[2] = FT_DivFix( temp[2], temp[3] ); + temp[4] = FT_DivFix( temp[4], temp[3] ); + temp[5] = FT_DivFix( temp[5], temp[3] ); + 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_ParserRec* parser = &loader->parser; + FT_Byte* cur = parser->root.cursor; + FT_Byte* limit = parser->root.limit; + + PSAux_Interface* psaux = (PSAux_Interface*)face->psaux; + + + /* skip whitespace */ + while ( is_space( *cur ) ) + { + cur++; + 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, then the encoding is an array, */ + /* and we must load it now */ + if ( (FT_Byte)( *cur - '0' ) < 10 ) + { + 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; + + + /* read the number of entries in the encoding, should be 256 */ + count = T1_ToInt( parser ); + if ( parser->root.error ) + return; + + /* we use a T1_Table to store our charnames */ + encode->num_chars = count; + if ( ALLOC_ARRAY( encode->char_index, count, FT_Short ) || + ALLOC_ARRAY( encode->char_name, count, FT_String* ) || + ( error = psaux->ps_table_funcs->init( + char_table, count, memory ) ) != 0 ) + { + 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 will need to read a record 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. */ + /* */ + /* We stop when we encounter a `def'. */ + + cur = parser->root.cursor; + limit = parser->root.limit; + n = 0; + + for ( ; cur < limit; ) + { + FT_Byte c; + + + c = *cur; + + /* we stop when we encounter a `def' */ + if ( c == 'd' && cur + 3 < limit ) + { + if ( cur[1] == 'e' && + cur[2] == 'f' && + is_space(cur[-1]) && + is_space(cur[3]) ) + { + FT_TRACE6(( "encoding end\n" )); + break; + } + } + + /* otherwise, we must find a number before anything else */ + if ( (FT_Byte)( c - '0' ) < 10 ) + { + FT_Int charcode; + + + parser->root.cursor = cur; + charcode = T1_ToInt( parser ); + cur = parser->root.cursor; + + /* skip whitespace */ + while ( cur < limit && is_space( *cur ) ) + cur++; + + if ( cur < limit && *cur == '/' ) + { + /* bingo, we have an immediate name -- it must be a */ + /* character name */ + FT_Byte* cur2 = cur + 1; + FT_Int len; + + + while ( cur2 < limit && is_alpha( *cur2 ) ) + cur2++; + + len = cur2 - cur - 1; + + parser->root.error = T1_Add_Table( char_table, charcode, + cur + 1, len + 1 ); + char_table->elements[charcode][len] = '\0'; + if ( parser->root.error ) + return; + + cur = cur2; + } + } + else + cur++; + } + + face->type1.encoding_type = t1_encoding_array; + parser->root.cursor = cur; + } + /* Otherwise, we should have either `StandardEncoding' or */ + /* `ExpertEncoding' */ + else + { + if ( cur + 17 < limit && + strncmp( (const char*)cur, "StandardEncoding", 16 ) == 0 ) + face->type1.encoding_type = t1_encoding_standard; + + else if ( cur + 15 < limit && + strncmp( (const char*)cur, "ExpertEncoding", 14 ) == 0 ) + face->type1.encoding_type = t1_encoding_expert; + + else + { + FT_ERROR(( "parse_encoding: invalid token!\n" )); + parser->root.error = T1_Err_Invalid_File_Format; + } + } + } + + + static + void parse_subrs( T1_Face face, + T1_Loader* loader ) + { + T1_ParserRec* parser = &loader->parser; + PS_Table* table = &loader->subrs; + FT_Memory memory = parser->root.memory; + FT_Error error; + FT_Int n; + + PSAux_Interface* psaux = (PSAux_Interface*)face->psaux; + + + loader->num_subrs = T1_ToInt( parser ); + if ( parser->root.error ) + return; + + /* position the parser right before the `dup' of the first subr */ + T1_Skip_Spaces( parser ); + T1_Skip_Alpha( parser ); /* `array' */ + T1_Skip_Spaces( parser ); + + /* initialize subrs array */ + error = psaux->ps_table_funcs->init( table, loader->num_subrs, memory ); + if ( error ) + goto Fail; + + /* the format is simple: */ + /* */ + /* `index' + binary data */ + /* */ + + for ( n = 0; n < loader->num_subrs; n++ ) + { + FT_Int index, 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 ( strncmp( (char*)parser->root.cursor, "dup", 3 ) != 0 ) + break; + + index = 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_Spaces( parser ); + T1_Skip_Alpha( parser ); /* `NP' or `I' or `noaccess' */ + T1_Skip_Spaces( parser ); + + if ( strncmp( (char*)parser->root.cursor, "put", 3 ) == 0 ) + { + T1_Skip_Alpha( parser ); /* skip `put' */ + T1_Skip_Spaces( parser ); + } + + /* 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 ) + { + psaux->t1_decrypt( base, size, 4330 ); + size -= face->type1.private_dict.lenIV; + base += face->type1.private_dict.lenIV; + } + + error = T1_Add_Table( table, index, base, size ); + if ( error ) + goto Fail; + } + return; + + Fail: + parser->root.error = error; + } + + + static + void parse_charstrings( T1_Face face, + T1_Loader* loader ) + { + T1_ParserRec* parser = &loader->parser; + PS_Table* code_table = &loader->charstrings; + PS_Table* name_table = &loader->glyph_names; + FT_Memory memory = parser->root.memory; + FT_Error error; + + PSAux_Interface* psaux = (PSAux_Interface*)face->psaux; + + FT_Byte* cur; + FT_Byte* limit = parser->root.limit; + FT_Int n; + FT_UInt notdef_index = 0; + FT_Byte notdef_found = 0; + + + if ( loader->num_glyphs ) + /* with synthetic fonts, it's possible we get here twice */ + return; + + loader->num_glyphs = T1_ToInt( parser ); + if ( parser->root.error ) + return; + + /* initialize tables, adding space for `swap' at table end */ + error = psaux->ps_table_funcs->init( code_table, + loader->num_glyphs + 1, + memory ); + if ( error ) + goto Fail; + + error = psaux->ps_table_funcs->init( name_table, + loader->num_glyphs + 1, + memory ); + if ( error ) + goto Fail; + + n = 0; + for (;;) + { + FT_Int size; + FT_Byte* base; + + + /* the format is simple: */ + /* `/glyphname' + binary data */ + /* */ + /* note that we stop when we find a `def' */ + /* */ + T1_Skip_Spaces( parser ); + + cur = parser->root.cursor; + if ( cur >= limit ) + break; + + /* we stop when we find a `def' or `end' keyword */ + if ( *cur == 'd' && + cur + 3 < limit && + cur[1] == 'e' && + cur[2] == 'f' ) + break; + + if ( *cur == 'e' && + cur + 3 < limit && + cur[1] == 'n' && + cur[2] == 'd' ) + break; + + if ( *cur != '/' ) + T1_Skip_Alpha( parser ); + else + { + FT_Byte* cur2 = cur + 1; + FT_Int len; + + + while ( cur2 < limit && is_alpha( *cur2 ) ) + cur2++; + len = cur2 - cur - 1; + + error = T1_Add_Table( name_table, n, cur + 1, 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 ( strcmp( (const char*)".notdef", + (const char*)(name_table->elements[n]) ) == 0 ) + { + notdef_index = n; + notdef_found = 1; + } + + parser->root.cursor = cur2; + if ( !read_binary_data( parser, &size, &base ) ) + return; + + if ( face->type1.private_dict.lenIV >= 0 ) + { + psaux->t1_decrypt( base, size, 4330 ); + size -= face->type1.private_dict.lenIV; + base += face->type1.private_dict.lenIV; + } + + error = T1_Add_Table( code_table, n, base, size ); + if ( error ) + goto Fail; + + n++; + if ( n >= loader->num_glyphs ) + break; + } + } + + loader->num_glyphs = n; + + /* if /.notdef is found but does not occupy index 0, do our magic. */ + if ( 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/code to end of table. Then place notdef_index name/code into */ + /* index 0. Then take end of table name/code and place it into index */ + /* notdef_index. */ + + error = T1_Add_Table( name_table, n, + name_table->elements[0], + name_table->lengths [0] ); + if ( error ) + goto Fail; + error = T1_Add_Table( code_table, n, + code_table->elements[0], + code_table->lengths [0] ); + if ( error ) + goto Fail; + + error = T1_Add_Table( name_table, 0, + name_table->elements[notdef_index], + name_table->lengths [notdef_index] ); + if ( error ) + goto Fail; + + error = T1_Add_Table( code_table, 0, + code_table->elements[notdef_index], + code_table->lengths [notdef_index] ); + if ( error ) + goto Fail; + + error = T1_Add_Table( name_table, notdef_index, + name_table->elements[n], + name_table->lengths [n] ); + if ( error ) + goto Fail; + + error = T1_Add_Table( code_table, notdef_index, + code_table->elements[n], + code_table->lengths [n] ); + 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( name_table, n, + name_table->elements[0], + name_table->lengths [0] ); + if ( error ) + goto Fail; + + error = T1_Add_Table( code_table, n, + 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; + + /* we added a glyph. */ + loader->num_glyphs = n + 1; + + } + + return; + + Fail: + parser->root.error = error; + } + + + static + const T1_Field t1_keywords[] = + { + +#ifdef FT_FLAT_COMPILE + +#include "t1tokens.h" + +#else + +#include + +#endif + + /* now add the special functions... */ + T1_FIELD_CALLBACK( "FontName", parse_font_name ) + T1_FIELD_CALLBACK( "FontBBox", parse_font_bbox ) + T1_FIELD_CALLBACK( "FontMatrix", parse_font_matrix ) + T1_FIELD_CALLBACK( "Encoding", parse_encoding ) + T1_FIELD_CALLBACK( "Subrs", parse_subrs ) + T1_FIELD_CALLBACK( "CharStrings", parse_charstrings ) + +#ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT + T1_FIELD_CALLBACK( "BlendDesignPositions", parse_blend_design_positions ) + T1_FIELD_CALLBACK( "BlendDesignMap", parse_blend_design_map ) + T1_FIELD_CALLBACK( "BlendAxisTypes", parse_blend_axis_types ) + T1_FIELD_CALLBACK( "WeightVector", parse_weight_vector ) + T1_FIELD_CALLBACK( "shareddict", parse_shared_dict ) +#endif + + { 0, t1_field_cid_info, t1_field_none, 0, 0, 0, 0, 0 } + }; + + + static + FT_Error parse_dict( T1_Face face, + T1_Loader* loader, + FT_Byte* base, + FT_Long size ) + { + T1_ParserRec* parser = &loader->parser; + + + parser->root.cursor = base; + parser->root.limit = base + size; + parser->root.error = 0; + + { + FT_Byte* cur = base; + FT_Byte* limit = cur + size; + + + for ( ; cur < limit; cur++ ) + { + /* look for `FontDirectory', which causes problems on some fonts */ + if ( *cur == 'F' && cur + 25 < limit && + strncmp( (char*)cur, "FontDirectory", 13 ) == 0 ) + { + FT_Byte* cur2; + + + /* skip the `FontDirectory' keyword */ + cur += 13; + cur2 = cur; + + /* lookup the `known' keyword */ + while ( cur < limit && *cur != 'k' && + strncmp( (char*)cur, "known", 5 ) ) + cur++; + + if ( cur < limit ) + { + T1_Token token; + + + /* skip the `known' keyword and the token following it */ + cur += 5; + loader->parser.root.cursor = cur; + T1_ToToken( &loader->parser, &token ); + + /* if the last token was an array, skip it! */ + if ( token.type == t1_token_array ) + cur2 = parser->root.cursor; + } + cur = cur2; + } + /* look for immediates */ + else if ( *cur == '/' && cur + 2 < limit ) + { + FT_Byte* cur2; + FT_Int len; + + + cur++; + cur2 = cur; + while ( cur2 < limit && is_alpha( *cur2 ) ) + cur2++; + + len = cur2 - cur; + if ( len > 0 && len < 22 ) + { + if ( !loader->fontdata ) + { + if ( strncmp( (char*)cur, "FontInfo", 8 ) == 0 ) + loader->fontdata = 1; + } + else + { + /* 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_Int)strlen( (const char*)name ) ) + { + FT_Int 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.cursor = cur2; + T1_Skip_Spaces( parser ); + parser->root.error = t1_load_keyword( face, + loader, + keyword ); + if ( parser->root.error ) + return parser->root.error; + + cur = parser->root.cursor; + break; + } + } + keyword++; + } + } + } + } + } + } + return parser->root.error; + } + + + static + void t1_init_loader( T1_Loader* loader, + T1_Face face ) + { + FT_UNUSED( face ); + + MEM_Set( loader, 0, 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->fontdata = 0; + } + + + static + void t1_done_loader( T1_Loader* loader ) + { + T1_ParserRec* 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->subrs ); + + /* finalize parser */ + T1_Finalize_Parser( parser ); + } + + + FT_LOCAL_DEF + FT_Error T1_Open_Face( T1_Face face ) + { + T1_Loader loader; + T1_ParserRec* parser; + T1_Font* type1 = &face->type1; + FT_Error error; + + PSAux_Interface* psaux = (PSAux_Interface*)face->psaux; + + + t1_init_loader( &loader, face ); + + /* default lenIV */ + type1->private_dict.lenIV = 4; + + 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; + + /* now, propagate the subrs, charstrings, and glyphnames tables */ + /* to the Type1 data */ + type1->num_glyphs = loader.num_glyphs; + + if ( !loader.subrs.init ) + { + FT_ERROR(( "T1_Open_Face: no subrs array in face!\n" )); + error = T1_Err_Invalid_File_Format; + } + + if ( !loader.charstrings.init ) + { + FT_ERROR(( "T1_Open_Face: no charstrings array in face!\n" )); + error = T1_Err_Invalid_File_Format; + } + + 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; + + 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_array ) + { + FT_Int charcode, index, 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 ( index = 0; index < type1->num_glyphs; index++ ) + { + glyph_name = (FT_Byte*)type1->glyph_names[index]; + if ( strcmp( (const char*)char_name, + (const char*)glyph_name ) == 0 ) + { + type1->encoding.char_index[charcode] = index; + type1->encoding.char_name [charcode] = (char*)glyph_name; + + /* Change min/max encoded char only if glyph name is */ + /* not /.notdef */ + if ( 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: + t1_done_loader( &loader ); + return error; + } + + +/* END */ Index: xc/extras/freetype2/src/type1/t1load.h diff -u /dev/null xc/extras/freetype2/src/type1/t1load.h:1.1.1.1 --- /dev/null Mon Dec 18 14:22:42 2000 +++ xc/extras/freetype2/src/type1/t1load.h Fri Dec 8 16:26:27 2000 @@ -0,0 +1,93 @@ +/***************************************************************************/ +/* */ +/* t1load.h */ +/* */ +/* Type 1 font loader (specification). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#ifndef T1LOAD_H +#define T1LOAD_H + +#include +#include +#include + + +#ifdef FT_FLAT_COMPILE + +#include "t1parse.h" + +#else + +#include + +#endif + + +#ifdef __cplusplus + extern "C" { +#endif + + typedef struct T1_Loader_ + { + T1_ParserRec parser; /* parser used to read the stream */ + + FT_Int num_chars; /* number of characters in encoding */ + PS_Table encoding_table; /* PS_Table used to store the */ + /* encoding character names */ + + FT_Int num_glyphs; + PS_Table glyph_names; + PS_Table charstrings; + + FT_Int num_subrs; + PS_Table subrs; + FT_Bool fontdata; + + } T1_Loader; + + + 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 + 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 + void T1_Done_Blend( T1_Face face ); + +#endif /* !T1_CONFIG_OPTION_NO_MM_SUPPORT */ + + +#ifdef __cplusplus + } +#endif + +#endif /* T1LOAD_H */ + + +/* END */ Index: xc/extras/freetype2/src/type1/t1objs.c diff -u /dev/null xc/extras/freetype2/src/type1/t1objs.c:1.1.1.1 --- /dev/null Mon Dec 18 14:22:42 2000 +++ xc/extras/freetype2/src/type1/t1objs.c Fri Dec 8 16:26:27 2000 @@ -0,0 +1,423 @@ +/***************************************************************************/ +/* */ +/* t1objs.c */ +/* */ +/* Type 1 objects manager (body). */ +/* */ +/* 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 +#include + +#include /* strcmp() */ + + +#ifdef FT_FLAT_COMPILE + +#include "t1gload.h" +#include "t1load.h" + +#ifndef T1_CONFIG_OPTION_NO_AFM +#include "t1afm.h" +#endif + +#else + +#include +#include + +#ifndef T1_CONFIG_OPTION_NO_AFM +#include +#endif + +#endif + + +#include +#include + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an 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 + + + /*************************************************************************/ + /* */ + /* FACE FUNCTIONS */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* */ + /* T1_Done_Face */ + /* */ + /* */ + /* The face object destructor. */ + /* */ + /* */ + /* face :: A typeless pointer to the face object to destroy. */ + /* */ + FT_LOCAL_DEF + void T1_Done_Face( T1_Face face ) + { + FT_Memory memory; + T1_Font* type1 = &face->type1; + + + if ( face ) + { + memory = face->root.memory; + +#ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT + /* release multiple masters information */ + T1_Done_Blend( face ); + face->blend = 0; +#endif + + /* release font info strings */ + { + T1_FontInfo* info = &type1->font_info; + + + FREE( info->version ); + FREE( info->notice ); + FREE( info->full_name ); + FREE( info->family_name ); + FREE( info->weight ); + } + + /* release top dictionary */ + FREE( type1->charstrings_len ); + FREE( type1->charstrings ); + FREE( type1->glyph_names ); + + FREE( type1->subrs ); + FREE( type1->subrs_len ); + + FREE( type1->subrs_block ); + FREE( type1->charstrings_block ); + FREE( type1->glyph_names_block ); + + FREE( type1->encoding.char_index ); + FREE( type1->font_name ); + +#ifndef T1_CONFIG_OPTION_NO_AFM + /* release afm data if present */ + if ( face->afm_data ) + T1_Done_AFM( memory, (T1_AFM*)face->afm_data ); +#endif + + /* release unicode map, if any */ + FREE( face->unicode_map.maps ); + face->unicode_map.num_maps = 0; + + face->root.family_name = 0; + face->root.style_name = 0; + } + } + + + /*************************************************************************/ + /* */ + /* */ + /* T1_Init_Face */ + /* */ + /* */ + /* 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_Init_Face( FT_Stream stream, + T1_Face face, + FT_Int face_index, + FT_Int num_params, + FT_Parameter* params ) + { + FT_Error error; + PSNames_Interface* psnames; + PSAux_Interface* psaux; + + FT_UNUSED( num_params ); + FT_UNUSED( params ); + FT_UNUSED( face_index ); + FT_UNUSED( stream ); + + + face->root.num_faces = 1; + + psnames = (PSNames_Interface*)face->psnames; + if ( !psnames ) + { + psnames = (PSNames_Interface*) + FT_Get_Module_Interface( FT_FACE_LIBRARY( face ), "psnames" ); + + face->psnames = psnames; + } + + psaux = (PSAux_Interface*)face->psaux; + if ( !psaux ) + { + psaux = (PSAux_Interface*) + FT_Get_Module_Interface( FT_FACE_LIBRARY( face ), "psaux" ); + + face->psaux = psaux; + } + + /* 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_Init_Face: invalid face index\n" )); + error = T1_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 */ + { + FT_Face root = (FT_Face)&face->root; + + + root->num_glyphs = face->type1.num_glyphs; + root->num_charmaps = 1; + + root->face_index = face_index; + root->face_flags = FT_FACE_FLAG_SCALABLE; + + root->face_flags |= FT_FACE_FLAG_HORIZONTAL; + + root->face_flags |= FT_FACE_FLAG_GLYPH_NAMES; + + if ( face->type1.font_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 = face->type1.font_info.family_name; + if ( root->family_name ) + { + char* full = face->type1.font_info.full_name; + char* family = root->family_name; + + + while ( *family && *full == *family ) + { + family++; + full++; + } + + root->style_name = ( *full == ' ' ? full + 1 + : (char *)"Regular" ); + } + else + { + /* do we have a `/FontName'? */ + if ( face->type1.font_name ) + { + root->family_name = face->type1.font_name; + root->style_name = (char *)"Regular"; + } + } + + /* compute style flags */ + root->style_flags = 0; + if ( face->type1.font_info.italic_angle ) + root->style_flags |= FT_STYLE_FLAG_ITALIC; + if ( face->type1.font_info.weight ) + { + if ( !strcmp( face->type1.font_info.weight, "Bold" ) || + !strcmp( face->type1.font_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 = face->type1.font_bbox; + root->units_per_EM = 1000; + root->ascender = (FT_Short)face->type1.font_bbox.yMax; + root->descender = (FT_Short)face->type1.font_bbox.yMin; + root->height = ( ( root->ascender - root->descender ) * 12 ) / 10; + + /* now compute the maximum advance width */ + + + root->max_advance_width = (FT_Short)face->type1.font_bbox.xMax; + { + FT_Int max_advance; + + + error = T1_Compute_Max_Advance( face, &max_advance ); + + /* in case of error, keep the standard width */ + if ( !error ) + root->max_advance_width = max_advance; + else + error = 0; /* clear error */ + } + + root->max_advance_height = root->height; + + root->underline_position = face->type1.font_info.underline_position; + root->underline_thickness = face->type1.font_info.underline_thickness; + + root->internal->max_points = 0; + root->internal->max_contours = 0; + } + + /* charmap support -- synthetize unicode charmap if possible */ + { + FT_Face root = &face->root; + FT_CharMap charmap = face->charmaprecs; + + + /* synthesize a Unicode charmap if there is support in the `PSNames' */ + /* module */ + if ( psnames ) + { + if ( psnames->unicode_value ) + { + error = psnames->build_unicodes( + root->memory, + face->type1.num_glyphs, + (const char**)face->type1.glyph_names, + &face->unicode_map ); + if ( !error ) + { + root->charmap = charmap; + charmap->face = (FT_Face)face; + charmap->encoding = ft_encoding_unicode; + charmap->platform_id = 3; + charmap->encoding_id = 1; + charmap++; + } + + /* simply clear the error in case of failure (which really) */ + /* means that out of memory or no unicode glyph names */ + error = FT_Err_Ok; + } + } + + /* now, support either the standard, expert, or custom encoding */ + charmap->face = (FT_Face)face; + charmap->platform_id = 7; /* a new platform id for Adobe fonts? */ + + switch ( face->type1.encoding_type ) + { + case t1_encoding_standard: + charmap->encoding = ft_encoding_adobe_standard; + charmap->encoding_id = 0; + break; + + case t1_encoding_expert: + charmap->encoding = ft_encoding_adobe_expert; + charmap->encoding_id = 1; + break; + + default: + charmap->encoding = ft_encoding_adobe_custom; + charmap->encoding_id = 2; + break; + } + + root->charmaps = face->charmaps; + root->num_charmaps = charmap - face->charmaprecs + 1; + face->charmaps[0] = &face->charmaprecs[0]; + face->charmaps[1] = &face->charmaprecs[1]; + } + + Exit: + return error; + } + + + /*************************************************************************/ + /* */ + /* */ + /* T1_Init_Driver */ + /* */ + /* */ + /* 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_Init_Driver( T1_Driver driver ) + { + FT_UNUSED( driver ); + + return T1_Err_Ok; + } + + + /*************************************************************************/ + /* */ + /* */ + /* T1_Done_Driver */ + /* */ + /* */ + /* Finalizes a given Type 1 driver. */ + /* */ + /* */ + /* driver :: A handle to the target Type 1 driver. */ + /* */ + FT_LOCAL + void T1_Done_Driver( T1_Driver driver ) + { + FT_UNUSED( driver ); + } + + +/* END */ Index: xc/extras/freetype2/src/type1/t1objs.h diff -u /dev/null xc/extras/freetype2/src/type1/t1objs.h:1.1.1.1 --- /dev/null Mon Dec 18 14:22:42 2000 +++ xc/extras/freetype2/src/type1/t1objs.h Fri Dec 8 16:26:27 2000 @@ -0,0 +1,161 @@ +/***************************************************************************/ +/* */ +/* t1objs.h */ +/* */ +/* Type 1 objects manager (specification). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#ifndef T1OBJS_H +#define T1OBJS_H + +#include +#include +#include +#include + +#ifdef __cplusplus + extern "C" { +#endif + + /* 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; + FT_Bool valid; + T1_Size_Hints* hints; /* defined in the hinter. This allows */ + /* us to experiment with different */ + /* hinting schemes without having to */ + /* change `t1objs' each time. */ + } T1_SizeRec; + + + /*************************************************************************/ + /* */ + /* */ + /* 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_Glyph_Hints* hints; /* defined in the hinter */ + + } T1_GlyphSlotRec; + + + FT_LOCAL + FT_Error T1_Init_Face( FT_Stream stream, + T1_Face face, + FT_Int face_index, + FT_Int num_params, + FT_Parameter* params ); + + FT_LOCAL + void T1_Done_Face( T1_Face face ); + + FT_LOCAL + FT_Error T1_Init_Driver( T1_Driver driver ); + + FT_LOCAL + void T1_Done_Driver( T1_Driver driver ); + + +#ifdef __cplusplus + } +#endif + +#endif /* T1OBJS_H */ + + +/* END */ Index: xc/extras/freetype2/src/type1/t1parse.c diff -u /dev/null xc/extras/freetype2/src/type1/t1parse.c:1.1.1.1 --- /dev/null Mon Dec 18 14:22:42 2000 +++ xc/extras/freetype2/src/type1/t1parse.c Fri Dec 8 16:26:27 2000 @@ -0,0 +1,470 @@ +/***************************************************************************/ +/* */ +/* t1parse.c */ +/* */ +/* Type 1 parser (body). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* 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 +#include +#include +#include +#include + +#ifdef FT_FLAT_COMPILE + +#include "t1parse.h" + +#else + +#include + +#endif + + +#include /* for strncmp() */ + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an 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 *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + +#define IS_T1_WHITESPACE( c ) ( (c) == ' ' || (c) == '\t' ) +#define IS_T1_LINESPACE( c ) ( (c) == '\r' || (c) == '\n' ) + +#define IS_T1_SPACE( c ) ( IS_T1_WHITESPACE( c ) || IS_T1_LINESPACE( c ) ) + + + typedef struct PFB_Tag_ + { + FT_UShort tag; + FT_Long size; + + } PFB_Tag; + + +#undef FT_STRUCTURE +#define FT_STRUCTURE PFB_Tag + + + static + const FT_Frame_Field pfb_tag_fields[] = + { + FT_FRAME_START( 6 ), + FT_FRAME_USHORT ( tag ), + FT_FRAME_LONG_LE( size ), + FT_FRAME_END + }; + + + static + FT_Error read_pfb_tag( FT_Stream stream, + FT_UShort* tag, + FT_Long* size ) + { + FT_Error error; + PFB_Tag head; + + + *tag = 0; + *size = 0; + if ( !READ_Fields( pfb_tag_fields, &head ) ) + { + if ( head.tag == 0x8001 || head.tag == 0x8002 ) + { + *tag = head.tag; + *size = head.size; + } + } + return error; + } + + + FT_LOCAL_DEF + FT_Error T1_New_Parser( T1_ParserRec* parser, + FT_Stream stream, + FT_Memory memory, + PSAux_Interface* psaux ) + { + FT_Error error; + FT_UShort tag; + FT_Long size; + + + psaux->t1_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; + + /******************************************************************/ + /* */ + /* 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 ( FILE_Seek( 0L ) ) + goto Exit; + + error = read_pfb_tag( stream, &tag, &size ); + if ( error ) + goto Exit; + + if ( tag != 0x8001 ) + { + /* assume that this is a PFA file for now; an error will */ + /* be produced later when more things are checked */ + if ( FILE_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 ( FILE_Skip( size ) ) + goto Exit; + } + else + { + /* read segment in memory */ + if ( ALLOC( parser->base_dict, size ) || + FILE_Read( parser->base_dict, size ) ) + goto Exit; + parser->base_len = size; + } + + /* Now check font format; we must see `%!PS-AdobeFont-1' */ + /* or `%!FontType' */ + { + if ( size <= 16 || + ( strncmp( (const char*)parser->base_dict, + "%!PS-AdobeFont-1", 16 ) && + strncmp( (const char*)parser->base_dict, + "%!FontType", 10 ) ) ) + { + FT_TRACE2(( "[not a Type1 font]\n" )); + error = FT_Err_Unknown_File_Format; + } + else + { + 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 ) + FREE( parser->base_dict ); + + return error; + } + + + FT_LOCAL_DEF + void T1_Finalize_Parser( T1_ParserRec* parser ) + { + FT_Memory memory = parser->root.memory; + + + /* always free the private dictionary */ + FREE( parser->private_dict ); + + /* free the base dictionary only when we have a disk stream */ + if ( !parser->in_memory ) + FREE( parser->base_dict ); + + parser->root.funcs.done( &parser->root ); + } + + + /* return the value of an hexadecimal digit */ + static + int hexa_value( char c ) + { + unsigned int d; + + + d = (unsigned int)( c - '0' ); + if ( d <= 9 ) + return (int)d; + + d = (unsigned int)( c - 'a' ); + if ( d <= 5 ) + return (int)( d + 10 ); + + d = (unsigned int)( c - 'A' ); + if ( d <= 5 ) + return (int)( d + 10 ); + + return -1; + } + + + FT_LOCAL_DEF + FT_Error T1_Get_Private_Dict( T1_ParserRec* parser, + PSAux_Interface* psaux ) + { + FT_Stream stream = parser->stream; + FT_Memory memory = parser->root.memory; + FT_Error error = 0; + 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 = FILE_Pos(); + FT_UShort tag; + + + parser->private_len = 0; + for (;;) + { + error = read_pfb_tag( stream, &tag, &size ); + if ( error ) + goto Fail; + + if ( tag != 0x8002 ) + break; + + parser->private_len += size; + + if ( FILE_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 ( FILE_Seek( start_pos ) || + ALLOC( parser->private_dict, parser->private_len ) ) + goto Fail; + + parser->private_len = 0; + for (;;) + { + error = read_pfb_tag( stream, &tag, &size ); + if ( error || tag != 0x8002 ) + { + error = FT_Err_Ok; + break; + } + + if ( FILE_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; + + + 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' ) + { + cur += 6; /* we skip the newling after the `eexec' */ + + /* XXX: Some fonts use DOS-linefeeds, i.e. \r\n; we need to */ + /* skip the extra \n if we find it */ + if ( cur[0] == '\n' ) + cur++; + + 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; + } + } + + /* 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 */ + + size = parser->base_len - ( cur - parser->base_dict); + + if ( parser->in_memory ) + { + /* note that we allocate one more byte to put a terminating `0' */ + if ( 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 ( ( hexa_value( cur[0] ) | hexa_value( cur[1] ) | + hexa_value( cur[2] ) | hexa_value( cur[3] ) ) < 0 ) + + /* binary encoding -- `simply' copy the private dict */ + MEM_Copy( parser->private_dict, cur, size ); + + else + { + /* ASCII hexadecimal encoding */ + + FT_Byte* write; + FT_Int count; + + + write = parser->private_dict; + count = 0; + + for ( ;cur < limit; cur++ ) + { + int hex1; + + + /* check for newline */ + if ( cur[0] == '\r' || cur[0] == '\n' ) + continue; + + /* exit if we have a non-hexadecimal digit that isn't a newline */ + hex1 = hexa_value( cur[0] ); + if ( hex1 < 0 || cur + 1 >= limit ) + break; + + /* otherwise, store byte */ + *write++ = ( hex1 << 4 ) | hexa_value( cur[1] ); + count++; + cur++; + } + + /* put a safeguard */ + parser->private_len = write - parser->private_dict; + *write++ = 0; + } + } + + /* we now decrypt the encoded binary private dictionary */ + psaux->t1_decrypt( parser->private_dict, parser->private_len, 55665 ); + 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 */ Index: xc/extras/freetype2/src/type1/t1parse.h diff -u /dev/null xc/extras/freetype2/src/type1/t1parse.h:1.1.1.1 --- /dev/null Mon Dec 18 14:22:43 2000 +++ xc/extras/freetype2/src/type1/t1parse.h Fri Dec 8 16:26:27 2000 @@ -0,0 +1,136 @@ +/***************************************************************************/ +/* */ +/* t1parse.h */ +/* */ +/* Type 1 parser (specification). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#ifndef T1PARSE_H +#define T1PARSE_H + +#include +#include + +#ifdef __cplusplus + extern "C" { +#endif + + + /*************************************************************************/ + /* */ + /* */ + /* T1_ParserRec */ + /* */ + /* */ + /* A T1_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_ + { + T1_Parser root; + FT_Stream stream; + + FT_Byte* base_dict; + FT_Int base_len; + + FT_Byte* private_dict; + FT_Int private_len; + + FT_Byte in_pfb; + FT_Byte in_memory; + FT_Byte single_block; + + } T1_ParserRec; + + +#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_Alpha( p ) (p)->root.funcs.skip_alpha ( &(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_ParserRec* parser, + FT_Stream stream, + FT_Memory memory, + PSAux_Interface* psaux ); + + FT_LOCAL + FT_Error T1_Get_Private_Dict( T1_ParserRec* parser, + PSAux_Interface* psaux ); + + FT_LOCAL + void T1_Finalize_Parser( T1_ParserRec* parser ); + + +#ifdef __cplusplus + } +#endif + + +#endif /* T1PARSE_H */ + + +/* END */ Index: xc/extras/freetype2/src/type1/t1tokens.h diff -u /dev/null xc/extras/freetype2/src/type1/t1tokens.h:1.1.1.1 --- /dev/null Mon Dec 18 14:22:43 2000 +++ xc/extras/freetype2/src/type1/t1tokens.h Fri Dec 8 16:26:28 2000 @@ -0,0 +1,73 @@ +/***************************************************************************/ +/* */ +/* t1tokens.h */ +/* */ +/* Type 1 tokenizer (specification). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#undef FT_STRUCTURE +#define FT_STRUCTURE T1_FontInfo +#undef T1CODE +#define T1CODE t1_field_font_info + + T1_FIELD_STRING( "version", version ) + T1_FIELD_STRING( "Notice", notice ) + T1_FIELD_STRING( "FullName", full_name ) + T1_FIELD_STRING( "FamilyName", family_name ) + T1_FIELD_STRING( "Weight", weight ) + + T1_FIELD_NUM ( "ItalicAngle", italic_angle ) + T1_FIELD_BOOL ( "isFixedPitch", is_fixed_pitch ) + T1_FIELD_NUM ( "UnderlinePosition", underline_position ) + T1_FIELD_NUM ( "UnderlineThickness", underline_thickness ) + + +#undef FT_STRUCTURE +#define FT_STRUCTURE T1_Private +#undef T1CODE +#define T1CODE t1_field_private + + T1_FIELD_NUM ( "UniqueID", unique_id ) + T1_FIELD_NUM ( "lenIV", lenIV ) + T1_FIELD_NUM ( "LanguageGroup", language_group ) + T1_FIELD_NUM ( "password", password ) + + T1_FIELD_FIXED ( "BlueScale", blue_scale ) + T1_FIELD_NUM ( "BlueShift", blue_shift ) + T1_FIELD_NUM ( "BlueFuzz", blue_fuzz ) + + T1_FIELD_NUM_TABLE ( "BlueValues", blue_values, 14 ) + T1_FIELD_NUM_TABLE ( "OtherBlues", other_blues, 10 ) + T1_FIELD_NUM_TABLE ( "FamilyBlues", family_blues, 14 ) + T1_FIELD_NUM_TABLE ( "FamilyOtherBlues", family_other_blues, 10 ) + + T1_FIELD_NUM_TABLE2( "StdHW", standard_width, 1 ) + T1_FIELD_NUM_TABLE2( "StdVW", standard_height, 1 ) + T1_FIELD_NUM_TABLE2( "MinFeature", min_feature, 2 ) + + T1_FIELD_NUM_TABLE ( "StemSnapH", snap_widths, 12 ) + T1_FIELD_NUM_TABLE ( "StemSnapV", snap_heights, 12 ) + + +#undef FT_STRUCTURE +#define FT_STRUCTURE T1_Font +#undef T1CODE +#define T1CODE t1_field_font_dict + + T1_FIELD_NUM( "PaintType", paint_type ) + T1_FIELD_NUM( "FontType", font_type ) + T1_FIELD_NUM( "StrokeWidth", stroke_width ) + + +/* END */ Index: xc/extras/freetype2/src/type1/type1.c diff -u /dev/null xc/extras/freetype2/src/type1/type1.c:1.1.1.1 --- /dev/null Mon Dec 18 14:22:43 2000 +++ xc/extras/freetype2/src/type1/type1.c Fri Dec 8 16:26:28 2000 @@ -0,0 +1,49 @@ +/***************************************************************************/ +/* */ +/* type1.c */ +/* */ +/* FreeType Type 1 driver component (body only). */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#define FT_MAKE_OPTION_SINGLE_OBJECT + + +#ifdef FT_FLAT_COMPILE + +#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 + +#else /* FT_FLAT_COMPILE */ + +#include +#include +#include +#include +#include + +#ifndef T1_CONFIG_OPTION_NO_AFM +#include +#endif + +#endif /* FT_FLAT_COMPILE */ + + +/* END */ Index: xc/extras/freetype2/src/winfonts/module.mk diff -u /dev/null xc/extras/freetype2/src/winfonts/module.mk:1.1.1.1 --- /dev/null Mon Dec 18 14:22:43 2000 +++ xc/extras/freetype2/src/winfonts/module.mk Fri Dec 8 16:26:28 2000 @@ -0,0 +1,21 @@ +# +# FreeType 2 Windows FNT/FON module definition +# + + +# 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. + + +make_module_list: add_windows_driver + +add_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) + Index: xc/extras/freetype2/src/winfonts/rules.mk diff -u /dev/null xc/extras/freetype2/src/winfonts/rules.mk:1.1.1.1 --- /dev/null Mon Dec 18 14:22:43 2000 +++ xc/extras/freetype2/src/winfonts/rules.mk Fri Dec 8 16:26:28 2000 @@ -0,0 +1,64 @@ +# +# FreeType 2 Windows FNT/FON driver configuration rules +# + + +# 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. + + +# Windows driver directory +# +FNT_DIR := $(SRC_)winfonts +FNT_DIR_ := $(FNT_DIR)$(SEP) + + +FNT_COMPILE := $(FT_COMPILE) + + +# 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) + + +# 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_)%.$O) +FNT_DRV_OBJ_S := $(OBJ_)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$@ $(FNT_DRV_SRC_S) + + +# Windows driver - multiple objects +# +$(OBJ_)%.$O: $(FNT_DIR_)%.c $(FREETYPE_H) $(FNT_DRV_H) + $(FNT_COMPILE) $T$@ $< + + +# update main driver object lists +# +DRV_OBJS_S += $(FNT_DRV_OBJ_S) +DRV_OBJS_M += $(FNT_DRV_OBJ_M) + +# EOF Index: xc/extras/freetype2/src/winfonts/winfnt.c diff -u /dev/null xc/extras/freetype2/src/winfonts/winfnt.c:1.1.1.1 --- /dev/null Mon Dec 18 14:22:43 2000 +++ xc/extras/freetype2/src/winfonts/winfnt.c Fri Dec 8 16:26:28 2000 @@ -0,0 +1,665 @@ +/***************************************************************************/ +/* */ +/* winfnt.c */ +/* */ +/* FreeType font driver for Windows FNT/FON files */ +/* */ +/* Copyright 1996-2000 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifdef FT_FLAT_COMPILE + +#include "winfnt.h" + +#else + +#include + +#endif + + +#include +#include +#include +#include +#include + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an 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_Header + + 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_Header + + 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 winfnt_header_fields[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE WinFNT_Header + + FT_FRAME_START( 134 ), + 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_USHORT_LE( color_table_offset ), + FT_FRAME_BYTES ( reserved, 4 ), + FT_FRAME_END + }; + + + static + void fnt_done_font( FT_Stream stream, + FNT_Font* font ) + { + if ( font->fnt_frame ) + RELEASE_Frame( font->fnt_frame ); + + font->fnt_size = 0; + font->fnt_frame = 0; + } + + + static + FT_Error fnt_load_font( FT_Stream stream, + FNT_Font* font ) + { + FT_Error error; + WinFNT_Header* header = &font->header; + + + /* first of all, read the FNT header */ + if ( FILE_Seek( font->offset ) || + 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 = FT_Err_Unknown_File_Format; + goto Exit; + } + + if ( header->file_type & 1 ) + { + FT_TRACE2(( "[can't handle vector FNT fonts]\n" )); + error = FT_Err_Unknown_File_Format; + goto Exit; + } + + /* small fixup -- some fonts have the `pixel_width' field set to 0 */ + if ( header->pixel_width == 0 ) + header->pixel_width = header->pixel_height; + + /* this is a FNT file/table, we now extract its frame */ + if ( FILE_Seek( font->offset ) || + EXTRACT_Frame( header->file_size, font->fnt_frame ) ) + goto Exit; + + Exit: + return error; + } + + + static + void fnt_done_fonts( FNT_Face face ) + { + FT_Memory memory = FT_FACE(face)->memory; + FT_Stream stream = FT_FACE(face)->stream; + FNT_Font* cur = face->fonts; + FNT_Font* limit = cur + face->num_fonts; + + + for ( ; cur < limit; cur++ ) + fnt_done_font( stream, cur ); + + FREE( face->fonts ); + face->num_fonts = 0; + } + + + static + FT_Error fnt_get_dll_fonts( FNT_Face face ) + { + FT_Error error; + FT_Stream stream = FT_FACE(face)->stream; + FT_Memory memory = FT_FACE(face)->memory; + WinMZ_Header mz_header; + + + face->fonts = 0; + face->num_fonts = 0; + + /* does it begin with a MZ header? */ + if ( FILE_Seek( 0 ) || + READ_Fields( winmz_header_fields, &mz_header ) ) + goto Exit; + + error = FT_Err_Unknown_File_Format; + if ( mz_header.magic == WINFNT_MZ_MAGIC ) + { + /* yes, now look for a NE header in the file */ + WinNE_Header ne_header; + + + if ( FILE_Seek( mz_header.lfanew ) || + READ_Fields( winne_header_fields, &ne_header ) ) + goto Exit; + + error = FT_Err_Unknown_File_Format; + if ( ne_header.magic == WINFNT_NE_MAGIC ) + { + /* good, now look in 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; + + + if ( FILE_Seek( res_offset ) || + ACCESS_Frame( ne_header.rname_tab_offset - + ne_header.resource_tab_offset ) ) + goto Exit; + + size_shift = GET_UShortLE(); + + for (;;) + { + FT_UShort type_id, count; + + + type_id = GET_UShortLE(); + if ( !type_id ) + break; + + count = GET_UShortLE(); + + if ( type_id == 0x8008 ) + { + font_count = count; + font_offset = FILE_Pos() + 4 + ( stream->cursor - stream->limit ); + break; + } + + stream->cursor += 4 + count * 12; + } + FORGET_Frame(); + + if ( !font_count || !font_offset ) + { + FT_TRACE2(( "this file doesn't contain any FNT resources!\n" )); + error = FT_Err_Unknown_File_Format; + goto Exit; + } + + if ( FILE_Seek( font_offset ) || + ALLOC_ARRAY( face->fonts, font_count, FNT_Font ) ) + goto Exit; + + face->num_fonts = font_count; + + if ( ACCESS_Frame( (FT_Long)font_count * 12 ) ) + goto Exit; + + /* now read the offset and position of each FNT font */ + { + FNT_Font* cur = face->fonts; + FNT_Font* limit = cur + font_count; + + + for ( ; cur < limit; cur++ ) + { + cur->offset = (FT_ULong)GET_UShortLE() << size_shift; + cur->fnt_size = (FT_ULong)GET_UShortLE() << size_shift; + cur->size_shift = size_shift; + stream->cursor += 8; + } + } + FORGET_Frame(); + + /* finally, try to load each font there */ + { + FNT_Font* cur = face->fonts; + FNT_Font* limit = cur + font_count; + + + for ( ; cur < limit; cur++ ) + { + error = fnt_load_font( stream, cur ); + if ( error ) + goto Fail; + } + } + } + } + + Fail: + if ( error ) + fnt_done_fonts( face ); + + Exit: + return error; + } + + + static + void FNT_Done_Face( FNT_Face face ) + { + FT_Memory memory = FT_FACE_MEMORY( face ); + + + fnt_done_fonts( face ); + + FREE( face->root.available_sizes ); + face->root.num_fixed_sizes = 0; + } + + + static + FT_Error FNT_Init_Face( 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 ); + FT_UNUSED( face_index ); + + + /* try to load several fonts from a DLL */ + error = fnt_get_dll_fonts( face ); + if ( error ) + { + /* this didn't work, now try to load a single FNT font */ + FNT_Font* font; + + if ( ALLOC( face->fonts, sizeof ( *face->fonts ) ) ) + goto Exit; + + face->num_fonts = 1; + font = face->fonts; + + font->offset = 0; + font->fnt_size = stream->size; + + error = fnt_load_font( stream, font ); + if ( error ) + goto Fail; + } + + /* all right, one or more fonts were loaded; we now need to */ + /* fill the root FT_Face fields with relevant information */ + { + FT_Face root = FT_FACE( face ); + FNT_Font* fonts = face->fonts; + FNT_Font* limit = fonts + face->num_fonts; + FNT_Font* cur; + + + root->num_faces = 1; + root->face_flags = FT_FACE_FLAG_FIXED_SIZES | + FT_FACE_FLAG_HORIZONTAL; + + if ( fonts->header.avg_width == fonts->header.max_width ) + root->face_flags |= FT_FACE_FLAG_FIXED_WIDTH; + + if ( fonts->header.italic ) + root->style_flags |= FT_STYLE_FLAG_ITALIC; + + if ( fonts->header.weight >= 800 ) + root->style_flags |= FT_STYLE_FLAG_BOLD; + + /* Setup the `fixed_sizes' array */ + if ( ALLOC_ARRAY( root->available_sizes, face->num_fonts, + FT_Bitmap_Size ) ) + goto Fail; + + root->num_fixed_sizes = face->num_fonts; + + { + FT_Bitmap_Size* size = root->available_sizes; + + + for ( cur = fonts; cur < limit; cur++, size++ ) + { + size->width = cur->header.pixel_width; + size->height = cur->header.pixel_height; + } + } + + /* Setup the `charmaps' array */ + root->charmaps = &face->charmap_handle; + root->num_charmaps = 1; + + face->charmap.encoding = ft_encoding_unicode; + face->charmap.platform_id = 3; + face->charmap.encoding_id = 1; + face->charmap.face = root; + + face->charmap_handle = &face->charmap; + + root->charmap = face->charmap_handle; + + /* setup remaining flags */ + root->num_glyphs = fonts->header.last_char - + fonts->header.first_char + 1; + + root->family_name = (FT_String*)fonts->fnt_frame + + fonts->header.face_name_offset; + 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"; + } + + Fail: + if ( error ) + FNT_Done_Face( face ); + + Exit: + return error; + } + + + static + FT_Error FNT_Set_Pixel_Size( FNT_Size size ) + { + /* look up a font corresponding to the current pixel size */ + FNT_Face face = (FNT_Face)FT_SIZE_FACE( size ); + FNT_Font* cur = face->fonts; + FNT_Font* limit = cur + face->num_fonts; + + + size->font = 0; + for ( ; cur < limit; cur++ ) + { + /* we only compare the character height, as fonts used some strange */ + /* values */ + if ( cur->header.pixel_height == size->root.metrics.y_ppem ) + { + size->font = cur; + + size->root.metrics.ascender = cur->header.ascent * 64; + size->root.metrics.descender = ( cur->header.pixel_height - + cur->header.ascent ) * 64; + size->root.metrics.height = cur->header.pixel_height * 64; + break; + } + } + + return ( size->font ? FT_Err_Ok : FT_Err_Invalid_Pixel_Size ); + } + + + static + FT_UInt FNT_Get_Char_Index( FT_CharMap charmap, + FT_ULong char_code ) + { + FT_UInt result = char_code; + + + if ( charmap ) + { + FNT_Font* font = ((FNT_Face)charmap->face)->fonts; + FT_UInt first = font->header.first_char; + FT_UInt count = font->header.last_char - first + 1; + + + char_code -= first; + if ( char_code < count ) + result = char_code + 1; + else + result = 0; + } + + return result; + } + + + static + FT_Error FNT_Load_Glyph( FT_GlyphSlot slot, + FNT_Size size, + FT_UInt glyph_index, + FT_Int load_flags ) + { + FNT_Font* font = size->font; + FT_Error error = 0; + FT_Byte* p; + FT_Int len; + FT_Bitmap* bitmap = &slot->bitmap; + FT_ULong offset; + FT_Bool new_format; + + FT_UNUSED( slot ); + FT_UNUSED( load_flags ); + + + if ( !font ) + { + error = FT_Err_Invalid_Argument; + goto Exit; + } + + if ( glyph_index > 0 ) + glyph_index--; + else + glyph_index = font->header.default_char - font->header.first_char; + + new_format = font->header.version == 0x300; + len = new_format ? 6 : 4; + + /* jump to glyph entry */ + p = font->fnt_frame + 118 + len * glyph_index; + + bitmap->width = NEXT_ShortLE(p); + + if ( new_format ) + offset = NEXT_ULongLE(p); + else + offset = NEXT_UShortLE(p); + + /* 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 ( ALLOC( 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[0] = p[0]; + } + } + + slot->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.horiAdvance = bitmap->width << 6; + slot->metrics.horiBearingX = 0; + slot->metrics.horiBearingY = slot->bitmap_top << 6; + + slot->linearHoriAdvance = (FT_Fixed)bitmap->width << 16; + + Exit: + return error; + } + + + FT_CALLBACK_TABLE_DEF + const FT_Driver_Class winfnt_driver_class = + { + { + ft_module_font_driver, + sizeof ( FT_DriverRec ), + + "winfonts", + 0x10000L, + 0x20000L, + + 0, + + (FT_Module_Constructor)0, + (FT_Module_Destructor) 0, + (FT_Module_Requester) 0 + }, + + sizeof( FNT_FaceRec ), + sizeof( FNT_SizeRec ), + sizeof( FT_GlyphSlotRec ), + + (FTDriver_initFace) FNT_Init_Face, + (FTDriver_doneFace) FNT_Done_Face, + (FTDriver_initSize) 0, + (FTDriver_doneSize) 0, + (FTDriver_initGlyphSlot)0, + (FTDriver_doneGlyphSlot)0, + + (FTDriver_setCharSizes) FNT_Set_Pixel_Size, + (FTDriver_setPixelSizes)FNT_Set_Pixel_Size, + + (FTDriver_loadGlyph) FNT_Load_Glyph, + (FTDriver_getCharIndex) FNT_Get_Char_Index, + + (FTDriver_getKerning) 0, + (FTDriver_attachFile) 0, + (FTDriver_getAdvances) 0 + }; + + +#ifdef FT_CONFIG_OPTION_DYNAMIC_DRIVERS + + + /*************************************************************************/ + /* */ + /* */ + /* getDriverClass */ + /* */ + /* */ + /* This function is used when compiling the TrueType driver as a */ + /* shared library (`.DLL' or `.so'). It will be used by the */ + /* high-level library of FreeType to retrieve the address of the */ + /* driver's generic interface. */ + /* */ + /* It shouldn't be implemented in a static build, as each driver must */ + /* have the same function as an exported entry point. */ + /* */ + /* */ + /* The address of the TrueType's driver generic interface. The */ + /* format-specific interface can then be retrieved through the method */ + /* interface->get_format_interface. */ + /* */ + FT_EXPORT_DEF( const FT_Driver_Class* ) getDriverClass( void ) + { + return &winfnt_driver_class; + } + + +#endif /* FT_CONFIG_OPTION_DYNAMIC_DRIVERS */ + + +/* END */ Index: xc/extras/freetype2/src/winfonts/winfnt.h diff -u /dev/null xc/extras/freetype2/src/winfonts/winfnt.h:1.1.1.1 --- /dev/null Mon Dec 18 14:22:43 2000 +++ xc/extras/freetype2/src/winfonts/winfnt.h Fri Dec 8 16:26:29 2000 @@ -0,0 +1,41 @@ +/***************************************************************************/ +/* */ +/* winfnt.h */ +/* */ +/* FreeType font driver for Windows FNT/FON files */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#ifndef WINFNT_H +#define WINFNT_H + +#include + + +#ifdef __cplusplus + extern "C" { +#endif + + + FT_EXPORT_VAR( const FT_Driver_Class ) winfnt_driver_class; + + +#ifdef __cplusplus + } +#endif + + +#endif /* WINFNT_H */ + + +/* END */ Index: xc/extras/ogl-sample/README.XF86 diff -u /dev/null xc/extras/ogl-sample/README.XF86:1.2 --- /dev/null Mon Dec 18 14:22:43 2000 +++ xc/extras/ogl-sample/README.XF86 Mon Nov 6 16:57:10 2000 @@ -0,0 +1,14 @@ + +This is an import of selected parts of SGI's ogl-sample distribution, +which is available from their CVS repository at :pserver:cvs@oss.sgi.com/cvs. + +Currently only the GLw components have been imported. Others may be +imported at a later date. + +When importing, use the vendor tag OGL_SAMPLE, and tag OGL_SAMPLE-yyyymmdd, +where yyyymmdd indicates the date of the snapshot from the ogl-sample +CVS repository. + + + +$XFree86: xc/extras/ogl-sample/README.XF86,v 1.2 2000/11/06 21:57:10 dawes Exp $ Index: xc/extras/ogl-sample/main/doc/man/manglw/Distfile diff -u /dev/null xc/extras/ogl-sample/main/doc/man/manglw/Distfile:1.1.1.1 --- /dev/null Mon Dec 18 14:22:43 2000 +++ xc/extras/ogl-sample/main/doc/man/manglw/Distfile Thu Nov 2 14:24:40 2000 @@ -0,0 +1,13 @@ +# +# $Date$ $Revision$ +# $Header: //depot/main/doc/man/manglw/Distfile#4 $ +# + +DISTDIR_SI = /xc/doc/man/GL/glw + +DISTFILES_SI = \ + glwcreatemdrawingarea.3gl \ + glwdrawingarea.3gl \ + glwdrawingareamakecurrent.3gl \ + glwdrawingareaswapbuffers.3gl \ + $(NULL) Index: xc/extras/ogl-sample/main/doc/man/manglw/GNUmakefile diff -u /dev/null xc/extras/ogl-sample/main/doc/man/manglw/GNUmakefile:1.1.1.1 --- /dev/null Mon Dec 18 14:22:43 2000 +++ xc/extras/ogl-sample/main/doc/man/manglw/GNUmakefile Thu Nov 2 14:24:40 2000 @@ -0,0 +1,85 @@ +#!gmake +# +# License Applicability. Except to the extent portions of this file are +# made subject to an alternative license as permitted in the SGI Free +# Software License B, Version 1.1 (the "License"), the contents of this +# file are subject only to the provisions of the License. You may not use +# this file except in compliance with the License. You may obtain a copy +# of the License at Silicon Graphics, Inc., attn: Legal Services, 1600 +# Amphitheatre Parkway, Mountain View, CA 94043-1351, or at: +# +# http://oss.sgi.com/projects/FreeB +# +# Note that, as provided in the License, the Software is distributed on an +# "AS IS" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS +# DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND +# CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A +# PARTICULAR PURPOSE, AND NON-INFRINGEMENT. +# +# Original Code. The Original Code is: OpenGL Sample Implementation, +# Version 1.2.1, released January 26, 2000, developed by Silicon Graphics, +# Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc. +# Copyright in any portions created by third parties is as indicated +# elsewhere herein. All Rights Reserved. +# +# Additional Notice Provisions: The application programming interfaces +# established by SGI in conjunction with the Original Code are The +# OpenGL(R) Graphics System: A Specification (Version 1.2.1), released +# April 1, 1999; The OpenGL(R) Graphics System Utility Library (Version +# 1.3), released November 4, 1998; and OpenGL(R) Graphics with the X +# Window System(R) (Version 1.3), released October 19, 1998. This software +# was created using the OpenGL(R) version 1.2.1 Sample Implementation +# published by SGI, but has not been independently verified as being +# compliant with the OpenGL(R) version 1.2.1 Specification. +# +# $Date$ $Revision$ +# $Header: //depot/main/doc/man/manglw/GNUmakefile#9 $ + +COMMONPREF = standard +include $(ROOT)/usr/include/make/commondefs + +DEPTH = .. +LANGOPT = c +PREFIX = GLw +IDB_PATH = /usr/share/catman/g_man/cat3/glw + +MANPREF = man +include $(DEPTH)/mandefs + +APIFILE = $(ROOT)/usr/include/GL/gl.h + +VERSION = Version 1.0 +DATE = Aug 1998 +MMFLAGS = -rs2 + +LEGALSUF1 = gl# +LEGALSUF2 = gl# +LEGALSUF3 = gl# +LEGALSUF4 = gl# +LEGALSUF5 = gl# + +LOCALPRINTLISTFILTER = | sed -e '/^intro\.p$$/d' | (echo intro.p ; cat ) + +default: + $(MAKE) manpages + +headers headers_install libs libs_install apps: + +distsi: default + $(MAKE) $(COMMONPREF)$@ + +distoss: + $(MAKE) $(COMMONPREF)$@ + +manpages: $(patsubst %.gl,%.3gl,$(wildcard *.gl)) + +install: manpages + for file in *.3gl; do \ + install -D -m 644 $$file ${ROOT}/usr/man/man3/`basename $$file .3gl`.3gl ; \ + done + +clobber: + rm -f *.3gl + +include $(DEPTH)/manrules +include $(COMMONRULES) Index: xc/extras/ogl-sample/main/doc/man/manglw/glwcreatemdrawingarea.gl diff -u /dev/null xc/extras/ogl-sample/main/doc/man/manglw/glwcreatemdrawingarea.gl:1.1.1.1 --- /dev/null Mon Dec 18 14:22:43 2000 +++ xc/extras/ogl-sample/main/doc/man/manglw/glwcreatemdrawingarea.gl Thu Nov 2 14:24:40 2000 @@ -0,0 +1,50 @@ +.\" ** +.\" ** (c) Copyright 1993, 1994, 1995, 1996 Silicon Graphics, Inc. +.\" ** +.\" ** (c) Copyright 1989, 1990, 1991 Open Software Foundation, Inc. +.\" ** All Rights Reserved. +.\" ** +.\" ** (c) Copyright 1987, 1988, 1989, by Hewlett-Packard Company +.\" ** +.\" ** (c) Copyright 1987, 1988 by Digital Equipment Corporation, +.\" ** Maynard, MA. All Rights Reserved. +.\" ** +.\" ** +.TH GLwCreateMDrawingArea 3X "" "" "" "" +.SH NAME +\fBGLwCreateMDrawingArea \(em Create a Motif/OpenGL Drawing Widget.\fP +.iX "GLwCreateMDrawingArea" +.iX "creation functions" +.sp 1 +.SH SYNOPSIS +\fB#include \fP +.br +Widget \fBGLwCreateMDrawingArea\fP( Widget \fIparent\fP, + String \fIname\fP, + ArgList \fIarglist\fP, + Cardinal \fIargcount\fP ) +.fi +\fP +.SH DESCRIPTION +\fBGLwCreateMDrawingArea\fP creates an instance of a GLwMDrawingArea +widget and returns the associated widget ID. +.sp 1 +.IP "\fIparent\fP" .95i +Specifies the parent widget ID +.IP "\fIname\fP" .95i +Specifies the name of the created widget +.IP "\fIarglist\fP" .95i +Specifies the argument list +.IP "\fIargcount\fP" .95i +Specifies the number of attribute/value pairs in the argument list +(\fIarglist\fP) +.sp 1 +.PP +For a complete definition of GLwMDrawingArea and its associated resources, see +\fBGLwDrawingArea(3X)\fP. +.sp 1 +.SH RETURN VALUE +Returns the GLwMDrawingArea widget ID. +.sp 1 +.SH SEE ALSO +\fBGLwDrawingArea(3X)\fP. Index: xc/extras/ogl-sample/main/doc/man/manglw/glwdrawingarea.gl diff -u /dev/null xc/extras/ogl-sample/main/doc/man/manglw/glwdrawingarea.gl:1.1.1.1 --- /dev/null Mon Dec 18 14:22:43 2000 +++ xc/extras/ogl-sample/main/doc/man/manglw/glwdrawingarea.gl Thu Nov 2 14:24:39 2000 @@ -0,0 +1,485 @@ +.\" ** +.\" ** (c) Copyright 1993, 1994, 1995, 1996 Silicon Graphics, Inc. +.\" ** +.\" ** (c) Copyright 1989, 1990, 1991 Open Software Foundation, Inc. +.\" ** All Rights Reserved. +.\" ** +.\" ** (c) Copyright 1987, 1988, 1989, by Hewlett-Packard Company +.\" ** +.\" ** (c) Copyright 1987, 1988 by Digital Equipment Corporation, +.\" ** Maynard, MA. All Rights Reserved. +.\" ** +.\" ** +.TH GLwDrawingArea 3X "" "" "" "" +.SH NAME +\fBGLwDrawingArea, GLwMDrawingArea \(em OpenGL drawing widgets.\fP +.iX "GLwDrawingArea" "GLwMDrawingArea" +.iX "widget class" "OpenGL" "Draw" +.sp 1 +.SH SYNOPSIS +\fB#include +.br +\fBld ... -lGLw -lGL -l -lXext -lXt -lX11 -lm +.sp +\fB#include +.br +\fBld ... -lGLw -lGL -lXm -lXext -lXt -lX11 -lm +.sp 1 +.SH DESCRIPTION +\fBGLwDrawingArea\fP and \fBGLwMDrawingArea\fP are widgets suitable +for OpenGL drawing. They +provide a window with the appropriate visual and colormaps needed for +OpenGL, based on supplied parameters. GLwDrawingArea and +GLwMDrawingArea also provide +callbacks for redraw, resize, input, and initialization. +.PP +GLwDrawingArea is not a part of any widget set, but depends only on Xt. +GLwDrawingArea can be used with any widget set. GLwMDrawingArea +is identical to +GLwDrawingArea except that it is a subclass of the Motif\(Tm widget +class XmPrimitive and +has resources and defaults suitable for use with Motif. For example, +GLwMDrawingArea provides the default Motif background and foreground colors +for resources, and deals better with keyboard traversal. Although the +GLwDrawingArea widget can be used in a Motif program, it is recommended that +GLwMDrawingArea be used instead. +.PP +Since both GLwDrawingArea and GLwMDrawingArea +widgets behave almost identically, the +remainder of this manual page will refer only to GLwDrawingArea, except when +the behaviors differ. Unless explicitly stated, all statements +about GLwDrawingArea also apply to GLwMDrawingArea. +.PP +Among the information provided when creating a GLwDrawingArea is +information necessary to determine the visual. This may be provided +in three ways, all of them through resources. A specific visualInfo +structure may be passed in. (This visualInfo must have been obtained +elsewhere; it is the application designer's responsibility to make +sure that it is compatible with the OpenGL rendering done by the +application). Alternatively, an attribute list may be provided. This +attribute list is formatted identically to that used for direct open +GL programming. Finally, each attribute can be specified as an +individual resource. The latter method is the simplest, and is the +only method that works from resource files. +.PP +In addition to allocating the visual, the GLwDrawingArea will also +allocate the colormap unless one is provided by the application. (If +one is provided it is the application writer's responsibility to +guarantee compatibility between the colormap and the visual). If +an application creates multiple GLwDrawingAreas with the same visual, +the same colormap will be used. (However the colormap +will not be shared among separate applications). +.PP +Creating the widget does not actually create the window until it is +realized, and consequently, the application should not perform any +OpenGL operations +to the window immediately after creation. Instead the application +must wait until after it has realized the window. Alternatively, the +\fBginit\fP callback may be used to indicate when the window has been +created. Upon receiving this callback, the application can perform +all OpenGL initialization for the window, and can subsequently perform +other operations on it. The initialization is discussed in more +detail below. +.PP +Applications select which GLwDrawingArea they are accessing using either +\fBglXMakeCurrent\fP or the convenience function +\fBGLwDrawingAreaMakeCurrent\fP which uses a widget instead of a +display and window. If there is only one GLwDrawingArea this need +only be called once, however if there is more than one GLwDrawingArea +it should be called at the start of each callback. +Callbacks in this case include not only +callbacks provided by the widget itself, but any other callback that +leads to GL activity such as a timeout or a workproc. +.PP +If an application is using double buffering, it may call +\fBGLwDrawingAreaSwapBuffers\fP instead of \fBglXSwapBuffers\fP. This +allows the use of the widget instead of the display and window. +.ne 5 +.SS "GLwDrawingArea Classes" +GLwDrawingArea inherits behavior and resources from the \fBCore\fP class. +.br +The class pointer is \fBglwDrawingAreaWidgetClass\fP. +.br +The class name is \fBGLwDrawingArea\fP. +.PP +.ne 5 +.SS "GLwMDrawingArea Classes" +GLwMDrawingArea inherits behavior and resources from the +\fBXmPrimitive\fP and \fBCore\fP classes. +.br +The class pointer is \fBglwMDrawingAreaWidgetClass\fP. +.br +The class name is \fBGLwMDrawingArea\fP. +.sp 1 +.SS "New Resources" +The following tables define a set of widget resources used by the programmer +to specify data. The programmer can also set the resource values for the +inherited classes to set attributes for this widget. To reference a +resource by name or by class in a .Xdefaults file, remove the \fBGLwN\fP or +\fBGLwC\fP prefix and use the remaining letters. +There are two tables included. The first table includes resources +that correspond directly to the attributes used by \fBglXChooseVisual\fP. +As with \fBglXChooseVisual\fP, all Boolean resources default to FALSE +and all integer resources default to 0, except redSize, greenSize and +blueSize which default to 1. These resources can all be +set only at creation time, and are used to determine the visual. If +either the \fIGLwNattribList\fP or \fIGLwNvisualInfo\fP resource is +set, these resources are ignored. The specific meaning of these +resources is discussed in the \fBglXChooseVisual\fP manual page and +will not be discussed here. +.sp 1 +.ne 18 +.TS +center allbox; +lBp8 lBp8 lBp8 lBp8 +lp8 lp8 lp8 lp8. +Name Class Type OpenGL attribute +GLwNbufferSize GLwCBufferSize int GLX_BUFFER_SIZE +GLwNlevel GLwCLevel int GLX_LEVEL +GLwNrgba GLwCRgba Boolean GLX_RGBA +GLwNdoublebuffer GLwCDoublebuffer Boolean GLX_DOUBLEBUFFER +GLwNstereo GLwCStereo Boolean GLX_STEREO +GLwNauxBuffers GLwCAuxBuffers Boolean GLX_AUX_BUFFERS +GLwNredSize GLwCColorSize int GLX_RED_SIZE +GLwNgreenSize GLwCColorSize int GLX_GREEN_SIZE +GLwNblueSize GLwCColorSize int GLX_BLUE_SIZE +GLwNalphaSize GLwCAlphaSize int GLX_ALPHA_SIZE +GLwNdepthSize GLwCDepthSize int GLX_DEPTH_SIZE +GLwNstencilSize GLwCStencilSize int GLX_STENCIL_SIZE +GLwNaccumRedSize GLwCAccumColorSize int GLX_ACCUM_RED_SIZE +GLwNaccumGreenSize GLwCAccumColorSize int GLX_ACCUM_GREEN_SIZE +GLwNaccumBlueSize GLwCAccumColorSize int GLX_ACCUM_BLUE_SIZE +GLwNaccumAlphaSize GLwCAccumAlphaSize int GLX_ACCUM_ALPHA_SIZE +.TE +.sp 1 +.PP +The following table lists other resources of the GLwDrawingArea +widget. each of these will be described subsequently. +The codes in the access column indicate if the given resource can be +set at creation time (\fBC\fP), +set by using \fBXtSetValues\fP (\fBS\fP), +retrieved by using \fBXtGetValues\fP (\fBG\fP), or is not applicable +(\fBN/A\fP). +.sp 1 +.ne 12 +.TS +center; +lp8B lp8B lp8B lp8B lp8B +lp8 lp8 lp8 lp8 lp8. +Name Class Type Def Acc +_ +GLwNallocateBackground GLwCAllocateColors Boolean F CG +GLwNallocateOtherColors GLwCAllocateColors Boolean F CG +GLwNattribList GLwCAttribList int * NULL CG +GLwNexposeCallback GLwCCallback XtCallbackList NULL C +GLwNginitCallback GLwCCallback XtCallbackList NULL C +GLwNinputCallback GLwCCallback XtCallbackList NULL C +GLwNinstallBackground GLwCInstallBackground Boolean T CG +GLwNinstallColormap GLwCInstallColormap Boolean T CG +GLwNresizeCallback GLwCCallback XtCallbackList NULL C +GLwNvisualInfo GLwCVisualInfo XVisualInfo* NULL CG +.TE +.sp 1 +.IP "\fBGLwNallocateBackground\fP" +If TRUE, the background pixel and pixmap will be allocated if +appropriate using the newly calculated colormap and visual. If FALSE, +they will retain values calculated using the parent's colormap and +visual. Applications which wish to have X clear their background for +them will usually set this to TRUE. Applications clearing their own +background will often set this to FALSE, although they may set this to +TRUE if they query the background for their own use. One reason to +leave this resource FALSE is that if color index mode is in use this +avoid using up a pixel from the newly allocated colormap. Also, on +hardware that supports only one colormap, the application may need to +do more careful color allocation to avoid flashing between the OpenGL +colormap and the default X colormap. +(Note that because of the way Xt works, the background colors +are originally calculated using the default colormap; if this resource +is set they can be recalculated correctly. If a colormap was +explicitly supplied to the widget rather than being dynamically +calculated, these resources are always calculated using that colormap.) +.IP "\fBGLwNallocateOtherColors\fP" +This is similar to \fBGLwNallocateBackground\fP, but allocates other +colors normally allocated by widgets. Although the GLwDrawingArea +and GLwMDrawingArea widget do not make use of these colors the +application may choose to query them. For the non-Motif +GLwDrawingArea widget there are no other colors allocated, so this +resource is a no-op. For the Motif GLwMDrawingArea are widget, the +XmPrimitive resources \fBXmNforeground\fP, \fBXmNhighlightColor\fP, +and \fBXmNhighlightPixmap\fP are calculated. +.IP "\fBGLwNattribList\fP" +Contains the list of attributes suitable for a call to +\fBglXChooseVisual\fP. If this resource is NULL, it is calculated +based on the attribute resources. If it is not NULL, the attribute +resources are ignored. +.IP "\fBGLwNexposeCallback\fP" +Specifies the list of callbacks that is +called when the widget receives an exposure event. +The callback reason is \fBGLwCR_EXPOSE\fP. +The callback structure also includes the exposure event. The +application will generally want to redraw the scene. +.IP "\fBGLwNginitCallback\fP" +Specifies the list of callbacks that is +called when the widget is first realized. Since no OpenGL operations can +be done before the widget is realized, this callback can be used to +perform any appropriate OpenGL initialization such as creating a context. +The callback reason is \fBGLwCR_GINIT\fP. +.IP "\fBGLwNinputCallback\fP" +Specifies the list of callbacks that is +called when the widget receives a keyboard +or mouse event. By default, the input callback is called on each key +press and key release, on each mouse button press and release, and +whenever the mouse is moved while a button is pressed. However this +can be changed by providing a different translation table. +The callback structure also includes the input event. +The callback reason is \fBGLwCR_INPUT\fP. +.IP "" +The input callback is provided as a programming convenience, as it +provides a convenient way to catch all input events. However, a more +modular program can often be obtained by providing specific actions and +translations in the application rather than using a single catch all +callback. Use of explicit translations can also provide for more +customization. +.IP "\fBGLwNinstallBackground\fP" +If set to TRUE, the background is installed on the window. If set to +FALSE, the window has no background. This resource has no effect +unless \fBGLwNallocateBackground\fP is also TRUE. +.IP "\fBGLwNinstallColormap\fP" +If set to TRUE, the widget will call \fIXSetWMColormapWindows\fP to +tell the window manager to install the colormap when the window's +shell has focus. If set to FALSE, this will not be called. For +applications with multiple GLwDrawingAreas sharing a single colormap, +it is most efficient to set this resource to TRUE for exactly one +GLwDrawingArea with each colormap. If an application needs +additional control over the order of colormaps, this resource can be +set to FALSE, with the application calling \fIXSetWMColormapWindows\fP +explicitly. +.IP "\fBGLwNresizeCallback\fP" +Specifies the list of callbacks that is +called when the GLwDrawingArea is resized. +The callback reason is \fBGLwCR_RESIZE\fP. +.IP "\fBGLwNvisualInfo\fP" +Contains a pointer to the window's visual info structure. If NULL, +the visualInfo is calculated at widget creation time based on the +\fIGLwNattributeList\fP resource (which is itself calculated from the +various resources). If \fBGLwNvisualInfo\fP is not NULL the +\fIGLwNattributList\fP and the attribute resources are ignored. +.sp 1 +.SS "Inherited Resources" +Both GLwDrawingArea and GLwMDrawingArea inherit behavior and resources +from the core superclass. Other than the behavior of the colormap and +background resources described previously, all defaults are the same as +for core. +.PP +In addition, the Motif version GLwMDrawingArea also inherits from XmPrimitive. +The behavior of the color resources has been described previously. +The \fITraversalOn\fP resource is disabled for this widget, but if +keyboard input is required it should be enabled. (Also, the +application should call \fBXmProcessTraversal(widget, XmTRAVERSE_CURRENT)\fP +whenever mouse button 1 is clicked in the widget. This is similar to +the requirements of the Motif Drawing area.) Because Motif gets +confused by having multiple visuals in one top level shell, +\fBXmNhighlightOnEnter\fP has been disabled, and +\fBXmNhighlightThickness\fP has been set to 0. +.SS "Callback Information" +A pointer to the following structure is passed to each callback: +.sp 1 +.ne 6 +.nf +.ta .25i 1.3i +\fBtypedef struct\fP +{ + \fBint\fP \fIreason\fP; + \fBXEvent\fP \fI*event\fP; + \fBDimension\fP \fIwidth, height\fP; +} \fBGLwDrawingAreaCallbackStruct\fP; +.fi +.sp 1 +.IP "\fIreason\fP" .75i +Indicates why the callback was invoked. Appropriate values are +stated in the above resource descriptions. For Motif programmers, the +values \fBGLwCR_EXPOSE\fP, \fBGLwCR_RESIZE\fP, and \fBGLwCR_INPUT\fP +are equal to \fBXmCR_EXPOSE\fP, \fBXmCR_RESIZE\fP, and +\fBXmCR_INPUT\fP respectively. \fBGLwCR_GINIT\fP does not have a +Motif equivalent. +.IP "\fIevent\fP" .75i +Points to the \fBXEvent\fP that triggered the callback. +This is NULL for \fBGLwNginitCallback and \fBGLwNresizeCallback\fP. +.IP "\fIwidth\fP and \fIheight\fP" .75i +Are set to the width and height of the window. +.br +.ne 10 +.sp 1 \"Adds space before the SS +.SS "Translations" +GLwDrawingArea has the translations listed below. +\fB +.nf +.ta 1.5i +.ne 5 +: glwInput() +: glwInput() +: glwInput() +: glwInput() +: glwInput() +.fi +.PP +GLwMDrawingArea has the following additional translation: +\fB +.nf +.ta 1.5i +osfHelp: PrimitiveHelp() +.fi +.PP +An application wishing to catch other events than these defaults can +do so by installing a different translation table. +\fP +.sp 1 \"Adds space before the SS +.SS "Action Routines" +The GLwDrawingArea has the following action routine: +.IP "\fBglwInput()\fP:" +Called whenever one of the above translations specifies that input has +occurred. Its sole purpose is to call the input callback. +.sp 1 +.SH INITIALIZATION +.PP +When the widget is initially created (e.g. through +\fBXtCreateWidget(3X)\fP) the associated window is not actually +created. Instead, window creation is delayed until the widget is +realized. However, \fBglXchooseVisual\fP is called immediately, so +information based on its results is available. +.PP +Between the time the widget is created and it is realized, +the following apply: +.TP +\(bu +No OpenGL operations can be done to the window +.TP +\(bu +No resize callbacks are generated. +.TP +\(bu +The normal window is available (XtWindow returns NULL). +.TP +\(bu +\fBGLwDrawingAreaMakeCurrent\fP (and \fBglXMakeCurrent\fP) should not +be called. +.PP +When the widget is realized, the following actions take place: +.PP +.TP +\(bu +The window is created. +.TP +\(bu +The \fBginit\fP callback is called. The user may use this callback to +perform any needed OpenGL initialization to the window. +.sp 1 +.SH NOTES +.PP +When using the input callback to receive keyboard input, the keycode +in the event must be converted to a KeySym. Use +\fBXLookupKeysym(3X)\fP or \fBXLookupString(3X)\fP to do the +conversion. Keyboard input can also be dealt using translations, in +which case no such conversion is required. +.PP +Motif programmers should keep in mind that OSF uses virtual +bindings and replaces some of the key bindings. As a common example, +if the ESC key is to be used to exit the program (as it often is in GL +programs), the translation should specify osfCancel instead of +Escape. +.PP +Motif programmers may also create a GLwMDrawingArea widget with the Motif +style \fBGLwCreateMDrawingArea\fP. +.sp 1 +.ne 10 +.SH EXAMPLE +Here are some code fragments that create a GLwDrawingArea widget, and manage +the appropriate callbacks. +.sp +.nf +\f(CW + #include + #include + static GLXContext glx_context; /* assume only one context */ + . . . + + main() + { + Arg args[10]; + int n; + + Widget parent; /* The parent of the gl widget */ + Widget glw; /* The GLwDrawingArea widget */ + . . . + + /* Create the widget using RGB mode. This can also be set + * in an X Defaults file + */ + n = 0; + XtSetArg(args[n], GLwNrgba, True); n++; + glw = XtCreateManagedWidget("glw", glwDrawingAreaWidgetClass, + parent, args, n); + XtAddCallback(glw, GLwNexposeCallback, exposeCB, NULL); + XtAddCallback(glw, GLwNresizeCallback, resizeCB, NULL); + XtAddCallback(glw, GLwNginitCallback, ginitCB, NULL); + /* Also add input callback if needed */ + . . . + } + + static void + exposeCB(Widget w, XtPointer client_data, + GLwDrawingAreaCallbackStruct *call_data) + { + GLwDrawingAreaMakeCurrent(w, glx_context); + /* redraw the display */ + } + + static void + resizeCB(Widget w, XtPointer client_data, + GLwDrawingAreaCallbackStruct *call_data) + { + GLwDrawingAreaMakeCurrent(w, glx_context); + /* perform any resize actions */ + } + + static void + ginitCB(Widget w, XtPointer client_data, + GLwDrawingAreaCallbackStruct *call_data) + { + Arg args[1]; + XVisualInfo *vi; + + XtSetArg(args[0], GLwNvisualInfo, &vi); + XtGetValues(w, args, 1); + + /* create a visual context */ + glx_context = glXCreateContext(XtDisplay(w), vi, + NULL, GL_FALSE); + GLwDrawingAreaMakeCurrent(w, glx_context); + /* Perform any necessary graphics initialization.*/ + } +\fP +.fi +.P +The Motif program need only differ by including +\fBGLwMDrawingArea.h\fP instead of \fBGLwDrawingArea.h\fP and by creating a widget of type +\fBGLwMDrawingAreaWidgetClass\fP instead of \fBGLwDrawingAreaWidgetClass\fP. As an +alternative, the Motif program could use \fBGLwCreateMDraw(3X)\fP instead. +.sp 1 +.SH WARNINGS +.PP +If a GLwDrawingArea widget is created as a child of an already realized +widget, the GLwDrawingArea widget will be created immediately, without giving +the user an opportunity to add the \fBginit\fP callback. In such a +case, initialization should be done immediately after creating the +widget rather than by using the callback. +.PP +If the non-Motif GLwDrawingArea widget is used in a Motif program and +keyboard traversal is attempted, the behavior is undefined if the user +traverses into the GLwDrawingArea widget. +.SH SEE ALSO +\fBglXChooseVisual(3G)\fP, \fBGLwDrawingAreaMakeCurrent(3X)\fP, +\fBglXMakeCurrent(3G)\fP, \fBGLwDrawingAreaSwapBuffers(3X)\fP +\fBGLwCreateMDraw(3X)\fP, \fBCore(3X)\fP, \fBXmPrimitive(3X)\fP, +\fBVirtualBindings(3X)\fP, \fBXSetWMColormapWindows(3X11)\fP +and the OpenGL spec. Index: xc/extras/ogl-sample/main/doc/man/manglw/glwdrawingareamakecurrent.gl diff -u /dev/null xc/extras/ogl-sample/main/doc/man/manglw/glwdrawingareamakecurrent.gl:1.1.1.1 --- /dev/null Mon Dec 18 14:22:43 2000 +++ xc/extras/ogl-sample/main/doc/man/manglw/glwdrawingareamakecurrent.gl Thu Nov 2 14:24:39 2000 @@ -0,0 +1,30 @@ +.\" ** +.\" ** (c) Copyright 1993, 1994, 1995, 1996 Silicon Graphics, Inc. +.\" ** +.\" ** (c) Copyright 1989, 1990, 1991 Open Software Foundation, Inc. +.\" ** All Rights Reserved. +.\" ** +.\" ** (c) Copyright 1987, 1988, 1989, by Hewlett-Packard Company +.\" ** +.\" ** (c) Copyright 1987, 1988 by Digital Equipment Corporation, +.\" ** Maynard, MA. All Rights Reserved. +.\" ** +.\" ** +.TH GLwDrawingAreaMakeCurrent 3X "" "" "" "" +.SH NAME +\fBGLwDrawingAreaMakeCurrent \(em Make the current GLwDrawingArea current.\fP +.iX "GLwDrawingAreaMakeCurrent" +.iX "GLwDrawingArea" +.sp 1 +.SH SYNOPSIS +\fB#include \fP +.br +void \fBGLwDrawingAreaMakeCurrent\fP( Widget \fIw\fP, + GLXContext \fIctx\fP ) +.fi +.SH DESCRIPTION +\fBGLwDrawingAreaMakeCurrent\fP is a front end to \fBglXMakeCurrent\fP, +however instead of passing in a Display and a Window, a Widget is +passed in. +.SH SEE ALSO +\fBGLwMDrawingArea(3X)\fP, \fBglXMakeCurrent(3G)\fP. Index: xc/extras/ogl-sample/main/doc/man/manglw/glwdrawingareaswapbuffers.gl diff -u /dev/null xc/extras/ogl-sample/main/doc/man/manglw/glwdrawingareaswapbuffers.gl:1.1.1.1 --- /dev/null Mon Dec 18 14:22:43 2000 +++ xc/extras/ogl-sample/main/doc/man/manglw/glwdrawingareaswapbuffers.gl Thu Nov 2 14:24:39 2000 @@ -0,0 +1,30 @@ +.\" ** +.\" ** (c) Copyright 1993, 1994, 1995, 1996 Silicon Graphics, Inc. +.\" ** +.\" ** (c) Copyright 1989, 1990, 1991 Open Software Foundation, Inc. +.\" ** All Rights Reserved. +.\" ** +.\" ** (c) Copyright 1987, 1988, 1989, by Hewlett-Packard Company +.\" ** +.\" ** (c) Copyright 1987, 1988 by Digital Equipment Corporation, +.\" ** Maynard, MA. All Rights Reserved. +.\" ** +.\" ** +.TH GLwDrawingAreaSwapBuffers 3X "" "" "" "" +.SH NAME +\fBGLwDrawingAreaSwapBuffers \(em Swap buffers in a GLwDrawingArea.\fP +.iX "GLwDrawingAreaSwapBuffers" +.iX "GLwDrawingArea" +.sp 1 +.SH SYNOPSIS +\fB#include \fP +.br +void \fBGLwDrawingAreaSwapBuffers\fP( Widget \fIw\fP ) +.br +.fi +.SH DESCRIPTION +\fBGLwDrawingAreaSwapBuffers\fP is a front end to \fBglXSwapBuffers\fP, +however instead of passing in a Display and a Window, a Widget is +passed in. +.SH SEE ALSO +\fBGLwMDrawingArea(3X)\fP, \fBglXSwapBuffers(3G)\fP. Index: xc/extras/ogl-sample/main/gfx/lib/glw/Distfile diff -u /dev/null xc/extras/ogl-sample/main/gfx/lib/glw/Distfile:1.1.1.1 --- /dev/null Mon Dec 18 14:22:44 2000 +++ xc/extras/ogl-sample/main/gfx/lib/glw/Distfile Thu Nov 2 14:18:55 2000 @@ -0,0 +1,15 @@ +# +# $Date$ $Revision$ +# $Header: //depot/main/gfx/lib/glw/Distfile#7 $ +# + +DISTFILES_SI = \ + GLwDrawA.h /xc/include/GL/GLwDrawA.h \ + GLwMDrawA.h /xc/include/GL/GLwMDrawA.h \ + Imakefile /xc/lib/GL/glw/Imakefile \ + GLwDrawAP.h /xc/lib/GL/glw/GLwDrawAP.h \ + GLwMDrawAP.h /xc/lib/GL/glw/GLwMDrawAP.h \ + GLwDAUtil.c /xc/lib/GL/glw/GLwDAUtil.c \ + GLwDrawA.c /xc/lib/GL/glw/GLwDrawA.c \ + GLwMDrawA.c /xc/lib/GL/glw/GLwMDrawA.c \ + $(NULL) Index: xc/extras/ogl-sample/main/gfx/lib/glw/GLwDAUtil.c diff -u /dev/null xc/extras/ogl-sample/main/gfx/lib/glw/GLwDAUtil.c:1.2 --- /dev/null Mon Dec 18 14:22:44 2000 +++ xc/extras/ogl-sample/main/gfx/lib/glw/GLwDAUtil.c Thu Nov 2 15:39:06 2000 @@ -0,0 +1,77 @@ +/* +** License Applicability. Except to the extent portions of this file are +** made subject to an alternative license as permitted in the SGI Free +** Software License B, Version 1.1 (the "License"), the contents of this +** file are subject only to the provisions of the License. You may not use +** this file except in compliance with the License. You may obtain a copy +** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600 +** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at: +** +** http://oss.sgi.com/projects/FreeB +** +** Note that, as provided in the License, the Software is distributed on an +** "AS IS" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS +** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND +** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A +** PARTICULAR PURPOSE, AND NON-INFRINGEMENT. +** +** Original Code. The Original Code is: OpenGL Sample Implementation, +** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics, +** Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc. +** Copyright in any portions created by third parties is as indicated +** elsewhere herein. All Rights Reserved. +** +** Additional Notice Provisions: The application programming interfaces +** established by SGI in conjunction with the Original Code are The +** OpenGL(R) Graphics System: A Specification (Version 1.2.1), released +** April 1, 1999; The OpenGL(R) Graphics System Utility Library (Version +** 1.3), released November 4, 1998; and OpenGL(R) Graphics with the X +** Window System(R) (Version 1.3), released October 19, 1998. This software +** was created using the OpenGL(R) version 1.2.1 Sample Implementation +** published by SGI, but has not been independently verified as being +** compliant with the OpenGL(R) version 1.2.1 Specification. +** +** $Date$ $Revision$ +*/ +/* utility routines for GLX. + * Since these routines are used both in the Motif and X versions of + * the widget, they cannot peek directly into the structure + * + * $Header: //depot/main/gfx/lib/glw/GLwDAUtil.c#5 $ + */ + +/* $XFree86: xc/extras/ogl-sample/main/gfx/lib/glw/GLwDAUtil.c,v 1.2 2000/11/02 20:39:06 dawes Exp $ */ + +#include +#include +#include +#include + +/* + * By default only a static library is created because most of the UNIX + * loaders, if not all, complain about unresolved symbols even if the + * application doesn't use the modules in which such symbols are referenced. + * However, if your system supports libraries with weak symbols (e.g. + * Solaris, FreeBSD and Linux) it is possible to fool the loader using these + * weak symbols. + */ +#ifdef USE_XM_STUBS +#pragma weak _XmPrimitiveHighlightPixmapDefault = _Xm_Stub_Pointer_ +#pragma weak _XmHighlightColorDefault = _Xm_Stub_Pointer_ +#pragma weak _XmForegroundColorDefault = _Xm_Stub_Pointer_ +#pragma weak _XmBackgroundColorDefault = _Xm_Stub_Pointer_ +#pragma weak _XmStrings = _Xm_Stub_Pointer_ +#pragma weak xmPrimitiveClassRec = _Xm_Stub_Pointer_ + +static XtPointer _Xm_Stub_Pointer_ = NULL; +#endif + +void GLwDrawingAreaMakeCurrent (Widget w, GLXContext ctx) +{ + glXMakeCurrent (XtDisplay(w), XtWindow(w), ctx); +} + +void GLwDrawingAreaSwapBuffers (Widget w) +{ + glXSwapBuffers (XtDisplay(w), XtWindow(w)); +} Index: xc/extras/ogl-sample/main/gfx/lib/glw/GLwDrawA.c diff -u /dev/null xc/extras/ogl-sample/main/gfx/lib/glw/GLwDrawA.c:1.2 --- /dev/null Mon Dec 18 14:22:44 2000 +++ xc/extras/ogl-sample/main/gfx/lib/glw/GLwDrawA.c Thu Nov 2 15:39:07 2000 @@ -0,0 +1,738 @@ +/* +** License Applicability. Except to the extent portions of this file are +** made subject to an alternative license as permitted in the SGI Free +** Software License B, Version 1.1 (the "License"), the contents of this +** file are subject only to the provisions of the License. You may not use +** this file except in compliance with the License. You may obtain a copy +** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600 +** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at: +** +** http://oss.sgi.com/projects/FreeB +** +** Note that, as provided in the License, the Software is distributed on an +** "AS IS" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS +** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND +** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A +** PARTICULAR PURPOSE, AND NON-INFRINGEMENT. +** +** Original Code. The Original Code is: OpenGL Sample Implementation, +** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics, +** Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc. +** Copyright in any portions created by third parties is as indicated +** elsewhere herein. All Rights Reserved. +** +** Additional Notice Provisions: The application programming interfaces +** established by SGI in conjunction with the Original Code are The +** OpenGL(R) Graphics System: A Specification (Version 1.2.1), released +** April 1, 1999; The OpenGL(R) Graphics System Utility Library (Version +** 1.3), released November 4, 1998; and OpenGL(R) Graphics with the X +** Window System(R) (Version 1.3), released October 19, 1998. This software +** was created using the OpenGL(R) version 1.2.1 Sample Implementation +** published by SGI, but has not been independently verified as being +** compliant with the OpenGL(R) version 1.2.1 Specification. +** +** $Date$ $Revision$ +*/ +/* +** $Header: //depot/main/gfx/lib/glw/GLwDrawA.c#5 $ +*/ + +#include +#include +#include +#ifdef __GLX_MOTIF +#include "GLwMDrawAP.h" +#else /* not __GLX_MOTIF */ +#include "GLwDrawAP.h" +#include +#include +#endif /* __GLX_MOTIF */ +#include + +#ifdef __GLX_MOTIF +/* The MOTIF version differs only in the inclusion of the primitive + * widget class and in a vew variable and type name differences. + * Rather than put ifdefs all over the place, we just use a few defines + * to make it use motif types and names + */ +#define GLwDrawingAreaWidget GLwMDrawingAreaWidget +#define GLwDrawingAreaClassRec GLwMDrawingAreaClassRec +#define glwDrawingAreaClassRec glwMDrawingAreaClassRec +#define glwDrawingAreaWidgetClass glwMDrawingAreaWidgetClass +#define GLwDrawingAreaRec GLwMDrawingAreaRec +#endif /* __GLX_MOTIF */ + +/* forward definitions */ +/* resource default procs */ +static void createColormap(GLwDrawingAreaWidget w, + int offset, XrmValue *value); + +/* widget methods */ +static void Initialize(GLwDrawingAreaWidget req, GLwDrawingAreaWidget new, + ArgList args, Cardinal *num_args); +static void Realize(Widget w, Mask *valueMask, + XSetWindowAttributes *attributes); +static void Redraw(GLwDrawingAreaWidget w, XEvent *event, Region region); +static void Resize(GLwDrawingAreaWidget glw); +static void Destroy(GLwDrawingAreaWidget glw); + +#define offset(field) XtOffset(GLwDrawingAreaWidget, glwDrawingArea.field) + +static char defaultTranslations[] = +#ifdef __GLX_MOTIF + "osfHelp:PrimitiveHelp() \n" +#endif + ": glwInput() \n\ + : glwInput() \n\ + : glwInput() \n\ + : glwInput() \n\ + : glwInput() "; + +static void glwInput(GLwDrawingAreaWidget glw, XEvent *event, + String *, Cardinal *); + +static XtActionsRec actions[] = { + { "glwInput", (XtActionProc) glwInput }, /* key or mouse input */ +}; + +/* + * There is a bit of unusual handling of the resources here. + * Because Xt insists on allocating the colormap resource when it is + * processing the core resources (even if we redeclare the colormap + * resource here, we need to do a little trick. When Xt first allocates + * the colormap, we allow it to allocate the default one, since we have + * not yet determined the appropriate visual (which is determined from + * resources parsed after the colormap). We also let it allocate colors + * in that default colormap. + * + * In the initialize proc we calculate the actual visual. Then, we + * reobtain the colormap resource using XtGetApplicationResources in + * the initialize proc. If requested, we also reallocate colors in + * that colormap using the same method. + */ + +static XtResource resources[] = { + /* The GLX attributes. Add any new attributes here */ + + {GLwNbufferSize, GLwCBufferSize, XtRInt, sizeof (int), + offset(bufferSize), XtRImmediate, (XtPointer) 0}, + + {GLwNlevel, GLwCLevel, XtRInt, sizeof (int), + offset(level), XtRImmediate, (XtPointer) 0}, + + {GLwNrgba, GLwCRgba, XtRBoolean, sizeof (Boolean), + offset(rgba), XtRImmediate, (XtPointer) FALSE}, + + {GLwNdoublebuffer, GLwCDoublebuffer, XtRBoolean, sizeof (Boolean), + offset(doublebuffer), XtRImmediate, (XtPointer) FALSE}, + + {GLwNstereo, GLwCStereo, XtRBoolean, sizeof (Boolean), + offset(stereo), XtRImmediate, (XtPointer) FALSE}, + + {GLwNauxBuffers, GLwCAuxBuffers, XtRInt, sizeof (int), + offset(auxBuffers), XtRImmediate, (XtPointer) 0}, + + {GLwNredSize, GLwCColorSize, XtRInt, sizeof (int), + offset(redSize), XtRImmediate, (XtPointer) 1}, + + {GLwNgreenSize, GLwCColorSize, XtRInt, sizeof (int), + offset(greenSize), XtRImmediate, (XtPointer) 1}, + + {GLwNblueSize, GLwCColorSize, XtRInt, sizeof (int), + offset(blueSize), XtRImmediate, (XtPointer) 1}, + + {GLwNalphaSize, GLwCAlphaSize, XtRInt, sizeof (int), + offset(alphaSize), XtRImmediate, (XtPointer) 0}, + + {GLwNdepthSize, GLwCDepthSize, XtRInt, sizeof (int), + offset(depthSize), XtRImmediate, (XtPointer) 0}, + + {GLwNstencilSize, GLwCStencilSize, XtRInt, sizeof (int), + offset(stencilSize), XtRImmediate, (XtPointer) 0}, + + {GLwNaccumRedSize, GLwCAccumColorSize, XtRInt, sizeof (int), + offset(accumRedSize), XtRImmediate, (XtPointer) 0}, + + {GLwNaccumGreenSize, GLwCAccumColorSize, XtRInt, sizeof (int), + offset(accumGreenSize), XtRImmediate, (XtPointer) 0}, + + {GLwNaccumBlueSize, GLwCAccumColorSize, XtRInt, sizeof (int), + offset(accumBlueSize), XtRImmediate, (XtPointer) 0}, + + {GLwNaccumAlphaSize, GLwCAccumAlphaSize, XtRInt, sizeof (int), + offset(accumAlphaSize), XtRImmediate, (XtPointer) 0}, + + /* the attribute list */ + {GLwNattribList, GLwCAttribList, XtRPointer, sizeof(int *), + offset(attribList), XtRImmediate, (XtPointer) NULL}, + + /* the visual info */ + {GLwNvisualInfo, GLwCVisualInfo, GLwRVisualInfo, sizeof (XVisualInfo *), + offset(visualInfo), XtRImmediate, (XtPointer) NULL}, + +/* miscellaneous resources */ + {GLwNinstallColormap, GLwCInstallColormap, XtRBoolean, sizeof (Boolean), + offset(installColormap), XtRImmediate, (XtPointer) TRUE}, + + {GLwNallocateBackground, GLwCAllocateColors, XtRBoolean, sizeof (Boolean), + offset(allocateBackground), XtRImmediate, (XtPointer) FALSE}, + + {GLwNallocateOtherColors, GLwCAllocateColors, XtRBoolean, sizeof (Boolean), + offset(allocateOtherColors), XtRImmediate, (XtPointer) FALSE}, + + {GLwNinstallBackground, GLwCInstallBackground, XtRBoolean, sizeof (Boolean), + offset(installBackground), XtRImmediate, (XtPointer) TRUE}, + + {GLwNginitCallback, GLwCCallback, XtRCallback, sizeof (XtCallbackList), + offset(ginitCallback), XtRImmediate, (XtPointer) NULL}, + + {GLwNinputCallback, GLwCCallback, XtRCallback, sizeof (XtCallbackList), + offset(inputCallback), XtRImmediate, (XtPointer) NULL}, + + {GLwNresizeCallback, GLwCCallback, XtRCallback, sizeof (XtCallbackList), + offset(resizeCallback), XtRImmediate, (XtPointer) NULL}, + + {GLwNexposeCallback, GLwCCallback, XtRCallback, sizeof (XtCallbackList), + offset(exposeCallback), XtRImmediate, (XtPointer) NULL}, + +#ifdef __GLX_MOTIF + /* Changes to Motif primitive resources */ + {XmNtraversalOn, XmCTraversalOn, XmRBoolean, sizeof (Boolean), + XtOffset (GLwDrawingAreaWidget, primitive.traversal_on), XmRImmediate, + (XtPointer) FALSE}, + + /* highlighting is normally disabled, as when Motif tries to disable + * highlighting, it tries to reset the color back to the parent's + * background (usually Motif blue). Unfortunately, that is in a + * different colormap, and doesn't work too well. + */ + {XmNhighlightOnEnter, XmCHighlightOnEnter, XmRBoolean, sizeof (Boolean), + XtOffset (GLwDrawingAreaWidget, primitive.highlight_on_enter), + XmRImmediate, (XtPointer) FALSE}, + + {XmNhighlightThickness, XmCHighlightThickness, XmRHorizontalDimension, + sizeof (Dimension), + XtOffset (GLwDrawingAreaWidget, primitive.highlight_thickness), + XmRImmediate, (XtPointer) 0}, + +#endif /* __GLX_MOTIF */ +}; + +/* The following resources are reobtained using XtGetApplicationResources + * in the initialize proc. + */ +/* The colormap */ +static XtResource initializeResources[] = { + /* reobtain the colormap with the new visual */ + {XtNcolormap, XtCColormap, XtRColormap, sizeof(Colormap), + XtOffset(GLwDrawingAreaWidget, core.colormap), + XtRCallProc,(XtPointer) createColormap}, +}; + +/* reallocate any colors we need in the new colormap */ + +/* The background is obtained only if the allocateBackground resource is TRUE*/ +static XtResource backgroundResources[] = { +#ifdef __GLX_MOTIF + { + XmNbackground, XmCBackground, XmRPixel, + sizeof (Pixel), XtOffset(GLwDrawingAreaWidget, core.background_pixel), + XmRCallProc, (XtPointer) _XmBackgroundColorDefault + }, + { + XmNbackgroundPixmap, XmCPixmap, XmRXmBackgroundPixmap, + sizeof (Pixmap), XtOffset(GLwDrawingAreaWidget, core.background_pixmap), + XmRImmediate, (XtPointer) XmUNSPECIFIED_PIXMAP + }, + +#else /* ! __GLX_MOTIF */ + {XtNbackground, XtCBackground, XtRPixel,sizeof(Pixel), + XtOffset(GLwDrawingAreaWidget,core.background_pixel), + XtRString, (XtPointer)"XtDefaultBackground"}, + {XtNbackgroundPixmap, XtCPixmap, XtRPixmap, sizeof(Pixmap), + XtOffset(GLwDrawingAreaWidget,core.background_pixmap), + XtRImmediate, (XtPointer)XtUnspecifiedPixmap}, +#endif /* __GLX_MOTIF */ +}; + +/* The other colors such as the foreground are allocated only if + * allocateOtherColors are set. These resources only exist in Motif. + */ + +#ifdef __GLX_MOTIF +static XtResource otherColorResources[] = { + { + XmNforeground, XmCForeground, XmRPixel, + sizeof (Pixel), XtOffset(GLwDrawingAreaWidget, primitive.foreground), + XmRCallProc, (XtPointer) _XmForegroundColorDefault + }, + + { + XmNhighlightColor, XmCHighlightColor, XmRPixel, sizeof (Pixel), + XtOffset(GLwDrawingAreaWidget, primitive.highlight_color), + XmRCallProc, (XtPointer) _XmHighlightColorDefault + }, + + { + XmNhighlightPixmap, XmCHighlightPixmap, XmRPrimHighlightPixmap, + sizeof (Pixmap), + XtOffset(GLwDrawingAreaWidget, primitive.highlight_pixmap), + XmRCallProc, (XtPointer) _XmPrimitiveHighlightPixmapDefault + }, +}; +#endif /* __GLX_MOTIF */ + +struct attribInfo +{ + int offset; + int attribute; +}; + +static struct attribInfo intAttribs[] = +{ + { offset(bufferSize), GLX_BUFFER_SIZE }, + { offset(level), GLX_LEVEL }, + { offset(auxBuffers), GLX_AUX_BUFFERS }, + { offset(redSize), GLX_RED_SIZE }, + { offset(greenSize), GLX_GREEN_SIZE }, + { offset(blueSize), GLX_BLUE_SIZE }, + { offset(alphaSize), GLX_ALPHA_SIZE }, + { offset(depthSize), GLX_DEPTH_SIZE }, + { offset(stencilSize), GLX_STENCIL_SIZE }, + { offset(accumRedSize), GLX_ACCUM_RED_SIZE }, + { offset(accumGreenSize), GLX_ACCUM_GREEN_SIZE }, + { offset(accumBlueSize), GLX_ACCUM_BLUE_SIZE }, + { offset(accumAlphaSize), GLX_ACCUM_ALPHA_SIZE }, + { 0, None }, +}; + +static struct attribInfo booleanAttribs[] = +{ + { offset(rgba), GLX_RGBA }, + { offset(doublebuffer), GLX_DOUBLEBUFFER }, + { offset(stereo), GLX_STEREO }, + { 0, None }, +}; + +#undef offset + + +GLwDrawingAreaClassRec glwDrawingAreaClassRec = +{ + { /* core fields */ +#ifdef __GLX_MOTIF + /* superclass */ (WidgetClass) &xmPrimitiveClassRec, + /* class_name */ "GLwMDrawingArea", +#else /* not __GLX_MOTIF */ + /* superclass */ (WidgetClass) &widgetClassRec, + /* class_name */ "GLwDrawingArea", +#endif /* __GLX_MOTIF */ + /* widget_size */ sizeof(GLwDrawingAreaRec), + /* class_initialize */ NULL, + /* class_part_initialize */ NULL, + /* class_inited */ FALSE, + /* initialize */ (XtInitProc) Initialize, + /* initialize_hook */ NULL, + /* realize */ Realize, + /* actions */ actions, + /* num_actions */ XtNumber(actions), + /* resources */ resources, + /* num_resources */ XtNumber(resources), + /* xrm_class */ NULLQUARK, + /* compress_motion */ TRUE, + /* compress_exposure */ TRUE, + /* compress_enterleave */ TRUE, + /* visible_interest */ TRUE, + /* destroy */ (XtWidgetProc) Destroy, + /* resize */ (XtWidgetProc) Resize, + /* expose */ (XtExposeProc) Redraw, + /* set_values */ NULL, + /* set_values_hook */ NULL, + /* set_values_almost */ XtInheritSetValuesAlmost, + /* get_values_hook */ NULL, + /* accept_focus */ NULL, + /* version */ XtVersion, + /* callback_private */ NULL, + /* tm_table */ defaultTranslations, + /* query_geometry */ XtInheritQueryGeometry, + /* display_accelerator */ XtInheritDisplayAccelerator, + /* extension */ NULL + }, +#ifdef __GLX_MOTIF /* primitive resources */ + { + /* border_highlight */ XmInheritBorderHighlight, + /* border_unhighlight */ XmInheritBorderUnhighlight, + /* translations */ XtInheritTranslations, + /* arm_and_activate */ NULL, + /* get_resources */ NULL, + /* num get_resources */ 0, + /* extension */ NULL, + } +#endif /* __GLX_MOTIF */ +}; + +WidgetClass glwDrawingAreaWidgetClass = (WidgetClass)&glwDrawingAreaClassRec; + +static void error(Widget w, char *string) +{ + char buf[100]; +#ifdef __GLX_MOTIF + sprintf (buf, "GLwMDrawingArea: %s\n", string); +#else + sprintf (buf, "GLwDrawingArea: %s\n", string); +#endif + XtAppError(XtWidgetToApplicationContext(w), buf); +} + +static void warning(Widget w, char *string) +{ + char buf[100]; +#ifdef __GLX_MOTIF + sprintf (buf, "GLwMDraw: %s\n", string); +#else + sprintf (buf, "GLwDraw: %s\n", string); +#endif + XtAppWarning(XtWidgetToApplicationContext(w), buf); +} + +/* resource initialization methods */ +/* Initialize the attribList based on the attributes */ +static void createAttribList(GLwDrawingAreaWidget w) +{ + int listLength; + register struct attribInfo *ap; + int *ip; + + /* first find out how long a list we need */ + listLength=1; /* include the terminating NULL */ + for (ap = booleanAttribs; ap->attribute; ap++) + { + if (*(Boolean *)(((char *)w)+ap->offset)) + listLength++; /* one word for a boolean */ + } + for (ap = intAttribs; ap->attribute; ap++) + { + if (*(int *)(((char *)w)+ap->offset)) + listLength+=2; /* one word for an int */ + } + w->glwDrawingArea.attribList = (int *)XtMalloc(listLength*sizeof(int)); + ip = w->glwDrawingArea.attribList; + for (ap = booleanAttribs; ap->attribute; ap++) + { + if (*(Boolean *)(((char *)w)+ap->offset)) + *ip++ = ap->attribute; + } + for (ap = intAttribs; ap->attribute; ap++) + { + if (*(int *)(((char *)w)+ap->offset)) + { + *ip++ = ap->attribute; + *ip++ = *(int *)(((char *)w)+ap->offset); + } + } + *ip = None; +} + +/* Initialize the visualInfo based on the attribute list */ +static void createVisualInfo(GLwDrawingAreaWidget w) +{ + static XVisualInfo *visualInfo; + + assert(w->glwDrawingArea.attribList); + w->glwDrawingArea.visualInfo = glXChooseVisual(XtDisplay(w), + XScreenNumberOfScreen(XtScreen(w)), + w->glwDrawingArea.attribList); + if (!w->glwDrawingArea.visualInfo) + error((Widget)w,"requested visual not supported"); +} + +/* Initialize the colormap based on the visual info. + * This routine maintains a cache of visual-infos to colormaps. If two + * widgets share the same visual info, they share the same colormap. + * This function is called by the callProc of the colormap resource entry. + */ +static void createColormap(GLwDrawingAreaWidget w, + int offset, XrmValue *value) +{ + static struct cmapCache + { + Visual *visual; + Colormap cmap; + int screen; + } *cmapCache; + static int cacheEntries=0; + static int cacheMalloced=0; + + register int i; + + assert(w->glwDrawingArea.visualInfo); + + /* see if we can find it in the cache */ + for (i=0; iglwDrawingArea.visualInfo->visual && + cmapCache[i].screen == w->glwDrawingArea.visualInfo->screen) + { + value->addr = (XtPointer) (&cmapCache[i].cmap); + return; + } + /* not in the cache, create a new entry */ + if (cacheEntries >= cacheMalloced) + { + /* need to malloc a new one. Since we are likely to have only a + * few colormaps, we allocate one the first time, and double + * each subsequent time. + */ + if (cacheMalloced == 0) + { + cacheMalloced = 1; + cmapCache = (struct cmapCache *)XtMalloc(sizeof(struct cmapCache)); + } + else + { + cacheMalloced <<= 1; + cmapCache = (struct cmapCache *)XtRealloc((char *) cmapCache, + sizeof(struct cmapCache)* + cacheMalloced); + } + } + + cmapCache[cacheEntries].cmap = XCreateColormap (XtDisplay(w), + RootWindow(XtDisplay(w), + w->glwDrawingArea.visualInfo->screen), + w->glwDrawingArea.visualInfo->visual, + AllocNone); + cmapCache[cacheEntries].visual = w->glwDrawingArea.visualInfo->visual; + cmapCache[cacheEntries].screen = w->glwDrawingArea.visualInfo->screen; + value->addr = (XtPointer) (&cmapCache[cacheEntries++].cmap); +} + +static void +Initialize (GLwDrawingAreaWidget req, GLwDrawingAreaWidget new, + ArgList args, Cardinal *num_args) +{ + + if (req->core.width == 0) + new->core.width = 100; + if (req->core.height == 0) + new->core.width = 100; + + /* create the attribute list if needed */ + if (new->glwDrawingArea.attribList == NULL) + { + new->glwDrawingArea.myList = TRUE; + createAttribList(new); + } + else + new->glwDrawingArea.myList = FALSE; + + /* determine the visual info if needed */ + if (new->glwDrawingArea.visualInfo == NULL) + { + new->glwDrawingArea.myVisual = TRUE; + createVisualInfo(new); + } + else + new->glwDrawingArea.myVisual = FALSE; + + new->core.depth = new->glwDrawingArea.visualInfo->depth; + + /* Reobtain the colormap and colors in it using XtGetApplicationResources*/ + XtGetApplicationResources((Widget) new, new, + initializeResources, + XtNumber(initializeResources), + args, *num_args); + + /* obtain the color resources if appropriate */ + if (req->glwDrawingArea.allocateBackground) + XtGetApplicationResources((Widget) new, new, + backgroundResources, + XtNumber(backgroundResources), + args, *num_args); + +#ifdef __GLX_MOTIF + if (req->glwDrawingArea.allocateOtherColors) + XtGetApplicationResources((Widget) new, new, + otherColorResources, + XtNumber(otherColorResources), + args, *num_args); +#endif /* __GLX_MOTIF */ + +} + +static void +Realize(Widget w, Mask *valueMask, XSetWindowAttributes *attributes) +{ + register GLwDrawingAreaWidget glw = (GLwDrawingAreaWidget)w; + GLwDrawingAreaCallbackStruct cb; + + /* if we haven't requested that the background be both installed and + * allocated, don't install it. + */ + if (!(glw->glwDrawingArea.installBackground && + glw->glwDrawingArea.allocateBackground)) + *valueMask &= ~CWBackPixel; + + XtCreateWindow (w, (unsigned int)InputOutput, + glw->glwDrawingArea.visualInfo->visual, + *valueMask, attributes); + + /* if appropriate, call XSetWMColormapWindows to install the colormap */ + if (glw->glwDrawingArea.installColormap) + { + Widget parentShell = XtParent(w); + Status status; + Window *windowsReturn; + int countReturn; + + while (parentShell && !XtIsShell(parentShell)) + parentShell = XtParent(parentShell); + if (parentShell && XtWindow(parentShell)) + { + /* check to see if there is already a property */ + status = XGetWMColormapWindows(XtDisplay(parentShell), + XtWindow(parentShell), + &windowsReturn, &countReturn); + + /* if no property, just create one */ + if (!status) + { + Window windows[2]; + windows[0] = XtWindow(w); + windows[1] = XtWindow(parentShell); + XSetWMColormapWindows(XtDisplay(parentShell), + XtWindow(parentShell), + windows, 2); + } + /* there was a property, add myself to the beginning */ + else + { + Window *windows = (Window *)XtMalloc((sizeof(Window))* + (countReturn+1)); + register int i; + windows[0] = XtWindow(w); + for (i=0; icore.width; + cb.height = glw->core.height; + XtCallCallbackList((Widget) glw, glw->glwDrawingArea.ginitCallback, &cb); +} + +static void +Redraw(GLwDrawingAreaWidget w, XEvent *event, Region region) +{ + GLwDrawingAreaCallbackStruct cb; + XtCallbackList cblist; + + cb.reason = GLwCR_EXPOSE; + cb.event = event; + cb.width = w->core.width; + cb.height = w->core.height; + XtCallCallbackList ((Widget) w, w->glwDrawingArea.exposeCallback, &cb); +} + +static void +Resize(GLwDrawingAreaWidget glw) +{ + GLwDrawingAreaCallbackStruct cb; + + /* if we get a resize event before being realized, we can't handle it */ + if (!XtIsRealized((Widget)glw)) + return; + cb.reason = GLwCR_RESIZE; + cb.event = NULL; + cb.width = glw->core.width; + cb.height = glw->core.height; + XtCallCallbackList ((Widget) glw, glw->glwDrawingArea.resizeCallback, &cb); +} + +static void +Destroy(GLwDrawingAreaWidget glw) +{ + if (glw->glwDrawingArea.myList && glw->glwDrawingArea.attribList) + XtFree ((XtPointer)glw->glwDrawingArea.attribList); + if (glw->glwDrawingArea.myVisual && glw->glwDrawingArea.visualInfo) + XFree ((XtPointer)glw->glwDrawingArea.visualInfo); + + /* if my colormap was installed, remove it */ + if (glw->glwDrawingArea.installColormap) + { + Widget parentShell = XtParent(glw); + Status status; + Window *windowsReturn; + int countReturn; + register int i; + + /* find the parent shell */ + while (parentShell && !XtIsShell(parentShell)) + parentShell = XtParent(parentShell); + + if (parentShell && XtWindow(parentShell)) + { + /* make sure there is a property */ + status = XGetWMColormapWindows(XtDisplay(parentShell), + XtWindow(parentShell), + &windowsReturn, &countReturn); + + /* if no property, just return. If there was a property, + * continue + */ + if (status) + { + /* search for a match */ + for (i=0; icore.width; + cb.height = glw->core.height; + XtCallCallbackList ((Widget) glw, glw->glwDrawingArea.inputCallback, &cb); +} + +#ifdef __GLX_MOTIF +/* Provide a Motif-style create routine */ +Widget GLwCreateMDrawingArea(Widget parent, char *name, + ArgList arglist, Cardinal argcount) +{ + return (XtCreateWidget (name, glwMDrawingAreaWidgetClass, parent, arglist, + argcount)); +} +#endif Index: xc/extras/ogl-sample/main/gfx/lib/glw/GLwDrawA.h diff -u /dev/null xc/extras/ogl-sample/main/gfx/lib/glw/GLwDrawA.h:1.2 --- /dev/null Mon Dec 18 14:22:44 2000 +++ xc/extras/ogl-sample/main/gfx/lib/glw/GLwDrawA.h Thu Nov 2 15:39:07 2000 @@ -0,0 +1,228 @@ +/* +** License Applicability. Except to the extent portions of this file are +** made subject to an alternative license as permitted in the SGI Free +** Software License B, Version 1.1 (the "License"), the contents of this +** file are subject only to the provisions of the License. You may not use +** this file except in compliance with the License. You may obtain a copy +** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600 +** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at: +** +** http://oss.sgi.com/projects/FreeB +** +** Note that, as provided in the License, the Software is distributed on an +** "AS IS" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS +** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND +** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A +** PARTICULAR PURPOSE, AND NON-INFRINGEMENT. +** +** Original Code. The Original Code is: OpenGL Sample Implementation, +** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics, +** Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc. +** Copyright in any portions created by third parties is as indicated +** elsewhere herein. All Rights Reserved. +** +** Additional Notice Provisions: The application programming interfaces +** established by SGI in conjunction with the Original Code are The +** OpenGL(R) Graphics System: A Specification (Version 1.2.1), released +** April 1, 1999; The OpenGL(R) Graphics System Utility Library (Version +** 1.3), released November 4, 1998; and OpenGL(R) Graphics with the X +** Window System(R) (Version 1.3), released October 19, 1998. This software +** was created using the OpenGL(R) version 1.2.1 Sample Implementation +** published by SGI, but has not been independently verified as being +** compliant with the OpenGL(R) version 1.2.1 Specification. +** +** $Date$ $Revision$ +*/ +/* +** $Header: //depot/main/gfx/lib/glw/GLwDrawA.h#4 $ +*/ + +/* +** This file has been slightly modified from the original by Carlos A. M. dos +** Santos for integration into XFree86 source +** tree and for generating both Motif(TM) 1.2 and 2.x versions of the widgets +** in the same library. +*/ +/* $XFree86: xc/extras/ogl-sample/main/gfx/lib/glw/GLwDrawA.h,v 1.2 2000/11/02 20:39:07 dawes Exp $ */ + +#ifndef _GLwDrawA_h +#define _GLwDrawA_h + +#ifdef __GLX_MOTIF +# ifndef __GLX_INCLUDE_XM_H /* Defined during library compilation */ +# include /* We need to know about XmVERSION early */ +# endif +#endif + +#include +#include + +/**************************************************************** + * + * GLwDrawingArea widgets + * + ****************************************************************/ + +/* Resources: + + Name Class RepType Default Value + ---- ----- ------- ------------- + attribList AttribList int * NULL + visualInfo VisualInfo VisualInfo NULL + installColormap InstallColormap Boolean TRUE + allocateBackground AllocateColors Boolean FALSE + allocateOtherColors AllocateColors Boolean FALSE + installBackground InstallBackground Boolean TRUE + exposeCallback Callback Pointer NULL + ginitCallback Callback Pointer NULL + inputCallback Callback Pointer NULL + resizeCallback Callback Pointer NULL + +*** The following resources all correspond to the GLX configuration +*** attributes and are used to create the attribList if it is NULL + bufferSize BufferSize int 0 + level Level int 0 + rgba Rgba Boolean FALSE + doublebuffer Doublebuffer Boolean FALSE + stereo Stereo Boolean FALSE + auxBuffers AuxBuffers int 0 + redSize ColorSize int 1 + greenSize ColorSize int 1 + blueSize ColorSize int 1 + alphaSize AlphaSize int 0 + depthSize DepthSize int 0 + stencilSize StencilSize int 0 + accumRedSize AccumColorSize int 0 + accumGreenSize AccumColorSize int 0 + accumBlueSize AccumColorSize int 0 + accumAlphaSize AccumAlphaSize int 0 +*/ + +#define GLwNattribList "attribList" +#define GLwCAttribList "AttribList" +#define GLwNvisualInfo "visualInfo" +#define GLwCVisualInfo "VisualInfo" +#define GLwRVisualInfo "VisualInfo" + +#define GLwNinstallColormap "installColormap" +#define GLwCInstallColormap "InstallColormap" +#define GLwNallocateBackground "allocateBackground" +#define GLwNallocateOtherColors "allocateOtherColors" +#define GLwCAllocateColors "AllocateColors" +#define GLwNinstallBackground "installBackground" +#define GLwCInstallBackground "InstallBackground" + +#define GLwCCallback "Callback" +#define GLwNexposeCallback "exposeCallback" +#define GLwNginitCallback "ginitCallback" +#define GLwNresizeCallback "resizeCallback" +#define GLwNinputCallback "inputCallback" + +#define GLwNbufferSize "bufferSize" +#define GLwCBufferSize "BufferSize" +#define GLwNlevel "level" +#define GLwCLevel "Level" +#define GLwNrgba "rgba" +#define GLwCRgba "Rgba" +#define GLwNdoublebuffer "doublebuffer" +#define GLwCDoublebuffer "Doublebuffer" +#define GLwNstereo "stereo" +#define GLwCStereo "Stereo" +#define GLwNauxBuffers "auxBuffers" +#define GLwCAuxBuffers "AuxBuffers" +#define GLwNredSize "redSize" +#define GLwNgreenSize "greenSize" +#define GLwNblueSize "blueSize" +#define GLwCColorSize "ColorSize" +#define GLwNalphaSize "alphaSize" +#define GLwCAlphaSize "AlphaSize" +#define GLwNdepthSize "depthSize" +#define GLwCDepthSize "DepthSize" +#define GLwNstencilSize "stencilSize" +#define GLwCStencilSize "StencilSize" +#define GLwNaccumRedSize "accumRedSize" +#define GLwNaccumGreenSize "accumGreenSize" +#define GLwNaccumBlueSize "accumBlueSize" +#define GLwCAccumColorSize "AccumColorSize" +#define GLwNaccumAlphaSize "accumAlphaSize" +#define GLwCAccumAlphaSize "AccumAlphaSize" + +#ifdef __GLX_MOTIF + +#if XmVERSION == 1 +/* +# define _GLwMDrawingAreaClassRec _GLwM1DrawingAreaClassRec +# define _GLwMDrawingAreaRec _GLwM1DrawingAreaRec +*/ +# define glwMDrawingAreaWidgetClass glwM1DrawingAreaWidgetClass +# define GLwCreateMDrawingArea GLwCreateM1DrawingArea +#elif XmVERSION == 2 +/* +# define _GLwMDrawingAreaClassRec _GLwM2DrawingAreaClassRec +# define _GLwMDrawingAreaRec _GLwM2DrawingAreaRec +*/ +# define glwMDrawingAreaWidgetClass glwM2DrawingAreaWidgetClass +# define GLwCreateMDrawingArea GLwCreateM2DrawingArea +#else +#error "Sorry, unknown Motif version." +#endif /* XmVERSION */ + +typedef struct _GLwMDrawingAreaClassRec *GLwMDrawingAreaWidgetClass; +typedef struct _GLwMDrawingAreaRec *GLwMDrawingAreaWidget; + +extern WidgetClass glwMDrawingAreaWidgetClass; + +#else /* not __GLX_MOTIF */ + +typedef struct _GLwDrawingAreaClassRec *GLwDrawingAreaWidgetClass; +typedef struct _GLwDrawingAreaRec *GLwDrawingAreaWidget; + +extern WidgetClass glwDrawingAreaWidgetClass; + +#endif /* __GLX_MOTIF */ + +/* Callback reasons */ +#ifdef __GLX_MOTIF +#define GLwCR_EXPOSE XmCR_EXPOSE +#define GLwCR_RESIZE XmCR_RESIZE +#define GLwCR_INPUT XmCR_INPUT +#else /* not __GLX_MOTIF */ +/* The same values as Motif, but don't use Motif constants */ +#define GLwCR_EXPOSE 38 +#define GLwCR_RESIZE 39 +#define GLwCR_INPUT 40 +#endif /* __GLX_MOTIF */ + +#define GLwCR_GINIT 32135 /* Arbitrary number that should neverr clash*/ + +typedef struct +{ + int reason; + XEvent *event; + Dimension width, height; /* for resize callback */ +} GLwDrawingAreaCallbackStruct; + +#if defined(__cplusplus) || defined(c_plusplus) +extern "C" { +#endif + +/* front ends to glXMakeCurrent and glXSwapBuffers */ +extern void GLwDrawingAreaMakeCurrent (Widget w, GLXContext ctx); +extern void GLwDrawingAreaSwapBuffers (Widget w); + +#ifdef __GLX_MOTIF +#ifdef _NO_PROTO +extern Widget GLwCreateMDrawingArea (); +#else /* _NO_PROTO */ + +extern Widget GLwCreateMDrawingArea (Widget parent, char *name, + ArgList arglist, Cardinal argcount); +#endif /* _NO_PROTO */ + +#endif /* __GLX_MOTIF */ + +#if defined(__cplusplus) || defined(c_plusplus) +} +#endif + +#endif /* _GLwDrawA_h */ Index: xc/extras/ogl-sample/main/gfx/lib/glw/GLwDrawAP.h diff -u /dev/null xc/extras/ogl-sample/main/gfx/lib/glw/GLwDrawAP.h:1.2 --- /dev/null Mon Dec 18 14:22:44 2000 +++ xc/extras/ogl-sample/main/gfx/lib/glw/GLwDrawAP.h Thu Nov 2 15:39:07 2000 @@ -0,0 +1,131 @@ +/* +** License Applicability. Except to the extent portions of this file are +** made subject to an alternative license as permitted in the SGI Free +** Software License B, Version 1.1 (the "License"), the contents of this +** file are subject only to the provisions of the License. You may not use +** this file except in compliance with the License. You may obtain a copy +** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600 +** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at: +** +** http://oss.sgi.com/projects/FreeB +** +** Note that, as provided in the License, the Software is distributed on an +** "AS IS" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS +** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND +** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A +** PARTICULAR PURPOSE, AND NON-INFRINGEMENT. +** +** Original Code. The Original Code is: OpenGL Sample Implementation, +** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics, +** Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc. +** Copyright in any portions created by third parties is as indicated +** elsewhere herein. All Rights Reserved. +** +** Additional Notice Provisions: The application programming interfaces +** established by SGI in conjunction with the Original Code are The +** OpenGL(R) Graphics System: A Specification (Version 1.2.1), released +** April 1, 1999; The OpenGL(R) Graphics System Utility Library (Version +** 1.3), released November 4, 1998; and OpenGL(R) Graphics with the X +** Window System(R) (Version 1.3), released October 19, 1998. This software +** was created using the OpenGL(R) version 1.2.1 Sample Implementation +** published by SGI, but has not been independently verified as being +** compliant with the OpenGL(R) version 1.2.1 Specification. +** +** $Date$ $Revision$ +*/ +/* +** $Header: //depot/main/gfx/lib/glw/GLwDrawAP.h#5 $ +*/ + +/* +** This file has been slightly modified from the original by Carlos A. M. dos +** Santos for integration into XFree86 source +** tree and for generating both Motif(TM) 1.2 and 2.x versions of the widgets +** in the same library. +*/ +/* $XFree86: xc/extras/ogl-sample/main/gfx/lib/glw/GLwDrawAP.h,v 1.2 2000/11/02 20:39:07 dawes Exp $ */ + +#ifndef _GLwDrawAP_h +#define _GLwDrawAP_h + +#ifdef __GLX_MOTIF +# ifndef __GLX_INCLUDE_PRIMITIVE_P_H /* Used during library compilation */ +# include +# endif +# include /* includes IntrinsicP.h */ +#else +# include +# include +#endif + +typedef struct _GLwDrawingAreaClassPart +{ + char* extension; +} GLwDrawingAreaClassPart; + +#ifdef __GLX_MOTIF +typedef struct _GLwMDrawingAreaClassRec { + CoreClassPart core_class; + XmPrimitiveClassPart primitive_class; + GLwDrawingAreaClassPart glwDrawingArea_class; +} GLwMDrawingAreaClassRec; + +extern GLwMDrawingAreaClassRec glwMDrawingAreaClassRec; + +#else /* not __GLX_MOTIF */ + +typedef struct _GLwDrawingAreaClassRec { + CoreClassPart core_class; + GLwDrawingAreaClassPart glwDrawingArea_class; +} GLwDrawingAreaClassRec; + +extern GLwDrawingAreaClassRec glwDrawingAreaClassRec; +#endif /* __GLX_MOTIF */ + +typedef struct { + /* resources */ + int * attribList; + XVisualInfo * visualInfo; + Boolean myList; /* TRUE if we malloced the attribList*/ + Boolean myVisual; /* TRUE if we created the visualInfo*/ + Boolean installColormap; + Boolean allocateBackground; + Boolean allocateOtherColors; + Boolean installBackground; + XtCallbackList ginitCallback; + XtCallbackList resizeCallback; + XtCallbackList exposeCallback; + XtCallbackList inputCallback; + /* specific attributes; add as we get new attributes */ + int bufferSize; + int level; + Boolean rgba; + Boolean doublebuffer; + Boolean stereo; + int auxBuffers; + int redSize; + int greenSize; + int blueSize; + int alphaSize; + int depthSize; + int stencilSize; + int accumRedSize; + int accumGreenSize; + int accumBlueSize; + int accumAlphaSize; +} GLwDrawingAreaPart; + +#ifdef __GLX_MOTIF +typedef struct _GLwMDrawingAreaRec { + CorePart core; + XmPrimitivePart primitive; + GLwDrawingAreaPart glwDrawingArea; +} GLwMDrawingAreaRec; +#else /* not __GLX_MOTIF */ +typedef struct _GLwDrawingAreaRec { + CorePart core; + GLwDrawingAreaPart glwDrawingArea; +} GLwDrawingAreaRec; +#endif /* __GLX_MOTIF */ + +#endif /* _GLwDrawP_h */ Index: xc/extras/ogl-sample/main/gfx/lib/glw/GLwMDrawA.c diff -u /dev/null xc/extras/ogl-sample/main/gfx/lib/glw/GLwMDrawA.c:1.1.1.1 --- /dev/null Mon Dec 18 14:22:44 2000 +++ xc/extras/ogl-sample/main/gfx/lib/glw/GLwMDrawA.c Thu Nov 2 14:18:54 2000 @@ -0,0 +1,43 @@ +/* +** License Applicability. Except to the extent portions of this file are +** made subject to an alternative license as permitted in the SGI Free +** Software License B, Version 1.1 (the "License"), the contents of this +** file are subject only to the provisions of the License. You may not use +** this file except in compliance with the License. You may obtain a copy +** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600 +** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at: +** +** http://oss.sgi.com/projects/FreeB +** +** Note that, as provided in the License, the Software is distributed on an +** "AS IS" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS +** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND +** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A +** PARTICULAR PURPOSE, AND NON-INFRINGEMENT. +** +** Original Code. The Original Code is: OpenGL Sample Implementation, +** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics, +** Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc. +** Copyright in any portions created by third parties is as indicated +** elsewhere herein. All Rights Reserved. +** +** Additional Notice Provisions: The application programming interfaces +** established by SGI in conjunction with the Original Code are The +** OpenGL(R) Graphics System: A Specification (Version 1.2.1), released +** April 1, 1999; The OpenGL(R) Graphics System Utility Library (Version +** 1.3), released November 4, 1998; and OpenGL(R) Graphics with the X +** Window System(R) (Version 1.3), released October 19, 1998. This software +** was created using the OpenGL(R) version 1.2.1 Sample Implementation +** published by SGI, but has not been independently verified as being +** compliant with the OpenGL(R) version 1.2.1 Specification. +** +** $Date$ $Revision$ +*/ +/* +** $Header: //depot/main/gfx/lib/glw/GLwMDrawA.c#4 $ +*/ + +#ifndef __GLX_MOTIF +#define __GLX_MOTIF 1 +#endif +#include "GLwDrawA.c" Index: xc/extras/ogl-sample/main/gfx/lib/glw/GLwMDrawA.h diff -u /dev/null xc/extras/ogl-sample/main/gfx/lib/glw/GLwMDrawA.h:1.2 --- /dev/null Mon Dec 18 14:22:44 2000 +++ xc/extras/ogl-sample/main/gfx/lib/glw/GLwMDrawA.h Thu Nov 2 15:39:07 2000 @@ -0,0 +1,51 @@ +/* +** License Applicability. Except to the extent portions of this file are +** made subject to an alternative license as permitted in the SGI Free +** Software License B, Version 1.1 (the "License"), the contents of this +** file are subject only to the provisions of the License. You may not use +** this file except in compliance with the License. You may obtain a copy +** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600 +** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at: +** +** http://oss.sgi.com/projects/FreeB +** +** Note that, as provided in the License, the Software is distributed on an +** "AS IS" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS +** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND +** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A +** PARTICULAR PURPOSE, AND NON-INFRINGEMENT. +** +** Original Code. The Original Code is: OpenGL Sample Implementation, +** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics, +** Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc. +** Copyright in any portions created by third parties is as indicated +** elsewhere herein. All Rights Reserved. +** +** Additional Notice Provisions: The application programming interfaces +** established by SGI in conjunction with the Original Code are The +** OpenGL(R) Graphics System: A Specification (Version 1.2.1), released +** April 1, 1999; The OpenGL(R) Graphics System Utility Library (Version +** 1.3), released November 4, 1998; and OpenGL(R) Graphics with the X +** Window System(R) (Version 1.3), released October 19, 1998. This software +** was created using the OpenGL(R) version 1.2.1 Sample Implementation +** published by SGI, but has not been independently verified as being +** compliant with the OpenGL(R) version 1.2.1 Specification. +** +** $Date$ $Revision$ +*/ +/* +** $Header: //depot/main/gfx/lib/glw/GLwMDrawA.h#5 $ +*/ + +/* +** This file has been slightly modified from the original by Carlos A. M. dos +** Santos for integration into XFree86 source +** tree and for generating both Motif(TM) 1.2 and 2.x versions of the widgets +** in the same library. +*/ +/* $XFree86: xc/extras/ogl-sample/main/gfx/lib/glw/GLwMDrawA.h,v 1.2 2000/11/02 20:39:07 dawes Exp $ */ + +#ifndef __GLX_MOTIF +#define __GLX_MOTIF 1 +#endif +#include Index: xc/extras/ogl-sample/main/gfx/lib/glw/GLwMDrawAP.h diff -u /dev/null xc/extras/ogl-sample/main/gfx/lib/glw/GLwMDrawAP.h:1.2 --- /dev/null Mon Dec 18 14:22:44 2000 +++ xc/extras/ogl-sample/main/gfx/lib/glw/GLwMDrawAP.h Thu Nov 2 15:39:07 2000 @@ -0,0 +1,51 @@ +/* +** License Applicability. Except to the extent portions of this file are +** made subject to an alternative license as permitted in the SGI Free +** Software License B, Version 1.1 (the "License"), the contents of this +** file are subject only to the provisions of the License. You may not use +** this file except in compliance with the License. You may obtain a copy +** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600 +** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at: +** +** http://oss.sgi.com/projects/FreeB +** +** Note that, as provided in the License, the Software is distributed on an +** "AS IS" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS +** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND +** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A +** PARTICULAR PURPOSE, AND NON-INFRINGEMENT. +** +** Original Code. The Original Code is: OpenGL Sample Implementation, +** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics, +** Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc. +** Copyright in any portions created by third parties is as indicated +** elsewhere herein. All Rights Reserved. +** +** Additional Notice Provisions: The application programming interfaces +** established by SGI in conjunction with the Original Code are The +** OpenGL(R) Graphics System: A Specification (Version 1.2.1), released +** April 1, 1999; The OpenGL(R) Graphics System Utility Library (Version +** 1.3), released November 4, 1998; and OpenGL(R) Graphics with the X +** Window System(R) (Version 1.3), released October 19, 1998. This software +** was created using the OpenGL(R) version 1.2.1 Sample Implementation +** published by SGI, but has not been independently verified as being +** compliant with the OpenGL(R) version 1.2.1 Specification. +** +** $Date$ $Revision$ +*/ +/* +** $Header: //depot/main/gfx/lib/glw/GLwMDrawAP.h#5 $ +*/ + +/* +** This file has been slightly modified from the original by Carlos A. M. dos +** Santos for integration into XFree86 source +** tree and for generating both Motif(TM) 1.2 and 2.x versions of the widgets +** in the same library. +*/ +/* $XFree86: xc/extras/ogl-sample/main/gfx/lib/glw/GLwMDrawAP.h,v 1.2 2000/11/02 20:39:07 dawes Exp $ */ + +#ifndef __GLX_MOTIF +#define __GLX_MOTIF 1 +#endif +#include Index: xc/extras/ogl-sample/main/gfx/lib/glw/GNUmakefile diff -u /dev/null xc/extras/ogl-sample/main/gfx/lib/glw/GNUmakefile:1.1.1.1 --- /dev/null Mon Dec 18 14:22:44 2000 +++ xc/extras/ogl-sample/main/gfx/lib/glw/GNUmakefile Thu Nov 2 14:18:54 2000 @@ -0,0 +1,76 @@ +#!gmake +# +# License Applicability. Except to the extent portions of this file are +# made subject to an alternative license as permitted in the SGI Free +# Software License B, Version 1.1 (the "License"), the contents of this +# file are subject only to the provisions of the License. You may not use +# this file except in compliance with the License. You may obtain a copy +# of the License at Silicon Graphics, Inc., attn: Legal Services, 1600 +# Amphitheatre Parkway, Mountain View, CA 94043-1351, or at: +# +# http://oss.sgi.com/projects/FreeB +# +# Note that, as provided in the License, the Software is distributed on an +# "AS IS" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS +# DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND +# CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A +# PARTICULAR PURPOSE, AND NON-INFRINGEMENT. +# +# Original Code. The Original Code is: OpenGL Sample Implementation, +# Version 1.2.1, released January 26, 2000, developed by Silicon Graphics, +# Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc. +# Copyright in any portions created by third parties is as indicated +# elsewhere herein. All Rights Reserved. +# +# Additional Notice Provisions: The application programming interfaces +# established by SGI in conjunction with the Original Code are The +# OpenGL(R) Graphics System: A Specification (Version 1.2.1), released +# April 1, 1999; The OpenGL(R) Graphics System Utility Library (Version +# 1.3), released November 4, 1998; and OpenGL(R) Graphics with the X +# Window System(R) (Version 1.3), released October 19, 1998. This software +# was created using the OpenGL(R) version 1.2.1 Sample Implementation +# published by SGI, but has not been independently verified as being +# compliant with the OpenGL(R) version 1.2.1 Specification. +# +# $Date$ $Revision$ +# $Header: //depot/main/gfx/lib/glw/GNUmakefile#10 $ + +include $(ROOT)/usr/include/make/commondefs + +TARGET = libGLw.a + +TARGETS = $(TARGET) + +CFILES = \ + GLwDrawA.c \ + $(NULL) + +MOTIF_CFILES = \ + GLwMDrawA.c \ + GLwDAUtil.c \ + $(NULL) + +ifeq ($(HAVE_MOTIF),1) +LCDEFS += -D__GLX_MOTIF=1 +CFILES += $(MOTIF_CFILES) +ifeq ($(OS),Linux) +# assume motif is in / rather than $ROOT +LCINCS += -I/usr/X11R6/include +endif +endif + +INSTALLFLAGS += -srcdst + +default libs: $(TARGET) + +headers headers_install apps: + +libs_install install: default + $(INSTALL) -F $(ROOT)/usr/include/X11/GLw GLwDrawA.h + $(INSTALL) -F $(ROOT)/usr/include/X11/GLw GLwMDrawA.h + $(INSTALL) -F $(LIB_LOCATION) $(TARGET); + +$(TARGET): $(OBJECTS) + $(AR) crl $@ $(OBJECTS); + +include $(COMMONRULES) Index: xc/extras/ogl-sample/main/gfx/lib/glw/Imakefile diff -u /dev/null xc/extras/ogl-sample/main/gfx/lib/glw/Imakefile:1.1.1.1 --- /dev/null Mon Dec 18 14:22:44 2000 +++ xc/extras/ogl-sample/main/gfx/lib/glw/Imakefile Thu Nov 2 14:18:54 2000 @@ -0,0 +1,50 @@ +XCOMM License Applicability. Except to the extent portions of this file are +XCOMM made subject to an alternative license as permitted in the SGI Free +XCOMM Software License B, Version 1.1 (the "License"), the contents of this +XCOMM file are subject only to the provisions of the License. You may not use +XCOMM this file except in compliance with the License. You may obtain a copy +XCOMM of the License at Silicon Graphics, Inc., attn: Legal Services, 1600 +XCOMM Amphitheatre Parkway, Mountain View, CA 94043-1351, or at: +XCOMM +XCOMM http://oss.sgi.com/projects/FreeB +XCOMM +XCOMM Note that, as provided in the License, the Software is distributed on an +XCOMM "AS IS" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS +XCOMM DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND +XCOMM CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A +XCOMM PARTICULAR PURPOSE, AND NON-INFRINGEMENT. +XCOMM +XCOMM Original Code. The Original Code is: OpenGL Sample Implementation, +XCOMM Version 1.2.1, released January 26, 2000, developed by Silicon Graphics, +XCOMM Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc. +XCOMM Copyright in any portions created by third parties is as indicated +XCOMM elsewhere herein. All Rights Reserved. +XCOMM +XCOMM Additional Notice Provisions: The application programming interfaces +XCOMM established by SGI in conjunction with the Original Code are The +XCOMM OpenGL(R) Graphics System: A Specification (Version 1.2.1), released +XCOMM April 1, 1999; The OpenGL(R) Graphics System Utility Library (Version +XCOMM 1.3), released November 4, 1998; and OpenGL(R) Graphics with the X +XCOMM Window System(R) (Version 1.3), released October 19, 1998. This software +XCOMM was created using the OpenGL(R) version 1.2.1 Sample Implementation +XCOMM published by SGI, but has not been independently verified as being +XCOMM compliant with the OpenGL(R) version 1.2.1 Specification. +XCOMM + +#include + +OBJS = \ + GLwDAUtil.o \ + GLwDrawA.o \ + GLwMDrawA.o + +INCLUDES = \ + -I$(TOP)/include \ + -I$(TOP)/include/GL + +NormalLibraryObjectRule() + +NormalLibraryTarget(GLw, $(OBJS)) + +DependTarget() +CleanTarget() Index: xc/extras/rman/rman.c diff -u xc/extras/rman/rman.c:1.9 xc/extras/rman/rman.c:1.12 --- xc/extras/rman/rman.c:1.9 Tue Jun 13 19:15:47 2000 +++ xc/extras/rman/rman.c Fri Dec 1 13:48:08 2000 @@ -16,7 +16,7 @@ source interpretation added September 24, 1996 renamed PolyglotMan due to lawsuit by Rosetta, Inc. August 8, 1997 */ -/* $XFree86: xc/extras/rman/rman.c,v 1.9 2000/06/13 23:15:47 dawes Exp $ */ +/* $XFree86: xc/extras/rman/rman.c,v 1.12 2000/12/01 18:48:08 dawes Exp $ */ /* TO DO **** @@ -58,6 +58,9 @@ extern int optind; extern char *optarg; #endif +#ifdef __CYGWIN__ +#include +#endif /*** make #define's into consts? => can't because compilers not smart enough ***/ /* maximum number of tags per line */ @@ -1606,7 +1609,7 @@ case BEGINCOMMENT: printf("\n\n"); break; - case COMMENTLINE: break; + case COMMENTLINE: printf(" "); break; case BEGINSECTHEAD: printf("\n

", tocc, tocc); @@ -4260,7 +4263,7 @@ int ie=0; int cond,invcond=0; char delim,op; - char if0[80], if1[80]; + char if0[MAXBUF], if1[MAXBUF]; float nif0, nif1; int insertat; char macrobuf[MAXBUF]; /* local so can have nested macros */ @@ -4440,8 +4443,18 @@ } else if (!isalpha(*p)) { /* usually quote, ^G in Digital UNIX */ /* gobble up comparators between delimiters */ delim = *p++; - q = if0; while (*p!=delim) { *q++=*p++; } *q='\0'; p++; - q = if1; while (*p!=delim) { *q++=*p++; } *q='\0'; p++; + q = if0; + while (*p && *p!=delim) { + *q++=*p++; + } + *q='\0'; + p++; + q = if1; + while (*p && *p!=delim) { + *q++=*p++; + } + *q='\0'; + p++; cond = (strcmp(if0,if1)==0); } else cond=0; /* a guess, seems to be right bettern than half the time */ if (invcond) cond=1-cond; Index: xc/extras/x86emu/include/x86emu.h diff -u xc/extras/x86emu/include/x86emu.h:1.1.1.1 xc/extras/x86emu/include/x86emu.h:1.2 --- xc/extras/x86emu/include/x86emu.h:1.1.1.1 Sat Jan 22 23:23:52 2000 +++ xc/extras/x86emu/include/x86emu.h Tue Nov 21 18:10:25 2000 @@ -37,6 +37,7 @@ * include this header * ****************************************************************************/ +/* $XFree86: xc/extras/x86emu/include/x86emu.h,v 1.2 2000/11/21 23:10:25 tsi Exp $ */ #ifndef __X86EMU_X86EMU_H #define __X86EMU_X86EMU_H @@ -162,21 +163,22 @@ /* Debug options */ -#define DEBUG_DECODE_F 0x0001 /* print decoded instruction */ -#define DEBUG_TRACE_F 0x0002 /* dump regs before/after execution */ -#define DEBUG_STEP_F 0x0004 -#define DEBUG_DISASSEMBLE_F 0x0008 -#define DEBUG_BREAK_F 0x0010 -#define DEBUG_SVC_F 0x0020 -#define DEBUG_FS_F 0x0080 -#define DEBUG_PROC_F 0x0100 -#define DEBUG_SYSINT_F 0x0200 /* bios system interrupts. */ -#define DEBUG_TRACECALL_F 0x0400 -#define DEBUG_INSTRUMENT_F 0x0800 -#define DEBUG_MEM_TRACE_F 0x1000 -#define DEBUG_IO_TRACE_F 0x2000 -#define DEBUG_TRACECALL_REGS_F 0x4000 -#define DEBUG_DECODE_NOPRINT_F 0x8000 +#define DEBUG_DECODE_F 0x000001 /* print decoded instruction */ +#define DEBUG_TRACE_F 0x000002 /* dump regs before/after execution */ +#define DEBUG_STEP_F 0x000004 +#define DEBUG_DISASSEMBLE_F 0x000008 +#define DEBUG_BREAK_F 0x000010 +#define DEBUG_SVC_F 0x000020 +#define DEBUG_FS_F 0x000080 +#define DEBUG_PROC_F 0x000100 +#define DEBUG_SYSINT_F 0x000200 /* bios system interrupts. */ +#define DEBUG_TRACECALL_F 0x000400 +#define DEBUG_INSTRUMENT_F 0x000800 +#define DEBUG_MEM_TRACE_F 0x001000 +#define DEBUG_IO_TRACE_F 0x002000 +#define DEBUG_TRACECALL_REGS_F 0x004000 +#define DEBUG_DECODE_NOPRINT_F 0x008000 +#define DEBUG_SAVE_IP_CS_F 0x010000 #define DEBUG_SYS_F (DEBUG_SVC_F|DEBUG_FS_F|DEBUG_PROC_F) void X86EMU_trace_regs(void); Index: xc/extras/x86emu/include/x86emu/types.h diff -u xc/extras/x86emu/include/x86emu/types.h:1.3 xc/extras/x86emu/include/x86emu/types.h:1.4 --- xc/extras/x86emu/include/x86emu/types.h:1.3 Wed Jan 26 17:05:46 2000 +++ xc/extras/x86emu/include/x86emu/types.h Tue Sep 26 11:56:44 2000 @@ -36,7 +36,7 @@ * ****************************************************************************/ -/* $XFree86: xc/extras/x86emu/include/x86emu/types.h,v 1.3 2000/01/26 22:05:46 tsi Exp $ */ +/* $XFree86: xc/extras/x86emu/include/x86emu/types.h,v 1.4 2000/09/26 15:56:44 tsi Exp $ */ #ifndef __X86EMU_TYPES_H #define __X86EMU_TYPES_H @@ -76,7 +76,7 @@ typedef char s8; typedef short s16; -typedef long s32; +typedef int s32; #ifdef __HAS_LONG_LONG__ typedef long long s64; #endif Index: xc/extras/x86emu/src/x86emu/decode.c diff -u xc/extras/x86emu/src/x86emu/decode.c:1.6 xc/extras/x86emu/src/x86emu/decode.c:1.8 --- xc/extras/x86emu/src/x86emu/decode.c:1.6 Wed Jun 7 17:58:25 2000 +++ xc/extras/x86emu/src/x86emu/decode.c Tue Dec 12 22:19:34 2000 @@ -37,7 +37,7 @@ * ****************************************************************************/ -/* $XFree86: xc/extras/x86emu/src/x86emu/decode.c,v 1.6 2000/06/07 21:58:25 tsi Exp $ */ +/* $XFree86: xc/extras/x86emu/src/x86emu/decode.c,v 1.8 2000/12/13 03:19:34 tsi Exp $ */ #include "x86emu/x86emui.h" @@ -829,7 +829,7 @@ unsigned decode_rm10_address( int rm) { - int displacement = (s16)fetch_word_imm(); + unsigned displacement = (u16)fetch_word_imm(); switch (rm) { case 0: DECODE_PRINTF2("%d[BX+SI]", displacement); Index: xc/extras/x86emu/src/x86emu/ops2.c diff -u xc/extras/x86emu/src/x86emu/ops2.c:1.3 xc/extras/x86emu/src/x86emu/ops2.c:1.4 --- xc/extras/x86emu/src/x86emu/ops2.c:1.3 Wed Apr 19 11:48:13 2000 +++ xc/extras/x86emu/src/x86emu/ops2.c Thu Nov 16 14:44:50 2000 @@ -37,7 +37,7 @@ * instructions. * ****************************************************************************/ -/* $XFree86: xc/extras/x86emu/src/x86emu/ops2.c,v 1.3 2000/04/19 15:48:13 tsi Exp $ */ +/* $XFree86: xc/extras/x86emu/src/x86emu/ops2.c,v 1.4 2000/11/16 19:44:50 eich Exp $ */ #include "x86emu/x86emui.h" @@ -2120,6 +2120,238 @@ /**************************************************************************** REMARKS: +Handles opcode 0x0f,0xbc +****************************************************************************/ +void x86emuOp2_bsf(u8 X86EMU_UNUSED(op2)) +{ + int mod, rl, rh; + uint srcoffset; + + START_OF_INSTR(); + DECODE_PRINTF("BSF\n"); + FETCH_DECODE_MODRM(mod, rh, rl); + switch(mod) { + case 0: + if (M.x86.mode & SYSMODE_PREFIX_DATA) { + u32 srcval, *dstreg; + + srcoffset = decode_rm00_address(rl); + DECODE_PRINTF(","); + dstreg = DECODE_RM_LONG_REGISTER(rh); + TRACE_AND_STEP(); + srcval = fetch_data_long(srcoffset); + CONDITIONAL_SET_FLAG(srcval == 0, F_ZF); + for(*dstreg = 0; *dstreg < 32; (*dstreg)++) + if ((srcval >> *dstreg) & 1) break; + } else { + u16 srcval, *dstreg; + + srcoffset = decode_rm00_address(rl); + DECODE_PRINTF(","); + dstreg = DECODE_RM_WORD_REGISTER(rh); + TRACE_AND_STEP(); + srcval = fetch_data_word(srcoffset); + CONDITIONAL_SET_FLAG(srcval == 0, F_ZF); + for(*dstreg = 0; *dstreg < 16; (*dstreg)++) + if ((srcval >> *dstreg) & 1) break; + } + break; + case 1: + if (M.x86.mode & SYSMODE_PREFIX_DATA) { + u32 srcval, *dstreg; + + srcoffset = decode_rm01_address(rl); + DECODE_PRINTF(","); + dstreg = DECODE_RM_LONG_REGISTER(rh); + TRACE_AND_STEP(); + srcval = fetch_data_long(srcoffset); + CONDITIONAL_SET_FLAG(srcval == 0, F_ZF); + for(*dstreg = 0; *dstreg < 32; (*dstreg)++) + if ((srcval >> *dstreg) & 1) break; + } else { + u16 srcval, *dstreg; + + srcoffset = decode_rm01_address(rl); + DECODE_PRINTF(","); + dstreg = DECODE_RM_WORD_REGISTER(rh); + TRACE_AND_STEP(); + srcval = fetch_data_word(srcoffset); + CONDITIONAL_SET_FLAG(srcval == 0, F_ZF); + for(*dstreg = 0; *dstreg < 16; (*dstreg)++) + if ((srcval >> *dstreg) & 1) break; + } + break; + case 2: + if (M.x86.mode & SYSMODE_PREFIX_DATA) { + u32 srcval, *dstreg; + + srcoffset = decode_rm10_address(rl); + DECODE_PRINTF(","); + dstreg = DECODE_RM_LONG_REGISTER(rh); + TRACE_AND_STEP(); + srcval = fetch_data_long(srcoffset); + CONDITIONAL_SET_FLAG(srcval == 0, F_ZF); + for(*dstreg = 0; *dstreg < 32; (*dstreg)++) + if ((srcval >> *dstreg) & 1) break; + } else { + u16 srcval, *dstreg; + + srcoffset = decode_rm10_address(rl); + DECODE_PRINTF(","); + dstreg = DECODE_RM_WORD_REGISTER(rh); + TRACE_AND_STEP(); + srcval = fetch_data_word(srcoffset); + CONDITIONAL_SET_FLAG(srcval == 0, F_ZF); + for(*dstreg = 0; *dstreg < 16; (*dstreg)++) + if ((srcval >> *dstreg) & 1) break; + } + break; + case 3: /* register to register */ + if (M.x86.mode & SYSMODE_PREFIX_DATA) { + u32 *srcreg, *dstreg; + + srcreg = DECODE_RM_LONG_REGISTER(rl); + DECODE_PRINTF(","); + dstreg = DECODE_RM_LONG_REGISTER(rh); + TRACE_AND_STEP(); + CONDITIONAL_SET_FLAG(*srcreg == 0, F_ZF); + for(*dstreg = 0; *dstreg < 32; (*dstreg)++) + if ((*srcreg >> *dstreg) & 1) break; + } else { + u16 *srcreg, *dstreg; + + srcreg = DECODE_RM_WORD_REGISTER(rl); + DECODE_PRINTF(","); + dstreg = DECODE_RM_WORD_REGISTER(rh); + TRACE_AND_STEP(); + CONDITIONAL_SET_FLAG(*srcreg == 0, F_ZF); + for(*dstreg = 0; *dstreg < 16; (*dstreg)++) + if ((*srcreg >> *dstreg) & 1) break; + } + break; + } + DECODE_CLEAR_SEGOVR(); + END_OF_INSTR(); +} + +/**************************************************************************** +REMARKS: +Handles opcode 0x0f,0xbd +****************************************************************************/ +void x86emuOp2_bsr(u8 X86EMU_UNUSED(op2)) +{ + int mod, rl, rh; + uint srcoffset; + + START_OF_INSTR(); + DECODE_PRINTF("BSF\n"); + FETCH_DECODE_MODRM(mod, rh, rl); + switch(mod) { + case 0: + if (M.x86.mode & SYSMODE_PREFIX_DATA) { + u32 srcval, *dstreg; + + srcoffset = decode_rm00_address(rl); + DECODE_PRINTF(","); + dstreg = DECODE_RM_LONG_REGISTER(rh); + TRACE_AND_STEP(); + srcval = fetch_data_long(srcoffset); + CONDITIONAL_SET_FLAG(srcval == 0, F_ZF); + for(*dstreg = 31; *dstreg > 0; (*dstreg)--) + if ((srcval >> *dstreg) & 1) break; + } else { + u16 srcval, *dstreg; + + srcoffset = decode_rm00_address(rl); + DECODE_PRINTF(","); + dstreg = DECODE_RM_WORD_REGISTER(rh); + TRACE_AND_STEP(); + srcval = fetch_data_word(srcoffset); + CONDITIONAL_SET_FLAG(srcval == 0, F_ZF); + for(*dstreg = 15; *dstreg > 0; (*dstreg)--) + if ((srcval >> *dstreg) & 1) break; + } + break; + case 1: + if (M.x86.mode & SYSMODE_PREFIX_DATA) { + u32 srcval, *dstreg; + + srcoffset = decode_rm01_address(rl); + DECODE_PRINTF(","); + dstreg = DECODE_RM_LONG_REGISTER(rh); + TRACE_AND_STEP(); + srcval = fetch_data_long(srcoffset); + CONDITIONAL_SET_FLAG(srcval == 0, F_ZF); + for(*dstreg = 31; *dstreg > 0; (*dstreg)--) + if ((srcval >> *dstreg) & 1) break; + } else { + u16 srcval, *dstreg; + + srcoffset = decode_rm01_address(rl); + DECODE_PRINTF(","); + dstreg = DECODE_RM_WORD_REGISTER(rh); + TRACE_AND_STEP(); + srcval = fetch_data_word(srcoffset); + CONDITIONAL_SET_FLAG(srcval == 0, F_ZF); + for(*dstreg = 15; *dstreg > 0; (*dstreg)--) + if ((srcval >> *dstreg) & 1) break; + } + break; + case 2: + if (M.x86.mode & SYSMODE_PREFIX_DATA) { + u32 srcval, *dstreg; + + srcoffset = decode_rm10_address(rl); + DECODE_PRINTF(","); + dstreg = DECODE_RM_LONG_REGISTER(rh); + TRACE_AND_STEP(); + srcval = fetch_data_long(srcoffset); + CONDITIONAL_SET_FLAG(srcval == 0, F_ZF); + for(*dstreg = 31; *dstreg > 0; (*dstreg)--) + if ((srcval >> *dstreg) & 1) break; + } else { + u16 srcval, *dstreg; + + srcoffset = decode_rm10_address(rl); + DECODE_PRINTF(","); + dstreg = DECODE_RM_WORD_REGISTER(rh); + TRACE_AND_STEP(); + srcval = fetch_data_word(srcoffset); + CONDITIONAL_SET_FLAG(srcval == 0, F_ZF); + for(*dstreg = 15; *dstreg > 0; (*dstreg)--) + if ((srcval >> *dstreg) & 1) break; + } + break; + case 3: /* register to register */ + if (M.x86.mode & SYSMODE_PREFIX_DATA) { + u32 *srcreg, *dstreg; + + srcreg = DECODE_RM_LONG_REGISTER(rl); + DECODE_PRINTF(","); + dstreg = DECODE_RM_LONG_REGISTER(rh); + TRACE_AND_STEP(); + CONDITIONAL_SET_FLAG(*srcreg == 0, F_ZF); + for(*dstreg = 31; *dstreg > 0; (*dstreg)--) + if ((*srcreg >> *dstreg) & 1) break; + } else { + u16 *srcreg, *dstreg; + + srcreg = DECODE_RM_WORD_REGISTER(rl); + DECODE_PRINTF(","); + dstreg = DECODE_RM_WORD_REGISTER(rh); + TRACE_AND_STEP(); + CONDITIONAL_SET_FLAG(*srcreg == 0, F_ZF); + for(*dstreg = 15; *dstreg > 0; (*dstreg)--) + if ((*srcreg >> *dstreg) & 1) break; + } + break; + } + DECODE_CLEAR_SEGOVR(); + END_OF_INSTR(); +} + +/**************************************************************************** +REMARKS: Handles opcode 0x0f,0xbe ****************************************************************************/ void x86emuOp2_movsx_byte_R_RM(u8 X86EMU_UNUSED(op2)) @@ -2494,8 +2726,8 @@ /* 0xb9 */ x86emuOp2_illegal_op, /* 0xba */ x86emuOp2_btX_I, /* 0xbb */ x86emuOp2_btc_R, -/* 0xbc */ x86emuOp2_illegal_op, /* TODO: bsf */ -/* 0xbd */ x86emuOp2_illegal_op, /* TODO: bsr */ +/* 0xbc */ x86emuOp2_bsf, +/* 0xbd */ x86emuOp2_bsr, /* 0xbe */ x86emuOp2_movsx_byte_R_RM, /* 0xbf */ x86emuOp2_movsx_word_R_RM, Index: xc/extras/x86emu/src/x86emu/sys.c diff -u xc/extras/x86emu/src/x86emu/sys.c:1.4 xc/extras/x86emu/src/x86emu/sys.c:1.5 --- xc/extras/x86emu/src/x86emu/sys.c:1.4 Mon Apr 17 12:29:46 2000 +++ xc/extras/x86emu/src/x86emu/sys.c Wed Aug 23 18:10:01 2000 @@ -39,7 +39,7 @@ * user library. * ****************************************************************************/ -/* $XFree86: xc/extras/x86emu/src/x86emu/sys.c,v 1.4 2000/04/17 16:29:46 eich Exp $ */ +/* $XFree86: xc/extras/x86emu/src/x86emu/sys.c,v 1.5 2000/08/23 22:10:01 tsi Exp $ */ #include "x86emu.h" #include "x86emu/regs.h" @@ -56,7 +56,7 @@ X86EMU_intrFuncs _X86EMU_intrTab[256]; /*----------------------------- Implementation ----------------------------*/ -#ifdef __alpha__ +#if defined(__alpha__) || defined(__alpha) /* to cope with broken egcs-1.1.2 :-(((( */ /* @@ -263,7 +263,7 @@ } else #endif -#ifdef __alpha__ +#if defined(__alpha__) || defined(__alpha) val = ldw_u((u16*)(M.mem_base + addr)); #else val = *(u16*)(M.mem_base + addr); @@ -300,7 +300,7 @@ } else #endif -#ifdef __alpha__ +#if defined(__alpha__) || defined(__alpha) val = ldl_u((u32*)(M.mem_base + addr)); #else val = *(u32*)(M.mem_base + addr); @@ -356,7 +356,7 @@ } else #endif -#ifdef __alpha__ +#if defined(__alpha__) || defined(__alpha) stw_u(val,(u16*)(M.mem_base + addr)); #else *(u16*)(M.mem_base + addr) = val; @@ -390,7 +390,7 @@ } else #endif -#ifdef __alpha__ +#if defined(__alpha__) || defined(__alpha) stl_u(val,(u32*)(M.mem_base + addr)); #else *(u32*)(M.mem_base + addr) = val; Index: xc/extras/x86emu/src/x86emu/x86emu/debug.h diff -u xc/extras/x86emu/src/x86emu/x86emu/debug.h:1.3 xc/extras/x86emu/src/x86emu/x86emu/debug.h:1.4 --- xc/extras/x86emu/src/x86emu/x86emu/debug.h:1.3 Wed Apr 19 11:48:15 2000 +++ xc/extras/x86emu/src/x86emu/x86emu/debug.h Tue Nov 21 18:10:27 2000 @@ -35,7 +35,7 @@ * Description: Header file for debug definitions. * ****************************************************************************/ -/* $XFree86: xc/extras/x86emu/src/x86emu/x86emu/debug.h,v 1.3 2000/04/19 15:48:15 tsi Exp $ */ +/* $XFree86: xc/extras/x86emu/src/x86emu/x86emu/debug.h,v 1.4 2000/11/21 23:10:27 tsi Exp $ */ #ifndef __X86EMU_DEBUG_H #define __X86EMU_DEBUG_H @@ -69,7 +69,7 @@ # define DEBUG_DISASSEMBLE() (M.x86.debug & DEBUG_DISASSEMBLE_F) # define DEBUG_BREAK() (M.x86.debug & DEBUG_BREAK_F) # define DEBUG_SVC() (M.x86.debug & DEBUG_SVC_F) -# define DEBUG_SAVE_IP_CS() (M.x86.debug & DEBUG_SAVE_CS_IP) +# define DEBUG_SAVE_IP_CS() (M.x86.debug & DEBUG_SAVE_IP_CS_F) # define DEBUG_FS() (M.x86.debug & DEBUG_FS_F) # define DEBUG_PROC() (M.x86.debug & DEBUG_PROC_F)